@wrongstack/tui 1.0.19 → 1.0.24

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 (91) hide show
  1. package/dist/app-action-type.d.ts +31 -0
  2. package/dist/app-key-handler.d.ts +1 -1
  3. package/dist/app-panel-state.d.ts +536 -0
  4. package/dist/app-props.d.ts +1 -1
  5. package/dist/app-state.d.ts +8 -534
  6. package/dist/app-status-region.d.ts +2 -1
  7. package/dist/app-ui-state.d.ts +2 -0
  8. package/dist/app-view-pickers.d.ts +2 -1
  9. package/dist/app-view-state.d.ts +2 -0
  10. package/dist/app.d.ts +2 -2
  11. package/dist/auth-panel-model.d.ts +1 -0
  12. package/dist/components/agent-monitor-presentation.d.ts +61 -0
  13. package/dist/components/agents-monitor.d.ts +3 -49
  14. package/dist/components/audit-panel.d.ts +2 -1
  15. package/dist/components/auth-panel.d.ts +3 -1
  16. package/dist/components/brain-panel.d.ts +3 -1
  17. package/dist/components/checkpoint-timeline.d.ts +1 -1
  18. package/dist/components/confirm-prompt.d.ts +6 -7
  19. package/dist/components/connections-panel.d.ts +2 -1
  20. package/dist/components/context-panel-sections.d.ts +53 -0
  21. package/dist/components/context-panel-types.d.ts +66 -0
  22. package/dist/components/context-panel.d.ts +2 -66
  23. package/dist/components/exit-confirm-panel.d.ts +2 -0
  24. package/dist/components/file-picker.d.ts +2 -1
  25. package/dist/components/help-panel.d.ts +5 -3
  26. package/dist/components/history/utils.d.ts +3 -9
  27. package/dist/components/history/visual-tool-output.d.ts +8 -0
  28. package/dist/components/input.d.ts +1 -1
  29. package/dist/components/kanban-panel-presentation.d.ts +114 -0
  30. package/dist/components/kanban-panel.d.ts +2 -47
  31. package/dist/components/mailbox-panel.d.ts +2 -1
  32. package/dist/components/mcp-picker.d.ts +3 -1
  33. package/dist/components/mode-picker.d.ts +3 -1
  34. package/dist/components/model-picker.d.ts +1 -1
  35. package/dist/components/monitor-shell.d.ts +14 -3
  36. package/dist/components/plugin-picker.d.ts +3 -1
  37. package/dist/components/powerline-rail.d.ts +6 -3
  38. package/dist/components/provider-colors.d.ts +2 -12
  39. package/dist/components/refine-countdown-panel.d.ts +4 -3
  40. package/dist/components/settings-picker-row-list.d.ts +2 -1
  41. package/dist/components/settings-picker.d.ts +3 -1
  42. package/dist/components/shadow-panel.d.ts +2 -1
  43. package/dist/components/sidebar-content.d.ts +1 -47
  44. package/dist/components/sidebar-ipc-icons.d.ts +9 -0
  45. package/dist/components/sidebar-presentation.d.ts +98 -0
  46. package/dist/components/sidebar.d.ts +3 -1
  47. package/dist/components/skill-picker.d.ts +2 -1
  48. package/dist/components/slash-confirm-panel.d.ts +2 -0
  49. package/dist/components/slash-menu.d.ts +2 -1
  50. package/dist/components/slash-modal-frame.d.ts +9 -0
  51. package/dist/components/statusline-picker.d.ts +2 -2
  52. package/dist/components/tools-picker.d.ts +3 -1
  53. package/dist/components/user-input-prompt.d.ts +4 -2
  54. package/dist/connection-actions.d.ts +20 -0
  55. package/dist/connections-health.d.ts +8 -1
  56. package/dist/esc-close-panels.d.ts +0 -1
  57. package/dist/f-key-panels.d.ts +4 -0
  58. package/dist/hooks/use-active-theme.d.ts +2 -1
  59. package/dist/hooks/use-app-panels-state.d.ts +1 -1
  60. package/dist/hooks/use-app-picker-keys.d.ts +2 -1
  61. package/dist/hooks/use-fleet-generation-gate.d.ts +4 -3
  62. package/dist/hooks/use-panel-controllers.d.ts +1 -1
  63. package/dist/hooks/use-picker-keys-types.d.ts +1 -0
  64. package/dist/hooks/use-shadow-panel.d.ts +1 -1
  65. package/dist/hooks/use-sidebar-panel-data.d.ts +7 -5
  66. package/dist/hooks/use-skill-mention-picker.d.ts +6 -0
  67. package/dist/hooks/use-statusbar-view-model.d.ts +2 -2
  68. package/dist/hooks/use-windowed-picker.d.ts +3 -4
  69. package/dist/index.js +9992 -7778
  70. package/dist/ink.d.ts +4 -4
  71. package/dist/input-graphemes.d.ts +4 -0
  72. package/dist/input-key-router.d.ts +2 -0
  73. package/dist/input-tokens.d.ts +10 -0
  74. package/dist/input-validation/action-types.d.ts +1 -1
  75. package/dist/input-validation-coordination.d.ts +9 -0
  76. package/dist/kanban-arguments.d.ts +48 -0
  77. package/dist/kanban-command-types.d.ts +53 -0
  78. package/dist/kanban-reports.d.ts +42 -0
  79. package/dist/kanban-slash.d.ts +4 -125
  80. package/dist/key-routes/key-route-overlay.d.ts +2 -2
  81. package/dist/on-panel-open.d.ts +1 -1
  82. package/dist/picker-text-input.d.ts +4 -0
  83. package/dist/reducers/composer.d.ts +1 -1
  84. package/dist/reducers/panel-pickers.d.ts +1 -1
  85. package/dist/reducers/workspace-panels.d.ts +1 -1
  86. package/dist/run-tui-options.d.ts +1 -1
  87. package/dist/statusline-palette.d.ts +4 -0
  88. package/dist/theme-utils.d.ts +1 -1
  89. package/dist/ui-contracts.d.ts +1 -0
  90. package/dist/use-app-controller.d.ts +157 -0
  91. package/package.json +7 -7
@@ -1,20 +1,17 @@
1
- import type { StatuslineDensities, StatuslineLines, StatuslineOrder } from '@wrongstack/core/statusline';
2
- import type { AutonomyStage, ContentBlock, DesignKitEntry, FleetChatVerbosity, SkillEntry, TokenSavingTier } from '@wrongstack/core/types';
1
+ import type { AutonomyStage, FleetChatVerbosity } from '@wrongstack/core/types';
3
2
  import type { SddBoardSnapshot } from '@wrongstack/sdd';
4
- import type { GoalSummary, QueueItem, ResumeSessionEntry, SlashCommandMatch } from './app-state-core-types.js';
3
+ import type { PanelState } from './app-panel-state.js';
4
+ import type { GoalSummary, QueueItem } from './app-state-core-types.js';
5
5
  import type { FleetEntry } from './app-state-fleet.js';
6
- import type { AuthPanelState } from './auth-panel-model.js';
7
- import type { BrainLogEntry, BrainRiskLevel } from './brain-contracts.js';
8
- import type { BrainPanelSettings } from './brain-panel-model.js';
9
6
  import type { HistoryEntry } from './history-entry.js';
10
7
  import type { TuiHistoryBudget } from './history-retention.js';
11
8
  import type { ResumeLoadState } from './resume-load.js';
12
- import type { AuditLevel, CacheTtl, CompactorStrategy, ContextMode, LogLevel, ReasoningEffort, SettingsMode, StatuslineMode, ToolResultViewMode } from './settings-contracts.js';
13
- import type { AutonomyOption, ChipMeta, HelpEntry, LiveSessionEntry, McpPickerItem, ModeOption, PanelPositionMap, PluginPickerItem, ProjectPickerItem, PromptPickEntry, ProviderOption, RefineFailureDecision, RefineFailureModel, ResourceMenuAction, ResourceMenuSnapshot, SendMode, ShadowState, StatuslineItem, SubagentLaneView, SubagentRoleView, ToolPickerItem, WorktreeRow } from './ui-contracts.js';
9
+ import type { ToolResultViewMode } from './settings-contracts.js';
10
+ import type { RefineFailureDecision, RefineFailureModel, ResourceMenuAction, ResourceMenuSnapshot, SubagentLaneView, SubagentRoleView, WorktreeRow } from './ui-contracts.js';
14
11
  export type { Settings } from './app-settings-type.js';
15
12
  export type { DraftEntry, GoalSummary, QueueItem, ResumeSessionEntry, SlashCommandMatch, } from './app-state-core-types.js';
16
13
  export type { FleetEntry } from './app-state-fleet.js';
17
- export type State = {
14
+ export type State = PanelState & {
18
15
  entries: HistoryEntry[];
19
16
  /**
20
17
  * True while the history archive is loading older entries from disk.
@@ -94,38 +91,11 @@ export type State = {
94
91
  * lands. Distinct from `interrupts` (which is the Ctrl+C exit ladder).
95
92
  */
96
93
  steeringPending: boolean;
97
- /**
98
- * Context snapshot captured at Esc time, replayed into the STEERING
99
- * preamble so the model sees exactly what it was mid-doing when the
100
- * user pulled the cord. Cleared together with `steeringPending`.
101
- * Without this the model has to guess from chat scrollback which
102
- * tools were live — and it can't see subagent state at all.
103
- */
104
- steerSnapshot: {
105
- runningTools: string[];
106
- subagents: Array<{
107
- label: string;
108
- status: string;
109
- tool?: string | undefined;
110
- }>;
111
- subagentsTerminated: number;
112
- partialAssistantText: string;
113
- } | null;
114
94
  hint: string;
115
95
  /** Transient clipboard confirmation; separate from competing hint producers. */
116
96
  copiedNotice: string;
117
97
  /** Card whose copy icon should flash; null means no highlighted card. */
118
98
  copiedEntryId: number | null;
119
- /**
120
- * Tool-result inspect overlay. Holds the clicked card's ids; the view
121
- * resolves the full (untruncated) payload from live history / stream.
122
- * Null when closed.
123
- */
124
- inspectOverlay: {
125
- entryId: number;
126
- entryIds?: readonly number[] | undefined;
127
- scroll: number;
128
- } | null;
129
99
  /**
130
100
  * Per-card tool-result density overrides, keyed by immutable history id.
131
101
  * These are presentation-only: the retained/canonical payload is untouched,
@@ -156,19 +126,6 @@ export type State = {
156
126
  }> | undefined;
157
127
  } | null;
158
128
  nextId: number;
159
- picker: {
160
- open: boolean;
161
- query: string;
162
- matches: string[];
163
- selected: number;
164
- };
165
- /** Slash command picker — open while typing a / command. */
166
- slashPicker: {
167
- open: boolean;
168
- query: string;
169
- matches: SlashCommandMatch[];
170
- selected: number;
171
- };
172
129
  /** Tool calls currently in-flight, by tool_use id. Surface in the status bar. */
173
130
  runningTools: Map<string, {
174
131
  name: string;
@@ -189,63 +146,6 @@ export type State = {
189
146
  * app-reducer.ts.
190
147
  */
191
148
  historyDraft: string;
192
- /** Two-step model picker (provider → model) — opened by `/model`. */
193
- modelPicker: {
194
- open: boolean;
195
- step: 'provider' | 'model';
196
- providerOptions: ProviderOption[];
197
- modelOptions: string[];
198
- /** Filtered list shown in step 2 (same as modelOptions when searchQuery is empty). */
199
- filteredOptions: string[];
200
- selected: number;
201
- pickedProviderId?: string | undefined;
202
- hint?: string | undefined;
203
- /** Live search filter in step 2. */
204
- searchQuery: string;
205
- /**
206
- * Reasoning effort chosen for the FOCUSED model with ←/→. `'default'`
207
- * (the sentinel every navigation resets to) means "leave the persisted
208
- * effort alone", which is what Enter did before the strip existed.
209
- */
210
- effort: string;
211
- /**
212
- * 'switch' — Enter switches the SESSION model (the /model command).
213
- * 'pick' — generic reusable selection: Enter just RETURNS the choice
214
- * to whoever called requestModelPick (Brain pool/voters/judge,
215
- * future callers); other panels stay open underneath.
216
- */
217
- purpose: 'switch' | 'pick';
218
- /** Overlay title override for 'pick' invocations. */
219
- title?: string | undefined;
220
- };
221
- /** Single-step autonomy mode picker — opened by `/autonomy`. */
222
- autonomyPicker: {
223
- open: boolean;
224
- options: AutonomyOption[];
225
- selected: number;
226
- hint?: string | undefined;
227
- };
228
- /** Single-step theme picker — opened by `/theme`. Lists every preset and
229
- * applies the chosen one instantly (in-place palette mutation + persist). */
230
- themePicker: {
231
- open: boolean;
232
- selected: number;
233
- hint?: string | undefined;
234
- };
235
- /** Agent mode picker — opened by `/mode`. Selects teach/brief/code-reviewer/etc. */
236
- modePicker: {
237
- open: boolean;
238
- modes: ModeOption[];
239
- selected: number;
240
- hint?: string | undefined;
241
- };
242
- /** Skill picker — lists discoverable skills and details the focused row. */
243
- skillPicker: {
244
- open: boolean;
245
- entries: SkillEntry[];
246
- selected: number;
247
- hint?: string | undefined;
248
- };
249
149
  /** Shared two-pane browser for operational resources such as profiles and memory. */
250
150
  resourceMenu: {
251
151
  open: boolean;
@@ -256,262 +156,6 @@ export type State = {
256
156
  hint?: string | undefined;
257
157
  pendingAction?: ResourceMenuAction | undefined;
258
158
  };
259
- /** Design Studio kit picker — opened by `/design`. */
260
- designPicker: {
261
- open: boolean;
262
- kits: DesignKitEntry[];
263
- selected: number;
264
- /** Target stack applied on selection. */
265
- stack: string;
266
- };
267
- /** Prompt library picker — opened by a bare `/prompt`. Browse + category filter + insert. */
268
- promptPicker: {
269
- open: boolean;
270
- all: PromptPickEntry[];
271
- /** ['all', '🕘 recent'?, '★ favorites'?, ...distinct categories]. */
272
- categories: string[];
273
- /** Recently-used slugs (most-recent first) backing the "🕘 recent" view. */
274
- recentSlugs: string[];
275
- catIndex: number;
276
- selected: number;
277
- };
278
- /** Session resume picker — opened by `/resume`. Lists recent sessions with metadata. */
279
- resumePicker: {
280
- open: boolean;
281
- sessions: ResumeSessionEntry[];
282
- selected: number;
283
- /** True while the resume operation is in flight (fetching + replaying). */
284
- busy: boolean;
285
- hint?: string | undefined;
286
- /** Error message if the resume operation failed. */
287
- error?: string | undefined;
288
- };
289
- /** Settings editor — opened by `/settings` or Ctrl+S. */
290
- settingsPicker: {
291
- open: boolean;
292
- /** Focused row index. */
293
- field: number;
294
- /**
295
- * Mirror of the persisted `Settings.lastSettingsField` — kept in the
296
- * runtime slice so the reducer can read it during `settingsOpen`
297
- * without re-loading the full Settings shape, and so the auto-save
298
- * effect (see app.tsx) can write it back when the user navigates.
299
- */
300
- lastSettingsField: number;
301
- mode: SettingsMode;
302
- delayMs: number;
303
- titleAnimation: boolean;
304
- yolo: boolean;
305
- fleetChat: FleetChatVerbosity;
306
- chime: boolean;
307
- confirmExit: boolean;
308
- nextPrediction: boolean;
309
- featureMcp: boolean;
310
- featurePlugins: boolean;
311
- featureMemory: boolean;
312
- featureSkills: boolean;
313
- featureModelsRegistry: boolean;
314
- tokenSavingTier: TokenSavingTier;
315
- allowOutsideProjectRoot: boolean;
316
- contextAutoCompact: boolean;
317
- contextStrategy: CompactorStrategy;
318
- contextMode: ContextMode;
319
- maxConcurrent: number;
320
- logLevel: LogLevel;
321
- auditLevel: AuditLevel;
322
- indexOnStart: boolean;
323
- /** Multi-file diff summary footer cutoff. 0 = off; positive = min file count. */
324
- multiDiffSummaryThreshold: number;
325
- maxIterations: number;
326
- /** Maximum auto-proceed iterations (0 = unlimited). */
327
- autoProceedMaxIterations: number;
328
- /** Prompt refinement preview countdown (ms). */
329
- enhanceDelayMs: number;
330
- /** Pre-refine grace period (seconds). 0 = skip countdown entirely. */
331
- preRefineSeconds: number;
332
- /** Master toggle for the prompt refiner (mirrors Settings.enhanceEnabled). */
333
- enhanceEnabled: boolean;
334
- /** Refined-prompt language preference (mirrors Settings.enhanceLanguage). */
335
- enhanceLanguage: 'original' | 'english';
336
- /** Raw SSE stream debugging toggle. */
337
- debugStream: boolean;
338
- /** Statusline density mode. */
339
- statuslineMode: StatuslineMode;
340
- /** Reasoning mode: auto | on | off. */
341
- reasoningMode: 'auto' | 'on' | 'off';
342
- /** Reasoning effort level. */
343
- reasoningEffort: ReasoningEffort;
344
- /**
345
- * Effort levels the ACTIVE model documents (models.dev reasoningConfig),
346
- * injected by the host at /settings-open time. Absent = vocabulary
347
- * undocumented; the effort cycle then covers the full canonical set.
348
- */
349
- reasoningEffortLevels?: string[] | undefined;
350
- /** Preserve thinking across turns. */
351
- reasoningPreserve: boolean;
352
- /** Single word shown in the TUI rainbow working-state chip. */
353
- thinkingWord: string;
354
- /** True while free-text editing the thinking word (Enter on its row). */
355
- thinkingWordEditing: boolean;
356
- /** In-progress text buffer while `thinkingWordEditing`. */
357
- thinkingWordDraft: string;
358
- /**
359
- * Show the "Model Reasoning" collapsible blocks in chat history.
360
- * Separate from thinkingWord (status-bar chip) and reasoningMode
361
- * (API-level provisioning). Default: true.
362
- */
363
- showModelReasoning: boolean;
364
- /** Global default for all committed tool-result cards. */
365
- toolResultViewMode: ToolResultViewMode;
366
- /** Agent swarm panel placement: 'bottom' (lower region), 'sidebar' (right sidebar), or 'off'. Default: 'bottom'. */
367
- showAgentSwarmPanel: import('./app-settings-type.js').AgentSwarmPanelMode;
368
- /** Right sidebar visibility (mirrors Settings.showSidebar). Default: true. */
369
- showSidebar: boolean;
370
- /**
371
- * Per-panel position map mirrored from the persisted Settings shape.
372
- * Each F-key panel can be set to 'bottom' (F-key behavior, the default)
373
- * or 'sidebar' (rendered in the right sidebar). When a panel is set to
374
- * 'sidebar' AND its F-key toggle is on, the bottom view hides and the
375
- * sidebar shows the panel twin instead. When the F-key is off, neither
376
- * surface shows the panel.
377
- */
378
- panelPositions: PanelPositionMap;
379
- /** Show SAGE Memory Inject blocks in tool results. Default: false (hidden). */
380
- showSageMemoryInject: boolean;
381
- /** Minimum relation strength for SAGE memory injection. Default: 0.85. */
382
- sageMemoryInjectThreshold: number;
383
- /** Register the leader's agent-callable `nextsteps` tool. Default: false. */
384
- nextStepsTool: boolean;
385
- /** When true, read tool includes codebase-index symbols alongside file content. */
386
- readSymbols: boolean;
387
- /** Prompt cache TTL. */
388
- cacheTtl: CacheTtl;
389
- /** Where to persist settings: 'global' or 'project'. */
390
- configScope: 'global' | 'project';
391
- /**
392
- * Animation style for the working/thinking chip in the status bar. One
393
- * of the styles exported by `components/animation-style.tsx`, plus the
394
- * meta-mode `'cycle'` that rotates through the variant styles every
395
- * `CYCLE_INTERVAL_SECONDS`. Persisted on every ←/→ change in `/settings`.
396
- */
397
- animationStyle: 'rainbow' | 'wave' | 'pulse' | 'dots' | 'breathe' | 'static' | 'cycle';
398
- /**
399
- * WrongProxy / WrongTrace: master switch. When true AND the daemon at
400
- * `wrongProxyUrl` is reachable, every provider's base URL is rewritten
401
- * through `${wrongProxyUrl}/proxy/<host><path>`. openai-codex is
402
- * excluded by spec. Mirrors `Settings.wrongProxyEnabled` and the
403
- * `tools.wrongProxy.enabled` config key. Picker field 59.
404
- */
405
- wrongProxyEnabled: boolean;
406
- /**
407
- * WrongProxy / WrongTrace URL. Default `http://localhost:3444`. The
408
- * CLI's periodic probe targets `<wrongProxyUrl>/api/health`; a 2xx
409
- * response flips the runtime's `active` flag. Picker field 60.
410
- */
411
- wrongProxyUrl: string;
412
- /** True while free-text editing the WrongProxy URL (Enter on its row). */
413
- wrongProxyUrlEditing: boolean;
414
- /** In-progress text buffer while `wrongProxyUrlEditing`. */
415
- wrongProxyUrlDraft: string;
416
- /** Whether the process circuit breaker gates bash/exec. */
417
- breakerEnabled: boolean;
418
- /** Auto kill/reset delay (ms) when the breaker trips. 0 = manual recovery. */
419
- breakerAutoKillResetMs: number;
420
- /**
421
- * Live filter for the row-search modal (entered via `/`). Empty
422
- * string means filter is inactive. Non-empty means the user is
423
- * typing a search query and only matching rows are visible.
424
- * Cleared on picker close and on Esc-out-of-filter.
425
- */
426
- filter: string;
427
- hint?: string | undefined;
428
- };
429
- /** Statusline editor — opened by `/statusline`. */
430
- statuslinePicker: {
431
- open: boolean;
432
- /** Focused field index. */
433
- field: number;
434
- /** Current hidden-items list (user-toggled off chips). */
435
- hiddenItems: StatuslineItem[];
436
- /**
437
- * Chips that are temporarily visible due to data/events, with expiration
438
- * metadata. When a chip expires it is removed from this list. User-toggled
439
- * chips stay visible via their data being truthy — they are NOT here.
440
- */
441
- visibleChips: ChipMeta[];
442
- /** Per-chip line assignment being edited (mirrors statusline.json v3). */
443
- lines: StatuslineLines;
444
- /** Per-chip density pin being edited. */
445
- densities: StatuslineDensities;
446
- /** Custom left-to-right chip order being edited. */
447
- order: StatuslineOrder;
448
- /** Text filter over chip names/descriptions. */
449
- filter: string;
450
- /** True while `/` is capturing filter keystrokes. */
451
- filtering: boolean;
452
- /**
453
- * True once the editor holds the live layout (seeded on open, or made
454
- * true by any layout edit). The app only mirrors the editor's layout
455
- * back into the live statusline while this is set, so a caller that
456
- * opens the picker WITHOUT seeding it can never publish an empty layout
457
- * over the user's saved one.
458
- */
459
- layoutSeeded: boolean;
460
- hint?: string | undefined;
461
- };
462
- /** Plugin toggle editor — opened by `/plugin menu` or `/settings plugins`. */
463
- pluginPicker: {
464
- open: boolean;
465
- items: PluginPickerItem[];
466
- selected: number;
467
- busy: boolean;
468
- hint?: string | undefined;
469
- };
470
- /** MCP server picker — opened by `/mcp`. */
471
- mcpPicker: {
472
- open: boolean;
473
- items: McpPickerItem[];
474
- selected: number;
475
- busy: boolean;
476
- hint?: string | undefined;
477
- };
478
- /** Tool picker — opened by `/tools`. */
479
- toolsPicker: {
480
- open: boolean;
481
- items: ToolPickerItem[];
482
- selected: number;
483
- busy: boolean;
484
- hint?: string | undefined;
485
- filter?: string | undefined;
486
- };
487
- /** Brain panel — opened by `/brain`. */
488
- brainPanel: {
489
- open: boolean;
490
- riskLevel: BrainRiskLevel;
491
- log: BrainLogEntry[];
492
- selected: number;
493
- hint?: string | undefined;
494
- /** Settings-editor state (only meaningful when a BrainPanelHost is wired). */
495
- view: 'settings' | 'log';
496
- settings?: BrainPanelSettings | undefined;
497
- /** Settings-view row cursor. */
498
- row: number;
499
- busy: boolean;
500
- };
501
- /** Help panel — opened by `/help`. */
502
- helpPanel: {
503
- open: boolean;
504
- entries: HelpEntry[];
505
- selected: number;
506
- filter: string;
507
- hint?: string | undefined;
508
- };
509
- /** Shadow Agent panel — opened by `/shadow`. */
510
- shadowPanel: {
511
- open: boolean;
512
- shadow: ShadowState;
513
- hint?: string | undefined;
514
- };
515
159
  /**
516
160
  * Per-session subagent model lanes — opened by `/subagent-models`. Rows are
517
161
  * pre-rendered view strings: the hook owns the mapping from the core plan so
@@ -529,37 +173,6 @@ export type State = {
529
173
  sessionTarget: string;
530
174
  hint?: string | undefined;
531
175
  };
532
- /** Interactive API-key / OAuth manager — opened by `/auth`. */
533
- authPanel: AuthPanelState;
534
- /** Project switcher panel — opened by F1 or `/project`. */
535
- projectPicker: {
536
- open: boolean;
537
- /** Original unfiltered items. Never mutated after open. */
538
- allItems: ProjectPickerItem[];
539
- /** Currently displayed items (filtered from allItems). Navigation targets this list. */
540
- items: ProjectPickerItem[];
541
- selected: number;
542
- filter: string;
543
- hint?: string | undefined;
544
- };
545
- /** F-key panel picker — opened by `/f`. Keyboard-navigable list of F1–F12 panels. */
546
- fKeyPicker: {
547
- open: boolean;
548
- selected: number;
549
- };
550
- /** Pending tool confirmations — queue to handle multiple tools requesting confirmation. */
551
- confirmQueue: {
552
- toolUseId: string;
553
- toolName: string;
554
- input: unknown;
555
- suggestedPattern: string;
556
- resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;
557
- /** True when the call was classified destructive. */
558
- destructive: boolean;
559
- boundaryReason?: string | undefined;
560
- /** Real write destinations from `Tool.writeTargets`, when declared (VULN-001 Phase 2). */
561
- writeTargets?: string[] | undefined;
562
- }[];
563
176
  /**
564
177
  * Active warning for the `!<command>` shell shortcut. It resolves before
565
178
  * dispatching to `/dev`, so the existing /dev runner stays the single shell
@@ -593,8 +206,8 @@ export type State = {
593
206
  * Active pre-refine grace countdown. Set after the user submits a prompt
594
207
  * that passes the refiner gate but BEFORE the refiner LLM call starts.
595
208
  * The user sees a "refining in Ns…" panel and can send as-is (any key),
596
- * cancel back to the composer (Esc), or let the timer expire to proceed
597
- * into normal refinement. Resolves to proceed / skip / cancel. Null when
209
+ * cancel back to the composer with the draft restored (Esc or Backspace),
210
+ * or let the timer expire to proceed into normal refinement. Resolves to proceed / skip / cancel. Null when
598
211
  * no countdown is active.
599
212
  */
600
213
  refineCountdown: {
@@ -626,26 +239,6 @@ export type State = {
626
239
  models: RefineFailureModel[];
627
240
  resolve: (decision: RefineFailureDecision) => void;
628
241
  } | null;
629
- /**
630
- * Active bare-"continue" confirmation panel. Set when the user typed a lone
631
- * "continue"/"devam"/"go on" and the runtime resolved it to a concrete next
632
- * step. Makes the resolution — and its drift risk — visible before it is
633
- * sent: a grounded resolution (todo / suggestion) auto-proceeds after a
634
- * short countdown; an `open` resolution (no queued task, model will pick the
635
- * step itself) requires an explicit keypress. Resolves to
636
- * proceed / edit / cancel and `submit()` continues. Null when none pending.
637
- */
638
- continueConfirm: {
639
- /** One-line summary shown in the panel header (e.g. "▶ Continue → todo: …"). */
640
- label: string;
641
- /** The full instruction that will be injected in place of "continue". */
642
- instruction: string;
643
- /** Where the resolution came from — drives copy + risk styling. */
644
- source: 'todo' | 'suggestion' | 'open';
645
- /** True for todo/suggestion (low drift); false for the `open` guess. */
646
- grounded: boolean;
647
- resolve: (decision: 'proceed' | 'edit' | 'cancel') => void;
648
- } | null;
649
242
  /** TUI-only follow-up gate shown after each completed `/bughunt` round. */
650
243
  bugHuntContinue: {
651
244
  completedRounds: number;
@@ -657,81 +250,6 @@ export type State = {
657
250
  currentRound: number;
658
251
  totalRounds?: number | undefined;
659
252
  } | null;
660
- /**
661
- * Pending destructive `/clear` confirmation. Unlike ordinary yes/no
662
- * prompts this requires the user to type the full uppercase word `YES`.
663
- */
664
- clearConfirm: {
665
- leaderActive: boolean;
666
- subagentCount: number;
667
- value: string;
668
- resolve: (decision: boolean) => void;
669
- } | null;
670
- /**
671
- * Pending `/exit` confirmation. Mirrors the `/clear` invariant: while a
672
- * leader run or any subagent is in flight, `/exit` must not terminate the
673
- * TUI silently. The panel asks for an Enter/Esc acknowledgement so the
674
- * user can decide to abort the in-flight work first. When nothing is
675
- * running, `/exit` resolves true without ever opening this panel.
676
- */
677
- exitConfirm: {
678
- leaderActive: boolean;
679
- subagentCount: number;
680
- backgroundCount?: number | undefined;
681
- resolve: (decision: boolean) => void;
682
- } | null;
683
- /** Generic slash-command confirmation rendered inside the TUI. */
684
- slashConfirm: {
685
- question: string;
686
- defaultYes: boolean;
687
- resolve: (decision: boolean | null) => void;
688
- } | null;
689
- /**
690
- * Pending ESC-interrupt confirmation. Null when none is pending.
691
- * When `confirmExit` is enabled and Esc is pressed mid-iteration, the
692
- * snapshot is captured and `escConfirm` opens instead of immediately
693
- * aborting. The prompt shows "Abort work and redirect?"
694
- * (or similar) and waits for y/n/Esc.
695
- */
696
- escConfirm: {
697
- snapshot: NonNullable<State['steerSnapshot']>;
698
- } | null;
699
- /**
700
- * Fallback model overlay — shown when `provider.fallback_pending` fires.
701
- * The overlay displays a countdown and the candidate model list, letting
702
- * the user manually pick a model or wait for auto-switch. Null when no
703
- * fallback gate is pending.
704
- */
705
- fallbackOverlay: {
706
- requestId: string;
707
- from: {
708
- providerId: string;
709
- model: string;
710
- };
711
- status: number;
712
- candidates: Array<{
713
- providerId: string;
714
- model: string;
715
- }>;
716
- autoSwitchSeconds: number;
717
- selected: number;
718
- } | null;
719
- /**
720
- * Mid-run send-mode picker. Set when the user submits a plain message while
721
- * the agent is busy and `midRunSendPicker` is enabled — the picker asks how
722
- * to deliver the text (queue / by-the-way / steer). The `resolve` callback
723
- * is awaited inside `submit()` (same Promise pattern as `enhance`); on
724
- * `'cancel'` (Esc) the caller restores the draft to the composer instead
725
- * of sending — nothing is queued. Null when no picker is pending.
726
- */
727
- sendModePicker: {
728
- selected: number;
729
- text: string;
730
- displayText: string;
731
- blocks: ContentBlock[];
732
- pasteContent?: string | undefined;
733
- resolve: (decision: SendMode | 'cancel') => void;
734
- } | null;
735
253
  /** Incremented on /clear so the context chip re-reads from agent.ctx tokens. */
736
254
  contextChipVersion: number;
737
255
  /** Live fleet state: per-subagent entries from FleetBus events. Keyed by subagentId. */
@@ -793,48 +311,14 @@ export type State = {
793
311
  helpOpen: boolean;
794
312
  /** When true, the todos monitor overlay is shown (F6). */
795
313
  todosMonitorOpen: boolean;
796
- /** When true, the queue panel is shown (F7). */
797
- queuePanelOpen: boolean;
798
314
  /** When true, the process list overlay is shown (F8). */
799
315
  processListOpen: boolean;
800
316
  /** When true, the cron jobs monitor is shown. */
801
317
  cronMonitorOpen: boolean;
802
- /** When true, the audit (side effects) overlay is shown (/audit). */
803
- auditPanelOpen: boolean;
804
- /** When true, the plan panel is shown (F5). */
805
- planPanelOpen: boolean;
806
- /** When true, the project kanban panel is shown. */
807
- kanbanPanelOpen: boolean;
808
- /** When true, the goal panel is shown (F9). */
809
- goalPanelOpen: boolean;
810
- goalKanbanPanelOpen: boolean;
811
- /** When true, the interactive context monitor is shown (`/context`). */
812
- contextPanelOpen: boolean;
813
- /** When true, the interactive service connections health panel is shown (`/connections`). */
814
- connectionsPanelOpen: boolean;
815
- /** When true, the sessions panel is shown (F10). */
816
- sessionsPanelOpen: boolean;
817
318
  /** When true, keyboard focus is on the right sidebar (↑↓ scrolls sidebar content). */
818
319
  sidebarFocused: boolean;
819
320
  /** Vertical scroll offset for the sidebar content (in rows). */
820
321
  sidebarScrollOffset: number;
821
- /** Live session data for the sessions panel (F10). */
822
- sessionsPanel: {
823
- sessions: LiveSessionEntry[];
824
- busy: boolean;
825
- /** Selected index for arrow-key navigation. -1 when nothing selected. */
826
- selected: number;
827
- };
828
- /**
829
- * Pending session resume confirmation. When set, the F10 panel shows a
830
- * "Press Enter to confirm resume, Esc to cancel" prompt. Set by the first
831
- * Enter on a same-project session; the second Enter triggers the actual
832
- * onResumeSession call.
833
- */
834
- sessionResumeConfirm: {
835
- sessionId: string;
836
- sessionName: string;
837
- } | null;
838
322
  /**
839
323
  * Active or completed collaborative debugging session state.
840
324
  * Null when no collab session has run. Tracks counts + the event timeline
@@ -865,16 +349,6 @@ export type State = {
865
349
  ts: string;
866
350
  fileCount: number;
867
351
  }>;
868
- /** Checkpoint timeline overlay — null when closed. */
869
- rewindOverlay: {
870
- checkpoints: Array<{
871
- promptIndex: number;
872
- promptPreview: string;
873
- ts: string;
874
- fileCount: number;
875
- }>;
876
- selected: number;
877
- } | null;
878
352
  /** Live iteration-stage of the active autonomy engine. */
879
353
  eternalStage: AutonomyStage | null;
880
354
  /** Loaded from .wrongstack/goal.json on mount for startup banner. */
@@ -2,8 +2,9 @@ import type React from 'react';
2
2
  import type { AppViewProps } from './app-view-contract.js';
3
3
  export { resolveAgentSwarmPanelVisibility } from './app-ui-state.js';
4
4
  interface AppStatusRegionProps extends AppViewProps {
5
+ panelsSuppressed?: boolean | undefined;
5
6
  /** Optional column width cap for the status bar (when beside a sidebar). */
6
7
  mainColumnWidth?: number | undefined;
7
8
  }
8
- export declare function AppStatusRegion({ host, runtime, mainColumnWidth, }: AppStatusRegionProps): React.ReactElement;
9
+ export declare function AppStatusRegion({ host, runtime, mainColumnWidth, panelsSuppressed, }: AppStatusRegionProps): React.ReactElement;
9
10
  //# sourceMappingURL=app-status-region.d.ts.map
@@ -2,6 +2,8 @@ import type { State } from './app-reducer.js';
2
2
  import type { AgentSwarmPanelMode, Settings } from './app-settings-type.js';
3
3
  import type { StatuslineItem } from './components/statusline-picker.js';
4
4
  import { type PanelId, type PanelPositionMap } from './ui-contracts.js';
5
+ /** Interactive bottom panels own keys; sidebar twins leave the composer available. */
6
+ export declare function bottomPanelOwnsInput(state: State, positions: PanelPositionMap): boolean;
5
7
  export declare function mergeStatuslineHiddenItems(hookHidden: StatuslineItem[], reducerHidden: StatuslineItem[]): StatuslineItem[];
6
8
  /**
7
9
  * True when any of the legacy picker overlays is open. Note: panel flags
@@ -6,9 +6,10 @@ interface AppViewPickersProps {
6
6
  runtime: AppViewProps['runtime'];
7
7
  mainColumnWidth: number;
8
8
  pickerMaxRows: number;
9
+ pickerInputEnabled?: boolean | undefined;
9
10
  routedToSidebar: (id: PanelId) => boolean;
10
11
  panelPositions: Record<PanelId, 'bottom' | 'sidebar'>;
11
12
  }
12
- export declare function AppViewPickers({ host, runtime, mainColumnWidth, pickerMaxRows, routedToSidebar, panelPositions, }: AppViewPickersProps): React.ReactElement;
13
+ export declare function AppViewPickers({ host, runtime, mainColumnWidth, pickerMaxRows, pickerInputEnabled, routedToSidebar, panelPositions, }: AppViewPickersProps): React.ReactElement;
13
14
  export {};
14
15
  //# sourceMappingURL=app-view-pickers.d.ts.map
@@ -23,6 +23,8 @@ export declare function deriveAppViewState(options: AppViewStateOptions): {
23
23
  inputHeight: number;
24
24
  hideInput: boolean;
25
25
  lowerFunctionPanelOpen: boolean;
26
+ functionPanel: number | null;
27
+ panelOwnsInput: boolean;
26
28
  };
27
29
  export {};
28
30
  //# sourceMappingURL=app-view-state.d.ts.map