mirra-cc-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.
Files changed (50) hide show
  1. package/README.md +62 -0
  2. package/dist/cli.d.ts +8 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +213 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/configure.d.ts +13 -0
  7. package/dist/commands/configure.d.ts.map +1 -0
  8. package/dist/commands/configure.js +101 -0
  9. package/dist/commands/configure.js.map +1 -0
  10. package/dist/commands/hook.d.ts +15 -0
  11. package/dist/commands/hook.d.ts.map +1 -0
  12. package/dist/commands/hook.js +181 -0
  13. package/dist/commands/hook.js.map +1 -0
  14. package/dist/commands/index.d.ts +10 -0
  15. package/dist/commands/index.d.ts.map +1 -0
  16. package/dist/commands/index.js +19 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/register.d.ts +13 -0
  19. package/dist/commands/register.d.ts.map +1 -0
  20. package/dist/commands/register.js +383 -0
  21. package/dist/commands/register.js.map +1 -0
  22. package/dist/commands/setup-hooks.d.ts +8 -0
  23. package/dist/commands/setup-hooks.d.ts.map +1 -0
  24. package/dist/commands/setup-hooks.js +114 -0
  25. package/dist/commands/setup-hooks.js.map +1 -0
  26. package/dist/commands/start.d.ts +16 -0
  27. package/dist/commands/start.d.ts.map +1 -0
  28. package/dist/commands/start.js +168 -0
  29. package/dist/commands/start.js.map +1 -0
  30. package/dist/commands/status.d.ts +8 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +156 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/config.d.ts +37 -0
  35. package/dist/config.d.ts.map +1 -0
  36. package/dist/config.js +88 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +15 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +40 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/session-manager.d.ts +72 -0
  43. package/dist/session-manager.d.ts.map +1 -0
  44. package/dist/session-manager.js +315 -0
  45. package/dist/session-manager.js.map +1 -0
  46. package/dist/types.d.ts +76 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +6 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,uCAAwC;AAA/B,sGAAA,UAAU,OAAA;AACnB,iCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AACnB,+BAAoC;AAA3B,kGAAA,UAAU,OAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Register command - register this PC as a Mirra resource
3
+ */
4
+ interface RegisterOptions {
5
+ name?: string;
6
+ tunnel?: string;
7
+ }
8
+ /**
9
+ * Register this PC as a Mirra resource
10
+ */
11
+ export declare function registerPC(options: RegisterOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA6KD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+KxE"}
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ /**
3
+ * Register command - register this PC as a Mirra resource
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.registerPC = registerPC;
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const readline = __importStar(require("readline"));
45
+ const os = __importStar(require("os"));
46
+ const sdk_1 = require("@mirra-messenger/sdk");
47
+ const config_1 = require("../config");
48
+ /**
49
+ * Prompt for input
50
+ */
51
+ function prompt(question, defaultValue) {
52
+ const rl = readline.createInterface({
53
+ input: process.stdin,
54
+ output: process.stdout,
55
+ });
56
+ const displayQuestion = defaultValue
57
+ ? `${question} [${defaultValue}]: `
58
+ : `${question}: `;
59
+ return new Promise((resolve) => {
60
+ rl.question(displayQuestion, (answer) => {
61
+ rl.close();
62
+ resolve(answer || defaultValue || '');
63
+ });
64
+ });
65
+ }
66
+ /**
67
+ * Generate OpenAPI spec for the PC resource
68
+ */
69
+ function generateOpenAPISpec() {
70
+ return {
71
+ openapi: '3.0.0',
72
+ info: {
73
+ title: 'Mirra Claude Code Bridge',
74
+ version: '1.0.0',
75
+ description: 'Control Claude Code sessions on a local PC',
76
+ },
77
+ paths: {
78
+ '/sessions': {
79
+ get: {
80
+ operationId: 'listSessions',
81
+ summary: 'List active Claude Code sessions',
82
+ responses: {
83
+ '200': {
84
+ description: 'List of sessions',
85
+ content: {
86
+ 'application/json': {
87
+ schema: {
88
+ type: 'array',
89
+ items: { $ref: '#/components/schemas/Session' },
90
+ },
91
+ },
92
+ },
93
+ },
94
+ },
95
+ },
96
+ post: {
97
+ operationId: 'spawnSession',
98
+ summary: 'Spawn a new Claude Code session',
99
+ requestBody: {
100
+ content: {
101
+ 'application/json': {
102
+ schema: {
103
+ type: 'object',
104
+ required: ['initialPrompt', 'recipientId'],
105
+ properties: {
106
+ workingDir: { type: 'string' },
107
+ initialPrompt: { type: 'string' },
108
+ recipientId: { type: 'string' },
109
+ },
110
+ },
111
+ },
112
+ },
113
+ },
114
+ responses: {
115
+ '201': {
116
+ description: 'Session created',
117
+ content: {
118
+ 'application/json': {
119
+ schema: { $ref: '#/components/schemas/Session' },
120
+ },
121
+ },
122
+ },
123
+ },
124
+ },
125
+ },
126
+ '/sessions/{sessionId}': {
127
+ get: {
128
+ operationId: 'getSession',
129
+ summary: 'Get session details',
130
+ parameters: [
131
+ {
132
+ name: 'sessionId',
133
+ in: 'path',
134
+ required: true,
135
+ schema: { type: 'string' },
136
+ },
137
+ ],
138
+ responses: {
139
+ '200': {
140
+ description: 'Session details',
141
+ content: {
142
+ 'application/json': {
143
+ schema: { $ref: '#/components/schemas/Session' },
144
+ },
145
+ },
146
+ },
147
+ },
148
+ },
149
+ delete: {
150
+ operationId: 'killSession',
151
+ summary: 'Kill a session',
152
+ parameters: [
153
+ {
154
+ name: 'sessionId',
155
+ in: 'path',
156
+ required: true,
157
+ schema: { type: 'string' },
158
+ },
159
+ ],
160
+ responses: {
161
+ '200': { description: 'Session killed' },
162
+ },
163
+ },
164
+ },
165
+ '/sessions/{sessionId}/input': {
166
+ post: {
167
+ operationId: 'sendInput',
168
+ summary: 'Send input to a session',
169
+ parameters: [
170
+ {
171
+ name: 'sessionId',
172
+ in: 'path',
173
+ required: true,
174
+ schema: { type: 'string' },
175
+ },
176
+ ],
177
+ requestBody: {
178
+ content: {
179
+ 'application/json': {
180
+ schema: {
181
+ type: 'object',
182
+ required: ['input'],
183
+ properties: {
184
+ input: { type: 'string' },
185
+ },
186
+ },
187
+ },
188
+ },
189
+ },
190
+ responses: {
191
+ '200': { description: 'Input sent' },
192
+ },
193
+ },
194
+ },
195
+ },
196
+ components: {
197
+ schemas: {
198
+ Session: {
199
+ type: 'object',
200
+ properties: {
201
+ id: { type: 'string' },
202
+ workingDir: { type: 'string' },
203
+ status: {
204
+ type: 'string',
205
+ enum: ['starting', 'running', 'stopped', 'error'],
206
+ },
207
+ createdAt: { type: 'string', format: 'date-time' },
208
+ lastActivity: { type: 'string', format: 'date-time' },
209
+ },
210
+ },
211
+ },
212
+ },
213
+ };
214
+ }
215
+ /**
216
+ * Register this PC as a Mirra resource
217
+ */
218
+ async function registerPC(options) {
219
+ console.log(chalk_1.default.gray('\nRegistering PC as Mirra resource...\n'));
220
+ const config = (0, config_1.loadConfig)();
221
+ if (!config?.apiKey) {
222
+ throw new Error('Not configured. Run `mirra-cc-bridge configure` first.');
223
+ }
224
+ // Get PC name
225
+ const defaultName = `${os.hostname()} - Claude Code`;
226
+ const pcName = options.name || (await prompt('Name for this PC', defaultName));
227
+ // Get tunnel URL
228
+ console.log(chalk_1.default.gray('\nYou need a tunnel URL for the PC to be reachable.'));
229
+ console.log(chalk_1.default.gray(' Run: ngrok http 3847'));
230
+ console.log(chalk_1.default.gray(' Or use Cloudflare Tunnel\n'));
231
+ const tunnelUrl = await prompt('Enter your tunnel URL (e.g., https://abc123.ngrok.io)');
232
+ if (!tunnelUrl) {
233
+ throw new Error('Tunnel URL is required for registration');
234
+ }
235
+ // Validate URL format
236
+ if (!tunnelUrl.startsWith('http://') && !tunnelUrl.startsWith('https://')) {
237
+ throw new Error('Tunnel URL must start with http:// or https://');
238
+ }
239
+ console.log(chalk_1.default.gray('\nRegistering with Mirra...'));
240
+ const sdk = new sdk_1.MirraSDK({ apiKey: config.apiKey });
241
+ try {
242
+ // Check if already registered
243
+ if (config.pcResourceId) {
244
+ console.log(chalk_1.default.yellow('PC already registered. Updating...'));
245
+ // Update existing resource
246
+ await sdk.resources.update({
247
+ id: config.pcResourceId,
248
+ endpoint: {
249
+ baseUrl: tunnelUrl,
250
+ authentication: 'none', // The service will validate via other means
251
+ methods: [
252
+ {
253
+ name: 'spawnSession',
254
+ httpMethod: 'POST',
255
+ path: '/sessions',
256
+ description: 'Spawn a new Claude Code session',
257
+ parameters: {
258
+ workingDir: { type: 'string', required: false },
259
+ initialPrompt: { type: 'string', required: true },
260
+ recipientId: { type: 'string', required: true },
261
+ },
262
+ response: { type: 'object' },
263
+ },
264
+ {
265
+ name: 'sendInput',
266
+ httpMethod: 'POST',
267
+ path: '/sessions/{sessionId}/input',
268
+ description: 'Send input to a session',
269
+ parameters: {
270
+ sessionId: { type: 'string', required: true },
271
+ input: { type: 'string', required: true },
272
+ },
273
+ response: { type: 'object' },
274
+ },
275
+ {
276
+ name: 'killSession',
277
+ httpMethod: 'DELETE',
278
+ path: '/sessions/{sessionId}',
279
+ description: 'Kill a session',
280
+ parameters: {
281
+ sessionId: { type: 'string', required: true },
282
+ },
283
+ response: { type: 'object' },
284
+ },
285
+ {
286
+ name: 'listSessions',
287
+ httpMethod: 'GET',
288
+ path: '/sessions',
289
+ description: 'List active sessions',
290
+ parameters: {},
291
+ response: { type: 'array' },
292
+ },
293
+ ],
294
+ },
295
+ });
296
+ console.log(chalk_1.default.green('\n[+] PC resource updated'));
297
+ }
298
+ else {
299
+ // Create new resource
300
+ const resource = await sdk.resources.create({
301
+ name: pcName,
302
+ description: `Claude Code on ${os.hostname()}`,
303
+ resourceType: 'integration',
304
+ category: 'development',
305
+ isPrivate: true,
306
+ endpoint: {
307
+ baseUrl: tunnelUrl,
308
+ authentication: 'none',
309
+ methods: [
310
+ {
311
+ name: 'spawnSession',
312
+ httpMethod: 'POST',
313
+ path: '/sessions',
314
+ description: 'Spawn a new Claude Code session',
315
+ parameters: {
316
+ workingDir: { type: 'string', required: false },
317
+ initialPrompt: { type: 'string', required: true },
318
+ recipientId: { type: 'string', required: true },
319
+ },
320
+ response: { type: 'object' },
321
+ },
322
+ {
323
+ name: 'sendInput',
324
+ httpMethod: 'POST',
325
+ path: '/sessions/{sessionId}/input',
326
+ description: 'Send input to a session',
327
+ parameters: {
328
+ sessionId: { type: 'string', required: true },
329
+ input: { type: 'string', required: true },
330
+ },
331
+ response: { type: 'object' },
332
+ },
333
+ {
334
+ name: 'killSession',
335
+ httpMethod: 'DELETE',
336
+ path: '/sessions/{sessionId}',
337
+ description: 'Kill a session',
338
+ parameters: {
339
+ sessionId: { type: 'string', required: true },
340
+ },
341
+ response: { type: 'object' },
342
+ },
343
+ {
344
+ name: 'listSessions',
345
+ httpMethod: 'GET',
346
+ path: '/sessions',
347
+ description: 'List active sessions',
348
+ parameters: {},
349
+ response: { type: 'array' },
350
+ },
351
+ ],
352
+ },
353
+ pricing: { model: 'free' },
354
+ openApiSpec: generateOpenAPISpec(),
355
+ });
356
+ // Save resource ID
357
+ (0, config_1.setConfigValue)('pcResourceId', resource.id);
358
+ console.log(chalk_1.default.green('\n[+] PC registered'));
359
+ console.log(chalk_1.default.gray(` resource_id: ${resource.id}`));
360
+ }
361
+ // Install the resource for the user
362
+ console.log(chalk_1.default.gray('\nInstalling resource...'));
363
+ try {
364
+ await sdk.resources.install(config.pcResourceId || '');
365
+ console.log(chalk_1.default.green('[+] Resource installed'));
366
+ }
367
+ catch (e) {
368
+ if (e.message?.includes('already installed')) {
369
+ console.log(chalk_1.default.gray(' Already installed'));
370
+ }
371
+ else {
372
+ console.log(chalk_1.default.yellow(` Could not auto-install: ${e.message}`));
373
+ }
374
+ }
375
+ console.log(chalk_1.default.green('\n> Registration complete.'));
376
+ console.log(chalk_1.default.gray('\nRemote control enabled. Start the bridge with:'));
377
+ console.log(chalk_1.default.white(' mirra-cc-bridge start'));
378
+ }
379
+ catch (error) {
380
+ throw new Error(`Registration failed: ${error.message}`);
381
+ }
382
+ }
383
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Setup hooks command - configure Claude Code to send output to Mirra
3
+ */
4
+ /**
5
+ * Setup Claude Code hooks
6
+ */
7
+ export declare function setupHooks(): Promise<void>;
8
+ //# sourceMappingURL=setup-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-hooks.d.ts","sourceRoot":"","sources":["../../src/commands/setup-hooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgDH;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAmFhD"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ /**
3
+ * Setup hooks command - configure Claude Code to send output to Mirra
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.setupHooks = setupHooks;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const os_1 = require("os");
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const config_1 = require("../config");
15
+ const CLAUDE_CONFIG_DIR = (0, path_1.join)((0, os_1.homedir)(), '.claude');
16
+ const CLAUDE_SETTINGS_FILE = (0, path_1.join)(CLAUDE_CONFIG_DIR, 'settings.json');
17
+ const MIRRA_HOOKS = {
18
+ PostMessage: {
19
+ command: 'mirra-cc-bridge hook post-message',
20
+ },
21
+ PostToolUse: {
22
+ matcher: '.*',
23
+ command: 'mirra-cc-bridge hook post-tool',
24
+ },
25
+ Stop: {
26
+ command: 'mirra-cc-bridge hook stop',
27
+ },
28
+ };
29
+ /**
30
+ * Check if a hook already exists
31
+ */
32
+ function hookExists(hooks, command) {
33
+ if (!hooks)
34
+ return false;
35
+ return hooks.some((h) => h.command.includes('mirra-cc-bridge'));
36
+ }
37
+ /**
38
+ * Setup Claude Code hooks
39
+ */
40
+ async function setupHooks() {
41
+ console.log(chalk_1.default.gray('Setting up Claude Code hooks...\n'));
42
+ // Ensure Claude config directory exists
43
+ if (!(0, fs_1.existsSync)(CLAUDE_CONFIG_DIR)) {
44
+ console.log(chalk_1.default.yellow('Claude Code config directory not found. Creating...'));
45
+ (0, fs_1.mkdirSync)(CLAUDE_CONFIG_DIR, { recursive: true });
46
+ }
47
+ // Load existing settings or create new
48
+ let settings = {};
49
+ if ((0, fs_1.existsSync)(CLAUDE_SETTINGS_FILE)) {
50
+ try {
51
+ const content = (0, fs_1.readFileSync)(CLAUDE_SETTINGS_FILE, 'utf-8');
52
+ settings = JSON.parse(content);
53
+ console.log(chalk_1.default.gray('Loaded existing Claude Code settings'));
54
+ }
55
+ catch (error) {
56
+ console.log(chalk_1.default.yellow('Could not parse existing settings, starting fresh'));
57
+ }
58
+ }
59
+ // Initialize hooks object if it doesn't exist
60
+ if (!settings.hooks) {
61
+ settings.hooks = {};
62
+ }
63
+ let hooksAdded = 0;
64
+ // Add PostMessage hook
65
+ if (!hookExists(settings.hooks.PostMessage, 'mirra-cc-bridge')) {
66
+ settings.hooks.PostMessage = [
67
+ ...(settings.hooks.PostMessage || []),
68
+ MIRRA_HOOKS.PostMessage,
69
+ ];
70
+ console.log(chalk_1.default.green('[+]') + ' Added PostMessage hook');
71
+ hooksAdded++;
72
+ }
73
+ else {
74
+ console.log(chalk_1.default.gray('- PostMessage hook already exists'));
75
+ }
76
+ // Add PostToolUse hook
77
+ if (!hookExists(settings.hooks.PostToolUse, 'mirra-cc-bridge')) {
78
+ settings.hooks.PostToolUse = [
79
+ ...(settings.hooks.PostToolUse || []),
80
+ MIRRA_HOOKS.PostToolUse,
81
+ ];
82
+ console.log(chalk_1.default.green('[+]') + ' Added PostToolUse hook');
83
+ hooksAdded++;
84
+ }
85
+ else {
86
+ console.log(chalk_1.default.gray('- PostToolUse hook already exists'));
87
+ }
88
+ // Add Stop hook
89
+ if (!hookExists(settings.hooks.Stop, 'mirra-cc-bridge')) {
90
+ settings.hooks.Stop = [...(settings.hooks.Stop || []), MIRRA_HOOKS.Stop];
91
+ console.log(chalk_1.default.green('[+]') + ' Added Stop hook');
92
+ hooksAdded++;
93
+ }
94
+ else {
95
+ console.log(chalk_1.default.gray('- Stop hook already exists'));
96
+ }
97
+ // Save settings
98
+ (0, fs_1.writeFileSync)(CLAUDE_SETTINGS_FILE, JSON.stringify(settings, null, 2));
99
+ console.log(chalk_1.default.gray(`\nSettings saved to: ${CLAUDE_SETTINGS_FILE}`));
100
+ if (hooksAdded > 0) {
101
+ console.log(chalk_1.default.green(`\n[+] ${hooksAdded} hook(s) configured`));
102
+ console.log(chalk_1.default.gray('\nClaude Code will now send output to Mirra when running.'));
103
+ }
104
+ else {
105
+ console.log(chalk_1.default.yellow('\nAll hooks were already configured.'));
106
+ }
107
+ console.log(chalk_1.default.bold('\nHooks configured:'));
108
+ console.log(' • PostMessage - Sends Claude\'s responses to your mobile app');
109
+ console.log(' • PostToolUse - Sends tool results (edits, commands, etc.)');
110
+ console.log(' • Stop - Notifies when session ends');
111
+ // Mark hooks as configured
112
+ (0, config_1.setConfigValue)('hooksConfigured', true);
113
+ }
114
+ //# sourceMappingURL=setup-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-hooks.js","sourceRoot":"","sources":["../../src/commands/setup-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Start command - launch the bridge HTTP server
3
+ *
4
+ * This server receives commands from the Mirra mobile app via the PC resource.
5
+ * It manages Claude Code sessions and creates Flows for reply routing.
6
+ */
7
+ interface StartOptions {
8
+ port: string;
9
+ tunnel?: boolean;
10
+ }
11
+ /**
12
+ * Start the bridge server
13
+ */
14
+ export declare function startServer(options: StartOptions): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuHD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtE"}