@hehanlin/open-agent-bridge 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +36 -0
  2. package/dist/adapters/acpAdapter.d.ts +45 -0
  3. package/dist/adapters/acpAdapter.js +171 -0
  4. package/dist/adapters/acpAdapter.js.map +1 -0
  5. package/dist/adapters/adapter.d.ts +50 -0
  6. package/dist/adapters/adapter.js +2 -0
  7. package/dist/adapters/adapter.js.map +1 -0
  8. package/dist/adapters/registry.d.ts +7 -0
  9. package/dist/adapters/registry.js +34 -0
  10. package/dist/adapters/registry.js.map +1 -0
  11. package/dist/agent/agentManager.d.ts +45 -0
  12. package/dist/agent/agentManager.js +110 -0
  13. package/dist/agent/agentManager.js.map +1 -0
  14. package/dist/cli.d.ts +13 -0
  15. package/dist/cli.js +178 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/config.d.ts +15 -0
  18. package/dist/config.js +39 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/detect/acpProbe.d.ts +5 -0
  21. package/dist/detect/acpProbe.js +61 -0
  22. package/dist/detect/acpProbe.js.map +1 -0
  23. package/dist/detect/frameworkDetector.d.ts +30 -0
  24. package/dist/detect/frameworkDetector.js +88 -0
  25. package/dist/detect/frameworkDetector.js.map +1 -0
  26. package/dist/frontier/frontierClient.d.ts +37 -0
  27. package/dist/frontier/frontierClient.js +103 -0
  28. package/dist/frontier/frontierClient.js.map +1 -0
  29. package/dist/frontier/frontierKey.d.ts +19 -0
  30. package/dist/frontier/frontierKey.js +45 -0
  31. package/dist/frontier/frontierKey.js.map +1 -0
  32. package/dist/frontier/health.d.ts +18 -0
  33. package/dist/frontier/health.js +29 -0
  34. package/dist/frontier/health.js.map +1 -0
  35. package/dist/frontier/watchdog.d.ts +23 -0
  36. package/dist/frontier/watchdog.js +47 -0
  37. package/dist/frontier/watchdog.js.map +1 -0
  38. package/dist/fsx/localFs.d.ts +15 -0
  39. package/dist/fsx/localFs.js +29 -0
  40. package/dist/fsx/localFs.js.map +1 -0
  41. package/dist/fsx/safePath.d.ts +1 -0
  42. package/dist/fsx/safePath.js +44 -0
  43. package/dist/fsx/safePath.js.map +1 -0
  44. package/dist/hub/asyncQueue.d.ts +6 -0
  45. package/dist/hub/asyncQueue.js +30 -0
  46. package/dist/hub/asyncQueue.js.map +1 -0
  47. package/dist/hub/hub.d.ts +55 -0
  48. package/dist/hub/hub.js +328 -0
  49. package/dist/hub/hub.js.map +1 -0
  50. package/dist/install/autostart.d.ts +20 -0
  51. package/dist/install/autostart.js +76 -0
  52. package/dist/install/autostart.js.map +1 -0
  53. package/dist/mock/mockRun.d.ts +9 -0
  54. package/dist/mock/mockRun.js +94 -0
  55. package/dist/mock/mockRun.js.map +1 -0
  56. package/dist/store/seq.d.ts +12 -0
  57. package/dist/store/seq.js +55 -0
  58. package/dist/store/seq.js.map +1 -0
  59. package/dist/store/store.d.ts +26 -0
  60. package/dist/store/store.js +88 -0
  61. package/dist/store/store.js.map +1 -0
  62. package/dist/types.d.ts +36 -0
  63. package/dist/types.js +9 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +32 -0
@@ -0,0 +1,328 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { OaError } from '../types.js';
3
+ import { AsyncQueue } from './asyncQueue.js';
4
+ export class Hub {
5
+ deps;
6
+ queue = new AsyncQueue();
7
+ runtimes = new Map();
8
+ cloudToAgent = new Map();
9
+ pendingPermissions = new Map();
10
+ busyApprovals = new Set();
11
+ now;
12
+ constructor(deps) {
13
+ this.deps = deps;
14
+ this.now = deps.now ?? Date.now;
15
+ }
16
+ start() {
17
+ this.deps.client.onFrame((msg) => {
18
+ void this.handleFrame(msg);
19
+ });
20
+ }
21
+ async handleFrame(msg) {
22
+ if (!('method' in msg)) {
23
+ this.handleResponse(msg);
24
+ return;
25
+ }
26
+ try {
27
+ switch (msg.method) {
28
+ case '_agent/create':
29
+ await this.respond(msg, this.deps.agents.handleCreate(paramsObject(msg)));
30
+ return;
31
+ case '_agent/update':
32
+ await this.respond(msg, this.deps.agents.handleUpdate(paramsObject(msg)));
33
+ return;
34
+ case '_agent/disconnect':
35
+ await this.respond(msg, this.deps.agents.handleDisconnect(paramsObject(msg)));
36
+ return;
37
+ case 'session/new':
38
+ await this.handleSessionNew(msg);
39
+ return;
40
+ case 'session/prompt':
41
+ await this.handleSessionPrompt(msg);
42
+ return;
43
+ case 'session/cancel':
44
+ await this.handleSessionCancel(msg);
45
+ return;
46
+ default:
47
+ if (msg.id !== undefined) {
48
+ this.sendError(msg.id, new OaError('E_AGENT_NOT_FOUND', `unknown method: ${msg.method}`));
49
+ }
50
+ }
51
+ }
52
+ catch (error) {
53
+ if (msg.id !== undefined) {
54
+ this.sendError(msg.id, error);
55
+ }
56
+ }
57
+ }
58
+ agentStatuses() {
59
+ return this.deps.agents.list().map((record) => ({ agentId: record.config.agentId, status: record.status }));
60
+ }
61
+ async stopAll() {
62
+ await Promise.all([...this.runtimes.values()].map((runtime) => runtime.adapter.stop('shutdown')));
63
+ this.runtimes.clear();
64
+ }
65
+ async handleSessionNew(msg) {
66
+ const params = paramsObject(msg);
67
+ const agentId = extractAgentId(params);
68
+ const record = this.requireAgent(agentId);
69
+ const cloudSessionId = stringParam(params, 'sessionId');
70
+ this.cloudToAgent.set(cloudSessionId, record.config.agentId);
71
+ this.sendResult(msg.id, {});
72
+ }
73
+ async handleSessionPrompt(msg) {
74
+ const params = paramsObject(msg);
75
+ const agentId = extractAgentId(params);
76
+ const record = this.requireAgent(agentId);
77
+ const cloudSessionId = stringParam(params, 'sessionId');
78
+ const turn = numberMeta(params, 'turn');
79
+ if (turn === undefined) {
80
+ throw new Error('session/prompt missing _meta.turn');
81
+ }
82
+ if (this.busyApprovals.has(cloudSessionId)) {
83
+ this.sendError(msg.id, new OaError('E_SESSION_BUSY'));
84
+ return;
85
+ }
86
+ await this.queue.run(cloudSessionId, async () => {
87
+ const result = await this.runPrompt(record, cloudSessionId, turn, promptBlocks(params));
88
+ this.sendResult(msg.id, result);
89
+ });
90
+ }
91
+ async handleSessionCancel(msg) {
92
+ const params = paramsObject(msg);
93
+ const agentId = extractAgentId(params) ?? this.cloudToAgent.get(stringParam(params, 'sessionId'));
94
+ const record = this.requireAgent(agentId);
95
+ const cloudSessionId = stringParam(params, 'sessionId');
96
+ const runtime = this.runtimes.get(record.config.agentId);
97
+ const acpSessionId = record.config.acpSessions[cloudSessionId];
98
+ if (runtime && acpSessionId) {
99
+ await runtime.adapter.sessionCancel({ sessionId: acpSessionId });
100
+ }
101
+ this.sendResult(msg.id, {});
102
+ }
103
+ async runPrompt(record, cloudSessionId, turn, prompt) {
104
+ const runtime = await this.ensureRuntime(record);
105
+ const acpSessionId = await this.ensureAcpSession(record, runtime, cloudSessionId);
106
+ const context = { agentId: record.config.agentId, cloudSessionId, turn, messageId: randomUUID() };
107
+ runtime.current = context;
108
+ try {
109
+ const result = await runtime.adapter.sessionPrompt({ sessionId: acpSessionId, prompt: await this.inlineImages(prompt) });
110
+ this.sendTurnEnded(context, result.stopReason);
111
+ return result;
112
+ }
113
+ catch (error) {
114
+ this.sendTurnEnded(context, 'error');
115
+ throw error;
116
+ }
117
+ finally {
118
+ runtime.current = undefined;
119
+ }
120
+ }
121
+ async ensureRuntime(record) {
122
+ const existing = this.runtimes.get(record.config.agentId);
123
+ if (existing) {
124
+ await existing.ready;
125
+ return existing;
126
+ }
127
+ const adapter = this.deps.adapterFactory(record.config.framework, { agentId: record.config.agentId, workspace: record.config.workspace });
128
+ const runtime = {
129
+ adapter,
130
+ ready: Promise.resolve()
131
+ };
132
+ adapter.onUpdate((update) => this.handleUpdate(runtime, update));
133
+ adapter.onAgentRequest((request) => this.handleAgentRequest(runtime, request));
134
+ adapter.onExit(() => {
135
+ this.runtimes.delete(record.config.agentId);
136
+ });
137
+ runtime.ready = (async () => {
138
+ await adapter.start();
139
+ await adapter.initialize();
140
+ })();
141
+ this.runtimes.set(record.config.agentId, runtime);
142
+ await runtime.ready;
143
+ return runtime;
144
+ }
145
+ async ensureAcpSession(record, runtime, cloudSessionId) {
146
+ const existing = record.config.acpSessions[cloudSessionId];
147
+ if (existing) {
148
+ try {
149
+ await runtime.adapter.sessionLoad({ sessionId: existing, cwd: record.config.workspace });
150
+ return existing;
151
+ }
152
+ catch {
153
+ delete record.config.acpSessions[cloudSessionId];
154
+ }
155
+ }
156
+ const created = await runtime.adapter.sessionNew({ cwd: record.config.workspace });
157
+ record.config.acpSessions[cloudSessionId] = created.acpSessionId;
158
+ await this.deps.store.writeAgentConfig(record.config.agentId, record.config);
159
+ this.cloudToAgent.set(cloudSessionId, record.config.agentId);
160
+ return created.acpSessionId;
161
+ }
162
+ handleUpdate(runtime, update) {
163
+ const context = runtime.current;
164
+ if (!context || update.sessionUpdate === 'metadata-warn') {
165
+ return;
166
+ }
167
+ this.sendSessionUpdate(context, stripOversize(update));
168
+ }
169
+ handleAgentRequest(runtime, request) {
170
+ const context = runtime.current;
171
+ if (!context || request.kind !== 'permission') {
172
+ request.respond(null);
173
+ return;
174
+ }
175
+ const id = `session/request_permission:${context.cloudSessionId}:${this.now()}:${randomUUID()}`;
176
+ this.busyApprovals.add(context.cloudSessionId);
177
+ const pending = { cloudSessionId: context.cloudSessionId, respond: request.respond };
178
+ pending.timer = setTimeout(() => {
179
+ this.pendingPermissions.delete(id);
180
+ this.busyApprovals.delete(context.cloudSessionId);
181
+ request.respond(null);
182
+ this.sendSessionUpdate(context, {
183
+ sessionUpdate: 'agent_message_chunk',
184
+ content: { type: 'text', text: '审批已超时' }
185
+ });
186
+ }, this.deps.config.approvalMaxMs);
187
+ pending.timer.unref?.();
188
+ this.pendingPermissions.set(id, pending);
189
+ this.deps.client.send({
190
+ jsonrpc: '2.0',
191
+ id,
192
+ method: 'session/request_permission',
193
+ params: { sessionId: context.cloudSessionId, toolCall: request.toolCall, options: request.options }
194
+ });
195
+ }
196
+ handleResponse(msg) {
197
+ const pending = this.pendingPermissions.get(msg.id);
198
+ if (!pending) {
199
+ return;
200
+ }
201
+ this.pendingPermissions.delete(msg.id);
202
+ if (pending.timer) {
203
+ clearTimeout(pending.timer);
204
+ }
205
+ this.busyApprovals.delete(pending.cloudSessionId);
206
+ const result = msg.result;
207
+ pending.respond(result?.outcome?.optionId ?? null);
208
+ }
209
+ sendSessionUpdate(context, update) {
210
+ const meta = {
211
+ agentId: context.agentId,
212
+ cloud_session_id: context.cloudSessionId,
213
+ turn: context.turn,
214
+ seq: this.deps.seq.next(context.cloudSessionId, context.turn)
215
+ };
216
+ if (update.sessionUpdate === 'agent_message_chunk' || update.sessionUpdate === 'agent_thought_chunk') {
217
+ meta.messageId = context.messageId;
218
+ }
219
+ try {
220
+ this.deps.client.send({
221
+ jsonrpc: '2.0',
222
+ method: 'session/update',
223
+ params: { sessionId: context.cloudSessionId, update, _meta: meta }
224
+ });
225
+ }
226
+ catch (error) {
227
+ if (!(error instanceof OaError && error.code === 'E_FRAME_TOO_LARGE')) {
228
+ throw error;
229
+ }
230
+ }
231
+ }
232
+ sendTurnEnded(context, stopReason) {
233
+ this.sendSessionUpdate(context, { sessionUpdate: 'turn_ended', stopReason });
234
+ }
235
+ requireAgent(agentId) {
236
+ if (!agentId) {
237
+ throw new OaError('E_AGENT_NOT_FOUND');
238
+ }
239
+ const record = this.deps.agents.get(agentId);
240
+ if (!record) {
241
+ throw new OaError('E_AGENT_NOT_FOUND');
242
+ }
243
+ if (record.config.disconnectedAt !== undefined) {
244
+ throw new OaError('E_AGENT_DISCONNECTED');
245
+ }
246
+ return record;
247
+ }
248
+ async respond(msg, promise) {
249
+ this.sendResult(msg.id, await promise);
250
+ }
251
+ sendResult(id, result) {
252
+ if (id === undefined) {
253
+ return;
254
+ }
255
+ this.deps.client.send({ jsonrpc: '2.0', id, result });
256
+ }
257
+ sendError(id, error) {
258
+ if (id === undefined) {
259
+ return;
260
+ }
261
+ const message = error instanceof OaError ? error.code : error instanceof Error ? error.message : 'UNKNOWN';
262
+ const data = error instanceof OaError ? undefined : error;
263
+ this.deps.client.send({ jsonrpc: '2.0', id, error: { code: -32000, message, data } });
264
+ }
265
+ async inlineImages(prompt) {
266
+ return Promise.all(prompt.map(async (block) => {
267
+ if (block.type !== 'image' || typeof block.uri !== 'string') {
268
+ return block;
269
+ }
270
+ try {
271
+ const response = await this.deps.fetchImpl(block.uri);
272
+ const contentType = response.headers.get('content-type') ?? 'application/octet-stream';
273
+ const data = Buffer.from(await response.arrayBuffer()).toString('base64');
274
+ return { ...block, uri: undefined, data, mimeType: contentType };
275
+ }
276
+ catch {
277
+ return { type: 'text', text: `[image unavailable: ${block.uri}]` };
278
+ }
279
+ }));
280
+ }
281
+ }
282
+ function paramsObject(msg) {
283
+ return (msg.params ?? {});
284
+ }
285
+ function extractAgentId(params) {
286
+ const meta = params._meta;
287
+ return typeof meta?.agentId === 'string' ? meta.agentId : typeof params.agentId === 'string' ? params.agentId : undefined;
288
+ }
289
+ function stringParam(params, key) {
290
+ const value = params[key];
291
+ if (typeof value !== 'string') {
292
+ throw new Error(`missing string param: ${key}`);
293
+ }
294
+ return value;
295
+ }
296
+ function numberMeta(params, key) {
297
+ const meta = params._meta;
298
+ const value = meta?.[key];
299
+ return typeof value === 'number' ? value : undefined;
300
+ }
301
+ function promptBlocks(params) {
302
+ return Array.isArray(params.prompt) ? params.prompt : [];
303
+ }
304
+ function stripOversize(update) {
305
+ const cloned = JSON.parse(JSON.stringify(update));
306
+ for (const key of ['rawInput', 'rawOutput']) {
307
+ if (Object.hasOwn(cloned, key) && JSON.stringify(cloned[key]).length > 2048) {
308
+ cloned[key] = { _truncated: true };
309
+ }
310
+ }
311
+ return stripInlineImages(cloned);
312
+ }
313
+ function stripInlineImages(value) {
314
+ if (Array.isArray(value)) {
315
+ return value.map((item) => stripInlineImages(item));
316
+ }
317
+ if (typeof value === 'object' && value !== null) {
318
+ const obj = value;
319
+ if (obj.type === 'image' && typeof obj.data === 'string') {
320
+ return { type: 'text', text: '[image omitted]' };
321
+ }
322
+ for (const [key, child] of Object.entries(obj)) {
323
+ obj[key] = stripInlineImages(child);
324
+ }
325
+ }
326
+ return value;
327
+ }
328
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/hub/hub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare function renderLaunchdPlist(o: {
2
+ nodePath: string;
3
+ entryPath: string;
4
+ oaHome: string;
5
+ }): string;
6
+ export declare function renderSystemdUnit(o: {
7
+ execStart: string;
8
+ oaHome: string;
9
+ }): string;
10
+ export declare function installAutostart(deps: {
11
+ platform: NodeJS.Platform;
12
+ homedir: string;
13
+ writeFile: (p: string, c: string) => Promise<void>;
14
+ }, opts: {
15
+ dryRun: boolean;
16
+ }): Promise<{
17
+ path: string;
18
+ content: string;
19
+ hint: string;
20
+ }>;
@@ -0,0 +1,76 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ export function renderLaunchdPlist(o) {
4
+ return `<?xml version="1.0" encoding="UTF-8"?>
5
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
6
+ <plist version="1.0">
7
+ <dict>
8
+ <key>Label</key>
9
+ <string>com.openagent.open-agent-bridge</string>
10
+ <key>ProgramArguments</key>
11
+ <array>
12
+ <string>${escapeXml(o.nodePath)}</string>
13
+ <string>${escapeXml(o.entryPath)}</string>
14
+ </array>
15
+ <key>EnvironmentVariables</key>
16
+ <dict>
17
+ <key>OPEN_AGENT_BRIDGE_SUPERVISED</key>
18
+ <string>1</string>
19
+ </dict>
20
+ <key>KeepAlive</key>
21
+ <true/>
22
+ <key>RunAtLoad</key>
23
+ <true/>
24
+ <key>StandardOutPath</key>
25
+ <string>${escapeXml(join(o.oaHome, 'logs', 'daemon.out.log'))}</string>
26
+ <key>StandardErrorPath</key>
27
+ <string>${escapeXml(join(o.oaHome, 'logs', 'daemon.err.log'))}</string>
28
+ </dict>
29
+ </plist>
30
+ `;
31
+ }
32
+ export function renderSystemdUnit(o) {
33
+ return `[Unit]
34
+ Description=openAgent open-agent-bridge daemon
35
+ After=network-online.target
36
+
37
+ [Service]
38
+ Type=simple
39
+ Environment=OPEN_AGENT_BRIDGE_SUPERVISED=1
40
+ ExecStart=${o.execStart}
41
+ Restart=always
42
+ RestartSec=5
43
+ WorkingDirectory=${o.oaHome}
44
+ StandardOutput=append:${join(o.oaHome, 'logs', 'daemon.out.log')}
45
+ StandardError=append:${join(o.oaHome, 'logs', 'daemon.err.log')}
46
+
47
+ [Install]
48
+ WantedBy=default.target
49
+ `;
50
+ }
51
+ export async function installAutostart(deps, opts) {
52
+ const oaHome = join(deps.homedir, '.open-agent-bridge');
53
+ const entryPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'cli.js');
54
+ const nodePath = process.execPath;
55
+ if (deps.platform === 'darwin') {
56
+ const path = join(deps.homedir, 'Library', 'LaunchAgents', 'com.openagent.open-agent-bridge.plist');
57
+ const content = renderLaunchdPlist({ nodePath, entryPath, oaHome });
58
+ if (!opts.dryRun) {
59
+ await deps.writeFile(path, content);
60
+ }
61
+ return { path, content, hint: `launchctl load ${path}` };
62
+ }
63
+ if (deps.platform === 'linux') {
64
+ const path = join(deps.homedir, '.config', 'systemd', 'user', 'open-agent-bridge.service');
65
+ const content = renderSystemdUnit({ execStart: `${nodePath} ${entryPath}`, oaHome });
66
+ if (!opts.dryRun) {
67
+ await deps.writeFile(path, content);
68
+ }
69
+ return { path, content, hint: 'systemctl --user enable --now open-agent-bridge.service' };
70
+ }
71
+ throw new Error(`autostart on ${deps.platform} is not supported yet`);
72
+ }
73
+ function escapeXml(value) {
74
+ return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;');
75
+ }
76
+ //# sourceMappingURL=autostart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autostart.js","sourceRoot":"","sources":["../../src/install/autostart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAAC,CAA0D;IAC3F,OAAO;;;;;;;;cAQK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;cACrB,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;;;;;;;;;;;;YAYxB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;;YAEnD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;;;CAG9D,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAwC;IACxE,OAAO;;;;;;;YAOG,CAAC,CAAC,SAAS;;;mBAGJ,CAAC,CAAC,MAAM;wBACH,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC;uBACzC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC;;;;CAI9D,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAwG,EACxG,IAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAElC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,uCAAuC,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,IAAI,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAC3F,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,yDAAyD,EAAE,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,QAAQ,uBAAuB,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAClH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { JsonRpcRequest, JsonRpcResponse } from '../types.js';
2
+ export interface MockRunResult {
3
+ oaHome: string;
4
+ sent: Array<JsonRpcRequest | JsonRpcResponse>;
5
+ }
6
+ export declare function runMock(opts?: {
7
+ writeLine?: (line: string) => void;
8
+ oaHome?: string;
9
+ }): Promise<MockRunResult>;
@@ -0,0 +1,94 @@
1
+ import { mkdtemp } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { AgentManager } from '../agent/agentManager.js';
5
+ import { loadConfig } from '../config.js';
6
+ import { Hub } from '../hub/hub.js';
7
+ import { SeqAllocator } from '../store/seq.js';
8
+ import { Store } from '../store/store.js';
9
+ export async function runMock(opts = {}) {
10
+ const writeLine = opts.writeLine ?? console.log;
11
+ const oaHome = opts.oaHome ?? (await mkdtemp(join(tmpdir(), 'open-agent-bridge-mock-')));
12
+ const store = new Store(oaHome);
13
+ const seq = new SeqAllocator(join(oaHome, 'seq'), 200);
14
+ const detector = { detect: async () => [{ name: 'codex', version: 'mock' }] };
15
+ const agents = new AgentManager({ store, detector });
16
+ const client = new MockFrontierClient(writeLine);
17
+ const hub = new Hub({
18
+ client,
19
+ agents,
20
+ store,
21
+ seq,
22
+ adapterFactory: () => new MockAdapter(),
23
+ fetchImpl: fetch,
24
+ config: loadConfig({ OA_HOME: oaHome }, []),
25
+ now: () => 1_000
26
+ });
27
+ const down = async (msg) => {
28
+ client.writeDown(msg);
29
+ await hub.handleFrame(msg);
30
+ };
31
+ await down({
32
+ jsonrpc: '2.0',
33
+ id: '_agent/create:mock-agent:1',
34
+ method: '_agent/create',
35
+ params: { agentId: 'mock-agent', framework: 'codex', name: 'Mock Agent' }
36
+ });
37
+ await down({
38
+ jsonrpc: '2.0',
39
+ id: 'session/new:mock-agent:1',
40
+ method: 'session/new',
41
+ params: { sessionId: 'mock-session', agentId: 'mock-agent', _meta: { agentId: 'mock-agent' } }
42
+ });
43
+ await down({
44
+ jsonrpc: '2.0',
45
+ id: 'session/prompt:mock-agent:1',
46
+ method: 'session/prompt',
47
+ params: {
48
+ sessionId: 'mock-session',
49
+ agentId: 'mock-agent',
50
+ prompt: [{ type: 'text', text: 'hello from mock' }],
51
+ _meta: { agentId: 'mock-agent', cloudSessionId: 'mock-session', turn: 1 }
52
+ }
53
+ });
54
+ await hub.stopAll();
55
+ writeLine(JSON.stringify({ direction: 'mock', event: 'complete', sentFrames: client.sent.length }));
56
+ return { oaHome, sent: client.sent };
57
+ }
58
+ class MockFrontierClient {
59
+ writeLine;
60
+ sent = [];
61
+ constructor(writeLine) {
62
+ this.writeLine = writeLine;
63
+ }
64
+ send(msg) {
65
+ this.sent.push(msg);
66
+ this.writeLine(JSON.stringify({ direction: 'up', msg }));
67
+ }
68
+ onFrame(_cb) { }
69
+ writeDown(msg) {
70
+ this.writeLine(JSON.stringify({ direction: 'down', msg }));
71
+ }
72
+ }
73
+ class MockAdapter {
74
+ updateCb;
75
+ async start() { }
76
+ async stop(_reason) { }
77
+ async initialize() { }
78
+ async sessionNew(_opts) {
79
+ return { acpSessionId: 'mock-acp-session' };
80
+ }
81
+ async sessionLoad(_opts) { }
82
+ async sessionPrompt(_opts) {
83
+ this.updateCb?.({ sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'mock hello' } });
84
+ this.updateCb?.({ sessionUpdate: 'tool_call', toolCallId: 'mock-tool', title: 'Mock tool', status: 'completed' });
85
+ return { stopReason: 'end_turn' };
86
+ }
87
+ async sessionCancel(_opts) { }
88
+ onUpdate(cb) {
89
+ this.updateCb = cb;
90
+ }
91
+ onAgentRequest(_cb) { }
92
+ onExit(_cb) { }
93
+ }
94
+ //# sourceMappingURL=mockRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockRun.js","sourceRoot":"","sources":["../../src/mock/mockRun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare class SeqAllocator {
2
+ private readonly seqDir;
3
+ private readonly states;
4
+ private readonly blockSize;
5
+ constructor(seqDir: string, blockSize?: number);
6
+ next(sid: string, turn: number): number;
7
+ flush(): Promise<void>;
8
+ private loadState;
9
+ private persistReservedHigh;
10
+ private fileForKey;
11
+ private key;
12
+ }
@@ -0,0 +1,55 @@
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export class SeqAllocator {
4
+ seqDir;
5
+ states = new Map();
6
+ blockSize;
7
+ constructor(seqDir, blockSize = 200) {
8
+ this.seqDir = seqDir;
9
+ this.blockSize = blockSize;
10
+ mkdirSync(seqDir, { recursive: true, mode: 0o700 });
11
+ }
12
+ next(sid, turn) {
13
+ const key = this.key(sid, turn);
14
+ const state = this.loadState(key);
15
+ if (state.nextValue > state.reservedHigh) {
16
+ state.reservedHigh += this.blockSize;
17
+ this.persistReservedHigh(key, state.reservedHigh);
18
+ }
19
+ const value = state.nextValue;
20
+ state.nextValue += 1;
21
+ return value;
22
+ }
23
+ async flush() {
24
+ // Reservations are persisted synchronously before next() returns.
25
+ }
26
+ loadState(key) {
27
+ const cached = this.states.get(key);
28
+ if (cached) {
29
+ return cached;
30
+ }
31
+ const file = this.fileForKey(key);
32
+ let reservedHigh = 0;
33
+ if (existsSync(file)) {
34
+ reservedHigh = Number(JSON.parse(readFileSync(file, 'utf8')).reservedHigh ?? 0);
35
+ }
36
+ const state = { nextValue: reservedHigh + 1, reservedHigh };
37
+ this.states.set(key, state);
38
+ return state;
39
+ }
40
+ persistReservedHigh(key, reservedHigh) {
41
+ const file = this.fileForKey(key);
42
+ const tmp = `${file}.tmp-${process.pid}-${Date.now()}`;
43
+ writeFileSync(tmp, `${JSON.stringify({ reservedHigh })}\n`, { mode: 0o600 });
44
+ chmodSync(tmp, 0o600);
45
+ renameSync(tmp, file);
46
+ chmodSync(file, 0o600);
47
+ }
48
+ fileForKey(key) {
49
+ return join(this.seqDir, `${key}.json`);
50
+ }
51
+ key(sid, turn) {
52
+ return `${encodeURIComponent(sid)}__${turn}`;
53
+ }
54
+ }
55
+ //# sourceMappingURL=seq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seq.js","sourceRoot":"","sources":["../../src/store/seq.ts"],"names":[],"mappings":"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"}