@rasputin-ai/core 0.5.0-alpha.6 → 0.5.0-alpha.8

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/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.6";
662
+ var SDK_VERSION = "0.5.0-alpha.8";
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 = 2;
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,