autodev-cli 1.4.16 → 1.4.18
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/commands/mcpOperate.d.ts +4 -0
- package/out/commands/mcpOperate.js +72 -0
- package/out/commands/mcpOperate.js.map +1 -1
- package/out/officeSocket.d.ts +39 -0
- package/out/officeSocket.js +384 -0
- package/out/officeSocket.js.map +1 -0
- package/out/providers/grokTuiProvider.js +33 -0
- package/out/providers/grokTuiProvider.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,6 @@
|
|
|
1
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;
|
|
2
6
|
export declare function mcpOperateCommand(program: Command): void;
|
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.officeWsUrl = officeWsUrl;
|
|
37
|
+
exports.describePush = describePush;
|
|
36
38
|
exports.mcpOperateCommand = mcpOperateCommand;
|
|
37
39
|
const http = __importStar(require("http"));
|
|
38
40
|
const https = __importStar(require("https"));
|
|
@@ -40,6 +42,7 @@ const path = __importStar(require("path"));
|
|
|
40
42
|
const readline = __importStar(require("readline"));
|
|
41
43
|
const url_1 = require("url");
|
|
42
44
|
const settingsLoader_1 = require("../core/settingsLoader");
|
|
45
|
+
const officeSocket_1 = require("../officeSocket");
|
|
43
46
|
/**
|
|
44
47
|
* `autodev mcp-operate` — run a local stdio MCP server that lets a pure MCP
|
|
45
48
|
* client (Claude Desktop/Code, etc.) operate a pixel-office character with NO
|
|
@@ -68,6 +71,32 @@ function officeMcpUrl(serverBaseUrl) {
|
|
|
68
71
|
return '';
|
|
69
72
|
}
|
|
70
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
|
+
}
|
|
71
100
|
/** POST a JSON-RPC message to the remote operator MCP; resolve its JSON reply. */
|
|
72
101
|
function proxy(endpoint, key, body) {
|
|
73
102
|
return new Promise((resolve, reject) => {
|
|
@@ -110,6 +139,7 @@ function mcpOperateCommand(program) {
|
|
|
110
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>')
|
|
111
140
|
.option('--url <url>', 'Operator MCP URL (…/api/office-mcp). Default: derived from the workspace binding.')
|
|
112
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).')
|
|
113
143
|
.action(async (workspacePath, opts) => {
|
|
114
144
|
const cwd = workspacePath ? path.resolve(workspacePath) : process.cwd();
|
|
115
145
|
const settings = (0, settingsLoader_1.loadSettingsForRoot)(cwd);
|
|
@@ -124,11 +154,53 @@ function mcpOperateCommand(program) {
|
|
|
124
154
|
process.stderr.write(`autodev mcp-operate → ${endpoint}\n`);
|
|
125
155
|
const send = (msg) => { process.stdout.write(JSON.stringify(msg) + '\n'); };
|
|
126
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();
|
|
127
198
|
// Drain in-flight requests before exiting when stdin closes, so a reply
|
|
128
199
|
// in progress is never clipped.
|
|
129
200
|
let inflight = 0;
|
|
130
201
|
let closed = false;
|
|
131
202
|
const maybeExit = () => { if (closed && inflight === 0) {
|
|
203
|
+
socket?.destroy();
|
|
132
204
|
process.exit(0);
|
|
133
205
|
} };
|
|
134
206
|
rl.on('line', async (line) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpOperate.js","sourceRoot":"","sources":["../../src/commands/mcpOperate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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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"}
|
|
@@ -195,6 +195,29 @@ promptFilePath, stdoutFile, exitFile, log, opts = {}) {
|
|
|
195
195
|
return;
|
|
196
196
|
}
|
|
197
197
|
// -------------------------------------------------------------------------
|
|
198
|
+
// Watchdog — grok can wedge internally (e.g. retrying a failing tool call
|
|
199
|
+
// forever) WITHOUT ever exiting, which leaves the process alive, the exit
|
|
200
|
+
// file unwritten, and the task loop blocked indefinitely on this one task
|
|
201
|
+
// while new work piles up. Kill a run that overruns a hard time budget or
|
|
202
|
+
// floods tool-output errors, so `close` fires, the exit file is written, and
|
|
203
|
+
// the loop fails this task cleanly and moves on.
|
|
204
|
+
// -------------------------------------------------------------------------
|
|
205
|
+
const GROK_MAX_RUN_MS = Number(process.env.AUTODEV_GROK_MAX_RUN_MS) || 10 * 60_000;
|
|
206
|
+
const GROK_MAX_TOOL_ERRORS = Number(process.env.AUTODEV_GROK_MAX_TOOL_ERRORS) || 25;
|
|
207
|
+
let toolErrorCount = 0;
|
|
208
|
+
const killGrok = (why) => {
|
|
209
|
+
log(`Grok watchdog: ${why} — killing run`);
|
|
210
|
+
try {
|
|
211
|
+
fs.appendFileSync(stdoutFile, `\n[Grok watchdog: ${why}]\n`, 'utf8');
|
|
212
|
+
}
|
|
213
|
+
catch { /* ignore */ }
|
|
214
|
+
try {
|
|
215
|
+
child.kill('SIGKILL');
|
|
216
|
+
}
|
|
217
|
+
catch { /* ignore */ }
|
|
218
|
+
};
|
|
219
|
+
const watchdog = setTimeout(() => killGrok(`exceeded ${Math.round(GROK_MAX_RUN_MS / 60_000)}min time budget`), GROK_MAX_RUN_MS);
|
|
220
|
+
// -------------------------------------------------------------------------
|
|
198
221
|
// Stream stdout — each line is a streaming-json object.
|
|
199
222
|
// -------------------------------------------------------------------------
|
|
200
223
|
const rl = readline.createInterface({ input: child.stdout });
|
|
@@ -255,9 +278,19 @@ promptFilePath, stdoutFile, exitFile, log, opts = {}) {
|
|
|
255
278
|
const text = chunk.toString('utf8').trim();
|
|
256
279
|
if (text) {
|
|
257
280
|
log(`Grok stderr: ${text}`);
|
|
281
|
+
// A flood of tool-output errors means grok is stuck retrying a tool it
|
|
282
|
+
// can't complete — kill it now rather than waiting out the time budget.
|
|
283
|
+
const hits = (text.match(/tool_output_error/g) || []).length;
|
|
284
|
+
if (hits) {
|
|
285
|
+
toolErrorCount += hits;
|
|
286
|
+
if (toolErrorCount >= GROK_MAX_TOOL_ERRORS) {
|
|
287
|
+
killGrok(`${toolErrorCount} tool-output errors (stuck retry loop)`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
258
290
|
}
|
|
259
291
|
});
|
|
260
292
|
child.on('close', (code) => {
|
|
293
|
+
clearTimeout(watchdog);
|
|
261
294
|
rl.close();
|
|
262
295
|
_activeChildren.delete(root);
|
|
263
296
|
_busyRoots.delete(root);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grokTuiProvider.js","sourceRoot":"","sources":["../../src/providers/grokTuiProvider.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,mCAAmC;AACnC,EAAE;AACF,2EAA2E;AAC3E,+DAA+D;AAC/D,yEAAyE;AACzE,+EAA+E;AAC/E,+EAA+E;AAC/E,kFAAkF;AAClF,EAAE;AACF,WAAW;AACX,kDAAkD;AAClD,sEAAsE;AACtE,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,0DAA0D;AAC1D,EAAE;AACF,uEAAuE;AACvE,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyC9E,sCAEC;AA0CD,
|
|
1
|
+
{"version":3,"file":"grokTuiProvider.js","sourceRoot":"","sources":["../../src/providers/grokTuiProvider.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,mCAAmC;AACnC,EAAE;AACF,2EAA2E;AAC3E,+DAA+D;AAC/D,yEAAyE;AACzE,+EAA+E;AAC/E,+EAA+E;AAC/E,kFAAkF;AAClF,EAAE;AACF,WAAW;AACX,kDAAkD;AAClD,sEAAsE;AACtE,6DAA6D;AAC7D,EAAE;AACF,yEAAyE;AACzE,0DAA0D;AAC1D,EAAE;AACF,uEAAuE;AACvE,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyC9E,sCAEC;AA0CD,wCAoKC;AAGD,8CAYC;AAGD,8CAcC;AAQD,kDAKC;AAGD,0DAMC;AAKD,wDAEC;AApTD,2CAA6B;AAC7B,uCAAyB;AACzB,mDAAqC;AACrC,6DAA+C;AAC/C,mCAAoC;AACpC,4CAAiD;AACjD,kDAAgD;AAGhD,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,sDAAsD;AACzC,QAAA,kBAAkB,GAAG,qBAAqB,CAAC;AAExD,2EAA2E;AAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;IAChD,6EAA6E;IAC7E,iEAAiE;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,EAAE,CAAC;AAEL,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,gDAAgD;AAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AAErC,kFAAkF;AAClF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsC,CAAC;AAEtE,sEAAsE;AACtE,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,aAAqB,EAAE,QAAiC,EAAE;IAC7F,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QACpE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;QAC9H,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAChC,CAAC;AAoBD;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,IAAY;AACZ,kEAAkE;AAClE,cAAsB,EACtB,UAAkB,EAClB,QAAgB,EAChB,GAA0B,EAC1B,OAAuB,EAAE;IAEzB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAEpB,4EAA4E;IAC5E,0EAA0E;IAC1E,6CAA6C;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC;IAEnD,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC;QACjD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,GAAG,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,UAAU,GAAG,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAA,mBAAU,GAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC;gBAAC,IAAA,4BAAa,EAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACzE,GAAG,CAAC,gCAAgC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,UAAU,GAAG,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,yBAAyB,UAAU,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC;QAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxE,IAAI,CAAC;QAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAErB,IAAI,KAAiC,CAAC;IACtC,IAAI,CAAC;QACH,KAAK,GAAG,aAAa,CAAC,KAAK,CACzB,QAAQ,EACR;YACE,GAAG,SAAS;YACZ,kBAAkB;YAClB,OAAO,EAAE,IAAI;YACb,GAAG,WAAW;YACd,eAAe,EAAE,cAAc;YAC/B,iBAAiB,EAAE,gBAAgB;SACpC,EACD;YACE,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CACF,CAAC;QACF,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,QAAQ,EAAE,CAAC;QAClB,MAAM,GAAG,GAAI,QAAkB,EAAE,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,GAAG,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC;YAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,wBAAwB,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACvG,IAAI,CAAC;YAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACzE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,6EAA6E;IAC7E,iDAAiD;IACjD,4EAA4E;IAC5E,MAAM,eAAe,GAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;IACvF,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAC;IACpF,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAQ,EAAE;QACrC,GAAG,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC;YAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,qBAAqB,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpG,IAAI,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,CACzB,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,EACjF,eAAe,CAChB,CAAC;IAEF,4EAA4E;IAC5E,wDAAwD;IACxD,4EAA4E;IAC5E,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAO,EAAE,CAAC,CAAC;IAC9D,wEAAwE;IACxE,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,yEAAyE;IACzE,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC7B,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YACrC,kEAAkE;YAClE,IAAI,CAAC;gBAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAW,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAEpC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5C,2BAA2B;YAC3B,MAAM,IAAI,GAAW,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;YAC9E,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC;oBAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrE,IAAI,OAAO,EAAE,CAAC;oBAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;gBAAC,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAW,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC1D,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC;gBAAC,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,kBAAkB,MAAM,KAAK,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACtG,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,+DAA+D;YAC/D,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAChC,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,+DAA+D;IACjE,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;YAC5B,uEAAuE;YACvE,wEAAwE;YACxE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC7D,IAAI,IAAI,EAAE,CAAC;gBACT,cAAc,IAAI,IAAI,CAAC;gBACvB,IAAI,cAAc,IAAI,oBAAoB,EAAE,CAAC;oBAC3C,QAAQ,CAAC,GAAG,cAAc,wCAAwC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;QACxC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;QAC3B,GAAG,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QACvC,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtF,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC;YAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,QAAQ,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,SAAgB,iBAAiB,CAC/B,IAAY,EACZ,cAAsB,EACtB,UAAkB,EAClB,QAAgB,EAChB,GAA0B,EAC1B,KAAc,EACd,UAAuB;IAEvB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC9D,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU;KAC1D,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,SAAgB,iBAAiB,CAC/B,IAAY,EACZ,cAAsB;AACtB,oEAAoE;AACpE,iBAAqC,EACrC,UAAkB,EAClB,QAAgB,EAChB,GAA0B,EAC1B,KAAc,EACd,UAAuB;IAEvB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC9D,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU;KACvF,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,yEAAyE;AACzE,2EAA2E;AAC3E,qEAAqE;AACrE,8EAA8E;AAC9E,SAAgB,mBAAmB,CAAC,IAAY,EAAE,IAA2B;IAC3E,sEAAsE;IACtE,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAClG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,uEAAuE;AACvE,SAAgB,uBAAuB;IACrC,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IACD,eAAe,CAAC,KAAK,EAAE,CAAC;IACxB,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAC9E,SAAgB,sBAAsB,CAAC,aAAqB;IAC1D,OAAO,6BAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AACjD,CAAC"}
|