@pi-unipi/unipi 2.19.1 → 2.19.2

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,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.19.2] — 2026-09-16
10
+
11
+ ### Fixed
12
+
13
+ - `footer`: **the update overlay no longer leaves the TUI dead after pressing `y`.** The Glance editor install (`installGlanceEditor`) detaches the default editor, but any overlay opened before the swap — the updater prompt opens at `session_start`, the swap lands ~3.5s later — keeps that component as its `preFocus` restore target. On `hideOverlay()` the TUI refocused the detached editor, so every keystroke (including Ctrl+C) was routed to an unmounted component and the session had to be killed. After the swap we now walk `overlayStack` and retarget any `preFocus` pointing at an unmounted non-overlay component to the newly installed editor; `preFocus` entries referencing a live overlay or a still-mounted component are left alone. Regression covered in `glance-focus.test.ts`.
14
+
9
15
  ## [2.19.1] — 2026-09-16
10
16
 
11
17
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/unipi",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "All-in-one extension suite for Pi coding agent",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -84,29 +84,29 @@
84
84
  "typebox": "^1.1.38"
85
85
  },
86
86
  "dependencies": {
87
- "@pi-unipi/ask-user": "2.19.1",
88
- "@pi-unipi/background-tasks": "2.19.1",
89
- "@pi-unipi/btw": "2.19.1",
90
- "@pi-unipi/command-enchantment": "2.19.1",
91
- "@pi-unipi/compactor": "2.19.1",
92
- "@pi-unipi/core": "2.19.1",
93
- "@pi-unipi/footer": "2.19.1",
94
- "@pi-unipi/image": "2.19.1",
95
- "@pi-unipi/fusion": "2.19.1",
96
- "@pi-unipi/info-screen": "2.19.1",
97
- "@pi-unipi/input-shortcuts": "2.19.1",
98
- "@pi-unipi/kanboard": "2.19.1",
99
- "@pi-unipi/mcp": "2.19.1",
100
- "@pi-unipi/memory": "2.19.1",
101
- "@pi-unipi/milestone": "2.19.1",
102
- "@pi-unipi/notify": "2.19.1",
103
- "@pi-unipi/ralph": "2.19.1",
104
- "@pi-unipi/subagents": "2.19.1",
105
- "@pi-unipi/trajectory": "2.19.1",
106
- "@pi-unipi/updater": "2.19.1",
107
- "@pi-unipi/utility": "2.19.1",
108
- "@pi-unipi/web-api": "2.19.1",
109
- "@pi-unipi/workflow": "2.19.1"
87
+ "@pi-unipi/ask-user": "2.19.2",
88
+ "@pi-unipi/background-tasks": "2.19.2",
89
+ "@pi-unipi/btw": "2.19.2",
90
+ "@pi-unipi/command-enchantment": "2.19.2",
91
+ "@pi-unipi/compactor": "2.19.2",
92
+ "@pi-unipi/core": "2.19.2",
93
+ "@pi-unipi/footer": "2.19.2",
94
+ "@pi-unipi/image": "2.19.2",
95
+ "@pi-unipi/fusion": "2.19.2",
96
+ "@pi-unipi/info-screen": "2.19.2",
97
+ "@pi-unipi/input-shortcuts": "2.19.2",
98
+ "@pi-unipi/kanboard": "2.19.2",
99
+ "@pi-unipi/mcp": "2.19.2",
100
+ "@pi-unipi/memory": "2.19.2",
101
+ "@pi-unipi/milestone": "2.19.2",
102
+ "@pi-unipi/notify": "2.19.2",
103
+ "@pi-unipi/ralph": "2.19.2",
104
+ "@pi-unipi/subagents": "2.19.2",
105
+ "@pi-unipi/trajectory": "2.19.2",
106
+ "@pi-unipi/updater": "2.19.2",
107
+ "@pi-unipi/utility": "2.19.2",
108
+ "@pi-unipi/web-api": "2.19.2",
109
+ "@pi-unipi/workflow": "2.19.2"
110
110
  },
111
111
  "devDependencies": {
112
112
  "@earendil-works/pi-agent-core": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/ask-user",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Structured user input tool for Pi coding agent — single-select, multi-select, freeform",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -40,7 +40,7 @@
40
40
  "access": "public"
41
41
  },
42
42
  "dependencies": {
43
- "@pi-unipi/core": "2.19.1"
43
+ "@pi-unipi/core": "2.19.2"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/command-enchantment",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Enhanced TUI autocomplete for /unipi:* commands — colored, sorted, and grouped by package",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/background-tasks",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Background tasks for UniPi — durable shell jobs and delegated background agents with a footer dock",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@earendil-works/pi-ai": "^0.84.0",
13
- "@pi-unipi/core": "2.19.1",
13
+ "@pi-unipi/core": "2.19.2",
14
14
  "turndown": "^7.2.4"
15
15
  },
16
16
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/btw",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "A pi extension for parallel side conversations with /unipi:btw — part of the Unipi suite",
5
5
  "type": "module",
6
6
  "main": "extensions/btw.ts",
@@ -37,7 +37,7 @@
37
37
  "@earendil-works/pi-tui": "^0.84.0"
38
38
  },
39
39
  "dependencies": {
40
- "@pi-unipi/core": "2.19.1"
40
+ "@pi-unipi/core": "2.19.2"
41
41
  },
42
42
  "pi": {
43
43
  "extensions": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/compactor",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Context engine for Pi — zero-LLM compaction, session continuity, sandbox execution, and tool display optimization",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -34,8 +34,8 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.19.1",
38
- "@pi-unipi/info-screen": "2.19.1",
37
+ "@pi-unipi/core": "2.19.2",
38
+ "@pi-unipi/info-screen": "2.19.2",
39
39
  "@earendil-works/pi-agent-core": "^0.84.0"
40
40
  },
41
41
  "peerDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/core",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Shared utilities, event types, and constants for Unipi extension suite",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/footer",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Persistent status bar for Unipi — subscribes to UNIPI_EVENTS and renders key stats from all unipi packages",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -32,8 +32,8 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "2.19.1",
36
- "@pi-unipi/background-tasks": "2.19.1"
35
+ "@pi-unipi/core": "2.19.2",
36
+ "@pi-unipi/background-tasks": "2.19.2"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -451,6 +451,28 @@ function installGlanceEditor(
451
451
  };
452
452
  }),
453
453
  );
454
+ // setCustomEditorComponent detaches the previous editor, but any open
455
+ // overlay captured it as its preFocus restore target — closing the overlay
456
+ // would refocus a dead component and swallow all input. Right after the
457
+ // swap, getFocusedComponent() is the new editor; retarget stale preFocus
458
+ // entries to it (skip preFocus that points at a live overlay).
459
+ const newEditor = typeof tui?.getFocusedComponent === "function" ? tui.getFocusedComponent() : null;
460
+ const internals = tui as ({
461
+ overlayStack?: Array<{ component?: unknown; preFocus?: unknown }>;
462
+ isComponentMounted?: (c: unknown) => boolean;
463
+ }) | null | undefined;
464
+ const overlayStack = internals?.overlayStack;
465
+ const isMounted = typeof internals?.isComponentMounted === "function"
466
+ ? internals.isComponentMounted.bind(tui)
467
+ : undefined;
468
+ if (newEditor && overlayStack && isMounted) {
469
+ const overlayComponents = new Set(overlayStack.map((entry) => entry.component));
470
+ for (const entry of overlayStack) {
471
+ if (entry.preFocus && entry.preFocus !== newEditor && !overlayComponents.has(entry.preFocus) && !isMounted(entry.preFocus)) {
472
+ entry.preFocus = newEditor;
473
+ }
474
+ }
475
+ }
454
476
  if (overlayOwner && tui) tui.setFocus(overlayOwner);
455
477
  st.glanceInstalled = true;
456
478
  } catch {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/fusion",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Devin-style model picker, fusion presets (lead + sidekick), and Local Fusion runtime for UniPi",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -32,8 +32,8 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "2.19.1",
36
- "@pi-unipi/subagents": "2.19.1"
35
+ "@pi-unipi/core": "2.19.2",
36
+ "@pi-unipi/subagents": "2.19.2"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-ai": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/image",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Image generation and image recognition tools for the Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -34,7 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.19.1"
37
+ "@pi-unipi/core": "2.19.2"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@earendil-works/pi-ai": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/info-screen",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Dashboard and module registry for Unipi — configurable info overlay with tabbed groups",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "2.19.1"
36
+ "@pi-unipi/core": "2.19.2"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/input-shortcuts",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Keyboard shortcuts for stash/restore, undo/redo, clipboard, and thinking toggle — chord-based overlay system",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -33,7 +33,7 @@
33
33
  "access": "public"
34
34
  },
35
35
  "dependencies": {
36
- "@pi-unipi/core": "2.19.1"
36
+ "@pi-unipi/core": "2.19.2"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/kanboard",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Visualization layer for unipi workflow — HTTP server with htmx/Alpine.js UI, modular parsers, TUI overlay, and kanban board",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -39,7 +39,7 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@pi-unipi/core": "2.19.1"
42
+ "@pi-unipi/core": "2.19.2"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/mcp",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "MCP server management extension for Pi coding agent — browse, add, configure, and use MCP servers",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -30,7 +30,7 @@
30
30
  "test": "npx tsx --test tests/**/*.test.ts"
31
31
  },
32
32
  "dependencies": {
33
- "@pi-unipi/core": "2.19.1"
33
+ "@pi-unipi/core": "2.19.2"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/memory",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Persistent cross-session memory with MemPalace backend (auto-installed) and SQLite fallback for Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -39,8 +39,8 @@
39
39
  "README.md"
40
40
  ],
41
41
  "dependencies": {
42
- "@pi-unipi/core": "2.19.1",
43
- "@pi-unipi/info-screen": "2.19.1",
42
+ "@pi-unipi/core": "2.19.2",
43
+ "@pi-unipi/info-screen": "2.19.2",
44
44
  "js-yaml": "^4.1.0"
45
45
  },
46
46
  "peerDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/milestone",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Lifecycle layer for project-level goals — MILESTONES.md tracking, session hooks, auto-sync",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -32,7 +32,7 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@pi-unipi/core": "2.19.1"
35
+ "@pi-unipi/core": "2.19.2"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/notify",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Cross-platform notification extension for Pi — native OS, Gotify, and Telegram notifications for agent lifecycle events",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -34,7 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.19.1",
37
+ "@pi-unipi/core": "2.19.2",
38
38
  "node-notifier": "^10.0.1"
39
39
  },
40
40
  "peerDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/ralph",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Long-running iterative development loops for Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -31,8 +31,8 @@
31
31
  "test": "npx tsx --test reminder.test.ts"
32
32
  },
33
33
  "dependencies": {
34
- "@pi-unipi/core": "2.19.1",
35
- "@pi-unipi/info-screen": "2.19.1"
34
+ "@pi-unipi/core": "2.19.2",
35
+ "@pi-unipi/info-screen": "2.19.2"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@earendil-works/pi-ai": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/subagents",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Subagents for UniPi — parallel execution, file locking, workflow integration",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -9,7 +9,7 @@
9
9
  "test": "npx tsx --test src/__tests__/*.test.ts"
10
10
  },
11
11
  "dependencies": {
12
- "@pi-unipi/core": "2.19.1",
12
+ "@pi-unipi/core": "2.19.2",
13
13
  "@earendil-works/pi-agent-core": "^0.84.0",
14
14
  "acorn": "8.18.0"
15
15
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/trajectory",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Live UniPi trajectory inspector for Pi sessions",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -48424,6 +48424,18 @@ function installGlanceEditor(st, uiHost) {
48424
48424
  };
48425
48425
  })
48426
48426
  );
48427
+ const newEditor = typeof tui?.getFocusedComponent === "function" ? tui.getFocusedComponent() : null;
48428
+ const internals = tui;
48429
+ const overlayStack = internals?.overlayStack;
48430
+ const isMounted = typeof internals?.isComponentMounted === "function" ? internals.isComponentMounted.bind(tui) : void 0;
48431
+ if (newEditor && overlayStack && isMounted) {
48432
+ const overlayComponents = new Set(overlayStack.map((entry) => entry.component));
48433
+ for (const entry of overlayStack) {
48434
+ if (entry.preFocus && entry.preFocus !== newEditor && !overlayComponents.has(entry.preFocus) && !isMounted(entry.preFocus)) {
48435
+ entry.preFocus = newEditor;
48436
+ }
48437
+ }
48438
+ }
48427
48439
  if (overlayOwner && tui) tui.setFocus(overlayOwner);
48428
48440
  st.glanceInstalled = true;
48429
48441
  } catch {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/updater",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Auto-updater, changelog browser, and readme browser for Unipi — checks npm registry, renders CHANGELOG.md and README.md files in TUI overlays",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -34,7 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@pi-unipi/core": "2.19.1"
37
+ "@pi-unipi/core": "2.19.2"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@earendil-works/pi-coding-agent": "^0.84.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/utility",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Utility commands and tools for Pi coding agent — lifecycle, diagnostics, cache, analytics, display, batch execution",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -36,7 +36,7 @@
36
36
  "access": "public"
37
37
  },
38
38
  "dependencies": {
39
- "@pi-unipi/core": "2.19.1"
39
+ "@pi-unipi/core": "2.19.2"
40
40
  },
41
41
  "devDependencies": {},
42
42
  "peerDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/web-api",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Web search, read, and summarize tools with provider-based backend selection for Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -31,7 +31,7 @@
31
31
  "README.md"
32
32
  ],
33
33
  "dependencies": {
34
- "@pi-unipi/core": "2.19.1",
34
+ "@pi-unipi/core": "2.19.2",
35
35
  "defuddle": "^0.18.1",
36
36
  "linkedom": "^0.18.12",
37
37
  "wreq-js": "^2.3.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-unipi/workflow",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Structured development workflow commands for Pi coding agent",
5
5
  "type": "module",
6
6
  "main": "index.ts",
@@ -30,7 +30,7 @@
30
30
  "access": "public"
31
31
  },
32
32
  "dependencies": {
33
- "@pi-unipi/core": "2.19.1"
33
+ "@pi-unipi/core": "2.19.2"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@earendil-works/pi-ai": "^0.84.0",