@rasputin-ai/core 0.5.0-alpha.5 → 0.5.0-alpha.7
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/dist/create-ingest-event/runtime-execution-state-types.d.ts +35 -6
- package/dist/create-ingest-event/runtime-execution-state-types.d.ts.map +1 -1
- package/dist/derivation/canonical-json.d.ts +3 -0
- package/dist/derivation/canonical-json.d.ts.map +1 -0
- package/dist/derivation/captured-value-markers.d.ts +5 -0
- package/dist/derivation/captured-value-markers.d.ts.map +1 -0
- package/dist/derivation/evaluate-derivation-plan.d.ts +45 -0
- package/dist/derivation/evaluate-derivation-plan.d.ts.map +1 -0
- package/dist/derivation/hash-instrumentation-manifest.d.ts +7 -0
- package/dist/derivation/hash-instrumentation-manifest.d.ts.map +1 -0
- package/dist/derivation/rasputin-wire-tag.d.ts +32 -0
- package/dist/derivation/rasputin-wire-tag.d.ts.map +1 -0
- package/dist/derivation/sha256.d.ts +3 -0
- package/dist/derivation/sha256.d.ts.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +946 -2
- package/dist/instrumentation-manifest/derivation-plan-types.d.ts +142 -0
- package/dist/instrumentation-manifest/derivation-plan-types.d.ts.map +1 -0
- package/dist/instrumentation-manifest/instrumentation-manifest-types.d.ts +5 -1
- package/dist/instrumentation-manifest/instrumentation-manifest-types.d.ts.map +1 -1
- package/dist/sdk-meta.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -659,7 +659,7 @@ var resolveSourceMaps = async (frames) => {
|
|
|
659
659
|
|
|
660
660
|
// src/sdk-meta.ts
|
|
661
661
|
var SDK_NAME = "@rasputin-ai/core";
|
|
662
|
-
var SDK_VERSION = "0.5.0-alpha.
|
|
662
|
+
var SDK_VERSION = "0.5.0-alpha.7";
|
|
663
663
|
|
|
664
664
|
// src/suppression/identity-needs-message-template.ts
|
|
665
665
|
var identityNeedsMessageTemplate = (type, code) => {
|
|
@@ -1530,8 +1530,938 @@ var createClient = (options, hooks = {}) => {
|
|
|
1530
1530
|
}
|
|
1531
1531
|
};
|
|
1532
1532
|
|
|
1533
|
+
// src/derivation/rasputin-wire-tag.ts
|
|
1534
|
+
var RASPUTIN_WIRE_TAG = "\0rasputin";
|
|
1535
|
+
var rasputinUnknown = () => [RASPUTIN_WIRE_TAG, "unknown"];
|
|
1536
|
+
var rasputinUnavailable = (reason) => [
|
|
1537
|
+
RASPUTIN_WIRE_TAG,
|
|
1538
|
+
"unavailable",
|
|
1539
|
+
reason
|
|
1540
|
+
];
|
|
1541
|
+
var rasputinOmitted = () => [RASPUTIN_WIRE_TAG, "omitted"];
|
|
1542
|
+
var rasputinRedacted = () => [RASPUTIN_WIRE_TAG, "redacted"];
|
|
1543
|
+
var rasputinTruncated = (payload) => [
|
|
1544
|
+
RASPUTIN_WIRE_TAG,
|
|
1545
|
+
"truncated",
|
|
1546
|
+
payload
|
|
1547
|
+
];
|
|
1548
|
+
var isRasputinTaggedValue = (value) => {
|
|
1549
|
+
if (!Array.isArray(value) || value.length < 2 || value[0] !== RASPUTIN_WIRE_TAG) return false;
|
|
1550
|
+
const kind = value[1];
|
|
1551
|
+
return kind === "unknown" || kind === "unavailable" || kind === "omitted" || kind === "redacted" || kind === "truncated";
|
|
1552
|
+
};
|
|
1553
|
+
var rasputinTagKind = (value) => isRasputinTaggedValue(value) ? value[1] : void 0;
|
|
1554
|
+
|
|
1555
|
+
// src/derivation/captured-value-markers.ts
|
|
1556
|
+
var REDACTED = "[RASPUTIN_REDACTED]";
|
|
1557
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1558
|
+
var capturedValueCompleteness = (value) => {
|
|
1559
|
+
if (value === REDACTED) return "partial";
|
|
1560
|
+
const tagged = rasputinTagKind(value);
|
|
1561
|
+
if (tagged === "unknown" || tagged === "truncated" || tagged === "unavailable" || tagged === "omitted") {
|
|
1562
|
+
return "partial";
|
|
1563
|
+
}
|
|
1564
|
+
if (tagged === "redacted") return "partial";
|
|
1565
|
+
if (isRasputinTaggedValue(value)) return "partial";
|
|
1566
|
+
if (Array.isArray(value)) {
|
|
1567
|
+
for (const item of value) {
|
|
1568
|
+
if (capturedValueCompleteness(item) === "partial") return "partial";
|
|
1569
|
+
}
|
|
1570
|
+
return "exact";
|
|
1571
|
+
}
|
|
1572
|
+
if (!isRecord(value)) return "exact";
|
|
1573
|
+
if (value.__rasputin_truncated === true) return "partial";
|
|
1574
|
+
if (value.__rasputin_type === "omitted" || value.__rasputin_type === "accessor") return "partial";
|
|
1575
|
+
if (value.__rasputin_type === "unserializable") return "partial";
|
|
1576
|
+
for (const nested of Object.values(value)) {
|
|
1577
|
+
if (capturedValueCompleteness(nested) === "partial") return "partial";
|
|
1578
|
+
}
|
|
1579
|
+
return "exact";
|
|
1580
|
+
};
|
|
1581
|
+
var isRedactedCapturedValue = (value) => {
|
|
1582
|
+
if (value === REDACTED) return true;
|
|
1583
|
+
if (rasputinTagKind(value) === "redacted") return true;
|
|
1584
|
+
if (isRecord(value) && value.__rasputin_type === "omitted") return true;
|
|
1585
|
+
return false;
|
|
1586
|
+
};
|
|
1587
|
+
var isSerializerMarker = (value) => {
|
|
1588
|
+
if (isRasputinTaggedValue(value)) return true;
|
|
1589
|
+
if (!isRecord(value)) return false;
|
|
1590
|
+
return value.__rasputin_truncated === true || typeof value.__rasputin_type === "string";
|
|
1591
|
+
};
|
|
1592
|
+
|
|
1593
|
+
// src/derivation/canonical-json.ts
|
|
1594
|
+
var sortedKeys = (value) => Object.keys(value).sort();
|
|
1595
|
+
var canonicalJson = (value) => {
|
|
1596
|
+
if (value === null) return "null";
|
|
1597
|
+
switch (typeof value) {
|
|
1598
|
+
case "boolean":
|
|
1599
|
+
return value ? "true" : "false";
|
|
1600
|
+
case "number":
|
|
1601
|
+
if (!Number.isFinite(value)) return "null";
|
|
1602
|
+
if (Object.is(value, -0)) return "0";
|
|
1603
|
+
return String(value);
|
|
1604
|
+
case "string":
|
|
1605
|
+
return JSON.stringify(value);
|
|
1606
|
+
case "undefined":
|
|
1607
|
+
return "null";
|
|
1608
|
+
default:
|
|
1609
|
+
break;
|
|
1610
|
+
}
|
|
1611
|
+
if (Array.isArray(value)) {
|
|
1612
|
+
return `[${value.map((item) => canonicalJson(item)).join(",")}]`;
|
|
1613
|
+
}
|
|
1614
|
+
if (typeof value === "object") {
|
|
1615
|
+
const record = value;
|
|
1616
|
+
const fields = sortedKeys(record).filter((key) => record[key] !== void 0).map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`);
|
|
1617
|
+
return `{${fields.join(",")}}`;
|
|
1618
|
+
}
|
|
1619
|
+
return "null";
|
|
1620
|
+
};
|
|
1621
|
+
|
|
1622
|
+
// src/derivation/sha256.ts
|
|
1623
|
+
var K = [
|
|
1624
|
+
1116352408,
|
|
1625
|
+
1899447441,
|
|
1626
|
+
3049323471,
|
|
1627
|
+
3921009573,
|
|
1628
|
+
961987163,
|
|
1629
|
+
1508970993,
|
|
1630
|
+
2453635748,
|
|
1631
|
+
2870763221,
|
|
1632
|
+
3624381080,
|
|
1633
|
+
310598401,
|
|
1634
|
+
607225278,
|
|
1635
|
+
1426881987,
|
|
1636
|
+
1925078388,
|
|
1637
|
+
2162078206,
|
|
1638
|
+
2614888103,
|
|
1639
|
+
3248222580,
|
|
1640
|
+
3835390401,
|
|
1641
|
+
4022224774,
|
|
1642
|
+
264347078,
|
|
1643
|
+
604807628,
|
|
1644
|
+
770255983,
|
|
1645
|
+
1249150122,
|
|
1646
|
+
1555081692,
|
|
1647
|
+
1996064986,
|
|
1648
|
+
2554220882,
|
|
1649
|
+
2821834349,
|
|
1650
|
+
2952996808,
|
|
1651
|
+
3210313671,
|
|
1652
|
+
3336571891,
|
|
1653
|
+
3584528711,
|
|
1654
|
+
113926993,
|
|
1655
|
+
338241895,
|
|
1656
|
+
666307205,
|
|
1657
|
+
773529912,
|
|
1658
|
+
1294757372,
|
|
1659
|
+
1396182291,
|
|
1660
|
+
1695183700,
|
|
1661
|
+
1986661051,
|
|
1662
|
+
2177026350,
|
|
1663
|
+
2456956037,
|
|
1664
|
+
2730485921,
|
|
1665
|
+
2820302411,
|
|
1666
|
+
3259730800,
|
|
1667
|
+
3345764771,
|
|
1668
|
+
3516065817,
|
|
1669
|
+
3600352804,
|
|
1670
|
+
4094571909,
|
|
1671
|
+
275423344,
|
|
1672
|
+
430227734,
|
|
1673
|
+
506948616,
|
|
1674
|
+
659060556,
|
|
1675
|
+
883997877,
|
|
1676
|
+
958139571,
|
|
1677
|
+
1322822218,
|
|
1678
|
+
1537002063,
|
|
1679
|
+
1747873779,
|
|
1680
|
+
1955562222,
|
|
1681
|
+
2024104815,
|
|
1682
|
+
2227730452,
|
|
1683
|
+
2361852424,
|
|
1684
|
+
2428436474,
|
|
1685
|
+
2756734187,
|
|
1686
|
+
3204031479,
|
|
1687
|
+
3329325298
|
|
1688
|
+
];
|
|
1689
|
+
var rotr = (value, bits) => value >>> bits | value << 32 - bits;
|
|
1690
|
+
var sha256Hex = (input) => {
|
|
1691
|
+
const encoded = new TextEncoder().encode(input);
|
|
1692
|
+
const bitLen = encoded.length * 8;
|
|
1693
|
+
const paddedLen = encoded.length + 9 + 63 >> 6 << 6 >>> 0;
|
|
1694
|
+
const bytes = new Uint8Array(paddedLen);
|
|
1695
|
+
bytes.set(encoded);
|
|
1696
|
+
bytes[encoded.length] = 128;
|
|
1697
|
+
const view = new DataView(bytes.buffer);
|
|
1698
|
+
view.setUint32(paddedLen - 4, bitLen, false);
|
|
1699
|
+
let h0 = 1779033703;
|
|
1700
|
+
let h1 = 3144134277;
|
|
1701
|
+
let h2 = 1013904242;
|
|
1702
|
+
let h3 = 2773480762;
|
|
1703
|
+
let h4 = 1359893119;
|
|
1704
|
+
let h5 = 2600822924;
|
|
1705
|
+
let h6 = 528734635;
|
|
1706
|
+
let h7 = 1541459225;
|
|
1707
|
+
const w = new Uint32Array(64);
|
|
1708
|
+
for (let offset = 0; offset < paddedLen; offset += 64) {
|
|
1709
|
+
for (let i = 0; i < 16; i++) w[i] = view.getUint32(offset + i * 4, false);
|
|
1710
|
+
for (let i = 16; i < 64; i++) {
|
|
1711
|
+
const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ w[i - 15] >>> 3;
|
|
1712
|
+
const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ w[i - 2] >>> 10;
|
|
1713
|
+
w[i] = w[i - 16] + s0 + w[i - 7] + s1 >>> 0;
|
|
1714
|
+
}
|
|
1715
|
+
let a = h0;
|
|
1716
|
+
let b = h1;
|
|
1717
|
+
let c = h2;
|
|
1718
|
+
let d = h3;
|
|
1719
|
+
let e = h4;
|
|
1720
|
+
let f = h5;
|
|
1721
|
+
let g = h6;
|
|
1722
|
+
let h = h7;
|
|
1723
|
+
for (let i = 0; i < 64; i++) {
|
|
1724
|
+
const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
|
|
1725
|
+
const ch = e & f ^ ~e & g;
|
|
1726
|
+
const temp1 = h + S1 + ch + K[i] + w[i] >>> 0;
|
|
1727
|
+
const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
|
|
1728
|
+
const maj = a & b ^ a & c ^ b & c;
|
|
1729
|
+
const temp2 = S0 + maj >>> 0;
|
|
1730
|
+
h = g;
|
|
1731
|
+
g = f;
|
|
1732
|
+
f = e;
|
|
1733
|
+
e = d + temp1 >>> 0;
|
|
1734
|
+
d = c;
|
|
1735
|
+
c = b;
|
|
1736
|
+
b = a;
|
|
1737
|
+
a = temp1 + temp2 >>> 0;
|
|
1738
|
+
}
|
|
1739
|
+
h0 = h0 + a >>> 0;
|
|
1740
|
+
h1 = h1 + b >>> 0;
|
|
1741
|
+
h2 = h2 + c >>> 0;
|
|
1742
|
+
h3 = h3 + d >>> 0;
|
|
1743
|
+
h4 = h4 + e >>> 0;
|
|
1744
|
+
h5 = h5 + f >>> 0;
|
|
1745
|
+
h6 = h6 + g >>> 0;
|
|
1746
|
+
h7 = h7 + h >>> 0;
|
|
1747
|
+
}
|
|
1748
|
+
return [h0, h1, h2, h3, h4, h5, h6, h7].map((word) => word.toString(16).padStart(8, "0")).join("");
|
|
1749
|
+
};
|
|
1750
|
+
|
|
1751
|
+
// src/derivation/hash-instrumentation-manifest.ts
|
|
1752
|
+
var hashableSource = (source) => {
|
|
1753
|
+
const { repositoryPath: _repositoryPath, ...rest } = source;
|
|
1754
|
+
return rest;
|
|
1755
|
+
};
|
|
1756
|
+
var hashableLocated = (items) => items.map((item) => ({ ...item, source: hashableSource(item.source) }));
|
|
1757
|
+
var hashInstrumentationManifest = (manifest) => {
|
|
1758
|
+
return sha256Hex(
|
|
1759
|
+
canonicalJson({
|
|
1760
|
+
schema_version: manifest.schema_version,
|
|
1761
|
+
functions: hashableLocated(manifest.functions),
|
|
1762
|
+
callSites: hashableLocated(manifest.callSites),
|
|
1763
|
+
destructures: hashableLocated(manifest.destructures),
|
|
1764
|
+
derivationPlans: manifest.derivationPlans ?? []
|
|
1765
|
+
})
|
|
1766
|
+
);
|
|
1767
|
+
};
|
|
1768
|
+
|
|
1769
|
+
// src/derivation/evaluate-derivation-plan.ts
|
|
1770
|
+
var MAX_INSTRUCTIONS = 1e4;
|
|
1771
|
+
var MAX_DEPTH = 64;
|
|
1772
|
+
var MAX_OUTPUT_BYTES = 256 * 1024;
|
|
1773
|
+
var MAX_WALL_MS = 50;
|
|
1774
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1775
|
+
var primitiveFromConst = (value) => {
|
|
1776
|
+
switch (value.type) {
|
|
1777
|
+
case "null":
|
|
1778
|
+
return null;
|
|
1779
|
+
case "undefined":
|
|
1780
|
+
return void 0;
|
|
1781
|
+
case "boolean":
|
|
1782
|
+
return value.value;
|
|
1783
|
+
case "number":
|
|
1784
|
+
return value.negativeZero ? -0 : value.value;
|
|
1785
|
+
case "string":
|
|
1786
|
+
return value.value;
|
|
1787
|
+
case "bigint":
|
|
1788
|
+
try {
|
|
1789
|
+
return BigInt(value.value);
|
|
1790
|
+
} catch {
|
|
1791
|
+
return rasputinUnavailable("invalid_bigint_const");
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
};
|
|
1795
|
+
var estimateBytes = (value, depth = 0) => {
|
|
1796
|
+
if (value === null || value === void 0) return 4;
|
|
1797
|
+
switch (typeof value) {
|
|
1798
|
+
case "boolean":
|
|
1799
|
+
return 4;
|
|
1800
|
+
case "number":
|
|
1801
|
+
return 8;
|
|
1802
|
+
case "string":
|
|
1803
|
+
return value.length;
|
|
1804
|
+
case "bigint":
|
|
1805
|
+
return value.toString().length;
|
|
1806
|
+
case "object": {
|
|
1807
|
+
if (depth > 8) return 8;
|
|
1808
|
+
if (Array.isArray(value)) {
|
|
1809
|
+
let total2 = 2;
|
|
1810
|
+
for (const item of value) total2 += estimateBytes(item, depth + 1);
|
|
1811
|
+
return total2;
|
|
1812
|
+
}
|
|
1813
|
+
let total = 2;
|
|
1814
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
1815
|
+
total += key.length + estimateBytes(nested, depth + 1);
|
|
1816
|
+
}
|
|
1817
|
+
return total;
|
|
1818
|
+
}
|
|
1819
|
+
default:
|
|
1820
|
+
return 8;
|
|
1821
|
+
}
|
|
1822
|
+
};
|
|
1823
|
+
var capturedResult = (root) => {
|
|
1824
|
+
if (isRedactedCapturedValue(root.value)) {
|
|
1825
|
+
return { origin: "captured", completeness: "partial", value: rasputinRedacted() };
|
|
1826
|
+
}
|
|
1827
|
+
const completeness = root.completeness === "partial" ? "partial" : capturedValueCompleteness(root.value);
|
|
1828
|
+
return { origin: "captured", completeness, value: root.value };
|
|
1829
|
+
};
|
|
1830
|
+
var mergeCompleteness = (parts) => {
|
|
1831
|
+
let partial = false;
|
|
1832
|
+
for (const part of parts) {
|
|
1833
|
+
if (part.origin === "unavailable") return "unavailable";
|
|
1834
|
+
if (part.completeness === "partial") partial = true;
|
|
1835
|
+
}
|
|
1836
|
+
return partial ? "partial" : "exact";
|
|
1837
|
+
};
|
|
1838
|
+
var unwrapExactPrimitive = (result) => {
|
|
1839
|
+
if (result.origin === "unavailable") return rasputinUnavailable(result.reason);
|
|
1840
|
+
return result.value;
|
|
1841
|
+
};
|
|
1842
|
+
var isNumericPrimitive = (value) => typeof value === "number" && !isRasputinTaggedValue(value);
|
|
1843
|
+
var isPrimitiveOperand = (value) => {
|
|
1844
|
+
if (isRasputinTaggedValue(value)) return false;
|
|
1845
|
+
return value === null || typeof value === "boolean" || typeof value === "number" || typeof value === "string" || typeof value === "bigint" || typeof value === "undefined";
|
|
1846
|
+
};
|
|
1847
|
+
var omittedCallKey = (parentCallId, functionId) => `${parentCallId}\0${functionId}`;
|
|
1848
|
+
var argsIncludeOmitted = (args) => args.some((arg) => rasputinTagKind(arg) === "omitted");
|
|
1849
|
+
var recordReconstructedCallArgs = (queue, parentCallId, functionId, args) => {
|
|
1850
|
+
const key = omittedCallKey(parentCallId, functionId);
|
|
1851
|
+
const pending = queue.get(key);
|
|
1852
|
+
if (pending) pending.push(args);
|
|
1853
|
+
else queue.set(key, [args]);
|
|
1854
|
+
};
|
|
1855
|
+
var takeReconstructedCallArgs = (queue, parentCallId, functionId) => {
|
|
1856
|
+
if (parentCallId == null) return void 0;
|
|
1857
|
+
const pending = queue.get(omittedCallKey(parentCallId, functionId));
|
|
1858
|
+
if (!pending || pending.length === 0) return void 0;
|
|
1859
|
+
return pending.shift();
|
|
1860
|
+
};
|
|
1861
|
+
var resolveEnterArgs = (enter, queue) => {
|
|
1862
|
+
if (!argsIncludeOmitted(enter.args)) return enter.args;
|
|
1863
|
+
return takeReconstructedCallArgs(queue, enter.parentCallId, enter.functionId) ?? enter.args;
|
|
1864
|
+
};
|
|
1865
|
+
var budgetExceeded = (state) => {
|
|
1866
|
+
if (state.instructions > MAX_INSTRUCTIONS) return "instruction_budget";
|
|
1867
|
+
if (state.depth > MAX_DEPTH) return "depth_budget";
|
|
1868
|
+
if (state.outputBytes > MAX_OUTPUT_BYTES) return "output_size_budget";
|
|
1869
|
+
if (Date.now() - state.startedAt > MAX_WALL_MS) return "wall_time_budget";
|
|
1870
|
+
return void 0;
|
|
1871
|
+
};
|
|
1872
|
+
var evaluateExpression = (expressionId, plan, byId, cells, args, rootsById, factsById, calleeReturns, state, evaluateCallee) => {
|
|
1873
|
+
const over = budgetExceeded(state);
|
|
1874
|
+
if (over) return { origin: "unavailable", reason: over };
|
|
1875
|
+
state.instructions++;
|
|
1876
|
+
state.depth++;
|
|
1877
|
+
try {
|
|
1878
|
+
const existing = cells.get(expressionId);
|
|
1879
|
+
if (existing?.status === "done") return existing.result;
|
|
1880
|
+
if (existing?.status === "pending") {
|
|
1881
|
+
return { origin: "unavailable", reason: "cyclic_expression" };
|
|
1882
|
+
}
|
|
1883
|
+
const expression = byId.get(expressionId);
|
|
1884
|
+
if (!expression) return { origin: "unavailable", reason: "missing_expression" };
|
|
1885
|
+
cells.set(expressionId, { status: "pending" });
|
|
1886
|
+
const evalChild = (id) => evaluateExpression(
|
|
1887
|
+
id,
|
|
1888
|
+
plan,
|
|
1889
|
+
byId,
|
|
1890
|
+
cells,
|
|
1891
|
+
args,
|
|
1892
|
+
rootsById,
|
|
1893
|
+
factsById,
|
|
1894
|
+
calleeReturns,
|
|
1895
|
+
state,
|
|
1896
|
+
evaluateCallee
|
|
1897
|
+
);
|
|
1898
|
+
let result;
|
|
1899
|
+
switch (expression.kind) {
|
|
1900
|
+
case "const": {
|
|
1901
|
+
const value = primitiveFromConst(expression.value);
|
|
1902
|
+
result = { origin: "derived", completeness: "exact", value, dependencies: [] };
|
|
1903
|
+
break;
|
|
1904
|
+
}
|
|
1905
|
+
case "param": {
|
|
1906
|
+
if (expression.index < 0 || expression.index >= args.length) {
|
|
1907
|
+
result = { origin: "unavailable", reason: "missing_argument" };
|
|
1908
|
+
break;
|
|
1909
|
+
}
|
|
1910
|
+
const value = args[expression.index];
|
|
1911
|
+
if (rasputinTagKind(value) === "omitted") {
|
|
1912
|
+
result = { origin: "unavailable", reason: "omitted_argument" };
|
|
1913
|
+
break;
|
|
1914
|
+
}
|
|
1915
|
+
const completeness = capturedValueCompleteness(value);
|
|
1916
|
+
result = { origin: "captured", completeness, value };
|
|
1917
|
+
break;
|
|
1918
|
+
}
|
|
1919
|
+
case "root": {
|
|
1920
|
+
const root = rootsById.get(expression.rootId);
|
|
1921
|
+
if (!root) {
|
|
1922
|
+
result = { origin: "unavailable", reason: "missing_root" };
|
|
1923
|
+
break;
|
|
1924
|
+
}
|
|
1925
|
+
result = capturedResult(root);
|
|
1926
|
+
break;
|
|
1927
|
+
}
|
|
1928
|
+
case "alias":
|
|
1929
|
+
result = evalChild(expression.from);
|
|
1930
|
+
break;
|
|
1931
|
+
case "binary": {
|
|
1932
|
+
const left = evalChild(expression.left);
|
|
1933
|
+
const right = evalChild(expression.right);
|
|
1934
|
+
const completeness = mergeCompleteness([left, right]);
|
|
1935
|
+
if (completeness === "unavailable") {
|
|
1936
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
1937
|
+
break;
|
|
1938
|
+
}
|
|
1939
|
+
const leftValue = unwrapExactPrimitive(left);
|
|
1940
|
+
const rightValue = unwrapExactPrimitive(right);
|
|
1941
|
+
if (rasputinTagKind(leftValue) || rasputinTagKind(rightValue)) {
|
|
1942
|
+
result = { origin: "unavailable", reason: "tagged_operand" };
|
|
1943
|
+
break;
|
|
1944
|
+
}
|
|
1945
|
+
if (isRedactedCapturedValue(leftValue) || isRedactedCapturedValue(rightValue)) {
|
|
1946
|
+
result = { origin: "unavailable", reason: "redacted_operand" };
|
|
1947
|
+
break;
|
|
1948
|
+
}
|
|
1949
|
+
if (expression.guard === "numeric") {
|
|
1950
|
+
if (!isNumericPrimitive(leftValue) || !isNumericPrimitive(rightValue)) {
|
|
1951
|
+
result = { origin: "unavailable", reason: "numeric_guard_failed" };
|
|
1952
|
+
break;
|
|
1953
|
+
}
|
|
1954
|
+
} else if (expression.guard === "primitive") {
|
|
1955
|
+
if (!isPrimitiveOperand(leftValue) || !isPrimitiveOperand(rightValue)) {
|
|
1956
|
+
result = { origin: "unavailable", reason: "primitive_guard_failed" };
|
|
1957
|
+
break;
|
|
1958
|
+
}
|
|
1959
|
+
}
|
|
1960
|
+
const value = applyBinary(expression.op, leftValue, rightValue);
|
|
1961
|
+
if (value === void 0) {
|
|
1962
|
+
result = { origin: "unavailable", reason: "unsupported_binary" };
|
|
1963
|
+
break;
|
|
1964
|
+
}
|
|
1965
|
+
result = {
|
|
1966
|
+
origin: "derived",
|
|
1967
|
+
completeness,
|
|
1968
|
+
value,
|
|
1969
|
+
dependencies: [expression.left, expression.right]
|
|
1970
|
+
};
|
|
1971
|
+
break;
|
|
1972
|
+
}
|
|
1973
|
+
case "unary": {
|
|
1974
|
+
const operand = evalChild(expression.operand);
|
|
1975
|
+
if (operand.origin === "unavailable") {
|
|
1976
|
+
result = operand;
|
|
1977
|
+
break;
|
|
1978
|
+
}
|
|
1979
|
+
const raw = operand.value;
|
|
1980
|
+
if (isRedactedCapturedValue(raw) || rasputinTagKind(raw)) {
|
|
1981
|
+
result = { origin: "unavailable", reason: "tagged_operand" };
|
|
1982
|
+
break;
|
|
1983
|
+
}
|
|
1984
|
+
if (expression.op === "typeof") {
|
|
1985
|
+
result = {
|
|
1986
|
+
origin: "derived",
|
|
1987
|
+
completeness: operand.completeness,
|
|
1988
|
+
value: typeof raw,
|
|
1989
|
+
dependencies: [expression.operand]
|
|
1990
|
+
};
|
|
1991
|
+
break;
|
|
1992
|
+
}
|
|
1993
|
+
if (expression.op === "not") {
|
|
1994
|
+
result = {
|
|
1995
|
+
origin: "derived",
|
|
1996
|
+
completeness: operand.completeness,
|
|
1997
|
+
value: !raw,
|
|
1998
|
+
dependencies: [expression.operand]
|
|
1999
|
+
};
|
|
2000
|
+
break;
|
|
2001
|
+
}
|
|
2002
|
+
if (!isNumericPrimitive(raw)) {
|
|
2003
|
+
result = { origin: "unavailable", reason: "numeric_guard_failed" };
|
|
2004
|
+
break;
|
|
2005
|
+
}
|
|
2006
|
+
result = {
|
|
2007
|
+
origin: "derived",
|
|
2008
|
+
completeness: operand.completeness,
|
|
2009
|
+
value: expression.op === "minus" ? -raw : +raw,
|
|
2010
|
+
dependencies: [expression.operand]
|
|
2011
|
+
};
|
|
2012
|
+
break;
|
|
2013
|
+
}
|
|
2014
|
+
case "logical": {
|
|
2015
|
+
const left = evalChild(expression.left);
|
|
2016
|
+
if (left.origin === "unavailable") {
|
|
2017
|
+
result = left;
|
|
2018
|
+
break;
|
|
2019
|
+
}
|
|
2020
|
+
const takeRight = expression.op === "and" ? Boolean(left.value) : expression.op === "or" ? !left.value : left.value == null;
|
|
2021
|
+
if (!takeRight) {
|
|
2022
|
+
result = left.origin === "derived" ? left : {
|
|
2023
|
+
origin: "derived",
|
|
2024
|
+
completeness: left.completeness,
|
|
2025
|
+
value: left.value,
|
|
2026
|
+
dependencies: [expression.left]
|
|
2027
|
+
};
|
|
2028
|
+
break;
|
|
2029
|
+
}
|
|
2030
|
+
const right = evalChild(expression.right);
|
|
2031
|
+
const completeness = mergeCompleteness([left, right]);
|
|
2032
|
+
if (completeness === "unavailable" || right.origin === "unavailable") {
|
|
2033
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
2034
|
+
break;
|
|
2035
|
+
}
|
|
2036
|
+
result = {
|
|
2037
|
+
origin: "derived",
|
|
2038
|
+
completeness,
|
|
2039
|
+
value: right.value,
|
|
2040
|
+
dependencies: [expression.left, expression.right]
|
|
2041
|
+
};
|
|
2042
|
+
break;
|
|
2043
|
+
}
|
|
2044
|
+
case "cond": {
|
|
2045
|
+
const test = evalChild(expression.test);
|
|
2046
|
+
if (test.origin === "unavailable") {
|
|
2047
|
+
result = test;
|
|
2048
|
+
break;
|
|
2049
|
+
}
|
|
2050
|
+
const fact = [...factsById.values()].find(
|
|
2051
|
+
(entry) => plan.controlFacts.some((definition) => definition.id === entry.factId)
|
|
2052
|
+
);
|
|
2053
|
+
const takeConsequent = fact ? fact.value : Boolean(test.value);
|
|
2054
|
+
const branch = evalChild(takeConsequent ? expression.consequent : expression.alternate);
|
|
2055
|
+
const completeness = mergeCompleteness([test, branch]);
|
|
2056
|
+
if (completeness === "unavailable" || branch.origin === "unavailable") {
|
|
2057
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
2058
|
+
break;
|
|
2059
|
+
}
|
|
2060
|
+
result = {
|
|
2061
|
+
origin: "derived",
|
|
2062
|
+
completeness,
|
|
2063
|
+
value: branch.value,
|
|
2064
|
+
dependencies: [
|
|
2065
|
+
expression.test,
|
|
2066
|
+
takeConsequent ? expression.consequent : expression.alternate
|
|
2067
|
+
]
|
|
2068
|
+
};
|
|
2069
|
+
break;
|
|
2070
|
+
}
|
|
2071
|
+
case "template": {
|
|
2072
|
+
const parts = [];
|
|
2073
|
+
let text = "";
|
|
2074
|
+
let failed;
|
|
2075
|
+
for (const part of expression.parts) {
|
|
2076
|
+
if (part.kind === "lit") {
|
|
2077
|
+
text += part.value;
|
|
2078
|
+
continue;
|
|
2079
|
+
}
|
|
2080
|
+
const nested = evalChild(part.expressionId);
|
|
2081
|
+
parts.push(nested);
|
|
2082
|
+
if (nested.origin === "unavailable") {
|
|
2083
|
+
failed = nested;
|
|
2084
|
+
break;
|
|
2085
|
+
}
|
|
2086
|
+
if (!isPrimitiveOperand(nested.value) || isRasputinTaggedValue(nested.value)) {
|
|
2087
|
+
failed = { origin: "unavailable", reason: "template_non_primitive" };
|
|
2088
|
+
break;
|
|
2089
|
+
}
|
|
2090
|
+
text += String(nested.value);
|
|
2091
|
+
}
|
|
2092
|
+
if (failed) {
|
|
2093
|
+
result = failed;
|
|
2094
|
+
break;
|
|
2095
|
+
}
|
|
2096
|
+
const completeness = parts.length === 0 ? "exact" : mergeCompleteness(parts);
|
|
2097
|
+
if (completeness === "unavailable") {
|
|
2098
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
2099
|
+
break;
|
|
2100
|
+
}
|
|
2101
|
+
result = {
|
|
2102
|
+
origin: "derived",
|
|
2103
|
+
completeness,
|
|
2104
|
+
value: text,
|
|
2105
|
+
dependencies: expression.parts.flatMap(
|
|
2106
|
+
(part) => part.kind === "expr" ? [part.expressionId] : []
|
|
2107
|
+
)
|
|
2108
|
+
};
|
|
2109
|
+
break;
|
|
2110
|
+
}
|
|
2111
|
+
case "object": {
|
|
2112
|
+
const record = {};
|
|
2113
|
+
const parts = [];
|
|
2114
|
+
let failed;
|
|
2115
|
+
for (const property of expression.properties) {
|
|
2116
|
+
const nested = evalChild(property.value);
|
|
2117
|
+
parts.push(nested);
|
|
2118
|
+
if (nested.origin === "unavailable") {
|
|
2119
|
+
failed = nested;
|
|
2120
|
+
break;
|
|
2121
|
+
}
|
|
2122
|
+
record[property.key] = nested.value;
|
|
2123
|
+
}
|
|
2124
|
+
if (failed) {
|
|
2125
|
+
result = failed;
|
|
2126
|
+
break;
|
|
2127
|
+
}
|
|
2128
|
+
const completeness = mergeCompleteness(parts);
|
|
2129
|
+
if (completeness === "unavailable") {
|
|
2130
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
2131
|
+
break;
|
|
2132
|
+
}
|
|
2133
|
+
result = {
|
|
2134
|
+
origin: "derived",
|
|
2135
|
+
completeness,
|
|
2136
|
+
value: record,
|
|
2137
|
+
dependencies: expression.properties.map((property) => property.value)
|
|
2138
|
+
};
|
|
2139
|
+
break;
|
|
2140
|
+
}
|
|
2141
|
+
case "array": {
|
|
2142
|
+
const items = [];
|
|
2143
|
+
const parts = [];
|
|
2144
|
+
let failed;
|
|
2145
|
+
let unknownCount = 0;
|
|
2146
|
+
for (const element of expression.elements) {
|
|
2147
|
+
if (typeof element !== "number") {
|
|
2148
|
+
items.push(rasputinUnknown());
|
|
2149
|
+
unknownCount++;
|
|
2150
|
+
continue;
|
|
2151
|
+
}
|
|
2152
|
+
const nested = evalChild(element);
|
|
2153
|
+
parts.push(nested);
|
|
2154
|
+
if (nested.origin === "unavailable") {
|
|
2155
|
+
failed = nested;
|
|
2156
|
+
break;
|
|
2157
|
+
}
|
|
2158
|
+
items.push(nested.value);
|
|
2159
|
+
}
|
|
2160
|
+
if (failed) {
|
|
2161
|
+
result = failed;
|
|
2162
|
+
break;
|
|
2163
|
+
}
|
|
2164
|
+
const completeness = unknownCount > 0 ? "partial" : parts.length === 0 ? "exact" : mergeCompleteness(parts);
|
|
2165
|
+
if (completeness === "unavailable") {
|
|
2166
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
2167
|
+
break;
|
|
2168
|
+
}
|
|
2169
|
+
result = {
|
|
2170
|
+
origin: "derived",
|
|
2171
|
+
completeness,
|
|
2172
|
+
value: items,
|
|
2173
|
+
dependencies: expression.elements.flatMap(
|
|
2174
|
+
(element) => typeof element === "number" ? [element] : []
|
|
2175
|
+
)
|
|
2176
|
+
};
|
|
2177
|
+
break;
|
|
2178
|
+
}
|
|
2179
|
+
case "prop": {
|
|
2180
|
+
const object = evalChild(expression.object);
|
|
2181
|
+
if (object.origin === "unavailable") {
|
|
2182
|
+
result = object;
|
|
2183
|
+
break;
|
|
2184
|
+
}
|
|
2185
|
+
if (isRedactedCapturedValue(object.value)) {
|
|
2186
|
+
result = { origin: "unavailable", reason: "redacted_operand" };
|
|
2187
|
+
break;
|
|
2188
|
+
}
|
|
2189
|
+
if (!isRecord2(object.value) || rasputinTagKind(object.value)) {
|
|
2190
|
+
result = { origin: "unavailable", reason: "prop_on_non_object" };
|
|
2191
|
+
break;
|
|
2192
|
+
}
|
|
2193
|
+
if (!(expression.key in object.value)) {
|
|
2194
|
+
result = { origin: "unavailable", reason: "missing_property" };
|
|
2195
|
+
break;
|
|
2196
|
+
}
|
|
2197
|
+
const value = object.value[expression.key];
|
|
2198
|
+
const completeness = object.completeness === "partial" || capturedValueCompleteness(value) === "partial" ? "partial" : "exact";
|
|
2199
|
+
result = {
|
|
2200
|
+
origin: "derived",
|
|
2201
|
+
completeness,
|
|
2202
|
+
value,
|
|
2203
|
+
dependencies: [expression.object]
|
|
2204
|
+
};
|
|
2205
|
+
break;
|
|
2206
|
+
}
|
|
2207
|
+
case "index": {
|
|
2208
|
+
const array = evalChild(expression.array);
|
|
2209
|
+
if (array.origin === "unavailable") {
|
|
2210
|
+
result = array;
|
|
2211
|
+
break;
|
|
2212
|
+
}
|
|
2213
|
+
if (!Array.isArray(array.value)) {
|
|
2214
|
+
result = { origin: "unavailable", reason: "index_on_non_array" };
|
|
2215
|
+
break;
|
|
2216
|
+
}
|
|
2217
|
+
if (expression.index < 0 || expression.index >= array.value.length) {
|
|
2218
|
+
result = { origin: "unavailable", reason: "index_out_of_range" };
|
|
2219
|
+
break;
|
|
2220
|
+
}
|
|
2221
|
+
const value = array.value[expression.index];
|
|
2222
|
+
if (rasputinTagKind(value) === "unknown") {
|
|
2223
|
+
result = { origin: "unavailable", reason: "array_hole" };
|
|
2224
|
+
break;
|
|
2225
|
+
}
|
|
2226
|
+
const completeness = array.completeness === "partial" || capturedValueCompleteness(value) === "partial" ? "partial" : "exact";
|
|
2227
|
+
result = {
|
|
2228
|
+
origin: "derived",
|
|
2229
|
+
completeness,
|
|
2230
|
+
value,
|
|
2231
|
+
dependencies: [expression.array]
|
|
2232
|
+
};
|
|
2233
|
+
break;
|
|
2234
|
+
}
|
|
2235
|
+
case "pure_call": {
|
|
2236
|
+
const callee = calleeReturns.get(expression.calleeFunctionId);
|
|
2237
|
+
if (!callee || callee.fallbackReason || callee.returnExpressionId == null) {
|
|
2238
|
+
result = { origin: "unavailable", reason: "unproven_callee" };
|
|
2239
|
+
break;
|
|
2240
|
+
}
|
|
2241
|
+
const callArgs = [];
|
|
2242
|
+
const parts = [];
|
|
2243
|
+
let failed;
|
|
2244
|
+
for (const argId of expression.args) {
|
|
2245
|
+
const nested = evalChild(argId);
|
|
2246
|
+
parts.push(nested);
|
|
2247
|
+
if (nested.origin === "unavailable") {
|
|
2248
|
+
failed = nested;
|
|
2249
|
+
break;
|
|
2250
|
+
}
|
|
2251
|
+
callArgs.push(nested.value);
|
|
2252
|
+
}
|
|
2253
|
+
if (failed) {
|
|
2254
|
+
result = failed;
|
|
2255
|
+
break;
|
|
2256
|
+
}
|
|
2257
|
+
const completeness = mergeCompleteness(parts);
|
|
2258
|
+
if (completeness === "unavailable") {
|
|
2259
|
+
result = { origin: "unavailable", reason: "partial_dependency" };
|
|
2260
|
+
break;
|
|
2261
|
+
}
|
|
2262
|
+
if (state.recordingCallId != null) {
|
|
2263
|
+
recordReconstructedCallArgs(
|
|
2264
|
+
state.omittedCallArgs,
|
|
2265
|
+
state.recordingCallId,
|
|
2266
|
+
expression.calleeFunctionId,
|
|
2267
|
+
callArgs
|
|
2268
|
+
);
|
|
2269
|
+
}
|
|
2270
|
+
const returned = evaluateCallee(callee, callArgs);
|
|
2271
|
+
if (returned.origin === "unavailable") {
|
|
2272
|
+
result = returned;
|
|
2273
|
+
break;
|
|
2274
|
+
}
|
|
2275
|
+
result = {
|
|
2276
|
+
origin: "derived",
|
|
2277
|
+
completeness: completeness === "partial" || returned.completeness === "partial" ? "partial" : "exact",
|
|
2278
|
+
value: returned.value,
|
|
2279
|
+
dependencies: expression.args
|
|
2280
|
+
};
|
|
2281
|
+
break;
|
|
2282
|
+
}
|
|
2283
|
+
}
|
|
2284
|
+
if (result.origin !== "unavailable") {
|
|
2285
|
+
state.outputBytes += estimateBytes(result.value);
|
|
2286
|
+
const sizeOver = budgetExceeded(state);
|
|
2287
|
+
if (sizeOver) result = { origin: "unavailable", reason: sizeOver };
|
|
2288
|
+
}
|
|
2289
|
+
if (result.origin === "derived" && result.completeness === "exact") {
|
|
2290
|
+
for (const dep of result.dependencies) {
|
|
2291
|
+
const child = cells.get(dep);
|
|
2292
|
+
if (child?.status === "done" && child.result.origin !== "unavailable") {
|
|
2293
|
+
if (child.result.completeness === "partial") {
|
|
2294
|
+
result = { ...result, completeness: "partial" };
|
|
2295
|
+
break;
|
|
2296
|
+
}
|
|
2297
|
+
}
|
|
2298
|
+
}
|
|
2299
|
+
}
|
|
2300
|
+
cells.set(expressionId, { status: "done", result });
|
|
2301
|
+
return result;
|
|
2302
|
+
} finally {
|
|
2303
|
+
state.depth--;
|
|
2304
|
+
}
|
|
2305
|
+
};
|
|
2306
|
+
var isJsPrimitive = (value) => {
|
|
2307
|
+
const type = typeof value;
|
|
2308
|
+
return value === null || type !== "object" && type !== "function";
|
|
2309
|
+
};
|
|
2310
|
+
var abstractEquals = (left, right) => {
|
|
2311
|
+
if (!isJsPrimitive(left) || !isJsPrimitive(right)) return void 0;
|
|
2312
|
+
return left == right;
|
|
2313
|
+
};
|
|
2314
|
+
var applyBinary = (op, left, right) => {
|
|
2315
|
+
if (op === "add" && typeof left === "number" && typeof right === "number") return left + right;
|
|
2316
|
+
if (op === "add" && typeof left === "string" && typeof right === "string") return left + right;
|
|
2317
|
+
if (typeof left !== "number" || typeof right !== "number") {
|
|
2318
|
+
if (op === "eq") return abstractEquals(left, right);
|
|
2319
|
+
if (op === "neq") {
|
|
2320
|
+
const equal = abstractEquals(left, right);
|
|
2321
|
+
return equal === void 0 ? void 0 : !equal;
|
|
2322
|
+
}
|
|
2323
|
+
if (op === "seq") return left === right;
|
|
2324
|
+
if (op === "sneq") return left !== right;
|
|
2325
|
+
return void 0;
|
|
2326
|
+
}
|
|
2327
|
+
switch (op) {
|
|
2328
|
+
case "add":
|
|
2329
|
+
return left + right;
|
|
2330
|
+
case "sub":
|
|
2331
|
+
return left - right;
|
|
2332
|
+
case "mul":
|
|
2333
|
+
return left * right;
|
|
2334
|
+
case "div":
|
|
2335
|
+
return left / right;
|
|
2336
|
+
case "mod":
|
|
2337
|
+
return left % right;
|
|
2338
|
+
case "eq":
|
|
2339
|
+
return left === right;
|
|
2340
|
+
case "neq":
|
|
2341
|
+
return left !== right;
|
|
2342
|
+
case "seq":
|
|
2343
|
+
return left === right;
|
|
2344
|
+
case "sneq":
|
|
2345
|
+
return left !== right;
|
|
2346
|
+
case "lt":
|
|
2347
|
+
return left < right;
|
|
2348
|
+
case "lte":
|
|
2349
|
+
return left <= right;
|
|
2350
|
+
case "gt":
|
|
2351
|
+
return left > right;
|
|
2352
|
+
case "gte":
|
|
2353
|
+
return left >= right;
|
|
2354
|
+
}
|
|
2355
|
+
};
|
|
2356
|
+
var evaluatePlan = (plan, args, roots, facts, plansByFunctionId, state, recordingCallId) => {
|
|
2357
|
+
const previousRecordingCallId = state.recordingCallId;
|
|
2358
|
+
state.recordingCallId = recordingCallId;
|
|
2359
|
+
try {
|
|
2360
|
+
const byId = new Map(plan.expressions.map((expression) => [expression.id, expression]));
|
|
2361
|
+
const cells = /* @__PURE__ */ new Map();
|
|
2362
|
+
const rootsById = new Map(roots.map((root) => [root.rootId, root]));
|
|
2363
|
+
const factsById = new Map(facts.map((fact) => [fact.factId, fact]));
|
|
2364
|
+
const evaluateCallee = (callee, callArgs) => {
|
|
2365
|
+
if (callee.returnExpressionId == null) {
|
|
2366
|
+
return { origin: "unavailable", reason: "callee_without_return" };
|
|
2367
|
+
}
|
|
2368
|
+
const nested = evaluatePlan(callee, callArgs, [], [], plansByFunctionId, state, null);
|
|
2369
|
+
return nested.returnValue ?? { origin: "unavailable", reason: "callee_without_return" };
|
|
2370
|
+
};
|
|
2371
|
+
const values = {};
|
|
2372
|
+
for (const expression of plan.expressions) {
|
|
2373
|
+
values[expression.id] = evaluateExpression(
|
|
2374
|
+
expression.id,
|
|
2375
|
+
plan,
|
|
2376
|
+
byId,
|
|
2377
|
+
cells,
|
|
2378
|
+
args,
|
|
2379
|
+
rootsById,
|
|
2380
|
+
factsById,
|
|
2381
|
+
plansByFunctionId,
|
|
2382
|
+
state,
|
|
2383
|
+
evaluateCallee
|
|
2384
|
+
);
|
|
2385
|
+
}
|
|
2386
|
+
const variables = plan.variables.map((variable) => ({
|
|
2387
|
+
variableId: variable.id,
|
|
2388
|
+
name: variable.name,
|
|
2389
|
+
availableAtLine: variable.availableAtLine,
|
|
2390
|
+
availableAtColumn: variable.availableAtColumn,
|
|
2391
|
+
result: values[variable.expressionId] ?? {
|
|
2392
|
+
origin: "unavailable",
|
|
2393
|
+
reason: "missing_expression"
|
|
2394
|
+
}
|
|
2395
|
+
}));
|
|
2396
|
+
return {
|
|
2397
|
+
functionId: plan.functionId,
|
|
2398
|
+
callId: roots[0]?.callId ?? facts[0]?.callId ?? 0,
|
|
2399
|
+
values,
|
|
2400
|
+
variables,
|
|
2401
|
+
returnValue: plan.returnExpressionId == null ? void 0 : values[plan.returnExpressionId] ?? {
|
|
2402
|
+
origin: "unavailable",
|
|
2403
|
+
reason: "missing_return"
|
|
2404
|
+
}
|
|
2405
|
+
};
|
|
2406
|
+
} finally {
|
|
2407
|
+
state.recordingCallId = previousRecordingCallId;
|
|
2408
|
+
}
|
|
2409
|
+
};
|
|
2410
|
+
var evaluateRuntimeDerivation = (input) => {
|
|
2411
|
+
if (!input.manifest) {
|
|
2412
|
+
return { unavailableReason: "missing_manifest", functions: [] };
|
|
2413
|
+
}
|
|
2414
|
+
if (input.manifest.schema_version !== 3) {
|
|
2415
|
+
return { unavailableReason: "manifest_version_mismatch", functions: [] };
|
|
2416
|
+
}
|
|
2417
|
+
const expectedHash = input.state.derivation?.manifestHash;
|
|
2418
|
+
if (!expectedHash) {
|
|
2419
|
+
return { unavailableReason: "missing_manifest_hash", functions: [] };
|
|
2420
|
+
}
|
|
2421
|
+
if (hashInstrumentationManifest(input.manifest) !== expectedHash) {
|
|
2422
|
+
return { unavailableReason: "manifest_hash_mismatch", functions: [] };
|
|
2423
|
+
}
|
|
2424
|
+
const plansByFunctionId = new Map(
|
|
2425
|
+
input.manifest.derivationPlans.map((plan) => [plan.functionId, plan])
|
|
2426
|
+
);
|
|
2427
|
+
const roots = input.state.derivation?.roots ?? [];
|
|
2428
|
+
const facts = input.state.derivation?.controlFacts ?? [];
|
|
2429
|
+
const state = {
|
|
2430
|
+
instructions: 0,
|
|
2431
|
+
depth: 0,
|
|
2432
|
+
outputBytes: 0,
|
|
2433
|
+
startedAt: Date.now(),
|
|
2434
|
+
recordingCallId: null,
|
|
2435
|
+
omittedCallArgs: /* @__PURE__ */ new Map()
|
|
2436
|
+
};
|
|
2437
|
+
const enterEvents = input.state.events.filter((event) => event.type === "function_enter");
|
|
2438
|
+
const functions = [];
|
|
2439
|
+
for (const enter of enterEvents) {
|
|
2440
|
+
const plan = plansByFunctionId.get(enter.functionId);
|
|
2441
|
+
if (!plan || plan.fallbackReason) continue;
|
|
2442
|
+
const callRoots = roots.filter((root) => root.callId === enter.callId);
|
|
2443
|
+
const callFacts = facts.filter((fact) => fact.callId === enter.callId);
|
|
2444
|
+
const evaluated = evaluatePlan(
|
|
2445
|
+
plan,
|
|
2446
|
+
resolveEnterArgs(enter, state.omittedCallArgs),
|
|
2447
|
+
callRoots,
|
|
2448
|
+
callFacts,
|
|
2449
|
+
plansByFunctionId,
|
|
2450
|
+
state,
|
|
2451
|
+
enter.callId
|
|
2452
|
+
);
|
|
2453
|
+
evaluated.callId = enter.callId;
|
|
2454
|
+
functions.push(evaluated);
|
|
2455
|
+
}
|
|
2456
|
+
return { functions };
|
|
2457
|
+
};
|
|
2458
|
+
var evaluatedValueAtLine = (evaluated, line) => {
|
|
2459
|
+
if (!evaluated) return [];
|
|
2460
|
+
return evaluated.variables.filter((variable) => line == null || variable.availableAtLine <= line).map((variable) => ({ name: variable.name, result: variable.result }));
|
|
2461
|
+
};
|
|
2462
|
+
|
|
1533
2463
|
// src/instrumentation-manifest/instrumentation-manifest-types.ts
|
|
1534
|
-
var INSTRUMENTATION_MANIFEST_SCHEMA_VERSION =
|
|
2464
|
+
var INSTRUMENTATION_MANIFEST_SCHEMA_VERSION = 3;
|
|
1535
2465
|
|
|
1536
2466
|
// src/instrumentation-manifest/upload-instrumentation-manifest.ts
|
|
1537
2467
|
var uploadInstrumentationManifest = async (options) => {
|
|
@@ -1558,15 +2488,29 @@ var uploadInstrumentationManifest = async (options) => {
|
|
|
1558
2488
|
};
|
|
1559
2489
|
export {
|
|
1560
2490
|
INSTRUMENTATION_MANIFEST_SCHEMA_VERSION,
|
|
2491
|
+
RASPUTIN_WIRE_TAG,
|
|
1561
2492
|
announceDeploy,
|
|
2493
|
+
capturedValueCompleteness,
|
|
1562
2494
|
createClient,
|
|
1563
2495
|
createIngestEvent,
|
|
1564
2496
|
createSuppression,
|
|
1565
2497
|
createTransport,
|
|
1566
2498
|
detectRelease,
|
|
2499
|
+
evaluateRuntimeDerivation,
|
|
2500
|
+
evaluatedValueAtLine,
|
|
2501
|
+
hashInstrumentationManifest,
|
|
1567
2502
|
isClientEnabled,
|
|
2503
|
+
isRasputinTaggedValue,
|
|
2504
|
+
isRedactedCapturedValue,
|
|
2505
|
+
isSerializerMarker,
|
|
1568
2506
|
normalizeFrames,
|
|
1569
2507
|
parseStack,
|
|
2508
|
+
rasputinOmitted,
|
|
2509
|
+
rasputinRedacted,
|
|
2510
|
+
rasputinTagKind,
|
|
2511
|
+
rasputinTruncated,
|
|
2512
|
+
rasputinUnavailable,
|
|
2513
|
+
rasputinUnknown,
|
|
1570
2514
|
repoRootFrom,
|
|
1571
2515
|
resetSourceIdentityCache,
|
|
1572
2516
|
resolveEndpointUrls,
|