@lingjingai/scriptctl 0.63.13 → 0.63.15
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 +7 -1
- package/changes/0.63.14.md +7 -0
- package/changes/0.63.15.md +15 -0
- package/dist/bin.js +1 -20812
- package/dist/chunk-3LPIMYYI.js +823 -0
- package/dist/cli.d.ts +214 -5
- package/dist/cli.js +1 -187
- package/dist/review-agent.js +56 -3593
- package/package.json +12 -5
- package/dist/bin.d.ts +0 -2
- package/dist/bin.js.map +0 -7
- package/dist/cli/register-authoring.d.ts +0 -4
- package/dist/cli/register-authoring.js +0 -35
- package/dist/cli/register-authoring.js.map +0 -1
- package/dist/cli/register-review.d.ts +0 -3
- package/dist/cli/register-review.js +0 -20
- package/dist/cli/register-review.js.map +0 -1
- package/dist/cli/register-script.d.ts +0 -3
- package/dist/cli/register-script.js +0 -297
- package/dist/cli/register-script.js.map +0 -1
- package/dist/cli/register-tools.d.ts +0 -3
- package/dist/cli/register-tools.js +0 -23
- package/dist/cli/register-tools.js.map +0 -1
- package/dist/cli/register-workflows.d.ts +0 -4
- package/dist/cli/register-workflows.js +0 -108
- package/dist/cli/register-workflows.js.map +0 -1
- package/dist/cli/registry.d.ts +0 -14
- package/dist/cli/registry.js +0 -65
- package/dist/cli/registry.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/common.d.ts +0 -93
- package/dist/common.js +0 -240
- package/dist/common.js.map +0 -1
- package/dist/domain/authoring/apply.d.ts +0 -1
- package/dist/domain/authoring/apply.js +0 -2
- package/dist/domain/authoring/apply.js.map +0 -1
- package/dist/domain/authoring/export.d.ts +0 -1
- package/dist/domain/authoring/export.js +0 -2
- package/dist/domain/authoring/export.js.map +0 -1
- package/dist/domain/authoring/parser.d.ts +0 -2
- package/dist/domain/authoring/parser.js +0 -3
- package/dist/domain/authoring/parser.js.map +0 -1
- package/dist/domain/authoring/serializer.d.ts +0 -1
- package/dist/domain/authoring/serializer.js +0 -2
- package/dist/domain/authoring/serializer.js.map +0 -1
- package/dist/domain/authoring/shared/bracket.d.ts +0 -4
- package/dist/domain/authoring/shared/bracket.js +0 -95
- package/dist/domain/authoring/shared/bracket.js.map +0 -1
- package/dist/domain/authoring/shared/types.d.ts +0 -12
- package/dist/domain/authoring/shared/types.js +0 -2
- package/dist/domain/authoring/shared/types.js.map +0 -1
- package/dist/domain/authoring/types.d.ts +0 -2
- package/dist/domain/authoring/types.js +0 -3
- package/dist/domain/authoring/types.js.map +0 -1
- package/dist/domain/authoring/v3/apply.d.ts +0 -33
- package/dist/domain/authoring/v3/apply.js +0 -784
- package/dist/domain/authoring/v3/apply.js.map +0 -1
- package/dist/domain/authoring/v3/export.d.ts +0 -7
- package/dist/domain/authoring/v3/export.js +0 -85
- package/dist/domain/authoring/v3/export.js.map +0 -1
- package/dist/domain/authoring/v3/parser.d.ts +0 -3
- package/dist/domain/authoring/v3/parser.js +0 -823
- package/dist/domain/authoring/v3/parser.js.map +0 -1
- package/dist/domain/authoring/v3/serializer.d.ts +0 -2
- package/dist/domain/authoring/v3/serializer.js +0 -244
- package/dist/domain/authoring/v3/serializer.js.map +0 -1
- package/dist/domain/authoring/v3/types.d.ts +0 -76
- package/dist/domain/authoring/v3/types.js +0 -2
- package/dist/domain/authoring/v3/types.js.map +0 -1
- package/dist/domain/authoring/v4/apply.d.ts +0 -40
- package/dist/domain/authoring/v4/apply.js +0 -451
- package/dist/domain/authoring/v4/apply.js.map +0 -1
- package/dist/domain/authoring/v4/parser.d.ts +0 -2
- package/dist/domain/authoring/v4/parser.js +0 -729
- package/dist/domain/authoring/v4/parser.js.map +0 -1
- package/dist/domain/authoring/v4/serializer.d.ts +0 -6
- package/dist/domain/authoring/v4/serializer.js +0 -280
- package/dist/domain/authoring/v4/serializer.js.map +0 -1
- package/dist/domain/authoring/v4/types.d.ts +0 -50
- package/dist/domain/authoring/v4/types.js +0 -2
- package/dist/domain/authoring/v4/types.js.map +0 -1
- package/dist/domain/creative-draft/compose.d.ts +0 -18
- package/dist/domain/creative-draft/compose.js +0 -448
- package/dist/domain/creative-draft/compose.js.map +0 -1
- package/dist/domain/ingest/apply-plan.d.ts +0 -23
- package/dist/domain/ingest/apply-plan.js +0 -210
- package/dist/domain/ingest/apply-plan.js.map +0 -1
- package/dist/domain/ingest/assembler.d.ts +0 -65
- package/dist/domain/ingest/assembler.js +0 -263
- package/dist/domain/ingest/assembler.js.map +0 -1
- package/dist/domain/ingest/asset-audit.d.ts +0 -50
- package/dist/domain/ingest/asset-audit.js +0 -196
- package/dist/domain/ingest/asset-audit.js.map +0 -1
- package/dist/domain/ingest/chunker.d.ts +0 -9
- package/dist/domain/ingest/chunker.js +0 -49
- package/dist/domain/ingest/chunker.js.map +0 -1
- package/dist/domain/ingest/environment.d.ts +0 -3
- package/dist/domain/ingest/environment.js +0 -32
- package/dist/domain/ingest/environment.js.map +0 -1
- package/dist/domain/ingest/evidence.d.ts +0 -5
- package/dist/domain/ingest/evidence.js +0 -66
- package/dist/domain/ingest/evidence.js.map +0 -1
- package/dist/domain/ingest/govern.d.ts +0 -3
- package/dist/domain/ingest/govern.js +0 -157
- package/dist/domain/ingest/govern.js.map +0 -1
- package/dist/domain/ingest/jsonl-parser.d.ts +0 -6
- package/dist/domain/ingest/jsonl-parser.js +0 -204
- package/dist/domain/ingest/jsonl-parser.js.map +0 -1
- package/dist/domain/ingest/markdown-parser.d.ts +0 -6
- package/dist/domain/ingest/markdown-parser.js +0 -187
- package/dist/domain/ingest/markdown-parser.js.map +0 -1
- package/dist/domain/ingest/production-validation.d.ts +0 -8
- package/dist/domain/ingest/production-validation.js +0 -37
- package/dist/domain/ingest/production-validation.js.map +0 -1
- package/dist/domain/ingest/records.d.ts +0 -72
- package/dist/domain/ingest/records.js +0 -10
- package/dist/domain/ingest/records.js.map +0 -1
- package/dist/domain/ingest/renumber.d.ts +0 -14
- package/dist/domain/ingest/renumber.js +0 -130
- package/dist/domain/ingest/renumber.js.map +0 -1
- package/dist/domain/ingest/serial-context.d.ts +0 -93
- package/dist/domain/ingest/serial-context.js +0 -355
- package/dist/domain/ingest/serial-context.js.map +0 -1
- package/dist/domain/ingest/state-identity.d.ts +0 -2
- package/dist/domain/ingest/state-identity.js +0 -3
- package/dist/domain/ingest/state-identity.js.map +0 -1
- package/dist/domain/ingest/state-reconcile.d.ts +0 -12
- package/dist/domain/ingest/state-reconcile.js +0 -92
- package/dist/domain/ingest/state-reconcile.js.map +0 -1
- package/dist/domain/ingest/validation.d.ts +0 -1
- package/dist/domain/ingest/validation.js +0 -2
- package/dist/domain/ingest/validation.js.map +0 -1
- package/dist/domain/ingest/video-apply.d.ts +0 -4
- package/dist/domain/ingest/video-apply.js +0 -128
- package/dist/domain/ingest/video-apply.js.map +0 -1
- package/dist/domain/ingest/video-context.d.ts +0 -64
- package/dist/domain/ingest/video-context.js +0 -480
- package/dist/domain/ingest/video-context.js.map +0 -1
- package/dist/domain/ingest/video-records.d.ts +0 -57
- package/dist/domain/ingest/video-records.js +0 -9
- package/dist/domain/ingest/video-records.js.map +0 -1
- package/dist/domain/ingest/video-serial-md.d.ts +0 -81
- package/dist/domain/ingest/video-serial-md.js +0 -297
- package/dist/domain/ingest/video-serial-md.js.map +0 -1
- package/dist/domain/ingest/video-source-evolution.d.ts +0 -25
- package/dist/domain/ingest/video-source-evolution.js +0 -40
- package/dist/domain/ingest/video-source-evolution.js.map +0 -1
- package/dist/domain/ingest/video-state-evidence.d.ts +0 -66
- package/dist/domain/ingest/video-state-evidence.js +0 -385
- package/dist/domain/ingest/video-state-evidence.js.map +0 -1
- package/dist/domain/ingest/video-timestamp.d.ts +0 -8
- package/dist/domain/ingest/video-timestamp.js +0 -26
- package/dist/domain/ingest/video-timestamp.js.map +0 -1
- package/dist/domain/loom/checkpointer.d.ts +0 -3
- package/dist/domain/loom/checkpointer.js +0 -30
- package/dist/domain/loom/checkpointer.js.map +0 -1
- package/dist/domain/loom/index.d.ts +0 -45
- package/dist/domain/loom/index.js +0 -277
- package/dist/domain/loom/index.js.map +0 -1
- package/dist/domain/loom/types.d.ts +0 -101
- package/dist/domain/loom/types.js +0 -2
- package/dist/domain/loom/types.js.map +0 -1
- package/dist/domain/script/address.d.ts +0 -1
- package/dist/domain/script/address.js +0 -2
- package/dist/domain/script/address.js.map +0 -1
- package/dist/domain/script/dispatch.d.ts +0 -18
- package/dist/domain/script/dispatch.js +0 -55
- package/dist/domain/script/dispatch.js.map +0 -1
- package/dist/domain/script/lookups.d.ts +0 -1
- package/dist/domain/script/lookups.js +0 -2
- package/dist/domain/script/lookups.js.map +0 -1
- package/dist/domain/script/migrations/registry.d.ts +0 -4
- package/dist/domain/script/migrations/registry.js +0 -76
- package/dist/domain/script/migrations/registry.js.map +0 -1
- package/dist/domain/script/migrations/types.d.ts +0 -17
- package/dist/domain/script/migrations/types.js +0 -2
- package/dist/domain/script/migrations/types.js.map +0 -1
- package/dist/domain/script/migrations/v3-to-v4.d.ts +0 -3
- package/dist/domain/script/migrations/v3-to-v4.js +0 -57
- package/dist/domain/script/migrations/v3-to-v4.js.map +0 -1
- package/dist/domain/script/names.d.ts +0 -1
- package/dist/domain/script/names.js +0 -2
- package/dist/domain/script/names.js.map +0 -1
- package/dist/domain/script/parse.d.ts +0 -1
- package/dist/domain/script/parse.js +0 -2
- package/dist/domain/script/parse.js.map +0 -1
- package/dist/domain/script/patch/apply.d.ts +0 -1
- package/dist/domain/script/patch/apply.js +0 -2
- package/dist/domain/script/patch/apply.js.map +0 -1
- package/dist/domain/script/patch/helpers.d.ts +0 -1
- package/dist/domain/script/patch/helpers.js +0 -2
- package/dist/domain/script/patch/helpers.js.map +0 -1
- package/dist/domain/script/patch/inline-speaker.d.ts +0 -1
- package/dist/domain/script/patch/inline-speaker.js +0 -2
- package/dist/domain/script/patch/inline-speaker.js.map +0 -1
- package/dist/domain/script/patch/ops-action.d.ts +0 -1
- package/dist/domain/script/patch/ops-action.js +0 -2
- package/dist/domain/script/patch/ops-action.js.map +0 -1
- package/dist/domain/script/patch/ops-asset.d.ts +0 -1
- package/dist/domain/script/patch/ops-asset.js +0 -2
- package/dist/domain/script/patch/ops-asset.js.map +0 -1
- package/dist/domain/script/patch/ops-dialogue.d.ts +0 -1
- package/dist/domain/script/patch/ops-dialogue.js +0 -2
- package/dist/domain/script/patch/ops-dialogue.js.map +0 -1
- package/dist/domain/script/patch/ops-extend.d.ts +0 -1
- package/dist/domain/script/patch/ops-extend.js +0 -2
- package/dist/domain/script/patch/ops-extend.js.map +0 -1
- package/dist/domain/script/patch/ops-meta.d.ts +0 -1
- package/dist/domain/script/patch/ops-meta.js +0 -2
- package/dist/domain/script/patch/ops-meta.js.map +0 -1
- package/dist/domain/script/patch/ops-scene.d.ts +0 -1
- package/dist/domain/script/patch/ops-scene.js +0 -2
- package/dist/domain/script/patch/ops-scene.js.map +0 -1
- package/dist/domain/script/patch/ops-state.d.ts +0 -1
- package/dist/domain/script/patch/ops-state.js +0 -2
- package/dist/domain/script/patch/ops-state.js.map +0 -1
- package/dist/domain/script/patch/registry.d.ts +0 -1
- package/dist/domain/script/patch/registry.js +0 -2
- package/dist/domain/script/patch/registry.js.map +0 -1
- package/dist/domain/script/patch/types.d.ts +0 -1
- package/dist/domain/script/patch/types.js +0 -2
- package/dist/domain/script/patch/types.js.map +0 -1
- package/dist/domain/script/refs.d.ts +0 -1
- package/dist/domain/script/refs.js +0 -2
- package/dist/domain/script/refs.js.map +0 -1
- package/dist/domain/script/scene-refs.d.ts +0 -1
- package/dist/domain/script/scene-refs.js +0 -2
- package/dist/domain/script/scene-refs.js.map +0 -1
- package/dist/domain/script/schema.d.ts +0 -1
- package/dist/domain/script/schema.js +0 -2
- package/dist/domain/script/schema.js.map +0 -1
- package/dist/domain/script/selector.d.ts +0 -1
- package/dist/domain/script/selector.js +0 -2
- package/dist/domain/script/selector.js.map +0 -1
- package/dist/domain/script/shared/regex.d.ts +0 -2
- package/dist/domain/script/shared/regex.js +0 -7
- package/dist/domain/script/shared/regex.js.map +0 -1
- package/dist/domain/script/shared/types.d.ts +0 -1
- package/dist/domain/script/shared/types.js +0 -5
- package/dist/domain/script/shared/types.js.map +0 -1
- package/dist/domain/script/shared/validation.d.ts +0 -1
- package/dist/domain/script/shared/validation.js +0 -3
- package/dist/domain/script/shared/validation.js.map +0 -1
- package/dist/domain/script/shared.d.ts +0 -15
- package/dist/domain/script/shared.js +0 -35
- package/dist/domain/script/shared.js.map +0 -1
- package/dist/domain/script/text-util.d.ts +0 -7
- package/dist/domain/script/text-util.js +0 -95
- package/dist/domain/script/text-util.js.map +0 -1
- package/dist/domain/script/timestamp.d.ts +0 -1
- package/dist/domain/script/timestamp.js +0 -3
- package/dist/domain/script/timestamp.js.map +0 -1
- package/dist/domain/script/types.d.ts +0 -1
- package/dist/domain/script/types.js +0 -2
- package/dist/domain/script/types.js.map +0 -1
- package/dist/domain/script/v3/address.d.ts +0 -32
- package/dist/domain/script/v3/address.js +0 -136
- package/dist/domain/script/v3/address.js.map +0 -1
- package/dist/domain/script/v3/lookups.d.ts +0 -33
- package/dist/domain/script/v3/lookups.js +0 -316
- package/dist/domain/script/v3/lookups.js.map +0 -1
- package/dist/domain/script/v3/ordinal.d.ts +0 -8
- package/dist/domain/script/v3/ordinal.js +0 -91
- package/dist/domain/script/v3/ordinal.js.map +0 -1
- package/dist/domain/script/v3/parse.d.ts +0 -3
- package/dist/domain/script/v3/parse.js +0 -164
- package/dist/domain/script/v3/parse.js.map +0 -1
- package/dist/domain/script/v3/patch/apply.d.ts +0 -2
- package/dist/domain/script/v3/patch/apply.js +0 -31
- package/dist/domain/script/v3/patch/apply.js.map +0 -1
- package/dist/domain/script/v3/patch/helpers.d.ts +0 -15
- package/dist/domain/script/v3/patch/helpers.js +0 -155
- package/dist/domain/script/v3/patch/helpers.js.map +0 -1
- package/dist/domain/script/v3/patch/inline-speaker.d.ts +0 -2
- package/dist/domain/script/v3/patch/inline-speaker.js +0 -50
- package/dist/domain/script/v3/patch/inline-speaker.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-action.d.ts +0 -12
- package/dist/domain/script/v3/patch/ops-action.js +0 -355
- package/dist/domain/script/v3/patch/ops-action.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-asset.d.ts +0 -14
- package/dist/domain/script/v3/patch/ops-asset.js +0 -347
- package/dist/domain/script/v3/patch/ops-asset.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-dialogue.d.ts +0 -2
- package/dist/domain/script/v3/patch/ops-dialogue.js +0 -21
- package/dist/domain/script/v3/patch/ops-dialogue.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-extend.d.ts +0 -8
- package/dist/domain/script/v3/patch/ops-extend.js +0 -122
- package/dist/domain/script/v3/patch/ops-extend.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-meta.d.ts +0 -5
- package/dist/domain/script/v3/patch/ops-meta.js +0 -82
- package/dist/domain/script/v3/patch/ops-meta.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-scene.d.ts +0 -6
- package/dist/domain/script/v3/patch/ops-scene.js +0 -351
- package/dist/domain/script/v3/patch/ops-scene.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-state.d.ts +0 -8
- package/dist/domain/script/v3/patch/ops-state.js +0 -155
- package/dist/domain/script/v3/patch/ops-state.js.map +0 -1
- package/dist/domain/script/v3/patch/ops-timestamp.d.ts +0 -6
- package/dist/domain/script/v3/patch/ops-timestamp.js +0 -47
- package/dist/domain/script/v3/patch/ops-timestamp.js.map +0 -1
- package/dist/domain/script/v3/patch/registry.d.ts +0 -2
- package/dist/domain/script/v3/patch/registry.js +0 -56
- package/dist/domain/script/v3/patch/registry.js.map +0 -1
- package/dist/domain/script/v3/patch/types.d.ts +0 -10
- package/dist/domain/script/v3/patch/types.js +0 -2
- package/dist/domain/script/v3/patch/types.js.map +0 -1
- package/dist/domain/script/v3/refs.d.ts +0 -4
- package/dist/domain/script/v3/refs.js +0 -64
- package/dist/domain/script/v3/refs.js.map +0 -1
- package/dist/domain/script/v3/scene-refs.d.ts +0 -3
- package/dist/domain/script/v3/scene-refs.js +0 -35
- package/dist/domain/script/v3/scene-refs.js.map +0 -1
- package/dist/domain/script/v3/schema.d.ts +0 -6
- package/dist/domain/script/v3/schema.js +0 -58
- package/dist/domain/script/v3/schema.js.map +0 -1
- package/dist/domain/script/v3/selector.d.ts +0 -44
- package/dist/domain/script/v3/selector.js +0 -178
- package/dist/domain/script/v3/selector.js.map +0 -1
- package/dist/domain/script/v3/types.d.ts +0 -106
- package/dist/domain/script/v3/types.js +0 -2
- package/dist/domain/script/v3/types.js.map +0 -1
- package/dist/domain/script/v3/validation.d.ts +0 -2
- package/dist/domain/script/v3/validation.js +0 -2
- package/dist/domain/script/v3/validation.js.map +0 -1
- package/dist/domain/script/v4/address.d.ts +0 -61
- package/dist/domain/script/v4/address.js +0 -99
- package/dist/domain/script/v4/address.js.map +0 -1
- package/dist/domain/script/v4/factory.d.ts +0 -2
- package/dist/domain/script/v4/factory.js +0 -13
- package/dist/domain/script/v4/factory.js.map +0 -1
- package/dist/domain/script/v4/from-v3.d.ts +0 -29
- package/dist/domain/script/v4/from-v3.js +0 -307
- package/dist/domain/script/v4/from-v3.js.map +0 -1
- package/dist/domain/script/v4/ids.d.ts +0 -5
- package/dist/domain/script/v4/ids.js +0 -41
- package/dist/domain/script/v4/ids.js.map +0 -1
- package/dist/domain/script/v4/ordinal.d.ts +0 -3
- package/dist/domain/script/v4/ordinal.js +0 -66
- package/dist/domain/script/v4/ordinal.js.map +0 -1
- package/dist/domain/script/v4/parse.d.ts +0 -5
- package/dist/domain/script/v4/parse.js +0 -196
- package/dist/domain/script/v4/parse.js.map +0 -1
- package/dist/domain/script/v4/patch/apply.d.ts +0 -3
- package/dist/domain/script/v4/patch/apply.js +0 -24
- package/dist/domain/script/v4/patch/apply.js.map +0 -1
- package/dist/domain/script/v4/patch/helpers.d.ts +0 -32
- package/dist/domain/script/v4/patch/helpers.js +0 -138
- package/dist/domain/script/v4/patch/helpers.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-action.d.ts +0 -13
- package/dist/domain/script/v4/patch/ops-action.js +0 -351
- package/dist/domain/script/v4/patch/ops-action.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-asset.d.ts +0 -17
- package/dist/domain/script/v4/patch/ops-asset.js +0 -556
- package/dist/domain/script/v4/patch/ops-asset.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-extend.d.ts +0 -11
- package/dist/domain/script/v4/patch/ops-extend.js +0 -103
- package/dist/domain/script/v4/patch/ops-extend.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-meta.d.ts +0 -5
- package/dist/domain/script/v4/patch/ops-meta.js +0 -49
- package/dist/domain/script/v4/patch/ops-meta.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-scene-ref.d.ts +0 -3
- package/dist/domain/script/v4/patch/ops-scene-ref.js +0 -74
- package/dist/domain/script/v4/patch/ops-scene-ref.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-structure.d.ts +0 -6
- package/dist/domain/script/v4/patch/ops-structure.js +0 -236
- package/dist/domain/script/v4/patch/ops-structure.js.map +0 -1
- package/dist/domain/script/v4/patch/ops-timestamp.d.ts +0 -6
- package/dist/domain/script/v4/patch/ops-timestamp.js +0 -40
- package/dist/domain/script/v4/patch/ops-timestamp.js.map +0 -1
- package/dist/domain/script/v4/patch/registry.d.ts +0 -2
- package/dist/domain/script/v4/patch/registry.js +0 -53
- package/dist/domain/script/v4/patch/registry.js.map +0 -1
- package/dist/domain/script/v4/patch/schema.d.ts +0 -7
- package/dist/domain/script/v4/patch/schema.js +0 -77
- package/dist/domain/script/v4/patch/schema.js.map +0 -1
- package/dist/domain/script/v4/patch/types.d.ts +0 -10
- package/dist/domain/script/v4/patch/types.js +0 -2
- package/dist/domain/script/v4/patch/types.js.map +0 -1
- package/dist/domain/script/v4/selector.d.ts +0 -11
- package/dist/domain/script/v4/selector.js +0 -124
- package/dist/domain/script/v4/selector.js.map +0 -1
- package/dist/domain/script/v4/types.d.ts +0 -120
- package/dist/domain/script/v4/types.js +0 -2
- package/dist/domain/script/v4/types.js.map +0 -1
- package/dist/domain/script/v4/validation.d.ts +0 -2
- package/dist/domain/script/v4/validation.js +0 -2
- package/dist/domain/script/v4/validation.js.map +0 -1
- package/dist/failures.d.ts +0 -58
- package/dist/failures.js +0 -96
- package/dist/failures.js.map +0 -1
- package/dist/infra/converters.d.ts +0 -9
- package/dist/infra/converters.js +0 -689
- package/dist/infra/converters.js.map +0 -1
- package/dist/infra/env.d.ts +0 -2
- package/dist/infra/env.js +0 -81
- package/dist/infra/env.js.map +0 -1
- package/dist/infra/episode-title.d.ts +0 -4
- package/dist/infra/episode-title.js +0 -129
- package/dist/infra/episode-title.js.map +0 -1
- package/dist/infra/ingest/review-renderer.d.ts +0 -1
- package/dist/infra/ingest/review-renderer.js +0 -440
- package/dist/infra/ingest/review-renderer.js.map +0 -1
- package/dist/infra/ingest/source-resolver.d.ts +0 -21
- package/dist/infra/ingest/source-resolver.js +0 -51
- package/dist/infra/ingest/source-resolver.js.map +0 -1
- package/dist/infra/ingest/text-reader.d.ts +0 -3
- package/dist/infra/ingest/text-reader.js +0 -27
- package/dist/infra/ingest/text-reader.js.map +0 -1
- package/dist/infra/ingest/video-discovery.d.ts +0 -8
- package/dist/infra/ingest/video-discovery.js +0 -69
- package/dist/infra/ingest/video-discovery.js.map +0 -1
- package/dist/infra/ingest/video-source-snapshot.d.ts +0 -4
- package/dist/infra/ingest/video-source-snapshot.js +0 -47
- package/dist/infra/ingest/video-source-snapshot.js.map +0 -1
- package/dist/infra/ingest/video-state-evidence.d.ts +0 -14
- package/dist/infra/ingest/video-state-evidence.js +0 -140
- package/dist/infra/ingest/video-state-evidence.js.map +0 -1
- package/dist/infra/ingest/video-transcode.d.ts +0 -7
- package/dist/infra/ingest/video-transcode.js +0 -98
- package/dist/infra/ingest/video-transcode.js.map +0 -1
- package/dist/infra/ingest/workspace-lock.d.ts +0 -1
- package/dist/infra/ingest/workspace-lock.js +0 -32
- package/dist/infra/ingest/workspace-lock.js.map +0 -1
- package/dist/infra/ingest/workspace-store.d.ts +0 -18
- package/dist/infra/ingest/workspace-store.js +0 -70
- package/dist/infra/ingest/workspace-store.js.map +0 -1
- package/dist/infra/llm/anthropic-model.d.ts +0 -11
- package/dist/infra/llm/anthropic-model.js +0 -130
- package/dist/infra/llm/anthropic-model.js.map +0 -1
- package/dist/infra/llm/doubao-model.d.ts +0 -60
- package/dist/infra/llm/doubao-model.js +0 -249
- package/dist/infra/llm/doubao-model.js.map +0 -1
- package/dist/infra/llm/failure-mapping.d.ts +0 -6
- package/dist/infra/llm/failure-mapping.js +0 -146
- package/dist/infra/llm/failure-mapping.js.map +0 -1
- package/dist/infra/llm/gemini-upload.d.ts +0 -13
- package/dist/infra/llm/gemini-upload.js +0 -138
- package/dist/infra/llm/gemini-upload.js.map +0 -1
- package/dist/infra/llm/gemini-video-model.d.ts +0 -50
- package/dist/infra/llm/gemini-video-model.js +0 -371
- package/dist/infra/llm/gemini-video-model.js.map +0 -1
- package/dist/infra/llm/openai-compatible-model.d.ts +0 -14
- package/dist/infra/llm/openai-compatible-model.js +0 -207
- package/dist/infra/llm/openai-compatible-model.js.map +0 -1
- package/dist/infra/llm/retry.d.ts +0 -8
- package/dist/infra/llm/retry.js +0 -41
- package/dist/infra/llm/retry.js.map +0 -1
- package/dist/infra/local-script-output-store.d.ts +0 -43
- package/dist/infra/local-script-output-store.js +0 -168
- package/dist/infra/local-script-output-store.js.map +0 -1
- package/dist/infra/script-output-api.d.ts +0 -50
- package/dist/infra/script-output-api.js +0 -251
- package/dist/infra/script-output-api.js.map +0 -1
- package/dist/infra/script-output-store.d.ts +0 -152
- package/dist/infra/script-output-store.js +0 -114
- package/dist/infra/script-output-store.js.map +0 -1
- package/dist/infra/script-working-copy.d.ts +0 -23
- package/dist/infra/script-working-copy.js +0 -157
- package/dist/infra/script-working-copy.js.map +0 -1
- package/dist/infra/storage.d.ts +0 -35
- package/dist/infra/storage.js +0 -91
- package/dist/infra/storage.js.map +0 -1
- package/dist/llm/composition.d.ts +0 -5
- package/dist/llm/composition.js +0 -5
- package/dist/llm/composition.js.map +0 -1
- package/dist/llm/config.d.ts +0 -28
- package/dist/llm/config.js +0 -231
- package/dist/llm/config.js.map +0 -1
- package/dist/llm/registry.d.ts +0 -43
- package/dist/llm/registry.js +0 -69
- package/dist/llm/registry.js.map +0 -1
- package/dist/llm/router.d.ts +0 -46
- package/dist/llm/router.js +0 -512
- package/dist/llm/router.js.map +0 -1
- package/dist/llm/tasks/ingest/arc-summary.d.ts +0 -8
- package/dist/llm/tasks/ingest/arc-summary.js +0 -26
- package/dist/llm/tasks/ingest/arc-summary.js.map +0 -1
- package/dist/llm/tasks/ingest/asset-audit.d.ts +0 -6
- package/dist/llm/tasks/ingest/asset-audit.js +0 -158
- package/dist/llm/tasks/ingest/asset-audit.js.map +0 -1
- package/dist/llm/tasks/ingest/asset-curate.d.ts +0 -13
- package/dist/llm/tasks/ingest/asset-curate.js +0 -45
- package/dist/llm/tasks/ingest/asset-curate.js.map +0 -1
- package/dist/llm/tasks/ingest/asset-extract.d.ts +0 -12
- package/dist/llm/tasks/ingest/asset-extract.js +0 -51
- package/dist/llm/tasks/ingest/asset-extract.js.map +0 -1
- package/dist/llm/tasks/ingest/asset-govern.d.ts +0 -22
- package/dist/llm/tasks/ingest/asset-govern.js +0 -143
- package/dist/llm/tasks/ingest/asset-govern.js.map +0 -1
- package/dist/llm/tasks/ingest/body-start.d.ts +0 -10
- package/dist/llm/tasks/ingest/body-start.js +0 -41
- package/dist/llm/tasks/ingest/body-start.js.map +0 -1
- package/dist/llm/tasks/ingest/episode-assets.d.ts +0 -29
- package/dist/llm/tasks/ingest/episode-assets.js +0 -282
- package/dist/llm/tasks/ingest/episode-assets.js.map +0 -1
- package/dist/llm/tasks/ingest/mention-resolve.d.ts +0 -9
- package/dist/llm/tasks/ingest/mention-resolve.js +0 -39
- package/dist/llm/tasks/ingest/mention-resolve.js.map +0 -1
- package/dist/llm/tasks/ingest/name-fix.d.ts +0 -9
- package/dist/llm/tasks/ingest/name-fix.js +0 -56
- package/dist/llm/tasks/ingest/name-fix.js.map +0 -1
- package/dist/llm/tasks/ingest/state-reconcile.d.ts +0 -8
- package/dist/llm/tasks/ingest/state-reconcile.js +0 -44
- package/dist/llm/tasks/ingest/state-reconcile.js.map +0 -1
- package/dist/llm/tasks/ingest/text-normalize.d.ts +0 -10
- package/dist/llm/tasks/ingest/text-normalize.js +0 -122
- package/dist/llm/tasks/ingest/text-normalize.js.map +0 -1
- package/dist/llm/tasks/ingest/video-serial.d.ts +0 -14
- package/dist/llm/tasks/ingest/video-serial.js +0 -391
- package/dist/llm/tasks/ingest/video-serial.js.map +0 -1
- package/dist/llm/tasks/schemas.d.ts +0 -9
- package/dist/llm/tasks/schemas.js +0 -466
- package/dist/llm/tasks/schemas.js.map +0 -1
- package/dist/llm/types.d.ts +0 -178
- package/dist/llm/types.js +0 -44
- package/dist/llm/types.js.map +0 -1
- package/dist/output.d.ts +0 -3
- package/dist/output.js +0 -94
- package/dist/output.js.map +0 -1
- package/dist/package-root.d.ts +0 -2
- package/dist/package-root.js +0 -38
- package/dist/package-root.js.map +0 -1
- package/dist/review-agent.js.map +0 -7
- package/dist/usecases/changelog.d.ts +0 -9
- package/dist/usecases/changelog.js +0 -134
- package/dist/usecases/changelog.js.map +0 -1
- package/dist/usecases/doctor.d.ts +0 -2
- package/dist/usecases/doctor.js +0 -231
- package/dist/usecases/doctor.js.map +0 -1
- package/dist/usecases/ingest/body-start.d.ts +0 -8
- package/dist/usecases/ingest/body-start.js +0 -36
- package/dist/usecases/ingest/body-start.js.map +0 -1
- package/dist/usecases/ingest/command.d.ts +0 -5
- package/dist/usecases/ingest/command.js +0 -183
- package/dist/usecases/ingest/command.js.map +0 -1
- package/dist/usecases/ingest/failure.d.ts +0 -26
- package/dist/usecases/ingest/failure.js +0 -151
- package/dist/usecases/ingest/failure.js.map +0 -1
- package/dist/usecases/ingest/fanout.d.ts +0 -10
- package/dist/usecases/ingest/fanout.js +0 -23
- package/dist/usecases/ingest/fanout.js.map +0 -1
- package/dist/usecases/ingest/final-asset-audit.d.ts +0 -39
- package/dist/usecases/ingest/final-asset-audit.js +0 -88
- package/dist/usecases/ingest/final-asset-audit.js.map +0 -1
- package/dist/usecases/ingest/generate-video-state-evidence.d.ts +0 -23
- package/dist/usecases/ingest/generate-video-state-evidence.js +0 -124
- package/dist/usecases/ingest/generate-video-state-evidence.js.map +0 -1
- package/dist/usecases/ingest/pass4-mention-resolve.d.ts +0 -11
- package/dist/usecases/ingest/pass4-mention-resolve.js +0 -52
- package/dist/usecases/ingest/pass4-mention-resolve.js.map +0 -1
- package/dist/usecases/ingest/pass5-extract.d.ts +0 -7
- package/dist/usecases/ingest/pass5-extract.js +0 -51
- package/dist/usecases/ingest/pass5-extract.js.map +0 -1
- package/dist/usecases/ingest/pass5-govern.d.ts +0 -13
- package/dist/usecases/ingest/pass5-govern.js +0 -157
- package/dist/usecases/ingest/pass5-govern.js.map +0 -1
- package/dist/usecases/ingest/pipeline.d.ts +0 -28
- package/dist/usecases/ingest/pipeline.js +0 -335
- package/dist/usecases/ingest/pipeline.js.map +0 -1
- package/dist/usecases/ingest/publish-command.d.ts +0 -1
- package/dist/usecases/ingest/publish-command.js +0 -4
- package/dist/usecases/ingest/publish-command.js.map +0 -1
- package/dist/usecases/ingest/serial-govern.d.ts +0 -40
- package/dist/usecases/ingest/serial-govern.js +0 -488
- package/dist/usecases/ingest/serial-govern.js.map +0 -1
- package/dist/usecases/ingest/skip-video-episode.d.ts +0 -4
- package/dist/usecases/ingest/skip-video-episode.js +0 -120
- package/dist/usecases/ingest/skip-video-episode.js.map +0 -1
- package/dist/usecases/ingest/status.d.ts +0 -61
- package/dist/usecases/ingest/status.js +0 -347
- package/dist/usecases/ingest/status.js.map +0 -1
- package/dist/usecases/ingest/timings.d.ts +0 -51
- package/dist/usecases/ingest/timings.js +0 -68
- package/dist/usecases/ingest/timings.js.map +0 -1
- package/dist/usecases/ingest/usage-report.d.ts +0 -125
- package/dist/usecases/ingest/usage-report.js +0 -248
- package/dist/usecases/ingest/usage-report.js.map +0 -1
- package/dist/usecases/ingest/video-pipeline.d.ts +0 -81
- package/dist/usecases/ingest/video-pipeline.js +0 -547
- package/dist/usecases/ingest/video-pipeline.js.map +0 -1
- package/dist/usecases/ingest/video-skip-state.d.ts +0 -29
- package/dist/usecases/ingest/video-skip-state.js +0 -148
- package/dist/usecases/ingest/video-skip-state.js.map +0 -1
- package/dist/usecases/ingest/view-command.d.ts +0 -4
- package/dist/usecases/ingest/view-command.js +0 -67
- package/dist/usecases/ingest/view-command.js.map +0 -1
- package/dist/usecases/ingest/view-server.d.ts +0 -29
- package/dist/usecases/ingest/view-server.js +0 -364
- package/dist/usecases/ingest/view-server.js.map +0 -1
- package/dist/usecases/script/action-span.d.ts +0 -10
- package/dist/usecases/script/action-span.js +0 -42
- package/dist/usecases/script/action-span.js.map +0 -1
- package/dist/usecases/script/actions.d.ts +0 -3
- package/dist/usecases/script/actions.js +0 -184
- package/dist/usecases/script/actions.js.map +0 -1
- package/dist/usecases/script/actor.d.ts +0 -3
- package/dist/usecases/script/actor.js +0 -26
- package/dist/usecases/script/actor.js.map +0 -1
- package/dist/usecases/script/actors.d.ts +0 -3
- package/dist/usecases/script/actors.js +0 -25
- package/dist/usecases/script/actors.js.map +0 -1
- package/dist/usecases/script/add-actor.d.ts +0 -3
- package/dist/usecases/script/add-actor.js +0 -13
- package/dist/usecases/script/add-actor.js.map +0 -1
- package/dist/usecases/script/add-episode.d.ts +0 -3
- package/dist/usecases/script/add-episode.js +0 -9
- package/dist/usecases/script/add-episode.js.map +0 -1
- package/dist/usecases/script/add-location.d.ts +0 -3
- package/dist/usecases/script/add-location.js +0 -11
- package/dist/usecases/script/add-location.js.map +0 -1
- package/dist/usecases/script/add-prop.d.ts +0 -3
- package/dist/usecases/script/add-prop.js +0 -11
- package/dist/usecases/script/add-prop.js.map +0 -1
- package/dist/usecases/script/alias.d.ts +0 -3
- package/dist/usecases/script/alias.js +0 -39
- package/dist/usecases/script/alias.js.map +0 -1
- package/dist/usecases/script/assets.d.ts +0 -3
- package/dist/usecases/script/assets.js +0 -46
- package/dist/usecases/script/assets.js.map +0 -1
- package/dist/usecases/script/audit-assets.d.ts +0 -4
- package/dist/usecases/script/audit-assets.js +0 -37
- package/dist/usecases/script/audit-assets.js.map +0 -1
- package/dist/usecases/script/command-constraints.d.ts +0 -38
- package/dist/usecases/script/command-constraints.js +0 -143
- package/dist/usecases/script/command-constraints.js.map +0 -1
- package/dist/usecases/script/compose-creative-draft.d.ts +0 -3
- package/dist/usecases/script/compose-creative-draft.js +0 -106
- package/dist/usecases/script/compose-creative-draft.js.map +0 -1
- package/dist/usecases/script/context.d.ts +0 -3
- package/dist/usecases/script/context.js +0 -52
- package/dist/usecases/script/context.js.map +0 -1
- package/dist/usecases/script/create.d.ts +0 -3
- package/dist/usecases/script/create.js +0 -27
- package/dist/usecases/script/create.js.map +0 -1
- package/dist/usecases/script/delete.d.ts +0 -3
- package/dist/usecases/script/delete.js +0 -88
- package/dist/usecases/script/delete.js.map +0 -1
- package/dist/usecases/script/describe.d.ts +0 -3
- package/dist/usecases/script/describe.js +0 -32
- package/dist/usecases/script/describe.js.map +0 -1
- package/dist/usecases/script/dialogue.d.ts +0 -3
- package/dist/usecases/script/dialogue.js +0 -30
- package/dist/usecases/script/dialogue.js.map +0 -1
- package/dist/usecases/script/dispatch.d.ts +0 -3
- package/dist/usecases/script/dispatch.js +0 -10
- package/dist/usecases/script/dispatch.js.map +0 -1
- package/dist/usecases/script/do.d.ts +0 -3
- package/dist/usecases/script/do.js +0 -186
- package/dist/usecases/script/do.js.map +0 -1
- package/dist/usecases/script/emotion.d.ts +0 -3
- package/dist/usecases/script/emotion.js +0 -24
- package/dist/usecases/script/emotion.js.map +0 -1
- package/dist/usecases/script/episodes.d.ts +0 -3
- package/dist/usecases/script/episodes.js +0 -62
- package/dist/usecases/script/episodes.js.map +0 -1
- package/dist/usecases/script/export-authoring.d.ts +0 -4
- package/dist/usecases/script/export-authoring.js +0 -326
- package/dist/usecases/script/export-authoring.js.map +0 -1
- package/dist/usecases/script/extend.d.ts +0 -3
- package/dist/usecases/script/extend.js +0 -94
- package/dist/usecases/script/extend.js.map +0 -1
- package/dist/usecases/script/ids.d.ts +0 -3
- package/dist/usecases/script/ids.js +0 -148
- package/dist/usecases/script/ids.js.map +0 -1
- package/dist/usecases/script/importance.d.ts +0 -3
- package/dist/usecases/script/importance.js +0 -16
- package/dist/usecases/script/importance.js.map +0 -1
- package/dist/usecases/script/insert.d.ts +0 -3
- package/dist/usecases/script/insert.js +0 -127
- package/dist/usecases/script/insert.js.map +0 -1
- package/dist/usecases/script/issues.d.ts +0 -3
- package/dist/usecases/script/issues.js +0 -35
- package/dist/usecases/script/issues.js.map +0 -1
- package/dist/usecases/script/lib.d.ts +0 -152
- package/dist/usecases/script/lib.js +0 -1654
- package/dist/usecases/script/lib.js.map +0 -1
- package/dist/usecases/script/locations.d.ts +0 -3
- package/dist/usecases/script/locations.js +0 -25
- package/dist/usecases/script/locations.js.map +0 -1
- package/dist/usecases/script/merge.d.ts +0 -3
- package/dist/usecases/script/merge.js +0 -43
- package/dist/usecases/script/merge.js.map +0 -1
- package/dist/usecases/script/migrate.d.ts +0 -3
- package/dist/usecases/script/migrate.js +0 -210
- package/dist/usecases/script/migrate.js.map +0 -1
- package/dist/usecases/script/move.d.ts +0 -3
- package/dist/usecases/script/move.js +0 -50
- package/dist/usecases/script/move.js.map +0 -1
- package/dist/usecases/script/parenthetical.d.ts +0 -3
- package/dist/usecases/script/parenthetical.js +0 -52
- package/dist/usecases/script/parenthetical.js.map +0 -1
- package/dist/usecases/script/props.d.ts +0 -3
- package/dist/usecases/script/props.js +0 -25
- package/dist/usecases/script/props.js.map +0 -1
- package/dist/usecases/script/refs.d.ts +0 -3
- package/dist/usecases/script/refs.js +0 -111
- package/dist/usecases/script/refs.js.map +0 -1
- package/dist/usecases/script/rename.d.ts +0 -3
- package/dist/usecases/script/rename.js +0 -35
- package/dist/usecases/script/rename.js.map +0 -1
- package/dist/usecases/script/replace.d.ts +0 -3
- package/dist/usecases/script/replace.js +0 -33
- package/dist/usecases/script/replace.js.map +0 -1
- package/dist/usecases/script/review.d.ts +0 -3
- package/dist/usecases/script/review.js +0 -187
- package/dist/usecases/script/review.js.map +0 -1
- package/dist/usecases/script/role.d.ts +0 -3
- package/dist/usecases/script/role.js +0 -16
- package/dist/usecases/script/role.js.map +0 -1
- package/dist/usecases/script/scenes.d.ts +0 -3
- package/dist/usecases/script/scenes.js +0 -66
- package/dist/usecases/script/scenes.js.map +0 -1
- package/dist/usecases/script/script-patch.d.ts +0 -3
- package/dist/usecases/script/script-patch.js +0 -321
- package/dist/usecases/script/script-patch.js.map +0 -1
- package/dist/usecases/script/script-validate.d.ts +0 -3
- package/dist/usecases/script/script-validate.js +0 -27
- package/dist/usecases/script/script-validate.js.map +0 -1
- package/dist/usecases/script/session.d.ts +0 -62
- package/dist/usecases/script/session.js +0 -567
- package/dist/usecases/script/session.js.map +0 -1
- package/dist/usecases/script/split.d.ts +0 -3
- package/dist/usecases/script/split.js +0 -41
- package/dist/usecases/script/split.js.map +0 -1
- package/dist/usecases/script/state-add.d.ts +0 -3
- package/dist/usecases/script/state-add.js +0 -22
- package/dist/usecases/script/state-add.js.map +0 -1
- package/dist/usecases/script/state-delete.d.ts +0 -3
- package/dist/usecases/script/state-delete.js +0 -22
- package/dist/usecases/script/state-delete.js.map +0 -1
- package/dist/usecases/script/state-rename.d.ts +0 -3
- package/dist/usecases/script/state-rename.js +0 -16
- package/dist/usecases/script/state-rename.js.map +0 -1
- package/dist/usecases/script/states.d.ts +0 -3
- package/dist/usecases/script/states.js +0 -197
- package/dist/usecases/script/states.js.map +0 -1
- package/dist/usecases/script/summary.d.ts +0 -3
- package/dist/usecases/script/summary.js +0 -72
- package/dist/usecases/script/summary.js.map +0 -1
- package/dist/usecases/script/synopsis-generate.d.ts +0 -115
- package/dist/usecases/script/synopsis-generate.js +0 -776
- package/dist/usecases/script/synopsis-generate.js.map +0 -1
- package/dist/usecases/script/synopsis.d.ts +0 -3
- package/dist/usecases/script/synopsis.js +0 -45
- package/dist/usecases/script/synopsis.js.map +0 -1
- package/dist/usecases/script/timestamp-filter.d.ts +0 -4
- package/dist/usecases/script/timestamp-filter.js +0 -55
- package/dist/usecases/script/timestamp-filter.js.map +0 -1
- package/dist/usecases/script/timestamp.d.ts +0 -3
- package/dist/usecases/script/timestamp.js +0 -11
- package/dist/usecases/script/timestamp.js.map +0 -1
- package/dist/usecases/script/transition.d.ts +0 -3
- package/dist/usecases/script/transition.js +0 -23
- package/dist/usecases/script/transition.js.map +0 -1
- package/dist/usecases/script/type.d.ts +0 -3
- package/dist/usecases/script/type.js +0 -23
- package/dist/usecases/script/type.js.map +0 -1
- package/dist/usecases/script/v3/mutations.d.ts +0 -2
- package/dist/usecases/script/v3/mutations.js +0 -5
- package/dist/usecases/script/v3/mutations.js.map +0 -1
- package/dist/usecases/script/v4/mutations.d.ts +0 -2
- package/dist/usecases/script/v4/mutations.js +0 -6
- package/dist/usecases/script/v4/mutations.js.map +0 -1
- package/dist/usecases/script/v4/queries.d.ts +0 -15
- package/dist/usecases/script/v4/queries.js +0 -196
- package/dist/usecases/script/v4/queries.js.map +0 -1
- package/dist/usecases/script/working-copy.d.ts +0 -5
- package/dist/usecases/script/working-copy.js +0 -399
- package/dist/usecases/script/working-copy.js.map +0 -1
- package/dist/usecases/script/worldview.d.ts +0 -3
- package/dist/usecases/script/worldview.js +0 -17
- package/dist/usecases/script/worldview.js.map +0 -1
- package/dist/usecases/script/write-authoring.d.ts +0 -3
- package/dist/usecases/script/write-authoring.js +0 -263
- package/dist/usecases/script/write-authoring.js.map +0 -1
- package/dist/usecases/update.d.ts +0 -13
- package/dist/usecases/update.js +0 -128
- package/dist/usecases/update.js.map +0 -1
|
@@ -1,440 +0,0 @@
|
|
|
1
|
-
// Review HTML renderer (§4 view / §10 pass6). Pure: Script v3 doc → the verified
|
|
2
|
-
// cezhi-verify review UI (dual-tab 剧本审阅 / 资产总览, left video + right script
|
|
3
|
-
// rows, click a row to seek, per-actor state×episode matrix, scene chips). The
|
|
4
|
-
// HTML/CSS/JS is ported VERBATIM from the scaffold's 06_build_review_html; only
|
|
5
|
-
// the data it reads is transformed here from v3 into the shape that UI expects
|
|
6
|
-
// (asset_name / actor_names / actor_states / scene_num / location_name /
|
|
7
|
-
// action.extend.timestamp). Video is referenced relatively as src/ep_NNN.mp4
|
|
8
|
-
// (the view command symlinks the media into the workspace).
|
|
9
|
-
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
10
|
-
const isArr = (v) => Array.isArray(v);
|
|
11
|
-
const S = (v) => (typeof v === "string" ? v : "");
|
|
12
|
-
const SPACE_EN_TO_ZH = { interior: "内", exterior: "外" };
|
|
13
|
-
const TIME_EN_TO_ZH = { day: "日", night: "夜" };
|
|
14
|
-
const epNum = (episodeId) => { const m = episodeId.match(/(\d+)/); return m ? Number(m[1]) : 0; };
|
|
15
|
-
const scnNum = (sceneId) => { const m = sceneId.match(/(\d+)/); return m ? Number(m[1]) : 0; };
|
|
16
|
-
function nameMap(list, idField, nameField) {
|
|
17
|
-
const m = new Map();
|
|
18
|
-
if (isArr(list))
|
|
19
|
-
for (const a of list)
|
|
20
|
-
if (isObj(a) && typeof a[idField] === "string")
|
|
21
|
-
m.set(a[idField], S(a[nameField]));
|
|
22
|
-
return m;
|
|
23
|
-
}
|
|
24
|
-
function stateNameMap(list, idField) {
|
|
25
|
-
const m = new Map();
|
|
26
|
-
if (isArr(list))
|
|
27
|
-
for (const a of list) {
|
|
28
|
-
if (!isObj(a) || typeof a[idField] !== "string")
|
|
29
|
-
continue;
|
|
30
|
-
const sm = new Map();
|
|
31
|
-
for (const st of isArr(a.states) ? a.states : [])
|
|
32
|
-
if (isObj(st) && typeof st.state_id === "string")
|
|
33
|
-
sm.set(st.state_id, S(st.state_name));
|
|
34
|
-
m.set(a[idField], sm);
|
|
35
|
-
}
|
|
36
|
-
return m;
|
|
37
|
-
}
|
|
38
|
-
// v3 speaker → display string (actor name, or kind[:label]).
|
|
39
|
-
function speakerLabel(speaker, actorNames) {
|
|
40
|
-
if (!isObj(speaker))
|
|
41
|
-
return "";
|
|
42
|
-
if (typeof speaker.actor_id === "string")
|
|
43
|
-
return actorNames.get(speaker.actor_id) ?? speaker.actor_id;
|
|
44
|
-
if (typeof speaker.kind === "string")
|
|
45
|
-
return `${speaker.kind}${speaker.label ? `:${S(speaker.label)}` : ""}`;
|
|
46
|
-
return "";
|
|
47
|
-
}
|
|
48
|
-
// Transform a v3 script into the scaffold review-model consumed by the UI JS.
|
|
49
|
-
function toReviewModel(doc) {
|
|
50
|
-
const actorNames = nameMap(doc.actors, "actor_id", "actor_name");
|
|
51
|
-
const locNames = nameMap(doc.locations, "location_id", "location_name");
|
|
52
|
-
const propNames = nameMap(doc.props, "prop_id", "prop_name");
|
|
53
|
-
const actorStates = stateNameMap(doc.actors, "actor_id");
|
|
54
|
-
const episodes = (isArr(doc.episodes) ? doc.episodes : []).filter(isObj).map((ep) => ({
|
|
55
|
-
episode: epNum(S(ep.episode_id)),
|
|
56
|
-
synopsis: S(ep.synopsis),
|
|
57
|
-
scenes: (isArr(ep.scenes) ? ep.scenes : []).filter(isObj).map((sc) => {
|
|
58
|
-
const loc = isObj(sc.location) ? (locNames.get(S(sc.location.location_id)) ?? S(sc.location.location_id)) : "";
|
|
59
|
-
const anames = [];
|
|
60
|
-
const astates = {};
|
|
61
|
-
for (const r of isArr(sc.actors) ? sc.actors : []) {
|
|
62
|
-
if (!isObj(r) || typeof r.actor_id !== "string")
|
|
63
|
-
continue;
|
|
64
|
-
const nm = actorNames.get(r.actor_id) ?? r.actor_id;
|
|
65
|
-
if (!anames.includes(nm))
|
|
66
|
-
anames.push(nm);
|
|
67
|
-
// Show the state's name whenever it HAS one — including a named `default`.
|
|
68
|
-
// In the video path `default` is the character's real main outfit (e.g.
|
|
69
|
-
// 「京北大学白色球衣」), not an anonymous baseline, so excluding it hid the
|
|
70
|
-
// dominant look under 「未标注」. A `default` with an empty name (the text
|
|
71
|
-
// path's nameless baseline) still falls through to 未标注 as before.
|
|
72
|
-
if (typeof r.state_id === "string") {
|
|
73
|
-
const sn = actorStates.get(r.actor_id)?.get(r.state_id) ?? "";
|
|
74
|
-
const label = sn || (r.state_id !== "default" ? r.state_id : "");
|
|
75
|
-
if (label)
|
|
76
|
-
astates[nm] = label;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const pnames = [];
|
|
80
|
-
for (const r of isArr(sc.props) ? sc.props : [])
|
|
81
|
-
if (isObj(r) && typeof r.prop_id === "string") {
|
|
82
|
-
const nm = propNames.get(r.prop_id) ?? r.prop_id;
|
|
83
|
-
if (!pnames.includes(nm))
|
|
84
|
-
pnames.push(nm);
|
|
85
|
-
}
|
|
86
|
-
const env = isObj(sc.environment) ? sc.environment : {};
|
|
87
|
-
return {
|
|
88
|
-
scene_num: scnNum(S(sc.scene_id)),
|
|
89
|
-
location_name: loc,
|
|
90
|
-
environment: { space: SPACE_EN_TO_ZH[S(env.space)] ?? S(env.space), time: TIME_EN_TO_ZH[S(env.time)] ?? S(env.time) },
|
|
91
|
-
actor_names: anames,
|
|
92
|
-
actor_states: astates,
|
|
93
|
-
prop_names: pnames,
|
|
94
|
-
actions: (isArr(sc.actions) ? sc.actions : []).filter(isObj).map((a) => ({
|
|
95
|
-
type: S(a.type),
|
|
96
|
-
content: S(a.content),
|
|
97
|
-
speaker: speakerLabel(a.speaker, actorNames),
|
|
98
|
-
emotion: typeof a.emotion === "string" ? a.emotion : undefined,
|
|
99
|
-
extend: isObj(a.extend) && typeof a.extend.timestamp === "string" ? { timestamp: a.extend.timestamp } : undefined,
|
|
100
|
-
})),
|
|
101
|
-
};
|
|
102
|
-
}),
|
|
103
|
-
}));
|
|
104
|
-
const actors = (isArr(doc.actors) ? doc.actors : []).filter(isObj).map((a) => ({
|
|
105
|
-
asset_name: S(a.actor_name),
|
|
106
|
-
description: S(a.description),
|
|
107
|
-
extend: {},
|
|
108
|
-
}));
|
|
109
|
-
return { title: S(doc.title), actors, episodes };
|
|
110
|
-
}
|
|
111
|
-
export function renderReviewHtml(doc) {
|
|
112
|
-
if (!isObj(doc))
|
|
113
|
-
throw new Error("review renderer expects a script object");
|
|
114
|
-
const model = toReviewModel(doc);
|
|
115
|
-
const data = JSON.stringify(model);
|
|
116
|
-
const title = S(model.title);
|
|
117
|
-
return `<!DOCTYPE html>
|
|
118
|
-
<html lang="zh">
|
|
119
|
-
<head>
|
|
120
|
-
<meta charset="utf-8">
|
|
121
|
-
<title>剧本审阅器 · ${title}</title>
|
|
122
|
-
<style>
|
|
123
|
-
* { box-sizing: border-box; }
|
|
124
|
-
html, body { margin: 0; height: 100%; font: 14px/1.6 -apple-system, "PingFang SC", system-ui, sans-serif; color: #1a1a1a; }
|
|
125
|
-
body { display: flex; flex-direction: column; height: 100vh; background: #f5f5f7; }
|
|
126
|
-
header { display: flex; align-items: center; gap: 12px; padding: 8px 14px; background: #fff; border-bottom: 1px solid #ddd; flex: none; }
|
|
127
|
-
header h1 { font-size: 15px; margin: 0; font-weight: 600; }
|
|
128
|
-
header select, header .nav { font-size: 13px; padding: 4px 8px; border: 1px solid #ccc; border-radius: 6px; background: #fff; cursor: pointer; }
|
|
129
|
-
header .spacer { flex: 1; }
|
|
130
|
-
header .hint { color: #888; font-size: 12px; }
|
|
131
|
-
main { flex: 1; display: flex; min-height: 0; }
|
|
132
|
-
.left { width: 42%; min-width: 320px; max-width: 620px; background: #000; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; position: relative; }
|
|
133
|
-
.left video { width: 100%; height: auto; max-height: 72vh; background: #000; }
|
|
134
|
-
.vbar { color: #ccc; font-size: 12px; padding: 6px 10px; width: 100%; display: flex; gap: 12px; align-items: center; background: #111; }
|
|
135
|
-
.vbar b { color: #fff; font-variant-numeric: tabular-nums; }
|
|
136
|
-
.right { flex: 1; overflow-y: auto; padding: 10px 4px 40vh 4px; background: #fafafa; }
|
|
137
|
-
.syn { background: #fff7e6; border: 1px solid #ffe0a3; border-radius: 8px; padding: 10px 12px; margin: 8px 10px 14px; color: #5b4a1f; font-size: 13px; }
|
|
138
|
-
.scene { margin: 0 10px 14px; border: 1px solid #e5e5e5; border-radius: 8px; overflow: hidden; background: #fff; }
|
|
139
|
-
.scene-head { background: #eef2f7; padding: 6px 12px; font-size: 12px; color: #445; display: flex; gap: 14px; flex-wrap: wrap; }
|
|
140
|
-
.scene-head .loc { font-weight: 600; color: #223; }
|
|
141
|
-
.rows { }
|
|
142
|
-
.row { display: flex; gap: 10px; padding: 5px 12px; border-top: 1px solid #f0f0f0; cursor: pointer; align-items: baseline; }
|
|
143
|
-
.row:hover { background: #eef6ff; }
|
|
144
|
-
.row.active { background: #d8ecff; }
|
|
145
|
-
.row .ts { flex: none; width: 46px; color: #3a7; font-variant-numeric: tabular-nums; font-size: 12px; }
|
|
146
|
-
.row .kind { flex: none; width: 58px; font-size: 12px; }
|
|
147
|
-
.row .kind.act { color: #999; }
|
|
148
|
-
.row .kind.dlg { color: #c60; font-weight: 600; }
|
|
149
|
-
.row .kind.think { color: #96c; font-style: italic; }
|
|
150
|
-
.row .body { flex: 1; }
|
|
151
|
-
.row .spk { color: #c60; font-weight: 600; margin-right: 4px; }
|
|
152
|
-
.row .emo { color: #a8a; font-size: 12px; margin-left: 4px; }
|
|
153
|
-
.row .body .subtitle { color: #b00; } /* 画面字幕引述,红色标出 */
|
|
154
|
-
/* ===== Tab ===== */
|
|
155
|
-
header .tabs { display: flex; gap: 4px; }
|
|
156
|
-
header .tab { font-size: 13px; padding: 5px 14px; border: 1px solid #ccc; border-radius: 6px; background: #fff; cursor: pointer; color: #555; }
|
|
157
|
-
header .tab.active { background: #1a6dff; color: #fff; border-color: #1a6dff; font-weight: 600; }
|
|
158
|
-
header .ep-ctl { display: flex; gap: 8px; align-items: center; }
|
|
159
|
-
/* ===== 资产总览 ===== */
|
|
160
|
-
.assets { flex: 1; overflow-y: auto; padding: 16px 18px 30vh; background: #f5f5f7; }
|
|
161
|
-
.asset-sec { margin: 0 0 26px; }
|
|
162
|
-
.asset-sec > h2 { font-size: 15px; margin: 4px 0 12px; color: #223; display: flex; align-items: center; gap: 8px; }
|
|
163
|
-
.asset-sec > h2 .cnt { font-size: 12px; font-weight: 400; color: #888; background: #ececf0; padding: 1px 8px; border-radius: 10px; }
|
|
164
|
-
.acard { background: #fff; border: 1px solid #e3e3e6; border-radius: 10px; padding: 14px 16px; margin-bottom: 12px; }
|
|
165
|
-
.acard .ah { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
|
|
166
|
-
.acard .ah .nm { font-size: 17px; font-weight: 700; color: #1a1a1a; }
|
|
167
|
-
.acard .ah .id { font-size: 12px; color: #aaa; font-variant-numeric: tabular-nums; }
|
|
168
|
-
.acard .ah .meta { margin-left: auto; font-size: 12px; color: #888; display: flex; gap: 6px; }
|
|
169
|
-
.acard .ah .meta .tag { background: #f0f0f3; border-radius: 6px; padding: 1px 8px; }
|
|
170
|
-
.acard .desc { font-size: 13px; color: #555; margin: 7px 0 4px; }
|
|
171
|
-
.acard .anchor { font-size: 12px; color: #999; margin-bottom: 8px; }
|
|
172
|
-
/* 状态×集 矩阵 */
|
|
173
|
-
.mtx { overflow-x: auto; margin-top: 8px; border: 1px solid #eee; border-radius: 8px; }
|
|
174
|
-
table.tl { border-collapse: collapse; font-size: 12px; width: 100%; }
|
|
175
|
-
table.tl th, table.tl td { border: 1px solid #eee; padding: 5px 7px; text-align: center; white-space: nowrap; }
|
|
176
|
-
table.tl thead th { background: #f7f7f9; color: #556; font-weight: 600; position: sticky; top: 0; }
|
|
177
|
-
table.tl .stname { text-align: left; font-weight: 600; color: #333; background: #fafafa; position: sticky; left: 0; min-width: 130px; max-width: 220px; white-space: normal; }
|
|
178
|
-
table.tl .stname.unmk { color: #999; font-weight: 400; }
|
|
179
|
-
table.tl .stname .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; vertical-align: middle; }
|
|
180
|
-
table.tl .stname .sc { color: #aaa; font-weight: 400; font-size: 11px; margin-left: 4px; }
|
|
181
|
-
table.tl td.cell { color: #ccc; }
|
|
182
|
-
table.tl td.hit { background: #fff0f0; }
|
|
183
|
-
table.tl td.hit.unmk { background: #f2f2f2; }
|
|
184
|
-
.scc { display: inline-block; min-width: 20px; margin: 1px; padding: 1px 6px; border-radius: 6px; font-variant-numeric: tabular-nums; cursor: pointer; }
|
|
185
|
-
.scc.on { background: #f4c9c9; color: #7a1f1f; border: 1px solid #e8a9a9; }
|
|
186
|
-
.scc.on.unmk { background: #dcdcdc; color: #555; border-color: #c9c9c9; }
|
|
187
|
-
.scc.on:hover { filter: brightness(0.94); }
|
|
188
|
-
</style>
|
|
189
|
-
</head>
|
|
190
|
-
<body>
|
|
191
|
-
<header>
|
|
192
|
-
<h1>${title || "剧本审阅器"}</h1>
|
|
193
|
-
<div class="tabs">
|
|
194
|
-
<button class="tab active" id="tab-script">剧本审阅</button>
|
|
195
|
-
<button class="tab" id="tab-assets">资产总览</button>
|
|
196
|
-
</div>
|
|
197
|
-
<span class="ep-ctl">
|
|
198
|
-
<select id="epsel"></select>
|
|
199
|
-
<button class="nav" id="prev">◀ 上一集</button>
|
|
200
|
-
<button class="nav" id="next">下一集 ▶</button>
|
|
201
|
-
</span>
|
|
202
|
-
<span class="spacer"></span>
|
|
203
|
-
<span class="hint" id="hint">点任意剧本行 → 视频跳到该时间戳</span>
|
|
204
|
-
</header>
|
|
205
|
-
<main id="view-script">
|
|
206
|
-
<div class="left">
|
|
207
|
-
<video id="vid" controls preload="metadata"></video>
|
|
208
|
-
<div class="vbar"><span>当前 <b id="cur">00:00</b></span><span id="epinfo"></span></div>
|
|
209
|
-
</div>
|
|
210
|
-
<div class="right" id="right"></div>
|
|
211
|
-
</main>
|
|
212
|
-
<div id="view-assets" class="assets" style="display:none"></div>
|
|
213
|
-
<script>
|
|
214
|
-
const SCRIPT = ${data};
|
|
215
|
-
const eps = SCRIPT.episodes.slice().sort((a,b)=>a.episode-b.episode);
|
|
216
|
-
const vid = document.getElementById('vid');
|
|
217
|
-
const right = document.getElementById('right');
|
|
218
|
-
const epsel = document.getElementById('epsel');
|
|
219
|
-
const cur = document.getElementById('cur');
|
|
220
|
-
const epinfo = document.getElementById('epinfo');
|
|
221
|
-
let curEp = eps.length?eps[0].episode:1;
|
|
222
|
-
|
|
223
|
-
function pad(n){return String(n).padStart(2,'0');}
|
|
224
|
-
function fmt(sec){sec=Math.max(0,sec|0);return pad(sec/60|0)+':'+pad(sec%60);}
|
|
225
|
-
function tsToSec(ts){if(!ts)return null;const m=String(ts).match(/(?:(\\d{1,2}):)?(\\d{1,2}):(\\d{2}(?:\\.\\d{1,3})?)/);return m?(+(m[1]||0))*3600+(+m[2])*60+(+m[3]):null;}
|
|
226
|
-
function epId(n){return 'ep_'+String(n).padStart(3,'0');}
|
|
227
|
-
function actKind(t){return t==='dialogue'?'dlg':t==='inner_thought'?'think':'act';}
|
|
228
|
-
function actTs(a){return a && a.extend ? a.extend.timestamp : undefined;}
|
|
229
|
-
|
|
230
|
-
function renderBody(content){
|
|
231
|
-
const esc = content.replace(/&/g,'&').replace(/</g,'<');
|
|
232
|
-
return esc.replace(/(画面(?:字幕|文字)[::][^。!?\\n]*)/g,'<span class="subtitle">$1</span>');
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
for(const e of eps){
|
|
236
|
-
const o=document.createElement('option');
|
|
237
|
-
o.value=e.episode; o.textContent='第 '+e.episode+' 集';
|
|
238
|
-
epsel.appendChild(o);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function loadEp(n, targetScene){
|
|
242
|
-
curEp=n;
|
|
243
|
-
epsel.value=n;
|
|
244
|
-
vid.src='src/'+epId(n)+'.mp4';
|
|
245
|
-
const ep=eps.find(e=>e.episode===n);
|
|
246
|
-
if(!ep)return;
|
|
247
|
-
epinfo.textContent='第'+n+'集 · '+ep.scenes.length+'场';
|
|
248
|
-
right.innerHTML='';
|
|
249
|
-
if(ep.synopsis){const s=document.createElement('div');s.className='syn';s.textContent='梗概:'+ep.synopsis;right.appendChild(s);}
|
|
250
|
-
for(const sc of ep.scenes){
|
|
251
|
-
const box=document.createElement('div');box.className='scene';
|
|
252
|
-
box.dataset.scene=sc.scene_num;
|
|
253
|
-
const head=document.createElement('div');head.className='scene-head';
|
|
254
|
-
const env=(sc.environment&&(sc.environment.space||'')+' '+(sc.environment.time||''))||'';
|
|
255
|
-
const chNames=sc.actor_names||[]; const chSt=sc.actor_states||{};
|
|
256
|
-
head.innerHTML='<span class="loc">场景'+sc.scene_num+' · '+(sc.location_name||'')+'</span>'+
|
|
257
|
-
'<span>'+env+'</span>'+
|
|
258
|
-
(chNames.length?'<span>角色: '+chNames.map(nm=>nm+(chSt[nm]?'('+chSt[nm]+')':'')).join('、')+'</span>':'');
|
|
259
|
-
box.appendChild(head);
|
|
260
|
-
const rows=document.createElement('div');rows.className='rows';
|
|
261
|
-
for(const a of sc.actions){
|
|
262
|
-
const ts=actTs(a); const kd=actKind(a.type); const sec=tsToSec(ts);
|
|
263
|
-
const row=document.createElement('div');row.className='row';row.dataset.sec=sec==null?'':sec;
|
|
264
|
-
const spk=a.speaker?'<span class="spk">'+a.speaker+'</span>':'';
|
|
265
|
-
const emo=a.emotion?'<span class="emo">['+a.emotion+']</span>':'';
|
|
266
|
-
row.innerHTML='<span class="ts">'+(ts||'')+'</span>'+
|
|
267
|
-
'<span class="kind '+kd+'">'+kd+'</span>'+
|
|
268
|
-
'<span class="body">'+spk+renderBody(a.content)+emo+'</span>';
|
|
269
|
-
if(sec!=null)row.addEventListener('click',()=>{vid.currentTime=sec;vid.play();});
|
|
270
|
-
rows.appendChild(row);
|
|
271
|
-
}
|
|
272
|
-
box.appendChild(rows);right.appendChild(box);
|
|
273
|
-
}
|
|
274
|
-
if(targetScene){
|
|
275
|
-
const tb=right.querySelector('.scene[data-scene="'+targetScene+'"]');
|
|
276
|
-
if(tb){tb.scrollIntoView({block:'start'}); tb.style.outline='2px solid #1a6dff'; setTimeout(()=>tb.style.outline='',1600);}
|
|
277
|
-
} else { right.scrollTop=0; }
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
vid.addEventListener('timeupdate',()=>{
|
|
281
|
-
cur.textContent=fmt(vid.currentTime);
|
|
282
|
-
const t=vid.currentTime;
|
|
283
|
-
const rows=[...right.querySelectorAll('.row')].filter(r=>r.dataset.sec!=='');
|
|
284
|
-
let active=null;
|
|
285
|
-
for(const r of rows){ if(+r.dataset.sec<=t+0.25) active=r; else break; }
|
|
286
|
-
right.querySelectorAll('.row.active').forEach(r=>r.classList.remove('active'));
|
|
287
|
-
if(active){active.classList.add('active');}
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
epsel.addEventListener('change',()=>loadEp(+epsel.value));
|
|
291
|
-
document.getElementById('prev').addEventListener('click',()=>{const i=eps.findIndex(e=>e.episode===curEp);if(i>0)loadEp(eps[i-1].episode);});
|
|
292
|
-
document.getElementById('next').addEventListener('click',()=>{const i=eps.findIndex(e=>e.episode===curEp);if(i<eps.length-1)loadEp(eps[i+1].episode);});
|
|
293
|
-
|
|
294
|
-
if(eps.length)loadEp(curEp);
|
|
295
|
-
|
|
296
|
-
// ===================== 资产总览 =====================
|
|
297
|
-
const allEps = eps.map(e=>e.episode).sort((a,b)=>a-b);
|
|
298
|
-
const actorMeta = {};
|
|
299
|
-
for(const a of (SCRIPT.actors||[])){
|
|
300
|
-
const ext=a.extend||{};
|
|
301
|
-
actorMeta[a.asset_name]={role:a.description||'',anchor:ext.anchor||''};
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
function aggAssets(){
|
|
305
|
-
const person={}, loc={}, prop={};
|
|
306
|
-
const addP=(nm,st,n,idx)=>{(person[nm]=person[nm]||{});(person[nm][st]=person[nm][st]||new Map()).set(n+':'+idx,{n,idx});};
|
|
307
|
-
const addX=(bag,nm,n,idx)=>{(bag[nm]=bag[nm]||new Map()).set(n+':'+idx,{n,idx});};
|
|
308
|
-
for(const ep of eps){ const n=ep.episode;
|
|
309
|
-
for(const sc of ep.scenes){ const idx=sc.scene_num;
|
|
310
|
-
const names=sc.actor_names||[]; const st=sc.actor_states||{};
|
|
311
|
-
for(const nm of names) addP(nm, st[nm]||'未标注', n, idx);
|
|
312
|
-
if(sc.location_name) addX(loc, sc.location_name, n, idx);
|
|
313
|
-
for(const p of (sc.prop_names||[])) addX(prop, p, n, idx);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return {person,loc,prop};
|
|
317
|
-
}
|
|
318
|
-
const AG = aggAssets();
|
|
319
|
-
|
|
320
|
-
function epsOf(occMaps){ const s=new Set(); for(const m of occMaps) for(const {n} of m.values()) s.add(n); return [...s].sort((a,b)=>a-b); }
|
|
321
|
-
function sceneChips(occMap, unmk){
|
|
322
|
-
const byEp={}; for(const {n,idx} of occMap.values()){(byEp[n]=byEp[n]||[]).push(idx);}
|
|
323
|
-
return byEp;
|
|
324
|
-
}
|
|
325
|
-
function chipEl(n, idx, unmk){
|
|
326
|
-
const c=document.createElement('span'); c.className='scc on'+(unmk?' unmk':''); c.textContent=idx;
|
|
327
|
-
c.title='第'+n+'集 · 场'+idx+' → 跳转';
|
|
328
|
-
c.addEventListener('click',(e)=>{e.stopPropagation();gotoScene(n,idx);});
|
|
329
|
-
return c;
|
|
330
|
-
}
|
|
331
|
-
function gotoScene(n, idx){ switchTab('script'); loadEp(n, idx); }
|
|
332
|
-
|
|
333
|
-
function personCard(name){
|
|
334
|
-
const states=AG.person[name]; const stKeys=Object.keys(states);
|
|
335
|
-
const involved=epsOf(Object.values(states));
|
|
336
|
-
const card=document.createElement('div'); card.className='acard';
|
|
337
|
-
const meta=actorMeta[name]||{};
|
|
338
|
-
const totalScenes=new Set(); for(const m of Object.values(states)) for(const k of m.keys()) totalScenes.add(k);
|
|
339
|
-
const head=document.createElement('div'); head.className='ah';
|
|
340
|
-
head.innerHTML='<span class="nm">'+esc(name)+'</span>'+
|
|
341
|
-
'<span class="meta"><span class="tag">'+totalScenes.size+' 场</span><span class="tag">'+involved.length+' 集</span><span class="tag">'+stKeys.length+' 状态</span></span>';
|
|
342
|
-
card.appendChild(head);
|
|
343
|
-
if(meta.role){const d=document.createElement('div');d.className='desc';d.textContent=meta.role;card.appendChild(d);}
|
|
344
|
-
if(meta.anchor){const d=document.createElement('div');d.className='anchor';d.textContent='锚点:'+meta.anchor;card.appendChild(d);}
|
|
345
|
-
const wrap=document.createElement('div'); wrap.className='mtx';
|
|
346
|
-
const tb=document.createElement('table'); tb.className='tl';
|
|
347
|
-
let thead='<thead><tr><th class="stname">状态\集</th>';
|
|
348
|
-
for(const n of involved) thead+='<th>'+n+'</th>';
|
|
349
|
-
thead+='</tr></thead>';
|
|
350
|
-
const ordered=stKeys.filter(s=>s!=='未标注').sort((a,b)=>states[b].size-states[a].size);
|
|
351
|
-
if(states['未标注']) ordered.push('未标注');
|
|
352
|
-
const tbody=document.createElement('tbody');
|
|
353
|
-
for(const st of ordered){
|
|
354
|
-
const unmk=st==='未标注';
|
|
355
|
-
const byEp=sceneChips(states[st], unmk);
|
|
356
|
-
const tr=document.createElement('tr');
|
|
357
|
-
const th=document.createElement('td'); th.className='stname'+(unmk?' unmk':'');
|
|
358
|
-
th.innerHTML='<span class="dot" style="background:'+(unmk?'#bbb':'#d9534f')+'"></span>'+esc(st)+'<span class="sc">'+states[st].size+'</span>';
|
|
359
|
-
tr.appendChild(th);
|
|
360
|
-
for(const n of involved){
|
|
361
|
-
const td=document.createElement('td'); td.className='cell'+(byEp[n]?' hit'+(unmk?' unmk':''):'');
|
|
362
|
-
if(byEp[n]){ for(const idx of byEp[n].sort((a,b)=>a-b)) td.appendChild(chipEl(n,idx,unmk)); }
|
|
363
|
-
tr.appendChild(td);
|
|
364
|
-
}
|
|
365
|
-
tbody.appendChild(tr);
|
|
366
|
-
}
|
|
367
|
-
tb.innerHTML=thead; tb.appendChild(tbody);
|
|
368
|
-
wrap.appendChild(tb); card.appendChild(wrap);
|
|
369
|
-
return card;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
function occCard(name, occMap){
|
|
373
|
-
const involved=epsOf([occMap]);
|
|
374
|
-
const card=document.createElement('div'); card.className='acard';
|
|
375
|
-
const head=document.createElement('div'); head.className='ah';
|
|
376
|
-
head.innerHTML='<span class="nm">'+esc(name)+'</span>'+
|
|
377
|
-
'<span class="meta"><span class="tag">'+occMap.size+' 场</span><span class="tag">'+involved.length+' 集</span></span>';
|
|
378
|
-
card.appendChild(head);
|
|
379
|
-
const wrap=document.createElement('div'); wrap.className='mtx';
|
|
380
|
-
const tb=document.createElement('table'); tb.className='tl';
|
|
381
|
-
let thead='<thead><tr><th class="stname">出现\集</th>';
|
|
382
|
-
for(const n of involved) thead+='<th>'+n+'</th>'; thead+='</tr></thead>';
|
|
383
|
-
const byEp=sceneChips(occMap,false);
|
|
384
|
-
const tbody=document.createElement('tbody'); const tr=document.createElement('tr');
|
|
385
|
-
const th=document.createElement('td'); th.className='stname';
|
|
386
|
-
th.innerHTML='<span class="dot" style="background:#5b8def"></span>出现';
|
|
387
|
-
tr.appendChild(th);
|
|
388
|
-
for(const n of involved){ const td=document.createElement('td'); td.className='cell'+(byEp[n]?' hit':'');
|
|
389
|
-
if(byEp[n]){ for(const idx of byEp[n].sort((a,b)=>a-b)) td.appendChild(chipEl(n,idx,false)); } tr.appendChild(td);}
|
|
390
|
-
tbody.appendChild(tr); tb.innerHTML=thead; tb.appendChild(tbody);
|
|
391
|
-
wrap.appendChild(tb); card.appendChild(wrap);
|
|
392
|
-
return card;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
function esc(s){return String(s).replace(/&/g,'&').replace(/</g,'<');}
|
|
396
|
-
|
|
397
|
-
let assetsRendered=false;
|
|
398
|
-
function renderAssets(){
|
|
399
|
-
if(assetsRendered) return; assetsRendered=true;
|
|
400
|
-
const root=document.getElementById('view-assets');
|
|
401
|
-
const persons=Object.keys(AG.person).sort((a,b)=>{
|
|
402
|
-
const ea=new Set(),eb=new Set();
|
|
403
|
-
for(const m of Object.values(AG.person[a])) for(const {n} of m.values()) ea.add(n);
|
|
404
|
-
for(const m of Object.values(AG.person[b])) for(const {n} of m.values()) eb.add(n);
|
|
405
|
-
return eb.size-ea.size;
|
|
406
|
-
});
|
|
407
|
-
const secP=document.createElement('div'); secP.className='asset-sec';
|
|
408
|
-
secP.innerHTML='<h2>人物 <span class="cnt">'+persons.length+'</span></h2>';
|
|
409
|
-
for(const nm of persons) secP.appendChild(personCard(nm));
|
|
410
|
-
root.appendChild(secP);
|
|
411
|
-
const locs=Object.keys(AG.loc).sort((a,b)=>AG.loc[b].size-AG.loc[a].size);
|
|
412
|
-
const secL=document.createElement('div'); secL.className='asset-sec';
|
|
413
|
-
secL.innerHTML='<h2>场景 <span class="cnt">'+locs.length+'</span></h2>';
|
|
414
|
-
for(const nm of locs) secL.appendChild(occCard(nm,AG.loc[nm]));
|
|
415
|
-
root.appendChild(secL);
|
|
416
|
-
const props=Object.keys(AG.prop).sort((a,b)=>AG.prop[b].size-AG.prop[a].size);
|
|
417
|
-
const secD=document.createElement('div'); secD.className='asset-sec';
|
|
418
|
-
secD.innerHTML='<h2>道具 <span class="cnt">'+props.length+'</span></h2>';
|
|
419
|
-
for(const nm of props) secD.appendChild(occCard(nm,AG.prop[nm]));
|
|
420
|
-
root.appendChild(secD);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
const tabScript=document.getElementById('tab-script'), tabAssets=document.getElementById('tab-assets');
|
|
424
|
-
const viewScript=document.getElementById('view-script'), viewAssets=document.getElementById('view-assets');
|
|
425
|
-
const epCtl=document.querySelector('.ep-ctl'), hint=document.getElementById('hint');
|
|
426
|
-
function switchTab(which){
|
|
427
|
-
const asset=which==='assets';
|
|
428
|
-
tabScript.classList.toggle('active',!asset); tabAssets.classList.toggle('active',asset);
|
|
429
|
-
viewScript.style.display=asset?'none':'flex'; viewAssets.style.display=asset?'block':'none';
|
|
430
|
-
epCtl.style.display=asset?'none':'flex';
|
|
431
|
-
hint.textContent=asset?'点场号 → 跳回剧本审阅对应集/场':'点任意剧本行 → 视频跳到该时间戳';
|
|
432
|
-
if(asset) renderAssets();
|
|
433
|
-
}
|
|
434
|
-
tabScript.addEventListener('click',()=>switchTab('script'));
|
|
435
|
-
tabAssets.addEventListener('click',()=>switchTab('assets'));
|
|
436
|
-
</script>
|
|
437
|
-
</body>
|
|
438
|
-
</html>`;
|
|
439
|
-
}
|
|
440
|
-
//# sourceMappingURL=review-renderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-renderer.js","sourceRoot":"","sources":["../../../src/infra/ingest/review-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export declare const TEXT_EXTENSIONS: readonly [".txt", ".md", ".docx"];
|
|
2
|
-
export declare const VIDEO_MIME: Readonly<Record<string, string>>;
|
|
3
|
-
export type SourceKind = "text" | "video-file" | "video-directory";
|
|
4
|
-
export declare class UnsupportedInputError extends Error {
|
|
5
|
-
readonly received: string;
|
|
6
|
-
constructor(received: string);
|
|
7
|
-
}
|
|
8
|
-
export type ResolvedSource = {
|
|
9
|
-
kind: "text";
|
|
10
|
-
path: string;
|
|
11
|
-
ext: string;
|
|
12
|
-
} | {
|
|
13
|
-
kind: "video-file";
|
|
14
|
-
path: string;
|
|
15
|
-
ext: string;
|
|
16
|
-
} | {
|
|
17
|
-
kind: "video-directory";
|
|
18
|
-
path: string;
|
|
19
|
-
files: string[];
|
|
20
|
-
};
|
|
21
|
-
export declare function resolveSource(sourcePath: string): ResolvedSource;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
// Ingest source resolver (§3.2/§10.1). Classifies a source path into text or
|
|
2
|
-
// video and enforces the strict input allowlist. PDF/JSON/XLSX are explicitly
|
|
3
|
-
// unsupported here (they belong to other commands), returning a clear error.
|
|
4
|
-
import * as fs from "node:fs";
|
|
5
|
-
import * as path from "node:path";
|
|
6
|
-
export const TEXT_EXTENSIONS = [".txt", ".md", ".docx"];
|
|
7
|
-
// Common Gemini-ingestible video containers (§10.1); extension → MIME.
|
|
8
|
-
export const VIDEO_MIME = {
|
|
9
|
-
".mp4": "video/mp4",
|
|
10
|
-
".mov": "video/mov",
|
|
11
|
-
".avi": "video/avi",
|
|
12
|
-
".mpeg": "video/mpeg",
|
|
13
|
-
".mpg": "video/mpg",
|
|
14
|
-
".webm": "video/webm",
|
|
15
|
-
".flv": "video/x-flv",
|
|
16
|
-
".wmv": "video/wmv",
|
|
17
|
-
};
|
|
18
|
-
export class UnsupportedInputError extends Error {
|
|
19
|
-
received;
|
|
20
|
-
constructor(received) {
|
|
21
|
-
super(`Unsupported input: ${received}`);
|
|
22
|
-
this.received = received;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
function ext(p) {
|
|
26
|
-
return path.extname(p).toLowerCase();
|
|
27
|
-
}
|
|
28
|
-
function isVideoExt(e) {
|
|
29
|
-
return Object.hasOwn(VIDEO_MIME, e);
|
|
30
|
-
}
|
|
31
|
-
export function resolveSource(sourcePath) {
|
|
32
|
-
const stat = fs.statSync(sourcePath);
|
|
33
|
-
if (stat.isDirectory()) {
|
|
34
|
-
// Directory input is only for a set of video episodes (§10.1); scan one level.
|
|
35
|
-
const entries = fs.readdirSync(sourcePath)
|
|
36
|
-
.filter((name) => !name.startsWith("."))
|
|
37
|
-
.filter((name) => isVideoExt(ext(name)))
|
|
38
|
-
.sort()
|
|
39
|
-
.map((name) => path.join(sourcePath, name));
|
|
40
|
-
if (entries.length === 0)
|
|
41
|
-
throw new UnsupportedInputError(`directory has no supported video files: ${sourcePath}`);
|
|
42
|
-
return { kind: "video-directory", path: sourcePath, files: entries };
|
|
43
|
-
}
|
|
44
|
-
const e = ext(sourcePath);
|
|
45
|
-
if (TEXT_EXTENSIONS.includes(e))
|
|
46
|
-
return { kind: "text", path: sourcePath, ext: e };
|
|
47
|
-
if (isVideoExt(e))
|
|
48
|
-
return { kind: "video-file", path: sourcePath, ext: e };
|
|
49
|
-
throw new UnsupportedInputError(`file extension ${e || "(none)"} is not supported by ingest (txt/md/docx/video only)`);
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=source-resolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-resolver.js","sourceRoot":"","sources":["../../../src/infra/ingest/source-resolver.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAE7E,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAU,CAAC;AAEjE,uEAAuE;AACvE,MAAM,CAAC,MAAM,UAAU,GAAqC;IAC1D,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,WAAW;CACpB,CAAC;AAIF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACzB;IAArB,YAAqB,QAAgB;QACnC,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;QADrB,aAAQ,GAAR,QAAQ,CAAQ;IAErC,CAAC;CACF;AAED,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAOD,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,+EAA+E;QAC/E,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC;aACvC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACvC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;aACvC,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,qBAAqB,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC;QACnH,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAK,eAAqC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC1G,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,IAAI,qBAAqB,CAAC,kBAAkB,CAAC,IAAI,QAAQ,sDAAsD,CAAC,CAAC;AACzH,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// Text source reader (§pass1-prepare). Strict UTF-8 decode (rejects invalid
|
|
2
|
-
// bytes), BOM strip, CRLF/CR → LF. Markdown is preserved verbatim (order,
|
|
3
|
-
// headings, lists) — no screenplay interpretation here. DOCX reuses the existing
|
|
4
|
-
// OpenXML converter, then goes through the same normalization.
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
import { convertDocx } from "../converters.js";
|
|
7
|
-
export class SourceDecodeError extends Error {
|
|
8
|
-
}
|
|
9
|
-
function normalize(text) {
|
|
10
|
-
return text.replace(/^/, "").replace(/\r\n?/g, "\n");
|
|
11
|
-
}
|
|
12
|
-
function decodeUtf8Strict(buf) {
|
|
13
|
-
try {
|
|
14
|
-
return new TextDecoder("utf-8", { fatal: true }).decode(buf);
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
throw new SourceDecodeError("source is not valid UTF-8");
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export async function readTextSource(sourcePath, ext) {
|
|
21
|
-
if (ext === ".docx") {
|
|
22
|
-
const [text] = await convertDocx(sourcePath);
|
|
23
|
-
return normalize(text);
|
|
24
|
-
}
|
|
25
|
-
return normalize(decodeUtf8Strict(fs.readFileSync(sourcePath)));
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=text-reader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"text-reader.js","sourceRoot":"","sources":["../../../src/infra/ingest/text-reader.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAC1E,iFAAiF;AACjF,+DAA+D;AAE/D,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,GAAW;IAClE,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
// Video episode discovery (§10.1). Turns a resolved video source into a numbered
|
|
2
|
-
// episode list. A single file is episode 1. In a directory: if every file
|
|
3
|
-
// carries an episode number, reuse them (and reject duplicates); if none do,
|
|
4
|
-
// natural-sort and assign ep 1..N; mixing numbered and unnumbered files fails
|
|
5
|
-
// up front rather than guessing an order.
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
import { CliError, EXIT_INPUT } from "../../common.js";
|
|
8
|
-
import { VIDEO_MIME } from "./source-resolver.js";
|
|
9
|
-
function ext(p) {
|
|
10
|
-
return path.extname(p).toLowerCase();
|
|
11
|
-
}
|
|
12
|
-
function mimeFor(p) {
|
|
13
|
-
return VIDEO_MIME[ext(p)] ?? "application/octet-stream";
|
|
14
|
-
}
|
|
15
|
-
// Prefer an explicit episode marker before falling back to the first run of
|
|
16
|
-
// digits. Real series names commonly carry unrelated numbers (for example
|
|
17
|
-
// `749局-第35集.mp4`); treating the title number as the episode collapses an
|
|
18
|
-
// entire directory into one duplicate episode.
|
|
19
|
-
function episodeNumber(file) {
|
|
20
|
-
// Strip the extension first — `.mp4`/`.mpeg` carry digits that are not episode
|
|
21
|
-
// numbers.
|
|
22
|
-
const stem = path.basename(file, path.extname(file));
|
|
23
|
-
const explicit = stem.match(/第\s*0*(\d+)\s*[集话回]/u)
|
|
24
|
-
?? stem.match(/(?:^|[._\-\s])(?:ep(?:isode)?|e)\s*[._\-\s]*0*(\d+)(?=$|[._\-\s])/iu);
|
|
25
|
-
if (explicit)
|
|
26
|
-
return Number(explicit[1]);
|
|
27
|
-
const m = stem.match(/\d+/);
|
|
28
|
-
return m ? Number(m[0]) : null;
|
|
29
|
-
}
|
|
30
|
-
function discoveryError(message, received) {
|
|
31
|
-
return new CliError(message, {
|
|
32
|
-
exitCode: EXIT_INPUT,
|
|
33
|
-
errorCode: "INGEST_VIDEO_DISCOVERY",
|
|
34
|
-
hint: "Name every episode file with a number, or none of them, and rerun `scriptctl ingest`.",
|
|
35
|
-
data: { actual: received },
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function episode(file, n) {
|
|
39
|
-
return { episode: n, path: file, ext: ext(file), mime: mimeFor(file) };
|
|
40
|
-
}
|
|
41
|
-
export function discoverEpisodes(source) {
|
|
42
|
-
if (source.kind === "text") {
|
|
43
|
-
throw new CliError("discoverEpisodes received a text source.", {
|
|
44
|
-
exitCode: EXIT_INPUT,
|
|
45
|
-
errorCode: "INGEST_WRONG_PIPELINE",
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
if (source.kind === "video-file")
|
|
49
|
-
return [episode(source.path, 1)];
|
|
50
|
-
const files = source.files; // already one-level, allowlisted, sorted (source-resolver)
|
|
51
|
-
const numbers = files.map(episodeNumber);
|
|
52
|
-
const numbered = numbers.filter((n) => n !== null);
|
|
53
|
-
if (numbered.length === 0) {
|
|
54
|
-
// None numbered: keep the resolver's natural sort, assign 1..N.
|
|
55
|
-
return files.map((file, i) => episode(file, i + 1));
|
|
56
|
-
}
|
|
57
|
-
if (numbered.length !== files.length) {
|
|
58
|
-
const bad = files.filter((_, i) => numbers[i] === null).map((f) => path.basename(f));
|
|
59
|
-
throw discoveryError("Some episode files carry a number and some do not.", [`unnumbered: ${bad.join(", ")}`]);
|
|
60
|
-
}
|
|
61
|
-
const seen = new Set();
|
|
62
|
-
for (const n of numbered) {
|
|
63
|
-
if (seen.has(n))
|
|
64
|
-
throw discoveryError("Two episode files resolve to the same number.", [`duplicate episode: ${n}`]);
|
|
65
|
-
seen.add(n);
|
|
66
|
-
}
|
|
67
|
-
return files.map((file, i) => episode(file, numbers[i])).sort((a, b) => a.episode - b.episode);
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=video-discovery.js.map
|