@agentick/tui 0.4.0 → 0.6.0

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 (141) hide show
  1. package/README.md +202 -20
  2. package/dist/commands-context.d.ts +10 -0
  3. package/dist/commands-context.d.ts.map +1 -0
  4. package/dist/commands-context.js +10 -0
  5. package/dist/commands-context.js.map +1 -0
  6. package/dist/commands.d.ts +30 -0
  7. package/dist/commands.d.ts.map +1 -0
  8. package/dist/commands.js +163 -0
  9. package/dist/commands.js.map +1 -0
  10. package/dist/components/CompletionPicker.d.ts +12 -0
  11. package/dist/components/CompletionPicker.d.ts.map +1 -0
  12. package/dist/components/CompletionPicker.js +41 -0
  13. package/dist/components/CompletionPicker.js.map +1 -0
  14. package/dist/components/DiffView.d.ts +21 -0
  15. package/dist/components/DiffView.d.ts.map +1 -0
  16. package/dist/components/DiffView.js +94 -0
  17. package/dist/components/DiffView.js.map +1 -0
  18. package/dist/components/ErrorDisplay.d.ts +6 -6
  19. package/dist/components/ErrorDisplay.d.ts.map +1 -1
  20. package/dist/components/ErrorDisplay.js +6 -8
  21. package/dist/components/ErrorDisplay.js.map +1 -1
  22. package/dist/components/InputBar.d.ts +8 -7
  23. package/dist/components/InputBar.d.ts.map +1 -1
  24. package/dist/components/InputBar.js +7 -13
  25. package/dist/components/InputBar.js.map +1 -1
  26. package/dist/components/MessageList.d.ts +11 -5
  27. package/dist/components/MessageList.d.ts.map +1 -1
  28. package/dist/components/MessageList.js +37 -44
  29. package/dist/components/MessageList.js.map +1 -1
  30. package/dist/components/RichTextInput.d.ts +14 -0
  31. package/dist/components/RichTextInput.d.ts.map +1 -0
  32. package/dist/components/RichTextInput.js +24 -0
  33. package/dist/components/RichTextInput.js.map +1 -0
  34. package/dist/components/ToolCallIndicator.d.ts.map +1 -1
  35. package/dist/components/ToolCallIndicator.js +12 -5
  36. package/dist/components/ToolCallIndicator.js.map +1 -1
  37. package/dist/components/ToolConfirmationPrompt.d.ts +9 -6
  38. package/dist/components/ToolConfirmationPrompt.d.ts.map +1 -1
  39. package/dist/components/ToolConfirmationPrompt.js +18 -19
  40. package/dist/components/ToolConfirmationPrompt.js.map +1 -1
  41. package/dist/components/status-bar/DefaultStatusBar.d.ts +20 -0
  42. package/dist/components/status-bar/DefaultStatusBar.d.ts.map +1 -0
  43. package/dist/components/status-bar/DefaultStatusBar.js +11 -0
  44. package/dist/components/status-bar/DefaultStatusBar.js.map +1 -0
  45. package/dist/components/status-bar/StatusBar.d.ts +22 -0
  46. package/dist/components/status-bar/StatusBar.d.ts.map +1 -0
  47. package/dist/components/status-bar/StatusBar.js +16 -0
  48. package/dist/components/status-bar/StatusBar.js.map +1 -0
  49. package/dist/components/status-bar/StatusBarRight.d.ts +12 -0
  50. package/dist/components/status-bar/StatusBarRight.d.ts.map +1 -0
  51. package/dist/components/status-bar/StatusBarRight.js +29 -0
  52. package/dist/components/status-bar/StatusBarRight.js.map +1 -0
  53. package/dist/components/status-bar/context.d.ts +27 -0
  54. package/dist/components/status-bar/context.d.ts.map +1 -0
  55. package/dist/components/status-bar/context.js +18 -0
  56. package/dist/components/status-bar/context.js.map +1 -0
  57. package/dist/components/status-bar/index.d.ts +5 -0
  58. package/dist/components/status-bar/index.d.ts.map +1 -0
  59. package/dist/components/status-bar/index.js +5 -0
  60. package/dist/components/status-bar/index.js.map +1 -0
  61. package/dist/components/status-bar/widgets/BrandLabel.d.ts +8 -0
  62. package/dist/components/status-bar/widgets/BrandLabel.d.ts.map +1 -0
  63. package/dist/components/status-bar/widgets/BrandLabel.js +6 -0
  64. package/dist/components/status-bar/widgets/BrandLabel.js.map +1 -0
  65. package/dist/components/status-bar/widgets/ContextUtilization.d.ts +11 -0
  66. package/dist/components/status-bar/widgets/ContextUtilization.d.ts.map +1 -0
  67. package/dist/components/status-bar/widgets/ContextUtilization.js +12 -0
  68. package/dist/components/status-bar/widgets/ContextUtilization.js.map +1 -0
  69. package/dist/components/status-bar/widgets/KeyboardHints.d.ts +16 -0
  70. package/dist/components/status-bar/widgets/KeyboardHints.d.ts.map +1 -0
  71. package/dist/components/status-bar/widgets/KeyboardHints.js +25 -0
  72. package/dist/components/status-bar/widgets/KeyboardHints.js.map +1 -0
  73. package/dist/components/status-bar/widgets/ModelInfo.d.ts +7 -0
  74. package/dist/components/status-bar/widgets/ModelInfo.d.ts.map +1 -0
  75. package/dist/components/status-bar/widgets/ModelInfo.js +10 -0
  76. package/dist/components/status-bar/widgets/ModelInfo.js.map +1 -0
  77. package/dist/components/status-bar/widgets/Separator.d.ts +7 -0
  78. package/dist/components/status-bar/widgets/Separator.d.ts.map +1 -0
  79. package/dist/components/status-bar/widgets/Separator.js +6 -0
  80. package/dist/components/status-bar/widgets/Separator.js.map +1 -0
  81. package/dist/components/status-bar/widgets/StateIndicator.d.ts +12 -0
  82. package/dist/components/status-bar/widgets/StateIndicator.d.ts.map +1 -0
  83. package/dist/components/status-bar/widgets/StateIndicator.js +21 -0
  84. package/dist/components/status-bar/widgets/StateIndicator.js.map +1 -0
  85. package/dist/components/status-bar/widgets/TickCount.d.ts +9 -0
  86. package/dist/components/status-bar/widgets/TickCount.d.ts.map +1 -0
  87. package/dist/components/status-bar/widgets/TickCount.js +11 -0
  88. package/dist/components/status-bar/widgets/TickCount.js.map +1 -0
  89. package/dist/components/status-bar/widgets/TokenCount.d.ts +12 -0
  90. package/dist/components/status-bar/widgets/TokenCount.d.ts.map +1 -0
  91. package/dist/components/status-bar/widgets/TokenCount.js +28 -0
  92. package/dist/components/status-bar/widgets/TokenCount.js.map +1 -0
  93. package/dist/components/status-bar/widgets/index.d.ts +9 -0
  94. package/dist/components/status-bar/widgets/index.d.ts.map +1 -0
  95. package/dist/components/status-bar/widgets/index.js +9 -0
  96. package/dist/components/status-bar/widgets/index.js.map +1 -0
  97. package/dist/create-tui.d.ts +17 -6
  98. package/dist/create-tui.d.ts.map +1 -1
  99. package/dist/create-tui.js +14 -3
  100. package/dist/create-tui.js.map +1 -1
  101. package/dist/hooks/use-double-ctrl-c.d.ts +5 -0
  102. package/dist/hooks/use-double-ctrl-c.d.ts.map +1 -0
  103. package/dist/hooks/use-double-ctrl-c.js +32 -0
  104. package/dist/hooks/use-double-ctrl-c.js.map +1 -0
  105. package/dist/hooks/use-line-editor.d.ts +26 -0
  106. package/dist/hooks/use-line-editor.d.ts.map +1 -0
  107. package/dist/hooks/use-line-editor.js +63 -0
  108. package/dist/hooks/use-line-editor.js.map +1 -0
  109. package/dist/index.d.ts +14 -3
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +15 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/input-utils.d.ts +15 -0
  114. package/dist/input-utils.d.ts.map +1 -0
  115. package/dist/input-utils.js +29 -0
  116. package/dist/input-utils.js.map +1 -0
  117. package/dist/rendering/content-block.d.ts +12 -0
  118. package/dist/rendering/content-block.d.ts.map +1 -0
  119. package/dist/rendering/content-block.js +82 -0
  120. package/dist/rendering/content-block.js.map +1 -0
  121. package/dist/rendering/index.d.ts +5 -0
  122. package/dist/rendering/index.d.ts.map +1 -0
  123. package/dist/rendering/index.js +5 -0
  124. package/dist/rendering/index.js.map +1 -0
  125. package/dist/rendering/markdown.d.ts +14 -0
  126. package/dist/rendering/markdown.d.ts.map +1 -0
  127. package/dist/rendering/markdown.js +61 -0
  128. package/dist/rendering/markdown.js.map +1 -0
  129. package/dist/rendering/message.d.ts +25 -0
  130. package/dist/rendering/message.d.ts.map +1 -0
  131. package/dist/rendering/message.js +54 -0
  132. package/dist/rendering/message.js.map +1 -0
  133. package/dist/rendering/theme.d.ts +37 -0
  134. package/dist/rendering/theme.d.ts.map +1 -0
  135. package/dist/rendering/theme.js +49 -0
  136. package/dist/rendering/theme.js.map +1 -0
  137. package/dist/ui/chat.d.ts +26 -4
  138. package/dist/ui/chat.d.ts.map +1 -1
  139. package/dist/ui/chat.js +91 -68
  140. package/dist/ui/chat.js.map +1 -1
  141. package/package.json +11 -6
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * DiffView — colored diff rendering with line numbers and gutter markers.
4
+ *
5
+ * Parses unified diff output (from jsdiff's createTwoFilesPatch) and renders:
6
+ * - Summary header with add/remove counts
7
+ * - Line numbers in a left gutter
8
+ * - Colored text (green additions, red removals, dim context)
9
+ * - Hunk headers in cyan
10
+ *
11
+ * Uses chalk for ANSI coloring without background colors — background colors
12
+ * create visible gaps between lines in most terminals due to inter-line
13
+ * pixel spacing from the font engine.
14
+ */
15
+ import chalk from "chalk";
16
+ import { Box, Text } from "ink";
17
+ const HUNK_RE = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/;
18
+ function parsePatch(patch) {
19
+ const lines = patch.split("\n");
20
+ const result = [];
21
+ let oldLine = 0;
22
+ let newLine = 0;
23
+ for (const line of lines) {
24
+ // Skip headers and diff metadata
25
+ if (line.startsWith("Index:") ||
26
+ line.startsWith("diff ") ||
27
+ line.startsWith("===") ||
28
+ line.startsWith("---") ||
29
+ line.startsWith("+++") ||
30
+ line.startsWith("\\")) {
31
+ continue;
32
+ }
33
+ const hunkMatch = HUNK_RE.exec(line);
34
+ if (hunkMatch) {
35
+ oldLine = parseInt(hunkMatch[1], 10);
36
+ newLine = parseInt(hunkMatch[2], 10);
37
+ result.push({ type: "hunk", content: line });
38
+ continue;
39
+ }
40
+ if (line.startsWith("+")) {
41
+ result.push({ type: "add", content: line.slice(1), newLine });
42
+ newLine++;
43
+ }
44
+ else if (line.startsWith("-")) {
45
+ result.push({ type: "remove", content: line.slice(1), oldLine });
46
+ oldLine++;
47
+ }
48
+ else if (line.length > 0 || (oldLine > 0 && newLine > 0)) {
49
+ result.push({ type: "context", content: line.slice(1), oldLine, newLine });
50
+ oldLine++;
51
+ newLine++;
52
+ }
53
+ }
54
+ return result;
55
+ }
56
+ function countChanges(lines) {
57
+ let added = 0;
58
+ let removed = 0;
59
+ for (const line of lines) {
60
+ if (line.type === "add")
61
+ added++;
62
+ if (line.type === "remove")
63
+ removed++;
64
+ }
65
+ return { added, removed };
66
+ }
67
+ // ────────────────────────────────────────────────────────────────────────────
68
+ function renderLine(line, gutterWidth) {
69
+ if (line.type === "hunk") {
70
+ return chalk.cyan.dim(line.content);
71
+ }
72
+ const marker = line.type === "add" ? "+" : line.type === "remove" ? "-" : " ";
73
+ const lineNum = line.type === "remove" ? String(line.oldLine ?? "") : String(line.newLine ?? "");
74
+ const gutter = `${lineNum.padStart(gutterWidth)} ${marker} `;
75
+ if (line.type === "add") {
76
+ return chalk.green.dim(gutter) + chalk.green(line.content);
77
+ }
78
+ if (line.type === "remove") {
79
+ return chalk.red.dim(gutter) + chalk.red(line.content);
80
+ }
81
+ return chalk.dim(gutter + line.content);
82
+ }
83
+ // ────────────────────────────────────────────────────────────────────────────
84
+ export function DiffView({ patch, filePath, maxLines = 80 }) {
85
+ const parsed = parsePatch(patch);
86
+ const { added, removed } = countChanges(parsed);
87
+ const displayLines = parsed.slice(0, maxLines);
88
+ const remaining = parsed.length - maxLines;
89
+ const maxLineNum = Math.max(...parsed.map((l) => l.oldLine ?? l.newLine ?? 0), 1);
90
+ const gutterWidth = String(maxLineNum).length;
91
+ const body = displayLines.map((line) => renderLine(line, gutterWidth)).join("\n");
92
+ return (_jsxs(Box, { flexDirection: "column", children: [filePath && (_jsxs(Box, { gap: 2, flexDirection: "row", children: [_jsx(Text, { bold: true, children: filePath }), _jsxs(Text, { dimColor: true, children: [added > 0 && _jsxs(Text, { color: "green", children: ["+", added] }), added > 0 && removed > 0 && _jsx(Text, { children: " " }), removed > 0 && _jsxs(Text, { color: "red", children: ["-", removed] })] })] })), !filePath && (added > 0 || removed > 0) && (_jsxs(Text, { dimColor: true, children: [added > 0 ? `${added} added` : "", added > 0 && removed > 0 ? ", " : "", removed > 0 ? `${removed} removed` : ""] })), _jsx(Text, { children: body }), remaining > 0 && _jsxs(Text, { dimColor: true, children: ["... ", remaining, " more line(s)"] })] }));
93
+ }
94
+ //# sourceMappingURL=DiffView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiffView.js","sourceRoot":"","sources":["../../src/components/DiffView.tsx"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  /**
2
- * ErrorDisplay — shows errors that occur during execution.
2
+ * ErrorDisplay — visual-only error display for the TUI.
3
3
  *
4
- * Red bordered box with error message. Optional dismiss handler.
4
+ * Red bordered box with error message. No internal useInput —
5
+ * the parent orchestrator handles dismissal keystrokes.
5
6
  */
6
- interface ErrorDisplayProps {
7
+ export interface ErrorDisplayProps {
7
8
  error: Error | string | null;
8
- onDismiss?: () => void;
9
+ showDismissHint?: boolean;
9
10
  }
10
- export declare function ErrorDisplay({ error, onDismiss }: ErrorDisplayProps): import("react/jsx-runtime").JSX.Element | null;
11
- export {};
11
+ export declare function ErrorDisplay({ error, showDismissHint }: ErrorDisplayProps): import("react/jsx-runtime").JSX.Element | null;
12
12
  //# sourceMappingURL=ErrorDisplay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ErrorDisplay.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,iBAAiB,kDA2BnE"}
1
+ {"version":3,"file":"ErrorDisplay.d.ts","sourceRoot":"","sources":["../../src/components/ErrorDisplay.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,eAAuB,EAAE,EAAE,iBAAiB,kDAoBjF"}
@@ -1,17 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * ErrorDisplay — shows errors that occur during execution.
3
+ * ErrorDisplay — visual-only error display for the TUI.
4
4
  *
5
- * Red bordered box with error message. Optional dismiss handler.
5
+ * Red bordered box with error message. No internal useInput —
6
+ * the parent orchestrator handles dismissal keystrokes.
6
7
  */
7
- import { Box, Text, useInput } from "ink";
8
- export function ErrorDisplay({ error, onDismiss }) {
9
- useInput(() => {
10
- onDismiss?.();
11
- }, { isActive: !!onDismiss && !!error });
8
+ import { Box, Text } from "ink";
9
+ export function ErrorDisplay({ error, showDismissHint = false }) {
12
10
  if (!error)
13
11
  return null;
14
12
  const message = error instanceof Error ? error.message : error;
15
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "red", paddingX: 1, marginTop: 1, children: [_jsx(Text, { color: "red", bold: true, children: "Error" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: message }) }), onDismiss && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Press any key to dismiss" }) }))] }));
13
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "red", paddingX: 1, marginTop: 1, children: [_jsx(Text, { color: "red", bold: true, children: "Error" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: message }) }), showDismissHint && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Press any key to dismiss" }) }))] }));
16
14
  }
17
15
  //# sourceMappingURL=ErrorDisplay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorDisplay.js","sourceRoot":"","sources":["../../src/components/ErrorDisplay.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAO1C,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAqB;IAClE,QAAQ,CACN,GAAG,EAAE;QACH,SAAS,EAAE,EAAE,CAAC;IAChB,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,CACrC,CAAC;IAEF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAE/D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,aACzF,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,4BAEf,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,cAAE,OAAO,GAAQ,GAClB,EACL,SAAS,IAAI,CACZ,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yCAAgC,GAC9C,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ErrorDisplay.js","sourceRoot":"","sources":["../../src/components/ErrorDisplay.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAOhC,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,KAAK,EAAqB;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAE/D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,aACzF,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,4BAEf,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,cAAE,OAAO,GAAQ,GAClB,EACL,eAAe,IAAI,CAClB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yCAAgC,GAC9C,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,13 +1,14 @@
1
1
  /**
2
- * InputBar — user text input for the TUI.
2
+ * InputBar — visual-only user text input for the TUI.
3
3
  *
4
- * Uses ink-text-input. Enter submits, disabled while streaming.
4
+ * Renders value/cursor state passed from the parent. No internal useInput
5
+ * or useLineEditor — the parent orchestrator owns all input routing.
5
6
  */
6
- interface InputBarProps {
7
- onSubmit: (text: string) => void;
8
- isDisabled?: boolean;
7
+ export interface InputBarProps {
8
+ value: string;
9
+ cursor: number;
10
+ isActive?: boolean;
9
11
  placeholder?: string;
10
12
  }
11
- export declare function InputBar({ onSubmit, isDisabled, placeholder }: InputBarProps): import("react/jsx-runtime").JSX.Element;
12
- export {};
13
+ export declare function InputBar({ value, cursor, isActive, placeholder }: InputBarProps): import("react/jsx-runtime").JSX.Element;
13
14
  //# sourceMappingURL=InputBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAkB,EAAE,WAAW,EAAE,EAAE,aAAa,2CA0BpF"}
1
+ {"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAe,EAAE,WAAW,EAAE,EAAE,aAAa,2CAwBtF"}
@@ -1,20 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * InputBar — user text input for the TUI.
3
+ * InputBar — visual-only user text input for the TUI.
4
4
  *
5
- * Uses ink-text-input. Enter submits, disabled while streaming.
5
+ * Renders value/cursor state passed from the parent. No internal useInput
6
+ * or useLineEditor — the parent orchestrator owns all input routing.
6
7
  */
7
- import { useState, useCallback } from "react";
8
8
  import { Box, Text } from "ink";
9
- import TextInput from "ink-text-input";
10
- export function InputBar({ onSubmit, isDisabled = false, placeholder }) {
11
- const [value, setValue] = useState("");
12
- const handleSubmit = useCallback((text) => {
13
- if (!text.trim() || isDisabled)
14
- return;
15
- onSubmit(text.trim());
16
- setValue("");
17
- }, [onSubmit, isDisabled]);
18
- return (_jsxs(Box, { borderStyle: "single", borderColor: isDisabled ? "gray" : "cyan", paddingLeft: 1, children: [_jsx(Text, { color: isDisabled ? "gray" : "green", bold: true, children: "› " }), _jsx(TextInput, { value: value, onChange: setValue, onSubmit: handleSubmit, focus: !isDisabled, placeholder: placeholder ?? (isDisabled ? "Waiting for response..." : "Type a message...") })] }));
9
+ import { RichTextInput } from "./RichTextInput.js";
10
+ export function InputBar({ value, cursor, isActive = true, placeholder }) {
11
+ const resolvedPlaceholder = placeholder ?? (isActive ? "Type a message..." : "Waiting for response...");
12
+ return (_jsxs(Box, { flexDirection: "row", borderStyle: "single", borderLeft: false, borderRight: false, borderColor: isActive ? "#34d399" : "gray", paddingLeft: 1, children: [_jsx(Text, { color: isActive ? "#34d399" : "gray", bold: true, children: "› " }), _jsx(RichTextInput, { value: value, cursor: cursor, placeholder: resolvedPlaceholder, isActive: isActive })] }));
19
13
  }
20
14
  //# sourceMappingURL=InputBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAQvC,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,GAAG,KAAK,EAAE,WAAW,EAAiB;IACnF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,IAAY,EAAE,EAAE;QACf,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,UAAU;YAAE,OAAO;QACvC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACf,CAAC,EACD,CAAC,QAAQ,EAAE,UAAU,CAAC,CACvB,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,aACjF,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,kBAC7C,IAAI,GACA,EACP,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,CAAC,UAAU,EAClB,WAAW,EAAE,WAAW,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAC1F,IACE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,WAAW,EAAiB;IACrF,MAAM,mBAAmB,GACvB,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAE9E,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,WAAW,EAAC,QAAQ,EACpB,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAC1C,WAAW,EAAE,CAAC,aAEd,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,kBAC7C,IAAI,GACA,EACP,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,QAAQ,GAClB,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -1,12 +1,18 @@
1
1
  /**
2
- * MessageList — displays completed conversation messages.
2
+ * MessageList — displays conversation messages.
3
3
  *
4
- * Uses Ink's <Static> for messages that won't re-render (performance critical).
5
- * Listens for execution_end events which contain `output.timeline` with all entries.
4
+ * Accepts messages from useChat and splits them into:
5
+ * - Committed messages Ink's <Static> (rendered once, never updated)
6
+ * - In-progress message → regular render (updates as blocks complete)
7
+ *
8
+ * When not executing, all messages are committed.
9
+ * When executing, the last message may still be receiving blocks.
6
10
  */
11
+ import type { ChatMessage } from "@agentick/client";
7
12
  interface MessageListProps {
8
- sessionId?: string;
13
+ messages: readonly ChatMessage[];
14
+ isExecuting: boolean;
9
15
  }
10
- export declare function MessageList({ sessionId }: MessageListProps): import("react/jsx-runtime").JSX.Element | null;
16
+ export declare function MessageList({ messages, isExecuting }: MessageListProps): import("react/jsx-runtime").JSX.Element;
11
17
  export {};
12
18
  //# sourceMappingURL=MessageList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+CH,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,gBAAgB,kDAoD1D"}
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAqDpD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,gBAAgB,2CAkCtE"}
@@ -1,13 +1,16 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /**
3
- * MessageList — displays completed conversation messages.
3
+ * MessageList — displays conversation messages.
4
4
  *
5
- * Uses Ink's <Static> for messages that won't re-render (performance critical).
6
- * Listens for execution_end events which contain `output.timeline` with all entries.
5
+ * Accepts messages from useChat and splits them into:
6
+ * - Committed messages Ink's <Static> (rendered once, never updated)
7
+ * - In-progress message → regular render (updates as blocks complete)
8
+ *
9
+ * When not executing, all messages are committed.
10
+ * When executing, the last message may still be receiving blocks.
7
11
  */
8
- import { useState, useEffect, useCallback } from "react";
12
+ import { useCallback, useRef } from "react";
9
13
  import { Static, Box, Text } from "ink";
10
- import { useEvents } from "@agentick/react";
11
14
  function renderContent(content) {
12
15
  if (typeof content === "string")
13
16
  return content;
@@ -15,6 +18,8 @@ function renderContent(content) {
15
18
  .map((block) => {
16
19
  if (block.type === "text")
17
20
  return block.text;
21
+ if (block.type === "reasoning")
22
+ return `[thinking: ${block.text.slice(0, 80)}${block.text.length > 80 ? "..." : ""}]`;
18
23
  if (block.type === "tool_use")
19
24
  return `[tool: ${block.name}]`;
20
25
  if (block.type === "tool_result") {
@@ -23,7 +28,7 @@ function renderContent(content) {
23
28
  .map((c) => (c.type === "text" ? c.text : `[${c.type}]`))
24
29
  .join("")
25
30
  : String(block.content ?? "");
26
- return `[result: ${resultContent.slice(0, 100)}${resultContent.length > 100 ? "" : ""}]`;
31
+ return `[result: ${resultContent.slice(0, 100)}${resultContent.length > 100 ? "..." : ""}]`;
27
32
  }
28
33
  return `[${block.type}]`;
29
34
  })
@@ -37,47 +42,35 @@ function roleColor(role) {
37
42
  return "magenta";
38
43
  case "system":
39
44
  return "gray";
40
- case "tool_result":
41
- return "yellow";
42
45
  default:
43
46
  return "white";
44
47
  }
45
48
  }
46
- export function MessageList({ sessionId }) {
47
- const [messages, setMessages] = useState([]);
48
- const { event } = useEvents({
49
- sessionId,
50
- filter: ["execution_end"],
51
- });
52
- useEffect(() => {
53
- if (!event || event.type !== "execution_end")
54
- return;
55
- // execution_end.output is the COMInput which has a timeline array
56
- // Each entry has { kind: "message", message: Message } structure
57
- const execEnd = event;
58
- const timeline = execEnd.output?.timeline;
59
- if (!Array.isArray(timeline))
60
- return;
61
- const newMessages = timeline
62
- .filter((entry) => entry.kind === "message" && entry.message)
63
- .map((entry, i) => {
64
- const msg = entry.message;
65
- return {
66
- id: msg.id ?? `msg-${i}-${Date.now()}`,
67
- role: msg.role,
68
- text: renderContent(msg.content),
69
- };
70
- });
71
- setMessages(newMessages);
72
- }, [event]);
73
- const renderMessage = useCallback((msg) => {
74
- // Skip tool_result entries in the message list for cleaner output
75
- if (msg.role === "tool_result")
76
- return null;
77
- return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { color: roleColor(msg.role), bold: true, children: [msg.role, ":"] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { wrap: "wrap", children: msg.text }) })] }, msg.id));
78
- }, []);
79
- if (messages.length === 0)
49
+ function MessageItem({ message }) {
50
+ const text = renderContent(message.content);
51
+ if (!text)
80
52
  return null;
81
- return _jsx(Static, { items: messages, children: renderMessage });
53
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { color: roleColor(message.role), bold: true, children: [message.role, ":"] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { wrap: "wrap", children: text }) })] }));
54
+ }
55
+ export function MessageList({ messages, isExecuting }) {
56
+ // Track which message IDs have been committed to Static.
57
+ // Once committed, a message never leaves Static.
58
+ const committedIdsRef = useRef(new Set());
59
+ // Committed: all messages except the last one when executing
60
+ // (the last message may still be receiving blocks)
61
+ const splitIndex = isExecuting && messages.length > 0 ? messages.length - 1 : messages.length;
62
+ // Mark messages as committed
63
+ for (let i = 0; i < splitIndex; i++) {
64
+ committedIdsRef.current.add(messages[i].id);
65
+ }
66
+ // Build stable committed array (only messages we've committed)
67
+ const committed = messages.filter((m) => committedIdsRef.current.has(m.id));
68
+ const inProgress = isExecuting &&
69
+ messages.length > 0 &&
70
+ !committedIdsRef.current.has(messages[messages.length - 1].id)
71
+ ? messages[messages.length - 1]
72
+ : null;
73
+ const renderMessage = useCallback((msg) => _jsx(MessageItem, { message: msg }, msg.id), []);
74
+ return (_jsxs(_Fragment, { children: [committed.length > 0 && _jsx(Static, { items: committed, children: renderMessage }), inProgress && _jsx(MessageItem, { message: inProgress })] }));
82
75
  }
83
76
  //# sourceMappingURL=MessageList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * RichTextInput — renders line editor state with a visible cursor.
3
+ *
4
+ * Pure rendering component. All editing logic lives in useLineEditor.
5
+ */
6
+ interface RichTextInputProps {
7
+ value: string;
8
+ cursor: number;
9
+ placeholder?: string;
10
+ isActive?: boolean;
11
+ }
12
+ export declare function RichTextInput({ value, cursor, placeholder, isActive }: RichTextInputProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=RichTextInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextInput.d.ts","sourceRoot":"","sources":["../../src/components/RichTextInput.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAe,EAAE,EAAE,kBAAkB,2CA6BhG"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * RichTextInput — renders line editor state with a visible cursor.
4
+ *
5
+ * Pure rendering component. All editing logic lives in useLineEditor.
6
+ */
7
+ import { Text } from "ink";
8
+ export function RichTextInput({ value, cursor, placeholder, isActive = true }) {
9
+ if (!isActive) {
10
+ return _jsx(Text, { dimColor: true, children: placeholder ?? "" });
11
+ }
12
+ if (value.length === 0) {
13
+ if (placeholder) {
14
+ // Show cursor on first char of placeholder, rest dimmed
15
+ return (_jsxs(Text, { children: [_jsx(Text, { inverse: true, children: placeholder[0] }), _jsx(Text, { dimColor: true, children: placeholder.slice(1) })] }));
16
+ }
17
+ return _jsx(Text, { inverse: true, children: " " });
18
+ }
19
+ const before = value.slice(0, cursor);
20
+ const cursorChar = cursor < value.length ? value[cursor] : " ";
21
+ const after = cursor < value.length ? value.slice(cursor + 1) : "";
22
+ return (_jsxs(Text, { children: [before, _jsx(Text, { inverse: true, children: cursorChar }), after] }));
23
+ }
24
+ //# sourceMappingURL=RichTextInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextInput.js","sourceRoot":"","sources":["../../src/components/RichTextInput.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAS3B,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,IAAI,EAAsB;IAC/F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAC,IAAI,IAAC,QAAQ,kBAAE,WAAW,IAAI,EAAE,GAAQ,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,WAAW,EAAE,CAAC;YAChB,wDAAwD;YACxD,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,OAAO,kBAAE,WAAW,CAAC,CAAC,CAAC,GAAQ,EACrC,KAAC,IAAI,IAAC,QAAQ,kBAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,GAAQ,IACvC,CACR,CAAC;QACJ,CAAC;QACD,OAAO,KAAC,IAAI,IAAC,OAAO,wBAAS,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,OAAO,CACL,MAAC,IAAI,eACF,MAAM,EACP,KAAC,IAAI,IAAC,OAAO,kBAAE,UAAU,GAAQ,EAChC,KAAK,IACD,CACR,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToolCallIndicator.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallIndicator.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,UAAU,sBAAsB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,kDA2DtE"}
1
+ {"version":3,"file":"ToolCallIndicator.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallIndicator.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,UAAU,sBAAsB;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,kDAkEtE"}
@@ -19,18 +19,25 @@ export function ToolCallIndicator({ sessionId }) {
19
19
  if (!event)
20
20
  return;
21
21
  if (event.type === "tool_call_start" || event.type === "tool_call") {
22
- const e = event;
23
- const id = e.toolUseId ?? e.id ?? "unknown";
22
+ let e;
23
+ if (event.type === "tool_call_start") {
24
+ e = event;
25
+ }
26
+ else {
27
+ e = event;
28
+ }
29
+ const id = e.callId ?? "unknown";
24
30
  const name = e.name ?? "tool";
31
+ const summary = event.type === "tool_call" ? e.summary : undefined;
25
32
  setTools((prev) => {
26
33
  if (prev.some((t) => t.id === id))
27
34
  return prev;
28
- return [...prev, { id, name, status: "running" }];
35
+ return [...prev, { id, name, summary, status: "running" }];
29
36
  });
30
37
  }
31
38
  if (event.type === "tool_result") {
32
39
  const e = event;
33
- const id = e.toolUseId ?? "unknown";
40
+ const id = e.callId ?? "unknown";
34
41
  setTools((prev) => prev.map((t) => (t.id === id ? { ...t, status: "done" } : t)));
35
42
  }
36
43
  }, [event]);
@@ -44,6 +51,6 @@ export function ToolCallIndicator({ sessionId }) {
44
51
  }, [tools]);
45
52
  if (tools.length === 0)
46
53
  return null;
47
- return (_jsx(Box, { flexDirection: "column", marginLeft: 2, children: tools.map((tool) => (_jsxs(Box, { gap: 1, children: [tool.status === "running" ? (_jsx(Text, { color: "yellow", children: _jsx(Spinner, { type: "dots" }) })) : (_jsx(Text, { color: "green", children: "\u2713" })), _jsx(Text, { color: tool.status === "running" ? "yellow" : "gray", dimColor: tool.status === "done", children: tool.name })] }, tool.id))) }));
54
+ return (_jsx(Box, { flexDirection: "column", marginLeft: 2, children: tools.map((tool) => (_jsxs(Box, { gap: 1, flexDirection: "row", children: [tool.status === "running" ? (_jsx(Text, { color: "yellow", children: _jsx(Spinner, { type: "dots" }) })) : (_jsx(Text, { color: "green", children: "\u2713" })), _jsx(Text, { color: tool.status === "running" ? "yellow" : "gray", dimColor: tool.status === "done", children: tool.name }), tool.summary && _jsx(Text, { dimColor: true, children: tool.summary })] }, tool.id))) }));
48
55
  }
49
56
  //# sourceMappingURL=ToolCallIndicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolCallIndicator.js","sourceRoot":"","sources":["../../src/components/ToolCallIndicator.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,MAAM,UAAU,iBAAiB,CAAC,EAAE,SAAS,EAA0B;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;QAC1B,SAAS;QACT,MAAM,EAAE,CAAC,iBAAiB,EAAE,WAAW,EAAE,aAAa,CAAC;KACxD,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACnE,MAAM,CAAC,GAAG,KAAyE,CAAC;YACpF,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,IAAI,SAAS,CAAC;YAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC;YAC9B,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC/C,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,KAA6C,CAAC;YACxD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC;YACpC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC5E,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACnD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACtC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,MAAC,GAAG,IAAe,GAAG,EAAE,CAAC,aACtB,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAC3B,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAClB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,CACR,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,uBAAS,CAC7B,EACD,KAAC,IAAI,IACH,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EACpD,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,YAE/B,IAAI,CAAC,IAAI,GACL,KAbC,IAAI,CAAC,EAAE,CAcX,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ToolCallIndicator.js","sourceRoot":"","sources":["../../src/components/ToolCallIndicator.tsx"],"names":[],"mappings":"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"}
@@ -1,14 +1,17 @@
1
1
  /**
2
- * ToolConfirmationPrompt — inline confirmation UI for tools that require approval.
2
+ * ToolConfirmationPrompt — visual-only confirmation UI for tools that require approval.
3
3
  *
4
- * Shows tool name, arguments, and Y/N/A key bindings.
5
- * Renders as a bordered box inline in the terminal (no overlays).
4
+ * Shows tool name, arguments, and Y/N/A key hints.
5
+ * No internal useInput the parent orchestrator handles keystrokes
6
+ * and calls respond() directly.
7
+ *
8
+ * When metadata with type "diff" is present, renders a colored diff view
9
+ * instead of raw JSON arguments.
6
10
  */
7
- import type { ToolConfirmationRequest, ToolConfirmationResponse } from "@agentick/client";
11
+ import type { ToolConfirmationRequest } from "@agentick/client";
8
12
  interface ToolConfirmationPromptProps {
9
13
  request: ToolConfirmationRequest;
10
- onRespond: (response: ToolConfirmationResponse) => void;
11
14
  }
12
- export declare function ToolConfirmationPrompt({ request, onRespond }: ToolConfirmationPromptProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function ToolConfirmationPrompt({ request }: ToolConfirmationPromptProps): import("react/jsx-runtime").JSX.Element;
13
16
  export {};
14
17
  //# sourceMappingURL=ToolConfirmationPrompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolConfirmationPrompt.d.ts","sourceRoot":"","sources":["../../src/components/ToolConfirmationPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE1F,UAAU,2BAA2B;IACnC,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,CAAC,QAAQ,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACzD;AAWD,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,2BAA2B,2CAgDzF"}
1
+ {"version":3,"file":"ToolConfirmationPrompt.d.ts","sourceRoot":"","sources":["../../src/components/ToolConfirmationPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAIhE,UAAU,2BAA2B;IACnC,OAAO,EAAE,uBAAuB,CAAC;CAClC;AAiBD,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,EAAE,2BAA2B,2CA0C9E"}
@@ -1,11 +1,22 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * ToolConfirmationPrompt — inline confirmation UI for tools that require approval.
3
+ * ToolConfirmationPrompt — visual-only confirmation UI for tools that require approval.
4
4
  *
5
- * Shows tool name, arguments, and Y/N/A key bindings.
6
- * Renders as a bordered box inline in the terminal (no overlays).
5
+ * Shows tool name, arguments, and Y/N/A key hints.
6
+ * No internal useInput the parent orchestrator handles keystrokes
7
+ * and calls respond() directly.
8
+ *
9
+ * When metadata with type "diff" is present, renders a colored diff view
10
+ * instead of raw JSON arguments.
7
11
  */
8
- import { Box, Text, useInput } from "ink";
12
+ import { Box, Text } from "ink";
13
+ import { DiffView } from "./DiffView.js";
14
+ function isDiffPreview(meta) {
15
+ if (!meta || typeof meta !== "object")
16
+ return false;
17
+ const m = meta;
18
+ return m.type === "diff" && typeof m.filePath === "string" && typeof m.patch === "string";
19
+ }
9
20
  function formatArguments(args) {
10
21
  const json = JSON.stringify(args, null, 2);
11
22
  const lines = json.split("\n");
@@ -14,20 +25,8 @@ function formatArguments(args) {
14
25
  }
15
26
  return json;
16
27
  }
17
- export function ToolConfirmationPrompt({ request, onRespond }) {
18
- useInput((input) => {
19
- const key = input.toLowerCase();
20
- if (key === "y") {
21
- onRespond({ approved: true });
22
- }
23
- else if (key === "n") {
24
- onRespond({ approved: false, reason: "rejected by user" });
25
- }
26
- else if (key === "a") {
27
- // "Always allow" — for now just approves (no persistence, YAGNI)
28
- onRespond({ approved: true });
29
- }
30
- });
31
- return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, marginTop: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: "Tool Confirmation" }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: [_jsx(Text, { bold: true, children: request.name }), " wants to run:"] }) }), request.message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: request.message }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: formatArguments(request.arguments) }) }), _jsxs(Box, { marginTop: 1, gap: 2, children: [_jsx(Text, { color: "green", bold: true, children: "[Y] Approve" }), _jsx(Text, { color: "red", bold: true, children: "[N] Reject" }), _jsx(Text, { color: "cyan", bold: true, children: "[A] Always Allow" })] })] }));
28
+ export function ToolConfirmationPrompt({ request }) {
29
+ const diffMeta = isDiffPreview(request.metadata) ? request.metadata : null;
30
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, marginTop: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: "Tool Confirmation" }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: [_jsx(Text, { bold: true, children: request.name }), " wants to run:"] }) }), request.message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: request.message }) })), _jsx(Box, { marginTop: 1, children: diffMeta ? (_jsx(DiffView, { patch: diffMeta.patch, filePath: diffMeta.filePath })) : (_jsx(Text, { color: "gray", children: formatArguments(request.arguments) })) }), _jsxs(Box, { marginTop: 1, flexDirection: "row", gap: 2, children: [_jsx(Text, { color: "green", bold: true, children: "[Y] Approve" }), _jsx(Text, { color: "red", bold: true, children: "[N] Reject" }), _jsx(Text, { color: "cyan", bold: true, children: "[A] Always Allow" })] })] }));
32
31
  }
33
32
  //# sourceMappingURL=ToolConfirmationPrompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolConfirmationPrompt.js","sourceRoot":"","sources":["../../src/components/ToolConfirmationPrompt.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAQ1C,SAAS,eAAe,CAAC,IAA6B;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAE,OAAO,EAAE,SAAS,EAA+B;IACxF,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,iEAAiE;YACjE,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,aAC5F,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,wCAElB,EAEP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,IAAI,kBAAE,OAAO,CAAC,IAAI,GAAQ,sBAC3B,GACH,EAEL,OAAO,CAAC,OAAO,IAAI,CAClB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,CAAC,OAAO,GAAQ,GACvC,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,GAAQ,GAC1D,EAEN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aACvB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,kCAEjB,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,iCAEf,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,uCAEhB,IACH,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ToolConfirmationPrompt.js","sourceRoot":"","sources":["../../src/components/ToolConfirmationPrompt.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAMzC,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;AAC5F,CAAC;AAED,SAAS,eAAe,CAAC,IAA6B;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAE,OAAO,EAA+B;IAC7E,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3E,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,aAC5F,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,wCAElB,EAEP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,IAAI,kBAAE,OAAO,CAAC,IAAI,GAAQ,sBAC3B,GACH,EAEL,OAAO,CAAC,OAAO,IAAI,CAClB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,CAAC,OAAO,GAAQ,GACvC,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACd,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,GAAI,CACjE,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,GAAQ,CAC/D,GACG,EAEN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,aAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,kCAEjB,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,iCAEf,EACP,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,uCAEhB,IACH,IACF,CACP,CAAC;AACJ,CAAC"}