@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,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 修复原因:journal-contract.ts 顶到 oxlint max-lines 上限(400 行),把actor 记录与节点记录(ask / world / report 行、缺席键、messageBoundary 回填)的用例拆到本文件;
|
|
3
|
+
* 公开面仍从 journal-contract.ts 导出(`runJournalStoreContract` 按原顺序调用各主题的注册函数)。
|
|
4
|
+
*
|
|
5
|
+
* 注意:这里只登记 `it(...)`,不另开 describe——套件的分组与用例顺序必须与拆分前逐字相同。
|
|
6
|
+
*/
|
|
7
|
+
import { expect, it } from "vitest";
|
|
8
|
+
import { baseRun } from "./journal-contract-helpers.js";
|
|
9
|
+
export function registerNodeCases(factory) {
|
|
10
|
+
it("puts, gets and lists actors keyed by (siteId, ordinal)", () => {
|
|
11
|
+
const store = factory();
|
|
12
|
+
store.createRun(baseRun("r1"));
|
|
13
|
+
store.putActor({ runId: "r1", siteId: "actor#1", ordinal: 1, name: "planner" });
|
|
14
|
+
store.putActor({ runId: "r1", siteId: "actor#1", ordinal: 2, name: "planner" });
|
|
15
|
+
expect(store.getActor("r1", "actor#1", 1)?.name).toBe("planner");
|
|
16
|
+
expect(store.getActor("r1", "actor#1", 3)).toBeUndefined();
|
|
17
|
+
expect(store.listActors("r1", { withPersona: true })).toHaveLength(2);
|
|
18
|
+
// 幂等覆盖:同键再写更新 sessionId。
|
|
19
|
+
store.putActor({
|
|
20
|
+
runId: "r1",
|
|
21
|
+
siteId: "actor#1",
|
|
22
|
+
ordinal: 1,
|
|
23
|
+
name: "planner",
|
|
24
|
+
sessionId: "s1",
|
|
25
|
+
});
|
|
26
|
+
expect(store.getActor("r1", "actor#1", 1)?.sessionId).toBe("s1");
|
|
27
|
+
expect(store.listActors("r1", { withPersona: true })).toHaveLength(2);
|
|
28
|
+
});
|
|
29
|
+
it("round-trips the frozen persona and the driver-resolved model on an actor", () => {
|
|
30
|
+
// persona 是冻结身份,resolvedModel 是宿主事实(子代理实际跑在哪个模型上)。两者分列存放:
|
|
31
|
+
// persona 是引擎在 createActor 时同步写下的,那一刻宿主还没造出会话、也就没有模型可记。
|
|
32
|
+
const store = factory();
|
|
33
|
+
store.createRun(baseRun("r1"));
|
|
34
|
+
const record = {
|
|
35
|
+
runId: "r1",
|
|
36
|
+
siteId: "actor#1",
|
|
37
|
+
ordinal: 1,
|
|
38
|
+
name: "judge",
|
|
39
|
+
persona: { name: "judge", system: "You judge." },
|
|
40
|
+
sessionId: "s1",
|
|
41
|
+
resolvedModel: "provider/small-model",
|
|
42
|
+
};
|
|
43
|
+
store.putActor(record);
|
|
44
|
+
expect(store.getActor("r1", "actor#1", 1)).toEqual(record);
|
|
45
|
+
});
|
|
46
|
+
it("keeps an absent resolvedModel absent (not a null / undefined key)", () => {
|
|
47
|
+
// 0021 之前的历史行与「宿主还没解析过」的行都走这条路径:缺席必须解成缺席的键,
|
|
48
|
+
// 否则对整条记录做 toEqual 的调用方(与上一条用例)在升级后全线失败。
|
|
49
|
+
const store = factory();
|
|
50
|
+
store.createRun(baseRun("r1"));
|
|
51
|
+
store.putActor({ runId: "r1", siteId: "actor#1", ordinal: 1, name: "judge" });
|
|
52
|
+
const record = store.getActor("r1", "actor#1", 1);
|
|
53
|
+
expect(record.resolvedModel).toBeUndefined();
|
|
54
|
+
expect(record).toEqual({ runId: "r1", siteId: "actor#1", ordinal: 1, name: "judge" });
|
|
55
|
+
});
|
|
56
|
+
it("puts, gets and lists nodes", () => {
|
|
57
|
+
const store = factory();
|
|
58
|
+
store.createRun(baseRun("r1"));
|
|
59
|
+
const node = {
|
|
60
|
+
runId: "r1",
|
|
61
|
+
siteId: "ask#1",
|
|
62
|
+
ordinal: 1,
|
|
63
|
+
kind: "ask",
|
|
64
|
+
actorSiteId: "actor#1",
|
|
65
|
+
actorOrdinal: 1,
|
|
66
|
+
actorSeq: 0,
|
|
67
|
+
inputHash: "abc",
|
|
68
|
+
status: "completed",
|
|
69
|
+
result: { ok: true },
|
|
70
|
+
};
|
|
71
|
+
store.putNode(node);
|
|
72
|
+
expect(store.getNode("r1", "ask#1", 1)).toEqual(node);
|
|
73
|
+
expect(store.getNode("r1", "ask#1", 2)).toBeUndefined();
|
|
74
|
+
expect(store.listNodes("r1", { kinds: "all", withResult: true })).toHaveLength(1);
|
|
75
|
+
});
|
|
76
|
+
it("round-trips a world-read node's bounded input and keeps it absent elsewhere", () => {
|
|
77
|
+
// 工作区 transcript 要说 *what ran*(docs/dynamic-workflow/transcript-and-notifications.md):
|
|
78
|
+
// `{op, args}` 与 inputHash 同一次准入写下,结算的整条替换必须原样带回;ask 行没有它,
|
|
79
|
+
// 而且是**缺席的键**(不是 undefined 值),否则 toEqual 与读面的 `"input" in row` 都会说谎。
|
|
80
|
+
const store = factory();
|
|
81
|
+
store.createRun(baseRun("r1"));
|
|
82
|
+
const node = {
|
|
83
|
+
runId: "r1",
|
|
84
|
+
siteId: "world-read#1",
|
|
85
|
+
ordinal: 1,
|
|
86
|
+
kind: "world-run",
|
|
87
|
+
inputHash: "wh",
|
|
88
|
+
input: { op: "run", args: ["pnpm", ["vitest", "run"], { timeoutMs: 60_000 }] },
|
|
89
|
+
status: "running",
|
|
90
|
+
};
|
|
91
|
+
store.putNode(node);
|
|
92
|
+
expect(store.getNode("r1", "world-read#1", 1)).toEqual(node);
|
|
93
|
+
const settled = {
|
|
94
|
+
...node,
|
|
95
|
+
status: "completed",
|
|
96
|
+
result: { exitCode: 1, stdout: "", stderr: "boom" },
|
|
97
|
+
};
|
|
98
|
+
store.putNode(settled);
|
|
99
|
+
expect(store.getNode("r1", "world-read#1", 1)).toEqual(settled);
|
|
100
|
+
const truncated = {
|
|
101
|
+
...node,
|
|
102
|
+
siteId: "world-read#2",
|
|
103
|
+
input: { op: "run", args: ["node", "-e …"], truncated: true },
|
|
104
|
+
};
|
|
105
|
+
store.putNode(truncated);
|
|
106
|
+
expect(store.getNode("r1", "world-read#2", 1)?.input).toEqual(truncated.input);
|
|
107
|
+
const ask = store.getNode("r1", "ask#1", 1);
|
|
108
|
+
expect(ask === undefined || !("input" in ask)).toBe(true);
|
|
109
|
+
});
|
|
110
|
+
it("stores a report node: one write, already completed, no actor coordinates", () => {
|
|
111
|
+
// report 节点是「准入 running → 结算」两次写规则唯一的例外(准入与结算之间没有 driver
|
|
112
|
+
// 调用)。落库形状因此是可断言的:单次 putNode、status 恒 completed、actor 三列缺席、
|
|
113
|
+
// result 即被报告的 item。两个实现都必须原样回读,否则 Results 面板与完成通知
|
|
114
|
+
// 会显示存储层的加工品。
|
|
115
|
+
const store = factory();
|
|
116
|
+
store.createRun(baseRun("r1"));
|
|
117
|
+
const report = {
|
|
118
|
+
runId: "r1",
|
|
119
|
+
siteId: "report#1",
|
|
120
|
+
ordinal: 2,
|
|
121
|
+
kind: "report",
|
|
122
|
+
inputHash: "rh",
|
|
123
|
+
status: "completed",
|
|
124
|
+
result: { finding: "duplicate impl", paths: ["a.ts", "b.ts"] },
|
|
125
|
+
};
|
|
126
|
+
store.putNode(report);
|
|
127
|
+
const stored = store.getNode("r1", "report#1", 2);
|
|
128
|
+
expect(stored).toEqual(report);
|
|
129
|
+
expect(stored !== undefined && "actorSeq" in stored).toBe(false);
|
|
130
|
+
expect(stored !== undefined && "actorSiteId" in stored).toBe(false);
|
|
131
|
+
expect(store.listNodes("r1", { kinds: "all", withResult: true }).filter((n) => n.kind === "report")).toHaveLength(1);
|
|
132
|
+
});
|
|
133
|
+
it("keeps a null node result distinguishable from an absent one", () => {
|
|
134
|
+
// result 的类型是 unknown:`ask<T | null>` 返回的 null 是真结果,不是"还没有结果"。
|
|
135
|
+
// 落库实现若把 undefined 和 null 一起压成 SQL NULL,这个区别会在 round-trip 里消失。
|
|
136
|
+
const store = factory();
|
|
137
|
+
store.createRun(baseRun("r1"));
|
|
138
|
+
const nulled = {
|
|
139
|
+
runId: "r1",
|
|
140
|
+
siteId: "ask#1",
|
|
141
|
+
ordinal: 1,
|
|
142
|
+
kind: "ask",
|
|
143
|
+
inputHash: "h",
|
|
144
|
+
status: "completed",
|
|
145
|
+
result: null,
|
|
146
|
+
};
|
|
147
|
+
const absent = {
|
|
148
|
+
runId: "r1",
|
|
149
|
+
siteId: "ask#2",
|
|
150
|
+
ordinal: 1,
|
|
151
|
+
kind: "ask",
|
|
152
|
+
inputHash: "h",
|
|
153
|
+
status: "running",
|
|
154
|
+
};
|
|
155
|
+
store.putNode(nulled);
|
|
156
|
+
store.putNode(absent);
|
|
157
|
+
expect(store.getNode("r1", "ask#1", 1)).toEqual(nulled);
|
|
158
|
+
const stored = store.getNode("r1", "ask#2", 1);
|
|
159
|
+
expect(stored).toEqual(absent);
|
|
160
|
+
// 缺席的可选字段要原样缺席地回来(而不是变成 result: null / result: undefined)。
|
|
161
|
+
expect(stored !== undefined && "result" in stored).toBe(false);
|
|
162
|
+
});
|
|
163
|
+
// messageBoundary 是 ask 结算后 actor 会话消息 log 的长度(count offset),driver 在
|
|
164
|
+
// settle 之后补写(docs/execution-engine.md「Amend-resume」)。属于契约:
|
|
165
|
+
// 它是修订续跑做全保真转录截断时唯一的截断依据,SQLite 若漏写这一列,前驱就成了
|
|
166
|
+
// 「无 marker 前驱」——整个 amend 被结构化拒绝。
|
|
167
|
+
it("round-trips an ask node's messageBoundary and keeps it absent when unrecorded", () => {
|
|
168
|
+
const store = factory();
|
|
169
|
+
store.createRun(baseRun("r1"));
|
|
170
|
+
const bounded = {
|
|
171
|
+
runId: "r1",
|
|
172
|
+
siteId: "ask#1",
|
|
173
|
+
ordinal: 1,
|
|
174
|
+
kind: "ask",
|
|
175
|
+
actorSiteId: "actor#1",
|
|
176
|
+
actorOrdinal: 1,
|
|
177
|
+
actorSeq: 0,
|
|
178
|
+
inputHash: "h1",
|
|
179
|
+
status: "completed",
|
|
180
|
+
result: "done",
|
|
181
|
+
stats: { tokens: 120, toolCalls: 2, turns: 3 },
|
|
182
|
+
messageBoundary: 9,
|
|
183
|
+
};
|
|
184
|
+
// 0 是合法边界(复制零条消息),必须与「没记过边界」可分辨——这正是缺席键语义
|
|
185
|
+
// 在这一列上的实际用处。
|
|
186
|
+
const zero = {
|
|
187
|
+
...bounded,
|
|
188
|
+
siteId: "ask#2",
|
|
189
|
+
actorSeq: 1,
|
|
190
|
+
inputHash: "h2",
|
|
191
|
+
messageBoundary: 0,
|
|
192
|
+
};
|
|
193
|
+
const unrecorded = {
|
|
194
|
+
runId: "r1",
|
|
195
|
+
siteId: "ask#3",
|
|
196
|
+
ordinal: 1,
|
|
197
|
+
kind: "ask",
|
|
198
|
+
inputHash: "h3",
|
|
199
|
+
status: "running",
|
|
200
|
+
};
|
|
201
|
+
store.putNode(bounded);
|
|
202
|
+
store.putNode(zero);
|
|
203
|
+
store.putNode(unrecorded);
|
|
204
|
+
expect(store.getNode("r1", "ask#1", 1)).toEqual(bounded);
|
|
205
|
+
expect(store.getNode("r1", "ask#2", 1)?.messageBoundary).toBe(0);
|
|
206
|
+
const bare = store.getNode("r1", "ask#3", 1);
|
|
207
|
+
expect(bare).toEqual(unrecorded);
|
|
208
|
+
expect(bare !== undefined && "messageBoundary" in bare).toBe(false);
|
|
209
|
+
});
|
|
210
|
+
// driver 的补写形状:getNode 读回引擎刚落的结算行,原样铺开再补边界列。与 stats 回填
|
|
211
|
+
// 同族,所以同一条风险——putNode 是整条替换,实现若在 round-trip 里丢掉任何一列
|
|
212
|
+
// (result / stats / actor 三列 / inputHash),这次补写就会把它抹掉。
|
|
213
|
+
it("preserves every other field when backfilling messageBoundary read-modify-write", () => {
|
|
214
|
+
const store = factory();
|
|
215
|
+
store.createRun(baseRun("r1"));
|
|
216
|
+
const settled = {
|
|
217
|
+
runId: "r1",
|
|
218
|
+
siteId: "ask#1",
|
|
219
|
+
ordinal: 2,
|
|
220
|
+
kind: "ask",
|
|
221
|
+
actorSiteId: "actor#3",
|
|
222
|
+
actorOrdinal: 1,
|
|
223
|
+
actorSeq: 4,
|
|
224
|
+
inputHash: "abc",
|
|
225
|
+
status: "completed",
|
|
226
|
+
result: { verdict: "ship it", notes: [1, 2, 3] },
|
|
227
|
+
stats: { tokens: 512, toolCalls: 7, turns: 5 },
|
|
228
|
+
};
|
|
229
|
+
store.putNode(settled);
|
|
230
|
+
const recorded = store.getNode("r1", "ask#1", 2);
|
|
231
|
+
store.putNode({ ...recorded, messageBoundary: 14 });
|
|
232
|
+
expect(store.getNode("r1", "ask#1", 2)).toEqual({ ...settled, messageBoundary: 14 });
|
|
233
|
+
});
|
|
234
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 读面选项的契约用例(docs/execution-engine.md「Reading the journal」):kinds / withResult /
|
|
3
|
+
* limit / maxResultBytes / countNodes / sumResultBytes / types / reportItems / 按名取子代理。两个实现(内存、SQLite)必须逐字同
|
|
4
|
+
* 语义——读者按这些选项把过滤下推到存储层,任何一侧偷偷退回「读全表」或给出不同的顺序,
|
|
5
|
+
* 冷回放与 GetWorkflowRun 就会在两种部署上归约出不同的状态。
|
|
6
|
+
*
|
|
7
|
+
* 注意:这里只登记 `it(...)`,不另开 describe(与兄弟模块同规)。
|
|
8
|
+
*/
|
|
9
|
+
import type { JournalStorePort } from "../engine/index.js";
|
|
10
|
+
export declare function registerReadCases(factory: () => JournalStorePort): void;
|
|
11
|
+
//# sourceMappingURL=journal-contract-reads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-contract-reads.d.ts","sourceRoot":"","sources":["../../src/testing/journal-contract-reads.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,oBAAoB,CAAC;AA6CjF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAsQvE"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 读面选项的契约用例(docs/execution-engine.md「Reading the journal」):kinds / withResult /
|
|
3
|
+
* limit / maxResultBytes / countNodes / sumResultBytes / types / reportItems / 按名取子代理。两个实现(内存、SQLite)必须逐字同
|
|
4
|
+
* 语义——读者按这些选项把过滤下推到存储层,任何一侧偷偷退回「读全表」或给出不同的顺序,
|
|
5
|
+
* 冷回放与 GetWorkflowRun 就会在两种部署上归约出不同的状态。
|
|
6
|
+
*
|
|
7
|
+
* 注意:这里只登记 `it(...)`,不另开 describe(与兄弟模块同规)。
|
|
8
|
+
*/
|
|
9
|
+
import { expect, it } from "vitest";
|
|
10
|
+
import { baseRun } from "./journal-contract-helpers.js";
|
|
11
|
+
function node(siteId, kind, extra = {}) {
|
|
12
|
+
return {
|
|
13
|
+
runId: "r1",
|
|
14
|
+
siteId,
|
|
15
|
+
ordinal: 1,
|
|
16
|
+
kind,
|
|
17
|
+
inputHash: `h-${siteId}`,
|
|
18
|
+
status: "completed",
|
|
19
|
+
result: { of: siteId },
|
|
20
|
+
...extra,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** 一条 run:ask、report×3(第二条带标签)、world-read、artifact,按这个顺序落库。 */
|
|
24
|
+
function seedNodes(store) {
|
|
25
|
+
store.createRun(baseRun("r1"));
|
|
26
|
+
store.putNode(node("ask#1", "ask", { actorSiteId: "actor#1", actorOrdinal: 1, actorSeq: 0 }));
|
|
27
|
+
store.putNode(node("report#1", "report"));
|
|
28
|
+
store.putNode(node("report#2", "report", { artifactId: "chart" }));
|
|
29
|
+
store.putNode(node("files.grep#1", "world-read", { input: { op: "grep", args: ["x"] } }));
|
|
30
|
+
store.putNode(node("report#3", "report"));
|
|
31
|
+
store.putNode(node("artifact#1", "artifact", { artifactId: "chart" }));
|
|
32
|
+
}
|
|
33
|
+
function report(siteId, item, artifactId) {
|
|
34
|
+
return {
|
|
35
|
+
type: "report",
|
|
36
|
+
instance: { siteId, ordinal: 1 },
|
|
37
|
+
item,
|
|
38
|
+
...(artifactId === undefined ? {} : { artifactId }),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function reportItemOf(event) {
|
|
42
|
+
if (event.type !== "report")
|
|
43
|
+
throw new Error(`not a report: ${event.type}`);
|
|
44
|
+
return "item" in event ? { has: true, item: event.item } : { has: false };
|
|
45
|
+
}
|
|
46
|
+
export function registerReadCases(factory) {
|
|
47
|
+
it('filters nodes by kind in insertion order, and "all" / [] mean everything / nothing', () => {
|
|
48
|
+
const store = factory();
|
|
49
|
+
seedNodes(store);
|
|
50
|
+
const sites = (rows) => rows.map((row) => row.siteId);
|
|
51
|
+
expect(sites(store.listNodes("r1", { kinds: ["report"], withResult: true }))).toEqual([
|
|
52
|
+
"report#1",
|
|
53
|
+
"report#2",
|
|
54
|
+
"report#3",
|
|
55
|
+
]);
|
|
56
|
+
expect(sites(store.listNodes("r1", { kinds: ["ask", "world-read"], withResult: true }))).toEqual(["ask#1", "files.grep#1"]);
|
|
57
|
+
expect(sites(store.listNodes("r1", { kinds: "all", withResult: true }))).toEqual([
|
|
58
|
+
"ask#1",
|
|
59
|
+
"report#1",
|
|
60
|
+
"report#2",
|
|
61
|
+
"files.grep#1",
|
|
62
|
+
"report#3",
|
|
63
|
+
"artifact#1",
|
|
64
|
+
]);
|
|
65
|
+
expect(store.listNodes("r1", { kinds: [], withResult: true })).toEqual([]);
|
|
66
|
+
expect(store.listNodes("nope", { kinds: "all", withResult: true })).toEqual([]);
|
|
67
|
+
});
|
|
68
|
+
it("keeps a row's place when it is upserted again", () => {
|
|
69
|
+
// 准入 running → 结算 completed 是同一条 upsert:行的顺序(id)不能因为第二次写而挪到末尾,
|
|
70
|
+
// 否则「按插入顺序」对每个结算过的节点都是假话。
|
|
71
|
+
const store = factory();
|
|
72
|
+
seedNodes(store);
|
|
73
|
+
store.putNode(node("ask#1", "ask", { status: "failed", actorSiteId: "actor#1", actorOrdinal: 1 }));
|
|
74
|
+
const rows = store.listNodes("r1", { kinds: "all", withResult: false });
|
|
75
|
+
expect(rows[0]?.siteId).toBe("ask#1");
|
|
76
|
+
expect(rows[0]?.status).toBe("failed");
|
|
77
|
+
});
|
|
78
|
+
it("leaves result out without touching any other column when withResult is false", () => {
|
|
79
|
+
const store = factory();
|
|
80
|
+
store.createRun(baseRun("r1"));
|
|
81
|
+
const full = {
|
|
82
|
+
runId: "r1",
|
|
83
|
+
siteId: "ask#1",
|
|
84
|
+
ordinal: 1,
|
|
85
|
+
kind: "ask",
|
|
86
|
+
actorSiteId: "actor#1",
|
|
87
|
+
actorOrdinal: 1,
|
|
88
|
+
actorSeq: 0,
|
|
89
|
+
inputHash: "h",
|
|
90
|
+
status: "completed",
|
|
91
|
+
result: { big: "x".repeat(100) },
|
|
92
|
+
stats: { tokens: 12, toolCalls: 3, turns: 2 },
|
|
93
|
+
messageBoundary: 4,
|
|
94
|
+
};
|
|
95
|
+
store.putNode(full);
|
|
96
|
+
const { result: _result, ...rest } = full;
|
|
97
|
+
void _result;
|
|
98
|
+
const [slim] = store.listNodes("r1", { kinds: "all", withResult: false });
|
|
99
|
+
expect(slim).toEqual(rest);
|
|
100
|
+
expect(slim).not.toHaveProperty("result");
|
|
101
|
+
expect(store.getNode("r1", "ask#1", 1, { withResult: false })).toEqual(rest);
|
|
102
|
+
// 点查缺省读整行。
|
|
103
|
+
expect(store.getNode("r1", "ask#1", 1)).toEqual(full);
|
|
104
|
+
expect(store.getNode("r1", "ask#1", 1, { withResult: true })).toEqual(full);
|
|
105
|
+
});
|
|
106
|
+
it("keeps a null result as null when results are read", () => {
|
|
107
|
+
const store = factory();
|
|
108
|
+
store.createRun(baseRun("r1"));
|
|
109
|
+
store.putNode(node("report#1", "report", { result: null }));
|
|
110
|
+
const [row] = store.listNodes("r1", { kinds: ["report"], withResult: true });
|
|
111
|
+
expect(row).toHaveProperty("result", null);
|
|
112
|
+
});
|
|
113
|
+
it("pages nodes with limit after the kind filter, in insertion order", () => {
|
|
114
|
+
const store = factory();
|
|
115
|
+
seedNodes(store);
|
|
116
|
+
const rows = store.listNodes("r1", { kinds: ["report"], withResult: true, limit: 2 });
|
|
117
|
+
expect(rows.map((row) => row.siteId)).toEqual(["report#1", "report#2"]);
|
|
118
|
+
expect(rows[1]?.result).toEqual({ of: "report#2" });
|
|
119
|
+
expect(store.listNodes("r1", { kinds: ["report"], withResult: true, limit: 0 })).toEqual([]);
|
|
120
|
+
});
|
|
121
|
+
it("counts nodes of one kind without listing them", () => {
|
|
122
|
+
const store = factory();
|
|
123
|
+
seedNodes(store);
|
|
124
|
+
expect(store.countNodes("r1", "report")).toBe(3);
|
|
125
|
+
expect(store.countNodes("r1", "ask")).toBe(1);
|
|
126
|
+
expect(store.countNodes("r1", "world-run")).toBe(0);
|
|
127
|
+
expect(store.countNodes("nope", "report")).toBe(0);
|
|
128
|
+
});
|
|
129
|
+
it("sums the UTF-8 bytes of one kind's results without listing them", () => {
|
|
130
|
+
// resume 靠它恢复报告的 run 级字节计数:两个实现必须用同一把尺——`JSON.stringify(result)`
|
|
131
|
+
// 的 UTF-8 字节(SQLite 侧就是 result_json 的长度),多字节字符按字节算,没有结果的行计 0。
|
|
132
|
+
const store = factory();
|
|
133
|
+
store.createRun(baseRun("r1"));
|
|
134
|
+
const bytes = (value) => new TextEncoder().encode(JSON.stringify(value)).length;
|
|
135
|
+
store.putNode(node("report#1", "report", { result: { text: "abc" } }));
|
|
136
|
+
store.putNode(node("report#2", "report", { result: "中文" }));
|
|
137
|
+
store.putNode(node("report#3", "report", { result: null }));
|
|
138
|
+
store.putNode(node("ask#1", "ask", { status: "running", result: undefined }));
|
|
139
|
+
expect(store.sumResultBytes("r1", "report")).toBe(bytes({ text: "abc" }) + bytes("中文") + bytes(null));
|
|
140
|
+
expect(store.sumResultBytes("r1", "ask")).toBe(0);
|
|
141
|
+
expect(store.sumResultBytes("r1", "world-run")).toBe(0);
|
|
142
|
+
expect(store.sumResultBytes("nope", "report")).toBe(0);
|
|
143
|
+
});
|
|
144
|
+
it("stops a node read before the row that would pass maxResultBytes, but always keeps the first", () => {
|
|
145
|
+
const store = factory();
|
|
146
|
+
store.createRun(baseRun("r1"));
|
|
147
|
+
const pad = "x".repeat(100);
|
|
148
|
+
for (let index = 1; index <= 4; index += 1) {
|
|
149
|
+
store.putNode(node(`report#${index}`, "report", { result: { index, pad } }));
|
|
150
|
+
}
|
|
151
|
+
const one = new TextEncoder().encode(JSON.stringify({ index: 1, pad })).length;
|
|
152
|
+
const sites = (maxResultBytes, limit) => store
|
|
153
|
+
.listNodes("r1", {
|
|
154
|
+
kinds: ["report"],
|
|
155
|
+
withResult: true,
|
|
156
|
+
maxResultBytes,
|
|
157
|
+
...(limit === undefined ? {} : { limit }),
|
|
158
|
+
})
|
|
159
|
+
.map((row) => row.siteId);
|
|
160
|
+
// 两行半的预算放得下两行。
|
|
161
|
+
expect(sites(one * 2 + one / 2)).toEqual(["report#1", "report#2"]);
|
|
162
|
+
// 恰好两行也放得下(超过才收尾,等于不收)。
|
|
163
|
+
expect(sites(one * 2)).toEqual(["report#1", "report#2"]);
|
|
164
|
+
// 一行都放不下时第一行照样在:快照不会因为一条大报告而一条都不带。
|
|
165
|
+
expect(sites(1)).toEqual(["report#1"]);
|
|
166
|
+
// limit 与字节界同时生效,先到先停。
|
|
167
|
+
expect(sites(one * 10, 3)).toEqual(["report#1", "report#2", "report#3"]);
|
|
168
|
+
expect(store
|
|
169
|
+
.listNodes("r1", { kinds: ["report"], withResult: true, maxResultBytes: one * 2 })
|
|
170
|
+
.map((row) => row.result)).toEqual([
|
|
171
|
+
{ index: 1, pad },
|
|
172
|
+
{ index: 2, pad },
|
|
173
|
+
]);
|
|
174
|
+
});
|
|
175
|
+
it("filters actors by name and leaves the persona out when asked", () => {
|
|
176
|
+
const store = factory();
|
|
177
|
+
store.createRun(baseRun("r1"));
|
|
178
|
+
const persona = { name: "judge", system: "You judge." };
|
|
179
|
+
store.putActor({
|
|
180
|
+
runId: "r1",
|
|
181
|
+
siteId: "actor#1",
|
|
182
|
+
ordinal: 1,
|
|
183
|
+
name: "judge",
|
|
184
|
+
persona,
|
|
185
|
+
sessionId: "s1",
|
|
186
|
+
});
|
|
187
|
+
store.putActor({ runId: "r1", siteId: "actor#2", ordinal: 1, name: "scout", persona });
|
|
188
|
+
store.putActor({ runId: "r1", siteId: "actor#1", ordinal: 2, name: "judge", persona });
|
|
189
|
+
const judges = store.listActors("r1", { name: "judge", withPersona: false });
|
|
190
|
+
expect(judges.map((actor) => `${actor.siteId}@${actor.ordinal}`)).toEqual([
|
|
191
|
+
"actor#1@1",
|
|
192
|
+
"actor#1@2",
|
|
193
|
+
]);
|
|
194
|
+
expect(judges[0]).toEqual({
|
|
195
|
+
runId: "r1",
|
|
196
|
+
siteId: "actor#1",
|
|
197
|
+
ordinal: 1,
|
|
198
|
+
name: "judge",
|
|
199
|
+
sessionId: "s1",
|
|
200
|
+
});
|
|
201
|
+
expect(judges[0]).not.toHaveProperty("persona");
|
|
202
|
+
expect(store.listActors("r1", { name: "nobody", withPersona: true })).toEqual([]);
|
|
203
|
+
const all = store.listActors("r1", { withPersona: true });
|
|
204
|
+
expect(all).toHaveLength(3);
|
|
205
|
+
expect(all[1]?.persona).toEqual(persona);
|
|
206
|
+
});
|
|
207
|
+
it("filters events by type in sequence order, before the cursor and the limit", () => {
|
|
208
|
+
const store = factory();
|
|
209
|
+
store.createRun(baseRun("r1"));
|
|
210
|
+
store.appendEvent("r1", { type: "log", message: "a" }); // 0
|
|
211
|
+
store.appendEvent("r1", { type: "usage-updated", spentTokens: 1 }); // 1
|
|
212
|
+
store.appendEvent("r1", { type: "log", message: "b" }); // 2
|
|
213
|
+
store.appendEvent("r1", {
|
|
214
|
+
type: "import-cache-closed",
|
|
215
|
+
instance: { siteId: "ask#1", ordinal: 1 },
|
|
216
|
+
cause: "world-run",
|
|
217
|
+
}); // 3
|
|
218
|
+
store.appendEvent("r1", { type: "log", message: "c" }); // 4
|
|
219
|
+
const seqs = (opts) => store.listEvents("r1", opts).map((stored) => stored.sequence);
|
|
220
|
+
expect(seqs({ types: ["log"], reportItems: "all" })).toEqual([0, 2, 4]);
|
|
221
|
+
expect(seqs({ types: ["import-cache-closed", "log"], reportItems: "all" })).toEqual([
|
|
222
|
+
0, 2, 3, 4,
|
|
223
|
+
]);
|
|
224
|
+
// limit 作用在过滤之后:前两条 log,而不是「前两条事件里的 log」。
|
|
225
|
+
expect(seqs({ types: ["log"], reportItems: "all", limit: 2 })).toEqual([0, 2]);
|
|
226
|
+
expect(seqs({ types: ["log"], reportItems: "all", afterSequence: 0, limit: 1 })).toEqual([2]);
|
|
227
|
+
expect(seqs({ types: [], reportItems: "all" })).toEqual([]);
|
|
228
|
+
expect(seqs({ types: "all", reportItems: "all" })).toEqual([0, 1, 2, 3, 4]);
|
|
229
|
+
});
|
|
230
|
+
it("strips the item from every report event after the Nth, keeping every other field", () => {
|
|
231
|
+
const store = factory();
|
|
232
|
+
store.createRun(baseRun("r1"));
|
|
233
|
+
store.appendEvent("r1", report("report#1", { n: 1 })); // 0: rank 1
|
|
234
|
+
store.appendEvent("r1", { type: "log", message: "between" }); // 1
|
|
235
|
+
store.appendEvent("r1", report("report#1", null)); // 2: rank 2 — null 是合法 item
|
|
236
|
+
store.appendEvent("r1", report("report#2", { n: 3 }, "chart")); // 3: rank 3
|
|
237
|
+
store.appendEvent("r1", report("report#1", "four")); // 4: rank 4
|
|
238
|
+
const events = store.listEvents("r1", { types: "all", reportItems: { limit: 2 } });
|
|
239
|
+
expect(events.map((stored) => stored.sequence)).toEqual([0, 1, 2, 3, 4]);
|
|
240
|
+
expect(reportItemOf(events[0].event)).toEqual({ has: true, item: { n: 1 } });
|
|
241
|
+
expect(events[1].event).toEqual({ type: "log", message: "between" });
|
|
242
|
+
expect(reportItemOf(events[2].event)).toEqual({ has: true, item: null });
|
|
243
|
+
expect(reportItemOf(events[3].event)).toEqual({ has: false });
|
|
244
|
+
expect(events[3].event).toEqual({
|
|
245
|
+
type: "report",
|
|
246
|
+
instance: { siteId: "report#2", ordinal: 1 },
|
|
247
|
+
artifactId: "chart",
|
|
248
|
+
});
|
|
249
|
+
expect(reportItemOf(events[4].event)).toEqual({ has: false });
|
|
250
|
+
expect(events[4].timeCreated).toBeTypeOf("number");
|
|
251
|
+
const none = store.listEvents("r1", { types: ["report"], reportItems: { limit: 0 } });
|
|
252
|
+
expect(none.map((stored) => reportItemOf(stored.event).has)).toEqual([
|
|
253
|
+
false,
|
|
254
|
+
false,
|
|
255
|
+
false,
|
|
256
|
+
false,
|
|
257
|
+
]);
|
|
258
|
+
const every = store.listEvents("r1", { types: ["report"], reportItems: "all" });
|
|
259
|
+
expect(every.map((stored) => reportItemOf(stored.event).has)).toEqual([true, true, true, true]);
|
|
260
|
+
});
|
|
261
|
+
it("ranks report events over the whole run, not over the page being read", () => {
|
|
262
|
+
// 「第几条报告」是 run 的事实:从 cursor 3 开始读,第 3 条报告仍然是第 3 条,
|
|
263
|
+
// 不会因为它是这一页的第一条就把 item 带回来。
|
|
264
|
+
const store = factory();
|
|
265
|
+
store.createRun(baseRun("r1"));
|
|
266
|
+
store.appendEvent("r1", report("report#1", 1)); // 0
|
|
267
|
+
store.appendEvent("r1", report("report#1", 2)); // 1
|
|
268
|
+
store.appendEvent("r1", { type: "log", message: "x" }); // 2
|
|
269
|
+
store.appendEvent("r1", report("report#1", 3)); // 3
|
|
270
|
+
store.appendEvent("r1", report("report#1", 4)); // 4
|
|
271
|
+
const page = store.listEvents("r1", {
|
|
272
|
+
types: ["report"],
|
|
273
|
+
reportItems: { limit: 2 },
|
|
274
|
+
afterSequence: 1,
|
|
275
|
+
});
|
|
276
|
+
expect(page.map((stored) => stored.sequence)).toEqual([3, 4]);
|
|
277
|
+
expect(page.map((stored) => reportItemOf(stored.event).has)).toEqual([false, false]);
|
|
278
|
+
const head = store.listEvents("r1", { types: ["report"], reportItems: { limit: 3 }, limit: 1 });
|
|
279
|
+
expect(head.map((stored) => reportItemOf(stored.event))).toEqual([{ has: true, item: 1 }]);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 修复原因:journal-contract.ts 顶到 oxlint max-lines 上限(400 行),把run 记录(建 run / 结算袋 / 元数据列 / 用量)的用例拆到本文件;
|
|
3
|
+
* 公开面仍从 journal-contract.ts 导出(`runJournalStoreContract` 按原顺序调用各主题的注册函数)。
|
|
4
|
+
*
|
|
5
|
+
* 注意:这里只登记 `it(...)`,不另开 describe——套件的分组与用例顺序必须与拆分前逐字相同。
|
|
6
|
+
*/
|
|
7
|
+
import type { JournalStorePort } from "../engine/index.js";
|
|
8
|
+
export declare function registerRunCases(factory: () => JournalStorePort): void;
|
|
9
|
+
//# sourceMappingURL=journal-contract-runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal-contract-runs.d.ts","sourceRoot":"","sources":["../../src/testing/journal-contract-runs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAyatE"}
|