@agimon-ai/po-workflow 0.0.0-alpha.2 → 0.0.0-alpha.21
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/LICENSE +149 -29
- package/README.md +2 -4
- package/dist/apiContracts.cjs +6 -2
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.d.mts.map +1 -1
- package/dist/apiContracts.mjs +6 -2
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/extensions/native.mjs +25 -10
- package/dist/extensions/native.mjs.map +1 -1
- package/dist/extensions/server.cjs +2833 -2431
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +2 -2
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +2792 -2389
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +168 -163
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +1 -2
- package/llms.txt +2 -2
- package/package.json +24 -23
- package/src/types/webWorkflows.ts +2 -0
- package/LICENSE.web +0 -29
package/dist/extensions/web.mjs
CHANGED
|
@@ -129,7 +129,7 @@ function formatRunDuration(elapsedMs) {
|
|
|
129
129
|
//#region src/extensions/workspaces/sessions/(frontend)/_lib/workflowActivity.ts
|
|
130
130
|
const PAUSED_STATES = /* @__PURE__ */ new Set(["paused", "pause_requested"]);
|
|
131
131
|
function workflowRunIdentity(run) {
|
|
132
|
-
return `${run.workspace}/${run.runKey}`;
|
|
132
|
+
return `${run.workspace}/${run.routeKey ?? run.runKey}`;
|
|
133
133
|
}
|
|
134
134
|
/** Whether the session runs this workflow itself; a record from an older hub names no owner and means the viewer. */
|
|
135
135
|
function ownsRun(run, sessionId) {
|
|
@@ -276,16 +276,16 @@ const TONE_DOT = {
|
|
|
276
276
|
skipped: "muted"
|
|
277
277
|
};
|
|
278
278
|
const TONE_DETAIL = {
|
|
279
|
-
running: "text-
|
|
280
|
-
paused: "text-
|
|
281
|
-
failed: "text-
|
|
282
|
-
done: "text-
|
|
283
|
-
skipped: "text-
|
|
279
|
+
running: "text-po-dim",
|
|
280
|
+
paused: "text-po-yellow",
|
|
281
|
+
failed: "text-po-red",
|
|
282
|
+
done: "text-po-dim",
|
|
283
|
+
skipped: "text-po-dim"
|
|
284
284
|
};
|
|
285
285
|
const GROUP_LABEL = {
|
|
286
|
-
running: "text-
|
|
287
|
-
failed: "text-
|
|
288
|
-
successful: "text-
|
|
286
|
+
running: "text-po-yellow",
|
|
287
|
+
failed: "text-po-red",
|
|
288
|
+
successful: "text-po-green"
|
|
289
289
|
};
|
|
290
290
|
/**
|
|
291
291
|
* The workflows group's body in the activity dock: every run this session
|
|
@@ -308,13 +308,13 @@ function WorkflowsActivitySection({ sessionId, openSession }) {
|
|
|
308
308
|
className: "flex flex-wrap items-center gap-x-4 gap-y-1",
|
|
309
309
|
children: [/* @__PURE__ */ jsx("p", {
|
|
310
310
|
"data-testid": "activity-summary-workflows",
|
|
311
|
-
className: "text-sm text-
|
|
311
|
+
className: "text-sm text-po-dim",
|
|
312
312
|
children: "Idle"
|
|
313
313
|
}), /* @__PURE__ */ jsxs(Button, {
|
|
314
314
|
variant: "link",
|
|
315
315
|
size: "sm",
|
|
316
316
|
"data-testid": "activity-workflow-launch",
|
|
317
|
-
className: "h-auto gap-1 px-0 text-
|
|
317
|
+
className: "h-auto gap-1 px-0 text-po-green",
|
|
318
318
|
onClick: () => {
|
|
319
319
|
if (sessionId === null) return;
|
|
320
320
|
openCatalog(sessionId);
|
|
@@ -341,7 +341,7 @@ function WorkflowsActivitySection({ sessionId, openSession }) {
|
|
|
341
341
|
}
|
|
342
342
|
if (sessionId !== null) focusRun(sessionId, row.identity);
|
|
343
343
|
},
|
|
344
|
-
className: "min-w-0 gap-0.5 rounded-md px-1 py-1 hover:bg-
|
|
344
|
+
className: "min-w-0 gap-0.5 rounded-md px-1 py-1 hover:bg-po-panel",
|
|
345
345
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
346
346
|
className: "flex min-w-0 items-center gap-1.5",
|
|
347
347
|
children: [
|
|
@@ -350,11 +350,11 @@ function WorkflowsActivitySection({ sessionId, openSession }) {
|
|
|
350
350
|
pulse: row.tone === "running"
|
|
351
351
|
}),
|
|
352
352
|
/* @__PURE__ */ jsx("span", {
|
|
353
|
-
className: `min-w-0 flex-1 truncate text-base font-semibold ${row.tone === "running" || row.tone === "paused" ? "text-
|
|
353
|
+
className: `min-w-0 flex-1 truncate text-base font-semibold ${row.tone === "running" || row.tone === "paused" ? "text-po-hi" : "text-po-dim"}`,
|
|
354
354
|
children: row.name
|
|
355
355
|
}),
|
|
356
356
|
/* @__PURE__ */ jsx("span", {
|
|
357
|
-
className: "shrink-0 text-sm text-
|
|
357
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
358
358
|
children: row.elapsed
|
|
359
359
|
})
|
|
360
360
|
]
|
|
@@ -381,15 +381,15 @@ function WorkflowsActivitySection({ sessionId, openSession }) {
|
|
|
381
381
|
...current,
|
|
382
382
|
[group.name]: !open
|
|
383
383
|
})),
|
|
384
|
-
className: "justify-start gap-1.5 rounded-md px-1 py-0.5 hover:bg-
|
|
384
|
+
className: "justify-start gap-1.5 rounded-md px-1 py-0.5 hover:bg-po-panel",
|
|
385
385
|
children: [
|
|
386
|
-
open ? /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-2.5 w-2.5 text-
|
|
386
|
+
open ? /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-2.5 w-2.5 text-po-faint" }) : /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-2.5 w-2.5 text-po-faint" }),
|
|
387
387
|
/* @__PURE__ */ jsx("span", {
|
|
388
388
|
className: `inline-block text-sm font-semibold first-letter:uppercase ${GROUP_LABEL[group.name]}`,
|
|
389
389
|
children: group.name
|
|
390
390
|
}),
|
|
391
391
|
/* @__PURE__ */ jsx("span", {
|
|
392
|
-
className: "text-2xs text-
|
|
392
|
+
className: "text-2xs text-po-faint",
|
|
393
393
|
children: group.rows.length
|
|
394
394
|
})
|
|
395
395
|
]
|
|
@@ -397,7 +397,7 @@ function WorkflowsActivitySection({ sessionId, openSession }) {
|
|
|
397
397
|
className: "flex flex-col gap-0.5 pl-2",
|
|
398
398
|
children: group.rows.map((row) => /* @__PURE__ */ jsx(RunRow, { row }, row.identity))
|
|
399
399
|
}) : /* @__PURE__ */ jsxs("span", {
|
|
400
|
-
className: "truncate pl-5 text-sm text-
|
|
400
|
+
className: "truncate pl-5 text-sm text-po-dim",
|
|
401
401
|
children: [group.rows.slice(0, 2).map((row) => row.name).join(", "), group.rows.length > 2 ? `, and ${group.rows.length - 2} more` : ""]
|
|
402
402
|
})]
|
|
403
403
|
}, group.name);
|
|
@@ -948,15 +948,15 @@ function WorkflowToolMessage({ toolName, args, result, running, isError }) {
|
|
|
948
948
|
className: "flex min-w-0 flex-1 items-center gap-2",
|
|
949
949
|
children: [
|
|
950
950
|
/* @__PURE__ */ jsx("span", {
|
|
951
|
-
className: "font-semibold text-
|
|
951
|
+
className: "font-semibold text-po-hi",
|
|
952
952
|
children: summary.action
|
|
953
953
|
}),
|
|
954
954
|
summary.target ? /* @__PURE__ */ jsx("span", {
|
|
955
|
-
className: "min-w-0 truncate text-
|
|
955
|
+
className: "min-w-0 truncate text-po-dim",
|
|
956
956
|
children: summary.target
|
|
957
957
|
}) : null,
|
|
958
958
|
summary.metadata.map((value) => /* @__PURE__ */ jsxs("span", {
|
|
959
|
-
className: "shrink-0 text-
|
|
959
|
+
className: "shrink-0 text-po-dim",
|
|
960
960
|
children: ["· ", value]
|
|
961
961
|
}, value))
|
|
962
962
|
]
|
|
@@ -1020,7 +1020,7 @@ var _lib_default = {
|
|
|
1020
1020
|
message: WorkflowToolMessage
|
|
1021
1021
|
}],
|
|
1022
1022
|
leaderBindings: [{
|
|
1023
|
-
id: "
|
|
1023
|
+
id: "po-workflow.catalog",
|
|
1024
1024
|
path: [WORKFLOWS_GROUP, {
|
|
1025
1025
|
key: "l",
|
|
1026
1026
|
label: "launch",
|
|
@@ -1030,7 +1030,7 @@ var _lib_default = {
|
|
|
1030
1030
|
if (context.sessionId !== null) openCatalog(context.sessionId);
|
|
1031
1031
|
}
|
|
1032
1032
|
}, {
|
|
1033
|
-
id: "
|
|
1033
|
+
id: "po-workflow.toggle",
|
|
1034
1034
|
path: [WORKFLOWS_GROUP, {
|
|
1035
1035
|
key: "e",
|
|
1036
1036
|
label: "toggle",
|
|
@@ -1418,19 +1418,19 @@ function formatWhen(iso) {
|
|
|
1418
1418
|
const STATE_GLYPH = {
|
|
1419
1419
|
written: {
|
|
1420
1420
|
glyph: "✓",
|
|
1421
|
-
className: "text-
|
|
1421
|
+
className: "text-po-green"
|
|
1422
1422
|
},
|
|
1423
1423
|
empty: {
|
|
1424
1424
|
glyph: "○",
|
|
1425
|
-
className: "text-
|
|
1425
|
+
className: "text-po-yellow"
|
|
1426
1426
|
},
|
|
1427
1427
|
pending: {
|
|
1428
1428
|
glyph: "○",
|
|
1429
|
-
className: "text-
|
|
1429
|
+
className: "text-po-faint"
|
|
1430
1430
|
},
|
|
1431
1431
|
unreadable: {
|
|
1432
1432
|
glyph: "!",
|
|
1433
|
-
className: "text-
|
|
1433
|
+
className: "text-po-red"
|
|
1434
1434
|
}
|
|
1435
1435
|
};
|
|
1436
1436
|
function parseDelimited(text, delimiter) {
|
|
@@ -1467,13 +1467,13 @@ function DelimitedPreview({ text, delimiter }) {
|
|
|
1467
1467
|
"data-testid": "artifact-table",
|
|
1468
1468
|
className: "min-w-full border-collapse font-mono text-sm",
|
|
1469
1469
|
children: [/* @__PURE__ */ jsx("thead", {
|
|
1470
|
-
className: "sticky top-0 bg-
|
|
1470
|
+
className: "sticky top-0 bg-po-panel text-po-hi",
|
|
1471
1471
|
children: /* @__PURE__ */ jsx("tr", { children: head.map((cell, index) => /* @__PURE__ */ jsx("th", {
|
|
1472
|
-
className: "border border-
|
|
1472
|
+
className: "border border-po-border px-2 py-1.5 text-left font-semibold",
|
|
1473
1473
|
children: cell
|
|
1474
1474
|
}, index)) })
|
|
1475
1475
|
}), /* @__PURE__ */ jsx("tbody", { children: body.map((cells, rowIndex) => /* @__PURE__ */ jsx("tr", { children: cells.map((cell, cellIndex) => /* @__PURE__ */ jsx("td", {
|
|
1476
|
-
className: "border border-
|
|
1476
|
+
className: "border border-po-border px-2 py-1 align-top text-po-text",
|
|
1477
1477
|
children: cell
|
|
1478
1478
|
}, cellIndex)) }, rowIndex)) })]
|
|
1479
1479
|
})
|
|
@@ -1525,11 +1525,11 @@ function ArtifactPreview({ content, rawUrl, raw }) {
|
|
|
1525
1525
|
});
|
|
1526
1526
|
if (mimeType === "text/markdown") return raw ? /* @__PURE__ */ jsx("pre", {
|
|
1527
1527
|
"data-testid": "artifact-raw",
|
|
1528
|
-
className: "whitespace-pre-wrap break-words font-mono text-sm leading-snug text-
|
|
1528
|
+
className: "whitespace-pre-wrap break-words font-mono text-sm leading-snug text-po-text",
|
|
1529
1529
|
children: text
|
|
1530
1530
|
}) : /* @__PURE__ */ jsx("div", {
|
|
1531
1531
|
"data-testid": "artifact-markdown",
|
|
1532
|
-
className: "max-w-5xl text-base text-
|
|
1532
|
+
className: "max-w-5xl text-base text-po-text",
|
|
1533
1533
|
children: /* @__PURE__ */ jsx(Markdown, { text })
|
|
1534
1534
|
});
|
|
1535
1535
|
if (mimeType === "application/json") {
|
|
@@ -1538,7 +1538,7 @@ function ArtifactPreview({ content, rawUrl, raw }) {
|
|
|
1538
1538
|
formatted = JSON.stringify(JSON.parse(text), null, 2);
|
|
1539
1539
|
} catch {}
|
|
1540
1540
|
return /* @__PURE__ */ jsx("pre", {
|
|
1541
|
-
className: "whitespace-pre-wrap break-words font-mono text-sm leading-snug text-
|
|
1541
|
+
className: "whitespace-pre-wrap break-words font-mono text-sm leading-snug text-po-text",
|
|
1542
1542
|
children: formatted
|
|
1543
1543
|
});
|
|
1544
1544
|
}
|
|
@@ -1584,7 +1584,7 @@ function ArtifactPreview({ content, rawUrl, raw }) {
|
|
|
1584
1584
|
children: /* @__PURE__ */ jsx("track", { kind: "captions" })
|
|
1585
1585
|
});
|
|
1586
1586
|
if (content.text !== void 0) return /* @__PURE__ */ jsx("pre", {
|
|
1587
|
-
className: "whitespace-pre-wrap break-words font-mono text-sm leading-snug text-
|
|
1587
|
+
className: "whitespace-pre-wrap break-words font-mono text-sm leading-snug text-po-text",
|
|
1588
1588
|
children: text
|
|
1589
1589
|
});
|
|
1590
1590
|
return /* @__PURE__ */ jsx(EmptyState, {
|
|
@@ -1595,12 +1595,12 @@ function ArtifactPreview({ content, rawUrl, raw }) {
|
|
|
1595
1595
|
/** One artifact, read-only, in its own tab. */
|
|
1596
1596
|
function artifactTab(run, path) {
|
|
1597
1597
|
return {
|
|
1598
|
-
id: `${TAB_ID_PREFIX$1}${run.workspace}-${run.runKey}-${path}`.replace(/[^\w-]+/g, "-"),
|
|
1598
|
+
id: `${TAB_ID_PREFIX$1}${run.workspace}-${run.routeKey ?? run.runKey}-${path}`.replace(/[^\w-]+/g, "-"),
|
|
1599
1599
|
label: path.split("/").pop() ?? path,
|
|
1600
1600
|
panel: (props) => /* @__PURE__ */ jsx(ArtifactViewerPanel, {
|
|
1601
1601
|
...props,
|
|
1602
1602
|
workspace: run.workspace,
|
|
1603
|
-
runKey: run.runKey,
|
|
1603
|
+
runKey: run.routeKey ?? run.runKey,
|
|
1604
1604
|
path
|
|
1605
1605
|
})
|
|
1606
1606
|
};
|
|
@@ -1650,7 +1650,7 @@ function ArtifactViewerPanel({ workspace, runKey, path, sessionId }) {
|
|
|
1650
1650
|
className: "flex items-center gap-2.5 pb-3",
|
|
1651
1651
|
children: [
|
|
1652
1652
|
/* @__PURE__ */ jsx("span", {
|
|
1653
|
-
className: "truncate text-base font-semibold text-
|
|
1653
|
+
className: "truncate text-base font-semibold text-po-hi",
|
|
1654
1654
|
children: path
|
|
1655
1655
|
}),
|
|
1656
1656
|
/* @__PURE__ */ jsx(Badge, {
|
|
@@ -1658,7 +1658,7 @@ function ArtifactViewerPanel({ workspace, runKey, path, sessionId }) {
|
|
|
1658
1658
|
children: mimeType ?? "artifact"
|
|
1659
1659
|
}),
|
|
1660
1660
|
/* @__PURE__ */ jsx("span", {
|
|
1661
|
-
className: "text-sm text-
|
|
1661
|
+
className: "text-sm text-po-dim",
|
|
1662
1662
|
children: content === void 0 ? "" : `${formatSize(content.size)} · written ${formatWhen(content.modifiedAt)}`
|
|
1663
1663
|
}),
|
|
1664
1664
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
@@ -1699,13 +1699,13 @@ function ArtifactViewerPanel({ workspace, runKey, path, sessionId }) {
|
|
|
1699
1699
|
]
|
|
1700
1700
|
}),
|
|
1701
1701
|
/* @__PURE__ */ jsx("div", {
|
|
1702
|
-
className: "min-h-0 flex-1 overflow-auto rounded-md border border-
|
|
1702
|
+
className: "min-h-0 flex-1 overflow-auto rounded-md border border-po-border bg-po-deep p-4",
|
|
1703
1703
|
children: error !== void 0 ? /* @__PURE__ */ jsx("span", {
|
|
1704
1704
|
"data-testid": "artifact-error",
|
|
1705
|
-
className: "text-base text-
|
|
1705
|
+
className: "text-base text-po-yellow",
|
|
1706
1706
|
children: error
|
|
1707
1707
|
}) : content === void 0 ? /* @__PURE__ */ jsx("span", {
|
|
1708
|
-
className: "text-sm text-
|
|
1708
|
+
className: "text-sm text-po-dim",
|
|
1709
1709
|
children: "loading preview"
|
|
1710
1710
|
}) : /* @__PURE__ */ jsx(ArtifactPreview, {
|
|
1711
1711
|
content,
|
|
@@ -1714,7 +1714,7 @@ function ArtifactViewerPanel({ workspace, runKey, path, sessionId }) {
|
|
|
1714
1714
|
})
|
|
1715
1715
|
}),
|
|
1716
1716
|
content?.truncated === true ? /* @__PURE__ */ jsxs("span", {
|
|
1717
|
-
className: "pt-2 text-sm text-
|
|
1717
|
+
className: "pt-2 text-sm text-po-dim",
|
|
1718
1718
|
children: [
|
|
1719
1719
|
"this preview shows the first ",
|
|
1720
1720
|
formatSize(content.text?.length),
|
|
@@ -1734,7 +1734,7 @@ function ArtifactsPane({ run, sessionId, onOpen }) {
|
|
|
1734
1734
|
const read = () => {
|
|
1735
1735
|
if (reading) return;
|
|
1736
1736
|
reading = true;
|
|
1737
|
-
fetchArtifacts(run.workspace, run.runKey, sessionId).then((result) => {
|
|
1737
|
+
fetchArtifacts(run.workspace, run.routeKey ?? run.runKey, sessionId).then((result) => {
|
|
1738
1738
|
if (!live) return;
|
|
1739
1739
|
if ("error" in result) {
|
|
1740
1740
|
setError(result.error);
|
|
@@ -1755,15 +1755,16 @@ function ArtifactsPane({ run, sessionId, onOpen }) {
|
|
|
1755
1755
|
}, [
|
|
1756
1756
|
run.workspace,
|
|
1757
1757
|
run.runKey,
|
|
1758
|
+
run.routeKey,
|
|
1758
1759
|
run.stage,
|
|
1759
1760
|
sessionId
|
|
1760
1761
|
]);
|
|
1761
1762
|
return /* @__PURE__ */ jsx(ArtifactList, {
|
|
1762
1763
|
listing,
|
|
1763
1764
|
error,
|
|
1764
|
-
onLoadDirectory: (directory) => fetchArtifacts(run.workspace, run.runKey, sessionId, directory),
|
|
1765
|
+
onLoadDirectory: (directory) => fetchArtifacts(run.workspace, run.routeKey ?? run.runKey, sessionId, directory),
|
|
1765
1766
|
onOpen,
|
|
1766
|
-
onOpenDirectory: () => openRunDirectory(run.workspace, run.runKey, sessionId)
|
|
1767
|
+
onOpenDirectory: () => openRunDirectory(run.workspace, run.routeKey ?? run.runKey, sessionId)
|
|
1767
1768
|
});
|
|
1768
1769
|
}
|
|
1769
1770
|
/** Directory-first file tree with declared output metadata and lazy folder reads. */
|
|
@@ -1854,7 +1855,7 @@ function ArtifactList({ listing, error, onOpen, onOpenDirectory, onLoadDirectory
|
|
|
1854
1855
|
disabled: !openable,
|
|
1855
1856
|
"aria-expanded": entry.kind === "directory" ? expanded.has(entry.path) : void 0,
|
|
1856
1857
|
onClick: () => entry.kind === "directory" ? void toggle(entry) : onOpen(entry.path),
|
|
1857
|
-
className: `flex flex-col gap-0.5 px-3 py-1.5 text-left ${openable ? "cursor-pointer hover:bg-
|
|
1858
|
+
className: `flex flex-col gap-0.5 px-3 py-1.5 text-left ${openable ? "cursor-pointer hover:bg-po-panel" : "cursor-default"}`,
|
|
1858
1859
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
1859
1860
|
className: "flex min-w-0 items-center gap-2",
|
|
1860
1861
|
children: [
|
|
@@ -1864,16 +1865,16 @@ function ArtifactList({ listing, error, onOpen, onOpenDirectory, onLoadDirectory
|
|
|
1864
1865
|
}),
|
|
1865
1866
|
/* @__PURE__ */ jsxs("span", {
|
|
1866
1867
|
title: entry.path,
|
|
1867
|
-
className: `min-w-0 flex-1 truncate text-base font-semibold ${entry.state === "pending" ? "text-
|
|
1868
|
+
className: `min-w-0 flex-1 truncate text-base font-semibold ${entry.state === "pending" ? "text-po-dim" : "text-po-hi"}`,
|
|
1868
1869
|
children: [entry.path.split("/").pop(), entry.kind === "directory" ? "/" : ""]
|
|
1869
1870
|
}),
|
|
1870
1871
|
/* @__PURE__ */ jsx("span", {
|
|
1871
|
-
className: "shrink-0 text-sm text-
|
|
1872
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
1872
1873
|
children: entry.state === "pending" ? "pending" : entry.kind === "directory" ? "" : [formatSize(entry.size), formatWhen(entry.modifiedAt)].filter(Boolean).join(" · ")
|
|
1873
1874
|
})
|
|
1874
1875
|
]
|
|
1875
1876
|
}), entry.declared || entry.producedBy.length > 0 || entry.description !== "" ? /* @__PURE__ */ jsxs("span", {
|
|
1876
|
-
className: "flex min-w-0 items-center gap-1 pl-5 text-sm text-
|
|
1877
|
+
className: "flex min-w-0 items-center gap-1 pl-5 text-sm text-po-dim",
|
|
1877
1878
|
children: [
|
|
1878
1879
|
entry.declared ? /* @__PURE__ */ jsx(Badge, {
|
|
1879
1880
|
size: "xs",
|
|
@@ -1902,15 +1903,15 @@ function ArtifactList({ listing, error, onOpen, onOpenDirectory, onLoadDirectory
|
|
|
1902
1903
|
}).sort((left, right) => Number(right.kind === "directory") - Number(left.kind === "directory") || left.path.localeCompare(right.path)).map((entry) => /* @__PURE__ */ jsxs("div", {
|
|
1903
1904
|
className: "flex flex-col",
|
|
1904
1905
|
children: [renderRow(entry), entry.kind === "directory" && expanded.has(entry.path) ? /* @__PURE__ */ jsxs("div", {
|
|
1905
|
-
className: "ml-3 border-l border-
|
|
1906
|
+
className: "ml-3 border-l border-po-border pl-1",
|
|
1906
1907
|
children: [
|
|
1907
1908
|
loading.has(entry.path) ? /* @__PURE__ */ jsx("span", {
|
|
1908
|
-
className: "px-3 text-sm text-
|
|
1909
|
+
className: "px-3 text-sm text-po-dim",
|
|
1909
1910
|
children: "loading…"
|
|
1910
1911
|
}) : null,
|
|
1911
1912
|
folderErrors[entry.path] ? /* @__PURE__ */ jsx("span", {
|
|
1912
1913
|
role: "alert",
|
|
1913
|
-
className: "px-3 text-base text-
|
|
1914
|
+
className: "px-3 text-base text-po-yellow",
|
|
1914
1915
|
children: folderErrors[entry.path]
|
|
1915
1916
|
}) : null,
|
|
1916
1917
|
renderChildren(entry.path)
|
|
@@ -1932,13 +1933,13 @@ function ArtifactList({ listing, error, onOpen, onOpenDirectory, onLoadDirectory
|
|
|
1932
1933
|
title: "nothing in the run directory yet"
|
|
1933
1934
|
}) : null,
|
|
1934
1935
|
listing?.description ? /* @__PURE__ */ jsx("span", {
|
|
1935
|
-
className: "px-3 py-2 text-sm text-
|
|
1936
|
+
className: "px-3 py-2 text-sm text-po-dim",
|
|
1936
1937
|
children: listing.description
|
|
1937
1938
|
}) : null,
|
|
1938
1939
|
renderChildren(""),
|
|
1939
1940
|
openError === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
1940
1941
|
role: "alert",
|
|
1941
|
-
className: "px-3 text-base text-
|
|
1942
|
+
className: "px-3 text-base text-po-yellow",
|
|
1942
1943
|
children: openError
|
|
1943
1944
|
}),
|
|
1944
1945
|
listing === void 0 ? null : /* @__PURE__ */ jsx("button", {
|
|
@@ -1948,7 +1949,7 @@ function ArtifactList({ listing, error, onOpen, onOpenDirectory, onLoadDirectory
|
|
|
1948
1949
|
title: `${listing.runDir} (open in Finder)`,
|
|
1949
1950
|
disabled: opening || onOpenDirectory === void 0,
|
|
1950
1951
|
onClick: () => void openDirectory(),
|
|
1951
|
-
className: "truncate px-3 py-2 text-left text-base text-
|
|
1952
|
+
className: "truncate px-3 py-2 text-left text-base text-po-dim hover:text-po-hi disabled:cursor-default",
|
|
1952
1953
|
children: listing.runDir
|
|
1953
1954
|
})
|
|
1954
1955
|
]
|
|
@@ -2001,7 +2002,7 @@ function StepSteerComposer({ run, sessionId, step }) {
|
|
|
2001
2002
|
setSending(true);
|
|
2002
2003
|
setError(void 0);
|
|
2003
2004
|
try {
|
|
2004
|
-
const result = await steerStep(run.workspace, run.runKey, message, sessionId, step);
|
|
2005
|
+
const result = await steerStep(run.workspace, run.routeKey ?? run.runKey, message, sessionId, step);
|
|
2005
2006
|
if ("error" in result) {
|
|
2006
2007
|
setError(result.error);
|
|
2007
2008
|
return;
|
|
@@ -2015,15 +2016,15 @@ function StepSteerComposer({ run, sessionId, step }) {
|
|
|
2015
2016
|
};
|
|
2016
2017
|
return /* @__PURE__ */ jsx("form", {
|
|
2017
2018
|
"data-testid": "step-steer-composer",
|
|
2018
|
-
className: "shrink-0 border-t border-
|
|
2019
|
+
className: "shrink-0 border-t border-po-border-soft bg-po-rail px-3 pt-3 pb-2.5",
|
|
2019
2020
|
onSubmit: (event) => void submit(event),
|
|
2020
2021
|
children: /* @__PURE__ */ jsxs("div", {
|
|
2021
|
-
className: "rounded-lg border border-
|
|
2022
|
+
className: "rounded-lg border border-po-border bg-po-deep transition-colors focus-within:border-po-blue/60",
|
|
2022
2023
|
children: [
|
|
2023
2024
|
/* @__PURE__ */ jsxs("div", {
|
|
2024
2025
|
className: "flex min-w-0 items-start gap-2.5 px-3.5 pt-3",
|
|
2025
2026
|
children: [/* @__PURE__ */ jsx("span", {
|
|
2026
|
-
className: "mt-[3px] shrink-0 select-none text-base leading-none text-
|
|
2027
|
+
className: "mt-[3px] shrink-0 select-none text-base leading-none text-po-green",
|
|
2027
2028
|
children: ">"
|
|
2028
2029
|
}), /* @__PURE__ */ jsx(Textarea, {
|
|
2029
2030
|
variant: "bare",
|
|
@@ -2040,7 +2041,7 @@ function StepSteerComposer({ run, sessionId, step }) {
|
|
|
2040
2041
|
error === void 0 ? null : /* @__PURE__ */ jsx("p", {
|
|
2041
2042
|
role: "alert",
|
|
2042
2043
|
"data-testid": "step-steer-error",
|
|
2043
|
-
className: "px-3.5 pt-2 text-base text-
|
|
2044
|
+
className: "px-3.5 pt-2 text-base text-po-red",
|
|
2044
2045
|
children: error
|
|
2045
2046
|
}),
|
|
2046
2047
|
/* @__PURE__ */ jsxs("div", {
|
|
@@ -2049,7 +2050,7 @@ function StepSteerComposer({ run, sessionId, step }) {
|
|
|
2049
2050
|
/* @__PURE__ */ jsx("span", {
|
|
2050
2051
|
role: "status",
|
|
2051
2052
|
"data-testid": "step-steer-hint",
|
|
2052
|
-
className: "min-w-0 truncate text-sm text-
|
|
2053
|
+
className: "min-w-0 truncate text-sm text-po-dim",
|
|
2053
2054
|
children: "guidance reaches this step while it is still working"
|
|
2054
2055
|
}),
|
|
2055
2056
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
@@ -2090,13 +2091,13 @@ const CTRL_A_CODE = 64;
|
|
|
2090
2091
|
function stepTerminalTab(run, job, step) {
|
|
2091
2092
|
const target = {
|
|
2092
2093
|
workspace: run.workspace,
|
|
2093
|
-
runKey: run.runKey,
|
|
2094
|
+
runKey: run.routeKey ?? run.runKey,
|
|
2094
2095
|
job,
|
|
2095
2096
|
...step === void 0 ? {} : { step }
|
|
2096
2097
|
};
|
|
2097
2098
|
const label = step ?? job;
|
|
2098
2099
|
return {
|
|
2099
|
-
id: `${TAB_ID_PREFIX}${run.workspace}-${run.runKey}-${job}${step === void 0 ? "" : `-${step}`}`.replace(/[^\w-]+/g, "-"),
|
|
2100
|
+
id: `${TAB_ID_PREFIX}${run.workspace}-${run.routeKey ?? run.runKey}-${job}${step === void 0 ? "" : `-${step}`}`.replace(/[^\w-]+/g, "-"),
|
|
2100
2101
|
label: `${run.displayName} › ${label}`,
|
|
2101
2102
|
panel: (props) => /* @__PURE__ */ jsx(StepTerminalPanel, {
|
|
2102
2103
|
...props,
|
|
@@ -2138,22 +2139,22 @@ function StepHeader({ run, target, children }) {
|
|
|
2138
2139
|
className: "flex items-center gap-2.5 pb-3",
|
|
2139
2140
|
children: [
|
|
2140
2141
|
/* @__PURE__ */ jsx("span", {
|
|
2141
|
-
className: "shrink-0 truncate text-base font-semibold text-
|
|
2142
|
+
className: "shrink-0 truncate text-base font-semibold text-po-hi",
|
|
2142
2143
|
children: run?.displayName ?? target.runKey
|
|
2143
2144
|
}),
|
|
2144
2145
|
/* @__PURE__ */ jsx("span", {
|
|
2145
|
-
className: "text-xs text-
|
|
2146
|
+
className: "text-xs text-po-faint",
|
|
2146
2147
|
children: "›"
|
|
2147
2148
|
}),
|
|
2148
2149
|
/* @__PURE__ */ jsx("span", {
|
|
2149
|
-
className: "shrink-0 truncate text-base font-semibold text-
|
|
2150
|
+
className: "shrink-0 truncate text-base font-semibold text-po-hi",
|
|
2150
2151
|
children: target.job
|
|
2151
2152
|
}),
|
|
2152
2153
|
target.step === void 0 ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
2153
|
-
className: "text-xs text-
|
|
2154
|
+
className: "text-xs text-po-faint",
|
|
2154
2155
|
children: "›"
|
|
2155
2156
|
}), /* @__PURE__ */ jsx("span", {
|
|
2156
|
-
className: "min-w-0 truncate text-base text-
|
|
2157
|
+
className: "min-w-0 truncate text-base text-po-text",
|
|
2157
2158
|
children: target.step
|
|
2158
2159
|
})] }),
|
|
2159
2160
|
run === void 0 ? null : /* @__PURE__ */ jsx(StatusBadge, {
|
|
@@ -2175,7 +2176,7 @@ function StepHeader({ run, target, children }) {
|
|
|
2175
2176
|
*/
|
|
2176
2177
|
function StepTerminalPanel(props) {
|
|
2177
2178
|
const { sessionId, target, renderSessionTranscript } = props;
|
|
2178
|
-
const run = useStore(workflows.store, (state) => workflows.select(state, sessionId).runs).find((candidate) => candidate.workspace === target.workspace && candidate.runKey === target.runKey);
|
|
2179
|
+
const run = useStore(workflows.store, (state) => workflows.select(state, sessionId).runs).find((candidate) => candidate.workspace === target.workspace && (candidate.routeKey ?? candidate.runKey) === target.runKey);
|
|
2179
2180
|
const sessionRef = stepSessionRef(run, target);
|
|
2180
2181
|
if (sessionRef !== void 0 && renderSessionTranscript !== void 0) return /* @__PURE__ */ jsxs("div", {
|
|
2181
2182
|
"data-testid": "step-conversation-panel",
|
|
@@ -2335,7 +2336,7 @@ function StepTerminal({ sessionId, target, run }) {
|
|
|
2335
2336
|
size: "xs",
|
|
2336
2337
|
tone: held ? "blue" : "neutral",
|
|
2337
2338
|
"data-testid": "step-terminal-control",
|
|
2338
|
-
className: held ? "border-
|
|
2339
|
+
className: held ? "border-po-blue/60 bg-po-tint-blue text-po-hi" : "",
|
|
2339
2340
|
children: held ? "keyboard yours" : "watching"
|
|
2340
2341
|
}), writable ? /* @__PURE__ */ jsx(Button, {
|
|
2341
2342
|
variant: held ? "outline" : "primary",
|
|
@@ -2348,11 +2349,15 @@ function StepTerminal({ sessionId, target, run }) {
|
|
|
2348
2349
|
/* @__PURE__ */ jsxs("div", {
|
|
2349
2350
|
ref: screenRef,
|
|
2350
2351
|
"data-testid": "step-terminal-screen",
|
|
2352
|
+
role: "textbox",
|
|
2353
|
+
"aria-label": "Workflow terminal",
|
|
2354
|
+
"aria-multiline": "true",
|
|
2355
|
+
"aria-readonly": token === void 0,
|
|
2351
2356
|
tabIndex: 0,
|
|
2352
2357
|
onKeyDown,
|
|
2353
|
-
className: `min-h-0 flex-1 overflow-y-auto rounded-md border bg-
|
|
2358
|
+
className: `min-h-0 flex-1 overflow-y-auto rounded-md border bg-po-deep px-4 py-3 font-mono text-sm leading-tight text-po-text outline-none ${held ? "border-po-blue/60" : "border-po-border"}`,
|
|
2354
2359
|
children: [lines.length === 0 ? /* @__PURE__ */ jsx("span", {
|
|
2355
|
-
className: "text-sm text-
|
|
2360
|
+
className: "text-sm text-po-dim",
|
|
2356
2361
|
children: capabilities?.readable === false ? capabilities.reason ?? "This run has no terminal to read." : "waiting for the run to paint…"
|
|
2357
2362
|
}) : lines.map((line, index) => /* @__PURE__ */ jsx(ScreenLine, { line }, index)), held && !ended ? /* @__PURE__ */ jsx(StreamCursor, { className: "mt-0.5 h-[12px] w-1.5" }) : null]
|
|
2358
2363
|
}),
|
|
@@ -2361,18 +2366,18 @@ function StepTerminal({ sessionId, target, run }) {
|
|
|
2361
2366
|
children: [
|
|
2362
2367
|
/* @__PURE__ */ jsx("span", {
|
|
2363
2368
|
"data-testid": "step-terminal-hint",
|
|
2364
|
-
className: "text-sm text-
|
|
2369
|
+
className: "text-sm text-po-dim",
|
|
2365
2370
|
children: held ? "keys go to the run · ctrl-c and ctrl-d pass through · esc releases the keyboard" : capabilities?.writable === false ? capabilities.reason ?? "this run cannot be typed into" : "read-only until you take control · the run keeps going either way"
|
|
2366
2371
|
}),
|
|
2367
2372
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
2368
2373
|
ended ? /* @__PURE__ */ jsx("span", {
|
|
2369
2374
|
"data-testid": "step-terminal-ended",
|
|
2370
|
-
className: "text-sm text-
|
|
2375
|
+
className: "text-sm text-po-dim",
|
|
2371
2376
|
children: "the run has settled; this is its last screen"
|
|
2372
2377
|
}) : null,
|
|
2373
2378
|
notice === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
2374
2379
|
"data-testid": "step-terminal-notice",
|
|
2375
|
-
className: "text-sm text-
|
|
2380
|
+
className: "text-sm text-po-yellow",
|
|
2376
2381
|
children: notice
|
|
2377
2382
|
})
|
|
2378
2383
|
]
|
|
@@ -2385,35 +2390,35 @@ function StepTerminal({ sessionId, target, run }) {
|
|
|
2385
2390
|
const STATE_ICON = {
|
|
2386
2391
|
pending: {
|
|
2387
2392
|
glyph: "○",
|
|
2388
|
-
className: "text-
|
|
2393
|
+
className: "text-po-faint"
|
|
2389
2394
|
},
|
|
2390
2395
|
running: {
|
|
2391
2396
|
glyph: "●",
|
|
2392
|
-
className: "text-
|
|
2397
|
+
className: "text-po-blue"
|
|
2393
2398
|
},
|
|
2394
2399
|
resumed: {
|
|
2395
2400
|
glyph: "●",
|
|
2396
|
-
className: "text-
|
|
2401
|
+
className: "text-po-blue"
|
|
2397
2402
|
},
|
|
2398
2403
|
completed: {
|
|
2399
2404
|
glyph: "✓",
|
|
2400
|
-
className: "text-
|
|
2405
|
+
className: "text-po-green"
|
|
2401
2406
|
},
|
|
2402
2407
|
failed: {
|
|
2403
2408
|
glyph: "✕",
|
|
2404
|
-
className: "text-
|
|
2409
|
+
className: "text-po-red"
|
|
2405
2410
|
},
|
|
2406
2411
|
skipped: {
|
|
2407
2412
|
glyph: "↷",
|
|
2408
|
-
className: "text-
|
|
2413
|
+
className: "text-po-faint"
|
|
2409
2414
|
},
|
|
2410
2415
|
pause_requested: {
|
|
2411
2416
|
glyph: "!",
|
|
2412
|
-
className: "text-
|
|
2417
|
+
className: "text-po-yellow"
|
|
2413
2418
|
},
|
|
2414
2419
|
paused: {
|
|
2415
2420
|
glyph: "!",
|
|
2416
|
-
className: "text-
|
|
2421
|
+
className: "text-po-yellow"
|
|
2417
2422
|
}
|
|
2418
2423
|
};
|
|
2419
2424
|
const ACTIVE_STATES = /* @__PURE__ */ new Set([
|
|
@@ -2509,35 +2514,35 @@ function WorkflowPicker({ runs, selected, onSelect, className }) {
|
|
|
2509
2514
|
variant: "outline",
|
|
2510
2515
|
size: "sm",
|
|
2511
2516
|
"data-testid": "workflow-picker",
|
|
2512
|
-
className: cn("h-8 w-full max-w-[360px] justify-start border-
|
|
2517
|
+
className: cn("h-8 w-full max-w-[360px] justify-start border-po-border bg-po-deep px-2.5", className),
|
|
2513
2518
|
children: [
|
|
2514
|
-
/* @__PURE__ */ jsx(SearchIcon, { className: "h-3 w-3 shrink-0 text-
|
|
2519
|
+
/* @__PURE__ */ jsx(SearchIcon, { className: "h-3 w-3 shrink-0 text-po-faint" }),
|
|
2515
2520
|
/* @__PURE__ */ jsx("span", {
|
|
2516
|
-
className: "min-w-0 flex-1 truncate text-left text-base font-semibold text-
|
|
2521
|
+
className: "min-w-0 flex-1 truncate text-left text-base font-semibold text-po-hi",
|
|
2517
2522
|
children: selected.displayName
|
|
2518
2523
|
}),
|
|
2519
2524
|
/* @__PURE__ */ jsxs("span", {
|
|
2520
|
-
className: "shrink-0 text-sm font-normal text-
|
|
2525
|
+
className: "shrink-0 text-sm font-normal text-po-dim",
|
|
2521
2526
|
children: [runs.length, " workflows"]
|
|
2522
2527
|
}),
|
|
2523
|
-
/* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3 w-3 shrink-0 text-
|
|
2528
|
+
/* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3 w-3 shrink-0 text-po-dim" })
|
|
2524
2529
|
]
|
|
2525
2530
|
})
|
|
2526
2531
|
}), /* @__PURE__ */ jsxs(PopoverContent, {
|
|
2527
2532
|
side: "bottom",
|
|
2528
2533
|
align: "start",
|
|
2529
2534
|
"data-testid": "workflow-picker-popover",
|
|
2530
|
-
className: "w-[440px] border-
|
|
2535
|
+
className: "w-[440px] border-po-edge-blue",
|
|
2531
2536
|
children: [
|
|
2532
2537
|
/* @__PURE__ */ jsxs(PopoverHeader, { children: [/* @__PURE__ */ jsx(SectionLabel, {
|
|
2533
|
-
className: "text-
|
|
2538
|
+
className: "text-po-blue",
|
|
2534
2539
|
children: "workflow"
|
|
2535
2540
|
}), /* @__PURE__ */ jsx("span", {
|
|
2536
|
-
className: "truncate text-sm text-
|
|
2541
|
+
className: "truncate text-sm text-po-dim",
|
|
2537
2542
|
children: selected.displayName
|
|
2538
2543
|
})] }),
|
|
2539
2544
|
/* @__PURE__ */ jsx("div", {
|
|
2540
|
-
className: "border-b border-
|
|
2545
|
+
className: "border-b border-po-border-soft p-1.5",
|
|
2541
2546
|
children: /* @__PURE__ */ jsx(Input, {
|
|
2542
2547
|
autoFocus: true,
|
|
2543
2548
|
"data-testid": "workflow-picker-search",
|
|
@@ -2566,19 +2571,19 @@ function WorkflowPicker({ runs, selected, onSelect, className }) {
|
|
|
2566
2571
|
onSelect(run);
|
|
2567
2572
|
setOpen(false);
|
|
2568
2573
|
},
|
|
2569
|
-
className: cn("w-full gap-2.5 py-1.5 transition-colors hover:bg-
|
|
2574
|
+
className: cn("w-full gap-2.5 py-1.5 transition-colors hover:bg-po-deep focus-visible:bg-po-deep", active && "bg-po-tint-blue hover:brightness-125"),
|
|
2570
2575
|
children: [
|
|
2571
2576
|
/* @__PURE__ */ jsx("span", {
|
|
2572
|
-
className: "w-14 shrink-0 truncate text-sm text-
|
|
2577
|
+
className: "w-14 shrink-0 truncate text-sm text-po-dim",
|
|
2573
2578
|
children: runState(run)
|
|
2574
2579
|
}),
|
|
2575
2580
|
/* @__PURE__ */ jsx(OptionLabel, {
|
|
2576
2581
|
density: "compact",
|
|
2577
|
-
className: active ? "text-
|
|
2582
|
+
className: active ? "text-po-blue" : "text-po-hi",
|
|
2578
2583
|
children: run.displayName
|
|
2579
2584
|
}),
|
|
2580
2585
|
/* @__PURE__ */ jsx("span", {
|
|
2581
|
-
className: "max-w-[40%] truncate text-sm text-
|
|
2586
|
+
className: "max-w-[40%] truncate text-sm text-po-dim",
|
|
2582
2587
|
children: [run.position?.job, run.position?.step].filter(Boolean).join(" · ")
|
|
2583
2588
|
}),
|
|
2584
2589
|
/* @__PURE__ */ jsx(Dot, {
|
|
@@ -2602,7 +2607,7 @@ function WorkflowPicker({ runs, selected, onSelect, className }) {
|
|
|
2602
2607
|
"data-testid": `workflow-filter-${candidate}`,
|
|
2603
2608
|
"data-current": current,
|
|
2604
2609
|
onClick: () => setFilter(candidate),
|
|
2605
|
-
className: cn(current && "bg-
|
|
2610
|
+
className: cn(current && "bg-po-blue/25 font-semibold text-po-blue hover:bg-po-blue/25"),
|
|
2606
2611
|
children: candidate
|
|
2607
2612
|
}, candidate);
|
|
2608
2613
|
})]
|
|
@@ -2621,7 +2626,7 @@ function StepRow({ step, now, selected, onSelect }) {
|
|
|
2621
2626
|
"data-step-status": step.status,
|
|
2622
2627
|
"data-active": selected,
|
|
2623
2628
|
onClick: onSelect,
|
|
2624
|
-
className: cn("flex w-full cursor-pointer flex-col gap-0.5 rounded px-2 py-1.5 text-left enabled:hover:bg-
|
|
2629
|
+
className: cn("flex w-full cursor-pointer flex-col gap-0.5 rounded px-2 py-1.5 text-left enabled:hover:bg-po-deep disabled:cursor-default", selected && "bg-po-tint-blue ring-1 ring-inset ring-po-blue/40"),
|
|
2625
2630
|
children: [/* @__PURE__ */ jsxs("span", {
|
|
2626
2631
|
className: "flex items-center gap-2",
|
|
2627
2632
|
children: [
|
|
@@ -2630,23 +2635,23 @@ function StepRow({ step, now, selected, onSelect }) {
|
|
|
2630
2635
|
children: icon.glyph
|
|
2631
2636
|
}),
|
|
2632
2637
|
/* @__PURE__ */ jsx("span", {
|
|
2633
|
-
className: cn("min-w-0 flex-1 truncate text-base font-medium", step.status === "failed" ? "text-
|
|
2638
|
+
className: cn("min-w-0 flex-1 truncate text-base font-medium", step.status === "failed" ? "text-po-red" : "text-po-text"),
|
|
2634
2639
|
children: step.name
|
|
2635
2640
|
}),
|
|
2636
2641
|
step.group === void 0 ? null : /* @__PURE__ */ jsxs("span", {
|
|
2637
2642
|
"data-testid": `step-group-${step.name}`,
|
|
2638
|
-
className: "max-w-24 shrink-0 truncate text-sm text-
|
|
2643
|
+
className: "max-w-24 shrink-0 truncate text-sm text-po-dim",
|
|
2639
2644
|
children: ["∥ ", step.group]
|
|
2640
2645
|
}),
|
|
2641
2646
|
/* @__PURE__ */ jsx("span", {
|
|
2642
|
-
className: "shrink-0 text-sm text-
|
|
2647
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
2643
2648
|
children: step.status === "pending" ? "pending" : spanDuration(step.startedAt, step.endedAt, now) ?? ""
|
|
2644
2649
|
})
|
|
2645
2650
|
]
|
|
2646
2651
|
}), step.reason === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
2647
2652
|
"data-testid": `step-reason-${step.name}`,
|
|
2648
2653
|
title: step.reason,
|
|
2649
|
-
className: cn("truncate pl-5 text-sm", step.status === "failed" ? "text-
|
|
2654
|
+
className: cn("truncate pl-5 text-sm", step.status === "failed" ? "text-po-red" : "text-po-dim"),
|
|
2650
2655
|
children: step.reason
|
|
2651
2656
|
})]
|
|
2652
2657
|
});
|
|
@@ -2657,7 +2662,7 @@ function DeleteWorkflowDialog({ run, sessionId, onClose, onDeleted }) {
|
|
|
2657
2662
|
const confirm = () => {
|
|
2658
2663
|
setDeleting(true);
|
|
2659
2664
|
setError(void 0);
|
|
2660
|
-
deleteWorkflowRun(run.workspace, run.runKey, sessionId).then((result) => {
|
|
2665
|
+
deleteWorkflowRun(run.workspace, run.routeKey ?? run.runKey, sessionId).then((result) => {
|
|
2661
2666
|
if ("error" in result) {
|
|
2662
2667
|
setDeleting(false);
|
|
2663
2668
|
setError(result.error);
|
|
@@ -2681,12 +2686,12 @@ function DeleteWorkflowDialog({ run, sessionId, onClose, onDeleted }) {
|
|
|
2681
2686
|
"?"
|
|
2682
2687
|
] }) }), /* @__PURE__ */ jsxs(DialogBody, { children: [
|
|
2683
2688
|
/* @__PURE__ */ jsx("p", {
|
|
2684
|
-
className: "text-sm leading-relaxed text-
|
|
2689
|
+
className: "text-sm leading-relaxed text-po-dim",
|
|
2685
2690
|
children: "This permanently removes the workflow run, including its logs and artifacts. This action cannot be undone."
|
|
2686
2691
|
}),
|
|
2687
2692
|
error === void 0 ? null : /* @__PURE__ */ jsx("p", {
|
|
2688
2693
|
"data-testid": "delete-workflow-error",
|
|
2689
|
-
className: "text-base text-
|
|
2694
|
+
className: "text-base text-po-red",
|
|
2690
2695
|
children: error
|
|
2691
2696
|
}),
|
|
2692
2697
|
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
@@ -2720,17 +2725,17 @@ function StopWorkflowButton({ run, sessionId }) {
|
|
|
2720
2725
|
const stop = () => {
|
|
2721
2726
|
setStopping(true);
|
|
2722
2727
|
setError(void 0);
|
|
2723
|
-
stopWorkflowRun(run.workspace, run.runKey, sessionId).then((result) => {
|
|
2728
|
+
stopWorkflowRun(run.workspace, run.routeKey ?? run.runKey, sessionId).then((result) => {
|
|
2724
2729
|
if (!("error" in result)) return;
|
|
2725
2730
|
setStopping(false);
|
|
2726
2731
|
setError(result.error);
|
|
2727
2732
|
});
|
|
2728
2733
|
};
|
|
2729
2734
|
return /* @__PURE__ */ jsxs("div", {
|
|
2730
|
-
className: "flex shrink-0 flex-col gap-1 border-t border-
|
|
2735
|
+
className: "flex shrink-0 flex-col gap-1 border-t border-po-border-soft p-1.5",
|
|
2731
2736
|
children: [error === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
2732
2737
|
"data-testid": "stop-workflow-error",
|
|
2733
|
-
className: "px-1 text-base text-
|
|
2738
|
+
className: "px-1 text-base text-po-red",
|
|
2734
2739
|
children: error
|
|
2735
2740
|
}), /* @__PURE__ */ jsx(Button, {
|
|
2736
2741
|
variant: "danger-outline",
|
|
@@ -2768,12 +2773,12 @@ function SectionHeading({ label, meta }) {
|
|
|
2768
2773
|
className: "flex items-center px-4 pb-1 pt-3",
|
|
2769
2774
|
children: [
|
|
2770
2775
|
/* @__PURE__ */ jsx("span", {
|
|
2771
|
-
className: "text-lg font-semibold text-
|
|
2776
|
+
className: "text-lg font-semibold text-po-hi",
|
|
2772
2777
|
children: label
|
|
2773
2778
|
}),
|
|
2774
2779
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
2775
2780
|
meta === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
2776
|
-
className: "text-sm text-
|
|
2781
|
+
className: "text-sm text-po-dim",
|
|
2777
2782
|
children: meta
|
|
2778
2783
|
})
|
|
2779
2784
|
]
|
|
@@ -2785,7 +2790,7 @@ function RunHeader({ run, runs, now, onSelectRun }) {
|
|
|
2785
2790
|
const elapsed = spanDuration(run.startedAt, run.finishedAt, now);
|
|
2786
2791
|
return /* @__PURE__ */ jsxs("div", {
|
|
2787
2792
|
"data-testid": "workflow-dock-run",
|
|
2788
|
-
className: "flex shrink-0 flex-col gap-1.5 border-b border-
|
|
2793
|
+
className: "flex shrink-0 flex-col gap-1.5 border-b border-po-border px-4 py-3",
|
|
2789
2794
|
children: [
|
|
2790
2795
|
/* @__PURE__ */ jsxs("div", {
|
|
2791
2796
|
className: "flex min-w-0 items-center gap-2",
|
|
@@ -2796,7 +2801,7 @@ function RunHeader({ run, runs, now, onSelectRun }) {
|
|
|
2796
2801
|
}),
|
|
2797
2802
|
/* @__PURE__ */ jsx("span", {
|
|
2798
2803
|
title: run.displayName,
|
|
2799
|
-
className: "min-w-0 flex-1 truncate text-base font-semibold text-
|
|
2804
|
+
className: "min-w-0 flex-1 truncate text-base font-semibold text-po-hi",
|
|
2800
2805
|
children: run.displayName
|
|
2801
2806
|
}),
|
|
2802
2807
|
/* @__PURE__ */ jsx(StatusBadge, {
|
|
@@ -2809,7 +2814,7 @@ function RunHeader({ run, runs, now, onSelectRun }) {
|
|
|
2809
2814
|
]
|
|
2810
2815
|
}),
|
|
2811
2816
|
/* @__PURE__ */ jsxs("div", {
|
|
2812
|
-
className: "flex min-w-0 items-center gap-1.5 text-sm text-
|
|
2817
|
+
className: "flex min-w-0 items-center gap-1.5 text-sm text-po-dim",
|
|
2813
2818
|
children: [/* @__PURE__ */ jsx("span", {
|
|
2814
2819
|
title: where,
|
|
2815
2820
|
className: "min-w-0 flex-1 truncate",
|
|
@@ -2835,7 +2840,7 @@ function AttentionBanner({ run }) {
|
|
|
2835
2840
|
return /* @__PURE__ */ jsxs("div", {
|
|
2836
2841
|
"data-testid": "workflow-dock-attention",
|
|
2837
2842
|
"data-attention": attention.kind,
|
|
2838
|
-
className: cn("mx-3 mt-3 flex flex-col gap-1 rounded-md border px-3 py-2", paused ? "border-
|
|
2843
|
+
className: cn("mx-3 mt-3 flex flex-col gap-1 rounded-md border px-3 py-2", paused ? "border-po-edge-yellow bg-po-tint-yellow/40" : "border-po-edge-red bg-po-tint-red/40"),
|
|
2839
2844
|
children: [
|
|
2840
2845
|
/* @__PURE__ */ jsxs("div", {
|
|
2841
2846
|
className: "flex items-center gap-2",
|
|
@@ -2844,16 +2849,16 @@ function AttentionBanner({ run }) {
|
|
|
2844
2849
|
tone: paused ? "running" : "error",
|
|
2845
2850
|
children: attention.kind
|
|
2846
2851
|
}), /* @__PURE__ */ jsx("span", {
|
|
2847
|
-
className: "min-w-0 flex-1 text-sm text-
|
|
2852
|
+
className: "min-w-0 flex-1 text-sm text-po-dim",
|
|
2848
2853
|
children: paused ? "waiting to be resumed" : "needs a look"
|
|
2849
2854
|
})]
|
|
2850
2855
|
}),
|
|
2851
2856
|
/* @__PURE__ */ jsx("span", {
|
|
2852
|
-
className: "break-words text-base text-
|
|
2857
|
+
className: "break-words text-base text-po-text",
|
|
2853
2858
|
children: attention.text
|
|
2854
2859
|
}),
|
|
2855
2860
|
/* @__PURE__ */ jsx("span", {
|
|
2856
|
-
className: "text-sm text-
|
|
2861
|
+
className: "text-sm text-po-dim",
|
|
2857
2862
|
children: paused ? "ask the agent in this conversation to resume it" : "ask the agent in this conversation to diagnose or recover it"
|
|
2858
2863
|
})
|
|
2859
2864
|
]
|
|
@@ -2877,7 +2882,7 @@ function ActiveNow({ run, now, onOpenStep }) {
|
|
|
2877
2882
|
"data-testid": `workflow-dock-active-${step.name}`,
|
|
2878
2883
|
title: `open ${step.name}`,
|
|
2879
2884
|
onClick: () => onOpenStep(job, step.name),
|
|
2880
|
-
className: "flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-
|
|
2885
|
+
className: "flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-po-panel",
|
|
2881
2886
|
children: [
|
|
2882
2887
|
/* @__PURE__ */ jsx(Dot, {
|
|
2883
2888
|
tone: paused ? "yellow" : "blue",
|
|
@@ -2886,15 +2891,15 @@ function ActiveNow({ run, now, onOpenStep }) {
|
|
|
2886
2891
|
/* @__PURE__ */ jsxs("span", {
|
|
2887
2892
|
className: "flex min-w-0 flex-1 flex-col",
|
|
2888
2893
|
children: [/* @__PURE__ */ jsx("span", {
|
|
2889
|
-
className: "truncate text-base font-semibold text-
|
|
2894
|
+
className: "truncate text-base font-semibold text-po-hi",
|
|
2890
2895
|
children: step.name
|
|
2891
2896
|
}), /* @__PURE__ */ jsxs("span", {
|
|
2892
|
-
className: "truncate text-sm text-
|
|
2897
|
+
className: "truncate text-sm text-po-dim",
|
|
2893
2898
|
children: [job, step.group === void 0 ? "" : ` · ∥ ${step.group}`]
|
|
2894
2899
|
})]
|
|
2895
2900
|
}),
|
|
2896
2901
|
/* @__PURE__ */ jsx("span", {
|
|
2897
|
-
className: "shrink-0 text-sm text-
|
|
2902
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
2898
2903
|
children: spanDuration(step.startedAt, step.endedAt, now) ?? ""
|
|
2899
2904
|
})
|
|
2900
2905
|
]
|
|
@@ -2933,24 +2938,24 @@ function JobTree({ run, now, onOpenStep }) {
|
|
|
2933
2938
|
...current,
|
|
2934
2939
|
[job.name]: !open
|
|
2935
2940
|
})),
|
|
2936
|
-
className: "flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-
|
|
2941
|
+
className: "flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left hover:bg-po-panel",
|
|
2937
2942
|
children: [
|
|
2938
|
-
open ? /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-2.5 w-2.5 shrink-0 text-
|
|
2943
|
+
open ? /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-2.5 w-2.5 shrink-0 text-po-faint" }) : /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-2.5 w-2.5 shrink-0 text-po-faint" }),
|
|
2939
2944
|
/* @__PURE__ */ jsx("span", {
|
|
2940
2945
|
className: `w-3 shrink-0 text-xs ${icon.className}`,
|
|
2941
2946
|
children: icon.glyph
|
|
2942
2947
|
}),
|
|
2943
2948
|
/* @__PURE__ */ jsx("span", {
|
|
2944
|
-
className: cn("min-w-0 flex-1 truncate text-base font-semibold", job.status === "failed" ? "text-
|
|
2949
|
+
className: cn("min-w-0 flex-1 truncate text-base font-semibold", job.status === "failed" ? "text-po-red" : "text-po-hi"),
|
|
2945
2950
|
children: job.name
|
|
2946
2951
|
}),
|
|
2947
2952
|
/* @__PURE__ */ jsx("span", {
|
|
2948
|
-
className: "shrink-0 text-sm text-
|
|
2953
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
2949
2954
|
children: job.status === "pending" ? "pending" : open || job.steps.length === 0 ? spanDuration(job.startedAt, job.endedAt, now) ?? "" : `${finished}/${job.steps.length} steps`
|
|
2950
2955
|
})
|
|
2951
2956
|
]
|
|
2952
2957
|
}), open && job.steps.length > 0 ? /* @__PURE__ */ jsx("div", {
|
|
2953
|
-
className: "ml-4 flex flex-col gap-0.5 border-l border-
|
|
2958
|
+
className: "ml-4 flex flex-col gap-0.5 border-l border-po-border-soft pl-1",
|
|
2954
2959
|
children: job.steps.map((step) => /* @__PURE__ */ jsx(StepRow, {
|
|
2955
2960
|
step,
|
|
2956
2961
|
now,
|
|
@@ -3007,11 +3012,11 @@ function WorkflowDockView({ runs, run, now, sessionId, onSelectRun, onOpenStep,
|
|
|
3007
3012
|
run,
|
|
3008
3013
|
sessionId
|
|
3009
3014
|
}, workflowRunIdentity(run)), /* @__PURE__ */ jsx("p", {
|
|
3010
|
-
className: "px-3 pb-2 text-sm text-
|
|
3015
|
+
className: "px-3 pb-2 text-sm text-po-dim",
|
|
3011
3016
|
children: "this session runs the workflow; removing or restarting it stops the run"
|
|
3012
3017
|
})]
|
|
3013
3018
|
}) : /* @__PURE__ */ jsx("div", {
|
|
3014
|
-
className: "flex shrink-0 border-t border-
|
|
3019
|
+
className: "flex shrink-0 border-t border-po-border-soft p-1.5",
|
|
3015
3020
|
children: /* @__PURE__ */ jsx(Button, {
|
|
3016
3021
|
variant: "danger-outline",
|
|
3017
3022
|
size: "xs",
|
|
@@ -3169,7 +3174,7 @@ const BOOLEAN_TYPE = "boolean";
|
|
|
3169
3174
|
const BOOLEAN_VALUES = ["true", "false"];
|
|
3170
3175
|
function FieldLabel({ children }) {
|
|
3171
3176
|
return /* @__PURE__ */ jsx("span", {
|
|
3172
|
-
className: "text-base font-medium text-
|
|
3177
|
+
className: "text-base font-medium text-po-text",
|
|
3173
3178
|
children
|
|
3174
3179
|
});
|
|
3175
3180
|
}
|
|
@@ -3186,9 +3191,9 @@ function InputField({ input, value, onChange }) {
|
|
|
3186
3191
|
"data-testid": `launch-input-${input.name}`,
|
|
3187
3192
|
children: [
|
|
3188
3193
|
/* @__PURE__ */ jsxs("span", {
|
|
3189
|
-
className: "min-w-0 truncate text-base font-medium text-
|
|
3194
|
+
className: "min-w-0 truncate text-base font-medium text-po-text sm:w-28 sm:shrink-0",
|
|
3190
3195
|
children: [input.name, input.required === true ? /* @__PURE__ */ jsx("span", {
|
|
3191
|
-
className: "text-
|
|
3196
|
+
className: "text-po-yellow",
|
|
3192
3197
|
children: " *"
|
|
3193
3198
|
}) : null]
|
|
3194
3199
|
}),
|
|
@@ -3209,7 +3214,7 @@ function InputField({ input, value, onChange }) {
|
|
|
3209
3214
|
}, option)) })]
|
|
3210
3215
|
}),
|
|
3211
3216
|
/* @__PURE__ */ jsx("span", {
|
|
3212
|
-
className: "min-w-0 truncate text-sm text-
|
|
3217
|
+
className: "min-w-0 truncate text-sm text-po-dim sm:w-40 sm:shrink-0",
|
|
3213
3218
|
children: hint
|
|
3214
3219
|
})
|
|
3215
3220
|
]
|
|
@@ -3234,7 +3239,7 @@ function PickField({ label, testId, options, value, hint, onChange }) {
|
|
|
3234
3239
|
}, option)) })]
|
|
3235
3240
|
}),
|
|
3236
3241
|
/* @__PURE__ */ jsx("span", {
|
|
3237
|
-
className: "text-sm text-
|
|
3242
|
+
className: "text-sm text-po-dim",
|
|
3238
3243
|
children: hint
|
|
3239
3244
|
})
|
|
3240
3245
|
]
|
|
@@ -3285,7 +3290,7 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3285
3290
|
className: "flex min-w-0 flex-col items-start gap-1 sm:flex-row sm:items-center sm:gap-2.5",
|
|
3286
3291
|
children: [
|
|
3287
3292
|
/* @__PURE__ */ jsx("span", {
|
|
3288
|
-
className: "text-sm text-
|
|
3293
|
+
className: "text-sm text-po-dim",
|
|
3289
3294
|
children: "launch workflow"
|
|
3290
3295
|
}),
|
|
3291
3296
|
/* @__PURE__ */ jsx(DialogTitle, {
|
|
@@ -3301,7 +3306,7 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3301
3306
|
]
|
|
3302
3307
|
}) }), /* @__PURE__ */ jsxs(DialogBody, { children: [
|
|
3303
3308
|
/* @__PURE__ */ jsx("p", {
|
|
3304
|
-
className: "text-sm leading-relaxed text-
|
|
3309
|
+
className: "text-sm leading-relaxed text-po-dim",
|
|
3305
3310
|
children: workflow.description || "This workflow declares no description."
|
|
3306
3311
|
}),
|
|
3307
3312
|
/* @__PURE__ */ jsxs("div", {
|
|
@@ -3318,7 +3323,7 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3318
3323
|
onKeyDown: onPromptKeyDown
|
|
3319
3324
|
}),
|
|
3320
3325
|
/* @__PURE__ */ jsx("span", {
|
|
3321
|
-
className: "text-sm text-
|
|
3326
|
+
className: "text-sm text-po-dim",
|
|
3322
3327
|
children: "enter launches · shift+enter for a new line"
|
|
3323
3328
|
})
|
|
3324
3329
|
]
|
|
@@ -3328,7 +3333,7 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3328
3333
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
3329
3334
|
className: "flex items-center gap-2",
|
|
3330
3335
|
children: [/* @__PURE__ */ jsx(FieldLabel, { children: "Inputs" }), /* @__PURE__ */ jsxs("span", {
|
|
3331
|
-
className: "text-sm text-
|
|
3336
|
+
className: "text-sm text-po-dim",
|
|
3332
3337
|
children: [
|
|
3333
3338
|
"workflow_dispatch · ",
|
|
3334
3339
|
workflow.inputs.length,
|
|
@@ -3352,7 +3357,7 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3352
3357
|
children: [
|
|
3353
3358
|
/* @__PURE__ */ jsx(FieldLabel, { children: "Runner" }),
|
|
3354
3359
|
workflow.runners === void 0 || workflow.runners.length === 0 ? /* @__PURE__ */ jsx("span", {
|
|
3355
|
-
className: "flex h-7 items-center text-base text-
|
|
3360
|
+
className: "flex h-7 items-center text-base text-po-dim",
|
|
3356
3361
|
children: "whatever the workflow resolves"
|
|
3357
3362
|
}) : /* @__PURE__ */ jsxs(Select, {
|
|
3358
3363
|
value: runner,
|
|
@@ -3367,7 +3372,7 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3367
3372
|
}, choice)) })]
|
|
3368
3373
|
}),
|
|
3369
3374
|
/* @__PURE__ */ jsx("span", {
|
|
3370
|
-
className: "text-sm text-
|
|
3375
|
+
className: "text-sm text-po-dim",
|
|
3371
3376
|
children: workflow.runners === void 0 ? "no runner map declared" : "the runners every step agrees on"
|
|
3372
3377
|
})
|
|
3373
3378
|
]
|
|
@@ -3393,11 +3398,11 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3393
3398
|
children: [
|
|
3394
3399
|
/* @__PURE__ */ jsx(FieldLabel, { children: "Jobs" }),
|
|
3395
3400
|
/* @__PURE__ */ jsx("span", {
|
|
3396
|
-
className: "flex h-7 items-center text-base text-
|
|
3401
|
+
className: "flex h-7 items-center text-base text-po-dim",
|
|
3397
3402
|
children: workflow.jobs.map((job) => job.name).join(" → ") || "none declared"
|
|
3398
3403
|
}),
|
|
3399
3404
|
/* @__PURE__ */ jsx("span", {
|
|
3400
|
-
className: "text-sm text-
|
|
3405
|
+
className: "text-sm text-po-dim",
|
|
3401
3406
|
children: "in the order the file declares them"
|
|
3402
3407
|
})
|
|
3403
3408
|
]
|
|
@@ -3407,11 +3412,11 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3407
3412
|
children: [
|
|
3408
3413
|
/* @__PURE__ */ jsx(FieldLabel, { children: "Cwd" }),
|
|
3409
3414
|
/* @__PURE__ */ jsx("span", {
|
|
3410
|
-
className: "flex h-7 items-center font-mono text-sm text-
|
|
3415
|
+
className: "flex h-7 items-center font-mono text-sm text-po-dim",
|
|
3411
3416
|
children: cwd
|
|
3412
3417
|
}),
|
|
3413
3418
|
/* @__PURE__ */ jsx("span", {
|
|
3414
|
-
className: "text-sm text-
|
|
3419
|
+
className: "text-sm text-po-dim",
|
|
3415
3420
|
children: "the session's directory"
|
|
3416
3421
|
})
|
|
3417
3422
|
]
|
|
@@ -3419,23 +3424,23 @@ function LaunchWorkflowDialog({ sessionId, workflow, cwd, initialPrompt, send, o
|
|
|
3419
3424
|
]
|
|
3420
3425
|
}),
|
|
3421
3426
|
/* @__PURE__ */ jsxs("div", {
|
|
3422
|
-
className: "flex flex-col gap-1 rounded-md border border-
|
|
3427
|
+
className: "flex flex-col gap-1 rounded-md border border-po-border bg-po-deep px-3 py-2",
|
|
3423
3428
|
children: [/* @__PURE__ */ jsx(FieldLabel, { children: "Sent to the session" }), /* @__PURE__ */ jsx("pre", {
|
|
3424
3429
|
"data-testid": "launch-line",
|
|
3425
|
-
className: "whitespace-pre-wrap break-words font-mono text-sm text-
|
|
3430
|
+
className: "whitespace-pre-wrap break-words font-mono text-sm text-po-green",
|
|
3426
3431
|
children: line
|
|
3427
3432
|
})]
|
|
3428
3433
|
}),
|
|
3429
3434
|
problems.length === 0 ? null : /* @__PURE__ */ jsx("p", {
|
|
3430
3435
|
"data-testid": "launch-problems",
|
|
3431
|
-
className: "text-base text-
|
|
3436
|
+
className: "text-base text-po-yellow",
|
|
3432
3437
|
children: problems.join(" ")
|
|
3433
3438
|
}),
|
|
3434
3439
|
/* @__PURE__ */ jsxs(DialogFooter, {
|
|
3435
3440
|
className: "flex-wrap sm:flex-nowrap",
|
|
3436
3441
|
children: [
|
|
3437
3442
|
/* @__PURE__ */ jsx("span", {
|
|
3438
|
-
className: "w-full text-sm text-
|
|
3443
|
+
className: "w-full text-sm text-po-dim sm:w-auto",
|
|
3439
3444
|
children: "the run appears on the board as soon as it starts"
|
|
3440
3445
|
}),
|
|
3441
3446
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
@@ -3479,10 +3484,10 @@ function Detail({ workflow }) {
|
|
|
3479
3484
|
children: rows.map(([label, value]) => /* @__PURE__ */ jsxs("div", {
|
|
3480
3485
|
className: "flex gap-2",
|
|
3481
3486
|
children: [/* @__PURE__ */ jsx("dt", {
|
|
3482
|
-
className: "w-16 shrink-0 text-
|
|
3487
|
+
className: "w-16 shrink-0 text-po-dim",
|
|
3483
3488
|
children: label
|
|
3484
3489
|
}), /* @__PURE__ */ jsx("dd", {
|
|
3485
|
-
className: "min-w-0 break-words text-
|
|
3490
|
+
className: "min-w-0 break-words text-po-dim",
|
|
3486
3491
|
children: value
|
|
3487
3492
|
})]
|
|
3488
3493
|
}, label))
|
|
@@ -3498,13 +3503,13 @@ function WorkflowRow({ workflow, selected, inspected, onSelect, onLaunch, onInsp
|
|
|
3498
3503
|
"data-selected": selected,
|
|
3499
3504
|
onClick: onSelect,
|
|
3500
3505
|
onDoubleClick: onLaunch,
|
|
3501
|
-
className: `flex cursor-pointer flex-col gap-1 border-l-2 px-4 py-2 ${selected ? "border-
|
|
3506
|
+
className: `flex cursor-pointer flex-col gap-1 border-l-2 px-4 py-2 ${selected ? "border-po-blue bg-po-panel" : "border-transparent hover:bg-po-panel/60"}`,
|
|
3502
3507
|
children: [
|
|
3503
3508
|
/* @__PURE__ */ jsxs("div", {
|
|
3504
3509
|
className: "flex min-w-0 items-center gap-2",
|
|
3505
3510
|
children: [
|
|
3506
3511
|
/* @__PURE__ */ jsx("span", {
|
|
3507
|
-
className: "truncate text-base font-semibold text-
|
|
3512
|
+
className: "truncate text-base font-semibold text-po-hi",
|
|
3508
3513
|
children: workflow.name
|
|
3509
3514
|
}),
|
|
3510
3515
|
workflow.tags.map((tag) => /* @__PURE__ */ jsx(Badge, {
|
|
@@ -3514,17 +3519,17 @@ function WorkflowRow({ workflow, selected, inspected, onSelect, onLaunch, onInsp
|
|
|
3514
3519
|
}, tag)),
|
|
3515
3520
|
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1" }),
|
|
3516
3521
|
/* @__PURE__ */ jsx("span", {
|
|
3517
|
-
className: `shrink-0 text-sm ${workflow.error === void 0 ? "text-
|
|
3522
|
+
className: `shrink-0 text-sm ${workflow.error === void 0 ? "text-po-cyan" : "text-po-red"}`,
|
|
3518
3523
|
children: workflow.error === void 0 ? `${jobs} job${jobs === 1 ? "" : "s"}` : "needs fixing"
|
|
3519
3524
|
})
|
|
3520
3525
|
]
|
|
3521
3526
|
}),
|
|
3522
3527
|
/* @__PURE__ */ jsx("span", {
|
|
3523
|
-
className: "truncate text-sm text-
|
|
3528
|
+
className: "truncate text-sm text-po-dim",
|
|
3524
3529
|
children: workflow.description || workflow.relativePath
|
|
3525
3530
|
}),
|
|
3526
3531
|
workflow.error === void 0 ? /* @__PURE__ */ jsxs("span", {
|
|
3527
|
-
className: "truncate text-sm text-
|
|
3532
|
+
className: "truncate text-sm text-po-dim",
|
|
3528
3533
|
children: [
|
|
3529
3534
|
workflow.inputs.length,
|
|
3530
3535
|
" input",
|
|
@@ -3535,7 +3540,7 @@ function WorkflowRow({ workflow, selected, inspected, onSelect, onLaunch, onInsp
|
|
|
3535
3540
|
workflow.artifacts.length > 0 ? ` · ${workflow.artifacts.length} artifacts` : ""
|
|
3536
3541
|
]
|
|
3537
3542
|
}) : /* @__PURE__ */ jsx("span", {
|
|
3538
|
-
className: "truncate text-base text-
|
|
3543
|
+
className: "truncate text-base text-po-red",
|
|
3539
3544
|
children: workflow.error
|
|
3540
3545
|
}),
|
|
3541
3546
|
selected ? /* @__PURE__ */ jsxs("div", {
|
|
@@ -3555,7 +3560,7 @@ function WorkflowRow({ workflow, selected, inspected, onSelect, onLaunch, onInsp
|
|
|
3555
3560
|
variant: "link",
|
|
3556
3561
|
size: "xs",
|
|
3557
3562
|
"data-testid": `catalog-inspect-${workflow.name}`,
|
|
3558
|
-
className: "px-0 text-
|
|
3563
|
+
className: "px-0 text-po-dim",
|
|
3559
3564
|
onClick: (event) => {
|
|
3560
3565
|
event.stopPropagation();
|
|
3561
3566
|
onInspect();
|
|
@@ -3607,13 +3612,13 @@ function WorkflowCatalogDrawer({ sessionId, onClose, onLaunch }) {
|
|
|
3607
3612
|
"data-testid": "workflow-catalog-drawer",
|
|
3608
3613
|
tabIndex: 0,
|
|
3609
3614
|
onKeyDown,
|
|
3610
|
-
className: "flex w-[min(440px,calc(100vw-24px))] max-w-full shrink-0 flex-col overflow-hidden border-l border-
|
|
3615
|
+
className: "flex w-[min(440px,calc(100vw-24px))] max-w-full shrink-0 flex-col overflow-hidden border-l border-po-border bg-po-rail outline-none",
|
|
3611
3616
|
children: [
|
|
3612
3617
|
/* @__PURE__ */ jsxs("div", {
|
|
3613
|
-
className: "flex h-11 shrink-0 items-center gap-2.5 border-b border-
|
|
3618
|
+
className: "flex h-11 shrink-0 items-center gap-2.5 border-b border-po-border px-4",
|
|
3614
3619
|
children: [
|
|
3615
3620
|
/* @__PURE__ */ jsx("span", {
|
|
3616
|
-
className: "text-lg font-semibold text-
|
|
3621
|
+
className: "text-lg font-semibold text-po-hi",
|
|
3617
3622
|
children: "workflow catalog"
|
|
3618
3623
|
}),
|
|
3619
3624
|
/* @__PURE__ */ jsxs(Badge, {
|
|
@@ -3652,7 +3657,7 @@ function WorkflowCatalogDrawer({ sessionId, onClose, onLaunch }) {
|
|
|
3652
3657
|
className: "flex min-h-0 flex-1 flex-col overflow-y-auto pb-2",
|
|
3653
3658
|
children: [shown.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
3654
3659
|
"data-testid": "catalog-empty",
|
|
3655
|
-
className: "px-4 py-3 text-sm text-
|
|
3660
|
+
className: "px-4 py-3 text-sm text-po-dim",
|
|
3656
3661
|
children: state.warning ?? (state.workflows.length === 0 ? "no workflows found for this session; add one under automations/workflows" : "nothing matches the filter")
|
|
3657
3662
|
}) : null, shown.map((workflow) => /* @__PURE__ */ jsx(WorkflowRow, {
|
|
3658
3663
|
workflow,
|
|
@@ -3664,12 +3669,12 @@ function WorkflowCatalogDrawer({ sessionId, onClose, onLaunch }) {
|
|
|
3664
3669
|
}, workflow.path))]
|
|
3665
3670
|
}),
|
|
3666
3671
|
/* @__PURE__ */ jsxs("div", {
|
|
3667
|
-
className: "flex h-8 shrink-0 items-center justify-between border-t border-
|
|
3672
|
+
className: "flex h-8 shrink-0 items-center justify-between border-t border-po-border-soft bg-po-deep px-4",
|
|
3668
3673
|
children: [/* @__PURE__ */ jsx("span", {
|
|
3669
|
-
className: "shrink-0 text-sm text-
|
|
3674
|
+
className: "shrink-0 text-sm text-po-dim",
|
|
3670
3675
|
children: "↑↓ choose · enter launch · i inspect · esc close"
|
|
3671
3676
|
}), /* @__PURE__ */ jsx("span", {
|
|
3672
|
-
className: "min-w-0 truncate font-mono text-sm text-
|
|
3677
|
+
className: "min-w-0 truncate font-mono text-sm text-po-dim",
|
|
3673
3678
|
children: state.cwd
|
|
3674
3679
|
})]
|
|
3675
3680
|
})
|