rivetplane 0.2.3 → 0.3.0
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 -4
- package/dist/cli.js +42 -22
- package/dist/cli.js.map +1 -1
- package/dist/client.js +22 -5
- package/dist/client.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/opencode-export-discovery.js +749 -0
- package/dist/opencode-export-discovery.js.map +1 -0
- package/dist/registry.js +2 -2
- package/dist/registry.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Rivetplane CLI
|
|
2
2
|
|
|
3
|
-
Rivetplane connects local ACP-compatible and OpenCode agent sessions to a remote control plane. The client starts all remote connections. It does not open an internet-facing port
|
|
3
|
+
Rivetplane connects local ACP-compatible and OpenCode agent sessions to a remote control plane. The client starts all remote connections. It does not open an internet-facing port or start OpenCode by default.
|
|
4
4
|
|
|
5
5
|
## Use the client
|
|
6
6
|
|
|
@@ -8,12 +8,16 @@ Node.js 22 or later is required. Rivetplane tests and publishes releases on Node
|
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
10
|
npx rivetplane login
|
|
11
|
-
npx rivetplane
|
|
11
|
+
npx rivetplane
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
The login command uses `https://rivetplane.com`, opens the control plane in your browser, and stores a machine-scoped token in your user configuration directory. The second command starts ACP discovery,
|
|
14
|
+
The login command uses `https://rivetplane.com`, opens the control plane in your browser, and stores a machine-scoped token in your user configuration directory. The second command starts ACP discovery, read-only OpenCode export discovery, the local API, and the outbound relay. Keep it running while you use the control plane. Use `--server` only for a self-hosted control plane.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
When `opencode` is on `PATH`, Rivetplane uses `opencode debug scrap` to list known projects. It scans the seed directory, each accessible project worktree, and the global bucket. It combines session results by ID. `--opencode-directory` is a seed, not a project filter. The full index scan runs immediately and every 60 seconds by default. `--opencode-index-interval SECONDS` changes this normal bound. The 2-second transcript poll uses the cached index. It selects at most 48 active, recent, or probe sessions and exports at most 12 per poll, with priority for running sessions and pending requests. The startup probe is limited to the 48 most recently updated sessions. Old sessions remain listed, but other old transcripts are not exported automatically. Slow scans and partial failures increase the next index delay, up to five minutes. Diagnostics give the scan duration, backoff, candidate count, and export count.
|
|
17
|
+
|
|
18
|
+
Rivetplane uses an explicit scope limit of 200 and detects successful output that is invalid or stops at exactly 65,536 bytes. Full scopes use bounded pages through `opencode db` as a documented, schema-dependent compatibility fallback. A bounded file-backed retry protects large list and export output from pipe truncation. It relays stable transcript diffs and can detect running question tools and supported explicit permission requests. It uses no server, `jq`, or direct SQLite file access. Compact checkpoints in `~/.config/harness-cp/opencode-export-checkpoints.json` prevent replay after a restart.
|
|
19
|
+
|
|
20
|
+
Export discovery cannot resolve a Deferred in the original OpenCode process. Exported sessions are marked read-only. Answer questions and approvals in that original process. Use `npx rivetplane opencode` for the explicit managed server and attached-TUI mode, or `--opencode-url URL` for an existing OpenCode HTTP server. These direct modes keep full control support.
|
|
17
21
|
|
|
18
22
|
Run `npx rivetplane --help` for all options.
|
|
19
23
|
|
package/dist/cli.js
CHANGED
|
@@ -9,16 +9,19 @@ const { version } = require("../package.json");
|
|
|
9
9
|
const HELP = `Rivetplane local client
|
|
10
10
|
|
|
11
11
|
Usage:
|
|
12
|
-
rivetplane [--local-port PORT] [--discovery-dir PATH] [--opencode-
|
|
12
|
+
rivetplane [--local-port PORT] [--discovery-dir PATH] [--opencode-directory PATH] [--opencode-executable PATH] [--opencode-checkpoint PATH] [--opencode-index-interval SECONDS] [--opencode-max-sessions-per-project COUNT] [--no-opencode] [--no-opencode-export] [--no-relay]
|
|
13
|
+
rivetplane --opencode-url URL [client options]
|
|
13
14
|
rivetplane opencode [client options] [-- OPENCODE_ATTACH_OPTIONS]
|
|
14
15
|
rivetplane login [--server URL] [--machine-name NAME] [--machine ID --token TOKEN]
|
|
15
16
|
rivetplane --help
|
|
16
17
|
|
|
17
|
-
The client scans ~/.acp/sessions/*.json, attaches to ACP sessions,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
The client scans ~/.acp/sessions/*.json, attaches to ACP sessions, and reads existing
|
|
19
|
+
OpenCode sessions with 'opencode session list' and 'opencode export'. Export discovery
|
|
20
|
+
is read-only. It can show pending questions, but it cannot answer them in the original
|
|
21
|
+
process. The machine index refreshes every 60 seconds by default. The 2-second
|
|
22
|
+
transcript poll uses the cached index. The client does not start OpenCode by default. Use 'rivetplane opencode' for
|
|
23
|
+
the managed server and attached TUI mode. Login uses https://rivetplane.com unless
|
|
24
|
+
--server or HARNESS_CP_SERVER selects a self-hosted control plane.`;
|
|
22
25
|
function flag(name) { const offset = process.argv.indexOf(name); return offset >= 0 ? process.argv[offset + 1] : undefined; }
|
|
23
26
|
async function main() {
|
|
24
27
|
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
@@ -44,19 +47,32 @@ async function main() {
|
|
|
44
47
|
process.stdout.write(`Paired machine ${credentials.machine_name} (${credentials.machine_id}).\n`);
|
|
45
48
|
return;
|
|
46
49
|
}
|
|
47
|
-
const
|
|
50
|
+
const explicitOpenCode = process.argv[2] === "opencode";
|
|
51
|
+
const attachOpenCode = explicitOpenCode;
|
|
48
52
|
const credentials = await readCredentials();
|
|
49
53
|
const discoveryDirectory = flag("--discovery-dir");
|
|
50
54
|
const localPort = Number(flag("--local-port") ?? process.env.HARNESS_CP_LOCAL_PORT ?? 41737);
|
|
51
55
|
if (!Number.isInteger(localPort) || localPort < 0 || localPort > 65_535)
|
|
52
56
|
throw new Error("--local-port must be a valid port");
|
|
57
|
+
const maxOpenCodeSessions = Number(flag("--opencode-max-sessions-per-project") ?? process.env.HARNESS_CP_OPENCODE_MAX_SESSIONS_PER_PROJECT ?? 200);
|
|
58
|
+
if (!Number.isSafeInteger(maxOpenCodeSessions) || maxOpenCodeSessions <= 0)
|
|
59
|
+
throw new Error("--opencode-max-sessions-per-project must be a positive integer");
|
|
60
|
+
const openCodeIndexIntervalSeconds = Number(flag("--opencode-index-interval") ?? process.env.HARNESS_CP_OPENCODE_INDEX_INTERVAL_SECONDS ?? 60);
|
|
61
|
+
if (!Number.isSafeInteger(openCodeIndexIntervalSeconds) || openCodeIndexIntervalSeconds <= 0)
|
|
62
|
+
throw new Error("--opencode-index-interval must be a positive integer number of seconds");
|
|
53
63
|
const client = new HarnessControlClient({
|
|
54
64
|
...(credentials ? { credentials } : {}),
|
|
55
65
|
...(discoveryDirectory ? { discovery_directory: discoveryDirectory } : {}),
|
|
56
66
|
local_port: localPort,
|
|
57
67
|
relay: !process.argv.includes("--no-relay"),
|
|
58
68
|
opencode_url: process.argv.includes("--no-opencode") ? false : (flag("--opencode-url") ?? process.env.HARNESS_CP_OPENCODE_URL),
|
|
69
|
+
opencode_managed: explicitOpenCode,
|
|
70
|
+
opencode_export: !process.argv.includes("--no-opencode-export") && !process.argv.includes("--no-opencode") && !explicitOpenCode && !flag("--opencode-url") && !process.env.HARNESS_CP_OPENCODE_URL,
|
|
59
71
|
opencode_directory: flag("--opencode-directory") ?? process.env.HARNESS_CP_OPENCODE_DIRECTORY ?? process.cwd(),
|
|
72
|
+
opencode_executable: flag("--opencode-executable") ?? process.env.HARNESS_CP_OPENCODE_EXECUTABLE,
|
|
73
|
+
opencode_checkpoint_path: flag("--opencode-checkpoint") ?? process.env.HARNESS_CP_OPENCODE_CHECKPOINT,
|
|
74
|
+
opencode_max_sessions_per_project: maxOpenCodeSessions,
|
|
75
|
+
opencode_index_interval_ms: openCodeIndexIntervalSeconds * 1_000,
|
|
60
76
|
});
|
|
61
77
|
client.manager.registry.on("log", (message) => process.stderr.write(`${String(message)}\n`));
|
|
62
78
|
const started = await client.start();
|
|
@@ -64,7 +80,7 @@ async function main() {
|
|
|
64
80
|
process.stdout.write(credentials && !process.argv.includes("--no-relay") ? `Relay: ${credentials.server_url}\n` : "Relay: disabled (run rivetplane login to pair this machine)\n");
|
|
65
81
|
const harnesses = client.harnesses();
|
|
66
82
|
if (harnesses.length === 0)
|
|
67
|
-
process.stdout.write(`Harnesses: none found (ACP: ${client.manager.discovery.directory}; OpenCode: ${client.
|
|
83
|
+
process.stdout.write(`Harnesses: none found (ACP: ${client.manager.discovery.directory}; OpenCode export: ${client.opencode_exports?.executable ?? "not found"}; managed OpenCode: ${client.opencode ? client.opencode.url : "disabled"})\n`);
|
|
68
84
|
else
|
|
69
85
|
for (const harness of harnesses)
|
|
70
86
|
process.stdout.write(`Harness: ${harness.harness_type} (${harness.attached_sessions}/${harness.discovered_sessions} sessions attached)\n`);
|
|
@@ -80,20 +96,24 @@ async function main() {
|
|
|
80
96
|
process.on("SIGINT", stop);
|
|
81
97
|
process.on("SIGTERM", stop);
|
|
82
98
|
if (attachOpenCode) {
|
|
83
|
-
if (!client.opencode || client.opencode.url === "automatic")
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
if (!client.opencode || client.opencode.url === "automatic") {
|
|
100
|
+
if (explicitOpenCode)
|
|
101
|
+
throw new Error("OpenCode is not available for an attached TUI");
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const separator = process.argv.indexOf("--");
|
|
105
|
+
const attachOptions = separator >= 0 ? process.argv.slice(separator + 1) : [];
|
|
106
|
+
attachedProcess = spawn("opencode", ["attach", client.opencode.url, ...attachOptions], {
|
|
107
|
+
cwd: client.opencode.directory,
|
|
108
|
+
stdio: "inherit",
|
|
109
|
+
});
|
|
110
|
+
const exitCode = await new Promise((resolve, reject) => {
|
|
111
|
+
attachedProcess?.once("error", reject);
|
|
112
|
+
attachedProcess?.once("exit", (code, signal) => resolve(code ?? (signal ? 1 : 0)));
|
|
113
|
+
});
|
|
114
|
+
await client.stop();
|
|
115
|
+
process.exitCode = exitCode;
|
|
116
|
+
}
|
|
97
117
|
}
|
|
98
118
|
}
|
|
99
119
|
void main().catch((error) => { process.stderr.write(`rivetplane: ${error instanceof Error ? error.message : String(error)}\n`); process.exitCode = 1; });
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE9F,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -4,19 +4,29 @@ import { LocalApi } from "./local-api.js";
|
|
|
4
4
|
import { OutboundRelay } from "./relay.js";
|
|
5
5
|
import { SessionManager } from "./session-manager.js";
|
|
6
6
|
import { OpenCodeManager } from "./opencode-manager.js";
|
|
7
|
+
import { OpenCodeExportDiscovery } from "./opencode-export-discovery.js";
|
|
7
8
|
export class HarnessControlClient {
|
|
8
9
|
options;
|
|
9
10
|
manager;
|
|
10
11
|
local_api;
|
|
11
12
|
relay;
|
|
12
13
|
opencode;
|
|
14
|
+
opencode_exports;
|
|
13
15
|
constructor(options = {}) {
|
|
14
16
|
this.options = options;
|
|
15
17
|
const machineId = options.credentials?.machine_id ?? `local-${randomUUID()}`;
|
|
16
18
|
this.manager = new SessionManager(machineId, { ...(options.discovery_directory ? { directory: options.discovery_directory } : {}), ...(options.discovery_interval_ms ? { interval_ms: options.discovery_interval_ms } : {}) });
|
|
17
|
-
if (options.opencode_url
|
|
19
|
+
if (typeof options.opencode_url === "string" || options.opencode_managed)
|
|
18
20
|
this.opencode = new OpenCodeManager(machineId, this.manager.registry, { ...(typeof options.opencode_url === "string" ? { url: options.opencode_url } : {}), ...(options.opencode_directory ? { directory: options.opencode_directory } : {}), ...(options.discovery_interval_ms ? { interval_ms: options.discovery_interval_ms } : {}) });
|
|
19
|
-
const
|
|
21
|
+
const exportEnabled = options.opencode_export ?? (!options.opencode_managed && typeof options.opencode_url !== "string");
|
|
22
|
+
if (options.opencode_url !== false && exportEnabled)
|
|
23
|
+
this.opencode_exports = new OpenCodeExportDiscovery(machineId, this.manager.registry, {
|
|
24
|
+
...(options.opencode_directory ? { directory: options.opencode_directory } : {}), ...(options.opencode_executable ? { executable: options.opencode_executable } : {}),
|
|
25
|
+
...(options.opencode_checkpoint_path ? { checkpoint_path: options.opencode_checkpoint_path } : {}), ...(options.discovery_interval_ms ? { interval_ms: options.discovery_interval_ms } : {}),
|
|
26
|
+
...(options.opencode_max_sessions_per_project ? { max_sessions_per_project: options.opencode_max_sessions_per_project } : {}),
|
|
27
|
+
...(options.opencode_index_interval_ms ? { index_interval_ms: options.opencode_index_interval_ms } : {}),
|
|
28
|
+
});
|
|
29
|
+
const target = (id) => this.manager.target(id) ?? this.opencode?.target(id) ?? this.opencode_exports?.target(id);
|
|
20
30
|
this.local_api = new LocalApi(this.manager.registry, { port: options.local_port ?? 41737, target,
|
|
21
31
|
harnesses: () => this.harnesses(), discovery_directory: this.manager.discovery.directory });
|
|
22
32
|
if (options.credentials && options.relay !== false)
|
|
@@ -27,9 +37,16 @@ export class HarnessControlClient {
|
|
|
27
37
|
});
|
|
28
38
|
this.manager.registry.on("warning", (error) => this.manager.registry.emit("log", `Warning: ${error instanceof Error ? error.message : String(error)}`));
|
|
29
39
|
}
|
|
30
|
-
async start() { const local_port = await this.local_api.start(); await Promise.all([this.manager.start(), this.opencode?.start()]); this.relay?.start(); return { local_port }; }
|
|
31
|
-
async stop() { this.relay?.stop(); this.opencode?.stop(); this.manager.stop(); await this.local_api.stop(); }
|
|
32
|
-
harnesses() {
|
|
40
|
+
async start() { const local_port = await this.local_api.start(); await Promise.all([this.manager.start(), this.opencode?.start(), this.opencode_exports?.start()]); this.relay?.start(); return { local_port }; }
|
|
41
|
+
async stop() { this.relay?.stop(); this.opencode?.stop(); this.opencode_exports?.stop(); this.manager.stop(); await this.local_api.stop(); }
|
|
42
|
+
harnesses() {
|
|
43
|
+
const result = new Map();
|
|
44
|
+
for (const item of [...this.manager.harnesses(), ...(this.opencode?.harnesses() ?? []), ...(this.opencode_exports?.harnesses() ?? [])]) {
|
|
45
|
+
const prior = result.get(item.harness_type);
|
|
46
|
+
result.set(item.harness_type, prior ? { ...prior, discovered_sessions: prior.discovered_sessions + item.discovered_sessions, attached_sessions: prior.attached_sessions + item.attached_sessions } : item);
|
|
47
|
+
}
|
|
48
|
+
return [...result.values()];
|
|
49
|
+
}
|
|
33
50
|
}
|
|
34
51
|
export function localCredentials(server_url) {
|
|
35
52
|
const machine_id = `local-${randomUUID()}`;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./client.js";
|
|
|
3
3
|
export * from "./credentials.js";
|
|
4
4
|
export * from "./discovery.js";
|
|
5
5
|
export * from "./local-api.js";
|
|
6
|
+
export * from "./opencode-export-discovery.js";
|
|
6
7
|
export * from "./registry.js";
|
|
7
8
|
export * from "./relay.js";
|
|
8
9
|
export * from "./session-manager.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,749 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access, mkdir, mkdtemp, open, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { homedir, tmpdir } from "node:os";
|
|
5
|
+
import { delimiter, dirname, isAbsolute, join } from "node:path";
|
|
6
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
7
|
+
import crossSpawn from "cross-spawn";
|
|
8
|
+
import { SessionRegistry } from "./registry.js";
|
|
9
|
+
function object(value) {
|
|
10
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
11
|
+
}
|
|
12
|
+
function array(value) { return Array.isArray(value) ? value : []; }
|
|
13
|
+
function string(value) { return typeof value === "string" ? value : undefined; }
|
|
14
|
+
function number(value) { return typeof value === "number" && Number.isFinite(value) ? value : undefined; }
|
|
15
|
+
function hash(value) { return createHash("sha256").update(value).digest("base64url").slice(0, 22); }
|
|
16
|
+
function stableId(...values) { return `opencode-export:${hash(values.join("\0"))}`; }
|
|
17
|
+
function timestamp(value, fallback = Date.now()) {
|
|
18
|
+
if (typeof value === "string") {
|
|
19
|
+
const parsed = Date.parse(value);
|
|
20
|
+
if (Number.isFinite(parsed))
|
|
21
|
+
return new Date(parsed).toISOString();
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
24
|
+
return new Date(value < 10_000_000_000 ? value * 1_000 : value).toISOString();
|
|
25
|
+
return new Date(fallback).toISOString();
|
|
26
|
+
}
|
|
27
|
+
function epoch(value) {
|
|
28
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
29
|
+
return value;
|
|
30
|
+
if (typeof value === "string") {
|
|
31
|
+
const parsed = Date.parse(value);
|
|
32
|
+
if (Number.isFinite(parsed))
|
|
33
|
+
return parsed;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
function jsonValue(value) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(JSON.stringify(value));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function summary(value, limit = 500) {
|
|
46
|
+
const text = typeof value === "string" ? value : JSON.stringify(value);
|
|
47
|
+
return (text ?? "").length > limit ? `${(text ?? "").slice(0, limit)}…` : (text ?? "");
|
|
48
|
+
}
|
|
49
|
+
/** Parse JSON with optional diagnostic text before the JSON value. */
|
|
50
|
+
export function parseCommandJson(stdout) {
|
|
51
|
+
const trimmed = stdout.trim();
|
|
52
|
+
if (!trimmed)
|
|
53
|
+
throw new Error("command returned empty stdout");
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(trimmed);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
const starts = [trimmed.indexOf("["), trimmed.indexOf("{")].filter((index) => index >= 0).sort((a, b) => a - b);
|
|
59
|
+
for (const start of starts) {
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(trimmed.slice(start));
|
|
62
|
+
}
|
|
63
|
+
catch { /* try the next candidate */ }
|
|
64
|
+
}
|
|
65
|
+
throw new Error("command returned malformed or partial JSON");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function parseSessionList(stdout) {
|
|
69
|
+
const parsed = parseCommandJson(stdout);
|
|
70
|
+
const values = Array.isArray(parsed) ? parsed : array(object(parsed)?.sessions ?? object(parsed)?.data);
|
|
71
|
+
return values.flatMap((value) => {
|
|
72
|
+
const item = object(value);
|
|
73
|
+
const id = string(item?.id);
|
|
74
|
+
if (!item || !id)
|
|
75
|
+
return [];
|
|
76
|
+
return [{ id, title: string(item.title), directory: string(item.directory), projectId: string(item.projectId ?? item.projectID),
|
|
77
|
+
created: number(item.created) ?? string(item.created), updated: number(item.updated) ?? string(item.updated) }];
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export function parseProjectList(stdout) {
|
|
81
|
+
const parsed = parseCommandJson(stdout);
|
|
82
|
+
if (!Array.isArray(parsed))
|
|
83
|
+
throw new Error("project list JSON is not an array");
|
|
84
|
+
return parsed.flatMap((value) => {
|
|
85
|
+
const item = object(value);
|
|
86
|
+
const id = string(item?.id);
|
|
87
|
+
const worktree = string(item?.worktree);
|
|
88
|
+
if (!item || !id || !worktree)
|
|
89
|
+
return [];
|
|
90
|
+
return [{ id, worktree, sandboxes: array(item.sandboxes).flatMap((sandbox) => typeof sandbox === "string" ? [sandbox] : []) }];
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export function parseSessionExport(stdout) {
|
|
94
|
+
const parsed = object(parseCommandJson(stdout));
|
|
95
|
+
const info = object(parsed?.info);
|
|
96
|
+
const messages = array(parsed?.messages);
|
|
97
|
+
if (!parsed || !info || !Array.isArray(parsed.messages))
|
|
98
|
+
throw new Error("export JSON does not contain info and messages");
|
|
99
|
+
return { info, messages: messages.map((value) => object(value)).filter((value) => Boolean(value)).map((message) => {
|
|
100
|
+
const messageInfo = object(message.info);
|
|
101
|
+
if (!messageInfo || !Array.isArray(message.parts))
|
|
102
|
+
throw new Error("export contains a malformed message");
|
|
103
|
+
return { info: messageInfo, parts: message.parts.map((value) => object(value)).filter((value) => Boolean(value)) };
|
|
104
|
+
}) };
|
|
105
|
+
}
|
|
106
|
+
function executableNames(platform) {
|
|
107
|
+
return platform === "win32" ? ["opencode.exe", "opencode-cli.exe", "opencode.cmd", "opencode.bat", "opencode"] : ["opencode"];
|
|
108
|
+
}
|
|
109
|
+
export async function resolveOpenCodeExecutable(options = {}) {
|
|
110
|
+
const platform = options.platform ?? process.platform;
|
|
111
|
+
const env = options.env ?? process.env;
|
|
112
|
+
const configured = options.executable;
|
|
113
|
+
const candidates = configured ? [configured] : executableNames(platform).flatMap((name) => (env.PATH ?? "").split(delimiter).filter(Boolean).map((directory) => join(directory.replace(/^"|"$/g, ""), name)));
|
|
114
|
+
for (const candidate of candidates) {
|
|
115
|
+
if (!configured || isAbsolute(candidate) || candidate.includes("/") || candidate.includes("\\")) {
|
|
116
|
+
try {
|
|
117
|
+
await access(candidate, platform === "win32" ? constants.F_OK : constants.X_OK);
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return configured && !isAbsolute(configured) ? configured : undefined;
|
|
126
|
+
}
|
|
127
|
+
async function terminate(child) {
|
|
128
|
+
if (!child.pid || child.exitCode !== null || child.killed)
|
|
129
|
+
return;
|
|
130
|
+
if (process.platform === "win32") {
|
|
131
|
+
await new Promise((resolve) => {
|
|
132
|
+
const killer = nodeSpawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { windowsHide: true, stdio: "ignore" });
|
|
133
|
+
killer.once("error", () => resolve());
|
|
134
|
+
killer.once("exit", () => resolve());
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
try {
|
|
139
|
+
process.kill(-child.pid, "SIGTERM");
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
child.kill("SIGTERM");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export const runBoundedCommand = (program, args, options) => new Promise((resolve, reject) => {
|
|
147
|
+
const child = crossSpawn(program, [...args], { cwd: options.cwd, detached: process.platform !== "win32", windowsHide: true, stdio: ["ignore", "pipe", "pipe"] });
|
|
148
|
+
let stdout = "";
|
|
149
|
+
let stderr = "";
|
|
150
|
+
let size = 0;
|
|
151
|
+
let settled = false;
|
|
152
|
+
const fail = (error) => { if (settled)
|
|
153
|
+
return; settled = true; clearTimeout(timer); void terminate(child).finally(() => reject(error)); };
|
|
154
|
+
const collect = (target, chunk) => {
|
|
155
|
+
size += chunk.byteLength;
|
|
156
|
+
if (size > options.max_output_bytes) {
|
|
157
|
+
fail(new Error(`OpenCode command output exceeded ${options.max_output_bytes} bytes`));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (target === "stdout")
|
|
161
|
+
stdout += chunk.toString("utf8");
|
|
162
|
+
else
|
|
163
|
+
stderr += chunk.toString("utf8");
|
|
164
|
+
};
|
|
165
|
+
child.stdout?.on("data", (chunk) => collect("stdout", chunk));
|
|
166
|
+
child.stderr?.on("data", (chunk) => collect("stderr", chunk));
|
|
167
|
+
child.once("error", (error) => fail(error));
|
|
168
|
+
child.once("exit", (code, signal) => {
|
|
169
|
+
if (settled)
|
|
170
|
+
return;
|
|
171
|
+
settled = true;
|
|
172
|
+
clearTimeout(timer);
|
|
173
|
+
if (code === 0)
|
|
174
|
+
resolve({ stdout, stderr });
|
|
175
|
+
else
|
|
176
|
+
reject(new Error(`OpenCode command failed (${code ?? signal ?? "unknown"}): ${stderr.trim().slice(0, 500)}`));
|
|
177
|
+
});
|
|
178
|
+
const timer = setTimeout(() => fail(new Error(`OpenCode command timed out after ${options.timeout_ms} ms`)), options.timeout_ms);
|
|
179
|
+
timer.unref();
|
|
180
|
+
});
|
|
181
|
+
/** Use a regular file for stdout to avoid OpenCode pipe-flush truncation. */
|
|
182
|
+
export const runBoundedCommandToFile = async (program, args, options) => {
|
|
183
|
+
const temporary = await mkdtemp(join(tmpdir(), "rivetplane-opencode-output-"));
|
|
184
|
+
const outputPath = join(temporary, "stdout.json");
|
|
185
|
+
const output = await open(outputPath, "w");
|
|
186
|
+
try {
|
|
187
|
+
const stderr = await new Promise((resolve, reject) => {
|
|
188
|
+
const child = crossSpawn(program, [...args], { cwd: options.cwd, detached: process.platform !== "win32", windowsHide: true, stdio: ["ignore", output.fd, "pipe"] });
|
|
189
|
+
let errorOutput = "";
|
|
190
|
+
let errorSize = 0;
|
|
191
|
+
let settled = false;
|
|
192
|
+
const fail = (error) => { if (settled)
|
|
193
|
+
return; settled = true; clearTimeout(timer); clearInterval(sizeTimer); void terminate(child).finally(() => reject(error)); };
|
|
194
|
+
child.stderr?.on("data", (chunk) => {
|
|
195
|
+
errorSize += chunk.byteLength;
|
|
196
|
+
if (errorSize > options.max_output_bytes) {
|
|
197
|
+
fail(new Error(`OpenCode command stderr exceeded ${options.max_output_bytes} bytes`));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
errorOutput += chunk.toString("utf8");
|
|
201
|
+
});
|
|
202
|
+
child.once("error", (error) => fail(error));
|
|
203
|
+
child.once("exit", (code, signal) => {
|
|
204
|
+
if (settled)
|
|
205
|
+
return;
|
|
206
|
+
settled = true;
|
|
207
|
+
clearTimeout(timer);
|
|
208
|
+
clearInterval(sizeTimer);
|
|
209
|
+
if (code === 0)
|
|
210
|
+
resolve(errorOutput);
|
|
211
|
+
else
|
|
212
|
+
reject(new Error(`OpenCode command failed (${code ?? signal ?? "unknown"}): ${errorOutput.trim().slice(0, 500)}`));
|
|
213
|
+
});
|
|
214
|
+
const timer = setTimeout(() => fail(new Error(`OpenCode command timed out after ${options.timeout_ms} ms`)), options.timeout_ms);
|
|
215
|
+
timer.unref();
|
|
216
|
+
const sizeTimer = setInterval(() => void stat(outputPath).then((value) => { if (value.size > options.max_output_bytes)
|
|
217
|
+
fail(new Error(`OpenCode command output exceeded ${options.max_output_bytes} bytes`)); }).catch(() => undefined), 100);
|
|
218
|
+
sizeTimer.unref();
|
|
219
|
+
});
|
|
220
|
+
await output.close();
|
|
221
|
+
const size = (await stat(outputPath)).size;
|
|
222
|
+
if (size > options.max_output_bytes)
|
|
223
|
+
throw new Error(`OpenCode command output exceeded ${options.max_output_bytes} bytes`);
|
|
224
|
+
return { stdout: await readFile(outputPath, "utf8"), stderr };
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
await output.close().catch(() => undefined);
|
|
228
|
+
await rm(temporary, { recursive: true, force: true });
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
function shellListCommand(platform, env, cwd, timeout_ms, max_output_bytes, max_sessions, runner) {
|
|
232
|
+
// The command contains fixed tokens and a validated integer. No session ID enters it.
|
|
233
|
+
const command = `opencode session list --format json --max-count ${max_sessions}`;
|
|
234
|
+
if (platform === "win32")
|
|
235
|
+
return runner(env.ComSpec ?? "cmd.exe", ["/d", "/s", "/c", command], { cwd, timeout_ms, max_output_bytes });
|
|
236
|
+
return runner(env.SHELL ?? "/bin/sh", ["-lc", command], { cwd, timeout_ms, max_output_bytes });
|
|
237
|
+
}
|
|
238
|
+
function questionFromPart(sessionId, part) {
|
|
239
|
+
if (part.tool !== "question")
|
|
240
|
+
return undefined;
|
|
241
|
+
const state = object(part.state);
|
|
242
|
+
if (state?.status !== "running" && state?.status !== "pending")
|
|
243
|
+
return undefined;
|
|
244
|
+
const questions = array(object(state.input)?.questions).flatMap((value) => {
|
|
245
|
+
const item = object(value);
|
|
246
|
+
const prompt = string(item?.question);
|
|
247
|
+
const header = string(item?.header);
|
|
248
|
+
if (!item || !prompt || !header)
|
|
249
|
+
return [];
|
|
250
|
+
const options = array(item.options).flatMap((entry) => { const option = object(entry); const label = string(option?.label); return label ? [{ label, description: string(option?.description) }] : []; });
|
|
251
|
+
return [{ prompt, header, options, multiple: item.multiple === true, custom: item.custom === true }];
|
|
252
|
+
});
|
|
253
|
+
if (questions.length === 0)
|
|
254
|
+
return undefined;
|
|
255
|
+
const callID = string(part.callID) ?? string(part.id) ?? stableId(sessionId, "question");
|
|
256
|
+
return { type: "question", id: callID, session_id: sessionId, prompt: questions.map((item) => item.prompt).join("\n"), header: questions.map((item) => item.header).join(" / "),
|
|
257
|
+
options: questions.flatMap((item) => item.options.map((option) => option.label)), option_details: questions.flatMap((item) => item.options), questions,
|
|
258
|
+
tool_call_id: callID, read_only: true, requested_at: timestamp(object(state.time)?.start) };
|
|
259
|
+
}
|
|
260
|
+
function approvalFromPart(sessionId, part) {
|
|
261
|
+
const state = object(part.state);
|
|
262
|
+
if (!state || (state.status !== "running" && state.status !== "pending"))
|
|
263
|
+
return undefined;
|
|
264
|
+
const explicit = object(state.permission) ?? object(object(state.metadata)?.permission);
|
|
265
|
+
const tool = string(part.tool) ?? "permission";
|
|
266
|
+
if (!explicit && !["permission", "approval", "request_permission"].includes(tool))
|
|
267
|
+
return undefined;
|
|
268
|
+
if (explicit && explicit.status !== undefined && explicit.status !== "running" && explicit.status !== "pending")
|
|
269
|
+
return undefined;
|
|
270
|
+
const input = explicit ?? object(state.input) ?? {};
|
|
271
|
+
const id = string(explicit?.id) ?? string(explicit?.requestID) ?? string(part.callID) ?? string(part.id);
|
|
272
|
+
if (!id)
|
|
273
|
+
return undefined;
|
|
274
|
+
return { type: "approval", id, session_id: sessionId, tool_name: string(explicit?.permission) ?? string(explicit?.tool) ?? tool,
|
|
275
|
+
tool_input_summary: summary(input), requested_at: timestamp(object(explicit?.time)?.created ?? object(state.time)?.start), read_only: true };
|
|
276
|
+
}
|
|
277
|
+
function detectPending(sessionId, messages) {
|
|
278
|
+
let pending;
|
|
279
|
+
for (const message of messages)
|
|
280
|
+
for (const part of message.parts)
|
|
281
|
+
pending = questionFromPart(sessionId, part) ?? approvalFromPart(sessionId, part) ?? pending;
|
|
282
|
+
return pending;
|
|
283
|
+
}
|
|
284
|
+
function terminalToolRequests(messages) {
|
|
285
|
+
const ids = new Set();
|
|
286
|
+
for (const message of messages)
|
|
287
|
+
for (const part of message.parts) {
|
|
288
|
+
const state = object(part.state);
|
|
289
|
+
const status = string(state?.status);
|
|
290
|
+
if (!["completed", "error", "rejected"].includes(status ?? ""))
|
|
291
|
+
continue;
|
|
292
|
+
const explicit = object(state?.permission) ?? object(object(state?.metadata)?.permission);
|
|
293
|
+
const id = string(explicit?.id) ?? string(explicit?.requestID) ?? string(part.callID) ?? string(part.id);
|
|
294
|
+
if (id)
|
|
295
|
+
ids.add(id);
|
|
296
|
+
}
|
|
297
|
+
return ids;
|
|
298
|
+
}
|
|
299
|
+
function latestIdentity(messages) {
|
|
300
|
+
for (const message of [...messages].reverse()) {
|
|
301
|
+
const model = object(message.info.model);
|
|
302
|
+
const provider = string(model?.providerID ?? message.info.providerID);
|
|
303
|
+
const id = string(model?.modelID ?? model?.id ?? message.info.modelID);
|
|
304
|
+
const agent = string(message.info.agent ?? message.info.mode);
|
|
305
|
+
if (provider && id)
|
|
306
|
+
return { model: { provider_id: provider, model_id: id }, agent };
|
|
307
|
+
if (agent)
|
|
308
|
+
return { agent };
|
|
309
|
+
}
|
|
310
|
+
return {};
|
|
311
|
+
}
|
|
312
|
+
function statusFromExport(info, messages, pending) {
|
|
313
|
+
if (pending?.type === "question")
|
|
314
|
+
return "waiting_input";
|
|
315
|
+
if (pending?.type === "approval")
|
|
316
|
+
return "waiting_approval";
|
|
317
|
+
if (object(info.time)?.archived || info.archived === true)
|
|
318
|
+
return "completed";
|
|
319
|
+
const latest = messages.at(-1);
|
|
320
|
+
if (!latest)
|
|
321
|
+
return "waiting_input";
|
|
322
|
+
if (latest.info.error)
|
|
323
|
+
return "error";
|
|
324
|
+
if (latest.info.role === "user")
|
|
325
|
+
return "running";
|
|
326
|
+
if (object(latest.info.time)?.completed || object(latest.info.time)?.finished)
|
|
327
|
+
return "waiting_input";
|
|
328
|
+
if (latest.parts.some((part) => ["running", "pending"].includes(String(object(part.state)?.status))))
|
|
329
|
+
return "running";
|
|
330
|
+
return "waiting_input";
|
|
331
|
+
}
|
|
332
|
+
export class OpenCodeExportDiscovery {
|
|
333
|
+
machine_id;
|
|
334
|
+
registry;
|
|
335
|
+
options;
|
|
336
|
+
directory;
|
|
337
|
+
checkpoint_path;
|
|
338
|
+
#executable;
|
|
339
|
+
#timer;
|
|
340
|
+
#polling = false;
|
|
341
|
+
#loaded = false;
|
|
342
|
+
#checkpoints = { version: 1, sessions: {} };
|
|
343
|
+
#present = new Set();
|
|
344
|
+
#index = new Map();
|
|
345
|
+
#probeIds = new Set();
|
|
346
|
+
#seenRuntime = new Set();
|
|
347
|
+
#diagnostics = new Set();
|
|
348
|
+
#nextIndexRefreshAt = 0;
|
|
349
|
+
#indexFailures = 0;
|
|
350
|
+
#lastCandidateDiagnostic = "";
|
|
351
|
+
constructor(machine_id, registry, options = {}) {
|
|
352
|
+
this.machine_id = machine_id;
|
|
353
|
+
this.registry = registry;
|
|
354
|
+
this.options = options;
|
|
355
|
+
this.directory = options.directory ?? process.cwd();
|
|
356
|
+
this.checkpoint_path = options.checkpoint_path ?? join(homedir(), ".config", "harness-cp", "opencode-export-checkpoints.json");
|
|
357
|
+
}
|
|
358
|
+
async start() {
|
|
359
|
+
await this.poll();
|
|
360
|
+
this.#timer = setInterval(() => void this.poll(), this.options.interval_ms ?? 2_000);
|
|
361
|
+
this.#timer.unref();
|
|
362
|
+
}
|
|
363
|
+
stop() { if (this.#timer)
|
|
364
|
+
clearInterval(this.#timer); this.#timer = undefined; }
|
|
365
|
+
target(id) { return this.#present.has(id) ? new ReadOnlyOpenCodeTarget() : undefined; }
|
|
366
|
+
harnesses() { return this.#executable ? [{ harness_type: "opencode", discovered_sessions: this.#present.size, attached_sessions: this.#present.size }] : []; }
|
|
367
|
+
get executable() { return this.#executable; }
|
|
368
|
+
async poll() {
|
|
369
|
+
if (this.#polling)
|
|
370
|
+
return;
|
|
371
|
+
this.#polling = true;
|
|
372
|
+
try {
|
|
373
|
+
await this.#load();
|
|
374
|
+
this.#executable ??= await resolveOpenCodeExecutable(this.options);
|
|
375
|
+
if (!this.#executable) {
|
|
376
|
+
this.#diagnostic("OpenCode executable was not found; export discovery is inactive");
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const command = this.options.runner ?? runBoundedCommand;
|
|
380
|
+
const common = this.#commandOptions();
|
|
381
|
+
if (this.#now() >= this.#nextIndexRefreshAt)
|
|
382
|
+
await this.#refreshIndex(command, common);
|
|
383
|
+
const indexed = [...this.#index.values()].sort((a, b) => this.#updated(b) - this.#updated(a));
|
|
384
|
+
const recentAfter = this.#now() - (this.options.recent_window_ms ?? 5 * 60_000);
|
|
385
|
+
const eligible = indexed.filter((session) => {
|
|
386
|
+
const current = this.registry.get(session.id);
|
|
387
|
+
const pending = current?.pending ?? this.#checkpoints.sessions[session.id]?.pending;
|
|
388
|
+
const probeChanged = this.#probeIds.has(session.id) && !this.#seenRuntime.has(session.id) && this.#checkpoints.sessions[session.id]?.updated !== session.updated;
|
|
389
|
+
return Boolean(pending) || current?.status === "running" || this.#updated(session) >= recentAfter || probeChanged;
|
|
390
|
+
});
|
|
391
|
+
const candidateLimit = this.#positiveLimit(this.options.max_export_candidates, 48);
|
|
392
|
+
const priority = (session) => {
|
|
393
|
+
const current = this.registry.get(session.id);
|
|
394
|
+
if (current?.pending ?? this.#checkpoints.sessions[session.id]?.pending)
|
|
395
|
+
return 3;
|
|
396
|
+
if (current?.status === "running")
|
|
397
|
+
return 2;
|
|
398
|
+
if (!this.#seenRuntime.has(session.id) || this.#checkpoints.sessions[session.id]?.updated !== session.updated)
|
|
399
|
+
return 1;
|
|
400
|
+
return 0;
|
|
401
|
+
};
|
|
402
|
+
const candidates = eligible.sort((a, b) => priority(b) - priority(a) || this.#updated(b) - this.#updated(a)).slice(0, candidateLimit);
|
|
403
|
+
const exports = candidates.slice(0, this.#positiveLimit(this.options.max_exports_per_poll, 12, true));
|
|
404
|
+
const candidateDiagnostic = `OpenCode export poll has ${eligible.length} active, recent, or probe candidates from ${indexed.length} indexed sessions; selected ${candidates.length} and exporting ${exports.length}`;
|
|
405
|
+
if (candidateDiagnostic !== this.#lastCandidateDiagnostic) {
|
|
406
|
+
this.#lastCandidateDiagnostic = candidateDiagnostic;
|
|
407
|
+
this.registry.emit("log", candidateDiagnostic);
|
|
408
|
+
}
|
|
409
|
+
await this.#mapLimit(exports, this.options.concurrency ?? 4, async (session) => this.#export(session, command, common));
|
|
410
|
+
if (exports.length > 0)
|
|
411
|
+
await this.#save();
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
this.#diagnostic(`OpenCode export discovery failed: ${error instanceof Error ? error.message : String(error)}`, true);
|
|
415
|
+
}
|
|
416
|
+
finally {
|
|
417
|
+
this.#polling = false;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
#commandOptions() {
|
|
421
|
+
return { cwd: this.directory, timeout_ms: this.options.timeout_ms ?? 10_000, max_output_bytes: this.options.max_output_bytes ?? 16 * 1024 * 1024 };
|
|
422
|
+
}
|
|
423
|
+
#now() { return this.options.now?.() ?? Date.now(); }
|
|
424
|
+
#positiveLimit(value, fallback, allowZero = false) {
|
|
425
|
+
if (Number.isSafeInteger(value) && (allowZero ? value >= 0 : value > 0))
|
|
426
|
+
return value;
|
|
427
|
+
return fallback;
|
|
428
|
+
}
|
|
429
|
+
#indexInterval() { return this.#positiveLimit(this.options.index_interval_ms, 60_000, true); }
|
|
430
|
+
async #refreshIndex(command, common) {
|
|
431
|
+
const started = this.#now();
|
|
432
|
+
const scopes = await this.#projectScopes(command, common);
|
|
433
|
+
const listedResult = await this.#listAllScopes(scopes.directories, command, common);
|
|
434
|
+
let listed = listedResult.sessions;
|
|
435
|
+
let databaseAuthoritative = false;
|
|
436
|
+
if (scopes.requiresIndex || !scopes.complete || !listedResult.authoritative || listedResult.saturated) {
|
|
437
|
+
try {
|
|
438
|
+
listed = this.#mergeSessions(listed, await this.#listDatabasePages(common));
|
|
439
|
+
databaseAuthoritative = true;
|
|
440
|
+
this.#diagnostic(`OpenCode used the bounded database-index fallback and found ${listed.length} unique root sessions`);
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
this.#diagnostic(`OpenCode database-index fallback failed; discovery coverage is partial: ${error instanceof Error ? error.message : String(error)}`, true);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
listed.sort((a, b) => this.#updated(b) - this.#updated(a));
|
|
447
|
+
const authoritative = databaseAuthoritative || (scopes.complete && listedResult.authoritative && !listedResult.saturated);
|
|
448
|
+
const next = authoritative ? new Map() : new Map(this.#index);
|
|
449
|
+
for (const session of listed)
|
|
450
|
+
next.set(session.id, session);
|
|
451
|
+
if (authoritative)
|
|
452
|
+
for (const id of this.#present)
|
|
453
|
+
if (!next.has(id))
|
|
454
|
+
this.registry.remove(id);
|
|
455
|
+
this.#index = next;
|
|
456
|
+
this.#present = new Set(next.keys());
|
|
457
|
+
this.#probeIds = new Set([...next.values()].sort((a, b) => this.#updated(b) - this.#updated(a)).slice(0, this.#positiveLimit(this.options.max_export_candidates, 48)).map((session) => session.id));
|
|
458
|
+
for (const session of listed)
|
|
459
|
+
this.#upsertListSnapshot(session);
|
|
460
|
+
const duration = Math.max(0, this.#now() - started);
|
|
461
|
+
const base = this.#indexInterval();
|
|
462
|
+
const maximum = this.#positiveLimit(this.options.max_index_interval_ms, 5 * 60_000);
|
|
463
|
+
this.#indexFailures = authoritative ? 0 : Math.min(this.#indexFailures + 1, 6);
|
|
464
|
+
const slowDelay = base === 0 ? 0 : Math.min(maximum, Math.max(base, duration * 4));
|
|
465
|
+
const failureDelay = Math.min(maximum, base * 2 ** this.#indexFailures);
|
|
466
|
+
const delay = Math.max(slowDelay, failureDelay);
|
|
467
|
+
this.#nextIndexRefreshAt = this.#now() + delay;
|
|
468
|
+
this.registry.emit("log", `OpenCode index refresh ${authoritative ? "completed" : "was partial"} in ${duration} ms with ${this.#index.size} cached sessions; next refresh in ${delay} ms`);
|
|
469
|
+
if (!authoritative)
|
|
470
|
+
this.registry.emit("warning", new Error(`OpenCode index refresh backoff is ${delay} ms after ${this.#indexFailures} consecutive partial refresh${this.#indexFailures === 1 ? "" : "es"}`));
|
|
471
|
+
else if (delay > base)
|
|
472
|
+
this.registry.emit("log", `OpenCode index refresh used a ${delay} ms slow-scan backoff`);
|
|
473
|
+
}
|
|
474
|
+
async #projectScopes(command, common) {
|
|
475
|
+
const scopes = new Set([this.directory]);
|
|
476
|
+
let complete = true;
|
|
477
|
+
let requiresIndex = false;
|
|
478
|
+
try {
|
|
479
|
+
const result = await command(this.#executable, [...(this.options.executable_args ?? []), "debug", "scrap"], common);
|
|
480
|
+
let missing = 0;
|
|
481
|
+
const directoryProjects = new Map();
|
|
482
|
+
for (const project of parseProjectList(result.stdout)) {
|
|
483
|
+
const candidates = [project.worktree, ...project.sandboxes];
|
|
484
|
+
let selected;
|
|
485
|
+
for (const candidate of candidates) {
|
|
486
|
+
try {
|
|
487
|
+
await access(candidate, constants.F_OK);
|
|
488
|
+
scopes.add(candidate);
|
|
489
|
+
selected = candidate;
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
catch { /* try the next known directory */ }
|
|
493
|
+
}
|
|
494
|
+
if (!selected) {
|
|
495
|
+
missing++;
|
|
496
|
+
complete = false;
|
|
497
|
+
requiresIndex = true;
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
const prior = directoryProjects.get(selected);
|
|
501
|
+
if (prior && prior !== project.id) {
|
|
502
|
+
requiresIndex = true;
|
|
503
|
+
this.#diagnostic(`OpenCode project records ${prior} and ${project.id} share ${selected}; the directory scope is scanned once and the database index completes project identity coverage`);
|
|
504
|
+
}
|
|
505
|
+
else
|
|
506
|
+
directoryProjects.set(selected, project.id);
|
|
507
|
+
}
|
|
508
|
+
if (missing > 0)
|
|
509
|
+
this.#diagnostic(`OpenCode project discovery skipped ${missing} project${missing === 1 ? "" : "s"} with no accessible worktree or sandbox; the database-index fallback was requested`, true);
|
|
510
|
+
this.#diagnostic(`OpenCode project discovery found ${scopes.size} directory scope${scopes.size === 1 ? "" : "s"}`);
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
complete = false;
|
|
514
|
+
requiresIndex = true;
|
|
515
|
+
this.#diagnostic(`OpenCode project discovery is unavailable; scanning seed directory ${this.directory} and requesting the database-index fallback: ${error instanceof Error ? error.message : String(error)}`, true);
|
|
516
|
+
}
|
|
517
|
+
return { directories: [...scopes], complete, requiresIndex };
|
|
518
|
+
}
|
|
519
|
+
async #listAllScopes(scopes, command, common) {
|
|
520
|
+
const combined = new Map();
|
|
521
|
+
let failures = 0;
|
|
522
|
+
let duplicates = 0;
|
|
523
|
+
let saturated = false;
|
|
524
|
+
await this.#mapLimit(scopes, this.options.concurrency ?? 4, async (directory) => {
|
|
525
|
+
try {
|
|
526
|
+
const sessions = await this.#listScope(directory, command, common);
|
|
527
|
+
if (sessions.length >= this.#scopeLimit())
|
|
528
|
+
saturated = true;
|
|
529
|
+
for (const session of sessions) {
|
|
530
|
+
const prior = combined.get(session.id);
|
|
531
|
+
if (prior)
|
|
532
|
+
duplicates++;
|
|
533
|
+
if (!prior || this.#updated(session) > this.#updated(prior))
|
|
534
|
+
combined.set(session.id, session);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
failures++;
|
|
539
|
+
this.registry.emit("warning", new Error(`Cannot list OpenCode sessions for ${directory}: ${error instanceof Error ? error.message : String(error)}`));
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
if (duplicates > 0)
|
|
543
|
+
this.#diagnostic(`OpenCode project discovery removed ${duplicates} duplicate session result${duplicates === 1 ? "" : "s"}`);
|
|
544
|
+
if (failures === 0)
|
|
545
|
+
this.#diagnostic(`OpenCode machine discovery covered ${scopes.length} project scope${scopes.length === 1 ? "" : "s"} and found ${combined.size} unique session${combined.size === 1 ? "" : "s"}`);
|
|
546
|
+
else
|
|
547
|
+
this.#diagnostic(`OpenCode machine discovery completed with ${failures} failed project scope${failures === 1 ? "" : "s"}; the database-index fallback was requested`, true);
|
|
548
|
+
return { sessions: [...combined.values()], authoritative: failures === 0, saturated };
|
|
549
|
+
}
|
|
550
|
+
async #listScope(directory, command, common) {
|
|
551
|
+
const max = this.#scopeLimit();
|
|
552
|
+
let result = await command(this.#executable, [...(this.options.executable_args ?? []), "session", "list", "--format", "json", "--max-count", String(max)], { ...common, cwd: directory });
|
|
553
|
+
if (!result.stdout.trim()) {
|
|
554
|
+
this.#diagnostic("OpenCode session list returned empty stdout; retrying once through the platform shell");
|
|
555
|
+
try {
|
|
556
|
+
result = await shellListCommand(this.options.platform ?? process.platform, this.options.env ?? process.env, directory, common.timeout_ms, common.max_output_bytes, max, command);
|
|
557
|
+
}
|
|
558
|
+
catch (error) {
|
|
559
|
+
this.registry.emit("warning", new Error(`OpenCode shell retry failed for ${directory}: ${error instanceof Error ? error.message : String(error)}`));
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
let sessions;
|
|
563
|
+
try {
|
|
564
|
+
if (!result.stdout.trim())
|
|
565
|
+
throw new Error("command returned empty stdout");
|
|
566
|
+
sessions = parseSessionList(result.stdout);
|
|
567
|
+
}
|
|
568
|
+
catch (error) {
|
|
569
|
+
this.#diagnostic(`OpenCode session list output was empty, malformed, or truncated in ${directory}; retrying with file-backed stdout: ${error instanceof Error ? error.message : String(error)}`);
|
|
570
|
+
const fileCommand = this.options.file_runner ?? (this.options.runner ? command : runBoundedCommandToFile);
|
|
571
|
+
const fileResult = await fileCommand(this.#executable, [...(this.options.executable_args ?? []), "session", "list", "--format", "json", "--max-count", String(max)], { ...common, cwd: directory });
|
|
572
|
+
if (!fileResult.stdout.trim()) {
|
|
573
|
+
this.#diagnostic("OpenCode session list returned empty stdout after all retries; treating the successful empty result as no sessions");
|
|
574
|
+
sessions = [];
|
|
575
|
+
}
|
|
576
|
+
else
|
|
577
|
+
sessions = parseSessionList(fileResult.stdout);
|
|
578
|
+
}
|
|
579
|
+
if (sessions.length >= max)
|
|
580
|
+
this.#diagnostic(`OpenCode session list reached the explicit limit of ${max} in ${directory}; bounded database-index pagination will complete coverage`);
|
|
581
|
+
return sessions;
|
|
582
|
+
}
|
|
583
|
+
#scopeLimit() {
|
|
584
|
+
const value = this.options.max_sessions_per_project ?? 200;
|
|
585
|
+
return Number.isSafeInteger(value) && value > 0 ? value : 200;
|
|
586
|
+
}
|
|
587
|
+
async #listDatabasePages(common) {
|
|
588
|
+
const pageSize = Number.isSafeInteger(this.options.database_page_size) && (this.options.database_page_size ?? 0) > 0 ? this.options.database_page_size : 1_000;
|
|
589
|
+
const maxPages = Number.isSafeInteger(this.options.max_database_pages) && (this.options.max_database_pages ?? 0) > 0 ? this.options.max_database_pages : 100;
|
|
590
|
+
const command = this.options.file_runner ?? (this.options.runner ? this.options.runner : runBoundedCommandToFile);
|
|
591
|
+
const sessions = [];
|
|
592
|
+
for (let page = 0; page < maxPages; page++) {
|
|
593
|
+
const offset = page * pageSize;
|
|
594
|
+
const query = `SELECT id, title, time_updated AS updated, time_created AS created, project_id AS projectId, directory FROM session WHERE parent_id IS NULL ORDER BY time_updated DESC, id DESC LIMIT ${pageSize} OFFSET ${offset}`;
|
|
595
|
+
const result = await command(this.#executable, [...(this.options.executable_args ?? []), "db", query, "--format", "json"], common);
|
|
596
|
+
const values = parseSessionList(result.stdout);
|
|
597
|
+
sessions.push(...values);
|
|
598
|
+
if (values.length < pageSize)
|
|
599
|
+
return this.#mergeSessions([], sessions);
|
|
600
|
+
}
|
|
601
|
+
throw new Error(`database session index exceeded ${maxPages} pages of ${pageSize}`);
|
|
602
|
+
}
|
|
603
|
+
#mergeSessions(left, right) {
|
|
604
|
+
const combined = new Map();
|
|
605
|
+
for (const session of [...left, ...right]) {
|
|
606
|
+
const prior = combined.get(session.id);
|
|
607
|
+
if (!prior || this.#updated(session) > this.#updated(prior))
|
|
608
|
+
combined.set(session.id, session);
|
|
609
|
+
}
|
|
610
|
+
return [...combined.values()];
|
|
611
|
+
}
|
|
612
|
+
#updated(session) { return typeof session.updated === "number" ? session.updated : Date.parse(session.updated ?? "") || 0; }
|
|
613
|
+
#upsertListSnapshot(listed) {
|
|
614
|
+
const current = this.registry.get(listed.id);
|
|
615
|
+
const pending = current?.pending ?? this.#checkpoints.sessions[listed.id]?.pending ?? null;
|
|
616
|
+
this.registry.upsert({ id: listed.id, machine_id: this.machine_id, harness_type: "opencode", cwd: listed.directory ?? current?.cwd ?? "",
|
|
617
|
+
status: pending?.type === "question" ? "waiting_input" : pending?.type === "approval" ? "waiting_approval" : current?.status ?? "waiting_input",
|
|
618
|
+
created_at: timestamp(listed.created ?? current?.created_at), last_activity_at: timestamp(listed.updated ?? current?.last_activity_at ?? listed.created), pending, title: listed.title ?? current?.title, read_only: true });
|
|
619
|
+
}
|
|
620
|
+
async #export(listed, command, common) {
|
|
621
|
+
try {
|
|
622
|
+
const fileCommand = this.options.file_runner ?? (this.options.runner ? command : runBoundedCommandToFile);
|
|
623
|
+
const output = await fileCommand(this.#executable, [...(this.options.executable_args ?? []), "export", listed.id], common);
|
|
624
|
+
const exported = parseSessionExport(output.stdout);
|
|
625
|
+
this.#syncExport(listed, exported.info, exported.messages);
|
|
626
|
+
this.#seenRuntime.add(listed.id);
|
|
627
|
+
}
|
|
628
|
+
catch (error) {
|
|
629
|
+
this.registry.emit("warning", new Error(`Cannot export OpenCode session ${listed.id}: ${error instanceof Error ? error.message : String(error)}`));
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
#syncExport(listed, info, messages) {
|
|
633
|
+
const id = string(info.id) ?? listed.id;
|
|
634
|
+
if (id !== listed.id)
|
|
635
|
+
throw new Error(`export session ID ${id} does not match ${listed.id}`);
|
|
636
|
+
const checkpoint = this.#checkpoints.sessions[id] ?? { parts: {} };
|
|
637
|
+
const foundPending = detectPending(id, messages);
|
|
638
|
+
const terminal = terminalToolRequests(messages);
|
|
639
|
+
const exportUpdated = listed.updated ?? number(object(info.time)?.updated) ?? string(object(info.time)?.updated);
|
|
640
|
+
const currentEpoch = epoch(exportUpdated);
|
|
641
|
+
const priorEpoch = epoch(checkpoint.updated);
|
|
642
|
+
const newer = checkpoint.updated === undefined || (currentEpoch !== undefined && priorEpoch !== undefined ? currentEpoch > priorEpoch : exportUpdated !== undefined && exportUpdated !== checkpoint.updated);
|
|
643
|
+
const pending = foundPending ?? (checkpoint.pending && !terminal.has(checkpoint.pending.id) && !newer ? checkpoint.pending : undefined);
|
|
644
|
+
const identity = latestIdentity(messages);
|
|
645
|
+
const current = this.registry.get(id);
|
|
646
|
+
const time = object(info.time);
|
|
647
|
+
this.registry.upsert({ id, machine_id: this.machine_id, harness_type: "opencode", cwd: string(info.directory) ?? listed.directory ?? current?.cwd ?? "",
|
|
648
|
+
status: current?.status ?? "waiting_input", created_at: timestamp(time?.created ?? listed.created), last_activity_at: timestamp(time?.updated ?? listed.updated ?? time?.created),
|
|
649
|
+
pending: current?.pending ?? null, title: string(info.title) ?? listed.title, ...identity, read_only: true,
|
|
650
|
+
metadata: { project_id: String(info.projectID ?? listed.projectId ?? ""), slug: String(info.slug ?? ""), version: String(info.version ?? "") } });
|
|
651
|
+
for (const message of messages)
|
|
652
|
+
this.#syncMessage(id, message.info, message.parts, checkpoint);
|
|
653
|
+
if (pending?.type === "approval" && checkpoint.pending?.id !== pending.id)
|
|
654
|
+
this.registry.append(id, "permission_request", {
|
|
655
|
+
approval_id: pending.id, tool_name: pending.tool_name, tool_input_summary: pending.tool_input_summary,
|
|
656
|
+
}, { id: stableId(id, pending.id, "permission_request"), ts: pending.requested_at });
|
|
657
|
+
this.registry.setPending(id, pending ?? null);
|
|
658
|
+
this.registry.setStatus(id, statusFromExport(info, messages, pending));
|
|
659
|
+
checkpoint.updated = exportUpdated;
|
|
660
|
+
checkpoint.pending = pending;
|
|
661
|
+
this.#checkpoints.sessions[id] = checkpoint;
|
|
662
|
+
}
|
|
663
|
+
#syncMessage(sessionId, info, parts, checkpoint) {
|
|
664
|
+
const messageId = string(info.id) ?? stableId(sessionId, "message", JSON.stringify(info));
|
|
665
|
+
const role = info.role === "user" ? "user" : "assistant";
|
|
666
|
+
const messageTs = timestamp(object(info.time)?.created);
|
|
667
|
+
for (const part of parts) {
|
|
668
|
+
const partId = string(part.id) ?? stableId(messageId, JSON.stringify(part));
|
|
669
|
+
const key = `${messageId}/${partId}`;
|
|
670
|
+
const prior = checkpoint.parts[key];
|
|
671
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
672
|
+
const full = part.text;
|
|
673
|
+
let emitted = full;
|
|
674
|
+
if (prior?.length !== undefined && prior.length <= full.length && hash(full.slice(0, prior.length)) === prior.hash)
|
|
675
|
+
emitted = full.slice(prior.length);
|
|
676
|
+
else if (prior?.hash === hash(full))
|
|
677
|
+
emitted = "";
|
|
678
|
+
if (emitted)
|
|
679
|
+
this.registry.append(sessionId, role === "user" ? "user_message" : "agent_message", { text: emitted }, { id: stableId(sessionId, messageId, partId, "text", String(full.length), hash(full)), ts: messageTs });
|
|
680
|
+
checkpoint.parts[key] = { hash: hash(full), length: full.length };
|
|
681
|
+
}
|
|
682
|
+
else if (part.type === "tool")
|
|
683
|
+
this.#syncTool(sessionId, messageId, partId, part, prior, checkpoint, key, messageTs);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
#syncTool(sessionId, messageId, partId, part, prior, checkpoint, key, fallbackTs) {
|
|
687
|
+
const state = object(part.state) ?? {};
|
|
688
|
+
const status = string(state.status) ?? "unknown";
|
|
689
|
+
const callID = string(part.callID) ?? partId;
|
|
690
|
+
const tool = string(part.tool) ?? "tool";
|
|
691
|
+
const input = state.input;
|
|
692
|
+
const signature = hash(JSON.stringify({ tool, status, input, output: state.output, error: state.error }));
|
|
693
|
+
if (!prior)
|
|
694
|
+
this.registry.append(sessionId, "tool_call", { tool_call_id: callID, tool_name: tool, input_summary: summary(input), ...(jsonValue(input) !== undefined ? { input: jsonValue(input) } : {}) }, { id: stableId(sessionId, messageId, partId, "call"), ts: timestamp(object(state.time)?.start, Date.parse(fallbackTs)) });
|
|
695
|
+
if (prior?.status !== status && ["completed", "error", "rejected"].includes(status)) {
|
|
696
|
+
const failed = status !== "completed";
|
|
697
|
+
const output = failed ? state.error ?? state.output ?? status : state.output;
|
|
698
|
+
this.registry.append(sessionId, "tool_result", { tool_call_id: callID, output_summary: summary(output), ...(jsonValue(output) !== undefined ? { output: jsonValue(output) } : {}), is_error: failed }, { id: stableId(sessionId, messageId, partId, "result", status), ts: timestamp(object(state.time)?.end, Date.parse(fallbackTs)) });
|
|
699
|
+
}
|
|
700
|
+
checkpoint.parts[key] = { hash: signature, status };
|
|
701
|
+
}
|
|
702
|
+
async #mapLimit(values, limit, operation) {
|
|
703
|
+
let offset = 0;
|
|
704
|
+
const workers = Array.from({ length: Math.max(1, Math.min(limit, values.length)) }, async () => {
|
|
705
|
+
while (offset < values.length) {
|
|
706
|
+
const value = values[offset++];
|
|
707
|
+
await operation(value);
|
|
708
|
+
}
|
|
709
|
+
});
|
|
710
|
+
await Promise.all(workers);
|
|
711
|
+
}
|
|
712
|
+
async #load() {
|
|
713
|
+
if (this.#loaded)
|
|
714
|
+
return;
|
|
715
|
+
this.#loaded = true;
|
|
716
|
+
try {
|
|
717
|
+
const value = JSON.parse(await readFile(this.checkpoint_path, "utf8"));
|
|
718
|
+
if (value.version === 1 && object(value.sessions))
|
|
719
|
+
this.#checkpoints = value;
|
|
720
|
+
}
|
|
721
|
+
catch (error) {
|
|
722
|
+
if (error.code !== "ENOENT")
|
|
723
|
+
this.registry.emit("warning", new Error("OpenCode checkpoint is malformed; discovery will rebuild it"));
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
async #save() {
|
|
727
|
+
const ordered = Object.entries(this.#checkpoints.sessions).sort(([, a], [, b]) => (epoch(b.updated) ?? 0) - (epoch(a.updated) ?? 0));
|
|
728
|
+
if (this.options.max_sessions !== undefined)
|
|
729
|
+
ordered.splice(this.options.max_sessions);
|
|
730
|
+
this.#checkpoints.sessions = Object.fromEntries(ordered);
|
|
731
|
+
await mkdir(dirname(this.checkpoint_path), { recursive: true, mode: 0o700 });
|
|
732
|
+
const temporary = `${this.checkpoint_path}.${process.pid}.tmp`;
|
|
733
|
+
await writeFile(temporary, `${JSON.stringify(this.#checkpoints)}\n`, { mode: 0o600 });
|
|
734
|
+
await rename(temporary, this.checkpoint_path);
|
|
735
|
+
}
|
|
736
|
+
#diagnostic(message, warning = false) {
|
|
737
|
+
if (this.#diagnostics.has(message))
|
|
738
|
+
return;
|
|
739
|
+
this.#diagnostics.add(message);
|
|
740
|
+
this.registry.emit(warning ? "warning" : "log", warning ? new Error(message) : message);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
class ReadOnlyOpenCodeTarget {
|
|
744
|
+
#error() { throw new Error("This OpenCode session was discovered by export and is read-only. Rivetplane can show live pending questions, but it cannot resolve the Deferred in the original OpenCode process."); }
|
|
745
|
+
async sendMessage(_text) { this.#error(); }
|
|
746
|
+
async respondToPending(_id, _response) { this.#error(); }
|
|
747
|
+
async interrupt() { this.#error(); }
|
|
748
|
+
}
|
|
749
|
+
//# sourceMappingURL=opencode-export-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-export-discovery.js","sourceRoot":"","sources":["../src/opencode-export-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.js
CHANGED
|
@@ -26,9 +26,9 @@ export class SessionRegistry extends EventEmitter {
|
|
|
26
26
|
entry.session = { ...entry.session, pending, last_activity_at: new Date().toISOString() };
|
|
27
27
|
this.emit("session", structuredClone(entry.session));
|
|
28
28
|
}
|
|
29
|
-
append(id, type, payload) {
|
|
29
|
+
append(id, type, payload, source) {
|
|
30
30
|
const entry = this.#require(id);
|
|
31
|
-
const event = { id: randomUUID(), session_id: id, seq: entry.next_seq++, ts: new Date().toISOString(), type, payload };
|
|
31
|
+
const event = { id: source?.id ?? randomUUID(), session_id: id, seq: entry.next_seq++, ts: source?.ts ?? new Date().toISOString(), type, payload };
|
|
32
32
|
entry.transcript.push(event);
|
|
33
33
|
entry.session = { ...entry.session, last_activity_at: event.ts };
|
|
34
34
|
this.emit("transcript", structuredClone(event));
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rivetplane",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Connect local agent harnesses to the Rivetplane control plane",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"acp",
|
|
@@ -48,10 +48,12 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@opencode-ai/sdk": "^1.18.23",
|
|
51
|
+
"cross-spawn": "^7.0.6",
|
|
51
52
|
"open": "^11.0.1",
|
|
52
53
|
"ws": "^8.21.0"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
56
|
+
"@types/cross-spawn": "^6.0.6",
|
|
55
57
|
"@types/ws": "^8.18.1"
|
|
56
58
|
}
|
|
57
59
|
}
|