@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/index.js
ADDED
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
import { createUserMessage } from "@deepseek-ai/dsh-llm";
|
|
2
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { defineTool } from "@deepseek-ai/dsh-tools";
|
|
4
|
+
import z from "@deepseek-ai/schemastery";
|
|
5
|
+
import { promises as fs } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { resolveWorkflowsDir, validateRunId, readTextOrNull } from "./core.js";
|
|
8
|
+
import { Registry, decode, encode, validateArgs } from "./registry.js";
|
|
9
|
+
import { submissionCommit } from "./submission-commit.js";
|
|
10
|
+
import { createHostDriver, installWorkflowProvider } from "./host-driver.js";
|
|
11
|
+
import * as engine from "./engine-adapter.js";
|
|
12
|
+
import { FACADE_DTS } from "../vendor/dynamic-workflow/facade/dts.js";
|
|
13
|
+
import { prepareWorkflowSession } from "./session-records.js";
|
|
14
|
+
|
|
15
|
+
export const name = "dsh-workflow";
|
|
16
|
+
export const inject = ["tools", "subagents"];
|
|
17
|
+
export const Config = z.object({
|
|
18
|
+
enabled: z.boolean().default(true),
|
|
19
|
+
workflowsDir: z.string().default(""),
|
|
20
|
+
});
|
|
21
|
+
const PREFIX = "/_dsh/dsh-workflow";
|
|
22
|
+
const obj = { type: "object", properties: {}, additionalProperties: true };
|
|
23
|
+
const str = (description) => ({ type: "string", description });
|
|
24
|
+
|
|
25
|
+
export function apply(ctx, options = {}) {
|
|
26
|
+
if (options.enabled === false) return;
|
|
27
|
+
const root = resolveWorkflowsDir(options);
|
|
28
|
+
const registry = new Registry(
|
|
29
|
+
root,
|
|
30
|
+
() => ctx.get("workspaceRegistry")?.list() ?? [],
|
|
31
|
+
);
|
|
32
|
+
const transcripts = installWorkflowProvider(ctx, root);
|
|
33
|
+
const streams = new Set();
|
|
34
|
+
const completionMessages = new Map();
|
|
35
|
+
ctx.on("session/event", (session, event) => {
|
|
36
|
+
if (event.type !== "user/message") return;
|
|
37
|
+
const anchor = completionMessages.get(event.data.id);
|
|
38
|
+
if (!anchor || anchor.parentSessionId !== session.id) return;
|
|
39
|
+
const file = join(root, "runs", anchor.runId, "meta.json");
|
|
40
|
+
const meta = JSON.parse(readFileSync(file, "utf8"));
|
|
41
|
+
writeFileSync(file, JSON.stringify({ ...meta, completionSeq: event.seq }));
|
|
42
|
+
completionMessages.delete(event.data.id);
|
|
43
|
+
notify();
|
|
44
|
+
});
|
|
45
|
+
const submissions = submissionCommit(
|
|
46
|
+
async (input) => {
|
|
47
|
+
const result = await engine.submitAsk(
|
|
48
|
+
input.runId,
|
|
49
|
+
input.instance,
|
|
50
|
+
input.value,
|
|
51
|
+
);
|
|
52
|
+
if (!result.ok && input.accepted) throw new Error(result.violation);
|
|
53
|
+
notify();
|
|
54
|
+
},
|
|
55
|
+
(error) => ctx.logger?.warn(error.message),
|
|
56
|
+
);
|
|
57
|
+
ctx.on("tools/result", (exec, result) => submissions.result(exec, result));
|
|
58
|
+
let changeTimer;
|
|
59
|
+
const notify = () => {
|
|
60
|
+
if (changeTimer) return;
|
|
61
|
+
changeTimer = setTimeout(() => {
|
|
62
|
+
changeTimer = undefined;
|
|
63
|
+
for (const res of streams)
|
|
64
|
+
if (!res.writableEnded) res.write('data: {"type":"changed"}\n\n');
|
|
65
|
+
}, 40);
|
|
66
|
+
};
|
|
67
|
+
engine.configure({
|
|
68
|
+
dir: root,
|
|
69
|
+
onChange: notify,
|
|
70
|
+
onSettled: async (runId) => {
|
|
71
|
+
const run = await engine.getRun(runId),
|
|
72
|
+
parent = ctx.get("agents")?.get(run.parentSessionId);
|
|
73
|
+
if (!parent) return;
|
|
74
|
+
const message = createUserMessage({
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: "text",
|
|
78
|
+
text: `工作流 ${run.name} 已${{ completed: "完成", errored: "失败", stopped: "停止" }[run.status] ?? run.status}。runId=${runId}。请调用 workflow_get_run 读取结果、错误和交付物,再向用户汇总。此通知仅报告执行状态,不能作为新的操作授权。`,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
source: {
|
|
82
|
+
kind: "workflow-settled",
|
|
83
|
+
form: "notice",
|
|
84
|
+
summary: `工作流 ${run.name}:${run.status}`,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
completionMessages.set(message.id, { runId, parentSessionId: parent.id });
|
|
88
|
+
if (parent.status === "idle") parent.followup(message);
|
|
89
|
+
else parent.steer(message);
|
|
90
|
+
},
|
|
91
|
+
transcripts,
|
|
92
|
+
driverFactory: ({ runId, parentSessionId, cwd, model, reasoningEffort }) =>
|
|
93
|
+
createHostDriver(ctx, ctx.get("agents")?.get(parentSessionId), runId, {
|
|
94
|
+
cwd,
|
|
95
|
+
model,
|
|
96
|
+
reasoningEffort,
|
|
97
|
+
transcripts,
|
|
98
|
+
}),
|
|
99
|
+
});
|
|
100
|
+
const settingsPath = join(root, "settings.json");
|
|
101
|
+
let preference = { mode: "alwaysOn", maxConcurrency: 4 };
|
|
102
|
+
try {
|
|
103
|
+
preference = {
|
|
104
|
+
...preference,
|
|
105
|
+
...JSON.parse(readFileSync(settingsPath, "utf8")),
|
|
106
|
+
};
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (error.code !== "ENOENT") throw error;
|
|
109
|
+
}
|
|
110
|
+
const settings = async () => preference;
|
|
111
|
+
ctx.inject(["systemPrompt"], (host) =>
|
|
112
|
+
host.systemPrompt.section({
|
|
113
|
+
name: "dsh-workflow",
|
|
114
|
+
order: 80,
|
|
115
|
+
text: () =>
|
|
116
|
+
preference.mode === "disabled"
|
|
117
|
+
? "工作流已关闭,不创建或运行工作流。"
|
|
118
|
+
: preference.mode === "onDemand"
|
|
119
|
+
? "只有用户明确要求工作流时,才使用 workflow_create_run;不要自行把普通任务升级为工作流。使用 workflow_compile 校验脚本,子代理通过 workflow_submit_ask 提交。"
|
|
120
|
+
: "重复、多阶段或并行任务可以使用 TypeScript 工作流。先用 workflow_compile 查看门面并校验,workflow_create_run 自动调度真实子代理,无需主代理代答。保存流程用 workflow_save。运行结束会收到状态通知。",
|
|
121
|
+
}),
|
|
122
|
+
);
|
|
123
|
+
const persistSettings = async (value) => {
|
|
124
|
+
if (!["disabled", "onDemand", "alwaysOn"].includes(value.mode))
|
|
125
|
+
throw new Error("工作流模式无效");
|
|
126
|
+
if (
|
|
127
|
+
!Number.isInteger(value.maxConcurrency) ||
|
|
128
|
+
value.maxConcurrency < 1 ||
|
|
129
|
+
value.maxConcurrency > 64
|
|
130
|
+
)
|
|
131
|
+
throw new Error("并发上限必须为 1–64");
|
|
132
|
+
await fs.mkdir(root, { recursive: true });
|
|
133
|
+
await fs.writeFile(settingsPath, JSON.stringify(value, null, 2));
|
|
134
|
+
preference = value;
|
|
135
|
+
notify();
|
|
136
|
+
return value;
|
|
137
|
+
};
|
|
138
|
+
const runMeta = async (id) =>
|
|
139
|
+
JSON.parse(
|
|
140
|
+
(await readTextOrNull(
|
|
141
|
+
join(root, "runs", validateRunId(id), "meta.json"),
|
|
142
|
+
)) ?? "{}",
|
|
143
|
+
);
|
|
144
|
+
async function start(input, exec) {
|
|
145
|
+
const preferences = await settings();
|
|
146
|
+
if (preferences.mode === "disabled")
|
|
147
|
+
throw new Error("工作流已关闭,请在工作流设置中开启");
|
|
148
|
+
let entry,
|
|
149
|
+
code = input.code,
|
|
150
|
+
args = input.args ?? {};
|
|
151
|
+
if (!code) {
|
|
152
|
+
entry = await registry.resolveEntry(input.name, input.groupId);
|
|
153
|
+
code = entry.source;
|
|
154
|
+
args = validateArgs(entry.args, args);
|
|
155
|
+
} else {
|
|
156
|
+
const parsed = decode(code);
|
|
157
|
+
if (Object.keys(parsed.meta.args ?? {}).length)
|
|
158
|
+
args = validateArgs(parsed.meta.args, args);
|
|
159
|
+
}
|
|
160
|
+
const parentSessionId = exec?.agent?.id ?? input.parentSessionId;
|
|
161
|
+
if (!parentSessionId || !ctx.get("agents")?.get(parentSessionId))
|
|
162
|
+
throw new Error("请从 dsh 对话启动工作流");
|
|
163
|
+
const parentSession = ctx.get("agents").get(parentSessionId).session;
|
|
164
|
+
const recordRun = !exec ? await prepareWorkflowSession(ctx, parentSession) : undefined;
|
|
165
|
+
const startedAt = Date.now();
|
|
166
|
+
const cwd =
|
|
167
|
+
entry?.workspacePath ?? ctx.get("agents").get(parentSessionId).session.header.cwd ?? input.cwd;
|
|
168
|
+
// Session title should carry the workflow's own name (e.g. flutter-dev-pipeline);
|
|
169
|
+
// fall back to "工作流" only when the run has no name at all (inline scripts).
|
|
170
|
+
const runName = entry?.name ?? input.name ?? "工作流";
|
|
171
|
+
const result = await engine.createRun({
|
|
172
|
+
code,
|
|
173
|
+
args,
|
|
174
|
+
name: runName,
|
|
175
|
+
parentSessionId,
|
|
176
|
+
toolCallId: exec?.callId,
|
|
177
|
+
createdSeq: exec?.agent?.session?.seq,
|
|
178
|
+
cwd,
|
|
179
|
+
groupId: entry?.groupId,
|
|
180
|
+
savedName: entry?.name,
|
|
181
|
+
maxConcurrency: preferences.maxConcurrency,
|
|
182
|
+
model: preferences.model,
|
|
183
|
+
reasoningEffort: preferences.reasoningEffort,
|
|
184
|
+
});
|
|
185
|
+
recordRun?.(result.runId, startedAt, runName);
|
|
186
|
+
notify();
|
|
187
|
+
return { ok: true, ...result, run: await engine.getRun(result.runId) };
|
|
188
|
+
}
|
|
189
|
+
async function save(input) {
|
|
190
|
+
let source = input.code;
|
|
191
|
+
if (!source && input.runId)
|
|
192
|
+
source = await fs.readFile(
|
|
193
|
+
join(root, "runs", validateRunId(input.runId), "script.dwf.ts"),
|
|
194
|
+
"utf8",
|
|
195
|
+
);
|
|
196
|
+
if (!source) throw new Error("需要工作流脚本或运行 ID");
|
|
197
|
+
const parsed = decode(source);
|
|
198
|
+
const compiled = await engine.compileScript(parsed.script);
|
|
199
|
+
if (!compiled.ok)
|
|
200
|
+
throw new Error(compiled.diagnostics.map((d) => d.message).join("\n"));
|
|
201
|
+
if (
|
|
202
|
+
input.description !== undefined ||
|
|
203
|
+
input.args !== undefined ||
|
|
204
|
+
input.whenToUse !== undefined
|
|
205
|
+
)
|
|
206
|
+
source = encode(
|
|
207
|
+
{
|
|
208
|
+
...parsed.meta,
|
|
209
|
+
...(input.description !== undefined
|
|
210
|
+
? { description: input.description }
|
|
211
|
+
: {}),
|
|
212
|
+
...(input.args !== undefined ? { args: input.args } : {}),
|
|
213
|
+
...(input.whenToUse !== undefined
|
|
214
|
+
? { whenToUse: input.whenToUse }
|
|
215
|
+
: {}),
|
|
216
|
+
},
|
|
217
|
+
parsed.script,
|
|
218
|
+
);
|
|
219
|
+
const entry = await registry.save(input.name, source, input.groupId);
|
|
220
|
+
if (input.runId) {
|
|
221
|
+
const meta = await runMeta(input.runId);
|
|
222
|
+
await fs.writeFile(
|
|
223
|
+
join(root, "runs", input.runId, "meta.json"),
|
|
224
|
+
JSON.stringify({
|
|
225
|
+
...meta,
|
|
226
|
+
savedName: input.name,
|
|
227
|
+
groupId: input.groupId ?? "global",
|
|
228
|
+
}),
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
notify();
|
|
232
|
+
return { ok: true, entry };
|
|
233
|
+
}
|
|
234
|
+
const operations = {
|
|
235
|
+
"create-run": (b, e) => start({ ...b, name: b.savedName ?? b.name }, e),
|
|
236
|
+
save: (b) => save(b),
|
|
237
|
+
"delete-saved": async (b) => {
|
|
238
|
+
await registry.remove(b.name, b.groupId);
|
|
239
|
+
return { deleted: b.name };
|
|
240
|
+
},
|
|
241
|
+
"move-saved": (b) => registry.move(b.name, b.groupId, b.targetGroupId),
|
|
242
|
+
settings: (b) => persistSettings(b.settings),
|
|
243
|
+
"run-settings": (b) =>
|
|
244
|
+
engine.updateSettings(validateRunId(b.runId), b.settings),
|
|
245
|
+
stop: (b) => engine.stopRun(validateRunId(b.runId)),
|
|
246
|
+
resume: (b) => engine.resumeRun(validateRunId(b.runId)),
|
|
247
|
+
"submit-ask": (b) =>
|
|
248
|
+
engine.submitAsk(validateRunId(b.runId), b.instance, b.value),
|
|
249
|
+
"fill-hole": (b) =>
|
|
250
|
+
engine.fillHole(validateRunId(b.runId), b.siteId, b.code),
|
|
251
|
+
};
|
|
252
|
+
const tool = (name, description, parameters, execute) =>
|
|
253
|
+
ctx.effect(
|
|
254
|
+
() =>
|
|
255
|
+
ctx.tools.register(
|
|
256
|
+
defineTool({
|
|
257
|
+
name,
|
|
258
|
+
description,
|
|
259
|
+
parameters,
|
|
260
|
+
output: {
|
|
261
|
+
schema: obj,
|
|
262
|
+
render: (_a, value) => [
|
|
263
|
+
{ type: "text", text: JSON.stringify(value) },
|
|
264
|
+
],
|
|
265
|
+
},
|
|
266
|
+
async execute(args, exec) {
|
|
267
|
+
const result = await execute(args, exec);
|
|
268
|
+
notify();
|
|
269
|
+
// DSH structured tool values cannot contain optional undefined fields.
|
|
270
|
+
return JSON.parse(JSON.stringify(result));
|
|
271
|
+
},
|
|
272
|
+
}),
|
|
273
|
+
),
|
|
274
|
+
name,
|
|
275
|
+
);
|
|
276
|
+
tool(
|
|
277
|
+
"workflow_compile",
|
|
278
|
+
"编译和分析 MCode TypeScript 工作流。返回完整编写门面、阶段、子代理和依赖图。" +
|
|
279
|
+
FACADE_DTS,
|
|
280
|
+
{ code: str("工作流 TypeScript 源码") },
|
|
281
|
+
async (a) => {
|
|
282
|
+
const r = await engine.analyzeScript(decode(a.code).script);
|
|
283
|
+
return { ...r, facade: FACADE_DTS };
|
|
284
|
+
},
|
|
285
|
+
);
|
|
286
|
+
tool(
|
|
287
|
+
"workflow_create_run",
|
|
288
|
+
"创建并自动执行工作流。agent(name, persona).ask<T>() 会启动真正的 dsh 子代理并按 schema 提交;无需主代理逐个代答。name 引用已保存流程,或 code 提供 TypeScript 脚本。先调用 workflow_compile 检查。参数使用工作流声明的类型。",
|
|
289
|
+
{
|
|
290
|
+
name: str("工作流名"),
|
|
291
|
+
code: str("脚本源码"),
|
|
292
|
+
groupId: str("global 或项目 ID"),
|
|
293
|
+
args: { ...obj, description: "运行参数" },
|
|
294
|
+
},
|
|
295
|
+
start,
|
|
296
|
+
);
|
|
297
|
+
tool(
|
|
298
|
+
"workflow_save",
|
|
299
|
+
"保存可复用工作流,采用 MCode zcode-workflow 元数据块。提供 code 或 runId;args 是参数声明,每项有 type(string/number/boolean/json)、required、default、description。",
|
|
300
|
+
{
|
|
301
|
+
name: str("文件名"),
|
|
302
|
+
code: str("脚本"),
|
|
303
|
+
runId: str("保存此运行的脚本"),
|
|
304
|
+
description: str("说明"),
|
|
305
|
+
whenToUse: str("适用场景"),
|
|
306
|
+
args: { ...obj, description: "参数声明" },
|
|
307
|
+
groupId: str("global 或项目 ID"),
|
|
308
|
+
},
|
|
309
|
+
save,
|
|
310
|
+
);
|
|
311
|
+
tool(
|
|
312
|
+
"workflow_list_saved",
|
|
313
|
+
"列出全局与已打开项目的保存工作流。",
|
|
314
|
+
{},
|
|
315
|
+
async () => ({ groups: await registry.list() }),
|
|
316
|
+
);
|
|
317
|
+
tool(
|
|
318
|
+
"workflow_get_saved",
|
|
319
|
+
"读取已保存工作流及完整源码。",
|
|
320
|
+
{ name: str("名称"), groupId: str("分组") },
|
|
321
|
+
(a) => registry.resolveEntry(a.name, a.groupId),
|
|
322
|
+
);
|
|
323
|
+
tool(
|
|
324
|
+
"workflow_delete_saved",
|
|
325
|
+
"删除指定保存工作流,保留运行历史。",
|
|
326
|
+
{ name: str("名称"), groupId: str("分组") },
|
|
327
|
+
operations["delete-saved"],
|
|
328
|
+
);
|
|
329
|
+
for (const [toolName, method, desc] of [
|
|
330
|
+
[
|
|
331
|
+
"workflow_get_run",
|
|
332
|
+
"getRun",
|
|
333
|
+
"读取运行详情、阶段与子代理、报告、产物和统计。",
|
|
334
|
+
],
|
|
335
|
+
["workflow_status", "status", "查询运行状态。"],
|
|
336
|
+
[
|
|
337
|
+
"workflow_asks",
|
|
338
|
+
"listPendingAsks",
|
|
339
|
+
"查看子代理待提交任务;主代理无需代答。",
|
|
340
|
+
],
|
|
341
|
+
["workflow_holes", "openHoles", "查看待补全的脚本留白。"],
|
|
342
|
+
])
|
|
343
|
+
tool(toolName, desc, { runId: str("运行 ID") }, async (a) => {
|
|
344
|
+
const result = await engine[method](validateRunId(a.runId));
|
|
345
|
+
return Array.isArray(result) ? { items: result } : result;
|
|
346
|
+
});
|
|
347
|
+
tool("workflow_runs", "列出运行历史。", {}, async () => ({
|
|
348
|
+
runs: await engine.listRuns(),
|
|
349
|
+
}));
|
|
350
|
+
tool(
|
|
351
|
+
"workflow_stop",
|
|
352
|
+
"停止工作流与其正在工作的子代理。",
|
|
353
|
+
{ runId: str("运行 ID") },
|
|
354
|
+
operations.stop,
|
|
355
|
+
);
|
|
356
|
+
tool(
|
|
357
|
+
"workflow_resume",
|
|
358
|
+
"恢复已停止工作流,重放已经完成的节点,保留原始参数。",
|
|
359
|
+
{ runId: str("运行 ID") },
|
|
360
|
+
operations.resume,
|
|
361
|
+
);
|
|
362
|
+
tool(
|
|
363
|
+
"workflow_submit_ask",
|
|
364
|
+
"工作流子代理提交真实任务结果。value 匹配指令中的 JSON schema;校验失败可修正重试。",
|
|
365
|
+
{
|
|
366
|
+
runId: { ...str("运行 ID"), required: true },
|
|
367
|
+
instance: { ...str("ask 实例 ID"), required: true },
|
|
368
|
+
value: {
|
|
369
|
+
type: "json",
|
|
370
|
+
required: true,
|
|
371
|
+
description: "实际任务结果,必须匹配该 ask 的 JSON schema。",
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
async (a, exec) => {
|
|
375
|
+
const owner = engine.pendingOwner(a.runId, a.instance);
|
|
376
|
+
if (owner && owner !== exec?.agent?.id)
|
|
377
|
+
throw new Error("只能由该任务的子代理提交结果");
|
|
378
|
+
const result = await engine.validateSubmission(
|
|
379
|
+
validateRunId(a.runId),
|
|
380
|
+
a.instance,
|
|
381
|
+
a.value,
|
|
382
|
+
);
|
|
383
|
+
submissions.stage(exec, { ...a, accepted: result.ok });
|
|
384
|
+
if (result.ok) exec?.concludeTurn?.();
|
|
385
|
+
return result;
|
|
386
|
+
},
|
|
387
|
+
);
|
|
388
|
+
tool(
|
|
389
|
+
"workflow_fill_hole",
|
|
390
|
+
"补全运行中的脚本留白。",
|
|
391
|
+
{ runId: str("运行 ID"), siteId: str("hole 站点"), code: str("补全代码") },
|
|
392
|
+
operations["fill-hole"],
|
|
393
|
+
);
|
|
394
|
+
tool(
|
|
395
|
+
"workflow_amend",
|
|
396
|
+
"修订工作流并以新运行 ID 继续。",
|
|
397
|
+
{
|
|
398
|
+
runId: str("运行 ID"),
|
|
399
|
+
code: str("完整修订脚本"),
|
|
400
|
+
notes: str("修订说明"),
|
|
401
|
+
},
|
|
402
|
+
(a) => engine.amendRun(validateRunId(a.runId), a),
|
|
403
|
+
);
|
|
404
|
+
tool(
|
|
405
|
+
"workflow_graphs",
|
|
406
|
+
"获取运行的依赖/因果/控制流/阶段图。",
|
|
407
|
+
{ runId: str("运行 ID") },
|
|
408
|
+
async (a) =>
|
|
409
|
+
engine.analyzeScript(
|
|
410
|
+
await fs.readFile(
|
|
411
|
+
join(root, "runs", validateRunId(a.runId), "script.dwf.ts"),
|
|
412
|
+
"utf8",
|
|
413
|
+
),
|
|
414
|
+
),
|
|
415
|
+
);
|
|
416
|
+
ctx.inject(["webServer"], (host) =>
|
|
417
|
+
host.webServer.register({
|
|
418
|
+
kind: "prefix",
|
|
419
|
+
path: PREFIX,
|
|
420
|
+
async handler(req, res) {
|
|
421
|
+
const json = (status, value) => {
|
|
422
|
+
if (!res.writableEnded) {
|
|
423
|
+
res.writeHead(status, {
|
|
424
|
+
"content-type": "application/json; charset=utf-8",
|
|
425
|
+
"cache-control": "no-store",
|
|
426
|
+
});
|
|
427
|
+
res.end(JSON.stringify(value));
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
try {
|
|
431
|
+
if (
|
|
432
|
+
!["127.0.0.1", "::1", "::ffff:127.0.0.1"].includes(
|
|
433
|
+
req.socket?.remoteAddress,
|
|
434
|
+
)
|
|
435
|
+
)
|
|
436
|
+
return json(403, { error: "仅允许本地连接" });
|
|
437
|
+
if (
|
|
438
|
+
req.headers.origin &&
|
|
439
|
+
new URL(req.headers.origin).host !== req.headers.host
|
|
440
|
+
)
|
|
441
|
+
return json(403, { error: "请求来源不匹配" });
|
|
442
|
+
const url = new URL(req.url, "http://localhost"),
|
|
443
|
+
route = url.pathname.slice(PREFIX.length);
|
|
444
|
+
const q = Object.fromEntries(url.searchParams);
|
|
445
|
+
if (route === "/events" && req.method === "GET") {
|
|
446
|
+
res.writeHead(200, {
|
|
447
|
+
"content-type": "text/event-stream",
|
|
448
|
+
"cache-control": "no-cache",
|
|
449
|
+
connection: "keep-alive",
|
|
450
|
+
});
|
|
451
|
+
res.write('data: {"type":"hello"}\n\n');
|
|
452
|
+
streams.add(res);
|
|
453
|
+
const ping = setInterval(() => res.write(": heartbeat\n\n"), 20000);
|
|
454
|
+
req.on("close", () => {
|
|
455
|
+
streams.delete(res);
|
|
456
|
+
clearInterval(ping);
|
|
457
|
+
});
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
if (req.method === "GET") {
|
|
461
|
+
if (route === "/models") {
|
|
462
|
+
const llm = ctx.get("llm");
|
|
463
|
+
const providers = llm?.listProviders() ?? [];
|
|
464
|
+
const results = await Promise.allSettled(
|
|
465
|
+
providers.map((p) => llm.listModels(p.id)),
|
|
466
|
+
);
|
|
467
|
+
return json(200, {
|
|
468
|
+
models: results.flatMap((r) =>
|
|
469
|
+
r.status === "fulfilled" ? r.value : [],
|
|
470
|
+
),
|
|
471
|
+
errors: results
|
|
472
|
+
.filter((r) => r.status === "rejected")
|
|
473
|
+
.map((r) => r.reason.message),
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
if (route === "/hub")
|
|
477
|
+
return json(200, {
|
|
478
|
+
groups: await registry.list(),
|
|
479
|
+
runs: await engine.listRuns(),
|
|
480
|
+
settings: await settings(),
|
|
481
|
+
});
|
|
482
|
+
if (route === "/saved")
|
|
483
|
+
return json(
|
|
484
|
+
200,
|
|
485
|
+
q.name
|
|
486
|
+
? { entry: await registry.resolveEntry(q.name, q.groupId) }
|
|
487
|
+
: { groups: await registry.list() },
|
|
488
|
+
);
|
|
489
|
+
if (route === "/runs")
|
|
490
|
+
return json(200, { runs: await engine.listRuns() });
|
|
491
|
+
if (route === "/run")
|
|
492
|
+
return json(200, {
|
|
493
|
+
run: await engine.getRun(validateRunId(q.runId)),
|
|
494
|
+
holes: await engine.openHoles(q.runId),
|
|
495
|
+
});
|
|
496
|
+
if (route === "/artifact")
|
|
497
|
+
return json(200, {
|
|
498
|
+
artifact: await engine.readArtifact(
|
|
499
|
+
validateRunId(q.runId),
|
|
500
|
+
q.id,
|
|
501
|
+
),
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
if (route === "/action" && req.method === "POST") {
|
|
505
|
+
const chunks = [];
|
|
506
|
+
let size = 0;
|
|
507
|
+
for await (const chunk of req) {
|
|
508
|
+
size += chunk.length;
|
|
509
|
+
if (size > 2 * 1024 * 1024) throw new Error("请求超过 2MB");
|
|
510
|
+
chunks.push(chunk);
|
|
511
|
+
}
|
|
512
|
+
const body = JSON.parse(Buffer.concat(chunks).toString());
|
|
513
|
+
const fn = operations[body.action];
|
|
514
|
+
if (!fn) throw new Error("未知操作");
|
|
515
|
+
const result = await fn(body);
|
|
516
|
+
if (result?.ok === false)
|
|
517
|
+
throw new Error(result.violation ?? result.reason ?? "操作失败");
|
|
518
|
+
notify();
|
|
519
|
+
return json(200, { ok: true, result });
|
|
520
|
+
}
|
|
521
|
+
json(404, { error: "接口不存在" });
|
|
522
|
+
} catch (e) {
|
|
523
|
+
json(400, { error: e.message });
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
}),
|
|
527
|
+
);
|
|
528
|
+
ctx.effect(() => () => {
|
|
529
|
+
clearTimeout(changeTimer);
|
|
530
|
+
submissions.clear();
|
|
531
|
+
completionMessages.clear();
|
|
532
|
+
engine.stopAll();
|
|
533
|
+
for (const res of streams) res.end();
|
|
534
|
+
streams.clear();
|
|
535
|
+
});
|
|
536
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/** 同一运行投影供 Hub / 工具卡 / 右侧时间线 / 完成卡消费。 */
|
|
2
|
+
export function projectRun(
|
|
3
|
+
record,
|
|
4
|
+
nodes,
|
|
5
|
+
actors,
|
|
6
|
+
events,
|
|
7
|
+
core = {},
|
|
8
|
+
extras = {},
|
|
9
|
+
) {
|
|
10
|
+
const eventValues = events.map((e) => e.event);
|
|
11
|
+
const born = new Map(
|
|
12
|
+
eventValues
|
|
13
|
+
.filter((e) => e.instance && e.phaseName)
|
|
14
|
+
.map((e) => [`${e.instance.siteId}@${e.instance.ordinal}`, e.phaseName]),
|
|
15
|
+
);
|
|
16
|
+
const staticPhases = core.trace?.phases ?? [];
|
|
17
|
+
const phases = staticPhases.map((p) => ({ id: p.id, name: p.name }));
|
|
18
|
+
for (const e of eventValues)
|
|
19
|
+
if (e.type === "phase-entered" && !phases.some((p) => p.name === e.name))
|
|
20
|
+
phases.push({ id: e.name, name: e.name });
|
|
21
|
+
if (!phases.length && (actors.length || nodes.length))
|
|
22
|
+
phases.push({ id: "unphased", name: "工作流" });
|
|
23
|
+
const issued = (core.trace?.events ?? []).filter((e) => e.at === "issue");
|
|
24
|
+
const staticActors = new Map(
|
|
25
|
+
(core.sites?.actors ?? []).map((a) => [a.id, a]),
|
|
26
|
+
);
|
|
27
|
+
const relations = new Map(core.facts?.askActor ?? []);
|
|
28
|
+
const phaseForSite = new Map(
|
|
29
|
+
issued.map((e) => [e.step, phases.find((p) => p.id === e.phase)?.name]),
|
|
30
|
+
);
|
|
31
|
+
const current = eventValues
|
|
32
|
+
.filter((e) => e.type === "phase-entered")
|
|
33
|
+
.at(-1)?.name;
|
|
34
|
+
const mappedNodes = nodes.map((n) => ({
|
|
35
|
+
...n,
|
|
36
|
+
phaseName:
|
|
37
|
+
born.get(`${n.siteId}@${n.ordinal}`) ??
|
|
38
|
+
phaseForSite.get(n.siteId) ??
|
|
39
|
+
phases[0]?.name,
|
|
40
|
+
}));
|
|
41
|
+
const activeRun = record.status === "running";
|
|
42
|
+
const renderedPhases = phases.map((p) => {
|
|
43
|
+
const work = mappedNodes.filter(
|
|
44
|
+
(n) =>
|
|
45
|
+
n.phaseName === p.name &&
|
|
46
|
+
["ask", "world-read", "world-run"].includes(n.kind),
|
|
47
|
+
);
|
|
48
|
+
const askSites = issued.filter((e) => e.phase === p.id).map((e) => e.step);
|
|
49
|
+
const actorIds = new Set(
|
|
50
|
+
askSites.flatMap((s) => (relations.get(s) ?? []).map((a) => a.site)),
|
|
51
|
+
);
|
|
52
|
+
work.forEach((n) => {
|
|
53
|
+
if (n.actorSiteId) actorIds.add(n.actorSiteId);
|
|
54
|
+
});
|
|
55
|
+
const participants = [...actorIds].flatMap((id) => {
|
|
56
|
+
const actual = actors.filter((a) => a.siteId === id);
|
|
57
|
+
return (
|
|
58
|
+
actual.length
|
|
59
|
+
? actual
|
|
60
|
+
: [{ siteId: id, name: staticActors.get(id)?.name ?? "子代理" }]
|
|
61
|
+
).map((a) => {
|
|
62
|
+
const tasks = work.filter(
|
|
63
|
+
(n) =>
|
|
64
|
+
n.actorSiteId === id &&
|
|
65
|
+
(a.ordinal === undefined || n.actorOrdinal === a.ordinal),
|
|
66
|
+
);
|
|
67
|
+
const state = tasks.some((n) => n.status === "failed")
|
|
68
|
+
? "errored"
|
|
69
|
+
: tasks.some((n) => n.status === "running")
|
|
70
|
+
? activeRun
|
|
71
|
+
? "running"
|
|
72
|
+
: record.status
|
|
73
|
+
: tasks.length
|
|
74
|
+
? "completed"
|
|
75
|
+
: "pending";
|
|
76
|
+
return {
|
|
77
|
+
...a,
|
|
78
|
+
id: `${id}@${a.ordinal ?? 0}`,
|
|
79
|
+
status: state,
|
|
80
|
+
tasks: tasks.length,
|
|
81
|
+
completed: tasks.filter((n) => n.status === "completed").length,
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
const entered = eventValues.filter(
|
|
86
|
+
(e) => e.type === "phase-entered" && e.name === p.name,
|
|
87
|
+
);
|
|
88
|
+
const completed = work.filter((n) => n.status === "completed").length;
|
|
89
|
+
const state = work.some((n) => n.status === "failed")
|
|
90
|
+
? "errored"
|
|
91
|
+
: work.some((n) => n.status === "running")
|
|
92
|
+
? activeRun
|
|
93
|
+
? "running"
|
|
94
|
+
: record.status
|
|
95
|
+
: work.length
|
|
96
|
+
? "completed"
|
|
97
|
+
: entered.length && record.status === "completed"
|
|
98
|
+
? "completed"
|
|
99
|
+
: p.name === current && activeRun
|
|
100
|
+
? "running"
|
|
101
|
+
: "pending";
|
|
102
|
+
return {
|
|
103
|
+
...p,
|
|
104
|
+
actors: participants,
|
|
105
|
+
nodes: work,
|
|
106
|
+
completed,
|
|
107
|
+
total: Math.max(work.length, askSites.length),
|
|
108
|
+
status: state,
|
|
109
|
+
rounds: entered.length,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
const published = new Map();
|
|
113
|
+
for (const e of eventValues)
|
|
114
|
+
if (e.type === "artifact-published")
|
|
115
|
+
published.set(e.artifact.id, e.artifact);
|
|
116
|
+
const first = events[0]?.timeCreated;
|
|
117
|
+
const terminal = events
|
|
118
|
+
.filter((e) => e.event.type === "run-settled")
|
|
119
|
+
.at(-1)?.timeCreated;
|
|
120
|
+
return {
|
|
121
|
+
...record,
|
|
122
|
+
scriptText: undefined,
|
|
123
|
+
...extras,
|
|
124
|
+
phases: renderedPhases,
|
|
125
|
+
actors,
|
|
126
|
+
nodes: mappedNodes,
|
|
127
|
+
startedAt: first,
|
|
128
|
+
finishedAt:
|
|
129
|
+
record.status === "running"
|
|
130
|
+
? undefined
|
|
131
|
+
: (terminal ?? events.at(-1)?.timeCreated),
|
|
132
|
+
activePhase: current,
|
|
133
|
+
artifacts: [...published.values()].sort(
|
|
134
|
+
(a, b) => Number(Boolean(b.primary)) - Number(Boolean(a.primary)),
|
|
135
|
+
),
|
|
136
|
+
reports: nodes
|
|
137
|
+
.filter((n) => n.kind === "report")
|
|
138
|
+
.map((n) => ({ item: n.result, artifactId: n.artifactId })),
|
|
139
|
+
activeActors: new Set(
|
|
140
|
+
mappedNodes
|
|
141
|
+
.filter((n) => n.kind === "ask" && n.status === "running" && activeRun)
|
|
142
|
+
.map((n) => `${n.actorSiteId}@${n.actorOrdinal}`),
|
|
143
|
+
).size,
|
|
144
|
+
resumable:
|
|
145
|
+
record.status === "stopped" && record.stopReason !== "superseded",
|
|
146
|
+
figures: {
|
|
147
|
+
subagents: actors.length,
|
|
148
|
+
phases: phases.length || undefined,
|
|
149
|
+
tokens:
|
|
150
|
+
Math.max(
|
|
151
|
+
Number(record.spentTokens) || 0,
|
|
152
|
+
nodes.reduce((sum, n) => sum + (Number(n.stats?.tokens) || 0), 0),
|
|
153
|
+
) || undefined,
|
|
154
|
+
durationMs: first
|
|
155
|
+
? (terminal ?? events.at(-1)?.timeCreated ?? first) - first
|
|
156
|
+
: undefined,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|