@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.2
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/README.md +43 -2
- package/cordis.patch.yml +17 -0
- package/lib/client.js +14708 -0
- package/lib/core.js +137 -0
- package/lib/engine-adapter.js +1387 -0
- package/lib/host-driver.js +298 -0
- package/lib/index.js +536 -0
- package/lib/projection.js +159 -0
- package/lib/registry.js +218 -0
- package/lib/session-records.js +54 -0
- package/lib/submission-commit.js +34 -0
- package/lib/world-driver.js +275 -0
- package/package.json +67 -4
- package/vendor/PROVENANCE.md +9 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.js +95 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-models.js +208 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-names.js +155 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts +63 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/analyze.js +92 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts +21 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/array-methods.js +132 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.js +114 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts +67 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifacts.js +263 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts +42 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/assign.js +287 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/callbacks.js +133 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts +40 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/calls.js +495 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts +25 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.js +161 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts +163 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.js +8 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.js +530 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts +29 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.js +266 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.js +116 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.js +148 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.js +263 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts +110 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.js +162 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts +79 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.js +154 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts +174 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.js +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts +17 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.js +282 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order.js +110 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.js +198 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/classes.js +264 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/constants.js +23 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/control-flow.js +132 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core-json.js +49 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts +194 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core.js +204 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts +269 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/domain.js +523 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.js +350 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts +11 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.js +121 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts +113 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.js +411 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.js +104 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.js +47 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.js +33 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/graph.js +199 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts +48 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.js +0 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts +14 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.js +70 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-id.js +41 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.js +215 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.js +100 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/interpret.js +200 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts +18 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/literals.js +125 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/mermaid.js +477 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts +31 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/patterns.js +94 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.js +334 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts +24 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phases.js +54 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts +52 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.js +123 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts +12 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/relays.js +78 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts +125 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/serialize.js +321 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/site-phases.js +69 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.js +189 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts +267 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites.js +225 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts +254 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/state.js +569 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts +97 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/taint.js +649 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts +100 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/types.js +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts +27 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.js +44 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts +59 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/compile.js +159 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts +3 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.js +64 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts +26 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.js +173 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts +54 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.js +19 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts +28 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.js +35 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts +151 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/concurrency.js +282 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts +17 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.js +29 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts +55 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.js +367 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts +90 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-config.js +6 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts +116 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-holes.js +142 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts +34 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-launch.js +26 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.js +74 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts +27 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-report.js +151 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts +18 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-resume.js +38 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts +30 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.js +79 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts +99 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-state.js +13 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts +36 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-world.js +189 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts +263 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine.js +602 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts +87 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/errors.js +56 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.js +15 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts +16 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash.js +48 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.js +6 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts +127 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache.js +244 -0
- package/vendor/dynamic-workflow/engine/index.d.ts +11 -0
- package/vendor/dynamic-workflow/engine/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/index.js +10 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts +32 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-memory.js +243 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts +72 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.js +28 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts +20 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/persona.js +43 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/replay-order.js +229 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/run-terminal.js +7 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts +22 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.js +84 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts +105 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.js +17 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts +113 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler.js +484 -0
- package/vendor/dynamic-workflow/engine/types.d.ts +979 -0
- package/vendor/dynamic-workflow/engine/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/types.js +26 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/world-read-input.js +55 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts +48 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.js +47 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-hole.js +26 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts +11 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-model.js +18 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts +15 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-stream.js +41 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts +29 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts.js +324 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts +218 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/registry.js +203 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts +40 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/report-caps.js +39 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts +37 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.js +36 -0
- package/vendor/dynamic-workflow/index.d.ts +41 -0
- package/vendor/dynamic-workflow/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/index.js +51 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts +2 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/index.js +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.js +63 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts +82 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower.js +333 -0
- package/vendor/dynamic-workflow/projections.d.ts +26 -0
- package/vendor/dynamic-workflow/projections.d.ts.map +1 -0
- package/vendor/dynamic-workflow/projections.js +23 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts +49 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.js +69 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts +55 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/emit.js +325 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts +10 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/jsdoc.js +83 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts +8 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/serialize.js +20 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts +48 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/synthesize.js +138 -0
- package/vendor/dynamic-workflow/schema/types.d.ts +67 -0
- package/vendor/dynamic-workflow/schema/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/types.js +18 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts +15 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/validate.js +213 -0
- package/vendor/dynamic-workflow/testing/index.d.ts +6 -0
- package/vendor/dynamic-workflow/testing/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/index.js +5 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.js +195 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.js +163 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.js +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.js +46 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.js +234 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts +11 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.js +281 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.js +396 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.js +82 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts +15 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract.js +31 -0
- package/vendor/dynamic-workflow-runtime/child-cell-streams.js +128 -0
- package/vendor/dynamic-workflow-runtime/child-entry-file.js +43 -0
- package/vendor/dynamic-workflow-runtime/child-source.js +299 -0
- package/vendor/dynamic-workflow-runtime/harness.js +302 -0
- package/vendor/dynamic-workflow-runtime/index.js +4 -0
- package/vendor/dynamic-workflow-runtime/protocol.js +2 -0
- package/vendor/mcode-host/dynamic-workflow-import.js +269 -0
- package/vendor/mcode-host/workflow-git-world-read.js +183 -0
- package/vendor/mcode-host/workflow-world-read.js +282 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { isGlobalLibValue } from "./callbacks.js";
|
|
3
|
+
import { boundIdentifiers } from "./causality-order-functions.js";
|
|
4
|
+
/** The frame a fresh settle lands in: the innermost open one. */
|
|
5
|
+
export function currentFrame(state) {
|
|
6
|
+
return state.frames[state.frames.length - 1];
|
|
7
|
+
}
|
|
8
|
+
/** True iff some frame on the stack has settled `step` — the freshness test. */
|
|
9
|
+
export function isVisiblySettled(state, step) {
|
|
10
|
+
return state.frames.some((frame) => frame.settled.has(step));
|
|
11
|
+
}
|
|
12
|
+
/** The strand an `issue` belongs to: the innermost one still being walked. */
|
|
13
|
+
export function innermostOpenStrand(state) {
|
|
14
|
+
for (let i = state.strands.length - 1; i >= 0; i -= 1) {
|
|
15
|
+
const record = state.strands[i];
|
|
16
|
+
if (!record.closed)
|
|
17
|
+
return record;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
/** Spawn a strand on `region`: record it and push its frame. */
|
|
22
|
+
export function openStrand(state, region) {
|
|
23
|
+
const record = {
|
|
24
|
+
at: state.strands.length,
|
|
25
|
+
closed: false,
|
|
26
|
+
issued: new Set(),
|
|
27
|
+
region,
|
|
28
|
+
summary: new Set(),
|
|
29
|
+
};
|
|
30
|
+
state.strands.push(record);
|
|
31
|
+
state.frames.push({ region, settled: new Set() });
|
|
32
|
+
return record;
|
|
33
|
+
}
|
|
34
|
+
/** Close a strand: pop its frame and keep what it awaited as the strand's summary. */
|
|
35
|
+
export function closeStrand(state, record) {
|
|
36
|
+
const frame = state.frames.pop();
|
|
37
|
+
record.summary = frame?.settled ?? new Set();
|
|
38
|
+
record.closed = true;
|
|
39
|
+
}
|
|
40
|
+
/** The walk's strand counter: the mark a caller takes before evaluating an expression. */
|
|
41
|
+
export function strandMark(state) {
|
|
42
|
+
return state.strands.length;
|
|
43
|
+
}
|
|
44
|
+
/** Strand regions spawned at or after `mark`, in spawn order. */
|
|
45
|
+
export function strandsSince(state, mark) {
|
|
46
|
+
return state.strands.filter((record) => record.at >= mark).map((record) => record.region);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Bind strand regions to the identifiers a declaration or assignment introduces — the
|
|
50
|
+
* syntactic half of the join, the exact shape `bindSteps` gives steps and for the same
|
|
51
|
+
* reason: `const work = ids.map(async …)` issues nothing at the declaration, so only the
|
|
52
|
+
* binding can tell a later `await Promise.all(work)` which strands `work` stands for.
|
|
53
|
+
*/
|
|
54
|
+
export function bindStrands(state, name, regions) {
|
|
55
|
+
if (regions.length === 0)
|
|
56
|
+
return;
|
|
57
|
+
for (const identifier of boundIdentifiers(name)) {
|
|
58
|
+
const symbol = state.checker.getSymbolAtLocation(identifier);
|
|
59
|
+
if (symbol === undefined)
|
|
60
|
+
continue;
|
|
61
|
+
const set = state.strandsBySymbol.get(symbol) ?? new Set();
|
|
62
|
+
for (const region of regions)
|
|
63
|
+
set.add(region);
|
|
64
|
+
state.strandsBySymbol.set(symbol, set);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** True iff the applied function carries the `async` modifier — what makes a body a strand. */
|
|
68
|
+
export function isAsyncFunction(decl) {
|
|
69
|
+
const { modifiers } = decl;
|
|
70
|
+
return modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) ?? false;
|
|
71
|
+
}
|
|
72
|
+
/** The promise combinators that adopt each argument, so each argument is an awaited position. */
|
|
73
|
+
const COMBINATORS = new Set(["all", "allSettled", "race", "any"]);
|
|
74
|
+
function isPromiseCombinator(state, node) {
|
|
75
|
+
const callee = node.expression;
|
|
76
|
+
if (!ts.isPropertyAccessExpression(callee) || !COMBINATORS.has(callee.name.text))
|
|
77
|
+
return false;
|
|
78
|
+
return isGlobalLibValue(callee.expression, "Promise", state.checker, state.program);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The identifiers in an AWAITED POSITION of an awaited expression: the operand itself,
|
|
82
|
+
* each argument of `Promise.all` / `allSettled` / `race` / `any`, each element of an array
|
|
83
|
+
* literal, a spread's operand, and through parentheses and type assertions. Every other
|
|
84
|
+
* expression is OPAQUE — this mirrors how the runtime adopts promises, and it is what
|
|
85
|
+
* keeps `await f(aWork.length)` from joining the strands `aWork` holds.
|
|
86
|
+
*/
|
|
87
|
+
function awaitedIdentifiers(state, operand) {
|
|
88
|
+
const out = [];
|
|
89
|
+
const scan = (node) => {
|
|
90
|
+
if (ts.isParenthesizedExpression(node) ||
|
|
91
|
+
ts.isAsExpression(node) ||
|
|
92
|
+
ts.isSatisfiesExpression(node) ||
|
|
93
|
+
ts.isNonNullExpression(node) ||
|
|
94
|
+
ts.isSpreadElement(node)) {
|
|
95
|
+
scan(node.expression);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (ts.isIdentifier(node)) {
|
|
99
|
+
out.push(node);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (ts.isArrayLiteralExpression(node)) {
|
|
103
|
+
for (const element of node.elements)
|
|
104
|
+
scan(element);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (ts.isCallExpression(node) && isPromiseCombinator(state, node)) {
|
|
108
|
+
for (const argument of node.arguments)
|
|
109
|
+
scan(argument);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
scan(operand);
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The strands a barrier waits for, split by the certainty each one's summary settles with,
|
|
117
|
+
* and MARKED JOINED so a second await of the same promise adds nothing (exactly as a
|
|
118
|
+
* second settle of one step already does).
|
|
119
|
+
*
|
|
120
|
+
* Two ways in. SYNTACTIC — spawned while the operand was evaluated, or bound to an
|
|
121
|
+
* identifier in an awaited position of it — settles the summary certainly: the await
|
|
122
|
+
* provably waits for that activation. LIFTED — a closed, not-yet-joined strand one of whose
|
|
123
|
+
* issued steps this barrier claims — settles it with the certainty the claim came in with:
|
|
124
|
+
* the promise reached the await through a container or a helper, and all we know is that
|
|
125
|
+
* something the strand issued has settled.
|
|
126
|
+
*/
|
|
127
|
+
export function joinStrands(state, certain, maybe, awaited) {
|
|
128
|
+
const joins = { certain: [], maybe: [] };
|
|
129
|
+
const take = (region, side) => {
|
|
130
|
+
if (state.joined.has(region))
|
|
131
|
+
return;
|
|
132
|
+
state.joined.add(region);
|
|
133
|
+
side.push(region);
|
|
134
|
+
};
|
|
135
|
+
if (awaited !== undefined) {
|
|
136
|
+
for (const region of strandsSince(state, awaited.mark))
|
|
137
|
+
take(region, joins.certain);
|
|
138
|
+
for (const identifier of awaitedIdentifiers(state, awaited.operand)) {
|
|
139
|
+
const symbol = state.checker.getSymbolAtLocation(identifier);
|
|
140
|
+
const bound = symbol === undefined ? undefined : state.strandsBySymbol.get(symbol);
|
|
141
|
+
for (const region of bound ?? [])
|
|
142
|
+
take(region, joins.certain);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const record of state.strands) {
|
|
146
|
+
if (!record.closed || state.joined.has(record.region))
|
|
147
|
+
continue;
|
|
148
|
+
if (certain.some((step) => record.issued.has(step)))
|
|
149
|
+
take(record.region, joins.certain);
|
|
150
|
+
else if (maybe.some((step) => record.issued.has(step)))
|
|
151
|
+
take(record.region, joins.maybe);
|
|
152
|
+
}
|
|
153
|
+
return joins;
|
|
154
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import type ts from "typescript";
|
|
2
|
+
import type { ScriptLoc } from "../compiler/compile.js";
|
|
3
|
+
import type { TaintOcc } from "./domain.js";
|
|
4
|
+
import type { ApplicationVia } from "./state.js";
|
|
5
|
+
import type { JumpKind, TraceRegionKind } from "./constants.js";
|
|
6
|
+
/**
|
|
7
|
+
* The taint facts this walk reads, narrowed to the two members it actually uses so the
|
|
8
|
+
* ordering pass does not depend on the whole emission surface. Produced by
|
|
9
|
+
* `TaintState.emitOracle` off the CONVERGED interpreter state (interpret.ts).
|
|
10
|
+
* Both maps are keyed by `node.getStart(scriptFile)`.
|
|
11
|
+
*/
|
|
12
|
+
export interface OrderOracle {
|
|
13
|
+
/** Step occurrences the operand of each `await` carries. */
|
|
14
|
+
awaitSettles: Map<number, TaintOcc[]>;
|
|
15
|
+
/** Step occurrences each guard expression reads. */
|
|
16
|
+
guardReads: Map<number, TaintOcc[]>;
|
|
17
|
+
/**
|
|
18
|
+
* The call oracle: per call / `new` / tagged-template node, the script functions the
|
|
19
|
+
* interpreter applied there and how (`TaintState.applications`). The walk inlines exactly
|
|
20
|
+
* these bodies at exactly these sites.
|
|
21
|
+
*/
|
|
22
|
+
applications: ReadonlyMap<ts.Node, ReadonlyMap<ts.Node, ApplicationVia>>;
|
|
23
|
+
}
|
|
24
|
+
export interface OrderRegion {
|
|
25
|
+
id: string;
|
|
26
|
+
kind: TraceRegionKind;
|
|
27
|
+
parent?: string;
|
|
28
|
+
loc?: ScriptLoc;
|
|
29
|
+
/** Derivable literal round count of a `for` loop; model-only (never displayed). */
|
|
30
|
+
bound?: number;
|
|
31
|
+
/** fanout: the iterated expression; loop: the recursive helper's name; call: the helper's name. */
|
|
32
|
+
label?: string;
|
|
33
|
+
/**
|
|
34
|
+
* True iff running the parent provably runs this region's body at least once: a
|
|
35
|
+
* `do…while` body, a `for` whose literal bound is positive, or an inlined call.
|
|
36
|
+
* Drives the certainty carve-out.
|
|
37
|
+
*/
|
|
38
|
+
entered: boolean;
|
|
39
|
+
/** choice: one arm MUST run (if/else, ternary, switch with default). Absent = skippable. */
|
|
40
|
+
exhaustive?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* loop: a recursion SCC folded into a loop, not a loop statement. Only re-entrant calls
|
|
43
|
+
* (`recur` jumps) close it; its body completing normally is the helper returning.
|
|
44
|
+
*/
|
|
45
|
+
recursive?: boolean;
|
|
46
|
+
/** choice: an arm completing normally continues into the next arm (switch). */
|
|
47
|
+
fallthrough?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* branch: a never-called function body the end-of-walk sweep placed here. It runs at
|
|
50
|
+
* an unknown point, if at all; its position in the stream is an artifact of the sweep.
|
|
51
|
+
*/
|
|
52
|
+
detached?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* `call` / `fanout` only: this region is a STRAND — one asynchronous activation that
|
|
55
|
+
* runs alongside the body that spawned it (an inlined `async` body, or a deferred
|
|
56
|
+
* callback). Its `await`s suspend the strand, never the spawner, so the walk gives it a
|
|
57
|
+
* settled set of its own and the spawner learns of its completion only by awaiting its
|
|
58
|
+
* promise ({@link SettleEvent.joins}).
|
|
59
|
+
*/
|
|
60
|
+
strand?: true;
|
|
61
|
+
}
|
|
62
|
+
/** A phase the walk reached: `phase#N` numbered by FIRST REACH of a new name. */
|
|
63
|
+
export interface PhaseInfo {
|
|
64
|
+
id: string;
|
|
65
|
+
/** The author's verbatim word. Always present — a nameless marker never mints a phase. */
|
|
66
|
+
name: string;
|
|
67
|
+
/** The first marker that minted this phase; later same-name markers do not move it. */
|
|
68
|
+
loc: ScriptLoc;
|
|
69
|
+
/**
|
|
70
|
+
* The filled hole whose body wrote this phase (docs/analysis.md「Sites」): a marker or a hole
|
|
71
|
+
* (open or filled) inside a body carries the innermost enclosing filled hole's id. Absent
|
|
72
|
+
* outside every fill — a top-level hole's own phase has none.
|
|
73
|
+
*/
|
|
74
|
+
fill?: string;
|
|
75
|
+
}
|
|
76
|
+
/** A step's request was sent (the facade call expression was evaluated). */
|
|
77
|
+
export interface IssueEvent {
|
|
78
|
+
at: "issue";
|
|
79
|
+
step: string;
|
|
80
|
+
regions: readonly string[];
|
|
81
|
+
/**
|
|
82
|
+
* The phase current where the call was evaluated — {@link UNPHASED_ID} outside every
|
|
83
|
+
* marker's extent. Issue is the step's identity moment, so this is the whole of phase
|
|
84
|
+
* membership.
|
|
85
|
+
*/
|
|
86
|
+
phase: string;
|
|
87
|
+
}
|
|
88
|
+
/** An `await` barrier: these steps' promises are known to have settled here. */
|
|
89
|
+
export interface SettleEvent {
|
|
90
|
+
at: "settle";
|
|
91
|
+
/**
|
|
92
|
+
* EMPTY when the barrier only joined strands: awaiting a strand whose summary is
|
|
93
|
+
* already settled (or empty) settles nothing new, but the join itself is a control-flow
|
|
94
|
+
* fact — it is where the strand's parked exits reconnect — so the event is still
|
|
95
|
+
* recorded. Readers iterate `steps` and see nothing; readers of {@link joins} see the
|
|
96
|
+
* join. `maybe` is meaningless on such an event and is written `false`.
|
|
97
|
+
*/
|
|
98
|
+
steps: readonly string[];
|
|
99
|
+
/**
|
|
100
|
+
* True when this settle is a MAY-claim rather than a certainty. Two sources: the
|
|
101
|
+
* barrier widened (nothing resolvable settled here, so everything in flight is assumed
|
|
102
|
+
* to have), or the oracle's witness set was ambiguous — several witnesses, of which
|
|
103
|
+
* exactly one settles at runtime, or a single inexact one smeared through a container.
|
|
104
|
+
*/
|
|
105
|
+
maybe: boolean;
|
|
106
|
+
/** Region chain the barrier sits in — a loop's carry edge needs to know. */
|
|
107
|
+
regions: readonly string[];
|
|
108
|
+
/**
|
|
109
|
+
* The STRAND regions this barrier waits for, in join order: the strands whose promises
|
|
110
|
+
* the awaited expression names (spawned while it was evaluated, or bound to an
|
|
111
|
+
* identifier in an awaited position) plus the ones lifted because a settled step was
|
|
112
|
+
* issued inside them. A strand joins once — a second await of the same promise lists
|
|
113
|
+
* nothing. Absent when the barrier joins no strand.
|
|
114
|
+
*/
|
|
115
|
+
joins?: string[];
|
|
116
|
+
}
|
|
117
|
+
/** An `agent()` call was evaluated — the lane's creation point, for family depth. */
|
|
118
|
+
export interface ActorEvent {
|
|
119
|
+
at: "actor";
|
|
120
|
+
actor: string;
|
|
121
|
+
regions: readonly string[];
|
|
122
|
+
/**
|
|
123
|
+
* The phase current where the call was evaluated, as on {@link IssueEvent}: a lane's birth
|
|
124
|
+
* phase for the engine's lexical stamp (`collectSitePhases`). Not rendered in the core's
|
|
125
|
+
* text form — the `spawn` line predates it and the site-phase table has its own tests.
|
|
126
|
+
*/
|
|
127
|
+
phase: string;
|
|
128
|
+
}
|
|
129
|
+
/** A `phase("…")` marker statement was evaluated: the current phase switched to `phase`. */
|
|
130
|
+
export interface MarkEvent {
|
|
131
|
+
at: "mark";
|
|
132
|
+
/** The phase current from here to the end of the enclosing statement list. */
|
|
133
|
+
phase: string;
|
|
134
|
+
regions: readonly string[];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* An unstructured transfer of control, with its target already resolved to a region id so
|
|
138
|
+
* projections never touch the AST: `continue`/`break` name the `loop` (or, for a `break`
|
|
139
|
+
* inside a switch, the `choice`); `return` names the enclosing `call` / `fanout` /
|
|
140
|
+
* detached body, else the root; `throw` names the enclosing `attempt`, else the root
|
|
141
|
+
* (uncaught); `recur` is a recursive call cut at re-entry, naming the SCC's `loop`.
|
|
142
|
+
*/
|
|
143
|
+
export interface JumpEvent {
|
|
144
|
+
at: "jump";
|
|
145
|
+
kind: JumpKind;
|
|
146
|
+
target: string;
|
|
147
|
+
regions: readonly string[];
|
|
148
|
+
/** The phase current where the jump was evaluated (a phase CFG edge leaves from here). */
|
|
149
|
+
phase: string;
|
|
150
|
+
}
|
|
151
|
+
export type OrderEvent = IssueEvent | SettleEvent | ActorEvent | MarkEvent | JumpEvent;
|
|
152
|
+
/** `controllers`' answers decide whether the steps inside `region` are issued. */
|
|
153
|
+
export interface ControlFact {
|
|
154
|
+
/** Controllers the analysis is sure of: a syntactic witness, or a singleton-exact one. */
|
|
155
|
+
controllers: readonly string[];
|
|
156
|
+
/** Controllers only the ambiguous half of the oracle claims; disjoint from the above. */
|
|
157
|
+
maybeControllers: readonly string[];
|
|
158
|
+
region: string;
|
|
159
|
+
}
|
|
160
|
+
export interface OrderTrace {
|
|
161
|
+
events: OrderEvent[];
|
|
162
|
+
regions: OrderRegion[];
|
|
163
|
+
controls: ControlFact[];
|
|
164
|
+
/** The root `seq` region id; every other region descends from it. */
|
|
165
|
+
root: string;
|
|
166
|
+
/**
|
|
167
|
+
* Phases the walk reached, in first-reach order. Empty for a script with no markers,
|
|
168
|
+
* which is what makes the whole phase vocabulary absent downstream. {@link UNPHASED_ID}
|
|
169
|
+
* is NOT listed here — it is synthetic, and the projection adds it only if it has
|
|
170
|
+
* members.
|
|
171
|
+
*/
|
|
172
|
+
phases: PhaseInfo[];
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=causality-order-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causality-order-types.d.ts","sourceRoot":"","sources":["../../src/analysis/causality-order-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { type TraceState } from "./causality-order-state.js";
|
|
3
|
+
/**
|
|
4
|
+
* Walk a statement list in order, threading the current phase with REST-OF-BLOCK
|
|
5
|
+
* extent: a marker statement re-points the local, every later statement in the list
|
|
6
|
+
* (and everything nested under it, inlined helper bodies included) inherits it, and the
|
|
7
|
+
* list's end restores what was current on entry. There is no other phase mechanism —
|
|
8
|
+
* every construct that holds a statement list routes through here.
|
|
9
|
+
*
|
|
10
|
+
* A marker NOT in a statement list (`if (x) phase("a");` without braces) is therefore
|
|
11
|
+
* inert: it has no rest-of-list to claim, which is the same "no effect, no diagnostic"
|
|
12
|
+
* status assigned to a marker at the tail of its block.
|
|
13
|
+
*/
|
|
14
|
+
export declare function walkStatements(state: TraceState, statements: readonly ts.Statement[], chain: readonly string[]): void;
|
|
15
|
+
/** The node visitor: one evaluation-order step over `node`. Bound as `state.walk`. */
|
|
16
|
+
export declare function walkNode(state: TraceState, node: ts.Node, chain: readonly string[]): void;
|
|
17
|
+
//# sourceMappingURL=causality-order-walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causality-order-walk.d.ts","sourceRoot":"","sources":["../../src/analysis/causality-order-walk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,4BAA4B,CAAC;AA+CpC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,EACnC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,IAAI,CAiBN;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CA0NzF"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { isFunctionLike } from "./sites.js";
|
|
3
|
+
import { applyAt, walkCall } from "./causality-order-calls.js";
|
|
4
|
+
import { walkLoop } from "./causality-order-loops.js";
|
|
5
|
+
import { innermost, issuesSince, jump, locOf, openRegion, phaseIdOf, } from "./causality-order-state.js";
|
|
6
|
+
import { barrier, bindSteps, recordControl, settlesAt } from "./causality-order-settle.js";
|
|
7
|
+
import { bindStrands, strandMark, strandsSince } from "./causality-order-strands.js";
|
|
8
|
+
// causality-order.ts 顶到 oxlint max-lines 上限(400 行),把节点访问器本体
|
|
9
|
+
// (语句表走查、await / 赋值 / 短路 / 分支 / switch / try / 跳转的分支)拆到本文件;循环与
|
|
10
|
+
// 调用两组各在同名兄弟模块。公开面仍从 causality-order.ts 导出。if 链的判定顺序与原文件
|
|
11
|
+
// 逐字一致:`walkLoop` 占原来四个循环分支的位置,之后才落到 forEachChild 兜底。
|
|
12
|
+
/** Open a guarded `branch` region and record its control dependence, if any. */
|
|
13
|
+
function guarded(state, guard, node, chain) {
|
|
14
|
+
const id = openRegion(state, "branch", innermost(state, chain), {
|
|
15
|
+
entered: false,
|
|
16
|
+
loc: locOf(state, node),
|
|
17
|
+
});
|
|
18
|
+
if (guard !== undefined)
|
|
19
|
+
recordControl(state, guard, id);
|
|
20
|
+
return [...chain, id];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The region a `break` / `continue` transfers to. Labeled: the labeled statement's own
|
|
24
|
+
* region (a label on a plain block has none — such a jump is dropped, which reads as
|
|
25
|
+
* fall-through; no corpus fixture does this). Unlabeled: the nearest enclosing loop, or
|
|
26
|
+
* for `break` the nearest loop OR switch. Never crosses a function boundary — the
|
|
27
|
+
* language does not let it either.
|
|
28
|
+
*/
|
|
29
|
+
function jumpTargetOf(state, node) {
|
|
30
|
+
const { regionByStatement } = state;
|
|
31
|
+
const isBreak = ts.isBreakStatement(node);
|
|
32
|
+
for (let cur = node.parent; cur !== undefined && !isFunctionLike(cur); cur = cur.parent) {
|
|
33
|
+
if (node.label !== undefined) {
|
|
34
|
+
if (ts.isLabeledStatement(cur) && cur.label.text === node.label.text) {
|
|
35
|
+
return regionByStatement.get(cur.statement);
|
|
36
|
+
}
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (ts.isIterationStatement(cur, false))
|
|
40
|
+
return regionByStatement.get(cur);
|
|
41
|
+
if (isBreak && ts.isSwitchStatement(cur))
|
|
42
|
+
return regionByStatement.get(cur);
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Walk a statement list in order, threading the current phase with REST-OF-BLOCK
|
|
48
|
+
* extent: a marker statement re-points the local, every later statement in the list
|
|
49
|
+
* (and everything nested under it, inlined helper bodies included) inherits it, and the
|
|
50
|
+
* list's end restores what was current on entry. There is no other phase mechanism —
|
|
51
|
+
* every construct that holds a statement list routes through here.
|
|
52
|
+
*
|
|
53
|
+
* A marker NOT in a statement list (`if (x) phase("a");` without braces) is therefore
|
|
54
|
+
* inert: it has no rest-of-list to claim, which is the same "no effect, no diagnostic"
|
|
55
|
+
* status assigned to a marker at the tail of its block.
|
|
56
|
+
*/
|
|
57
|
+
export function walkStatements(state, statements, chain) {
|
|
58
|
+
const outer = state.currentPhase;
|
|
59
|
+
for (const statement of statements) {
|
|
60
|
+
const marker = state.markerByStatement.get(statement);
|
|
61
|
+
if (marker !== undefined) {
|
|
62
|
+
const id = phaseIdOf(state, marker);
|
|
63
|
+
if (id !== undefined) {
|
|
64
|
+
state.currentPhase = id;
|
|
65
|
+
// The marker is a leaf of its own: a phase with no step is still a position
|
|
66
|
+
// control passes through (control-flow projection); phase MEMBERSHIP stays on
|
|
67
|
+
// issue events and does not read this.
|
|
68
|
+
state.events.push({ at: "mark", phase: id, regions: chain });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
state.walk(statement, chain);
|
|
72
|
+
}
|
|
73
|
+
state.currentPhase = outer;
|
|
74
|
+
}
|
|
75
|
+
/** The node visitor: one evaluation-order step over `node`. Bound as `state.walk`. */
|
|
76
|
+
export function walkNode(state, node, chain) {
|
|
77
|
+
const { events, regionByStatement, returnTargets, root, scriptFile, throwTargets, walk } = state;
|
|
78
|
+
// A function body runs when it is called, not where it is written; call sites
|
|
79
|
+
// inline it (see `applyAt` / `inlineBody`), and never-called bodies are swept up at the end.
|
|
80
|
+
if (isFunctionLike(node)) {
|
|
81
|
+
// Bug: the body is deferred, but a COMPUTED MEMBER NAME is not — `{ [await
|
|
82
|
+
// agent(..).ask(..)]() {} }` evaluates the key where it is written, at object
|
|
83
|
+
// construction. Bailing on the whole node left that ask unreached by the walk, so
|
|
84
|
+
// it fell through to the terminal synthetic issue and got a position at the very
|
|
85
|
+
// END of the script. A real forward edge out of it then looked like a back edge
|
|
86
|
+
// and was retyped `carry` (see emission-graph-computed-method-name-obj).
|
|
87
|
+
const { name } = node;
|
|
88
|
+
if (name !== undefined && ts.isComputedPropertyName(name))
|
|
89
|
+
walk(name.expression, chain);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (ts.isBlock(node)) {
|
|
93
|
+
// Ordering-wise identical to the `forEachChild` fallthrough; routed here so a
|
|
94
|
+
// marker's extent ends with the block (function bodies included).
|
|
95
|
+
walkStatements(state, node.statements, chain);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (ts.isAwaitExpression(node)) {
|
|
99
|
+
const mark = events.length;
|
|
100
|
+
const spawned = strandMark(state);
|
|
101
|
+
walk(node.expression, chain);
|
|
102
|
+
// The syntactic half (steps issued while evaluating the operand) is certain; the
|
|
103
|
+
// oracle adds whatever labels the awaited VALUE carries. The operand goes to the
|
|
104
|
+
// barrier as well: it is where the STRANDS this await joins are named.
|
|
105
|
+
const claim = settlesAt(state, node, node.getStart(scriptFile));
|
|
106
|
+
barrier(state, [...issuesSince(state, mark), ...claim.certain], claim.maybe, chain, {
|
|
107
|
+
mark: spawned,
|
|
108
|
+
operand: node.expression,
|
|
109
|
+
});
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (ts.isCallExpression(node)) {
|
|
113
|
+
walkCall(state, node, chain);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// `new C(args)` applies C's constructor (a script class) or a library constructor's
|
|
117
|
+
// callbacks (`new Promise(executor)`); a tagged template is the call `tag(strings, …)`.
|
|
118
|
+
// Both evaluate their operands first, then apply whatever the oracle recorded there.
|
|
119
|
+
if (ts.isNewExpression(node)) {
|
|
120
|
+
walk(node.expression, chain);
|
|
121
|
+
for (const argument of node.arguments ?? [])
|
|
122
|
+
walk(argument, chain);
|
|
123
|
+
applyAt(state, node, chain);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (ts.isTaggedTemplateExpression(node)) {
|
|
127
|
+
walk(node.tag, chain);
|
|
128
|
+
walk(node.template, chain);
|
|
129
|
+
applyAt(state, node, chain);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (ts.isVariableDeclaration(node)) {
|
|
133
|
+
if (node.initializer !== undefined) {
|
|
134
|
+
const mark = events.length;
|
|
135
|
+
const spawned = strandMark(state);
|
|
136
|
+
walk(node.initializer, chain);
|
|
137
|
+
bindSteps(state, node.name, issuesSince(state, mark));
|
|
138
|
+
bindStrands(state, node.name, strandsSince(state, spawned));
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (ts.isBinaryExpression(node)) {
|
|
143
|
+
const operator = node.operatorToken.kind;
|
|
144
|
+
if (operator === ts.SyntaxKind.AmpersandAmpersandToken ||
|
|
145
|
+
operator === ts.SyntaxKind.BarBarToken ||
|
|
146
|
+
operator === ts.SyntaxKind.QuestionQuestionToken) {
|
|
147
|
+
// Short-circuit: the right operand is guarded by the left — a one-arm, skippable
|
|
148
|
+
// choice.
|
|
149
|
+
walk(node.left, chain);
|
|
150
|
+
const choice = [
|
|
151
|
+
...chain,
|
|
152
|
+
openRegion(state, "choice", innermost(state, chain), {
|
|
153
|
+
entered: true,
|
|
154
|
+
loc: locOf(state, node),
|
|
155
|
+
}),
|
|
156
|
+
];
|
|
157
|
+
walk(node.right, guarded(state, node.left, node.right, choice));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (operator === ts.SyntaxKind.EqualsToken) {
|
|
161
|
+
const mark = events.length;
|
|
162
|
+
const spawned = strandMark(state);
|
|
163
|
+
walk(node.right, chain);
|
|
164
|
+
if (ts.isIdentifier(node.left)) {
|
|
165
|
+
bindSteps(state, node.left, issuesSince(state, mark));
|
|
166
|
+
bindStrands(state, node.left, strandsSince(state, spawned));
|
|
167
|
+
}
|
|
168
|
+
walk(node.left, chain);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
walk(node.left, chain);
|
|
172
|
+
walk(node.right, chain);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Branching constructs open a `choice` group whose arms are the guarded `branch`
|
|
176
|
+
// regions. The group records what the arms alone cannot: whether one of them MUST run
|
|
177
|
+
// (`exhaustive`) and whether an arm falls into the next (`fallthrough`, switch only).
|
|
178
|
+
if (ts.isConditionalExpression(node)) {
|
|
179
|
+
walk(node.condition, chain);
|
|
180
|
+
const choice = [
|
|
181
|
+
...chain,
|
|
182
|
+
openRegion(state, "choice", innermost(state, chain), {
|
|
183
|
+
entered: true,
|
|
184
|
+
exhaustive: true,
|
|
185
|
+
loc: locOf(state, node),
|
|
186
|
+
}),
|
|
187
|
+
];
|
|
188
|
+
walk(node.whenTrue, guarded(state, node.condition, node.whenTrue, choice));
|
|
189
|
+
walk(node.whenFalse, guarded(state, node.condition, node.whenFalse, choice));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (ts.isIfStatement(node)) {
|
|
193
|
+
walk(node.expression, chain);
|
|
194
|
+
const choice = [
|
|
195
|
+
...chain,
|
|
196
|
+
openRegion(state, "choice", innermost(state, chain), {
|
|
197
|
+
entered: true,
|
|
198
|
+
loc: locOf(state, node),
|
|
199
|
+
...(node.elseStatement === undefined ? {} : { exhaustive: true }),
|
|
200
|
+
}),
|
|
201
|
+
];
|
|
202
|
+
walk(node.thenStatement, guarded(state, node.expression, node.thenStatement, choice));
|
|
203
|
+
if (node.elseStatement !== undefined) {
|
|
204
|
+
walk(node.elseStatement, guarded(state, node.expression, node.elseStatement, choice));
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (ts.isSwitchStatement(node)) {
|
|
209
|
+
walk(node.expression, chain);
|
|
210
|
+
const clauses = node.caseBlock.clauses;
|
|
211
|
+
const id = openRegion(state, "choice", innermost(state, chain), {
|
|
212
|
+
entered: true,
|
|
213
|
+
fallthrough: true,
|
|
214
|
+
loc: locOf(state, node),
|
|
215
|
+
...(clauses.some((clause) => ts.isDefaultClause(clause)) ? { exhaustive: true } : {}),
|
|
216
|
+
});
|
|
217
|
+
const choice = [...chain, id];
|
|
218
|
+
regionByStatement.set(node, id); // `break` inside a clause exits the switch
|
|
219
|
+
for (const clause of clauses) {
|
|
220
|
+
if (ts.isCaseClause(clause))
|
|
221
|
+
walk(clause.expression, choice);
|
|
222
|
+
const inside = guarded(state, node.expression, clause, choice);
|
|
223
|
+
walkStatements(state, clause.statements, inside);
|
|
224
|
+
}
|
|
225
|
+
regionByStatement.delete(node);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// Unstructured transfers: evaluate the operand first (`throw new Error(await x.ask())`
|
|
229
|
+
// issues a step), then record the jump with its target already resolved to a region.
|
|
230
|
+
if (ts.isReturnStatement(node)) {
|
|
231
|
+
if (node.expression !== undefined)
|
|
232
|
+
walk(node.expression, chain);
|
|
233
|
+
jump(state, "return", returnTargets[returnTargets.length - 1] ?? root, chain);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (ts.isThrowStatement(node)) {
|
|
237
|
+
walk(node.expression, chain);
|
|
238
|
+
jump(state, "throw", throwTargets[throwTargets.length - 1] ?? root, chain);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (ts.isBreakOrContinueStatement(node)) {
|
|
242
|
+
const target = jumpTargetOf(state, node);
|
|
243
|
+
if (target !== undefined)
|
|
244
|
+
jump(state, ts.isBreakStatement(node) ? "break" : "continue", target, chain);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (ts.isTryStatement(node)) {
|
|
248
|
+
const group = openRegion(state, "try", innermost(state, chain), {
|
|
249
|
+
entered: true,
|
|
250
|
+
loc: locOf(state, node),
|
|
251
|
+
});
|
|
252
|
+
const inGroup = [...chain, group];
|
|
253
|
+
const attempt = openRegion(state, "attempt", group, {
|
|
254
|
+
entered: true,
|
|
255
|
+
loc: locOf(state, node.tryBlock),
|
|
256
|
+
});
|
|
257
|
+
throwTargets.push(attempt);
|
|
258
|
+
walk(node.tryBlock, [...inGroup, attempt]);
|
|
259
|
+
throwTargets.pop();
|
|
260
|
+
if (node.catchClause !== undefined) {
|
|
261
|
+
// The clause's binding (`catch (e)`) declares nothing that issues; only the block
|
|
262
|
+
// is walked. A `throw` inside it resolves to the OUTER attempt — catch is a sibling
|
|
263
|
+
// of attempt, not a child.
|
|
264
|
+
const id = openRegion(state, "catch", group, {
|
|
265
|
+
entered: false,
|
|
266
|
+
loc: locOf(state, node.catchClause),
|
|
267
|
+
});
|
|
268
|
+
walk(node.catchClause.block, [...inGroup, id]);
|
|
269
|
+
}
|
|
270
|
+
if (node.finallyBlock !== undefined) {
|
|
271
|
+
const id = openRegion(state, "finally", group, {
|
|
272
|
+
entered: true,
|
|
273
|
+
loc: locOf(state, node.finallyBlock),
|
|
274
|
+
});
|
|
275
|
+
walk(node.finallyBlock, [...inGroup, id]);
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (walkLoop(state, node, chain))
|
|
280
|
+
return;
|
|
281
|
+
ts.forEachChild(node, (child) => walk(child, chain));
|
|
282
|
+
}
|