@sma1lboy/kobe 0.5.26 → 0.5.27

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 +1692 -1062
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -5210,25 +5210,6 @@ function disarmCtrlC() {
5210
5210
  }
5211
5211
  setCtrlCArmed(false);
5212
5212
  }
5213
- function useBackgroundTasksArmed() {
5214
- return bgTasksArmed;
5215
- }
5216
- function pressBackgroundTasksChord() {
5217
- if (bgTasksArmTimer !== null) {
5218
- clearTimeout(bgTasksArmTimer);
5219
- bgTasksArmTimer = null;
5220
- }
5221
- if (bgTasksArmed()) {
5222
- setBgTasksArmed(false);
5223
- return "fire";
5224
- }
5225
- setBgTasksArmed(true);
5226
- bgTasksArmTimer = setTimeout(() => {
5227
- bgTasksArmTimer = null;
5228
- setBgTasksArmed(false);
5229
- }, BG_TASKS_DOUBLE_PRESS_MS);
5230
- return "armed";
5231
- }
5232
5213
  function findBinding(id) {
5233
5214
  return KobeKeymap.find((b) => b.id === id);
5234
5215
  }
@@ -5314,14 +5295,13 @@ function useKobeKeybindings(opts) {
5314
5295
  useBindings(() => ({ bindings: bindings() }));
5315
5296
  useBindings(() => ({ enabled: focusCycleEnabled(), bindings: focusCycleBindings() }));
5316
5297
  }
5317
- var CTRL_C_QUIT_WINDOW_MS = 1500, ctrlCArmed, setCtrlCArmed, ctrlCArmTimer = null, BG_TASKS_DOUBLE_PRESS_MS = 800, bgTasksArmed, setBgTasksArmed, bgTasksArmTimer = null, KobeKeymap;
5298
+ var CTRL_C_QUIT_WINDOW_MS = 1500, ctrlCArmed, setCtrlCArmed, ctrlCArmTimer = null, KobeKeymap;
5318
5299
  var init_keybindings = __esm(() => {
5319
5300
  init_solid();
5320
5301
  init_dev();
5321
5302
  init_keymap();
5322
5303
  init_command_palette();
5323
5304
  [ctrlCArmed, setCtrlCArmed] = createSignal(false);
5324
- [bgTasksArmed, setBgTasksArmed] = createSignal(false);
5325
5305
  KobeKeymap = [
5326
5306
  {
5327
5307
  id: "palette.open",
@@ -5353,13 +5333,6 @@ var init_keybindings = __esm(() => {
5353
5333
  category: "Global",
5354
5334
  description: "Open active task worktree in editor"
5355
5335
  },
5356
- {
5357
- id: "tasks.background",
5358
- scope: "global",
5359
- keys: ["ctrl+b"],
5360
- category: "Global",
5361
- description: "Open background tasks (double-press ctrl+b)"
5362
- },
5363
5336
  {
5364
5337
  id: "settings.open",
5365
5338
  scope: "global",
@@ -5579,7 +5552,8 @@ var init_keybindings = __esm(() => {
5579
5552
  scope: "workspace",
5580
5553
  keys: ["ctrl+t"],
5581
5554
  category: "Workspace",
5582
- description: "New chat tab"
5555
+ description: "New chat tab",
5556
+ hint: { keys: "ctrl+t", label: "new tab" }
5583
5557
  },
5584
5558
  {
5585
5559
  id: "chat.fork.new",
@@ -5602,7 +5576,8 @@ var init_keybindings = __esm(() => {
5602
5576
  scope: "workspace",
5603
5577
  keys: ["ctrl+w"],
5604
5578
  category: "Workspace",
5605
- description: "Close chat tab"
5579
+ description: "Close chat tab",
5580
+ hint: { keys: "ctrl+w", label: "close tab" }
5606
5581
  },
5607
5582
  {
5608
5583
  id: "chat.tab.rename",
@@ -5689,7 +5664,7 @@ var init_keybindings = __esm(() => {
5689
5664
  scope: "files",
5690
5665
  keys: ["[", "]"],
5691
5666
  category: "Files",
5692
- description: "Switch tab (cycle All / Changes / Checks)",
5667
+ description: "Switch tab (cycle All / Changes)",
5693
5668
  hint: { keys: "[/]", label: "tab" }
5694
5669
  },
5695
5670
  {
@@ -5788,7 +5763,7 @@ var TAB_ORDER;
5788
5763
  var init_keys = __esm(() => {
5789
5764
  init_keybindings();
5790
5765
  init_keymap();
5791
- TAB_ORDER = ["all", "changes", "checks"];
5766
+ TAB_ORDER = ["all", "changes"];
5792
5767
  });
5793
5768
 
5794
5769
  // src/tui/panes/filetree/open-external.ts
@@ -6173,10 +6148,10 @@ function FileTree(props) {
6173
6148
  }
6174
6149
  }));
6175
6150
  return (() => {
6176
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("box"), _el$4 = createElement("text"), _el$6 = createElement("scrollbox");
6151
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("box"), _el$4 = createElement("text"), _el$0 = createElement("scrollbox");
6177
6152
  insertNode(_el$, _el$2);
6178
6153
  insertNode(_el$, _el$3);
6179
- insertNode(_el$, _el$6);
6154
+ insertNode(_el$, _el$0);
6180
6155
  setProp(_el$, "flexDirection", "column");
6181
6156
  setProp(_el$, "flexGrow", 1);
6182
6157
  setProp(_el$, "paddingTop", 1);
@@ -6192,118 +6167,132 @@ function FileTree(props) {
6192
6167
  children: (t) => {
6193
6168
  const isActive = () => tab() === t;
6194
6169
  return (() => {
6195
- var _el$18 = createElement("text");
6196
- setProp(_el$18, "wrapMode", "none");
6197
- setProp(_el$18, "onMouseUp", () => setTab(t));
6198
- insert(_el$18, () => TAB_LABEL[t]);
6170
+ var _el$19 = createElement("text");
6171
+ setProp(_el$19, "wrapMode", "none");
6172
+ setProp(_el$19, "onMouseUp", () => setTab(t));
6173
+ insert(_el$19, () => TAB_LABEL[t]);
6199
6174
  effect((_p$) => {
6200
6175
  var _v$3 = isActive() ? theme.primary : theme.textMuted, _v$4 = isActive() ? TextAttributes3.BOLD : undefined;
6201
- _v$3 !== _p$.e && (_p$.e = setProp(_el$18, "fg", _v$3, _p$.e));
6202
- _v$4 !== _p$.t && (_p$.t = setProp(_el$18, "attributes", _v$4, _p$.t));
6176
+ _v$3 !== _p$.e && (_p$.e = setProp(_el$19, "fg", _v$3, _p$.e));
6177
+ _v$4 !== _p$.t && (_p$.t = setProp(_el$19, "attributes", _v$4, _p$.t));
6203
6178
  return _p$;
6204
6179
  }, {
6205
6180
  e: undefined,
6206
6181
  t: undefined
6207
6182
  });
6208
- return _el$18;
6183
+ return _el$19;
6209
6184
  })();
6210
6185
  }
6211
6186
  }));
6212
6187
  insertNode(_el$3, _el$4);
6213
6188
  setProp(_el$3, "flexDirection", "row");
6214
- setProp(_el$3, "paddingBottom", 1);
6189
+ setProp(_el$3, "paddingBottom", 0);
6215
6190
  setProp(_el$3, "flexShrink", 0);
6216
6191
  insertNode(_el$4, createTextNode(`enter open \xB7 o open externally \xB7 r refresh`));
6217
6192
  setProp(_el$4, "wrapMode", "none");
6193
+ insert(_el$, createComponent2(Show, {
6194
+ get when() {
6195
+ return tab() === "changes";
6196
+ },
6197
+ get children() {
6198
+ var _el$6 = createElement("box"), _el$7 = createElement("text");
6199
+ insertNode(_el$6, _el$7);
6200
+ setProp(_el$6, "flexDirection", "row");
6201
+ setProp(_el$6, "paddingBottom", 1);
6202
+ setProp(_el$6, "flexShrink", 0);
6203
+ insertNode(_el$7, createTextNode(`M modified \xB7 A added \xB7 D deleted \xB7 ? untracked`));
6204
+ setProp(_el$7, "wrapMode", "none");
6205
+ effect((_$p) => setProp(_el$7, "fg", theme.textMuted, _$p));
6206
+ return _el$6;
6207
+ }
6208
+ }), _el$0);
6209
+ insert(_el$, createComponent2(Show, {
6210
+ get when() {
6211
+ return tab() !== "changes";
6212
+ },
6213
+ get children() {
6214
+ var _el$9 = createElement("box");
6215
+ setProp(_el$9, "flexDirection", "row");
6216
+ setProp(_el$9, "paddingBottom", 1);
6217
+ setProp(_el$9, "flexShrink", 0);
6218
+ return _el$9;
6219
+ }
6220
+ }), _el$0);
6218
6221
  use((r) => {
6219
6222
  scrollRef = r;
6220
- }, _el$6);
6221
- setProp(_el$6, "flexGrow", 1);
6222
- setProp(_el$6, "verticalScrollbarOptions", {
6223
+ }, _el$0);
6224
+ setProp(_el$0, "flexGrow", 1);
6225
+ setProp(_el$0, "verticalScrollbarOptions", {
6223
6226
  trackOptions: {
6224
6227
  foregroundColor: "transparent"
6225
6228
  }
6226
6229
  });
6227
- insert(_el$6, createComponent2(Show, {
6230
+ insert(_el$0, createComponent2(Show, {
6228
6231
  get when() {
6229
6232
  return props.worktreePath() == null;
6230
6233
  },
6231
6234
  get children() {
6232
- var _el$7 = createElement("box"), _el$8 = createElement("text");
6233
- insertNode(_el$7, _el$8);
6234
- setProp(_el$7, "paddingTop", 1);
6235
- setProp(_el$7, "paddingLeft", 1);
6236
- insertNode(_el$8, createTextNode(`(no task \u2014 press n to create)`));
6237
- effect((_$p) => setProp(_el$8, "fg", theme.textMuted, _$p));
6238
- return _el$7;
6235
+ var _el$1 = createElement("box"), _el$10 = createElement("text");
6236
+ insertNode(_el$1, _el$10);
6237
+ setProp(_el$1, "paddingTop", 1);
6238
+ setProp(_el$1, "paddingLeft", 1);
6239
+ insertNode(_el$10, createTextNode(`(no task \u2014 press n to create)`));
6240
+ effect((_$p) => setProp(_el$10, "fg", theme.textMuted, _$p));
6241
+ return _el$1;
6239
6242
  }
6240
6243
  }), null);
6241
- insert(_el$6, createComponent2(Show, {
6244
+ insert(_el$0, createComponent2(Show, {
6242
6245
  get when() {
6243
6246
  return memo2(() => props.worktreePath() != null)() && error() != null;
6244
6247
  },
6245
6248
  get children() {
6246
- var _el$0 = createElement("box"), _el$1 = createElement("text"), _el$10 = createElement("text");
6247
- insertNode(_el$0, _el$1);
6248
- insertNode(_el$0, _el$10);
6249
- setProp(_el$0, "paddingTop", 1);
6250
- setProp(_el$0, "paddingLeft", 1);
6251
- setProp(_el$0, "flexDirection", "column");
6252
- setProp(_el$0, "gap", 0);
6253
- setProp(_el$1, "wrapMode", "word");
6254
- insert(_el$1, () => summarizeGitError(error() ?? ""));
6255
- insertNode(_el$10, createTextNode(`press r to retry`));
6256
- setProp(_el$10, "wrapMode", "word");
6249
+ var _el$12 = createElement("box"), _el$13 = createElement("text"), _el$14 = createElement("text");
6250
+ insertNode(_el$12, _el$13);
6251
+ insertNode(_el$12, _el$14);
6252
+ setProp(_el$12, "paddingTop", 1);
6253
+ setProp(_el$12, "paddingLeft", 1);
6254
+ setProp(_el$12, "flexDirection", "column");
6255
+ setProp(_el$12, "gap", 0);
6256
+ setProp(_el$13, "wrapMode", "word");
6257
+ insert(_el$13, () => summarizeGitError(error() ?? ""));
6258
+ insertNode(_el$14, createTextNode(`press r to retry`));
6259
+ setProp(_el$14, "wrapMode", "word");
6257
6260
  effect((_p$) => {
6258
6261
  var { error: _v$, textMuted: _v$2 } = theme;
6259
- _v$ !== _p$.e && (_p$.e = setProp(_el$1, "fg", _v$, _p$.e));
6260
- _v$2 !== _p$.t && (_p$.t = setProp(_el$10, "fg", _v$2, _p$.t));
6262
+ _v$ !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$, _p$.e));
6263
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$14, "fg", _v$2, _p$.t));
6261
6264
  return _p$;
6262
6265
  }, {
6263
6266
  e: undefined,
6264
6267
  t: undefined
6265
6268
  });
6266
- return _el$0;
6267
- }
6268
- }), null);
6269
- insert(_el$6, createComponent2(Show, {
6270
- get when() {
6271
- return memo2(() => !!(props.worktreePath() != null && error() == null))() && tab() === "checks";
6272
- },
6273
- get children() {
6274
- var _el$12 = createElement("box"), _el$13 = createElement("text");
6275
- insertNode(_el$12, _el$13);
6276
- setProp(_el$12, "paddingTop", 1);
6277
- setProp(_el$12, "paddingLeft", 1);
6278
- insertNode(_el$13, createTextNode(`(checks not yet implemented)`));
6279
- effect((_$p) => setProp(_el$13, "fg", theme.textMuted, _$p));
6280
6269
  return _el$12;
6281
6270
  }
6282
6271
  }), null);
6283
- insert(_el$6, createComponent2(Show, {
6272
+ insert(_el$0, createComponent2(Show, {
6284
6273
  get when() {
6285
- return memo2(() => !!(props.worktreePath() != null && error() == null && tab() !== "checks" && rows().length === 0))() && (tab() === "all" && allFiles() != null || tab() === "changes" && changes() != null);
6274
+ return memo2(() => !!(props.worktreePath() != null && error() == null && rows().length === 0))() && (tab() === "all" && allFiles() != null || tab() === "changes" && changes() != null);
6286
6275
  },
6287
6276
  get children() {
6288
- var _el$15 = createElement("box"), _el$16 = createElement("text");
6289
- insertNode(_el$15, _el$16);
6290
- setProp(_el$15, "paddingTop", 1);
6291
- setProp(_el$15, "paddingLeft", 1);
6292
- insert(_el$16, () => tab() === "all" ? "(empty worktree)" : "(no changes \u2014 clean worktree)");
6293
- effect((_$p) => setProp(_el$16, "fg", theme.textMuted, _$p));
6294
- return _el$15;
6277
+ var _el$16 = createElement("box"), _el$17 = createElement("text");
6278
+ insertNode(_el$16, _el$17);
6279
+ setProp(_el$16, "paddingTop", 1);
6280
+ setProp(_el$16, "paddingLeft", 1);
6281
+ insert(_el$17, () => tab() === "all" ? "(empty worktree)" : "(no changes \u2014 clean worktree)");
6282
+ effect((_$p) => setProp(_el$17, "fg", theme.textMuted, _$p));
6283
+ return _el$16;
6295
6284
  }
6296
6285
  }), null);
6297
- insert(_el$6, createComponent2(Show, {
6286
+ insert(_el$0, createComponent2(Show, {
6298
6287
  get when() {
6299
6288
  return memo2(() => !!(props.worktreePath() != null && error() == null))() && rows().length > 0;
6300
6289
  },
6301
6290
  get children() {
6302
- var _el$17 = createElement("box");
6303
- setProp(_el$17, "flexShrink", 0);
6304
- setProp(_el$17, "gap", 0);
6305
- setProp(_el$17, "paddingRight", 1);
6306
- insert(_el$17, createComponent2(For, {
6291
+ var _el$18 = createElement("box");
6292
+ setProp(_el$18, "flexShrink", 0);
6293
+ setProp(_el$18, "gap", 0);
6294
+ setProp(_el$18, "paddingRight", 1);
6295
+ insert(_el$18, createComponent2(For, {
6307
6296
  get each() {
6308
6297
  return rows();
6309
6298
  },
@@ -6313,11 +6302,11 @@ function FileTree(props) {
6313
6302
  const indent = " ".repeat(row.depth);
6314
6303
  const marker = row.expanded ? "\u25BE" : "\u25B8";
6315
6304
  return (() => {
6316
- var _el$19 = createElement("box"), _el$20 = createElement("text");
6317
- insertNode(_el$19, _el$20);
6318
- setProp(_el$19, "paddingLeft", 1);
6319
- setProp(_el$19, "paddingRight", 1);
6320
- setProp(_el$19, "onMouseUp", () => {
6305
+ var _el$20 = createElement("box"), _el$21 = createElement("text");
6306
+ insertNode(_el$20, _el$21);
6307
+ setProp(_el$20, "paddingLeft", 1);
6308
+ setProp(_el$20, "paddingRight", 1);
6309
+ setProp(_el$20, "onMouseUp", () => {
6321
6310
  setCursorIndex(index());
6322
6311
  setExpandedDirs((prev) => {
6323
6312
  const next = new Set(prev);
@@ -6328,45 +6317,45 @@ function FileTree(props) {
6328
6317
  return next;
6329
6318
  });
6330
6319
  });
6331
- setProp(_el$20, "wrapMode", "none");
6332
- insert(_el$20, () => `${indent}${marker} ${row.name}/`);
6320
+ setProp(_el$21, "wrapMode", "none");
6321
+ insert(_el$21, () => `${indent}${marker} ${row.name}/`);
6333
6322
  effect((_p$) => {
6334
6323
  var _v$5 = isCursor() ? theme.primary : undefined, _v$6 = isCursor() ? theme.selectedListItemText : theme.textMuted, _v$7 = TextAttributes3.BOLD;
6335
- _v$5 !== _p$.e && (_p$.e = setProp(_el$19, "backgroundColor", _v$5, _p$.e));
6336
- _v$6 !== _p$.t && (_p$.t = setProp(_el$20, "fg", _v$6, _p$.t));
6337
- _v$7 !== _p$.a && (_p$.a = setProp(_el$20, "attributes", _v$7, _p$.a));
6324
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$20, "backgroundColor", _v$5, _p$.e));
6325
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$21, "fg", _v$6, _p$.t));
6326
+ _v$7 !== _p$.a && (_p$.a = setProp(_el$21, "attributes", _v$7, _p$.a));
6338
6327
  return _p$;
6339
6328
  }, {
6340
6329
  e: undefined,
6341
6330
  t: undefined,
6342
6331
  a: undefined
6343
6332
  });
6344
- return _el$19;
6333
+ return _el$20;
6345
6334
  })();
6346
6335
  }
6347
6336
  if (row.kind === "file") {
6348
6337
  const indent = " ".repeat(row.depth);
6349
6338
  return (() => {
6350
- var _el$21 = createElement("box"), _el$22 = createElement("text");
6351
- insertNode(_el$21, _el$22);
6352
- setProp(_el$21, "paddingLeft", 1);
6353
- setProp(_el$21, "paddingRight", 1);
6354
- setProp(_el$21, "onMouseUp", () => {
6339
+ var _el$22 = createElement("box"), _el$23 = createElement("text");
6340
+ insertNode(_el$22, _el$23);
6341
+ setProp(_el$22, "paddingLeft", 1);
6342
+ setProp(_el$22, "paddingRight", 1);
6343
+ setProp(_el$22, "onMouseUp", () => {
6355
6344
  setCursorIndex(index());
6356
6345
  props.onOpenFile(row.path);
6357
6346
  });
6358
- setProp(_el$22, "wrapMode", "none");
6359
- insert(_el$22, () => `${indent} ${row.name}`);
6347
+ setProp(_el$23, "wrapMode", "none");
6348
+ insert(_el$23, () => `${indent} ${row.name}`);
6360
6349
  effect((_p$) => {
6361
6350
  var _v$8 = isCursor() ? theme.primary : undefined, _v$9 = isCursor() ? theme.selectedListItemText : theme.text;
6362
- _v$8 !== _p$.e && (_p$.e = setProp(_el$21, "backgroundColor", _v$8, _p$.e));
6363
- _v$9 !== _p$.t && (_p$.t = setProp(_el$22, "fg", _v$9, _p$.t));
6351
+ _v$8 !== _p$.e && (_p$.e = setProp(_el$22, "backgroundColor", _v$8, _p$.e));
6352
+ _v$9 !== _p$.t && (_p$.t = setProp(_el$23, "fg", _v$9, _p$.t));
6364
6353
  return _p$;
6365
6354
  }, {
6366
6355
  e: undefined,
6367
6356
  t: undefined
6368
6357
  });
6369
- return _el$21;
6358
+ return _el$22;
6370
6359
  })();
6371
6360
  }
6372
6361
  const tone = statusToken(row.status);
@@ -6388,62 +6377,62 @@ function FileTree(props) {
6388
6377
  const addedText = row.added == null ? " ".repeat(w.added) : `+${row.added}`.padStart(w.added);
6389
6378
  const deletedText = row.deleted == null ? " ".repeat(w.deleted) : `-${row.deleted}`.padStart(w.deleted);
6390
6379
  return (() => {
6391
- var _el$23 = createElement("box"), _el$24 = createElement("text"), _el$25 = createElement("text");
6392
- insertNode(_el$23, _el$24);
6393
- insertNode(_el$23, _el$25);
6394
- setProp(_el$23, "flexDirection", "row");
6395
- setProp(_el$23, "gap", 1);
6396
- setProp(_el$23, "paddingLeft", 1);
6397
- setProp(_el$23, "paddingRight", 1);
6398
- setProp(_el$23, "onMouseUp", () => {
6380
+ var _el$24 = createElement("box"), _el$25 = createElement("text"), _el$26 = createElement("text");
6381
+ insertNode(_el$24, _el$25);
6382
+ insertNode(_el$24, _el$26);
6383
+ setProp(_el$24, "flexDirection", "row");
6384
+ setProp(_el$24, "gap", 1);
6385
+ setProp(_el$24, "paddingLeft", 1);
6386
+ setProp(_el$24, "paddingRight", 1);
6387
+ setProp(_el$24, "onMouseUp", () => {
6399
6388
  setCursorIndex(index());
6400
6389
  props.onOpenFile(row.path);
6401
6390
  });
6402
- setProp(_el$24, "wrapMode", "none");
6403
- insert(_el$24, () => row.status);
6404
6391
  setProp(_el$25, "wrapMode", "none");
6405
- setProp(_el$25, "flexGrow", 1);
6406
- insert(_el$25, () => row.path);
6407
- insert(_el$23, createComponent2(Show, {
6392
+ insert(_el$25, () => row.status);
6393
+ setProp(_el$26, "wrapMode", "none");
6394
+ setProp(_el$26, "flexGrow", 1);
6395
+ insert(_el$26, () => row.path);
6396
+ insert(_el$24, createComponent2(Show, {
6408
6397
  get when() {
6409
6398
  return w.added > 0;
6410
6399
  },
6411
6400
  get children() {
6412
- var _el$26 = createElement("text");
6413
- setProp(_el$26, "wrapMode", "none");
6414
- insert(_el$26, addedText);
6415
- effect((_$p) => setProp(_el$26, "fg", isCursor() ? theme.selectedListItemText : theme.success, _$p));
6416
- return _el$26;
6401
+ var _el$27 = createElement("text");
6402
+ setProp(_el$27, "wrapMode", "none");
6403
+ insert(_el$27, addedText);
6404
+ effect((_$p) => setProp(_el$27, "fg", isCursor() ? theme.selectedListItemText : theme.success, _$p));
6405
+ return _el$27;
6417
6406
  }
6418
6407
  }), null);
6419
- insert(_el$23, createComponent2(Show, {
6408
+ insert(_el$24, createComponent2(Show, {
6420
6409
  get when() {
6421
6410
  return w.deleted > 0;
6422
6411
  },
6423
6412
  get children() {
6424
- var _el$27 = createElement("text");
6425
- setProp(_el$27, "wrapMode", "none");
6426
- insert(_el$27, deletedText);
6427
- effect((_$p) => setProp(_el$27, "fg", isCursor() ? theme.selectedListItemText : theme.error, _$p));
6428
- return _el$27;
6413
+ var _el$28 = createElement("text");
6414
+ setProp(_el$28, "wrapMode", "none");
6415
+ insert(_el$28, deletedText);
6416
+ effect((_$p) => setProp(_el$28, "fg", isCursor() ? theme.selectedListItemText : theme.error, _$p));
6417
+ return _el$28;
6429
6418
  }
6430
6419
  }), null);
6431
6420
  effect((_p$) => {
6432
6421
  var _v$0 = isCursor() ? theme.primary : undefined, _v$1 = isCursor() ? theme.selectedListItemText : statusColor(), _v$10 = isCursor() ? theme.selectedListItemText : theme.text;
6433
- _v$0 !== _p$.e && (_p$.e = setProp(_el$23, "backgroundColor", _v$0, _p$.e));
6434
- _v$1 !== _p$.t && (_p$.t = setProp(_el$24, "fg", _v$1, _p$.t));
6435
- _v$10 !== _p$.a && (_p$.a = setProp(_el$25, "fg", _v$10, _p$.a));
6422
+ _v$0 !== _p$.e && (_p$.e = setProp(_el$24, "backgroundColor", _v$0, _p$.e));
6423
+ _v$1 !== _p$.t && (_p$.t = setProp(_el$25, "fg", _v$1, _p$.t));
6424
+ _v$10 !== _p$.a && (_p$.a = setProp(_el$26, "fg", _v$10, _p$.a));
6436
6425
  return _p$;
6437
6426
  }, {
6438
6427
  e: undefined,
6439
6428
  t: undefined,
6440
6429
  a: undefined
6441
6430
  });
6442
- return _el$23;
6431
+ return _el$24;
6443
6432
  })();
6444
6433
  }
6445
6434
  }));
6446
- return _el$17;
6435
+ return _el$18;
6447
6436
  }
6448
6437
  }), null);
6449
6438
  effect((_$p) => setProp(_el$4, "fg", theme.textMuted, _$p));
@@ -6466,11 +6455,10 @@ var init_FileTree = __esm(() => {
6466
6455
  init_git();
6467
6456
  init_keys();
6468
6457
  init_open_external();
6469
- TABS = ["all", "changes", "checks"];
6458
+ TABS = ["all", "changes"];
6470
6459
  TAB_LABEL = {
6471
6460
  all: "All",
6472
- changes: "Changes",
6473
- checks: "Checks"
6461
+ changes: "Changes"
6474
6462
  };
6475
6463
  });
6476
6464
 
@@ -16734,7 +16722,8 @@ var init_capabilities = __esm(() => {
16734
16722
  { id: "plan", label: "plan mode" }
16735
16723
  ],
16736
16724
  defaultModelId: resolveClaudeDefaultModelId,
16737
- contextWindowFor: claudeContextWindowFor
16725
+ contextWindowFor: claudeContextWindowFor,
16726
+ smallFastModelId: () => "claude-haiku-4-5-20251001"
16738
16727
  };
16739
16728
  claudeIdentity = {
16740
16729
  vendorId: "claude",
@@ -16824,7 +16813,8 @@ var init_capabilities2 = __esm(() => {
16824
16813
  { id: "plan", label: "plan mode" }
16825
16814
  ],
16826
16815
  defaultModelId: resolveCodexDefaultModelId,
16827
- contextWindowFor: codexContextWindowFor
16816
+ contextWindowFor: codexContextWindowFor,
16817
+ smallFastModelId: () => "gpt-5.4-mini"
16828
16818
  };
16829
16819
  codexIdentity = {
16830
16820
  vendorId: "codex",
@@ -16907,7 +16897,8 @@ var init_capabilities3 = __esm(() => {
16907
16897
  { id: "plan", label: "plan mode" }
16908
16898
  ],
16909
16899
  defaultModelId: resolveGeminiDefaultModelId,
16910
- contextWindowFor: geminiContextWindowFor
16900
+ contextWindowFor: geminiContextWindowFor,
16901
+ smallFastModelId: () => "gemini-3-flash-preview"
16911
16902
  };
16912
16903
  geminiIdentity = {
16913
16904
  vendorId: "gemini",
@@ -17490,7 +17481,7 @@ var init_package = __esm(() => {
17490
17481
  package_default = {
17491
17482
  $schema: "https://json.schemastore.org/package.json",
17492
17483
  name: "@sma1lboy/kobe",
17493
- version: "0.5.26",
17484
+ version: "0.5.27",
17494
17485
  description: "TUI orchestrator for Claude Code (codename)",
17495
17486
  type: "module",
17496
17487
  packageManager: "bun@1.3.13",
@@ -23256,6 +23247,14 @@ class MetadataSuggester {
23256
23247
  async suggestTitle(prompt, context) {
23257
23248
  return this.runOneShot(buildTitleInstruction, sanitizeTitleText, prompt, context);
23258
23249
  }
23250
+ async suggestRecap(history, context) {
23251
+ if (history.length === 0)
23252
+ return null;
23253
+ const transcript = renderRecapTranscript(history);
23254
+ if (!transcript)
23255
+ return null;
23256
+ return this.runOneShot(() => buildRecapInstruction(transcript), sanitizeRecapText, transcript, context);
23257
+ }
23259
23258
  async runOneShot(builder, sanitize, prompt, context) {
23260
23259
  const trimmed = prompt.trim();
23261
23260
  if (!trimmed)
@@ -23359,6 +23358,59 @@ function sanitizeKebabSlug(raw) {
23359
23358
  const cleaned = firstLine.toLowerCase().replace(/^["'`]+|["'`]+$/g, "").replace(/^(branch|slug|worktree)[:\s-]+/, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, MAX_SLUG_LEN).replace(/-+$/g, "");
23360
23359
  return cleaned.length > 0 ? cleaned : null;
23361
23360
  }
23361
+ function renderRecapTranscript(history) {
23362
+ const window2 = history.slice(-RECAP_MESSAGE_WINDOW);
23363
+ const lines = [];
23364
+ for (const m2 of window2) {
23365
+ let text = "";
23366
+ for (const b2 of m2.blocks) {
23367
+ if (b2.type === "text" && b2.text)
23368
+ text += text ? `
23369
+ ${b2.text}` : b2.text;
23370
+ }
23371
+ const cleaned = text.trim();
23372
+ if (!cleaned)
23373
+ continue;
23374
+ const capped = cleaned.length > RECAP_PER_MESSAGE_CHAR_CAP ? `${cleaned.slice(0, RECAP_PER_MESSAGE_CHAR_CAP)}\u2026` : cleaned;
23375
+ lines.push(`${m2.role}: ${capped}`);
23376
+ }
23377
+ if (lines.length === 0)
23378
+ return null;
23379
+ return lines.join(`
23380
+
23381
+ `);
23382
+ }
23383
+ function buildRecapInstruction(transcript) {
23384
+ return [
23385
+ "The user stepped away and is coming back. Read the conversation transcript below and write a short recap.",
23386
+ "Rules:",
23387
+ "- Exactly 1-3 short sentences.",
23388
+ "- Start by stating the high-level task \u2014 what is being built or debugged, not implementation details.",
23389
+ "- Then state the concrete next step.",
23390
+ "- Skip status reports and commit recaps.",
23391
+ "- Reply with ONLY the recap sentences, no preamble, no quotes, no markdown.",
23392
+ "",
23393
+ "Transcript:",
23394
+ transcript,
23395
+ "",
23396
+ "Recap:"
23397
+ ].join(`
23398
+ `);
23399
+ }
23400
+ function sanitizeRecapText(raw) {
23401
+ let cleaned = raw.replace(/\t+/g, " ").replace(/\r\n?/g, `
23402
+ `).replace(/\n{3,}/g, `
23403
+
23404
+ `).trim();
23405
+ if (!cleaned)
23406
+ return null;
23407
+ cleaned = cleaned.replace(/^["'`]+|["'`]+$/g, "").replace(/^(recap|summary)[:\s-]+/i, "").trim();
23408
+ if (!cleaned)
23409
+ return null;
23410
+ if (cleaned.length > MAX_RECAP_LEN)
23411
+ cleaned = `${cleaned.slice(0, MAX_RECAP_LEN).trimEnd()}\u2026`;
23412
+ return cleaned;
23413
+ }
23362
23414
  function sanitizeTitleText(raw) {
23363
23415
  const firstLine = raw.split(/\r?\n/).map((s2) => s2.trim()).find((s2) => s2.length > 0);
23364
23416
  if (!firstLine)
@@ -23366,7 +23418,7 @@ function sanitizeTitleText(raw) {
23366
23418
  const cleaned = firstLine.replace(/^["'`]+|["'`]+$/g, "").replace(/^title[:\s-]+/i, "").replace(/[\s.!]+$/g, "").slice(0, MAX_TITLE_LEN).trim();
23367
23419
  return cleaned.length > 0 ? cleaned : null;
23368
23420
  }
23369
- var SUGGESTION_TIMEOUT_MS = 30000, MAX_SLUG_LEN = 32, MAX_TITLE_LEN = 60, NullMetadataSuggester;
23421
+ var SUGGESTION_TIMEOUT_MS = 30000, MAX_SLUG_LEN = 32, MAX_TITLE_LEN = 60, RECAP_MESSAGE_WINDOW = 30, RECAP_PER_MESSAGE_CHAR_CAP = 1200, MAX_RECAP_LEN = 600, NullMetadataSuggester;
23370
23422
  var init_metadata_suggester = __esm(() => {
23371
23423
  NullMetadataSuggester = class NullMetadataSuggester extends MetadataSuggester {
23372
23424
  async suggestBranchSlug(_prompt) {
@@ -23378,6 +23430,9 @@ var init_metadata_suggester = __esm(() => {
23378
23430
  async suggestTitle(_prompt) {
23379
23431
  return null;
23380
23432
  }
23433
+ async suggestRecap(_history) {
23434
+ return null;
23435
+ }
23381
23436
  };
23382
23437
  });
23383
23438
 
@@ -24925,6 +24980,42 @@ class Orchestrator {
24925
24980
  await this.setActiveTab(task.id, mergeTab.id);
24926
24981
  await this.runTask(task.id, prompt, mergeTab.id);
24927
24982
  }
24983
+ async generateRecap(id, tabId) {
24984
+ const task = this.requireTask(id);
24985
+ const tab = this.resolveTab(task, tabId);
24986
+ if (!tab.sessionId) {
24987
+ this.dispatchEvent(task.id, tab.id, {
24988
+ type: "system.info",
24989
+ text: "(/recap unavailable \u2014 send a prompt first to start a session)"
24990
+ });
24991
+ return;
24992
+ }
24993
+ const engine3 = this.engineForTab(task, tab);
24994
+ const messages = await engine3.readHistory(tab.sessionId).then((h2) => h2.messages).catch(() => []);
24995
+ if (messages.length === 0) {
24996
+ this.dispatchEvent(task.id, tab.id, {
24997
+ type: "system.info",
24998
+ text: "(/recap unavailable \u2014 no transcript yet)"
24999
+ });
25000
+ return;
25001
+ }
25002
+ const model = engine3.capabilities.smallFastModelId?.() ?? engine3.capabilities.defaultModelId();
25003
+ const ctx3 = {
25004
+ engine: engine3,
25005
+ cwd: task.worktreePath || task.repo,
25006
+ model,
25007
+ permissionMode: task.permissionMode
25008
+ };
25009
+ const text = await this.metadataSuggester.suggestRecap(messages, ctx3);
25010
+ if (!text) {
25011
+ this.dispatchEvent(task.id, tab.id, {
25012
+ type: "system.info",
25013
+ text: `(/recap failed \u2014 engine returned no summary; model="${model}")`
25014
+ });
25015
+ return;
25016
+ }
25017
+ this.dispatchEvent(task.id, tab.id, { type: "recap", text });
25018
+ }
24928
25019
  async respondToInput(id, requestId, response) {
24929
25020
  const task = this.requireTask(id);
24930
25021
  const resolved = this.pendingInputBroker.resolve(task.id, requestId);
@@ -26212,6 +26303,10 @@ async function startDaemonServer(orch, options = {}) {
26212
26303
  await orch.steerTask(requireString2(payload, "taskId"), requireString2(payload, "text"), optionalString2(payload, "tabId"));
26213
26304
  return {};
26214
26305
  }
26306
+ case "chat.recap": {
26307
+ await orch.generateRecap(requireString2(payload, "taskId"), optionalString2(payload, "tabId"));
26308
+ return {};
26309
+ }
26215
26310
  case "chat.input.pending": {
26216
26311
  return { pending: orch.peekPendingInput(requireString2(payload, "taskId")) };
26217
26312
  }
@@ -26929,6 +27024,9 @@ class RemoteOrchestrator {
26929
27024
  await this.client.request("chat.steer", { taskId, text, tabId });
26930
27025
  this.markRunState(taskId, tabId ?? this.getTask(taskId)?.activeTabId, "running");
26931
27026
  }
27027
+ async generateRecap(taskId, tabId) {
27028
+ await this.client.request("chat.recap", { taskId, tabId });
27029
+ }
26932
27030
  async setArchived(taskId, archived) {
26933
27031
  await this.client.request("task.archive", { taskId, archived });
26934
27032
  }
@@ -28637,10 +28735,6 @@ function useAppKeymap(deps) {
28637
28735
  "task.openEditor": deps.openActiveTaskInEditor,
28638
28736
  "settings.open": () => {
28639
28737
  SettingsDialog.show(dialog, deps.kv, deps.orchestrator);
28640
- },
28641
- "tasks.background": () => {
28642
- if (pressBackgroundTasksChord() === "fire")
28643
- deps.openBackgroundTasks();
28644
28738
  }
28645
28739
  })
28646
28740
  }));
@@ -28666,340 +28760,6 @@ var init_app_keymap = __esm(() => {
28666
28760
  init_dialog_confirm();
28667
28761
  });
28668
28762
 
28669
- // src/tui/component/background-tasks-parts.ts
28670
- function computeBackgroundRows(runState, tasks, visibleKey) {
28671
- const out = [];
28672
- for (const [key, state] of runState) {
28673
- if (visibleKey && key === visibleKey)
28674
- continue;
28675
- const sep = key.indexOf(":");
28676
- if (sep < 0)
28677
- continue;
28678
- const taskId = key.slice(0, sep);
28679
- const tabId = key.slice(sep + 1);
28680
- const task = tasks.find((t2) => t2.id === taskId);
28681
- if (!task)
28682
- continue;
28683
- const tab = task.tabs.find((t2) => t2.id === tabId);
28684
- out.push({
28685
- taskId,
28686
- tabId,
28687
- taskTitle: task.title,
28688
- tabLabel: tab?.title && tab.title.length > 0 ? tab.title : `chat ${tab?.seq ?? "?"}`,
28689
- state
28690
- });
28691
- }
28692
- out.sort((a2, b2) => {
28693
- if (a2.state !== b2.state)
28694
- return a2.state === "awaiting_input" ? -1 : 1;
28695
- return a2.taskTitle.localeCompare(b2.taskTitle);
28696
- });
28697
- return out;
28698
- }
28699
- var BACKGROUND_TASKS_DIALOG_TITLE = "kobe \u2014 background tasks", BACKGROUND_TASKS_DIALOG_EMPTY = "No sessions running in the background.", BACKGROUND_TASKS_DIALOG_FOOTER = "j/k or \u2191\u2193 navigate \u2022 enter jump \u2022 x interrupt \u2022 esc dismiss";
28700
-
28701
- // src/tui/component/background-tasks-dialog.tsx
28702
- import { TextAttributes as TextAttributes11 } from "@opentui/core";
28703
- function BackgroundTasksDialog(props) {
28704
- const dialog = useDialog();
28705
- const {
28706
- theme
28707
- } = useTheme();
28708
- const [cursor, setCursor] = createSignal(0);
28709
- const rows = createMemo(() => computeBackgroundRows(props.runState(), props.tasks(), props.visibleTabKey()));
28710
- const safeCursor = createMemo(() => {
28711
- const len = rows().length;
28712
- if (len === 0)
28713
- return 0;
28714
- return Math.max(0, Math.min(len - 1, cursor()));
28715
- });
28716
- const move = (delta) => {
28717
- const len = rows().length;
28718
- if (len === 0)
28719
- return;
28720
- setCursor(Math.max(0, Math.min(len - 1, safeCursor() + delta)));
28721
- };
28722
- function jump() {
28723
- const picked = rows()[safeCursor()];
28724
- if (!picked)
28725
- return;
28726
- props.onJump(picked.taskId, picked.tabId);
28727
- dialog.clear();
28728
- }
28729
- function interrupt() {
28730
- const picked = rows()[safeCursor()];
28731
- if (!picked)
28732
- return;
28733
- props.onInterrupt(picked.taskId, picked.tabId);
28734
- }
28735
- useBindings(() => ({
28736
- bindings: [{
28737
- key: "j",
28738
- cmd: () => move(1)
28739
- }, {
28740
- key: "down",
28741
- cmd: () => move(1)
28742
- }, {
28743
- key: "k",
28744
- cmd: () => move(-1)
28745
- }, {
28746
- key: "up",
28747
- cmd: () => move(-1)
28748
- }, {
28749
- key: "x",
28750
- cmd: () => interrupt()
28751
- }, {
28752
- key: "enter",
28753
- cmd: () => jump()
28754
- }, {
28755
- key: "return",
28756
- cmd: () => jump()
28757
- }]
28758
- }));
28759
- return (() => {
28760
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$4 = createElement("text"), _el$8 = createElement("box"), _el$9 = createElement("text");
28761
- insertNode(_el$, _el$2);
28762
- insertNode(_el$, _el$8);
28763
- setProp(_el$, "paddingLeft", 2);
28764
- setProp(_el$, "paddingRight", 2);
28765
- setProp(_el$, "gap", 1);
28766
- setProp(_el$, "flexShrink", 1);
28767
- insertNode(_el$2, _el$3);
28768
- insertNode(_el$2, _el$4);
28769
- setProp(_el$2, "flexDirection", "row");
28770
- setProp(_el$2, "justifyContent", "space-between");
28771
- setProp(_el$2, "flexShrink", 0);
28772
- insert(_el$3, BACKGROUND_TASKS_DIALOG_TITLE);
28773
- insertNode(_el$4, createTextNode(`esc`));
28774
- setProp(_el$4, "onMouseUp", () => dialog.clear());
28775
- insert(_el$, createComponent2(Show, {
28776
- get when() {
28777
- return rows().length > 0;
28778
- },
28779
- get fallback() {
28780
- return (() => {
28781
- var _el$0 = createElement("box"), _el$1 = createElement("text");
28782
- insertNode(_el$0, _el$1);
28783
- setProp(_el$0, "paddingTop", 1);
28784
- setProp(_el$0, "paddingBottom", 1);
28785
- insert(_el$1, BACKGROUND_TASKS_DIALOG_EMPTY);
28786
- effect((_$p) => setProp(_el$1, "fg", theme.textMuted, _$p));
28787
- return _el$0;
28788
- })();
28789
- },
28790
- get children() {
28791
- var _el$6 = createElement("scrollbox"), _el$7 = createElement("box");
28792
- insertNode(_el$6, _el$7);
28793
- setProp(_el$6, "flexShrink", 1);
28794
- setProp(_el$6, "flexGrow", 1);
28795
- setProp(_el$6, "stickyScroll", false);
28796
- setProp(_el$7, "paddingBottom", 1);
28797
- setProp(_el$7, "gap", 0);
28798
- setProp(_el$7, "paddingRight", 1);
28799
- insert(_el$7, createComponent2(For, {
28800
- get each() {
28801
- return rows();
28802
- },
28803
- children: (row, idx) => {
28804
- const selected = () => idx() === safeCursor();
28805
- const awaiting = () => row.state === "awaiting_input";
28806
- return (() => {
28807
- var _el$10 = createElement("box"), _el$11 = createElement("box"), _el$12 = createElement("text"), _el$13 = createElement("box"), _el$14 = createElement("text"), _el$15 = createElement("box"), _el$16 = createElement("text");
28808
- insertNode(_el$10, _el$11);
28809
- insertNode(_el$10, _el$13);
28810
- insertNode(_el$10, _el$15);
28811
- setProp(_el$10, "flexDirection", "row");
28812
- setProp(_el$10, "gap", 2);
28813
- setProp(_el$10, "paddingLeft", 1);
28814
- setProp(_el$10, "paddingRight", 1);
28815
- setProp(_el$10, "onMouseDown", () => setCursor(idx()));
28816
- setProp(_el$10, "onMouseUp", () => jump());
28817
- insertNode(_el$11, _el$12);
28818
- setProp(_el$11, "width", 14);
28819
- setProp(_el$11, "flexShrink", 0);
28820
- setProp(_el$12, "wrapMode", "none");
28821
- insert(_el$12, () => awaiting() ? "\u25CF needs input" : "\u25CF running");
28822
- insertNode(_el$13, _el$14);
28823
- setProp(_el$13, "flexGrow", 1);
28824
- setProp(_el$13, "flexShrink", 1);
28825
- setProp(_el$14, "wrapMode", "none");
28826
- insert(_el$14, () => row.taskTitle);
28827
- insertNode(_el$15, _el$16);
28828
- setProp(_el$15, "width", 18);
28829
- setProp(_el$15, "flexShrink", 0);
28830
- setProp(_el$16, "wrapMode", "none");
28831
- insert(_el$16, () => row.tabLabel);
28832
- effect((_p$) => {
28833
- var _v$5 = selected() ? theme.primary : undefined, _v$6 = selected() ? theme.selectedListItemText : awaiting() ? theme.warning : theme.success, _v$7 = selected() ? theme.selectedListItemText : theme.text, _v$8 = selected() ? theme.selectedListItemText : theme.textMuted;
28834
- _v$5 !== _p$.e && (_p$.e = setProp(_el$10, "backgroundColor", _v$5, _p$.e));
28835
- _v$6 !== _p$.t && (_p$.t = setProp(_el$12, "fg", _v$6, _p$.t));
28836
- _v$7 !== _p$.a && (_p$.a = setProp(_el$14, "fg", _v$7, _p$.a));
28837
- _v$8 !== _p$.o && (_p$.o = setProp(_el$16, "fg", _v$8, _p$.o));
28838
- return _p$;
28839
- }, {
28840
- e: undefined,
28841
- t: undefined,
28842
- a: undefined,
28843
- o: undefined
28844
- });
28845
- return _el$10;
28846
- })();
28847
- }
28848
- }));
28849
- effect((_$p) => setProp(_el$6, "verticalScrollbarOptions", {
28850
- trackOptions: {
28851
- backgroundColor: theme.backgroundDialog,
28852
- foregroundColor: theme.borderActive
28853
- }
28854
- }, _$p));
28855
- return _el$6;
28856
- }
28857
- }), _el$8);
28858
- insertNode(_el$8, _el$9);
28859
- setProp(_el$8, "paddingTop", 0);
28860
- setProp(_el$8, "paddingBottom", 1);
28861
- insert(_el$9, BACKGROUND_TASKS_DIALOG_FOOTER);
28862
- effect((_p$) => {
28863
- var _v$ = TextAttributes11.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
28864
- _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
28865
- _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
28866
- _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$3, _p$.a));
28867
- _v$4 !== _p$.o && (_p$.o = setProp(_el$9, "fg", _v$4, _p$.o));
28868
- return _p$;
28869
- }, {
28870
- e: undefined,
28871
- t: undefined,
28872
- a: undefined,
28873
- o: undefined
28874
- });
28875
- return _el$;
28876
- })();
28877
- }
28878
- var init_background_tasks_dialog = __esm(() => {
28879
- init_solid();
28880
- init_solid();
28881
- init_solid();
28882
- init_solid();
28883
- init_solid();
28884
- init_solid();
28885
- init_solid();
28886
- init_solid();
28887
- init_dev();
28888
- init_theme();
28889
- init_keymap();
28890
- init_dialog();
28891
- BackgroundTasksDialog.show = (dialog, props) => {
28892
- dialog.replace(() => createComponent2(BackgroundTasksDialog, props));
28893
- };
28894
- });
28895
-
28896
- // src/tui/component/background-tasks-indicator.tsx
28897
- import { TextAttributes as TextAttributes12 } from "@opentui/core";
28898
- function BackgroundTasksIndicator(props) {
28899
- const {
28900
- theme
28901
- } = useTheme();
28902
- const armed = useBackgroundTasksArmed();
28903
- const rows = createMemo(() => computeBackgroundRows(props.runState(), props.tasks(), props.visibleTabKey()));
28904
- const count = () => rows().length;
28905
- const anyAwaiting = () => rows().some((r2) => r2.state === "awaiting_input");
28906
- return createComponent2(Show, {
28907
- get when() {
28908
- return count() > 0 || armed();
28909
- },
28910
- get children() {
28911
- var _el$ = createElement("box");
28912
- setProp(_el$, "flexDirection", "row");
28913
- setProp(_el$, "gap", 1);
28914
- setProp(_el$, "flexShrink", 0);
28915
- setProp(_el$, "onMouseUp", () => props.onActivate());
28916
- insert(_el$, createComponent2(Show, {
28917
- get when() {
28918
- return armed();
28919
- },
28920
- get fallback() {
28921
- return [(() => {
28922
- var _el$5 = createElement("text"), _el$6 = createTextNode(`\u29BF `);
28923
- insertNode(_el$5, _el$6);
28924
- setProp(_el$5, "wrapMode", "none");
28925
- insert(_el$5, count, null);
28926
- effect((_p$) => {
28927
- var _v$3 = anyAwaiting() ? theme.warning : theme.success, _v$4 = TextAttributes12.BOLD;
28928
- _v$3 !== _p$.e && (_p$.e = setProp(_el$5, "fg", _v$3, _p$.e));
28929
- _v$4 !== _p$.t && (_p$.t = setProp(_el$5, "attributes", _v$4, _p$.t));
28930
- return _p$;
28931
- }, {
28932
- e: undefined,
28933
- t: undefined
28934
- });
28935
- return _el$5;
28936
- })(), (() => {
28937
- var _el$7 = createElement("text");
28938
- insertNode(_el$7, createTextNode(`background`));
28939
- setProp(_el$7, "wrapMode", "none");
28940
- effect((_$p) => setProp(_el$7, "fg", theme.textMuted, _$p));
28941
- return _el$7;
28942
- })(), (() => {
28943
- var _el$9 = createElement("text");
28944
- insertNode(_el$9, createTextNode(`[ctrl+b]`));
28945
- setProp(_el$9, "wrapMode", "none");
28946
- effect((_p$) => {
28947
- var _v$5 = theme.accent, _v$6 = TextAttributes12.BOLD;
28948
- _v$5 !== _p$.e && (_p$.e = setProp(_el$9, "fg", _v$5, _p$.e));
28949
- _v$6 !== _p$.t && (_p$.t = setProp(_el$9, "attributes", _v$6, _p$.t));
28950
- return _p$;
28951
- }, {
28952
- e: undefined,
28953
- t: undefined
28954
- });
28955
- return _el$9;
28956
- })()];
28957
- },
28958
- get children() {
28959
- return [(() => {
28960
- var _el$2 = createElement("text");
28961
- insertNode(_el$2, createTextNode(`press ctrl+b again`));
28962
- setProp(_el$2, "wrapMode", "none");
28963
- effect((_p$) => {
28964
- var _v$ = theme.warning, _v$2 = TextAttributes12.BOLD;
28965
- _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
28966
- _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
28967
- return _p$;
28968
- }, {
28969
- e: undefined,
28970
- t: undefined
28971
- });
28972
- return _el$2;
28973
- })(), (() => {
28974
- var _el$4 = createElement("text");
28975
- setProp(_el$4, "wrapMode", "none");
28976
- insert(_el$4, (() => {
28977
- var _c$ = memo2(() => count() > 0);
28978
- return () => _c$() ? `for ${count()} background` : "for background tasks";
28979
- })());
28980
- effect((_$p) => setProp(_el$4, "fg", theme.textMuted, _$p));
28981
- return _el$4;
28982
- })()];
28983
- }
28984
- }));
28985
- return _el$;
28986
- }
28987
- });
28988
- }
28989
- var init_background_tasks_indicator = __esm(() => {
28990
- init_solid();
28991
- init_solid();
28992
- init_solid();
28993
- init_solid();
28994
- init_solid();
28995
- init_solid();
28996
- init_solid();
28997
- init_solid();
28998
- init_dev();
28999
- init_keybindings();
29000
- init_theme();
29001
- });
29002
-
29003
28763
  // src/tui/asset/pulse.wav
29004
28764
  var pulse_default = "../pulse-n3cq1btw.wav";
29005
28765
  var init_pulse = () => {};
@@ -29268,7 +29028,7 @@ function chatTabMarkerKind(input) {
29268
29028
 
29269
29029
  // src/tui/component/center-tab-strip.tsx
29270
29030
  import { basename as basename3 } from "path";
29271
- import { TextAttributes as TextAttributes13 } from "@opentui/core";
29031
+ import { TextAttributes as TextAttributes11 } from "@opentui/core";
29272
29032
  function CenterTabStrip(props) {
29273
29033
  const {
29274
29034
  theme
@@ -29295,7 +29055,7 @@ function CenterTabStrip(props) {
29295
29055
  setProp(_el$2, "onMouseUp", () => props.onSelectChat());
29296
29056
  insertNode(_el$3, createTextNode(`chat`));
29297
29057
  effect((_p$) => {
29298
- var _v$ = props.isChatActive() ? theme.primary : theme.backgroundElement, _v$2 = props.isChatActive() ? theme.selectedListItemText : theme.text, _v$3 = props.isChatActive() ? TextAttributes13.BOLD : undefined;
29058
+ var _v$ = props.isChatActive() ? theme.primary : theme.backgroundElement, _v$2 = props.isChatActive() ? theme.selectedListItemText : theme.text, _v$3 = props.isChatActive() ? TextAttributes11.BOLD : undefined;
29299
29059
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "backgroundColor", _v$, _p$.e));
29300
29060
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
29301
29061
  _v$3 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$3, _p$.a));
@@ -29368,7 +29128,7 @@ function CenterTabStrip(props) {
29368
29128
  setProp(_el$8, "wrapMode", "none");
29369
29129
  insert(_el$8, () => chatTabLabel(tab));
29370
29130
  effect((_p$) => {
29371
- var _v$4 = isPrimary() ? theme.primary : theme.backgroundElement, _v$5 = isPrimary() ? theme.selectedListItemText : isVisibleButOther() ? theme.text : theme.textMuted, _v$6 = isPrimary() ? TextAttributes13.BOLD : undefined;
29131
+ var _v$4 = isPrimary() ? theme.primary : theme.backgroundElement, _v$5 = isPrimary() ? theme.selectedListItemText : isVisibleButOther() ? theme.text : theme.textMuted, _v$6 = isPrimary() ? TextAttributes11.BOLD : undefined;
29372
29132
  _v$4 !== _p$.e && (_p$.e = setProp(_el$5, "backgroundColor", _v$4, _p$.e));
29373
29133
  _v$5 !== _p$.t && (_p$.t = setProp(_el$8, "fg", _v$5, _p$.t));
29374
29134
  _v$6 !== _p$.a && (_p$.a = setProp(_el$8, "attributes", _v$6, _p$.a));
@@ -29404,7 +29164,7 @@ function CenterTabStrip(props) {
29404
29164
  insertNode(_el$1, createTextNode(`x`));
29405
29165
  setProp(_el$1, "onMouseUp", () => queueMicrotask(() => props.onCloseFile(file())));
29406
29166
  effect((_p$) => {
29407
- var _v$7 = isActive() ? theme.primary : theme.backgroundElement, _v$8 = isActive() ? theme.selectedListItemText : theme.text, _v$9 = isActive() ? TextAttributes13.BOLD : undefined, _v$0 = isActive() ? theme.selectedListItemText : theme.textMuted;
29167
+ var _v$7 = isActive() ? theme.primary : theme.backgroundElement, _v$8 = isActive() ? theme.selectedListItemText : theme.text, _v$9 = isActive() ? TextAttributes11.BOLD : undefined, _v$0 = isActive() ? theme.selectedListItemText : theme.textMuted;
29408
29168
  _v$7 !== _p$.e && (_p$.e = setProp(_el$9, "backgroundColor", _v$7, _p$.e));
29409
29169
  _v$8 !== _p$.t && (_p$.t = setProp(_el$0, "fg", _v$8, _p$.t));
29410
29170
  _v$9 !== _p$.a && (_p$.a = setProp(_el$0, "attributes", _v$9, _p$.a));
@@ -29452,7 +29212,7 @@ function orderSlashes(slashes) {
29452
29212
  }
29453
29213
 
29454
29214
  // src/tui/component/help-dialog.tsx
29455
- import { TextAttributes as TextAttributes14 } from "@opentui/core";
29215
+ import { TextAttributes as TextAttributes12 } from "@opentui/core";
29456
29216
  function groupBindings(keymap) {
29457
29217
  const groups = new Map;
29458
29218
  const order = [];
@@ -29558,7 +29318,7 @@ function HelpDialog() {
29558
29318
  }
29559
29319
  }), null);
29560
29320
  effect((_p$) => {
29561
- var _v$8 = theme.accent, _v$9 = TextAttributes14.BOLD;
29321
+ var _v$8 = theme.accent, _v$9 = TextAttributes12.BOLD;
29562
29322
  _v$8 !== _p$.e && (_p$.e = setProp(_el$14, "fg", _v$8, _p$.e));
29563
29323
  _v$9 !== _p$.t && (_p$.t = setProp(_el$14, "attributes", _v$9, _p$.t));
29564
29324
  return _p$;
@@ -29607,12 +29367,12 @@ function HelpDialog() {
29607
29367
  setProp(_el$10, "paddingTop", 1);
29608
29368
  insertNode(_el$11, createTextNode(`(Type / in the composer to filter and tab-complete; user-defined commands appear there too)`));
29609
29369
  effect((_p$) => {
29610
- var _v$ = TextAttributes14.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = {
29370
+ var _v$ = TextAttributes12.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = {
29611
29371
  trackOptions: {
29612
29372
  backgroundColor: theme.backgroundDialog,
29613
29373
  foregroundColor: theme.borderActive
29614
29374
  }
29615
- }, _v$5 = theme.accent, _v$6 = TextAttributes14.BOLD, _v$7 = theme.textMuted;
29375
+ }, _v$5 = theme.accent, _v$6 = TextAttributes12.BOLD, _v$7 = theme.textMuted;
29616
29376
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
29617
29377
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
29618
29378
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -29654,7 +29414,7 @@ var init_help_dialog = __esm(() => {
29654
29414
  });
29655
29415
 
29656
29416
  // src/tui/component/pane-header.tsx
29657
- import { TextAttributes as TextAttributes15 } from "@opentui/core";
29417
+ import { TextAttributes as TextAttributes13 } from "@opentui/core";
29658
29418
  function PaneHeader(props) {
29659
29419
  const {
29660
29420
  theme
@@ -29684,7 +29444,7 @@ function PaneHeader(props) {
29684
29444
  setProp(_el$3, "wrapMode", "none");
29685
29445
  insert(_el$3, () => props.ordinal);
29686
29446
  effect((_p$) => {
29687
- var _v$ = titleColor(), _v$2 = TextAttributes15.BOLD;
29447
+ var _v$ = titleColor(), _v$2 = TextAttributes13.BOLD;
29688
29448
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
29689
29449
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
29690
29450
  return _p$;
@@ -29735,7 +29495,7 @@ function PaneHeader(props) {
29735
29495
  }
29736
29496
  }), null);
29737
29497
  effect((_p$) => {
29738
- var _v$3 = titleColor(), _v$4 = TextAttributes15.BOLD;
29498
+ var _v$3 = titleColor(), _v$4 = TextAttributes13.BOLD;
29739
29499
  _v$3 !== _p$.e && (_p$.e = setProp(_el$4, "fg", _v$3, _p$.e));
29740
29500
  _v$4 !== _p$.t && (_p$.t = setProp(_el$4, "attributes", _v$4, _p$.t));
29741
29501
  return _p$;
@@ -29758,7 +29518,7 @@ var init_pane_header = __esm(() => {
29758
29518
  });
29759
29519
 
29760
29520
  // src/tui/component/rc-bridge-dialog.tsx
29761
- import { TextAttributes as TextAttributes16 } from "@opentui/core";
29521
+ import { TextAttributes as TextAttributes14 } from "@opentui/core";
29762
29522
  function RcBridgeDialog(props) {
29763
29523
  const dialog = useDialog();
29764
29524
  const {
@@ -29849,7 +29609,7 @@ function RcBridgeDialog(props) {
29849
29609
  setProp(_el$16, "wrapMode", "none");
29850
29610
  insert(_el$16, () => targetTask()?.worktreePath ?? "");
29851
29611
  effect((_p$) => {
29852
- var { textMuted: _v$, text: _v$2 } = theme, _v$3 = TextAttributes16.BOLD, _v$4 = theme.textMuted, _v$5 = theme.text;
29612
+ var { textMuted: _v$, text: _v$2 } = theme, _v$3 = TextAttributes14.BOLD, _v$4 = theme.textMuted, _v$5 = theme.text;
29853
29613
  _v$ !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$, _p$.e));
29854
29614
  _v$2 !== _p$.t && (_p$.t = setProp(_el$13, "fg", _v$2, _p$.t));
29855
29615
  _v$3 !== _p$.a && (_p$.a = setProp(_el$13, "attributes", _v$3, _p$.a));
@@ -29957,7 +29717,7 @@ function RcBridgeDialog(props) {
29957
29717
  insertNode(_el$36, _el$37);
29958
29718
  insert(_el$36, () => props.status().bound?.sessionId, null);
29959
29719
  effect((_p$) => {
29960
- var { textMuted: _v$8, accent: _v$9 } = theme, _v$0 = TextAttributes16.BOLD;
29720
+ var { textMuted: _v$8, accent: _v$9 } = theme, _v$0 = TextAttributes14.BOLD;
29961
29721
  _v$8 !== _p$.e && (_p$.e = setProp(_el$34, "fg", _v$8, _p$.e));
29962
29722
  _v$9 !== _p$.t && (_p$.t = setProp(_el$36, "fg", _v$9, _p$.t));
29963
29723
  _v$0 !== _p$.a && (_p$.a = setProp(_el$36, "attributes", _v$0, _p$.a));
@@ -29971,7 +29731,7 @@ function RcBridgeDialog(props) {
29971
29731
  }
29972
29732
  }), null);
29973
29733
  effect((_p$) => {
29974
- var { textMuted: _v$1, text: _v$10 } = theme, _v$11 = TextAttributes16.BOLD;
29734
+ var { textMuted: _v$1, text: _v$10 } = theme, _v$11 = TextAttributes14.BOLD;
29975
29735
  _v$1 !== _p$.e && (_p$.e = setProp(_el$30, "fg", _v$1, _p$.e));
29976
29736
  _v$10 !== _p$.t && (_p$.t = setProp(_el$32, "fg", _v$10, _p$.t));
29977
29737
  _v$11 !== _p$.a && (_p$.a = setProp(_el$32, "attributes", _v$11, _p$.a));
@@ -30011,7 +29771,7 @@ function RcBridgeDialog(props) {
30011
29771
  }
30012
29772
  }), null);
30013
29773
  effect((_p$) => {
30014
- var { textMuted: _v$14, accent: _v$15 } = theme, _v$16 = TextAttributes16.BOLD;
29774
+ var { textMuted: _v$14, accent: _v$15 } = theme, _v$16 = TextAttributes14.BOLD;
30015
29775
  _v$14 !== _p$.e && (_p$.e = setProp(_el$21, "fg", _v$14, _p$.e));
30016
29776
  _v$15 !== _p$.t && (_p$.t = setProp(_el$23, "fg", _v$15, _p$.t));
30017
29777
  _v$16 !== _p$.a && (_p$.a = setProp(_el$23, "attributes", _v$16, _p$.a));
@@ -30056,7 +29816,7 @@ function RcBridgeDialog(props) {
30056
29816
  }
30057
29817
  }), null);
30058
29818
  effect((_p$) => {
30059
- var _v$17 = theme.error, _v$18 = TextAttributes16.BOLD;
29819
+ var _v$17 = theme.error, _v$18 = TextAttributes14.BOLD;
30060
29820
  _v$17 !== _p$.e && (_p$.e = setProp(_el$45, "fg", _v$17, _p$.e));
30061
29821
  _v$18 !== _p$.t && (_p$.t = setProp(_el$45, "attributes", _v$18, _p$.t));
30062
29822
  return _p$;
@@ -30125,7 +29885,7 @@ function RcBridgeDialog(props) {
30125
29885
  }
30126
29886
  }), null);
30127
29887
  effect((_p$) => {
30128
- var _v$19 = TextAttributes16.BOLD, _v$20 = theme.text, _v$21 = theme.textMuted, _v$22 = theme.textMuted;
29888
+ var _v$19 = TextAttributes14.BOLD, _v$20 = theme.text, _v$21 = theme.textMuted, _v$22 = theme.textMuted;
30129
29889
  _v$19 !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$19, _p$.e));
30130
29890
  _v$20 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$20, _p$.t));
30131
29891
  _v$21 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$21, _p$.a));
@@ -30162,7 +29922,7 @@ function ActionButton(props) {
30162
29922
  });
30163
29923
  insert(_el$53, () => props.label);
30164
29924
  effect((_p$) => {
30165
- var _v$23 = theme.backgroundElement, _v$24 = fg(), _v$25 = TextAttributes16.BOLD;
29925
+ var _v$23 = theme.backgroundElement, _v$24 = fg(), _v$25 = TextAttributes14.BOLD;
30166
29926
  _v$23 !== _p$.e && (_p$.e = setProp(_el$52, "backgroundColor", _v$23, _p$.e));
30167
29927
  _v$24 !== _p$.t && (_p$.t = setProp(_el$53, "fg", _v$24, _p$.t));
30168
29928
  _v$25 !== _p$.a && (_p$.a = setProp(_el$53, "attributes", _v$25, _p$.a));
@@ -30362,7 +30122,7 @@ var init_focus = __esm(() => {
30362
30122
  });
30363
30123
 
30364
30124
  // src/tui/component/status-bar.tsx
30365
- import { TextAttributes as TextAttributes17 } from "@opentui/core";
30125
+ import { TextAttributes as TextAttributes15 } from "@opentui/core";
30366
30126
  function Hotkey(props) {
30367
30127
  const {
30368
30128
  theme
@@ -30381,7 +30141,7 @@ function Hotkey(props) {
30381
30141
  setProp(_el$5, "wrapMode", "none");
30382
30142
  insert(_el$5, () => props.label);
30383
30143
  effect((_p$) => {
30384
- var _v$ = theme.accent, _v$2 = TextAttributes17.BOLD, _v$3 = theme.textMuted;
30144
+ var _v$ = theme.accent, _v$2 = TextAttributes15.BOLD, _v$3 = theme.textMuted;
30385
30145
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
30386
30146
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
30387
30147
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -30394,7 +30154,7 @@ function Hotkey(props) {
30394
30154
  return _el$;
30395
30155
  })();
30396
30156
  }
30397
- function StatusBar(props = {}) {
30157
+ function StatusBar() {
30398
30158
  const {
30399
30159
  theme
30400
30160
  } = useTheme();
@@ -30449,7 +30209,6 @@ function StatusBar(props = {}) {
30449
30209
  setProp(_el$9, "flexDirection", "row");
30450
30210
  setProp(_el$9, "gap", 2);
30451
30211
  setProp(_el$9, "flexShrink", 0);
30452
- insert(_el$9, () => props.indicator, null);
30453
30212
  insert(_el$9, createComponent2(For, {
30454
30213
  each: rightHints,
30455
30214
  children: (b2) => createComponent2(Hotkey, {
@@ -30470,7 +30229,7 @@ function StatusBar(props = {}) {
30470
30229
  insertNode(_el$0, createTextNode(`Press Ctrl+C again to exit`));
30471
30230
  setProp(_el$0, "wrapMode", "none");
30472
30231
  effect((_p$) => {
30473
- var _v$4 = theme.warning, _v$5 = TextAttributes17.BOLD;
30232
+ var _v$4 = theme.warning, _v$5 = TextAttributes15.BOLD;
30474
30233
  _v$4 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$4, _p$.e));
30475
30234
  _v$5 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$5, _p$.t));
30476
30235
  return _p$;
@@ -30482,7 +30241,7 @@ function StatusBar(props = {}) {
30482
30241
  }
30483
30242
  }), null);
30484
30243
  effect((_p$) => {
30485
- var _v$6 = theme.primary, _v$7 = TextAttributes17.BOLD;
30244
+ var _v$6 = theme.primary, _v$7 = TextAttributes15.BOLD;
30486
30245
  _v$6 !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$6, _p$.e));
30487
30246
  _v$7 !== _p$.t && (_p$.t = setProp(_el$8, "attributes", _v$7, _p$.t));
30488
30247
  return _p$;
@@ -30508,7 +30267,7 @@ var init_status_bar = __esm(() => {
30508
30267
  });
30509
30268
 
30510
30269
  // src/tui/component/toast-overlay.tsx
30511
- import { TextAttributes as TextAttributes18 } from "@opentui/core";
30270
+ import { TextAttributes as TextAttributes16 } from "@opentui/core";
30512
30271
  function ToastOverlay() {
30513
30272
  const {
30514
30273
  theme
@@ -30551,7 +30310,7 @@ function ToastOverlay() {
30551
30310
  setProp(_el$4, "wrapMode", "none");
30552
30311
  insert(_el$4, () => toast.title);
30553
30312
  effect((_p$) => {
30554
- var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes18.BOLD, _v$6 = fg();
30313
+ var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes16.BOLD, _v$6 = fg();
30555
30314
  _v$3 !== _p$.e && (_p$.e = setProp(_el$2, "backgroundColor", _v$3, _p$.e));
30556
30315
  _v$4 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$4, _p$.t));
30557
30316
  _v$5 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$5, _p$.a));
@@ -30619,7 +30378,7 @@ function describePRChip(status) {
30619
30378
  }
30620
30379
 
30621
30380
  // src/tui/component/create-pr-button.tsx
30622
- import { TextAttributes as TextAttributes19 } from "@opentui/core";
30381
+ import { TextAttributes as TextAttributes17 } from "@opentui/core";
30623
30382
  function isEnabled(task) {
30624
30383
  if (!task)
30625
30384
  return false;
@@ -30694,7 +30453,7 @@ function CreatePRButton(props) {
30694
30453
  setProp(_el$3, "wrapMode", "none");
30695
30454
  insert(_el$3, () => state().label);
30696
30455
  effect((_p$) => {
30697
- var _v$ = enabled() ? onClick : undefined, _v$2 = bracketColor(), _v$3 = TextAttributes19.BOLD, _v$4 = labelColor();
30456
+ var _v$ = enabled() ? onClick : undefined, _v$2 = bracketColor(), _v$3 = TextAttributes17.BOLD, _v$4 = labelColor();
30698
30457
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "onMouseUp", _v$, _p$.e));
30699
30458
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "fg", _v$2, _p$.t));
30700
30459
  _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "attributes", _v$3, _p$.a));
@@ -30828,7 +30587,7 @@ var init_worktree_opener = __esm(() => {
30828
30587
  });
30829
30588
 
30830
30589
  // src/tui/component/open-worktree-button.tsx
30831
- import { TextAttributes as TextAttributes20 } from "@opentui/core";
30590
+ import { TextAttributes as TextAttributes18 } from "@opentui/core";
30832
30591
  function canOpen(task, opener) {
30833
30592
  return Boolean(task?.worktreePath && opener);
30834
30593
  }
@@ -30860,7 +30619,7 @@ function OpenWorktreeButton(props) {
30860
30619
  setProp(_el$4, "wrapMode", "none");
30861
30620
  insert(_el$4, label);
30862
30621
  effect((_p$) => {
30863
- var _v$ = enabled() ? onClick : undefined, _v$2 = color(), _v$3 = TextAttributes20.BOLD, _v$4 = theme.textMuted;
30622
+ var _v$ = enabled() ? onClick : undefined, _v$2 = color(), _v$3 = TextAttributes18.BOLD, _v$4 = theme.textMuted;
30864
30623
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "onMouseUp", _v$, _p$.e));
30865
30624
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "fg", _v$2, _p$.t));
30866
30625
  _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "attributes", _v$3, _p$.a));
@@ -31168,7 +30927,7 @@ var init_markdown_parser = __esm(() => {
31168
30927
  });
31169
30928
 
31170
30929
  // src/tui/panes/chat/Markdown.tsx
31171
- import { TextAttributes as TextAttributes21 } from "@opentui/core";
30930
+ import { TextAttributes as TextAttributes19 } from "@opentui/core";
31172
30931
  function InlineSpans(props) {
31173
30932
  const {
31174
30933
  theme
@@ -31198,7 +30957,7 @@ function InlineSpans(props) {
31198
30957
  insert(_el$3, () => t2.text, _el$5);
31199
30958
  effect((_$p) => setProp(_el$3, "style", {
31200
30959
  fg: theme.accent,
31201
- attributes: TextAttributes21.DIM
30960
+ attributes: TextAttributes19.DIM
31202
30961
  }, _$p));
31203
30962
  return _el$3;
31204
30963
  })();
@@ -31210,7 +30969,7 @@ function InlineSpans(props) {
31210
30969
  insert(_el$6, () => showUrl ? t2.text : t2.href);
31211
30970
  effect((_$p) => setProp(_el$6, "style", {
31212
30971
  fg: theme.accent,
31213
- attributes: TextAttributes21.UNDERLINE
30972
+ attributes: TextAttributes19.UNDERLINE
31214
30973
  }, _$p));
31215
30974
  return _el$6;
31216
30975
  })(), createComponent2(Show, {
@@ -31222,7 +30981,7 @@ function InlineSpans(props) {
31222
30981
  insert(_el$7, () => t2.href, _el$9);
31223
30982
  effect((_$p) => setProp(_el$7, "style", {
31224
30983
  fg: theme.textMuted,
31225
- attributes: TextAttributes21.DIM
30984
+ attributes: TextAttributes19.DIM
31226
30985
  }, _$p));
31227
30986
  return _el$7;
31228
30987
  }
@@ -31399,7 +31158,7 @@ function VerticalTable(props) {
31399
31158
  var _el$20 = createElement("text");
31400
31159
  insertNode(_el$20, createTextNode(`\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
31401
31160
  effect((_p$) => {
31402
- var _v$4 = theme.textMuted, _v$5 = TextAttributes21.DIM;
31161
+ var _v$4 = theme.textMuted, _v$5 = TextAttributes19.DIM;
31403
31162
  _v$4 !== _p$.e && (_p$.e = setProp(_el$20, "fg", _v$4, _p$.e));
31404
31163
  _v$5 !== _p$.t && (_p$.t = setProp(_el$20, "attributes", _v$5, _p$.t));
31405
31164
  return _p$;
@@ -31490,7 +31249,7 @@ function BlockNode(props) {
31490
31249
  })();
31491
31250
  }
31492
31251
  if (b2.kind === "heading") {
31493
- const attrs = b2.level === 1 ? TextAttributes21.BOLD | TextAttributes21.UNDERLINE : TextAttributes21.BOLD;
31252
+ const attrs = b2.level === 1 ? TextAttributes19.BOLD | TextAttributes19.UNDERLINE : TextAttributes19.BOLD;
31494
31253
  const fg = b2.level <= 2 ? theme.accent : theme.text;
31495
31254
  const tokens = parseInline(b2.text);
31496
31255
  return (() => {
@@ -31516,7 +31275,7 @@ function BlockNode(props) {
31516
31275
  const checkbox = item.checked ? "[x] " : "[ ] ";
31517
31276
  const bullet = b2.ordered ? `${b2.start + idx()}. ` : "\u2022 ";
31518
31277
  const prefix = isTask ? checkbox : bullet;
31519
- const labelAttrs = isTask && item.checked ? TextAttributes21.DIM : 0;
31278
+ const labelAttrs = isTask && item.checked ? TextAttributes19.DIM : 0;
31520
31279
  return (() => {
31521
31280
  var _el$30 = createElement("text"), _el$31 = createElement("span");
31522
31281
  insertNode(_el$30, _el$31);
@@ -31563,9 +31322,9 @@ function BlockNode(props) {
31563
31322
  }
31564
31323
  }), null);
31565
31324
  effect((_p$) => {
31566
- var _v$10 = theme.textMuted, _v$11 = TextAttributes21.ITALIC, _v$12 = {
31325
+ var _v$10 = theme.textMuted, _v$11 = TextAttributes19.ITALIC, _v$12 = {
31567
31326
  fg: theme.textMuted,
31568
- attributes: TextAttributes21.DIM
31327
+ attributes: TextAttributes19.DIM
31569
31328
  };
31570
31329
  _v$10 !== _p$.e && (_p$.e = setProp(_el$33, "fg", _v$10, _p$.e));
31571
31330
  _v$11 !== _p$.t && (_p$.t = setProp(_el$33, "attributes", _v$11, _p$.t));
@@ -31607,7 +31366,7 @@ function BlockNode(props) {
31607
31366
  var _el$37 = createElement("text");
31608
31367
  insert(_el$37, () => b2.lang);
31609
31368
  effect((_p$) => {
31610
- var _v$13 = theme.textMuted, _v$14 = TextAttributes21.DIM;
31369
+ var _v$13 = theme.textMuted, _v$14 = TextAttributes19.DIM;
31611
31370
  _v$13 !== _p$.e && (_p$.e = setProp(_el$37, "fg", _v$13, _p$.e));
31612
31371
  _v$14 !== _p$.t && (_p$.t = setProp(_el$37, "attributes", _v$14, _p$.t));
31613
31372
  return _p$;
@@ -31690,7 +31449,7 @@ function releaseDialogVersionChoices(info, releases, limit = 8) {
31690
31449
  }
31691
31450
 
31692
31451
  // src/tui/component/update-dialog.tsx
31693
- import { TextAttributes as TextAttributes22 } from "@opentui/core";
31452
+ import { TextAttributes as TextAttributes20 } from "@opentui/core";
31694
31453
  function UpdateDialog(props) {
31695
31454
  const dialog = useDialog();
31696
31455
  const {
@@ -31732,7 +31491,7 @@ function UpdateDialog(props) {
31732
31491
  var _el$41 = createElement("text");
31733
31492
  insertNode(_el$41, createTextNode(`up to date`));
31734
31493
  effect((_p$) => {
31735
- var _v$14 = theme.accent, _v$15 = TextAttributes22.BOLD;
31494
+ var _v$14 = theme.accent, _v$15 = TextAttributes20.BOLD;
31736
31495
  _v$14 !== _p$.e && (_p$.e = setProp(_el$41, "fg", _v$14, _p$.e));
31737
31496
  _v$15 !== _p$.t && (_p$.t = setProp(_el$41, "attributes", _v$15, _p$.t));
31738
31497
  return _p$;
@@ -31754,7 +31513,7 @@ function UpdateDialog(props) {
31754
31513
  insertNode(_el$1, _el$10);
31755
31514
  insert(_el$1, () => props.info.latest, null);
31756
31515
  effect((_p$) => {
31757
- var _v$ = theme.warning, _v$2 = TextAttributes22.BOLD;
31516
+ var _v$ = theme.warning, _v$2 = TextAttributes20.BOLD;
31758
31517
  _v$ !== _p$.e && (_p$.e = setProp(_el$1, "fg", _v$, _p$.e));
31759
31518
  _v$2 !== _p$.t && (_p$.t = setProp(_el$1, "attributes", _v$2, _p$.t));
31760
31519
  return _p$;
@@ -31790,7 +31549,7 @@ function UpdateDialog(props) {
31790
31549
  insertNode(_el$20, _el$21);
31791
31550
  insert(_el$20, recommendedGlobalInstallCommand, null);
31792
31551
  effect((_p$) => {
31793
- var _v$3 = theme.warning, _v$4 = TextAttributes22.BOLD, _v$5 = props.onUpdate, _v$6 = theme.textMuted, _v$7 = theme.accent, _v$8 = TextAttributes22.BOLD, _v$9 = theme.textMuted;
31552
+ var _v$3 = theme.warning, _v$4 = TextAttributes20.BOLD, _v$5 = props.onUpdate, _v$6 = theme.textMuted, _v$7 = theme.accent, _v$8 = TextAttributes20.BOLD, _v$9 = theme.textMuted;
31794
31553
  _v$3 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$3, _p$.e));
31795
31554
  _v$4 !== _p$.t && (_p$.t = setProp(_el$13, "attributes", _v$4, _p$.t));
31796
31555
  _v$5 !== _p$.a && (_p$.a = setProp(_el$13, "onMouseUp", _v$5, _p$.a));
@@ -31830,7 +31589,7 @@ function UpdateDialog(props) {
31830
31589
  setProp(_el$43, "onMouseUp", () => setSelectedVersion(version));
31831
31590
  insert(_el$43, version, null);
31832
31591
  effect((_p$) => {
31833
- var _v$16 = selected() ? theme.accent : theme.textMuted, _v$17 = selected() ? TextAttributes22.BOLD : undefined;
31592
+ var _v$16 = selected() ? theme.accent : theme.textMuted, _v$17 = selected() ? TextAttributes20.BOLD : undefined;
31834
31593
  _v$16 !== _p$.e && (_p$.e = setProp(_el$43, "fg", _v$16, _p$.e));
31835
31594
  _v$17 !== _p$.t && (_p$.t = setProp(_el$43, "attributes", _v$17, _p$.t));
31836
31595
  return _p$;
@@ -31918,7 +31677,7 @@ function UpdateDialog(props) {
31918
31677
  }
31919
31678
  }));
31920
31679
  effect((_p$) => {
31921
- var _v$0 = TextAttributes22.BOLD, _v$1 = theme.text, _v$10 = theme.textMuted, _v$11 = theme.textMuted, _v$12 = theme.textMuted, _v$13 = theme.textMuted;
31680
+ var _v$0 = TextAttributes20.BOLD, _v$1 = theme.text, _v$10 = theme.textMuted, _v$11 = theme.textMuted, _v$12 = theme.textMuted, _v$13 = theme.textMuted;
31922
31681
  _v$0 !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$0, _p$.e));
31923
31682
  _v$1 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$1, _p$.t));
31924
31683
  _v$10 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$10, _p$.a));
@@ -31961,7 +31720,7 @@ var init_update_dialog = __esm(() => {
31961
31720
 
31962
31721
  // src/tui/component/top-bar.tsx
31963
31722
  import { spawnSync as spawnSync11 } from "child_process";
31964
- import { TextAttributes as TextAttributes23 } from "@opentui/core";
31723
+ import { TextAttributes as TextAttributes21 } from "@opentui/core";
31965
31724
  function TopBar(props) {
31966
31725
  const {
31967
31726
  theme
@@ -32050,7 +31809,7 @@ function TopBar(props) {
32050
31809
  insertNode(_el$7, createTextNode(`[Update]`));
32051
31810
  setProp(_el$7, "onMouseUp", openReleaseDialog);
32052
31811
  effect((_p$) => {
32053
- var _v$ = theme.warning, _v$2 = TextAttributes23.BOLD;
31812
+ var _v$ = theme.warning, _v$2 = TextAttributes21.BOLD;
32054
31813
  _v$ !== _p$.e && (_p$.e = setProp(_el$7, "fg", _v$, _p$.e));
32055
31814
  _v$2 !== _p$.t && (_p$.t = setProp(_el$7, "attributes", _v$2, _p$.t));
32056
31815
  return _p$;
@@ -32087,7 +31846,7 @@ function TopBar(props) {
32087
31846
  return () => _c$() ? rcBridge().bound?.taskTitle ?? rcBridge().envId ?? "RC" : "RC connecting\u2026";
32088
31847
  })(), null);
32089
31848
  effect((_p$) => {
32090
- var _v$3 = theme.accent, _v$4 = TextAttributes23.BOLD;
31849
+ var _v$3 = theme.accent, _v$4 = TextAttributes21.BOLD;
32091
31850
  _v$3 !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$3, _p$.e));
32092
31851
  _v$4 !== _p$.t && (_p$.t = setProp(_el$10, "attributes", _v$4, _p$.t));
32093
31852
  return _p$;
@@ -32114,7 +31873,7 @@ function TopBar(props) {
32114
31873
  insertNode(_el$15, createTextNode(`daemon disconnected`));
32115
31874
  setProp(_el$15, "wrapMode", "none");
32116
31875
  effect((_p$) => {
32117
- var _v$8 = theme.error, _v$9 = TextAttributes23.BOLD;
31876
+ var _v$8 = theme.error, _v$9 = TextAttributes21.BOLD;
32118
31877
  _v$8 !== _p$.e && (_p$.e = setProp(_el$15, "fg", _v$8, _p$.e));
32119
31878
  _v$9 !== _p$.t && (_p$.t = setProp(_el$15, "attributes", _v$9, _p$.t));
32120
31879
  return _p$;
@@ -32144,7 +31903,7 @@ function TopBar(props) {
32144
31903
  setProp(_el$18, "wrapMode", "none");
32145
31904
  insert(_el$18, () => label().repoName);
32146
31905
  effect((_p$) => {
32147
- var _v$0 = label().branch ? theme.textMuted : theme.text, _v$1 = label().branch ? undefined : TextAttributes23.BOLD;
31906
+ var _v$0 = label().branch ? theme.textMuted : theme.text, _v$1 = label().branch ? undefined : TextAttributes21.BOLD;
32148
31907
  _v$0 !== _p$.e && (_p$.e = setProp(_el$18, "fg", _v$0, _p$.e));
32149
31908
  _v$1 !== _p$.t && (_p$.t = setProp(_el$18, "attributes", _v$1, _p$.t));
32150
31909
  return _p$;
@@ -32176,7 +31935,7 @@ function TopBar(props) {
32176
31935
  setProp(_el$21, "wrapMode", "none");
32177
31936
  insert(_el$21, () => label().branch);
32178
31937
  effect((_p$) => {
32179
- var _v$10 = theme.text, _v$11 = TextAttributes23.BOLD;
31938
+ var _v$10 = theme.text, _v$11 = TextAttributes21.BOLD;
32180
31939
  _v$10 !== _p$.e && (_p$.e = setProp(_el$21, "fg", _v$10, _p$.e));
32181
31940
  _v$11 !== _p$.t && (_p$.t = setProp(_el$21, "attributes", _v$11, _p$.t));
32182
31941
  return _p$;
@@ -32215,7 +31974,7 @@ function TopBar(props) {
32215
31974
  }
32216
31975
  }), null);
32217
31976
  effect((_p$) => {
32218
- var _v$5 = theme.primary, _v$6 = TextAttributes23.BOLD, _v$7 = theme.textMuted;
31977
+ var _v$5 = theme.primary, _v$6 = TextAttributes21.BOLD, _v$7 = theme.textMuted;
32219
31978
  _v$5 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$5, _p$.e));
32220
31979
  _v$6 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$6, _p$.t));
32221
31980
  _v$7 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$7, _p$.a));
@@ -33184,7 +32943,7 @@ var DEFAULT_BASE_REF = "main", PICKER_MAX_VISIBLE = 8;
33184
32943
  var init_state2 = () => {};
33185
32944
 
33186
32945
  // src/tui/component/new-task-dialog/dialog.tsx
33187
- import { TextAttributes as TextAttributes24 } from "@opentui/core";
32946
+ import { TextAttributes as TextAttributes22 } from "@opentui/core";
33188
32947
  function NewTaskDialogView(props) {
33189
32948
  const dialog = useDialog();
33190
32949
  const {
@@ -33572,7 +33331,7 @@ function NewTaskDialogView(props) {
33572
33331
  insert(_el$65, suffix, null);
33573
33332
  insert(_el$65, tag, null);
33574
33333
  effect((_p$) => {
33575
- var _v$27 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$28 = isCursor() ? TextAttributes24.BOLD : undefined;
33334
+ var _v$27 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$28 = isCursor() ? TextAttributes22.BOLD : undefined;
33576
33335
  _v$27 !== _p$.e && (_p$.e = setProp(_el$65, "fg", _v$27, _p$.e));
33577
33336
  _v$28 !== _p$.t && (_p$.t = setProp(_el$65, "attributes", _v$28, _p$.t));
33578
33337
  return _p$;
@@ -33686,7 +33445,7 @@ function NewTaskDialogView(props) {
33686
33445
  insert(_el$66, () => isCursor() ? "\u25B8 " : " ", null);
33687
33446
  insert(_el$66, name, null);
33688
33447
  effect((_p$) => {
33689
- var _v$29 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$30 = isCursor() ? TextAttributes24.BOLD : undefined;
33448
+ var _v$29 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$30 = isCursor() ? TextAttributes22.BOLD : undefined;
33690
33449
  _v$29 !== _p$.e && (_p$.e = setProp(_el$66, "fg", _v$29, _p$.e));
33691
33450
  _v$30 !== _p$.t && (_p$.t = setProp(_el$66, "attributes", _v$30, _p$.t));
33692
33451
  return _p$;
@@ -33818,7 +33577,7 @@ function NewTaskDialogView(props) {
33818
33577
  insert(_el$67, () => isCursor() ? "\u25B8 " : " ", _el$68);
33819
33578
  insert(_el$67, name, _el$68);
33820
33579
  effect((_p$) => {
33821
- var _v$31 = isCursor() ? theme.primary : theme.textMuted, _v$32 = isCursor() ? TextAttributes24.BOLD : undefined;
33580
+ var _v$31 = isCursor() ? theme.primary : theme.textMuted, _v$32 = isCursor() ? TextAttributes22.BOLD : undefined;
33822
33581
  _v$31 !== _p$.e && (_p$.e = setProp(_el$67, "fg", _v$31, _p$.e));
33823
33582
  _v$32 !== _p$.t && (_p$.t = setProp(_el$67, "attributes", _v$32, _p$.t));
33824
33583
  return _p$;
@@ -33926,7 +33685,7 @@ function NewTaskDialogView(props) {
33926
33685
  setProp(_el$62, "paddingBottom", 1);
33927
33686
  insertNode(_el$63, createTextNode(`\u2191\u2193 pick \xB7 enter select \xB7 tab next field \xB7 ctrl+[/] switch \xB7 esc cancel`));
33928
33687
  effect((_p$) => {
33929
- var _v$18 = TextAttributes24.BOLD, _v$19 = theme.text, _v$20 = field() === "confirm" ? theme.primary : theme.text, _v$21 = field() === "confirm" ? TextAttributes24.BOLD : undefined, _v$22 = tab() === "existing" ? theme.info : theme.textMuted, _v$23 = tab() === "existing" ? TextAttributes24.BOLD : undefined, _v$24 = tab() === "clone" ? theme.info : theme.textMuted, _v$25 = tab() === "clone" ? TextAttributes24.BOLD : undefined, _v$26 = theme.textMuted;
33688
+ var _v$18 = TextAttributes22.BOLD, _v$19 = theme.text, _v$20 = field() === "confirm" ? theme.primary : theme.text, _v$21 = field() === "confirm" ? TextAttributes22.BOLD : undefined, _v$22 = tab() === "existing" ? theme.info : theme.textMuted, _v$23 = tab() === "existing" ? TextAttributes22.BOLD : undefined, _v$24 = tab() === "clone" ? theme.info : theme.textMuted, _v$25 = tab() === "clone" ? TextAttributes22.BOLD : undefined, _v$26 = theme.textMuted;
33930
33689
  _v$18 !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$18, _p$.e));
33931
33690
  _v$19 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$19, _p$.t));
33932
33691
  _v$20 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$20, _p$.a));
@@ -34037,7 +33796,7 @@ function escapeRegExp(value) {
34037
33796
  }
34038
33797
 
34039
33798
  // src/tui/component/quick-fork-dialog/dialog.tsx
34040
- import { TextAttributes as TextAttributes25 } from "@opentui/core";
33799
+ import { TextAttributes as TextAttributes23 } from "@opentui/core";
34041
33800
  function QuickForkDialogView(props) {
34042
33801
  const dialog = useDialog();
34043
33802
  const {
@@ -34065,6 +33824,22 @@ function QuickForkDialogView(props) {
34065
33824
  const [prompt, setPrompt] = createSignal("");
34066
33825
  const [field, setField] = createSignal("prompt");
34067
33826
  const [modelStep, setModelStep] = createSignal("summary");
33827
+ const [branchStep, setBranchStep] = createSignal("summary");
33828
+ const [baseRef, setBaseRef] = createSignal(props.baseRef);
33829
+ const [baseRefTouched, setBaseRefTouched] = createSignal(false);
33830
+ const branches = createMemo(() => listLocalBranches(props.repo));
33831
+ const branchFiltered = createMemo(() => filterBranches(branches(), baseRef()));
33832
+ const [branchCursor, setBranchCursor] = createSignal(0);
33833
+ const branchWindow = createMemo(() => windowAround(branchFiltered(), branchCursor()));
33834
+ createEffect(() => {
33835
+ const list = branchFiltered();
33836
+ if (baseRefTouched()) {
33837
+ setBranchCursor(0);
33838
+ return;
33839
+ }
33840
+ const idx = list.findIndex((b2) => b2 === props.baseRef);
33841
+ setBranchCursor(idx >= 0 ? idx : 0);
33842
+ });
34068
33843
  const modelSummary = createMemo(() => {
34069
33844
  const m2 = cursorModel();
34070
33845
  if (!m2)
@@ -34080,25 +33855,36 @@ function QuickForkDialogView(props) {
34080
33855
  if (!m2)
34081
33856
  return;
34082
33857
  const effort = effortOptions()[effortCursor()]?.effort;
33858
+ const finalBaseRef = resolveBaseRef(baseRef(), branchFiltered(), branchCursor());
34083
33859
  props.onSubmit({
34084
33860
  prompt: text,
34085
33861
  modelId: m2.id,
34086
33862
  effort,
34087
- vendor: m2.vendor
33863
+ vendor: m2.vendor,
33864
+ baseRef: finalBaseRef
34088
33865
  });
34089
33866
  dialog.clear();
34090
33867
  }
34091
33868
  function focusPrompt() {
34092
33869
  setField("prompt");
34093
33870
  setModelStep("summary");
33871
+ setBranchStep("summary");
34094
33872
  }
34095
33873
  function focusModel() {
34096
33874
  setField("model");
34097
33875
  setModelStep("summary");
33876
+ setBranchStep("summary");
33877
+ }
33878
+ function focusBranch() {
33879
+ setField("branch");
33880
+ setModelStep("summary");
33881
+ setBranchStep("summary");
34098
33882
  }
34099
33883
  function switchField() {
34100
33884
  if (field() === "prompt")
34101
33885
  focusModel();
33886
+ else if (field() === "model")
33887
+ focusBranch();
34102
33888
  else
34103
33889
  focusPrompt();
34104
33890
  }
@@ -34111,10 +33897,19 @@ function QuickForkDialogView(props) {
34111
33897
  if (hasEffortChoice()) {
34112
33898
  setModelStep("effort-pick");
34113
33899
  } else {
34114
- focusPrompt();
33900
+ focusBranch();
34115
33901
  }
34116
33902
  return;
34117
33903
  }
33904
+ focusBranch();
33905
+ }
33906
+ function branchTabAdvance() {
33907
+ if (branchStep() === "summary") {
33908
+ setBranchStep("branch-pick");
33909
+ return;
33910
+ }
33911
+ setBaseRef(resolveBaseRef(baseRef(), branchFiltered(), branchCursor()));
33912
+ setBaseRefTouched(true);
34118
33913
  focusPrompt();
34119
33914
  }
34120
33915
  useBindings(() => ({
@@ -34197,18 +33992,46 @@ function QuickForkDialogView(props) {
34197
33992
  }
34198
33993
  }]
34199
33994
  }));
33995
+ useBindings(() => ({
33996
+ enabled: field() === "branch",
33997
+ bindings: [{
33998
+ key: "return",
33999
+ cmd: branchTabAdvance
34000
+ }, {
34001
+ key: "up",
34002
+ cmd: () => {
34003
+ if (branchStep() !== "branch-pick")
34004
+ return;
34005
+ const n2 = branchFiltered().length;
34006
+ if (!n2)
34007
+ return;
34008
+ setBranchCursor(clampCursor(branchCursor() - 1, n2));
34009
+ }
34010
+ }, {
34011
+ key: "down",
34012
+ cmd: () => {
34013
+ if (branchStep() !== "branch-pick")
34014
+ return;
34015
+ const n2 = branchFiltered().length;
34016
+ if (!n2)
34017
+ return;
34018
+ setBranchCursor(clampCursor(branchCursor() + 1, n2));
34019
+ }
34020
+ }]
34021
+ }));
34200
34022
  const repoLabel = () => {
34201
34023
  const trimmed = props.repo.replace(/\/+$/, "");
34202
34024
  const last = trimmed.split("/").filter(Boolean).pop();
34203
34025
  return last ?? props.repo;
34204
34026
  };
34205
34027
  return (() => {
34206
- 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("text"), _el$1 = createElement("text"), _el$10 = createTextNode(`(`), _el$11 = createTextNode(`)`), _el$12 = createElement("box"), _el$28 = createElement("box"), _el$29 = createElement("text"), _el$31 = createElement("input"), _el$32 = createElement("box"), _el$33 = createElement("text");
34028
+ 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$9 = createElement("text"), _el$1 = createElement("text"), _el$10 = createElement("box"), _el$26 = createElement("box"), _el$44 = createElement("box"), _el$45 = createElement("text"), _el$47 = createElement("input"), _el$48 = createElement("box"), _el$49 = createElement("text");
34207
34029
  insertNode(_el$, _el$2);
34208
34030
  insertNode(_el$, _el$7);
34209
- insertNode(_el$, _el$12);
34210
- insertNode(_el$, _el$28);
34211
- insertNode(_el$, _el$32);
34031
+ insertNode(_el$, _el$10);
34032
+ insertNode(_el$, _el$26);
34033
+ insertNode(_el$, _el$44);
34034
+ insertNode(_el$, _el$48);
34212
34035
  setProp(_el$, "paddingLeft", 2);
34213
34036
  setProp(_el$, "paddingRight", 2);
34214
34037
  setProp(_el$, "gap", 1);
@@ -34220,70 +34043,68 @@ function QuickForkDialogView(props) {
34220
34043
  insertNode(_el$5, createTextNode(`esc`));
34221
34044
  setProp(_el$5, "onMouseUp", () => props.onCancel());
34222
34045
  insertNode(_el$7, _el$8);
34223
- insertNode(_el$7, _el$0);
34046
+ insertNode(_el$7, _el$9);
34224
34047
  insertNode(_el$7, _el$1);
34225
34048
  setProp(_el$7, "flexDirection", "row");
34226
34049
  setProp(_el$7, "gap", 1);
34227
- insertNode(_el$8, createTextNode(`Forking from`));
34228
34050
  setProp(_el$8, "wrapMode", "none");
34229
- setProp(_el$0, "wrapMode", "none");
34230
- insert(_el$0, repoLabel);
34231
- insertNode(_el$1, _el$10);
34232
- insertNode(_el$1, _el$11);
34051
+ insert(_el$8, repoLabel);
34052
+ insertNode(_el$9, createTextNode(`>`));
34053
+ setProp(_el$9, "wrapMode", "none");
34233
34054
  setProp(_el$1, "wrapMode", "none");
34234
- insert(_el$1, () => props.baseRef, _el$11);
34235
- setProp(_el$12, "flexDirection", "column");
34236
- insert(_el$12, createComponent2(Show, {
34055
+ insert(_el$1, () => baseRef() || props.baseRef || DEFAULT_BASE_REF);
34056
+ setProp(_el$10, "flexDirection", "column");
34057
+ insert(_el$10, createComponent2(Show, {
34237
34058
  get when() {
34238
34059
  return modelStep() === "summary";
34239
34060
  },
34240
34061
  get children() {
34241
- var _el$13 = createElement("box"), _el$14 = createElement("text"), _el$16 = createElement("text");
34242
- insertNode(_el$13, _el$14);
34243
- insertNode(_el$13, _el$16);
34244
- setProp(_el$13, "flexDirection", "row");
34245
- setProp(_el$13, "gap", 1);
34246
- insertNode(_el$14, createTextNode(`model:`));
34062
+ var _el$11 = createElement("box"), _el$12 = createElement("text"), _el$14 = createElement("text");
34063
+ insertNode(_el$11, _el$12);
34064
+ insertNode(_el$11, _el$14);
34065
+ setProp(_el$11, "flexDirection", "row");
34066
+ setProp(_el$11, "gap", 1);
34067
+ insertNode(_el$12, createTextNode(`model:`));
34068
+ setProp(_el$12, "wrapMode", "none");
34247
34069
  setProp(_el$14, "wrapMode", "none");
34248
- setProp(_el$16, "wrapMode", "none");
34249
- insert(_el$16, modelSummary);
34070
+ insert(_el$14, modelSummary);
34250
34071
  effect((_p$) => {
34251
- var _v$ = field() === "model" ? theme.accent : theme.textMuted, _v$2 = field() === "model" ? TextAttributes25.BOLD : undefined, _v$3 = theme.text;
34252
- _v$ !== _p$.e && (_p$.e = setProp(_el$14, "fg", _v$, _p$.e));
34253
- _v$2 !== _p$.t && (_p$.t = setProp(_el$14, "attributes", _v$2, _p$.t));
34254
- _v$3 !== _p$.a && (_p$.a = setProp(_el$16, "fg", _v$3, _p$.a));
34072
+ var _v$ = field() === "model" ? theme.accent : theme.textMuted, _v$2 = field() === "model" ? TextAttributes23.BOLD : undefined, _v$3 = theme.text;
34073
+ _v$ !== _p$.e && (_p$.e = setProp(_el$12, "fg", _v$, _p$.e));
34074
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$12, "attributes", _v$2, _p$.t));
34075
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$14, "fg", _v$3, _p$.a));
34255
34076
  return _p$;
34256
34077
  }, {
34257
34078
  e: undefined,
34258
34079
  t: undefined,
34259
34080
  a: undefined
34260
34081
  });
34261
- return _el$13;
34082
+ return _el$11;
34262
34083
  }
34263
34084
  }), null);
34264
- insert(_el$12, createComponent2(Show, {
34085
+ insert(_el$10, createComponent2(Show, {
34265
34086
  get when() {
34266
34087
  return modelStep() === "model-pick";
34267
34088
  },
34268
34089
  get children() {
34269
34090
  return [(() => {
34270
- var _el$17 = createElement("text");
34271
- insertNode(_el$17, createTextNode(`model`));
34091
+ var _el$15 = createElement("text");
34092
+ insertNode(_el$15, createTextNode(`model`));
34272
34093
  effect((_p$) => {
34273
- var _v$4 = theme.accent, _v$5 = TextAttributes25.BOLD;
34274
- _v$4 !== _p$.e && (_p$.e = setProp(_el$17, "fg", _v$4, _p$.e));
34275
- _v$5 !== _p$.t && (_p$.t = setProp(_el$17, "attributes", _v$5, _p$.t));
34094
+ var _v$4 = theme.accent, _v$5 = TextAttributes23.BOLD;
34095
+ _v$4 !== _p$.e && (_p$.e = setProp(_el$15, "fg", _v$4, _p$.e));
34096
+ _v$5 !== _p$.t && (_p$.t = setProp(_el$15, "attributes", _v$5, _p$.t));
34276
34097
  return _p$;
34277
34098
  }, {
34278
34099
  e: undefined,
34279
34100
  t: undefined
34280
34101
  });
34281
- return _el$17;
34102
+ return _el$15;
34282
34103
  })(), (() => {
34283
- var _el$19 = createElement("box");
34284
- setProp(_el$19, "flexDirection", "column");
34285
- setProp(_el$19, "paddingLeft", 2);
34286
- insert(_el$19, createComponent2(For, {
34104
+ var _el$17 = createElement("box");
34105
+ setProp(_el$17, "flexDirection", "column");
34106
+ setProp(_el$17, "paddingLeft", 2);
34107
+ insert(_el$17, createComponent2(For, {
34287
34108
  get each() {
34288
34109
  return models();
34289
34110
  },
@@ -34291,47 +34112,47 @@ function QuickForkDialogView(props) {
34291
34112
  const active = () => i2() === modelCursor();
34292
34113
  const hasEfforts = () => modelPickerEffortOptions(model).some((c2) => c2.effort !== undefined);
34293
34114
  return (() => {
34294
- var _el$34 = createElement("box"), _el$35 = createElement("text"), _el$36 = createElement("text");
34295
- insertNode(_el$34, _el$35);
34296
- insertNode(_el$34, _el$36);
34297
- setProp(_el$34, "flexDirection", "row");
34298
- setProp(_el$34, "gap", 2);
34299
- setProp(_el$34, "paddingLeft", 1);
34300
- setProp(_el$34, "paddingRight", 1);
34301
- setProp(_el$34, "onMouseUp", () => {
34115
+ var _el$50 = createElement("box"), _el$51 = createElement("text"), _el$52 = createElement("text");
34116
+ insertNode(_el$50, _el$51);
34117
+ insertNode(_el$50, _el$52);
34118
+ setProp(_el$50, "flexDirection", "row");
34119
+ setProp(_el$50, "gap", 2);
34120
+ setProp(_el$50, "paddingLeft", 1);
34121
+ setProp(_el$50, "paddingRight", 1);
34122
+ setProp(_el$50, "onMouseUp", () => {
34302
34123
  setModelCursor(i2());
34303
34124
  });
34304
- setProp(_el$35, "wrapMode", "none");
34305
- insert(_el$35, () => active() ? "\u25B8 " : " ", null);
34306
- insert(_el$35, () => model.label, null);
34307
- setProp(_el$36, "wrapMode", "none");
34308
- insert(_el$36, () => model.vendor);
34309
- insert(_el$34, (() => {
34125
+ setProp(_el$51, "wrapMode", "none");
34126
+ insert(_el$51, () => active() ? "\u25B8 " : " ", null);
34127
+ insert(_el$51, () => model.label, null);
34128
+ setProp(_el$52, "wrapMode", "none");
34129
+ insert(_el$52, () => model.vendor);
34130
+ insert(_el$50, (() => {
34310
34131
  var _c$2 = memo2(() => !!hasEfforts());
34311
34132
  return () => _c$2() ? (() => {
34312
- var _el$37 = createElement("text");
34313
- insertNode(_el$37, createTextNode(`effort\u2026`));
34314
- setProp(_el$37, "wrapMode", "none");
34315
- effect((_$p) => setProp(_el$37, "fg", active() ? theme.selectedListItemText : theme.textMuted, _$p));
34316
- return _el$37;
34133
+ var _el$53 = createElement("text");
34134
+ insertNode(_el$53, createTextNode(`effort\u2026`));
34135
+ setProp(_el$53, "wrapMode", "none");
34136
+ effect((_$p) => setProp(_el$53, "fg", active() ? theme.selectedListItemText : theme.textMuted, _$p));
34137
+ return _el$53;
34317
34138
  })() : null;
34318
34139
  })(), null);
34319
- insert(_el$34, (() => {
34140
+ insert(_el$50, (() => {
34320
34141
  var _c$3 = memo2(() => !!model.hint);
34321
34142
  return () => _c$3() ? (() => {
34322
- var _el$39 = createElement("text");
34323
- setProp(_el$39, "wrapMode", "none");
34324
- insert(_el$39, () => model.hint);
34325
- effect((_$p) => setProp(_el$39, "fg", active() ? theme.selectedListItemText : theme.textMuted, _$p));
34326
- return _el$39;
34143
+ var _el$55 = createElement("text");
34144
+ setProp(_el$55, "wrapMode", "none");
34145
+ insert(_el$55, () => model.hint);
34146
+ effect((_$p) => setProp(_el$55, "fg", active() ? theme.selectedListItemText : theme.textMuted, _$p));
34147
+ return _el$55;
34327
34148
  })() : null;
34328
34149
  })(), null);
34329
34150
  effect((_p$) => {
34330
- var _v$20 = active() ? theme.primary : undefined, _v$21 = active() ? theme.selectedListItemText : theme.text, _v$22 = active() ? TextAttributes25.BOLD : undefined, _v$23 = active() ? theme.selectedListItemText : theme.textMuted;
34331
- _v$20 !== _p$.e && (_p$.e = setProp(_el$34, "backgroundColor", _v$20, _p$.e));
34332
- _v$21 !== _p$.t && (_p$.t = setProp(_el$35, "fg", _v$21, _p$.t));
34333
- _v$22 !== _p$.a && (_p$.a = setProp(_el$35, "attributes", _v$22, _p$.a));
34334
- _v$23 !== _p$.o && (_p$.o = setProp(_el$36, "fg", _v$23, _p$.o));
34151
+ var _v$28 = active() ? theme.primary : undefined, _v$29 = active() ? theme.selectedListItemText : theme.text, _v$30 = active() ? TextAttributes23.BOLD : undefined, _v$31 = active() ? theme.selectedListItemText : theme.textMuted;
34152
+ _v$28 !== _p$.e && (_p$.e = setProp(_el$50, "backgroundColor", _v$28, _p$.e));
34153
+ _v$29 !== _p$.t && (_p$.t = setProp(_el$51, "fg", _v$29, _p$.t));
34154
+ _v$30 !== _p$.a && (_p$.a = setProp(_el$51, "attributes", _v$30, _p$.a));
34155
+ _v$31 !== _p$.o && (_p$.o = setProp(_el$52, "fg", _v$31, _p$.o));
34335
34156
  return _p$;
34336
34157
  }, {
34337
34158
  e: undefined,
@@ -34339,85 +34160,85 @@ function QuickForkDialogView(props) {
34339
34160
  a: undefined,
34340
34161
  o: undefined
34341
34162
  });
34342
- return _el$34;
34163
+ return _el$50;
34343
34164
  })();
34344
34165
  }
34345
34166
  }));
34346
- return _el$19;
34167
+ return _el$17;
34347
34168
  })()];
34348
34169
  }
34349
34170
  }), null);
34350
- insert(_el$12, createComponent2(Show, {
34171
+ insert(_el$10, createComponent2(Show, {
34351
34172
  get when() {
34352
34173
  return modelStep() === "effort-pick";
34353
34174
  },
34354
34175
  get children() {
34355
- var _el$20 = createElement("box"), _el$21 = createElement("box"), _el$22 = createElement("text"), _el$24 = createElement("text"), _el$25 = createElement("text"), _el$27 = createElement("box");
34356
- insertNode(_el$20, _el$21);
34357
- insertNode(_el$20, _el$25);
34358
- insertNode(_el$20, _el$27);
34359
- setProp(_el$20, "flexDirection", "column");
34360
- insertNode(_el$21, _el$22);
34361
- insertNode(_el$21, _el$24);
34362
- setProp(_el$21, "flexDirection", "row");
34363
- setProp(_el$21, "gap", 1);
34364
- insertNode(_el$22, createTextNode(`model:`));
34176
+ var _el$18 = createElement("box"), _el$19 = createElement("box"), _el$20 = createElement("text"), _el$22 = createElement("text"), _el$23 = createElement("text"), _el$25 = createElement("box");
34177
+ insertNode(_el$18, _el$19);
34178
+ insertNode(_el$18, _el$23);
34179
+ insertNode(_el$18, _el$25);
34180
+ setProp(_el$18, "flexDirection", "column");
34181
+ insertNode(_el$19, _el$20);
34182
+ insertNode(_el$19, _el$22);
34183
+ setProp(_el$19, "flexDirection", "row");
34184
+ setProp(_el$19, "gap", 1);
34185
+ insertNode(_el$20, createTextNode(`model:`));
34186
+ setProp(_el$20, "wrapMode", "none");
34365
34187
  setProp(_el$22, "wrapMode", "none");
34366
- setProp(_el$24, "wrapMode", "none");
34367
- insert(_el$24, () => cursorModel()?.label);
34368
- insertNode(_el$25, createTextNode(`effort`));
34369
- setProp(_el$27, "flexDirection", "column");
34370
- setProp(_el$27, "paddingLeft", 2);
34371
- insert(_el$27, createComponent2(For, {
34188
+ insert(_el$22, () => cursorModel()?.label);
34189
+ insertNode(_el$23, createTextNode(`effort`));
34190
+ setProp(_el$25, "flexDirection", "column");
34191
+ setProp(_el$25, "paddingLeft", 2);
34192
+ insert(_el$25, createComponent2(For, {
34372
34193
  get each() {
34373
34194
  return effortOptions();
34374
34195
  },
34375
34196
  children: (choice, i2) => {
34376
34197
  const active = () => i2() === effortCursor();
34377
34198
  return (() => {
34378
- var _el$40 = createElement("box"), _el$41 = createElement("text");
34379
- insertNode(_el$40, _el$41);
34380
- setProp(_el$40, "flexDirection", "row");
34381
- setProp(_el$40, "gap", 2);
34382
- setProp(_el$40, "paddingLeft", 1);
34383
- setProp(_el$40, "paddingRight", 1);
34384
- setProp(_el$40, "onMouseUp", () => {
34199
+ var _el$56 = createElement("box"), _el$57 = createElement("text");
34200
+ insertNode(_el$56, _el$57);
34201
+ setProp(_el$56, "flexDirection", "row");
34202
+ setProp(_el$56, "gap", 2);
34203
+ setProp(_el$56, "paddingLeft", 1);
34204
+ setProp(_el$56, "paddingRight", 1);
34205
+ setProp(_el$56, "onMouseUp", () => {
34385
34206
  setEffortCursor(i2());
34386
34207
  });
34387
- setProp(_el$41, "wrapMode", "none");
34388
- insert(_el$41, () => active() ? "\u25B8 " : " ", null);
34389
- insert(_el$41, () => choice.label, null);
34390
- insert(_el$40, (() => {
34208
+ setProp(_el$57, "wrapMode", "none");
34209
+ insert(_el$57, () => active() ? "\u25B8 " : " ", null);
34210
+ insert(_el$57, () => choice.label, null);
34211
+ insert(_el$56, (() => {
34391
34212
  var _c$4 = memo2(() => !!choice.hint);
34392
34213
  return () => _c$4() ? (() => {
34393
- var _el$42 = createElement("text");
34394
- setProp(_el$42, "wrapMode", "none");
34395
- insert(_el$42, () => choice.hint);
34396
- effect((_$p) => setProp(_el$42, "fg", active() ? theme.selectedListItemText : theme.textMuted, _$p));
34397
- return _el$42;
34214
+ var _el$58 = createElement("text");
34215
+ setProp(_el$58, "wrapMode", "none");
34216
+ insert(_el$58, () => choice.hint);
34217
+ effect((_$p) => setProp(_el$58, "fg", active() ? theme.selectedListItemText : theme.textMuted, _$p));
34218
+ return _el$58;
34398
34219
  })() : null;
34399
34220
  })(), null);
34400
34221
  effect((_p$) => {
34401
- var _v$24 = active() ? theme.primary : undefined, _v$25 = active() ? theme.selectedListItemText : theme.text, _v$26 = active() ? TextAttributes25.BOLD : undefined;
34402
- _v$24 !== _p$.e && (_p$.e = setProp(_el$40, "backgroundColor", _v$24, _p$.e));
34403
- _v$25 !== _p$.t && (_p$.t = setProp(_el$41, "fg", _v$25, _p$.t));
34404
- _v$26 !== _p$.a && (_p$.a = setProp(_el$41, "attributes", _v$26, _p$.a));
34222
+ var _v$32 = active() ? theme.primary : undefined, _v$33 = active() ? theme.selectedListItemText : theme.text, _v$34 = active() ? TextAttributes23.BOLD : undefined;
34223
+ _v$32 !== _p$.e && (_p$.e = setProp(_el$56, "backgroundColor", _v$32, _p$.e));
34224
+ _v$33 !== _p$.t && (_p$.t = setProp(_el$57, "fg", _v$33, _p$.t));
34225
+ _v$34 !== _p$.a && (_p$.a = setProp(_el$57, "attributes", _v$34, _p$.a));
34405
34226
  return _p$;
34406
34227
  }, {
34407
34228
  e: undefined,
34408
34229
  t: undefined,
34409
34230
  a: undefined
34410
34231
  });
34411
- return _el$40;
34232
+ return _el$56;
34412
34233
  })();
34413
34234
  }
34414
34235
  }));
34415
34236
  effect((_p$) => {
34416
- var { textMuted: _v$6, text: _v$7, accent: _v$8 } = theme, _v$9 = TextAttributes25.BOLD;
34417
- _v$6 !== _p$.e && (_p$.e = setProp(_el$22, "fg", _v$6, _p$.e));
34418
- _v$7 !== _p$.t && (_p$.t = setProp(_el$24, "fg", _v$7, _p$.t));
34419
- _v$8 !== _p$.a && (_p$.a = setProp(_el$25, "fg", _v$8, _p$.a));
34420
- _v$9 !== _p$.o && (_p$.o = setProp(_el$25, "attributes", _v$9, _p$.o));
34237
+ var { textMuted: _v$6, text: _v$7, accent: _v$8 } = theme, _v$9 = TextAttributes23.BOLD;
34238
+ _v$6 !== _p$.e && (_p$.e = setProp(_el$20, "fg", _v$6, _p$.e));
34239
+ _v$7 !== _p$.t && (_p$.t = setProp(_el$22, "fg", _v$7, _p$.t));
34240
+ _v$8 !== _p$.a && (_p$.a = setProp(_el$23, "fg", _v$8, _p$.a));
34241
+ _v$9 !== _p$.o && (_p$.o = setProp(_el$23, "attributes", _v$9, _p$.o));
34421
34242
  return _p$;
34422
34243
  }, {
34423
34244
  e: undefined,
@@ -34425,36 +34246,184 @@ function QuickForkDialogView(props) {
34425
34246
  a: undefined,
34426
34247
  o: undefined
34427
34248
  });
34428
- return _el$20;
34249
+ return _el$18;
34429
34250
  }
34430
34251
  }), null);
34431
- insertNode(_el$28, _el$29);
34432
- insertNode(_el$28, _el$31);
34433
- setProp(_el$28, "gap", 0);
34434
- insertNode(_el$29, createTextNode(`prompt`));
34435
- setProp(_el$31, "placeholder", "describe what the new task should do\u2026");
34436
- setProp(_el$31, "onInput", (v2) => setPrompt(stripNewlines(v2)));
34437
- setProp(_el$31, "onSubmit", () => commit());
34438
- insertNode(_el$32, _el$33);
34439
- setProp(_el$32, "paddingBottom", 1);
34440
- insert(_el$33, (() => {
34252
+ setProp(_el$26, "flexDirection", "column");
34253
+ insert(_el$26, createComponent2(Show, {
34254
+ get when() {
34255
+ return branchStep() === "summary";
34256
+ },
34257
+ get children() {
34258
+ var _el$27 = createElement("box"), _el$28 = createElement("text"), _el$30 = createElement("text");
34259
+ insertNode(_el$27, _el$28);
34260
+ insertNode(_el$27, _el$30);
34261
+ setProp(_el$27, "flexDirection", "row");
34262
+ setProp(_el$27, "gap", 1);
34263
+ insertNode(_el$28, createTextNode(`branch:`));
34264
+ setProp(_el$28, "wrapMode", "none");
34265
+ setProp(_el$30, "wrapMode", "none");
34266
+ insert(_el$30, () => baseRef() || props.baseRef || DEFAULT_BASE_REF);
34267
+ effect((_p$) => {
34268
+ var _v$0 = field() === "branch" ? theme.accent : theme.textMuted, _v$1 = field() === "branch" ? TextAttributes23.BOLD : undefined, _v$10 = theme.text;
34269
+ _v$0 !== _p$.e && (_p$.e = setProp(_el$28, "fg", _v$0, _p$.e));
34270
+ _v$1 !== _p$.t && (_p$.t = setProp(_el$28, "attributes", _v$1, _p$.t));
34271
+ _v$10 !== _p$.a && (_p$.a = setProp(_el$30, "fg", _v$10, _p$.a));
34272
+ return _p$;
34273
+ }, {
34274
+ e: undefined,
34275
+ t: undefined,
34276
+ a: undefined
34277
+ });
34278
+ return _el$27;
34279
+ }
34280
+ }), null);
34281
+ insert(_el$26, createComponent2(Show, {
34282
+ get when() {
34283
+ return branchStep() === "branch-pick";
34284
+ },
34285
+ get children() {
34286
+ var _el$31 = createElement("box"), _el$32 = createElement("text"), _el$34 = createElement("input");
34287
+ insertNode(_el$31, _el$32);
34288
+ insertNode(_el$31, _el$34);
34289
+ setProp(_el$31, "gap", 0);
34290
+ insertNode(_el$32, createTextNode(`branch`));
34291
+ setProp(_el$34, "onInput", (v2) => {
34292
+ setBaseRefTouched(true);
34293
+ setBaseRef(stripNewlines(v2));
34294
+ });
34295
+ setProp(_el$34, "onSubmit", () => branchTabAdvance());
34296
+ insert(_el$31, createComponent2(Show, {
34297
+ get when() {
34298
+ return branchFiltered().length === 0;
34299
+ },
34300
+ get children() {
34301
+ var _el$35 = createElement("box"), _el$36 = createElement("text");
34302
+ insertNode(_el$35, _el$36);
34303
+ setProp(_el$35, "gap", 0);
34304
+ setProp(_el$35, "paddingLeft", 2);
34305
+ setProp(_el$36, "wrapMode", "none");
34306
+ insert(_el$36, () => branches().length === 0 ? "(no local branches \u2014 typed text will be used as ref)" : "(no match \u2014 typed text will be used as ref)");
34307
+ effect((_$p) => setProp(_el$36, "fg", theme.textMuted, _$p));
34308
+ return _el$35;
34309
+ }
34310
+ }), null);
34311
+ insert(_el$31, createComponent2(Show, {
34312
+ get when() {
34313
+ return branchFiltered().length > 0;
34314
+ },
34315
+ get children() {
34316
+ var _el$37 = createElement("box");
34317
+ setProp(_el$37, "gap", 0);
34318
+ setProp(_el$37, "paddingLeft", 2);
34319
+ insert(_el$37, createComponent2(Show, {
34320
+ get when() {
34321
+ return branchWindow().start > 0;
34322
+ },
34323
+ get children() {
34324
+ var _el$38 = createElement("text"), _el$39 = createTextNode(`\u2191 `), _el$40 = createTextNode(` more`);
34325
+ insertNode(_el$38, _el$39);
34326
+ insertNode(_el$38, _el$40);
34327
+ setProp(_el$38, "wrapMode", "none");
34328
+ insert(_el$38, () => branchWindow().start, _el$40);
34329
+ effect((_$p) => setProp(_el$38, "fg", theme.textMuted, _$p));
34330
+ return _el$38;
34331
+ }
34332
+ }), null);
34333
+ insert(_el$37, createComponent2(For, {
34334
+ get each() {
34335
+ return branchWindow().items;
34336
+ },
34337
+ children: (name, i2) => {
34338
+ const absoluteIndex = () => branchWindow().start + i2();
34339
+ const isCursor = () => absoluteIndex() === branchCursor();
34340
+ const isSelected = () => baseRef().trim() === name;
34341
+ return (() => {
34342
+ var _el$59 = createElement("text");
34343
+ setProp(_el$59, "wrapMode", "none");
34344
+ setProp(_el$59, "onMouseUp", () => {
34345
+ setBaseRef(name);
34346
+ setBaseRefTouched(true);
34347
+ setBranchCursor(absoluteIndex());
34348
+ focusPrompt();
34349
+ });
34350
+ insert(_el$59, () => isCursor() ? "\u25B8 " : " ", null);
34351
+ insert(_el$59, name, null);
34352
+ effect((_p$) => {
34353
+ var _v$35 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$36 = isCursor() ? TextAttributes23.BOLD : undefined;
34354
+ _v$35 !== _p$.e && (_p$.e = setProp(_el$59, "fg", _v$35, _p$.e));
34355
+ _v$36 !== _p$.t && (_p$.t = setProp(_el$59, "attributes", _v$36, _p$.t));
34356
+ return _p$;
34357
+ }, {
34358
+ e: undefined,
34359
+ t: undefined
34360
+ });
34361
+ return _el$59;
34362
+ })();
34363
+ }
34364
+ }), null);
34365
+ insert(_el$37, createComponent2(Show, {
34366
+ get when() {
34367
+ return branchWindow().start + branchWindow().items.length < branchWindow().total;
34368
+ },
34369
+ get children() {
34370
+ var _el$41 = createElement("text"), _el$42 = createTextNode(`\u2193 `), _el$43 = createTextNode(` more`);
34371
+ insertNode(_el$41, _el$42);
34372
+ insertNode(_el$41, _el$43);
34373
+ setProp(_el$41, "wrapMode", "none");
34374
+ insert(_el$41, () => branchWindow().total - branchWindow().start - branchWindow().items.length, _el$43);
34375
+ effect((_$p) => setProp(_el$41, "fg", theme.textMuted, _$p));
34376
+ return _el$41;
34377
+ }
34378
+ }), null);
34379
+ return _el$37;
34380
+ }
34381
+ }), null);
34382
+ effect((_p$) => {
34383
+ var _v$11 = theme.accent, _v$12 = TextAttributes23.BOLD, _v$13 = baseRef(), _v$14 = props.baseRef || DEFAULT_BASE_REF, _v$15 = field() === "branch" && branchStep() === "branch-pick";
34384
+ _v$11 !== _p$.e && (_p$.e = setProp(_el$32, "fg", _v$11, _p$.e));
34385
+ _v$12 !== _p$.t && (_p$.t = setProp(_el$32, "attributes", _v$12, _p$.t));
34386
+ _v$13 !== _p$.a && (_p$.a = setProp(_el$34, "value", _v$13, _p$.a));
34387
+ _v$14 !== _p$.o && (_p$.o = setProp(_el$34, "placeholder", _v$14, _p$.o));
34388
+ _v$15 !== _p$.i && (_p$.i = setProp(_el$34, "focused", _v$15, _p$.i));
34389
+ return _p$;
34390
+ }, {
34391
+ e: undefined,
34392
+ t: undefined,
34393
+ a: undefined,
34394
+ o: undefined,
34395
+ i: undefined
34396
+ });
34397
+ return _el$31;
34398
+ }
34399
+ }), null);
34400
+ insertNode(_el$44, _el$45);
34401
+ insertNode(_el$44, _el$47);
34402
+ setProp(_el$44, "gap", 0);
34403
+ insertNode(_el$45, createTextNode(`prompt`));
34404
+ setProp(_el$47, "placeholder", "describe what the new task should do\u2026");
34405
+ setProp(_el$47, "onInput", (v2) => setPrompt(stripNewlines(v2)));
34406
+ setProp(_el$47, "onSubmit", () => commit());
34407
+ insertNode(_el$48, _el$49);
34408
+ setProp(_el$48, "paddingBottom", 1);
34409
+ insert(_el$49, (() => {
34441
34410
  var _c$ = memo2(() => field() === "prompt");
34442
- return () => _c$() ? "tab model \xB7 enter create \xB7 esc cancel" : memo2(() => modelStep() === "summary")() ? "enter pick \xB7 tab prompt \xB7 esc cancel" : memo2(() => modelStep() === "model-pick")() ? `\u2191\u2193 pick \xB7 enter ${hasEffortChoice() ? "effort" : "done"} \xB7 esc cancel` : "\u2191\u2193 pick \xB7 enter done \xB7 h back \xB7 esc cancel";
34411
+ return () => _c$() ? "tab model \xB7 enter create \xB7 esc cancel" : memo2(() => field() === "branch")() ? branchStep() === "summary" ? "enter pick \xB7 tab prompt \xB7 esc cancel" : "\u2191\u2193 pick \xB7 enter done \xB7 tab prompt \xB7 esc cancel" : memo2(() => modelStep() === "summary")() ? "enter pick \xB7 tab branch \xB7 esc cancel" : memo2(() => modelStep() === "model-pick")() ? `\u2191\u2193 pick \xB7 enter ${hasEffortChoice() ? "effort" : "branch"} \xB7 esc cancel` : "\u2191\u2193 pick \xB7 enter branch \xB7 h back \xB7 esc cancel";
34443
34412
  })());
34444
34413
  effect((_p$) => {
34445
- var _v$0 = TextAttributes25.BOLD, _v$1 = theme.text, _v$10 = theme.textMuted, _v$11 = theme.textMuted, _v$12 = theme.accent, _v$13 = TextAttributes25.BOLD, _v$14 = theme.textMuted, _v$15 = field() === "prompt" ? theme.accent : theme.textMuted, _v$16 = field() === "prompt" ? TextAttributes25.BOLD : undefined, _v$17 = prompt(), _v$18 = field() === "prompt", _v$19 = theme.textMuted;
34446
- _v$0 !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$0, _p$.e));
34447
- _v$1 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$1, _p$.t));
34448
- _v$10 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$10, _p$.a));
34449
- _v$11 !== _p$.o && (_p$.o = setProp(_el$8, "fg", _v$11, _p$.o));
34450
- _v$12 !== _p$.i && (_p$.i = setProp(_el$0, "fg", _v$12, _p$.i));
34451
- _v$13 !== _p$.n && (_p$.n = setProp(_el$0, "attributes", _v$13, _p$.n));
34452
- _v$14 !== _p$.s && (_p$.s = setProp(_el$1, "fg", _v$14, _p$.s));
34453
- _v$15 !== _p$.h && (_p$.h = setProp(_el$29, "fg", _v$15, _p$.h));
34454
- _v$16 !== _p$.r && (_p$.r = setProp(_el$29, "attributes", _v$16, _p$.r));
34455
- _v$17 !== _p$.d && (_p$.d = setProp(_el$31, "value", _v$17, _p$.d));
34456
- _v$18 !== _p$.l && (_p$.l = setProp(_el$31, "focused", _v$18, _p$.l));
34457
- _v$19 !== _p$.u && (_p$.u = setProp(_el$33, "fg", _v$19, _p$.u));
34414
+ var _v$16 = TextAttributes23.BOLD, _v$17 = theme.text, _v$18 = theme.textMuted, _v$19 = theme.textMuted, _v$20 = theme.textMuted, _v$21 = theme.accent, _v$22 = TextAttributes23.BOLD, _v$23 = field() === "prompt" ? theme.accent : theme.textMuted, _v$24 = field() === "prompt" ? TextAttributes23.BOLD : undefined, _v$25 = prompt(), _v$26 = field() === "prompt", _v$27 = theme.textMuted;
34415
+ _v$16 !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$16, _p$.e));
34416
+ _v$17 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$17, _p$.t));
34417
+ _v$18 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$18, _p$.a));
34418
+ _v$19 !== _p$.o && (_p$.o = setProp(_el$8, "fg", _v$19, _p$.o));
34419
+ _v$20 !== _p$.i && (_p$.i = setProp(_el$9, "fg", _v$20, _p$.i));
34420
+ _v$21 !== _p$.n && (_p$.n = setProp(_el$1, "fg", _v$21, _p$.n));
34421
+ _v$22 !== _p$.s && (_p$.s = setProp(_el$1, "attributes", _v$22, _p$.s));
34422
+ _v$23 !== _p$.h && (_p$.h = setProp(_el$45, "fg", _v$23, _p$.h));
34423
+ _v$24 !== _p$.r && (_p$.r = setProp(_el$45, "attributes", _v$24, _p$.r));
34424
+ _v$25 !== _p$.d && (_p$.d = setProp(_el$47, "value", _v$25, _p$.d));
34425
+ _v$26 !== _p$.l && (_p$.l = setProp(_el$47, "focused", _v$26, _p$.l));
34426
+ _v$27 !== _p$.u && (_p$.u = setProp(_el$49, "fg", _v$27, _p$.u));
34458
34427
  return _p$;
34459
34428
  }, {
34460
34429
  e: undefined,
@@ -34488,6 +34457,7 @@ var init_dialog3 = __esm(() => {
34488
34457
  init_keymap();
34489
34458
  init_dialog();
34490
34459
  init_new_task_dialog();
34460
+ init_state2();
34491
34461
  });
34492
34462
 
34493
34463
  // src/tui/component/quick-fork-dialog/index.tsx
@@ -34522,7 +34492,7 @@ var init_quick_fork_dialog = __esm(() => {
34522
34492
  });
34523
34493
 
34524
34494
  // src/tui/component/rename-task-dialog/dialog.tsx
34525
- import { TextAttributes as TextAttributes26 } from "@opentui/core";
34495
+ import { TextAttributes as TextAttributes24 } from "@opentui/core";
34526
34496
  function RenameTaskDialogView(props) {
34527
34497
  const dialog = useDialog();
34528
34498
  const {
@@ -34562,7 +34532,7 @@ function RenameTaskDialogView(props) {
34562
34532
  setProp(_el$0, "paddingBottom", 1);
34563
34533
  insertNode(_el$1, createTextNode(`enter rename \xB7 esc cancel`));
34564
34534
  effect((_p$) => {
34565
- var _v$ = TextAttributes26.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.accent, _v$5 = title(), _v$6 = props.currentTitle, _v$7 = theme.textMuted;
34535
+ var _v$ = TextAttributes24.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.accent, _v$5 = title(), _v$6 = props.currentTitle, _v$7 = theme.textMuted;
34566
34536
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
34567
34537
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
34568
34538
  _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$3, _p$.a));
@@ -34719,10 +34689,10 @@ function useTaskActions(deps) {
34719
34689
  const inheritedModel = activeTab2?.model ?? source.model;
34720
34690
  const inheritedEffort = activeTab2?.modelEffort ?? source.modelEffort;
34721
34691
  const inheritedPermission = source.permissionMode;
34722
- const baseRef = source.branch && source.branch.length > 0 ? source.branch : getCurrentBranch(source.worktreePath || source.repo) ?? "main";
34692
+ const inheritedBaseRef = source.branch && source.branch.length > 0 ? source.branch : getCurrentBranch(source.worktreePath || source.repo) ?? "main";
34723
34693
  const result = await QuickForkDialog.show(dialog, {
34724
34694
  repo: source.repo,
34725
- baseRef,
34695
+ baseRef: inheritedBaseRef,
34726
34696
  modelId: inheritedModel,
34727
34697
  effort: inheritedEffort
34728
34698
  });
@@ -34731,7 +34701,7 @@ function useTaskActions(deps) {
34731
34701
  try {
34732
34702
  const created = await orchestrator.createTask({
34733
34703
  repo: source.repo,
34734
- baseRef,
34704
+ baseRef: result.baseRef,
34735
34705
  title: result.prompt
34736
34706
  });
34737
34707
  const newTabId = created.activeTabId;
@@ -35042,90 +35012,6 @@ var init_use_workspace_tabs = __esm(() => {
35042
35012
  EMPTY_TABS = { active: "chat" };
35043
35013
  });
35044
35014
 
35045
- // src/tui/panes/chat/BackgroundRunsLine.tsx
35046
- import { TextAttributes as TextAttributes27 } from "@opentui/core";
35047
- function BackgroundRunsLine(props) {
35048
- const {
35049
- theme
35050
- } = useTheme();
35051
- const shown = () => props.rows().slice(0, MAX_INLINE_PILLS);
35052
- const overflow = () => Math.max(0, props.rows().length - MAX_INLINE_PILLS);
35053
- return createComponent2(Show, {
35054
- get when() {
35055
- return props.rows().length > 0;
35056
- },
35057
- get children() {
35058
- var _el$ = createElement("box"), _el$2 = createElement("text"), _el$6 = createElement("text");
35059
- insertNode(_el$, _el$2);
35060
- insertNode(_el$, _el$6);
35061
- setProp(_el$, "flexDirection", "row");
35062
- setProp(_el$, "gap", 1);
35063
- setProp(_el$, "flexShrink", 0);
35064
- setProp(_el$, "paddingLeft", 1);
35065
- setProp(_el$, "paddingRight", 1);
35066
- setProp(_el$, "onMouseUp", () => props.onActivate());
35067
- insertNode(_el$2, createTextNode(`running in background`));
35068
- setProp(_el$2, "wrapMode", "none");
35069
- insert(_el$, createComponent2(For, {
35070
- get each() {
35071
- return shown();
35072
- },
35073
- children: (row) => {
35074
- const awaiting = row.state === "awaiting_input";
35075
- return (() => {
35076
- var _el$8 = createElement("text"), _el$9 = createTextNode(`\u25AA `);
35077
- insertNode(_el$8, _el$9);
35078
- setProp(_el$8, "wrapMode", "none");
35079
- insert(_el$8, () => row.taskTitle, null);
35080
- insert(_el$8, awaiting ? " (needs input)" : "", null);
35081
- effect((_$p) => setProp(_el$8, "fg", awaiting ? theme.warning : theme.success, _$p));
35082
- return _el$8;
35083
- })();
35084
- }
35085
- }), _el$6);
35086
- insert(_el$, createComponent2(Show, {
35087
- get when() {
35088
- return overflow() > 0;
35089
- },
35090
- get children() {
35091
- var _el$4 = createElement("text"), _el$5 = createTextNode(`+`);
35092
- insertNode(_el$4, _el$5);
35093
- setProp(_el$4, "wrapMode", "none");
35094
- insert(_el$4, overflow, null);
35095
- effect((_$p) => setProp(_el$4, "fg", theme.textMuted, _$p));
35096
- return _el$4;
35097
- }
35098
- }), _el$6);
35099
- insertNode(_el$6, createTextNode(`[ctrl+b]`));
35100
- setProp(_el$6, "wrapMode", "none");
35101
- effect((_p$) => {
35102
- var { textMuted: _v$, accent: _v$2 } = theme, _v$3 = TextAttributes27.BOLD;
35103
- _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
35104
- _v$2 !== _p$.t && (_p$.t = setProp(_el$6, "fg", _v$2, _p$.t));
35105
- _v$3 !== _p$.a && (_p$.a = setProp(_el$6, "attributes", _v$3, _p$.a));
35106
- return _p$;
35107
- }, {
35108
- e: undefined,
35109
- t: undefined,
35110
- a: undefined
35111
- });
35112
- return _el$;
35113
- }
35114
- });
35115
- }
35116
- var MAX_INLINE_PILLS = 3;
35117
- var init_BackgroundRunsLine = __esm(() => {
35118
- init_solid();
35119
- init_solid();
35120
- init_solid();
35121
- init_solid();
35122
- init_solid();
35123
- init_solid();
35124
- init_solid();
35125
- init_dev();
35126
- init_theme();
35127
- });
35128
-
35129
35015
  // src/tui/panes/chat/composer/path-preview.ts
35130
35016
  function hasStartBoundary(text, index) {
35131
35017
  if (index === 0)
@@ -35195,7 +35081,7 @@ var init_path_preview = __esm(() => {
35195
35081
  });
35196
35082
 
35197
35083
  // src/tui/panes/chat/ComposerPathChips.tsx
35198
- import { TextAttributes as TextAttributes28 } from "@opentui/core";
35084
+ import { TextAttributes as TextAttributes25 } from "@opentui/core";
35199
35085
  function ComposerPathChips(props) {
35200
35086
  const {
35201
35087
  theme
@@ -35229,7 +35115,7 @@ function ComposerPathChips(props) {
35229
35115
  setProp(_el$5, "wrapMode", "none");
35230
35116
  insert(_el$5, () => formatPreviewPathLabel(ref.path, 34));
35231
35117
  effect((_p$) => {
35232
- var { backgroundPanel: _v$, primary: _v$2 } = theme, _v$3 = TextAttributes28.UNDERLINE;
35118
+ var { backgroundPanel: _v$, primary: _v$2 } = theme, _v$3 = TextAttributes25.UNDERLINE;
35233
35119
  _v$ !== _p$.e && (_p$.e = setProp(_el$4, "backgroundColor", _v$, _p$.e));
35234
35120
  _v$2 !== _p$.t && (_p$.t = setProp(_el$5, "fg", _v$2, _p$.t));
35235
35121
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "attributes", _v$3, _p$.a));
@@ -35262,7 +35148,7 @@ var init_ComposerPathChips = __esm(() => {
35262
35148
  });
35263
35149
 
35264
35150
  // src/tui/panes/chat/ComposerQueue.tsx
35265
- import { TextAttributes as TextAttributes29 } from "@opentui/core";
35151
+ import { TextAttributes as TextAttributes26 } from "@opentui/core";
35266
35152
  function ComposerQueue(props) {
35267
35153
  const {
35268
35154
  theme
@@ -35332,7 +35218,7 @@ function ComposerQueue(props) {
35332
35218
  insertNode(_el$17, createTextNode(`[e]`));
35333
35219
  setProp(_el$17, "onMouseUp", onRowEdit);
35334
35220
  effect((_p$) => {
35335
- var _v$7 = theme.primary, _v$8 = TextAttributes29.BOLD;
35221
+ var _v$7 = theme.primary, _v$8 = TextAttributes26.BOLD;
35336
35222
  _v$7 !== _p$.e && (_p$.e = setProp(_el$17, "fg", _v$7, _p$.e));
35337
35223
  _v$8 !== _p$.t && (_p$.t = setProp(_el$17, "attributes", _v$8, _p$.t));
35338
35224
  return _p$;
@@ -35348,7 +35234,7 @@ function ComposerQueue(props) {
35348
35234
  insertNode(_el$21, createTextNode(`[x]`));
35349
35235
  setProp(_el$21, "onMouseUp", () => props.onCancelQueued?.(entry.id));
35350
35236
  effect((_p$) => {
35351
- var _v$9 = isEditing() ? theme.primary : theme.textMuted, _v$0 = TextAttributes29.BOLD, _v$1 = props.paused ? theme.warning : theme.textMuted, _v$10 = theme.text, _v$11 = theme.primary, _v$12 = TextAttributes29.BOLD, _v$13 = theme.error, _v$14 = TextAttributes29.BOLD;
35237
+ var _v$9 = isEditing() ? theme.primary : theme.textMuted, _v$0 = TextAttributes26.BOLD, _v$1 = props.paused ? theme.warning : theme.textMuted, _v$10 = theme.text, _v$11 = theme.primary, _v$12 = TextAttributes26.BOLD, _v$13 = theme.error, _v$14 = TextAttributes26.BOLD;
35352
35238
  _v$9 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$9, _p$.e));
35353
35239
  _v$0 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$0, _p$.t));
35354
35240
  _v$1 !== _p$.a && (_p$.a = setProp(_el$10, "fg", _v$1, _p$.a));
@@ -35386,7 +35272,7 @@ function ComposerQueue(props) {
35386
35272
  insertNode(_el$3, createTextNode(`+`));
35387
35273
  insert(_el$5, () => `\u2026 ${props.queue.length - QUEUE_VISIBLE_CAP} more queued`);
35388
35274
  effect((_p$) => {
35389
- var _v$ = theme.textMuted, _v$2 = TextAttributes29.BOLD, _v$3 = theme.textMuted;
35275
+ var _v$ = theme.textMuted, _v$2 = TextAttributes26.BOLD, _v$3 = theme.textMuted;
35390
35276
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
35391
35277
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
35392
35278
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -35410,7 +35296,7 @@ function ComposerQueue(props) {
35410
35296
  setProp(_el$7, "onMouseUp", () => props.onTogglePause?.());
35411
35297
  insert(_el$7, () => props.paused ? "[resume queue] auto-drain paused" : "[pause queue]");
35412
35298
  effect((_p$) => {
35413
- var _v$4 = props.queue.length > QUEUE_VISIBLE_CAP ? 0 : 1, _v$5 = props.paused ? theme.warning : theme.textMuted, _v$6 = props.paused ? TextAttributes29.BOLD : undefined;
35299
+ var _v$4 = props.queue.length > QUEUE_VISIBLE_CAP ? 0 : 1, _v$5 = props.paused ? theme.warning : theme.textMuted, _v$6 = props.paused ? TextAttributes26.BOLD : undefined;
35414
35300
  _v$4 !== _p$.e && (_p$.e = setProp(_el$6, "paddingTop", _v$4, _p$.e));
35415
35301
  _v$5 !== _p$.t && (_p$.t = setProp(_el$7, "fg", _v$5, _p$.t));
35416
35302
  _v$6 !== _p$.a && (_p$.a = setProp(_el$7, "attributes", _v$6, _p$.a));
@@ -35472,7 +35358,7 @@ function formatSlashDescription(description) {
35472
35358
  var SLASH_DESCRIPTION_MAX_CHARS = 72;
35473
35359
 
35474
35360
  // src/tui/panes/chat/ComposerView.tsx
35475
- import { TextAttributes as TextAttributes30 } from "@opentui/core";
35361
+ import { TextAttributes as TextAttributes27 } from "@opentui/core";
35476
35362
  function ComposerView(props) {
35477
35363
  const theme = props.theme;
35478
35364
  return (() => {
@@ -35750,7 +35636,7 @@ function MentionDropdown(props) {
35750
35636
  }
35751
35637
  }), null);
35752
35638
  effect((_p$) => {
35753
- var _v$17 = active() ? theme.primary : theme.text, _v$18 = active() ? TextAttributes30.BOLD : undefined;
35639
+ var _v$17 = active() ? theme.primary : theme.text, _v$18 = active() ? TextAttributes27.BOLD : undefined;
35754
35640
  _v$17 !== _p$.e && (_p$.e = setProp(_el$16, "fg", _v$17, _p$.e));
35755
35641
  _v$18 !== _p$.t && (_p$.t = setProp(_el$16, "attributes", _v$18, _p$.t));
35756
35642
  return _p$;
@@ -35864,7 +35750,7 @@ function SlashDropdown(props) {
35864
35750
  }
35865
35751
  }), null);
35866
35752
  effect((_p$) => {
35867
- var _v$22 = active() ? theme.primary : theme.text, _v$23 = active() ? TextAttributes30.BOLD : undefined;
35753
+ var _v$22 = active() ? theme.primary : theme.text, _v$23 = active() ? TextAttributes27.BOLD : undefined;
35868
35754
  _v$22 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$22, _p$.e));
35869
35755
  _v$23 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$23, _p$.t));
35870
35756
  return _p$;
@@ -35932,7 +35818,7 @@ function PromptGlyph(props) {
35932
35818
  insertNode(_el$33, createTextNode(`\u2026`));
35933
35819
  insertNode(_el$35, createTextNode(`!`));
35934
35820
  effect((_p$) => {
35935
- var { accent: _v$26, warning: _v$27 } = theme, _v$28 = TextAttributes30.BOLD;
35821
+ var { accent: _v$26, warning: _v$27 } = theme, _v$28 = TextAttributes27.BOLD;
35936
35822
  _v$26 !== _p$.e && (_p$.e = setProp(_el$33, "fg", _v$26, _p$.e));
35937
35823
  _v$27 !== _p$.t && (_p$.t = setProp(_el$35, "fg", _v$27, _p$.t));
35938
35824
  _v$28 !== _p$.a && (_p$.a = setProp(_el$35, "attributes", _v$28, _p$.a));
@@ -35950,7 +35836,7 @@ function PromptGlyph(props) {
35950
35836
  var _el$30 = createElement("text");
35951
35837
  insertNode(_el$30, createTextNode(`!`));
35952
35838
  effect((_p$) => {
35953
- var _v$24 = theme.warning, _v$25 = TextAttributes30.BOLD;
35839
+ var _v$24 = theme.warning, _v$25 = TextAttributes27.BOLD;
35954
35840
  _v$24 !== _p$.e && (_p$.e = setProp(_el$30, "fg", _v$24, _p$.e));
35955
35841
  _v$25 !== _p$.t && (_p$.t = setProp(_el$30, "attributes", _v$25, _p$.t));
35956
35842
  return _p$;
@@ -36326,7 +36212,7 @@ class PromptHistoryNavigator {
36326
36212
  }
36327
36213
 
36328
36214
  // src/tui/panes/chat/composer/HistoryPalette.tsx
36329
- import { TextAttributes as TextAttributes31 } from "@opentui/core";
36215
+ import { TextAttributes as TextAttributes28 } from "@opentui/core";
36330
36216
  function rowsFromEntries(entries, labelFor, currentProject) {
36331
36217
  const filtered = currentProject === undefined ? entries : entries.filter((e2) => e2.project === currentProject || e2.project === undefined);
36332
36218
  return filtered.map((e2) => {
@@ -36542,7 +36428,7 @@ function HistoryPaletteView(props) {
36542
36428
  setProp(_el$13, "paddingBottom", 1);
36543
36429
  insertNode(_el$14, createTextNode(`\u2191/\u2193 nav \xB7 enter recall \xB7 esc cancel`));
36544
36430
  effect((_p$) => {
36545
- var _v$ = TextAttributes31.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.accent, _v$5 = query(), _v$6 = theme.textMuted;
36431
+ var _v$ = TextAttributes28.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.accent, _v$5 = query(), _v$6 = theme.textMuted;
36546
36432
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
36547
36433
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
36548
36434
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -37831,7 +37717,7 @@ var init_message_figures = __esm(() => {
37831
37717
  });
37832
37718
 
37833
37719
  // src/tui/panes/chat/MessageRows.tsx
37834
- import { TextAttributes as TextAttributes32 } from "@opentui/core";
37720
+ import { TextAttributes as TextAttributes29 } from "@opentui/core";
37835
37721
  function UserRow(props) {
37836
37722
  const {
37837
37723
  theme
@@ -37888,7 +37774,7 @@ function UserRow(props) {
37888
37774
  })() : null;
37889
37775
  })(), null);
37890
37776
  effect((_p$) => {
37891
- var _v$ = theme.accent, _v$2 = TextAttributes32.BOLD, _v$3 = theme.primary, _v$4 = TextAttributes32.BOLD;
37777
+ var _v$ = theme.accent, _v$2 = TextAttributes29.BOLD, _v$3 = theme.primary, _v$4 = TextAttributes29.BOLD;
37892
37778
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
37893
37779
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
37894
37780
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -37968,7 +37854,7 @@ function UserRow(props) {
37968
37854
  setProp(_el$21, "flexGrow", 1);
37969
37855
  insert(_el$22, () => view.text);
37970
37856
  effect((_p$) => {
37971
- var _v$9 = theme.accent, _v$0 = TextAttributes32.BOLD, _v$1 = theme.text;
37857
+ var _v$9 = theme.accent, _v$0 = TextAttributes29.BOLD, _v$1 = theme.text;
37972
37858
  _v$9 !== _p$.e && (_p$.e = setProp(_el$19, "fg", _v$9, _p$.e));
37973
37859
  _v$0 !== _p$.t && (_p$.t = setProp(_el$19, "attributes", _v$0, _p$.t));
37974
37860
  _v$1 !== _p$.a && (_p$.a = setProp(_el$22, "fg", _v$1, _p$.a));
@@ -38004,7 +37890,7 @@ function AssistantRow(props) {
38004
37890
  }
38005
37891
  }));
38006
37892
  effect((_p$) => {
38007
- var _v$10 = theme.accent, _v$11 = TextAttributes32.BOLD;
37893
+ var _v$10 = theme.accent, _v$11 = TextAttributes29.BOLD;
38008
37894
  _v$10 !== _p$.e && (_p$.e = setProp(_el$25, "fg", _v$10, _p$.e));
38009
37895
  _v$11 !== _p$.t && (_p$.t = setProp(_el$25, "attributes", _v$11, _p$.t));
38010
37896
  return _p$;
@@ -38040,7 +37926,7 @@ function ReasoningRow(props) {
38040
37926
  }
38041
37927
  }), null);
38042
37928
  effect((_p$) => {
38043
- var _v$12 = theme.success, _v$13 = TextAttributes32.BOLD, _v$14 = theme.textMuted, _v$15 = TextAttributes32.BOLD;
37929
+ var _v$12 = theme.success, _v$13 = TextAttributes29.BOLD, _v$14 = theme.textMuted, _v$15 = TextAttributes29.BOLD;
38044
37930
  _v$12 !== _p$.e && (_p$.e = setProp(_el$29, "fg", _v$12, _p$.e));
38045
37931
  _v$13 !== _p$.t && (_p$.t = setProp(_el$29, "attributes", _v$13, _p$.t));
38046
37932
  _v$14 !== _p$.a && (_p$.a = setProp(_el$31, "fg", _v$14, _p$.a));
@@ -38152,7 +38038,7 @@ function BashRow(props) {
38152
38038
  setProp(_el$41, "paddingLeft", 2);
38153
38039
  insert(_el$42, statusText);
38154
38040
  effect((_p$) => {
38155
- var _v$16 = statusColor(), _v$17 = TextAttributes32.DIM;
38041
+ var _v$16 = statusColor(), _v$17 = TextAttributes29.DIM;
38156
38042
  _v$16 !== _p$.e && (_p$.e = setProp(_el$42, "fg", _v$16, _p$.e));
38157
38043
  _v$17 !== _p$.t && (_p$.t = setProp(_el$42, "attributes", _v$17, _p$.t));
38158
38044
  return _p$;
@@ -38164,7 +38050,7 @@ function BashRow(props) {
38164
38050
  }
38165
38051
  }), null);
38166
38052
  effect((_p$) => {
38167
- var _v$18 = theme.warning, _v$19 = TextAttributes32.BOLD, _v$20 = theme.text;
38053
+ var _v$18 = theme.warning, _v$19 = TextAttributes29.BOLD, _v$20 = theme.text;
38168
38054
  _v$18 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$18, _p$.e));
38169
38055
  _v$19 !== _p$.t && (_p$.t = setProp(_el$35, "attributes", _v$19, _p$.t));
38170
38056
  _v$20 !== _p$.a && (_p$.a = setProp(_el$38, "fg", _v$20, _p$.a));
@@ -38194,7 +38080,7 @@ function SystemRow(props) {
38194
38080
  setProp(_el$47, "flexGrow", 1);
38195
38081
  insert(_el$48, () => props.text);
38196
38082
  effect((_p$) => {
38197
- var _v$21 = theme.textMuted, _v$22 = TextAttributes32.DIM, _v$23 = isError() ? theme.error : theme.textMuted;
38083
+ var _v$21 = theme.textMuted, _v$22 = TextAttributes29.DIM, _v$23 = isError() ? theme.error : theme.textMuted;
38198
38084
  _v$21 !== _p$.e && (_p$.e = setProp(_el$46, "fg", _v$21, _p$.e));
38199
38085
  _v$22 !== _p$.t && (_p$.t = setProp(_el$46, "attributes", _v$22, _p$.t));
38200
38086
  _v$23 !== _p$.a && (_p$.a = setProp(_el$48, "fg", _v$23, _p$.a));
@@ -38207,6 +38093,47 @@ function SystemRow(props) {
38207
38093
  return _el$45;
38208
38094
  })();
38209
38095
  }
38096
+ function RecapRow(props) {
38097
+ const {
38098
+ theme
38099
+ } = useTheme();
38100
+ return (() => {
38101
+ var _el$49 = createElement("box"), _el$50 = createElement("text"), _el$51 = createElement("box"), _el$52 = createElement("text"), _el$54 = createElement("box"), _el$55 = createElement("text");
38102
+ insertNode(_el$49, _el$50);
38103
+ insertNode(_el$49, _el$51);
38104
+ setProp(_el$49, "paddingTop", 1);
38105
+ setProp(_el$49, "flexDirection", "row");
38106
+ setProp(_el$49, "gap", 1);
38107
+ insert(_el$50, REFERENCE_MARK);
38108
+ insertNode(_el$51, _el$52);
38109
+ insertNode(_el$51, _el$54);
38110
+ setProp(_el$51, "flexGrow", 1);
38111
+ setProp(_el$51, "flexDirection", "row");
38112
+ setProp(_el$51, "gap", 1);
38113
+ insertNode(_el$52, createTextNode(`Recap:`));
38114
+ insertNode(_el$54, _el$55);
38115
+ setProp(_el$54, "flexGrow", 1);
38116
+ insert(_el$55, () => props.text);
38117
+ effect((_p$) => {
38118
+ var _v$24 = theme.textMuted, _v$25 = TextAttributes29.DIM, _v$26 = theme.textMuted, _v$27 = TextAttributes29.BOLD | TextAttributes29.DIM, _v$28 = theme.textMuted, _v$29 = TextAttributes29.DIM;
38119
+ _v$24 !== _p$.e && (_p$.e = setProp(_el$50, "fg", _v$24, _p$.e));
38120
+ _v$25 !== _p$.t && (_p$.t = setProp(_el$50, "attributes", _v$25, _p$.t));
38121
+ _v$26 !== _p$.a && (_p$.a = setProp(_el$52, "fg", _v$26, _p$.a));
38122
+ _v$27 !== _p$.o && (_p$.o = setProp(_el$52, "attributes", _v$27, _p$.o));
38123
+ _v$28 !== _p$.i && (_p$.i = setProp(_el$55, "fg", _v$28, _p$.i));
38124
+ _v$29 !== _p$.n && (_p$.n = setProp(_el$55, "attributes", _v$29, _p$.n));
38125
+ return _p$;
38126
+ }, {
38127
+ e: undefined,
38128
+ t: undefined,
38129
+ a: undefined,
38130
+ o: undefined,
38131
+ i: undefined,
38132
+ n: undefined
38133
+ });
38134
+ return _el$49;
38135
+ })();
38136
+ }
38210
38137
  var init_MessageRows = __esm(() => {
38211
38138
  init_solid();
38212
38139
  init_solid();
@@ -38340,6 +38267,265 @@ function makeMultiEditHeader(filePath, count, adds, removes) {
38340
38267
  }
38341
38268
  var COLLAPSED_LINE_CAP = 10;
38342
38269
 
38270
+ // src/tui/panes/chat/todo-render.ts
38271
+ function parseTodos(input) {
38272
+ if (input == null || typeof input !== "object")
38273
+ return [];
38274
+ const todos = input.todos;
38275
+ if (!Array.isArray(todos))
38276
+ return [];
38277
+ const out = [];
38278
+ for (const t2 of todos) {
38279
+ if (!t2 || typeof t2 !== "object")
38280
+ continue;
38281
+ const obj = t2;
38282
+ const content = typeof obj.content === "string" ? obj.content : "";
38283
+ const activeForm = typeof obj.activeForm === "string" ? obj.activeForm : content;
38284
+ const status = typeof obj.status === "string" && V1_STATUSES.has(obj.status) ? obj.status : "pending";
38285
+ if (content.length === 0)
38286
+ continue;
38287
+ out.push({ content, status, activeForm });
38288
+ }
38289
+ return out;
38290
+ }
38291
+ function todoDisplayText(t2) {
38292
+ return t2.status === "in_progress" ? t2.activeForm : t2.content;
38293
+ }
38294
+ function parseTaskStatus(raw) {
38295
+ return typeof raw === "string" && TASK_STATUSES.has(raw) ? raw : "pending";
38296
+ }
38297
+ function parseTaskItem(obj) {
38298
+ const id = typeof obj.id === "string" ? obj.id : "";
38299
+ const subject = typeof obj.subject === "string" ? obj.subject : "";
38300
+ if (!id || !subject)
38301
+ return null;
38302
+ return {
38303
+ id,
38304
+ subject,
38305
+ status: parseTaskStatus(obj.status),
38306
+ owner: typeof obj.owner === "string" ? obj.owner : undefined,
38307
+ blockedBy: Array.isArray(obj.blockedBy) ? obj.blockedBy.filter((x2) => typeof x2 === "string") : undefined
38308
+ };
38309
+ }
38310
+ function parseTaskCreateInput(input) {
38311
+ if (input == null || typeof input !== "object")
38312
+ return null;
38313
+ const obj = input;
38314
+ const subject = typeof obj.subject === "string" ? obj.subject : "";
38315
+ if (!subject)
38316
+ return null;
38317
+ const description = typeof obj.description === "string" ? obj.description : "";
38318
+ const activeForm = typeof obj.activeForm === "string" ? obj.activeForm : subject;
38319
+ return { subject, description, activeForm };
38320
+ }
38321
+ function parseTaskUpdateInput(input) {
38322
+ if (input == null || typeof input !== "object")
38323
+ return null;
38324
+ const obj = input;
38325
+ const taskId = typeof obj.taskId === "string" ? obj.taskId : "";
38326
+ if (!taskId)
38327
+ return null;
38328
+ return {
38329
+ taskId,
38330
+ status: typeof obj.status === "string" && TASK_STATUSES.has(obj.status) ? obj.status : undefined,
38331
+ subject: typeof obj.subject === "string" ? obj.subject : undefined,
38332
+ activeForm: typeof obj.activeForm === "string" ? obj.activeForm : undefined,
38333
+ owner: typeof obj.owner === "string" ? obj.owner : undefined
38334
+ };
38335
+ }
38336
+ function parseTaskUpdateOutput(output) {
38337
+ if (output == null || typeof output !== "object")
38338
+ return null;
38339
+ const obj = output;
38340
+ const taskId = typeof obj.taskId === "string" ? obj.taskId : "";
38341
+ if (!taskId)
38342
+ return null;
38343
+ const updatedFields = Array.isArray(obj.updatedFields) ? obj.updatedFields.filter((x2) => typeof x2 === "string") : [];
38344
+ const sc = obj.statusChange;
38345
+ const statusChange = sc && typeof sc === "object" && typeof sc.from === "string" && typeof sc.to === "string" ? { from: sc.from, to: sc.to } : undefined;
38346
+ return {
38347
+ success: obj.success === true,
38348
+ taskId,
38349
+ updatedFields,
38350
+ statusChange,
38351
+ error: typeof obj.error === "string" ? obj.error : undefined
38352
+ };
38353
+ }
38354
+ function parseTaskListOutput(output) {
38355
+ const text = coerceToolResultText(output);
38356
+ if (text != null)
38357
+ return parseTaskListText(text);
38358
+ if (output != null && typeof output === "object") {
38359
+ const tasks = output.tasks;
38360
+ if (Array.isArray(tasks)) {
38361
+ const out = [];
38362
+ for (const t2 of tasks) {
38363
+ if (!t2 || typeof t2 !== "object")
38364
+ continue;
38365
+ const parsed = parseTaskItem(t2);
38366
+ if (parsed)
38367
+ out.push(parsed);
38368
+ }
38369
+ return out;
38370
+ }
38371
+ }
38372
+ return [];
38373
+ }
38374
+ function coerceToolResultText(output) {
38375
+ if (typeof output === "string")
38376
+ return output;
38377
+ if (Array.isArray(output)) {
38378
+ const parts = [];
38379
+ for (const b2 of output) {
38380
+ if (b2 && typeof b2 === "object" && b2.type === "text") {
38381
+ const t2 = b2.text;
38382
+ if (typeof t2 === "string")
38383
+ parts.push(t2);
38384
+ }
38385
+ }
38386
+ if (parts.length > 0)
38387
+ return parts.join(`
38388
+ `);
38389
+ }
38390
+ return null;
38391
+ }
38392
+ function parseTaskListText(text) {
38393
+ const out = [];
38394
+ const lineRe = /^#(\S+)\s+\[(pending|in_progress|completed|deleted)\]\s+(.+)$/;
38395
+ const blockedRe = /\s+\[blocked by [^\]]+\]\s*$/;
38396
+ const ownerRe = /\s+\(([^)]+)\)\s*$/;
38397
+ for (const raw of text.split(`
38398
+ `)) {
38399
+ const line = raw.trim();
38400
+ if (!line)
38401
+ continue;
38402
+ const m2 = lineRe.exec(line);
38403
+ if (!m2)
38404
+ continue;
38405
+ const id = m2[1] ?? "";
38406
+ const status = m2[2];
38407
+ let rest = m2[3] ?? "";
38408
+ const blocked = blockedRe.exec(rest);
38409
+ const blockedBy = [];
38410
+ if (blocked) {
38411
+ const inner = blocked[0].match(/#(\S+?)(?=[,\]])/g) ?? [];
38412
+ for (const tag of inner)
38413
+ blockedBy.push(tag.slice(1));
38414
+ rest = rest.slice(0, blocked.index).trim();
38415
+ }
38416
+ let owner;
38417
+ const ownerM = ownerRe.exec(rest);
38418
+ if (ownerM) {
38419
+ owner = ownerM[1];
38420
+ rest = rest.slice(0, ownerM.index).trim();
38421
+ }
38422
+ if (!id || !rest)
38423
+ continue;
38424
+ out.push({
38425
+ id,
38426
+ subject: rest,
38427
+ status,
38428
+ owner,
38429
+ blockedBy: blockedBy.length > 0 ? blockedBy : undefined
38430
+ });
38431
+ }
38432
+ return out;
38433
+ }
38434
+ function countTodos(items) {
38435
+ let done = 0;
38436
+ let inProgress = 0;
38437
+ let pending = 0;
38438
+ let total = 0;
38439
+ for (const t2 of items) {
38440
+ if (t2.status === "deleted")
38441
+ continue;
38442
+ total++;
38443
+ if (t2.status === "completed")
38444
+ done++;
38445
+ else if (t2.status === "in_progress")
38446
+ inProgress++;
38447
+ else
38448
+ pending++;
38449
+ }
38450
+ return { done, inProgress, pending, total };
38451
+ }
38452
+ function summarizeTodos(c2) {
38453
+ if (c2.total === 0)
38454
+ return "0 todos";
38455
+ const noun = c2.total === 1 ? "todo" : "todos";
38456
+ return `${c2.total} ${noun} \xB7 ${TODO_GLYPH.completed}${c2.done} ${TODO_GLYPH.in_progress}${c2.inProgress} ${TODO_GLYPH.pending}${c2.pending}`;
38457
+ }
38458
+ function extractSnapshotItems(row) {
38459
+ if (row.name === "TodoWrite") {
38460
+ return parseTodos(row.input).map((t2, i2) => ({
38461
+ key: `${i2}`,
38462
+ status: t2.status,
38463
+ displayText: todoDisplayText(t2)
38464
+ }));
38465
+ }
38466
+ if (row.name === "TaskList") {
38467
+ if (!row.done)
38468
+ return [];
38469
+ return parseTaskListOutput(row.output).map((t2) => ({
38470
+ key: t2.id,
38471
+ status: t2.status,
38472
+ displayText: `${t2.subject} [#${t2.id}]`
38473
+ }));
38474
+ }
38475
+ return [];
38476
+ }
38477
+ function computeRoundedSnapshots(messages) {
38478
+ const result = new Map;
38479
+ const baseline = new Set;
38480
+ for (let i2 = 0;i2 < messages.length; i2++) {
38481
+ const r2 = messages[i2];
38482
+ if (!r2 || r2.kind !== "tool")
38483
+ continue;
38484
+ if (r2.name !== "TodoWrite" && r2.name !== "TaskList")
38485
+ continue;
38486
+ const raw = extractSnapshotItems({
38487
+ name: r2.name,
38488
+ input: r2.input,
38489
+ output: r2.output,
38490
+ done: r2.done === true
38491
+ });
38492
+ if (raw.length === 0) {
38493
+ result.set(i2, []);
38494
+ continue;
38495
+ }
38496
+ const rawCompleted = [];
38497
+ const rawActive = [];
38498
+ for (const t2 of raw) {
38499
+ if (t2.status === "completed" || t2.status === "deleted")
38500
+ rawCompleted.push(t2);
38501
+ else
38502
+ rawActive.push(t2);
38503
+ }
38504
+ if (rawCompleted.length > 0 && rawActive.length > 0) {
38505
+ const completedIds = rawCompleted.map((t2) => Number.parseInt(t2.key, 10)).filter((n2) => !Number.isNaN(n2));
38506
+ const activeIds = rawActive.map((t2) => Number.parseInt(t2.key, 10)).filter((n2) => !Number.isNaN(n2));
38507
+ if (completedIds.length === rawCompleted.length && activeIds.length === rawActive.length && Math.max(...completedIds) < Math.min(...activeIds)) {
38508
+ for (const t2 of rawCompleted)
38509
+ baseline.add(t2.key);
38510
+ }
38511
+ }
38512
+ const visible = raw.filter((t2) => !baseline.has(t2.key));
38513
+ result.set(i2, visible);
38514
+ }
38515
+ return result;
38516
+ }
38517
+ var TASK_STATUSES, V1_STATUSES, TODO_GLYPH;
38518
+ var init_todo_render = __esm(() => {
38519
+ TASK_STATUSES = new Set(["pending", "in_progress", "completed", "deleted"]);
38520
+ V1_STATUSES = new Set(["pending", "in_progress", "completed"]);
38521
+ TODO_GLYPH = {
38522
+ completed: "\u2713",
38523
+ in_progress: "\u25FC",
38524
+ pending: "\u25FB",
38525
+ deleted: "\u2717"
38526
+ };
38527
+ });
38528
+
38343
38529
  // src/tui/panes/chat/tool-banners.ts
38344
38530
  function readStringField(input, key) {
38345
38531
  if (input == null || typeof input !== "object")
@@ -38409,6 +38595,9 @@ function classifyTool(name, vendor = "claude") {
38409
38595
  function isSubagentTool(name, vendor = "claude") {
38410
38596
  return lookupToolMeta(name, vendor).body === "subagent";
38411
38597
  }
38598
+ function isTodoSnapshotTool(name, vendor = "claude") {
38599
+ return lookupToolMeta(name, vendor).body === "todo-snapshot";
38600
+ }
38412
38601
  var DEFAULT_META, claudeRegistry, registries;
38413
38602
  var init_tool_registry = __esm(() => {
38414
38603
  DEFAULT_META = {
@@ -38429,7 +38618,12 @@ var init_tool_registry = __esm(() => {
38429
38618
  Glob: { bucket: "list", banner: "read-grep-glob", body: "read-grep-glob" },
38430
38619
  LS: { bucket: "list", banner: "default", body: "default" },
38431
38620
  Task: { bucket: "other", banner: "default", body: "subagent" },
38432
- Agent: { bucket: "other", banner: "default", body: "subagent" }
38621
+ Agent: { bucket: "other", banner: "default", body: "subagent" },
38622
+ TodoWrite: { bucket: "other", banner: "default", body: "todo-snapshot" },
38623
+ TaskList: { bucket: "other", banner: "default", body: "todo-snapshot" },
38624
+ TaskCreate: { bucket: "other", banner: "task-action", body: "default" },
38625
+ TaskUpdate: { bucket: "other", banner: "task-action", body: "default" },
38626
+ TaskGet: { bucket: "other", banner: "task-action", body: "default" }
38433
38627
  };
38434
38628
  registries = {
38435
38629
  claude: claudeRegistry,
@@ -38439,9 +38633,11 @@ var init_tool_registry = __esm(() => {
38439
38633
  });
38440
38634
 
38441
38635
  // src/tui/panes/chat/tool-fold.tsx
38442
- import { TextAttributes as TextAttributes33 } from "@opentui/core";
38636
+ import { TextAttributes as TextAttributes30 } from "@opentui/core";
38443
38637
  function isFoldableTool(row) {
38444
- return row?.kind === "tool" && !isSubagentTool(row.name);
38638
+ if (row?.kind !== "tool")
38639
+ return false;
38640
+ return !isSubagentTool(row.name) && !isTodoSnapshotTool(row.name);
38445
38641
  }
38446
38642
  function groupRenderItems(messages, expandedFoldStartIndex = null) {
38447
38643
  const items = [];
@@ -38572,7 +38768,7 @@ function ToolFoldRow(props) {
38572
38768
  setProp(_el$3, "flexGrow", 1);
38573
38769
  insert(_el$4, () => props.summary);
38574
38770
  effect((_p$) => {
38575
- var _v$ = fg(), _v$2 = TextAttributes33.DIM, _v$3 = theme.textMuted;
38771
+ var _v$ = fg(), _v$2 = TextAttributes30.DIM, _v$3 = theme.textMuted;
38576
38772
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
38577
38773
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
38578
38774
  _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$3, _p$.a));
@@ -38597,7 +38793,7 @@ var init_tool_fold = __esm(() => {
38597
38793
  });
38598
38794
 
38599
38795
  // src/tui/panes/chat/ToolRow.tsx
38600
- import { TextAttributes as TextAttributes34 } from "@opentui/core";
38796
+ import { TextAttributes as TextAttributes31 } from "@opentui/core";
38601
38797
  function previewToolInput(input) {
38602
38798
  if (input == null)
38603
38799
  return "";
@@ -38642,16 +38838,26 @@ function ToolRow(props) {
38642
38838
  theme
38643
38839
  } = useTheme();
38644
38840
  const r2 = () => props.row;
38645
- const prefixGlyph = () => r2().done ? BLACK_CIRCLE : "\u273B";
38646
- const prefixColor = () => r2().done ? theme.success : theme.warning;
38841
+ const prefixGlyph = () => {
38842
+ if (isTodoSnapshot())
38843
+ return props.expanded ? "\u25BC" : "\u25B6";
38844
+ return r2().done ? BLACK_CIRCLE : "\u273B";
38845
+ };
38846
+ const prefixColor = () => {
38847
+ if (isTodoSnapshot())
38848
+ return theme.success;
38849
+ return r2().done ? theme.success : theme.warning;
38850
+ };
38647
38851
  const meta = () => lookupToolMeta(r2().name);
38648
38852
  const isDiffTool = () => meta().body === "edit-diff";
38649
38853
  const isMultiEdit = () => meta().body === "multi-edit-diff";
38650
38854
  const isBash = () => meta().banner === "bash";
38651
38855
  const isReadGrepGlob = () => meta().banner === "read-grep-glob";
38652
38856
  const isSubagent = () => meta().body === "subagent";
38857
+ const isTodoSnapshot = () => meta().body === "todo-snapshot";
38858
+ const isTaskAction = () => meta().banner === "task-action";
38653
38859
  const usesCustomBanner = () => meta().banner !== "default" || meta().body !== "default";
38654
- const usesCustomBody = () => meta().body === "edit-diff" || meta().body === "multi-edit-diff" || meta().body === "bash-output" || meta().body === "subagent";
38860
+ const usesCustomBody = () => meta().body === "edit-diff" || meta().body === "multi-edit-diff" || meta().body === "bash-output" || meta().body === "subagent" || meta().body === "todo-snapshot";
38655
38861
  const diff = () => {
38656
38862
  if (r2().name === "Edit")
38657
38863
  return formatEditDiff(r2().input);
@@ -38679,49 +38885,77 @@ function ToolRow(props) {
38679
38885
  get fallback() {
38680
38886
  return createComponent2(Show, {
38681
38887
  get when() {
38682
- return isReadGrepGlob();
38888
+ return isTodoSnapshot();
38683
38889
  },
38684
38890
  get fallback() {
38685
38891
  return createComponent2(Show, {
38686
38892
  get when() {
38687
- return isBash();
38893
+ return isTaskAction();
38688
38894
  },
38689
38895
  get fallback() {
38690
- return (() => {
38691
- var _el$16 = createElement("text"), _el$17 = createElement("span");
38692
- insertNode(_el$16, _el$17);
38693
- insert(_el$17, () => r2().name);
38694
- insert(_el$16, createComponent2(Show, {
38695
- get when() {
38696
- return !usesCustomBanner();
38697
- },
38698
- get children() {
38699
- var _el$18 = createElement("span"), _el$19 = createTextNode(`(`), _el$20 = createTextNode(`)`);
38700
- insertNode(_el$18, _el$19);
38701
- insertNode(_el$18, _el$20);
38702
- insert(_el$18, () => previewToolInput(r2().input), _el$20);
38703
- effect((_$p) => setProp(_el$18, "style", {
38704
- fg: theme.textMuted
38705
- }, _$p));
38706
- return _el$18;
38707
- }
38708
- }), null);
38709
- effect((_p$) => {
38710
- var _v$7 = theme.text, _v$8 = {
38711
- attributes: TextAttributes34.BOLD
38712
- };
38713
- _v$7 !== _p$.e && (_p$.e = setProp(_el$16, "fg", _v$7, _p$.e));
38714
- _v$8 !== _p$.t && (_p$.t = setProp(_el$17, "style", _v$8, _p$.t));
38715
- return _p$;
38716
- }, {
38717
- e: undefined,
38718
- t: undefined
38719
- });
38720
- return _el$16;
38721
- })();
38896
+ return createComponent2(Show, {
38897
+ get when() {
38898
+ return isReadGrepGlob();
38899
+ },
38900
+ get fallback() {
38901
+ return createComponent2(Show, {
38902
+ get when() {
38903
+ return isBash();
38904
+ },
38905
+ get fallback() {
38906
+ return (() => {
38907
+ var _el$16 = createElement("text"), _el$17 = createElement("span");
38908
+ insertNode(_el$16, _el$17);
38909
+ insert(_el$17, () => r2().name);
38910
+ insert(_el$16, createComponent2(Show, {
38911
+ get when() {
38912
+ return !usesCustomBanner();
38913
+ },
38914
+ get children() {
38915
+ var _el$18 = createElement("span"), _el$19 = createTextNode(`(`), _el$20 = createTextNode(`)`);
38916
+ insertNode(_el$18, _el$19);
38917
+ insertNode(_el$18, _el$20);
38918
+ insert(_el$18, () => previewToolInput(r2().input), _el$20);
38919
+ effect((_$p) => setProp(_el$18, "style", {
38920
+ fg: theme.textMuted
38921
+ }, _$p));
38922
+ return _el$18;
38923
+ }
38924
+ }), null);
38925
+ effect((_p$) => {
38926
+ var _v$7 = theme.text, _v$8 = {
38927
+ attributes: TextAttributes31.BOLD
38928
+ };
38929
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$16, "fg", _v$7, _p$.e));
38930
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$17, "style", _v$8, _p$.t));
38931
+ return _p$;
38932
+ }, {
38933
+ e: undefined,
38934
+ t: undefined
38935
+ });
38936
+ return _el$16;
38937
+ })();
38938
+ },
38939
+ get children() {
38940
+ return createComponent2(BashBanner, {
38941
+ get row() {
38942
+ return r2();
38943
+ }
38944
+ });
38945
+ }
38946
+ });
38947
+ },
38948
+ get children() {
38949
+ return createComponent2(ReadGrepGlobBanner, {
38950
+ get row() {
38951
+ return r2();
38952
+ }
38953
+ });
38954
+ }
38955
+ });
38722
38956
  },
38723
38957
  get children() {
38724
- return createComponent2(BashBanner, {
38958
+ return createComponent2(TaskActionBanner, {
38725
38959
  get row() {
38726
38960
  return r2();
38727
38961
  }
@@ -38730,9 +38964,12 @@ function ToolRow(props) {
38730
38964
  });
38731
38965
  },
38732
38966
  get children() {
38733
- return createComponent2(ReadGrepGlobBanner, {
38734
- get row() {
38735
- return r2();
38967
+ return createComponent2(TodoSnapshotBanner, {
38968
+ get items() {
38969
+ return props.roundedItems ?? [];
38970
+ },
38971
+ get name() {
38972
+ return r2().name;
38736
38973
  }
38737
38974
  });
38738
38975
  }
@@ -38818,6 +39055,24 @@ function ToolRow(props) {
38818
39055
  });
38819
39056
  }
38820
39057
  }), null);
39058
+ insert(_el$, createComponent2(Show, {
39059
+ get when() {
39060
+ return isTodoSnapshot();
39061
+ },
39062
+ get children() {
39063
+ return createComponent2(TodoSnapshotBody, {
39064
+ get items() {
39065
+ return props.roundedItems ?? [];
39066
+ },
39067
+ get expanded() {
39068
+ return props.expanded;
39069
+ },
39070
+ get onToggle() {
39071
+ return props.onToggle;
39072
+ }
39073
+ });
39074
+ }
39075
+ }), null);
38821
39076
  insert(_el$, createComponent2(Show, {
38822
39077
  get when() {
38823
39078
  return memo2(() => !!(!usesCustomBody() && !isReadGrepGlob() && !props.expanded && r2().done))() && r2().output !== undefined;
@@ -38903,7 +39158,7 @@ function ToolRow(props) {
38903
39158
  }
38904
39159
  }), null);
38905
39160
  effect((_p$) => {
38906
- var _v$5 = prefixColor(), _v$6 = TextAttributes34.BOLD;
39161
+ var _v$5 = prefixColor(), _v$6 = TextAttributes31.BOLD;
38907
39162
  _v$5 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$5, _p$.e));
38908
39163
  _v$6 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$6, _p$.t));
38909
39164
  return _p$;
@@ -39142,7 +39397,7 @@ function BashBanner(props) {
39142
39397
  }
39143
39398
  }), null);
39144
39399
  effect((_p$) => {
39145
- var _v$15 = theme.accent, _v$16 = TextAttributes34.BOLD, _v$17 = theme.text;
39400
+ var _v$15 = theme.accent, _v$16 = TextAttributes31.BOLD, _v$17 = theme.text;
39146
39401
  _v$15 !== _p$.e && (_p$.e = setProp(_el$42, "fg", _v$15, _p$.e));
39147
39402
  _v$16 !== _p$.t && (_p$.t = setProp(_el$42, "attributes", _v$16, _p$.t));
39148
39403
  _v$17 !== _p$.a && (_p$.a = setProp(_el$45, "fg", _v$17, _p$.a));
@@ -39230,7 +39485,7 @@ function ReadGrepGlobBanner(props) {
39230
39485
  }), null);
39231
39486
  effect((_p$) => {
39232
39487
  var _v$18 = theme.text, _v$19 = {
39233
- attributes: TextAttributes34.BOLD
39488
+ attributes: TextAttributes31.BOLD
39234
39489
  };
39235
39490
  _v$18 !== _p$.e && (_p$.e = setProp(_el$50, "fg", _v$18, _p$.e));
39236
39491
  _v$19 !== _p$.t && (_p$.t = setProp(_el$51, "style", _v$19, _p$.t));
@@ -39275,7 +39530,7 @@ function SubagentBanner(props) {
39275
39530
  }), null);
39276
39531
  effect((_p$) => {
39277
39532
  var _v$20 = theme.text, _v$21 = {
39278
- attributes: TextAttributes34.BOLD
39533
+ attributes: TextAttributes31.BOLD
39279
39534
  };
39280
39535
  _v$20 !== _p$.e && (_p$.e = setProp(_el$53, "fg", _v$20, _p$.e));
39281
39536
  _v$21 !== _p$.t && (_p$.t = setProp(_el$54, "style", _v$21, _p$.t));
@@ -39367,8 +39622,8 @@ function SubagentBody(props) {
39367
39622
  insert(_el$63, () => ch.name);
39368
39623
  insert(_el$64, () => `(${previewToolInput(ch.input)})`);
39369
39624
  effect((_p$) => {
39370
- var _v$22 = ch.done ? theme.success : theme.warning, _v$23 = TextAttributes34.BOLD, _v$24 = theme.text, _v$25 = {
39371
- attributes: TextAttributes34.BOLD
39625
+ var _v$22 = ch.done ? theme.success : theme.warning, _v$23 = TextAttributes31.BOLD, _v$24 = theme.text, _v$25 = {
39626
+ attributes: TextAttributes31.BOLD
39372
39627
  }, _v$26 = {
39373
39628
  fg: theme.textMuted
39374
39629
  };
@@ -39395,6 +39650,158 @@ function SubagentBody(props) {
39395
39650
  return _el$56;
39396
39651
  })();
39397
39652
  }
39653
+ function TodoSnapshotBanner(props) {
39654
+ const {
39655
+ theme
39656
+ } = useTheme();
39657
+ const summary = () => summarizeTodos(countTodos(props.items));
39658
+ return (() => {
39659
+ var _el$65 = createElement("text"), _el$66 = createElement("span"), _el$67 = createElement("span");
39660
+ insertNode(_el$65, _el$66);
39661
+ insertNode(_el$65, _el$67);
39662
+ setProp(_el$65, "wrapMode", "none");
39663
+ insert(_el$66, () => props.name);
39664
+ insert(_el$67, () => ` \xB7 ${summary()}`);
39665
+ effect((_p$) => {
39666
+ var _v$27 = theme.text, _v$28 = {
39667
+ attributes: TextAttributes31.BOLD
39668
+ }, _v$29 = {
39669
+ fg: theme.textMuted
39670
+ };
39671
+ _v$27 !== _p$.e && (_p$.e = setProp(_el$65, "fg", _v$27, _p$.e));
39672
+ _v$28 !== _p$.t && (_p$.t = setProp(_el$66, "style", _v$28, _p$.t));
39673
+ _v$29 !== _p$.a && (_p$.a = setProp(_el$67, "style", _v$29, _p$.a));
39674
+ return _p$;
39675
+ }, {
39676
+ e: undefined,
39677
+ t: undefined,
39678
+ a: undefined
39679
+ });
39680
+ return _el$65;
39681
+ })();
39682
+ }
39683
+ function TodoSnapshotBody(props) {
39684
+ const {
39685
+ theme
39686
+ } = useTheme();
39687
+ const items = () => props.items;
39688
+ const show5 = () => props.expanded;
39689
+ const colorFor = (status) => status === "completed" ? theme.success : status === "in_progress" ? theme.accent : status === "deleted" ? theme.error : theme.textMuted;
39690
+ const subjectAttrs = (status) => {
39691
+ if (status === "completed" || status === "deleted")
39692
+ return TextAttributes31.DIM | TextAttributes31.STRIKETHROUGH;
39693
+ if (status === "in_progress")
39694
+ return TextAttributes31.BOLD;
39695
+ return TextAttributes31.NONE;
39696
+ };
39697
+ return createComponent2(Show, {
39698
+ get when() {
39699
+ return memo2(() => !!show5())() && items().length > 0;
39700
+ },
39701
+ get children() {
39702
+ var _el$68 = createElement("box");
39703
+ setProp(_el$68, "paddingLeft", 2);
39704
+ setProp(_el$68, "flexDirection", "column");
39705
+ setProp(_el$68, "onMouseUp", () => props.onToggle());
39706
+ insert(_el$68, createComponent2(For, {
39707
+ get each() {
39708
+ return items();
39709
+ },
39710
+ children: (t2) => (() => {
39711
+ var _el$69 = createElement("box"), _el$70 = createElement("text"), _el$71 = createElement("box"), _el$72 = createElement("text");
39712
+ insertNode(_el$69, _el$70);
39713
+ insertNode(_el$69, _el$71);
39714
+ setProp(_el$69, "flexDirection", "row");
39715
+ setProp(_el$69, "gap", 1);
39716
+ setProp(_el$70, "wrapMode", "none");
39717
+ insert(_el$70, () => TODO_GLYPH[t2.status]);
39718
+ insertNode(_el$71, _el$72);
39719
+ setProp(_el$71, "flexGrow", 1);
39720
+ insert(_el$72, () => t2.displayText);
39721
+ effect((_p$) => {
39722
+ var _v$30 = colorFor(t2.status), _v$31 = t2.status === "pending" ? theme.text : colorFor(t2.status), _v$32 = subjectAttrs(t2.status);
39723
+ _v$30 !== _p$.e && (_p$.e = setProp(_el$70, "fg", _v$30, _p$.e));
39724
+ _v$31 !== _p$.t && (_p$.t = setProp(_el$72, "fg", _v$31, _p$.t));
39725
+ _v$32 !== _p$.a && (_p$.a = setProp(_el$72, "attributes", _v$32, _p$.a));
39726
+ return _p$;
39727
+ }, {
39728
+ e: undefined,
39729
+ t: undefined,
39730
+ a: undefined
39731
+ });
39732
+ return _el$69;
39733
+ })()
39734
+ }));
39735
+ return _el$68;
39736
+ }
39737
+ });
39738
+ }
39739
+ function TaskActionBanner(props) {
39740
+ const {
39741
+ theme
39742
+ } = useTheme();
39743
+ const summary = () => {
39744
+ const row = props.row;
39745
+ if (row.name === "TaskCreate") {
39746
+ const input = parseTaskCreateInput(row.input);
39747
+ return input ? `"${input.subject}"` : "";
39748
+ }
39749
+ if (row.name === "TaskUpdate") {
39750
+ const input = parseTaskUpdateInput(row.input);
39751
+ const output = parseTaskUpdateOutput(row.output);
39752
+ const id = input?.taskId ?? output?.taskId ?? "";
39753
+ const idChip = id ? `#${id}` : "";
39754
+ if (output?.error)
39755
+ return `${idChip} \xB7 ${output.error}`;
39756
+ if (output?.statusChange)
39757
+ return `${idChip} \xB7 ${output.statusChange.from} \u2192 ${output.statusChange.to}`;
39758
+ if (input?.status === "deleted")
39759
+ return `${idChip} \xB7 deleted`;
39760
+ if (input?.status)
39761
+ return `${idChip} \xB7 \u2192 ${input.status}`;
39762
+ if (output?.updatedFields.length)
39763
+ return `${idChip} \xB7 updated: ${output.updatedFields.join(", ")}`;
39764
+ return idChip;
39765
+ }
39766
+ if (row.name === "TaskGet") {
39767
+ const input = row.input;
39768
+ const id = input && typeof input === "object" && typeof input.taskId === "string" ? input.taskId : "";
39769
+ return id ? `#${id}` : "";
39770
+ }
39771
+ return "";
39772
+ };
39773
+ return (() => {
39774
+ var _el$73 = createElement("text"), _el$74 = createElement("span");
39775
+ insertNode(_el$73, _el$74);
39776
+ setProp(_el$73, "wrapMode", "none");
39777
+ insert(_el$74, () => props.row.name);
39778
+ insert(_el$73, createComponent2(Show, {
39779
+ get when() {
39780
+ return summary().length > 0;
39781
+ },
39782
+ get children() {
39783
+ var _el$75 = createElement("span");
39784
+ insert(_el$75, () => ` \xB7 ${summary()}`);
39785
+ effect((_$p) => setProp(_el$75, "style", {
39786
+ fg: theme.textMuted
39787
+ }, _$p));
39788
+ return _el$75;
39789
+ }
39790
+ }), null);
39791
+ effect((_p$) => {
39792
+ var _v$33 = theme.text, _v$34 = {
39793
+ attributes: TextAttributes31.BOLD
39794
+ };
39795
+ _v$33 !== _p$.e && (_p$.e = setProp(_el$73, "fg", _v$33, _p$.e));
39796
+ _v$34 !== _p$.t && (_p$.t = setProp(_el$74, "style", _v$34, _p$.t));
39797
+ return _p$;
39798
+ }, {
39799
+ e: undefined,
39800
+ t: undefined
39801
+ });
39802
+ return _el$73;
39803
+ })();
39804
+ }
39398
39805
  var init_ToolRow = __esm(() => {
39399
39806
  init_solid();
39400
39807
  init_solid();
@@ -39407,12 +39814,13 @@ var init_ToolRow = __esm(() => {
39407
39814
  init_dev();
39408
39815
  init_theme();
39409
39816
  init_message_figures();
39817
+ init_todo_render();
39410
39818
  init_tool_fold();
39411
39819
  init_tool_registry();
39412
39820
  });
39413
39821
 
39414
39822
  // src/tui/panes/chat/UserInputRows.tsx
39415
- import { TextAttributes as TextAttributes35 } from "@opentui/core";
39823
+ import { TextAttributes as TextAttributes32 } from "@opentui/core";
39416
39824
  function ApprovalRow(props) {
39417
39825
  const {
39418
39826
  theme
@@ -39491,7 +39899,7 @@ function ApprovalRow(props) {
39491
39899
  insertNode(_el$12, _el$14);
39492
39900
  insert(_el$12, () => r2().status, _el$14);
39493
39901
  effect((_p$) => {
39494
- var _v$9 = r2().status === "approved" ? theme.success : theme.error, _v$0 = TextAttributes35.BOLD;
39902
+ var _v$9 = r2().status === "approved" ? theme.success : theme.error, _v$0 = TextAttributes32.BOLD;
39495
39903
  _v$9 !== _p$.e && (_p$.e = setProp(_el$12, "fg", _v$9, _p$.e));
39496
39904
  _v$0 !== _p$.t && (_p$.t = setProp(_el$12, "attributes", _v$0, _p$.t));
39497
39905
  return _p$;
@@ -39508,7 +39916,7 @@ function ApprovalRow(props) {
39508
39916
  insertNode(_el$0, createTextNode(`[ Approve ]`));
39509
39917
  setProp(_el$0, "onMouseUp", () => props.onApprove(true));
39510
39918
  effect((_p$) => {
39511
- var _v$ = theme.success, _v$2 = TextAttributes35.BOLD;
39919
+ var _v$ = theme.success, _v$2 = TextAttributes32.BOLD;
39512
39920
  _v$ !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$, _p$.e));
39513
39921
  _v$2 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$2, _p$.t));
39514
39922
  return _p$;
@@ -39522,7 +39930,7 @@ function ApprovalRow(props) {
39522
39930
  insertNode(_el$10, createTextNode(`[ Reject ]`));
39523
39931
  setProp(_el$10, "onMouseUp", () => props.onApprove(false));
39524
39932
  effect((_p$) => {
39525
- var _v$3 = theme.error, _v$4 = TextAttributes35.BOLD;
39933
+ var _v$3 = theme.error, _v$4 = TextAttributes32.BOLD;
39526
39934
  _v$3 !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$3, _p$.e));
39527
39935
  _v$4 !== _p$.t && (_p$.t = setProp(_el$10, "attributes", _v$4, _p$.t));
39528
39936
  return _p$;
@@ -39535,7 +39943,7 @@ function ApprovalRow(props) {
39535
39943
  }
39536
39944
  }));
39537
39945
  effect((_p$) => {
39538
- var _v$5 = headerColor(), _v$6 = TextAttributes35.BOLD, _v$7 = headerColor(), _v$8 = TextAttributes35.BOLD;
39946
+ var _v$5 = headerColor(), _v$6 = TextAttributes32.BOLD, _v$7 = headerColor(), _v$8 = TextAttributes32.BOLD;
39539
39947
  _v$5 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$5, _p$.e));
39540
39948
  _v$6 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$6, _p$.t));
39541
39949
  _v$7 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$7, _p$.a));
@@ -39754,7 +40162,7 @@ function QuestionRow(props) {
39754
40162
  insertNode(_el$25, _el$27);
39755
40163
  insert(_el$25, () => q2.header, _el$27);
39756
40164
  effect((_p$) => {
39757
- var _v$15 = theme.accent, _v$16 = TextAttributes35.BOLD;
40165
+ var _v$15 = theme.accent, _v$16 = TextAttributes32.BOLD;
39758
40166
  _v$15 !== _p$.e && (_p$.e = setProp(_el$25, "fg", _v$15, _p$.e));
39759
40167
  _v$16 !== _p$.t && (_p$.t = setProp(_el$25, "attributes", _v$16, _p$.t));
39760
40168
  return _p$;
@@ -39868,7 +40276,7 @@ function QuestionRow(props) {
39868
40276
  }
39869
40277
  }), null);
39870
40278
  effect((_p$) => {
39871
- var _v$21 = isHl() ? theme.accent : theme.textMuted, _v$22 = TextAttributes35.BOLD, _v$23 = theme.textMuted, _v$24 = isPicked() ? theme.accent : theme.textMuted, _v$25 = TextAttributes35.BOLD, _v$26 = theme.text;
40279
+ var _v$21 = isHl() ? theme.accent : theme.textMuted, _v$22 = TextAttributes32.BOLD, _v$23 = theme.textMuted, _v$24 = isPicked() ? theme.accent : theme.textMuted, _v$25 = TextAttributes32.BOLD, _v$26 = theme.text;
39872
40280
  _v$21 !== _p$.e && (_p$.e = setProp(_el$43, "fg", _v$21, _p$.e));
39873
40281
  _v$22 !== _p$.t && (_p$.t = setProp(_el$43, "attributes", _v$22, _p$.t));
39874
40282
  _v$23 !== _p$.a && (_p$.a = setProp(_el$44, "fg", _v$23, _p$.a));
@@ -39913,7 +40321,7 @@ function QuestionRow(props) {
39913
40321
  insertNode(_el$54, createTextNode(`Other`));
39914
40322
  insertNode(_el$56, createTextNode(`Type your own answer`));
39915
40323
  effect((_p$) => {
39916
- var _v$27 = isOtherHl() ? theme.accent : theme.textMuted, _v$28 = TextAttributes35.BOLD, _v$29 = theme.textMuted, _v$30 = otherPicked() ? theme.accent : theme.textMuted, _v$31 = TextAttributes35.BOLD, _v$32 = theme.text, _v$33 = theme.textMuted;
40324
+ var _v$27 = isOtherHl() ? theme.accent : theme.textMuted, _v$28 = TextAttributes32.BOLD, _v$29 = theme.textMuted, _v$30 = otherPicked() ? theme.accent : theme.textMuted, _v$31 = TextAttributes32.BOLD, _v$32 = theme.text, _v$33 = theme.textMuted;
39917
40325
  _v$27 !== _p$.e && (_p$.e = setProp(_el$50, "fg", _v$27, _p$.e));
39918
40326
  _v$28 !== _p$.t && (_p$.t = setProp(_el$50, "attributes", _v$28, _p$.t));
39919
40327
  _v$29 !== _p$.a && (_p$.a = setProp(_el$51, "fg", _v$29, _p$.a));
@@ -39969,7 +40377,7 @@ function QuestionRow(props) {
39969
40377
  }
39970
40378
  }), null);
39971
40379
  effect((_p$) => {
39972
- var _v$17 = isQuestionComplete(index()) ? theme.success : theme.textMuted, _v$18 = TextAttributes35.BOLD;
40380
+ var _v$17 = isQuestionComplete(index()) ? theme.success : theme.textMuted, _v$18 = TextAttributes32.BOLD;
39973
40381
  _v$17 !== _p$.e && (_p$.e = setProp(_el$39, "fg", _v$17, _p$.e));
39974
40382
  _v$18 !== _p$.t && (_p$.t = setProp(_el$39, "attributes", _v$18, _p$.t));
39975
40383
  return _p$;
@@ -40005,7 +40413,7 @@ function QuestionRow(props) {
40005
40413
  setProp(_el$20, "paddingTop", 1);
40006
40414
  insertNode(_el$21, createTextNode(`[submitted]`));
40007
40415
  effect((_p$) => {
40008
- var _v$1 = theme.success, _v$10 = TextAttributes35.BOLD;
40416
+ var _v$1 = theme.success, _v$10 = TextAttributes32.BOLD;
40009
40417
  _v$1 !== _p$.e && (_p$.e = setProp(_el$21, "fg", _v$1, _p$.e));
40010
40418
  _v$10 !== _p$.t && (_p$.t = setProp(_el$21, "attributes", _v$10, _p$.t));
40011
40419
  return _p$;
@@ -40017,7 +40425,7 @@ function QuestionRow(props) {
40017
40425
  }
40018
40426
  }), null);
40019
40427
  effect((_p$) => {
40020
- var _v$11 = theme.warning, _v$12 = TextAttributes35.BOLD, _v$13 = theme.warning, _v$14 = TextAttributes35.BOLD;
40428
+ var _v$11 = theme.warning, _v$12 = TextAttributes32.BOLD, _v$13 = theme.warning, _v$14 = TextAttributes32.BOLD;
40021
40429
  _v$11 !== _p$.e && (_p$.e = setProp(_el$17, "fg", _v$11, _p$.e));
40022
40430
  _v$12 !== _p$.t && (_p$.t = setProp(_el$17, "attributes", _v$12, _p$.t));
40023
40431
  _v$13 !== _p$.a && (_p$.a = setProp(_el$19, "fg", _v$13, _p$.a));
@@ -40144,6 +40552,12 @@ function MessageList(props) {
40144
40552
  return row.text;
40145
40553
  }
40146
40554
  });
40555
+ if (row.kind === "recap")
40556
+ return createComponent2(RecapRow, {
40557
+ get text() {
40558
+ return row.text;
40559
+ }
40560
+ });
40147
40561
  if (row.kind === "bash")
40148
40562
  return createComponent2(BashRow, {
40149
40563
  row
@@ -40172,6 +40586,9 @@ function MessageList(props) {
40172
40586
  get expanded() {
40173
40587
  return props.expandedToolIndex === i2;
40174
40588
  },
40589
+ get roundedItems() {
40590
+ return props.roundedSnapshots.get(i2);
40591
+ },
40175
40592
  onToggle: () => props.onToggleTool(i2)
40176
40593
  });
40177
40594
  }
@@ -40197,10 +40614,164 @@ var init_MessageList = __esm(() => {
40197
40614
  init_tool_registry();
40198
40615
  });
40199
40616
 
40617
+ // src/tui/panes/chat/TodoStatusLine.tsx
40618
+ import { TextAttributes as TextAttributes33 } from "@opentui/core";
40619
+ function TodoStatusLine(props) {
40620
+ const {
40621
+ theme
40622
+ } = useTheme();
40623
+ const items = createMemo(() => {
40624
+ props.messages;
40625
+ const snapshots = props.roundedSnapshots;
40626
+ let latest = [];
40627
+ for (const entry of snapshots.values())
40628
+ latest = entry;
40629
+ return latest;
40630
+ });
40631
+ const allDone = createMemo(() => {
40632
+ const list = items();
40633
+ if (list.length === 0)
40634
+ return false;
40635
+ return list.every((t2) => t2.status === "completed" || t2.status === "deleted");
40636
+ });
40637
+ const [graceExpired, setGraceExpired] = createSignal(false);
40638
+ createEffect(() => {
40639
+ if (!allDone()) {
40640
+ setGraceExpired(false);
40641
+ return;
40642
+ }
40643
+ setGraceExpired(false);
40644
+ const handle = setTimeout(() => setGraceExpired(true), ALL_DONE_GRACE_MS);
40645
+ onCleanup(() => clearTimeout(handle));
40646
+ });
40647
+ const visible = () => items().length > 0 && !(allDone() && graceExpired());
40648
+ const sortedItems = createMemo(() => {
40649
+ return [...items()].sort((a2, b2) => {
40650
+ const an = Number.parseInt(a2.key, 10);
40651
+ const bn = Number.parseInt(b2.key, 10);
40652
+ if (!Number.isNaN(an) && !Number.isNaN(bn))
40653
+ return an - bn;
40654
+ return a2.key.localeCompare(b2.key);
40655
+ });
40656
+ });
40657
+ const counts = createMemo(() => countTodos(items()));
40658
+ const cleanText = (item) => item.displayText.replace(/\s+\[#[^\]]+\]\s*$/, "");
40659
+ const iconColor = (status) => status === "completed" ? theme.success : status === "in_progress" ? theme.accent : status === "deleted" ? theme.error : theme.text;
40660
+ const subjectAttrs = (status) => {
40661
+ if (status === "completed" || status === "deleted")
40662
+ return TextAttributes33.DIM | TextAttributes33.STRIKETHROUGH;
40663
+ if (status === "in_progress")
40664
+ return TextAttributes33.BOLD;
40665
+ return TextAttributes33.NONE;
40666
+ };
40667
+ return createComponent2(Show, {
40668
+ get when() {
40669
+ return visible();
40670
+ },
40671
+ get children() {
40672
+ var _el$ = createElement("box"), _el$2 = createElement("text"), _el$3 = createElement("span"), _el$4 = createTextNode(` tasks (`), _el$5 = createElement("span"), _el$6 = createTextNode(` done, `), _el$8 = createElement("span"), _el$9 = createTextNode(` open)`);
40673
+ insertNode(_el$, _el$2);
40674
+ setProp(_el$, "flexDirection", "column");
40675
+ setProp(_el$, "flexShrink", 0);
40676
+ setProp(_el$, "paddingLeft", 2);
40677
+ setProp(_el$, "paddingTop", 1);
40678
+ insertNode(_el$2, _el$3);
40679
+ insertNode(_el$2, _el$4);
40680
+ insertNode(_el$2, _el$5);
40681
+ insertNode(_el$2, _el$6);
40682
+ insertNode(_el$2, _el$8);
40683
+ insertNode(_el$2, _el$9);
40684
+ insert(_el$3, () => counts().total);
40685
+ insert(_el$5, () => counts().done);
40686
+ insert(_el$2, createComponent2(Show, {
40687
+ get when() {
40688
+ return counts().inProgress > 0;
40689
+ },
40690
+ get children() {
40691
+ return [(() => {
40692
+ var _el$7 = createElement("span");
40693
+ insert(_el$7, () => counts().inProgress);
40694
+ effect((_$p) => setProp(_el$7, "style", {
40695
+ attributes: TextAttributes33.BOLD
40696
+ }, _$p));
40697
+ return _el$7;
40698
+ })(), " in progress, "];
40699
+ }
40700
+ }), _el$8);
40701
+ insert(_el$8, () => counts().pending);
40702
+ insert(_el$, createComponent2(For, {
40703
+ get each() {
40704
+ return sortedItems();
40705
+ },
40706
+ children: (t2) => (() => {
40707
+ var _el$0 = createElement("box"), _el$1 = createElement("box"), _el$10 = createElement("text"), _el$11 = createElement("box"), _el$12 = createElement("text");
40708
+ insertNode(_el$0, _el$1);
40709
+ insertNode(_el$0, _el$11);
40710
+ setProp(_el$0, "flexDirection", "row");
40711
+ setProp(_el$0, "gap", 1);
40712
+ insertNode(_el$1, _el$10);
40713
+ setProp(_el$1, "width", 1);
40714
+ setProp(_el$1, "height", 1);
40715
+ insert(_el$10, () => TODO_GLYPH[t2.status]);
40716
+ insertNode(_el$11, _el$12);
40717
+ setProp(_el$11, "flexGrow", 1);
40718
+ insert(_el$12, () => cleanText(t2));
40719
+ effect((_p$) => {
40720
+ var _v$5 = iconColor(t2.status), _v$6 = t2.status === "pending" ? theme.text : iconColor(t2.status), _v$7 = subjectAttrs(t2.status);
40721
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$5, _p$.e));
40722
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$12, "fg", _v$6, _p$.t));
40723
+ _v$7 !== _p$.a && (_p$.a = setProp(_el$12, "attributes", _v$7, _p$.a));
40724
+ return _p$;
40725
+ }, {
40726
+ e: undefined,
40727
+ t: undefined,
40728
+ a: undefined
40729
+ });
40730
+ return _el$0;
40731
+ })()
40732
+ }), null);
40733
+ effect((_p$) => {
40734
+ var _v$ = theme.textMuted, _v$2 = {
40735
+ attributes: TextAttributes33.BOLD
40736
+ }, _v$3 = {
40737
+ attributes: TextAttributes33.BOLD
40738
+ }, _v$4 = {
40739
+ attributes: TextAttributes33.BOLD
40740
+ };
40741
+ _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
40742
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "style", _v$2, _p$.t));
40743
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "style", _v$3, _p$.a));
40744
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$8, "style", _v$4, _p$.o));
40745
+ return _p$;
40746
+ }, {
40747
+ e: undefined,
40748
+ t: undefined,
40749
+ a: undefined,
40750
+ o: undefined
40751
+ });
40752
+ return _el$;
40753
+ }
40754
+ });
40755
+ }
40756
+ var ALL_DONE_GRACE_MS = 5000;
40757
+ var init_TodoStatusLine = __esm(() => {
40758
+ init_solid();
40759
+ init_solid();
40760
+ init_solid();
40761
+ init_solid();
40762
+ init_solid();
40763
+ init_solid();
40764
+ init_solid();
40765
+ init_dev();
40766
+ init_theme();
40767
+ init_todo_render();
40768
+ });
40769
+
40200
40770
  // src/tui/panes/chat/ChatView.tsx
40201
- import { TextAttributes as TextAttributes36 } from "@opentui/core";
40771
+ import { TextAttributes as TextAttributes34 } from "@opentui/core";
40202
40772
  function ChatView(props) {
40203
40773
  const theme = props.theme;
40774
+ const roundedSnapshots = createMemo(() => computeRoundedSnapshots(props.messages));
40204
40775
  return (() => {
40205
40776
  var _el$ = createElement("box");
40206
40777
  setProp(_el$, "flexGrow", 1);
@@ -40240,6 +40811,9 @@ function ChatView(props) {
40240
40811
  get messages() {
40241
40812
  return props.messages;
40242
40813
  },
40814
+ get roundedSnapshots() {
40815
+ return roundedSnapshots();
40816
+ },
40243
40817
  get expandedToolIndex() {
40244
40818
  return props.expandedToolIndex;
40245
40819
  },
@@ -40267,7 +40841,37 @@ function ChatView(props) {
40267
40841
  get chatFocused() {
40268
40842
  return props.chatFocused;
40269
40843
  }
40270
- }));
40844
+ }), null);
40845
+ insert(_el$6, createComponent2(Show, {
40846
+ get when() {
40847
+ return memo2(() => !!props.showThinking)() && props.hasTaskId;
40848
+ },
40849
+ get children() {
40850
+ return createComponent2(Loading, {
40851
+ get startedAt() {
40852
+ return props.loadingStartedAt;
40853
+ },
40854
+ get responseChars() {
40855
+ return props.currentTurnChars;
40856
+ }
40857
+ });
40858
+ }
40859
+ }), null);
40860
+ insert(_el$6, createComponent2(Show, {
40861
+ get when() {
40862
+ return props.hasTaskId;
40863
+ },
40864
+ get children() {
40865
+ return createComponent2(TodoStatusLine, {
40866
+ get messages() {
40867
+ return props.messages;
40868
+ },
40869
+ get roundedSnapshots() {
40870
+ return roundedSnapshots();
40871
+ }
40872
+ });
40873
+ }
40874
+ }), null);
40271
40875
  effect((_$p) => setProp(_el$5, "verticalScrollbarOptions", {
40272
40876
  trackOptions: {
40273
40877
  backgroundColor: theme.background,
@@ -40277,21 +40881,6 @@ function ChatView(props) {
40277
40881
  return _el$5;
40278
40882
  }
40279
40883
  }), null);
40280
- insert(_el$, createComponent2(Show, {
40281
- get when() {
40282
- return memo2(() => !!props.showThinking)() && props.hasTaskId;
40283
- },
40284
- get children() {
40285
- return createComponent2(Loading, {
40286
- get startedAt() {
40287
- return props.loadingStartedAt;
40288
- },
40289
- get responseChars() {
40290
- return props.currentTurnChars;
40291
- }
40292
- });
40293
- }
40294
- }), null);
40295
40884
  insert(_el$, createComponent2(Show, {
40296
40885
  get when() {
40297
40886
  return props.error;
@@ -40313,7 +40902,7 @@ function ChatView(props) {
40313
40902
  setProp(_el$10, "wrapMode", "none");
40314
40903
  insert(_el$10, err);
40315
40904
  effect((_p$) => {
40316
- var { backgroundElement: _v$, warning: _v$2 } = theme, _v$3 = TextAttributes36.BOLD, _v$4 = theme.warning, _v$5 = theme.textMuted;
40905
+ var { backgroundElement: _v$, warning: _v$2 } = theme, _v$3 = TextAttributes34.BOLD, _v$4 = theme.warning, _v$5 = theme.textMuted;
40317
40906
  _v$ !== _p$.e && (_p$.e = setProp(_el$7, "backgroundColor", _v$, _p$.e));
40318
40907
  _v$2 !== _p$.t && (_p$.t = setProp(_el$8, "fg", _v$2, _p$.t));
40319
40908
  _v$3 !== _p$.a && (_p$.a = setProp(_el$8, "attributes", _v$3, _p$.a));
@@ -40330,21 +40919,6 @@ function ChatView(props) {
40330
40919
  return _el$7;
40331
40920
  })()
40332
40921
  }), null);
40333
- insert(_el$, createComponent2(Show, {
40334
- get when() {
40335
- return memo2(() => !!(props.hasTaskId && props.backgroundRows))() && props.onOpenBackgroundTasks;
40336
- },
40337
- get children() {
40338
- return createComponent2(BackgroundRunsLine, {
40339
- get rows() {
40340
- return props.backgroundRows;
40341
- },
40342
- get onActivate() {
40343
- return props.onOpenBackgroundTasks;
40344
- }
40345
- });
40346
- }
40347
- }), null);
40348
40922
  insert(_el$, createComponent2(Show, {
40349
40923
  get when() {
40350
40924
  return props.showComposer;
@@ -40449,10 +41023,12 @@ var init_ChatView = __esm(() => {
40449
41023
  init_solid();
40450
41024
  init_solid();
40451
41025
  init_dev();
40452
- init_BackgroundRunsLine();
41026
+ init_dev();
40453
41027
  init_Composer();
40454
41028
  init_Loading();
40455
41029
  init_MessageList();
41030
+ init_TodoStatusLine();
41031
+ init_todo_render();
40456
41032
  });
40457
41033
 
40458
41034
  // src/tui/panes/chat/chat-utils.ts
@@ -40502,7 +41078,7 @@ function stringifyErr5(err) {
40502
41078
  }
40503
41079
 
40504
41080
  // src/tui/panes/chat/composer/ModelPicker.tsx
40505
- import { TextAttributes as TextAttributes37 } from "@opentui/core";
41081
+ import { TextAttributes as TextAttributes35 } from "@opentui/core";
40506
41082
  function ModelPicker(props) {
40507
41083
  const dialog = useDialog();
40508
41084
  const {
@@ -40693,7 +41269,7 @@ function ModelPicker(props) {
40693
41269
  })() : null;
40694
41270
  })(), null);
40695
41271
  effect((_p$) => {
40696
- var _v$8 = active() ? theme.primary : undefined, _v$9 = active() ? theme.selectedListItemText : theme.text, _v$0 = active() ? TextAttributes37.BOLD : undefined;
41272
+ var _v$8 = active() ? theme.primary : undefined, _v$9 = active() ? theme.selectedListItemText : theme.text, _v$0 = active() ? TextAttributes35.BOLD : undefined;
40697
41273
  _v$8 !== _p$.e && (_p$.e = setProp(_el$11, "backgroundColor", _v$8, _p$.e));
40698
41274
  _v$9 !== _p$.t && (_p$.t = setProp(_el$12, "fg", _v$9, _p$.t));
40699
41275
  _v$0 !== _p$.a && (_p$.a = setProp(_el$12, "attributes", _v$0, _p$.a));
@@ -40708,7 +41284,7 @@ function ModelPicker(props) {
40708
41284
  }
40709
41285
  }), null);
40710
41286
  effect((_p$) => {
40711
- var { textMuted: _v$5, text: _v$6 } = theme, _v$7 = TextAttributes37.BOLD;
41287
+ var { textMuted: _v$5, text: _v$6 } = theme, _v$7 = TextAttributes35.BOLD;
40712
41288
  _v$5 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$5, _p$.e));
40713
41289
  _v$6 !== _p$.t && (_p$.t = setProp(_el$10, "fg", _v$6, _p$.t));
40714
41290
  _v$7 !== _p$.a && (_p$.a = setProp(_el$10, "attributes", _v$7, _p$.a));
@@ -40788,7 +41364,7 @@ function ModelPicker(props) {
40788
41364
  })() : null;
40789
41365
  })(), null);
40790
41366
  effect((_p$) => {
40791
- var _v$1 = active() && !disabled() ? theme.primary : undefined, _v$10 = active() && !disabled() ? theme.selectedListItemText : disabled() ? theme.textMuted : theme.text, _v$11 = active() && !disabled() ? TextAttributes37.BOLD : undefined, _v$12 = active() && !disabled() ? theme.selectedListItemText : theme.textMuted;
41367
+ var _v$1 = active() && !disabled() ? theme.primary : undefined, _v$10 = active() && !disabled() ? theme.selectedListItemText : disabled() ? theme.textMuted : theme.text, _v$11 = active() && !disabled() ? TextAttributes35.BOLD : undefined, _v$12 = active() && !disabled() ? theme.selectedListItemText : theme.textMuted;
40792
41368
  _v$1 !== _p$.e && (_p$.e = setProp(_el$15, "backgroundColor", _v$1, _p$.e));
40793
41369
  _v$10 !== _p$.t && (_p$.t = setProp(_el$16, "fg", _v$10, _p$.t));
40794
41370
  _v$11 !== _p$.a && (_p$.a = setProp(_el$16, "attributes", _v$11, _p$.a));
@@ -40811,7 +41387,7 @@ function ModelPicker(props) {
40811
41387
  setProp(_el$6, "paddingBottom", 1);
40812
41388
  insert(_el$7, () => inEffortStep() ? "\u2191\u2193 pick \xB7 enter select \xB7 h back \xB7 esc cancel" : "\u2191\u2193 pick \xB7 enter select \xB7 esc cancel");
40813
41389
  effect((_p$) => {
40814
- var _v$ = TextAttributes37.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
41390
+ var _v$ = TextAttributes35.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
40815
41391
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
40816
41392
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
40817
41393
  _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$3, _p$.a));
@@ -41289,6 +41865,11 @@ function applyEvent(state, ev, nowIso = new Date().toISOString()) {
41289
41865
  };
41290
41866
  case "chat.tab.cleared":
41291
41867
  return createInitialState();
41868
+ case "recap":
41869
+ return {
41870
+ ...state,
41871
+ messages: capMessages([...state.messages, { kind: "recap", text: ev.text, ts: nowIso }], nowIso)
41872
+ };
41292
41873
  case "user_input.request": {
41293
41874
  if (ev.payload.kind === "approve_plan") {
41294
41875
  return {
@@ -41654,6 +42235,18 @@ var init_use_bash_mode = __esm(() => {
41654
42235
  });
41655
42236
 
41656
42237
  // src/tui/panes/chat/use-chat-session.ts
42238
+ function hasRecapSinceLastUserTurn(messages) {
42239
+ for (let i2 = messages.length - 1;i2 >= 0; i2--) {
42240
+ const r2 = messages[i2];
42241
+ if (r2 === undefined)
42242
+ continue;
42243
+ if (r2.kind === "user")
42244
+ return false;
42245
+ if (r2.kind === "recap")
42246
+ return true;
42247
+ }
42248
+ return false;
42249
+ }
41657
42250
  function useChatSession(opts) {
41658
42251
  const { orchestrator, onTaskReset } = opts;
41659
42252
  const [activeTabId, setActiveTabIdLocal] = createSignal(null);
@@ -41781,6 +42374,11 @@ function useChatSession(opts) {
41781
42374
  next.delete(tabId);
41782
42375
  return next;
41783
42376
  });
42377
+ const pendingTimer = recapTimers.get(tabId);
42378
+ if (pendingTimer) {
42379
+ clearTimeout(pendingTimer);
42380
+ recapTimers.delete(tabId);
42381
+ }
41784
42382
  }
41785
42383
  }
41786
42384
  createEffect(() => {
@@ -41811,6 +42409,38 @@ function useChatSession(opts) {
41811
42409
  }
41812
42410
  syncTabSubs(id, live.tabs);
41813
42411
  });
42412
+ let prevActiveTabIdForRecap = null;
42413
+ createEffect(() => {
42414
+ const incoming = activeTabId();
42415
+ const prev = prevActiveTabIdForRecap;
42416
+ if (incoming !== null && incoming !== prev) {
42417
+ const t2 = recapTimers.get(incoming);
42418
+ if (t2) {
42419
+ clearTimeout(t2);
42420
+ recapTimers.delete(incoming);
42421
+ }
42422
+ }
42423
+ if (prev !== null && prev !== incoming) {
42424
+ const leftTabId = prev;
42425
+ const existing = recapTimers.get(leftTabId);
42426
+ if (existing)
42427
+ clearTimeout(existing);
42428
+ const timer = setTimeout(() => {
42429
+ recapTimers.delete(leftTabId);
42430
+ const owningTask = orchestrator.tasksSignal()().find((t2) => t2.tabs.some((tb) => tb.id === leftTabId));
42431
+ if (!owningTask)
42432
+ return;
42433
+ const liveState = statesByTab().get(leftTabId);
42434
+ if (liveState?.isStreaming)
42435
+ return;
42436
+ if (hasRecapSinceLastUserTurn(liveState?.messages ?? []))
42437
+ return;
42438
+ orchestrator.generateRecap(owningTask.id, leftTabId).catch(() => {});
42439
+ }, RECAP_AUTO_TRIGGER_MS);
42440
+ recapTimers.set(leftTabId, timer);
42441
+ }
42442
+ prevActiveTabIdForRecap = incoming;
42443
+ });
41814
42444
  onCleanup(() => {
41815
42445
  teardownAllSubs();
41816
42446
  });
@@ -41828,13 +42458,15 @@ function useChatSession(opts) {
41828
42458
  setDraft
41829
42459
  };
41830
42460
  }
41831
- var draftsByTab, setDraftsByTab, statesByTab, setStatesByTab;
42461
+ var draftsByTab, setDraftsByTab, statesByTab, setStatesByTab, RECAP_AUTO_TRIGGER_MS, recapTimers;
41832
42462
  var init_use_chat_session = __esm(() => {
41833
42463
  init_dev();
41834
42464
  init_core();
41835
42465
  init_store2();
41836
42466
  [draftsByTab, setDraftsByTab] = createSignal(new Map);
41837
42467
  [statesByTab, setStatesByTab] = createSignal(new Map);
42468
+ RECAP_AUTO_TRIGGER_MS = 5 * 60000;
42469
+ recapTimers = new Map;
41838
42470
  });
41839
42471
 
41840
42472
  // src/tui/component/resume-dialog-labels.ts
@@ -41846,7 +42478,7 @@ var init_resume_dialog_labels = __esm(() => {
41846
42478
  });
41847
42479
 
41848
42480
  // src/tui/component/resume-dialog.tsx
41849
- import { TextAttributes as TextAttributes38 } from "@opentui/core";
42481
+ import { TextAttributes as TextAttributes36 } from "@opentui/core";
41850
42482
  function ResumeDialog(props) {
41851
42483
  const dialog = useDialog();
41852
42484
  const {
@@ -42002,7 +42634,7 @@ function ResumeDialog(props) {
42002
42634
  setProp(_el$9, "paddingBottom", 1);
42003
42635
  insertNode(_el$0, createTextNode(`j/k or \u2191\u2193 navigate \u2022 enter resume \u2022 esc dismiss`));
42004
42636
  effect((_p$) => {
42005
- var _v$ = TextAttributes38.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
42637
+ var _v$ = TextAttributes36.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
42006
42638
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
42007
42639
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
42008
42640
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -42180,6 +42812,13 @@ function Chat(props) {
42180
42812
  onSelect: () => {
42181
42813
  send2("/clear");
42182
42814
  }
42815
+ }, {
42816
+ display: "/recap",
42817
+ description: "1-3 sentence recap of this tab \u2014 high-level task + next step",
42818
+ source: "builtin",
42819
+ onSelect: () => {
42820
+ send2("/recap");
42821
+ }
42183
42822
  }];
42184
42823
  return [...kobeEntries, ...engineEntries].sort((a2, b2) => a2.display.localeCompare(b2.display));
42185
42824
  });
@@ -42505,6 +43144,15 @@ function Chat(props) {
42505
43144
  }
42506
43145
  return;
42507
43146
  }
43147
+ if (text === "/recap") {
43148
+ setDraft("");
43149
+ try {
43150
+ await props.orchestrator.generateRecap(taskId, tabId);
43151
+ } catch (err) {
43152
+ patchActiveState((s2) => pushSystemError(s2, `/recap failed: ${stringifyErr5(err)}`));
43153
+ }
43154
+ return;
43155
+ }
42508
43156
  const streaming = activeState().isStreaming;
42509
43157
  const immediate = !streaming || mode === "steer";
42510
43158
  const bashPrefix = immediate ? drainBashContextPrefix() : "";
@@ -42782,13 +43430,7 @@ function Chat(props) {
42782
43430
  onEditQueued: editQueued,
42783
43431
  editingQueueId,
42784
43432
  taskLabelForHistoryKey,
42785
- currentProjectRoot,
42786
- get backgroundRows() {
42787
- return props.backgroundRows;
42788
- },
42789
- get onOpenBackgroundTasks() {
42790
- return props.onOpenBackgroundTasks;
42791
- }
43433
+ currentProjectRoot
42792
43434
  });
42793
43435
  }
42794
43436
  var init_Chat = __esm(() => {
@@ -42809,7 +43451,7 @@ var init_Chat = __esm(() => {
42809
43451
  });
42810
43452
 
42811
43453
  // src/tui/component/sidebar.tsx
42812
- import { TextAttributes as TextAttributes39 } from "@opentui/core";
43454
+ import { TextAttributes as TextAttributes37 } from "@opentui/core";
42813
43455
  function Sidebar(props) {
42814
43456
  const {
42815
43457
  theme
@@ -42835,7 +43477,7 @@ function Sidebar(props) {
42835
43477
  setProp(_el$2, "paddingBottom", 1);
42836
43478
  insert(_el$3, () => props.title);
42837
43479
  effect((_p$) => {
42838
- var _v$ = theme.text, _v$2 = TextAttributes39.BOLD;
43480
+ var _v$ = theme.text, _v$2 = TextAttributes37.BOLD;
42839
43481
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
42840
43482
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
42841
43483
  return _p$;
@@ -43180,7 +43822,7 @@ var init_worktree_changes = __esm(() => {
43180
43822
  });
43181
43823
 
43182
43824
  // src/tui/panes/sidebar/Sidebar.tsx
43183
- import { TextAttributes as TextAttributes40 } from "@opentui/core";
43825
+ import { TextAttributes as TextAttributes38 } from "@opentui/core";
43184
43826
  function Sidebar2(props) {
43185
43827
  const {
43186
43828
  theme
@@ -43234,6 +43876,7 @@ function Sidebar2(props) {
43234
43876
  onCleanup(() => clearInterval(spinnerInterval));
43235
43877
  const rows = createMemo(() => buildRows(props.tasks(), view(), searchMode() ? searchQuery() : ""));
43236
43878
  const flatIds = createMemo(() => flattenIds(rows()));
43879
+ const totalRows = createMemo(() => flattenIds(buildRows(props.tasks(), view(), "")).length);
43237
43880
  const [cursorIndex, setCursorIndex] = createSignal(-1);
43238
43881
  createEffect(on(() => [props.selectedId(), flatIds()], ([id, ids]) => {
43239
43882
  const cur = untrack(cursorIndex);
@@ -43287,11 +43930,11 @@ function Sidebar2(props) {
43287
43930
  onSearchExit: (select) => exitSearch(select)
43288
43931
  });
43289
43932
  return (() => {
43290
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$14 = createElement("box"), _el$15 = createElement("scrollbox"), _el$16 = createElement("box"), _el$19 = createElement("box"), _el$20 = createElement("text");
43933
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$17 = createElement("box"), _el$18 = createElement("scrollbox"), _el$19 = createElement("box"), _el$22 = createElement("box"), _el$23 = createElement("text");
43291
43934
  insertNode(_el$, _el$2);
43292
- insertNode(_el$, _el$14);
43293
- insertNode(_el$, _el$15);
43294
- insertNode(_el$, _el$19);
43935
+ insertNode(_el$, _el$17);
43936
+ insertNode(_el$, _el$18);
43937
+ insertNode(_el$, _el$22);
43295
43938
  setProp(_el$, "flexShrink", 0);
43296
43939
  setProp(_el$, "flexDirection", "column");
43297
43940
  setProp(_el$, "paddingTop", 1);
@@ -43339,8 +43982,23 @@ function Sidebar2(props) {
43339
43982
  return _el$11;
43340
43983
  }
43341
43984
  }), null);
43985
+ insert(_el$7, createComponent2(Show, {
43986
+ get when() {
43987
+ return searchQuery().length > 0;
43988
+ },
43989
+ get children() {
43990
+ var _el$14 = createElement("text"), _el$15 = createTextNode(` `), _el$16 = createTextNode(`/`);
43991
+ insertNode(_el$14, _el$15);
43992
+ insertNode(_el$14, _el$16);
43993
+ setProp(_el$14, "wrapMode", "none");
43994
+ insert(_el$14, () => flatIds().length, _el$16);
43995
+ insert(_el$14, totalRows, null);
43996
+ effect((_$p) => setProp(_el$14, "fg", theme.textMuted, _$p));
43997
+ return _el$14;
43998
+ }
43999
+ }), null);
43342
44000
  effect((_p$) => {
43343
- var { info: _v$, text: _v$2, info: _v$3 } = theme, _v$4 = TextAttributes40.BLINK;
44001
+ var { info: _v$, text: _v$2, info: _v$3 } = theme, _v$4 = TextAttributes38.BLINK;
43344
44002
  _v$ !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$, _p$.e));
43345
44003
  _v$2 !== _p$.t && (_p$.t = setProp(_el$0, "fg", _v$2, _p$.t));
43346
44004
  _v$3 !== _p$.a && (_p$.a = setProp(_el$1, "fg", _v$3, _p$.a));
@@ -43354,47 +44012,47 @@ function Sidebar2(props) {
43354
44012
  });
43355
44013
  return _el$7;
43356
44014
  }
43357
- }), _el$14);
43358
- setProp(_el$14, "flexDirection", "row");
43359
- setProp(_el$14, "gap", 2);
43360
- setProp(_el$14, "paddingBottom", 1);
43361
- setProp(_el$14, "paddingLeft", 1);
43362
- insert(_el$14, createComponent2(For, {
44015
+ }), _el$17);
44016
+ setProp(_el$17, "flexDirection", "row");
44017
+ setProp(_el$17, "gap", 2);
44018
+ setProp(_el$17, "paddingBottom", 1);
44019
+ setProp(_el$17, "paddingLeft", 1);
44020
+ insert(_el$17, createComponent2(For, {
43363
44021
  each: VIEW_TABS,
43364
44022
  children: (tab) => {
43365
44023
  const active = () => view() === tab.view;
43366
44024
  return (() => {
43367
- var _el$22 = createElement("text");
43368
- setProp(_el$22, "wrapMode", "none");
43369
- setProp(_el$22, "onMouseUp", () => setView(tab.view));
43370
- insert(_el$22, (() => {
44025
+ var _el$25 = createElement("text");
44026
+ setProp(_el$25, "wrapMode", "none");
44027
+ setProp(_el$25, "onMouseUp", () => setView(tab.view));
44028
+ insert(_el$25, (() => {
43371
44029
  var _c$2 = memo2(() => !!active());
43372
44030
  return () => _c$2() ? `[ ${tab.label} ]` : tab.label;
43373
44031
  })());
43374
44032
  effect((_p$) => {
43375
- var _v$1 = active() ? theme.primary : theme.textMuted, _v$10 = active() ? TextAttributes40.BOLD : undefined;
43376
- _v$1 !== _p$.e && (_p$.e = setProp(_el$22, "fg", _v$1, _p$.e));
43377
- _v$10 !== _p$.t && (_p$.t = setProp(_el$22, "attributes", _v$10, _p$.t));
44033
+ var _v$1 = active() ? theme.primary : theme.textMuted, _v$10 = active() ? TextAttributes38.BOLD : undefined;
44034
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$25, "fg", _v$1, _p$.e));
44035
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$25, "attributes", _v$10, _p$.t));
43378
44036
  return _p$;
43379
44037
  }, {
43380
44038
  e: undefined,
43381
44039
  t: undefined
43382
44040
  });
43383
- return _el$22;
44041
+ return _el$25;
43384
44042
  })();
43385
44043
  }
43386
44044
  }));
43387
- insertNode(_el$15, _el$16);
43388
- setProp(_el$15, "flexGrow", 1);
43389
- setProp(_el$15, "verticalScrollbarOptions", {
44045
+ insertNode(_el$18, _el$19);
44046
+ setProp(_el$18, "flexGrow", 1);
44047
+ setProp(_el$18, "verticalScrollbarOptions", {
43390
44048
  trackOptions: {
43391
44049
  foregroundColor: "transparent"
43392
44050
  }
43393
44051
  });
43394
- setProp(_el$16, "flexShrink", 0);
43395
- setProp(_el$16, "gap", 0);
43396
- setProp(_el$16, "paddingRight", 1);
43397
- insert(_el$16, createComponent2(For, {
44052
+ setProp(_el$19, "flexShrink", 0);
44053
+ setProp(_el$19, "gap", 0);
44054
+ setProp(_el$19, "paddingRight", 1);
44055
+ insert(_el$19, createComponent2(For, {
43398
44056
  get each() {
43399
44057
  return rows();
43400
44058
  },
@@ -43405,9 +44063,22 @@ function Sidebar2(props) {
43405
44063
  const isSelected = () => task.id === props.selectedId();
43406
44064
  const isMain = task.kind === "main";
43407
44065
  const badge = STATUS_BADGE[task.status];
44066
+ const isLive = createMemo(() => {
44067
+ const map = props.chatRunState?.();
44068
+ if (!map)
44069
+ return false;
44070
+ const prefix = `${task.id}:`;
44071
+ for (const [key, state] of map) {
44072
+ if (state === "running" && key.startsWith(prefix))
44073
+ return true;
44074
+ }
44075
+ return false;
44076
+ });
43408
44077
  const badgeColor = () => {
43409
44078
  if (isMain)
43410
44079
  return theme.primary;
44080
+ if (isLive())
44081
+ return theme.primary;
43411
44082
  switch (badge.tone) {
43412
44083
  case "success":
43413
44084
  return theme.success;
@@ -43431,107 +44102,96 @@ function Sidebar2(props) {
43431
44102
  branchTick();
43432
44103
  return readWorktreeChanges(task.worktreePath);
43433
44104
  });
43434
- const isLive = createMemo(() => {
43435
- const map = props.chatRunState?.();
43436
- if (!map)
43437
- return false;
43438
- const prefix = `${task.id}:`;
43439
- for (const [key, state] of map) {
43440
- if (state === "running" && key.startsWith(prefix))
43441
- return true;
43442
- }
43443
- return false;
43444
- });
43445
44105
  const titleText = isMain ? repoBasename2(task.repo) : task.title;
43446
44106
  return (() => {
43447
- var _el$23 = createElement("box"), _el$24 = createElement("text"), _el$25 = createElement("text"), _el$26 = createElement("box");
43448
- insertNode(_el$23, _el$24);
43449
- insertNode(_el$23, _el$25);
43450
- insertNode(_el$23, _el$26);
43451
- setProp(_el$23, "flexDirection", "row");
43452
- setProp(_el$23, "paddingLeft", 1);
43453
- setProp(_el$23, "paddingRight", 1);
43454
- setProp(_el$23, "gap", 1);
43455
- setProp(_el$23, "onMouseUp", () => props.onSelect(task.id));
43456
- setProp(_el$24, "wrapMode", "none");
43457
- insert(_el$24, () => isMain ? "\u2605" : task.status === "in_progress" ? isLive() ? IN_PROGRESS_SPINNER[spinnerFrame()] ?? IN_PROGRESS_SPINNER[0] : "\u25CF" : badge.glyph);
43458
- setProp(_el$25, "wrapMode", "none");
43459
- setProp(_el$25, "flexGrow", 1);
43460
- insert(_el$25, titleText);
43461
- setProp(_el$26, "width", 5);
43462
- setProp(_el$26, "flexShrink", 0);
44107
+ var _el$26 = createElement("box"), _el$27 = createElement("text"), _el$28 = createElement("text"), _el$29 = createElement("box");
44108
+ insertNode(_el$26, _el$27);
44109
+ insertNode(_el$26, _el$28);
44110
+ insertNode(_el$26, _el$29);
43463
44111
  setProp(_el$26, "flexDirection", "row");
43464
- setProp(_el$26, "justifyContent", "flex-end");
44112
+ setProp(_el$26, "paddingLeft", 1);
44113
+ setProp(_el$26, "paddingRight", 1);
43465
44114
  setProp(_el$26, "gap", 1);
43466
- insert(_el$26, createComponent2(Show, {
44115
+ setProp(_el$26, "onMouseUp", () => props.onSelect(task.id));
44116
+ setProp(_el$27, "wrapMode", "none");
44117
+ insert(_el$27, () => isMain ? "\u2605" : isLive() ? IN_PROGRESS_SPINNER[spinnerFrame()] ?? IN_PROGRESS_SPINNER[0] : task.status === "in_progress" ? "\u25CF" : badge.glyph);
44118
+ setProp(_el$28, "wrapMode", "none");
44119
+ setProp(_el$28, "flexGrow", 1);
44120
+ insert(_el$28, titleText);
44121
+ setProp(_el$29, "width", 5);
44122
+ setProp(_el$29, "flexShrink", 0);
44123
+ setProp(_el$29, "flexDirection", "row");
44124
+ setProp(_el$29, "justifyContent", "flex-end");
44125
+ setProp(_el$29, "gap", 1);
44126
+ insert(_el$29, createComponent2(Show, {
43467
44127
  get when() {
43468
44128
  return changes().added > 0;
43469
44129
  },
43470
44130
  get children() {
43471
- var _el$27 = createElement("text"), _el$28 = createTextNode(`+`);
43472
- insertNode(_el$27, _el$28);
43473
- setProp(_el$27, "wrapMode", "none");
43474
- insert(_el$27, () => changes().added, null);
43475
- effect((_$p) => setProp(_el$27, "fg", isCursor() ? theme.selectedListItemText : theme.success, _$p));
43476
- return _el$27;
44131
+ var _el$30 = createElement("text"), _el$31 = createTextNode(`+`);
44132
+ insertNode(_el$30, _el$31);
44133
+ setProp(_el$30, "wrapMode", "none");
44134
+ insert(_el$30, () => changes().added, null);
44135
+ effect((_$p) => setProp(_el$30, "fg", isCursor() ? theme.selectedListItemText : theme.success, _$p));
44136
+ return _el$30;
43477
44137
  }
43478
44138
  }), null);
43479
- insert(_el$26, createComponent2(Show, {
44139
+ insert(_el$29, createComponent2(Show, {
43480
44140
  get when() {
43481
44141
  return changes().deleted > 0;
43482
44142
  },
43483
44143
  get children() {
43484
- var _el$29 = createElement("text"), _el$30 = createTextNode(`\u2212`);
43485
- insertNode(_el$29, _el$30);
43486
- setProp(_el$29, "wrapMode", "none");
43487
- insert(_el$29, () => changes().deleted, null);
43488
- effect((_$p) => setProp(_el$29, "fg", isCursor() ? theme.selectedListItemText : theme.error, _$p));
43489
- return _el$29;
44144
+ var _el$32 = createElement("text"), _el$33 = createTextNode(`\u2212`);
44145
+ insertNode(_el$32, _el$33);
44146
+ setProp(_el$32, "wrapMode", "none");
44147
+ insert(_el$32, () => changes().deleted, null);
44148
+ effect((_$p) => setProp(_el$32, "fg", isCursor() ? theme.selectedListItemText : theme.error, _$p));
44149
+ return _el$32;
43490
44150
  }
43491
44151
  }), null);
43492
- insert(_el$23, createComponent2(Show, {
44152
+ insert(_el$26, createComponent2(Show, {
43493
44153
  get when() {
43494
44154
  return isMain && branchLabel().length > 0 || !isMain && task.pinned === true;
43495
44155
  },
43496
44156
  get children() {
43497
- var _el$31 = createElement("box");
43498
- setProp(_el$31, "flexDirection", "row");
43499
- setProp(_el$31, "gap", 1);
43500
- setProp(_el$31, "paddingLeft", 1);
43501
- insert(_el$31, createComponent2(Show, {
44157
+ var _el$34 = createElement("box");
44158
+ setProp(_el$34, "flexDirection", "row");
44159
+ setProp(_el$34, "gap", 1);
44160
+ setProp(_el$34, "paddingLeft", 1);
44161
+ insert(_el$34, createComponent2(Show, {
43502
44162
  get when() {
43503
44163
  return isMain && branchLabel().length > 0;
43504
44164
  },
43505
44165
  get children() {
43506
- var _el$32 = createElement("text");
43507
- setProp(_el$32, "wrapMode", "none");
43508
- insert(_el$32, branchLabel);
43509
- effect((_$p) => setProp(_el$32, "fg", isCursor() ? theme.selectedListItemText : theme.textMuted, _$p));
43510
- return _el$32;
44166
+ var _el$35 = createElement("text");
44167
+ setProp(_el$35, "wrapMode", "none");
44168
+ insert(_el$35, branchLabel);
44169
+ effect((_$p) => setProp(_el$35, "fg", isCursor() ? theme.selectedListItemText : theme.textMuted, _$p));
44170
+ return _el$35;
43511
44171
  }
43512
44172
  }), null);
43513
- insert(_el$31, createComponent2(Show, {
44173
+ insert(_el$34, createComponent2(Show, {
43514
44174
  get when() {
43515
44175
  return !isMain && task.pinned === true;
43516
44176
  },
43517
44177
  get children() {
43518
- var _el$33 = createElement("text");
43519
- insertNode(_el$33, createTextNode(`\u25B4`));
43520
- setProp(_el$33, "wrapMode", "none");
43521
- effect((_$p) => setProp(_el$33, "fg", isCursor() ? theme.selectedListItemText : theme.warning, _$p));
43522
- return _el$33;
44178
+ var _el$36 = createElement("text");
44179
+ insertNode(_el$36, createTextNode(`\u25B4`));
44180
+ setProp(_el$36, "wrapMode", "none");
44181
+ effect((_$p) => setProp(_el$36, "fg", isCursor() ? theme.selectedListItemText : theme.warning, _$p));
44182
+ return _el$36;
43523
44183
  }
43524
44184
  }), null);
43525
- return _el$31;
44185
+ return _el$34;
43526
44186
  }
43527
44187
  }), null);
43528
44188
  effect((_p$) => {
43529
- var _v$11 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$12 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$13 = TextAttributes40.BOLD, _v$14 = isCursor() ? theme.selectedListItemText : theme.text, _v$15 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes40.BOLD : undefined;
43530
- _v$11 !== _p$.e && (_p$.e = setProp(_el$23, "backgroundColor", _v$11, _p$.e));
43531
- _v$12 !== _p$.t && (_p$.t = setProp(_el$24, "fg", _v$12, _p$.t));
43532
- _v$13 !== _p$.a && (_p$.a = setProp(_el$24, "attributes", _v$13, _p$.a));
43533
- _v$14 !== _p$.o && (_p$.o = setProp(_el$25, "fg", _v$14, _p$.o));
43534
- _v$15 !== _p$.i && (_p$.i = setProp(_el$25, "attributes", _v$15, _p$.i));
44189
+ var _v$11 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$12 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$13 = TextAttributes38.BOLD, _v$14 = isCursor() ? theme.selectedListItemText : theme.text, _v$15 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes38.BOLD : undefined;
44190
+ _v$11 !== _p$.e && (_p$.e = setProp(_el$26, "backgroundColor", _v$11, _p$.e));
44191
+ _v$12 !== _p$.t && (_p$.t = setProp(_el$27, "fg", _v$12, _p$.t));
44192
+ _v$13 !== _p$.a && (_p$.a = setProp(_el$27, "attributes", _v$13, _p$.a));
44193
+ _v$14 !== _p$.o && (_p$.o = setProp(_el$28, "fg", _v$14, _p$.o));
44194
+ _v$15 !== _p$.i && (_p$.i = setProp(_el$28, "attributes", _v$15, _p$.i));
43535
44195
  return _p$;
43536
44196
  }, {
43537
44197
  e: undefined,
@@ -43540,42 +44200,42 @@ function Sidebar2(props) {
43540
44200
  o: undefined,
43541
44201
  i: undefined
43542
44202
  });
43543
- return _el$23;
44203
+ return _el$26;
43544
44204
  })();
43545
44205
  }
43546
44206
  }), null);
43547
- insert(_el$16, createComponent2(Show, {
44207
+ insert(_el$19, createComponent2(Show, {
43548
44208
  get when() {
43549
44209
  return flatIds().length === 0;
43550
44210
  },
43551
44211
  get children() {
43552
- var _el$17 = createElement("box"), _el$18 = createElement("text");
43553
- insertNode(_el$17, _el$18);
43554
- setProp(_el$17, "paddingTop", 1);
43555
- setProp(_el$17, "paddingLeft", 1);
43556
- insert(_el$18, (() => {
44212
+ var _el$20 = createElement("box"), _el$21 = createElement("text");
44213
+ insertNode(_el$20, _el$21);
44214
+ setProp(_el$20, "paddingTop", 1);
44215
+ setProp(_el$20, "paddingLeft", 1);
44216
+ insert(_el$21, (() => {
43557
44217
  var _c$ = memo2(() => !!(searchMode() && searchQuery().trim().length > 0));
43558
- return () => _c$() ? "No matching tasks." : view() === "active" ? "No active tasks." : "No archived tasks.";
44218
+ return () => _c$() ? "No matching tasks \u2014 esc to clear." : view() === "active" ? "No active tasks." : "No archived tasks.";
43559
44219
  })());
43560
- effect((_$p) => setProp(_el$18, "fg", theme.textMuted, _$p));
43561
- return _el$17;
44220
+ effect((_$p) => setProp(_el$21, "fg", theme.textMuted, _$p));
44221
+ return _el$20;
43562
44222
  }
43563
44223
  }), null);
43564
- insertNode(_el$19, _el$20);
43565
- setProp(_el$19, "flexShrink", 0);
43566
- setProp(_el$19, "paddingTop", 1);
43567
- setProp(_el$19, "paddingLeft", 1);
43568
- insertNode(_el$20, createTextNode(`+ New task`));
43569
- setProp(_el$20, "wrapMode", "none");
43570
- setProp(_el$20, "onMouseUp", () => props.onAddTask?.());
44224
+ insertNode(_el$22, _el$23);
44225
+ setProp(_el$22, "flexShrink", 0);
44226
+ setProp(_el$22, "paddingTop", 1);
44227
+ setProp(_el$22, "paddingLeft", 1);
44228
+ insertNode(_el$23, createTextNode(`+ New task`));
44229
+ setProp(_el$23, "wrapMode", "none");
44230
+ setProp(_el$23, "onMouseUp", () => props.onAddTask?.());
43571
44231
  effect((_p$) => {
43572
- var _v$5 = props.width ? props.width() : SIDEBAR_WIDTH, _v$6 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$7 = TextAttributes40.BOLD, _v$8 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$9 = TextAttributes40.BOLD, _v$0 = theme.textMuted;
44232
+ var _v$5 = props.width ? props.width() : SIDEBAR_WIDTH, _v$6 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$7 = TextAttributes38.BOLD, _v$8 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$9 = TextAttributes38.BOLD, _v$0 = theme.textMuted;
43573
44233
  _v$5 !== _p$.e && (_p$.e = setProp(_el$, "width", _v$5, _p$.e));
43574
44234
  _v$6 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$6, _p$.t));
43575
44235
  _v$7 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$7, _p$.a));
43576
44236
  _v$8 !== _p$.o && (_p$.o = setProp(_el$5, "fg", _v$8, _p$.o));
43577
44237
  _v$9 !== _p$.i && (_p$.i = setProp(_el$5, "attributes", _v$9, _p$.i));
43578
- _v$0 !== _p$.n && (_p$.n = setProp(_el$20, "fg", _v$0, _p$.n));
44238
+ _v$0 !== _p$.n && (_p$.n = setProp(_el$23, "fg", _v$0, _p$.n));
43579
44239
  return _p$;
43580
44240
  }, {
43581
44241
  e: undefined,
@@ -43898,22 +44558,6 @@ Try again or quit?`;
43898
44558
  return null;
43899
44559
  return chatRunStateKey(taskId, tabId);
43900
44560
  });
43901
- const openBackgroundTasks = () => {
43902
- BackgroundTasksDialog.show(dialog, {
43903
- runState: chatRunStateAcc,
43904
- tasks: tasksAcc,
43905
- visibleTabKey,
43906
- onJump: (taskId, tabId) => {
43907
- props.orchestrator.setActiveTab(taskId, tabId);
43908
- setSelectedId(taskId);
43909
- setFocusedPane("workspace");
43910
- },
43911
- onInterrupt: (taskId, tabId) => {
43912
- props.orchestrator.interruptTask(taskId, tabId);
43913
- }
43914
- });
43915
- };
43916
- const backgroundRows = createMemo(() => computeBackgroundRows(chatRunStateAcc(), tasksAcc(), visibleTabKey()));
43917
44561
  useAppKeymap({
43918
44562
  dialog,
43919
44563
  focusedPane,
@@ -43922,7 +44566,6 @@ Try again or quit?`;
43922
44566
  resizeStep: RESIZE_STEP,
43923
44567
  focusHjklTargets: FOCUS_HJKL_TARGETS,
43924
44568
  openNewTaskFlow,
43925
- openBackgroundTasks,
43926
44569
  kv,
43927
44570
  orchestrator: props.orchestrator,
43928
44571
  renderer,
@@ -44088,9 +44731,7 @@ Try again or quit?`;
44088
44731
  onOpenFilePath: openFileInCenter,
44089
44732
  onQuickForkRequest: () => {
44090
44733
  quickForkActiveTask();
44091
- },
44092
- backgroundRows,
44093
- onOpenBackgroundTasks: openBackgroundTasks
44734
+ }
44094
44735
  });
44095
44736
  }
44096
44737
  }));
@@ -44161,16 +44802,7 @@ Try again or quit?`;
44161
44802
  return isFocused("terminal");
44162
44803
  }
44163
44804
  }));
44164
- insert(_el$, createComponent2(StatusBar, {
44165
- get indicator() {
44166
- return createComponent2(BackgroundTasksIndicator, {
44167
- runState: chatRunStateAcc,
44168
- tasks: tasksAcc,
44169
- visibleTabKey,
44170
- onActivate: openBackgroundTasks
44171
- });
44172
- }
44173
- }), null);
44805
+ insert(_el$, createComponent2(StatusBar, {}), null);
44174
44806
  insert(_el$, createComponent2(ToastOverlay, {}), null);
44175
44807
  effect((_p$) => {
44176
44808
  var _v$ = theme.backgroundPanel, _v$2 = workspaceWidth(), _v$3 = theme.backgroundPanel, _v$4 = filesHeight();
@@ -44321,8 +44953,6 @@ var init_app = __esm(() => {
44321
44953
  init_repos();
44322
44954
  init_version();
44323
44955
  init_app_keymap();
44324
- init_background_tasks_dialog();
44325
- init_background_tasks_indicator();
44326
44956
  init_center_tab_strip();
44327
44957
  init_help_dialog();
44328
44958
  init_pane_header();
@@ -44361,7 +44991,7 @@ var exports_tui = {};
44361
44991
  __export(exports_tui, {
44362
44992
  startTui: () => startTui
44363
44993
  });
44364
- import { TextAttributes as TextAttributes41 } from "@opentui/core";
44994
+ import { TextAttributes as TextAttributes39 } from "@opentui/core";
44365
44995
  function HelpHint() {
44366
44996
  const {
44367
44997
  theme
@@ -44435,7 +45065,7 @@ function Banner() {
44435
45065
  insert(_el$20, selected);
44436
45066
  insert(_el$12, createComponent2(HelpHint, {}), null);
44437
45067
  effect((_p$) => {
44438
- var _v$7 = theme.primary, _v$8 = TextAttributes41.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
45068
+ var _v$7 = theme.primary, _v$8 = TextAttributes39.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
44439
45069
  fg: theme.accent
44440
45070
  };
44441
45071
  _v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));