@intentius/chant 0.124.23 → 0.124.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ci-jobs.d.ts +41 -1
- package/dist/ci-jobs.d.ts.map +1 -1
- package/dist/ci-jobs.js +48 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +14 -0
- package/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +9 -0
- package/dist/cli/handlers/emulator.d.ts +13 -2
- package/dist/cli/handlers/emulator.d.ts.map +1 -1
- package/dist/cli/handlers/emulator.js +63 -3
- package/dist/cli/handlers/promote.d.ts.map +1 -1
- package/dist/cli/handlers/promote.js +7 -1
- package/dist/cli/handlers/run-wave.d.ts.map +1 -1
- package/dist/cli/handlers/run-wave.js +5 -4
- package/dist/cli/handlers/run.d.ts +4 -3
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/handlers/run.js +73 -9
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +38 -11
- package/dist/cli/mcp/workspace-tools.d.ts +3 -3
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.js +27 -4
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +31 -0
- package/dist/cli/registry.d.ts +12 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/cli-support.d.ts +45 -6
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/cli-support.js +97 -22
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/driver.js +25 -10
- package/dist/effect-receipt.d.ts +13 -0
- package/dist/effect-receipt.d.ts.map +1 -1
- package/dist/effect-receipt.js +19 -0
- package/dist/graph-detail.d.ts.map +1 -1
- package/dist/graph-detail.js +24 -2
- package/dist/lexicon-module.d.ts +7 -1
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +7 -2
- package/dist/lifecycle/git.d.ts +11 -0
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/git.js +62 -6
- package/dist/lifecycle/no-record.d.ts +59 -0
- package/dist/lifecycle/no-record.d.ts.map +1 -0
- package/dist/lifecycle/no-record.js +88 -0
- package/dist/lifecycle/receipt-plan.d.ts.map +1 -1
- package/dist/lifecycle/receipt-plan.js +4 -2
- package/dist/op/activities/shell.d.ts.map +1 -1
- package/dist/op/activities/shell.js +30 -9
- package/dist/op/emulator-lifecycle.d.ts +23 -0
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/emulator-lifecycle.js +39 -2
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/gate.js +3 -0
- package/dist/op/index.d.ts +1 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/index.js +1 -1
- package/dist/op/local-executor.d.ts +10 -0
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +71 -7
- package/dist/op/op-waves-notify.d.ts +2 -0
- package/dist/op/op-waves-notify.d.ts.map +1 -1
- package/dist/op/op-waves-notify.js +9 -3
- package/dist/op/op-waves-run.d.ts +8 -2
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +36 -11
- package/dist/op/op-waves.d.ts +85 -1
- package/dist/op/op-waves.d.ts.map +1 -1
- package/dist/op/op-waves.js +153 -1
- package/dist/op/receipt-store.d.ts +5 -0
- package/dist/op/receipt-store.d.ts.map +1 -1
- package/dist/op/receipt-store.js +4 -3
- package/dist/op/runtimes/local.d.ts.map +1 -1
- package/dist/op/runtimes/local.js +6 -0
- package/dist/op/step-console.d.ts +65 -0
- package/dist/op/step-console.d.ts.map +1 -0
- package/dist/op/step-console.js +140 -0
- package/dist/op/step-output-ref.d.ts +26 -18
- package/dist/op/step-output-ref.d.ts.map +1 -1
- package/dist/op/step-output-ref.js +86 -63
- package/dist/point-decision.d.ts.map +1 -1
- package/dist/point-decision.js +3 -0
- package/dist/wave-runtime.mjs +239 -239
- package/dist/workspace/agent-cli.d.ts.map +1 -1
- package/dist/workspace/agent-cli.js +3 -0
- package/dist/workspace/compose-graph.d.ts +22 -3
- package/dist/workspace/compose-graph.d.ts.map +1 -1
- package/dist/workspace/compose-graph.js +18 -5
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +16 -1
- package/dist/workspace/conformance/writer.js +1 -1
- package/dist/workspace/decide.d.ts +51 -9
- package/dist/workspace/decide.d.ts.map +1 -1
- package/dist/workspace/decide.js +125 -14
- package/dist/workspace/graph.schema.json +68 -1
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.js +20 -11
- package/dist/workspace/nested-graph.d.ts +1 -1
- package/dist/workspace/nested-graph.d.ts.map +1 -1
- package/dist/workspace/nested-graph.js +5 -1
- package/dist/workspace/point-answer.schema.json +16 -1
- package/dist/workspace/points-cli.d.ts +5 -3
- package/dist/workspace/points-cli.d.ts.map +1 -1
- package/dist/workspace/points-cli.js +16 -7
- package/dist/workspace/points-write.schema.json +39 -4
- package/dist/workspace/points.schema.json +42 -3
- package/dist/workspace/reason-codes.d.ts +2 -1
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +2 -1
- package/dist/workspace/records-cli.d.ts +12 -2
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-cli.js +27 -7
- package/dist/workspace/records-write.d.ts.map +1 -1
- package/dist/workspace/records-write.js +2 -3
- package/dist/workspace/records.d.ts +10 -4
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/records.js +16 -3
- package/dist/workspace/records.schema.json +2 -1
- package/dist/workspace/runs.d.ts.map +1 -1
- package/dist/workspace/runs.js +4 -2
- package/dist/workspace/trust/verify-cli.d.ts.map +1 -1
- package/dist/workspace/trust/verify-cli.js +2 -1
- package/dist/workspace/trust/verify.d.ts +22 -0
- package/dist/workspace/trust/verify.d.ts.map +1 -1
- package/dist/workspace/trust/verify.js +94 -14
- package/dist/workspace/write-scope.d.ts +3 -1
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/workspace/write-scope.js +11 -4
- package/package.json +1 -1
- package/src/ci-jobs.ts +58 -1
- package/src/cli/commands/build.ts +18 -0
- package/src/cli/compiled-cli.e2e.test.ts +45 -1
- package/src/cli/handlers/approve.ts +9 -0
- package/src/cli/handlers/emulator.test.ts +61 -1
- package/src/cli/handlers/emulator.ts +65 -4
- package/src/cli/handlers/promote.test.ts +7 -0
- package/src/cli/handlers/promote.ts +7 -1
- package/src/cli/handlers/run-no-record.e2e.test.ts +87 -0
- package/src/cli/handlers/run-wave.ts +5 -4
- package/src/cli/handlers/run.test.ts +126 -0
- package/src/cli/handlers/run.ts +69 -9
- package/src/cli/main.test.ts +34 -0
- package/src/cli/main.ts +38 -11
- package/src/cli/mcp/workspace-tools.e2e.test.ts +1 -1
- package/src/cli/mcp/workspace-tools.ts +27 -4
- package/src/cli/parse-args.ts +21 -0
- package/src/cli/registry.ts +12 -0
- package/src/components/cli-support.test.ts +75 -0
- package/src/components/cli-support.ts +130 -25
- package/src/components/driver.test.ts +28 -0
- package/src/components/driver.ts +23 -10
- package/src/components/generate-disabled.test.ts +56 -0
- package/src/effect-receipt.ts +22 -0
- package/src/graph-ci-edges.test.ts +50 -0
- package/src/graph-detail.ts +21 -2
- package/src/lexicon-module.ts +9 -2
- package/src/lifecycle/git.ts +61 -6
- package/src/lifecycle/no-record.test.ts +175 -0
- package/src/lifecycle/no-record.ts +108 -0
- package/src/lifecycle/receipt-plan.test.ts +9 -0
- package/src/lifecycle/receipt-plan.ts +4 -1
- package/src/op/activities/shell.ts +28 -6
- package/src/op/effect-step.test.ts +95 -1
- package/src/op/emulator-lifecycle.test.ts +24 -1
- package/src/op/emulator-lifecycle.ts +58 -2
- package/src/op/gate.ts +3 -0
- package/src/op/index.ts +1 -1
- package/src/op/local-executor.test.ts +65 -0
- package/src/op/local-executor.ts +88 -8
- package/src/op/op-waves-jobs.test.ts +213 -0
- package/src/op/op-waves-notify.ts +11 -5
- package/src/op/op-waves-run.ts +42 -11
- package/src/op/op-waves.ts +202 -2
- package/src/op/receipt-store.ts +13 -3
- package/src/op/runtimes/local.ts +6 -0
- package/src/op/step-console.test.ts +150 -0
- package/src/op/step-console.ts +155 -0
- package/src/op/step-output-ref.test.ts +68 -24
- package/src/op/step-output-ref.ts +85 -65
- package/src/point-decision-bundle.test.ts +1 -0
- package/src/point-decision.ts +3 -0
- package/src/workspace/agent-cli.ts +2 -0
- package/src/workspace/compose-graph.test.ts +55 -0
- package/src/workspace/compose-graph.ts +28 -6
- package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +16 -1
- package/src/workspace/conformance/writer.ts +1 -1
- package/src/workspace/decide.test.ts +87 -3
- package/src/workspace/decide.ts +142 -17
- package/src/workspace/graph-contract.test.ts +26 -1
- package/src/workspace/graph.schema.json +68 -1
- package/src/workspace/lineage-upgrade.test.ts +21 -0
- package/src/workspace/lineage-upgrade.ts +19 -11
- package/src/workspace/nested-graph.test.ts +14 -0
- package/src/workspace/nested-graph.ts +7 -2
- package/src/workspace/point-answer.schema.json +16 -1
- package/src/workspace/points-cli.ts +16 -8
- package/src/workspace/points-write.schema.json +39 -4
- package/src/workspace/points.schema.json +42 -3
- package/src/workspace/reason-codes.ts +2 -1
- package/src/workspace/record-assets.test.ts +14 -0
- package/src/workspace/records-cli.ts +28 -7
- package/src/workspace/records-write-commands.e2e.test.ts +32 -0
- package/src/workspace/records-write.ts +2 -3
- package/src/workspace/records.schema.json +2 -1
- package/src/workspace/records.ts +17 -4
- package/src/workspace/runs.ts +4 -2
- package/src/workspace/trust/trust.test.ts +105 -0
- package/src/workspace/trust/verify-cli.ts +2 -1
- package/src/workspace/trust/verify.ts +106 -13
- package/src/workspace/write-scope.test.ts +18 -0
- package/src/workspace/write-scope.ts +16 -5
|
@@ -23,15 +23,20 @@
|
|
|
23
23
|
* Scope, kept deliberately tight (see the issue's "Open questions"):
|
|
24
24
|
* - same-Op only — no cross-Op plumbing (that needs a durable place to put
|
|
25
25
|
* the value, which #1290 explicitly defers).
|
|
26
|
-
* -
|
|
27
|
-
* `
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
26
|
+
* - producers are the top-level activity steps of the main `phases`. A step
|
|
27
|
+
* in `onFailure` or nested inside an `EffectStep` produces nothing another
|
|
28
|
+
* step may reference: an effect's nested steps run only when the receipt
|
|
29
|
+
* comparison mismatches, so a value one of them returns isn't reliably
|
|
30
|
+
* there for anything else (#3948 decision A7, "for now").
|
|
31
|
+
* - consumers are those producers, plus (#3948) every activity step in
|
|
32
|
+
* `onFailure` and every activity step nested inside an effect. An
|
|
33
|
+
* `onFailure` step may reference any main-phase producer. Compensation
|
|
34
|
+
* runs after a failure, so its producer may never have completed; the
|
|
35
|
+
* executor then skips the compensation step and records why (decision
|
|
36
|
+
* A6), rather than calling it with an `undefined` in place of the value.
|
|
37
|
+
* A step nested inside an effect may reference a producer that runs
|
|
38
|
+
* before the effect, and the executor folds the resolved values into the
|
|
39
|
+
* effect's expectation, so a changed value re-fires the effect.
|
|
35
40
|
* - producer must run to completion before the consumer starts: an earlier
|
|
36
41
|
* phase, or an earlier step within the same non-parallel phase. Two
|
|
37
42
|
* steps in the same parallel phase run concurrently (`Promise.all`) with
|
|
@@ -179,20 +184,58 @@ function locateStepOutputRefPath(value, target, path = []) {
|
|
|
179
184
|
}
|
|
180
185
|
return undefined;
|
|
181
186
|
}
|
|
182
|
-
/** Top-level `ActivityStep`s of `phases`, in authored (phase, then step) order
|
|
187
|
+
/** Top-level `ActivityStep`s of `phases`, in authored (phase, then step) order: the producers (see the module doc's scope note). */
|
|
183
188
|
function locateActivitySteps(phases) {
|
|
184
189
|
const locations = [];
|
|
185
190
|
phases.forEach((phase, phaseIndex) => {
|
|
186
|
-
|
|
187
|
-
for (const step of phase.steps) {
|
|
191
|
+
phase.steps.forEach((step, stepIndex) => {
|
|
188
192
|
if (step.kind !== "activity")
|
|
189
|
-
|
|
190
|
-
locations.push({ phaseIndex, stepIndex, parallel: phase.parallel === true, step });
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
+
return;
|
|
194
|
+
locations.push({ phaseIndex, stepIndex, parallel: phase.parallel === true, step, phaseName: phase.name });
|
|
195
|
+
});
|
|
193
196
|
});
|
|
194
197
|
return locations;
|
|
195
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Every activity step that may hold a reference (#3948): the producers, each
|
|
201
|
+
* step nested inside an effect of a main phase, and every activity step of
|
|
202
|
+
* `onFailure`, effect-nested ones included. An `onFailure` step is placed after
|
|
203
|
+
* every main phase, so any main-phase producer precedes it.
|
|
204
|
+
*/
|
|
205
|
+
function locateConsumers(config) {
|
|
206
|
+
const consumers = [];
|
|
207
|
+
const visit = (phases, offset) => {
|
|
208
|
+
phases.forEach((phase, i) => {
|
|
209
|
+
const at = { phaseIndex: offset + i, parallel: phase.parallel === true, phaseName: phase.name };
|
|
210
|
+
phase.steps.forEach((step, stepIndex) => {
|
|
211
|
+
if (step.kind === "activity")
|
|
212
|
+
consumers.push({ ...at, stepIndex, step });
|
|
213
|
+
if (step.kind === "effect") {
|
|
214
|
+
for (const nested of step.steps)
|
|
215
|
+
if (nested.kind === "activity")
|
|
216
|
+
consumers.push({ ...at, stepIndex, step: nested });
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
visit(config.phases, 0);
|
|
222
|
+
visit(config.onFailure ?? [], config.phases.length);
|
|
223
|
+
return consumers;
|
|
224
|
+
}
|
|
225
|
+
/** Ids of the activity steps nested inside an effect, in any phase. Nothing may reference them (#3948 decision A7). */
|
|
226
|
+
function effectNestedIds(config) {
|
|
227
|
+
const ids = new Set();
|
|
228
|
+
for (const phase of [...config.phases, ...(config.onFailure ?? [])]) {
|
|
229
|
+
for (const step of phase.steps) {
|
|
230
|
+
if (step.kind !== "effect")
|
|
231
|
+
continue;
|
|
232
|
+
for (const nested of step.steps)
|
|
233
|
+
if (nested.kind === "activity" && nested.id)
|
|
234
|
+
ids.add(nested.id);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return ids;
|
|
238
|
+
}
|
|
196
239
|
/** True when `producer` is guaranteed to have completed before `consumer` starts. */
|
|
197
240
|
function producerPrecedes(producer, consumer) {
|
|
198
241
|
if (producer.phaseIndex !== consumer.phaseIndex)
|
|
@@ -201,9 +244,6 @@ function producerPrecedes(producer, consumer) {
|
|
|
201
244
|
return false; // same parallel phase — Promise.all, no ordering guarantee
|
|
202
245
|
return producer.stepIndex < consumer.stepIndex;
|
|
203
246
|
}
|
|
204
|
-
function effectNestedActivitySteps(phase) {
|
|
205
|
-
return phase.steps.flatMap((s) => (s.kind === "effect" ? s.steps.filter((n) => n.kind === "activity") : []));
|
|
206
|
-
}
|
|
207
247
|
/** `byId`/`duplicateIds` over an Op's top-level main-phase activity steps — shared by {@link validateStepOutputRefScope} and {@link validateStepOutputRefs}. */
|
|
208
248
|
function indexById(locations) {
|
|
209
249
|
const byId = new Map();
|
|
@@ -230,41 +270,24 @@ function indexById(locations) {
|
|
|
230
270
|
* a public export a caller can invoke directly, bypassing that lint pass —
|
|
231
271
|
* this is its own defense-in-depth.
|
|
232
272
|
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* explicitly here rather than left to fall
|
|
273
|
+
* Consumers are the main-phase activity steps, the steps nested inside an
|
|
274
|
+
* effect, and every `onFailure` activity step (#3948). Flags:
|
|
275
|
+
* - a reference to a step nested inside an effect step, from anywhere
|
|
276
|
+
* (#3948 decision A7) — flagged explicitly here rather than left to fall
|
|
277
|
+
* through as "unknown producer",
|
|
237
278
|
* - a reference to an unregistered step id (no step in scope declares it),
|
|
238
279
|
* - a duplicate step id (ambiguous producer),
|
|
239
280
|
* - a reference to a step that does not precede the referencing step
|
|
240
281
|
* (a later phase, a later step in the same phase, itself, or a step in
|
|
241
|
-
* the same parallel phase).
|
|
282
|
+
* the same parallel phase). A step nested inside an effect takes the
|
|
283
|
+
* effect's position, so it may reference only a step that runs before
|
|
284
|
+
* the effect. An `onFailure` step comes after every main phase.
|
|
242
285
|
*/
|
|
243
286
|
export function validateStepOutputRefScope(config) {
|
|
244
287
|
const issues = [];
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
issues.push({
|
|
249
|
-
opName: config.name,
|
|
250
|
-
phase: phaseName,
|
|
251
|
-
fn: step.fn,
|
|
252
|
-
message: `references step "${ref.step}"'s output, but ${reason}`,
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
};
|
|
257
|
-
for (const phase of config.onFailure ?? []) {
|
|
258
|
-
const steps = phase.steps.filter((s) => s.kind === "activity").concat(effectNestedActivitySteps(phase));
|
|
259
|
-
flagOutOfScope(steps, phase.name, "step-output references are not supported in onFailure compensation phases");
|
|
260
|
-
}
|
|
261
|
-
for (const phase of config.phases) {
|
|
262
|
-
flagOutOfScope(effectNestedActivitySteps(phase), phase.name, "step-output references are not supported for a step nested inside an effect step");
|
|
263
|
-
}
|
|
264
|
-
const locations = locateActivitySteps(config.phases);
|
|
265
|
-
const { byId, duplicateIds } = indexById(locations);
|
|
266
|
-
const phaseNameOf = (loc) => config.phases[loc.phaseIndex].name;
|
|
267
|
-
for (const consumer of locations) {
|
|
288
|
+
const { byId, duplicateIds } = indexById(locateActivitySteps(config.phases));
|
|
289
|
+
const nestedIds = effectNestedIds(config);
|
|
290
|
+
for (const consumer of locateConsumers(config)) {
|
|
268
291
|
const refs = collectStepOutputRefs(consumer.step.args);
|
|
269
292
|
for (const ref of refs) {
|
|
270
293
|
// The run's work lease (#2748) is published under a reserved id once it
|
|
@@ -274,7 +297,7 @@ export function validateStepOutputRefScope(config) {
|
|
|
274
297
|
if (duplicateIds.has(ref.step)) {
|
|
275
298
|
issues.push({
|
|
276
299
|
opName: config.name,
|
|
277
|
-
phase:
|
|
300
|
+
phase: consumer.phaseName,
|
|
278
301
|
fn: consumer.step.fn,
|
|
279
302
|
message: `references step id "${ref.step}", but that id is used by more than one step in this Op — ids must be unique`,
|
|
280
303
|
});
|
|
@@ -284,9 +307,11 @@ export function validateStepOutputRefScope(config) {
|
|
|
284
307
|
if (!producer) {
|
|
285
308
|
issues.push({
|
|
286
309
|
opName: config.name,
|
|
287
|
-
phase:
|
|
310
|
+
phase: consumer.phaseName,
|
|
288
311
|
fn: consumer.step.fn,
|
|
289
|
-
message:
|
|
312
|
+
message: nestedIds.has(ref.step)
|
|
313
|
+
? `references step "${ref.step}", which is nested inside an effect step — a step inside an effect runs only when the effect fires, so no other step can reference its output`
|
|
314
|
+
: `references unknown step id "${ref.step}" — no step in this Op's main phases declares that id`,
|
|
290
315
|
});
|
|
291
316
|
continue;
|
|
292
317
|
}
|
|
@@ -298,7 +323,7 @@ export function validateStepOutputRefScope(config) {
|
|
|
298
323
|
: `step "${ref.step}" does not run before this step`;
|
|
299
324
|
issues.push({
|
|
300
325
|
opName: config.name,
|
|
301
|
-
phase:
|
|
326
|
+
phase: consumer.phaseName,
|
|
302
327
|
fn: consumer.step.fn,
|
|
303
328
|
message: `references ${reason} — a step can only reference an earlier step's output`,
|
|
304
329
|
});
|
|
@@ -308,10 +333,10 @@ export function validateStepOutputRefScope(config) {
|
|
|
308
333
|
return issues;
|
|
309
334
|
}
|
|
310
335
|
/**
|
|
311
|
-
* Validate every step-output reference in an Op
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
336
|
+
* Validate every step-output reference in an Op against a contract map and
|
|
337
|
+
* the Op's own step ordering, over the consumers {@link
|
|
338
|
+
* validateStepOutputRefScope} covers (see the module doc). Layers
|
|
339
|
+
* contract-based checks on top of {@link
|
|
315
340
|
* validateStepOutputRefScope}'s scope/ordering checks.
|
|
316
341
|
*
|
|
317
342
|
* Flags everything {@link validateStepOutputRefScope} does, plus:
|
|
@@ -323,10 +348,8 @@ export function validateStepOutputRefScope(config) {
|
|
|
323
348
|
*/
|
|
324
349
|
export function validateStepOutputRefs(config, contracts) {
|
|
325
350
|
const issues = validateStepOutputRefScope(config);
|
|
326
|
-
const
|
|
327
|
-
const
|
|
328
|
-
const phaseNameOf = (loc) => config.phases[loc.phaseIndex].name;
|
|
329
|
-
for (const consumer of locations) {
|
|
351
|
+
const { byId, duplicateIds } = indexById(locateActivitySteps(config.phases));
|
|
352
|
+
for (const consumer of locateConsumers(config)) {
|
|
330
353
|
const refs = collectStepOutputRefs(consumer.step.args);
|
|
331
354
|
for (const ref of refs) {
|
|
332
355
|
// Already flagged by validateStepOutputRefScope — nothing to validate
|
|
@@ -340,7 +363,7 @@ export function validateStepOutputRefs(config, contracts) {
|
|
|
340
363
|
if (!producerContract) {
|
|
341
364
|
issues.push({
|
|
342
365
|
opName: config.name,
|
|
343
|
-
phase:
|
|
366
|
+
phase: consumer.phaseName,
|
|
344
367
|
fn: consumer.step.fn,
|
|
345
368
|
message: `references step "${ref.step}"'s output, but "${producer.step.fn}" has no registered activity contract to validate the reference against`,
|
|
346
369
|
});
|
|
@@ -349,7 +372,7 @@ export function validateStepOutputRefs(config, contracts) {
|
|
|
349
372
|
if (!producerContract.returns) {
|
|
350
373
|
issues.push({
|
|
351
374
|
opName: config.name,
|
|
352
|
-
phase:
|
|
375
|
+
phase: consumer.phaseName,
|
|
353
376
|
fn: consumer.step.fn,
|
|
354
377
|
message: `references step "${ref.step}"'s output, but "${producer.step.fn}"'s contract declares no return schema`,
|
|
355
378
|
});
|
|
@@ -358,7 +381,7 @@ export function validateStepOutputRefs(config, contracts) {
|
|
|
358
381
|
if (ref.path && !pathExistsInSchema(producerContract.returns, ref.path)) {
|
|
359
382
|
issues.push({
|
|
360
383
|
opName: config.name,
|
|
361
|
-
phase:
|
|
384
|
+
phase: consumer.phaseName,
|
|
362
385
|
fn: consumer.step.fn,
|
|
363
386
|
message: `references step "${ref.step}"'s output path "${ref.path}", which does not exist on "${producer.step.fn}"'s declared return type`,
|
|
364
387
|
});
|
|
@@ -384,7 +407,7 @@ export function validateStepOutputRefs(config, contracts) {
|
|
|
384
407
|
if (consumerKind && producerKind && consumerKind !== producerKind) {
|
|
385
408
|
issues.push({
|
|
386
409
|
opName: config.name,
|
|
387
|
-
phase:
|
|
410
|
+
phase: consumer.phaseName,
|
|
388
411
|
fn: consumer.step.fn,
|
|
389
412
|
message: `references step "${ref.step}"'s output path "${ref.path}" (${producerKind}), but arg "${argPath.join(".")}" on "${consumer.step.fn}" declares ${consumerKind} — type mismatch`,
|
|
390
413
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point-decision.d.ts","sourceRoot":"","sources":["../src/point-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAoB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAExH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAgF,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzK,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"point-decision.d.ts","sourceRoot":"","sources":["../src/point-decision.ts"],"names":[],"mappings":"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"}
|
package/dist/point-decision.js
CHANGED
|
@@ -33,6 +33,7 @@ import { samePlanDigest } from "./lifecycle/plan-digest.js";
|
|
|
33
33
|
import { parseDuration } from "./op/duration.js";
|
|
34
34
|
import { DEFAULT_GATE_POINT_PASS, defaultGatePointStore, gatePointInputs, gateSubject } from "./op/gate-point.js";
|
|
35
35
|
import { resolveGateRunLocator } from "./op/gate-run-locator.js";
|
|
36
|
+
import { refuseGateWithoutRecording } from "./lifecycle/no-record.js";
|
|
36
37
|
export { DEFAULT_GATE_POINT_PASS, GATE_POINT_INPUTS, defaultGatePointStore, gatePointInputs, gatePointOf, gatePointProblems, gateSubject, parseGateSubject, } from "./op/gate-point.js";
|
|
37
38
|
export { isGateRunLocator, resolveGateRunLocator } from "./op/gate-run-locator.js";
|
|
38
39
|
/** Who a resolution written for an answer is by: the people who answered, or the decider that did. */
|
|
@@ -41,6 +42,8 @@ function resolvedByOf(q) {
|
|
|
41
42
|
}
|
|
42
43
|
/** Decide a gate that asks a point: ask it, then record the pending fact or the resolution that cites the answer. */
|
|
43
44
|
export async function evaluatePointGate(port, asker, input) {
|
|
45
|
+
// #3955: refused before the point is asked, which would itself write to the ledger.
|
|
46
|
+
refuseGateWithoutRecording(input.op, input.gate);
|
|
44
47
|
const now = input.now ?? new Date().toISOString();
|
|
45
48
|
const facts = { component: input.op, name: input.gate, env: input.env ?? null, planDigest: input.planDigest ?? null };
|
|
46
49
|
const q = await asker.ask({ point: input.point.name, inputs: input.inputs ?? {}, facts, subject: gateSubject(input.op, input.gate, input.env), ...(input.point.store ? { store: input.point.store } : {}) });
|