@bang404/openagent-harness 0.1.1 → 0.2.2
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 +25 -0
- package/dist/binary.d.ts +32 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +91 -0
- package/dist/binary.js.map +1 -0
- package/dist/node.d.ts +11 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +36 -0
- package/dist/node.js.map +1 -1
- package/openapi.yaml +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,5 +18,30 @@ console.log(result.status);
|
|
|
18
18
|
await agent.stop();
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
+
Callers that do not vendor a server executable can install the correct release
|
|
22
|
+
artifact from the machine-readable SDK manifest before spawning it. The helper
|
|
23
|
+
checks the Harness protocol range, byte length, and SHA-256 before atomically
|
|
24
|
+
activating the versioned executable:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { installOpenAgentBinary, spawnOpenAgent } from "@bang404/openagent-harness/node";
|
|
28
|
+
|
|
29
|
+
const installed = await installOpenAgentBinary({
|
|
30
|
+
manifestUrl: process.env.OPENAGENT_SDK_MANIFEST!,
|
|
31
|
+
installDirectory: ".openagent-sdk",
|
|
32
|
+
headers: { authorization: `Bearer ${process.env.GITHUB_TOKEN}` },
|
|
33
|
+
});
|
|
34
|
+
const agent = await spawnOpenAgent({
|
|
35
|
+
binaryPath: installed.path,
|
|
36
|
+
workspace: process.cwd(),
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
For development tools or long-running hosts, `spawnReloadableOpenAgent` exposes
|
|
41
|
+
an explicit process-reload boundary. Finish or cancel active runs, install a
|
|
42
|
+
verified newer binary, then call `reload(installed.path)`; durable conversations
|
|
43
|
+
remain in `OPENAGENT_HOME`, while in-memory runs intentionally do not cross the
|
|
44
|
+
process boundary.
|
|
45
|
+
|
|
21
46
|
The daemon listens on an ephemeral loopback port and uses a process-scoped
|
|
22
47
|
Bearer token. Do not expose the endpoint or token to untrusted code.
|
package/dist/binary.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type OpenAgentBinaryTarget = "linux-x64" | "macos-arm64" | "macos-x64" | "windows-x64";
|
|
2
|
+
export interface OpenAgentBinaryArtifact {
|
|
3
|
+
file: string;
|
|
4
|
+
sha256: string;
|
|
5
|
+
size: number;
|
|
6
|
+
}
|
|
7
|
+
export interface OpenAgentBinaryManifest {
|
|
8
|
+
schema_version: 1;
|
|
9
|
+
version: string;
|
|
10
|
+
sdk_sha?: string;
|
|
11
|
+
protocol: {
|
|
12
|
+
min: number;
|
|
13
|
+
max: number;
|
|
14
|
+
};
|
|
15
|
+
artifacts: Record<OpenAgentBinaryTarget, OpenAgentBinaryArtifact>;
|
|
16
|
+
}
|
|
17
|
+
export interface InstallOpenAgentBinaryOptions {
|
|
18
|
+
manifestUrl: string;
|
|
19
|
+
installDirectory: string;
|
|
20
|
+
target?: OpenAgentBinaryTarget;
|
|
21
|
+
fetch?: typeof fetch;
|
|
22
|
+
headers?: HeadersInit;
|
|
23
|
+
}
|
|
24
|
+
export interface InstalledOpenAgentBinary {
|
|
25
|
+
path: string;
|
|
26
|
+
target: OpenAgentBinaryTarget;
|
|
27
|
+
version: string;
|
|
28
|
+
manifest: OpenAgentBinaryManifest;
|
|
29
|
+
}
|
|
30
|
+
export declare function currentOpenAgentBinaryTarget(platform?: NodeJS.Platform, architecture?: NodeJS.Architecture): OpenAgentBinaryTarget;
|
|
31
|
+
export declare function installOpenAgentBinary(options: InstallOpenAgentBinaryOptions): Promise<InstalledOpenAgentBinary>;
|
|
32
|
+
//# sourceMappingURL=binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,aAAa,GACb,WAAW,GACX,aAAa,CAAC;AAElB,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,uBAAuB,CAAC;CACnC;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,kBAAmB,EAC3B,YAAY,sBAAe,GAC1B,qBAAqB,CAMvB;AA4BD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,wBAAwB,CAAC,CAkDnC"}
|
package/dist/binary.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { OPENAGENT_HARNESS_PROTOCOL_VERSION } from "./types.js";
|
|
5
|
+
export function currentOpenAgentBinaryTarget(platform = process.platform, architecture = process.arch) {
|
|
6
|
+
if (platform === "win32" && architecture === "x64")
|
|
7
|
+
return "windows-x64";
|
|
8
|
+
if (platform === "linux" && architecture === "x64")
|
|
9
|
+
return "linux-x64";
|
|
10
|
+
if (platform === "darwin" && architecture === "arm64")
|
|
11
|
+
return "macos-arm64";
|
|
12
|
+
if (platform === "darwin" && architecture === "x64")
|
|
13
|
+
return "macos-x64";
|
|
14
|
+
throw new Error(`OpenAgent server has no published binary for ${platform}/${architecture}`);
|
|
15
|
+
}
|
|
16
|
+
function validateManifest(value) {
|
|
17
|
+
const manifest = value;
|
|
18
|
+
if (manifest.schema_version !== 1 || !manifest.version || !manifest.protocol || !manifest.artifacts) {
|
|
19
|
+
throw new Error("Invalid OpenAgent server manifest");
|
|
20
|
+
}
|
|
21
|
+
if (OPENAGENT_HARNESS_PROTOCOL_VERSION < manifest.protocol.min
|
|
22
|
+
|| OPENAGENT_HARNESS_PROTOCOL_VERSION > manifest.protocol.max) {
|
|
23
|
+
throw new Error(`OpenAgent protocol ${OPENAGENT_HARNESS_PROTOCOL_VERSION} is incompatible with server ${manifest.protocol.min}-${manifest.protocol.max}`);
|
|
24
|
+
}
|
|
25
|
+
return manifest;
|
|
26
|
+
}
|
|
27
|
+
async function verified(path, artifact) {
|
|
28
|
+
try {
|
|
29
|
+
const bytes = await readFile(path);
|
|
30
|
+
return bytes.byteLength === artifact.size
|
|
31
|
+
&& createHash("sha256").update(bytes).digest("hex") === artifact.sha256;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function installOpenAgentBinary(options) {
|
|
38
|
+
const fetchRequest = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
39
|
+
const manifestResponse = await fetchRequest(options.manifestUrl, { headers: options.headers });
|
|
40
|
+
if (!manifestResponse.ok) {
|
|
41
|
+
throw new Error(`Failed to download OpenAgent server manifest: ${manifestResponse.status}`);
|
|
42
|
+
}
|
|
43
|
+
const manifest = validateManifest(await manifestResponse.json());
|
|
44
|
+
const target = options.target ?? currentOpenAgentBinaryTarget();
|
|
45
|
+
const artifact = manifest.artifacts[target];
|
|
46
|
+
if (!artifact || basename(artifact.file) !== artifact.file) {
|
|
47
|
+
throw new Error(`OpenAgent server manifest has no safe artifact for ${target}`);
|
|
48
|
+
}
|
|
49
|
+
const versionDirectory = join(options.installDirectory, manifest.version, target);
|
|
50
|
+
const destination = join(versionDirectory, artifact.file);
|
|
51
|
+
if (await verified(destination, artifact)) {
|
|
52
|
+
return { path: destination, target, version: manifest.version, manifest };
|
|
53
|
+
}
|
|
54
|
+
const artifactUrl = new URL(artifact.file, options.manifestUrl).toString();
|
|
55
|
+
const response = await fetchRequest(artifactUrl, { headers: options.headers });
|
|
56
|
+
if (!response.ok)
|
|
57
|
+
throw new Error(`Failed to download OpenAgent server binary: ${response.status}`);
|
|
58
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
59
|
+
if (bytes.byteLength !== artifact.size)
|
|
60
|
+
throw new Error("OpenAgent server binary size mismatch");
|
|
61
|
+
if (createHash("sha256").update(bytes).digest("hex") !== artifact.sha256) {
|
|
62
|
+
throw new Error("OpenAgent server binary checksum mismatch");
|
|
63
|
+
}
|
|
64
|
+
const staging = `${versionDirectory}.staging-${process.pid}-${Date.now()}`;
|
|
65
|
+
await rm(staging, { recursive: true, force: true });
|
|
66
|
+
await mkdir(staging, { recursive: true });
|
|
67
|
+
const stagedBinary = join(staging, artifact.file);
|
|
68
|
+
try {
|
|
69
|
+
await writeFile(stagedBinary, bytes);
|
|
70
|
+
if (process.platform !== "win32")
|
|
71
|
+
await chmod(stagedBinary, 0o755);
|
|
72
|
+
await mkdir(join(options.installDirectory, manifest.version), { recursive: true });
|
|
73
|
+
try {
|
|
74
|
+
await rename(staging, versionDirectory);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (await verified(destination, artifact)) {
|
|
78
|
+
await rm(staging, { recursive: true, force: true });
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
await rm(staging, { recursive: true, force: true });
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
return { path: destination, target, version: manifest.version, manifest };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"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"}
|
package/dist/node.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ChildProcessWithoutNullStreams } from "node:child_process";
|
|
2
2
|
import { OpenAgentHarnessClient } from "./client.js";
|
|
3
|
+
export { currentOpenAgentBinaryTarget, installOpenAgentBinary, type InstallOpenAgentBinaryOptions, type InstalledOpenAgentBinary, type OpenAgentBinaryManifest, type OpenAgentBinaryTarget, } from "./binary.js";
|
|
3
4
|
export interface SpawnOpenAgentOptions {
|
|
4
5
|
binaryPath?: string;
|
|
5
6
|
workspace: string;
|
|
@@ -15,5 +16,15 @@ export interface SpawnedOpenAgent {
|
|
|
15
16
|
process: ChildProcessWithoutNullStreams;
|
|
16
17
|
stop(): Promise<void>;
|
|
17
18
|
}
|
|
19
|
+
export interface ReloadableOpenAgent {
|
|
20
|
+
readonly current: SpawnedOpenAgent;
|
|
21
|
+
reload(binaryPath?: string): Promise<SpawnedOpenAgent>;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
}
|
|
18
24
|
export declare function spawnOpenAgent(options: SpawnOpenAgentOptions): Promise<SpawnedOpenAgent>;
|
|
25
|
+
/**
|
|
26
|
+
* Supervises a versioned server process. Reload deliberately crosses a process
|
|
27
|
+
* boundary: the old process stops before the new binary opens durable state.
|
|
28
|
+
*/
|
|
29
|
+
export declare function spawnReloadableOpenAgent(options: SpawnOpenAgentOptions): Promise<ReloadableOpenAgent>;
|
|
19
30
|
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEhF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,8BAA8B,CAAC;IACxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAUD,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAyE3B;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA+B9B"}
|
package/dist/node.js
CHANGED
|
@@ -2,6 +2,7 @@ import { randomBytes } from "node:crypto";
|
|
|
2
2
|
import { spawn } from "node:child_process";
|
|
3
3
|
import { createInterface } from "node:readline";
|
|
4
4
|
import { OpenAgentHarnessClient } from "./client.js";
|
|
5
|
+
export { currentOpenAgentBinaryTarget, installOpenAgentBinary, } from "./binary.js";
|
|
5
6
|
export async function spawnOpenAgent(options) {
|
|
6
7
|
const binaryPath = options.binaryPath ?? "openagent-server";
|
|
7
8
|
const token = randomBytes(32).toString("hex");
|
|
@@ -72,4 +73,39 @@ export async function spawnOpenAgent(options) {
|
|
|
72
73
|
stop,
|
|
73
74
|
};
|
|
74
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Supervises a versioned server process. Reload deliberately crosses a process
|
|
78
|
+
* boundary: the old process stops before the new binary opens durable state.
|
|
79
|
+
*/
|
|
80
|
+
export async function spawnReloadableOpenAgent(options) {
|
|
81
|
+
let binaryPath = options.binaryPath;
|
|
82
|
+
let current = await spawnOpenAgent(options);
|
|
83
|
+
return {
|
|
84
|
+
get current() {
|
|
85
|
+
return current;
|
|
86
|
+
},
|
|
87
|
+
async reload(nextBinaryPath = binaryPath) {
|
|
88
|
+
const previousBinaryPath = binaryPath;
|
|
89
|
+
await current.stop();
|
|
90
|
+
try {
|
|
91
|
+
const replacement = await spawnOpenAgent({ ...options, binaryPath: nextBinaryPath });
|
|
92
|
+
binaryPath = nextBinaryPath;
|
|
93
|
+
current = replacement;
|
|
94
|
+
return current;
|
|
95
|
+
}
|
|
96
|
+
catch (replacementError) {
|
|
97
|
+
try {
|
|
98
|
+
current = await spawnOpenAgent({ ...options, binaryPath: previousBinaryPath });
|
|
99
|
+
}
|
|
100
|
+
catch (rollbackError) {
|
|
101
|
+
throw new AggregateError([replacementError, rollbackError], "OpenAgent server reload and rollback both failed");
|
|
102
|
+
}
|
|
103
|
+
throw replacementError;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
async stop() {
|
|
107
|
+
await current.stop();
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
75
111
|
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|
package/openapi.yaml
CHANGED