@tangle-network/agent-eval 0.84.0 → 0.85.0

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.
@@ -577,6 +577,7 @@ type RuntimeBenchmarkTrajectoryRecord = RuntimeTrajectoryRecord & {
577
577
  benchmark?: unknown;
578
578
  condition?: unknown;
579
579
  instanceId?: unknown;
580
+ runtimeDecisionPoints?: unknown;
580
581
  };
581
582
  interface BuildRuntimeBenchmarkBeliefPhase0MeasurementOptions extends Omit<BuildRuntimeBeliefPhase0MeasurementOptions, 'runs' | 'events' | 'decisions' | 'labels'> {
582
583
  records: RuntimeBenchmarkTrajectoryRecord[];
@@ -1720,6 +1720,20 @@ function compactMetadata2(values) {
1720
1720
  }
1721
1721
 
1722
1722
  // src/belief-state/runtime-benchmark-corpus.ts
1723
+ var MAX_STRING_LENGTH = 12e3;
1724
+ var MAX_CONTEXT_LENGTH = 2e4;
1725
+ var MAX_EVIDENCE_DETAIL_LENGTH = 2e3;
1726
+ var MAX_CANDIDATE_ACTIONS = 50;
1727
+ var MAX_EVIDENCE_REFS = 50;
1728
+ var MAX_METADATA_DEPTH = 4;
1729
+ var MAX_METADATA_KEYS = 100;
1730
+ var SENSITIVE_KEY_RE = /(?:authorization|api[_-]?key|token|secret|password|cookie|credential|bearer)/i;
1731
+ var SENSITIVE_VALUE_RES = [
1732
+ /\bBearer\s+[A-Za-z0-9._~+/=-]+/gi,
1733
+ /\b(?:sk|gh[pousr])_[A-Za-z0-9_]{20,}\b/g,
1734
+ /\b(?:sk|ghp|gho|ghu|ghs|ghr)-[A-Za-z0-9_-]{20,}\b/g
1735
+ ];
1736
+ var SENSITIVE_ASSIGNMENT_RE = /\b(api[_-]?key|token|secret|password|cookie)\s*[:=]\s*["']?[^"'\s,;}]+/gi;
1723
1737
  function buildRuntimeBenchmarkBeliefPhase0Measurement(options) {
1724
1738
  const diagnostics = [];
1725
1739
  const trajectory = projectRuntimeTrajectoryEvidence({
@@ -1728,11 +1742,11 @@ function buildRuntimeBenchmarkBeliefPhase0Measurement(options) {
1728
1742
  recordIdOf: runtimeBenchmarkRecordId,
1729
1743
  scenarioIdOf: runtimeBenchmarkScenarioId
1730
1744
  });
1731
- const decisions = options.decisions ?? [];
1745
+ const decisions = options.decisions ?? runtimeBenchmarkDecisionPoints(options.records, diagnostics);
1732
1746
  const labels = options.labels ?? [];
1733
1747
  if (decisions.length === 0) {
1734
1748
  diagnostics.push(
1735
- "no runtime decision points supplied; benchmark lifecycle events alone cannot produce belief decision rows"
1749
+ "no runtime decision points supplied or found on records; benchmark lifecycle events alone cannot produce belief decision rows"
1736
1750
  );
1737
1751
  }
1738
1752
  if (labels.length === 0 && decisions.length > 0) {
@@ -1772,6 +1786,125 @@ function runtimeBenchmarkRecordId(record2) {
1772
1786
  function runtimeBenchmarkScenarioId(record2) {
1773
1787
  return nonEmptyString(record2.instanceId);
1774
1788
  }
1789
+ function runtimeBenchmarkDecisionPoints(records, diagnostics) {
1790
+ const decisions = [];
1791
+ for (let recordIndex = 0; recordIndex < records.length; recordIndex += 1) {
1792
+ const record2 = records[recordIndex];
1793
+ const raw = record2.runtimeDecisionPoints;
1794
+ if (raw === void 0) continue;
1795
+ const recordId = runtimeBenchmarkRecordId(record2) ?? `record[${recordIndex}]`;
1796
+ if (!Array.isArray(raw)) {
1797
+ diagnostics.push(`${recordId}: runtimeDecisionPoints is not an array`);
1798
+ continue;
1799
+ }
1800
+ for (let pointIndex = 0; pointIndex < raw.length; pointIndex += 1) {
1801
+ const point = runtimeBenchmarkDecisionPoint(raw[pointIndex], {
1802
+ diagnostics,
1803
+ path: `${recordId}: runtimeDecisionPoints[${pointIndex}]`
1804
+ });
1805
+ if (!point) {
1806
+ diagnostics.push(
1807
+ `${recordId}: runtimeDecisionPoints[${pointIndex}] is not a RuntimeDecisionPoint`
1808
+ );
1809
+ continue;
1810
+ }
1811
+ decisions.push(point);
1812
+ }
1813
+ }
1814
+ return decisions;
1815
+ }
1816
+ function runtimeBenchmarkDecisionPoint(input, context) {
1817
+ if (!isRecord3(input)) return null;
1818
+ if (typeof input.id !== "string" || input.id.length === 0) return null;
1819
+ if (typeof input.runId !== "string" || input.runId.length === 0) return null;
1820
+ if (typeof input.stepIndex !== "number" || !Number.isInteger(input.stepIndex) || input.stepIndex < 0) {
1821
+ return null;
1822
+ }
1823
+ if (typeof input.kind !== "string" || input.kind.length === 0) return null;
1824
+ return {
1825
+ id: sanitizeString(input.id, MAX_STRING_LENGTH),
1826
+ runId: sanitizeString(input.runId, MAX_STRING_LENGTH),
1827
+ scenarioId: sanitizeOptionalString(input.scenarioId, MAX_STRING_LENGTH),
1828
+ stepIndex: input.stepIndex,
1829
+ kind: sanitizeString(input.kind, MAX_STRING_LENGTH),
1830
+ candidateActions: stringArray(input.candidateActions, {
1831
+ ...context,
1832
+ maxItems: MAX_CANDIDATE_ACTIONS,
1833
+ label: "candidateActions"
1834
+ }),
1835
+ context: sanitizeOptionalString(input.context, MAX_CONTEXT_LENGTH),
1836
+ evidence: runtimeBenchmarkEvidence(input.evidence, context),
1837
+ metadata: sanitizeMetadataRecord(input.metadata)
1838
+ };
1839
+ }
1840
+ function runtimeBenchmarkEvidence(input, context) {
1841
+ if (!Array.isArray(input)) return [];
1842
+ if (input.length > MAX_EVIDENCE_REFS) {
1843
+ context.diagnostics.push(`${context.path}: evidence truncated to ${MAX_EVIDENCE_REFS} refs`);
1844
+ }
1845
+ return input.slice(0, MAX_EVIDENCE_REFS).flatMap((item) => {
1846
+ if (!isRecord3(item)) return [];
1847
+ const source = sanitizeOptionalString(item.source, MAX_STRING_LENGTH);
1848
+ const id = sanitizeOptionalString(item.id, MAX_STRING_LENGTH);
1849
+ if (!source || !id) return [];
1850
+ return [
1851
+ {
1852
+ source,
1853
+ id,
1854
+ detail: sanitizeOptionalString(item.detail, MAX_EVIDENCE_DETAIL_LENGTH),
1855
+ metadata: sanitizeMetadataRecord(item.metadata)
1856
+ }
1857
+ ];
1858
+ });
1859
+ }
1860
+ function stringArray(input, context) {
1861
+ if (!Array.isArray(input)) return void 0;
1862
+ if (input.length > context.maxItems) {
1863
+ context.diagnostics.push(`${context.path}: ${context.label} truncated to ${context.maxItems}`);
1864
+ }
1865
+ const values = input.slice(0, context.maxItems).filter((value) => typeof value === "string" && value.length > 0).map((value) => sanitizeString(value, MAX_STRING_LENGTH));
1866
+ return values.length > 0 ? values : void 0;
1867
+ }
1868
+ function sanitizeMetadataRecord(metadata) {
1869
+ if (!isRecord3(metadata)) return void 0;
1870
+ const sanitized = sanitizeMetadata(metadata);
1871
+ if (!sanitized || typeof sanitized !== "object" || Array.isArray(sanitized)) return void 0;
1872
+ return sanitized;
1873
+ }
1874
+ function sanitizeMetadata(value, depth = 0) {
1875
+ if (value == null) return value;
1876
+ if (typeof value === "string") return sanitizeString(value, MAX_STRING_LENGTH);
1877
+ if (typeof value === "number" || typeof value === "boolean") return value;
1878
+ if (Array.isArray(value)) {
1879
+ if (depth >= MAX_METADATA_DEPTH) return "[MaxDepth]";
1880
+ return value.slice(0, MAX_METADATA_KEYS).map((item) => sanitizeMetadata(item, depth + 1));
1881
+ }
1882
+ if (!isRecord3(value)) return void 0;
1883
+ if (depth >= MAX_METADATA_DEPTH) return "[MaxDepth]";
1884
+ const sanitized = {};
1885
+ for (const [key, nested] of Object.entries(value).slice(0, MAX_METADATA_KEYS)) {
1886
+ sanitized[key] = SENSITIVE_KEY_RE.test(key) ? "[REDACTED]" : sanitizeMetadata(nested, depth + 1);
1887
+ }
1888
+ return sanitized;
1889
+ }
1890
+ function sanitizeOptionalString(value, maxLength) {
1891
+ return typeof value === "string" && value.length > 0 ? sanitizeString(value, maxLength) : void 0;
1892
+ }
1893
+ function sanitizeString(value, maxLength) {
1894
+ let sanitized = value;
1895
+ for (const pattern of SENSITIVE_VALUE_RES) {
1896
+ sanitized = sanitized.replace(pattern, "[REDACTED]");
1897
+ }
1898
+ sanitized = sanitized.replace(
1899
+ SENSITIVE_ASSIGNMENT_RE,
1900
+ (_match, key) => `${key}=[REDACTED]`
1901
+ );
1902
+ if (sanitized.length <= maxLength) return sanitized;
1903
+ return sanitized.slice(0, maxLength);
1904
+ }
1905
+ function isRecord3(value) {
1906
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1907
+ }
1775
1908
  function nonEmptyString(value) {
1776
1909
  return typeof value === "string" && value.length > 0 ? value : void 0;
1777
1910
  }