rivetplane 0.4.2 → 0.6.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 +18 -1
- package/dist/acp-attach.js +26 -4
- package/dist/acp-attach.js.map +1 -1
- package/dist/claude-code-discovery.js +123 -7
- package/dist/claude-code-discovery.js.map +1 -1
- package/dist/cli.js +48 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.js +92 -13
- package/dist/client.js.map +1 -1
- package/dist/codex-app-server.js +153 -8
- package/dist/codex-app-server.js.map +1 -1
- package/dist/codex-rollout-discovery.js +121 -7
- package/dist/codex-rollout-discovery.js.map +1 -1
- package/dist/hook-bridge-install.js +133 -0
- package/dist/hook-bridge-install.js.map +1 -0
- package/dist/hook-bridge.js +79 -0
- package/dist/hook-bridge.js.map +1 -0
- package/dist/hook-discovery.js +115 -0
- package/dist/hook-discovery.js.map +1 -0
- package/dist/hook-ingestion.js +507 -0
- package/dist/hook-ingestion.js.map +1 -0
- package/dist/hook-install.js +348 -0
- package/dist/hook-install.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/launch-command.js +51 -0
- package/dist/launch-command.js.map +1 -0
- package/dist/local-api.js +44 -3
- package/dist/local-api.js.map +1 -1
- package/dist/opencode-export-discovery.js +16 -4
- package/dist/opencode-export-discovery.js.map +1 -1
- package/dist/opencode-manager.js +126 -7
- package/dist/opencode-manager.js.map +1 -1
- package/dist/pending-normalization.js +29 -0
- package/dist/pending-normalization.js.map +1 -0
- package/dist/registry.js +6 -2
- package/dist/registry.js.map +1 -1
- package/dist/relay.js +184 -14
- package/dist/relay.js.map +1 -1
- package/dist/session-manager.js +3 -1
- package/dist/session-manager.js.map +1 -1
- package/dist/usage.js +131 -0
- package/dist/usage.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function object(value) {
|
|
2
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
3
|
+
}
|
|
4
|
+
function text(value) {
|
|
5
|
+
const result = typeof value === "string"
|
|
6
|
+
? value
|
|
7
|
+
: Array.isArray(value) && value.every((item) => typeof item === "string")
|
|
8
|
+
? value.join(" ")
|
|
9
|
+
: undefined;
|
|
10
|
+
const trimmed = result?.trim();
|
|
11
|
+
return trimmed || undefined;
|
|
12
|
+
}
|
|
13
|
+
function bounded(value, limit) {
|
|
14
|
+
return value.length <= limit ? value : `${value.slice(0, limit - 1)}…`;
|
|
15
|
+
}
|
|
16
|
+
/** Normalize one harness-native approval payload before it enters the shared registry. */
|
|
17
|
+
export function normalizeApprovalInput(value, limit = 2_000) {
|
|
18
|
+
const record = object(value);
|
|
19
|
+
const command = text(record?.command) ?? text(record?.cmd);
|
|
20
|
+
const description = text(record?.description) ?? text(record?.reason) ?? text(record?.justification);
|
|
21
|
+
const raw = typeof value === "string" ? value : JSON.stringify(value);
|
|
22
|
+
const summary = bounded(raw || description || command || "Approval requested", limit);
|
|
23
|
+
return {
|
|
24
|
+
summary,
|
|
25
|
+
...(command ? { command: bounded(command, limit) } : {}),
|
|
26
|
+
...(description ? { description: bounded(description, limit) } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=pending-normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-normalization.js","sourceRoot":"","sources":["../src/pending-normalization.ts"],"names":[],"mappings":"AAQA,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;AACxG,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ;QACtC,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;YACvE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YACjB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/B,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,KAAa;IAC3C,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;AACzE,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAE,KAAK,GAAG,KAAK;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrG,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,WAAW,IAAI,OAAO,IAAI,oBAAoB,EAAE,KAAK,CAAC,CAAC;IACtF,OAAO;QACL,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC"}
|
package/dist/registry.js
CHANGED
|
@@ -6,11 +6,15 @@ export class SessionRegistry extends EventEmitter {
|
|
|
6
6
|
list() { return [...this.#entries.values()].map(({ session }) => structuredClone(session)); }
|
|
7
7
|
get(id) { const value = this.#entries.get(id)?.session; return value ? structuredClone(value) : undefined; }
|
|
8
8
|
transcript(id, since = 0, limit = 100) { return (this.#entries.get(id)?.transcript ?? []).filter((event) => event.seq > since).slice(0, limit).map((event) => structuredClone(event)); }
|
|
9
|
-
|
|
9
|
+
transcriptTail(id, limit) { const events = this.#entries.get(id)?.transcript ?? []; return events.slice(Math.max(0, events.length - limit)).map((event) => structuredClone(event)); }
|
|
10
|
+
upsert(session, options = {}) {
|
|
10
11
|
const prior = this.#entries.get(session.id);
|
|
12
|
+
const authority = options.authority ?? 0;
|
|
13
|
+
if (prior && authority < prior.authority)
|
|
14
|
+
return structuredClone(prior.session);
|
|
11
15
|
if (prior && isDeepStrictEqual(prior.session, session))
|
|
12
16
|
return structuredClone(prior.session);
|
|
13
|
-
const entry = prior ? { ...prior, session: structuredClone(session) } : { session: structuredClone(session), transcript: [], event_ids: new Map(), next_seq: 1 };
|
|
17
|
+
const entry = prior ? { ...prior, session: structuredClone(session), authority: Math.max(prior.authority, authority) } : { session: structuredClone(session), transcript: [], event_ids: new Map(), next_seq: 1, authority };
|
|
14
18
|
this.#entries.set(session.id, entry);
|
|
15
19
|
this.emit("session", structuredClone(entry.session));
|
|
16
20
|
return structuredClone(entry.session);
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAK9C,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEpC,IAAI,KAAgB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,GAAG,CAAC,EAAU,IAAyB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzI,UAAU,CAAC,EAAU,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,IAAuB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/relay.js
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
import WebSocket from "ws";
|
|
3
3
|
import { SessionRegistry } from "./registry.js";
|
|
4
|
+
const SNAPSHOT_SESSION_LIMIT = 16;
|
|
5
|
+
const REPLAY_LIMIT_PER_SESSION = 20;
|
|
6
|
+
const REPLAY_EVENT_LIMIT = 40;
|
|
7
|
+
const REPLAY_DELAY_MS = 5_000;
|
|
8
|
+
// Transcript repair is deliberately slower than live state. The server applies
|
|
9
|
+
// relay frames serially, so a fast replay can otherwise put a newly requested
|
|
10
|
+
// approval or question behind minutes of database writes.
|
|
11
|
+
const REPLAY_INTERVAL_MS = 15_000;
|
|
12
|
+
// The hosted store performs durable work for each relay frame. Keep background
|
|
13
|
+
// session/transcript traffic below that write path's sustained rate so an
|
|
14
|
+
// already-sent pending frame is not trapped behind server-side database work.
|
|
15
|
+
// Supabase's hosted connection can take multiple seconds to durably apply one
|
|
16
|
+
// session or transcript frame. Stay comfortably below that rate so background
|
|
17
|
+
// discovery can never build an ordered server queue in front of a live hook.
|
|
18
|
+
const SESSION_DRAIN_INTERVAL_MS = 5_000;
|
|
19
|
+
function snapshotSessions(registry) {
|
|
20
|
+
return registry.list().sort((left, right) => {
|
|
21
|
+
const pending = Number(Boolean(right.pending)) - Number(Boolean(left.pending));
|
|
22
|
+
return pending || Date.parse(right.last_activity_at) - Date.parse(left.last_activity_at);
|
|
23
|
+
}).slice(0, SNAPSHOT_SESSION_LIMIT);
|
|
24
|
+
}
|
|
4
25
|
function relayUrl(server) {
|
|
5
26
|
const url = new URL(server);
|
|
6
27
|
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
@@ -15,34 +36,51 @@ export class OutboundRelay extends EventEmitter {
|
|
|
15
36
|
#socket;
|
|
16
37
|
#retry;
|
|
17
38
|
#heartbeat;
|
|
39
|
+
#replay;
|
|
18
40
|
#stopped = true;
|
|
19
41
|
#attempt = 0;
|
|
20
42
|
#queue = [];
|
|
43
|
+
#sessionQueue = new Map();
|
|
44
|
+
#transcriptQueue = [];
|
|
45
|
+
#drainTranscriptNext = false;
|
|
46
|
+
#sessionDrain;
|
|
21
47
|
#externalToLocal = new Map();
|
|
48
|
+
#capabilityFingerprints = new Map();
|
|
22
49
|
constructor(credentials, registry, target, options = {}) {
|
|
23
50
|
super();
|
|
24
51
|
this.credentials = credentials;
|
|
25
52
|
this.registry = registry;
|
|
26
53
|
this.target = target;
|
|
27
54
|
this.options = options;
|
|
28
|
-
registry.on("session", (session) => this
|
|
55
|
+
registry.on("session", (session) => this.#sendSession(session));
|
|
29
56
|
registry.on("transcript", (event) => {
|
|
30
57
|
const session = registry.get(event.session_id);
|
|
31
58
|
if (!session)
|
|
32
59
|
return;
|
|
33
|
-
|
|
60
|
+
// Transcript repair is lower priority than a live approval or question.
|
|
61
|
+
// Queue and throttle it so a busy rollout cannot fill the ordered socket
|
|
62
|
+
// ahead of a time-limited pending interaction.
|
|
63
|
+
if (this.#stopped)
|
|
64
|
+
return;
|
|
65
|
+
this.#transcriptQueue.push({ type: "transcript.append", event: { ...event, session_id: this.#externalId(session) } });
|
|
66
|
+
if (this.#transcriptQueue.length > 10_000)
|
|
67
|
+
this.#transcriptQueue.shift();
|
|
68
|
+
this.#scheduleSessionDrain();
|
|
34
69
|
});
|
|
35
70
|
registry.on("removed", (session_id) => {
|
|
36
71
|
const external = [...this.#externalToLocal].find(([, local]) => local === session_id)?.[0] ?? session_id;
|
|
37
72
|
this.send({ type: "session.removed", session_id: external, removed_at: new Date().toISOString() });
|
|
38
73
|
this.#externalToLocal.delete(external);
|
|
39
74
|
});
|
|
75
|
+
options.usage?.on("usage", (sample) => this.send({ type: "usage.sample", sample: this.#namespaceUsage(sample) }));
|
|
40
76
|
}
|
|
41
77
|
start() { if (!this.#stopped)
|
|
42
78
|
return; this.#stopped = false; this.#connect(); }
|
|
43
79
|
stop() { this.#stopped = true; if (this.#retry)
|
|
44
80
|
clearTimeout(this.#retry); if (this.#heartbeat)
|
|
45
|
-
clearInterval(this.#heartbeat); this.#
|
|
81
|
+
clearInterval(this.#heartbeat); if (this.#replay)
|
|
82
|
+
clearTimeout(this.#replay); if (this.#sessionDrain)
|
|
83
|
+
clearTimeout(this.#sessionDrain); this.#socket?.close(); }
|
|
46
84
|
send(message) {
|
|
47
85
|
if (this.#socket?.readyState === WebSocket.OPEN)
|
|
48
86
|
this.#socket.send(JSON.stringify(message));
|
|
@@ -62,23 +100,51 @@ export class OutboundRelay extends EventEmitter {
|
|
|
62
100
|
const now = new Date().toISOString();
|
|
63
101
|
const machine = { id: this.credentials.machine_id, name: this.credentials.machine_name, owner_account_id: this.credentials.owner_account_id, last_seen_at: now, status: "online" };
|
|
64
102
|
socket.send(JSON.stringify({ type: "machine.hello", protocol_version: 1, machine }));
|
|
65
|
-
|
|
103
|
+
const sessions = snapshotSessions(this.registry);
|
|
104
|
+
for (const session of sessions.filter((candidate) => candidate.pending)) {
|
|
66
105
|
socket.send(JSON.stringify({ type: "session.upsert", session: this.#namespace(session) }));
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
106
|
+
}
|
|
107
|
+
this.#sendCapabilities(socket, true);
|
|
108
|
+
// Discovery can populate thousands of sessions before the first socket
|
|
109
|
+
// opens. Never replay that raw startup queue: snapshots and bounded repair
|
|
110
|
+
// already cover it, while flooding it can delay a new question by minutes.
|
|
111
|
+
// Preserve every pending item plus control results/removals that cannot be
|
|
112
|
+
// reconstructed from the registry.
|
|
113
|
+
const pending = new Map();
|
|
114
|
+
const essential = [];
|
|
115
|
+
for (const message of this.#queue.splice(0)) {
|
|
116
|
+
if (message.type === "session.upsert") {
|
|
117
|
+
if (message.session.pending)
|
|
118
|
+
pending.set(message.session.id, message);
|
|
71
119
|
}
|
|
120
|
+
else if (message.type === "command.result" || message.type === "session.removed" || message.type === "usage.sample")
|
|
121
|
+
essential.push(message);
|
|
72
122
|
}
|
|
73
|
-
for (const
|
|
74
|
-
socket.send(JSON.stringify({ type: "harness.capabilities", capabilities }));
|
|
75
|
-
for (const message of this.#queue.splice(0))
|
|
123
|
+
for (const message of [...pending.values(), ...essential])
|
|
76
124
|
socket.send(JSON.stringify(message));
|
|
125
|
+
// Session changes discovered before the socket opened are already
|
|
126
|
+
// represented by the bounded snapshot and repair pass above. Draining
|
|
127
|
+
// thousands of stale startup records here creates an ordered server-side
|
|
128
|
+
// backlog that can delay a live Claude question for over a minute.
|
|
129
|
+
this.#sessionQueue.clear();
|
|
130
|
+
this.#scheduleSessionDrain();
|
|
131
|
+
// Repair transcript history after live state has had time to settle. One
|
|
132
|
+
// frame per tick keeps new approvals and questions ahead of old events.
|
|
133
|
+
this.#scheduleReplay(socket, sessions);
|
|
77
134
|
this.#heartbeat = setInterval(() => {
|
|
78
135
|
this.send({ type: "machine.heartbeat", machine_id: machine.id, sent_at: new Date().toISOString() });
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
136
|
+
// Hook-backed adapters become actionable only after the first native
|
|
137
|
+
// event arrives. Re-advertise a capability report when its semantics
|
|
138
|
+
// change so a read-only discovery report cannot remain authoritative
|
|
139
|
+
// for the lifetime of the relay connection.
|
|
140
|
+
this.#sendCapabilities(socket);
|
|
141
|
+
// A socket can appear open briefly while a proxy restart drops a frame.
|
|
142
|
+
// Pending state is tiny and time-sensitive, so re-announce it until the
|
|
143
|
+
// harness resolves it. This repairs a lost question without replaying
|
|
144
|
+
// the full session or transcript backlog.
|
|
145
|
+
for (const session of snapshotSessions(this.registry).filter((candidate) => candidate.pending))
|
|
146
|
+
this.send({ type: "session.upsert", session: this.#namespace(session) });
|
|
147
|
+
}, this.options.heartbeat_interval_ms ?? 15_000);
|
|
82
148
|
this.#heartbeat.unref();
|
|
83
149
|
this.emit("online");
|
|
84
150
|
});
|
|
@@ -87,7 +153,13 @@ export class OutboundRelay extends EventEmitter {
|
|
|
87
153
|
socket.on("close", () => {
|
|
88
154
|
if (this.#heartbeat)
|
|
89
155
|
clearInterval(this.#heartbeat);
|
|
156
|
+
if (this.#replay)
|
|
157
|
+
clearTimeout(this.#replay);
|
|
158
|
+
if (this.#sessionDrain)
|
|
159
|
+
clearTimeout(this.#sessionDrain);
|
|
90
160
|
this.#heartbeat = undefined;
|
|
161
|
+
this.#replay = undefined;
|
|
162
|
+
this.#sessionDrain = undefined;
|
|
91
163
|
this.#socket = undefined;
|
|
92
164
|
this.emit("offline");
|
|
93
165
|
if (!this.#stopped) {
|
|
@@ -97,6 +169,94 @@ export class OutboundRelay extends EventEmitter {
|
|
|
97
169
|
}
|
|
98
170
|
});
|
|
99
171
|
}
|
|
172
|
+
#sendSession(session) {
|
|
173
|
+
const id = this.#externalId(session);
|
|
174
|
+
if (session.pending) {
|
|
175
|
+
// Pending interactions are latency-sensitive. Remove any older ordinary
|
|
176
|
+
// snapshot for this session and put the actionable state straight onto
|
|
177
|
+
// the wire instead of behind a large discovery refresh.
|
|
178
|
+
this.#sessionQueue.delete(id);
|
|
179
|
+
this.send({ type: "session.upsert", session: this.#namespace(session) });
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this.#sessionQueue.set(id, session);
|
|
183
|
+
this.#scheduleSessionDrain();
|
|
184
|
+
}
|
|
185
|
+
#scheduleSessionDrain() {
|
|
186
|
+
if (this.#sessionDrain || this.#stopped || (this.#sessionQueue.size === 0 && this.#transcriptQueue.length === 0))
|
|
187
|
+
return;
|
|
188
|
+
this.#sessionDrain = setTimeout(() => {
|
|
189
|
+
this.#sessionDrain = undefined;
|
|
190
|
+
if (this.#socket?.readyState === WebSocket.OPEN) {
|
|
191
|
+
const next = this.#sessionQueue.entries().next().value;
|
|
192
|
+
if (this.#drainTranscriptNext && this.#transcriptQueue.length > 0)
|
|
193
|
+
this.send(this.#transcriptQueue.shift());
|
|
194
|
+
else if (next) {
|
|
195
|
+
this.#sessionQueue.delete(next[0]);
|
|
196
|
+
this.send({ type: "session.upsert", session: this.#namespace(next[1]) });
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
const fallback = this.#transcriptQueue.shift();
|
|
200
|
+
if (fallback)
|
|
201
|
+
this.send(fallback);
|
|
202
|
+
}
|
|
203
|
+
this.#drainTranscriptNext = !this.#drainTranscriptNext;
|
|
204
|
+
}
|
|
205
|
+
this.#scheduleSessionDrain();
|
|
206
|
+
}, this.options.session_drain_interval_ms ?? SESSION_DRAIN_INTERVAL_MS);
|
|
207
|
+
this.#sessionDrain.unref();
|
|
208
|
+
}
|
|
209
|
+
#sendCapabilities(socket, force = false) {
|
|
210
|
+
for (const capabilities of this.options.capabilities?.() ?? []) {
|
|
211
|
+
const { reported_at: _reportedAt, ...semantic } = capabilities;
|
|
212
|
+
const fingerprint = JSON.stringify(semantic);
|
|
213
|
+
if (!force && this.#capabilityFingerprints.get(capabilities.harness_type) === fingerprint)
|
|
214
|
+
continue;
|
|
215
|
+
this.#capabilityFingerprints.set(capabilities.harness_type, fingerprint);
|
|
216
|
+
socket.send(JSON.stringify({ type: "harness.capabilities", capabilities }));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
#scheduleReplay(socket, sessions) {
|
|
220
|
+
const snapshots = sessions.filter((session) => !session.pending);
|
|
221
|
+
let snapshotOffset = 0;
|
|
222
|
+
const replays = sessions.map((session) => ({ session, events: this.registry.transcriptTail(session.id, REPLAY_LIMIT_PER_SESSION), offset: 0 }));
|
|
223
|
+
let cursor = 0;
|
|
224
|
+
let sent = 0;
|
|
225
|
+
const next = () => {
|
|
226
|
+
if (this.#stopped || socket !== this.#socket || socket.readyState !== WebSocket.OPEN || sent >= REPLAY_EVENT_LIMIT) {
|
|
227
|
+
this.#replay = undefined;
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const snapshot = snapshots[snapshotOffset++];
|
|
231
|
+
if (snapshot) {
|
|
232
|
+
socket.send(JSON.stringify({ type: "session.upsert", session: this.#namespace(snapshot) }));
|
|
233
|
+
this.#replay = setTimeout(next, this.options.replay_interval_ms ?? REPLAY_INTERVAL_MS);
|
|
234
|
+
this.#replay.unref();
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
let event;
|
|
238
|
+
let session;
|
|
239
|
+
for (let checked = 0; checked < replays.length; checked++) {
|
|
240
|
+
const replay = replays[cursor++ % replays.length];
|
|
241
|
+
const candidate = replay.events[replay.offset++];
|
|
242
|
+
if (candidate) {
|
|
243
|
+
event = candidate;
|
|
244
|
+
session = replay.session;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!event || !session) {
|
|
249
|
+
this.#replay = undefined;
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
socket.send(JSON.stringify({ type: "transcript.append", event: { ...event, session_id: this.#externalId(session) } }));
|
|
253
|
+
sent++;
|
|
254
|
+
this.#replay = setTimeout(next, this.options.replay_interval_ms ?? REPLAY_INTERVAL_MS);
|
|
255
|
+
this.#replay.unref();
|
|
256
|
+
};
|
|
257
|
+
this.#replay = setTimeout(next, this.options.replay_delay_ms ?? REPLAY_DELAY_MS);
|
|
258
|
+
this.#replay.unref();
|
|
259
|
+
}
|
|
100
260
|
async #command(raw) {
|
|
101
261
|
let command;
|
|
102
262
|
try {
|
|
@@ -106,6 +266,10 @@ export class OutboundRelay extends EventEmitter {
|
|
|
106
266
|
this.emit("warning", new Error("Relay sent invalid JSON"));
|
|
107
267
|
return;
|
|
108
268
|
}
|
|
269
|
+
if (command.type === "relay.error") {
|
|
270
|
+
this.emit("warning", new Error(`Relay rejected a frame: ${command.error}`));
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
109
273
|
if (command.type !== "command.send_message" && command.type !== "command.respond_to_pending" && command.type !== "command.interrupt_session" && command.type !== "command.create_session")
|
|
110
274
|
return;
|
|
111
275
|
if (command.type === "command.create_session") {
|
|
@@ -149,5 +313,11 @@ export class OutboundRelay extends EventEmitter {
|
|
|
149
313
|
const id = this.#externalId(session);
|
|
150
314
|
return { ...session, id, pending: session.pending ? { ...session.pending, session_id: id } : null };
|
|
151
315
|
}
|
|
316
|
+
#namespaceUsage(sample) {
|
|
317
|
+
if (!sample.session_id)
|
|
318
|
+
return sample;
|
|
319
|
+
const session = this.registry.get(sample.session_id);
|
|
320
|
+
return session ? { ...sample, session_id: this.#externalId(session) } : sample;
|
|
321
|
+
}
|
|
152
322
|
}
|
|
153
323
|
//# sourceMappingURL=relay.js.map
|
package/dist/relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|
package/dist/session-manager.js
CHANGED
|
@@ -3,6 +3,7 @@ import { ACPAttach } from "./acp-attach.js";
|
|
|
3
3
|
import { SessionRegistry } from "./registry.js";
|
|
4
4
|
export class SessionManager {
|
|
5
5
|
machine_id;
|
|
6
|
+
options;
|
|
6
7
|
registry;
|
|
7
8
|
discovery;
|
|
8
9
|
#sessions = new Map();
|
|
@@ -11,6 +12,7 @@ export class SessionManager {
|
|
|
11
12
|
#reconcile = Promise.resolve();
|
|
12
13
|
constructor(machine_id, options = {}) {
|
|
13
14
|
this.machine_id = machine_id;
|
|
15
|
+
this.options = options;
|
|
14
16
|
this.registry = new SessionRegistry();
|
|
15
17
|
this.discovery = new SessionDiscovery(options);
|
|
16
18
|
this.discovery.on("sessions", (descriptors) => {
|
|
@@ -54,7 +56,7 @@ export class SessionManager {
|
|
|
54
56
|
current?.attach.close();
|
|
55
57
|
this.#sessions.delete(descriptor.session_id);
|
|
56
58
|
this.#connecting.add(descriptor.session_id);
|
|
57
|
-
const attach = new ACPAttach(descriptor, this.registry, this.machine_id);
|
|
59
|
+
const attach = new ACPAttach(descriptor, this.registry, this.machine_id, this.options.usage);
|
|
58
60
|
try {
|
|
59
61
|
await attach.connect();
|
|
60
62
|
this.#sessions.set(descriptor.session_id, { signature, attach });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/usage.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
const TOKEN_KEYS = ["input", "output", "reasoning", "cache_read", "cache_write", "total"];
|
|
7
|
+
const MAX_EVENT_IDS = 20_000;
|
|
8
|
+
function finite(value) {
|
|
9
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
|
|
10
|
+
}
|
|
11
|
+
function tokens(value) {
|
|
12
|
+
return {
|
|
13
|
+
input: finite(value.input), output: finite(value.output), reasoning: finite(value.reasoning),
|
|
14
|
+
cache_read: finite(value.cache_read), cache_write: finite(value.cache_write), total: finite(value.total),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function canonical(value) {
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
20
|
+
if (value && typeof value === "object")
|
|
21
|
+
return `{${Object.entries(value).filter(([, item]) => item !== undefined).sort(([a], [b]) => a.localeCompare(b)).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(",")}}`;
|
|
22
|
+
return JSON.stringify(value);
|
|
23
|
+
}
|
|
24
|
+
function stableId(value) { return `usage:${createHash("sha256").update(canonical(value)).digest("base64url").slice(0, 32)}`; }
|
|
25
|
+
function delta(current, prior) {
|
|
26
|
+
if (current === null)
|
|
27
|
+
return null;
|
|
28
|
+
if (prior === null)
|
|
29
|
+
return current;
|
|
30
|
+
return current >= prior ? current - prior : 0;
|
|
31
|
+
}
|
|
32
|
+
function cleanCost(value) {
|
|
33
|
+
if (!value)
|
|
34
|
+
return { status: "unavailable" };
|
|
35
|
+
const amount = finite(value.amount);
|
|
36
|
+
return {
|
|
37
|
+
status: value.status,
|
|
38
|
+
...(amount !== null ? { amount } : {}),
|
|
39
|
+
...(typeof value.currency === "string" && value.currency ? { currency: value.currency.toUpperCase() } : {}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Normalizes source counters and keeps a small durable replay checkpoint. */
|
|
43
|
+
export class UsageCollector extends EventEmitter {
|
|
44
|
+
machine_id;
|
|
45
|
+
options;
|
|
46
|
+
checkpoint_path;
|
|
47
|
+
#checkpoint = { version: 1, counters: {}, recent_event_ids: [] };
|
|
48
|
+
#seen = new Set();
|
|
49
|
+
#loaded = false;
|
|
50
|
+
#saveChain = Promise.resolve();
|
|
51
|
+
constructor(machine_id, options = {}) {
|
|
52
|
+
super();
|
|
53
|
+
this.machine_id = machine_id;
|
|
54
|
+
this.options = options;
|
|
55
|
+
this.checkpoint_path = options.checkpoint_path ?? join(homedir(), ".config", "harness-cp", "usage-checkpoints.json");
|
|
56
|
+
}
|
|
57
|
+
async start() {
|
|
58
|
+
if (this.#loaded)
|
|
59
|
+
return;
|
|
60
|
+
this.#loaded = true;
|
|
61
|
+
try {
|
|
62
|
+
const value = JSON.parse(await readFile(this.checkpoint_path, "utf8"));
|
|
63
|
+
if (value.version === 1 && value.counters && Array.isArray(value.recent_event_ids))
|
|
64
|
+
this.#checkpoint = value;
|
|
65
|
+
}
|
|
66
|
+
catch { /* A missing or invalid checkpoint starts a safe new baseline. */ }
|
|
67
|
+
this.#seen = new Set(this.#checkpoint.recent_event_ids);
|
|
68
|
+
}
|
|
69
|
+
ingest(raw) {
|
|
70
|
+
if (!this.#loaded)
|
|
71
|
+
throw new Error("UsageCollector.start() must complete before ingest()");
|
|
72
|
+
const currentTokens = tokens(raw.tokens);
|
|
73
|
+
const currentCost = cleanCost(raw.cost);
|
|
74
|
+
const identity = raw.source_event_id ?? canonical({
|
|
75
|
+
session_id: raw.session_id, turn_id: raw.turn_id, harness: raw.harness, source: raw.source,
|
|
76
|
+
counter_key: raw.counter_key, tokens: currentTokens, context: raw.context, cost: currentCost, quota: raw.quota,
|
|
77
|
+
});
|
|
78
|
+
const event_id = stableId({ machine_id: this.machine_id, harness: raw.harness, session_id: raw.session_id, turn_id: raw.turn_id, source: raw.source, identity });
|
|
79
|
+
if (this.#seen.has(event_id))
|
|
80
|
+
return undefined;
|
|
81
|
+
let normalizedTokens = currentTokens;
|
|
82
|
+
let normalizedCost = currentCost;
|
|
83
|
+
if (raw.source_counter_mode === "cumulative") {
|
|
84
|
+
const key = raw.counter_key ?? `${raw.source}\0${raw.session_id ?? "account"}\0${raw.turn_id ?? "session"}`;
|
|
85
|
+
const prior = this.#checkpoint.counters[key];
|
|
86
|
+
normalizedTokens = Object.fromEntries(TOKEN_KEYS.map((name) => [name, delta(currentTokens[name], prior?.tokens[name] ?? null)]));
|
|
87
|
+
if (currentCost.amount !== undefined) {
|
|
88
|
+
const amount = prior?.cost_amount === undefined ? currentCost.amount : currentCost.amount >= prior.cost_amount ? currentCost.amount - prior.cost_amount : 0;
|
|
89
|
+
normalizedCost = { ...currentCost, amount };
|
|
90
|
+
}
|
|
91
|
+
// A decrease is a source reset. Emit zero for the reset snapshot, then
|
|
92
|
+
// use it as the new baseline so later valid usage is not suppressed.
|
|
93
|
+
this.#checkpoint.counters[key] = { tokens: currentTokens, ...(currentCost.amount !== undefined ? { cost_amount: currentCost.amount } : {}) };
|
|
94
|
+
}
|
|
95
|
+
const sample = {
|
|
96
|
+
event_id, machine_id: this.machine_id, session_id: raw.session_id,
|
|
97
|
+
...(raw.turn_id ? { turn_id: raw.turn_id } : {}),
|
|
98
|
+
timestamp: validTimestamp(raw.timestamp, this.options.now?.() ?? Date.now()), harness: raw.harness,
|
|
99
|
+
...(raw.provider ? { provider: raw.provider } : {}), ...(raw.model ? { model: raw.model } : {}),
|
|
100
|
+
source: raw.source, source_counter_mode: raw.source_counter_mode, tokens: normalizedTokens,
|
|
101
|
+
...(raw.context ? { context: raw.context } : {}), cost: normalizedCost,
|
|
102
|
+
...(raw.quota ? { quota: raw.quota } : {}),
|
|
103
|
+
};
|
|
104
|
+
this.#seen.add(event_id);
|
|
105
|
+
this.#checkpoint.recent_event_ids.push(event_id);
|
|
106
|
+
const limit = this.options.max_event_ids ?? MAX_EVENT_IDS;
|
|
107
|
+
if (this.#checkpoint.recent_event_ids.length > limit) {
|
|
108
|
+
this.#checkpoint.recent_event_ids.splice(0, this.#checkpoint.recent_event_ids.length - limit);
|
|
109
|
+
this.#seen = new Set(this.#checkpoint.recent_event_ids);
|
|
110
|
+
}
|
|
111
|
+
this.#scheduleSave();
|
|
112
|
+
this.emit("usage", structuredClone(sample));
|
|
113
|
+
return structuredClone(sample);
|
|
114
|
+
}
|
|
115
|
+
async flush() { await this.#saveChain; }
|
|
116
|
+
#scheduleSave() {
|
|
117
|
+
const snapshot = structuredClone(this.#checkpoint);
|
|
118
|
+
const path = this.checkpoint_path;
|
|
119
|
+
this.#saveChain = this.#saveChain.then(async () => {
|
|
120
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
121
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
122
|
+
await writeFile(temporary, `${JSON.stringify(snapshot)}\n`, { mode: 0o600 });
|
|
123
|
+
await rename(temporary, path);
|
|
124
|
+
}).catch((error) => { this.emit("warning", error); });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function validTimestamp(value, fallback) {
|
|
128
|
+
const parsed = value ? Date.parse(value) : Number.NaN;
|
|
129
|
+
return new Date(Number.isFinite(parsed) ? parsed : fallback).toISOString();
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
|