claude-flow-novice 1.6.1 → 1.6.2
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/.claude/agents/cfn-loop/product-owner.md +54 -4
- package/.claude/commands/cfn-claude-sync.md +303 -0
- package/.claude/commands/cfn-loop-epic.md +290 -0
- package/.claude/commands/cfn-loop-single.md +168 -0
- package/.claude/commands/cfn-loop-sprints.md +384 -0
- package/.claude/commands/cfn-loop.md +180 -0
- package/.claude/commands/metrics-summary.md +58 -0
- package/.claude/commands/parse-epic.md +357 -0
- package/.claude/settings.json +4 -4
- package/.claude/settings.local.json +9 -2
- package/.claude-flow-novice/.claude/agents/cfn-loop/product-owner.md +792 -0
- package/.claude-flow-novice/dist/mcp/server.js +21 -2
- package/.claude-flow-novice/dist/src/api/claude-client.js +138 -3
- package/.claude-flow-novice/dist/src/api/claude-client.js.map +1 -1
- package/.claude-flow-novice/dist/src/cfn-loop/phase-orchestrator-example.js +1 -1
- package/.claude-flow-novice/dist/src/cfn-loop/scope-control.js +247 -0
- package/.claude-flow-novice/dist/src/cfn-loop/scope-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js +32 -15
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/transparency.js +455 -0
- package/.claude-flow-novice/dist/src/cli/commands/transparency.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/simple-commands/init/templates/CLAUDE.md +129 -13
- package/.claude-flow-novice/dist/src/components/visualizations/index.js +9 -0
- package/.claude-flow-novice/dist/src/components/visualizations/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js +462 -0
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js +248 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js +287 -0
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/distributed-consensus.js +68 -9
- package/.claude-flow-novice/dist/src/coordination/distributed-consensus.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/feature-flags.js +166 -0
- package/.claude-flow-novice/dist/src/coordination/feature-flags.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/queen-agent.js +18 -4
- package/.claude-flow-novice/dist/src/coordination/queen-agent.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/role-assignment.js +6 -110
- package/.claude-flow-novice/dist/src/coordination/role-assignment.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/cache/artifact-cache-optimizer.js +632 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/artifact-cache-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/index.js +11 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/checkpoints/checkpoint-compressor.js +318 -0
- package/.claude-flow-novice/dist/src/coordination/v2/checkpoints/checkpoint-compressor.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.example.js +364 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.js +492 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/hierarchical-coordinator.js +786 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/hierarchical-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/parent-child-manager.js +342 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/parent-child-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/swarm-coordinator-v2.js +601 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/swarm-coordinator-v2.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/help-request-metrics.js +211 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/help-request-metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/index.js +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/message-broker.js +365 -6
- package/.claude-flow-novice/dist/src/coordination/v2/core/message-broker.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/resource-manager-safe.js +478 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/resource-manager-safe.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine-config.js +5 -2
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine-config.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine.js +189 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/deadlock-detector.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/deadlock-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/index.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/resource-manager.js +669 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/resource-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/artifact-storage.js +451 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/artifact-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/cycle-detector.js +271 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/cycle-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-graph.js +335 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-graph.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-manager.js +439 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-request.js +92 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/index.js +21 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/topological-sort.js +223 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/topological-sort.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-coordinator.js +436 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-matcher.js +278 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-matcher.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request-handler.js +317 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request.js +273 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/index.js +15 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/waiting-agent-pool.js +512 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/waiting-agent-pool.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/index.js +6 -0
- package/.claude-flow-novice/dist/src/coordination/v2/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/integration/help-deadlock-integration.js +557 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/help-deadlock-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.example.js +212 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.js +552 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/dependency-storage.js +367 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/dependency-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/index.js +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channel.js +371 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/dependency-channel.js +355 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/dependency-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/help-channel.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/help-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/state-channel.js +295 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/state-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/task-channel.js +411 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/task-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-bus.js +387 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-persistence.js +589 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-persistence.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-router.js +444 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-router.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/checkpoint-manager.js +29 -8
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/checkpoint-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/help-coordinator.js +470 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/hierarchical-background-integration.js +450 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/hierarchical-background-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/index.js +5 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/multi-level-control.js +545 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/multi-level-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-controller.js +44 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-controller.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-message-integration.js +415 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-message-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/session-pool-optimizer.js +615 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/session-pool-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/security/payload-validator.js +259 -0
- package/.claude-flow-novice/dist/src/coordination/v2/security/payload-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/index.js +17 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-integration.js +357 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-system.js +679 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-system.js.map +1 -0
- package/.claude-flow-novice/dist/src/core/agent-manager.js +30 -0
- package/.claude-flow-novice/dist/src/core/agent-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/mcp/server.js +21 -2
- package/.claude-flow-novice/dist/src/mcp/server.js.map +1 -1
- package/.claude-flow-novice/dist/src/observability/metrics-counter.js +268 -0
- package/.claude-flow-novice/dist/src/observability/metrics-counter.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/metrics-storage.js +265 -0
- package/.claude-flow-novice/dist/src/observability/metrics-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/telemetry.js +26 -0
- package/.claude-flow-novice/dist/src/observability/telemetry.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/tiered-router.js +64 -10
- package/.claude-flow-novice/dist/src/providers/tiered-router.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/zai-provider.js +196 -97
- package/.claude-flow-novice/dist/src/providers/zai-provider.js.map +1 -1
- package/.claude-flow-novice/dist/src/slash-commands/cfn-claude-sync.js +533 -0
- package/.claude-flow-novice/dist/src/slash-commands/index.js +5 -0
- package/.claude-flow-novice/dist/src/slash-commands/metrics-summary-class.js +74 -0
- package/.claude-flow-novice/dist/src/slash-commands/metrics-summary.js +335 -0
- package/.claude-flow-novice/dist/src/slash-commands/register-all-commands.js +12 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression-demo.js +96 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression-demo.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression.js +406 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-manager.js +35 -5
- package/.claude-flow-novice/dist/src/verification/checkpoint-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/web/api/config/api-config.js +186 -0
- package/.claude-flow-novice/dist/src/web/api/config/api-config.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/auth.js +205 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/auth.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/cache.js +262 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/cache.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/error-handler.js +250 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/error-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/request-logger.js +217 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/request-logger.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/validation.js +325 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/validation.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/events.js +465 -0
- package/.claude-flow-novice/dist/src/web/api/routes/events.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/hierarchy.js +302 -0
- package/.claude-flow-novice/dist/src/web/api/routes/hierarchy.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/index.js +14 -0
- package/.claude-flow-novice/dist/src/web/api/routes/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/metrics.js +561 -0
- package/.claude-flow-novice/dist/src/web/api/routes/metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/status.js +450 -0
- package/.claude-flow-novice/dist/src/web/api/routes/status.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/server.js +451 -0
- package/.claude-flow-novice/dist/src/web/api/server.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/hooks/useWebSocket.js +385 -0
- package/.claude-flow-novice/dist/src/web/dashboard/hooks/useWebSocket.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/index.js +87 -0
- package/.claude-flow-novice/dist/src/web/dashboard/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/types.js +6 -0
- package/.claude-flow-novice/dist/src/web/dashboard/types.js.map +1 -0
- package/.claude-flow-novice/metrics.db +0 -0
- package/.claude-flow-novice/metrics.db-shm +0 -0
- package/.claude-flow-novice/metrics.db-wal +0 -0
- package/CLAUDE.md +29 -0
- package/README.md +27 -0
- package/config/hooks/post-edit-pipeline.js +36 -2
- package/examples/metrics-counter-demo.ts +106 -0
- package/examples/persistent-metrics-demo.ts +83 -0
- package/examples/phase-5-multi-level-control.ts +282 -0
- package/examples/session-pool-optimizer-example.ts +311 -0
- package/package.json +15 -3
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/test-provider-routing.cjs +228 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +29 -0
- package/src/observability/metrics-counter.ts +347 -0
- package/src/observability/metrics-storage.ts +356 -0
- package/src/observability/telemetry.ts +658 -0
- package/src/slash-commands/cfn-claude-sync.js +533 -0
- package/src/slash-commands/index.js +5 -0
- package/src/slash-commands/metrics-summary-class.js +74 -0
- package/src/slash-commands/metrics-summary.js +335 -0
- package/src/slash-commands/register-all-commands.js +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/web/api/middleware/cache.ts"],"names":["cacheMiddleware","cache","defaultTtl","req","res","next","method","cacheKey","generateCacheKey","cached","get","Date","now","timestamp","ttl","setHeader","Math","floor","etag","json","data","originalJson","statusCode","getCacheTtl","generateETag","set","call","url","URL","originalUrl","headers","host","queryParams","URLSearchParams","search","sort","queryString","toString","path","pathname","userId","user","id","includes","crypto","require","hash","createHash","update","JSON","stringify","digest","conditionalRequest","ifNoneMatch","invalidateCache","pattern","getInvalidationPattern","key","keys","delete","warmCache","warmupFn","size","error","console","MemoryCache","Map","maxSize","cleanupInterval","cleanupIntervalMs","setInterval","cleanup","entry","undefined","oldestKey","value","clear","getStats","entries","Array","from","map","age","length","keysToDelete","push","destroy","clearInterval"],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handler Middleware
|
|
3
|
+
*
|
|
4
|
+
* Centralized error handling for the transparency API server
|
|
5
|
+
*
|
|
6
|
+
* @module web/api/middleware/error-handler
|
|
7
|
+
*/ /**
|
|
8
|
+
* API Error class
|
|
9
|
+
*/ export class ApiError extends Error {
|
|
10
|
+
statusCode;
|
|
11
|
+
isOperational;
|
|
12
|
+
code;
|
|
13
|
+
details;
|
|
14
|
+
constructor(message, statusCode = 500, isOperational = true, code, details){
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'ApiError';
|
|
17
|
+
this.statusCode = statusCode;
|
|
18
|
+
this.isOperational = isOperational;
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.details = details;
|
|
21
|
+
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
22
|
+
if (Error.captureStackTrace) {
|
|
23
|
+
Error.captureStackTrace(this, ApiError);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Validation Error class
|
|
29
|
+
*/ export class ValidationError extends ApiError {
|
|
30
|
+
constructor(message, details){
|
|
31
|
+
super(message, 400, true, 'VALIDATION_ERROR', details);
|
|
32
|
+
this.name = 'ValidationError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Not Found Error class
|
|
37
|
+
*/ export class NotFoundError extends ApiError {
|
|
38
|
+
constructor(resource, id){
|
|
39
|
+
const message = id ? `${resource} with id '${id}' not found` : `${resource} not found`;
|
|
40
|
+
super(message, 404, true, 'NOT_FOUND', {
|
|
41
|
+
resource,
|
|
42
|
+
id
|
|
43
|
+
});
|
|
44
|
+
this.name = 'NotFoundError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Unauthorized Error class
|
|
49
|
+
*/ export class UnauthorizedError extends ApiError {
|
|
50
|
+
constructor(message = 'Unauthorized'){
|
|
51
|
+
super(message, 401, true, 'UNAUTHORIZED');
|
|
52
|
+
this.name = 'UnauthorizedError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Forbidden Error class
|
|
57
|
+
*/ export class ForbiddenError extends ApiError {
|
|
58
|
+
constructor(message = 'Forbidden'){
|
|
59
|
+
super(message, 403, true, 'FORBIDDEN');
|
|
60
|
+
this.name = 'ForbiddenError';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Rate Limit Error class
|
|
65
|
+
*/ export class RateLimitError extends ApiError {
|
|
66
|
+
constructor(message = 'Rate limit exceeded'){
|
|
67
|
+
super(message, 429, true, 'RATE_LIMIT_EXCEEDED');
|
|
68
|
+
this.name = 'RateLimitError';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Error Handler Middleware Factory
|
|
73
|
+
*/ export function errorHandler(logger) {
|
|
74
|
+
return (err, req, res, next)=>{
|
|
75
|
+
// Default error values
|
|
76
|
+
let statusCode = 500;
|
|
77
|
+
let errorCode = 'INTERNAL_SERVER_ERROR';
|
|
78
|
+
let message = 'Internal server error';
|
|
79
|
+
let details = undefined;
|
|
80
|
+
let isOperational = false;
|
|
81
|
+
// Handle known error types
|
|
82
|
+
if (err instanceof ApiError) {
|
|
83
|
+
statusCode = err.statusCode;
|
|
84
|
+
errorCode = err.code || 'API_ERROR';
|
|
85
|
+
message = err.message;
|
|
86
|
+
details = err.details;
|
|
87
|
+
isOperational = err.isOperational;
|
|
88
|
+
} else if (err.name === 'ValidationError') {
|
|
89
|
+
statusCode = 400;
|
|
90
|
+
errorCode = 'VALIDATION_ERROR';
|
|
91
|
+
message = err.message;
|
|
92
|
+
isOperational = true;
|
|
93
|
+
} else if (err.name === 'CastError') {
|
|
94
|
+
statusCode = 400;
|
|
95
|
+
errorCode = 'INVALID_ID';
|
|
96
|
+
message = 'Invalid ID format';
|
|
97
|
+
isOperational = true;
|
|
98
|
+
} else if (err.name === 'JsonWebTokenError') {
|
|
99
|
+
statusCode = 401;
|
|
100
|
+
errorCode = 'INVALID_TOKEN';
|
|
101
|
+
message = 'Invalid authentication token';
|
|
102
|
+
isOperational = true;
|
|
103
|
+
} else if (err.name === 'TokenExpiredError') {
|
|
104
|
+
statusCode = 401;
|
|
105
|
+
errorCode = 'TOKEN_EXPIRED';
|
|
106
|
+
message = 'Authentication token expired';
|
|
107
|
+
isOperational = true;
|
|
108
|
+
} else if (err.name === 'MulterError') {
|
|
109
|
+
statusCode = 400;
|
|
110
|
+
errorCode = 'FILE_UPLOAD_ERROR';
|
|
111
|
+
message = 'File upload error';
|
|
112
|
+
isOperational = true;
|
|
113
|
+
} else if (err.name === 'SyntaxError' && err.type === 'entity.parse.failed') {
|
|
114
|
+
statusCode = 400;
|
|
115
|
+
errorCode = 'INVALID_JSON';
|
|
116
|
+
message = 'Invalid JSON in request body';
|
|
117
|
+
isOperational = true;
|
|
118
|
+
}
|
|
119
|
+
// Log error
|
|
120
|
+
const logData = {
|
|
121
|
+
error: {
|
|
122
|
+
name: err.name,
|
|
123
|
+
message: err.message,
|
|
124
|
+
code: errorCode,
|
|
125
|
+
statusCode,
|
|
126
|
+
isOperational,
|
|
127
|
+
stack: err.stack
|
|
128
|
+
},
|
|
129
|
+
request: {
|
|
130
|
+
method: req.method,
|
|
131
|
+
url: req.originalUrl,
|
|
132
|
+
ip: req.ip,
|
|
133
|
+
userAgent: req.get('User-Agent'),
|
|
134
|
+
user: req.user?.id || 'anonymous'
|
|
135
|
+
},
|
|
136
|
+
details
|
|
137
|
+
};
|
|
138
|
+
if (isOperational) {
|
|
139
|
+
logger.warn('Operational error', logData);
|
|
140
|
+
} else {
|
|
141
|
+
logger.error('Non-operational error', logData);
|
|
142
|
+
}
|
|
143
|
+
// Build error response
|
|
144
|
+
const errorResponse = {
|
|
145
|
+
error: errorCode,
|
|
146
|
+
message,
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
requestId: req.requestId || 'unknown'
|
|
149
|
+
};
|
|
150
|
+
// Include details in development or for operational errors
|
|
151
|
+
if (process.env.NODE_ENV === 'development' || isOperational) {
|
|
152
|
+
if (details) {
|
|
153
|
+
errorResponse.details = details;
|
|
154
|
+
}
|
|
155
|
+
if (process.env.NODE_ENV === 'development') {
|
|
156
|
+
errorResponse.stack = err.stack;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Include request path for debugging
|
|
160
|
+
if (process.env.NODE_ENV === 'development') {
|
|
161
|
+
errorResponse.path = req.path;
|
|
162
|
+
errorResponse.method = req.method;
|
|
163
|
+
}
|
|
164
|
+
res.status(statusCode).json(errorResponse);
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Async Error Wrapper
|
|
169
|
+
*
|
|
170
|
+
* Wraps async route handlers to automatically catch errors
|
|
171
|
+
*/ export function asyncHandler(fn) {
|
|
172
|
+
return (req, res, next)=>{
|
|
173
|
+
Promise.resolve(fn(req, res, next)).catch(next);
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 404 Handler
|
|
178
|
+
*/ export function notFoundHandler(req, res) {
|
|
179
|
+
res.status(404).json({
|
|
180
|
+
error: 'NOT_FOUND',
|
|
181
|
+
message: `Endpoint ${req.method} ${req.originalUrl} not found`,
|
|
182
|
+
timestamp: new Date().toISOString()
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Create error from validation result
|
|
187
|
+
*/ export function createValidationError(validationResult) {
|
|
188
|
+
const details = validationResult.errors?.map((error)=>({
|
|
189
|
+
field: error.path || error.field,
|
|
190
|
+
message: error.message,
|
|
191
|
+
value: error.value
|
|
192
|
+
}));
|
|
193
|
+
return new ValidationError('Validation failed', details);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Handle Prisma errors (if using Prisma ORM)
|
|
197
|
+
*/ export function handlePrismaError(err) {
|
|
198
|
+
switch(err.code){
|
|
199
|
+
case 'P2002':
|
|
200
|
+
return new ApiError('Unique constraint violation', 409, true, 'UNIQUE_VIOLATION', {
|
|
201
|
+
target: err.meta?.target
|
|
202
|
+
});
|
|
203
|
+
case 'P2025':
|
|
204
|
+
return new NotFoundError('Record', err.meta?.cause);
|
|
205
|
+
case 'P2003':
|
|
206
|
+
return new ValidationError('Foreign key constraint violation', {
|
|
207
|
+
field: err.meta?.field_name
|
|
208
|
+
});
|
|
209
|
+
case 'P2014':
|
|
210
|
+
return new ApiError('Relation violation', 400, true, 'RELATION_VIOLATION', {
|
|
211
|
+
relation: err.meta?.relation_name
|
|
212
|
+
});
|
|
213
|
+
case 'P2021':
|
|
214
|
+
return new ApiError('Table does not exist', 500, false, 'TABLE_NOT_FOUND', {
|
|
215
|
+
table: err.meta?.table
|
|
216
|
+
});
|
|
217
|
+
default:
|
|
218
|
+
return new ApiError('Database error', 500, false, 'DATABASE_ERROR', {
|
|
219
|
+
code: err.code,
|
|
220
|
+
message: err.message
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Handle Mongoose errors (if using Mongoose ODM)
|
|
226
|
+
*/ export function handleMongooseError(err) {
|
|
227
|
+
if (err.name === 'ValidationError') {
|
|
228
|
+
const details = Object.keys(err.errors).map((key)=>({
|
|
229
|
+
field: key,
|
|
230
|
+
message: err.errors[key].message,
|
|
231
|
+
value: err.errors[key].value
|
|
232
|
+
}));
|
|
233
|
+
return new ValidationError('Validation failed', details);
|
|
234
|
+
}
|
|
235
|
+
if (err.name === 'CastError') {
|
|
236
|
+
return new ValidationError(`Invalid ${err.path}: ${err.value}`);
|
|
237
|
+
}
|
|
238
|
+
if (err.code === 11000) {
|
|
239
|
+
const field = Object.keys(err.keyPattern)[0];
|
|
240
|
+
return new ApiError('Duplicate field value', 409, true, 'DUPLICATE_FIELD', {
|
|
241
|
+
field
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
return new ApiError('Database error', 500, false, 'DATABASE_ERROR', {
|
|
245
|
+
name: err.name,
|
|
246
|
+
message: err.message
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/web/api/middleware/error-handler.ts"],"names":["ApiError","Error","statusCode","isOperational","code","details","message","name","captureStackTrace","ValidationError","NotFoundError","resource","id","UnauthorizedError","ForbiddenError","RateLimitError","errorHandler","logger","err","req","res","next","errorCode","undefined","type","logData","error","stack","request","method","url","originalUrl","ip","userAgent","get","user","warn","errorResponse","timestamp","Date","toISOString","requestId","process","env","NODE_ENV","path","status","json","asyncHandler","fn","Promise","resolve","catch","notFoundHandler","createValidationError","validationResult","errors","map","field","value","handlePrismaError","target","meta","cause","field_name","relation","relation_name","table","handleMongooseError","Object","keys","key","keyPattern"],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request Logger Middleware
|
|
3
|
+
*
|
|
4
|
+
* HTTP request logging middleware for the transparency API server
|
|
5
|
+
*
|
|
6
|
+
* @module web/api/middleware/request-logger
|
|
7
|
+
*/ import { v4 as uuidv4 } from 'uuid';
|
|
8
|
+
/**
|
|
9
|
+
* Request Logger Middleware Factory
|
|
10
|
+
*/ export function requestLogger(logger) {
|
|
11
|
+
return (req, res, next)=>{
|
|
12
|
+
// Generate unique request ID
|
|
13
|
+
const requestId = uuidv4().slice(0, 8);
|
|
14
|
+
req.requestId = requestId;
|
|
15
|
+
req.startTime = Date.now();
|
|
16
|
+
// Set request ID in response headers
|
|
17
|
+
res.setHeader('X-Request-ID', requestId);
|
|
18
|
+
// Log request start
|
|
19
|
+
const requestLog = {
|
|
20
|
+
requestId,
|
|
21
|
+
method: req.method,
|
|
22
|
+
url: req.originalUrl,
|
|
23
|
+
ip: req.ip || req.connection.remoteAddress,
|
|
24
|
+
userAgent: req.get('User-Agent'),
|
|
25
|
+
contentLength: req.get('Content-Length') || 0,
|
|
26
|
+
contentType: req.get('Content-Type'),
|
|
27
|
+
referer: req.get('Referer'),
|
|
28
|
+
user: req.user?.id || 'anonymous',
|
|
29
|
+
timestamp: new Date().toISOString()
|
|
30
|
+
};
|
|
31
|
+
logger.info('Request started', requestLog);
|
|
32
|
+
// Override res.end to log response
|
|
33
|
+
const originalEnd = res.end;
|
|
34
|
+
res.end = function(...args) {
|
|
35
|
+
// Calculate duration
|
|
36
|
+
const duration = req.startTime ? Date.now() - req.startTime : 0;
|
|
37
|
+
// Log response
|
|
38
|
+
const responseLog = {
|
|
39
|
+
requestId,
|
|
40
|
+
method: req.method,
|
|
41
|
+
url: req.originalUrl,
|
|
42
|
+
statusCode: res.statusCode,
|
|
43
|
+
contentLength: res.get('Content-Length') || 0,
|
|
44
|
+
duration: `${duration}ms`,
|
|
45
|
+
ip: req.ip || req.connection.remoteAddress,
|
|
46
|
+
user: req.user?.id || 'anonymous',
|
|
47
|
+
timestamp: new Date().toISOString()
|
|
48
|
+
};
|
|
49
|
+
// Log based on status code
|
|
50
|
+
if (res.statusCode >= 500) {
|
|
51
|
+
logger.error('Request completed with server error', responseLog);
|
|
52
|
+
} else if (res.statusCode >= 400) {
|
|
53
|
+
logger.warn('Request completed with client error', responseLog);
|
|
54
|
+
} else if (res.statusCode >= 300) {
|
|
55
|
+
logger.info('Request completed with redirect', responseLog);
|
|
56
|
+
} else {
|
|
57
|
+
logger.info('Request completed successfully', responseLog);
|
|
58
|
+
}
|
|
59
|
+
// Call original end
|
|
60
|
+
originalEnd.apply(this, args);
|
|
61
|
+
};
|
|
62
|
+
next();
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Performance Logger Middleware
|
|
67
|
+
*
|
|
68
|
+
* Logs slow requests and performance metrics
|
|
69
|
+
*/ export function performanceLogger(logger, thresholdMs = 1000) {
|
|
70
|
+
return (req, res, next)=>{
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
res.on('finish', ()=>{
|
|
73
|
+
const duration = Date.now() - startTime;
|
|
74
|
+
if (duration > thresholdMs) {
|
|
75
|
+
logger.warn('Slow request detected', {
|
|
76
|
+
requestId: req.requestId,
|
|
77
|
+
method: req.method,
|
|
78
|
+
url: req.originalUrl,
|
|
79
|
+
duration: `${duration}ms`,
|
|
80
|
+
threshold: `${thresholdMs}ms`,
|
|
81
|
+
statusCode: res.statusCode,
|
|
82
|
+
user: req.user?.id || 'anonymous'
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
next();
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Security Logger Middleware
|
|
91
|
+
*
|
|
92
|
+
* Logs security-related events and suspicious activity
|
|
93
|
+
*/ export function securityLogger(logger) {
|
|
94
|
+
return (req, res, next)=>{
|
|
95
|
+
// Log suspicious user agents
|
|
96
|
+
const userAgent = req.get('User-Agent') || '';
|
|
97
|
+
const suspiciousPatterns = [
|
|
98
|
+
/bot/i,
|
|
99
|
+
/crawler/i,
|
|
100
|
+
/scanner/i,
|
|
101
|
+
/sqlmap/i,
|
|
102
|
+
/nikto/i,
|
|
103
|
+
/nmap/i,
|
|
104
|
+
/curl/i,
|
|
105
|
+
/wget/i
|
|
106
|
+
];
|
|
107
|
+
if (suspiciousPatterns.some((pattern)=>pattern.test(userAgent))) {
|
|
108
|
+
logger.warn('Suspicious user agent detected', {
|
|
109
|
+
requestId: req.requestId,
|
|
110
|
+
userAgent,
|
|
111
|
+
ip: req.ip,
|
|
112
|
+
url: req.originalUrl,
|
|
113
|
+
method: req.method,
|
|
114
|
+
timestamp: new Date().toISOString()
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Log requests to sensitive endpoints
|
|
118
|
+
const sensitiveEndpoints = [
|
|
119
|
+
'/api/v1/system',
|
|
120
|
+
'/api/v1/admin',
|
|
121
|
+
'/api/v1/users',
|
|
122
|
+
'/api/v1/auth'
|
|
123
|
+
];
|
|
124
|
+
if (sensitiveEndpoints.some((endpoint)=>req.path.startsWith(endpoint))) {
|
|
125
|
+
logger.info('Access to sensitive endpoint', {
|
|
126
|
+
requestId: req.requestId,
|
|
127
|
+
endpoint: req.path,
|
|
128
|
+
method: req.method,
|
|
129
|
+
ip: req.ip,
|
|
130
|
+
user: req.user?.id || 'anonymous',
|
|
131
|
+
timestamp: new Date().toISOString()
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Log failed authentication attempts
|
|
135
|
+
res.on('finish', ()=>{
|
|
136
|
+
if (res.statusCode === 401 && req.path.includes('/auth')) {
|
|
137
|
+
logger.warn('Authentication failed', {
|
|
138
|
+
requestId: req.requestId,
|
|
139
|
+
path: req.path,
|
|
140
|
+
method: req.method,
|
|
141
|
+
ip: req.ip,
|
|
142
|
+
userAgent,
|
|
143
|
+
timestamp: new Date().toISOString()
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Log authorization failures
|
|
147
|
+
if (res.statusCode === 403) {
|
|
148
|
+
logger.warn('Authorization failed', {
|
|
149
|
+
requestId: req.requestId,
|
|
150
|
+
path: req.path,
|
|
151
|
+
method: req.method,
|
|
152
|
+
ip: req.ip,
|
|
153
|
+
user: req.user?.id || 'anonymous',
|
|
154
|
+
timestamp: new Date().toISOString()
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
next();
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* API Metrics Logger Middleware
|
|
163
|
+
*
|
|
164
|
+
* Logs API usage metrics for monitoring and analytics
|
|
165
|
+
*/ export function metricsLogger(logger) {
|
|
166
|
+
const metrics = {
|
|
167
|
+
requests: 0,
|
|
168
|
+
errors: 0,
|
|
169
|
+
totalDuration: 0,
|
|
170
|
+
endpointCounts: new Map(),
|
|
171
|
+
methodCounts: new Map(),
|
|
172
|
+
statusCounts: new Map()
|
|
173
|
+
};
|
|
174
|
+
// Log metrics every 5 minutes
|
|
175
|
+
setInterval(()=>{
|
|
176
|
+
if (metrics.requests > 0) {
|
|
177
|
+
logger.info('API metrics summary', {
|
|
178
|
+
period: '5 minutes',
|
|
179
|
+
totalRequests: metrics.requests,
|
|
180
|
+
errorRate: `${(metrics.errors / metrics.requests * 100).toFixed(2)}%`,
|
|
181
|
+
averageDuration: `${(metrics.totalDuration / metrics.requests).toFixed(2)}ms`,
|
|
182
|
+
topEndpoints: Array.from(metrics.endpointCounts.entries()).sort((a, b)=>b[1] - a[1]).slice(0, 10),
|
|
183
|
+
methodDistribution: Object.fromEntries(metrics.methodCounts),
|
|
184
|
+
statusDistribution: Object.fromEntries(metrics.statusCounts)
|
|
185
|
+
});
|
|
186
|
+
// Reset metrics
|
|
187
|
+
metrics.requests = 0;
|
|
188
|
+
metrics.errors = 0;
|
|
189
|
+
metrics.totalDuration = 0;
|
|
190
|
+
metrics.endpointCounts.clear();
|
|
191
|
+
metrics.methodCounts.clear();
|
|
192
|
+
metrics.statusCounts.clear();
|
|
193
|
+
}
|
|
194
|
+
}, 5 * 60 * 1000);
|
|
195
|
+
return (req, res, next)=>{
|
|
196
|
+
const startTime = Date.now();
|
|
197
|
+
res.on('finish', ()=>{
|
|
198
|
+
const duration = Date.now() - startTime;
|
|
199
|
+
const endpoint = `${req.method} ${req.route?.path || req.path}`;
|
|
200
|
+
// Update metrics
|
|
201
|
+
metrics.requests++;
|
|
202
|
+
metrics.totalDuration += duration;
|
|
203
|
+
if (res.statusCode >= 400) {
|
|
204
|
+
metrics.errors++;
|
|
205
|
+
}
|
|
206
|
+
// Count endpoints
|
|
207
|
+
metrics.endpointCounts.set(endpoint, (metrics.endpointCounts.get(endpoint) || 0) + 1);
|
|
208
|
+
// Count methods
|
|
209
|
+
metrics.methodCounts.set(req.method, (metrics.methodCounts.get(req.method) || 0) + 1);
|
|
210
|
+
// Count status codes
|
|
211
|
+
metrics.statusCounts.set(res.statusCode, (metrics.statusCounts.get(res.statusCode) || 0) + 1);
|
|
212
|
+
});
|
|
213
|
+
next();
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
//# sourceMappingURL=request-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/web/api/middleware/request-logger.ts"],"names":["v4","uuidv4","requestLogger","logger","req","res","next","requestId","slice","startTime","Date","now","setHeader","requestLog","method","url","originalUrl","ip","connection","remoteAddress","userAgent","get","contentLength","contentType","referer","user","id","timestamp","toISOString","info","originalEnd","end","args","duration","responseLog","statusCode","error","warn","apply","performanceLogger","thresholdMs","on","threshold","securityLogger","suspiciousPatterns","some","pattern","test","sensitiveEndpoints","endpoint","path","startsWith","includes","metricsLogger","metrics","requests","errors","totalDuration","endpointCounts","Map","methodCounts","statusCounts","setInterval","period","totalRequests","errorRate","toFixed","averageDuration","topEndpoints","Array","from","entries","sort","a","b","methodDistribution","Object","fromEntries","statusDistribution","clear","route","set"],"mappings":"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"}
|