pi-stereo-view 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.6 - 2026-10-24
4
+
5
+ ### Fixed
6
+
7
+ - Hide clock placeholders and copy buttons for blocks without a known timestamp, including system notices. Their content remains visible without extra control rows.
8
+
3
9
  ## 0.1.5 - 2026-10-23
4
10
 
5
11
  ### Added
package/README.md CHANGED
@@ -115,7 +115,7 @@ Press **Escape** or `[×]` to close search and restore your previous scroll posi
115
115
 
116
116
  ## Copy a block
117
117
 
118
- Click the dim `⧉` icon below the right corner of a message, thinking, tool or other history block to copy its text. Copy buttons work in split and zoomed panels, even with timestamps hidden.
118
+ Click the dim `⧉` icon below the right corner of a message, thinking, tool or other history block to copy its text. Blocks without a known time have no copy button. Copy buttons work in split and zoomed panels, even with timestamps hidden.
119
119
 
120
120
  Messages and thinking keep their original text/Markdown, without terminal colours, clocks or copy buttons. Copying a tool includes its name, arguments, saved result and linked late output. A late-output block also has its own button to copy just that block. Collapsed and off-screen text is included.
121
121
 
@@ -129,7 +129,7 @@ Use **Show copy buttons** in `≡` or `/stereo-view settings` to hide the icons
129
129
 
130
130
  Conversation and Activity can show a dim local `HH:mm:ss` clock above each block on the left, with a small inset. The copy icon sits below the block on the right, so neither control takes width away from the text. New tool calls show their start time.
131
131
 
132
- Older tool calls may show `~HH:mm:ss` for an approximate time. `--:--:--` means the time is unknown.
132
+ Older tool calls may show `~HH:mm:ss` for an approximate time. Blocks without a known time show neither a clock nor a copy button; their content stays visible.
133
133
 
134
134
  Use `≡` or `/stereo-view settings` to hide or show clocks. This setting survives restart. Clocks appear in split and zoomed panels, not in combined history. They are display-only and are not added to the conversation sent to the model.
135
135
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-stereo-view",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "Keep Pi conversation separate from tool output and agent activity.",
6
6
  "license": "MIT",
package/src/timestamps.ts CHANGED
@@ -32,7 +32,7 @@ const validTime = (value: unknown): number | undefined => {
32
32
  /** Format a reliable source in the process's local zone; never substitute now. */
33
33
  export function timestampLabel(value: unknown): string {
34
34
  const time = validTime(value);
35
- if (time === undefined) return "--:--:--";
35
+ if (time === undefined) return "";
36
36
  const date = new Date(time);
37
37
  return [date.getHours(), date.getMinutes(), date.getSeconds()]
38
38
  .map(part => String(part).padStart(2, "0")).join(":");
@@ -176,15 +176,15 @@ export class TranscriptTimestamps {
176
176
  toolCallId?: string;
177
177
  };
178
178
  if (name === "UserMessageComponent" || name === "SkillInvocationMessageComponent" || name === "BashExecutionComponent") {
179
- return this.orderedLabels.get(component) ?? "--:--:--";
179
+ return this.orderedLabels.get(component) ?? "";
180
180
  }
181
181
  if (name === "ToolExecutionComponent") {
182
182
  const id = native.toolCallId!;
183
183
  const start = this.starts.get(id);
184
184
  if (start !== undefined) return timestampLabel(start);
185
- if (this.liveCalls.has(id)) return "--:--:--";
185
+ if (this.liveCalls.has(id)) return "";
186
186
  const owner = this.owners.get(id);
187
- return validTime(owner) === undefined ? "--:--:--" : "~" + timestampLabel(owner);
187
+ return validTime(owner) === undefined ? "" : "~" + timestampLabel(owner);
188
188
  }
189
189
  const message = name === "AssistantMessageComponent" ? native.lastMessage : native.message;
190
190
  return timestampLabel(message ? validTime(message.timestamp) ?? this.messageTimes.get(message) : native.entry?.timestamp);
@@ -245,13 +245,13 @@ export class CompactMessage extends Container {
245
245
  };
246
246
  }
247
247
  private renderContent(width: number): string[] {
248
- const label = this.show() ? this.label() : "";
248
+ const label = this.label();
249
249
  const gutter = this.gutter();
250
250
  const theme = this.theme();
251
251
  // Only the scrollbar needs a side gutter; controls have their own rows.
252
252
  this.contentWidth = Math.max(1, width - gutter);
253
- const time = label && visibleWidth(label) + 1 <= this.contentWidth ? " " + label : "";
254
- const copy = this.copy && this.showCopy() && this.contentWidth >= COPY_CONTROL_WIDTH ? COPY_CONTROL : "";
253
+ const time = label && this.show() && visibleWidth(label) + 1 <= this.contentWidth ? " " + label : "";
254
+ const copy = label && this.copy && this.showCopy() && this.contentWidth >= COPY_CONTROL_WIDTH ? COPY_CONTROL : "";
255
255
  const content = this.nativeCache.render(this.contentWidth, theme);
256
256
  this.contentHeight = content.length;
257
257
  const cached = this.formatted;