@agentick/tui 0.4.0 → 0.5.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.
- package/README.md +51 -12
- package/dist/components/InputBar.d.ts +12 -2
- package/dist/components/InputBar.d.ts.map +1 -1
- package/dist/components/InputBar.js +14 -5
- package/dist/components/InputBar.js.map +1 -1
- package/dist/components/MessageList.d.ts +2 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +26 -16
- package/dist/components/MessageList.js.map +1 -1
- package/dist/create-tui.d.ts +14 -6
- package/dist/create-tui.d.ts.map +1 -1
- package/dist/create-tui.js +12 -2
- package/dist/create-tui.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -54,6 +54,16 @@ import { MyDashboard } from "./dashboard.js";
|
|
|
54
54
|
createTUI({ app, ui: MyDashboard }).start();
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
### Alternate Screen
|
|
58
|
+
|
|
59
|
+
Use the terminal's alternate screen buffer to avoid polluting scrollback:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
createTUI({ app, alternateScreen: true }).start();
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
When enabled, the TUI takes over the alternate screen on start and restores the normal screen on exit. This prevents terminal scrollbar confusion where native scrollback doesn't interact with Ink's rendering.
|
|
66
|
+
|
|
57
67
|
## CLI
|
|
58
68
|
|
|
59
69
|
The `agentick-tui` binary launches a TUI from the command line.
|
|
@@ -104,20 +114,22 @@ Returns `{ start(): Promise<void> }`.
|
|
|
104
114
|
|
|
105
115
|
**Local options:**
|
|
106
116
|
|
|
107
|
-
| Option
|
|
108
|
-
|
|
|
109
|
-
| `app`
|
|
110
|
-
| `sessionId`
|
|
111
|
-
| `ui`
|
|
117
|
+
| Option | Type | Description |
|
|
118
|
+
| ----------------- | -------------- | -------------------------------------------- |
|
|
119
|
+
| `app` | `App` | Agentick App instance |
|
|
120
|
+
| `sessionId` | `string` | Session ID (default: `"main"`) |
|
|
121
|
+
| `ui` | `TUIComponent` | Custom UI component (default: `Chat`) |
|
|
122
|
+
| `alternateScreen` | `boolean` | Use alternate screen buffer (default: false) |
|
|
112
123
|
|
|
113
124
|
**Remote options:**
|
|
114
125
|
|
|
115
|
-
| Option
|
|
116
|
-
|
|
|
117
|
-
| `url`
|
|
118
|
-
| `token`
|
|
119
|
-
| `sessionId`
|
|
120
|
-
| `ui`
|
|
126
|
+
| Option | Type | Description |
|
|
127
|
+
| ----------------- | -------------- | -------------------------------------------- |
|
|
128
|
+
| `url` | `string` | Gateway URL |
|
|
129
|
+
| `token` | `string` | Auth token |
|
|
130
|
+
| `sessionId` | `string` | Session ID (default: `"main"`) |
|
|
131
|
+
| `ui` | `TUIComponent` | Custom UI component (default: `Chat`) |
|
|
132
|
+
| `alternateScreen` | `boolean` | Use alternate screen buffer (default: false) |
|
|
121
133
|
|
|
122
134
|
### TUIComponent
|
|
123
135
|
|
|
@@ -144,7 +156,34 @@ All components are exported for building custom UIs.
|
|
|
144
156
|
| `ToolCallIndicator` | Spinner during tool execution |
|
|
145
157
|
| `ToolConfirmationPrompt` | Y/N/A prompt for tools with `requireConfirmation` |
|
|
146
158
|
| `ErrorDisplay` | Error box with optional dismiss |
|
|
147
|
-
| `InputBar` | Text input
|
|
159
|
+
| `InputBar` | Text input with controlled/uncontrolled modes |
|
|
160
|
+
|
|
161
|
+
### InputBar
|
|
162
|
+
|
|
163
|
+
Supports two modes:
|
|
164
|
+
|
|
165
|
+
**Uncontrolled** (default) — manages its own value, clears on submit:
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
<InputBar onSubmit={(text) => send(text)} isDisabled={isStreaming} />
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Controlled** — parent owns the value (needed for Ctrl+L clear, scroll mode, etc.):
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
const [value, setValue] = useState("");
|
|
175
|
+
|
|
176
|
+
<InputBar
|
|
177
|
+
value={value}
|
|
178
|
+
onChange={setValue}
|
|
179
|
+
onSubmit={(text) => { send(text); setValue(""); }}
|
|
180
|
+
isDisabled={isStreaming}
|
|
181
|
+
/>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### MessageList
|
|
185
|
+
|
|
186
|
+
Uses `execution_end` events as its data source. When the event includes `newTimelineEntries` (a delta of entries added during that execution), MessageList appends them. Falls back to replacing all messages from `output.timeline` for backwards compatibility.
|
|
148
187
|
|
|
149
188
|
## Architecture
|
|
150
189
|
|
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
* InputBar — user text input for the TUI.
|
|
3
3
|
*
|
|
4
4
|
* Uses ink-text-input. Enter submits, disabled while streaming.
|
|
5
|
+
* Supports controlled mode (value + onChange) or uncontrolled (internal state).
|
|
5
6
|
*/
|
|
6
|
-
interface
|
|
7
|
+
interface InputBarPropsBase {
|
|
7
8
|
onSubmit: (text: string) => void;
|
|
8
9
|
isDisabled?: boolean;
|
|
9
10
|
placeholder?: string;
|
|
10
11
|
}
|
|
11
|
-
|
|
12
|
+
interface ControlledInputBarProps extends InputBarPropsBase {
|
|
13
|
+
value: string;
|
|
14
|
+
onChange: (value: string) => void;
|
|
15
|
+
}
|
|
16
|
+
interface UncontrolledInputBarProps extends InputBarPropsBase {
|
|
17
|
+
value?: undefined;
|
|
18
|
+
onChange?: undefined;
|
|
19
|
+
}
|
|
20
|
+
type InputBarProps = ControlledInputBarProps | UncontrolledInputBarProps;
|
|
21
|
+
export declare function InputBar({ onSubmit, isDisabled, placeholder, value, onChange, }: InputBarProps): import("react/jsx-runtime").JSX.Element;
|
|
12
22
|
export {};
|
|
13
23
|
//# sourceMappingURL=InputBar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"InputBar.d.ts","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,iBAAiB;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,uBAAwB,SAAQ,iBAAiB;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,UAAU,yBAA0B,SAAQ,iBAAiB;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,KAAK,aAAa,GAAG,uBAAuB,GAAG,yBAAyB,CAAC;AAEzE,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,UAAkB,EAClB,WAAW,EACX,KAAK,EACL,QAAQ,GACT,EAAE,aAAa,2CAyCf"}
|
|
@@ -3,18 +3,27 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
* InputBar — user text input for the TUI.
|
|
4
4
|
*
|
|
5
5
|
* Uses ink-text-input. Enter submits, disabled while streaming.
|
|
6
|
+
* Supports controlled mode (value + onChange) or uncontrolled (internal state).
|
|
6
7
|
*/
|
|
7
8
|
import { useState, useCallback } from "react";
|
|
8
9
|
import { Box, Text } from "ink";
|
|
9
10
|
import TextInput from "ink-text-input";
|
|
10
|
-
export function InputBar({ onSubmit, isDisabled = false, placeholder }) {
|
|
11
|
-
const
|
|
11
|
+
export function InputBar({ onSubmit, isDisabled = false, placeholder, value, onChange, }) {
|
|
12
|
+
const isControlled = value !== undefined && onChange !== undefined;
|
|
13
|
+
const [internalValue, setInternalValue] = useState("");
|
|
14
|
+
const currentValue = isControlled ? value : internalValue;
|
|
15
|
+
const handleChange = isControlled ? onChange : setInternalValue;
|
|
12
16
|
const handleSubmit = useCallback((text) => {
|
|
13
17
|
if (!text.trim() || isDisabled)
|
|
14
18
|
return;
|
|
15
19
|
onSubmit(text.trim());
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
if (isControlled) {
|
|
21
|
+
onChange("");
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
setInternalValue("");
|
|
25
|
+
}
|
|
26
|
+
}, [onSubmit, isDisabled, isControlled, onChange]);
|
|
27
|
+
return (_jsxs(Box, { flexDirection: "row", borderStyle: "single", borderLeft: false, borderRight: false, borderColor: isDisabled ? "gray" : "cyan", paddingLeft: 1, children: [_jsx(Text, { color: isDisabled ? "gray" : "green", bold: true, children: "› " }), _jsx(TextInput, { value: currentValue, onChange: handleChange, onSubmit: handleSubmit, focus: !isDisabled, placeholder: placeholder ?? (isDisabled ? "Waiting for response..." : "Type a message...") })] }));
|
|
19
28
|
}
|
|
20
29
|
//# sourceMappingURL=InputBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"InputBar.js","sourceRoot":"","sources":["../../src/components/InputBar.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;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;AAoBvC,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,UAAU,GAAG,KAAK,EAClB,WAAW,EACX,KAAK,EACL,QAAQ,GACM;IACd,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC;IACnE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1D,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAEhE,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,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAC/C,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,KAAK,EACnB,WAAW,EAAC,QAAQ,EACpB,UAAU,EAAE,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACzC,WAAW,EAAE,CAAC,aAEd,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,YAAY,EACnB,QAAQ,EAAE,YAAY,EACtB,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"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* MessageList — displays completed conversation messages.
|
|
3
3
|
*
|
|
4
4
|
* Uses Ink's <Static> for messages that won't re-render (performance critical).
|
|
5
|
-
* Listens for execution_end events
|
|
5
|
+
* Listens for execution_end events. Uses newTimelineEntries (delta) when available,
|
|
6
|
+
* falls back to output.timeline (full replace) for backwards compatibility.
|
|
6
7
|
*/
|
|
7
8
|
interface MessageListProps {
|
|
8
9
|
sessionId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8DH,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,gBAAgB,kDAkD1D"}
|
|
@@ -3,7 +3,8 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
* MessageList — displays completed conversation messages.
|
|
4
4
|
*
|
|
5
5
|
* Uses Ink's <Static> for messages that won't re-render (performance critical).
|
|
6
|
-
* Listens for execution_end events
|
|
6
|
+
* Listens for execution_end events. Uses newTimelineEntries (delta) when available,
|
|
7
|
+
* falls back to output.timeline (full replace) for backwards compatibility.
|
|
7
8
|
*/
|
|
8
9
|
import { useState, useEffect, useCallback } from "react";
|
|
9
10
|
import { Static, Box, Text } from "ink";
|
|
@@ -43,6 +44,18 @@ function roleColor(role) {
|
|
|
43
44
|
return "white";
|
|
44
45
|
}
|
|
45
46
|
}
|
|
47
|
+
function timelineToMessages(entries) {
|
|
48
|
+
return entries
|
|
49
|
+
.filter((entry) => entry.kind === "message" && entry.message)
|
|
50
|
+
.map((entry, i) => {
|
|
51
|
+
const msg = entry.message;
|
|
52
|
+
return {
|
|
53
|
+
id: msg.id ?? `msg-${i}-${Date.now()}`,
|
|
54
|
+
role: msg.role,
|
|
55
|
+
text: renderContent(msg.content),
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
46
59
|
export function MessageList({ sessionId }) {
|
|
47
60
|
const [messages, setMessages] = useState([]);
|
|
48
61
|
const { event } = useEvents({
|
|
@@ -52,23 +65,20 @@ export function MessageList({ sessionId }) {
|
|
|
52
65
|
useEffect(() => {
|
|
53
66
|
if (!event || event.type !== "execution_end")
|
|
54
67
|
return;
|
|
55
|
-
// execution_end.output is the COMInput which has a timeline array
|
|
56
|
-
// Each entry has { kind: "message", message: Message } structure
|
|
57
68
|
const execEnd = event;
|
|
58
|
-
|
|
59
|
-
if (
|
|
69
|
+
// Prefer delta (append) over full timeline (replace)
|
|
70
|
+
if (execEnd.newTimelineEntries && execEnd.newTimelineEntries.length > 0) {
|
|
71
|
+
const newMessages = timelineToMessages(execEnd.newTimelineEntries);
|
|
72
|
+
if (newMessages.length > 0) {
|
|
73
|
+
setMessages((prev) => [...prev, ...newMessages]);
|
|
74
|
+
}
|
|
60
75
|
return;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
role: msg.role,
|
|
68
|
-
text: renderContent(msg.content),
|
|
69
|
-
};
|
|
70
|
-
});
|
|
71
|
-
setMessages(newMessages);
|
|
76
|
+
}
|
|
77
|
+
// Fallback: full timeline replace
|
|
78
|
+
const timeline = execEnd.output?.timeline;
|
|
79
|
+
if (Array.isArray(timeline)) {
|
|
80
|
+
setMessages(timelineToMessages(timeline));
|
|
81
|
+
}
|
|
72
82
|
}, [event]);
|
|
73
83
|
const renderMessage = useCallback((msg) => {
|
|
74
84
|
// Skip tool_result entries in the message list for cleaner output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"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"}
|
package/dist/create-tui.d.ts
CHANGED
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
* createTUI({ app: myApp, ui: MyDashboard }).start();
|
|
21
21
|
* ```
|
|
22
22
|
*
|
|
23
|
+
* @example Alternate Screen (no scrollback pollution)
|
|
24
|
+
* ```typescript
|
|
25
|
+
* createTUI({ app: myApp, alternateScreen: true }).start();
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
23
28
|
* @module @agentick/tui/create-tui
|
|
24
29
|
*/
|
|
25
30
|
import type { ComponentType } from "react";
|
|
@@ -28,17 +33,20 @@ import type { App } from "@agentick/core";
|
|
|
28
33
|
export type TUIComponent = ComponentType<{
|
|
29
34
|
sessionId: string;
|
|
30
35
|
}>;
|
|
31
|
-
|
|
32
|
-
app: App;
|
|
36
|
+
interface TUIOptionsBase {
|
|
33
37
|
sessionId?: string;
|
|
34
38
|
ui?: TUIComponent;
|
|
35
|
-
|
|
39
|
+
/** Use alternate screen buffer to avoid polluting terminal scrollback. */
|
|
40
|
+
alternateScreen?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export type TUIOptions = ({
|
|
43
|
+
app: App;
|
|
44
|
+
} & TUIOptionsBase) | ({
|
|
36
45
|
url: string;
|
|
37
46
|
token?: string;
|
|
38
|
-
|
|
39
|
-
ui?: TUIComponent;
|
|
40
|
-
};
|
|
47
|
+
} & TUIOptionsBase);
|
|
41
48
|
export declare function createTUI(options: TUIOptions): {
|
|
42
49
|
start(): Promise<void>;
|
|
43
50
|
};
|
|
51
|
+
export {};
|
|
44
52
|
//# sourceMappingURL=create-tui.d.ts.map
|
package/dist/create-tui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tui.d.ts","sourceRoot":"","sources":["../src/create-tui.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"create-tui.d.ts","sourceRoot":"","sources":["../src/create-tui.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAM3C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAG1C,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhE,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,cAAc,CAAC,GAC/B,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAAC,CAAC;AAEvD,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU;;EAuC5C"}
|
package/dist/create-tui.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Chat } from "./ui/chat.js";
|
|
|
7
7
|
import EventSourcePolyfill from "eventsource";
|
|
8
8
|
export function createTUI(options) {
|
|
9
9
|
return {
|
|
10
|
-
start() {
|
|
10
|
+
async start() {
|
|
11
11
|
const sessionId = options.sessionId ?? "main";
|
|
12
12
|
const Component = options.ui ?? Chat;
|
|
13
13
|
const client = "app" in options
|
|
@@ -21,8 +21,18 @@ export function createTUI(options) {
|
|
|
21
21
|
EventSource: (globalThis.EventSource ??
|
|
22
22
|
EventSourcePolyfill),
|
|
23
23
|
});
|
|
24
|
+
if (options.alternateScreen) {
|
|
25
|
+
process.stdout.write("\x1b[?1049h\x1b[H\x1b[2J");
|
|
26
|
+
}
|
|
24
27
|
const { waitUntilExit } = render(_jsx(AgentickProvider, { client: client, children: _jsx(Component, { sessionId: sessionId }) }), { exitOnCtrlC: false });
|
|
25
|
-
|
|
28
|
+
try {
|
|
29
|
+
await waitUntilExit();
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
if (options.alternateScreen) {
|
|
33
|
+
process.stdout.write("\x1b[?1049l");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
26
36
|
},
|
|
27
37
|
};
|
|
28
38
|
}
|
package/dist/create-tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tui.js","sourceRoot":"","sources":["../src/create-tui.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"create-tui.js","sourceRoot":"","sources":["../src/create-tui.tsx"],"names":[],"mappings":";AA+BA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,mBAAmB,MAAM,aAAa,CAAC;AAgB9C,MAAM,UAAU,SAAS,CAAC,OAAmB;IAC3C,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;YAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC;YAErC,MAAM,MAAM,GACV,KAAK,IAAI,OAAO;gBACd,CAAC,CAAC,YAAY,CAAC;oBACX,OAAO,EAAE,UAAU;oBACnB,SAAS,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC;iBAC7C,CAAC;gBACJ,CAAC,CAAC,YAAY,CAAC;oBACX,OAAO,EAAE,OAAO,CAAC,GAAG;oBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,WAAW,EAAE,CAAC,UAAU,CAAC,WAAW;wBAClC,mBAAmB,CAAkC;iBACxD,CAAC,CAAC;YAET,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAC,gBAAgB,IAAC,MAAM,EAAE,MAAM,YAC9B,KAAC,SAAS,IAAC,SAAS,EAAE,SAAS,GAAI,GAClB,EACnB,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,aAAa,EAAE,CAAC;YACxB,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -38,4 +38,5 @@ export { ToolCallIndicator } from "./components/ToolCallIndicator.js";
|
|
|
38
38
|
export { ToolConfirmationPrompt } from "./components/ToolConfirmationPrompt.js";
|
|
39
39
|
export { ErrorDisplay } from "./components/ErrorDisplay.js";
|
|
40
40
|
export { InputBar } from "./components/InputBar.js";
|
|
41
|
+
export { default as Spinner } from "ink-spinner";
|
|
41
42
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGhF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -40,4 +40,5 @@ export { ToolCallIndicator } from "./components/ToolCallIndicator.js";
|
|
|
40
40
|
export { ToolConfirmationPrompt } from "./components/ToolConfirmationPrompt.js";
|
|
41
41
|
export { ErrorDisplay } from "./components/ErrorDisplay.js";
|
|
42
42
|
export { InputBar } from "./components/InputBar.js";
|
|
43
|
+
export { default as Spinner } from "ink-spinner";
|
|
43
44
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAsC,MAAM,iBAAiB,CAAC;AAEhF,eAAe;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,uCAAuC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAsC,MAAM,iBAAiB,CAAC;AAEhF,eAAe;AACf,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,uCAAuC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentick/tui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Terminal UI for Agentick agents using Ink",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"ink-text-input": "^6.0.0",
|
|
41
41
|
"react": "^19.0.0",
|
|
42
42
|
"@agentick/client": "0.4.0",
|
|
43
|
-
"@agentick/core": "0.
|
|
43
|
+
"@agentick/core": "0.5.0",
|
|
44
44
|
"@agentick/react": "0.4.0",
|
|
45
45
|
"@agentick/shared": "0.4.0"
|
|
46
46
|
},
|