@intentius/chant 0.124.15 → 0.124.17

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.
Files changed (120) hide show
  1. package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
  2. package/dist/cli/commands/check-lexicon-plugin.js +2 -1
  3. package/dist/cli/commands/lint.d.ts.map +1 -1
  4. package/dist/cli/commands/lint.js +3 -2
  5. package/dist/cli/flush.d.ts +16 -0
  6. package/dist/cli/flush.d.ts.map +1 -0
  7. package/dist/cli/flush.js +42 -0
  8. package/dist/cli/handlers/approve.d.ts +98 -0
  9. package/dist/cli/handlers/approve.d.ts.map +1 -0
  10. package/dist/cli/handlers/approve.js +495 -0
  11. package/dist/cli/handlers/operator.d.ts +1 -95
  12. package/dist/cli/handlers/operator.d.ts.map +1 -1
  13. package/dist/cli/handlers/operator.js +4 -488
  14. package/dist/cli/handlers/override-approve.js +1 -1
  15. package/dist/cli/main.d.ts +4 -15
  16. package/dist/cli/main.d.ts.map +1 -1
  17. package/dist/cli/main.js +4 -1062
  18. package/dist/cli/parse-args.d.ts +6 -0
  19. package/dist/cli/parse-args.d.ts.map +1 -0
  20. package/dist/cli/parse-args.js +1028 -0
  21. package/dist/components/discover.d.ts.map +1 -1
  22. package/dist/components/discover.js +2 -1
  23. package/dist/components/fan-out-record.d.ts +1 -1
  24. package/dist/components/fan-out-record.d.ts.map +1 -1
  25. package/dist/components/fan-out-record.js +3 -7
  26. package/dist/components/fan-out-run.d.ts +5 -3
  27. package/dist/components/fan-out-run.d.ts.map +1 -1
  28. package/dist/components/fan-out-run.js +7 -5
  29. package/dist/config-sandbox.d.ts.map +1 -1
  30. package/dist/config-sandbox.js +5 -1
  31. package/dist/discovery/import.d.ts.map +1 -1
  32. package/dist/discovery/import.js +2 -1
  33. package/dist/discovery/sandbox/driver.d.ts.map +1 -1
  34. package/dist/discovery/sandbox/driver.js +8 -3
  35. package/dist/gated-waves.d.ts +25 -6
  36. package/dist/gated-waves.d.ts.map +1 -1
  37. package/dist/gated-waves.js +21 -6
  38. package/dist/lexicon-module.d.ts.map +1 -1
  39. package/dist/lexicon-module.js +4 -3
  40. package/dist/lint/policy-import.d.ts.map +1 -1
  41. package/dist/lint/policy-import.js +2 -1
  42. package/dist/lint/rule-loader.d.ts.map +1 -1
  43. package/dist/lint/rule-loader.js +2 -1
  44. package/dist/module-interop.d.ts +20 -0
  45. package/dist/module-interop.d.ts.map +1 -0
  46. package/dist/module-interop.js +39 -0
  47. package/dist/op/activities/activity-contracts.d.ts +4 -4
  48. package/dist/op/discover.d.ts.map +1 -1
  49. package/dist/op/discover.js +3 -2
  50. package/dist/op/op-waves-run.d.ts +1 -1
  51. package/dist/op/op-waves-run.d.ts.map +1 -1
  52. package/dist/op/op-waves-run.js +5 -6
  53. package/dist/op/op-waves.d.ts.map +1 -1
  54. package/dist/op/op-waves.js +4 -8
  55. package/dist/package-version.d.ts +2 -0
  56. package/dist/package-version.d.ts.map +1 -0
  57. package/dist/package-version.js +10 -0
  58. package/dist/wave-engine.d.ts +62 -0
  59. package/dist/wave-engine.d.ts.map +1 -0
  60. package/dist/wave-engine.js +59 -0
  61. package/dist/wave-layout.d.ts +29 -0
  62. package/dist/wave-layout.d.ts.map +1 -0
  63. package/dist/wave-layout.js +41 -0
  64. package/dist/wave-runtime.d.ts +29 -0
  65. package/dist/wave-runtime.d.ts.map +1 -0
  66. package/dist/wave-runtime.js +103 -0
  67. package/dist/wave-runtime.mjs +331 -0
  68. package/dist/workspace/ajv2020.d.ts +5 -0
  69. package/dist/workspace/ajv2020.d.ts.map +1 -0
  70. package/dist/workspace/ajv2020.js +14 -0
  71. package/dist/workspace/declaration.d.ts.map +1 -1
  72. package/dist/workspace/declaration.js +4 -8
  73. package/dist/workspace/kinds.d.ts.map +1 -1
  74. package/dist/workspace/kinds.js +2 -5
  75. package/dist/workspace/lineage-migrations.d.ts.map +1 -1
  76. package/dist/workspace/lineage-migrations.js +2 -1
  77. package/dist/workspace/points.d.ts.map +1 -1
  78. package/dist/workspace/points.js +2 -5
  79. package/dist/workspace/principal-classes.d.ts.map +1 -1
  80. package/dist/workspace/principal-classes.js +2 -5
  81. package/package.json +5 -3
  82. package/src/cli/commands/check-lexicon-plugin.ts +2 -1
  83. package/src/cli/commands/lint.ts +3 -2
  84. package/src/cli/compiled-cli.e2e.test.ts +42 -1
  85. package/src/cli/flush.ts +44 -0
  86. package/src/cli/handlers/approve.ts +618 -0
  87. package/src/cli/handlers/operator.ts +10 -608
  88. package/src/cli/handlers/override-approve.test.ts +1 -1
  89. package/src/cli/handlers/override-approve.ts +1 -1
  90. package/src/cli/main.ts +5 -816
  91. package/src/cli/parse-args.ts +781 -0
  92. package/src/components/discover.ts +2 -1
  93. package/src/components/fan-out-record.ts +3 -7
  94. package/src/components/fan-out-run.ts +7 -5
  95. package/src/config-sandbox.ts +5 -1
  96. package/src/discovery/import.ts +2 -1
  97. package/src/discovery/sandbox/driver.ts +8 -3
  98. package/src/gate-decision-bundle.test.ts +1 -0
  99. package/src/gated-waves.ts +28 -6
  100. package/src/lexicon-module.ts +4 -3
  101. package/src/lint/policy-import.ts +2 -1
  102. package/src/lint/rule-loader.ts +2 -1
  103. package/src/module-interop.test.ts +65 -0
  104. package/src/module-interop.ts +39 -0
  105. package/src/op/discover.ts +3 -2
  106. package/src/op/op-waves-run.ts +5 -6
  107. package/src/op/op-waves.ts +4 -8
  108. package/src/package-version.ts +11 -0
  109. package/src/wave-engine.test.ts +107 -0
  110. package/src/wave-engine.ts +98 -0
  111. package/src/wave-layout.ts +44 -0
  112. package/src/wave-runtime-bundle.test.ts +70 -0
  113. package/src/wave-runtime.e2e.test.ts +177 -0
  114. package/src/wave-runtime.ts +104 -0
  115. package/src/workspace/ajv2020.ts +17 -0
  116. package/src/workspace/declaration.ts +4 -10
  117. package/src/workspace/kinds.ts +2 -5
  118. package/src/workspace/lineage-migrations.ts +2 -1
  119. package/src/workspace/points.ts +2 -5
  120. package/src/workspace/principal-classes.ts +2 -5
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/components/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAQ1D,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,0HAA0H;IAC1H,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,0GAA0G;IAC1G,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,oDAAoD;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,8CAA8C;AAC9C,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED,6FAA6F;AAC7F,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAuBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,GAAG;IAC9E,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B,CAkCA;AA8BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAsCnC"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/components/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAS1D,2EAA2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,0HAA0H;IAC1H,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,0GAA0G;IAC1G,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,oDAAoD;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,8CAA8C;AAC9C,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED,6FAA6F;AAC7F,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAuBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,GAAG;IAC9E,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B,CAkCA;AA8BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAsCnC"}
@@ -49,6 +49,7 @@ import { hasDiscoveryMarkerSync } from "../discovery/files.js";
49
49
  import { resolveDiscoveryGlobs } from "../config.js";
50
50
  import { walkDiscovery, workspaceMemberDirs } from "../discovery/walk.js";
51
51
  import { ensureTypeScriptLoader } from "../ts-loader.js";
52
+ import { esModuleNamespace } from "../module-interop.js";
52
53
  /**
53
54
  * Every `*.component.ts` file under `path`, through the one discovery walk
54
55
  * (`../discovery/walk.ts`, #2527): the same dot-directory, `dist`,
@@ -127,7 +128,7 @@ async function importAndCollectComponents(sourceFiles) {
127
128
  // a bare "." path) would otherwise be treated by `import()` as a bare
128
129
  // package specifier and fail with "Cannot find package 'x.component.ts'".
129
130
  ensureTypeScriptLoader();
130
- const exports = await import(pathToFileURL(resolve(filePath)).href);
131
+ const exports = esModuleNamespace(await import(pathToFileURL(resolve(filePath)).href));
131
132
  modules.push({ file: filePath, exports });
132
133
  }
133
134
  catch (err) {
@@ -26,7 +26,7 @@
26
26
  * in the record rather than beside it because the record is the one file a
27
27
  * per-wave CI job hands to the next.
28
28
  */
29
- import { type WaveRecord } from "../gated-waves.js";
29
+ import { type WaveRecord } from "../wave-engine.js";
30
30
  import type { ChangeSetDocument } from "../change-set.js";
31
31
  import type { PrMember } from "../pr-loop.js";
32
32
  /** What a pull request's apply approved, kept so a re-run can finish it (#3464). */
@@ -1 +1 @@
1
- {"version":3,"file":"fan-out-record.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oDAAoD;IACpD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,qGAAqG;IACrG,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AA+BD,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAkBzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAK7E"}
1
+ {"version":3,"file":"fan-out-record.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,yFAAyF;IACzF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,oDAAoD;IACpD,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,qGAAqG;IACrG,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AA+BD,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAkBzE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAE7E"}
@@ -26,9 +26,8 @@
26
26
  * in the record rather than beside it because the record is the one file a
27
27
  * per-wave CI job hands to the next.
28
28
  */
29
- import { dirname } from "node:path";
30
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
31
- import { readWaveRecords } from "../gated-waves.js";
29
+ import { existsSync, readFileSync } from "node:fs";
30
+ import { readWaveRecords, writeWaveRecordFile } from "../wave-engine.js";
32
31
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
33
32
  const isStringArray = (value) => Array.isArray(value) && value.every((v) => typeof v === "string");
34
33
  /** The `prApply` entry, when it has every field a resume needs. Anything else reads as no entry. */
@@ -87,8 +86,5 @@ export function readFanOutAttempt(path) {
87
86
  * write leaves the previous record whole rather than half a JSON document.
88
87
  */
89
88
  export function writeFanOutAttempt(path, attempt) {
90
- mkdirSync(dirname(path), { recursive: true });
91
- const temporary = `${path}.${process.pid}.tmp`;
92
- writeFileSync(temporary, JSON.stringify(attempt, null, 2) + "\n");
93
- renameSync(temporary, path);
89
+ writeWaveRecordFile(path, attempt);
94
90
  }
@@ -31,8 +31,10 @@
31
31
  * ## Or one approval per wave
32
32
  *
33
33
  * `waveGate` (#3049) is the other mode. Each wave is planned once the waves
34
- * before it applied, and its gate binds that wave's set digest
35
- * (`../gated-waves.ts`). See {@link runGatedWaves}.
34
+ * before it applied, and its gate binds that wave's set digest. Gate names,
35
+ * the digest and the gate decision come from the wave engine
36
+ * (`../wave-engine.ts`, #3766), which `chant run wave` uses too. See
37
+ * {@link runGatedWaves}.
36
38
  */
37
39
  import { type DriverComponent, type DriverComponentResult } from "./driver.js";
38
40
  import type { ReleaseIdentity } from "../telemetry-attribution.js";
@@ -43,7 +45,7 @@ import type { CapabilityRegistry } from "./capability.js";
43
45
  import type { PendingGateRecord } from "../lifecycle/gate-ledger.js";
44
46
  import type { DeployContext } from "./capability.js";
45
47
  import { type WaveComponentPlan } from "./wave-plan.js";
46
- import { type WaveRecord } from "../gated-waves.js";
48
+ import { type WaveRecord } from "../wave-engine.js";
47
49
  /**
48
50
  * One gate per wave (#3049), each bound to its wave's set digest. The other
49
51
  * mode beside {@link FanOutGate}: that one approves the whole set once, this
@@ -1 +1 @@
1
- {"version":3,"file":"fan-out-run.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fan-out-run.d.ts","sourceRoot":"","sources":["../../src/components/fan-out-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAE3B,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACrH,OAAO,EAAmC,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAgE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE/G;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE,aAAa,EAClB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KACtD,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8FAA8F;AAC9F,qBAAa,0BAA2B,SAAQ,KAAK;IAEjD,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE;IAH/B,YACW,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EAO9B;CACF;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,0FAA0F;IAC1F,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,qFAAqF;IACrF,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,4FAA4F;IAC5F,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;IACrE;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;CAC5G;AAED,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,8EAA8E;IAC9E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mFAAmF;IACnF,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,sEAAsE;IACtE,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,iGAAiG;IACjG,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,eAAe,EAAE,EAC7B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA2I1B"}
@@ -31,14 +31,16 @@
31
31
  * ## Or one approval per wave
32
32
  *
33
33
  * `waveGate` (#3049) is the other mode. Each wave is planned once the waves
34
- * before it applied, and its gate binds that wave's set digest
35
- * (`../gated-waves.ts`). See {@link runGatedWaves}.
34
+ * before it applied, and its gate binds that wave's set digest. Gate names,
35
+ * the digest and the gate decision come from the wave engine
36
+ * (`../wave-engine.ts`, #3766), which `chant run wave` uses too. See
37
+ * {@link runGatedWaves}.
36
38
  */
37
39
  import { deployContext, runComponentDeploy, } from "./driver.js";
38
40
  import { downstreamWithin, remainingFanOut } from "./fan-out.js";
39
41
  import { evaluateGate, gitGateLedgerPort } from "../op/gate.js";
40
42
  import { planWaveComponent } from "./wave-plan.js";
41
- import { waveGateName, waveSetDigest } from "../gated-waves.js";
43
+ import { decideWaveGate, waveGateName, waveSetDigest } from "../wave-engine.js";
42
44
  /** Thrown when `FanOutWaveGate.only` names a wave whose predecessors have not all applied. */
43
45
  export class EarlierWaveNotAppliedError extends Error {
44
46
  constructor(wave, earlier, components) {
@@ -288,10 +290,10 @@ async function runGatedWaves(plan, active, components, registry, options, waveGa
288
290
  options.onWaveSettled?.(record);
289
291
  continue;
290
292
  }
291
- const check = await evaluateGate(gates.port, {
293
+ const check = await decideWaveGate(gates.port, {
292
294
  op: waveGate.op,
293
295
  gate: gateName,
294
- planDigest: digest,
296
+ digest,
295
297
  description: waveGate.description ?? `wave ${waveNum} of ${plan.waves.length}: ${toRun.join(", ")}`,
296
298
  ...(waveGate.timeout ? { timeout: waveGate.timeout } : {}),
297
299
  ...(options.now ? { now: options.now } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"config-sandbox.d.ts","sourceRoot":"","sources":["../src/config-sandbox.ts"],"names":[],"mappings":"AACA,OAAO,EAA2C,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAmDtG;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED,kEAAkE;AAClE,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAG3D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAA4B,GACxC,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAUlF"}
1
+ {"version":3,"file":"config-sandbox.d.ts","sourceRoot":"","sources":["../src/config-sandbox.ts"],"names":[],"mappings":"AACA,OAAO,EAA2C,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAoDtG;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED,kEAAkE;AAClE,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAG3D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAK5E;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAA4B,GACxC,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAUlF"}
@@ -1,5 +1,6 @@
1
1
  import { dirname } from "node:path";
2
2
  import { importConfigModule, requireConfigModule } from "./config-import.js";
3
+ import { esModuleNamespace } from "./module-interop.js";
3
4
  /**
4
5
  * chant #1113 — decides WHERE a project's `chant.config.ts` is evaluated.
5
6
  *
@@ -77,7 +78,10 @@ export function resetSandboxConfigEvaluationForTests() {
77
78
  * evaluated, never how its result is read.
78
79
  */
79
80
  export function selectConfigExport(namespace) {
80
- return namespace.default ?? namespace.config ?? namespace;
81
+ // A config tsx compiled as CommonJS arrives as `{ default: module.exports }`
82
+ // under a native import (#3897); read the module's own namespace instead.
83
+ const ns = esModuleNamespace(namespace);
84
+ return ns.default ?? ns.config ?? ns;
81
85
  }
82
86
  /**
83
87
  * Evaluate a project's `chant.config.ts` and return its configuration object,
@@ -1 +1 @@
1
- {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/discovery/import.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclC"}
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/discovery/import.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclC"}
@@ -1,5 +1,6 @@
1
1
  import { DiscoveryError } from "../errors.js";
2
2
  import { ensureTypeScriptLoader } from "../ts-loader.js";
3
+ import { esModuleNamespace } from "../module-interop.js";
3
4
  /**
4
5
  * Modules whose evaluation threw, and the error each threw with (#2368).
5
6
  *
@@ -54,7 +55,7 @@ export async function importModule(path) {
54
55
  throw failed;
55
56
  try {
56
57
  ensureTypeScriptLoader();
57
- return await import(path);
58
+ return esModuleNamespace(await import(path));
58
59
  }
59
60
  catch (error) {
60
61
  const message = error instanceof Error ? error.message : "Unknown import error";
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/discovery/sandbox/driver.ts"],"names":[],"mappings":"AA8DA,MAAM,WAAW,qBAAqB;IACpC,qIAAqI;IACrI,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,oNAAoN;IACpN,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,EAAE,CAsB3E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAoH3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA6CrE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgGjF"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../../src/discovery/sandbox/driver.ts"],"names":[],"mappings":"AAgEA,MAAM,WAAW,qBAAqB;IACpC,qIAAqI;IACrI,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,oNAAoN;IACpN,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,EAAE,CAsB3E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAqH3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA8CrE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAiGjF"}
@@ -56,6 +56,8 @@ const POST_SYNTH_MODULE = join(dirname(DISCOVERY_DIR), "lint", "post-synth.ts");
56
56
  // file, so the driver's `setBuildParams` call below mutates the one object
57
57
  // every bundled import observes.
58
58
  const PARAMS_MODULE = join(dirname(DISCOVERY_DIR), "params.ts");
59
+ // #3897: a project file tsx compiled as CommonJS reads as its own namespace.
60
+ const INTEROP_MODULE = join(dirname(DISCOVERY_DIR), "module-interop.ts");
59
61
  /** Escape a value for embedding as a JS/TS source-level literal. */
60
62
  function lit(value) {
61
63
  return JSON.stringify(value);
@@ -116,6 +118,7 @@ export function generateDriverSource(options) {
116
118
  `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
117
119
  `import { getProvenance } from ${lit(PROVENANCE_MODULE)};`,
118
120
  `import { setBuildParams } from ${lit(PARAMS_MODULE)};`,
121
+ `import { esModuleNamespace } from ${lit(INTEROP_MODULE)};`,
119
122
  `import { writeSync } from "node:fs";`,
120
123
  ``,
121
124
  `const BUILD_ROOT = ${lit(buildRoot)};`,
@@ -163,7 +166,7 @@ export function generateDriverSource(options) {
163
166
  ` const errors = [];`,
164
167
  ];
165
168
  for (const file of files) {
166
- lines.push(` importing = ${lit(file)};`, ` try {`, ` const mod = await import(${lit(file)});`, ` modules.push({ file: ${lit(file)}, exports: mod });`, ` } catch (err) {`, ` errors.push(classifyChildError(${lit(file)}, err).toJSON());`, ` }`, ` importing = undefined;`);
169
+ lines.push(` importing = ${lit(file)};`, ` try {`, ` const mod = esModuleNamespace(await import(${lit(file)}));`, ` modules.push({ file: ${lit(file)}, exports: mod });`, ` } catch (err) {`, ` errors.push(classifyChildError(${lit(file)}, err).toJSON());`, ` }`, ` importing = undefined;`);
167
170
  }
168
171
  lines.push(``, ` let entities = new Map();`, ` try {`, ` entities = collectEntities(modules, BUILD_ROOT);`, ` } catch (err) {`, ` errors.push(classifyChildError(errFile(err), err, "resolution").toJSON());`, ` await send({ entitySet: { entities: [] }, errors, provenanceByName: {} });`, ` return;`, ` }`, ``,
169
172
  // Recorded BEFORE resolveAttrRefs/encode — not for the parent's own
@@ -198,6 +201,7 @@ export function generateConfigDriverSource(configPath) {
198
201
  return [
199
202
  `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
200
203
  `import { scanConfigWireSafety } from ${lit(CONFIG_WIRE_MODULE)};`,
204
+ `import { esModuleNamespace } from ${lit(INTEROP_MODULE)};`,
201
205
  `import { writeSync } from "node:fs";`,
202
206
  ``,
203
207
  ...sendFunctionSource(),
@@ -205,7 +209,7 @@ export function generateConfigDriverSource(configPath) {
205
209
  `async function main() {`,
206
210
  ` let namespace;`,
207
211
  ` try {`,
208
- ` namespace = await import(${lit(configPath)});`,
212
+ ` namespace = esModuleNamespace(await import(${lit(configPath)}));`,
209
213
  ` } catch (err) {`,
210
214
  ` await send({ kind: "chant-config", ok: false, error: classifyChildError(${lit(configPath)}, err).toJSON() });`,
211
215
  ` return;`,
@@ -273,6 +277,7 @@ export function generatePolicyDriverSource(policyPaths) {
273
277
  `import { classifyChildError } from ${lit(CHILD_ERRORS_MODULE)};`,
274
278
  `import { decodePolicyBuildResult, scanPolicyDiagnostics, PolicyWireError } from ${lit(POLICY_WIRE_MODULE)};`,
275
279
  `import { runPostSynthChecks, isPostSynthCheck } from ${lit(POST_SYNTH_MODULE)};`,
280
+ `import { esModuleNamespace } from ${lit(INTEROP_MODULE)};`,
276
281
  `import { writeSync } from "node:fs";`,
277
282
  ``,
278
283
  ...sendFunctionSource(),
@@ -315,7 +320,7 @@ export function generatePolicyDriverSource(policyPaths) {
315
320
  // the same order `loadPolicyChecks` collects in, so the diagnostics sequence
316
321
  // matches the in-process one exactly.
317
322
  for (const policyPath of policyPaths) {
318
- lines.push(` try {`, ` const mod = await import(${lit(policyPath)});`, ` for (const value of Object.values(mod)) {`, ` if (isPostSynthCheck(value)) checks.push(guard(value, ${lit(policyPath)}));`, ` }`, ` } catch (err) {`, ` await fail(${lit(policyPath)}, err, "import");`, ` return;`, ` }`);
323
+ lines.push(` try {`, ` const mod = esModuleNamespace(await import(${lit(policyPath)}));`, ` for (const value of Object.values(mod)) {`, ` if (isPostSynthCheck(value)) checks.push(guard(value, ${lit(policyPath)}));`, ` }`, ` } catch (err) {`, ` await fail(${lit(policyPath)}, err, "import");`, ` return;`, ` }`);
319
324
  }
320
325
  lines.push(``, ` let diagnostics;`, ` try {`, ` diagnostics = runPostSynthChecks(checks, buildResult, request.env ?? undefined);`, ` } catch (err) {`, ` await fail("", err, "resolution");`, ` return;`, ` }`, ``, ` await send({ kind: "chant-policy", ok: true, diagnostics });`, `}`, ``,
321
326
  // Registered synchronously at module top level — see the doc above on why
@@ -2,12 +2,17 @@
2
2
  * Gated waves (#3049): one change rolled out across many roots, a wave at a
3
3
  * time, each wave behind its own gate bound to that wave's set digest.
4
4
  *
5
- * `chant components fan-out --wave-gate` is the runner. This module holds the
6
- * parts that need no runner: how a set of roots is cut into waves, what a
7
- * wave's digest is, what its gate is called, and what the attempt record says
8
- * about each wave. They are kept apart from the runner because terragucci
9
- * calls them from its CI stages as one bundled file with no TypeScript
10
- * toolchain (#3421). Everything here imports `./change-set` and nothing else,
5
+ * Two runners use it (#3766): `chant components fan-out --wave-gate` and the
6
+ * Op waves spec's `chant run wave` (`./op/op-waves-run.ts`). This module
7
+ * holds the parts that need no runner: how a set of roots is cut into waves,
8
+ * what a wave's digest is and which members it covers, what its gate is
9
+ * called, and what the attempt record says about each wave. A gate name
10
+ * pattern and the share split of a wide wave are in `./wave-layout.ts`;
11
+ * `./wave-engine.ts` puts them together with the gate decision call and the
12
+ * record file writer, which need the gate ledger and the filesystem.
13
+ *
14
+ * They are kept apart from the runners because terragucci calls them from
15
+ * its CI stages as one bundled file with no TypeScript toolchain (#3421). Everything here imports `./change-set` and nothing else,
11
16
  * and `gated-waves-bundle.test.ts` holds that.
12
17
  *
13
18
  * ## The set digest
@@ -96,6 +101,20 @@ export declare function waveSetDigest(members: readonly WaveMember[]): string;
96
101
  * on a resumed attempt and its approval still applies.
97
102
  */
98
103
  export declare function waveGateName(gate: string, wave: number): string;
104
+ /** Which members a wave's set digest covers (#3821). */
105
+ export type WaveDigestOver = "all" | "changing";
106
+ /**
107
+ * The members a wave's set digest is taken over (#3821, #3766). `all` (the
108
+ * default): every member. `changing`: the members whose plan is not
109
+ * `empty`, or every member when all of them are empty. `extras`, members
110
+ * that are no run (such as a wave's cost), are always in it.
111
+ */
112
+ export declare function waveDigestMembers<M extends WaveMember & {
113
+ empty?: boolean;
114
+ }>(members: readonly M[], options?: {
115
+ over?: WaveDigestOver;
116
+ extras?: readonly WaveMember[];
117
+ }): WaveMember[];
99
118
  /** Where a wave got to. */
100
119
  export type WaveStatus =
101
120
  /** Planned, and its gate is not approved for this digest. Nothing in it ran. */
@@ -1 +1 @@
1
- {"version":3,"file":"gated-waves.d.ts","sourceRoot":"","sources":["../src/gated-waves.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gated-waves.d.ts","sourceRoot":"","sources":["../src/gated-waves.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,17 @@
2
2
  * Gated waves (#3049): one change rolled out across many roots, a wave at a
3
3
  * time, each wave behind its own gate bound to that wave's set digest.
4
4
  *
5
- * `chant components fan-out --wave-gate` is the runner. This module holds the
6
- * parts that need no runner: how a set of roots is cut into waves, what a
7
- * wave's digest is, what its gate is called, and what the attempt record says
8
- * about each wave. They are kept apart from the runner because terragucci
9
- * calls them from its CI stages as one bundled file with no TypeScript
10
- * toolchain (#3421). Everything here imports `./change-set` and nothing else,
5
+ * Two runners use it (#3766): `chant components fan-out --wave-gate` and the
6
+ * Op waves spec's `chant run wave` (`./op/op-waves-run.ts`). This module
7
+ * holds the parts that need no runner: how a set of roots is cut into waves,
8
+ * what a wave's digest is and which members it covers, what its gate is
9
+ * called, and what the attempt record says about each wave. A gate name
10
+ * pattern and the share split of a wide wave are in `./wave-layout.ts`;
11
+ * `./wave-engine.ts` puts them together with the gate decision call and the
12
+ * record file writer, which need the gate ledger and the filesystem.
13
+ *
14
+ * They are kept apart from the runners because terragucci calls them from
15
+ * its CI stages as one bundled file with no TypeScript toolchain (#3421). Everything here imports `./change-set` and nothing else,
11
16
  * and `gated-waves-bundle.test.ts` holds that.
12
17
  *
13
18
  * ## The set digest
@@ -106,6 +111,16 @@ export function waveSetDigest(members) {
106
111
  export function waveGateName(gate, wave) {
107
112
  return `${gate}-wave-${wave}`;
108
113
  }
114
+ /**
115
+ * The members a wave's set digest is taken over (#3821, #3766). `all` (the
116
+ * default): every member. `changing`: the members whose plan is not
117
+ * `empty`, or every member when all of them are empty. `extras`, members
118
+ * that are no run (such as a wave's cost), are always in it.
119
+ */
120
+ export function waveDigestMembers(members, options = {}) {
121
+ const changing = options.over === "changing" ? members.filter((m) => m.empty !== true) : [];
122
+ return [...(changing.length > 0 ? changing : members), ...(options.extras ?? [])];
123
+ }
109
124
  const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
110
125
  const strings = (value) => Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
111
126
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-module.d.ts","sourceRoot":"","sources":["../src/lexicon-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAOH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAExE;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/E,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAiBvG;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,OAAO,EAAE,MAAM,EACf,SAAS,SAAM,GACd;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM3G;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAYpG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAsB,EAC/B,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,EAAE,CAEV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI9D;AAUD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAMpG;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAW1H"}
1
+ {"version":3,"file":"lexicon-module.d.ts","sourceRoot":"","sources":["../src/lexicon-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,mEAAmE;AACnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAExE;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,EAAE,CAAC;AAC/E,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAiBvG;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,OAAO,EAAE,MAAM,EACf,SAAS,SAAM,GACd;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,EAClD,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAM3G;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAYpG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAsB,EAC/B,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAe,GAC/C,MAAM,EAAE,CAEV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI9D;AAUD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAMpG;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAW1H"}
@@ -27,6 +27,7 @@ import { createRequire } from "node:module";
27
27
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
28
28
  import { pathToFileURL } from "node:url";
29
29
  import { ensureTypeScriptLoader } from "./ts-loader.js";
30
+ import { esModuleNamespace } from "./module-interop.js";
30
31
  /** The lexicon name an entry declares, whichever form it takes. */
31
32
  export function lexiconDeclarationName(entry) {
32
33
  return typeof entry === "string" ? entry : entry.name;
@@ -156,7 +157,7 @@ export async function importLexiconModule(name) {
156
157
  return undefined;
157
158
  try {
158
159
  ensureTypeScriptLoader();
159
- return (await import(path));
160
+ return esModuleNamespace((await import(path)));
160
161
  }
161
162
  catch (err) {
162
163
  throw new Error(`lexicon "${name}" is declared with module ${path}, which could not be loaded: ` +
@@ -227,7 +228,7 @@ export function resolveFromProject(spec, fromDir = process.cwd()) {
227
228
  export async function importLexiconPackage(spec, fromDir = process.cwd()) {
228
229
  try {
229
230
  ensureTypeScriptLoader();
230
- return (await import(spec));
231
+ return esModuleNamespace((await import(spec)));
231
232
  }
232
233
  catch (err) {
233
234
  const pkg = packageNameOf(spec);
@@ -236,6 +237,6 @@ export async function importLexiconPackage(spec, fromDir = process.cwd()) {
236
237
  const resolved = resolveFromProject(spec, fromDir);
237
238
  if (resolved === undefined)
238
239
  throw err;
239
- return (await import(pathToFileURL(resolved).href));
240
+ return esModuleNamespace((await import(pathToFileURL(resolved).href)));
240
241
  }
241
242
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policy-import.d.ts","sourceRoot":"","sources":["../../src/lint/policy-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,iEAAiE;AACjE,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,4IAA4I;AAC5I,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D;AAED,2HAA2H;AAC3H,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAQ3F"}
1
+ {"version":3,"file":"policy-import.d.ts","sourceRoot":"","sources":["../../src/lint/policy-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,iEAAiE;AACjE,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,4IAA4I;AAC5I,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D;AAED,2HAA2H;AAC3H,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAQ3F"}
@@ -23,6 +23,7 @@
23
23
  * that might forget to ask.
24
24
  */
25
25
  import { ensureTypeScriptLoader } from "../ts-loader.js";
26
+ import { esModuleNamespace } from "../module-interop.js";
26
27
  /** Whether this process must run project policy modules inside the sandbox boundary instead of here. */
27
28
  let armed = false;
28
29
  /**
@@ -58,5 +59,5 @@ export async function importPolicyModule(policyPath) {
58
59
  throw new Error(`Refusing to import the policy module ${policyPath} into the chant process under --sandbox: it is project-authored code and must be imported inside the sandbox boundary (packages/core/src/lint/policy-sandbox.ts's runProjectPolicies).`);
59
60
  }
60
61
  ensureTypeScriptLoader();
61
- return (await import(policyPath));
62
+ return esModuleNamespace((await import(policyPath)));
62
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rule-loader.d.ts","sourceRoot":"","sources":["../../src/lint/rule-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAgDvC;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsC5E"}
1
+ {"version":3,"file":"rule-loader.d.ts","sourceRoot":"","sources":["../../src/lint/rule-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAiDvC;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsC5E"}
@@ -1,6 +1,7 @@
1
1
  import { readdirSync, existsSync } from "fs";
2
2
  import { dirname, join, resolve } from "path";
3
3
  import { ensureTypeScriptLoader } from "../ts-loader.js";
4
+ import { esModuleNamespace } from "../module-interop.js";
4
5
  /**
5
6
  * Type guard to check if a value conforms to the LintRule interface.
6
7
  */
@@ -74,7 +75,7 @@ export async function loadLocalRules(projectDir) {
74
75
  let mod;
75
76
  try {
76
77
  ensureTypeScriptLoader();
77
- mod = await import(filePath);
78
+ mod = esModuleNamespace(await import(filePath));
78
79
  }
79
80
  catch (err) {
80
81
  throw new Error(`Failed to load rule file "${file}": ${err instanceof Error ? err.message : String(err)}`);
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The namespace a project module was authored with, whichever module format
3
+ * tsx compiled it to (#3897).
4
+ *
5
+ * A `.ts` file with no `"type": "module"` `package.json` above it is compiled
6
+ * by tsx as CommonJS: `exports.default = ...` plus a non-enumerable
7
+ * `__esModule: true` marker. The compiled CLI loads project files with a
8
+ * native `import()`, and Node hands a CommonJS module back as a namespace
9
+ * whose `default` is the whole `module.exports`. So `export default x` arrives
10
+ * as `namespace.default.default`. Under the source CLI tsx's ESM loader sits
11
+ * in front of the `import()` and does this interop itself, which is why the
12
+ * nesting only showed up once the CLI ran compiled (#3879).
13
+ *
14
+ * When `namespace.default` carries the `__esModule` marker, the module's real
15
+ * namespace is that exports object: this returns a copy of it with the marker
16
+ * left out. Anything else, including an ES module whose default export is an
17
+ * object that happens to have a `default` key, is returned unchanged.
18
+ */
19
+ export declare function esModuleNamespace<T extends Record<string, unknown>>(namespace: T): T;
20
+ //# sourceMappingURL=module-interop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-interop.d.ts","sourceRoot":"","sources":["../src/module-interop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAWpF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The namespace a project module was authored with, whichever module format
3
+ * tsx compiled it to (#3897).
4
+ *
5
+ * A `.ts` file with no `"type": "module"` `package.json` above it is compiled
6
+ * by tsx as CommonJS: `exports.default = ...` plus a non-enumerable
7
+ * `__esModule: true` marker. The compiled CLI loads project files with a
8
+ * native `import()`, and Node hands a CommonJS module back as a namespace
9
+ * whose `default` is the whole `module.exports`. So `export default x` arrives
10
+ * as `namespace.default.default`. Under the source CLI tsx's ESM loader sits
11
+ * in front of the `import()` and does this interop itself, which is why the
12
+ * nesting only showed up once the CLI ran compiled (#3879).
13
+ *
14
+ * When `namespace.default` carries the `__esModule` marker, the module's real
15
+ * namespace is that exports object: this returns a copy of it with the marker
16
+ * left out. Anything else, including an ES module whose default export is an
17
+ * object that happens to have a `default` key, is returned unchanged.
18
+ */
19
+ export function esModuleNamespace(namespace) {
20
+ // `in` before the read: a vitest factory mock throws on reading an export
21
+ // it does not define, and most modules have no `default` at all.
22
+ if (namespace === null || typeof namespace !== "object" || !("default" in namespace))
23
+ return namespace;
24
+ const exported = namespace.default;
25
+ if (!isCommonJsEsModule(exported))
26
+ return namespace;
27
+ const unwrapped = {};
28
+ for (const key of Object.keys(exported)) {
29
+ if (key !== "__esModule")
30
+ unwrapped[key] = exported[key];
31
+ }
32
+ return unwrapped;
33
+ }
34
+ /** A CommonJS `module.exports` that a compiler marked as an ES module. */
35
+ function isCommonJsEsModule(value) {
36
+ return (value !== null &&
37
+ (typeof value === "object" || typeof value === "function") &&
38
+ value.__esModule === true);
39
+ }
@@ -318,11 +318,11 @@ export declare const decideContract: import("../index.js").ActivityContract<{
318
318
  backends?: Record<string, {
319
319
  url: string;
320
320
  key?: {
321
+ env: string;
322
+ } | {
321
323
  capability: string;
322
324
  member?: string | undefined;
323
325
  env?: string | undefined;
324
- } | {
325
- env: string;
326
326
  } | undefined;
327
327
  timeoutMs?: number | undefined;
328
328
  }> | undefined;
@@ -411,11 +411,11 @@ export declare const factoryAskContract: import("../index.js").ActivityContract<
411
411
  backends?: Record<string, {
412
412
  url: string;
413
413
  key?: {
414
+ env: string;
415
+ } | {
414
416
  capability: string;
415
417
  member?: string | undefined;
416
418
  env?: string | undefined;
417
- } | {
418
- env: string;
419
419
  } | undefined;
420
420
  timeoutMs?: number | undefined;
421
421
  }> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/op/discover.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG1E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA6GD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6CrF;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACzC,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2GAA2G;IAC3G,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA2C/F"}
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/op/discover.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAI1E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA6GD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6CrF;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACzC,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,2GAA2G;IAC3G,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA2C/F"}
@@ -6,6 +6,7 @@ import { hasDiscoveryMarkerSync } from "../discovery/files.js";
6
6
  import { resolveDiscoveryGlobs } from "../config.js";
7
7
  import { isStewardDeclaration } from "./steward.js";
8
8
  import { ensureTypeScriptLoader } from "../ts-loader.js";
9
+ import { esModuleNamespace } from "../module-interop.js";
9
10
  async function findGitRoot(cwd) {
10
11
  const rt = getRuntime();
11
12
  const result = await rt.spawn(["git", "rev-parse", "--show-toplevel"], { cwd });
@@ -132,7 +133,7 @@ export async function discoverOps(opts) {
132
133
  for (const filePath of files) {
133
134
  try {
134
135
  ensureTypeScriptLoader();
135
- const mod = (await import(filePath));
136
+ const mod = esModuleNamespace((await import(filePath)));
136
137
  const exported = opsExportedBy(mod);
137
138
  // A file may hold a steward and no Op (#2731): the steward sits beside
138
139
  // the Ops it runs, and `discoverStewards` reads it from here.
@@ -180,7 +181,7 @@ export async function discoverStewards(opts) {
180
181
  let mod;
181
182
  try {
182
183
  ensureTypeScriptLoader();
183
- mod = (await import(filePath));
184
+ mod = esModuleNamespace((await import(filePath)));
184
185
  }
185
186
  catch (err) {
186
187
  errors.push(`${filePath}: ${err instanceof Error ? err.message : String(err)}`);
@@ -47,7 +47,7 @@
47
47
  * question is answered, `chant run resume --op <name>` starts the job again
48
48
  * (`pointGateResumable`, #3835).
49
49
  */
50
- import { type WaveMember } from "../gated-waves.js";
50
+ import { type WaveMember } from "../wave-engine.js";
51
51
  import { type GateDigestMismatch, type GateLedgerPort } from "./gate.js";
52
52
  import type { GateAnswerRef, PendingGateRecord } from "../lifecycle/gate-ledger.js";
53
53
  import type { GatePointAsker } from "../point-decision.js";