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,259 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { constants as fsConstants, readFileSync } from "node:fs";
3
+ import { lstat, mkdir, open, unlink } from "node:fs/promises";
4
+ import { dirname, resolve } from "node:path";
5
+ const LEASE_VERSION = 1;
6
+ const MAX_LEASE_BYTES = 1_024;
7
+ export class BridgeRuntimeError extends Error {
8
+ code;
9
+ constructor(code) {
10
+ super(code);
11
+ this.name = "BridgeRuntimeError";
12
+ this.code = code;
13
+ }
14
+ }
15
+ function fail(code = "companion_lease_invalid") {
16
+ throw new BridgeRuntimeError(code);
17
+ }
18
+ function isNodeError(caught) {
19
+ return caught instanceof Error && "code" in caught;
20
+ }
21
+ function currentUid() {
22
+ if (typeof process.getuid !== "function")
23
+ fail();
24
+ return process.getuid();
25
+ }
26
+ function sameFile(left, right) {
27
+ return left.dev === right.dev && left.ino === right.ino;
28
+ }
29
+ function canonicalToken(value) {
30
+ return (/^[A-Za-z0-9_-]+$/.test(value) &&
31
+ Buffer.from(value, "base64url").length === 32 &&
32
+ Buffer.from(value, "base64url").toString("base64url") === value);
33
+ }
34
+ function parseLeaseRecord(contents) {
35
+ let value;
36
+ try {
37
+ value = JSON.parse(contents);
38
+ }
39
+ catch {
40
+ fail();
41
+ }
42
+ if (typeof value !== "object" || value === null || Array.isArray(value))
43
+ fail();
44
+ const record = value;
45
+ const keys = Object.keys(record).sort();
46
+ if (keys.length !== 4 ||
47
+ keys[0] !== "owner_token" ||
48
+ keys[1] !== "pid" ||
49
+ keys[2] !== "process_start_id" ||
50
+ keys[3] !== "version" ||
51
+ record.version !== LEASE_VERSION ||
52
+ !Number.isSafeInteger(record.pid) ||
53
+ record.pid <= 0 ||
54
+ record.pid > 2_147_483_647 ||
55
+ (record.process_start_id !== null &&
56
+ (typeof record.process_start_id !== "string" ||
57
+ !/^linux:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}:[0-9]+$/.test(record.process_start_id))) ||
58
+ typeof record.owner_token !== "string" ||
59
+ !canonicalToken(record.owner_token)) {
60
+ fail();
61
+ }
62
+ return record;
63
+ }
64
+ function linuxProcessStartIdentity(pid) {
65
+ if (process.platform !== "linux")
66
+ return undefined;
67
+ try {
68
+ const bootId = readFileSync("/proc/sys/kernel/random/boot_id", "utf8")
69
+ .trim()
70
+ .toLowerCase();
71
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(bootId)) {
72
+ return undefined;
73
+ }
74
+ const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
75
+ const fields = stat.slice(stat.lastIndexOf(")") + 2).trim().split(/\s+/);
76
+ const startTicks = fields[19];
77
+ if (startTicks === undefined || !/^[0-9]+$/.test(startTicks))
78
+ return undefined;
79
+ return `linux:${bootId}:${startTicks}`;
80
+ }
81
+ catch {
82
+ return undefined;
83
+ }
84
+ }
85
+ function processState(record) {
86
+ const actualStart = linuxProcessStartIdentity(record.pid);
87
+ if (record.process_start_id !== null && actualStart !== undefined) {
88
+ return record.process_start_id === actualStart ? "active" : "stale";
89
+ }
90
+ try {
91
+ process.kill(record.pid, 0);
92
+ return "active";
93
+ }
94
+ catch (caught) {
95
+ if (isNodeError(caught) && caught.code === "ESRCH")
96
+ return "stale";
97
+ if (isNodeError(caught) && caught.code === "EPERM")
98
+ return "active";
99
+ return "unknown";
100
+ }
101
+ }
102
+ async function ensurePrivateParent(path) {
103
+ const parent = dirname(path);
104
+ try {
105
+ await mkdir(parent, { recursive: true, mode: 0o700 });
106
+ const details = await lstat(parent);
107
+ if (details.isSymbolicLink() ||
108
+ !details.isDirectory() ||
109
+ (details.mode & 0o7777) !== 0o700 ||
110
+ details.uid !== currentUid()) {
111
+ fail();
112
+ }
113
+ }
114
+ catch (caught) {
115
+ if (caught instanceof BridgeRuntimeError)
116
+ throw caught;
117
+ fail();
118
+ }
119
+ }
120
+ async function readLease(path) {
121
+ let handle;
122
+ try {
123
+ const pathDetails = await lstat(path);
124
+ if (pathDetails.isSymbolicLink() ||
125
+ !pathDetails.isFile() ||
126
+ (pathDetails.mode & 0o7777) !== 0o600 ||
127
+ pathDetails.uid !== currentUid() ||
128
+ pathDetails.nlink !== 1 ||
129
+ pathDetails.size <= 0 ||
130
+ pathDetails.size > MAX_LEASE_BYTES) {
131
+ fail();
132
+ }
133
+ handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
134
+ const details = await handle.stat();
135
+ if (!sameFile(pathDetails, details) ||
136
+ !details.isFile() ||
137
+ (details.mode & 0o7777) !== 0o600 ||
138
+ details.uid !== currentUid() ||
139
+ details.nlink !== 1 ||
140
+ details.size <= 0 ||
141
+ details.size > MAX_LEASE_BYTES) {
142
+ fail();
143
+ }
144
+ const buffer = Buffer.alloc(MAX_LEASE_BYTES + 1);
145
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
146
+ if (bytesRead === 0 || bytesRead > MAX_LEASE_BYTES)
147
+ fail();
148
+ return {
149
+ device: details.dev,
150
+ inode: details.ino,
151
+ record: parseLeaseRecord(buffer.subarray(0, bytesRead).toString("utf8")),
152
+ };
153
+ }
154
+ catch (caught) {
155
+ if (caught instanceof BridgeRuntimeError)
156
+ throw caught;
157
+ throw caught;
158
+ }
159
+ finally {
160
+ await handle?.close().catch(() => undefined);
161
+ }
162
+ }
163
+ export function companionLeasePath(configPath) {
164
+ return `${resolve(configPath)}.lock`;
165
+ }
166
+ export class CompanionLease {
167
+ #path;
168
+ #ownerToken;
169
+ constructor(path, ownerToken) {
170
+ this.#path = path;
171
+ this.#ownerToken = ownerToken;
172
+ }
173
+ static async acquire(configPath) {
174
+ const path = companionLeasePath(configPath);
175
+ await ensurePrivateParent(path);
176
+ for (let attempt = 0; attempt < 4; attempt += 1) {
177
+ const ownerToken = randomBytes(32).toString("base64url");
178
+ let handle;
179
+ try {
180
+ handle = await open(path, fsConstants.O_CREAT |
181
+ fsConstants.O_EXCL |
182
+ fsConstants.O_WRONLY |
183
+ fsConstants.O_NOFOLLOW, 0o600);
184
+ }
185
+ catch (caught) {
186
+ if (!isNodeError(caught) || caught.code !== "EEXIST")
187
+ fail();
188
+ let snapshot;
189
+ try {
190
+ snapshot = await readLease(path);
191
+ }
192
+ catch (readError) {
193
+ if (isNodeError(readError) && readError.code === "ENOENT")
194
+ continue;
195
+ fail();
196
+ }
197
+ const state = processState(snapshot.record);
198
+ if (state === "active")
199
+ fail("companion_already_running");
200
+ if (state === "stale")
201
+ fail("companion_lease_stale");
202
+ fail();
203
+ }
204
+ const record = {
205
+ version: LEASE_VERSION,
206
+ pid: process.pid,
207
+ process_start_id: linuxProcessStartIdentity(process.pid) ?? null,
208
+ owner_token: ownerToken,
209
+ };
210
+ try {
211
+ const details = await handle.stat();
212
+ if (!details.isFile() ||
213
+ (details.mode & 0o7777) !== 0o600 ||
214
+ details.uid !== currentUid() ||
215
+ details.nlink !== 1) {
216
+ fail();
217
+ }
218
+ await handle.writeFile(`${JSON.stringify(record)}\n`, "utf8");
219
+ await handle.sync();
220
+ return new CompanionLease(path, ownerToken);
221
+ }
222
+ catch (caught) {
223
+ await handle.close().catch(() => undefined);
224
+ await unlink(path).catch(() => undefined);
225
+ if (caught instanceof BridgeRuntimeError)
226
+ throw caught;
227
+ fail();
228
+ }
229
+ finally {
230
+ await handle.close().catch(() => undefined);
231
+ }
232
+ }
233
+ fail();
234
+ }
235
+ async release() {
236
+ const snapshot = await readLease(this.#path).catch(() => fail());
237
+ if (snapshot.record.owner_token !== this.#ownerToken)
238
+ fail();
239
+ let current;
240
+ try {
241
+ current = await readLease(this.#path);
242
+ }
243
+ catch {
244
+ fail();
245
+ }
246
+ if (current.device !== snapshot.device ||
247
+ current.inode !== snapshot.inode ||
248
+ current.record.owner_token !== this.#ownerToken) {
249
+ fail();
250
+ }
251
+ try {
252
+ await unlink(this.#path);
253
+ }
254
+ catch {
255
+ fail();
256
+ }
257
+ }
258
+ }
259
+ //# sourceMappingURL=bridge-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-runtime.js","sourceRoot":"","sources":["../src/bridge-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type GrokBotTransport } from "./grok-bot-gateway.js";
2
+ export type DirectGatewayConfig = {
3
+ baseUrl: string;
4
+ token: string;
5
+ };
6
+ export declare function loadDirectGatewayConfig(env?: NodeJS.ProcessEnv): DirectGatewayConfig | undefined;
7
+ export declare function createDirectGatewayTransport(config: DirectGatewayConfig): GrokBotTransport;
@@ -0,0 +1,241 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { randomUUID } from "node:crypto";
3
+ import { z } from "zod";
4
+ import { GrokBotGatewayError, } from "./grok-bot-gateway.js";
5
+ import { createBridgeReadSnapshot, MAX_READ_BOT_MESSAGES } from "./bridge-protocol.js";
6
+ const GATEWAY_TIMEOUT_MS = 10_000;
7
+ const MAX_GATEWAY_RESPONSE_BYTES = 1024 * 1024;
8
+ const MAX_ROSTER_BOTS = 500;
9
+ const rawBotSchema = z
10
+ .object({
11
+ id: z.string().trim().min(1).max(512),
12
+ name: z.string().trim().min(1).max(512),
13
+ isRunning: z.boolean().optional(),
14
+ isComposingMessage: z.boolean().optional(),
15
+ awaitingUserResponse: z.unknown().optional(),
16
+ isGroup: z.boolean().optional(),
17
+ })
18
+ .passthrough();
19
+ const rawRosterSchema = z.array(rawBotSchema).max(MAX_ROSTER_BOTS);
20
+ const sendPromptResponseSchema = z.object({ accepted: z.literal(true) }).passthrough();
21
+ const transcriptTailSchema = z
22
+ .object({
23
+ entries: z.array(z.unknown()).max(MAX_READ_BOT_MESSAGES),
24
+ nextBeforeSeq: z.number().int().nonnegative().safe().optional(),
25
+ })
26
+ .passthrough();
27
+ const asyncTasksSchema = z
28
+ .array(z.object({ status: z.literal("running") }).passthrough())
29
+ .max(MAX_ROSTER_BOTS);
30
+ const subagentsSchema = z
31
+ .array(z.object({ status: z.string() }).passthrough())
32
+ .max(MAX_ROSTER_BOTS);
33
+ function error(code, message, options = {}) {
34
+ return new GrokBotGatewayError(code, message, options);
35
+ }
36
+ export function loadDirectGatewayConfig(env = process.env) {
37
+ const urlText = env.GROKBOT_GATEWAY_URL?.trim();
38
+ const token = env.SAND_GATEWAY_TOKEN?.trim();
39
+ if (!urlText && !token)
40
+ return undefined;
41
+ if (!urlText || !token) {
42
+ throw error("CONFIG_INVALID", "Persistent Grok Bot tools require both GROKBOT_GATEWAY_URL and SAND_GATEWAY_TOKEN.");
43
+ }
44
+ if (token.length > 4096 || /[\0\r\n]/.test(token)) {
45
+ throw error("CONFIG_INVALID", "SAND_GATEWAY_TOKEN is invalid.");
46
+ }
47
+ let url;
48
+ try {
49
+ url = new URL(urlText);
50
+ }
51
+ catch {
52
+ throw error("CONFIG_INVALID", "GROKBOT_GATEWAY_URL must be an absolute HTTP(S) URL.");
53
+ }
54
+ if (!["http:", "https:"].includes(url.protocol)) {
55
+ throw error("CONFIG_INVALID", "GROKBOT_GATEWAY_URL must use HTTP or HTTPS.");
56
+ }
57
+ const hostname = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
58
+ const isLoopback = hostname === "localhost" || hostname === "::1" || /^127(?:\.\d{1,3}){3}$/.test(hostname);
59
+ if (url.protocol === "http:" && !isLoopback) {
60
+ throw error("CONFIG_INVALID", "GROKBOT_GATEWAY_URL must use HTTPS unless it points to loopback. Use an SSH or VPN local forward for remote plaintext gateways.");
61
+ }
62
+ if (url.username || url.password || url.search || url.hash) {
63
+ throw error("CONFIG_INVALID", "GROKBOT_GATEWAY_URL must not contain credentials, a query string, or a fragment.");
64
+ }
65
+ return { baseUrl: url.toString().replace(/\/+$/, ""), token };
66
+ }
67
+ function endpoint(config, command) {
68
+ return `${config.baseUrl}/api/${command}`;
69
+ }
70
+ async function readResponse(response, requestId, deliveryMayHaveOccurred) {
71
+ const contentLength = response.headers.get("content-length");
72
+ if (contentLength !== null && Number(contentLength) > MAX_GATEWAY_RESPONSE_BYTES) {
73
+ await response.body?.cancel().catch(() => undefined);
74
+ throw error("OUTPUT_LIMIT", "Grok Bot gateway response exceeded the 1 MiB safety limit.", {
75
+ deliveryMayHaveOccurred,
76
+ requestId,
77
+ });
78
+ }
79
+ if (response.body === null)
80
+ return "";
81
+ const chunks = [];
82
+ const reader = response.body.getReader();
83
+ let bytes = 0;
84
+ while (true) {
85
+ const { done, value } = await reader.read();
86
+ if (done)
87
+ break;
88
+ bytes += value.byteLength;
89
+ if (bytes > MAX_GATEWAY_RESPONSE_BYTES) {
90
+ await reader.cancel().catch(() => undefined);
91
+ throw error("OUTPUT_LIMIT", "Grok Bot gateway response exceeded the 1 MiB safety limit.", {
92
+ deliveryMayHaveOccurred,
93
+ requestId,
94
+ });
95
+ }
96
+ chunks.push(Buffer.from(value));
97
+ }
98
+ return Buffer.concat(chunks).toString("utf8");
99
+ }
100
+ function httpError(status, requestId, command) {
101
+ const deliveryMayHaveOccurred = command === "sendPrompt";
102
+ if (status === 401 || status === 403) {
103
+ return error("AUTH_FAILED", "Grok Bot gateway authentication failed.", {
104
+ deliveryMayHaveOccurred,
105
+ requestId,
106
+ });
107
+ }
108
+ if (status === 429) {
109
+ return error("RATE_LIMITED", "Grok Bot gateway rate limit was reached.", {
110
+ deliveryMayHaveOccurred,
111
+ requestId,
112
+ });
113
+ }
114
+ return error("GATEWAY_REJECTED", `Grok Bot gateway rejected the request with HTTP ${status}.`, {
115
+ deliveryMayHaveOccurred,
116
+ requestId,
117
+ });
118
+ }
119
+ async function postGateway(config, command, body, schema, signal) {
120
+ if (signal?.aborted)
121
+ throw error("CANCELLED", "Grok Bot gateway request was cancelled.");
122
+ const requestId = randomUUID();
123
+ const timeoutSignal = AbortSignal.timeout(GATEWAY_TIMEOUT_MS);
124
+ const requestSignal = signal === undefined ? timeoutSignal : AbortSignal.any([signal, timeoutSignal]);
125
+ let response;
126
+ try {
127
+ response = await fetch(endpoint(config, command), {
128
+ method: "POST",
129
+ headers: {
130
+ Accept: "application/json",
131
+ Authorization: `Bearer ${config.token}`,
132
+ "Content-Type": "application/json",
133
+ "x-sand-request-id": requestId,
134
+ "x-sand-slim-avatars": "1",
135
+ },
136
+ body: JSON.stringify(body),
137
+ redirect: "error",
138
+ signal: requestSignal,
139
+ });
140
+ }
141
+ catch {
142
+ if (signal?.aborted) {
143
+ throw error("CANCELLED", "Grok Bot gateway request was cancelled.", {
144
+ deliveryMayHaveOccurred: command === "sendPrompt",
145
+ requestId,
146
+ });
147
+ }
148
+ if (timeoutSignal.aborted) {
149
+ throw error("TIMEOUT", "Grok Bot gateway request timed out.", {
150
+ deliveryMayHaveOccurred: command === "sendPrompt",
151
+ requestId,
152
+ });
153
+ }
154
+ throw error("UNAVAILABLE", "Grok Bot gateway could not be reached.", {
155
+ deliveryMayHaveOccurred: command === "sendPrompt",
156
+ requestId,
157
+ });
158
+ }
159
+ if (!response.ok) {
160
+ await response.body?.cancel().catch(() => undefined);
161
+ throw httpError(response.status, requestId, command);
162
+ }
163
+ let text;
164
+ try {
165
+ text = await readResponse(response, requestId, command === "sendPrompt");
166
+ }
167
+ catch (caught) {
168
+ if (caught instanceof GrokBotGatewayError)
169
+ throw caught;
170
+ throw error("UNAVAILABLE", "Grok Bot gateway response ended unexpectedly.", {
171
+ deliveryMayHaveOccurred: command === "sendPrompt",
172
+ requestId,
173
+ });
174
+ }
175
+ let value;
176
+ try {
177
+ value = JSON.parse(text);
178
+ }
179
+ catch {
180
+ throw error("INVALID_RESPONSE", "Grok Bot gateway returned malformed JSON.", {
181
+ deliveryMayHaveOccurred: command === "sendPrompt",
182
+ requestId,
183
+ });
184
+ }
185
+ const parsed = schema.safeParse(value);
186
+ if (!parsed.success) {
187
+ throw error("INVALID_RESPONSE", "Grok Bot gateway returned an unexpected response.", {
188
+ deliveryMayHaveOccurred: command === "sendPrompt",
189
+ requestId,
190
+ });
191
+ }
192
+ return { data: parsed.data, requestId };
193
+ }
194
+ export function createDirectGatewayTransport(config) {
195
+ return {
196
+ async listBots(signal) {
197
+ const { data } = await postGateway(config, "listAgents", {}, rawRosterSchema, signal);
198
+ return data
199
+ .filter((bot) => bot.isGroup === false)
200
+ .map((bot) => ({ id: bot.id, name: bot.name, is_running: bot.isRunning ?? null }));
201
+ },
202
+ async readBot(botId, options, signal) {
203
+ const { data: agents } = await postGateway(config, "listAgents", {}, rawRosterSchema, signal);
204
+ const bot = agents.find((candidate) => candidate.id === botId);
205
+ if (bot === undefined || bot.isGroup !== false) {
206
+ throw error("BOT_NOT_FOUND", "Bot ID is not present in the current non-group roster.");
207
+ }
208
+ const [tail, tasks, subagents] = await Promise.all([
209
+ postGateway(config, "getAgentTranscriptTail", {
210
+ id: botId,
211
+ limit: options.limit,
212
+ ...(options.beforeSequence === undefined
213
+ ? {}
214
+ : { beforeSeq: options.beforeSequence }),
215
+ }, transcriptTailSchema, signal),
216
+ postGateway(config, "getAsyncTasks", { id: botId }, asyncTasksSchema, signal),
217
+ postGateway(config, "getSubagents", { id: botId }, subagentsSchema, signal),
218
+ ]);
219
+ if (tail.data.entries.length > options.limit) {
220
+ throw error("INVALID_RESPONSE", "Grok Bot gateway returned too many transcript entries.");
221
+ }
222
+ return createBridgeReadSnapshot({
223
+ bot_id: botId,
224
+ is_running: bot.isRunning ?? null,
225
+ is_composing: bot.isComposingMessage ?? null,
226
+ awaiting_user: bot.awaitingUserResponse === undefined
227
+ ? null
228
+ : bot.awaitingUserResponse !== null && bot.awaitingUserResponse !== false,
229
+ async_task_count: tasks.data.length,
230
+ running_subagent_count: subagents.data.filter(({ status }) => status === "running").length,
231
+ entries: tail.data.entries,
232
+ next_before_sequence: tail.data.nextBeforeSeq ?? null,
233
+ });
234
+ },
235
+ async sendMessage(botId, message, signal) {
236
+ const { requestId } = await postGateway(config, "sendPrompt", { agentId: botId, prompt: message }, sendPromptResponseSchema, signal);
237
+ return { accepted: true, requestId };
238
+ },
239
+ };
240
+ }
241
+ //# sourceMappingURL=direct-gateway-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-gateway-transport.js","sourceRoot":"","sources":["../src/direct-gateway-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,GAIpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEvF,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,0BAA0B,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,MAAM,eAAe,GAAG,GAAG,CAAC;AAO5B,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AACnE,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACvF,MAAM,oBAAoB,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CAChE,CAAC;KACD,WAAW,EAAE,CAAC;AACjB,MAAM,gBAAgB,GAAG,CAAC;KACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;KAC/D,GAAG,CAAC,eAAe,CAAC,CAAC;AACxB,MAAM,eAAe,GAAG,CAAC;KACtB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;KACrD,GAAG,CAAC,eAAe,CAAC,CAAC;AASxB,SAAS,KAAK,CACZ,IAA6B,EAC7B,OAAe,EACf,OAAO,GAA8D,EAAE;IAEvE,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,CACT,gBAAgB,EAChB,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,CAAC,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,CAAC,gBAAgB,EAAE,sDAAsD,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAE,CAAC,OAAO,EAAE,QAAQ,CAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,CAAC,gBAAgB,EAAE,6CAA6C,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,UAAU,GACd,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,IAAI,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3F,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,KAAK,CACT,gBAAgB,EAChB,iIAAiI,CAClI,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,KAAK,CACT,gBAAgB,EAChB,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,MAA2B,EAAE,OAAuB;IACpE,OAAO,GAAG,MAAM,CAAC,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,QAAkB,EAClB,SAAiB,EACjB,uBAAgC;IAEhC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,aAAa,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,0BAA0B,EAAE,CAAC;QACjF,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,cAAc,EAAE,4DAA4D,EAAE;YACxF,uBAAuB;YACvB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,GAAG,0BAA0B,EAAE,CAAC;YACvC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,cAAc,EAAE,4DAA4D,EAAE;gBACxF,uBAAuB;gBACvB,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAChB,MAAc,EACd,SAAiB,EACjB,OAAuB;IAEvB,MAAM,uBAAuB,GAAG,OAAO,KAAK,YAAY,CAAC;IACzD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,aAAa,EAAE,yCAAyC,EAAE;YACrE,uBAAuB;YACvB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,cAAc,EAAE,0CAA0C,EAAE;YACvE,uBAAuB;YACvB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,kBAAkB,EAAE,mDAAmD,MAAM,GAAG,EAAE;QAC7F,uBAAuB;QACvB,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAA2B,EAC3B,OAAuB,EACvB,IAAa,EACb,MAAoB,EACpB,MAAoB;IAEpB,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,KAAK,CAAC,WAAW,EAAE,yCAAyC,CAAC,CAAC;IAEzF,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IACtG,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;gBACvC,cAAc,EAAE,kBAAkB;gBAClC,mBAAmB,EAAE,SAAS;gBAC9B,qBAAqB,EAAE,GAAG;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC,WAAW,EAAE,yCAAyC,EAAE;gBAClE,uBAAuB,EAAE,OAAO,KAAK,YAAY;gBACjD,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,CAAC,SAAS,EAAE,qCAAqC,EAAE;gBAC5D,uBAAuB,EAAE,OAAO,KAAK,YAAY;gBACjD,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,CAAC,aAAa,EAAE,wCAAwC,EAAE;YACnE,uBAAuB,EAAE,OAAO,KAAK,YAAY;YACjD,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,IAAI,MAAM,YAAY,mBAAmB;YAAE,MAAM,MAAM,CAAC;QACxD,MAAM,KAAK,CAAC,aAAa,EAAE,+CAA+C,EAAE;YAC1E,uBAAuB,EAAE,OAAO,KAAK,YAAY;YACjD,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,CAAC,kBAAkB,EAAE,2CAA2C,EAAE;YAC3E,uBAAuB,EAAE,OAAO,KAAK,YAAY;YACjD,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,kBAAkB,EAAE,mDAAmD,EAAE;YACnF,uBAAuB,EAAE,OAAO,KAAK,YAAY;YACjD,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAA2B;IACtE,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,MAAoB;YACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;YACtF,OAAO,IAAI;iBACR,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC;iBACtC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM;YAClC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CACxC,MAAM,EACN,YAAY,EACZ,EAAE,EACF,eAAe,EACf,MAAM,CACP,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YAC/D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBAC/C,MAAM,KAAK,CAAC,eAAe,EAAE,wDAAwD,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjD,WAAW,CACT,MAAM,EACN,wBAAwB,EACxB;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS;wBACtC,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;iBAC3C,EACD,oBAAoB,EACpB,MAAM,CACP;gBACD,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC;gBAC7E,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC;aAC5E,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC7C,MAAM,KAAK,CAAC,kBAAkB,EAAE,wDAAwD,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,wBAAwB,CAAC;gBAC9B,MAAM,EAAE,KAAK;gBACb,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;gBACjC,YAAY,EAAE,GAAG,CAAC,kBAAkB,IAAI,IAAI;gBAC5C,aAAa,EACX,GAAG,CAAC,oBAAoB,KAAK,SAAS;oBACpC,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,GAAG,CAAC,oBAAoB,KAAK,IAAI,IAAI,GAAG,CAAC,oBAAoB,KAAK,KAAK;gBAC7E,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACnC,sBAAsB,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;gBAC1F,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC1B,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;aACtD,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,OAAe,EAAE,MAAoB;YACpE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CACrC,MAAM,EACN,YAAY,EACZ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EACnC,wBAAwB,EACxB,MAAM,CACP,CAAC;YACF,OAAO,EAAE,QAAQ,EAAE,IAAa,EAAE,SAAS,EAAE,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+ declare const healthSchema: z.ZodObject<{
3
+ ok: z.ZodBoolean;
4
+ isBusy: z.ZodBoolean;
5
+ }, z.core.$loose>;
6
+ declare const agentSchema: z.ZodObject<{
7
+ id: z.ZodString;
8
+ name: z.ZodString;
9
+ isGroup: z.ZodBoolean;
10
+ isRunning: z.ZodOptional<z.ZodBoolean>;
11
+ isComposingMessage: z.ZodOptional<z.ZodBoolean>;
12
+ awaitingUserResponse: z.ZodOptional<z.ZodUnknown>;
13
+ lastMessageId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
14
+ newestEntryId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
15
+ }, z.core.$loose>;
16
+ declare const transcriptTailInputSchema: z.ZodObject<{
17
+ id: z.ZodString;
18
+ limit: z.ZodNumber;
19
+ beforeSeq: z.ZodOptional<z.ZodNumber>;
20
+ }, z.core.$strict>;
21
+ declare const transcriptTailSchema: z.ZodObject<{
22
+ entries: z.ZodArray<z.ZodUnknown>;
23
+ nextBeforeSeq: z.ZodOptional<z.ZodNumber>;
24
+ }, z.core.$loose>;
25
+ declare const asyncTaskSchema: z.ZodObject<{
26
+ kind: z.ZodEnum<{
27
+ "cloud-agent": "cloud-agent";
28
+ shell: "shell";
29
+ subagent: "subagent";
30
+ }>;
31
+ id: z.ZodString;
32
+ label: z.ZodString;
33
+ status: z.ZodLiteral<"running">;
34
+ startedAtMs: z.ZodNumber;
35
+ detail: z.ZodOptional<z.ZodString>;
36
+ subagentType: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$loose>;
38
+ declare const subagentSchema: z.ZodObject<{
39
+ subagentId: z.ZodString;
40
+ subagentType: z.ZodString;
41
+ title: z.ZodString;
42
+ status: z.ZodString;
43
+ startedAtMs: z.ZodNumber;
44
+ }, z.core.$loose>;
45
+ export type LocalGatewayDiscovery = {
46
+ port: number;
47
+ pid: number;
48
+ hasToken: boolean;
49
+ };
50
+ export type LocalGatewayHealth = z.infer<typeof healthSchema>;
51
+ export type LocalAgentSummary = z.infer<typeof agentSchema>;
52
+ export type LocalTranscriptTailInput = z.infer<typeof transcriptTailInputSchema>;
53
+ export type LocalTranscriptTail = z.infer<typeof transcriptTailSchema>;
54
+ export type LocalAsyncTask = z.infer<typeof asyncTaskSchema>;
55
+ export type LocalSubagent = z.infer<typeof subagentSchema>;
56
+ export type LocalSendPromptInput = {
57
+ agentId: string;
58
+ prompt: string;
59
+ clientNonce: string;
60
+ };
61
+ export type LocalGatewayErrorCode = "AUTH_FAILED" | "CONFIG_INVALID" | "GATEWAY_REJECTED" | "INVALID_RESPONSE" | "OUTPUT_LIMIT" | "RATE_LIMITED" | "TIMEOUT" | "UNAVAILABLE";
62
+ type ClientOptions = {
63
+ env?: NodeJS.ProcessEnv;
64
+ discoveryPath?: string;
65
+ fetch?: typeof fetch;
66
+ timeoutMs?: number;
67
+ verifyServer?: (pid: number, port: number, host: string, startedAt: number) => boolean;
68
+ };
69
+ export declare class LocalGatewayError extends Error {
70
+ readonly code: LocalGatewayErrorCode;
71
+ readonly status: number;
72
+ readonly requestId: string;
73
+ constructor(code: LocalGatewayErrorCode, status: number, requestId: string);
74
+ }
75
+ export declare class LocalGrokBotClient {
76
+ #private;
77
+ constructor(options?: ClientOptions);
78
+ discovery(): LocalGatewayDiscovery;
79
+ withGatewaySnapshot<T>(operation: () => Promise<T>): Promise<T>;
80
+ health(): Promise<LocalGatewayHealth>;
81
+ listAgents(): Promise<LocalAgentSummary[]>;
82
+ sendPrompt(input: LocalSendPromptInput): Promise<{
83
+ accepted: true;
84
+ }>;
85
+ getAgentTranscriptTail(input: LocalTranscriptTailInput): Promise<LocalTranscriptTail>;
86
+ getAsyncTasks(input: {
87
+ id: string;
88
+ }): Promise<LocalAsyncTask[]>;
89
+ getSubagents(input: {
90
+ id: string;
91
+ }): Promise<LocalSubagent[]>;
92
+ }
93
+ export {};