@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 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.
@@ -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
@@ -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;AAErD,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;AAUD,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAyE3B"}
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":"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"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
package/openapi.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenAgent Harness API
4
- version: 0.1.1
4
+ version: 0.2.2
5
5
  description: >-
6
6
  Behavior-free public contract for a private OpenAgent runtime process.
7
7
  All endpoints require a process-scoped Bearer token and are served only on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bang404/openagent-harness",
3
- "version": "0.1.1",
3
+ "version": "0.2.2",
4
4
  "description": "Thin client for the private OpenAgent harness runtime",
5
5
  "license": "MIT",
6
6
  "repository": {