@open-mercato/core 0.6.6-develop.6383.1.27fcc83455 → 0.6.6-develop.6385.1.9a81faa5f0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/dist/bootstrap.js +6 -1
- package/dist/bootstrap.js.map +2 -2
- package/dist/modules/configs/api/module-telemetry/route.js +75 -0
- package/dist/modules/configs/api/module-telemetry/route.js.map +7 -0
- package/dist/modules/configs/api/openapi.js +110 -0
- package/dist/modules/configs/api/openapi.js.map +2 -2
- package/dist/modules/configs/backend/config/cache/page.meta.js +1 -1
- package/dist/modules/configs/backend/config/cache/page.meta.js.map +1 -1
- package/dist/modules/configs/backend/config/module-telemetry/page.js +10 -0
- package/dist/modules/configs/backend/config/module-telemetry/page.js.map +7 -0
- package/dist/modules/configs/backend/config/module-telemetry/page.meta.js +36 -0
- package/dist/modules/configs/backend/config/module-telemetry/page.meta.js.map +7 -0
- package/dist/modules/configs/components/ModuleTelemetryPanel.js +801 -0
- package/dist/modules/configs/components/ModuleTelemetryPanel.js.map +7 -0
- package/dist/modules/query_index/di.js +3 -3
- package/dist/modules/query_index/di.js.map +2 -2
- package/package.json +7 -7
- package/src/bootstrap.ts +7 -1
- package/src/modules/configs/api/module-telemetry/route.ts +77 -0
- package/src/modules/configs/api/openapi.ts +117 -0
- package/src/modules/configs/backend/config/cache/page.meta.ts +1 -1
- package/src/modules/configs/backend/config/module-telemetry/page.meta.ts +34 -0
- package/src/modules/configs/backend/config/module-telemetry/page.tsx +12 -0
- package/src/modules/configs/components/ModuleTelemetryPanel.tsx +1109 -0
- package/src/modules/configs/i18n/de.json +72 -0
- package/src/modules/configs/i18n/en.json +72 -0
- package/src/modules/configs/i18n/es.json +72 -0
- package/src/modules/configs/i18n/pl.json +72 -0
- package/src/modules/query_index/di.ts +3 -3
package/.turbo/turbo-build.log
CHANGED
package/dist/bootstrap.js
CHANGED
|
@@ -119,7 +119,12 @@ async function bootstrap(container) {
|
|
|
119
119
|
loadedModules = getModules();
|
|
120
120
|
} catch {
|
|
121
121
|
}
|
|
122
|
-
const subs = loadedModules.flatMap(
|
|
122
|
+
const subs = loadedModules.flatMap(
|
|
123
|
+
(m) => (m.subscribers || []).map((subscriber) => ({
|
|
124
|
+
...subscriber,
|
|
125
|
+
moduleId: subscriber.moduleId ?? m.id
|
|
126
|
+
}))
|
|
127
|
+
);
|
|
123
128
|
if (subs.length) container.resolve("eventBus").registerModuleSubscribers(subs);
|
|
124
129
|
const syncSubs = subs.filter((s) => s.sync === true);
|
|
125
130
|
if (syncSubs.length) {
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/bootstrap.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AwilixContainer } from 'awilix'\nimport { asValue } from 'awilix'\nimport { createEventBus } from '@open-mercato/events/index'\nimport { setGlobalEventBus } from '@open-mercato/shared/modules/events'\nimport { createCacheService } from '@open-mercato/cache'\nimport type { CacheStrategy } from '@open-mercato/cache'\nimport { createKmsService } from '@open-mercato/shared/lib/encryption/kms'\nimport { TenantDataEncryptionService } from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'\nimport { registerTenantEncryptionSubscriber } from '@open-mercato/shared/lib/encryption/subscriber'\nimport { isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'\nimport { getSearchModuleConfigs } from '@open-mercato/shared/modules/search'\nimport {\n registerSearchModule,\n createSearchDeleteSubscriber,\n searchDeleteMetadata,\n} from '@open-mercato/search'\nimport { RateLimiterService } from '@open-mercato/shared/lib/ratelimit/service'\nimport { readRateLimitConfig } from '@open-mercato/shared/lib/ratelimit/config'\nimport type { EntityManager } from '@mikro-orm/postgresql'\n\n// Use globalThis to survive tsx/webpack module duplication (same pattern as container.ts DI registrars)\nconst RL_GLOBAL_KEY = '__openMercatoRateLimiterService__'\nconst RL_SHUTDOWN_KEY = '__openMercatoRateLimiterShutdown__'\n\nconst CACHE_GLOBAL_KEY = '__openMercatoCacheService__'\nconst CACHE_SHUTDOWN_KEY = '__openMercatoCacheShutdown__'\n\n// Escape hatch: set OM_CACHE_SINGLETON=off to fall back to the legacy\n// per-request cache instance (e.g. to isolate a regression). Default ON.\nfunction isCacheSingletonEnabled(): boolean {\n const raw = process.env.OM_CACHE_SINGLETON\n if (raw === undefined) return true\n const normalized = raw.trim().toLowerCase()\n if (!normalized.length) return true\n return !(normalized === '0' || normalized === 'off' || normalized === 'false' || normalized === 'no')\n}\n\n/**\n * Process-wide cache service singleton, mirroring getCachedRateLimiterService.\n *\n * bootstrap() previously built a fresh cache per request container, so under\n * the default memory strategy every cross-request cache was a no-op (each\n * instance is process-local) and under sqlite each request leaked a native\n * handle. Reusing one instance is safe by construction: tenant scope resolves\n * per-call via AsyncLocalStorage (packages/cache/src/tenantContext.ts), so the\n * service holds no request-bound state.\n *\n * Returns null when disabled via the escape hatch or when creation fails, so\n * the caller falls back to a per-request instance.\n */\nexport function getCachedCacheService(): CacheStrategy | null {\n if (!isCacheSingletonEnabled()) return null\n let service = (globalThis as any)[CACHE_GLOBAL_KEY] as CacheStrategy | null ?? null\n if (!service) {\n try {\n try {\n service = createCacheService()\n } catch (err) {\n console.warn('Cache service initialization failed; falling back to memory strategy:', (err as Error)?.message || err)\n service = createCacheService({ strategy: 'memory' })\n }\n ;(globalThis as any)[CACHE_GLOBAL_KEY] = service\n\n // Register shutdown hook once to close persistent handles (sqlite/redis) on process exit\n if (!(globalThis as any)[CACHE_SHUTDOWN_KEY]) {\n const shutdown = () => { service?.close?.().catch(() => {}) }\n process.once('SIGTERM', shutdown)\n process.once('SIGINT', shutdown)\n ;(globalThis as any)[CACHE_SHUTDOWN_KEY] = true\n }\n } catch (err) {\n console.warn('[cache] Failed to create cache service:', (err as Error)?.message || err)\n }\n }\n return service\n}\n\nexport function getCachedRateLimiterService(): RateLimiterService | null {\n let service = (globalThis as any)[RL_GLOBAL_KEY] as RateLimiterService | null ?? null\n if (!service) {\n try {\n const rateLimitConfig = readRateLimitConfig()\n service = new RateLimiterService(rateLimitConfig)\n // Fire-and-forget async init (only needed for Redis strategy;\n // memory strategy works synchronously, and Redis has an in-memory\n // insurance limiter so the first few requests are still protected)\n service.initialize().catch((err) => {\n console.warn('[ratelimit] Async initialization failed:', (err as Error)?.message || err)\n })\n ;(globalThis as any)[RL_GLOBAL_KEY] = service\n\n // Register shutdown hook once to disconnect Redis on process exit\n if (!(globalThis as any)[RL_SHUTDOWN_KEY]) {\n const shutdown = () => { service?.destroy().catch(() => {}) }\n process.once('SIGTERM', shutdown)\n process.once('SIGINT', shutdown)\n ;(globalThis as any)[RL_SHUTDOWN_KEY] = true\n }\n } catch (err) {\n console.warn('[ratelimit] Failed to create rate limiter service:', (err as Error)?.message || err)\n }\n }\n return service\n}\n\nexport async function bootstrap(container: AwilixContainer) {\n // Register the cache service. Prefer the process-wide singleton so caches\n // survive across request containers; fall back to a per-request instance\n // when the singleton is disabled or fails to build.\n let cache: any = getCachedCacheService()\n if (!cache) {\n try {\n cache = createCacheService()\n } catch (err: any) {\n console.warn('Cache service initialization failed; falling back to memory strategy:', err?.message || err)\n cache = createCacheService({ strategy: 'memory' })\n }\n }\n container.register({ cache: asValue(cache) })\n\n // Create and register the DI-aware event bus\n let eventBus: any\n try {\n // Support both QUEUE_STRATEGY and legacy EVENTS_STRATEGY env vars\n const strategyEnv = process.env.QUEUE_STRATEGY || process.env.EVENTS_STRATEGY\n const queueStrategy = strategyEnv === 'async' || strategyEnv === 'redis' ? 'async' : 'local'\n eventBus = createEventBus({ resolve: container.resolve.bind(container) as any, queueStrategy })\n } catch (err: any) {\n // Fall back to local strategy to avoid breaking the app on misconfiguration\n console.warn('Event bus initialization failed; falling back to local strategy:', err?.message || err)\n try {\n eventBus = createEventBus({ resolve: container.resolve.bind(container) as any, queueStrategy: 'local' })\n } catch {\n // In extreme cases, provide a no-op bus to avoid crashes\n eventBus = {\n emit: async () => {},\n on: () => {},\n registerModuleSubscribers: () => {},\n clearQueue: async () => ({ removed: 0 }),\n }\n }\n }\n container.register({ eventBus: asValue(eventBus) })\n // Wire the global event bus so createModuleEvents().emit works outside DI context\n setGlobalEventBus(eventBus)\n // Auto-register discovered module subscribers\n try {\n let loadedModules: any[] = []\n try {\n const { getModules } = await import('@open-mercato/shared/lib/i18n/server')\n loadedModules = getModules()\n } catch {}\n const subs = loadedModules.flatMap((m) => m.subscribers || [])\n if (subs.length) (container.resolve as any)('eventBus').registerModuleSubscribers(subs)\n\n // Extract sync subscribers and register in the sync-subscriber-store\n const syncSubs = subs.filter((s: any) => s.sync === true)\n if (syncSubs.length) {\n try {\n const { registerSyncSubscribers } = await import('@open-mercato/shared/lib/crud/sync-subscriber-store')\n registerSyncSubscribers(\n syncSubs.map((s: any) => ({\n metadata: { event: s.event, sync: true as const, priority: s.priority, id: s.id },\n handler: s.handler,\n })),\n )\n } catch {\n // sync-subscriber-store may not be available\n }\n }\n } catch (err) {\n console.error(\"Failed to register module subscribers:\", err);\n }\n\n // KMS + tenant encryption\n const kmsService = createKmsService()\n container.register({ kmsService: asValue(kmsService) })\n try {\n const em = container.resolve('em') as EntityManager\n const cacheService = (() => {\n try { return container.resolve('cache') as any } catch { return null }\n })()\n const tenantEncryptionService = new TenantDataEncryptionService(em, { cache: cacheService, kms: kmsService })\n container.register({ tenantEncryptionService: asValue(tenantEncryptionService) })\n if (isTenantDataEncryptionEnabled() && kmsService.isHealthy()) {\n try {\n registerTenantEncryptionSubscriber(em, tenantEncryptionService)\n } catch (err) {\n console.warn('[encryption] Failed to register MikroORM encryption subscriber:', (err as Error)?.message || err)\n }\n } else if (isTenantDataEncryptionEnabled() && !kmsService.isHealthy()) {\n console.warn('[encryption] Vault/KMS unhealthy - tenant data encryption is disabled until recovery')\n }\n } catch (err) {\n console.warn('[encryption] Failed to initialize tenant encryption service:', (err as Error)?.message || err)\n }\n\n // Register rate limiter service (singleton via globalThis \u2014 reused across request containers)\n // getCachedRateLimiterService() never throws; returns null on failure\n const rateLimiterService = getCachedRateLimiterService()\n if (rateLimiterService) {\n container.register({ rateLimiterService: asValue(rateLimiterService) })\n }\n\n // Register search module\n try {\n // Get configs from global registry (registered during app bootstrap)\n const searchModuleConfigs = getSearchModuleConfigs()\n registerSearchModule(container as any, { moduleConfigs: searchModuleConfigs })\n\n // Register searchModuleConfigs in container so status API can access vector-enabled entities\n container.register({\n searchModuleConfigs: asValue(searchModuleConfigs),\n })\n\n // Register search delete event subscriber\n // Note: search.index_record is now handled by auto-discovered fulltext_upsert.ts subscriber\n try {\n const searchIndexer = container.resolve('searchIndexer') as any\n if (searchIndexer && eventBus) {\n eventBus.registerModuleSubscribers([\n {\n event: searchDeleteMetadata.event,\n persistent: searchDeleteMetadata.persistent,\n handler: createSearchDeleteSubscriber(searchIndexer),\n },\n ])\n }\n } catch {\n // searchIndexer may not be available\n }\n } catch (err) {\n console.warn('[search] Failed to register search module:', (err as Error)?.message || err)\n }\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,eAAe;
|
|
4
|
+
"sourcesContent": ["import type { AwilixContainer } from 'awilix'\nimport { asValue } from 'awilix'\nimport type { ModuleSubscriber } from '@open-mercato/shared/modules/registry'\nimport { createEventBus } from '@open-mercato/events/index'\nimport { setGlobalEventBus } from '@open-mercato/shared/modules/events'\nimport { createCacheService } from '@open-mercato/cache'\nimport type { CacheStrategy } from '@open-mercato/cache'\nimport { createKmsService } from '@open-mercato/shared/lib/encryption/kms'\nimport { TenantDataEncryptionService } from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'\nimport { registerTenantEncryptionSubscriber } from '@open-mercato/shared/lib/encryption/subscriber'\nimport { isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'\nimport { getSearchModuleConfigs } from '@open-mercato/shared/modules/search'\nimport {\n registerSearchModule,\n createSearchDeleteSubscriber,\n searchDeleteMetadata,\n} from '@open-mercato/search'\nimport { RateLimiterService } from '@open-mercato/shared/lib/ratelimit/service'\nimport { readRateLimitConfig } from '@open-mercato/shared/lib/ratelimit/config'\nimport type { EntityManager } from '@mikro-orm/postgresql'\n\n// Use globalThis to survive tsx/webpack module duplication (same pattern as container.ts DI registrars)\nconst RL_GLOBAL_KEY = '__openMercatoRateLimiterService__'\nconst RL_SHUTDOWN_KEY = '__openMercatoRateLimiterShutdown__'\n\nconst CACHE_GLOBAL_KEY = '__openMercatoCacheService__'\nconst CACHE_SHUTDOWN_KEY = '__openMercatoCacheShutdown__'\n\n// Escape hatch: set OM_CACHE_SINGLETON=off to fall back to the legacy\n// per-request cache instance (e.g. to isolate a regression). Default ON.\nfunction isCacheSingletonEnabled(): boolean {\n const raw = process.env.OM_CACHE_SINGLETON\n if (raw === undefined) return true\n const normalized = raw.trim().toLowerCase()\n if (!normalized.length) return true\n return !(normalized === '0' || normalized === 'off' || normalized === 'false' || normalized === 'no')\n}\n\n/**\n * Process-wide cache service singleton, mirroring getCachedRateLimiterService.\n *\n * bootstrap() previously built a fresh cache per request container, so under\n * the default memory strategy every cross-request cache was a no-op (each\n * instance is process-local) and under sqlite each request leaked a native\n * handle. Reusing one instance is safe by construction: tenant scope resolves\n * per-call via AsyncLocalStorage (packages/cache/src/tenantContext.ts), so the\n * service holds no request-bound state.\n *\n * Returns null when disabled via the escape hatch or when creation fails, so\n * the caller falls back to a per-request instance.\n */\nexport function getCachedCacheService(): CacheStrategy | null {\n if (!isCacheSingletonEnabled()) return null\n let service = (globalThis as any)[CACHE_GLOBAL_KEY] as CacheStrategy | null ?? null\n if (!service) {\n try {\n try {\n service = createCacheService()\n } catch (err) {\n console.warn('Cache service initialization failed; falling back to memory strategy:', (err as Error)?.message || err)\n service = createCacheService({ strategy: 'memory' })\n }\n ;(globalThis as any)[CACHE_GLOBAL_KEY] = service\n\n // Register shutdown hook once to close persistent handles (sqlite/redis) on process exit\n if (!(globalThis as any)[CACHE_SHUTDOWN_KEY]) {\n const shutdown = () => { service?.close?.().catch(() => {}) }\n process.once('SIGTERM', shutdown)\n process.once('SIGINT', shutdown)\n ;(globalThis as any)[CACHE_SHUTDOWN_KEY] = true\n }\n } catch (err) {\n console.warn('[cache] Failed to create cache service:', (err as Error)?.message || err)\n }\n }\n return service\n}\n\nexport function getCachedRateLimiterService(): RateLimiterService | null {\n let service = (globalThis as any)[RL_GLOBAL_KEY] as RateLimiterService | null ?? null\n if (!service) {\n try {\n const rateLimitConfig = readRateLimitConfig()\n service = new RateLimiterService(rateLimitConfig)\n // Fire-and-forget async init (only needed for Redis strategy;\n // memory strategy works synchronously, and Redis has an in-memory\n // insurance limiter so the first few requests are still protected)\n service.initialize().catch((err) => {\n console.warn('[ratelimit] Async initialization failed:', (err as Error)?.message || err)\n })\n ;(globalThis as any)[RL_GLOBAL_KEY] = service\n\n // Register shutdown hook once to disconnect Redis on process exit\n if (!(globalThis as any)[RL_SHUTDOWN_KEY]) {\n const shutdown = () => { service?.destroy().catch(() => {}) }\n process.once('SIGTERM', shutdown)\n process.once('SIGINT', shutdown)\n ;(globalThis as any)[RL_SHUTDOWN_KEY] = true\n }\n } catch (err) {\n console.warn('[ratelimit] Failed to create rate limiter service:', (err as Error)?.message || err)\n }\n }\n return service\n}\n\nexport async function bootstrap(container: AwilixContainer) {\n // Register the cache service. Prefer the process-wide singleton so caches\n // survive across request containers; fall back to a per-request instance\n // when the singleton is disabled or fails to build.\n let cache: any = getCachedCacheService()\n if (!cache) {\n try {\n cache = createCacheService()\n } catch (err: any) {\n console.warn('Cache service initialization failed; falling back to memory strategy:', err?.message || err)\n cache = createCacheService({ strategy: 'memory' })\n }\n }\n container.register({ cache: asValue(cache) })\n\n // Create and register the DI-aware event bus\n let eventBus: any\n try {\n // Support both QUEUE_STRATEGY and legacy EVENTS_STRATEGY env vars\n const strategyEnv = process.env.QUEUE_STRATEGY || process.env.EVENTS_STRATEGY\n const queueStrategy = strategyEnv === 'async' || strategyEnv === 'redis' ? 'async' : 'local'\n eventBus = createEventBus({ resolve: container.resolve.bind(container) as any, queueStrategy })\n } catch (err: any) {\n // Fall back to local strategy to avoid breaking the app on misconfiguration\n console.warn('Event bus initialization failed; falling back to local strategy:', err?.message || err)\n try {\n eventBus = createEventBus({ resolve: container.resolve.bind(container) as any, queueStrategy: 'local' })\n } catch {\n // In extreme cases, provide a no-op bus to avoid crashes\n eventBus = {\n emit: async () => {},\n on: () => {},\n registerModuleSubscribers: () => {},\n clearQueue: async () => ({ removed: 0 }),\n }\n }\n }\n container.register({ eventBus: asValue(eventBus) })\n // Wire the global event bus so createModuleEvents().emit works outside DI context\n setGlobalEventBus(eventBus)\n // Auto-register discovered module subscribers\n try {\n let loadedModules: any[] = []\n try {\n const { getModules } = await import('@open-mercato/shared/lib/i18n/server')\n loadedModules = getModules()\n } catch {}\n const subs = loadedModules.flatMap((m) =>\n (m.subscribers || []).map((subscriber: ModuleSubscriber) => ({\n ...subscriber,\n moduleId: subscriber.moduleId ?? m.id,\n })),\n )\n if (subs.length) (container.resolve as any)('eventBus').registerModuleSubscribers(subs)\n\n // Extract sync subscribers and register in the sync-subscriber-store\n const syncSubs = subs.filter((s: any) => s.sync === true)\n if (syncSubs.length) {\n try {\n const { registerSyncSubscribers } = await import('@open-mercato/shared/lib/crud/sync-subscriber-store')\n registerSyncSubscribers(\n syncSubs.map((s: any) => ({\n metadata: { event: s.event, sync: true as const, priority: s.priority, id: s.id },\n handler: s.handler,\n })),\n )\n } catch {\n // sync-subscriber-store may not be available\n }\n }\n } catch (err) {\n console.error(\"Failed to register module subscribers:\", err);\n }\n\n // KMS + tenant encryption\n const kmsService = createKmsService()\n container.register({ kmsService: asValue(kmsService) })\n try {\n const em = container.resolve('em') as EntityManager\n const cacheService = (() => {\n try { return container.resolve('cache') as any } catch { return null }\n })()\n const tenantEncryptionService = new TenantDataEncryptionService(em, { cache: cacheService, kms: kmsService })\n container.register({ tenantEncryptionService: asValue(tenantEncryptionService) })\n if (isTenantDataEncryptionEnabled() && kmsService.isHealthy()) {\n try {\n registerTenantEncryptionSubscriber(em, tenantEncryptionService)\n } catch (err) {\n console.warn('[encryption] Failed to register MikroORM encryption subscriber:', (err as Error)?.message || err)\n }\n } else if (isTenantDataEncryptionEnabled() && !kmsService.isHealthy()) {\n console.warn('[encryption] Vault/KMS unhealthy - tenant data encryption is disabled until recovery')\n }\n } catch (err) {\n console.warn('[encryption] Failed to initialize tenant encryption service:', (err as Error)?.message || err)\n }\n\n // Register rate limiter service (singleton via globalThis \u2014 reused across request containers)\n // getCachedRateLimiterService() never throws; returns null on failure\n const rateLimiterService = getCachedRateLimiterService()\n if (rateLimiterService) {\n container.register({ rateLimiterService: asValue(rateLimiterService) })\n }\n\n // Register search module\n try {\n // Get configs from global registry (registered during app bootstrap)\n const searchModuleConfigs = getSearchModuleConfigs()\n registerSearchModule(container as any, { moduleConfigs: searchModuleConfigs })\n\n // Register searchModuleConfigs in container so status API can access vector-enabled entities\n container.register({\n searchModuleConfigs: asValue(searchModuleConfigs),\n })\n\n // Register search delete event subscriber\n // Note: search.index_record is now handled by auto-discovered fulltext_upsert.ts subscriber\n try {\n const searchIndexer = container.resolve('searchIndexer') as any\n if (searchIndexer && eventBus) {\n eventBus.registerModuleSubscribers([\n {\n event: searchDeleteMetadata.event,\n persistent: searchDeleteMetadata.persistent,\n handler: createSearchDeleteSubscriber(searchIndexer),\n },\n ])\n }\n } catch {\n // searchIndexer may not be available\n }\n } catch (err) {\n console.warn('[search] Failed to register search module:', (err as Error)?.message || err)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
|
|
3
|
+
import {
|
|
4
|
+
clearModuleResourceUsageData,
|
|
5
|
+
getModuleResourceUsageReport
|
|
6
|
+
} from "@open-mercato/shared/lib/modules/resource-usage";
|
|
7
|
+
import {
|
|
8
|
+
configErrorSchema,
|
|
9
|
+
configsTag,
|
|
10
|
+
moduleTelemetryClearResponseSchema,
|
|
11
|
+
moduleTelemetryResponseSchema
|
|
12
|
+
} from "../openapi.js";
|
|
13
|
+
const metadata = {
|
|
14
|
+
GET: { requireAuth: true, requireFeatures: ["configs.system_status.view"] },
|
|
15
|
+
// Clearing telemetry shouldn't itself perturb the very telemetry it just cleared.
|
|
16
|
+
DELETE: { requireAuth: true, requireFeatures: ["configs.manage"], skipModuleResourceUsageTracking: true }
|
|
17
|
+
};
|
|
18
|
+
function canClearModuleTelemetry() {
|
|
19
|
+
return process.env.NODE_ENV === "development";
|
|
20
|
+
}
|
|
21
|
+
async function GET(req) {
|
|
22
|
+
const auth = await getAuthFromRequest(req);
|
|
23
|
+
if (!auth?.sub) {
|
|
24
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
25
|
+
}
|
|
26
|
+
return NextResponse.json({
|
|
27
|
+
...getModuleResourceUsageReport(),
|
|
28
|
+
canClearTelemetry: canClearModuleTelemetry()
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function DELETE(req) {
|
|
32
|
+
const auth = await getAuthFromRequest(req);
|
|
33
|
+
if (!auth?.sub) {
|
|
34
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
35
|
+
}
|
|
36
|
+
if (!canClearModuleTelemetry()) {
|
|
37
|
+
return NextResponse.json({ error: "Clearing module telemetry is only available in development mode." }, { status: 403 });
|
|
38
|
+
}
|
|
39
|
+
clearModuleResourceUsageData();
|
|
40
|
+
return NextResponse.json({ cleared: true });
|
|
41
|
+
}
|
|
42
|
+
const openApi = {
|
|
43
|
+
tag: configsTag,
|
|
44
|
+
summary: "Module telemetry usage",
|
|
45
|
+
methods: {
|
|
46
|
+
GET: {
|
|
47
|
+
summary: "Get module resource usage telemetry",
|
|
48
|
+
description: "Returns in-process module resource attribution for API routes, event subscribers, and queue workers.",
|
|
49
|
+
responses: [
|
|
50
|
+
{ status: 200, description: "Module resource usage report", schema: moduleTelemetryResponseSchema }
|
|
51
|
+
],
|
|
52
|
+
errors: [
|
|
53
|
+
{ status: 401, description: "Unauthorized", schema: configErrorSchema }
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
DELETE: {
|
|
57
|
+
summary: "Clear module telemetry data",
|
|
58
|
+
description: "Development-only endpoint that clears in-memory module telemetry and local process telemetry files.",
|
|
59
|
+
responses: [
|
|
60
|
+
{ status: 200, description: "Module telemetry cleared", schema: moduleTelemetryClearResponseSchema }
|
|
61
|
+
],
|
|
62
|
+
errors: [
|
|
63
|
+
{ status: 401, description: "Unauthorized", schema: configErrorSchema },
|
|
64
|
+
{ status: 403, description: "Forbidden outside development mode", schema: configErrorSchema }
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
export {
|
|
70
|
+
DELETE,
|
|
71
|
+
GET,
|
|
72
|
+
metadata,
|
|
73
|
+
openApi
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/configs/api/module-telemetry/route.ts"],
|
|
4
|
+
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport {\n clearModuleResourceUsageData,\n getModuleResourceUsageReport,\n} from '@open-mercato/shared/lib/modules/resource-usage'\nimport {\n configErrorSchema,\n configsTag,\n moduleTelemetryClearResponseSchema,\n moduleTelemetryResponseSchema,\n} from '../openapi'\n\nexport const metadata = {\n GET: { requireAuth: true, requireFeatures: ['configs.system_status.view'] },\n // Clearing telemetry shouldn't itself perturb the very telemetry it just cleared.\n DELETE: { requireAuth: true, requireFeatures: ['configs.manage'], skipModuleResourceUsageTracking: true },\n} as const\n\nfunction canClearModuleTelemetry(): boolean {\n return process.env.NODE_ENV === 'development'\n}\n\nexport async function GET(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.sub) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n return NextResponse.json({\n ...getModuleResourceUsageReport(),\n canClearTelemetry: canClearModuleTelemetry(),\n })\n}\n\nexport async function DELETE(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.sub) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n if (!canClearModuleTelemetry()) {\n return NextResponse.json({ error: 'Clearing module telemetry is only available in development mode.' }, { status: 403 })\n }\n\n clearModuleResourceUsageData()\n return NextResponse.json({ cleared: true })\n}\n\nexport const openApi: OpenApiRouteDoc = {\n tag: configsTag,\n summary: 'Module telemetry usage',\n methods: {\n GET: {\n summary: 'Get module resource usage telemetry',\n description: 'Returns in-process module resource attribution for API routes, event subscribers, and queue workers.',\n responses: [\n { status: 200, description: 'Module resource usage report', schema: moduleTelemetryResponseSchema },\n ],\n errors: [\n { status: 401, description: 'Unauthorized', schema: configErrorSchema },\n ],\n },\n DELETE: {\n summary: 'Clear module telemetry data',\n description: 'Development-only endpoint that clears in-memory module telemetry and local process telemetry files.',\n responses: [\n { status: 200, description: 'Module telemetry cleared', schema: moduleTelemetryClearResponseSchema },\n ],\n errors: [\n { status: 401, description: 'Unauthorized', schema: configErrorSchema },\n { status: 403, description: 'Forbidden outside development mode', schema: configErrorSchema },\n ],\n },\n },\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,oBAAoB;AAE7B,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,WAAW;AAAA,EACtB,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,4BAA4B,EAAE;AAAA;AAAA,EAE1E,QAAQ,EAAE,aAAa,MAAM,iBAAiB,CAAC,gBAAgB,GAAG,iCAAiC,KAAK;AAC1G;AAEA,SAAS,0BAAmC;AAC1C,SAAO,QAAQ,IAAI,aAAa;AAClC;AAEA,eAAsB,IAAI,KAAc;AACtC,QAAM,OAAO,MAAM,mBAAmB,GAAG;AACzC,MAAI,CAAC,MAAM,KAAK;AACd,WAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrE;AAEA,SAAO,aAAa,KAAK;AAAA,IACvB,GAAG,6BAA6B;AAAA,IAChC,mBAAmB,wBAAwB;AAAA,EAC7C,CAAC;AACH;AAEA,eAAsB,OAAO,KAAc;AACzC,QAAM,OAAO,MAAM,mBAAmB,GAAG;AACzC,MAAI,CAAC,MAAM,KAAK;AACd,WAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrE;AAEA,MAAI,CAAC,wBAAwB,GAAG;AAC9B,WAAO,aAAa,KAAK,EAAE,OAAO,mEAAmE,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACzH;AAEA,+BAA6B;AAC7B,SAAO,aAAa,KAAK,EAAE,SAAS,KAAK,CAAC;AAC5C;AAEO,MAAM,UAA2B;AAAA,EACtC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,IACP,KAAK;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,QACT,EAAE,QAAQ,KAAK,aAAa,gCAAgC,QAAQ,8BAA8B;AAAA,MACpG;AAAA,MACA,QAAQ;AAAA,QACN,EAAE,QAAQ,KAAK,aAAa,gBAAgB,QAAQ,kBAAkB;AAAA,MACxE;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,QACT,EAAE,QAAQ,KAAK,aAAa,4BAA4B,QAAQ,mCAAmC;AAAA,MACrG;AAAA,MACA,QAAQ;AAAA,QACN,EAAE,QAAQ,KAAK,aAAa,gBAAgB,QAAQ,kBAAkB;AAAA,QACtE,EAAE,QAAQ,KAAK,aAAa,sCAAsC,QAAQ,kBAAkB;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -99,6 +99,114 @@ const executeUpgradeActionResponseSchema = z.object({
|
|
|
99
99
|
message: z.string().describe("Localized success message"),
|
|
100
100
|
version: z.string().describe("Application version")
|
|
101
101
|
});
|
|
102
|
+
const moduleResourceSurfaceSchema = z.enum(["api", "subscriber", "worker", "custom"]);
|
|
103
|
+
const moduleResourceUsageEntrySchema = z.object({
|
|
104
|
+
moduleId: z.string(),
|
|
105
|
+
surface: moduleResourceSurfaceSchema,
|
|
106
|
+
operation: z.string(),
|
|
107
|
+
resourceId: z.string().nullable(),
|
|
108
|
+
calls: z.number().int(),
|
|
109
|
+
errors: z.number().int(),
|
|
110
|
+
totalDurationMs: z.number(),
|
|
111
|
+
maxDurationMs: z.number(),
|
|
112
|
+
p95DurationMs: z.number(),
|
|
113
|
+
totalCpuUserMs: z.number(),
|
|
114
|
+
totalCpuSystemMs: z.number(),
|
|
115
|
+
maxCpuMs: z.number(),
|
|
116
|
+
totalHeapDeltaBytes: z.number(),
|
|
117
|
+
positiveHeapDeltaBytes: z.number(),
|
|
118
|
+
maxHeapDeltaBytes: z.number(),
|
|
119
|
+
totalRssDeltaBytes: z.number(),
|
|
120
|
+
positiveRssDeltaBytes: z.number(),
|
|
121
|
+
maxRssDeltaBytes: z.number(),
|
|
122
|
+
firstSeenAt: z.string(),
|
|
123
|
+
lastSeenAt: z.string()
|
|
124
|
+
});
|
|
125
|
+
const moduleResourceUsageSurfaceSummarySchema = z.object({
|
|
126
|
+
surface: moduleResourceSurfaceSchema,
|
|
127
|
+
calls: z.number().int(),
|
|
128
|
+
errors: z.number().int(),
|
|
129
|
+
totalDurationMs: z.number(),
|
|
130
|
+
p95DurationMs: z.number(),
|
|
131
|
+
totalCpuMs: z.number(),
|
|
132
|
+
positiveHeapDeltaBytes: z.number(),
|
|
133
|
+
positiveRssDeltaBytes: z.number()
|
|
134
|
+
});
|
|
135
|
+
const moduleResourceUsageModuleSummarySchema = z.object({
|
|
136
|
+
moduleId: z.string(),
|
|
137
|
+
calls: z.number().int(),
|
|
138
|
+
errors: z.number().int(),
|
|
139
|
+
totalDurationMs: z.number(),
|
|
140
|
+
p95DurationMs: z.number(),
|
|
141
|
+
totalCpuMs: z.number(),
|
|
142
|
+
positiveHeapDeltaBytes: z.number(),
|
|
143
|
+
positiveRssDeltaBytes: z.number(),
|
|
144
|
+
surfaces: z.array(moduleResourceUsageSurfaceSummarySchema),
|
|
145
|
+
topOperations: z.array(moduleResourceUsageEntrySchema),
|
|
146
|
+
candidateReasons: z.array(z.string())
|
|
147
|
+
});
|
|
148
|
+
const moduleResourceUsageBucketModuleSchema = z.object({
|
|
149
|
+
moduleId: z.string(),
|
|
150
|
+
calls: z.number().int(),
|
|
151
|
+
errors: z.number().int(),
|
|
152
|
+
totalDurationMs: z.number(),
|
|
153
|
+
p95DurationMs: z.number(),
|
|
154
|
+
totalCpuMs: z.number(),
|
|
155
|
+
positiveHeapDeltaBytes: z.number(),
|
|
156
|
+
positiveRssDeltaBytes: z.number(),
|
|
157
|
+
surfaces: z.array(moduleResourceUsageSurfaceSummarySchema),
|
|
158
|
+
topOperations: z.array(moduleResourceUsageEntrySchema),
|
|
159
|
+
candidateReasons: z.array(z.string())
|
|
160
|
+
});
|
|
161
|
+
const moduleResourceUsageBucketSchema = z.object({
|
|
162
|
+
bucketStart: z.string().describe("UTC bucket start timestamp (ISO-8601)"),
|
|
163
|
+
bucketEnd: z.string().describe("UTC bucket end timestamp (ISO-8601)"),
|
|
164
|
+
bucketIntervalMs: z.number().int().describe("Bucket size used for this specific bucket in milliseconds"),
|
|
165
|
+
stage: z.enum(["startup", "running"]).describe("Lifecycle stage for this telemetry bucket"),
|
|
166
|
+
partial: z.boolean().describe("True when the bucket does not represent a complete process-observed interval"),
|
|
167
|
+
totals: z.object({
|
|
168
|
+
modules: z.number().int(),
|
|
169
|
+
calls: z.number().int(),
|
|
170
|
+
errors: z.number().int(),
|
|
171
|
+
totalDurationMs: z.number(),
|
|
172
|
+
totalCpuMs: z.number(),
|
|
173
|
+
positiveHeapDeltaBytes: z.number(),
|
|
174
|
+
positiveRssDeltaBytes: z.number()
|
|
175
|
+
}),
|
|
176
|
+
modules: z.array(moduleResourceUsageBucketModuleSchema)
|
|
177
|
+
});
|
|
178
|
+
const moduleTelemetryReportSchema = z.object({
|
|
179
|
+
generatedAt: z.string().describe("Report generation timestamp (ISO-8601)"),
|
|
180
|
+
startedAt: z.string().describe("Telemetry aggregation start timestamp (ISO-8601)"),
|
|
181
|
+
enabled: z.boolean().describe("Whether module resource tracking is enabled"),
|
|
182
|
+
bucketIntervalMs: z.number().int().describe("Bucket size in milliseconds; module telemetry uses 5-minute buckets in every environment"),
|
|
183
|
+
totals: z.object({
|
|
184
|
+
modules: z.number().int(),
|
|
185
|
+
operations: z.number().int(),
|
|
186
|
+
calls: z.number().int(),
|
|
187
|
+
errors: z.number().int(),
|
|
188
|
+
totalDurationMs: z.number(),
|
|
189
|
+
totalCpuMs: z.number(),
|
|
190
|
+
positiveHeapDeltaBytes: z.number(),
|
|
191
|
+
positiveRssDeltaBytes: z.number()
|
|
192
|
+
}),
|
|
193
|
+
thresholds: z.object({
|
|
194
|
+
p95DurationMs: z.number(),
|
|
195
|
+
cpuMs: z.number(),
|
|
196
|
+
positiveHeapDeltaBytes: z.number(),
|
|
197
|
+
positiveRssDeltaBytes: z.number(),
|
|
198
|
+
errors: z.number()
|
|
199
|
+
}),
|
|
200
|
+
modules: z.array(moduleResourceUsageModuleSummarySchema),
|
|
201
|
+
candidates: z.array(moduleResourceUsageModuleSummarySchema),
|
|
202
|
+
buckets: z.array(moduleResourceUsageBucketSchema)
|
|
203
|
+
});
|
|
204
|
+
const moduleTelemetryResponseSchema = moduleTelemetryReportSchema.extend({
|
|
205
|
+
canClearTelemetry: z.boolean().optional()
|
|
206
|
+
});
|
|
207
|
+
const moduleTelemetryClearResponseSchema = z.object({
|
|
208
|
+
cleared: z.boolean()
|
|
209
|
+
});
|
|
102
210
|
export {
|
|
103
211
|
cachePurgeAllResponseSchema,
|
|
104
212
|
cachePurgeRequestSchema,
|
|
@@ -108,6 +216,8 @@ export {
|
|
|
108
216
|
configsTag,
|
|
109
217
|
executeUpgradeActionRequestSchema,
|
|
110
218
|
executeUpgradeActionResponseSchema,
|
|
219
|
+
moduleTelemetryClearResponseSchema,
|
|
220
|
+
moduleTelemetryResponseSchema,
|
|
111
221
|
purgeCacheResponseSchema,
|
|
112
222
|
systemStatusResponseSchema,
|
|
113
223
|
upgradeActionSchema,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/configs/api/openapi.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\n\nexport const configsTag = 'Configs'\n\nexport const configErrorSchema = z\n .object({\n error: z.string(),\n details: z.unknown().optional(),\n })\n .passthrough()\n\nconst systemStatusCategoryKeySchema = z.enum([\n 'profiling',\n 'logging',\n 'security',\n 'caching',\n 'query_index',\n 'entities',\n])\n\nconst systemStatusVariableKindSchema = z.enum(['boolean', 'string'])\n\nconst systemStatusStateSchema = z.enum([\n 'enabled',\n 'disabled',\n 'set',\n 'unset',\n 'unknown',\n])\n\nconst systemStatusRuntimeModeSchema = z.enum([\n 'development',\n 'production',\n 'test',\n 'unknown',\n])\n\nconst systemStatusItemSchema = z.object({\n key: z.string(),\n category: systemStatusCategoryKeySchema,\n kind: systemStatusVariableKindSchema,\n labelKey: z.string(),\n descriptionKey: z.string(),\n docUrl: z.string().nullable(),\n defaultValue: z.string().nullable(),\n state: systemStatusStateSchema,\n value: z.string().nullable(),\n normalizedValue: z.string().nullable(),\n})\n\nconst systemStatusCategorySchema = z.object({\n key: systemStatusCategoryKeySchema,\n labelKey: z.string(),\n descriptionKey: z.string().nullable(),\n items: z.array(systemStatusItemSchema),\n})\n\nexport const systemStatusResponseSchema = z.object({\n generatedAt: z.string().describe('Snapshot generation timestamp (ISO-8601)'),\n runtimeMode: systemStatusRuntimeModeSchema.describe('Current runtime mode'),\n categories: z.array(systemStatusCategorySchema).describe('Grouped system status variables by category'),\n})\n\nexport const purgeCacheResponseSchema = z.object({\n cleared: z.boolean().describe('Whether cache was successfully cleared'),\n})\n\nconst cacheSegmentInfoSchema = z.object({\n segment: z.string().describe('Sanitized segment identifier'),\n resource: z.string().nullable().describe('Resource the segment maps to, when resolvable'),\n method: z.string().nullable().describe('HTTP method the segment maps to, when resolvable'),\n path: z.string().nullable().describe('Request path the segment maps to, when resolvable'),\n keyCount: z.number().int().describe('Number of cache keys in the segment'),\n keys: z.array(z.string()).describe('Cache keys contained in the segment'),\n})\n\nexport const cacheStatsResponseSchema = z.object({\n generatedAt: z.string().describe('Snapshot generation timestamp (ISO-8601)'),\n totalKeys: z.number().int().describe('Total cache keys across all segments'),\n segments: z.array(cacheSegmentInfoSchema).describe('Per-segment cache breakdown'),\n})\n\nexport const cachePurgeRequestSchema = z.object({\n action: z.enum(['purgeAll', 'purgeSegment']).describe('Cache purge action type'),\n segment: z.string().optional().describe('Segment identifier (required for purgeSegment action)'),\n})\n\nexport const cachePurgeAllResponseSchema = z.object({\n action: z.literal('purgeAll'),\n stats: cacheStatsResponseSchema,\n})\n\nexport const cachePurgeSegmentResponseSchema = z.object({\n action: z.literal('purgeSegment'),\n segment: z.string(),\n deleted: z.number().int().describe('Number of entries deleted'),\n stats: cacheStatsResponseSchema,\n})\n\nexport const upgradeActionSchema = z.object({\n id: z.string().describe('Upgrade action unique identifier'),\n version: z.string().describe('Version this action applies to'),\n message: z.string().describe('Localized description of the upgrade action'),\n ctaLabel: z.string().describe('Call-to-action button label'),\n successMessage: z.string().describe('Success message after execution'),\n loadingLabel: z.string().describe('Loading state label during execution'),\n})\n\nexport const upgradeActionsListResponseSchema = z.object({\n version: z.string().describe('Current application version'),\n actions: z.array(upgradeActionSchema).describe('List of pending upgrade actions'),\n})\n\nexport const executeUpgradeActionRequestSchema = z.object({\n actionId: z.string().min(1).describe('Upgrade action ID to execute'),\n})\n\nexport const executeUpgradeActionResponseSchema = z.object({\n status: z.string().describe('Execution status'),\n message: z.string().describe('Localized success message'),\n version: z.string().describe('Application version'),\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\n\nexport const configsTag = 'Configs'\n\nexport const configErrorSchema = z\n .object({\n error: z.string(),\n details: z.unknown().optional(),\n })\n .passthrough()\n\nconst systemStatusCategoryKeySchema = z.enum([\n 'profiling',\n 'logging',\n 'security',\n 'caching',\n 'query_index',\n 'entities',\n])\n\nconst systemStatusVariableKindSchema = z.enum(['boolean', 'string'])\n\nconst systemStatusStateSchema = z.enum([\n 'enabled',\n 'disabled',\n 'set',\n 'unset',\n 'unknown',\n])\n\nconst systemStatusRuntimeModeSchema = z.enum([\n 'development',\n 'production',\n 'test',\n 'unknown',\n])\n\nconst systemStatusItemSchema = z.object({\n key: z.string(),\n category: systemStatusCategoryKeySchema,\n kind: systemStatusVariableKindSchema,\n labelKey: z.string(),\n descriptionKey: z.string(),\n docUrl: z.string().nullable(),\n defaultValue: z.string().nullable(),\n state: systemStatusStateSchema,\n value: z.string().nullable(),\n normalizedValue: z.string().nullable(),\n})\n\nconst systemStatusCategorySchema = z.object({\n key: systemStatusCategoryKeySchema,\n labelKey: z.string(),\n descriptionKey: z.string().nullable(),\n items: z.array(systemStatusItemSchema),\n})\n\nexport const systemStatusResponseSchema = z.object({\n generatedAt: z.string().describe('Snapshot generation timestamp (ISO-8601)'),\n runtimeMode: systemStatusRuntimeModeSchema.describe('Current runtime mode'),\n categories: z.array(systemStatusCategorySchema).describe('Grouped system status variables by category'),\n})\n\nexport const purgeCacheResponseSchema = z.object({\n cleared: z.boolean().describe('Whether cache was successfully cleared'),\n})\n\nconst cacheSegmentInfoSchema = z.object({\n segment: z.string().describe('Sanitized segment identifier'),\n resource: z.string().nullable().describe('Resource the segment maps to, when resolvable'),\n method: z.string().nullable().describe('HTTP method the segment maps to, when resolvable'),\n path: z.string().nullable().describe('Request path the segment maps to, when resolvable'),\n keyCount: z.number().int().describe('Number of cache keys in the segment'),\n keys: z.array(z.string()).describe('Cache keys contained in the segment'),\n})\n\nexport const cacheStatsResponseSchema = z.object({\n generatedAt: z.string().describe('Snapshot generation timestamp (ISO-8601)'),\n totalKeys: z.number().int().describe('Total cache keys across all segments'),\n segments: z.array(cacheSegmentInfoSchema).describe('Per-segment cache breakdown'),\n})\n\nexport const cachePurgeRequestSchema = z.object({\n action: z.enum(['purgeAll', 'purgeSegment']).describe('Cache purge action type'),\n segment: z.string().optional().describe('Segment identifier (required for purgeSegment action)'),\n})\n\nexport const cachePurgeAllResponseSchema = z.object({\n action: z.literal('purgeAll'),\n stats: cacheStatsResponseSchema,\n})\n\nexport const cachePurgeSegmentResponseSchema = z.object({\n action: z.literal('purgeSegment'),\n segment: z.string(),\n deleted: z.number().int().describe('Number of entries deleted'),\n stats: cacheStatsResponseSchema,\n})\n\nexport const upgradeActionSchema = z.object({\n id: z.string().describe('Upgrade action unique identifier'),\n version: z.string().describe('Version this action applies to'),\n message: z.string().describe('Localized description of the upgrade action'),\n ctaLabel: z.string().describe('Call-to-action button label'),\n successMessage: z.string().describe('Success message after execution'),\n loadingLabel: z.string().describe('Loading state label during execution'),\n})\n\nexport const upgradeActionsListResponseSchema = z.object({\n version: z.string().describe('Current application version'),\n actions: z.array(upgradeActionSchema).describe('List of pending upgrade actions'),\n})\n\nexport const executeUpgradeActionRequestSchema = z.object({\n actionId: z.string().min(1).describe('Upgrade action ID to execute'),\n})\n\nexport const executeUpgradeActionResponseSchema = z.object({\n status: z.string().describe('Execution status'),\n message: z.string().describe('Localized success message'),\n version: z.string().describe('Application version'),\n})\n\nconst moduleResourceSurfaceSchema = z.enum(['api', 'subscriber', 'worker', 'custom'])\n\nconst moduleResourceUsageEntrySchema = z.object({\n moduleId: z.string(),\n surface: moduleResourceSurfaceSchema,\n operation: z.string(),\n resourceId: z.string().nullable(),\n calls: z.number().int(),\n errors: z.number().int(),\n totalDurationMs: z.number(),\n maxDurationMs: z.number(),\n p95DurationMs: z.number(),\n totalCpuUserMs: z.number(),\n totalCpuSystemMs: z.number(),\n maxCpuMs: z.number(),\n totalHeapDeltaBytes: z.number(),\n positiveHeapDeltaBytes: z.number(),\n maxHeapDeltaBytes: z.number(),\n totalRssDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n maxRssDeltaBytes: z.number(),\n firstSeenAt: z.string(),\n lastSeenAt: z.string(),\n})\n\nconst moduleResourceUsageSurfaceSummarySchema = z.object({\n surface: moduleResourceSurfaceSchema,\n calls: z.number().int(),\n errors: z.number().int(),\n totalDurationMs: z.number(),\n p95DurationMs: z.number(),\n totalCpuMs: z.number(),\n positiveHeapDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n})\n\nconst moduleResourceUsageModuleSummarySchema = z.object({\n moduleId: z.string(),\n calls: z.number().int(),\n errors: z.number().int(),\n totalDurationMs: z.number(),\n p95DurationMs: z.number(),\n totalCpuMs: z.number(),\n positiveHeapDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n surfaces: z.array(moduleResourceUsageSurfaceSummarySchema),\n topOperations: z.array(moduleResourceUsageEntrySchema),\n candidateReasons: z.array(z.string()),\n})\n\nconst moduleResourceUsageBucketModuleSchema = z.object({\n moduleId: z.string(),\n calls: z.number().int(),\n errors: z.number().int(),\n totalDurationMs: z.number(),\n p95DurationMs: z.number(),\n totalCpuMs: z.number(),\n positiveHeapDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n surfaces: z.array(moduleResourceUsageSurfaceSummarySchema),\n topOperations: z.array(moduleResourceUsageEntrySchema),\n candidateReasons: z.array(z.string()),\n})\n\nconst moduleResourceUsageBucketSchema = z.object({\n bucketStart: z.string().describe('UTC bucket start timestamp (ISO-8601)'),\n bucketEnd: z.string().describe('UTC bucket end timestamp (ISO-8601)'),\n bucketIntervalMs: z.number().int().describe('Bucket size used for this specific bucket in milliseconds'),\n stage: z.enum(['startup', 'running']).describe('Lifecycle stage for this telemetry bucket'),\n partial: z.boolean().describe('True when the bucket does not represent a complete process-observed interval'),\n totals: z.object({\n modules: z.number().int(),\n calls: z.number().int(),\n errors: z.number().int(),\n totalDurationMs: z.number(),\n totalCpuMs: z.number(),\n positiveHeapDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n }),\n modules: z.array(moduleResourceUsageBucketModuleSchema),\n})\n\nconst moduleTelemetryReportSchema = z.object({\n generatedAt: z.string().describe('Report generation timestamp (ISO-8601)'),\n startedAt: z.string().describe('Telemetry aggregation start timestamp (ISO-8601)'),\n enabled: z.boolean().describe('Whether module resource tracking is enabled'),\n bucketIntervalMs: z.number().int().describe('Bucket size in milliseconds; module telemetry uses 5-minute buckets in every environment'),\n totals: z.object({\n modules: z.number().int(),\n operations: z.number().int(),\n calls: z.number().int(),\n errors: z.number().int(),\n totalDurationMs: z.number(),\n totalCpuMs: z.number(),\n positiveHeapDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n }),\n thresholds: z.object({\n p95DurationMs: z.number(),\n cpuMs: z.number(),\n positiveHeapDeltaBytes: z.number(),\n positiveRssDeltaBytes: z.number(),\n errors: z.number(),\n }),\n modules: z.array(moduleResourceUsageModuleSummarySchema),\n candidates: z.array(moduleResourceUsageModuleSummarySchema),\n buckets: z.array(moduleResourceUsageBucketSchema),\n})\n\nexport const moduleTelemetryResponseSchema = moduleTelemetryReportSchema.extend({\n canClearTelemetry: z.boolean().optional(),\n})\n\nexport const moduleTelemetryClearResponseSchema = z.object({\n cleared: z.boolean(),\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/configs/backend/config/cache/page.meta.ts"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\n\nconst cacheIcon = React.createElement(\n 'svg',\n {\n width: 16,\n height: 16,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n React.createElement('rect', { x: 3, y: 4, width: 18, height: 6, rx: 2 }),\n React.createElement('path', { d: 'M5 6h.01' }),\n React.createElement('path', { d: 'M9 6h.01' }),\n React.createElement('path', { d: 'M21 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6' }),\n React.createElement('path', { d: 'M5 14h.01' }),\n React.createElement('path', { d: 'M9 14h.01' })\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['configs.cache.view'],\n pageTitle: 'Cache',\n pageTitleKey: 'configs.config.nav.cache',\n pageGroup: 'System',\n pageGroupKey: 'settings.sections.system',\n pageOrder:
|
|
4
|
+
"sourcesContent": ["import React from 'react'\n\nconst cacheIcon = React.createElement(\n 'svg',\n {\n width: 16,\n height: 16,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n React.createElement('rect', { x: 3, y: 4, width: 18, height: 6, rx: 2 }),\n React.createElement('path', { d: 'M5 6h.01' }),\n React.createElement('path', { d: 'M9 6h.01' }),\n React.createElement('path', { d: 'M21 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6' }),\n React.createElement('path', { d: 'M5 14h.01' }),\n React.createElement('path', { d: 'M9 14h.01' })\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['configs.cache.view'],\n pageTitle: 'Cache',\n pageTitleKey: 'configs.config.nav.cache',\n pageGroup: 'System',\n pageGroupKey: 'settings.sections.system',\n pageOrder: 3,\n icon: cacheIcon,\n pageContext: 'settings' as const,\n breadcrumb: [\n { label: 'Cache', labelKey: 'configs.config.nav.cache' },\n ],\n} as const\n"],
|
|
5
5
|
"mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,YAAY,MAAM;AAAA,EACtB;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM,cAAc,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;AAAA,EACvE,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,4CAA4C,CAAC;AAAA,EAC9E,MAAM,cAAc,QAAQ,EAAE,GAAG,YAAY,CAAC;AAAA,EAC9C,MAAM,cAAc,QAAQ,EAAE,GAAG,YAAY,CAAC;AAChD;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,oBAAoB;AAAA,EACtC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,EAAE,OAAO,SAAS,UAAU,2BAA2B;AAAA,EACzD;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Page, PageBody } from "@open-mercato/ui/backend/Page";
|
|
3
|
+
import ModuleTelemetryPanel from "../../../components/ModuleTelemetryPanel.js";
|
|
4
|
+
function ModuleTelemetryPage() {
|
|
5
|
+
return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(ModuleTelemetryPanel, {}) }) });
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
ModuleTelemetryPage as default
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/configs/backend/config/module-telemetry/page.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport ModuleTelemetryPanel from '../../../components/ModuleTelemetryPanel'\n\nexport default function ModuleTelemetryPage() {\n return (\n <Page>\n <PageBody>\n <ModuleTelemetryPanel />\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAOQ;AAPR,SAAS,MAAM,gBAAgB;AAC/B,OAAO,0BAA0B;AAElB,SAAR,sBAAuC;AAC5C,SACE,oBAAC,QACC,8BAAC,YACC,8BAAC,wBAAqB,GACxB,GACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
const moduleTelemetryIcon = React.createElement(
|
|
3
|
+
"svg",
|
|
4
|
+
{
|
|
5
|
+
width: 16,
|
|
6
|
+
height: 16,
|
|
7
|
+
viewBox: "0 0 24 24",
|
|
8
|
+
fill: "none",
|
|
9
|
+
stroke: "currentColor",
|
|
10
|
+
strokeWidth: 2,
|
|
11
|
+
strokeLinecap: "round",
|
|
12
|
+
strokeLinejoin: "round"
|
|
13
|
+
},
|
|
14
|
+
React.createElement("path", { d: "M4 19V5" }),
|
|
15
|
+
React.createElement("path", { d: "M4 19h16" }),
|
|
16
|
+
React.createElement("path", { d: "M7 15l3-3 3 2 5-7" }),
|
|
17
|
+
React.createElement("path", { d: "M18 7h2v2" })
|
|
18
|
+
);
|
|
19
|
+
const metadata = {
|
|
20
|
+
requireAuth: true,
|
|
21
|
+
requireFeatures: ["configs.system_status.view"],
|
|
22
|
+
pageTitle: "Module telemetry",
|
|
23
|
+
pageTitleKey: "configs.config.nav.moduleTelemetry",
|
|
24
|
+
pageGroup: "System",
|
|
25
|
+
pageGroupKey: "settings.sections.system",
|
|
26
|
+
pageOrder: 2,
|
|
27
|
+
icon: moduleTelemetryIcon,
|
|
28
|
+
pageContext: "settings",
|
|
29
|
+
breadcrumb: [
|
|
30
|
+
{ label: "Module telemetry", labelKey: "configs.config.nav.moduleTelemetry" }
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
export {
|
|
34
|
+
metadata
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=page.meta.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/configs/backend/config/module-telemetry/page.meta.ts"],
|
|
4
|
+
"sourcesContent": ["import React from 'react'\n\nconst moduleTelemetryIcon = React.createElement(\n 'svg',\n {\n width: 16,\n height: 16,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n React.createElement('path', { d: 'M4 19V5' }),\n React.createElement('path', { d: 'M4 19h16' }),\n React.createElement('path', { d: 'M7 15l3-3 3 2 5-7' }),\n React.createElement('path', { d: 'M18 7h2v2' }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['configs.system_status.view'],\n pageTitle: 'Module telemetry',\n pageTitleKey: 'configs.config.nav.moduleTelemetry',\n pageGroup: 'System',\n pageGroupKey: 'settings.sections.system',\n pageOrder: 2,\n icon: moduleTelemetryIcon,\n pageContext: 'settings' as const,\n breadcrumb: [\n { label: 'Module telemetry', labelKey: 'configs.config.nav.moduleTelemetry' },\n ],\n} as const\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,sBAAsB,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM,cAAc,QAAQ,EAAE,GAAG,UAAU,CAAC;AAAA,EAC5C,MAAM,cAAc,QAAQ,EAAE,GAAG,WAAW,CAAC;AAAA,EAC7C,MAAM,cAAc,QAAQ,EAAE,GAAG,oBAAoB,CAAC;AAAA,EACtD,MAAM,cAAc,QAAQ,EAAE,GAAG,YAAY,CAAC;AAChD;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,4BAA4B;AAAA,EAC9C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,EAAE,OAAO,oBAAoB,UAAU,qCAAqC;AAAA,EAC9E;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|