@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 { useMemo, useState } from "react";
3
4
  import {
4
5
  AlertTriangle,
@@ -85,129 +86,201 @@ function PlanTaskDetail({
85
86
  return out;
86
87
  }, [plan, task.title]);
87
88
  if (variant === "page") {
88
- return /* @__PURE__ */ React.createElement(
89
+ return /* @__PURE__ */ jsxs(
89
90
  "article",
90
91
  {
91
92
  className: [
92
93
  "flex h-full min-h-0 flex-col overflow-hidden bg-p-surface",
93
94
  className || ""
94
- ].join(" ")
95
- },
96
- /* @__PURE__ */ React.createElement(
97
- PageHeader,
98
- {
99
- status,
100
- phase: runtime?.phase ?? task.phase,
101
- priority: runtime?.priority,
102
- sideEffects: runtime?.sideEffects,
103
- L,
104
- headerTrailing
105
- }
106
- ),
107
- /* @__PURE__ */ React.createElement("div", { className: "flex min-h-0 flex-1 flex-col gap-7 overflow-y-auto px-7 py-7" }, /* @__PURE__ */ React.createElement("section", null, /* @__PURE__ */ React.createElement("h2", { className: "font-display text-[28px] font-bold leading-[1.06] tracking-[-0.02em] text-p-ink" }, task.title), task.description ? renderMarkdown ? /* @__PURE__ */ React.createElement("div", { className: "mt-3 max-w-[64ch]" }, renderMarkdown(task.description)) : /* @__PURE__ */ React.createElement("p", { className: "mt-3 max-w-[64ch] font-body text-[14.5px] leading-[1.6] text-p-ink-2 whitespace-pre-wrap" }, task.description) : null), actions ? /* @__PURE__ */ React.createElement(
108
- ActionDock,
109
- {
110
- actions,
111
- status,
112
- confirm
113
- }
114
- ) : null, /* @__PURE__ */ React.createElement("section", { className: "grid grid-cols-1 gap-px overflow-hidden rounded-xl border border-p-line bg-p-line sm:grid-cols-3" }, /* @__PURE__ */ React.createElement(PageStat, { label: "assignee" }, agent ? /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center gap-2" }, /* @__PURE__ */ React.createElement(
115
- "span",
116
- {
117
- "aria-hidden": true,
118
- className: "grid size-5 shrink-0 place-items-center rounded font-display text-[10px] font-bold text-white",
119
- style: { background: agent.color || "#999" }
120
- },
121
- agent.glyph || (agent.displayName ?? agent.name).charAt(0).toUpperCase()
122
- ), /* @__PURE__ */ React.createElement("span", { className: "text-[13.5px] font-semibold text-p-ink" }, agent.displayName ?? agent.name)) : /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[11px] uppercase tracking-[0.14em] text-p-ink-3" }, agentName ?? "\u2014")), /* @__PURE__ */ React.createElement(PageStat, { label: "phase" }, /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[11px] uppercase tracking-[0.14em] text-p-ink" }, task.phase ?? runtime?.phase ?? "execution")), /* @__PURE__ */ React.createElement(PageStat, { label: "status" }, /* @__PURE__ */ React.createElement(
123
- "span",
124
- {
125
- className: "inline-flex items-center gap-1.5 font-mono text-[11px] font-bold uppercase tracking-[0.16em]",
126
- style: { color: STATUS_HEX[status] }
127
- },
128
- /* @__PURE__ */ React.createElement(StatusIcon, { className: "size-3", "aria-hidden": true }),
129
- L.status[status]
130
- ))), dependsOn.length > 0 ? /* @__PURE__ */ React.createElement(
131
- PageRelatedSection,
132
- {
133
- title: "depends on",
134
- icon: /* @__PURE__ */ React.createElement(ArrowRight, { className: "size-2.5 rotate-180" }),
135
- items: dependsOn,
136
- runtimeByTitle,
137
- onOpen: onOpenRelated,
138
- L
139
- }
140
- ) : null, dependents.length > 0 ? /* @__PURE__ */ React.createElement(
141
- PageRelatedSection,
142
- {
143
- title: "blocks",
144
- icon: /* @__PURE__ */ React.createElement(ArrowRight, { className: "size-2.5" }),
145
- items: dependents,
146
- runtimeByTitle,
147
- onOpen: onOpenRelated,
148
- L
149
- }
150
- ) : null, !task.description && dependsOn.length === 0 && dependents.length === 0 ? /* @__PURE__ */ React.createElement("div", { className: "flex flex-col items-center gap-2 rounded-md border border-dashed border-p-line bg-p-bg p-8 text-center" }, /* @__PURE__ */ React.createElement(Flag, { className: "size-4 text-p-ink-3", "aria-hidden": true }), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.16em] text-p-ink-3" }, "no description, no dependencies")) : null)
95
+ ].join(" "),
96
+ children: [
97
+ /* @__PURE__ */ jsx(
98
+ PageHeader,
99
+ {
100
+ status,
101
+ phase: runtime?.phase ?? task.phase,
102
+ priority: runtime?.priority,
103
+ sideEffects: runtime?.sideEffects,
104
+ L,
105
+ headerTrailing
106
+ }
107
+ ),
108
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-7 overflow-y-auto px-7 py-7", children: [
109
+ /* @__PURE__ */ jsxs("section", { children: [
110
+ /* @__PURE__ */ jsx("h2", { className: "font-display text-[28px] font-bold leading-[1.06] tracking-[-0.02em] text-p-ink", children: task.title }),
111
+ task.description ? renderMarkdown ? /* @__PURE__ */ jsx("div", { className: "mt-3 max-w-[64ch]", children: renderMarkdown(task.description) }) : /* @__PURE__ */ jsx("p", { className: "mt-3 max-w-[64ch] font-body text-[14.5px] leading-[1.6] text-p-ink-2 whitespace-pre-wrap", children: task.description }) : null
112
+ ] }),
113
+ actions ? /* @__PURE__ */ jsx(
114
+ ActionDock,
115
+ {
116
+ actions,
117
+ status,
118
+ confirm
119
+ }
120
+ ) : null,
121
+ /* @__PURE__ */ jsxs("section", { className: "grid grid-cols-1 gap-px overflow-hidden rounded-xl border border-p-line bg-p-line sm:grid-cols-3", children: [
122
+ /* @__PURE__ */ jsx(PageStat, { label: "assignee", children: agent ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2", children: [
123
+ /* @__PURE__ */ jsx(
124
+ "span",
125
+ {
126
+ "aria-hidden": true,
127
+ className: "grid size-5 shrink-0 place-items-center rounded font-display text-[10px] font-bold text-white",
128
+ style: { background: agent.color || "#999" },
129
+ children: agent.glyph || (agent.displayName ?? agent.name).charAt(0).toUpperCase()
130
+ }
131
+ ),
132
+ /* @__PURE__ */ jsx("span", { className: "text-[13.5px] font-semibold text-p-ink", children: agent.displayName ?? agent.name })
133
+ ] }) : /* @__PURE__ */ jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.14em] text-p-ink-3", children: agentName ?? "\u2014" }) }),
134
+ /* @__PURE__ */ jsx(PageStat, { label: "phase", children: /* @__PURE__ */ jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.14em] text-p-ink", children: task.phase ?? runtime?.phase ?? "execution" }) }),
135
+ /* @__PURE__ */ jsx(PageStat, { label: "status", children: /* @__PURE__ */ jsxs(
136
+ "span",
137
+ {
138
+ className: "inline-flex items-center gap-1.5 font-mono text-[11px] font-bold uppercase tracking-[0.16em]",
139
+ style: { color: STATUS_HEX[status] },
140
+ children: [
141
+ /* @__PURE__ */ jsx(StatusIcon, { className: "size-3", "aria-hidden": true }),
142
+ L.status[status]
143
+ ]
144
+ }
145
+ ) })
146
+ ] }),
147
+ dependsOn.length > 0 ? /* @__PURE__ */ jsx(
148
+ PageRelatedSection,
149
+ {
150
+ title: "depends on",
151
+ icon: /* @__PURE__ */ jsx(ArrowRight, { className: "size-2.5 rotate-180" }),
152
+ items: dependsOn,
153
+ runtimeByTitle,
154
+ onOpen: onOpenRelated,
155
+ L
156
+ }
157
+ ) : null,
158
+ dependents.length > 0 ? /* @__PURE__ */ jsx(
159
+ PageRelatedSection,
160
+ {
161
+ title: "blocks",
162
+ icon: /* @__PURE__ */ jsx(ArrowRight, { className: "size-2.5" }),
163
+ items: dependents,
164
+ runtimeByTitle,
165
+ onOpen: onOpenRelated,
166
+ L
167
+ }
168
+ ) : null,
169
+ !task.description && dependsOn.length === 0 && dependents.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 rounded-md border border-dashed border-p-line bg-p-bg p-8 text-center", children: [
170
+ /* @__PURE__ */ jsx(Flag, { className: "size-4 text-p-ink-3", "aria-hidden": true }),
171
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.16em] text-p-ink-3", children: "no description, no dependencies" })
172
+ ] }) : null
173
+ ] })
174
+ ]
175
+ }
151
176
  );
152
177
  }
153
- return /* @__PURE__ */ React.createElement(
178
+ return /* @__PURE__ */ jsxs(
154
179
  "article",
155
180
  {
156
181
  className: [
157
182
  "flex h-full min-h-0 flex-col overflow-hidden bg-p-surface",
158
183
  className || ""
159
- ].join(" ")
160
- },
161
- /* @__PURE__ */ React.createElement(
162
- "header",
163
- {
164
- className: [
165
- "flex shrink-0 items-start gap-3 border-b border-p-line px-5 py-4",
166
- STATUS_BG[status]
167
- ].join(" ")
168
- },
169
- /* @__PURE__ */ React.createElement(
170
- "span",
171
- {
172
- className: [
173
- "mt-0.5 grid size-7 shrink-0 place-items-center rounded-full bg-p-surface ring-1",
174
- tone,
175
- status === "running" ? "ring-p-accent/30" : "ring-p-line"
176
- ].join(" ")
177
- },
178
- /* @__PURE__ */ React.createElement(StatusIcon, { className: "size-3.5", "aria-hidden": true })
179
- ),
180
- /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React.createElement("div", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.22em] text-p-ink-3" }, L.task, " \xB7", " ", /* @__PURE__ */ React.createElement("span", { className: tone }, L.status[status]), runtime?.phase && runtime.phase !== "execution" ? /* @__PURE__ */ React.createElement("span", null, " \xB7 ", runtime.phase) : null), /* @__PURE__ */ React.createElement("h3", { className: "mt-1 font-display text-[18px] font-bold leading-tight tracking-[-0.01em] text-p-ink" }, task.title)),
181
- headerTrailing
182
- ),
183
- /* @__PURE__ */ React.createElement("div", { className: "flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-5 py-4" }, task.description ? /* @__PURE__ */ React.createElement("section", null, /* @__PURE__ */ React.createElement(Kicker, null, "brief"), renderMarkdown ? /* @__PURE__ */ React.createElement("div", { className: "mt-1" }, renderMarkdown(task.description)) : /* @__PURE__ */ React.createElement("p", { className: "mt-1 font-body text-[13px] leading-[1.55] text-p-ink-2" }, task.description)) : null, /* @__PURE__ */ React.createElement("section", { className: "grid grid-cols-2 gap-px overflow-hidden rounded-md border border-p-line bg-p-line text-[11px]" }, /* @__PURE__ */ React.createElement(Cell, { label: "agent" }, agent ? /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center gap-1.5" }, /* @__PURE__ */ React.createElement(
184
- "span",
185
- {
186
- "aria-hidden": true,
187
- className: "grid size-4 shrink-0 place-items-center rounded font-display text-[9px] font-bold text-white",
188
- style: { background: agent.color || "#999" }
189
- },
190
- agent.glyph || (agent.displayName ?? agent.name).charAt(0).toUpperCase()
191
- ), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10.5px] font-bold uppercase tracking-[0.14em] text-p-ink" }, agent.displayName ?? agent.name)) : /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.14em] text-p-ink-3" }, agentName ?? "\u2014")), /* @__PURE__ */ React.createElement(Cell, { label: "phase" }, /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.14em] text-p-ink" }, task.phase ?? runtime?.phase ?? "execution")), typeof runtime?.priority === "number" ? /* @__PURE__ */ React.createElement(Cell, { label: "priority" }, /* @__PURE__ */ React.createElement("span", { className: "font-display text-[14px] font-bold tabular-nums text-p-ink" }, runtime.priority, "\xD7")) : null, runtime?.sideEffects ? /* @__PURE__ */ React.createElement(Cell, { label: "warnings" }, /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center gap-1 text-[#E63946]" }, /* @__PURE__ */ React.createElement(AlertTriangle, { className: "size-3", "aria-hidden": true }), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.14em]" }, "side effects"))) : null), dependsOn.length > 0 ? /* @__PURE__ */ React.createElement("section", null, /* @__PURE__ */ React.createElement(Kicker, { icon: /* @__PURE__ */ React.createElement(ArrowRight, { className: "size-2.5 rotate-180" }) }, "depends on"), /* @__PURE__ */ React.createElement("ol", { className: "mt-1 flex flex-col gap-0.5" }, dependsOn.map((title) => /* @__PURE__ */ React.createElement(
192
- RelatedRow,
193
- {
194
- key: title,
195
- title,
196
- runtime: runtimeByTitle?.get(title),
197
- onOpen: onOpenRelated,
198
- L
199
- }
200
- )))) : null, dependents.length > 0 ? /* @__PURE__ */ React.createElement("section", null, /* @__PURE__ */ React.createElement(Kicker, { icon: /* @__PURE__ */ React.createElement(ArrowRight, { className: "size-2.5" }) }, "blocks"), /* @__PURE__ */ React.createElement("ol", { className: "mt-1 flex flex-col gap-0.5" }, dependents.map((title) => /* @__PURE__ */ React.createElement(
201
- RelatedRow,
202
- {
203
- key: title,
204
- title,
205
- runtime: runtimeByTitle?.get(title),
206
- onOpen: onOpenRelated,
207
- L
208
- }
209
- )))) : null, !task.description && dependsOn.length === 0 && dependents.length === 0 ? /* @__PURE__ */ React.createElement("section", { className: "flex flex-col items-center gap-2 rounded-md border border-dashed border-p-line bg-p-bg p-6 text-center" }, /* @__PURE__ */ React.createElement(Flag, { className: "size-4 text-p-ink-3", "aria-hidden": true }), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.16em] text-p-ink-3" }, "no description, no dependencies")) : null),
210
- actions || actionsSlot ? /* @__PURE__ */ React.createElement("footer", { className: "flex shrink-0 flex-wrap items-center justify-end gap-1.5 border-t border-p-line bg-p-bg/50 px-5 py-3" }, actions ? /* @__PURE__ */ React.createElement(ActionDock, { actions, status, confirm }) : actionsSlot) : null
184
+ ].join(" "),
185
+ children: [
186
+ /* @__PURE__ */ jsxs(
187
+ "header",
188
+ {
189
+ className: [
190
+ "flex shrink-0 items-start gap-3 border-b border-p-line px-5 py-4",
191
+ STATUS_BG[status]
192
+ ].join(" "),
193
+ children: [
194
+ /* @__PURE__ */ jsx(
195
+ "span",
196
+ {
197
+ className: [
198
+ "mt-0.5 grid size-7 shrink-0 place-items-center rounded-full bg-p-surface ring-1",
199
+ tone,
200
+ status === "running" ? "ring-p-accent/30" : "ring-p-line"
201
+ ].join(" "),
202
+ children: /* @__PURE__ */ jsx(StatusIcon, { className: "size-3.5", "aria-hidden": true })
203
+ }
204
+ ),
205
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
206
+ /* @__PURE__ */ jsxs("div", { className: "font-mono text-[10px] font-bold uppercase tracking-[0.22em] text-p-ink-3", children: [
207
+ L.task,
208
+ " \xB7",
209
+ " ",
210
+ /* @__PURE__ */ jsx("span", { className: tone, children: L.status[status] }),
211
+ runtime?.phase && runtime.phase !== "execution" ? /* @__PURE__ */ jsxs("span", { children: [
212
+ " \xB7 ",
213
+ runtime.phase
214
+ ] }) : null
215
+ ] }),
216
+ /* @__PURE__ */ jsx("h3", { className: "mt-1 font-display text-[18px] font-bold leading-tight tracking-[-0.01em] text-p-ink", children: task.title })
217
+ ] }),
218
+ headerTrailing
219
+ ]
220
+ }
221
+ ),
222
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-5 py-4", children: [
223
+ task.description ? /* @__PURE__ */ jsxs("section", { children: [
224
+ /* @__PURE__ */ jsx(Kicker, { children: "brief" }),
225
+ renderMarkdown ? /* @__PURE__ */ jsx("div", { className: "mt-1", children: renderMarkdown(task.description) }) : /* @__PURE__ */ jsx("p", { className: "mt-1 font-body text-[13px] leading-[1.55] text-p-ink-2", children: task.description })
226
+ ] }) : null,
227
+ /* @__PURE__ */ jsxs("section", { className: "grid grid-cols-2 gap-px overflow-hidden rounded-md border border-p-line bg-p-line text-[11px]", children: [
228
+ /* @__PURE__ */ jsx(Cell, { label: "agent", children: agent ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
229
+ /* @__PURE__ */ jsx(
230
+ "span",
231
+ {
232
+ "aria-hidden": true,
233
+ className: "grid size-4 shrink-0 place-items-center rounded font-display text-[9px] font-bold text-white",
234
+ style: { background: agent.color || "#999" },
235
+ children: agent.glyph || (agent.displayName ?? agent.name).charAt(0).toUpperCase()
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10.5px] font-bold uppercase tracking-[0.14em] text-p-ink", children: agent.displayName ?? agent.name })
239
+ ] }) : /* @__PURE__ */ jsx("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.14em] text-p-ink-3", children: agentName ?? "\u2014" }) }),
240
+ /* @__PURE__ */ jsx(Cell, { label: "phase", children: /* @__PURE__ */ jsx("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.14em] text-p-ink", children: task.phase ?? runtime?.phase ?? "execution" }) }),
241
+ typeof runtime?.priority === "number" ? /* @__PURE__ */ jsx(Cell, { label: "priority", children: /* @__PURE__ */ jsxs("span", { className: "font-display text-[14px] font-bold tabular-nums text-p-ink", children: [
242
+ runtime.priority,
243
+ "\xD7"
244
+ ] }) }) : null,
245
+ runtime?.sideEffects ? /* @__PURE__ */ jsx(Cell, { label: "warnings", children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-[#E63946]", children: [
246
+ /* @__PURE__ */ jsx(AlertTriangle, { className: "size-3", "aria-hidden": true }),
247
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.14em]", children: "side effects" })
248
+ ] }) }) : null
249
+ ] }),
250
+ dependsOn.length > 0 ? /* @__PURE__ */ jsxs("section", { children: [
251
+ /* @__PURE__ */ jsx(Kicker, { icon: /* @__PURE__ */ jsx(ArrowRight, { className: "size-2.5 rotate-180" }), children: "depends on" }),
252
+ /* @__PURE__ */ jsx("ol", { className: "mt-1 flex flex-col gap-0.5", children: dependsOn.map((title) => /* @__PURE__ */ jsx(
253
+ RelatedRow,
254
+ {
255
+ title,
256
+ runtime: runtimeByTitle?.get(title),
257
+ onOpen: onOpenRelated,
258
+ L
259
+ },
260
+ title
261
+ )) })
262
+ ] }) : null,
263
+ dependents.length > 0 ? /* @__PURE__ */ jsxs("section", { children: [
264
+ /* @__PURE__ */ jsx(Kicker, { icon: /* @__PURE__ */ jsx(ArrowRight, { className: "size-2.5" }), children: "blocks" }),
265
+ /* @__PURE__ */ jsx("ol", { className: "mt-1 flex flex-col gap-0.5", children: dependents.map((title) => /* @__PURE__ */ jsx(
266
+ RelatedRow,
267
+ {
268
+ title,
269
+ runtime: runtimeByTitle?.get(title),
270
+ onOpen: onOpenRelated,
271
+ L
272
+ },
273
+ title
274
+ )) })
275
+ ] }) : null,
276
+ !task.description && dependsOn.length === 0 && dependents.length === 0 ? /* @__PURE__ */ jsxs("section", { className: "flex flex-col items-center gap-2 rounded-md border border-dashed border-p-line bg-p-bg p-6 text-center", children: [
277
+ /* @__PURE__ */ jsx(Flag, { className: "size-4 text-p-ink-3", "aria-hidden": true }),
278
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[10.5px] uppercase tracking-[0.16em] text-p-ink-3", children: "no description, no dependencies" })
279
+ ] }) : null
280
+ ] }),
281
+ actions || actionsSlot ? /* @__PURE__ */ jsx("footer", { className: "flex shrink-0 flex-wrap items-center justify-end gap-1.5 border-t border-p-line bg-p-bg/50 px-5 py-3", children: actions ? /* @__PURE__ */ jsx(ActionDock, { actions, status, confirm }) : actionsSlot }) : null
282
+ ]
283
+ }
211
284
  );
212
285
  }
213
286
  function PageHeader({
@@ -220,26 +293,38 @@ function PageHeader({
220
293
  }) {
221
294
  const StatusIcon = STATUS_ICON[status];
222
295
  const color = STATUS_HEX[status];
223
- return /* @__PURE__ */ React.createElement("header", { className: "flex shrink-0 items-start justify-between gap-3 border-b border-p-line px-7 py-5" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-center gap-1.5" }, /* @__PURE__ */ React.createElement(
224
- "span",
225
- {
226
- className: "inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-[0.18em]",
227
- style: {
228
- background: `color-mix(in srgb, ${color} 14%, transparent)`,
229
- color
230
- }
231
- },
232
- /* @__PURE__ */ React.createElement(StatusIcon, { className: "size-2.5" }),
233
- L.status[status]
234
- ), phase && phase !== "execution" ? /* @__PURE__ */ React.createElement(PageChip, { tone: "blue", icon: /* @__PURE__ */ React.createElement(RotateCcw, { className: "size-2.5" }) }, phase) : null, typeof priority === "number" && priority !== 1 ? /* @__PURE__ */ React.createElement(
235
- PageChip,
236
- {
237
- tone: priority > 1 ? "accent" : "neutral",
238
- icon: /* @__PURE__ */ React.createElement(Zap, { className: "size-2.5" })
239
- },
240
- priority,
241
- "\xD7"
242
- ) : null, sideEffects ? /* @__PURE__ */ React.createElement(PageChip, { tone: "red", icon: /* @__PURE__ */ React.createElement(AlertTriangle, { className: "size-2.5" }) }, "side effects") : null), headerTrailing ? /* @__PURE__ */ React.createElement("div", { className: "shrink-0" }, headerTrailing) : null);
296
+ return /* @__PURE__ */ jsxs("header", { className: "flex shrink-0 items-start justify-between gap-3 border-b border-p-line px-7 py-5", children: [
297
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
298
+ /* @__PURE__ */ jsxs(
299
+ "span",
300
+ {
301
+ className: "inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-[0.18em]",
302
+ style: {
303
+ background: `color-mix(in srgb, ${color} 14%, transparent)`,
304
+ color
305
+ },
306
+ children: [
307
+ /* @__PURE__ */ jsx(StatusIcon, { className: "size-2.5" }),
308
+ L.status[status]
309
+ ]
310
+ }
311
+ ),
312
+ phase && phase !== "execution" ? /* @__PURE__ */ jsx(PageChip, { tone: "blue", icon: /* @__PURE__ */ jsx(RotateCcw, { className: "size-2.5" }), children: phase }) : null,
313
+ typeof priority === "number" && priority !== 1 ? /* @__PURE__ */ jsxs(
314
+ PageChip,
315
+ {
316
+ tone: priority > 1 ? "accent" : "neutral",
317
+ icon: /* @__PURE__ */ jsx(Zap, { className: "size-2.5" }),
318
+ children: [
319
+ priority,
320
+ "\xD7"
321
+ ]
322
+ }
323
+ ) : null,
324
+ sideEffects ? /* @__PURE__ */ jsx(PageChip, { tone: "red", icon: /* @__PURE__ */ jsx(AlertTriangle, { className: "size-2.5" }), children: "side effects" }) : null
325
+ ] }),
326
+ headerTrailing ? /* @__PURE__ */ jsx("div", { className: "shrink-0", children: headerTrailing }) : null
327
+ ] });
243
328
  }
244
329
  function PageChip({
245
330
  tone,
@@ -253,21 +338,26 @@ function PageChip({
253
338
  red: { bg: "#FEF2F2", fg: "#E63946" }
254
339
  };
255
340
  const c = palette[tone];
256
- return /* @__PURE__ */ React.createElement(
341
+ return /* @__PURE__ */ jsxs(
257
342
  "span",
258
343
  {
259
344
  className: "inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 font-mono text-[10px] font-bold uppercase tracking-[0.18em]",
260
- style: { background: c.bg, color: c.fg }
261
- },
262
- icon,
263
- children
345
+ style: { background: c.bg, color: c.fg },
346
+ children: [
347
+ icon,
348
+ children
349
+ ]
350
+ }
264
351
  );
265
352
  }
266
353
  function PageStat({
267
354
  label,
268
355
  children
269
356
  }) {
270
- return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-1.5 bg-p-surface px-4 py-3" }, /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[9.5px] font-bold uppercase tracking-[0.22em] text-p-ink-3" }, label), /* @__PURE__ */ React.createElement("span", { className: "min-h-[20px]" }, children));
357
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 bg-p-surface px-4 py-3", children: [
358
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[9.5px] font-bold uppercase tracking-[0.22em] text-p-ink-3", children: label }),
359
+ /* @__PURE__ */ jsx("span", { className: "min-h-[20px]", children })
360
+ ] });
271
361
  }
272
362
  function PageRelatedSection({
273
363
  title,
@@ -277,16 +367,26 @@ function PageRelatedSection({
277
367
  onOpen,
278
368
  L
279
369
  }) {
280
- return /* @__PURE__ */ React.createElement("section", null, /* @__PURE__ */ React.createElement("div", { className: "mb-2 flex items-baseline gap-2" }, /* @__PURE__ */ React.createElement(Kicker, { icon }, title), /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-p-ink-3/70 tabular-nums" }, "\xB7 ", items.length), /* @__PURE__ */ React.createElement("span", { className: "ml-2 h-px flex-1 bg-p-line" })), /* @__PURE__ */ React.createElement("ol", { className: "flex flex-col gap-1" }, items.map((t) => /* @__PURE__ */ React.createElement(
281
- RelatedRow,
282
- {
283
- key: t,
284
- title: t,
285
- runtime: runtimeByTitle?.get(t),
286
- onOpen,
287
- L
288
- }
289
- ))));
370
+ return /* @__PURE__ */ jsxs("section", { children: [
371
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-baseline gap-2", children: [
372
+ /* @__PURE__ */ jsx(Kicker, { icon, children: title }),
373
+ /* @__PURE__ */ jsxs("span", { className: "font-mono text-[10px] uppercase tracking-[0.18em] text-p-ink-3/70 tabular-nums", children: [
374
+ "\xB7 ",
375
+ items.length
376
+ ] }),
377
+ /* @__PURE__ */ jsx("span", { className: "ml-2 h-px flex-1 bg-p-line" })
378
+ ] }),
379
+ /* @__PURE__ */ jsx("ol", { className: "flex flex-col gap-1", children: items.map((t) => /* @__PURE__ */ jsx(
380
+ RelatedRow,
381
+ {
382
+ title: t,
383
+ runtime: runtimeByTitle?.get(t),
384
+ onOpen,
385
+ L
386
+ },
387
+ t
388
+ )) })
389
+ ] });
290
390
  }
291
391
  const ACTION_DESCRIPTORS = [
292
392
  {
@@ -367,26 +467,28 @@ function ActionDock({
367
467
  return isActionApplicable(desc.key, status);
368
468
  });
369
469
  if (visible.length === 0) return null;
370
- return /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-center gap-1.5" }, visible.map((desc) => {
470
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-1.5", children: visible.map((desc) => {
371
471
  const cfg = actions[desc.key];
372
472
  const Icon = desc.icon;
373
473
  const isPending = pending === desc.key;
374
- return /* @__PURE__ */ React.createElement(
474
+ return /* @__PURE__ */ jsxs(
375
475
  "button",
376
476
  {
377
- key: desc.key,
378
477
  type: "button",
379
478
  onClick: () => handle(desc.key, desc, cfg),
380
479
  disabled: cfg.disabled || isPending,
381
480
  className: [
382
481
  "inline-flex h-8 items-center gap-1.5 rounded-md border px-2.5 font-mono text-[11px] font-bold uppercase tracking-[0.14em] transition-colors cursor-pointer disabled:cursor-not-allowed disabled:opacity-50",
383
482
  desc.destructiveButton ? "border-[#FECACA] bg-p-surface text-[#E63946] hover:bg-[#FEF2F2]" : "border-p-line bg-p-surface text-p-ink-2 hover:border-p-ink-3 hover:bg-p-warm hover:text-p-ink"
384
- ].join(" ")
483
+ ].join(" "),
484
+ children: [
485
+ /* @__PURE__ */ jsx(Icon, { className: "size-3", "aria-hidden": true }),
486
+ desc.label
487
+ ]
385
488
  },
386
- /* @__PURE__ */ React.createElement(Icon, { className: "size-3", "aria-hidden": true }),
387
- desc.label
489
+ desc.key
388
490
  );
389
- }));
491
+ }) });
390
492
  }
391
493
  function isActionApplicable(key, status) {
392
494
  switch (key) {
@@ -404,10 +506,16 @@ function Kicker({
404
506
  children,
405
507
  icon
406
508
  }) {
407
- return /* @__PURE__ */ React.createElement("span", { className: "inline-flex items-center gap-1.5 font-mono text-[10px] font-bold uppercase tracking-[0.22em] text-p-ink-3" }, icon, children);
509
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 font-mono text-[10px] font-bold uppercase tracking-[0.22em] text-p-ink-3", children: [
510
+ icon,
511
+ children
512
+ ] });
408
513
  }
409
514
  function Cell({ label, children }) {
410
- return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-1 bg-p-surface px-3 py-2" }, /* @__PURE__ */ React.createElement("span", { className: "font-mono text-[9.5px] font-bold uppercase tracking-[0.18em] text-p-ink-3" }, label), /* @__PURE__ */ React.createElement("span", { className: "min-h-[18px]" }, children));
515
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 bg-p-surface px-3 py-2", children: [
516
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-[9.5px] font-bold uppercase tracking-[0.18em] text-p-ink-3", children: label }),
517
+ /* @__PURE__ */ jsx("span", { className: "min-h-[18px]", children })
518
+ ] });
411
519
  }
412
520
  function RelatedRow({
413
521
  title,
@@ -420,7 +528,7 @@ function RelatedRow({
420
528
  const tone = STATUS_TONE[status];
421
529
  const interactive = !!onOpen;
422
530
  const Wrapper = interactive ? "button" : "div";
423
- return /* @__PURE__ */ React.createElement(
531
+ return /* @__PURE__ */ jsxs(
424
532
  Wrapper,
425
533
  {
426
534
  type: interactive ? "button" : void 0,
@@ -428,21 +536,23 @@ function RelatedRow({
428
536
  className: [
429
537
  "group flex items-center gap-2 rounded-md border border-p-line bg-p-surface px-2.5 py-1.5 text-left transition-colors",
430
538
  interactive ? "cursor-pointer hover:border-p-ink-3 hover:bg-p-warm/40" : ""
431
- ].join(" ")
432
- },
433
- /* @__PURE__ */ React.createElement(Icon, { className: ["size-3 shrink-0", tone].join(" "), "aria-hidden": true }),
434
- /* @__PURE__ */ React.createElement("span", { className: "min-w-0 flex-1 truncate font-display text-[12.5px] font-semibold text-p-ink" }, title),
435
- /* @__PURE__ */ React.createElement(
436
- "span",
437
- {
438
- className: [
439
- "shrink-0 font-mono text-[9.5px] font-bold uppercase tracking-[0.16em]",
440
- tone
441
- ].join(" ")
442
- },
443
- L.status[status]
444
- ),
445
- interactive ? /* @__PURE__ */ React.createElement(Clock, { className: "size-2.5 shrink-0 text-p-ink-3 opacity-0 transition-opacity group-hover:opacity-100" }) : null
539
+ ].join(" "),
540
+ children: [
541
+ /* @__PURE__ */ jsx(Icon, { className: ["size-3 shrink-0", tone].join(" "), "aria-hidden": true }),
542
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-display text-[12.5px] font-semibold text-p-ink", children: title }),
543
+ /* @__PURE__ */ jsx(
544
+ "span",
545
+ {
546
+ className: [
547
+ "shrink-0 font-mono text-[9.5px] font-bold uppercase tracking-[0.16em]",
548
+ tone
549
+ ].join(" "),
550
+ children: L.status[status]
551
+ }
552
+ ),
553
+ interactive ? /* @__PURE__ */ jsx(Clock, { className: "size-2.5 shrink-0 text-p-ink-3 opacity-0 transition-opacity group-hover:opacity-100" }) : null
554
+ ]
555
+ }
446
556
  );
447
557
  }
448
558
  export {
@@ -1,5 +1,6 @@
1
- import * as react from 'react';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { RunKanbanLaneSummary } from './run-kanban.js';
3
+ import 'react';
3
4
  import './plan-types.js';
4
5
  import './types.js';
5
6
 
@@ -19,6 +20,6 @@ interface RunKanbanFilterMenuProps {
19
20
  * (Linear's pattern). The trigger shows `visible / total` as a
20
21
  * tabular badge and the menu lists every lane with a checkmark.
21
22
  */
22
- declare function RunKanbanFilterMenu({ lanes, value, onChange, hideEmpty, triggerLabel, className, }: RunKanbanFilterMenuProps): react.JSX.Element;
23
+ declare function RunKanbanFilterMenu({ lanes, value, onChange, hideEmpty, triggerLabel, className, }: RunKanbanFilterMenuProps): react_jsx_runtime.JSX.Element;
23
24
 
24
25
  export { RunKanbanFilterMenu, type RunKanbanFilterMenuProps };