@elizaos/plugin-task-coordinator 2.0.3-beta.2 → 2.0.3-beta.3
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/assets/hero.png +0 -0
- package/dist/AgentTabsSection.d.ts +16 -0
- package/dist/AgentTabsSection.d.ts.map +1 -0
- package/dist/AgentTabsSection.js +169 -0
- package/dist/AgentTabsSection.js.map +1 -0
- package/dist/CodingAgentControlChip.d.ts +2 -0
- package/dist/CodingAgentControlChip.d.ts.map +1 -0
- package/dist/CodingAgentControlChip.js +73 -0
- package/dist/CodingAgentControlChip.js.map +1 -0
- package/dist/CodingAgentSettingsSection.d.ts +2 -0
- package/dist/CodingAgentSettingsSection.d.ts.map +1 -0
- package/dist/CodingAgentSettingsSection.js +379 -0
- package/dist/CodingAgentSettingsSection.js.map +1 -0
- package/dist/CodingAgentTasksPanel.d.ts +4 -0
- package/dist/CodingAgentTasksPanel.d.ts.map +1 -0
- package/dist/CodingAgentTasksPanel.interact.d.ts +2 -0
- package/dist/CodingAgentTasksPanel.interact.d.ts.map +1 -0
- package/dist/CodingAgentTasksPanel.interact.js +46 -0
- package/dist/CodingAgentTasksPanel.interact.js.map +1 -0
- package/dist/CodingAgentTasksPanel.js +740 -0
- package/dist/CodingAgentTasksPanel.js.map +1 -0
- package/dist/GitHubConnectionCard.d.ts +2 -0
- package/dist/GitHubConnectionCard.d.ts.map +1 -0
- package/dist/GitHubConnectionCard.js +172 -0
- package/dist/GitHubConnectionCard.js.map +1 -0
- package/dist/GlobalPrefsSection.d.ts +10 -0
- package/dist/GlobalPrefsSection.d.ts.map +1 -0
- package/dist/GlobalPrefsSection.js +166 -0
- package/dist/GlobalPrefsSection.js.map +1 -0
- package/dist/LlmProviderSection.d.ts +10 -0
- package/dist/LlmProviderSection.d.ts.map +1 -0
- package/dist/LlmProviderSection.js +161 -0
- package/dist/LlmProviderSection.js.map +1 -0
- package/dist/ModelConfigSection.d.ts +15 -0
- package/dist/ModelConfigSection.d.ts.map +1 -0
- package/dist/ModelConfigSection.js +86 -0
- package/dist/ModelConfigSection.js.map +1 -0
- package/dist/OrchestratorView.d.ts +20 -0
- package/dist/OrchestratorView.d.ts.map +1 -0
- package/dist/OrchestratorView.js +231 -0
- package/dist/OrchestratorView.js.map +1 -0
- package/dist/OrchestratorWorkbench.d.ts +32 -0
- package/dist/OrchestratorWorkbench.d.ts.map +1 -0
- package/dist/OrchestratorWorkbench.js +3200 -0
- package/dist/OrchestratorWorkbench.js.map +1 -0
- package/dist/PtyConsoleBase.d.ts +9 -0
- package/dist/PtyConsoleBase.d.ts.map +1 -0
- package/dist/PtyConsoleBase.js +174 -0
- package/dist/PtyConsoleBase.js.map +1 -0
- package/dist/PtyConsoleDrawer.d.ts +10 -0
- package/dist/PtyConsoleDrawer.d.ts.map +1 -0
- package/dist/PtyConsoleDrawer.js +77 -0
- package/dist/PtyConsoleDrawer.js.map +1 -0
- package/dist/PtyConsoleSidePanel.d.ts +8 -0
- package/dist/PtyConsoleSidePanel.d.ts.map +1 -0
- package/dist/PtyConsoleSidePanel.js +9 -0
- package/dist/PtyConsoleSidePanel.js.map +1 -0
- package/dist/PtyTerminalPane.d.ts +10 -0
- package/dist/PtyTerminalPane.d.ts.map +1 -0
- package/dist/PtyTerminalPane.js +147 -0
- package/dist/PtyTerminalPane.js.map +1 -0
- package/dist/TaskCardList.d.ts +76 -0
- package/dist/TaskCardList.d.ts.map +1 -0
- package/dist/TaskCardList.js +327 -0
- package/dist/TaskCardList.js.map +1 -0
- package/dist/TaskCoordinatorView.d.ts +20 -0
- package/dist/TaskCoordinatorView.d.ts.map +1 -0
- package/dist/TaskCoordinatorView.js +146 -0
- package/dist/TaskCoordinatorView.js.map +1 -0
- package/dist/__e2e__/dashboard-fixture.d.ts +9 -0
- package/dist/__e2e__/dashboard-fixture.d.ts.map +1 -0
- package/dist/__e2e__/dashboard-fixture.js +123 -0
- package/dist/__e2e__/dashboard-fixture.js.map +1 -0
- package/dist/api/coding-agents-auth-sanitize.d.ts +23 -0
- package/dist/api/coding-agents-auth-sanitize.d.ts.map +1 -0
- package/dist/api/coding-agents-auth-sanitize.js +22 -0
- package/dist/api/coding-agents-auth-sanitize.js.map +1 -0
- package/dist/api/coding-agents-preflight-normalize.d.ts +29 -0
- package/dist/api/coding-agents-preflight-normalize.d.ts.map +1 -0
- package/dist/api/coding-agents-preflight-normalize.js +20 -0
- package/dist/api/coding-agents-preflight-normalize.js.map +1 -0
- package/dist/coding-agent-settings-shared.d.ts +42 -0
- package/dist/coding-agent-settings-shared.d.ts.map +1 -0
- package/dist/coding-agent-settings-shared.js +121 -0
- package/dist/coding-agent-settings-shared.js.map +1 -0
- package/dist/components/OrchestratorSpatialView.d.ts +56 -0
- package/dist/components/OrchestratorSpatialView.d.ts.map +1 -0
- package/dist/components/OrchestratorSpatialView.js +501 -0
- package/dist/components/OrchestratorSpatialView.js.map +1 -0
- package/dist/components/TaskCoordinatorSpatialView.d.ts +59 -0
- package/dist/components/TaskCoordinatorSpatialView.d.ts.map +1 -0
- package/dist/components/TaskCoordinatorSpatialView.js +294 -0
- package/dist/components/TaskCoordinatorSpatialView.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +286 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator-capabilities.d.ts +3 -0
- package/dist/orchestrator-capabilities.d.ts.map +1 -0
- package/dist/orchestrator-capabilities.js +136 -0
- package/dist/orchestrator-capabilities.js.map +1 -0
- package/dist/orchestrator-command.d.ts +39 -0
- package/dist/orchestrator-command.d.ts.map +1 -0
- package/dist/orchestrator-command.js +52 -0
- package/dist/orchestrator-command.js.map +1 -0
- package/dist/orchestrator-diff.d.ts +19 -0
- package/dist/orchestrator-diff.d.ts.map +1 -0
- package/dist/orchestrator-diff.helpers.d.ts +18 -0
- package/dist/orchestrator-diff.helpers.d.ts.map +1 -0
- package/dist/orchestrator-diff.helpers.js +76 -0
- package/dist/orchestrator-diff.helpers.js.map +1 -0
- package/dist/orchestrator-diff.js +119 -0
- package/dist/orchestrator-diff.js.map +1 -0
- package/dist/orchestrator-markdown.d.ts +5 -0
- package/dist/orchestrator-markdown.d.ts.map +1 -0
- package/dist/orchestrator-markdown.helpers.d.ts +2 -0
- package/dist/orchestrator-markdown.helpers.d.ts.map +1 -0
- package/dist/orchestrator-markdown.helpers.js +21 -0
- package/dist/orchestrator-markdown.helpers.js.map +1 -0
- package/dist/orchestrator-markdown.js +199 -0
- package/dist/orchestrator-markdown.js.map +1 -0
- package/dist/orchestrator-params.d.ts +8 -0
- package/dist/orchestrator-params.d.ts.map +1 -0
- package/dist/orchestrator-params.js +27 -0
- package/dist/orchestrator-params.js.map +1 -0
- package/dist/orchestrator-plan.d.ts +5 -0
- package/dist/orchestrator-plan.d.ts.map +1 -0
- package/dist/orchestrator-plan.js +95 -0
- package/dist/orchestrator-plan.js.map +1 -0
- package/dist/orchestrator-reasoning.d.ts +21 -0
- package/dist/orchestrator-reasoning.d.ts.map +1 -0
- package/dist/orchestrator-reasoning.js +105 -0
- package/dist/orchestrator-reasoning.js.map +1 -0
- package/dist/orchestrator-stream.d.ts +15 -0
- package/dist/orchestrator-stream.d.ts.map +1 -0
- package/dist/orchestrator-stream.helpers.d.ts +89 -0
- package/dist/orchestrator-stream.helpers.d.ts.map +1 -0
- package/dist/orchestrator-stream.helpers.js +361 -0
- package/dist/orchestrator-stream.helpers.js.map +1 -0
- package/dist/orchestrator-stream.js +307 -0
- package/dist/orchestrator-stream.js.map +1 -0
- package/dist/pty-status-dots.d.ts +2 -0
- package/dist/pty-status-dots.d.ts.map +1 -0
- package/dist/pty-status-dots.js +6 -0
- package/dist/pty-status-dots.js.map +1 -0
- package/dist/register-slots.d.ts +20 -0
- package/dist/register-slots.d.ts.map +1 -0
- package/dist/register-slots.js +50 -0
- package/dist/register-slots.js.map +1 -0
- package/dist/register-terminal-view.d.ts +21 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +46 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +2 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +23 -0
- package/dist/register.js.map +1 -0
- package/dist/session-hydration.d.ts +2 -0
- package/dist/session-hydration.d.ts.map +1 -0
- package/dist/session-hydration.js +9 -0
- package/dist/session-hydration.js.map +1 -0
- package/dist/task-coordinator-view-bundle.d.ts +4 -0
- package/dist/task-coordinator-view-bundle.d.ts.map +1 -0
- package/dist/task-coordinator-view-bundle.js +9 -0
- package/dist/task-coordinator-view-bundle.js.map +1 -0
- package/dist/ui.d.ts +2 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +13 -0
- package/dist/ui.js.map +1 -0
- package/dist/view-format.d.ts +25 -0
- package/dist/view-format.d.ts.map +1 -0
- package/dist/view-format.js +64 -0
- package/dist/view-format.js.map +1 -0
- package/dist/views/bundle.js +1383 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +7 -6
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, client } from "@elizaos/ui";
|
|
3
|
+
import { Send, Square, Terminal, X } from "lucide-react";
|
|
4
|
+
import {
|
|
5
|
+
useCallback,
|
|
6
|
+
useEffect,
|
|
7
|
+
useMemo,
|
|
8
|
+
useRef,
|
|
9
|
+
useState
|
|
10
|
+
} from "react";
|
|
11
|
+
const MAX_BUFFER_CHARS = 2e5;
|
|
12
|
+
function PtyConsoleBase({
|
|
13
|
+
activeSessionId,
|
|
14
|
+
sessions,
|
|
15
|
+
onClose,
|
|
16
|
+
variant
|
|
17
|
+
}) {
|
|
18
|
+
const [output, setOutput] = useState("");
|
|
19
|
+
const [input, setInput] = useState("");
|
|
20
|
+
const scrollerRef = useRef(null);
|
|
21
|
+
const activeSession = useMemo(
|
|
22
|
+
() => sessions.find((session) => session.sessionId === activeSessionId),
|
|
23
|
+
[activeSessionId, sessions]
|
|
24
|
+
);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
let disposed = false;
|
|
27
|
+
setOutput("");
|
|
28
|
+
void client.getPtyBufferedOutput(activeSessionId).then((buffered) => {
|
|
29
|
+
if (!disposed) setOutput(trimBuffer(buffered));
|
|
30
|
+
});
|
|
31
|
+
const unbind = client.onWsEvent("pty-output", (event) => {
|
|
32
|
+
const message = event;
|
|
33
|
+
if (message.sessionId !== activeSessionId || !message.data) return;
|
|
34
|
+
setOutput((current) => trimBuffer(current + message.data));
|
|
35
|
+
});
|
|
36
|
+
client.subscribePtyOutput(activeSessionId);
|
|
37
|
+
client.resizePty(activeSessionId, variant === "full" ? 120 : 96, 32);
|
|
38
|
+
return () => {
|
|
39
|
+
disposed = true;
|
|
40
|
+
unbind();
|
|
41
|
+
client.unsubscribePtyOutput(activeSessionId);
|
|
42
|
+
};
|
|
43
|
+
}, [activeSessionId, variant]);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
const scroller = scrollerRef.current;
|
|
46
|
+
if (!scroller) return;
|
|
47
|
+
scroller.scrollTop = scroller.scrollHeight;
|
|
48
|
+
}, [output]);
|
|
49
|
+
const sendInput = useCallback(
|
|
50
|
+
(data) => {
|
|
51
|
+
if (!data) return;
|
|
52
|
+
client.sendPtyInput(activeSessionId, data);
|
|
53
|
+
},
|
|
54
|
+
[activeSessionId]
|
|
55
|
+
);
|
|
56
|
+
const sendLine = useCallback(() => {
|
|
57
|
+
const line = input;
|
|
58
|
+
setInput("");
|
|
59
|
+
sendInput(`${line}
|
|
60
|
+
`);
|
|
61
|
+
}, [input, sendInput]);
|
|
62
|
+
const onInputKeyDown = useCallback(
|
|
63
|
+
(event) => {
|
|
64
|
+
if (event.key !== "Enter") return;
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
sendLine();
|
|
67
|
+
},
|
|
68
|
+
[sendLine]
|
|
69
|
+
);
|
|
70
|
+
const stopSession = useCallback(() => {
|
|
71
|
+
void client.stopCodingAgent(activeSessionId);
|
|
72
|
+
}, [activeSessionId]);
|
|
73
|
+
return /* @__PURE__ */ jsxs(
|
|
74
|
+
"section",
|
|
75
|
+
{
|
|
76
|
+
className: containerClassName(variant),
|
|
77
|
+
"aria-label": "Agent terminal",
|
|
78
|
+
"data-testid": "pty-console-base",
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsxs("header", { className: "flex h-10 shrink-0 items-center gap-2 border-b border-border/60 px-3", children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Terminal, { className: "h-4 w-4 shrink-0 text-muted", "aria-hidden": true }),
|
|
82
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
83
|
+
/* @__PURE__ */ jsx("div", { className: "truncate text-xs font-semibold text-txt", children: activeSession?.label ?? "Terminal" }),
|
|
84
|
+
/* @__PURE__ */ jsx("div", { className: "truncate text-[11px] text-muted", children: activeSession?.workdir ?? activeSessionId })
|
|
85
|
+
] }),
|
|
86
|
+
/* @__PURE__ */ jsx(
|
|
87
|
+
Button,
|
|
88
|
+
{
|
|
89
|
+
variant: "ghost",
|
|
90
|
+
size: "icon",
|
|
91
|
+
onClick: () => sendInput(""),
|
|
92
|
+
title: "Interrupt",
|
|
93
|
+
"aria-label": "Interrupt terminal",
|
|
94
|
+
children: /* @__PURE__ */ jsx(Square, { className: "h-4 w-4", "aria-hidden": true })
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
/* @__PURE__ */ jsx(
|
|
98
|
+
Button,
|
|
99
|
+
{
|
|
100
|
+
variant: "ghost",
|
|
101
|
+
size: "icon",
|
|
102
|
+
onClick: stopSession,
|
|
103
|
+
title: "Stop session",
|
|
104
|
+
"aria-label": "Stop terminal session",
|
|
105
|
+
children: /* @__PURE__ */ jsx(Square, { className: "h-4 w-4 fill-current", "aria-hidden": true })
|
|
106
|
+
}
|
|
107
|
+
),
|
|
108
|
+
/* @__PURE__ */ jsx(
|
|
109
|
+
Button,
|
|
110
|
+
{
|
|
111
|
+
variant: "ghost",
|
|
112
|
+
size: "icon",
|
|
113
|
+
onClick: onClose,
|
|
114
|
+
title: "Close",
|
|
115
|
+
"aria-label": "Close terminal",
|
|
116
|
+
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4", "aria-hidden": true })
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
] }),
|
|
120
|
+
/* @__PURE__ */ jsx(
|
|
121
|
+
"div",
|
|
122
|
+
{
|
|
123
|
+
ref: scrollerRef,
|
|
124
|
+
className: "min-h-0 flex-1 overflow-auto bg-black p-3 font-mono text-[11px] leading-relaxed text-neutral-100",
|
|
125
|
+
children: /* @__PURE__ */ jsx("pre", { className: "whitespace-pre-wrap break-words", children: output || "\x1B[2mConnecting to terminal...\x1B[0m" })
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
/* @__PURE__ */ jsxs("footer", { className: "flex h-11 shrink-0 items-center gap-2 border-t border-border/60 px-2", children: [
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
"input",
|
|
131
|
+
{
|
|
132
|
+
value: input,
|
|
133
|
+
onChange: (event) => setInput(event.currentTarget.value),
|
|
134
|
+
onKeyDown: onInputKeyDown,
|
|
135
|
+
className: "min-w-0 flex-1 rounded-md border border-border/60 bg-bg px-2 py-1.5 font-mono text-xs text-txt outline-none focus:border-accent",
|
|
136
|
+
"aria-label": "Terminal input",
|
|
137
|
+
autoComplete: "off",
|
|
138
|
+
spellCheck: false
|
|
139
|
+
}
|
|
140
|
+
),
|
|
141
|
+
/* @__PURE__ */ jsx(
|
|
142
|
+
Button,
|
|
143
|
+
{
|
|
144
|
+
variant: "ghost",
|
|
145
|
+
size: "icon",
|
|
146
|
+
onClick: sendLine,
|
|
147
|
+
title: "Send",
|
|
148
|
+
"aria-label": "Send terminal input",
|
|
149
|
+
children: /* @__PURE__ */ jsx(Send, { className: "h-4 w-4", "aria-hidden": true })
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
] })
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
function containerClassName(variant) {
|
|
158
|
+
const base = "flex min-h-0 min-w-0 flex-col overflow-hidden border border-border/70 bg-bg shadow-xl";
|
|
159
|
+
if (variant === "full") {
|
|
160
|
+
return `${base} h-full w-full rounded-none border-0 shadow-none`;
|
|
161
|
+
}
|
|
162
|
+
if (variant === "drawer") {
|
|
163
|
+
return `${base} h-[min(70vh,40rem)] w-full rounded-t-lg`;
|
|
164
|
+
}
|
|
165
|
+
return `${base} h-[min(70vh,42rem)] w-[min(34rem,calc(100vw-1rem))] rounded-lg`;
|
|
166
|
+
}
|
|
167
|
+
function trimBuffer(value) {
|
|
168
|
+
if (value.length <= MAX_BUFFER_CHARS) return value;
|
|
169
|
+
return value.slice(value.length - MAX_BUFFER_CHARS);
|
|
170
|
+
}
|
|
171
|
+
export {
|
|
172
|
+
PtyConsoleBase
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=PtyConsoleBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/PtyConsoleBase.tsx"],"sourcesContent":["import { Button, type CodingAgentSession, client } from \"@elizaos/ui\";\nimport { Send, Square, Terminal, X } from \"lucide-react\";\nimport {\n type KeyboardEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst MAX_BUFFER_CHARS = 200_000;\n\nexport interface PtyConsoleBaseProps {\n activeSessionId: string;\n sessions: CodingAgentSession[];\n onClose: () => void;\n variant: \"drawer\" | \"side-panel\" | \"full\";\n}\n\nexport function PtyConsoleBase({\n activeSessionId,\n sessions,\n onClose,\n variant,\n}: PtyConsoleBaseProps) {\n const [output, setOutput] = useState(\"\");\n const [input, setInput] = useState(\"\");\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n\n const activeSession = useMemo(\n () => sessions.find((session) => session.sessionId === activeSessionId),\n [activeSessionId, sessions],\n );\n\n useEffect(() => {\n let disposed = false;\n setOutput(\"\");\n void client.getPtyBufferedOutput(activeSessionId).then((buffered) => {\n if (!disposed) setOutput(trimBuffer(buffered));\n });\n\n const unbind = client.onWsEvent(\"pty-output\", (event) => {\n const message = event as { sessionId?: string; data?: string };\n if (message.sessionId !== activeSessionId || !message.data) return;\n setOutput((current) => trimBuffer(current + message.data));\n });\n client.subscribePtyOutput(activeSessionId);\n client.resizePty(activeSessionId, variant === \"full\" ? 120 : 96, 32);\n\n return () => {\n disposed = true;\n unbind();\n client.unsubscribePtyOutput(activeSessionId);\n };\n }, [activeSessionId, variant]);\n\n useEffect(() => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n scroller.scrollTop = scroller.scrollHeight;\n }, [output]);\n\n const sendInput = useCallback(\n (data: string) => {\n if (!data) return;\n client.sendPtyInput(activeSessionId, data);\n },\n [activeSessionId],\n );\n\n const sendLine = useCallback(() => {\n const line = input;\n setInput(\"\");\n sendInput(`${line}\\n`);\n }, [input, sendInput]);\n\n const onInputKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n sendLine();\n },\n [sendLine],\n );\n\n const stopSession = useCallback(() => {\n void client.stopCodingAgent(activeSessionId);\n }, [activeSessionId]);\n\n return (\n <section\n className={containerClassName(variant)}\n aria-label=\"Agent terminal\"\n data-testid=\"pty-console-base\"\n >\n <header className=\"flex h-10 shrink-0 items-center gap-2 border-b border-border/60 px-3\">\n <Terminal className=\"h-4 w-4 shrink-0 text-muted\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-semibold text-txt\">\n {activeSession?.label ?? \"Terminal\"}\n </div>\n <div className=\"truncate text-[11px] text-muted\">\n {activeSession?.workdir ?? activeSessionId}\n </div>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => sendInput(\"\\u0003\")}\n title=\"Interrupt\"\n aria-label=\"Interrupt terminal\"\n >\n <Square className=\"h-4 w-4\" aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={stopSession}\n title=\"Stop session\"\n aria-label=\"Stop terminal session\"\n >\n <Square className=\"h-4 w-4 fill-current\" aria-hidden />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n title=\"Close\"\n aria-label=\"Close terminal\"\n >\n <X className=\"h-4 w-4\" aria-hidden />\n </Button>\n </header>\n <div\n ref={scrollerRef}\n className=\"min-h-0 flex-1 overflow-auto bg-black p-3 font-mono text-[11px] leading-relaxed text-neutral-100\"\n >\n <pre className=\"whitespace-pre-wrap break-words\">\n {output || \"\\u001b[2mConnecting to terminal...\\u001b[0m\"}\n </pre>\n </div>\n <footer className=\"flex h-11 shrink-0 items-center gap-2 border-t border-border/60 px-2\">\n <input\n value={input}\n onChange={(event) => setInput(event.currentTarget.value)}\n onKeyDown={onInputKeyDown}\n className=\"min-w-0 flex-1 rounded-md border border-border/60 bg-bg px-2 py-1.5 font-mono text-xs text-txt outline-none focus:border-accent\"\n aria-label=\"Terminal input\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={sendLine}\n title=\"Send\"\n aria-label=\"Send terminal input\"\n >\n <Send className=\"h-4 w-4\" aria-hidden />\n </Button>\n </footer>\n </section>\n );\n}\n\nfunction containerClassName(variant: PtyConsoleBaseProps[\"variant\"]): string {\n const base =\n \"flex min-h-0 min-w-0 flex-col overflow-hidden border border-border/70 bg-bg shadow-xl\";\n if (variant === \"full\") {\n return `${base} h-full w-full rounded-none border-0 shadow-none`;\n }\n if (variant === \"drawer\") {\n return `${base} h-[min(70vh,40rem)] w-full rounded-t-lg`;\n }\n return `${base} h-[min(70vh,42rem)] w-[min(34rem,calc(100vw-1rem))] rounded-lg`;\n}\n\nfunction trimBuffer(value: string): string {\n if (value.length <= MAX_BUFFER_CHARS) return value;\n return value.slice(value.length - MAX_BUFFER_CHARS);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type CodingAgentSession } from "@elizaos/ui";
|
|
2
|
+
export interface PtyConsoleDrawerProps {
|
|
3
|
+
activeSessionId: string | null;
|
|
4
|
+
sessions: CodingAgentSession[];
|
|
5
|
+
onSessionClick: (sessionId: string) => void;
|
|
6
|
+
onNewSession: () => void;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function PtyConsoleDrawer({ activeSessionId, sessions, onSessionClick, onNewSession, onClose, }: PtyConsoleDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=PtyConsoleDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PtyConsoleDrawer.d.ts","sourceRoot":"","sources":["../src/PtyConsoleDrawer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAI9D,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,eAAe,EACf,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,OAAO,GACR,EAAE,qBAAqB,2CAgFvB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from "@elizaos/ui";
|
|
3
|
+
import { Plus, Terminal } from "lucide-react";
|
|
4
|
+
import { PtyConsoleBase } from "./PtyConsoleBase.js";
|
|
5
|
+
function PtyConsoleDrawer({
|
|
6
|
+
activeSessionId,
|
|
7
|
+
sessions,
|
|
8
|
+
onSessionClick,
|
|
9
|
+
onNewSession,
|
|
10
|
+
onClose
|
|
11
|
+
}) {
|
|
12
|
+
const resolvedSessionId = activeSessionId && sessions.some((session) => session.sessionId === activeSessionId) ? activeSessionId : sessions[0]?.sessionId ?? null;
|
|
13
|
+
return /* @__PURE__ */ jsxs(
|
|
14
|
+
"section",
|
|
15
|
+
{
|
|
16
|
+
className: "flex h-[min(76vh,44rem)] w-full min-w-0 overflow-hidden rounded-t-lg border border-border/70 bg-bg shadow-xl",
|
|
17
|
+
"aria-label": "Agent terminal drawer",
|
|
18
|
+
"data-testid": "pty-console-drawer",
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsxs("aside", { className: "flex w-64 shrink-0 flex-col border-r border-border/60 bg-muted/10", children: [
|
|
21
|
+
/* @__PURE__ */ jsxs("header", { className: "flex h-10 items-center gap-2 border-b border-border/60 px-3", children: [
|
|
22
|
+
/* @__PURE__ */ jsx(Terminal, { className: "h-4 w-4 shrink-0 text-muted", "aria-hidden": true }),
|
|
23
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1 truncate text-xs font-semibold text-txt", children: "Terminals" }),
|
|
24
|
+
/* @__PURE__ */ jsx(
|
|
25
|
+
Button,
|
|
26
|
+
{
|
|
27
|
+
variant: "ghost",
|
|
28
|
+
size: "icon",
|
|
29
|
+
onClick: onNewSession,
|
|
30
|
+
title: "New terminal",
|
|
31
|
+
"aria-label": "New terminal",
|
|
32
|
+
children: /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4", "aria-hidden": true })
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
] }),
|
|
36
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto p-2", children: sessions.length === 0 ? /* @__PURE__ */ jsx(
|
|
37
|
+
"button",
|
|
38
|
+
{
|
|
39
|
+
type: "button",
|
|
40
|
+
onClick: onNewSession,
|
|
41
|
+
className: "w-full rounded-md border border-dashed border-border/70 px-3 py-2 text-left text-xs text-muted hover:border-accent hover:text-txt",
|
|
42
|
+
children: "Start terminal"
|
|
43
|
+
}
|
|
44
|
+
) : sessions.map((session) => {
|
|
45
|
+
const selected = session.sessionId === resolvedSessionId;
|
|
46
|
+
return /* @__PURE__ */ jsxs(
|
|
47
|
+
"button",
|
|
48
|
+
{
|
|
49
|
+
type: "button",
|
|
50
|
+
onClick: () => onSessionClick(session.sessionId),
|
|
51
|
+
className: `mb-1 w-full rounded-md px-2 py-2 text-left text-xs transition ${selected ? "bg-accent/15 text-txt" : "text-muted hover:bg-muted/20 hover:text-txt"}`,
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ jsx("div", { className: "truncate font-medium", children: session.label ?? "Terminal" }),
|
|
54
|
+
/* @__PURE__ */ jsx("div", { className: "truncate text-[11px] opacity-75", children: session.workdir ?? session.sessionId })
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
session.sessionId
|
|
58
|
+
);
|
|
59
|
+
}) })
|
|
60
|
+
] }),
|
|
61
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: resolvedSessionId ? /* @__PURE__ */ jsx(
|
|
62
|
+
PtyConsoleBase,
|
|
63
|
+
{
|
|
64
|
+
activeSessionId: resolvedSessionId,
|
|
65
|
+
sessions,
|
|
66
|
+
onClose,
|
|
67
|
+
variant: "full"
|
|
68
|
+
}
|
|
69
|
+
) : /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-xs text-muted", children: "None" }) })
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
export {
|
|
75
|
+
PtyConsoleDrawer
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=PtyConsoleDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/PtyConsoleDrawer.tsx"],"sourcesContent":["import { Button, type CodingAgentSession } from \"@elizaos/ui\";\nimport { Plus, Terminal } from \"lucide-react\";\nimport { PtyConsoleBase } from \"./PtyConsoleBase.js\";\n\nexport interface PtyConsoleDrawerProps {\n activeSessionId: string | null;\n sessions: CodingAgentSession[];\n onSessionClick: (sessionId: string) => void;\n onNewSession: () => void;\n onClose: () => void;\n}\n\nexport function PtyConsoleDrawer({\n activeSessionId,\n sessions,\n onSessionClick,\n onNewSession,\n onClose,\n}: PtyConsoleDrawerProps) {\n const resolvedSessionId =\n activeSessionId &&\n sessions.some((session) => session.sessionId === activeSessionId)\n ? activeSessionId\n : (sessions[0]?.sessionId ?? null);\n\n return (\n <section\n className=\"flex h-[min(76vh,44rem)] w-full min-w-0 overflow-hidden rounded-t-lg border border-border/70 bg-bg shadow-xl\"\n aria-label=\"Agent terminal drawer\"\n data-testid=\"pty-console-drawer\"\n >\n <aside className=\"flex w-64 shrink-0 flex-col border-r border-border/60 bg-muted/10\">\n <header className=\"flex h-10 items-center gap-2 border-b border-border/60 px-3\">\n <Terminal className=\"h-4 w-4 shrink-0 text-muted\" aria-hidden />\n <div className=\"min-w-0 flex-1 truncate text-xs font-semibold text-txt\">\n Terminals\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onNewSession}\n title=\"New terminal\"\n aria-label=\"New terminal\"\n >\n <Plus className=\"h-4 w-4\" aria-hidden />\n </Button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-auto p-2\">\n {sessions.length === 0 ? (\n <button\n type=\"button\"\n onClick={onNewSession}\n className=\"w-full rounded-md border border-dashed border-border/70 px-3 py-2 text-left text-xs text-muted hover:border-accent hover:text-txt\"\n >\n Start terminal\n </button>\n ) : (\n sessions.map((session) => {\n const selected = session.sessionId === resolvedSessionId;\n return (\n <button\n key={session.sessionId}\n type=\"button\"\n onClick={() => onSessionClick(session.sessionId)}\n className={`mb-1 w-full rounded-md px-2 py-2 text-left text-xs transition ${\n selected\n ? \"bg-accent/15 text-txt\"\n : \"text-muted hover:bg-muted/20 hover:text-txt\"\n }`}\n >\n <div className=\"truncate font-medium\">\n {session.label ?? \"Terminal\"}\n </div>\n <div className=\"truncate text-[11px] opacity-75\">\n {session.workdir ?? session.sessionId}\n </div>\n </button>\n );\n })\n )}\n </div>\n </aside>\n <div className=\"min-w-0 flex-1\">\n {resolvedSessionId ? (\n <PtyConsoleBase\n activeSessionId={resolvedSessionId}\n sessions={sessions}\n onClose={onClose}\n variant=\"full\"\n />\n ) : (\n <div className=\"flex h-full items-center justify-center text-xs text-muted\">\n None\n </div>\n )}\n </div>\n </section>\n );\n}\n"],"mappings":"AAgCQ,SACE,KADF;AAhCR,SAAS,cAAuC;AAChD,SAAS,MAAM,gBAAgB;AAC/B,SAAS,sBAAsB;AAUxB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,oBACJ,mBACA,SAAS,KAAK,CAAC,YAAY,QAAQ,cAAc,eAAe,IAC5D,kBACC,SAAS,CAAC,GAAG,aAAa;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAW;AAAA,MACX,eAAY;AAAA,MAEZ;AAAA,6BAAC,WAAM,WAAU,qEACf;AAAA,+BAAC,YAAO,WAAU,+DAChB;AAAA,gCAAC,YAAS,WAAU,+BAA8B,eAAW,MAAC;AAAA,YAC9D,oBAAC,SAAI,WAAU,0DAAyD,uBAExE;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,cAAW;AAAA,gBAEX,8BAAC,QAAK,WAAU,WAAU,eAAW,MAAC;AAAA;AAAA,YACxC;AAAA,aACF;AAAA,UACA,oBAAC,SAAI,WAAU,oCACZ,mBAAS,WAAW,IACnB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cACX;AAAA;AAAA,UAED,IAEA,SAAS,IAAI,CAAC,YAAY;AACxB,kBAAM,WAAW,QAAQ,cAAc;AACvC,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,QAAQ,SAAS;AAAA,gBAC/C,WAAW,iEACT,WACI,0BACA,6CACN;AAAA,gBAEA;AAAA,sCAAC,SAAI,WAAU,wBACZ,kBAAQ,SAAS,YACpB;AAAA,kBACA,oBAAC,SAAI,WAAU,mCACZ,kBAAQ,WAAW,QAAQ,WAC9B;AAAA;AAAA;AAAA,cAdK,QAAQ;AAAA,YAef;AAAA,UAEJ,CAAC,GAEL;AAAA,WACF;AAAA,QACA,oBAAC,SAAI,WAAU,kBACZ,8BACC;AAAA,UAAC;AAAA;AAAA,YACC,iBAAiB;AAAA,YACjB;AAAA,YACA;AAAA,YACA,SAAQ;AAAA;AAAA,QACV,IAEA,oBAAC,SAAI,WAAU,8DAA6D,kBAE5E,GAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CodingAgentSession } from "@elizaos/ui";
|
|
2
|
+
export interface PtyConsoleSidePanelProps {
|
|
3
|
+
activeSessionId: string;
|
|
4
|
+
sessions: CodingAgentSession[];
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function PtyConsoleSidePanel(props: PtyConsoleSidePanelProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=PtyConsoleSidePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PtyConsoleSidePanel.d.ts","sourceRoot":"","sources":["../src/PtyConsoleSidePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,2CAElE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { PtyConsoleBase } from "./PtyConsoleBase.js";
|
|
3
|
+
function PtyConsoleSidePanel(props) {
|
|
4
|
+
return /* @__PURE__ */ jsx(PtyConsoleBase, { ...props, variant: "side-panel" });
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
PtyConsoleSidePanel
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=PtyConsoleSidePanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/PtyConsoleSidePanel.tsx"],"sourcesContent":["import type { CodingAgentSession } from \"@elizaos/ui\";\nimport { PtyConsoleBase } from \"./PtyConsoleBase.js\";\n\nexport interface PtyConsoleSidePanelProps {\n activeSessionId: string;\n sessions: CodingAgentSession[];\n onClose: () => void;\n}\n\nexport function PtyConsoleSidePanel(props: PtyConsoleSidePanelProps) {\n return <PtyConsoleBase {...props} variant=\"side-panel\" />;\n}\n"],"mappings":"AAUS;AATT,SAAS,sBAAsB;AAQxB,SAAS,oBAAoB,OAAiC;AACnE,SAAO,oBAAC,kBAAgB,GAAG,OAAO,SAAQ,cAAa;AACzD;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders a single xterm.js terminal for a PTY session.
|
|
3
|
+
* On mount: loads xterm lazily, hydrates buffered output, subscribes to live data.
|
|
4
|
+
* On unmount: unsubscribes and disposes.
|
|
5
|
+
*/
|
|
6
|
+
export declare function PtyTerminalPane({ sessionId, visible, }: {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
visible: boolean;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=PtyTerminalPane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PtyTerminalPane.d.ts","sourceRoot":"","sources":["../src/PtyTerminalPane.tsx"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,2CAmKA"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { client } from "@elizaos/ui";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
function PtyTerminalPane({
|
|
5
|
+
sessionId,
|
|
6
|
+
visible
|
|
7
|
+
}) {
|
|
8
|
+
const containerRef = useRef(null);
|
|
9
|
+
const termRef = useRef(null);
|
|
10
|
+
const fitRef = useRef(null);
|
|
11
|
+
const mountedRef = useRef(false);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (mountedRef.current) return;
|
|
14
|
+
mountedRef.current = true;
|
|
15
|
+
let disposed = false;
|
|
16
|
+
let unsub;
|
|
17
|
+
let resizeObserver;
|
|
18
|
+
(async () => {
|
|
19
|
+
const [{ Terminal }, { FitAddon }] = await Promise.all([
|
|
20
|
+
import("@xterm/xterm"),
|
|
21
|
+
import("@xterm/addon-fit")
|
|
22
|
+
]);
|
|
23
|
+
if (disposed || !containerRef.current) return;
|
|
24
|
+
const cs = getComputedStyle(containerRef.current);
|
|
25
|
+
const cssVar = (name, fallback) => cs.getPropertyValue(name).trim() || fallback;
|
|
26
|
+
const term = new Terminal({
|
|
27
|
+
allowTransparency: true,
|
|
28
|
+
convertEol: true,
|
|
29
|
+
cursorBlink: true,
|
|
30
|
+
fontFamily: "var(--font-mono, monospace)",
|
|
31
|
+
fontSize: 12,
|
|
32
|
+
scrollback: 5e3,
|
|
33
|
+
theme: {
|
|
34
|
+
background: "rgba(0, 0, 0, 0)",
|
|
35
|
+
black: "#1a1b26",
|
|
36
|
+
blue: "#7aa2f7",
|
|
37
|
+
brightBlack: "#6e7681",
|
|
38
|
+
brightBlue: "#8fb3ff",
|
|
39
|
+
brightCyan: "#a2e9ff",
|
|
40
|
+
brightGreen: "#b9f27c",
|
|
41
|
+
brightMagenta: "#caa9fa",
|
|
42
|
+
brightRed: "#ff7a93",
|
|
43
|
+
brightWhite: "#ffffff",
|
|
44
|
+
brightYellow: "#ffd580",
|
|
45
|
+
cursor: cssVar("--accent", "#5a9a2a"),
|
|
46
|
+
cyan: "#7dcfff",
|
|
47
|
+
foreground: cssVar("--txt", "#e4e4e7"),
|
|
48
|
+
green: "#9ece6a",
|
|
49
|
+
magenta: "#bb9af7",
|
|
50
|
+
red: "#f7768e",
|
|
51
|
+
selectionBackground: cssVar(
|
|
52
|
+
"--accent-muted",
|
|
53
|
+
"rgba(90, 154, 42, 0.3)"
|
|
54
|
+
),
|
|
55
|
+
white: "#c0caf5",
|
|
56
|
+
yellow: "#e0af68"
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const fitAddon = new FitAddon();
|
|
60
|
+
term.loadAddon(fitAddon);
|
|
61
|
+
term.open(containerRef.current);
|
|
62
|
+
fitRef.current = fitAddon;
|
|
63
|
+
termRef.current = {
|
|
64
|
+
dispose: () => {
|
|
65
|
+
resizeObserver?.disconnect();
|
|
66
|
+
term.dispose();
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
requestAnimationFrame(() => {
|
|
70
|
+
requestAnimationFrame(() => {
|
|
71
|
+
if (!disposed) {
|
|
72
|
+
try {
|
|
73
|
+
fitAddon.fit();
|
|
74
|
+
} catch {
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
const buf = await client.getPtyBufferedOutput(sessionId);
|
|
81
|
+
if (!disposed && buf) {
|
|
82
|
+
term.write(buf.replace(/\x1b\[3J/g, ""));
|
|
83
|
+
term.scrollToBottom();
|
|
84
|
+
}
|
|
85
|
+
} catch {
|
|
86
|
+
}
|
|
87
|
+
client.subscribePtyOutput(sessionId);
|
|
88
|
+
unsub = client.onWsEvent(
|
|
89
|
+
"pty-output",
|
|
90
|
+
(data) => {
|
|
91
|
+
if (data.sessionId === sessionId && typeof data.data === "string" && !disposed) {
|
|
92
|
+
term.write(data.data.replace(/\x1b\[3J/g, ""));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
term.onData((data) => {
|
|
97
|
+
if (!disposed) {
|
|
98
|
+
try {
|
|
99
|
+
client.sendPtyInput(sessionId, data);
|
|
100
|
+
} catch {
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
resizeObserver = new ResizeObserver(() => {
|
|
105
|
+
if (disposed || !containerRef.current) return;
|
|
106
|
+
if (containerRef.current.clientHeight < 10) return;
|
|
107
|
+
try {
|
|
108
|
+
fitAddon.fit();
|
|
109
|
+
client.resizePty(sessionId, term.cols, term.rows);
|
|
110
|
+
} catch {
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
resizeObserver.observe(containerRef.current);
|
|
114
|
+
})();
|
|
115
|
+
return () => {
|
|
116
|
+
disposed = true;
|
|
117
|
+
unsub?.();
|
|
118
|
+
client.unsubscribePtyOutput(sessionId);
|
|
119
|
+
termRef.current?.dispose();
|
|
120
|
+
termRef.current = null;
|
|
121
|
+
fitRef.current = null;
|
|
122
|
+
mountedRef.current = false;
|
|
123
|
+
};
|
|
124
|
+
}, [sessionId]);
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
if (!visible || !fitRef.current) return;
|
|
127
|
+
const frameId = requestAnimationFrame(() => {
|
|
128
|
+
try {
|
|
129
|
+
fitRef.current?.fit();
|
|
130
|
+
} catch {
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
return () => cancelAnimationFrame(frameId);
|
|
134
|
+
}, [visible]);
|
|
135
|
+
return /* @__PURE__ */ jsx(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
ref: containerRef,
|
|
139
|
+
className: "h-full w-full",
|
|
140
|
+
style: { display: visible ? "block" : "none" }
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
export {
|
|
145
|
+
PtyTerminalPane
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=PtyTerminalPane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/PtyTerminalPane.tsx"],"sourcesContent":["import { client } from \"@elizaos/ui\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * Renders a single xterm.js terminal for a PTY session.\n * On mount: loads xterm lazily, hydrates buffered output, subscribes to live data.\n * On unmount: unsubscribes and disposes.\n */\nexport function PtyTerminalPane({\n sessionId,\n visible,\n}: {\n sessionId: string;\n visible: boolean;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const termRef = useRef<{ dispose: () => void } | null>(null);\n const fitRef = useRef<{ fit: () => void } | null>(null);\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (mountedRef.current) return;\n mountedRef.current = true;\n\n let disposed = false;\n let unsub: (() => void) | undefined;\n let resizeObserver: ResizeObserver | undefined;\n\n (async () => {\n const [{ Terminal }, { FitAddon }] = await Promise.all([\n import(\"@xterm/xterm\"),\n import(\"@xterm/addon-fit\"),\n ]);\n\n if (disposed || !containerRef.current) return;\n\n const cs = getComputedStyle(containerRef.current);\n const cssVar = (name: string, fallback: string) =>\n cs.getPropertyValue(name).trim() || fallback;\n\n const term = new Terminal({\n allowTransparency: true,\n convertEol: true,\n cursorBlink: true,\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: 12,\n scrollback: 5000,\n theme: {\n background: \"rgba(0, 0, 0, 0)\",\n black: \"#1a1b26\",\n blue: \"#7aa2f7\",\n brightBlack: \"#6e7681\",\n brightBlue: \"#8fb3ff\",\n brightCyan: \"#a2e9ff\",\n brightGreen: \"#b9f27c\",\n brightMagenta: \"#caa9fa\",\n brightRed: \"#ff7a93\",\n brightWhite: \"#ffffff\",\n brightYellow: \"#ffd580\",\n cursor: cssVar(\"--accent\", \"#5a9a2a\"),\n cyan: \"#7dcfff\",\n foreground: cssVar(\"--txt\", \"#e4e4e7\"),\n green: \"#9ece6a\",\n magenta: \"#bb9af7\",\n red: \"#f7768e\",\n selectionBackground: cssVar(\n \"--accent-muted\",\n \"rgba(90, 154, 42, 0.3)\",\n ),\n white: \"#c0caf5\",\n yellow: \"#e0af68\",\n },\n });\n\n const fitAddon = new FitAddon();\n term.loadAddon(fitAddon);\n term.open(containerRef.current);\n\n fitRef.current = fitAddon;\n termRef.current = {\n dispose: () => {\n resizeObserver?.disconnect();\n term.dispose();\n },\n };\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (!disposed) {\n try {\n fitAddon.fit();\n } catch {\n // Container may not have layout yet.\n }\n }\n });\n });\n\n try {\n const buf = await client.getPtyBufferedOutput(sessionId);\n if (!disposed && buf) {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape\n term.write(buf.replace(/\\x1b\\[3J/g, \"\"));\n term.scrollToBottom();\n }\n } catch {\n // Session may have ended.\n }\n\n client.subscribePtyOutput(sessionId);\n unsub = client.onWsEvent(\n \"pty-output\",\n (data: Record<string, unknown>) => {\n if (\n data.sessionId === sessionId &&\n typeof data.data === \"string\" &&\n !disposed\n ) {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape\n term.write(data.data.replace(/\\x1b\\[3J/g, \"\"));\n }\n },\n );\n\n term.onData((data: string) => {\n if (!disposed) {\n try {\n client.sendPtyInput(sessionId, data);\n } catch {\n // writeRaw may timeout if worker is busy; non-fatal.\n }\n }\n });\n\n resizeObserver = new ResizeObserver(() => {\n if (disposed || !containerRef.current) return;\n if (containerRef.current.clientHeight < 10) return;\n try {\n fitAddon.fit();\n client.resizePty(sessionId, term.cols, term.rows);\n } catch {\n // Ignore fit errors during transitions.\n }\n });\n resizeObserver.observe(containerRef.current);\n })();\n\n return () => {\n disposed = true;\n unsub?.();\n client.unsubscribePtyOutput(sessionId);\n termRef.current?.dispose();\n termRef.current = null;\n fitRef.current = null;\n mountedRef.current = false;\n };\n }, [sessionId]);\n\n useEffect(() => {\n if (!visible || !fitRef.current) return;\n const frameId = requestAnimationFrame(() => {\n try {\n fitRef.current?.fit();\n } catch {\n // Container may not have layout yet.\n }\n });\n return () => cancelAnimationFrame(frameId);\n }, [visible]);\n\n return (\n <div\n ref={containerRef}\n className=\"h-full w-full\"\n style={{ display: visible ? \"block\" : \"none\" }}\n />\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type LucideIcon } from "lucide-react";
|
|
2
|
+
import type { ReactNode, Ref } from "react";
|
|
3
|
+
export type TaskCardStatus = "open" | "active" | "waiting_on_user" | "blocked" | "validating" | "done" | "failed" | "archived" | "interrupted";
|
|
4
|
+
type Translate = (key: string, vars?: Record<string, unknown>) => string;
|
|
5
|
+
export declare function statusLabel(status: string, t: Translate): string;
|
|
6
|
+
/** Status icon — the row's primary visual anchor. */
|
|
7
|
+
export declare function TaskStatusMedallion({ status, size, iconSize, }: {
|
|
8
|
+
status: string;
|
|
9
|
+
size?: string;
|
|
10
|
+
iconSize?: string;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
/** Status chip with a colored leading dot — the only textual status on a card. */
|
|
13
|
+
export declare function TaskStatusChip({ status, t, }: {
|
|
14
|
+
status: string;
|
|
15
|
+
t: Translate;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
/** A small icon + value chip used for sessions / decisions / age metadata. */
|
|
18
|
+
export declare function TaskMetaChip({ icon, children, tone, }: {
|
|
19
|
+
icon: ReactNode;
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
tone?: "muted" | "accent";
|
|
22
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
/** Search field shared so both landings read identically. */
|
|
24
|
+
export declare function TaskSearchInput({ value, onChange, placeholder, inputRef, testId, className, agentProps, }: {
|
|
25
|
+
value: string;
|
|
26
|
+
onChange: (value: string) => void;
|
|
27
|
+
placeholder: string;
|
|
28
|
+
inputRef?: Ref<HTMLInputElement>;
|
|
29
|
+
testId?: string;
|
|
30
|
+
className?: string;
|
|
31
|
+
agentProps?: Record<string, unknown>;
|
|
32
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
/** A quiet oversized watermark glyph pinned bottom-right, used to ground the
|
|
34
|
+
* empty void beneath a short task list. Decorative only, very low opacity. */
|
|
35
|
+
export declare function SparseWatermark({ icon }: {
|
|
36
|
+
icon: LucideIcon;
|
|
37
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
/** Shared task row. Clicking opens the view's full-pane detail. */
|
|
39
|
+
export declare function TaskCard({ id, title, subtitle, status, chips, forked, onOpen, t, }: {
|
|
40
|
+
id: string;
|
|
41
|
+
title: string;
|
|
42
|
+
subtitle?: string | null;
|
|
43
|
+
status: string;
|
|
44
|
+
chips: ReactNode;
|
|
45
|
+
forked?: boolean;
|
|
46
|
+
onOpen: (id: string) => void;
|
|
47
|
+
t: Translate;
|
|
48
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
49
|
+
/** Compact page header shared across both views. */
|
|
50
|
+
export declare function TaskListHeader({ icon, title, counts, action, }: {
|
|
51
|
+
icon: ReactNode;
|
|
52
|
+
title: string;
|
|
53
|
+
counts: ReactNode;
|
|
54
|
+
action?: ReactNode;
|
|
55
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
56
|
+
/** Labeled count text for the header (e.g. "3 active"). */
|
|
57
|
+
export declare function TaskCountChip({ value, label, tone, }: {
|
|
58
|
+
value: number | string;
|
|
59
|
+
label: string;
|
|
60
|
+
tone?: "neutral" | "active" | "accent" | "warn";
|
|
61
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
62
|
+
/** Quiet empty state: one glyph + a short title, lots of open space. The longer
|
|
63
|
+
* hint stays for screen readers only — on screen, the icon carries the meaning. */
|
|
64
|
+
export declare function TaskEmptyState({ title, hint, action, }: {
|
|
65
|
+
title: string;
|
|
66
|
+
hint: string;
|
|
67
|
+
action?: ReactNode;
|
|
68
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
/** Back-to-list control used to leave a full-pane detail. */
|
|
70
|
+
export declare function BackChip({ label, onClick, testId, }: {
|
|
71
|
+
label: string;
|
|
72
|
+
onClick: () => void;
|
|
73
|
+
testId?: string;
|
|
74
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=TaskCardList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskCardList.d.ts","sourceRoot":"","sources":["../src/TaskCardList.tsx"],"names":[],"mappings":"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"}
|