@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -2
- package/cordis.patch.yml +17 -0
- package/lib/client.js +14708 -0
- package/lib/core.js +137 -0
- package/lib/engine-adapter.js +1387 -0
- package/lib/host-driver.js +298 -0
- package/lib/index.js +536 -0
- package/lib/projection.js +159 -0
- package/lib/registry.js +218 -0
- package/lib/session-records.js +54 -0
- package/lib/submission-commit.js +34 -0
- package/lib/world-driver.js +275 -0
- package/package.json +67 -4
- package/vendor/PROVENANCE.md +9 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.js +95 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-models.js +208 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-names.js +155 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts +63 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/analyze.js +92 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts +21 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/array-methods.js +132 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.js +114 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts +67 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifacts.js +263 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts +42 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/assign.js +287 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/callbacks.js +133 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts +40 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/calls.js +495 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts +25 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.js +161 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts +163 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.js +8 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.js +530 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts +29 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.js +266 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.js +116 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.js +148 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.js +263 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts +110 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.js +162 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts +79 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.js +154 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts +174 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.js +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts +17 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.js +282 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order.js +110 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.js +198 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/classes.js +264 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/constants.js +23 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/control-flow.js +132 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core-json.js +49 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts +194 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core.js +204 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts +269 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/domain.js +523 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.js +350 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts +11 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.js +121 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts +113 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.js +411 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.js +104 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.js +47 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.js +33 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/graph.js +199 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts +48 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.js +0 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts +14 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.js +70 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-id.js +41 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.js +215 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.js +100 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/interpret.js +200 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts +18 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/literals.js +125 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/mermaid.js +477 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts +31 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/patterns.js +94 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.js +334 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts +24 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phases.js +54 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts +52 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.js +123 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts +12 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/relays.js +78 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts +125 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/serialize.js +321 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/site-phases.js +69 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.js +189 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts +267 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites.js +225 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts +254 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/state.js +569 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts +97 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/taint.js +649 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts +100 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/types.js +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts +27 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.js +44 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts +59 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/compile.js +159 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts +3 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.js +64 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts +26 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.js +173 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts +54 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.js +19 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts +28 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.js +35 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts +151 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/concurrency.js +282 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts +17 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.js +29 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts +55 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.js +367 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts +90 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-config.js +6 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts +116 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-holes.js +142 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts +34 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-launch.js +26 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.js +74 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts +27 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-report.js +151 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts +18 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-resume.js +38 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts +30 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.js +79 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts +99 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-state.js +13 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts +36 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-world.js +189 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts +263 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine.js +602 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts +87 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/errors.js +56 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.js +15 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts +16 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash.js +48 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.js +6 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts +127 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache.js +244 -0
- package/vendor/dynamic-workflow/engine/index.d.ts +11 -0
- package/vendor/dynamic-workflow/engine/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/index.js +10 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts +32 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-memory.js +243 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts +72 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.js +28 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts +20 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/persona.js +43 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/replay-order.js +229 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/run-terminal.js +7 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts +22 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.js +84 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts +105 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.js +17 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts +113 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler.js +484 -0
- package/vendor/dynamic-workflow/engine/types.d.ts +979 -0
- package/vendor/dynamic-workflow/engine/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/types.js +26 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/world-read-input.js +55 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts +48 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.js +47 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-hole.js +26 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts +11 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-model.js +18 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts +15 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-stream.js +41 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts +29 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts.js +324 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts +218 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/registry.js +203 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts +40 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/report-caps.js +39 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts +37 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.js +36 -0
- package/vendor/dynamic-workflow/index.d.ts +41 -0
- package/vendor/dynamic-workflow/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/index.js +51 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts +2 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/index.js +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.js +63 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts +82 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower.js +333 -0
- package/vendor/dynamic-workflow/projections.d.ts +26 -0
- package/vendor/dynamic-workflow/projections.d.ts.map +1 -0
- package/vendor/dynamic-workflow/projections.js +23 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts +49 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.js +69 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts +55 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/emit.js +325 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts +10 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/jsdoc.js +83 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts +8 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/serialize.js +20 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts +48 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/synthesize.js +138 -0
- package/vendor/dynamic-workflow/schema/types.d.ts +67 -0
- package/vendor/dynamic-workflow/schema/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/types.js +18 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts +15 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/validate.js +213 -0
- package/vendor/dynamic-workflow/testing/index.d.ts +6 -0
- package/vendor/dynamic-workflow/testing/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/index.js +5 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.js +195 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.js +163 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.js +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.js +46 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.js +234 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts +11 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.js +281 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.js +396 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.js +82 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts +15 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract.js +31 -0
- package/vendor/dynamic-workflow-runtime/child-cell-streams.js +128 -0
- package/vendor/dynamic-workflow-runtime/child-entry-file.js +43 -0
- package/vendor/dynamic-workflow-runtime/child-source.js +299 -0
- package/vendor/dynamic-workflow-runtime/harness.js +302 -0
- package/vendor/dynamic-workflow-runtime/index.js +4 -0
- package/vendor/dynamic-workflow-runtime/protocol.js +2 -0
- package/vendor/mcode-host/dynamic-workflow-import.js +269 -0
- package/vendor/mcode-host/workflow-git-world-read.js +183 -0
- package/vendor/mcode-host/workflow-world-read.js +282 -0
package/lib/registry.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { join, basename } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { parse, stringify } from "yaml";
|
|
5
|
+
import {
|
|
6
|
+
validateWorkflowName,
|
|
7
|
+
listDirOrEmpty,
|
|
8
|
+
readTextOrNull,
|
|
9
|
+
} from "./core.js";
|
|
10
|
+
|
|
11
|
+
// 与 MCode saved-workflows/frontmatter.ts 同一文件协议;保留正文逐字节。
|
|
12
|
+
export function decode(source) {
|
|
13
|
+
const match =
|
|
14
|
+
/^\s*\/\* (?:zcode|dsh)-workflow\s*\n([\s\S]*?)\n\*\/\r?\n?/.exec(source);
|
|
15
|
+
if (!match) {
|
|
16
|
+
if (/^\s*\/\* (?:zcode|dsh)-workflow/.test(source))
|
|
17
|
+
throw new Error("工作流元数据未闭合");
|
|
18
|
+
const description =
|
|
19
|
+
/@description\s+([^\n]+)/.exec(source)?.[1]?.trim() ?? "";
|
|
20
|
+
const args = Object.fromEntries(
|
|
21
|
+
[...source.matchAll(/@arg\s+([\w-]+)\s+([^\n]+)/g)].map((m) => [
|
|
22
|
+
m[1],
|
|
23
|
+
{ type: "string", description: m[2].trim() },
|
|
24
|
+
]),
|
|
25
|
+
);
|
|
26
|
+
return { meta: { description, args }, script: source, legacy: true };
|
|
27
|
+
}
|
|
28
|
+
const meta = parse(match[1], { maxAliasCount: 20 });
|
|
29
|
+
checkMeta(meta);
|
|
30
|
+
return { meta, script: source.slice(match[0].length), legacy: false };
|
|
31
|
+
}
|
|
32
|
+
export function checkMeta(meta) {
|
|
33
|
+
if (!meta || typeof meta.description !== "string")
|
|
34
|
+
throw new Error("description 必须是字符串");
|
|
35
|
+
if (
|
|
36
|
+
meta.args != null &&
|
|
37
|
+
(typeof meta.args !== "object" || Array.isArray(meta.args))
|
|
38
|
+
)
|
|
39
|
+
throw new Error("args 必须是参数声明对象");
|
|
40
|
+
for (const [key, spec] of Object.entries(meta.args ?? {})) {
|
|
41
|
+
if (!spec || !["string", "number", "boolean", "json"].includes(spec.type))
|
|
42
|
+
throw new Error(`参数 ${key} 的类型无效`);
|
|
43
|
+
if (spec.required !== undefined && typeof spec.required !== "boolean")
|
|
44
|
+
throw new Error(`参数 ${key} 的 required 必须是布尔值`);
|
|
45
|
+
if (spec.default !== undefined)
|
|
46
|
+
validateArgs({ [key]: spec }, { [key]: spec.default });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function encode(meta, script) {
|
|
50
|
+
checkMeta(meta);
|
|
51
|
+
return `/* zcode-workflow\n${stringify({ description: meta.description, ...(meta.whenToUse ? { whenToUse: meta.whenToUse } : {}), args: meta.args ?? {} })}*/\n${script}`;
|
|
52
|
+
}
|
|
53
|
+
export function validateArgs(declared = {}, given = {}) {
|
|
54
|
+
if (!given || typeof given !== "object" || Array.isArray(given))
|
|
55
|
+
throw new Error("参数必须是对象");
|
|
56
|
+
const errors = [],
|
|
57
|
+
args = {};
|
|
58
|
+
for (const key of Object.keys(given))
|
|
59
|
+
if (!Object.hasOwn(declared, key)) errors.push(`未知参数:${key}`);
|
|
60
|
+
for (const [key, spec] of Object.entries(declared)) {
|
|
61
|
+
const value = given[key] === undefined ? spec.default : given[key];
|
|
62
|
+
if (value === undefined) {
|
|
63
|
+
if (spec.required) errors.push(`请填写必填参数:${key}`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (
|
|
67
|
+
spec.type !== "json" &&
|
|
68
|
+
(typeof value !== spec.type ||
|
|
69
|
+
(spec.type === "number" && !Number.isFinite(value)))
|
|
70
|
+
)
|
|
71
|
+
errors.push(`${key} 必须是 ${spec.type}`);
|
|
72
|
+
else args[key] = value;
|
|
73
|
+
}
|
|
74
|
+
if (errors.length) throw new Error(errors.join("\n"));
|
|
75
|
+
return args;
|
|
76
|
+
}
|
|
77
|
+
export class Registry {
|
|
78
|
+
constructor(root, projects = () => []) {
|
|
79
|
+
this.root = root;
|
|
80
|
+
this.projects = projects;
|
|
81
|
+
}
|
|
82
|
+
groups() {
|
|
83
|
+
return [
|
|
84
|
+
{
|
|
85
|
+
id: "global",
|
|
86
|
+
name: "全局",
|
|
87
|
+
scope: "global",
|
|
88
|
+
path: join(this.root, "saved"),
|
|
89
|
+
},
|
|
90
|
+
...this.projects().map((p) => ({
|
|
91
|
+
id: p.id,
|
|
92
|
+
name: p.title || basename(p.path),
|
|
93
|
+
scope: "project",
|
|
94
|
+
workspacePath: p.path,
|
|
95
|
+
path: join(p.path, ".dsh", "workflows"),
|
|
96
|
+
})),
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
group(id = "global") {
|
|
100
|
+
const g = this.groups().find((g) => g.id === id);
|
|
101
|
+
if (!g) throw new Error("项目已关闭或不存在");
|
|
102
|
+
return g;
|
|
103
|
+
}
|
|
104
|
+
path(name, groupId) {
|
|
105
|
+
return join(
|
|
106
|
+
this.group(groupId).path,
|
|
107
|
+
validateWorkflowName(name) + ".dwf.ts",
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
async get(name, groupId) {
|
|
111
|
+
const path = this.path(name, groupId),
|
|
112
|
+
source = await readTextOrNull(path);
|
|
113
|
+
if (source === null)
|
|
114
|
+
throw Object.assign(new Error("找不到工作流:" + name), {
|
|
115
|
+
code: "ENOENT",
|
|
116
|
+
});
|
|
117
|
+
const { meta, script, legacy } = decode(source);
|
|
118
|
+
return {
|
|
119
|
+
...this.group(groupId),
|
|
120
|
+
...meta,
|
|
121
|
+
name,
|
|
122
|
+
groupId: groupId ?? "global",
|
|
123
|
+
path,
|
|
124
|
+
source,
|
|
125
|
+
script,
|
|
126
|
+
legacy,
|
|
127
|
+
updatedAt: (await fs.stat(path)).mtimeMs,
|
|
128
|
+
id: `${groupId ?? "global"}:${name}`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async list() {
|
|
132
|
+
return Promise.all(
|
|
133
|
+
this.groups().map(async (group) => {
|
|
134
|
+
const entries = [],
|
|
135
|
+
errors = [];
|
|
136
|
+
// 已有项目的 MCode 文件也可直接读取,迁移/修改时写到 dsh 的目录。
|
|
137
|
+
const dirs = [
|
|
138
|
+
group.path,
|
|
139
|
+
...(group.workspacePath
|
|
140
|
+
? [join(group.workspacePath, ".zcode", "workflows")]
|
|
141
|
+
: []),
|
|
142
|
+
];
|
|
143
|
+
for (const dir of dirs)
|
|
144
|
+
for (const file of await listDirOrEmpty(dir)) {
|
|
145
|
+
if (
|
|
146
|
+
!file.endsWith(".dwf.ts") ||
|
|
147
|
+
entries.some((e) => e.name === file.slice(0, -7))
|
|
148
|
+
)
|
|
149
|
+
continue;
|
|
150
|
+
try {
|
|
151
|
+
const path = join(dir, file),
|
|
152
|
+
source = await fs.readFile(path, "utf8"),
|
|
153
|
+
{ meta } = decode(source);
|
|
154
|
+
entries.push({
|
|
155
|
+
...meta,
|
|
156
|
+
name: file.slice(0, -7),
|
|
157
|
+
groupId: group.id,
|
|
158
|
+
scope: group.scope,
|
|
159
|
+
workspacePath: group.workspacePath,
|
|
160
|
+
path,
|
|
161
|
+
updatedAt: (await fs.stat(path)).mtimeMs,
|
|
162
|
+
});
|
|
163
|
+
} catch (e) {
|
|
164
|
+
errors.push({ file, error: e.message });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { ...group, entries, errors };
|
|
168
|
+
}),
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
async resolveEntry(name, groupId = "global") {
|
|
172
|
+
try {
|
|
173
|
+
return await this.get(name, groupId);
|
|
174
|
+
} catch (e) {
|
|
175
|
+
if (e.code !== "ENOENT" || !this.group(groupId).workspacePath) throw e;
|
|
176
|
+
const path = join(
|
|
177
|
+
this.group(groupId).workspacePath,
|
|
178
|
+
".zcode",
|
|
179
|
+
"workflows",
|
|
180
|
+
validateWorkflowName(name) + ".dwf.ts",
|
|
181
|
+
);
|
|
182
|
+
const source = await readTextOrNull(path);
|
|
183
|
+
if (source === null) throw e;
|
|
184
|
+
return {
|
|
185
|
+
...decode(source).meta,
|
|
186
|
+
script: decode(source).script,
|
|
187
|
+
source,
|
|
188
|
+
path,
|
|
189
|
+
name,
|
|
190
|
+
groupId,
|
|
191
|
+
workspacePath: this.group(groupId).workspacePath,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async save(name, source, groupId = "global", { overwrite = true } = {}) {
|
|
196
|
+
decode(source);
|
|
197
|
+
const path = this.path(name, groupId);
|
|
198
|
+
await fs.mkdir(this.group(groupId).path, { recursive: true });
|
|
199
|
+
if (!overwrite) await fs.writeFile(path, source, { flag: "wx" });
|
|
200
|
+
else {
|
|
201
|
+
const tmp = `${path}.${randomUUID()}.tmp`;
|
|
202
|
+
await fs.writeFile(tmp, source);
|
|
203
|
+
await fs.rename(tmp, path);
|
|
204
|
+
}
|
|
205
|
+
return this.get(name, groupId);
|
|
206
|
+
}
|
|
207
|
+
async move(name, from, to) {
|
|
208
|
+
if (from === to) return this.resolveEntry(name, from);
|
|
209
|
+
const entry = await this.resolveEntry(name, from);
|
|
210
|
+
const saved = await this.save(name, entry.source, to, { overwrite: false });
|
|
211
|
+
await fs.unlink(entry.path);
|
|
212
|
+
return saved;
|
|
213
|
+
}
|
|
214
|
+
async remove(name, groupId) {
|
|
215
|
+
const entry = await this.resolveEntry(name, groupId);
|
|
216
|
+
await fs.unlink(entry.path);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Plugin-owned UI anchors must remain replayable even without this plugin. */
|
|
2
|
+
export const WORKFLOW_RUN_RECORD = "plugin:dsh-workflow/run";
|
|
3
|
+
|
|
4
|
+
export function workflowSessionTitle(name, time = Date.now()) {
|
|
5
|
+
const parts = new Intl.DateTimeFormat("en-GB", {
|
|
6
|
+
timeZone: "Asia/Shanghai",
|
|
7
|
+
year: "numeric", month: "2-digit", day: "2-digit",
|
|
8
|
+
hour: "2-digit", minute: "2-digit", second: "2-digit", hourCycle: "h23",
|
|
9
|
+
}).formatToParts(new Date(time));
|
|
10
|
+
const values = Object.fromEntries(parts.map(({ type, value }) => [type, value]));
|
|
11
|
+
const stamp = ["year", "month", "day", "hour", "minute", "second"].map((key) => values[key]).join("");
|
|
12
|
+
const label = typeof name === "string" && name.trim() ? name.trim() : "工作流";
|
|
13
|
+
return `${label}-${stamp}`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function workflowRunId(event) {
|
|
17
|
+
if (event?.type !== WORKFLOW_RUN_RECORD && event?.type !== "dsh-workflow/run") return undefined;
|
|
18
|
+
return typeof event.data?.runId === "string" && event.data.runId.length > 0
|
|
19
|
+
? event.data.runId : undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Offline repair: retain every sequence/data payload; only repair our own record envelope. */
|
|
23
|
+
export function repairWorkflowSessionEvents(events, now = Date.now()) {
|
|
24
|
+
let changed = false;
|
|
25
|
+
const repaired = events.map((event) => {
|
|
26
|
+
if (!workflowRunId(event)) return event;
|
|
27
|
+
if (event.type === WORKFLOW_RUN_RECORD && event.ignorable === true) return event;
|
|
28
|
+
changed = true;
|
|
29
|
+
return { ...event, type: WORKFLOW_RUN_RECORD, ignorable: true };
|
|
30
|
+
});
|
|
31
|
+
const firstRun = repaired.find((event) => workflowRunId(event));
|
|
32
|
+
if (firstRun && !repaired.some((event) => event.type === "session/title")) {
|
|
33
|
+
repaired.push({
|
|
34
|
+
type: "session/title", seq: repaired.length, time: now,
|
|
35
|
+
data: { title: workflowSessionTitle(undefined, firstRun.time), messageSeqs: [], source: { kind: "user" } },
|
|
36
|
+
});
|
|
37
|
+
changed = true;
|
|
38
|
+
}
|
|
39
|
+
return { changed, events: repaired };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Resolve the host's module, not a bundled Session copy with different private fields. */
|
|
43
|
+
export async function prepareWorkflowSession(ctx, session) {
|
|
44
|
+
const loader = ctx.get("loader");
|
|
45
|
+
const titles = ctx.get("sessionTitle");
|
|
46
|
+
if (!loader || !titles) throw new Error("工作流会话需要宿主 loader 和 sessionTitle 服务");
|
|
47
|
+
const { appendPluginRecord } = await loader.import("@deepseek-ai/dsh-session");
|
|
48
|
+
if (typeof appendPluginRecord !== "function") throw new Error("宿主不支持可重放的插件会话记录");
|
|
49
|
+
return (runId, startedAt, runName) => {
|
|
50
|
+
appendPluginRecord(session, WORKFLOW_RUN_RECORD, { runId });
|
|
51
|
+
// Only name an untitled workflow session; preserve an existing user title.
|
|
52
|
+
if (!titles.get(session)?.title) titles.rename(session, workflowSessionTitle(runName, startedAt));
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** DSH can wrap tools in another transport. Commit only after every wrapper
|
|
2
|
+
* succeeds, using execution identity for staging and tokens for parent links. */
|
|
3
|
+
export function submissionCommit(commit, onError) {
|
|
4
|
+
const staged = new Map(),
|
|
5
|
+
parents = new Map();
|
|
6
|
+
return {
|
|
7
|
+
stage(exec, value) {
|
|
8
|
+
staged.set(exec, value);
|
|
9
|
+
},
|
|
10
|
+
result(exec, result) {
|
|
11
|
+
const values = [
|
|
12
|
+
...(parents.get(exec.token) ?? []),
|
|
13
|
+
...(staged.has(exec) ? [staged.get(exec)] : []),
|
|
14
|
+
];
|
|
15
|
+
staged.delete(exec);
|
|
16
|
+
parents.delete(exec.token);
|
|
17
|
+
if (result.isError || !values.length) return;
|
|
18
|
+
if (exec.parent !== undefined)
|
|
19
|
+
parents.set(exec.parent, [
|
|
20
|
+
...(parents.get(exec.parent) ?? []),
|
|
21
|
+
...values,
|
|
22
|
+
]);
|
|
23
|
+
else
|
|
24
|
+
for (const value of values)
|
|
25
|
+
Promise.resolve()
|
|
26
|
+
.then(() => commit(value))
|
|
27
|
+
.catch(onError);
|
|
28
|
+
},
|
|
29
|
+
clear() {
|
|
30
|
+
staged.clear();
|
|
31
|
+
parents.clear();
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { executeWorldRead } from "../vendor/mcode-host/workflow-world-read.js";
|
|
5
|
+
|
|
6
|
+
// MCode owns the operation schemas, Git parsing and result caps. This adapter
|
|
7
|
+
// supplies only filesystem/process I/O and cancels the entire process group.
|
|
8
|
+
export function createWorldDriver(cwd) {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
async function run({ command, timeoutMs = 300000, outputLimit = {} }) {
|
|
11
|
+
if (controller.signal.aborted) throw new Error("工作流已停止");
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
const buffers = { stdout: [], stderr: [] },
|
|
14
|
+
sizes = { stdout: 0, stderr: 0 };
|
|
15
|
+
const cap = outputLimit.maxInlineBytes ?? 1024 * 1024;
|
|
16
|
+
let reason, error;
|
|
17
|
+
const child = spawn(command.file, command.args ?? [], {
|
|
18
|
+
cwd,
|
|
19
|
+
detached: process.platform !== "win32",
|
|
20
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
21
|
+
});
|
|
22
|
+
const kill = () => {
|
|
23
|
+
try {
|
|
24
|
+
process.platform === "win32"
|
|
25
|
+
? child.kill("SIGKILL")
|
|
26
|
+
: process.kill(-child.pid, "SIGKILL");
|
|
27
|
+
} catch {}
|
|
28
|
+
};
|
|
29
|
+
const abort = () => {
|
|
30
|
+
reason = "cancelled";
|
|
31
|
+
kill();
|
|
32
|
+
};
|
|
33
|
+
controller.signal.addEventListener("abort", abort, { once: true });
|
|
34
|
+
const timer = setTimeout(() => {
|
|
35
|
+
reason = "timed_out";
|
|
36
|
+
kill();
|
|
37
|
+
}, timeoutMs);
|
|
38
|
+
for (const stream of ["stdout", "stderr"])
|
|
39
|
+
child[stream].on("data", (chunk) => {
|
|
40
|
+
const remaining = cap + 1 - sizes[stream];
|
|
41
|
+
if (remaining > 0) buffers[stream].push(chunk.subarray(0, remaining));
|
|
42
|
+
sizes[stream] += chunk.length;
|
|
43
|
+
if (sizes[stream] > cap) kill();
|
|
44
|
+
});
|
|
45
|
+
child.on("error", (e) => {
|
|
46
|
+
error = { message: e.message };
|
|
47
|
+
});
|
|
48
|
+
child.on("close", (code) => {
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
controller.signal.removeEventListener("abort", abort);
|
|
51
|
+
const result = {
|
|
52
|
+
status:
|
|
53
|
+
reason ??
|
|
54
|
+
(error ? "spawn_error" : code === 0 ? "completed" : "failed"),
|
|
55
|
+
exitCode: code,
|
|
56
|
+
error,
|
|
57
|
+
};
|
|
58
|
+
for (const stream of ["stdout", "stderr"])
|
|
59
|
+
result[stream] = {
|
|
60
|
+
text: Buffer.concat(buffers[stream]).toString("utf8"),
|
|
61
|
+
bytes: sizes[stream],
|
|
62
|
+
truncated: sizes[stream] > cap,
|
|
63
|
+
};
|
|
64
|
+
resolve(result);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Ripgrep may not be installed on the host. Probe once; when it is missing,
|
|
69
|
+
// fall back to a pure-Node walker that keeps the same result shape.
|
|
70
|
+
let rgAvailable;
|
|
71
|
+
const hasRg = async () => {
|
|
72
|
+
if (rgAvailable === undefined) {
|
|
73
|
+
const probe = await run({
|
|
74
|
+
command: { file: "rg", args: ["--version"] },
|
|
75
|
+
outputLimit: { maxInlineBytes: 4096 },
|
|
76
|
+
});
|
|
77
|
+
rgAvailable = probe.status === "completed";
|
|
78
|
+
}
|
|
79
|
+
return rgAvailable;
|
|
80
|
+
};
|
|
81
|
+
const rgArgs = [
|
|
82
|
+
"--hidden",
|
|
83
|
+
"-g",
|
|
84
|
+
"!.git",
|
|
85
|
+
"-g",
|
|
86
|
+
"!node_modules",
|
|
87
|
+
];
|
|
88
|
+
const rg = async (args) => {
|
|
89
|
+
const result = await run({
|
|
90
|
+
command: { file: "rg", args },
|
|
91
|
+
outputLimit: { maxInlineBytes: 4 * 1024 * 1024 },
|
|
92
|
+
});
|
|
93
|
+
if (
|
|
94
|
+
!["completed", "failed"].includes(result.status) ||
|
|
95
|
+
(result.exitCode !== 0 && result.exitCode !== 1)
|
|
96
|
+
)
|
|
97
|
+
throw new Error(
|
|
98
|
+
result.stderr.text || result.error?.message || "文件搜索失败",
|
|
99
|
+
);
|
|
100
|
+
return result;
|
|
101
|
+
};
|
|
102
|
+
const GLOB_SKIP = new Set([".git", "node_modules"]);
|
|
103
|
+
const SCAN_FILE_CAP = 20000;
|
|
104
|
+
const SCAN_BYTES_PER_FILE = 8 * 1024 * 1024;
|
|
105
|
+
function globToRegExp(pattern) {
|
|
106
|
+
let re = "";
|
|
107
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
108
|
+
const c = pattern[i];
|
|
109
|
+
if (c === "*") {
|
|
110
|
+
if (pattern[i + 1] === "*") {
|
|
111
|
+
i++;
|
|
112
|
+
if (pattern[i + 1] === "/") {
|
|
113
|
+
i++;
|
|
114
|
+
re += "(?:.*/)?";
|
|
115
|
+
} else re += ".*";
|
|
116
|
+
} else re += "[^/]*";
|
|
117
|
+
} else if (c === "?") re += "[^/]";
|
|
118
|
+
else re += c.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
119
|
+
}
|
|
120
|
+
return new RegExp(`^${re}$`);
|
|
121
|
+
}
|
|
122
|
+
function matchGlob(pattern, rel) {
|
|
123
|
+
const re = globToRegExp(pattern);
|
|
124
|
+
if (re.test(rel)) return true;
|
|
125
|
+
if (!pattern.includes("/")) {
|
|
126
|
+
const base = rel.split("/").pop();
|
|
127
|
+
if (base !== undefined && re.test(base)) return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
async function* walk(dir, rel = "") {
|
|
132
|
+
let entries;
|
|
133
|
+
try {
|
|
134
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
135
|
+
} catch {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
if (GLOB_SKIP.has(entry.name)) continue;
|
|
140
|
+
const r = rel ? `${rel}/${entry.name}` : entry.name;
|
|
141
|
+
if (entry.isDirectory()) yield* walk(path.join(dir, entry.name), r);
|
|
142
|
+
else if (entry.isFile()) yield { abs: path.join(dir, entry.name), rel: r };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function searchFilesNative({ pattern, maxResults }) {
|
|
146
|
+
const re = globToRegExp(pattern);
|
|
147
|
+
const files = [];
|
|
148
|
+
let scanned = 0;
|
|
149
|
+
let truncated = false;
|
|
150
|
+
for await (const f of walk(cwd)) {
|
|
151
|
+
if (matchGlob(pattern, f.rel)) {
|
|
152
|
+
files.push(path.resolve(cwd, f.rel));
|
|
153
|
+
if (files.length > maxResults) {
|
|
154
|
+
truncated = true;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (++scanned >= SCAN_FILE_CAP) {
|
|
159
|
+
truncated = true;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { files, truncated };
|
|
164
|
+
}
|
|
165
|
+
async function searchTextNative({ pattern, glob, headLimit }) {
|
|
166
|
+
let re;
|
|
167
|
+
try {
|
|
168
|
+
re = new RegExp(pattern);
|
|
169
|
+
} catch {
|
|
170
|
+
re = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
|
|
171
|
+
}
|
|
172
|
+
const entries = [];
|
|
173
|
+
let truncated = false;
|
|
174
|
+
let scanned = 0;
|
|
175
|
+
for await (const f of walk(cwd)) {
|
|
176
|
+
if (glob && !matchGlob(glob, f.rel)) continue;
|
|
177
|
+
if (++scanned >= SCAN_FILE_CAP) {
|
|
178
|
+
truncated = true;
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
let content;
|
|
182
|
+
try {
|
|
183
|
+
const handle = await fs.open(f.abs, "r");
|
|
184
|
+
try {
|
|
185
|
+
const buffer = Buffer.alloc(SCAN_BYTES_PER_FILE);
|
|
186
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
187
|
+
content = buffer.subarray(0, bytesRead).toString("utf8");
|
|
188
|
+
} finally {
|
|
189
|
+
await handle.close();
|
|
190
|
+
}
|
|
191
|
+
} catch {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const lines = content.split("\n");
|
|
195
|
+
if (lines.length > 1) lines.pop(); // trailing newline
|
|
196
|
+
for (let i = 0; i < lines.length; i++) {
|
|
197
|
+
if (re.test(lines[i])) {
|
|
198
|
+
entries.push({
|
|
199
|
+
path: path.resolve(cwd, f.rel),
|
|
200
|
+
lineNumber: i + 1,
|
|
201
|
+
text: lines[i],
|
|
202
|
+
});
|
|
203
|
+
if (entries.length > headLimit) {
|
|
204
|
+
return { entries, truncated: true };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return { entries, truncated };
|
|
210
|
+
}
|
|
211
|
+
const deps = {
|
|
212
|
+
cwd,
|
|
213
|
+
executionPort: { run },
|
|
214
|
+
fileSystemPort: {
|
|
215
|
+
async readTextFile({ path: file }) {
|
|
216
|
+
return { content: await fs.readFile(file, "utf8") };
|
|
217
|
+
},
|
|
218
|
+
async searchFiles({ pattern, maxResults }) {
|
|
219
|
+
if (!(await hasRg()))
|
|
220
|
+
return searchFilesNative({ pattern, maxResults });
|
|
221
|
+
const r = await rg([
|
|
222
|
+
"--files",
|
|
223
|
+
"--hidden",
|
|
224
|
+
"-g",
|
|
225
|
+
"!.git",
|
|
226
|
+
"-g",
|
|
227
|
+
pattern,
|
|
228
|
+
"-0",
|
|
229
|
+
".",
|
|
230
|
+
]);
|
|
231
|
+
const all = r.stdout.text.split("\0").filter(Boolean);
|
|
232
|
+
return {
|
|
233
|
+
files: all.slice(0, maxResults).map((p) => path.resolve(cwd, p)),
|
|
234
|
+
truncated: all.length > maxResults || r.stdout.truncated,
|
|
235
|
+
};
|
|
236
|
+
},
|
|
237
|
+
async searchText({ pattern, glob, headLimit }) {
|
|
238
|
+
if (!(await hasRg()))
|
|
239
|
+
return searchTextNative({ pattern, glob, headLimit });
|
|
240
|
+
const r = await rg([
|
|
241
|
+
"--json",
|
|
242
|
+
...rgArgs,
|
|
243
|
+
...(glob ? ["-g", glob] : []),
|
|
244
|
+
"--",
|
|
245
|
+
pattern,
|
|
246
|
+
".",
|
|
247
|
+
]);
|
|
248
|
+
const entries = [];
|
|
249
|
+
for (const line of r.stdout.text.split("\n")) {
|
|
250
|
+
if (!line) continue;
|
|
251
|
+
let event;
|
|
252
|
+
try {
|
|
253
|
+
event = JSON.parse(line);
|
|
254
|
+
} catch {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (event.type === "match")
|
|
258
|
+
entries.push({
|
|
259
|
+
path: path.resolve(cwd, event.data.path.text),
|
|
260
|
+
lineNumber: event.data.line_number,
|
|
261
|
+
text: event.data.lines.text.replace(/\r?\n$/, ""),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
entries: entries.slice(0, headLimit),
|
|
266
|
+
truncated: entries.length > headLimit || r.stdout.truncated,
|
|
267
|
+
};
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
return {
|
|
272
|
+
execute: (op, args) => executeWorldRead(deps, op, args),
|
|
273
|
+
dispose: () => controller.abort(),
|
|
274
|
+
};
|
|
275
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,69 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sunshaobei/dsh-workflow",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"description": "MCode workflow UI and runtime integration for DSH",
|
|
4
|
+
"version": "2.1.2",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./lib/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./lib/index.js",
|
|
9
|
+
"./client": "./lib/client.js",
|
|
10
|
+
"./package.json": "./package.json"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"lib",
|
|
14
|
+
"vendor",
|
|
15
|
+
"cordis.patch.yml",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"react-markdown": "^10.1.0",
|
|
20
|
+
"remark-gfm": "^4.0.1",
|
|
21
|
+
"typescript": "^5.9.3",
|
|
22
|
+
"yaml": "^2.8.1"
|
|
23
|
+
},
|
|
24
|
+
"dsh": {
|
|
25
|
+
"bundle": {
|
|
26
|
+
"patch": "./cordis.patch.yml"
|
|
27
|
+
},
|
|
28
|
+
"client": {
|
|
29
|
+
"platform": "web",
|
|
30
|
+
"inject": [
|
|
31
|
+
"@deepseek-ai/dsh-client-ui-workspace",
|
|
32
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right",
|
|
33
|
+
"@deepseek-ai/dsh-client-ui-tool",
|
|
34
|
+
"@deepseek-ai/dsh-client-ui-chat"
|
|
35
|
+
],
|
|
36
|
+
"immediately": true
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"dsh",
|
|
41
|
+
"dsh-plugin",
|
|
42
|
+
"deepseek-harness",
|
|
43
|
+
"workflow",
|
|
44
|
+
"subagents",
|
|
45
|
+
"dynamic-workflow"
|
|
46
|
+
],
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"@deepseek-ai/dsh-llm": "0.2.1-rc.2",
|
|
50
|
+
"@deepseek-ai/dsh-tools": "0.2.1-rc.2",
|
|
51
|
+
"@deepseek-ai/schemastery": "~3.18.5"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "node scripts/build.mjs",
|
|
55
|
+
"test": "node --test tests/*.test.mjs",
|
|
56
|
+
"preview": "node scripts/preview.mjs",
|
|
57
|
+
"test:engine": "node scripts/selftest.mjs"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"esbuild": "^0.25.0",
|
|
61
|
+
"jsdom": "^26.1.0",
|
|
62
|
+
"prettier": "^3.9.10",
|
|
63
|
+
"react": "^19.3.1",
|
|
64
|
+
"react-dom": "^19.3.1"
|
|
65
|
+
},
|
|
66
|
+
"publishConfig": {
|
|
67
|
+
"access": "public"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Source provenance
|
|
2
|
+
|
|
3
|
+
Reference checkout: `<本地 MCode 检出>`, inspected HEAD `434fd17661f14b9421b4acaf1a185616be275cfb`.
|
|
4
|
+
|
|
5
|
+
- `dynamic-workflow/`: compiled MCode compiler, analyzer, schema, facade and engine.
|
|
6
|
+
- `dynamic-workflow-runtime/`: transpiled runtime; relative imports, `.dsh` script directory, temporary prefix and Electron Node environment adapted.
|
|
7
|
+
- `mcode-host/`: bootstrap `workflow-world-read.ts`, `workflow-git-world-read.ts`, `dynamic-workflow-import.ts`; runtime imports adapted and terminal status set inlined.
|
|
8
|
+
|
|
9
|
+
DSH filesystem, process, storage and session adapters live in `lib/`. Vendor files are not reformatted with plugin sources.
|