monora-ai 2.0.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 (202) hide show
  1. package/README.md +441 -150
  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 +269 -0
  12. package/dist/assessment.d.ts.map +1 -0
  13. package/dist/assessment.js +1232 -0
  14. package/dist/attestation.js +23 -1
  15. package/dist/attribution.d.ts +349 -0
  16. package/dist/attribution.d.ts.map +1 -0
  17. package/dist/attribution.js +987 -0
  18. package/dist/autodetect.d.ts +69 -1
  19. package/dist/autodetect.d.ts.map +1 -1
  20. package/dist/autodetect.js +644 -1
  21. package/dist/bias.d.ts +130 -0
  22. package/dist/bias.d.ts.map +1 -0
  23. package/dist/bias.js +223 -0
  24. package/dist/circuit_breaker.js +3 -3
  25. package/dist/cli/diagnostics.d.ts +5 -1
  26. package/dist/cli/diagnostics.d.ts.map +1 -1
  27. package/dist/cli/diagnostics.js +31 -8
  28. package/dist/cli/doctor.d.ts +25 -0
  29. package/dist/cli/doctor.d.ts.map +1 -0
  30. package/dist/cli/doctor.js +381 -0
  31. package/dist/cli/fix.d.ts +16 -0
  32. package/dist/cli/fix.d.ts.map +1 -0
  33. package/dist/cli/fix.js +284 -0
  34. package/dist/cli/init.d.ts +57 -0
  35. package/dist/cli/init.d.ts.map +1 -0
  36. package/dist/cli/init.js +205 -0
  37. package/dist/cli.js +1611 -126
  38. package/dist/complianceTargets.d.ts +111 -0
  39. package/dist/complianceTargets.d.ts.map +1 -0
  40. package/dist/complianceTargets.js +521 -0
  41. package/dist/config.d.ts +301 -17
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +428 -36
  44. package/dist/config_migrations.d.ts +41 -0
  45. package/dist/config_migrations.d.ts.map +1 -1
  46. package/dist/config_migrations.js +205 -0
  47. package/dist/config_schema.d.ts +2900 -731
  48. package/dist/config_schema.d.ts.map +1 -1
  49. package/dist/config_schema.js +257 -55
  50. package/dist/context.d.ts +34 -0
  51. package/dist/context.d.ts.map +1 -1
  52. package/dist/context.js +118 -7
  53. package/dist/control_backbone.d.ts +122 -0
  54. package/dist/control_backbone.d.ts.map +1 -0
  55. package/dist/control_backbone.js +698 -0
  56. package/dist/data-governance.d.ts +187 -0
  57. package/dist/data-governance.d.ts.map +1 -0
  58. package/dist/data-governance.js +424 -0
  59. package/dist/dataResidency.d.ts +44 -0
  60. package/dist/dataResidency.d.ts.map +1 -0
  61. package/dist/dataResidency.js +203 -0
  62. package/dist/dispatcher.d.ts +32 -0
  63. package/dist/dispatcher.d.ts.map +1 -1
  64. package/dist/dispatcher.js +91 -4
  65. package/dist/events.d.ts.map +1 -1
  66. package/dist/events.js +38 -0
  67. package/dist/evidence_store.d.ts +103 -0
  68. package/dist/evidence_store.d.ts.map +1 -0
  69. package/dist/evidence_store.js +459 -0
  70. package/dist/executiveSummary.d.ts +65 -8
  71. package/dist/executiveSummary.d.ts.map +1 -1
  72. package/dist/executiveSummary.js +289 -26
  73. package/dist/identity.d.ts +143 -0
  74. package/dist/identity.d.ts.map +1 -0
  75. package/dist/identity.js +231 -0
  76. package/dist/impact-assessment.d.ts +350 -0
  77. package/dist/impact-assessment.d.ts.map +1 -0
  78. package/dist/impact-assessment.js +580 -0
  79. package/dist/index.d.ts +25 -5
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +300 -4
  82. package/dist/instrumentation.d.ts +1 -1
  83. package/dist/instrumentation.d.ts.map +1 -1
  84. package/dist/instrumentation.js +243 -27
  85. package/dist/integrations/anthropic.d.ts +3 -0
  86. package/dist/integrations/anthropic.d.ts.map +1 -1
  87. package/dist/integrations/anthropic.js +284 -79
  88. package/dist/integrations/governance.d.ts +33 -0
  89. package/dist/integrations/governance.d.ts.map +1 -0
  90. package/dist/integrations/governance.js +208 -0
  91. package/dist/integrations/langchain.d.ts +7 -0
  92. package/dist/integrations/langchain.d.ts.map +1 -1
  93. package/dist/integrations/langchain.js +387 -143
  94. package/dist/integrations/openai.d.ts +9 -0
  95. package/dist/integrations/openai.d.ts.map +1 -1
  96. package/dist/integrations/openai.js +673 -73
  97. package/dist/iso42001_consolidation.d.ts +16 -0
  98. package/dist/iso42001_consolidation.d.ts.map +1 -0
  99. package/dist/iso42001_consolidation.js +413 -0
  100. package/dist/iso42001_workflows.d.ts +263 -0
  101. package/dist/iso42001_workflows.d.ts.map +1 -0
  102. package/dist/iso42001_workflows.js +781 -0
  103. package/dist/lifecycle.d.ts +299 -0
  104. package/dist/lifecycle.d.ts.map +1 -0
  105. package/dist/lifecycle.js +624 -0
  106. package/dist/lineage.d.ts +2 -2
  107. package/dist/lineage.d.ts.map +1 -1
  108. package/dist/lineage.js +12 -17
  109. package/dist/middleware/express.d.ts.map +1 -1
  110. package/dist/middleware/express.js +33 -3
  111. package/dist/middleware/nextjs.d.ts.map +1 -1
  112. package/dist/middleware/nextjs.js +42 -68
  113. package/dist/model.d.ts +143 -0
  114. package/dist/model.d.ts.map +1 -0
  115. package/dist/model.js +371 -0
  116. package/dist/onboarding.d.ts +42 -0
  117. package/dist/onboarding.d.ts.map +1 -0
  118. package/dist/onboarding.js +1022 -0
  119. package/dist/oversight.d.ts +264 -0
  120. package/dist/oversight.d.ts.map +1 -0
  121. package/dist/oversight.js +497 -0
  122. package/dist/pdf_report.d.ts.map +1 -1
  123. package/dist/pdf_report.js +42 -21
  124. package/dist/presets.d.ts +88 -0
  125. package/dist/presets.d.ts.map +1 -0
  126. package/dist/presets.js +520 -0
  127. package/dist/propagation.d.ts.map +1 -1
  128. package/dist/propagation.js +34 -2
  129. package/dist/quotas.d.ts +171 -0
  130. package/dist/quotas.d.ts.map +1 -0
  131. package/dist/quotas.js +259 -0
  132. package/dist/register.d.ts +13 -0
  133. package/dist/register.d.ts.map +1 -0
  134. package/dist/register.js +99 -0
  135. package/dist/registry.d.ts +1 -0
  136. package/dist/registry.d.ts.map +1 -1
  137. package/dist/registry.js +7 -0
  138. package/dist/registryData.json +43 -6
  139. package/dist/report.d.ts +2 -1
  140. package/dist/report.d.ts.map +1 -1
  141. package/dist/report.js +189 -2
  142. package/dist/reporting.d.ts +125 -0
  143. package/dist/reporting.d.ts.map +1 -1
  144. package/dist/reporting.js +196 -5
  145. package/dist/resources.d.ts +285 -0
  146. package/dist/resources.d.ts.map +1 -0
  147. package/dist/resources.js +643 -0
  148. package/dist/risk.d.ts +120 -0
  149. package/dist/risk.d.ts.map +1 -0
  150. package/dist/risk.js +220 -0
  151. package/dist/runtime.d.ts +74 -1
  152. package/dist/runtime.d.ts.map +1 -1
  153. package/dist/runtime.js +598 -22
  154. package/dist/schemaInference.d.ts +92 -0
  155. package/dist/schemaInference.d.ts.map +1 -0
  156. package/dist/schemaInference.js +466 -0
  157. package/dist/schema_validation.js +2 -2
  158. package/dist/schemas/config.schema.json +169 -6
  159. package/dist/schemas/event.schema.json +4 -0
  160. package/dist/security_report.js +4 -4
  161. package/dist/signing.d.ts +1 -1
  162. package/dist/signing.d.ts.map +1 -1
  163. package/dist/signing.js +4 -0
  164. package/dist/sinks/file.d.ts +19 -1
  165. package/dist/sinks/file.d.ts.map +1 -1
  166. package/dist/sinks/file.js +82 -13
  167. package/dist/sinks/https.d.ts +10 -0
  168. package/dist/sinks/https.d.ts.map +1 -1
  169. package/dist/sinks/https.js +76 -16
  170. package/dist/sinks/stdout.d.ts +1 -0
  171. package/dist/sinks/stdout.d.ts.map +1 -1
  172. package/dist/sinks/stdout.js +12 -1
  173. package/dist/spec.d.ts +159 -0
  174. package/dist/spec.d.ts.map +1 -0
  175. package/dist/spec.js +391 -0
  176. package/dist/stakeholders.d.ts +199 -0
  177. package/dist/stakeholders.d.ts.map +1 -0
  178. package/dist/stakeholders.js +398 -0
  179. package/dist/standards.d.ts.map +1 -1
  180. package/dist/standards.js +160 -2
  181. package/dist/standards_ingest.d.ts +2 -2
  182. package/dist/standards_ingest.d.ts.map +1 -1
  183. package/dist/standards_ingest.js +105 -23
  184. package/dist/streaming.d.ts.map +1 -1
  185. package/dist/streaming.js +7 -2
  186. package/dist/telemetry.d.ts +16 -2
  187. package/dist/telemetry.d.ts.map +1 -1
  188. package/dist/telemetry.js +79 -14
  189. package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
  190. package/dist/traced_emitter.d.ts +3 -0
  191. package/dist/traced_emitter.d.ts.map +1 -1
  192. package/dist/traced_emitter.js +142 -25
  193. package/dist/trust_package.d.ts +21 -1
  194. package/dist/trust_package.d.ts.map +1 -1
  195. package/dist/trust_package.js +101 -4
  196. package/dist/verify.d.ts.map +1 -1
  197. package/dist/verify.js +9 -2
  198. package/dist/wal.d.ts.map +1 -1
  199. package/dist/wal.js +2 -1
  200. package/package.json +14 -1
  201. package/scripts/postinstall.js +119 -97
  202. package/templates/controls/iso42001_control_catalog.json +1443 -0
@@ -43,6 +43,7 @@ const fs = __importStar(require("fs"));
43
43
  const os = __importStar(require("os"));
44
44
  const path = __importStar(require("path"));
45
45
  const child_process_1 = require("child_process");
46
+ const worker_threads_1 = require("worker_threads");
46
47
  function sha256Text(value) {
47
48
  const hasher = crypto.createHash('sha256');
48
49
  hasher.update(value, 'utf8');
@@ -128,10 +129,7 @@ function extractPdfOcr(reportPath) {
128
129
  }
129
130
  finally {
130
131
  try {
131
- for (const entry of fs.readdirSync(tempDir)) {
132
- fs.unlinkSync(path.join(tempDir, entry));
133
- }
134
- fs.rmdirSync(tempDir);
132
+ fs.rmSync(tempDir, { recursive: true, force: true });
135
133
  }
136
134
  catch {
137
135
  // best-effort cleanup
@@ -324,7 +322,81 @@ function findNth(haystack, needle, index) {
324
322
  }
325
323
  return pos;
326
324
  }
327
- function resolveExcerpt(selection, text) {
325
+ const MAX_REGEX_LENGTH = 2000;
326
+ const UNSAFE_REGEX_PATTERNS = [
327
+ /\([^)]*[+*][^)]*\)[+*]/,
328
+ /\([^)]*\)\{\d+,\d*\}[+*]/,
329
+ /\.\*.*\.\*/,
330
+ ];
331
+ const REGEX_TIMEOUT_MS = Number(process.env.MONORA_REGEX_TIMEOUT_MS || 200);
332
+ function isSafeRegex(pattern) {
333
+ if (pattern.length > MAX_REGEX_LENGTH) {
334
+ return false;
335
+ }
336
+ return !UNSAFE_REGEX_PATTERNS.some((regex) => regex.test(pattern));
337
+ }
338
+ async function matchRegexWithTimeout(pattern, text, matchIndex) {
339
+ return new Promise((resolve, reject) => {
340
+ const worker = new worker_threads_1.Worker(`
341
+ const { parentPort, workerData } = require('worker_threads');
342
+ try {
343
+ const regex = new RegExp(workerData.pattern, workerData.flags);
344
+ let found = null;
345
+ let idx = 0;
346
+ for (const match of workerData.text.matchAll(regex)) {
347
+ if (idx === workerData.matchIndex) {
348
+ if (match.index !== undefined) {
349
+ found = { index: match.index, match: match[0] };
350
+ }
351
+ break;
352
+ }
353
+ idx += 1;
354
+ }
355
+ parentPort.postMessage({ match: found });
356
+ } catch (error) {
357
+ parentPort.postMessage({ error: error && error.message ? error.message : String(error) });
358
+ }
359
+ `, {
360
+ eval: true,
361
+ workerData: {
362
+ pattern,
363
+ text,
364
+ matchIndex,
365
+ flags: 'gs',
366
+ },
367
+ });
368
+ let settled = false;
369
+ const timeoutId = setTimeout(() => {
370
+ if (settled)
371
+ return;
372
+ settled = true;
373
+ console.warn(`Regex match timed out after ${REGEX_TIMEOUT_MS}ms`);
374
+ worker.terminate().catch(() => undefined);
375
+ reject(new Error('Regex match timed out'));
376
+ }, REGEX_TIMEOUT_MS);
377
+ worker.on('message', (message) => {
378
+ if (settled)
379
+ return;
380
+ settled = true;
381
+ clearTimeout(timeoutId);
382
+ worker.terminate().catch(() => undefined);
383
+ if (message && message.error) {
384
+ reject(new Error(message.error));
385
+ return;
386
+ }
387
+ resolve(message ? message.match : null);
388
+ });
389
+ worker.on('error', (error) => {
390
+ if (settled)
391
+ return;
392
+ settled = true;
393
+ clearTimeout(timeoutId);
394
+ worker.terminate().catch(() => undefined);
395
+ reject(error);
396
+ });
397
+ });
398
+ }
399
+ async function resolveExcerpt(selection, text) {
328
400
  const excerptId = selection.id;
329
401
  if (!excerptId) {
330
402
  throw new Error('Excerpt selection missing id');
@@ -359,30 +431,40 @@ function resolveExcerpt(selection, text) {
359
431
  excerptText = needle;
360
432
  }
361
433
  else if (typeof selection.regex === 'string') {
362
- const pattern = new RegExp(selection.regex, 'gs');
363
- const matches = Array.from(text.matchAll(pattern));
364
- if (matchIndex >= matches.length) {
365
- throw new Error(`Excerpt ${excerptId} regex match not found`);
434
+ if (!isSafeRegex(selection.regex)) {
435
+ throw new Error(`Excerpt ${excerptId} regex rejected as unsafe`);
366
436
  }
367
- const match = matches[matchIndex];
368
- if (match.index === undefined) {
437
+ let matchResult = null;
438
+ try {
439
+ matchResult = await matchRegexWithTimeout(selection.regex, text, matchIndex);
440
+ }
441
+ catch (error) {
442
+ if (String(error?.message || error).includes('timed out')) {
443
+ throw new Error(`Excerpt ${excerptId} regex match timed out`);
444
+ }
445
+ throw error;
446
+ }
447
+ if (!matchResult) {
369
448
  throw new Error(`Excerpt ${excerptId} regex match not found`);
370
449
  }
371
- startOffset = match.index;
372
- endOffset = match.index + match[0].length;
450
+ startOffset = matchResult.index;
451
+ endOffset = matchResult.index + matchResult.match.length;
373
452
  excerptText = text.slice(startOffset, endOffset);
374
453
  }
375
454
  else if (selection.start !== undefined && selection.end !== undefined) {
376
- const start = Number(selection.start);
377
- const end = Number(selection.end);
378
- if (!Number.isFinite(start) || !Number.isFinite(end)) {
455
+ const startValue = Number(selection.start);
456
+ const endValue = Number(selection.end);
457
+ if (!Number.isFinite(startValue) || !Number.isFinite(endValue)) {
458
+ throw new Error(`Excerpt ${excerptId} start/end must be integers`);
459
+ }
460
+ if (!Number.isInteger(startValue) || !Number.isInteger(endValue)) {
379
461
  throw new Error(`Excerpt ${excerptId} start/end must be integers`);
380
462
  }
381
- if (start < 0 || end > text.length || start >= end) {
463
+ if (startValue < 0 || endValue > text.length || startValue >= endValue) {
382
464
  throw new Error(`Excerpt ${excerptId} start/end out of bounds`);
383
465
  }
384
- startOffset = start;
385
- endOffset = end;
466
+ startOffset = startValue;
467
+ endOffset = endValue;
386
468
  excerptText = text.slice(startOffset, endOffset);
387
469
  }
388
470
  else {
@@ -398,7 +480,7 @@ function resolveExcerpt(selection, text) {
398
480
  };
399
481
  return { excerpt, claimIds };
400
482
  }
401
- function applyExcerptSelectionsInternal(options) {
483
+ async function applyExcerptSelectionsInternal(options) {
402
484
  const { ingestPath, ingestManifest, claimsPayload, selections } = options;
403
485
  const reportSource = ingestManifest.report_source;
404
486
  if (!reportSource || !reportSource.sha256) {
@@ -421,7 +503,7 @@ function applyExcerptSelectionsInternal(options) {
421
503
  }
422
504
  }
423
505
  for (const selection of selections) {
424
- const { excerpt, claimIds } = resolveExcerpt(selection, text);
506
+ const { excerpt, claimIds } = await resolveExcerpt(selection, text);
425
507
  excerpt.report_sha256 = reportSource.sha256;
426
508
  excerpt.sha256 = sha256Text(excerpt.text || '');
427
509
  excerpts = excerpts.filter((item) => !(item && item.id === excerpt.id));
@@ -441,7 +523,7 @@ function applyExcerptSelectionsInternal(options) {
441
523
  claimsPayload.excerpts = excerpts;
442
524
  return claimsPayload;
443
525
  }
444
- function applyExcerptSelections(options) {
526
+ async function applyExcerptSelections(options) {
445
527
  const { ingestPath, claimsPath, selections } = options;
446
528
  const ingestManifest = JSON.parse(fs.readFileSync(ingestPath, 'utf-8'));
447
529
  const claimsPayload = loadClaimsPayload(claimsPath);
@@ -452,7 +534,7 @@ function applyExcerptSelections(options) {
452
534
  selections,
453
535
  });
454
536
  }
455
- function applyExcerpts(options) {
537
+ async function applyExcerpts(options) {
456
538
  const { ingestPath, claimsPath, excerptsPath } = options;
457
539
  const ingestManifest = JSON.parse(fs.readFileSync(ingestPath, 'utf-8'));
458
540
  const claimsPayload = loadClaimsPayload(claimsPath);
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AA4DD;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,aAAa,CAA6C;IAElE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CACP,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,iBAAiB;IAMpB;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAU5C;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAqB3C;;;;OAIG;IACH,KAAK,IAAI,MAAM;IASf;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAU9B;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;CAS/B;AAKD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAKtC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,iBAAiB,CAEnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAgED;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,aAAa,CAA6C;IAElE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CACP,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,iBAAiB;IAapB;;OAEG;IACH,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAU5C;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAqB3C;;;;OAIG;IACH,KAAK,IAAI,MAAM;IASf;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAU9B;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;CAS/B;AAKD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAKtC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAChC,iBAAiB,CAEnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
package/dist/streaming.js CHANGED
@@ -15,7 +15,7 @@ const minimatch_1 = require("minimatch");
15
15
  /**
16
16
  * Create a new event subscription.
17
17
  */
18
- function createSubscription(callback, filters = {}, subscriptionId) {
18
+ function createSubscription(callback, filters = {}, subscriptionId, onCancel) {
19
19
  const id = subscriptionId || `sub_${Math.random().toString(36).slice(2, 14)}`;
20
20
  const subscription = {
21
21
  id,
@@ -24,6 +24,9 @@ function createSubscription(callback, filters = {}, subscriptionId) {
24
24
  active: true,
25
25
  cancel() {
26
26
  this.active = false;
27
+ if (onCancel) {
28
+ onCancel(this.id);
29
+ }
27
30
  },
28
31
  };
29
32
  return subscription;
@@ -84,7 +87,9 @@ class EventBus {
84
87
  * sub.cancel();
85
88
  */
86
89
  subscribe(callback, filters = {}) {
87
- const subscription = createSubscription(callback, filters);
90
+ const subscription = createSubscription(callback, filters, undefined, (id) => {
91
+ this.subscriptions.delete(id);
92
+ });
88
93
  this.subscriptions.set(subscription.id, subscription);
89
94
  return subscription;
90
95
  }
@@ -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) {
@@ -421,8 +466,10 @@ class PrometheusBackend extends MetricsBackend {
421
466
  if (finished)
422
467
  return;
423
468
  finished = true;
469
+ clearTimeout(timeoutId);
424
470
  resolve();
425
471
  };
472
+ const timeoutId = setTimeout(() => finish(), 5000);
426
473
  try {
427
474
  const closeResult = this.server.close(() => finish());
428
475
  if (closeResult && typeof closeResult.then === 'function') {
@@ -441,7 +488,7 @@ class PrometheusBackend extends MetricsBackend {
441
488
  if (this.server) {
442
489
  await this.closeServer();
443
490
  }
444
- promClient.register.clear();
491
+ this.registry.clear();
445
492
  }
446
493
  }
447
494
  exports.PrometheusBackend = PrometheusBackend;
@@ -490,7 +537,15 @@ class StatsdBackend extends MetricsBackend {
490
537
  this.client.timing(formatted, value * 1000);
491
538
  }
492
539
  async close() {
493
- 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
+ });
494
549
  }
495
550
  }
496
551
  exports.StatsdBackend = StatsdBackend;
@@ -509,16 +564,24 @@ class MetricsCollector {
509
564
  }
510
565
  const backendType = telemetryConfig.backend || 'minimal';
511
566
  try {
512
- if (backendType === 'minimal') {
567
+ if (backendType === 'none') {
568
+ this.backend = new NoopBackend();
569
+ this._enabled = false;
570
+ }
571
+ else if (backendType === 'minimal') {
513
572
  this.backend = new MinimalBackend();
514
573
  this._enabled = true;
515
574
  }
575
+ else if (backendType === 'memory') {
576
+ this.backend = new MemoryBackend();
577
+ this._enabled = true;
578
+ }
516
579
  else if (backendType === 'prometheus') {
517
580
  const promConfig = telemetryConfig.prometheus || {};
518
581
  this.backend = new PrometheusBackend({
519
582
  port: promConfig.port,
520
583
  startServer: promConfig.start_server,
521
- pushGateway: promConfig.push_gateway,
584
+ pushGateway: promConfig.push_gateway || undefined,
522
585
  jobName: promConfig.job_name,
523
586
  });
524
587
  this._enabled = true;
@@ -609,8 +672,10 @@ async function initMetrics(config) {
609
672
  async function closeMetrics() {
610
673
  if (globalCollector) {
611
674
  const collector = globalCollector;
612
- globalCollector = null;
613
675
  await collector.close();
676
+ if (globalCollector === collector) {
677
+ globalCollector = null;
678
+ }
614
679
  }
615
680
  }
616
681
  // Convenience functions for common metrics