@pi-harness/pi-harness 0.1.105 → 0.1.107
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 +8 -2
- package/apps/web/dist/assets/index-BmTAbGqy.css +2 -0
- package/apps/web/dist/assets/index-DcIlupbZ.js +29 -0
- package/apps/web/dist/index.html +2 -2
- package/apps/web/package.json +1 -1
- package/apps/web/server-dist/bin.js +18 -2
- package/apps/web/server-dist/bin.js.map +1 -1
- package/apps/web/src/server/bin.ts +17 -2
- package/apps/web/src/style.css +27 -0
- package/apps/web/test/bin.test.ts +9 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/at-file.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/dependency-checker.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/image-compressor.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/skill-guard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/workspace-search.json +1 -1
- package/node_modules/@pi-harness/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -1
- package/node_modules/@pi-harness/api-gateway/package.json +1 -1
- package/node_modules/@pi-harness/cli/package.json +1 -1
- package/node_modules/@pi-harness/host-webserver/package.json +1 -1
- package/node_modules/@pi-harness/web-app/package.json +1 -1
- package/package.json +6 -6
- package/packages/api-gateway/dist/marketplace-entries/official/archify.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/at-file.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/browser-session.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/code2skill.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/cost-meter.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/dependency-checker.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/git-time-capsule.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/graph-memory.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/i18n-pair.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/image-compressor.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/mcp-panel.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/memory.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/modlens.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/module-search.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/plugin-check.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/prompt-library.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/readme-gen.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/recall-unread.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/secure-audit.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-bridge.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-compare.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-export.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/session-search.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/skill-catalog.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/skill-guard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/tab-manager.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/taskboard.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/undo-savepoint.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/workspace-search.json +1 -1
- package/packages/api-gateway/dist/marketplace-entries/official/yaml-validator.json +1 -1
- package/packages/api-gateway/package.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/archify.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/at-file.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/browser-session.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/code2skill.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/cost-meter.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/dependency-checker.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/git-time-capsule.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/graph-memory.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/i18n-pair.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/image-compressor.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/mcp-panel.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/memory.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/modlens.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/module-search.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/plugin-check.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/prompt-library.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/readme-gen.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/recall-unread.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/secure-audit.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-bridge.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-compare.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-export.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/session-search.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/skill-catalog.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/skill-guard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/tab-manager.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/taskboard.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/undo-savepoint.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/workspace-search.json +1 -1
- package/packages/api-gateway/src/marketplace-entries/official/yaml-validator.json +1 -1
- package/packages/bundle-web-app/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/host-webserver/package.json +1 -1
- package/apps/web/dist/assets/index-CKkqTVMe.js +0 -29
- package/apps/web/dist/assets/index-CLo26FPf.css +0 -2
package/apps/web/dist/index.html
CHANGED
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
<link rel="apple-touch-icon" href="/icons/app/apple-touch-icon-180.png" sizes="180x180" />
|
|
16
16
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
17
17
|
<title>Pi Harness / Control Room</title>
|
|
18
|
-
<script type="module" crossorigin src="/assets/index-
|
|
18
|
+
<script type="module" crossorigin src="/assets/index-DcIlupbZ.js"></script>
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/react-vendor-BxoMtjVy.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/markdown-vendor-DUdMWn0M.js">
|
|
21
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
21
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BmTAbGqy.css">
|
|
22
22
|
</head>
|
|
23
23
|
<body>
|
|
24
24
|
<main id="root"></main>
|
package/apps/web/package.json
CHANGED
|
@@ -7,11 +7,27 @@ import "@pi-harness/host-webserver";
|
|
|
7
7
|
// An unhandled 'error' event on a stream throws, so an EPIPE from a reader that closed early (`pi-harness | head -1`) would kill the process before the signal handlers can run the graceful shutdown. Swallowing the event leaves the write silently dropped, which is what a closed pipe means.
|
|
8
8
|
process.stdout.on("error", () => { });
|
|
9
9
|
process.stderr.on("error", () => { });
|
|
10
|
+
function commandLineValue(args, name) {
|
|
11
|
+
const prefix = `${name}=`;
|
|
12
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
13
|
+
const argument = args[index];
|
|
14
|
+
if (argument === name) {
|
|
15
|
+
const value = args[index + 1];
|
|
16
|
+
if (value === undefined || value.startsWith("--"))
|
|
17
|
+
throw new Error(`${name} requires a value`);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
if (argument?.startsWith(prefix))
|
|
21
|
+
return argument.slice(prefix.length);
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
const commandLineArgs = process.argv.slice(2);
|
|
10
26
|
// Accept the bracketed URL form of an IPv6 literal (e.g. "[::1]") but bind the bare address: net.Server.listen resolves the host through getaddrinfo, which rejects brackets with ENOTFOUND.
|
|
11
|
-
const rawHost = process.env.PI_HARNESS_HOST ?? "127.0.0.1";
|
|
27
|
+
const rawHost = commandLineValue(commandLineArgs, "--host") ?? process.env.PI_HARNESS_HOST ?? "127.0.0.1";
|
|
12
28
|
const host = rawHost.startsWith("[") && rawHost.endsWith("]") ? rawHost.slice(1, -1) : rawHost;
|
|
13
29
|
const DEFAULT_PI_HARNESS_PORT = 3141;
|
|
14
|
-
const port = Number(process.env.PI_HARNESS_PORT ?? DEFAULT_PI_HARNESS_PORT);
|
|
30
|
+
const port = Number(commandLineValue(commandLineArgs, "--port") ?? process.env.PI_HARNESS_PORT ?? DEFAULT_PI_HARNESS_PORT);
|
|
15
31
|
if (!Number.isInteger(port) || port < 0 || port > 65_535)
|
|
16
32
|
throw new Error("PI_HARNESS_PORT must be an integer between 0 and 65535");
|
|
17
33
|
const loopbackHosts = new Set(["127.0.0.1", "localhost", "::1", "[::1]"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/server/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC9G,OAAO,4BAA4B,CAAC;AAMpC,kSAAkS;AAClS,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAErC,6LAA6L;AAC7L,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/server/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,26 @@ type HarnessWebServer = WebServer;
|
|
|
14
14
|
process.stdout.on("error", () => {});
|
|
15
15
|
process.stderr.on("error", () => {});
|
|
16
16
|
|
|
17
|
+
function commandLineValue(args: readonly string[], name: string): string | undefined {
|
|
18
|
+
const prefix = `${name}=`;
|
|
19
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
20
|
+
const argument = args[index];
|
|
21
|
+
if (argument === name) {
|
|
22
|
+
const value = args[index + 1];
|
|
23
|
+
if (value === undefined || value.startsWith("--")) throw new Error(`${name} requires a value`);
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
if (argument?.startsWith(prefix)) return argument.slice(prefix.length);
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const commandLineArgs = process.argv.slice(2);
|
|
17
32
|
// Accept the bracketed URL form of an IPv6 literal (e.g. "[::1]") but bind the bare address: net.Server.listen resolves the host through getaddrinfo, which rejects brackets with ENOTFOUND.
|
|
18
|
-
const rawHost = process.env.PI_HARNESS_HOST ?? "127.0.0.1";
|
|
33
|
+
const rawHost = commandLineValue(commandLineArgs, "--host") ?? process.env.PI_HARNESS_HOST ?? "127.0.0.1";
|
|
19
34
|
const host = rawHost.startsWith("[") && rawHost.endsWith("]") ? rawHost.slice(1, -1) : rawHost;
|
|
20
35
|
const DEFAULT_PI_HARNESS_PORT = 3141;
|
|
21
|
-
const port = Number(process.env.PI_HARNESS_PORT ?? DEFAULT_PI_HARNESS_PORT);
|
|
36
|
+
const port = Number(commandLineValue(commandLineArgs, "--port") ?? process.env.PI_HARNESS_PORT ?? DEFAULT_PI_HARNESS_PORT);
|
|
22
37
|
if (!Number.isInteger(port) || port < 0 || port > 65_535) throw new Error("PI_HARNESS_PORT must be an integer between 0 and 65535");
|
|
23
38
|
const loopbackHosts = new Set(["127.0.0.1", "localhost", "::1", "[::1]"]);
|
|
24
39
|
if (!loopbackHosts.has(host) && process.env.PI_HARNESS_ALLOW_REMOTE !== "1")
|
package/apps/web/src/style.css
CHANGED
|
@@ -754,6 +754,33 @@ button:disabled {
|
|
|
754
754
|
border-radius: 50%;
|
|
755
755
|
animation: spin-smooth 0.8s linear infinite;
|
|
756
756
|
}
|
|
757
|
+
|
|
758
|
+
.streaming-logo {
|
|
759
|
+
width: 1.4rem;
|
|
760
|
+
height: 1.4rem;
|
|
761
|
+
display: inline-grid;
|
|
762
|
+
place-items: center;
|
|
763
|
+
animation: streaming-logo-pulse 1.4s ease-in-out infinite;
|
|
764
|
+
}
|
|
765
|
+
.streaming-logo img {
|
|
766
|
+
width: 100%;
|
|
767
|
+
height: 100%;
|
|
768
|
+
object-fit: contain;
|
|
769
|
+
}
|
|
770
|
+
.streaming-logo-responding {
|
|
771
|
+
animation-duration: 0.8s;
|
|
772
|
+
transform: rotate(8deg);
|
|
773
|
+
}
|
|
774
|
+
.streaming-logo-tool {
|
|
775
|
+
animation-duration: 2s;
|
|
776
|
+
transform: rotate(-8deg);
|
|
777
|
+
}
|
|
778
|
+
@keyframes streaming-logo-pulse {
|
|
779
|
+
50% {
|
|
780
|
+
transform: scale(1.16) rotate(-4deg);
|
|
781
|
+
filter: drop-shadow(0 0 8px currentColor);
|
|
782
|
+
}
|
|
783
|
+
}
|
|
757
784
|
.reasoning-head::after {
|
|
758
785
|
content: "...";
|
|
759
786
|
display: inline-block;
|
|
@@ -42,10 +42,11 @@ async function runLauncher(
|
|
|
42
42
|
extraEnv: Record<string, string> = {},
|
|
43
43
|
spawnCwd?: string,
|
|
44
44
|
probe?: (consoleUrl: string) => Promise<void>,
|
|
45
|
+
args: readonly string[] = [],
|
|
45
46
|
): Promise<LauncherRun> {
|
|
46
47
|
const agentDir = await makeTempDir("agent");
|
|
47
48
|
const harnessHome = await makeTempDir("home");
|
|
48
|
-
const child = spawn(process.execPath, [BIN], {
|
|
49
|
+
const child = spawn(process.execPath, [BIN, ...args], {
|
|
49
50
|
stdio: ["ignore", "pipe", "pipe"],
|
|
50
51
|
...(spawnCwd === undefined ? {} : { cwd: spawnCwd }),
|
|
51
52
|
env: {
|
|
@@ -150,6 +151,13 @@ async function reserveLoopbackPort(): Promise<number> {
|
|
|
150
151
|
}
|
|
151
152
|
|
|
152
153
|
describe("web launcher", () => {
|
|
154
|
+
test("accepts a --port argument forwarded by the local launcher", async () => {
|
|
155
|
+
const port = await reserveLoopbackPort();
|
|
156
|
+
const run = await runLauncher("SIGINT", { PI_HARNESS_PORT: "0" }, undefined, undefined, ["--port", String(port)]);
|
|
157
|
+
expect(run.consoleUrl).toBe(`http://127.0.0.1:${String(port)}`);
|
|
158
|
+
expect(run.code).toBe(130);
|
|
159
|
+
}, 30_000);
|
|
160
|
+
|
|
153
161
|
test("completes graceful shutdown on SIGINT and exits with code 130 instead of dying by signal", async () => {
|
|
154
162
|
const run = await runLauncher("SIGINT");
|
|
155
163
|
expect(run.consoleUrl).toMatch(/^http:\/\/127\.0\.0\.1:\d+$/u);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dependency-checker",
|
|
3
3
|
"packageName": "@pi-harness/plugin-dependency-checker",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.31",
|
|
5
5
|
"name": "Dependency Checker",
|
|
6
6
|
"description": "离线只读检查工作区的 package.json 与 requirements*.txt:本地是否已安装、重复声明是否一致、约束能否解析。",
|
|
7
7
|
"author": "Pi Harness",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/pi-harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.107",
|
|
4
4
|
"homepage": "https://github.com/pi-harness/pi-harness#readme",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/pi-harness/pi-harness/issues"
|
|
@@ -58,11 +58,11 @@
|
|
|
58
58
|
"@earendil-works/pi-agent-core": "0.84.4",
|
|
59
59
|
"@earendil-works/pi-ai": "0.84.4",
|
|
60
60
|
"@earendil-works/pi-coding-agent": "0.84.4",
|
|
61
|
-
"@pi-harness/api-gateway": "0.1.
|
|
62
|
-
"@pi-harness/cli": "0.1.
|
|
63
|
-
"@pi-harness/core": "^0.1.
|
|
64
|
-
"@pi-harness/host-webserver": "0.1.
|
|
65
|
-
"@pi-harness/web-app": "0.1.
|
|
61
|
+
"@pi-harness/api-gateway": "0.1.107",
|
|
62
|
+
"@pi-harness/cli": "0.1.107",
|
|
63
|
+
"@pi-harness/core": "^0.1.107",
|
|
64
|
+
"@pi-harness/host-webserver": "0.1.107",
|
|
65
|
+
"@pi-harness/web-app": "0.1.107",
|
|
66
66
|
"semver": "7.8.5"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dependency-checker",
|
|
3
3
|
"packageName": "@pi-harness/plugin-dependency-checker",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.31",
|
|
5
5
|
"name": "Dependency Checker",
|
|
6
6
|
"description": "离线只读检查工作区的 package.json 与 requirements*.txt:本地是否已安装、重复声明是否一致、约束能否解析。",
|
|
7
7
|
"author": "Pi Harness",
|