doomcode 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/index.js ADDED
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * DoomCode Desktop CLI
4
+ *
5
+ * Wraps Claude Code CLI and streams output to mobile via relay server.
6
+ */
7
+ import { program } from 'commander';
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import { decodeBase64 } from '@doomcode/crypto';
11
+ import { DoomCodeSession } from './session.js';
12
+ // AWS API Gateway URLs
13
+ const DEFAULT_WS_URL = 'wss://elz7wfhx70.execute-api.us-east-1.amazonaws.com/prod';
14
+ const DEFAULT_HTTP_URL = 'https://jsmutqne72.execute-api.us-east-1.amazonaws.com/prod';
15
+ const getSessionCachePath = (dir) => path.join(dir, '.doomcode', 'session.json');
16
+ const loadSessionCache = (cachePath) => {
17
+ if (!fs.existsSync(cachePath))
18
+ return null;
19
+ try {
20
+ const raw = fs.readFileSync(cachePath, 'utf8');
21
+ const parsed = JSON.parse(raw);
22
+ if (!parsed.sessionId || !parsed.keyPair?.publicKey || !parsed.keyPair?.secretKey) {
23
+ return null;
24
+ }
25
+ const keyPair = {
26
+ publicKey: parsed.keyPair.publicKey,
27
+ secretKey: parsed.keyPair.secretKey,
28
+ publicKeyBytes: decodeBase64(parsed.keyPair.publicKey),
29
+ secretKeyBytes: decodeBase64(parsed.keyPair.secretKey),
30
+ };
31
+ return {
32
+ sessionId: parsed.sessionId,
33
+ wsUrl: parsed.wsUrl,
34
+ httpUrl: parsed.httpUrl,
35
+ keyPair,
36
+ };
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ };
42
+ program
43
+ .name('doomcode')
44
+ .description('Control AI coding agents from your phone')
45
+ .version('0.1.0');
46
+ program
47
+ .command('start')
48
+ .description('Start a DoomCode session')
49
+ .option('--ws-url <url>', 'WebSocket relay URL', DEFAULT_WS_URL)
50
+ .option('--http-url <url>', 'HTTP API URL for session management', DEFAULT_HTTP_URL)
51
+ .option('-d, --dir <path>', 'Working directory', process.cwd())
52
+ .option('-a, --agent <agent>', 'Agent to use (claude|codex)', 'claude')
53
+ .option('--reuse', 'Reuse the last session from the local cache')
54
+ .action(async (options) => {
55
+ const cachePath = getSessionCachePath(options.dir);
56
+ if (options.reuse) {
57
+ const cached = loadSessionCache(cachePath);
58
+ if (cached) {
59
+ const session = new DoomCodeSession({
60
+ wsUrl: cached.wsUrl ?? options.wsUrl,
61
+ httpUrl: cached.httpUrl ?? options.httpUrl,
62
+ workingDirectory: options.dir,
63
+ agent: options.agent,
64
+ sessionId: cached.sessionId,
65
+ keyPair: cached.keyPair,
66
+ sessionCachePath: cachePath,
67
+ });
68
+ try {
69
+ await session.connect();
70
+ return;
71
+ }
72
+ catch (error) {
73
+ console.error('Failed to reuse session, falling back to new session:', error);
74
+ }
75
+ }
76
+ else {
77
+ console.warn('No reusable session cache found; starting a new session.');
78
+ }
79
+ }
80
+ const session = new DoomCodeSession({
81
+ wsUrl: options.wsUrl,
82
+ httpUrl: options.httpUrl,
83
+ workingDirectory: options.dir,
84
+ agent: options.agent,
85
+ sessionCachePath: cachePath,
86
+ });
87
+ try {
88
+ await session.start();
89
+ }
90
+ catch (error) {
91
+ console.error('Failed to start session:', error);
92
+ process.exit(1);
93
+ }
94
+ });
95
+ program
96
+ .command('connect <session-id>')
97
+ .description('Connect to an existing session')
98
+ .option('--ws-url <url>', 'WebSocket relay URL', DEFAULT_WS_URL)
99
+ .option('--http-url <url>', 'HTTP API URL for session management', DEFAULT_HTTP_URL)
100
+ .action(async (sessionId, options) => {
101
+ const session = new DoomCodeSession({
102
+ wsUrl: options.wsUrl,
103
+ httpUrl: options.httpUrl,
104
+ workingDirectory: process.cwd(),
105
+ agent: 'claude',
106
+ sessionId,
107
+ sessionCachePath: getSessionCachePath(process.cwd()),
108
+ });
109
+ try {
110
+ await session.connect();
111
+ }
112
+ catch (error) {
113
+ console.error('Failed to connect:', error);
114
+ process.exit(1);
115
+ }
116
+ });
117
+ program.parse();
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * DoomCode Session Manager
3
+ *
4
+ * Manages the connection between desktop CLI and mobile app.
5
+ */
6
+ import { type KeyPair } from '@doomcode/crypto';
7
+ export interface SessionOptions {
8
+ /** WebSocket URL for the relay (e.g., wss://xxx.execute-api.region.amazonaws.com/prod) */
9
+ wsUrl: string;
10
+ /** HTTP API URL for session management (e.g., https://xxx.execute-api.region.amazonaws.com/prod) */
11
+ httpUrl: string;
12
+ workingDirectory: string;
13
+ agent: 'claude' | 'codex';
14
+ sessionId?: string;
15
+ sessionCachePath?: string;
16
+ keyPair?: KeyPair;
17
+ }
18
+ export declare class DoomCodeSession {
19
+ private options;
20
+ private keyPair;
21
+ private ws;
22
+ private crypto;
23
+ private sessionId;
24
+ private agentManager;
25
+ private patchTracker;
26
+ private messageSequence;
27
+ private sessionCachePath;
28
+ private debugSession;
29
+ private lastPrompt;
30
+ private pendingPatchId;
31
+ private logDebug;
32
+ constructor(options: SessionOptions);
33
+ start(): Promise<void>;
34
+ connect(): Promise<void>;
35
+ private persistSessionCache;
36
+ private connectToRelay;
37
+ private displayQRCode;
38
+ private handleMessage;
39
+ private handleRelayMessage;
40
+ private onPeerConnected;
41
+ private startAgent;
42
+ private handleAgentOutput;
43
+ private handlePermissionRequest;
44
+ private handleDiff;
45
+ private handleAgentExit;
46
+ private handleEncryptedMessage;
47
+ private handleDecryptedMessage;
48
+ private handleAgentControl;
49
+ private sendAgentStatusUpdate;
50
+ private handleUndoRequest;
51
+ private handlePatchDecision;
52
+ private sendEncrypted;
53
+ }
54
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA8B,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAyB5E,MAAM,WAAW,cAAc;IAC7B,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,oGAAoG;IACpG,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,cAAc,CAAuB;IAE7C,OAAO,CAAC,QAAQ;gBAMJ,OAAO,EAAE,cAAc;IAQ7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,OAAO,CAAC,mBAAmB;YAsBb,cAAc;IAqC5B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,eAAe;YAUT,UAAU;IAaxB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,uBAAuB;YAKjB,UAAU;IAoBxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,sBAAsB;IAyC9B,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,qBAAqB;YAUf,iBAAiB;YAsBjB,mBAAmB;IAiBjC,OAAO,CAAC,aAAa;CAgBtB"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * DoomCode Session Manager
3
+ *
4
+ * Manages the connection between desktop CLI and mobile app.
5
+ */
6
+ import { generateKeyPair, E2ECrypto } from '@doomcode/crypto';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { createEnvelope, encodeQRPayload, } from '@doomcode/protocol';
10
+ import WebSocket from 'ws';
11
+ import qrcode from 'qrcode-terminal';
12
+ import { AgentManager } from './agent/agent-manager.js';
13
+ import { PatchTracker } from './agent/patch-tracker.js';
14
+ export class DoomCodeSession {
15
+ options;
16
+ keyPair;
17
+ ws = null;
18
+ crypto = null;
19
+ sessionId = null;
20
+ agentManager = null;
21
+ patchTracker;
22
+ messageSequence = 0;
23
+ sessionCachePath = null;
24
+ debugSession = process.env.DOOMCODE_DEBUG_SESSION === '1';
25
+ lastPrompt = null;
26
+ pendingPatchId = null;
27
+ logDebug(message) {
28
+ if (this.debugSession) {
29
+ console.log(message);
30
+ }
31
+ }
32
+ constructor(options) {
33
+ this.options = options;
34
+ this.keyPair = options.keyPair ?? generateKeyPair();
35
+ this.sessionId = options.sessionId ?? null;
36
+ this.sessionCachePath = options.sessionCachePath ?? null;
37
+ this.patchTracker = new PatchTracker(options.workingDirectory);
38
+ }
39
+ async start() {
40
+ console.log('Starting DoomCode session...');
41
+ console.log(`Working directory: ${this.options.workingDirectory}`);
42
+ console.log(`Agent: ${this.options.agent}`);
43
+ // Create session via HTTP API
44
+ const response = await fetch(`${this.options.httpUrl}/session`, { method: 'POST' });
45
+ if (!response.ok) {
46
+ throw new Error(`Failed to create session: ${response.statusText}`);
47
+ }
48
+ const { sessionId } = (await response.json());
49
+ this.sessionId = sessionId;
50
+ console.log(`Session ID: ${sessionId}`);
51
+ this.persistSessionCache();
52
+ // Connect to relay WebSocket
53
+ await this.connectToRelay();
54
+ // Display QR code for mobile pairing
55
+ this.displayQRCode();
56
+ // Wait for mobile to connect
57
+ console.log('\nWaiting for mobile device to connect...');
58
+ }
59
+ async connect() {
60
+ if (!this.sessionId) {
61
+ throw new Error('Session ID required for connect');
62
+ }
63
+ console.log(`Connecting to session ${this.sessionId}...`);
64
+ await this.connectToRelay();
65
+ this.persistSessionCache();
66
+ }
67
+ persistSessionCache() {
68
+ if (!this.sessionCachePath || !this.sessionId)
69
+ return;
70
+ const payload = {
71
+ sessionId: this.sessionId,
72
+ wsUrl: this.options.wsUrl,
73
+ httpUrl: this.options.httpUrl,
74
+ keyPair: {
75
+ publicKey: this.keyPair.publicKey,
76
+ secretKey: this.keyPair.secretKey,
77
+ },
78
+ updatedAt: Date.now(),
79
+ };
80
+ try {
81
+ fs.mkdirSync(path.dirname(this.sessionCachePath), { recursive: true });
82
+ fs.writeFileSync(this.sessionCachePath, JSON.stringify(payload, null, 2), 'utf8');
83
+ }
84
+ catch (error) {
85
+ console.warn('Failed to write session cache:', error);
86
+ }
87
+ }
88
+ async connectToRelay() {
89
+ // API Gateway WebSocket - all connections go to the same URL
90
+ this.ws = new WebSocket(this.options.wsUrl);
91
+ return new Promise((resolve, reject) => {
92
+ if (!this.ws)
93
+ return reject(new Error('WebSocket not initialized'));
94
+ this.ws.on('open', () => {
95
+ console.log('Connected to relay server');
96
+ // Join the session (API Gateway handles routing via messages, not URL path)
97
+ const joinMsg = {
98
+ action: 'join',
99
+ sessionId: this.sessionId,
100
+ clientType: 'desktop',
101
+ publicKey: this.keyPair.publicKey,
102
+ };
103
+ this.ws.send(JSON.stringify(joinMsg));
104
+ resolve();
105
+ });
106
+ this.ws.on('message', (data) => {
107
+ this.handleMessage(data.toString());
108
+ });
109
+ this.ws.on('close', () => {
110
+ console.log('Disconnected from relay server');
111
+ // TODO: Implement reconnection logic
112
+ });
113
+ this.ws.on('error', (error) => {
114
+ console.error('WebSocket error:', error);
115
+ reject(error);
116
+ });
117
+ });
118
+ }
119
+ displayQRCode() {
120
+ if (!this.sessionId)
121
+ return;
122
+ const payload = {
123
+ sessionId: this.sessionId,
124
+ publicKey: this.keyPair.publicKey,
125
+ relayUrl: this.options.wsUrl,
126
+ expiresAt: Date.now() + 5 * 60 * 1000, // 5 minutes
127
+ };
128
+ const encoded = encodeQRPayload(payload);
129
+ console.log('\n┌──────────────────────────────────────┐');
130
+ console.log('│ Scan this QR code with your phone: │');
131
+ console.log('└──────────────────────────────────────┘');
132
+ qrcode.generate(encoded, { small: true });
133
+ console.log('');
134
+ // Fallback for terminals that can't render the QR reliably:
135
+ // Users can copy this payload into any QR generator and scan that instead.
136
+ console.log('QR payload (copy into a QR generator if you cannot see the QR above):');
137
+ console.log(encoded);
138
+ console.log('');
139
+ }
140
+ handleMessage(data) {
141
+ try {
142
+ const parsed = JSON.parse(data);
143
+ // Check if it's a relay control message or encrypted envelope
144
+ if ('action' in parsed) {
145
+ this.handleRelayMessage(parsed);
146
+ }
147
+ else if ('encryptedPayload' in parsed) {
148
+ this.handleEncryptedMessage(parsed);
149
+ }
150
+ }
151
+ catch (error) {
152
+ console.error('Failed to parse message:', error);
153
+ }
154
+ }
155
+ handleRelayMessage(msg) {
156
+ switch (msg.action) {
157
+ case 'session_created':
158
+ console.log('Session created');
159
+ break;
160
+ case 'session_joined':
161
+ console.log('Joined session');
162
+ if (msg.peerPublicKey) {
163
+ this.onPeerConnected(msg.peerPublicKey);
164
+ }
165
+ break;
166
+ case 'peer_connected':
167
+ console.log(`Mobile device connected`);
168
+ this.onPeerConnected(msg.peerPublicKey);
169
+ break;
170
+ case 'peer_disconnected':
171
+ console.log('Mobile device disconnected');
172
+ break;
173
+ case 'error':
174
+ console.error(`Relay error: ${msg.code} - ${msg.message}`);
175
+ break;
176
+ }
177
+ }
178
+ onPeerConnected(publicKey) {
179
+ this.crypto = new E2ECrypto(this.keyPair.secretKey, publicKey);
180
+ console.log('\n✓ Mobile device paired successfully!');
181
+ console.log('Starting agent...\n');
182
+ // Start the agent
183
+ this.startAgent();
184
+ }
185
+ async startAgent() {
186
+ this.agentManager = new AgentManager({
187
+ agent: this.options.agent,
188
+ workingDirectory: this.options.workingDirectory,
189
+ onOutput: (stream, data) => this.handleAgentOutput(stream, data),
190
+ onPermissionRequest: (request) => this.handlePermissionRequest(request),
191
+ onDiff: (diff) => this.handleDiff(diff),
192
+ onExit: (code) => this.handleAgentExit(code),
193
+ });
194
+ await this.agentManager.start();
195
+ }
196
+ handleAgentOutput(stream, data) {
197
+ // Send to mobile
198
+ const msg = {
199
+ type: 'terminal_output',
200
+ stream,
201
+ data,
202
+ sequence: this.messageSequence++,
203
+ };
204
+ this.sendEncrypted(msg);
205
+ // Also print locally
206
+ if (stream === 'stdout') {
207
+ process.stdout.write(data);
208
+ }
209
+ else {
210
+ process.stderr.write(data);
211
+ }
212
+ }
213
+ handlePermissionRequest(request) {
214
+ console.log(`\n[Permission required: ${request.description}]`);
215
+ this.sendEncrypted(request);
216
+ }
217
+ async handleDiff(diff) {
218
+ console.log(`\n[Diff ready for review: ${diff.files.length} files]`);
219
+ // Prepare patch tracking before sending to mobile
220
+ const patchId = await this.patchTracker.prepareForPatch(diff, this.lastPrompt ?? '', this.options.agent);
221
+ // Update the diff with the tracking patch ID
222
+ const trackedDiff = {
223
+ ...diff,
224
+ patchId,
225
+ };
226
+ this.pendingPatchId = patchId;
227
+ this.sendEncrypted(trackedDiff);
228
+ }
229
+ handleAgentExit(code) {
230
+ console.log(`\nAgent exited with code ${code}`);
231
+ }
232
+ handleEncryptedMessage(envelope) {
233
+ if (!this.crypto) {
234
+ console.error('Cannot decrypt: no crypto context');
235
+ return;
236
+ }
237
+ try {
238
+ const decrypted = this.crypto.decrypt({
239
+ nonce: envelope.nonce,
240
+ ciphertext: envelope.encryptedPayload,
241
+ });
242
+ const msg = JSON.parse(decrypted);
243
+ this.handleDecryptedMessage(msg);
244
+ }
245
+ catch (error) {
246
+ console.error('Failed to decrypt message:', error);
247
+ }
248
+ }
249
+ handleDecryptedMessage(msg) {
250
+ this.logDebug(`\n>>> [DESKTOP] Received decrypted message type: ${msg.type}`);
251
+ switch (msg.type) {
252
+ case 'permission_response':
253
+ console.log(`Permission ${msg.decision} for ${msg.requestId}`);
254
+ this.agentManager?.handlePermissionResponse(msg);
255
+ break;
256
+ case 'patch_decision':
257
+ console.log(`Patch ${msg.decision} for ${msg.patchId}`);
258
+ this.handlePatchDecision(msg);
259
+ break;
260
+ case 'user_prompt':
261
+ this.logDebug(`>>> [DESKTOP] USER PROMPT RECEIVED: "${msg.prompt}"`);
262
+ this.logDebug('>>> [DESKTOP] Calling agentManager.sendPrompt()...');
263
+ this.lastPrompt = msg.prompt;
264
+ this.agentManager?.sendPrompt(msg.prompt);
265
+ this.logDebug('>>> [DESKTOP] sendPrompt() returned');
266
+ break;
267
+ case 'heartbeat':
268
+ // Respond with heartbeat
269
+ this.sendEncrypted({
270
+ type: 'heartbeat',
271
+ timestamp: Date.now(),
272
+ agentStatus: this.agentManager?.getStatus() ?? 'idle',
273
+ });
274
+ break;
275
+ case 'agent_control':
276
+ this.handleAgentControl(msg);
277
+ break;
278
+ case 'undo_request':
279
+ this.handleUndoRequest(msg);
280
+ break;
281
+ }
282
+ }
283
+ handleAgentControl(msg) {
284
+ this.logDebug(`>>> [DESKTOP] Agent control: ${msg.command} for ${msg.agentId}`);
285
+ switch (msg.command) {
286
+ case 'start':
287
+ if (this.agentManager?.getStatus() === 'idle') {
288
+ this.startAgent();
289
+ }
290
+ this.sendAgentStatusUpdate();
291
+ break;
292
+ case 'stop':
293
+ this.agentManager?.stop();
294
+ this.sendAgentStatusUpdate();
295
+ break;
296
+ case 'retry':
297
+ if (this.lastPrompt && this.agentManager?.getStatus() === 'idle') {
298
+ this.agentManager?.sendPrompt(this.lastPrompt);
299
+ }
300
+ this.sendAgentStatusUpdate();
301
+ break;
302
+ case 'configure':
303
+ // Handle configuration updates (model, temperature, permissions)
304
+ // For now, log and acknowledge - full implementation requires agent restart
305
+ console.log('Agent configuration update:', msg.config);
306
+ this.sendAgentStatusUpdate();
307
+ break;
308
+ }
309
+ }
310
+ sendAgentStatusUpdate() {
311
+ const statusUpdate = {
312
+ type: 'agent_status_update',
313
+ agentId: this.options.agent,
314
+ status: this.agentManager?.getStatus() ?? 'idle',
315
+ lastPrompt: this.lastPrompt ?? undefined,
316
+ };
317
+ this.sendEncrypted(statusUpdate);
318
+ }
319
+ async handleUndoRequest(msg) {
320
+ this.logDebug(`>>> [DESKTOP] Undo request for patch: ${msg.patchId}`);
321
+ const result = await this.patchTracker.undoPatch(msg.patchId);
322
+ const undoResult = {
323
+ type: 'undo_result',
324
+ patchId: msg.patchId,
325
+ success: result.success,
326
+ error: result.error,
327
+ revertedFiles: result.revertedFiles,
328
+ };
329
+ this.sendEncrypted(undoResult);
330
+ if (result.success) {
331
+ console.log(`Undo successful: reverted ${result.revertedFiles.length} files`);
332
+ }
333
+ else {
334
+ console.log(`Undo failed: ${result.error}`);
335
+ }
336
+ }
337
+ async handlePatchDecision(msg) {
338
+ if (msg.decision === 'apply' && this.pendingPatchId === msg.patchId) {
339
+ // Finalize the patch and send applied notification
340
+ const appliedPatch = await this.patchTracker.finalizePatch(msg.patchId);
341
+ if (appliedPatch) {
342
+ const patchApplied = {
343
+ type: 'patch_applied',
344
+ patch: appliedPatch,
345
+ };
346
+ this.sendEncrypted(patchApplied);
347
+ }
348
+ this.pendingPatchId = null;
349
+ }
350
+ this.agentManager?.handlePatchDecision(msg);
351
+ }
352
+ sendEncrypted(msg) {
353
+ if (!this.ws || !this.crypto || !this.sessionId) {
354
+ console.error('Cannot send: not connected');
355
+ return;
356
+ }
357
+ const encrypted = this.crypto.encrypt(JSON.stringify(msg));
358
+ const envelope = createEnvelope({
359
+ sessionId: this.sessionId,
360
+ sender: 'desktop',
361
+ nonce: encrypted.nonce,
362
+ encryptedPayload: encrypted.ciphertext,
363
+ });
364
+ this.ws.send(JSON.stringify(envelope));
365
+ }
366
+ }
367
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "doomcode",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "Desktop CLI wrapper for DoomCode",
6
+ "type": "module",
7
+ "bin": "dist/index.js",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "clean": "rm -rf dist",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "dependencies": {
19
+ "@doomcode/crypto": "workspace:*",
20
+ "@doomcode/protocol": "workspace:*",
21
+ "@doomcode/diff-parser": "workspace:*",
22
+ "commander": "^13.1.0",
23
+ "node-pty": "^1.0.0",
24
+ "qrcode-terminal": "^0.12.0",
25
+ "ws": "^8.18.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.11.0",
29
+ "@types/ws": "^8.5.13"
30
+ }
31
+ }