@xyo-network/xl1-cli-lib 1.21.3 → 1.23.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.
@@ -1,3 +1,9 @@
1
1
  import type { Config } from '@xyo-network/xl1-sdk';
2
+ /**
3
+ * Returns a deep clone of `config` with secret-bearing leaf values replaced by
4
+ * `'[REDACTED]'`. Walks plain objects and arrays. Leaves primitives, dates,
5
+ * and other non-plain values untouched (other than via `structuredClone`).
6
+ */
7
+ export declare function redactConfig<T>(config: T): T;
2
8
  export declare function configMiddleware(argv: Record<string, unknown>, setConfiguration: (config: Config) => void): Promise<void>;
3
9
  //# sourceMappingURL=configMiddleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configMiddleware.d.ts","sourceRoot":"","sources":["../../src/configMiddleware.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAsDlD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B/H"}
1
+ {"version":3,"file":"configMiddleware.d.ts","sourceRoot":"","sources":["../../src/configMiddleware.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AA2BlD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAI5C;AAgED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC/H"}
@@ -0,0 +1,17 @@
1
+ import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk';
2
+ /**
3
+ * Renders the locator map as a tree grouped by registry identity, annotating
4
+ * any moniker that appears in more than one *registry* with `⚠ also in: ...`.
5
+ *
6
+ * - When all input locators share one registry (shared-locator path), a single
7
+ * "Providers shared by actors: …" section is rendered.
8
+ * - When some actors have distinct registries (legacy `_root` + per-actor
9
+ * child architecture), each registry is rendered separately. `_root` is
10
+ * ordered first.
11
+ *
12
+ * The "Duplicate monikers" summary at the bottom only flags monikers
13
+ * registered by *different* registries — duplicates within one registry are
14
+ * already collapsed into per-entry `(×N)` counts by `enumerateLocator`.
15
+ */
16
+ export declare function formatProviderTree(locators: Record<string, ProviderFactoryLocatorInstance>): string;
17
+ //# sourceMappingURL=dumpProviders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dumpProviders.d.ts","sourceRoot":"","sources":["../../src/dumpProviders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAA;AA0J1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,GAAG,MAAM,CA+BnG"}
@@ -8,6 +8,39 @@ import { ConfigZod, isZodError, resolveConfig } from "@xyo-network/xl1-sdk";
8
8
  var deepMerge = createDeepMerge({
9
9
  arrayStrategy: "concat"
10
10
  });
11
+ var REDACTED = "[REDACTED]";
12
+ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
13
+ "mnemonic",
14
+ "connectionString"
15
+ ]);
16
+ var REDACTED_KEY_SUFFIX = /(PrivateKey|Secret|Password)$/i;
17
+ function shouldRedactKey(key) {
18
+ if (REDACTED_KEY_NAMES.has(key)) return true;
19
+ return REDACTED_KEY_SUFFIX.test(key);
20
+ }
21
+ __name(shouldRedactKey, "shouldRedactKey");
22
+ function redactConfig(config2) {
23
+ const cloned = structuredClone(config2);
24
+ redactInPlace(cloned);
25
+ return cloned;
26
+ }
27
+ __name(redactConfig, "redactConfig");
28
+ function redactInPlace(node) {
29
+ if (Array.isArray(node)) {
30
+ for (const item of node) redactInPlace(item);
31
+ return;
32
+ }
33
+ if (node === null || typeof node !== "object") return;
34
+ const obj = node;
35
+ for (const key of Object.keys(obj)) {
36
+ if (shouldRedactKey(key) && obj[key] !== void 0 && obj[key] !== null) {
37
+ obj[key] = REDACTED;
38
+ } else {
39
+ redactInPlace(obj[key]);
40
+ }
41
+ }
42
+ }
43
+ __name(redactInPlace, "redactInPlace");
11
44
  function coerceActorsArray(argv) {
12
45
  const actors = argv.actors;
13
46
  if (actors === void 0 || Array.isArray(actors)) return argv;
@@ -56,7 +89,9 @@ async function configMiddleware(argv, setConfiguration) {
56
89
  assertNoActorMnemonics(finalConfig);
57
90
  setConfiguration(finalConfig);
58
91
  if (argv["dump-config"]) {
59
- console.log(JSON.stringify(finalConfig, null, 2));
92
+ const withSecrets = Boolean(argv["with-secrets"]);
93
+ const output2 = withSecrets ? finalConfig : redactConfig(finalConfig);
94
+ console.log(JSON.stringify(output2, null, 2));
60
95
  process.exit(0);
61
96
  }
62
97
  } catch (err) {
@@ -236,6 +271,176 @@ function withDeprecationWarning(module) {
236
271
  }
237
272
  __name(withDeprecationWarning, "withDeprecationWarning");
238
273
 
274
+ // src/dumpProviders.ts
275
+ var CANONICAL_ACTOR_ORDER = [
276
+ "_root",
277
+ "producer",
278
+ "finalizer",
279
+ "api",
280
+ "mempool",
281
+ "bridge",
282
+ "rewardRedemption"
283
+ ];
284
+ function enumerateLocator(locator) {
285
+ const collapsed = /* @__PURE__ */ new Map();
286
+ const registry = locator.registry;
287
+ for (const moniker of Object.keys(registry)) {
288
+ const factories = registry[moniker];
289
+ if (!factories) continue;
290
+ for (const factory of factories) {
291
+ const f = factory;
292
+ const providerName = f.providerName ?? "<unknown>";
293
+ const scope = f.scope ?? "<unknown>";
294
+ const dependencies = f.dependencies ?? [];
295
+ const fingerprint = `${moniker}|${providerName}|${scope}|${dependencies.join(",")}`;
296
+ const existing = collapsed.get(fingerprint);
297
+ if (existing) {
298
+ existing.count += 1;
299
+ } else {
300
+ collapsed.set(fingerprint, {
301
+ count: 1,
302
+ dependencies,
303
+ moniker,
304
+ providerName,
305
+ scope
306
+ });
307
+ }
308
+ }
309
+ }
310
+ return [
311
+ ...collapsed.values()
312
+ ].toSorted((a, b) => a.moniker.localeCompare(b.moniker) || a.providerName.localeCompare(b.providerName));
313
+ }
314
+ __name(enumerateLocator, "enumerateLocator");
315
+ function buildOwnerIndex(perActor) {
316
+ const monikerOwners = /* @__PURE__ */ new Map();
317
+ for (const [actorName, entries] of perActor) {
318
+ for (const entry of entries) {
319
+ let owners = monikerOwners.get(entry.moniker);
320
+ if (!owners) {
321
+ owners = /* @__PURE__ */ new Set();
322
+ monikerOwners.set(entry.moniker, owners);
323
+ }
324
+ owners.add(actorName);
325
+ }
326
+ }
327
+ return monikerOwners;
328
+ }
329
+ __name(buildOwnerIndex, "buildOwnerIndex");
330
+ function renderDuplicatesSummary(monikerOwners) {
331
+ const duplicates = [
332
+ ...monikerOwners.entries()
333
+ ].filter(([, owners]) => owners.size > 1).map(([moniker, owners]) => ({
334
+ moniker,
335
+ owners: [
336
+ ...owners
337
+ ].toSorted().map(formatGroupForDisplay)
338
+ })).toSorted((a, b) => a.moniker.localeCompare(b.moniker));
339
+ if (duplicates.length === 0) return [];
340
+ const lines = [
341
+ "Duplicate monikers (registered by more than one locator):"
342
+ ];
343
+ for (const { moniker, owners } of duplicates) {
344
+ lines.push(` - ${moniker}: ${owners.join(", ")}`);
345
+ }
346
+ lines.push("");
347
+ return lines;
348
+ }
349
+ __name(renderDuplicatesSummary, "renderDuplicatesSummary");
350
+ function groupActorsBySharedRegistry(locators) {
351
+ const groups = [];
352
+ for (const actorName of Object.keys(locators)) {
353
+ const locator = locators[actorName];
354
+ const existing = groups.find((g) => g.registry === locator.registry);
355
+ if (existing) {
356
+ existing.actorNames.push(actorName);
357
+ } else {
358
+ groups.push({
359
+ actorNames: [
360
+ actorName
361
+ ],
362
+ locator,
363
+ registry: locator.registry
364
+ });
365
+ }
366
+ }
367
+ return groups;
368
+ }
369
+ __name(groupActorsBySharedRegistry, "groupActorsBySharedRegistry");
370
+ function groupId(actorNames) {
371
+ return [
372
+ ...actorNames
373
+ ].toSorted().join(",");
374
+ }
375
+ __name(groupId, "groupId");
376
+ function formatGroupForDisplay(groupKey) {
377
+ const members = groupKey.split(",");
378
+ return members.length === 1 ? members[0] : `(${members.join(", ")})`;
379
+ }
380
+ __name(formatGroupForDisplay, "formatGroupForDisplay");
381
+ function renderGroupSection(actorNames, entries, monikerOwners) {
382
+ const sortedActors = [
383
+ ...actorNames
384
+ ].toSorted();
385
+ const ownGroupKey = groupId(sortedActors);
386
+ const heading = sortedActors.length === 1 ? `Providers for actor: ${sortedActors[0]} (${entries.length} registered)` : `Providers shared by actors: ${sortedActors.join(", ")} (${entries.length} registered)`;
387
+ const lines = [
388
+ heading
389
+ ];
390
+ if (entries.length === 0) {
391
+ lines.push(" (none)", "");
392
+ return lines;
393
+ }
394
+ for (let i = 0; i < entries.length; i++) {
395
+ const entry = entries[i];
396
+ const isLast = i === entries.length - 1;
397
+ const branch = isLast ? "\u2514\u2500\u2500" : "\u251C\u2500\u2500";
398
+ const owners = monikerOwners.get(entry.moniker) ?? /* @__PURE__ */ new Set();
399
+ const otherOwners = [
400
+ ...owners
401
+ ].filter((o) => o !== ownGroupKey).toSorted().map(formatGroupForDisplay);
402
+ const dupNote = otherOwners.length > 0 ? ` \u26A0 also in: ${otherOwners.join(", ")}` : "";
403
+ const depsNote = entry.dependencies.length > 0 ? `, deps: [${entry.dependencies.join(", ")}]` : "";
404
+ const countNote = entry.count > 1 ? ` (\xD7${entry.count})` : "";
405
+ lines.push(` ${branch} ${entry.moniker}${countNote} [impl: ${entry.providerName}, scope: ${entry.scope}${depsNote}]${dupNote}`);
406
+ }
407
+ lines.push("");
408
+ return lines;
409
+ }
410
+ __name(renderGroupSection, "renderGroupSection");
411
+ function formatProviderTree(locators) {
412
+ const groups = groupActorsBySharedRegistry(locators);
413
+ const groupKeys = groups.map((g) => ({
414
+ ...g,
415
+ key: groupId(g.actorNames)
416
+ }));
417
+ const perGroup = /* @__PURE__ */ new Map();
418
+ for (const g of groupKeys) perGroup.set(g.key, enumerateLocator(g.locator));
419
+ const monikerOwners = buildOwnerIndex(perGroup);
420
+ const orderedGroups = [
421
+ ...groupKeys
422
+ ].toSorted((a, b) => {
423
+ const aHasRoot = a.actorNames.includes("_root");
424
+ const bHasRoot = b.actorNames.includes("_root");
425
+ if (aHasRoot !== bHasRoot) return aHasRoot ? -1 : 1;
426
+ const ai = CANONICAL_ACTOR_ORDER.indexOf(a.actorNames[0]);
427
+ const bi = CANONICAL_ACTOR_ORDER.indexOf(b.actorNames[0]);
428
+ if (ai !== bi) return (ai === -1 ? Number.MAX_SAFE_INTEGER : ai) - (bi === -1 ? Number.MAX_SAFE_INTEGER : bi);
429
+ return a.key.localeCompare(b.key);
430
+ });
431
+ const lines = [
432
+ "XL1 Provider Dump",
433
+ "=================",
434
+ ""
435
+ ];
436
+ for (const g of orderedGroups) {
437
+ lines.push(...renderGroupSection(g.actorNames.toSorted(), perGroup.get(g.key) ?? [], monikerOwners));
438
+ }
439
+ lines.push(...renderDuplicatesSummary(monikerOwners));
440
+ return lines.join("\n");
441
+ }
442
+ __name(formatProviderTree, "formatProviderTree");
443
+
239
444
  // src/images.ts
240
445
  var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;118;111;144m_\x1B[0m
241
446
  \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;72;32;223m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m
@@ -283,7 +488,8 @@ function defaultScrapePortForActors(actors) {
283
488
  __name(defaultScrapePortForActors, "defaultScrapePortForActors");
284
489
  var configuration;
285
490
  var skipInsecureConfirm = false;
286
- var version = isDefined3("1.21.3") ? "1.21.3" : "unknown";
491
+ var dumpProviders = false;
492
+ var version = isDefined3("1.23.0") ? "1.23.0" : "unknown";
287
493
  function getConfiguration() {
288
494
  return configuration;
289
495
  }
@@ -336,6 +542,10 @@ async function getLocatorsFromConfig(actors, configuration2) {
336
542
  }
337
543
  const onInsecureGenesisConfirm = skipInsecureConfirm ? void 0 : async () => await promptForInsecureGenesisConfirmation(logger);
338
544
  const locators = await locatorsFromConfig(context, config2, onInsecureGenesisConfirm);
545
+ if (dumpProviders) {
546
+ console.log(formatProviderTree(locators));
547
+ process.exit(0);
548
+ }
339
549
  const healthCheckPort = configuration2.healthCheckPort ?? DEFAULT_HEALTH_CHECK_PORT;
340
550
  const healthServer = healthCheckPort > 0 && context.statusReporter !== void 0 ? await initHealthEndpoints({
341
551
  logger,
@@ -380,6 +590,7 @@ $0 <command> [options]`).parserConfiguration({
380
590
  configuration = config2;
381
591
  });
382
592
  skipInsecureConfirm = Boolean(argv2["skip-insecure-confirm"]);
593
+ dumpProviders = Boolean(argv2["dump-providers"]);
383
594
  }).options(optionsFromGlobalZodRegistry()).wrap(y.terminalWidth()).command(withDeprecationWarning(apiCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(bridgeCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(finalizerCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(mempoolCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(producerCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(rewardRedemptionCommand(getConfiguration, getLocatorsFromConfig))).command(startCommand(getConfiguration, getLocatorsFromConfig)).options({
384
595
  "config": {
385
596
  type: "string",
@@ -392,7 +603,17 @@ $0 <command> [options]`).parserConfiguration({
392
603
  },
393
604
  "dump-config": {
394
605
  type: "boolean",
395
- description: "Just process the configuration and print the resolved config to stdout, then exit.",
606
+ description: "Just process the configuration and print the resolved config to stdout, then exit. Secrets are redacted unless --with-secrets is also passed.",
607
+ default: false
608
+ },
609
+ "with-secrets": {
610
+ type: "boolean",
611
+ description: 'When used with --dump-config, print raw secret values (mnemonic, private keys, passwords) instead of "[REDACTED]". Use only on a developer machine.',
612
+ default: false
613
+ },
614
+ "dump-providers": {
615
+ type: "boolean",
616
+ description: "Run the normal command flow up to provider locator construction, print the per-actor provider tree (with duplicate detection), then exit.",
396
617
  default: false
397
618
  },
398
619
  "skip-insecure-confirm": {
@@ -416,6 +637,7 @@ var start = /* @__PURE__ */ __name(async () => {
416
637
  export {
417
638
  configMiddleware,
418
639
  initLogger,
640
+ redactConfig,
419
641
  runCLI,
420
642
  start
421
643
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/configMiddleware.ts","../../src/initLogger.ts","../../src/runCLI.ts","../../src/commands/start/startCommand.ts","../../src/commands/withDeprecationWarning.ts","../../src/images.ts","../../src/optionsFromGlobalZodRegistry.ts","../../src/start.ts"],"sourcesContent":["import { createDeepMerge, isDefined } from '@xylabs/sdk-js'\nimport {\n ActorMnemonicNotAllowedError,\n assertNoActorMnemonics,\n ConfigFileNotFoundError,\n tryParseConfig,\n} from '@xyo-network/chain-orchestration'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport {\n ConfigZod, isZodError, resolveConfig,\n} from '@xyo-network/xl1-sdk'\n\nconst deepMerge = createDeepMerge({ arrayStrategy: 'concat' })\ntype ConfigWithMnemonic = Config & { mnemonic?: string }\n\n/**\n * Yargs `.env()` with `dot-notation` turns `XL1_ACTORS__0__NAME=foo` into\n * `{ actors: { '0': { name: 'foo' } } }` — an object keyed by string indices\n * rather than an array. Normalize that back into an array so ConfigZod's\n * `actors` array schema accepts it.\n */\nfunction coerceActorsArray(argv: Record<string, unknown>): Record<string, unknown> {\n const actors = argv.actors\n if (actors === undefined || Array.isArray(actors)) return argv\n if (typeof actors !== 'object' || actors === null) return argv\n const entries = Object.entries(actors as Record<string, unknown>)\n const numericEntries = entries\n .map(([key, value]) => [Number(key), value] as const)\n .filter(([key]) => Number.isInteger(key) && key >= 0)\n if (numericEntries.length !== entries.length) return argv\n const asArray: unknown[] = []\n for (const [key, value] of numericEntries) asArray[key] = value\n return { ...argv, actors: asArray }\n}\n\nfunction safeParseOrThrow(input: unknown): Config {\n const result = ConfigZod.safeParse(input)\n if (!result.success) throw result.error\n return result.data as Config\n}\n\nasync function buildFinalConfig(argv: Record<string, unknown>): Promise<ConfigWithMnemonic> {\n // Parse the various config sources\n const configPath = argv.config as string | undefined\n const parsedConfigFile = await tryParseConfig({ configPath }) as ConfigWithMnemonic // Config file\n const rootMnemonicFromFile = typeof parsedConfigFile.mnemonic === 'string' ? parsedConfigFile.mnemonic : undefined\n const normalizedArgv = coerceActorsArray(argv)\n const parsedConfigArgs = ConfigZod.safeParse(normalizedArgv).data ?? {} // Command-line arguments & ENV VARs\n const rootMnemonicFromArgs = typeof normalizedArgv.mnemonic === 'string' ? normalizedArgv.mnemonic : undefined\n // Deep merge with precedence\n // TODO: Would like precedence to be defaults < file < ENV < CLI Args\n // but there is currently no way to determine which are defaults vs\n // user-supplied CLI Args since we set the CLI args to the defaults\n // and receive a flattened object. We might need to manually invoke\n // the parser without the defaults to achieve this.\n const mergedConfig = safeParseOrThrow(deepMerge(parsedConfigFile, parsedConfigArgs))\n const validated = safeParseOrThrow(resolveConfig(safeParseOrThrow(mergedConfig)))\n const rootMnemonic = rootMnemonicFromArgs ?? rootMnemonicFromFile\n return isDefined(rootMnemonic) ? { ...validated, mnemonic: rootMnemonic } : validated\n}\n\nexport async function configMiddleware(argv: Record<string, unknown>, setConfiguration: (config: Config) => void): Promise<void> {\n try {\n const finalConfig = await buildFinalConfig(argv)\n // Hard-fail if any actor was configured with its own mnemonic. Mnemonics\n // must live at the root; actors pick their wallet via accountPath.\n assertNoActorMnemonics(finalConfig)\n setConfiguration(finalConfig as Config)\n\n // Check if user wants to dump config and exit\n if (argv['dump-config']) {\n console.log(JSON.stringify(finalConfig, null, 2))\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0)\n }\n } catch (err) {\n if (err instanceof ConfigFileNotFoundError) {\n console.error(`${err.message}. Check the path passed to --config/-c and try again.`)\n } else if (err instanceof ActorMnemonicNotAllowedError) {\n console.error(err.message)\n } else if (isZodError(err)) {\n console.error(`Zod error: ${err.message}`)\n } else {\n console.error(`Error parsing configuration: ${err}`)\n }\n if (!(err instanceof ConfigFileNotFoundError) && !(err instanceof ActorMnemonicNotAllowedError)) {\n console.error(`Stack: ${err instanceof Error ? err.stack : 'N/A'}`)\n }\n throw new Error('Invalid configuration', { cause: err })\n }\n}\n","import type { Logger, LogLevelValue } from '@xylabs/sdk-js'\nimport {\n Base,\n ConsoleLogger, isDefined,\n LogLevel, SilentLogger,\n} from '@xylabs/sdk-js'\nimport type { BaseConfig } from '@xyo-network/xl1-sdk'\n\nexport const initLogger = (config: BaseConfig): Logger => {\n let logger: Logger\n if (config.log.silent) {\n logger = new SilentLogger()\n } else {\n let level: LogLevelValue | undefined\n if (isDefined(config.log.logLevel)) {\n const parsed = LogLevel[config.log.logLevel.toLowerCase() as keyof typeof LogLevel]\n if (isDefined(parsed)) level = parsed\n }\n logger = new ConsoleLogger(level)\n }\n Base.defaultLogger = logger\n return logger\n}\n","import { stdin as input, stdout as output } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\n\nimport { isDefined } from '@xylabs/sdk-js'\nimport { apiCommand } from '@xyo-network/chain-api'\nimport { bridgeCommand } from '@xyo-network/chain-bridge'\nimport { finalizerCommand } from '@xyo-network/chain-finalizer'\nimport { mempoolCommand } from '@xyo-network/chain-mempool'\nimport {\n contextFromConfigWithoutLocator, detectDerivationPathCollisions, formatWalletReport, initializeResolvedWalletReport,\n locatorsFromConfig, Orchestrator,\n} from '@xyo-network/chain-orchestration'\nimport { initHealthEndpoints } from '@xyo-network/chain-orchestration-express'\nimport { producerCommand } from '@xyo-network/chain-producer'\nimport { rewardRedemptionCommand } from '@xyo-network/chain-reward-redemption'\nimport type { ActorConfig, Config } from '@xyo-network/xl1-sdk'\nimport {\n ActorConfigZod, ConfigZod, DefaultMetricsScrapePorts,\n} from '@xyo-network/xl1-sdk'\nimport type { Argv } from 'yargs'\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\n\nimport { startCommand, withDeprecationWarning } from './commands/index.ts'\nimport { configMiddleware } from './configMiddleware.ts'\nimport { XL1LogoColorizedAscii } from './images.ts'\nimport { initLogger } from './initLogger.ts'\nimport { optionsFromGlobalZodRegistry } from './optionsFromGlobalZodRegistry.ts'\n\n/** Version string injected by Rollup at build time. */\ndeclare const __VERSION__: string\n\nconst DEFAULT_HEALTH_CHECK_PORT = 9090\n\n/**\n * Maps a CLI actor name to its registered Prometheus scrape port. The CLI-level\n * exporter (one per process) defaults to the port of the first requested actor\n * so that running, e.g., `xl1 start producer` and `xl1 start api` side-by-side\n * doesn't fight over a single shared default.\n */\nfunction defaultScrapePortForActors(actors: readonly string[]): number {\n const primary = actors[0]\n const key = primary === 'rewardRedemption' ? 'rewardRedemptionApi' : primary\n return (DefaultMetricsScrapePorts as Record<string, number>)[key] ?? DefaultMetricsScrapePorts.producer\n}\n\n/**\n * The configuration that will be used throughout the CLI.\n * This is materialized after parsing the command-line arguments,\n * environment variables, and defaults.\n */\nlet configuration: Config\nlet skipInsecureConfirm = false\n\nconst version = isDefined(__VERSION__) ? __VERSION__ : 'unknown'\n\nfunction getConfiguration(): Config {\n return configuration\n}\n\nasync function promptForInsecureGenesisConfirmation(logger: ReturnType<typeof initLogger>) {\n if (!input.isTTY || !output.isTTY) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped because this session is not a TTY.')\n return\n }\n const rl = createInterface({ input, output })\n try {\n await rl.question('Insecure genesis reward wallet is active. Hit RETURN to continue.')\n } finally {\n rl.close()\n }\n}\n\nasync function getLocatorsFromConfig(actors: string[], configuration: Config) {\n const actorConfigs: ActorConfig[] = []\n for (const actorName of actors) {\n const existingConfig = configuration.actors.find(actor => actor.name === actorName)\n if (existingConfig) {\n actorConfigs.push(existingConfig)\n } else {\n const actorConfig = ActorConfigZod.loose().parse({ name: actorName })\n actorConfigs.push(actorConfig)\n }\n }\n\n const config = ConfigZod.parse({ ...configuration, actors: actorConfigs })\n\n const logger = initLogger(configuration)\n const orchestrator = await Orchestrator.create({ logger })\n const collision = detectDerivationPathCollisions(actors, configuration)\n if (collision) throw collision\n const walletReport = await initializeResolvedWalletReport(actors, configuration)\n logger.info(formatWalletReport(walletReport))\n const serviceName = actors.length === 1 ? `xl1-${actors[0]}` : 'xl1-cli'\n const context = await contextFromConfigWithoutLocator(config, logger, serviceName, version, defaultScrapePortForActors(actors))\n if (skipInsecureConfirm) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped via --skip-insecure-confirm.')\n }\n const onInsecureGenesisConfirm = skipInsecureConfirm\n ? undefined\n : async () => await promptForInsecureGenesisConfirmation(logger)\n const locators = await locatorsFromConfig(context, config, onInsecureGenesisConfirm)\n\n const healthCheckPort = configuration.healthCheckPort ?? DEFAULT_HEALTH_CHECK_PORT\n const healthServer = healthCheckPort > 0 && context.statusReporter !== undefined\n ? await initHealthEndpoints({\n logger,\n port: healthCheckPort,\n readiness: orchestrator,\n statusMonitor: context.statusReporter,\n })\n : undefined\n\n // Handle cancellation (Ctrl+C)\n process.on('SIGINT', () => {\n void (async () => {\n try {\n logger.log('\\nSIGINT received. Attempting graceful shutdown...')\n healthServer?.close()\n await orchestrator?.stop()\n logger.log('Orchestrator stopped, exiting now.')\n process.exit(0)\n } catch (err) {\n logger.error('Error stopping orchestrator:', err)\n process.exit(1)\n }\n })()\n })\n return { locators, orchestrator }\n}\n\n// Main entry point\nexport async function runCLI() {\n // Parse command-line arguments using Yargs\n const y = yargs(hideBin(process.argv)) as Argv<Config>\n const argv = y\n .usage(`\n🚀 XL1 Node CLI (${version})\n${XL1LogoColorizedAscii}\nRun various components of the XL1 ecosystem.\n\nUsage:\n$0 <command> [options]`)\n .parserConfiguration({\n 'dot-notation': true, // foo.bar → { foo: { bar } }\n 'parse-numbers': false, // Don't auto-parse numbers to allow strings like \"0x1\"\n 'populate--': true, // Populate -- with all options so we can detected user-supplied vs defaults\n })\n .env('XL1')\n .scriptName('xl1')\n .middleware(async (argv) => {\n await configMiddleware(argv, (config) => {\n configuration = config\n })\n skipInsecureConfirm = Boolean(argv['skip-insecure-confirm'])\n })\n .options(optionsFromGlobalZodRegistry())\n .wrap(y.terminalWidth())\n .command(withDeprecationWarning(apiCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(bridgeCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(finalizerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(mempoolCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(producerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(rewardRedemptionCommand(getConfiguration, getLocatorsFromConfig)))\n .command(startCommand(getConfiguration, getLocatorsFromConfig))\n .options({\n 'config': {\n type: 'string',\n description: 'Path to a config file to use instead of the default search.',\n alias: 'c',\n },\n 'mnemonic': {\n type: 'string',\n description: 'Shared root mnemonic used by actors that do not define their own mnemonic.',\n },\n 'dump-config': {\n type: 'boolean',\n description: 'Just process the configuration and print the resolved config to stdout, then exit.',\n default: false,\n },\n 'skip-insecure-confirm': {\n type: 'boolean',\n description: 'Skip the interactive RETURN confirmation when the built-in dev mnemonic / insecure genesis reward wallet is active.',\n default: false,\n },\n })\n .help()\n .alias('help', 'h')\n .version(version)\n .argv\n\n await argv\n}\n","import { getApiActor } from '@xyo-network/chain-api'\nimport { getBridgeActor } from '@xyo-network/chain-bridge'\nimport { getFinalizerActor } from '@xyo-network/chain-finalizer'\nimport { getMempoolActor } from '@xyo-network/chain-mempool'\nimport type {\n ActorInstanceV3, GetLocatorsFromConfig, OrchestratorInstance,\n} from '@xyo-network/chain-orchestration'\nimport {\n ApiConfigZod,\n BridgeConfigZod,\n FinalizerConfigZod,\n MempoolConfigZod,\n ProducerConfigZod,\n RewardRedemptionConfigZod,\n} from '@xyo-network/chain-orchestration'\nimport { getProducerActor } from '@xyo-network/chain-producer'\nimport { getRewardRedemptionActor } from '@xyo-network/chain-reward-redemption'\nimport type { Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\nimport type {\n ArgumentsCamelCase, Argv, CommandModule,\n} from 'yargs'\n\nimport { initLogger } from '../../initLogger.ts'\n\ninterface StartArgs {\n actors?: string[]\n}\n\nconst KNOWN_ACTORS = ['api', 'bridge', 'finalizer', 'mempool', 'producer', 'rewardRedemption'] as const\n\nconst BOOT_TIMEOUT_MS = 60_000\n\nfunction getActorsFromConfig(configuration: Config): string[] | undefined {\n const enabledActors = configuration.actors\n .filter(actor => actor.enabled !== false)\n .map(actor => actor.name)\n return enabledActors.length > 0 ? enabledActors : undefined\n}\n\nfunction getDefaultActors(): string[] {\n return ['api', 'producer', 'finalizer']\n}\n\nasync function buildActor(\n name: string,\n locator: ProviderFactoryLocatorInstance,\n): Promise<ActorInstanceV3> {\n switch (name) {\n case 'api': {\n const config = ApiConfigZod.parse(locator.context.config)\n return await getApiActor(config, locator)\n }\n case 'bridge': {\n const config = BridgeConfigZod.parse(locator.context.config)\n return await getBridgeActor(config, locator)\n }\n case 'mempool': {\n const config = MempoolConfigZod.parse(locator.context.config)\n return await getMempoolActor(config, locator)\n }\n case 'producer': {\n const config = ProducerConfigZod.parse(locator.context.config)\n return await getProducerActor(config, locator)\n }\n case 'rewardRedemption': {\n const config = RewardRedemptionConfigZod.parse(locator.context.config)\n return await getRewardRedemptionActor(config, locator)\n }\n case 'finalizer': {\n const config = FinalizerConfigZod.parse(locator.context.config)\n return await getFinalizerActor(config, locator)\n }\n default: {\n throw new Error(`Unknown actor: ${name}`)\n }\n }\n}\n\nasync function bootActors(\n requestedActors: string[],\n locators: Record<string, ProviderFactoryLocatorInstance>,\n orchestrator: OrchestratorInstance,\n configuration: Config,\n): Promise<void> {\n const startedAt = Date.now()\n const actors = await Promise.all(requestedActors.map(name => buildActor(name, locators[name])))\n for (const actor of actors) {\n await orchestrator.registerActor(actor)\n }\n await orchestrator.start()\n await orchestrator.whenReady(BOOT_TIMEOUT_MS)\n const ms = Date.now() - startedAt\n initLogger(configuration).info(`[xl1] system ready (${requestedActors.length} actor${requestedActors.length === 1 ? '' : 's'}, ${ms}ms)`)\n}\n\nexport function startCommand(getConfiguration: () => Config, getLocatorsFromConfig: GetLocatorsFromConfig): CommandModule {\n return {\n command: ['start [actors..]', '$0'],\n describe: 'Run a full XL1 Node',\n builder: (yargs: Argv) => {\n return yargs\n .positional('actors', {\n type: 'string',\n array: true,\n choices: KNOWN_ACTORS,\n description: 'Actors to start (e.g. xl1 start api producer or xl1 start api,producer)',\n coerce: (values: string[]) => values.flatMap(v => v.split(',')),\n })\n .option('actors', {\n type: 'array',\n string: true,\n choices: KNOWN_ACTORS,\n description: 'List of actors to start (e.g. --actors api producer finalizer). Defaults to api, producer, and finalizer.',\n })\n },\n handler: async (argv: ArgumentsCamelCase<StartArgs>) => {\n const configuration = getConfiguration()\n const requestedActors = argv.actors !== undefined && argv.actors.length > 0\n ? argv.actors\n : getActorsFromConfig(configuration) ?? getDefaultActors()\n const { locators, orchestrator } = await getLocatorsFromConfig(requestedActors, configuration)\n await bootActors(requestedActors, locators, orchestrator, configuration)\n },\n }\n}\n","import { delay } from '@xylabs/sdk-js'\nimport type { CommandModule } from 'yargs'\n\nexport function withDeprecationWarning(module: CommandModule): CommandModule {\n const { deprecated, handler } = module\n if (typeof deprecated === 'string') {\n return {\n ...module,\n handler: async (argv) => {\n console.warn(`[deprecated] ${deprecated}`)\n await delay(3000)\n return handler(argv)\n },\n }\n }\n return module\n}\n","/* eslint-disable no-irregular-whitespace, @stylistic/max-len */\nexport const XL1LogoColorizedAscii = `\u001b[38;2;128;128;128m                    \u001b[0m\u001b[38;2;118;111;144m_\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;72;32;223m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   ╠╠\u001b[0m\u001b[38;2;103;85;170m_\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;79;121;152m╦\u001b[0m\u001b[38;2;82;121;151m╦\u001b[0m\u001b[38;2;112;125;136m_       \u001b[0m\u001b[38;2;88;59;196m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;73;34;221m▒       \u001b[0m\u001b[38;2;121;121;127m_\u001b[0m\u001b[38;2;100;101;128m╔\u001b[0m\u001b[38;2;93;94;127m╦\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;82;121;151m²\u001b[0m\u001b[38;2;44;116;170m╠\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;51;117;167mD\u001b[0m\u001b[38;2;80;121;152m╦\u001b[0m\u001b[38;2;111;125;136m_    \u001b[0m\u001b[38;2;67;23;232m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;120;121;128m_\u001b[0m\u001b[38;2;100;101;127m╔\u001b[0m\u001b[38;2;79;81;127mR\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;88;90;127m╙\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;55;117;165m╚\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;44;116;171m▒▒\u001b[0m\u001b[38;2;50;116;167mD\u001b[0m\u001b[38;2;80;121;152m╦ \u001b[0m\u001b[38;2;106;90;165mj\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;89;61;194mH \u001b[0m\u001b[38;2;99;100;127m╔\u001b[0m\u001b[38;2;79;80;127mD\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒▒╠\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;83;121;150m²\u001b[0m\u001b[38;2;44;116;170m▒\u001b[0m\u001b[38;2;44;116;171m▒▒▒ \u001b[0m\u001b[38;2;76;38;217m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;74;76;128m╠\u001b[0m\u001b[38;2;71;73;128m▒▒▒\u001b[0m\u001b[38;2;89;90;128m╙\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;90;118;148m\\`\u001b[0m\u001b[38;2;89;107;153m_\u001b[0m\u001b[38;2;93;97;154m,\u001b[0m\u001b[38;2;105;89;166m╓\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;95;72;183m╓\u001b[0m\u001b[38;2;106;96;152m_\u001b[0m\u001b[38;2;100;94;143m\\`\u001b[0m\u001b[38;2;101;100;133m\\`\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;122;118;137m_\u001b[0m\u001b[38;2;113;102;153m,\u001b[0m\u001b[38;2;108;94;161m╓\u001b[0m\u001b[38;2;104;86;169m╓\u001b[0m\u001b[38;2;98;77;178m╔\u001b[0m\u001b[38;2;93;67;188m╗\u001b[0m\u001b[38;2;88;59;196mφ\u001b[0m\u001b[38;2;83;51;204m@\u001b[0m\u001b[38;2;78;42;213mD\u001b[0m\u001b[38;2;72;32;223m▒\u001b[0m\u001b[38;2;68;24;231m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;71;30;225m▒\u001b[0m\u001b[38;2;77;40;215m▒\u001b[0m\u001b[38;2;82;49;206mK\u001b[0m\u001b[38;2;87;57;198mφ\u001b[0m\u001b[38;2;91;65;190m╗\u001b[0m\u001b[38;2;97;75;180m╦\u001b[0m\u001b[38;2;103;84;171m╖\u001b[0m\u001b[38;2;107;92;163m²\u001b[0m\u001b[38;2;112;101;154m_\u001b[0m\u001b[38;2;119;112;143m_\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;106;91;164m\\`\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;89;62;193m╙\u001b[0m\u001b[38;2;85;54;201m╙\u001b[0m\u001b[38;2;80;45;210m╚\u001b[0m\u001b[38;2;74;35;220m╝\u001b[0m\u001b[38;2;69;26;229m╠\u001b[0m\u001b[38;2;66;22;233m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;73;33;222m╝\u001b[0m\u001b[38;2;79;43;212m╩\u001b[0m\u001b[38;2;84;52;203m╜\u001b[0m\u001b[38;2;88;60;195m╙\u001b[0m\u001b[38;2;93;68;187m^\u001b[0m\u001b[38;2;100;80;175m\\`\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;113;84;152m\\`\u001b[0m\u001b[38;2;103;79;169m'\u001b[0m\u001b[38;2;95;72;183m\"\u001b[0m\u001b[38;2;87;57;198m╙\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;80;46;209m╜\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;102;77;175m^\u001b[0m\u001b[38;2;112;81;162m\\`\u001b[0m\u001b[38;2;115;92;155m\\`\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;145;116;107m,\u001b[0m\u001b[38;2;199;82;45m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒╠ \u001b[0m\u001b[38;2;70;28;227m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;189;49;97må\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;155;92;114m,\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;175;98;73m╔\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒▒▒\u001b[0m\u001b[38;2;197;83;47m╩ \u001b[0m\u001b[38;2;98;76;179m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;81;48;207mH \u001b[0m\u001b[38;2;188;51;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠╠\u001b[0m\u001b[38;2;183;57;100mH\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;146;116;106m,\u001b[0m\u001b[38;2;199;82;44m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;196;84;48m╩\u001b[0m\u001b[38;2;168;102;81m^    \u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;160;87;111m'\u001b[0m\u001b[38;2;187;52;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;156;91;113m,\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;198;83;46m╩\u001b[0m\u001b[38;2;194;85;50m╩\u001b[0m\u001b[38;2;167;102;82m^       \u001b[0m\u001b[38;2;81;46;209m╚\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠       \u001b[0m\u001b[38;2;159;88;112m'\u001b[0m\u001b[38;2;186;53;98m╚\u001b[0m\u001b[38;2;197;40;93m╩\u001b[0m\n\u001b[38;2;128;128;128m                  \u001b[0m\u001b[38;2;110;97;158m'\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;94;69;186mH\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;68;25;230m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;108;93;162m²\u001b[0m\u001b[38;2;99;79;176m^\u001b[0m`\n","import type { UsageMeta } from '@xyo-network/xl1-sdk'\nimport { isUsageMeta } from '@xyo-network/xl1-sdk'\nimport type { Options } from 'yargs'\nimport { globalRegistry } from 'zod'\n\nconst usageMetaToOptions = (meta: UsageMeta): Options => {\n return meta\n}\n\nexport const optionsFromGlobalZodRegistry = (): Record<string, Options> => {\n const opts: Record<string, Options> = {}\n for (const schema of Object.values(globalRegistry._map)) {\n if (isUsageMeta(schema)) {\n if (schema.hidden) continue // skip hidden options\n opts[schema.title] = usageMetaToOptions(schema)\n }\n }\n return opts\n}\n","import { config } from 'dotenv'\n\nimport { runCLI } from './runCLI.ts'\n\nexport const start = async () => {\n config({ quiet: true })\n await runCLI()\n}\n"],"mappings":"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","names":["createDeepMerge","isDefined","ActorMnemonicNotAllowedError","assertNoActorMnemonics","ConfigFileNotFoundError","tryParseConfig","ConfigZod","isZodError","resolveConfig","deepMerge","createDeepMerge","arrayStrategy","coerceActorsArray","argv","actors","undefined","Array","isArray","entries","Object","numericEntries","map","key","value","Number","filter","isInteger","length","asArray","safeParseOrThrow","input","result","ConfigZod","safeParse","success","error","data","buildFinalConfig","configPath","config","parsedConfigFile","tryParseConfig","rootMnemonicFromFile","mnemonic","normalizedArgv","parsedConfigArgs","rootMnemonicFromArgs","mergedConfig","validated","resolveConfig","rootMnemonic","isDefined","configMiddleware","setConfiguration","finalConfig","assertNoActorMnemonics","console","log","JSON","stringify","process","exit","err","ConfigFileNotFoundError","message","ActorMnemonicNotAllowedError","isZodError","Error","stack","cause","Base","ConsoleLogger","isDefined","LogLevel","SilentLogger","initLogger","config","logger","log","silent","SilentLogger","level","isDefined","logLevel","parsed","LogLevel","toLowerCase","ConsoleLogger","Base","defaultLogger","stdin","input","stdout","output","createInterface","isDefined","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","contextFromConfigWithoutLocator","detectDerivationPathCollisions","formatWalletReport","initializeResolvedWalletReport","locatorsFromConfig","Orchestrator","initHealthEndpoints","producerCommand","rewardRedemptionCommand","ActorConfigZod","ConfigZod","DefaultMetricsScrapePorts","yargs","hideBin","getApiActor","getBridgeActor","getFinalizerActor","getMempoolActor","ApiConfigZod","BridgeConfigZod","FinalizerConfigZod","MempoolConfigZod","ProducerConfigZod","RewardRedemptionConfigZod","getProducerActor","getRewardRedemptionActor","KNOWN_ACTORS","BOOT_TIMEOUT_MS","getActorsFromConfig","configuration","enabledActors","actors","filter","actor","enabled","map","name","length","undefined","getDefaultActors","buildActor","locator","config","ApiConfigZod","parse","context","getApiActor","BridgeConfigZod","getBridgeActor","MempoolConfigZod","getMempoolActor","ProducerConfigZod","getProducerActor","RewardRedemptionConfigZod","getRewardRedemptionActor","FinalizerConfigZod","getFinalizerActor","Error","bootActors","requestedActors","locators","orchestrator","startedAt","Date","now","Promise","all","registerActor","start","whenReady","ms","initLogger","info","startCommand","getConfiguration","getLocatorsFromConfig","command","describe","builder","yargs","positional","type","array","choices","description","coerce","values","flatMap","v","split","option","string","handler","argv","delay","withDeprecationWarning","module","deprecated","handler","argv","console","warn","delay","XL1LogoColorizedAscii","isUsageMeta","globalRegistry","usageMetaToOptions","meta","optionsFromGlobalZodRegistry","opts","schema","Object","values","globalRegistry","_map","isUsageMeta","hidden","title","DEFAULT_HEALTH_CHECK_PORT","defaultScrapePortForActors","actors","primary","key","DefaultMetricsScrapePorts","producer","configuration","skipInsecureConfirm","version","isDefined","__VERSION__","getConfiguration","promptForInsecureGenesisConfirmation","logger","input","isTTY","output","warn","rl","createInterface","question","close","getLocatorsFromConfig","actorConfigs","actorName","existingConfig","find","actor","name","push","actorConfig","ActorConfigZod","loose","parse","config","ConfigZod","initLogger","orchestrator","Orchestrator","create","collision","detectDerivationPathCollisions","walletReport","initializeResolvedWalletReport","info","formatWalletReport","serviceName","length","context","contextFromConfigWithoutLocator","onInsecureGenesisConfirm","undefined","locators","locatorsFromConfig","healthCheckPort","healthServer","statusReporter","initHealthEndpoints","port","readiness","statusMonitor","process","on","log","stop","exit","err","error","runCLI","y","yargs","hideBin","argv","usage","XL1LogoColorizedAscii","parserConfiguration","env","scriptName","middleware","configMiddleware","Boolean","options","optionsFromGlobalZodRegistry","wrap","terminalWidth","command","withDeprecationWarning","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","producerCommand","rewardRedemptionCommand","startCommand","type","description","alias","default","help","config","start","config","quiet","runCLI"]}
1
+ {"version":3,"sources":["../../src/configMiddleware.ts","../../src/initLogger.ts","../../src/runCLI.ts","../../src/commands/start/startCommand.ts","../../src/commands/withDeprecationWarning.ts","../../src/dumpProviders.ts","../../src/images.ts","../../src/optionsFromGlobalZodRegistry.ts","../../src/start.ts"],"sourcesContent":["import { createDeepMerge, isDefined } from '@xylabs/sdk-js'\nimport {\n ActorMnemonicNotAllowedError,\n assertNoActorMnemonics,\n ConfigFileNotFoundError,\n tryParseConfig,\n} from '@xyo-network/chain-orchestration'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport {\n ConfigZod, isZodError, resolveConfig,\n} from '@xyo-network/xl1-sdk'\n\nconst deepMerge = createDeepMerge({ arrayStrategy: 'concat' })\ntype ConfigWithMnemonic = Config & { mnemonic?: string }\n\nconst REDACTED = '[REDACTED]'\n\n/**\n * Names that always redact, regardless of nesting level. `connectionString` is\n * included because Mongo connection URIs commonly embed `user:password@host`.\n */\nconst REDACTED_KEY_NAMES = new Set<string>(['mnemonic', 'connectionString'])\n\n/**\n * Suffix-matched key names that redact. Catches any future `*PrivateKey`,\n * `*Secret`, or `*Password` field without us having to enumerate them here.\n */\nconst REDACTED_KEY_SUFFIX = /(PrivateKey|Secret|Password)$/i\n\nfunction shouldRedactKey(key: string): boolean {\n if (REDACTED_KEY_NAMES.has(key)) return true\n return REDACTED_KEY_SUFFIX.test(key)\n}\n\n/**\n * Returns a deep clone of `config` with secret-bearing leaf values replaced by\n * `'[REDACTED]'`. Walks plain objects and arrays. Leaves primitives, dates,\n * and other non-plain values untouched (other than via `structuredClone`).\n */\nexport function redactConfig<T>(config: T): T {\n const cloned = structuredClone(config) as unknown\n redactInPlace(cloned)\n return cloned as T\n}\n\nfunction redactInPlace(node: unknown): void {\n if (Array.isArray(node)) {\n for (const item of node) redactInPlace(item)\n return\n }\n if (node === null || typeof node !== 'object') return\n const obj = node as Record<string, unknown>\n for (const key of Object.keys(obj)) {\n if (shouldRedactKey(key) && obj[key] !== undefined && obj[key] !== null) {\n obj[key] = REDACTED\n } else {\n redactInPlace(obj[key])\n }\n }\n}\n\n/**\n * Yargs `.env()` with `dot-notation` turns `XL1_ACTORS__0__NAME=foo` into\n * `{ actors: { '0': { name: 'foo' } } }` — an object keyed by string indices\n * rather than an array. Normalize that back into an array so ConfigZod's\n * `actors` array schema accepts it.\n */\nfunction coerceActorsArray(argv: Record<string, unknown>): Record<string, unknown> {\n const actors = argv.actors\n if (actors === undefined || Array.isArray(actors)) return argv\n if (typeof actors !== 'object' || actors === null) return argv\n const entries = Object.entries(actors as Record<string, unknown>)\n const numericEntries = entries\n .map(([key, value]) => [Number(key), value] as const)\n .filter(([key]) => Number.isInteger(key) && key >= 0)\n if (numericEntries.length !== entries.length) return argv\n const asArray: unknown[] = []\n for (const [key, value] of numericEntries) asArray[key] = value\n return { ...argv, actors: asArray }\n}\n\nfunction safeParseOrThrow(input: unknown): Config {\n const result = ConfigZod.safeParse(input)\n if (!result.success) throw result.error\n return result.data as Config\n}\n\nasync function buildFinalConfig(argv: Record<string, unknown>): Promise<ConfigWithMnemonic> {\n // Parse the various config sources\n const configPath = argv.config as string | undefined\n const parsedConfigFile = await tryParseConfig({ configPath }) as ConfigWithMnemonic // Config file\n const rootMnemonicFromFile = typeof parsedConfigFile.mnemonic === 'string' ? parsedConfigFile.mnemonic : undefined\n const normalizedArgv = coerceActorsArray(argv)\n const parsedConfigArgs = ConfigZod.safeParse(normalizedArgv).data ?? {} // Command-line arguments & ENV VARs\n const rootMnemonicFromArgs = typeof normalizedArgv.mnemonic === 'string' ? normalizedArgv.mnemonic : undefined\n // Deep merge with precedence\n // TODO: Would like precedence to be defaults < file < ENV < CLI Args\n // but there is currently no way to determine which are defaults vs\n // user-supplied CLI Args since we set the CLI args to the defaults\n // and receive a flattened object. We might need to manually invoke\n // the parser without the defaults to achieve this.\n const mergedConfig = safeParseOrThrow(deepMerge(parsedConfigFile, parsedConfigArgs))\n const validated = safeParseOrThrow(resolveConfig(safeParseOrThrow(mergedConfig)))\n const rootMnemonic = rootMnemonicFromArgs ?? rootMnemonicFromFile\n return isDefined(rootMnemonic) ? { ...validated, mnemonic: rootMnemonic } : validated\n}\n\nexport async function configMiddleware(argv: Record<string, unknown>, setConfiguration: (config: Config) => void): Promise<void> {\n try {\n const finalConfig = await buildFinalConfig(argv)\n // Hard-fail if any actor was configured with its own mnemonic. Mnemonics\n // must live at the root; actors pick their wallet via accountPath.\n assertNoActorMnemonics(finalConfig)\n setConfiguration(finalConfig as Config)\n\n // Check if user wants to dump config and exit. Default behavior redacts\n // secrets (mnemonics, private keys, passwords, connection strings). Pass\n // `--with-secrets` to see the raw values — useful only on a developer box.\n if (argv['dump-config']) {\n const withSecrets = Boolean(argv['with-secrets'])\n const output = withSecrets ? finalConfig : redactConfig(finalConfig)\n console.log(JSON.stringify(output, null, 2))\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0)\n }\n } catch (err) {\n if (err instanceof ConfigFileNotFoundError) {\n console.error(`${err.message}. Check the path passed to --config/-c and try again.`)\n } else if (err instanceof ActorMnemonicNotAllowedError) {\n console.error(err.message)\n } else if (isZodError(err)) {\n console.error(`Zod error: ${err.message}`)\n } else {\n console.error(`Error parsing configuration: ${err}`)\n }\n if (!(err instanceof ConfigFileNotFoundError) && !(err instanceof ActorMnemonicNotAllowedError)) {\n console.error(`Stack: ${err instanceof Error ? err.stack : 'N/A'}`)\n }\n throw new Error('Invalid configuration', { cause: err })\n }\n}\n","import type { Logger, LogLevelValue } from '@xylabs/sdk-js'\nimport {\n Base,\n ConsoleLogger, isDefined,\n LogLevel, SilentLogger,\n} from '@xylabs/sdk-js'\nimport type { BaseConfig } from '@xyo-network/xl1-sdk'\n\nexport const initLogger = (config: BaseConfig): Logger => {\n let logger: Logger\n if (config.log.silent) {\n logger = new SilentLogger()\n } else {\n let level: LogLevelValue | undefined\n if (isDefined(config.log.logLevel)) {\n const parsed = LogLevel[config.log.logLevel.toLowerCase() as keyof typeof LogLevel]\n if (isDefined(parsed)) level = parsed\n }\n logger = new ConsoleLogger(level)\n }\n Base.defaultLogger = logger\n return logger\n}\n","import { stdin as input, stdout as output } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\n\nimport { isDefined } from '@xylabs/sdk-js'\nimport { apiCommand } from '@xyo-network/chain-api'\nimport { bridgeCommand } from '@xyo-network/chain-bridge'\nimport { finalizerCommand } from '@xyo-network/chain-finalizer'\nimport { mempoolCommand } from '@xyo-network/chain-mempool'\nimport {\n contextFromConfigWithoutLocator, detectDerivationPathCollisions, formatWalletReport, initializeResolvedWalletReport,\n locatorsFromConfig, Orchestrator,\n} from '@xyo-network/chain-orchestration'\nimport { initHealthEndpoints } from '@xyo-network/chain-orchestration-express'\nimport { producerCommand } from '@xyo-network/chain-producer'\nimport { rewardRedemptionCommand } from '@xyo-network/chain-reward-redemption'\nimport type { ActorConfig, Config } from '@xyo-network/xl1-sdk'\nimport {\n ActorConfigZod, ConfigZod, DefaultMetricsScrapePorts,\n} from '@xyo-network/xl1-sdk'\nimport type { Argv } from 'yargs'\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\n\nimport { startCommand, withDeprecationWarning } from './commands/index.ts'\nimport { configMiddleware } from './configMiddleware.ts'\nimport { formatProviderTree } from './dumpProviders.ts'\nimport { XL1LogoColorizedAscii } from './images.ts'\nimport { initLogger } from './initLogger.ts'\nimport { optionsFromGlobalZodRegistry } from './optionsFromGlobalZodRegistry.ts'\n\n/** Version string injected by Rollup at build time. */\ndeclare const __VERSION__: string\n\nconst DEFAULT_HEALTH_CHECK_PORT = 9090\n\n/**\n * Maps a CLI actor name to its registered Prometheus scrape port. The CLI-level\n * exporter (one per process) defaults to the port of the first requested actor\n * so that running, e.g., `xl1 start producer` and `xl1 start api` side-by-side\n * doesn't fight over a single shared default.\n */\nfunction defaultScrapePortForActors(actors: readonly string[]): number {\n const primary = actors[0]\n const key = primary === 'rewardRedemption' ? 'rewardRedemptionApi' : primary\n return (DefaultMetricsScrapePorts as Record<string, number>)[key] ?? DefaultMetricsScrapePorts.producer\n}\n\n/**\n * The configuration that will be used throughout the CLI.\n * This is materialized after parsing the command-line arguments,\n * environment variables, and defaults.\n */\nlet configuration: Config\nlet skipInsecureConfirm = false\nlet dumpProviders = false\n\nconst version = isDefined(__VERSION__) ? __VERSION__ : 'unknown'\n\nfunction getConfiguration(): Config {\n return configuration\n}\n\nasync function promptForInsecureGenesisConfirmation(logger: ReturnType<typeof initLogger>) {\n if (!input.isTTY || !output.isTTY) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped because this session is not a TTY.')\n return\n }\n const rl = createInterface({ input, output })\n try {\n await rl.question('Insecure genesis reward wallet is active. Hit RETURN to continue.')\n } finally {\n rl.close()\n }\n}\n\nasync function getLocatorsFromConfig(actors: string[], configuration: Config) {\n const actorConfigs: ActorConfig[] = []\n for (const actorName of actors) {\n const existingConfig = configuration.actors.find(actor => actor.name === actorName)\n if (existingConfig) {\n actorConfigs.push(existingConfig)\n } else {\n const actorConfig = ActorConfigZod.loose().parse({ name: actorName })\n actorConfigs.push(actorConfig)\n }\n }\n\n const config = ConfigZod.parse({ ...configuration, actors: actorConfigs })\n\n const logger = initLogger(configuration)\n const orchestrator = await Orchestrator.create({ logger })\n const collision = detectDerivationPathCollisions(actors, configuration)\n if (collision) throw collision\n const walletReport = await initializeResolvedWalletReport(actors, configuration)\n logger.info(formatWalletReport(walletReport))\n const serviceName = actors.length === 1 ? `xl1-${actors[0]}` : 'xl1-cli'\n const context = await contextFromConfigWithoutLocator(config, logger, serviceName, version, defaultScrapePortForActors(actors))\n if (skipInsecureConfirm) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped via --skip-insecure-confirm.')\n }\n const onInsecureGenesisConfirm = skipInsecureConfirm\n ? undefined\n : async () => await promptForInsecureGenesisConfirmation(logger)\n const locators = await locatorsFromConfig(context, config, onInsecureGenesisConfirm)\n\n // `--dump-providers`: render the locator map and halt before the actor's\n // runner starts. Health endpoints and the SIGINT handler below are skipped.\n if (dumpProviders) {\n console.log(formatProviderTree(locators))\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0)\n }\n\n const healthCheckPort = configuration.healthCheckPort ?? DEFAULT_HEALTH_CHECK_PORT\n const healthServer = healthCheckPort > 0 && context.statusReporter !== undefined\n ? await initHealthEndpoints({\n logger,\n port: healthCheckPort,\n readiness: orchestrator,\n statusMonitor: context.statusReporter,\n })\n : undefined\n\n // Handle cancellation (Ctrl+C)\n process.on('SIGINT', () => {\n void (async () => {\n try {\n logger.log('\\nSIGINT received. Attempting graceful shutdown...')\n healthServer?.close()\n await orchestrator?.stop()\n logger.log('Orchestrator stopped, exiting now.')\n process.exit(0)\n } catch (err) {\n logger.error('Error stopping orchestrator:', err)\n process.exit(1)\n }\n })()\n })\n return { locators, orchestrator }\n}\n\n// Main entry point\nexport async function runCLI() {\n // Parse command-line arguments using Yargs\n const y = yargs(hideBin(process.argv)) as Argv<Config>\n const argv = y\n .usage(`\n🚀 XL1 Node CLI (${version})\n${XL1LogoColorizedAscii}\nRun various components of the XL1 ecosystem.\n\nUsage:\n$0 <command> [options]`)\n .parserConfiguration({\n 'dot-notation': true, // foo.bar → { foo: { bar } }\n 'parse-numbers': false, // Don't auto-parse numbers to allow strings like \"0x1\"\n 'populate--': true, // Populate -- with all options so we can detected user-supplied vs defaults\n })\n .env('XL1')\n .scriptName('xl1')\n .middleware(async (argv) => {\n await configMiddleware(argv, (config) => {\n configuration = config\n })\n skipInsecureConfirm = Boolean(argv['skip-insecure-confirm'])\n dumpProviders = Boolean(argv['dump-providers'])\n })\n .options(optionsFromGlobalZodRegistry())\n .wrap(y.terminalWidth())\n .command(withDeprecationWarning(apiCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(bridgeCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(finalizerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(mempoolCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(producerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(rewardRedemptionCommand(getConfiguration, getLocatorsFromConfig)))\n .command(startCommand(getConfiguration, getLocatorsFromConfig))\n .options({\n 'config': {\n type: 'string',\n description: 'Path to a config file to use instead of the default search.',\n alias: 'c',\n },\n 'mnemonic': {\n type: 'string',\n description: 'Shared root mnemonic used by actors that do not define their own mnemonic.',\n },\n 'dump-config': {\n type: 'boolean',\n description: 'Just process the configuration and print the resolved config to stdout, then exit. Secrets are redacted unless --with-secrets is also passed.',\n default: false,\n },\n 'with-secrets': {\n type: 'boolean',\n description: 'When used with --dump-config, print raw secret values (mnemonic, private keys, passwords) instead of \"[REDACTED]\". Use only on a developer machine.',\n default: false,\n },\n 'dump-providers': {\n type: 'boolean',\n description: 'Run the normal command flow up to provider locator construction, print the per-actor provider tree (with duplicate detection), then exit.',\n default: false,\n },\n 'skip-insecure-confirm': {\n type: 'boolean',\n description: 'Skip the interactive RETURN confirmation when the built-in dev mnemonic / insecure genesis reward wallet is active.',\n default: false,\n },\n })\n .help()\n .alias('help', 'h')\n .version(version)\n .argv\n\n await argv\n}\n","import { getApiActor } from '@xyo-network/chain-api'\nimport { getBridgeActor } from '@xyo-network/chain-bridge'\nimport { getFinalizerActor } from '@xyo-network/chain-finalizer'\nimport { getMempoolActor } from '@xyo-network/chain-mempool'\nimport type {\n ActorInstanceV3, GetLocatorsFromConfig, OrchestratorInstance,\n} from '@xyo-network/chain-orchestration'\nimport {\n ApiConfigZod,\n BridgeConfigZod,\n FinalizerConfigZod,\n MempoolConfigZod,\n ProducerConfigZod,\n RewardRedemptionConfigZod,\n} from '@xyo-network/chain-orchestration'\nimport { getProducerActor } from '@xyo-network/chain-producer'\nimport { getRewardRedemptionActor } from '@xyo-network/chain-reward-redemption'\nimport type { Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\nimport type {\n ArgumentsCamelCase, Argv, CommandModule,\n} from 'yargs'\n\nimport { initLogger } from '../../initLogger.ts'\n\ninterface StartArgs {\n actors?: string[]\n}\n\nconst KNOWN_ACTORS = ['api', 'bridge', 'finalizer', 'mempool', 'producer', 'rewardRedemption'] as const\n\nconst BOOT_TIMEOUT_MS = 60_000\n\nfunction getActorsFromConfig(configuration: Config): string[] | undefined {\n const enabledActors = configuration.actors\n .filter(actor => actor.enabled !== false)\n .map(actor => actor.name)\n return enabledActors.length > 0 ? enabledActors : undefined\n}\n\nfunction getDefaultActors(): string[] {\n return ['api', 'producer', 'finalizer']\n}\n\nasync function buildActor(\n name: string,\n locator: ProviderFactoryLocatorInstance,\n): Promise<ActorInstanceV3> {\n switch (name) {\n case 'api': {\n const config = ApiConfigZod.parse(locator.context.config)\n return await getApiActor(config, locator)\n }\n case 'bridge': {\n const config = BridgeConfigZod.parse(locator.context.config)\n return await getBridgeActor(config, locator)\n }\n case 'mempool': {\n const config = MempoolConfigZod.parse(locator.context.config)\n return await getMempoolActor(config, locator)\n }\n case 'producer': {\n const config = ProducerConfigZod.parse(locator.context.config)\n return await getProducerActor(config, locator)\n }\n case 'rewardRedemption': {\n const config = RewardRedemptionConfigZod.parse(locator.context.config)\n return await getRewardRedemptionActor(config, locator)\n }\n case 'finalizer': {\n const config = FinalizerConfigZod.parse(locator.context.config)\n return await getFinalizerActor(config, locator)\n }\n default: {\n throw new Error(`Unknown actor: ${name}`)\n }\n }\n}\n\nasync function bootActors(\n requestedActors: string[],\n locators: Record<string, ProviderFactoryLocatorInstance>,\n orchestrator: OrchestratorInstance,\n configuration: Config,\n): Promise<void> {\n const startedAt = Date.now()\n const actors = await Promise.all(requestedActors.map(name => buildActor(name, locators[name])))\n for (const actor of actors) {\n await orchestrator.registerActor(actor)\n }\n await orchestrator.start()\n await orchestrator.whenReady(BOOT_TIMEOUT_MS)\n const ms = Date.now() - startedAt\n initLogger(configuration).info(`[xl1] system ready (${requestedActors.length} actor${requestedActors.length === 1 ? '' : 's'}, ${ms}ms)`)\n}\n\nexport function startCommand(getConfiguration: () => Config, getLocatorsFromConfig: GetLocatorsFromConfig): CommandModule {\n return {\n command: ['start [actors..]', '$0'],\n describe: 'Run a full XL1 Node',\n builder: (yargs: Argv) => {\n return yargs\n .positional('actors', {\n type: 'string',\n array: true,\n choices: KNOWN_ACTORS,\n description: 'Actors to start (e.g. xl1 start api producer or xl1 start api,producer)',\n coerce: (values: string[]) => values.flatMap(v => v.split(',')),\n })\n .option('actors', {\n type: 'array',\n string: true,\n choices: KNOWN_ACTORS,\n description: 'List of actors to start (e.g. --actors api producer finalizer). Defaults to api, producer, and finalizer.',\n })\n },\n handler: async (argv: ArgumentsCamelCase<StartArgs>) => {\n const configuration = getConfiguration()\n const requestedActors = argv.actors !== undefined && argv.actors.length > 0\n ? argv.actors\n : getActorsFromConfig(configuration) ?? getDefaultActors()\n const { locators, orchestrator } = await getLocatorsFromConfig(requestedActors, configuration)\n await bootActors(requestedActors, locators, orchestrator, configuration)\n },\n }\n}\n","import { delay } from '@xylabs/sdk-js'\nimport type { CommandModule } from 'yargs'\n\nexport function withDeprecationWarning(module: CommandModule): CommandModule {\n const { deprecated, handler } = module\n if (typeof deprecated === 'string') {\n return {\n ...module,\n handler: async (argv) => {\n console.warn(`[deprecated] ${deprecated}`)\n await delay(3000)\n return handler(argv)\n },\n }\n }\n return module\n}\n","import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\n\n/**\n * One row in the per-actor provider tree. Captures the moniker (registry key),\n * the implementation class, the dependency monikers the factory declared, the\n * factory scope, and a `count` of how many times an identical fingerprint\n * appeared in the same moniker bucket. The registry can hold the same factory\n * more than once (e.g. via merges or multi-moniker registrations); collapsing\n * keeps the tree readable while still surfacing the multiplicity.\n */\ninterface ProviderEntry {\n count: number\n dependencies: readonly string[]\n moniker: string\n providerName: string\n scope: string\n}\n\nconst CANONICAL_ACTOR_ORDER: readonly string[] = [\n '_root', 'producer', 'finalizer', 'api', 'mempool', 'bridge', 'rewardRedemption',\n]\n\n/**\n * Enumerates the providers registered directly on a single locator. Does not\n * walk the parent chain — each locator is reported on its own so that a reader\n * can see exactly which providers a given actor contributed versus what it\n * inherits from `_root`.\n */\nfunction enumerateLocator(locator: ProviderFactoryLocatorInstance): ProviderEntry[] {\n const collapsed = new Map<string, ProviderEntry>()\n const registry = locator.registry as Record<string, unknown[] | undefined>\n for (const moniker of Object.keys(registry)) {\n const factories = registry[moniker]\n if (!factories) continue\n for (const factory of factories) {\n const f = factory as { dependencies?: readonly string[]; providerName?: string; scope?: string }\n const providerName = f.providerName ?? '<unknown>'\n const scope = f.scope ?? '<unknown>'\n const dependencies = f.dependencies ?? []\n const fingerprint = `${moniker}|${providerName}|${scope}|${dependencies.join(',')}`\n const existing = collapsed.get(fingerprint)\n if (existing) {\n existing.count += 1\n } else {\n collapsed.set(fingerprint, {\n count: 1, dependencies, moniker, providerName, scope,\n })\n }\n }\n }\n return [...collapsed.values()].toSorted((a, b) => a.moniker.localeCompare(b.moniker) || a.providerName.localeCompare(b.providerName))\n}\n\nfunction buildOwnerIndex(perActor: ReadonlyMap<string, readonly ProviderEntry[]>): Map<string, Set<string>> {\n const monikerOwners = new Map<string, Set<string>>()\n for (const [actorName, entries] of perActor) {\n for (const entry of entries) {\n let owners = monikerOwners.get(entry.moniker)\n if (!owners) {\n owners = new Set()\n monikerOwners.set(entry.moniker, owners)\n }\n owners.add(actorName)\n }\n }\n return monikerOwners\n}\n\nfunction renderDuplicatesSummary(monikerOwners: ReadonlyMap<string, ReadonlySet<string>>): string[] {\n const duplicates = [...monikerOwners.entries()]\n .filter(([, owners]) => owners.size > 1)\n .map(([moniker, owners]) => ({ moniker, owners: [...owners].toSorted().map(formatGroupForDisplay) }))\n .toSorted((a, b) => a.moniker.localeCompare(b.moniker))\n if (duplicates.length === 0) return []\n const lines = ['Duplicate monikers (registered by more than one locator):']\n for (const { moniker, owners } of duplicates) {\n lines.push(` - ${moniker}: ${owners.join(', ')}`)\n }\n lines.push('')\n return lines\n}\n\n/**\n * Groups actor names whose locators share the same `registry` object reference.\n * Under the shared-locator architecture (Option B), api/mempool/finalizer all\n * point to view locators that share one underlying registry — without this\n * grouping, the dump would print the same factory set N times and falsely\n * report every moniker as \"duplicate across actors.\"\n */\nfunction groupActorsBySharedRegistry(\n locators: Record<string, ProviderFactoryLocatorInstance>,\n): { actorNames: readonly string[]; locator: ProviderFactoryLocatorInstance }[] {\n const groups: { actorNames: string[]; locator: ProviderFactoryLocatorInstance; registry: unknown }[] = []\n for (const actorName of Object.keys(locators)) {\n const locator = locators[actorName]\n const existing = groups.find(g => g.registry === locator.registry)\n if (existing) {\n existing.actorNames.push(actorName)\n } else {\n groups.push({\n actorNames: [actorName], locator, registry: locator.registry,\n })\n }\n }\n return groups\n}\n\n/**\n * Stable id for a registry-sharing group: sorted, comma-joined actor names.\n * Used as the key in `monikerOwners`. Multi-actor group ids contain commas;\n * we display them parenthesized in the `also in:` annotation.\n */\nfunction groupId(actorNames: readonly string[]): string {\n return [...actorNames].toSorted().join(',')\n}\n\nfunction formatGroupForDisplay(groupKey: string): string {\n const members = groupKey.split(',')\n return members.length === 1 ? members[0] : `(${members.join(', ')})`\n}\n\nfunction renderGroupSection(\n actorNames: readonly string[],\n entries: readonly ProviderEntry[],\n monikerOwners: ReadonlyMap<string, ReadonlySet<string>>,\n): string[] {\n const sortedActors = [...actorNames].toSorted()\n const ownGroupKey = groupId(sortedActors)\n const heading = sortedActors.length === 1\n ? `Providers for actor: ${sortedActors[0]} (${entries.length} registered)`\n : `Providers shared by actors: ${sortedActors.join(', ')} (${entries.length} registered)`\n const lines: string[] = [heading]\n if (entries.length === 0) {\n lines.push(' (none)', '')\n return lines\n }\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const isLast = i === entries.length - 1\n const branch = isLast ? '└──' : '├──'\n const owners = monikerOwners.get(entry.moniker) ?? new Set<string>()\n const otherOwners = [...owners]\n .filter(o => o !== ownGroupKey)\n .toSorted()\n .map(formatGroupForDisplay)\n const dupNote = otherOwners.length > 0 ? ` ⚠ also in: ${otherOwners.join(', ')}` : ''\n const depsNote = entry.dependencies.length > 0 ? `, deps: [${entry.dependencies.join(', ')}]` : ''\n const countNote = entry.count > 1 ? ` (×${entry.count})` : ''\n lines.push(` ${branch} ${entry.moniker}${countNote} [impl: ${entry.providerName}, scope: ${entry.scope}${depsNote}]${dupNote}`)\n }\n lines.push('')\n return lines\n}\n\n/**\n * Renders the locator map as a tree grouped by registry identity, annotating\n * any moniker that appears in more than one *registry* with `⚠ also in: ...`.\n *\n * - When all input locators share one registry (shared-locator path), a single\n * \"Providers shared by actors: …\" section is rendered.\n * - When some actors have distinct registries (legacy `_root` + per-actor\n * child architecture), each registry is rendered separately. `_root` is\n * ordered first.\n *\n * The \"Duplicate monikers\" summary at the bottom only flags monikers\n * registered by *different* registries — duplicates within one registry are\n * already collapsed into per-entry `(×N)` counts by `enumerateLocator`.\n */\nexport function formatProviderTree(locators: Record<string, ProviderFactoryLocatorInstance>): string {\n const groups = groupActorsBySharedRegistry(locators)\n\n // Per-actor moniker ownership (used for the \"also in:\" annotation), but\n // attribute each moniker to the GROUP it belongs to — the \"actor name\" the\n // index uses is the joined group key, so two actors that share a registry\n // never appear as duplicates of each other.\n const groupKeys = groups.map(g => ({ ...g, key: groupId(g.actorNames) }))\n const perGroup = new Map<string, ProviderEntry[]>()\n for (const g of groupKeys) perGroup.set(g.key, enumerateLocator(g.locator))\n const monikerOwners = buildOwnerIndex(perGroup)\n\n // Order: legacy `_root` first when present; otherwise alphabetical by sorted\n // actor names within the group, with the canonical actor order applied to\n // the *primary* (sorted-first) actor name in each group.\n const orderedGroups = [...groupKeys].toSorted((a, b) => {\n const aHasRoot = a.actorNames.includes('_root')\n const bHasRoot = b.actorNames.includes('_root')\n if (aHasRoot !== bHasRoot) return aHasRoot ? -1 : 1\n const ai = CANONICAL_ACTOR_ORDER.indexOf(a.actorNames[0])\n const bi = CANONICAL_ACTOR_ORDER.indexOf(b.actorNames[0])\n if (ai !== bi) return (ai === -1 ? Number.MAX_SAFE_INTEGER : ai) - (bi === -1 ? Number.MAX_SAFE_INTEGER : bi)\n return a.key.localeCompare(b.key)\n })\n\n const lines: string[] = ['XL1 Provider Dump', '=================', '']\n for (const g of orderedGroups) {\n lines.push(...renderGroupSection(g.actorNames.toSorted(), perGroup.get(g.key) ?? [], monikerOwners))\n }\n lines.push(...renderDuplicatesSummary(monikerOwners))\n return lines.join('\\n')\n}\n","/* eslint-disable no-irregular-whitespace, @stylistic/max-len */\nexport const XL1LogoColorizedAscii = `\u001b[38;2;128;128;128m                    \u001b[0m\u001b[38;2;118;111;144m_\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;72;32;223m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   ╠╠\u001b[0m\u001b[38;2;103;85;170m_\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;79;121;152m╦\u001b[0m\u001b[38;2;82;121;151m╦\u001b[0m\u001b[38;2;112;125;136m_       \u001b[0m\u001b[38;2;88;59;196m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;73;34;221m▒       \u001b[0m\u001b[38;2;121;121;127m_\u001b[0m\u001b[38;2;100;101;128m╔\u001b[0m\u001b[38;2;93;94;127m╦\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;82;121;151m²\u001b[0m\u001b[38;2;44;116;170m╠\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;51;117;167mD\u001b[0m\u001b[38;2;80;121;152m╦\u001b[0m\u001b[38;2;111;125;136m_    \u001b[0m\u001b[38;2;67;23;232m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;120;121;128m_\u001b[0m\u001b[38;2;100;101;127m╔\u001b[0m\u001b[38;2;79;81;127mR\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;88;90;127m╙\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;55;117;165m╚\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;44;116;171m▒▒\u001b[0m\u001b[38;2;50;116;167mD\u001b[0m\u001b[38;2;80;121;152m╦ \u001b[0m\u001b[38;2;106;90;165mj\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;89;61;194mH \u001b[0m\u001b[38;2;99;100;127m╔\u001b[0m\u001b[38;2;79;80;127mD\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒▒╠\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;83;121;150m²\u001b[0m\u001b[38;2;44;116;170m▒\u001b[0m\u001b[38;2;44;116;171m▒▒▒ \u001b[0m\u001b[38;2;76;38;217m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;74;76;128m╠\u001b[0m\u001b[38;2;71;73;128m▒▒▒\u001b[0m\u001b[38;2;89;90;128m╙\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;90;118;148m\\`\u001b[0m\u001b[38;2;89;107;153m_\u001b[0m\u001b[38;2;93;97;154m,\u001b[0m\u001b[38;2;105;89;166m╓\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;95;72;183m╓\u001b[0m\u001b[38;2;106;96;152m_\u001b[0m\u001b[38;2;100;94;143m\\`\u001b[0m\u001b[38;2;101;100;133m\\`\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;122;118;137m_\u001b[0m\u001b[38;2;113;102;153m,\u001b[0m\u001b[38;2;108;94;161m╓\u001b[0m\u001b[38;2;104;86;169m╓\u001b[0m\u001b[38;2;98;77;178m╔\u001b[0m\u001b[38;2;93;67;188m╗\u001b[0m\u001b[38;2;88;59;196mφ\u001b[0m\u001b[38;2;83;51;204m@\u001b[0m\u001b[38;2;78;42;213mD\u001b[0m\u001b[38;2;72;32;223m▒\u001b[0m\u001b[38;2;68;24;231m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;71;30;225m▒\u001b[0m\u001b[38;2;77;40;215m▒\u001b[0m\u001b[38;2;82;49;206mK\u001b[0m\u001b[38;2;87;57;198mφ\u001b[0m\u001b[38;2;91;65;190m╗\u001b[0m\u001b[38;2;97;75;180m╦\u001b[0m\u001b[38;2;103;84;171m╖\u001b[0m\u001b[38;2;107;92;163m²\u001b[0m\u001b[38;2;112;101;154m_\u001b[0m\u001b[38;2;119;112;143m_\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;106;91;164m\\`\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;89;62;193m╙\u001b[0m\u001b[38;2;85;54;201m╙\u001b[0m\u001b[38;2;80;45;210m╚\u001b[0m\u001b[38;2;74;35;220m╝\u001b[0m\u001b[38;2;69;26;229m╠\u001b[0m\u001b[38;2;66;22;233m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;73;33;222m╝\u001b[0m\u001b[38;2;79;43;212m╩\u001b[0m\u001b[38;2;84;52;203m╜\u001b[0m\u001b[38;2;88;60;195m╙\u001b[0m\u001b[38;2;93;68;187m^\u001b[0m\u001b[38;2;100;80;175m\\`\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;113;84;152m\\`\u001b[0m\u001b[38;2;103;79;169m'\u001b[0m\u001b[38;2;95;72;183m\"\u001b[0m\u001b[38;2;87;57;198m╙\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;80;46;209m╜\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;102;77;175m^\u001b[0m\u001b[38;2;112;81;162m\\`\u001b[0m\u001b[38;2;115;92;155m\\`\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;145;116;107m,\u001b[0m\u001b[38;2;199;82;45m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒╠ \u001b[0m\u001b[38;2;70;28;227m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;189;49;97må\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;155;92;114m,\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;175;98;73m╔\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒▒▒\u001b[0m\u001b[38;2;197;83;47m╩ \u001b[0m\u001b[38;2;98;76;179m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;81;48;207mH \u001b[0m\u001b[38;2;188;51;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠╠\u001b[0m\u001b[38;2;183;57;100mH\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;146;116;106m,\u001b[0m\u001b[38;2;199;82;44m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;196;84;48m╩\u001b[0m\u001b[38;2;168;102;81m^    \u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;160;87;111m'\u001b[0m\u001b[38;2;187;52;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;156;91;113m,\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;198;83;46m╩\u001b[0m\u001b[38;2;194;85;50m╩\u001b[0m\u001b[38;2;167;102;82m^       \u001b[0m\u001b[38;2;81;46;209m╚\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠       \u001b[0m\u001b[38;2;159;88;112m'\u001b[0m\u001b[38;2;186;53;98m╚\u001b[0m\u001b[38;2;197;40;93m╩\u001b[0m\n\u001b[38;2;128;128;128m                  \u001b[0m\u001b[38;2;110;97;158m'\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;94;69;186mH\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;68;25;230m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;108;93;162m²\u001b[0m\u001b[38;2;99;79;176m^\u001b[0m`\n","import type { UsageMeta } from '@xyo-network/xl1-sdk'\nimport { isUsageMeta } from '@xyo-network/xl1-sdk'\nimport type { Options } from 'yargs'\nimport { globalRegistry } from 'zod'\n\nconst usageMetaToOptions = (meta: UsageMeta): Options => {\n return meta\n}\n\nexport const optionsFromGlobalZodRegistry = (): Record<string, Options> => {\n const opts: Record<string, Options> = {}\n for (const schema of Object.values(globalRegistry._map)) {\n if (isUsageMeta(schema)) {\n if (schema.hidden) continue // skip hidden options\n opts[schema.title] = usageMetaToOptions(schema)\n }\n }\n return opts\n}\n","import { config } from 'dotenv'\n\nimport { runCLI } from './runCLI.ts'\n\nexport const start = async () => {\n config({ quiet: true })\n await runCLI()\n}\n"],"mappings":"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","names":["createDeepMerge","isDefined","ActorMnemonicNotAllowedError","assertNoActorMnemonics","ConfigFileNotFoundError","tryParseConfig","ConfigZod","isZodError","resolveConfig","deepMerge","createDeepMerge","arrayStrategy","REDACTED","REDACTED_KEY_NAMES","Set","REDACTED_KEY_SUFFIX","shouldRedactKey","key","has","test","redactConfig","config","cloned","structuredClone","redactInPlace","node","Array","isArray","item","obj","Object","keys","undefined","coerceActorsArray","argv","actors","entries","numericEntries","map","value","Number","filter","isInteger","length","asArray","safeParseOrThrow","input","result","ConfigZod","safeParse","success","error","data","buildFinalConfig","configPath","parsedConfigFile","tryParseConfig","rootMnemonicFromFile","mnemonic","normalizedArgv","parsedConfigArgs","rootMnemonicFromArgs","mergedConfig","validated","resolveConfig","rootMnemonic","isDefined","configMiddleware","setConfiguration","finalConfig","assertNoActorMnemonics","withSecrets","Boolean","output","console","log","JSON","stringify","process","exit","err","ConfigFileNotFoundError","message","ActorMnemonicNotAllowedError","isZodError","Error","stack","cause","Base","ConsoleLogger","isDefined","LogLevel","SilentLogger","initLogger","config","logger","log","silent","SilentLogger","level","isDefined","logLevel","parsed","LogLevel","toLowerCase","ConsoleLogger","Base","defaultLogger","stdin","input","stdout","output","createInterface","isDefined","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","contextFromConfigWithoutLocator","detectDerivationPathCollisions","formatWalletReport","initializeResolvedWalletReport","locatorsFromConfig","Orchestrator","initHealthEndpoints","producerCommand","rewardRedemptionCommand","ActorConfigZod","ConfigZod","DefaultMetricsScrapePorts","yargs","hideBin","getApiActor","getBridgeActor","getFinalizerActor","getMempoolActor","ApiConfigZod","BridgeConfigZod","FinalizerConfigZod","MempoolConfigZod","ProducerConfigZod","RewardRedemptionConfigZod","getProducerActor","getRewardRedemptionActor","KNOWN_ACTORS","BOOT_TIMEOUT_MS","getActorsFromConfig","configuration","enabledActors","actors","filter","actor","enabled","map","name","length","undefined","getDefaultActors","buildActor","locator","config","ApiConfigZod","parse","context","getApiActor","BridgeConfigZod","getBridgeActor","MempoolConfigZod","getMempoolActor","ProducerConfigZod","getProducerActor","RewardRedemptionConfigZod","getRewardRedemptionActor","FinalizerConfigZod","getFinalizerActor","Error","bootActors","requestedActors","locators","orchestrator","startedAt","Date","now","Promise","all","registerActor","start","whenReady","ms","initLogger","info","startCommand","getConfiguration","getLocatorsFromConfig","command","describe","builder","yargs","positional","type","array","choices","description","coerce","values","flatMap","v","split","option","string","handler","argv","delay","withDeprecationWarning","module","deprecated","handler","argv","console","warn","delay","CANONICAL_ACTOR_ORDER","enumerateLocator","locator","collapsed","Map","registry","moniker","Object","keys","factories","factory","f","providerName","scope","dependencies","fingerprint","join","existing","get","count","set","values","toSorted","a","b","localeCompare","buildOwnerIndex","perActor","monikerOwners","actorName","entries","entry","owners","Set","add","renderDuplicatesSummary","duplicates","filter","size","map","formatGroupForDisplay","length","lines","push","groupActorsBySharedRegistry","locators","groups","find","g","actorNames","groupId","groupKey","members","split","renderGroupSection","sortedActors","ownGroupKey","heading","i","isLast","branch","otherOwners","o","dupNote","depsNote","countNote","formatProviderTree","groupKeys","key","perGroup","orderedGroups","aHasRoot","includes","bHasRoot","ai","indexOf","bi","Number","MAX_SAFE_INTEGER","XL1LogoColorizedAscii","isUsageMeta","globalRegistry","usageMetaToOptions","meta","optionsFromGlobalZodRegistry","opts","schema","Object","values","globalRegistry","_map","isUsageMeta","hidden","title","DEFAULT_HEALTH_CHECK_PORT","defaultScrapePortForActors","actors","primary","key","DefaultMetricsScrapePorts","producer","configuration","skipInsecureConfirm","dumpProviders","version","isDefined","__VERSION__","getConfiguration","promptForInsecureGenesisConfirmation","logger","input","isTTY","output","warn","rl","createInterface","question","close","getLocatorsFromConfig","actorConfigs","actorName","existingConfig","find","actor","name","push","actorConfig","ActorConfigZod","loose","parse","config","ConfigZod","initLogger","orchestrator","Orchestrator","create","collision","detectDerivationPathCollisions","walletReport","initializeResolvedWalletReport","info","formatWalletReport","serviceName","length","context","contextFromConfigWithoutLocator","onInsecureGenesisConfirm","undefined","locators","locatorsFromConfig","console","log","formatProviderTree","process","exit","healthCheckPort","healthServer","statusReporter","initHealthEndpoints","port","readiness","statusMonitor","on","stop","err","error","runCLI","y","yargs","hideBin","argv","usage","XL1LogoColorizedAscii","parserConfiguration","env","scriptName","middleware","configMiddleware","Boolean","options","optionsFromGlobalZodRegistry","wrap","terminalWidth","command","withDeprecationWarning","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","producerCommand","rewardRedemptionCommand","startCommand","type","description","alias","default","help","config","start","config","quiet","runCLI"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runCLI.d.ts","sourceRoot":"","sources":["../../src/runCLI.ts"],"names":[],"mappings":"AAoIA,wBAAsB,MAAM,kBA4D3B"}
1
+ {"version":3,"file":"runCLI.d.ts","sourceRoot":"","sources":["../../src/runCLI.ts"],"names":[],"mappings":"AA8IA,wBAAsB,MAAM,kBAuE3B"}
package/dist/node/xl1.mjs CHANGED
@@ -170,6 +170,39 @@ import { ConfigZod, isZodError, resolveConfig } from "@xyo-network/xl1-sdk";
170
170
  var deepMerge = createDeepMerge({
171
171
  arrayStrategy: "concat"
172
172
  });
173
+ var REDACTED = "[REDACTED]";
174
+ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
175
+ "mnemonic",
176
+ "connectionString"
177
+ ]);
178
+ var REDACTED_KEY_SUFFIX = /(PrivateKey|Secret|Password)$/i;
179
+ function shouldRedactKey(key) {
180
+ if (REDACTED_KEY_NAMES.has(key)) return true;
181
+ return REDACTED_KEY_SUFFIX.test(key);
182
+ }
183
+ __name(shouldRedactKey, "shouldRedactKey");
184
+ function redactConfig(config2) {
185
+ const cloned = structuredClone(config2);
186
+ redactInPlace(cloned);
187
+ return cloned;
188
+ }
189
+ __name(redactConfig, "redactConfig");
190
+ function redactInPlace(node) {
191
+ if (Array.isArray(node)) {
192
+ for (const item of node) redactInPlace(item);
193
+ return;
194
+ }
195
+ if (node === null || typeof node !== "object") return;
196
+ const obj = node;
197
+ for (const key of Object.keys(obj)) {
198
+ if (shouldRedactKey(key) && obj[key] !== void 0 && obj[key] !== null) {
199
+ obj[key] = REDACTED;
200
+ } else {
201
+ redactInPlace(obj[key]);
202
+ }
203
+ }
204
+ }
205
+ __name(redactInPlace, "redactInPlace");
173
206
  function coerceActorsArray(argv) {
174
207
  const actors = argv.actors;
175
208
  if (actors === void 0 || Array.isArray(actors)) return argv;
@@ -218,7 +251,9 @@ async function configMiddleware(argv, setConfiguration) {
218
251
  assertNoActorMnemonics(finalConfig);
219
252
  setConfiguration(finalConfig);
220
253
  if (argv["dump-config"]) {
221
- console.log(JSON.stringify(finalConfig, null, 2));
254
+ const withSecrets = Boolean(argv["with-secrets"]);
255
+ const output2 = withSecrets ? finalConfig : redactConfig(finalConfig);
256
+ console.log(JSON.stringify(output2, null, 2));
222
257
  process.exit(0);
223
258
  }
224
259
  } catch (err) {
@@ -241,6 +276,176 @@ async function configMiddleware(argv, setConfiguration) {
241
276
  }
242
277
  __name(configMiddleware, "configMiddleware");
243
278
 
279
+ // src/dumpProviders.ts
280
+ var CANONICAL_ACTOR_ORDER = [
281
+ "_root",
282
+ "producer",
283
+ "finalizer",
284
+ "api",
285
+ "mempool",
286
+ "bridge",
287
+ "rewardRedemption"
288
+ ];
289
+ function enumerateLocator(locator) {
290
+ const collapsed = /* @__PURE__ */ new Map();
291
+ const registry = locator.registry;
292
+ for (const moniker of Object.keys(registry)) {
293
+ const factories = registry[moniker];
294
+ if (!factories) continue;
295
+ for (const factory of factories) {
296
+ const f = factory;
297
+ const providerName = f.providerName ?? "<unknown>";
298
+ const scope = f.scope ?? "<unknown>";
299
+ const dependencies = f.dependencies ?? [];
300
+ const fingerprint = `${moniker}|${providerName}|${scope}|${dependencies.join(",")}`;
301
+ const existing = collapsed.get(fingerprint);
302
+ if (existing) {
303
+ existing.count += 1;
304
+ } else {
305
+ collapsed.set(fingerprint, {
306
+ count: 1,
307
+ dependencies,
308
+ moniker,
309
+ providerName,
310
+ scope
311
+ });
312
+ }
313
+ }
314
+ }
315
+ return [
316
+ ...collapsed.values()
317
+ ].toSorted((a, b) => a.moniker.localeCompare(b.moniker) || a.providerName.localeCompare(b.providerName));
318
+ }
319
+ __name(enumerateLocator, "enumerateLocator");
320
+ function buildOwnerIndex(perActor) {
321
+ const monikerOwners = /* @__PURE__ */ new Map();
322
+ for (const [actorName, entries] of perActor) {
323
+ for (const entry of entries) {
324
+ let owners = monikerOwners.get(entry.moniker);
325
+ if (!owners) {
326
+ owners = /* @__PURE__ */ new Set();
327
+ monikerOwners.set(entry.moniker, owners);
328
+ }
329
+ owners.add(actorName);
330
+ }
331
+ }
332
+ return monikerOwners;
333
+ }
334
+ __name(buildOwnerIndex, "buildOwnerIndex");
335
+ function renderDuplicatesSummary(monikerOwners) {
336
+ const duplicates = [
337
+ ...monikerOwners.entries()
338
+ ].filter(([, owners]) => owners.size > 1).map(([moniker, owners]) => ({
339
+ moniker,
340
+ owners: [
341
+ ...owners
342
+ ].toSorted().map(formatGroupForDisplay)
343
+ })).toSorted((a, b) => a.moniker.localeCompare(b.moniker));
344
+ if (duplicates.length === 0) return [];
345
+ const lines = [
346
+ "Duplicate monikers (registered by more than one locator):"
347
+ ];
348
+ for (const { moniker, owners } of duplicates) {
349
+ lines.push(` - ${moniker}: ${owners.join(", ")}`);
350
+ }
351
+ lines.push("");
352
+ return lines;
353
+ }
354
+ __name(renderDuplicatesSummary, "renderDuplicatesSummary");
355
+ function groupActorsBySharedRegistry(locators) {
356
+ const groups = [];
357
+ for (const actorName of Object.keys(locators)) {
358
+ const locator = locators[actorName];
359
+ const existing = groups.find((g) => g.registry === locator.registry);
360
+ if (existing) {
361
+ existing.actorNames.push(actorName);
362
+ } else {
363
+ groups.push({
364
+ actorNames: [
365
+ actorName
366
+ ],
367
+ locator,
368
+ registry: locator.registry
369
+ });
370
+ }
371
+ }
372
+ return groups;
373
+ }
374
+ __name(groupActorsBySharedRegistry, "groupActorsBySharedRegistry");
375
+ function groupId(actorNames) {
376
+ return [
377
+ ...actorNames
378
+ ].toSorted().join(",");
379
+ }
380
+ __name(groupId, "groupId");
381
+ function formatGroupForDisplay(groupKey) {
382
+ const members = groupKey.split(",");
383
+ return members.length === 1 ? members[0] : `(${members.join(", ")})`;
384
+ }
385
+ __name(formatGroupForDisplay, "formatGroupForDisplay");
386
+ function renderGroupSection(actorNames, entries, monikerOwners) {
387
+ const sortedActors = [
388
+ ...actorNames
389
+ ].toSorted();
390
+ const ownGroupKey = groupId(sortedActors);
391
+ const heading = sortedActors.length === 1 ? `Providers for actor: ${sortedActors[0]} (${entries.length} registered)` : `Providers shared by actors: ${sortedActors.join(", ")} (${entries.length} registered)`;
392
+ const lines = [
393
+ heading
394
+ ];
395
+ if (entries.length === 0) {
396
+ lines.push(" (none)", "");
397
+ return lines;
398
+ }
399
+ for (let i = 0; i < entries.length; i++) {
400
+ const entry = entries[i];
401
+ const isLast = i === entries.length - 1;
402
+ const branch = isLast ? "\u2514\u2500\u2500" : "\u251C\u2500\u2500";
403
+ const owners = monikerOwners.get(entry.moniker) ?? /* @__PURE__ */ new Set();
404
+ const otherOwners = [
405
+ ...owners
406
+ ].filter((o) => o !== ownGroupKey).toSorted().map(formatGroupForDisplay);
407
+ const dupNote = otherOwners.length > 0 ? ` \u26A0 also in: ${otherOwners.join(", ")}` : "";
408
+ const depsNote = entry.dependencies.length > 0 ? `, deps: [${entry.dependencies.join(", ")}]` : "";
409
+ const countNote = entry.count > 1 ? ` (\xD7${entry.count})` : "";
410
+ lines.push(` ${branch} ${entry.moniker}${countNote} [impl: ${entry.providerName}, scope: ${entry.scope}${depsNote}]${dupNote}`);
411
+ }
412
+ lines.push("");
413
+ return lines;
414
+ }
415
+ __name(renderGroupSection, "renderGroupSection");
416
+ function formatProviderTree(locators) {
417
+ const groups = groupActorsBySharedRegistry(locators);
418
+ const groupKeys = groups.map((g) => ({
419
+ ...g,
420
+ key: groupId(g.actorNames)
421
+ }));
422
+ const perGroup = /* @__PURE__ */ new Map();
423
+ for (const g of groupKeys) perGroup.set(g.key, enumerateLocator(g.locator));
424
+ const monikerOwners = buildOwnerIndex(perGroup);
425
+ const orderedGroups = [
426
+ ...groupKeys
427
+ ].toSorted((a, b) => {
428
+ const aHasRoot = a.actorNames.includes("_root");
429
+ const bHasRoot = b.actorNames.includes("_root");
430
+ if (aHasRoot !== bHasRoot) return aHasRoot ? -1 : 1;
431
+ const ai = CANONICAL_ACTOR_ORDER.indexOf(a.actorNames[0]);
432
+ const bi = CANONICAL_ACTOR_ORDER.indexOf(b.actorNames[0]);
433
+ if (ai !== bi) return (ai === -1 ? Number.MAX_SAFE_INTEGER : ai) - (bi === -1 ? Number.MAX_SAFE_INTEGER : bi);
434
+ return a.key.localeCompare(b.key);
435
+ });
436
+ const lines = [
437
+ "XL1 Provider Dump",
438
+ "=================",
439
+ ""
440
+ ];
441
+ for (const g of orderedGroups) {
442
+ lines.push(...renderGroupSection(g.actorNames.toSorted(), perGroup.get(g.key) ?? [], monikerOwners));
443
+ }
444
+ lines.push(...renderDuplicatesSummary(monikerOwners));
445
+ return lines.join("\n");
446
+ }
447
+ __name(formatProviderTree, "formatProviderTree");
448
+
244
449
  // src/images.ts
245
450
  var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;118;111;144m_\x1B[0m
246
451
  \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;72;32;223m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m
@@ -288,7 +493,8 @@ function defaultScrapePortForActors(actors) {
288
493
  __name(defaultScrapePortForActors, "defaultScrapePortForActors");
289
494
  var configuration;
290
495
  var skipInsecureConfirm = false;
291
- var version = isDefined3("1.21.3") ? "1.21.3" : "unknown";
496
+ var dumpProviders = false;
497
+ var version = isDefined3("1.23.0") ? "1.23.0" : "unknown";
292
498
  function getConfiguration() {
293
499
  return configuration;
294
500
  }
@@ -341,6 +547,10 @@ async function getLocatorsFromConfig(actors, configuration2) {
341
547
  }
342
548
  const onInsecureGenesisConfirm = skipInsecureConfirm ? void 0 : async () => await promptForInsecureGenesisConfirmation(logger);
343
549
  const locators = await locatorsFromConfig(context, config2, onInsecureGenesisConfirm);
550
+ if (dumpProviders) {
551
+ console.log(formatProviderTree(locators));
552
+ process.exit(0);
553
+ }
344
554
  const healthCheckPort = configuration2.healthCheckPort ?? DEFAULT_HEALTH_CHECK_PORT;
345
555
  const healthServer = healthCheckPort > 0 && context.statusReporter !== void 0 ? await initHealthEndpoints({
346
556
  logger,
@@ -385,6 +595,7 @@ $0 <command> [options]`).parserConfiguration({
385
595
  configuration = config2;
386
596
  });
387
597
  skipInsecureConfirm = Boolean(argv2["skip-insecure-confirm"]);
598
+ dumpProviders = Boolean(argv2["dump-providers"]);
388
599
  }).options(optionsFromGlobalZodRegistry()).wrap(y.terminalWidth()).command(withDeprecationWarning(apiCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(bridgeCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(finalizerCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(mempoolCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(producerCommand(getConfiguration, getLocatorsFromConfig))).command(withDeprecationWarning(rewardRedemptionCommand(getConfiguration, getLocatorsFromConfig))).command(startCommand(getConfiguration, getLocatorsFromConfig)).options({
389
600
  "config": {
390
601
  type: "string",
@@ -397,7 +608,17 @@ $0 <command> [options]`).parserConfiguration({
397
608
  },
398
609
  "dump-config": {
399
610
  type: "boolean",
400
- description: "Just process the configuration and print the resolved config to stdout, then exit.",
611
+ description: "Just process the configuration and print the resolved config to stdout, then exit. Secrets are redacted unless --with-secrets is also passed.",
612
+ default: false
613
+ },
614
+ "with-secrets": {
615
+ type: "boolean",
616
+ description: 'When used with --dump-config, print raw secret values (mnemonic, private keys, passwords) instead of "[REDACTED]". Use only on a developer machine.',
617
+ default: false
618
+ },
619
+ "dump-providers": {
620
+ type: "boolean",
621
+ description: "Run the normal command flow up to provider locator construction, print the per-actor provider tree (with duplicate detection), then exit.",
401
622
  default: false
402
623
  },
403
624
  "skip-insecure-confirm": {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/start.ts","../../src/runCLI.ts","../../src/commands/start/startCommand.ts","../../src/initLogger.ts","../../src/commands/withDeprecationWarning.ts","../../src/configMiddleware.ts","../../src/images.ts","../../src/optionsFromGlobalZodRegistry.ts","../../src/xl1.ts"],"sourcesContent":["import { config } from 'dotenv'\n\nimport { runCLI } from './runCLI.ts'\n\nexport const start = async () => {\n config({ quiet: true })\n await runCLI()\n}\n","import { stdin as input, stdout as output } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\n\nimport { isDefined } from '@xylabs/sdk-js'\nimport { apiCommand } from '@xyo-network/chain-api'\nimport { bridgeCommand } from '@xyo-network/chain-bridge'\nimport { finalizerCommand } from '@xyo-network/chain-finalizer'\nimport { mempoolCommand } from '@xyo-network/chain-mempool'\nimport {\n contextFromConfigWithoutLocator, detectDerivationPathCollisions, formatWalletReport, initializeResolvedWalletReport,\n locatorsFromConfig, Orchestrator,\n} from '@xyo-network/chain-orchestration'\nimport { initHealthEndpoints } from '@xyo-network/chain-orchestration-express'\nimport { producerCommand } from '@xyo-network/chain-producer'\nimport { rewardRedemptionCommand } from '@xyo-network/chain-reward-redemption'\nimport type { ActorConfig, Config } from '@xyo-network/xl1-sdk'\nimport {\n ActorConfigZod, ConfigZod, DefaultMetricsScrapePorts,\n} from '@xyo-network/xl1-sdk'\nimport type { Argv } from 'yargs'\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\n\nimport { startCommand, withDeprecationWarning } from './commands/index.ts'\nimport { configMiddleware } from './configMiddleware.ts'\nimport { XL1LogoColorizedAscii } from './images.ts'\nimport { initLogger } from './initLogger.ts'\nimport { optionsFromGlobalZodRegistry } from './optionsFromGlobalZodRegistry.ts'\n\n/** Version string injected by Rollup at build time. */\ndeclare const __VERSION__: string\n\nconst DEFAULT_HEALTH_CHECK_PORT = 9090\n\n/**\n * Maps a CLI actor name to its registered Prometheus scrape port. The CLI-level\n * exporter (one per process) defaults to the port of the first requested actor\n * so that running, e.g., `xl1 start producer` and `xl1 start api` side-by-side\n * doesn't fight over a single shared default.\n */\nfunction defaultScrapePortForActors(actors: readonly string[]): number {\n const primary = actors[0]\n const key = primary === 'rewardRedemption' ? 'rewardRedemptionApi' : primary\n return (DefaultMetricsScrapePorts as Record<string, number>)[key] ?? DefaultMetricsScrapePorts.producer\n}\n\n/**\n * The configuration that will be used throughout the CLI.\n * This is materialized after parsing the command-line arguments,\n * environment variables, and defaults.\n */\nlet configuration: Config\nlet skipInsecureConfirm = false\n\nconst version = isDefined(__VERSION__) ? __VERSION__ : 'unknown'\n\nfunction getConfiguration(): Config {\n return configuration\n}\n\nasync function promptForInsecureGenesisConfirmation(logger: ReturnType<typeof initLogger>) {\n if (!input.isTTY || !output.isTTY) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped because this session is not a TTY.')\n return\n }\n const rl = createInterface({ input, output })\n try {\n await rl.question('Insecure genesis reward wallet is active. Hit RETURN to continue.')\n } finally {\n rl.close()\n }\n}\n\nasync function getLocatorsFromConfig(actors: string[], configuration: Config) {\n const actorConfigs: ActorConfig[] = []\n for (const actorName of actors) {\n const existingConfig = configuration.actors.find(actor => actor.name === actorName)\n if (existingConfig) {\n actorConfigs.push(existingConfig)\n } else {\n const actorConfig = ActorConfigZod.loose().parse({ name: actorName })\n actorConfigs.push(actorConfig)\n }\n }\n\n const config = ConfigZod.parse({ ...configuration, actors: actorConfigs })\n\n const logger = initLogger(configuration)\n const orchestrator = await Orchestrator.create({ logger })\n const collision = detectDerivationPathCollisions(actors, configuration)\n if (collision) throw collision\n const walletReport = await initializeResolvedWalletReport(actors, configuration)\n logger.info(formatWalletReport(walletReport))\n const serviceName = actors.length === 1 ? `xl1-${actors[0]}` : 'xl1-cli'\n const context = await contextFromConfigWithoutLocator(config, logger, serviceName, version, defaultScrapePortForActors(actors))\n if (skipInsecureConfirm) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped via --skip-insecure-confirm.')\n }\n const onInsecureGenesisConfirm = skipInsecureConfirm\n ? undefined\n : async () => await promptForInsecureGenesisConfirmation(logger)\n const locators = await locatorsFromConfig(context, config, onInsecureGenesisConfirm)\n\n const healthCheckPort = configuration.healthCheckPort ?? DEFAULT_HEALTH_CHECK_PORT\n const healthServer = healthCheckPort > 0 && context.statusReporter !== undefined\n ? await initHealthEndpoints({\n logger,\n port: healthCheckPort,\n readiness: orchestrator,\n statusMonitor: context.statusReporter,\n })\n : undefined\n\n // Handle cancellation (Ctrl+C)\n process.on('SIGINT', () => {\n void (async () => {\n try {\n logger.log('\\nSIGINT received. Attempting graceful shutdown...')\n healthServer?.close()\n await orchestrator?.stop()\n logger.log('Orchestrator stopped, exiting now.')\n process.exit(0)\n } catch (err) {\n logger.error('Error stopping orchestrator:', err)\n process.exit(1)\n }\n })()\n })\n return { locators, orchestrator }\n}\n\n// Main entry point\nexport async function runCLI() {\n // Parse command-line arguments using Yargs\n const y = yargs(hideBin(process.argv)) as Argv<Config>\n const argv = y\n .usage(`\n🚀 XL1 Node CLI (${version})\n${XL1LogoColorizedAscii}\nRun various components of the XL1 ecosystem.\n\nUsage:\n$0 <command> [options]`)\n .parserConfiguration({\n 'dot-notation': true, // foo.bar → { foo: { bar } }\n 'parse-numbers': false, // Don't auto-parse numbers to allow strings like \"0x1\"\n 'populate--': true, // Populate -- with all options so we can detected user-supplied vs defaults\n })\n .env('XL1')\n .scriptName('xl1')\n .middleware(async (argv) => {\n await configMiddleware(argv, (config) => {\n configuration = config\n })\n skipInsecureConfirm = Boolean(argv['skip-insecure-confirm'])\n })\n .options(optionsFromGlobalZodRegistry())\n .wrap(y.terminalWidth())\n .command(withDeprecationWarning(apiCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(bridgeCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(finalizerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(mempoolCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(producerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(rewardRedemptionCommand(getConfiguration, getLocatorsFromConfig)))\n .command(startCommand(getConfiguration, getLocatorsFromConfig))\n .options({\n 'config': {\n type: 'string',\n description: 'Path to a config file to use instead of the default search.',\n alias: 'c',\n },\n 'mnemonic': {\n type: 'string',\n description: 'Shared root mnemonic used by actors that do not define their own mnemonic.',\n },\n 'dump-config': {\n type: 'boolean',\n description: 'Just process the configuration and print the resolved config to stdout, then exit.',\n default: false,\n },\n 'skip-insecure-confirm': {\n type: 'boolean',\n description: 'Skip the interactive RETURN confirmation when the built-in dev mnemonic / insecure genesis reward wallet is active.',\n default: false,\n },\n })\n .help()\n .alias('help', 'h')\n .version(version)\n .argv\n\n await argv\n}\n","import { getApiActor } from '@xyo-network/chain-api'\nimport { getBridgeActor } from '@xyo-network/chain-bridge'\nimport { getFinalizerActor } from '@xyo-network/chain-finalizer'\nimport { getMempoolActor } from '@xyo-network/chain-mempool'\nimport type {\n ActorInstanceV3, GetLocatorsFromConfig, OrchestratorInstance,\n} from '@xyo-network/chain-orchestration'\nimport {\n ApiConfigZod,\n BridgeConfigZod,\n FinalizerConfigZod,\n MempoolConfigZod,\n ProducerConfigZod,\n RewardRedemptionConfigZod,\n} from '@xyo-network/chain-orchestration'\nimport { getProducerActor } from '@xyo-network/chain-producer'\nimport { getRewardRedemptionActor } from '@xyo-network/chain-reward-redemption'\nimport type { Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\nimport type {\n ArgumentsCamelCase, Argv, CommandModule,\n} from 'yargs'\n\nimport { initLogger } from '../../initLogger.ts'\n\ninterface StartArgs {\n actors?: string[]\n}\n\nconst KNOWN_ACTORS = ['api', 'bridge', 'finalizer', 'mempool', 'producer', 'rewardRedemption'] as const\n\nconst BOOT_TIMEOUT_MS = 60_000\n\nfunction getActorsFromConfig(configuration: Config): string[] | undefined {\n const enabledActors = configuration.actors\n .filter(actor => actor.enabled !== false)\n .map(actor => actor.name)\n return enabledActors.length > 0 ? enabledActors : undefined\n}\n\nfunction getDefaultActors(): string[] {\n return ['api', 'producer', 'finalizer']\n}\n\nasync function buildActor(\n name: string,\n locator: ProviderFactoryLocatorInstance,\n): Promise<ActorInstanceV3> {\n switch (name) {\n case 'api': {\n const config = ApiConfigZod.parse(locator.context.config)\n return await getApiActor(config, locator)\n }\n case 'bridge': {\n const config = BridgeConfigZod.parse(locator.context.config)\n return await getBridgeActor(config, locator)\n }\n case 'mempool': {\n const config = MempoolConfigZod.parse(locator.context.config)\n return await getMempoolActor(config, locator)\n }\n case 'producer': {\n const config = ProducerConfigZod.parse(locator.context.config)\n return await getProducerActor(config, locator)\n }\n case 'rewardRedemption': {\n const config = RewardRedemptionConfigZod.parse(locator.context.config)\n return await getRewardRedemptionActor(config, locator)\n }\n case 'finalizer': {\n const config = FinalizerConfigZod.parse(locator.context.config)\n return await getFinalizerActor(config, locator)\n }\n default: {\n throw new Error(`Unknown actor: ${name}`)\n }\n }\n}\n\nasync function bootActors(\n requestedActors: string[],\n locators: Record<string, ProviderFactoryLocatorInstance>,\n orchestrator: OrchestratorInstance,\n configuration: Config,\n): Promise<void> {\n const startedAt = Date.now()\n const actors = await Promise.all(requestedActors.map(name => buildActor(name, locators[name])))\n for (const actor of actors) {\n await orchestrator.registerActor(actor)\n }\n await orchestrator.start()\n await orchestrator.whenReady(BOOT_TIMEOUT_MS)\n const ms = Date.now() - startedAt\n initLogger(configuration).info(`[xl1] system ready (${requestedActors.length} actor${requestedActors.length === 1 ? '' : 's'}, ${ms}ms)`)\n}\n\nexport function startCommand(getConfiguration: () => Config, getLocatorsFromConfig: GetLocatorsFromConfig): CommandModule {\n return {\n command: ['start [actors..]', '$0'],\n describe: 'Run a full XL1 Node',\n builder: (yargs: Argv) => {\n return yargs\n .positional('actors', {\n type: 'string',\n array: true,\n choices: KNOWN_ACTORS,\n description: 'Actors to start (e.g. xl1 start api producer or xl1 start api,producer)',\n coerce: (values: string[]) => values.flatMap(v => v.split(',')),\n })\n .option('actors', {\n type: 'array',\n string: true,\n choices: KNOWN_ACTORS,\n description: 'List of actors to start (e.g. --actors api producer finalizer). Defaults to api, producer, and finalizer.',\n })\n },\n handler: async (argv: ArgumentsCamelCase<StartArgs>) => {\n const configuration = getConfiguration()\n const requestedActors = argv.actors !== undefined && argv.actors.length > 0\n ? argv.actors\n : getActorsFromConfig(configuration) ?? getDefaultActors()\n const { locators, orchestrator } = await getLocatorsFromConfig(requestedActors, configuration)\n await bootActors(requestedActors, locators, orchestrator, configuration)\n },\n }\n}\n","import type { Logger, LogLevelValue } from '@xylabs/sdk-js'\nimport {\n Base,\n ConsoleLogger, isDefined,\n LogLevel, SilentLogger,\n} from '@xylabs/sdk-js'\nimport type { BaseConfig } from '@xyo-network/xl1-sdk'\n\nexport const initLogger = (config: BaseConfig): Logger => {\n let logger: Logger\n if (config.log.silent) {\n logger = new SilentLogger()\n } else {\n let level: LogLevelValue | undefined\n if (isDefined(config.log.logLevel)) {\n const parsed = LogLevel[config.log.logLevel.toLowerCase() as keyof typeof LogLevel]\n if (isDefined(parsed)) level = parsed\n }\n logger = new ConsoleLogger(level)\n }\n Base.defaultLogger = logger\n return logger\n}\n","import { delay } from '@xylabs/sdk-js'\nimport type { CommandModule } from 'yargs'\n\nexport function withDeprecationWarning(module: CommandModule): CommandModule {\n const { deprecated, handler } = module\n if (typeof deprecated === 'string') {\n return {\n ...module,\n handler: async (argv) => {\n console.warn(`[deprecated] ${deprecated}`)\n await delay(3000)\n return handler(argv)\n },\n }\n }\n return module\n}\n","import { createDeepMerge, isDefined } from '@xylabs/sdk-js'\nimport {\n ActorMnemonicNotAllowedError,\n assertNoActorMnemonics,\n ConfigFileNotFoundError,\n tryParseConfig,\n} from '@xyo-network/chain-orchestration'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport {\n ConfigZod, isZodError, resolveConfig,\n} from '@xyo-network/xl1-sdk'\n\nconst deepMerge = createDeepMerge({ arrayStrategy: 'concat' })\ntype ConfigWithMnemonic = Config & { mnemonic?: string }\n\n/**\n * Yargs `.env()` with `dot-notation` turns `XL1_ACTORS__0__NAME=foo` into\n * `{ actors: { '0': { name: 'foo' } } }` — an object keyed by string indices\n * rather than an array. Normalize that back into an array so ConfigZod's\n * `actors` array schema accepts it.\n */\nfunction coerceActorsArray(argv: Record<string, unknown>): Record<string, unknown> {\n const actors = argv.actors\n if (actors === undefined || Array.isArray(actors)) return argv\n if (typeof actors !== 'object' || actors === null) return argv\n const entries = Object.entries(actors as Record<string, unknown>)\n const numericEntries = entries\n .map(([key, value]) => [Number(key), value] as const)\n .filter(([key]) => Number.isInteger(key) && key >= 0)\n if (numericEntries.length !== entries.length) return argv\n const asArray: unknown[] = []\n for (const [key, value] of numericEntries) asArray[key] = value\n return { ...argv, actors: asArray }\n}\n\nfunction safeParseOrThrow(input: unknown): Config {\n const result = ConfigZod.safeParse(input)\n if (!result.success) throw result.error\n return result.data as Config\n}\n\nasync function buildFinalConfig(argv: Record<string, unknown>): Promise<ConfigWithMnemonic> {\n // Parse the various config sources\n const configPath = argv.config as string | undefined\n const parsedConfigFile = await tryParseConfig({ configPath }) as ConfigWithMnemonic // Config file\n const rootMnemonicFromFile = typeof parsedConfigFile.mnemonic === 'string' ? parsedConfigFile.mnemonic : undefined\n const normalizedArgv = coerceActorsArray(argv)\n const parsedConfigArgs = ConfigZod.safeParse(normalizedArgv).data ?? {} // Command-line arguments & ENV VARs\n const rootMnemonicFromArgs = typeof normalizedArgv.mnemonic === 'string' ? normalizedArgv.mnemonic : undefined\n // Deep merge with precedence\n // TODO: Would like precedence to be defaults < file < ENV < CLI Args\n // but there is currently no way to determine which are defaults vs\n // user-supplied CLI Args since we set the CLI args to the defaults\n // and receive a flattened object. We might need to manually invoke\n // the parser without the defaults to achieve this.\n const mergedConfig = safeParseOrThrow(deepMerge(parsedConfigFile, parsedConfigArgs))\n const validated = safeParseOrThrow(resolveConfig(safeParseOrThrow(mergedConfig)))\n const rootMnemonic = rootMnemonicFromArgs ?? rootMnemonicFromFile\n return isDefined(rootMnemonic) ? { ...validated, mnemonic: rootMnemonic } : validated\n}\n\nexport async function configMiddleware(argv: Record<string, unknown>, setConfiguration: (config: Config) => void): Promise<void> {\n try {\n const finalConfig = await buildFinalConfig(argv)\n // Hard-fail if any actor was configured with its own mnemonic. Mnemonics\n // must live at the root; actors pick their wallet via accountPath.\n assertNoActorMnemonics(finalConfig)\n setConfiguration(finalConfig as Config)\n\n // Check if user wants to dump config and exit\n if (argv['dump-config']) {\n console.log(JSON.stringify(finalConfig, null, 2))\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0)\n }\n } catch (err) {\n if (err instanceof ConfigFileNotFoundError) {\n console.error(`${err.message}. Check the path passed to --config/-c and try again.`)\n } else if (err instanceof ActorMnemonicNotAllowedError) {\n console.error(err.message)\n } else if (isZodError(err)) {\n console.error(`Zod error: ${err.message}`)\n } else {\n console.error(`Error parsing configuration: ${err}`)\n }\n if (!(err instanceof ConfigFileNotFoundError) && !(err instanceof ActorMnemonicNotAllowedError)) {\n console.error(`Stack: ${err instanceof Error ? err.stack : 'N/A'}`)\n }\n throw new Error('Invalid configuration', { cause: err })\n }\n}\n","/* eslint-disable no-irregular-whitespace, @stylistic/max-len */\nexport const XL1LogoColorizedAscii = `\u001b[38;2;128;128;128m                    \u001b[0m\u001b[38;2;118;111;144m_\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;72;32;223m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   ╠╠\u001b[0m\u001b[38;2;103;85;170m_\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;79;121;152m╦\u001b[0m\u001b[38;2;82;121;151m╦\u001b[0m\u001b[38;2;112;125;136m_       \u001b[0m\u001b[38;2;88;59;196m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;73;34;221m▒       \u001b[0m\u001b[38;2;121;121;127m_\u001b[0m\u001b[38;2;100;101;128m╔\u001b[0m\u001b[38;2;93;94;127m╦\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;82;121;151m²\u001b[0m\u001b[38;2;44;116;170m╠\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;51;117;167mD\u001b[0m\u001b[38;2;80;121;152m╦\u001b[0m\u001b[38;2;111;125;136m_    \u001b[0m\u001b[38;2;67;23;232m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;120;121;128m_\u001b[0m\u001b[38;2;100;101;127m╔\u001b[0m\u001b[38;2;79;81;127mR\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;88;90;127m╙\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;55;117;165m╚\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;44;116;171m▒▒\u001b[0m\u001b[38;2;50;116;167mD\u001b[0m\u001b[38;2;80;121;152m╦ \u001b[0m\u001b[38;2;106;90;165mj\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;89;61;194mH \u001b[0m\u001b[38;2;99;100;127m╔\u001b[0m\u001b[38;2;79;80;127mD\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒▒╠\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;83;121;150m²\u001b[0m\u001b[38;2;44;116;170m▒\u001b[0m\u001b[38;2;44;116;171m▒▒▒ \u001b[0m\u001b[38;2;76;38;217m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;74;76;128m╠\u001b[0m\u001b[38;2;71;73;128m▒▒▒\u001b[0m\u001b[38;2;89;90;128m╙\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;90;118;148m\\`\u001b[0m\u001b[38;2;89;107;153m_\u001b[0m\u001b[38;2;93;97;154m,\u001b[0m\u001b[38;2;105;89;166m╓\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;95;72;183m╓\u001b[0m\u001b[38;2;106;96;152m_\u001b[0m\u001b[38;2;100;94;143m\\`\u001b[0m\u001b[38;2;101;100;133m\\`\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;122;118;137m_\u001b[0m\u001b[38;2;113;102;153m,\u001b[0m\u001b[38;2;108;94;161m╓\u001b[0m\u001b[38;2;104;86;169m╓\u001b[0m\u001b[38;2;98;77;178m╔\u001b[0m\u001b[38;2;93;67;188m╗\u001b[0m\u001b[38;2;88;59;196mφ\u001b[0m\u001b[38;2;83;51;204m@\u001b[0m\u001b[38;2;78;42;213mD\u001b[0m\u001b[38;2;72;32;223m▒\u001b[0m\u001b[38;2;68;24;231m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;71;30;225m▒\u001b[0m\u001b[38;2;77;40;215m▒\u001b[0m\u001b[38;2;82;49;206mK\u001b[0m\u001b[38;2;87;57;198mφ\u001b[0m\u001b[38;2;91;65;190m╗\u001b[0m\u001b[38;2;97;75;180m╦\u001b[0m\u001b[38;2;103;84;171m╖\u001b[0m\u001b[38;2;107;92;163m²\u001b[0m\u001b[38;2;112;101;154m_\u001b[0m\u001b[38;2;119;112;143m_\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;106;91;164m\\`\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;89;62;193m╙\u001b[0m\u001b[38;2;85;54;201m╙\u001b[0m\u001b[38;2;80;45;210m╚\u001b[0m\u001b[38;2;74;35;220m╝\u001b[0m\u001b[38;2;69;26;229m╠\u001b[0m\u001b[38;2;66;22;233m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;73;33;222m╝\u001b[0m\u001b[38;2;79;43;212m╩\u001b[0m\u001b[38;2;84;52;203m╜\u001b[0m\u001b[38;2;88;60;195m╙\u001b[0m\u001b[38;2;93;68;187m^\u001b[0m\u001b[38;2;100;80;175m\\`\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;113;84;152m\\`\u001b[0m\u001b[38;2;103;79;169m'\u001b[0m\u001b[38;2;95;72;183m\"\u001b[0m\u001b[38;2;87;57;198m╙\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;80;46;209m╜\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;102;77;175m^\u001b[0m\u001b[38;2;112;81;162m\\`\u001b[0m\u001b[38;2;115;92;155m\\`\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;145;116;107m,\u001b[0m\u001b[38;2;199;82;45m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒╠ \u001b[0m\u001b[38;2;70;28;227m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;189;49;97må\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;155;92;114m,\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;175;98;73m╔\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒▒▒\u001b[0m\u001b[38;2;197;83;47m╩ \u001b[0m\u001b[38;2;98;76;179m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;81;48;207mH \u001b[0m\u001b[38;2;188;51;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠╠\u001b[0m\u001b[38;2;183;57;100mH\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;146;116;106m,\u001b[0m\u001b[38;2;199;82;44m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;196;84;48m╩\u001b[0m\u001b[38;2;168;102;81m^    \u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;160;87;111m'\u001b[0m\u001b[38;2;187;52;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;156;91;113m,\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;198;83;46m╩\u001b[0m\u001b[38;2;194;85;50m╩\u001b[0m\u001b[38;2;167;102;82m^       \u001b[0m\u001b[38;2;81;46;209m╚\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠       \u001b[0m\u001b[38;2;159;88;112m'\u001b[0m\u001b[38;2;186;53;98m╚\u001b[0m\u001b[38;2;197;40;93m╩\u001b[0m\n\u001b[38;2;128;128;128m                  \u001b[0m\u001b[38;2;110;97;158m'\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;94;69;186mH\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;68;25;230m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;108;93;162m²\u001b[0m\u001b[38;2;99;79;176m^\u001b[0m`\n","import type { UsageMeta } from '@xyo-network/xl1-sdk'\nimport { isUsageMeta } from '@xyo-network/xl1-sdk'\nimport type { Options } from 'yargs'\nimport { globalRegistry } from 'zod'\n\nconst usageMetaToOptions = (meta: UsageMeta): Options => {\n return meta\n}\n\nexport const optionsFromGlobalZodRegistry = (): Record<string, Options> => {\n const opts: Record<string, Options> = {}\n for (const schema of Object.values(globalRegistry._map)) {\n if (isUsageMeta(schema)) {\n if (schema.hidden) continue // skip hidden options\n opts[schema.title] = usageMetaToOptions(schema)\n }\n }\n return opts\n}\n","import { start } from './start.ts'\n\nstart().catch((err) => {\n // If we're in development mode, log the stack trace to the console\n if (process.env.NODE_ENV === 'development') console.error('An error occurred during startup:', err)\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1)\n})\n"],"mappings":"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","names":["config","stdin","input","stdout","output","createInterface","isDefined","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","contextFromConfigWithoutLocator","detectDerivationPathCollisions","formatWalletReport","initializeResolvedWalletReport","locatorsFromConfig","Orchestrator","initHealthEndpoints","producerCommand","rewardRedemptionCommand","ActorConfigZod","ConfigZod","DefaultMetricsScrapePorts","yargs","hideBin","getApiActor","getBridgeActor","getFinalizerActor","getMempoolActor","ApiConfigZod","BridgeConfigZod","FinalizerConfigZod","MempoolConfigZod","ProducerConfigZod","RewardRedemptionConfigZod","getProducerActor","getRewardRedemptionActor","Base","ConsoleLogger","isDefined","LogLevel","SilentLogger","initLogger","config","logger","log","silent","SilentLogger","level","isDefined","logLevel","parsed","LogLevel","toLowerCase","ConsoleLogger","Base","defaultLogger","KNOWN_ACTORS","BOOT_TIMEOUT_MS","getActorsFromConfig","configuration","enabledActors","actors","filter","actor","enabled","map","name","length","undefined","getDefaultActors","buildActor","locator","config","ApiConfigZod","parse","context","getApiActor","BridgeConfigZod","getBridgeActor","MempoolConfigZod","getMempoolActor","ProducerConfigZod","getProducerActor","RewardRedemptionConfigZod","getRewardRedemptionActor","FinalizerConfigZod","getFinalizerActor","Error","bootActors","requestedActors","locators","orchestrator","startedAt","Date","now","Promise","all","registerActor","start","whenReady","ms","initLogger","info","startCommand","getConfiguration","getLocatorsFromConfig","command","describe","builder","yargs","positional","type","array","choices","description","coerce","values","flatMap","v","split","option","string","handler","argv","delay","withDeprecationWarning","module","deprecated","handler","argv","console","warn","delay","createDeepMerge","isDefined","ActorMnemonicNotAllowedError","assertNoActorMnemonics","ConfigFileNotFoundError","tryParseConfig","ConfigZod","isZodError","resolveConfig","deepMerge","createDeepMerge","arrayStrategy","coerceActorsArray","argv","actors","undefined","Array","isArray","entries","Object","numericEntries","map","key","value","Number","filter","isInteger","length","asArray","safeParseOrThrow","input","result","ConfigZod","safeParse","success","error","data","buildFinalConfig","configPath","config","parsedConfigFile","tryParseConfig","rootMnemonicFromFile","mnemonic","normalizedArgv","parsedConfigArgs","rootMnemonicFromArgs","mergedConfig","validated","resolveConfig","rootMnemonic","isDefined","configMiddleware","setConfiguration","finalConfig","assertNoActorMnemonics","console","log","JSON","stringify","process","exit","err","ConfigFileNotFoundError","message","ActorMnemonicNotAllowedError","isZodError","Error","stack","cause","XL1LogoColorizedAscii","isUsageMeta","globalRegistry","usageMetaToOptions","meta","optionsFromGlobalZodRegistry","opts","schema","Object","values","globalRegistry","_map","isUsageMeta","hidden","title","DEFAULT_HEALTH_CHECK_PORT","defaultScrapePortForActors","actors","primary","key","DefaultMetricsScrapePorts","producer","configuration","skipInsecureConfirm","version","isDefined","__VERSION__","getConfiguration","promptForInsecureGenesisConfirmation","logger","input","isTTY","output","warn","rl","createInterface","question","close","getLocatorsFromConfig","actorConfigs","actorName","existingConfig","find","actor","name","push","actorConfig","ActorConfigZod","loose","parse","config","ConfigZod","initLogger","orchestrator","Orchestrator","create","collision","detectDerivationPathCollisions","walletReport","initializeResolvedWalletReport","info","formatWalletReport","serviceName","length","context","contextFromConfigWithoutLocator","onInsecureGenesisConfirm","undefined","locators","locatorsFromConfig","healthCheckPort","healthServer","statusReporter","initHealthEndpoints","port","readiness","statusMonitor","process","on","log","stop","exit","err","error","runCLI","y","yargs","hideBin","argv","usage","XL1LogoColorizedAscii","parserConfiguration","env","scriptName","middleware","configMiddleware","Boolean","options","optionsFromGlobalZodRegistry","wrap","terminalWidth","command","withDeprecationWarning","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","producerCommand","rewardRedemptionCommand","startCommand","type","description","alias","default","help","start","config","quiet","runCLI","start","catch","err","process","env","NODE_ENV","console","error","exit"]}
1
+ {"version":3,"sources":["../../src/start.ts","../../src/runCLI.ts","../../src/commands/start/startCommand.ts","../../src/initLogger.ts","../../src/commands/withDeprecationWarning.ts","../../src/configMiddleware.ts","../../src/dumpProviders.ts","../../src/images.ts","../../src/optionsFromGlobalZodRegistry.ts","../../src/xl1.ts"],"sourcesContent":["import { config } from 'dotenv'\n\nimport { runCLI } from './runCLI.ts'\n\nexport const start = async () => {\n config({ quiet: true })\n await runCLI()\n}\n","import { stdin as input, stdout as output } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\n\nimport { isDefined } from '@xylabs/sdk-js'\nimport { apiCommand } from '@xyo-network/chain-api'\nimport { bridgeCommand } from '@xyo-network/chain-bridge'\nimport { finalizerCommand } from '@xyo-network/chain-finalizer'\nimport { mempoolCommand } from '@xyo-network/chain-mempool'\nimport {\n contextFromConfigWithoutLocator, detectDerivationPathCollisions, formatWalletReport, initializeResolvedWalletReport,\n locatorsFromConfig, Orchestrator,\n} from '@xyo-network/chain-orchestration'\nimport { initHealthEndpoints } from '@xyo-network/chain-orchestration-express'\nimport { producerCommand } from '@xyo-network/chain-producer'\nimport { rewardRedemptionCommand } from '@xyo-network/chain-reward-redemption'\nimport type { ActorConfig, Config } from '@xyo-network/xl1-sdk'\nimport {\n ActorConfigZod, ConfigZod, DefaultMetricsScrapePorts,\n} from '@xyo-network/xl1-sdk'\nimport type { Argv } from 'yargs'\nimport yargs from 'yargs'\nimport { hideBin } from 'yargs/helpers'\n\nimport { startCommand, withDeprecationWarning } from './commands/index.ts'\nimport { configMiddleware } from './configMiddleware.ts'\nimport { formatProviderTree } from './dumpProviders.ts'\nimport { XL1LogoColorizedAscii } from './images.ts'\nimport { initLogger } from './initLogger.ts'\nimport { optionsFromGlobalZodRegistry } from './optionsFromGlobalZodRegistry.ts'\n\n/** Version string injected by Rollup at build time. */\ndeclare const __VERSION__: string\n\nconst DEFAULT_HEALTH_CHECK_PORT = 9090\n\n/**\n * Maps a CLI actor name to its registered Prometheus scrape port. The CLI-level\n * exporter (one per process) defaults to the port of the first requested actor\n * so that running, e.g., `xl1 start producer` and `xl1 start api` side-by-side\n * doesn't fight over a single shared default.\n */\nfunction defaultScrapePortForActors(actors: readonly string[]): number {\n const primary = actors[0]\n const key = primary === 'rewardRedemption' ? 'rewardRedemptionApi' : primary\n return (DefaultMetricsScrapePorts as Record<string, number>)[key] ?? DefaultMetricsScrapePorts.producer\n}\n\n/**\n * The configuration that will be used throughout the CLI.\n * This is materialized after parsing the command-line arguments,\n * environment variables, and defaults.\n */\nlet configuration: Config\nlet skipInsecureConfirm = false\nlet dumpProviders = false\n\nconst version = isDefined(__VERSION__) ? __VERSION__ : 'unknown'\n\nfunction getConfiguration(): Config {\n return configuration\n}\n\nasync function promptForInsecureGenesisConfirmation(logger: ReturnType<typeof initLogger>) {\n if (!input.isTTY || !output.isTTY) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped because this session is not a TTY.')\n return\n }\n const rl = createInterface({ input, output })\n try {\n await rl.question('Insecure genesis reward wallet is active. Hit RETURN to continue.')\n } finally {\n rl.close()\n }\n}\n\nasync function getLocatorsFromConfig(actors: string[], configuration: Config) {\n const actorConfigs: ActorConfig[] = []\n for (const actorName of actors) {\n const existingConfig = configuration.actors.find(actor => actor.name === actorName)\n if (existingConfig) {\n actorConfigs.push(existingConfig)\n } else {\n const actorConfig = ActorConfigZod.loose().parse({ name: actorName })\n actorConfigs.push(actorConfig)\n }\n }\n\n const config = ConfigZod.parse({ ...configuration, actors: actorConfigs })\n\n const logger = initLogger(configuration)\n const orchestrator = await Orchestrator.create({ logger })\n const collision = detectDerivationPathCollisions(actors, configuration)\n if (collision) throw collision\n const walletReport = await initializeResolvedWalletReport(actors, configuration)\n logger.info(formatWalletReport(walletReport))\n const serviceName = actors.length === 1 ? `xl1-${actors[0]}` : 'xl1-cli'\n const context = await contextFromConfigWithoutLocator(config, logger, serviceName, version, defaultScrapePortForActors(actors))\n if (skipInsecureConfirm) {\n logger.warn('Insecure genesis reward wallet is active. Interactive confirmation skipped via --skip-insecure-confirm.')\n }\n const onInsecureGenesisConfirm = skipInsecureConfirm\n ? undefined\n : async () => await promptForInsecureGenesisConfirmation(logger)\n const locators = await locatorsFromConfig(context, config, onInsecureGenesisConfirm)\n\n // `--dump-providers`: render the locator map and halt before the actor's\n // runner starts. Health endpoints and the SIGINT handler below are skipped.\n if (dumpProviders) {\n console.log(formatProviderTree(locators))\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0)\n }\n\n const healthCheckPort = configuration.healthCheckPort ?? DEFAULT_HEALTH_CHECK_PORT\n const healthServer = healthCheckPort > 0 && context.statusReporter !== undefined\n ? await initHealthEndpoints({\n logger,\n port: healthCheckPort,\n readiness: orchestrator,\n statusMonitor: context.statusReporter,\n })\n : undefined\n\n // Handle cancellation (Ctrl+C)\n process.on('SIGINT', () => {\n void (async () => {\n try {\n logger.log('\\nSIGINT received. Attempting graceful shutdown...')\n healthServer?.close()\n await orchestrator?.stop()\n logger.log('Orchestrator stopped, exiting now.')\n process.exit(0)\n } catch (err) {\n logger.error('Error stopping orchestrator:', err)\n process.exit(1)\n }\n })()\n })\n return { locators, orchestrator }\n}\n\n// Main entry point\nexport async function runCLI() {\n // Parse command-line arguments using Yargs\n const y = yargs(hideBin(process.argv)) as Argv<Config>\n const argv = y\n .usage(`\n🚀 XL1 Node CLI (${version})\n${XL1LogoColorizedAscii}\nRun various components of the XL1 ecosystem.\n\nUsage:\n$0 <command> [options]`)\n .parserConfiguration({\n 'dot-notation': true, // foo.bar → { foo: { bar } }\n 'parse-numbers': false, // Don't auto-parse numbers to allow strings like \"0x1\"\n 'populate--': true, // Populate -- with all options so we can detected user-supplied vs defaults\n })\n .env('XL1')\n .scriptName('xl1')\n .middleware(async (argv) => {\n await configMiddleware(argv, (config) => {\n configuration = config\n })\n skipInsecureConfirm = Boolean(argv['skip-insecure-confirm'])\n dumpProviders = Boolean(argv['dump-providers'])\n })\n .options(optionsFromGlobalZodRegistry())\n .wrap(y.terminalWidth())\n .command(withDeprecationWarning(apiCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(bridgeCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(finalizerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(mempoolCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(producerCommand(getConfiguration, getLocatorsFromConfig)))\n .command(withDeprecationWarning(rewardRedemptionCommand(getConfiguration, getLocatorsFromConfig)))\n .command(startCommand(getConfiguration, getLocatorsFromConfig))\n .options({\n 'config': {\n type: 'string',\n description: 'Path to a config file to use instead of the default search.',\n alias: 'c',\n },\n 'mnemonic': {\n type: 'string',\n description: 'Shared root mnemonic used by actors that do not define their own mnemonic.',\n },\n 'dump-config': {\n type: 'boolean',\n description: 'Just process the configuration and print the resolved config to stdout, then exit. Secrets are redacted unless --with-secrets is also passed.',\n default: false,\n },\n 'with-secrets': {\n type: 'boolean',\n description: 'When used with --dump-config, print raw secret values (mnemonic, private keys, passwords) instead of \"[REDACTED]\". Use only on a developer machine.',\n default: false,\n },\n 'dump-providers': {\n type: 'boolean',\n description: 'Run the normal command flow up to provider locator construction, print the per-actor provider tree (with duplicate detection), then exit.',\n default: false,\n },\n 'skip-insecure-confirm': {\n type: 'boolean',\n description: 'Skip the interactive RETURN confirmation when the built-in dev mnemonic / insecure genesis reward wallet is active.',\n default: false,\n },\n })\n .help()\n .alias('help', 'h')\n .version(version)\n .argv\n\n await argv\n}\n","import { getApiActor } from '@xyo-network/chain-api'\nimport { getBridgeActor } from '@xyo-network/chain-bridge'\nimport { getFinalizerActor } from '@xyo-network/chain-finalizer'\nimport { getMempoolActor } from '@xyo-network/chain-mempool'\nimport type {\n ActorInstanceV3, GetLocatorsFromConfig, OrchestratorInstance,\n} from '@xyo-network/chain-orchestration'\nimport {\n ApiConfigZod,\n BridgeConfigZod,\n FinalizerConfigZod,\n MempoolConfigZod,\n ProducerConfigZod,\n RewardRedemptionConfigZod,\n} from '@xyo-network/chain-orchestration'\nimport { getProducerActor } from '@xyo-network/chain-producer'\nimport { getRewardRedemptionActor } from '@xyo-network/chain-reward-redemption'\nimport type { Config, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\nimport type {\n ArgumentsCamelCase, Argv, CommandModule,\n} from 'yargs'\n\nimport { initLogger } from '../../initLogger.ts'\n\ninterface StartArgs {\n actors?: string[]\n}\n\nconst KNOWN_ACTORS = ['api', 'bridge', 'finalizer', 'mempool', 'producer', 'rewardRedemption'] as const\n\nconst BOOT_TIMEOUT_MS = 60_000\n\nfunction getActorsFromConfig(configuration: Config): string[] | undefined {\n const enabledActors = configuration.actors\n .filter(actor => actor.enabled !== false)\n .map(actor => actor.name)\n return enabledActors.length > 0 ? enabledActors : undefined\n}\n\nfunction getDefaultActors(): string[] {\n return ['api', 'producer', 'finalizer']\n}\n\nasync function buildActor(\n name: string,\n locator: ProviderFactoryLocatorInstance,\n): Promise<ActorInstanceV3> {\n switch (name) {\n case 'api': {\n const config = ApiConfigZod.parse(locator.context.config)\n return await getApiActor(config, locator)\n }\n case 'bridge': {\n const config = BridgeConfigZod.parse(locator.context.config)\n return await getBridgeActor(config, locator)\n }\n case 'mempool': {\n const config = MempoolConfigZod.parse(locator.context.config)\n return await getMempoolActor(config, locator)\n }\n case 'producer': {\n const config = ProducerConfigZod.parse(locator.context.config)\n return await getProducerActor(config, locator)\n }\n case 'rewardRedemption': {\n const config = RewardRedemptionConfigZod.parse(locator.context.config)\n return await getRewardRedemptionActor(config, locator)\n }\n case 'finalizer': {\n const config = FinalizerConfigZod.parse(locator.context.config)\n return await getFinalizerActor(config, locator)\n }\n default: {\n throw new Error(`Unknown actor: ${name}`)\n }\n }\n}\n\nasync function bootActors(\n requestedActors: string[],\n locators: Record<string, ProviderFactoryLocatorInstance>,\n orchestrator: OrchestratorInstance,\n configuration: Config,\n): Promise<void> {\n const startedAt = Date.now()\n const actors = await Promise.all(requestedActors.map(name => buildActor(name, locators[name])))\n for (const actor of actors) {\n await orchestrator.registerActor(actor)\n }\n await orchestrator.start()\n await orchestrator.whenReady(BOOT_TIMEOUT_MS)\n const ms = Date.now() - startedAt\n initLogger(configuration).info(`[xl1] system ready (${requestedActors.length} actor${requestedActors.length === 1 ? '' : 's'}, ${ms}ms)`)\n}\n\nexport function startCommand(getConfiguration: () => Config, getLocatorsFromConfig: GetLocatorsFromConfig): CommandModule {\n return {\n command: ['start [actors..]', '$0'],\n describe: 'Run a full XL1 Node',\n builder: (yargs: Argv) => {\n return yargs\n .positional('actors', {\n type: 'string',\n array: true,\n choices: KNOWN_ACTORS,\n description: 'Actors to start (e.g. xl1 start api producer or xl1 start api,producer)',\n coerce: (values: string[]) => values.flatMap(v => v.split(',')),\n })\n .option('actors', {\n type: 'array',\n string: true,\n choices: KNOWN_ACTORS,\n description: 'List of actors to start (e.g. --actors api producer finalizer). Defaults to api, producer, and finalizer.',\n })\n },\n handler: async (argv: ArgumentsCamelCase<StartArgs>) => {\n const configuration = getConfiguration()\n const requestedActors = argv.actors !== undefined && argv.actors.length > 0\n ? argv.actors\n : getActorsFromConfig(configuration) ?? getDefaultActors()\n const { locators, orchestrator } = await getLocatorsFromConfig(requestedActors, configuration)\n await bootActors(requestedActors, locators, orchestrator, configuration)\n },\n }\n}\n","import type { Logger, LogLevelValue } from '@xylabs/sdk-js'\nimport {\n Base,\n ConsoleLogger, isDefined,\n LogLevel, SilentLogger,\n} from '@xylabs/sdk-js'\nimport type { BaseConfig } from '@xyo-network/xl1-sdk'\n\nexport const initLogger = (config: BaseConfig): Logger => {\n let logger: Logger\n if (config.log.silent) {\n logger = new SilentLogger()\n } else {\n let level: LogLevelValue | undefined\n if (isDefined(config.log.logLevel)) {\n const parsed = LogLevel[config.log.logLevel.toLowerCase() as keyof typeof LogLevel]\n if (isDefined(parsed)) level = parsed\n }\n logger = new ConsoleLogger(level)\n }\n Base.defaultLogger = logger\n return logger\n}\n","import { delay } from '@xylabs/sdk-js'\nimport type { CommandModule } from 'yargs'\n\nexport function withDeprecationWarning(module: CommandModule): CommandModule {\n const { deprecated, handler } = module\n if (typeof deprecated === 'string') {\n return {\n ...module,\n handler: async (argv) => {\n console.warn(`[deprecated] ${deprecated}`)\n await delay(3000)\n return handler(argv)\n },\n }\n }\n return module\n}\n","import { createDeepMerge, isDefined } from '@xylabs/sdk-js'\nimport {\n ActorMnemonicNotAllowedError,\n assertNoActorMnemonics,\n ConfigFileNotFoundError,\n tryParseConfig,\n} from '@xyo-network/chain-orchestration'\nimport type { Config } from '@xyo-network/xl1-sdk'\nimport {\n ConfigZod, isZodError, resolveConfig,\n} from '@xyo-network/xl1-sdk'\n\nconst deepMerge = createDeepMerge({ arrayStrategy: 'concat' })\ntype ConfigWithMnemonic = Config & { mnemonic?: string }\n\nconst REDACTED = '[REDACTED]'\n\n/**\n * Names that always redact, regardless of nesting level. `connectionString` is\n * included because Mongo connection URIs commonly embed `user:password@host`.\n */\nconst REDACTED_KEY_NAMES = new Set<string>(['mnemonic', 'connectionString'])\n\n/**\n * Suffix-matched key names that redact. Catches any future `*PrivateKey`,\n * `*Secret`, or `*Password` field without us having to enumerate them here.\n */\nconst REDACTED_KEY_SUFFIX = /(PrivateKey|Secret|Password)$/i\n\nfunction shouldRedactKey(key: string): boolean {\n if (REDACTED_KEY_NAMES.has(key)) return true\n return REDACTED_KEY_SUFFIX.test(key)\n}\n\n/**\n * Returns a deep clone of `config` with secret-bearing leaf values replaced by\n * `'[REDACTED]'`. Walks plain objects and arrays. Leaves primitives, dates,\n * and other non-plain values untouched (other than via `structuredClone`).\n */\nexport function redactConfig<T>(config: T): T {\n const cloned = structuredClone(config) as unknown\n redactInPlace(cloned)\n return cloned as T\n}\n\nfunction redactInPlace(node: unknown): void {\n if (Array.isArray(node)) {\n for (const item of node) redactInPlace(item)\n return\n }\n if (node === null || typeof node !== 'object') return\n const obj = node as Record<string, unknown>\n for (const key of Object.keys(obj)) {\n if (shouldRedactKey(key) && obj[key] !== undefined && obj[key] !== null) {\n obj[key] = REDACTED\n } else {\n redactInPlace(obj[key])\n }\n }\n}\n\n/**\n * Yargs `.env()` with `dot-notation` turns `XL1_ACTORS__0__NAME=foo` into\n * `{ actors: { '0': { name: 'foo' } } }` — an object keyed by string indices\n * rather than an array. Normalize that back into an array so ConfigZod's\n * `actors` array schema accepts it.\n */\nfunction coerceActorsArray(argv: Record<string, unknown>): Record<string, unknown> {\n const actors = argv.actors\n if (actors === undefined || Array.isArray(actors)) return argv\n if (typeof actors !== 'object' || actors === null) return argv\n const entries = Object.entries(actors as Record<string, unknown>)\n const numericEntries = entries\n .map(([key, value]) => [Number(key), value] as const)\n .filter(([key]) => Number.isInteger(key) && key >= 0)\n if (numericEntries.length !== entries.length) return argv\n const asArray: unknown[] = []\n for (const [key, value] of numericEntries) asArray[key] = value\n return { ...argv, actors: asArray }\n}\n\nfunction safeParseOrThrow(input: unknown): Config {\n const result = ConfigZod.safeParse(input)\n if (!result.success) throw result.error\n return result.data as Config\n}\n\nasync function buildFinalConfig(argv: Record<string, unknown>): Promise<ConfigWithMnemonic> {\n // Parse the various config sources\n const configPath = argv.config as string | undefined\n const parsedConfigFile = await tryParseConfig({ configPath }) as ConfigWithMnemonic // Config file\n const rootMnemonicFromFile = typeof parsedConfigFile.mnemonic === 'string' ? parsedConfigFile.mnemonic : undefined\n const normalizedArgv = coerceActorsArray(argv)\n const parsedConfigArgs = ConfigZod.safeParse(normalizedArgv).data ?? {} // Command-line arguments & ENV VARs\n const rootMnemonicFromArgs = typeof normalizedArgv.mnemonic === 'string' ? normalizedArgv.mnemonic : undefined\n // Deep merge with precedence\n // TODO: Would like precedence to be defaults < file < ENV < CLI Args\n // but there is currently no way to determine which are defaults vs\n // user-supplied CLI Args since we set the CLI args to the defaults\n // and receive a flattened object. We might need to manually invoke\n // the parser without the defaults to achieve this.\n const mergedConfig = safeParseOrThrow(deepMerge(parsedConfigFile, parsedConfigArgs))\n const validated = safeParseOrThrow(resolveConfig(safeParseOrThrow(mergedConfig)))\n const rootMnemonic = rootMnemonicFromArgs ?? rootMnemonicFromFile\n return isDefined(rootMnemonic) ? { ...validated, mnemonic: rootMnemonic } : validated\n}\n\nexport async function configMiddleware(argv: Record<string, unknown>, setConfiguration: (config: Config) => void): Promise<void> {\n try {\n const finalConfig = await buildFinalConfig(argv)\n // Hard-fail if any actor was configured with its own mnemonic. Mnemonics\n // must live at the root; actors pick their wallet via accountPath.\n assertNoActorMnemonics(finalConfig)\n setConfiguration(finalConfig as Config)\n\n // Check if user wants to dump config and exit. Default behavior redacts\n // secrets (mnemonics, private keys, passwords, connection strings). Pass\n // `--with-secrets` to see the raw values — useful only on a developer box.\n if (argv['dump-config']) {\n const withSecrets = Boolean(argv['with-secrets'])\n const output = withSecrets ? finalConfig : redactConfig(finalConfig)\n console.log(JSON.stringify(output, null, 2))\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(0)\n }\n } catch (err) {\n if (err instanceof ConfigFileNotFoundError) {\n console.error(`${err.message}. Check the path passed to --config/-c and try again.`)\n } else if (err instanceof ActorMnemonicNotAllowedError) {\n console.error(err.message)\n } else if (isZodError(err)) {\n console.error(`Zod error: ${err.message}`)\n } else {\n console.error(`Error parsing configuration: ${err}`)\n }\n if (!(err instanceof ConfigFileNotFoundError) && !(err instanceof ActorMnemonicNotAllowedError)) {\n console.error(`Stack: ${err instanceof Error ? err.stack : 'N/A'}`)\n }\n throw new Error('Invalid configuration', { cause: err })\n }\n}\n","import type { ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'\n\n/**\n * One row in the per-actor provider tree. Captures the moniker (registry key),\n * the implementation class, the dependency monikers the factory declared, the\n * factory scope, and a `count` of how many times an identical fingerprint\n * appeared in the same moniker bucket. The registry can hold the same factory\n * more than once (e.g. via merges or multi-moniker registrations); collapsing\n * keeps the tree readable while still surfacing the multiplicity.\n */\ninterface ProviderEntry {\n count: number\n dependencies: readonly string[]\n moniker: string\n providerName: string\n scope: string\n}\n\nconst CANONICAL_ACTOR_ORDER: readonly string[] = [\n '_root', 'producer', 'finalizer', 'api', 'mempool', 'bridge', 'rewardRedemption',\n]\n\n/**\n * Enumerates the providers registered directly on a single locator. Does not\n * walk the parent chain — each locator is reported on its own so that a reader\n * can see exactly which providers a given actor contributed versus what it\n * inherits from `_root`.\n */\nfunction enumerateLocator(locator: ProviderFactoryLocatorInstance): ProviderEntry[] {\n const collapsed = new Map<string, ProviderEntry>()\n const registry = locator.registry as Record<string, unknown[] | undefined>\n for (const moniker of Object.keys(registry)) {\n const factories = registry[moniker]\n if (!factories) continue\n for (const factory of factories) {\n const f = factory as { dependencies?: readonly string[]; providerName?: string; scope?: string }\n const providerName = f.providerName ?? '<unknown>'\n const scope = f.scope ?? '<unknown>'\n const dependencies = f.dependencies ?? []\n const fingerprint = `${moniker}|${providerName}|${scope}|${dependencies.join(',')}`\n const existing = collapsed.get(fingerprint)\n if (existing) {\n existing.count += 1\n } else {\n collapsed.set(fingerprint, {\n count: 1, dependencies, moniker, providerName, scope,\n })\n }\n }\n }\n return [...collapsed.values()].toSorted((a, b) => a.moniker.localeCompare(b.moniker) || a.providerName.localeCompare(b.providerName))\n}\n\nfunction buildOwnerIndex(perActor: ReadonlyMap<string, readonly ProviderEntry[]>): Map<string, Set<string>> {\n const monikerOwners = new Map<string, Set<string>>()\n for (const [actorName, entries] of perActor) {\n for (const entry of entries) {\n let owners = monikerOwners.get(entry.moniker)\n if (!owners) {\n owners = new Set()\n monikerOwners.set(entry.moniker, owners)\n }\n owners.add(actorName)\n }\n }\n return monikerOwners\n}\n\nfunction renderDuplicatesSummary(monikerOwners: ReadonlyMap<string, ReadonlySet<string>>): string[] {\n const duplicates = [...monikerOwners.entries()]\n .filter(([, owners]) => owners.size > 1)\n .map(([moniker, owners]) => ({ moniker, owners: [...owners].toSorted().map(formatGroupForDisplay) }))\n .toSorted((a, b) => a.moniker.localeCompare(b.moniker))\n if (duplicates.length === 0) return []\n const lines = ['Duplicate monikers (registered by more than one locator):']\n for (const { moniker, owners } of duplicates) {\n lines.push(` - ${moniker}: ${owners.join(', ')}`)\n }\n lines.push('')\n return lines\n}\n\n/**\n * Groups actor names whose locators share the same `registry` object reference.\n * Under the shared-locator architecture (Option B), api/mempool/finalizer all\n * point to view locators that share one underlying registry — without this\n * grouping, the dump would print the same factory set N times and falsely\n * report every moniker as \"duplicate across actors.\"\n */\nfunction groupActorsBySharedRegistry(\n locators: Record<string, ProviderFactoryLocatorInstance>,\n): { actorNames: readonly string[]; locator: ProviderFactoryLocatorInstance }[] {\n const groups: { actorNames: string[]; locator: ProviderFactoryLocatorInstance; registry: unknown }[] = []\n for (const actorName of Object.keys(locators)) {\n const locator = locators[actorName]\n const existing = groups.find(g => g.registry === locator.registry)\n if (existing) {\n existing.actorNames.push(actorName)\n } else {\n groups.push({\n actorNames: [actorName], locator, registry: locator.registry,\n })\n }\n }\n return groups\n}\n\n/**\n * Stable id for a registry-sharing group: sorted, comma-joined actor names.\n * Used as the key in `monikerOwners`. Multi-actor group ids contain commas;\n * we display them parenthesized in the `also in:` annotation.\n */\nfunction groupId(actorNames: readonly string[]): string {\n return [...actorNames].toSorted().join(',')\n}\n\nfunction formatGroupForDisplay(groupKey: string): string {\n const members = groupKey.split(',')\n return members.length === 1 ? members[0] : `(${members.join(', ')})`\n}\n\nfunction renderGroupSection(\n actorNames: readonly string[],\n entries: readonly ProviderEntry[],\n monikerOwners: ReadonlyMap<string, ReadonlySet<string>>,\n): string[] {\n const sortedActors = [...actorNames].toSorted()\n const ownGroupKey = groupId(sortedActors)\n const heading = sortedActors.length === 1\n ? `Providers for actor: ${sortedActors[0]} (${entries.length} registered)`\n : `Providers shared by actors: ${sortedActors.join(', ')} (${entries.length} registered)`\n const lines: string[] = [heading]\n if (entries.length === 0) {\n lines.push(' (none)', '')\n return lines\n }\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const isLast = i === entries.length - 1\n const branch = isLast ? '└──' : '├──'\n const owners = monikerOwners.get(entry.moniker) ?? new Set<string>()\n const otherOwners = [...owners]\n .filter(o => o !== ownGroupKey)\n .toSorted()\n .map(formatGroupForDisplay)\n const dupNote = otherOwners.length > 0 ? ` ⚠ also in: ${otherOwners.join(', ')}` : ''\n const depsNote = entry.dependencies.length > 0 ? `, deps: [${entry.dependencies.join(', ')}]` : ''\n const countNote = entry.count > 1 ? ` (×${entry.count})` : ''\n lines.push(` ${branch} ${entry.moniker}${countNote} [impl: ${entry.providerName}, scope: ${entry.scope}${depsNote}]${dupNote}`)\n }\n lines.push('')\n return lines\n}\n\n/**\n * Renders the locator map as a tree grouped by registry identity, annotating\n * any moniker that appears in more than one *registry* with `⚠ also in: ...`.\n *\n * - When all input locators share one registry (shared-locator path), a single\n * \"Providers shared by actors: …\" section is rendered.\n * - When some actors have distinct registries (legacy `_root` + per-actor\n * child architecture), each registry is rendered separately. `_root` is\n * ordered first.\n *\n * The \"Duplicate monikers\" summary at the bottom only flags monikers\n * registered by *different* registries — duplicates within one registry are\n * already collapsed into per-entry `(×N)` counts by `enumerateLocator`.\n */\nexport function formatProviderTree(locators: Record<string, ProviderFactoryLocatorInstance>): string {\n const groups = groupActorsBySharedRegistry(locators)\n\n // Per-actor moniker ownership (used for the \"also in:\" annotation), but\n // attribute each moniker to the GROUP it belongs to — the \"actor name\" the\n // index uses is the joined group key, so two actors that share a registry\n // never appear as duplicates of each other.\n const groupKeys = groups.map(g => ({ ...g, key: groupId(g.actorNames) }))\n const perGroup = new Map<string, ProviderEntry[]>()\n for (const g of groupKeys) perGroup.set(g.key, enumerateLocator(g.locator))\n const monikerOwners = buildOwnerIndex(perGroup)\n\n // Order: legacy `_root` first when present; otherwise alphabetical by sorted\n // actor names within the group, with the canonical actor order applied to\n // the *primary* (sorted-first) actor name in each group.\n const orderedGroups = [...groupKeys].toSorted((a, b) => {\n const aHasRoot = a.actorNames.includes('_root')\n const bHasRoot = b.actorNames.includes('_root')\n if (aHasRoot !== bHasRoot) return aHasRoot ? -1 : 1\n const ai = CANONICAL_ACTOR_ORDER.indexOf(a.actorNames[0])\n const bi = CANONICAL_ACTOR_ORDER.indexOf(b.actorNames[0])\n if (ai !== bi) return (ai === -1 ? Number.MAX_SAFE_INTEGER : ai) - (bi === -1 ? Number.MAX_SAFE_INTEGER : bi)\n return a.key.localeCompare(b.key)\n })\n\n const lines: string[] = ['XL1 Provider Dump', '=================', '']\n for (const g of orderedGroups) {\n lines.push(...renderGroupSection(g.actorNames.toSorted(), perGroup.get(g.key) ?? [], monikerOwners))\n }\n lines.push(...renderDuplicatesSummary(monikerOwners))\n return lines.join('\\n')\n}\n","/* eslint-disable no-irregular-whitespace, @stylistic/max-len */\nexport const XL1LogoColorizedAscii = `\u001b[38;2;128;128;128m                    \u001b[0m\u001b[38;2;118;111;144m_\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;72;32;223m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   ╠╠\u001b[0m\u001b[38;2;103;85;170m_\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;79;121;152m╦\u001b[0m\u001b[38;2;82;121;151m╦\u001b[0m\u001b[38;2;112;125;136m_       \u001b[0m\u001b[38;2;88;59;196m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;73;34;221m▒       \u001b[0m\u001b[38;2;121;121;127m_\u001b[0m\u001b[38;2;100;101;128m╔\u001b[0m\u001b[38;2;93;94;127m╦\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;82;121;151m²\u001b[0m\u001b[38;2;44;116;170m╠\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;51;117;167mD\u001b[0m\u001b[38;2;80;121;152m╦\u001b[0m\u001b[38;2;111;125;136m_    \u001b[0m\u001b[38;2;67;23;232m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;120;121;128m_\u001b[0m\u001b[38;2;100;101;127m╔\u001b[0m\u001b[38;2;79;81;127mR\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;88;90;127m╙\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;55;117;165m╚\u001b[0m\u001b[38;2;44;116;171m▒\u001b[0m\u001b[38;2;44;116;171m▒▒\u001b[0m\u001b[38;2;50;116;167mD\u001b[0m\u001b[38;2;80;121;152m╦ \u001b[0m\u001b[38;2;106;90;165mj\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;89;61;194mH \u001b[0m\u001b[38;2;99;100;127m╔\u001b[0m\u001b[38;2;79;80;127mD\u001b[0m\u001b[38;2;71;73;128m▒\u001b[0m\u001b[38;2;71;73;128m▒▒╠\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;83;121;150m²\u001b[0m\u001b[38;2;44;116;170m▒\u001b[0m\u001b[38;2;44;116;171m▒▒▒ \u001b[0m\u001b[38;2;76;38;217m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;74;76;128m╠\u001b[0m\u001b[38;2;71;73;128m▒▒▒\u001b[0m\u001b[38;2;89;90;128m╙\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;90;118;148m\\`\u001b[0m\u001b[38;2;89;107;153m_\u001b[0m\u001b[38;2;93;97;154m,\u001b[0m\u001b[38;2;105;89;166m╓\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;95;72;183m╓\u001b[0m\u001b[38;2;106;96;152m_\u001b[0m\u001b[38;2;100;94;143m\\`\u001b[0m\u001b[38;2;101;100;133m\\`\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;122;118;137m_\u001b[0m\u001b[38;2;113;102;153m,\u001b[0m\u001b[38;2;108;94;161m╓\u001b[0m\u001b[38;2;104;86;169m╓\u001b[0m\u001b[38;2;98;77;178m╔\u001b[0m\u001b[38;2;93;67;188m╗\u001b[0m\u001b[38;2;88;59;196mφ\u001b[0m\u001b[38;2;83;51;204m@\u001b[0m\u001b[38;2;78;42;213mD\u001b[0m\u001b[38;2;72;32;223m▒\u001b[0m\u001b[38;2;68;24;231m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;71;30;225m▒\u001b[0m\u001b[38;2;77;40;215m▒\u001b[0m\u001b[38;2;82;49;206mK\u001b[0m\u001b[38;2;87;57;198mφ\u001b[0m\u001b[38;2;91;65;190m╗\u001b[0m\u001b[38;2;97;75;180m╦\u001b[0m\u001b[38;2;103;84;171m╖\u001b[0m\u001b[38;2;107;92;163m²\u001b[0m\u001b[38;2;112;101;154m_\u001b[0m\u001b[38;2;119;112;143m_\u001b[0m\n\u001b[38;2;128;128;128m \u001b[0m\u001b[38;2;106;91;164m\\`\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;89;62;193m╙\u001b[0m\u001b[38;2;85;54;201m╙\u001b[0m\u001b[38;2;80;45;210m╚\u001b[0m\u001b[38;2;74;35;220m╝\u001b[0m\u001b[38;2;69;26;229m╠\u001b[0m\u001b[38;2;66;22;233m╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠\u001b[0m\u001b[38;2;73;33;222m╝\u001b[0m\u001b[38;2;79;43;212m╩\u001b[0m\u001b[38;2;84;52;203m╜\u001b[0m\u001b[38;2;88;60;195m╙\u001b[0m\u001b[38;2;93;68;187m^\u001b[0m\u001b[38;2;100;80;175m\\`\u001b[0m\n\u001b[38;2;128;128;128m             \u001b[0m\u001b[38;2;113;84;152m\\`\u001b[0m\u001b[38;2;103;79;169m'\u001b[0m\u001b[38;2;95;72;183m\"\u001b[0m\u001b[38;2;87;57;198m╙\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠╠\u001b[0m\u001b[38;2;80;46;209m╜\u001b[0m\u001b[38;2;94;70;185m^\u001b[0m\u001b[38;2;102;77;175m^\u001b[0m\u001b[38;2;112;81;162m\\`\u001b[0m\u001b[38;2;115;92;155m\\`\u001b[0m\n\u001b[38;2;128;128;128m           \u001b[0m\u001b[38;2;145;116;107m,\u001b[0m\u001b[38;2;199;82;45m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒╠ \u001b[0m\u001b[38;2;70;28;227m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠╠ \u001b[0m\u001b[38;2;189;49;97må\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;155;92;114m,\u001b[0m\n\u001b[38;2;128;128;128m          \u001b[0m\u001b[38;2;175;98;73m╔\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒▒▒\u001b[0m\u001b[38;2;197;83;47m╩ \u001b[0m\u001b[38;2;98;76;179m[\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠\u001b[0m\u001b[38;2;81;48;207mH \u001b[0m\u001b[38;2;188;51;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠╠\u001b[0m\u001b[38;2;183;57;100mH\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;146;116;106m,\u001b[0m\u001b[38;2;199;82;44m╠\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;207;77;35m▒\u001b[0m\u001b[38;2;196;84;48m╩\u001b[0m\u001b[38;2;168;102;81m^    \u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠╠    \u001b[0m\u001b[38;2;160;87;111m'\u001b[0m\u001b[38;2;187;52;98m╚\u001b[0m\u001b[38;2;203;32;90m╠\u001b[0m\u001b[38;2;203;32;90m╠╠\u001b[0m\u001b[38;2;156;91;113m,\u001b[0m\n\u001b[38;2;128;128;128m        \u001b[0m\u001b[38;2;198;83;46m╩\u001b[0m\u001b[38;2;194;85;50m╩\u001b[0m\u001b[38;2;167;102;82m^       \u001b[0m\u001b[38;2;81;46;209m╚\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠╠       \u001b[0m\u001b[38;2;159;88;112m'\u001b[0m\u001b[38;2;186;53;98m╚\u001b[0m\u001b[38;2;197;40;93m╩\u001b[0m\n\u001b[38;2;128;128;128m                  \u001b[0m\u001b[38;2;110;97;158m'\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\u001b[38;2;94;69;186mH\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;68;25;230m╠\u001b[0m\u001b[38;2;66;21;234m╠\u001b[0m\n\u001b[38;2;128;128;128m                   \u001b[0m\u001b[38;2;108;93;162m²\u001b[0m\u001b[38;2;99;79;176m^\u001b[0m`\n","import type { UsageMeta } from '@xyo-network/xl1-sdk'\nimport { isUsageMeta } from '@xyo-network/xl1-sdk'\nimport type { Options } from 'yargs'\nimport { globalRegistry } from 'zod'\n\nconst usageMetaToOptions = (meta: UsageMeta): Options => {\n return meta\n}\n\nexport const optionsFromGlobalZodRegistry = (): Record<string, Options> => {\n const opts: Record<string, Options> = {}\n for (const schema of Object.values(globalRegistry._map)) {\n if (isUsageMeta(schema)) {\n if (schema.hidden) continue // skip hidden options\n opts[schema.title] = usageMetaToOptions(schema)\n }\n }\n return opts\n}\n","import { start } from './start.ts'\n\nstart().catch((err) => {\n // If we're in development mode, log the stack trace to the console\n if (process.env.NODE_ENV === 'development') console.error('An error occurred during startup:', err)\n // eslint-disable-next-line unicorn/no-process-exit\n process.exit(1)\n})\n"],"mappings":"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","names":["config","stdin","input","stdout","output","createInterface","isDefined","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","contextFromConfigWithoutLocator","detectDerivationPathCollisions","formatWalletReport","initializeResolvedWalletReport","locatorsFromConfig","Orchestrator","initHealthEndpoints","producerCommand","rewardRedemptionCommand","ActorConfigZod","ConfigZod","DefaultMetricsScrapePorts","yargs","hideBin","getApiActor","getBridgeActor","getFinalizerActor","getMempoolActor","ApiConfigZod","BridgeConfigZod","FinalizerConfigZod","MempoolConfigZod","ProducerConfigZod","RewardRedemptionConfigZod","getProducerActor","getRewardRedemptionActor","Base","ConsoleLogger","isDefined","LogLevel","SilentLogger","initLogger","config","logger","log","silent","SilentLogger","level","isDefined","logLevel","parsed","LogLevel","toLowerCase","ConsoleLogger","Base","defaultLogger","KNOWN_ACTORS","BOOT_TIMEOUT_MS","getActorsFromConfig","configuration","enabledActors","actors","filter","actor","enabled","map","name","length","undefined","getDefaultActors","buildActor","locator","config","ApiConfigZod","parse","context","getApiActor","BridgeConfigZod","getBridgeActor","MempoolConfigZod","getMempoolActor","ProducerConfigZod","getProducerActor","RewardRedemptionConfigZod","getRewardRedemptionActor","FinalizerConfigZod","getFinalizerActor","Error","bootActors","requestedActors","locators","orchestrator","startedAt","Date","now","Promise","all","registerActor","start","whenReady","ms","initLogger","info","startCommand","getConfiguration","getLocatorsFromConfig","command","describe","builder","yargs","positional","type","array","choices","description","coerce","values","flatMap","v","split","option","string","handler","argv","delay","withDeprecationWarning","module","deprecated","handler","argv","console","warn","delay","createDeepMerge","isDefined","ActorMnemonicNotAllowedError","assertNoActorMnemonics","ConfigFileNotFoundError","tryParseConfig","ConfigZod","isZodError","resolveConfig","deepMerge","createDeepMerge","arrayStrategy","REDACTED","REDACTED_KEY_NAMES","Set","REDACTED_KEY_SUFFIX","shouldRedactKey","key","has","test","redactConfig","config","cloned","structuredClone","redactInPlace","node","Array","isArray","item","obj","Object","keys","undefined","coerceActorsArray","argv","actors","entries","numericEntries","map","value","Number","filter","isInteger","length","asArray","safeParseOrThrow","input","result","ConfigZod","safeParse","success","error","data","buildFinalConfig","configPath","parsedConfigFile","tryParseConfig","rootMnemonicFromFile","mnemonic","normalizedArgv","parsedConfigArgs","rootMnemonicFromArgs","mergedConfig","validated","resolveConfig","rootMnemonic","isDefined","configMiddleware","setConfiguration","finalConfig","assertNoActorMnemonics","withSecrets","Boolean","output","console","log","JSON","stringify","process","exit","err","ConfigFileNotFoundError","message","ActorMnemonicNotAllowedError","isZodError","Error","stack","cause","CANONICAL_ACTOR_ORDER","enumerateLocator","locator","collapsed","Map","registry","moniker","Object","keys","factories","factory","f","providerName","scope","dependencies","fingerprint","join","existing","get","count","set","values","toSorted","a","b","localeCompare","buildOwnerIndex","perActor","monikerOwners","actorName","entries","entry","owners","Set","add","renderDuplicatesSummary","duplicates","filter","size","map","formatGroupForDisplay","length","lines","push","groupActorsBySharedRegistry","locators","groups","find","g","actorNames","groupId","groupKey","members","split","renderGroupSection","sortedActors","ownGroupKey","heading","i","isLast","branch","otherOwners","o","dupNote","depsNote","countNote","formatProviderTree","groupKeys","key","perGroup","orderedGroups","aHasRoot","includes","bHasRoot","ai","indexOf","bi","Number","MAX_SAFE_INTEGER","XL1LogoColorizedAscii","isUsageMeta","globalRegistry","usageMetaToOptions","meta","optionsFromGlobalZodRegistry","opts","schema","Object","values","globalRegistry","_map","isUsageMeta","hidden","title","DEFAULT_HEALTH_CHECK_PORT","defaultScrapePortForActors","actors","primary","key","DefaultMetricsScrapePorts","producer","configuration","skipInsecureConfirm","dumpProviders","version","isDefined","__VERSION__","getConfiguration","promptForInsecureGenesisConfirmation","logger","input","isTTY","output","warn","rl","createInterface","question","close","getLocatorsFromConfig","actorConfigs","actorName","existingConfig","find","actor","name","push","actorConfig","ActorConfigZod","loose","parse","config","ConfigZod","initLogger","orchestrator","Orchestrator","create","collision","detectDerivationPathCollisions","walletReport","initializeResolvedWalletReport","info","formatWalletReport","serviceName","length","context","contextFromConfigWithoutLocator","onInsecureGenesisConfirm","undefined","locators","locatorsFromConfig","console","log","formatProviderTree","process","exit","healthCheckPort","healthServer","statusReporter","initHealthEndpoints","port","readiness","statusMonitor","on","stop","err","error","runCLI","y","yargs","hideBin","argv","usage","XL1LogoColorizedAscii","parserConfiguration","env","scriptName","middleware","configMiddleware","Boolean","options","optionsFromGlobalZodRegistry","wrap","terminalWidth","command","withDeprecationWarning","apiCommand","bridgeCommand","finalizerCommand","mempoolCommand","producerCommand","rewardRedemptionCommand","startCommand","type","description","alias","default","help","start","config","quiet","runCLI","start","catch","err","process","env","NODE_ENV","console","error","exit"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/xl1-cli-lib",
3
- "version": "1.21.3",
3
+ "version": "1.23.0",
4
4
  "description": "XYO Layer One CLI Library",
5
5
  "homepage": "https://xylabs.com",
6
6
  "bugs": {
@@ -38,36 +38,36 @@
38
38
  "README.md"
39
39
  ],
40
40
  "dependencies": {
41
- "@xyo-network/chain-finalizer": "~1.21.3",
42
- "@xyo-network/chain-bridge": "~1.21.3",
43
- "@xyo-network/chain-api": "~1.21.3",
44
- "@xyo-network/chain-orchestration": "~1.21.3",
45
- "@xyo-network/chain-orchestration-express": "~1.21.3",
46
- "@xyo-network/chain-mempool": "~1.21.3",
47
- "@xyo-network/chain-producer": "~1.21.3",
48
- "@xyo-network/chain-reward-redemption": "~1.21.3"
41
+ "@xyo-network/chain-api": "~1.23.0",
42
+ "@xyo-network/chain-mempool": "~1.23.0",
43
+ "@xyo-network/chain-bridge": "~1.23.0",
44
+ "@xyo-network/chain-producer": "~1.23.0",
45
+ "@xyo-network/chain-finalizer": "~1.23.0",
46
+ "@xyo-network/chain-orchestration": "~1.23.0",
47
+ "@xyo-network/chain-reward-redemption": "~1.23.0",
48
+ "@xyo-network/chain-orchestration-express": "~1.23.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@bitauth/libauth": "~3.0.0",
52
- "@metamask/json-rpc-engine": "^10.3.0",
52
+ "@metamask/json-rpc-engine": "^10.5.0",
53
53
  "@metamask/providers": "^22.1.1",
54
54
  "@metamask/utils": "~11.11.0",
55
55
  "@opentelemetry/api": "^1.9.1",
56
56
  "@opentelemetry/context-async-hooks": "~2.7.1",
57
57
  "@opentelemetry/context-zone": "~2.7.1",
58
58
  "@opentelemetry/core": "~2.7.1",
59
- "@opentelemetry/exporter-prometheus": "~0.217",
60
- "@opentelemetry/exporter-trace-otlp-grpc": "~0.217",
61
- "@opentelemetry/exporter-trace-otlp-http": "~0.217",
59
+ "@opentelemetry/exporter-prometheus": "~0.217.0",
60
+ "@opentelemetry/exporter-trace-otlp-grpc": "~0.217.0",
61
+ "@opentelemetry/exporter-trace-otlp-http": "~0.217.0",
62
62
  "@opentelemetry/host-metrics": "~0.38.3",
63
- "@opentelemetry/instrumentation": "~0.217",
64
- "@opentelemetry/instrumentation-express": "~0.65",
65
- "@opentelemetry/instrumentation-http": "~0.217",
66
- "@opentelemetry/instrumentation-runtime-node": "~0.30",
63
+ "@opentelemetry/instrumentation": "~0.217.0",
64
+ "@opentelemetry/instrumentation-express": "~0.65.0",
65
+ "@opentelemetry/instrumentation-http": "~0.217.0",
66
+ "@opentelemetry/instrumentation-runtime-node": "~0.30.0",
67
67
  "@opentelemetry/resources": "~2.7.1",
68
68
  "@opentelemetry/sdk-metrics": "~2.7.1",
69
69
  "@opentelemetry/sdk-trace-base": "^2.7.1",
70
- "@opentelemetry/semantic-conventions": "~1.40.0",
70
+ "@opentelemetry/semantic-conventions": "~1.41.1",
71
71
  "@scure/base": "~2.2.0",
72
72
  "@scure/bip39": "~2.2.0",
73
73
  "@types/yargs": "^17.0.35",
@@ -77,8 +77,8 @@
77
77
  "@xylabs/mongo": "^5.1.2",
78
78
  "@xylabs/sdk-js": "^5.1.2",
79
79
  "@xylabs/threads": "~5.1.2",
80
- "@xylabs/toolchain": "~7.13.15",
81
- "@xylabs/tsconfig": "~7.13.15",
80
+ "@xylabs/toolchain": "~7.13.24",
81
+ "@xylabs/tsconfig": "~7.13.24",
82
82
  "@xyo-network/account": "~5.6.2",
83
83
  "@xyo-network/account-model": "~5.6.3",
84
84
  "@xyo-network/api": "~5.6.2",
@@ -86,8 +86,8 @@
86
86
  "@xyo-network/archivist-lmdb": "~5.6.4",
87
87
  "@xyo-network/archivist-mongodb": "~5.6.4",
88
88
  "@xyo-network/archivist-view": "~5.6.4",
89
- "@xyo-network/bios": "~7.3.0",
90
- "@xyo-network/bios-model": "~7.3.0",
89
+ "@xyo-network/bios": "~7.3.1",
90
+ "@xyo-network/bios-model": "~7.3.1",
91
91
  "@xyo-network/boundwitness-builder": "~5.6.2",
92
92
  "@xyo-network/boundwitness-model": "~5.6.3",
93
93
  "@xyo-network/boundwitness-validator": "~5.6.2",
@@ -105,14 +105,14 @@
105
105
  "@xyo-network/typechain": "^4.1.3",
106
106
  "@xyo-network/wallet": "~5.6.2",
107
107
  "@xyo-network/wallet-model": "^5.6.3",
108
- "@xyo-network/xl1-protocol-sdk": "~1.28.5",
109
- "@xyo-network/xl1-sdk": "^1.28.5",
108
+ "@xyo-network/xl1-protocol-sdk": "~1.30.1",
109
+ "@xyo-network/xl1-sdk": "^1.30.1",
110
110
  "ajv": "^8.20.0",
111
111
  "async-mutex": "^0.5.0",
112
112
  "bn.js": "^5.2.3",
113
113
  "body-parser": "~2.2.2",
114
114
  "buffer": "^6.0.3",
115
- "bullmq": "~5.76.6",
115
+ "bullmq": "~5.76.8",
116
116
  "bullmq-otel": "~1.3.1",
117
117
  "chalk": "^5.6.2",
118
118
  "compression": "~1.8.1",
@@ -140,8 +140,8 @@
140
140
  "store2": "~2.14.4",
141
141
  "typescript": "~5.9.3",
142
142
  "uuid": "~14.0.0",
143
- "vite": "^8.0.10",
144
- "vitest": "^4.1.5",
143
+ "vite": "^8.0.12",
144
+ "vitest": "^4.1.6",
145
145
  "wasm-feature-detect": "~1.8.0",
146
146
  "web3-types": "~1.10.0",
147
147
  "webextension-polyfill": "^0.12.0",
@@ -170,7 +170,7 @@
170
170
  "@opentelemetry/resources": "~2.7",
171
171
  "@opentelemetry/sdk-metrics": "~2.7",
172
172
  "@opentelemetry/sdk-trace-base": "^2.7",
173
- "@opentelemetry/semantic-conventions": "~1.40",
173
+ "@opentelemetry/semantic-conventions": "~1.41",
174
174
  "@scure/base": "~2.2",
175
175
  "@scure/bip39": "~2.2",
176
176
  "@xylabs/express": "^5.1",
@@ -205,7 +205,7 @@
205
205
  "@xyo-network/typechain": "^4.1",
206
206
  "@xyo-network/wallet": "~5.6",
207
207
  "@xyo-network/wallet-model": "^5.6",
208
- "@xyo-network/xl1-protocol-sdk": "~1.28",
208
+ "@xyo-network/xl1-protocol-sdk": "~1.30.1",
209
209
  "@xyo-network/xl1-sdk": "^1.28",
210
210
  "ajv": "^8.20",
211
211
  "async-mutex": "^0.5",