@yuaone/cli 0.1.3 → 0.3.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 (115) hide show
  1. package/dist/cli.js +29 -4
  2. package/dist/cli.js.map +1 -1
  3. package/dist/tui/App.d.ts +33 -0
  4. package/dist/tui/App.d.ts.map +1 -0
  5. package/dist/tui/App.js +244 -0
  6. package/dist/tui/App.js.map +1 -0
  7. package/dist/tui/agent-bridge.d.ts +56 -0
  8. package/dist/tui/agent-bridge.d.ts.map +1 -0
  9. package/dist/tui/agent-bridge.js +138 -0
  10. package/dist/tui/agent-bridge.js.map +1 -0
  11. package/dist/tui/components/BashOutput.d.ts +12 -0
  12. package/dist/tui/components/BashOutput.d.ts.map +1 -0
  13. package/dist/tui/components/BashOutput.js +19 -0
  14. package/dist/tui/components/BashOutput.js.map +1 -0
  15. package/dist/tui/components/CollapsibleSection.d.ts +14 -0
  16. package/dist/tui/components/CollapsibleSection.d.ts.map +1 -0
  17. package/dist/tui/components/CollapsibleSection.js +7 -0
  18. package/dist/tui/components/CollapsibleSection.js.map +1 -0
  19. package/dist/tui/components/DiffView.d.ts +11 -0
  20. package/dist/tui/components/DiffView.d.ts.map +1 -0
  21. package/dist/tui/components/DiffView.js +20 -0
  22. package/dist/tui/components/DiffView.js.map +1 -0
  23. package/dist/tui/components/FooterBar.d.ts +11 -0
  24. package/dist/tui/components/FooterBar.d.ts.map +1 -0
  25. package/dist/tui/components/FooterBar.js +14 -0
  26. package/dist/tui/components/FooterBar.js.map +1 -0
  27. package/dist/tui/components/InputBox.d.ts +24 -0
  28. package/dist/tui/components/InputBox.d.ts.map +1 -0
  29. package/dist/tui/components/InputBox.js +124 -0
  30. package/dist/tui/components/InputBox.js.map +1 -0
  31. package/dist/tui/components/MarkdownRenderer.d.ts +11 -0
  32. package/dist/tui/components/MarkdownRenderer.d.ts.map +1 -0
  33. package/dist/tui/components/MarkdownRenderer.js +118 -0
  34. package/dist/tui/components/MarkdownRenderer.js.map +1 -0
  35. package/dist/tui/components/MessageBubble.d.ts +16 -0
  36. package/dist/tui/components/MessageBubble.d.ts.map +1 -0
  37. package/dist/tui/components/MessageBubble.js +38 -0
  38. package/dist/tui/components/MessageBubble.js.map +1 -0
  39. package/dist/tui/components/MessageList.d.ts +15 -0
  40. package/dist/tui/components/MessageList.d.ts.map +1 -0
  41. package/dist/tui/components/MessageList.js +31 -0
  42. package/dist/tui/components/MessageList.js.map +1 -0
  43. package/dist/tui/components/SlashMenu.d.ts +14 -0
  44. package/dist/tui/components/SlashMenu.d.ts.map +1 -0
  45. package/dist/tui/components/SlashMenu.js +21 -0
  46. package/dist/tui/components/SlashMenu.js.map +1 -0
  47. package/dist/tui/components/Spinner.d.ts +9 -0
  48. package/dist/tui/components/Spinner.d.ts.map +1 -0
  49. package/dist/tui/components/Spinner.js +19 -0
  50. package/dist/tui/components/Spinner.js.map +1 -0
  51. package/dist/tui/components/StatusBar.d.ts +13 -0
  52. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  53. package/dist/tui/components/StatusBar.js +15 -0
  54. package/dist/tui/components/StatusBar.js.map +1 -0
  55. package/dist/tui/components/ThinkingDots.d.ts +9 -0
  56. package/dist/tui/components/ThinkingDots.d.ts.map +1 -0
  57. package/dist/tui/components/ThinkingDots.js +19 -0
  58. package/dist/tui/components/ThinkingDots.js.map +1 -0
  59. package/dist/tui/components/ToolCallTree.d.ts +12 -0
  60. package/dist/tui/components/ToolCallTree.d.ts.map +1 -0
  61. package/dist/tui/components/ToolCallTree.js +45 -0
  62. package/dist/tui/components/ToolCallTree.js.map +1 -0
  63. package/dist/tui/hooks/useAgentStream.d.ts +27 -0
  64. package/dist/tui/hooks/useAgentStream.d.ts.map +1 -0
  65. package/dist/tui/hooks/useAgentStream.js +212 -0
  66. package/dist/tui/hooks/useAgentStream.js.map +1 -0
  67. package/dist/tui/hooks/useInputHistory.d.ts +17 -0
  68. package/dist/tui/hooks/useInputHistory.d.ts.map +1 -0
  69. package/dist/tui/hooks/useInputHistory.js +49 -0
  70. package/dist/tui/hooks/useInputHistory.js.map +1 -0
  71. package/dist/tui/hooks/useKeyHandler.d.ts +12 -0
  72. package/dist/tui/hooks/useKeyHandler.d.ts.map +1 -0
  73. package/dist/tui/hooks/useKeyHandler.js +20 -0
  74. package/dist/tui/hooks/useKeyHandler.js.map +1 -0
  75. package/dist/tui/hooks/useScrollPosition.d.ts +27 -0
  76. package/dist/tui/hooks/useScrollPosition.d.ts.map +1 -0
  77. package/dist/tui/hooks/useScrollPosition.js +54 -0
  78. package/dist/tui/hooks/useScrollPosition.js.map +1 -0
  79. package/dist/tui/hooks/useSlashCommands.d.ts +22 -0
  80. package/dist/tui/hooks/useSlashCommands.d.ts.map +1 -0
  81. package/dist/tui/hooks/useSlashCommands.js +61 -0
  82. package/dist/tui/hooks/useSlashCommands.js.map +1 -0
  83. package/dist/tui/hooks/useTerminalSize.d.ts +11 -0
  84. package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -0
  85. package/dist/tui/hooks/useTerminalSize.js +25 -0
  86. package/dist/tui/hooks/useTerminalSize.js.map +1 -0
  87. package/dist/tui/lib/ansi.d.ts +36 -0
  88. package/dist/tui/lib/ansi.d.ts.map +1 -0
  89. package/dist/tui/lib/ansi.js +40 -0
  90. package/dist/tui/lib/ansi.js.map +1 -0
  91. package/dist/tui/lib/box-drawing.d.ts +12 -0
  92. package/dist/tui/lib/box-drawing.d.ts.map +1 -0
  93. package/dist/tui/lib/box-drawing.js +30 -0
  94. package/dist/tui/lib/box-drawing.js.map +1 -0
  95. package/dist/tui/lib/diff-formatter.d.ts +9 -0
  96. package/dist/tui/lib/diff-formatter.d.ts.map +1 -0
  97. package/dist/tui/lib/diff-formatter.js +65 -0
  98. package/dist/tui/lib/diff-formatter.js.map +1 -0
  99. package/dist/tui/lib/tokens.d.ts +56 -0
  100. package/dist/tui/lib/tokens.d.ts.map +1 -0
  101. package/dist/tui/lib/tokens.js +61 -0
  102. package/dist/tui/lib/tokens.js.map +1 -0
  103. package/dist/tui/lib/truncate.d.ts +11 -0
  104. package/dist/tui/lib/truncate.d.ts.map +1 -0
  105. package/dist/tui/lib/truncate.js +69 -0
  106. package/dist/tui/lib/truncate.js.map +1 -0
  107. package/dist/tui/lib/update-checker.d.ts +21 -0
  108. package/dist/tui/lib/update-checker.d.ts.map +1 -0
  109. package/dist/tui/lib/update-checker.js +133 -0
  110. package/dist/tui/lib/update-checker.js.map +1 -0
  111. package/dist/tui/types.d.ts +77 -0
  112. package/dist/tui/types.d.ts.map +1 -0
  113. package/dist/tui/types.js +5 -0
  114. package/dist/tui/types.js.map +1 -0
  115. package/package.json +13 -3
@@ -0,0 +1,19 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Spinner — braille dot animation (gray, dim).
4
+ */
5
+ import { useState, useEffect } from "react";
6
+ import { Text } from "ink";
7
+ import { TOKENS } from "../lib/tokens.js";
8
+ export function Spinner({ label }) {
9
+ const { frames, interval } = TOKENS.spinner;
10
+ const [frame, setFrame] = useState(0);
11
+ useEffect(() => {
12
+ const timer = setInterval(() => {
13
+ setFrame((f) => (f + 1) % frames.length);
14
+ }, interval);
15
+ return () => clearInterval(timer);
16
+ }, [frames.length, interval]);
17
+ return (_jsxs(Text, { dimColor: true, children: [frames[frame], label ? ` ${label}` : ""] }));
18
+ }
19
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../src/tui/components/Spinner.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1C,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAgB;IAC7C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;QACb,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,MAAC,IAAI,IAAC,QAAQ,mBACX,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IACnC,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * StatusBar — top bar showing version, model, tokens/s, status.
3
+ */
4
+ import React from "react";
5
+ export interface StatusBarProps {
6
+ version: string;
7
+ model: string;
8
+ provider: string;
9
+ tokensPerSec?: number;
10
+ isRunning?: boolean;
11
+ }
12
+ export declare function StatusBar({ version, model, provider, tokensPerSec, isRunning, }: StatusBarProps): React.JSX.Element;
13
+ //# sourceMappingURL=StatusBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkBpC"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { useTerminalSize } from "../hooks/useTerminalSize.js";
4
+ import { TOKENS } from "../lib/tokens.js";
5
+ export function StatusBar({ version, model, provider, tokensPerSec, isRunning, }) {
6
+ const { columns, tier } = useTerminalSize();
7
+ const left = `${TOKENS.brand.prefix} YUAN v${version}`;
8
+ const status = isRunning ? "●" : "○";
9
+ const tps = tokensPerSec != null ? `${tokensPerSec} tok/s` : "";
10
+ const right = tier === "compact"
11
+ ? `${status} ${model}`
12
+ : `${provider}/${model} ${status} ${tps}`;
13
+ return (_jsxs(Box, { width: columns, justifyContent: "space-between", children: [_jsx(Text, { dimColor: true, children: left }), _jsx(Text, { dimColor: true, children: right })] }));
14
+ }
15
+ //# sourceMappingURL=StatusBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/tui/components/StatusBar.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAU1C,MAAM,UAAU,SAAS,CAAC,EACxB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,GACM;IACf,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CAAC;IAE5C,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,UAAU,OAAO,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACrC,MAAM,GAAG,GAAG,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhE,MAAM,KAAK,GACT,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE;QACtB,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;IAE9C,OAAO,CACL,MAAC,GAAG,IAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAC,eAAe,aACjD,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,EAC5B,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,GAAQ,IACzB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ThinkingDots — animated "·····" indicator, dim gray.
3
+ */
4
+ import React from "react";
5
+ export interface ThinkingDotsProps {
6
+ label?: string;
7
+ }
8
+ export declare function ThinkingDots({ label }: ThinkingDotsProps): React.JSX.Element;
9
+ //# sourceMappingURL=ThinkingDots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThinkingDots.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ThinkingDots.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgB5E"}
@@ -0,0 +1,19 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ThinkingDots — animated "·····" indicator, dim gray.
4
+ */
5
+ import { useState, useEffect } from "react";
6
+ import { Text } from "ink";
7
+ import { TOKENS } from "../lib/tokens.js";
8
+ export function ThinkingDots({ label }) {
9
+ const { frames, interval } = TOKENS.dots;
10
+ const [frame, setFrame] = useState(0);
11
+ useEffect(() => {
12
+ const timer = setInterval(() => {
13
+ setFrame((f) => (f + 1) % frames.length);
14
+ }, interval);
15
+ return () => clearInterval(timer);
16
+ }, [frames.length, interval]);
17
+ return (_jsxs(Text, { dimColor: true, children: [label ? `${label} ` : "", frames[frame]] }));
18
+ }
19
+ //# sourceMappingURL=ThinkingDots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThinkingDots.js","sourceRoot":"","sources":["../../../src/tui/components/ThinkingDots.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1C,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAqB;IACvD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;QACb,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,MAAC,IAAI,IAAC,QAAQ,mBACX,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,IACnC,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ToolCallTree — tree-style tool call display with ├─ └─ connectors.
3
+ * Shows status indicators, durations, and expandable results.
4
+ */
5
+ import React from "react";
6
+ import type { TUIToolCall } from "../types.js";
7
+ export interface ToolCallTreeProps {
8
+ toolCalls: TUIToolCall[];
9
+ width: number;
10
+ }
11
+ export declare function ToolCallTree({ toolCalls, width, }: ToolCallTreeProps): React.JSX.Element;
12
+ //# sourceMappingURL=ToolCallTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCallTree.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ToolCallTree.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAOrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AA8FD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,GACN,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAavC"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ToolCallTree — tree-style tool call display with ├─ └─ connectors.
4
+ * Shows status indicators, durations, and expandable results.
5
+ */
6
+ import { useState, useCallback } from "react";
7
+ import { Box, Text } from "ink";
8
+ import { TOKENS } from "../lib/tokens.js";
9
+ import { Spinner } from "./Spinner.js";
10
+ import { CollapsibleSection } from "./CollapsibleSection.js";
11
+ import { DiffView } from "./DiffView.js";
12
+ import { BashOutput } from "./BashOutput.js";
13
+ import { truncate } from "../lib/truncate.js";
14
+ import { useTerminalSize } from "../hooks/useTerminalSize.js";
15
+ function ToolCallNode({ tc, isLast, width, }) {
16
+ const [isExpanded, setIsExpanded] = useState(tc.isExpanded);
17
+ const connector = isLast ? TOKENS.tree.last : TOKENS.tree.branch;
18
+ const continuation = isLast ? " " : TOKENS.tree.pipe;
19
+ const toggleExpand = useCallback(() => {
20
+ setIsExpanded((prev) => !prev);
21
+ }, []);
22
+ // Status icon
23
+ let statusEl;
24
+ if (tc.status === "running") {
25
+ statusEl = _jsx(Spinner, {});
26
+ }
27
+ else {
28
+ const icon = tc.status === "success" ? "✓" : "✗";
29
+ const color = tc.status === "success" ? "green" : "red";
30
+ statusEl = _jsx(Text, { color: color, children: icon });
31
+ }
32
+ // Duration
33
+ const durationStr = tc.duration != null ? ` ${tc.duration.toFixed(1)}s` : "";
34
+ // Truncate args summary based on available width
35
+ const { tier } = useTerminalSize();
36
+ const maxArgWidth = tier === "compact" ? 20 : width - 30;
37
+ const args = tc.argsSummary
38
+ ? truncate(tc.argsSummary, maxArgWidth)
39
+ : "";
40
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { dimColor: true, children: [connector, " "] }), _jsx(Text, { bold: true, children: tc.toolName }), args && _jsxs(Text, { dimColor: true, children: [" ", args] }), _jsx(Text, { children: " " }), statusEl, _jsx(Text, { dimColor: true, children: durationStr })] }), tc.result && tc.result.lineCount > 0 && (_jsxs(Box, { paddingLeft: 2, children: [_jsx(Text, { dimColor: true, children: continuation }), _jsx(Box, { flexDirection: "column", marginLeft: 1, children: tc.result.kind === "diff" && tc.result.diff ? (_jsx(CollapsibleSection, { isExpanded: isExpanded, onToggle: toggleExpand, collapsedSummary: `${tc.result.diff.additions + tc.result.diff.deletions} changes`, children: _jsx(DiffView, { diff: tc.result.diff, width: width - 6 }) })) : tc.result.kind === "bash_output" ? (_jsx(CollapsibleSection, { isExpanded: isExpanded, onToggle: toggleExpand, collapsedSummary: `${tc.result.lineCount} lines of output`, children: _jsx(BashOutput, { command: tc.toolName, output: tc.result.content, width: width - 6 }) })) : tc.result.lineCount > 10 ? (_jsx(CollapsibleSection, { isExpanded: isExpanded, onToggle: toggleExpand, collapsedSummary: `${tc.result.lineCount} lines`, children: _jsx(Text, { dimColor: true, children: tc.result.content }) })) : (_jsx(Text, { dimColor: true, children: tc.result.content })) })] }))] }));
41
+ }
42
+ export function ToolCallTree({ toolCalls, width, }) {
43
+ return (_jsx(Box, { flexDirection: "column", children: toolCalls.map((tc, i) => (_jsx(ToolCallNode, { tc: tc, isLast: i === toolCalls.length - 1, width: width }, tc.id))) }));
44
+ }
45
+ //# sourceMappingURL=ToolCallTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCallTree.js","sourceRoot":"","sources":["../../../src/tui/components/ToolCallTree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * useAgentStream — bridges AgentLoop events to TUI React state.
3
+ * Converts agent events into TUIMessage updates, tracks streaming state.
4
+ */
5
+ import type { AgentStreamState } from "../types.js";
6
+ export interface UseAgentStreamReturn {
7
+ state: AgentStreamState;
8
+ /** Process an incoming agent event */
9
+ handleEvent: (event: AgentEventLike) => void;
10
+ /** Add a user message */
11
+ addUserMessage: (content: string) => void;
12
+ /** Add a system message (for slash commands, etc.) */
13
+ addSystemMessage: (content: string) => void;
14
+ /** Mark agent as started */
15
+ startAgent: () => void;
16
+ /** Interrupt and reset to idle */
17
+ interrupt: () => void;
18
+ /** Clear all messages */
19
+ clearMessages: () => void;
20
+ }
21
+ /** Minimal agent event shape (matches @yuaone/core AgentEvent) */
22
+ export interface AgentEventLike {
23
+ kind: string;
24
+ [key: string]: unknown;
25
+ }
26
+ export declare function useAgentStream(): UseAgentStreamReturn;
27
+ //# sourceMappingURL=useAgentStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgentStream.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useAgentStream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,CAAC;IACxB,sCAAsC;IACtC,WAAW,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,yBAAyB;IACzB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,sDAAsD;IACtD,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,4BAA4B;IAC5B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,yBAAyB;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,cAAc,IAAI,oBAAoB,CA+MrD"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * useAgentStream — bridges AgentLoop events to TUI React state.
3
+ * Converts agent events into TUIMessage updates, tracks streaming state.
4
+ */
5
+ import { useState, useCallback, useRef } from "react";
6
+ export function useAgentStream() {
7
+ const [messages, setMessages] = useState([]);
8
+ const [status, setStatus] = useState("idle");
9
+ const [streamBuffer, setStreamBuffer] = useState("");
10
+ const [tokensPerSecond, setTokensPerSecond] = useState(0);
11
+ const [totalTokensUsed, setTotalTokensUsed] = useState(0);
12
+ const currentMsgIdRef = useRef(null);
13
+ const tokenWindowRef = useRef([]);
14
+ const addUserMessage = useCallback((content) => {
15
+ const msg = {
16
+ id: `user-${Date.now()}`,
17
+ role: "user",
18
+ content,
19
+ timestamp: Date.now(),
20
+ };
21
+ setMessages((prev) => [...prev, msg]);
22
+ }, []);
23
+ const addSystemMessage = useCallback((content) => {
24
+ const msg = {
25
+ id: `sys-${Date.now()}`,
26
+ role: "system",
27
+ content,
28
+ timestamp: Date.now(),
29
+ };
30
+ setMessages((prev) => [...prev, msg]);
31
+ }, []);
32
+ const startAgent = useCallback(() => {
33
+ setStatus("thinking");
34
+ setStreamBuffer("");
35
+ const msgId = `assistant-${Date.now()}`;
36
+ currentMsgIdRef.current = msgId;
37
+ const msg = {
38
+ id: msgId,
39
+ role: "assistant",
40
+ content: "",
41
+ timestamp: Date.now(),
42
+ isStreaming: true,
43
+ toolCalls: [],
44
+ };
45
+ setMessages((prev) => [...prev, msg]);
46
+ }, []);
47
+ const updateCurrentMessage = useCallback((updater) => {
48
+ const id = currentMsgIdRef.current;
49
+ if (!id)
50
+ return;
51
+ setMessages((prev) => prev.map((m) => (m.id === id ? updater(m) : m)));
52
+ }, []);
53
+ const handleEvent = useCallback((event) => {
54
+ switch (event.kind) {
55
+ case "agent:thinking":
56
+ setStatus("thinking");
57
+ break;
58
+ case "agent:text_delta": {
59
+ const text = event.text;
60
+ setStreamBuffer((prev) => prev + text);
61
+ setStatus("streaming");
62
+ updateCurrentMessage((msg) => ({
63
+ ...msg,
64
+ content: msg.content + text,
65
+ }));
66
+ break;
67
+ }
68
+ case "agent:tool_call": {
69
+ setStatus("tool_running");
70
+ const tc = {
71
+ id: `tc-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
72
+ toolName: event.tool,
73
+ argsSummary: summarizeArgs(event.input),
74
+ status: "running",
75
+ isExpanded: false,
76
+ };
77
+ updateCurrentMessage((msg) => ({
78
+ ...msg,
79
+ toolCalls: [...(msg.toolCalls ?? []), tc],
80
+ }));
81
+ break;
82
+ }
83
+ case "agent:tool_result": {
84
+ const toolName = event.tool;
85
+ const output = event.output;
86
+ const durationMs = event.durationMs;
87
+ updateCurrentMessage((msg) => {
88
+ const toolCalls = [...(msg.toolCalls ?? [])];
89
+ // Find the last running tool call with this name
90
+ for (let i = toolCalls.length - 1; i >= 0; i--) {
91
+ if (toolCalls[i].toolName === toolName && toolCalls[i].status === "running") {
92
+ toolCalls[i] = {
93
+ ...toolCalls[i],
94
+ status: "success",
95
+ duration: durationMs / 1000,
96
+ result: {
97
+ kind: detectResultKind(toolName, output),
98
+ content: output,
99
+ lineCount: output.split("\n").length,
100
+ },
101
+ };
102
+ break;
103
+ }
104
+ }
105
+ return { ...msg, toolCalls };
106
+ });
107
+ break;
108
+ }
109
+ case "agent:error": {
110
+ const errMsg = event.message;
111
+ updateCurrentMessage((msg) => ({
112
+ ...msg,
113
+ content: msg.content + `\n\nError: ${errMsg}`,
114
+ isStreaming: false,
115
+ }));
116
+ setStatus("idle");
117
+ currentMsgIdRef.current = null;
118
+ break;
119
+ }
120
+ case "agent:completed": {
121
+ const summary = event.summary;
122
+ updateCurrentMessage((msg) => ({
123
+ ...msg,
124
+ content: msg.content || summary,
125
+ isStreaming: false,
126
+ }));
127
+ setStatus("idle");
128
+ setStreamBuffer("");
129
+ currentMsgIdRef.current = null;
130
+ break;
131
+ }
132
+ case "agent:token_usage": {
133
+ const input = event.input;
134
+ const output = event.output;
135
+ const total = input + output;
136
+ setTotalTokensUsed((prev) => prev + total);
137
+ // Rolling 3-second window for tokens/sec
138
+ const now = Date.now();
139
+ tokenWindowRef.current.push({ time: now, tokens: total });
140
+ tokenWindowRef.current = tokenWindowRef.current.filter((e) => now - e.time < 3000);
141
+ const windowTokens = tokenWindowRef.current.reduce((s, e) => s + e.tokens, 0);
142
+ const windowMs = Math.max(1, now - (tokenWindowRef.current[0]?.time ?? now));
143
+ setTokensPerSecond(Math.round((windowTokens / windowMs) * 1000));
144
+ break;
145
+ }
146
+ case "agent:approval_needed":
147
+ setStatus("awaiting_approval");
148
+ break;
149
+ default:
150
+ break;
151
+ }
152
+ }, [updateCurrentMessage]);
153
+ const interrupt = useCallback(() => {
154
+ updateCurrentMessage((msg) => ({
155
+ ...msg,
156
+ isStreaming: false,
157
+ content: msg.content + "\n\n[Interrupted]",
158
+ }));
159
+ setStatus("idle");
160
+ setStreamBuffer("");
161
+ currentMsgIdRef.current = null;
162
+ const sysMsg = {
163
+ id: `sys-${Date.now()}`,
164
+ role: "system",
165
+ content: "Agent interrupted.",
166
+ timestamp: Date.now(),
167
+ };
168
+ setMessages((prev) => [...prev, sysMsg]);
169
+ }, [updateCurrentMessage]);
170
+ const clearMessages = useCallback(() => {
171
+ setMessages([]);
172
+ setStreamBuffer("");
173
+ setStatus("idle");
174
+ currentMsgIdRef.current = null;
175
+ }, []);
176
+ const state = {
177
+ status,
178
+ streamBuffer,
179
+ messages,
180
+ tokensPerSecond,
181
+ totalTokensUsed,
182
+ };
183
+ return { state, handleEvent, addUserMessage, addSystemMessage, startAgent, interrupt, clearMessages };
184
+ }
185
+ function summarizeArgs(input) {
186
+ if (!input || typeof input !== "object")
187
+ return "";
188
+ const obj = input;
189
+ // Common patterns: file path, command, query
190
+ if (obj.path)
191
+ return String(obj.path);
192
+ if (obj.file_path)
193
+ return String(obj.file_path);
194
+ if (obj.command)
195
+ return String(obj.command).slice(0, 60);
196
+ if (obj.pattern)
197
+ return String(obj.pattern);
198
+ if (obj.query)
199
+ return String(obj.query).slice(0, 40);
200
+ return "";
201
+ }
202
+ function detectResultKind(toolName, _output) {
203
+ const name = toolName.toLowerCase();
204
+ if (name.includes("edit") || name.includes("diff"))
205
+ return "diff";
206
+ if (name.includes("bash") || name.includes("shell") || name.includes("exec"))
207
+ return "bash_output";
208
+ if (name.includes("read") || name.includes("file"))
209
+ return "file_content";
210
+ return "text";
211
+ }
212
+ //# sourceMappingURL=useAgentStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAgentStream.js","sourceRoot":"","sources":["../../../src/tui/hooks/useAgentStream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Hook: input history navigation with arrow keys.
3
+ */
4
+ export interface InputHistoryHook {
5
+ /** Current input value (may be from history) */
6
+ current: string;
7
+ /** Add an entry to history */
8
+ push: (entry: string) => void;
9
+ /** Navigate up (older) — returns new value or null if at top */
10
+ up: (currentInput: string) => string | null;
11
+ /** Navigate down (newer) — returns new value or null if at bottom */
12
+ down: () => string | null;
13
+ /** Reset navigation position to bottom */
14
+ reset: () => void;
15
+ }
16
+ export declare function useInputHistory(): InputHistoryHook;
17
+ //# sourceMappingURL=useInputHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputHistory.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useInputHistory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,gEAAgE;IAChE,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,qEAAqE;IACrE,IAAI,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CA8ClD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Hook: input history navigation with arrow keys.
3
+ */
4
+ import { useState, useCallback } from "react";
5
+ const MAX_HISTORY = 100;
6
+ export function useInputHistory() {
7
+ const [history, setHistory] = useState([]);
8
+ const [index, setIndex] = useState(-1);
9
+ const [savedInput, setSavedInput] = useState("");
10
+ const push = useCallback((entry) => {
11
+ if (!entry.trim())
12
+ return;
13
+ setHistory((prev) => {
14
+ const next = [...prev, entry];
15
+ if (next.length > MAX_HISTORY)
16
+ next.shift();
17
+ return next;
18
+ });
19
+ setIndex(-1);
20
+ setSavedInput("");
21
+ }, []);
22
+ const up = useCallback((currentInput) => {
23
+ if (history.length === 0)
24
+ return null;
25
+ const newIndex = index === -1 ? history.length - 1 : Math.max(0, index - 1);
26
+ if (index === -1)
27
+ setSavedInput(currentInput);
28
+ setIndex(newIndex);
29
+ return history[newIndex] ?? null;
30
+ }, [history, index]);
31
+ const down = useCallback(() => {
32
+ if (index === -1)
33
+ return null;
34
+ const newIndex = index + 1;
35
+ if (newIndex >= history.length) {
36
+ setIndex(-1);
37
+ return savedInput;
38
+ }
39
+ setIndex(newIndex);
40
+ return history[newIndex] ?? null;
41
+ }, [history, index, savedInput]);
42
+ const reset = useCallback(() => {
43
+ setIndex(-1);
44
+ setSavedInput("");
45
+ }, []);
46
+ const current = index >= 0 && index < history.length ? history[index] : "";
47
+ return { current, push, up, down, reset };
48
+ }
49
+ //# sourceMappingURL=useInputHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputHistory.js","sourceRoot":"","sources":["../../../src/tui/hooks/useInputHistory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,WAAW,GAAG,GAAG,CAAC;AAexB,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACzC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO;QAC1B,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,WAAW;gBAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACb,aAAa,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,EAAE,GAAG,WAAW,CACpB,CAAC,YAAoB,EAAE,EAAE;QACvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5E,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,CAAC,CACjB,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC;QAC3B,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC/B,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACb,aAAa,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * useKeyHandler — global key dispatch for Ctrl+O expand, Ctrl+C exit.
3
+ * Note: Esc interrupt is handled by InputBox to avoid double-firing.
4
+ */
5
+ export interface KeyHandlerOptions {
6
+ onInterrupt?: () => void;
7
+ onToggleExpand?: () => void;
8
+ onExit?: () => void;
9
+ isRunning?: boolean;
10
+ }
11
+ export declare function useKeyHandler({ onToggleExpand, onExit, }: KeyHandlerOptions): void;
12
+ //# sourceMappingURL=useKeyHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyHandler.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useKeyHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,cAAc,EACd,MAAM,GACP,EAAE,iBAAiB,GAAG,IAAI,CAkB1B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * useKeyHandler — global key dispatch for Ctrl+O expand, Ctrl+C exit.
3
+ * Note: Esc interrupt is handled by InputBox to avoid double-firing.
4
+ */
5
+ import { useCallback } from "react";
6
+ import { useInput } from "ink";
7
+ export function useKeyHandler({ onToggleExpand, onExit, }) {
8
+ useInput(useCallback((input, key) => {
9
+ // Ctrl+O → toggle expand/collapse
10
+ if (key.ctrl && input === "o" && onToggleExpand) {
11
+ onToggleExpand();
12
+ return;
13
+ }
14
+ // Ctrl+C → clean exit
15
+ if (key.ctrl && input === "c" && onExit) {
16
+ onExit();
17
+ }
18
+ }, [onToggleExpand, onExit]));
19
+ }
20
+ //# sourceMappingURL=useKeyHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyHandler.js","sourceRoot":"","sources":["../../../src/tui/hooks/useKeyHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAS/B,MAAM,UAAU,aAAa,CAAC,EAC5B,cAAc,EACd,MAAM,GACY;IAClB,QAAQ,CACN,WAAW,CACT,CAAC,KAAa,EAAE,GAAuB,EAAE,EAAE;QACzC,kCAAkC;QAClC,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,cAAc,EAAE,CAAC;YAChD,cAAc,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,MAAM,EAAE,CAAC;YACxC,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,EACD,CAAC,cAAc,EAAE,MAAM,CAAC,CACzB,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * useScrollPosition — virtual scroll state for MessageList.
3
+ * Tracks scroll offset, auto-scroll behavior, and scroll indicators.
4
+ */
5
+ export interface ScrollState {
6
+ /** Index of the first visible message */
7
+ offset: number;
8
+ /** Total number of messages */
9
+ total: number;
10
+ /** Number of messages visible in viewport */
11
+ viewportSize: number;
12
+ /** Whether auto-scroll is engaged (scroll to bottom on new messages) */
13
+ autoScroll: boolean;
14
+ /** Number of messages above viewport */
15
+ aboveCount: number;
16
+ /** Number of messages below viewport */
17
+ belowCount: number;
18
+ }
19
+ export interface ScrollActions {
20
+ scrollUp: (amount?: number) => void;
21
+ scrollDown: (amount?: number) => void;
22
+ scrollToBottom: () => void;
23
+ pageUp: () => void;
24
+ pageDown: () => void;
25
+ }
26
+ export declare function useScrollPosition(totalMessages: number, viewportSize: number): [ScrollState, ScrollActions];
27
+ //# sourceMappingURL=useScrollPosition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollPosition.d.ts","sourceRoot":"","sources":["../../../src/tui/hooks/useScrollPosition.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,CAAC,WAAW,EAAE,aAAa,CAAC,CA4D9B"}