@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.
Files changed (38) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/orchestrator-document.d.ts +2 -2
  3. package/dist/orchestrator-document.js +2 -1
  4. package/dist/plan-detail.d.ts +6 -6
  5. package/dist/plan-detail.js +214 -156
  6. package/dist/plan-graph.d.ts +2 -2
  7. package/dist/plan-graph.js +178 -119
  8. package/dist/plan-node-detail.d.ts +4 -4
  9. package/dist/plan-node-detail.js +177 -125
  10. package/dist/plan-task-detail.d.ts +2 -2
  11. package/dist/plan-task-detail.js +282 -172
  12. package/dist/run-kanban-filter-menu.d.ts +3 -2
  13. package/dist/run-kanban-filter-menu.js +96 -77
  14. package/dist/run-kanban.d.ts +3 -3
  15. package/dist/run-kanban.js +93 -79
  16. package/dist/swarm-agent-badge.d.ts +2 -2
  17. package/dist/swarm-agent-badge.js +21 -18
  18. package/dist/swarm-run-activity.d.ts +2 -2
  19. package/dist/swarm-run-activity.js +150 -95
  20. package/dist/swarm-run-card.d.ts +2 -2
  21. package/dist/swarm-run-card.js +76 -55
  22. package/dist/swarm-run-detail.d.ts +2 -2
  23. package/dist/swarm-run-detail.js +415 -310
  24. package/dist/swarm-run-list.d.ts +2 -2
  25. package/dist/swarm-run-list.js +37 -27
  26. package/dist/swarm-run-row.d.ts +2 -2
  27. package/dist/swarm-run-row.js +82 -72
  28. package/dist/swarm-skeletons.d.ts +3 -3
  29. package/dist/swarm-skeletons.js +65 -16
  30. package/dist/swarm-status-bar.d.ts +2 -2
  31. package/dist/swarm-status-bar.js +62 -44
  32. package/dist/swarm-status-pill.d.ts +2 -2
  33. package/dist/swarm-status-pill.js +14 -11
  34. package/dist/swarm-timeline.d.ts +2 -2
  35. package/dist/swarm-timeline.js +284 -225
  36. package/dist/task-workspace-sidebar.d.ts +2 -2
  37. package/dist/task-workspace-sidebar.js +145 -113
  38. 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__ */ React.createElement(
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
- /* @__PURE__ */ React.createElement(
75
- Icon,
76
- {
77
- "aria-hidden": true,
78
- className: [icon, status === "running" ? "animate-spin" : ""].join(" ")
79
- }
80
- ),
81
- text
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 {
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
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): react.JSX.Element;
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 };
@@ -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__ */ React.createElement("div", { className: ["px-3 py-10 text-center", className || ""].join(" ") }, /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[11px] uppercase tracking-[0.16em] text-p-ink-3" }, L.noRuns));
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__ */ React.createElement(
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
- /* @__PURE__ */ React.createElement(
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
- key: run.id,
187
- role: onOpen ? "button" : void 0,
188
- tabIndex: onOpen ? 0 : void 0,
189
- onClick: onOpen ? () => onOpen(run.id) : void 0,
190
- className: [
191
- "group flex shrink-0 items-center gap-2.5 px-5",
192
- onOpen ? "cursor-pointer transition-colors hover:bg-p-warm/50" : "",
193
- index !== 0 ? "border-t border-p-line/60" : ""
194
- ].join(" "),
195
- style: { height: rowHeight }
196
- },
197
- /* @__PURE__ */ React.createElement(
198
- "span",
199
- {
200
- "aria-hidden": true,
201
- className: [
202
- "size-1.5 shrink-0 rounded-full",
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
- ), nowPct > 0 && nowPct <= 100 ? /* @__PURE__ */ React.createElement(
240
- "span",
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
- key: `bar-${run.id}`,
274
- type: "button",
275
- onClick: onOpen ? () => onOpen(run.id) : void 0,
276
- className: [
277
- "absolute overflow-hidden rounded-[3px] transition-[box-shadow,transform]",
278
- onOpen ? "cursor-pointer hover:scale-y-110" : "cursor-default",
279
- run.status === "running" ? "shadow-[0_0_18px_-4px_rgba(226,115,61,0.5)]" : ""
280
- ].join(" "),
281
- style: {
282
- left: `${leftPct}%`,
283
- width: `${widthPct}%`,
284
- top,
285
- height: 14,
286
- minWidth: 4
287
- },
288
- title: `${run.agent.displayName || run.agent.name} \xB7 ${run.title}`
289
- },
290
- isLive ? /* @__PURE__ */ React.createElement(
291
- "span",
292
- {
293
- "aria-hidden": true,
294
- className: "absolute inset-0 bg-p-warm"
295
- }
296
- ) : /* @__PURE__ */ React.createElement(
297
- "span",
298
- {
299
- "aria-hidden": true,
300
- className: ["absolute inset-0", STATUS_FILL[run.status]].join(" ")
301
- }
302
- ),
303
- isLive ? /* @__PURE__ */ React.createElement(
304
- "span",
305
- {
306
- "aria-hidden": true,
307
- className: "absolute inset-y-0 left-0 bg-p-accent transition-[width] duration-500 ease-out",
308
- style: { width: `${fillPct}%` }
309
- }
310
- ) : null
311
- );
312
- }), nowPct > 0 && nowPct <= 100 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
313
- "span",
314
- {
315
- "aria-hidden": true,
316
- className: "pointer-events-none absolute inset-y-0 w-px bg-p-accent",
317
- style: { left: `${nowPct}%` }
318
- }
319
- ), /* @__PURE__ */ React.createElement(
320
- "span",
321
- {
322
- "aria-hidden": true,
323
- 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)]",
324
- style: { left: `${nowPct}%` }
325
- },
326
- "now"
327
- )) : null)
328
- ),
329
- /* @__PURE__ */ React.createElement("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" }, /* @__PURE__ */ React.createElement("span", null, "start \xB7 ", formatClock(originMs)), /* @__PURE__ */ React.createElement(Legend, null), /* @__PURE__ */ React.createElement("span", null, "end \xB7 ", formatClock(endMs)))
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__ */ React.createElement("span", { className: "inline-flex items-center gap-1.5" }, /* @__PURE__ */ React.createElement("span", { className: "relative inline-flex size-2" }, pulse && value > 0 ? /* @__PURE__ */ React.createElement(
341
- "span",
342
- {
343
- "aria-hidden": true,
344
- className: ["absolute inset-0 rounded-full opacity-60 animate-ping", dot].join(" ")
345
- }
346
- ) : null, /* @__PURE__ */ React.createElement(
347
- "span",
348
- {
349
- "aria-hidden": true,
350
- className: ["relative inline-block size-2 rounded-full", dot].join(" ")
351
- }
352
- )), /* @__PURE__ */ React.createElement("span", { className: ["font-display text-[14px] font-bold tabular-nums leading-none", fg].join(" ") }, value), /* @__PURE__ */ React.createElement("span", null, label));
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__ */ React.createElement("span", { className: "hidden items-center gap-3 md:inline-flex" }, items.map((it) => /* @__PURE__ */ React.createElement("span", { key: it.key, className: "inline-flex items-center gap-1.5" }, /* @__PURE__ */ React.createElement("span", { "aria-hidden": true, className: ["h-1.5 w-3 rounded-sm", it.cls].join(" ") }), /* @__PURE__ */ React.createElement("span", null, it.label))));
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__ */ React.createElement("g", null, /* @__PURE__ */ React.createElement(
374
- "path",
375
- {
376
- d,
377
- fill: "none",
378
- strokeWidth: "1.25",
379
- className: "stroke-p-ink-3/70",
380
- markerEnd: "url(#swarm-dep-arrow)"
381
- }
382
- ), /* @__PURE__ */ React.createElement(
383
- "circle",
384
- {
385
- cx: `${dep.fromPct}%`,
386
- cy: fromY,
387
- r: "1.6",
388
- className: "fill-p-ink-3"
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 react from 'react';
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): react.JSX.Element;
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 };