@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,210 @@
|
|
|
1
|
+
// Deterministic Pass5 coverage check + apply (§9.6/§9.9). Consumes a governance
|
|
2
|
+
// plan (per-asset keep/merge + canonical naming + importance tier) and rewrites
|
|
3
|
+
// the provisional script into the canonical one: merges identities, unions
|
|
4
|
+
// aliases/states, tags importance (survivor = highest tier of its merge group),
|
|
5
|
+
// then materializes state via governDeterministic. Nothing is dropped — bit
|
|
6
|
+
// parts stay as background-tier assets. Pure: input never mutated; any plan
|
|
7
|
+
// inconsistency throws (§12.3).
|
|
8
|
+
import { governDeterministic } from "./govern.js";
|
|
9
|
+
export class PlanError extends Error {
|
|
10
|
+
}
|
|
11
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
12
|
+
const isArr = (v) => Array.isArray(v);
|
|
13
|
+
const KIND_ID_FIELD = { actor: "actor_id", location: "location_id", prop: "prop_id" };
|
|
14
|
+
const TIER_RANK = { featured: 2, background: 1 };
|
|
15
|
+
const rankToTier = (r) => (r >= 2 ? "featured" : "background");
|
|
16
|
+
function indexAssets(doc) {
|
|
17
|
+
const kindOf = new Map();
|
|
18
|
+
const assetOf = new Map();
|
|
19
|
+
for (const kind of ["actor", "location", "prop"]) {
|
|
20
|
+
const list = doc[`${kind}s`];
|
|
21
|
+
if (!isArr(list))
|
|
22
|
+
continue;
|
|
23
|
+
for (const a of list) {
|
|
24
|
+
if (!isObj(a))
|
|
25
|
+
continue;
|
|
26
|
+
const id = a[KIND_ID_FIELD[kind]];
|
|
27
|
+
if (typeof id === "string") {
|
|
28
|
+
kindOf.set(id, kind);
|
|
29
|
+
assetOf.set(id, a);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { kindOf, assetOf };
|
|
34
|
+
}
|
|
35
|
+
// Resolve each provisional id to its surviving canonical id (following merge
|
|
36
|
+
// chains). Detects cycles, unknown targets, cross-kind merges. No drops.
|
|
37
|
+
function resolveFinal(plan, kindOf) {
|
|
38
|
+
const byId = new Map();
|
|
39
|
+
for (const d of plan.decisions) {
|
|
40
|
+
if (byId.has(d.provisional_id))
|
|
41
|
+
throw new PlanError(`duplicate decision for ${d.provisional_id}`);
|
|
42
|
+
byId.set(d.provisional_id, d);
|
|
43
|
+
}
|
|
44
|
+
for (const id of kindOf.keys())
|
|
45
|
+
if (!byId.has(id))
|
|
46
|
+
throw new PlanError(`no decision for asset ${id}`);
|
|
47
|
+
const final = new Map();
|
|
48
|
+
const resolve = (id, seen) => {
|
|
49
|
+
const cached = final.get(id);
|
|
50
|
+
if (cached)
|
|
51
|
+
return cached;
|
|
52
|
+
if (seen.has(id))
|
|
53
|
+
throw new PlanError(`merge cycle at ${id}`);
|
|
54
|
+
seen.add(id);
|
|
55
|
+
const d = byId.get(id);
|
|
56
|
+
if (!d)
|
|
57
|
+
throw new PlanError(`decision references unknown asset ${id}`);
|
|
58
|
+
let result;
|
|
59
|
+
if (d.action === "keep")
|
|
60
|
+
result = id;
|
|
61
|
+
else {
|
|
62
|
+
if (!d.merge_into)
|
|
63
|
+
throw new PlanError(`merge for ${id} missing merge_into`);
|
|
64
|
+
if (kindOf.get(d.merge_into) !== kindOf.get(id))
|
|
65
|
+
throw new PlanError(`cross-kind merge ${id} → ${d.merge_into}`);
|
|
66
|
+
result = resolve(d.merge_into, seen);
|
|
67
|
+
}
|
|
68
|
+
final.set(id, result);
|
|
69
|
+
return result;
|
|
70
|
+
};
|
|
71
|
+
for (const id of byId.keys())
|
|
72
|
+
resolve(id, new Set());
|
|
73
|
+
return final;
|
|
74
|
+
}
|
|
75
|
+
export function checkPlanCoverage(doc, plan) {
|
|
76
|
+
if (!isObj(doc))
|
|
77
|
+
throw new PlanError("script must be an object");
|
|
78
|
+
resolveFinal(plan, indexAssets(doc).kindOf);
|
|
79
|
+
}
|
|
80
|
+
// Identity merge + reference rewrite + importance tag, WITHOUT the final default/
|
|
81
|
+
// materialize step (governDeterministic runs after, in applyPlan).
|
|
82
|
+
export function applyPlanRaw(input, plan) {
|
|
83
|
+
if (!isObj(input))
|
|
84
|
+
throw new PlanError("script must be an object");
|
|
85
|
+
checkPlanCoverage(input, plan);
|
|
86
|
+
const doc = JSON.parse(JSON.stringify(input));
|
|
87
|
+
const { kindOf, assetOf } = indexAssets(doc);
|
|
88
|
+
const final = resolveFinal(plan, kindOf);
|
|
89
|
+
const tierOf = (id) => TIER_RANK[plan.importance[id] ?? "featured"]; // unclassified → featured (don't hide a real asset)
|
|
90
|
+
// When two merged assets share a state NAME, the merged copy's state_id is
|
|
91
|
+
// deduped away; scene refs that used it must repoint to the survivor's
|
|
92
|
+
// same-named state_id or they dangle (state not materialized).
|
|
93
|
+
const stateRemap = new Map();
|
|
94
|
+
for (const kind of ["actor", "location", "prop"]) {
|
|
95
|
+
const idField = KIND_ID_FIELD[kind];
|
|
96
|
+
const nameField = `${kind}_name`;
|
|
97
|
+
const survivors = [];
|
|
98
|
+
const merged = new Map();
|
|
99
|
+
for (const [id, f] of final) {
|
|
100
|
+
if (kindOf.get(id) !== kind)
|
|
101
|
+
continue;
|
|
102
|
+
if (f === id)
|
|
103
|
+
survivors.push(assetOf.get(id));
|
|
104
|
+
else {
|
|
105
|
+
if (!merged.has(f))
|
|
106
|
+
merged.set(f, []);
|
|
107
|
+
merged.get(f).push(assetOf.get(id));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const s of survivors) {
|
|
111
|
+
const id = s[idField];
|
|
112
|
+
const info = plan.canonical[id];
|
|
113
|
+
const aliasSet = new Set(isArr(s.aliases) ? s.aliases : []);
|
|
114
|
+
const stateNames = new Set((isArr(s.states) ? s.states : []).filter(isObj).map((st) => String(st.state_name)));
|
|
115
|
+
const states = (isArr(s.states) ? s.states : []).filter(isObj);
|
|
116
|
+
let rank = tierOf(id);
|
|
117
|
+
for (const m of merged.get(id) ?? []) {
|
|
118
|
+
rank = Math.max(rank, tierOf(m[idField]));
|
|
119
|
+
if (typeof m[nameField] === "string")
|
|
120
|
+
aliasSet.add(m[nameField]);
|
|
121
|
+
for (const a of isArr(m.aliases) ? m.aliases : [])
|
|
122
|
+
aliasSet.add(a);
|
|
123
|
+
for (const st of (isArr(m.states) ? m.states : []).filter(isObj)) {
|
|
124
|
+
const nm = String(st.state_name);
|
|
125
|
+
if (st.state_id !== "default" && !stateNames.has(nm)) {
|
|
126
|
+
stateNames.add(nm);
|
|
127
|
+
states.push({ state_id: st.state_id, state_name: nm, description: st.description ?? "" });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Record deduped merged state_ids → survivor's same-named state_id.
|
|
132
|
+
const nameToId = new Map();
|
|
133
|
+
for (const st of states) {
|
|
134
|
+
const nm = String(st.state_name);
|
|
135
|
+
if (!nameToId.has(nm))
|
|
136
|
+
nameToId.set(nm, String(st.state_id));
|
|
137
|
+
}
|
|
138
|
+
for (const m of merged.get(id) ?? []) {
|
|
139
|
+
for (const st of (isArr(m.states) ? m.states : []).filter(isObj)) {
|
|
140
|
+
const oldId = String(st.state_id);
|
|
141
|
+
if (oldId === "default")
|
|
142
|
+
continue;
|
|
143
|
+
const newId = nameToId.get(String(st.state_name));
|
|
144
|
+
if (newId && newId !== oldId)
|
|
145
|
+
stateRemap.set(oldId, newId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (info?.name) {
|
|
149
|
+
aliasSet.add(s[nameField]);
|
|
150
|
+
s[nameField] = info.name;
|
|
151
|
+
}
|
|
152
|
+
if (info?.aliases)
|
|
153
|
+
for (const a of info.aliases)
|
|
154
|
+
aliasSet.add(a);
|
|
155
|
+
aliasSet.delete(s[nameField]);
|
|
156
|
+
s.aliases = [...aliasSet];
|
|
157
|
+
s.states = states;
|
|
158
|
+
s.importance = rankToTier(rank);
|
|
159
|
+
}
|
|
160
|
+
doc[`${kind}s`] = survivors;
|
|
161
|
+
}
|
|
162
|
+
// Rewrite scene references against the merge map (merged assets dedup; first
|
|
163
|
+
// ref's state_id wins). content is plain text and untouched.
|
|
164
|
+
const remapRefs = (list, idField) => {
|
|
165
|
+
const out = [];
|
|
166
|
+
const seen = new Set();
|
|
167
|
+
for (const ref of isArr(list) ? list : []) {
|
|
168
|
+
if (!isObj(ref) || typeof ref[idField] !== "string")
|
|
169
|
+
continue;
|
|
170
|
+
const f = final.get(ref[idField]);
|
|
171
|
+
if (!f || seen.has(f))
|
|
172
|
+
continue;
|
|
173
|
+
seen.add(f);
|
|
174
|
+
const stateId = typeof ref.state_id === "string" ? (stateRemap.get(ref.state_id) ?? ref.state_id) : undefined;
|
|
175
|
+
out.push({ [idField]: f, ...(stateId !== undefined ? { state_id: stateId } : {}) });
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
};
|
|
179
|
+
for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
|
|
180
|
+
if (!isObj(ep) || !isArr(ep.scenes))
|
|
181
|
+
continue;
|
|
182
|
+
for (const sc of ep.scenes) {
|
|
183
|
+
if (!isObj(sc))
|
|
184
|
+
continue;
|
|
185
|
+
if (isObj(sc.location) && typeof sc.location.location_id === "string") {
|
|
186
|
+
const f = final.get(sc.location.location_id);
|
|
187
|
+
if (f) {
|
|
188
|
+
const st = typeof sc.location.state_id === "string" ? (stateRemap.get(sc.location.state_id) ?? sc.location.state_id) : undefined;
|
|
189
|
+
sc.location = { location_id: f, ...(st !== undefined ? { state_id: st } : {}) };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
sc.actors = remapRefs(sc.actors, "actor_id");
|
|
193
|
+
sc.props = remapRefs(sc.props, "prop_id");
|
|
194
|
+
for (const ac of isArr(sc.actions) ? sc.actions : []) {
|
|
195
|
+
if (isObj(ac) && isObj(ac.speaker) && typeof ac.speaker.actor_id === "string") {
|
|
196
|
+
const f = final.get(ac.speaker.actor_id);
|
|
197
|
+
if (f)
|
|
198
|
+
ac.speaker.actor_id = f;
|
|
199
|
+
if (typeof ac.speaker.state_id === "string" && stateRemap.has(ac.speaker.state_id))
|
|
200
|
+
ac.speaker.state_id = stateRemap.get(ac.speaker.state_id);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return doc;
|
|
206
|
+
}
|
|
207
|
+
export function applyPlan(input, plan) {
|
|
208
|
+
return governDeterministic(applyPlanRaw(input, plan));
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=apply-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-plan.js","sourceRoot":"","sources":["../../../src/domain/ingest/apply-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { NameStateRef, IngestRecord, SpeakerRef } from "./records.js";
|
|
2
|
+
export declare class AssembleError extends Error {
|
|
3
|
+
}
|
|
4
|
+
export type ProvisionalOccurrence = {
|
|
5
|
+
episode: number;
|
|
6
|
+
scene: number;
|
|
7
|
+
};
|
|
8
|
+
export type ProvisionalAsset = {
|
|
9
|
+
provisional_id: string;
|
|
10
|
+
kind: "actor" | "location" | "prop";
|
|
11
|
+
names: string[];
|
|
12
|
+
states: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
id: string;
|
|
15
|
+
}>;
|
|
16
|
+
occurrences: ProvisionalOccurrence[];
|
|
17
|
+
};
|
|
18
|
+
export type NameScene = {
|
|
19
|
+
scene_id: string;
|
|
20
|
+
environment?: {
|
|
21
|
+
space?: string;
|
|
22
|
+
time?: string;
|
|
23
|
+
};
|
|
24
|
+
location: NameStateRef | null;
|
|
25
|
+
actors: NameStateRef[];
|
|
26
|
+
props: NameStateRef[];
|
|
27
|
+
actions: Array<{
|
|
28
|
+
type: string;
|
|
29
|
+
content: string;
|
|
30
|
+
speaker?: SpeakerRef;
|
|
31
|
+
emotion?: string;
|
|
32
|
+
extend?: Record<string, unknown>;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
export type NameScript = {
|
|
36
|
+
title: string;
|
|
37
|
+
episodes: Array<{
|
|
38
|
+
episode_id: string;
|
|
39
|
+
title?: string;
|
|
40
|
+
scenes: NameScene[];
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
export type AssembleResult = {
|
|
44
|
+
script: NameScript;
|
|
45
|
+
notes: Array<{
|
|
46
|
+
content: string;
|
|
47
|
+
category?: string;
|
|
48
|
+
source: unknown;
|
|
49
|
+
}>;
|
|
50
|
+
};
|
|
51
|
+
export declare function assemble(records: IngestRecord[], opts?: {
|
|
52
|
+
title?: string;
|
|
53
|
+
}): AssembleResult;
|
|
54
|
+
export declare function assignProvisionalIds(name: NameScript): {
|
|
55
|
+
script: Record<string, unknown>;
|
|
56
|
+
assets: ProvisionalAsset[];
|
|
57
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// Deterministic assembler (§8): merged JSONL records → provisional Script v3.
|
|
2
|
+
// Two steps: (1) assemble() builds a name-based script skeleton (plain-text
|
|
3
|
+
// content; scene-level cast = declared `人物:` ∪ dialogue speakers; declared
|
|
4
|
+
// props); (2) assignProvisionalIds() turns names into provisional ids and builds
|
|
5
|
+
// the Pass5 evidence roster. pass5-extract augments the name-based scene cast
|
|
6
|
+
// between the two steps. Pure and byte-stable. Strict: body before any scene
|
|
7
|
+
// throws (no synthetic fallback).
|
|
8
|
+
export class AssembleError extends Error {
|
|
9
|
+
}
|
|
10
|
+
const pad = (n) => String(n).padStart(3, "0");
|
|
11
|
+
const norm = (s) => s.normalize("NFC").replace(/\s+/g, " ").trim();
|
|
12
|
+
export function assemble(records, opts = {}) {
|
|
13
|
+
const episodes = [];
|
|
14
|
+
const notes = [];
|
|
15
|
+
let curEpisode = null;
|
|
16
|
+
let curScene = null;
|
|
17
|
+
let epNo = 0;
|
|
18
|
+
let scnNo = 0;
|
|
19
|
+
const addActor = (scene, ref) => {
|
|
20
|
+
const existing = scene.actors.find((a) => norm(a.name) === norm(ref.name));
|
|
21
|
+
if (!existing)
|
|
22
|
+
scene.actors.push(ref);
|
|
23
|
+
else if (ref.state && !existing.state)
|
|
24
|
+
existing.state = ref.state;
|
|
25
|
+
};
|
|
26
|
+
for (const rec of records) {
|
|
27
|
+
switch (rec.kind) {
|
|
28
|
+
case "episode": {
|
|
29
|
+
epNo++;
|
|
30
|
+
curEpisode = { episode_id: `ep_${pad(epNo)}`, scenes: [] };
|
|
31
|
+
if (rec.title !== undefined)
|
|
32
|
+
curEpisode.title = rec.title;
|
|
33
|
+
episodes.push(curEpisode);
|
|
34
|
+
curScene = null;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case "scene": {
|
|
38
|
+
if (!curEpisode)
|
|
39
|
+
throw new AssembleError("scene before any episode");
|
|
40
|
+
scnNo++;
|
|
41
|
+
curScene = {
|
|
42
|
+
scene_id: `scn_${pad(scnNo)}`,
|
|
43
|
+
location: rec.location ? { ...rec.location } : null,
|
|
44
|
+
actors: (rec.actors ?? []).map((a) => ({ ...a })),
|
|
45
|
+
props: (rec.props ?? []).map((p) => ({ ...p })),
|
|
46
|
+
actions: [],
|
|
47
|
+
};
|
|
48
|
+
if (rec.environment)
|
|
49
|
+
curScene.environment = rec.environment;
|
|
50
|
+
curEpisode.scenes.push(curScene);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
case "note":
|
|
54
|
+
notes.push({ content: rec.content, ...(rec.category ? { category: rec.category } : {}), source: rec.source });
|
|
55
|
+
break;
|
|
56
|
+
case "action":
|
|
57
|
+
case "transition": {
|
|
58
|
+
if (!curScene)
|
|
59
|
+
throw new AssembleError(`${rec.kind} before any scene`);
|
|
60
|
+
curScene.actions.push({ type: rec.kind, content: rec.content });
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "dialogue":
|
|
64
|
+
case "inner_thought": {
|
|
65
|
+
if (!curScene)
|
|
66
|
+
throw new AssembleError(`${rec.kind} before any scene`);
|
|
67
|
+
const action = { type: rec.kind, content: rec.content, speaker: rec.speaker };
|
|
68
|
+
if (rec.emotion !== undefined)
|
|
69
|
+
action.emotion = rec.emotion;
|
|
70
|
+
curScene.actions.push(action);
|
|
71
|
+
// An actor speaker is present in the scene.
|
|
72
|
+
if ("name" in rec.speaker)
|
|
73
|
+
addActor(curScene, rec.speaker.state !== undefined ? { name: rec.speaker.name, state: rec.speaker.state } : { name: rec.speaker.name });
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { script: { title: opts.title ?? "", episodes }, notes };
|
|
79
|
+
}
|
|
80
|
+
class Registry {
|
|
81
|
+
prefix;
|
|
82
|
+
kind;
|
|
83
|
+
nextStateId;
|
|
84
|
+
byNorm = new Map();
|
|
85
|
+
order = [];
|
|
86
|
+
constructor(prefix, kind, nextStateId) {
|
|
87
|
+
this.prefix = prefix;
|
|
88
|
+
this.kind = kind;
|
|
89
|
+
this.nextStateId = nextStateId;
|
|
90
|
+
}
|
|
91
|
+
ensure(name, occ) {
|
|
92
|
+
const key = norm(name);
|
|
93
|
+
let a = this.byNorm.get(key);
|
|
94
|
+
if (!a) {
|
|
95
|
+
a = { provisional_id: `${this.prefix}_${pad(this.order.length + 1)}`, kind: this.kind, names: [], states: [], occurrences: [] };
|
|
96
|
+
this.byNorm.set(key, a);
|
|
97
|
+
this.order.push(a);
|
|
98
|
+
}
|
|
99
|
+
if (!a.names.includes(name))
|
|
100
|
+
a.names.push(name);
|
|
101
|
+
a.occurrences.push(occ);
|
|
102
|
+
return a;
|
|
103
|
+
}
|
|
104
|
+
stateId(a, state) {
|
|
105
|
+
const key = norm(state);
|
|
106
|
+
const existing = a.states.find((s) => norm(s.name) === key);
|
|
107
|
+
if (existing)
|
|
108
|
+
return existing.id;
|
|
109
|
+
const id = this.nextStateId();
|
|
110
|
+
a.states.push({ name: state, id });
|
|
111
|
+
return id;
|
|
112
|
+
}
|
|
113
|
+
list() { return this.order; }
|
|
114
|
+
}
|
|
115
|
+
function emitStates(a) {
|
|
116
|
+
const out = [{ state_id: "default", state_name: "default", description: "" }];
|
|
117
|
+
for (const s of a.states)
|
|
118
|
+
out.push({ state_id: s.id, state_name: s.name, description: "" });
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
// Deterministically assign provisional ids to a (possibly extract-augmented)
|
|
122
|
+
// name-based script; returns the provisional v3 doc + evidence roster.
|
|
123
|
+
export function assignProvisionalIds(name) {
|
|
124
|
+
let stateSeq = 0;
|
|
125
|
+
const nextStateId = () => `st_${pad(++stateSeq)}`; // globally unique across all assets
|
|
126
|
+
const actors = new Registry("act", "actor", nextStateId);
|
|
127
|
+
const locations = new Registry("loc", "location", nextStateId);
|
|
128
|
+
const props = new Registry("prp", "prop", nextStateId);
|
|
129
|
+
const idState = (reg, ref, occ, idKey) => {
|
|
130
|
+
const a = reg.ensure(ref.name, occ);
|
|
131
|
+
const out = { [idKey]: a.provisional_id };
|
|
132
|
+
if (ref.state !== undefined)
|
|
133
|
+
out.state_id = reg.stateId(a, ref.state);
|
|
134
|
+
return out;
|
|
135
|
+
};
|
|
136
|
+
const episodes = name.episodes.map((ep, ei) => ({
|
|
137
|
+
episode_id: ep.episode_id,
|
|
138
|
+
...(ep.title ? { title: ep.title } : {}),
|
|
139
|
+
scenes: ep.scenes.map((sc, si) => {
|
|
140
|
+
const occ = { episode: ei, scene: si };
|
|
141
|
+
const location = sc.location ? idState(locations, sc.location, occ, "location_id") : null;
|
|
142
|
+
const sceneActors = sc.actors.map((a) => idState(actors, a, occ, "actor_id"));
|
|
143
|
+
const sceneProps = sc.props.map((p) => idState(props, p, occ, "prop_id"));
|
|
144
|
+
const actions = sc.actions.map((ac) => {
|
|
145
|
+
const out = { type: ac.type, content: ac.content };
|
|
146
|
+
if (ac.speaker) {
|
|
147
|
+
if ("name" in ac.speaker) {
|
|
148
|
+
const a = actors.ensure(ac.speaker.name, occ);
|
|
149
|
+
const sp = { actor_id: a.provisional_id };
|
|
150
|
+
if (ac.speaker.state !== undefined)
|
|
151
|
+
sp.state_id = actors.stateId(a, ac.speaker.state);
|
|
152
|
+
out.speaker = sp;
|
|
153
|
+
}
|
|
154
|
+
else
|
|
155
|
+
out.speaker = ac.speaker.label !== undefined ? { kind: ac.speaker.kind, label: ac.speaker.label } : { kind: ac.speaker.kind };
|
|
156
|
+
}
|
|
157
|
+
if (ac.emotion !== undefined)
|
|
158
|
+
out.emotion = ac.emotion;
|
|
159
|
+
// Carry through free-form extend (e.g. video timestamps) so it survives
|
|
160
|
+
// into the final v3 product; text ingest never sets it.
|
|
161
|
+
if (ac.extend !== undefined)
|
|
162
|
+
out.extend = ac.extend;
|
|
163
|
+
return out;
|
|
164
|
+
});
|
|
165
|
+
return { scene_id: sc.scene_id, ...(sc.environment ? { environment: sc.environment } : {}), location, actors: sceneActors, props: sceneProps, actions };
|
|
166
|
+
}),
|
|
167
|
+
}));
|
|
168
|
+
const mkAssets = (reg, idKey, nameKey) => reg.list().map((a) => ({ [idKey]: a.provisional_id, [nameKey]: a.names[0] ?? a.provisional_id, aliases: a.names.slice(1), description: "", states: emitStates(a) }));
|
|
169
|
+
const script = {
|
|
170
|
+
version: 3,
|
|
171
|
+
title: name.title,
|
|
172
|
+
worldview: "",
|
|
173
|
+
style: "",
|
|
174
|
+
actors: mkAssets(actors, "actor_id", "actor_name"),
|
|
175
|
+
locations: mkAssets(locations, "location_id", "location_name"),
|
|
176
|
+
props: mkAssets(props, "prop_id", "prop_name"),
|
|
177
|
+
episodes,
|
|
178
|
+
};
|
|
179
|
+
return { script, assets: [...actors.list(), ...locations.list(), ...props.list()] };
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../../src/domain/ingest/assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Deterministic source chunker (§pass1-prepare). Splits normalized (LF) source
|
|
2
|
+
// text into contiguous, non-overlapping chunks at paragraph (blank-line)
|
|
3
|
+
// boundaries under a char budget. It does NOT interpret episode/scene structure
|
|
4
|
+
// — that is pass2-normalize's job. Lines carry stable 0-based indices; a chunk's
|
|
5
|
+
// core range is the half-open [core_line_start, core_line_end). Cuts fall only on
|
|
6
|
+
// line boundaries, so no Unicode code point is ever split.
|
|
7
|
+
const DEFAULT_MAX_CHARS = 500;
|
|
8
|
+
export function chunkSource(text, opts = {}) {
|
|
9
|
+
const maxChars = opts.maxChars ?? DEFAULT_MAX_CHARS;
|
|
10
|
+
const lines = text.split("\n");
|
|
11
|
+
const chunks = [];
|
|
12
|
+
let start = 0;
|
|
13
|
+
let acc = 0;
|
|
14
|
+
const push = (end) => {
|
|
15
|
+
chunks.push({
|
|
16
|
+
index: chunks.length,
|
|
17
|
+
core_line_start: start,
|
|
18
|
+
core_line_end: end,
|
|
19
|
+
text: lines.slice(start, end).join("\n"),
|
|
20
|
+
});
|
|
21
|
+
start = end;
|
|
22
|
+
acc = 0;
|
|
23
|
+
};
|
|
24
|
+
for (let i = 0; i < lines.length; i++) {
|
|
25
|
+
acc += lines[i].length + 1;
|
|
26
|
+
const next = lines[i + 1];
|
|
27
|
+
// Cut once over budget, but only at a paragraph boundary (blank next line or
|
|
28
|
+
// end of source) so a paragraph is never split across chunks.
|
|
29
|
+
if (acc >= maxChars && (next === undefined || next.trim() === ""))
|
|
30
|
+
push(i + 1);
|
|
31
|
+
}
|
|
32
|
+
if (start < lines.length)
|
|
33
|
+
push(lines.length);
|
|
34
|
+
return chunks;
|
|
35
|
+
}
|
|
36
|
+
// ponytail: no context-only windows yet — normalize sees whole chunk text.
|
|
37
|
+
// Add a prefix/suffix context band if cross-chunk pronoun resolution needs it.
|
|
38
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../../src/domain/ingest/chunker.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,2DAA2D;AAS3D,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAA8B,EAAE;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,eAAe,EAAE,KAAK;YACtB,aAAa,EAAE,GAAG;YAClB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACzC,CAAC,CAAC;QACH,KAAK,GAAG,GAAG,CAAC;QACZ,GAAG,GAAG,CAAC,CAAC;IACV,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,6EAA6E;QAC7E,8DAA8D;QAC9D,IAAI,GAAG,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,+EAA+E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Deterministic evidence extraction for Pass5 curate (§9). Builds a flat,
|
|
2
|
+
// document-ordered list of content lines (dialogue rendered "name:content" so a
|
|
3
|
+
// speaker's own lines are searchable), then for an asset gathers a few
|
|
4
|
+
// occurrences of its name as ±radius line windows. Pure string search — no model.
|
|
5
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
6
|
+
const isArr = (v) => Array.isArray(v);
|
|
7
|
+
const S = (v) => (typeof v === "string" ? v : "");
|
|
8
|
+
// Ordered content lines across the whole script. Dialogue/inner_thought lines
|
|
9
|
+
// are prefixed with the speaker name so an actor's own speech is greppable by
|
|
10
|
+
// name even when the line text doesn't repeat it.
|
|
11
|
+
export function buildFlatLines(doc, nameOf) {
|
|
12
|
+
const out = [];
|
|
13
|
+
if (!isObj(doc))
|
|
14
|
+
return out;
|
|
15
|
+
for (const ep of isArr(doc.episodes) ? doc.episodes : []) {
|
|
16
|
+
if (!isObj(ep) || !isArr(ep.scenes))
|
|
17
|
+
continue;
|
|
18
|
+
for (const sc of ep.scenes) {
|
|
19
|
+
if (!isObj(sc) || !isArr(sc.actions))
|
|
20
|
+
continue;
|
|
21
|
+
for (const ac of sc.actions) {
|
|
22
|
+
if (!isObj(ac))
|
|
23
|
+
continue;
|
|
24
|
+
const content = S(ac.content);
|
|
25
|
+
if (ac.type === "dialogue" || ac.type === "inner_thought") {
|
|
26
|
+
const sp = ac.speaker;
|
|
27
|
+
const who = isObj(sp)
|
|
28
|
+
? (typeof sp.actor_id === "string" ? nameOf(sp.actor_id) : `${S(sp.kind)}${sp.label ? `:${S(sp.label)}` : ""}`)
|
|
29
|
+
: "";
|
|
30
|
+
out.push(`${who}:${content}`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
out.push(content);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
// Up to `maxHits` occurrences of any of `names` in `lines`, each expanded to a
|
|
41
|
+
// ±radius window; overlapping windows are merged. Returns the joined excerpt.
|
|
42
|
+
export function evidenceFor(lines, names, opts = {}) {
|
|
43
|
+
const maxHits = opts.maxHits ?? 6;
|
|
44
|
+
const radius = opts.radius ?? 2;
|
|
45
|
+
const needles = names.filter((n) => n && n.length >= 1);
|
|
46
|
+
const hits = [];
|
|
47
|
+
for (let i = 0; i < lines.length && hits.length < maxHits; i++) {
|
|
48
|
+
if (needles.some((n) => lines[i].includes(n)))
|
|
49
|
+
hits.push(i);
|
|
50
|
+
}
|
|
51
|
+
if (hits.length === 0)
|
|
52
|
+
return "";
|
|
53
|
+
// Merge windows.
|
|
54
|
+
const ranges = [];
|
|
55
|
+
for (const h of hits) {
|
|
56
|
+
const lo = Math.max(0, h - radius);
|
|
57
|
+
const hi = Math.min(lines.length - 1, h + radius);
|
|
58
|
+
const last = ranges[ranges.length - 1];
|
|
59
|
+
if (last && lo <= last[1] + 1)
|
|
60
|
+
last[1] = Math.max(last[1], hi);
|
|
61
|
+
else
|
|
62
|
+
ranges.push([lo, hi]);
|
|
63
|
+
}
|
|
64
|
+
return ranges.map(([lo, hi]) => lines.slice(lo, hi + 1).join("\n")).join("\n…\n");
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../src/domain/ingest/evidence.ts"],"names":[],"mappings":"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"}
|