pi-fabric 0.92.12 → 0.92.14

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.
@@ -0,0 +1,22 @@
1
+ import { Editor, Loader, type LoaderIndicatorOptions, type TUI } from "@earendil-works/pi-tui";
2
+ /** Streaming status rendered inside an editor's top border. Mirrors Pi's
3
+ * `WorkingStatusIndicator`: braille frames at 80 ms, plus the same
4
+ * `renderInBorder` projections `CustomEditor` uses to place them. */
5
+ export declare class BorderWorkingIndicator extends Loader {
6
+ constructor(ui: TUI, colorFn: (text: string) => string, message?: string, indicator?: LoaderIndicatorOptions);
7
+ renderInBorder(width: number): string;
8
+ renderSpinnerInBorder(width: number): string;
9
+ }
10
+ /** Editor that carries the streaming status in its top border, the way Pi's
11
+ * `CustomEditor` does when `embedWorkingStatus` is on. Pi's host owns the
12
+ * default editor and opts in there; the Fabric preview owns this editor, so it
13
+ * opts in by construction. Placement rules (full status, spinner-only when it
14
+ * cannot fit, and the `↑ N more` scroll label) match Pi's border exactly, and
15
+ * the status is painted with the editor's own border color — the thinking-level
16
+ * color, as Pi's embedded indicator is. */
17
+ export declare class BorderStatusEditor extends Editor {
18
+ private workingStatusIndicator;
19
+ setWorkingStatusIndicator(indicator: BorderWorkingIndicator | undefined): void;
20
+ protected renderTopBorder(width: number, hiddenLineCount: number): string;
21
+ }
22
+ //# sourceMappingURL=border-status-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border-status-editor.d.ts","sourceRoot":"","sources":["../../src/ui/border-status-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,MAAM,EAGN,KAAK,sBAAsB,EAC3B,KAAK,GAAG,EACT,MAAM,wBAAwB,CAAC;AAEhC;;sEAEsE;AACtE,qBAAa,sBAAuB,SAAQ,MAAM;gBACpC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,OAAO,SAAY,EAAE,SAAS,CAAC,EAAE,sBAAsB;IAM/G,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKrC,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAG7C;AAED;;;;;;4CAM4C;AAC5C,qBAAa,kBAAmB,SAAQ,MAAM;IAC5C,OAAO,CAAC,sBAAsB,CAAqC;IAEnE,yBAAyB,CAAC,SAAS,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI;cAI3D,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;CAmCnF"}
@@ -157,6 +157,9 @@ export declare class FabricConversationView implements Component, Focusable {
157
157
  private observe;
158
158
  private selectedTargetIsWorking;
159
159
  private syncWorkingIndicator;
160
+ /** Every editor instance that can be mounted (composer, suspended queue-row
161
+ * composer) carries the live indicator, and nothing keeps a stale one. */
162
+ private attachWorkingIndicator;
160
163
  private stopWorkingIndicator;
161
164
  invalidate(): void;
162
165
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/ui/conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/ui/conversation.ts"],"names":[],"mappings":"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"}
@@ -25,18 +25,70 @@ import "../chunks/chunk-OKOHRXGF.js";
25
25
  // src/ui/conversation.ts
26
26
  import {
27
27
  CURSOR_MARKER,
28
- Editor,
29
28
  fuzzyFilter,
30
29
  getKeybindings as getKeybindings2,
31
30
  Input,
32
31
  Key as Key2,
33
- Loader,
34
32
  Text,
35
33
  matchesKey as matchesKey2,
36
- truncateToWidth as truncateToWidth2,
37
- visibleWidth as visibleWidth2
34
+ truncateToWidth as truncateToWidth3,
35
+ visibleWidth as visibleWidth3
38
36
  } from "@earendil-works/pi-tui";
39
37
 
38
+ // src/ui/border-status-editor.ts
39
+ import {
40
+ Editor,
41
+ Loader,
42
+ truncateToWidth,
43
+ visibleWidth
44
+ } from "@earendil-works/pi-tui";
45
+ var BorderWorkingIndicator = class extends Loader {
46
+ constructor(ui, colorFn, message = "Working", indicator) {
47
+ super(ui, colorFn, colorFn, message, indicator);
48
+ }
49
+ renderInBorder(width) {
50
+ const line = this.render(width + 2)[1] ?? "";
51
+ return truncateToWidth(line.startsWith(" ") ? line.slice(1).trimEnd() : line.trimEnd(), width, "");
52
+ }
53
+ renderSpinnerInBorder(width) {
54
+ return truncateToWidth(this.getRenderedIndicator(), width, "");
55
+ }
56
+ };
57
+ var BorderStatusEditor = class extends Editor {
58
+ workingStatusIndicator;
59
+ setWorkingStatusIndicator(indicator) {
60
+ this.workingStatusIndicator = indicator;
61
+ }
62
+ renderTopBorder(width, hiddenLineCount) {
63
+ const indicator = this.workingStatusIndicator;
64
+ if (!indicator || width <= 0) return super.renderTopBorder(width, hiddenLineCount);
65
+ let status = indicator.renderInBorder(Math.max(1, width - 5));
66
+ let statusWidth = visibleWidth(status);
67
+ if (statusWidth === 0) return super.renderTopBorder(width, hiddenLineCount);
68
+ const overflowLabel = hiddenLineCount > 0 ? ` \u2191 ${hiddenLineCount} more ` : void 0;
69
+ const overflowLabelWidth = overflowLabel ? visibleWidth(overflowLabel) : 0;
70
+ const overflowStart = Math.floor((width - overflowLabelWidth) / 2);
71
+ const canFitOverflow = () => overflowLabel !== void 0 && overflowLabelWidth + 2 <= width && overflowStart - (3 + statusWidth + 1) >= 1;
72
+ if (overflowLabel && !canFitOverflow()) {
73
+ status = indicator.renderSpinnerInBorder(width);
74
+ statusWidth = visibleWidth(status);
75
+ }
76
+ if (canFitOverflow()) {
77
+ const leftBlockWidth = 3 + statusWidth + 1;
78
+ return this.borderColor("\u2500\u2500 ") + status + this.borderColor(
79
+ ` ${"\u2500".repeat(overflowStart - leftBlockWidth)}${overflowLabel}${"\u2500".repeat(width - overflowStart - overflowLabelWidth)}`
80
+ );
81
+ }
82
+ if (width >= statusWidth + 5) {
83
+ return this.borderColor("\u2500\u2500 ") + status + this.borderColor(` ${"\u2500".repeat(width - statusWidth - 4)}`);
84
+ }
85
+ status = indicator.renderSpinnerInBorder(width);
86
+ statusWidth = visibleWidth(status);
87
+ const prefixWidth = Math.min(3, Math.max(0, width - statusWidth));
88
+ return this.borderColor("\u2500".repeat(prefixWidth)) + status + this.borderColor("\u2500".repeat(Math.max(0, width - prefixWidth - statusWidth)));
89
+ }
90
+ };
91
+
40
92
  // src/ui/conversation-render.ts
41
93
  import { wrapTextWithAnsi } from "@earendil-works/pi-tui";
42
94
  var DEFAULT_IMAGE_WIDTH_CELLS = 60;
@@ -598,7 +650,7 @@ var safeRender = (component, width, fallback) => {
598
650
  };
599
651
 
600
652
  // src/ui/conversation-selection.ts
601
- import { sliceByColumn, stripTerminalSequences, visibleWidth } from "@earendil-works/pi-tui";
653
+ import { sliceByColumn, stripTerminalSequences, visibleWidth as visibleWidth2 } from "@earendil-works/pi-tui";
602
654
  var graphemes = new Intl.Segmenter(void 0, { granularity: "grapheme" });
603
655
  var ConversationTextSelection = class {
604
656
  source;
@@ -631,7 +683,7 @@ var ConversationTextSelection = class {
631
683
  row = Math.max(0, Math.min(this.source.length - 1, row));
632
684
  let boundary = 0;
633
685
  for (const { segment } of graphemes.segment(stripTerminalSequences(this.source[row] ?? ""))) {
634
- const next = boundary + visibleWidth(segment);
686
+ const next = boundary + visibleWidth2(segment);
635
687
  if (next > col) break;
636
688
  boundary = next;
637
689
  }
@@ -650,7 +702,7 @@ var ConversationTextSelection = class {
650
702
  for (let row = bounds.start.row; row <= bounds.end.row; row++) {
651
703
  const line = this.source[row] ?? "";
652
704
  const start = row === bounds.start.row ? bounds.start.col : 0;
653
- const end = row === bounds.end.row ? bounds.end.col : visibleWidth(line);
705
+ const end = row === bounds.end.row ? bounds.end.col : visibleWidth2(line);
654
706
  lines.push(stripTerminalSequences(sliceByColumn(line, start, end - start, true)).trimEnd());
655
707
  }
656
708
  return lines.join("\n") || void 0;
@@ -659,7 +711,7 @@ var ConversationTextSelection = class {
659
711
  const bounds = this.bounds();
660
712
  if (!bounds || row < bounds.start.row || row > bounds.end.row) return line;
661
713
  if (/\x1b(?:_G|\]1337;File=|P)/.test(line)) return line;
662
- const width = visibleWidth(line);
714
+ const width = visibleWidth2(line);
663
715
  const start = row === bounds.start.row ? bounds.start.col : 0;
664
716
  const end = row === bounds.end.row ? bounds.end.col : width;
665
717
  if (end <= start) return line;
@@ -734,7 +786,7 @@ import {
734
786
  Key,
735
787
  getKeybindings,
736
788
  matchesKey,
737
- truncateToWidth
789
+ truncateToWidth as truncateToWidth2
738
790
  } from "@earendil-works/pi-tui";
739
791
  var QUEUE_STEER_CONVERSATION_QUEUE_REQUEST_EVENT = "queue-steer:conversation-queue:request:v1";
740
792
  var DEQUEUE_FALLBACK = "alt+up";
@@ -1197,7 +1249,7 @@ function createConversationQueue(options) {
1197
1249
  theme
1198
1250
  );
1199
1251
  const lines2 = widget.render(width);
1200
- if (dispatched.length > 0) lines2.push(theme.fg("dim", truncateToWidth("Sent rows await child delivery; they cannot be edited locally.", width, "")));
1252
+ if (dispatched.length > 0) lines2.push(theme.fg("dim", truncateToWidth2("Sent rows await child delivery; they cannot be edited locally.", width, "")));
1201
1253
  return lines2;
1202
1254
  }
1203
1255
  const lines = [""];
@@ -1209,11 +1261,11 @@ function createConversationQueue(options) {
1209
1261
  const note = row.removed ? " \xB7 removed on save" : row.paused ? " \xB7 paused" : "";
1210
1262
  const color = row.state === "dispatched" ? "dim" : bridge ? bridge.laneColor(row.lane) : "dim";
1211
1263
  lines.push(
1212
- ` ${theme.fg(color, truncateToWidth(`${marker}${label}: ${row.text.replace(/\n/g, " ")}${note}`, innerWidth, "\u2026"))} `
1264
+ ` ${theme.fg(color, truncateToWidth2(`${marker}${label}: ${row.text.replace(/\n/g, " ")}${note}`, innerWidth, "\u2026"))} `
1213
1265
  );
1214
1266
  }
1215
1267
  const hint = queue.length > 0 ? `\u21B3 ${dequeueHint} to edit queued messages` : "\u21B3 Waiting for child delivery";
1216
- lines.push(` ${theme.fg("dim", truncateToWidth(hint, innerWidth, "\u2026"))} `);
1268
+ lines.push(` ${theme.fg("dim", truncateToWidth2(hint, innerWidth, "\u2026"))} `);
1217
1269
  return lines;
1218
1270
  },
1219
1271
  handleInput(data) {
@@ -1661,9 +1713,10 @@ var FabricConversationView = class {
1661
1713
  const editorTui = Object.create(this.tui, { requestRender: { value: () => {
1662
1714
  if (!this.disposed && this.editor === editor) this.tui.requestRender();
1663
1715
  } } });
1664
- const editor = new Editor(editorTui, conversationEditorTheme(this.theme, () => this.currentTarget()?.thinking), {
1716
+ const editor = new BorderStatusEditor(editorTui, conversationEditorTheme(this.theme, () => this.currentTarget()?.thinking), {
1665
1717
  paddingX: this.options.appearance?.editorPaddingX ?? 0
1666
1718
  });
1719
+ editor.setWorkingStatusIndicator(this.working);
1667
1720
  editor.focused = this.focusState && this.mode === "conversation";
1668
1721
  if (!withHistory) return editor;
1669
1722
  editor.setAutocompleteProvider(conversationCommandCompletion(() => !this.disposed && this.editor === editor && this.mode === "conversation" && !this.state.queues.get(this.currentId ?? "")?.editingActive));
@@ -1727,6 +1780,7 @@ var FabricConversationView = class {
1727
1780
  this.editor = this.suspendedEditor;
1728
1781
  this.suspendedEditor = void 0;
1729
1782
  this.editor.focused = this.focusState && this.mode === "conversation";
1783
+ this.attachWorkingIndicator();
1730
1784
  restoredText = this.currentId ? this.state.view(this.currentId).draft : text;
1731
1785
  }
1732
1786
  this.editor?.setText(restoredText);
@@ -1836,9 +1890,11 @@ var FabricConversationView = class {
1836
1890
  let queueLines = queue?.render(width) ?? [];
1837
1891
  let editorLines = this.mode === "conversation" && !(queue?.editingActive && queue.mode === "extension") ? this.renderEditorLines(width) : [];
1838
1892
  const editorBudget = Math.min(editorLines.length, Math.max(1, rows - (rows >= 6 ? 3 : 0)));
1893
+ let editorShowsTopBorder = editorLines.length > 0;
1839
1894
  if (editorLines.length > editorBudget) {
1840
1895
  const cursor = Math.max(0, editorLines.findIndex((line) => line.includes(CURSOR_MARKER)));
1841
1896
  const start = Math.max(0, Math.min(cursor - Math.floor(editorBudget / 2), editorLines.length - editorBudget));
1897
+ editorShowsTopBorder = start === 0;
1842
1898
  editorLines = editorLines.slice(start, start + editorBudget);
1843
1899
  }
1844
1900
  let remaining = rows - editorLines.length;
@@ -1865,7 +1921,7 @@ var FabricConversationView = class {
1865
1921
  remaining -= queueLines.length;
1866
1922
  this.editorTop = rows - editorLines.length - footer.length - hints.length;
1867
1923
  this.editorHeight = editorLines.length;
1868
- const body = remaining <= 0 ? [] : this.mode === "picker" ? this.pickerLines(width, remaining) : this.windowBody(transcriptLines, remaining, this.transcriptTail(width, remaining));
1924
+ const body = remaining <= 0 ? [] : this.mode === "picker" ? this.pickerLines(width, remaining) : this.windowBody(transcriptLines, remaining, this.transcriptTail(width, remaining, editorShowsTopBorder));
1869
1925
  this.bodyTop = head.length;
1870
1926
  const scroll = this.currentId ? this.state.view(this.currentId).scroll : 0;
1871
1927
  this.bodyHeight = this.mode === "conversation" ? Math.max(0, Math.min(remaining, this.lastBody.length - scroll)) : 0;
@@ -1873,7 +1929,7 @@ var FabricConversationView = class {
1873
1929
  for (let row = 0; row < this.bodyHeight; row++) body[row] = this.textSelection.highlight(body[row], scroll + row, this.theme);
1874
1930
  }
1875
1931
  while (body.length < remaining) body.push("");
1876
- return [...head, ...body.slice(0, remaining), ...queueLines, ...editorLines, ...footer, ...hints].slice(0, rows).map((line) => visibleWidth2(line) <= width ? line : truncateToWidth2(line, width, ""));
1932
+ return [...head, ...body.slice(0, remaining), ...queueLines, ...editorLines, ...footer, ...hints].slice(0, rows).map((line) => visibleWidth3(line) <= width ? line : truncateToWidth3(line, width, ""));
1877
1933
  }
1878
1934
  /** Observe files without rendering native history; true means a visible change
1879
1935
  * or a live animation still needs the normal TUI render path. */
@@ -1931,14 +1987,23 @@ var FabricConversationView = class {
1931
1987
  this.stopWorkingIndicator();
1932
1988
  const id = this.currentId;
1933
1989
  this.workingTargetId = id;
1934
- this.working = new Loader({ requestRender: () => {
1990
+ const color = (text) => this.editor?.borderColor(text) ?? this.theme.fg("borderMuted", text);
1991
+ this.working = new BorderWorkingIndicator({ requestRender: () => {
1935
1992
  if (!this.disposed && this.mode === "conversation" && this.currentId === id) this.tui.requestRender();
1936
- } }, (text) => this.theme.fg("accent", text), (text) => this.theme.fg("muted", text), "Working");
1993
+ } }, color, "Working");
1994
+ this.attachWorkingIndicator();
1995
+ }
1996
+ /** Every editor instance that can be mounted (composer, suspended queue-row
1997
+ * composer) carries the live indicator, and nothing keeps a stale one. */
1998
+ attachWorkingIndicator() {
1999
+ this.editor?.setWorkingStatusIndicator(this.working);
2000
+ this.suspendedEditor?.setWorkingStatusIndicator(this.working);
1937
2001
  }
1938
2002
  stopWorkingIndicator() {
1939
2003
  this.working?.stop();
1940
2004
  this.working = void 0;
1941
2005
  this.workingTargetId = void 0;
2006
+ this.attachWorkingIndicator();
1942
2007
  }
1943
2008
  invalidate() {
1944
2009
  this.working?.invalidate();
@@ -2629,7 +2694,7 @@ var FabricConversationView = class {
2629
2694
  const main = this.mainTarget();
2630
2695
  if (main) chain.push(main);
2631
2696
  }
2632
- if (chain.length === 0) return truncateToWidth2(this.theme.fg("dim", "Fabric"), width, "");
2697
+ if (chain.length === 0) return truncateToWidth3(this.theme.fg("dim", "Fabric"), width, "");
2633
2698
  const last = chain[chain.length - 1];
2634
2699
  const parts = chain.map((target, index) => {
2635
2700
  const isCurrent = target.id === this.currentId;
@@ -2637,14 +2702,14 @@ var FabricConversationView = class {
2637
2702
  const styled = isCurrent ? this.theme.fg("accent", name) : this.theme.fg("muted", name);
2638
2703
  return last && index === chain.length - 1 && this.isUnread(last) ? `${styled} \u25CF` : styled;
2639
2704
  });
2640
- return truncateToWidth2(parts.join(this.theme.fg("dim", " > ")), width, "");
2705
+ return truncateToWidth3(parts.join(this.theme.fg("dim", " > ")), width, "");
2641
2706
  }
2642
2707
  currentFeedbackLine(width) {
2643
2708
  if (this.mode === "picker") return void 0;
2644
2709
  if (!this.feedback) return void 0;
2645
2710
  if (Date.now() - this.feedback.at > FEEDBACK_TTL_MS) return void 0;
2646
2711
  const color = this.feedback.kind === "error" ? "error" : "accent";
2647
- return truncateToWidth2(this.theme.fg(color, this.feedback.text), width, "");
2712
+ return truncateToWidth3(this.theme.fg(color, this.feedback.text), width, "");
2648
2713
  }
2649
2714
  hintsLine(width) {
2650
2715
  const followUpKeys = this.bindingHint("app.message.followUp", "alt+enter");
@@ -2662,7 +2727,7 @@ var FabricConversationView = class {
2662
2727
  "close"
2663
2728
  ];
2664
2729
  const full = [...hints, this.theme.fg("dim", toolsKeys), "tools"].join(" ");
2665
- return truncateToWidth2(full, width, "");
2730
+ return truncateToWidth3(full, width, "");
2666
2731
  }
2667
2732
  renderEditorLines(innerWidth) {
2668
2733
  const editor = this.editor;
@@ -2716,7 +2781,7 @@ var FabricConversationView = class {
2716
2781
  codePreviewSettings: this.options.codePreviewSettings
2717
2782
  });
2718
2783
  }
2719
- transcriptTail(width, budget) {
2784
+ transcriptTail(width, budget, editorVisible) {
2720
2785
  if (this.commandNotification && this.commandNotification.epoch !== this.state.epoch) this.clearCommandNotification();
2721
2786
  const notification = this.commandNotification;
2722
2787
  if (this.observedTranscript?.hasNewer && !notification) return [];
@@ -2725,7 +2790,7 @@ var FabricConversationView = class {
2725
2790
  const reserved = 1 + notification.pendingResult.render(width).length;
2726
2791
  while (tail.length < reserved) tail.push("");
2727
2792
  }
2728
- if (!this.observedTranscript?.hasNewer) tail.push(...this.working?.render(width) ?? []);
2793
+ if (!editorVisible && !this.observedTranscript?.hasNewer) tail.push(...this.working?.render(width) ?? []);
2729
2794
  if (budget > 1) tail.push("");
2730
2795
  return tail;
2731
2796
  }
@@ -2776,7 +2841,7 @@ var FabricConversationView = class {
2776
2841
  const unread = this.isUnread(row.target) ? this.theme.fg("accent", " \u25CF") : "";
2777
2842
  const label = isMainTarget(row.target) ? "Main (native session)" : `${safeText(row.target.name)} ${this.theme.fg("muted", `(${row.target.kind} \xB7 ${row.target.status})`)}`;
2778
2843
  lines.push(
2779
- truncateToWidth2(
2844
+ truncateToWidth3(
2780
2845
  `${indent}${marker}${selected ? this.theme.fg("accent", label) : label}${unread}`,
2781
2846
  innerWidth,
2782
2847
  ""