@lingjingai/scriptctl 0.34.0 → 0.36.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 +30 -5
- package/changes/0.35.0.md +22 -0
- package/changes/0.36.0.md +22 -0
- package/changes/unreleased.md +3 -5
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +56 -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 +145 -414
- 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 +167 -0
- package/dist/infra/llm/gemini-video-model.js.map +1 -0
- package/dist/infra/llm/openai-compatible-model.d.ts +13 -0
- package/dist/infra/llm/openai-compatible-model.js +143 -0
- package/dist/infra/llm/openai-compatible-model.js.map +1 -0
- package/dist/infra/llm/proxy.d.ts +1 -0
- package/dist/infra/llm/proxy.js +30 -0
- package/dist/infra/llm/proxy.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 +36 -9
- package/dist/usecases/doctor.js.map +1 -1
- package/dist/usecases/ingest/command.d.ts +5 -0
- package/dist/usecases/ingest/command.js +57 -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 +1 -0
- 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 +2 -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 +19 -6
- package/dist/usecases/script/lib.js +173 -99
- package/dist/usecases/script/lib.js.map +1 -1
- package/dist/usecases/script/locations.js +1 -0
- 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 +1 -0
- 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/states.js +58 -13
- package/dist/usecases/script/states.js.map +1 -1
- package/dist/usecases/script/summary.js +8 -0
- 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 +11 -3
- package/scripts/install-skill.mjs +120 -0
- package/skills/scriptctl/SKILL.md +293 -0
- package/skills/scriptctl/references/atomic-write-workflow.md +117 -0
- package/skills/scriptctl/references/ingest-workflow.md +85 -0
- package/skills/scriptctl/references/state-reference-repair.md +59 -0
- 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 -8516
- 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
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type Obj = Record<string, unknown>;
|
|
2
|
+
export type IdMap = {
|
|
3
|
+
episodes: Record<string, string>;
|
|
4
|
+
scenes: Record<string, string>;
|
|
5
|
+
actors: Record<string, string>;
|
|
6
|
+
locations: Record<string, string>;
|
|
7
|
+
props: Record<string, string>;
|
|
8
|
+
states: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
export declare function renumberIds(input: unknown): {
|
|
11
|
+
script: Obj;
|
|
12
|
+
idMap: IdMap;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// Deterministic final id renumbering (§ ids). Governance leaves survivor ids
|
|
2
|
+
// with gaps (merges/…) and globally-unique state ids; this one-time pass, run at
|
|
3
|
+
// the very end of ingest, renumbers everything to clean, contiguous, readable
|
|
4
|
+
// ids and rewrites all references. ids are opaque stable keys — this is only the
|
|
5
|
+
// clean initial numbering for the freshly-generated product (editing never
|
|
6
|
+
// renumbers). Pure: input never mutated; returns the doc + old→new id map.
|
|
7
|
+
//
|
|
8
|
+
// episode ep_NNN by episodes[] order
|
|
9
|
+
// scene scn_NNN global, by appearance order (scenes can move across eps)
|
|
10
|
+
// actor act_NNN by first appearance in the script (per kind, contiguous)
|
|
11
|
+
// location loc_NNN
|
|
12
|
+
// prop prp_NNN
|
|
13
|
+
// state default + st_NNN per-asset scoped (default kept)
|
|
14
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
15
|
+
const isArr = (v) => Array.isArray(v);
|
|
16
|
+
const pad = (n) => String(n).padStart(3, "0");
|
|
17
|
+
const KINDS = [
|
|
18
|
+
{ key: "actors", idField: "actor_id", prefix: "act" },
|
|
19
|
+
{ key: "locations", idField: "location_id", prefix: "loc" },
|
|
20
|
+
{ key: "props", idField: "prop_id", prefix: "prp" },
|
|
21
|
+
];
|
|
22
|
+
export function renumberIds(input) {
|
|
23
|
+
if (!isObj(input))
|
|
24
|
+
throw new Error("renumberIds expects a script object");
|
|
25
|
+
const doc = JSON.parse(JSON.stringify(input));
|
|
26
|
+
const idMap = { episodes: {}, scenes: {}, actors: {}, locations: {}, props: {}, states: {} };
|
|
27
|
+
// 1. Asset ids by first appearance (document walk).
|
|
28
|
+
const seen = { actors: [], locations: [], props: [] };
|
|
29
|
+
const seenSet = { actors: new Set(), locations: new Set(), props: new Set() };
|
|
30
|
+
const see = (bucket, id) => { if (typeof id === "string" && !seenSet[bucket].has(id)) {
|
|
31
|
+
seenSet[bucket].add(id);
|
|
32
|
+
seen[bucket].push(id);
|
|
33
|
+
} };
|
|
34
|
+
for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
|
|
35
|
+
if (!isObj(ep) || !isArr(ep.scenes))
|
|
36
|
+
continue;
|
|
37
|
+
for (const sc of ep.scenes) {
|
|
38
|
+
if (!isObj(sc))
|
|
39
|
+
continue;
|
|
40
|
+
if (isObj(sc.location))
|
|
41
|
+
see("locations", sc.location.location_id);
|
|
42
|
+
for (const a of isArr(sc.actors) ? sc.actors : [])
|
|
43
|
+
if (isObj(a))
|
|
44
|
+
see("actors", a.actor_id);
|
|
45
|
+
for (const p of isArr(sc.props) ? sc.props : [])
|
|
46
|
+
if (isObj(p))
|
|
47
|
+
see("props", p.prop_id);
|
|
48
|
+
for (const ac of isArr(sc.actions) ? sc.actions : [])
|
|
49
|
+
if (isObj(ac) && isObj(ac.speaker))
|
|
50
|
+
see("actors", ac.speaker.actor_id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Append any asset present in the top-level lists but never referenced.
|
|
54
|
+
for (const { key, idField } of KINDS)
|
|
55
|
+
for (const a of isArr(doc[key]) ? doc[key] : [])
|
|
56
|
+
if (isObj(a))
|
|
57
|
+
see(key, a[idField]);
|
|
58
|
+
for (const { key, prefix } of KINDS)
|
|
59
|
+
seen[key].forEach((old, i) => { idMap[key][old] = `${prefix}_${pad(i + 1)}`; });
|
|
60
|
+
// 2. Rebuild top-level asset lists in new-id order; renumber per-asset states.
|
|
61
|
+
for (const { key, idField } of KINDS) {
|
|
62
|
+
const list = (isArr(doc[key]) ? doc[key] : []).filter(isObj);
|
|
63
|
+
const bucket = idMap[key];
|
|
64
|
+
const byNew = new Map();
|
|
65
|
+
for (const a of list) {
|
|
66
|
+
const oldId = a[idField];
|
|
67
|
+
const newId = bucket[oldId] ?? oldId;
|
|
68
|
+
a[idField] = newId;
|
|
69
|
+
// states: keep default, renumber the rest st_001.. in array order.
|
|
70
|
+
let n = 0;
|
|
71
|
+
for (const st of isArr(a.states) ? a.states : []) {
|
|
72
|
+
if (!isObj(st) || typeof st.state_id !== "string")
|
|
73
|
+
continue;
|
|
74
|
+
if (st.state_id === "default")
|
|
75
|
+
continue;
|
|
76
|
+
const ns = `st_${pad(++n)}`;
|
|
77
|
+
idMap.states[st.state_id] = ns;
|
|
78
|
+
st.state_id = ns;
|
|
79
|
+
}
|
|
80
|
+
byNew.set(newId, a);
|
|
81
|
+
}
|
|
82
|
+
doc[key] = [...byNew.entries()].sort((x, y) => (x[0] < y[0] ? -1 : 1)).map((e) => e[1]);
|
|
83
|
+
}
|
|
84
|
+
// 3. Episode / scene ids (in order).
|
|
85
|
+
let scn = 0;
|
|
86
|
+
(isArr(doc.episodes) ? doc.episodes : []).forEach((ep, ei) => {
|
|
87
|
+
if (!isObj(ep))
|
|
88
|
+
return;
|
|
89
|
+
if (typeof ep.episode_id === "string") {
|
|
90
|
+
const nid = `ep_${pad(ei + 1)}`;
|
|
91
|
+
idMap.episodes[ep.episode_id] = nid;
|
|
92
|
+
ep.episode_id = nid;
|
|
93
|
+
}
|
|
94
|
+
for (const sc of isArr(ep.scenes) ? ep.scenes : []) {
|
|
95
|
+
if (!isObj(sc))
|
|
96
|
+
continue;
|
|
97
|
+
if (typeof sc.scene_id === "string") {
|
|
98
|
+
const nid = `scn_${pad(++scn)}`;
|
|
99
|
+
idMap.scenes[sc.scene_id] = nid;
|
|
100
|
+
sc.scene_id = nid;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// 4. Rewrite references (asset ids + state ids) throughout the scenes.
|
|
105
|
+
const remapRef = (holder, idField, kind) => {
|
|
106
|
+
if (!isObj(holder) || typeof holder[idField] !== "string")
|
|
107
|
+
return;
|
|
108
|
+
holder[idField] = idMap[kind][holder[idField]] ?? holder[idField];
|
|
109
|
+
if (typeof holder.state_id === "string" && idMap.states[holder.state_id])
|
|
110
|
+
holder.state_id = idMap.states[holder.state_id];
|
|
111
|
+
};
|
|
112
|
+
for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
|
|
113
|
+
if (!isObj(ep) || !isArr(ep.scenes))
|
|
114
|
+
continue;
|
|
115
|
+
for (const sc of ep.scenes) {
|
|
116
|
+
if (!isObj(sc))
|
|
117
|
+
continue;
|
|
118
|
+
remapRef(sc.location, "location_id", "locations");
|
|
119
|
+
for (const a of isArr(sc.actors) ? sc.actors : [])
|
|
120
|
+
remapRef(a, "actor_id", "actors");
|
|
121
|
+
for (const p of isArr(sc.props) ? sc.props : [])
|
|
122
|
+
remapRef(p, "prop_id", "props");
|
|
123
|
+
for (const ac of isArr(sc.actions) ? sc.actions : [])
|
|
124
|
+
if (isObj(ac))
|
|
125
|
+
remapRef(ac.speaker, "actor_id", "actors");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return { script: doc, idMap };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=renumber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renumber.js","sourceRoot":"","sources":["../../../src/domain/ingest/renumber.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export type SpeakerV3 = {
|
|
2
|
+
actor_id: string;
|
|
3
|
+
state_id?: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: "system" | "broadcast" | "offscreen" | "group";
|
|
6
|
+
label?: string;
|
|
7
|
+
};
|
|
8
|
+
export type Importance = "featured" | "background";
|
|
9
|
+
export declare const IMPORTANCE_TIERS: readonly ["featured", "background"];
|
|
10
|
+
export type TransitionPromptV3 = {
|
|
11
|
+
target: string;
|
|
12
|
+
process: string;
|
|
13
|
+
contrast: string;
|
|
14
|
+
};
|
|
15
|
+
export interface ActionV3 {
|
|
16
|
+
type: "action" | "dialogue" | "inner_thought" | "transition";
|
|
17
|
+
content: string;
|
|
18
|
+
speaker?: SpeakerV3;
|
|
19
|
+
emotion?: string;
|
|
20
|
+
transition_prompt?: TransitionPromptV3;
|
|
21
|
+
}
|
|
22
|
+
export type EntityRefV3 = {
|
|
23
|
+
actor_id: string;
|
|
24
|
+
state_id?: string;
|
|
25
|
+
} | {
|
|
26
|
+
prop_id: string;
|
|
27
|
+
state_id?: string;
|
|
28
|
+
};
|
|
29
|
+
export interface SceneV3 {
|
|
30
|
+
scene_id: string;
|
|
31
|
+
environment?: {
|
|
32
|
+
space?: string;
|
|
33
|
+
time?: string;
|
|
34
|
+
};
|
|
35
|
+
location: {
|
|
36
|
+
location_id: string;
|
|
37
|
+
state_id?: string;
|
|
38
|
+
} | null;
|
|
39
|
+
actors: {
|
|
40
|
+
actor_id: string;
|
|
41
|
+
state_id?: string;
|
|
42
|
+
}[];
|
|
43
|
+
props: {
|
|
44
|
+
prop_id: string;
|
|
45
|
+
state_id?: string;
|
|
46
|
+
}[];
|
|
47
|
+
actions: ActionV3[];
|
|
48
|
+
}
|
|
49
|
+
export interface EpisodeV3 {
|
|
50
|
+
episode_id: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
scenes: SceneV3[];
|
|
53
|
+
}
|
|
54
|
+
export interface StateV3 {
|
|
55
|
+
state_id: string;
|
|
56
|
+
state_name: string;
|
|
57
|
+
description: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ActorV3 {
|
|
60
|
+
actor_id: string;
|
|
61
|
+
actor_name: string;
|
|
62
|
+
importance: Importance;
|
|
63
|
+
role_type?: string;
|
|
64
|
+
aliases?: string[];
|
|
65
|
+
description: string;
|
|
66
|
+
states: StateV3[];
|
|
67
|
+
}
|
|
68
|
+
export interface LocationV3 {
|
|
69
|
+
location_id: string;
|
|
70
|
+
location_name: string;
|
|
71
|
+
importance: Importance;
|
|
72
|
+
aliases?: string[];
|
|
73
|
+
description: string;
|
|
74
|
+
states: StateV3[];
|
|
75
|
+
}
|
|
76
|
+
export interface PropV3 {
|
|
77
|
+
prop_id: string;
|
|
78
|
+
prop_name: string;
|
|
79
|
+
importance: Importance;
|
|
80
|
+
aliases?: string[];
|
|
81
|
+
description: string;
|
|
82
|
+
states: StateV3[];
|
|
83
|
+
}
|
|
84
|
+
export interface ScriptV3 {
|
|
85
|
+
version: 3;
|
|
86
|
+
title: string;
|
|
87
|
+
worldview: string;
|
|
88
|
+
style: string;
|
|
89
|
+
actors: ActorV3[];
|
|
90
|
+
locations: LocationV3[];
|
|
91
|
+
props: PropV3[];
|
|
92
|
+
episodes: EpisodeV3[];
|
|
93
|
+
}
|
|
94
|
+
export declare const NON_ACTOR_SPEAKER_KINDS: readonly ["system", "broadcast", "offscreen", "group", "minor"];
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Script schema v3 (§15.1, revised): content is plain text; scene-level cast and
|
|
2
|
+
// props carry materialized state. Kept ingest-local. Scripts remain plain JSON
|
|
3
|
+
// objects; these types document the shape the emitter writes and the validator
|
|
4
|
+
// enforces.
|
|
5
|
+
export const IMPORTANCE_TIERS = ["featured", "background"];
|
|
6
|
+
export const NON_ACTOR_SPEAKER_KINDS = ["system", "broadcast", "offscreen", "group", "minor"];
|
|
7
|
+
//# sourceMappingURL=script-v3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-v3.js","sourceRoot":"","sources":["../../../src/domain/ingest/script-v3.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,+EAA+E;AAC/E,YAAY;AASZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,YAAY,CAAU,CAAC;AAyCpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type StateGroup = {
|
|
2
|
+
canonical: string;
|
|
3
|
+
state_ids: string[];
|
|
4
|
+
};
|
|
5
|
+
type Obj = Record<string, unknown>;
|
|
6
|
+
export declare function mergeableStates(asset: Obj): Array<{
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function applyStateReconcile(input: unknown, keepByAsset: Map<string, StateGroup[]>): Obj;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Deterministic state-reconcile apply (§9.8). The LLM, per owner, selects the
|
|
2
|
+
// DURABLE appearance states (grouping equivalents, choosing a canonical name);
|
|
3
|
+
// every other candidate state is transient (emotion/pose/action/moment) and is
|
|
4
|
+
// dropped. This module applies that: keep+rename+merge the selected states, drop
|
|
5
|
+
// the rest (clearing refs that used them so they inherit), on the pre-materialize
|
|
6
|
+
// doc; governDeterministic then assigns default + materializes. Pure.
|
|
7
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
8
|
+
const isArr = (v) => Array.isArray(v);
|
|
9
|
+
const KIND_ID_FIELD = { actor: "actor_id", location: "location_id", prop: "prop_id" };
|
|
10
|
+
// Non-"default" states of an asset as {id, name} — the candidates.
|
|
11
|
+
export function mergeableStates(asset) {
|
|
12
|
+
return (isArr(asset.states) ? asset.states : []).filter(isObj)
|
|
13
|
+
.map((s) => ({ id: String(s.state_id), name: String(s.state_name) }))
|
|
14
|
+
.filter((s) => s.id !== "default");
|
|
15
|
+
}
|
|
16
|
+
// keepByAsset: assetId → the durable state groups the model selected. Any
|
|
17
|
+
// non-default state of that asset NOT in a group is dropped.
|
|
18
|
+
export function applyStateReconcile(input, keepByAsset) {
|
|
19
|
+
if (!isObj(input))
|
|
20
|
+
throw new Error("state-reconcile expects a script object");
|
|
21
|
+
const doc = JSON.parse(JSON.stringify(input));
|
|
22
|
+
const remap = new Map(); // global-unique stateId → survivor id, or null = drop (clear ref)
|
|
23
|
+
for (const kind of ["actor", "location", "prop"]) {
|
|
24
|
+
const list = doc[`${kind}s`];
|
|
25
|
+
if (!isArr(list))
|
|
26
|
+
continue;
|
|
27
|
+
for (const asset of list) {
|
|
28
|
+
if (!isObj(asset))
|
|
29
|
+
continue;
|
|
30
|
+
const id = String(asset[KIND_ID_FIELD[kind]]);
|
|
31
|
+
const groups = keepByAsset.get(id);
|
|
32
|
+
if (!groups)
|
|
33
|
+
continue; // owner not reconciled (no non-default states)
|
|
34
|
+
const states = (isArr(asset.states) ? asset.states : []).filter(isObj);
|
|
35
|
+
const byId = new Map(states.map((s) => [String(s.state_id), s]));
|
|
36
|
+
const kept = states.filter((s) => s.state_id === "default"); // keep synthetic default
|
|
37
|
+
const keptIds = new Set();
|
|
38
|
+
for (const g of groups) {
|
|
39
|
+
const members = g.state_ids.filter((sid) => byId.has(sid) && sid !== "default");
|
|
40
|
+
if (members.length === 0)
|
|
41
|
+
continue;
|
|
42
|
+
const rep = members[0];
|
|
43
|
+
byId.get(rep).state_name = g.canonical;
|
|
44
|
+
kept.push(byId.get(rep));
|
|
45
|
+
for (const m of members) {
|
|
46
|
+
remap.set(m, rep);
|
|
47
|
+
keptIds.add(m);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Any non-default candidate not kept is a transient state → drop (clear refs).
|
|
51
|
+
for (const s of states) {
|
|
52
|
+
const sid = String(s.state_id);
|
|
53
|
+
if (sid !== "default" && !keptIds.has(sid))
|
|
54
|
+
remap.set(sid, null);
|
|
55
|
+
}
|
|
56
|
+
asset.states = kept;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (remap.size > 0)
|
|
60
|
+
rewriteRefStates(doc, remap);
|
|
61
|
+
return doc;
|
|
62
|
+
}
|
|
63
|
+
function rewriteRefStates(doc, remap) {
|
|
64
|
+
const fix = (holder) => {
|
|
65
|
+
if (!isObj(holder) || typeof holder.state_id !== "string" || !remap.has(holder.state_id))
|
|
66
|
+
return;
|
|
67
|
+
const nv = remap.get(holder.state_id);
|
|
68
|
+
if (nv === null)
|
|
69
|
+
delete holder.state_id; // dropped transient → inherit
|
|
70
|
+
else
|
|
71
|
+
holder.state_id = nv;
|
|
72
|
+
};
|
|
73
|
+
for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
|
|
74
|
+
if (!isObj(ep) || !isArr(ep.scenes))
|
|
75
|
+
continue;
|
|
76
|
+
for (const sc of ep.scenes) {
|
|
77
|
+
if (!isObj(sc))
|
|
78
|
+
continue;
|
|
79
|
+
fix(sc.location);
|
|
80
|
+
for (const a of isArr(sc.actors) ? sc.actors : [])
|
|
81
|
+
fix(a);
|
|
82
|
+
for (const p of isArr(sc.props) ? sc.props : [])
|
|
83
|
+
fix(p);
|
|
84
|
+
for (const ac of isArr(sc.actions) ? sc.actions : [])
|
|
85
|
+
if (isObj(ac))
|
|
86
|
+
fix(ac.speaker);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=state-reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-reconcile.js","sourceRoot":"","sources":["../../../src/domain/ingest/state-reconcile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ValidationIssue = {
|
|
2
|
+
code: string;
|
|
3
|
+
path: string;
|
|
4
|
+
message: string;
|
|
5
|
+
};
|
|
6
|
+
export type ValidationResult = {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
errors: ValidationIssue[];
|
|
9
|
+
warnings: ValidationIssue[];
|
|
10
|
+
};
|
|
11
|
+
export declare function validateScriptV3(doc: unknown): ValidationResult;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// Deterministic Script v3 structural + referential validator (§9.9, revised).
|
|
2
|
+
// Enforces v3 invariants: plain-text content, single scene-level location,
|
|
3
|
+
// scene-level actors/props with materialized state, no legacy v2 fields
|
|
4
|
+
// (state_changes / action.actor_id / scene.context / speakers[] / content spans).
|
|
5
|
+
import { IMPORTANCE_TIERS, NON_ACTOR_SPEAKER_KINDS } from "./script-v3.js";
|
|
6
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
7
|
+
const isArr = (v) => Array.isArray(v);
|
|
8
|
+
const isStr = (v) => typeof v === "string";
|
|
9
|
+
const ACTION_LEGACY = ["state_changes", "actor_id", "speakers", "lines"];
|
|
10
|
+
export function validateScriptV3(doc) {
|
|
11
|
+
const errors = [];
|
|
12
|
+
const warnings = [];
|
|
13
|
+
const err = (code, path, message) => errors.push({ code, path, message });
|
|
14
|
+
if (!isObj(doc))
|
|
15
|
+
return { ok: false, errors: [{ code: "not_object", path: "$", message: "script must be an object" }], warnings };
|
|
16
|
+
if (doc.version !== 3)
|
|
17
|
+
err("version", "$.version", "version must be 3");
|
|
18
|
+
for (const key of ["title", "worldview", "style"])
|
|
19
|
+
if (!isStr(doc[key]))
|
|
20
|
+
err("field", `$.${key}`, `${key} must be a string`);
|
|
21
|
+
const stateIds = new Map();
|
|
22
|
+
const idKind = new Map();
|
|
23
|
+
const collect = (list, kind, idField, nameField, path) => {
|
|
24
|
+
if (!isArr(list)) {
|
|
25
|
+
err("field", path, `${path} must be an array`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
list.forEach((raw, i) => {
|
|
29
|
+
const p = `${path}[${i}]`;
|
|
30
|
+
if (!isObj(raw)) {
|
|
31
|
+
err("asset", p, "asset must be an object");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const id = raw[idField];
|
|
35
|
+
if (!isStr(id)) {
|
|
36
|
+
err("asset_id", `${p}.${idField}`, `${idField} required`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (idKind.has(id))
|
|
40
|
+
err("dup_id", `${p}.${idField}`, `duplicate id ${id}`);
|
|
41
|
+
idKind.set(id, kind);
|
|
42
|
+
if (!isStr(raw[nameField]))
|
|
43
|
+
err("asset_name", `${p}.${nameField}`, `${nameField} required`);
|
|
44
|
+
if (!isStr(raw.importance) || !IMPORTANCE_TIERS.includes(raw.importance))
|
|
45
|
+
err("importance", `${p}.importance`, `importance must be one of ${IMPORTANCE_TIERS.join("|")}`);
|
|
46
|
+
if (!isStr(raw.description))
|
|
47
|
+
err("asset_desc", `${p}.description`, "description must be a string");
|
|
48
|
+
const ids = new Set();
|
|
49
|
+
let defaults = 0;
|
|
50
|
+
if (!isArr(raw.states) || raw.states.length === 0)
|
|
51
|
+
err("states", `${p}.states`, "states must be a non-empty array");
|
|
52
|
+
else
|
|
53
|
+
raw.states.forEach((st, j) => {
|
|
54
|
+
const sp = `${p}.states[${j}]`;
|
|
55
|
+
if (!isObj(st) || !isStr(st.state_id)) {
|
|
56
|
+
err("state_id", sp, "state_id required");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (ids.has(st.state_id))
|
|
60
|
+
err("dup_state", sp, `duplicate state_id ${st.state_id}`);
|
|
61
|
+
ids.add(st.state_id);
|
|
62
|
+
if (st.state_id === "default")
|
|
63
|
+
defaults++;
|
|
64
|
+
if (!isStr(st.state_name))
|
|
65
|
+
err("state_name", `${sp}.state_name`, "state_name required");
|
|
66
|
+
});
|
|
67
|
+
if (isArr(raw.states) && defaults !== 1)
|
|
68
|
+
err("default_state", `${p}.states`, `exactly one 'default' state required, found ${defaults}`);
|
|
69
|
+
stateIds.set(id, ids);
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
collect(doc.actors, "actor", "actor_id", "actor_name", "$.actors");
|
|
73
|
+
collect(doc.locations, "location", "location_id", "location_name", "$.locations");
|
|
74
|
+
collect(doc.props, "prop", "prop_id", "prop_name", "$.props");
|
|
75
|
+
const refState = (assetId, stateId, kind, path) => {
|
|
76
|
+
if (idKind.get(assetId) !== kind) {
|
|
77
|
+
err("ref", path, `${kind} ${assetId} not found`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (stateId !== undefined && (!isStr(stateId) || !stateIds.get(assetId)?.has(stateId)))
|
|
81
|
+
err("state_ref", path, `state ${String(stateId)} not materialized on ${assetId}`);
|
|
82
|
+
};
|
|
83
|
+
const checkEntityList = (list, kind, idField, path) => {
|
|
84
|
+
if (list === undefined) {
|
|
85
|
+
err("field", path, `${path} required (may be empty array)`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!isArr(list)) {
|
|
89
|
+
err("field", path, `${path} must be an array`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
list.forEach((ref, i) => {
|
|
93
|
+
if (!isObj(ref) || !isStr(ref[idField])) {
|
|
94
|
+
err("ref", `${path}[${i}]`, `${idField} required`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
refState(ref[idField], ref.state_id, kind, `${path}[${i}]`);
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const checkAction = (action, path) => {
|
|
101
|
+
if (!isObj(action)) {
|
|
102
|
+
err("action", path, "action must be an object");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
for (const bad of ACTION_LEGACY)
|
|
106
|
+
if (bad in action)
|
|
107
|
+
err("legacy_field", `${path}.${bad}`, `v3 forbids action.${bad}`);
|
|
108
|
+
const type = action.type;
|
|
109
|
+
if (type !== "action" && type !== "dialogue" && type !== "inner_thought" && type !== "transition")
|
|
110
|
+
err("action_type", `${path}.type`, `invalid action type ${String(type)}`);
|
|
111
|
+
if (!isStr(action.content))
|
|
112
|
+
err("content", `${path}.content`, "content must be a plain-text string");
|
|
113
|
+
if (type === "dialogue" || type === "inner_thought") {
|
|
114
|
+
const sp = action.speaker;
|
|
115
|
+
if (!isObj(sp))
|
|
116
|
+
err("speaker", `${path}.speaker`, "dialogue/inner_thought needs a speaker");
|
|
117
|
+
else if ("kind" in sp) {
|
|
118
|
+
if (!isStr(sp.kind) || !NON_ACTOR_SPEAKER_KINDS.includes(sp.kind))
|
|
119
|
+
err("speaker_kind", `${path}.speaker.kind`, "invalid non-actor speaker kind");
|
|
120
|
+
}
|
|
121
|
+
else if (isStr(sp.actor_id))
|
|
122
|
+
refState(sp.actor_id, sp.state_id, "actor", `${path}.speaker`);
|
|
123
|
+
else
|
|
124
|
+
err("speaker", `${path}.speaker`, "speaker needs actor_id or kind");
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const episodes = doc.episodes;
|
|
128
|
+
if (!isArr(episodes))
|
|
129
|
+
err("episodes", "$.episodes", "episodes must be an array");
|
|
130
|
+
else
|
|
131
|
+
episodes.forEach((ep, ei) => {
|
|
132
|
+
const ep_p = `$.episodes[${ei}]`;
|
|
133
|
+
if (!isObj(ep) || !isStr(ep.episode_id)) {
|
|
134
|
+
err("episode_id", ep_p, "episode_id required");
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (!isArr(ep.scenes)) {
|
|
138
|
+
err("scenes", `${ep_p}.scenes`, "scenes must be an array");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
ep.scenes.forEach((sc, si) => {
|
|
142
|
+
const sc_p = `${ep_p}.scenes[${si}]`;
|
|
143
|
+
if (!isObj(sc)) {
|
|
144
|
+
err("scene", sc_p, "scene must be an object");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if ("context" in sc)
|
|
148
|
+
err("legacy_field", `${sc_p}.context`, "v3 forbids scene.context");
|
|
149
|
+
if (!isStr(sc.scene_id))
|
|
150
|
+
err("scene_id", sc_p, "scene_id required");
|
|
151
|
+
const loc = sc.location;
|
|
152
|
+
if (loc !== null) {
|
|
153
|
+
if (!isObj(loc) || !isStr(loc.location_id))
|
|
154
|
+
err("location", `${sc_p}.location`, "location must be null or {location_id}");
|
|
155
|
+
else
|
|
156
|
+
refState(loc.location_id, loc.state_id, "location", `${sc_p}.location`);
|
|
157
|
+
}
|
|
158
|
+
checkEntityList(sc.actors, "actor", "actor_id", `${sc_p}.actors`);
|
|
159
|
+
checkEntityList(sc.props, "prop", "prop_id", `${sc_p}.props`);
|
|
160
|
+
if (!isArr(sc.actions))
|
|
161
|
+
err("actions", `${sc_p}.actions`, "actions must be an array");
|
|
162
|
+
else
|
|
163
|
+
sc.actions.forEach((a, ai) => checkAction(a, `${sc_p}.actions[${ai}]`));
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
return { ok: errors.length === 0, errors, warnings };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/domain/ingest/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { VideoEpisodeDoc } from "./video-records.js";
|
|
2
|
+
export interface ActorAgg {
|
|
3
|
+
name: string;
|
|
4
|
+
episodes: number[];
|
|
5
|
+
appearances: string[];
|
|
6
|
+
anchors: string[];
|
|
7
|
+
voices: string[];
|
|
8
|
+
roles: string[];
|
|
9
|
+
states: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface AssetAgg {
|
|
12
|
+
name: string;
|
|
13
|
+
episodes: number[];
|
|
14
|
+
descs: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ContextData {
|
|
17
|
+
episodes: number[];
|
|
18
|
+
actors: ActorAgg[];
|
|
19
|
+
locations: AssetAgg[];
|
|
20
|
+
props: AssetAgg[];
|
|
21
|
+
}
|
|
22
|
+
export declare function aggregateContext(docs: VideoEpisodeDoc[]): ContextData;
|
|
23
|
+
export declare function renderContextMd(ctx: ContextData): string;
|