@sigrun/tui 0.10.2 → 0.11.0

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
@@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
 
9
+ ## [0.11.0] - 2026-11-07
10
+
11
+ - Version-locked bump with the 0.11.0 core line (the pi-durable 1.5.0 release).
12
+
9
13
  ## [0.10.2] - 2026-11-06
10
14
 
11
15
  - Version-locked bump with the 0.10.2 core line (no changes).
@@ -6,7 +6,12 @@
6
6
  * (`▸ Thinking · 2 tools`; `▾` when open) that unfolds into the thinking
7
7
  * text and `✓ tool preview` rows (`✗` error, `·` no result yet — the
8
8
  * wire carries no per-tool running marker, so `·` covers pending too).
9
- * `pi.compaction` renders the centred `── context compacted ──` divider. The `[tool]`/`[thinking]` tags of
9
+ * `pi.compaction` renders the centred `── context compacted ──` divider.
10
+ * A run that ended without an answer (`pi.live.runFailure`, pi-durable
11
+ * 1.5.0) renders one dim `run ended: <reason>[: <detail>]` line under
12
+ * the last turn; the shared reader hides the user-caused endings
13
+ * (`aborted`/`reset`) and any failure a newer run superseded.
14
+ * The `[tool]`/`[thinking]` tags of
10
15
  * the entry-era pane are gone.
11
16
  *
12
17
  * Task 2c: an EXPANDED input (`/skill:name`, a prompt template) is one
@@ -6,7 +6,12 @@
6
6
  * (`▸ Thinking · 2 tools`; `▾` when open) that unfolds into the thinking
7
7
  * text and `✓ tool preview` rows (`✗` error, `·` no result yet — the
8
8
  * wire carries no per-tool running marker, so `·` covers pending too).
9
- * `pi.compaction` renders the centred `── context compacted ──` divider. The `[tool]`/`[thinking]` tags of
9
+ * `pi.compaction` renders the centred `── context compacted ──` divider.
10
+ * A run that ended without an answer (`pi.live.runFailure`, pi-durable
11
+ * 1.5.0) renders one dim `run ended: <reason>[: <detail>]` line under
12
+ * the last turn; the shared reader hides the user-caused endings
13
+ * (`aborted`/`reset`) and any failure a newer run superseded.
14
+ * The `[tool]`/`[thinking]` tags of
10
15
  * the entry-era pane are gone.
11
16
  *
12
17
  * Task 2c: an EXPANDED input (`/skill:name`, a prompt template) is one
@@ -42,6 +47,7 @@
42
47
  * {@link ConversationPane.clearNotices}).
43
48
  */
44
49
  import { Container, Markdown, MouseRegion, Text, } from "@earendil-works/pi-tui";
50
+ import { liveRunFailure } from "@sigrun/shared/live";
45
51
  import { activityLabel, expandedUserEntry, groupTurns, } from "@sigrun/shared/turns";
46
52
  import { plainTuiTheme } from "../theme.js";
47
53
  import { AUTH_FAILURE_MESSAGE } from "../api.js";
@@ -163,6 +169,9 @@ export class ConversationPane {
163
169
  /** The notices' mounted components, aligned with `#notices`. */
164
170
  #noticeComponents = [];
165
171
  #turns = [];
172
+ /** The latest view's `run ended:` line (stream state — recomputed on
173
+ * every `showView`, unlike the composer-owned notices). */
174
+ #runFailureLine;
166
175
  /** The open view's conversation id (the chat-block attach's address). */
167
176
  #conversationId = 0;
168
177
  /** The mounted chat-block surface states, keyed by entry id
@@ -286,6 +295,11 @@ export class ConversationPane {
286
295
  }
287
296
  this.#conversationId = conversationId;
288
297
  this.#turns = groupTurns(wire.entries);
298
+ const runFailure = liveRunFailure(wire);
299
+ this.#runFailureLine =
300
+ runFailure === undefined
301
+ ? undefined
302
+ : `run ended: ${runFailure.reason}${runFailure.detail ? `: ${runFailure.detail}` : ""}`;
289
303
  if (this.#focus !== undefined && this.#focus >= this.#turns.length) {
290
304
  this.#focus = undefined;
291
305
  }
@@ -414,6 +428,11 @@ export class ConversationPane {
414
428
  }
415
429
  this.#container.addChild(new RenderSlot()); // turn gap
416
430
  }
431
+ // The run-failure line rides UNDER the last turn (a stream-derived
432
+ // line, not a composer notice — `showView`'s replacement owns it).
433
+ if (this.#runFailureLine !== undefined) {
434
+ this.#container.addChild(new Text(this.#theme.dim(this.#runFailureLine), 0, 0));
435
+ }
417
436
  for (const notice of this.#notices) {
418
437
  const component = noticeComponent(notice);
419
438
  this.#noticeComponents.push(component);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigrun/tui",
3
- "version": "0.10.2",
3
+ "version": "0.11.0",
4
4
  "description": "sigrun terminal client (pi-tui based) over the \u00a75 API \u2014 spawned by the sigrun CLI, or standalone against a server URL",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@earendil-works/pi-tui": "^1.3.0",
24
- "@sigrun/shared": "0.10.2"
24
+ "@sigrun/shared": "0.11.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "typescript": "^7.0.2",