@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -2
- package/cordis.patch.yml +17 -0
- package/lib/client.js +14708 -0
- package/lib/core.js +137 -0
- package/lib/engine-adapter.js +1387 -0
- package/lib/host-driver.js +298 -0
- package/lib/index.js +536 -0
- package/lib/projection.js +159 -0
- package/lib/registry.js +218 -0
- package/lib/session-records.js +54 -0
- package/lib/submission-commit.js +34 -0
- package/lib/world-driver.js +275 -0
- package/package.json +64 -4
- package/vendor/PROVENANCE.md +9 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.js +95 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-models.js +208 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-names.js +155 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts +63 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/analyze.js +92 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts +21 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/array-methods.js +132 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.js +114 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts +67 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifacts.js +263 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts +42 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/assign.js +287 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/callbacks.js +133 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts +40 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/calls.js +495 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts +25 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.js +161 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts +163 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.js +8 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.js +530 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts +29 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.js +266 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.js +116 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.js +148 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.js +263 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts +110 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.js +162 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts +79 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.js +154 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts +174 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.js +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts +17 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.js +282 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order.js +110 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.js +198 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/classes.js +264 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/constants.js +23 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/control-flow.js +132 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core-json.js +49 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts +194 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core.js +204 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts +269 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/domain.js +523 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.js +350 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts +11 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.js +121 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts +113 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.js +411 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.js +104 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.js +47 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.js +33 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/graph.js +199 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts +48 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.js +0 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts +14 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.js +70 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-id.js +41 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.js +215 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.js +100 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/interpret.js +200 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts +18 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/literals.js +125 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/mermaid.js +477 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts +31 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/patterns.js +94 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.js +334 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts +24 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phases.js +54 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts +52 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.js +123 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts +12 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/relays.js +78 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts +125 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/serialize.js +321 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/site-phases.js +69 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.js +189 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts +267 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites.js +225 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts +254 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/state.js +569 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts +97 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/taint.js +649 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts +100 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/types.js +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts +27 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.js +44 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts +59 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/compile.js +159 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts +3 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.js +64 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts +26 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.js +173 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts +54 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.js +19 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts +28 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.js +35 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts +151 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/concurrency.js +282 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts +17 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.js +29 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts +55 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.js +367 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts +90 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-config.js +6 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts +116 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-holes.js +142 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts +34 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-launch.js +26 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.js +74 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts +27 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-report.js +151 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts +18 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-resume.js +38 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts +30 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.js +79 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts +99 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-state.js +13 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts +36 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-world.js +189 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts +263 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine.js +602 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts +87 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/errors.js +56 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.js +15 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts +16 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash.js +48 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.js +6 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts +127 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache.js +244 -0
- package/vendor/dynamic-workflow/engine/index.d.ts +11 -0
- package/vendor/dynamic-workflow/engine/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/index.js +10 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts +32 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-memory.js +243 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts +72 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.js +28 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts +20 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/persona.js +43 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/replay-order.js +229 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/run-terminal.js +7 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts +22 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.js +84 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts +105 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.js +17 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts +113 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler.js +484 -0
- package/vendor/dynamic-workflow/engine/types.d.ts +979 -0
- package/vendor/dynamic-workflow/engine/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/types.js +26 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/world-read-input.js +55 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts +48 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.js +47 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-hole.js +26 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts +11 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-model.js +18 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts +15 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-stream.js +41 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts +29 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts.js +324 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts +218 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/registry.js +203 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts +40 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/report-caps.js +39 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts +37 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.js +36 -0
- package/vendor/dynamic-workflow/index.d.ts +41 -0
- package/vendor/dynamic-workflow/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/index.js +51 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts +2 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/index.js +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.js +63 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts +82 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower.js +333 -0
- package/vendor/dynamic-workflow/projections.d.ts +26 -0
- package/vendor/dynamic-workflow/projections.d.ts.map +1 -0
- package/vendor/dynamic-workflow/projections.js +23 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts +49 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.js +69 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts +55 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/emit.js +325 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts +10 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/jsdoc.js +83 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts +8 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/serialize.js +20 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts +48 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/synthesize.js +138 -0
- package/vendor/dynamic-workflow/schema/types.d.ts +67 -0
- package/vendor/dynamic-workflow/schema/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/types.js +18 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts +15 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/validate.js +213 -0
- package/vendor/dynamic-workflow/testing/index.d.ts +6 -0
- package/vendor/dynamic-workflow/testing/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/index.js +5 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.js +195 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.js +163 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.js +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.js +46 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.js +234 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts +11 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.js +281 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.js +396 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.js +82 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts +15 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract.js +31 -0
- package/vendor/dynamic-workflow-runtime/child-cell-streams.js +128 -0
- package/vendor/dynamic-workflow-runtime/child-entry-file.js +43 -0
- package/vendor/dynamic-workflow-runtime/child-source.js +299 -0
- package/vendor/dynamic-workflow-runtime/harness.js +302 -0
- package/vendor/dynamic-workflow-runtime/index.js +4 -0
- package/vendor/dynamic-workflow-runtime/protocol.js +2 -0
- package/vendor/mcode-host/dynamic-workflow-import.js +269 -0
- package/vendor/mcode-host/workflow-git-world-read.js +183 -0
- package/vendor/mcode-host/workflow-world-read.js +282 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { JsonSchema } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* 类型 → JSON Schema 的发射器(emitter),由 checker 的结构化视图驱动(泛型/别名/
|
|
5
|
+
* mapped/conditional 都已被 checker 展平)。
|
|
6
|
+
*
|
|
7
|
+
* 递归类型通过 `$defs`/`$ref` 表达:只有真正被自身(在合成栈上)再次引用到的类型才会
|
|
8
|
+
* 被提升为 def,非递归的具名类型仍就地内联,保证快照可读。识别办法是给每个复合类型
|
|
9
|
+
* 压一个栈帧,若发射其子树时再次进入同一 `ts.Type`,就把它标记为 requested 并返回
|
|
10
|
+
* `$ref`;栈帧结束时若被 requested 过,则登记进 defs。
|
|
11
|
+
*
|
|
12
|
+
* 不可 JSON 序列化的类型以 {@link SchemaRejection} 抛出,由合成侧转成定位到 ask 站点的
|
|
13
|
+
* 诊断(复用分析管线的诊断形状/UX)。
|
|
14
|
+
*/
|
|
15
|
+
/** 发射失败:携带原因与出错的 JSON 路径,供合成侧组装成定位诊断。 */
|
|
16
|
+
export declare class SchemaRejection extends Error {
|
|
17
|
+
readonly reason: string;
|
|
18
|
+
readonly path: string;
|
|
19
|
+
constructor(reason: string, path: string);
|
|
20
|
+
}
|
|
21
|
+
export declare class SchemaEmitter {
|
|
22
|
+
private readonly checker;
|
|
23
|
+
private readonly location;
|
|
24
|
+
private readonly defs;
|
|
25
|
+
private readonly inProgress;
|
|
26
|
+
private readonly defName;
|
|
27
|
+
private readonly usedNames;
|
|
28
|
+
constructor(checker: ts.TypeChecker, location: ts.Node);
|
|
29
|
+
/** 发射顶层类型;若过程中产生了 def,则把 `$defs` 挂到根 schema 上。 */
|
|
30
|
+
emitTop(type: ts.Type): JsonSchema;
|
|
31
|
+
private emit;
|
|
32
|
+
/** 复合类型的栈帧包装:发射期间若被自身再次引用则提升为 def 并返回 `$ref`。 */
|
|
33
|
+
private composite;
|
|
34
|
+
/** 为一个类型分配稳定且唯一的 def 名(源自别名/符号名),惰性且去重。 */
|
|
35
|
+
private nameFor;
|
|
36
|
+
private booleanValue;
|
|
37
|
+
private emitUnion;
|
|
38
|
+
/** 一组成员类型 → enum(全为字面量时)或 anyOf。也被可选属性的去 undefined 路径复用。 */
|
|
39
|
+
emitMembers(members: readonly ts.Type[], path: string): JsonSchema;
|
|
40
|
+
/** 若所有成员都是字面量(string/number/boolean 字面量或 null),返回其取值数组。 */
|
|
41
|
+
private asLiterals;
|
|
42
|
+
/** 交叉类型:合并为一个 object(checker 已把成员属性合并到交叉类型上)。含原始类型成员
|
|
43
|
+
* 的品牌类型(如 `string & {__brand}`)按其原始类型发射。 */
|
|
44
|
+
private emitIntersection;
|
|
45
|
+
private emitObjectLike;
|
|
46
|
+
private emitObject;
|
|
47
|
+
/** 可选属性:从属性类型里剥掉 undefined 后再发射(可选性由 required 表达,不进类型)。 */
|
|
48
|
+
private emitOptional;
|
|
49
|
+
private emitArray;
|
|
50
|
+
private emitTuple;
|
|
51
|
+
private isArrayType;
|
|
52
|
+
private isTupleType;
|
|
53
|
+
private isThenable;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/schema/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAGxD;;;;;;;;;;;GAWG;AAEH,yCAAyC;AACzC,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAKxB;AAgDD,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4D;IACjF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;gBAG5B,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,QAAQ,EAAE,EAAE,CAAC,IAAI;IAGpC,kDAAkD;IAClD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,UAAU;IAQlC,OAAO,CAAC,IAAI;IAsCZ,iDAAiD;IACjD,OAAO,CAAC,SAAS;IAWjB,2CAA2C;IAC3C,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;IAgBjB,4DAA4D;IAC5D,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU;IAMlE,2DAA2D;IAC3D,OAAO,CAAC,UAAU;IAalB;iDAC6C;IAC7C,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,UAAU;IA0BlB,2DAA2D;IAC3D,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,UAAU;CAMnB"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { harvestConstraints, mergeConstraints } from "./jsdoc.js";
|
|
3
|
+
import { MAX_UNION_MEMBERS } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* 类型 → JSON Schema 的发射器(emitter),由 checker 的结构化视图驱动(泛型/别名/
|
|
6
|
+
* mapped/conditional 都已被 checker 展平)。
|
|
7
|
+
*
|
|
8
|
+
* 递归类型通过 `$defs`/`$ref` 表达:只有真正被自身(在合成栈上)再次引用到的类型才会
|
|
9
|
+
* 被提升为 def,非递归的具名类型仍就地内联,保证快照可读。识别办法是给每个复合类型
|
|
10
|
+
* 压一个栈帧,若发射其子树时再次进入同一 `ts.Type`,就把它标记为 requested 并返回
|
|
11
|
+
* `$ref`;栈帧结束时若被 requested 过,则登记进 defs。
|
|
12
|
+
*
|
|
13
|
+
* 不可 JSON 序列化的类型以 {@link SchemaRejection} 抛出,由合成侧转成定位到 ask 站点的
|
|
14
|
+
* 诊断(复用分析管线的诊断形状/UX)。
|
|
15
|
+
*/
|
|
16
|
+
/** 发射失败:携带原因与出错的 JSON 路径,供合成侧组装成定位诊断。 */
|
|
17
|
+
export class SchemaRejection extends Error {
|
|
18
|
+
reason;
|
|
19
|
+
path;
|
|
20
|
+
constructor(reason, path) {
|
|
21
|
+
super(reason);
|
|
22
|
+
this.reason = reason;
|
|
23
|
+
this.path = path;
|
|
24
|
+
this.name = "SchemaRejection";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 明确按名字拒绝的内建对象:它们是宿主对象/类实例,不是纯数据。Promise 也在此列,
|
|
29
|
+
* 给出比“函数类型”更清晰的诊断。用户自定义 class 由 SymbolFlags.Class 兜底。
|
|
30
|
+
*/
|
|
31
|
+
const REJECTED_BUILTINS = new Set([
|
|
32
|
+
"Date",
|
|
33
|
+
"RegExp",
|
|
34
|
+
"Map",
|
|
35
|
+
"WeakMap",
|
|
36
|
+
"ReadonlyMap",
|
|
37
|
+
"Set",
|
|
38
|
+
"WeakSet",
|
|
39
|
+
"ReadonlySet",
|
|
40
|
+
"Promise",
|
|
41
|
+
"Error",
|
|
42
|
+
"EvalError",
|
|
43
|
+
"RangeError",
|
|
44
|
+
"ReferenceError",
|
|
45
|
+
"SyntaxError",
|
|
46
|
+
"TypeError",
|
|
47
|
+
"URIError",
|
|
48
|
+
"ArrayBuffer",
|
|
49
|
+
"SharedArrayBuffer",
|
|
50
|
+
"DataView",
|
|
51
|
+
"Int8Array",
|
|
52
|
+
"Uint8Array",
|
|
53
|
+
"Uint8ClampedArray",
|
|
54
|
+
"Int16Array",
|
|
55
|
+
"Uint16Array",
|
|
56
|
+
"Int32Array",
|
|
57
|
+
"Uint32Array",
|
|
58
|
+
"Float32Array",
|
|
59
|
+
"Float64Array",
|
|
60
|
+
"BigInt64Array",
|
|
61
|
+
"BigUint64Array",
|
|
62
|
+
]);
|
|
63
|
+
/** 读取对象类型的 objectFlags(`ts.getObjectFlags` 未在公有 typings 暴露,这里直接取)。 */
|
|
64
|
+
function objectFlagsOf(type) {
|
|
65
|
+
return (type.flags & ts.TypeFlags.Object) !== 0 ? type.objectFlags : 0;
|
|
66
|
+
}
|
|
67
|
+
export class SchemaEmitter {
|
|
68
|
+
checker;
|
|
69
|
+
location;
|
|
70
|
+
defs = new Map();
|
|
71
|
+
inProgress = new Map();
|
|
72
|
+
defName = new Map();
|
|
73
|
+
usedNames = new Set();
|
|
74
|
+
constructor(checker, location) {
|
|
75
|
+
this.checker = checker;
|
|
76
|
+
this.location = location;
|
|
77
|
+
}
|
|
78
|
+
/** 发射顶层类型;若过程中产生了 def,则把 `$defs` 挂到根 schema 上。 */
|
|
79
|
+
emitTop(type) {
|
|
80
|
+
const schema = this.emit(type, "$");
|
|
81
|
+
if (this.defs.size === 0)
|
|
82
|
+
return schema;
|
|
83
|
+
const $defs = {};
|
|
84
|
+
for (const { name, schema: defSchema } of this.defs.values())
|
|
85
|
+
$defs[name] = defSchema;
|
|
86
|
+
return { ...schema, $defs };
|
|
87
|
+
}
|
|
88
|
+
emit(type, path) {
|
|
89
|
+
const settled = this.defs.get(type);
|
|
90
|
+
if (settled !== undefined)
|
|
91
|
+
return { $ref: `#/$defs/${settled.name}` };
|
|
92
|
+
const frame = this.inProgress.get(type);
|
|
93
|
+
if (frame !== undefined) {
|
|
94
|
+
frame.requested = true;
|
|
95
|
+
return { $ref: `#/$defs/${this.nameFor(type)}` };
|
|
96
|
+
}
|
|
97
|
+
const flags = type.flags;
|
|
98
|
+
if (flags & ts.TypeFlags.Any) {
|
|
99
|
+
throw new SchemaRejection("type 'any' is not allowed; use 'unknown' or a concrete type", path);
|
|
100
|
+
}
|
|
101
|
+
if (flags & ts.TypeFlags.Unknown)
|
|
102
|
+
return {};
|
|
103
|
+
if (flags & ts.TypeFlags.Never)
|
|
104
|
+
throw new SchemaRejection("type 'never' cannot be represented", path);
|
|
105
|
+
if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) {
|
|
106
|
+
throw new SchemaRejection("'undefined' is only allowed on optional properties", path);
|
|
107
|
+
}
|
|
108
|
+
if (flags & ts.TypeFlags.Null)
|
|
109
|
+
return { type: "null" };
|
|
110
|
+
if (flags & ts.TypeFlags.BooleanLiteral)
|
|
111
|
+
return { const: this.booleanValue(type) };
|
|
112
|
+
if (flags & ts.TypeFlags.Boolean)
|
|
113
|
+
return { type: "boolean" };
|
|
114
|
+
if (flags & ts.TypeFlags.StringLiteral)
|
|
115
|
+
return { const: type.value };
|
|
116
|
+
if (flags & ts.TypeFlags.NumberLiteral)
|
|
117
|
+
return { const: type.value };
|
|
118
|
+
if (flags & ts.TypeFlags.String)
|
|
119
|
+
return { type: "string" };
|
|
120
|
+
if (flags & ts.TypeFlags.Number)
|
|
121
|
+
return { type: "number" };
|
|
122
|
+
if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {
|
|
123
|
+
throw new SchemaRejection("'bigint' is not JSON-serializable", path);
|
|
124
|
+
}
|
|
125
|
+
if (flags & (ts.TypeFlags.ESSymbol | ts.TypeFlags.UniqueESSymbol)) {
|
|
126
|
+
throw new SchemaRejection("'symbol' is not JSON-serializable", path);
|
|
127
|
+
}
|
|
128
|
+
if (type.isUnion())
|
|
129
|
+
return this.composite(type, () => this.emitUnion(type, path));
|
|
130
|
+
if (type.isIntersection())
|
|
131
|
+
return this.composite(type, () => this.emitIntersection(type, path));
|
|
132
|
+
if (flags & ts.TypeFlags.Object)
|
|
133
|
+
return this.composite(type, () => this.emitObjectLike(type, path));
|
|
134
|
+
throw new SchemaRejection("type is not JSON-serializable", path);
|
|
135
|
+
}
|
|
136
|
+
/** 复合类型的栈帧包装:发射期间若被自身再次引用则提升为 def 并返回 `$ref`。 */
|
|
137
|
+
composite(type, build) {
|
|
138
|
+
this.inProgress.set(type, { requested: false });
|
|
139
|
+
const schema = build();
|
|
140
|
+
const frame = this.inProgress.get(type);
|
|
141
|
+
this.inProgress.delete(type);
|
|
142
|
+
if (!frame.requested)
|
|
143
|
+
return schema;
|
|
144
|
+
const name = this.nameFor(type);
|
|
145
|
+
this.defs.set(type, { name, schema });
|
|
146
|
+
return { $ref: `#/$defs/${name}` };
|
|
147
|
+
}
|
|
148
|
+
/** 为一个类型分配稳定且唯一的 def 名(源自别名/符号名),惰性且去重。 */
|
|
149
|
+
nameFor(type) {
|
|
150
|
+
const cached = this.defName.get(type);
|
|
151
|
+
if (cached !== undefined)
|
|
152
|
+
return cached;
|
|
153
|
+
const base = type.aliasSymbol?.name ?? type.getSymbol()?.name ?? "Schema";
|
|
154
|
+
let name = base;
|
|
155
|
+
let suffix = 1;
|
|
156
|
+
while (this.usedNames.has(name)) {
|
|
157
|
+
suffix += 1;
|
|
158
|
+
name = `${base}${suffix}`;
|
|
159
|
+
}
|
|
160
|
+
this.usedNames.add(name);
|
|
161
|
+
this.defName.set(type, name);
|
|
162
|
+
return name;
|
|
163
|
+
}
|
|
164
|
+
booleanValue(type) {
|
|
165
|
+
return type.intrinsicName === "true";
|
|
166
|
+
}
|
|
167
|
+
emitUnion(type, path) {
|
|
168
|
+
const members = type.types;
|
|
169
|
+
if (members.length > MAX_UNION_MEMBERS) {
|
|
170
|
+
throw new SchemaRejection(`union has too many members (${members.length} > ${MAX_UNION_MEMBERS})`, path);
|
|
171
|
+
}
|
|
172
|
+
for (const member of members) {
|
|
173
|
+
if (member.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) {
|
|
174
|
+
throw new SchemaRejection("'undefined' is only allowed on optional properties", path);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return this.emitMembers(members, path);
|
|
178
|
+
}
|
|
179
|
+
/** 一组成员类型 → enum(全为字面量时)或 anyOf。也被可选属性的去 undefined 路径复用。 */
|
|
180
|
+
emitMembers(members, path) {
|
|
181
|
+
const literals = this.asLiterals(members);
|
|
182
|
+
if (literals !== undefined)
|
|
183
|
+
return { enum: literals };
|
|
184
|
+
return { anyOf: members.map((member, index) => this.emit(member, `${path}|${index}`)) };
|
|
185
|
+
}
|
|
186
|
+
/** 若所有成员都是字面量(string/number/boolean 字面量或 null),返回其取值数组。 */
|
|
187
|
+
asLiterals(members) {
|
|
188
|
+
const values = [];
|
|
189
|
+
for (const member of members) {
|
|
190
|
+
const flags = member.flags;
|
|
191
|
+
if (flags & ts.TypeFlags.StringLiteral)
|
|
192
|
+
values.push(member.value);
|
|
193
|
+
else if (flags & ts.TypeFlags.NumberLiteral)
|
|
194
|
+
values.push(member.value);
|
|
195
|
+
else if (flags & ts.TypeFlags.BooleanLiteral)
|
|
196
|
+
values.push(this.booleanValue(member));
|
|
197
|
+
else if (flags & ts.TypeFlags.Null)
|
|
198
|
+
values.push(null);
|
|
199
|
+
else
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
return values;
|
|
203
|
+
}
|
|
204
|
+
/** 交叉类型:合并为一个 object(checker 已把成员属性合并到交叉类型上)。含原始类型成员
|
|
205
|
+
* 的品牌类型(如 `string & {__brand}`)按其原始类型发射。 */
|
|
206
|
+
emitIntersection(type, path) {
|
|
207
|
+
for (const member of type.types) {
|
|
208
|
+
if (member.flags & ts.TypeFlags.String)
|
|
209
|
+
return { type: "string" };
|
|
210
|
+
if (member.flags & ts.TypeFlags.Number)
|
|
211
|
+
return { type: "number" };
|
|
212
|
+
if (member.flags & ts.TypeFlags.Boolean)
|
|
213
|
+
return { type: "boolean" };
|
|
214
|
+
}
|
|
215
|
+
if (type.getCallSignatures().length > 0) {
|
|
216
|
+
throw new SchemaRejection("function types are not JSON-serializable", path);
|
|
217
|
+
}
|
|
218
|
+
return this.emitObject(type, path);
|
|
219
|
+
}
|
|
220
|
+
emitObjectLike(type, path) {
|
|
221
|
+
if (this.isArrayType(type))
|
|
222
|
+
return this.emitArray(type, path);
|
|
223
|
+
if (this.isTupleType(type))
|
|
224
|
+
return this.emitTuple(type, path);
|
|
225
|
+
if (type.getCallSignatures().length > 0 || type.getConstructSignatures().length > 0) {
|
|
226
|
+
throw new SchemaRejection("function types are not JSON-serializable", path);
|
|
227
|
+
}
|
|
228
|
+
const name = type.getSymbol()?.getName();
|
|
229
|
+
if (name !== undefined && REJECTED_BUILTINS.has(name)) {
|
|
230
|
+
throw new SchemaRejection(`'${name}' is not JSON-serializable`, path);
|
|
231
|
+
}
|
|
232
|
+
if (((type.getSymbol()?.flags ?? 0) & ts.SymbolFlags.Class) !== 0) {
|
|
233
|
+
throw new SchemaRejection("class instances are not JSON-serializable", path);
|
|
234
|
+
}
|
|
235
|
+
if (this.isThenable(type)) {
|
|
236
|
+
throw new SchemaRejection("Promise/thenable values are not JSON-serializable", path);
|
|
237
|
+
}
|
|
238
|
+
return this.emitObject(type, path);
|
|
239
|
+
}
|
|
240
|
+
emitObject(type, path) {
|
|
241
|
+
const properties = {};
|
|
242
|
+
const required = [];
|
|
243
|
+
for (const prop of this.checker.getPropertiesOfType(type)) {
|
|
244
|
+
const optional = (prop.flags & ts.SymbolFlags.Optional) !== 0;
|
|
245
|
+
const propPath = `${path}.${prop.name}`;
|
|
246
|
+
const propType = this.checker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration ?? this.location);
|
|
247
|
+
const base = optional ? this.emitOptional(propType, propPath) : this.emit(propType, propPath);
|
|
248
|
+
properties[prop.name] = mergeConstraints(base, harvestConstraints(prop, this.checker));
|
|
249
|
+
if (!optional)
|
|
250
|
+
required.push(prop.name);
|
|
251
|
+
}
|
|
252
|
+
const schema = { type: "object" };
|
|
253
|
+
if (Object.keys(properties).length > 0)
|
|
254
|
+
schema.properties = properties;
|
|
255
|
+
if (required.length > 0)
|
|
256
|
+
schema.required = required;
|
|
257
|
+
// 闭合对象(无字符串索引签名)发射 additionalProperties: false。
|
|
258
|
+
// 注意这不是「忠于 TS」:TS 的对象类型在结构上是开放的(多余属性检查只对对象字面量
|
|
259
|
+
// 触发),`{a: string}` 本身接受多余键。这里选 false 的真正理由是校验 UX 与结构化
|
|
260
|
+
// 输出惯例:模型给出多余键几乎总是误解的信号,false 能把它变成一条清晰的修复提示,
|
|
261
|
+
// 也符合严格结构化输出的通行做法。带字符串索引签名(Record<string,T>)则用其值 schema。
|
|
262
|
+
const indexInfo = this.checker.getIndexInfoOfType(type, ts.IndexKind.String);
|
|
263
|
+
schema.additionalProperties = indexInfo !== undefined ? this.emit(indexInfo.type, `${path}[*]`) : false;
|
|
264
|
+
return schema;
|
|
265
|
+
}
|
|
266
|
+
/** 可选属性:从属性类型里剥掉 undefined 后再发射(可选性由 required 表达,不进类型)。 */
|
|
267
|
+
emitOptional(propType, path) {
|
|
268
|
+
if (!propType.isUnion())
|
|
269
|
+
return this.emit(propType, path);
|
|
270
|
+
const rest = propType.types.filter((member) => (member.flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) === 0);
|
|
271
|
+
if (rest.length === propType.types.length)
|
|
272
|
+
return this.emit(propType, path);
|
|
273
|
+
if (rest.length === 1)
|
|
274
|
+
return this.emit(rest[0], path);
|
|
275
|
+
return this.emitMembers(rest, path);
|
|
276
|
+
}
|
|
277
|
+
emitArray(type, path) {
|
|
278
|
+
const element = this.checker.getTypeArguments(type)[0];
|
|
279
|
+
const items = element !== undefined ? this.emit(element, `${path}[]`) : {};
|
|
280
|
+
return { type: "array", items };
|
|
281
|
+
}
|
|
282
|
+
emitTuple(type, path) {
|
|
283
|
+
const elementFlags = type.target.elementFlags;
|
|
284
|
+
const args = this.checker.getTypeArguments(type);
|
|
285
|
+
const prefixItems = [];
|
|
286
|
+
let minItems = 0;
|
|
287
|
+
let restItems;
|
|
288
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
289
|
+
const flag = elementFlags[index] ?? ts.ElementFlags.Required;
|
|
290
|
+
const arg = args[index];
|
|
291
|
+
if (flag & ts.ElementFlags.Rest) {
|
|
292
|
+
restItems = this.emit(arg, `${path}[${index}]`);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const optional = (flag & ts.ElementFlags.Optional) !== 0;
|
|
296
|
+
prefixItems.push(optional ? this.emitOptional(arg, `${path}[${index}]`) : this.emit(arg, `${path}[${index}]`));
|
|
297
|
+
if (flag & ts.ElementFlags.Required)
|
|
298
|
+
minItems += 1;
|
|
299
|
+
}
|
|
300
|
+
const schema = { type: "array", prefixItems, minItems };
|
|
301
|
+
if (restItems !== undefined)
|
|
302
|
+
schema.items = restItems;
|
|
303
|
+
else
|
|
304
|
+
schema.maxItems = prefixItems.length;
|
|
305
|
+
return schema;
|
|
306
|
+
}
|
|
307
|
+
isArrayType(type) {
|
|
308
|
+
if ((objectFlagsOf(type) & ts.ObjectFlags.Reference) === 0)
|
|
309
|
+
return false;
|
|
310
|
+
const name = type.target.getSymbol()?.getName();
|
|
311
|
+
return name === "Array" || name === "ReadonlyArray";
|
|
312
|
+
}
|
|
313
|
+
isTupleType(type) {
|
|
314
|
+
if ((objectFlagsOf(type) & ts.ObjectFlags.Reference) === 0)
|
|
315
|
+
return false;
|
|
316
|
+
return ((type.target.objectFlags ?? 0) & ts.ObjectFlags.Tuple) !== 0;
|
|
317
|
+
}
|
|
318
|
+
isThenable(type) {
|
|
319
|
+
const then = this.checker.getPropertyOfType(type, "then");
|
|
320
|
+
if (then === undefined)
|
|
321
|
+
return false;
|
|
322
|
+
const thenType = this.checker.getTypeOfSymbolAtLocation(then, then.valueDeclaration ?? this.location);
|
|
323
|
+
return thenType.getCallSignatures().length > 0;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { JsonSchema } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* 采集一个符号上的 description 与约束标签,返回一个只含相关关键字的 schema 片段,
|
|
5
|
+
* 供合成侧合并进该符号对应的 schema。
|
|
6
|
+
*/
|
|
7
|
+
export declare function harvestConstraints(symbol: ts.Symbol, checker: ts.TypeChecker): Partial<JsonSchema>;
|
|
8
|
+
/** 把采集到的片段合并进已有 schema:约束关键字补充上去,description 不覆盖已有值。 */
|
|
9
|
+
export declare function mergeConstraints(schema: JsonSchema, extra: Partial<JsonSchema>): JsonSchema;
|
|
10
|
+
//# sourceMappingURL=jsdoc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsdoc.d.ts","sourceRoot":"","sources":["../../src/schema/jsdoc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AA+BxD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAQlG;AAkCD,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAQ3F"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
/**
|
|
3
|
+
* JSDoc 采集:把符号(interface 成员、类型别名、ask 结果类型)上的文档注释与受支持的
|
|
4
|
+
* 约束标签抽成 JSON Schema 片段。
|
|
5
|
+
*
|
|
6
|
+
* - 文档正文 → `description`。
|
|
7
|
+
* - 标签子集 → 约束关键字:`@minimum @maximum @exclusiveMinimum @exclusiveMaximum
|
|
8
|
+
* @minLength @maxLength @pattern @format @minItems @maxItems @default`。
|
|
9
|
+
*
|
|
10
|
+
* 子集之外的标签被静默忽略(不是错误)。
|
|
11
|
+
*/
|
|
12
|
+
/** 取数值的标签 → 对应的数值型关键字名。 */
|
|
13
|
+
const NUMERIC_TAGS = {
|
|
14
|
+
exclusiveMaximum: "exclusiveMaximum",
|
|
15
|
+
exclusiveMinimum: "exclusiveMinimum",
|
|
16
|
+
maximum: "maximum",
|
|
17
|
+
maxItems: "maxItems",
|
|
18
|
+
maxLength: "maxLength",
|
|
19
|
+
minimum: "minimum",
|
|
20
|
+
minItems: "minItems",
|
|
21
|
+
minLength: "minLength",
|
|
22
|
+
};
|
|
23
|
+
/** 取字符串的标签 → 对应的字符串型关键字名。 */
|
|
24
|
+
const STRING_TAGS = {
|
|
25
|
+
format: "format",
|
|
26
|
+
pattern: "pattern",
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* 采集一个符号上的 description 与约束标签,返回一个只含相关关键字的 schema 片段,
|
|
30
|
+
* 供合成侧合并进该符号对应的 schema。
|
|
31
|
+
*/
|
|
32
|
+
export function harvestConstraints(symbol, checker) {
|
|
33
|
+
const out = {};
|
|
34
|
+
const doc = ts.displayPartsToString(symbol.getDocumentationComment(checker)).trim();
|
|
35
|
+
if (doc.length > 0)
|
|
36
|
+
out.description = doc;
|
|
37
|
+
for (const tag of symbol.getJsDocTags(checker))
|
|
38
|
+
applyTag(out, tag);
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
function applyTag(out, tag) {
|
|
42
|
+
const raw = ts.displayPartsToString(tag.text).trim();
|
|
43
|
+
const numericKey = NUMERIC_TAGS[tag.name];
|
|
44
|
+
if (numericKey !== undefined) {
|
|
45
|
+
const value = Number(raw);
|
|
46
|
+
if (Number.isFinite(value))
|
|
47
|
+
out[numericKey] = value;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const stringKey = STRING_TAGS[tag.name];
|
|
51
|
+
if (stringKey !== undefined) {
|
|
52
|
+
if (raw.length > 0)
|
|
53
|
+
out[stringKey] = raw;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (tag.name === "default") {
|
|
57
|
+
out.default = parseDefault(raw);
|
|
58
|
+
}
|
|
59
|
+
// 子集之外的标签:忽略。
|
|
60
|
+
}
|
|
61
|
+
/** `@default` 的值先按 JSON 解析(数字/布尔/对象/数组/带引号字符串),失败则当作裸字符串。 */
|
|
62
|
+
function parseDefault(raw) {
|
|
63
|
+
if (raw.length === 0)
|
|
64
|
+
return "";
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(raw);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return raw;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** 把采集到的片段合并进已有 schema:约束关键字补充上去,description 不覆盖已有值。 */
|
|
73
|
+
export function mergeConstraints(schema, extra) {
|
|
74
|
+
const merged = { ...schema };
|
|
75
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
76
|
+
if (value === undefined)
|
|
77
|
+
continue;
|
|
78
|
+
if (key === "description" && merged.description !== undefined)
|
|
79
|
+
continue;
|
|
80
|
+
merged[key] = value;
|
|
81
|
+
}
|
|
82
|
+
return merged;
|
|
83
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { JsonSchema } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* 确定性序列化:把 schema 的对象键递归排序后再 JSON.stringify,保证快照稳定,与发射
|
|
4
|
+
* 时的插入顺序无关。数组(enum/required/prefixItems/anyOf 等)保持原有顺序不动 ——
|
|
5
|
+
* 它们的顺序是有意义的(且由 checker 的属性/成员顺序确定)。
|
|
6
|
+
*/
|
|
7
|
+
export declare function serializeSchema(schema: JsonSchema): string;
|
|
8
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/schema/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 确定性序列化:把 schema 的对象键递归排序后再 JSON.stringify,保证快照稳定,与发射
|
|
3
|
+
* 时的插入顺序无关。数组(enum/required/prefixItems/anyOf 等)保持原有顺序不动 ——
|
|
4
|
+
* 它们的顺序是有意义的(且由 checker 的属性/成员顺序确定)。
|
|
5
|
+
*/
|
|
6
|
+
export function serializeSchema(schema) {
|
|
7
|
+
return `${JSON.stringify(canonicalize(schema), null, 2)}\n`;
|
|
8
|
+
}
|
|
9
|
+
function canonicalize(value) {
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.map(canonicalize);
|
|
12
|
+
if (value !== null && typeof value === "object") {
|
|
13
|
+
const sorted = {};
|
|
14
|
+
for (const key of Object.keys(value).sort()) {
|
|
15
|
+
sorted[key] = canonicalize(value[key]);
|
|
16
|
+
}
|
|
17
|
+
return sorted;
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CompileDiagnostic, WorkflowProgram } from "../compiler/compile.js";
|
|
2
|
+
import { type SiteTable } from "../analysis/sites.js";
|
|
3
|
+
import type { AskSpec } from "../engine/types.js";
|
|
4
|
+
import type { JsonSchema } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Schema 合成(编译侧):为每个「有类型」的 ask 站点,用 checker 的结构化视图把结果
|
|
7
|
+
* 类型 T 发射成纯 JSON Schema,按站点 id(如 `ask#1`)归档。
|
|
8
|
+
*
|
|
9
|
+
* 「有类型」判定:ask 显式带类型实参 `x.ask<T>(...)` 且 T 解析后不是原始 `string`。
|
|
10
|
+
* `ask()` 与 `ask<string>()` 都是「无类型」ask(结果即最终文本,不发射 schema)。
|
|
11
|
+
* 不可序列化的 T 以定位到 ask 站点的诊断拒绝(复用分析管线的 CompileDiagnostic 形状)。
|
|
12
|
+
*
|
|
13
|
+
* 同一趟里还检查 `report(item)` 的实参可序列化性——同一个发射器、同一条诊断通道,
|
|
14
|
+
* 理由见 {@link reportItemDiagnostics}。report 站点**不产出 schema**,只贡献诊断。
|
|
15
|
+
*/
|
|
16
|
+
export interface SchemaSynthesisResult {
|
|
17
|
+
/** 每个有类型 ask 站点的 JSON Schema,按站点 id 归档。 */
|
|
18
|
+
schemas: Record<string, JsonSchema>;
|
|
19
|
+
/** 拒绝性诊断,定位在对应 ask 站点。 */
|
|
20
|
+
diagnostics: CompileDiagnostic[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 核心入口:在构建站点表的同一 checker 上,为每个有类型 ask 发射 schema。与
|
|
24
|
+
* docs 中 `synthesizeAskSchemas(program, siteTable)` 对应,这里取 {@link WorkflowProgram}
|
|
25
|
+
* 以便拿到 `toScriptLoc` 做定位诊断。
|
|
26
|
+
*/
|
|
27
|
+
export declare function synthesizeAskSchemas(workflow: WorkflowProgram, table: SiteTable): SchemaSynthesisResult;
|
|
28
|
+
/**
|
|
29
|
+
* 便捷入口:从脚本文本一站式合成(typecheck → 站点表 → 合成)。给包内/引擎侧一个不必
|
|
30
|
+
* 自己拼装 program+table 的调用点;analyzeWorkflowScript 归 analysis 域所有,这里不触碰。
|
|
31
|
+
* 若脚本本身 typecheck 不通过,返回其编译诊断且不合成。
|
|
32
|
+
*/
|
|
33
|
+
export declare function synthesizeWorkflowSchemas(scriptText: string): SchemaSynthesisResult;
|
|
34
|
+
/**
|
|
35
|
+
* 把站点表与合成出的 schemas 组装成引擎的 `askSpecs`。
|
|
36
|
+
*
|
|
37
|
+
* **为什么按 `table.asks` 遍历而不是按 `schemas` 的键**:schemas 只为 typed 站点发射
|
|
38
|
+
* (untyped ask 的结果就是末轮文本,不发射 schema),而引擎要求 askSpecs 覆盖**每一个**
|
|
39
|
+
* ask 站点——站点缺席被当作接线错误硬失败(`MissingAskSpec`),因为站点表与 schema 合成
|
|
40
|
+
* 出自同一次编译,缺席只可能是两份产物被拼在了一起。所以 untyped 站点必须显式记为
|
|
41
|
+
* `{ typed: false }`,而不是靠"查不到就当 untyped"的兜底:那条兜底会把 typed ask 静默
|
|
42
|
+
* 降级——不注册 submit_result、拿末轮文本当结果、schema 校验整个消失。
|
|
43
|
+
*
|
|
44
|
+
* 这个构造是正确性关键且只有一种写法,因此收在这里一处:调用方(run service、测试装配)
|
|
45
|
+
* 一律用它,不要各自实现。站点表是身份的唯一真源——schemas 里对不上任何站点的键被忽略。
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildAskSpecs(table: SiteTable, schemas: Record<string, JsonSchema>): Map<string, AskSpec>;
|
|
48
|
+
//# sourceMappingURL=synthesize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesize.d.ts","sourceRoot":"","sources":["../../src/schema/synthesize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,0BAA0B;IAC1B,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAoBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,SAAS,GACf,qBAAqB,CA2BvB;AAwCD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAKnF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzG"}
|