@wrongstack/tui 0.313.0 → 0.313.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.
@@ -323,6 +323,7 @@ export type Action = {
323
323
  breakerAutoKillResetMs: number;
324
324
  showModelReasoning: boolean;
325
325
  showAgentSwarmPanel: import('./app-settings-type.js').AgentSwarmPanelMode;
326
+ showSidebar?: boolean | undefined;
326
327
  panelPositions: import('./ui-contracts.js').PanelPositionMap;
327
328
  readSymbols: boolean;
328
329
  showSageMemoryInject: boolean;
@@ -55,6 +55,11 @@ export interface CreateInitialStateOptions {
55
55
  restoredEntries: State['entries'];
56
56
  /** Checkpoints rebuilt from a resumed session's events. Empty for a fresh session. */
57
57
  restoredCheckpoints?: State['checkpoints'] | undefined;
58
+ /** Initial context-window snapshot for resumed sessions. */
59
+ initialContextSnapshot?: {
60
+ tokens: number;
61
+ maxContext: number;
62
+ } | undefined;
58
63
  enhanceEnabled: boolean;
59
64
  initialAgentsMonitorOpen?: boolean | undefined;
60
65
  /** Boot-time fleet-chat verbosity (from persisted config). Default 'off'. */
@@ -76,6 +76,8 @@ export type Settings = {
76
76
  * sidebar, vertical), or 'off' (hidden). Default: 'bottom'.
77
77
  * Backward-compat: old boolean configs are coerced — true→'bottom', false→'off'. */
78
78
  showAgentSwarmPanel: AgentSwarmPanelMode;
79
+ /** Right sidebar visibility: when false, the right sidebar is completely hidden. Default: true. */
80
+ showSidebar: boolean;
79
81
  /**
80
82
  * Per-panel position map. Each F-key panel can be set to 'bottom' (F-key
81
83
  * behavior, the default) or 'sidebar' (rendered in the right sidebar).
@@ -299,6 +299,8 @@ export type State = {
299
299
  showModelReasoning: boolean;
300
300
  /** Agent swarm panel placement: 'bottom' (lower region), 'sidebar' (right sidebar), or 'off'. Default: 'bottom'. */
301
301
  showAgentSwarmPanel: import('./app-settings-type.js').AgentSwarmPanelMode;
302
+ /** Right sidebar visibility (mirrors Settings.showSidebar). Default: true. */
303
+ showSidebar: boolean;
302
304
  /**
303
305
  * Per-panel position map mirrored from the persisted Settings shape.
304
306
  * Each F-key panel can be set to 'bottom' (F-key behavior, the default)
@@ -23,6 +23,15 @@ export declare function effectivePanelPositions(state: State, liveSettings: Sett
23
23
  export declare function resolveAgentSwarmPanelVisibility(settingsOpen: boolean, pickerValue: AgentSwarmPanelMode, persistedValue: AgentSwarmPanelMode | undefined): AgentSwarmPanelMode;
24
24
  /** {@link resolveAgentSwarmPanelVisibility} bound to app state + live settings. */
25
25
  export declare function effectiveAgentSwarmPanelMode(state: State, liveSettings: Settings | undefined): AgentSwarmPanelMode;
26
+ /**
27
+ * Pure dual-source read for the right-sidebar master switch: the picker
28
+ * draft wins while the settings picker is open, the persisted value
29
+ * (defaulting to true) otherwise. Boolean mirror of {@link
30
+ * resolveAgentSwarmPanelVisibility}.
31
+ */
32
+ export declare function resolveShowSidebarVisibility(settingsOpen: boolean, pickerValue: boolean, persistedValue: boolean | undefined): boolean;
33
+ /** {@link resolveShowSidebarVisibility} bound to app state + live settings. */
34
+ export declare function effectiveShowSidebar(state: State, liveSettings: Settings | undefined): boolean;
26
35
  /**
27
36
  * Open flags for each routable panel — which twins are candidates for a
28
37
  * sidebar slot. Shared by the dispatcher and the renderer so the
@@ -70,6 +70,8 @@ export interface SettingsPickerProps {
70
70
  * this toggle controls only the sidebar mission queue. Default: 'bottom'.
71
71
  */
72
72
  showAgentSwarmPanel: import('../app-settings-type.js').AgentSwarmPanelMode;
73
+ /** Right sidebar master toggle. */
74
+ showSidebar?: boolean | undefined;
73
75
  /** Show SAGE Memory Inject blocks in tool results. Default: false. */
74
76
  showSageMemoryInject: boolean;
75
77
  /** Minimum relation strength for SAGE memory injection. Default: 0.85. */
@@ -133,5 +135,5 @@ export interface SettingsPickerProps {
133
135
  fieldRowIndex: readonly number[];
134
136
  }) => void) | undefined;
135
137
  }
136
- export declare function SettingsPicker({ field, filter, mode, delayMs, titleAnimation, yolo, fleetChat, chime, confirmExit, nextPrediction, featureMcp, featurePlugins, featureMemory, featureSkills, featureModelsRegistry, tokenSavingTier, allowOutsideProjectRoot, maxIterations, autoProceedMaxIterations, enhanceDelayMs, enhanceEnabled, enhanceLanguage, preRefineSeconds, indexOnStart, multiDiffSummaryThreshold, thinkingWord, thinkingWordEditing, thinkingWordDraft, wrongProxyUrlEditing, wrongProxyUrlDraft, reasoningMode, reasoningEffort, reasoningPreserve, cacheTtl, contextAutoCompact, contextStrategy, contextMode, maxConcurrent, logLevel, auditLevel, debugStream, statuslineMode, configScope, profileConfigPath, animationStyle, breakerEnabled, breakerAutoKillResetMs, showModelReasoning, showAgentSwarmPanel, showSageMemoryInject, sageMemoryInjectThreshold, nextStepsTool, readSymbols, panelPositions, wrongProxyEnabled, wrongProxyUrl, inputHeight, hint, onLayoutComputed, }: SettingsPickerProps): React.ReactElement;
138
+ export declare function SettingsPicker({ field, filter, mode, delayMs, titleAnimation, yolo, fleetChat, chime, confirmExit, nextPrediction, featureMcp, featurePlugins, featureMemory, featureSkills, featureModelsRegistry, tokenSavingTier, allowOutsideProjectRoot, maxIterations, autoProceedMaxIterations, enhanceDelayMs, enhanceEnabled, enhanceLanguage, preRefineSeconds, indexOnStart, multiDiffSummaryThreshold, thinkingWord, thinkingWordEditing, thinkingWordDraft, wrongProxyUrlEditing, wrongProxyUrlDraft, reasoningMode, reasoningEffort, reasoningPreserve, cacheTtl, contextAutoCompact, contextStrategy, contextMode, maxConcurrent, logLevel, auditLevel, debugStream, statuslineMode, configScope, profileConfigPath, animationStyle, breakerEnabled, breakerAutoKillResetMs, showModelReasoning, showAgentSwarmPanel, showSidebar, showSageMemoryInject, sageMemoryInjectThreshold, nextStepsTool, readSymbols, panelPositions, wrongProxyEnabled, wrongProxyUrl, inputHeight, hint, onLayoutComputed, }: SettingsPickerProps): React.ReactElement;
137
139
  //# sourceMappingURL=settings-picker.d.ts.map
package/dist/index.js CHANGED
@@ -1238,6 +1238,342 @@ var themePresets = Object.freeze({
1238
1238
  diffAddBg: "#1c1c1c",
1239
1239
  diffDelBg: "#262626",
1240
1240
  monitor: { fleet: "#cccccc", agents: "#d0d0d0", worktree: "#a8a8a8", phase: "#bcbcbc" }
1241
+ }),
1242
+ matrix: Object.freeze({
1243
+ ...baseTheme,
1244
+ textPrimary: "#a3e635",
1245
+ textSecondary: "#65a30d",
1246
+ textMuted: "#3f6212",
1247
+ brandPrimary: "#4ade80",
1248
+ brandAccent: "#22c55e",
1249
+ surface: "#050a05",
1250
+ surfaceRaised: "#0d190d",
1251
+ accent: "#22c55e",
1252
+ user: "#86efac",
1253
+ assistant: "#22c55e",
1254
+ tool: "#4ade80",
1255
+ success: "#22c55e",
1256
+ warn: "#a3e635",
1257
+ error: "#ef4444",
1258
+ borderDefault: "#1a331a",
1259
+ borderSubtle: "#0f200f",
1260
+ borderActive: "#22c55e",
1261
+ brand: "#16a34a",
1262
+ diffAddBg: "#0b2612",
1263
+ diffDelBg: "#2a0e14",
1264
+ monitor: { fleet: "#4ade80", agents: "#22c55e", worktree: "#86efac", phase: "#16a34a" }
1265
+ }),
1266
+ amber: Object.freeze({
1267
+ ...baseTheme,
1268
+ textPrimary: "#ffc83b",
1269
+ textSecondary: "#d9981e",
1270
+ textMuted: "#8c5e0d",
1271
+ brandPrimary: "#ffb000",
1272
+ brandAccent: "#ff8c00",
1273
+ surface: "#0f0a03",
1274
+ surfaceRaised: "#1a1205",
1275
+ accent: "#ffb000",
1276
+ user: "#ffd700",
1277
+ assistant: "#ffb000",
1278
+ tool: "#ffa000",
1279
+ success: "#73c936",
1280
+ warn: "#ffb000",
1281
+ error: "#ff5555",
1282
+ borderDefault: "#3d2806",
1283
+ borderSubtle: "#261803",
1284
+ borderActive: "#ffb000",
1285
+ brand: "#ff9000",
1286
+ diffAddBg: "#1a2608",
1287
+ diffDelBg: "#2b0e0a",
1288
+ monitor: { fleet: "#ffb000", agents: "#ff8c00", worktree: "#ffd700", phase: "#ffa000" }
1289
+ }),
1290
+ "cyber-noir": Object.freeze({
1291
+ ...baseTheme,
1292
+ textPrimary: "#f1f5f9",
1293
+ textSecondary: "#cbd5e1",
1294
+ textMuted: "#64748b",
1295
+ brandPrimary: "#94a3b8",
1296
+ brandAccent: "#e2e8f0",
1297
+ surface: "#08090a",
1298
+ surfaceRaised: "#121417",
1299
+ accent: "#e2e8f0",
1300
+ user: "#f8fafc",
1301
+ assistant: "#e2e8f0",
1302
+ tool: "#cbd5e1",
1303
+ success: "#86efac",
1304
+ warn: "#fde047",
1305
+ error: "#f87171",
1306
+ borderDefault: "#334155",
1307
+ borderSubtle: "#1e293b",
1308
+ borderActive: "#f8fafc",
1309
+ brand: "#cbd5e1",
1310
+ diffAddBg: "#0f291e",
1311
+ diffDelBg: "#2d1217",
1312
+ monitor: { fleet: "#e2e8f0", agents: "#cbd5e1", worktree: "#86efac", phase: "#94a3b8" }
1313
+ }),
1314
+ "cobalt-mono": Object.freeze({
1315
+ ...baseTheme,
1316
+ textPrimary: "#bae6fd",
1317
+ textSecondary: "#7dd3fc",
1318
+ textMuted: "#0369a1",
1319
+ brandPrimary: "#38bdf8",
1320
+ brandAccent: "#0ea5e9",
1321
+ surface: "#040d1a",
1322
+ surfaceRaised: "#08172e",
1323
+ accent: "#38bdf8",
1324
+ user: "#7dd3fc",
1325
+ assistant: "#38bdf8",
1326
+ tool: "#0ea5e9",
1327
+ success: "#4ade80",
1328
+ warn: "#facc15",
1329
+ error: "#f87171",
1330
+ borderDefault: "#0c4a6e",
1331
+ borderSubtle: "#082f49",
1332
+ borderActive: "#38bdf8",
1333
+ brand: "#0284c7",
1334
+ diffAddBg: "#06281e",
1335
+ diffDelBg: "#2a0e18",
1336
+ monitor: { fleet: "#38bdf8", agents: "#0ea5e9", worktree: "#7dd3fc", phase: "#0284c7" }
1337
+ }),
1338
+ "blood-moon": Object.freeze({
1339
+ ...baseTheme,
1340
+ textPrimary: "#fecaca",
1341
+ textSecondary: "#f87171",
1342
+ textMuted: "#991b1b",
1343
+ brandPrimary: "#ef4444",
1344
+ brandAccent: "#dc2626",
1345
+ surface: "#0f0507",
1346
+ surfaceRaised: "#1a0a0e",
1347
+ accent: "#f87171",
1348
+ user: "#fca5a5",
1349
+ assistant: "#f87171",
1350
+ tool: "#ef4444",
1351
+ success: "#4ade80",
1352
+ warn: "#fbbf24",
1353
+ error: "#f87171",
1354
+ borderDefault: "#450a0a",
1355
+ borderSubtle: "#2d0606",
1356
+ borderActive: "#ef4444",
1357
+ brand: "#dc2626",
1358
+ diffAddBg: "#122614",
1359
+ diffDelBg: "#2e080d",
1360
+ monitor: { fleet: "#f87171", agents: "#dc2626", worktree: "#fca5a5", phase: "#ef4444" }
1361
+ }),
1362
+ cobalt2: Object.freeze({
1363
+ ...baseTheme,
1364
+ textPrimary: "#ffffff",
1365
+ textSecondary: "#a5b4fc",
1366
+ textMuted: "#6272a4",
1367
+ brandPrimary: "#ffc600",
1368
+ brandAccent: "#0088ff",
1369
+ surface: "#15232d",
1370
+ surfaceRaised: "#193549",
1371
+ accent: "#0088ff",
1372
+ user: "#ffc600",
1373
+ assistant: "#3ad900",
1374
+ tool: "#0088ff",
1375
+ success: "#3ad900",
1376
+ warn: "#ff9d00",
1377
+ error: "#ff0055",
1378
+ borderDefault: "#264a66",
1379
+ borderSubtle: "#193549",
1380
+ borderActive: "#ffc600",
1381
+ brand: "#ffc600",
1382
+ diffAddBg: "#103822",
1383
+ diffDelBg: "#3d0e20",
1384
+ monitor: { fleet: "#0088ff", agents: "#ffc600", worktree: "#3ad900", phase: "#ff9d00" }
1385
+ }),
1386
+ "shades-of-purple": Object.freeze({
1387
+ ...baseTheme,
1388
+ textPrimary: "#ffffff",
1389
+ textSecondary: "#d1b3ff",
1390
+ textMuted: "#7869a8",
1391
+ brandPrimary: "#fad000",
1392
+ brandAccent: "#ff62d3",
1393
+ surface: "#181734",
1394
+ surfaceRaised: "#222244",
1395
+ accent: "#9effff",
1396
+ user: "#fad000",
1397
+ assistant: "#9effff",
1398
+ tool: "#b362ff",
1399
+ success: "#a5ff90",
1400
+ warn: "#fad000",
1401
+ error: "#ff3366",
1402
+ borderDefault: "#443c7a",
1403
+ borderSubtle: "#2d2757",
1404
+ borderActive: "#fad000",
1405
+ brand: "#b362ff",
1406
+ diffAddBg: "#163628",
1407
+ diffDelBg: "#3b162a",
1408
+ monitor: { fleet: "#9effff", agents: "#b362ff", worktree: "#a5ff90", phase: "#ff62d3" }
1409
+ }),
1410
+ "flexoki-dark": Object.freeze({
1411
+ ...baseTheme,
1412
+ textPrimary: "#cecdc3",
1413
+ textSecondary: "#b7b5ac",
1414
+ textMuted: "#66645e",
1415
+ brandPrimary: "#da702c",
1416
+ brandAccent: "#ce5d97",
1417
+ surface: "#100f0f",
1418
+ surfaceRaised: "#1c1b1a",
1419
+ accent: "#4385be",
1420
+ user: "#d0a215",
1421
+ assistant: "#24837b",
1422
+ tool: "#4385be",
1423
+ success: "#879a39",
1424
+ warn: "#da702c",
1425
+ error: "#d14d41",
1426
+ borderDefault: "#343331",
1427
+ borderSubtle: "#282726",
1428
+ borderActive: "#da702c",
1429
+ brand: "#ce5d97",
1430
+ diffAddBg: "#192b1a",
1431
+ diffDelBg: "#321919",
1432
+ monitor: { fleet: "#4385be", agents: "#ce5d97", worktree: "#879a39", phase: "#24837b" }
1433
+ }),
1434
+ laserwave: Object.freeze({
1435
+ ...baseTheme,
1436
+ textPrimary: "#ffffff",
1437
+ textSecondary: "#d0bfe6",
1438
+ textMuted: "#716485",
1439
+ brandPrimary: "#eb64b9",
1440
+ brandAccent: "#b381c5",
1441
+ surface: "#161320",
1442
+ surfaceRaised: "#1f1a2e",
1443
+ accent: "#40b4c4",
1444
+ user: "#ffe261",
1445
+ assistant: "#40b4c4",
1446
+ tool: "#eb64b9",
1447
+ success: "#74dfc4",
1448
+ warn: "#ffe261",
1449
+ error: "#e95678",
1450
+ borderDefault: "#44385f",
1451
+ borderSubtle: "#2b233e",
1452
+ borderActive: "#eb64b9",
1453
+ brand: "#b381c5",
1454
+ diffAddBg: "#143830",
1455
+ diffDelBg: "#3a1728",
1456
+ monitor: { fleet: "#40b4c4", agents: "#b381c5", worktree: "#74dfc4", phase: "#eb64b9" }
1457
+ }),
1458
+ andromeda: Object.freeze({
1459
+ ...baseTheme,
1460
+ textPrimary: "#f7f7f8",
1461
+ textSecondary: "#d5ced9",
1462
+ textMuted: "#746f77",
1463
+ brandPrimary: "#f92672",
1464
+ brandAccent: "#c74ded",
1465
+ surface: "#1b1d23",
1466
+ surfaceRaised: "#23262e",
1467
+ accent: "#00e8c6",
1468
+ user: "#ffe66d",
1469
+ assistant: "#00e8c6",
1470
+ tool: "#c74ded",
1471
+ success: "#96e072",
1472
+ warn: "#ffe66d",
1473
+ error: "#f92672",
1474
+ borderDefault: "#3e4451",
1475
+ borderSubtle: "#2b2f38",
1476
+ borderActive: "#00e8c6",
1477
+ brand: "#c74ded",
1478
+ diffAddBg: "#163827",
1479
+ diffDelBg: "#3b172a",
1480
+ monitor: { fleet: "#00e8c6", agents: "#c74ded", worktree: "#96e072", phase: "#ffe66d" }
1481
+ }),
1482
+ "github-dark-dimmed": Object.freeze({
1483
+ ...baseTheme,
1484
+ textPrimary: "#cdd9e5",
1485
+ textSecondary: "#adbac7",
1486
+ textMuted: "#636e7b",
1487
+ brandPrimary: "#539bf5",
1488
+ brandAccent: "#dcbdfb",
1489
+ surface: "#1c2128",
1490
+ surfaceRaised: "#22272e",
1491
+ accent: "#6cb6ff",
1492
+ user: "#daaa3f",
1493
+ assistant: "#6cb6ff",
1494
+ tool: "#539bf5",
1495
+ success: "#57ab5a",
1496
+ warn: "#daaa3f",
1497
+ error: "#f47067",
1498
+ borderDefault: "#444c56",
1499
+ borderSubtle: "#313944",
1500
+ borderActive: "#539bf5",
1501
+ brand: "#dcbdfb",
1502
+ diffAddBg: "#1b3824",
1503
+ diffDelBg: "#3d1c20",
1504
+ monitor: { fleet: "#6cb6ff", agents: "#dcbdfb", worktree: "#57ab5a", phase: "#539bf5" }
1505
+ }),
1506
+ snazzy: Object.freeze({
1507
+ ...baseTheme,
1508
+ textPrimary: "#eff0eb",
1509
+ textSecondary: "#d8dee9",
1510
+ textMuted: "#686f7a",
1511
+ brandPrimary: "#ff5c57",
1512
+ brandAccent: "#ff6ac1",
1513
+ surface: "#1e2029",
1514
+ surfaceRaised: "#282a36",
1515
+ accent: "#57c7ff",
1516
+ user: "#f3f99d",
1517
+ assistant: "#57c7ff",
1518
+ tool: "#ff6ac1",
1519
+ success: "#5af78e",
1520
+ warn: "#f3f99d",
1521
+ error: "#ff5c57",
1522
+ borderDefault: "#414558",
1523
+ borderSubtle: "#2f3241",
1524
+ borderActive: "#57c7ff",
1525
+ brand: "#ff6ac1",
1526
+ diffAddBg: "#153826",
1527
+ diffDelBg: "#3b1820",
1528
+ monitor: { fleet: "#57c7ff", agents: "#ff6ac1", worktree: "#5af78e", phase: "#f3f99d" }
1529
+ }),
1530
+ "tokyo-night-moon": Object.freeze({
1531
+ ...baseTheme,
1532
+ textPrimary: "#c8d3f5",
1533
+ textSecondary: "#a5b6cf",
1534
+ textMuted: "#636e8d",
1535
+ brandPrimary: "#ff966c",
1536
+ brandAccent: "#c099ff",
1537
+ surface: "#1e2030",
1538
+ surfaceRaised: "#222436",
1539
+ accent: "#82aaff",
1540
+ user: "#ffc777",
1541
+ assistant: "#82aaff",
1542
+ tool: "#c099ff",
1543
+ success: "#c3e88d",
1544
+ warn: "#ffc777",
1545
+ error: "#ff757f",
1546
+ borderDefault: "#3b4261",
1547
+ borderSubtle: "#2f334d",
1548
+ borderActive: "#82aaff",
1549
+ brand: "#c099ff",
1550
+ diffAddBg: "#1d3627",
1551
+ diffDelBg: "#3d1e28",
1552
+ monitor: { fleet: "#82aaff", agents: "#c099ff", worktree: "#c3e88d", phase: "#ff966c" }
1553
+ }),
1554
+ "gruvbox-dark-hard": Object.freeze({
1555
+ ...baseTheme,
1556
+ textPrimary: "#ebdbb2",
1557
+ textSecondary: "#d5c4a1",
1558
+ textMuted: "#665c54",
1559
+ brandPrimary: "#fe8019",
1560
+ brandAccent: "#d3869b",
1561
+ surface: "#141617",
1562
+ surfaceRaised: "#1d2021",
1563
+ accent: "#83a598",
1564
+ user: "#fabd2f",
1565
+ assistant: "#83a598",
1566
+ tool: "#8ec07c",
1567
+ success: "#b8bb26",
1568
+ warn: "#fabd2f",
1569
+ error: "#fb4934",
1570
+ borderDefault: "#504945",
1571
+ borderSubtle: "#32302f",
1572
+ borderActive: "#fe8019",
1573
+ brand: "#d3869b",
1574
+ diffAddBg: "#1a331a",
1575
+ diffDelBg: "#351a1a",
1576
+ monitor: { fleet: "#83a598", agents: "#d3869b", worktree: "#b8bb26", phase: "#8ec07c" }
1241
1577
  })
1242
1578
  });
1243
1579
  var THEME_OPTIONS = [
@@ -1412,6 +1748,76 @@ var THEME_OPTIONS = [
1412
1748
  id: "monochrome",
1413
1749
  name: "Monochrome",
1414
1750
  description: "Pure grayscale \u2014 no hue, only luminance"
1751
+ },
1752
+ {
1753
+ id: "matrix",
1754
+ name: "Matrix Green",
1755
+ description: "Phosphor green CRT terminal \u2014 digital rain aesthetic"
1756
+ },
1757
+ {
1758
+ id: "amber",
1759
+ name: "Amber CRT",
1760
+ description: "Warm phosphor CRT terminal \u2014 glowing vintage amber"
1761
+ },
1762
+ {
1763
+ id: "cyber-noir",
1764
+ name: "Cyber Noir",
1765
+ description: "Stark white and slate on jet black \u2014 minimalist high contrast"
1766
+ },
1767
+ {
1768
+ id: "cobalt-mono",
1769
+ name: "Cobalt Monochrome",
1770
+ description: "Luminous cyan on deep abyss blue \u2014 oceanic blueprint"
1771
+ },
1772
+ {
1773
+ id: "blood-moon",
1774
+ name: "Blood Moon",
1775
+ description: "Crimson & scarlet on obsidian \u2014 brooding dark mode"
1776
+ },
1777
+ {
1778
+ id: "cobalt2",
1779
+ name: "Cobalt2",
1780
+ description: "Wes Bos' signature theme \u2014 deep navy with golden yellow & cyan"
1781
+ },
1782
+ {
1783
+ id: "shades-of-purple",
1784
+ name: "Shades of Purple",
1785
+ description: "Ahmad Awais' bold purple palette with neon yellow & magenta"
1786
+ },
1787
+ {
1788
+ id: "flexoki-dark",
1789
+ name: "Flexoki Dark",
1790
+ description: "Steph Ango's inky warm paper palette \u2014 natural earthy accents"
1791
+ },
1792
+ {
1793
+ id: "laserwave",
1794
+ name: "LaserWave",
1795
+ description: "80s retrowave \u2014 neon flamingo and turquoise on violet"
1796
+ },
1797
+ {
1798
+ id: "andromeda",
1799
+ name: "Andromeda",
1800
+ description: "Deep interstellar dark with vibrant neon teal and pink"
1801
+ },
1802
+ {
1803
+ id: "github-dark-dimmed",
1804
+ name: "GitHub Dark Dimmed",
1805
+ description: "GitHub's softer slate dark theme \u2014 gentle blues and pastels"
1806
+ },
1807
+ {
1808
+ id: "snazzy",
1809
+ name: "Hyper Snazzy",
1810
+ description: "Sindre Sorhus' elegant saturated terminal palette"
1811
+ },
1812
+ {
1813
+ id: "tokyo-night-moon",
1814
+ name: "Tokyo Night Moon",
1815
+ description: "Tokyo Night on balanced deep indigo \u2014 vibrant accents"
1816
+ },
1817
+ {
1818
+ id: "gruvbox-dark-hard",
1819
+ name: "Gruvbox Dark Hard",
1820
+ description: "Maximum contrast Gruvbox on deep pitch charcoal"
1415
1821
  }
1416
1822
  ];
1417
1823
 
@@ -1936,7 +2342,7 @@ var PANEL_IDS = Object.freeze([
1936
2342
  "connections"
1937
2343
  // Ctrl+N
1938
2344
  ]);
1939
- var TOTAL_SETTINGS_FIELD_COUNT = PANEL_POSITION_FIELD_START + PANEL_IDS.length + 2;
2345
+ var TOTAL_SETTINGS_FIELD_COUNT = PANEL_POSITION_FIELD_START + PANEL_IDS.length + 3;
1940
2346
  var DEFAULT_PANEL_POSITIONS = Object.freeze({
1941
2347
  projectPicker: "bottom",
1942
2348
  fleet: "bottom",
@@ -2009,6 +2415,16 @@ function effectiveAgentSwarmPanelMode(state, liveSettings) {
2009
2415
  liveSettings?.showAgentSwarmPanel
2010
2416
  );
2011
2417
  }
2418
+ function resolveShowSidebarVisibility(settingsOpen, pickerValue, persistedValue) {
2419
+ return settingsOpen ? pickerValue : persistedValue ?? true;
2420
+ }
2421
+ function effectiveShowSidebar(state, liveSettings) {
2422
+ return resolveShowSidebarVisibility(
2423
+ state.settingsPicker.open,
2424
+ state.settingsPicker.showSidebar,
2425
+ liveSettings?.showSidebar
2426
+ );
2427
+ }
2012
2428
  function buildSidebarOpenFlags(state, liveSettings) {
2013
2429
  return {
2014
2430
  projectPicker: state.projectPicker.open,
@@ -2033,15 +2449,16 @@ function resolveAppSidebarLayout(state, termCols, liveSettings, mailboxPanelOpen
2033
2449
  effectivePanelPositionsInput(state, liveSettings),
2034
2450
  mailboxPanelOpen,
2035
2451
  buildSidebarOpenFlags(state, liveSettings),
2036
- effectiveAgentSwarmPanelMode(state, liveSettings) === "sidebar"
2452
+ effectiveAgentSwarmPanelMode(state, liveSettings) === "sidebar",
2453
+ effectiveShowSidebar(state, liveSettings)
2037
2454
  );
2038
2455
  }
2039
- function resolveSidebarLayout(state, termCols, panelPositionsInput, mailboxPanelOpen, sidebarOpenFlags, legacySwarmOnSidebar) {
2456
+ function resolveSidebarLayout(state, termCols, panelPositionsInput, mailboxPanelOpen, sidebarOpenFlags, legacySwarmOnSidebar, showSidebar) {
2040
2457
  const panelPositions = coercePanelPositionMap(panelPositionsInput);
2041
2458
  const routedToSidebar = (id) => panelPositions[id] === "sidebar";
2042
2459
  const overlayOpen = isPickerOverlayOpen(state) || state.coordinator.monitorOpen && !routedToSidebar("coordinator") || state.auditPanelOpen || state.connectionsPanelOpen && !routedToSidebar("connections") || state.helpOpen || state.agentsMonitorOpen && !routedToSidebar("agents") || state.monitorOpen && !routedToSidebar("fleet") || state.contextPanelOpen || state.processListOpen && !routedToSidebar("processList") || state.todosMonitorOpen && !routedToSidebar("todos") || state.worktreeMonitorOpen && !routedToSidebar("worktree") || state.planPanelOpen && !routedToSidebar("plan") || state.kanbanPanelOpen && !routedToSidebar("kanban") || state.queuePanelOpen && !routedToSidebar("queue") || state.goalPanelOpen && !routedToSidebar("goal") || state.sessionsPanelOpen && !routedToSidebar("sessions") || state.projectPicker.open && !routedToSidebar("projectPicker") || state.goalKanbanPanelOpen || state.cronMonitorOpen || state.rewindOverlay != null || state.fallbackOverlay != null || state.shellCommandWarning != null || state.confirmQueue.length > 0 || state.clearConfirm != null || state.exitConfirm != null || state.slashConfirm != null || state.escConfirm != null || state.sendModePicker != null || state.enhance != null || state.enhanceBusy || state.topicCheckBusy || state.refineCountdown != null || state.refineFailure != null || state.continueConfirm != null || state.brainPrompt != null || mailboxPanelOpen || (state.goalRun?.monitorOpen ?? false) && !routedToSidebar("coordinator") || (state.sddBoard?.monitorOpen ?? false);
2043
- const sidebarWidth = overlayOpen ? 0 : computeSidebarWidth(termCols);
2044
- const effectiveSwarmOnSidebar = panelPositions.fleet === "sidebar" || (legacySwarmOnSidebar ?? false);
2460
+ const sidebarWidth = overlayOpen || showSidebar === false ? 0 : computeSidebarWidth(termCols);
2461
+ const effectiveSwarmOnSidebar = showSidebar !== false && (panelPositions.fleet === "sidebar" || (legacySwarmOnSidebar ?? false));
2045
2462
  let sidebarTwinRowCount = 0;
2046
2463
  if (sidebarOpenFlags) {
2047
2464
  sidebarTwinRowCount = sumSidebarTwinRowCount(
@@ -17873,8 +18290,10 @@ var SETTINGS_FIELD_LABELS = [
17873
18290
  // WS `prefs.update` pipeline; the picker is just the user surface.
17874
18291
  "WrongProxy / WrongTrace",
17875
18292
  // 59
17876
- "WrongProxy URL"
18293
+ "WrongProxy URL",
17877
18294
  // 60
18295
+ "Right sidebar"
18296
+ // 61
17878
18297
  ];
17879
18298
  function resolveSettingsFieldValue(field, input) {
17880
18299
  const raw = input.trim().toLowerCase();
@@ -17904,7 +18323,9 @@ function resolveSettingsFieldValue(field, input) {
17904
18323
  [45, "nextStepsTool"],
17905
18324
  // WrongProxy / WrongTrace master switch (field 59). The companion
17906
18325
  // URL field (60) is text-typed, see resolveSettingsFieldValue.
17907
- [59, "wrongProxyEnabled"]
18326
+ [59, "wrongProxyEnabled"],
18327
+ // Right sidebar master switch (field 61).
18328
+ [61, "showSidebar"]
17908
18329
  ]);
17909
18330
  const boolKey = BOOL_FIELDS.get(field);
17910
18331
  if (boolKey) {
@@ -18119,7 +18540,9 @@ function getSettingsFieldValue(values, field) {
18119
18540
  [45, "nextStepsTool"],
18120
18541
  // WrongProxy / WrongTrace master switch (field 59). The companion
18121
18542
  // URL field (60) is text-typed, see getSettingsFieldValue.
18122
- [59, "wrongProxyEnabled"]
18543
+ [59, "wrongProxyEnabled"],
18544
+ // Right sidebar master switch (field 61).
18545
+ [61, "showSidebar"]
18123
18546
  ];
18124
18547
  for (const [f, key] of BOOL_KEYS) {
18125
18548
  if (field !== f) continue;
@@ -18221,7 +18644,7 @@ var SETTINGS_SECTIONS = [
18221
18644
  },
18222
18645
  {
18223
18646
  name: "Display",
18224
- fields: [39, 40, 41, 43, 44]
18647
+ fields: [39, 40, 41, 43, 44, 61]
18225
18648
  },
18226
18649
  {
18227
18650
  name: "Panels",
@@ -18313,7 +18736,8 @@ var SETTINGS_DEFAULTS = Object.freeze({
18313
18736
  // makes every key mandatory — omitting them here breaks the type
18314
18737
  // contract for the entire TUI settings module. See Chimera review.
18315
18738
  wrongProxyEnabled: false,
18316
- wrongProxyUrl: "http://localhost:3444"
18739
+ wrongProxyUrl: "http://localhost:3444",
18740
+ showSidebar: true
18317
18741
  });
18318
18742
  function resetSettingsFieldValue(field) {
18319
18743
  const result = getSettingsFieldValue(SETTINGS_DEFAULTS, field);
@@ -18376,7 +18800,11 @@ function buildResetPatch(field) {
18376
18800
  // and `ToolsConfig.wrongProxy?: WrongProxyToolConfig` for the
18377
18801
  // canonical persistence shape.
18378
18802
  [59, "wrongProxyEnabled"],
18379
- [60, "wrongProxyUrl"]
18803
+ [60, "wrongProxyUrl"],
18804
+ // Right sidebar master switch (field 61). Without this entry,
18805
+ // `/settings reset sidebar` returns null and the field is
18806
+ // unresettable even though BOOL_FIELDS accepts on/off for it.
18807
+ [61, "showSidebar"]
18380
18808
  ];
18381
18809
  for (const [f, key] of KEY_MAP) {
18382
18810
  if (f === field) {
@@ -18526,6 +18954,7 @@ function SettingsPicker({
18526
18954
  breakerAutoKillResetMs,
18527
18955
  showModelReasoning,
18528
18956
  showAgentSwarmPanel,
18957
+ showSidebar,
18529
18958
  showSageMemoryInject,
18530
18959
  sageMemoryInjectThreshold,
18531
18960
  nextStepsTool,
@@ -18825,6 +19254,11 @@ function SettingsPicker({
18825
19254
  label: "WrongProxy URL",
18826
19255
  value: wrongProxyUrlEditing ? `${wrongProxyUrlDraft ?? ""}\u258F` : wrongProxyUrl,
18827
19256
  detail: wrongProxyUrlEditing ? "type a URL \xB7 Enter \u2713 \xB7 Esc \u2717 (http://host:port or https://host:port)" : "Where the local proxy daemon listens. Probed at <url>/api/health every 30s."
19257
+ },
19258
+ {
19259
+ label: "Right sidebar",
19260
+ value: boolVal(showSidebar ?? true),
19261
+ detail: "Show or hide the right sidebar in the TUI (chat history takes full width when off)"
18828
19262
  }
18829
19263
  ];
18830
19264
  const fieldRowIndex = [];
@@ -20164,6 +20598,7 @@ function AppViewPickers({
20164
20598
  breakerAutoKillResetMs: state.settingsPicker.breakerAutoKillResetMs,
20165
20599
  showModelReasoning: state.settingsPicker.showModelReasoning,
20166
20600
  showAgentSwarmPanel: state.settingsPicker.showAgentSwarmPanel,
20601
+ showSidebar: state.settingsPicker.showSidebar,
20167
20602
  showSageMemoryInject: state.settingsPicker.showSageMemoryInject,
20168
20603
  sageMemoryInjectThreshold: state.settingsPicker.sageMemoryInjectThreshold,
20169
20604
  nextStepsTool: state.settingsPicker.nextStepsTool,
@@ -32688,6 +33123,7 @@ function createInitialState(options) {
32688
33123
  breakerAutoKillResetMs: 6e4,
32689
33124
  showModelReasoning: true,
32690
33125
  showAgentSwarmPanel: "bottom",
33126
+ showSidebar: true,
32691
33127
  panelPositions: DEFAULT_PANEL_POSITIONS,
32692
33128
  // Default on: compact one-line chip (see SageMemoryBlock). Full bordered
32693
33129
  // panel remains available when operators expand inject visibility later.
@@ -32777,7 +33213,11 @@ function createInitialState(options) {
32777
33213
  currentTool: void 0,
32778
33214
  startedAt: Date.now(),
32779
33215
  lastEventAt: Date.now(),
32780
- iterating: false
33216
+ iterating: false,
33217
+ ...options.initialContextSnapshot && options.initialContextSnapshot.tokens > 0 ? {
33218
+ ctxTokens: options.initialContextSnapshot.tokens,
33219
+ ctxMaxTokens: options.initialContextSnapshot.maxContext > 0 ? options.initialContextSnapshot.maxContext : void 0
33220
+ } : {}
32781
33221
  },
32782
33222
  fleetCost: 0,
32783
33223
  fleetTokens: { input: 0, output: 0 },
@@ -35095,6 +35535,7 @@ function reduceSettingsPanel(state, action) {
35095
35535
  breakerAutoKillResetMs: action.breakerAutoKillResetMs,
35096
35536
  showModelReasoning: action.showModelReasoning,
35097
35537
  showAgentSwarmPanel: action.showAgentSwarmPanel,
35538
+ showSidebar: action.showSidebar ?? true,
35098
35539
  panelPositions: coercePanelPositionMap(action.panelPositions),
35099
35540
  showSageMemoryInject: action.showSageMemoryInject,
35100
35541
  sageMemoryInjectThreshold: action.sageMemoryInjectThreshold,
@@ -35626,6 +36067,11 @@ function reduceSettingsValues(state, action) {
35626
36067
  ...state,
35627
36068
  settingsPicker: { ...sp, wrongProxyEnabled: !sp.wrongProxyEnabled, hint: void 0 }
35628
36069
  };
36070
+ if (f === 61)
36071
+ return {
36072
+ ...state,
36073
+ settingsPicker: { ...sp, showSidebar: !sp.showSidebar, hint: void 0 }
36074
+ };
35629
36075
  if (f >= PANEL_POSITION_FIELD_START && f - PANEL_POSITION_FIELD_START < PANEL_IDS.length) {
35630
36076
  const PANEL_POSITION_CYCLE = ["bottom", "sidebar"];
35631
36077
  const panelId = PANEL_IDS[f - PANEL_POSITION_FIELD_START];
@@ -36392,6 +36838,14 @@ function useAppSessionState(options) {
36392
36838
  () => buildRestoredCheckpoints(options.restoredEvents),
36393
36839
  [options.restoredEvents]
36394
36840
  );
36841
+ const initialContextSnapshot = useMemo11(() => {
36842
+ const lastReq = options.agent?.ctx?.lastRequestTokens;
36843
+ const reqTokens = options.agent?.ctx?.tokenCounter?.currentRequestTokens?.();
36844
+ const sumReqTokens = (typeof reqTokens === "number" ? reqTokens : 0) + (typeof reqTokens?.input === "number" ? reqTokens.input : 0) + (typeof reqTokens?.cacheRead === "number" ? reqTokens.cacheRead : 0) + (typeof reqTokens?.cacheWrite === "number" ? reqTokens.cacheWrite : 0);
36845
+ const tokens = sumReqTokens > 0 ? sumReqTokens : typeof lastReq === "number" ? lastReq : 0;
36846
+ const maxContext = options.agent?.ctx?.provider?.capabilities?.maxContext ?? 0;
36847
+ return tokens > 0 ? { tokens, maxContext } : void 0;
36848
+ }, [options.agent?.ctx]);
36395
36849
  const [state, dispatch] = useReducer(
36396
36850
  reducer,
36397
36851
  createInitialState({
@@ -36408,6 +36862,7 @@ function useAppSessionState(options) {
36408
36862
  autonomyAgents: options.autonomyAgents,
36409
36863
  restoredEntries,
36410
36864
  restoredCheckpoints,
36865
+ initialContextSnapshot,
36411
36866
  enhanceEnabled: options.enhanceEnabled,
36412
36867
  initialAgentsMonitorOpen: options.initialAgentsMonitorOpen,
36413
36868
  initialFleetChat: options.initialFleetChat
@@ -42637,6 +43092,17 @@ function useProviderEventBridge({
42637
43092
  }
42638
43093
  });
42639
43094
  });
43095
+ const offModelSwitched = events.on("provider.model_switched", (e) => {
43096
+ const from = e.from ? `${e.from.providerId}/${e.from.model}` : "";
43097
+ const to = `${e.to.providerId}/${e.to.model}`;
43098
+ dispatch({
43099
+ type: "addEntry",
43100
+ entry: {
43101
+ kind: "info",
43102
+ text: from ? `\u{1F504} Model changed: ${from} \u2192 ${to}` : `\u{1F504} Model set to ${to}`
43103
+ }
43104
+ });
43105
+ });
42640
43106
  const offFallbackPending = events.on("provider.fallback_pending", (e) => {
42641
43107
  const eventSessionId = e.sessionId;
42642
43108
  if (typeof eventSessionId === "string" && eventSessionId !== agent.ctx.session.id) return;
@@ -42855,6 +43321,7 @@ function useProviderEventBridge({
42855
43321
  offRetry();
42856
43322
  offProvErr();
42857
43323
  offFallback();
43324
+ offModelSwitched();
42858
43325
  offFallbackPending();
42859
43326
  offProvResp();
42860
43327
  offConfirmNeeded();
@@ -43354,6 +43821,7 @@ function useSettingsAutoSave(state, saveSettings, dispatch) {
43354
43821
  breakerAutoKillResetMs: sp.breakerAutoKillResetMs,
43355
43822
  showModelReasoning: sp.showModelReasoning,
43356
43823
  showAgentSwarmPanel: sp.showAgentSwarmPanel,
43824
+ showSidebar: sp.showSidebar,
43357
43825
  panelPositions: sp.panelPositions,
43358
43826
  showSageMemoryInject: sp.showSageMemoryInject,
43359
43827
  sageMemoryInjectThreshold: sp.sageMemoryInjectThreshold,
@@ -43413,6 +43881,7 @@ function useSettingsAutoSave(state, saveSettings, dispatch) {
43413
43881
  state.settingsPicker.breakerAutoKillResetMs,
43414
43882
  state.settingsPicker.showModelReasoning,
43415
43883
  state.settingsPicker.showAgentSwarmPanel,
43884
+ state.settingsPicker.showSidebar,
43416
43885
  state.settingsPicker.panelPositions,
43417
43886
  state.settingsPicker.showSageMemoryInject,
43418
43887
  state.settingsPicker.sageMemoryInjectThreshold,
@@ -45625,6 +46094,51 @@ Available chords:
45625
46094
  official: true
45626
46095
  });
45627
46096
  }, [slashRegistry, openStatuslinePicker, setHiddenItems]);
46097
+ useEffect68(() => {
46098
+ if (!getSettings || !saveSettings) return;
46099
+ const applyLayoutPreset = async (statuslineMode, showSidebar) => {
46100
+ const patch = { statuslineMode, showSidebar };
46101
+ dispatch({ type: "settingsValueSet", patch });
46102
+ const cur = getSettings();
46103
+ if (cur) {
46104
+ try {
46105
+ const err = await saveSettings({ ...cur, ...patch });
46106
+ if (err) dispatch({ type: "settingsHint", text: err });
46107
+ } catch {
46108
+ dispatch({ type: "settingsHint", text: "Could not save settings." });
46109
+ }
46110
+ }
46111
+ return showSidebar ? `\u2713 Full layout: statusline detailed, sidebar on.` : `\u2713 Lite layout: statusline minimum, sidebar off.`;
46112
+ };
46113
+ const liteCmd = {
46114
+ name: "lite",
46115
+ description: "Minimal chrome: statusline density \u2192 minimum and the right sidebar hidden.",
46116
+ help: "Switch to the lite layout.\n\n statusline density \u2192 minimum (single rail)\n right sidebar \u2192 hidden (full-width history)\n\nReverse with /full.",
46117
+ async run() {
46118
+ return { message: await applyLayoutPreset("minimum", false) };
46119
+ }
46120
+ };
46121
+ const fullCmd = {
46122
+ name: "full",
46123
+ description: "Full chrome: statusline density \u2192 detailed and the right sidebar visible.",
46124
+ help: "Switch to the full layout.\n\n statusline density \u2192 detailed (multi-line bar)\n right sidebar \u2192 visible\n\nReverse with /lite.",
46125
+ async run() {
46126
+ return { message: await applyLayoutPreset("detailed", true) };
46127
+ }
46128
+ };
46129
+ const teardownLite = registerSlashCommandLifecycle(slashRegistry, liteCmd, {
46130
+ owner: "tui",
46131
+ official: true
46132
+ });
46133
+ const teardownFull = registerSlashCommandLifecycle(slashRegistry, fullCmd, {
46134
+ owner: "tui",
46135
+ official: true
46136
+ });
46137
+ return () => {
46138
+ teardownLite();
46139
+ teardownFull();
46140
+ };
46141
+ }, [slashRegistry, getSettings, saveSettings, dispatch]);
45628
46142
  useEffect68(() => {
45629
46143
  const cmd = {
45630
46144
  name: "mailbox",
@@ -65,6 +65,7 @@ export type SettingsPickerPatch = Partial<{
65
65
  breakerAutoKillResetMs: number;
66
66
  showModelReasoning: boolean;
67
67
  showAgentSwarmPanel: AgentSwarmPanelMode;
68
+ showSidebar: boolean;
68
69
  /**
69
70
  * Per-panel position map (one entry per F-key panel id). Each value is
70
71
  * 'bottom' (F-key behavior) or 'sidebar' (right-sidebar twin). Callers
@@ -72,8 +72,8 @@ export type PanelPosition = 'bottom' | 'sidebar';
72
72
  export declare const PANEL_IDS: readonly ["projectPicker", "fleet", "agents", "worktree", "plan", "todos", "queue", "processList", "goal", "sessions", "coordinator", "kanban", "connections"];
73
73
  export type PanelId = (typeof PANEL_IDS)[number];
74
74
  /** Total field count = legacy 46 + per-panel positions + the two
75
- * WrongProxy / WrongTrace fields (master switch + URL). Derived at
76
- * runtime from `PANEL_IDS.length` + 2 to keep the surface in sync. */
75
+ * WrongProxy / WrongTrace fields (master switch + URL) + showSidebar.
76
+ * Derived at runtime from `PANEL_IDS.length` + 3 to keep the surface in sync. */
77
77
  export declare const TOTAL_SETTINGS_FIELD_COUNT: number;
78
78
  /** Map of every tracked panel → its current placement. */
79
79
  export type PanelPositionMap = Readonly<Record<PanelId, PanelPosition>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/tui",
3
- "version": "0.313.0",
3
+ "version": "0.313.1",
4
4
  "license": "MIT",
5
5
  "description": "WrongStack terminal UI: Ink-based interactive renderer with history, pickers, and slash menus.",
6
6
  "repository": {
@@ -30,12 +30,12 @@
30
30
  "react": "^19.2.8",
31
31
  "string-width": "8.2.2",
32
32
  "wrap-ansi": "^10.0.1",
33
- "@wrongstack/sage": "0.313.0",
34
- "@wrongstack/core": "0.313.0",
35
- "@wrongstack/runtime": "0.313.0",
36
- "@wrongstack/tools": "0.313.0",
37
- "@wrongstack/kanban": "0.313.0",
38
- "@wrongstack/sdd": "0.313.0"
33
+ "@wrongstack/kanban": "0.313.1",
34
+ "@wrongstack/sage": "0.313.1",
35
+ "@wrongstack/core": "0.313.1",
36
+ "@wrongstack/runtime": "0.313.1",
37
+ "@wrongstack/tools": "0.313.1",
38
+ "@wrongstack/sdd": "0.313.1"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@testing-library/dom": "^10.4.1",