@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.0
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 +64 -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,495 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { addOcc, addPlaceholder, clearExact, cloneValue, collapse, collapseInto, emptyValue, HEAP_MUTATORS, isDirectCallee, isJsonStringify, mergeBound, mergeInto, phKey, singleOcc, VALUE_DEPTH_CAP, } from "./domain.js";
|
|
3
|
+
import { applySuperCall } from "./classes.js";
|
|
4
|
+
import { handleArrayMethod } from "./array-methods.js";
|
|
5
|
+
import { handlePromiseReject, isPromiseReject } from "./promise-ops.js";
|
|
6
|
+
import { callbackSemanticsOf, isForeignMember } from "./callbacks.js";
|
|
7
|
+
import { handleHeapMutator, handleObjectAssign, isObjectAssign } from "./heap-ops.js";
|
|
8
|
+
import { handleAsk, handleJoin, handleWorldRead } from "./relays.js";
|
|
9
|
+
/**
|
|
10
|
+
* Call and relay transfer rules: the facade sinks (`ask`, `files.*`), the relay
|
|
11
|
+
* nodes (`Promise.all` joins and promoted iteration fan-outs), heap mutators, and
|
|
12
|
+
* script-local / higher-order function calls with context-sensitive summaries. These
|
|
13
|
+
* live apart from the core evaluator (taint.ts) but operate on the same `Evaluator`
|
|
14
|
+
* instance.
|
|
15
|
+
*/
|
|
16
|
+
export function evalCall(ev, node, ctx) {
|
|
17
|
+
const actorId = ev.s.actorByCall.get(node);
|
|
18
|
+
if (actorId !== undefined)
|
|
19
|
+
return singleOcc(actorId, true);
|
|
20
|
+
// `super(args)` inside a derived constructor applies the base class's constructor with
|
|
21
|
+
// the actuals (param write-back + placeholder actuals), so a base ctor that stores an
|
|
22
|
+
// argument in `this` sees the derived `new`'s arguments. Without this the base ctor's
|
|
23
|
+
// parameters would resolve to nothing (a dropped may-flow). Returns nothing.
|
|
24
|
+
if (node.expression.kind === ts.SyntaxKind.SuperKeyword) {
|
|
25
|
+
applySuperCall(ev, node, ctx);
|
|
26
|
+
return emptyValue();
|
|
27
|
+
}
|
|
28
|
+
const askId = ev.s.askByCall.get(node);
|
|
29
|
+
if (askId !== undefined)
|
|
30
|
+
return handleAsk(ev, node, askId, ctx);
|
|
31
|
+
const hole = ev.s.holeByCall.get(node);
|
|
32
|
+
if (hole !== undefined)
|
|
33
|
+
return handleHole(ev, node, hole, ctx);
|
|
34
|
+
const world = ev.s.worldByCall.get(node);
|
|
35
|
+
if (world !== undefined)
|
|
36
|
+
return handleWorldRead(ev, world.id, world.args, ctx);
|
|
37
|
+
const join = ev.s.joinByCall.get(node);
|
|
38
|
+
if (join !== undefined)
|
|
39
|
+
return handleJoin(ev, node, join.id, join.arg, ctx);
|
|
40
|
+
if (ts.isPropertyAccessExpression(node.expression)) {
|
|
41
|
+
const cand = ev.s.candByCall.get(node);
|
|
42
|
+
if (cand !== undefined)
|
|
43
|
+
return handleArrayMethod(ev, node, cand, ctx);
|
|
44
|
+
if (isJsonStringify(node.expression)) {
|
|
45
|
+
return node.arguments[0] === undefined ? emptyValue() : collapse(ev.evalExpr(node.arguments[0], ctx));
|
|
46
|
+
}
|
|
47
|
+
if (isPromiseReject(node.expression))
|
|
48
|
+
return handlePromiseReject(ev, node, ctx);
|
|
49
|
+
if (isObjectAssign(node.expression))
|
|
50
|
+
return handleObjectAssign(ev, node, ctx);
|
|
51
|
+
if (HEAP_MUTATORS.has(node.expression.name.text)) {
|
|
52
|
+
// The name-only match used to swallow DISPATCH of a script-local method that
|
|
53
|
+
// merely shares a mutator name (`inbox.add(item)` on `{ add(item) { … } }`): the
|
|
54
|
+
// tracked function body was never applied, so its param actuals stayed empty, facade
|
|
55
|
+
// sinks inside it resolved to nothing, and markCalled/promotion were skipped — an
|
|
56
|
+
// under-approximation. Route by what the member actually HOLDS: tracked callables
|
|
57
|
+
// dispatch as an ordinary call (actuals + write-back + return summary). The receiver
|
|
58
|
+
// smear still runs first — a merged value may be EITHER a user object or a native
|
|
59
|
+
// collection (`flag ? { add(…){…} } : new Set()`), and the smear only ADDS taint
|
|
60
|
+
// (sound over-approximation, never a kill). Native collections carry no tracked fns
|
|
61
|
+
// in their member slot (smear-on-read drops `.fns`), so they keep the pure-smear path.
|
|
62
|
+
const smear = handleHeapMutator(ev, node, node.expression, ctx);
|
|
63
|
+
const memberVal = ev.evalExpr(node.expression, ctx);
|
|
64
|
+
const hasTrackedFns = [...memberVal.fns].some((fn) => ev.s.fnId.has(fn));
|
|
65
|
+
return hasTrackedFns ? handleGenericCall(ev, node, ctx) : smear;
|
|
66
|
+
}
|
|
67
|
+
// `.call` / `.apply` / `.bind` on a script-local function receiver reshape the actuals
|
|
68
|
+
// before they reach the callee's positional parameters. Only intercepts when the
|
|
69
|
+
// receiver actually carries a script-local function; otherwise defers to the generic
|
|
70
|
+
// path (which still applies function-valued ARGUMENTS pessimistically — the keystone).
|
|
71
|
+
const forwarded = handleInvocationForwarding(ev, node, node.expression, ctx);
|
|
72
|
+
if (forwarded !== undefined)
|
|
73
|
+
return forwarded;
|
|
74
|
+
// A deferred continuation (`p.then(cb)`, `p.catch(cb)`, `p.finally(cb)`) runs its callback
|
|
75
|
+
// after the RECEIVER settles: record the receiver's value as the settle oracle at the
|
|
76
|
+
// receiver expression's position — the key the ordering walk reads before it inlines the
|
|
77
|
+
// callback body. Recording only; the call's
|
|
78
|
+
// own transfer (the keystone below) is untouched.
|
|
79
|
+
// Keyed by the MEMBER NAME token (`then`): a chain's receivers all start at the same
|
|
80
|
+
// offset (`p.then(a).finally(b)` — both receivers begin at `p`), and an await operand
|
|
81
|
+
// never starts at a member name, so this key collides with nothing.
|
|
82
|
+
if (callbackSemanticsOf(node, ev.checker, ev.s.program)?.deferred === true) {
|
|
83
|
+
const receiver = node.expression.expression;
|
|
84
|
+
ev.s.mergeSink(ev.s.awaitVal, node.expression.name.getStart(ev.s.scriptFile), collapse(ev.evalExpr(receiver, ctx)));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return handleGenericCall(ev, node, ctx);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 留白(docs/analysis.md「Sites」的 Hole sites 段)。开放的留白:提示是 sink(如 ask 的
|
|
91
|
+
* instructions),返回值是一个来自 run 之外的、以留白站点为标签的不透明值(类型 T)。已补全的
|
|
92
|
+
* 留白:函数体在原地被 cell 调用,所以这里把它当一次**直接**应用——记成 `argument` 应用(时序
|
|
93
|
+
* 走查据此在调用点内联函数体),返回值就是函数体的返回摘要(无实参,exactness 不清:调用是
|
|
94
|
+
* 确定的,不是间接分派)。已补全的留白**不是**图里的节点,所以它的提示不进 sink 表。
|
|
95
|
+
*/
|
|
96
|
+
function handleHole(ev, node, site, ctx) {
|
|
97
|
+
ev.s.markFacade(ctx.regionStack);
|
|
98
|
+
if (site.body === undefined) {
|
|
99
|
+
if (site.prompt !== undefined) {
|
|
100
|
+
ev.s.mergeSink(ev.s.holePrompt, site.id, collapse(ev.evalExpr(site.prompt, ctx)));
|
|
101
|
+
}
|
|
102
|
+
return singleOcc(site.id, true);
|
|
103
|
+
}
|
|
104
|
+
if (site.prompt !== undefined)
|
|
105
|
+
ev.evalExpr(site.prompt, ctx);
|
|
106
|
+
const out = emptyValue();
|
|
107
|
+
for (const fn of ev.evalExpr(site.body, ctx).fns) {
|
|
108
|
+
const id = ev.s.fnId.get(fn);
|
|
109
|
+
if (id === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
recordCall(ev, id, ctx.regionStack, [], undefined, { site: node, via: "argument" });
|
|
112
|
+
mergeInto(out, substitute(ev.s.summaryOf(id), id, [], false));
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
function handleGenericCall(ev, node, ctx) {
|
|
117
|
+
const { explicit, places, tail } = buildActuals(ev, node.arguments, ctx);
|
|
118
|
+
return applyCall(ev, node.expression, explicit, ctx, places, tail, node);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Evaluate an actual-argument list into positional values, their place aliases (for
|
|
122
|
+
* parameter write-back), and an optional inexact TAIL. Positional certainty ends at the
|
|
123
|
+
* first `...spread`: the spread element (and every actual after it) folds into one
|
|
124
|
+
* collapsed, exactness-cleared tail that binds to every parameter at index >= the spread's
|
|
125
|
+
* position — the runtime unpacking length is unknown, so the smear is the sound baseline.
|
|
126
|
+
* `f(...pair)` evaluated the spread as ONE actual at index 0, so params >= 1
|
|
127
|
+
* resolved to nothing (a dropped may-flow: `pair[1]` never reached `f`'s second param).
|
|
128
|
+
*/
|
|
129
|
+
function buildActuals(ev, argsNodes, ctx) {
|
|
130
|
+
const spreadIndex = argsNodes.findIndex((a) => ts.isSpreadElement(a));
|
|
131
|
+
if (spreadIndex < 0) {
|
|
132
|
+
const explicit = argsNodes.map((a) => ev.evalExpr(a, ctx));
|
|
133
|
+
return {
|
|
134
|
+
explicit,
|
|
135
|
+
places: argsNodes.map((a, i) => ev.argWriteBackPlace(a, explicit[i])),
|
|
136
|
+
tail: undefined,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
const explicit = argsNodes.slice(0, spreadIndex).map((a) => ev.evalExpr(a, ctx));
|
|
140
|
+
const places = argsNodes.slice(0, spreadIndex).map((a, i) => ev.argWriteBackPlace(a, explicit[i]));
|
|
141
|
+
const tail = emptyValue();
|
|
142
|
+
for (const arg of argsNodes.slice(spreadIndex))
|
|
143
|
+
collapseInto(tail, ev.evalExpr(arg, ctx));
|
|
144
|
+
return { explicit, places, tail: clearExact(tail) };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* `.call` / `.apply` / `.bind` on a script-local function receiver. Returns undefined when
|
|
148
|
+
* the receiver carries no script-local function (so the caller defers to the generic /
|
|
149
|
+
* unknown path — which still applies function-valued ARGUMENTS pessimistically, preserving
|
|
150
|
+
* the keystone rule for `someUnknown.call(null, cb)`). The facade-siting layer separately
|
|
151
|
+
* rejects these methods on facade callables, so only ORDINARY script functions land here.
|
|
152
|
+
*/
|
|
153
|
+
function handleInvocationForwarding(ev, node, access, ctx) {
|
|
154
|
+
const method = access.name.text;
|
|
155
|
+
if (method !== "call" && method !== "apply" && method !== "bind")
|
|
156
|
+
return undefined;
|
|
157
|
+
const receiverVal = ev.evalExpr(access.expression, ctx);
|
|
158
|
+
const fns = [...receiverVal.fns].filter((fn) => ev.s.fnId.has(fn));
|
|
159
|
+
if (fns.length === 0)
|
|
160
|
+
return undefined;
|
|
161
|
+
const exact = fns.length === 1 && isDirectCallee(access.expression);
|
|
162
|
+
if (method === "call") {
|
|
163
|
+
// f.call(thisArg, a, b, …) ≡ f(a, b, …): drop the thisArg, shift actuals down one.
|
|
164
|
+
// Otherwise the thisArg would occupy actual index 0, and f's param 0 would resolve to `null`.
|
|
165
|
+
const { explicit, places, tail } = buildActuals(ev, node.arguments.slice(1), ctx);
|
|
166
|
+
return applyToFns(ev, fns, exact, explicit, ctx, places, tail, receiverVal.bound, node);
|
|
167
|
+
}
|
|
168
|
+
if (method === "apply") {
|
|
169
|
+
// f.apply(thisArg, argsArray) ≡ f(...argsArray): the args tuple's positional shape is
|
|
170
|
+
// opaque, so smear its collapsed (inexact) taint across every parameter — an ordinary
|
|
171
|
+
// actual at index 1 would never be read by any positional placeholder.
|
|
172
|
+
const argsArray = node.arguments[1];
|
|
173
|
+
const tail = argsArray === undefined ? emptyValue() : clearExact(collapse(ev.evalExpr(argsArray, ctx)));
|
|
174
|
+
return applyToFns(ev, fns, false, [], ctx, undefined, tail, receiverVal.bound, node);
|
|
175
|
+
}
|
|
176
|
+
// f.bind(thisArg, ...prefix): the result is a new function value carrying f's `fns` plus
|
|
177
|
+
// a bound prefix prepended to actuals at the eventual call. Composes with the receiver's
|
|
178
|
+
// existing prefix (rebinding: `f.bind(null, a).bind(null, b)` → [a, b], earlier first).
|
|
179
|
+
// bind previously produced f's substituted summary (no `.fns`), so `g()` was an
|
|
180
|
+
// unknown call AND the prefix never reached f's params.
|
|
181
|
+
const prefixArgs = node.arguments.slice(1).map((arg) => ev.evalExpr(arg, ctx));
|
|
182
|
+
const out = emptyValue();
|
|
183
|
+
for (const fn of receiverVal.fns)
|
|
184
|
+
out.fns.add(fn);
|
|
185
|
+
out.bound = [...(receiverVal.bound ?? []), ...prefixArgs];
|
|
186
|
+
return out;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Apply a callee to already-evaluated argument values. Shared by ordinary call
|
|
190
|
+
* expressions and tagged templates (``tag`…${e}…` `` is the call `tag(strings, e, …)`).
|
|
191
|
+
* Script-local callees route through their context-sensitive summary; unknown/library
|
|
192
|
+
* callees widen (see {@link handleUnknownCall}). `argPlaces[i]`, when present, is the
|
|
193
|
+
* live value of a place actual, used for parameter write-back. `tail`, when present, is an
|
|
194
|
+
* inexact spread smear bound to every parameter at index >= `argVals.length`. `site` is the
|
|
195
|
+
* call / tagged-template node the application is recorded against (the call oracle).
|
|
196
|
+
*/
|
|
197
|
+
export function applyCall(ev, calleeExpr, argVals, ctx, argPlaces, tail, site) {
|
|
198
|
+
const calleeVal = ev.evalExpr(calleeExpr, ctx);
|
|
199
|
+
// A library / facade member is never a script function (see {@link isForeignMember}): the
|
|
200
|
+
// callables a whole-value read smeared into the member slot are the receiver's contents,
|
|
201
|
+
// not the callee. `then(a, b).finally(c)` would otherwise dispatch to a and b as `.finally`.
|
|
202
|
+
const foreign = ts.isPropertyAccessExpression(calleeExpr) && isForeignMember(calleeExpr.name, ev.checker, ev.s.scriptFile);
|
|
203
|
+
const fns = foreign ? [] : [...calleeVal.fns].filter((fn) => ev.s.fnId.has(fn));
|
|
204
|
+
if (fns.length === 0)
|
|
205
|
+
return handleUnknownCall(ev, calleeExpr, calleeVal, argVals, ctx, tail, site);
|
|
206
|
+
const exact = fns.length === 1 && isDirectCallee(calleeExpr);
|
|
207
|
+
return applyToFns(ev, fns, exact, argVals, ctx, argPlaces, tail, calleeVal.bound, site);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Apply a resolved set of script-local functions to actuals. `explicit[i]` binds param i;
|
|
211
|
+
* when `tail` is present, every parameter at index >= `explicit.length` (up to each
|
|
212
|
+
* callee's arity) also binds `tail` — an `apply` / spread smear whose positional extent is
|
|
213
|
+
* unknown. `exact` is the dispatch's exactness: a direct single-fn call preserves it, a
|
|
214
|
+
* widened dispatch (indirect / multi-fn) clears the recorded actuals and the return summary
|
|
215
|
+
* so parameter-direct asks emit inexact edges.
|
|
216
|
+
*
|
|
217
|
+
* When `bound` (a `bind` prefix) is present, both alignments are unioned: once WITH the
|
|
218
|
+
* prefix prepended (the genuinely-bound dispatch) and once WITHOUT it. `fns` is a set, so a
|
|
219
|
+
* value merged from a bound and a plain function (`flag ? f : f.bind(null, a)`) can't say
|
|
220
|
+
* which entry is bound; applying both alignments is sound whichever it is, and a bound
|
|
221
|
+
* dispatch is inexact (the alignment is not proven).
|
|
222
|
+
*/
|
|
223
|
+
function applyToFns(ev, fns, exact, explicit, ctx, argPlaces, tail, bound, site) {
|
|
224
|
+
const result = emptyValue();
|
|
225
|
+
const hasBound = bound !== undefined && bound.length > 0;
|
|
226
|
+
applyAligned(ev, fns, hasBound ? false : exact, explicit, ctx, argPlaces, tail, result, site);
|
|
227
|
+
if (hasBound) {
|
|
228
|
+
const prefixed = [...bound, ...explicit];
|
|
229
|
+
const prefixedPlaces = [...bound.map(() => undefined), ...(argPlaces ?? [])];
|
|
230
|
+
applyAligned(ev, fns, false, prefixed, ctx, prefixedPlaces, tail, result, site);
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
/** One alignment of {@link applyToFns}: bind `explicit`/`tail` to each callee and union the
|
|
235
|
+
* recorded actuals + substituted return summaries into `result`. clearExact clones, so the
|
|
236
|
+
* fns-binding and place write-back in recordCall stay live. */
|
|
237
|
+
function applyAligned(ev, fns, exact, explicit, ctx, argPlaces, tail, result, site) {
|
|
238
|
+
const clear = !exact;
|
|
239
|
+
for (const fn of fns) {
|
|
240
|
+
const id = ev.s.fnId.get(fn);
|
|
241
|
+
if (id === undefined)
|
|
242
|
+
continue;
|
|
243
|
+
const paramCount = (ev.s.fnParamSymbols.get(id) ?? []).length;
|
|
244
|
+
const len = tail !== undefined ? Math.max(explicit.length, paramCount) : explicit.length;
|
|
245
|
+
const args = [];
|
|
246
|
+
const places = [];
|
|
247
|
+
for (let i = 0; i < len; i += 1) {
|
|
248
|
+
const explicitVal = i < explicit.length ? explicit[i] : undefined;
|
|
249
|
+
args.push(explicitVal ?? tail);
|
|
250
|
+
places.push(explicitVal !== undefined ? argPlaces?.[i] : undefined);
|
|
251
|
+
}
|
|
252
|
+
const recorded = clear ? args.map((a) => clearExact(a)) : args;
|
|
253
|
+
recordCall(ev, id, ctx.regionStack, recorded, places, site === undefined ? undefined : { site, via: "callee" });
|
|
254
|
+
mergeInto(result, substitute(ev.s.summaryOf(id), id, args, clear));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Unknown / library call: the result is the union of the receiver's and arguments'
|
|
259
|
+
* collapsed sets, exact preserved ("strings launder nothing"). AND — the keystone
|
|
260
|
+
* rule — every script-local function among the arguments is pessimistically applied:
|
|
261
|
+
* the library may invoke it with anything derived from the receiver or a sibling
|
|
262
|
+
* argument, so each of its parameters receives that receiver ∪ siblings union with
|
|
263
|
+
* exactness cleared, and its return summary joins the result (cleared). This closes
|
|
264
|
+
* the higher-order laundering holes: `.then`/`.catch` callbacks (both directions),
|
|
265
|
+
* `.replace(p, fn)`, `Array.from(xs, fn)`, a named callback to `.map`, an inline
|
|
266
|
+
* callback to a non-whitelisted method (`.findIndex`). The old branch
|
|
267
|
+
* collapsed the arguments (which drops `.fns`) and never visited the callback body,
|
|
268
|
+
* so any taint the callback captured or returned was silently dropped.
|
|
269
|
+
*
|
|
270
|
+
* Separately captures PLACEHOLDER-parameter invocations for the promise machinery
|
|
271
|
+
* ({@link handleNewUnknown} / {@link evalAwait}): a placeholder callee (`resolve(draft)` —
|
|
272
|
+
* resolve is a param) records its args, and a placeholder-valued argument (`draft.then(onOk)`)
|
|
273
|
+
* records the pot the unknown fn may invoke it with. Neither affects THIS call's result;
|
|
274
|
+
* they seed `phCallActuals`, read only when the enclosing callback is applied as a promise
|
|
275
|
+
* executor or a thenable's `then`.
|
|
276
|
+
*/
|
|
277
|
+
function handleUnknownCall(ev, calleeExpr, calleeVal, argVals, ctx, tail, site) {
|
|
278
|
+
const applied = emptyValue();
|
|
279
|
+
if (ts.isPropertyAccessExpression(calleeExpr))
|
|
280
|
+
collapseInto(applied, ev.evalExpr(calleeExpr.expression, ctx));
|
|
281
|
+
for (const arg of argVals)
|
|
282
|
+
collapseInto(applied, arg);
|
|
283
|
+
if (tail !== undefined)
|
|
284
|
+
collapseInto(applied, tail);
|
|
285
|
+
const out = cloneValue(applied);
|
|
286
|
+
// Pessimistic application of function-valued arguments (exactness cleared). The pot a
|
|
287
|
+
// callback's parameters receive is the sibling DATA, not the callables themselves: a
|
|
288
|
+
// function argument is the callback being invoked, not a value the library hands to a
|
|
289
|
+
// sibling callback (mirrors {@link handleNewUnknown}). With the callables left in,
|
|
290
|
+
// `draft.then(cb)` makes cb's parameter "maybe cb", so any unknown call on that parameter
|
|
291
|
+
// inside the body (`Promise.resolve(text)`) re-applies cb to itself — a phantom recursion
|
|
292
|
+
// the call oracle then inlines as a `loop` (reentrant-then-composition).
|
|
293
|
+
const actual = clearExact(applied);
|
|
294
|
+
actual.fns.clear();
|
|
295
|
+
for (const arg of argVals)
|
|
296
|
+
applyPessimistically(ev, arg, actual, ctx, out, site);
|
|
297
|
+
if (tail !== undefined)
|
|
298
|
+
applyPessimistically(ev, tail, actual, ctx, out, site);
|
|
299
|
+
// Capture (b): a placeholder-valued argument may be invoked by the unknown fn with the
|
|
300
|
+
// pot (`draft.then(onOk)` → onOk's invocations may see the receiver draft).
|
|
301
|
+
for (const arg of argVals)
|
|
302
|
+
recordPhCallActuals(ev, arg, actual);
|
|
303
|
+
if (tail !== undefined)
|
|
304
|
+
recordPhCallActuals(ev, tail, actual);
|
|
305
|
+
// Capture (a): a direct call of a placeholder callee (`resolve(draft)`) passes its args
|
|
306
|
+
// to that param's invocation.
|
|
307
|
+
if (calleeVal.phs.size > 0) {
|
|
308
|
+
const argPot = emptyValue();
|
|
309
|
+
for (const arg of argVals)
|
|
310
|
+
collapseInto(argPot, arg);
|
|
311
|
+
if (tail !== undefined)
|
|
312
|
+
collapseInto(argPot, tail);
|
|
313
|
+
recordPhCallActuals(ev, calleeVal, argPot);
|
|
314
|
+
}
|
|
315
|
+
return out;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Keystone application of every script-local function reachable in `source`: each of its
|
|
319
|
+
* parameters receives `pot` (already exactness-cleared), and its substituted return summary
|
|
320
|
+
* joins `out`. Shared by {@link handleUnknownCall} and {@link handleNewUnknown} (`new`).
|
|
321
|
+
*/
|
|
322
|
+
export function applyPessimistically(ev, source, pot, ctx, out, site) {
|
|
323
|
+
for (const fn of source.fns) {
|
|
324
|
+
const id = ev.s.fnId.get(fn);
|
|
325
|
+
if (id === undefined)
|
|
326
|
+
continue;
|
|
327
|
+
const actuals = (ev.s.fnParamSymbols.get(id) ?? []).map(() => pot);
|
|
328
|
+
recordCall(ev, id, ctx.regionStack, actuals, undefined, site === undefined ? undefined : { site, via: "argument" });
|
|
329
|
+
mergeInto(out, substitute(ev.s.summaryOf(id), id, actuals, true));
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Apply script-local functions handed to a per-element library call (`xs.map(review)`) with
|
|
334
|
+
* positional actuals already shaped by the registry (element / whole / accumulator slots).
|
|
335
|
+
* Records each as an `argument` application at `site` inside the candidate's region stack and
|
|
336
|
+
* returns the union of the substituted return summaries (inexact: the dispatch is indirect).
|
|
337
|
+
*/
|
|
338
|
+
export function applyCallbackFns(ev, fns, actuals, regionStack, site) {
|
|
339
|
+
const out = emptyValue();
|
|
340
|
+
for (const fn of fns) {
|
|
341
|
+
const id = ev.s.fnId.get(fn);
|
|
342
|
+
if (id === undefined)
|
|
343
|
+
continue;
|
|
344
|
+
recordCall(ev, id, regionStack, actuals, undefined, { site, via: "argument" });
|
|
345
|
+
mergeInto(out, substitute(ev.s.summaryOf(id), id, actuals, true));
|
|
346
|
+
}
|
|
347
|
+
return out;
|
|
348
|
+
}
|
|
349
|
+
/** Record `value` against every placeholder-parameter carried by `source` (see phCallActuals). */
|
|
350
|
+
function recordPhCallActuals(ev, source, value) {
|
|
351
|
+
for (const ph of source.phs.values())
|
|
352
|
+
ev.s.recordPhCall(phKey(ph), value);
|
|
353
|
+
}
|
|
354
|
+
export function recordCall(ev, id, regionStack, argVals, argPlaces, application) {
|
|
355
|
+
ev.s.markCalled(regionStack, id);
|
|
356
|
+
if (application !== undefined) {
|
|
357
|
+
const fn = ev.s.functions[id];
|
|
358
|
+
if (fn !== undefined)
|
|
359
|
+
ev.s.recordApplication(application.site, fn, application.via);
|
|
360
|
+
}
|
|
361
|
+
const params = ev.s.fnParamSymbols.get(id) ?? [];
|
|
362
|
+
argVals.forEach((argVal, param) => {
|
|
363
|
+
ev.s.addParamActual(id, param, argVal);
|
|
364
|
+
// Keep the call graph total through parameters: functions passed as arguments
|
|
365
|
+
// must be reachable as callees inside the body.
|
|
366
|
+
const psym = params[param];
|
|
367
|
+
if (psym !== undefined && argVal.fns.size > 0) {
|
|
368
|
+
const fnsOnly = emptyValue();
|
|
369
|
+
for (const fn of argVal.fns)
|
|
370
|
+
fnsOnly.fns.add(fn);
|
|
371
|
+
ev.s.bindSymbol(psym, fnsOnly);
|
|
372
|
+
}
|
|
373
|
+
// Parameter write-back: objects cross call boundaries by reference, so a field the
|
|
374
|
+
// callee wrote through the parameter (`box.f = tainted`) must be visible through the
|
|
375
|
+
// caller's argument. Weak-merge the parameter's accumulated heap effects back into
|
|
376
|
+
// the actual's live value when the actual is a place. Monotone; converges with the
|
|
377
|
+
// fixpoint. The parameter's own top-level placeholder is skipped — merging it back
|
|
378
|
+
// would just resolve (guarded) to the actual itself, adding nothing.
|
|
379
|
+
const actualLive = argPlaces?.[param];
|
|
380
|
+
if (psym !== undefined && actualLive !== undefined) {
|
|
381
|
+
const paramSlot = ev.s.env.get(psym);
|
|
382
|
+
if (paramSlot !== undefined && paramSlot !== actualLive && mergeHeapEffects(actualLive, paramSlot, id, param, argVals)) {
|
|
383
|
+
ev.s.changed = true;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Merge a callee parameter's heap effects (its occurrences + fields, recursively) into
|
|
390
|
+
* a caller actual, skipping the parameter's OWN top-level placeholder. Field writes land
|
|
391
|
+
* in `fields`; in-place mutators (`push`, `Map.set`) fold into `occs` — both propagate.
|
|
392
|
+
* The own placeholder is the parameter's identity, not a written effect, so it is not
|
|
393
|
+
* carried back (it would resolve to the actual itself at emission).
|
|
394
|
+
*
|
|
395
|
+
* OTHER top-level placeholders are written effects and must flow: an in-place mutator
|
|
396
|
+
* routes sibling params into the receiver's top level (`fill(list, v) { list.push(v) }`
|
|
397
|
+
* leaves ph(fill,1) in `list`'s slot), and skipping them meant the caller's array never
|
|
398
|
+
* learned it may contain the pushed value — ask#1 → ask#2 edges through such containers
|
|
399
|
+
* vanished. Same-callee placeholders substitute to THIS call's actuals (context-sensitive,
|
|
400
|
+
* exactly like {@link substitute} does for return summaries; the actuals arrive already
|
|
401
|
+
* exactness-adjusted for the dispatch). A placeholder of an ENCLOSING function carries
|
|
402
|
+
* through raw, resolved in the outer context — mirroring substitute's carry-through arm.
|
|
403
|
+
*/
|
|
404
|
+
function mergeHeapEffects(target, source, fnId, selfParam, argVals) {
|
|
405
|
+
let changed = false;
|
|
406
|
+
for (const occ of source.occs.values())
|
|
407
|
+
changed = addOcc(target, occ) || changed;
|
|
408
|
+
for (const ph of source.phs.values()) {
|
|
409
|
+
if (ph.fnId !== fnId) {
|
|
410
|
+
changed = addPlaceholder(target, ph) || changed;
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
if (ph.param === selfParam)
|
|
414
|
+
continue; // the parameter's own identity, not an effect
|
|
415
|
+
if (ph.rest === true) {
|
|
416
|
+
// A rest formal gathers every actual at index >= ph.param.
|
|
417
|
+
for (let i = ph.param; i < argVals.length; i += 1) {
|
|
418
|
+
const restActual = argVals[i];
|
|
419
|
+
if (restActual !== undefined)
|
|
420
|
+
changed = mergeInto(target, collapse(restActual)) || changed;
|
|
421
|
+
}
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
const actual = argVals[ph.param];
|
|
425
|
+
// collapse matches what the in-place mutator itself folds into the receiver.
|
|
426
|
+
if (actual !== undefined)
|
|
427
|
+
changed = mergeInto(target, collapse(actual)) || changed;
|
|
428
|
+
}
|
|
429
|
+
for (const fn of source.fns) {
|
|
430
|
+
if (!target.fns.has(fn)) {
|
|
431
|
+
target.fns.add(fn);
|
|
432
|
+
changed = true;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
for (const [key, field] of source.fields) {
|
|
436
|
+
let slot = target.fields.get(key);
|
|
437
|
+
if (slot === undefined) {
|
|
438
|
+
slot = emptyValue();
|
|
439
|
+
target.fields.set(key, slot);
|
|
440
|
+
}
|
|
441
|
+
changed = mergeInto(slot, field) || changed;
|
|
442
|
+
}
|
|
443
|
+
// A parameter carrying a bind prefix, written back through a place actual, keeps it.
|
|
444
|
+
// Routed through the domain's mergeBound rather than duplicating its element-wise loop, so
|
|
445
|
+
// the prefix LENGTH cap applies here too: the write-back target is a persistent place, and
|
|
446
|
+
// an uncapped prefix growing one element per pass never settles (the reason mergeBound caps).
|
|
447
|
+
if (source.bound !== undefined)
|
|
448
|
+
changed = mergeBound(target, source.bound, 0) || changed;
|
|
449
|
+
return changed;
|
|
450
|
+
}
|
|
451
|
+
/** The callee's return summary with this call's actual arguments substituted in. */
|
|
452
|
+
function substitute(summary, fnId, argVals, clear, depth = 0) {
|
|
453
|
+
const out = emptyValue();
|
|
454
|
+
for (const occ of summary.occs.values()) {
|
|
455
|
+
addOcc(out, { exact: clear ? false : occ.exact, port: occ.port, site: occ.site });
|
|
456
|
+
}
|
|
457
|
+
for (const ph of summary.phs.values()) {
|
|
458
|
+
if (ph.fnId !== fnId) {
|
|
459
|
+
addPlaceholder(out, ph); // a placeholder of an enclosing function — carry it through
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (ph.rest === true) {
|
|
463
|
+
// A rest formal gathers every actual at index >= ph.param.
|
|
464
|
+
for (let i = ph.param; i < argVals.length; i += 1) {
|
|
465
|
+
const restActual = argVals[i];
|
|
466
|
+
if (restActual !== undefined)
|
|
467
|
+
mergeInto(out, clear ? clearExact(restActual) : restActual);
|
|
468
|
+
}
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
const actual = argVals[ph.param];
|
|
472
|
+
if (actual !== undefined)
|
|
473
|
+
mergeInto(out, clear ? clearExact(actual) : actual);
|
|
474
|
+
}
|
|
475
|
+
for (const fn of summary.fns)
|
|
476
|
+
out.fns.add(fn);
|
|
477
|
+
// Depth-bounded like the domain merges: beyond the cap, fold nested summary structure
|
|
478
|
+
// into occurrences rather than recursing (keeps this walk finite for deep summaries).
|
|
479
|
+
if (depth >= VALUE_DEPTH_CAP) {
|
|
480
|
+
for (const field of summary.fields.values())
|
|
481
|
+
collapseInto(out, field);
|
|
482
|
+
for (const el of summary.bound ?? [])
|
|
483
|
+
collapseInto(out, el);
|
|
484
|
+
return out;
|
|
485
|
+
}
|
|
486
|
+
// A returned bound function (`function mk(x){ return f.bind(null, x); }`) carries its
|
|
487
|
+
// prefix through the summary; substitute the callee's placeholders inside each prefix arg
|
|
488
|
+
// so `mk(secret)` yields a value whose prefix is `secret`.
|
|
489
|
+
if (summary.bound !== undefined) {
|
|
490
|
+
out.bound = summary.bound.map((el) => substitute(el, fnId, argVals, clear, depth + 1));
|
|
491
|
+
}
|
|
492
|
+
for (const [key, field] of summary.fields)
|
|
493
|
+
out.fields.set(key, substitute(field, fnId, argVals, clear, depth + 1));
|
|
494
|
+
return out;
|
|
495
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type CausalityGraph, type Certainty, type Fact } from "./causality-graph-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The LAST pass: rewrite a may-set step into one copy per candidate lane.
|
|
4
|
+
*
|
|
5
|
+
* `(cond ? a : b).ask(p)` is the same program as `cond ? a.ask(p) : b.ask(p)`, and the
|
|
6
|
+
* analyzer already draws the second form as one `maybe` step per lane. Drawing the first
|
|
7
|
+
* form as a single card made the picture depend on where the ternary sits, and on a
|
|
8
|
+
* script whose every ask is a may-set it left candidate lanes with no homed step at all —
|
|
9
|
+
* which the mermaid emitter culls, erasing an actor from the workflow.
|
|
10
|
+
*
|
|
11
|
+
* This runs AFTER ordering and reduction by contract: reduction never sees copies, so
|
|
12
|
+
* every reduction rule and its corpus behaviour are unchanged and this stays a mechanical
|
|
13
|
+
* rewrite of the finished graph.
|
|
14
|
+
*/
|
|
15
|
+
export declare function expandMaySetLanes(graph: CausalityGraph): CausalityGraph;
|
|
16
|
+
/** Collapse facts to one edge per ordered pair, keeping the strongest claim. */
|
|
17
|
+
export declare function dedupeFacts(facts: readonly Fact[]): Fact[];
|
|
18
|
+
export declare function weakest(values: readonly Certainty[]): Certainty;
|
|
19
|
+
/**
|
|
20
|
+
* 写下这个站点的那次补全:站点 id 的 `hole#<hash>/` 前缀(只有一层,hole-id.ts);体外的站点
|
|
21
|
+
* 没有。留白自己的 id 不带前缀——它属于哪个留白记在站点表的 `fill` 上,调用方自己查
|
|
22
|
+
* (docs/analysis.md「Sites」)。
|
|
23
|
+
*/
|
|
24
|
+
export declare function fillOf(siteId: string): string | undefined;
|
|
25
|
+
//# sourceMappingURL=causality-graph-lanes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causality-graph-lanes.d.ts","sourceRoot":"","sources":["../../src/analysis/causality-graph-lanes.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,IAAI,EAGV,MAAM,4BAA4B,CAAC;AAiBpC;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAoFvE;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,CA8B1D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzD"}
|