@nudojs/core 1.9.2 → 1.9.4

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.
@@ -4612,7 +4612,12 @@ var NudoUnsupportedError = class extends Error {
4612
4612
  };
4613
4613
 
4614
4614
  // src/algebra/param-surface.ts
4615
- function collectPatternNames(p, top, nested, depth, propKey) {
4615
+ function pushNestedPath(prefix, key, nestedPaths) {
4616
+ if (prefix.length === 0 || !key) return;
4617
+ if (key.includes(".") || prefix.some((seg) => seg.includes("."))) return;
4618
+ nestedPaths.push([...prefix, key].join("."));
4619
+ }
4620
+ function collectPatternNames(p, top, nested, depth, propKey, prefix, nestedPaths) {
4616
4621
  if (!p) return;
4617
4622
  if (p.type === "Identifier" && p.name) {
4618
4623
  if (depth === 0) top.push(p.name);
@@ -4620,17 +4625,17 @@ function collectPatternNames(p, top, nested, depth, propKey) {
4620
4625
  return;
4621
4626
  }
4622
4627
  if (p.type === "AssignmentPattern") {
4623
- collectPatternNames(p.left, top, nested, depth, propKey);
4628
+ collectPatternNames(p.left, top, nested, depth, propKey, prefix, nestedPaths);
4624
4629
  return;
4625
4630
  }
4626
4631
  if (p.type === "RestElement") {
4627
- collectPatternNames(p.argument, top, nested, depth, propKey);
4632
+ collectPatternNames(p.argument, top, nested, depth, propKey, prefix, nestedPaths);
4628
4633
  return;
4629
4634
  }
4630
4635
  if (p.type === "ObjectPattern") {
4631
4636
  for (const prop of p.properties ?? []) {
4632
4637
  if (prop.type === "RestElement" || prop.argument) {
4633
- collectPatternNames(prop.argument, top, nested, depth, propKey);
4638
+ collectPatternNames(prop.argument, top, nested, depth, propKey, prefix, nestedPaths);
4634
4639
  continue;
4635
4640
  }
4636
4641
  const keyName = prop.key?.type === "Identifier" && prop.key.name ? prop.key.name : prop.key && "value" in prop.key ? String(prop.key.value ?? "") : void 0;
@@ -4642,7 +4647,17 @@ function collectPatternNames(p, top, nested, depth, propKey) {
4642
4647
  else nested.push(keyName);
4643
4648
  if (propKey && depth === 0) propKey[keyName] = keyName;
4644
4649
  }
4650
+ const patternValueKeyRule = () => {
4651
+ if (!keyName) return;
4652
+ if (depth === 0 && prefix.length === 0) {
4653
+ top.push(keyName);
4654
+ if (propKey) propKey[keyName] = keyName;
4655
+ } else {
4656
+ pushNestedPath(prefix, keyName, nestedPaths);
4657
+ }
4658
+ };
4645
4659
  if (v2.type === "Identifier" && v2.name) {
4660
+ pushNestedPath(prefix, keyName ?? "", nestedPaths);
4646
4661
  if (depth === 0) {
4647
4662
  top.push(v2.name);
4648
4663
  if (propKey && keyName) propKey[v2.name] = keyName;
@@ -4650,15 +4665,38 @@ function collectPatternNames(p, top, nested, depth, propKey) {
4650
4665
  } else if (v2.type === "AssignmentPattern") {
4651
4666
  const left = v2.left;
4652
4667
  if (left?.type === "Identifier" && left.name) {
4668
+ pushNestedPath(prefix, keyName ?? "", nestedPaths);
4653
4669
  if (depth === 0) {
4654
4670
  top.push(left.name);
4655
4671
  if (propKey && keyName) propKey[left.name] = keyName;
4656
4672
  } else nested.push(left.name);
4673
+ } else if (left && (left.type === "ObjectPattern" || left.type === "ArrayPattern")) {
4674
+ patternValueKeyRule();
4675
+ collectPatternNames(
4676
+ v2,
4677
+ top,
4678
+ nested,
4679
+ depth,
4680
+ propKey,
4681
+ prefix.concat(keyName ? [keyName] : []),
4682
+ nestedPaths
4683
+ );
4657
4684
  } else {
4658
- collectPatternNames(v2, top, nested, depth, propKey);
4685
+ collectPatternNames(v2, top, nested, depth, propKey, prefix, nestedPaths);
4659
4686
  }
4687
+ } else if (v2.type === "ObjectPattern" || v2.type === "ArrayPattern") {
4688
+ patternValueKeyRule();
4689
+ collectPatternNames(
4690
+ v2,
4691
+ top,
4692
+ nested,
4693
+ depth + 1,
4694
+ propKey,
4695
+ prefix.concat(keyName ? [keyName] : []),
4696
+ nestedPaths
4697
+ );
4660
4698
  } else {
4661
- collectPatternNames(v2, top, nested, depth + 1, propKey);
4699
+ collectPatternNames(v2, top, nested, depth + 1, propKey, prefix, nestedPaths);
4662
4700
  }
4663
4701
  }
4664
4702
  return;
@@ -4670,9 +4708,9 @@ function collectPatternNames(p, top, nested, depth, propKey) {
4670
4708
  if (depth === 0) top.push(el.name);
4671
4709
  else nested.push(el.name);
4672
4710
  } else if (el.type === "AssignmentPattern") {
4673
- collectPatternNames(el, top, nested, depth, propKey);
4711
+ collectPatternNames(el, top, nested, depth, propKey, [], nestedPaths);
4674
4712
  } else {
4675
- collectPatternNames(el, top, nested, depth + 1, propKey);
4713
+ collectPatternNames(el, top, nested, depth + 1, propKey, [], nestedPaths);
4676
4714
  }
4677
4715
  }
4678
4716
  }
@@ -4691,13 +4729,15 @@ function formalParamsFromNodes(params) {
4691
4729
  const top2 = [];
4692
4730
  const nested2 = [];
4693
4731
  const propKey2 = {};
4694
- if (left) collectPatternNames(left, top2, nested2, 0, propKey2);
4732
+ const nestedPaths2 = [];
4733
+ if (left) collectPatternNames(left, top2, nested2, 0, propKey2, [], nestedPaths2);
4695
4734
  return {
4696
4735
  kind: "pattern",
4697
4736
  placeholder: `_p${index}`,
4698
4737
  bound: top2,
4699
4738
  propKey: propKey2,
4700
4739
  nested: nested2,
4740
+ nestedPaths: nestedPaths2,
4701
4741
  index
4702
4742
  };
4703
4743
  }
@@ -4709,13 +4749,15 @@ function formalParamsFromNodes(params) {
4709
4749
  const top = [];
4710
4750
  const nested = [];
4711
4751
  const propKey = {};
4712
- if (p) collectPatternNames(p, top, nested, 0, propKey);
4752
+ const nestedPaths = [];
4753
+ if (p) collectPatternNames(p, top, nested, 0, propKey, [], nestedPaths);
4713
4754
  return {
4714
4755
  kind: "pattern",
4715
4756
  placeholder: `_p${index}`,
4716
4757
  bound: top,
4717
4758
  propKey,
4718
4759
  nested,
4760
+ nestedPaths,
4719
4761
  index
4720
4762
  };
4721
4763
  });
@@ -4757,6 +4799,7 @@ function contractParamNameSet(formals) {
4757
4799
  out.add(f.placeholder);
4758
4800
  out.add("_");
4759
4801
  for (const b of f.bound) out.add(b);
4802
+ for (const np of f.nestedPaths) out.add(np);
4760
4803
  }
4761
4804
  }
4762
4805
  return out;
@@ -4774,10 +4817,16 @@ function locateContractParam(formals, contractName) {
4774
4817
  return { index: f.index };
4775
4818
  }
4776
4819
  if (f.bound.includes(contractName)) {
4777
- return { index: f.index, field: f.propKey?.[contractName] ?? contractName };
4820
+ const field = f.propKey?.[contractName] ?? contractName;
4821
+ return { index: f.index, field, fieldPath: [field] };
4778
4822
  }
4779
4823
  }
4780
4824
  }
4825
+ for (const f of formals) {
4826
+ if (f.kind === "pattern" && f.nestedPaths.includes(contractName)) {
4827
+ return { index: f.index, field: contractName, fieldPath: contractName.split(".") };
4828
+ }
4829
+ }
4781
4830
  return void 0;
4782
4831
  }
4783
4832
 
@@ -6087,9 +6136,17 @@ var memberGuardTarget = (n) => {
6087
6136
  const t = n;
6088
6137
  const m = t?.type === "ChainExpression" ? t.expression : t;
6089
6138
  if (m?.type !== "MemberExpression" && m?.type !== "OptionalMemberExpression") return void 0;
6090
- if (m.computed) return void 0;
6091
6139
  if (m.object?.type !== "Identifier" || !m.object.name) return void 0;
6092
6140
  const p = m.property;
6141
+ if (m.computed) {
6142
+ if (p?.type === "NumericLiteral" && typeof p.value === "number") {
6143
+ return { name: m.object.name, key: String(p.value) };
6144
+ }
6145
+ if (p?.type === "StringLiteral" && typeof p.value === "string" && /^-?\d+$/.test(p.value)) {
6146
+ return { name: m.object.name, key: p.value };
6147
+ }
6148
+ return void 0;
6149
+ }
6093
6150
  const key = p?.type === "Identifier" ? p.name : p?.type === "StringLiteral" && typeof p.value === "string" ? p.value : void 0;
6094
6151
  if (key === void 0) return void 0;
6095
6152
  return { name: m.object.name, key };
@@ -6196,19 +6253,89 @@ function mergeGuardInto(list, g) {
6196
6253
  if (grainA !== grainB) prev.grain = "nullish";
6197
6254
  if (prev.memberKey === void 0 && g.memberKey !== void 0) prev.memberKey = g.memberKey;
6198
6255
  }
6256
+ var methodReceiverTarget = (callee) => {
6257
+ const c = callee;
6258
+ if (c?.type !== "MemberExpression") return void 0;
6259
+ const o = c.object;
6260
+ if (o?.type === "Identifier" && o.name) return { name: o.name };
6261
+ if (o?.type === "MemberExpression") return memberGuardTarget(o);
6262
+ return void 0;
6263
+ };
6264
+ var collectReceiverFacts = (n, ctx2, out) => {
6265
+ if (ctx2 === null || !n || typeof n !== "object") return;
6266
+ const t = n;
6267
+ switch (t.type) {
6268
+ case "LogicalExpression":
6269
+ if (t.operator === "&&" || t.operator === "||") {
6270
+ const rArm = t.operator === "&&" ? "cons" : "alt";
6271
+ collectReceiverFacts(t.left, ctx2, out);
6272
+ collectReceiverFacts(
6273
+ t.right,
6274
+ ctx2 === "both" || ctx2 === rArm ? rArm : null,
6275
+ out
6276
+ );
6277
+ } else if (t.operator === "??") {
6278
+ collectReceiverFacts(t.left, ctx2, out);
6279
+ }
6280
+ return;
6281
+ case "ConditionalExpression":
6282
+ collectReceiverFacts(t.test, ctx2, out);
6283
+ return;
6284
+ case "CallExpression": {
6285
+ const recv = methodReceiverTarget(t.callee);
6286
+ if (recv) {
6287
+ for (const arm of ctx2 === "both" ? ["cons", "alt"] : [ctx2]) {
6288
+ out.push({
6289
+ name: recv.name,
6290
+ arm,
6291
+ grain: "nullish",
6292
+ ...recv.key !== void 0 ? { memberKey: recv.key } : {}
6293
+ });
6294
+ }
6295
+ }
6296
+ collectReceiverFacts(t.callee, ctx2, out);
6297
+ for (const a of t.arguments ?? []) collectReceiverFacts(a, ctx2, out);
6298
+ return;
6299
+ }
6300
+ default:
6301
+ collectReceiverFacts(t.left, ctx2, out);
6302
+ collectReceiverFacts(t.right, ctx2, out);
6303
+ collectReceiverFacts(t.argument, ctx2, out);
6304
+ collectReceiverFacts(t.object, ctx2, out);
6305
+ if (t.computed) collectReceiverFacts(t.property, ctx2, out);
6306
+ return;
6307
+ }
6308
+ };
6309
+ function appendReceiverGuards(test, out) {
6310
+ const facts = [];
6311
+ collectReceiverFacts(test, "both", facts);
6312
+ for (const f of facts) {
6313
+ const prev = out.find((x) => x.name === f.name && x.arm === f.arm);
6314
+ if (!prev) {
6315
+ out.push(f);
6316
+ continue;
6317
+ }
6318
+ const grainA = prev.grain ?? "nullish";
6319
+ const grainB = f.grain ?? "nullish";
6320
+ if (grainA !== grainB) prev.grain = "nullish";
6321
+ if (prev.memberKey === void 0 && f.memberKey !== void 0) prev.memberKey = f.memberKey;
6322
+ }
6323
+ }
6199
6324
  function nullishGuardsOf(test) {
6200
6325
  const t = test;
6201
6326
  if (t?.type === "LogicalExpression" && (t.operator === "||" || t.operator === "&&")) {
6202
6327
  const wantArm = t.operator === "||" ? "alt" : "cons";
6203
- const out = [];
6328
+ const out2 = [];
6204
6329
  for (const g2 of [...nullishGuardsOf(t.left), ...nullishGuardsOf(t.right)]) {
6205
6330
  if (g2.arm !== wantArm) continue;
6206
- mergeGuardInto(out, g2);
6331
+ mergeGuardInto(out2, g2);
6207
6332
  }
6208
- return out;
6333
+ return out2;
6209
6334
  }
6210
6335
  const g = nullishGuardOf(test);
6211
- return g ? [g] : [];
6336
+ const out = g ? [g] : [];
6337
+ appendReceiverGuards(test, out);
6338
+ return out;
6212
6339
  }
6213
6340
  function typeGuardOf(test) {
6214
6341
  const t = test;
@@ -16892,10 +17019,32 @@ function execRegexBrand(re, method, args) {
16892
17019
  if (method === "test") {
16893
17020
  return abs({ k: "prim", type: "boolean" }, void 0, void 0, "partial");
16894
17021
  }
16895
- const element = joinAbs(str(), undefAbs());
16896
- const matchAbs = abs({ k: "arr", element }, void 0, void 0, "path");
16897
- const nullAbs = abs({ k: "unknown" }, { op: "lit", value: null }, void 0, "exact");
16898
- return joinAbs(nullAbs, matchAbs);
17022
+ let probe = null;
17023
+ try {
17024
+ probe = new RegExp(`${parts.pat}|`).exec("");
17025
+ } catch {
17026
+ probe = null;
17027
+ }
17028
+ const nullArm = abs({ k: "unknown" }, { op: "lit", value: null }, void 0, "exact");
17029
+ if (!probe) {
17030
+ const element = joinAbs(str(), undefAbs());
17031
+ return joinAbs(nullArm, abs({ k: "arr", element }, void 0, void 0, "path"));
17032
+ }
17033
+ const ng = probe.length - 1;
17034
+ const slots = {
17035
+ "0": { value: str() },
17036
+ length: { value: numLit(probe.length) },
17037
+ index: { value: num() },
17038
+ input: { value: str() }
17039
+ };
17040
+ for (let i = 1; i <= ng; i++) {
17041
+ slots[String(i)] = { value: joinAbs(str(), undefAbs()) };
17042
+ }
17043
+ const groupNames = probe.groups ? Object.keys(probe.groups) : [];
17044
+ slots["groups"] = {
17045
+ value: groupNames.length ? objOf(Object.fromEntries(groupNames.map((n) => [n, { value: joinAbs(str(), undefAbs()) }]))) : undefAbs()
17046
+ };
17047
+ return joinAbs(nullArm, abs({ k: "obj", slots }, void 0, void 0, "path"));
16899
17048
  }
16900
17049
  try {
16901
17050
  return regexExecWithState(re, method, subject).result;
@@ -15,6 +15,7 @@ import {
15
15
  fnConstraintToEntryReqs,
16
16
  foldRequireSpecArg,
17
17
  formalParamDisplayNames,
18
+ formalParamSignatureNames,
18
19
  formalParamsFromNodes,
19
20
  formatAbs,
20
21
  formatShape,
@@ -46,7 +47,7 @@ import {
46
47
  withEvalBudgetOverride,
47
48
  withExecPhi,
48
49
  withFnBudgetOverride
49
- } from "./chunk-XR3TE4C2.js";
50
+ } from "./chunk-PGTNSUTE.js";
50
51
 
51
52
  // src/algebra/directive-scan.ts
52
53
  function cleanDirectiveLine(raw, kind) {
@@ -2240,8 +2241,13 @@ function formatEffectiveInterfaceDisplay(eff) {
2240
2241
  if (eff.returns) s += ` \u2192 ${formatConstraint(eff.returns.constraint)}`;
2241
2242
  return s;
2242
2243
  }
2243
- function formatInterfaceTierLine(source) {
2244
- return `\u25CF interface / ${source}`;
2244
+ var INTERFACE_SOURCE_ABBR = {
2245
+ handwritten: "hw",
2246
+ generated: "gen",
2247
+ implicit: "imp"
2248
+ };
2249
+ function formatInterfaceTierLine(source, active = true) {
2250
+ return `${active ? "\u25CF" : "\u25CB"} contract / ${INTERFACE_SOURCE_ABBR[source]}`;
2245
2251
  }
2246
2252
  function interfaceTierOf(source, fnName, fromFile, opts = {}) {
2247
2253
  if (!localNamedExports(source).has(fnName)) return void 0;
@@ -2469,11 +2475,11 @@ function sidecarSpecsOf(source) {
2469
2475
  (spec) => (spec.startsWith(".") || spec.startsWith("/")) && (spec.endsWith(".nudo.js") || spec.endsWith(".nudo.ts"))
2470
2476
  );
2471
2477
  }
2472
- function loadOrMiss(loadModule, spec, from) {
2478
+ function tryLoadDeps(loadModule, spec, from) {
2473
2479
  try {
2474
- return loadModule(spec, from);
2480
+ return { src: loadModule(spec, from), err: false };
2475
2481
  } catch {
2476
- return void 0;
2482
+ return { src: void 0, err: true };
2477
2483
  }
2478
2484
  }
2479
2485
  function loadModuleDepsFingerprint(source, loadModule, fromFile) {
@@ -2486,16 +2492,35 @@ function loadModuleDepsFingerprint(source, loadModule, fromFile) {
2486
2492
  );
2487
2493
  let n = 0;
2488
2494
  let truncated = false;
2495
+ let readError = false;
2496
+ const load = (spec, from) => {
2497
+ const a = tryLoadDeps(loadModule, spec, from);
2498
+ if (a.err) readError = true;
2499
+ return a;
2500
+ };
2489
2501
  const finish = () => {
2490
2502
  parts.sort();
2491
- return truncated ? { fp: `trunc:${parts.join(",")}`, paths, contents, truncated: true } : { fp: parts.join(","), paths, contents, truncated: false };
2503
+ const prefix = truncated ? "trunc:" : readError ? "readerr:" : "";
2504
+ return {
2505
+ fp: `${prefix}${parts.join(",")}`,
2506
+ paths,
2507
+ contents,
2508
+ truncated,
2509
+ readError
2510
+ };
2492
2511
  };
2493
2512
  const absorbSidecarClosure = (entryFile) => {
2494
2513
  const sidecarPath = sidecarPathOf(entryFile);
2495
2514
  if (seen.has(sidecarPath)) return;
2496
2515
  const sidecarSpec = `./${sidecarPath.slice(sidecarPath.lastIndexOf("/") + 1)}`;
2497
- const sidecarSrc = loadOrMiss(loadModule, sidecarSpec, entryFile);
2498
- if (sidecarSrc === void 0) return;
2516
+ const root = load(sidecarSpec, entryFile);
2517
+ if (root.err) {
2518
+ paths.push(sidecarPath);
2519
+ contents.push({ path: sidecarPath, content: null });
2520
+ return;
2521
+ }
2522
+ if (root.src === void 0) return;
2523
+ const sidecarSrc = root.src;
2499
2524
  if (n >= MAX_LOAD_DEP_NODES) {
2500
2525
  truncated = true;
2501
2526
  return;
@@ -2518,7 +2543,7 @@ function loadModuleDepsFingerprint(source, loadModule, fromFile) {
2518
2543
  if (seen.has(path)) continue;
2519
2544
  seen.add(path);
2520
2545
  n++;
2521
- const src = loadOrMiss(loadModule, cur.spec, cur.from);
2546
+ const src = load(cur.spec, cur.from).src;
2522
2547
  parts.push(`sidecar:${path}=${src === void 0 ? "miss" : hashSource(src)}`);
2523
2548
  paths.push(path);
2524
2549
  contents.push({ path, content: src ?? null });
@@ -2539,7 +2564,7 @@ function loadModuleDepsFingerprint(source, loadModule, fromFile) {
2539
2564
  if (seen.has(path)) continue;
2540
2565
  seen.add(path);
2541
2566
  n++;
2542
- const src = loadOrMiss(loadModule, cur.spec, cur.from);
2567
+ const src = load(cur.spec, cur.from).src;
2543
2568
  parts.push(`${path}=${src === void 0 ? "miss" : hashSource(src)}`);
2544
2569
  paths.push(path);
2545
2570
  contents.push({ path, content: src ?? null });
@@ -3175,7 +3200,7 @@ function loadModuleId(fn) {
3175
3200
  }
3176
3201
  function refineDepsFingerprint(source, refine) {
3177
3202
  if (!refine?.loadModule || !refine.fromFile) {
3178
- return { fp: "-", paths: [], contents: [], truncated: false };
3203
+ return { fp: "-", paths: [], contents: [], truncated: false, readError: false };
3179
3204
  }
3180
3205
  return loadModuleDepsFingerprint(source, refine.loadModule, refine.fromFile);
3181
3206
  }
@@ -3193,7 +3218,7 @@ function moduleMapId(m) {
3193
3218
  function generalizeMemoKey(fnName, source, opts) {
3194
3219
  const r = opts.refine;
3195
3220
  const budget = opts.budget ?? defaultLeakBudget;
3196
- const deps = opts.depsFp ?? (r ? refineDepsFingerprint(source, r) : { fp: "-", paths: [], contents: [], truncated: false });
3221
+ const deps = opts.depsFp ?? (r ? refineDepsFingerprint(source, r) : { fp: "-", paths: [], contents: [], truncated: false, readError: false });
3197
3222
  const sc = opts.sidecarFp ?? (r?.loadModule && r.fromFile ? sidecarClosureFingerprint(r.fromFile, r) : void 0);
3198
3223
  const scPath = sc !== void 0 && !sc.startsWith("trunc:") && r?.fromFile ? sidecarPathOf(r.fromFile) : void 0;
3199
3224
  const srcPart = generalizeSourceKeyPart(source, fnName, opts.file);
@@ -3211,7 +3236,7 @@ function generalizeMemoKey(fnName, source, opts) {
3211
3236
  return {
3212
3237
  key,
3213
3238
  depPaths: scPath !== void 0 ? [...deps.paths, scPath] : deps.paths,
3214
- truncated: deps.truncated || (sc?.startsWith("trunc:") ?? false)
3239
+ truncated: deps.truncated || deps.readError || (sc?.startsWith("trunc:") ?? false)
3215
3240
  };
3216
3241
  }
3217
3242
  function generalizeMemoGet(key) {
@@ -3480,10 +3505,33 @@ function generalizeFromAstUncached(fnName, source, opts = {}) {
3480
3505
  patternFields.set(hit.index, bag);
3481
3506
  }
3482
3507
  const fieldAbs = constraintToEntryAbs(e.constraint, e.param);
3483
- bag[hit.field] = {
3508
+ const leaf = {
3484
3509
  abs: fieldAbs,
3485
3510
  ...e.constraint.isOptional ? { optional: true } : {}
3486
3511
  };
3512
+ const segs = hit.fieldPath ?? [hit.field];
3513
+ if (segs.length <= 1) {
3514
+ bag[hit.field] = leaf;
3515
+ continue;
3516
+ }
3517
+ let level = bag;
3518
+ let skip = false;
3519
+ for (let i = 0; i < segs.length - 1; i++) {
3520
+ const node = level[segs[i]];
3521
+ if (node === void 0) {
3522
+ const sub = { slots: {} };
3523
+ level[segs[i]] = sub;
3524
+ level = sub.slots;
3525
+ } else if ("slots" in node) {
3526
+ level = node.slots;
3527
+ } else {
3528
+ skip = true;
3529
+ break;
3530
+ }
3531
+ }
3532
+ if (!skip) {
3533
+ level[segs[segs.length - 1]] = leaf;
3534
+ }
3487
3535
  } else if (hit) {
3488
3536
  const entryAbs = constraintToEntryAbs(e.constraint, e.param);
3489
3537
  typeParams[hit.index] = {
@@ -3496,20 +3544,34 @@ function generalizeFromAstUncached(fnName, source, opts = {}) {
3496
3544
  });
3497
3545
  }
3498
3546
  }
3499
- for (const [pIdx, bag] of patternFields) {
3547
+ const sigNames = formalParamSignatureNames(formals);
3548
+ const buildPatternObjAbs = (slotsBag, sigName, walked) => {
3500
3549
  const slots = {};
3501
- for (const [key, rec] of Object.entries(bag)) {
3502
- slots[key] = {
3503
- value: rec.abs,
3504
- ...rec.optional ? { optional: true } : {}
3505
- };
3550
+ for (const [key, node] of Object.entries(slotsBag)) {
3551
+ if ("abs" in node) {
3552
+ slots[key] = {
3553
+ value: node.abs,
3554
+ ...node.optional ? { optional: true } : {}
3555
+ };
3556
+ } else {
3557
+ slots[key] = {
3558
+ value: buildPatternObjAbs(node.slots, sigName, [...walked, key])
3559
+ };
3560
+ }
3506
3561
  }
3507
- const objAbs = abs(
3562
+ return abs(
3508
3563
  { k: "obj", slots },
3509
- v(params[pIdx] ?? `_p${pIdx}`),
3564
+ v(walked.length === 0 ? sigName : `${sigName}.${walked.join(".")}`),
3510
3565
  void 0,
3511
3566
  "path"
3512
3567
  );
3568
+ };
3569
+ for (const [pIdx, bag] of patternFields) {
3570
+ const objAbs = buildPatternObjAbs(
3571
+ bag,
3572
+ sigNames[pIdx] ?? params[pIdx] ?? `_p${pIdx}`,
3573
+ []
3574
+ );
3513
3575
  typeParams[pIdx] = {
3514
3576
  id: typeParams[pIdx].id,
3515
3577
  value: objAbs
@@ -3653,6 +3715,7 @@ function generalizeFromAstUncached(fnName, source, opts = {}) {
3653
3715
  }));
3654
3716
  }
3655
3717
  }
3718
+ const renderNames = formals.length > 0 ? formalParamSignatureNames(formals) : params;
3656
3719
  return {
3657
3720
  name: fnName,
3658
3721
  params,
@@ -3661,6 +3724,7 @@ function generalizeFromAstUncached(fnName, source, opts = {}) {
3661
3724
  instantiate: (args, phi) => run(args, phi ?? pTrue),
3662
3725
  display: formatPoly(
3663
3726
  fnName,
3727
+ renderNames,
3664
3728
  params,
3665
3729
  typeParams,
3666
3730
  symbolic,
@@ -3675,12 +3739,13 @@ function generalizeFromAstUncached(fnName, source, opts = {}) {
3675
3739
  ...hofSites ? { hofSites } : {}
3676
3740
  };
3677
3741
  }
3678
- function formatPoly(name, params, typeParams, symbolic, entryReqs, entryShapes, fnRels) {
3742
+ function formatPoly(name, renderNames, params, typeParams, symbolic, entryReqs, entryShapes, fnRels) {
3679
3743
  const reqByParam = new Map((entryReqs ?? []).map((r) => [r.param, r.pred]));
3680
- const ps = params.map((p, i) => {
3744
+ const ps = renderNames.map((p, i) => {
3745
+ const key = params[i] ?? p;
3681
3746
  const id = typeParams[i]?.id ?? "unknown";
3682
- const pred = reqByParam.get(p);
3683
- const promoted = entryShapes?.get(p)?.abs ?? fnRels?.get(p)?.abs;
3747
+ const pred = reqByParam.get(key);
3748
+ const promoted = entryShapes?.get(key)?.abs ?? fnRels?.get(key)?.abs;
3684
3749
  if (promoted) {
3685
3750
  const slot = formatShapeSlot(promoted);
3686
3751
  if (pred && pred.op !== "true") {
@@ -4456,13 +4521,17 @@ function scanLiteralCalls(source, knownFns, phi, opts) {
4456
4521
  eiCache.set(key, r);
4457
4522
  return r;
4458
4523
  };
4459
- const projectArgField = (arg, field) => {
4460
- if (!arg) return void 0;
4461
- if (arg.shape.k === "brand") {
4462
- return projectArgField(arg.shape.shape, field);
4524
+ const projectArgPath = (arg, segments) => {
4525
+ let cur = arg;
4526
+ for (const seg of segments) {
4527
+ if (!cur) return void 0;
4528
+ if (cur.shape.k === "brand") {
4529
+ cur = cur.shape.shape;
4530
+ }
4531
+ if (cur.shape.k !== "obj") return void 0;
4532
+ cur = getSlot(cur.shape.slots, seg)?.value;
4463
4533
  }
4464
- if (arg.shape.k !== "obj") return void 0;
4465
- return getSlot(arg.shape.slots, field)?.value;
4534
+ return cur;
4466
4535
  };
4467
4536
  const interfaceToIndexed = (ei, paramNames, formals) => {
4468
4537
  const conflict = new Set(ei.conflict?.params ?? []);
@@ -4484,7 +4553,7 @@ function scanLiteralCalls(source, knownFns, phi, opts) {
4484
4553
  entries.push([
4485
4554
  hit.index,
4486
4555
  { param, pred: instantiateConstraint(constraint, param), constraint },
4487
- hit.field
4556
+ hit.fieldPath ?? (hit.field !== void 0 ? [hit.field] : void 0)
4488
4557
  ]);
4489
4558
  }
4490
4559
  }
@@ -4520,17 +4589,18 @@ function scanLiteralCalls(source, knownFns, phi, opts) {
4520
4589
  return lv <= n;
4521
4590
  };
4522
4591
  const checkReqs = (displayName, reqs, paramNames, absArgs, argIndexOf, loc) => {
4523
- for (const [idx, pred, field, contractParam] of reqs) {
4592
+ for (const [idx, pred, fieldPath, contractParam] of reqs) {
4524
4593
  const argIdx = argIndexOf(idx);
4525
4594
  if (argIdx === void 0) continue;
4526
4595
  let arg = absArgs[argIdx];
4527
4596
  if (!arg) continue;
4528
4597
  const paramName = contractParam || paramNames[idx] || `arg${idx}`;
4529
- if (field) {
4530
- const projected = projectArgField(arg, field);
4598
+ if (fieldPath) {
4599
+ const projected = projectArgPath(arg, fieldPath);
4531
4600
  if (!projected) {
4532
4601
  const k = arg.shape.k;
4533
4602
  if (k !== "unknown" && k !== "any") {
4603
+ const field = fieldPath.join(".");
4534
4604
  out.push({
4535
4605
  severity: "error",
4536
4606
  code: "nudo:constraint-violated",
@@ -4871,7 +4941,7 @@ function scanLiteralCalls(source, knownFns, phi, opts) {
4871
4941
  }
4872
4942
  };
4873
4943
  const checkShapeReqs = (displayName, reqs, paramNames, absArgs, argIndexOf, loc) => {
4874
- for (const [idx, entry, field] of reqs) {
4944
+ for (const [idx, entry, fieldPath] of reqs) {
4875
4945
  const c = entry.constraint;
4876
4946
  if (!c.fields && !c.element && !isIntFlag(c) && !c.prim) continue;
4877
4947
  const argIdx = argIndexOf(idx);
@@ -4879,11 +4949,12 @@ function scanLiteralCalls(source, knownFns, phi, opts) {
4879
4949
  let arg = absArgs[argIdx];
4880
4950
  if (!arg) continue;
4881
4951
  const paramName = entry.param || paramNames[idx] || `arg${idx}`;
4882
- if (field) {
4883
- const projected = projectArgField(arg, field);
4952
+ if (fieldPath) {
4953
+ const projected = projectArgPath(arg, fieldPath);
4884
4954
  if (!projected) {
4885
4955
  const k = arg.shape.k;
4886
4956
  if (k !== "unknown" && k !== "any") {
4957
+ const field = fieldPath.join(".");
4887
4958
  out.push({
4888
4959
  severity: "error",
4889
4960
  code: "nudo:constraint-violated",
@@ -5305,6 +5376,7 @@ export {
5305
5376
  sidecarClosureFingerprint,
5306
5377
  formatConstraint,
5307
5378
  formatEffectiveInterfaceDisplay,
5379
+ INTERFACE_SOURCE_ABBR,
5308
5380
  formatInterfaceTierLine,
5309
5381
  interfaceTierOf,
5310
5382
  interfaceSourceOf,
package/dist/exec.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as Abs, M as MayThrowEffect, b as Phi } from './run-2B7ohsfP.js';
2
- export { W as $assignRecord, X as $call, Y as $callNamed, Z as $recordBinding, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, f as EvalFallbackStats, aa as MAX_EVAL_CALL_DEPTH, ab as MAX_EVAL_TOTAL_CALLS, ac as RUNTIME_IMPORT_RE, V as RunTranspiledOptions, ae as TranspiledCallResult, as as bindingsOf, av as callTranspiledExport, aw as callTranspiledExportApply, ax as callTranspiledExportFull, k as clearPureCallMemo, l as clearPureMemo, m as enterEvalCallBudgetSession, aC as evalExprAbs, o as exitEvalCallBudgetSession, u as getEvalCallBudgetState, aF as getEvalCallCollector, v as getEvalFallbackStats, aN as isAbsVal, b3 as noteEvalCallRecord, b4 as noteEvalFallback, bl as resetEvalCallBudget, G as resetEvalFallbackStats, bF as routeApplyThrows, bm as runTranspiled, bn as runTranspiledOptionsMemoKey, bo as setEvalAssignCollector, bp as setEvalBindingSink, bq as setEvalCallCollector, br as setEvalFallbackCollector, bC as tryRunTranspiled, N as withEvalBudgetOverride } from './run-2B7ohsfP.js';
1
+ import { A as Abs, M as MayThrowEffect, b as Phi } from './run-WZKUu1y1.js';
2
+ export { W as $assignRecord, X as $call, Y as $callNamed, Z as $recordBinding, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, g as EvalFallbackStats, aa as MAX_EVAL_CALL_DEPTH, ab as MAX_EVAL_TOTAL_CALLS, ac as RUNTIME_IMPORT_RE, V as RunTranspiledOptions, ae as TranspiledCallResult, as as bindingsOf, av as callTranspiledExport, aw as callTranspiledExportApply, ax as callTranspiledExportFull, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, aC as evalExprAbs, p as exitEvalCallBudgetSession, v as getEvalCallBudgetState, aF as getEvalCallCollector, w as getEvalFallbackStats, aN as isAbsVal, b3 as noteEvalCallRecord, b4 as noteEvalFallback, bl as resetEvalCallBudget, H as resetEvalFallbackStats, bF as routeApplyThrows, bm as runTranspiled, bn as runTranspiledOptionsMemoKey, bo as setEvalAssignCollector, bp as setEvalBindingSink, bq as setEvalCallCollector, br as setEvalFallbackCollector, bC as tryRunTranspiled, O as withEvalBudgetOverride } from './run-WZKUu1y1.js';
3
3
  import { Node, Expression, File } from '@babel/types';
4
4
 
5
5
  /**
package/dist/exec.js CHANGED
@@ -195,7 +195,7 @@ import {
195
195
  tryRunTranspiled,
196
196
  withEvalBudgetOverride,
197
197
  withExecPhi
198
- } from "./chunk-XR3TE4C2.js";
198
+ } from "./chunk-PGTNSUTE.js";
199
199
  export {
200
200
  $absVal,
201
201
  $add,
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { c as AstEnv, A as Abs, b as Phi, T as Term, O as HofCollectCtx, C as Confidence, S as Shape, a as Pred, R as RelSource, Q as HofSite, U as AbsModuleExports, V as RunTranspiledOptions } from './run-2B7ohsfP.js';
2
- export { W as $assignRecord, X as $call, Y as $callNamed, Z as $recordBinding, _ as AbsApplyNoThrow, a0 as AbsApplyNoThrowFn, a1 as AbsApplyResult, a2 as AbsApplyReturn, a3 as AbsFnImpl, a4 as AbsSigImpl, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, a8 as ImplicationOracle, a9 as LitValueResult, L as LiteralValue, aa as MAX_EVAL_CALL_DEPTH, ab as MAX_EVAL_TOTAL_CALLS, P as PrimName, ac as RUNTIME_IMPORT_RE, ad as TYPEOF_NAMES, ae as TranspiledCallResult, af as TypeofName, ag as abs, ah as absFunction, ai as absOnly, aj as absToString, ak as and, al as anyAbs, am as anyVar, an as app, ao as assumeFinite, ap as attachFnImpl, aq as bigintLit, ar as bindImports, as as bindingsOf, at as bool, au as boolLit, av as callTranspiledExport, aw as callTranspiledExportApply, ax as callTranspiledExportFull, ay as collectAbsExports, az as confJoin, aA as emptyPhi, aB as eq, aC as evalExprAbs, aD as ge, aE as geNum, aF as getEvalCallCollector, aG as getFnImpl, aH as getImplicationOracle, aI as gt, aJ as gtNum, aK as hostFnCtorFacet, aL as implies, aM as isAbsApplyResult, aN as isAbsVal, aO as isBigPrim, aP as isExactLit, aQ as isNumPrim, aR as isStrPrim, aS as le, aT as leNum, aU as lit, aV as litValue, aW as lt, aX as ltNum, aY as makeAbsApplyResult, aZ as markPureFn, a_ as namespaceAbsOf, a$ as ne, b0 as negatePred, b1 as never, b2 as not, b3 as noteEvalCallRecord, b4 as noteEvalFallback, b5 as num, b6 as numLit, b7 as numVar, b8 as obj, b9 as or, ba as pFalse, bb as pTrue, bc as phiAnd, bd as predEquals, be as predToString, bf as predVars, bg as primToTypeof, bh as ptypeof, bi as pureFnNameOf, bj as relationFingerprint, bk as relationFn, bl as resetEvalCallBudget, bm as runTranspiled, bn as runTranspiledOptionsMemoKey, bo as setEvalAssignCollector, bp as setEvalBindingSink, bq as setEvalCallCollector, br as setEvalFallbackCollector, bs as setImplicationOracle, bt as shapeOfTerm, bu as shapeOnlyFn, bv as shapeToString, bw as simplifyTerm, bx as str, by as strLit, bz as substPred, bA as termEquals, bB as termToString, bC as tryRunTranspiled, bD as unknown, bE as v } from './run-2B7ohsfP.js';
1
+ import { d as AstEnv, A as Abs, b as Phi, T as Term, Q as HofCollectCtx, C as Confidence, S as Shape, a as Pred, R as RelSource, U as HofSite, c as AbsModuleExports, V as RunTranspiledOptions } from './run-WZKUu1y1.js';
2
+ export { W as $assignRecord, X as $call, Y as $callNamed, Z as $recordBinding, _ as AbsApplyNoThrow, a0 as AbsApplyNoThrowFn, a1 as AbsApplyResult, a2 as AbsApplyReturn, a3 as AbsFnImpl, a4 as AbsSigImpl, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, a8 as ImplicationOracle, a9 as LitValueResult, L as LiteralValue, aa as MAX_EVAL_CALL_DEPTH, ab as MAX_EVAL_TOTAL_CALLS, P as PrimName, ac as RUNTIME_IMPORT_RE, ad as TYPEOF_NAMES, ae as TranspiledCallResult, af as TypeofName, ag as abs, ah as absFunction, ai as absOnly, aj as absToString, ak as and, al as anyAbs, am as anyVar, an as app, ao as assumeFinite, ap as attachFnImpl, aq as bigintLit, ar as bindImports, as as bindingsOf, at as bool, au as boolLit, av as callTranspiledExport, aw as callTranspiledExportApply, ax as callTranspiledExportFull, ay as collectAbsExports, az as confJoin, aA as emptyPhi, aB as eq, aC as evalExprAbs, aD as ge, aE as geNum, aF as getEvalCallCollector, aG as getFnImpl, aH as getImplicationOracle, aI as gt, aJ as gtNum, aK as hostFnCtorFacet, aL as implies, aM as isAbsApplyResult, aN as isAbsVal, aO as isBigPrim, aP as isExactLit, aQ as isNumPrim, aR as isStrPrim, aS as le, aT as leNum, aU as lit, aV as litValue, aW as lt, aX as ltNum, aY as makeAbsApplyResult, aZ as markPureFn, a_ as namespaceAbsOf, a$ as ne, b0 as negatePred, b1 as never, b2 as not, b3 as noteEvalCallRecord, b4 as noteEvalFallback, b5 as num, b6 as numLit, b7 as numVar, b8 as obj, b9 as or, ba as pFalse, bb as pTrue, bc as phiAnd, bd as predEquals, be as predToString, bf as predVars, bg as primToTypeof, bh as ptypeof, bi as pureFnNameOf, bj as relationFingerprint, bk as relationFn, bl as resetEvalCallBudget, bm as runTranspiled, bn as runTranspiledOptionsMemoKey, bo as setEvalAssignCollector, bp as setEvalBindingSink, bq as setEvalCallCollector, br as setEvalFallbackCollector, bs as setImplicationOracle, bt as shapeOfTerm, bu as shapeOnlyFn, bv as shapeToString, bw as simplifyTerm, bx as str, by as strLit, bz as substPred, bA as termEquals, bB as termToString, bC as tryRunTranspiled, bD as unknown, bE as v } from './run-WZKUu1y1.js';
3
3
  import { Node, File } from '@babel/types';
4
- import { p as parseSource, L as LeakBudget, E as EffectiveInterfaceOpts, b as LoadDepsFingerprint, v as CheckReport, N as NudoConstraint, c as ProjectionBudget } from './projection-budget-Bb8CYJOR.js';
5
- export { w as CONSTRAINT_BUILDERS, x as CONSTRAINT_BUILDER_NAMES, y as CONSTRAINT_EXPR_RE, z as CheckAction, C as CheckIssue, A as CheckJson, B as CheckJsonMulti, D as ConstraintBuilder, F as Diagnostic, G as EffectiveInterface, H as GitlabCodeQualityIssue, J as InterfaceDiag, I as InterfaceSource, K as InterfaceTierInfo, a as InterfaceTierOpts, O as NamedImport, Q as NudoField, R as NudoFnConstraint, S as NudoSidecarError, T as NudoSig, U as RefineDiag, V as RefineEntry, W as RefineResolveOpts, X as SELF, Y as actionsForIssue, Z as andC, _ as any, $ as array, a0 as boolean, a1 as checkArg, a2 as checkCall, a3 as constraintAdmitsNullish, a4 as constraintToEntryAbs, a5 as derefConstraint, a6 as drainPromiseMicros, a7 as effectiveInterface, a8 as enterPromiseExecutorScope, a9 as evalPromiseCtor, aa as evalPromiseMethod, ab as evalPromiseStatic, ac as execNudoModule, ad as extractDeclaredThrows, ae as extractFnBudget, af as extractNudoImports, ag as extractRefineReturnFromSource, ah as extractRefinesFromSource, ai as fn, aj as fnConstraintToEntryReqs, ak as formatCheckReport, al as formatConstraint, am as formatDiagnostics, an as formatEffectiveInterfaceDisplay, ao as formatGithubAnnotations, ap as formatGitlabCodeQuality, aq as formatInterfaceTierLine, ar as generatedExportNames, as as getParseSourceCacheSize, at as getTerm, au as instantiateConstraint, av as interfaceDiagCount, aw as interfaceSourceOf, ax as interfaceTierOf, ay as isIntFlag, az as isNodeModulesPath, aA as isNudoConstraint, aB as lazy, aC as leavePromiseExecutorScope, aD as lenTerm, aE as litC, aF as localNamedExports, aG as notePromiseExecutorFork, aH as nullable, aI as number, aJ as omit, aK as partial, aL as pick, aM as queuePromiseMicro, aN as refineDiagCount, aO as refineToIndexedFull, aP as resetNudoModuleExecCache, aQ as resetParseSourceCache, aR as resetSidecarLoadFailureCache, aS as serializeCheckJson, aT as serializeCheckJsonMulti, aU as setInterfaceDiagCollector, aV as setRefineDiagCollector, aW as shape, aX as sidecarClosureFingerprint, aY as sidecarPathOf, aZ as string, a_ as takeInterfaceDiags, a$ as takeInterfaceDiagsSince, b0 as takeRefineDiags, b1 as takeRefineDiagsSince, b2 as throwConstraintToKinds, b3 as union } from './projection-budget-Bb8CYJOR.js';
4
+ import { p as parseSource, L as LeakBudget, E as EffectiveInterfaceOpts, b as LoadDepsFingerprint, v as CheckReport, N as NudoConstraint, c as ProjectionBudget } from './projection-budget-Dm1YWZ1U.js';
5
+ export { w as CONSTRAINT_BUILDERS, x as CONSTRAINT_BUILDER_NAMES, y as CONSTRAINT_EXPR_RE, z as CheckAction, C as CheckIssue, A as CheckJson, B as CheckJsonMulti, D as ConstraintBuilder, F as Diagnostic, G as EffectiveInterface, H as GitlabCodeQualityIssue, J as INTERFACE_SOURCE_ABBR, K as InterfaceDiag, I as InterfaceSource, O as InterfaceTierInfo, a as InterfaceTierOpts, Q as NamedImport, R as NudoField, S as NudoFnConstraint, T as NudoSidecarError, U as NudoSig, V as RefineDiag, W as RefineEntry, X as RefineResolveOpts, Y as SELF, Z as actionsForIssue, _ as andC, $ as any, a0 as array, a1 as boolean, a2 as checkArg, a3 as checkCall, a4 as constraintAdmitsNullish, a5 as constraintToEntryAbs, a6 as derefConstraint, a7 as drainPromiseMicros, a8 as effectiveInterface, a9 as enterPromiseExecutorScope, aa as evalPromiseCtor, ab as evalPromiseMethod, ac as evalPromiseStatic, ad as execNudoModule, ae as extractDeclaredThrows, af as extractFnBudget, ag as extractNudoImports, ah as extractRefineReturnFromSource, ai as extractRefinesFromSource, aj as fn, ak as fnConstraintToEntryReqs, al as formatCheckReport, am as formatConstraint, an as formatDiagnostics, ao as formatEffectiveInterfaceDisplay, ap as formatGithubAnnotations, aq as formatGitlabCodeQuality, ar as formatInterfaceTierLine, as as generatedExportNames, at as getParseSourceCacheSize, au as getTerm, av as instantiateConstraint, aw as interfaceDiagCount, ax as interfaceSourceOf, ay as interfaceTierOf, az as isIntFlag, aA as isNodeModulesPath, aB as isNudoConstraint, aC as lazy, aD as leavePromiseExecutorScope, aE as lenTerm, aF as litC, aG as localNamedExports, aH as notePromiseExecutorFork, aI as nullable, aJ as number, aK as omit, aL as partial, aM as pick, aN as queuePromiseMicro, aO as refineDiagCount, aP as refineToIndexedFull, aQ as resetNudoModuleExecCache, aR as resetParseSourceCache, aS as resetSidecarLoadFailureCache, aT as serializeCheckJson, aU as serializeCheckJsonMulti, aV as setInterfaceDiagCollector, aW as setRefineDiagCollector, aX as shape, aY as sidecarClosureFingerprint, aZ as sidecarPathOf, a_ as string, a$ as takeInterfaceDiags, b0 as takeInterfaceDiagsSince, b1 as takeRefineDiags, b2 as takeRefineDiagsSince, b3 as throwConstraintToKinds, b4 as union } from './projection-budget-Dm1YWZ1U.js';
6
6
  export { $add, $arguments, $arr, $arrMutContainer, $arrRest, $arrWithHoles, $async, $asyncReturn, $await, $bitand, $bitnot, $bitor, $bitxor, $catchVal, $class, $classExpr, $collectionForEach, $concat, $copy, $del, $delRes, $div, $dynamicImport, $elems, $eq, $eqLoose, $fnVal, $for, $forInKeys, $forIter, $forOf, $fork, $ge, $gen, $get, $gt, $idx, $idxSet, $importMeta, $in, $instanceof, $instanceofNonIdent, $invoke, $invokeSuper, $isBreakTo, $isForkExit, $join, $le, $len, $lit, $loopBreak, $loopContinue, $loopReturn, $lt, $mod, $mul, $ne, $neLoose, $neg, $new, $not, $nullishTest, $obj, $objAccessor, $objRest, $optionalGet, $optionalInvoke, $orDefault, $pow, $pushLoopExit, $rawThis, $reStateCall, $regex, $rethrowIfNudoReturn, $set, $setKey, $shl, $shr, $spread, $staticInvoke, $sub, $super, $switch, $thisGet, $thisSet, $throw, $toNumber, $toNumeric, $tryCurrentMark, $tryDetachSoftCatch, $tryDigestSoftCatch, $tryDiscardSoft, $tryMark, $tryOrphanSoft, $tryPopMark, $tryReleaseSoftCatch, $tryReleaseSoftOut, $tryTakeSince, $typeof, $unknown, $updateAdd, $updateSub, $ushr, $while, $whileSeq, $yield, DEFAULT_MAX_LOOP_ITERS, EvalClassSpec, NudoLoopSignal, NudoReturn, NudoThrow, NudoUnsupportedError, TranspileOptions, asAbsVal, callAtFunctionBoundary, clearBClasses, clearStaleTermPred, currentExecPhi, fillTuple, foldRequireSpecArg, foldStaticStringExpr, getEvalClass, isArrMutator, isDefinitelyFalse, isDefinitelyTrue, isNudoBreak, isNudoContinue, isNudoReturn, isNudoThrow, litTruth, lookupObjAccessor, namespaceNameOf, pushLoopExit, pushThrowExit, registerEvalClass, runWithLoopExits, runtimeImportOf, takeLoopExits, takeThrowExits, transpile, transpileBodyNode, transpileExpression, transpileFile, transpileSource, withExecPhi } from './exec.js';
7
7
 
8
8
  /**
@@ -847,6 +847,11 @@ type FormalParam = {
847
847
  propKey: Record<string, string>;
848
848
  /** 仅嵌套内出现、顶层不可单独表达的名(降级用) */
849
849
  nested: string[];
850
+ /**
851
+ * #137:嵌套解构点路径契约面('card.grade',源属性键点连接)。
852
+ * 中间键(card)同时在 bound 里平铺可绑(整对象 shape 契约)。
853
+ */
854
+ nestedPaths: string[];
850
855
  index: number;
851
856
  };
852
857
  type AstParam = {
@@ -877,13 +882,17 @@ declare function contractParamNameSet(formals: FormalParam[]): Set<string>;
877
882
  /**
878
883
  * 契约参数名 → 形参定位。
879
884
  * - 命中 id/default/rest → 该 index(执法按整参)
880
- * - 命中 pattern 顶层 bound 名 → 该 pattern index + field
885
+ * - 命中 pattern 顶层 bound 名 → 该 pattern index + field(fieldPath 单段)
881
886
  * - 命中 placeholder / `_` → pattern index(整对象)
887
+ * - #137:命中嵌套点路径('card.grade' ∈ nestedPaths)→ index + fieldPath
888
+ * 多段(field 为展示用点连接串)。平铺精确匹配必须先于任何点路径解析:
889
+ * 源键 'a.b' 与路径 'a.b' 不可歧义——平铺胜。
882
890
  * - 未命中 → undefined(C4.5 param-mismatch)
883
891
  */
884
892
  declare function locateContractParam(formals: FormalParam[], contractName: string): {
885
893
  index: number;
886
894
  field?: string;
895
+ fieldPath?: string[];
887
896
  rest?: boolean;
888
897
  } | undefined;
889
898
 
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import "./chunk-US532PZA.js";
2
2
  import {
3
+ INTERFACE_SOURCE_ABBR,
3
4
  NudoSidecarError,
4
5
  buildArgsFromAssume,
5
6
  canSkipLiteralCallScan,
@@ -63,7 +64,7 @@ import {
63
64
  takeInterfaceDiagsSince,
64
65
  takeRefineDiags,
65
66
  takeRefineDiagsSince
66
- } from "./chunk-PNCDILAV.js";
67
+ } from "./chunk-S7HJL5GW.js";
67
68
  import {
68
69
  $add,
69
70
  $arguments,
@@ -519,7 +520,7 @@ import {
519
520
  v,
520
521
  withExecPhi,
521
522
  withVar
522
- } from "./chunk-XR3TE4C2.js";
523
+ } from "./chunk-PGTNSUTE.js";
523
524
 
524
525
  // src/environment.ts
525
526
  function createEnvironment(parent, bindings = /* @__PURE__ */ new Map()) {
@@ -1629,7 +1630,7 @@ function loadModuleId(fn2) {
1629
1630
  }
1630
1631
  function checkDepsFingerprint(source, opts) {
1631
1632
  if (!opts.loadModule || !opts.fromFile) {
1632
- return { fp: "-", paths: [], contents: [], truncated: false };
1633
+ return { fp: "-", paths: [], contents: [], truncated: false, readError: false };
1633
1634
  }
1634
1635
  return loadModuleDepsFingerprint(source, opts.loadModule, opts.fromFile);
1635
1636
  }
@@ -1919,13 +1920,17 @@ function structuralAssignIssues(records) {
1919
1920
  }
1920
1921
 
1921
1922
  // src/algebra/check-case-scan.ts
1922
- function projectCaseArgField(arg, field) {
1923
- if (!arg) return void 0;
1924
- if (arg.shape.k === "brand") {
1925
- return projectCaseArgField(arg.shape.shape, field);
1923
+ function projectCaseArgField(arg, fieldPath) {
1924
+ let cur = arg;
1925
+ for (const seg of fieldPath) {
1926
+ if (!cur) return void 0;
1927
+ if (cur.shape.k === "brand") {
1928
+ cur = cur.shape.shape;
1929
+ }
1930
+ if (cur.shape.k !== "obj") return void 0;
1931
+ cur = getSlot(cur.shape.slots, seg)?.value;
1926
1932
  }
1927
- if (arg.shape.k !== "obj") return void 0;
1928
- return getSlot(arg.shape.slots, field)?.value;
1933
+ return cur;
1929
1934
  }
1930
1935
  function scanCaseInconsistency(source, knownFns, opts) {
1931
1936
  const out = [];
@@ -2006,12 +2011,12 @@ function scanCaseInconsistency(source, knownFns, opts) {
2006
2011
  for (const p of eff.params) {
2007
2012
  if (conflictParams.has(p.param)) continue;
2008
2013
  let idx = paramNames.indexOf(p.param);
2009
- let field;
2014
+ let fieldPath;
2010
2015
  if (idx < 0 && formals.length > 0) {
2011
2016
  const hit = locateContractParam(formals, p.param);
2012
2017
  if (hit) {
2013
2018
  idx = hit.index;
2014
- field = hit.field;
2019
+ fieldPath = hit.fieldPath ?? (hit.field !== void 0 ? [hit.field] : void 0);
2015
2020
  }
2016
2021
  }
2017
2022
  if (idx < 0) continue;
@@ -2022,7 +2027,7 @@ function scanCaseInconsistency(source, knownFns, opts) {
2022
2027
  pred: instantiateConstraint(p.constraint, p.param),
2023
2028
  constraint: p.constraint
2024
2029
  },
2025
- field
2030
+ fieldPath
2026
2031
  ]);
2027
2032
  }
2028
2033
  if (reqs.length === 0) return;
@@ -2030,16 +2035,17 @@ function scanCaseInconsistency(source, knownFns, opts) {
2030
2035
  for (const req of reqs) {
2031
2036
  const idx = req[0];
2032
2037
  const entry = req[1];
2033
- const field = req[2];
2038
+ const fieldPath = req[2];
2034
2039
  if (entry.constraint.fields) continue;
2035
2040
  let arg = absArgs[idx];
2036
2041
  if (!arg) continue;
2037
- if (field) {
2038
- const projected = projectCaseArgField(arg, field);
2042
+ if (fieldPath) {
2043
+ const projected = projectCaseArgField(arg, fieldPath);
2039
2044
  if (!projected) {
2040
2045
  const k = arg.shape.k;
2041
2046
  if (k !== "unknown" && k !== "any") {
2042
2047
  const paramName = entry.param || paramNames[idx] || `arg${idx}`;
2048
+ const field = fieldPath.join(".");
2043
2049
  out.push({
2044
2050
  severity: "error",
2045
2051
  code: "nudo:case-inconsistency",
@@ -2163,7 +2169,9 @@ function checkSourceInScope(filePath, source, phi, opts) {
2163
2169
  const stable = stableAnalyzeKeySource(source);
2164
2170
  const depsFp = checkDepsFingerprint(stable, callOpts);
2165
2171
  const sidecarFp = callOpts.loadModule && callOpts.fromFile ? sidecarClosureFingerprint(callOpts.fromFile, callOpts) : void 0;
2166
- const allowMemo = useMemo && !depsFp.truncated && !(sidecarFp?.startsWith("trunc:") ?? false);
2172
+ const allowMemo = useMemo && !depsFp.truncated && // 读错误轮键不可信(#135):错误轮报告(nudo:interface-load)与真 miss 轮
2173
+ // (干净)若共享 miss 键会互为跨次陈旧命中——不读也不写 memo
2174
+ !depsFp.readError && !(sidecarFp?.startsWith("trunc:") ?? false);
2167
2175
  if (allowMemo) {
2168
2176
  memoKey = checkMemoKey(filePath, stable, opts, depsFp, sidecarFp);
2169
2177
  const hit = checkMemoGet(memoKey);
@@ -3250,6 +3258,7 @@ export {
3250
3258
  CONSTRAINT_BUILDER_NAMES,
3251
3259
  CONSTRAINT_EXPR_RE,
3252
3260
  DEFAULT_MAX_LOOP_ITERS,
3261
+ INTERFACE_SOURCE_ABBR,
3253
3262
  MAX_EVAL_CALL_DEPTH,
3254
3263
  MAX_EVAL_TOTAL_CALLS,
3255
3264
  NudoLoopSignal,
@@ -1,7 +1,7 @@
1
- import { I as InterfaceSource, a as InterfaceTierOpts, p as parseSource, C as CheckIssue } from './projection-budget-Bb8CYJOR.js';
2
- export { L as LeakBudget, b as LoadDepsFingerprint, M as MAX_PROMISE_MICROS, P as PROJECTION_MAX_DEPTH, c as ProjectionBudget, d as ProjectionStopReason, e as defaultLeakBudget, f as exceedsBudget, g as exportedNameOfLocal, h as extractAllLoadSpecs, i as getPromiseMicrosLength, l as leakIfNeeded, j as loadModuleDepsFingerprint, m as maybeLeak, n as normPath, r as resetLeakCounter, k as resolveDepPath, s as sidecarSpecsOf, o as stablePathKey, q as stablePathKeyGraph, t as termDepth, u as termNodes } from './projection-budget-Bb8CYJOR.js';
3
- import { A as Abs, T as Term, c as AstEnv } from './run-2B7ohsfP.js';
4
- export { $ as $tryDigestSoft, d as $tryMarkSoft, e as $tryReleaseSoft, E as ERROR_FAMILY, f as EvalFallbackStats, M as MayThrowEffect, g as absLit, h as absNumLit, i as absStrLit, j as allAbsStr, k as clearPureCallMemo, l as clearPureMemo, m as enterEvalCallBudgetSession, n as errorTypeAbs, o as exitEvalCallBudgetSession, p as filterDeclaredThrows, q as filterGateThrows, r as filterIgnoredThrows, s as flushMayThrowEffects, t as formatThrowsAbs, u as getEvalCallBudgetState, v as getEvalFallbackStats, w as getMayThrowCollector, x as isThrowsIgnored, y as mayThrowEffectsToAbs, z as orphanMayThrowEffects, B as popMayThrowFrame, D as pushMayThrowFrame, F as recordMayThrow, G as resetEvalFallbackStats, H as runWithMayThrowSession, I as setMayThrowCollector, J as throwAbsToKinds, K as throwsKindCovered, N as withEvalBudgetOverride } from './run-2B7ohsfP.js';
1
+ import { I as InterfaceSource, a as InterfaceTierOpts, p as parseSource, C as CheckIssue } from './projection-budget-Dm1YWZ1U.js';
2
+ export { L as LeakBudget, b as LoadDepsFingerprint, M as MAX_PROMISE_MICROS, P as PROJECTION_MAX_DEPTH, c as ProjectionBudget, d as ProjectionStopReason, e as defaultLeakBudget, f as exceedsBudget, g as exportedNameOfLocal, h as extractAllLoadSpecs, i as getPromiseMicrosLength, l as leakIfNeeded, j as loadModuleDepsFingerprint, m as maybeLeak, n as normPath, r as resetLeakCounter, k as resolveDepPath, s as sidecarSpecsOf, o as stablePathKey, q as stablePathKeyGraph, t as termDepth, u as termNodes } from './projection-budget-Dm1YWZ1U.js';
3
+ import { A as Abs, T as Term, c as AbsModuleExports, d as AstEnv } from './run-WZKUu1y1.js';
4
+ export { $ as $tryDigestSoft, e as $tryMarkSoft, f as $tryReleaseSoft, E as ERROR_FAMILY, g as EvalFallbackStats, M as MayThrowEffect, h as absLit, i as absNumLit, j as absStrLit, k as allAbsStr, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, o as errorTypeAbs, p as exitEvalCallBudgetSession, q as filterDeclaredThrows, r as filterGateThrows, s as filterIgnoredThrows, t as flushMayThrowEffects, u as formatThrowsAbs, v as getEvalCallBudgetState, w as getEvalFallbackStats, x as getMayThrowCollector, y as isThrowsIgnored, z as mayThrowEffectsToAbs, B as orphanMayThrowEffects, D as popMayThrowFrame, F as pushMayThrowFrame, G as recordMayThrow, H as resetEvalFallbackStats, I as runWithMayThrowSession, J as setMayThrowCollector, K as throwAbsToKinds, N as throwsKindCovered, O as withEvalBudgetOverride } from './run-WZKUu1y1.js';
5
5
  import { File, Node } from '@babel/types';
6
6
 
7
7
  /**
@@ -389,6 +389,11 @@ type AbsInlay = {
389
389
  type CollectAbsInlaysOpts = InterfaceTierOpts & {
390
390
  loadModule?: (spec: string, fromFile: string) => string | undefined;
391
391
  fromFile?: string;
392
+ /**
393
+ * eval 模块图(host 组装,如 service `evalAbsModuleGraph`)。缺省时
394
+ * generalizeFromAst 看不到跨模块 import → 调用塌缩 unknown(inlay 假空)。
395
+ */
396
+ modules?: Record<string, AbsModuleExports | Record<string, unknown>>;
392
397
  };
393
398
  /**
394
399
  * 收集源码中函数签名的 Abs inlay:
package/dist/internal.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  stableAnalyzeKeySource,
22
22
  stablePathKey,
23
23
  stablePathKeyGraph
24
- } from "./chunk-PNCDILAV.js";
24
+ } from "./chunk-S7HJL5GW.js";
25
25
  import {
26
26
  $tryDigestSoft,
27
27
  $tryMarkSoft,
@@ -169,7 +169,7 @@ import {
169
169
  withEvalBudgetOverride,
170
170
  withFnBudgetOverride,
171
171
  wrapPromise
172
- } from "./chunk-XR3TE4C2.js";
172
+ } from "./chunk-PGTNSUTE.js";
173
173
 
174
174
  // src/algebra/inlay.ts
175
175
  function listFunctions(source) {
@@ -258,12 +258,16 @@ function collectAbsInlays(source, opts) {
258
258
  const inlays = [];
259
259
  const refineOpts = opts?.loadModule || opts?.fromFile ? {
260
260
  ...opts.loadModule ? { loadModule: opts.loadModule } : {},
261
- ...opts.fromFile ? { fromFile: opts.fromFile } : {}
261
+ ...opts.fromFile ? { fromFile: opts.fromFile } : {},
262
+ ...opts.autoBind !== void 0 ? { autoBind: opts.autoBind } : {}
262
263
  } : void 0;
263
264
  for (const { name, node } of listFunctions(source)) {
264
265
  let g;
265
266
  try {
266
- g = generalizeFromAst(name, source, refineOpts ? { refine: refineOpts } : {});
267
+ g = generalizeFromAst(name, source, {
268
+ ...refineOpts ? { refine: refineOpts } : {},
269
+ ...opts?.modules ? { modules: opts.modules } : {}
270
+ });
267
271
  } catch {
268
272
  continue;
269
273
  }
@@ -1,5 +1,5 @@
1
1
  import { File } from '@babel/types';
2
- import { A as Abs, T as Term, P as PrimName, a as Pred, L as LiteralValue, b as Phi, C as Confidence } from './run-2B7ohsfP.js';
2
+ import { A as Abs, T as Term, P as PrimName, a as Pred, L as LiteralValue, b as Phi, C as Confidence } from './run-WZKUu1y1.js';
3
3
 
4
4
  declare function resetParseSourceCache(): void;
5
5
  declare function getParseSourceCacheSize(): number;
@@ -525,8 +525,14 @@ declare function sidecarClosureFingerprint(fromFile: string, opts: EffectiveInte
525
525
  declare function formatConstraint(c: NudoConstraint): string;
526
526
  /** EffectiveInterface → 契约展示串(与 CLI interface 打印同口径,不含函数名) */
527
527
  declare function formatEffectiveInterfaceDisplay(eff: EffectiveInterface): string;
528
- /** CodeLens / hover 首行标题(design-refine-derivation §8):`● interface / <source>` */
529
- declare function formatInterfaceTierLine(source: InterfaceSource): string;
528
+ /** 档位源缩写:handwritten=hw / generated=gen / implicit=imp */
529
+ declare const INTERFACE_SOURCE_ABBR: Record<InterfaceSource, string>;
530
+ /**
531
+ * CodeLens / hover 首行标题(design-refine-derivation §8):`● contract / hw|gen|imp`。
532
+ * contract 是观察选择器的一个选项(与各 case 互斥):`active=false` 时渲染 `○`,
533
+ * 表示该函数当前观察的是某个 case 而非契约。
534
+ */
535
+ declare function formatInterfaceTierLine(source: InterfaceSource, active?: boolean): string;
530
536
  type InterfaceTierInfo = {
531
537
  source: InterfaceSource;
532
538
  /** handwritten/generated 时的契约展示;implicit 为 undefined */
@@ -558,6 +564,12 @@ type LoadDepsFingerprint = {
558
564
  }>;
559
565
  /** BFS 撞到节点上限:剩余 dep 未进指纹,键不可信 */
560
566
  truncated: boolean;
567
+ /**
568
+ * 任一装载 throw(EACCES/EMFILE/…)≠ 真 miss:读错误轮的报告(含
569
+ * nudo:interface-load)与真 miss 轮(干净)内容不同,折叠成同一 miss 键
570
+ * 会互为跨次陈旧命中(#135)。fp 带 `readerr:` 前缀,调用方 fail-open 禁 memo。
571
+ */
572
+ readError: boolean;
561
573
  };
562
574
  /**
563
575
  * All string module specs that analysis may resolve through loadModule.
@@ -831,4 +843,4 @@ declare class ProjectionBudget {
831
843
  exit(): void;
832
844
  }
833
845
 
834
- export { array as $, type CheckJson as A, type CheckJsonMulti as B, type CheckIssue as C, type ConstraintBuilder as D, type EffectiveInterfaceOpts as E, type Diagnostic as F, type EffectiveInterface as G, type GitlabCodeQualityIssue as H, type InterfaceSource as I, type InterfaceDiag as J, type InterfaceTierInfo as K, type LeakBudget as L, MAX_PROMISE_MICROS as M, type NudoConstraint as N, type NamedImport as O, PROJECTION_MAX_DEPTH as P, type NudoField as Q, type NudoFnConstraint as R, NudoSidecarError as S, type NudoSig as T, type RefineDiag as U, type RefineEntry as V, type RefineResolveOpts as W, SELF as X, actionsForIssue as Y, andC as Z, any as _, type InterfaceTierOpts as a, takeInterfaceDiagsSince as a$, boolean as a0, checkArg as a1, checkCall as a2, constraintAdmitsNullish as a3, constraintToEntryAbs as a4, derefConstraint as a5, drainPromiseMicros as a6, effectiveInterface as a7, enterPromiseExecutorScope as a8, evalPromiseCtor as a9, isNudoConstraint as aA, lazy as aB, leavePromiseExecutorScope as aC, lenTerm as aD, litC as aE, localNamedExports as aF, notePromiseExecutorFork as aG, nullable as aH, number as aI, omit as aJ, partial as aK, pick as aL, queuePromiseMicro as aM, refineDiagCount as aN, refineToIndexedFull as aO, resetNudoModuleExecCache as aP, resetParseSourceCache as aQ, resetSidecarLoadFailureCache as aR, serializeCheckJson as aS, serializeCheckJsonMulti as aT, setInterfaceDiagCollector as aU, setRefineDiagCollector as aV, shape as aW, sidecarClosureFingerprint as aX, sidecarPathOf as aY, string as aZ, takeInterfaceDiags as a_, evalPromiseMethod as aa, evalPromiseStatic as ab, execNudoModule as ac, extractDeclaredThrows as ad, extractFnBudget as ae, extractNudoImports as af, extractRefineReturnFromSource as ag, extractRefinesFromSource as ah, fn as ai, fnConstraintToEntryReqs as aj, formatCheckReport as ak, formatConstraint as al, formatDiagnostics as am, formatEffectiveInterfaceDisplay as an, formatGithubAnnotations as ao, formatGitlabCodeQuality as ap, formatInterfaceTierLine as aq, generatedExportNames as ar, getParseSourceCacheSize as as, getTerm as at, instantiateConstraint as au, interfaceDiagCount as av, interfaceSourceOf as aw, interfaceTierOf as ax, isIntFlag as ay, isNodeModulesPath as az, type LoadDepsFingerprint as b, takeRefineDiags as b0, takeRefineDiagsSince as b1, throwConstraintToKinds as b2, union as b3, ProjectionBudget as c, type ProjectionStopReason as d, defaultLeakBudget as e, exceedsBudget as f, exportedNameOfLocal as g, extractAllLoadSpecs as h, getPromiseMicrosLength as i, loadModuleDepsFingerprint as j, resolveDepPath as k, leakIfNeeded as l, maybeLeak as m, normPath as n, stablePathKey as o, parseSource as p, stablePathKeyGraph as q, resetLeakCounter as r, sidecarSpecsOf as s, termDepth as t, termNodes as u, type CheckReport as v, CONSTRAINT_BUILDERS as w, CONSTRAINT_BUILDER_NAMES as x, CONSTRAINT_EXPR_RE as y, type CheckAction as z };
846
+ export { any as $, type CheckJson as A, type CheckJsonMulti as B, type CheckIssue as C, type ConstraintBuilder as D, type EffectiveInterfaceOpts as E, type Diagnostic as F, type EffectiveInterface as G, type GitlabCodeQualityIssue as H, type InterfaceSource as I, INTERFACE_SOURCE_ABBR as J, type InterfaceDiag as K, type LeakBudget as L, MAX_PROMISE_MICROS as M, type NudoConstraint as N, type InterfaceTierInfo as O, PROJECTION_MAX_DEPTH as P, type NamedImport as Q, type NudoField as R, type NudoFnConstraint as S, NudoSidecarError as T, type NudoSig as U, type RefineDiag as V, type RefineEntry as W, type RefineResolveOpts as X, SELF as Y, actionsForIssue as Z, andC as _, type InterfaceTierOpts as a, takeInterfaceDiags as a$, array as a0, boolean as a1, checkArg as a2, checkCall as a3, constraintAdmitsNullish as a4, constraintToEntryAbs as a5, derefConstraint as a6, drainPromiseMicros as a7, effectiveInterface as a8, enterPromiseExecutorScope as a9, isNodeModulesPath as aA, isNudoConstraint as aB, lazy as aC, leavePromiseExecutorScope as aD, lenTerm as aE, litC as aF, localNamedExports as aG, notePromiseExecutorFork as aH, nullable as aI, number as aJ, omit as aK, partial as aL, pick as aM, queuePromiseMicro as aN, refineDiagCount as aO, refineToIndexedFull as aP, resetNudoModuleExecCache as aQ, resetParseSourceCache as aR, resetSidecarLoadFailureCache as aS, serializeCheckJson as aT, serializeCheckJsonMulti as aU, setInterfaceDiagCollector as aV, setRefineDiagCollector as aW, shape as aX, sidecarClosureFingerprint as aY, sidecarPathOf as aZ, string as a_, evalPromiseCtor as aa, evalPromiseMethod as ab, evalPromiseStatic as ac, execNudoModule as ad, extractDeclaredThrows as ae, extractFnBudget as af, extractNudoImports as ag, extractRefineReturnFromSource as ah, extractRefinesFromSource as ai, fn as aj, fnConstraintToEntryReqs as ak, formatCheckReport as al, formatConstraint as am, formatDiagnostics as an, formatEffectiveInterfaceDisplay as ao, formatGithubAnnotations as ap, formatGitlabCodeQuality as aq, formatInterfaceTierLine as ar, generatedExportNames as as, getParseSourceCacheSize as at, getTerm as au, instantiateConstraint as av, interfaceDiagCount as aw, interfaceSourceOf as ax, interfaceTierOf as ay, isIntFlag as az, type LoadDepsFingerprint as b, takeInterfaceDiagsSince as b0, takeRefineDiags as b1, takeRefineDiagsSince as b2, throwConstraintToKinds as b3, union as b4, ProjectionBudget as c, type ProjectionStopReason as d, defaultLeakBudget as e, exceedsBudget as f, exportedNameOfLocal as g, extractAllLoadSpecs as h, getPromiseMicrosLength as i, loadModuleDepsFingerprint as j, resolveDepPath as k, leakIfNeeded as l, maybeLeak as m, normPath as n, stablePathKey as o, parseSource as p, stablePathKeyGraph as q, resetLeakCounter as r, sidecarSpecsOf as s, termDepth as t, termNodes as u, type CheckReport as v, CONSTRAINT_BUILDERS as w, CONSTRAINT_BUILDER_NAMES as x, CONSTRAINT_EXPR_RE as y, type CheckAction as z };
@@ -817,4 +817,4 @@ declare function callTranspiledExport(exports: Record<string, unknown>, name: st
817
817
  */
818
818
  declare function callTranspiledExportApply(exports: Record<string, unknown> | (() => Record<string, unknown>), name: string): (args: Abs[], thisVal?: Abs) => AbsApplyResult;
819
819
 
820
- export { $tryDigestSoft as $, type Abs as A, popMayThrowFrame as B, type Confidence as C, pushMayThrowFrame as D, ERROR_FAMILY as E, recordMayThrow as F, resetEvalFallbackStats as G, runWithMayThrowSession as H, setMayThrowCollector as I, throwAbsToKinds as J, throwsKindCovered as K, type LiteralValue as L, type MayThrowEffect as M, withEvalBudgetOverride as N, type HofCollectCtx as O, type PrimName as P, type HofSite as Q, type RelSource as R, type Shape as S, type Term as T, type AbsModuleExports as U, type RunTranspiledOptions as V, $assignRecord as W, $call as X, $callNamed as Y, $recordBinding as Z, type AbsApplyNoThrow as _, type Pred as a, ne as a$, type AbsApplyNoThrowFn as a0, type AbsApplyResult as a1, type AbsApplyReturn as a2, type AbsFnImpl as a3, type AbsSigImpl as a4, type EvalAbsAssignRecord as a5, type EvalCallRecord as a6, type EvalFallback as a7, type ImplicationOracle as a8, type LitValueResult as a9, emptyPhi as aA, eq as aB, evalExprAbs as aC, ge as aD, geNum as aE, getEvalCallCollector as aF, getFnImpl as aG, getImplicationOracle as aH, gt as aI, gtNum as aJ, hostFnCtorFacet as aK, implies as aL, isAbsApplyResult as aM, isAbsVal as aN, isBigPrim as aO, isExactLit as aP, isNumPrim as aQ, isStrPrim as aR, le as aS, leNum as aT, lit as aU, litValue as aV, lt as aW, ltNum as aX, makeAbsApplyResult as aY, markPureFn as aZ, namespaceAbsOf as a_, MAX_EVAL_CALL_DEPTH as aa, MAX_EVAL_TOTAL_CALLS as ab, RUNTIME_IMPORT_RE as ac, TYPEOF_NAMES as ad, type TranspiledCallResult as ae, type TypeofName as af, abs as ag, absFunction as ah, absOnly as ai, absToString as aj, and as ak, anyAbs as al, anyVar as am, app as an, assumeFinite as ao, attachFnImpl as ap, bigintLit as aq, bindImports as ar, bindingsOf as as, bool as at, boolLit as au, callTranspiledExport as av, callTranspiledExportApply as aw, callTranspiledExportFull as ax, collectAbsExports as ay, confJoin as az, type Phi as b, negatePred as b0, never as b1, not as b2, noteEvalCallRecord as b3, noteEvalFallback as b4, num as b5, numLit as b6, numVar as b7, obj as b8, or as b9, termEquals as bA, termToString as bB, tryRunTranspiled as bC, unknown as bD, v as bE, routeApplyThrows as bF, pFalse as ba, pTrue as bb, phiAnd as bc, predEquals as bd, predToString as be, predVars as bf, primToTypeof as bg, ptypeof as bh, pureFnNameOf as bi, relationFingerprint as bj, relationFn as bk, resetEvalCallBudget as bl, runTranspiled as bm, runTranspiledOptionsMemoKey as bn, setEvalAssignCollector as bo, setEvalBindingSink as bp, setEvalCallCollector as bq, setEvalFallbackCollector as br, setImplicationOracle as bs, shapeOfTerm as bt, shapeOnlyFn as bu, shapeToString as bv, simplifyTerm as bw, str as bx, strLit as by, substPred as bz, type AstEnv as c, $tryMarkSoft as d, $tryReleaseSoft as e, type EvalFallbackStats as f, absLit as g, absNumLit as h, absStrLit as i, allAbsStr as j, clearPureCallMemo as k, clearPureMemo as l, enterEvalCallBudgetSession as m, errorTypeAbs as n, exitEvalCallBudgetSession as o, filterDeclaredThrows as p, filterGateThrows as q, filterIgnoredThrows as r, flushMayThrowEffects as s, formatThrowsAbs as t, getEvalCallBudgetState as u, getEvalFallbackStats as v, getMayThrowCollector as w, isThrowsIgnored as x, mayThrowEffectsToAbs as y, orphanMayThrowEffects as z };
820
+ export { $tryDigestSoft as $, type Abs as A, orphanMayThrowEffects as B, type Confidence as C, popMayThrowFrame as D, ERROR_FAMILY as E, pushMayThrowFrame as F, recordMayThrow as G, resetEvalFallbackStats as H, runWithMayThrowSession as I, setMayThrowCollector as J, throwAbsToKinds as K, type LiteralValue as L, type MayThrowEffect as M, throwsKindCovered as N, withEvalBudgetOverride as O, type PrimName as P, type HofCollectCtx as Q, type RelSource as R, type Shape as S, type Term as T, type HofSite as U, type RunTranspiledOptions as V, $assignRecord as W, $call as X, $callNamed as Y, $recordBinding as Z, type AbsApplyNoThrow as _, type Pred as a, ne as a$, type AbsApplyNoThrowFn as a0, type AbsApplyResult as a1, type AbsApplyReturn as a2, type AbsFnImpl as a3, type AbsSigImpl as a4, type EvalAbsAssignRecord as a5, type EvalCallRecord as a6, type EvalFallback as a7, type ImplicationOracle as a8, type LitValueResult as a9, emptyPhi as aA, eq as aB, evalExprAbs as aC, ge as aD, geNum as aE, getEvalCallCollector as aF, getFnImpl as aG, getImplicationOracle as aH, gt as aI, gtNum as aJ, hostFnCtorFacet as aK, implies as aL, isAbsApplyResult as aM, isAbsVal as aN, isBigPrim as aO, isExactLit as aP, isNumPrim as aQ, isStrPrim as aR, le as aS, leNum as aT, lit as aU, litValue as aV, lt as aW, ltNum as aX, makeAbsApplyResult as aY, markPureFn as aZ, namespaceAbsOf as a_, MAX_EVAL_CALL_DEPTH as aa, MAX_EVAL_TOTAL_CALLS as ab, RUNTIME_IMPORT_RE as ac, TYPEOF_NAMES as ad, type TranspiledCallResult as ae, type TypeofName as af, abs as ag, absFunction as ah, absOnly as ai, absToString as aj, and as ak, anyAbs as al, anyVar as am, app as an, assumeFinite as ao, attachFnImpl as ap, bigintLit as aq, bindImports as ar, bindingsOf as as, bool as at, boolLit as au, callTranspiledExport as av, callTranspiledExportApply as aw, callTranspiledExportFull as ax, collectAbsExports as ay, confJoin as az, type Phi as b, negatePred as b0, never as b1, not as b2, noteEvalCallRecord as b3, noteEvalFallback as b4, num as b5, numLit as b6, numVar as b7, obj as b8, or as b9, termEquals as bA, termToString as bB, tryRunTranspiled as bC, unknown as bD, v as bE, routeApplyThrows as bF, pFalse as ba, pTrue as bb, phiAnd as bc, predEquals as bd, predToString as be, predVars as bf, primToTypeof as bg, ptypeof as bh, pureFnNameOf as bi, relationFingerprint as bj, relationFn as bk, resetEvalCallBudget as bl, runTranspiled as bm, runTranspiledOptionsMemoKey as bn, setEvalAssignCollector as bo, setEvalBindingSink as bp, setEvalCallCollector as bq, setEvalFallbackCollector as br, setImplicationOracle as bs, shapeOfTerm as bt, shapeOnlyFn as bu, shapeToString as bv, simplifyTerm as bw, str as bx, strLit as by, substPred as bz, type AbsModuleExports as c, type AstEnv as d, $tryMarkSoft as e, $tryReleaseSoft as f, type EvalFallbackStats as g, absLit as h, absNumLit as i, absStrLit as j, allAbsStr as k, clearPureCallMemo as l, clearPureMemo as m, enterEvalCallBudgetSession as n, errorTypeAbs as o, exitEvalCallBudgetSession as p, filterDeclaredThrows as q, filterGateThrows as r, filterIgnoredThrows as s, flushMayThrowEffects as t, formatThrowsAbs as u, getEvalCallBudgetState as v, getEvalFallbackStats as w, getMayThrowCollector as x, isThrowsIgnored as y, mayThrowEffectsToAbs as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nudojs/core",
3
- "version": "1.9.2",
3
+ "version": "1.9.4",
4
4
  "engines": {
5
5
  "node": ">=20"
6
6
  },