@sma1lboy/kobe 0.5.7 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -5183,7 +5183,6 @@ function bindByIds(handlers) {
5183
5183
  }
5184
5184
  function useKobeKeybindings(opts) {
5185
5185
  const palette = useCommandPalette();
5186
- const dialog = useDialog();
5187
5186
  const renderer = useRenderer();
5188
5187
  const onQuit = opts.onQuit ?? (() => {
5189
5188
  try {
@@ -5195,7 +5194,6 @@ function useKobeKeybindings(opts) {
5195
5194
  });
5196
5195
  const onFocusNext = opts.onFocusNext ?? (() => {});
5197
5196
  const onFocusPrev = opts.onFocusPrev ?? (() => {});
5198
- const onFocusDetach = opts.onFocusDetach ?? (() => {});
5199
5197
  if (renderer) {
5200
5198
  const onSelection = () => {
5201
5199
  const text = renderer.getSelection()?.getSelectedText();
@@ -5237,17 +5235,7 @@ function useKobeKeybindings(opts) {
5237
5235
  "focus.next": () => onFocusNext(),
5238
5236
  "focus.prev": () => onFocusPrev(),
5239
5237
  "app.copy_or_quit": () => handleCtrlC()
5240
- }),
5241
- {
5242
- key: "escape",
5243
- cmd: () => {
5244
- if (dialog.stack.length > 0) {
5245
- dialog.pop();
5246
- } else {
5247
- onFocusDetach();
5248
- }
5249
- }
5250
- }
5238
+ })
5251
5239
  ];
5252
5240
  });
5253
5241
  useBindings(() => ({ bindings: bindings() }));
@@ -5257,7 +5245,6 @@ var init_keybindings = __esm(() => {
5257
5245
  init_solid();
5258
5246
  init_dev();
5259
5247
  init_keymap();
5260
- init_dialog();
5261
5248
  init_command_palette();
5262
5249
  [ctrlCArmed, setCtrlCArmed] = createSignal(false);
5263
5250
  KobeKeymap = [
@@ -5345,14 +5332,6 @@ var init_keybindings = __esm(() => {
5345
5332
  category: "Global",
5346
5333
  description: "Copy selection / press twice within 1.5s to quit"
5347
5334
  },
5348
- {
5349
- id: "focus.detach",
5350
- scope: "global",
5351
- keys: ["esc"],
5352
- category: "Navigation",
5353
- description: "Back to sidebar. In chat while streaming, interrupts the turn instead. Closes top dialog if any.",
5354
- hint: { keys: "esc", label: "back to sidebar" }
5355
- },
5356
5335
  {
5357
5336
  id: "chat.interrupt",
5358
5337
  scope: "workspace",
@@ -8878,7 +8857,7 @@ var init_package = __esm(() => {
8878
8857
  package_default = {
8879
8858
  $schema: "https://json.schemastore.org/package.json",
8880
8859
  name: "@sma1lboy/kobe",
8881
- version: "0.5.7",
8860
+ version: "0.5.8",
8882
8861
  description: "TUI orchestrator for Claude Code (codename)",
8883
8862
  type: "module",
8884
8863
  packageManager: "bun@1.3.13",
@@ -10654,6 +10633,9 @@ class Orchestrator {
10654
10633
  planUsageSignal() {
10655
10634
  return () => null;
10656
10635
  }
10636
+ rcBridgeSignal() {
10637
+ return () => ({ state: "off" });
10638
+ }
10657
10639
  subscribeTasks(listener2) {
10658
10640
  return this.store.subscribe(listener2);
10659
10641
  }
@@ -11368,6 +11350,8 @@ class RemoteOrchestrator {
11368
11350
  setRunState;
11369
11351
  planUsageAcc;
11370
11352
  setPlanUsage;
11353
+ rcBridgeAcc;
11354
+ setRcBridge;
11371
11355
  subscribers = new Map;
11372
11356
  pendingInputBroker = new InMemoryPendingInputBroker;
11373
11357
  constructor(client) {
@@ -11375,12 +11359,15 @@ class RemoteOrchestrator {
11375
11359
  const [tasks, setTasks] = createSignal([]);
11376
11360
  const [runState, setRunState] = createSignal(new Map);
11377
11361
  const [planUsage, setPlanUsage] = createSignal(null);
11362
+ const [rcBridge, setRcBridge] = createSignal({ state: "off" });
11378
11363
  this.tasksAcc = tasks;
11379
11364
  this.setTasks = (next) => setTasks(() => next);
11380
11365
  this.runStateAcc = runState;
11381
11366
  this.setRunState = (next) => setRunState(() => next);
11382
11367
  this.planUsageAcc = planUsage;
11383
11368
  this.setPlanUsage = (next) => setPlanUsage(() => next);
11369
+ this.rcBridgeAcc = rcBridge;
11370
+ this.setRcBridge = (next) => setRcBridge(() => next);
11384
11371
  this.client.on("*", (frame) => this.handleEvent(frame.name, frame.payload));
11385
11372
  }
11386
11373
  async init() {
@@ -11402,6 +11389,8 @@ class RemoteOrchestrator {
11402
11389
  }
11403
11390
  if (hello.planUsage)
11404
11391
  this.setPlanUsage(hello.planUsage);
11392
+ if (hello.rcBridge)
11393
+ this.setRcBridge(hello.rcBridge);
11405
11394
  await this.client.request("subscribe", { taskIds: "all" });
11406
11395
  if (hello.pending) {
11407
11396
  for (const [taskId, entries] of Object.entries(hello.pending)) {
@@ -11434,6 +11423,21 @@ class RemoteOrchestrator {
11434
11423
  planUsageSignal() {
11435
11424
  return this.planUsageAcc;
11436
11425
  }
11426
+ rcBridgeSignal() {
11427
+ return this.rcBridgeAcc;
11428
+ }
11429
+ async startRcBridge(opts = {}) {
11430
+ const res = await this.client.request("rcBridge.start", {
11431
+ taskId: opts.taskId,
11432
+ tabId: opts.tabId,
11433
+ cwd: opts.cwd
11434
+ });
11435
+ return res.status;
11436
+ }
11437
+ async stopRcBridge() {
11438
+ const res = await this.client.request("rcBridge.stop", {});
11439
+ return res.status;
11440
+ }
11437
11441
  listTasks() {
11438
11442
  return this.tasksAcc().slice();
11439
11443
  }
@@ -11574,6 +11578,12 @@ class RemoteOrchestrator {
11574
11578
  this.setPlanUsage(usage ?? null);
11575
11579
  return;
11576
11580
  }
11581
+ if (name === "rcBridge.changed") {
11582
+ const status = obj.status;
11583
+ if (status)
11584
+ this.setRcBridge(status);
11585
+ return;
11586
+ }
11577
11587
  const taskId = obj.taskId;
11578
11588
  const tabId = obj.tabId;
11579
11589
  if (!taskId || !tabId)
@@ -13532,6 +13542,447 @@ var init_pane_header = __esm(() => {
13532
13542
  init_theme();
13533
13543
  });
13534
13544
 
13545
+ // src/tui/component/rc-bridge-dialog.tsx
13546
+ import { TextAttributes as TextAttributes12 } from "@opentui/core";
13547
+ function RcBridgeDialog(props) {
13548
+ const dialog = useDialog();
13549
+ const {
13550
+ theme
13551
+ } = useTheme();
13552
+ const [busy, setBusy] = createSignal(false);
13553
+ const targetTask = () => props.activeTask?.();
13554
+ const canEnable = () => Boolean(targetTask());
13555
+ async function activate() {
13556
+ if (busy())
13557
+ return;
13558
+ const s = props.status();
13559
+ setBusy(true);
13560
+ try {
13561
+ if (s.state === "off" || s.state === "error") {
13562
+ const task = targetTask();
13563
+ if (!task)
13564
+ return;
13565
+ await props.orchestrator.startRcBridge({
13566
+ taskId: task.id,
13567
+ tabId: props.activeTabId?.() ?? undefined
13568
+ });
13569
+ } else if (s.state === "running") {
13570
+ await props.orchestrator.stopRcBridge();
13571
+ }
13572
+ } catch (err) {
13573
+ console.error("kobe: rcBridge action failed:", err);
13574
+ } finally {
13575
+ setBusy(false);
13576
+ }
13577
+ }
13578
+ useBindings(() => ({
13579
+ enabled: dialog.stack.length > 0,
13580
+ bindings: [{
13581
+ key: "return",
13582
+ cmd: () => void activate()
13583
+ }]
13584
+ }));
13585
+ return (() => {
13586
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$7 = createElement("text"), _el$8 = createTextNode(`Binds this task's worktree to a claude.ai environment so you can pick it up from another device. claude.ai sessions on that environment run on your machine under the task's worktree \u2014 and if this tab already has a kobe conversation, you can \`/resume <id>\` it in claude.ai to keep going from where you left off.`);
13587
+ insertNode(_el$, _el$2);
13588
+ insertNode(_el$, _el$7);
13589
+ setProp(_el$, "paddingLeft", 2);
13590
+ setProp(_el$, "paddingRight", 2);
13591
+ setProp(_el$, "gap", 1);
13592
+ insertNode(_el$2, _el$3);
13593
+ insertNode(_el$2, _el$5);
13594
+ setProp(_el$2, "flexDirection", "row");
13595
+ setProp(_el$2, "justifyContent", "space-between");
13596
+ insertNode(_el$3, createTextNode(`Share to claude.ai`));
13597
+ insertNode(_el$5, createTextNode(`esc`));
13598
+ setProp(_el$5, "onMouseUp", () => dialog.clear());
13599
+ insertNode(_el$7, _el$8);
13600
+ setProp(_el$7, "wrapMode", "word");
13601
+ insert(_el$, createComponent2(Switch, {
13602
+ get children() {
13603
+ return [createComponent2(Match, {
13604
+ get when() {
13605
+ return props.status().state === "off";
13606
+ },
13607
+ get children() {
13608
+ return createComponent2(Show, {
13609
+ get when() {
13610
+ return canEnable();
13611
+ },
13612
+ get fallback() {
13613
+ return (() => {
13614
+ var _el$48 = createElement("text");
13615
+ insertNode(_el$48, createTextNode(`No active task \u2014 select a task in the sidebar first, then re-open this dialog.`));
13616
+ effect((_$p) => setProp(_el$48, "fg", theme.textMuted, _$p));
13617
+ return _el$48;
13618
+ })();
13619
+ },
13620
+ get children() {
13621
+ var _el$1 = createElement("box"), _el$10 = createElement("text"), _el$12 = createElement("box"), _el$13 = createElement("text"), _el$14 = createElement("text"), _el$16 = createElement("text");
13622
+ insertNode(_el$1, _el$10);
13623
+ insertNode(_el$1, _el$12);
13624
+ setProp(_el$1, "flexDirection", "column");
13625
+ setProp(_el$1, "gap", 0);
13626
+ insertNode(_el$10, createTextNode(`Will share:`));
13627
+ insertNode(_el$12, _el$13);
13628
+ insertNode(_el$12, _el$14);
13629
+ insertNode(_el$12, _el$16);
13630
+ setProp(_el$12, "flexDirection", "row");
13631
+ setProp(_el$12, "gap", 1);
13632
+ insert(_el$13, () => targetTask()?.title ?? "");
13633
+ insertNode(_el$14, createTextNode(`\xB7`));
13634
+ setProp(_el$16, "wrapMode", "none");
13635
+ insert(_el$16, () => targetTask()?.worktreePath ?? "");
13636
+ effect((_p$) => {
13637
+ var { textMuted: _v$, text: _v$2 } = theme, _v$3 = TextAttributes12.BOLD, _v$4 = theme.textMuted, _v$5 = theme.text;
13638
+ _v$ !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$, _p$.e));
13639
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$13, "fg", _v$2, _p$.t));
13640
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$13, "attributes", _v$3, _p$.a));
13641
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$14, "fg", _v$4, _p$.o));
13642
+ _v$5 !== _p$.i && (_p$.i = setProp(_el$16, "fg", _v$5, _p$.i));
13643
+ return _p$;
13644
+ }, {
13645
+ e: undefined,
13646
+ t: undefined,
13647
+ a: undefined,
13648
+ o: undefined,
13649
+ i: undefined
13650
+ });
13651
+ return _el$1;
13652
+ }
13653
+ });
13654
+ }
13655
+ }), createComponent2(Match, {
13656
+ get when() {
13657
+ return props.status().state === "starting";
13658
+ },
13659
+ get children() {
13660
+ var _el$17 = createElement("text");
13661
+ insertNode(_el$17, createTextNode(`Connecting to claude.ai\u2026`));
13662
+ effect((_$p) => setProp(_el$17, "fg", theme.accent, _$p));
13663
+ return _el$17;
13664
+ }
13665
+ }), createComponent2(Match, {
13666
+ get when() {
13667
+ return props.status().state === "running";
13668
+ },
13669
+ get children() {
13670
+ var _el$19 = createElement("box"), _el$20 = createElement("box"), _el$21 = createElement("text"), _el$23 = createElement("text");
13671
+ insertNode(_el$19, _el$20);
13672
+ setProp(_el$19, "flexDirection", "column");
13673
+ setProp(_el$19, "gap", 0);
13674
+ insertNode(_el$20, _el$21);
13675
+ insertNode(_el$20, _el$23);
13676
+ setProp(_el$20, "flexDirection", "row");
13677
+ setProp(_el$20, "gap", 1);
13678
+ insertNode(_el$21, createTextNode(`Env:`));
13679
+ insert(_el$23, () => props.status().envId);
13680
+ insert(_el$19, createComponent2(Show, {
13681
+ get when() {
13682
+ return props.status().deeplink;
13683
+ },
13684
+ get children() {
13685
+ var _el$24 = createElement("box"), _el$25 = createElement("text"), _el$27 = createElement("text");
13686
+ insertNode(_el$24, _el$25);
13687
+ insertNode(_el$24, _el$27);
13688
+ setProp(_el$24, "flexDirection", "column");
13689
+ setProp(_el$24, "gap", 0);
13690
+ setProp(_el$24, "paddingTop", 1);
13691
+ insertNode(_el$25, createTextNode(`Open from another device:`));
13692
+ insert(_el$27, () => props.status().deeplink);
13693
+ effect((_p$) => {
13694
+ var { textMuted: _v$6, accent: _v$7 } = theme;
13695
+ _v$6 !== _p$.e && (_p$.e = setProp(_el$25, "fg", _v$6, _p$.e));
13696
+ _v$7 !== _p$.t && (_p$.t = setProp(_el$27, "fg", _v$7, _p$.t));
13697
+ return _p$;
13698
+ }, {
13699
+ e: undefined,
13700
+ t: undefined
13701
+ });
13702
+ return _el$24;
13703
+ }
13704
+ }), null);
13705
+ insert(_el$19, createComponent2(Show, {
13706
+ get when() {
13707
+ return props.status().bound;
13708
+ },
13709
+ get children() {
13710
+ var _el$28 = createElement("box"), _el$29 = createElement("box"), _el$30 = createElement("text"), _el$32 = createElement("text");
13711
+ insertNode(_el$28, _el$29);
13712
+ setProp(_el$28, "flexDirection", "column");
13713
+ setProp(_el$28, "gap", 0);
13714
+ setProp(_el$28, "paddingTop", 1);
13715
+ insertNode(_el$29, _el$30);
13716
+ insertNode(_el$29, _el$32);
13717
+ setProp(_el$29, "flexDirection", "row");
13718
+ setProp(_el$29, "gap", 1);
13719
+ insertNode(_el$30, createTextNode(`Sharing:`));
13720
+ setProp(_el$32, "wrapMode", "none");
13721
+ insert(_el$32, () => props.status().bound?.taskTitle ?? props.status().bound?.taskId);
13722
+ insert(_el$28, createComponent2(Show, {
13723
+ get when() {
13724
+ return props.status().bound?.sessionId;
13725
+ },
13726
+ get fallback() {
13727
+ return (() => {
13728
+ var _el$50 = createElement("text");
13729
+ insertNode(_el$50, createTextNode(`(no kobe session yet \u2014 claude.ai will start a fresh one in this worktree)`));
13730
+ setProp(_el$50, "wrapMode", "word");
13731
+ effect((_$p) => setProp(_el$50, "fg", theme.textMuted, _$p));
13732
+ return _el$50;
13733
+ })();
13734
+ },
13735
+ get children() {
13736
+ var _el$33 = createElement("box"), _el$34 = createElement("text"), _el$36 = createElement("text"), _el$37 = createTextNode(`/resume `);
13737
+ insertNode(_el$33, _el$34);
13738
+ insertNode(_el$33, _el$36);
13739
+ setProp(_el$33, "flexDirection", "column");
13740
+ setProp(_el$33, "gap", 0);
13741
+ insertNode(_el$34, createTextNode(`To continue this tab's conversation in claude.ai, run:`));
13742
+ insertNode(_el$36, _el$37);
13743
+ insert(_el$36, () => props.status().bound?.sessionId, null);
13744
+ effect((_p$) => {
13745
+ var { textMuted: _v$8, accent: _v$9 } = theme, _v$0 = TextAttributes12.BOLD;
13746
+ _v$8 !== _p$.e && (_p$.e = setProp(_el$34, "fg", _v$8, _p$.e));
13747
+ _v$9 !== _p$.t && (_p$.t = setProp(_el$36, "fg", _v$9, _p$.t));
13748
+ _v$0 !== _p$.a && (_p$.a = setProp(_el$36, "attributes", _v$0, _p$.a));
13749
+ return _p$;
13750
+ }, {
13751
+ e: undefined,
13752
+ t: undefined,
13753
+ a: undefined
13754
+ });
13755
+ return _el$33;
13756
+ }
13757
+ }), null);
13758
+ effect((_p$) => {
13759
+ var { textMuted: _v$1, text: _v$10 } = theme, _v$11 = TextAttributes12.BOLD;
13760
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$30, "fg", _v$1, _p$.e));
13761
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$32, "fg", _v$10, _p$.t));
13762
+ _v$11 !== _p$.a && (_p$.a = setProp(_el$32, "attributes", _v$11, _p$.a));
13763
+ return _p$;
13764
+ }, {
13765
+ e: undefined,
13766
+ t: undefined,
13767
+ a: undefined
13768
+ });
13769
+ return _el$28;
13770
+ }
13771
+ }), null);
13772
+ insert(_el$19, createComponent2(Show, {
13773
+ get when() {
13774
+ return props.status().cwd;
13775
+ },
13776
+ get children() {
13777
+ var _el$38 = createElement("box"), _el$39 = createElement("text"), _el$41 = createElement("text");
13778
+ insertNode(_el$38, _el$39);
13779
+ insertNode(_el$38, _el$41);
13780
+ setProp(_el$38, "flexDirection", "row");
13781
+ setProp(_el$38, "gap", 1);
13782
+ setProp(_el$38, "paddingTop", 1);
13783
+ insertNode(_el$39, createTextNode(`Cwd:`));
13784
+ setProp(_el$41, "wrapMode", "none");
13785
+ insert(_el$41, () => props.status().cwd);
13786
+ effect((_p$) => {
13787
+ var { textMuted: _v$12, text: _v$13 } = theme;
13788
+ _v$12 !== _p$.e && (_p$.e = setProp(_el$39, "fg", _v$12, _p$.e));
13789
+ _v$13 !== _p$.t && (_p$.t = setProp(_el$41, "fg", _v$13, _p$.t));
13790
+ return _p$;
13791
+ }, {
13792
+ e: undefined,
13793
+ t: undefined
13794
+ });
13795
+ return _el$38;
13796
+ }
13797
+ }), null);
13798
+ effect((_p$) => {
13799
+ var { textMuted: _v$14, accent: _v$15 } = theme, _v$16 = TextAttributes12.BOLD;
13800
+ _v$14 !== _p$.e && (_p$.e = setProp(_el$21, "fg", _v$14, _p$.e));
13801
+ _v$15 !== _p$.t && (_p$.t = setProp(_el$23, "fg", _v$15, _p$.t));
13802
+ _v$16 !== _p$.a && (_p$.a = setProp(_el$23, "attributes", _v$16, _p$.a));
13803
+ return _p$;
13804
+ }, {
13805
+ e: undefined,
13806
+ t: undefined,
13807
+ a: undefined
13808
+ });
13809
+ return _el$19;
13810
+ }
13811
+ }), createComponent2(Match, {
13812
+ get when() {
13813
+ return props.status().state === "stopping";
13814
+ },
13815
+ get children() {
13816
+ var _el$42 = createElement("text");
13817
+ insertNode(_el$42, createTextNode(`Disconnecting\u2026`));
13818
+ effect((_$p) => setProp(_el$42, "fg", theme.textMuted, _$p));
13819
+ return _el$42;
13820
+ }
13821
+ }), createComponent2(Match, {
13822
+ get when() {
13823
+ return props.status().state === "error";
13824
+ },
13825
+ get children() {
13826
+ var _el$44 = createElement("box"), _el$45 = createElement("text");
13827
+ insertNode(_el$44, _el$45);
13828
+ setProp(_el$44, "flexDirection", "column");
13829
+ setProp(_el$44, "gap", 0);
13830
+ insertNode(_el$45, createTextNode(`Bridge failed.`));
13831
+ insert(_el$44, createComponent2(Show, {
13832
+ get when() {
13833
+ return props.status().errorMessage;
13834
+ },
13835
+ get children() {
13836
+ var _el$47 = createElement("text");
13837
+ setProp(_el$47, "wrapMode", "word");
13838
+ insert(_el$47, () => props.status().errorMessage);
13839
+ effect((_$p) => setProp(_el$47, "fg", theme.textMuted, _$p));
13840
+ return _el$47;
13841
+ }
13842
+ }), null);
13843
+ effect((_p$) => {
13844
+ var _v$17 = theme.error, _v$18 = TextAttributes12.BOLD;
13845
+ _v$17 !== _p$.e && (_p$.e = setProp(_el$45, "fg", _v$17, _p$.e));
13846
+ _v$18 !== _p$.t && (_p$.t = setProp(_el$45, "attributes", _v$18, _p$.t));
13847
+ return _p$;
13848
+ }, {
13849
+ e: undefined,
13850
+ t: undefined
13851
+ });
13852
+ return _el$44;
13853
+ }
13854
+ })];
13855
+ }
13856
+ }), null);
13857
+ insert(_el$, createComponent2(Switch, {
13858
+ get children() {
13859
+ return [createComponent2(Match, {
13860
+ get when() {
13861
+ return props.status().state === "off";
13862
+ },
13863
+ get children() {
13864
+ return createComponent2(ActionButton, {
13865
+ label: "[ enter ] Enable",
13866
+ get disabled() {
13867
+ return busy() || !canEnable();
13868
+ },
13869
+ onClick: activate
13870
+ });
13871
+ }
13872
+ }), createComponent2(Match, {
13873
+ get when() {
13874
+ return props.status().state === "running";
13875
+ },
13876
+ get children() {
13877
+ return createComponent2(ActionButton, {
13878
+ label: "[ enter ] Disable",
13879
+ get disabled() {
13880
+ return busy();
13881
+ },
13882
+ onClick: activate,
13883
+ variant: "warning"
13884
+ });
13885
+ }
13886
+ }), createComponent2(Match, {
13887
+ get when() {
13888
+ return props.status().state === "error";
13889
+ },
13890
+ get children() {
13891
+ return createComponent2(ActionButton, {
13892
+ label: "[ enter ] Retry",
13893
+ get disabled() {
13894
+ return busy() || !canEnable();
13895
+ },
13896
+ onClick: activate
13897
+ });
13898
+ }
13899
+ }), createComponent2(Match, {
13900
+ get when() {
13901
+ return props.status().state === "starting" || props.status().state === "stopping";
13902
+ },
13903
+ get children() {
13904
+ return createComponent2(ActionButton, {
13905
+ label: "working\u2026",
13906
+ disabled: true
13907
+ });
13908
+ }
13909
+ })];
13910
+ }
13911
+ }), null);
13912
+ effect((_p$) => {
13913
+ var _v$19 = TextAttributes12.BOLD, _v$20 = theme.text, _v$21 = theme.textMuted, _v$22 = theme.textMuted;
13914
+ _v$19 !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$19, _p$.e));
13915
+ _v$20 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$20, _p$.t));
13916
+ _v$21 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$21, _p$.a));
13917
+ _v$22 !== _p$.o && (_p$.o = setProp(_el$7, "fg", _v$22, _p$.o));
13918
+ return _p$;
13919
+ }, {
13920
+ e: undefined,
13921
+ t: undefined,
13922
+ a: undefined,
13923
+ o: undefined
13924
+ });
13925
+ return _el$;
13926
+ })();
13927
+ }
13928
+ function ActionButton(props) {
13929
+ const {
13930
+ theme
13931
+ } = useTheme();
13932
+ const fg = () => {
13933
+ if (props.disabled)
13934
+ return theme.textMuted;
13935
+ if (props.variant === "warning")
13936
+ return theme.warning;
13937
+ return theme.accent;
13938
+ };
13939
+ return (() => {
13940
+ var _el$52 = createElement("box"), _el$53 = createElement("text");
13941
+ insertNode(_el$52, _el$53);
13942
+ setProp(_el$52, "paddingLeft", 1);
13943
+ setProp(_el$52, "paddingRight", 1);
13944
+ setProp(_el$52, "onMouseUp", () => {
13945
+ if (!props.disabled)
13946
+ props.onClick?.();
13947
+ });
13948
+ insert(_el$53, () => props.label);
13949
+ effect((_p$) => {
13950
+ var _v$23 = theme.backgroundElement, _v$24 = fg(), _v$25 = TextAttributes12.BOLD;
13951
+ _v$23 !== _p$.e && (_p$.e = setProp(_el$52, "backgroundColor", _v$23, _p$.e));
13952
+ _v$24 !== _p$.t && (_p$.t = setProp(_el$53, "fg", _v$24, _p$.t));
13953
+ _v$25 !== _p$.a && (_p$.a = setProp(_el$53, "attributes", _v$25, _p$.a));
13954
+ return _p$;
13955
+ }, {
13956
+ e: undefined,
13957
+ t: undefined,
13958
+ a: undefined
13959
+ });
13960
+ return _el$52;
13961
+ })();
13962
+ }
13963
+ var init_rc_bridge_dialog = __esm(() => {
13964
+ init_solid();
13965
+ init_solid();
13966
+ init_solid();
13967
+ init_solid();
13968
+ init_solid();
13969
+ init_solid();
13970
+ init_solid();
13971
+ init_solid();
13972
+ init_dev();
13973
+ init_theme();
13974
+ init_keymap();
13975
+ init_dialog();
13976
+ RcBridgeDialog.show = (dialog, orchestrator, status, activeTask, activeTabId) => {
13977
+ dialog.replace(() => createComponent2(RcBridgeDialog, {
13978
+ orchestrator,
13979
+ status,
13980
+ activeTask,
13981
+ activeTabId
13982
+ }));
13983
+ };
13984
+ });
13985
+
13535
13986
  // src/tui/component/border.tsx
13536
13987
  var EmptyBorder, SplitBorder, HSplitBorder;
13537
13988
  var init_border = __esm(() => {
@@ -13696,7 +14147,7 @@ var init_focus = __esm(() => {
13696
14147
  });
13697
14148
 
13698
14149
  // src/tui/component/status-bar.tsx
13699
- import { TextAttributes as TextAttributes12 } from "@opentui/core";
14150
+ import { TextAttributes as TextAttributes13 } from "@opentui/core";
13700
14151
  function Hotkey(props) {
13701
14152
  const {
13702
14153
  theme
@@ -13715,7 +14166,7 @@ function Hotkey(props) {
13715
14166
  setProp(_el$5, "wrapMode", "none");
13716
14167
  insert(_el$5, () => props.label);
13717
14168
  effect((_p$) => {
13718
- var _v$ = theme.accent, _v$2 = TextAttributes12.BOLD, _v$3 = theme.textMuted;
14169
+ var _v$ = theme.accent, _v$2 = TextAttributes13.BOLD, _v$3 = theme.textMuted;
13719
14170
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
13720
14171
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
13721
14172
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -13749,11 +14200,7 @@ function StatusBar() {
13749
14200
  const leftHints = () => KobeKeymap.filter((b) => {
13750
14201
  if (!b.hint || b.hint.pin)
13751
14202
  return false;
13752
- if (b.scope === focus.focused())
13753
- return true;
13754
- if (b.id === "focus.detach" && focus.focused() === "workspace")
13755
- return true;
13756
- return false;
14203
+ return b.scope === focus.focused();
13757
14204
  });
13758
14205
  const rightHints = KobeKeymap.filter((b) => b.hint?.pin === "right");
13759
14206
  return (() => {
@@ -13807,7 +14254,7 @@ function StatusBar() {
13807
14254
  insertNode(_el$0, createTextNode(`Press Ctrl+C again to exit`));
13808
14255
  setProp(_el$0, "wrapMode", "none");
13809
14256
  effect((_p$) => {
13810
- var _v$4 = theme.warning, _v$5 = TextAttributes12.BOLD;
14257
+ var _v$4 = theme.warning, _v$5 = TextAttributes13.BOLD;
13811
14258
  _v$4 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$4, _p$.e));
13812
14259
  _v$5 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$5, _p$.t));
13813
14260
  return _p$;
@@ -13819,7 +14266,7 @@ function StatusBar() {
13819
14266
  }
13820
14267
  }), null);
13821
14268
  effect((_p$) => {
13822
- var _v$6 = theme.primary, _v$7 = TextAttributes12.BOLD;
14269
+ var _v$6 = theme.primary, _v$7 = TextAttributes13.BOLD;
13823
14270
  _v$6 !== _p$.e && (_p$.e = setProp(_el$8, "fg", _v$6, _p$.e));
13824
14271
  _v$7 !== _p$.t && (_p$.t = setProp(_el$8, "attributes", _v$7, _p$.t));
13825
14272
  return _p$;
@@ -13845,7 +14292,7 @@ var init_status_bar = __esm(() => {
13845
14292
  });
13846
14293
 
13847
14294
  // src/tui/component/toast-overlay.tsx
13848
- import { TextAttributes as TextAttributes13 } from "@opentui/core";
14295
+ import { TextAttributes as TextAttributes14 } from "@opentui/core";
13849
14296
  function ToastOverlay() {
13850
14297
  const {
13851
14298
  theme
@@ -13888,7 +14335,7 @@ function ToastOverlay() {
13888
14335
  setProp(_el$4, "wrapMode", "none");
13889
14336
  insert(_el$4, () => toast.title);
13890
14337
  effect((_p$) => {
13891
- var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes13.BOLD, _v$6 = fg();
14338
+ var _v$3 = bg(), _v$4 = fg(), _v$5 = TextAttributes14.BOLD, _v$6 = fg();
13892
14339
  _v$3 !== _p$.e && (_p$.e = setProp(_el$2, "backgroundColor", _v$3, _p$.e));
13893
14340
  _v$4 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$4, _p$.t));
13894
14341
  _v$5 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$5, _p$.a));
@@ -13932,7 +14379,7 @@ var init_toast_overlay = __esm(() => {
13932
14379
  });
13933
14380
 
13934
14381
  // src/tui/component/create-pr-button.tsx
13935
- import { TextAttributes as TextAttributes14 } from "@opentui/core";
14382
+ import { TextAttributes as TextAttributes15 } from "@opentui/core";
13936
14383
  function isEnabled(task) {
13937
14384
  if (!task)
13938
14385
  return false;
@@ -13969,7 +14416,7 @@ function CreatePRButton(props) {
13969
14416
  insertNode(_el$4, createTextNode(`Create PR`));
13970
14417
  setProp(_el$4, "wrapMode", "none");
13971
14418
  effect((_p$) => {
13972
- var _v$ = enabled() ? onClick : undefined, _v$2 = bracketColor(), _v$3 = TextAttributes14.BOLD, _v$4 = labelColor();
14419
+ var _v$ = enabled() ? onClick : undefined, _v$2 = bracketColor(), _v$3 = TextAttributes15.BOLD, _v$4 = labelColor();
13973
14420
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "onMouseUp", _v$, _p$.e));
13974
14421
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "fg", _v$2, _p$.t));
13975
14422
  _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "attributes", _v$3, _p$.a));
@@ -14259,7 +14706,7 @@ var init_markdown_parser = __esm(() => {
14259
14706
  });
14260
14707
 
14261
14708
  // src/tui/panes/chat/Markdown.tsx
14262
- import { TextAttributes as TextAttributes15 } from "@opentui/core";
14709
+ import { TextAttributes as TextAttributes16 } from "@opentui/core";
14263
14710
  function InlineSpans(props) {
14264
14711
  const {
14265
14712
  theme
@@ -14289,7 +14736,7 @@ function InlineSpans(props) {
14289
14736
  insert(_el$3, () => t.text, _el$5);
14290
14737
  effect((_$p) => setProp(_el$3, "style", {
14291
14738
  fg: theme.accent,
14292
- attributes: TextAttributes15.DIM
14739
+ attributes: TextAttributes16.DIM
14293
14740
  }, _$p));
14294
14741
  return _el$3;
14295
14742
  })();
@@ -14301,7 +14748,7 @@ function InlineSpans(props) {
14301
14748
  insert(_el$6, () => showUrl ? t.text : t.href);
14302
14749
  effect((_$p) => setProp(_el$6, "style", {
14303
14750
  fg: theme.accent,
14304
- attributes: TextAttributes15.UNDERLINE
14751
+ attributes: TextAttributes16.UNDERLINE
14305
14752
  }, _$p));
14306
14753
  return _el$6;
14307
14754
  })(), createComponent2(Show, {
@@ -14313,7 +14760,7 @@ function InlineSpans(props) {
14313
14760
  insert(_el$7, () => t.href, _el$9);
14314
14761
  effect((_$p) => setProp(_el$7, "style", {
14315
14762
  fg: theme.textMuted,
14316
- attributes: TextAttributes15.DIM
14763
+ attributes: TextAttributes16.DIM
14317
14764
  }, _$p));
14318
14765
  return _el$7;
14319
14766
  }
@@ -14490,7 +14937,7 @@ function VerticalTable(props) {
14490
14937
  var _el$20 = createElement("text");
14491
14938
  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`));
14492
14939
  effect((_p$) => {
14493
- var _v$4 = theme.textMuted, _v$5 = TextAttributes15.DIM;
14940
+ var _v$4 = theme.textMuted, _v$5 = TextAttributes16.DIM;
14494
14941
  _v$4 !== _p$.e && (_p$.e = setProp(_el$20, "fg", _v$4, _p$.e));
14495
14942
  _v$5 !== _p$.t && (_p$.t = setProp(_el$20, "attributes", _v$5, _p$.t));
14496
14943
  return _p$;
@@ -14581,7 +15028,7 @@ function BlockNode(props) {
14581
15028
  })();
14582
15029
  }
14583
15030
  if (b.kind === "heading") {
14584
- const attrs = b.level === 1 ? TextAttributes15.BOLD | TextAttributes15.UNDERLINE : TextAttributes15.BOLD;
15031
+ const attrs = b.level === 1 ? TextAttributes16.BOLD | TextAttributes16.UNDERLINE : TextAttributes16.BOLD;
14585
15032
  const fg = b.level <= 2 ? theme.accent : theme.text;
14586
15033
  const tokens = parseInline(b.text);
14587
15034
  return (() => {
@@ -14607,7 +15054,7 @@ function BlockNode(props) {
14607
15054
  const checkbox = item.checked ? "[x] " : "[ ] ";
14608
15055
  const bullet = b.ordered ? `${b.start + idx()}. ` : "\u2022 ";
14609
15056
  const prefix = isTask ? checkbox : bullet;
14610
- const labelAttrs = isTask && item.checked ? TextAttributes15.DIM : 0;
15057
+ const labelAttrs = isTask && item.checked ? TextAttributes16.DIM : 0;
14611
15058
  return (() => {
14612
15059
  var _el$30 = createElement("text"), _el$31 = createElement("span");
14613
15060
  insertNode(_el$30, _el$31);
@@ -14654,9 +15101,9 @@ function BlockNode(props) {
14654
15101
  }
14655
15102
  }), null);
14656
15103
  effect((_p$) => {
14657
- var _v$10 = theme.textMuted, _v$11 = TextAttributes15.ITALIC, _v$12 = {
15104
+ var _v$10 = theme.textMuted, _v$11 = TextAttributes16.ITALIC, _v$12 = {
14658
15105
  fg: theme.textMuted,
14659
- attributes: TextAttributes15.DIM
15106
+ attributes: TextAttributes16.DIM
14660
15107
  };
14661
15108
  _v$10 !== _p$.e && (_p$.e = setProp(_el$33, "fg", _v$10, _p$.e));
14662
15109
  _v$11 !== _p$.t && (_p$.t = setProp(_el$33, "attributes", _v$11, _p$.t));
@@ -14698,7 +15145,7 @@ function BlockNode(props) {
14698
15145
  var _el$37 = createElement("text");
14699
15146
  insert(_el$37, () => b.lang);
14700
15147
  effect((_p$) => {
14701
- var _v$13 = theme.textMuted, _v$14 = TextAttributes15.DIM;
15148
+ var _v$13 = theme.textMuted, _v$14 = TextAttributes16.DIM;
14702
15149
  _v$13 !== _p$.e && (_p$.e = setProp(_el$37, "fg", _v$13, _p$.e));
14703
15150
  _v$14 !== _p$.t && (_p$.t = setProp(_el$37, "attributes", _v$14, _p$.t));
14704
15151
  return _p$;
@@ -14758,7 +15205,7 @@ var init_Markdown = __esm(() => {
14758
15205
  });
14759
15206
 
14760
15207
  // src/tui/component/update-dialog.tsx
14761
- import { TextAttributes as TextAttributes16 } from "@opentui/core";
15208
+ import { TextAttributes as TextAttributes17 } from "@opentui/core";
14762
15209
  function UpdateDialog(props) {
14763
15210
  const dialog = useDialog();
14764
15211
  const {
@@ -14873,7 +15320,7 @@ function UpdateDialog(props) {
14873
15320
  }
14874
15321
  }));
14875
15322
  effect((_p$) => {
14876
- var _v$ = TextAttributes16.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted, _v$5 = theme.textMuted, _v$6 = theme.warning, _v$7 = TextAttributes16.BOLD, _v$8 = theme.textMuted, _v$9 = theme.accent, _v$0 = TextAttributes16.BOLD, _v$1 = theme.textMuted;
15323
+ var _v$ = TextAttributes17.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted, _v$5 = theme.textMuted, _v$6 = theme.warning, _v$7 = TextAttributes17.BOLD, _v$8 = theme.textMuted, _v$9 = theme.accent, _v$0 = TextAttributes17.BOLD, _v$1 = theme.textMuted;
14877
15324
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
14878
15325
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
14879
15326
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -14924,17 +15371,20 @@ var init_update_dialog = __esm(() => {
14924
15371
  });
14925
15372
 
14926
15373
  // src/tui/component/top-bar.tsx
14927
- import { TextAttributes as TextAttributes17 } from "@opentui/core";
15374
+ import { TextAttributes as TextAttributes18 } from "@opentui/core";
14928
15375
  function TopBar(props) {
14929
15376
  const {
14930
15377
  theme
14931
15378
  } = useTheme();
14932
15379
  const dialog = useDialog();
15380
+ const remoteOrch = props.orchestrator instanceof RemoteOrchestrator ? props.orchestrator : null;
15381
+ const rcBridge = props.orchestrator.rcBridgeSignal();
15382
+ const isBridgeOn = () => rcBridge().state === "running" || rcBridge().state === "starting";
14933
15383
  return (() => {
14934
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$6 = createTextNode(`v`), _el$0 = createElement("box"), _el$10 = createElement("box");
15384
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$6 = createTextNode(`v`), _el$10 = createElement("box"), _el$12 = createElement("box");
14935
15385
  insertNode(_el$, _el$2);
14936
- insertNode(_el$, _el$0);
14937
15386
  insertNode(_el$, _el$10);
15387
+ insertNode(_el$, _el$12);
14938
15388
  setProp(_el$, "flexDirection", "row");
14939
15389
  setProp(_el$, "paddingLeft", 2);
14940
15390
  setProp(_el$, "paddingRight", 2);
@@ -14965,7 +15415,7 @@ function TopBar(props) {
14965
15415
  });
14966
15416
  insert(_el$7, () => props.updateInfo()?.latest, _el$9);
14967
15417
  effect((_p$) => {
14968
- var _v$ = theme.warning, _v$2 = TextAttributes17.BOLD;
15418
+ var _v$ = theme.warning, _v$2 = TextAttributes18.BOLD;
14969
15419
  _v$ !== _p$.e && (_p$.e = setProp(_el$7, "fg", _v$, _p$.e));
14970
15420
  _v$2 !== _p$.t && (_p$.t = setProp(_el$7, "attributes", _v$2, _p$.t));
14971
15421
  return _p$;
@@ -14976,38 +15426,66 @@ function TopBar(props) {
14976
15426
  return _el$7;
14977
15427
  }
14978
15428
  }), null);
14979
- setProp(_el$0, "flexDirection", "row");
14980
- setProp(_el$0, "flexGrow", 1);
14981
- setProp(_el$0, "flexShrink", 1);
14982
- setProp(_el$0, "flexBasis", 0);
14983
- setProp(_el$0, "gap", 1);
14984
- setProp(_el$0, "justifyContent", "center");
14985
- insert(_el$0, createComponent2(Show, {
15429
+ insert(_el$2, createComponent2(Show, {
14986
15430
  get when() {
14987
- return props.activeTask() !== undefined;
15431
+ return remoteOrch && isBridgeOn();
14988
15432
  },
14989
15433
  get children() {
14990
- var _el$1 = createElement("text");
14991
- setProp(_el$1, "wrapMode", "none");
14992
- insert(_el$1, () => props.activeTask()?.branch);
15434
+ var _el$0 = createElement("text"), _el$1 = createTextNode(`\u25C9 `);
15435
+ insertNode(_el$0, _el$1);
15436
+ setProp(_el$0, "onMouseUp", () => {
15437
+ const orch = remoteOrch;
15438
+ if (orch)
15439
+ RcBridgeDialog.show(dialog, orch, rcBridge, props.activeTask, props.activeChatTabId);
15440
+ });
15441
+ insert(_el$0, (() => {
15442
+ var _c$ = memo2(() => rcBridge().state === "running");
15443
+ return () => _c$() ? rcBridge().bound?.taskTitle ?? rcBridge().envId ?? "RC" : "RC connecting\u2026";
15444
+ })(), null);
14993
15445
  effect((_p$) => {
14994
- var _v$3 = theme.text, _v$4 = TextAttributes17.BOLD;
14995
- _v$3 !== _p$.e && (_p$.e = setProp(_el$1, "fg", _v$3, _p$.e));
14996
- _v$4 !== _p$.t && (_p$.t = setProp(_el$1, "attributes", _v$4, _p$.t));
15446
+ var _v$3 = theme.accent, _v$4 = TextAttributes18.BOLD;
15447
+ _v$3 !== _p$.e && (_p$.e = setProp(_el$0, "fg", _v$3, _p$.e));
15448
+ _v$4 !== _p$.t && (_p$.t = setProp(_el$0, "attributes", _v$4, _p$.t));
14997
15449
  return _p$;
14998
15450
  }, {
14999
15451
  e: undefined,
15000
15452
  t: undefined
15001
15453
  });
15002
- return _el$1;
15454
+ return _el$0;
15003
15455
  }
15004
- }));
15456
+ }), null);
15005
15457
  setProp(_el$10, "flexDirection", "row");
15006
15458
  setProp(_el$10, "flexGrow", 1);
15007
15459
  setProp(_el$10, "flexShrink", 1);
15008
15460
  setProp(_el$10, "flexBasis", 0);
15009
- setProp(_el$10, "justifyContent", "flex-end");
15010
- insert(_el$10, createComponent2(CreatePRButton, {
15461
+ setProp(_el$10, "gap", 1);
15462
+ setProp(_el$10, "justifyContent", "center");
15463
+ insert(_el$10, createComponent2(Show, {
15464
+ get when() {
15465
+ return props.activeTask() !== undefined;
15466
+ },
15467
+ get children() {
15468
+ var _el$11 = createElement("text");
15469
+ setProp(_el$11, "wrapMode", "none");
15470
+ insert(_el$11, () => props.activeTask()?.branch);
15471
+ effect((_p$) => {
15472
+ var _v$5 = theme.text, _v$6 = TextAttributes18.BOLD;
15473
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$5, _p$.e));
15474
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$11, "attributes", _v$6, _p$.t));
15475
+ return _p$;
15476
+ }, {
15477
+ e: undefined,
15478
+ t: undefined
15479
+ });
15480
+ return _el$11;
15481
+ }
15482
+ }));
15483
+ setProp(_el$12, "flexDirection", "row");
15484
+ setProp(_el$12, "flexGrow", 1);
15485
+ setProp(_el$12, "flexShrink", 1);
15486
+ setProp(_el$12, "flexBasis", 0);
15487
+ setProp(_el$12, "justifyContent", "flex-end");
15488
+ insert(_el$12, createComponent2(CreatePRButton, {
15011
15489
  get orchestrator() {
15012
15490
  return props.orchestrator;
15013
15491
  },
@@ -15016,10 +15494,10 @@ function TopBar(props) {
15016
15494
  }
15017
15495
  }));
15018
15496
  effect((_p$) => {
15019
- var _v$5 = theme.primary, _v$6 = TextAttributes17.BOLD, _v$7 = theme.textMuted;
15020
- _v$5 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$5, _p$.e));
15021
- _v$6 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$6, _p$.t));
15022
- _v$7 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$7, _p$.a));
15497
+ var _v$7 = theme.primary, _v$8 = TextAttributes18.BOLD, _v$9 = theme.textMuted;
15498
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$7, _p$.e));
15499
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$8, _p$.t));
15500
+ _v$9 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$9, _p$.a));
15023
15501
  return _p$;
15024
15502
  }, {
15025
15503
  e: undefined,
@@ -15037,11 +15515,14 @@ var init_top_bar = __esm(() => {
15037
15515
  init_solid();
15038
15516
  init_solid();
15039
15517
  init_solid();
15518
+ init_solid();
15040
15519
  init_dev();
15041
15520
  init_package();
15521
+ init_remote_orchestrator();
15042
15522
  init_theme();
15043
15523
  init_dialog();
15044
15524
  init_create_pr_button();
15525
+ init_rc_bridge_dialog();
15045
15526
  init_update_dialog();
15046
15527
  });
15047
15528
 
@@ -16235,11 +16716,22 @@ var init_use_pane_sizes = __esm(() => {
16235
16716
 
16236
16717
  // src/tui/component/new-task-dialog/state.ts
16237
16718
  import * as fs5 from "fs";
16719
+ import * as os from "os";
16720
+ function pickerModeFor(value, repoOptions) {
16721
+ const trimmed = value.trim();
16722
+ if (repoOptions.includes(trimmed))
16723
+ return "saved";
16724
+ if (trimmed.startsWith("~"))
16725
+ return "browse";
16726
+ if (trimmed.includes("/"))
16727
+ return "browse";
16728
+ return "saved";
16729
+ }
16238
16730
  function stripNewlines(v) {
16239
16731
  return v.replace(/[\r\n]+/g, "");
16240
16732
  }
16241
16733
  function nextField(field) {
16242
- return field === "repoPicker" ? "repoCustom" : field === "repoCustom" ? "baseRef" : "repoPicker";
16734
+ return field === "repo" ? "baseRef" : "repo";
16243
16735
  }
16244
16736
  function computeRepoOptions(defaultRepo, savedRepos) {
16245
16737
  const seen = new Set;
@@ -16332,6 +16824,59 @@ function listLocalBranches(repo) {
16332
16824
  return [];
16333
16825
  }
16334
16826
  }
16827
+ function expandHome(p) {
16828
+ if (p === "~")
16829
+ return os.homedir();
16830
+ if (p.startsWith("~/"))
16831
+ return os.homedir() + p.slice(1);
16832
+ return p;
16833
+ }
16834
+ function splitPathForDirSuggest(value) {
16835
+ if (!value)
16836
+ return { base: "", filter: "" };
16837
+ const normalized = value === "~" ? "~/" : value;
16838
+ const expanded = expandHome(normalized);
16839
+ if (expanded.endsWith("/"))
16840
+ return { base: expanded, filter: "" };
16841
+ const lastSlash = expanded.lastIndexOf("/");
16842
+ if (lastSlash === -1)
16843
+ return { base: "", filter: expanded };
16844
+ return { base: expanded.slice(0, lastSlash + 1), filter: expanded.slice(lastSlash + 1) };
16845
+ }
16846
+ function listSubdirs(base) {
16847
+ if (!base)
16848
+ return [];
16849
+ try {
16850
+ const entries = fs5.readdirSync(base, { withFileTypes: true });
16851
+ const out = [];
16852
+ for (const e of entries) {
16853
+ if (e.isDirectory())
16854
+ out.push(e.name);
16855
+ }
16856
+ return out.sort((a, b) => a.localeCompare(b));
16857
+ } catch {
16858
+ return [];
16859
+ }
16860
+ }
16861
+ function filterSubdirs(all, filter) {
16862
+ const f = filter.toLowerCase();
16863
+ const showHidden = f.startsWith(".");
16864
+ const visible = showHidden ? all : all.filter((n) => !n.startsWith("."));
16865
+ if (!f)
16866
+ return visible;
16867
+ return visible.filter((n) => n.toLowerCase().startsWith(f));
16868
+ }
16869
+ function joinDrill(typedValue, baseExpanded, name) {
16870
+ const out = `${baseExpanded + name}/`;
16871
+ if (typedValue.startsWith("~")) {
16872
+ const home = os.homedir();
16873
+ if (out === `${home}/`)
16874
+ return "~/";
16875
+ if (out.startsWith(`${home}/`))
16876
+ return `~${out.slice(home.length)}`;
16877
+ }
16878
+ return out;
16879
+ }
16335
16880
  function resolveBaseRef(typed, filteredBranches, cursor) {
16336
16881
  const picked = filteredBranches[cursor];
16337
16882
  if (picked)
@@ -16343,49 +16888,49 @@ var DEFAULT_BASE_REF = "main", PICKER_MAX_VISIBLE = 8;
16343
16888
  var init_state2 = () => {};
16344
16889
 
16345
16890
  // src/tui/component/new-task-dialog/dialog.tsx
16346
- import { TextAttributes as TextAttributes18 } from "@opentui/core";
16891
+ import { TextAttributes as TextAttributes19 } from "@opentui/core";
16347
16892
  function NewTaskDialogView(props) {
16348
16893
  const dialog = useDialog();
16349
16894
  const {
16350
16895
  theme
16351
16896
  } = useTheme();
16352
- const [field, setField] = createSignal("repoPicker");
16897
+ const [field, setField] = createSignal("repo");
16353
16898
  const [repo, setRepo] = createSignal(props.defaultRepo);
16354
16899
  const [baseRef, setBaseRef] = createSignal(DEFAULT_BASE_REF);
16355
16900
  const repoOptions = createMemo(() => computeRepoOptions(props.defaultRepo, props.savedRepos));
16356
- const repoFiltered = createMemo(() => {
16357
- const all = repoOptions();
16358
- if (field() !== "repoCustom")
16359
- return all;
16360
- return filterRepos(all, repo());
16361
- });
16901
+ const mode = createMemo(() => pickerModeFor(repo(), repoOptions()));
16902
+ const subdirSplit = createMemo(() => splitPathForDirSuggest(repo()));
16903
+ const subdirAll = createMemo(() => listSubdirs(subdirSplit().base));
16904
+ const subdirFiltered = createMemo(() => filterSubdirs(subdirAll(), subdirSplit().filter));
16905
+ const savedFiltered = createMemo(() => filterRepos(repoOptions(), repo()));
16906
+ const activeList = createMemo(() => mode() === "browse" ? subdirFiltered() : savedFiltered());
16362
16907
  const [repoCursor, setRepoCursor] = createSignal(0);
16363
- const branches = createMemo(() => listLocalBranches(repo().trim()));
16908
+ const activeWindow = createMemo(() => windowAround(activeList(), repoCursor()));
16909
+ const branches = createMemo(() => listLocalBranches(expandHome(repo().trim())));
16364
16910
  const branchFiltered = createMemo(() => filterBranches(branches(), baseRef()));
16365
16911
  const [branchCursor, setBranchCursor] = createSignal(0);
16912
+ const branchWindow = createMemo(() => windowAround(branchFiltered(), branchCursor()));
16366
16913
  createEffect(() => {
16367
16914
  branchFiltered();
16368
16915
  setBranchCursor(0);
16369
16916
  });
16370
16917
  createEffect(() => {
16371
- repoFiltered();
16918
+ activeList();
16372
16919
  setRepoCursor(0);
16373
16920
  });
16374
- const repoWindow = createMemo(() => windowAround(repoFiltered(), repoCursor()));
16375
- const branchWindow = createMemo(() => windowAround(branchFiltered(), branchCursor()));
16376
16921
  const [submitError, setSubmitError] = createSignal(null);
16377
16922
  createEffect(() => {
16378
16923
  repo();
16379
16924
  setSubmitError(null);
16380
16925
  });
16381
16926
  function commit() {
16382
- const r = repo().trim();
16927
+ const r = expandHome(repo().trim());
16383
16928
  if (!r)
16384
16929
  return;
16385
16930
  const reason = validateRepoPath(r);
16386
16931
  if (reason) {
16387
16932
  setSubmitError(reason);
16388
- setField("repoCustom");
16933
+ setField("repo");
16389
16934
  return;
16390
16935
  }
16391
16936
  const b = baseRef().trim() || DEFAULT_BASE_REF;
@@ -16395,11 +16940,52 @@ function NewTaskDialogView(props) {
16395
16940
  });
16396
16941
  dialog.clear();
16397
16942
  }
16398
- function selectRepoAt(absoluteIndex) {
16399
- const list = repoFiltered();
16943
+ function onRepoSubmit() {
16944
+ if (!repo().trim() && mode() === "saved") {
16945
+ const picked2 = activeList()[0];
16946
+ if (picked2) {
16947
+ setRepo(picked2);
16948
+ commit();
16949
+ return;
16950
+ }
16951
+ }
16952
+ if (mode() === "browse") {
16953
+ const list = subdirFiltered();
16954
+ const picked2 = list[repoCursor()];
16955
+ const split = subdirSplit();
16956
+ if (picked2) {
16957
+ if (split.filter) {
16958
+ setRepo(joinDrill(repo(), split.base, picked2));
16959
+ return;
16960
+ }
16961
+ const resolved = expandHome(repo().trim());
16962
+ if (!resolved || validateRepoPath(resolved) !== null) {
16963
+ setRepo(joinDrill(repo(), split.base, picked2));
16964
+ return;
16965
+ }
16966
+ }
16967
+ commit();
16968
+ return;
16969
+ }
16970
+ const picked = activeList()[repoCursor()];
16971
+ if (picked) {
16972
+ setRepo(picked);
16973
+ commit();
16974
+ return;
16975
+ }
16976
+ commit();
16977
+ }
16978
+ function selectRepoAtMouse(absoluteIndex) {
16979
+ const list = activeList();
16400
16980
  const picked = list[absoluteIndex];
16401
16981
  if (!picked)
16402
16982
  return;
16983
+ if (mode() === "browse") {
16984
+ const split = subdirSplit();
16985
+ setRepo(joinDrill(repo(), split.base, picked));
16986
+ setRepoCursor(absoluteIndex);
16987
+ return;
16988
+ }
16403
16989
  setRepo(picked);
16404
16990
  setRepoCursor(absoluteIndex);
16405
16991
  setField("baseRef");
@@ -16411,15 +16997,13 @@ function NewTaskDialogView(props) {
16411
16997
  }, {
16412
16998
  key: "up",
16413
16999
  cmd: () => {
16414
- if (field() === "repoPicker") {
16415
- const list2 = repoFiltered();
17000
+ if (field() === "repo") {
17001
+ const list2 = activeList();
16416
17002
  if (list2.length === 0)
16417
17003
  return;
16418
17004
  setRepoCursor(clampCursor(repoCursor() - 1, list2.length));
16419
17005
  return;
16420
17006
  }
16421
- if (field() === "repoCustom")
16422
- return;
16423
17007
  if (field() !== "baseRef")
16424
17008
  return;
16425
17009
  const list = branchFiltered();
@@ -16430,15 +17014,13 @@ function NewTaskDialogView(props) {
16430
17014
  }, {
16431
17015
  key: "down",
16432
17016
  cmd: () => {
16433
- if (field() === "repoPicker") {
16434
- const list2 = repoFiltered();
17017
+ if (field() === "repo") {
17018
+ const list2 = activeList();
16435
17019
  if (list2.length === 0)
16436
17020
  return;
16437
17021
  setRepoCursor(clampCursor(repoCursor() + 1, list2.length));
16438
17022
  return;
16439
17023
  }
16440
- if (field() === "repoCustom")
16441
- return;
16442
17024
  if (field() !== "baseRef")
16443
17025
  return;
16444
17026
  const list = branchFiltered();
@@ -16446,20 +17028,14 @@ function NewTaskDialogView(props) {
16446
17028
  return;
16447
17029
  setBranchCursor(clampCursor(branchCursor() + 1, list.length));
16448
17030
  }
16449
- }, {
16450
- key: "return",
16451
- cmd: () => {
16452
- if (field() === "repoPicker")
16453
- selectRepoAt(repoCursor());
16454
- }
16455
17031
  }]
16456
17032
  }));
16457
17033
  return (() => {
16458
- var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$14 = createElement("box"), _el$15 = createElement("text"), _el$17 = createElement("input"), _el$20 = createElement("box"), _el$21 = createElement("text"), _el$23 = createElement("input"), _el$33 = createElement("box"), _el$34 = createElement("text");
17034
+ var _el$ = createElement("box"), _el$2 = createElement("box"), _el$3 = createElement("text"), _el$5 = createElement("text"), _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("input"), _el$18 = createElement("box"), _el$19 = createElement("text"), _el$21 = createElement("input"), _el$31 = createElement("box"), _el$32 = createElement("text");
16459
17035
  insertNode(_el$, _el$2);
16460
- insertNode(_el$, _el$14);
16461
- insertNode(_el$, _el$20);
16462
- insertNode(_el$, _el$33);
17036
+ insertNode(_el$, _el$7);
17037
+ insertNode(_el$, _el$18);
17038
+ insertNode(_el$, _el$31);
16463
17039
  setProp(_el$, "paddingLeft", 2);
16464
17040
  setProp(_el$, "paddingRight", 2);
16465
17041
  setProp(_el$, "gap", 1);
@@ -16470,105 +17046,106 @@ function NewTaskDialogView(props) {
16470
17046
  insertNode(_el$3, createTextNode(`New task`));
16471
17047
  insertNode(_el$5, createTextNode(`esc`));
16472
17048
  setProp(_el$5, "onMouseUp", () => props.onCancel());
17049
+ insertNode(_el$7, _el$8);
17050
+ insertNode(_el$7, _el$0);
17051
+ setProp(_el$7, "gap", 0);
17052
+ insertNode(_el$8, createTextNode(`repo`));
17053
+ setProp(_el$0, "onInput", (v) => setRepo(stripNewlines(v)));
17054
+ setProp(_el$0, "onSubmit", () => {
17055
+ if (!repo().trim())
17056
+ return;
17057
+ onRepoSubmit();
17058
+ });
16473
17059
  insert(_el$, createComponent2(Show, {
16474
17060
  get when() {
16475
- return repoOptions().length > 0;
17061
+ return memo2(() => field() === "repo")() && activeList().length > 0;
16476
17062
  },
16477
17063
  get children() {
16478
- var _el$7 = createElement("box"), _el$8 = createElement("text");
16479
- insertNode(_el$7, _el$8);
16480
- setProp(_el$7, "gap", 0);
16481
- insertNode(_el$8, createTextNode(`pick a repo`));
16482
- insert(_el$7, createComponent2(Show, {
17064
+ var _el$1 = createElement("box");
17065
+ setProp(_el$1, "gap", 0);
17066
+ setProp(_el$1, "paddingLeft", 2);
17067
+ insert(_el$1, createComponent2(Show, {
16483
17068
  get when() {
16484
- return repoWindow().start > 0;
17069
+ return activeWindow().start > 0;
16485
17070
  },
16486
17071
  get children() {
16487
- var _el$0 = createElement("text"), _el$1 = createTextNode(`\u2191 `), _el$10 = createTextNode(` more`);
16488
- insertNode(_el$0, _el$1);
16489
- insertNode(_el$0, _el$10);
16490
- setProp(_el$0, "wrapMode", "none");
16491
- insert(_el$0, () => repoWindow().start, _el$10);
16492
- effect((_$p) => setProp(_el$0, "fg", theme.textMuted, _$p));
16493
- return _el$0;
17072
+ var _el$10 = createElement("text"), _el$11 = createTextNode(`\u2191 `), _el$12 = createTextNode(` more`);
17073
+ insertNode(_el$10, _el$11);
17074
+ insertNode(_el$10, _el$12);
17075
+ setProp(_el$10, "wrapMode", "none");
17076
+ insert(_el$10, () => activeWindow().start, _el$12);
17077
+ effect((_$p) => setProp(_el$10, "fg", theme.textMuted, _$p));
17078
+ return _el$10;
16494
17079
  }
16495
17080
  }), null);
16496
- insert(_el$7, createComponent2(For, {
17081
+ insert(_el$1, createComponent2(For, {
16497
17082
  get each() {
16498
- return repoWindow().items;
17083
+ return activeWindow().items;
16499
17084
  },
16500
- children: (path8, i) => {
16501
- const absoluteIndex = () => repoWindow().start + i();
16502
- const isCursor = () => field() === "repoPicker" && absoluteIndex() === repoCursor();
16503
- const isSelected = () => repo().trim() === path8;
16504
- const isCurrentDir = () => path8 === props.defaultRepo;
17085
+ children: (name, i) => {
17086
+ const absoluteIndex = () => activeWindow().start + i();
17087
+ const isCursor = () => absoluteIndex() === repoCursor();
17088
+ const isCurrentDir = () => mode() === "saved" && name === props.defaultRepo;
17089
+ const isSelected = () => mode() === "saved" && repo().trim() === name;
17090
+ const suffix = () => mode() === "browse" ? "/" : "";
17091
+ const tag = () => isCurrentDir() ? " (current dir)" : "";
16505
17092
  return (() => {
16506
- var _el$36 = createElement("text");
16507
- setProp(_el$36, "wrapMode", "none");
16508
- setProp(_el$36, "onMouseUp", () => selectRepoAt(absoluteIndex()));
16509
- insert(_el$36, () => isCursor() ? "\u25B8 " : " ", null);
16510
- insert(_el$36, path8, null);
16511
- insert(_el$36, () => isCurrentDir() ? " (current dir)" : "", null);
17093
+ var _el$34 = createElement("text");
17094
+ setProp(_el$34, "wrapMode", "none");
17095
+ setProp(_el$34, "onMouseUp", () => selectRepoAtMouse(absoluteIndex()));
17096
+ insert(_el$34, () => isCursor() ? "\u25B8 " : " ", null);
17097
+ insert(_el$34, name, null);
17098
+ insert(_el$34, suffix, null);
17099
+ insert(_el$34, tag, null);
16512
17100
  effect((_p$) => {
16513
- var _v$10 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$11 = isCursor() ? TextAttributes18.BOLD : undefined;
16514
- _v$10 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$10, _p$.e));
16515
- _v$11 !== _p$.t && (_p$.t = setProp(_el$36, "attributes", _v$11, _p$.t));
17101
+ var _v$10 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$11 = isCursor() ? TextAttributes19.BOLD : undefined;
17102
+ _v$10 !== _p$.e && (_p$.e = setProp(_el$34, "fg", _v$10, _p$.e));
17103
+ _v$11 !== _p$.t && (_p$.t = setProp(_el$34, "attributes", _v$11, _p$.t));
16516
17104
  return _p$;
16517
17105
  }, {
16518
17106
  e: undefined,
16519
17107
  t: undefined
16520
17108
  });
16521
- return _el$36;
17109
+ return _el$34;
16522
17110
  })();
16523
17111
  }
16524
17112
  }), null);
16525
- insert(_el$7, createComponent2(Show, {
17113
+ insert(_el$1, createComponent2(Show, {
16526
17114
  get when() {
16527
- return repoWindow().start + repoWindow().items.length < repoWindow().total;
17115
+ return activeWindow().start + activeWindow().items.length < activeWindow().total;
16528
17116
  },
16529
17117
  get children() {
16530
- var _el$11 = createElement("text"), _el$12 = createTextNode(`\u2193 `), _el$13 = createTextNode(` more`);
16531
- insertNode(_el$11, _el$12);
16532
- insertNode(_el$11, _el$13);
16533
- setProp(_el$11, "wrapMode", "none");
16534
- insert(_el$11, () => repoWindow().total - repoWindow().start - repoWindow().items.length, _el$13);
16535
- effect((_$p) => setProp(_el$11, "fg", theme.textMuted, _$p));
16536
- return _el$11;
17118
+ var _el$13 = createElement("text"), _el$14 = createTextNode(`\u2193 `), _el$15 = createTextNode(` more`);
17119
+ insertNode(_el$13, _el$14);
17120
+ insertNode(_el$13, _el$15);
17121
+ setProp(_el$13, "wrapMode", "none");
17122
+ insert(_el$13, () => activeWindow().total - activeWindow().start - activeWindow().items.length, _el$15);
17123
+ effect((_$p) => setProp(_el$13, "fg", theme.textMuted, _$p));
17124
+ return _el$13;
16537
17125
  }
16538
17126
  }), null);
16539
- effect((_$p) => setProp(_el$8, "fg", field() === "repoPicker" ? theme.accent : theme.textMuted, _$p));
16540
- return _el$7;
17127
+ return _el$1;
16541
17128
  }
16542
- }), _el$14);
16543
- insertNode(_el$14, _el$15);
16544
- insertNode(_el$14, _el$17);
16545
- setProp(_el$14, "gap", 0);
16546
- insertNode(_el$15, createTextNode(`or type a custom path`));
16547
- setProp(_el$17, "onInput", (v) => setRepo(stripNewlines(v)));
16548
- setProp(_el$17, "onSubmit", () => {
16549
- if (!repo().trim())
16550
- return;
16551
- commit();
16552
- });
17129
+ }), _el$18);
16553
17130
  insert(_el$, createComponent2(Show, {
16554
17131
  get when() {
16555
17132
  return submitError();
16556
17133
  },
16557
17134
  get children() {
16558
- var _el$18 = createElement("text"), _el$19 = createTextNode(`\u203B `);
16559
- insertNode(_el$18, _el$19);
16560
- insert(_el$18, submitError, null);
16561
- effect((_$p) => setProp(_el$18, "fg", theme.error, _$p));
16562
- return _el$18;
16563
- }
16564
- }), _el$20);
16565
- insertNode(_el$20, _el$21);
16566
- insertNode(_el$20, _el$23);
16567
- setProp(_el$20, "gap", 0);
16568
- insertNode(_el$21, createTextNode(`from branch`));
16569
- setProp(_el$23, "placeholder", DEFAULT_BASE_REF);
16570
- setProp(_el$23, "onInput", (v) => setBaseRef(stripNewlines(v)));
16571
- setProp(_el$23, "onSubmit", () => {
17135
+ var _el$16 = createElement("text"), _el$17 = createTextNode(`\u203B `);
17136
+ insertNode(_el$16, _el$17);
17137
+ insert(_el$16, submitError, null);
17138
+ effect((_$p) => setProp(_el$16, "fg", theme.error, _$p));
17139
+ return _el$16;
17140
+ }
17141
+ }), _el$18);
17142
+ insertNode(_el$18, _el$19);
17143
+ insertNode(_el$18, _el$21);
17144
+ setProp(_el$18, "gap", 0);
17145
+ insertNode(_el$19, createTextNode(`from branch`));
17146
+ setProp(_el$21, "placeholder", DEFAULT_BASE_REF);
17147
+ setProp(_el$21, "onInput", (v) => setBaseRef(stripNewlines(v)));
17148
+ setProp(_el$21, "onSubmit", () => {
16572
17149
  setBaseRef(resolveBaseRef(baseRef(), branchFiltered(), branchCursor()));
16573
17150
  commit();
16574
17151
  });
@@ -16577,41 +17154,41 @@ function NewTaskDialogView(props) {
16577
17154
  return memo2(() => !!(field() === "baseRef" && branchFiltered().length === 0))() && submitError() == null;
16578
17155
  },
16579
17156
  get children() {
16580
- var _el$24 = createElement("box"), _el$25 = createElement("text");
16581
- insertNode(_el$24, _el$25);
16582
- setProp(_el$24, "gap", 0);
16583
- setProp(_el$24, "paddingLeft", 2);
16584
- setProp(_el$24, "paddingBottom", 1);
16585
- setProp(_el$25, "wrapMode", "none");
16586
- insert(_el$25, () => branches().length === 0 ? "(no local branches found \u2014 typed text will be used as ref)" : "(no match \u2014 typed text will be used as ref)");
16587
- effect((_$p) => setProp(_el$25, "fg", theme.textMuted, _$p));
16588
- return _el$24;
17157
+ var _el$22 = createElement("box"), _el$23 = createElement("text");
17158
+ insertNode(_el$22, _el$23);
17159
+ setProp(_el$22, "gap", 0);
17160
+ setProp(_el$22, "paddingLeft", 2);
17161
+ setProp(_el$22, "paddingBottom", 1);
17162
+ setProp(_el$23, "wrapMode", "none");
17163
+ insert(_el$23, () => branches().length === 0 ? "(no local branches found \u2014 typed text will be used as ref)" : "(no match \u2014 typed text will be used as ref)");
17164
+ effect((_$p) => setProp(_el$23, "fg", theme.textMuted, _$p));
17165
+ return _el$22;
16589
17166
  }
16590
- }), _el$33);
17167
+ }), _el$31);
16591
17168
  insert(_el$, createComponent2(Show, {
16592
17169
  get when() {
16593
17170
  return memo2(() => field() === "baseRef")() && branchFiltered().length > 0;
16594
17171
  },
16595
17172
  get children() {
16596
- var _el$26 = createElement("box");
16597
- setProp(_el$26, "gap", 0);
16598
- setProp(_el$26, "paddingLeft", 2);
16599
- setProp(_el$26, "paddingBottom", 1);
16600
- insert(_el$26, createComponent2(Show, {
17173
+ var _el$24 = createElement("box");
17174
+ setProp(_el$24, "gap", 0);
17175
+ setProp(_el$24, "paddingLeft", 2);
17176
+ setProp(_el$24, "paddingBottom", 1);
17177
+ insert(_el$24, createComponent2(Show, {
16601
17178
  get when() {
16602
17179
  return branchWindow().start > 0;
16603
17180
  },
16604
17181
  get children() {
16605
- var _el$27 = createElement("text"), _el$28 = createTextNode(`\u2191 `), _el$29 = createTextNode(` more`);
16606
- insertNode(_el$27, _el$28);
16607
- insertNode(_el$27, _el$29);
16608
- setProp(_el$27, "wrapMode", "none");
16609
- insert(_el$27, () => branchWindow().start, _el$29);
16610
- effect((_$p) => setProp(_el$27, "fg", theme.textMuted, _$p));
16611
- return _el$27;
17182
+ var _el$25 = createElement("text"), _el$26 = createTextNode(`\u2191 `), _el$27 = createTextNode(` more`);
17183
+ insertNode(_el$25, _el$26);
17184
+ insertNode(_el$25, _el$27);
17185
+ setProp(_el$25, "wrapMode", "none");
17186
+ insert(_el$25, () => branchWindow().start, _el$27);
17187
+ effect((_$p) => setProp(_el$25, "fg", theme.textMuted, _$p));
17188
+ return _el$25;
16612
17189
  }
16613
17190
  }), null);
16614
- insert(_el$26, createComponent2(For, {
17191
+ insert(_el$24, createComponent2(For, {
16615
17192
  get each() {
16616
17193
  return branchWindow().items;
16617
17194
  },
@@ -16620,61 +17197,61 @@ function NewTaskDialogView(props) {
16620
17197
  const isCursor = () => absoluteIndex() === branchCursor();
16621
17198
  const isSelected = () => baseRef().trim() === name;
16622
17199
  return (() => {
16623
- var _el$37 = createElement("text");
16624
- setProp(_el$37, "wrapMode", "none");
16625
- setProp(_el$37, "onMouseUp", () => {
17200
+ var _el$35 = createElement("text");
17201
+ setProp(_el$35, "wrapMode", "none");
17202
+ setProp(_el$35, "onMouseUp", () => {
16626
17203
  setBaseRef(name);
16627
17204
  setBranchCursor(absoluteIndex());
16628
17205
  commit();
16629
17206
  });
16630
- insert(_el$37, () => isCursor() ? "\u25B8 " : " ", null);
16631
- insert(_el$37, name, null);
17207
+ insert(_el$35, () => isCursor() ? "\u25B8 " : " ", null);
17208
+ insert(_el$35, name, null);
16632
17209
  effect((_p$) => {
16633
- var _v$12 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$13 = isCursor() ? TextAttributes18.BOLD : undefined;
16634
- _v$12 !== _p$.e && (_p$.e = setProp(_el$37, "fg", _v$12, _p$.e));
16635
- _v$13 !== _p$.t && (_p$.t = setProp(_el$37, "attributes", _v$13, _p$.t));
17210
+ var _v$12 = isCursor() ? theme.primary : isSelected() ? theme.accent : theme.textMuted, _v$13 = isCursor() ? TextAttributes19.BOLD : undefined;
17211
+ _v$12 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$12, _p$.e));
17212
+ _v$13 !== _p$.t && (_p$.t = setProp(_el$35, "attributes", _v$13, _p$.t));
16636
17213
  return _p$;
16637
17214
  }, {
16638
17215
  e: undefined,
16639
17216
  t: undefined
16640
17217
  });
16641
- return _el$37;
17218
+ return _el$35;
16642
17219
  })();
16643
17220
  }
16644
17221
  }), null);
16645
- insert(_el$26, createComponent2(Show, {
17222
+ insert(_el$24, createComponent2(Show, {
16646
17223
  get when() {
16647
17224
  return branchWindow().start + branchWindow().items.length < branchWindow().total;
16648
17225
  },
16649
17226
  get children() {
16650
- var _el$30 = createElement("text"), _el$31 = createTextNode(`\u2193 `), _el$32 = createTextNode(` more`);
16651
- insertNode(_el$30, _el$31);
16652
- insertNode(_el$30, _el$32);
16653
- setProp(_el$30, "wrapMode", "none");
16654
- insert(_el$30, () => branchWindow().total - branchWindow().start - branchWindow().items.length, _el$32);
16655
- effect((_$p) => setProp(_el$30, "fg", theme.textMuted, _$p));
16656
- return _el$30;
17227
+ var _el$28 = createElement("text"), _el$29 = createTextNode(`\u2193 `), _el$30 = createTextNode(` more`);
17228
+ insertNode(_el$28, _el$29);
17229
+ insertNode(_el$28, _el$30);
17230
+ setProp(_el$28, "wrapMode", "none");
17231
+ insert(_el$28, () => branchWindow().total - branchWindow().start - branchWindow().items.length, _el$30);
17232
+ effect((_$p) => setProp(_el$28, "fg", theme.textMuted, _$p));
17233
+ return _el$28;
16657
17234
  }
16658
17235
  }), null);
16659
- return _el$26;
17236
+ return _el$24;
16660
17237
  }
16661
- }), _el$33);
16662
- insertNode(_el$33, _el$34);
16663
- setProp(_el$33, "paddingBottom", 1);
16664
- insertNode(_el$34, createTextNode(`\u2191\u2193 pick \xB7 enter select \xB7 tab next field \xB7 esc cancel`));
17238
+ }), _el$31);
17239
+ insertNode(_el$31, _el$32);
17240
+ setProp(_el$31, "paddingBottom", 1);
17241
+ insertNode(_el$32, createTextNode(`\u2191\u2193 pick \xB7 enter select \xB7 tab next field \xB7 esc cancel`));
16665
17242
  effect((_p$) => {
16666
- var _v$ = TextAttributes18.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = field() === "repoCustom" ? theme.accent : theme.textMuted, _v$5 = repo(), _v$6 = props.defaultRepo, _v$7 = field() === "repoCustom", _v$8 = field() === "baseRef" ? theme.accent : theme.textMuted, _v$9 = baseRef(), _v$0 = field() === "baseRef", _v$1 = theme.textMuted;
17243
+ var _v$ = TextAttributes19.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = field() === "repo" ? theme.accent : theme.textMuted, _v$5 = repo(), _v$6 = props.defaultRepo, _v$7 = field() === "repo", _v$8 = field() === "baseRef" ? theme.accent : theme.textMuted, _v$9 = baseRef(), _v$0 = field() === "baseRef", _v$1 = theme.textMuted;
16667
17244
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
16668
17245
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
16669
17246
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
16670
- _v$4 !== _p$.o && (_p$.o = setProp(_el$15, "fg", _v$4, _p$.o));
16671
- _v$5 !== _p$.i && (_p$.i = setProp(_el$17, "value", _v$5, _p$.i));
16672
- _v$6 !== _p$.n && (_p$.n = setProp(_el$17, "placeholder", _v$6, _p$.n));
16673
- _v$7 !== _p$.s && (_p$.s = setProp(_el$17, "focused", _v$7, _p$.s));
16674
- _v$8 !== _p$.h && (_p$.h = setProp(_el$21, "fg", _v$8, _p$.h));
16675
- _v$9 !== _p$.r && (_p$.r = setProp(_el$23, "value", _v$9, _p$.r));
16676
- _v$0 !== _p$.d && (_p$.d = setProp(_el$23, "focused", _v$0, _p$.d));
16677
- _v$1 !== _p$.l && (_p$.l = setProp(_el$34, "fg", _v$1, _p$.l));
17247
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$8, "fg", _v$4, _p$.o));
17248
+ _v$5 !== _p$.i && (_p$.i = setProp(_el$0, "value", _v$5, _p$.i));
17249
+ _v$6 !== _p$.n && (_p$.n = setProp(_el$0, "placeholder", _v$6, _p$.n));
17250
+ _v$7 !== _p$.s && (_p$.s = setProp(_el$0, "focused", _v$7, _p$.s));
17251
+ _v$8 !== _p$.h && (_p$.h = setProp(_el$19, "fg", _v$8, _p$.h));
17252
+ _v$9 !== _p$.r && (_p$.r = setProp(_el$21, "value", _v$9, _p$.r));
17253
+ _v$0 !== _p$.d && (_p$.d = setProp(_el$21, "focused", _v$0, _p$.d));
17254
+ _v$1 !== _p$.l && (_p$.l = setProp(_el$32, "fg", _v$1, _p$.l));
16678
17255
  return _p$;
16679
17256
  }, {
16680
17257
  e: undefined,
@@ -16731,7 +17308,7 @@ var init_new_task_dialog = __esm(() => {
16731
17308
  });
16732
17309
 
16733
17310
  // src/tui/component/rename-task-dialog/dialog.tsx
16734
- import { TextAttributes as TextAttributes19 } from "@opentui/core";
17311
+ import { TextAttributes as TextAttributes20 } from "@opentui/core";
16735
17312
  function RenameTaskDialogView(props) {
16736
17313
  const dialog = useDialog();
16737
17314
  const {
@@ -16771,7 +17348,7 @@ function RenameTaskDialogView(props) {
16771
17348
  setProp(_el$0, "paddingBottom", 1);
16772
17349
  insertNode(_el$1, createTextNode(`enter rename \xB7 esc cancel`));
16773
17350
  effect((_p$) => {
16774
- var _v$ = TextAttributes19.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.accent, _v$5 = title(), _v$6 = props.currentTitle, _v$7 = theme.textMuted;
17351
+ var _v$ = TextAttributes20.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.accent, _v$5 = title(), _v$6 = props.currentTitle, _v$7 = theme.textMuted;
16775
17352
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
16776
17353
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
16777
17354
  _v$3 !== _p$.a && (_p$.a = setProp(_el$4, "fg", _v$3, _p$.a));
@@ -17094,7 +17671,7 @@ var init_use_workspace_tabs = __esm(() => {
17094
17671
  });
17095
17672
 
17096
17673
  // src/tui/component/resume-dialog.tsx
17097
- import { TextAttributes as TextAttributes20 } from "@opentui/core";
17674
+ import { TextAttributes as TextAttributes21 } from "@opentui/core";
17098
17675
  function ResumeDialog(props) {
17099
17676
  const dialog = useDialog();
17100
17677
  const {
@@ -17241,7 +17818,7 @@ function ResumeDialog(props) {
17241
17818
  setProp(_el$9, "paddingBottom", 1);
17242
17819
  insertNode(_el$0, createTextNode(`j/k or \u2191\u2193 navigate \u2022 enter resume \u2022 esc dismiss`));
17243
17820
  effect((_p$) => {
17244
- var _v$ = TextAttributes20.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
17821
+ var _v$ = TextAttributes21.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
17245
17822
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
17246
17823
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
17247
17824
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -17566,7 +18143,7 @@ var init_mention = __esm(() => {
17566
18143
  });
17567
18144
 
17568
18145
  // src/tui/panes/chat/Composer.tsx
17569
- import { TextAttributes as TextAttributes21 } from "@opentui/core";
18146
+ import { TextAttributes as TextAttributes22 } from "@opentui/core";
17570
18147
  function resolvePlaceholder(opts) {
17571
18148
  if (!opts.hasTask)
17572
18149
  return opts.noTaskMessage ?? "(no task \u2014 press n to create)";
@@ -18134,7 +18711,7 @@ function Composer(props) {
18134
18711
  }
18135
18712
  }), null);
18136
18713
  effect((_p$) => {
18137
- var _v$20 = active() ? theme.primary : theme.text, _v$21 = active() ? TextAttributes21.BOLD : undefined;
18714
+ var _v$20 = active() ? theme.primary : theme.text, _v$21 = active() ? TextAttributes22.BOLD : undefined;
18138
18715
  _v$20 !== _p$.e && (_p$.e = setProp(_el$28, "fg", _v$20, _p$.e));
18139
18716
  _v$21 !== _p$.t && (_p$.t = setProp(_el$28, "attributes", _v$21, _p$.t));
18140
18717
  return _p$;
@@ -18241,7 +18818,7 @@ function Composer(props) {
18241
18818
  }
18242
18819
  }), null);
18243
18820
  effect((_p$) => {
18244
- var _v$22 = active() ? theme.primary : theme.text, _v$23 = active() ? TextAttributes21.BOLD : undefined;
18821
+ var _v$22 = active() ? theme.primary : theme.text, _v$23 = active() ? TextAttributes22.BOLD : undefined;
18245
18822
  _v$22 !== _p$.e && (_p$.e = setProp(_el$31, "fg", _v$22, _p$.e));
18246
18823
  _v$23 !== _p$.t && (_p$.t = setProp(_el$31, "attributes", _v$23, _p$.t));
18247
18824
  return _p$;
@@ -19075,7 +19652,7 @@ function summarizeGlob(input, output, done) {
19075
19652
  }
19076
19653
 
19077
19654
  // src/tui/panes/chat/MessageList.tsx
19078
- import { TextAttributes as TextAttributes22 } from "@opentui/core";
19655
+ import { TextAttributes as TextAttributes23 } from "@opentui/core";
19079
19656
  function previewToolInput(input) {
19080
19657
  if (input == null)
19081
19658
  return "";
@@ -19171,7 +19748,7 @@ function UserRow(props) {
19171
19748
  })() : null;
19172
19749
  })(), null);
19173
19750
  effect((_p$) => {
19174
- var _v$ = theme.accent, _v$2 = TextAttributes22.BOLD, _v$3 = theme.primary, _v$4 = TextAttributes22.BOLD;
19751
+ var _v$ = theme.accent, _v$2 = TextAttributes23.BOLD, _v$3 = theme.primary, _v$4 = TextAttributes23.BOLD;
19175
19752
  _v$ !== _p$.e && (_p$.e = setProp(_el$2, "fg", _v$, _p$.e));
19176
19753
  _v$2 !== _p$.t && (_p$.t = setProp(_el$2, "attributes", _v$2, _p$.t));
19177
19754
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -19251,7 +19828,7 @@ function UserRow(props) {
19251
19828
  setProp(_el$21, "flexGrow", 1);
19252
19829
  insert(_el$22, () => view.text);
19253
19830
  effect((_p$) => {
19254
- var _v$9 = theme.accent, _v$0 = TextAttributes22.BOLD, _v$1 = theme.text;
19831
+ var _v$9 = theme.accent, _v$0 = TextAttributes23.BOLD, _v$1 = theme.text;
19255
19832
  _v$9 !== _p$.e && (_p$.e = setProp(_el$19, "fg", _v$9, _p$.e));
19256
19833
  _v$0 !== _p$.t && (_p$.t = setProp(_el$19, "attributes", _v$0, _p$.t));
19257
19834
  _v$1 !== _p$.a && (_p$.a = setProp(_el$22, "fg", _v$1, _p$.a));
@@ -19287,7 +19864,7 @@ function AssistantRow(props) {
19287
19864
  }
19288
19865
  }));
19289
19866
  effect((_p$) => {
19290
- var _v$10 = theme.accent, _v$11 = TextAttributes22.BOLD;
19867
+ var _v$10 = theme.accent, _v$11 = TextAttributes23.BOLD;
19291
19868
  _v$10 !== _p$.e && (_p$.e = setProp(_el$25, "fg", _v$10, _p$.e));
19292
19869
  _v$11 !== _p$.t && (_p$.t = setProp(_el$25, "attributes", _v$11, _p$.t));
19293
19870
  return _p$;
@@ -19362,7 +19939,7 @@ function ToolRow(props) {
19362
19939
  }), null);
19363
19940
  effect((_p$) => {
19364
19941
  var _v$18 = theme.text, _v$19 = {
19365
- attributes: TextAttributes22.BOLD
19942
+ attributes: TextAttributes23.BOLD
19366
19943
  };
19367
19944
  _v$18 !== _p$.e && (_p$.e = setProp(_el$45, "fg", _v$18, _p$.e));
19368
19945
  _v$19 !== _p$.t && (_p$.t = setProp(_el$46, "style", _v$19, _p$.t));
@@ -19530,7 +20107,7 @@ function ToolRow(props) {
19530
20107
  }
19531
20108
  }), null);
19532
20109
  effect((_p$) => {
19533
- var _v$16 = prefixColor(), _v$17 = TextAttributes22.BOLD;
20110
+ var _v$16 = prefixColor(), _v$17 = TextAttributes23.BOLD;
19534
20111
  _v$16 !== _p$.e && (_p$.e = setProp(_el$29, "fg", _v$16, _p$.e));
19535
20112
  _v$17 !== _p$.t && (_p$.t = setProp(_el$29, "attributes", _v$17, _p$.t));
19536
20113
  return _p$;
@@ -19769,7 +20346,7 @@ function BashBanner(props) {
19769
20346
  }
19770
20347
  }), null);
19771
20348
  effect((_p$) => {
19772
- var _v$28 = theme.accent, _v$29 = TextAttributes22.BOLD, _v$30 = theme.text;
20349
+ var _v$28 = theme.accent, _v$29 = TextAttributes23.BOLD, _v$30 = theme.text;
19773
20350
  _v$28 !== _p$.e && (_p$.e = setProp(_el$73, "fg", _v$28, _p$.e));
19774
20351
  _v$29 !== _p$.t && (_p$.t = setProp(_el$73, "attributes", _v$29, _p$.t));
19775
20352
  _v$30 !== _p$.a && (_p$.a = setProp(_el$76, "fg", _v$30, _p$.a));
@@ -19857,7 +20434,7 @@ function ReadGrepGlobBanner(props) {
19857
20434
  }), null);
19858
20435
  effect((_p$) => {
19859
20436
  var _v$31 = theme.text, _v$32 = {
19860
- attributes: TextAttributes22.BOLD
20437
+ attributes: TextAttributes23.BOLD
19861
20438
  };
19862
20439
  _v$31 !== _p$.e && (_p$.e = setProp(_el$81, "fg", _v$31, _p$.e));
19863
20440
  _v$32 !== _p$.t && (_p$.t = setProp(_el$82, "style", _v$32, _p$.t));
@@ -19886,7 +20463,7 @@ function SystemRow(props) {
19886
20463
  setProp(_el$87, "flexGrow", 1);
19887
20464
  insert(_el$88, () => props.text);
19888
20465
  effect((_p$) => {
19889
- var _v$33 = theme.textMuted, _v$34 = TextAttributes22.DIM, _v$35 = isError() ? theme.error : theme.textMuted;
20466
+ var _v$33 = theme.textMuted, _v$34 = TextAttributes23.DIM, _v$35 = isError() ? theme.error : theme.textMuted;
19890
20467
  _v$33 !== _p$.e && (_p$.e = setProp(_el$85, "fg", _v$33, _p$.e));
19891
20468
  _v$34 !== _p$.t && (_p$.t = setProp(_el$85, "attributes", _v$34, _p$.t));
19892
20469
  _v$35 !== _p$.a && (_p$.a = setProp(_el$88, "fg", _v$35, _p$.a));
@@ -19976,7 +20553,7 @@ function ApprovalRow(props) {
19976
20553
  insertNode(_el$103, _el$105);
19977
20554
  insert(_el$103, () => r().status, _el$105);
19978
20555
  effect((_p$) => {
19979
- var _v$44 = r().status === "approved" ? theme.success : theme.error, _v$45 = TextAttributes22.BOLD;
20556
+ var _v$44 = r().status === "approved" ? theme.success : theme.error, _v$45 = TextAttributes23.BOLD;
19980
20557
  _v$44 !== _p$.e && (_p$.e = setProp(_el$103, "fg", _v$44, _p$.e));
19981
20558
  _v$45 !== _p$.t && (_p$.t = setProp(_el$103, "attributes", _v$45, _p$.t));
19982
20559
  return _p$;
@@ -19993,7 +20570,7 @@ function ApprovalRow(props) {
19993
20570
  insertNode(_el$99, createTextNode(`[ Approve ]`));
19994
20571
  setProp(_el$99, "onMouseUp", () => props.onApprove(true));
19995
20572
  effect((_p$) => {
19996
- var _v$36 = theme.success, _v$37 = TextAttributes22.BOLD;
20573
+ var _v$36 = theme.success, _v$37 = TextAttributes23.BOLD;
19997
20574
  _v$36 !== _p$.e && (_p$.e = setProp(_el$99, "fg", _v$36, _p$.e));
19998
20575
  _v$37 !== _p$.t && (_p$.t = setProp(_el$99, "attributes", _v$37, _p$.t));
19999
20576
  return _p$;
@@ -20007,7 +20584,7 @@ function ApprovalRow(props) {
20007
20584
  insertNode(_el$101, createTextNode(`[ Reject ]`));
20008
20585
  setProp(_el$101, "onMouseUp", () => props.onApprove(false));
20009
20586
  effect((_p$) => {
20010
- var _v$38 = theme.error, _v$39 = TextAttributes22.BOLD;
20587
+ var _v$38 = theme.error, _v$39 = TextAttributes23.BOLD;
20011
20588
  _v$38 !== _p$.e && (_p$.e = setProp(_el$101, "fg", _v$38, _p$.e));
20012
20589
  _v$39 !== _p$.t && (_p$.t = setProp(_el$101, "attributes", _v$39, _p$.t));
20013
20590
  return _p$;
@@ -20020,7 +20597,7 @@ function ApprovalRow(props) {
20020
20597
  }
20021
20598
  }));
20022
20599
  effect((_p$) => {
20023
- var _v$40 = headerColor(), _v$41 = TextAttributes22.BOLD, _v$42 = headerColor(), _v$43 = TextAttributes22.BOLD;
20600
+ var _v$40 = headerColor(), _v$41 = TextAttributes23.BOLD, _v$42 = headerColor(), _v$43 = TextAttributes23.BOLD;
20024
20601
  _v$40 !== _p$.e && (_p$.e = setProp(_el$91, "fg", _v$40, _p$.e));
20025
20602
  _v$41 !== _p$.t && (_p$.t = setProp(_el$91, "attributes", _v$41, _p$.t));
20026
20603
  _v$42 !== _p$.a && (_p$.a = setProp(_el$92, "fg", _v$42, _p$.a));
@@ -20242,7 +20819,7 @@ function QuestionRow(props) {
20242
20819
  insertNode(_el$116, _el$118);
20243
20820
  insert(_el$116, () => q.header, _el$118);
20244
20821
  effect((_p$) => {
20245
- var _v$52 = theme.accent, _v$53 = TextAttributes22.BOLD;
20822
+ var _v$52 = theme.accent, _v$53 = TextAttributes23.BOLD;
20246
20823
  _v$52 !== _p$.e && (_p$.e = setProp(_el$116, "fg", _v$52, _p$.e));
20247
20824
  _v$53 !== _p$.t && (_p$.t = setProp(_el$116, "attributes", _v$53, _p$.t));
20248
20825
  return _p$;
@@ -20356,7 +20933,7 @@ function QuestionRow(props) {
20356
20933
  }
20357
20934
  }), null);
20358
20935
  effect((_p$) => {
20359
- var _v$58 = isHl() ? theme.accent : theme.textMuted, _v$59 = TextAttributes22.BOLD, _v$60 = theme.textMuted, _v$61 = isPicked() ? theme.accent : theme.textMuted, _v$62 = TextAttributes22.BOLD, _v$63 = theme.text;
20936
+ var _v$58 = isHl() ? theme.accent : theme.textMuted, _v$59 = TextAttributes23.BOLD, _v$60 = theme.textMuted, _v$61 = isPicked() ? theme.accent : theme.textMuted, _v$62 = TextAttributes23.BOLD, _v$63 = theme.text;
20360
20937
  _v$58 !== _p$.e && (_p$.e = setProp(_el$136, "fg", _v$58, _p$.e));
20361
20938
  _v$59 !== _p$.t && (_p$.t = setProp(_el$136, "attributes", _v$59, _p$.t));
20362
20939
  _v$60 !== _p$.a && (_p$.a = setProp(_el$137, "fg", _v$60, _p$.a));
@@ -20401,7 +20978,7 @@ function QuestionRow(props) {
20401
20978
  insertNode(_el$147, createTextNode(`Other`));
20402
20979
  insertNode(_el$149, createTextNode(`Type your own answer`));
20403
20980
  effect((_p$) => {
20404
- var _v$64 = isOtherHl() ? theme.accent : theme.textMuted, _v$65 = TextAttributes22.BOLD, _v$66 = theme.textMuted, _v$67 = otherPicked() ? theme.accent : theme.textMuted, _v$68 = TextAttributes22.BOLD, _v$69 = theme.text, _v$70 = theme.textMuted;
20981
+ var _v$64 = isOtherHl() ? theme.accent : theme.textMuted, _v$65 = TextAttributes23.BOLD, _v$66 = theme.textMuted, _v$67 = otherPicked() ? theme.accent : theme.textMuted, _v$68 = TextAttributes23.BOLD, _v$69 = theme.text, _v$70 = theme.textMuted;
20405
20982
  _v$64 !== _p$.e && (_p$.e = setProp(_el$143, "fg", _v$64, _p$.e));
20406
20983
  _v$65 !== _p$.t && (_p$.t = setProp(_el$143, "attributes", _v$65, _p$.t));
20407
20984
  _v$66 !== _p$.a && (_p$.a = setProp(_el$144, "fg", _v$66, _p$.a));
@@ -20457,7 +21034,7 @@ function QuestionRow(props) {
20457
21034
  }
20458
21035
  }), null);
20459
21036
  effect((_p$) => {
20460
- var _v$54 = isQuestionComplete(index()) ? theme.success : theme.textMuted, _v$55 = TextAttributes22.BOLD;
21037
+ var _v$54 = isQuestionComplete(index()) ? theme.success : theme.textMuted, _v$55 = TextAttributes23.BOLD;
20461
21038
  _v$54 !== _p$.e && (_p$.e = setProp(_el$132, "fg", _v$54, _p$.e));
20462
21039
  _v$55 !== _p$.t && (_p$.t = setProp(_el$132, "attributes", _v$55, _p$.t));
20463
21040
  return _p$;
@@ -20493,7 +21070,7 @@ function QuestionRow(props) {
20493
21070
  setProp(_el$111, "paddingTop", 1);
20494
21071
  insertNode(_el$112, createTextNode(`[submitted]`));
20495
21072
  effect((_p$) => {
20496
- var _v$46 = theme.success, _v$47 = TextAttributes22.BOLD;
21073
+ var _v$46 = theme.success, _v$47 = TextAttributes23.BOLD;
20497
21074
  _v$46 !== _p$.e && (_p$.e = setProp(_el$112, "fg", _v$46, _p$.e));
20498
21075
  _v$47 !== _p$.t && (_p$.t = setProp(_el$112, "attributes", _v$47, _p$.t));
20499
21076
  return _p$;
@@ -20505,7 +21082,7 @@ function QuestionRow(props) {
20505
21082
  }
20506
21083
  }), null);
20507
21084
  effect((_p$) => {
20508
- var _v$48 = theme.warning, _v$49 = TextAttributes22.BOLD, _v$50 = theme.warning, _v$51 = TextAttributes22.BOLD;
21085
+ var _v$48 = theme.warning, _v$49 = TextAttributes23.BOLD, _v$50 = theme.warning, _v$51 = TextAttributes23.BOLD;
20509
21086
  _v$48 !== _p$.e && (_p$.e = setProp(_el$108, "fg", _v$48, _p$.e));
20510
21087
  _v$49 !== _p$.t && (_p$.t = setProp(_el$108, "attributes", _v$49, _p$.t));
20511
21088
  _v$50 !== _p$.a && (_p$.a = setProp(_el$110, "fg", _v$50, _p$.a));
@@ -20625,7 +21202,7 @@ function MessageList(props) {
20625
21202
  insertNode(_el$160, _el$161);
20626
21203
  insert(_el$160, () => props.error, null);
20627
21204
  effect((_p$) => {
20628
- var _v$71 = theme.error, _v$72 = TextAttributes22.BOLD, _v$73 = theme.error;
21205
+ var _v$71 = theme.error, _v$72 = TextAttributes23.BOLD, _v$73 = theme.error;
20629
21206
  _v$71 !== _p$.e && (_p$.e = setProp(_el$158, "fg", _v$71, _p$.e));
20630
21207
  _v$72 !== _p$.t && (_p$.t = setProp(_el$158, "attributes", _v$72, _p$.t));
20631
21208
  _v$73 !== _p$.a && (_p$.a = setProp(_el$160, "fg", _v$73, _p$.a));
@@ -20781,7 +21358,7 @@ function ToolFoldRow(props) {
20781
21358
  setProp(_el$164, "flexGrow", 1);
20782
21359
  insert(_el$165, () => props.summary);
20783
21360
  effect((_p$) => {
20784
- var _v$74 = fg(), _v$75 = TextAttributes22.DIM, _v$76 = theme.textMuted;
21361
+ var _v$74 = fg(), _v$75 = TextAttributes23.DIM, _v$76 = theme.textMuted;
20785
21362
  _v$74 !== _p$.e && (_p$.e = setProp(_el$163, "fg", _v$74, _p$.e));
20786
21363
  _v$75 !== _p$.t && (_p$.t = setProp(_el$163, "attributes", _v$75, _p$.t));
20787
21364
  _v$76 !== _p$.a && (_p$.a = setProp(_el$165, "fg", _v$76, _p$.a));
@@ -20846,7 +21423,7 @@ var init_models = __esm(() => {
20846
21423
  });
20847
21424
 
20848
21425
  // src/tui/panes/chat/composer/ModelPicker.tsx
20849
- import { TextAttributes as TextAttributes23 } from "@opentui/core";
21426
+ import { TextAttributes as TextAttributes24 } from "@opentui/core";
20850
21427
  function ModelPicker(props) {
20851
21428
  const dialog = useDialog();
20852
21429
  const {
@@ -20926,7 +21503,7 @@ function ModelPicker(props) {
20926
21503
  })() : null;
20927
21504
  })(), null);
20928
21505
  effect((_p$) => {
20929
- var _v$5 = active() ? theme.primary : undefined, _v$6 = active() ? theme.selectedListItemText : theme.text, _v$7 = active() ? TextAttributes23.BOLD : undefined;
21506
+ var _v$5 = active() ? theme.primary : undefined, _v$6 = active() ? theme.selectedListItemText : theme.text, _v$7 = active() ? TextAttributes24.BOLD : undefined;
20930
21507
  _v$5 !== _p$.e && (_p$.e = setProp(_el$1, "backgroundColor", _v$5, _p$.e));
20931
21508
  _v$6 !== _p$.t && (_p$.t = setProp(_el$10, "fg", _v$6, _p$.t));
20932
21509
  _v$7 !== _p$.a && (_p$.a = setProp(_el$10, "attributes", _v$7, _p$.a));
@@ -20944,7 +21521,7 @@ function ModelPicker(props) {
20944
21521
  setProp(_el$8, "paddingBottom", 1);
20945
21522
  insertNode(_el$9, createTextNode(`\u2191\u2193 pick \xB7 enter select \xB7 esc cancel`));
20946
21523
  effect((_p$) => {
20947
- var _v$ = TextAttributes23.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
21524
+ var _v$ = TextAttributes24.BOLD, _v$2 = theme.text, _v$3 = theme.textMuted, _v$4 = theme.textMuted;
20948
21525
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "attributes", _v$, _p$.e));
20949
21526
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
20950
21527
  _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
@@ -20986,10 +21563,10 @@ var init_ModelPicker = __esm(() => {
20986
21563
 
20987
21564
  // src/tui/panes/chat/composer/user-slashes.ts
20988
21565
  import { readFile as readFile6, readdir as readdir3, stat as stat3 } from "fs/promises";
20989
- import { homedir as homedir10 } from "os";
21566
+ import { homedir as homedir11 } from "os";
20990
21567
  import { join as join14 } from "path";
20991
21568
  function resolveHome() {
20992
- return process.env.HOME ?? homedir10();
21569
+ return process.env.HOME ?? homedir11();
20993
21570
  }
20994
21571
  async function safeReaddir(path8) {
20995
21572
  try {
@@ -21701,7 +22278,7 @@ var init_use_chat_session = __esm(() => {
21701
22278
  });
21702
22279
 
21703
22280
  // src/tui/panes/chat/Chat.tsx
21704
- import { TextAttributes as TextAttributes24 } from "@opentui/core";
22281
+ import { TextAttributes as TextAttributes25 } from "@opentui/core";
21705
22282
  function Chat(props) {
21706
22283
  const {
21707
22284
  theme
@@ -22369,7 +22946,7 @@ function QueuedPromptList(props) {
22369
22946
  insertNode(_el$19, createTextNode(`[x]`));
22370
22947
  setProp(_el$19, "onMouseUp", () => props.onCancel(entry.id));
22371
22948
  effect((_p$) => {
22372
- var _v$4 = theme.textMuted, _v$5 = TextAttributes24.BOLD, _v$6 = theme.textMuted, _v$7 = theme.text, _v$8 = theme.error, _v$9 = TextAttributes24.BOLD;
22949
+ var _v$4 = theme.textMuted, _v$5 = TextAttributes25.BOLD, _v$6 = theme.textMuted, _v$7 = theme.text, _v$8 = theme.error, _v$9 = TextAttributes25.BOLD;
22373
22950
  _v$4 !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$4, _p$.e));
22374
22951
  _v$5 !== _p$.t && (_p$.t = setProp(_el$11, "attributes", _v$5, _p$.t));
22375
22952
  _v$6 !== _p$.a && (_p$.a = setProp(_el$14, "fg", _v$6, _p$.a));
@@ -22402,7 +22979,7 @@ function QueuedPromptList(props) {
22402
22979
  insertNode(_el$9, createTextNode(`+`));
22403
22980
  insert(_el$1, () => `\u2026 ${hidden()} more queued`);
22404
22981
  effect((_p$) => {
22405
- var _v$ = theme.textMuted, _v$2 = TextAttributes24.BOLD, _v$3 = theme.textMuted;
22982
+ var _v$ = theme.textMuted, _v$2 = TextAttributes25.BOLD, _v$3 = theme.textMuted;
22406
22983
  _v$ !== _p$.e && (_p$.e = setProp(_el$9, "fg", _v$, _p$.e));
22407
22984
  _v$2 !== _p$.t && (_p$.t = setProp(_el$9, "attributes", _v$2, _p$.t));
22408
22985
  _v$3 !== _p$.a && (_p$.a = setProp(_el$1, "fg", _v$3, _p$.a));
@@ -22448,7 +23025,7 @@ var init_Chat = __esm(() => {
22448
23025
  });
22449
23026
 
22450
23027
  // src/tui/component/sidebar.tsx
22451
- import { TextAttributes as TextAttributes25 } from "@opentui/core";
23028
+ import { TextAttributes as TextAttributes26 } from "@opentui/core";
22452
23029
  function Sidebar(props) {
22453
23030
  const {
22454
23031
  theme
@@ -22474,7 +23051,7 @@ function Sidebar(props) {
22474
23051
  setProp(_el$2, "paddingBottom", 1);
22475
23052
  insert(_el$3, () => props.title);
22476
23053
  effect((_p$) => {
22477
- var _v$ = theme.text, _v$2 = TextAttributes25.BOLD;
23054
+ var _v$ = theme.text, _v$2 = TextAttributes26.BOLD;
22478
23055
  _v$ !== _p$.e && (_p$.e = setProp(_el$3, "fg", _v$, _p$.e));
22479
23056
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "attributes", _v$2, _p$.t));
22480
23057
  return _p$;
@@ -22733,7 +23310,7 @@ var init_keys4 = __esm(() => {
22733
23310
  });
22734
23311
 
22735
23312
  // src/tui/panes/sidebar/Sidebar.tsx
22736
- import { TextAttributes as TextAttributes26 } from "@opentui/core";
23313
+ import { TextAttributes as TextAttributes27 } from "@opentui/core";
22737
23314
  function Sidebar2(props) {
22738
23315
  const {
22739
23316
  theme
@@ -22825,7 +23402,7 @@ function Sidebar2(props) {
22825
23402
  return () => _c$() ? `[ ${tab.label} ]` : tab.label;
22826
23403
  })());
22827
23404
  effect((_p$) => {
22828
- var _v$7 = active() ? theme.primary : theme.textMuted, _v$8 = active() ? TextAttributes26.BOLD : undefined;
23405
+ var _v$7 = active() ? theme.primary : theme.textMuted, _v$8 = active() ? TextAttributes27.BOLD : undefined;
22829
23406
  _v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));
22830
23407
  _v$8 !== _p$.t && (_p$.t = setProp(_el$13, "attributes", _v$8, _p$.t));
22831
23408
  return _p$;
@@ -22920,7 +23497,7 @@ function Sidebar2(props) {
22920
23497
  }
22921
23498
  }), null);
22922
23499
  effect((_p$) => {
22923
- var _v$9 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$0 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$1 = isCursor() ? theme.selectedListItemText : theme.text, _v$10 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes26.BOLD : undefined;
23500
+ var _v$9 = isCursor() ? theme.primary : isSelected() ? theme.backgroundElement : undefined, _v$0 = isCursor() ? theme.selectedListItemText : badgeColor(), _v$1 = isCursor() ? theme.selectedListItemText : theme.text, _v$10 = (isMain || isSelected() && !isCursor()) && !isCursor() ? TextAttributes27.BOLD : undefined;
22924
23501
  _v$9 !== _p$.e && (_p$.e = setProp(_el$14, "backgroundColor", _v$9, _p$.e));
22925
23502
  _v$0 !== _p$.t && (_p$.t = setProp(_el$15, "fg", _v$0, _p$.t));
22926
23503
  _v$1 !== _p$.a && (_p$.a = setProp(_el$16, "fg", _v$1, _p$.a));
@@ -22958,7 +23535,7 @@ function Sidebar2(props) {
22958
23535
  setProp(_el$11, "wrapMode", "none");
22959
23536
  setProp(_el$11, "onMouseUp", () => props.onAddTask?.());
22960
23537
  effect((_p$) => {
22961
- var _v$ = props.width ? props.width() : SIDEBAR_WIDTH, _v$2 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$3 = TextAttributes26.BOLD, _v$4 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$5 = TextAttributes26.BOLD, _v$6 = theme.textMuted;
23538
+ var _v$ = props.width ? props.width() : SIDEBAR_WIDTH, _v$2 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$3 = TextAttributes27.BOLD, _v$4 = focusedAccessor() ? theme.focusAccent : theme.textMuted, _v$5 = TextAttributes27.BOLD, _v$6 = theme.textMuted;
22962
23539
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "width", _v$, _p$.e));
22963
23540
  _v$2 !== _p$.t && (_p$.t = setProp(_el$3, "fg", _v$2, _p$.t));
22964
23541
  _v$3 !== _p$.a && (_p$.a = setProp(_el$3, "attributes", _v$3, _p$.a));
@@ -23034,7 +23611,10 @@ import { dirname as dirname6 } from "path";
23034
23611
  async function startBridgeServer(orch, socketPath) {
23035
23612
  await mkdir3(dirname6(socketPath), { recursive: true });
23036
23613
  await unlink3(socketPath).catch(() => {});
23614
+ const conns = new Set;
23037
23615
  const server = createServer((conn) => {
23616
+ conns.add(conn);
23617
+ conn.on("close", () => conns.delete(conn));
23038
23618
  let buffer = "";
23039
23619
  conn.on("data", (chunk) => {
23040
23620
  buffer += chunk.toString("utf8");
@@ -23067,6 +23647,9 @@ async function startBridgeServer(orch, socketPath) {
23067
23647
  return {
23068
23648
  socketPath,
23069
23649
  async close() {
23650
+ for (const conn of conns)
23651
+ conn.destroy();
23652
+ conns.clear();
23070
23653
  await new Promise((resolve4) => server.close(() => resolve4()));
23071
23654
  await unlink3(socketPath).catch(() => {});
23072
23655
  }
@@ -23160,11 +23743,11 @@ __export(exports_bridge, {
23160
23743
  startBridge: () => startBridge
23161
23744
  });
23162
23745
  import { writeFile as writeFile3 } from "fs/promises";
23163
- import { homedir as homedir11 } from "os";
23746
+ import { homedir as homedir12 } from "os";
23164
23747
  import { join as join15 } from "path";
23165
23748
  import { fileURLToPath as fileURLToPath2 } from "url";
23166
23749
  async function startBridge(orch, opts = {}) {
23167
- const home = opts.homeDir ?? process.env.KOBE_HOME_DIR ?? homedir11();
23750
+ const home = opts.homeDir ?? process.env.KOBE_HOME_DIR ?? homedir12();
23168
23751
  const runDir = join15(home, ".kobe", "run");
23169
23752
  const socketPath = join15(runDir, `bridge-${process.pid}.sock`);
23170
23753
  const mcpConfigPath = join15(runDir, `mcp-${process.pid}.json`);
@@ -23194,7 +23777,7 @@ var init_bridge = __esm(() => {
23194
23777
  });
23195
23778
 
23196
23779
  // src/tui/app.tsx
23197
- import { homedir as homedir12 } from "os";
23780
+ import { homedir as homedir13 } from "os";
23198
23781
  import { join as join16 } from "path";
23199
23782
  function Shell(props) {
23200
23783
  const themeCtx = useTheme();
@@ -23213,6 +23796,7 @@ function Shell(props) {
23213
23796
  const [workspaceContextAside, setWorkspaceContextAside] = createSignal(null);
23214
23797
  const planUsageAcc = props.orchestrator.planUsageSignal();
23215
23798
  const workspacePlanAside = createMemo(() => formatPlanUsageCompact(planUsageAcc()));
23799
+ const rcBridgeAcc = props.orchestrator.rcBridgeSignal();
23216
23800
  const [updateInfo, setUpdateInfo] = createSignal(null);
23217
23801
  onMount(() => {
23218
23802
  checkLatestVersion().then((info) => {
@@ -23303,6 +23887,20 @@ function Shell(props) {
23303
23887
  return;
23304
23888
  return parts.join(" \u2022 ");
23305
23889
  });
23890
+ const palette = useCommandPalette();
23891
+ onMount(() => {
23892
+ if (!(props.orchestrator instanceof RemoteOrchestrator))
23893
+ return;
23894
+ const orch = props.orchestrator;
23895
+ const unregister = palette.addCommand({
23896
+ name: "rcBridge.share",
23897
+ title: "Share to claude.ai (remote-control)",
23898
+ desc: "Bind this task's worktree to a claude.ai environment so you can resume the conversation from another device.",
23899
+ slashName: "share",
23900
+ run: () => RcBridgeDialog.show(dialog, orch, rcBridgeAcc, activeTask, activeChatTabIdAcc)
23901
+ });
23902
+ onCleanup(unregister);
23903
+ });
23306
23904
  let pendingPersistedId = persistedSelectedId ?? null;
23307
23905
  createEffect(() => {
23308
23906
  const tasks = tasksAcc();
@@ -23325,7 +23923,6 @@ function Shell(props) {
23325
23923
  });
23326
23924
  useKobeKeybindings({
23327
23925
  onShowHelp: () => HelpDialog.show(dialog),
23328
- onFocusDetach: () => setFocusedPane("sidebar"),
23329
23926
  onFocusNext: () => {
23330
23927
  if (focusedPane() !== "workspace")
23331
23928
  focus.cycle(1);
@@ -23400,6 +23997,7 @@ function Shell(props) {
23400
23997
  return props.orchestrator;
23401
23998
  },
23402
23999
  activeTask,
24000
+ activeChatTabId: activeChatTabIdAcc,
23403
24001
  updateInfo
23404
24002
  }), _el$2);
23405
24003
  insertNode(_el$2, _el$3);
@@ -23648,7 +24246,7 @@ async function startApp() {
23648
24246
  } of loadUserThemes()) {
23649
24247
  addTheme(name, theme);
23650
24248
  }
23651
- const homeDir2 = process.env.KOBE_HOME_DIR ?? homedir12();
24249
+ const homeDir2 = process.env.KOBE_HOME_DIR ?? homedir13();
23652
24250
  let orchestrator;
23653
24251
  if (process.env.KOBE_TEST_ENGINE || process.env.KOBE_NO_DAEMON === "1") {
23654
24252
  const engine3 = await buildEngine();
@@ -23715,6 +24313,7 @@ var init_app = __esm(() => {
23715
24313
  init_center_tab_strip();
23716
24314
  init_help_dialog();
23717
24315
  init_pane_header();
24316
+ init_rc_bridge_dialog();
23718
24317
  init_resizable_edge();
23719
24318
  init_status_bar();
23720
24319
  init_toast_overlay();
@@ -23746,7 +24345,7 @@ var exports_tui = {};
23746
24345
  __export(exports_tui, {
23747
24346
  startTui: () => startTui
23748
24347
  });
23749
- import { TextAttributes as TextAttributes27 } from "@opentui/core";
24348
+ import { TextAttributes as TextAttributes28 } from "@opentui/core";
23750
24349
  function HelpHint() {
23751
24350
  const {
23752
24351
  theme
@@ -23820,7 +24419,7 @@ function Banner() {
23820
24419
  insert(_el$20, selected);
23821
24420
  insert(_el$12, createComponent2(HelpHint, {}), null);
23822
24421
  effect((_p$) => {
23823
- var _v$7 = theme.primary, _v$8 = TextAttributes27.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
24422
+ var _v$7 = theme.primary, _v$8 = TextAttributes28.BOLD, _v$9 = theme.borderActive, _v$0 = theme.text, _v$1 = theme.textMuted, _v$10 = {
23824
24423
  fg: theme.accent
23825
24424
  };
23826
24425
  _v$7 !== _p$.e && (_p$.e = setProp(_el$13, "fg", _v$7, _p$.e));