@relaymessenger/cli 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.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/claude-plugin/marketplace/.claude-plugin/marketplace.json +14 -0
  4. package/claude-plugin/marketplace/plugins/relay/.claude-plugin/plugin.json +18 -0
  5. package/claude-plugin/marketplace/plugins/relay/LICENSE +21 -0
  6. package/claude-plugin/marketplace/plugins/relay/README.md +173 -0
  7. package/claude-plugin/marketplace/plugins/relay/commands/configure.md +71 -0
  8. package/claude-plugin/marketplace/plugins/relay/runtime/server.mjs +26107 -0
  9. package/dist/api.d.ts +74 -0
  10. package/dist/api.d.ts.map +1 -0
  11. package/dist/api.js +129 -0
  12. package/dist/api.js.map +1 -0
  13. package/dist/claude-settings.d.ts +14 -0
  14. package/dist/claude-settings.d.ts.map +1 -0
  15. package/dist/claude-settings.js +47 -0
  16. package/dist/claude-settings.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +162 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/codex.d.ts +25 -0
  22. package/dist/codex.d.ts.map +1 -0
  23. package/dist/codex.js +227 -0
  24. package/dist/codex.js.map +1 -0
  25. package/dist/doctor.d.ts +2 -0
  26. package/dist/doctor.d.ts.map +1 -0
  27. package/dist/doctor.js +122 -0
  28. package/dist/doctor.js.map +1 -0
  29. package/dist/engine/acp.d.ts +69 -0
  30. package/dist/engine/acp.d.ts.map +1 -0
  31. package/dist/engine/acp.js +402 -0
  32. package/dist/engine/acp.js.map +1 -0
  33. package/dist/engine/catalog.d.ts +26 -0
  34. package/dist/engine/catalog.d.ts.map +1 -0
  35. package/dist/engine/catalog.js +41 -0
  36. package/dist/engine/catalog.js.map +1 -0
  37. package/dist/engine/process.d.ts +12 -0
  38. package/dist/engine/process.d.ts.map +1 -0
  39. package/dist/engine/process.js +54 -0
  40. package/dist/engine/process.js.map +1 -0
  41. package/dist/engine/types.d.ts +57 -0
  42. package/dist/engine/types.d.ts.map +1 -0
  43. package/dist/engine/types.js +8 -0
  44. package/dist/engine/types.js.map +1 -0
  45. package/dist/flags.d.ts +9 -0
  46. package/dist/flags.d.ts.map +1 -0
  47. package/dist/flags.js +34 -0
  48. package/dist/flags.js.map +1 -0
  49. package/dist/install.d.ts +69 -0
  50. package/dist/install.d.ts.map +1 -0
  51. package/dist/install.js +510 -0
  52. package/dist/install.js.map +1 -0
  53. package/dist/mcp.d.ts +16 -0
  54. package/dist/mcp.d.ts.map +1 -0
  55. package/dist/mcp.js +127 -0
  56. package/dist/mcp.js.map +1 -0
  57. package/dist/pair.d.ts +20 -0
  58. package/dist/pair.d.ts.map +1 -0
  59. package/dist/pair.js +135 -0
  60. package/dist/pair.js.map +1 -0
  61. package/dist/permissions.d.ts +87 -0
  62. package/dist/permissions.d.ts.map +1 -0
  63. package/dist/permissions.js +342 -0
  64. package/dist/permissions.js.map +1 -0
  65. package/dist/receive.d.ts +54 -0
  66. package/dist/receive.d.ts.map +1 -0
  67. package/dist/receive.js +353 -0
  68. package/dist/receive.js.map +1 -0
  69. package/dist/store.d.ts +260 -0
  70. package/dist/store.d.ts.map +1 -0
  71. package/dist/store.js +550 -0
  72. package/dist/store.js.map +1 -0
  73. package/openclaw-plugin/relaymessenger-openclaw-plugin-0.1.0.tgz +0 -0
  74. package/package.json +51 -0
package/dist/store.js ADDED
@@ -0,0 +1,550 @@
1
+ /**
2
+ * Durable local state for the relaymessenger bridge.
3
+ *
4
+ * Everything lives under ~/.relaymessenger (override with RELAYMESSENGER_HOME):
5
+ * config.json — active agent token, API origin, owner_user_id (chmod 600)
6
+ * accounts/<origin-agent-hash>/state.json — receive cursor, dedupe set,
7
+ * pending events. EXCLUSIVELY
8
+ * owned (written) by the `start` loop process; other
9
+ * entrypoints (codex hook, notify, mcp) may only read it
10
+ * via readStateSnapshot().
11
+ * accounts/<hash>/approvals/<request_id>.json — pending approval (create-once
12
+ * by whoever arms it, resolution written by the loop,
13
+ * consumed+unlinked by the waiter). No read-modify-write
14
+ * of shared snapshots across processes.
15
+ * accounts/<hash>/sessions.json — conversation_id → engine session binding
16
+ *
17
+ * Writes are atomic: content is fsync'd to a tmp file, then renamed into
18
+ * place, so a crash can never leave a half-written file. Cursor + pending
19
+ * queue share one file, so the durable-before-ack invariant holds with a
20
+ * single atomic write.
21
+ */
22
+ import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readdirSync, readFileSync, realpathSync, renameSync, rmdirSync, unlinkSync, writeSync, } from "node:fs";
23
+ import { createHash, randomBytes } from "node:crypto";
24
+ import { homedir } from "node:os";
25
+ import { isAbsolute, join, relative, resolve } from "node:path";
26
+ export function relaymessengerHome() {
27
+ if (process.env.RELAYMESSENGER_HOME)
28
+ return process.env.RELAYMESSENGER_HOME;
29
+ const home = join(homedir(), ".relaymessenger");
30
+ // The CLI shipped as `relayapp` through 0.2.0. Adopt that state dir once so
31
+ // an existing pairing survives the rename; never merge two live dirs.
32
+ const legacy = join(homedir(), ".relayapp");
33
+ if (!existsSync(home) && existsSync(legacy)) {
34
+ renameSync(legacy, home);
35
+ }
36
+ return home;
37
+ }
38
+ /** Stable, non-secret identity label used inside account-scoped ledgers. */
39
+ export function relayIdentityForConfig(config) {
40
+ if (config.agent?.id)
41
+ return `agent:${config.agent.id}`;
42
+ if (!config.agent_token)
43
+ throw new Error("Cannot identify Relay account without an agent token.");
44
+ return `token:${createHash("sha256").update(config.agent_token).digest("hex")}`;
45
+ }
46
+ function canonicalOrigin(value) {
47
+ const url = new URL(value);
48
+ return url.origin;
49
+ }
50
+ /**
51
+ * Durable bridge state is scoped to one authenticated Relay identity. The
52
+ * agent id is preferred; a token fingerprint is the fail-safe fallback for
53
+ * legacy servers that do not expose it. Raw tokens/origins never enter paths.
54
+ */
55
+ export function runtimeHomeForConfig(config, baseHome = relaymessengerHome()) {
56
+ if (!config.api_origin || !config.agent_token) {
57
+ throw new Error("Cannot select Relay runtime state without a paired origin and agent token.");
58
+ }
59
+ const identity = relayIdentityForConfig(config);
60
+ const namespace = createHash("sha256")
61
+ .update(`${canonicalOrigin(config.api_origin)}\0${identity}`)
62
+ .digest("hex")
63
+ .slice(0, 40);
64
+ return join(baseHome, "accounts", namespace);
65
+ }
66
+ export function activeRuntimeHome(baseHome = relaymessengerHome()) {
67
+ const config = new ConfigStore(baseHome).load();
68
+ if (!config?.agent_token)
69
+ throw new Error("Not paired. Run `relaymessenger pair` first.");
70
+ return runtimeHomeForConfig(config, baseHome);
71
+ }
72
+ /** Resolve the pinned owner, failing closed when it is missing. */
73
+ export function resolveOwnerUserId(config) {
74
+ const owner = process.env.RELAY_OWNER_USER_ID ?? config?.owner_user_id;
75
+ if (!owner) {
76
+ throw new Error("No pinned owner_user_id. Re-run `relaymessenger pair` against a server that reports " +
77
+ "the agent owner, or set RELAY_OWNER_USER_ID explicitly.");
78
+ }
79
+ return owner;
80
+ }
81
+ const SEEN_CAP = 2000;
82
+ function readJson(path) {
83
+ try {
84
+ return JSON.parse(readFileSync(path, "utf8"));
85
+ }
86
+ catch {
87
+ return undefined;
88
+ }
89
+ }
90
+ function stateBlockedPath(home) {
91
+ return join(home, "state.blocked.json");
92
+ }
93
+ export function blockInvalidState(home, path, reason, operations = {}) {
94
+ mkdirSync(home, { recursive: true, mode: 0o700 });
95
+ const blocked = stateBlockedPath(home);
96
+ const quarantined = `${path}.corrupt-${Date.now()}-${process.pid}`;
97
+ // The marker is the fail-closed boundary. Persist it before moving the
98
+ // corrupt state so a crash can never leave both state.json absent and the
99
+ // block marker missing, which would otherwise look like a fresh cursor 0.
100
+ (operations.writeBlock ?? atomicWriteJson)(blocked, { blocked_at: new Date().toISOString(), reason, quarantined }, 0o600);
101
+ operations.afterBlockPersisted?.();
102
+ let quarantineError;
103
+ try {
104
+ (operations.quarantine ?? renameSync)(path, quarantined);
105
+ }
106
+ catch (error) {
107
+ quarantineError = error;
108
+ }
109
+ const disposition = quarantineError ? "could not be quarantined" : "was quarantined";
110
+ throw new Error(`Invalid Relay runtime state ${disposition}; startup is blocked (${blocked}).`);
111
+ }
112
+ function bridgeStateIsValid(raw) {
113
+ const objectOfArrays = (value, itemValid) => !!value &&
114
+ typeof value === "object" &&
115
+ !Array.isArray(value) &&
116
+ Object.values(value).every((items) => Array.isArray(items) && items.every((item) => itemValid(item)));
117
+ const objectOfRecords = (value, recordValid) => value === undefined ||
118
+ (!!value &&
119
+ typeof value === "object" &&
120
+ !Array.isArray(value) &&
121
+ Object.values(value).every(recordValid));
122
+ return (Number.isSafeInteger(raw.cursor) &&
123
+ raw.cursor >= 0 &&
124
+ Array.isArray(raw.seen_event_ids) &&
125
+ raw.seen_event_ids.every((id) => typeof id === "string") &&
126
+ objectOfArrays(raw.pending_events, (event) => !!event && typeof event.event_id === "string" && typeof event.event_type === "string") &&
127
+ objectOfRecords(raw.attempted_turns, (attempt) => !!attempt &&
128
+ typeof attempt.turn_key === "string" &&
129
+ typeof attempt.started_at === "string" &&
130
+ Array.isArray(attempt.event_ids) &&
131
+ attempt.event_ids.length > 0 &&
132
+ attempt.event_ids.every((id) => typeof id === "string")) &&
133
+ objectOfRecords(raw.pending_replies, (reply) => !!reply &&
134
+ typeof reply.conversation_id === "string" &&
135
+ typeof reply.text === "string" &&
136
+ typeof reply.created_at === "string" &&
137
+ Array.isArray(reply.event_ids) &&
138
+ reply.event_ids.every((id) => typeof id === "string")) &&
139
+ (raw.owner_conversation_id === undefined || typeof raw.owner_conversation_id === "string"));
140
+ }
141
+ function loadBridgeState(home) {
142
+ const path = join(home, "state.json");
143
+ const blocked = stateBlockedPath(home);
144
+ if (existsSync(blocked)) {
145
+ throw new Error(`Relay runtime state is blocked after corruption (${blocked}). ` +
146
+ "Inspect the quarantined state and re-pair or remove the account state deliberately.");
147
+ }
148
+ let raw;
149
+ try {
150
+ raw = JSON.parse(readFileSync(path, "utf8"));
151
+ }
152
+ catch (error) {
153
+ if (error?.code === "ENOENT")
154
+ return normalizeState({});
155
+ return blockInvalidState(home, path, "state.json could not be parsed");
156
+ }
157
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
158
+ return blockInvalidState(home, path, "state.json root is not an object");
159
+ }
160
+ if (!bridgeStateIsValid(raw)) {
161
+ return blockInvalidState(home, path, "state.json fields violate the durable state schema");
162
+ }
163
+ return normalizeState(raw);
164
+ }
165
+ export function atomicWriteJson(path, value, mode) {
166
+ const dir = join(path, "..");
167
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
168
+ const tmp = `${path}.tmp-${process.pid}-${Date.now()}`;
169
+ const fd = openSync(tmp, "w", mode);
170
+ try {
171
+ writeSync(fd, `${JSON.stringify(value, null, 2)}\n`);
172
+ fsyncSync(fd); // content durable before the rename makes it visible
173
+ }
174
+ finally {
175
+ closeSync(fd);
176
+ }
177
+ renameSync(tmp, path);
178
+ // Rename preserves the tmp file's mode, but tighten in case of umask quirks.
179
+ chmodSync(path, mode);
180
+ }
181
+ export class ConfigStore {
182
+ home;
183
+ constructor(home = relaymessengerHome()) {
184
+ this.home = home;
185
+ }
186
+ get path() {
187
+ return join(this.home, "config.json");
188
+ }
189
+ load() {
190
+ return readJson(this.path);
191
+ }
192
+ save(config) {
193
+ atomicWriteJson(this.path, config, 0o600);
194
+ }
195
+ }
196
+ function normalizeState(raw) {
197
+ return {
198
+ cursor: typeof raw.cursor === "number" ? raw.cursor : 0,
199
+ seen_event_ids: Array.isArray(raw.seen_event_ids) ? raw.seen_event_ids : [],
200
+ pending_events: raw.pending_events ?? {},
201
+ attempted_turns: raw.attempted_turns ?? {},
202
+ pending_replies: raw.pending_replies ?? {},
203
+ owner_conversation_id: raw.owner_conversation_id,
204
+ };
205
+ }
206
+ /**
207
+ * Read-only view of state.json for non-loop processes (hook, notify, mcp).
208
+ * Those processes MUST NOT construct a StateStore: only the `start` loop
209
+ * writes state.json.
210
+ */
211
+ export function readStateSnapshot(home) {
212
+ return loadBridgeState(home ?? activeRuntimeHome());
213
+ }
214
+ export class StateStore {
215
+ home;
216
+ state;
217
+ constructor(home = activeRuntimeHome()) {
218
+ this.home = home;
219
+ this.state = loadBridgeState(this.home);
220
+ }
221
+ get path() {
222
+ return join(this.home, "state.json");
223
+ }
224
+ get current() {
225
+ return this.state;
226
+ }
227
+ markSeen(eventId) {
228
+ this.state.seen_event_ids.push(eventId);
229
+ if (this.state.seen_event_ids.length > SEEN_CAP) {
230
+ this.state.seen_event_ids = this.state.seen_event_ids.slice(-SEEN_CAP);
231
+ }
232
+ }
233
+ hasSeen(eventId) {
234
+ return this.state.seen_event_ids.includes(eventId);
235
+ }
236
+ persist() {
237
+ atomicWriteJson(this.path, this.state, 0o600);
238
+ }
239
+ }
240
+ /**
241
+ * Per-request approval files in the active account runtime directory.
242
+ * Create-once by whoever arms the approval (loop or codex hook), resolution
243
+ * written by the loop when the tap arrives, consumed + unlinked by the waiter.
244
+ * Each file has a single writer at a time, so there is no read-modify-write
245
+ * of a shared snapshot across processes.
246
+ */
247
+ export class ApprovalStore {
248
+ home;
249
+ constructor(home = activeRuntimeHome()) {
250
+ this.home = home;
251
+ }
252
+ get dir() {
253
+ return join(this.home, "approvals");
254
+ }
255
+ pathFor(requestId) {
256
+ if (!/^[a-z0-9_-]+$/i.test(requestId))
257
+ throw new Error(`invalid request id: ${requestId}`);
258
+ return join(this.dir, `${requestId}.json`);
259
+ }
260
+ /** Create-once: throws if the request id already exists. */
261
+ create(approval) {
262
+ mkdirSync(this.dir, { recursive: true, mode: 0o700 });
263
+ const path = this.pathFor(approval.request_id);
264
+ const fd = openSync(path, "wx", 0o600); // wx: fail on collision
265
+ try {
266
+ writeSync(fd, `${JSON.stringify(approval, null, 2)}\n`);
267
+ fsyncSync(fd);
268
+ }
269
+ finally {
270
+ closeSync(fd);
271
+ }
272
+ }
273
+ get(requestId) {
274
+ return readJson(this.pathFor(requestId));
275
+ }
276
+ /** Full rewrite of one approval file (single-writer per file by protocol). */
277
+ put(approval) {
278
+ atomicWriteJson(this.pathFor(approval.request_id), approval, 0o600);
279
+ }
280
+ /** The waiter consumes the decision by removing the file. */
281
+ consume(requestId) {
282
+ try {
283
+ unlinkSync(this.pathFor(requestId));
284
+ }
285
+ catch {
286
+ // already gone — consuming twice is harmless
287
+ }
288
+ }
289
+ list() {
290
+ let names;
291
+ try {
292
+ names = readdirSync(this.dir);
293
+ }
294
+ catch {
295
+ return [];
296
+ }
297
+ const approvals = [];
298
+ for (const name of names) {
299
+ if (!name.endsWith(".json"))
300
+ continue;
301
+ const approval = readJson(join(this.dir, name));
302
+ if (approval?.request_id)
303
+ approvals.push(approval);
304
+ }
305
+ return approvals;
306
+ }
307
+ /**
308
+ * Age out abandoned files. An unconsumed resolution belongs to a waiter in
309
+ * another process, so nothing is removed before deadline + grace — only
310
+ * files whose waiter has clearly given up (crashed hook, dead loop).
311
+ */
312
+ sweep(now = Date.now(), graceMs = 10 * 60 * 1000) {
313
+ const removed = [];
314
+ for (const approval of this.list()) {
315
+ const deadline = Date.parse(approval.deadline_at);
316
+ if (Number.isFinite(deadline) && now > deadline + graceMs) {
317
+ this.consume(approval.request_id);
318
+ removed.push(approval.request_id);
319
+ }
320
+ }
321
+ return removed;
322
+ }
323
+ }
324
+ /**
325
+ * Create-once ledger for Codex MCP logical sends. Each caller-provided send_id
326
+ * is permanently bound to one account, origin, conversation, and exact body.
327
+ * An ambiguous POST can therefore be repeated after a process restart with
328
+ * the same server idempotency key, while changed content fails closed.
329
+ */
330
+ export class McpSendLedger {
331
+ home;
332
+ apiOrigin;
333
+ accountIdentity;
334
+ constructor(home, apiOrigin, accountIdentity) {
335
+ this.home = home;
336
+ this.apiOrigin = apiOrigin;
337
+ this.accountIdentity = accountIdentity;
338
+ }
339
+ get dir() {
340
+ return join(this.home, "mcp-sends");
341
+ }
342
+ pathFor(sendId) {
343
+ return join(this.dir, `${createHash("sha256").update(sendId).digest("hex")}.json`);
344
+ }
345
+ register(sendId, conversationId, text) {
346
+ const path = this.pathFor(sendId);
347
+ const payloadHash = createHash("sha256")
348
+ .update(JSON.stringify({ conversation_id: conversationId, text }))
349
+ .digest("hex");
350
+ const expected = {
351
+ send_id: sendId,
352
+ api_origin: canonicalOrigin(this.apiOrigin),
353
+ account_identity: this.accountIdentity,
354
+ conversation_id: conversationId,
355
+ payload_hash: payloadHash,
356
+ };
357
+ mkdirSync(this.dir, { recursive: true, mode: 0o700 });
358
+ let existing;
359
+ try {
360
+ existing = JSON.parse(readFileSync(path, "utf8"));
361
+ }
362
+ catch (error) {
363
+ if (error?.code !== "ENOENT") {
364
+ throw new Error(`Codex MCP send ledger is unreadable; refusing retry (${path})`);
365
+ }
366
+ }
367
+ if (existing) {
368
+ for (const [key, value] of Object.entries(expected)) {
369
+ if (existing[key] !== value) {
370
+ throw new Error(`send_id ${sendId} was already used for different content or account`);
371
+ }
372
+ }
373
+ if (typeof existing.idempotency_key !== "string" || existing.idempotency_key.length === 0) {
374
+ throw new Error(`Codex MCP send ledger is invalid; refusing retry (${path})`);
375
+ }
376
+ return existing;
377
+ }
378
+ const scopeHash = createHash("sha256")
379
+ .update(`${expected.api_origin}\0${this.accountIdentity}\0${sendId}`)
380
+ .digest("hex");
381
+ const created = {
382
+ ...expected,
383
+ idempotency_key: `relay-mcp-${scopeHash}`,
384
+ created_at: new Date().toISOString(),
385
+ };
386
+ try {
387
+ const fd = openSync(path, "wx", 0o600);
388
+ try {
389
+ writeSync(fd, `${JSON.stringify(created, null, 2)}\n`);
390
+ fsyncSync(fd);
391
+ }
392
+ finally {
393
+ closeSync(fd);
394
+ }
395
+ return created;
396
+ }
397
+ catch (error) {
398
+ if (error?.code === "EEXIST")
399
+ return this.register(sendId, conversationId, text);
400
+ throw error;
401
+ }
402
+ }
403
+ confirm(send) {
404
+ if (send.confirmed_at)
405
+ return;
406
+ send.confirmed_at = new Date().toISOString();
407
+ atomicWriteJson(this.pathFor(send.send_id), send, 0o600);
408
+ }
409
+ }
410
+ export class SessionStore {
411
+ home;
412
+ sessions;
413
+ constructor(home = activeRuntimeHome()) {
414
+ this.home = home;
415
+ this.sessions = readJson(this.path) ?? {};
416
+ }
417
+ get path() {
418
+ return join(this.home, "sessions.json");
419
+ }
420
+ get(conversationId) {
421
+ return this.sessions[conversationId];
422
+ }
423
+ set(conversationId, binding) {
424
+ this.sessions[conversationId] = binding;
425
+ atomicWriteJson(this.path, this.sessions, 0o600);
426
+ }
427
+ delete(conversationId) {
428
+ delete this.sessions[conversationId];
429
+ atomicWriteJson(this.path, this.sessions, 0o600);
430
+ }
431
+ all() {
432
+ return this.sessions;
433
+ }
434
+ }
435
+ function canonicalLocalPath(path) {
436
+ const absolute = resolve(path);
437
+ try {
438
+ return realpathSync(absolute);
439
+ }
440
+ catch {
441
+ return absolute;
442
+ }
443
+ }
444
+ /** Local, non-secret project opt-ins shared across Relay re-pairs. */
445
+ export class CodexNotifyPolicyStore {
446
+ home;
447
+ constructor(home = relaymessengerHome()) {
448
+ this.home = home;
449
+ }
450
+ get path() {
451
+ return join(this.home, "codex-notify.json");
452
+ }
453
+ load() {
454
+ const raw = readJson(this.path);
455
+ return {
456
+ allowed_project_roots: Array.isArray(raw?.allowed_project_roots)
457
+ ? [...new Set(raw.allowed_project_roots.filter((entry) => typeof entry === "string").map(canonicalLocalPath))]
458
+ : [],
459
+ };
460
+ }
461
+ allowProject(projectRoot) {
462
+ const root = canonicalLocalPath(projectRoot);
463
+ const policy = this.load();
464
+ if (!policy.allowed_project_roots.includes(root))
465
+ policy.allowed_project_roots.push(root);
466
+ atomicWriteJson(this.path, policy, 0o600);
467
+ return root;
468
+ }
469
+ matchProject(cwd) {
470
+ if (!cwd || !isAbsolute(cwd))
471
+ return undefined;
472
+ const candidate = canonicalLocalPath(cwd);
473
+ return this.load().allowed_project_roots.find((root) => {
474
+ const child = relative(root, candidate);
475
+ return child === "" || (!child.startsWith("..") && !isAbsolute(child));
476
+ });
477
+ }
478
+ }
479
+ /** One live `relaymessenger start` process per origin+agent runtime namespace. */
480
+ export class RuntimeLock {
481
+ runtimeHome;
482
+ nonce = randomBytes(16).toString("hex");
483
+ held = false;
484
+ constructor(runtimeHome) {
485
+ this.runtimeHome = runtimeHome;
486
+ }
487
+ get dir() {
488
+ return join(this.runtimeHome, "start.lock");
489
+ }
490
+ ownerPath(dir = this.dir) {
491
+ return join(dir, "owner.json");
492
+ }
493
+ acquire() {
494
+ mkdirSync(this.runtimeHome, { recursive: true, mode: 0o700 });
495
+ for (;;) {
496
+ try {
497
+ mkdirSync(this.dir, { mode: 0o700 });
498
+ atomicWriteJson(this.ownerPath(), { pid: process.pid, nonce: this.nonce, acquired_at: new Date().toISOString() }, 0o600);
499
+ this.held = true;
500
+ return;
501
+ }
502
+ catch (error) {
503
+ if (error?.code !== "EEXIST")
504
+ throw error;
505
+ const owner = readJson(this.ownerPath());
506
+ const pid = owner?.pid;
507
+ let alive = false;
508
+ if (typeof pid === "number" && Number.isInteger(pid) && pid > 0) {
509
+ try {
510
+ process.kill(pid, 0);
511
+ alive = true;
512
+ }
513
+ catch (probe) {
514
+ alive = probe?.code === "EPERM";
515
+ }
516
+ }
517
+ if (alive || !owner?.nonce) {
518
+ throw new Error(`Another relaymessenger start process owns this paired agent (${this.dir}${pid ? `, pid ${pid}` : ""}).`);
519
+ }
520
+ const stale = `${this.dir}.stale-${Date.now()}-${process.pid}-${this.nonce.slice(0, 8)}`;
521
+ try {
522
+ renameSync(this.dir, stale);
523
+ }
524
+ catch (renameError) {
525
+ if (renameError?.code === "ENOENT")
526
+ continue;
527
+ throw new Error(`Could not recover stale Relay runtime lock ${this.dir}: ${renameError}`);
528
+ }
529
+ }
530
+ }
531
+ }
532
+ release() {
533
+ if (!this.held)
534
+ return;
535
+ const owner = readJson(this.ownerPath());
536
+ if (owner?.nonce !== this.nonce) {
537
+ this.held = false;
538
+ return;
539
+ }
540
+ try {
541
+ unlinkSync(this.ownerPath());
542
+ rmdirSync(this.dir);
543
+ }
544
+ catch {
545
+ // A process exit still makes the pid-based lock recoverable.
546
+ }
547
+ this.held = false;
548
+ }
549
+ }
550
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@relaymessenger/cli",
3
+ "version": "0.3.0",
4
+ "description": "Relay \u2014 messaging for agents. Bridge Claude Code, Codex, Hermes Agent, or OpenClaw to Relay. https://relayapp.im",
5
+ "homepage": "https://relayapp.im",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/relaymessenger/relayapp.git"
9
+ },
10
+ "type": "module",
11
+ "bin": {
12
+ "relaymessenger": "dist/cli.js"
13
+ },
14
+ "files": [
15
+ "claude-plugin",
16
+ "dist",
17
+ "openclaw-plugin",
18
+ "LICENSE",
19
+ "README.md"
20
+ ],
21
+ "engines": {
22
+ "node": ">=22.18"
23
+ },
24
+ "scripts": {
25
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
26
+ "build": "tsc -p tsconfig.json",
27
+ "check": "tsc -p tsconfig.json --noEmit",
28
+ "test": "tsx --test \"src/**/*.test.ts\"",
29
+ "prepack": "node scripts/build-claude-bundle.mjs && npm run clean && npm run build"
30
+ },
31
+ "dependencies": {
32
+ "@agentclientprotocol/claude-agent-acp": "0.59.0",
33
+ "@agentclientprotocol/codex-acp": "1.1.4",
34
+ "@agentclientprotocol/sdk": "^1.2.1",
35
+ "cross-spawn": "7.0.6",
36
+ "qrcode-terminal": "^0.12.0",
37
+ "smol-toml": "^1.4.2"
38
+ },
39
+ "devDependencies": {
40
+ "@anthropic-ai/claude-code": "2.1.214",
41
+ "@types/cross-spawn": "6.0.6",
42
+ "@types/node": "^22.18.0",
43
+ "@types/qrcode-terminal": "^0.12.2",
44
+ "tsx": "^4.21.0",
45
+ "typescript": "^5.9.3"
46
+ },
47
+ "license": "MIT",
48
+ "publishConfig": {
49
+ "access": "public"
50
+ }
51
+ }