agentcorp-broker 0.1.0-alpha.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 (71) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/CONTRIBUTING.md +20 -0
  3. package/LICENSE +201 -0
  4. package/README.md +250 -0
  5. package/SECURITY.md +23 -0
  6. package/dist/audit.d.ts +25 -0
  7. package/dist/audit.js +203 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/broker.d.ts +103 -0
  10. package/dist/broker.js +805 -0
  11. package/dist/broker.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.js +712 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +3 -0
  16. package/dist/config.js +41 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/console/console.css +794 -0
  19. package/dist/console/console.js +802 -0
  20. package/dist/console/index.html +309 -0
  21. package/dist/credentials.d.ts +16 -0
  22. package/dist/credentials.js +72 -0
  23. package/dist/credentials.js.map +1 -0
  24. package/dist/database.d.ts +119 -0
  25. package/dist/database.js +1356 -0
  26. package/dist/database.js.map +1 -0
  27. package/dist/diagnostics.d.ts +44 -0
  28. package/dist/diagnostics.js +357 -0
  29. package/dist/diagnostics.js.map +1 -0
  30. package/dist/errors.d.ts +5 -0
  31. package/dist/errors.js +14 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.d.ts +23 -0
  34. package/dist/index.js +15 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/mcp.d.ts +3 -0
  37. package/dist/mcp.js +215 -0
  38. package/dist/mcp.js.map +1 -0
  39. package/dist/migrations.d.ts +13 -0
  40. package/dist/migrations.js +266 -0
  41. package/dist/migrations.js.map +1 -0
  42. package/dist/policy.d.ts +22 -0
  43. package/dist/policy.js +33 -0
  44. package/dist/policy.js.map +1 -0
  45. package/dist/server.d.ts +49 -0
  46. package/dist/server.js +529 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/stdio-adapter.d.ts +230 -0
  49. package/dist/stdio-adapter.js +406 -0
  50. package/dist/stdio-adapter.js.map +1 -0
  51. package/dist/tui.d.ts +26 -0
  52. package/dist/tui.js +291 -0
  53. package/dist/tui.js.map +1 -0
  54. package/dist/types.d.ts +355 -0
  55. package/dist/types.js +85 -0
  56. package/dist/types.js.map +1 -0
  57. package/docs/ARCHITECTURE.md +119 -0
  58. package/docs/README.md +37 -0
  59. package/docs/RELEASING.md +228 -0
  60. package/docs/ROADMAP.md +112 -0
  61. package/docs/cli-reference.md +133 -0
  62. package/docs/dogfooding-report.md +83 -0
  63. package/docs/getting-started.md +228 -0
  64. package/docs/guides/antigravity-setup.md +84 -0
  65. package/docs/guides/claude-cursor-setup.md +76 -0
  66. package/docs/guides/codex-setup.md +75 -0
  67. package/docs/guides/human-console.md +177 -0
  68. package/docs/mcp-tools-reference.md +235 -0
  69. package/docs/policy-guide.md +105 -0
  70. package/examples/org.toml +65 -0
  71. package/package.json +68 -0
@@ -0,0 +1,230 @@
1
+ import { Client } from "@modelcontextprotocol/client";
2
+ import { Server } from "@modelcontextprotocol/server";
3
+ import { type DaemonInfo } from "./server.js";
4
+ export interface StdioAdapterOptions {
5
+ role: string;
6
+ configPath?: string | undefined;
7
+ dbPath?: string | undefined;
8
+ credentialsPath?: string | undefined;
9
+ daemonFilePath?: string | undefined;
10
+ noSpawn?: boolean | undefined;
11
+ daemonUrl?: string | undefined;
12
+ }
13
+ export declare const MUTATION_TOOLS: Set<string>;
14
+ export declare function isRetryableTransportError(err: unknown): boolean;
15
+ export declare function resolveDefaultPath(options: {
16
+ configPath?: string | undefined;
17
+ dbPath?: string | undefined;
18
+ }, fileName: string): string;
19
+ export declare function isDaemonHealthy(url: string): Promise<boolean>;
20
+ export declare function ensureDaemonRunning(options: {
21
+ configPath?: string | undefined;
22
+ dbPath?: string | undefined;
23
+ credentialsPath?: string | undefined;
24
+ daemonFilePath?: string | undefined;
25
+ noSpawn?: boolean | undefined;
26
+ port?: number | string | undefined;
27
+ }): Promise<DaemonInfo>;
28
+ export declare class ResilientDaemonClient {
29
+ readonly options: StdioAdapterOptions;
30
+ readonly roleToken: string;
31
+ private client;
32
+ private transport;
33
+ private currentUrl;
34
+ constructor(options: StdioAdapterOptions, roleToken: string);
35
+ get currentClient(): Client | null;
36
+ getOrConnect(): Promise<Client>;
37
+ reconnect(): Promise<Client>;
38
+ executeWithRetry<T>(fn: (client: Client) => Promise<T>): Promise<T>;
39
+ listTools(): Promise<{
40
+ [x: string]: unknown;
41
+ _meta?: {
42
+ [x: string]: unknown;
43
+ "io.modelcontextprotocol/serverInfo"?: {
44
+ version: string;
45
+ websiteUrl?: string | undefined;
46
+ description?: string | undefined;
47
+ icons?: {
48
+ src: string;
49
+ mimeType?: string | undefined;
50
+ sizes?: string[] | undefined;
51
+ theme?: "dark" | "light" | undefined;
52
+ }[] | undefined;
53
+ name: string;
54
+ title?: string | undefined;
55
+ } | undefined;
56
+ } | undefined;
57
+ nextCursor?: string | undefined;
58
+ tools: {
59
+ description?: string | undefined;
60
+ inputSchema: {
61
+ [x: string]: unknown;
62
+ type: "object";
63
+ properties?: {
64
+ [x: string]: string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | (string | number | boolean | /*elided*/ any | {
65
+ [x: string]: string | number | boolean | /*elided*/ any | /*elided*/ any | null;
66
+ } | null)[] | {
67
+ [x: string]: string | number | boolean | any | any | null;
68
+ } | null)[] | {
69
+ [x: string]: string | number | boolean | any | any | null;
70
+ } | null)[] | {
71
+ [x: string]: string | number | boolean | any | any | null;
72
+ } | null)[] | {
73
+ [x: string]: string | number | boolean | any | any | null;
74
+ } | null)[] | {
75
+ [x: string]: string | number | boolean | any | any | null;
76
+ } | null)[] | {
77
+ [x: string]: string | number | boolean | any | any | null;
78
+ } | null)[] | {
79
+ [x: string]: string | number | boolean | any | any | null;
80
+ } | null)[] | {
81
+ [x: string]: string | number | boolean | any | any | null;
82
+ } | null)[] | {
83
+ [x: string]: string | number | boolean | any | any | null;
84
+ } | null)[] | {
85
+ [x: string]: string | number | boolean | any | any | null;
86
+ } | null;
87
+ } | undefined;
88
+ required?: string[] | undefined;
89
+ };
90
+ outputSchema?: {
91
+ [x: string]: unknown;
92
+ $schema?: string | undefined;
93
+ } | undefined;
94
+ annotations?: {
95
+ title?: string | undefined;
96
+ readOnlyHint?: boolean | undefined;
97
+ destructiveHint?: boolean | undefined;
98
+ idempotentHint?: boolean | undefined;
99
+ openWorldHint?: boolean | undefined;
100
+ } | undefined;
101
+ execution?: {
102
+ taskSupport?: "forbidden" | "optional" | "required" | undefined;
103
+ } | undefined;
104
+ _meta?: {
105
+ [x: string]: unknown;
106
+ } | undefined;
107
+ icons?: {
108
+ src: string;
109
+ mimeType?: string | undefined;
110
+ sizes?: string[] | undefined;
111
+ theme?: "dark" | "light" | undefined;
112
+ }[] | undefined;
113
+ name: string;
114
+ title?: string | undefined;
115
+ }[];
116
+ }>;
117
+ callTool(params: {
118
+ name: string;
119
+ arguments?: Record<string, unknown>;
120
+ }): Promise<{
121
+ [x: string]: unknown;
122
+ _meta?: {
123
+ [x: string]: unknown;
124
+ "io.modelcontextprotocol/serverInfo"?: {
125
+ version: string;
126
+ websiteUrl?: string | undefined;
127
+ description?: string | undefined;
128
+ icons?: {
129
+ src: string;
130
+ mimeType?: string | undefined;
131
+ sizes?: string[] | undefined;
132
+ theme?: "dark" | "light" | undefined;
133
+ }[] | undefined;
134
+ name: string;
135
+ title?: string | undefined;
136
+ } | undefined;
137
+ } | undefined;
138
+ content: ({
139
+ type: "text";
140
+ text: string;
141
+ annotations?: {
142
+ audience?: ("assistant" | "user")[] | undefined;
143
+ priority?: number | undefined;
144
+ lastModified?: string | undefined;
145
+ } | undefined;
146
+ _meta?: {
147
+ [x: string]: unknown;
148
+ } | undefined;
149
+ } | {
150
+ type: "image";
151
+ data: string;
152
+ mimeType: string;
153
+ annotations?: {
154
+ audience?: ("assistant" | "user")[] | undefined;
155
+ priority?: number | undefined;
156
+ lastModified?: string | undefined;
157
+ } | undefined;
158
+ _meta?: {
159
+ [x: string]: unknown;
160
+ } | undefined;
161
+ } | {
162
+ type: "audio";
163
+ data: string;
164
+ mimeType: string;
165
+ annotations?: {
166
+ audience?: ("assistant" | "user")[] | undefined;
167
+ priority?: number | undefined;
168
+ lastModified?: string | undefined;
169
+ } | undefined;
170
+ _meta?: {
171
+ [x: string]: unknown;
172
+ } | undefined;
173
+ } | {
174
+ uri: string;
175
+ description?: string | undefined;
176
+ mimeType?: string | undefined;
177
+ size?: number | undefined;
178
+ annotations?: {
179
+ audience?: ("assistant" | "user")[] | undefined;
180
+ priority?: number | undefined;
181
+ lastModified?: string | undefined;
182
+ } | undefined;
183
+ _meta?: {
184
+ [x: string]: unknown;
185
+ } | undefined;
186
+ icons?: {
187
+ src: string;
188
+ mimeType?: string | undefined;
189
+ sizes?: string[] | undefined;
190
+ theme?: "dark" | "light" | undefined;
191
+ }[] | undefined;
192
+ name: string;
193
+ title?: string | undefined;
194
+ type: "resource_link";
195
+ } | {
196
+ type: "resource";
197
+ resource: {
198
+ uri: string;
199
+ mimeType?: string | undefined;
200
+ _meta?: {
201
+ [x: string]: unknown;
202
+ } | undefined;
203
+ text: string;
204
+ } | {
205
+ uri: string;
206
+ mimeType?: string | undefined;
207
+ _meta?: {
208
+ [x: string]: unknown;
209
+ } | undefined;
210
+ blob: string;
211
+ };
212
+ annotations?: {
213
+ audience?: ("assistant" | "user")[] | undefined;
214
+ priority?: number | undefined;
215
+ lastModified?: string | undefined;
216
+ } | undefined;
217
+ _meta?: {
218
+ [x: string]: unknown;
219
+ } | undefined;
220
+ })[];
221
+ structuredContent?: unknown;
222
+ isError?: boolean | undefined;
223
+ }>;
224
+ close(): Promise<void>;
225
+ }
226
+ export declare function createStdioProxy(options: StdioAdapterOptions): Promise<{
227
+ server: Server;
228
+ daemonClient: ResilientDaemonClient;
229
+ }>;
230
+ export declare function runStdioAdapter(options: StdioAdapterOptions): Promise<void>;
@@ -0,0 +1,406 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
+ import { dirname, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
7
+ import { Server } from "@modelcontextprotocol/server";
8
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
9
+ import { loadOrgConfig } from "./config.js";
10
+ import { ensureCredentials } from "./credentials.js";
11
+ import { AgentCorpError } from "./errors.js";
12
+ import { readDaemonInfo } from "./server.js";
13
+ export const MUTATION_TOOLS = new Set([
14
+ "create_task",
15
+ "send_message",
16
+ "accept_handoff",
17
+ "create_artifact",
18
+ "update_task_status",
19
+ ]);
20
+ export function isRetryableTransportError(err) {
21
+ if (!err)
22
+ return false;
23
+ const msg = String(err);
24
+ if (msg.includes("fetch failed") ||
25
+ msg.includes("ECONNREFUSED") ||
26
+ msg.includes("ECONNRESET") ||
27
+ msg.includes("ETIMEDOUT") ||
28
+ msg.includes("ENOTFOUND") ||
29
+ msg.includes("EPIPE") ||
30
+ msg.includes("UND_ERR")) {
31
+ return true;
32
+ }
33
+ if (typeof err === "object" && err !== null) {
34
+ if (err instanceof Error && err.name === "TypeError" && err.message.includes("fetch"))
35
+ return true;
36
+ const anyErr = err;
37
+ const code = anyErr.code ?? anyErr.cause?.code;
38
+ if (typeof code === "string" &&
39
+ ["ECONNREFUSED", "ECONNRESET", "ETIMEDOUT", "ENOTFOUND", "EPIPE"].includes(code)) {
40
+ return true;
41
+ }
42
+ const status = anyErr.status ?? anyErr.cause?.status;
43
+ if (typeof status === "number" && [502, 503, 504].includes(status)) {
44
+ return true;
45
+ }
46
+ }
47
+ return false;
48
+ }
49
+ export function resolveDefaultPath(options, fileName) {
50
+ if (options.configPath) {
51
+ return resolve(dirname(resolve(options.configPath)), ".agentcorp", fileName);
52
+ }
53
+ if (options.dbPath) {
54
+ return resolve(dirname(resolve(options.dbPath)), fileName);
55
+ }
56
+ return resolve(".agentcorp", fileName);
57
+ }
58
+ function resolveCliPath() {
59
+ try {
60
+ const currentDir = dirname(fileURLToPath(import.meta.url));
61
+ const candidateJs = resolve(currentDir, "cli.js");
62
+ if (existsSync(candidateJs))
63
+ return candidateJs;
64
+ const rootDistJs = resolve(currentDir, "..", "dist", "cli.js");
65
+ if (existsSync(rootDistJs))
66
+ return rootDistJs;
67
+ }
68
+ catch {
69
+ // Fallback if import.meta.url is unusual
70
+ }
71
+ const rootDist = resolve("dist/cli.js");
72
+ if (existsSync(rootDist))
73
+ return rootDist;
74
+ if (process.argv[1] && existsSync(process.argv[1]) && process.argv[1].endsWith(".js")) {
75
+ return resolve(process.argv[1]);
76
+ }
77
+ return rootDist;
78
+ }
79
+ export async function isDaemonHealthy(url) {
80
+ try {
81
+ const res = await fetch(`${url}/health`, { signal: AbortSignal.timeout(1000) });
82
+ return res.status === 200;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ const inFlightSpawns = new Map();
89
+ function isProcessAlive(pid) {
90
+ try {
91
+ process.kill(pid, 0);
92
+ return true;
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ }
98
+ async function acquireStartupLock(lockFilePath, daemonFilePath, maxWaitMs = 10000) {
99
+ const start = Date.now();
100
+ mkdirSync(dirname(lockFilePath), { recursive: true });
101
+ while (Date.now() - start < maxWaitMs) {
102
+ const current = readDaemonInfo(daemonFilePath);
103
+ if (current && (await isDaemonHealthy(current.url))) {
104
+ return null;
105
+ }
106
+ try {
107
+ const fd = openSync(lockFilePath, "wx");
108
+ const data = JSON.stringify({ pid: process.pid, createdAt: Date.now() });
109
+ writeFileSync(fd, data, "utf8");
110
+ closeSync(fd);
111
+ return () => {
112
+ try {
113
+ if (existsSync(lockFilePath)) {
114
+ unlinkSync(lockFilePath);
115
+ }
116
+ }
117
+ catch {
118
+ // Best effort
119
+ }
120
+ };
121
+ }
122
+ catch (err) {
123
+ if (err?.code === "EEXIST") {
124
+ let isStale = false;
125
+ try {
126
+ const raw = readFileSync(lockFilePath, "utf8");
127
+ const info = JSON.parse(raw);
128
+ const age = Date.now() - (info.createdAt ?? 0);
129
+ if (info.pid !== process.pid && (!isProcessAlive(info.pid) || age > 12000)) {
130
+ isStale = true;
131
+ }
132
+ }
133
+ catch {
134
+ isStale = true;
135
+ }
136
+ if (isStale) {
137
+ try {
138
+ unlinkSync(lockFilePath);
139
+ }
140
+ catch {
141
+ // Ignore race
142
+ }
143
+ continue;
144
+ }
145
+ await new Promise((r) => setTimeout(r, 100));
146
+ }
147
+ else {
148
+ throw err;
149
+ }
150
+ }
151
+ }
152
+ const current = readDaemonInfo(daemonFilePath);
153
+ if (current && (await isDaemonHealthy(current.url))) {
154
+ return null;
155
+ }
156
+ throw new AgentCorpError("DAEMON_SPAWN_FAILED", "Timed out waiting for concurrent daemon startup lock to be released.");
157
+ }
158
+ export async function ensureDaemonRunning(options) {
159
+ const resolvedDaemonFile = options.daemonFilePath
160
+ ? resolve(options.daemonFilePath)
161
+ : resolveDefaultPath(options, "daemon.json");
162
+ const resolvedDb = options.dbPath
163
+ ? resolve(options.dbPath)
164
+ : resolveDefaultPath(options, "agentcorp.db");
165
+ const resolvedCredentials = options.credentialsPath
166
+ ? resolve(options.credentialsPath)
167
+ : resolveDefaultPath(options, "credentials.json");
168
+ const resolvedConfig = options.configPath ? resolve(options.configPath) : undefined;
169
+ const daemonFilePath = resolvedDaemonFile;
170
+ const existing = readDaemonInfo(daemonFilePath);
171
+ if (existing && (await isDaemonHealthy(existing.url))) {
172
+ return existing;
173
+ }
174
+ if (options.noSpawn) {
175
+ throw new AgentCorpError("DAEMON_NOT_RUNNING", "AgentCorp daemon is not running. Start it with 'agentcorp start' or allow auto-spawn.");
176
+ }
177
+ const inFlight = inFlightSpawns.get(daemonFilePath);
178
+ if (inFlight) {
179
+ return inFlight;
180
+ }
181
+ const spawnPromise = (async () => {
182
+ const lockFilePath = `${daemonFilePath}.lock`;
183
+ const unlock = await acquireStartupLock(lockFilePath, daemonFilePath);
184
+ if (!unlock) {
185
+ const running = readDaemonInfo(daemonFilePath);
186
+ if (running && (await isDaemonHealthy(running.url))) {
187
+ return running;
188
+ }
189
+ }
190
+ try {
191
+ const afterLock = readDaemonInfo(daemonFilePath);
192
+ if (afterLock && (await isDaemonHealthy(afterLock.url))) {
193
+ return afterLock;
194
+ }
195
+ const cliPath = resolveCliPath();
196
+ const args = [
197
+ cliPath,
198
+ "start",
199
+ "--port",
200
+ options.port !== undefined ? String(options.port) : "0",
201
+ "--daemon-file",
202
+ resolvedDaemonFile,
203
+ "--db",
204
+ resolvedDb,
205
+ "--credentials",
206
+ resolvedCredentials,
207
+ ];
208
+ if (resolvedConfig) {
209
+ args.push("--config", resolvedConfig);
210
+ }
211
+ const spawnCwd = resolvedConfig ? dirname(resolvedConfig) : process.cwd();
212
+ const child = spawn(process.execPath, args, {
213
+ cwd: spawnCwd,
214
+ detached: true,
215
+ stdio: "ignore",
216
+ env: process.env,
217
+ });
218
+ child.unref();
219
+ // Wait for daemon to become healthy within 8 seconds
220
+ const start = Date.now();
221
+ while (Date.now() - start < 8000) {
222
+ await new Promise((r) => setTimeout(r, 150));
223
+ const info = readDaemonInfo(daemonFilePath);
224
+ if (info && (await isDaemonHealthy(info.url))) {
225
+ return info;
226
+ }
227
+ }
228
+ throw new AgentCorpError("DAEMON_SPAWN_FAILED", "Timed out waiting for AgentCorp daemon to start in the background.");
229
+ }
230
+ finally {
231
+ if (unlock) {
232
+ unlock();
233
+ }
234
+ }
235
+ })();
236
+ inFlightSpawns.set(daemonFilePath, spawnPromise);
237
+ try {
238
+ return await spawnPromise;
239
+ }
240
+ finally {
241
+ inFlightSpawns.delete(daemonFilePath);
242
+ }
243
+ }
244
+ export class ResilientDaemonClient {
245
+ options;
246
+ roleToken;
247
+ client = null;
248
+ transport = null;
249
+ currentUrl = null;
250
+ constructor(options, roleToken) {
251
+ this.options = options;
252
+ this.roleToken = roleToken;
253
+ }
254
+ get currentClient() {
255
+ return this.client;
256
+ }
257
+ async getOrConnect() {
258
+ if (this.client) {
259
+ return this.client;
260
+ }
261
+ return this.reconnect();
262
+ }
263
+ async reconnect() {
264
+ if (this.client) {
265
+ try {
266
+ await this.client.close();
267
+ }
268
+ catch {
269
+ // Ignore close errors during reconnection
270
+ }
271
+ this.client = null;
272
+ this.transport = null;
273
+ }
274
+ let daemonUrl = this.options.daemonUrl;
275
+ if (this.options.daemonFilePath) {
276
+ if (existsSync(this.options.daemonFilePath)) {
277
+ const info = readDaemonInfo(this.options.daemonFilePath);
278
+ if (info && (await isDaemonHealthy(info.url))) {
279
+ daemonUrl = info.url;
280
+ }
281
+ }
282
+ }
283
+ else if (!daemonUrl) {
284
+ const defaultDaemonPath = resolveDefaultPath(this.options, "daemon.json");
285
+ if (existsSync(defaultDaemonPath)) {
286
+ const info = readDaemonInfo(defaultDaemonPath);
287
+ if (info && (await isDaemonHealthy(info.url))) {
288
+ daemonUrl = info.url;
289
+ }
290
+ }
291
+ }
292
+ if (!daemonUrl || !(await isDaemonHealthy(daemonUrl))) {
293
+ const info = await ensureDaemonRunning({
294
+ configPath: this.options.configPath,
295
+ dbPath: this.options.dbPath,
296
+ credentialsPath: this.options.credentialsPath,
297
+ daemonFilePath: this.options.daemonFilePath,
298
+ noSpawn: this.options.noSpawn,
299
+ });
300
+ daemonUrl = info.url;
301
+ }
302
+ this.currentUrl = daemonUrl;
303
+ const transport = new StreamableHTTPClientTransport(new URL(`${daemonUrl}/mcp`), {
304
+ requestInit: {
305
+ headers: {
306
+ Authorization: `Bearer ${this.roleToken}`,
307
+ },
308
+ },
309
+ });
310
+ const client = new Client({
311
+ name: `agentcorp-proxy-${this.options.role}`,
312
+ version: "0.1.0",
313
+ });
314
+ await client.connect(transport);
315
+ this.client = client;
316
+ this.transport = transport;
317
+ return client;
318
+ }
319
+ async executeWithRetry(fn) {
320
+ let client = await this.getOrConnect();
321
+ try {
322
+ return await fn(client);
323
+ }
324
+ catch (err) {
325
+ if (!isRetryableTransportError(err)) {
326
+ throw err;
327
+ }
328
+ // Reconnection with bounded exponential backoff [100ms, 250ms, 500ms, 1000ms, 2000ms]
329
+ const backoffs = [100, 250, 500, 1000, 2000];
330
+ let lastErr = err;
331
+ for (const delay of backoffs) {
332
+ await new Promise((r) => setTimeout(r, delay));
333
+ try {
334
+ client = await this.reconnect();
335
+ return await fn(client);
336
+ }
337
+ catch (retryErr) {
338
+ lastErr = retryErr;
339
+ if (!isRetryableTransportError(retryErr)) {
340
+ throw retryErr;
341
+ }
342
+ }
343
+ }
344
+ throw lastErr;
345
+ }
346
+ }
347
+ async listTools() {
348
+ return this.executeWithRetry((c) => c.listTools());
349
+ }
350
+ async callTool(params) {
351
+ let callParams = params;
352
+ if (MUTATION_TOOLS.has(params.name)) {
353
+ const args = { ...(params.arguments ?? {}) };
354
+ if (!args.idempotency_key) {
355
+ args.idempotency_key = `synthetic_${randomUUID()}`;
356
+ }
357
+ callParams = { ...params, arguments: args };
358
+ }
359
+ return this.executeWithRetry((c) => c.callTool(callParams));
360
+ }
361
+ async close() {
362
+ if (this.client) {
363
+ try {
364
+ await this.client.close();
365
+ }
366
+ catch {
367
+ // Ignore close errors
368
+ }
369
+ this.client = null;
370
+ this.transport = null;
371
+ }
372
+ }
373
+ }
374
+ export async function createStdioProxy(options) {
375
+ const config = loadOrgConfig(options.configPath ?? "org.toml");
376
+ const credPath = options.credentialsPath ?? resolveDefaultPath(options, "credentials.json");
377
+ const creds = ensureCredentials(config, credPath);
378
+ const roleToken = creds.roleTokens[options.role];
379
+ if (!roleToken) {
380
+ throw new AgentCorpError("UNKNOWN_ROLE", `Role '${options.role}' not found in credentials`);
381
+ }
382
+ const resilientClient = new ResilientDaemonClient(options, roleToken);
383
+ await resilientClient.getOrConnect();
384
+ const server = new Server({ name: `agentcorp-${options.role}`, version: "0.1.0" }, { capabilities: { tools: {} } });
385
+ server.setRequestHandler("tools/list", async () => {
386
+ const result = await resilientClient.listTools();
387
+ return { tools: result.tools };
388
+ });
389
+ server.setRequestHandler("tools/call", async (request) => {
390
+ const params = request.params;
391
+ const result = await resilientClient.callTool({
392
+ name: params.name,
393
+ ...(params.arguments !== undefined ? { arguments: params.arguments } : {}),
394
+ });
395
+ return result;
396
+ });
397
+ return { server, daemonClient: resilientClient };
398
+ }
399
+ export async function runStdioAdapter(options) {
400
+ const { server } = await createStdioProxy(options);
401
+ console.error(`AgentCorp stdio proxy ready: role=${options.role}`);
402
+ await serveStdio(() => server, {
403
+ onerror: (err) => console.error(err),
404
+ });
405
+ }
406
+ //# sourceMappingURL=stdio-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-adapter.js","sourceRoot":"","sources":["../src/stdio-adapter.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type { AgentCorpBroker } from "./broker.js";
2
+ import type { PendingApproval } from "./types.js";
3
+ export interface TuiOptions {
4
+ daemonUrl?: string | undefined;
5
+ adminToken?: string | undefined;
6
+ broker?: AgentCorpBroker | undefined;
7
+ }
8
+ export declare class AgentCorpTui {
9
+ private readonly daemonUrl?;
10
+ private readonly adminToken?;
11
+ private readonly broker?;
12
+ constructor(options: TuiOptions);
13
+ fetchApprovals(): Promise<PendingApproval[]>;
14
+ private approve;
15
+ private reject;
16
+ printHeader(): void;
17
+ runReview(): Promise<{
18
+ approved: number;
19
+ rejected: number;
20
+ skipped: number;
21
+ }>;
22
+ runDashboard(): Promise<{
23
+ pendingCount: number;
24
+ tasksCount: number;
25
+ }>;
26
+ }