@onlyne/node-host 3.0.0 → 3.2.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 (57) hide show
  1. package/README.md +22 -0
  2. package/dist/acquire.d.ts +62 -0
  3. package/dist/acquire.d.ts.map +1 -0
  4. package/dist/acquire.js +146 -0
  5. package/dist/acquire.js.map +1 -0
  6. package/dist/host-text.d.ts +2 -0
  7. package/dist/host-text.d.ts.map +1 -0
  8. package/dist/host-text.js +103 -0
  9. package/dist/host-text.js.map +1 -0
  10. package/dist/i18n.d.ts +9 -0
  11. package/dist/i18n.d.ts.map +1 -0
  12. package/dist/i18n.js +19 -0
  13. package/dist/i18n.js.map +1 -0
  14. package/dist/index.d.ts +29 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +74 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/keys.d.ts +20 -0
  19. package/dist/keys.d.ts.map +1 -0
  20. package/dist/keys.js +144 -0
  21. package/dist/keys.js.map +1 -0
  22. package/dist/log.d.ts +43 -0
  23. package/dist/log.d.ts.map +1 -0
  24. package/dist/log.js +77 -0
  25. package/dist/log.js.map +1 -0
  26. package/dist/network.d.ts +27 -0
  27. package/dist/network.d.ts.map +1 -0
  28. package/dist/network.js +350 -0
  29. package/dist/network.js.map +1 -0
  30. package/dist/node.d.ts +20 -0
  31. package/dist/node.d.ts.map +1 -0
  32. package/dist/node.js +153 -0
  33. package/dist/node.js.map +1 -0
  34. package/dist/store.d.ts +44 -0
  35. package/dist/store.d.ts.map +1 -0
  36. package/dist/store.js +219 -0
  37. package/dist/store.js.map +1 -0
  38. package/dist/tui-text.d.ts +37 -0
  39. package/dist/tui-text.d.ts.map +1 -0
  40. package/dist/tui-text.js +69 -0
  41. package/dist/tui-text.js.map +1 -0
  42. package/dist/tui.d.ts +19 -0
  43. package/dist/tui.d.ts.map +1 -0
  44. package/dist/tui.js +400 -0
  45. package/dist/tui.js.map +1 -0
  46. package/dist/types.d.ts +62 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +46 -10
  51. package/src/i18n.ts +0 -22
  52. package/src/index.ts +0 -80
  53. package/src/keys.ts +0 -158
  54. package/src/log.ts +0 -52
  55. package/src/network.ts +0 -382
  56. package/src/tui-text.ts +0 -73
  57. package/src/tui.ts +0 -318
package/dist/tui.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { type OnlyneNode } from '@onlyne/lib';
2
+ import type { LogRing } from './log.ts';
3
+ /**
4
+ * The gateway's foreground surface: one screen for the peers it discovered, the trust stage
5
+ * of each, and the four actions that change one. Every confirmation shows the fingerprint
6
+ * first, because that string — not the node id — is what the two operators compare.
7
+ */
8
+ export declare class GatewayTui {
9
+ #private;
10
+ private readonly node;
11
+ private readonly ring;
12
+ private readonly endpoint;
13
+ private readonly onChange;
14
+ private readonly status?;
15
+ constructor(node: OnlyneNode, ring: LogRing, endpoint: string, onChange?: () => void, status?: (() => Promise<string[]>) | undefined);
16
+ start(): Promise<void>;
17
+ close(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,UAAU,EAAmB,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAiCxC;;;;GAIG;AACH,qBAAa,UAAU;;IAYnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAJP,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,IAAsB,EACtC,MAAM,CAAC,GAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,aAAA;IAG7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgO7B"}
package/dist/tui.js ADDED
@@ -0,0 +1,400 @@
1
+ import { trustPhase } from '@onlyne/lib';
2
+ import { t } from "./tui-text.js";
3
+ const PHASE_KEY = {
4
+ exchanged: 'phase.exchanged',
5
+ requested: 'phase.requested',
6
+ invited: 'phase.invited',
7
+ revoked: 'phase.revoked',
8
+ };
9
+ const NO_PHASE = '—';
10
+ const SHORT = (node) => node.split(':').pop() ?? node;
11
+ function failureText(error) {
12
+ if (error instanceof Error && 'error' in error) {
13
+ const inner = error.error;
14
+ if (typeof inner?.message === 'string')
15
+ return inner.message;
16
+ }
17
+ return String(error);
18
+ }
19
+ /**
20
+ * The gateway's foreground surface: one screen for the peers it discovered, the trust stage
21
+ * of each, and the four actions that change one. Every confirmation shows the fingerprint
22
+ * first, because that string — not the node id — is what the two operators compare.
23
+ */
24
+ export class GatewayTui {
25
+ node;
26
+ ring;
27
+ endpoint;
28
+ onChange;
29
+ status;
30
+ #rows = [];
31
+ #index = 0;
32
+ #mode = { kind: 'list' };
33
+ #input = '';
34
+ #message = '';
35
+ #busy = false;
36
+ #closed = false;
37
+ #refreshTimer;
38
+ #statusLines = [];
39
+ constructor(node, ring, endpoint, onChange = () => undefined, status) {
40
+ this.node = node;
41
+ this.ring = ring;
42
+ this.endpoint = endpoint;
43
+ this.onChange = onChange;
44
+ this.status = status;
45
+ }
46
+ async start() {
47
+ process.stdout.write('\x1b[?1049h\x1b[?25l');
48
+ if (process.stdin.isTTY)
49
+ process.stdin.setRawMode(true);
50
+ process.stdin.resume();
51
+ process.stdin.setEncoding('utf8');
52
+ process.stdin.on('data', this.#onData);
53
+ process.stdout.on('resize', this.#onResize);
54
+ await this.#refresh();
55
+ this.#refreshTimer = setInterval(() => { void this.#refresh(); }, 1000);
56
+ }
57
+ async close() {
58
+ if (this.#closed)
59
+ return;
60
+ this.#closed = true;
61
+ clearInterval(this.#refreshTimer);
62
+ process.stdin.off('data', this.#onData);
63
+ process.stdout.off('resize', this.#onResize);
64
+ process.stdin.pause();
65
+ if (process.stdin.isTTY)
66
+ process.stdin.setRawMode(false);
67
+ process.stdout.write('\x1b[?25h\x1b[?1049l');
68
+ }
69
+ #onResize = () => { this.#draw(); };
70
+ #onData = (chunk) => {
71
+ if (this.#closed)
72
+ return;
73
+ // One `data` event can carry a whole paste or a burst of keystrokes, so it is split into
74
+ // keys rather than treated as one. Each key runs in order; `#busy` still gates actions.
75
+ for (const token of tokens(chunk))
76
+ void this.#handle(token);
77
+ };
78
+ async #handle(token) {
79
+ if (this.#busy)
80
+ return;
81
+ if (this.#mode.kind === 'confirm') {
82
+ if (token === 'y')
83
+ await this.#settle(true);
84
+ else if (token === 'n' || token === 'esc') {
85
+ this.#mode = { kind: 'list' };
86
+ this.#message = t('notice.cancelled');
87
+ this.#draw();
88
+ }
89
+ return;
90
+ }
91
+ if (this.#mode.kind === 'input') {
92
+ if (token === 'esc') {
93
+ this.#mode = { kind: 'list' };
94
+ this.#input = '';
95
+ this.#draw();
96
+ return;
97
+ }
98
+ if (token === 'enter') {
99
+ await this.#connect();
100
+ return;
101
+ }
102
+ if (token === 'backspace') {
103
+ this.#input = this.#input.slice(0, -1);
104
+ this.#draw();
105
+ return;
106
+ }
107
+ if (typeof token === 'string' && token.length === 1 && token >= ' ') {
108
+ this.#input += token;
109
+ this.#draw();
110
+ }
111
+ return;
112
+ }
113
+ if (token === 'q') {
114
+ await this.close();
115
+ this.onChange();
116
+ return;
117
+ }
118
+ if (token === 'up') {
119
+ this.#move(-1);
120
+ return;
121
+ }
122
+ if (token === 'down') {
123
+ this.#move(1);
124
+ return;
125
+ }
126
+ if (token === 'c') {
127
+ this.#mode = { kind: 'input' };
128
+ this.#input = '';
129
+ this.#message = t('notice.enterAddress');
130
+ this.#draw();
131
+ return;
132
+ }
133
+ const row = this.#rows[this.#index];
134
+ if (row === undefined)
135
+ return;
136
+ if (token === 't') {
137
+ await this.#begin(row);
138
+ return;
139
+ }
140
+ if (token === 'a') {
141
+ await this.#accept(row);
142
+ return;
143
+ }
144
+ if (token === 'r') {
145
+ await this.#revoke(row);
146
+ return;
147
+ }
148
+ }
149
+ #move(delta) {
150
+ if (this.#rows.length === 0)
151
+ return;
152
+ this.#index = (this.#index + delta + this.#rows.length) % this.#rows.length;
153
+ this.#draw();
154
+ }
155
+ async #refresh() {
156
+ if (this.#closed)
157
+ return;
158
+ try {
159
+ const [trust, records, status] = await Promise.all([
160
+ this.node.trust.list(this.node.auth),
161
+ this.node.discovery.listRecords(),
162
+ this.status?.() ?? [],
163
+ ]);
164
+ this.#statusLines = status;
165
+ const handlers = new Map();
166
+ const resources = await this.node.resources.list(this.node.auth, { page_size: 100 });
167
+ for (const resource of resources.items) {
168
+ const list = handlers.get(resource.binding.handler) ?? [];
169
+ list.push(resource.resource_ref.id);
170
+ handlers.set(resource.binding.handler, list);
171
+ }
172
+ const rows = new Map();
173
+ for (const record of records) {
174
+ if (record.node_id === this.node.auth.actor)
175
+ continue;
176
+ rows.set(record.node_id, { node: record.node_id, endpoint: record.base_url });
177
+ }
178
+ for (const entry of trust) {
179
+ if (entry.node_id === this.node.auth.actor)
180
+ continue;
181
+ const row = rows.get(entry.node_id) ?? { node: entry.node_id };
182
+ rows.set(entry.node_id, { ...row, phase: trustPhase(entry), fingerprint: entry.fingerprint, endpoint: row.endpoint ?? entry.base_url });
183
+ }
184
+ for (const [handler, ids] of handlers) {
185
+ if (handler === this.node.auth.actor)
186
+ continue;
187
+ const row = rows.get(handler) ?? { node: handler };
188
+ rows.set(handler, { ...row, delivery: ids });
189
+ }
190
+ this.#rows = [...rows.values()].sort((a, b) => (a.node < b.node ? -1 : a.node > b.node ? 1 : 0));
191
+ if (this.#index >= this.#rows.length)
192
+ this.#index = Math.max(0, this.#rows.length - 1);
193
+ this.#draw();
194
+ }
195
+ catch (error) {
196
+ this.#message = t('notice.refreshFailed', { error: failureText(error) });
197
+ this.#draw();
198
+ }
199
+ }
200
+ async #begin(row) {
201
+ if (row.phase === 'exchanged') {
202
+ this.#message = t('notice.alreadyExchanged', { node: SHORT(row.node) });
203
+ this.#draw();
204
+ return;
205
+ }
206
+ await this.#run(async () => {
207
+ const exchange = await this.node.trust.begin(this.node.auth, row.node);
208
+ this.#mode = { kind: 'confirm', exchange };
209
+ this.#message = '';
210
+ });
211
+ }
212
+ async #accept(row) {
213
+ if (row.phase !== 'invited' || row.fingerprint === undefined) {
214
+ this.#message = t('notice.noRequest', { node: SHORT(row.node) });
215
+ this.#draw();
216
+ return;
217
+ }
218
+ const fingerprint = row.fingerprint;
219
+ await this.#run(async () => {
220
+ await this.node.trust.accept(this.node.auth, row.node, fingerprint);
221
+ this.#message = t('notice.accepted', { node: SHORT(row.node) });
222
+ });
223
+ }
224
+ async #revoke(row) {
225
+ if (row.phase === undefined) {
226
+ this.#message = t('notice.noTrust', { node: SHORT(row.node) });
227
+ this.#draw();
228
+ return;
229
+ }
230
+ await this.#run(async () => {
231
+ await this.node.trust.revoke(this.node.auth, row.node);
232
+ this.#message = t('notice.revoked', { node: SHORT(row.node) });
233
+ });
234
+ }
235
+ async #connect() {
236
+ const value = this.#input.trim();
237
+ this.#mode = { kind: 'list' };
238
+ this.#input = '';
239
+ if (value === '') {
240
+ this.#message = t('notice.noAddress');
241
+ this.#draw();
242
+ return;
243
+ }
244
+ await this.#run(async () => {
245
+ const url = new URL(value.includes('://') ? value : `http://${value}`);
246
+ url.pathname = url.pathname.replace(/\/+$/, '') || '/onlyne/v3';
247
+ const record = await this.node.discovery.observe(url.href, 'manual');
248
+ this.#message = t('notice.connected', { node: record.node_id });
249
+ });
250
+ }
251
+ async #settle(accept) {
252
+ const mode = this.#mode;
253
+ if (mode.kind !== 'confirm')
254
+ return;
255
+ if (!accept) {
256
+ this.#mode = { kind: 'list' };
257
+ this.#message = t('notice.cancelled');
258
+ this.#draw();
259
+ return;
260
+ }
261
+ this.#mode = { kind: 'list' };
262
+ await this.#run(async () => {
263
+ const entry = await mode.exchange.confirm(mode.exchange.fingerprint);
264
+ this.#message = t('notice.submitted', { node: SHORT(entry.node_id), phase: t(PHASE_KEY[trustPhase(entry)]) });
265
+ });
266
+ }
267
+ async #run(work) {
268
+ this.#busy = true;
269
+ this.#draw();
270
+ try {
271
+ await work();
272
+ }
273
+ catch (error) {
274
+ this.#message = t('notice.operationFailed', { error: failureText(error) });
275
+ }
276
+ finally {
277
+ this.#busy = false;
278
+ await this.#refresh();
279
+ }
280
+ }
281
+ #draw() {
282
+ if (this.#closed)
283
+ return;
284
+ // One cell short of the terminal width: writing the last cell auto-wraps, which would
285
+ // consume a second row per line and push the frame upward.
286
+ const width = Math.max(48, (process.stdout.columns ?? 80) - 1);
287
+ const height = Math.max(16, process.stdout.rows ?? 24);
288
+ const lines = [];
289
+ const push = (text) => { lines.push(fit(text, width)); };
290
+ push(t('title', { actor: this.node.auth.actor, endpoint: this.endpoint }));
291
+ push(rule(width));
292
+ if (this.#statusLines.length > 0) {
293
+ const budget = Math.max(3, Math.floor(height / 3));
294
+ for (const line of this.#statusLines.slice(0, budget))
295
+ push(line);
296
+ if (this.#statusLines.length > budget)
297
+ push('…');
298
+ push(rule(width));
299
+ }
300
+ const peerHeader = this.#rows.length === 0 ? t('peers.none') : t('peers.count', { count: this.#rows.length });
301
+ push(peerHeader);
302
+ for (const [index, row] of this.#rows.entries()) {
303
+ const marker = index === this.#index ? '▸' : ' ';
304
+ const phase = row.phase === undefined ? NO_PHASE : t(PHASE_KEY[row.phase]);
305
+ // Delivery is the binding's answer, not the trust stage's: a node can be exchanged and
306
+ // still receive nothing, and the handler can be a node with no key exchange at all.
307
+ const delivery = row.delivery === undefined ? '' : t('column.delivery');
308
+ push(`${marker} ${SHORT(row.node).padEnd(14)} ${phase.padEnd(14)} ${delivery.padEnd(8)} ${row.endpoint ?? ''}`);
309
+ }
310
+ push(rule(width));
311
+ const selected = this.#rows[this.#index];
312
+ if (selected === undefined) {
313
+ push(t('hint.idle'));
314
+ }
315
+ else {
316
+ push(selected.node);
317
+ push(`${t('label.fingerprint').padEnd(6)}${selected.fingerprint ?? t('value.notExchanged')}`);
318
+ push(`${t('label.endpoint').padEnd(6)}${selected.endpoint ?? t('value.unknown')}`);
319
+ if (selected.delivery !== undefined)
320
+ push(`${t('label.delivery').padEnd(6)}${selected.delivery.join(t('list.separator'))}`);
321
+ }
322
+ push(rule(width));
323
+ if (this.#mode.kind === 'confirm') {
324
+ const exchange = this.#mode.exchange;
325
+ push(t('confirm.title', { node: SHORT(exchange.node_id) }));
326
+ push(` ${exchange.fingerprint}`);
327
+ push(t('confirm.keys'));
328
+ }
329
+ else if (this.#mode.kind === 'input') {
330
+ push(t('input.prompt', { value: this.#input }));
331
+ }
332
+ else {
333
+ push(t('help.keys'));
334
+ }
335
+ if (this.#message !== '')
336
+ push(this.#message);
337
+ if (this.#busy)
338
+ push('…');
339
+ const logLines = Math.max(0, height - lines.length - 1);
340
+ if (logLines > 0) {
341
+ push(rule(width));
342
+ for (const line of this.ring.tail(logLines))
343
+ push(line);
344
+ }
345
+ let frame = '\x1b[H';
346
+ for (let index = 0; index < height; index++) {
347
+ frame += `${lines[index] ?? ''}\x1b[K${index === height - 1 ? '' : '\r\n'}`;
348
+ }
349
+ frame += '\x1b[J';
350
+ process.stdout.write(frame);
351
+ }
352
+ }
353
+ /** Splits one stdin chunk into keys: CSI arrows, a bare escape, and every printable character. */
354
+ function tokens(chunk) {
355
+ const out = [];
356
+ let rest = chunk.replace(/\x1b\[20[01]~/g, '');
357
+ while (rest.length > 0) {
358
+ if (rest.startsWith('\x1b[A')) {
359
+ out.push('up');
360
+ rest = rest.slice(3);
361
+ continue;
362
+ }
363
+ if (rest.startsWith('\x1b[B')) {
364
+ out.push('down');
365
+ rest = rest.slice(3);
366
+ continue;
367
+ }
368
+ if (rest.startsWith('\x1b[')) {
369
+ // Any other control sequence is not a key this surface uses; drop it whole.
370
+ const end = rest.slice(2).search(/[@-~]/);
371
+ rest = end < 0 ? '' : rest.slice(end + 3);
372
+ continue;
373
+ }
374
+ if (rest.startsWith('\x1b')) {
375
+ out.push('esc');
376
+ rest = rest.slice(1);
377
+ continue;
378
+ }
379
+ const character = rest[0];
380
+ if (character === '\r' || character === '\n')
381
+ out.push('enter');
382
+ else if (character === '\x7f' || character === '\b')
383
+ out.push('backspace');
384
+ else if (character === '\x03')
385
+ out.push('q');
386
+ else if (character >= ' ')
387
+ out.push(character);
388
+ rest = rest.slice(1);
389
+ }
390
+ return out;
391
+ }
392
+ function fit(text, width) {
393
+ if (text.length <= width)
394
+ return text;
395
+ return `${text.slice(0, width - 1)}…`;
396
+ }
397
+ function rule(width) {
398
+ return '─'.repeat(width);
399
+ }
400
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsD,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,CAAC,EAAmB,MAAM,eAAe,CAAC;AAYnD,MAAM,SAAS,GAAmC;IAChD,SAAS,EAAE,iBAAiB;IAC5B,SAAS,EAAE,iBAAiB;IAC5B,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;AAEtE,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAI,KAA0C,CAAC,KAAK,CAAC;QAChE,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAID;;;;GAIG;AACH,MAAM,OAAO,UAAU;IAYF;IACA;IACA;IACA;IACA;IAfnB,KAAK,GAAU,EAAE,CAAC;IAClB,MAAM,GAAG,CAAC,CAAC;IACX,KAAK,GAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/B,MAAM,GAAG,EAAE,CAAC;IACZ,QAAQ,GAAG,EAAE,CAAC;IACd,KAAK,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,KAAK,CAAC;IAChB,aAAa,CAAkC;IAC/C,YAAY,GAAa,EAAE,CAAC;IAE5B,YACmB,IAAgB,EAChB,IAAa,EACb,QAAgB,EAChB,WAAuB,GAAG,EAAE,CAAC,SAAS,EACtC,MAAgC;QAJhC,SAAI,GAAJ,IAAI,CAAY;QAChB,SAAI,GAAJ,IAAI,CAAS;QACb,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAA8B;QACtC,WAAM,GAAN,MAAM,CAA0B;IAChD,CAAC;IAEJ,KAAK,CAAC,KAAK;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS,GAAG,GAAS,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1C,OAAO,GAAG,CAAC,KAAa,EAAQ,EAAE;QAChC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,yFAAyF;QACzF,wFAAwF;QACxF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YAAE,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,KAAY;QACxB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,KAAK,KAAK,GAAG;gBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;iBACvC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAClI,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC/F,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACzD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;gBAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAC5G,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACnE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAChD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACxI,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAC9B,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACtD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACvD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBACjC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;aACtB,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;YACrF,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACpC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACtD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC/D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1I,CAAC;YACD,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACtC,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,SAAS;gBAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvF,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAQ;QACnB,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACjI,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAQ;QACpB,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC7D,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAQ;QACpB,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACtH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAClF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;YACvE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAe;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC5G,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAyB;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC;YAAC,MAAM,IAAI,EAAE,CAAC;QAAC,CAAC;QACrB,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;gBACrF,CAAC;YACP,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,sFAAsF;QACtF,2DAA2D;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,UAAU,CAAC,CAAC;QACjB,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACjD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3E,uFAAuF;YACvF,oFAAoF;YACpF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;QAClH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,WAAW,IAAI,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAC9F,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YACnF,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9H,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACrC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,KAAK,GAAG,QAAQ,CAAC;QACrB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5C,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9E,CAAC;QACD,KAAK,IAAI,QAAQ,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAID,kGAAkG;AAClG,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAClF,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACpF,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,4EAA4E;YAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjF,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC3B,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC3D,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACtE,IAAI,SAAS,KAAK,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACxC,IAAI,SAAS,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa;IACtC,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { NodeId, ThreadRef, TrustSeed } from "@onlyne/lib";
2
+ import type { Locale } from "./i18n.ts";
3
+ import type { AcquisitionPolicy } from "./acquire.ts";
4
+ /**
5
+ * Project-scoped configuration in `<project>/.onlyne/config.toml`.
6
+ *
7
+ * Delivery decisions are made by OMP's `judge` model role, so no model
8
+ * endpoint or model name belongs here.
9
+ */
10
+ export interface OnlyneConfig {
11
+ path: string;
12
+ language?: Locale;
13
+ /** Protocol membership, independent from the node identity. */
14
+ region: string;
15
+ node: {
16
+ id: NodeId;
17
+ key_ref?: string;
18
+ /** Where the node identity lives: the project's `.onlyne/keys`, the user's key store, or no key at all. */
19
+ key_scope?: "project" | "global" | "none";
20
+ };
21
+ server: {
22
+ bind: string;
23
+ /**
24
+ * The port this node answers on. Absent asks the operating system for one, and the
25
+ * chosen port is written back here: a node whose address changes on every start
26
+ * leaves every peer that recorded it calling a port nobody serves.
27
+ */
28
+ port?: number;
29
+ /** The externally reachable base URL when a reverse proxy fronts the node. */
30
+ public_url?: string;
31
+ };
32
+ threads: {
33
+ page_size: number;
34
+ };
35
+ /** Bootstrap contact seeds the node reaches at every start. */
36
+ discovery?: {
37
+ seeds?: string[];
38
+ };
39
+ /** Pinned peer fingerprints; an arriving key that matches is trusted without a prompt. */
40
+ trust?: TrustSeed[];
41
+ /** RFC 0018 §2: peers this node may approve without a human confirming first. */
42
+ acquisition?: AcquisitionPolicy;
43
+ }
44
+ /** One execution context the plugin registered for a delivered message. */
45
+ export interface ContextRecord {
46
+ alias: string;
47
+ node_id: NodeId;
48
+ main_agent_id: string;
49
+ source?: {
50
+ sender: NodeId;
51
+ id: string;
52
+ };
53
+ agent_id?: string;
54
+ session_file?: string;
55
+ parent_id?: string;
56
+ thread_ref?: ThreadRef;
57
+ summary: string;
58
+ state: "unbound" | "idle" | "running" | "parked" | "lost";
59
+ created_at: string;
60
+ bound_at?: string;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,2GAA2G;QAC3G,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;KAC1C,CAAC;IACF,MAAM,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb;;;;WAIG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,8EAA8E;QAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,+DAA+D;IAC/D,SAAS,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,0FAA0F;IAC1F,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,iFAAiF;IACjF,WAAW,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@onlyne/node-host",
3
- "version": "3.0.0",
3
+ "version": "3.2.0",
4
4
  "description": "Shared Onlyne node host pieces: identity keys, DNS-SD discovery, the gateway trust terminal, and message catalogs",
5
5
  "type": "module",
6
- "main": "./src/index.ts",
7
- "types": "./src/index.ts",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
8
  "license": "MIT",
9
9
  "repository": {
10
10
  "type": "git",
@@ -17,15 +17,51 @@
17
17
  "publishConfig": { "access": "public" },
18
18
  "engines": { "bun": ">=1.4.3" },
19
19
  "exports": {
20
- ".": "./src/index.ts",
21
- "./keys": "./src/keys.ts",
22
- "./network": "./src/network.ts",
23
- "./i18n": "./src/i18n.ts"
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "default": "./dist/index.js"
23
+ },
24
+ "./keys": {
25
+ "types": "./dist/keys.d.ts",
26
+ "default": "./dist/keys.js"
27
+ },
28
+ "./network": {
29
+ "types": "./dist/network.d.ts",
30
+ "default": "./dist/network.js"
31
+ },
32
+ "./i18n": {
33
+ "types": "./dist/i18n.d.ts",
34
+ "default": "./dist/i18n.js"
35
+ },
36
+ "./node": {
37
+ "types": "./dist/node.d.ts",
38
+ "default": "./dist/node.js"
39
+ },
40
+ "./store": {
41
+ "types": "./dist/store.d.ts",
42
+ "default": "./dist/store.js"
43
+ },
44
+ "./types": {
45
+ "types": "./dist/types.d.ts",
46
+ "default": "./dist/types.js"
47
+ },
48
+ "./acquire": {
49
+ "types": "./dist/acquire.d.ts",
50
+ "default": "./dist/acquire.js"
51
+ },
52
+ "./host-text": {
53
+ "types": "./dist/host-text.d.ts",
54
+ "default": "./dist/host-text.js"
55
+ }
56
+ },
57
+ "files": ["dist", "README.md", "LICENSE"],
58
+ "scripts": {
59
+ "build": "tsc",
60
+ "check": "tsc",
61
+ "prepack": "bun run build"
24
62
  },
25
- "files": ["src", "README.md", "LICENSE"],
26
- "scripts": { "check": "tsc --noEmit" },
27
63
  "dependencies": {
28
- "@onlyne/lib": "^3.0.0",
64
+ "@onlyne/lib": "^3.2.0",
29
65
  "bonjour-service": "^1.4.4"
30
66
  },
31
67
  "devDependencies": { "@types/bun": "^1.3.0", "typescript": "^5.9.0" }
package/src/i18n.ts DELETED
@@ -1,22 +0,0 @@
1
- export type Locale = 'en' | 'zh-CN';
2
- export const LOCALES: readonly Locale[] = ['en', 'zh-CN'];
3
-
4
- export function parseLocale(value: string | null | undefined): Locale | undefined {
5
- const language = value?.trim().toLowerCase().replace(/_/g, '-');
6
- if (language === 'en' || language?.startsWith('en-') || language?.startsWith('en.')) return 'en';
7
- if (language === 'zh' || language?.startsWith('zh-') || language?.startsWith('zh.')) return 'zh-CN';
8
- return undefined;
9
- }
10
-
11
- export function resolveLocale(explicit?: string | null, env: Record<string, string | undefined> = process.env): Locale {
12
- return parseLocale(explicit) ?? parseLocale(env.ONLYNE_LANG) ?? parseLocale(env.LC_ALL || env.LANG) ?? 'en';
13
- }
14
-
15
- let locale: Locale = resolveLocale();
16
- export function getLocale(): Locale { return locale; }
17
- export function setLocale(value: Locale): void { locale = value; }
18
- export type Catalog<K extends string> = Record<Locale, Record<K, string>>;
19
-
20
- export function createTranslator<K extends string>(catalog: Catalog<K>): (key: K, vars?: Record<string, string | number>) => string {
21
- return (key, vars) => catalog[getLocale()][key].replace(/\{(\w+)\}/g, (match, name: string) => vars?.[name] === undefined ? match : String(vars[name]));
22
- }