@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
package/dist/swarm-run-list.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
|
|
|
@@ -17,6 +17,6 @@ interface SwarmRunListProps {
|
|
|
17
17
|
labels?: Partial<SwarmLabels>;
|
|
18
18
|
className?: string;
|
|
19
19
|
}
|
|
20
|
-
declare function SwarmRunList({ runs, now, groupBackground, activeId, renderAvatar, onCancel, onRetry, onOpen, emptyState, labels, className, }: SwarmRunListProps):
|
|
20
|
+
declare function SwarmRunList({ runs, now, groupBackground, activeId, renderAvatar, onCancel, onRetry, onOpen, emptyState, labels, className, }: SwarmRunListProps): react_jsx_runtime.JSX.Element;
|
|
21
21
|
|
|
22
22
|
export { SwarmRunList, type SwarmRunListProps };
|
package/dist/swarm-run-list.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
|
|
@@ -27,37 +28,19 @@ function SwarmRunList({
|
|
|
27
28
|
return { foreground: fg, background: bg };
|
|
28
29
|
}, [runs, groupBackground]);
|
|
29
30
|
if (runs.length === 0) {
|
|
30
|
-
return /* @__PURE__ */
|
|
31
|
+
return /* @__PURE__ */ jsx("div", { className: ["px-3 py-10 text-center", className || ""].join(" "), children: emptyState ?? /* @__PURE__ */ jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.16em] text-p-ink-3", children: L.noRuns }) });
|
|
31
32
|
}
|
|
32
33
|
const Section = ({
|
|
33
34
|
label,
|
|
34
35
|
list
|
|
35
|
-
}) => /* @__PURE__ */
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
renderAvatar,
|
|
42
|
-
onCancel,
|
|
43
|
-
onRetry,
|
|
44
|
-
onOpen,
|
|
45
|
-
active: activeId === r.id,
|
|
46
|
-
labels
|
|
47
|
-
}
|
|
48
|
-
))));
|
|
49
|
-
return /* @__PURE__ */ React.createElement(
|
|
50
|
-
"div",
|
|
51
|
-
{
|
|
52
|
-
className: [
|
|
53
|
-
"overflow-hidden rounded-xl border border-p-line bg-p-surface",
|
|
54
|
-
className || ""
|
|
55
|
-
].join(" ")
|
|
56
|
-
},
|
|
57
|
-
groupBackground ? /* @__PURE__ */ React.createElement(React.Fragment, null, foreground.length > 0 ? /* @__PURE__ */ React.createElement(Section, { label: L.foregroundGroup, list: foreground }) : null, background.length > 0 ? /* @__PURE__ */ React.createElement(Section, { label: L.backgroundGroup, list: background }) : null) : /* @__PURE__ */ React.createElement("div", { className: "flex flex-col" }, runs.map((r) => /* @__PURE__ */ React.createElement(
|
|
36
|
+
}) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
37
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2 border-b border-p-line bg-p-bg/50 px-3 py-1.5", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.22em] text-p-ink-3", children: label }),
|
|
39
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] tabular-nums text-p-ink-3", children: String(list.length).padStart(2, "0") })
|
|
40
|
+
] }),
|
|
41
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col", children: list.map((r) => /* @__PURE__ */ jsx(
|
|
58
42
|
SwarmRunRow,
|
|
59
43
|
{
|
|
60
|
-
key: r.id,
|
|
61
44
|
run: r,
|
|
62
45
|
now,
|
|
63
46
|
renderAvatar,
|
|
@@ -66,8 +49,35 @@ function SwarmRunList({
|
|
|
66
49
|
onOpen,
|
|
67
50
|
active: activeId === r.id,
|
|
68
51
|
labels
|
|
69
|
-
}
|
|
70
|
-
|
|
52
|
+
},
|
|
53
|
+
r.id
|
|
54
|
+
)) })
|
|
55
|
+
] });
|
|
56
|
+
return /* @__PURE__ */ jsx(
|
|
57
|
+
"div",
|
|
58
|
+
{
|
|
59
|
+
className: [
|
|
60
|
+
"overflow-hidden rounded-xl border border-p-line bg-p-surface",
|
|
61
|
+
className || ""
|
|
62
|
+
].join(" "),
|
|
63
|
+
children: groupBackground ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
64
|
+
foreground.length > 0 ? /* @__PURE__ */ jsx(Section, { label: L.foregroundGroup, list: foreground }) : null,
|
|
65
|
+
background.length > 0 ? /* @__PURE__ */ jsx(Section, { label: L.backgroundGroup, list: background }) : null
|
|
66
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: runs.map((r) => /* @__PURE__ */ jsx(
|
|
67
|
+
SwarmRunRow,
|
|
68
|
+
{
|
|
69
|
+
run: r,
|
|
70
|
+
now,
|
|
71
|
+
renderAvatar,
|
|
72
|
+
onCancel,
|
|
73
|
+
onRetry,
|
|
74
|
+
onOpen,
|
|
75
|
+
active: activeId === r.id,
|
|
76
|
+
labels
|
|
77
|
+
},
|
|
78
|
+
r.id
|
|
79
|
+
)) })
|
|
80
|
+
}
|
|
71
81
|
);
|
|
72
82
|
}
|
|
73
83
|
export {
|
package/dist/swarm-run-row.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
|
|
|
@@ -17,6 +17,6 @@ interface SwarmRunRowProps {
|
|
|
17
17
|
labels?: Partial<SwarmLabels>;
|
|
18
18
|
className?: string;
|
|
19
19
|
}
|
|
20
|
-
declare function SwarmRunRow({ run, now, renderAvatar, onCancel, onRetry, onOpen, active, labels, className, }: SwarmRunRowProps):
|
|
20
|
+
declare function SwarmRunRow({ run, now, renderAvatar, onCancel, onRetry, onOpen, active, labels, className, }: SwarmRunRowProps): react_jsx_runtime.JSX.Element;
|
|
21
21
|
|
|
22
22
|
export { SwarmRunRow, type SwarmRunRowProps };
|
package/dist/swarm-run-row.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { RotateCcw, Square } from "lucide-react";
|
|
3
4
|
import {
|
|
4
5
|
defaultSwarmLabels
|
|
@@ -31,7 +32,7 @@ function SwarmRunRow({
|
|
|
31
32
|
const showCancel = onCancel && isLive;
|
|
32
33
|
const showRetry = onRetry && (run.status === "failed" || run.status === "cancelled");
|
|
33
34
|
const glyph = run.agent.glyph || (run.agent.displayName || run.agent.name).charAt(0).toUpperCase();
|
|
34
|
-
return /* @__PURE__ */
|
|
35
|
+
return /* @__PURE__ */ jsxs(
|
|
35
36
|
"div",
|
|
36
37
|
{
|
|
37
38
|
role: onOpen ? "button" : void 0,
|
|
@@ -47,77 +48,86 @@ function SwarmRunRow({
|
|
|
47
48
|
"group relative flex items-center gap-3 border-b border-p-line/70 px-3 py-1.5 transition-colors",
|
|
48
49
|
active ? "bg-p-warm" : onOpen ? "cursor-pointer hover:bg-p-warm/60" : "",
|
|
49
50
|
className || ""
|
|
50
|
-
].join(" ")
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
51
|
+
].join(" "),
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ jsxs("span", { className: "relative inline-flex size-2 shrink-0", children: [
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"span",
|
|
56
|
+
{
|
|
57
|
+
"aria-hidden": true,
|
|
58
|
+
className: [
|
|
59
|
+
"absolute inset-0 rounded-full",
|
|
60
|
+
DOT[run.status],
|
|
61
|
+
run.status === "running" ? "animate-ping opacity-60" : ""
|
|
62
|
+
].join(" ")
|
|
63
|
+
}
|
|
64
|
+
),
|
|
65
|
+
/* @__PURE__ */ jsx(
|
|
66
|
+
"span",
|
|
67
|
+
{
|
|
68
|
+
"aria-hidden": true,
|
|
69
|
+
className: ["relative inline-block size-2 rounded-full", DOT[run.status]].join(" ")
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] }),
|
|
73
|
+
renderAvatar ? renderAvatar(run.agent) : /* @__PURE__ */ jsx(
|
|
74
|
+
"span",
|
|
75
|
+
{
|
|
76
|
+
"aria-hidden": true,
|
|
77
|
+
className: "grid size-[18px] shrink-0 place-items-center rounded font-display text-[10px] font-bold text-white",
|
|
78
|
+
style: { background: run.agent.color || "#999" },
|
|
79
|
+
children: glyph
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
/* @__PURE__ */ jsx("span", { className: "w-[68px] shrink-0 truncate font-mono text-[10.5px] font-bold uppercase tracking-[0.14em] text-p-ink", children: run.agent.displayName || run.agent.name }),
|
|
83
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-body text-[12.5px] leading-tight text-p-ink", children: run.title }),
|
|
84
|
+
run.lastLog ? /* @__PURE__ */ jsx("span", { className: "hidden min-w-0 max-w-[28%] truncate font-mono text-[10.5px] text-p-ink-3 md:inline", children: run.lastLog }) : null,
|
|
85
|
+
/* @__PURE__ */ jsx("span", { className: "w-12 shrink-0 text-right font-mono text-[10.5px] tabular-nums text-p-ink-3", children: run.startedAt ? isLive ? L.startedAgo(elapsed) : L.duration(elapsed) : "\u2014" }),
|
|
86
|
+
/* @__PURE__ */ jsx("span", { className: "w-14 shrink-0 text-right", children: showCancel ? /* @__PURE__ */ jsxs(
|
|
87
|
+
"button",
|
|
88
|
+
{
|
|
89
|
+
type: "button",
|
|
90
|
+
onClick: (e) => {
|
|
91
|
+
e.stopPropagation();
|
|
92
|
+
onCancel(run.id);
|
|
93
|
+
},
|
|
94
|
+
className: "inline-flex items-center gap-1 rounded px-1.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-[0.12em] text-p-ink-3 opacity-0 transition-all cursor-pointer group-hover:opacity-100 hover:bg-p-surface hover:text-[#E63946]",
|
|
95
|
+
children: [
|
|
96
|
+
/* @__PURE__ */ jsx(Square, { className: "size-2.5" }),
|
|
97
|
+
L.cancel
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
) : showRetry ? /* @__PURE__ */ jsxs(
|
|
101
|
+
"button",
|
|
102
|
+
{
|
|
103
|
+
type: "button",
|
|
104
|
+
onClick: (e) => {
|
|
105
|
+
e.stopPropagation();
|
|
106
|
+
onRetry(run.id);
|
|
107
|
+
},
|
|
108
|
+
className: "inline-flex items-center gap-1 rounded px-1.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-[0.12em] text-p-ink-3 opacity-0 transition-all cursor-pointer group-hover:opacity-100 hover:bg-p-surface hover:text-p-ink",
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ jsx(RotateCcw, { className: "size-2.5" }),
|
|
111
|
+
L.retry
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
) : null }),
|
|
115
|
+
run.progress !== void 0 && isLive ? /* @__PURE__ */ jsx(
|
|
116
|
+
"span",
|
|
117
|
+
{
|
|
118
|
+
"aria-hidden": true,
|
|
119
|
+
className: "absolute inset-x-0 bottom-0 h-px bg-p-warm",
|
|
120
|
+
children: /* @__PURE__ */ jsx(
|
|
121
|
+
"span",
|
|
122
|
+
{
|
|
123
|
+
className: "block h-full bg-p-accent transition-[width] duration-500",
|
|
124
|
+
style: { width: `${Math.max(0, Math.min(100, run.progress * 100))}%` }
|
|
125
|
+
}
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
) : null
|
|
129
|
+
]
|
|
130
|
+
}
|
|
121
131
|
);
|
|
122
132
|
}
|
|
123
133
|
export {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Skeleton loaders for orchestrator surfaces — mirror the layout of
|
|
@@ -17,12 +17,12 @@ interface SwarmRunDetailSkeletonProps {
|
|
|
17
17
|
hideTools?: boolean;
|
|
18
18
|
className?: string;
|
|
19
19
|
}
|
|
20
|
-
declare function SwarmRunDetailSkeleton({ variant, hideTools, className, }: SwarmRunDetailSkeletonProps):
|
|
20
|
+
declare function SwarmRunDetailSkeleton({ variant, hideTools, className, }: SwarmRunDetailSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
21
21
|
interface SwarmRunActivityStreamSkeletonProps {
|
|
22
22
|
/** How many event rows to fake. Default `4`. */
|
|
23
23
|
count?: number;
|
|
24
24
|
className?: string;
|
|
25
25
|
}
|
|
26
|
-
declare function SwarmRunActivityStreamSkeleton({ count, className, }: SwarmRunActivityStreamSkeletonProps):
|
|
26
|
+
declare function SwarmRunActivityStreamSkeleton({ count, className, }: SwarmRunActivityStreamSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
27
27
|
|
|
28
28
|
export { SwarmRunActivityStreamSkeleton, type SwarmRunActivityStreamSkeletonProps, SwarmRunDetailSkeleton, type SwarmRunDetailSkeletonProps };
|
package/dist/swarm-skeletons.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
1
2
|
function Bone({
|
|
2
3
|
width,
|
|
3
4
|
height = 14,
|
|
4
5
|
rounded
|
|
5
6
|
}) {
|
|
6
|
-
return /* @__PURE__ */
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
7
8
|
"div",
|
|
8
9
|
{
|
|
9
10
|
className: "bg-p-warm animate-pulse",
|
|
@@ -20,7 +21,7 @@ function SwarmRunDetailSkeleton({
|
|
|
20
21
|
hideTools = false,
|
|
21
22
|
className
|
|
22
23
|
}) {
|
|
23
|
-
return /* @__PURE__ */
|
|
24
|
+
return /* @__PURE__ */ jsxs(
|
|
24
25
|
"section",
|
|
25
26
|
{
|
|
26
27
|
"aria-busy": true,
|
|
@@ -28,33 +29,67 @@ function SwarmRunDetailSkeleton({
|
|
|
28
29
|
className: [
|
|
29
30
|
"flex h-full min-h-0 flex-col overflow-hidden rounded-2xl border border-p-line bg-p-surface",
|
|
30
31
|
className || ""
|
|
31
|
-
].join(" ")
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
].join(" "),
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("header", { className: "flex shrink-0 items-center gap-2 border-b border-p-line px-4 py-3", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("div", { className: "size-6 shrink-0 rounded-md bg-p-warm animate-pulse" }),
|
|
36
|
+
/* @__PURE__ */ jsx(Bone, { width: "9rem", height: 13 }),
|
|
37
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-auto inline-flex items-center gap-1", children: [
|
|
38
|
+
/* @__PURE__ */ jsx(Bone, { width: 56, height: 20, rounded: 6 }),
|
|
39
|
+
/* @__PURE__ */ jsx("div", { className: "size-7 rounded-md bg-p-warm animate-pulse" })
|
|
40
|
+
] })
|
|
41
|
+
] }),
|
|
42
|
+
/* @__PURE__ */ jsx("div", { className: "grid shrink-0 grid-cols-4 gap-3 border-b border-p-line px-4 py-3", children: Array.from({ length: 4 }, (_, i) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
|
|
43
|
+
/* @__PURE__ */ jsx(Bone, { width: "3.5rem", height: 9 }),
|
|
44
|
+
/* @__PURE__ */ jsx(Bone, { width: "4.5rem", height: 16 })
|
|
45
|
+
] }, i)) }),
|
|
46
|
+
/* @__PURE__ */ jsxs("div", { className: "shrink-0 border-b border-p-line px-4 py-3", children: [
|
|
47
|
+
/* @__PURE__ */ jsx(Bone, { width: "2.5rem", height: 9 }),
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-col gap-1.5", children: [
|
|
49
|
+
/* @__PURE__ */ jsx(Bone, { width: "92%", height: 14 }),
|
|
50
|
+
/* @__PURE__ */ jsx(Bone, { width: "74%", height: 14 })
|
|
51
|
+
] })
|
|
52
|
+
] }),
|
|
53
|
+
variant === "tabs" ? /* @__PURE__ */ jsx(TabsBodySkeleton, { hideTools }) : /* @__PURE__ */ jsx(FlatBodySkeleton, { hideTools })
|
|
54
|
+
]
|
|
55
|
+
}
|
|
37
56
|
);
|
|
38
57
|
}
|
|
39
58
|
function TabsBodySkeleton({ hideTools }) {
|
|
40
59
|
const tabCount = hideTools ? 2 : 3;
|
|
41
|
-
return /* @__PURE__ */
|
|
60
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
61
|
+
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1 border-b border-p-line px-3 py-2", children: Array.from({ length: tabCount }, (_, i) => /* @__PURE__ */ jsx(Bone, { width: "5rem", height: 20, rounded: 6 }, i)) }),
|
|
62
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-hidden px-4 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
63
|
+
/* @__PURE__ */ jsx(Bone, { width: "88%" }),
|
|
64
|
+
/* @__PURE__ */ jsx(Bone, { width: "76%" }),
|
|
65
|
+
/* @__PURE__ */ jsx(Bone, { width: "92%" }),
|
|
66
|
+
/* @__PURE__ */ jsx(Bone, { width: "60%" }),
|
|
67
|
+
/* @__PURE__ */ jsx(Bone, { width: "80%" })
|
|
68
|
+
] }) })
|
|
69
|
+
] });
|
|
42
70
|
}
|
|
43
71
|
function FlatBodySkeleton({ hideTools }) {
|
|
44
|
-
return /* @__PURE__ */
|
|
72
|
+
return /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 py-4", children: [
|
|
73
|
+
/* @__PURE__ */ jsx(FlatSectionSkeleton, { lines: 3 }),
|
|
74
|
+
!hideTools ? /* @__PURE__ */ jsx(FlatSectionSkeleton, { lines: 2, chips: true }) : null,
|
|
75
|
+
/* @__PURE__ */ jsx(FlatSectionSkeleton, { lines: 4 })
|
|
76
|
+
] });
|
|
45
77
|
}
|
|
46
78
|
function FlatSectionSkeleton({
|
|
47
79
|
lines,
|
|
48
80
|
chips
|
|
49
81
|
}) {
|
|
50
82
|
const widths = ["88%", "76%", "92%", "60%", "82%"];
|
|
51
|
-
return /* @__PURE__ */
|
|
83
|
+
return /* @__PURE__ */ jsxs("div", { className: "border-b border-p-line/60 py-3 last:border-0", children: [
|
|
84
|
+
/* @__PURE__ */ jsx(Bone, { width: "3.5rem", height: 9 }),
|
|
85
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-col gap-1.5", children: chips ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: Array.from({ length: lines * 2 }, (_, i) => /* @__PURE__ */ jsx(Bone, { width: "6rem", height: 22, rounded: 8 }, i)) }) : Array.from({ length: lines }, (_, i) => /* @__PURE__ */ jsx(Bone, { width: widths[i % widths.length] }, i)) })
|
|
86
|
+
] });
|
|
52
87
|
}
|
|
53
88
|
function SwarmRunActivityStreamSkeleton({
|
|
54
89
|
count = 4,
|
|
55
90
|
className
|
|
56
91
|
}) {
|
|
57
|
-
return /* @__PURE__ */
|
|
92
|
+
return /* @__PURE__ */ jsx(
|
|
58
93
|
"ol",
|
|
59
94
|
{
|
|
60
95
|
"aria-busy": true,
|
|
@@ -62,15 +97,29 @@ function SwarmRunActivityStreamSkeleton({
|
|
|
62
97
|
className: [
|
|
63
98
|
"flex flex-col divide-y divide-p-line/60",
|
|
64
99
|
className || ""
|
|
65
|
-
].join(" ")
|
|
66
|
-
|
|
67
|
-
|
|
100
|
+
].join(" "),
|
|
101
|
+
children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx(ActivityRowSkeleton, { index: i }, i))
|
|
102
|
+
}
|
|
68
103
|
);
|
|
69
104
|
}
|
|
70
105
|
function ActivityRowSkeleton({ index }) {
|
|
71
106
|
const bodyWidths = ["88%", "62%", "94%", "70%", "78%"];
|
|
72
107
|
const showAgent = index % 2 === 0;
|
|
73
|
-
return /* @__PURE__ */
|
|
108
|
+
return /* @__PURE__ */ jsxs("li", { className: "grid grid-cols-[80px_24px_minmax(0,1fr)] items-start gap-3 py-3", children: [
|
|
109
|
+
/* @__PURE__ */ jsx(Bone, { width: "3.25rem", height: 9 }),
|
|
110
|
+
/* @__PURE__ */ jsx("div", { className: "mt-1 size-5 rounded-full bg-p-warm animate-pulse" }),
|
|
111
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex flex-col gap-1.5", children: [
|
|
112
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
|
|
113
|
+
/* @__PURE__ */ jsx(Bone, { width: "4.5rem", height: 9 }),
|
|
114
|
+
showAgent ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
|
|
115
|
+
/* @__PURE__ */ jsx("div", { className: "size-3.5 rounded-[3px] bg-p-warm animate-pulse" }),
|
|
116
|
+
/* @__PURE__ */ jsx(Bone, { width: "4rem", height: 9 })
|
|
117
|
+
] }) : null
|
|
118
|
+
] }),
|
|
119
|
+
/* @__PURE__ */ jsx(Bone, { width: bodyWidths[index % bodyWidths.length], height: 13 }),
|
|
120
|
+
index % 3 === 0 ? /* @__PURE__ */ jsx(Bone, { width: "55%", height: 13 }) : null
|
|
121
|
+
] })
|
|
122
|
+
] });
|
|
74
123
|
}
|
|
75
124
|
export {
|
|
76
125
|
SwarmRunActivityStreamSkeleton,
|
|
@@ -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 { SwarmCounts, SwarmLabels } from './types.js';
|
|
4
4
|
|
|
@@ -10,6 +10,6 @@ interface SwarmStatusBarProps {
|
|
|
10
10
|
labels?: Partial<SwarmLabels>;
|
|
11
11
|
className?: string;
|
|
12
12
|
}
|
|
13
|
-
declare function SwarmStatusBar({ counts, onCancelAll, onRetryFailed, trailing, labels, className, }: SwarmStatusBarProps):
|
|
13
|
+
declare function SwarmStatusBar({ counts, onCancelAll, onRetryFailed, trailing, labels, className, }: SwarmStatusBarProps): react_jsx_runtime.JSX.Element;
|
|
14
14
|
|
|
15
15
|
export { SwarmStatusBar, type SwarmStatusBarProps };
|
package/dist/swarm-status-bar.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
3
|
import { RotateCcw, Square } from "lucide-react";
|
|
3
4
|
import {
|
|
4
5
|
defaultSwarmLabels
|
|
@@ -14,38 +15,48 @@ function SwarmStatusBar({
|
|
|
14
15
|
const L = { ...defaultSwarmLabels, ...labels };
|
|
15
16
|
const showCancelAll = onCancelAll && counts.running + counts.pending > 0;
|
|
16
17
|
const showRetryFailed = onRetryFailed && counts.failed > 0;
|
|
17
|
-
return /* @__PURE__ */
|
|
18
|
+
return /* @__PURE__ */ jsxs(
|
|
18
19
|
"div",
|
|
19
20
|
{
|
|
20
21
|
className: [
|
|
21
22
|
"flex flex-wrap items-center gap-3 rounded-xl border border-p-line bg-p-surface px-4 py-2.5",
|
|
22
23
|
className || ""
|
|
23
|
-
].join(" ")
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
24
|
+
].join(" "),
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx(Stat, { label: L.running, value: counts.running, tone: "accent", pulse: counts.running > 0 }),
|
|
27
|
+
/* @__PURE__ */ jsx("span", { className: "h-4 w-px bg-p-line" }),
|
|
28
|
+
/* @__PURE__ */ jsx(Stat, { label: L.done, value: counts.done, tone: "green" }),
|
|
29
|
+
/* @__PURE__ */ jsx("span", { className: "h-4 w-px bg-p-line" }),
|
|
30
|
+
/* @__PURE__ */ jsx(Stat, { label: L.failed, value: counts.failed, tone: "red" }),
|
|
31
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-auto inline-flex items-center gap-1.5", children: [
|
|
32
|
+
showCancelAll ? /* @__PURE__ */ jsxs(
|
|
33
|
+
"button",
|
|
34
|
+
{
|
|
35
|
+
type: "button",
|
|
36
|
+
onClick: onCancelAll,
|
|
37
|
+
className: "inline-flex items-center gap-1 rounded-md px-2 py-1 font-mono text-[10.5px] font-bold uppercase tracking-[0.16em] text-p-ink-3 transition-colors cursor-pointer hover:bg-p-warm hover:text-[#E63946]",
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ jsx(Square, { className: "size-2.5" }),
|
|
40
|
+
L.cancelAll
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
) : null,
|
|
44
|
+
showRetryFailed ? /* @__PURE__ */ jsxs(
|
|
45
|
+
"button",
|
|
46
|
+
{
|
|
47
|
+
type: "button",
|
|
48
|
+
onClick: onRetryFailed,
|
|
49
|
+
className: "inline-flex items-center gap-1 rounded-md px-2 py-1 font-mono text-[10.5px] font-bold uppercase tracking-[0.16em] text-p-ink-3 transition-colors cursor-pointer hover:bg-p-warm hover:text-p-ink",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsx(RotateCcw, { className: "size-2.5" }),
|
|
52
|
+
L.retryFailed
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
) : null,
|
|
56
|
+
trailing
|
|
57
|
+
] })
|
|
58
|
+
]
|
|
59
|
+
}
|
|
49
60
|
);
|
|
50
61
|
}
|
|
51
62
|
function Stat({
|
|
@@ -56,23 +67,30 @@ function Stat({
|
|
|
56
67
|
}) {
|
|
57
68
|
const fg = tone === "accent" ? "text-p-accent" : tone === "green" ? "text-p-green" : "text-[#E63946]";
|
|
58
69
|
const dot = tone === "accent" ? "bg-p-accent" : tone === "green" ? "bg-p-green" : "bg-[#E63946]";
|
|
59
|
-
return /* @__PURE__ */
|
|
60
|
-
"span",
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
71
|
+
/* @__PURE__ */ jsxs("span", { className: "relative inline-flex size-2 shrink-0", children: [
|
|
72
|
+
pulse ? /* @__PURE__ */ jsx(
|
|
73
|
+
"span",
|
|
74
|
+
{
|
|
75
|
+
className: [
|
|
76
|
+
"absolute inset-0 rounded-full opacity-60",
|
|
77
|
+
dot,
|
|
78
|
+
"animate-ping"
|
|
79
|
+
].join(" "),
|
|
80
|
+
"aria-hidden": true
|
|
81
|
+
}
|
|
82
|
+
) : null,
|
|
83
|
+
/* @__PURE__ */ jsx(
|
|
84
|
+
"span",
|
|
85
|
+
{
|
|
86
|
+
className: ["relative inline-block size-2 rounded-full", dot].join(" "),
|
|
87
|
+
"aria-hidden": true
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsx("span", { className: ["font-display text-[14px] font-bold tabular-nums", fg].join(" "), children: value }),
|
|
92
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.18em] text-p-ink-3", children: label })
|
|
93
|
+
] });
|
|
76
94
|
}
|
|
77
95
|
export {
|
|
78
96
|
SwarmStatusBar
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import { SwarmRunStatus } from './types.js';
|
|
3
3
|
|
|
4
4
|
interface SwarmStatusPillProps {
|
|
@@ -7,6 +7,6 @@ interface SwarmStatusPillProps {
|
|
|
7
7
|
size?: "sm" | "md";
|
|
8
8
|
className?: string;
|
|
9
9
|
}
|
|
10
|
-
declare function SwarmStatusPill({ status, label, size, className, }: SwarmStatusPillProps):
|
|
10
|
+
declare function SwarmStatusPill({ status, label, size, className, }: SwarmStatusPillProps): react_jsx_runtime.JSX.Element;
|
|
11
11
|
|
|
12
12
|
export { SwarmStatusPill, type SwarmStatusPillProps };
|