monora-ai 2.1.0 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +333 -159
  2. package/dist/aims_governance.d.ts +238 -0
  3. package/dist/aims_governance.d.ts.map +1 -0
  4. package/dist/aims_governance.js +922 -0
  5. package/dist/alerts.d.ts +16 -0
  6. package/dist/alerts.d.ts.map +1 -1
  7. package/dist/alerts.js +16 -0
  8. package/dist/api.d.ts +6 -0
  9. package/dist/api.d.ts.map +1 -1
  10. package/dist/api.js +6 -0
  11. package/dist/assessment.d.ts +85 -0
  12. package/dist/assessment.d.ts.map +1 -1
  13. package/dist/assessment.js +506 -13
  14. package/dist/attribution.d.ts +44 -3
  15. package/dist/attribution.d.ts.map +1 -1
  16. package/dist/attribution.js +197 -10
  17. package/dist/autodetect.d.ts +68 -0
  18. package/dist/autodetect.d.ts.map +1 -1
  19. package/dist/autodetect.js +639 -0
  20. package/dist/bias.d.ts +130 -0
  21. package/dist/bias.d.ts.map +1 -0
  22. package/dist/bias.js +223 -0
  23. package/dist/cli/diagnostics.d.ts +5 -1
  24. package/dist/cli/diagnostics.d.ts.map +1 -1
  25. package/dist/cli/diagnostics.js +23 -6
  26. package/dist/cli/doctor.d.ts +25 -0
  27. package/dist/cli/doctor.d.ts.map +1 -0
  28. package/dist/cli/doctor.js +381 -0
  29. package/dist/cli/fix.d.ts +16 -0
  30. package/dist/cli/fix.d.ts.map +1 -0
  31. package/dist/cli/fix.js +284 -0
  32. package/dist/cli/init.d.ts +57 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +205 -0
  35. package/dist/cli.js +1550 -176
  36. package/dist/complianceTargets.d.ts +111 -0
  37. package/dist/complianceTargets.d.ts.map +1 -0
  38. package/dist/complianceTargets.js +521 -0
  39. package/dist/config.d.ts +261 -16
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +381 -32
  42. package/dist/config_migrations.d.ts.map +1 -1
  43. package/dist/config_migrations.js +38 -1
  44. package/dist/config_schema.d.ts +2490 -1035
  45. package/dist/config_schema.d.ts.map +1 -1
  46. package/dist/config_schema.js +233 -64
  47. package/dist/context.d.ts +34 -0
  48. package/dist/context.d.ts.map +1 -1
  49. package/dist/context.js +118 -7
  50. package/dist/control_backbone.d.ts +122 -0
  51. package/dist/control_backbone.d.ts.map +1 -0
  52. package/dist/control_backbone.js +698 -0
  53. package/dist/data-governance.d.ts +187 -0
  54. package/dist/data-governance.d.ts.map +1 -0
  55. package/dist/data-governance.js +424 -0
  56. package/dist/dataResidency.d.ts +44 -0
  57. package/dist/dataResidency.d.ts.map +1 -0
  58. package/dist/dataResidency.js +203 -0
  59. package/dist/dispatcher.d.ts.map +1 -1
  60. package/dist/dispatcher.js +17 -5
  61. package/dist/evidence_store.d.ts +103 -0
  62. package/dist/evidence_store.d.ts.map +1 -0
  63. package/dist/evidence_store.js +459 -0
  64. package/dist/executiveSummary.d.ts +15 -0
  65. package/dist/executiveSummary.d.ts.map +1 -1
  66. package/dist/executiveSummary.js +135 -22
  67. package/dist/identity.d.ts +143 -0
  68. package/dist/identity.d.ts.map +1 -0
  69. package/dist/identity.js +231 -0
  70. package/dist/impact-assessment.d.ts +350 -0
  71. package/dist/impact-assessment.d.ts.map +1 -0
  72. package/dist/impact-assessment.js +580 -0
  73. package/dist/index.d.ts +20 -4
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +247 -5
  76. package/dist/instrumentation.d.ts +1 -1
  77. package/dist/instrumentation.d.ts.map +1 -1
  78. package/dist/instrumentation.js +123 -22
  79. package/dist/integrations/anthropic.d.ts +3 -0
  80. package/dist/integrations/anthropic.d.ts.map +1 -1
  81. package/dist/integrations/anthropic.js +282 -80
  82. package/dist/integrations/governance.d.ts +33 -0
  83. package/dist/integrations/governance.d.ts.map +1 -0
  84. package/dist/integrations/governance.js +208 -0
  85. package/dist/integrations/langchain.d.ts +4 -0
  86. package/dist/integrations/langchain.d.ts.map +1 -1
  87. package/dist/integrations/langchain.js +362 -142
  88. package/dist/integrations/openai.d.ts +9 -0
  89. package/dist/integrations/openai.d.ts.map +1 -1
  90. package/dist/integrations/openai.js +673 -73
  91. package/dist/iso42001_consolidation.d.ts +16 -0
  92. package/dist/iso42001_consolidation.d.ts.map +1 -0
  93. package/dist/iso42001_consolidation.js +413 -0
  94. package/dist/iso42001_workflows.d.ts +263 -0
  95. package/dist/iso42001_workflows.d.ts.map +1 -0
  96. package/dist/iso42001_workflows.js +781 -0
  97. package/dist/lifecycle.d.ts +299 -0
  98. package/dist/lifecycle.d.ts.map +1 -0
  99. package/dist/lifecycle.js +624 -0
  100. package/dist/lineage.d.ts +2 -2
  101. package/dist/lineage.d.ts.map +1 -1
  102. package/dist/lineage.js +9 -16
  103. package/dist/middleware/express.d.ts.map +1 -1
  104. package/dist/middleware/express.js +18 -3
  105. package/dist/middleware/nextjs.js +2 -2
  106. package/dist/model.d.ts +143 -0
  107. package/dist/model.d.ts.map +1 -0
  108. package/dist/model.js +371 -0
  109. package/dist/onboarding.d.ts +42 -0
  110. package/dist/onboarding.d.ts.map +1 -0
  111. package/dist/onboarding.js +1022 -0
  112. package/dist/oversight.d.ts +264 -0
  113. package/dist/oversight.d.ts.map +1 -0
  114. package/dist/oversight.js +497 -0
  115. package/dist/presets.js +7 -7
  116. package/dist/quotas.d.ts +171 -0
  117. package/dist/quotas.d.ts.map +1 -0
  118. package/dist/quotas.js +259 -0
  119. package/dist/register.d.ts +13 -0
  120. package/dist/register.d.ts.map +1 -0
  121. package/dist/register.js +99 -0
  122. package/dist/registry.d.ts +1 -0
  123. package/dist/registry.d.ts.map +1 -1
  124. package/dist/registry.js +7 -0
  125. package/dist/registryData.json +43 -6
  126. package/dist/report.d.ts +2 -1
  127. package/dist/report.d.ts.map +1 -1
  128. package/dist/report.js +189 -2
  129. package/dist/reporting.d.ts +125 -0
  130. package/dist/reporting.d.ts.map +1 -1
  131. package/dist/reporting.js +192 -2
  132. package/dist/resources.d.ts +285 -0
  133. package/dist/resources.d.ts.map +1 -0
  134. package/dist/resources.js +643 -0
  135. package/dist/risk.d.ts +120 -0
  136. package/dist/risk.d.ts.map +1 -0
  137. package/dist/risk.js +220 -0
  138. package/dist/runtime.d.ts +73 -0
  139. package/dist/runtime.d.ts.map +1 -1
  140. package/dist/runtime.js +415 -18
  141. package/dist/schemaInference.d.ts +92 -0
  142. package/dist/schemaInference.d.ts.map +1 -0
  143. package/dist/schemaInference.js +466 -0
  144. package/dist/schema_validation.js +2 -2
  145. package/dist/schemas/config.schema.json +118 -4
  146. package/dist/security_report.js +4 -4
  147. package/dist/signing.d.ts +1 -1
  148. package/dist/signing.d.ts.map +1 -1
  149. package/dist/signing.js +4 -0
  150. package/dist/sinks/file.d.ts +19 -1
  151. package/dist/sinks/file.d.ts.map +1 -1
  152. package/dist/sinks/file.js +82 -13
  153. package/dist/sinks/https.d.ts +10 -0
  154. package/dist/sinks/https.d.ts.map +1 -1
  155. package/dist/sinks/https.js +76 -16
  156. package/dist/sinks/stdout.d.ts +1 -0
  157. package/dist/sinks/stdout.d.ts.map +1 -1
  158. package/dist/sinks/stdout.js +12 -1
  159. package/dist/spec.d.ts +159 -0
  160. package/dist/spec.d.ts.map +1 -0
  161. package/dist/spec.js +391 -0
  162. package/dist/stakeholders.d.ts +199 -0
  163. package/dist/stakeholders.d.ts.map +1 -0
  164. package/dist/stakeholders.js +398 -0
  165. package/dist/standards.d.ts.map +1 -1
  166. package/dist/standards.js +160 -2
  167. package/dist/standards_ingest.d.ts.map +1 -1
  168. package/dist/standards_ingest.js +1 -4
  169. package/dist/telemetry.d.ts +16 -2
  170. package/dist/telemetry.d.ts.map +1 -1
  171. package/dist/telemetry.js +77 -14
  172. package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
  173. package/dist/traced_emitter.d.ts.map +1 -1
  174. package/dist/traced_emitter.js +19 -9
  175. package/dist/trust_package.d.ts +19 -1
  176. package/dist/trust_package.d.ts.map +1 -1
  177. package/dist/trust_package.js +89 -2
  178. package/dist/verify.d.ts.map +1 -1
  179. package/dist/verify.js +9 -2
  180. package/dist/wal.d.ts.map +1 -1
  181. package/dist/wal.js +2 -1
  182. package/package.json +14 -1
  183. package/scripts/postinstall.js +105 -210
  184. package/templates/controls/iso42001_control_catalog.json +1443 -0
package/dist/standards.js CHANGED
@@ -243,6 +243,150 @@ function buildCoverageSummary(claims) {
243
243
  }
244
244
  return summary;
245
245
  }
246
+ function claimSeverity(options) {
247
+ const { status, checks, insufficientReasons } = options;
248
+ if (status === 'corroborated') {
249
+ return 'none';
250
+ }
251
+ const failedTypes = new Set(checks
252
+ .filter((check) => check && check.status === 'failed')
253
+ .map((check) => String(check.type)));
254
+ if (status === 'disproved') {
255
+ if (failedTypes.has('hash_chain_status') || failedTypes.has('signatures_status')) {
256
+ return 'critical';
257
+ }
258
+ if (failedTypes.has('policy_violations_max') ||
259
+ failedTypes.has('forbidden_models_max') ||
260
+ failedTypes.has('config_required')) {
261
+ return 'high';
262
+ }
263
+ return 'medium';
264
+ }
265
+ const reasonCodes = new Set(insufficientReasons
266
+ .filter((reason) => reason && typeof reason === 'object' && reason.code)
267
+ .map((reason) => String(reason.code)));
268
+ if (reasonCodes.has('missing_required_excerpts')) {
269
+ return 'high';
270
+ }
271
+ if (reasonCodes.has('unverified_excerpts') || reasonCodes.has('check_skipped')) {
272
+ return 'medium';
273
+ }
274
+ return 'low';
275
+ }
276
+ function claimRemediation(options) {
277
+ const { status, checks, insufficientReasons } = options;
278
+ if (status === 'corroborated') {
279
+ return { summary: 'No action required.', actions: [] };
280
+ }
281
+ const actions = [];
282
+ for (const check of checks) {
283
+ if (!check || check.status !== 'failed') {
284
+ continue;
285
+ }
286
+ const checkType = String(check.type || '');
287
+ if (checkType === 'policy_violations_max') {
288
+ actions.push('Resolve policy violations and reduce violation count below threshold.');
289
+ }
290
+ else if (checkType === 'unknown_models_max') {
291
+ actions.push('Register unknown models in the registry or block their usage.');
292
+ }
293
+ else if (checkType === 'forbidden_models_max') {
294
+ actions.push('Remove blocked/forbidden models from runtime traffic.');
295
+ }
296
+ else if (checkType === 'hash_chain_status') {
297
+ actions.push('Fix hash-chain integrity issues and re-verify emitted events.');
298
+ }
299
+ else if (checkType === 'signatures_status') {
300
+ actions.push('Enable valid signing keys and verify event signatures.');
301
+ }
302
+ else if (checkType === 'sequence_gaps_max') {
303
+ actions.push('Investigate event sequence gaps and restore event continuity.');
304
+ }
305
+ else if (checkType === 'errors_max') {
306
+ actions.push('Reduce runtime errors and capture complete error diagnostics.');
307
+ }
308
+ else if (checkType === 'config_required') {
309
+ const pathLabel = check.details?.path;
310
+ const expected = check.details?.expected;
311
+ actions.push(`Set required config '${pathLabel}' to '${expected}' and redeploy.`);
312
+ }
313
+ }
314
+ for (const reason of insufficientReasons) {
315
+ const code = String(reason?.code || '');
316
+ if (code === 'missing_required_excerpts') {
317
+ actions.push('Attach required report excerpts for this claim.');
318
+ }
319
+ else if (code === 'unverified_excerpts') {
320
+ actions.push('Provide excerpt hashes/report linkage so evidence can be verified.');
321
+ }
322
+ else if (code === 'check_skipped') {
323
+ actions.push('Provide missing config/evidence inputs so skipped checks can execute.');
324
+ }
325
+ }
326
+ const deduped = Array.from(new Set(actions));
327
+ const summary = deduped.length > 0
328
+ ? deduped[0]
329
+ : 'Investigate missing or failing evidence and rerun standards evaluation.';
330
+ return { summary, actions: deduped.slice(0, 8) };
331
+ }
332
+ function buildFindingsSummary(claims) {
333
+ const severityLevels = ['critical', 'high', 'medium', 'low', 'none'];
334
+ const totals = Object.fromEntries(severityLevels.map((level) => [level, 0]));
335
+ const byStandard = {};
336
+ const statusBreakdown = {
337
+ corroborated: 0,
338
+ disproved: 0,
339
+ insufficient_evidence: 0,
340
+ };
341
+ const remediationRecommendations = [];
342
+ for (const claim of claims) {
343
+ const standard = String(claim.standard || 'unspecified');
344
+ let severity = String(claim.severity || 'none');
345
+ const status = String(claim.status || 'insufficient_evidence');
346
+ if (!(severity in totals)) {
347
+ severity = 'low';
348
+ }
349
+ totals[severity] += 1;
350
+ statusBreakdown[status] = (statusBreakdown[status] || 0) + 1;
351
+ if (!byStandard[standard]) {
352
+ byStandard[standard] = Object.fromEntries(severityLevels.map((level) => [level, 0]));
353
+ }
354
+ byStandard[standard][severity] = (byStandard[standard][severity] || 0) + 1;
355
+ const remediation = claim.remediation && typeof claim.remediation === 'object'
356
+ ? claim.remediation
357
+ : {};
358
+ if (typeof remediation.summary === 'string' && remediation.summary.length > 0) {
359
+ remediationRecommendations.push({
360
+ claim_id: claim.id,
361
+ standard,
362
+ severity,
363
+ summary: remediation.summary,
364
+ actions: Array.isArray(remediation.actions) ? remediation.actions.slice(0, 3) : [],
365
+ });
366
+ }
367
+ }
368
+ const severityRank = {
369
+ critical: 0,
370
+ high: 1,
371
+ medium: 2,
372
+ low: 3,
373
+ none: 4,
374
+ };
375
+ remediationRecommendations.sort((a, b) => {
376
+ const left = severityRank[String(a.severity)] ?? 5;
377
+ const right = severityRank[String(b.severity)] ?? 5;
378
+ if (left !== right) {
379
+ return left - right;
380
+ }
381
+ return String(a.claim_id || '').localeCompare(String(b.claim_id || ''));
382
+ });
383
+ return {
384
+ totals,
385
+ by_standard: byStandard,
386
+ status_breakdown: statusBreakdown,
387
+ remediation_recommendations: remediationRecommendations.slice(0, 20),
388
+ };
389
+ }
246
390
  function checkHashChain(events, config) {
247
391
  const immutability = (config || {}).immutability || {};
248
392
  const scope = immutability.scope || 'per_trace';
@@ -383,7 +527,7 @@ function buildCallInventory(events, maxCalls) {
383
527
  return { by_event_type: byType, llm_call_samples: calls };
384
528
  }
385
529
  function buildModelInventory(events, config) {
386
- const report = (0, report_1.buildReport)(events, (config || {}).policies);
530
+ const report = (0, report_1.buildReport)(events, (config || {}).policies, (config || {}).registry);
387
531
  const byModel = report.by_model || {};
388
532
  const registry = new registry_1.ModelRegistry((config || {}).registry || {});
389
533
  const inventory = [];
@@ -815,6 +959,16 @@ function evaluateClaims(claims, evidence, config, events, verifiedExcerpts, exce
815
959
  else if (claimSkipped) {
816
960
  overallStatus = 'insufficient_evidence';
817
961
  }
962
+ const severity = claimSeverity({
963
+ status: overallStatus,
964
+ checks: checkResults,
965
+ insufficientReasons,
966
+ });
967
+ const remediation = claimRemediation({
968
+ status: overallStatus,
969
+ checks: checkResults,
970
+ insufficientReasons,
971
+ });
818
972
  const evidenceIds = Array.from(new Set(checkResults.flatMap((check) => check.evidence_event_ids || [])));
819
973
  const eventGraph = evidenceIds.length > 0 ? buildEventGraph(events, evidenceIds) : {
820
974
  nodes: [],
@@ -830,6 +984,8 @@ function evaluateClaims(claims, evidence, config, events, verifiedExcerpts, exce
830
984
  section: claim.section,
831
985
  statement: claim.statement,
832
986
  status: overallStatus,
987
+ severity,
988
+ remediation,
833
989
  checks: checkResults,
834
990
  evidence_event_ids: evidenceIds,
835
991
  causal_paths: evidenceIds.length > 0 ? buildCausalPaths(events, evidenceIds) : {},
@@ -846,7 +1002,7 @@ function buildStandardsReport(options) {
846
1002
  const { events, config, reportPath, claimsPath, maxCalls = 25 } = options;
847
1003
  const { metadata, claims, excerpts, reportSource } = loadClaims(reportPath, claimsPath);
848
1004
  validateClaims(claims);
849
- const report = (0, report_1.buildReport)(events, (config || {}).policies);
1005
+ const report = (0, report_1.buildReport)(events, (config || {}).policies, (config || {}).registry);
850
1006
  const evidence = report.evidence || {};
851
1007
  evidence.unknown_models_used = report.model_compliance?.unknown_models_used || [];
852
1008
  evidence.forbidden_models_blocked = report.model_compliance?.forbidden_models_blocked || [];
@@ -859,6 +1015,7 @@ function buildStandardsReport(options) {
859
1015
  const { normalized: normalizedExcerpts, verified, issues } = normalizeExcerpts(excerpts, resolvedReportSource);
860
1016
  const evaluatedClaims = evaluateClaims(claims, evidence, config, events, verified, issues);
861
1017
  const coverageSummary = buildCoverageSummary(evaluatedClaims);
1018
+ const findingsSummary = buildFindingsSummary(evaluatedClaims);
862
1019
  const excerptsSummary = {
863
1020
  total: normalizedExcerpts.length,
864
1021
  verified: Object.keys(verified).length,
@@ -882,5 +1039,6 @@ function buildStandardsReport(options) {
882
1039
  evidence,
883
1040
  claims: evaluatedClaims,
884
1041
  coverage_summary: coverageSummary,
1042
+ findings_summary: findingsSummary,
885
1043
  };
886
1044
  }
@@ -1 +1 @@
1
- {"version":3,"file":"standards_ingest.d.ts","sourceRoot":"","sources":["../src/standards_ingest.ts"],"names":[],"mappings":"AAqIA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAyB/B;AA6CD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AA4BD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CA4D7B;AAoPD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACxC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAU/B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAW/B"}
1
+ {"version":3,"file":"standards_ingest.d.ts","sourceRoot":"","sources":["../src/standards_ingest.ts"],"names":[],"mappings":"AAkIA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAyB/B;AA6CD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvD;AA4BD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CA4D7B;AAoPD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CACxC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAU/B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAW/B"}
@@ -129,10 +129,7 @@ function extractPdfOcr(reportPath) {
129
129
  }
130
130
  finally {
131
131
  try {
132
- for (const entry of fs.readdirSync(tempDir)) {
133
- fs.unlinkSync(path.join(tempDir, entry));
134
- }
135
- fs.rmdirSync(tempDir);
132
+ fs.rmSync(tempDir, { recursive: true, force: true });
136
133
  }
137
134
  catch {
138
135
  // best-effort cleanup
@@ -60,6 +60,19 @@ export declare class MinimalBackend extends MetricsBackend {
60
60
  observe(_name: string, _value: number, _labels?: Record<string, string>): void;
61
61
  close(): Promise<void>;
62
62
  }
63
+ /**
64
+ * In-memory backend that records all metrics for debugging/testing.
65
+ */
66
+ export declare class MemoryBackend extends MetricsBackend {
67
+ private counters;
68
+ private gauges;
69
+ private histograms;
70
+ private formatKey;
71
+ increment(name: string, value?: number, labels?: Record<string, string>): void;
72
+ gauge(name: string, value: number, labels?: Record<string, string>): void;
73
+ observe(name: string, value: number, labels?: Record<string, string>): void;
74
+ close(): Promise<void>;
75
+ }
63
76
  /**
64
77
  * Prometheus metrics backend.
65
78
  *
@@ -67,6 +80,7 @@ export declare class MinimalBackend extends MetricsBackend {
67
80
  */
68
81
  export declare class PrometheusBackend extends MetricsBackend {
69
82
  private metrics;
83
+ private registry;
70
84
  private pushGateway?;
71
85
  private jobName;
72
86
  private server?;
@@ -107,11 +121,11 @@ export declare class StatsdBackend extends MetricsBackend {
107
121
  */
108
122
  export interface TelemetryConfig {
109
123
  enabled?: boolean;
110
- backend?: 'minimal' | 'prometheus' | 'statsd';
124
+ backend?: 'none' | 'minimal' | 'memory' | 'prometheus' | 'statsd';
111
125
  prometheus?: {
112
126
  port?: number;
113
127
  start_server?: boolean;
114
- push_gateway?: string;
128
+ push_gateway?: string | null;
115
129
  job_name?: string;
116
130
  };
117
131
  statsd?: {
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/dist/telemetry.js CHANGED
@@ -39,7 +39,7 @@ var __importStar = (this && this.__importStar) || (function () {
39
39
  };
40
40
  })();
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.Timer = exports.MetricsCollector = exports.StatsdBackend = exports.PrometheusBackend = exports.MinimalBackend = exports.NoopBackend = exports.MetricsBackend = exports.MONORA_METRICS = exports.MetricType = exports.STATSD_AVAILABLE = exports.PROMETHEUS_AVAILABLE = void 0;
42
+ exports.Timer = exports.MetricsCollector = exports.StatsdBackend = exports.PrometheusBackend = exports.MemoryBackend = exports.MinimalBackend = exports.NoopBackend = exports.MetricsBackend = exports.MONORA_METRICS = exports.MetricType = exports.STATSD_AVAILABLE = exports.PROMETHEUS_AVAILABLE = void 0;
43
43
  exports.getMetricsCollector = getMetricsCollector;
44
44
  exports.initMetrics = initMetrics;
45
45
  exports.closeMetrics = closeMetrics;
@@ -284,6 +284,44 @@ class MinimalBackend extends MetricsBackend {
284
284
  }
285
285
  }
286
286
  exports.MinimalBackend = MinimalBackend;
287
+ /**
288
+ * In-memory backend that records all metrics for debugging/testing.
289
+ */
290
+ class MemoryBackend extends MetricsBackend {
291
+ constructor() {
292
+ super(...arguments);
293
+ this.counters = new Map();
294
+ this.gauges = new Map();
295
+ this.histograms = new Map();
296
+ }
297
+ formatKey(name, labels) {
298
+ if (!labels || Object.keys(labels).length === 0) {
299
+ return name;
300
+ }
301
+ const entries = Object.entries(labels).sort(([a], [b]) => a.localeCompare(b));
302
+ const suffix = entries.map(([key, value]) => `${key}=${value}`).join(',');
303
+ return `${name}|${suffix}`;
304
+ }
305
+ increment(name, value = 1, labels) {
306
+ const key = this.formatKey(name, labels);
307
+ const current = this.counters.get(key) || 0;
308
+ this.counters.set(key, current + value);
309
+ }
310
+ gauge(name, value, labels) {
311
+ const key = this.formatKey(name, labels);
312
+ this.gauges.set(key, value);
313
+ }
314
+ observe(name, value, labels) {
315
+ const key = this.formatKey(name, labels);
316
+ const current = this.histograms.get(key) || [];
317
+ current.push(value);
318
+ this.histograms.set(key, current);
319
+ }
320
+ async close() {
321
+ // No-op
322
+ }
323
+ }
324
+ exports.MemoryBackend = MemoryBackend;
287
325
  /**
288
326
  * Prometheus metrics backend.
289
327
  *
@@ -300,8 +338,9 @@ class PrometheusBackend extends MetricsBackend {
300
338
  }
301
339
  this.pushGateway = options.pushGateway;
302
340
  this.jobName = options.jobName || 'monora';
341
+ this.registry = new promClient.Registry();
303
342
  // Collect default metrics
304
- promClient.collectDefaultMetrics({ prefix: 'monora_' });
343
+ promClient.collectDefaultMetrics({ prefix: 'monora_', register: this.registry });
305
344
  // Register Monora metrics
306
345
  this.registerMetrics();
307
346
  // Start HTTP server for scraping
@@ -310,25 +349,28 @@ class PrometheusBackend extends MetricsBackend {
310
349
  try {
311
350
  // eslint-disable-next-line @typescript-eslint/no-var-requires
312
351
  const http = require('http');
313
- this.server = http.createServer(async (req, res) => {
352
+ const server = http.createServer(async (req, res) => {
314
353
  if (req.url === '/metrics') {
315
- res.setHeader('Content-Type', promClient.register.contentType);
316
- res.end(await promClient.register.metrics());
354
+ res.setHeader('Content-Type', this.registry.contentType);
355
+ res.end(await this.registry.metrics());
317
356
  }
318
357
  else {
319
358
  res.statusCode = 404;
320
359
  res.end('Not found');
321
360
  }
322
361
  });
323
- this.server.on('error', (error) => {
362
+ server.on('error', (error) => {
324
363
  logger_1.logger.warning('Failed to start Prometheus server on port %d: %s', port, error);
364
+ this.server = null;
325
365
  });
326
- this.server.listen(port, () => {
366
+ server.listen(port, () => {
367
+ this.server = server;
327
368
  logger_1.logger.info('Prometheus metrics server started on port %d', port);
328
369
  });
329
370
  }
330
371
  catch (error) {
331
372
  logger_1.logger.warning('Failed to start Prometheus server on port %d: %s', port, error);
373
+ this.server = null;
332
374
  }
333
375
  }
334
376
  }
@@ -340,6 +382,7 @@ class PrometheusBackend extends MetricsBackend {
340
382
  name,
341
383
  help: definition.description,
342
384
  labelNames: definition.labels || [],
385
+ registers: [this.registry],
343
386
  }));
344
387
  }
345
388
  else if (definition.type === MetricType.GAUGE) {
@@ -347,6 +390,7 @@ class PrometheusBackend extends MetricsBackend {
347
390
  name,
348
391
  help: definition.description,
349
392
  labelNames: definition.labels || [],
393
+ registers: [this.registry],
350
394
  }));
351
395
  }
352
396
  else if (definition.type === MetricType.HISTOGRAM) {
@@ -355,12 +399,13 @@ class PrometheusBackend extends MetricsBackend {
355
399
  help: definition.description,
356
400
  labelNames: definition.labels || [],
357
401
  buckets: definition.buckets,
402
+ registers: [this.registry],
358
403
  }));
359
404
  }
360
405
  }
361
406
  catch {
362
407
  // Metric already registered
363
- const existing = promClient.register.getSingleMetric(name);
408
+ const existing = this.registry.getSingleMetric(name);
364
409
  if (existing) {
365
410
  this.metrics.set(name, existing);
366
411
  }
@@ -404,7 +449,7 @@ class PrometheusBackend extends MetricsBackend {
404
449
  if (!this.pushGateway)
405
450
  return;
406
451
  try {
407
- const gateway = new promClient.Pushgateway(this.pushGateway);
452
+ const gateway = new promClient.Pushgateway(this.pushGateway, {}, this.registry);
408
453
  await gateway.pushAdd({ jobName: this.jobName });
409
454
  }
410
455
  catch (error) {
@@ -443,7 +488,7 @@ class PrometheusBackend extends MetricsBackend {
443
488
  if (this.server) {
444
489
  await this.closeServer();
445
490
  }
446
- promClient.register.clear();
491
+ this.registry.clear();
447
492
  }
448
493
  }
449
494
  exports.PrometheusBackend = PrometheusBackend;
@@ -492,7 +537,15 @@ class StatsdBackend extends MetricsBackend {
492
537
  this.client.timing(formatted, value * 1000);
493
538
  }
494
539
  async close() {
495
- this.client.close();
540
+ await new Promise((resolve, reject) => {
541
+ this.client.close((error) => {
542
+ if (error) {
543
+ reject(error);
544
+ return;
545
+ }
546
+ resolve();
547
+ });
548
+ });
496
549
  }
497
550
  }
498
551
  exports.StatsdBackend = StatsdBackend;
@@ -511,16 +564,24 @@ class MetricsCollector {
511
564
  }
512
565
  const backendType = telemetryConfig.backend || 'minimal';
513
566
  try {
514
- if (backendType === 'minimal') {
567
+ if (backendType === 'none') {
568
+ this.backend = new NoopBackend();
569
+ this._enabled = false;
570
+ }
571
+ else if (backendType === 'minimal') {
515
572
  this.backend = new MinimalBackend();
516
573
  this._enabled = true;
517
574
  }
575
+ else if (backendType === 'memory') {
576
+ this.backend = new MemoryBackend();
577
+ this._enabled = true;
578
+ }
518
579
  else if (backendType === 'prometheus') {
519
580
  const promConfig = telemetryConfig.prometheus || {};
520
581
  this.backend = new PrometheusBackend({
521
582
  port: promConfig.port,
522
583
  startServer: promConfig.start_server,
523
- pushGateway: promConfig.push_gateway,
584
+ pushGateway: promConfig.push_gateway || undefined,
524
585
  jobName: promConfig.job_name,
525
586
  });
526
587
  this._enabled = true;
@@ -611,8 +672,10 @@ async function initMetrics(config) {
611
672
  async function closeMetrics() {
612
673
  if (globalCollector) {
613
674
  const collector = globalCollector;
614
- globalCollector = null;
615
675
  await collector.close();
676
+ if (globalCollector === collector) {
677
+ globalCollector = null;
678
+ }
616
679
  }
617
680
  }
618
681
  // Convenience functions for common metrics