praxis-agent 0.23.0 → 0.23.1

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.
@@ -15,6 +15,7 @@ import { redactSensitiveText, sensitiveEnvironmentValues, } from '../platform/se
15
15
  import { CommandPalette, BtwPanel, Composer, DiffDashboard, DialogFrame, ExternalEditorWait, HelpMenu, HookDashboard, ListDashboard, MemoryDashboard, MentionPicker, ModelMenu, PermissionDashboard, SelectionMenu, SessionPicker, ThemePicker, CustomThemeEditor, SessionIdentity, Transcript, WelcomePanel, useTerminalRows, useTerminalWidth, } from './tui/claude-style.js';
16
16
  import { loadTuiMemoryFiles, openTuiMemoryFolder, } from './tui/memory-files.js';
17
17
  import { loadClaudeReleaseNotes } from './tui/release-notes.js';
18
+ import { fullscreenInkRenderOptions } from './tui/fullscreen-renderer.js';
18
19
  import { StreamingFrameBuffer } from './tui/streaming-frame-buffer.js';
19
20
  import { createClaudeStatusLineInput, StatusLine } from './tui/status-line.js';
20
21
  import { FULLSCREEN_TRANSCRIPT_RESERVED_ROWS, transcriptLineCount, } from './tui/transcript-viewport.js';
@@ -2692,6 +2693,14 @@ export function InteractiveApp({ dataPlane = resolveDataPlane(), configRoot: sup
2692
2693
  }
2693
2694
  setUsage(result.usage);
2694
2695
  setCostUsd(result.costUsd);
2696
+ // The active stream and its committed final item must never render in the
2697
+ // same frame. Publish the cleared stream before appending the final
2698
+ // assistant entry; there is no await between these operations, and the
2699
+ // renderer's frame buffer prevents the identical text from being shown
2700
+ // twice during the transition.
2701
+ streamingFrameRef.current?.resetText();
2702
+ streamingFrameRef.current?.resetThinking();
2703
+ streamingFrameRef.current?.flush();
2695
2704
  append({ kind: 'assistant', text: result.text });
2696
2705
  if (turnMutatedFilesRef.current) {
2697
2706
  try {
@@ -6070,9 +6079,8 @@ export async function runInteractive(options) {
6070
6079
  ? { allowDangerouslySkipPermissions: true }
6071
6080
  : {}) }), {
6072
6081
  exitOnCtrlC: false,
6073
- incrementalRendering: !options.axScreenReader,
6082
+ ...fullscreenInkRenderOptions(currentRenderer, options.axScreenReader),
6074
6083
  interactive: true,
6075
- alternateScreen: currentRenderer === 'fullscreen',
6076
6084
  });
6077
6085
  await instance.waitUntilExit();
6078
6086
  if (activeTurn)
@@ -0,0 +1,14 @@
1
+ import type { TuiRendererMode } from './tui-view-model.js';
2
+ /** Stable terminal-frame policy for the fullscreen renderer. */
3
+ export interface FullscreenInkRenderOptions {
4
+ incrementalRendering: boolean;
5
+ alternateScreen: boolean;
6
+ }
7
+ /**
8
+ * The Ink render options for an interactive session. Fullscreen uses a stable
9
+ * terminal-frame policy: incremental rendering is disabled (every frame is a
10
+ * full redraw that erases the previous viewport) while classic and screen-reader
11
+ * modes keep their current behavior.
12
+ */
13
+ export declare function fullscreenInkRenderOptions(currentRenderer: TuiRendererMode, axScreenReader: boolean | undefined): FullscreenInkRenderOptions;
14
+ //# sourceMappingURL=fullscreen-renderer.d.ts.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The Ink render options for an interactive session. Fullscreen uses a stable
3
+ * terminal-frame policy: incremental rendering is disabled (every frame is a
4
+ * full redraw that erases the previous viewport) while classic and screen-reader
5
+ * modes keep their current behavior.
6
+ */
7
+ export function fullscreenInkRenderOptions(currentRenderer, axScreenReader) {
8
+ return {
9
+ incrementalRendering: currentRenderer !== 'fullscreen' && !axScreenReader,
10
+ alternateScreen: currentRenderer === 'fullscreen',
11
+ };
12
+ }
13
+ //# sourceMappingURL=fullscreen-renderer.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "praxis-agent",
3
- "version": "0.23.0",
3
+ "version": "0.23.1",
4
4
  "description": "Local-first, single-user general agent for the command line.",
5
5
  "license": "MIT",
6
6
  "author": "wuqisen",
@@ -44,6 +44,7 @@
44
44
  "test:docs": "node scripts/verify-docs.mjs",
45
45
  "test:compat": "npm run build && node scripts/verify-claude-compatibility.mjs && node scripts/verify-claude-advanced-fixtures.mjs",
46
46
  "test:compat:all": "npm run build && node scripts/verify-compatibility-matrix.mjs",
47
+ "test:tui:pty": "npm run build && node scripts/verify-fullscreen-rendering.mjs",
47
48
  "test:cli-surface-compat": "npm run build && node scripts/verify-cli-surface-parity.mjs",
48
49
  "test:cli-controls-compat": "npm run build && node scripts/verify-cli-controls.mjs",
49
50
  "test:conditional-compat": "npm run build && node scripts/verify-conditional-rules.mjs",