@elizaos/plugin-task-coordinator 2.0.3-beta.2 → 2.0.3-beta.4
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,327 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useAgentElement } from "@elizaos/ui/agent-surface";
|
|
3
|
+
import {
|
|
4
|
+
Archive,
|
|
5
|
+
Circle,
|
|
6
|
+
CircleAlert,
|
|
7
|
+
CircleCheck,
|
|
8
|
+
CircleDashed,
|
|
9
|
+
CirclePlay,
|
|
10
|
+
CircleX,
|
|
11
|
+
GitBranch,
|
|
12
|
+
OctagonX,
|
|
13
|
+
Search,
|
|
14
|
+
UserRound
|
|
15
|
+
} from "lucide-react";
|
|
16
|
+
const STATUS_VISUAL = {
|
|
17
|
+
open: {
|
|
18
|
+
icon: Circle,
|
|
19
|
+
fg: "text-accent",
|
|
20
|
+
dot: "bg-accent",
|
|
21
|
+
pulse: false
|
|
22
|
+
},
|
|
23
|
+
active: {
|
|
24
|
+
icon: CirclePlay,
|
|
25
|
+
fg: "text-ok",
|
|
26
|
+
dot: "bg-ok",
|
|
27
|
+
pulse: true
|
|
28
|
+
},
|
|
29
|
+
validating: {
|
|
30
|
+
icon: CircleDashed,
|
|
31
|
+
fg: "text-accent",
|
|
32
|
+
dot: "bg-accent",
|
|
33
|
+
pulse: true
|
|
34
|
+
},
|
|
35
|
+
waiting_on_user: {
|
|
36
|
+
icon: UserRound,
|
|
37
|
+
fg: "text-warn",
|
|
38
|
+
dot: "bg-warn",
|
|
39
|
+
pulse: false
|
|
40
|
+
},
|
|
41
|
+
blocked: {
|
|
42
|
+
icon: OctagonX,
|
|
43
|
+
fg: "text-warn",
|
|
44
|
+
dot: "bg-warn",
|
|
45
|
+
pulse: false
|
|
46
|
+
},
|
|
47
|
+
interrupted: {
|
|
48
|
+
icon: CircleAlert,
|
|
49
|
+
fg: "text-warn",
|
|
50
|
+
dot: "bg-warn",
|
|
51
|
+
pulse: false
|
|
52
|
+
},
|
|
53
|
+
done: {
|
|
54
|
+
icon: CircleCheck,
|
|
55
|
+
fg: "text-ok",
|
|
56
|
+
dot: "bg-ok",
|
|
57
|
+
pulse: false
|
|
58
|
+
},
|
|
59
|
+
failed: {
|
|
60
|
+
icon: CircleX,
|
|
61
|
+
fg: "text-danger",
|
|
62
|
+
dot: "bg-danger",
|
|
63
|
+
pulse: false
|
|
64
|
+
},
|
|
65
|
+
archived: {
|
|
66
|
+
icon: Archive,
|
|
67
|
+
fg: "text-muted",
|
|
68
|
+
dot: "bg-muted",
|
|
69
|
+
pulse: false
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
function statusVisual(status) {
|
|
73
|
+
return STATUS_VISUAL[status] ?? STATUS_VISUAL.open;
|
|
74
|
+
}
|
|
75
|
+
function statusLabel(status, t) {
|
|
76
|
+
return t(`orchestrator.status.${status}`, {
|
|
77
|
+
defaultValue: status.replace(/_/g, " ")
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function TaskStatusMedallion({
|
|
81
|
+
status,
|
|
82
|
+
size = "h-8 w-8",
|
|
83
|
+
iconSize = "h-4 w-4"
|
|
84
|
+
}) {
|
|
85
|
+
const visual = statusVisual(status);
|
|
86
|
+
const Icon = visual.icon;
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
"span",
|
|
89
|
+
{
|
|
90
|
+
className: `relative inline-flex shrink-0 items-center justify-center ${size}`,
|
|
91
|
+
children: /* @__PURE__ */ jsx(
|
|
92
|
+
Icon,
|
|
93
|
+
{
|
|
94
|
+
className: `${iconSize} ${visual.fg}${visual.pulse ? " animate-pulse" : ""}`,
|
|
95
|
+
"aria-hidden": true
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
function TaskStatusChip({
|
|
102
|
+
status,
|
|
103
|
+
t
|
|
104
|
+
}) {
|
|
105
|
+
const visual = statusVisual(status);
|
|
106
|
+
return /* @__PURE__ */ jsxs(
|
|
107
|
+
"span",
|
|
108
|
+
{
|
|
109
|
+
className: `inline-flex items-center gap-1.5 text-2xs font-medium ${visual.fg}`,
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ jsx(
|
|
112
|
+
"span",
|
|
113
|
+
{
|
|
114
|
+
className: `h-1.5 w-1.5 rounded-full ${visual.dot}${visual.pulse ? " animate-pulse" : ""}`
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
statusLabel(status, t)
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
function TaskMetaChip({
|
|
123
|
+
icon,
|
|
124
|
+
children,
|
|
125
|
+
tone = "muted"
|
|
126
|
+
}) {
|
|
127
|
+
return /* @__PURE__ */ jsxs(
|
|
128
|
+
"span",
|
|
129
|
+
{
|
|
130
|
+
className: `inline-flex items-center gap-1 text-2xs tabular-nums ${tone === "accent" ? "text-accent" : "text-muted"}`,
|
|
131
|
+
children: [
|
|
132
|
+
/* @__PURE__ */ jsx("span", { className: "inline-flex h-3 w-3 items-center justify-center", children: icon }),
|
|
133
|
+
children
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
function TaskSearchInput({
|
|
139
|
+
value,
|
|
140
|
+
onChange,
|
|
141
|
+
placeholder,
|
|
142
|
+
inputRef,
|
|
143
|
+
testId,
|
|
144
|
+
className,
|
|
145
|
+
agentProps
|
|
146
|
+
}) {
|
|
147
|
+
return /* @__PURE__ */ jsxs(
|
|
148
|
+
"div",
|
|
149
|
+
{
|
|
150
|
+
className: `relative flex h-9 items-center border-border/35 border-b transition-colors focus-within:border-accent/60 ${className ?? "flex-1"}`,
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ jsx(
|
|
153
|
+
Search,
|
|
154
|
+
{
|
|
155
|
+
className: "pointer-events-none absolute left-1 h-3.5 w-3.5 text-muted",
|
|
156
|
+
"aria-hidden": true
|
|
157
|
+
}
|
|
158
|
+
),
|
|
159
|
+
/* @__PURE__ */ jsx(
|
|
160
|
+
"input",
|
|
161
|
+
{
|
|
162
|
+
ref: inputRef,
|
|
163
|
+
value,
|
|
164
|
+
onChange: (event) => onChange(event.target.value),
|
|
165
|
+
placeholder,
|
|
166
|
+
"aria-label": placeholder,
|
|
167
|
+
"data-testid": testId,
|
|
168
|
+
className: "h-full w-full bg-transparent pl-7 pr-1 text-sm text-txt outline-none placeholder:text-muted",
|
|
169
|
+
...agentProps
|
|
170
|
+
}
|
|
171
|
+
)
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
function SparseWatermark({ icon }) {
|
|
177
|
+
const Icon = icon;
|
|
178
|
+
return /* @__PURE__ */ jsx(
|
|
179
|
+
"div",
|
|
180
|
+
{
|
|
181
|
+
className: "pointer-events-none absolute bottom-6 right-4 select-none",
|
|
182
|
+
"aria-hidden": true,
|
|
183
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "h-44 w-44 text-accent opacity-[0.05]", strokeWidth: 1 })
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
function TaskCard({
|
|
188
|
+
id,
|
|
189
|
+
title,
|
|
190
|
+
subtitle,
|
|
191
|
+
status,
|
|
192
|
+
chips,
|
|
193
|
+
forked,
|
|
194
|
+
onOpen,
|
|
195
|
+
t
|
|
196
|
+
}) {
|
|
197
|
+
const { ref, agentProps } = useAgentElement({
|
|
198
|
+
id: `task-card-${id}`,
|
|
199
|
+
role: "list-item",
|
|
200
|
+
label: title,
|
|
201
|
+
group: "task-cards",
|
|
202
|
+
description: `Open the "${title}" task`
|
|
203
|
+
});
|
|
204
|
+
return /* @__PURE__ */ jsxs(
|
|
205
|
+
"button",
|
|
206
|
+
{
|
|
207
|
+
ref,
|
|
208
|
+
type: "button",
|
|
209
|
+
onClick: () => onOpen(id),
|
|
210
|
+
"data-testid": "task-card",
|
|
211
|
+
className: "group relative flex w-full items-start gap-2 px-1 py-2 text-left transition-colors hover:bg-bg-hover/30",
|
|
212
|
+
...agentProps,
|
|
213
|
+
children: [
|
|
214
|
+
/* @__PURE__ */ jsx(TaskStatusMedallion, { status }),
|
|
215
|
+
/* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-1.5", children: [
|
|
216
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
217
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-txt-strong", children: title }),
|
|
218
|
+
forked ? /* @__PURE__ */ jsx(
|
|
219
|
+
GitBranch,
|
|
220
|
+
{
|
|
221
|
+
className: "h-3.5 w-3.5 shrink-0 text-muted",
|
|
222
|
+
"aria-hidden": true
|
|
223
|
+
}
|
|
224
|
+
) : null,
|
|
225
|
+
/* @__PURE__ */ jsx(TaskStatusChip, { status, t })
|
|
226
|
+
] }),
|
|
227
|
+
subtitle ? /* @__PURE__ */ jsx("span", { className: "line-clamp-1 text-xs text-muted", children: subtitle }) : null,
|
|
228
|
+
/* @__PURE__ */ jsx("span", { className: "flex flex-wrap items-center gap-1.5", children: chips })
|
|
229
|
+
] })
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
function TaskListHeader({
|
|
235
|
+
icon,
|
|
236
|
+
title,
|
|
237
|
+
counts,
|
|
238
|
+
action
|
|
239
|
+
}) {
|
|
240
|
+
return /* @__PURE__ */ jsxs("header", { className: "flex items-center gap-2 px-1 py-0.5", children: [
|
|
241
|
+
/* @__PURE__ */ jsx("span", { className: "inline-flex h-7 w-7 shrink-0 items-center justify-center text-accent", children: icon }),
|
|
242
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
243
|
+
/* @__PURE__ */ jsx("h1", { className: "truncate text-base font-semibold text-txt-strong", children: title }),
|
|
244
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-2", children: counts })
|
|
245
|
+
] }),
|
|
246
|
+
action ? /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action }) : null
|
|
247
|
+
] });
|
|
248
|
+
}
|
|
249
|
+
function TaskCountChip({
|
|
250
|
+
value,
|
|
251
|
+
label,
|
|
252
|
+
tone = "neutral"
|
|
253
|
+
}) {
|
|
254
|
+
const toneClass = tone === "active" ? "text-ok" : tone === "accent" ? "text-accent" : tone === "warn" ? "text-warn" : "text-muted";
|
|
255
|
+
return /* @__PURE__ */ jsxs("span", { className: `inline-flex items-baseline gap-1 text-2xs ${toneClass}`, children: [
|
|
256
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold tabular-nums", children: value }),
|
|
257
|
+
/* @__PURE__ */ jsx("span", { className: "opacity-70", children: label })
|
|
258
|
+
] });
|
|
259
|
+
}
|
|
260
|
+
function TaskEmptyState({
|
|
261
|
+
title,
|
|
262
|
+
hint,
|
|
263
|
+
action
|
|
264
|
+
}) {
|
|
265
|
+
return /* @__PURE__ */ jsxs(
|
|
266
|
+
"div",
|
|
267
|
+
{
|
|
268
|
+
className: "flex flex-col items-center gap-3 py-16 text-center",
|
|
269
|
+
"data-testid": "task-empty-state",
|
|
270
|
+
children: [
|
|
271
|
+
/* @__PURE__ */ jsx(
|
|
272
|
+
CircleDashed,
|
|
273
|
+
{
|
|
274
|
+
className: "h-10 w-10 text-accent/40",
|
|
275
|
+
strokeWidth: 1.5,
|
|
276
|
+
"aria-hidden": true
|
|
277
|
+
}
|
|
278
|
+
),
|
|
279
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted", children: title }),
|
|
280
|
+
/* @__PURE__ */ jsx("p", { className: "sr-only", children: hint }),
|
|
281
|
+
action ? /* @__PURE__ */ jsx("div", { children: action }) : null
|
|
282
|
+
]
|
|
283
|
+
}
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
function BackChip({
|
|
287
|
+
label,
|
|
288
|
+
onClick,
|
|
289
|
+
testId
|
|
290
|
+
}) {
|
|
291
|
+
const { ref, agentProps } = useAgentElement({
|
|
292
|
+
id: "task-back-chip",
|
|
293
|
+
role: "button",
|
|
294
|
+
label,
|
|
295
|
+
group: "task-detail",
|
|
296
|
+
description: "Return to the task list"
|
|
297
|
+
});
|
|
298
|
+
return /* @__PURE__ */ jsxs(
|
|
299
|
+
"button",
|
|
300
|
+
{
|
|
301
|
+
ref,
|
|
302
|
+
type: "button",
|
|
303
|
+
onClick,
|
|
304
|
+
"data-testid": testId,
|
|
305
|
+
className: "inline-flex items-center gap-1.5 py-1 text-xs font-medium text-muted transition-colors hover:text-txt",
|
|
306
|
+
...agentProps,
|
|
307
|
+
children: [
|
|
308
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u2190" }),
|
|
309
|
+
label
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
export {
|
|
315
|
+
BackChip,
|
|
316
|
+
SparseWatermark,
|
|
317
|
+
TaskCard,
|
|
318
|
+
TaskCountChip,
|
|
319
|
+
TaskEmptyState,
|
|
320
|
+
TaskListHeader,
|
|
321
|
+
TaskMetaChip,
|
|
322
|
+
TaskSearchInput,
|
|
323
|
+
TaskStatusChip,
|
|
324
|
+
TaskStatusMedallion,
|
|
325
|
+
statusLabel
|
|
326
|
+
};
|
|
327
|
+
//# sourceMappingURL=TaskCardList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/TaskCardList.tsx"],"sourcesContent":["// Shared visual task-card language for the /orchestrator and /task-coordinator\n// single-pane landings. Both views render the same card medallion + chips so the\n// two surfaces read as one product. Pure presentation — no data fetching.\nimport { useAgentElement } from \"@elizaos/ui/agent-surface\";\nimport {\n Archive,\n Circle,\n CircleAlert,\n CircleCheck,\n CircleDashed,\n CirclePlay,\n CircleX,\n GitBranch,\n type LucideIcon,\n OctagonX,\n Search,\n UserRound,\n} from \"lucide-react\";\nimport type { ReactNode, Ref } from \"react\";\n\nexport type TaskCardStatus =\n | \"open\"\n | \"active\"\n | \"waiting_on_user\"\n | \"blocked\"\n | \"validating\"\n | \"done\"\n | \"failed\"\n | \"archived\"\n | \"interrupted\";\n\ntype Translate = (key: string, vars?: Record<string, unknown>) => string;\n\ninterface StatusVisual {\n icon: LucideIcon;\n /** Foreground icon tone. */\n fg: string;\n /** Status-dot color for the trailing chip. */\n dot: string;\n pulse: boolean;\n}\n\n// Single source of per-status visuals. Use color and iconography instead of\n// boxed badges so the task lists stay dense.\nconst STATUS_VISUAL: Record<TaskCardStatus, StatusVisual> = {\n open: {\n icon: Circle,\n fg: \"text-accent\",\n dot: \"bg-accent\",\n pulse: false,\n },\n active: {\n icon: CirclePlay,\n fg: \"text-ok\",\n dot: \"bg-ok\",\n pulse: true,\n },\n validating: {\n icon: CircleDashed,\n fg: \"text-accent\",\n dot: \"bg-accent\",\n pulse: true,\n },\n waiting_on_user: {\n icon: UserRound,\n fg: \"text-warn\",\n dot: \"bg-warn\",\n pulse: false,\n },\n blocked: {\n icon: OctagonX,\n fg: \"text-warn\",\n dot: \"bg-warn\",\n pulse: false,\n },\n interrupted: {\n icon: CircleAlert,\n fg: \"text-warn\",\n dot: \"bg-warn\",\n pulse: false,\n },\n done: {\n icon: CircleCheck,\n fg: \"text-ok\",\n dot: \"bg-ok\",\n pulse: false,\n },\n failed: {\n icon: CircleX,\n fg: \"text-danger\",\n dot: \"bg-danger\",\n pulse: false,\n },\n archived: {\n icon: Archive,\n fg: \"text-muted\",\n dot: \"bg-muted\",\n pulse: false,\n },\n};\n\nfunction statusVisual(status: string): StatusVisual {\n return STATUS_VISUAL[status as TaskCardStatus] ?? STATUS_VISUAL.open;\n}\n\nexport function statusLabel(status: string, t: Translate): string {\n return t(`orchestrator.status.${status}`, {\n defaultValue: status.replace(/_/g, \" \"),\n });\n}\n\n/** Status icon — the row's primary visual anchor. */\nexport function TaskStatusMedallion({\n status,\n size = \"h-8 w-8\",\n iconSize = \"h-4 w-4\",\n}: {\n status: string;\n size?: string;\n iconSize?: string;\n}) {\n const visual = statusVisual(status);\n const Icon = visual.icon;\n return (\n <span\n className={`relative inline-flex shrink-0 items-center justify-center ${size}`}\n >\n <Icon\n className={`${iconSize} ${visual.fg}${visual.pulse ? \" animate-pulse\" : \"\"}`}\n aria-hidden\n />\n </span>\n );\n}\n\n/** Status chip with a colored leading dot — the only textual status on a card. */\nexport function TaskStatusChip({\n status,\n t,\n}: {\n status: string;\n t: Translate;\n}) {\n const visual = statusVisual(status);\n return (\n <span\n className={`inline-flex items-center gap-1.5 text-2xs font-medium ${visual.fg}`}\n >\n <span\n className={`h-1.5 w-1.5 rounded-full ${visual.dot}${visual.pulse ? \" animate-pulse\" : \"\"}`}\n />\n {statusLabel(status, t)}\n </span>\n );\n}\n\n/** A small icon + value chip used for sessions / decisions / age metadata. */\nexport function TaskMetaChip({\n icon,\n children,\n tone = \"muted\",\n}: {\n icon: ReactNode;\n children: ReactNode;\n tone?: \"muted\" | \"accent\";\n}) {\n return (\n <span\n className={`inline-flex items-center gap-1 text-2xs tabular-nums ${\n tone === \"accent\" ? \"text-accent\" : \"text-muted\"\n }`}\n >\n <span className=\"inline-flex h-3 w-3 items-center justify-center\">\n {icon}\n </span>\n {children}\n </span>\n );\n}\n\n/** Search field shared so both landings read identically. */\nexport function TaskSearchInput({\n value,\n onChange,\n placeholder,\n inputRef,\n testId,\n className,\n agentProps,\n}: {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n inputRef?: Ref<HTMLInputElement>;\n testId?: string;\n className?: string;\n agentProps?: Record<string, unknown>;\n}) {\n return (\n <div\n className={`relative flex h-9 items-center border-border/35 border-b transition-colors focus-within:border-accent/60 ${className ?? \"flex-1\"}`}\n >\n <Search\n className=\"pointer-events-none absolute left-1 h-3.5 w-3.5 text-muted\"\n aria-hidden\n />\n <input\n ref={inputRef}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n aria-label={placeholder}\n data-testid={testId}\n className=\"h-full w-full bg-transparent pl-7 pr-1 text-sm text-txt outline-none placeholder:text-muted\"\n {...agentProps}\n />\n </div>\n );\n}\n\n/** A quiet oversized watermark glyph pinned bottom-right, used to ground the\n * empty void beneath a short task list. Decorative only, very low opacity. */\nexport function SparseWatermark({ icon }: { icon: LucideIcon }) {\n const Icon = icon;\n return (\n <div\n className=\"pointer-events-none absolute bottom-6 right-4 select-none\"\n aria-hidden\n >\n <Icon className=\"h-44 w-44 text-accent opacity-[0.05]\" strokeWidth={1} />\n </div>\n );\n}\n\n/** Shared task row. Clicking opens the view's full-pane detail. */\nexport function TaskCard({\n id,\n title,\n subtitle,\n status,\n chips,\n forked,\n onOpen,\n t,\n}: {\n id: string;\n title: string;\n subtitle?: string | null;\n status: string;\n chips: ReactNode;\n forked?: boolean;\n onOpen: (id: string) => void;\n t: Translate;\n}) {\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: `task-card-${id}`,\n role: \"list-item\",\n label: title,\n group: \"task-cards\",\n description: `Open the \"${title}\" task`,\n });\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={() => onOpen(id)}\n data-testid=\"task-card\"\n className=\"group relative flex w-full items-start gap-2 px-1 py-2 text-left transition-colors hover:bg-bg-hover/30\"\n {...agentProps}\n >\n <TaskStatusMedallion status={status} />\n <span className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <span className=\"flex items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-semibold text-txt-strong\">\n {title}\n </span>\n {forked ? (\n <GitBranch\n className=\"h-3.5 w-3.5 shrink-0 text-muted\"\n aria-hidden\n />\n ) : null}\n <TaskStatusChip status={status} t={t} />\n </span>\n {subtitle ? (\n <span className=\"line-clamp-1 text-xs text-muted\">{subtitle}</span>\n ) : null}\n <span className=\"flex flex-wrap items-center gap-1.5\">{chips}</span>\n </span>\n </button>\n );\n}\n\n/** Compact page header shared across both views. */\nexport function TaskListHeader({\n icon,\n title,\n counts,\n action,\n}: {\n icon: ReactNode;\n title: string;\n counts: ReactNode;\n action?: ReactNode;\n}) {\n return (\n <header className=\"flex items-center gap-2 px-1 py-0.5\">\n <span className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center text-accent\">\n {icon}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1\">\n <h1 className=\"truncate text-base font-semibold text-txt-strong\">\n {title}\n </h1>\n <div className=\"flex flex-wrap items-center gap-2\">{counts}</div>\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </header>\n );\n}\n\n/** Labeled count text for the header (e.g. \"3 active\"). */\nexport function TaskCountChip({\n value,\n label,\n tone = \"neutral\",\n}: {\n value: number | string;\n label: string;\n tone?: \"neutral\" | \"active\" | \"accent\" | \"warn\";\n}) {\n const toneClass =\n tone === \"active\"\n ? \"text-ok\"\n : tone === \"accent\"\n ? \"text-accent\"\n : tone === \"warn\"\n ? \"text-warn\"\n : \"text-muted\";\n return (\n <span className={`inline-flex items-baseline gap-1 text-2xs ${toneClass}`}>\n <span className=\"font-semibold tabular-nums\">{value}</span>\n <span className=\"opacity-70\">{label}</span>\n </span>\n );\n}\n\n/** Quiet empty state: one glyph + a short title, lots of open space. The longer\n * hint stays for screen readers only — on screen, the icon carries the meaning. */\nexport function TaskEmptyState({\n title,\n hint,\n action,\n}: {\n title: string;\n hint: string;\n action?: ReactNode;\n}) {\n return (\n <div\n className=\"flex flex-col items-center gap-3 py-16 text-center\"\n data-testid=\"task-empty-state\"\n >\n <CircleDashed\n className=\"h-10 w-10 text-accent/40\"\n strokeWidth={1.5}\n aria-hidden\n />\n <p className=\"text-sm font-medium text-muted\">{title}</p>\n <p className=\"sr-only\">{hint}</p>\n {action ? <div>{action}</div> : null}\n </div>\n );\n}\n\n/** Back-to-list control used to leave a full-pane detail. */\nexport function BackChip({\n label,\n onClick,\n testId,\n}: {\n label: string;\n onClick: () => void;\n testId?: string;\n}) {\n const { ref, agentProps } = useAgentElement<HTMLButtonElement>({\n id: \"task-back-chip\",\n role: \"button\",\n label,\n group: \"task-detail\",\n description: \"Return to the task list\",\n });\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={onClick}\n data-testid={testId}\n className=\"inline-flex items-center gap-1.5 py-1 text-xs font-medium text-muted transition-colors hover:text-txt\"\n {...agentProps}\n >\n <span aria-hidden>←</span>\n {label}\n </button>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskCoordinatorView — the single GUI/XR/TUI data wrapper for the Task
|
|
3
|
+
* Coordinator surface.
|
|
4
|
+
*
|
|
5
|
+
* It owns the live coding-agent task data (the searchable thread list on a 5s
|
|
6
|
+
* poll, the open thread's detail, and the archive/reopen mutations) and renders
|
|
7
|
+
* the one presentational {@link TaskCoordinatorSpatialView} inside a
|
|
8
|
+
* {@link SpatialSurface}. Omitting the `modality` prop lets `SpatialSurface`
|
|
9
|
+
* auto-detect GUI vs XR via `window.__elizaXRContext`, so the SAME component
|
|
10
|
+
* serves both surfaces. The TUI surface renders the same
|
|
11
|
+
* `TaskCoordinatorSpatialView` through the terminal registry (see
|
|
12
|
+
* `register-terminal-view.tsx`).
|
|
13
|
+
*
|
|
14
|
+
* The legacy GUI panel ({@link CodingAgentTasksPanel}) still mounts through the
|
|
15
|
+
* app-core slot registry (the packages/ui Tasks page); this wrapper is the
|
|
16
|
+
* cross-modality view-bundle surface. Each spatial affordance maps 1:1 to a
|
|
17
|
+
* client method.
|
|
18
|
+
*/
|
|
19
|
+
export declare function TaskCoordinatorView(): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=TaskCoordinatorView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskCoordinatorView.d.ts","sourceRoot":"","sources":["../src/TaskCoordinatorView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsBH,wBAAgB,mBAAmB,4CAgJlC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
ApiError,
|
|
4
|
+
client
|
|
5
|
+
} from "@elizaos/ui";
|
|
6
|
+
import { SpatialSurface } from "@elizaos/ui/spatial";
|
|
7
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
8
|
+
import {
|
|
9
|
+
TaskCoordinatorSpatialView,
|
|
10
|
+
toTaskCoordinatorRow
|
|
11
|
+
} from "./components/TaskCoordinatorSpatialView.js";
|
|
12
|
+
const TASK_LIST_LIMIT = 30;
|
|
13
|
+
function errorMessage(error) {
|
|
14
|
+
return error instanceof Error ? error.message : String(error);
|
|
15
|
+
}
|
|
16
|
+
function TaskCoordinatorView() {
|
|
17
|
+
const [threads, setThreads] = useState([]);
|
|
18
|
+
const [selectedThreadId, setSelectedThreadId] = useState(null);
|
|
19
|
+
const [detail, setDetail] = useState(null);
|
|
20
|
+
const [showArchived, setShowArchived] = useState(false);
|
|
21
|
+
const [search, setSearch] = useState("");
|
|
22
|
+
const [loading, setLoading] = useState(true);
|
|
23
|
+
const [error, setError] = useState(null);
|
|
24
|
+
const refreshThreads = useCallback(
|
|
25
|
+
async (silent = false) => {
|
|
26
|
+
if (!silent) setLoading(true);
|
|
27
|
+
try {
|
|
28
|
+
const next = await client.listCodingAgentTaskThreads({
|
|
29
|
+
includeArchived: showArchived,
|
|
30
|
+
search: search.trim() || void 0,
|
|
31
|
+
limit: TASK_LIST_LIMIT
|
|
32
|
+
});
|
|
33
|
+
setThreads(next);
|
|
34
|
+
setError(null);
|
|
35
|
+
setSelectedThreadId(
|
|
36
|
+
(current) => current && next.some((t) => t.id === current) ? current : current
|
|
37
|
+
);
|
|
38
|
+
} catch (err) {
|
|
39
|
+
if (err instanceof ApiError && err.status === 404) {
|
|
40
|
+
setThreads([]);
|
|
41
|
+
setError(null);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!silent) {
|
|
45
|
+
setError(errorMessage(err));
|
|
46
|
+
setThreads([]);
|
|
47
|
+
}
|
|
48
|
+
} finally {
|
|
49
|
+
if (!silent) setLoading(false);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
[showArchived, search]
|
|
53
|
+
);
|
|
54
|
+
const loadDetail = useCallback(async (threadId) => {
|
|
55
|
+
try {
|
|
56
|
+
const next = await client.getCodingAgentTaskThread(threadId);
|
|
57
|
+
setDetail(next);
|
|
58
|
+
setError(null);
|
|
59
|
+
} catch (err) {
|
|
60
|
+
setError(errorMessage(err));
|
|
61
|
+
setDetail(null);
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
64
|
+
const autoLoadedRef = useRef(false);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
autoLoadedRef.current = true;
|
|
67
|
+
void refreshThreads(false);
|
|
68
|
+
const interval = setInterval(() => {
|
|
69
|
+
void refreshThreads(true);
|
|
70
|
+
if (selectedThreadId) void loadDetail(selectedThreadId);
|
|
71
|
+
}, 5e3);
|
|
72
|
+
return () => clearInterval(interval);
|
|
73
|
+
}, [refreshThreads, loadDetail, selectedThreadId]);
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (!selectedThreadId) {
|
|
76
|
+
setDetail(null);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
void loadDetail(selectedThreadId);
|
|
80
|
+
}, [selectedThreadId, loadDetail]);
|
|
81
|
+
const runMutation = useCallback(
|
|
82
|
+
async (mutate) => {
|
|
83
|
+
try {
|
|
84
|
+
await mutate();
|
|
85
|
+
setSelectedThreadId(null);
|
|
86
|
+
await refreshThreads(true);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
setError(errorMessage(err));
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
[refreshThreads]
|
|
92
|
+
);
|
|
93
|
+
const onAction = useCallback(
|
|
94
|
+
(action) => {
|
|
95
|
+
if (action.startsWith("open:")) {
|
|
96
|
+
setSelectedThreadId(action.slice("open:".length));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (action.startsWith("search:")) {
|
|
100
|
+
setSearch(action.slice("search:".length));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
switch (action) {
|
|
104
|
+
case "toggle-archived":
|
|
105
|
+
setShowArchived((value) => !value);
|
|
106
|
+
return;
|
|
107
|
+
case "refresh":
|
|
108
|
+
void refreshThreads(false);
|
|
109
|
+
return;
|
|
110
|
+
case "back":
|
|
111
|
+
setSelectedThreadId(null);
|
|
112
|
+
return;
|
|
113
|
+
case "delete-thread":
|
|
114
|
+
if (selectedThreadId) {
|
|
115
|
+
void runMutation(
|
|
116
|
+
() => client.archiveCodingAgentTaskThread(selectedThreadId)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
case "reopen-thread":
|
|
121
|
+
if (selectedThreadId) {
|
|
122
|
+
setShowArchived(false);
|
|
123
|
+
void runMutation(
|
|
124
|
+
() => client.reopenCodingAgentTaskThread(selectedThreadId)
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
[refreshThreads, runMutation, selectedThreadId]
|
|
131
|
+
);
|
|
132
|
+
const snapshot = {
|
|
133
|
+
threads: threads.map(toTaskCoordinatorRow),
|
|
134
|
+
selectedThreadId,
|
|
135
|
+
detail,
|
|
136
|
+
showArchived,
|
|
137
|
+
search,
|
|
138
|
+
loading,
|
|
139
|
+
error
|
|
140
|
+
};
|
|
141
|
+
return /* @__PURE__ */ jsx(SpatialSurface, { children: /* @__PURE__ */ jsx(TaskCoordinatorSpatialView, { snapshot, onAction }) });
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
TaskCoordinatorView
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=TaskCoordinatorView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/TaskCoordinatorView.tsx"],"sourcesContent":["/**\n * TaskCoordinatorView — the single GUI/XR/TUI data wrapper for the Task\n * Coordinator surface.\n *\n * It owns the live coding-agent task data (the searchable thread list on a 5s\n * poll, the open thread's detail, and the archive/reopen mutations) and renders\n * the one presentational {@link TaskCoordinatorSpatialView} inside a\n * {@link SpatialSurface}. Omitting the `modality` prop lets `SpatialSurface`\n * auto-detect GUI vs XR via `window.__elizaXRContext`, so the SAME component\n * serves both surfaces. The TUI surface renders the same\n * `TaskCoordinatorSpatialView` through the terminal registry (see\n * `register-terminal-view.tsx`).\n *\n * The legacy GUI panel ({@link CodingAgentTasksPanel}) still mounts through the\n * app-core slot registry (the packages/ui Tasks page); this wrapper is the\n * cross-modality view-bundle surface. Each spatial affordance maps 1:1 to a\n * client method.\n */\n\nimport {\n ApiError,\n type CodingAgentTaskThread,\n type CodingAgentTaskThreadDetail,\n client,\n} from \"@elizaos/ui\";\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n type TaskCoordinatorSnapshot,\n TaskCoordinatorSpatialView,\n toTaskCoordinatorRow,\n} from \"./components/TaskCoordinatorSpatialView.js\";\n\nconst TASK_LIST_LIMIT = 30;\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function TaskCoordinatorView() {\n const [threads, setThreads] = useState<CodingAgentTaskThread[]>([]);\n const [selectedThreadId, setSelectedThreadId] = useState<string | null>(null);\n const [detail, setDetail] = useState<CodingAgentTaskThreadDetail | null>(null);\n const [showArchived, setShowArchived] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const refreshThreads = useCallback(\n async (silent = false) => {\n if (!silent) setLoading(true);\n try {\n const next = await client.listCodingAgentTaskThreads({\n includeArchived: showArchived,\n search: search.trim() || undefined,\n limit: TASK_LIST_LIMIT,\n });\n setThreads(next);\n setError(null);\n setSelectedThreadId((current) =>\n current && next.some((t) => t.id === current) ? current : current,\n );\n } catch (err) {\n // The task-thread endpoint is owned by the Node-only orchestrator and is\n // absent on mobile/web surfaces. A 404 there means \"no coding tasks\",\n // not a load failure — render the empty list instead of an error.\n if (err instanceof ApiError && err.status === 404) {\n setThreads([]);\n setError(null);\n return;\n }\n if (!silent) {\n setError(errorMessage(err));\n setThreads([]);\n }\n } finally {\n if (!silent) setLoading(false);\n }\n },\n [showArchived, search],\n );\n\n const loadDetail = useCallback(async (threadId: string) => {\n try {\n const next = await client.getCodingAgentTaskThread(threadId);\n setDetail(next);\n setError(null);\n } catch (err) {\n setError(errorMessage(err));\n setDetail(null);\n }\n }, []);\n\n // Load the thread list on mount + whenever the filters change, then keep it\n // fresh with a quiet 5s poll.\n const autoLoadedRef = useRef(false);\n useEffect(() => {\n autoLoadedRef.current = true;\n void refreshThreads(false);\n const interval = setInterval(() => {\n void refreshThreads(true);\n if (selectedThreadId) void loadDetail(selectedThreadId);\n }, 5_000);\n return () => clearInterval(interval);\n }, [refreshThreads, loadDetail, selectedThreadId]);\n\n // Load the open thread's detail whenever the selection changes.\n useEffect(() => {\n if (!selectedThreadId) {\n setDetail(null);\n return;\n }\n void loadDetail(selectedThreadId);\n }, [selectedThreadId, loadDetail]);\n\n const runMutation = useCallback(\n async (mutate: () => Promise<unknown>) => {\n try {\n await mutate();\n setSelectedThreadId(null);\n await refreshThreads(true);\n } catch (err) {\n setError(errorMessage(err));\n }\n },\n [refreshThreads],\n );\n\n const onAction = useCallback(\n (action: string) => {\n if (action.startsWith(\"open:\")) {\n setSelectedThreadId(action.slice(\"open:\".length));\n return;\n }\n if (action.startsWith(\"search:\")) {\n setSearch(action.slice(\"search:\".length));\n return;\n }\n switch (action) {\n case \"toggle-archived\":\n setShowArchived((value) => !value);\n return;\n case \"refresh\":\n void refreshThreads(false);\n return;\n case \"back\":\n setSelectedThreadId(null);\n return;\n case \"delete-thread\":\n if (selectedThreadId) {\n void runMutation(() =>\n client.archiveCodingAgentTaskThread(selectedThreadId),\n );\n }\n return;\n case \"reopen-thread\":\n if (selectedThreadId) {\n setShowArchived(false);\n void runMutation(() =>\n client.reopenCodingAgentTaskThread(selectedThreadId),\n );\n }\n return;\n }\n },\n [refreshThreads, runMutation, selectedThreadId],\n );\n\n const snapshot: TaskCoordinatorSnapshot = {\n threads: threads.map(toTaskCoordinatorRow),\n selectedThreadId,\n detail,\n showArchived,\n search,\n loading,\n error,\n };\n\n return (\n <SpatialSurface>\n <TaskCoordinatorSpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render-only fixture for the redesigned orchestrator dashboard. Mounts the real
|
|
3
|
+
* shared card primitives (TaskListHeader, TaskCard, TaskMetaChip, TaskEmptyState)
|
|
4
|
+
* with deterministic data so the esbuild + playwright harness can screenshot the
|
|
5
|
+
* actual components — no app server, no data layer. The agent-surface hook is
|
|
6
|
+
* stubbed by the runner's esbuild resolver.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=dashboard-fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-fixture.d.ts","sourceRoot":"","sources":["../../src/__e2e__/dashboard-fixture.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|