@osolmaz/pi-workflows 0.8.2 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/extension/herdr-viewer.d.ts +50 -0
- package/dist/extension/herdr-viewer.js +310 -0
- package/dist/extension/herdr-viewer.js.map +1 -0
- package/dist/extension/index.js +104 -1
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/widget.d.ts +1 -1
- package/dist/extension/widget.js +15 -6
- package/dist/extension/widget.js.map +1 -1
- package/dist/herdr/constants.d.ts +2 -0
- package/dist/herdr/constants.js +3 -0
- package/dist/herdr/constants.js.map +1 -0
- package/dist/herdr/setup.d.ts +8 -0
- package/dist/herdr/setup.js +78 -0
- package/dist/herdr/setup.js.map +1 -0
- package/dist/viewer/cli.d.ts +1 -0
- package/dist/viewer/cli.js +18 -1
- package/dist/viewer/cli.js.map +1 -1
- package/docs/2026-08-18-herdr-piw-plan.md +73 -0
- package/docs/tui-viewer.md +14 -0
- package/herdr-plugin.toml +12 -0
- package/package.json +3 -1
- package/plugins/herdr/viewer.mjs +56 -0
- package/src/extension/herdr-viewer.ts +394 -0
- package/src/extension/index.ts +130 -0
- package/src/extension/widget.ts +23 -5
- package/src/herdr/constants.ts +2 -0
- package/src/herdr/setup.ts +93 -0
- package/src/viewer/cli.ts +20 -1
package/dist/viewer/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/viewer/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/viewer/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Native Herdr piw integration plan
|
|
3
|
+
author: Onur Solmaz <2453968+osolmaz@users.noreply.github.com>
|
|
4
|
+
date: 2026-08-18
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Native Herdr piw integration plan
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
When Pi Workflows runs inside Herdr, show a shortcut that opens the current run in `piw`. The integration must belong to Pi Workflows and ship as one package, repository, version, and release. The same repository must also qualify for Herdr's public plugin marketplace.
|
|
12
|
+
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- Detect a live Herdr pane without polling.
|
|
16
|
+
- Show `Ctrl+Shift+R piw` inside the existing workflow widget only when the integration is available. Put it on the scroll-controls line when that line exists.
|
|
17
|
+
- Add `/piw` as a command fallback.
|
|
18
|
+
- Let the user open the viewer to the right, below, left, above, in a new tab, or in a new workspace.
|
|
19
|
+
- Open the exact run bundle rather than the runs list.
|
|
20
|
+
- Focus an existing viewer for the same run instead of opening a duplicate, including after Pi reload.
|
|
21
|
+
- Keep the workflow engine and run-bundle format independent of Herdr.
|
|
22
|
+
- Use Herdr's public plugin, pane, workspace, tab, label, and snapshot APIs. Do not construct commands from run data.
|
|
23
|
+
- Add the public repository to Herdr's plugin marketplace through the `herdr-plugin` topic.
|
|
24
|
+
|
|
25
|
+
## Design
|
|
26
|
+
|
|
27
|
+
### One package with two host entry points
|
|
28
|
+
|
|
29
|
+
The package root will contain `herdr-plugin.toml`. Pi loads the existing extension entry point. Herdr loads a `piw` pane entry point from the same package root. A small checked-in JavaScript launcher validates `PI_WORKFLOWS_RUN_DIR` and starts `piw` with an argv array.
|
|
30
|
+
|
|
31
|
+
`pi-workflows herdr setup` explicitly links the current package root with `herdr plugin link`. It is idempotent and never changes plugin registration during normal Pi startup.
|
|
32
|
+
|
|
33
|
+
### Native extension adapter
|
|
34
|
+
|
|
35
|
+
A Herdr adapter under `src/extension/` will own capability checks and topology operations. It will use Pi's documented `pi.exec` API with bounded timeouts. The adapter will resolve the caller with `herdr pane current --current` on every open action, parse bounded JSON, and use only returned IDs.
|
|
36
|
+
|
|
37
|
+
The extension will keep a view target containing the exact run ID, workflow name, and bundle directory. The target starts after the bundle exists and lasts as long as the workflow widget. The widget renderer will keep the shortcut inside Pi's ten-line limit. It will append the call to action to the existing `shift+↑/↓ scroll` line when rows are hidden, and use a short standalone line only when no scroll-controls line exists.
|
|
38
|
+
|
|
39
|
+
### Placement
|
|
40
|
+
|
|
41
|
+
Right and below use Herdr plugin splits. Left and above create the corresponding right or down split and then swap the new viewer with the caller. A tab uses the current workspace. A workspace is created transactionally; if plugin pane creation fails, only that new workspace is closed.
|
|
42
|
+
|
|
43
|
+
### Viewer discovery
|
|
44
|
+
|
|
45
|
+
Herdr's public snapshot does not expose plugin metadata tokens. The launcher will therefore set an exact pane label derived from the run ID before starting `piw`. The adapter will inspect Herdr's public snapshot to find and focus an existing viewer after reload. It will discard stale pane references without adding a state file.
|
|
46
|
+
|
|
47
|
+
## Non-goals
|
|
48
|
+
|
|
49
|
+
- Do not change Herdr core or `piw`.
|
|
50
|
+
- Do not add a companion Pi extension, event bridge, protocol version, daemon, poller, or new state store.
|
|
51
|
+
- Do not install or link the Herdr plugin automatically during Pi startup.
|
|
52
|
+
- Do not expose viewer control to the model-visible workflow tool.
|
|
53
|
+
|
|
54
|
+
## Acceptance criteria
|
|
55
|
+
|
|
56
|
+
- A workflow started in a normal Pi TUI outside Herdr has unchanged UI and behavior.
|
|
57
|
+
- A workflow started in Herdr shows the shortcut and opens its exact bundle in `piw`.
|
|
58
|
+
- All six placements work and preserve the calling pane unless the user selects a focused viewer.
|
|
59
|
+
- Repeated opens and Pi reloads focus the existing run viewer.
|
|
60
|
+
- Failures produce bounded, useful messages and leave no empty tab or workspace.
|
|
61
|
+
- The package tarball contains the Herdr manifest and launcher.
|
|
62
|
+
- `osolmaz/pi-workflows` is public, has a root `herdr-plugin.toml`, and has the `herdr-plugin` GitHub topic.
|
|
63
|
+
|
|
64
|
+
## Verification
|
|
65
|
+
|
|
66
|
+
- `npm run check`
|
|
67
|
+
- `npm run test:e2e`
|
|
68
|
+
- `npx slophammer-ts@latest dry .`
|
|
69
|
+
- `npx slophammer-ts@latest check . --only ts.dependency-boundaries-required`
|
|
70
|
+
- `npx -y @simpledoc/simpledoc check`
|
|
71
|
+
- `npm pack --dry-run`
|
|
72
|
+
- Link the package with `pi-workflows herdr setup` in a disposable Herdr test session.
|
|
73
|
+
- Start a finite test workflow in real Pi, open `piw` with `Ctrl+Shift+R`, verify the exact run ID, then test pane reuse and cleanup.
|
package/docs/tui-viewer.md
CHANGED
|
@@ -30,6 +30,20 @@ cargo install pi-workflows
|
|
|
30
30
|
Direct filesystem mode and connected mode use the same semantic run view.
|
|
31
31
|
The protocol is the network form of that view.
|
|
32
32
|
|
|
33
|
+
## Herdr
|
|
34
|
+
|
|
35
|
+
The npm package contains a native Herdr plugin. Link the installed package with
|
|
36
|
+
`pi-workflows herdr setup`. A workflow running in Pi inside Herdr then shows
|
|
37
|
+
`Ctrl+Shift+R piw` in its widget. When rows are hidden, the call to action shares
|
|
38
|
+
the scroll-controls line. The shortcut and `/piw` command open
|
|
39
|
+
the current bundle directly in a managed Herdr pane. The placement menu supports
|
|
40
|
+
right, below, left, above, a new tab, and a new workspace.
|
|
41
|
+
|
|
42
|
+
The integration resolves the calling pane at invocation time and uses returned
|
|
43
|
+
Herdr IDs for every layout change. Existing viewers are found from their exact
|
|
44
|
+
run title and focused after Pi reload. Normal Pi sessions do not probe Herdr or
|
|
45
|
+
show the shortcut.
|
|
46
|
+
|
|
33
47
|
## Layout
|
|
34
48
|
|
|
35
49
|
The normal layout contains a run browser, graph, inspector, and two-line replay
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id = "osolmaz.pi-workflows"
|
|
2
|
+
name = "Pi Workflows"
|
|
3
|
+
version = "0.9.1"
|
|
4
|
+
min_herdr_version = "0.7.0"
|
|
5
|
+
description = "Open the active Pi Workflows run in piw from a managed Herdr pane."
|
|
6
|
+
platforms = ["linux", "macos"]
|
|
7
|
+
|
|
8
|
+
[[panes]]
|
|
9
|
+
id = "piw"
|
|
10
|
+
title = "piw"
|
|
11
|
+
placement = "split"
|
|
12
|
+
command = ["node", "plugins/herdr/viewer.mjs"]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osolmaz/pi-workflows",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Workflow and controller runtime with a live terminal viewer for the pi coding agent",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package"
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
"skills",
|
|
24
24
|
"examples",
|
|
25
25
|
"docs",
|
|
26
|
+
"plugins/herdr",
|
|
27
|
+
"herdr-plugin.toml",
|
|
26
28
|
"README.md",
|
|
27
29
|
"LICENSE"
|
|
28
30
|
],
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
|
|
7
|
+
const runId = process.env.PI_WORKFLOWS_RUN_ID ?? "";
|
|
8
|
+
const runDir = process.env.PI_WORKFLOWS_RUN_DIR ?? "";
|
|
9
|
+
|
|
10
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/u.test(runId)) {
|
|
11
|
+
fail("PI_WORKFLOWS_RUN_ID is missing or invalid.");
|
|
12
|
+
}
|
|
13
|
+
if (!path.isAbsolute(runDir) || path.basename(runDir) !== runId) {
|
|
14
|
+
fail("PI_WORKFLOWS_RUN_DIR must be the absolute bundle directory for the selected run.");
|
|
15
|
+
}
|
|
16
|
+
if (!fs.existsSync(path.join(runDir, "manifest.json"))) {
|
|
17
|
+
fail(`Workflow bundle not found: ${runDir}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const paneId = process.env.HERDR_PANE_ID ?? "";
|
|
21
|
+
if (!/^[A-Za-z0-9]+:p[A-Za-z0-9]+$/u.test(paneId)) {
|
|
22
|
+
fail("HERDR_PANE_ID is missing or invalid.");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const herdr = process.env.HERDR_BIN_PATH ?? "herdr";
|
|
26
|
+
const label = `piw · ${runId}`;
|
|
27
|
+
const labeled = spawnSync(herdr, ["pane", "rename", paneId, label], {
|
|
28
|
+
encoding: "utf8",
|
|
29
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
30
|
+
});
|
|
31
|
+
if (labeled.error) fail(`Could not label the Herdr viewer pane: ${labeled.error.message}`);
|
|
32
|
+
if (labeled.status !== 0) {
|
|
33
|
+
fail(`Could not label the Herdr viewer pane: ${bounded(labeled.stderr) || "unknown error"}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const viewer = spawn("piw", [runDir], { stdio: "inherit" });
|
|
37
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
38
|
+
process.on(signal, () => viewer.kill(signal));
|
|
39
|
+
}
|
|
40
|
+
viewer.on("error", (error) => fail(`Could not start piw: ${error.message}`));
|
|
41
|
+
viewer.on("exit", (code, signal) => {
|
|
42
|
+
process.exitCode = signal ? 1 : (code ?? 1);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
function fail(message) {
|
|
46
|
+
process.stderr.write(`${message}\n`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function bounded(value) {
|
|
51
|
+
const compact = String(value ?? "")
|
|
52
|
+
.replace(/[\r\n\t]+/gu, " ")
|
|
53
|
+
.replace(/ +/gu, " ")
|
|
54
|
+
.trim();
|
|
55
|
+
return compact.length <= 300 ? compact : `${compact.slice(0, 299)}…`;
|
|
56
|
+
}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { HERDR_PLUGIN_ENTRYPOINT, HERDR_PLUGIN_ID } from "../herdr/constants.js";
|
|
3
|
+
export const PIW_SHORTCUT = "ctrl+shift+r";
|
|
4
|
+
export const PIW_SHORTCUT_HINT = "Ctrl+Shift+R piw";
|
|
5
|
+
|
|
6
|
+
const COMMAND_TIMEOUT_MS = 5_000;
|
|
7
|
+
const MAX_JSON_CHARS = 1_000_000;
|
|
8
|
+
const VIEWER_LABEL_PREFIX = "piw · ";
|
|
9
|
+
|
|
10
|
+
export const VIEWER_PLACEMENTS = ["right", "below", "left", "above", "tab", "workspace"] as const;
|
|
11
|
+
|
|
12
|
+
export type ViewerPlacement = (typeof VIEWER_PLACEMENTS)[number];
|
|
13
|
+
|
|
14
|
+
export type WorkflowViewTarget = {
|
|
15
|
+
runId: string;
|
|
16
|
+
workflowName: string;
|
|
17
|
+
runDir: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type HerdrCapability = { available: true } | { available: false; reason: string };
|
|
21
|
+
|
|
22
|
+
export type ViewerOpenResult = {
|
|
23
|
+
paneId: string;
|
|
24
|
+
reused: boolean;
|
|
25
|
+
warning?: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type Exec = ExtensionAPI["exec"];
|
|
29
|
+
|
|
30
|
+
type HerdrPane = {
|
|
31
|
+
paneId: string;
|
|
32
|
+
tabId: string;
|
|
33
|
+
workspaceId: string;
|
|
34
|
+
label?: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
type OpenedPane = {
|
|
38
|
+
paneId: string;
|
|
39
|
+
tabId: string;
|
|
40
|
+
workspaceId: string;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export class HerdrWorkflowViewer {
|
|
44
|
+
private readonly knownPanes = new Map<string, string>();
|
|
45
|
+
private readonly opening = new Map<string, Promise<ViewerOpenResult>>();
|
|
46
|
+
|
|
47
|
+
constructor(
|
|
48
|
+
private readonly exec: Exec,
|
|
49
|
+
private readonly env: NodeJS.ProcessEnv = process.env,
|
|
50
|
+
) {}
|
|
51
|
+
|
|
52
|
+
async probe(): Promise<HerdrCapability> {
|
|
53
|
+
if (this.env.HERDR_ENV !== "1") {
|
|
54
|
+
return { available: false, reason: "Pi is not running in Herdr." };
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await this.currentPane();
|
|
58
|
+
const plugin = await this.runJson("herdr", [
|
|
59
|
+
"plugin",
|
|
60
|
+
"list",
|
|
61
|
+
"--plugin",
|
|
62
|
+
HERDR_PLUGIN_ID,
|
|
63
|
+
"--json",
|
|
64
|
+
]);
|
|
65
|
+
if (!pluginIsEnabled(plugin)) {
|
|
66
|
+
return {
|
|
67
|
+
available: false,
|
|
68
|
+
reason: `Herdr plugin ${HERDR_PLUGIN_ID} is not linked and enabled.`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
await this.run("piw", ["--version"]);
|
|
72
|
+
return { available: true };
|
|
73
|
+
} catch (error) {
|
|
74
|
+
return { available: false, reason: errorMessage(error) };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async focusExisting(target: WorkflowViewTarget): Promise<boolean> {
|
|
79
|
+
return (await this.findAndFocus(target)) !== undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async open(
|
|
83
|
+
target: WorkflowViewTarget,
|
|
84
|
+
placement: ViewerPlacement,
|
|
85
|
+
cwd: string,
|
|
86
|
+
): Promise<ViewerOpenResult> {
|
|
87
|
+
const pending = this.opening.get(target.runId);
|
|
88
|
+
if (pending !== undefined) return await pending;
|
|
89
|
+
|
|
90
|
+
const opening = this.openOnce(target, placement, cwd).finally(() => {
|
|
91
|
+
if (this.opening.get(target.runId) === opening) this.opening.delete(target.runId);
|
|
92
|
+
});
|
|
93
|
+
this.opening.set(target.runId, opening);
|
|
94
|
+
return await opening;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private async openOnce(
|
|
98
|
+
target: WorkflowViewTarget,
|
|
99
|
+
placement: ViewerPlacement,
|
|
100
|
+
cwd: string,
|
|
101
|
+
): Promise<ViewerOpenResult> {
|
|
102
|
+
const existingPaneId = await this.findAndFocus(target);
|
|
103
|
+
if (existingPaneId !== undefined) {
|
|
104
|
+
return { paneId: existingPaneId, reused: true };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const caller = await this.currentPane();
|
|
108
|
+
if (placement === "workspace") {
|
|
109
|
+
const opened = await this.openWorkspace(target, cwd);
|
|
110
|
+
this.knownPanes.set(target.runId, opened.paneId);
|
|
111
|
+
return { ...opened, reused: false };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const opened = await this.openPluginPane(target, placement, caller);
|
|
115
|
+
if (placement === "left" || placement === "above") {
|
|
116
|
+
try {
|
|
117
|
+
await this.run("herdr", [
|
|
118
|
+
"pane",
|
|
119
|
+
"swap",
|
|
120
|
+
"--source-pane",
|
|
121
|
+
opened.paneId,
|
|
122
|
+
"--target-pane",
|
|
123
|
+
caller.paneId,
|
|
124
|
+
]);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
await this.closePane(opened.paneId);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.knownPanes.set(target.runId, opened.paneId);
|
|
131
|
+
return { paneId: opened.paneId, reused: false };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private async findAndFocus(target: WorkflowViewTarget): Promise<string | undefined> {
|
|
135
|
+
const knownPaneId = this.knownPanes.get(target.runId);
|
|
136
|
+
if (knownPaneId !== undefined) {
|
|
137
|
+
try {
|
|
138
|
+
await this.run("herdr", ["plugin", "pane", "focus", knownPaneId]);
|
|
139
|
+
return knownPaneId;
|
|
140
|
+
} catch {
|
|
141
|
+
this.knownPanes.delete(target.runId);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const existing = await this.find(target);
|
|
146
|
+
if (existing === undefined) return undefined;
|
|
147
|
+
try {
|
|
148
|
+
await this.run("herdr", ["plugin", "pane", "focus", existing.paneId]);
|
|
149
|
+
this.knownPanes.set(target.runId, existing.paneId);
|
|
150
|
+
return existing.paneId;
|
|
151
|
+
} catch {
|
|
152
|
+
// The pane can close between the snapshot and focus request.
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async find(target: WorkflowViewTarget): Promise<HerdrPane | undefined> {
|
|
158
|
+
const snapshot = await this.runJson("herdr", ["api", "snapshot"]);
|
|
159
|
+
return snapshotPanes(snapshot).find((pane) => pane.label === viewerPaneLabel(target.runId));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private async currentPane(): Promise<HerdrPane> {
|
|
163
|
+
return parseCurrentPane(await this.runJson("herdr", ["pane", "current", "--current"]));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private async openPluginPane(
|
|
167
|
+
target: WorkflowViewTarget,
|
|
168
|
+
placement: Exclude<ViewerPlacement, "workspace">,
|
|
169
|
+
caller: HerdrPane,
|
|
170
|
+
): Promise<OpenedPane> {
|
|
171
|
+
const args = [
|
|
172
|
+
"plugin",
|
|
173
|
+
"pane",
|
|
174
|
+
"open",
|
|
175
|
+
"--plugin",
|
|
176
|
+
HERDR_PLUGIN_ID,
|
|
177
|
+
"--entrypoint",
|
|
178
|
+
HERDR_PLUGIN_ENTRYPOINT,
|
|
179
|
+
"--env",
|
|
180
|
+
`PI_WORKFLOWS_RUN_ID=${target.runId}`,
|
|
181
|
+
"--env",
|
|
182
|
+
`PI_WORKFLOWS_RUN_DIR=${target.runDir}`,
|
|
183
|
+
"--focus",
|
|
184
|
+
];
|
|
185
|
+
if (placement === "tab") {
|
|
186
|
+
args.push("--placement", "tab", "--workspace", caller.workspaceId);
|
|
187
|
+
} else {
|
|
188
|
+
args.push(
|
|
189
|
+
"--placement",
|
|
190
|
+
"split",
|
|
191
|
+
"--target-pane",
|
|
192
|
+
caller.paneId,
|
|
193
|
+
"--direction",
|
|
194
|
+
placement === "below" || placement === "above" ? "down" : "right",
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
return parseOpenedPane(await this.runJson("herdr", args));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private async openWorkspace(
|
|
201
|
+
target: WorkflowViewTarget,
|
|
202
|
+
cwd: string,
|
|
203
|
+
): Promise<{ paneId: string; warning?: string }> {
|
|
204
|
+
const created = parseCreatedWorkspace(
|
|
205
|
+
await this.runJson("herdr", [
|
|
206
|
+
"workspace",
|
|
207
|
+
"create",
|
|
208
|
+
"--cwd",
|
|
209
|
+
cwd,
|
|
210
|
+
"--label",
|
|
211
|
+
workspaceLabel(target.workflowName),
|
|
212
|
+
"--no-focus",
|
|
213
|
+
]),
|
|
214
|
+
);
|
|
215
|
+
let opened: OpenedPane;
|
|
216
|
+
try {
|
|
217
|
+
opened = parseOpenedPane(
|
|
218
|
+
await this.runJson("herdr", [
|
|
219
|
+
"plugin",
|
|
220
|
+
"pane",
|
|
221
|
+
"open",
|
|
222
|
+
"--plugin",
|
|
223
|
+
HERDR_PLUGIN_ID,
|
|
224
|
+
"--entrypoint",
|
|
225
|
+
HERDR_PLUGIN_ENTRYPOINT,
|
|
226
|
+
"--placement",
|
|
227
|
+
"tab",
|
|
228
|
+
"--workspace",
|
|
229
|
+
created.workspaceId,
|
|
230
|
+
"--env",
|
|
231
|
+
`PI_WORKFLOWS_RUN_ID=${target.runId}`,
|
|
232
|
+
"--env",
|
|
233
|
+
`PI_WORKFLOWS_RUN_DIR=${target.runDir}`,
|
|
234
|
+
"--focus",
|
|
235
|
+
]),
|
|
236
|
+
);
|
|
237
|
+
} catch (error) {
|
|
238
|
+
await this.run("herdr", ["workspace", "close", created.workspaceId]).catch(() => undefined);
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
try {
|
|
243
|
+
await this.run("herdr", ["tab", "close", created.bootstrapTabId]);
|
|
244
|
+
return { paneId: opened.paneId };
|
|
245
|
+
} catch (error) {
|
|
246
|
+
return {
|
|
247
|
+
paneId: opened.paneId,
|
|
248
|
+
warning: `The piw viewer opened, but its empty bootstrap tab could not be closed: ${errorMessage(error)}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
private async closePane(paneId: string): Promise<void> {
|
|
254
|
+
await this.run("herdr", ["plugin", "pane", "close", paneId]).catch(() => undefined);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private async run(command: string, args: string[]): Promise<string> {
|
|
258
|
+
const result = await this.exec(command, args, { timeout: COMMAND_TIMEOUT_MS });
|
|
259
|
+
if (result.killed) {
|
|
260
|
+
throw new Error(`${command} timed out.`);
|
|
261
|
+
}
|
|
262
|
+
if (result.code !== 0) {
|
|
263
|
+
const message = result.stderr.trim() || result.stdout.trim() || `exit ${result.code}`;
|
|
264
|
+
throw new Error(`${command} failed: ${boundedText(message)}`);
|
|
265
|
+
}
|
|
266
|
+
return result.stdout;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private async runJson(command: string, args: string[]): Promise<unknown> {
|
|
270
|
+
const stdout = await this.run(command, args);
|
|
271
|
+
if (stdout.length > MAX_JSON_CHARS) {
|
|
272
|
+
throw new Error(`${command} returned too much data.`);
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
return JSON.parse(stdout) as unknown;
|
|
276
|
+
} catch {
|
|
277
|
+
throw new Error(`${command} returned invalid JSON.`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export function parseViewerPlacement(value: string): ViewerPlacement | undefined {
|
|
283
|
+
return VIEWER_PLACEMENTS.find((placement) => placement === value);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export function viewerPaneLabel(runId: string): string {
|
|
287
|
+
return `${VIEWER_LABEL_PREFIX}${runId}`;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function pluginIsEnabled(value: unknown): boolean {
|
|
291
|
+
const result = recordValue(value, "result");
|
|
292
|
+
const plugins = result === undefined ? undefined : arrayValue(result, "plugins");
|
|
293
|
+
return (
|
|
294
|
+
plugins?.some(
|
|
295
|
+
(plugin) =>
|
|
296
|
+
recordValue(plugin, "plugin_id") === HERDR_PLUGIN_ID &&
|
|
297
|
+
recordValue(plugin, "enabled") === true,
|
|
298
|
+
) === true
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function parseCurrentPane(value: unknown): HerdrPane {
|
|
303
|
+
const result = requiredRecord(value, "result", "Herdr pane response");
|
|
304
|
+
return paneFromValue(requiredRecord(result, "pane", "Herdr pane response"));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function parseOpenedPane(value: unknown): OpenedPane {
|
|
308
|
+
const result = requiredRecord(value, "result", "Herdr plugin pane response");
|
|
309
|
+
const pluginPane = requiredRecord(result, "plugin_pane", "Herdr plugin pane response");
|
|
310
|
+
return paneFromValue(requiredRecord(pluginPane, "pane", "Herdr plugin pane response"));
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function parseCreatedWorkspace(value: unknown): {
|
|
314
|
+
workspaceId: string;
|
|
315
|
+
bootstrapTabId: string;
|
|
316
|
+
} {
|
|
317
|
+
const result = requiredRecord(value, "result", "Herdr workspace response");
|
|
318
|
+
const workspace = requiredRecord(result, "workspace", "Herdr workspace response");
|
|
319
|
+
const rootPane = requiredRecord(result, "root_pane", "Herdr workspace response");
|
|
320
|
+
return {
|
|
321
|
+
workspaceId: requiredString(workspace, "workspace_id", "Herdr workspace response"),
|
|
322
|
+
bootstrapTabId: requiredString(rootPane, "tab_id", "Herdr workspace response"),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function snapshotPanes(value: unknown): HerdrPane[] {
|
|
327
|
+
const result = requiredRecord(value, "result", "Herdr snapshot");
|
|
328
|
+
const snapshot = requiredRecord(result, "snapshot", "Herdr snapshot");
|
|
329
|
+
const panes = arrayValue(snapshot, "panes");
|
|
330
|
+
if (panes === undefined) throw new Error("Herdr snapshot has no panes.");
|
|
331
|
+
return panes.flatMap((pane) => {
|
|
332
|
+
try {
|
|
333
|
+
return [paneFromValue(pane)];
|
|
334
|
+
} catch {
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function paneFromValue(value: unknown): HerdrPane {
|
|
341
|
+
if (!isRecord(value)) throw new Error("Herdr returned an invalid pane.");
|
|
342
|
+
const label = recordValue(value, "label");
|
|
343
|
+
return {
|
|
344
|
+
paneId: requiredString(value, "pane_id", "Herdr pane"),
|
|
345
|
+
tabId: requiredString(value, "tab_id", "Herdr pane"),
|
|
346
|
+
workspaceId: requiredString(value, "workspace_id", "Herdr pane"),
|
|
347
|
+
...(typeof label === "string" ? { label } : {}),
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function workspaceLabel(workflowName: string): string {
|
|
352
|
+
const compact = workflowName.replace(/[\r\n\t]+/gu, " ").trim();
|
|
353
|
+
return `piw · ${(compact || "workflow").slice(0, 60)}`;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function requiredRecord(value: unknown, key: string, label: string): Record<string, unknown> {
|
|
357
|
+
if (!isRecord(value)) throw new Error(`${label} is invalid.`);
|
|
358
|
+
const nested = value[key];
|
|
359
|
+
if (!isRecord(nested)) throw new Error(`${label} has no ${key}.`);
|
|
360
|
+
return nested;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function requiredString(value: Record<string, unknown>, key: string, label: string): string {
|
|
364
|
+
const nested = value[key];
|
|
365
|
+
if (typeof nested !== "string" || nested.length === 0) {
|
|
366
|
+
throw new Error(`${label} has no ${key}.`);
|
|
367
|
+
}
|
|
368
|
+
return nested;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function recordValue(value: unknown, key: string): unknown {
|
|
372
|
+
return isRecord(value) ? value[key] : undefined;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function arrayValue(value: unknown, key: string): unknown[] | undefined {
|
|
376
|
+
const nested = recordValue(value, key);
|
|
377
|
+
return Array.isArray(nested) ? nested : undefined;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
381
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function boundedText(value: string): string {
|
|
385
|
+
const compact = value
|
|
386
|
+
.replace(/[\r\n\t]+/gu, " ")
|
|
387
|
+
.replace(/ +/gu, " ")
|
|
388
|
+
.trim();
|
|
389
|
+
return compact.length <= 300 ? compact : `${compact.slice(0, 299)}…`;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
function errorMessage(error: unknown): string {
|
|
393
|
+
return error instanceof Error ? error.message : String(error);
|
|
394
|
+
}
|