mixdog 0.9.43 → 0.9.45

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.
Files changed (34) hide show
  1. package/package.json +3 -2
  2. package/scripts/ansi-color-capability-test.mjs +90 -0
  3. package/scripts/generate-runtime-manifest.mjs +39 -22
  4. package/scripts/grok-oauth-refresh-race-test.mjs +198 -0
  5. package/scripts/internal-comms-smoke.mjs +24 -7
  6. package/scripts/maintenance-default-routes-test.mjs +164 -0
  7. package/scripts/openai-oauth-ws-1006-retry-test.mjs +123 -0
  8. package/scripts/routing-corpus.mjs +1 -1
  9. package/scripts/shell-jobs-windows-hide-test.mjs +164 -0
  10. package/scripts/tui-transcript-jitter-harness-entry.jsx +302 -0
  11. package/scripts/tui-transcript-jitter-harness.mjs +58 -0
  12. package/src/agents/reviewer/AGENT.md +5 -7
  13. package/src/rules/lead/lead-brief.md +5 -4
  14. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +40 -3
  15. package/src/runtime/agent/orchestrator/config.mjs +29 -14
  16. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +46 -21
  17. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +5 -1
  18. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +7 -5
  19. package/src/runtime/memory/data/runtime-manifest.json +11 -11
  20. package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -2
  21. package/src/runtime/shared/update-checker.mjs +40 -10
  22. package/src/standalone/agent-tool.mjs +65 -50
  23. package/src/standalone/explore-tool.mjs +17 -16
  24. package/src/tui/App.jsx +3 -6
  25. package/src/tui/app/provider-setup-picker.mjs +1 -0
  26. package/src/tui/app/use-transcript-window.mjs +5 -1
  27. package/src/tui/components/StatusLine.jsx +7 -6
  28. package/src/tui/dist/index.mjs +225 -90
  29. package/src/tui/engine/turn.mjs +1 -1
  30. package/src/tui/index.jsx +3 -2
  31. package/src/tui/markdown/streaming-markdown.mjs +35 -9
  32. package/src/tui/statusline-ansi-bridge.mjs +17 -7
  33. package/src/ui/ansi.mjs +85 -5
  34. package/src/ui/statusline-format.mjs +7 -7
package/src/tui/App.jsx CHANGED
@@ -263,12 +263,9 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false })
263
263
  const [resizeState, setResizeState] = useState(() => ({ ...terminalSize(stdout), epoch: 0 }));
264
264
  const [panelTransitionEpoch, setPanelTransitionEpoch] = useState(0);
265
265
  const [panelInkMaskEpoch, setPanelInkMaskEpoch] = useState(0);
266
- // Windows Terminal/conhost scrolls the alt-screen (auto-wrap/DECAWM) when the
267
- // bottom-right cell is written. WT_SESSION is also set when the UI runs under
268
- // a Unix-ish shell hosted by Windows Terminal, where process.platform is not
269
- // necessarily win32 but the terminal behavior is still Windows-like.
270
- const windowsLikeTerminal = process.platform === 'win32' || Boolean(process.env.WT_SESSION);
271
- const rightSafetyColumns = windowsLikeTerminal ? 1 : 0;
266
+ // Keep a universal one-cell margin at the right edge: terminals may clip or
267
+ // wrap their final cell, including macOS terminals rendering rounded borders.
268
+ const rightSafetyColumns = 1;
272
269
  const frameColumns = Math.max(1, resizeState.columns - rightSafetyColumns);
273
270
  // scrollOffset = how many transcript ROWS we've scrolled UP from the bottom
274
271
  // (0 = pinned to the latest, showing the newest content). Mouse wheel adjusts
@@ -49,6 +49,7 @@ export function createProviderSetupPicker({
49
49
  let setup = options.preloadedSetup && typeof options.preloadedSetup === 'object'
50
50
  ? options.preloadedSetup
51
51
  : null;
52
+ options.preloadedSetup = null;
52
53
  if (!setup) {
53
54
  setPicker({
54
55
  title: options.title || 'Providers',
@@ -352,7 +352,11 @@ export function useTranscriptWindow({
352
352
  // measuredRowsVersion bumps, the row index absorbs the growth (idEntry.rows ==
353
353
  // the new measured height) and the live estimate matches it, so delta → 0.
354
354
  if (scrolledUp && !followingRef.current) {
355
- const growth = streamingTailMountedGrowth(transcriptItems, frameColumns, toolOutputExpanded);
355
+ const growth = streamingTailMountedGrowth(
356
+ streamingTailItem ? [streamingTailItem] : transcriptItems,
357
+ frameColumns,
358
+ toolOutputExpanded,
359
+ );
356
360
  // Only compensate when the tail is actually mounted in the rendered slice
357
361
  // (viewport + overscan). Off-slice it is represented by a row-index-sized
358
362
  // bottom spacer that does NOT physically grow this frame, so shifting the
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import React, { useEffect, useRef, useState } from 'react';
10
10
  import { Box, Text } from 'ink';
11
+ import { rgbSgr } from '../../ui/ansi.mjs';
11
12
  import { displayModelName, shortenModelName } from '../../ui/model-display.mjs';
12
13
  import { theme, surfaceBackground } from '../theme.mjs';
13
14
  import {
@@ -116,7 +117,7 @@ function scheduleBootFullRetry(backoffMsRef, nextAttemptAtRef) {
116
117
  function ansiRgb(value, fallback) {
117
118
  const match = /^rgb\((\d+),(\d+),(\d+)\)$/.exec(String(value || '').replace(/\s+/g, ''));
118
119
  if (!match) return fallback;
119
- return `\x1b[38;2;${match[1]};${match[2]};${match[3]}m`;
120
+ return rgbSgr(match[1], match[2], match[3]);
120
121
  }
121
122
 
122
123
  // SGR escapes derived from the active theme. Resolved per call (not captured at
@@ -124,11 +125,11 @@ function ansiRgb(value, fallback) {
124
125
  // render. `theme` is mutated in-place on switch.
125
126
  function statusColors() {
126
127
  return {
127
- STATUS: ansiRgb(theme.statusText, '\x1b[38;2;198;198;198m'),
128
- SUBTLE: ansiRgb(theme.statusSubtle, '\x1b[38;2;136;136;136m'),
129
- SUCCESS: ansiRgb(theme.success, '\x1b[38;2;0;170;75m'),
130
- WARNING: ansiRgb(theme.warning, '\x1b[38;2;255;193;7m'),
131
- ERROR: ansiRgb(theme.error, '\x1b[38;2;220;70;88m'),
128
+ STATUS: ansiRgb(theme.statusText, rgbSgr(198, 198, 198)),
129
+ SUBTLE: ansiRgb(theme.statusSubtle, rgbSgr(136, 136, 136)),
130
+ SUCCESS: ansiRgb(theme.success, rgbSgr(0, 170, 75)),
131
+ WARNING: ansiRgb(theme.warning, rgbSgr(255, 193, 7)),
132
+ ERROR: ansiRgb(theme.error, rgbSgr(220, 70, 88)),
132
133
  };
133
134
  }
134
135