@indigoai-us/hq-cloud 5.26.0 → 5.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +34 -0
- package/dist/bin/sync-runner.d.ts +38 -0
- package/dist/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +75 -1
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/sync/feature-flags.d.ts +136 -0
- package/dist/sync/feature-flags.d.ts.map +1 -0
- package/dist/sync/feature-flags.js +160 -0
- package/dist/sync/feature-flags.js.map +1 -0
- package/dist/sync/feature-flags.test.d.ts +24 -0
- package/dist/sync/feature-flags.test.d.ts.map +1 -0
- package/dist/sync/feature-flags.test.js +330 -0
- package/dist/sync/feature-flags.test.js.map +1 -0
- package/dist/sync/index.d.ts +10 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +5 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/logger.d.ts +61 -0
- package/dist/sync/logger.d.ts.map +1 -0
- package/dist/sync/logger.js +51 -0
- package/dist/sync/logger.js.map +1 -0
- package/dist/sync/logger.test.d.ts +19 -0
- package/dist/sync/logger.test.d.ts.map +1 -0
- package/dist/sync/logger.test.js +199 -0
- package/dist/sync/logger.test.js.map +1 -0
- package/dist/sync/metrics.d.ts +89 -0
- package/dist/sync/metrics.d.ts.map +1 -0
- package/dist/sync/metrics.js +105 -0
- package/dist/sync/metrics.js.map +1 -0
- package/dist/sync/metrics.test.d.ts +19 -0
- package/dist/sync/metrics.test.d.ts.map +1 -0
- package/dist/sync/metrics.test.js +280 -0
- package/dist/sync/metrics.test.js.map +1 -0
- package/dist/sync/push-receiver.d.ts +442 -0
- package/dist/sync/push-receiver.d.ts.map +1 -0
- package/dist/sync/push-receiver.js +782 -0
- package/dist/sync/push-receiver.js.map +1 -0
- package/dist/sync/push-receiver.test.d.ts +25 -0
- package/dist/sync/push-receiver.test.d.ts.map +1 -0
- package/dist/sync/push-receiver.test.js +477 -0
- package/dist/sync/push-receiver.test.js.map +1 -0
- package/dist/sync/push-transport.d.ts +84 -1
- package/dist/sync/push-transport.d.ts.map +1 -1
- package/dist/sync/push-transport.js +84 -0
- package/dist/sync/push-transport.js.map +1 -1
- package/dist/watcher.d.ts +113 -2
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +204 -25
- package/dist/watcher.js.map +1 -1
- package/package.json +9 -5
- package/src/bin/sync-runner.ts +102 -1
- package/src/index.ts +21 -0
- package/src/sync/feature-flags.test.ts +392 -0
- package/src/sync/feature-flags.ts +229 -0
- package/src/sync/index.ts +57 -2
- package/src/sync/logger.test.ts +241 -0
- package/src/sync/logger.ts +79 -0
- package/src/sync/metrics.test.ts +380 -0
- package/src/sync/metrics.ts +158 -0
- package/src/sync/push-receiver.test.ts +545 -0
- package/src/sync/push-receiver.ts +1077 -0
- package/src/sync/push-transport.ts +148 -1
- package/src/watcher.ts +299 -17
- package/test/e2e/sync/cross-tenant-isolation.test.ts +502 -0
- package/test/e2e/watcher-real-chokidar.test.ts +105 -0
package/dist/watcher.js
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* to be passed in for entity-aware S3 operations.
|
|
8
8
|
*/
|
|
9
9
|
import * as fs from "fs";
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { readFile, stat } from "node:fs/promises";
|
|
10
12
|
import * as path from "path";
|
|
11
13
|
import { watch } from "chokidar";
|
|
12
14
|
import { createIgnoreFilter, isWithinSizeLimit } from "./ignore.js";
|
|
@@ -165,9 +167,11 @@ export class SyncWatcher {
|
|
|
165
167
|
if (this.watcher)
|
|
166
168
|
return;
|
|
167
169
|
this.watcher = watch(this.hqRoot, {
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
|
|
170
|
+
// See toChokidarIgnored: chokidar's pre-stat descent probe has no stats
|
|
171
|
+
// hint, so a naive file-verdict prunes intermediate allowlist dirs
|
|
172
|
+
// before descending to their in-scope leaves. Keep a statless probe
|
|
173
|
+
// when EITHER the file or directory reading would survive the filter.
|
|
174
|
+
ignored: toChokidarIgnored(this.shouldSync, this.hqRoot),
|
|
171
175
|
persistent: true,
|
|
172
176
|
ignoreInitial: true,
|
|
173
177
|
awaitWriteFinish: {
|
|
@@ -251,6 +255,38 @@ export class SyncWatcher {
|
|
|
251
255
|
}
|
|
252
256
|
}
|
|
253
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Translate an emit-filter into chokidar's `ignored` predicate (true = SKIP).
|
|
260
|
+
*
|
|
261
|
+
* The subtlety this encodes: chokidar probes a candidate path for the descent
|
|
262
|
+
* decision BEFORE it has stat()ed it, so `stats` is `undefined` on that first
|
|
263
|
+
* call — and if we say "ignore" there, chokidar prunes the subtree and never
|
|
264
|
+
* descends. In allowlist mode (`.hqinclude`) the in-scope leaves
|
|
265
|
+
* (`companies/*\/knowledge/`) live UNDER intermediate dirs (`companies/`,
|
|
266
|
+
* `companies/<slug>/`) that only survive the filter when queried as a
|
|
267
|
+
* directory (the ancestor matcher fires for `isDir=true` only). With no stats
|
|
268
|
+
* hint we don't know if the candidate is that ancestor dir or an in-scope
|
|
269
|
+
* file, so we must NOT prune when EITHER reading would keep it. The real
|
|
270
|
+
* isDir-accurate verdict is reapplied at event time (TreeWatcher.handleEvent
|
|
271
|
+
* re-checks with the known kind), so this only widens descent, never emit.
|
|
272
|
+
*/
|
|
273
|
+
function toChokidarIgnored(shouldEmit, hqRoot) {
|
|
274
|
+
const root = path.resolve(hqRoot);
|
|
275
|
+
return (filePath, stats) => {
|
|
276
|
+
// The watched root itself must NEVER be ignored, or chokidar tears down
|
|
277
|
+
// the whole watch. (shouldEmit returns false for it — it's not a valid
|
|
278
|
+
// emit target — so we special-case it here.)
|
|
279
|
+
if (path.resolve(filePath) === root)
|
|
280
|
+
return false;
|
|
281
|
+
const isDir = stats?.isDirectory();
|
|
282
|
+
if (isDir === undefined) {
|
|
283
|
+
// Pre-stat descent probe: keep the path if it could be an in-scope file
|
|
284
|
+
// OR an ancestor directory of one.
|
|
285
|
+
return !(shouldEmit(filePath, false) || shouldEmit(filePath, true));
|
|
286
|
+
}
|
|
287
|
+
return !shouldEmit(filePath, isDir);
|
|
288
|
+
};
|
|
289
|
+
}
|
|
254
290
|
/**
|
|
255
291
|
* Build the composite emit-decision predicate. Returns true when a change to
|
|
256
292
|
* `absolutePath` SHOULD wake the watcher (i.e. it survives every exclusion
|
|
@@ -285,16 +321,6 @@ export function createWatchPathFilter(hqRoot, personalMode = false) {
|
|
|
285
321
|
return true;
|
|
286
322
|
};
|
|
287
323
|
}
|
|
288
|
-
/**
|
|
289
|
-
* Chokidar-backed file watcher that emits a single debounced `changed` signal
|
|
290
|
-
* after a {@link debounceMs} quiet window, coalescing bursts. It honors the
|
|
291
|
-
* full exclusion stack via {@link createWatchPathFilter}, so excluded paths
|
|
292
|
-
* (`.env`, `output/`, `.git/`, `companies/` in personalMode, …) never emit.
|
|
293
|
-
*
|
|
294
|
-
* Lifecycle: {@link start} (idempotent), {@link stop}, {@link dispose}. Stop
|
|
295
|
-
* closes the chokidar watcher (releasing fds) and cancels any pending debounce
|
|
296
|
-
* timer. dispose() is stop() + permanent shutdown.
|
|
297
|
-
*/
|
|
298
324
|
export class TreeWatcher {
|
|
299
325
|
hqRoot;
|
|
300
326
|
debounceMs;
|
|
@@ -303,6 +329,8 @@ export class TreeWatcher {
|
|
|
303
329
|
watcher = null;
|
|
304
330
|
timer = null;
|
|
305
331
|
listeners = new Set();
|
|
332
|
+
/** Paths accumulated for the current (in-flight) debounce window. */
|
|
333
|
+
pending = new Map();
|
|
306
334
|
disposed = false;
|
|
307
335
|
constructor(opts) {
|
|
308
336
|
this.hqRoot = opts.hqRoot;
|
|
@@ -311,7 +339,14 @@ export class TreeWatcher {
|
|
|
311
339
|
this.shouldEmit =
|
|
312
340
|
opts.pathFilter ?? createWatchPathFilter(opts.hqRoot, opts.personalMode ?? false);
|
|
313
341
|
}
|
|
314
|
-
/**
|
|
342
|
+
/**
|
|
343
|
+
* Register a debounced-`changed` listener. Returns an unsubscribe fn.
|
|
344
|
+
*
|
|
345
|
+
* Listeners receive a {@link TreeChangeBatch} of the paths that changed in
|
|
346
|
+
* the settled window. Existing US-003 callers that only need the "something
|
|
347
|
+
* changed" signal can ignore the argument — the contract is backwards
|
|
348
|
+
* compatible (a zero-arg callback still type-checks).
|
|
349
|
+
*/
|
|
315
350
|
onChange(listener) {
|
|
316
351
|
this.listeners.add(listener);
|
|
317
352
|
return () => this.listeners.delete(listener);
|
|
@@ -324,16 +359,15 @@ export class TreeWatcher {
|
|
|
324
359
|
if (this.disposed || this.watcher)
|
|
325
360
|
return;
|
|
326
361
|
this.watcher = watch(this.hqRoot, {
|
|
327
|
-
//
|
|
328
|
-
//
|
|
329
|
-
//
|
|
330
|
-
//
|
|
331
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
},
|
|
362
|
+
// `ignored` returns true to SKIP. chokidar probes a candidate for the
|
|
363
|
+
// descent decision BEFORE stat()ing it (stats undefined on that call),
|
|
364
|
+
// so a naive `!shouldEmit(path, stats?.isDirectory())` treats the
|
|
365
|
+
// statless probe as a file and prunes intermediate dirs (`companies/`)
|
|
366
|
+
// that only survive the allowlist filter as directories — starving the
|
|
367
|
+
// in-scope leaves below them. toChokidarIgnored keeps a statless probe
|
|
368
|
+
// when EITHER the file or the directory reading would; the accurate
|
|
369
|
+
// isDir verdict is reapplied at event time in handleEvent.
|
|
370
|
+
ignored: toChokidarIgnored(this.shouldEmit, this.hqRoot),
|
|
337
371
|
persistent: true,
|
|
338
372
|
ignoreInitial: true,
|
|
339
373
|
awaitWriteFinish: {
|
|
@@ -362,6 +396,9 @@ export class TreeWatcher {
|
|
|
362
396
|
// through (or a synthetic test event) is re-checked here.
|
|
363
397
|
if (!this.shouldEmit(absolutePath, false))
|
|
364
398
|
return;
|
|
399
|
+
const abs = path.resolve(absolutePath);
|
|
400
|
+
const rel = path.relative(this.hqRoot, abs).split(path.sep).join("/");
|
|
401
|
+
this.pending.set(abs, rel);
|
|
365
402
|
this.arm();
|
|
366
403
|
}
|
|
367
404
|
arm() {
|
|
@@ -377,9 +414,17 @@ export class TreeWatcher {
|
|
|
377
414
|
emit() {
|
|
378
415
|
if (this.disposed)
|
|
379
416
|
return;
|
|
417
|
+
// Snapshot + clear the accumulated paths so the next window starts fresh
|
|
418
|
+
// even if a listener re-enters synchronously.
|
|
419
|
+
const batch = { paths: new Map(this.pending) };
|
|
420
|
+
this.pending.clear();
|
|
421
|
+
// First changed relative path of the burst — the US-003 routing argument.
|
|
422
|
+
// undefined when the window settled with no captured path (e.g. a synthetic
|
|
423
|
+
// arm() with no handleEvent).
|
|
424
|
+
const firstRel = [...batch.paths.values()][0];
|
|
380
425
|
for (const l of this.listeners) {
|
|
381
426
|
try {
|
|
382
|
-
l();
|
|
427
|
+
l(firstRel, batch);
|
|
383
428
|
}
|
|
384
429
|
catch (err) {
|
|
385
430
|
console.error("TreeWatcher listener error:", err);
|
|
@@ -404,6 +449,7 @@ export class TreeWatcher {
|
|
|
404
449
|
this.clock.clearTimeout(this.timer);
|
|
405
450
|
this.timer = null;
|
|
406
451
|
}
|
|
452
|
+
this.pending.clear();
|
|
407
453
|
if (this.watcher) {
|
|
408
454
|
void this.watcher.close();
|
|
409
455
|
this.watcher = null;
|
|
@@ -416,4 +462,137 @@ export class TreeWatcher {
|
|
|
416
462
|
this.listeners.clear();
|
|
417
463
|
}
|
|
418
464
|
}
|
|
465
|
+
// ---------------------------------------------------------------------------
|
|
466
|
+
// US-008 — PushEventEmitter: bridge the TreeWatcher to the Phase 2 transport.
|
|
467
|
+
//
|
|
468
|
+
// On each settled debounce window, build one PushEvent per changed path
|
|
469
|
+
// (sha-256 contentHash, monotonic per-device sequenceNumber, originTenantId)
|
|
470
|
+
// and hand it to the injected PushTransport. Feature-flag gated: when the
|
|
471
|
+
// originTenantId is NOT enabled the emitter is DORMANT — it subscribes to
|
|
472
|
+
// nothing and ships nothing, so the Phase 1 poll-only behavior is unchanged.
|
|
473
|
+
//
|
|
474
|
+
// Failure posture: a transport publish that throws (network/non-2xx/timeout)
|
|
475
|
+
// MUST NOT crash the daemon. The emitter catches per-event publish errors and
|
|
476
|
+
// routes them to `onError` (default: console.error); the existing cadence
|
|
477
|
+
// poll remains the safety net that eventually ships the change.
|
|
478
|
+
// ---------------------------------------------------------------------------
|
|
479
|
+
/** Computes the canonical contentHash for a file: `sha256:<64-hex>`. */
|
|
480
|
+
async function computeContentHash(absolutePath) {
|
|
481
|
+
const bytes = await readFile(absolutePath);
|
|
482
|
+
const hex = createHash("sha256").update(bytes).digest("hex");
|
|
483
|
+
return `sha256:${hex}`;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Bridges {@link TreeWatcher} change batches to a {@link PushTransport} as
|
|
487
|
+
* typed PushEvents. Construct once per daemon, then {@link attach} to a
|
|
488
|
+
* running TreeWatcher (returns an unsubscribe fn). Flag-gated + failure-safe.
|
|
489
|
+
*/
|
|
490
|
+
export class PushEventEmitter {
|
|
491
|
+
originTenantId;
|
|
492
|
+
originDeviceId;
|
|
493
|
+
transport;
|
|
494
|
+
flagProvider;
|
|
495
|
+
now;
|
|
496
|
+
onError;
|
|
497
|
+
logger;
|
|
498
|
+
internalSeq = 0;
|
|
499
|
+
nextSeq;
|
|
500
|
+
constructor(opts) {
|
|
501
|
+
this.originTenantId = opts.originTenantId;
|
|
502
|
+
this.originDeviceId = opts.originDeviceId;
|
|
503
|
+
this.transport = opts.transport;
|
|
504
|
+
this.flagProvider = opts.flagProvider;
|
|
505
|
+
this.now = opts.now ?? (() => new Date());
|
|
506
|
+
this.logger = opts.logger;
|
|
507
|
+
this.onError =
|
|
508
|
+
opts.onError ??
|
|
509
|
+
((err, ctx) => console.error("PushEventEmitter error:", ctx.relativePath ?? "", err));
|
|
510
|
+
this.nextSeq =
|
|
511
|
+
opts.getSequenceNumber ??
|
|
512
|
+
(() => {
|
|
513
|
+
const n = this.internalSeq;
|
|
514
|
+
this.internalSeq += 1;
|
|
515
|
+
return n;
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
/** True iff event-driven push is enabled for this emitter's tenant. */
|
|
519
|
+
get enabled() {
|
|
520
|
+
return this.flagProvider.isEnabled(this.originTenantId);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Subscribe to a TreeWatcher's change batches. Dormant (no subscription)
|
|
524
|
+
* when the flag is OFF for this tenant. Returns an unsubscribe fn (a no-op
|
|
525
|
+
* when dormant).
|
|
526
|
+
*/
|
|
527
|
+
attach(watcher) {
|
|
528
|
+
if (!this.enabled)
|
|
529
|
+
return () => { };
|
|
530
|
+
return watcher.onChange((_changedRelPath, batch) => {
|
|
531
|
+
if (batch)
|
|
532
|
+
void this.emitForBatch(batch);
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Build + ship one PushEvent per changed path in the batch. No-op when the
|
|
537
|
+
* flag is OFF. Each path is independent: a hash/stat failure or a transport
|
|
538
|
+
* publish rejection for one path is caught + surfaced via `onError` and does
|
|
539
|
+
* NOT abort the others or propagate (the daemon must not crash; the cadence
|
|
540
|
+
* poll covers any miss).
|
|
541
|
+
*/
|
|
542
|
+
async emitForBatch(batch) {
|
|
543
|
+
if (!this.enabled)
|
|
544
|
+
return;
|
|
545
|
+
const entries = [...batch.paths.entries()];
|
|
546
|
+
await Promise.all(entries.map(([absolutePath, relativePath]) => this.emitOne(absolutePath, relativePath)));
|
|
547
|
+
}
|
|
548
|
+
async emitOne(absolutePath, relativePath) {
|
|
549
|
+
let event;
|
|
550
|
+
try {
|
|
551
|
+
const [contentHash, st] = await Promise.all([
|
|
552
|
+
computeContentHash(absolutePath),
|
|
553
|
+
stat(absolutePath),
|
|
554
|
+
]);
|
|
555
|
+
event = {
|
|
556
|
+
relativePath,
|
|
557
|
+
contentHash,
|
|
558
|
+
mtime: st.mtime.toISOString(),
|
|
559
|
+
originDeviceId: this.originDeviceId,
|
|
560
|
+
originTenantId: this.originTenantId,
|
|
561
|
+
sequenceNumber: this.nextSeq(),
|
|
562
|
+
eventTimestamp: this.now().toISOString(),
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
catch (err) {
|
|
566
|
+
// File deleted between debounce fire and hash read (legal race), or stat
|
|
567
|
+
// failed. Surface, don't crash.
|
|
568
|
+
this.onError(err instanceof Error ? err : new Error(String(err)), {
|
|
569
|
+
relativePath,
|
|
570
|
+
});
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
// US-011: 1st link of the 3-log diagnostic chain. Stamps the same
|
|
574
|
+
// `sequenceNumber` the server `push.receive` log and the client
|
|
575
|
+
// `fanout.receive` log carry, so an operator can walk one event
|
|
576
|
+
// end-to-end. Logged after the event is built, before the publish.
|
|
577
|
+
this.logger?.info({
|
|
578
|
+
event: "watcher.emit",
|
|
579
|
+
originTenantId: event.originTenantId,
|
|
580
|
+
originDeviceId: event.originDeviceId,
|
|
581
|
+
relativePath: event.relativePath,
|
|
582
|
+
contentHash: event.contentHash,
|
|
583
|
+
sequenceNumber: event.sequenceNumber,
|
|
584
|
+
eventTimestamp: event.eventTimestamp,
|
|
585
|
+
}, "watcher emitted push event");
|
|
586
|
+
try {
|
|
587
|
+
await this.transport.publish(event);
|
|
588
|
+
}
|
|
589
|
+
catch (err) {
|
|
590
|
+
// Push failure (network / non-2xx / timeout). The cadence poll is the
|
|
591
|
+
// safety net — log + continue, never throw.
|
|
592
|
+
this.onError(err instanceof Error ? err : new Error(String(err)), {
|
|
593
|
+
relativePath,
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
419
598
|
//# sourceMappingURL=watcher.js.map
|
package/dist/watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAKxE,MAAM,WAAW,GAAG,IAAI,CAAC;AAmBzB,2EAA2E;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;IAC1C,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAuC,CAAC;IAC/E,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;CACtB,CAAC;AAQF;;;;GAIG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,GAAG,CAAC,CAAC;IACZ,MAAM,GAAG,CAAC,CAAC;IACX,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE9C,GAAG;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,UAAU,CAAC,EAAc,EAAE,EAAU;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,YAAY,CAAC,MAAe;QAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,EAAU;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACjC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;iBAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC;iBACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACtD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,+DAA+D;IAC/D,iBAAiB;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF;AAcD;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IACT,UAAU,CAAS;IACnB,KAAK,CAAQ;IACb,IAAI,CAAS;IACtB,KAAK,GAAY,IAAI,CAAC;IACtB,OAAO,GAAG,KAAK,CAAC;IAChB,mBAAmB,GAAG,KAAK,CAAC;IAC5B,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,IAA4B;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,wEAAwE;YACxE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/C,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;gBACjC,+DAA+D;gBAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,8EAA8E;IAC9E,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACnC,CAAC;CACF;AAQD,MAAM,OAAO,WAAW;IACd,OAAO,GAAqB,IAAI,CAAC;IACjC,MAAM,CAAS;IACf,GAAG,CAAgB;IACnB,MAAM,CAAgB;IACtB,UAAU,CAAiD;IAC3D,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,aAAa,GAAyC,IAAI,CAAC;IAC3D,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAY,MAAc,EAAE,GAAkB,EAAE,MAAqB;QACnE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;YAChC,wEAAwE;YACxE,mEAAmE;YACnE,oEAAoE;YACpE,sEAAsE;YACtE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACxD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,GAAG;aAClB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO;aACT,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC5C,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;aAClD,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;aAClD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAiC,EAAE,YAAoB;QACzE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAE9D,oCAAoC;QACpC,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE;YACpC,IAAI;YACJ,YAAY;YACZ,YAAY;SACb,CAAC,CAAC;QAEH,4DAA4D;QAC5D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE3C,KAAK,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;oBAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAE9C,mCAAmC;oBACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC7C,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;wBAAE,SAAS;oBAEjD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM;wBAC1B,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;wBAC5E,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;oBAClE,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,eAAe,YAAY,IAAI,EAC/B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;gBACF,0BAA0B;gBAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,uDAAuD;QACvD,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,0DAA0D;QAC1D,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF;AAmBD;;;;;;;;;;;;;;GAcG;AACH,SAAS,iBAAiB,CACxB,UAA2B,EAC3B,MAAc;IAEd,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,QAAgB,EAAE,KAAgB,EAAW,EAAE;QACrD,wEAAwE;QACxE,uEAAuE;QACvE,6CAA6C;QAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,wEAAwE;YACxE,mCAAmC;YACnC,OAAO,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,YAAY,GAAG,KAAK;IAEpB,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAEpE,OAAO,CAAC,YAAoB,EAAE,KAAK,GAAG,KAAK,EAAW,EAAE;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1E,oEAAoE;QACpE,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAErD,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAErD,IAAI,YAAY,EAAE,CAAC;YACjB,wEAAwE;YACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEjD,qEAAqE;YACrE,IAAI,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QACxD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAuDD,MAAM,OAAO,WAAW;IACL,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,KAAK,CAAQ;IACb,UAAU,CAAkB;IACrC,OAAO,GAAqB,IAAI,CAAC;IACjC,KAAK,GAAY,IAAI,CAAC;IACtB,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAClD,qEAAqE;IAC7D,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,IAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC;QACvC,IAAI,CAAC,UAAU;YACb,IAAI,CAAC,UAAU,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;IACtF,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,QAA4B;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;YAChC,sEAAsE;YACtE,uEAAuE;YACvE,kEAAkE;YAClE,uEAAuE;YACvE,uEAAuE;YACvE,uEAAuE;YACvE,oEAAoE;YACpE,2DAA2D;YAC3D,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACxD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,GAAG;aAClB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,CAAC,YAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO;aACT,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;aAClB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;aACrB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;aACrB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;aACrB,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC;aACxB,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,YAAoB;QAC9B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,0EAA0E;QAC1E,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC;YAAE,OAAO;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;IAEO,GAAG;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,IAAI;QACV,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,yEAAyE;QACzE,8CAA8C;QAC9C,MAAM,KAAK,GAAoB,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,0EAA0E;QAC1E,4EAA4E;QAC5E,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED,kEAAkE;IAClE,iBAAiB;QACf,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,EAAE;AACF,wEAAwE;AACxE,6EAA6E;AAC7E,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,0EAA0E;AAC1E,gEAAgE;AAChE,8EAA8E;AAE9E,wEAAwE;AACxE,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IACpD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO,UAAU,GAAG,EAAE,CAAC;AACzB,CAAC;AA8CD;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IACV,cAAc,CAAS;IACvB,cAAc,CAAS;IACvB,SAAS,CAAgB;IACzB,YAAY,CAA8B;IAC1C,GAAG,CAAa;IAChB,OAAO,CAAuD;IAC9D,MAAM,CAA4B;IAC3C,WAAW,GAAG,CAAC,CAAC;IACP,OAAO,CAAe;IAEvC,YAAY,IAA6B;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO;YACV,IAAI,CAAC,OAAO;gBACZ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO;YACV,IAAI,CAAC,iBAAiB;gBACtB,CAAC,GAAG,EAAE;oBACJ,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;oBAC3B,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;oBACtB,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;IACP,CAAC;IAED,uEAAuE;IACvE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAoB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE;YACjD,IAAI,KAAK;gBAAE,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,KAAsB;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,CAC3C,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,CACzC,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,YAAoB,EACpB,YAAoB;QAEpB,IAAI,KAA4B,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1C,kBAAkB,CAAC,YAAY,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC;aACnB,CAAC,CAAC;YACH,KAAK,GAAG;gBACN,YAAY;gBACZ,WAAW;gBACX,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;gBAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE;gBAC9B,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;aACzC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,gCAAgC;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBAChE,YAAY;aACb,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,gEAAgE;QAChE,gEAAgE;QAChE,mEAAmE;QACnE,IAAI,CAAC,MAAM,EAAE,IAAI,CACf;YACE,KAAK,EAAE,cAAc;YACrB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,EACD,4BAA4B,CAC7B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sEAAsE;YACtE,4CAA4C;YAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBAChE,YAAY;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@indigoai-us/hq-cloud",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.27.0",
|
|
4
4
|
"description": "HQ by Indigo cloud sync engine — bidirectional S3 sync for mobile access",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,20 +16,24 @@
|
|
|
16
16
|
"clean": "rm -rf dist"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@aws-sdk/client-
|
|
19
|
+
"@aws-sdk/client-cloudwatch": "^3.1051.0",
|
|
20
20
|
"@aws-sdk/client-cognito-identity": "^3.700.0",
|
|
21
|
+
"@aws-sdk/client-s3": "^3.700.0",
|
|
22
|
+
"@aws-sdk/client-sqs": "^3.1051.0",
|
|
21
23
|
"@aws-sdk/credential-providers": "^3.700.0",
|
|
22
24
|
"chokidar": "^4.0.0",
|
|
23
25
|
"ignore": "^6.0.0",
|
|
24
|
-
"open": "^10.1.0",
|
|
25
26
|
"js-yaml": "^4.1.0",
|
|
27
|
+
"open": "^10.1.0",
|
|
28
|
+
"pino": "^10.3.1",
|
|
26
29
|
"zod": "^4.4.3"
|
|
27
30
|
},
|
|
28
31
|
"devDependencies": {
|
|
32
|
+
"@types/js-yaml": "^4.0.9",
|
|
29
33
|
"@types/node": "^22.0.0",
|
|
34
|
+
"aws-sdk-client-mock": "^4.1.0",
|
|
30
35
|
"typescript": "^5.7.0",
|
|
31
|
-
"vitest": "^3.0.0"
|
|
32
|
-
"@types/js-yaml": "^4.0.9"
|
|
36
|
+
"vitest": "^3.0.0"
|
|
33
37
|
},
|
|
34
38
|
"repository": {
|
|
35
39
|
"type": "git",
|
package/src/bin/sync-runner.ts
CHANGED
|
@@ -94,6 +94,11 @@ import {
|
|
|
94
94
|
systemClock,
|
|
95
95
|
type Clock,
|
|
96
96
|
} from "../watcher.js";
|
|
97
|
+
import {
|
|
98
|
+
NoopPushReceiver,
|
|
99
|
+
type PushReceiver,
|
|
100
|
+
type SyncEngineFn,
|
|
101
|
+
} from "../sync/push-receiver.js";
|
|
97
102
|
|
|
98
103
|
/**
|
|
99
104
|
* Sync direction for a run.
|
|
@@ -1249,6 +1254,26 @@ export interface RunnerLoopDeps {
|
|
|
1249
1254
|
* handler (called during teardown so tests don't leak listeners).
|
|
1250
1255
|
*/
|
|
1251
1256
|
onShutdownSignal?: (handler: () => void) => () => void;
|
|
1257
|
+
/**
|
|
1258
|
+
* Factory for the Phase 2 pull-on-event receiver (US-009). Defaults to a
|
|
1259
|
+
* {@link NoopPushReceiver} — the daemon ships the receiver SEAM wired into
|
|
1260
|
+
* the lifecycle (start after the watcher, dispose before exit) but stays
|
|
1261
|
+
* DORMANT by default: the per-client SQS queue is provisioned server-side
|
|
1262
|
+
* (an unbuilt follow-up) and the receiver is feature-flag gated. A future
|
|
1263
|
+
* menubar/CLI release injects an {@link SqsPushReceiver} here once a queue
|
|
1264
|
+
* URL is available. Only consulted when `--event-push` is on.
|
|
1265
|
+
*
|
|
1266
|
+
* The factory is handed a {@link SyncEngineFn} that bridges a received
|
|
1267
|
+
* PushEvent to a TARGETED pull pass (`--company <slug> --direction pull`,
|
|
1268
|
+
* or a personal `--companies --direction pull`) routed by the event's
|
|
1269
|
+
* `relativePath`, funneled through the same in-flight guard as the poll
|
|
1270
|
+
* loop and the watcher push so a pull-on-event never overlaps an in-flight
|
|
1271
|
+
* pass.
|
|
1272
|
+
*/
|
|
1273
|
+
createReceiver?: (opts: {
|
|
1274
|
+
syncFn: SyncEngineFn;
|
|
1275
|
+
hqRoot: string;
|
|
1276
|
+
}) => PushReceiver;
|
|
1252
1277
|
}
|
|
1253
1278
|
|
|
1254
1279
|
/**
|
|
@@ -1318,6 +1343,28 @@ export function buildTargetedPushArgv(
|
|
|
1318
1343
|
return ["--companies", "--direction", "push", ...carried];
|
|
1319
1344
|
}
|
|
1320
1345
|
|
|
1346
|
+
/**
|
|
1347
|
+
* Build the argv for a targeted PULL pass from a routed change (US-009 — the
|
|
1348
|
+
* receiver's pull-on-event path). Mirrors {@link buildTargetedPushArgv} but
|
|
1349
|
+
* with `--direction pull`: a peer device pushed a change, so this device pulls
|
|
1350
|
+
* just the affected company/subtree instead of waiting for the next
|
|
1351
|
+
* `--poll-remote-ms` cycle. Company routes use `--company <slug>`; personal
|
|
1352
|
+
* routes use `--companies` (the personal-vault scope is resolved inside
|
|
1353
|
+
* runRunner's fanout; skipUnchanged no-ops the subtrees that didn't change).
|
|
1354
|
+
* Inherits `--hq-root` / `--on-conflict` from the base argv. Pure helper,
|
|
1355
|
+
* exported for unit testing the event→argv map.
|
|
1356
|
+
*/
|
|
1357
|
+
export function buildTargetedPullArgv(
|
|
1358
|
+
route: { kind: "company"; slug: string } | { kind: "personal" },
|
|
1359
|
+
baseArgv: string[],
|
|
1360
|
+
): string[] {
|
|
1361
|
+
const carried = carriedFlags(baseArgv);
|
|
1362
|
+
if (route.kind === "company") {
|
|
1363
|
+
return ["--company", route.slug, "--direction", "pull", ...carried];
|
|
1364
|
+
}
|
|
1365
|
+
return ["--companies", "--direction", "pull", ...carried];
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1321
1368
|
export async function runRunnerWithLoop(
|
|
1322
1369
|
argv: string[],
|
|
1323
1370
|
deps: RunnerLoopDeps = {},
|
|
@@ -1333,6 +1380,15 @@ export async function runRunnerWithLoop(
|
|
|
1333
1380
|
const pollMs =
|
|
1334
1381
|
pollIdx >= 0 && argv[pollIdx + 1] ? Number(argv[pollIdx + 1]) : 600_000;
|
|
1335
1382
|
const eventPush = argv.includes("--event-push");
|
|
1383
|
+
// In `--companies` mode the sync scope is companies/*/{knowledge,projects,…}
|
|
1384
|
+
// (per .hqinclude), so the watcher must NOT apply the personal-vault
|
|
1385
|
+
// top-level exclusions (PERSONAL_VAULT_EXCLUDED_TOP_LEVEL drops `companies/`
|
|
1386
|
+
// and `workspace/`) — doing so would exclude exactly the paths being synced,
|
|
1387
|
+
// and no local edit would ever trigger an instant push. The shared ignore
|
|
1388
|
+
// stack (createIgnoreFilter / .hqignore / .hqinclude) already scopes the
|
|
1389
|
+
// watch filter correctly in companies mode. personalMode is only for a
|
|
1390
|
+
// personal-vault-as-root run, where companies/ et al. genuinely aren't synced.
|
|
1391
|
+
const companiesMode = argv.includes("--companies");
|
|
1336
1392
|
const hqIdx = argv.indexOf("--hq-root");
|
|
1337
1393
|
const hqRoot =
|
|
1338
1394
|
hqIdx >= 0 && argv[hqIdx + 1] ? argv[hqIdx + 1] : DEFAULT_HQ_ROOT;
|
|
@@ -1372,6 +1428,12 @@ export async function runRunnerWithLoop(
|
|
|
1372
1428
|
let driver: WatchPushDriver | null = null;
|
|
1373
1429
|
let detachSignal: (() => void) | null = null;
|
|
1374
1430
|
let lastChangedRel: string | null = null;
|
|
1431
|
+
// ---- pull-on-event receiver (Phase 2, US-009) ------------------------
|
|
1432
|
+
// Started after the watcher, disposed before the watcher (mirror of the
|
|
1433
|
+
// PushTransport ordering). Dormant by default: the default factory returns
|
|
1434
|
+
// a NoopPushReceiver, and even a real receiver stays dormant unless the
|
|
1435
|
+
// per-tenant feature flag is on AND a queue URL is provisioned server-side.
|
|
1436
|
+
let receiver: PushReceiver | null = null;
|
|
1375
1437
|
|
|
1376
1438
|
if (eventPush) {
|
|
1377
1439
|
const clock = deps.clock ?? systemClock;
|
|
@@ -1383,7 +1445,10 @@ export async function runRunnerWithLoop(
|
|
|
1383
1445
|
hqRoot: opts.hqRoot,
|
|
1384
1446
|
debounceMs: opts.debounceMs,
|
|
1385
1447
|
clock: opts.clock,
|
|
1386
|
-
|
|
1448
|
+
// false in --companies mode so the watch filter matches the sync
|
|
1449
|
+
// scope (companies/* are included via .hqinclude); true only for a
|
|
1450
|
+
// personal-vault-as-root run.
|
|
1451
|
+
personalMode: !companiesMode,
|
|
1387
1452
|
}));
|
|
1388
1453
|
watcher = createWatcher({ hqRoot, debounceMs, clock });
|
|
1389
1454
|
|
|
@@ -1416,6 +1481,31 @@ export async function runRunnerWithLoop(
|
|
|
1416
1481
|
driver?.notifyChange();
|
|
1417
1482
|
});
|
|
1418
1483
|
watcher.start();
|
|
1484
|
+
|
|
1485
|
+
// Pull-on-event receiver (US-009). The injected SyncEngineFn bridges a
|
|
1486
|
+
// received PushEvent → a TARGETED pull pass routed by relativePath, funneled
|
|
1487
|
+
// through the SAME `runGuarded` mutex as the poll loop + watcher push so a
|
|
1488
|
+
// pull-on-event never overlaps an in-flight pass. Started AFTER the watcher
|
|
1489
|
+
// so a live event can't race a half-built daemon. Default factory = noop
|
|
1490
|
+
// (dormant); a real SqsPushReceiver is injected by a later release once the
|
|
1491
|
+
// server-side per-client SQS queue is provisioned.
|
|
1492
|
+
const receiverSyncFn: SyncEngineFn = async (ctx) => {
|
|
1493
|
+
if (stopped) return;
|
|
1494
|
+
const route = routeChangeToTarget(ctx.event.relativePath);
|
|
1495
|
+
if (!route) return;
|
|
1496
|
+
const targetedArgv = buildTargetedPullArgv(route, passArgv);
|
|
1497
|
+
await runGuarded(() => runPass(targetedArgv));
|
|
1498
|
+
};
|
|
1499
|
+
const createReceiver =
|
|
1500
|
+
deps.createReceiver ?? (() => new NoopPushReceiver());
|
|
1501
|
+
receiver = createReceiver({ syncFn: receiverSyncFn, hqRoot });
|
|
1502
|
+
// Fire-and-forget start: a receiver's start() kicks off its own poll loop
|
|
1503
|
+
// (SqsPushReceiver) or trivially flips connected (noop) — it must NOT block
|
|
1504
|
+
// the runner's poll loop from entering. Errors are swallowed; the cadence
|
|
1505
|
+
// poll is the safety net regardless of receiver health. (The await-free
|
|
1506
|
+
// start also keeps the poll loop's microtask timing identical to the
|
|
1507
|
+
// pre-US-009 wiring.)
|
|
1508
|
+
void Promise.resolve(receiver.start()).catch(() => undefined);
|
|
1419
1509
|
}
|
|
1420
1510
|
|
|
1421
1511
|
// ---- clean shutdown --------------------------------------------------
|
|
@@ -1429,6 +1519,17 @@ export async function runRunnerWithLoop(
|
|
|
1429
1519
|
const shutdown = (): void => {
|
|
1430
1520
|
if (stopped) return;
|
|
1431
1521
|
stopped = true;
|
|
1522
|
+
// Dispose the receiver FIRST (mirror of the PushTransport ordering:
|
|
1523
|
+
// inbound subscription torn down before the watcher) so no new
|
|
1524
|
+
// pull-on-event fires mid-teardown. dispose() is async (it drains the
|
|
1525
|
+
// in-flight pull up to its own deadline); fire-and-forget here — the
|
|
1526
|
+
// receiver's internal drain + the runGuarded mutex bound the work, and
|
|
1527
|
+
// SIGTERM teardown must not block. Errors are swallowed.
|
|
1528
|
+
try {
|
|
1529
|
+
void receiver?.dispose();
|
|
1530
|
+
} catch {
|
|
1531
|
+
/* ignore */
|
|
1532
|
+
}
|
|
1432
1533
|
try {
|
|
1433
1534
|
driver?.dispose();
|
|
1434
1535
|
} catch {
|
package/src/index.ts
CHANGED
|
@@ -292,9 +292,30 @@ export {
|
|
|
292
292
|
encodePushEvent,
|
|
293
293
|
decodePushEvent,
|
|
294
294
|
NoopPushTransport,
|
|
295
|
+
HttpPushTransport,
|
|
296
|
+
FEATURE_FLAG_TENANTS_ENV_VAR,
|
|
297
|
+
FEATURE_FLAG_LEGACY_GLOBAL_ENV_VAR,
|
|
298
|
+
EnvTenantListFlagProvider,
|
|
299
|
+
StaticFlagProvider,
|
|
300
|
+
defaultFlagProvider,
|
|
295
301
|
} from "./sync/index.js";
|
|
296
302
|
export type {
|
|
297
303
|
PushEvent,
|
|
298
304
|
PushEventDecodeIssue,
|
|
299
305
|
PushTransport,
|
|
306
|
+
HttpPushTransportOptions,
|
|
307
|
+
AuthTokenSource,
|
|
308
|
+
FetchLike,
|
|
309
|
+
EventDrivenPushFlagProvider,
|
|
310
|
+
FlagProviderWarnFn,
|
|
311
|
+
EnvTenantListFlagProviderOptions,
|
|
300
312
|
} from "./sync/index.js";
|
|
313
|
+
|
|
314
|
+
// US-008 — watcher PushEvent emitter (bridges TreeWatcher → PushTransport,
|
|
315
|
+
// flag-gated, failure-safe).
|
|
316
|
+
export { PushEventEmitter } from "./watcher.js";
|
|
317
|
+
export type {
|
|
318
|
+
PushEventEmitterOptions,
|
|
319
|
+
TreeChangeBatch,
|
|
320
|
+
TreeChangeListener,
|
|
321
|
+
} from "./watcher.js";
|