expo-agent-bridge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ export type AgentProfileName = 'antigravity' | 'claude-code' | 'cursor' | 'windsurf';
2
+ export interface AgentProfile {
3
+ name: AgentProfileName;
4
+ mcpConfigPath: string;
5
+ skillDirectory: string;
6
+ }
7
+ export type InitOptions = {
8
+ agent: AgentProfileName;
9
+ skillDirectory?: string;
10
+ mcpConfigPath?: string;
11
+ metroPort?: number;
12
+ mcp: boolean;
13
+ force: boolean;
14
+ };
15
+ export declare function runCli(args: string[], cwd?: string): void | Promise<void>;
16
+ export declare function runDirectCommand(command: string, args: string[], cwd: string): Promise<void>;
17
+ export declare function parseInitOptions(args: string[]): InitOptions;
18
+ export declare function runInit(cwd: string, options: InitOptions): void;
19
+ export declare function extractMetroPort(args: string[]): {
20
+ positional: string[];
21
+ metroPort?: number;
22
+ };
23
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAErF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AASD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,SAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhF;AAID,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBlG;AAOD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAsB5D;AAOD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAqC/D;AAmCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAiB7F"}
package/dist/cli.js ADDED
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runCli = runCli;
7
+ exports.runDirectCommand = runDirectCommand;
8
+ exports.parseInitOptions = parseInitOptions;
9
+ exports.runInit = runInit;
10
+ exports.extractMetroPort = extractMetroPort;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const server_1 = require("./server");
14
+ const client_1 = require("./client");
15
+ const AGENT_PROFILES = {
16
+ antigravity: { name: 'antigravity', mcpConfigPath: '.agents/mcp_config.json', skillDirectory: '.agents/skills' },
17
+ 'claude-code': { name: 'claude-code', mcpConfigPath: '.mcp.json', skillDirectory: '.claude/skills' },
18
+ cursor: { name: 'cursor', mcpConfigPath: '.cursor/mcp.json', skillDirectory: '.cursor/skills' },
19
+ windsurf: { name: 'windsurf', mcpConfigPath: '.windsurf/mcp_config.json', skillDirectory: '.windsurf/skills' },
20
+ };
21
+ function runCli(args, cwd = process.cwd()) {
22
+ const command = args[0] || 'mcp';
23
+ if (command === 'init') {
24
+ const initArgs = args.slice(1);
25
+ if (initArgs.includes('--help') || initArgs.includes('-h'))
26
+ printHelp();
27
+ else
28
+ runInit(cwd, parseInitOptions(initArgs));
29
+ }
30
+ else if (command === 'mcp' || command === 'start')
31
+ (0, server_1.startAgentBridgeMcpServer)({ metroPort: parseMetroPort(args.slice(1)) });
32
+ else if (DIRECT_COMMANDS.has(command))
33
+ return runDirectCommand(command, args.slice(1), cwd);
34
+ else
35
+ printHelp();
36
+ }
37
+ const DIRECT_COMMANDS = new Set(['screenshot', 'logs', 'reload', 'route', 'elements', 'state', 'reset-storage', 'dev-menu', 'navigate', 'tap', 'scroll', 'type-text']);
38
+ async function runDirectCommand(command, args, cwd) {
39
+ try {
40
+ const { positional, metroPort } = extractMetroPort(args);
41
+ const clientOptions = { metroPort };
42
+ if (command === 'screenshot') {
43
+ const output = path_1.default.resolve(cwd, positional[0] ?? 'expo-agent-screenshot.png');
44
+ (0, client_1.writeScreenshot)(await (0, client_1.sendBridgeCommand)('screenshot', {}, clientOptions), output);
45
+ console.log(output);
46
+ return;
47
+ }
48
+ if (command === 'reload') {
49
+ await (0, client_1.sendBridgeCommand)('reload', {}, clientOptions);
50
+ console.log('App reload triggered.');
51
+ return;
52
+ }
53
+ if (command === 'dev-menu') {
54
+ await (0, client_1.sendBridgeCommand)('open_dev_menu', {}, clientOptions);
55
+ console.log('Developer menu triggered.');
56
+ return;
57
+ }
58
+ if (command === 'navigate') {
59
+ const route = requiredArg(command, positional, 0);
60
+ await (0, client_1.sendBridgeCommand)('navigate', { route }, clientOptions);
61
+ console.log(`Navigated to ${route}`);
62
+ return;
63
+ }
64
+ if (command === 'tap') {
65
+ const target = requiredArg(command, positional, 0);
66
+ await (0, client_1.sendBridgeCommand)('tap', { target }, clientOptions);
67
+ console.log(`Tapped ${target}`);
68
+ return;
69
+ }
70
+ if (command === 'type-text') {
71
+ const target = requiredArg(command, positional, 0);
72
+ const text = requiredArg(command, positional, 1);
73
+ await (0, client_1.sendBridgeCommand)('type', { target, text }, clientOptions);
74
+ console.log(`Typed into ${target}`);
75
+ return;
76
+ }
77
+ if (command === 'scroll') {
78
+ const direction = requiredArg(command, positional, 0);
79
+ const amount = Number(positional[1] ?? 300);
80
+ await (0, client_1.sendBridgeCommand)('scroll', { direction, amount }, clientOptions);
81
+ console.log(`Scrolled ${direction} ${amount}px`);
82
+ return;
83
+ }
84
+ if (command === 'reset-storage') {
85
+ await (0, client_1.sendBridgeCommand)('reset_storage', {}, clientOptions);
86
+ console.log('AsyncStorage cleared.');
87
+ return;
88
+ }
89
+ const action = command === 'logs' ? 'get_logs' : command === 'route' ? 'get_route' : command === 'elements' ? 'get_elements' : 'get_state';
90
+ const result = await (0, client_1.sendBridgeCommand)(action, {}, clientOptions);
91
+ const key = action === 'get_route' ? 'route' : action === 'get_elements' ? 'elements' : action === 'get_state' ? 'state' : 'logs';
92
+ console.log(JSON.stringify(result[key] ?? result, null, 2));
93
+ }
94
+ catch (error) {
95
+ process.stderr.write(`[expo-agent-bridge] ${error.message}\n`);
96
+ process.exitCode = 1;
97
+ }
98
+ }
99
+ function requiredArg(command, args, index) {
100
+ if (!args[index])
101
+ throw new Error(`${command} requires argument ${index + 1}.`);
102
+ return args[index];
103
+ }
104
+ function parseInitOptions(args) {
105
+ const options = { agent: 'antigravity', force: false, mcp: true };
106
+ for (let index = 0; index < args.length; index += 1) {
107
+ const argument = args[index];
108
+ const next = () => {
109
+ const value = args[++index];
110
+ if (!value || value.startsWith('--'))
111
+ throw new Error(`${argument} requires a value.`);
112
+ return value;
113
+ };
114
+ if (argument === '--agent')
115
+ options.agent = validateAgent(next());
116
+ else if (argument.startsWith('--agent='))
117
+ options.agent = validateAgent(argument.slice('--agent='.length));
118
+ else if (argument === '--skills-dir')
119
+ options.skillDirectory = next();
120
+ else if (argument.startsWith('--skills-dir='))
121
+ options.skillDirectory = argument.slice('--skills-dir='.length);
122
+ else if (argument === '--mcp-config')
123
+ options.mcpConfigPath = next();
124
+ else if (argument.startsWith('--mcp-config='))
125
+ options.mcpConfigPath = argument.slice('--mcp-config='.length);
126
+ else if (argument === '--metro-port')
127
+ options.metroPort = parsePort(next());
128
+ else if (argument.startsWith('--metro-port='))
129
+ options.metroPort = parsePort(argument.slice('--metro-port='.length));
130
+ else if (argument === '--no-mcp')
131
+ options.mcp = false;
132
+ else if (argument === '--force')
133
+ options.force = true;
134
+ else
135
+ throw new Error(`Unknown init option: ${argument}`);
136
+ }
137
+ return options;
138
+ }
139
+ function validateAgent(agent) {
140
+ if (agent in AGENT_PROFILES)
141
+ return agent;
142
+ throw new Error(`Unsupported agent "${agent}". Choose one of: ${Object.keys(AGENT_PROFILES).join(', ')}.`);
143
+ }
144
+ function runInit(cwd, options) {
145
+ const profile = AGENT_PROFILES[options.agent];
146
+ const mcpConfigPath = resolveProjectPath(cwd, options.mcpConfigPath ?? profile.mcpConfigPath, '--mcp-config');
147
+ const skillDirectory = resolveProjectPath(cwd, options.skillDirectory ?? profile.skillDirectory, '--skills-dir');
148
+ console.log(`[expo-agent-bridge] Initializing for ${profile.name} in: ${cwd}`);
149
+ const config = readJsonObject(mcpConfigPath);
150
+ const mcpServers = isObject(config.mcpServers) ? config.mcpServers : {};
151
+ delete mcpServers['kuso-agent-bridge'];
152
+ delete mcpServers['khusoo-dev-bridge'];
153
+ if (options.mcp) {
154
+ const bridgeServer = {
155
+ command: 'npx',
156
+ args: ['--no-install', 'expo-agent-bridge', 'mcp'],
157
+ };
158
+ if (options.metroPort)
159
+ bridgeServer.env = { EXPO_METRO_PORT: String(options.metroPort) };
160
+ mcpServers['expo-agent-bridge'] = bridgeServer;
161
+ }
162
+ else {
163
+ delete mcpServers['expo-agent-bridge'];
164
+ }
165
+ if (Object.keys(mcpServers).length > 0) {
166
+ config.mcpServers = mcpServers;
167
+ writeFile(mcpConfigPath, JSON.stringify(config, null, 2) + '\n');
168
+ }
169
+ else if (fs_1.default.existsSync(mcpConfigPath)) {
170
+ fs_1.default.unlinkSync(mcpConfigPath);
171
+ }
172
+ console.log(`✓ ${options.mcp ? 'Configured' : 'Removed'} MCP bridge in ${displayProjectPath(cwd, mcpConfigPath)}`);
173
+ const skillPath = path_1.default.join(skillDirectory, 'expo-agent-bridge', 'SKILL.md');
174
+ if (fs_1.default.existsSync(skillPath) && !options.force) {
175
+ console.log(`• Kept existing ${displayProjectPath(cwd, skillPath)} (use --force to replace it)`);
176
+ }
177
+ else {
178
+ writeFile(skillPath, loadSkillTemplate());
179
+ console.log(`✓ Generated ${displayProjectPath(cwd, skillPath)}`);
180
+ }
181
+ console.log(`\nSuccess! expo-agent-bridge is configured for ${profile.name}.\n\nNext steps:\n1. Mount <AgentBridge /> only behind a __DEV__ lazy require in your root layout.\n2. If Expo is not already running, start it with 'npx expo start' (or '--tunnel' on WSL).\n3. Open the dev app on your phone or simulator.\n4. Try MCP first; if it is unavailable, use 'npx --no-install expo-agent-bridge screenshot /tmp/screen.png' or another direct CLI command.\n`);
182
+ }
183
+ function resolveProjectPath(cwd, input, flag) {
184
+ const resolved = path_1.default.resolve(cwd, input);
185
+ const relative = path_1.default.relative(cwd, resolved);
186
+ if (relative === '..' || relative.startsWith(`..${path_1.default.sep}`) || path_1.default.isAbsolute(relative)) {
187
+ throw new Error(`${flag} must stay inside the project directory.`);
188
+ }
189
+ return resolved;
190
+ }
191
+ function readJsonObject(file) {
192
+ if (!fs_1.default.existsSync(file))
193
+ return {};
194
+ try {
195
+ const parsed = JSON.parse(fs_1.default.readFileSync(file, 'utf8'));
196
+ if (!isObject(parsed))
197
+ throw new Error('Expected a JSON object.');
198
+ return parsed;
199
+ }
200
+ catch (error) {
201
+ throw new Error(`Could not read ${file}: ${error.message}`);
202
+ }
203
+ }
204
+ function isObject(value) {
205
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
206
+ }
207
+ function writeFile(file, content) {
208
+ fs_1.default.mkdirSync(path_1.default.dirname(file), { recursive: true });
209
+ fs_1.default.writeFileSync(file, content);
210
+ }
211
+ function displayProjectPath(cwd, file) {
212
+ return path_1.default.relative(cwd, file) || path_1.default.basename(file);
213
+ }
214
+ function extractMetroPort(args) {
215
+ const positional = [];
216
+ let metroPort;
217
+ for (let index = 0; index < args.length; index += 1) {
218
+ const argument = args[index];
219
+ const isSeparateFlag = argument === '--metro-port' || argument === '--port';
220
+ const isEqualsFlag = argument.startsWith('--metro-port=') || argument.startsWith('--port=');
221
+ if (!isSeparateFlag && !isEqualsFlag) {
222
+ positional.push(argument);
223
+ continue;
224
+ }
225
+ if (metroPort !== undefined)
226
+ throw new Error('Specify Metro port only once.');
227
+ const value = isSeparateFlag ? args[++index] : argument.slice(argument.indexOf('=') + 1);
228
+ if (!value || value.startsWith('--'))
229
+ throw new Error(`${argument} requires a value.`);
230
+ metroPort = parsePort(value);
231
+ }
232
+ return { positional, metroPort };
233
+ }
234
+ function parseMetroPort(args) {
235
+ return extractMetroPort(args).metroPort;
236
+ }
237
+ function parsePort(value) {
238
+ const port = Number(value);
239
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
240
+ throw new Error(`Invalid Metro port "${value}". Use a number from 1 to 65535.`);
241
+ return port;
242
+ }
243
+ function loadSkillTemplate() {
244
+ const templatePath = path_1.default.join(__dirname, '..', 'skills', 'expo-agent-bridge', 'SKILL.md');
245
+ return fs_1.default.existsSync(templatePath) ? fs_1.default.readFileSync(templatePath, 'utf8') : defaultSkillContent();
246
+ }
247
+ function printHelp() {
248
+ console.log(`\nexpo-agent-bridge CLI\n\nCommands:\n mcp [--metro-port <port>] Start the MCP stdio server (default port: 8081)\n init Configure MCP plus CLI fallback and the agent skill\n screenshot [file] Save a screenshot\n logs | route | elements | state\n reload | reset-storage | dev-menu\n navigate <route> | tap <testID> | scroll <up|down> [amount]\n type-text <testID> <text>\n\nDirect command options (accepted after the command in any position):\n --metro-port <port> Metro port for this app (alias: --port)\n\nInit options:\n --agent <name> antigravity (default), claude-code, cursor, or windsurf\n --skills-dir <path> Override the profile's skill directory\n --mcp-config <path> Override the profile's MCP configuration file\n --metro-port <port> Metro port for this app (use a unique port per app)\n --no-mcp Configure CLI only\n --force Replace an existing bridge SKILL.md\n\nExamples:\n npx expo-agent-bridge screenshot /tmp/screen.png --metro-port 8082\n npx expo-agent-bridge navigate /settings --metro-port=8082\n npx expo-agent-bridge init --metro-port 8082\n`);
249
+ }
250
+ function defaultSkillContent() {
251
+ return `---\nname: expo-agent-bridge\ndescription: Expo and React Native visual feedback and interaction bridge.\n---\n\n# Expo Agent Dev Bridge\n\nLive visual feedback and interactive UI loop for React Native & Expo apps.\n\n## Server Ownership\n\nAttach to an existing Expo/Metro server by default. Do not start or restart the server unless the developer explicitly asks.\n`;
252
+ }
253
+ if (require.main === module) {
254
+ try {
255
+ runCli(process.argv.slice(2));
256
+ }
257
+ catch (error) {
258
+ process.stderr.write(`[expo-agent-bridge] ${error.message}\n`);
259
+ process.exitCode = 1;
260
+ }
261
+ }
262
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type BridgeResponse = Record<string, any>;
2
+ export interface BridgeClientOptions {
3
+ metroPort?: number;
4
+ pluginName?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ /** Send one command to the already-running Expo DevTools bridge and exit. */
8
+ export declare function sendBridgeCommand(action: string, params?: Record<string, any>, options?: BridgeClientOptions): Promise<BridgeResponse>;
9
+ export declare function writeScreenshot(response: BridgeResponse, outputPath: string): void;
10
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,OAAO,GAAE,mBAAwB,2BA4CpH;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,QAG3E"}
package/dist/client.js ADDED
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.sendBridgeCommand = sendBridgeCommand;
7
+ exports.writeScreenshot = writeScreenshot;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ /** Send one command to the already-running Expo DevTools bridge and exit. */
10
+ function sendBridgeCommand(action, params = {}, options = {}) {
11
+ const port = options.metroPort ?? Number(process.env.EXPO_METRO_PORT ?? 8081);
12
+ const pluginName = options.pluginName ?? process.env.EXPO_AGENT_BRIDGE_PLUGIN ?? 'expo-agent-bridge';
13
+ const timeoutMs = options.timeoutMs ?? 30000;
14
+ return new Promise((resolve, reject) => {
15
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
16
+ const browserClientId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
17
+ const url = `ws://localhost:${port}/expo-dev-plugins/broadcast`;
18
+ let settled = false;
19
+ let socket;
20
+ const finish = (error, response) => {
21
+ if (settled)
22
+ return;
23
+ settled = true;
24
+ clearTimeout(timer);
25
+ try {
26
+ socket?.close();
27
+ }
28
+ catch { }
29
+ error ? reject(error) : resolve(response ?? {});
30
+ };
31
+ const timer = setTimeout(() => finish(new Error(`Timed out after ${timeoutMs / 1000}s waiting for the Expo app. Is Expo running and the dev app open?`)), timeoutMs);
32
+ try {
33
+ socket = new WebSocket(url);
34
+ socket.addEventListener('open', () => {
35
+ socket.send(JSON.stringify({ __isHandshakeMessages: true, protocolVersion: 1, pluginName, method: 'handshake', browserClientId }));
36
+ // Give the Expo app's DevTools client a moment to finish its handshake.
37
+ // One-shot CLI calls otherwise race the app listener; the original
38
+ // temporary clients avoided this with a short post-handshake delay.
39
+ setTimeout(() => {
40
+ if (!settled && socket?.readyState === WebSocket.OPEN) {
41
+ socket.send(JSON.stringify({ messageKey: { pluginName, method: 'command' }, payload: { id, action, ...params } }));
42
+ }
43
+ }, 250);
44
+ });
45
+ socket.addEventListener('message', (event) => {
46
+ let message;
47
+ try {
48
+ message = JSON.parse(typeof event.data === 'string' ? event.data : event.data.toString());
49
+ }
50
+ catch {
51
+ return;
52
+ }
53
+ if (message?.messageKey?.pluginName !== pluginName || message.messageKey.method !== 'result' || message.payload?.id !== id)
54
+ return;
55
+ if (message.payload.error)
56
+ finish(new Error(message.payload.error));
57
+ else
58
+ finish(undefined, message.payload);
59
+ });
60
+ socket.addEventListener('error', () => finish(new Error(`Cannot connect to Metro at ${url}. Make sure Expo is running.`)));
61
+ socket.addEventListener('close', () => { if (!settled)
62
+ finish(new Error('The Expo DevTools connection closed before the app responded.')); });
63
+ }
64
+ catch (error) {
65
+ finish(new Error(`Cannot connect to Metro at ${url}: ${error.message}`));
66
+ }
67
+ });
68
+ }
69
+ function writeScreenshot(response, outputPath) {
70
+ if (!response.data)
71
+ throw new Error('The app did not return screenshot data.');
72
+ fs_1.default.writeFileSync(outputPath, Buffer.from(response.data, 'base64'));
73
+ }
74
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { AgentBridge, AgentBridge as default, useAgentElement, registerElement, unregisterElement, PLUGIN_NAME, type ElementHandler, type LogEntry, type AgentBridgeProps, } from './DevAgentBridge';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,WAAW,IAAI,OAAO,EACtB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLUGIN_NAME = exports.unregisterElement = exports.registerElement = exports.useAgentElement = exports.default = exports.AgentBridge = void 0;
4
+ var DevAgentBridge_1 = require("./DevAgentBridge");
5
+ Object.defineProperty(exports, "AgentBridge", { enumerable: true, get: function () { return DevAgentBridge_1.AgentBridge; } });
6
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return DevAgentBridge_1.AgentBridge; } });
7
+ Object.defineProperty(exports, "useAgentElement", { enumerable: true, get: function () { return DevAgentBridge_1.useAgentElement; } });
8
+ Object.defineProperty(exports, "registerElement", { enumerable: true, get: function () { return DevAgentBridge_1.registerElement; } });
9
+ Object.defineProperty(exports, "unregisterElement", { enumerable: true, get: function () { return DevAgentBridge_1.unregisterElement; } });
10
+ Object.defineProperty(exports, "PLUGIN_NAME", { enumerable: true, get: function () { return DevAgentBridge_1.PLUGIN_NAME; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAU0B;AATxB,6GAAA,WAAW,OAAA;AACX,yGAAA,WAAW,OAAW;AACtB,iHAAA,eAAe,OAAA;AACf,iHAAA,eAAe,OAAA;AACf,mHAAA,iBAAiB,OAAA;AACjB,6GAAA,WAAW,OAAA"}
@@ -0,0 +1,7 @@
1
+ export interface ServerOptions {
2
+ pluginName?: string;
3
+ metroPort?: number;
4
+ commandTimeoutMs?: number;
5
+ }
6
+ export declare function startAgentBridgeMcpServer(options?: ServerOptions): void;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,aAAkB,QAqWpE"}