@lumea-labs/orchestrator 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/orchestrator-document.d.ts +2 -2
- package/dist/orchestrator-document.js +2 -1
- package/dist/plan-detail.d.ts +6 -6
- package/dist/plan-detail.js +214 -156
- package/dist/plan-graph.d.ts +2 -2
- package/dist/plan-graph.js +178 -119
- package/dist/plan-node-detail.d.ts +4 -4
- package/dist/plan-node-detail.js +177 -125
- package/dist/plan-task-detail.d.ts +2 -2
- package/dist/plan-task-detail.js +282 -172
- package/dist/run-kanban-filter-menu.d.ts +3 -2
- package/dist/run-kanban-filter-menu.js +96 -77
- package/dist/run-kanban.d.ts +3 -3
- package/dist/run-kanban.js +93 -79
- package/dist/swarm-agent-badge.d.ts +2 -2
- package/dist/swarm-agent-badge.js +21 -18
- package/dist/swarm-run-activity.d.ts +2 -2
- package/dist/swarm-run-activity.js +150 -95
- package/dist/swarm-run-card.d.ts +2 -2
- package/dist/swarm-run-card.js +76 -55
- package/dist/swarm-run-detail.d.ts +2 -2
- package/dist/swarm-run-detail.js +415 -310
- package/dist/swarm-run-list.d.ts +2 -2
- package/dist/swarm-run-list.js +37 -27
- package/dist/swarm-run-row.d.ts +2 -2
- package/dist/swarm-run-row.js +82 -72
- package/dist/swarm-skeletons.d.ts +3 -3
- package/dist/swarm-skeletons.js +65 -16
- package/dist/swarm-status-bar.d.ts +2 -2
- package/dist/swarm-status-bar.js +62 -44
- package/dist/swarm-status-pill.d.ts +2 -2
- package/dist/swarm-status-pill.js +14 -11
- package/dist/swarm-timeline.d.ts +2 -2
- package/dist/swarm-timeline.js +284 -225
- package/dist/task-workspace-sidebar.d.ts +2 -2
- package/dist/task-workspace-sidebar.js +145 -113
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
3
|
import {
|
|
3
4
|
CalendarClock,
|
|
4
5
|
CheckCircle2,
|
|
@@ -58,7 +59,7 @@ function SwarmStatusPill({
|
|
|
58
59
|
const px = size === "sm" ? "px-1.5 py-[1px]" : "px-2 py-0.5";
|
|
59
60
|
const txt = size === "sm" ? "text-[9.5px]" : "text-[10px]";
|
|
60
61
|
const icon = size === "sm" ? "size-2.5" : "size-3";
|
|
61
|
-
return /* @__PURE__ */
|
|
62
|
+
return /* @__PURE__ */ jsxs(
|
|
62
63
|
"span",
|
|
63
64
|
{
|
|
64
65
|
className: [
|
|
@@ -69,16 +70,18 @@ function SwarmStatusPill({
|
|
|
69
70
|
px,
|
|
70
71
|
txt,
|
|
71
72
|
className || ""
|
|
72
|
-
].join(" ")
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
73
|
+
].join(" "),
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
Icon,
|
|
77
|
+
{
|
|
78
|
+
"aria-hidden": true,
|
|
79
|
+
className: [icon, status === "running" ? "animate-spin" : ""].join(" ")
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
text
|
|
83
|
+
]
|
|
84
|
+
}
|
|
82
85
|
);
|
|
83
86
|
}
|
|
84
87
|
export {
|
package/dist/swarm-timeline.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { SwarmRun, SwarmLabels } from './types.js';
|
|
4
4
|
|
|
@@ -16,6 +16,6 @@ interface SwarmTimelineProps {
|
|
|
16
16
|
labels?: Partial<SwarmLabels>;
|
|
17
17
|
className?: string;
|
|
18
18
|
}
|
|
19
|
-
declare function SwarmTimeline({ runs, now, renderAvatar, onOpen, rowHeight, labelWidth, labels, className, }: SwarmTimelineProps):
|
|
19
|
+
declare function SwarmTimeline({ runs, now, renderAvatar, onOpen, rowHeight, labelWidth, labels, className, }: SwarmTimelineProps): react_jsx_runtime.JSX.Element;
|
|
20
20
|
|
|
21
21
|
export { SwarmTimeline, type SwarmTimelineProps };
|
package/dist/swarm-timeline.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { useMemo } from "react";
|
|
3
4
|
import {
|
|
4
5
|
defaultSwarmLabels
|
|
@@ -121,212 +122,257 @@ function SwarmTimeline({
|
|
|
121
122
|
};
|
|
122
123
|
}, [runs, clock]);
|
|
123
124
|
if (rows.length === 0) {
|
|
124
|
-
return /* @__PURE__ */
|
|
125
|
+
return /* @__PURE__ */ jsx("div", { className: ["px-3 py-10 text-center", className || ""].join(" "), children: /* @__PURE__ */ jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.16em] text-p-ink-3", children: L.noRuns }) });
|
|
125
126
|
}
|
|
126
127
|
const totalLanesHeight = rows.length * rowHeight;
|
|
127
128
|
const headerH = 56;
|
|
128
129
|
const axisH = 26;
|
|
129
|
-
return /* @__PURE__ */
|
|
130
|
+
return /* @__PURE__ */ jsxs(
|
|
130
131
|
"div",
|
|
131
132
|
{
|
|
132
133
|
className: [
|
|
133
134
|
"overflow-hidden rounded-2xl border border-p-line bg-p-surface",
|
|
134
135
|
className || ""
|
|
135
|
-
].join(" ")
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
"div",
|
|
139
|
-
{
|
|
140
|
-
className: "flex items-center justify-between gap-6 border-b border-p-line px-5",
|
|
141
|
-
style: { height: headerH }
|
|
142
|
-
},
|
|
143
|
-
/* @__PURE__ */ React.createElement("div", { className: "flex items-baseline gap-3" }, /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.24em] text-p-ink-3" }, "mission control"), /* @__PURE__ */ React.createElement("span", { className: "font-display text-[20px] font-bold leading-none tracking-[-0.02em] text-p-ink tabular-nums" }, String(rows.length).padStart(2, "0")), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10px] uppercase tracking-[0.2em] text-p-ink-3" }, "runs \xB7 ", L.duration(span / 1e3))),
|
|
144
|
-
/* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-3 font-mono text-[10px] uppercase tracking-[0.16em] text-p-ink-3" }, /* @__PURE__ */ React.createElement(Tally, { tone: "accent", value: counts.running, label: "run", pulse: true }), /* @__PURE__ */ React.createElement(Tally, { tone: "green", value: counts.done, label: "done" }), /* @__PURE__ */ React.createElement(Tally, { tone: "red", value: counts.failed, label: "fail" }))
|
|
145
|
-
),
|
|
146
|
-
/* @__PURE__ */ React.createElement(
|
|
147
|
-
"div",
|
|
148
|
-
{
|
|
149
|
-
className: "grid",
|
|
150
|
-
style: { gridTemplateColumns: `${labelWidth}px minmax(0,1fr)` }
|
|
151
|
-
},
|
|
152
|
-
/* @__PURE__ */ React.createElement(
|
|
153
|
-
"div",
|
|
154
|
-
{
|
|
155
|
-
className: "border-b border-r border-p-line bg-p-bg/60",
|
|
156
|
-
style: { height: axisH }
|
|
157
|
-
},
|
|
158
|
-
/* @__PURE__ */ React.createElement("span", { className: "ml-5 inline-flex h-full items-center font-mono text-[9.5px] uppercase tracking-[0.2em] text-p-ink-3" }, "agent \xB7 goal")
|
|
159
|
-
),
|
|
160
|
-
/* @__PURE__ */ React.createElement(
|
|
161
|
-
"div",
|
|
162
|
-
{
|
|
163
|
-
className: "relative border-b border-p-line bg-p-bg/60",
|
|
164
|
-
style: { height: axisH }
|
|
165
|
-
},
|
|
166
|
-
ticks.map((t, i) => /* @__PURE__ */ React.createElement(
|
|
167
|
-
"span",
|
|
168
|
-
{
|
|
169
|
-
key: i,
|
|
170
|
-
className: "absolute top-1/2 -translate-x-1/2 -translate-y-1/2 font-mono text-[9.5px] uppercase tracking-[0.2em] text-p-ink-3 tabular-nums",
|
|
171
|
-
style: { left: `${t.pct}%` }
|
|
172
|
-
},
|
|
173
|
-
t.label
|
|
174
|
-
)),
|
|
175
|
-
/* @__PURE__ */ React.createElement("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 font-mono text-[9.5px] uppercase tracking-[0.16em] text-p-ink-3 tabular-nums" }, formatClock(endMs))
|
|
176
|
-
),
|
|
177
|
-
/* @__PURE__ */ React.createElement(
|
|
178
|
-
"div",
|
|
179
|
-
{
|
|
180
|
-
className: "flex flex-col border-r border-p-line",
|
|
181
|
-
style: { height: totalLanesHeight }
|
|
182
|
-
},
|
|
183
|
-
rows.map(({ run, index }) => /* @__PURE__ */ React.createElement(
|
|
136
|
+
].join(" "),
|
|
137
|
+
children: [
|
|
138
|
+
/* @__PURE__ */ jsxs(
|
|
184
139
|
"div",
|
|
185
140
|
{
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
STATUS_DOT[run.status],
|
|
204
|
-
run.status === "running" ? "animate-pulse" : ""
|
|
205
|
-
].join(" ")
|
|
206
|
-
}
|
|
207
|
-
),
|
|
208
|
-
renderAvatar ? renderAvatar(run.agent) : /* @__PURE__ */ React.createElement(
|
|
209
|
-
"span",
|
|
210
|
-
{
|
|
211
|
-
"aria-hidden": true,
|
|
212
|
-
className: "grid size-[18px] shrink-0 place-items-center rounded font-display text-[10px] font-bold text-white",
|
|
213
|
-
style: { background: run.agent.color || "#999" }
|
|
214
|
-
},
|
|
215
|
-
run.agent.glyph || (run.agent.displayName || run.agent.name).charAt(0).toUpperCase()
|
|
216
|
-
),
|
|
217
|
-
/* @__PURE__ */ React.createElement("span", { className: "w-[72px] shrink-0 truncate font-mono text-[10.5px] font-bold uppercase tracking-[0.14em] text-p-ink" }, run.agent.displayName || run.agent.name),
|
|
218
|
-
/* @__PURE__ */ React.createElement("span", { className: "min-w-0 flex-1 truncate font-display italic text-[12.5px] text-p-ink-2" }, run.title)
|
|
219
|
-
))
|
|
220
|
-
),
|
|
221
|
-
/* @__PURE__ */ React.createElement("div", { className: "relative", style: { height: totalLanesHeight } }, ticks.map((t, i) => /* @__PURE__ */ React.createElement(
|
|
222
|
-
"span",
|
|
223
|
-
{
|
|
224
|
-
key: i,
|
|
225
|
-
"aria-hidden": true,
|
|
226
|
-
className: "pointer-events-none absolute inset-y-0 w-px bg-p-line/60",
|
|
227
|
-
style: { left: `${t.pct}%` }
|
|
228
|
-
}
|
|
229
|
-
)), rows.map(
|
|
230
|
-
({ run, index }) => index === 0 ? null : /* @__PURE__ */ React.createElement(
|
|
231
|
-
"span",
|
|
232
|
-
{
|
|
233
|
-
key: `sep-${run.id}`,
|
|
234
|
-
"aria-hidden": true,
|
|
235
|
-
className: "pointer-events-none absolute inset-x-0 h-px bg-p-line/60",
|
|
236
|
-
style: { top: index * rowHeight }
|
|
141
|
+
className: "flex items-center justify-between gap-6 border-b border-p-line px-5",
|
|
142
|
+
style: { height: headerH },
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-3", children: [
|
|
145
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.24em] text-p-ink-3", children: "mission control" }),
|
|
146
|
+
/* @__PURE__ */ jsx("span", { className: "font-display text-[20px] font-bold leading-none tracking-[-0.02em] text-p-ink tabular-nums", children: String(rows.length).padStart(2, "0") }),
|
|
147
|
+
/* @__PURE__ */ jsxs("span", { className: "font-mono text-[10px] uppercase tracking-[0.2em] text-p-ink-3", children: [
|
|
148
|
+
"runs \xB7 ",
|
|
149
|
+
L.duration(span / 1e3)
|
|
150
|
+
] })
|
|
151
|
+
] }),
|
|
152
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 font-mono text-[10px] uppercase tracking-[0.16em] text-p-ink-3", children: [
|
|
153
|
+
/* @__PURE__ */ jsx(Tally, { tone: "accent", value: counts.running, label: "run", pulse: true }),
|
|
154
|
+
/* @__PURE__ */ jsx(Tally, { tone: "green", value: counts.done, label: "done" }),
|
|
155
|
+
/* @__PURE__ */ jsx(Tally, { tone: "red", value: counts.failed, label: "fail" })
|
|
156
|
+
] })
|
|
157
|
+
]
|
|
237
158
|
}
|
|
238
|
-
)
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
{
|
|
242
|
-
"aria-hidden": true,
|
|
243
|
-
className: "pointer-events-none absolute inset-y-0 w-[2px] -translate-x-1/2 bg-p-accent/15",
|
|
244
|
-
style: { left: `${nowPct}%` }
|
|
245
|
-
}
|
|
246
|
-
) : null, /* @__PURE__ */ React.createElement(
|
|
247
|
-
"svg",
|
|
248
|
-
{
|
|
249
|
-
"aria-hidden": true,
|
|
250
|
-
className: "pointer-events-none absolute inset-0 h-full w-full overflow-visible"
|
|
251
|
-
},
|
|
252
|
-
/* @__PURE__ */ React.createElement("defs", null, /* @__PURE__ */ React.createElement(
|
|
253
|
-
"marker",
|
|
254
|
-
{
|
|
255
|
-
id: "swarm-dep-arrow",
|
|
256
|
-
viewBox: "0 0 6 6",
|
|
257
|
-
refX: "5",
|
|
258
|
-
refY: "3",
|
|
259
|
-
markerWidth: "6",
|
|
260
|
-
markerHeight: "6",
|
|
261
|
-
orient: "auto-start-reverse"
|
|
262
|
-
},
|
|
263
|
-
/* @__PURE__ */ React.createElement("path", { d: "M 0 0 L 6 3 L 0 6 z", className: "fill-p-ink-3" })
|
|
264
|
-
)),
|
|
265
|
-
deps.map((d, i) => /* @__PURE__ */ React.createElement(DependencyPath, { key: i, dep: d, rowHeight }))
|
|
266
|
-
), rows.map(({ run, leftPct, widthPct, index }) => {
|
|
267
|
-
const isLive = run.status === "running" || run.status === "pending";
|
|
268
|
-
const fillPct = run.progress !== void 0 ? Math.max(0, Math.min(1, run.progress)) * 100 : isLive ? 0 : 100;
|
|
269
|
-
const top = index * rowHeight + (rowHeight - 14) / 2;
|
|
270
|
-
return /* @__PURE__ */ React.createElement(
|
|
271
|
-
"button",
|
|
159
|
+
),
|
|
160
|
+
/* @__PURE__ */ jsxs(
|
|
161
|
+
"div",
|
|
272
162
|
{
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
163
|
+
className: "grid",
|
|
164
|
+
style: { gridTemplateColumns: `${labelWidth}px minmax(0,1fr)` },
|
|
165
|
+
children: [
|
|
166
|
+
/* @__PURE__ */ jsx(
|
|
167
|
+
"div",
|
|
168
|
+
{
|
|
169
|
+
className: "border-b border-r border-p-line bg-p-bg/60",
|
|
170
|
+
style: { height: axisH },
|
|
171
|
+
children: /* @__PURE__ */ jsx("span", { className: "ml-5 inline-flex h-full items-center font-mono text-[9.5px] uppercase tracking-[0.2em] text-p-ink-3", children: "agent \xB7 goal" })
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
/* @__PURE__ */ jsxs(
|
|
175
|
+
"div",
|
|
176
|
+
{
|
|
177
|
+
className: "relative border-b border-p-line bg-p-bg/60",
|
|
178
|
+
style: { height: axisH },
|
|
179
|
+
children: [
|
|
180
|
+
ticks.map((t, i) => /* @__PURE__ */ jsx(
|
|
181
|
+
"span",
|
|
182
|
+
{
|
|
183
|
+
className: "absolute top-1/2 -translate-x-1/2 -translate-y-1/2 font-mono text-[9.5px] uppercase tracking-[0.2em] text-p-ink-3 tabular-nums",
|
|
184
|
+
style: { left: `${t.pct}%` },
|
|
185
|
+
children: t.label
|
|
186
|
+
},
|
|
187
|
+
i
|
|
188
|
+
)),
|
|
189
|
+
/* @__PURE__ */ jsx("span", { className: "absolute right-3 top-1/2 -translate-y-1/2 font-mono text-[9.5px] uppercase tracking-[0.16em] text-p-ink-3 tabular-nums", children: formatClock(endMs) })
|
|
190
|
+
]
|
|
191
|
+
}
|
|
192
|
+
),
|
|
193
|
+
/* @__PURE__ */ jsx(
|
|
194
|
+
"div",
|
|
195
|
+
{
|
|
196
|
+
className: "flex flex-col border-r border-p-line",
|
|
197
|
+
style: { height: totalLanesHeight },
|
|
198
|
+
children: rows.map(({ run, index }) => /* @__PURE__ */ jsxs(
|
|
199
|
+
"div",
|
|
200
|
+
{
|
|
201
|
+
role: onOpen ? "button" : void 0,
|
|
202
|
+
tabIndex: onOpen ? 0 : void 0,
|
|
203
|
+
onClick: onOpen ? () => onOpen(run.id) : void 0,
|
|
204
|
+
className: [
|
|
205
|
+
"group flex shrink-0 items-center gap-2.5 px-5",
|
|
206
|
+
onOpen ? "cursor-pointer transition-colors hover:bg-p-warm/50" : "",
|
|
207
|
+
index !== 0 ? "border-t border-p-line/60" : ""
|
|
208
|
+
].join(" "),
|
|
209
|
+
style: { height: rowHeight },
|
|
210
|
+
children: [
|
|
211
|
+
/* @__PURE__ */ jsx(
|
|
212
|
+
"span",
|
|
213
|
+
{
|
|
214
|
+
"aria-hidden": true,
|
|
215
|
+
className: [
|
|
216
|
+
"size-1.5 shrink-0 rounded-full",
|
|
217
|
+
STATUS_DOT[run.status],
|
|
218
|
+
run.status === "running" ? "animate-pulse" : ""
|
|
219
|
+
].join(" ")
|
|
220
|
+
}
|
|
221
|
+
),
|
|
222
|
+
renderAvatar ? renderAvatar(run.agent) : /* @__PURE__ */ jsx(
|
|
223
|
+
"span",
|
|
224
|
+
{
|
|
225
|
+
"aria-hidden": true,
|
|
226
|
+
className: "grid size-[18px] shrink-0 place-items-center rounded font-display text-[10px] font-bold text-white",
|
|
227
|
+
style: { background: run.agent.color || "#999" },
|
|
228
|
+
children: run.agent.glyph || (run.agent.displayName || run.agent.name).charAt(0).toUpperCase()
|
|
229
|
+
}
|
|
230
|
+
),
|
|
231
|
+
/* @__PURE__ */ jsx("span", { className: "w-[72px] shrink-0 truncate font-mono text-[10.5px] font-bold uppercase tracking-[0.14em] text-p-ink", children: run.agent.displayName || run.agent.name }),
|
|
232
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-display italic text-[12.5px] text-p-ink-2", children: run.title })
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
run.id
|
|
236
|
+
))
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", style: { height: totalLanesHeight }, children: [
|
|
240
|
+
ticks.map((t, i) => /* @__PURE__ */ jsx(
|
|
241
|
+
"span",
|
|
242
|
+
{
|
|
243
|
+
"aria-hidden": true,
|
|
244
|
+
className: "pointer-events-none absolute inset-y-0 w-px bg-p-line/60",
|
|
245
|
+
style: { left: `${t.pct}%` }
|
|
246
|
+
},
|
|
247
|
+
i
|
|
248
|
+
)),
|
|
249
|
+
rows.map(
|
|
250
|
+
({ run, index }) => index === 0 ? null : /* @__PURE__ */ jsx(
|
|
251
|
+
"span",
|
|
252
|
+
{
|
|
253
|
+
"aria-hidden": true,
|
|
254
|
+
className: "pointer-events-none absolute inset-x-0 h-px bg-p-line/60",
|
|
255
|
+
style: { top: index * rowHeight }
|
|
256
|
+
},
|
|
257
|
+
`sep-${run.id}`
|
|
258
|
+
)
|
|
259
|
+
),
|
|
260
|
+
nowPct > 0 && nowPct <= 100 ? /* @__PURE__ */ jsx(
|
|
261
|
+
"span",
|
|
262
|
+
{
|
|
263
|
+
"aria-hidden": true,
|
|
264
|
+
className: "pointer-events-none absolute inset-y-0 w-[2px] -translate-x-1/2 bg-p-accent/15",
|
|
265
|
+
style: { left: `${nowPct}%` }
|
|
266
|
+
}
|
|
267
|
+
) : null,
|
|
268
|
+
/* @__PURE__ */ jsxs(
|
|
269
|
+
"svg",
|
|
270
|
+
{
|
|
271
|
+
"aria-hidden": true,
|
|
272
|
+
className: "pointer-events-none absolute inset-0 h-full w-full overflow-visible",
|
|
273
|
+
children: [
|
|
274
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
|
|
275
|
+
"marker",
|
|
276
|
+
{
|
|
277
|
+
id: "swarm-dep-arrow",
|
|
278
|
+
viewBox: "0 0 6 6",
|
|
279
|
+
refX: "5",
|
|
280
|
+
refY: "3",
|
|
281
|
+
markerWidth: "6",
|
|
282
|
+
markerHeight: "6",
|
|
283
|
+
orient: "auto-start-reverse",
|
|
284
|
+
children: /* @__PURE__ */ jsx("path", { d: "M 0 0 L 6 3 L 0 6 z", className: "fill-p-ink-3" })
|
|
285
|
+
}
|
|
286
|
+
) }),
|
|
287
|
+
deps.map((d, i) => /* @__PURE__ */ jsx(DependencyPath, { dep: d, rowHeight }, i))
|
|
288
|
+
]
|
|
289
|
+
}
|
|
290
|
+
),
|
|
291
|
+
rows.map(({ run, leftPct, widthPct, index }) => {
|
|
292
|
+
const isLive = run.status === "running" || run.status === "pending";
|
|
293
|
+
const fillPct = run.progress !== void 0 ? Math.max(0, Math.min(1, run.progress)) * 100 : isLive ? 0 : 100;
|
|
294
|
+
const top = index * rowHeight + (rowHeight - 14) / 2;
|
|
295
|
+
return /* @__PURE__ */ jsxs(
|
|
296
|
+
"button",
|
|
297
|
+
{
|
|
298
|
+
type: "button",
|
|
299
|
+
onClick: onOpen ? () => onOpen(run.id) : void 0,
|
|
300
|
+
className: [
|
|
301
|
+
"absolute overflow-hidden rounded-[3px] transition-[box-shadow,transform]",
|
|
302
|
+
onOpen ? "cursor-pointer hover:scale-y-110" : "cursor-default",
|
|
303
|
+
run.status === "running" ? "shadow-[0_0_18px_-4px_rgba(226,115,61,0.5)]" : ""
|
|
304
|
+
].join(" "),
|
|
305
|
+
style: {
|
|
306
|
+
left: `${leftPct}%`,
|
|
307
|
+
width: `${widthPct}%`,
|
|
308
|
+
top,
|
|
309
|
+
height: 14,
|
|
310
|
+
minWidth: 4
|
|
311
|
+
},
|
|
312
|
+
title: `${run.agent.displayName || run.agent.name} \xB7 ${run.title}`,
|
|
313
|
+
children: [
|
|
314
|
+
isLive ? /* @__PURE__ */ jsx(
|
|
315
|
+
"span",
|
|
316
|
+
{
|
|
317
|
+
"aria-hidden": true,
|
|
318
|
+
className: "absolute inset-0 bg-p-warm"
|
|
319
|
+
}
|
|
320
|
+
) : /* @__PURE__ */ jsx(
|
|
321
|
+
"span",
|
|
322
|
+
{
|
|
323
|
+
"aria-hidden": true,
|
|
324
|
+
className: ["absolute inset-0", STATUS_FILL[run.status]].join(" ")
|
|
325
|
+
}
|
|
326
|
+
),
|
|
327
|
+
isLive ? /* @__PURE__ */ jsx(
|
|
328
|
+
"span",
|
|
329
|
+
{
|
|
330
|
+
"aria-hidden": true,
|
|
331
|
+
className: "absolute inset-y-0 left-0 bg-p-accent transition-[width] duration-500 ease-out",
|
|
332
|
+
style: { width: `${fillPct}%` }
|
|
333
|
+
}
|
|
334
|
+
) : null
|
|
335
|
+
]
|
|
336
|
+
},
|
|
337
|
+
`bar-${run.id}`
|
|
338
|
+
);
|
|
339
|
+
}),
|
|
340
|
+
nowPct > 0 && nowPct <= 100 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
341
|
+
/* @__PURE__ */ jsx(
|
|
342
|
+
"span",
|
|
343
|
+
{
|
|
344
|
+
"aria-hidden": true,
|
|
345
|
+
className: "pointer-events-none absolute inset-y-0 w-px bg-p-accent",
|
|
346
|
+
style: { left: `${nowPct}%` }
|
|
347
|
+
}
|
|
348
|
+
),
|
|
349
|
+
/* @__PURE__ */ jsx(
|
|
350
|
+
"span",
|
|
351
|
+
{
|
|
352
|
+
"aria-hidden": true,
|
|
353
|
+
className: "pointer-events-none absolute -top-3 -translate-x-1/2 rounded-full bg-p-accent px-1.5 py-[1px] font-mono text-[8.5px] font-bold uppercase tracking-[0.22em] text-white shadow-[0_2px_8px_rgba(226,115,61,0.45)]",
|
|
354
|
+
style: { left: `${nowPct}%` },
|
|
355
|
+
children: "now"
|
|
356
|
+
}
|
|
357
|
+
)
|
|
358
|
+
] }) : null
|
|
359
|
+
] })
|
|
360
|
+
]
|
|
361
|
+
}
|
|
362
|
+
),
|
|
363
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between border-t border-p-line px-5 py-2 font-mono text-[9.5px] uppercase tracking-[0.18em] text-p-ink-3 tabular-nums", children: [
|
|
364
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
365
|
+
"start \xB7 ",
|
|
366
|
+
formatClock(originMs)
|
|
367
|
+
] }),
|
|
368
|
+
/* @__PURE__ */ jsx(Legend, {}),
|
|
369
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
370
|
+
"end \xB7 ",
|
|
371
|
+
formatClock(endMs)
|
|
372
|
+
] })
|
|
373
|
+
] })
|
|
374
|
+
]
|
|
375
|
+
}
|
|
330
376
|
);
|
|
331
377
|
}
|
|
332
378
|
function Tally({
|
|
@@ -337,19 +383,26 @@ function Tally({
|
|
|
337
383
|
}) {
|
|
338
384
|
const fg = tone === "accent" ? "text-p-accent" : tone === "green" ? "text-p-green" : "text-[#E63946]";
|
|
339
385
|
const dot = tone === "accent" ? "bg-p-accent" : tone === "green" ? "bg-p-green" : "bg-[#E63946]";
|
|
340
|
-
return /* @__PURE__ */
|
|
341
|
-
"span",
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
386
|
+
return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
387
|
+
/* @__PURE__ */ jsxs("span", { className: "relative inline-flex size-2", children: [
|
|
388
|
+
pulse && value > 0 ? /* @__PURE__ */ jsx(
|
|
389
|
+
"span",
|
|
390
|
+
{
|
|
391
|
+
"aria-hidden": true,
|
|
392
|
+
className: ["absolute inset-0 rounded-full opacity-60 animate-ping", dot].join(" ")
|
|
393
|
+
}
|
|
394
|
+
) : null,
|
|
395
|
+
/* @__PURE__ */ jsx(
|
|
396
|
+
"span",
|
|
397
|
+
{
|
|
398
|
+
"aria-hidden": true,
|
|
399
|
+
className: ["relative inline-block size-2 rounded-full", dot].join(" ")
|
|
400
|
+
}
|
|
401
|
+
)
|
|
402
|
+
] }),
|
|
403
|
+
/* @__PURE__ */ jsx("span", { className: ["font-display text-[14px] font-bold tabular-nums leading-none", fg].join(" "), children: value }),
|
|
404
|
+
/* @__PURE__ */ jsx("span", { children: label })
|
|
405
|
+
] });
|
|
353
406
|
}
|
|
354
407
|
function Legend() {
|
|
355
408
|
const items = [
|
|
@@ -358,7 +411,10 @@ function Legend() {
|
|
|
358
411
|
{ key: "failed", cls: "bg-[#E63946]", label: "failed" },
|
|
359
412
|
{ key: "cancelled", cls: "bg-p-ink-3/40", label: "cancelled" }
|
|
360
413
|
];
|
|
361
|
-
return /* @__PURE__ */
|
|
414
|
+
return /* @__PURE__ */ jsx("span", { className: "hidden items-center gap-3 md:inline-flex", children: items.map((it) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
415
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: ["h-1.5 w-3 rounded-sm", it.cls].join(" ") }),
|
|
416
|
+
/* @__PURE__ */ jsx("span", { children: it.label })
|
|
417
|
+
] }, it.key)) });
|
|
362
418
|
}
|
|
363
419
|
function DependencyPath({
|
|
364
420
|
dep,
|
|
@@ -370,24 +426,27 @@ function DependencyPath({
|
|
|
370
426
|
const c1 = `${dep.fromPct + horizontalGap}% ${fromY}`;
|
|
371
427
|
const c2 = `${dep.toPct - horizontalGap}% ${toY}`;
|
|
372
428
|
const d = `M ${dep.fromPct}% ${fromY} C ${c1}, ${c2}, ${dep.toPct}% ${toY}`;
|
|
373
|
-
return /* @__PURE__ */
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
429
|
+
return /* @__PURE__ */ jsxs("g", { children: [
|
|
430
|
+
/* @__PURE__ */ jsx(
|
|
431
|
+
"path",
|
|
432
|
+
{
|
|
433
|
+
d,
|
|
434
|
+
fill: "none",
|
|
435
|
+
strokeWidth: "1.25",
|
|
436
|
+
className: "stroke-p-ink-3/70",
|
|
437
|
+
markerEnd: "url(#swarm-dep-arrow)"
|
|
438
|
+
}
|
|
439
|
+
),
|
|
440
|
+
/* @__PURE__ */ jsx(
|
|
441
|
+
"circle",
|
|
442
|
+
{
|
|
443
|
+
cx: `${dep.fromPct}%`,
|
|
444
|
+
cy: fromY,
|
|
445
|
+
r: "1.6",
|
|
446
|
+
className: "fill-p-ink-3"
|
|
447
|
+
}
|
|
448
|
+
)
|
|
449
|
+
] });
|
|
391
450
|
}
|
|
392
451
|
function pickStep(spanSec) {
|
|
393
452
|
if (spanSec <= 30) return 5;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { WorkspaceTask, WorkspaceMission, SwarmAgentRef } from './types.js';
|
|
4
4
|
|
|
@@ -66,6 +66,6 @@ interface TaskWorkspaceSidebarProps {
|
|
|
66
66
|
labels?: Partial<TaskWorkspaceSidebarLabels>;
|
|
67
67
|
className?: string;
|
|
68
68
|
}
|
|
69
|
-
declare function TaskWorkspaceSidebar({ tasks, missions, agents, isLoading, activeRuntimeId, activePlanRef, activeMissionId, closed, onCollapse, kanbanView, onToggleKanban, runtimeTaskHref, planTaskHref, missionHref, renderLink, parsePlan, labels, className, }: TaskWorkspaceSidebarProps):
|
|
69
|
+
declare function TaskWorkspaceSidebar({ tasks, missions, agents, isLoading, activeRuntimeId, activePlanRef, activeMissionId, closed, onCollapse, kanbanView, onToggleKanban, runtimeTaskHref, planTaskHref, missionHref, renderLink, parsePlan, labels, className, }: TaskWorkspaceSidebarProps): react_jsx_runtime.JSX.Element;
|
|
70
70
|
|
|
71
71
|
export { type PlanOnlyTaskShape, type RenderLinkArgs, type RenderLinkFn, TaskWorkspaceSidebar, type TaskWorkspaceSidebarLabels, type TaskWorkspaceSidebarProps, defaultTaskWorkspaceSidebarLabels };
|