@pellux/goodvibes-tui 2.1.1 → 2.1.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
@@ -4,6 +4,12 @@ All notable changes to GoodVibes TUI.
4
4
 
5
5
  ---
6
6
 
7
+ ## [2.1.2] - 2026-11-03
8
+
9
+ ### Fixed
10
+
11
+ - `/compact` can pause an active turn, compact its settled history, and resume the same turn automatically. Started tool actions finish once before compaction, and Escape still cancels a paused turn.
12
+
7
13
  ## [2.1.1] - 2026-11-02
8
14
 
9
15
  ### Fixed
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml/badge.svg)](https://github.com/mgd34msu/goodvibes-tui/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![Version](https://img.shields.io/badge/version-2.1.1-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
5
+ [![Version](https://img.shields.io/badge/version-2.1.2-blue.svg)](https://github.com/mgd34msu/goodvibes-tui)
6
6
 
7
7
  GoodVibes is a terminal console for coding and operations work with an AI model. You run `goodvibes` in a project directory and get a full-screen terminal app where you talk to a model that can read and edit your files, run shell commands, search the web, and hand work off to background agents, asking your permission before anything that writes or executes.
8
8
 
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "2.1.1"
6
+ "version": "2.1.2"
7
7
  },
8
8
  "auth": {
9
9
  "modes": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-tui",
3
- "version": "2.1.1",
3
+ "version": "2.1.2",
4
4
  "description": "Terminal-native GoodVibes client for coding, operations, knowledge and channel workflows; a pure client of the GoodVibes daemon.",
5
5
  "type": "module",
6
6
  "main": "src/main.ts",
@@ -39,7 +39,7 @@
39
39
  "test": "bun run scripts/run-tests.ts",
40
40
  "test:changed": "bun run scripts/run-tests.ts --changed=origin/main",
41
41
  "test:e2e": "bun test --timeout=300000 src/test/e2e",
42
- "test:e2e:fast": "bun test --timeout=120000 src/test/e2e/startup.e2e.test.ts src/test/e2e/first-turn.e2e.test.ts",
42
+ "test:e2e:fast": "bun test --timeout=120000 src/test/e2e/startup.e2e.test.ts src/test/e2e/first-turn.e2e.test.ts src/test/e2e/compact-active-turn.e2e.test.ts",
43
43
  "test:e2e:release": "bun test --timeout=300000 src/test/e2e/daemon-adoption.e2e.test.ts src/test/e2e/wrfc-chain.e2e.test.ts src/test/e2e/turn-notification.e2e.test.ts src/test/e2e/resize.e2e.test.ts",
44
44
  "version": "bun run scripts/release-prepare.ts --no-bump",
45
45
  "release:prepare": "bun run scripts/release-prepare.ts",
@@ -95,11 +95,11 @@
95
95
  "@anthropic-ai/bedrock-sdk": "^0.29.1",
96
96
  "@anthropic-ai/sdk": "^0.92.0",
97
97
  "@ast-grep/napi": "^0.42.0",
98
- "@pellux/goodvibes-sdk": "2.1.1",
99
- "@pellux/goodvibes-terminal-shell": "2.1.1",
98
+ "@pellux/goodvibes-sdk": "2.1.2",
99
+ "@pellux/goodvibes-terminal-shell": "2.1.2",
100
100
  "bash-language-server": "^5.6.0",
101
101
  "fuse.js": "^7.1.0",
102
- "@pellux/goodvibes-daemon": "1.29.1",
102
+ "@pellux/goodvibes-daemon": "1.29.2",
103
103
  "graphql": "^16.13.2",
104
104
  "jszip": "^3.10.1",
105
105
  "node-edge-tts": "^1.2.10",
@@ -120,15 +120,15 @@
120
120
  "zustand": "^5.0.12"
121
121
  },
122
122
  "devDependencies": {
123
- "@pellux/goodvibes-toolchain": "2.1.1",
123
+ "@pellux/goodvibes-toolchain": "2.1.2",
124
124
  "@types/bun": "^1.3.10",
125
125
  "typescript": "^5.9.3"
126
126
  },
127
127
  "optionalDependencies": {
128
- "@pellux/goodvibes-tui-linux-x64": "2.1.1",
129
- "@pellux/goodvibes-tui-linux-arm64": "2.1.1",
130
- "@pellux/goodvibes-tui-darwin-x64": "2.1.1",
131
- "@pellux/goodvibes-tui-darwin-arm64": "2.1.1"
128
+ "@pellux/goodvibes-tui-linux-x64": "2.1.2",
129
+ "@pellux/goodvibes-tui-linux-arm64": "2.1.2",
130
+ "@pellux/goodvibes-tui-darwin-x64": "2.1.2",
131
+ "@pellux/goodvibes-tui-darwin-arm64": "2.1.2"
132
132
  },
133
133
  "trustedDependencies": [],
134
134
  "overrides": {
@@ -121,6 +121,8 @@ export interface CommandUiActions {
121
121
  /** True while an LLM turn is actively streaming. Used to give Escape
122
122
  * cancel-turn precedence over a focused modal's own escape handling. */
123
123
  isGenerating?: () => boolean;
124
+ /** Run history replacement while the active turn is paused at a safe checkpoint. */
125
+ withCompaction?: <T>(compact: () => Promise<T>) => Promise<T>;
124
126
  completeModelSelection?: (selection: {
125
127
  model: { id: string; provider: string; displayName: string; registryKey: string };
126
128
  effort: string;
@@ -274,6 +274,11 @@ export interface CompactionRunResult {
274
274
  * compaction was skipped or produced no change).
275
275
  */
276
276
  export async function compactConversation(context: CommandContext): Promise<CompactionRunResult | null> {
277
+ if (!context.withCompaction) throw new Error('Compaction requires the active session runtime.');
278
+ return context.withCompaction(() => compactPausedConversation(context));
279
+ }
280
+
281
+ async function compactPausedConversation(context: CommandContext): Promise<CompactionRunResult | null> {
277
282
  const conversationManager = context.session.conversationManager;
278
283
  const providerRegistry = context.provider.providerRegistry;
279
284
  // Resolve the live context window for the current model so manual /compact
package/src/main.ts CHANGED
@@ -346,6 +346,7 @@ async function main() {
346
346
  getActiveToolCallId: () => streamMetrics.activeToolCallId, toggleMemoryProvenance: () => memoryProvenanceUi.toggle(),
347
347
  });
348
348
  commandContext.isGenerating = () => orchestrator.isThinking;
349
+ commandContext.withCompaction = (compact) => orchestrator.withCompaction(compact);
349
350
  commandContext.jumpToBookmark = jumpToBookmark; commandContext.scrollToLine = scrollToLine;
350
351
  commandContext.clearScreen = () => {
351
352
  compositor.resetDiff();
@@ -168,6 +168,7 @@ export function createBootstrapCommandActions(
168
168
  CommandContext,
169
169
  | 'renderRequest'
170
170
  | 'submitInput'
171
+ | 'withCompaction'
171
172
  | 'executeCommand'
172
173
  | 'cancelGeneration'
173
174
  | 'clearScreen'
@@ -216,6 +217,7 @@ export function createBootstrapCommandActions(
216
217
  return {
217
218
  renderRequest: requestRender,
218
219
  submitInput: () => unwiredShellAction('submitInput'),
220
+ withCompaction: () => unwiredShellAction('withCompaction'),
219
221
  executeCommand: async () => unwiredShellAction('executeCommand'),
220
222
  cancelGeneration: () => unwiredShellAction('cancelGeneration'),
221
223
  clearScreen: () => unwiredShellAction('clearScreen'),
package/src/version.ts CHANGED
@@ -6,7 +6,7 @@ import { join } from 'node:path';
6
6
  // The prebuild script updates the fallback value before compilation.
7
7
  // Uses import.meta.dir (Bun) to locate package.json relative to this file,
8
8
  // which is correct regardless of the process working directory.
9
- let _version = '2.1.1';
9
+ let _version = '2.1.2';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
12
12
  // Only trust a version read from OUR OWN package.json. A Bun single-file