@avernet-plugin/deepseek-harness-channel-bcn 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 (54) hide show
  1. package/LEGAL.md +9 -0
  2. package/LICENSE +176 -0
  3. package/README.md +242 -0
  4. package/cordis.patch.yml +5 -0
  5. package/dist/bridge.d.ts +51 -0
  6. package/dist/bridge.d.ts.map +1 -0
  7. package/dist/bridge.js +695 -0
  8. package/dist/bridge.js.map +1 -0
  9. package/dist/config.d.ts +23 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +60 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/configure.d.ts +18 -0
  14. package/dist/configure.d.ts.map +1 -0
  15. package/dist/configure.js +207 -0
  16. package/dist/configure.js.map +1 -0
  17. package/dist/credentials.d.ts +15 -0
  18. package/dist/credentials.d.ts.map +1 -0
  19. package/dist/credentials.js +44 -0
  20. package/dist/credentials.js.map +1 -0
  21. package/dist/endpoint.d.ts +21 -0
  22. package/dist/endpoint.d.ts.map +1 -0
  23. package/dist/endpoint.js +156 -0
  24. package/dist/endpoint.js.map +1 -0
  25. package/dist/http-client.d.ts +28 -0
  26. package/dist/http-client.d.ts.map +1 -0
  27. package/dist/http-client.js +106 -0
  28. package/dist/http-client.js.map +1 -0
  29. package/dist/index.d.ts +8 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +42 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/protocol.d.ts +107 -0
  34. package/dist/protocol.d.ts.map +1 -0
  35. package/dist/protocol.js +157 -0
  36. package/dist/protocol.js.map +1 -0
  37. package/dist/route-tool.d.ts +5 -0
  38. package/dist/route-tool.d.ts.map +1 -0
  39. package/dist/route-tool.js +38 -0
  40. package/dist/route-tool.js.map +1 -0
  41. package/dist/session-identity.d.ts +22 -0
  42. package/dist/session-identity.d.ts.map +1 -0
  43. package/dist/session-identity.js +35 -0
  44. package/dist/session-identity.js.map +1 -0
  45. package/dist/task-tools.d.ts +9 -0
  46. package/dist/task-tools.d.ts.map +1 -0
  47. package/dist/task-tools.js +81 -0
  48. package/dist/task-tools.js.map +1 -0
  49. package/dist/ws-client.d.ts +62 -0
  50. package/dist/ws-client.d.ts.map +1 -0
  51. package/dist/ws-client.js +433 -0
  52. package/dist/ws-client.js.map +1 -0
  53. package/install-dsh.sh +95 -0
  54. package/package.json +80 -0
@@ -0,0 +1,433 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import WebSocket from 'ws';
3
+ import { BCN_PROTOCOL_VERSION, MAX_FRAME_BYTES, asNonEmptyString, asRecord, parseFrame, } from './protocol.js';
4
+ export class BcnWsClient {
5
+ options;
6
+ socket;
7
+ openingSocket;
8
+ connectedState = false;
9
+ stopped = true;
10
+ connecting = false;
11
+ reconnectDelayMs;
12
+ reconnectTimer;
13
+ heartbeatTimer;
14
+ requestCounter = 0;
15
+ eventSequence = 0;
16
+ pending = new Map();
17
+ requestHandlers = new Map();
18
+ eventHandlers = new Map();
19
+ queuedEvents = [];
20
+ queuedEventBytes = 0;
21
+ session;
22
+ constructor(options) {
23
+ this.options = options;
24
+ this.session = options.session;
25
+ this.reconnectDelayMs = options.config.reconnectInitialMs;
26
+ }
27
+ get connected() {
28
+ return this.connectedState && this.socket?.readyState === WebSocket.OPEN;
29
+ }
30
+ get botSession() {
31
+ return this.session;
32
+ }
33
+ start() {
34
+ if (!this.stopped)
35
+ return;
36
+ this.stopped = false;
37
+ this.scheduleConnect(0);
38
+ }
39
+ async stop() {
40
+ this.stopped = true;
41
+ this.connectedState = false;
42
+ if (this.reconnectTimer)
43
+ clearTimeout(this.reconnectTimer);
44
+ if (this.heartbeatTimer)
45
+ clearInterval(this.heartbeatTimer);
46
+ this.reconnectTimer = undefined;
47
+ this.heartbeatTimer = undefined;
48
+ this.rejectPending(new Error('BCN WebSocket client stopped'));
49
+ const socket = this.socket;
50
+ this.socket = undefined;
51
+ const openingSocket = this.openingSocket;
52
+ this.openingSocket = undefined;
53
+ openingSocket?.terminate();
54
+ if (!socket)
55
+ return;
56
+ socket.removeAllListeners();
57
+ if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {
58
+ await new Promise(resolve => {
59
+ const timer = setTimeout(() => {
60
+ socket.terminate();
61
+ resolve();
62
+ }, 1_000);
63
+ socket.once('close', () => {
64
+ clearTimeout(timer);
65
+ resolve();
66
+ });
67
+ socket.close();
68
+ });
69
+ }
70
+ }
71
+ onRequest(method, handler) {
72
+ const handlers = this.requestHandlers.get(method) ?? new Set();
73
+ handlers.add(handler);
74
+ this.requestHandlers.set(method, handlers);
75
+ return () => {
76
+ handlers.delete(handler);
77
+ if (handlers.size === 0)
78
+ this.requestHandlers.delete(method);
79
+ };
80
+ }
81
+ onEvent(event, handler) {
82
+ const handlers = this.eventHandlers.get(event) ?? new Set();
83
+ handlers.add(handler);
84
+ this.eventHandlers.set(event, handlers);
85
+ return () => {
86
+ handlers.delete(handler);
87
+ if (handlers.size === 0)
88
+ this.eventHandlers.delete(event);
89
+ };
90
+ }
91
+ sendResponse(id, ok, payload, error) {
92
+ const frame = {
93
+ type: 'res',
94
+ id,
95
+ ok,
96
+ ...(payload ? { payload } : {}),
97
+ ...(error ? { error } : {}),
98
+ };
99
+ this.sendFrameNow(frame);
100
+ }
101
+ sendEvent(event, payload) {
102
+ const frame = { type: 'event', event, payload, seq: ++this.eventSequence };
103
+ if (this.connected) {
104
+ this.sendFrameNow(frame);
105
+ return;
106
+ }
107
+ const bytes = Buffer.byteLength(JSON.stringify(frame), 'utf8');
108
+ if (bytes > MAX_FRAME_BYTES)
109
+ throw new Error('BCN event exceeds 2 MiB');
110
+ if (this.queuedEvents.length >= 1_000 || this.queuedEventBytes + bytes > 8 * MAX_FRAME_BYTES) {
111
+ throw new Error('BCN reconnect event buffer is full');
112
+ }
113
+ this.queuedEvents.push({ frame, bytes });
114
+ this.queuedEventBytes += bytes;
115
+ }
116
+ async sendRequest(method, params, timeoutMs = this.options.config.connectionTimeoutMs, signal) {
117
+ if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
118
+ throw new Error('BCN WebSocket is not connected');
119
+ }
120
+ if (signal?.aborted)
121
+ throw new Error('BCN request was aborted');
122
+ const id = this.nextRequestId();
123
+ const response = new Promise((resolve, reject) => {
124
+ const timer = setTimeout(() => {
125
+ this.pending.delete(id);
126
+ reject(new Error(`BCN request ${method} timed out`));
127
+ }, timeoutMs);
128
+ const pending = { resolve, reject, timer };
129
+ if (signal) {
130
+ const onAbort = () => {
131
+ clearTimeout(timer);
132
+ this.pending.delete(id);
133
+ reject(new Error(`BCN request ${method} was aborted`));
134
+ };
135
+ signal.addEventListener('abort', onAbort, { once: true });
136
+ pending.abortDispose = () => signal.removeEventListener('abort', onAbort);
137
+ }
138
+ this.pending.set(id, pending);
139
+ });
140
+ try {
141
+ this.sendFrameNow({ type: 'req', id, method, params });
142
+ }
143
+ catch (error) {
144
+ const pending = this.pending.get(id);
145
+ if (pending) {
146
+ clearTimeout(pending.timer);
147
+ pending.abortDispose?.();
148
+ this.pending.delete(id);
149
+ }
150
+ throw error;
151
+ }
152
+ return response;
153
+ }
154
+ scheduleConnect(delayMs) {
155
+ if (this.stopped || this.reconnectTimer)
156
+ return;
157
+ this.reconnectTimer = setTimeout(() => {
158
+ this.reconnectTimer = undefined;
159
+ void this.connectOnce();
160
+ }, delayMs);
161
+ }
162
+ async connectOnce() {
163
+ if (this.stopped || this.connecting)
164
+ return;
165
+ this.connecting = true;
166
+ try {
167
+ const socket = await this.openSocket();
168
+ if (this.stopped) {
169
+ socket.close();
170
+ return;
171
+ }
172
+ this.socket = socket;
173
+ this.installSocketListeners(socket);
174
+ const response = await this.sendRequest('bot.connect', {
175
+ bot_id: this.session.botUuid,
176
+ token: this.session.botToken,
177
+ protocol_version: BCN_PROTOCOL_VERSION,
178
+ });
179
+ const connected = parseConnectResponse(response, this.session.botUuid);
180
+ if (connected.token !== this.session.botToken) {
181
+ const rotated = { ...this.session, botToken: connected.token };
182
+ await this.options.onSessionChanged(rotated);
183
+ this.session = rotated;
184
+ }
185
+ this.connectedState = true;
186
+ this.reconnectDelayMs = this.options.config.reconnectInitialMs;
187
+ this.flushQueuedEvents();
188
+ this.startHeartbeat();
189
+ this.options.log?.info(`Connected to BCN with Bot WebSocket protocol v${connected.protocol_version} (bot_uuid=${connected.bot_uuid})`);
190
+ }
191
+ catch (error) {
192
+ this.connectedState = false;
193
+ const socket = this.socket;
194
+ this.socket = undefined;
195
+ socket?.removeAllListeners();
196
+ socket?.terminate();
197
+ this.rejectPending(new Error('BCN connection attempt failed'));
198
+ if (!this.stopped) {
199
+ this.options.log?.warn(`BCN connection failed; retrying in ${this.reconnectDelayMs}ms`);
200
+ this.scheduleConnect(this.reconnectDelayMs);
201
+ this.reconnectDelayMs = Math.min(this.reconnectDelayMs * 2, this.options.config.reconnectMaxMs);
202
+ }
203
+ void error;
204
+ }
205
+ finally {
206
+ this.connecting = false;
207
+ }
208
+ }
209
+ openSocket() {
210
+ return new Promise((resolve, reject) => {
211
+ // COSEC: the endpoint was resolved and screened before this client is
212
+ // created. The pinned lookup prevents DNS rebinding during the handshake.
213
+ const socket = new WebSocket(this.options.endpoint.webSocketUrl, {
214
+ lookup: this.options.endpoint.lookup,
215
+ maxPayload: MAX_FRAME_BYTES,
216
+ handshakeTimeout: this.options.config.connectionTimeoutMs,
217
+ });
218
+ this.openingSocket = socket;
219
+ let settled = false;
220
+ const cleanup = () => {
221
+ if (this.openingSocket === socket)
222
+ this.openingSocket = undefined;
223
+ socket.off('open', onOpen);
224
+ socket.off('error', onError);
225
+ socket.off('close', onClose);
226
+ };
227
+ const onOpen = () => {
228
+ if (settled)
229
+ return;
230
+ settled = true;
231
+ cleanup();
232
+ resolve(socket);
233
+ };
234
+ const onError = () => {
235
+ if (settled)
236
+ return;
237
+ settled = true;
238
+ cleanup();
239
+ socket.terminate();
240
+ reject(new Error('BCN WebSocket handshake failed'));
241
+ };
242
+ const onClose = () => {
243
+ if (settled)
244
+ return;
245
+ settled = true;
246
+ cleanup();
247
+ reject(new Error('BCN WebSocket closed during handshake'));
248
+ };
249
+ socket.once('open', onOpen);
250
+ socket.once('error', onError);
251
+ socket.once('close', onClose);
252
+ });
253
+ }
254
+ installSocketListeners(socket) {
255
+ socket.on('message', data => this.handleMessage(data));
256
+ socket.on('error', () => {
257
+ if (!this.stopped)
258
+ this.options.log?.warn('BCN WebSocket reported a transport error');
259
+ });
260
+ socket.on('close', () => {
261
+ if (socket !== this.socket)
262
+ return;
263
+ this.connectedState = false;
264
+ this.socket = undefined;
265
+ if (this.heartbeatTimer)
266
+ clearInterval(this.heartbeatTimer);
267
+ this.heartbeatTimer = undefined;
268
+ this.rejectPending(new Error('BCN WebSocket disconnected'));
269
+ if (!this.stopped)
270
+ this.scheduleConnect(this.reconnectDelayMs);
271
+ });
272
+ }
273
+ handleMessage(data) {
274
+ const buffer = Buffer.isBuffer(data)
275
+ ? data
276
+ : Array.isArray(data)
277
+ ? Buffer.concat(data)
278
+ : Buffer.from(data);
279
+ if (buffer.byteLength > MAX_FRAME_BYTES) {
280
+ this.options.log?.warn('Ignoring oversized BCN WebSocket frame');
281
+ return;
282
+ }
283
+ let value;
284
+ try {
285
+ value = JSON.parse(buffer.toString('utf8'));
286
+ }
287
+ catch {
288
+ this.options.log?.warn('Ignoring malformed BCN WebSocket JSON');
289
+ return;
290
+ }
291
+ const frame = parseFrame(value);
292
+ if (!frame) {
293
+ this.options.log?.warn('Ignoring invalid BCN WebSocket frame');
294
+ return;
295
+ }
296
+ if (frame.type === 'res') {
297
+ this.handleResponse(frame);
298
+ }
299
+ else if (frame.type === 'req') {
300
+ void this.handleRequest(frame);
301
+ }
302
+ else {
303
+ void this.handleEvent(frame);
304
+ }
305
+ }
306
+ handleResponse(frame) {
307
+ const pending = this.pending.get(frame.id);
308
+ if (!pending)
309
+ return;
310
+ clearTimeout(pending.timer);
311
+ pending.abortDispose?.();
312
+ this.pending.delete(frame.id);
313
+ pending.resolve(frame);
314
+ }
315
+ async handleRequest(frame) {
316
+ const handlers = this.requestHandlers.get(frame.method);
317
+ if (!handlers?.size) {
318
+ this.sendResponse(frame.id, false, undefined, {
319
+ code: 'NOT_FOUND',
320
+ message: `Unsupported BCN method: ${frame.method}`,
321
+ retryable: false,
322
+ });
323
+ return;
324
+ }
325
+ try {
326
+ for (const handler of handlers)
327
+ await handler(frame);
328
+ }
329
+ catch {
330
+ this.sendResponse(frame.id, false, undefined, {
331
+ code: 'INTERNAL_ERROR',
332
+ message: 'DeepSeek Harness could not process the BCN request',
333
+ retryable: false,
334
+ });
335
+ }
336
+ }
337
+ async handleEvent(frame) {
338
+ const handlers = this.eventHandlers.get(frame.event);
339
+ if (!handlers)
340
+ return;
341
+ for (const handler of handlers) {
342
+ try {
343
+ await handler(frame);
344
+ }
345
+ catch {
346
+ this.options.log?.warn(`BCN event handler failed for ${frame.event}`);
347
+ }
348
+ }
349
+ }
350
+ startHeartbeat() {
351
+ if (this.heartbeatTimer)
352
+ clearInterval(this.heartbeatTimer);
353
+ this.heartbeatTimer = setInterval(() => {
354
+ if (!this.connected)
355
+ return;
356
+ void this.sendRequest('bot.status', {
357
+ status: this.options.status?.() ?? 'idle',
358
+ dynamic_summary: 'DeepSeek Harness BCN channel active',
359
+ load: this.options.status?.() === 'busy' ? 1 : 0,
360
+ }).catch(() => {
361
+ this.options.log?.debug?.('BCN heartbeat did not receive a response');
362
+ });
363
+ }, this.options.config.heartbeatIntervalMs);
364
+ }
365
+ flushQueuedEvents() {
366
+ const queued = this.queuedEvents;
367
+ this.queuedEvents = [];
368
+ this.queuedEventBytes = 0;
369
+ for (const item of queued)
370
+ this.sendFrameNow(item.frame);
371
+ }
372
+ sendFrameNow(frame) {
373
+ if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
374
+ throw new Error('BCN WebSocket is not open');
375
+ }
376
+ const body = JSON.stringify(frame);
377
+ if (Buffer.byteLength(body, 'utf8') > MAX_FRAME_BYTES)
378
+ throw new Error('BCN frame exceeds 2 MiB');
379
+ this.socket.send(body);
380
+ }
381
+ rejectPending(error) {
382
+ for (const [id, pending] of this.pending) {
383
+ clearTimeout(pending.timer);
384
+ pending.abortDispose?.();
385
+ pending.reject(error);
386
+ this.pending.delete(id);
387
+ }
388
+ }
389
+ nextRequestId() {
390
+ this.requestCounter += 1;
391
+ return `dsh-${this.requestCounter.toString(36)}-${randomUUID().slice(0, 8)}`;
392
+ }
393
+ }
394
+ function parseConnectResponse(response, expectedBotUuid) {
395
+ if (!response.ok)
396
+ throw new Error(`BCN bot.connect failed with code ${response.error?.code ?? 'UNKNOWN'}`);
397
+ const payload = asRecord(response.payload);
398
+ const botUuid = asNonEmptyString(payload?.bot_uuid);
399
+ const token = asNonEmptyString(payload?.token);
400
+ const protocolVersion = payload?.protocol_version;
401
+ if (!botUuid || !token || typeof payload?.is_new !== 'boolean' || !Number.isSafeInteger(protocolVersion)) {
402
+ throw new Error('BCN bot.connect returned an invalid response');
403
+ }
404
+ if (botUuid !== expectedBotUuid)
405
+ throw new Error('BCN bot.connect returned a different Bot identity');
406
+ if (protocolVersion !== BCN_PROTOCOL_VERSION) {
407
+ throw new Error(`BCN selected unsupported Bot WebSocket protocol version ${String(protocolVersion)}`);
408
+ }
409
+ const envRecord = payload.env === undefined ? undefined : asRecord(payload.env);
410
+ if (payload.env !== undefined && !envRecord)
411
+ throw new Error('BCN bot.connect returned an invalid env map');
412
+ const env = envRecord ? normalizeStringMap(envRecord) : undefined;
413
+ return {
414
+ is_new: payload.is_new,
415
+ token,
416
+ bot_uuid: botUuid,
417
+ protocol_version: protocolVersion,
418
+ ...(typeof payload.min_supported_version === 'number'
419
+ ? { min_supported_version: payload.min_supported_version }
420
+ : {}),
421
+ ...(env ? { env } : {}),
422
+ };
423
+ }
424
+ function normalizeStringMap(value) {
425
+ const result = {};
426
+ for (const [key, item] of Object.entries(value)) {
427
+ if (!key || typeof item !== 'string')
428
+ throw new Error('BCN bot.connect returned an invalid env map');
429
+ result[key] = item;
430
+ }
431
+ return result;
432
+ }
433
+ //# sourceMappingURL=ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,SAAS,MAAM,IAAI,CAAC;AAI3B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,UAAU,GAOX,MAAM,eAAe,CAAC;AA0BvB,MAAM,OAAO,WAAW;IAkBO;IAjBrB,MAAM,CAAwB;IAC9B,aAAa,CAAwB;IACrC,cAAc,GAAG,KAAK,CAAC;IACvB,OAAO,GAAG,IAAI,CAAC;IACf,UAAU,GAAG,KAAK,CAAC;IACnB,gBAAgB,CAAS;IACzB,cAAc,CAA4C;IAC1D,cAAc,CAA6C;IAC3D,cAAc,GAAG,CAAC,CAAC;IACnB,aAAa,GAAG,CAAC,CAAC;IAClB,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,eAAe,GAAG,IAAI,GAAG,EAA+B,CAAC;IACzD,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,YAAY,GAAgD,EAAE,CAAC;IAC/D,gBAAgB,GAAG,CAAC,CAAC;IACrB,OAAO,CAAa;IAE5B,YAA6B,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;IAC5D,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IAC3E,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,IAAI,CAAC,cAAc;YAAE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,aAAa,EAAE,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YACvF,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;gBAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;oBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,SAAS,CAAC,MAAc,EAAE,OAAuB;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;QAC/E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,OAAqB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAgB,CAAC;QAC1E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC;IAED,YAAY,CACV,EAAU,EACV,EAAW,EACX,OAAiC,EACjC,KAA8B;QAE9B,MAAM,KAAK,GAAkB;YAC3B,IAAI,EAAE,KAAK;YACX,EAAE;YACF,EAAE;YACF,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,OAAgC;QACvD,MAAM,KAAK,GAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QACvF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/D,IAAI,KAAK,GAAG,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,GAAG,KAAK,GAAG,CAAC,GAAG,eAAe,EAAE,CAAC;YAC7F,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAc,EACd,MAA+B,EAC/B,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,EACnD,MAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,MAAM,YAAY,CAAC,CAAC,CAAC;YACvD,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,MAAM,OAAO,GAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,MAAM,cAAc,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1D,OAAO,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;gBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;gBACrD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC5B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAC5B,gBAAgB,EAAE,oBAAoB;aACvC,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvE,IAAI,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC/D,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACzB,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC/D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CACpB,iDAAiD,SAAS,CAAC,gBAAgB,cAAc,SAAS,CAAC,QAAQ,GAAG,CAC/G,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,MAAM,EAAE,kBAAkB,EAAE,CAAC;YAC7B,MAAM,EAAE,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,sCAAsC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBACxF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAClG,CAAC;YACD,KAAK,KAAK,CAAC;QACb,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,sEAAsE;YACtE,0EAA0E;YAC1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE;gBAC/D,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBACpC,UAAU,EAAE,eAAe;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB;aAC1D,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC5B,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM;oBAAE,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAClE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC,CAAC;YACF,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,MAAiB;QAC9C,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;gBAAE,OAAO;YACnC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,IAAI,CAAC,cAAc;gBAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,IAAa;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACnB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,uCAAuC,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,sCAAsC,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAoB;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,KAAmB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC5C,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,2BAA2B,KAAK,CAAC,MAAM,EAAE;gBAClD,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC5C,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,oDAAoD;gBAC7D,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAiB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,gCAAgC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC5B,KAAK,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;gBAClC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM;gBACzC,eAAe,EAAE,qCAAqC;gBACtD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACjD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,0CAA0C,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAEO,iBAAiB;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,YAAY,CAAC,KAAe;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAClG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,aAAa,CAAC,KAAY;QAChC,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QACzB,OAAO,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC/E,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,QAAuB,EAAE,eAAuB;IAC5E,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IAC3G,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,OAAO,EAAE,gBAAgB,CAAC;IAClD,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,OAAO,OAAO,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,KAAK,eAAe;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACtG,IAAI,eAAe,KAAK,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,2DAA2D,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5G,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK;QACL,QAAQ,EAAE,OAAO;QACjB,gBAAgB,EAAE,eAAe;QACjC,GAAG,CAAC,OAAO,OAAO,CAAC,qBAAqB,KAAK,QAAQ;YACnD,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE;YAC1D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrG,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/install-dsh.sh ADDED
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ set +x
4
+
5
+ profile="web"
6
+ endpoint=""
7
+ bot_name="DeepSeek Harness Bot"
8
+ package_spec="@avernet-plugin/deepseek-harness-channel-bcn"
9
+ start_dsh=true
10
+
11
+ usage() {
12
+ echo "Usage: install-dsh.sh --endpoint <url> [--profile <name>] [--bot-name <name>] [--package <npm-spec-or-path>] [--no-start]"
13
+ }
14
+
15
+ require_value() {
16
+ if [[ $# -lt 2 || -z "${2:-}" || "${2:-}" == --* ]]; then
17
+ echo "install-dsh.sh: $1 requires a value" >&2
18
+ exit 2
19
+ fi
20
+ }
21
+
22
+ while [[ $# -gt 0 ]]; do
23
+ case "$1" in
24
+ --endpoint)
25
+ require_value "$@"
26
+ endpoint="$2"
27
+ shift 2
28
+ ;;
29
+ --profile)
30
+ require_value "$@"
31
+ profile="$2"
32
+ shift 2
33
+ ;;
34
+ --bot-name)
35
+ require_value "$@"
36
+ bot_name="$2"
37
+ shift 2
38
+ ;;
39
+ --package)
40
+ require_value "$@"
41
+ package_spec="$2"
42
+ shift 2
43
+ ;;
44
+ --no-start)
45
+ start_dsh=false
46
+ shift
47
+ ;;
48
+ --help|-h)
49
+ usage
50
+ exit 0
51
+ ;;
52
+ *)
53
+ echo "install-dsh.sh: unknown option: $1" >&2
54
+ usage >&2
55
+ exit 2
56
+ ;;
57
+ esac
58
+ done
59
+
60
+ if [[ -z "$endpoint" ]]; then
61
+ echo "install-dsh.sh: --endpoint is required" >&2
62
+ exit 2
63
+ fi
64
+ if [[ ! "$profile" =~ ^[a-z0-9][a-z0-9-]{0,63}$ ]]; then
65
+ echo "install-dsh.sh: invalid DSH profile name" >&2
66
+ exit 2
67
+ fi
68
+ if ! command -v dsh >/dev/null 2>&1; then
69
+ echo "install-dsh.sh: dsh is not available on PATH" >&2
70
+ exit 1
71
+ fi
72
+
73
+ # Keep the short-lived registration Token out of package-manager and config-helper environments.
74
+ onboarding_token="${BCN_ONBOARDING_TOKEN:-}"
75
+ unset BCN_ONBOARDING_TOKEN
76
+
77
+ dsh plugin --profile "$profile" add -- "$package_spec"
78
+ dsh plugin --profile "$profile" exec dsh-bcn-configure -- \
79
+ --profile "$profile" \
80
+ --endpoint "$endpoint" \
81
+ --bot-name "$bot_name"
82
+
83
+ if [[ "$start_dsh" != true ]]; then
84
+ echo "Configured DSH profile $profile without starting it."
85
+ if [[ -n "$onboarding_token" ]]; then
86
+ echo "BCN_ONBOARDING_TOKEN was not persisted; provide it again on the first DSH start."
87
+ fi
88
+ exit 0
89
+ fi
90
+
91
+ echo "Starting DSH profile $profile."
92
+ if [[ -n "$onboarding_token" ]]; then
93
+ export BCN_ONBOARDING_TOKEN="$onboarding_token"
94
+ fi
95
+ exec dsh --profile "$profile"
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@avernet-plugin/deepseek-harness-channel-bcn",
3
+ "version": "0.1.0",
4
+ "description": "DeepSeek Harness channel bundle for the Avernet Bot Collaboration Network.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "dsh-bcn-configure": "dist/configure.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ },
16
+ "./cordis.patch.yml": "./cordis.patch.yml",
17
+ "./package.json": "./package.json"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "cordis.patch.yml",
22
+ "install-dsh.sh",
23
+ "README.md",
24
+ "LEGAL.md",
25
+ "LICENSE"
26
+ ],
27
+ "dsh": {
28
+ "bundle": {
29
+ "patch": "./cordis.patch.yml"
30
+ }
31
+ },
32
+ "scripts": {
33
+ "build": "tsc -p tsconfig.build.json",
34
+ "postbuild": "node -e \"require('node:fs').chmodSync('dist/configure.js', 0o755)\"",
35
+ "typecheck": "tsc -p tsconfig.json --noEmit",
36
+ "test": "node --import tsx --test test/*.test.ts",
37
+ "ci": "npm run typecheck && npm test && npm run build && npm pack --dry-run",
38
+ "prepack": "npm run build"
39
+ },
40
+ "dependencies": {
41
+ "js-yaml": "^4.2.0",
42
+ "ws": "^8.18.3"
43
+ },
44
+ "devDependencies": {
45
+ "@deepseek-ai/cordis": "4.0.2",
46
+ "@deepseek-ai/dsh-agent": "0.1.1-rc.2",
47
+ "@deepseek-ai/dsh-credentials": "0.1.1-rc.2",
48
+ "@deepseek-ai/dsh-llm": "0.1.1-rc.2",
49
+ "@deepseek-ai/dsh-session": "0.1.1-rc.2",
50
+ "@deepseek-ai/dsh-session-persistence": "0.1.1-rc.2",
51
+ "@deepseek-ai/dsh-tools": "0.1.1-rc.2",
52
+ "@deepseek-ai/schemastery": "3.18.1",
53
+ "@types/js-yaml": "^4.0.9",
54
+ "@types/node": "^22.15.0",
55
+ "@types/ws": "^8.5.13",
56
+ "tsx": "^4.20.6",
57
+ "typescript": "^5.9.2"
58
+ },
59
+ "engines": {
60
+ "node": ">=22.19.0"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "git+https://github.com/inclusionAI/Avernet.git",
65
+ "directory": "src/bcs/crates/plugins/deepseek-harness-channel-bcn"
66
+ },
67
+ "keywords": [
68
+ "deepseek-harness",
69
+ "dsh-plugin",
70
+ "cordis",
71
+ "bcn",
72
+ "bcs",
73
+ "multi-agent"
74
+ ],
75
+ "license": "Apache-2.0",
76
+ "publishConfig": {
77
+ "registry": "https://registry.npmjs.org/",
78
+ "access": "public"
79
+ }
80
+ }