@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
@@ -19,6 +19,16 @@ export declare function detectAtToken(buffer: string, cursor: number): {
19
19
  end: number;
20
20
  query: string;
21
21
  } | null;
22
+ export declare function isFileSelectionCurrent(current: {
23
+ buffer: string;
24
+ cursor: number;
25
+ }, original: {
26
+ buffer: string;
27
+ cursor: number;
28
+ }, token: {
29
+ start: number;
30
+ end: number;
31
+ }): boolean;
22
32
  interface UseFileSearchOptions {
23
33
  state: State;
24
34
  dispatch: React.Dispatch<Action>;
@@ -3,9 +3,10 @@
3
3
  *
4
4
  * Fleet event bridges must discard events from subagents that were spawned
5
5
  * before the last `/clear`. This shared hook encapsulates that logic so any
6
- * bridge can apply it consistently. Currently consumed by
7
- * `useDirectorFleetBridge` (Director FleetBus streaming); `useSubagentEvents`
8
- * (EventBus lifecycle) does not gate on generation today.
6
+ * bridge can apply it consistently. Both consumers wire it: `useDirectorFleetBridge`
7
+ * (Director FleetBus streaming) and `useSubagentEvents` (EventBus lifecycle —
8
+ * instantiated at use-subagent-events.ts:126, `gate.track` on spawn, `gate.isLive`
9
+ * on every subagent event handler, `gate.forget` on removal).
9
10
  *
10
11
  * Usage:
11
12
  * ```ts
@@ -14,7 +14,7 @@ interface PanelControllersOptions {
14
14
  openAuthPanel: (view?: 'list' | 'oauth') => boolean;
15
15
  openModePicker: () => void | Promise<void>;
16
16
  openBrainPanel: () => void | Promise<void>;
17
- openShadowPanel: () => void | Promise<void>;
17
+ openShadowPanel: () => void | boolean;
18
18
  /** Opens the `/subagent-models` lane panel; omitted when the host wires no plan. */
19
19
  openSubagentModelsPanel?: (() => void) | undefined;
20
20
  openHelpPanel: () => void | Promise<void>;
@@ -0,0 +1,4 @@
1
+ import type { KeyEvent } from '../components/input.js';
2
+ import type { PickerKeysHost } from './use-picker-keys-types.js';
3
+ export declare function tryBrainStatuslinePickerKeys(host: PickerKeysHost, input: string, key: KeyEvent, isEnter: boolean, debouncedEnter: (host: PickerKeysHost) => boolean): boolean;
4
+ //# sourceMappingURL=use-picker-keys-brain-statusline.d.ts.map
@@ -43,6 +43,7 @@ export interface PickerKeysHost {
43
43
  onResumePickerEnter: (() => Promise<void>) | undefined;
44
44
  onSessionsPanelEnter: (() => Promise<void>) | undefined;
45
45
  onProjectPickerEnter: (() => Promise<void>) | undefined;
46
+ onSkillMentionPick?: ((name: string) => void) | undefined;
46
47
  onSlashPickerEnter: (() => void) | undefined;
47
48
  onSettingsPickerEnter: (() => void) | undefined;
48
49
  onPluginPickerToggle: (() => Promise<void> | void) | undefined;
@@ -0,0 +1,9 @@
1
+ import type { AppProps } from '../app-props.js';
2
+ import type { State } from '../app-state.js';
3
+ /**
4
+ * Warm the provider connection while the user types, so DNS and TLS are done
5
+ * by the time they press Enter (`Provider.warm`). Runs on every keystroke;
6
+ * the provider throttles to one small request per endpoint every few seconds.
7
+ */
8
+ export declare function useProviderWarmup(agent: AppProps['agent'], buffer: string, status: State['status']): void;
9
+ //# sourceMappingURL=use-provider-warmup.d.ts.map
@@ -5,6 +5,12 @@ import type { Settings } from '../app-state.js';
5
5
  export interface UseQueueManagerOptions {
6
6
  /** Optional persistent store — absent => in-memory only (no crash recovery). */
7
7
  queueStore?: QueueStore | undefined;
8
+ /**
9
+ * The store of another session. With it, resuming a session brings that
10
+ * session's queue along (the WebUI keeps its queue in the same file) and
11
+ * leaves the previous session's on disk; without it, the queue is dropped.
12
+ */
13
+ queueStoreFor?: ((sessionId: string) => QueueStore | undefined) | undefined;
8
14
  /** Called on every queue change so the host learns what's waiting. */
9
15
  onQueueChange?: ((items: string[]) => void) | undefined;
10
16
  /** Slash registry to register the /queue command. */
@@ -18,10 +24,14 @@ export interface UseQueueManagerOptions {
18
24
  /** Live mirror of the mid-run send-mode picker enabled flag. */
19
25
  midRunSendPickerRef: React.MutableRefObject<boolean>;
20
26
  }
27
+ export interface QueueManager {
28
+ /** Move the queue to the session just resumed: its own queue replaces this one. */
29
+ switchSession(sessionId: string): void;
30
+ }
21
31
  /**
22
32
  * Manages the TUI message queue: rehydration from persistent store,
23
33
  * persistence on every change, host mirroring, and the /queue slash
24
34
  * command. All side-effect wiring extracted from app.tsx.
25
35
  */
26
- export declare function useQueueManager({ queueStore, onQueueChange, slashRegistry, stateRef, dispatch, getSettings, saveSettings, midRunSendPickerRef, }: UseQueueManagerOptions): void;
36
+ export declare function useQueueManager({ queueStore, queueStoreFor, onQueueChange, slashRegistry, stateRef, dispatch, getSettings, saveSettings, midRunSendPickerRef, }: UseQueueManagerOptions): QueueManager;
27
37
  //# sourceMappingURL=use-queue-manager.d.ts.map
@@ -1,6 +1,12 @@
1
1
  import type { Agent } from '@wrongstack/core/agent';
2
2
  import type { Director } from '@wrongstack/core/coordination';
3
+ import { type RedoRewindResult, type RewoundConversation } from '@wrongstack/core/storage';
3
4
  import type { SessionInterruptController } from './use-session-interrupt-controller.js';
5
+ /** What a rewind leaves for the screen: the prompt taken back, and the rest. */
6
+ export interface RewindOutcome {
7
+ promptText?: string | undefined;
8
+ conversation?: RewoundConversation | undefined;
9
+ }
4
10
  interface UseSessionRewindOptions {
5
11
  agent: Agent;
6
12
  sessionsDir?: string | undefined;
@@ -9,7 +15,8 @@ interface UseSessionRewindOptions {
9
15
  sessionGenerationRef: React.MutableRefObject<number>;
10
16
  }
11
17
  export declare function useSessionRewind({ agent, sessionsDir, interruptController, liveDirector, sessionGenerationRef, }: UseSessionRewindOptions): {
12
- handleRewindTo: (checkpointIndex: number) => Promise<void>;
18
+ handleRewindTo: (checkpointIndex: number) => Promise<RewindOutcome>;
19
+ handleRewindRedo: () => Promise<RedoRewindResult | null>;
13
20
  };
14
21
  export {};
15
22
  //# sourceMappingURL=use-session-rewind.d.ts.map
@@ -10,7 +10,7 @@ interface ShadowPanelHost {
10
10
  onShadowStop?: (() => Promise<string | undefined>) | undefined;
11
11
  }
12
12
  export declare function useShadowPanel(dispatch: React.Dispatch<Action>, host: ShadowPanelHost): {
13
- openShadowPanel: () => void;
13
+ openShadowPanel: () => boolean;
14
14
  handleShadowStart: () => Promise<void>;
15
15
  handleShadowStop: () => Promise<void>;
16
16
  };
@@ -9,10 +9,10 @@
9
9
  * Each hook is self-contained: it manages its own refresh interval and
10
10
  * cleanup. The hooks must be called unconditionally (rules of hooks), but
11
11
  * polling is gated by the `enabled` flag — app-view passes whether the
12
- * twin currently occupies a visible sidebar slot. While a panel is closed
13
- * or routed to the bottom region no polling runs (the bottom panels run
14
- * their own polling when open), so the session pays no IPC probes or disk
15
- * reads for panels nobody is looking at. Each hook performs an immediate
12
+ * twin currently occupies a visible sidebar slot. Connections also supplies
13
+ * the persistent icon strip, so it polls whenever the sidebar is visible.
14
+ * Hidden surfaces do not poll (bottom panels run their own polling when open).
15
+ * Each hook performs an immediate
16
16
  * first read when enabled, so data is fresh the moment the twin mounts.
17
17
  */
18
18
  interface SidebarProcess {
@@ -30,7 +30,9 @@ export declare function useSidebarProcessList(enabled?: boolean): {
30
30
  totalCount: number;
31
31
  processes: readonly SidebarProcess[];
32
32
  };
33
- interface SidebarConnection {
33
+ export interface SidebarConnection {
34
+ id?: import('../connections-health.js').ConnectionHealthServiceId | undefined;
35
+ healthStatus?: import('../connections-health.js').ConnectionHealthStatus | undefined;
34
36
  name: string;
35
37
  status: 'ok' | 'warn' | 'down' | 'unknown';
36
38
  latencyMs?: number | undefined;
@@ -0,0 +1,6 @@
1
+ import type { SkillLoader } from '@wrongstack/core/types';
2
+ import { type Dispatch } from 'react';
3
+ import type { Action } from '../app-action-type.js';
4
+ import type { State } from '../app-state.js';
5
+ export declare function useSkillMentionPicker(state: State, loader: SkillLoader | undefined, dispatch: Dispatch<Action>): void;
6
+ //# sourceMappingURL=use-skill-mention-picker.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { type Dispatch } from 'react';
2
- import type { AppProps } from '../app-props.js';
3
2
  import type { Action } from '../app-action-type.js';
3
+ import type { AppProps } from '../app-props.js';
4
4
  import type { State } from '../app-state.js';
5
5
  interface SlashPickerOptions {
6
6
  state: State;
@@ -1,5 +1,12 @@
1
1
  import type { KeyEvent } from '../components/input.js';
2
2
  type AppKeyHandler = (input: string, key: KeyEvent) => Promise<void>;
3
- export declare function useStableKeyHandler(handleKey: AppKeyHandler): AppKeyHandler;
3
+ /**
4
+ * Returns an identity-stable key handler that always calls the latest
5
+ * `handleKey`. A rejected key handler must never kill the process, but it
6
+ * must not vanish either: `onError` receives the failure so the host can
7
+ * surface it (an error entry in the transcript). Without `onError` the
8
+ * failure is still contained.
9
+ */
10
+ export declare function useStableKeyHandler(handleKey: AppKeyHandler, onError?: (err: unknown) => void): AppKeyHandler;
4
11
  export {};
5
12
  //# sourceMappingURL=use-stable-key-handler.d.ts.map
@@ -1,6 +1,7 @@
1
1
  import type { Agent } from '@wrongstack/core/agent';
2
+ import type { AutonomyStage } from './use-statusline-state.js';
2
3
  interface UseStatusSyncIntervalOptions {
3
- getAutonomy?: (() => string) | undefined;
4
+ getAutonomy?: (() => AutonomyStage) | undefined;
4
5
  getYolo?: (() => boolean) | undefined;
5
6
  getModeLabel?: (() => string) | undefined;
6
7
  getEternalEngine?: unknown;
@@ -11,7 +12,7 @@ interface UseStatusSyncIntervalOptions {
11
12
  liveModeLabel: string;
12
13
  liveModel: string;
13
14
  liveProvider: string;
14
- setAutonomyLive: (v: any) => void;
15
+ setAutonomyLive: (v: AutonomyStage) => void;
15
16
  setYoloLive: (v: boolean) => void;
16
17
  setLiveModeLabel: (v: string) => void;
17
18
  setLiveModel: (v: string) => void;
@@ -34,12 +34,12 @@ interface StatusbarViewModelOptions {
34
34
  */
35
35
  tokenRefresh?: TokenRefreshData;
36
36
  }
37
- interface PlanCounts {
37
+ export interface PlanCounts {
38
38
  open: number;
39
39
  inProgress: number;
40
40
  done: number;
41
41
  }
42
- interface TaskCounts {
42
+ export interface TaskCounts {
43
43
  pending: number;
44
44
  inProgress: number;
45
45
  completed: number;
@@ -1,3 +1,4 @@
1
+ import { getIndexState } from '@wrongstack/tools';
1
2
  import type { AppProps } from '../app-props.js';
2
3
  type EnvironmentProps = Omit<Pick<AppProps, 'events' | 'memoryStore' | 'model' | 'provider' | 'effectiveMaxContext' | 'yolo' | 'getAutonomy' | 'modeLabel' | 'statuslineHiddenItems' | 'statuslineLines' | 'statuslineDensities' | 'statuslineOrder' | 'toolCount' | 'getSettings' | 'setStatuslineHiddenItems' | 'saveStatuslineHiddenItems' | 'setStatuslineLines' | 'saveStatuslineLines' | 'setStatuslineDensities' | 'saveStatuslineDensities' | 'setStatuslineOrder' | 'saveStatuslineOrder'>, 'yolo'> & {
3
4
  yolo: boolean;
@@ -45,5 +46,7 @@ export declare function useTuiEnvironmentState({ events, memoryStore, model, pro
45
46
  };
46
47
  breakerCountdown: import("@wrongstack/tools").BreakerCountdown | null;
47
48
  };
49
+ /** Everything the index status chip renders; equal keys draw an equal chip. */
50
+ export declare function indexChipKey(state: ReturnType<typeof getIndexState>): string;
48
51
  export {};
49
52
  //# sourceMappingURL=use-tui-environment-state.d.ts.map
@@ -4,6 +4,18 @@ type ClearHistoryDispatch = React.Dispatch<{
4
4
  type: 'clearHistory';
5
5
  model?: string | undefined;
6
6
  provider?: string | undefined;
7
+ /**
8
+ * When explicitly `null`, the reducer treats the boot-time restored
9
+ * transcript as discarded and resets `historyBudget`, `autoProceedHold`,
10
+ * and `nextId` to the fresh-boot values. `/clear` passes `null` for
11
+ * all three so the screen genuinely looks like first launch. Pass
12
+ * `undefined` (or omit) to preserve the existing resume-derived
13
+ * budget/hold — the behavior the bridge uses for `session.rewound` /
14
+ * `project.switched`.
15
+ */
16
+ restoredMessages?: readonly unknown[] | null | undefined;
17
+ restoredToolCalls?: readonly unknown[] | null | undefined;
18
+ restoredEvents?: readonly unknown[] | null | undefined;
7
19
  } | {
8
20
  type: 'resetContextChip';
9
21
  } | {
@@ -61,7 +61,7 @@ export interface UseWindowedPickerOptions {
61
61
  * 24-row terminal even when the input bar or status bar grows.
62
62
  */
63
63
  readonly maxRows?: number | undefined;
64
- /** Minimum visible options even on a tiny terminal. Defaults to 3. */
64
+ /** Legacy minimum without a measured maxRows budget. Defaults to 3. */
65
65
  readonly minVisible?: number | undefined;
66
66
  }
67
67
  export interface WindowedPickerSlice {
@@ -82,9 +82,8 @@ export interface WindowedPickerSlice {
82
82
  * Behavior contract:
83
83
  * - Visible count is `floor((available - chrome - markers) / rowSpan)`
84
84
  * where `available` is either `maxRows` (measured) or
85
- * `rows - shellReservedRows` (guessed), clamped to `[minVisible, total]`.
86
- * A 1-row terminal always shows at least `minVisible` options even if
87
- * that overflows — better to bleed than to hide the focused row.
85
+ * `rows - shellReservedRows` (guessed). Measured budgets show at least
86
+ * one focused option; only the legacy guessed budget uses minVisible.
88
87
  * - The window stays centered on `selected` once the picker is past the
89
88
  * first page; on the first page it stays top-aligned so the user sees
90
89
  * the list start. `selected < 0 || selected >= total` is treated as no