@lingjingai/scriptctl 0.35.0 → 0.36.1
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 +21 -5
- package/changes/0.36.0.md +24 -0
- package/dist/bin.js +0 -0
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +52 -128
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +0 -16
- package/dist/common.js +2 -342
- package/dist/common.js.map +1 -1
- package/dist/domain/ingest/apply-plan.d.ts +23 -0
- package/dist/domain/ingest/apply-plan.js +210 -0
- package/dist/domain/ingest/apply-plan.js.map +1 -0
- package/dist/domain/ingest/assembler.d.ts +57 -0
- package/dist/domain/ingest/assembler.js +181 -0
- package/dist/domain/ingest/assembler.js.map +1 -0
- package/dist/domain/ingest/chunker.d.ts +9 -0
- package/dist/domain/ingest/chunker.js +38 -0
- package/dist/domain/ingest/chunker.js.map +1 -0
- package/dist/domain/ingest/evidence.d.ts +5 -0
- package/dist/domain/ingest/evidence.js +66 -0
- package/dist/domain/ingest/evidence.js.map +1 -0
- package/dist/domain/ingest/govern.d.ts +3 -0
- package/dist/domain/ingest/govern.js +127 -0
- package/dist/domain/ingest/govern.js.map +1 -0
- package/dist/domain/ingest/jsonl-parser.d.ts +6 -0
- package/dist/domain/ingest/jsonl-parser.js +187 -0
- package/dist/domain/ingest/jsonl-parser.js.map +1 -0
- package/dist/domain/ingest/markdown-parser.d.ts +6 -0
- package/dist/domain/ingest/markdown-parser.js +186 -0
- package/dist/domain/ingest/markdown-parser.js.map +1 -0
- package/dist/domain/ingest/records.d.ts +71 -0
- package/dist/domain/ingest/records.js +9 -0
- package/dist/domain/ingest/records.js.map +1 -0
- package/dist/domain/ingest/renumber.d.ts +14 -0
- package/dist/domain/ingest/renumber.js +130 -0
- package/dist/domain/ingest/renumber.js.map +1 -0
- package/dist/domain/ingest/script-v3.d.ts +94 -0
- package/dist/domain/ingest/script-v3.js +7 -0
- package/dist/domain/ingest/script-v3.js.map +1 -0
- package/dist/domain/ingest/state-reconcile.d.ts +11 -0
- package/dist/domain/ingest/state-reconcile.js +90 -0
- package/dist/domain/ingest/state-reconcile.js.map +1 -0
- package/dist/domain/ingest/validation.d.ts +11 -0
- package/dist/domain/ingest/validation.js +168 -0
- package/dist/domain/ingest/validation.js.map +1 -0
- package/dist/domain/ingest/video-aggregate.d.ts +23 -0
- package/dist/domain/ingest/video-aggregate.js +89 -0
- package/dist/domain/ingest/video-aggregate.js.map +1 -0
- package/dist/domain/ingest/video-apply.d.ts +37 -0
- package/dist/domain/ingest/video-apply.js +236 -0
- package/dist/domain/ingest/video-apply.js.map +1 -0
- package/dist/domain/ingest/video-md-parser.d.ts +2 -0
- package/dist/domain/ingest/video-md-parser.js +233 -0
- package/dist/domain/ingest/video-md-parser.js.map +1 -0
- package/dist/domain/ingest/video-records.d.ts +56 -0
- package/dist/domain/ingest/video-records.js +9 -0
- package/dist/domain/ingest/video-records.js.map +1 -0
- package/dist/domain/loom/index.d.ts +2 -1
- package/dist/domain/loom/index.js +12 -10
- package/dist/domain/loom/index.js.map +1 -1
- package/dist/domain/loom/types.d.ts +3 -2
- package/dist/domain/script/lookups.d.ts +3 -2
- package/dist/domain/script/lookups.js +25 -8
- package/dist/domain/script/lookups.js.map +1 -1
- package/dist/domain/script/patch/apply.js +2 -2
- package/dist/domain/script/patch/apply.js.map +1 -1
- package/dist/domain/script/patch/helpers.d.ts +3 -7
- package/dist/domain/script/patch/helpers.js +23 -96
- package/dist/domain/script/patch/helpers.js.map +1 -1
- package/dist/domain/script/patch/ops-action.d.ts +0 -2
- package/dist/domain/script/patch/ops-action.js +34 -100
- package/dist/domain/script/patch/ops-action.js.map +1 -1
- package/dist/domain/script/patch/ops-asset.d.ts +1 -0
- package/dist/domain/script/patch/ops-asset.js +102 -155
- package/dist/domain/script/patch/ops-asset.js.map +1 -1
- package/dist/domain/script/patch/ops-dialogue.d.ts +1 -4
- package/dist/domain/script/patch/ops-dialogue.js +43 -220
- package/dist/domain/script/patch/ops-dialogue.js.map +1 -1
- package/dist/domain/script/patch/ops-extend.js +8 -2
- package/dist/domain/script/patch/ops-extend.js.map +1 -1
- package/dist/domain/script/patch/ops-meta.js.map +1 -1
- package/dist/domain/script/patch/ops-scene.js +26 -39
- package/dist/domain/script/patch/ops-scene.js.map +1 -1
- package/dist/domain/script/patch/ops-state.d.ts +3 -3
- package/dist/domain/script/patch/ops-state.js +33 -49
- package/dist/domain/script/patch/ops-state.js.map +1 -1
- package/dist/domain/script/patch/registry.js +9 -13
- package/dist/domain/script/patch/registry.js.map +1 -1
- package/dist/domain/script/refs.js +23 -111
- package/dist/domain/script/refs.js.map +1 -1
- package/dist/domain/script/scene-refs.d.ts +3 -0
- package/dist/domain/script/scene-refs.js +35 -0
- package/dist/domain/script/scene-refs.js.map +1 -0
- package/dist/domain/script/schema.js +17 -21
- package/dist/domain/script/schema.js.map +1 -1
- package/dist/domain/script/text-util.d.ts +7 -0
- package/dist/domain/script/text-util.js +91 -0
- package/dist/domain/script/text-util.js.map +1 -0
- package/dist/help-text.js +117 -410
- package/dist/help-text.js.map +1 -1
- package/dist/infra/converters.js +1 -1
- package/dist/infra/converters.js.map +1 -1
- package/dist/infra/episode-title.d.ts +4 -0
- package/dist/infra/episode-title.js +129 -0
- package/dist/infra/episode-title.js.map +1 -0
- package/dist/infra/ingest/review-renderer.d.ts +1 -0
- package/dist/infra/ingest/review-renderer.js +431 -0
- package/dist/infra/ingest/review-renderer.js.map +1 -0
- package/dist/infra/ingest/source-resolver.d.ts +21 -0
- package/dist/infra/ingest/source-resolver.js +51 -0
- package/dist/infra/ingest/source-resolver.js.map +1 -0
- package/dist/infra/ingest/text-reader.d.ts +3 -0
- package/dist/infra/ingest/text-reader.js +27 -0
- package/dist/infra/ingest/text-reader.js.map +1 -0
- package/dist/infra/ingest/video-discovery.d.ts +8 -0
- package/dist/infra/ingest/video-discovery.js +60 -0
- package/dist/infra/ingest/video-discovery.js.map +1 -0
- package/dist/infra/ingest/workspace-store.d.ts +18 -0
- package/dist/infra/ingest/workspace-store.js +70 -0
- package/dist/infra/ingest/workspace-store.js.map +1 -0
- package/dist/infra/llm/anthropic-model.d.ts +11 -0
- package/dist/infra/llm/anthropic-model.js +109 -0
- package/dist/infra/llm/anthropic-model.js.map +1 -0
- package/dist/infra/llm/gemini-upload.d.ts +9 -0
- package/dist/infra/llm/gemini-upload.js +94 -0
- package/dist/infra/llm/gemini-upload.js.map +1 -0
- package/dist/infra/llm/gemini-video-model.d.ts +47 -0
- package/dist/infra/llm/gemini-video-model.js +163 -0
- package/dist/infra/llm/gemini-video-model.js.map +1 -0
- package/dist/infra/llm/openai-compatible-model.d.ts +14 -0
- package/dist/infra/llm/openai-compatible-model.js +157 -0
- package/dist/infra/llm/openai-compatible-model.js.map +1 -0
- package/dist/infra/llm/retry.d.ts +5 -0
- package/dist/infra/llm/retry.js +20 -0
- package/dist/infra/llm/retry.js.map +1 -0
- package/dist/llm/composition.d.ts +5 -0
- package/dist/llm/composition.js +5 -0
- package/dist/llm/composition.js.map +1 -0
- package/dist/llm/config.d.ts +26 -0
- package/dist/llm/config.js +201 -0
- package/dist/llm/config.js.map +1 -0
- package/dist/llm/registry.d.ts +44 -0
- package/dist/llm/registry.js +48 -0
- package/dist/llm/registry.js.map +1 -0
- package/dist/llm/router.d.ts +23 -0
- package/dist/llm/router.js +0 -0
- package/dist/llm/router.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-curate.d.ts +13 -0
- package/dist/llm/tasks/ingest/asset-curate.js +45 -0
- package/dist/llm/tasks/ingest/asset-curate.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-extract.d.ts +12 -0
- package/dist/llm/tasks/ingest/asset-extract.js +51 -0
- package/dist/llm/tasks/ingest/asset-extract.js.map +1 -0
- package/dist/llm/tasks/ingest/asset-govern.d.ts +22 -0
- package/dist/llm/tasks/ingest/asset-govern.js +143 -0
- package/dist/llm/tasks/ingest/asset-govern.js.map +1 -0
- package/dist/llm/tasks/ingest/mention-resolve.d.ts +9 -0
- package/dist/llm/tasks/ingest/mention-resolve.js +39 -0
- package/dist/llm/tasks/ingest/mention-resolve.js.map +1 -0
- package/dist/llm/tasks/ingest/plot-speaker.d.ts +11 -0
- package/dist/llm/tasks/ingest/plot-speaker.js +72 -0
- package/dist/llm/tasks/ingest/plot-speaker.js.map +1 -0
- package/dist/llm/tasks/ingest/roster-merge.d.ts +46 -0
- package/dist/llm/tasks/ingest/roster-merge.js +235 -0
- package/dist/llm/tasks/ingest/roster-merge.js.map +1 -0
- package/dist/llm/tasks/ingest/state-merge.d.ts +10 -0
- package/dist/llm/tasks/ingest/state-merge.js +84 -0
- package/dist/llm/tasks/ingest/state-merge.js.map +1 -0
- package/dist/llm/tasks/ingest/state-reconcile.d.ts +8 -0
- package/dist/llm/tasks/ingest/state-reconcile.js +44 -0
- package/dist/llm/tasks/ingest/state-reconcile.js.map +1 -0
- package/dist/llm/tasks/ingest/text-normalize.d.ts +10 -0
- package/dist/llm/tasks/ingest/text-normalize.js +89 -0
- package/dist/llm/tasks/ingest/text-normalize.js.map +1 -0
- package/dist/llm/tasks/ingest/video-correct.d.ts +30 -0
- package/dist/llm/tasks/ingest/video-correct.js +144 -0
- package/dist/llm/tasks/ingest/video-correct.js.map +1 -0
- package/dist/llm/tasks/ingest/video-transcribe.d.ts +4 -0
- package/dist/llm/tasks/ingest/video-transcribe.js +105 -0
- package/dist/llm/tasks/ingest/video-transcribe.js.map +1 -0
- package/dist/llm/tasks/schemas.d.ts +5 -0
- package/dist/llm/tasks/schemas.js +107 -0
- package/dist/llm/tasks/schemas.js.map +1 -0
- package/dist/llm/types.d.ts +97 -0
- package/dist/llm/types.js +13 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/usecases/doctor.d.ts +1 -1
- package/dist/usecases/doctor.js +62 -9
- package/dist/usecases/doctor.js.map +1 -1
- package/dist/usecases/ingest/command.d.ts +5 -0
- package/dist/usecases/ingest/command.js +64 -0
- package/dist/usecases/ingest/command.js.map +1 -0
- package/dist/usecases/ingest/fanout.d.ts +10 -0
- package/dist/usecases/ingest/fanout.js +23 -0
- package/dist/usecases/ingest/fanout.js.map +1 -0
- package/dist/usecases/ingest/pass4-mention-resolve.d.ts +11 -0
- package/dist/usecases/ingest/pass4-mention-resolve.js +52 -0
- package/dist/usecases/ingest/pass4-mention-resolve.js.map +1 -0
- package/dist/usecases/ingest/pass5-extract.d.ts +7 -0
- package/dist/usecases/ingest/pass5-extract.js +50 -0
- package/dist/usecases/ingest/pass5-extract.js.map +1 -0
- package/dist/usecases/ingest/pass5-govern.d.ts +13 -0
- package/dist/usecases/ingest/pass5-govern.js +155 -0
- package/dist/usecases/ingest/pass5-govern.js.map +1 -0
- package/dist/usecases/ingest/pipeline.d.ts +28 -0
- package/dist/usecases/ingest/pipeline.js +144 -0
- package/dist/usecases/ingest/pipeline.js.map +1 -0
- package/dist/usecases/ingest/publish-command.d.ts +4 -0
- package/dist/usecases/ingest/publish-command.js +77 -0
- package/dist/usecases/ingest/publish-command.js.map +1 -0
- package/dist/usecases/ingest/status.d.ts +39 -0
- package/dist/usecases/ingest/status.js +155 -0
- package/dist/usecases/ingest/status.js.map +1 -0
- package/dist/usecases/ingest/video-pass3.d.ts +26 -0
- package/dist/usecases/ingest/video-pass3.js +0 -0
- package/dist/usecases/ingest/video-pass3.js.map +1 -0
- package/dist/usecases/ingest/video-pipeline.d.ts +32 -0
- package/dist/usecases/ingest/video-pipeline.js +202 -0
- package/dist/usecases/ingest/video-pipeline.js.map +1 -0
- package/dist/usecases/ingest/view-command.d.ts +4 -0
- package/dist/usecases/ingest/view-command.js +51 -0
- package/dist/usecases/ingest/view-command.js.map +1 -0
- package/dist/usecases/script/actions.js +2 -2
- package/dist/usecases/script/actions.js.map +1 -1
- package/dist/usecases/script/actor.js.map +1 -1
- package/dist/usecases/script/actors.js.map +1 -1
- package/dist/usecases/script/add-actor.js.map +1 -1
- package/dist/usecases/script/add-episode.js.map +1 -1
- package/dist/usecases/script/add-location.js.map +1 -1
- package/dist/usecases/script/add-prop.js.map +1 -1
- package/dist/usecases/script/alias.js.map +1 -1
- package/dist/usecases/script/assets.js.map +1 -1
- package/dist/usecases/script/context.js.map +1 -1
- package/dist/usecases/script/create.js +3 -6
- package/dist/usecases/script/create.js.map +1 -1
- package/dist/usecases/script/delete.js.map +1 -1
- package/dist/usecases/script/describe.js.map +1 -1
- package/dist/usecases/script/dialogue.js +6 -13
- package/dist/usecases/script/dialogue.js.map +1 -1
- package/dist/usecases/script/do.js +1 -1
- package/dist/usecases/script/do.js.map +1 -1
- package/dist/usecases/script/episodes.js.map +1 -1
- package/dist/usecases/script/{add-speaker.d.ts → importance.d.ts} +1 -1
- package/dist/usecases/script/importance.js +17 -0
- package/dist/usecases/script/importance.js.map +1 -0
- package/dist/usecases/script/insert.js.map +1 -1
- package/dist/usecases/script/issues.js.map +1 -1
- package/dist/usecases/script/lib.d.ts +8 -6
- package/dist/usecases/script/lib.js +81 -97
- package/dist/usecases/script/lib.js.map +1 -1
- package/dist/usecases/script/locations.js.map +1 -1
- package/dist/usecases/script/merge.js.map +1 -1
- package/dist/usecases/script/move.js.map +1 -1
- package/dist/usecases/script/props.js.map +1 -1
- package/dist/usecases/script/refs.js.map +1 -1
- package/dist/usecases/script/rename.js.map +1 -1
- package/dist/usecases/script/replace.js.map +1 -1
- package/dist/usecases/script/role.js.map +1 -1
- package/dist/usecases/script/scenes.js +8 -15
- package/dist/usecases/script/scenes.js.map +1 -1
- package/dist/usecases/script/script-patch.js +1 -1
- package/dist/usecases/script/script-patch.js.map +1 -1
- package/dist/usecases/script/script-validate.js +1 -1
- package/dist/usecases/script/script-validate.js.map +1 -1
- package/dist/usecases/script/session.d.ts +4 -4
- package/dist/usecases/script/session.js +57 -78
- package/dist/usecases/script/session.js.map +1 -1
- package/dist/usecases/script/split.js.map +1 -1
- package/dist/usecases/script/state-add.js.map +1 -1
- package/dist/usecases/script/state-delete.js.map +1 -1
- package/dist/usecases/script/state-rename.js.map +1 -1
- package/dist/usecases/script/summary.js.map +1 -1
- package/dist/usecases/script/synopsis-generate.d.ts +4 -5
- package/dist/usecases/script/synopsis-generate.js +30 -46
- package/dist/usecases/script/synopsis-generate.js.map +1 -1
- package/dist/usecases/script/transition.js.map +1 -1
- package/dist/usecases/script/type.js.map +1 -1
- package/dist/usecases/script/worldview.js.map +1 -1
- package/package.json +21 -17
- package/skills/scriptctl/SKILL.md +140 -120
- package/skills/scriptctl/references/atomic-write-workflow.md +12 -9
- package/skills/scriptctl/references/ingest-workflow.md +85 -0
- package/skills/scriptctl/references/state-reference-repair.md +26 -39
- package/dist/domain/direct/runner.d.ts +0 -25
- package/dist/domain/direct/runner.js +0 -88
- package/dist/domain/direct/runner.js.map +0 -1
- package/dist/domain/direct/stage.d.ts +0 -108
- package/dist/domain/direct/stage.js +0 -134
- package/dist/domain/direct/stage.js.map +0 -1
- package/dist/domain/direct/stages/asset-curation.d.ts +0 -2
- package/dist/domain/direct/stages/asset-curation.js +0 -10
- package/dist/domain/direct/stages/asset-curation.js.map +0 -1
- package/dist/domain/direct/stages/batch-extract.d.ts +0 -2
- package/dist/domain/direct/stages/batch-extract.js +0 -12
- package/dist/domain/direct/stages/batch-extract.js.map +0 -1
- package/dist/domain/direct/stages/batch-plan.d.ts +0 -2
- package/dist/domain/direct/stages/batch-plan.js +0 -9
- package/dist/domain/direct/stages/batch-plan.js.map +0 -1
- package/dist/domain/direct/stages/episode-merge.d.ts +0 -2
- package/dist/domain/direct/stages/episode-merge.js +0 -11
- package/dist/domain/direct/stages/episode-merge.js.map +0 -1
- package/dist/domain/direct/stages/episode-plan.d.ts +0 -2
- package/dist/domain/direct/stages/episode-plan.js +0 -9
- package/dist/domain/direct/stages/episode-plan.js.map +0 -1
- package/dist/domain/direct/stages/episode-synopsis.d.ts +0 -2
- package/dist/domain/direct/stages/episode-synopsis.js +0 -12
- package/dist/domain/direct/stages/episode-synopsis.js.map +0 -1
- package/dist/domain/direct/stages/episode-titles.d.ts +0 -2
- package/dist/domain/direct/stages/episode-titles.js +0 -12
- package/dist/domain/direct/stages/episode-titles.js.map +0 -1
- package/dist/domain/direct/stages/index.d.ts +0 -19
- package/dist/domain/direct/stages/index.js +0 -41
- package/dist/domain/direct/stages/index.js.map +0 -1
- package/dist/domain/direct/stages/metadata.d.ts +0 -2
- package/dist/domain/direct/stages/metadata.js +0 -11
- package/dist/domain/direct/stages/metadata.js.map +0 -1
- package/dist/domain/direct/stages/script-merge.d.ts +0 -2
- package/dist/domain/direct/stages/script-merge.js +0 -15
- package/dist/domain/direct/stages/script-merge.js.map +0 -1
- package/dist/domain/direct/stages/script-synopsis.d.ts +0 -2
- package/dist/domain/direct/stages/script-synopsis.js +0 -12
- package/dist/domain/direct/stages/script-synopsis.js.map +0 -1
- package/dist/domain/direct/stages/source-prepare.d.ts +0 -2
- package/dist/domain/direct/stages/source-prepare.js +0 -9
- package/dist/domain/direct/stages/source-prepare.js.map +0 -1
- package/dist/domain/direct/stages/state-binding.d.ts +0 -2
- package/dist/domain/direct/stages/state-binding.js +0 -9
- package/dist/domain/direct/stages/state-binding.js.map +0 -1
- package/dist/domain/direct/stages/state-curation.d.ts +0 -2
- package/dist/domain/direct/stages/state-curation.js +0 -10
- package/dist/domain/direct/stages/state-curation.js.map +0 -1
- package/dist/domain/direct/stages/validate.d.ts +0 -2
- package/dist/domain/direct/stages/validate.js +0 -10
- package/dist/domain/direct/stages/validate.js.map +0 -1
- package/dist/domain/direct-core.d.ts +0 -313
- package/dist/domain/direct-core.js +0 -8514
- package/dist/domain/direct-core.js.map +0 -1
- package/dist/domain/script/validate.d.ts +0 -22
- package/dist/domain/script/validate.js +0 -997
- package/dist/domain/script/validate.js.map +0 -1
- package/dist/infra/providers.d.ts +0 -97
- package/dist/infra/providers.js +0 -1396
- package/dist/infra/providers.js.map +0 -1
- package/dist/usecases/direct.d.ts +0 -27
- package/dist/usecases/direct.js +0 -4172
- package/dist/usecases/direct.js.map +0 -1
- package/dist/usecases/parse.d.ts +0 -15
- package/dist/usecases/parse.js +0 -429
- package/dist/usecases/parse.js.map +0 -1
- package/dist/usecases/script/add-speaker.js +0 -22
- package/dist/usecases/script/add-speaker.js.map +0 -1
- package/dist/usecases/script/export.d.ts +0 -3
- package/dist/usecases/script/export.js +0 -111
- package/dist/usecases/script/export.js.map +0 -1
- package/dist/usecases/script/overlap.d.ts +0 -3
- package/dist/usecases/script/overlap.js +0 -21
- package/dist/usecases/script/overlap.js.map +0 -1
- package/dist/usecases/script/speakers.d.ts +0 -3
- package/dist/usecases/script/speakers.js +0 -28
- package/dist/usecases/script/speakers.js.map +0 -1
- package/dist/usecases/script/state-change.d.ts +0 -3
- package/dist/usecases/script/state-change.js +0 -24
- package/dist/usecases/script/state-change.js.map +0 -1
- package/skills/scriptctl/references/direct-workflow.md +0 -72
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stateRejectionReason } from "../text-util.js";
|
|
2
2
|
import { asList, isList, opErr, strOf } from "../shared.js";
|
|
3
|
-
import { findScene, idKeyForKind, nextStateId, pluralForKind
|
|
4
|
-
import { parseAssetTarget, parseSceneRef, parseStateTarget
|
|
3
|
+
import { findScene, idKeyForKind, nextStateId, pluralForKind } from "../lookups.js";
|
|
4
|
+
import { parseAssetTarget, parseSceneRef, parseStateTarget } from "../address.js";
|
|
5
|
+
import { sceneRefs, setSceneRefs } from "../scene-refs.js";
|
|
5
6
|
import { contextRefsForKind, resolveAssetByTarget, resolveState, setContextState, validateStateForTarget, } from "./helpers.js";
|
|
6
7
|
export function op_state_add(__ctx) {
|
|
7
|
-
const { script, op,
|
|
8
|
+
const { script, op, applied, kind } = __ctx;
|
|
8
9
|
const [targetKind, targetId] = parseAssetTarget(op["target"]);
|
|
9
10
|
const asset = resolveAssetByTarget(script, targetKind, targetId);
|
|
10
11
|
const name = strOf(op["name"] || op["state_name"]).trim();
|
|
@@ -32,15 +33,12 @@ export function op_state_add(__ctx) {
|
|
|
32
33
|
if (existingStates.some((s) => strOf(s["state_name"] || s["name"]) === name)) {
|
|
33
34
|
throw opErr("SCRIPT OP BLOCKED: State name exists", "State name exists.", { required: ["unused state name"], received: [name], nextSteps: ["Rename the existing state or choose another name."], op: kind, errorCode: "STATE_NAME_EXISTS" });
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
if (description)
|
|
37
|
-
state["description"] = description;
|
|
38
|
-
existingStates.push(state);
|
|
36
|
+
existingStates.push({ state_id: stateId, state_name: name, description });
|
|
39
37
|
op["state_id"] = stateId;
|
|
40
38
|
applied.push(kind);
|
|
41
39
|
}
|
|
42
40
|
export function op_state_rename(__ctx) {
|
|
43
|
-
const { script, op,
|
|
41
|
+
const { script, op, applied, kind } = __ctx;
|
|
44
42
|
const [targetKind, targetId, stateId] = parseStateTarget(op["target"]);
|
|
45
43
|
const state = resolveState(script, targetKind, targetId, stateId);
|
|
46
44
|
const name = strOf(op["name"] || op["state_name"]).trim();
|
|
@@ -55,17 +53,24 @@ export function op_state_rename(__ctx) {
|
|
|
55
53
|
applied.push(kind);
|
|
56
54
|
}
|
|
57
55
|
export function op_state_describe(__ctx) {
|
|
58
|
-
const { script, op,
|
|
56
|
+
const { script, op, applied, kind } = __ctx;
|
|
59
57
|
const [targetKind, targetId, stateId] = parseStateTarget(op["target"]);
|
|
60
58
|
const state = resolveState(script, targetKind, targetId, stateId);
|
|
61
59
|
state["description"] = strOf(op["description"]).trim();
|
|
62
60
|
applied.push(kind);
|
|
63
61
|
}
|
|
64
62
|
export function op_state_delete(__ctx) {
|
|
65
|
-
const { script, op,
|
|
63
|
+
const { script, op, applied, kind } = __ctx;
|
|
66
64
|
const [targetKind, targetId, stateId] = parseStateTarget(op["target"]);
|
|
67
65
|
const asset = resolveAssetByTarget(script, targetKind, targetId);
|
|
68
66
|
resolveState(script, targetKind, targetId, stateId);
|
|
67
|
+
// v3 invariant: every asset keeps exactly one 'default' state.
|
|
68
|
+
if (stateId === "default") {
|
|
69
|
+
throw opErr("SCRIPT OP BLOCKED: Cannot delete default state", "The 'default' state cannot be deleted.", {
|
|
70
|
+
required: ["a non-default state_id"], received: [stateId],
|
|
71
|
+
nextSteps: ["Delete a specific state; the default is the always-present baseline."], op: kind, errorCode: "STATE_DEFAULT_PROTECTED",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
69
74
|
const strategy = strOf(op["strategy"]).trim();
|
|
70
75
|
const replacement = strOf(op["replacement"]).trim();
|
|
71
76
|
if (strategy !== "replace" && strategy !== "remove") {
|
|
@@ -77,70 +82,49 @@ export function op_state_delete(__ctx) {
|
|
|
77
82
|
}
|
|
78
83
|
validateStateForTarget(script, targetKind, targetId, replacement);
|
|
79
84
|
}
|
|
80
|
-
const contextField = pluralForKind(targetKind);
|
|
81
85
|
const idKey = idKeyForKind(targetKind);
|
|
86
|
+
// Scrub scene refs that carried the deleted state: replace → replacement,
|
|
87
|
+
// remove → clear to null (state lives only on scene refs in v3).
|
|
82
88
|
for (const ep of asList(script["episodes"])) {
|
|
83
89
|
for (const scene of asList(ep["scenes"])) {
|
|
84
|
-
const
|
|
85
|
-
|
|
90
|
+
const bag = sceneRefs(scene);
|
|
91
|
+
let touched = false;
|
|
92
|
+
for (const ref of contextRefsForKind(bag, targetKind)) {
|
|
86
93
|
if (strOf(ref[idKey]) === targetId && strOf(ref["state_id"]) === stateId) {
|
|
87
94
|
ref["state_id"] = strategy === "replace" ? replacement : null;
|
|
95
|
+
touched = true;
|
|
88
96
|
}
|
|
89
97
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
for (const action of asList(scene["actions"])) {
|
|
93
|
-
const nextChanges = [];
|
|
94
|
-
for (const change of asList(action["state_changes"])) {
|
|
95
|
-
if (strOf(change["target_kind"]) === targetKind && strOf(change["target_id"]) === targetId) {
|
|
96
|
-
let touched = false;
|
|
97
|
-
for (const stateField of ["from_state_id", "to_state_id"]) {
|
|
98
|
-
if (strOf(change[stateField]) === stateId) {
|
|
99
|
-
touched = true;
|
|
100
|
-
if (strategy === "replace")
|
|
101
|
-
change[stateField] = replacement;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (strategy === "remove" && touched)
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
107
|
-
nextChanges.push(change);
|
|
108
|
-
}
|
|
109
|
-
if (action["state_changes"] !== undefined && action["state_changes"] !== null) {
|
|
110
|
-
if (nextChanges.length > 0)
|
|
111
|
-
action["state_changes"] = nextChanges;
|
|
112
|
-
else
|
|
113
|
-
delete action["state_changes"];
|
|
114
|
-
}
|
|
115
|
-
}
|
|
98
|
+
if (touched)
|
|
99
|
+
setSceneRefs(scene, bag);
|
|
116
100
|
}
|
|
117
101
|
}
|
|
118
102
|
asset["states"] = asList(asset["states"]).filter((s) => strOf(s["state_id"]) !== stateId);
|
|
119
103
|
applied.push(kind);
|
|
120
104
|
}
|
|
121
|
-
export function
|
|
122
|
-
const { script, op,
|
|
105
|
+
export function op_scene_ref_set(__ctx) {
|
|
106
|
+
const { script, op, applied, kind } = __ctx;
|
|
123
107
|
const [epId, sceneId] = parseSceneRef(op["at"]);
|
|
124
108
|
const [targetKind, targetId] = parseAssetTarget(op["target"]);
|
|
125
109
|
setContextState(script, epId, sceneId, targetKind, targetId, strOf(op["state"] || op["state_id"]).trim());
|
|
126
110
|
applied.push(kind);
|
|
127
111
|
}
|
|
128
|
-
export function
|
|
129
|
-
const { script, op,
|
|
112
|
+
export function op_scene_ref_clear(__ctx) {
|
|
113
|
+
const { script, op, applied, kind } = __ctx;
|
|
130
114
|
const [epId, sceneId] = parseSceneRef(op["at"]);
|
|
131
115
|
const [targetKind, targetId] = parseAssetTarget(op["target"]);
|
|
132
116
|
setContextState(script, epId, sceneId, targetKind, targetId, null);
|
|
133
117
|
applied.push(kind);
|
|
134
118
|
}
|
|
135
|
-
export function
|
|
136
|
-
const { script, op,
|
|
119
|
+
export function op_scene_ref_remove(__ctx) {
|
|
120
|
+
const { script, op, applied, kind } = __ctx;
|
|
137
121
|
const [epId, sceneId] = parseSceneRef(op["at"]);
|
|
138
122
|
const [targetKind, targetId] = parseAssetTarget(op["target"]);
|
|
139
123
|
const scene = findScene(script, epId, sceneId);
|
|
140
|
-
const
|
|
124
|
+
const bag = sceneRefs(scene);
|
|
141
125
|
const idKey = idKeyForKind(targetKind);
|
|
142
|
-
|
|
143
|
-
|
|
126
|
+
bag[pluralForKind(targetKind)] = contextRefsForKind(bag, targetKind).filter((ref) => strOf(ref[idKey]) !== targetId);
|
|
127
|
+
setSceneRefs(scene, bag);
|
|
144
128
|
applied.push(kind);
|
|
145
129
|
}
|
|
146
130
|
//# sourceMappingURL=ops-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ops-state.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/ops-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ops-state.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/ops-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { op_actor_add, op_location_add, op_prop_add, op_asset_role_set, op_asset_rename, op_asset_describe, op_asset_alias_set, op_asset_alias_add, op_asset_alias_remove, op_asset_states_set, op_asset_merge, op_asset_delete } from "./ops-asset.js";
|
|
3
|
-
import {
|
|
1
|
+
import { op_action_transition_set, op_action_transition_clear, op_action_content_replace, op_action_content_regex_replace, op_action_type_set, op_action_actor_set, op_action_emotion_set, op_action_emotion_clear, op_action_delete, op_action_insert, op_action_move } from "./ops-action.js";
|
|
2
|
+
import { op_actor_add, op_location_add, op_prop_add, op_asset_role_set, op_importance_set, op_asset_rename, op_asset_describe, op_asset_alias_set, op_asset_alias_add, op_asset_alias_remove, op_asset_states_set, op_asset_merge, op_asset_delete } from "./ops-asset.js";
|
|
3
|
+
import { op_dialogue_speaker_set } from "./ops-dialogue.js";
|
|
4
4
|
import { op_episode_add, op_episode_synopsis_set, op_meta_worldview_set, op_meta_synopsis_set } from "./ops-meta.js";
|
|
5
5
|
import { op_scene_insert, op_scene_split, op_scene_merge, op_scene_delete, op_scene_move } from "./ops-scene.js";
|
|
6
|
-
import { op_state_add, op_state_rename, op_state_describe, op_state_delete,
|
|
6
|
+
import { op_state_add, op_state_rename, op_state_describe, op_state_delete, op_scene_ref_set, op_scene_ref_clear, op_scene_ref_remove } from "./ops-state.js";
|
|
7
7
|
import { op_extend_set, op_extend_clear } from "./ops-extend.js";
|
|
8
8
|
export const OP_REGISTRY = {
|
|
9
9
|
"state.add": op_state_add,
|
|
10
10
|
"state.rename": op_state_rename,
|
|
11
11
|
"state.describe": op_state_describe,
|
|
12
12
|
"state.delete": op_state_delete,
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"action.state.remove": op_action_state_remove,
|
|
13
|
+
"scene.ref.set": op_scene_ref_set,
|
|
14
|
+
"scene.ref.clear": op_scene_ref_clear,
|
|
15
|
+
"scene.ref.remove": op_scene_ref_remove,
|
|
17
16
|
"action.transition.set": op_action_transition_set,
|
|
18
17
|
"action.transition.clear": op_action_transition_clear,
|
|
19
18
|
"action.content.replace": op_action_content_replace,
|
|
20
19
|
"action.content.regex-replace": op_action_content_regex_replace,
|
|
21
|
-
"speaker.
|
|
22
|
-
"dialogue.speakers": op_dialogue_speakers,
|
|
23
|
-
"dialogue.overlap": op_dialogue_overlap,
|
|
20
|
+
"dialogue.speaker.set": op_dialogue_speaker_set,
|
|
24
21
|
"actor.add": op_actor_add,
|
|
25
22
|
"location.add": op_location_add,
|
|
26
23
|
"prop.add": op_prop_add,
|
|
@@ -29,6 +26,7 @@ export const OP_REGISTRY = {
|
|
|
29
26
|
"meta.worldview.set": op_meta_worldview_set,
|
|
30
27
|
"meta.synopsis.set": op_meta_synopsis_set,
|
|
31
28
|
"asset.role.set": op_asset_role_set,
|
|
29
|
+
"importance.set": op_importance_set,
|
|
32
30
|
"asset.rename": op_asset_rename,
|
|
33
31
|
"asset.describe": op_asset_describe,
|
|
34
32
|
"asset.alias.set": op_asset_alias_set,
|
|
@@ -49,8 +47,6 @@ export const OP_REGISTRY = {
|
|
|
49
47
|
"scene.merge": op_scene_merge,
|
|
50
48
|
"scene.delete": op_scene_delete,
|
|
51
49
|
"scene.move": op_scene_move,
|
|
52
|
-
"speaker.delete": op_speaker_delete,
|
|
53
|
-
"context.ref.remove": op_context_ref_remove,
|
|
54
50
|
"extend.set": op_extend_set,
|
|
55
51
|
"extend.clear": op_extend_clear,
|
|
56
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAC,0BAA0B,EAAC,yBAAyB,EAAC,+BAA+B,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,qBAAqB,EAAC,uBAAuB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtR,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,WAAW,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,mBAAmB,EAAC,cAAc,EAAC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/P,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAC,uBAAuB,EAAC,qBAAqB,EAAC,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,eAAe,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,iBAAiB,EAAC,eAAe,EAAC,gBAAgB,EAAC,kBAAkB,EAAC,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxJ,OAAO,EAAE,aAAa,EAAC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,eAAe,EAAE,gBAAgB;IACjC,iBAAiB,EAAE,kBAAkB;IACrC,kBAAkB,EAAE,mBAAmB;IACvC,uBAAuB,EAAE,wBAAwB;IACjD,yBAAyB,EAAE,0BAA0B;IACrD,wBAAwB,EAAE,yBAAyB;IACnD,8BAA8B,EAAE,+BAA+B;IAC/D,sBAAsB,EAAE,uBAAuB;IAC/C,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,cAAc;IAC7B,sBAAsB,EAAE,uBAAuB;IAC/C,oBAAoB,EAAE,qBAAqB;IAC3C,mBAAmB,EAAE,oBAAoB;IACzC,gBAAgB,EAAE,iBAAiB;IACnC,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,iBAAiB,EAAE,kBAAkB;IACrC,iBAAiB,EAAE,kBAAkB;IACrC,oBAAoB,EAAE,qBAAqB;IAC3C,kBAAkB,EAAE,mBAAmB;IACvC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,iBAAiB,EAAE,kBAAkB;IACrC,kBAAkB,EAAE,mBAAmB;IACvC,oBAAoB,EAAE,qBAAqB;IAC3C,sBAAsB,EAAE,uBAAuB;IAC/C,eAAe,EAAE,gBAAgB;IACjC,eAAe,EAAE,gBAAgB;IACjC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,YAAY,EAAE,aAAa;IAC3B,YAAY,EAAE,aAAa;IAC3B,cAAc,EAAE,eAAe;CAChC,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { asList, isDict, strOf } from "./shared.js";
|
|
2
|
-
import {
|
|
2
|
+
import { sceneRefs } from "./scene-refs.js";
|
|
3
3
|
import { idKeyForKind, pluralForKind } from "./lookups.js";
|
|
4
|
-
import { contextRefsForKind } from "./patch/helpers.js";
|
|
5
4
|
export function stateRefSummary(kind, targetId, stateId, location, role) {
|
|
6
5
|
return { target: `${kind}:${targetId}/${stateId}`, location, role };
|
|
7
6
|
}
|
|
7
|
+
// v3: a state is referenced only where a scene's cast/props/location ref carries
|
|
8
|
+
// it (scene.actors[]/props[]/location.state_id). There are no per-action
|
|
9
|
+
// state_changes in v3, so scene refs are the whole surface.
|
|
8
10
|
export function collectStateRefs(script, kind, targetId, stateId) {
|
|
9
11
|
const refs = [];
|
|
10
12
|
const idKey = idKeyForKind(kind);
|
|
@@ -12,141 +14,51 @@ export function collectStateRefs(script, kind, targetId, stateId) {
|
|
|
12
14
|
const epId = strOf(ep["episode_id"]);
|
|
13
15
|
for (const scene of asList(ep["scenes"])) {
|
|
14
16
|
const sceneId = strOf(scene["scene_id"]);
|
|
15
|
-
const
|
|
16
|
-
const refsList = contextRefsForKind(ctx, kind);
|
|
17
|
+
const refsList = asList(sceneRefs(scene)[pluralForKind(kind)]);
|
|
17
18
|
for (let idx = 0; idx < refsList.length; idx++) {
|
|
18
19
|
const ref = refsList[idx];
|
|
19
20
|
if (strOf(ref[idKey]) === targetId && strOf(ref["state_id"]) === stateId) {
|
|
20
|
-
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
const actions = asList(scene["actions"]);
|
|
24
|
-
for (let actionIdx = 0; actionIdx < actions.length; actionIdx++) {
|
|
25
|
-
const changes = asList(actions[actionIdx]["state_changes"]);
|
|
26
|
-
for (let changeIdx = 0; changeIdx < changes.length; changeIdx++) {
|
|
27
|
-
const change = changes[changeIdx];
|
|
28
|
-
if (strOf(change["target_kind"]) !== kind || strOf(change["target_id"]) !== targetId)
|
|
29
|
-
continue;
|
|
30
|
-
if (strOf(change["from_state_id"]) === stateId) {
|
|
31
|
-
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}#${actionIdx}.state_changes[${changeIdx}].from_state_id`, "state_change_from"));
|
|
32
|
-
}
|
|
33
|
-
if (strOf(change["to_state_id"]) === stateId) {
|
|
34
|
-
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}#${actionIdx}.state_changes[${changeIdx}].to_state_id`, "state_change_to"));
|
|
35
|
-
}
|
|
21
|
+
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}.${pluralForKind(kind)}[${idx}]`, "scene_state"));
|
|
36
22
|
}
|
|
37
23
|
}
|
|
38
24
|
}
|
|
39
25
|
}
|
|
40
26
|
return refs;
|
|
41
27
|
}
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
// A union over every address format the flat top-level commands accept. The
|
|
46
|
-
// dispatcher (CLI / usecase) picks behavior based on `kind`. Speaker addresses
|
|
47
|
-
// use a bare `spk_XXX` form (no prefix) for terseness, mirroring how the rest
|
|
28
|
+
// v3: an asset is referenced by scene cast/props/location refs, by a dialogue
|
|
29
|
+
// line's inline speaker (action.speaker.actor_id, actors only), and by an
|
|
30
|
+
// action.transition_prompt.target. No speaker roster, no state_changes.
|
|
48
31
|
export function collectAssetRefs(script, kind, targetId) {
|
|
49
32
|
const refs = [];
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
const idKey = isSpeaker ? null : idKeyForKind(kind);
|
|
33
|
+
const target = `${kind}:${targetId}`;
|
|
34
|
+
const idKey = idKeyForKind(kind);
|
|
53
35
|
for (const ep of asList(script["episodes"])) {
|
|
54
36
|
const epId = strOf(ep["episode_id"]);
|
|
55
37
|
for (const scene of asList(ep["scenes"])) {
|
|
56
38
|
const sceneId = strOf(scene["scene_id"]);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if (strOf(refsList[i][idKey]) === targetId) {
|
|
62
|
-
refs.push({
|
|
63
|
-
target,
|
|
64
|
-
location: `${epId}/${sceneId}.context.${pluralForKind(kind)}[${i}]`,
|
|
65
|
-
role: `scene_${pluralForKind(kind)}`,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
39
|
+
const refsList = asList(sceneRefs(scene)[pluralForKind(kind)]);
|
|
40
|
+
for (let i = 0; i < refsList.length; i++) {
|
|
41
|
+
if (strOf(refsList[i][idKey]) === targetId) {
|
|
42
|
+
refs.push({ target, location: `${epId}/${sceneId}.${pluralForKind(kind)}[${i}]`, role: `scene_${pluralForKind(kind)}` });
|
|
68
43
|
}
|
|
69
44
|
}
|
|
70
45
|
const actions = asList(scene["actions"]);
|
|
71
46
|
for (let actionIdx = 0; actionIdx < actions.length; actionIdx++) {
|
|
72
47
|
const action = actions[actionIdx];
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
location: `${epId}/${sceneId}#${actionIdx}.actor_id`,
|
|
77
|
-
role: "action_actor",
|
|
78
|
-
});
|
|
48
|
+
const speaker = action["speaker"];
|
|
49
|
+
if (kind === "actor" && isDict(speaker) && strOf(speaker["actor_id"]) === targetId) {
|
|
50
|
+
refs.push({ target, location: `${epId}/${sceneId}#${actionIdx}.speaker`, role: "dialogue_speaker" });
|
|
79
51
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
role: "action_speaker",
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
const speakers = asList(action["speakers"]);
|
|
89
|
-
for (let i = 0; i < speakers.length; i++) {
|
|
90
|
-
if (strOf(speakers[i]["speaker_id"]) === targetId) {
|
|
91
|
-
refs.push({
|
|
92
|
-
target,
|
|
93
|
-
location: `${epId}/${sceneId}#${actionIdx}.speakers[${i}]`,
|
|
94
|
-
role: "dialogue_speaker",
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const lines = asList(action["lines"]);
|
|
99
|
-
for (let i = 0; i < lines.length; i++) {
|
|
100
|
-
if (strOf(lines[i]["speaker_id"]) === targetId) {
|
|
101
|
-
refs.push({
|
|
102
|
-
target,
|
|
103
|
-
location: `${epId}/${sceneId}#${actionIdx}.lines[${i}].speaker_id`,
|
|
104
|
-
role: "overlap_line_speaker",
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (!isSpeaker) {
|
|
110
|
-
const changes = asList(action["state_changes"]);
|
|
111
|
-
for (let i = 0; i < changes.length; i++) {
|
|
112
|
-
const change = changes[i];
|
|
113
|
-
if (strOf(change["target_kind"]) === kind && strOf(change["target_id"]) === targetId) {
|
|
114
|
-
refs.push({
|
|
115
|
-
target,
|
|
116
|
-
location: `${epId}/${sceneId}#${actionIdx}.state_changes[${i}]`,
|
|
117
|
-
role: "state_change_target",
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
const transition = action["transition_prompt"];
|
|
122
|
-
if (isDict(transition) && strOf(transition["target_kind"]) === kind && strOf(transition["target_id"]) === targetId) {
|
|
123
|
-
refs.push({
|
|
124
|
-
target,
|
|
125
|
-
location: `${epId}/${sceneId}#${actionIdx}.transition_prompt`,
|
|
126
|
-
role: "transition_target",
|
|
127
|
-
});
|
|
52
|
+
const transition = action["transition_prompt"];
|
|
53
|
+
if (isDict(transition)) {
|
|
54
|
+
const t = strOf(transition["target"]).trim();
|
|
55
|
+
if (t === targetId || t === target) {
|
|
56
|
+
refs.push({ target, location: `${epId}/${sceneId}#${actionIdx}.transition_prompt`, role: "transition_target" });
|
|
128
57
|
}
|
|
129
58
|
}
|
|
130
59
|
}
|
|
131
60
|
}
|
|
132
61
|
}
|
|
133
|
-
// Speaker registrations pointing at this asset (actor/location/prop only).
|
|
134
|
-
// A speaker.source_id ties an actor/location/prop to a speaker entity; the
|
|
135
|
-
// speaker entry itself counts as a reference, so deleting / merging the
|
|
136
|
-
// asset must surface it.
|
|
137
|
-
if (!isSpeaker) {
|
|
138
|
-
const speakers = asList(script["speakers"]);
|
|
139
|
-
for (let i = 0; i < speakers.length; i++) {
|
|
140
|
-
const s = speakers[i];
|
|
141
|
-
if (strOf(s["source_kind"]) === kind && strOf(s["source_id"]) === targetId) {
|
|
142
|
-
refs.push({
|
|
143
|
-
target,
|
|
144
|
-
location: `speakers[${i}]`,
|
|
145
|
-
role: "speaker_source",
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
62
|
return refs;
|
|
151
63
|
}
|
|
152
64
|
//# sourceMappingURL=refs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../../src/domain/script/refs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../../src/domain/script/refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// v3 scene-ref accessors. In Script v3 a scene's cast/props/location live as
|
|
2
|
+
// top-level scene fields — scene.actors[] / scene.props[] (arrays of
|
|
3
|
+
// {actor_id|prop_id, state_id?}) and scene.location ({location_id, state_id?} |
|
|
4
|
+
// null, single-valued) — NOT the legacy scene.context{} bag. These two functions
|
|
5
|
+
// are the ONLY place the patch ops touch that storage, so the whole context.*
|
|
6
|
+
// op family operates on v3 through the same {actors,locations,props} bag shape
|
|
7
|
+
// the ops already expect. `locations` is synthesized as a 0-or-1 array from the
|
|
8
|
+
// single scene.location so multi-location callers keep working (location stays
|
|
9
|
+
// single-valued: setSceneRefs writes locations[0] back as scene.location).
|
|
10
|
+
import { asList, isDict, isList } from "./shared.js";
|
|
11
|
+
export function sceneRefs(scene) {
|
|
12
|
+
const loc = isDict(scene["location"]) ? scene["location"] : null;
|
|
13
|
+
return {
|
|
14
|
+
actors: isList(scene["actors"]) ? scene["actors"] : [],
|
|
15
|
+
props: isList(scene["props"]) ? scene["props"] : [],
|
|
16
|
+
locations: loc && String(loc["location_id"] ?? "").trim() ? [loc] : [],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Clean a single ref to v3 shape: keep the id key, keep state_id ONLY when it is
|
|
20
|
+
// a real (non-null, non-empty) materialized id — v3 validation rejects a
|
|
21
|
+
// state_id: null (it reads as "declared but not materialized").
|
|
22
|
+
function cleanRef(ref, idKey) {
|
|
23
|
+
const out = { [idKey]: ref[idKey] };
|
|
24
|
+
const state = ref["state_id"];
|
|
25
|
+
if (state != null && String(state).trim())
|
|
26
|
+
out["state_id"] = state;
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
export function setSceneRefs(scene, refs) {
|
|
30
|
+
scene["actors"] = asList(refs["actors"]).map((r) => cleanRef(r, "actor_id"));
|
|
31
|
+
scene["props"] = asList(refs["props"]).map((r) => cleanRef(r, "prop_id"));
|
|
32
|
+
const loc = asList(refs["locations"])[0];
|
|
33
|
+
scene["location"] = loc && String(loc["location_id"] ?? "").trim() ? cleanRef(loc, "location_id") : null;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=scene-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-refs.js","sourceRoot":"","sources":["../../../src/domain/script/scene-refs.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,qEAAqE;AACrE,gFAAgF;AAChF,iFAAiF;AACjF,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,OAAO,EAAE,MAAM,EAAa,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,UAAU,SAAS,CAAC,KAAW;IACnC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,UAAU,CAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,QAAQ,CAAY,CAAC,CAAC,CAAC,EAAE;QAClE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,OAAO,CAAY,CAAC,CAAC,CAAC,EAAE;QAC/D,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;KACvE,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,yEAAyE;AACzE,gEAAgE;AAChE,SAAS,QAAQ,CAAC,GAAS,EAAE,KAAa;IACxC,MAAM,GAAG,GAAS,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;IACnE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAW,EAAE,IAAU;IAClD,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,MAAM,CAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3G,CAAC"}
|
|
@@ -10,9 +10,9 @@ export const PATCH_OP_SCHEMA = {
|
|
|
10
10
|
"state.describe": { required: ["target", "description"], optional: [], description: "Set a state's description." },
|
|
11
11
|
"state.delete": { required: ["target", "strategy"], optional: ["replacement"], description: "Delete a state. strategy: replace|remove." },
|
|
12
12
|
// asset
|
|
13
|
-
"actor.add": { required: ["name"], optional: ["actor_id", "role_type", "description", "aliases"], description: "Register a new actor (human/character).
|
|
14
|
-
"location.add": { required: ["name"], optional: ["location_id", "description"], description: "Register a new location." },
|
|
15
|
-
"prop.add": { required: ["name"], optional: ["prop_id", "description"], description: "Register a new prop." },
|
|
13
|
+
"actor.add": { required: ["name"], optional: ["actor_id", "role_type", "importance", "description", "aliases"], description: "Register a new actor (human/character). importance: featured|background (default featured)." },
|
|
14
|
+
"location.add": { required: ["name"], optional: ["location_id", "importance", "description"], description: "Register a new location. importance: featured|background." },
|
|
15
|
+
"prop.add": { required: ["name"], optional: ["prop_id", "importance", "description"], description: "Register a new prop. importance: featured|background." },
|
|
16
16
|
"episode.add": { required: [], optional: ["episode_id", "title"], description: "Append a new empty episode (no scenes)." },
|
|
17
17
|
"episode.synopsis.set": { required: ["episode_id", "synopsis"], optional: [], description: "Set one episode's synopsis." },
|
|
18
18
|
"asset.rename": { required: ["target", "name"], optional: [], description: "Rename an asset (actor / location / prop)." },
|
|
@@ -20,23 +20,22 @@ export const PATCH_OP_SCHEMA = {
|
|
|
20
20
|
"asset.alias.set": { required: ["target", "aliases"], optional: [], description: "Bulk replace aliases[]." },
|
|
21
21
|
"asset.alias.add": { required: ["target", "alias"], optional: [], description: "Append alias(es)." },
|
|
22
22
|
"asset.alias.remove": { required: ["target", "alias"], optional: [], description: "Remove alias(es)." },
|
|
23
|
-
"asset.states.set": { required: ["target", "states"], optional: ["asset_type"], description: "Bulk replace states[]." },
|
|
23
|
+
"asset.states.set": { required: ["target", "states"], optional: ["asset_type"], description: "Bulk replace states[] (the 'default' state is always preserved)." },
|
|
24
24
|
"asset.role.set": { required: ["target", "role_type"], optional: [], description: "Set actor role_type (主角|配角)." },
|
|
25
|
+
"importance.set": { required: ["target", "importance"], optional: [], description: "Set an asset's importance tier: featured (主角/配角) | background (龙套/背景)." },
|
|
25
26
|
"asset.merge": { required: ["from", "into"], optional: [], description: "Merge from asset into another; from disappears." },
|
|
26
27
|
"asset.delete": { required: ["target"], optional: ["strategy", "replacement"], description: "Delete an asset. strategy: replace|remove (required if refs exist)." },
|
|
27
28
|
// action
|
|
28
|
-
"action.type.set": { required: ["at", "type"], optional: [], description: "Set action.type (dialogue|action|inner_thought)." },
|
|
29
|
-
"action.actor.set": { required: ["at"], optional: ["actor_id"], description: "Set/clear action.actor_id." },
|
|
29
|
+
"action.type.set": { required: ["at", "type"], optional: [], description: "Set action.type (dialogue|action|inner_thought|transition)." },
|
|
30
|
+
"action.actor.set": { required: ["at"], optional: ["actor_id"], description: "Set/clear the dialogue line's speaker to an actor (action.speaker={actor_id}). Omit actor_id to clear." },
|
|
30
31
|
"action.emotion.set": { required: ["at", "emotion"], optional: [], description: "Set action.emotion." },
|
|
31
32
|
"action.emotion.clear": { required: ["at"], optional: [], description: "Clear action.emotion." },
|
|
32
33
|
"action.content.replace": { required: ["at", "from"], optional: ["to", "all"], description: "Literal substring replace in action.content." },
|
|
33
|
-
"action.content.regex-replace": { required: ["at", "pattern"], optional: ["to", "all"], description: "Regex (/re/flags) replace in action.content. ReDoS-guarded
|
|
34
|
-
"action.
|
|
35
|
-
"action.
|
|
36
|
-
"action.transition.set": { required: ["at", "target", "process", "contrast"], optional: [], description: "Set transition_prompt." },
|
|
37
|
-
"action.transition.clear": { required: ["at", "target"], optional: [], description: "Clear transition_prompt." },
|
|
34
|
+
"action.content.regex-replace": { required: ["at", "pattern"], optional: ["to", "all"], description: "Regex (/re/flags) replace in action.content. ReDoS-guarded." },
|
|
35
|
+
"action.transition.set": { required: ["at", "target", "process", "contrast"], optional: [], description: "Set transition_prompt {target, process, contrast}." },
|
|
36
|
+
"action.transition.clear": { required: ["at"], optional: [], description: "Clear transition_prompt." },
|
|
38
37
|
"action.delete": { required: ["at"], optional: [], description: "Remove an action; later indices shift." },
|
|
39
|
-
"action.insert": { required: ["at", "type"], optional: ["content", "emotion", "at_index", "before", "after", "actor_id"
|
|
38
|
+
"action.insert": { required: ["at", "type"], optional: ["content", "emotion", "at_index", "before", "after", "actor_id"], description: "Insert an action into a scene. actor_id sets the inline dialogue speaker." },
|
|
40
39
|
"action.move": { required: ["at", "to"], optional: [], description: "Move an action (within or across scenes)." },
|
|
41
40
|
// scene
|
|
42
41
|
"scene.split": { required: ["at", "at_index"], optional: ["new_scene_id"], description: "Split a scene at an action boundary." },
|
|
@@ -44,15 +43,12 @@ export const PATCH_OP_SCHEMA = {
|
|
|
44
43
|
"scene.delete": { required: ["at"], optional: ["force"], description: "Delete a scene; empty by default, force=true for non-empty." },
|
|
45
44
|
"scene.move": { required: ["at", "to"], optional: ["at_index"], description: "Move a scene to another episode." },
|
|
46
45
|
"scene.insert": { required: ["at", "location"], optional: ["time", "space", "at_index", "before", "after", "scene_id"], description: "Insert a new empty scene." },
|
|
47
|
-
// context
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
// dialogue
|
|
52
|
-
"dialogue.
|
|
53
|
-
"dialogue.overlap": { required: ["at", "lines"], optional: [], description: "Set overlap dialogue lines[]." },
|
|
54
|
-
"speaker.add": { required: ["kind", "name"], optional: ["source_id", "voice_desc", "speaker_id"], description: "Register a new speaker." },
|
|
55
|
-
"speaker.delete": { required: ["target"], optional: ["strategy", "replacement"], description: "Delete a speaker. strategy: replace|remove (required if refs exist)." },
|
|
46
|
+
// scene refs (v3: cast/props/location live directly on the scene, no context{})
|
|
47
|
+
"scene.ref.set": { required: ["at", "target"], optional: ["state", "state_id"], description: "Upsert (actor/prop) or replace (location) a scene cast/prop/location ref + its state. target: actor:id|prop:id|location:id." },
|
|
48
|
+
"scene.ref.clear": { required: ["at", "target"], optional: [], description: "Keep the scene ref, clear its state_id." },
|
|
49
|
+
"scene.ref.remove": { required: ["at", "target"], optional: [], description: "Remove the ref entirely from the scene's cast/props/location." },
|
|
50
|
+
// dialogue speaker (v3: single inline speaker per line — actor or non-actor kind)
|
|
51
|
+
"dialogue.speaker.set": { required: ["at"], optional: ["actor_id", "kind", "label"], description: "Set the dialogue line's inline speaker: actor_id (an actor) OR kind (system|broadcast|offscreen|group) + optional label." },
|
|
56
52
|
// extend (free-form namespace, any dimension)
|
|
57
53
|
"extend.set": { required: ["at", "key", "value"], optional: [], description: "Set a free-form key on a node's extend{} namespace. at: action(ep/scn#i)|scene(ep/scn)|episode(ep)|asset(kind:id)|state(kind:id/st)|speaker(spk_x)|global. key is a flat name (dots are literal, not traversed). value is any JSON." },
|
|
58
54
|
"extend.clear": { required: ["at"], optional: ["key"], description: "Delete one extend key (key set) or clear the whole extend{} container (key omitted). Empty container is removed; deleting a missing key is a no-op." },
|