@mahekara28/context-relay 0.0.0-stage → 0.3.0-beta.1
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/LICENSE +21 -0
- package/README.md +128 -2
- package/README.python.md +246 -0
- package/dist/adapters/capture.d.ts +4 -0
- package/dist/adapters/capture.js +286 -0
- package/dist/adapters/capture.js.map +1 -0
- package/dist/adapters/config.d.ts +11 -0
- package/dist/adapters/config.js +139 -0
- package/dist/adapters/config.js.map +1 -0
- package/dist/adapters/manager.d.ts +57 -0
- package/dist/adapters/manager.js +220 -0
- package/dist/adapters/manager.js.map +1 -0
- package/dist/adapters/normalize.d.ts +9 -0
- package/dist/adapters/normalize.js +166 -0
- package/dist/adapters/normalize.js.map +1 -0
- package/dist/adapters/rpc.d.ts +12 -0
- package/dist/adapters/rpc.js +100 -0
- package/dist/adapters/rpc.js.map +1 -0
- package/dist/adapters/types.d.ts +59 -0
- package/dist/adapters/types.js +51 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +11 -0
- package/dist/client.js +136 -0
- package/dist/client.js.map +1 -0
- package/dist/delivery.d.ts +9 -0
- package/dist/delivery.js +35 -0
- package/dist/delivery.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.js +109 -0
- package/dist/mcp.js.map +1 -0
- package/dist/model.d.ts +169 -0
- package/dist/model.js +79 -0
- package/dist/model.js.map +1 -0
- package/dist/proposals.d.ts +65 -0
- package/dist/proposals.js +134 -0
- package/dist/proposals.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.js +375 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +33 -0
- package/dist/store.js +393 -0
- package/dist/store.js.map +1 -0
- package/dist/ui/app.js +845 -0
- package/dist/ui/assets/THIRD_PARTY_LICENSE.txt +25 -0
- package/dist/ui/assets/claude.svg +1 -0
- package/dist/ui/assets/codex.svg +1 -0
- package/dist/ui/assets/goose.svg +1 -0
- package/dist/ui/assets/opencode.svg +1 -0
- package/dist/ui/assets/relay.svg +1 -0
- package/dist/ui/index.html +23 -0
- package/dist/ui/style.css +989 -0
- package/dist/util.d.ts +16 -0
- package/dist/util.js +86 -0
- package/dist/util.js.map +1 -0
- package/docs/HARNESS_CONNECTIONS.md +53 -0
- package/docs/NPM_QUICKSTART.md +150 -0
- package/docs/WORKSPACE.md +61 -0
- package/docs/releases/NPM_PUBLISHING.md +60 -0
- package/package.json +78 -4
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { RelayError } from "../model.js";
|
|
3
|
+
import { canonical, id, now, redact } from "../util.js";
|
|
4
|
+
import { ConnectionInput, } from "./types.js";
|
|
5
|
+
import { configureMcp, removeMcp, mcpCommand, } from "./config.js";
|
|
6
|
+
import { capture, discover } from "./capture.js";
|
|
7
|
+
export class AdapterManager {
|
|
8
|
+
store;
|
|
9
|
+
busy = new Set();
|
|
10
|
+
running = new Map();
|
|
11
|
+
constructor(store) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
for (const job of this.jobs())
|
|
14
|
+
if (job.state === "running") {
|
|
15
|
+
job.state = "interrupted";
|
|
16
|
+
job.error =
|
|
17
|
+
"The service stopped during capture. Start a new capture to resume safely.";
|
|
18
|
+
this.saveJob(job);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
jobs() {
|
|
22
|
+
return this.store.db
|
|
23
|
+
.prepare("SELECT body FROM capture_jobs ORDER BY rowid DESC LIMIT 100")
|
|
24
|
+
.all()
|
|
25
|
+
.map((row) => JSON.parse(String(row.body)));
|
|
26
|
+
}
|
|
27
|
+
job(jobId) {
|
|
28
|
+
const row = this.store.db
|
|
29
|
+
.prepare("SELECT body FROM capture_jobs WHERE id=?")
|
|
30
|
+
.get(jobId);
|
|
31
|
+
if (!row)
|
|
32
|
+
throw new RelayError("not_found", "Capture job not found.", 404);
|
|
33
|
+
return JSON.parse(String(row.body));
|
|
34
|
+
}
|
|
35
|
+
saveJob(job) {
|
|
36
|
+
this.store.db
|
|
37
|
+
.prepare("INSERT INTO capture_jobs(id,body) VALUES (?,?) ON CONFLICT(id) DO UPDATE SET body=excluded.body")
|
|
38
|
+
.run(job.id, canonical(job));
|
|
39
|
+
}
|
|
40
|
+
cancel(jobId) {
|
|
41
|
+
const job = this.job(jobId);
|
|
42
|
+
const running = this.running.get(jobId);
|
|
43
|
+
if (running)
|
|
44
|
+
running.cancel = true;
|
|
45
|
+
return job;
|
|
46
|
+
}
|
|
47
|
+
async close() {
|
|
48
|
+
for (const running of this.running.values())
|
|
49
|
+
running.cancel = true;
|
|
50
|
+
await Promise.allSettled([...this.running.values()].map((r) => r.promise));
|
|
51
|
+
}
|
|
52
|
+
startSync(connectionId, externalIds) {
|
|
53
|
+
if (externalIds)
|
|
54
|
+
z.array(z.string().min(1).max(500)).max(200).parse(externalIds);
|
|
55
|
+
this.connection(connectionId);
|
|
56
|
+
if (this.busy.has(connectionId))
|
|
57
|
+
throw new RelayError("capture_busy", "Capture is already running.", 409);
|
|
58
|
+
const job = {
|
|
59
|
+
id: id(),
|
|
60
|
+
connectionId,
|
|
61
|
+
state: "running",
|
|
62
|
+
createdAt: now(),
|
|
63
|
+
completed: 0,
|
|
64
|
+
total: 0,
|
|
65
|
+
imported: [],
|
|
66
|
+
errors: [],
|
|
67
|
+
error: null,
|
|
68
|
+
};
|
|
69
|
+
this.saveJob(job);
|
|
70
|
+
const running = { cancel: false, promise: Promise.resolve() };
|
|
71
|
+
running.promise = this.sync(connectionId, externalIds, job, () => running.cancel)
|
|
72
|
+
.then((result) => {
|
|
73
|
+
job.imported = result.imported;
|
|
74
|
+
job.errors = result.errors;
|
|
75
|
+
job.state = running.cancel ? "cancelled" : "completed";
|
|
76
|
+
})
|
|
77
|
+
.catch((error) => {
|
|
78
|
+
job.state = "failed";
|
|
79
|
+
job.error =
|
|
80
|
+
error instanceof RelayError
|
|
81
|
+
? redact(error.message)
|
|
82
|
+
: "Capture failed. Check source configuration.";
|
|
83
|
+
})
|
|
84
|
+
.finally(() => {
|
|
85
|
+
this.saveJob(job);
|
|
86
|
+
this.running.delete(job.id);
|
|
87
|
+
});
|
|
88
|
+
this.running.set(job.id, running);
|
|
89
|
+
return job;
|
|
90
|
+
}
|
|
91
|
+
connections(projectId) {
|
|
92
|
+
return this.store.db
|
|
93
|
+
.prepare("SELECT body FROM connections ORDER BY rowid")
|
|
94
|
+
.all()
|
|
95
|
+
.map((row) => JSON.parse(String(row.body)))
|
|
96
|
+
.filter((row) => !projectId || row.projectId === projectId);
|
|
97
|
+
}
|
|
98
|
+
connection(connectionId) {
|
|
99
|
+
const row = this.store.db
|
|
100
|
+
.prepare("SELECT body FROM connections WHERE id=?")
|
|
101
|
+
.get(connectionId);
|
|
102
|
+
if (!row)
|
|
103
|
+
throw new RelayError("not_found", "Connection not found.", 404);
|
|
104
|
+
return JSON.parse(String(row.body));
|
|
105
|
+
}
|
|
106
|
+
connect(input) {
|
|
107
|
+
const data = ConnectionInput.parse(input);
|
|
108
|
+
const project = this.store.project(data.projectId);
|
|
109
|
+
const previous = this.connections(project.id).find((c) => c.harness === data.harness);
|
|
110
|
+
if (previous && this.busy.has(previous.id))
|
|
111
|
+
throw new RelayError("capture_busy", "Wait for capture before reconnecting.", 409);
|
|
112
|
+
if (previous?.receipt && !data.configureMcp)
|
|
113
|
+
removeMcp(previous.receipt);
|
|
114
|
+
const connection = {
|
|
115
|
+
...data,
|
|
116
|
+
id: previous?.id ?? id(),
|
|
117
|
+
updatedAt: now(),
|
|
118
|
+
configPath: previous?.configPath ?? null,
|
|
119
|
+
receipt: data.configureMcp ? (previous?.receipt ?? null) : null,
|
|
120
|
+
lastSync: previous?.lastSync ?? null,
|
|
121
|
+
lastError: null,
|
|
122
|
+
};
|
|
123
|
+
const receipt = configureMcp(connection, project, this.store.directory);
|
|
124
|
+
connection.receipt = receipt ?? connection.receipt;
|
|
125
|
+
connection.configPath = connection.receipt?.path ?? null;
|
|
126
|
+
this.store.db
|
|
127
|
+
.prepare("INSERT INTO connections(id,project_id,harness,body) VALUES (?,?,?,?) ON CONFLICT(id) DO UPDATE SET body=excluded.body")
|
|
128
|
+
.run(connection.id, project.id, data.harness, canonical(connection));
|
|
129
|
+
return connection;
|
|
130
|
+
}
|
|
131
|
+
disconnect(connectionId) {
|
|
132
|
+
if (this.busy.has(connectionId))
|
|
133
|
+
throw new RelayError("capture_busy", "Wait for capture to finish before disconnecting.", 409);
|
|
134
|
+
const connection = this.connection(connectionId);
|
|
135
|
+
if (connection.receipt)
|
|
136
|
+
removeMcp(connection.receipt);
|
|
137
|
+
this.store.db
|
|
138
|
+
.prepare("DELETE FROM connections WHERE id=?")
|
|
139
|
+
.run(connectionId);
|
|
140
|
+
return { disconnected: true };
|
|
141
|
+
}
|
|
142
|
+
async discover(connectionId) {
|
|
143
|
+
const connection = this.connection(connectionId);
|
|
144
|
+
return discover(connection, this.store.project(connection.projectId));
|
|
145
|
+
}
|
|
146
|
+
async sync(connectionId, externalIds, job, cancelled = () => false) {
|
|
147
|
+
if (externalIds)
|
|
148
|
+
z.array(z.string().min(1).max(500)).max(200).parse(externalIds);
|
|
149
|
+
if (this.busy.has(connectionId))
|
|
150
|
+
throw new RelayError("capture_busy", "Capture is already running for this connection.", 409);
|
|
151
|
+
this.busy.add(connectionId);
|
|
152
|
+
const connection = this.connection(connectionId);
|
|
153
|
+
const project = this.store.project(connection.projectId);
|
|
154
|
+
try {
|
|
155
|
+
const sessions = await discover(connection, project);
|
|
156
|
+
const selected = externalIds
|
|
157
|
+
? sessions.filter((s) => externalIds.includes(s.externalId))
|
|
158
|
+
: sessions;
|
|
159
|
+
if (externalIds?.some((id) => !sessions.some((s) => s.externalId === id)))
|
|
160
|
+
throw new RelayError("not_found", "A selected source session is no longer available.", 404);
|
|
161
|
+
if (selected.length > 200)
|
|
162
|
+
throw new RelayError("source_limit", "Choose at most 200 sessions per capture.");
|
|
163
|
+
if (job) {
|
|
164
|
+
job.total = selected.length;
|
|
165
|
+
this.saveJob(job);
|
|
166
|
+
}
|
|
167
|
+
const imported = [];
|
|
168
|
+
const errors = [];
|
|
169
|
+
for (const session of selected) {
|
|
170
|
+
if (cancelled())
|
|
171
|
+
break;
|
|
172
|
+
try {
|
|
173
|
+
const input = await capture(connection, project, session);
|
|
174
|
+
const result = this.store.importSession(input);
|
|
175
|
+
imported.push({ sessionId: result.session.id, added: result.added });
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
errors.push({
|
|
179
|
+
externalId: session.externalId,
|
|
180
|
+
message: error instanceof RelayError
|
|
181
|
+
? error.message
|
|
182
|
+
: "Source could not be captured.",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (job) {
|
|
186
|
+
job.completed++;
|
|
187
|
+
job.imported = imported;
|
|
188
|
+
job.errors = errors;
|
|
189
|
+
this.saveJob(job);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
connection.lastSync = now();
|
|
193
|
+
connection.lastError = errors.length
|
|
194
|
+
? `${errors.length} source session(s) need attention.`
|
|
195
|
+
: null;
|
|
196
|
+
this.save(connection);
|
|
197
|
+
return { imported, errors };
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
connection.lastError =
|
|
201
|
+
error instanceof RelayError
|
|
202
|
+
? redact(error.message)
|
|
203
|
+
: "Capture failed. Check the source configuration.";
|
|
204
|
+
this.save(connection);
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
this.busy.delete(connectionId);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
command(connectionId) {
|
|
212
|
+
return mcpCommand(this.connection(connectionId), this.store.directory);
|
|
213
|
+
}
|
|
214
|
+
save(connection) {
|
|
215
|
+
this.store.db
|
|
216
|
+
.prepare("UPDATE connections SET body=? WHERE id=?")
|
|
217
|
+
.run(canonical(connection), connection.id);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../packages/relay/src/adapters/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type RelayEvent } from "../model.js";
|
|
2
|
+
export declare const object: (value: unknown) => Record<string, unknown>;
|
|
3
|
+
export declare const array: (value: unknown) => unknown[];
|
|
4
|
+
export declare const string: (value: unknown) => string;
|
|
5
|
+
export declare function visibleText(content: unknown): string;
|
|
6
|
+
export declare function claudeEvents(records: unknown[]): RelayEvent[];
|
|
7
|
+
export declare function codexEvents(turns: unknown[]): RelayEvent[];
|
|
8
|
+
export declare function openCodeEvents(messages: unknown[]): RelayEvent[];
|
|
9
|
+
export declare function gooseEvents(exported: unknown): RelayEvent[];
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { RelayError } from "../model.js";
|
|
2
|
+
export const object = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
|
|
3
|
+
? value
|
|
4
|
+
: {};
|
|
5
|
+
export const array = (value) => Array.isArray(value) ? value : [];
|
|
6
|
+
export const string = (value) => typeof value === "string" ? value : "";
|
|
7
|
+
export function visibleText(content) {
|
|
8
|
+
if (typeof content === "string")
|
|
9
|
+
return content;
|
|
10
|
+
return array(content)
|
|
11
|
+
.map((part) => {
|
|
12
|
+
const p = object(part);
|
|
13
|
+
const type = string(p.type);
|
|
14
|
+
if (["thinking", "reasoning", "redacted_thinking"].includes(type))
|
|
15
|
+
return "";
|
|
16
|
+
if (["text", "input_text", "output_text"].includes(type))
|
|
17
|
+
return string(p.text);
|
|
18
|
+
if (type === "tool_result")
|
|
19
|
+
return "[tool result] " + visibleText(p.content);
|
|
20
|
+
if (type === "toolResponse") {
|
|
21
|
+
const result = object(p.toolResult);
|
|
22
|
+
const value = result.value;
|
|
23
|
+
return ("[tool result] " +
|
|
24
|
+
(result.status === "error"
|
|
25
|
+
? string(result.error)
|
|
26
|
+
: visibleText(Array.isArray(value) ? value : object(value).content)));
|
|
27
|
+
}
|
|
28
|
+
if (type === "toolRequest") {
|
|
29
|
+
const call = object(object(p.toolCall).value);
|
|
30
|
+
return ("[tool request] " +
|
|
31
|
+
string(call.name) +
|
|
32
|
+
" " +
|
|
33
|
+
JSON.stringify(call.arguments ?? {}));
|
|
34
|
+
}
|
|
35
|
+
if (type === "tool_use" || type === "toolCall")
|
|
36
|
+
return ("[tool request] " +
|
|
37
|
+
string(p.name) +
|
|
38
|
+
" " +
|
|
39
|
+
JSON.stringify(p.input ?? p.arguments ?? {}));
|
|
40
|
+
return "";
|
|
41
|
+
})
|
|
42
|
+
.filter(Boolean)
|
|
43
|
+
.join("\n");
|
|
44
|
+
}
|
|
45
|
+
function event(id, role, text, kind = "message") {
|
|
46
|
+
if (!text.trim())
|
|
47
|
+
return null;
|
|
48
|
+
if (text.length > 100000)
|
|
49
|
+
throw new RelayError("event_too_large", "A source event exceeds 100,000 characters. Export a smaller selection.");
|
|
50
|
+
return { id, role, text, kind };
|
|
51
|
+
}
|
|
52
|
+
export function claudeEvents(records) {
|
|
53
|
+
const events = [];
|
|
54
|
+
records.forEach((value, index) => {
|
|
55
|
+
const record = object(value);
|
|
56
|
+
const type = string(record.type);
|
|
57
|
+
const message = object(record.message);
|
|
58
|
+
const id = string(record.uuid) || `line-${index}`;
|
|
59
|
+
if (type === "user" || type === "assistant") {
|
|
60
|
+
const content = message.content;
|
|
61
|
+
const body = Array.isArray(content)
|
|
62
|
+
? content.filter((part) => object(part).type !== "tool_result")
|
|
63
|
+
: content;
|
|
64
|
+
const result = event(id, type, visibleText(body));
|
|
65
|
+
if (result)
|
|
66
|
+
events.push(result);
|
|
67
|
+
array(content).forEach((part, n) => {
|
|
68
|
+
const tool = object(part);
|
|
69
|
+
if (tool.type !== "tool_result")
|
|
70
|
+
return;
|
|
71
|
+
const result = event(id + ":tool:" + (string(tool.tool_use_id) || n), "tool", visibleText([tool]), "tool_result");
|
|
72
|
+
if (result)
|
|
73
|
+
events.push(result);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (type === "system" && record.subtype === "compact_boundary") {
|
|
77
|
+
const result = event(id, "system", "Harness compaction boundary recorded.", "compaction");
|
|
78
|
+
if (result)
|
|
79
|
+
events.push(result);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return events;
|
|
83
|
+
}
|
|
84
|
+
export function codexEvents(turns) {
|
|
85
|
+
const events = [];
|
|
86
|
+
for (const value of turns) {
|
|
87
|
+
const turn = object(value);
|
|
88
|
+
if (turn.status === "inProgress" || turn.status === "in_progress")
|
|
89
|
+
continue;
|
|
90
|
+
for (const raw of array(turn.items)) {
|
|
91
|
+
const item = object(raw);
|
|
92
|
+
const type = string(item.type);
|
|
93
|
+
const id = `${string(turn.id)}:${string(item.id)}`;
|
|
94
|
+
if (!string(turn.id) || !string(item.id))
|
|
95
|
+
throw new RelayError("unsupported_format", "Codex turn/item IDs are required for incremental capture.");
|
|
96
|
+
let result = null;
|
|
97
|
+
if (type === "userMessage")
|
|
98
|
+
result = event(id, "user", visibleText(item.content));
|
|
99
|
+
else if (type === "agentMessage")
|
|
100
|
+
result = event(id, "assistant", string(item.text));
|
|
101
|
+
else if (type === "commandExecution" && item.status !== "inProgress")
|
|
102
|
+
result = event(id, "tool", `Command: ${string(item.command)}\n${string(item.aggregatedOutput)}\nExit: ${String(item.exitCode ?? "unknown")}`, "tool_result");
|
|
103
|
+
else if (type === "contextCompaction")
|
|
104
|
+
result = event(id, "system", "Harness compaction boundary recorded.", "compaction");
|
|
105
|
+
if (result)
|
|
106
|
+
events.push(result);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return events;
|
|
110
|
+
}
|
|
111
|
+
export function openCodeEvents(messages) {
|
|
112
|
+
const events = [];
|
|
113
|
+
for (const raw of messages) {
|
|
114
|
+
const message = object(raw);
|
|
115
|
+
const info = object(message.info);
|
|
116
|
+
const role = string(info.role);
|
|
117
|
+
if (!["user", "assistant"].includes(role))
|
|
118
|
+
continue;
|
|
119
|
+
if (role === "assistant" && !object(info.time).completed)
|
|
120
|
+
continue;
|
|
121
|
+
if (!string(info.id))
|
|
122
|
+
throw new RelayError("unsupported_format", "OpenCode message IDs are required.");
|
|
123
|
+
const text = visibleText(message.parts);
|
|
124
|
+
const result = event(string(info.id), role, text);
|
|
125
|
+
if (result)
|
|
126
|
+
events.push(result);
|
|
127
|
+
for (const rawPart of array(message.parts)) {
|
|
128
|
+
const part = object(rawPart);
|
|
129
|
+
if (part.type === "tool" && object(part.state).status === "completed") {
|
|
130
|
+
const tool = event(`${string(info.id)}:${string(part.id) || string(part.callID)}`, "tool", string(object(part.state).output), "tool_result");
|
|
131
|
+
if (tool)
|
|
132
|
+
events.push(tool);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return events;
|
|
137
|
+
}
|
|
138
|
+
export function gooseEvents(exported) {
|
|
139
|
+
const value = object(exported);
|
|
140
|
+
const messages = Array.isArray(value.conversation)
|
|
141
|
+
? value.conversation
|
|
142
|
+
: Array.isArray(value.messages)
|
|
143
|
+
? value.messages
|
|
144
|
+
: object(value.session).messages;
|
|
145
|
+
if (!Array.isArray(messages))
|
|
146
|
+
throw new RelayError("unsupported_format", "Goose JSON export must contain a conversation or messages array.");
|
|
147
|
+
const events = [];
|
|
148
|
+
messages.forEach((raw, index) => {
|
|
149
|
+
const message = object(raw);
|
|
150
|
+
if (object(message.metadata).userVisible === false)
|
|
151
|
+
return;
|
|
152
|
+
const role = string(message.role);
|
|
153
|
+
if (!["user", "assistant", "tool", "system"].includes(role))
|
|
154
|
+
return;
|
|
155
|
+
const result = event(string(message.id) || `message-${index}`, (array(message.content).every((part) => object(part).type === "toolResponse") && array(message.content).length
|
|
156
|
+
? "tool"
|
|
157
|
+
: role), visibleText(message.content), role === "tool" ||
|
|
158
|
+
array(message.content).some((part) => object(part).type === "toolResponse")
|
|
159
|
+
? "tool_result"
|
|
160
|
+
: "message");
|
|
161
|
+
if (result)
|
|
162
|
+
events.push(result);
|
|
163
|
+
});
|
|
164
|
+
return events;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../packages/relay/src/adapters/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Read-only app-server client. It never grants a server-initiated approval. */
|
|
2
|
+
export declare class JsonLineRpc {
|
|
3
|
+
private child;
|
|
4
|
+
private serial;
|
|
5
|
+
private buffer;
|
|
6
|
+
private pending;
|
|
7
|
+
constructor(executable: string, args: string[], cwd: string);
|
|
8
|
+
private fail;
|
|
9
|
+
request<T = unknown>(method: string, params: unknown): Promise<T>;
|
|
10
|
+
notify(method: string): void;
|
|
11
|
+
close(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { RelayError } from "../model.js";
|
|
3
|
+
/** Read-only app-server client. It never grants a server-initiated approval. */
|
|
4
|
+
export class JsonLineRpc {
|
|
5
|
+
child;
|
|
6
|
+
serial = 0;
|
|
7
|
+
buffer = "";
|
|
8
|
+
pending = new Map();
|
|
9
|
+
constructor(executable, args, cwd) {
|
|
10
|
+
this.child = spawn(executable, args, {
|
|
11
|
+
cwd,
|
|
12
|
+
stdio: "pipe",
|
|
13
|
+
windowsHide: true,
|
|
14
|
+
});
|
|
15
|
+
this.child.stderr.resume();
|
|
16
|
+
this.child.on("error", () => this.fail(new RelayError("harness_unavailable", "Harness executable is unavailable. Configure its absolute path.")));
|
|
17
|
+
this.child.on("exit", () => this.fail(new RelayError("harness_exited", "Harness API process exited.")));
|
|
18
|
+
this.child.stdin.on("error", () => this.fail(new RelayError("harness_pipe", "Harness connection closed.")));
|
|
19
|
+
this.child.stdout.setEncoding("utf8");
|
|
20
|
+
this.child.stdout.on("data", (chunk) => {
|
|
21
|
+
this.buffer += chunk;
|
|
22
|
+
if (Buffer.byteLength(this.buffer) > 16 * 1024 * 1024) {
|
|
23
|
+
this.fail(new RelayError("harness_response_too_large", "Harness response exceeds the capture limit."));
|
|
24
|
+
this.close();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let newline;
|
|
28
|
+
while ((newline = this.buffer.indexOf("\n")) >= 0) {
|
|
29
|
+
const line = this.buffer.slice(0, newline);
|
|
30
|
+
this.buffer = this.buffer.slice(newline + 1);
|
|
31
|
+
if (!line.trim())
|
|
32
|
+
continue;
|
|
33
|
+
let value;
|
|
34
|
+
try {
|
|
35
|
+
value = JSON.parse(line);
|
|
36
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
37
|
+
throw new Error("Invalid JSON-RPC envelope");
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
this.fail(new RelayError("harness_protocol", "Harness emitted invalid JSON."));
|
|
41
|
+
this.close();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (value.method && value.id !== undefined) {
|
|
45
|
+
this.child.stdin.write(JSON.stringify({
|
|
46
|
+
jsonrpc: "2.0",
|
|
47
|
+
id: value.id,
|
|
48
|
+
error: {
|
|
49
|
+
code: -32601,
|
|
50
|
+
message: "Relay capture does not authorize execution.",
|
|
51
|
+
},
|
|
52
|
+
}) + "\n");
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (value.id === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
const waiter = this.pending.get(value.id);
|
|
58
|
+
if (!waiter)
|
|
59
|
+
continue;
|
|
60
|
+
clearTimeout(waiter.timer);
|
|
61
|
+
this.pending.delete(value.id);
|
|
62
|
+
if (value.error)
|
|
63
|
+
waiter.reject(new RelayError("harness_rpc_" + String(value.error.code), "Harness API rejected the capture request. Check the adapter and harness versions."));
|
|
64
|
+
else
|
|
65
|
+
waiter.resolve(value.result);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
fail(error) {
|
|
70
|
+
for (const waiter of this.pending.values()) {
|
|
71
|
+
clearTimeout(waiter.timer);
|
|
72
|
+
waiter.reject(error);
|
|
73
|
+
}
|
|
74
|
+
this.pending.clear();
|
|
75
|
+
}
|
|
76
|
+
request(method, params) {
|
|
77
|
+
const id = ++this.serial;
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const timer = setTimeout(() => {
|
|
80
|
+
this.pending.delete(id);
|
|
81
|
+
reject(new RelayError("harness_timeout", "Harness API did not respond within 15 seconds."));
|
|
82
|
+
}, 15000);
|
|
83
|
+
this.pending.set(id, {
|
|
84
|
+
resolve: (value) => resolve(value),
|
|
85
|
+
reject,
|
|
86
|
+
timer,
|
|
87
|
+
});
|
|
88
|
+
this.child.stdin.write(JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n");
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
notify(method) {
|
|
92
|
+
this.child.stdin.write(JSON.stringify({ jsonrpc: "2.0", method }) + "\n");
|
|
93
|
+
}
|
|
94
|
+
close() {
|
|
95
|
+
this.fail(new RelayError("harness_closed", "Capture connection closed."));
|
|
96
|
+
this.child.stdin.end();
|
|
97
|
+
this.child.kill();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../packages/relay/src/adapters/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ConnectionInput: z.ZodObject<{
|
|
3
|
+
projectId: z.ZodString;
|
|
4
|
+
harness: z.ZodEnum<{
|
|
5
|
+
claude: "claude";
|
|
6
|
+
codex: "codex";
|
|
7
|
+
opencode: "opencode";
|
|
8
|
+
goose: "goose";
|
|
9
|
+
}>;
|
|
10
|
+
source: z.ZodOptional<z.ZodString>;
|
|
11
|
+
executable: z.ZodOptional<z.ZodString>;
|
|
12
|
+
capture: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
configureMcp: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, z.core.$strict>;
|
|
15
|
+
export type HarnessConnection = z.infer<typeof ConnectionInput> & {
|
|
16
|
+
id: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
configPath: string | null;
|
|
19
|
+
};
|
|
20
|
+
export interface DiscoveredSession {
|
|
21
|
+
externalId: string;
|
|
22
|
+
title: string;
|
|
23
|
+
locator: string;
|
|
24
|
+
harness: HarnessConnection["harness"];
|
|
25
|
+
projectId: string;
|
|
26
|
+
}
|
|
27
|
+
export declare const CAPABILITIES: readonly [{
|
|
28
|
+
readonly harness: "claude";
|
|
29
|
+
readonly name: "Claude Code";
|
|
30
|
+
readonly discovery: "Project-matched JSONL transcripts";
|
|
31
|
+
readonly capture: "Explicit sync; stable transcript events";
|
|
32
|
+
readonly mcp: "Project .mcp.json";
|
|
33
|
+
readonly delivery: "Reviewed packet file / MCP retrieval";
|
|
34
|
+
readonly launch: true;
|
|
35
|
+
}, {
|
|
36
|
+
readonly harness: "codex";
|
|
37
|
+
readonly name: "Codex";
|
|
38
|
+
readonly discovery: "App-server thread/list filtered by cwd";
|
|
39
|
+
readonly capture: "Completed turns via app-server";
|
|
40
|
+
readonly mcp: "Project .codex/config.toml";
|
|
41
|
+
readonly delivery: "Reviewed packet file / MCP retrieval";
|
|
42
|
+
readonly launch: true;
|
|
43
|
+
}, {
|
|
44
|
+
readonly harness: "opencode";
|
|
45
|
+
readonly name: "OpenCode";
|
|
46
|
+
readonly discovery: "Local session API filtered by directory";
|
|
47
|
+
readonly capture: "Completed session messages";
|
|
48
|
+
readonly mcp: "Project opencode.json";
|
|
49
|
+
readonly delivery: "Reviewed packet file / MCP retrieval";
|
|
50
|
+
readonly launch: false;
|
|
51
|
+
}, {
|
|
52
|
+
readonly harness: "goose";
|
|
53
|
+
readonly name: "Goose";
|
|
54
|
+
readonly discovery: "CLI session list filtered by working directory";
|
|
55
|
+
readonly capture: "CLI JSON session export";
|
|
56
|
+
readonly mcp: "Explicit extension command";
|
|
57
|
+
readonly delivery: "Reviewed packet file / MCP retrieval";
|
|
58
|
+
readonly launch: false;
|
|
59
|
+
}];
|