@powerhousedao/switchboard 6.0.0-dev.1 → 6.0.0-dev.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +905 -0
  2. package/Dockerfile +63 -37
  3. package/README.md +92 -0
  4. package/dist/src/index.js +35 -3
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/metrics.d.ts +7 -0
  7. package/dist/src/metrics.d.ts.map +1 -0
  8. package/dist/src/metrics.js +34 -0
  9. package/dist/src/metrics.js.map +1 -0
  10. package/dist/src/migrate.d.ts +3 -0
  11. package/dist/src/migrate.d.ts.map +1 -0
  12. package/dist/src/migrate.js +65 -0
  13. package/dist/src/migrate.js.map +1 -0
  14. package/dist/src/profiler.d.ts +6 -1
  15. package/dist/src/profiler.d.ts.map +1 -1
  16. package/dist/src/profiler.js +31 -5
  17. package/dist/src/profiler.js.map +1 -1
  18. package/dist/src/renown.d.ts +16 -0
  19. package/dist/src/renown.d.ts.map +1 -0
  20. package/dist/src/renown.js +33 -0
  21. package/dist/src/renown.js.map +1 -0
  22. package/dist/src/server.d.ts +0 -1
  23. package/dist/src/server.d.ts.map +1 -1
  24. package/dist/src/server.js +163 -78
  25. package/dist/src/server.js.map +1 -1
  26. package/dist/src/types.d.ts +19 -6
  27. package/dist/src/types.d.ts.map +1 -1
  28. package/dist/test/metrics.test.d.ts +2 -0
  29. package/dist/test/metrics.test.d.ts.map +1 -0
  30. package/dist/test/metrics.test.js +121 -0
  31. package/dist/test/metrics.test.js.map +1 -0
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/dist/vitest.config.d.ts +3 -0
  34. package/dist/vitest.config.d.ts.map +1 -0
  35. package/dist/vitest.config.js +15 -0
  36. package/dist/vitest.config.js.map +1 -0
  37. package/entrypoint.sh +11 -16
  38. package/package.json +35 -23
  39. package/test/metrics.test.ts +202 -0
  40. package/tsconfig.json +8 -2
  41. package/vitest.config.ts +15 -0
  42. package/dist/src/connect-crypto.d.ts +0 -41
  43. package/dist/src/connect-crypto.d.ts.map +0 -1
  44. package/dist/src/connect-crypto.js +0 -127
  45. package/dist/src/connect-crypto.js.map +0 -1
@@ -1,8 +1,14 @@
1
1
  #!/usr/bin/env node
2
+ import { httpsHooksPath } from "@powerhousedao/reactor-api";
3
+ import { register } from "node:module";
4
+ // Register HTTP/HTTPS module loader hooks for dynamic package imports
5
+ register(httpsHooksPath, import.meta.url);
2
6
  import { PGlite } from "@electric-sql/pglite";
3
- import { CompositeChannelFactory, ConsoleLogger, EventBus, ReactorBuilder, ReactorClientBuilder, SyncBuilder, } from "@powerhousedao/reactor";
4
- import { VitePackageLoader, getUniqueDocumentModels, initializeAndStartAPI, startViteServer, } from "@powerhousedao/reactor-api";
5
- import { ConnectCryptoSigner } from "@renown/sdk";
7
+ import { ReactorInstrumentation } from "@powerhousedao/opentelemetry-instrumentation-reactor";
8
+ import { ChannelScheme, EventBus, ReactorBuilder, ReactorClientBuilder, driveCollectionId, parseDriveUrl, } from "@powerhousedao/reactor";
9
+ import { metrics } from "@opentelemetry/api";
10
+ import { HttpPackageLoader, PackageManagementService, PackagesSubgraph, VitePackageLoader, createViteLogger, getUniqueDocumentModels, initializeAndStartAPI, startViteServer, } from "@powerhousedao/reactor-api";
11
+ import {} from "@renown/sdk";
6
12
  import * as Sentry from "@sentry/node";
7
13
  import { DocumentAlreadyExistsError, InMemoryCache, ReactorBuilder as LegacyReactorBuilder, childLogger, driveDocumentModelModule, } from "document-drive";
8
14
  import { RedisCache } from "document-drive/cache/redis";
@@ -11,15 +17,15 @@ import { PrismaStorageFactory } from "document-drive/storage/prisma";
11
17
  import { documentModelDocumentModelModule } from "document-model";
12
18
  import dotenv from "dotenv";
13
19
  import express from "express";
14
- import { Kysely } from "kysely";
20
+ import { Kysely, PostgresDialect } from "kysely";
15
21
  import { PGliteDialect } from "kysely-pglite-dialect";
16
22
  import path from "path";
23
+ import { Pool } from "pg";
17
24
  import { initRedis } from "./clients/redis.js";
18
- import { initConnectCrypto } from "./connect-crypto.js";
19
25
  import { initFeatureFlags } from "./feature-flags.js";
20
- import { initProfilerFromEnv } from "./profiler.js";
26
+ import { initRenown } from "./renown.js";
21
27
  import { addDefaultDrive, addRemoteDrive, isPostgresUrl } from "./utils.js";
22
- const logger = childLogger(["switchboard"]);
28
+ const defaultLogger = childLogger(["switchboard"]);
23
29
  dotenv.config();
24
30
  // Feature flag constants
25
31
  const DOCUMENT_MODEL_SUBGRAPHS_ENABLED = "DOCUMENT_MODEL_SUBGRAPHS_ENABLED";
@@ -31,7 +37,7 @@ const ENABLE_DUAL_ACTION_CREATE_DEFAULT = true;
31
37
  // Create a monolith express app for all subgraphs
32
38
  const app = express();
33
39
  if (process.env.SENTRY_DSN) {
34
- logger.info("Initialized Sentry with env:", process.env.SENTRY_ENV);
40
+ defaultLogger.info("Initialized Sentry with env: @env", process.env.SENTRY_ENV);
35
41
  Sentry.init({
36
42
  dsn: process.env.SENTRY_DSN,
37
43
  environment: process.env.SENTRY_ENV,
@@ -50,10 +56,10 @@ async function initPrismaStorage(connectionString, cache) {
50
56
  if (e instanceof Error && e.message.includes(prismaConnectError)) {
51
57
  const dbUrl = connectionString;
52
58
  const safeUrl = `${dbUrl.slice(0, dbUrl.indexOf(":") + 1)}{...}${dbUrl.slice(dbUrl.indexOf("@"), dbUrl.lastIndexOf("?"))}`;
53
- logger.warn(`Can't reach database server at '${safeUrl}'`);
59
+ defaultLogger.warn("Can't reach database server at '@safeUrl'", safeUrl);
54
60
  }
55
61
  else {
56
- logger.error(e);
62
+ defaultLogger.error("@error", e);
57
63
  }
58
64
  throw e;
59
65
  }
@@ -70,7 +76,7 @@ async function initReactorStorage(cache, dbPath = "./.ph/drive-storage") {
70
76
  }
71
77
  }
72
78
  catch {
73
- logger.warn("Falling back to filesystem storage");
79
+ defaultLogger.warn("Falling back to filesystem storage");
74
80
  }
75
81
  // if url was postgres and connection failed, fallback to filesystem on default path
76
82
  const filesystemPath = isPostgres ? "./.ph/drive-storage" : dbPath;
@@ -79,8 +85,15 @@ async function initReactorStorage(cache, dbPath = "./.ph/drive-storage") {
79
85
  storagePath: filesystemPath,
80
86
  };
81
87
  }
82
- async function initServer(serverPort, options, connectCrypto) {
83
- const { dev, packages = [], remoteDrives = [] } = options;
88
+ async function initServer(serverPort, options, renown) {
89
+ // Register the global MeterProvider before ReactorInstrumentation is
90
+ // constructed. setGlobalMeterProvider is a one-way door — once set it cannot
91
+ // be unset — so this must happen before initializeClient calls
92
+ // instrumentation.start() → createMetrics() → metrics.getMeter().
93
+ if (options.meterProvider) {
94
+ metrics.setGlobalMeterProvider(options.meterProvider);
95
+ }
96
+ const { dev, packages = [], remoteDrives = [], logger = defaultLogger, } = options;
84
97
  const dbPath = options.dbPath ?? process.env.DATABASE_URL;
85
98
  // start redis if configured
86
99
  const redisUrl = process.env.REDIS_TLS_URL ?? process.env.REDIS_URL;
@@ -90,7 +103,7 @@ async function initServer(serverPort, options, connectCrypto) {
90
103
  redis = await initRedis(redisUrl);
91
104
  }
92
105
  catch (e) {
93
- logger.error(e);
106
+ logger.error("@error", e);
94
107
  }
95
108
  }
96
109
  const cache = redis ? new RedisCache(redis) : new InMemoryCache();
@@ -100,11 +113,25 @@ async function initServer(serverPort, options, connectCrypto) {
100
113
  const readModelPath = !dbPath || (isPostgresUrl(dbPath) && dbPath !== storagePath)
101
114
  ? ".ph/read-storage"
102
115
  : dbPath;
116
+ // HTTP registry package loading
117
+ let httpDocumentModels = [];
118
+ const registryUrl = process.env.PH_REGISTRY_URL;
119
+ const registryPackages = process.env.PH_REGISTRY_PACKAGES;
120
+ let httpLoader;
121
+ if (registryUrl) {
122
+ httpLoader = new HttpPackageLoader({ registryUrl });
123
+ }
124
+ if (httpLoader && registryPackages) {
125
+ const packageNames = registryPackages.split(",").map((p) => p.trim());
126
+ httpDocumentModels = await httpLoader.loadPackages(packageNames, logger);
127
+ logger.info(`Loaded ${httpDocumentModels.length} HTTP document models from ${packageNames.length} packages`);
128
+ }
103
129
  const initializeDriveServer = async (documentModels) => {
104
130
  const driveServer = new LegacyReactorBuilder(getUniqueDocumentModels([
105
131
  documentModelDocumentModelModule,
106
132
  driveDocumentModelModule,
107
133
  ...documentModels,
134
+ ...httpDocumentModels,
108
135
  ]))
109
136
  .withStorage(storage)
110
137
  .withCache(cache)
@@ -118,6 +145,7 @@ async function initServer(serverPort, options, connectCrypto) {
118
145
  await driveServer.initialize();
119
146
  return driveServer;
120
147
  };
148
+ const reactorLogger = logger.child(["reactor"]);
121
149
  const initializeClient = async (driveServer, documentModels) => {
122
150
  const eventBus = new EventBus();
123
151
  const builder = new ReactorBuilder()
@@ -126,53 +154,71 @@ async function initServer(serverPort, options, connectCrypto) {
126
154
  documentModelDocumentModelModule,
127
155
  driveDocumentModelModule,
128
156
  ...documentModels,
157
+ ...httpDocumentModels,
129
158
  ]))
130
- .withLegacyStorage(storage)
131
- .withSync(new SyncBuilder().withChannelFactory(new CompositeChannelFactory(new ConsoleLogger(["switchboard"]))))
132
- .withFeatures({
133
- legacyStorageEnabled: !options.reactorOptions?.storageV2,
134
- });
135
- // if (dbPath && isPostgresUrl(dbPath)) {
136
- // const connectionString =
137
- // dbPath.includes("amazonaws") && !dbPath.includes("sslmode=no-verify")
138
- // ? dbPath + "?sslmode=no-verify"
139
- // : dbPath;
140
- // const pool = new Pool({ connectionString });
141
- // const kysely = new Kysely<Database>({
142
- // dialect: new PostgresDialect({ pool }),
143
- // });
144
- // builder.withKysely(kysely);
145
- // } else {
146
- // const pglitePath = "./.ph/reactor-storage";
147
- const pglite = new PGlite();
148
- const kysely = new Kysely({
149
- dialect: new PGliteDialect(pglite),
150
- });
151
- builder.withKysely(kysely);
152
- // }
159
+ .withChannelScheme(ChannelScheme.SWITCHBOARD)
160
+ .withSignalHandlers()
161
+ .withLogger(reactorLogger);
162
+ const maxSkipThreshold = parseInt(process.env.MAX_SKIP_THRESHOLD ?? "", 10);
163
+ if (!isNaN(maxSkipThreshold) && maxSkipThreshold > 0) {
164
+ builder.withExecutorConfig({ maxSkipThreshold });
165
+ logger.info(`Reactor maxSkipThreshold set to ${maxSkipThreshold}`);
166
+ }
167
+ const reactorDbUrl = process.env.PH_REACTOR_DATABASE_URL;
168
+ if (reactorDbUrl && isPostgresUrl(reactorDbUrl)) {
169
+ const connectionString = reactorDbUrl.includes("?")
170
+ ? reactorDbUrl
171
+ : `${reactorDbUrl}?sslmode=disable`;
172
+ const pool = new Pool({ connectionString });
173
+ const kysely = new Kysely({
174
+ dialect: new PostgresDialect({ pool }),
175
+ });
176
+ builder.withKysely(kysely);
177
+ logger.info("Using PostgreSQL for reactor storage");
178
+ }
179
+ else {
180
+ const pglitePath = "./.ph/reactor-storage";
181
+ const pglite = new PGlite(pglitePath);
182
+ const kysely = new Kysely({
183
+ dialect: new PGliteDialect(pglite),
184
+ });
185
+ builder.withKysely(kysely);
186
+ logger.info("Using PGlite for reactor storage");
187
+ }
188
+ if (httpLoader) {
189
+ builder.withDocumentModelLoader(httpLoader);
190
+ }
153
191
  const clientBuilder = new ReactorClientBuilder().withReactorBuilder(builder);
154
- if (connectCrypto) {
155
- clientBuilder.withSigner(new ConnectCryptoSigner(connectCrypto));
192
+ if (renown) {
193
+ clientBuilder.withSigner(renown.signer);
156
194
  }
157
195
  const module = await clientBuilder.buildModule();
158
- const syncManager = module.reactorModule?.syncModule?.syncManager;
159
- if (!syncManager) {
160
- throw new Error("SyncManager not available from ReactorClientBuilder");
196
+ if (module.reactorModule) {
197
+ const instrumentation = new ReactorInstrumentation(module.reactorModule);
198
+ instrumentation.start();
199
+ reactorLogger.info("Reactor metrics instrumentation started");
161
200
  }
162
- return { client: module.client, syncManager };
201
+ return module;
163
202
  };
164
203
  let defaultDriveUrl = undefined;
165
204
  // TODO get path from powerhouse config
166
205
  // start vite server if dev mode is enabled
167
206
  const basePath = process.cwd();
168
- const vite = dev ? await startViteServer(process.cwd()) : undefined;
207
+ const viteLogger = createViteLogger(logger);
208
+ const vite = dev
209
+ ? await startViteServer(process.cwd(), viteLogger)
210
+ : undefined;
169
211
  // get paths to local document models
170
212
  if (!options.disableLocalPackages) {
171
213
  packages.push(basePath);
172
214
  }
173
- // create loader
174
- const packageLoader = vite ? VitePackageLoader.build(vite) : undefined;
175
- // Start the API with the reactor and options
215
+ // storageV2=true means use new reactor (NOT legacy)
216
+ const legacyReactor = !options.reactorOptions?.storageV2;
217
+ // create loader with legacyReactor option
218
+ const packageLoader = vite
219
+ ? VitePackageLoader.build(vite, { legacyReactor })
220
+ : undefined;
221
+ const apiLogger = logger.child(["reactor-api"]);
176
222
  const api = await initializeAndStartAPI(initializeDriveServer, initializeClient, {
177
223
  express: app,
178
224
  port: serverPort,
@@ -184,13 +230,41 @@ async function initServer(serverPort, options, connectCrypto) {
184
230
  configFile: options.configFile ??
185
231
  path.join(process.cwd(), "powerhouse.config.json"),
186
232
  mcp: options.mcp ?? true,
233
+ logger: apiLogger,
187
234
  enableDocumentModelSubgraphs: options.enableDocumentModelSubgraphs,
188
- });
189
- const { client, driveServer } = api;
235
+ legacyReactor,
236
+ }, "switchboard");
237
+ const { client, driveServer, graphqlManager, documentModelRegistry } = api;
238
+ // Wire up dynamic package management if HTTP loader is configured
239
+ if (httpLoader) {
240
+ const packageManagementService = new PackageManagementService({
241
+ defaultRegistryUrl: registryUrl,
242
+ httpLoader,
243
+ documentModelRegistry,
244
+ });
245
+ packageManagementService.setOnModelsChanged(async () => {
246
+ await graphqlManager.regenerateDocumentModelSubgraphs();
247
+ });
248
+ const packagesSubgraph = new PackagesSubgraph({
249
+ relationalDb: undefined,
250
+ analyticsStore: undefined,
251
+ reactorClient: client,
252
+ graphqlManager,
253
+ syncManager: api.syncManager,
254
+ path: graphqlManager.getBasePath(),
255
+ packageManagementService,
256
+ });
257
+ void graphqlManager
258
+ .registerSubgraphInstance(packagesSubgraph, "graphql", false)
259
+ .then(() => graphqlManager.updateRouter())
260
+ .catch((error) => {
261
+ logger.error("Failed to register packages subgraph: @error", error);
262
+ });
263
+ }
190
264
  // Create default drive if provided
191
265
  if (options.drive) {
192
- if (!connectCrypto) {
193
- throw new Error("Cannot create default drive without ConnectCrypto identity");
266
+ if (!renown) {
267
+ throw new Error("Cannot create default drive without Renown identity");
194
268
  }
195
269
  defaultDriveUrl = await addDefaultDrive(driveServer, client, options.drive, serverPort);
196
270
  }
@@ -203,17 +277,31 @@ async function initServer(serverPort, options, connectCrypto) {
203
277
  for (const remoteDriveUrl of remoteDrives) {
204
278
  let driveId;
205
279
  try {
206
- const remoteDrive = await addRemoteDrive(driveServer, remoteDriveUrl);
207
- driveId = remoteDrive.header.id;
208
- logger.debug(`Remote drive ${remoteDriveUrl} synced`);
280
+ if (legacyReactor) {
281
+ // Use legacy reactor's addRemoteDrive
282
+ const remoteDrive = await addRemoteDrive(driveServer, remoteDriveUrl);
283
+ driveId = remoteDrive.header.id;
284
+ }
285
+ else {
286
+ // Use new reactor's sync manager
287
+ const { syncManager } = api;
288
+ const parsed = parseDriveUrl(remoteDriveUrl);
289
+ driveId = parsed.driveId;
290
+ const remoteName = `remote-drive-${driveId}-${crypto.randomUUID()}`;
291
+ await syncManager.add(remoteName, driveCollectionId("main", driveId), {
292
+ type: "gql",
293
+ parameters: { url: parsed.graphqlEndpoint },
294
+ });
295
+ }
296
+ logger.debug("Remote drive @remoteDriveUrl synced", remoteDriveUrl);
209
297
  }
210
298
  catch (error) {
211
299
  if (error instanceof DocumentAlreadyExistsError) {
212
- logger.debug(`Remote drive already added: ${remoteDriveUrl}`);
300
+ logger.debug("Remote drive already added: @remoteDriveUrl", remoteDriveUrl);
213
301
  driveId = remoteDriveUrl.split("/").pop();
214
302
  }
215
303
  else {
216
- logger.error(`Failed to connect to remote drive ${remoteDriveUrl}:`, error);
304
+ logger.error("Failed to connect to remote drive @remoteDriveUrl: @error", remoteDriveUrl, error);
217
305
  }
218
306
  }
219
307
  finally {
@@ -228,56 +316,53 @@ async function initServer(serverPort, options, connectCrypto) {
228
316
  return {
229
317
  defaultDriveUrl,
230
318
  api,
231
- reactor: driveServer,
232
- connectCrypto,
319
+ reactor: client,
320
+ legacyReactor: driveServer,
321
+ renown,
233
322
  };
234
323
  }
235
324
  export const startSwitchboard = async (options = {}) => {
236
325
  const serverPort = options.port ?? DEFAULT_PORT;
237
326
  // Initialize feature flags
238
327
  const featureFlags = await initFeatureFlags();
239
- const enableDocumentModelSubgraphs = await featureFlags.getBooleanValue(DOCUMENT_MODEL_SUBGRAPHS_ENABLED, options.enableDocumentModelSubgraphs ?? DOCUMENT_MODEL_SUBGRAPHS_ENABLED_DEFAULT);
328
+ const enableDocumentModelSubgraphs = await featureFlags.getBooleanValue(DOCUMENT_MODEL_SUBGRAPHS_ENABLED, options.enableDocumentModelSubgraphs ??
329
+ DOCUMENT_MODEL_SUBGRAPHS_ENABLED_DEFAULT);
240
330
  options.enableDocumentModelSubgraphs = enableDocumentModelSubgraphs;
241
331
  const storageV2 = await featureFlags.getBooleanValue(REACTOR_STORAGE_V2, options.reactorOptions?.storageV2 ?? REACTOR_STORAGE_V2_DEFAULT);
242
- const enableDualActionCreate = await featureFlags.getBooleanValue(ENABLE_DUAL_ACTION_CREATE, options.reactorOptions?.enableDualActionCreate ?? ENABLE_DUAL_ACTION_CREATE_DEFAULT);
332
+ const enableDualActionCreate = await featureFlags.getBooleanValue(ENABLE_DUAL_ACTION_CREATE, options.reactorOptions?.enableDualActionCreate ??
333
+ ENABLE_DUAL_ACTION_CREATE_DEFAULT);
243
334
  options.reactorOptions = {
244
335
  enableDualActionCreate,
245
336
  storageV2,
246
337
  };
247
- logger.info("Feature flags:", {
338
+ const logger = options.logger ?? defaultLogger;
339
+ logger.info("Feature flags: @flags", JSON.stringify({
248
340
  DOCUMENT_MODEL_SUBGRAPHS_ENABLED: enableDocumentModelSubgraphs,
249
341
  REACTOR_STORAGE_V2: storageV2,
250
342
  ENABLE_DUAL_ACTION_CREATE: enableDualActionCreate,
251
- });
252
- if (process.env.PYROSCOPE_SERVER_ADDRESS) {
253
- try {
254
- await initProfilerFromEnv(process.env);
255
- }
256
- catch (e) {
257
- Sentry.captureException(e);
258
- logger.error("Error starting profiler", e);
259
- }
260
- }
261
- // Initialize ConnectCrypto if identity options are provided or keypair exists
262
- let connectCrypto = null;
343
+ }, null, 2));
344
+ // Initialize Renown if identity options are provided or keypair exists
345
+ let renown = null;
263
346
  try {
264
- connectCrypto = await initConnectCrypto(options.identity);
347
+ renown = await initRenown(options.identity);
265
348
  }
266
349
  catch (e) {
267
- logger.warn("Failed to initialize ConnectCrypto:", e);
350
+ logger.warn("Failed to initialize ConnectCrypto: @error", e);
268
351
  if (options.identity?.requireExisting) {
269
352
  throw new Error('Identity required but failed to initialize. Run "ph login" first.');
270
353
  }
271
354
  }
272
355
  try {
273
- return await initServer(serverPort, options, connectCrypto);
356
+ return await initServer(serverPort, options, renown);
274
357
  }
275
358
  catch (e) {
276
359
  Sentry.captureException(e);
277
- logger.error("App crashed", e);
360
+ logger.error("App crashed: @error", e);
278
361
  throw e;
279
362
  }
280
363
  };
281
- export { getBearerToken, getConnectCrypto, getConnectDid, } from "./connect-crypto.js";
282
364
  export * from "./types.js";
365
+ if (import.meta.main) {
366
+ await startSwitchboard();
367
+ }
283
368
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,sEAAsE;AACtE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EACL,aAAa,EACb,QAAQ,EACR,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAgB,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,OAAO,EACL,0BAA0B,EAC1B,aAAa,EACb,cAAc,IAAI,oBAAoB,EACtC,WAAW,EACX,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,yBAAyB;AACzB,MAAM,gCAAgC,GAAG,kCAAkC,CAAC;AAC5E,MAAM,wCAAwC,GAAG,IAAI,CAAC;AAEtD,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAChD,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAExC,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAC9D,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAE/C,kDAAkD;AAClD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;IAC3B,aAAa,CAAC,IAAI,CAChB,mCAAmC,EACnC,OAAO,CAAC,GAAG,CAAC,UAAU,CACvB,CAAC;IACF,MAAM,CAAC,IAAI,CAAC;QACV,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC3B,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;KACpC,CAAC,CAAC;IAEH,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAExE,KAAK,UAAU,iBAAiB,CAAC,gBAAwB,EAAE,KAAa;IACtE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,oBAAoB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACxE,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC;QACtC,OAAO,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;QAC5D,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3H,aAAa,CAAC,IAAI,CAAC,2CAA2C,EAAE,OAAO,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAa,EACb,SAAiB,qBAAqB;IAEtC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,gBAAgB,GACpB,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACnE,CAAC,CAAC,MAAM,GAAG,oBAAoB;gBAC/B,CAAC,CAAC,MAAM,CAAC;YAEb,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC3D,CAAC;IAED,oFAAoF;IACpF,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO;QACL,OAAO,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACxE,WAAW,EAAE,cAAc;KAC5B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,UAAkB,EAClB,OAA2B,EAC3B,MAAsB;IAEtB,qEAAqE;IACrE,6EAA6E;IAC7E,+DAA+D;IAC/D,kEAAkE;IAClE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,OAAO,CAAC,sBAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,EACJ,GAAG,EACH,QAAQ,GAAG,EAAE,EACb,YAAY,GAAG,EAAE,EACjB,MAAM,GAAG,aAAa,GACvB,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAE1D,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACpE,IAAI,KAAkC,CAAC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;IAClE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzE,mFAAmF;IACnF,0CAA0C;IAC1C,MAAM,aAAa,GACjB,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,WAAW,CAAC;QAC1D,CAAC,CAAC,kBAAkB;QACpB,CAAC,CAAC,MAAM,CAAC;IAEb,gCAAgC;IAChC,IAAI,kBAAkB,GAA0B,EAAE,CAAC;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAChD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC1D,IAAI,UAAyC,CAAC;IAE9C,IAAI,WAAW,EAAE,CAAC;QAChB,UAAU,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,UAAU,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,kBAAkB,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CACT,UAAU,kBAAkB,CAAC,MAAM,8BAA8B,YAAY,CAAC,MAAM,WAAW,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,qBAAqB,GAAG,KAAK,EACjC,cAAqC,EACrC,EAAE;QACF,MAAM,WAAW,GAAG,IAAI,oBAAoB,CAC1C,uBAAuB,CAAC;YACtB,gCAAgC;YAChC,wBAAwB;YACxB,GAAG,cAAc;YACjB,GAAG,kBAAkB;SACtB,CAAC,CACH;aACE,WAAW,CAAC,OAAO,CAAC;aACpB,SAAS,CAAC,KAAK,CAAC;aAChB,WAAW,CAAC;YACX,YAAY,EAAE;gBACZ,sBAAsB,EACpB,OAAO,CAAC,cAAc,EAAE,sBAAsB,IAAI,KAAK;aAC1D;SACF,CAAC;aACD,KAAK,EAAE,CAAC;QAEX,oBAAoB;QACpB,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAChD,MAAM,gBAAgB,GAAG,KAAK,EAC5B,WAAiC,EACjC,cAAqC,EACrC,EAAE;QACF,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE;aACjC,YAAY,CAAC,QAAQ,CAAC;aACtB,kBAAkB,CACjB,uBAAuB,CAAC;YACtB,gCAAgC;YAChC,wBAAwB;YACxB,GAAG,cAAc;YACjB,GAAG,kBAAkB;SACtB,CAAC,CACH;aACA,iBAAiB,CAAC,aAAa,CAAC,WAAW,CAAC;aAC5C,kBAAkB,EAAE;aACpB,UAAU,CAAC,aAAa,CAAC,CAAC;QAE7B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,mCAAmC,gBAAgB,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACzD,IAAI,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;YAChD,MAAM,gBAAgB,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACjD,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,GAAG,YAAY,kBAAkB,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAW;gBAClC,OAAO,EAAE,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;aACvC,CAAC,CAAC;YACH,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,uBAAuB,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAW;gBAClC,OAAO,EAAE,IAAI,aAAa,CAAC,MAAM,CAAC;aACnC,CAAC,CAAC;YACH,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,oBAAoB,EAAE,CAAC,kBAAkB,CACjE,OAAO,CACR,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;QAEjD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,MAAM,eAAe,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACzE,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,eAAe,GAAuB,SAAS,CAAC;IAEpD,uCAAuC;IACvC,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,GAAG;QACd,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IAEd,qCAAqC;IACrC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,oDAAoD;IACpD,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,aAAa,GAAG,IAAI;QACxB,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,qBAAqB,CACrC,qBAAqB,EACrB,gBAAgB,EAChB;QACE,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa;QACb,QAAQ,EAAE,QAAQ;QAClB,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,UAAU,EACR,OAAO,CAAC,UAAU;YAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC;QACpD,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI;QACxB,MAAM,EAAE,SAAS;QACjB,4BAA4B,EAAE,OAAO,CAAC,4BAA4B;QAClE,aAAa;KACd,EACD,aAAa,CACd,CAAC;IAEF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,qBAAqB,EAAE,GAAG,GAAG,CAAC;IAE3E,kEAAkE;IAClE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,wBAAwB,GAAG,IAAI,wBAAwB,CAAC;YAC5D,kBAAkB,EAAE,WAAW;YAC/B,UAAU;YACV,qBAAqB;SACtB,CAAC,CAAC;QAEH,wBAAwB,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACrD,MAAM,cAAc,CAAC,gCAAgC,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;YAC5C,YAAY,EAAE,SAAkB;YAChC,cAAc,EAAE,SAAkB;YAClC,aAAa,EAAE,MAAM;YACrB,cAAc;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,IAAI,EAAE,cAAc,CAAC,WAAW,EAAE;YAClC,wBAAwB;SACzB,CAAC,CAAC;QAEH,KAAK,cAAc;aAChB,wBAAwB,CAAC,gBAAgB,EAAE,SAAS,EAAE,KAAK,CAAC;aAC5D,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;aACzC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,eAAe,GAAG,MAAM,eAAe,CACrC,WAAW,EACX,MAAM,EACN,OAAO,CAAC,KAAK,EACb,UAAU,CACX,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,qDAAqD;IACrD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,cAAc,IAAI,YAAY,EAAE,CAAC;YAC1C,IAAI,OAA2B,CAAC;YAEhC,IAAI,CAAC;gBACH,IAAI,aAAa,EAAE,CAAC;oBAClB,sCAAsC;oBACtC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;oBACtE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,iCAAiC;oBACjC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;oBAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;oBAC7C,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;oBACzB,MAAM,UAAU,GAAG,gBAAgB,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;oBACpE,MAAM,WAAW,CAAC,GAAG,CACnB,UAAU,EACV,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC;wBACE,IAAI,EAAE,KAAK;wBACX,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,eAAe,EAAE;qBAC5C,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,cAAc,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,0BAA0B,EAAE,CAAC;oBAChD,MAAM,CAAC,KAAK,CACV,6CAA6C,EAC7C,cAAc,CACf,CAAC;oBACF,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CACV,2DAA2D,EAC3D,cAAc,EACd,KAAK,CACN,CAAC;gBACJ,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,4CAA4C;gBAC5C,IAAI,CAAC,eAAe,IAAI,OAAO,EAAE,CAAC;oBAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClD,eAAe,GAAG,GAAG,QAAQ,gBAAgB,UAAU,MAAM,OAAO,EAAE,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,eAAe;QACf,GAAG;QACH,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,WAAW;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,UAA8B,EAAE,EACH,EAAE;IAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAEhD,2BAA2B;IAC3B,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAE9C,MAAM,4BAA4B,GAAG,MAAM,YAAY,CAAC,eAAe,CACrE,gCAAgC,EAChC,OAAO,CAAC,4BAA4B;QAClC,wCAAwC,CAC3C,CAAC;IAEF,OAAO,CAAC,4BAA4B,GAAG,4BAA4B,CAAC;IAEpE,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,eAAe,CAClD,kBAAkB,EAClB,OAAO,CAAC,cAAc,EAAE,SAAS,IAAI,0BAA0B,CAChE,CAAC;IAEF,MAAM,sBAAsB,GAAG,MAAM,YAAY,CAAC,eAAe,CAC/D,yBAAyB,EACzB,OAAO,CAAC,cAAc,EAAE,sBAAsB;QAC5C,iCAAiC,CACpC,CAAC;IAEF,OAAO,CAAC,cAAc,GAAG;QACvB,sBAAsB;QACtB,SAAS;KACV,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAE/C,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,IAAI,CAAC,SAAS,CACZ;QACE,gCAAgC,EAAE,4BAA4B;QAC9D,kBAAkB,EAAE,SAAS;QAC7B,yBAAyB,EAAE,sBAAsB;KAClD,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IAEF,uEAAuE;IACvE,IAAI,MAAM,GAAmB,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC,CAAC;AAEF,cAAc,YAAY,CAAC;AAE3B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,MAAM,gBAAgB,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,5 +1,7 @@
1
- import type { IConnectCrypto } from "@renown/sdk";
2
- import type { DriveInput, IDocumentDriveServer } from "document-drive";
1
+ import type { IReactorClient } from "@powerhousedao/reactor";
2
+ import type { IRenown } from "@renown/sdk";
3
+ import type { DriveInput, IDocumentDriveServer, ILogger } from "document-drive";
4
+ import type { MeterProvider } from "@opentelemetry/api";
3
5
  export type StorageOptions = {
4
6
  type: "filesystem" | "memory" | "postgres" | "browser";
5
7
  filesystemPath?: string;
@@ -13,6 +15,8 @@ export type IdentityOptions = {
13
15
  * Use this to ensure the switchboard only runs with an authenticated identity.
14
16
  */
15
17
  requireExisting?: boolean;
18
+ /** Base url of the Renown instance to use */
19
+ baseUrl?: string;
16
20
  };
17
21
  export type StartServerOptions = {
18
22
  configFile?: string;
@@ -33,7 +37,7 @@ export type StartServerOptions = {
33
37
  admins: string[];
34
38
  };
35
39
  /**
36
- * Identity options for ConnectCrypto.
40
+ * Identity options for Renown.
37
41
  * When configured, the switchboard will load the keypair from `ph login`
38
42
  * and can authenticate with remote services on behalf of the user.
39
43
  */
@@ -54,11 +58,20 @@ export type StartServerOptions = {
54
58
  storageV2?: boolean;
55
59
  };
56
60
  enableDocumentModelSubgraphs?: boolean;
61
+ logger?: ILogger;
62
+ /**
63
+ * OpenTelemetry MeterProvider to register as the global provider before
64
+ * ReactorInstrumentation starts. Must be provided here rather than set
65
+ * externally to guarantee the registration happens before
66
+ * instrumentation.start() reads the global provider via metrics.getMeter().
67
+ */
68
+ meterProvider?: MeterProvider;
57
69
  };
58
70
  export type SwitchboardReactor = {
59
71
  defaultDriveUrl: string | undefined;
60
- reactor: IDocumentDriveServer;
61
- /** The ConnectCrypto instance if identity was initialized */
62
- connectCrypto: IConnectCrypto | null;
72
+ reactor: IReactorClient;
73
+ legacyReactor: IDocumentDriveServer;
74
+ /** The Renown instance if identity was initialized */
75
+ renown: IRenown | null;
63
76
  };
64
77
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EACF;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACD,OAAO,GACP,SAAS,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE;QACf;;;WAGG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QAEjC;;;WAGG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,6DAA6D;IAC7D,aAAa,EAAE,cAAc,GAAG,IAAI,CAAC;CACtC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EACF;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,GACD,OAAO,GACP,SAAS,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE;QACf;;;WAGG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QAEjC;;;WAGG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,oBAAoB,CAAC;IACpC,sDAAsD;IACtD,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=metrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.test.d.ts","sourceRoot":"","sources":["../../test/metrics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,121 @@
1
+ import { MeterProvider } from "@opentelemetry/sdk-metrics";
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ import { createMeterProviderFromEnv } from "../src/metrics.js";
4
+ // Stub childLogger so tests don't require the full document-drive runtime
5
+ vi.mock("document-drive", () => ({
6
+ childLogger: () => ({
7
+ info: vi.fn(),
8
+ warn: vi.fn(),
9
+ error: vi.fn(),
10
+ }),
11
+ }));
12
+ const providers = [];
13
+ afterEach(async () => {
14
+ vi.restoreAllMocks();
15
+ // Await shutdown so PeriodicExportingMetricReader timers are cleared
16
+ await Promise.all(providers.map((p) => p.shutdown()));
17
+ providers.length = 0;
18
+ });
19
+ function track(provider) {
20
+ if (provider)
21
+ providers.push(provider);
22
+ return provider;
23
+ }
24
+ function trackAsserted(provider) {
25
+ expect(provider).toBeInstanceOf(MeterProvider);
26
+ return track(provider);
27
+ }
28
+ // These helpers access undocumented internal fields of MeterProvider and
29
+ // PeriodicExportingMetricReader. They may break if @opentelemetry/sdk-metrics
30
+ // renames its private state between major versions.
31
+ function getReader(provider) {
32
+ return provider._sharedState.metricCollectors[0]._metricReader;
33
+ }
34
+ function getExporterUrl(provider) {
35
+ return provider._sharedState.metricCollectors[0]._metricReader._exporter._delegate
36
+ ._transport._transport._parameters.url;
37
+ }
38
+ function getResourceAttributes(provider) {
39
+ return provider._sharedState.resource.attributes;
40
+ }
41
+ describe("createMeterProviderFromEnv", () => {
42
+ describe("when OTEL_EXPORTER_OTLP_ENDPOINT is not set", () => {
43
+ it("returns undefined", () => {
44
+ expect(createMeterProviderFromEnv({})).toBeUndefined();
45
+ });
46
+ });
47
+ describe("when OTEL_EXPORTER_OTLP_ENDPOINT is set", () => {
48
+ it("returns a MeterProvider", () => {
49
+ expect(track(createMeterProviderFromEnv({
50
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
51
+ }))).toBeInstanceOf(MeterProvider);
52
+ });
53
+ it("strips trailing slash from endpoint URL without throwing", () => {
54
+ expect(() => track(createMeterProviderFromEnv({
55
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318/",
56
+ }))).not.toThrow();
57
+ });
58
+ it("does not double-append /v1/metrics when endpoint already includes it", () => {
59
+ const provider = trackAsserted(createMeterProviderFromEnv({
60
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318/v1/metrics",
61
+ }));
62
+ expect(getExporterUrl(provider)).toBe("http://localhost:4318/v1/metrics");
63
+ });
64
+ it("uses 5000ms export interval by default", () => {
65
+ const provider = trackAsserted(createMeterProviderFromEnv({
66
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
67
+ }));
68
+ expect(getReader(provider)._exportInterval).toBe(5000);
69
+ });
70
+ it("honours OTEL_METRIC_EXPORT_INTERVAL", () => {
71
+ const provider = trackAsserted(createMeterProviderFromEnv({
72
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
73
+ OTEL_METRIC_EXPORT_INTERVAL: "2000",
74
+ }));
75
+ expect(getReader(provider)._exportInterval).toBe(2000);
76
+ });
77
+ it("falls back to 5000ms when OTEL_METRIC_EXPORT_INTERVAL is non-numeric", () => {
78
+ const provider = trackAsserted(createMeterProviderFromEnv({
79
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
80
+ OTEL_METRIC_EXPORT_INTERVAL: "abc",
81
+ }));
82
+ expect(getReader(provider)._exportInterval).toBe(5000);
83
+ });
84
+ it("falls back to 5000ms when OTEL_METRIC_EXPORT_INTERVAL is zero", () => {
85
+ const provider = trackAsserted(createMeterProviderFromEnv({
86
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
87
+ OTEL_METRIC_EXPORT_INTERVAL: "0",
88
+ }));
89
+ expect(getReader(provider)._exportInterval).toBe(5000);
90
+ });
91
+ it("falls back to 5000ms when OTEL_METRIC_EXPORT_INTERVAL is negative", () => {
92
+ const provider = trackAsserted(createMeterProviderFromEnv({
93
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
94
+ OTEL_METRIC_EXPORT_INTERVAL: "-1000",
95
+ }));
96
+ expect(getReader(provider)._exportInterval).toBe(5000);
97
+ });
98
+ it("sets exportTimeoutMillis below exportIntervalMillis", () => {
99
+ const provider = trackAsserted(createMeterProviderFromEnv({
100
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
101
+ OTEL_METRIC_EXPORT_INTERVAL: "1000",
102
+ }));
103
+ const reader = getReader(provider);
104
+ expect(reader._exportTimeout).toBeLessThan(reader._exportInterval);
105
+ });
106
+ it("uses 'switchboard' as service name by default", () => {
107
+ const provider = trackAsserted(createMeterProviderFromEnv({
108
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
109
+ }));
110
+ expect(getResourceAttributes(provider)["service.name"]).toBe("switchboard");
111
+ });
112
+ it("honours OTEL_SERVICE_NAME", () => {
113
+ const provider = trackAsserted(createMeterProviderFromEnv({
114
+ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318",
115
+ OTEL_SERVICE_NAME: "my-switchboard",
116
+ }));
117
+ expect(getResourceAttributes(provider)["service.name"]).toBe("my-switchboard");
118
+ });
119
+ });
120
+ });
121
+ //# sourceMappingURL=metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.test.js","sourceRoot":"","sources":["../../test/metrics.test.ts"],"names":[],"mappings":"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"}