@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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -2
  3. package/README.python.md +246 -0
  4. package/dist/adapters/capture.d.ts +4 -0
  5. package/dist/adapters/capture.js +286 -0
  6. package/dist/adapters/capture.js.map +1 -0
  7. package/dist/adapters/config.d.ts +11 -0
  8. package/dist/adapters/config.js +139 -0
  9. package/dist/adapters/config.js.map +1 -0
  10. package/dist/adapters/manager.d.ts +57 -0
  11. package/dist/adapters/manager.js +220 -0
  12. package/dist/adapters/manager.js.map +1 -0
  13. package/dist/adapters/normalize.d.ts +9 -0
  14. package/dist/adapters/normalize.js +166 -0
  15. package/dist/adapters/normalize.js.map +1 -0
  16. package/dist/adapters/rpc.d.ts +12 -0
  17. package/dist/adapters/rpc.js +100 -0
  18. package/dist/adapters/rpc.js.map +1 -0
  19. package/dist/adapters/types.d.ts +59 -0
  20. package/dist/adapters/types.js +51 -0
  21. package/dist/adapters/types.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.js +427 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/client.d.ts +11 -0
  26. package/dist/client.js +136 -0
  27. package/dist/client.js.map +1 -0
  28. package/dist/delivery.d.ts +9 -0
  29. package/dist/delivery.js +35 -0
  30. package/dist/delivery.js.map +1 -0
  31. package/dist/index.d.ts +5 -0
  32. package/dist/index.js +5 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/mcp.d.ts +3 -0
  35. package/dist/mcp.js +109 -0
  36. package/dist/mcp.js.map +1 -0
  37. package/dist/model.d.ts +169 -0
  38. package/dist/model.js +79 -0
  39. package/dist/model.js.map +1 -0
  40. package/dist/proposals.d.ts +65 -0
  41. package/dist/proposals.js +134 -0
  42. package/dist/proposals.js.map +1 -0
  43. package/dist/server.d.ts +21 -0
  44. package/dist/server.js +375 -0
  45. package/dist/server.js.map +1 -0
  46. package/dist/store.d.ts +33 -0
  47. package/dist/store.js +393 -0
  48. package/dist/store.js.map +1 -0
  49. package/dist/ui/app.js +845 -0
  50. package/dist/ui/assets/THIRD_PARTY_LICENSE.txt +25 -0
  51. package/dist/ui/assets/claude.svg +1 -0
  52. package/dist/ui/assets/codex.svg +1 -0
  53. package/dist/ui/assets/goose.svg +1 -0
  54. package/dist/ui/assets/opencode.svg +1 -0
  55. package/dist/ui/assets/relay.svg +1 -0
  56. package/dist/ui/index.html +23 -0
  57. package/dist/ui/style.css +989 -0
  58. package/dist/util.d.ts +16 -0
  59. package/dist/util.js +86 -0
  60. package/dist/util.js.map +1 -0
  61. package/docs/HARNESS_CONNECTIONS.md +53 -0
  62. package/docs/NPM_QUICKSTART.md +150 -0
  63. package/docs/WORKSPACE.md +61 -0
  64. package/docs/releases/NPM_PUBLISHING.md +60 -0
  65. package/package.json +78 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.js","sourceRoot":"","sources":["../packages/relay/src/proposals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type IncomingMessage, type ServerResponse } from "node:http";
2
+ import { RelayStore } from "./store.js";
3
+ export declare const VERSION = "0.3.0-beta.1";
4
+ export interface Connection {
5
+ url: string;
6
+ pid: number;
7
+ instance: string;
8
+ version: string;
9
+ }
10
+ export declare function secret(directory: string): string;
11
+ export declare function readBody(request: IncomingMessage): Promise<unknown>;
12
+ export declare function json(response: ServerResponse, status: number, value: unknown): void;
13
+ export declare function errorResponse(response: ServerResponse, error: unknown): void;
14
+ export interface Service {
15
+ connection: Connection;
16
+ token: string;
17
+ store: RelayStore;
18
+ close: () => Promise<void>;
19
+ closed: Promise<void>;
20
+ }
21
+ export declare function startService(directory: string, port?: number): Promise<Service>;
package/dist/server.js ADDED
@@ -0,0 +1,375 @@
1
+ import { createServer, } from "node:http";
2
+ import { randomBytes, timingSafeEqual } from "node:crypto";
3
+ import { closeSync, existsSync, lstatSync, openSync, readFileSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { z } from "zod";
6
+ import { fileURLToPath } from "node:url";
7
+ import { proposalPreview, generateProposal, providerStatus, } from "./proposals.js";
8
+ import { continuationPrompt, markdownPacket } from "./delivery.js";
9
+ import { AdapterManager } from "./adapters/manager.js";
10
+ import { CAPABILITIES } from "./adapters/types.js";
11
+ import { RelayError } from "./model.js";
12
+ import { RelayStore } from "./store.js";
13
+ import { id, privateDirectory } from "./util.js";
14
+ export const VERSION = "0.3.0-beta.1";
15
+ export function secret(directory) {
16
+ privateDirectory(directory);
17
+ const path = join(directory, "access-token");
18
+ if (existsSync(path) && lstatSync(path).isSymbolicLink())
19
+ throw new RelayError("unsafe_path", "Access token cannot be a symlink.");
20
+ try {
21
+ writeFileSync(path, randomBytes(32).toString("hex"), {
22
+ flag: "wx",
23
+ mode: 0o600,
24
+ });
25
+ }
26
+ catch (error) {
27
+ if (error.code !== "EEXIST")
28
+ throw error;
29
+ }
30
+ const token = readFileSync(path, "utf8").trim();
31
+ if (!/^[a-f0-9]{64}$/.test(token))
32
+ throw new RelayError("invalid_token", "Local access token is invalid.");
33
+ return token;
34
+ }
35
+ export async function readBody(request) {
36
+ if (!String(request.headers["content-type"] ?? "").startsWith("application/json"))
37
+ throw new RelayError("content_type", "Use application/json.", 415);
38
+ let bytes = 0;
39
+ const chunks = [];
40
+ for await (const chunk of request) {
41
+ bytes += chunk.length;
42
+ if (bytes > 4 * 1024 * 1024)
43
+ throw new RelayError("body_too_large", "Request exceeds 4 MiB.", 413);
44
+ chunks.push(Buffer.from(chunk));
45
+ }
46
+ try {
47
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
48
+ }
49
+ catch {
50
+ throw new RelayError("invalid_json", "Request is not valid JSON.");
51
+ }
52
+ }
53
+ export function json(response, status, value) {
54
+ response.writeHead(status, {
55
+ "Content-Type": "application/json; charset=utf-8",
56
+ "Cache-Control": "no-store",
57
+ "X-Content-Type-Options": "nosniff",
58
+ });
59
+ response.end(JSON.stringify(value));
60
+ }
61
+ export function errorResponse(response, error) {
62
+ if (error instanceof RelayError)
63
+ json(response, error.status, {
64
+ error: { code: error.code, message: error.message },
65
+ });
66
+ else if (error instanceof z.ZodError)
67
+ json(response, 400, {
68
+ error: {
69
+ code: "invalid_input",
70
+ message: error.issues
71
+ .map((i) => `${i.path.join(".") || "input"}: ${i.message}`)
72
+ .join("; "),
73
+ },
74
+ });
75
+ else if (error instanceof Error &&
76
+ "code" in error &&
77
+ ["ENOENT", "ENOTDIR", "EACCES"].includes(String(error.code)))
78
+ json(response, 400, {
79
+ error: {
80
+ code: "file_unavailable",
81
+ message: "The selected local file or directory is unavailable.",
82
+ },
83
+ });
84
+ else {
85
+ console.error("Relay request failed:", error instanceof Error ? error.name : "unknown");
86
+ json(response, 500, {
87
+ error: {
88
+ code: "internal",
89
+ message: "The operation failed. Check local service diagnostics.",
90
+ },
91
+ });
92
+ }
93
+ }
94
+ export async function startService(directory, port = 0) {
95
+ privateDirectory(directory);
96
+ const instance = id();
97
+ const lock = join(directory, "service.lock");
98
+ const lockData = JSON.stringify({ pid: process.pid, instance });
99
+ try {
100
+ closeSync(openSync(lock, "wx", 0o600));
101
+ writeFileSync(lock, lockData);
102
+ }
103
+ catch (error) {
104
+ if (error.code !== "EEXIST")
105
+ throw error;
106
+ throw new RelayError("service_locked", "A service lock already exists. Run relay doctor; do not start two writers.");
107
+ }
108
+ let store;
109
+ const cleanupFiles = () => {
110
+ if (existsSync(lock) && readFileSync(lock, "utf8") === lockData) {
111
+ unlinkSync(lock);
112
+ const descriptor = join(directory, "connection.json");
113
+ if (existsSync(descriptor))
114
+ unlinkSync(descriptor);
115
+ }
116
+ };
117
+ let token;
118
+ try {
119
+ token = secret(directory);
120
+ store = new RelayStore(directory);
121
+ }
122
+ catch (error) {
123
+ cleanupFiles();
124
+ throw error;
125
+ }
126
+ let finish;
127
+ const closed = new Promise((resolve) => {
128
+ finish = resolve;
129
+ });
130
+ const adapters = new AdapterManager(store);
131
+ let url = "";
132
+ let closing = false;
133
+ const close = async () => {
134
+ if (closing)
135
+ return closed;
136
+ closing = true;
137
+ server.closeAllConnections();
138
+ await new Promise((resolve) => server.close(() => resolve()));
139
+ await adapters.close();
140
+ store.close();
141
+ cleanupFiles();
142
+ finish();
143
+ };
144
+ const server = createServer(async (request, response) => {
145
+ try {
146
+ const expectedHost = new URL(url).host;
147
+ if (request.headers.host !== expectedHost)
148
+ throw new RelayError("invalid_host", "Use the loopback URL printed by Relay.", 403);
149
+ if (request.headers.origin && request.headers.origin !== url)
150
+ throw new RelayError("invalid_origin", "Cross-origin requests are not allowed.", 403);
151
+ const parsed = new URL(request.url ?? "/", url);
152
+ const path = parsed.pathname;
153
+ const method = request.method;
154
+ if (method === "GET" &&
155
+ (path === "/" ||
156
+ /^\/(?:app\.js|style\.css|assets\/(?:claude|codex|opencode|goose|relay)\.svg)$/.test(path))) {
157
+ const file = path === "/" ? "index.html" : path.slice(1);
158
+ const type = file.endsWith(".js")
159
+ ? "text/javascript"
160
+ : file.endsWith(".css")
161
+ ? "text/css"
162
+ : file.endsWith(".svg")
163
+ ? "image/svg+xml"
164
+ : "text/html";
165
+ response.writeHead(200, {
166
+ "Content-Type": type + "; charset=utf-8",
167
+ "Cache-Control": "no-store",
168
+ "X-Content-Type-Options": "nosniff",
169
+ "Referrer-Policy": "no-referrer",
170
+ "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'; form-action 'self'",
171
+ });
172
+ response.end(readFileSync(fileURLToPath(new URL("./ui/" + file, import.meta.url))));
173
+ return;
174
+ }
175
+ const supplied = String(request.headers.authorization ?? "").replace(/^Bearer /, "");
176
+ if (Buffer.byteLength(supplied) !== Buffer.byteLength(token) ||
177
+ !timingSafeEqual(Buffer.from(supplied), Buffer.from(token)))
178
+ throw new RelayError("unauthorized", "A valid local Relay access token is required.", 401);
179
+ if (method === "GET" && path === "/api/health") {
180
+ json(response, 200, {
181
+ name: "context-relay",
182
+ version: VERSION,
183
+ instance,
184
+ pid: process.pid,
185
+ });
186
+ return;
187
+ }
188
+ if (path === "/api/capabilities" && method === "GET") {
189
+ json(response, 200, CAPABILITIES);
190
+ return;
191
+ }
192
+ if (path === "/api/connections") {
193
+ if (method === "GET") {
194
+ json(response, 200, adapters.connections(parsed.searchParams.get("projectId") ?? undefined));
195
+ return;
196
+ }
197
+ if (method === "POST") {
198
+ json(response, 201, adapters.connect(await readBody(request)));
199
+ return;
200
+ }
201
+ }
202
+ const adapterRoute = path.match(/^\/api\/connections\/([^/]+)\/(discover|sync|disconnect|command)$/);
203
+ if (adapterRoute) {
204
+ const connectionId = adapterRoute[1];
205
+ if (adapterRoute[2] === "discover" && method === "GET") {
206
+ json(response, 200, await adapters.discover(connectionId));
207
+ return;
208
+ }
209
+ if (adapterRoute[2] === "command" && method === "GET") {
210
+ json(response, 200, adapters.command(connectionId));
211
+ return;
212
+ }
213
+ if (adapterRoute[2] === "sync" && method === "POST") {
214
+ const body = z
215
+ .object({ externalIds: z.array(z.string()).optional() })
216
+ .strict()
217
+ .parse(await readBody(request));
218
+ json(response, 202, adapters.startSync(connectionId, body.externalIds));
219
+ return;
220
+ }
221
+ if (adapterRoute[2] === "disconnect" && method === "POST") {
222
+ json(response, 200, adapters.disconnect(connectionId));
223
+ return;
224
+ }
225
+ }
226
+ if (path === "/api/jobs" && method === "GET") {
227
+ json(response, 200, adapters.jobs());
228
+ return;
229
+ }
230
+ const jobRoute = path.match(/^\/api\/jobs\/([^/]+)(\/cancel)?$/);
231
+ if (jobRoute && method === (jobRoute[2] ? "POST" : "GET")) {
232
+ json(response, 200, jobRoute[2]
233
+ ? adapters.cancel(jobRoute[1])
234
+ : adapters.job(jobRoute[1]));
235
+ return;
236
+ }
237
+ if (path === "/api/provider" && method === "GET") {
238
+ json(response, 200, providerStatus());
239
+ return;
240
+ }
241
+ if (path === "/api/proposals/preview" && method === "POST") {
242
+ json(response, 200, proposalPreview(store, await readBody(request)));
243
+ return;
244
+ }
245
+ if (path === "/api/proposals" && method === "POST") {
246
+ json(response, 200, await generateProposal(store, await readBody(request)));
247
+ return;
248
+ }
249
+ const exportRoute = path.match(/^\/api\/handoffs\/([^/]+)\/export$/);
250
+ if (exportRoute && method === "GET") {
251
+ const handoff = store.handoff(exportRoute[1]);
252
+ json(response, 200, {
253
+ markdown: markdownPacket(handoff),
254
+ prompt: continuationPrompt(handoff),
255
+ handoff,
256
+ });
257
+ return;
258
+ }
259
+ if (path === "/api/projects") {
260
+ if (method === "GET") {
261
+ json(response, 200, store.projects());
262
+ return;
263
+ }
264
+ if (method === "POST") {
265
+ json(response, 201, store.addProject(await readBody(request)));
266
+ return;
267
+ }
268
+ }
269
+ if (path === "/api/sessions" && method === "GET") {
270
+ json(response, 200, store.sessions(parsed.searchParams.get("projectId") ?? undefined));
271
+ return;
272
+ }
273
+ if (path === "/api/sessions/import" && method === "POST") {
274
+ json(response, 200, store.importSession(await readBody(request)));
275
+ return;
276
+ }
277
+ let match = path.match(/^\/api\/sessions\/([^/]+)(?:\/(events))?$/);
278
+ if (match && method === "GET") {
279
+ json(response, 200, match[2]
280
+ ? store.events(match[1], Number(parsed.searchParams.get("offset") ?? 0), Number(parsed.searchParams.get("limit") ?? 200))
281
+ : store.session(match[1]));
282
+ return;
283
+ }
284
+ if (path === "/api/checkpoints") {
285
+ if (method === "GET") {
286
+ json(response, 200, store.checkpoints(parsed.searchParams.get("projectId") ?? undefined));
287
+ return;
288
+ }
289
+ if (method === "POST") {
290
+ json(response, 201, store.createCheckpoint(await readBody(request)));
291
+ return;
292
+ }
293
+ }
294
+ match = path.match(/^\/api\/checkpoints\/([^/]+)(?:\/(packet|freshness))?$/);
295
+ if (match && method === "GET") {
296
+ const checkpoint = store.checkpoint(match[1]);
297
+ json(response, 200, match[2] === "packet"
298
+ ? store.packet(checkpoint.id, Number(parsed.searchParams.get("maxBytes") ?? 24000))
299
+ : match[2] === "freshness"
300
+ ? store.freshness(checkpoint)
301
+ : checkpoint);
302
+ return;
303
+ }
304
+ if (path === "/api/handoffs") {
305
+ if (method === "GET") {
306
+ json(response, 200, store.handoffs());
307
+ return;
308
+ }
309
+ if (method === "POST") {
310
+ json(response, 201, store.offer(await readBody(request)));
311
+ return;
312
+ }
313
+ }
314
+ match = path.match(/^\/api\/handoffs\/([^/]+)(?:\/(accept|cancel))?$/);
315
+ if (match) {
316
+ if (method === "GET" && !match[2]) {
317
+ json(response, 200, store.handoff(match[1]));
318
+ return;
319
+ }
320
+ if (method === "POST" && match[2] === "accept") {
321
+ const body = z
322
+ .object({ recipient: z.string().min(1).max(50) })
323
+ .strict()
324
+ .parse(await readBody(request));
325
+ json(response, 200, store.accept(match[1], body.recipient));
326
+ return;
327
+ }
328
+ if (method === "POST" && match[2] === "cancel") {
329
+ json(response, 200, store.cancel(match[1]));
330
+ return;
331
+ }
332
+ }
333
+ if (path === "/api/shutdown" && method === "POST") {
334
+ json(response, 200, { stopping: true });
335
+ setTimeout(() => {
336
+ void close();
337
+ }, 30);
338
+ return;
339
+ }
340
+ throw new RelayError("not_found", "Route not found.", 404);
341
+ }
342
+ catch (error) {
343
+ if (!response.headersSent)
344
+ errorResponse(response, error);
345
+ else
346
+ response.end();
347
+ }
348
+ });
349
+ server.requestTimeout = 15000;
350
+ server.headersTimeout = 10000;
351
+ try {
352
+ await new Promise((resolve, reject) => {
353
+ server.once("error", reject);
354
+ server.listen(port, "127.0.0.1", resolve);
355
+ });
356
+ }
357
+ catch (error) {
358
+ store.close();
359
+ cleanupFiles();
360
+ throw error;
361
+ }
362
+ const address = server.address();
363
+ if (!address || typeof address === "string")
364
+ throw new Error("No loopback address.");
365
+ url = `http://127.0.0.1:${address.port}`;
366
+ const connection = { url, pid: process.pid, instance, version: VERSION };
367
+ const descriptor = join(directory, "connection.json");
368
+ if (existsSync(descriptor) && lstatSync(descriptor).isSymbolicLink()) {
369
+ await close();
370
+ throw new RelayError("unsafe_path", "Connection descriptor cannot be a symlink.");
371
+ }
372
+ writeFileSync(descriptor, JSON.stringify(connection), { mode: 0o600 });
373
+ return { connection, token, store, close, closed };
374
+ }
375
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../packages/relay/src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { type Checkpoint, type Handoff, type Packet, type Project, type RelayEvent, type Session } from "./model.js";
3
+ export declare class RelayStore {
4
+ readonly directory: string;
5
+ readonly db: DatabaseSync;
6
+ constructor(directory: string);
7
+ close(): void;
8
+ transaction<T>(operation: () => T): T;
9
+ projects(): Project[];
10
+ project(projectId: string): Project;
11
+ addProject(input: unknown): Project;
12
+ sessions(projectId?: string): Session[];
13
+ session(sessionId: string): Session;
14
+ events(sessionId: string, offset?: number, limit?: number): RelayEvent[];
15
+ event(sessionId: string, eventId: string): RelayEvent;
16
+ importSession(input: unknown): {
17
+ session: Session;
18
+ added: number;
19
+ };
20
+ checkpoints(projectId?: string): Checkpoint[];
21
+ checkpoint(checkpointId: string): Checkpoint;
22
+ createCheckpoint(input: unknown): Checkpoint;
23
+ freshness(checkpoint: Checkpoint): {
24
+ current: boolean;
25
+ reasons: string[];
26
+ };
27
+ packet(checkpointId: string, maxBytes?: number): Packet;
28
+ handoffs(): Handoff[];
29
+ handoff(handoffId: string): Handoff;
30
+ offer(input: unknown): Handoff;
31
+ accept(handoffId: string, recipient: string): Handoff;
32
+ cancel(handoffId: string): Handoff;
33
+ }