autodev-cli 1.4.15 → 1.4.17

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/out/cli.js CHANGED
@@ -46,6 +46,7 @@ const connect_1 = require("./commands/connect");
46
46
  const tailOutput_1 = require("./commands/tailOutput");
47
47
  const export_1 = require("./commands/export");
48
48
  const import_1 = require("./commands/import");
49
+ const mcpOperate_1 = require("./commands/mcpOperate");
49
50
  const connect_2 = require("./connect");
50
51
  const logger_1 = require("./logger");
51
52
  // eslint-disable-next-line @typescript-eslint/no-var-requires
@@ -120,6 +121,7 @@ const program = new commander_1.Command()
120
121
  (0, resume_1.resumeCommand)(program);
121
122
  (0, export_1.exportCommand)(program);
122
123
  (0, import_1.importCommand)(program);
124
+ (0, mcpOperate_1.mcpOperateCommand)(program);
123
125
  program.parseAsync(process.argv).catch((err) => {
124
126
  console.error(err.message);
125
127
  process.exit(1);
package/out/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /** Derive the presence WebSocket URL (…/ws) from the operator-MCP endpoint. */
3
+ export declare function officeWsUrl(endpoint: string): string;
4
+ /** Turn a server WS push into a one-line human notice, or null to ignore it. */
5
+ export declare function describePush(msg: Record<string, unknown>): string | null;
6
+ export declare function mcpOperateCommand(program: Command): void;
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.officeWsUrl = officeWsUrl;
37
+ exports.describePush = describePush;
38
+ exports.mcpOperateCommand = mcpOperateCommand;
39
+ const http = __importStar(require("http"));
40
+ const https = __importStar(require("https"));
41
+ const path = __importStar(require("path"));
42
+ const readline = __importStar(require("readline"));
43
+ const url_1 = require("url");
44
+ const settingsLoader_1 = require("../core/settingsLoader");
45
+ const officeSocket_1 = require("../officeSocket");
46
+ /**
47
+ * `autodev mcp-operate` — run a local stdio MCP server that lets a pure MCP
48
+ * client (Claude Desktop/Code, etc.) operate a pixel-office character with NO
49
+ * autodev loop. It is a transparent JSON-RPC bridge: the client speaks the MCP
50
+ * stdio transport (newline-delimited JSON on stdin/stdout); each request is
51
+ * forwarded to the pixel-office operator MCP (`…/api/office-mcp`) authenticated
52
+ * with the character's api_key, and the response is written back.
53
+ *
54
+ * Why stdio (vs adding the remote HTTP MCP directly): the client adds it with a
55
+ * single command — no remote-server approval friction, and the key/url stay in
56
+ * autodev config instead of being pasted into the client.
57
+ *
58
+ * claude mcp add pixel-office -- autodev mcp-operate --key <api_key> --url <…/api/office-mcp>
59
+ * # or, inside a bound workspace, just: autodev mcp-operate
60
+ */
61
+ /** Derive the operator-MCP URL from a bound workspace's serverBaseUrl. */
62
+ function officeMcpUrl(serverBaseUrl) {
63
+ try {
64
+ const u = new url_1.URL(serverBaseUrl || '');
65
+ // serverBaseUrl is derived from wsUrl (wss://host/ws) — normalise to the
66
+ // HTTP origin; the MCP endpoint lives at <origin>/api/office-mcp.
67
+ const proto = u.protocol === 'ws:' ? 'http:' : u.protocol === 'wss:' ? 'https:' : u.protocol;
68
+ return `${proto}//${u.host}/api/office-mcp`;
69
+ }
70
+ catch {
71
+ return '';
72
+ }
73
+ }
74
+ /** Derive the presence WebSocket URL (…/ws) from the operator-MCP endpoint. */
75
+ function officeWsUrl(endpoint) {
76
+ try {
77
+ const u = new url_1.URL(endpoint);
78
+ const proto = u.protocol === 'http:' ? 'ws:' : u.protocol === 'https:' ? 'wss:' : u.protocol;
79
+ return `${proto}//${u.host}/ws`;
80
+ }
81
+ catch {
82
+ return '';
83
+ }
84
+ }
85
+ /** Turn a server WS push into a one-line human notice, or null to ignore it. */
86
+ function describePush(msg) {
87
+ const type = msg['type'];
88
+ if (type === 'new_task') {
89
+ const task = msg['data']?.task;
90
+ return task?.title ? `New task: ${task.title}` : 'New task assigned.';
91
+ }
92
+ // A2A task/message push frame: { task: { metadata: { task: { text }, event } } }
93
+ const task = msg['task'];
94
+ if (task?.metadata) {
95
+ const text = task.metadata.task?.text;
96
+ return text ? `New message: ${text}` : 'You have a new message.';
97
+ }
98
+ return null;
99
+ }
100
+ /** POST a JSON-RPC message to the remote operator MCP; resolve its JSON reply. */
101
+ function proxy(endpoint, key, body) {
102
+ return new Promise((resolve, reject) => {
103
+ const u = new url_1.URL(endpoint);
104
+ const lib = u.protocol === 'https:' ? https : http;
105
+ const data = Buffer.from(JSON.stringify(body), 'utf8');
106
+ const req = lib.request(u, {
107
+ method: 'POST',
108
+ headers: {
109
+ 'Content-Type': 'application/json',
110
+ 'Accept': 'application/json',
111
+ 'Authorization': `Bearer ${key}`,
112
+ 'Content-Length': data.length,
113
+ },
114
+ }, (res) => {
115
+ let d = '';
116
+ res.on('data', (c) => { d += c; });
117
+ res.on('end', () => {
118
+ // A notification (204/202, no body) has nothing to forward.
119
+ if (!d.trim()) {
120
+ resolve({});
121
+ return;
122
+ }
123
+ try {
124
+ resolve(JSON.parse(d));
125
+ }
126
+ catch (e) {
127
+ reject(e);
128
+ }
129
+ });
130
+ });
131
+ req.on('error', reject);
132
+ req.write(data);
133
+ req.end();
134
+ });
135
+ }
136
+ function mcpOperateCommand(program) {
137
+ program
138
+ .command('mcp-operate [path]')
139
+ .description('Run a stdio MCP server that operates a pixel-office agent (bridges to …/api/office-mcp). Add it with: claude mcp add pixel-office -- autodev mcp-operate --key <api_key> --url <url>')
140
+ .option('--url <url>', 'Operator MCP URL (…/api/office-mcp). Default: derived from the workspace binding.')
141
+ .option('--key <apiKey>', 'The character api_key (Bearer). Default: the workspace serverApiKey.')
142
+ .option('--no-socket', 'Do not open the presence WebSocket (stay on poll-based presence only).')
143
+ .action(async (workspacePath, opts) => {
144
+ const cwd = workspacePath ? path.resolve(workspacePath) : process.cwd();
145
+ const settings = (0, settingsLoader_1.loadSettingsForRoot)(cwd);
146
+ const endpoint = opts.url || officeMcpUrl(settings.serverBaseUrl);
147
+ const key = opts.key || settings.serverApiKey || '';
148
+ if (!endpoint || !key) {
149
+ process.stderr.write('autodev mcp-operate: need --url and --key (or run inside a workspace bound to an office).\n');
150
+ process.exit(1);
151
+ return;
152
+ }
153
+ // Everything below goes to stdout as MCP frames — keep it clean; log to stderr.
154
+ process.stderr.write(`autodev mcp-operate → ${endpoint}\n`);
155
+ const send = (msg) => { process.stdout.write(JSON.stringify(msg) + '\n'); };
156
+ const rl = readline.createInterface({ input: process.stdin, terminal: false });
157
+ // ── Presence WebSocket (optional; --no-socket disables) ──────────────────
158
+ // Holds a live connection so the office shows this MCP agent genuinely
159
+ // online, and surfaces task/message pushes to the client as MCP
160
+ // notifications the moment they arrive. Purely additive — if it can't
161
+ // connect, the stdio bridge keeps working and presence falls back to the
162
+ // server's poll heuristic.
163
+ let socket = null;
164
+ const startSocket = async () => {
165
+ if (opts.socket === false) {
166
+ return;
167
+ }
168
+ const wsUrl = officeWsUrl(endpoint);
169
+ if (!wsUrl) {
170
+ return;
171
+ }
172
+ // Learn our slug (needed for the ?endpoint= WS auth) from whoami.
173
+ let slug = '';
174
+ try {
175
+ const who = await proxy(endpoint, key, { jsonrpc: '2.0', id: 'boot-whoami', method: 'tools/call', params: { name: 'whoami', arguments: {} } });
176
+ const text = ((who['result']?.content?.[0]?.text) ?? '');
177
+ slug = (text.match(/slug:\s*([a-z0-9][a-z0-9-]*)/i)?.[1]) ?? '';
178
+ }
179
+ catch { /* whoami failed — skip presence, bridge still works */ }
180
+ if (!slug) {
181
+ process.stderr.write('autodev mcp-operate: could not resolve slug — presence socket disabled.\n');
182
+ return;
183
+ }
184
+ socket = new officeSocket_1.OfficeSocket(wsUrl, key, slug, {
185
+ log: (l) => process.stderr.write(l + '\n'),
186
+ meta: { provider: 'mcp-operator', fileBrowserEnabled: false },
187
+ onMessage: (msg) => {
188
+ const notice = describePush(msg);
189
+ if (notice) {
190
+ // MCP logging notification — client-visible, no id (one-way).
191
+ send({ jsonrpc: '2.0', method: 'notifications/message', params: { level: 'info', logger: 'pixel-office', data: notice } });
192
+ }
193
+ },
194
+ });
195
+ socket.start();
196
+ };
197
+ void startSocket();
198
+ // Drain in-flight requests before exiting when stdin closes, so a reply
199
+ // in progress is never clipped.
200
+ let inflight = 0;
201
+ let closed = false;
202
+ const maybeExit = () => { if (closed && inflight === 0) {
203
+ socket?.destroy();
204
+ process.exit(0);
205
+ } };
206
+ rl.on('line', async (line) => {
207
+ const t = line.trim();
208
+ if (!t) {
209
+ return;
210
+ }
211
+ let req;
212
+ try {
213
+ req = JSON.parse(t);
214
+ }
215
+ catch {
216
+ return;
217
+ }
218
+ // Notifications (no id) are one-way — nothing to reply. Forward the
219
+ // handshake ones opportunistically but never write a response for them.
220
+ if (req.id === undefined || req.id === null) {
221
+ if (typeof req.method === 'string' && req.method.startsWith('notifications/')) {
222
+ proxy(endpoint, key, req).catch(() => { });
223
+ }
224
+ return;
225
+ }
226
+ inflight++;
227
+ try {
228
+ send(await proxy(endpoint, key, req));
229
+ }
230
+ catch (e) {
231
+ send({ jsonrpc: '2.0', id: req.id, error: { code: -32603, message: 'proxy error: ' + (e?.message ?? String(e)) } });
232
+ }
233
+ finally {
234
+ inflight--;
235
+ maybeExit();
236
+ }
237
+ });
238
+ rl.on('close', () => { closed = true; maybeExit(); });
239
+ });
240
+ }
241
+ //# sourceMappingURL=mcpOperate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpOperate.js","sourceRoot":"","sources":["../../src/commands/mcpOperate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface OfficeSocketOpts {
2
+ /** Called for every decoded JSON text frame from the server. */
3
+ onMessage: (msg: Record<string, unknown>) => void;
4
+ /** Optional stderr logger (never stdout — that carries MCP frames). */
5
+ log?: (line: string) => void;
6
+ /** Extra metadata merged into the agent_online frame (provider, etc.). */
7
+ meta?: Record<string, unknown>;
8
+ }
9
+ export declare class OfficeSocket {
10
+ private readonly wsUrl;
11
+ private readonly apiKey;
12
+ private readonly slug;
13
+ private readonly opts;
14
+ private _socket;
15
+ private _buffer;
16
+ private _connected;
17
+ private _destroyed;
18
+ private _reconnectTimer;
19
+ private _pingTimer;
20
+ private _lastPongAt;
21
+ constructor(wsUrl: string, apiKey: string, slug: string, opts: OfficeSocketOpts);
22
+ start(): void;
23
+ /** True while a live connection is up. */
24
+ isConnected(): boolean;
25
+ destroy(): void;
26
+ private _log;
27
+ private _connect;
28
+ private _closeSocket;
29
+ private _scheduleReconnect;
30
+ private _processBuffer;
31
+ private _parseFrame;
32
+ private _onFrame;
33
+ private _sendJson;
34
+ private _sendTextFrame;
35
+ private _sendPong;
36
+ private _sendPing;
37
+ private _startHeartbeat;
38
+ private _stopHeartbeat;
39
+ }
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OfficeSocket = void 0;
37
+ const crypto = __importStar(require("crypto"));
38
+ const net = __importStar(require("net"));
39
+ const tls = __importStar(require("tls"));
40
+ const url_1 = require("url");
41
+ /**
42
+ * OfficeSocket — a minimal, self-contained WebSocket client used by
43
+ * `autodev mcp-operate` to hold a *presence* connection to pixel-office
44
+ * alongside the stdio MCP bridge.
45
+ *
46
+ * Why this exists: MCP has no WebSocket transport and its clients are
47
+ * turn-based, so a pure-MCP agent otherwise looks offline between polls and
48
+ * learns about new work only when it next calls get_tasks. This side-socket
49
+ * (the same `/ws?token=&endpoint=` channel the autodev CLI uses) makes the
50
+ * agent show genuinely online (the server flips is_connected=true purely on
51
+ * connect) and lets the bridge surface live task/message pushes to the client
52
+ * as MCP notifications the instant they arrive.
53
+ *
54
+ * It is deliberately tiny: connect, send agent_online, answer pings, parse text
55
+ * frames, reconnect with a fixed backoff. All the WebSocket framing is copied
56
+ * from the CLI's proven raw implementation (no `ws` dependency in this repo).
57
+ */
58
+ const RECONNECT_DELAY_MS = 3000;
59
+ const PING_INTERVAL_MS = 25_000;
60
+ const PONG_GRACE_MS = 70_000;
61
+ class OfficeSocket {
62
+ wsUrl;
63
+ apiKey;
64
+ slug;
65
+ opts;
66
+ _socket = null;
67
+ _buffer = Buffer.alloc(0);
68
+ _connected = false;
69
+ _destroyed = false;
70
+ _reconnectTimer = null;
71
+ _pingTimer = null;
72
+ _lastPongAt = 0;
73
+ constructor(wsUrl, apiKey, slug, opts) {
74
+ this.wsUrl = wsUrl;
75
+ this.apiKey = apiKey;
76
+ this.slug = slug;
77
+ this.opts = opts;
78
+ }
79
+ start() {
80
+ this._destroyed = false;
81
+ this._connect();
82
+ }
83
+ /** True while a live connection is up. */
84
+ isConnected() { return this._connected; }
85
+ destroy() {
86
+ this._destroyed = true;
87
+ this._stopHeartbeat();
88
+ if (this._reconnectTimer) {
89
+ clearTimeout(this._reconnectTimer);
90
+ this._reconnectTimer = null;
91
+ }
92
+ this._closeSocket();
93
+ }
94
+ // ── connection ─────────────────────────────────────────────────────────────
95
+ _log(line) { this.opts.log?.(line); }
96
+ _connect() {
97
+ if (this._destroyed) {
98
+ return;
99
+ }
100
+ let parsed;
101
+ try {
102
+ parsed = new url_1.URL(this.wsUrl);
103
+ }
104
+ catch {
105
+ this._log(`OfficeSocket: bad ws url "${this.wsUrl}"`);
106
+ return;
107
+ }
108
+ const isSecure = parsed.protocol === 'wss:';
109
+ const rawHost = parsed.hostname;
110
+ const host = (rawHost === 'localhost' || rawHost === '::1') ? '127.0.0.1' : rawHost;
111
+ const port = parsed.port ? parseInt(parsed.port, 10) : (isSecure ? 443 : 80);
112
+ const basePath = parsed.pathname || '/';
113
+ const qs = new URLSearchParams({ token: this.apiKey, endpoint: this.slug }).toString();
114
+ const upgradePath = `${basePath}?${qs}`;
115
+ const key = crypto.randomBytes(16).toString('base64');
116
+ const handshake = [
117
+ `GET ${upgradePath} HTTP/1.1`,
118
+ `Host: ${host}:${port}`,
119
+ 'Upgrade: websocket',
120
+ 'Connection: Upgrade',
121
+ `Sec-WebSocket-Key: ${key}`,
122
+ 'Sec-WebSocket-Version: 13',
123
+ '', '',
124
+ ].join('\r\n');
125
+ const sock = isSecure
126
+ ? tls.connect({ host, port, servername: host })
127
+ : net.createConnection({ host, port });
128
+ if (isSecure) {
129
+ sock.once('secureConnect', () => sock.write(handshake));
130
+ }
131
+ else {
132
+ sock.once('connect', () => sock.write(handshake));
133
+ }
134
+ let headersDone = false;
135
+ let headerBuf = '';
136
+ sock.on('data', (chunk) => {
137
+ if (!headersDone) {
138
+ headerBuf += chunk.toString('binary');
139
+ const sep = headerBuf.indexOf('\r\n\r\n');
140
+ if (sep === -1) {
141
+ return;
142
+ }
143
+ if (!headerBuf.includes('101 Switching Protocols')) {
144
+ const statusLine = headerBuf.split('\r\n')[0] ?? '(no response)';
145
+ this._log(`OfficeSocket: upgrade rejected: "${statusLine}" — retrying in ${RECONNECT_DELAY_MS}ms`);
146
+ sock.destroy();
147
+ this._scheduleReconnect();
148
+ return;
149
+ }
150
+ headersDone = true;
151
+ this._connected = true;
152
+ this._log(`OfficeSocket: presence connected (slug: ${this.slug})`);
153
+ // agent_online → server sets status=active (is_connected is already true
154
+ // from the connect itself). Same A2A message shape the autodev CLI sends.
155
+ this._sendJson({
156
+ message: {
157
+ messageId: crypto.randomUUID(),
158
+ contextId: this.slug,
159
+ role: 'ROLE_AGENT',
160
+ parts: [{ text: 'mcp agent online' }],
161
+ metadata: { event: 'agent_online', ...(this.opts.meta ?? {}) },
162
+ },
163
+ });
164
+ this._startHeartbeat();
165
+ const remaining = Buffer.from(headerBuf.slice(sep + 4), 'binary');
166
+ if (remaining.length > 0) {
167
+ this._buffer = remaining;
168
+ this._processBuffer();
169
+ }
170
+ return;
171
+ }
172
+ this._buffer = Buffer.concat([this._buffer, chunk]);
173
+ this._processBuffer();
174
+ });
175
+ sock.on('error', (err) => {
176
+ this._log(`OfficeSocket: error ${err.message} — retrying`);
177
+ this._connected = false;
178
+ this._scheduleReconnect();
179
+ });
180
+ sock.on('close', () => {
181
+ if (this._connected) {
182
+ this._log('OfficeSocket: disconnected — retrying');
183
+ }
184
+ this._connected = false;
185
+ this._scheduleReconnect();
186
+ });
187
+ this._socket = sock;
188
+ }
189
+ _closeSocket() {
190
+ if (this._socket) {
191
+ try {
192
+ const mask = crypto.randomBytes(4);
193
+ this._socket.write(Buffer.from([0x88, 0x80, mask[0], mask[1], mask[2], mask[3]]));
194
+ }
195
+ catch { /* ignore */ }
196
+ this._socket.destroy();
197
+ this._socket = null;
198
+ }
199
+ }
200
+ _scheduleReconnect() {
201
+ this._stopHeartbeat();
202
+ this._closeSocket();
203
+ if (this._destroyed || this._reconnectTimer) {
204
+ return;
205
+ }
206
+ this._reconnectTimer = setTimeout(() => {
207
+ this._reconnectTimer = null;
208
+ this._connect();
209
+ }, RECONNECT_DELAY_MS);
210
+ }
211
+ // ── framing (copied from the CLI's proven raw WS client) ─────────────────────
212
+ _processBuffer() {
213
+ while (true) {
214
+ const frame = this._parseFrame();
215
+ if (!frame) {
216
+ break;
217
+ }
218
+ this._onFrame(frame.opcode, frame.payload);
219
+ }
220
+ }
221
+ _parseFrame() {
222
+ if (this._buffer.length < 2) {
223
+ return null;
224
+ }
225
+ const byte2 = this._buffer[1];
226
+ const opcode = this._buffer[0] & 0x0f;
227
+ const isMasked = (byte2 & 0x80) !== 0;
228
+ let payloadLen = byte2 & 0x7f;
229
+ let offset = 2;
230
+ if (payloadLen === 126) {
231
+ if (this._buffer.length < offset + 2) {
232
+ return null;
233
+ }
234
+ payloadLen = this._buffer.readUInt16BE(offset);
235
+ offset += 2;
236
+ }
237
+ else if (payloadLen === 127) {
238
+ if (this._buffer.length < offset + 8) {
239
+ return null;
240
+ }
241
+ payloadLen = this._buffer.readUInt32BE(offset + 4);
242
+ offset += 8;
243
+ }
244
+ const maskBytes = isMasked ? 4 : 0;
245
+ if (this._buffer.length < offset + maskBytes + payloadLen) {
246
+ return null;
247
+ }
248
+ const mask = isMasked ? this._buffer.slice(offset, offset + 4) : null;
249
+ offset += maskBytes;
250
+ let payload = this._buffer.slice(offset, offset + payloadLen);
251
+ if (mask) {
252
+ payload = Buffer.from(payload);
253
+ for (let i = 0; i < payload.length; i++) {
254
+ payload[i] ^= mask[i % 4];
255
+ }
256
+ }
257
+ this._buffer = this._buffer.slice(offset + payloadLen);
258
+ return { opcode, payload };
259
+ }
260
+ _onFrame(opcode, payload) {
261
+ if (opcode === 0x9) {
262
+ this._sendPong(payload);
263
+ this._lastPongAt = Date.now();
264
+ return;
265
+ }
266
+ if (opcode === 0xa) {
267
+ this._lastPongAt = Date.now();
268
+ return;
269
+ }
270
+ if (opcode === 0x8) {
271
+ this._connected = false;
272
+ this._scheduleReconnect();
273
+ return;
274
+ }
275
+ if (opcode !== 0x1) {
276
+ return;
277
+ }
278
+ let msg;
279
+ try {
280
+ msg = JSON.parse(payload.toString('utf8'));
281
+ }
282
+ catch {
283
+ return;
284
+ }
285
+ // Server app-level heartbeat: reply so it counts us alive.
286
+ if (msg['type'] === 'ping') {
287
+ this._sendJson({ type: 'pong' });
288
+ this._lastPongAt = Date.now();
289
+ return;
290
+ }
291
+ try {
292
+ this.opts.onMessage(msg);
293
+ }
294
+ catch { /* listener must not kill the socket */ }
295
+ }
296
+ _sendJson(obj) { this._sendTextFrame(JSON.stringify(obj)); }
297
+ _sendTextFrame(text) {
298
+ if (!this._socket) {
299
+ return;
300
+ }
301
+ const data = Buffer.from(text, 'utf8');
302
+ const len = data.length;
303
+ const mask = crypto.randomBytes(4);
304
+ let header;
305
+ if (len <= 125) {
306
+ header = Buffer.alloc(6);
307
+ header[0] = 0x81;
308
+ header[1] = len | 0x80;
309
+ mask.copy(header, 2);
310
+ }
311
+ else if (len <= 65535) {
312
+ header = Buffer.alloc(8);
313
+ header[0] = 0x81;
314
+ header[1] = 126 | 0x80;
315
+ header.writeUInt16BE(len, 2);
316
+ mask.copy(header, 4);
317
+ }
318
+ else {
319
+ header = Buffer.alloc(14);
320
+ header[0] = 0x81;
321
+ header[1] = 127 | 0x80;
322
+ header.writeBigUInt64BE(BigInt(len), 2);
323
+ mask.copy(header, 10);
324
+ }
325
+ const masked = Buffer.from(data);
326
+ for (let i = 0; i < masked.length; i++) {
327
+ masked[i] ^= mask[i % 4];
328
+ }
329
+ try {
330
+ this._socket.write(Buffer.concat([header, masked]));
331
+ }
332
+ catch { /* close handler reconnects */ }
333
+ }
334
+ _sendPong(payload) {
335
+ if (!this._socket) {
336
+ return;
337
+ }
338
+ const mask = crypto.randomBytes(4);
339
+ const len = payload.length;
340
+ const header = Buffer.alloc(6);
341
+ header[0] = 0x8a;
342
+ header[1] = (len & 0x7f) | 0x80;
343
+ mask.copy(header, 2);
344
+ const maskedPayload = Buffer.from(payload);
345
+ for (let i = 0; i < maskedPayload.length; i++) {
346
+ maskedPayload[i] ^= mask[i % 4];
347
+ }
348
+ try {
349
+ this._socket.write(Buffer.concat([header, maskedPayload]));
350
+ }
351
+ catch { /* ignore */ }
352
+ }
353
+ _sendPing() {
354
+ if (!this._socket || !this._connected) {
355
+ return;
356
+ }
357
+ try {
358
+ const mask = crypto.randomBytes(4);
359
+ this._socket.write(Buffer.from([0x89, 0x80, mask[0], mask[1], mask[2], mask[3]]));
360
+ }
361
+ catch { /* close handler reconnects */ }
362
+ }
363
+ _startHeartbeat() {
364
+ this._stopHeartbeat();
365
+ this._lastPongAt = Date.now();
366
+ this._pingTimer = setInterval(() => {
367
+ if (Date.now() - this._lastPongAt > PONG_GRACE_MS) {
368
+ this._log('OfficeSocket: heartbeat timeout — forcing reconnect');
369
+ this._connected = false;
370
+ this._scheduleReconnect();
371
+ return;
372
+ }
373
+ this._sendPing();
374
+ }, PING_INTERVAL_MS);
375
+ }
376
+ _stopHeartbeat() {
377
+ if (this._pingTimer) {
378
+ clearInterval(this._pingTimer);
379
+ this._pingTimer = null;
380
+ }
381
+ }
382
+ }
383
+ exports.OfficeSocket = OfficeSocket;
384
+ //# sourceMappingURL=officeSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"officeSocket.js","sourceRoot":"","sources":["../src/officeSocket.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autodev-cli",
3
- "version": "1.4.15",
3
+ "version": "1.4.17",
4
4
  "description": "AutoAIDev CLI — autonomous AI task loop with VS Code / Cursor launcher",
5
5
  "license": "MIT",
6
6
  "bin": {