@wrongstack/tui 0.313.1 → 0.316.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/app-action-type.d.ts +56 -0
  2. package/dist/app-initial-state.d.ts +2 -1
  3. package/dist/app-props.d.ts +45 -2
  4. package/dist/app-settings-type.d.ts +7 -0
  5. package/dist/app-state-core-types.d.ts +18 -0
  6. package/dist/app-state.d.ts +42 -0
  7. package/dist/app-status-region.d.ts +1 -1
  8. package/dist/app-view-contract.d.ts +2 -1
  9. package/dist/app-view-pickers.d.ts +2 -1
  10. package/dist/app-view-sidebar.d.ts +2 -1
  11. package/dist/brain-panel-model.d.ts +0 -2
  12. package/dist/checkpoint-retention.d.ts +2 -3
  13. package/dist/components/agents-monitor.d.ts +3 -3
  14. package/dist/components/auth-panel.d.ts +2 -1
  15. package/dist/components/brain-decision-prompt.d.ts +2 -1
  16. package/dist/components/clear-confirm-panel.d.ts +4 -3
  17. package/dist/components/composer-status-chip.d.ts +3 -2
  18. package/dist/components/confirm-prompt.d.ts +2 -1
  19. package/dist/components/context-panel.d.ts +2 -1
  20. package/dist/components/continue-confirm-panel.d.ts +3 -2
  21. package/dist/components/coordinator-panel.d.ts +2 -1
  22. package/dist/components/cron-jobs.d.ts +2 -1
  23. package/dist/components/design-picker.d.ts +2 -1
  24. package/dist/components/enhance-panel.d.ts +4 -3
  25. package/dist/components/esc-confirm-prompt.d.ts +2 -1
  26. package/dist/components/exit-confirm-panel.d.ts +3 -2
  27. package/dist/components/f-key-picker.d.ts +1 -2
  28. package/dist/components/fallback-overlay.d.ts +2 -1
  29. package/dist/components/fleet-monitor.d.ts +2 -1
  30. package/dist/components/fleet-panel.d.ts +4 -4
  31. package/dist/components/goal-kanban-panel.d.ts +2 -1
  32. package/dist/components/help-overlay.d.ts +2 -1
  33. package/dist/components/help-panel.d.ts +2 -1
  34. package/dist/components/history/code-block-diff-helpers.d.ts +1 -6
  35. package/dist/components/history/code-block.d.ts +0 -2
  36. package/dist/components/history/copy-registry.d.ts +2 -1
  37. package/dist/components/history/index.d.ts +2 -2
  38. package/dist/components/history/replay.d.ts +2 -1
  39. package/dist/components/history/sage-memory-block.d.ts +0 -6
  40. package/dist/components/history/scroll-controller-types.d.ts +7 -12
  41. package/dist/components/history/selection-band-store.d.ts +3 -2
  42. package/dist/components/history/selection-helpers.d.ts +24 -65
  43. package/dist/components/history/tool-card.d.ts +2 -1
  44. package/dist/components/history/tool-group.d.ts +0 -7
  45. package/dist/components/history/use-history-controller.d.ts +2 -1
  46. package/dist/components/history/utils.d.ts +1 -1
  47. package/dist/components/history/wrap-geometry.d.ts +18 -125
  48. package/dist/components/history.d.ts +1 -1
  49. package/dist/components/kanban-panel.d.ts +7 -25
  50. package/dist/components/live-activity-strip.d.ts +2 -1
  51. package/dist/components/mailbox-panel.d.ts +2 -1
  52. package/dist/components/mcp-picker.d.ts +2 -1
  53. package/dist/components/mode-picker.d.ts +2 -1
  54. package/dist/components/model-picker.d.ts +2 -1
  55. package/dist/components/monitor-shell.d.ts +3 -2
  56. package/dist/components/phase-monitor.d.ts +2 -1
  57. package/dist/components/plan-panel.d.ts +3 -2
  58. package/dist/components/plugin-picker.d.ts +2 -1
  59. package/dist/components/powerline-rail.d.ts +2 -1
  60. package/dist/components/project-picker.d.ts +2 -1
  61. package/dist/components/prompt-picker.d.ts +2 -1
  62. package/dist/components/refine-countdown-panel.d.ts +3 -2
  63. package/dist/components/refine-failure-panel.d.ts +2 -1
  64. package/dist/components/resource-menu.d.ts +2 -1
  65. package/dist/components/resume-picker.d.ts +2 -1
  66. package/dist/components/scrollable-history.d.ts +2 -2
  67. package/dist/components/send-mode-picker.d.ts +3 -2
  68. package/dist/components/sessions-panel.d.ts +2 -1
  69. package/dist/components/settings-picker-filter.d.ts +2 -1
  70. package/dist/components/settings-picker.d.ts +3 -1
  71. package/dist/components/shadow-panel.d.ts +2 -1
  72. package/dist/components/shell-command-warning.d.ts +2 -1
  73. package/dist/components/sidebar-content.d.ts +4 -9
  74. package/dist/components/sidebar-panel-frame.d.ts +2 -13
  75. package/dist/components/sidebar.d.ts +2 -1
  76. package/dist/components/skill-picker.d.ts +2 -1
  77. package/dist/components/slash-confirm-panel.d.ts +3 -2
  78. package/dist/components/slash-menu.d.ts +2 -1
  79. package/dist/components/status-bar-format.d.ts +2 -0
  80. package/dist/components/status-bar-icons.d.ts +4 -0
  81. package/dist/components/status-bar-rails.d.ts +19 -6
  82. package/dist/components/status-bar-types.d.ts +18 -0
  83. package/dist/components/status-bar.d.ts +17 -7
  84. package/dist/components/status-line-registry.d.ts +62 -0
  85. package/dist/components/statusline-picker.d.ts +5 -27
  86. package/dist/components/theme-picker.d.ts +2 -1
  87. package/dist/components/theme-preview.d.ts +2 -1
  88. package/dist/components/tools-picker.d.ts +2 -1
  89. package/dist/components/topic-check-panel.d.ts +2 -1
  90. package/dist/connections-slash.d.ts +2 -1
  91. package/dist/context-fill.d.ts +4 -3
  92. package/dist/context-slash.d.ts +3 -2
  93. package/dist/cron-slash.d.ts +2 -1
  94. package/dist/esc-close-panels.d.ts +2 -1
  95. package/dist/f-key-panels.d.ts +1 -1
  96. package/dist/git-info.d.ts +22 -3
  97. package/dist/height-cache.d.ts +2 -8
  98. package/dist/history-entry.d.ts +4 -3
  99. package/dist/history-retention.d.ts +16 -6
  100. package/dist/hit-test.d.ts +2 -1
  101. package/dist/hooks/subagent-history-format.d.ts +2 -1
  102. package/dist/hooks/use-app-session-state.d.ts +2 -1
  103. package/dist/hooks/use-auth-panel.d.ts +2 -1
  104. package/dist/hooks/use-brain-panel.d.ts +2 -1
  105. package/dist/hooks/use-chip-staleness-guard.d.ts +4 -3
  106. package/dist/hooks/use-core-tui-commands.d.ts +1 -1
  107. package/dist/hooks/use-director-fleet-bridge.d.ts +2 -4
  108. package/dist/hooks/use-exit-command.d.ts +1 -1
  109. package/dist/hooks/use-file-search.d.ts +3 -7
  110. package/dist/hooks/use-fleet-generation-gate.d.ts +2 -1
  111. package/dist/hooks/use-git-session-status.d.ts +1 -1
  112. package/dist/hooks/use-history-archive.d.ts +3 -2
  113. package/dist/hooks/use-input-history-persistence.d.ts +2 -1
  114. package/dist/hooks/use-mode-picker.d.ts +2 -1
  115. package/dist/hooks/use-model-pick.d.ts +2 -1
  116. package/dist/hooks/use-next-steps-auto-submit.d.ts +2 -2
  117. package/dist/hooks/use-panel-controllers.d.ts +3 -1
  118. package/dist/hooks/use-paste-handling.d.ts +2 -1
  119. package/dist/hooks/use-prompt-picker.d.ts +4 -3
  120. package/dist/hooks/use-session-rewind.d.ts +2 -1
  121. package/dist/hooks/use-shadow-panel.d.ts +2 -1
  122. package/dist/hooks/use-sidebar-panel-data.d.ts +4 -3
  123. package/dist/hooks/use-status-sync-interval.d.ts +2 -1
  124. package/dist/hooks/use-statusline-hidden-sync.d.ts +2 -1
  125. package/dist/hooks/use-statusline-state.d.ts +9 -3
  126. package/dist/hooks/use-stream-chip-expiration.d.ts +3 -2
  127. package/dist/hooks/use-terminal-size.d.ts +3 -2
  128. package/dist/hooks/use-theme-picker-handler.d.ts +2 -1
  129. package/dist/hooks/use-tui-activity.d.ts +2 -1
  130. package/dist/hooks/use-tui-controllers.d.ts +2 -1
  131. package/dist/hooks/use-tui-environment-state.d.ts +7 -5
  132. package/dist/hooks/use-tui-event-bridge.d.ts +1 -1
  133. package/dist/index.js +8509 -8341
  134. package/dist/ink.d.ts +1 -1
  135. package/dist/input-editing.d.ts +2 -1
  136. package/dist/input-tokens.d.ts +2 -1
  137. package/dist/input-validation/action-types.d.ts +1 -1
  138. package/dist/input-validation.d.ts +4 -4
  139. package/dist/kanban-slash.d.ts +8 -32
  140. package/dist/layout-store.d.ts +2 -1
  141. package/dist/markdown-table.d.ts +1 -3
  142. package/dist/memory-context-monitor.d.ts +3 -2
  143. package/dist/memory-lifecycle-entry.d.ts +2 -1
  144. package/dist/memory-slash-format.d.ts +0 -1
  145. package/dist/mouse.d.ts +3 -2
  146. package/dist/overlay-key-router.d.ts +5 -4
  147. package/dist/paste-accumulator.d.ts +3 -2
  148. package/dist/prompt-refinement-start.d.ts +1 -1
  149. package/dist/reducers/composer.d.ts +1 -1
  150. package/dist/reducers/conversation.d.ts +1 -1
  151. package/dist/reducers/helpers.d.ts +16 -3
  152. package/dist/resume-load.d.ts +131 -0
  153. package/dist/run-blocks-controller.d.ts +2 -1
  154. package/dist/run-tui-client-registration.d.ts +3 -2
  155. package/dist/run-tui-options.d.ts +35 -2
  156. package/dist/run-tui-teardown.d.ts +2 -1
  157. package/dist/run-tui-title-controller.d.ts +2 -1
  158. package/dist/scroll-anchor.d.ts +2 -4
  159. package/dist/slash-command-lifecycle.d.ts +2 -1
  160. package/dist/submit-history.d.ts +2 -1
  161. package/dist/submit-prompt-refinement.d.ts +3 -2
  162. package/dist/terminal-title.d.ts +2 -1
  163. package/dist/theme.d.ts +2 -2
  164. package/dist/token-previews.d.ts +2 -1
  165. package/dist/tui-host-capabilities.d.ts +1 -1
  166. package/dist/tui-memory-counters.d.ts +2 -1
  167. package/dist/ui-contracts.d.ts +1 -1
  168. package/dist/ui-glyphs.d.ts +3 -1
  169. package/dist/workbench-slash.d.ts +2 -1
  170. package/package.json +8 -8
  171. package/dist/react-children-flatten.d.ts +0 -28
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  import type { FleetEntry } from '../app-state.js';
3
- export interface FleetMonitorProps {
3
+ interface FleetMonitorProps {
4
4
  entries: Record<string, FleetEntry>;
5
5
  /** Fleet-wide accumulated cost. */
6
6
  totalCost: number;
@@ -57,4 +57,5 @@ export declare function fmtModelLabel(provider?: string, model?: string): string
57
57
  * timeline to prevent unbounded growth in long-running sessions.
58
58
  */
59
59
  export declare function FleetMonitor({ entries, totalCost, totalTokens, maxConcurrent, nowTick, collabSession, }: FleetMonitorProps): React.ReactElement;
60
+ export {};
60
61
  //# sourceMappingURL=fleet-monitor.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import type { TodoItem } from '@wrongstack/core/agent';
2
2
  import type React from 'react';
3
3
  import type { FleetEntry } from '../app-state.js';
4
- export interface FleetPanelProps {
4
+ interface FleetPanelProps {
5
5
  /** Per-subagent state, keyed by subagentId. */
6
6
  entries: Record<string, FleetEntry>;
7
7
  /** Fleet-wide accumulated cost (from FleetUsageAggregator). */
@@ -25,7 +25,7 @@ export interface FleetPanelProps {
25
25
  maxWidth?: number | undefined;
26
26
  }
27
27
  type SwarmColor = 'blue' | 'cyan' | 'green' | 'gray' | 'red' | 'yellow';
28
- export interface SwarmCell {
28
+ interface SwarmCell {
29
29
  id: string;
30
30
  index: string;
31
31
  name: string;
@@ -38,13 +38,13 @@ export interface SwarmCell {
38
38
  color: SwarmColor;
39
39
  dim?: boolean | undefined;
40
40
  }
41
- export interface SwarmGrid {
41
+ interface SwarmGrid {
42
42
  columns: number;
43
43
  tileWidth: number;
44
44
  overflow: number;
45
45
  rows: SwarmCell[][];
46
46
  }
47
- export interface TodoPreviewRow {
47
+ interface TodoPreviewRow {
48
48
  id: string;
49
49
  marker: string;
50
50
  text: string;
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  import type { GoalSummary } from '../app-state.js';
3
- export interface GoalKanbanPanelProps {
3
+ interface GoalKanbanPanelProps {
4
4
  projectRoot: string;
5
5
  goal: GoalSummary | null;
6
6
  onClose: () => void;
@@ -11,4 +11,5 @@ export interface GoalKanbanPanelProps {
11
11
  * tasks in columns (Backlog → In Progress → Done) with live auto-refresh.
12
12
  */
13
13
  export declare function GoalKanbanPanel({ projectRoot, goal, onClose, }: GoalKanbanPanelProps): React.ReactElement;
14
+ export {};
14
15
  //# sourceMappingURL=goal-kanban-panel.d.ts.map
@@ -5,7 +5,7 @@ export interface HelpEntry {
5
5
  /** What it does. */
6
6
  desc: string;
7
7
  }
8
- export interface HelpSection {
8
+ interface HelpSection {
9
9
  title: string;
10
10
  entries: HelpEntry[];
11
11
  }
@@ -24,4 +24,5 @@ export declare function helpSections(): HelpSection[];
24
24
  * so all legend entries fit without scrolling.
25
25
  */
26
26
  export declare function HelpOverlay(): React.ReactElement;
27
+ export {};
27
28
  //# sourceMappingURL=help-overlay.d.ts.map
@@ -6,11 +6,12 @@ export interface HelpEntry {
6
6
  aliases?: string[] | undefined;
7
7
  argsHint?: string | undefined;
8
8
  }
9
- export interface HelpPanelProps {
9
+ interface HelpPanelProps {
10
10
  entries: HelpEntry[];
11
11
  filter: string;
12
12
  selected: number;
13
13
  hint?: string | undefined;
14
14
  }
15
15
  export declare function HelpPanel({ entries, filter, selected, hint, }: HelpPanelProps): React.ReactElement;
16
+ export {};
16
17
  //# sourceMappingURL=help-panel.d.ts.map
@@ -1,13 +1,8 @@
1
- interface ReplaceDiffItem {
2
- path?: string | undefined;
3
- diff: string;
4
- }
5
- export interface PathedDiffItem {
1
+ interface PathedDiffItem {
6
2
  path?: string | undefined;
7
3
  diff: string;
8
4
  }
9
5
  export declare function joinReplaceDiffs(obj: Record<string, unknown>): string | undefined;
10
- export declare function splitReplaceDiffs(obj: Record<string, unknown>): ReplaceDiffItem[];
11
6
  export declare function countUnifiedDiffChanges(diff: string): {
12
7
  added: number;
13
8
  removed: number;
@@ -20,8 +20,6 @@ interface OmittedDiffSummary {
20
20
  export type DiffFilePreviews = DiffFilePreview[] & {
21
21
  omitted?: OmittedDiffSummary | undefined;
22
22
  };
23
- /** Max code-block lines rendered before a "+N more" footer. */
24
- export declare const MAX_CODE_LINES = 80;
25
23
  /**
26
24
  * Hard ceiling for one file's rendered diff preview. Diff rows are React/Ink
27
25
  * elements and therefore retained by the active virtual-history window; an
@@ -1,7 +1,7 @@
1
1
  import type { EntryHeightCache } from '../../height-cache.js';
2
2
  import type { CopyHit } from './copy-geometry.js';
3
3
  import { type RenderGroup } from './tool-group.js';
4
- export interface CopyRegistry {
4
+ interface CopyRegistry {
5
5
  hits: CopyHit[];
6
6
  liveHit: CopyHit | null;
7
7
  }
@@ -25,4 +25,5 @@ export declare function buildCopyRegistry(opts: {
25
25
  showModelReasoning?: boolean | undefined;
26
26
  liveToolVisible: boolean;
27
27
  }): CopyRegistry;
28
+ export {};
28
29
  //# sourceMappingURL=copy-registry.d.ts.map
@@ -1,11 +1,11 @@
1
1
  import type React from 'react';
2
2
  import type { HistoryProps } from './types.js';
3
- export { AssistantBody, assistantContentWidth, MESSAGE_PANEL_BORDER_WIDTH, MESSAGE_PANEL_CHROME_WIDTH, MESSAGE_PANEL_MARGIN, splitFencedBlocks, } from './assistant.js';
3
+ export { AssistantBody, assistantContentWidth, MESSAGE_PANEL_BORDER_WIDTH, MESSAGE_PANEL_CHROME_WIDTH, splitFencedBlocks } from './assistant.js';
4
4
  export { Banner } from './banner.js';
5
5
  export { CodeBlock, DiffBlock, DiffFileBlock, type DiffFilePreview, type DiffLineKind, type DiffLineRow, type DiffPreview, extractDiffPreview, extractMultiFileDiffs, extractReplaceDiffs, formatDiffStats, formatMultiDiffSummary, MULTI_DIFF_MAX_FILES, MULTI_DIFF_MAX_ROWS, MULTI_DIFF_SUMMARY_THRESHOLD, type MultiDiffSummary, parseUnifiedDiff, summarizeMultiFileDiffs, } from './code-block.js';
6
6
  export { Entry } from './entry.js';
7
7
  export type { AutonomyAgentStatus, BodySegment, HistoryEntry, HistoryProps } from './types.js';
8
- export { countLines, firstNonEmpty, fmtBytes, fmtDuration, fmtTok, formatMatchHit, formatToolArgs, formatToolOutput, formatToolVisualOutput, MAX_STREAM_DISPLAY_CHARS, numOf, previewArgs, previewOutput, scanNumberedRange, shortenPath, streamBoxRows, stringOf, ToolOutputLines, ToolStreamBox, type ToolVisualLine, type ToolVisualLineKind, tailForDisplay, toolStreamBoxHeight, truncMid, tryParseJson, } from './utils.js';
8
+ export { countLines, firstNonEmpty, fmtBytes, fmtDuration, fmtTok, formatMatchHit, formatToolArgs, formatToolOutput, formatToolVisualOutput, MAX_STREAM_DISPLAY_CHARS, numOf, scanNumberedRange, shortenPath, streamBoxRows, stringOf, ToolOutputLines, ToolStreamBox, type ToolVisualLine, type ToolVisualLineKind, tailForDisplay, toolStreamBoxHeight, truncMid, tryParseJson } from './utils.js';
9
9
  /**
10
10
  * History component — renders committed entries via <Static> so they
11
11
  * flow into terminal scrollback.
@@ -6,7 +6,8 @@ import type { HistoryEntry } from './types.js';
6
6
  * backbone — user/assistant/system text, thinking blocks, and tool calls with
7
7
  * their input + output) and interleaves the audit `events` marker stream
8
8
  * (mode/compaction/checkpoint/skill/agent/error/retry/truncation) at their
9
- * chronological positions.
9
+ * chronological positions. Subagent/delegate lifecycle markers are excluded
10
+ * from the main resume screen.
10
11
  *
11
12
  * Ordering is a two-pointer merge of two already-chronological sequences
12
13
  * (message backbone by construction, marker events by JSONL order) so the
@@ -1,5 +1,4 @@
1
1
  import type React from 'react';
2
- import { type ParsedSageMemoryLine } from './utils.js';
3
2
  /**
4
3
  * Compact magenta-bordered panel rendering SAGE memory-injection lines
5
4
  * appended to a tool result. Renders nothing when `sageLines` is empty.
@@ -31,11 +30,6 @@ export declare function SageMemoryBlock({ sageLines, toolName, stats, compact, }
31
30
  */
32
31
  compact?: boolean | undefined;
33
32
  }): React.ReactElement | null;
34
- /** One parsed memory, rendered as a structured key/value row block. */
35
- export declare function SageMemoryRow({ parsed, index, }: {
36
- parsed: ParsedSageMemoryLine;
37
- index: number;
38
- }): React.ReactElement;
39
33
  /** Compact key/value row used inside `SageMemoryRow`. */
40
34
  export declare function SageKv({ label, value }: {
41
35
  label: string;
@@ -63,18 +63,13 @@ export interface HistoryScrollController {
63
63
  * margin-click behavior. Gutterless kinds (info, memory-lifecycle, tool
64
64
  * groups, …) pass the column through unchanged.
65
65
  *
66
- * Known limitation: `warn` rows still render a `⚠ ` prefix inline with no
67
- * prefix translation (the wrap map covers assistant/thinking/user/info —
68
- * see wrap-geometry.ts). User cards WITH a paste block also keep the v1
69
- * naive path: they render two text regions while the copy base holds one.
70
- *
71
- * Inline prefixes (user `👤 USER ` label, info `ℹ ` icon) are translated
72
- * row-aware in the assembler: the wrap map wraps `prefix + first line`
73
- * together exactly as the renderer's single Text node does, and
74
- * resolveRowCol shifts row-0 columns past the measured prefix width
75
- * (string-width cells), clamping label/icon clicks to the text start —
76
- * the same margin-click semantics as the gutter clamp above. Constants
77
- * are single-sourced in wrap-geometry.ts and consumed by entry.tsx.
66
+ * Copy contract (block-based): the selection rect only decides WHICH
67
+ * blocks it touches — every touched block is copied in full via
68
+ * copyableTextForEntry (the same payload the copy icon writes), so inline
69
+ * chrome (card gutter, `👤 USER ` label, `ℹ ` icon) neither leaks into
70
+ * nor offsets the payload. Columns still drive the GESTURE: band bounds
71
+ * (`isOutOfBand`), the highlight band, and the drag-vs-click distinction
72
+ * (a zero-size selection commits nothing).
78
73
  */
79
74
  beginSelection(row: number, col: number): void;
80
75
  /**
@@ -15,14 +15,14 @@
15
15
  * drag that holds the same row span doesn't spam listeners.
16
16
  */
17
17
  /** Row span of an in-progress drag, in viewport rows (0-based, inclusive). */
18
- export interface SelectionBand {
18
+ interface SelectionBand {
19
19
  readonly topRow: number;
20
20
  readonly bottomRow: number;
21
21
  /** Row under the live drag head — rendered denser so the user can see
22
22
  * where the gesture currently points. */
23
23
  readonly headRow: number;
24
24
  }
25
- export type SelectionBandSnapshot = SelectionBand | null;
25
+ type SelectionBandSnapshot = SelectionBand | null;
26
26
  export interface SelectionBandStore {
27
27
  subscribe(listener: () => void): () => void;
28
28
  getSnapshot(): SelectionBandSnapshot;
@@ -35,4 +35,5 @@ export declare function bandFromSelection(anchor: {
35
35
  row: number;
36
36
  }): SelectionBand;
37
37
  export declare function createSelectionBandStore(): SelectionBandStore;
38
+ export {};
38
39
  //# sourceMappingURL=selection-band-store.d.ts.map
@@ -32,44 +32,17 @@ export declare function normalizeSelection(a: {
32
32
  * calling into the controller — we only check the band bounds here. */
33
33
  export declare function isOutOfBand(col: number, termWidth: number): boolean;
34
34
  /**
35
- * One entry's contribution to a drag-selected range. Returned in document
36
- * (row-index-in-card) coordinates so the caller decides how to slice into
37
- * the entry's source text. `start` is the column inside the card (0-based
38
- * from the left edge of the card's visible rectangle, NOT the terminal
39
- * column — the gutter is excluded by the caller before reaching here).
40
- * `end` is inclusive. When `startRow === endRow`, the slice is one row; the
41
- * caller is responsible for translating text columns into source offsets.
42
- */
43
- export interface SelectionSlice {
44
- entryId: number;
45
- /** Inclusive row-in-card for the start of the slice. */
46
- startRow: number;
47
- /** Inclusive column, 0-based, inside the card's text area (gutter excluded). */
48
- startCol: number;
49
- /** Inclusive end row. */
50
- endRow: number;
51
- /** Inclusive end column, 0-based. */
52
- endCol: number;
53
- }
54
- /**
55
- * Translate a viewport-cell selection into per-entry row/col slices, walking
56
- * the same mounted-group geometry the copy-hit registry uses so the two
57
- * systems share one row index. Entries wholly outside the selection return
58
- * nothing. Entries whose vertical span is wholly inside the selection are
59
- * returned as a single row-range; entries the selection clips at the top or
60
- * bottom are returned with row bounds matching the clip.
61
- *
62
- * `cardVisibleCols` is the number of columns inside the card the user can
63
- * see — the band width minus the right gutter (`viewportWidth - SCROLLBAR_HIT_WIDTH`).
64
- * Slices never include the gutter or any column to its right; the caller has
65
- * already validated that.
35
+ * Ordered ids of the head entries whose visible rows the selection touches.
36
+ * A block counts as touched when the selection rectangle overlaps ANY of its
37
+ * viewport rows — even a single row — which is what makes the copy
38
+ * block-based: partial vertical contact yields the whole block.
66
39
  *
67
- * Returned slices are in document (entry-local) coordinates: `startRow`/`endRow`
68
- * are rows inside the entry's own geometry, NOT viewport cells. This is what
69
- * the assembler needs to recover text — slicing into the raw entry text uses
70
- * per-row layout, which the caller resolves via the layout store.
40
+ * `cards` are the mounted spans in document order (as produced by
41
+ * `buildMountedCardSpans`), so the returned ids follow the same top-to-bottom
42
+ * order the blocks appear in on screen, regardless of drag direction
43
+ * (`normalizeSelection` has already ordered the rect).
71
44
  */
72
- export declare function selectionToSlices(opts: {
45
+ export declare function selectionTouchedEntryIds(opts: {
73
46
  selection: SelectionRect;
74
47
  cards: ReadonlyArray<{
75
48
  entryId: number;
@@ -78,41 +51,27 @@ export declare function selectionToSlices(opts: {
78
51
  /** 0-based viewport row just past the card's last visible row. */
79
52
  viewportEndRow: number;
80
53
  }>;
81
- cardVisibleCols: number;
82
- }): SelectionSlice[];
54
+ }): number[];
83
55
  /**
84
- * Build the clipboard payload for a selection by slicing into each affected
85
- * entry's full renderable text. The v1 contract is line-then-column on the
86
- * entry's source text: each slice exposes `startRow`/`endRow` and
87
- * `startCol`/`endCol` in card-local coordinates; we split the entry's
88
- * text on `\n`, keep only the rows inside the row range, and within those
89
- * rows apply the column range. The matrix matches what the source line
90
- * index would be when no wrapping occurs — i.e. one card row maps to one
91
- * source line. Wrap-geometry translation is intentionally absent in v1
92
- * because the layout store does not yet expose per-card-row wrap segments;
93
- * it returns when those segments exist and a v1.1 test demands it.
56
+ * Build the clipboard payload for a block-based selection: every touched
57
+ * head id contributes its block's FULL copyable text, in the order given
58
+ * (the assembler never reorders or slices).
94
59
  *
95
- * `toolGroupsByHeadId` lets a multi-member tool-group expand: when the
96
- * head id appears with `entryIds.length > 1`, the assembler copies via
97
- * `copyableTextForEntries` (raw ordered JSON of every member, matching
98
- * the existing copy-icon contract). A single-entry head falls through
99
- * to `copyableTextForEntry`.
60
+ * `toolGroupsByHeadId` lets a multi-member tool-group expand as ONE block:
61
+ * when the head id maps to member ids, the block copies via
62
+ * `copyableTextForEntries` (raw ordered JSON of every member, matching the
63
+ * existing copy-icon contract). A single-entry head falls through to
64
+ * `copyableTextForEntry`.
100
65
  *
101
- * Multi-entry selections are joined with `\n---\n` so the user can see
102
- * where one card ends and the next begins. Empty selections and
103
- * selections that resolve to no text return `""` so the caller can fall
104
- * through silently.
66
+ * Multiple touched blocks are joined with `\n---\n` so the user can see
67
+ * where one card ends and the next begins. Unknown ids (entries no longer
68
+ * retained) and blocks that resolve to empty text are skipped; a selection
69
+ * that resolves to no text returns `""` so the caller can fall through
70
+ * silently.
105
71
  */
106
72
  export declare function assembleSelectionText(opts: {
107
- slices: readonly SelectionSlice[];
73
+ entryIds: readonly number[];
108
74
  entriesById: ReadonlyMap<number, HistoryEntry>;
109
75
  toolGroupsByHeadId?: ReadonlyMap<number, readonly number[]> | undefined;
110
- /**
111
- * Render width used to build the wrap-aware row→line translation for
112
- * assistant/thinking cards (v1.1 M4). When omitted, wrapped kinds fall
113
- * back to the v1 naive mapping below — callers that cannot know the
114
- * width keep their existing behavior.
115
- */
116
- termWidth?: number | undefined;
117
76
  }): string;
118
77
  //# sourceMappingURL=selection-helpers.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import type React from 'react';
2
- export interface ToolCardProps {
2
+ interface ToolCardProps {
3
3
  glyph: string;
4
4
  color: string;
5
5
  title: string;
@@ -17,4 +17,5 @@ export interface ToolCardProps {
17
17
  * easy to scan in long transcripts.
18
18
  */
19
19
  export declare function ToolCard({ glyph, color, title, detail, meta, ok, termWidth, hasBody, children, }: ToolCardProps): React.ReactElement;
20
+ export {};
20
21
  //# sourceMappingURL=tool-card.d.ts.map
@@ -35,13 +35,6 @@ export type RenderGroup = {
35
35
  type: 'tool-group';
36
36
  data: ToolGroupData;
37
37
  };
38
- /**
39
- * Hard ceiling for one rendered tool group. A group is a virtualization unit,
40
- * so allowing an arbitrarily long same-tool run (for example 400 consecutive
41
- * reads) would mount the whole run on every streaming redraw and defeat the
42
- * bounded history window.
43
- */
44
- export declare const MAX_TOOL_GROUP_ENTRIES = 12;
45
38
  /** Stable id used by the height cache and React keys for a render group. */
46
39
  export declare function renderGroupId(group: RenderGroup): number;
47
40
  /** Conservative, bounded row estimate used before a group is measured. */
@@ -4,7 +4,7 @@ import type { HistoryScrollController } from './scroll-controller-types.js';
4
4
  import type { MountedCardSpan } from './scrollbar-geometry.js';
5
5
  import { type SelectionBandStore } from './selection-band-store.js';
6
6
  import type { HistoryEntry } from './types.js';
7
- export interface UseHistoryControllerOptions {
7
+ interface UseHistoryControllerOptions {
8
8
  geometry: ScrollGeometry;
9
9
  effectiveAnchor: ScrollAnchor | null;
10
10
  groupIds: readonly number[];
@@ -68,4 +68,5 @@ export declare function useHistoryController(opts: UseHistoryControllerOptions):
68
68
  current: readonly number[];
69
69
  };
70
70
  };
71
+ export {};
71
72
  //# sourceMappingURL=use-history-controller.d.ts.map
@@ -1,4 +1,4 @@
1
- export { countLines, firstNonEmpty, fmtBytes, fmtDuration, fmtTok, formatMatchHit, numOf, previewArgs, previewOutput, scanNumberedRange, shortenPath, stringOf, truncMid, tryParseJson, } from './basic-format.js';
1
+ export { countLines, firstNonEmpty, fmtBytes, fmtDuration, fmtTok, formatMatchHit, numOf, scanNumberedRange, shortenPath, stringOf, truncMid, tryParseJson } from './basic-format.js';
2
2
  export { MAX_STREAM_DISPLAY_CHARS, streamBoxRows, ToolStreamBox, tailForDisplay, toolStreamBoxHeight, } from './stream-box.js';
3
3
  export { ToolOutputLines } from './visual-lines.js';
4
4
  export type { ToolVisualLine, ToolVisualLineKind } from './tool-visual-types.js';
@@ -1,130 +1,23 @@
1
1
  /**
2
- * Wrap-aware card-row → source-text translation for drag-selection text
3
- * recovery (v1.1 item M4).
4
- *
5
- * v1's assembler indexed the entry's source lines by the card's VISUAL row,
6
- * which equals the source line only when no line wraps. Any wrapped line
7
- * desynchronizes the index and garbles the copied text. This module supplies
8
- * the per-row mapping against the entry's SOURCE text (sanitized, with the
9
- * assistant next-steps block stripped exactly like the renderer).
10
- *
11
- * Exactness boundary: the mapping is EXACT for plain prose and thinking text
12
- * — MarkdownView renders those lines as-is and Ink wraps them with the same
13
- * wrap-ansi call mirrored below. For assistant text containing markdown
14
- * STRUCTURE (headings, lists, tables, fenced code), MarkdownView restyles
15
- * the render (heading styles, bullet glyphs, table layout), so the visual
16
- * rows can diverge from this source-text map. The copy semantics are
17
- * deliberately source-based in that case: a drag recovers what the model
18
- * wrote, not the renderer's decoration. Visual-row alignment for
19
- * heavily-structured markdown is approximate and documented as such.
20
- *
21
- * The render truth this mirrors (verified against the components):
22
- * - `assistant` cards (entry.tsx) render `parseNextSteps(text, true).stripped`
23
- * through AssistantBody → MarkdownView, wrapped by Ink's Text at
24
- * `assistantContentWidth(termWidth)` = termWidth − 2. Ink wraps via
25
- * wrap-ansi with `{ trim: false, hard: true }` (ink/build/wrap-text.js).
26
- * The markdown transform above applies only to structured spans; plain
27
- * prose lines pass through unwrapped-by-markdown and are exact here.
28
- * - `thinking` cards render sanitizeTerminalText(text) at the same width
29
- * with no markdown transform — exact.
30
- * - `user` cards render the `'👤 USER '` label inline before the text in
31
- * the same bordered Text (entry.tsx), so row 0 = label cells then text;
32
- * wrapped continuation rows start at the text. `pasteContent` renders as
33
- * a second block (`' ↳ '` preview) after a newline; the copy base is
34
- * `pasteContent || text` (copy-icon.ts), so a card with BOTH blocks shows
35
- * two text regions while the base holds one — those keep the v1 naive
36
- * mapping (assembler-side residual, documented here).
37
- * - `info` cards are unbordered plain Text: the `'ℹ '` icon inline before
38
- * the text, wrapped at the FULL termWidth (no panel gutter).
39
- *
40
- * Inline-prefix translation: the label/icon cells are chrome, not copyable
41
- * text. buildBodyRowMap wraps `prefix + first line` together — the renderer
42
- * concatenates them into one Text node before Ink wraps it, so the wrap
43
- * boundaries are only correct when the prefix participates in the wrap — and
44
- * records the prefix width in terminal cells (string-width, the project's
45
- * measurer; 👤 is a surrogate pair — 2 code units AND 2 cells — so both
46
- * shipped prefixes happen to have prefixWidth === prefix.length). resolveRowCol
47
- * shifts row-0 columns past it, clamping prefix clicks to the text start:
48
- * the same margin-click semantics M3 gives the card gutter. The clamp works
49
- * in CELLS while segment ranges are in CHARACTERS — exact when the body's
50
- * characters are single-cell, the same standing M4 approximation that
51
- * already governs text content. Narrow panes where the label alone exceeds
52
- * the content width produce label-only rows (zero-width spans) — that
53
- * mirrors Ink's render exactly and is deliberately preserved: any divergence
54
- * between the map and the renderer breaks WYSIWYG slicing.
55
- *
56
- * Origin: card row 0 = body row 0, matching v1's documented origin (one card
57
- * row per source line when nothing wraps). Any chrome-row offset above the
58
- * body is a preexisting v1 approximation outside M4's scope — preserved, not
59
- * altered, so every pinned expectation keeps its exact meaning.
60
- *
61
- * The load-bearing invariant (verified empirically against wrap-ansi@10.0.1,
62
- * the exact version ink 7.1.1 resolves): for each source line,
63
- * `wrapAnsi(line, w, {trim:false, hard:true}).split('\n').join('') === line`.
64
- * Segment prefix sums therefore give EXACT source offsets. For a non-wrapped
65
- * line the single segment spans the whole line with `start = 0`, so every
66
- * resolve here reduces to v1's math (`offset = col`, end = `col + 1`).
2
+ * Inline render-chrome constants shared by the chat-history renderer.
3
+ *
4
+ * `USER_LABEL` is the inline label entry.tsx renders before a user card's
5
+ * text (`<Text bold>👤 USER </Text>` then the text, one Text node) and
6
+ * `INFO_PREFIX` is the inline icon before an info card's text
7
+ * (`<Text>ℹ </Text>` then the text). Both live here so entry.tsx consumes
8
+ * the single source (p3) — drift between the render and these constants
9
+ * would silently mis-offset any column math built on them.
10
+ *
11
+ * The per-card-row wrap map (`buildBodyRowMap` / `hasWrapMap` /
12
+ * `resolveRowCol`) that used to live here was removed on 2026-08-29:
13
+ * drag-select copy became BLOCK-based (see selection-helpers.ts), and
14
+ * whole-block copies need the entry's source text, not per-row geometry.
15
+ * Git history preserves the machinery if a future feature (e.g. layout-
16
+ * store-exposed wrap segments) needs it again. The cells === code-units
17
+ * assumption both prefixes rely on is pinned by tests/wrap-geometry.test.ts.
67
18
  */
68
- import type { HistoryEntry } from './types.js';
69
- /** One wrapped visual row inside a card body: the source line it shows and
70
- * the half-open [start, end) character range of that line it covers. */
71
- export interface BodyRowSpan {
72
- line: number;
73
- start: number;
74
- end: number;
75
- }
76
- export interface BodyRowMap {
77
- /** Per-card-row spans, index 0 = card row 0 (v1 origin). */
78
- rows: readonly BodyRowSpan[];
79
- /** The exact text the map indexes into — the render base (sanitized; for
80
- * assistant entries with the next-steps block stripped exactly like the
81
- * renderer). Slicing this text is WYSIWYG for the wrapped kinds. */
82
- text: string;
83
- /** Terminal CELLS of inline chrome rendered before the first text
84
- * character on row 0 (user label / info icon). 0 for prefix-less kinds. */
85
- prefixWidth: number;
86
- }
87
- /** Inline label the renderer places before a user card's text
88
- * (entry.tsx: `<Text bold>👤 USER </Text>` then the text, one Text node).
89
- * Exported so entry.tsx consumes the single source (p3) — drift between the
90
- * render and this constant silently mis-offsets user-card selection. */
19
+ /** Inline label the renderer places before a user card's text. */
91
20
  export declare const USER_LABEL = "\uD83D\uDC64 USER ";
92
- /** Inline icon the renderer places before an info card's text
93
- * (entry.tsx: `<Text>ℹ </Text>` then the text, one Text node). */
21
+ /** Inline icon the renderer places before an info card's text. */
94
22
  export declare const INFO_PREFIX = "\u2139 ";
95
- /** Kinds whose render path this module mirrors. Everything else uses the
96
- * v1 naive mapping in assembleSelectionText. Declared as a type predicate
97
- * (taking the entry, not the kind) so call sites narrow the HistoryEntry
98
- * union — every member kind carries `text`, the others may not. The
99
- * assembler additionally restricts user cards to the no-pasteContent shape
100
- * (see selection-helpers): a card with a paste block renders two text
101
- * regions but the copy base holds one, so those stay on the v1 path. */
102
- export declare function hasWrapMap(entry: HistoryEntry): entry is Extract<HistoryEntry, {
103
- kind: 'assistant' | 'thinking' | 'user' | 'info';
104
- }>;
105
- /**
106
- * Build the card-row → (source line, char range) map for one text card.
107
- * Pure and deterministic from (kind, text, termWidth).
108
- *
109
- * For prefixed kinds (user label, info icon) line 0 is wrapped AS the
110
- * renderer sees it — `prefix + line` in one Text node — so wrap boundaries
111
- * match the visual rows; each segment is then translated back to
112
- * text-local character coordinates (the prefix chars subtracted, clamped).
113
- */
114
- export declare function buildBodyRowMap(kind: HistoryEntry['kind'], rawText: string, termWidth: number): BodyRowMap;
115
- /**
116
- * Resolve the (source line, char offset) a card row + column points at,
117
- * clamping out-of-range rows to the last body row and columns to the
118
- * wrapped segment.
119
- *
120
- * Column semantics match v1: `col` is a body-local character offset (v1
121
- * sliced the source line by it directly), so a non-wrapped line resolves to
122
- * exactly v1's numbers. `atEnd` is set for an inclusive drag endpoint (end
123
- * of a selection range): the offset then counts one past the column,
124
- * clamped to the segment's end — mirroring v1's `endCol + 1`.
125
- */
126
- export declare function resolveRowCol(map: BodyRowMap, row: number, col: number, atEnd: boolean): {
127
- line: number;
128
- offset: number;
129
- };
130
23
  //# sourceMappingURL=wrap-geometry.d.ts.map
@@ -1,2 +1,2 @@
1
- export { AssistantBody, type AutonomyAgentStatus, assistantContentWidth, Banner, type BodySegment, CodeBlock, countLines, DiffBlock, DiffFileBlock, type DiffFilePreview, type DiffLineKind, type DiffLineRow, type DiffPreview, Entry, extractDiffPreview, extractMultiFileDiffs, extractReplaceDiffs, firstNonEmpty, fmtBytes, fmtDuration, fmtTok, formatMatchHit, formatMultiDiffSummary, formatToolArgs, formatToolOutput, formatToolVisualOutput, History, type HistoryEntry, type HistoryProps, MAX_STREAM_DISPLAY_CHARS, MESSAGE_PANEL_BORDER_WIDTH, MESSAGE_PANEL_CHROME_WIDTH, MESSAGE_PANEL_MARGIN, MULTI_DIFF_MAX_FILES, MULTI_DIFF_MAX_ROWS, MULTI_DIFF_SUMMARY_THRESHOLD, type MultiDiffSummary, numOf, parseUnifiedDiff, previewArgs, previewOutput, scanNumberedRange, shortenPath, splitFencedBlocks, streamBoxRows, stringOf, summarizeMultiFileDiffs, ToolOutputLines, ToolStreamBox, type ToolVisualLine, type ToolVisualLineKind, tailForDisplay, toolStreamBoxHeight, truncMid, tryParseJson, } from './history/index.js';
1
+ export { AssistantBody, type AutonomyAgentStatus, assistantContentWidth, Banner, type BodySegment, CodeBlock, countLines, DiffBlock, DiffFileBlock, type DiffFilePreview, type DiffLineKind, type DiffLineRow, type DiffPreview, Entry, extractDiffPreview, extractMultiFileDiffs, extractReplaceDiffs, firstNonEmpty, fmtBytes, fmtDuration, fmtTok, formatMatchHit, formatMultiDiffSummary, formatToolArgs, formatToolOutput, formatToolVisualOutput, History, type HistoryEntry, type HistoryProps, MAX_STREAM_DISPLAY_CHARS, MESSAGE_PANEL_BORDER_WIDTH, MESSAGE_PANEL_CHROME_WIDTH, MULTI_DIFF_MAX_FILES, MULTI_DIFF_MAX_ROWS, MULTI_DIFF_SUMMARY_THRESHOLD, type MultiDiffSummary, numOf, parseUnifiedDiff, scanNumberedRange, shortenPath, splitFencedBlocks, streamBoxRows, stringOf, summarizeMultiFileDiffs, ToolOutputLines, ToolStreamBox, type ToolVisualLine, type ToolVisualLineKind, tailForDisplay, toolStreamBoxHeight, truncMid, tryParseJson } from './history/index.js';
2
2
  //# sourceMappingURL=history.d.ts.map
@@ -1,10 +1,13 @@
1
1
  import type { Context } from '@wrongstack/core/agent';
2
2
  import { type KanbanBoard, type KanbanLifecycleStage, type KanbanTask } from '@wrongstack/kanban';
3
3
  import type React from 'react';
4
- import { type KanbanAuditSummary } from '../kanban-audit.js';
5
- export interface KanbanPanelProps {
4
+ interface KanbanPanelProps {
6
5
  projectRoot: string;
7
- sessionId?: string | null | undefined;
6
+ /**
7
+ * Session driving the panel. Required: every board mutation the panel makes
8
+ * writes a durable event attributed to this session.
9
+ */
10
+ sessionId: string;
8
11
  sessionContext?: Context | undefined;
9
12
  onClose: () => void;
10
13
  /**
@@ -54,15 +57,6 @@ export declare function nextManagedStage(current: KanbanLifecycleStage): KanbanL
54
57
  * as a legacy/custom column by the renderer).
55
58
  */
56
59
  export declare function stageForColumn(board: Pick<KanbanBoard, 'lifecycle'>, columnId: string): KanbanLifecycleStage | null;
57
- /**
58
- * Map a lifecycle stage to the visual indicator shown in the column
59
- * header. Mirrors the WebUI palette so the same board reads the same in
60
- * either surface.
61
- */
62
- export declare function stageToIndicator(stage: KanbanLifecycleStage): {
63
- glyph: string;
64
- color: string;
65
- };
66
60
  /**
67
61
  * Pure success-criteria summary string. Returns null when there are no
68
62
  * checks. Format: "Criteria N/M passed".
@@ -74,17 +68,5 @@ export declare function summarizeSuccessCriteria(task: KanbanTask): string | nul
74
68
  * are skipped to keep the line short).
75
69
  */
76
70
  export declare function summarizeGoalMetrics(task: KanbanTask): string | null;
77
- /**
78
- * Inline Kanban Cleaner summary — mirrors the WebUI's `KanbanCleanerAlert`
79
- * but pinned to the project root. Shows the headline counts at the top
80
- * of the panel and the top-3 issues, scoped per board so users see what
81
- * the Cleaner would flag without leaving the TUI.
82
- *
83
- * The component renders nothing when the audit is empty so a clean
84
- * board doesn't add visual noise.
85
- */
86
- export declare function AuditAlert({ summary, topN, }: {
87
- summary: KanbanAuditSummary;
88
- topN?: number | undefined;
89
- }): React.ReactElement | null;
71
+ export {};
90
72
  //# sourceMappingURL=kanban-panel.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { FleetEntry } from '../app.js';
3
- export interface LiveActivityStripProps {
3
+ interface LiveActivityStripProps {
4
4
  /** Per-subagent state from the FleetEntry table. */
5
5
  entries: Record<string, FleetEntry>;
6
6
  /** Re-renders every tick so elapsed timers stay live; otherwise the
@@ -36,4 +36,5 @@ export declare function activityStripRows(entries: Record<string, FleetEntry>, n
36
36
  * after /clear), so the input sits flush against history during solo work.
37
37
  */
38
38
  export declare const LiveActivityStrip: React.MemoExoticComponent<({ entries, nowTick, maxRows, }: LiveActivityStripProps) => React.ReactElement | null>;
39
+ export {};
39
40
  //# sourceMappingURL=live-activity-strip.d.ts.map