codex-grok-mcp 0.2.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 (56) hide show
  1. package/CONTRIBUTING.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +255 -0
  4. package/SECURITY.md +109 -0
  5. package/dist/bridge-companion.d.ts +61 -0
  6. package/dist/bridge-companion.js +436 -0
  7. package/dist/bridge-companion.js.map +1 -0
  8. package/dist/bridge-pairing.d.ts +30 -0
  9. package/dist/bridge-pairing.js +364 -0
  10. package/dist/bridge-pairing.js.map +1 -0
  11. package/dist/bridge-protocol.d.ts +187 -0
  12. package/dist/bridge-protocol.js +360 -0
  13. package/dist/bridge-protocol.js.map +1 -0
  14. package/dist/bridge-replay.d.ts +10 -0
  15. package/dist/bridge-replay.js +107 -0
  16. package/dist/bridge-replay.js.map +1 -0
  17. package/dist/bridge-runtime.d.ts +11 -0
  18. package/dist/bridge-runtime.js +259 -0
  19. package/dist/bridge-runtime.js.map +1 -0
  20. package/dist/direct-gateway-transport.d.ts +7 -0
  21. package/dist/direct-gateway-transport.js +241 -0
  22. package/dist/direct-gateway-transport.js.map +1 -0
  23. package/dist/grok-bot-client.d.ts +93 -0
  24. package/dist/grok-bot-client.js +475 -0
  25. package/dist/grok-bot-client.js.map +1 -0
  26. package/dist/grok-bot-gateway.d.ts +204 -0
  27. package/dist/grok-bot-gateway.js +741 -0
  28. package/dist/grok-bot-gateway.js.map +1 -0
  29. package/dist/grok-cli.d.ts +31 -0
  30. package/dist/grok-cli.js +338 -0
  31. package/dist/grok-cli.js.map +1 -0
  32. package/dist/index.d.ts +8 -0
  33. package/dist/index.js +228 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/relay-transport.d.ts +9 -0
  36. package/dist/relay-transport.js +278 -0
  37. package/dist/relay-transport.js.map +1 -0
  38. package/dist/schema.d.ts +16 -0
  39. package/dist/schema.js +22 -0
  40. package/dist/schema.js.map +1 -0
  41. package/dist/version.d.ts +4 -0
  42. package/dist/version.js +10 -0
  43. package/dist/version.js.map +1 -0
  44. package/package.json +71 -0
  45. package/plugins/codex-grok-mcp/assets/icon.png +0 -0
  46. package/relay/.dev.vars.example +2 -0
  47. package/relay/README.md +26 -0
  48. package/relay/package-lock.json +3291 -0
  49. package/relay/package.json +17 -0
  50. package/relay/src/index.ts +182 -0
  51. package/relay/test/relay.test.ts +127 -0
  52. package/relay/test/tsconfig.json +13 -0
  53. package/relay/tsconfig.json +15 -0
  54. package/relay/vitest.config.ts +15 -0
  55. package/relay/worker-configuration.d.ts +15362 -0
  56. package/relay/wrangler.jsonc +33 -0
@@ -0,0 +1,360 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { z } from "zod";
3
+ import { MAX_PROMPT_BYTES } from "./schema.js";
4
+ import { BRIDGE_STATUS_PROTOCOL_VERSION } from "./version.js";
5
+ const MAX_ROSTER_BOTS = 500;
6
+ export const MAX_READ_BOT_MESSAGES = 50;
7
+ export const MAX_READ_SNAPSHOT_BYTES = 64 * 1024;
8
+ const MAX_READ_TEXT_BYTES = 48 * 1024;
9
+ const MAX_READ_MESSAGE_TEXT_BYTES = 16 * 1024;
10
+ const rpcIdSchema = z.string().uuid();
11
+ const botIdSchema = z.string().trim().min(1).max(512).refine((value) => !value.includes("\0"), "Bot ID must not contain NUL bytes");
12
+ const messageSchema = z
13
+ .string()
14
+ .refine((value) => value.trim().length > 0, "Message must not be empty")
15
+ .refine((value) => !value.includes("\0"), "Message must not contain NUL bytes")
16
+ .refine((value) => Buffer.byteLength(value, "utf8") <= MAX_PROMPT_BYTES, `Message must not exceed ${MAX_PROMPT_BYTES} UTF-8 bytes`);
17
+ export const bridgeBotSchema = z
18
+ .object({
19
+ id: botIdSchema,
20
+ name: z.string().trim().min(1).max(512),
21
+ is_running: z.boolean().nullable(),
22
+ })
23
+ .strict();
24
+ const bridgeReadTextSchema = z
25
+ .string()
26
+ .refine((value) => value.trim().length > 0, "Read message text must not be empty")
27
+ .refine((value) => sanitizeReadText(value) === value, "Read message text is not normalized")
28
+ .refine((value) => Buffer.byteLength(value, "utf8") <= MAX_READ_MESSAGE_TEXT_BYTES, `Read message text must not exceed ${MAX_READ_MESSAGE_TEXT_BYTES} UTF-8 bytes`);
29
+ export const bridgeReadMessageSchema = z
30
+ .object({
31
+ speaker: z.enum(["user", "bot", "peer"]),
32
+ text: bridgeReadTextSchema,
33
+ timestamp_ms: z.number().int().nonnegative().safe().nullable(),
34
+ })
35
+ .strict();
36
+ export const bridgeReadSnapshotSchema = z
37
+ .object({
38
+ bot_id: botIdSchema,
39
+ is_running: z.boolean().nullable(),
40
+ is_composing: z.boolean().nullable(),
41
+ awaiting_user: z.boolean().nullable(),
42
+ async_task_count: z.number().int().nonnegative().nullable(),
43
+ running_subagent_count: z.number().int().nonnegative().nullable(),
44
+ messages: z.array(bridgeReadMessageSchema).max(MAX_READ_BOT_MESSAGES),
45
+ next_before_sequence: z.number().int().nonnegative().safe().nullable(),
46
+ truncated: z.boolean(),
47
+ })
48
+ .strict()
49
+ .refine((value) => Buffer.byteLength(JSON.stringify(value), "utf8") <= MAX_READ_SNAPSHOT_BYTES, `Read snapshot must not exceed ${MAX_READ_SNAPSHOT_BYTES} UTF-8 bytes`);
50
+ const bridgeCapabilitySchema = z
51
+ .string()
52
+ .min(1)
53
+ .max(64)
54
+ .regex(/^[a-z][a-z0-9_]*$/);
55
+ export const bridgeStatusResultSchema = z
56
+ .object({
57
+ companion_version: z.string().min(1).max(64).regex(/^[0-9A-Za-z.+-]+$/),
58
+ supported_protocol_versions: z
59
+ .array(z.number().int().positive().max(32))
60
+ .min(1)
61
+ .max(16)
62
+ .refine((versions) => new Set(versions).size === versions.length, "Versions must be unique")
63
+ .refine((versions) => versions.every((version, index) => index === 0 || version > versions[index - 1]), "Versions must be sorted"),
64
+ capabilities: z
65
+ .array(bridgeCapabilitySchema)
66
+ .min(1)
67
+ .max(16)
68
+ .refine((capabilities) => new Set(capabilities).size === capabilities.length, "Capabilities must be unique"),
69
+ gateway_healthy: z.boolean(),
70
+ gateway_busy: z.boolean(),
71
+ non_group_bot_count: z.number().int().nonnegative().max(MAX_ROSTER_BOTS),
72
+ })
73
+ .strict();
74
+ function record(value) {
75
+ return typeof value === "object" && value !== null && !Array.isArray(value)
76
+ ? value
77
+ : undefined;
78
+ }
79
+ function nonnegativeInteger(value) {
80
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0
81
+ ? value
82
+ : null;
83
+ }
84
+ function actorId(value) {
85
+ if (typeof value === "string" && value.length > 0 && value.length <= 512)
86
+ return value;
87
+ const source = record(value);
88
+ if (source === undefined)
89
+ return undefined;
90
+ return typeof source.id === "string" && source.id.length > 0 && source.id.length <= 512
91
+ ? source.id
92
+ : undefined;
93
+ }
94
+ function truncateUtf8(value, maxBytes) {
95
+ if (Buffer.byteLength(value, "utf8") <= maxBytes)
96
+ return { text: value, truncated: false };
97
+ const suffix = "…";
98
+ if (maxBytes < Buffer.byteLength(suffix, "utf8"))
99
+ return { text: "", truncated: true };
100
+ const budget = maxBytes - Buffer.byteLength(suffix, "utf8");
101
+ const characters = [];
102
+ let bytes = 0;
103
+ for (const character of value) {
104
+ const next = Buffer.byteLength(character, "utf8");
105
+ if (bytes + next > budget)
106
+ break;
107
+ characters.push(character);
108
+ bytes += next;
109
+ }
110
+ if (characters.length === 0)
111
+ return { text: "", truncated: true };
112
+ return { text: `${characters.join("")}${suffix}`, truncated: true };
113
+ }
114
+ function sanitizeReadText(value) {
115
+ return value
116
+ .replaceAll("\r\n", "\n")
117
+ .replaceAll("\r", "\n")
118
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/gu, "");
119
+ }
120
+ function normalizeReadMessage(value, botId) {
121
+ const outer = record(value);
122
+ if (outer === undefined)
123
+ return undefined;
124
+ const nested = record(outer.entry);
125
+ const entry = nested ?? outer;
126
+ if (entry.streaming === true || outer.streaming === true)
127
+ return undefined;
128
+ const kind = typeof entry.kind === "string" ? entry.kind : undefined;
129
+ const role = entry.role === "user" || entry.role === "assistant" ? entry.role : undefined;
130
+ let text;
131
+ if ((kind === "message" || kind === undefined) && role !== undefined) {
132
+ if (typeof entry.content === "string" && entry.content.trim().length > 0) {
133
+ text = entry.content;
134
+ }
135
+ }
136
+ else if (kind === "send-message") {
137
+ const message = record(entry.message);
138
+ if (message?.type === "text" &&
139
+ typeof message.content === "string" &&
140
+ message.content.trim().length > 0) {
141
+ text = message.content;
142
+ }
143
+ }
144
+ if (text === undefined)
145
+ return undefined;
146
+ text = sanitizeReadText(text);
147
+ if (text.trim().length === 0)
148
+ return undefined;
149
+ const bounded = truncateUtf8(text, MAX_READ_MESSAGE_TEXT_BYTES);
150
+ const authorId = actorId(entry.author);
151
+ const fromAgentId = actorId(entry.fromAgent);
152
+ const fromUserId = actorId(entry.fromUser);
153
+ const sourceId = authorId ?? fromAgentId ?? fromUserId;
154
+ const hasPeerSource = record(entry.author) !== undefined ||
155
+ record(entry.fromAgent) !== undefined ||
156
+ typeof entry.author === "string" ||
157
+ typeof entry.fromAgent === "string";
158
+ const speaker = sourceId === botId
159
+ ? "bot"
160
+ : fromUserId !== undefined && !hasPeerSource
161
+ ? "user"
162
+ : hasPeerSource
163
+ ? "peer"
164
+ : role === "user"
165
+ ? "user"
166
+ : "bot";
167
+ return {
168
+ message: {
169
+ speaker,
170
+ text: bounded.text,
171
+ timestamp_ms: nonnegativeInteger(entry.timestampMs) ?? nonnegativeInteger(outer.timestampMs),
172
+ },
173
+ sequence: nonnegativeInteger(outer.seq) ?? nonnegativeInteger(entry.seq),
174
+ truncated: bounded.truncated,
175
+ };
176
+ }
177
+ export function createBridgeReadSnapshot(input) {
178
+ const normalized = input.entries
179
+ .map((entry) => normalizeReadMessage(entry, input.bot_id))
180
+ .filter((entry) => entry !== undefined);
181
+ const kept = [];
182
+ let remainingTextBytes = MAX_READ_TEXT_BYTES;
183
+ let truncated = normalized.some((entry) => entry.truncated);
184
+ for (let index = normalized.length - 1; index >= 0; index -= 1) {
185
+ const current = normalized[index];
186
+ if (current === undefined)
187
+ continue;
188
+ const bounded = truncateUtf8(current.message.text, remainingTextBytes);
189
+ if (bounded.text.length > 0) {
190
+ kept.push({
191
+ message: { ...current.message, text: bounded.text },
192
+ sequence: current.sequence,
193
+ truncated: current.truncated || bounded.truncated,
194
+ });
195
+ remainingTextBytes -= Buffer.byteLength(bounded.text, "utf8");
196
+ }
197
+ if (bounded.truncated || remainingTextBytes === 0) {
198
+ truncated = truncated || bounded.truncated || index > 0;
199
+ break;
200
+ }
201
+ }
202
+ kept.reverse();
203
+ let nextBeforeSequence = input.next_before_sequence;
204
+ const updatePaginationBoundary = (removedSequence) => {
205
+ const firstSequence = kept.find(({ sequence }) => sequence !== null)?.sequence;
206
+ if (firstSequence !== null && firstSequence !== undefined) {
207
+ nextBeforeSequence = firstSequence;
208
+ }
209
+ else if (removedSequence !== null &&
210
+ removedSequence !== undefined &&
211
+ Number.isSafeInteger(removedSequence + 1)) {
212
+ nextBeforeSequence = removedSequence + 1;
213
+ }
214
+ };
215
+ if (kept.length < normalized.length) {
216
+ truncated = true;
217
+ updatePaginationBoundary();
218
+ }
219
+ const snapshot = () => ({
220
+ bot_id: input.bot_id,
221
+ is_running: input.is_running,
222
+ is_composing: input.is_composing,
223
+ awaiting_user: input.awaiting_user,
224
+ async_task_count: input.async_task_count,
225
+ running_subagent_count: input.running_subagent_count,
226
+ messages: kept.map(({ message }) => message),
227
+ next_before_sequence: nextBeforeSequence,
228
+ truncated,
229
+ });
230
+ while (Buffer.byteLength(JSON.stringify(snapshot()), "utf8") > MAX_READ_SNAPSHOT_BYTES) {
231
+ const removed = kept.shift();
232
+ if (removed === undefined)
233
+ break;
234
+ truncated = true;
235
+ updatePaginationBoundary(removed.sequence);
236
+ }
237
+ return bridgeReadSnapshotSchema.parse(snapshot());
238
+ }
239
+ export const bridgeRequestSchema = z.discriminatedUnion("op", [
240
+ z
241
+ .object({
242
+ v: z.literal(BRIDGE_STATUS_PROTOCOL_VERSION),
243
+ id: rpcIdSchema,
244
+ issued_at_ms: z.number().int().nonnegative(),
245
+ op: z.literal("status"),
246
+ args: z.object({}).strict(),
247
+ })
248
+ .strict(),
249
+ z
250
+ .object({
251
+ v: z.literal(1),
252
+ id: rpcIdSchema,
253
+ issued_at_ms: z.number().int().nonnegative(),
254
+ op: z.literal("list_bots"),
255
+ args: z.object({}).strict(),
256
+ })
257
+ .strict(),
258
+ z
259
+ .object({
260
+ v: z.literal(2),
261
+ id: rpcIdSchema,
262
+ issued_at_ms: z.number().int().nonnegative(),
263
+ op: z.literal("read_bot"),
264
+ args: z
265
+ .object({
266
+ bot_id: botIdSchema,
267
+ limit: z.number().int().min(1).max(MAX_READ_BOT_MESSAGES),
268
+ before_sequence: z.number().int().nonnegative().safe().optional(),
269
+ })
270
+ .strict(),
271
+ })
272
+ .strict(),
273
+ z
274
+ .object({
275
+ v: z.literal(1),
276
+ id: rpcIdSchema,
277
+ issued_at_ms: z.number().int().nonnegative(),
278
+ op: z.literal("send_message"),
279
+ args: z
280
+ .object({
281
+ bot_id: botIdSchema,
282
+ message: messageSchema,
283
+ })
284
+ .strict(),
285
+ })
286
+ .strict(),
287
+ ]);
288
+ export const bridgeErrorCodeSchema = z.enum([
289
+ "AUTH_FAILED",
290
+ "BOT_NOT_FOUND",
291
+ "CANCELLED",
292
+ "CONFIG_INVALID",
293
+ "GATEWAY_REJECTED",
294
+ "INVALID_RESPONSE",
295
+ "OUTPUT_LIMIT",
296
+ "RATE_LIMITED",
297
+ "ROSTER_CHANGED",
298
+ "TIMEOUT",
299
+ "UNAVAILABLE",
300
+ "UPGRADE_REQUIRED",
301
+ ]);
302
+ const bridgeErrorSchema = z
303
+ .object({
304
+ code: bridgeErrorCodeSchema,
305
+ delivery_may_have_occurred: z.boolean(),
306
+ request_id: z.string().min(1).max(512).optional(),
307
+ })
308
+ .strict();
309
+ export const bridgeResponseSchema = z.union([
310
+ z
311
+ .object({
312
+ v: z.literal(BRIDGE_STATUS_PROTOCOL_VERSION),
313
+ id: rpcIdSchema,
314
+ op: z.literal("status"),
315
+ ok: z.literal(true),
316
+ result: bridgeStatusResultSchema,
317
+ })
318
+ .strict(),
319
+ z
320
+ .object({
321
+ v: z.literal(1),
322
+ id: rpcIdSchema,
323
+ op: z.literal("list_bots"),
324
+ ok: z.literal(true),
325
+ result: z.object({ bots: z.array(bridgeBotSchema).max(MAX_ROSTER_BOTS) }).strict(),
326
+ })
327
+ .strict(),
328
+ z
329
+ .object({
330
+ v: z.literal(2),
331
+ id: rpcIdSchema,
332
+ op: z.literal("read_bot"),
333
+ ok: z.literal(true),
334
+ result: bridgeReadSnapshotSchema,
335
+ })
336
+ .strict(),
337
+ z
338
+ .object({
339
+ v: z.literal(1),
340
+ id: rpcIdSchema,
341
+ op: z.literal("send_message"),
342
+ ok: z.literal(true),
343
+ result: z
344
+ .object({
345
+ accepted: z.literal(true),
346
+ request_id: z.string().min(1).max(512),
347
+ })
348
+ .strict(),
349
+ })
350
+ .strict(),
351
+ z
352
+ .object({
353
+ v: z.union([z.literal(1), z.literal(2), z.literal(BRIDGE_STATUS_PROTOCOL_VERSION)]),
354
+ id: rpcIdSchema,
355
+ ok: z.literal(false),
356
+ error: bridgeErrorSchema,
357
+ })
358
+ .strict(),
359
+ ]);
360
+ //# sourceMappingURL=bridge-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-protocol.js","sourceRoot":"","sources":["../src/bridge-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class BridgeReplayError extends Error {
2
+ constructor();
3
+ }
4
+ export declare function defaultReplayRoot(environment?: NodeJS.ProcessEnv, home?: string): string;
5
+ export declare class PersistentReplayGuard {
6
+ #private;
7
+ private constructor();
8
+ static open(channel: string, retentionMs: number, root?: string): Promise<PersistentReplayGuard>;
9
+ claim(id: string, now: number): Promise<"claimed" | "replay">;
10
+ }
@@ -0,0 +1,107 @@
1
+ import { constants as fsConstants } from "node:fs";
2
+ import { lstat, mkdir, open, readdir, unlink } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { isAbsolute, join } from "node:path";
5
+ const MAX_MARKERS = 1_024;
6
+ export class BridgeReplayError extends Error {
7
+ constructor() {
8
+ super("replay_guard_failed");
9
+ this.name = "BridgeReplayError";
10
+ }
11
+ }
12
+ function isNodeError(caught) {
13
+ return caught instanceof Error && "code" in caught;
14
+ }
15
+ export function defaultReplayRoot(environment = process.env, home = homedir()) {
16
+ const xdgStateHome = environment.XDG_STATE_HOME;
17
+ const stateHome = xdgStateHome !== undefined && isAbsolute(xdgStateHome)
18
+ ? xdgStateHome
19
+ : join(home, ".local", "state");
20
+ if (!isAbsolute(stateHome))
21
+ throw new BridgeReplayError();
22
+ return join(stateHome, "codex-grok-mcp", "replay");
23
+ }
24
+ async function ensurePrivateDirectory(path) {
25
+ await mkdir(path, { recursive: true, mode: 0o700 });
26
+ const details = await lstat(path);
27
+ if (details.isSymbolicLink() || !details.isDirectory() || (details.mode & 0o777) !== 0o700) {
28
+ throw new BridgeReplayError();
29
+ }
30
+ }
31
+ export class PersistentReplayGuard {
32
+ #directory;
33
+ #retentionMs;
34
+ constructor(directory, retentionMs) {
35
+ this.#directory = directory;
36
+ this.#retentionMs = retentionMs;
37
+ }
38
+ static async open(channel, retentionMs, root = defaultReplayRoot()) {
39
+ await ensurePrivateDirectory(root);
40
+ const directory = join(root, `channel-${channel}`);
41
+ await ensurePrivateDirectory(directory);
42
+ const guard = new PersistentReplayGuard(directory, retentionMs);
43
+ await guard.#prune(Date.now());
44
+ return guard;
45
+ }
46
+ async claim(id, now) {
47
+ await this.#prune(now);
48
+ const marker = join(this.#directory, id);
49
+ const noFollow = typeof fsConstants.O_NOFOLLOW === "number" ? fsConstants.O_NOFOLLOW : 0;
50
+ let handle;
51
+ try {
52
+ handle = await open(marker, fsConstants.O_CREAT |
53
+ fsConstants.O_EXCL |
54
+ fsConstants.O_WRONLY |
55
+ noFollow, 0o600);
56
+ }
57
+ catch (caught) {
58
+ if (isNodeError(caught) && caught.code === "EEXIST")
59
+ return "replay";
60
+ throw new BridgeReplayError();
61
+ }
62
+ try {
63
+ await handle.writeFile(`${now}\n`, "utf8");
64
+ await handle.sync();
65
+ }
66
+ catch {
67
+ await handle.close().catch(() => undefined);
68
+ await unlink(marker).catch(() => undefined);
69
+ throw new BridgeReplayError();
70
+ }
71
+ await handle.close();
72
+ return "claimed";
73
+ }
74
+ async #prune(now) {
75
+ let entries;
76
+ try {
77
+ entries = await readdir(this.#directory);
78
+ }
79
+ catch {
80
+ throw new BridgeReplayError();
81
+ }
82
+ for (const entry of entries) {
83
+ const path = join(this.#directory, entry);
84
+ try {
85
+ const details = await lstat(path);
86
+ if (details.isSymbolicLink() ||
87
+ !details.isFile() ||
88
+ (details.mode & 0o777) !== 0o600) {
89
+ throw new BridgeReplayError();
90
+ }
91
+ if (now - details.mtimeMs > this.#retentionMs)
92
+ await unlink(path);
93
+ }
94
+ catch (caught) {
95
+ if (isNodeError(caught) && caught.code === "ENOENT")
96
+ continue;
97
+ if (caught instanceof BridgeReplayError)
98
+ throw caught;
99
+ throw new BridgeReplayError();
100
+ }
101
+ }
102
+ if ((await readdir(this.#directory)).length >= MAX_MARKERS) {
103
+ throw new BridgeReplayError();
104
+ }
105
+ }
106
+ }
107
+ //# sourceMappingURL=bridge-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-replay.js","sourceRoot":"","sources":["../src/bridge-replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class BridgeRuntimeError extends Error {
2
+ readonly code: "companion_already_running" | "companion_lease_invalid" | "companion_lease_stale";
3
+ constructor(code: "companion_already_running" | "companion_lease_invalid" | "companion_lease_stale");
4
+ }
5
+ export declare function companionLeasePath(configPath: string): string;
6
+ export declare class CompanionLease {
7
+ #private;
8
+ private constructor();
9
+ static acquire(configPath: string): Promise<CompanionLease>;
10
+ release(): Promise<void>;
11
+ }