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.
- package/README.md +441 -150
- package/dist/aims_governance.d.ts +238 -0
- package/dist/aims_governance.d.ts.map +1 -0
- package/dist/aims_governance.js +922 -0
- package/dist/alerts.d.ts +16 -0
- package/dist/alerts.d.ts.map +1 -1
- package/dist/alerts.js +16 -0
- package/dist/api.d.ts +6 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +6 -0
- package/dist/assessment.d.ts +269 -0
- package/dist/assessment.d.ts.map +1 -0
- package/dist/assessment.js +1232 -0
- package/dist/attestation.js +23 -1
- package/dist/attribution.d.ts +349 -0
- package/dist/attribution.d.ts.map +1 -0
- package/dist/attribution.js +987 -0
- package/dist/autodetect.d.ts +69 -1
- package/dist/autodetect.d.ts.map +1 -1
- package/dist/autodetect.js +644 -1
- package/dist/bias.d.ts +130 -0
- package/dist/bias.d.ts.map +1 -0
- package/dist/bias.js +223 -0
- package/dist/circuit_breaker.js +3 -3
- package/dist/cli/diagnostics.d.ts +5 -1
- package/dist/cli/diagnostics.d.ts.map +1 -1
- package/dist/cli/diagnostics.js +31 -8
- package/dist/cli/doctor.d.ts +25 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +381 -0
- package/dist/cli/fix.d.ts +16 -0
- package/dist/cli/fix.d.ts.map +1 -0
- package/dist/cli/fix.js +284 -0
- package/dist/cli/init.d.ts +57 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +205 -0
- package/dist/cli.js +1611 -126
- package/dist/complianceTargets.d.ts +111 -0
- package/dist/complianceTargets.d.ts.map +1 -0
- package/dist/complianceTargets.js +521 -0
- package/dist/config.d.ts +301 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +428 -36
- package/dist/config_migrations.d.ts +41 -0
- package/dist/config_migrations.d.ts.map +1 -1
- package/dist/config_migrations.js +205 -0
- package/dist/config_schema.d.ts +2900 -731
- package/dist/config_schema.d.ts.map +1 -1
- package/dist/config_schema.js +257 -55
- package/dist/context.d.ts +34 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +118 -7
- package/dist/control_backbone.d.ts +122 -0
- package/dist/control_backbone.d.ts.map +1 -0
- package/dist/control_backbone.js +698 -0
- package/dist/data-governance.d.ts +187 -0
- package/dist/data-governance.d.ts.map +1 -0
- package/dist/data-governance.js +424 -0
- package/dist/dataResidency.d.ts +44 -0
- package/dist/dataResidency.d.ts.map +1 -0
- package/dist/dataResidency.js +203 -0
- package/dist/dispatcher.d.ts +32 -0
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +91 -4
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +38 -0
- package/dist/evidence_store.d.ts +103 -0
- package/dist/evidence_store.d.ts.map +1 -0
- package/dist/evidence_store.js +459 -0
- package/dist/executiveSummary.d.ts +65 -8
- package/dist/executiveSummary.d.ts.map +1 -1
- package/dist/executiveSummary.js +289 -26
- package/dist/identity.d.ts +143 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/impact-assessment.d.ts +350 -0
- package/dist/impact-assessment.d.ts.map +1 -0
- package/dist/impact-assessment.js +580 -0
- package/dist/index.d.ts +25 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +300 -4
- package/dist/instrumentation.d.ts +1 -1
- package/dist/instrumentation.d.ts.map +1 -1
- package/dist/instrumentation.js +243 -27
- package/dist/integrations/anthropic.d.ts +3 -0
- package/dist/integrations/anthropic.d.ts.map +1 -1
- package/dist/integrations/anthropic.js +284 -79
- package/dist/integrations/governance.d.ts +33 -0
- package/dist/integrations/governance.d.ts.map +1 -0
- package/dist/integrations/governance.js +208 -0
- package/dist/integrations/langchain.d.ts +7 -0
- package/dist/integrations/langchain.d.ts.map +1 -1
- package/dist/integrations/langchain.js +387 -143
- package/dist/integrations/openai.d.ts +9 -0
- package/dist/integrations/openai.d.ts.map +1 -1
- package/dist/integrations/openai.js +673 -73
- package/dist/iso42001_consolidation.d.ts +16 -0
- package/dist/iso42001_consolidation.d.ts.map +1 -0
- package/dist/iso42001_consolidation.js +413 -0
- package/dist/iso42001_workflows.d.ts +263 -0
- package/dist/iso42001_workflows.d.ts.map +1 -0
- package/dist/iso42001_workflows.js +781 -0
- package/dist/lifecycle.d.ts +299 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +624 -0
- package/dist/lineage.d.ts +2 -2
- package/dist/lineage.d.ts.map +1 -1
- package/dist/lineage.js +12 -17
- package/dist/middleware/express.d.ts.map +1 -1
- package/dist/middleware/express.js +33 -3
- package/dist/middleware/nextjs.d.ts.map +1 -1
- package/dist/middleware/nextjs.js +42 -68
- package/dist/model.d.ts +143 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +371 -0
- package/dist/onboarding.d.ts +42 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +1022 -0
- package/dist/oversight.d.ts +264 -0
- package/dist/oversight.d.ts.map +1 -0
- package/dist/oversight.js +497 -0
- package/dist/pdf_report.d.ts.map +1 -1
- package/dist/pdf_report.js +42 -21
- package/dist/presets.d.ts +88 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +520 -0
- package/dist/propagation.d.ts.map +1 -1
- package/dist/propagation.js +34 -2
- package/dist/quotas.d.ts +171 -0
- package/dist/quotas.d.ts.map +1 -0
- package/dist/quotas.js +259 -0
- package/dist/register.d.ts +13 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +99 -0
- package/dist/registry.d.ts +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -0
- package/dist/registryData.json +43 -6
- package/dist/report.d.ts +2 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +189 -2
- package/dist/reporting.d.ts +125 -0
- package/dist/reporting.d.ts.map +1 -1
- package/dist/reporting.js +196 -5
- package/dist/resources.d.ts +285 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +643 -0
- package/dist/risk.d.ts +120 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +220 -0
- package/dist/runtime.d.ts +74 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +598 -22
- package/dist/schemaInference.d.ts +92 -0
- package/dist/schemaInference.d.ts.map +1 -0
- package/dist/schemaInference.js +466 -0
- package/dist/schema_validation.js +2 -2
- package/dist/schemas/config.schema.json +169 -6
- package/dist/schemas/event.schema.json +4 -0
- package/dist/security_report.js +4 -4
- package/dist/signing.d.ts +1 -1
- package/dist/signing.d.ts.map +1 -1
- package/dist/signing.js +4 -0
- package/dist/sinks/file.d.ts +19 -1
- package/dist/sinks/file.d.ts.map +1 -1
- package/dist/sinks/file.js +82 -13
- package/dist/sinks/https.d.ts +10 -0
- package/dist/sinks/https.d.ts.map +1 -1
- package/dist/sinks/https.js +76 -16
- package/dist/sinks/stdout.d.ts +1 -0
- package/dist/sinks/stdout.d.ts.map +1 -1
- package/dist/sinks/stdout.js +12 -1
- package/dist/spec.d.ts +159 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +391 -0
- package/dist/stakeholders.d.ts +199 -0
- package/dist/stakeholders.d.ts.map +1 -0
- package/dist/stakeholders.js +398 -0
- package/dist/standards.d.ts.map +1 -1
- package/dist/standards.js +160 -2
- package/dist/standards_ingest.d.ts +2 -2
- package/dist/standards_ingest.d.ts.map +1 -1
- package/dist/standards_ingest.js +105 -23
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +7 -2
- package/dist/telemetry.d.ts +16 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +79 -14
- package/dist/templates/controls/iso42001_control_catalog.json +1443 -0
- package/dist/traced_emitter.d.ts +3 -0
- package/dist/traced_emitter.d.ts.map +1 -1
- package/dist/traced_emitter.js +142 -25
- package/dist/trust_package.d.ts +21 -1
- package/dist/trust_package.d.ts.map +1 -1
- package/dist/trust_package.js +101 -4
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +9 -2
- package/dist/wal.d.ts.map +1 -1
- package/dist/wal.js +2 -1
- package/package.json +14 -1
- package/scripts/postinstall.js +119 -97
- package/templates/controls/iso42001_control_catalog.json +1443 -0
package/dist/standards_ingest.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
363
|
-
|
|
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
|
-
|
|
368
|
-
|
|
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 =
|
|
372
|
-
endOffset =
|
|
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
|
|
377
|
-
const
|
|
378
|
-
if (!Number.isFinite(
|
|
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 (
|
|
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 =
|
|
385
|
-
endOffset =
|
|
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);
|
package/dist/streaming.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
}
|
package/dist/telemetry.d.ts
CHANGED
|
@@ -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?: {
|
package/dist/telemetry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,QAAA,IAAI,oBAAoB,SAAQ,CAAC;AAajC,QAAA,IAAI,gBAAgB,SAAQ,CAAC;AAU7B,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;AAElD;;GAEG;AACH,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAwH3D,CAAC;AAEF;;GAEG;AACH,8BAAsB,cAAc;IAClC,QAAQ,CAAC,SAAS,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,KAAK,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,OAAO,CACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IACP,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,cAAc;IAC7C,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAIP,KAAK,CACH,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAIP,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAID,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAIZ;IAEH,OAAO,CAAC,SAAS;IASjB,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI;IASP,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQzE,OAAO,CACL,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,IAAI;IAID,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IAEnD,OAAO,CAAC,OAAO,CAA+B;
|
|
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
|
-
|
|
352
|
+
const server = http.createServer(async (req, res) => {
|
|
314
353
|
if (req.url === '/metrics') {
|
|
315
|
-
res.setHeader('Content-Type',
|
|
316
|
-
res.end(await
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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 === '
|
|
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
|