@wrongstack/tui 1.0.19 → 1.0.26

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 (159) hide show
  1. package/dist/app-action-type.d.ts +85 -1
  2. package/dist/app-key-handler.d.ts +1 -1
  3. package/dist/app-panel-state.d.ts +561 -0
  4. package/dist/app-props.d.ts +21 -1
  5. package/dist/app-reducer.d.ts +1 -1
  6. package/dist/app-state-core-types.d.ts +13 -0
  7. package/dist/app-state.d.ts +8 -534
  8. package/dist/app-status-region.d.ts +2 -1
  9. package/dist/app-ui-state.d.ts +2 -0
  10. package/dist/app-view-contract.d.ts +1 -1
  11. package/dist/app-view-pickers.d.ts +2 -1
  12. package/dist/app-view-state.d.ts +2 -0
  13. package/dist/app.d.ts +2 -2
  14. package/dist/auth-panel-model.d.ts +1 -0
  15. package/dist/background-strip-model.d.ts +65 -0
  16. package/dist/brain-panel-model.d.ts +7 -7
  17. package/dist/chat-search-slash.d.ts +15 -0
  18. package/dist/clipboard.d.ts +14 -1
  19. package/dist/components/agent-monitor-presentation.d.ts +61 -0
  20. package/dist/components/agents-monitor.d.ts +3 -49
  21. package/dist/components/audit-panel.d.ts +2 -1
  22. package/dist/components/auth-panel.d.ts +3 -1
  23. package/dist/components/background-strip.d.ts +20 -0
  24. package/dist/components/brain-panel.d.ts +3 -1
  25. package/dist/components/chat-search-bar.d.ts +19 -0
  26. package/dist/components/checkpoint-timeline.d.ts +7 -3
  27. package/dist/components/confirm-prompt.d.ts +6 -7
  28. package/dist/components/connections-panel.d.ts +2 -1
  29. package/dist/components/context-panel-sections.d.ts +53 -0
  30. package/dist/components/context-panel-types.d.ts +66 -0
  31. package/dist/components/context-panel.d.ts +2 -66
  32. package/dist/components/exit-confirm-panel.d.ts +2 -0
  33. package/dist/components/file-picker.d.ts +2 -1
  34. package/dist/components/help-panel.d.ts +5 -3
  35. package/dist/components/history/code-block.d.ts +2 -136
  36. package/dist/components/history/diff-model.d.ts +143 -0
  37. package/dist/components/history/scroll-controller-types.d.ts +11 -0
  38. package/dist/components/history/scrollbar-rail.d.ts +14 -2
  39. package/dist/components/history/use-history-controller.d.ts +5 -0
  40. package/dist/components/history/utils.d.ts +3 -9
  41. package/dist/components/history/visual-tool-output.d.ts +8 -0
  42. package/dist/components/input.d.ts +1 -1
  43. package/dist/components/kanban-panel-presentation.d.ts +114 -0
  44. package/dist/components/kanban-panel.d.ts +2 -47
  45. package/dist/components/mailbox-panel.d.ts +2 -1
  46. package/dist/components/mcp-picker.d.ts +3 -1
  47. package/dist/components/mode-picker.d.ts +3 -1
  48. package/dist/components/model-picker.d.ts +1 -1
  49. package/dist/components/monitor-shell.d.ts +19 -4
  50. package/dist/components/phase-monitor.d.ts +3 -1
  51. package/dist/components/plugin-picker.d.ts +3 -1
  52. package/dist/components/powerline-rail.d.ts +6 -3
  53. package/dist/components/prompt-picker-model.d.ts +16 -0
  54. package/dist/components/prompt-picker.d.ts +2 -16
  55. package/dist/components/provider-colors.d.ts +2 -12
  56. package/dist/components/refine-countdown-panel.d.ts +4 -3
  57. package/dist/components/resource-menu-model.d.ts +3 -0
  58. package/dist/components/resource-menu.d.ts +3 -3
  59. package/dist/components/scrollable-history.d.ts +1 -1
  60. package/dist/components/send-mode-model.d.ts +44 -0
  61. package/dist/components/send-mode-picker.d.ts +2 -43
  62. package/dist/components/settings-picker-row-list.d.ts +2 -1
  63. package/dist/components/settings-picker.d.ts +3 -1
  64. package/dist/components/shadow-panel.d.ts +2 -1
  65. package/dist/components/sidebar-content.d.ts +1 -47
  66. package/dist/components/sidebar-ipc-icons.d.ts +9 -0
  67. package/dist/components/sidebar-panel-agents.d.ts +10 -0
  68. package/dist/components/sidebar-panel-connections.d.ts +11 -0
  69. package/dist/components/sidebar-panel-coordinator.d.ts +11 -0
  70. package/dist/components/sidebar-panel-fleet.d.ts +16 -0
  71. package/dist/components/sidebar-panel-project.d.ts +12 -0
  72. package/dist/components/sidebar-panel-worktree.d.ts +10 -0
  73. package/dist/components/sidebar-panel-wrong-proxy.d.ts +25 -0
  74. package/dist/components/sidebar-panels-workspace.d.ts +10 -79
  75. package/dist/components/sidebar-presentation.d.ts +98 -0
  76. package/dist/components/sidebar.d.ts +3 -1
  77. package/dist/components/skill-picker.d.ts +2 -1
  78. package/dist/components/slash-confirm-panel.d.ts +2 -0
  79. package/dist/components/slash-menu.d.ts +2 -1
  80. package/dist/components/slash-modal-frame.d.ts +9 -0
  81. package/dist/components/status-bar-rails-async.d.ts +2 -2
  82. package/dist/components/status-bar-types.d.ts +6 -0
  83. package/dist/components/status-bar.d.ts +1 -1
  84. package/dist/components/statusline-picker-model.d.ts +45 -0
  85. package/dist/components/statusline-picker.d.ts +2 -41
  86. package/dist/components/tools-picker.d.ts +3 -1
  87. package/dist/components/user-input-prompt.d.ts +4 -2
  88. package/dist/connection-actions.d.ts +20 -0
  89. package/dist/connections-health.d.ts +8 -1
  90. package/dist/esc-close-panels.d.ts +0 -1
  91. package/dist/f-key-panels.d.ts +4 -0
  92. package/dist/hooks/fork-at-checkpoint.d.ts +25 -0
  93. package/dist/hooks/use-active-theme.d.ts +2 -1
  94. package/dist/hooks/use-app-execution-pipeline.d.ts +1 -1
  95. package/dist/hooks/use-app-panels-state.d.ts +1 -1
  96. package/dist/hooks/use-app-picker-keys.d.ts +5 -2
  97. package/dist/hooks/use-chip-staleness-guard.d.ts +6 -0
  98. package/dist/hooks/use-core-tui-commands.d.ts +7 -2
  99. package/dist/hooks/use-file-search.d.ts +10 -0
  100. package/dist/hooks/use-fleet-generation-gate.d.ts +4 -3
  101. package/dist/hooks/use-panel-controllers.d.ts +1 -1
  102. package/dist/hooks/use-picker-keys-brain-statusline.d.ts +4 -0
  103. package/dist/hooks/use-picker-keys-types.d.ts +1 -0
  104. package/dist/hooks/use-provider-warmup.d.ts +9 -0
  105. package/dist/hooks/use-queue-manager.d.ts +11 -1
  106. package/dist/hooks/use-session-rewind.d.ts +8 -1
  107. package/dist/hooks/use-shadow-panel.d.ts +1 -1
  108. package/dist/hooks/use-sidebar-panel-data.d.ts +7 -5
  109. package/dist/hooks/use-skill-mention-picker.d.ts +6 -0
  110. package/dist/hooks/use-slash-picker.d.ts +1 -1
  111. package/dist/hooks/use-stable-key-handler.d.ts +8 -1
  112. package/dist/hooks/use-status-sync-interval.d.ts +3 -2
  113. package/dist/hooks/use-statusbar-view-model.d.ts +2 -2
  114. package/dist/hooks/use-tui-environment-state.d.ts +3 -0
  115. package/dist/hooks/use-tui-event-bridge.d.ts +12 -0
  116. package/dist/hooks/use-windowed-picker.d.ts +3 -4
  117. package/dist/index.js +29522 -25452
  118. package/dist/ink.d.ts +5 -5
  119. package/dist/input-graphemes.d.ts +4 -0
  120. package/dist/input-key-router.d.ts +2 -0
  121. package/dist/input-tokens.d.ts +10 -0
  122. package/dist/input-validation/action-types.d.ts +1 -1
  123. package/dist/input-validation/limits.d.ts +2 -0
  124. package/dist/input-validation-coordination.d.ts +9 -0
  125. package/dist/input-validation-display.d.ts +9 -0
  126. package/dist/input-validation.d.ts +0 -52
  127. package/dist/kanban-arguments.d.ts +48 -0
  128. package/dist/kanban-command-types.d.ts +53 -0
  129. package/dist/kanban-reports.d.ts +42 -0
  130. package/dist/kanban-slash.d.ts +4 -125
  131. package/dist/key-routes/key-route-background-strip.d.ts +14 -0
  132. package/dist/key-routes/key-route-chat-search.d.ts +24 -0
  133. package/dist/key-routes/key-route-overlay.d.ts +2 -2
  134. package/dist/layout-store.d.ts +2 -2
  135. package/dist/memory-slash-render.d.ts +1 -1
  136. package/dist/message-checkpoint.d.ts +19 -0
  137. package/dist/motion.d.ts +16 -0
  138. package/dist/on-panel-open.d.ts +1 -1
  139. package/dist/picker-text-input.d.ts +4 -0
  140. package/dist/reducers/chat-search.d.ts +11 -0
  141. package/dist/reducers/composer-action-types.d.ts +6 -0
  142. package/dist/reducers/composer-pickers.d.ts +4 -0
  143. package/dist/reducers/composer.d.ts +1 -5
  144. package/dist/reducers/message-jump.d.ts +16 -0
  145. package/dist/reducers/panel-pickers.d.ts +1 -1
  146. package/dist/reducers/workspace-panels.d.ts +1 -1
  147. package/dist/resume-session-tree.d.ts +8 -0
  148. package/dist/rewind-prompt.d.ts +24 -0
  149. package/dist/run-tui-options.d.ts +24 -5
  150. package/dist/scroll-anchor.d.ts +6 -0
  151. package/dist/statusline-palette.d.ts +4 -0
  152. package/dist/submit-controller.d.ts +1 -1
  153. package/dist/submit-slash-command.d.ts +67 -0
  154. package/dist/theme-utils.d.ts +1 -1
  155. package/dist/transcript-search.d.ts +38 -0
  156. package/dist/ui-contracts.d.ts +2 -1
  157. package/dist/use-app-controller.d.ts +157 -0
  158. package/dist/use-controller-key-pipeline.d.ts +217 -0
  159. package/package.json +7 -7
@@ -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
package/dist/app.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type React from 'react';
2
+ import type { AppProps } from './app-props.js';
2
3
  export { buildGoalPreamble } from '@wrongstack/core/execution';
3
4
  export type { AppProps } from './app-props.js';
4
5
  export { type Action, type FleetEntry, type QueueItem, type ResumeSessionEntry, reducer, type Settings, type SlashCommandMatch, type State, } from './app-reducer.js';
@@ -6,6 +7,5 @@ export { nextInputWordStart, previousInputWordStart } from './input-editing.js';
6
7
  export { renderRunningTools } from './running-tools.js';
7
8
  export { selectedSlashCommandLine } from './slash-command-search.js';
8
9
  export { buildSteeringPreamble } from './steering-preamble.js';
9
- import type { AppProps } from './app-props.js';
10
- export declare function App(props: AppProps): React.ReactElement;
10
+ export declare function App(props0: AppProps): React.ReactElement;
11
11
  //# sourceMappingURL=app.d.ts.map
@@ -172,6 +172,7 @@ export interface AuthPanelHost {
172
172
  addLocal(presetId: string, io: AuthFlowIo, opts?: {
173
173
  baseUrl?: string;
174
174
  apiKey?: string;
175
+ alias?: string;
175
176
  }): Promise<AuthFlowResult>;
176
177
  oauthLogin(kind: AuthOAuthKind, io: AuthFlowIo): Promise<AuthFlowResult>;
177
178
  /**
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The background strip above the composer: every running subagent and every
3
+ * background shell, as one row of chips. Alt+B focuses it; ←/→ pick a chip,
4
+ * Enter shows or hides the last lines of its output, `x` stops a shell (after
5
+ * a `y`), Esc leaves.
6
+ *
7
+ * This file is the pure part (items, layout, peek lines) and the strip's own
8
+ * little store. The store lives outside the app reducer on purpose: the strip
9
+ * state is view-only and short-lived, and the key route and the component are
10
+ * its only readers.
11
+ */
12
+ import type { FleetEntry } from './app-state-fleet.js';
13
+ export interface BackgroundItem {
14
+ /** `agent:<id>` or `shell:<pid>`. */
15
+ id: string;
16
+ kind: 'agent' | 'shell';
17
+ label: string;
18
+ startedAt: number;
19
+ agentId?: string | undefined;
20
+ pid?: number | undefined;
21
+ logFile?: string | undefined;
22
+ }
23
+ export interface BackgroundProcessLike {
24
+ pid: number;
25
+ command: string;
26
+ startedAt: number;
27
+ background: boolean;
28
+ killed: boolean;
29
+ logFile?: string | undefined;
30
+ }
31
+ /** Running subagents (oldest first), then background shells (oldest first). */
32
+ export declare function buildBackgroundItems(fleet: Readonly<Record<string, FleetEntry>>, processes: readonly BackgroundProcessLike[]): BackgroundItem[];
33
+ /** `12s`, `3m`, `1h4m`. */
34
+ export declare function formatElapsed(ms: number): string;
35
+ export interface StripChip {
36
+ item: BackgroundItem;
37
+ text: string;
38
+ selected: boolean;
39
+ }
40
+ /**
41
+ * The chips that fit in `width` columns (after the `prefix` and before the
42
+ * `suffix`), always including the selected one; `hidden` counts the rest.
43
+ */
44
+ export declare function layoutStripChips(items: readonly BackgroundItem[], selected: number, width: number, now: number, spinner: string): {
45
+ chips: StripChip[];
46
+ hidden: number;
47
+ };
48
+ /** What a subagent is doing, newest last. */
49
+ export declare function agentPeekLines(entry: FleetEntry | undefined, max: number): string[];
50
+ export interface BackgroundStripState {
51
+ focused: boolean;
52
+ /** By id, so a chip that appears before it does not move the selection. */
53
+ selectedId: string | undefined;
54
+ peek: boolean;
55
+ confirmStop: boolean;
56
+ items: readonly BackgroundItem[];
57
+ }
58
+ export declare function getBackgroundStrip(): BackgroundStripState;
59
+ export declare function updateBackgroundStrip(patch: Partial<BackgroundStripState>): void;
60
+ /** Position of the selected chip (0 when nothing is selected). */
61
+ export declare function selectedIndex(state: BackgroundStripState): number;
62
+ /** Same ids in the same order: the strip keeps its item list (and render). */
63
+ export declare function sameItems(a: readonly BackgroundItem[], b: readonly BackgroundItem[]): boolean;
64
+ export declare function useBackgroundStrip(): BackgroundStripState;
65
+ //# sourceMappingURL=background-strip-model.d.ts.map
@@ -93,7 +93,8 @@ export interface BrainPanelSettings {
93
93
  /** Effective heuristic toggles (defaults already filled in by the host). */
94
94
  heuristics: BrainPanelHeuristics;
95
95
  /** Single-LLM tier quality gate. */
96
- llmMaxTokens: number;
96
+ /** undefined = the model's own output ceiling. */
97
+ llmMaxTokens?: number | undefined;
97
98
  llmRejectUncertain: boolean;
98
99
  llmMinConfidence: number;
99
100
  llmDenyIsTerminal: BrainDenyIsTerminal;
@@ -163,7 +164,7 @@ export interface BrainPanelHost {
163
164
  * positive integer"), so there is no "clear back to default" step here —
164
165
  * the preset ladders are number-only.
165
166
  */
166
- setLlmMaxTokens(tokens: number): Promise<string | null>;
167
+ setLlmMaxTokens(tokens: number | undefined): Promise<string | null>;
167
168
  setLlmRejectUncertain(on: boolean): Promise<string | null>;
168
169
  setLlmMinConfidence(value: number): Promise<string | null>;
169
170
  setLlmDenyIsTerminal(mode: BrainDenyIsTerminal): Promise<string | null>;
@@ -277,7 +278,7 @@ export declare const AUTO_DENY_PRESETS: ReadonlyArray<number | undefined>;
277
278
  * fields, so there is no `undefined` ("back to default") rung — the default
278
279
  * value itself is the first rung.
279
280
  */
280
- export declare const LLM_MAX_TOKENS_PRESETS: readonly number[];
281
+ export declare const LLM_MAX_TOKENS_PRESETS: ReadonlyArray<number | undefined>;
281
282
  export declare const LLM_MIN_CONFIDENCE_PRESETS: readonly number[];
282
283
  export declare const CACHE_TTL_PRESETS: readonly number[];
283
284
  export declare const CACHE_MAX_ENTRIES_PRESETS: readonly number[];
@@ -291,10 +292,9 @@ export declare const COUNCIL_TIMEOUT_PRESETS: ReadonlyArray<number | undefined>;
291
292
  export declare const COUNCIL_CONCURRENCY_PRESETS: ReadonlyArray<number | undefined>;
292
293
  export declare const COUNCIL_JUDGE_MAX_TOKENS_PRESETS: ReadonlyArray<number | undefined>;
293
294
  /**
294
- * Per-seat output budget rungs. The default is 2000 (see
295
- * `BRAIN_COUNCIL_DEFAULT_VOTER_MAX_TOKENS` in core) — reasoning models spend
296
- * their thinking tokens from this budget, so the rungs skew higher than the
297
- * judge ladder.
295
+ * Per-seat output budget rungs. The default (unset) is the model's own output
296
+ * ceiling — reasoning models spend their thinking tokens from this budget, so
297
+ * the rungs skew higher than the judge ladder.
298
298
  */
299
299
  /**
300
300
  * Deliberation round presets. Deliberately short: every step is another
@@ -0,0 +1,15 @@
1
+ import type { SlashCommand } from '@wrongstack/core/types';
2
+ import type { Action } from './app-action-type.js';
3
+ interface ChatSearchSlashDeps {
4
+ dispatch: (action: Action) => void;
5
+ /** Thinking cards are only searchable while model reasoning is shown. */
6
+ includeReasoning: () => boolean;
7
+ }
8
+ /**
9
+ * TUI `/chat-search [text]` — opens the transcript search bar (same as
10
+ * Alt+F), optionally prefilled. Searches the history retained in this TUI;
11
+ * entries evicted by history retention are not searched.
12
+ */
13
+ export declare function createChatSearchSlashCommand(deps: ChatSearchSlashDeps): SlashCommand;
14
+ export {};
15
+ //# sourceMappingURL=chat-search-slash.d.ts.map
@@ -1,2 +1,15 @@
1
- export { readClipboardImage, readClipboardText, writeClipboardText, type ClipboardImage, } from '@wrongstack/runtime/clipboard';
1
+ export { type ClipboardImage, readClipboardImage, readClipboardText, } from '@wrongstack/runtime/clipboard';
2
+ interface ClipboardWriteDeps {
3
+ native: (text: string) => Promise<boolean>;
4
+ stdout: Pick<NodeJS.WriteStream, 'write' | 'isTTY'>;
5
+ }
6
+ /**
7
+ * Copy text for the TUI's copy actions. The OS clipboard tool first; when there
8
+ * is none that works — an SSH session, a headless Linux box without
9
+ * wl-copy/xclip — the terminal is asked to copy it with OSC 52, which reaches
10
+ * the clipboard of the machine the user is actually sitting at. (Inside tmux
11
+ * that needs `set -g set-clipboard on`.) OSC 52 has no acknowledgement, so a
12
+ * sent sequence counts as copied.
13
+ */
14
+ export declare function writeClipboardText(text: string, deps?: ClipboardWriteDeps): Promise<boolean>;
2
15
  //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1,61 @@
1
+ import type { AgentTimelineEntry } from '@wrongstack/core/coordination';
2
+ import type { FleetEntry } from '../app-state.js';
3
+ import type { HistoryEntry } from './history.js';
4
+ export declare function isLeaderEntry(entry: FleetEntry): boolean;
5
+ /**
6
+ * Select the agents the live monitor should render. Only actively-running
7
+ * subagents are detail-worthy; idle workers are retained by the coordinator for
8
+ * reuse but should not keep the TUI crowded after their task closes. LEADER
9
+ * stays visible while a subagent is running (or while LEADER itself is running)
10
+ * so F3 always has a detail card fallback.
11
+ */
12
+ export declare function selectLiveAgents(all: FleetEntry[], _now: number, _idleHideMs?: number): FleetEntry[];
13
+ export declare function fmtTokens(n: number): string;
14
+ export declare function fmtExactTokens(n: number): string;
15
+ export declare function snippet(s: string, max?: number): string;
16
+ export declare function formatContextRunway(tokens?: number, maxTokens?: number): string;
17
+ export declare function formatRecentToolChip(tool: FleetEntry['recentTools'][number]): string;
18
+ export declare function formatAgentDetailHeader(entry: FleetEntry): string;
19
+ export declare function agentRisk(entry: FleetEntry): 'calm' | 'busy' | 'hot' | 'critical';
20
+ export declare function riskMeta(risk: ReturnType<typeof agentRisk>): {
21
+ icon: string;
22
+ color: string;
23
+ label: string;
24
+ };
25
+ export declare function currentAction(entry: FleetEntry, now: number): string;
26
+ export declare function selectAgentDetail(live: FleetEntry[], selectedId?: string): FleetEntry | undefined;
27
+ export declare function nextEmptyAgentsCloseStartedAt(liveCount: number, now: number, currentStartedAt?: number): number | undefined;
28
+ export declare function shouldCloseEmptyAgentsMonitor(liveCount: number, now: number, emptyStartedAt: number | undefined, delayMs?: number): boolean;
29
+ export declare function selectHotAgent(entries: FleetEntry[]): FleetEntry | undefined;
30
+ export declare function pctTextFromRatio(pct: number | undefined): string;
31
+ /**
32
+ * Rows of transcript content for the current terminal. Constant for a
33
+ * given terminal size and agent count, so agent switches never change
34
+ * the panel height — only explicit resizes / fleet composition do.
35
+ * `fullscreen` lifts the 24-row cap: the F3 monitor owns the whole
36
+ * screen (chat history hidden), so the pane should fill every row the
37
+ * chrome doesn't need.
38
+ */
39
+ export declare function transcriptRowsForTerminal(termRows: number | undefined, rosterCount: number, fullscreen?: boolean): number;
40
+ /** One transcript entry as a single display line: `HH:MM:SS L3 🔧 …`. */
41
+ export declare function formatTranscriptLine(e: AgentTimelineEntry, maxWidth?: number): string;
42
+ /**
43
+ * Map the main chat's history entries into the transcript timeline shape
44
+ * so LEADER gets its own clean per-agent view in the F3 monitor. Subagent
45
+ * lines are EXCLUDED — that separation (leader vs subagents, not
46
+ * interleaved) is the whole point of the per-agent view. Banners and
47
+ * confirm prompts are UI chrome, not history, and are skipped too.
48
+ */
49
+ export declare function leaderTimelineFromEntries(entries: readonly HistoryEntry[]): AgentTimelineEntry[];
50
+ /**
51
+ * Slice a transcript (OLDEST first) into the fixed viewing window.
52
+ * `scrollOffset` counts lines scrolled UP from the tail (0 = pinned to
53
+ * newest). Returns the visible slice plus how many entries are hidden
54
+ * above/below the window.
55
+ */
56
+ export declare function selectTranscriptWindow(entries: readonly AgentTimelineEntry[], scrollOffset: number, rows?: number): {
57
+ slice: AgentTimelineEntry[];
58
+ above: number;
59
+ below: number;
60
+ };
61
+ //# sourceMappingURL=agent-monitor-presentation.d.ts.map
@@ -1,9 +1,8 @@
1
- import type React from 'react';
2
1
  import type { AgentTimelineEntry } from '@wrongstack/core/coordination';
2
+ import type React from 'react';
3
+ import type { FleetEntry } from '../app-state.js';
3
4
  import type { AgentTranscriptReader } from '../ui-contracts.js';
4
5
  export type { AgentTranscriptReader } from '../ui-contracts.js';
5
- import type { FleetEntry } from '../app-state.js';
6
- import type { HistoryEntry } from './history.js';
7
6
  /**
8
7
  * Narrow read-only view of per-subagent transcripts. AgentMonitorService
9
8
  * (created in the CLI host) satisfies this structurally; the TUI never
@@ -24,53 +23,8 @@ interface AgentsMonitorProps {
24
23
  leaderTranscript?: (() => AgentTimelineEntry[]) | undefined;
25
24
  fullscreen?: boolean | undefined;
26
25
  }
26
+ export { agentRisk, fmtExactTokens, formatAgentDetailHeader, formatContextRunway, formatRecentToolChip, formatTranscriptLine, leaderTimelineFromEntries, nextEmptyAgentsCloseStartedAt, selectAgentDetail, selectLiveAgents, selectTranscriptWindow, shouldCloseEmptyAgentsMonitor, transcriptRowsForTerminal, } from './agent-monitor-presentation.js';
27
27
  export { EMPTY_AGENTS_CLOSE_DELAY_MS, IDLE_HIDE_MS } from './agents-monitor-constants.js';
28
- /**
29
- * Select the agents the live monitor should render. Only actively-running
30
- * subagents are detail-worthy; idle workers are retained by the coordinator for
31
- * reuse but should not keep the TUI crowded after their task closes. LEADER
32
- * stays visible while a subagent is running (or while LEADER itself is running)
33
- * so F3 always has a detail card fallback.
34
- */
35
- export declare function selectLiveAgents(all: FleetEntry[], _now: number, _idleHideMs?: number): FleetEntry[];
36
- export declare function fmtExactTokens(n: number): string;
37
- export declare function formatContextRunway(tokens?: number, maxTokens?: number): string;
38
- export declare function formatRecentToolChip(tool: FleetEntry['recentTools'][number]): string;
39
- export declare function formatAgentDetailHeader(entry: FleetEntry): string;
40
- export declare function agentRisk(entry: FleetEntry): 'calm' | 'busy' | 'hot' | 'critical';
41
- export declare function selectAgentDetail(live: FleetEntry[], selectedId?: string): FleetEntry | undefined;
42
- export declare function nextEmptyAgentsCloseStartedAt(liveCount: number, now: number, currentStartedAt?: number): number | undefined;
43
- export declare function shouldCloseEmptyAgentsMonitor(liveCount: number, now: number, emptyStartedAt: number | undefined, delayMs?: number): boolean;
44
- /**
45
- * Rows of transcript content for the current terminal. Constant for a
46
- * given terminal size and agent count, so agent switches never change
47
- * the panel height — only explicit resizes / fleet composition do.
48
- * `fullscreen` lifts the 24-row cap: the F3 monitor owns the whole
49
- * screen (chat history hidden), so the pane should fill every row the
50
- * chrome doesn't need.
51
- */
52
- export declare function transcriptRowsForTerminal(termRows: number | undefined, rosterCount: number, fullscreen?: boolean): number;
53
- /** One transcript entry as a single display line: `HH:MM:SS L3 🔧 …`. */
54
- export declare function formatTranscriptLine(e: AgentTimelineEntry, maxWidth?: number): string;
55
- /**
56
- * Map the main chat's history entries into the transcript timeline shape
57
- * so LEADER gets its own clean per-agent view in the F3 monitor. Subagent
58
- * lines are EXCLUDED — that separation (leader vs subagents, not
59
- * interleaved) is the whole point of the per-agent view. Banners and
60
- * confirm prompts are UI chrome, not history, and are skipped too.
61
- */
62
- export declare function leaderTimelineFromEntries(entries: readonly HistoryEntry[]): AgentTimelineEntry[];
63
- /**
64
- * Slice a transcript (OLDEST first) into the fixed viewing window.
65
- * `scrollOffset` counts lines scrolled UP from the tail (0 = pinned to
66
- * newest). Returns the visible slice plus how many entries are hidden
67
- * above/below the window.
68
- */
69
- export declare function selectTranscriptWindow(entries: readonly AgentTimelineEntry[], scrollOffset: number, rows?: number): {
70
- slice: AgentTimelineEntry[];
71
- above: number;
72
- below: number;
73
- };
74
28
  /**
75
29
  * Agents panel — the redesigned F3 view.
76
30
  *
@@ -3,7 +3,8 @@ interface AuditPanelProps {
3
3
  /** Side effects from ctx.sideEffects, passed from the host. */
4
4
  sideEffects: SideEffect[];
5
5
  onClose: () => void;
6
+ maxRows?: number | undefined;
6
7
  }
7
- export declare function AuditPanel({ sideEffects, onClose: _onClose }: AuditPanelProps): import("react").JSX.Element;
8
+ export declare function AuditPanel({ sideEffects, onClose: _onClose, maxRows }: AuditPanelProps): import("react").JSX.Element;
8
9
  export {};
9
10
  //# sourceMappingURL=audit-panel.d.ts.map
@@ -1,6 +1,8 @@
1
1
  import type React from 'react';
2
2
  import { type AuthPanelState } from './auth-panel-model.js';
3
3
  interface AuthPanelProps {
4
+ maxRows?: number | undefined;
5
+ columns?: number | undefined;
4
6
  panel: AuthPanelState;
5
7
  }
6
8
  export declare function formatExpiry(expiresAt: string | undefined): {
@@ -10,6 +12,6 @@ export declare function formatExpiry(expiresAt: string | undefined): {
10
12
  export declare function isAuthFlowUrlLine(line: string): boolean;
11
13
  /** Keep the newest authorize URL pinned even as later status lines arrive. */
12
14
  export declare function latestAuthFlowUrl(lines: readonly string[]): string | undefined;
13
- export declare function AuthPanel({ panel }: AuthPanelProps): React.ReactElement;
15
+ export declare function AuthPanel({ panel, maxRows, columns }: AuthPanelProps): React.ReactElement;
14
16
  export {};
15
17
  //# sourceMappingURL=auth-panel.d.ts.map
@@ -0,0 +1,20 @@
1
+ import type React from 'react';
2
+ import type { FleetEntry } from '../app-state-fleet.js';
3
+ /** Output lines shown under the strip while a chip is open. */
4
+ export declare const BACKGROUND_STRIP_PEEK_ROWS = 6;
5
+ /** Rows the strip takes: none while nothing runs in the background. */
6
+ export declare function backgroundStripRows(state: {
7
+ items: readonly unknown[];
8
+ focused: boolean;
9
+ peek: boolean;
10
+ }): number;
11
+ /**
12
+ * Running subagents and background shells, one chip each, right above the
13
+ * composer. Hidden while nothing runs in the background. Alt+B focuses it
14
+ * (see key-route-background-strip.ts).
15
+ */
16
+ export declare function BackgroundStrip({ fleet, width, }: {
17
+ fleet: Readonly<Record<string, FleetEntry>>;
18
+ width: number;
19
+ }): React.ReactElement | null;
20
+ //# sourceMappingURL=background-strip.d.ts.map
@@ -3,6 +3,8 @@ import type { BrainLogEntry, BrainRiskLevel } from '../brain-contracts.js';
3
3
  export type { BrainLogEntry, BrainRiskLevel } from '../brain-contracts.js';
4
4
  import { type BrainPanelSettings } from './brain-panel-model.js';
5
5
  export interface BrainPanelProps {
6
+ maxRows?: number | undefined;
7
+ columns?: number | undefined;
6
8
  riskLevel: BrainRiskLevel;
7
9
  log: BrainLogEntry[];
8
10
  selected: number;
@@ -13,5 +15,5 @@ export interface BrainPanelProps {
13
15
  row?: number | undefined;
14
16
  busy?: boolean | undefined;
15
17
  }
16
- export declare function BrainPanel({ riskLevel, log, selected, hint, view, settings, row, busy, }: BrainPanelProps): React.ReactElement;
18
+ export declare function BrainPanel({ riskLevel, log, selected, hint, view, settings, row, busy, maxRows, columns, }: BrainPanelProps): React.ReactElement;
17
19
  //# sourceMappingURL=brain-panel.d.ts.map
@@ -0,0 +1,19 @@
1
+ import type React from 'react';
2
+ import type { State } from '../app-state.js';
3
+ import type { HistoryEntry } from '../history-entry.js';
4
+ /** Rows the bar always occupies, so the history viewport never jumps. */
5
+ export declare const CHAT_SEARCH_BAR_ROWS = 2;
6
+ interface ChatSearchBarProps {
7
+ search: NonNullable<State['chatSearch']>;
8
+ entries: readonly HistoryEntry[];
9
+ includeReasoning: boolean;
10
+ width: number;
11
+ }
12
+ /**
13
+ * Transcript search bar shown above the composer while Alt+F search is open.
14
+ * Row 1: query, match position and key hints. Row 2: the selected match's
15
+ * line with the hit highlighted (or guidance when there is nothing to show).
16
+ */
17
+ export declare const ChatSearchBar: React.MemoExoticComponent<({ search, entries, includeReasoning, width, }: ChatSearchBarProps) => React.ReactElement>;
18
+ export {};
19
+ //# sourceMappingURL=chat-search-bar.d.ts.map
@@ -8,12 +8,16 @@ export interface CheckpointTimelineProps {
8
8
  }>;
9
9
  selected: number;
10
10
  onSelect: (index: number) => void;
11
- onConfirm: (index: number) => void;
11
+ onConfirm: (index: number) => void | Promise<void>;
12
+ /** Branch a new session at the checkpoint; absent when the host cannot fork. */
13
+ onFork?: ((index: number) => void) | undefined;
12
14
  onClose: () => void;
13
15
  }
14
16
  /**
15
17
  * Full-screen checkpoint timeline overlay for the /rewind command.
16
- * Arrow keys to navigate, Enter to rewind to selected, Esc to close.
18
+ * Arrow keys to navigate, Enter to rewind to selected, `f` to fork a new
19
+ * session there, Esc to close. Both take the selected prompt and everything
20
+ * after it back, and put the prompt back in the composer.
17
21
  */
18
- export declare function CheckpointTimeline({ checkpoints, selected, onSelect, onConfirm, onClose, }: CheckpointTimelineProps): React.ReactElement;
22
+ export declare function CheckpointTimeline({ checkpoints, selected, onSelect, onConfirm, onFork, onClose, }: CheckpointTimelineProps): React.ReactElement;
19
23
  //# sourceMappingURL=checkpoint-timeline.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- export type ConfirmDecision = 'yes' | 'no' | 'always' | 'deny';
2
+ export type ConfirmDecision = 'yes' | 'no' | 'always' | 'always-exact' | 'always-command' | 'always-tool' | 'deny';
3
3
  interface ConfirmPromptProps {
4
4
  toolName: string;
5
5
  input: unknown;
@@ -7,6 +7,7 @@ interface ConfirmPromptProps {
7
7
  onDecision: (decision: ConfirmDecision) => void;
8
8
  /** Enable YOLO mode (capital Y). Destructive current calls remain pending. */
9
9
  onEnableYolo: () => void;
10
+ maxRows?: number | undefined;
10
11
  /** Whether this call was classified destructive. */
11
12
  destructive?: boolean;
12
13
  boundaryReason?: string | undefined;
@@ -19,12 +20,10 @@ interface ConfirmPromptProps {
19
20
  }
20
21
  /**
21
22
  * 0-based column spans of each button WITHIN the dialog's content area (i.e.
22
- * relative to the first printable column inside the border + paddingX). Used
23
- * by the TUI mouse handler to map a click on the button row to a decision.
24
- * Derived from the same `buttonLabels` the component renders, so the offsets
25
- * always match what's on screen.
23
+ * relative to the first printable column inside the border + paddingX).
24
+ * These describe an unwrapped row; the live handler uses measured DOM boxes.
26
25
  */
27
- export declare function confirmButtonSegments(suggestedPattern: string): Array<{
26
+ export declare function confirmButtonSegments(suggestedPattern: string, toolName?: string): Array<{
28
27
  decision: ConfirmDecision;
29
28
  start: number;
30
29
  len: number;
@@ -43,6 +42,6 @@ export declare function confirmButtonSegments(suggestedPattern: string): Array<{
43
42
  * through the same DiffBlock the committed history entries use.
44
43
  */
45
44
  export declare function payloadDiff(input: unknown): string;
46
- export declare function ConfirmPrompt({ toolName, input, suggestedPattern, onDecision, onEnableYolo, destructive, boundaryReason, writeTargets, }: ConfirmPromptProps): React.ReactElement;
45
+ export declare function ConfirmPrompt({ toolName, input, suggestedPattern, onDecision, onEnableYolo, destructive, boundaryReason, writeTargets, maxRows, }: ConfirmPromptProps): React.ReactElement;
47
46
  export {};
48
47
  //# sourceMappingURL=confirm-prompt.d.ts.map
@@ -1,7 +1,8 @@
1
1
  interface ConnectionsPanelProps {
2
2
  projectRoot: string;
3
3
  onClose: () => void;
4
+ maxRows?: number | undefined;
4
5
  }
5
- export declare function ConnectionsPanel({ projectRoot, onClose, }: ConnectionsPanelProps): React.ReactElement;
6
+ export declare function ConnectionsPanel({ projectRoot, onClose, maxRows, }: ConnectionsPanelProps): React.ReactElement;
6
7
  export {};
7
8
  //# sourceMappingURL=connections-panel.d.ts.map
@@ -0,0 +1,53 @@
1
+ import type { ContextBreakdown } from '@wrongstack/core/utils';
2
+ import type React from 'react';
3
+ import type { ContextPanelData } from './context-panel-types.js';
4
+ type ZoneLevel = 'safe' | 'warning' | 'critical' | 'danger';
5
+ export declare function zoneFor(pct: number): ZoneLevel;
6
+ export declare function zoneColor(zone: ZoneLevel): string;
7
+ export declare function zoneEmoji(pct: number): string;
8
+ export declare function zoneLabel(pct: number): string;
9
+ export declare function PressureSection({ data, contentWidth, }: {
10
+ data: ContextPanelData;
11
+ contentWidth: number;
12
+ }): React.ReactElement;
13
+ /**
14
+ * Real composition, measured from the assembled request. Top-level categories
15
+ * (System / Tools / History / Volatile) each render a bar sized to their share
16
+ * of the total, plus a muted sub-line of the biggest constituents.
17
+ */
18
+ export declare function CompositionSection({ breakdown, contentWidth, }: {
19
+ breakdown: ContextBreakdown | undefined;
20
+ contentWidth: number;
21
+ }): React.ReactElement;
22
+ export declare function ThresholdSection({ data, contentWidth, }: {
23
+ data: ContextPanelData;
24
+ contentWidth: number;
25
+ }): React.ReactElement;
26
+ export declare function CompactionSection({ data }: {
27
+ data: ContextPanelData;
28
+ }): React.ReactElement;
29
+ export declare function AgentFootprintSection({ data, contentWidth, }: {
30
+ data: ContextPanelData;
31
+ contentWidth: number;
32
+ }): React.ReactElement;
33
+ export declare function MetricsSection({ data }: {
34
+ data: ContextPanelData;
35
+ }): React.ReactElement;
36
+ /**
37
+ * Cache coverage section — answers "exactly how far does the prompt cache
38
+ * extend into the live request?" Renders the cumulative cache hit ratio
39
+ * plus a per-request coverage meter that visibly marks where the cached
40
+ * prefix ends. Hidden when nothing has been cached yet so the panel does
41
+ * not advertise a 0% figure as if it were meaningful.
42
+ */
43
+ export declare function CacheSection({ data }: {
44
+ data: ContextPanelData;
45
+ }): React.ReactElement;
46
+ export declare function StatusSection({ data }: {
47
+ data: ContextPanelData;
48
+ }): React.ReactElement;
49
+ export declare function MemoryContextSection({ data }: {
50
+ data: ContextPanelData;
51
+ }): React.ReactElement;
52
+ export {};
53
+ //# sourceMappingURL=context-panel-sections.d.ts.map
@@ -0,0 +1,66 @@
1
+ import type { ContextBreakdown } from '@wrongstack/core/utils';
2
+ import type { MemoryContextMonitorState } from '../memory-context-monitor.js';
3
+ export interface ContextPanelData {
4
+ ctxPct: number | undefined;
5
+ ctxTokens: number | undefined;
6
+ ctxMaxTokens: number | undefined;
7
+ provider: string;
8
+ model: string;
9
+ mode: string;
10
+ uptime: string;
11
+ /**
12
+ * Cumulative prompt-cache stats from the per-session TokenCounter.
13
+ * Surfaced in the panel so `/context` answers "how much of my spend
14
+ * is hitting the cache" without asking the user to chase the CLI
15
+ * `/context cache` subcommand.
16
+ *
17
+ * `savedUsd` is the gross read-discount USD figure computed by the
18
+ * counter (cache-read tokens × (input price − cache-read price)).
19
+ * `cacheWrite5m` / `cacheWrite1h` are present when the upstream exposed
20
+ * an Anthropic-style TTL split (Anthropic family, including MiniMax
21
+ * routed through the Anthropic Messages surface); OpenAI-family
22
+ * gateways emit only the aggregate and leave them undefined.
23
+ */
24
+ cacheStats?: {
25
+ readTokens: number;
26
+ writeTokens: number;
27
+ cacheWrite5m?: number | undefined;
28
+ cacheWrite1h?: number | undefined;
29
+ hitRatio: number;
30
+ savedUsd: number;
31
+ } | undefined;
32
+ /**
33
+ * How far the cached prefix reaches through the live request, in
34
+ * tokens. Drawn on the per-request coverage meter so users see the
35
+ * exact extent of the cache, not just a percentage.
36
+ */
37
+ cacheCoverageTokens?: number | undefined;
38
+ /** Session cache telemetry split by provider, including fallback/model switches. */
39
+ providerCacheStats?: Array<{
40
+ provider: string;
41
+ input: number;
42
+ cacheRead: number;
43
+ cacheWrite: number;
44
+ cacheWrite5m?: number | undefined;
45
+ cacheWrite1h?: number | undefined;
46
+ hitRatio: number;
47
+ }> | undefined;
48
+ /**
49
+ * Real, measured per-category token accounting for the live request. When
50
+ * present the Composition tab shows honest numbers; when absent (no request
51
+ * has been assembled yet) the tab shows an empty state instead of fabricated
52
+ * percentages.
53
+ */
54
+ breakdown: ContextBreakdown | undefined;
55
+ fleetEntries: Array<{
56
+ name: string;
57
+ status: string;
58
+ currentTool: string | undefined;
59
+ ctxPct: number | undefined;
60
+ }>;
61
+ leaderIterations: number;
62
+ leaderToolCalls: number;
63
+ leaderStatus: string;
64
+ memoryContext: MemoryContextMonitorState;
65
+ }
66
+ //# sourceMappingURL=context-panel-types.d.ts.map