@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
|
@@ -0,0 +1,823 @@
|
|
|
1
|
+
import{Command as g5,CommanderError as h5}from"commander";import*as ua from"node:crypto";import*as Po from"node:fs";import*as Ai from"node:path";import*as ve from"node:fs";import*as ht from"node:path";var Tr=class{workspace;constructor(t){this.workspace=t}get sourceText(){return ht.join(this.workspace,"source.txt")}get directDir(){return ht.join(this.workspace,"draft","scriptctl","direct")}get directScript(){return ht.join(this.directDir,"script.initial.json")}get validation(){return ht.join(this.directDir,"validation.json")}get runState(){return ht.join(this.directDir,"run_state.json")}get episodeResultsDir(){return ht.join(this.directDir,"episode_results")}get batchResultsDir(){return ht.join(this.directDir,"batch_results")}outputScript(t){return ht.join(t,"script.json")}};function dh(e){let t="";for(let n of e)n==="*"?t+="[^/]*":n==="?"?t+="[^/]":".+^$()[]{}|\\".includes(n)?t+="\\"+n:t+=n;return new RegExp("^"+t+"$")}var la=class{exists(t){return ve.existsSync(t)}readText(t){return ve.readFileSync(t,"utf-8")}writeText(t,n){ve.mkdirSync(ht.dirname(t),{recursive:!0}),ve.writeFileSync(t,n,"utf-8")}readJson(t){return JSON.parse(ve.readFileSync(t,"utf-8"))}writeJson(t,n){this.writeText(t,JSON.stringify(n,null,2)+`
|
|
2
|
+
`)}list(t,n="*"){if(!ve.existsSync(t))return[];let o=dh(n),i=ve.readdirSync(t),r=[];for(let s of i)o.test(s)&&r.push(ht.join(t,s));return r.sort(),r}delete(t){ve.existsSync(t)&&ve.unlinkSync(t)}deleteTree(t){ve.existsSync(t)&&ve.rmSync(t,{recursive:!0,force:!0})}copyToPath(t,n){ve.mkdirSync(ht.dirname(n),{recursive:!0}),ve.copyFileSync(t,n)}},Cr=new la;var B=0,G=64,b=66,fe=70,Ln=78,kp=30;var A5=Ai.join("draft","scriptctl","direct"),ph=Ai.join("workspace","script.json");var bp=["\u4E0A\u53E4\u65F6\u4EE3","\u53E4\u4EE3\u5386\u53F2","\u53E4\u98CE\u67B6\u7A7A","\u8FD1\u4EE3\u6C11\u56FD","\u73B0\u4EE3","\u6B27\u6D32\u4E2D\u4E16\u7EAA","\u8D5B\u535A\u670B\u514B","\u661F\u9645\u65F6\u4EE3","\u897F\u5E7B\u67B6\u7A7A"],vp=new Set(["actor","location","prop"]);var k5=`scriptctl parse \u8F93\u5165 = \u4E00\u4E2A md \u5DE5\u4F5C\u533A\u76EE\u5F55\u3002\u6587\u4EF6\u6309\u804C\u8D23\u5206\u5F00\uFF0C\u4E92\u4E0D\u6DF7\u5199\uFF1A
|
|
3
|
+
|
|
4
|
+
ep_001.md, ep_002.md, ... \u6B63\u6587\uFF08\u6BCF\u96C6\u4E00\u4E2A\uFF0C\u53EA\u653E\u5267\u672C\u672C\u8EAB\uFF09
|
|
5
|
+
\u4EBA\u7269.md \u5168\u5267\u552F\u4E00\u4E00\u4EFD\u89D2\u8272\u767B\u8BB0\uFF08\u6240\u6709 worker \u5171\u540C\u5F80\u91CC\u52A0\uFF09
|
|
6
|
+
\u573A\u666F.md \u5168\u5267\u552F\u4E00\u4E00\u4EFD\u5730\u70B9\u767B\u8BB0
|
|
7
|
+
\u9053\u5177.md \u5168\u5267\u552F\u4E00\u4E00\u4EFD\u9053\u5177\u767B\u8BB0
|
|
8
|
+
\u53D1\u58F0\u6E90.md \u5168\u5267\u552F\u4E00\u4E00\u4EFD\u975E\u4EBA\u7269\u53D1\u58F0\u6E90\u767B\u8BB0
|
|
9
|
+
\u6897\u6982.md \uFF08\u53EF\u9009\uFF09\u6574\u90E8\u5168\u6587\u6897\u6982
|
|
10
|
+
|
|
11
|
+
\u{1F534} \u94C1\u5F8B\uFF1A\u6B63\u6587 md \u53EA\u7BA1\u6B63\u6587\uFF0C\u7EDD\u4E0D\u5728\u6B63\u6587\u91CC\u767B\u8BB0/\u8F93\u51FA\u4EFB\u4F55\u8D44\u4EA7\u3002\u8D44\u4EA7\u4E00\u5F8B\u767B\u8BB0\u5230\u4E0A\u9762\u5BF9\u5E94
|
|
12
|
+
\u7684 \u4EBA\u7269/\u573A\u666F/\u9053\u5177/\u53D1\u58F0\u6E90 md \u91CC\u3002\u6B63\u6587\u91CC\u53EA\u201C\u5F15\u7528\u201D\u540D\u5B57\u4E0E\u5DF2\u767B\u8BB0\u72B6\u6001\uFF0C\u4E0D\u5199\u63CF\u8FF0\u3002
|
|
13
|
+
\u{1F534} \u8D44\u4EA7\u5C31\u8FD9 4 \u4EFD\uFF0C\u5168\u5267\u5171\u7528\u3001\u5927\u5BB6\u4E00\u8D77\u52A0\uFF1B\u540C\u540D\u53EA\u767B\u4E00\u6B21\uFF0C\u91CD\u590D\u65E0\u59A8\uFF08parse / \u5408\u5E76\u9636\u6BB5\u53BB\u91CD\uFF09\u3002
|
|
14
|
+
\u{1F7E1} \u53EA\u6709\u6B63\u6587\u3001\u8FD8\u6CA1\u5199\u8D44\u4EA7 md\uFF1F\u5148\u8DD1 \`scriptctl parse <dir> --extract-assets\`\uFF1A\u5B83\u4ECE\u6B63\u6587\u91CC
|
|
15
|
+
\u5F15\u7528\u5230\u7684\u8D44\u4EA7\u540D\u51FA\u53D1\uFF0C\u7528 LLM \u8865\u51FA\u63CF\u8FF0 / \u4E16\u754C\u89C2 / \u4E3B\u89D2\uFF0C\u5199\u56DE\u4E0A\u9762\u8FD9\u51E0\u4EFD\u8D44\u4EA7 md \u4F9B\u4F60\u590D\u6838\uFF1B
|
|
16
|
+
\u590D\u6838\u5FAE\u8C03\u540E\u518D\u8DD1 \`scriptctl parse <dir>\`\uFF08\u7EAF\u786E\u5B9A\u6027\uFF09\u88C5\u914D script.json\u3002
|
|
17
|
+
|
|
18
|
+
==================== 1. \u6B63\u6587 md\uFF08\u6BCF\u96C6\u4E00\u4E2A\uFF0Cep_<NNN>.md\uFF09 ====================
|
|
19
|
+
# <\u672C\u96C6\u6807\u9898> \u2190 \u7B2C\u4E00\u884C\uFF0C\u975E\u300C\u5267\u672C/\u6897\u6982\u300D\u7684\u9876\u7EA7\u6807\u9898\u5373\u672C\u96C6\u6807\u9898\uFF1B\u7F3A\u7701\u65F6 parse \u4ECE\u6B63\u6587\u751F\u6210\u77ED\u6807\u9898
|
|
20
|
+
|
|
21
|
+
## \u6897\u6982
|
|
22
|
+
<\u672C\u96C6\u4E00\u6BB5\u8BDD\u6897\u6982\uFF0C\u7EAF\u6587\u672C\uFF0C\u53EF\u591A\u884C>
|
|
23
|
+
|
|
24
|
+
# \u5267\u672C
|
|
25
|
+
|
|
26
|
+
## \u573A\u666F 1
|
|
27
|
+
- \u65F6\u7A7A: <\u5185|\u5916> <\u65E5|\u591C>
|
|
28
|
+
- \u5730\u70B9: <\u5730\u70B9\u540D>[\u573A\u666F\u72B6\u6001] \u2190 \u53EA\u5199\u540D\u5B57\uFF0C\u5F15\u7528 \u573A\u666F.md \u91CC\u767B\u8BB0\u7684\u5730\u70B9/\u72B6\u6001
|
|
29
|
+
- \u89D2\u8272: <\u89D2\u82721>, <\u89D2\u82722>(\u72B6\u6001), <\u89D2\u82723> \u2190 \u53EA\u5199\u540D\u5B57\uFF0C\u5F15\u7528 \u4EBA\u7269.md \u91CC\u767B\u8BB0\u7684\u89D2\u8272/\u72B6\u6001
|
|
30
|
+
- \u9053\u5177: <\u9053\u51771>, <\u9053\u51772>(\u72B6\u6001), <\u9053\u51773>[\u72B6\u6001] \u2190 \u53EA\u5199\u540D\u5B57\uFF0C\u5F15\u7528 \u9053\u5177.md \u91CC\u767B\u8BB0\u7684\u9053\u5177/\u72B6\u6001
|
|
31
|
+
|
|
32
|
+
> [act] \u52A8\u4F5C\u6216\u73AF\u5883\u63CF\u5199\u3002
|
|
33
|
+
> [dlg|name] \u89D2\u8272\u5BF9\u767D\u539F\u6587\u3002
|
|
34
|
+
> [dlg|name|emotion] \u5E26\u60C5\u7EEA\u6807\u7B7E\u7684\u5BF9\u767D\u3002
|
|
35
|
+
> [dlg|system:<\u53D1\u58F0\u6E90\u540D>] \u975E\u4EBA\u7269\u53D1\u58F0\u6E90\u5BF9\u767D\u3002
|
|
36
|
+
> [dlg|prop:<\u9053\u5177\u540D>] \u9053\u5177\u53D1\u58F0\u5BF9\u767D\u3002
|
|
37
|
+
> [dlg|broadcast:<\u5E7F\u64AD\u540D>] \u5E7F\u64AD / \u5587\u53ED\u53D1\u58F0\u5BF9\u767D\u3002
|
|
38
|
+
> [dlg|<speaker1>/<speaker2>|simultaneous] \u591A\u4EBA\u540C\u65F6\u8BF4\u540C\u4E00\u53E5\u3002
|
|
39
|
+
> [dlg|overlap] <speaker1>:<line1> / <speaker2>:<line2>
|
|
40
|
+
> [think|name] \u89D2\u8272\u5FC3\u58F0/\u5185\u5FC3\u72EC\u767D\u3002
|
|
41
|
+
|
|
42
|
+
## \u573A\u666F 2
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
\u8D44\u4EA7 md \u7684\u683C\u5F0F\uFF1A\u6BCF\u4E2A\u8D44\u4EA7\u4E00\u4E2A\u9876\u7EA7 bullet\uFF0C\u5B83\u7684\u201C\u72B6\u6001\u201D\uFF08\u5916\u89C2\u9020\u578B\u6863\u4F4D\uFF09\u5199\u6210\u7F29\u8FDB\u7684\u5B50 bullet\u3002
|
|
46
|
+
- <\u8D44\u4EA7\u540D>: <\u8EAB\u4EFD/\u63CF\u8FF0>
|
|
47
|
+
- <\u72B6\u6001\u540D>: <\u8FD9\u4E2A\u72B6\u6001\u4E0B\u7684\u5177\u4F53\u53EF\u89C6\u5916\u89C2>
|
|
48
|
+
- <\u72B6\u6001\u540D>: ...
|
|
49
|
+
\uFF08\u4E5F\u63A5\u53D7\u6241\u5E73\u5199\u6CD5 \`- <\u8D44\u4EA7\u540D>|<\u72B6\u6001\u540D>: \u63CF\u8FF0\`\uFF1B\u4E24\u79CD\u90FD\u884C\uFF0C\u6700\u540E\u5408\u5E76\u53BB\u91CD\u3002\uFF09
|
|
50
|
+
\u6B63\u6587\u672A\u663E\u5F0F\u5199\u72B6\u6001\u65F6\uFF0Cparse \u4F1A\u81EA\u52A8\u7ED1\u5B9A\u8BE5\u8D44\u4EA7\u7684 \`\u9ED8\u8BA4\` \u72B6\u6001\uFF1B\u6CA1\u6709 \`\u9ED8\u8BA4\` \u4E14\u53EA\u6709\u4E00\u4E2A\u72B6\u6001\u65F6\uFF0C\u7ED1\u5B9A\u552F\u4E00\u72B6\u6001\u3002
|
|
51
|
+
\u591A\u4E2A\u975E\u9ED8\u8BA4\u72B6\u6001\u65E0\u6CD5\u786E\u5B9A\u65F6\u4FDD\u6301 state_id:null\uFF0C\u5E76\u7531 validate \u7ED9\u51FA warning\u3002
|
|
52
|
+
|
|
53
|
+
==================== 2. \u4EBA\u7269.md\uFF08\u89D2\u8272\u767B\u8BB0 + \u72B6\u6001\uFF09 ====================
|
|
54
|
+
# \u4EBA\u7269
|
|
55
|
+
- <\u89D2\u8272\u540D>: <\u89D2\u8272\u8EAB\u4EFD/\u5916\u8C8C\u63CF\u8FF0> \u2190 \u6BCF\u4E2A\u4F1A\u5728\u6B63\u6587\u51FA\u73B0\u7684\u89D2\u8272\u90FD\u8981\u767B\u8BB0\u4E14\u6709\u975E\u7A7A\u63CF\u8FF0
|
|
56
|
+
- \u9ED8\u8BA4: <\u8FD9\u4E2A\u89D2\u8272\u9ED8\u8BA4\u5F62\u8C61\u7684\u5177\u4F53\u5916\u89C2>
|
|
57
|
+
- <\u72B6\u6001\u540D>: <\u6362\u88C5/\u9020\u578B\u540E\u7684\u5177\u4F53\u5916\u89C2> \u2190 \u6301\u4E45\u5916\u89C2\u9020\u578B\u6863\u4F4D\uFF08\u6574\u5957\u7740\u88C5/\u53D1\u578B/\u6301\u7EED\u5986\u9020\uFF09
|
|
58
|
+
|
|
59
|
+
==================== 3. \u573A\u666F.md\uFF08\u5730\u70B9\u767B\u8BB0 + \u72B6\u6001\uFF09 ====================
|
|
60
|
+
# \u573A\u666F
|
|
61
|
+
- <\u5730\u70B9\u540D>: <\u5730\u70B9\u7528\u9014/\u6C1B\u56F4>
|
|
62
|
+
- \u9ED8\u8BA4: <\u9ED8\u8BA4\u73AF\u5883\u5916\u89C2>
|
|
63
|
+
- <\u72B6\u6001\u540D>: <\u4F8B\u5982 \u767D\u5929/\u591C\u665A/\u88AB\u6BC1\u540E \u7684\u5916\u89C2>
|
|
64
|
+
|
|
65
|
+
==================== 4. \u9053\u5177.md\uFF08\u9053\u5177\u767B\u8BB0 + \u72B6\u6001\uFF09 ====================
|
|
66
|
+
# \u9053\u5177
|
|
67
|
+
- <\u9053\u5177\u540D>: <\u9053\u5177\u63CF\u8FF0>
|
|
68
|
+
- \u9ED8\u8BA4: <\u9ED8\u8BA4\u5916\u89C2>
|
|
69
|
+
- <\u72B6\u6001\u540D>: <\u4F8B\u5982 \u7834\u635F/\u53D1\u5149 \u7684\u5916\u89C2>
|
|
70
|
+
|
|
71
|
+
==================== 5. \u53D1\u58F0\u6E90.md\uFF08\u975E\u4EBA\u7269\u53D1\u58F0\u6E90\u767B\u8BB0\uFF0C\u65E0\u72B6\u6001\uFF09 ====================
|
|
72
|
+
# \u53D1\u58F0\u6E90
|
|
73
|
+
- <\u53D1\u58F0\u6E90\u540D>(system): <\u58F0\u97F3\u63CF\u8FF0>
|
|
74
|
+
- <\u5E7F\u64AD\u540D>(broadcast)
|
|
75
|
+
- <\u7FA4\u4F53\u540D>(group)
|
|
76
|
+
|
|
77
|
+
==================== 6. \u6897\u6982.md\uFF08\u53EF\u9009\uFF0C\u6574\u90E8\u5168\u6587\u6897\u6982\uFF09 ====================
|
|
78
|
+
# \u6897\u6982
|
|
79
|
+
<\u6574\u90E8\u5168\u6587\u6897\u6982\uFF0C\u7EAF\u6587\u672C\uFF0C\u53EF\u591A\u884C>
|
|
80
|
+
|
|
81
|
+
==================== 7. \u5143\u4FE1\u606F.md\uFF08\u53EF\u9009\uFF0C\u6574\u90E8\u5143\u4FE1\u606F\uFF1B\u4E00\u822C\u7531 merger \u6536\u53E3\u65F6\u5199\uFF09 ====================
|
|
82
|
+
worldview: <\u4E16\u754C\u89C2\uFF0C\u53D6\u8FD9\u4E9B\u679A\u4E3E\u4E4B\u4E00\uFF1A`+bp.join(" / ")+`>
|
|
83
|
+
style: <\u98CE\u683C\uFF0C\u81EA\u7531\u6587\u672C\uFF0C\u5982 \u90FD\u5E02\u751C\u5BA0 / \u60AC\u7591\u590D\u4EC7>
|
|
84
|
+
title: <\u5267\u540D>
|
|
85
|
+
\u4E3B\u89D2: <\u4E3B\u89D2\u540D1>, <\u4E3B\u89D2\u540D2> \u2190 \u5217\u5728\u8FD9\u91CC\u7684\u8BBE\u4E3A role_type=\u4E3B\u89D2\uFF0C\u5176\u4F59\u89D2\u8272=\u914D\u89D2
|
|
86
|
+
|
|
87
|
+
Rules:
|
|
88
|
+
- \u6B63\u6587 \`- \u89D2\u8272/\u5730\u70B9/\u9053\u5177:\` \u548C\u5BF9\u767D anchor \u7528\u7684\u540D\u5B57\uFF0C\u5FC5\u987B\u662F\u5BF9\u5E94 md \u91CC\u767B\u8BB0\u7684\u89C4\u8303\u540D\u3002
|
|
89
|
+
- \u{1F534} \u72B6\u6001\u8981\u62BD\u5168\uFF1A\u51E1\u662F\u67D0\u89D2\u8272/\u5730\u70B9/\u9053\u5177\u5728\u5267\u4E2D\u51FA\u73B0\u53EF\u8FA8\u7684\u6301\u4E45\u5916\u89C2\u6863\u4F4D\uFF08\u6362\u88C5\u3001\u53D1\u578B\u3001\u663E\u8457
|
|
90
|
+
\u4F24\u5986\u3001\u573A\u666F\u767D\u5929/\u591C\u665A/\u88AB\u6BC1\u7B49\uFF09\uFF0C\u90FD\u8981\u5728\u5176\u4E0B\u767B\u4E00\u4E2A\u72B6\u6001\u5B50 bullet\uFF1B\u5E76\u5728\u6B63\u6587\u573A\u666F \`- \u89D2\u8272:\`
|
|
91
|
+
\u884C\u7528 \`\u540D(\u72B6\u6001\u540D)\` \u5F15\u7528\u5F53\u96C6\u6240\u5904\u72B6\u6001\uFF0C\u6CA1\u5199=\u9ED8\u8BA4\u3002\u7ED9\u6BCF\u4E2A\u8D44\u4EA7\u81F3\u5C11\u767B\u4E00\u4E2A \`\u9ED8\u8BA4\` \u72B6\u6001\u3002
|
|
92
|
+
- \u72B6\u6001\u63CF\u8FF0\u53EA\u5199\u7A33\u5B9A\u53EF\u89C6\u5916\u89C2\uFF0C\u4E0D\u5199\u955C\u5934/\u5267\u60C5\u8C03\u5EA6\uFF1B\u4E0D\u8981\u628A\u201C\u80CC\u5BF9\u955C\u5934\u3001\u6B63\u8138\u672A\u9732\u3001\u7279\u5199\u3001
|
|
93
|
+
\u521D\u59CB\u3001\u8F6C\u8EAB\u3001\u63A5\u8FC7\u624B\u3001\u62E5\u543B\u3001\u7AD9\u5728\u821E\u53F0\u4E0A\u201D\u7B49\u52A8\u4F5C\u3001\u906E\u6321\u3001\u673A\u4F4D\u6216\u60C5\u8282\u8BCD\u5199\u8FDB\u72B6\u6001\u63CF\u8FF0\u3002
|
|
94
|
+
- \u6BCF\u4E2A\u72B6\u6001\u53EF\u5728\u4E0B\u4E00\u884C\u5199 \`\u63D0\u53D6\u7F18\u7531:\`\uFF0C\u7528\u81EA\u7136\u8BED\u8A00\u8BF4\u660E\u539F\u6587\u8BC1\u636E\u548C\u4E3A\u4EC0\u4E48\u5B83\u662F\u72EC\u7ACB\u53EF\u590D\u7528
|
|
95
|
+
\u5916\u89C2\u72B6\u6001\uFF1B\u4E0D\u8981\u5199\u7ED3\u6784\u5316\u6807\u7B7E\u3002\u8FDE\u7EED\u53D8\u5316\u8FC7\u7A0B\u5E27\u3001\u5C40\u90E8\u5149\u6548\u5F3A\u5F31\u3001\u900F\u660E/\u6D88\u6563/\u51DD\u5B9E\u8FDB\u5EA6\u3001
|
|
96
|
+
\u660F\u8FF7\u5367\u5E8A\u3001\u666E\u901A\u4FBF\u88C5\u9ED8\u8BA4\u4E0D\u4F5C\u4E3A\u72EC\u7ACB\u72B6\u6001\u3002
|
|
97
|
+
- \u660E\u786E\u4EEA\u5F0F\u8EAB\u4EFD\u53EF\u4FDD\u5B88\u8865\u9020\u578B\u72B6\u6001\uFF1A\u5A5A\u793C\u91CC\u4F4D\u4E8E\u7EA2\u6BEF\u5C3D\u5934\u3001\u63A5\u8FC7\u65B0\u5A18\u624B\u3001\u821E\u53F0\u62E5\u543B\u7684\u65B0\u90CE\uFF0C
|
|
98
|
+
\u5E94\u767B\u8BB0\u201C\u65B0\u90CE\u9020\u578B/\u5A5A\u793C\u6B63\u88C5\u201D\u72B6\u6001\uFF1B\u6574\u5957\u670D\u88C5\u9020\u578B\u5C5E\u4E8E\u4EBA\u7269\u72B6\u6001\uFF0C\u4E0D\u4F5C\u4E3A\u9053\u5177\u3002
|
|
99
|
+
- \u8D44\u4EA7\u540D\u662F\u89C4\u8303\u5B9E\u4F53\u540D\uFF0C\u4E0D\u5939\u62EC\u53F7 / \u72B6\u6001 / \u60C5\u7EEA / \u8EAB\u4EFD\u6CE8\u89E3\uFF1B\u60C5\u7EEA / \u59FF\u6001 / \u4E34\u65F6\u810F\u6C61\u4F24\u53E3 /
|
|
100
|
+
\u5904\u5883\u4F18\u5148\u653E\u8FDB action \u6587\u672C\u6216 dlg \u7684 emotion \u6807\u7B7E\uFF0Cparse/direct \u4E0D\u4F1A\u6309\u5173\u952E\u8BCD\u81EA\u52A8\u5220\u9664
|
|
101
|
+
\u5DF2\u663E\u5F0F\u767B\u8BB0\u7684\u4EBA\u7269\u72B6\u6001\u3002
|
|
102
|
+
- \u573A\u666F\u540D\u4E0D\u8981\u5199\u6210\u300C\u591C\u665A\u7684\u6559\u5BA4 / \u9EC4\u660F\u7684\u8857\u9053\u300D\u8FD9\u79CD\u72B6\u6001\u5316\u8D44\u4EA7\uFF1B\u767B\u8BB0\u4E3A\u300C\u6559\u5BA4 / \u8857\u9053\u300D\uFF0C\u628A
|
|
103
|
+
\u591C\u665A / \u9EC4\u660F\u5199\u6210\u8BE5\u573A\u666F\u7684\u72B6\u6001\u3002parse/direct \u4F1A\u5BF9\u786E\u5B9A\u7684\u65F6\u95F4\u72B6\u6001\u505A\u4FDD\u5B88\u89C4\u8303\u5316\u3002
|
|
104
|
+
- \u4EBA\u7269\u6301\u6709\u6216\u4F69\u6234\u7684\u7269\u4EF6\u5E94\u663E\u5F0F\u767B\u8BB0 / \u5F15\u7528\u4E3A\u9053\u5177\uFF0C\u4E0D\u8981\u5199\u6210\u4EBA\u7269\u72B6\u6001\uFF1Bparse/direct \u4E0D\u4F1A
|
|
105
|
+
\u4ECE\u4EBA\u7269\u540D / \u4EBA\u7269\u5F15\u7528 / \u4EBA\u7269\u72B6\u6001\u6807\u7B7E\u81EA\u52A8\u62C6\u51FA\u9053\u5177\u3002
|
|
106
|
+
- \u9053\u5177\u662F\u9700\u8981\u4F5C\u4E3A\u72EC\u7ACB\u89C6\u89C9\u8D44\u4EA7\u8FFD\u8E2A\u7684\u5177\u4F53\u7269\u4EF6\uFF0C\u4E0D\u662F\u52A8\u4F5C\u91CC\u51FA\u73B0\u7684\u6240\u6709\u7269\u54C1\u540D\u3002\u53EA\u6709\u63A8\u52A8
|
|
107
|
+
\u5267\u60C5\u3001\u627F\u8F7D\u89C4\u5219 / \u8BC1\u636E / \u79D8\u5BC6 / \u4EFB\u52A1\u3001\u9700\u8981\u770B\u6E05\u7279\u5B9A\u6587\u5B57 / \u56FE\u6848 / \u7167\u7247 / \u754C\u9762\u3001\u8DE8\u573A
|
|
108
|
+
\u53CD\u590D\u51FA\u73B0\u9700\u4FDD\u6301\u5916\u89C2\u3001\u6216\u4F5C\u4E3A \`prop:<\u9053\u5177\u540D>\` \u53D1\u58F0\u65F6\uFF0C\u624D\u5199\u8FDB \u9053\u5177.md / \u6B63\u6587 \`- \u9053\u5177:\`\u3002
|
|
109
|
+
\u4E0D\u6EE1\u8DB3\u8FD9\u4E9B\u6761\u4EF6\u6216\u62FF\u4E0D\u51C6\u65F6\uFF0C\u4E0D\u8981\u63D0\u5347\u4E3A\u9053\u5177\u3002
|
|
110
|
+
\u4EC5\u4EC5\u88AB\u62FF\u8D77\u3001\u4F7F\u7528\u3001\u4F69\u6234\u3001\u770B\u89C1\u3001\u6254\u51FA\u3001\u643A\u5E26\u3001\u635F\u574F\u3001\u77ED\u6682\u53C2\u4E0E\u52A8\u4F5C\uFF0C\u4E0D\u6784\u6210\u9053\u5177\u767B\u8BB0\u7406\u7531\u3002
|
|
111
|
+
\u4E0D\u8981\u4E3A\u666E\u901A\u7269\u54C1\u7C7B\u522B\u521B\u5EFA\u201C\u67D0\u4EBA\u7684\u67D0\u7269\u201D\u8FD9\u7C7B\u4E13\u5C5E\u53D8\u4F53\uFF0C\u9664\u975E\u8FD9\u4E2A\u5B9E\u4F53\u672C\u8EAB\u9700\u8981\u8DE8\u573A\u8FDE\u7EED\uFF0C
|
|
112
|
+
\u6216\u5E26\u6709\u5FC5\u987B\u770B\u6E05\u7684\u5DEE\u5F02\u5316\u5185\u5BB9\u3002
|
|
113
|
+
\u666E\u901A\u52A8\u4F5C\u5DE5\u5177\u3001\u4E34\u65F6\u624B\u6301\u7269\u3001\u80CC\u666F\u6446\u8BBE\u3001\u666E\u901A\u751F\u6D3B\u7528\u54C1\u3001\u666E\u901A\u5BB6\u5177\u3001\u666E\u901A\u670D\u88C5\u914D\u4EF6\u53EA\u7559\u5728
|
|
114
|
+
action \u6587\u672C\u3002\u5E94\u62BD\uFF1A\u53EF\u8BFB\u89C4\u5219 / \u8BC1\u636E\u7269\u3001\u4EFB\u52A1\u6216\u79D8\u5BC6\u8F7D\u4F53\u3001\u51B2\u7A81\u5173\u952E\u6B66\u5668\u3001\u901A\u884C\u94A5\u5319\u6216\u51ED\u8BC1\u3001
|
|
115
|
+
\u53CD\u590D\u51FA\u73B0\u7684\u62A4\u8EAB\u7B26 / \u88C5\u7F6E\u3001\u4F1A\u53D1\u58F0\u7684\u7269\u4EF6\uFF1B\u4E0D\u5E94\u62BD\uFF1A\u666E\u901A\u901A\u8BAF\u8BBE\u5907\u3001\u5DE5\u5177\u3001\u9910\u5177\u3001\u4E66\u672C\u3001
|
|
116
|
+
\u8863\u7269\u3001\u5BB6\u5177\u3001\u88C5\u9970\u7269\u7B49\u4E00\u6B21\u6027\u52A8\u4F5C\u7EC6\u8282\u3002
|
|
117
|
+
- \u540C\u7C7B\u8D44\u4EA7\u540D\u6309 canonical key \u53BB\u91CD\uFF1A\u6298\u53E0\u7A7A\u767D\u3001\u5FFD\u7565\u7ED3\u6784\u6027\u6807\u70B9\u548C ASCII \u5927\u5C0F\u5199\uFF1B\u5982
|
|
118
|
+
\`\u674E\u56DB A\` / \`\u674E\u56DB a\` \u4F1A\u5408\u5E76\u4E3A\u9996\u4E2A\u663E\u793A\u540D\uFF0C\u5176\u4ED6\u540D\u5B57\u8FDB\u5165 aliases\u3002
|
|
119
|
+
- \u7FA4\u4F53\u8BCD\uFF08\u4F17\u4EBA / \u7FA4\u4F17 / \u56F4\u89C2\u8005 / \u8DEF\u4EBA\u4EEC\uFF09\u4E0D\u8FDB \u4EBA\u7269.md\uFF0C\u767B\u5230 \u53D1\u58F0\u6E90.md \u7528 group \u6216\u5199\u52A8\u4F5C\u65C1\u767D\u3002
|
|
120
|
+
- \u52A8\u4F5C / \u5BF9\u767D\u6B63\u6587\u9010\u5B57\u4FDD\u7559\uFF0C\u4E0D\u8981\u8F6C\u8FF0 / \u7FFB\u8BD1 / \u6982\u62EC / \u52A0\u6CE8\u91CA\uFF1B\u52A8\u4F5C\u79CD\u7C7B\u53EA\u6709 act/dlg/think\u3002
|
|
121
|
+
- \u6BCF\u4E2A\u51FA\u73B0\u5728\u6B63\u6587\u91CC\u7684\u89D2\u8272\uFF0C\u90FD\u8981\u5728 \u4EBA\u7269.md \u7ED9\u51FA\u975E\u7A7A\u63CF\u8FF0\uFF08\u5426\u5219\u6821\u9A8C\u62A5\u9519\uFF09\u3002
|
|
122
|
+
`,x=class extends Error{exitCode;errorCode;hint;data;constructor(t,n){super(t),this.name="CliError",this.exitCode=n.exitCode,this.errorCode=n.errorCode,this.hint=n.hint,this.data=n.data??{}}};function lh(e){return new Tr(e)}function Op(e){return lh(e).directDir}function xe(e){let t=e.script_path??e.scriptPath;return Ai.resolve(typeof t=="string"&&t.length>0?t:ph)}function ki(e){return Cr.readJson(e)}function fa(e,t){Cr.writeJson(e,t)}function ro(e){return Cr.exists(e)}function Se(e){return ua.createHash("sha256").update(e,"utf-8").digest("hex")}function ma(e){let t=ua.createHash("sha256"),n=Po.openSync(e,"r");try{let o=Buffer.alloc(1048576);for(;;){let i=Po.readSync(n,o,0,o.length,null);if(i<=0)break;t.update(o.subarray(0,i))}}finally{Po.closeSync(n)}return t.digest("hex")}var yt={policy:["content_blocked"],network:["dns_failed","connection_refused","connection_reset","network_unreachable","tls_failed","network_failed"],timeout:["connect_timeout","request_timeout","media_processing_timeout"],rate_limit:["rate_limited"],authentication:["authentication_failed"],authorization:["permission_denied"],provider:["resource_not_found","provider_unavailable","request_rejected","attempts_exhausted"],media:["media_upload_failed","media_processing_failed","media_too_large","unsupported_media"],response:["output_truncated","empty_response","malformed_response"],pipeline:["serial_parse_failed","source_mismatch","pipeline_mismatch"],validation:["script_validation_failed"],cancelled:["cancelled"],unknown:["unknown","legacy_unclassified"]};function _t(e,t){return typeof e=="string"&&t.some(n=>n===e)}function Rp(e,t){switch(e){case"policy":return _t(t,yt.policy)?{failure_type:e,failure_code:t}:null;case"network":return _t(t,yt.network)?{failure_type:e,failure_code:t}:null;case"timeout":return _t(t,yt.timeout)?{failure_type:e,failure_code:t}:null;case"rate_limit":return _t(t,yt.rate_limit)?{failure_type:e,failure_code:t}:null;case"authentication":return _t(t,yt.authentication)?{failure_type:e,failure_code:t}:null;case"authorization":return _t(t,yt.authorization)?{failure_type:e,failure_code:t}:null;case"provider":return _t(t,yt.provider)?{failure_type:e,failure_code:t}:null;case"media":return _t(t,yt.media)?{failure_type:e,failure_code:t}:null;case"response":return _t(t,yt.response)?{failure_type:e,failure_code:t}:null;case"pipeline":return _t(t,yt.pipeline)?{failure_type:e,failure_code:t}:null;case"validation":return _t(t,yt.validation)?{failure_type:e,failure_code:t}:null;case"cancelled":return _t(t,yt.cancelled)?{failure_type:e,failure_code:t}:null;case"unknown":return _t(t,yt.unknown)?{failure_type:e,failure_code:t}:null;default:return null}}function wt(e,t){return{...e,...t}}function Vo(e){switch(e.failure_type){case"policy":return{failure_type:e.failure_type,failure_code:e.failure_code};case"network":return{failure_type:e.failure_type,failure_code:e.failure_code};case"timeout":return{failure_type:e.failure_type,failure_code:e.failure_code};case"rate_limit":return{failure_type:e.failure_type,failure_code:e.failure_code};case"authentication":return{failure_type:e.failure_type,failure_code:e.failure_code};case"authorization":return{failure_type:e.failure_type,failure_code:e.failure_code};case"provider":return{failure_type:e.failure_type,failure_code:e.failure_code};case"media":return{failure_type:e.failure_type,failure_code:e.failure_code};case"response":return{failure_type:e.failure_type,failure_code:e.failure_code};case"pipeline":return{failure_type:e.failure_type,failure_code:e.failure_code};case"validation":return{failure_type:e.failure_type,failure_code:e.failure_code};case"cancelled":return{failure_type:e.failure_type,failure_code:e.failure_code};case"unknown":return{failure_type:e.failure_type,failure_code:e.failure_code}}}function bi(e){return{...e.provider!==void 0?{provider:e.provider}:{},...e.model!==void 0?{model:e.model}:{},...e.operation!==void 0?{operation:e.operation}:{},...e.http_status!==void 0?{http_status:e.http_status}:{},...e.system_code!==void 0?{system_code:e.system_code}:{},...e.provider_source!==void 0?{provider_source:e.provider_source}:{},...e.provider_reason!==void 0?{provider_reason:e.provider_reason}:{},...e.provider_reason_raw!==void 0?{provider_reason_raw:e.provider_reason_raw}:{},...e.finish_message!==void 0?{finish_message:e.finish_message}:{},...e.safety_ratings!==void 0?{safety_ratings:e.safety_ratings}:{},...e.details!==void 0?{details:e.details}:{}}}function Np(e,t){if(e.length===0)return wt({failure_type:"unknown",failure_code:"unknown"},{retryable:!1,message:t});let n=e[0],i=e.every(r=>r.failure_type===n.failure_type&&r.failure_code===n.failure_code)?Vo(n):{failure_type:"provider",failure_code:"attempts_exhausted"};return wt(i,{retryable:e.some(r=>r.retryable),message:t})}function Tn(e){let t=e.provider||e.model?`${e.provider??"provider"}/${e.model??"model"} `:"",n=e.provider_reason?` provider_reason=${e.provider_reason}`:"",o=e.system_code?` system_code=${e.system_code}`:"",i=e.http_status!==void 0?` http_status=${e.http_status}`:"",r=e.details?.length?` | ${e.details.join(" | ")}`:"";return`${t}${e.failure_type}/${e.failure_code}${n}${o}${i}: ${e.message}${r}`}import*as zp from"node:crypto";import*as Hp from"node:fs";import*as Fp from"node:path";import*as $p from"node:crypto";var ln=["action","dialogue","inner_thought","transition"],Ct=new Set(ln),un=["system","broadcast","offscreen","group"],so=new Set(un),fn=["featured","background"],Et=new Set(fn),$o=["\u4E3B\u89D2","\u914D\u89D2"],Cn=new Set($o),Ur=["day","night","dawn","dusk"],ga=new Set(Ur);function vi(e){return typeof e=="string"&&ga.has(e)}var ha=["interior","exterior"],Mp=new Set(ha);function Ze(e){return e.normalize("NFKC").toLowerCase()}function Lp(e){return JSON.stringify([e.code,e.path,e.message])}function ya(e){let t=new Map;for(let n of e){let o=Lp(n);t.set(o,(t.get(o)??0)+1)}return t}function _a(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=ya(e.errors),o=ya(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function wa(e,t){let n=ya(e),o=[];for(let i of t){let r=Lp(i),s=n.get(r)??0;s>0?n.set(r,s-1):o.push(i)}return o}import{customAlphabet as uh}from"nanoid";var Do="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Ea=6,Go={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},fh=uh(Do,Ea),mh=`[${Do}]`,Tp=Object.fromEntries(Object.entries(Go).map(([e,t])=>[e,new RegExp(`^${t}${mh}{${Ea}}$`)]));function C(e,t){return typeof t=="string"&&Tp[e].test(t)}var xa="ID_SPACE_EXHAUSTED";function Oi(e,t=new Set,n=fh){let o=Go[e];for(let i=0;i<128;i++){let r=`${o}${n()}`;if(!t.has(r))return r}throw Object.assign(new Error(`Could not generate an unused ${e} ID after 128 attempts.`),{code:xa})}var Ye=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},gh=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,hh=/^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;function Cp(e){return e?Number(e.padEnd(3,"0")):0}function Up(e,t){if(!Number.isSafeInteger(t))throw new Ye(e,"Timestamp exceeds the supported numeric range.");return t}function Pp(e,t){let n=Math.floor(e/1e3),o=Math.floor(n/3600),i=Math.floor(n%3600/60),r=n%60,s=t?`.${t}`:"";return o>0?`${o}:${String(i).padStart(2,"0")}:${String(r).padStart(2,"0")}${s}`:`${String(i).padStart(2,"0")}:${String(r).padStart(2,"0")}${s}`}function Un(e){let t=e.trim();if(!t)throw new Ye(e,"Timestamp must not be empty.");let n=t.match(hh);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new Ye(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new Ye(e,"Timestamp seconds must be between 00 and 59.");let f=Up(e,((a*60+d)*60+p)*1e3+Cp(l));return{canonical:Pp(f,l),milliseconds:f,fractionDigits:l?.length??0}}let o=t.match(gh);if(!o)throw new Ye(e,"Use M:SS, MM:SS, or H:MM:SS with an optional 1-3 digit fraction.");let i=Number(o[1]),r=Number(o[2]),s=o[3];if(r>59)throw new Ye(e,"Timestamp seconds must be between 00 and 59.");let c=Up(e,(i*60+r)*1e3+Cp(s));return{canonical:Pp(c,s),milliseconds:c,fractionDigits:s?.length??0}}function yh(e){if(typeof e!="object"||e===null||Array.isArray(e))return;let t=e.extend;if(!(typeof t!="object"||t===null||Array.isArray(t)))return t.timestamp}function Pr(e,t,n){let o=null;e.forEach((i,r)=>{let s=yh(i);if(s===void 0)return;let c=`${t}[${r}].extend.timestamp`;if(typeof s!="string"){n("timestamp_invalid",c,"timestamp must be a string in M:SS, MM:SS, or H:MM:SS form");return}let a;try{a=Un(s)}catch(d){if(!(d instanceof Ye))throw d;n("timestamp_invalid",c,d.message);return}o!==null&&a.milliseconds<o.timestamp.milliseconds&&n("timestamp_out_of_order",c,`timestamp ${a.canonical} is earlier than Action ${o.actionIndex+1} timestamp ${o.timestamp.canonical}; equal timestamps are allowed`),o={actionIndex:r,timestamp:a}})}var xt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),mn=e=>Array.isArray(e),Ee=e=>typeof e=="string",_h=["state_changes","actor_id","speakers","lines"];function at(e){let t=[],n=[],o=(u,m,g,h)=>t.push({code:u,path:m,message:g,...h?{repair_hint:h}:{}}),i=(u,m,g)=>n.push({code:u,path:m,message:g});if(!xt(e))return{ok:!1,errors:[{code:"not_object",path:"$",message:"script must be an object"}],warnings:n};e.version!==3&&o("version","$.version","version must be 3");for(let u of["title","worldview","style"])Ee(e[u])||o("field",`$.${u}`,`${u} must be a string`);let r=new Map,s=new Map,c=new Map,a=(u,m,g,h,_)=>{if(!mn(u)){o("field",_,`${_} must be an array`);return}u.forEach((y,w)=>{let I=`${_}[${w}]`;if(!xt(y)){o("asset",I,"asset must be an object");return}let E=y[g];if(!Ee(E)){o("asset_id",`${I}.${g}`,`${g} required`);return}if(s.has(E)&&o("dup_id",`${I}.${g}`,`duplicate id ${E}`),s.set(E,m),!Ee(y[h]))o("asset_name",`${I}.${h}`,`${h} required`);else if(m==="actor"){let R=Ze(y[h]),S=c.get(R);S!==void 0?o("dup_actor_name",`${I}.${h}`,`actor name ${y[h]} already belongs to ${S}`):c.set(R,E)}(!Ee(y.importance)||!fn.includes(y.importance))&&o("importance",`${I}.importance`,`importance must be one of ${fn.join("|")}`),Ee(y.description)||o("asset_desc",`${I}.description`,"description must be a string");let A=new Set,k=new Set,D=0;!mn(y.states)||y.states.length===0?o("states",`${I}.states`,"states must be a non-empty array"):y.states.forEach((R,S)=>{let M=`${I}.states[${S}]`;if(!xt(R)||!Ee(R.state_id)){o("state_id",M,"state_id required");return}A.has(R.state_id)&&o("dup_state",M,`duplicate state_id ${R.state_id}`),A.add(R.state_id),R.state_id==="default"&&D++,Ee(R.state_name)?(k.has(R.state_name)&&o("dup_state_name",`${M}.state_name`,`duplicate state_name ${R.state_name}`),k.add(R.state_name)):o("state_name",`${M}.state_name`,"state_name required")}),mn(y.states)&&D!==1&&o("default_state",`${I}.states`,`exactly one 'default' state required, found ${D}`),r.set(E,A)})};a(e.actors,"actor","actor_id","actor_name","$.actors"),a(e.locations,"location","location_id","location_name","$.locations"),a(e.props,"prop","prop_id","prop_name","$.props");let d=(u,m,g,h)=>{if(s.get(u)!==g){o("ref",h,`${g} ${u} not found`);return}m!==void 0&&(!Ee(m)||!r.get(u)?.has(m))&&o("state_ref",h,`state ${String(m)} not materialized on ${u}`)},p=(u,m,g,h)=>{if(u===void 0){o("field",h,`${h} required (may be empty array)`);return}if(!mn(u)){o("field",h,`${h} must be an array`);return}u.forEach((_,y)=>{if(!xt(_)||!Ee(_[g])){o("ref",`${h}[${y}]`,`${g} required`);return}d(_[g],_.state_id,m,`${h}[${y}]`)})},l=(u,m,g,h)=>{if(!xt(u)){o("action",m,"action must be an object");return}for(let y of _h)y in u&&o("legacy_field",`${m}.${y}`,`v3 forbids action.${y}`);let _=u.type;if((!Ee(_)||!ln.includes(_))&&o("action_type",`${m}.type`,`invalid action type ${String(_)}`),Ee(u.content)||o("content",`${m}.content`,"content must be a plain-text string"),_==="dialogue"||_==="inner_thought"){let y=u.speaker;if(!xt(y))o("speaker",`${m}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in y)(!Ee(y.kind)||!un.includes(y.kind))&&o("speaker_kind",`${m}.speaker.kind`,"invalid non-actor speaker kind");else if(Ee(y.actor_id)){if(d(y.actor_id,y.state_id,"actor",`${m}.speaker`),!g.has(y.actor_id)){let w=r.get(y.actor_id),I=Ee(y.state_id)&&w?.has(y.state_id)?y.state_id:w?.has("default")?"default":w?.values().next().value,E=h&&I?`scriptctl scene-ref ${h} actor:${y.actor_id} --state ${I} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${m}.speaker.actor_id`,`actor ${y.actor_id} is not referenced by this scene`,E)}}else o("speaker",`${m}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return mn(f)?f.forEach((u,m)=>{let g=`$.episodes[${m}]`;if(!xt(u)||!Ee(u.episode_id)){o("episode_id",g,"episode_id required");return}if(!mn(u.scenes)){o("scenes",`${g}.scenes`,"scenes must be an array");return}u.scenes.forEach((h,_)=>{let y=`${g}.scenes[${_}]`;if(!xt(h)){o("scene",y,"scene must be an object");return}"context"in h&&o("legacy_field",`${y}.context`,"v3 forbids scene.context"),Ee(h.scene_id)||o("scene_id",y,"scene_id required");let w=h.environment;w===void 0||xt(w)&&(!Ee(w.time)||w.time.trim()==="")?i("scene_time_missing",`${y}.environment.time`,"scene time is required for production review"):!xt(w)||w.space!==void 0&&!Ee(w.space)||!Ee(w.time)?o("environment",`${y}.environment`,"environment must contain optional string space and a time string"):vi(w.time)||o("scene_time",`${y}.environment.time`,"scene time must be day|night|dawn|dusk");let I=h.location;if(I!==null&&(!xt(I)||!Ee(I.location_id)?o("location",`${y}.location`,"location must be null or {location_id}"):d(I.location_id,I.state_id,"location",`${y}.location`)),p(h.actors,"actor","actor_id",`${y}.actors`),p(h.props,"prop","prop_id",`${y}.props`),mn(h.props)){let A=new Set;h.props.forEach((k,D)=>{!xt(k)||!Ee(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${y}.props[${D}]`,`duplicate prop ref ${k.prop_id}`),A.add(k.prop_id))})}let E=new Set(mn(h.actors)?h.actors.filter(A=>xt(A)).map(A=>A.actor_id).filter(A=>Ee(A)):[]);if(!mn(h.actions))o("actions",`${y}.actions`,"actions must be an array");else{let A=Ee(h.scene_id)?`${u.episode_id}/${h.scene_id}`:void 0;h.actions.forEach((k,D)=>l(k,`${y}.actions[${D}]`,E,A)),Pr(h.actions,`${y}.actions`,o)}})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}var Xe=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ae=e=>typeof e=="string",Wt=e=>Array.isArray(e);function Sa(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Sa):Xe(e)&&Object.values(e).every(Sa)}function Bo(e,t,n){e!==void 0&&(!Xe(e)||!Object.values(e).every(Sa))&&n("extend",t,"extend must be an object containing JSON values")}function wh(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Te(e){let t=[],n=[],o=(u,m,g,h)=>t.push({code:u,path:m,message:g,...h?{repair_hint:h}:{}}),i=(u,m,g,h)=>n.push({code:u,path:m,message:g,...h?{repair_hint:h}:{}});if(!Xe(e))return{ok:!1,errors:[{code:"not_object",path:"$",message:"script must be an object"}],warnings:n};e.version!==4&&o("version","$.version","version must be 4");for(let u of["title","worldview","style"])ae(e[u])||o("field",`$.${u}`,`${u} must be a string`);for(let u of["worldview_raw","synopsis","logline","theme"])e[u]!==void 0&&!ae(e[u])&&o("field",`$.${u}`,`${u} must be a string`);e.main_characters!==void 0&&(!Wt(e.main_characters)||!e.main_characters.every(u=>Xe(u)&&ae(u.name)&&ae(u.role)))&&o("main_characters","$.main_characters","main_characters must contain {name, role} string records"),Bo(e.extend,"$.extend",o);let r=new Map,s=new Map,c=new Set,a=(u,m,g,h,_)=>{if(!Wt(u)){o("field",_,`${_} must be an array`);return}let y=new Set;u.forEach((w,I)=>{let E=`${_}[${I}]`;if(!Xe(w)){o("asset",E,"asset must be an object");return}let A=w[g];if(!C(m,A)){o("asset_id",`${E}.${g}`,`${g} must be ${m} ID`);return}if(y.has(A)&&o("dup_id",`${E}.${g}`,`duplicate ${g} ${A}`),y.add(A),r.set(A,m),!ae(w[h])||w[h].trim()==="")o("asset_name",`${E}.${h}`,`${h} must be a non-empty string`);else if(m==="actor"){let S=w[h].trim().toLocaleLowerCase();c.has(S)&&o("dup_actor_name",`${E}.${h}`,`duplicate actor name ${w[h]}`),c.add(S)}if((!ae(w.importance)||!fn.includes(w.importance))&&o("importance",`${E}.importance`,`importance must be ${fn.join("|")}`),m==="actor"&&w.role_type!==void 0&&(!ae(w.role_type)||!$o.includes(w.role_type))&&o("role_type",`${E}.role_type`,`role_type must be ${$o.join("|")}`),ae(w.description)||o("asset_desc",`${E}.description`,"description must be a string"),w.aliases!==void 0&&(!Wt(w.aliases)||!w.aliases.every(ae)))o("aliases",`${E}.aliases`,"aliases must be an array of strings");else if(Wt(w.aliases)&&w.aliases.every(ae)){let S=new Set,M=ae(w[h])?w[h]:"";w.aliases.forEach(($,T)=>{$===""&&o("alias_empty",`${E}.aliases[${T}]`,"alias must not be empty"),$===M&&o("alias_equals_name",`${E}.aliases[${T}]`,"alias must differ from the asset name"),S.has($)&&o("dup_alias",`${E}.aliases[${T}]`,`duplicate alias ${$}`),S.add($)})}Bo(w.extend,`${E}.extend`,o);let k=new Set,D=new Set,R=0;!Wt(w.states)||w.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):w.states.forEach((S,M)=>{let $=`${E}.states[${M}]`;if(!Xe(S)){o("state",$,"state must be an object");return}let T=S.state_id;if(T!=="default"&&!C("state",T)){o("state_id",`${$}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(T)&&o("dup_state",`${$}.state_id`,`duplicate state_id ${T}`),k.add(T),T==="default"&&R++,!ae(S.state_name)||S.state_name.trim()===""?o("state_name",`${$}.state_name`,"state_name must be a non-empty string"):(D.has(S.state_name)&&o("dup_state_name",`${$}.state_name`,`duplicate state_name ${S.state_name}`),D.add(S.state_name)),ae(S.description)||o("state_description",`${$}.description`,"description must be a string"),Bo(S.extend,`${$}.extend`,o)}),R!==1&&o("default_state",`${E}.states`,`exactly one default state required, found ${R}`),s.set(A,k)})};a(e.actors,"actor","actor_id","actor_name","$.actors"),a(e.locations,"location","location_id","location_name","$.locations"),a(e.props,"prop","prop_id","prop_name","$.props");let d=(u,m,g)=>{if(!Wt(m)||m.length===0||!m.every(ae))return o("state_ids",g,"state_ids must be a non-empty array of strings"),[];let h=m,_=new Set;return h.forEach((y,w)=>{_.has(y)&&o("dup_state_ref",`${g}[${w}]`,`duplicate state_id ${y}`),_.add(y),s.get(u)?.has(y)||o("state_ref",`${g}[${w}]`,`state ${y} not found on ${u}`)}),wh(h)||o("state_ids_order",g,"state_ids must be sorted lexically"),h},p=new Set,l=new Set,f=new Set;return Wt(e.episodes)?e.episodes.forEach((u,m)=>{let g=`$.episodes[${m}]`;if(!Xe(u)){o("episode",g,"episode must be an object");return}C("episode",u.episode_id)?(p.has(u.episode_id)&&o("dup_episode_id",`${g}.episode_id`,`duplicate episode_id ${u.episode_id}`),p.add(u.episode_id)):o("episode_id",`${g}.episode_id`,"episode_id must be ep plus six Base58 characters");for(let h of["title","synopsis"])u[h]!==void 0&&!ae(u[h])&&o("field",`${g}.${h}`,`${h} must be a string`);if(Bo(u.extend,`${g}.extend`,o),!Wt(u.scenes)){o("scenes",`${g}.scenes`,"scenes must be an array");return}u.scenes.forEach((h,_)=>{let y=`${g}.scenes[${_}]`;if(!Xe(h)){o("scene",y,"scene must be an object");return}C("scene",h.scene_id)?(l.has(h.scene_id)&&o("dup_scene_id",`${y}.scene_id`,`duplicate scene_id ${h.scene_id}`),l.add(h.scene_id)):o("scene_id",`${y}.scene_id`,"scene_id must be scn plus six Base58 characters"),Bo(h.extend,`${y}.extend`,o),h.environment===void 0||Xe(h.environment)&&(!ae(h.environment.time)||h.environment.time.trim()==="")?i("scene_time_missing",`${y}.environment.time`,"scene time is required for production review"):!Xe(h.environment)||h.environment.space!==void 0&&!ae(h.environment.space)||!ae(h.environment.time)?o("environment",`${y}.environment`,"environment must contain optional string space and a time string"):vi(h.environment.time)||o("scene_time",`${y}.environment.time`,"scene time must be day|night|dawn|dusk"),h.location!==null&&(!Xe(h.location)||!C("location",h.location.location_id)?o("location",`${y}.location`,"location must be null or a typed v4 location reference"):("state_id"in h.location&&o("v3_field",`${y}.location.state_id`,"Script v4 scene references use state_ids"),r.get(h.location.location_id)!=="location"&&o("location_ref",`${y}.location.location_id`,`location ${h.location.location_id} not found`),d(h.location.location_id,h.location.state_ids,`${y}.location.state_ids`)));let w=new Map,I=(E,A,k,D)=>{if(!Wt(E)){o("field",D,`${D} must be an array`);return}let R=new Set;E.forEach((S,M)=>{let $=`${D}[${M}]`;if(!Xe(S)||!C(A,S[k])){o("ref",$,`${k} must be a typed v4 ID`);return}let T=S[k];"state_id"in S&&o("v3_field",`${$}.state_id`,"Script v4 scene references use state_ids"),R.has(T)&&o("dup_asset_ref",`${$}.${k}`,`duplicate ${A} ref ${T}`),R.add(T),r.get(T)!==A&&o("asset_ref",`${$}.${k}`,`${A} ${T} not found`);let O=d(T,S.state_ids,`${$}.state_ids`);A==="actor"&&w.set(T,new Set(O))})};if(I(h.actors,"actor","actor_id",`${y}.actors`),I(h.props,"prop","prop_id",`${y}.props`),!Wt(h.actions)){o("actions",`${y}.actions`,"actions must be an array");return}h.actions.forEach((E,A)=>{let k=`${y}.actions[${A}]`;if(!Xe(E)){o("action",k,"action must be an object");return}if(C("action",E.action_id)?(f.has(E.action_id)&&o("dup_action_id",`${k}.action_id`,`duplicate action_id ${E.action_id}`),f.add(E.action_id)):o("action_id",`${k}.action_id`,"action_id must be ac plus six Base58 characters"),(!ae(E.type)||!ln.includes(E.type))&&o("action_type",`${k}.type`,`invalid action type ${String(E.type)}`),ae(E.content)||o("content",`${k}.content`,"content must be a string"),"emotion"in E&&o("v3_field",`${k}.emotion`,"Script v4 does not allow emotion"),Bo(E.extend,`${k}.extend`,o),E.type==="dialogue"||E.type==="inner_thought")if(E.parenthetical!==void 0&&!ae(E.parenthetical)&&o("parenthetical",`${k}.parenthetical`,"parenthetical must be a string"),!Xe(E.speaker))o("speaker",`${k}.speaker`,"dialogue/inner_thought requires a speaker");else if(ae(E.speaker.actor_id)){("kind"in E.speaker||"label"in E.speaker)&&o("speaker_shape",`${k}.speaker`,"actor speaker cannot contain non-actor speaker fields");let R=E.speaker.actor_id;(!C("actor",R)||r.get(R)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${R} not found`);let S=w.get(R),M=s.get(R),$=ae(E.speaker.state_id)&&M?.has(E.speaker.state_id)?E.speaker.state_id:void 0,T=M?.has("default")?"default":M?.values().next().value,O=$?[$]:T?[T]:[],j=C("scene",h.scene_id)&&C("actor",R)&&O.length>0?`scriptctl scene-ref ${h.scene_id} ${R} ${O.map(Z=>`--state ${Z}`).join(" ")} -p "$SCRIPT"`:void 0;if(S||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${R} is not referenced by this scene`,j),E.speaker.state_id!==void 0&&(!ae(E.speaker.state_id)||!S?.has(E.speaker.state_id))){let Z=$?[...new Set([...S??[],$])].sort():[],De=C("scene",h.scene_id)&&C("actor",R)&&Z.length>0?`scriptctl scene-ref ${h.scene_id} ${R} ${Z.map(J=>`--state ${J}`).join(" ")} -p "$SCRIPT"`:j;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(E.speaker.state_id)} is not in this scene's actor state_ids`,De)}}else ae(E.speaker.kind)?(("actor_id"in E.speaker||"state_id"in E.speaker)&&o("speaker_shape",`${k}.speaker`,"non-actor speaker cannot contain actor speaker fields"),un.includes(E.speaker.kind)||o("speaker_kind",`${k}.speaker.kind`,"invalid non-actor speaker kind"),E.speaker.label!==void 0&&!ae(E.speaker.label)&&o("speaker_label",`${k}.speaker.label`,"speaker label must be a string")):o("speaker",`${k}.speaker`,"speaker needs actor_id or kind");else"parenthetical"in E&&o("parenthetical_type",`${k}.parenthetical`,"parenthetical only belongs to speaking actions"),"speaker"in E&&o("speaker_type",`${k}.speaker`,"speaker only belongs to speaking actions");if(E.transition_prompt!==void 0){let R=E.transition_prompt;!Xe(R)||!ae(R.target)||!ae(R.process)||R.process===""||!ae(R.contrast)||R.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(R.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${R.target} not found`)}}),Pr(h.actions,`${y}.actions`,o)})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}function ao(e,t=new Set,n){try{return n?Oi(e,t,n):Oi(e,t)}catch(o){throw o?.code!==xa?o:new x(`Could not generate an unused ${e} ID.`,{exitCode:b,errorCode:"ID_SPACE_RETRY_EXHAUSTED",hint:"Retry the command. If this persists, inspect the configured ID generator."})}}function ye(e,t=[]){throw new x(e,{exitCode:b,errorCode:"CREATIVE_DRAFT_INVALID",hint:"Use the readable creative draft schema; do not include Script IDs or .scriptctl syntax.",data:{actual:t.map(String)}})}function gn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Q(e,t=""){return String(e??"").replace(/\s+/gu," ").trim()||t}function Eh(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&ye(`${t} must be a positive integer.`,[e]),n}function xh(e){return e===void 0?{}:(gn(e)||ye("Action extensions must be an object."),structuredClone(e))}function Sh(e){let t=new Set;for(let n of e.actors){t.add(n.actor_id);for(let o of n.states)t.add(o.state_id)}for(let n of e.locations){t.add(n.location_id);for(let o of n.states)t.add(o.state_id)}for(let n of e.props){t.add(n.prop_id);for(let o of n.states)t.add(o.state_id)}for(let n of e.episodes){t.add(n.episode_id);for(let o of n.scenes){t.add(o.scene_id);for(let i of o.actions)t.add(i.action_id)}}return t}function Pn(e,t,n){for(let o=0;o<128;o+=1){let i=$p.createHash("sha256").update(`${e}:${t}:${o}`).digest(),r="";for(let c=0;c<6;c+=1)r+=Do[i[c]%Do.length];let s=`${Go[e]}${r}`;if(!n.has(s))return n.add(s),s}ye(`Could not allocate a stable ${e} ID.`)}function Ih(e){let t=Q(e).match(/^(\d+):([0-5]\d)(?:\.(\d{1,3}))?$/u);return t?(Number(t[1])*60+Number(t[2]))*1e3+Number((t[3]??"").padEnd(3,"0")):null}function Ah(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function kh(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function bh(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(Ih(n.extend?.timestamp)??t)+kh(n);return t}function Dp(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(gn))&&ye("Asset variants must be an array of readable objects."),e)}function vh(e,t){let n=e.assets;if(n===void 0)return[];gn(n)||ye("assets must be an object.");let o=n[t];return o===void 0?[]:((!Array.isArray(o)||!o.every(gn))&&ye(`assets.${t} must be an array.`),o)}function Oh(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function Rh(e,t){return e[t]}function Nh(e,t){return[Oh(e,t),...t.aliases??[]].map(Ze)}function Gp(e,t,n){let o=Ze(n);return vh(e,t).find(i=>[i.name,...Array.isArray(i.aliases)?i.aliases:[]].map(r=>Ze(Q(r))).includes(o))??null}function Bp(e,t){if(!e)return null;let n=Ze(t);return Dp(e.variants).find(o=>{let i=Ze(Q(o.name));return i===n||["default","\u9ED8\u8BA4"].includes(n)&&["default","\u9ED8\u8BA4"].includes(i)})??null}function Jp(e,t,n){let o=Bp(e,n),i=Q(o?.description);return(!o||!i)&&ye(`${t}/${n} is a new variant and requires a readable assets declaration with a self-contained description.`),o}function Mh(e,t){let n=Q(t?.name);return n&&!["default","\u9ED8\u8BA4"].includes(Ze(n))?n:e==="actors"?"\u57FA\u7840\u9020\u578B":e==="locations"?"\u5E38\u89C4\u5E03\u7F6E":"\u57FA\u7840\u5916\u89C2"}function Lh(e,t,n,o,i,r){let s=Gp(t,n,o);s||ye(`${o} is not an existing ${n} asset and has no readable declaration.`);let c=Q(s.name,o),a=Dp(s.variants),d=Bp(s,"\u9ED8\u8BA4")??a[0]??null;n==="actors"&&!Q(s.description)&&ye(`${c} requires an identity description separate from its appearance variants.`),n==="actors"&&!Q(d?.description)&&ye(`${c} requires its first variant to provide a self-contained base appearance description.`);let p=[{state_id:"default",state_name:Mh(n,d),description:Q(d?.description,Q(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let m=Q(u.name);if(u===d||!m||["default","\u9ED8\u8BA4"].includes(Ze(m)))continue;let g=Pn("state",`${n}:${c}:${m}`,i);p.push({state_id:g,state_name:m,description:Q(Jp(s,c,m).description)}),r.states.push(`${c}/${m}`)}let l={aliases:Array.isArray(s.aliases)?[...new Set(s.aliases.map(u=>Q(u)).filter(u=>u&&u!==c))]:[],importance:s.importance==="background"?"background":"featured",description:Q(s.description,`${c}\u7684\u57FA\u7840\u8BBE\u5B9A\u3002`),states:p};if(n==="actors"){let u={...l,actor_id:Pn("actor",c,i),actor_name:c,...s.roleType==="\u4E3B\u89D2"||s.roleType==="\u914D\u89D2"?{role_type:s.roleType}:{}};return e.actors.push(u),r.actors.push(c),u}if(n==="locations"){let u={...l,location_id:Pn("location",c,i),location_name:c};return e.locations.push(u),r.locations.push(c),u}let f={...l,prop_id:Pn("prop",c,i),prop_name:c};return e.props.push(f),r.props.push(c),f}function $r(e,t,n,o,i,r){let s=Q(o);s||ye(`${n} reference requires a readable name.`);let c=Ze(s);return Rh(e,n).find(d=>Nh(n,d).includes(c))??Lh(e,t,n,s,i,r)}function Ri(e,t,n,o,i,r){let s=Q(t,"\u9ED8\u8BA4"),c=Ze(s),a=e.states.find(u=>Ze(u.state_name)===c||u.state_id==="default"&&["default","\u9ED8\u8BA4"].includes(c));if(a)return a.state_id;let d="actor_name"in e?e.actor_name:"location_name"in e?e.location_name:e.prop_name,p=Gp(n,o,d),l=Jp(p,d,s),f={state_id:Pn("state",`${d}:${s}`,i),state_name:s,description:Q(l.description)};return e.states.push(f),r.states.push(`${d}/${s}`),f.state_id}function Vp(e,t){return e===void 0?[]:((!Array.isArray(e)||!e.every(gn))&&ye(`${t} must be an array of readable references.`),e)}function Vr(e,t,n){let o=structuredClone(e);for(let i of t){let r=o.find(s=>n(s)===n(i));r?r.state_ids=[...new Set([...r.state_ids,...i.state_ids])].sort():o.push(structuredClone(i))}return o}function Th(e,t){return!!(e&&e.location?.location_id&&t.location?.location_id&&e.location.location_id===t.location.location_id&&Q(e.environment?.space)===Q(t.environment?.space)&&Q(e.environment?.time)===Q(t.environment?.time))}function Ch(e,t,n,o,i,r,s,c){(!Array.isArray(e)||e.length===0||!e.every(gn))&&ye("scene.actions must contain at least one readable Action.");let a=structuredClone(o),d=r;return{actions:e.map((l,f)=>{let u=Q(l.type,"action");["action","transition","dialogue","inner_thought"].includes(u)||ye(`Action ${f+1} has an unsupported type.`,[u]);let m=Q(l.content);m||ye(`Action ${f+1} has empty content.`);let g=Math.max(400,Math.min(8e3,Math.round(Number(l.durationMs)||Number(l.weight||1)*1200))),h=xh(l.extensions);h.timestamp=Ah(d),h.duration_ms=g,h.rewrite_duration_ms!==void 0&&(h.rewrite_duration_ms=g);let _={action_id:Pn("action",`${i}:${f+1}:${m}`,s),type:u,content:m,extend:h};if(d+=g,u==="action"||u==="transition")return _;let y=Q(l.speaker);y||ye(`Action ${f+1} requires a speaker.`);let w=y.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${w}\\s*[:\uFF1A]`,"iu").test(m)&&ye(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(m)&&ye(`Action ${f+1} wraps dialogue content in quotation marks.`);let I=Ze(y);if(["\u65C1\u767D","narrator"].includes(I))return{..._,speaker:{kind:"broadcast",label:"\u65C1\u767D"},...Q(l.parenthetical)?{parenthetical:Q(l.parenthetical)}:{}};if(["\u753B\u5916\u97F3","offscreen"].includes(I))return{..._,speaker:{kind:"offscreen",label:"\u753B\u5916\u97F3"},...Q(l.parenthetical)?{parenthetical:Q(l.parenthetical)}:{}};let E=$r(t,n,"actors",y,s,c),A=Q(l.speakerVariant),k=a.find(R=>R.actor_id===E.actor_id),D;if(A)D=Ri(E,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,D])].sort():a.push({actor_id:E.actor_id,state_ids:[D]});else if(!k){let R=Ri(E,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:E.actor_id,state_ids:[R]})}return{..._,speaker:{actor_id:E.actor_id,...D?{state_id:D}:{}},...Q(l.parenthetical)?{parenthetical:Q(l.parenthetical)}:{}}}),actorRefs:a}}function Kp(e,t){(!gn(t)||t.version!==1)&&ye("Creative draft version must be 1."),(!gn(t.episode)||!gn(t.scene))&&ye("Creative draft requires episode and scene objects.");let n=structuredClone(t),o=n.episode,i=n.scene,r=structuredClone(e),s=Sh(r),c={actors:[],locations:[],props:[],states:[]},a=Eh(o.number,"episode.number");a>r.episodes.length+1&&ye("Episodes must be composed in order.",[a]);let d=r.episodes[a-1];d?(Q(d.title)||(d.title=Q(o.title,`\u7B2C ${a} \u96C6`)),Q(d.synopsis)||(d.synopsis=Q(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`))):(d={episode_id:Pn("episode",`episode:${a}`,s),title:Q(o.title,`\u7B2C ${a} \u96C6`),synopsis:Q(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`),scenes:[]},r.episodes.push(d));let p=$r(r,n,"locations",i.location,s,c),l=Ri(p,i.locationVariant,n,"locations",s,c),f=Vp(i.actors,"scene.actors").map(S=>{let M=$r(r,n,"actors",S.name,s,c);return{actor_id:M.actor_id,state_ids:[Ri(M,S.variant,n,"actors",s,c)]}}),u=Vr([],f,S=>S.actor_id),m=Vp(i.props,"scene.props").map(S=>{let M=$r(r,n,"props",S.name,s,c);return{prop_id:M.prop_id,state_ids:[Ri(M,S.variant,n,"props",s,c)]}}),g=Vr([],m,S=>S.prop_id),h=d.scenes.at(-1),_={scene_id:Pn("scene",`episode:${a}:scene:${d.scenes.length+1}:${Q(i.title)}`,s),environment:{space:Q(i.space,"interior"),time:Q(i.time,"day")},location:{location_id:p.location_id,state_ids:[l]},actors:u,props:g,actions:[],extend:{scene_title:Q(i.title,`\u7B2C ${d.scenes.length+1} \u573A`)}},y=Q(i.boundary,"auto");["auto","new","continue"].includes(y)||ye("scene.boundary must be auto, new, or continue.");let w=Th(h,_);y==="continue"&&!w&&ye("scene.boundary=continue requires the same location, space, and time as the previous scene.");let I=y!=="new"&&w,E=I&&h?h:_,A=I?d.scenes.length:d.scenes.length+1,k=Vr(E.actors,_.actors,S=>S.actor_id),D=Ch(i.actions,r,n,k,E.scene_id,bh(d),s,c);E.actors=D.actorRefs,E.props=Vr(E.props,_.props,S=>S.prop_id),E.location&&_.location&&(E.location.state_ids=[...new Set([...E.location.state_ids,..._.location.state_ids])].sort()),E.actions.push(...D.actions),I||d.scenes.push(E);let R=Te(r);return R.ok||ye("Composed screenplay does not pass Script v4 validation.",R.errors.slice(0,12).map(S=>`${S.path}: ${S.message}`)),{script:r,validation:R,episodeNumber:a,sceneNumber:A,sceneId:E.scene_id,actionIds:D.actions.map(S=>S.action_id),joinedPreviousScene:I,created:c}}function Ge(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Zt(e,t){return e[t]===void 0||typeof e[t]=="string"}function Ia(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Ia):Ge(e)&&Object.values(e).every(Ia)}function Jo(e){return e.extend===void 0||Ge(e.extend)&&Object.values(e.extend).every(Ia)}function Aa(e){return e==="default"||C("state",e)}function Uh(e){return Ge(e)&&Aa(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&Jo(e)}function ka(e){return typeof e.importance=="string"&&Et.has(e.importance)&&typeof e.description=="string"&&(e.aliases===void 0||Array.isArray(e.aliases)&&e.aliases.every(t=>typeof t=="string"))&&Array.isArray(e.states)&&e.states.every(Uh)&&Jo(e)}function Ph(e){return Ge(e)&&C("actor",e.actor_id)&&typeof e.actor_name=="string"&&(e.role_type===void 0||typeof e.role_type=="string"&&Cn.has(e.role_type))&&ka(e)}function Vh(e){return Ge(e)&&C("location",e.location_id)&&typeof e.location_name=="string"&&ka(e)}function $h(e){return Ge(e)&&C("prop",e.prop_id)&&typeof e.prop_name=="string"&&ka(e)}function ba(e){return Array.isArray(e)&&e.every(Aa)}function Dh(e){return Ge(e)&&C("actor",e.actor_id)&&ba(e.state_ids)}function Gh(e){return Ge(e)&&C("location",e.location_id)&&ba(e.state_ids)}function Bh(e){return Ge(e)&&C("prop",e.prop_id)&&ba(e.state_ids)}function Jh(e){return C("actor",e.actor_id)&&(e.state_id===void 0||Aa(e.state_id))}function Kh(e){return typeof e.kind=="string"&&so.has(e.kind)&&Zt(e,"label")}function jh(e){return!(!Ge(e)||!C("action",e.action_id)||typeof e.type!="string"||!Ct.has(e.type)||typeof e.content!="string"||!Zt(e,"parenthetical")||!Jo(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!Ge(e.speaker)||!Jh(e.speaker)&&!Kh(e.speaker))||e.transition_prompt!==void 0&&(!Ge(e.transition_prompt)||!C("actor",e.transition_prompt.target)&&!C("location",e.transition_prompt.target)&&!C("prop",e.transition_prompt.target)||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string"))}function zh(e){return!(!Ge(e)||!C("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(Dh)||!Array.isArray(e.props)||!e.props.every(Bh)||!Array.isArray(e.actions)||!e.actions.every(jh)||!Jo(e)||e.location!==null&&!Gh(e.location)||e.environment!==void 0&&(!Ge(e.environment)||!Zt(e.environment,"space")||!Zt(e.environment,"time")))}function Hh(e){return Ge(e)&&C("episode",e.episode_id)&&Zt(e,"title")&&Zt(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(zh)&&Jo(e)}function Fh(e){return Ge(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&Zt(e,"worldview_raw")&&Zt(e,"synopsis")&&Zt(e,"logline")&&Zt(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>Ge(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(Ph)&&Array.isArray(e.locations)&&e.locations.every(Vh)&&Array.isArray(e.props)&&e.props.every($h)&&Array.isArray(e.episodes)&&e.episodes.every(Hh)&&Jo(e)}function Dr(e){let t=Te(e);if(t.ok)return e;throw new x("The local file is not a valid Script v4 document.",{exitCode:b,errorCode:"SCRIPT_V4_INVALID",hint:"Run `scriptctl validate --script-path <path>` and repair the reported v4 fields.",data:{expected:["A valid Script v4 document"],actual:t.errors.slice(0,20).map(n=>`${n.path}: ${n.message}`)}})}function Xt(e){if(Fh(e))return e;throw new x("The local file is not a structurally readable Script v4 document.",{exitCode:b,errorCode:"SCRIPT_V4_SHAPE_INVALID",hint:"Repair the local Script v4 structure, then rerun the command.",data:{expected:["Script v4 with typed assets, episodes, scenes, references, and actions"],actual:[Array.isArray(e)?"array":typeof e]}})}import*as Ni from"node:crypto";import*as Me from"node:fs";import*as St from"node:path";import Qh from"proper-lockfile";function Oa(e){if(Array.isArray(e))return e.map(Oa);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=Oa(t[o]);return n}return e}function Ue(e){let t=JSON.stringify(Oa(e));return`sha256:${Ni.createHash("sha256").update(t).digest("hex")}`}function Mi(e){return Me.existsSync(e)?`sha256:${Ni.createHash("sha256").update(Me.readFileSync(e)).digest("hex")}`:null}function Li(e,t){let n=Mi(e);if(n!==t)throw new x("The local script changed while the command was running.",{exitCode:b,errorCode:"LOCAL_SCRIPT_CHANGED",hint:"Read the latest local script and retry the command.",data:{actual:[`loadedFingerprint=${t??"<missing>"}`,`currentFingerprint=${n??"<missing>"}`,e]}})}function Ti(e){let t=St.resolve(e),n=St.join(St.dirname(t),".scriptctl"),o=St.basename(t);return{scriptPath:t,stateDir:n,metadataPath:St.join(n,`${o}.working-copy.json`),lockPath:St.join(n,o)}}async function Gr(e,t){let n=Ti(e);Me.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await Qh.lock(n.lockPath,{realpath:!1,stale:12e4,update:1e4,retries:{retries:60,factor:1,minTimeout:500,maxTimeout:500}})}catch(i){throw new x("Timed out waiting for the script file lock.",{exitCode:fe,errorCode:"WORKING_COPY_LOCK_TIMEOUT",hint:"Wait for the other scriptctl command to finish, then retry.",data:{actual:[n.scriptPath,i instanceof Error?i.message:String(i)]}})}try{return await t()}finally{await o()}}function Be(e,t){Br(e,`${JSON.stringify(t,null,2)}
|
|
123
|
+
`)}function Br(e,t){let n=St.dirname(e);Me.mkdirSync(n,{recursive:!0});let o=St.join(n,`.${St.basename(e)}.${process.pid}.${Ni.randomUUID()}.tmp`),i=Me.openSync(o,"wx");try{Me.writeFileSync(i,t,"utf-8"),Me.fsyncSync(i)}finally{Me.closeSync(i)}Me.renameSync(o,e)}function Jr(e){let t=Ti(e).metadataPath;if(!Me.existsSync(t))return null;let n;try{n=JSON.parse(Me.readFileSync(t,"utf-8"))}catch(i){throw va(t,i instanceof Error?i.message:String(i))}if(n===null||typeof n!="object"||Array.isArray(n))throw va(t,"metadata root must be an object");let o=n;if(o.schemaVersion!==1||typeof o.projectGroupNo!="string"||o.projectGroupNo.length===0||typeof o.apiBaseUrl!="string"||o.apiBaseUrl.length===0||!Number.isInteger(o.baseRevision)||Number(o.baseRevision)<0||typeof o.baseContentHash!="string"||!o.baseContentHash.startsWith("sha256:"))throw va(t,"required fields are missing or invalid");return{schemaVersion:1,projectGroupNo:o.projectGroupNo,apiBaseUrl:o.apiBaseUrl,baseRevision:Number(o.baseRevision),baseContentHash:o.baseContentHash}}function Kr(e,t){Be(Ti(e).metadataPath,t)}function va(e,t){return new x("Working copy metadata is invalid.",{exitCode:b,errorCode:"WORKING_COPY_METADATA_INVALID",hint:"Run `scriptctl checkout --discard-local` to recreate the working copy metadata.",data:{expected:["valid scriptctl working-copy metadata"],actual:[e,t]}})}function kt(e,t){let n;try{n=JSON.parse(Me.readFileSync(e,"utf-8"))}catch(i){throw new x("The local script changed while the command was running.",{exitCode:b,errorCode:"LOCAL_SCRIPT_CHANGED",hint:"Read the latest local script and re-apply the operation.",data:{actual:[e,i instanceof Error?i.message:String(i)]}})}let o=Ue(n);if(o!==t)throw new x("The local script changed while the command was running.",{exitCode:b,errorCode:"LOCAL_SCRIPT_CHANGED",hint:"Read the latest local script and re-apply the operation.",data:{actual:[`loadedHash=${t}`,`currentHash=${o}`,e]}})}function v(e){return e==null?"":String(e)}function X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function hn(e){return Array.isArray(e)}function ee(e){return Array.isArray(e)?e:[]}function Ra(e,t=[]){throw new x(e,{exitCode:G,errorCode:"CREATIVE_DRAFT_USAGE_INVALID",hint:"Run `scriptctl authoring compose <draft.json> --script-path <script.json>` and apply the returned plan digest.",data:{actual:t}})}function jp(e,t){let n=Fp.resolve(e),o;try{o=Hp.readFileSync(n)}catch{throw new x(`${t} does not exist.`,{exitCode:b,errorCode:"CREATIVE_DRAFT_SOURCE_UNAVAILABLE",data:{actual:[n]}})}try{return{path:n,bytes:o,value:JSON.parse(o.toString("utf-8"))}}catch(i){throw new x(`${t} is not valid JSON.`,{exitCode:b,errorCode:"CREATIVE_DRAFT_JSON_INVALID",data:{actual:[n,i instanceof Error?i.message:String(i)]}})}}function Qp(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"";(!n||n==="-")&&Ra("Creative draft input must be a named JSON file.",[n||"<missing>"]);let o=jp(n,"The creative draft"),i=xe(e),r=jp(i,"The target Script v4 file"),s=Xt(r.value),c=Ue(s),a=Kp(s,o.value),d=`sha256:${zp.createHash("sha256").update(o.bytes).digest("hex")}`,p={version:1,op:"compose",sourceDigest:d,baseline:c,proposed:Ue(a.script),episodeNumber:a.episodeNumber,sceneNumber:a.sceneNumber,sceneId:a.sceneId,actionIds:a.actionIds,joinedPreviousScene:a.joinedPreviousScene,created:a.created},l=`sha256:${Se(JSON.stringify(p))}`,f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&Ra("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&Ra("--plan is only valid together with --apply.",[`plan=${u}`]),f&&u!==l)throw new x("The supplied plan does not match the current draft or script baseline.",{exitCode:b,errorCode:"CREATIVE_DRAFT_PLAN_MISMATCH",hint:"Review the newly computed plan, then apply its exact digest.",data:{expected:[l],actual:[u]}});return f&&(kt(i,c),Be(i,a.script)),[{text:[`${f?"Applied":"Planned"} readable scene draft as episode ${a.episodeNumber}, scene ${a.sceneNumber}${a.joinedPreviousScene?" (joined previous scene)":""}`,`plan: ${l}`].join(`
|
|
124
|
+
`),data:{op:"compose",applied:f,source_path:o.path,source_digest:d,script_path:i,baseline:c,plan_digest:l,episode_number:a.episodeNumber,scene_number:a.sceneNumber,scene_id:a.sceneId,action_ids:a.actionIds,joined_previous_scene:a.joinedPreviousScene,created:a.created,validation:a.validation}},B]}import*as il from"node:fs";import*as rl from"node:path";var Ut={line:1,column:1};function Yh(e){let t=[];for(let n of e.actors){let o=structuredClone(n);o.states=[],t.push({declarationKind:"actor",value:o,source:Ut});for(let i of n.states)t.push(Na("actor",n.actor_id,i))}for(let n of e.locations){let o=structuredClone(n);o.states=[],t.push({declarationKind:"location",value:o,source:Ut});for(let i of n.states)t.push(Na("location",n.location_id,i))}for(let n of e.props){let o=structuredClone(n);o.states=[],t.push({declarationKind:"prop",value:o,source:Ut});for(let i of n.states)t.push(Na("prop",n.prop_id,i))}return t}function Na(e,t,n){return{declarationKind:"state",ownerKind:e,ownerId:t,value:structuredClone(n),source:Ut}}function Yp(e){let t={kind:"script",title:e.title,worldview:e.worldview,style:e.style,episodes:structuredClone(e.episodes),source:Ut};return e.worldview_raw!==void 0&&(t.worldviewRaw=e.worldview_raw),e.synopsis!==void 0&&(t.synopsis=e.synopsis),e.logline!==void 0&&(t.logline=e.logline),e.theme!==void 0&&(t.theme=e.theme),e.main_characters!==void 0&&(t.mainCharacters=structuredClone(e.main_characters)),e.extend!==void 0&&(t.extend=structuredClone(e.extend)),{version:1,declarations:Yh(e),targets:[t],targetKind:"script"}}function Ko(e,t){return{version:1,declarations:[],targets:t,targetKind:e}}function qh(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function Wh(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function ce(e,t,n){let o=[e,...t].map(qh).join("|"),i=Wh(n);return`[${o}]${i.length>0?` ${i}`:""}`}function La(e){if(Array.isArray(e))return e.map(La);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=La(e[n]);return t}return e}function yn(e){return e===void 0?[]:[ce("extensions",[],""),...Object.keys(e).sort().map(t=>ce("extend",[t],JSON.stringify(La(e[t]))))]}function Zh(e){return"actor_id"in e?e.state_id===void 0?e.actor_id:`${e.actor_id}/${e.state_id}`:e.label===void 0?e.kind:`${e.kind}:${e.label}`}function qp(e){let t=yn(e.extend);if(e.transition_prompt!==void 0&&t.push(ce("prompt",[e.transition_prompt.target,e.transition_prompt.process,e.transition_prompt.contrast],"")),e.type==="dialogue"||e.type==="inner_thought"){let o=e.type==="dialogue"?"dlg":"think",i=[Zh(e.speaker)];return e.emotion!==void 0&&i.push(e.emotion),t.push(ce(o,i,e.content)),t}let n=e.type==="action"?"act":"trans";return t.push(ce(n,e.emotion===void 0?[]:[e.emotion],e.content)),t}function Ta(e,t){let n=[...yn(e.extend),`<scene ${t}>`];if(e.environment!==void 0&&(e.environment.time!==void 0?n.push(ce("environment",[e.environment.space??"",e.environment.time],"")):e.environment.space!==void 0?n.push(ce("environment",[e.environment.space],"")):n.push(ce("environment",[],""))),e.location===null)n.push(ce("location",[],""));else{let o=[e.location.location_id];e.location.state_id!==void 0&&o.push(e.location.state_id),n.push(ce("location",o,""))}for(let o of e.actors){let i=[o.actor_id];o.state_id!==void 0&&i.push(o.state_id),n.push(ce("cast",i,""))}for(let o of e.props){let i=[o.prop_id];o.state_id!==void 0&&i.push(o.state_id),n.push(ce("prop",i,""))}n.push("","<body>");for(let o of e.actions)n.push(...qp(o));return n.push("</body>","","</scene>"),n}function Ma(e){let t=[...yn(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(ce("title",[],e.title)),e.synopsis!==void 0&&t.push(ce("synopsis",[],e.synopsis)),(e.title!==void 0||e.synopsis!==void 0)&&e.scenes.length>0&&t.push(""),e.scenes.forEach((n,o)=>{t.push(...Ta(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</episode>"),t}function Xh(e){if(e.declarationKind==="state")return ey(e.ownerKind,e.ownerId,e.value);let t=e.value,n=yn(t.extend);t.aliases!==void 0&&n.push(ce("aliases",[],""));for(let o of t.aliases??[])n.push(ce("alias",[],o));if(e.declarationKind==="actor"){let o=e.value,i=[o.actor_id,o.actor_name,o.importance];o.role_type!==void 0&&i.push(o.role_type),n.push(ce("actor",i,o.description))}else if(e.declarationKind==="location"){let o=e.value;n.push(ce("location",[o.location_id,o.location_name,o.importance],o.description))}else{let o=e.value;n.push(ce("prop",[o.prop_id,o.prop_name,o.importance],o.description))}return n}function ey(e,t,n){return[...yn(n.extend),ce("state",[`${e}:${t}`,n.state_id,n.state_name],n.description)]}function ty(e){switch(e.kind){case"script":{let t=[...yn(e.extend),"<script>"];if(t.push(ce("title",[],e.title)),t.push(ce("worldview",[],e.worldview)),e.worldviewRaw!==void 0&&t.push(ce("worldview-raw",[],e.worldviewRaw)),t.push(ce("style",[],e.style)),e.synopsis!==void 0&&t.push(ce("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(ce("logline",[],e.logline)),e.theme!==void 0&&t.push(ce("theme",[],e.theme)),e.mainCharacters!==void 0){t.push(ce("main-characters",[],""));for(let n of e.mainCharacters)t.push(ce("main-character",[n.name,n.role],""))}return e.episodes.length>0&&t.push(""),e.episodes.forEach((n,o)=>{t.push(...Ma(n)),o<e.episodes.length-1&&t.push("")}),t.push("</script>"),t}case"episode":return Ma(e.value);case"episode-span":{let t=[...yn(e.extend),`<episode-span from=${e.from} through=${e.through}>`];return e.episodes.forEach((n,o)=>{t.push(...Ma(n)),o<e.episodes.length-1&&t.push("")}),t.push("</episode-span>"),t}case"scene":return Ta(e.value,`id=${e.value.scene_id} parent=${e.parent}`);case"scene-span":{let t=[...yn(e.extend),`<scene-span parent=${e.parent} from=${e.from} through=${e.through}>`];return e.scenes.forEach((n,o)=>{t.push(...Ta(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</scene-span>"),t}case"action-span":{let t=[...yn(e.extend),`<action-span parent=${e.parent} from=${e.from} through=${e.through}>`,"<body>"];for(let n of e.actions)t.push(...qp(n));return t.push("</body>","</action-span>"),t}}}function Wp(e){let t=["<authoring version=1>",""];if(e.declarations.length>0){t.push("<create>");for(let n of e.declarations)t.push(...Xh(n));t.push("</create>","")}return e.targets.forEach((n,o)=>{t.push(...ty(n)),o<e.targets.length-1&&t.push("")}),t.push("","</authoring>"),`${t.join(`
|
|
125
|
+
`)}
|
|
126
|
+
`}function Je(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ct(e,t){return e[t]===void 0||typeof e[t]=="string"}function Ca(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Ca):Je(e)&&Object.values(e).every(Ca)}function Vn(e){return e.extend===void 0||Je(e.extend)&&Object.values(e.extend).every(Ca)}function Ua(e){return Je(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&Vn(e)}function ny(e){return Je(e)&&typeof e.actor_id=="string"&&typeof e.actor_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Et.has(e.importance)&&(e.aliases===void 0||Array.isArray(e.aliases)&&e.aliases.every(t=>typeof t=="string"))&&(e.role_type===void 0||e.role_type==="\u4E3B\u89D2"||e.role_type==="\u914D\u89D2")&&Array.isArray(e.states)&&e.states.every(Ua)&&Vn(e)}function oy(e){return Je(e)&&typeof e.location_id=="string"&&typeof e.location_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Et.has(e.importance)&&(e.aliases===void 0||Array.isArray(e.aliases)&&e.aliases.every(t=>typeof t=="string"))&&Array.isArray(e.states)&&e.states.every(Ua)&&Vn(e)}function iy(e){return Je(e)&&typeof e.prop_id=="string"&&typeof e.prop_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Et.has(e.importance)&&(e.aliases===void 0||Array.isArray(e.aliases)&&e.aliases.every(t=>typeof t=="string"))&&Array.isArray(e.states)&&e.states.every(Ua)&&Vn(e)}function ry(e){if(!Je(e)||typeof e.type!="string"||!Ct.has(e.type)||typeof e.content!="string"||!ct(e,"emotion"))return!1;if(e.speaker!==void 0){if(!Je(e.speaker))return!1;if(typeof e.speaker.actor_id=="string"){if(!ct(e.speaker,"state_id"))return!1}else if(typeof e.speaker.kind=="string"){if(!so.has(e.speaker.kind)||!ct(e.speaker,"label"))return!1}else return!1}return e.transition_prompt!==void 0&&(!Je(e.transition_prompt)||typeof e.transition_prompt.target!="string"||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string")?!1:Vn(e)}function sy(e){return!Je(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(ry)||!e.actors.every(t=>Je(t)&&typeof t.actor_id=="string"&&ct(t,"state_id"))||!e.props.every(t=>Je(t)&&typeof t.prop_id=="string"&&ct(t,"state_id"))||e.location!==null&&(!Je(e.location)||typeof e.location.location_id!="string"||!ct(e.location,"state_id"))||e.environment!==void 0&&(!Je(e.environment)||!ct(e.environment,"space")||!ct(e.environment,"time"))?!1:Vn(e)}function ay(e){return Je(e)&&typeof e.episode_id=="string"&&ct(e,"title")&&ct(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(sy)&&Vn(e)}function cy(e){return Je(e)&&e.version===3&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&ct(e,"worldview_raw")&&ct(e,"synopsis")&&ct(e,"logline")&&ct(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>Je(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(ny)&&Array.isArray(e.locations)&&e.locations.every(oy)&&Array.isArray(e.props)&&e.props.every(iy)&&Array.isArray(e.episodes)&&e.episodes.every(ay)&&Vn(e)}function It(e){if(cy(e))return e;throw new x("The local file is not a structurally readable Script v3 document.",{exitCode:b,errorCode:"SCRIPT_V3_SHAPE_INVALID",hint:"Repair the local Script v3 structure, then rerun authoring.",data:{expected:["Script v3 with typed assets, episodes, scenes, and actions"],actual:[Array.isArray(e)?"array":typeof e]}})}var Pa=[3,4],dy={3:{version:3,require:It,requireStructurallyReadable:It,validate:at},4:{version:4,require:Dr,requireStructurallyReadable:Xt,validate:Te}};function $n(e){return typeof e=="number"&&Pa.some(t=>t===e)}function co(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new x("script.json must be an object with an explicit version.",{exitCode:b,errorCode:"SCRIPT_VERSION_MISSING",data:{expected:["version: 3 or version: 4"],actual:[Array.isArray(e)?"array":typeof e]}});let t=e.version;if($n(t))return t;throw new x("script.json must declare version 3 or version 4.",{exitCode:b,errorCode:t===void 0?"SCRIPT_VERSION_MISSING":"SCRIPT_VERSION_UNSUPPORTED",hint:"Use an explicit supported script version; scriptctl does not infer a version from document shape.",data:{expected:["version: 3 or version: 4"],actual:[String(t)]}})}function Va(e){return dy[co(e)]}function jr(e){return Va(e).require(e)}function zr(e){return Va(e).requireStructurallyReadable(e)}function Ci(e){return Va(e).validate(e)}function Hr(e){throw new x("Use a bare typed v4 ID or asset/state address.",{exitCode:G,errorCode:"V4_ADDRESS_INVALID",data:{expected:["ep\u2026 | scn\u2026 | ac\u2026 | act\u2026 | loc\u2026 | prp\u2026 | asset_id/state_id"],actual:[e||"<empty>"]}})}function Ui(e){let t=typeof e=="string"?e.trim():"",n=t.indexOf("/");if(n>=0){n!==t.lastIndexOf("/")&&Hr(t);let o=t.slice(0,n),i=t.slice(n+1);return i!=="default"&&!C("state",i)&&Hr(t),C("actor",o)?{kind:"state",assetKind:"actor",assetId:o,stateId:i}:C("location",o)?{kind:"state",assetKind:"location",assetId:o,stateId:i}:C("prop",o)?{kind:"state",assetKind:"prop",assetId:o,stateId:i}:Hr(t)}return C("episode",t)?{kind:"episode",id:t}:C("scene",t)?{kind:"scene",id:t}:C("action",t)?{kind:"action",id:t}:C("actor",t)?{kind:"asset",assetKind:"actor",id:t}:C("location",t)?{kind:"asset",assetKind:"location",id:t}:C("prop",t)?{kind:"asset",assetKind:"prop",id:t}:Hr(t)}function po(e){return e.episodes.map((t,n)=>({episode:t,episodeIndex:n}))}function _n(e){let t=[],n=0;return e.episodes.forEach((o,i)=>{o.scenes.forEach((r,s)=>{t.push({episode:o,episodeIndex:i,scene:r,sceneIndex:s,globalSceneIndex:n}),n++})}),t}function lo(e){let t=[],n=0,o=0;return e.episodes.forEach((i,r)=>{i.scenes.forEach((s,c)=>{s.actions.forEach((a,d)=>{t.push({episode:i,episodeIndex:r,scene:s,sceneIndex:c,globalSceneIndex:n,action:a,actionIndex:d,globalActionIndex:o}),o++}),n++})}),t}function en(e,t){return po(e).find(n=>n.episode.episode_id===t)??null}function wn(e,t){return _n(e).find(n=>n.scene.scene_id===t)??null}function Dn(e,t){throw new x(t,{exitCode:G,errorCode:"ORDINAL_ANCHOR_INVALID",data:{expected:["@ep:N | @ep:N/scn:N | @ep:N/scn:N/ac:N | @scn:N | @scn:N/ac:N | @ac:N"],actual:[e]}})}function tn(e,t){return/^[1-9]\d*$/.test(e)||Dn(t,"Ordinal positions are 1-based positive integers."),Number(e)}function Fr(e,t){let n=/^@ep:(\d+)$/.exec(t);if(n){let o=po(e)[tn(n[1],t)-1];return o||Dn(t,"Episode ordinal is outside the current script."),{kind:"episode",id:o.episode.episode_id}}if(n=/^@ep:(\d+)\/scn:(\d+)$/.exec(t),n){let o=po(e)[tn(n[1],t)-1],i=o?.episode.scenes[tn(n[2],t)-1];return(!o||!i)&&Dn(t,"Episode-local scene ordinal is outside the current script."),{kind:"scene",id:i.scene_id}}if(n=/^@ep:(\d+)\/scn:(\d+)\/ac:(\d+)$/.exec(t),n){let o=po(e)[tn(n[1],t)-1],i=o?.episode.scenes[tn(n[2],t)-1],r=i?.actions[tn(n[3],t)-1];return(!o||!i||!r)&&Dn(t,"Episode-local action ordinal is outside the current script."),{kind:"action",id:r.action_id}}if(n=/^@scn:(\d+)$/.exec(t),n){let o=_n(e)[tn(n[1],t)-1];return o||Dn(t,"Global scene ordinal is outside the current script."),{kind:"scene",id:o.scene.scene_id}}if(n=/^@scn:(\d+)\/ac:(\d+)$/.exec(t),n){let o=_n(e)[tn(n[1],t)-1],i=o?.scene.actions[tn(n[2],t)-1];return(!o||!i)&&Dn(t,"Scene-local action ordinal is outside the current script."),{kind:"action",id:i.action_id}}if(n=/^@ac:(\d+)$/.exec(t),n){let o=lo(e)[tn(n[1],t)-1];return o||Dn(t,"Global action ordinal is outside the current script."),{kind:"action",id:o.action.action_id}}return Dn(t,"Ordinal anchor syntax is not supported.")}function jo(e,t){throw new x(e,{exitCode:G,errorCode:"V4_SELECTOR_INVALID",data:{expected:["typed v4 ID or same-kind inclusive range; comma joins regions"],actual:[t]}})}function Zp(e,t){return e.kind==="episode"||e.kind==="scene"||e.kind==="action"?e.kind:jo("Asset and state addresses are not narrative range anchors.",t)}function Xp(e){return e.kind==="state"?`${e.assetId}/${e.stateId}`:e.id}function el(e,t,n){return t.startsWith("@")?(n||jo("Ordinal anchors are query-only.",t),Fr(e,t)):Ui(t)}function py(e,t,n,o){let i=e.indexOf(t),r=e.indexOf(n);(i<0||r<0)&&jo("Range endpoint does not exist in the current script.",o);let s=Math.min(i,r),c=Math.max(i,r);return e.slice(s,c+1)}function Qr(e,t,n){let o=typeof t=="string"?t.trim():"";if(!o)return{isEmpty:!0,isWholeScript:!1,matchesEpisode:()=>!0,matchesScene:()=>!0,matchesAction:()=>!0};if(o==="*")return{isEmpty:!1,isWholeScript:!0,matchesEpisode:()=>!0,matchesScene:()=>!0,matchesAction:()=>!0};let i=po(e),r=_n(e),s=lo(e),c=i.map(h=>h.episode.episode_id),a=r.map(h=>h.scene.scene_id),d=s.map(h=>h.action.action_id),p=new Set,l=new Set,f=new Set,u=h=>{p.add(h);let _=i.find(y=>y.episode.episode_id===h)?.episode;_&&_.scenes.forEach(y=>{l.add(y.scene_id),y.actions.forEach(w=>f.add(w.action_id))})},m=h=>{l.add(h);let _=r.find(y=>y.scene.scene_id===h);_&&(p.add(_.episode.episode_id),_.scene.actions.forEach(y=>f.add(y.action_id)))},g=h=>{f.add(h);let _=s.find(y=>y.action.action_id===h);_&&(p.add(_.episode.episode_id),l.add(_.scene.scene_id))};for(let h of o.split(",")){let _=h.trim();_||jo("Selector contains an empty region.",o);let y=_.split("..");y.length>2&&jo("Selector region has too many range delimiters.",_);let w=el(e,y[0].trim(),n.allowOrdinals),I=el(e,(y[1]??y[0]).trim(),n.allowOrdinals),E=Zp(w,_);Zp(I,_)!==E&&jo("Range endpoints must have the same kind.",_);let A=Xp(w),k=Xp(I),R=py(E==="episode"?c:E==="scene"?a:d,A,k,_);E==="episode"?R.forEach(u):E==="scene"?R.forEach(m):R.forEach(g)}return{isEmpty:!1,isWholeScript:!1,matchesEpisode:h=>p.has(h),matchesScene:h=>l.has(h),matchesAction:h=>f.has(h)}}function Gn(e,t){throw new x(e,{exitCode:G,errorCode:"AUTHORING_SELECTOR_INVALID",data:{actual:t}})}function ly(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function uy(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function te(e,t,n=""){let o=[e,...t].map(ly).join("|"),i=uy(n);return`[${o}]${i?` ${i}`:""}`}function Ga(e){if(Array.isArray(e))return e.map(Ga);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Ga(e[n]);return t}return e}function Bn(e){return e===void 0?[]:[te("extensions",[]),...Object.keys(e).sort().map(t=>te("extend",[t],JSON.stringify(Ga(e[t]))))]}function fy(e){return"actor_id"in e?e.state_id===void 0?e.actor_id:`${e.actor_id}/${e.state_id}`:e.label===void 0?e.kind:`${e.kind}:${e.label}`}function tl(e){let t=Bn(e.extend);if(e.transition_prompt!==void 0&&t.push(te("prompt",[e.transition_prompt.target,e.transition_prompt.process,e.transition_prompt.contrast])),e.type==="dialogue"||e.type==="inner_thought"){let n=[e.action_id,fy(e.speaker)];"parenthetical"in e&&n.push(e.parenthetical??""),t.push(te(e.type==="dialogue"?"dlg":"think",n,e.content))}else t.push(te(e.type==="action"?"act":"trans",[e.action_id],e.content));return t}function Ba(e,t){let n=[...Bn(e.extend),`<scene ${t}>`];if(e.environment!==void 0){let o=e.environment.time===void 0?e.environment.space===void 0?[]:[e.environment.space]:[e.environment.space??"",e.environment.time];n.push(te("environment",o))}n.push(e.location===null?te("location",[]):te("location",[e.location.location_id,...e.location.state_ids]));for(let o of e.actors)n.push(te("cast",[o.actor_id,...o.state_ids]));for(let o of e.props)n.push(te("prop",[o.prop_id,...o.state_ids]));return n.push("","<body>"),e.actions.forEach(o=>n.push(...tl(o))),n.push("</body>","","</scene>"),n}function Ja(e){let t=[...Bn(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(te("title",[],e.title)),e.synopsis!==void 0&&t.push(te("synopsis",[],e.synopsis)),e.scenes.forEach((n,o)=>{(o>0||e.title!==void 0||e.synopsis!==void 0)&&t.push(""),t.push(...Ba(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function $a(e,t){return[...Bn(t.extend),te("state",[e,t.state_id,t.state_name],t.description)]}function my(e){let t=["<create>"];for(let n of e.actors){t.push(...Bn(n.extend)),n.aliases!==void 0&&(t.push(te("aliases",[])),n.aliases.forEach(i=>t.push(te("alias",[],i))));let o=[n.actor_id,n.actor_name,n.importance];n.role_type!==void 0&&o.push(n.role_type),t.push(te("actor",o,n.description)),n.states.forEach(i=>t.push(...$a(n.actor_id,i)))}for(let n of e.locations)t.push(...Bn(n.extend)),n.aliases!==void 0&&(t.push(te("aliases",[])),n.aliases.forEach(o=>t.push(te("alias",[],o)))),t.push(te("location",[n.location_id,n.location_name,n.importance],n.description)),n.states.forEach(o=>t.push(...$a(n.location_id,o)));for(let n of e.props)t.push(...Bn(n.extend)),n.aliases!==void 0&&(t.push(te("aliases",[])),n.aliases.forEach(o=>t.push(te("alias",[],o)))),t.push(te("prop",[n.prop_id,n.prop_name,n.importance],n.description)),n.states.forEach(o=>t.push(...$a(n.prop_id,o)));return t.push("</create>"),t}function gy(e){let t=[...Bn(e.extend),"<script>"];return t.push(te("title",[],e.title),te("worldview",[],e.worldview)),e.worldview_raw!==void 0&&t.push(te("worldview-raw",[],e.worldview_raw)),t.push(te("style",[],e.style)),e.synopsis!==void 0&&t.push(te("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(te("logline",[],e.logline)),e.theme!==void 0&&t.push(te("theme",[],e.theme)),e.main_characters!==void 0&&(t.push(te("main-characters",[])),e.main_characters.forEach(n=>t.push(te("main-character",[n.name,n.role])))),e.episodes.forEach(n=>t.push("",...Ja(n))),t.push("</script>"),t}function hy(e){return e.trim()||Gn("This export kind requires --in.",["<missing>"]),e.split(",").map(t=>{let n=t.trim().split("..");return n.length>2||!n[0]||n.length===2&&!n[1]?Gn("Selector region is invalid.",[t]):{left:n[0],right:n[1]??n[0]}})}function Da(e,t,n,o,i){let r=-1;return hy(i).map(s=>{let c=f=>{if(!f.startsWith("@"))return f;let u=Fr(e,f);return u.kind!==t?Gn("Selector endpoint kind does not match the export kind.",[f,t]):u.id},a=o.indexOf(c(s.left)),d=o.indexOf(c(s.right));(a<0||d<0)&&Gn("Selector endpoint was not found.",[s.left,s.right]);let p=Math.min(a,d),l=Math.max(a,d);return p<=r&&Gn("Selector regions must follow current document order without overlap.",[`${s.left}..${s.right}`]),r=l,n.slice(p,l+1)})}function nl(e,t,n){let o=["<authoring version=1>",""],i=0;if(t==="script")o.push(...my(e),"",...gy(e)),i=1;else if(t==="episodes"){let r=Qr(e,n,{allowOrdinals:!0}),s=e.episodes.filter(c=>r.matchesEpisode(c.episode_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...Ja(c))}),i=s.length}else if(t==="episode-spans"){let r=Da(e,"episode",e.episodes,e.episodes.map(s=>s.episode_id),n);for(let[s,c]of r.entries())s>0&&o.push(""),o.push(`<episode-span range=${c[0].episode_id}..${c.at(-1).episode_id}>`),c.forEach(a=>o.push(...Ja(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=Qr(e,n,{allowOrdinals:!0}),s=_n(e).filter(c=>r.matchesScene(c.scene.scene_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...Ba(c.scene,`id=${c.scene.scene_id} parent=${c.episode.episode_id}`))}),i=s.length}else if(t==="scene-spans"){let r=_n(e),s=Da(e,"scene",r,r.map(c=>c.scene.scene_id),n);for(let[c,a]of s.entries()){let d=a[0].episode.episode_id;a.every(p=>p.episode.episode_id===d)||Gn("A scene span must remain inside one episode.",[a[0].scene.scene_id,a.at(-1).scene.scene_id]),c>0&&o.push(""),o.push(`<scene-span parent=${d} range=${a[0].scene.scene_id}..${a.at(-1).scene.scene_id}>`),a.forEach(p=>o.push(...Ba(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=lo(e),s=Da(e,"action",r,r.map(c=>c.action.action_id),n);for(let[c,a]of s.entries()){let d=a[0].scene.scene_id;a.every(p=>p.scene.scene_id===d)||Gn("An action span must remain inside one scene.",[a[0].action.action_id,a.at(-1).action.action_id]),c>0&&o.push(""),o.push(`<action-span parent=${d} range=${a[0].action.action_id}..${a.at(-1).action.action_id}>`,"<body>"),a.forEach(p=>o.push(...tl(p.action))),o.push("</body>","</action-span>"),i++}}return i===0&&Gn("Selector did not match any authoring targets.",[n||"<empty>"]),o.push("","</authoring>"),{content:`${o.join(`
|
|
127
|
+
`)}
|
|
128
|
+
`,targetCount:i}}function ie(e,t,n,o,i=b){throw new x(t,{exitCode:i,errorCode:e,hint:o,data:{actual:n}})}function yy(e){let t=xe(e),n;try{n=JSON.parse(il.readFileSync(t,"utf-8"))}catch(o){ie("SCRIPT_JSON_UNAVAILABLE","The local script cannot be read as JSON.",[t,o instanceof Error?o.message:String(o)],"Provide a readable local Script v3 file.")}return zr(n)}function Pi(e){return e||ie("AUTHORING_SELECTOR_REQUIRED","This export kind requires --in.",["<missing>"],"Pass one or more comma-separated point or from..through regions.",G),e.split(",").map(t=>{let n=t.trim();n||ie("AUTHORING_SELECTOR_INVALID","Selector contains an empty region.",[e],"Remove empty comma-separated regions.",G);let o=n.indexOf("..");if(o<0)return{from:n,through:n};n.indexOf("..",o+2)>=0&&ie("AUTHORING_SELECTOR_INVALID","Selector region has more than one range delimiter.",[n],"Use point or from..through.",G);let i=n.slice(0,o),r=n.slice(o+2);return(!i||!r)&&ie("AUTHORING_SELECTOR_INVALID","Selector range endpoint is empty.",[n],"Provide both endpoints.",G),{from:i,through:r}})}function Yr(e,t,n){if(t.from==="*"&&t.through==="*")return e.length===0&&ie("AUTHORING_SELECTOR_EMPTY",`The script contains no ${n}.`,["*"],"Choose a non-empty target kind."),[0,e.length-1];(e.filter(r=>r===t.from).length>1||e.filter(r=>r===t.through).length>1)&&ie("AUTHORING_SELECTOR_AMBIGUOUS",`${n} selector endpoint is not unique.`,[t.from,t.through],"Repair duplicate stable IDs before exporting this target.");let o=e.indexOf(t.from),i=e.indexOf(t.through);return(o<0||i<0)&&ie("AUTHORING_SELECTOR_NOT_FOUND",`${n} selector endpoint was not found.`,[t.from,t.through],"Use IDs from the current local script."),o>i&&ie("AUTHORING_SELECTOR_REVERSED",`${n} selector is reversed in current document order.`,[t.from,t.through],"Put the earlier document endpoint first."),[o,i]}function sl(e,t){let n=new Set;for(let o of e){let i=t(o);n.has(i)&&ie("AUTHORING_SELECTOR_OVERLAP","Selector regions overlap or repeat a target.",[i],"Use non-overlapping regions."),n.add(i)}return e}function Vi(e,t){for(let n=1;n<e.length;n+=1){let o=e[n-1],i=e[n],r=Math.max(o.length,i.length),s=0;for(let c=0;c<r&&(s=(i[c]??0)-(o[c]??0),s===0);c+=1);s<=0&&ie("AUTHORING_SELECTOR_ORDER",`${t} selector regions are not in current document order.`,[`region=${n+1}`],"List disjoint selector regions from earlier to later document positions.")}}function _y(e,t){let n=[],o=e.episodes.map(r=>r.episode_id);for(let r of Pi(t)){let[s,c]=Yr(o,r,"episode");n.push(...e.episodes.slice(s,c+1))}sl(n,r=>r.episode_id),Vi(n.map(r=>[o.indexOf(r.episode_id)]),"Episode");let i=n.map(r=>({kind:"episode",value:structuredClone(r),source:Ut}));return Ko("episode",i)}function wy(e,t){let n=e.episodes.map(s=>s.episode_id),o=[],i=new Set,r=[];for(let s of Pi(t)){let[c,a]=Yr(n,s,"episode");for(let d=c;d<=a;d+=1)i.has(d)&&ie("AUTHORING_SELECTOR_OVERLAP","Episode span regions overlap.",[`${s.from}..${s.through}`],"Use non-overlapping regions."),i.add(d);o.push({kind:"episode-span",from:n[c],through:n[a],episodes:structuredClone(e.episodes.slice(c,a+1)),source:Ut}),r.push([c])}return Vi(r,"Episode span"),Ko("episode-span",o)}function Ey(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function Ka(e){return`${e.episodeId}/${e.scene.scene_id}`}function xy(e,t){let n=Ey(e),o=n.map(Ka),i=[];for(let s of Pi(t)){let[c,a]=Yr(o,s,"scene");i.push(...n.slice(c,a+1))}sl(i,Ka),Vi(i.map(s=>[o.indexOf(Ka(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:Ut}));return Ko("scene",r)}function ja(e){let t=/^([^/#]+)\/([^/#]+)$/.exec(e);return t||ie("AUTHORING_SELECTOR_INVALID","Scene selector endpoint must be ep/scn.",[e],"Use ep_ID/scn_ID."),{episodeId:t[1],sceneId:t[2]}}function Sy(e,t){let n=[],o=new Set,i=[];for(let r of Pi(t)){(r.from==="*"||r.through==="*")&&ie("AUTHORING_SELECTOR_INVALID","A scene span wildcard has no single parent.",["*"],"Use one explicit region per episode.");let s=ja(r.from),c=ja(r.through);s.episodeId!==c.episodeId&&ie("AUTHORING_SELECTOR_CROSS_PARENT","A scene span must remain inside one episode.",[r.from,r.through],"Split it into one region per episode.");let a=e.episodes.filter(u=>u.episode_id===s.episodeId);a.length===0&&ie("AUTHORING_SELECTOR_NOT_FOUND","Scene span parent episode was not found.",[s.episodeId],"Use an existing episode ID."),a.length>1&&ie("AUTHORING_SELECTOR_AMBIGUOUS","Scene span parent episode is not unique.",[s.episodeId],"Repair duplicate stable IDs before exporting.");let d=a[0],p=d.scenes.map(u=>u.scene_id),[l,f]=Yr(p,{from:s.sceneId,through:c.sceneId},"scene");for(let u=l;u<=f;u+=1){let m=`${d.episode_id}/${p[u]}`;o.has(m)&&ie("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[m],"Use non-overlapping regions."),o.add(m)}n.push({kind:"scene-span",parent:d.episode_id,from:p[l],through:p[f],scenes:structuredClone(d.scenes.slice(l,f+1)),source:Ut}),i.push([e.episodes.indexOf(d),l])}return Vi(i,"Scene span"),Ko("scene-span",n)}function ol(e){let t=/^([^/#]+\/[^/#]+)#(\d+)$/.exec(e);t||ie("AUTHORING_SELECTOR_INVALID","Action selector endpoint must be ep/scn#index.",[e],"Use a zero-based ep_ID/scn_ID#index address.");let n=Number(t[2]);return Number.isSafeInteger(n)||ie("AUTHORING_SELECTOR_INVALID","Action index is outside the safe integer range.",[e],"Use a zero-based safe integer index."),{parent:t[1],index:n}}function Iy(e,t){let n=[],o=new Set,i=[];for(let r of Pi(t)){(r.from==="*"||r.through==="*")&&ie("AUTHORING_SELECTOR_INVALID","An action span wildcard has no single parent.",["*"],"Use one explicit region per scene.");let s=ol(r.from),c=ol(r.through);s.parent!==c.parent&&ie("AUTHORING_SELECTOR_CROSS_PARENT","An action span must remain inside one scene.",[r.from,r.through],"Split it into one region per scene.");let a=ja(s.parent),d=e.episodes.filter(u=>u.episode_id===a.episodeId);d.length===0&&ie("AUTHORING_SELECTOR_NOT_FOUND","Action span parent episode was not found.",[a.episodeId],"Use an existing episode ID."),d.length>1&&ie("AUTHORING_SELECTOR_AMBIGUOUS","Action span parent episode is not unique.",[a.episodeId],"Repair duplicate stable IDs before exporting.");let p=d[0],l=p.scenes.filter(u=>u.scene_id===a.sceneId);l.length===0&&ie("AUTHORING_SELECTOR_NOT_FOUND","Action span parent scene was not found.",[s.parent],"Use an existing scene address."),l.length>1&&ie("AUTHORING_SELECTOR_AMBIGUOUS","Action span parent scene is not unique.",[s.parent],"Repair duplicate stable IDs before exporting.");let f=l[0];s.index>c.index&&ie("AUTHORING_SELECTOR_REVERSED","Action span is reversed.",[r.from,r.through],"Put the lower current action index first."),c.index>=f.actions.length&&ie("AUTHORING_SELECTOR_NOT_FOUND","Action span endpoint is outside the current body.",[r.through,`actions=${f.actions.length}`],"Use current zero-based action indices.");for(let u=s.index;u<=c.index;u+=1){let m=`${s.parent}#${u}`;o.has(m)&&ie("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[m],"Use non-overlapping regions."),o.add(m)}n.push({kind:"action-span",parent:s.parent,from:s.index,through:c.index,actions:structuredClone(f.actions.slice(s.index,c.index+1)),source:Ut}),i.push([e.episodes.indexOf(p),p.scenes.indexOf(f),s.index])}return Vi(i,"Action span"),Ko("action-span",n)}function al(e,t){let n=v(t.output).trim();n||ie("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",G);let o=yy(t),i=v(t.in).trim(),r=rl.resolve(n);if(o.version===4){let p=nl(Xt(o),e,i);return Br(r,p.content),[{text:`Exported ${p.targetCount} ${e} target(s) to ${r}`,data:{op:`export.${e}`,output:r,target_kind:e==="episodes"?"episode":e==="episode-spans"?"episode-span":e==="scenes"?"scene":e==="scene-spans"?"scene-span":e==="action-spans"?"action-span":"script",target_count:p.targetCount,bytes:Buffer.byteLength(p.content),script_version:4}},B]}let s=It(o),c;e==="script"?c=Yp(s):e==="episodes"?c=_y(s,i):e==="episode-spans"?c=wy(s,i):e==="scenes"?c=xy(s,i):e==="scene-spans"?c=Sy(s,i):c=Iy(s,i);let a=Wp(c);return Br(r,a),[{text:`Exported ${c.targets.length} ${e} target(s) to ${r}`,data:{op:`export.${e}`,output:r,target_kind:c.targetKind,target_count:c.targets.length,bytes:Buffer.byteLength(a),script_version:3}},B]}import*as dc from"node:crypto";import*as Bi from"node:fs";import*as Cl from"node:path";function H(e,t,n,o,i=b){throw new x(t,{exitCode:i,errorCode:e,hint:o[0],data:{actual:n}})}function re(e){return`line ${e.line}, column ${e.column}`}function qr(e){if(Array.isArray(e))return e.map(qr);if(e!==null&&typeof e=="object"){let t={};for(let[n,o]of Object.entries(e).sort(([i],[r])=>i.localeCompare(r)))t[n]=qr(o);return t}return e}function Jn(e,t){return JSON.stringify(qr(e))===JSON.stringify(qr(t))}function $i(e,t){return"actor_id"in t?t.actor_id:"location_id"in t?t.location_id:t.prop_id}function Ay(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function ky(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function by(e,t){"actor_id"in t.value?e.actors.push(t.value):"location_id"in t.value?e.locations.push(t.value):e.props.push(t.value)}function ml(e,t,n){return ky(e,t).find(o=>$i(t,o)===n)}function vy(e,t){for(let n of["actor","location","prop"]){let o=ml(e,n,t);if(o!==void 0)return{kind:n,value:o}}}function Oy(e){let t=[],n=[],o={actor:0,location:1,prop:2},i=-1,r,s=!1,c=new Set;for(let a of e){if(a.declarationKind!=="state"){s&&H("AUTHORING_DECLARATION_ORDER","Asset declarations must precede standalone state declarations.",[re(a.source)],["Move standalone states to the end of <create>."]);let p=a.declarationKind;o[p]<i&&H("AUTHORING_DECLARATION_ORDER","Asset declaration groups are out of canonical order.",[re(a.source),p],["Order asset declarations as actor, location, then prop."]),i=o[p];let l=structuredClone(a.value);l.states=[];let f={kind:p,value:l,source:a.source},u=`${p}:${$i(p,l)}`;c.has(u)&&H("AUTHORING_DECLARATION_DUPLICATE","Asset declaration is duplicated.",[re(a.source),u],["Keep one declaration per asset."]),c.add(u),t.push(f),r=f;continue}let d=`${a.ownerKind}:${a.ownerId}`;if(r!==void 0&&r.kind===a.ownerKind&&$i(r.kind,r.value)===a.ownerId){r.value.states.push(structuredClone(a.value));continue}s=!0,r=void 0,n.push({kind:a.ownerKind,ownerId:a.ownerId,value:structuredClone(a.value),source:a.source})}for(let a of t){let d=$i(a.kind,a.value);(a.value.states.length===0||a.value.states[0].state_id!=="default")&&H("AUTHORING_DEFAULT_STATE_REQUIRED","Every declared asset must be immediately followed by its states, beginning with default.",[re(a.source),`${a.kind}:${d}`],[`Add [state|${a.kind}:${d}|default|...] directly after the asset declaration.`]),a.value.states.filter(l=>l.state_id==="default").length!==1&&H("AUTHORING_DEFAULT_STATE_DUPLICATE","Every declared asset must contain exactly one default state.",[re(a.source),`${a.kind}:${d}`],["Keep exactly one default state."]);let p=a.value.aliases??[];(new Set(p).size!==p.length||p.includes(Ay(a.kind,a.value)))&&H("AUTHORING_ALIAS_INVALID","Asset aliases must be unique and must differ from the canonical name.",[re(a.source),`${a.kind}:${d}`],["Remove duplicate aliases and the canonical name from aliases."])}return{assets:t,states:n}}function Ry(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function gl(e,t){let n=Oy(t),o=Ry();for(let i of n.assets){let r=$i(i.kind,i.value),s=`${i.kind}:${r}`,c=vy(e,r);if(c!==void 0){if(c.kind===i.kind&&Jn(c.value,i.value)){o.existingAssets.push(s),o.existingStates.push(...i.value.states.map(a=>`${s}/${a.state_id}`));continue}H("AUTHORING_ASSET_CONFLICT","Create-only asset declaration conflicts with an existing asset.",[re(i.source),`${i.kind}:${r}`],["Use the existing identical definition or change it with an explicit mutation verb."])}by(e,i),o.createdAssets.push(s),o.createdStates.push(...i.value.states.map(a=>`${s}/${a.state_id}`))}for(let i of n.states){let r=ml(e,i.kind,i.ownerId);r===void 0&&H("AUTHORING_STATE_OWNER_NOT_FOUND","Standalone state owner does not exist.",[re(i.source),`${i.kind}:${i.ownerId}`],["Declare the asset before its states or use an existing asset ID."]);let s=r.states.find(a=>a.state_id===i.value.state_id);s!==void 0&&!Jn(s,i.value)&&H("AUTHORING_STATE_CONFLICT","Create-only state declaration conflicts with an existing state on the same asset.",[re(i.source),`${i.kind}:${i.ownerId}/${i.value.state_id}`],["Use an unused state ID for this asset, or reuse the identical existing state."]);let c=`${i.kind}:${i.ownerId}/${i.value.state_id}`;s===void 0?(r.states.push(i.value),o.createdStates.push(c)):o.existingStates.push(c)}return o}function cl(e){return{episodes:0,scenes:e===void 0?0:1,actions:e?.actions.length??0}}function dl(e){return{episodes:e===void 0?0:1,scenes:e?.scenes.length??0,actions:e?.scenes.reduce((t,n)=>t+n.actions.length,0)??0}}function Wr(e){return e.reduce((t,n)=>({episodes:t.episodes+1,scenes:t.scenes+n.scenes.length,actions:t.actions+n.scenes.reduce((o,i)=>o+i.actions.length,0)}),{episodes:0,scenes:0,actions:0})}function pl(e){return{episodes:0,scenes:e.length,actions:e.reduce((t,n)=>t+n.actions.length,0)}}function Di(e,t){let n=new Set(e),o=new Set(t);return{retainedIds:t.filter(i=>n.has(i)),createdIds:t.filter(i=>!n.has(i)),removedIds:e.filter(i=>!o.has(i))}}function za(e,t){let n=[];e.location!==null&&!e.location.state_id&&n.push(`location:${e.location.location_id}`);for(let o of e.actors)o.state_id||n.push(`actor:${o.actor_id}`);for(let o of e.props)o.state_id||n.push(`prop:${o.prop_id}`);n.length>0&&H("AUTHORING_SCENE_REF_UNMATERIALIZED","Every scene asset reference in an authored block must bind a state.",[re(t),...n],["Add the concrete state ID to every location, cast, and prop record."])}function Ha(e,t){for(let n of e.scenes)za(n,t)}function uo(e,t){return e.episodes.findIndex(n=>n.episode_id===t)}function Zr(e,t){return e.scenes.findIndex(n=>n.scene_id===t)}function hl(e,t,n){let o=uo(e,t);o<0&&H("AUTHORING_EPISODE_NOT_FOUND","Episode target does not exist.",[t],["Inspect episodes and use an existing parent."]);let i=Zr(e.episodes[o],n);return i<0&&H("AUTHORING_SCENE_NOT_FOUND","Scene target does not exist.",[`${t}/${n}`],["Inspect scenes and use an existing target."]),[o,i]}function Ny(e,t){let n=Math.max(e.length,t.length);for(let o=0;o<n;o+=1){let i=(e[o]??0)-(t[o]??0);if(i!==0)return i}return 0}function Gi(e,t){for(let n=1;n<e.length;n+=1)Ny(e[n-1].coord,e[n].coord)>=0&&H("AUTHORING_TARGET_ORDER",t,[re(e[n].source)],["List replace targets in current document order without duplicates."],G)}function My(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>{let c=uo(e,s.value.episode_id);return c<0&&H("AUTHORING_EPISODE_NOT_FOUND","Episode replace target does not exist.",[re(s.source),s.value.episode_id],["Use --create for a new episode or choose an existing ID."]),{coord:[c],source:s.source}});Gi(r,"Episode replace targets are not in document order.")}for(let r of n){Ha(r.value,r.source);let s=uo(e,r.value.episode_id),c=s<0?void 0:e.episodes[s];o==="create"?c!==void 0?Jn(c,r.value)||H("AUTHORING_CREATE_CONFLICT","Episode create target already exists with different content.",[re(r.source),r.value.episode_id],["Use --replace to replace it, or make the create block identical for a no-op retry."]):t.episodes.push(structuredClone(r.value)):t.episodes[s]=structuredClone(r.value),i.push({kind:"episode",address:r.value.episode_id,before:dl(c),after:dl(r.value),...Di(c?.scenes.map(a=>a.scene_id)??[],r.value.scenes.map(a=>a.scene_id)),untouchedSiblings:Math.max(0,e.episodes.length-(c===void 0?0:1))})}return i}function Ly(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>({coord:hl(e,s.parent,s.value.scene_id),source:s.source}));Gi(r,"Scene replace targets are not in document order.")}for(let r of n){za(r.value,r.source);let s=uo(e,r.parent);s<0&&H("AUTHORING_EPISODE_NOT_FOUND","Scene parent episode does not exist.",[re(r.source),r.parent],["Use an existing episode parent."]);let c=e.episodes[s],a=t.episodes[s],d=Zr(c,r.value.scene_id),p=d<0?void 0:c.scenes[d];o==="create"?p!==void 0?Jn(p,r.value)||H("AUTHORING_CREATE_CONFLICT","Scene create target already exists with different content.",[re(r.source),`${r.parent}/${r.value.scene_id}`],["Use --replace or make the create block identical for a no-op retry."]):a.scenes.push(structuredClone(r.value)):(d<0&&H("AUTHORING_SCENE_NOT_FOUND","Scene replace target does not exist.",[re(r.source),`${r.parent}/${r.value.scene_id}`],["Use --create for a new scene or choose an existing scene."]),a.scenes[d]=structuredClone(r.value)),i.push({kind:"scene",address:`${r.parent}/${r.value.scene_id}`,before:cl(p),after:cl(r.value),...Di(p===void 0?[]:[p.scene_id],[r.value.scene_id]),untouchedSiblings:Math.max(0,c.scenes.length-(p===void 0?0:1))})}return i}function Ty(e,t,n){let o=n.map(r=>{let s=uo(e,r.from),c=uo(e,r.through);(s<0||c<0)&&H("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Episode-span endpoint does not exist.",[re(r.source),`${r.from}..${r.through}`],["Use existing episode IDs as span endpoints."]),s>c&&H("AUTHORING_SPAN_REVERSED","Episode-span endpoints are reversed in current document order.",[re(r.source),`${r.from}..${r.through}`],["Swap from and through."]),r.episodes.length===0&&H("AUTHORING_EMPTY_SPAN","Episode-span replacement cannot be empty.",[re(r.source)],["Include at least one complete episode."]);for(let a of r.episodes)Ha(a,r.source);return{target:r,from:s,through:c}});Gi(o.map(r=>({coord:[r.from],source:r.target.source})),"Episode spans are not in document order.");for(let r=1;r<o.length;r+=1)o[r].from<=o[r-1].through&&H("AUTHORING_SPAN_OVERLAP","Episode spans overlap.",[re(o[r].target.source)],["Use disjoint episode spans."]);let i=o.map(({target:r,from:s,through:c})=>{let a=e.episodes.slice(s,c+1);return{kind:"episode-span",address:`${r.from}..${r.through}`,before:Wr(a),after:Wr(r.episodes),...Di(a.map(d=>d.episode_id),r.episodes.map(d=>d.episode_id)),untouchedSiblings:e.episodes.length-a.length}});for(let{target:r,from:s,through:c}of[...o].reverse())t.episodes.splice(s,c-s+1,...structuredClone(r.episodes));return i}function Cy(e,t,n){let o=n.map(s=>{let c=uo(e,s.parent);c<0&&H("AUTHORING_EPISODE_NOT_FOUND","Scene-span parent does not exist.",[re(s.source),s.parent],["Use an existing parent episode."]);let a=e.episodes[c],d=Zr(a,s.from),p=Zr(a,s.through);(d<0||p<0)&&H("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Scene-span endpoint does not exist in its parent.",[re(s.source),`${s.parent}:${s.from}..${s.through}`],["Use scene IDs from the same existing episode."]),d>p&&H("AUTHORING_SPAN_REVERSED","Scene-span endpoints are reversed in current document order.",[re(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.scenes.length===0&&H("AUTHORING_EMPTY_SPAN","Scene-span replacement cannot be empty.",[re(s.source)],["Include at least one complete scene."]);for(let l of s.scenes)za(l,s.source);return{target:s,epIndex:c,from:d,through:p}});Gi(o.map(s=>({coord:[s.epIndex,s.from],source:s.target.source})),"Scene spans are not in document order.");for(let s=1;s<o.length;s+=1){let c=o[s-1],a=o[s];a.epIndex===c.epIndex&&a.from<=c.through&&H("AUTHORING_SPAN_OVERLAP","Scene spans overlap.",[re(a.target.source)],["Use disjoint scene spans."])}let i=o.map(({target:s,epIndex:c,from:a,through:d})=>{let p=e.episodes[c].scenes.slice(a,d+1);return{kind:"scene-span",address:`${s.parent}/${s.from}..${s.parent}/${s.through}`,before:pl(p),after:pl(s.scenes),...Di(p.map(l=>l.scene_id),s.scenes.map(l=>l.scene_id)),untouchedSiblings:e.episodes[c].scenes.length-p.length}}),r=new Map;for(let s of o)r.set(s.epIndex,[...r.get(s.epIndex)??[],s]);for(let[s,c]of r)for(let{target:a,from:d,through:p}of[...c].reverse())t.episodes[s].scenes.splice(d,p-d+1,...structuredClone(a.scenes));return i}function Uy(e,t,n){let o=n.map(s=>{let c=s.parent.indexOf("/");(c<1||c===s.parent.length-1)&&H("AUTHORING_SCENE_ADDRESS_INVALID","Action-span parent is not a complete scene address.",[re(s.source),s.parent],["Use parent=ep_ID/scn_ID."]);let a=s.parent.slice(0,c),d=s.parent.slice(c+1),[p,l]=hl(e,a,d),f=e.episodes[p].scenes[l];return s.from>s.through&&H("AUTHORING_SPAN_REVERSED","Action-span endpoints are reversed.",[re(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.through>=f.actions.length&&H("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Action-span endpoint is outside the current scene body.",[re(s.source),`${s.from}..${s.through}`,`actions=${f.actions.length}`],["Use zero-based endpoints within the current body."]),s.actions.length===0&&H("AUTHORING_EMPTY_SPAN","Action-span replacement cannot be empty.",[re(s.source)],["Include at least one action."]),{target:s,epIndex:p,scIndex:l,scene:f,from:s.from,through:s.through}});Gi(o.map(s=>({coord:[s.epIndex,s.scIndex,s.from],source:s.target.source})),"Action spans are not in document order.");for(let s=1;s<o.length;s+=1){let c=o[s-1],a=o[s];a.epIndex===c.epIndex&&a.scIndex===c.scIndex&&a.from<=c.through&&H("AUTHORING_SPAN_OVERLAP","Action spans overlap.",[re(a.target.source)],["Use disjoint action spans."])}let i=o.map(({target:s,scene:c,from:a,through:d})=>({kind:"action-span",address:`${s.parent}#${a}..${s.parent}#${d}`,before:{episodes:0,scenes:0,actions:d-a+1},after:{episodes:0,scenes:0,actions:s.actions.length},retainedIds:[],createdIds:[],removedIds:[],untouchedSiblings:c.actions.length-(d-a+1)})),r=new Map;for(let s of o){let c=`${s.epIndex}/${s.scIndex}`;r.set(c,[...r.get(c)??[],s])}for(let s of r.values())for(let{target:c,epIndex:a,scIndex:d,from:p,through:l}of[...s].reverse())t.episodes[a].scenes[d].actions.splice(p,l-p+1,...structuredClone(c.actions));return i}function yl(e){let t=new Set,n=new Set;for(let o of e.episodes){t.has(o.episode_id)&&H("AUTHORING_EPISODE_ID_CONFLICT","Episode ID occurs more than once.",[o.episode_id],["Use globally unique episode IDs."]),t.add(o.episode_id);for(let i of o.scenes)n.has(i.scene_id)&&H("AUTHORING_SCENE_ID_CONFLICT","Scene ID occurs more than once.",[i.scene_id],["Use globally unique stable scene IDs."]),n.add(i.scene_id)}}function Py(e,t){let n=/^\$\.episodes\[(\d+)]/.exec(e);if(n===null)return e;let o=t.episodes[Number(n[1])];if(o===void 0)return e;let i=e.replace(n[0],`$.episodes[${o.episode_id}]`),r=/^(\$\.episodes\[\d+]\.scenes)\[(\d+)]/.exec(e);if(r!==null){let s=o.scenes[Number(r[2])];if(s!==void 0){let c=`${n[0]}.scenes[${r[2]}]`;i=e.replace(c,`$.episodes[${o.episode_id}].scenes[${s.scene_id}]`)}}return i}function ll(e,t){return`${e.code}\0${Py(e.path,t)}\0${e.message}`}function Vy(e){let t={episodeIds:new Set,sceneIds:new Set,fullEpisodeIds:new Set,fullSceneIds:new Set,actionSpans:[]},n=i=>{t.sceneIds.add(i.scene_id),t.fullSceneIds.add(i.scene_id)},o=i=>{t.episodeIds.add(i.episode_id),t.fullEpisodeIds.add(i.episode_id);for(let r of i.scenes)n(r)};for(let i of e)if(i.kind==="script")for(let r of i.episodes)o(r);else if(i.kind==="episode")o(i.value);else if(i.kind==="episode-span")for(let r of i.episodes)o(r);else if(i.kind==="scene")n(i.value);else if(i.kind==="scene-span")for(let r of i.scenes)n(r);else t.sceneIds.add(i.parent.split("/")[1]??""),t.actionSpans.push(i);return t}function $y(e,t,n){let o=[],i=new Map(e?.episodes.map(a=>[a.episode_id,a])??[]),r=new Map;for(let a of e?.episodes??[])for(let d of a.scenes)r.set(d.scene_id,d);let s=new Map(t.episodes.map(a=>[a.episode_id,a])),c=new Map;for(let a of t.episodes)for(let d of a.scenes)c.set(d.scene_id,{episodeId:a.episode_id,scene:d});for(let a of n.fullEpisodeIds){let d=s.get(a);if(d===void 0||d.scenes.length>0)continue;let p=(i.get(a)?.scenes.length??0)>0;o.push({code:p?"authoring_episode_cleared":"authoring_empty_episode",path:`$.episodes[${a}]`,message:p?`authoring replaced episode ${a} with an empty scene list`:`authored episode ${a} has no scenes`})}for(let a of n.fullSceneIds){let d=c.get(a);if(d===void 0)continue;let p=`$.episodes[${d.episodeId}].scenes[${a}]`;if(d.scene.actions.length===0){let l=(r.get(a)?.actions.length??0)>0;o.push({code:l?"authoring_scene_cleared":"authoring_empty_scene",path:p,message:l?`authoring replaced scene ${a} with an empty body`:`authored scene ${a} has an empty body`})}d.scene.actions.forEach((l,f)=>{l.content.trim()===""&&o.push({code:"authoring_empty_action_content",path:`${p}.actions[${f}]`,message:"authored action content is empty"})})}for(let a of n.actionSpans)a.actions.forEach((d,p)=>{d.content.trim()===""&&o.push({code:"authoring_empty_action_content",path:`${a.parent}#replacement[${p}]`,message:"authored action-span replacement contains an action with empty content"})});return o}function ul(e,t,n){let o=at(t),i=Vy(n),r=()=>({...o,warnings:[...o.warnings,...$y(e,t,i)]});if(o.ok||e!==null&&Jn(e,t))return r();let s=new Set(e===null?[]:at(e).errors.map(a=>ll(a,e))),c=o.errors.filter(a=>{if(!s.has(ll(a,t)))return!0;let d=/^\$\.episodes\[(\d+)]/.exec(a.path);if(!d)return!1;let p=t.episodes[Number(d[1])];if(p===void 0||i.episodeIds.has(p.episode_id))return!0;let l=/^\$\.episodes\[\d+]\.scenes\[(\d+)]/.exec(a.path),f=l===null?void 0:p.scenes[Number(l[1])];return f!==void 0&&i.sceneIds.has(f.scene_id)});return c.length>0&&H("AUTHORING_VALIDATION_FAILED","The proposed script has blocking validation errors.",c.map(a=>`${a.path}: ${a.code} ${a.message}`),["Repair the authoring source and rerun the plan."]),r()}function fl(e){let t=new Set;for(let n of e.episodes)for(let o of n.scenes){o.location!==null&&t.add(o.location.location_id);for(let i of o.actors)t.add(i.actor_id);for(let i of o.props)t.add(i.prop_id)}return[...e.actors.map(n=>n.actor_id),...e.locations.map(n=>n.location_id),...e.props.map(n=>n.prop_id)].filter(n=>!t.has(n))}function Dy(e){let t=e.targets[0];t?.kind!=="script"&&H("AUTHORING_TARGET_MODE","Script create requires exactly one script target.",[],["Use a single <script> block."],G);for(let i of t.episodes)Ha(i,t.source);let n={version:3,title:t.title,worldview:t.worldview,style:t.style,actors:[],locations:[],props:[],episodes:structuredClone(t.episodes)};t.worldviewRaw!==void 0&&(n.worldview_raw=t.worldviewRaw),t.synopsis!==void 0&&(n.synopsis=t.synopsis),t.logline!==void 0&&(n.logline=t.logline),t.theme!==void 0&&(n.theme=t.theme),t.mainCharacters!==void 0&&(n.main_characters=structuredClone(t.mainCharacters)),t.extend!==void 0&&(n.extend=structuredClone(t.extend));let o=gl(n,e.declarations);return yl(n),{script:n,declarations:o}}function _l(e,t,n){if(t.targetKind==="script"){n!=="create"&&H("AUTHORING_TARGET_MODE","Script targets support create only.",[n],["Use --create."],G);let a=Dy(t),d=a.script;e!==null&&!Jn(e,d)&&H("AUTHORING_CREATE_CONFLICT","The script target already exists with different content.",["script"],["Use episode replacement for an existing script, or write an identical script for a no-op retry."]);let p=e===null?a.declarations:{createdAssets:[],existingAssets:[...a.declarations.existingAssets,...a.declarations.createdAssets],createdStates:[],existingStates:[...a.declarations.existingStates,...a.declarations.createdStates]},l=ul(e,d,t.targets);return{script:d,changed:e===null||!Jn(e,d),declarations:p,targets:[{kind:"script",address:"global",before:e===null?{episodes:0,scenes:0,actions:0}:Wr(e.episodes),after:Wr(d.episodes),...Di(e?.episodes.map(f=>f.episode_id)??[],d.episodes.map(f=>f.episode_id)),untouchedSiblings:0}],retainedOrphanAssets:fl(d),validation:l}}e===null&&H("AUTHORING_SCRIPT_NOT_FOUND","A local Script v3 file is required for this target kind.",["<missing>"],["Create a script first or select an existing --script-path."]),(t.targetKind==="episode-span"||t.targetKind==="scene-span"||t.targetKind==="action-span")&&n!=="replace"&&H("AUTHORING_TARGET_MODE",`${t.targetKind} supports replace only.`,[n],["Use --replace."],G);let o=structuredClone(e),i=structuredClone(e),r=gl(i,t.declarations),s;switch(t.targetKind){case"episode":{let a=t.targets.flatMap(d=>d.kind==="episode"?[d]:[]);a.length!==t.targets.length&&H("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=My(o,i,a,n);break}case"scene":{let a=t.targets.flatMap(d=>d.kind==="scene"?[d]:[]);a.length!==t.targets.length&&H("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=Ly(o,i,a,n);break}case"episode-span":{let a=t.targets.flatMap(d=>d.kind==="episode-span"?[d]:[]);a.length!==t.targets.length&&H("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=Ty(o,i,a);break}case"scene-span":{let a=t.targets.flatMap(d=>d.kind==="scene-span"?[d]:[]);a.length!==t.targets.length&&H("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=Cy(o,i,a);break}case"action-span":{let a=t.targets.flatMap(d=>d.kind==="action-span"?[d]:[]);a.length!==t.targets.length&&H("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=Uy(o,i,a);break}default:H("AUTHORING_TARGET_MODE","Unsupported authoring target.",[t.targetKind],["Use a supported homogeneous target kind."])}yl(i);let c=ul(e,i,t.targets);return{script:i,changed:!Jn(e,i),declarations:r,targets:s,retainedOrphanAssets:fl(i),validation:c}}function U(e,t,n,o){return new x(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",hint:o,data:{actual:[`line ${t.line}, column ${t.column}: ${n}`]}})}function Fa(e,t,n){let o="";for(let i=0;i<e.length;i+=1){let r=e[i];if(r!=="\\"){o+=r;continue}let s=e[i+1];if(s===void 0)throw U("Trailing escape is invalid.",{line:t.line,column:t.column+i},e,"Escape a supported character or remove the trailing backslash.");if(s==="\\"||s==="n"||n&&(s==="|"||s==="]")){o+=s==="n"?`
|
|
129
|
+
`:s,i+=1;continue}throw U("Unknown escape sequence.",{line:t.line,column:t.column+i},`\\${s}`,n?"Use only \\|, \\], \\\\, or \\n in a header.":"Use only \\\\ or \\n in record content.")}return o}function zo(e,t){let n={line:t,column:Math.max(1,e.indexOf("[")+1)},o=e.trimStart();if(!o.startsWith("["))throw U("Expected a bracket record.",n,e,"Start the semantic line with a known [type] record.");let i=-1,r=!1;for(let m=1;m<o.length;m+=1){let g=o[m];if(r){r=!1;continue}if(g==="\\"){r=!0;continue}if(g==="]"){i=m;break}}if(i<0)throw U("Bracket record is not closed.",n,e,"Add the closing ].");let s=o.slice(1,i),c=[],a="";r=!1;for(let m=0;m<s.length;m+=1){let g=s[m];r?(a+=`\\${g}`,r=!1):g==="\\"?r=!0:g==="|"?(c.push(a),a=""):a+=g}r&&(a+="\\"),c.push(a);let[d,...p]=c,l=Fa(d??"",n,!0);if(!l)throw U("Record type is empty.",n,e,"Use a known record type.");let f=o.slice(i+1),u=f.startsWith(" ")?f.slice(1):f;return{type:l,slots:p.map(m=>Fa(m,n,!0)),content:Fa(u,{line:t,column:i+2},!1),source:n}}function dt(){return{extend:{},extendPresent:!1,aliases:[],aliasesPresent:!1,phase:"extend"}}function En(e){return e.extendPresent||e.aliasesPresent||e.prompt!==void 0}function pt(e){return e.extendPresent?e.extend:void 0}function Qa(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Qa):typeof e!="object"?!1:Object.values(e).every(Qa)}function Ya(e){if(Array.isArray(e))return e.map(Ya);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Ya(e[n]);return t}return e}function wl(e){return e==="featured"||e==="background"}function Gy(e){return e==="\u4E3B\u89D2"||e==="\u914D\u89D2"}function By(e){return e==="system"||e==="broadcast"||e==="offscreen"||e==="group"}function Jy(e){return e==="actor"||e==="location"||e==="prop"}function El(e,t,n,o){if(!/^\d+$/.test(e))throw U(`${n} must be an integer.`,t,e||"<empty>",`Use ${o?"a non-negative":"a positive"} integer.`);let i=Number(e);if(!Number.isSafeInteger(i)||(o?i<0:i<1))throw U(`${n} is out of range.`,t,e,`Use ${o?"a non-negative":"a positive"} safe integer.`);return i}function Ky(e,t){let n=e.trim();if(!n.startsWith("<"))return null;let o={line:t,column:e.indexOf("<")+1},i=/^<\/([a-z-]+)>$/.exec(n);if(i)return{name:i[1],closing:!0,attrs:new Map,source:o};let r=/^<([a-z-]+)(?: ([^>]+))?>$/.exec(n);if(!r)throw U("Block tag syntax is invalid.",o,e,"Use <name key=value> or </name> on its own line.");let s=new Map,c=r[2]??"";if(c)for(let a of c.split(" ")){if(!a)throw U("Block attributes must use one space separators.",o,e,"Use canonical key=value attributes separated by one space.");let d=/^([a-z]+)=([A-Za-z0-9_./#:-]+)$/.exec(a);if(!d)throw U("Block attribute syntax is invalid.",o,a,"Use unquoted canonical key=value attributes.");if(s.has(d[1]))throw U("Block attribute is duplicated.",o,d[1],"Keep exactly one value for each attribute.");s.set(d[1],d[2])}return{name:r[1],closing:!1,attrs:s,source:o}}function nn(e,t,n=[]){let o=new Set([...t,...n]),i=[...e.attrs.keys()].filter(s=>!o.has(s)),r=t.filter(s=>!e.attrs.has(s));if(i.length>0||r.length>0)throw U(`Attributes for <${e.name}> are invalid.`,e.source,`missing=${r.join(",")||"-"} unknown=${i.join(",")||"-"}`,`Use ${[...t,...n].map(s=>`${s}=...`).join(" ")}.`)}function jy(e,t){if(!e)throw U("Speaker is required.",t,"<empty>","Use act_ID[/state_ID] or system|broadcast|offscreen|group[:label].");let n=e.indexOf("/"),o=n>=0?e.slice(0,n):e;if(/^act_[A-Za-z0-9_-]+$/.test(o)){if(n<0)return{actor_id:o};let s=e.slice(n+1);if(!s||s.includes("/"))throw U("Actor speaker state is invalid.",t,e,"Use act_ID/state_ID.");return{actor_id:o,state_id:s}}let i=e.indexOf(":"),r=i>=0?e.slice(0,i):e;if(!so.has(r)||!By(r))throw U("Speaker kind is invalid.",t,e,"Use an actor ID or system, broadcast, offscreen, or group.");return i<0?{kind:r}:{kind:r,label:e.slice(i+1)}}function zy(e,t){let o={act:"action",dlg:"dialogue",think:"inner_thought",trans:"transition"}[e.type];if(o===void 0||!Ct.has(o))throw U("Body record type is invalid.",e.source,e.type,"Use [act], [dlg], [think], or [trans].");let i={type:o,content:e.content};if(o==="dialogue"||o==="inner_thought"){if(e.slots.length<1||e.slots.length>2)throw U("Speaker record slots are invalid.",e.source,e.slots.join("|"),`Use [${e.type}|speaker|emotion?].`);i.speaker=jy(e.slots[0],e.source),e.slots.length===2&&(i.emotion=e.slots[1])}else{if(e.slots.length>1)throw U("Body record slots are invalid.",e.source,e.slots.join("|"),`Use [${e.type}|emotion?].`);e.slots.length===1&&(i.emotion=e.slots[0])}let r=pt(t);if(r!==void 0&&(i.extend=r),t.aliasesPresent)throw U("Alias cannot modify an action.",t.source??e.source,t.aliases.join(","),"Use [alias] only before an asset declaration.");return t.prompt!==void 0&&(i.transition_prompt=t.prompt),i}var qa=class{lines;index=0;constructor(t){this.lines=t.replace(/\r\n?/g,`
|
|
130
|
+
`).split(`
|
|
131
|
+
`)}parse(){this.skipBlank();let t=this.takeOpen("authoring");if(nn(t,["version"]),t.attrs.get("version")!=="1")throw U("Authoring version is unsupported.",t.source,t.attrs.get("version")??"<missing>","Use <authoring version=1>.");let n=[],o=[],i=!1,r=dt();for(;;){if(this.skipBlank(),this.peekClose("authoring")){En(r)&&this.throwDangling(r),this.takeClose("authoring");break}let a=this.peekSemantic();if(a===null)throw this.eofError("authoring");if(a.record?.type==="extensions"||a.record?.type==="extend"){r=this.addModifier(r,this.takeRecord());continue}if(a.tag?.name==="create"&&!a.tag.closing){if(i)throw U("<create> must precede every target.",a.tag.source,"<create>","Move the single <create> block before the targets.");En(r)&&this.throwUnsupportedModifiers(r,"create"),n.push(...this.parseCreate()),i=!0;continue}i=!0,o.push(this.parseTarget(r)),r=dt()}if(this.skipBlank(),this.index<this.lines.length){let a={line:this.index+1,column:1};throw U("Content exists after </authoring>.",a,this.lines[this.index],"Remove content outside the root block.")}if(o.length===0)throw U("Authoring file has no target.",t.source,"<authoring>","Add one or more homogeneous target blocks.");let s=o[0].kind,c=o.find(a=>a.kind!==s);if(c!==void 0)throw U("Authoring targets are not homogeneous.",c.source,c.kind,`Keep only ${s} targets in this file.`);if(s==="script"&&o.length!==1)throw U("A script authoring file has exactly one target.",o[1].source,"second <script>","Keep one <script> target.");return{version:1,declarations:n,targets:o,targetKind:s}}parseCreate(){let t=this.takeOpen("create");nn(t,[]);let n=[],o=dt();for(;;){if(this.skipBlank(),this.peekClose("create"))return En(o)&&this.throwDangling(o),this.takeClose("create"),n;let i=this.takeRecord();if(i.type==="extensions"||i.type==="extend"||i.type==="aliases"||i.type==="alias"||i.type==="prompt"){o=this.addModifier(o,i);continue}if(i.type==="actor"){if(i.slots.length<3||i.slots.length>4)throw U("Actor declaration slots are invalid.",i.source,i.slots.join("|"),"Use [actor|id|name|importance|role?] description.");let[r,s,c,a]=i.slots;if(!r||!s||!c||!Et.has(c)||!wl(c))throw U("Actor declaration is invalid.",i.source,i.slots.join("|"),"Provide id, name, and featured|background importance.");if(a!==void 0&&(!Cn.has(a)||!Gy(a)))throw U("Actor role is invalid.",i.source,a,"Use \u4E3B\u89D2 or \u914D\u89D2, or omit the slot.");let d={actor_id:r,actor_name:s,importance:c,description:i.content,states:[]};a!==void 0&&(d.role_type=a),o.aliasesPresent&&(d.aliases=[...o.aliases]);let p=pt(o);p!==void 0&&(d.extend=p),o.prompt!==void 0&&this.throwUnsupportedModifiers(o,"actor"),n.push({declarationKind:"actor",value:d,source:i.source}),o=dt();continue}if(i.type==="location"||i.type==="prop"){if(i.slots.length!==3)throw U(`${i.type} declaration slots are invalid.`,i.source,i.slots.join("|"),`Use [${i.type}|id|name|importance] description.`);let[r,s,c]=i.slots;if(!r||!s||!c||!Et.has(c)||!wl(c))throw U(`${i.type} declaration is invalid.`,i.source,i.slots.join("|"),"Provide id, name, and featured|background importance.");o.prompt!==void 0&&this.throwUnsupportedModifiers(o,i.type);let a=pt(o);if(i.type==="location"){let d={location_id:r,location_name:s,importance:c,description:i.content,states:[]};o.aliasesPresent&&(d.aliases=[...o.aliases]),a!==void 0&&(d.extend=a),n.push({declarationKind:"location",value:d,source:i.source})}else{let d={prop_id:r,prop_name:s,importance:c,description:i.content,states:[]};o.aliasesPresent&&(d.aliases=[...o.aliases]),a!==void 0&&(d.extend=a),n.push({declarationKind:"prop",value:d,source:i.source})}o=dt();continue}if(i.type==="state"){if(i.slots.length!==3)throw U("State declaration slots are invalid.",i.source,i.slots.join("|"),"Use [state|kind:asset_id|state_id|state_name] description.");(o.aliasesPresent||o.prompt!==void 0)&&this.throwUnsupportedModifiers(o,"state");let[r,s,c]=i.slots,a=/^(actor|location|prop):(.+)$/.exec(r??""),d=a?.[1]??"";if(!a||!Jy(d)||!s||!c)throw U("State declaration is invalid.",i.source,i.slots.join("|"),"Use a typed owner and non-empty state ID/name.");let p={state_id:s,state_name:c,description:i.content},l=pt(o);l!==void 0&&(p.extend=l),n.push({declarationKind:"state",ownerKind:d,ownerId:a[2],value:p,source:i.source}),o=dt();continue}throw U("Record is not allowed in <create>.",i.source,i.type,"Use actor, location, prop, state, or a supported prefix modifier.")}}parseTarget(t){let n=this.peekTag();if(n===null||n.closing){let o=n?.source??{line:this.index+1,column:1};throw U("Expected a target block.",o,this.lines[this.index]??"<eof>","Add a supported target block.")}switch((t.aliasesPresent||t.prompt!==void 0)&&this.throwUnsupportedModifiers(t,n.name),n.name){case"script":return this.parseScript(t);case"episode":return{kind:"episode",value:this.parseEpisode(t),source:n.source,...pt(t)?{extend:pt(t)}:{}};case"episode-span":return this.parseEpisodeSpan(t);case"scene":return nn(n,["id","parent"]),{kind:"scene",parent:n.attrs.get("parent"),value:this.parseScene(t,!0),source:n.source,...pt(t)?{extend:pt(t)}:{}};case"scene-span":return this.parseSceneSpan(t);case"action-span":return this.parseActionSpan(t);default:throw U("Unknown target block.",n.source,n.name,"Use script, episode, episode-span, scene, scene-span, or action-span.")}}parseScript(t){let n=this.takeOpen("script");nn(n,[]);let o=["title","worldview","worldview-raw","style","synopsis","logline","theme","main-characters","main-character"],i=new Map,r=[],s=[],c=-1,a=!1,d=dt();for(;;){if(this.skipBlank(),this.peekClose("script")){En(d)&&this.throwDangling(d),this.takeClose("script");break}let m=this.peekSemantic();if(m?.record!==void 0){let g=this.takeRecord();if(g.type==="extensions"||g.type==="extend"||g.type==="aliases"||g.type==="alias"||g.type==="prompt"){d=this.addModifier(d,g);continue}En(d)&&this.throwUnsupportedModifiers(d,g.type);let h=o.indexOf(g.type),_=g.type==="main-character";if(a||h<0||h<c||!_&&i.has(g.type))throw U("Metadata record in <script> is invalid or out of order.",g.source,g.type,`Use ${o.join(", ")} in canonical order before episode blocks.`);if(c=h,g.type==="main-characters"){if(g.slots.length!==0||g.content!=="")throw U("Main characters marker is invalid.",g.source,g.content,"Use [main-characters] with no slots or content.");i.set(g.type,"")}else if(_){if(g.slots.length!==2||!g.slots[0]||!g.slots[1]||g.content!=="")throw U("Main character record is invalid.",g.source,g.slots.join("|"),"Use [main-character|name|role] with no content.");r.push({name:g.slots[0],role:g.slots[1]})}else{if(g.slots.length!==0)throw U("Script metadata record has unexpected slots.",g.source,g.slots.join("|"),`Use [${g.type}] content.`);i.set(g.type,g.content)}continue}if(m?.tag===void 0||m.tag.closing||m.tag.name!=="episode"){let g=m?.tag?.source??{line:this.index+1,column:1};throw U("Unexpected member in <script>.",g,this.lines[this.index]??"<eof>","Use metadata records followed by <episode> blocks.")}a=!0,s.push(this.parseEpisode(d)),d=dt()}let p=this.requiredMetadata(i,"title",n.source),l=this.requiredMetadata(i,"worldview",n.source),f=this.requiredMetadata(i,"style",n.source),u=pt(t);return{kind:"script",title:p,worldview:l,style:f,...i.get("worldview-raw")!==void 0?{worldviewRaw:i.get("worldview-raw")}:{},...i.get("synopsis")!==void 0?{synopsis:i.get("synopsis")}:{},...i.get("logline")!==void 0?{logline:i.get("logline")}:{},...i.get("theme")!==void 0?{theme:i.get("theme")}:{},...i.has("main-characters")||r.length>0?{mainCharacters:r}:{},episodes:s,source:n.source,...u!==void 0?{extend:u}:{}}}parseEpisode(t){let n=this.takeOpen("episode");nn(n,["id"]),(t.aliasesPresent||t.prompt!==void 0)&&this.throwUnsupportedModifiers(t,"episode");let o=this.parseMetadataAndChildren("episode",["title","synopsis"],"scene",s=>this.parseScene(s,!1)),i={episode_id:n.attrs.get("id"),scenes:o.children};o.values.has("title")&&(i.title=o.values.get("title")),o.values.has("synopsis")&&(i.synopsis=o.values.get("synopsis"));let r=pt(t);return r!==void 0&&(i.extend=r),i}parseScene(t,n){let o=this.takeOpen("scene");nn(o,n?["id","parent"]:["id"]),(t.aliasesPresent||t.prompt!==void 0)&&this.throwUnsupportedModifiers(t,"scene");let i,r,s=[],c=[],a="environment",d;for(;;){if(this.skipBlank(),this.peekClose("scene")){this.takeClose("scene");break}let f=this.peekSemantic();if(f?.tag?.name==="body"&&!f.tag.closing){if(a==="body")throw U("Scene has more than one body.",f.tag.source,"<body>","Keep exactly one <body>.");a="body",d=this.parseBody();continue}if(f?.record===void 0){let m=f?.tag?.source??{line:this.index+1,column:1};throw U("Only scene records and <body> are allowed here.",m,this.lines[this.index]??"<eof>","Use environment, location, cast, prop, then body.")}let u=this.takeRecord();if(u.type==="extensions"||u.type==="extend"||u.type==="aliases"||u.type==="alias"||u.type==="prompt")throw U("Scene prefix modifier must directly precede <scene>.",u.source,u.type,"Move the modifier before the <scene> opening tag.");if(u.type==="environment"){if(a!=="environment"||i!==void 0||u.slots.length>2)throw U("Environment record is out of order or invalid.",u.source,u.slots.join("|"),"Place at most one [environment|space?|time?] first.");i={},u.slots.length>=1&&u.slots[0]!==""&&(i.space=u.slots[0]),u.slots.length>=2&&u.slots[1]!==""&&(i.time=u.slots[1]);continue}if(u.type==="location"){if(a==="cast"||a==="prop"||a==="body"||r!==void 0||u.slots.length>2)throw U("Location record is out of order or invalid.",u.source,u.slots.join("|"),"Place exactly one [location|id?|state?] before cast.");a="location";let m=u.slots[0];m===void 0||m===""?r=null:r=u.slots.length===2?{location_id:m,state_id:u.slots[1]}:{location_id:m};continue}if(u.type==="cast"){if(r===void 0||a==="prop"||a==="body"||u.slots.length<1||u.slots.length>2||!u.slots[0])throw U("Cast record is out of order or invalid.",u.source,u.slots.join("|"),"Place [cast|actor_id|state_id?] after location and before props.");a="cast",s.push(u.slots.length===2?{actor_id:u.slots[0],state_id:u.slots[1]}:{actor_id:u.slots[0]});continue}if(u.type==="prop"){if(r===void 0||a==="body"||u.slots.length<1||u.slots.length>2||!u.slots[0])throw U("Prop record is out of order or invalid.",u.source,u.slots.join("|"),"Place [prop|prop_id|state_id?] after cast and before body.");a="prop",c.push(u.slots.length===2?{prop_id:u.slots[0],state_id:u.slots[1]}:{prop_id:u.slots[0]});continue}throw U("Record is not allowed in a scene header.",u.source,u.type,"Use environment, location, cast, prop, or body records.")}if(r===void 0)throw U("Scene location record is missing.",o.source,`<scene id=${o.attrs.get("id")}>`,"Add [location] or [location|loc_ID|state_ID].");if(d===void 0)throw U("Scene body is missing.",o.source,`<scene id=${o.attrs.get("id")}>`,"Add one <body> block.");let p={scene_id:o.attrs.get("id"),location:r,actors:s,props:c,actions:d};i!==void 0&&(p.environment=i);let l=pt(t);return l!==void 0&&(p.extend=l),p}parseBody(){let t=this.takeOpen("body");nn(t,[]);let n=[],o=dt();for(;;){if(this.skipBlank(),this.peekClose("body"))return En(o)&&this.throwDangling(o),this.takeClose("body"),n;let i=this.takeRecord();if(i.type==="extensions"||i.type==="extend"||i.type==="aliases"||i.type==="prompt"||i.type==="alias"){o=this.addModifier(o,i);continue}n.push(zy(i,o)),o=dt()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");nn(n,["from","through"]);let o=this.parseOnlyChildren("episode-span","episode",r=>this.parseEpisode(r)),i=pt(t);return{kind:"episode-span",from:n.attrs.get("from"),through:n.attrs.get("through"),episodes:o,source:n.source,...i!==void 0?{extend:i}:{}}}parseSceneSpan(t){let n=this.takeOpen("scene-span");nn(n,["parent","from","through"]);let o=this.parseOnlyChildren("scene-span","scene",r=>this.parseScene(r,!1)),i=pt(t);return{kind:"scene-span",parent:n.attrs.get("parent"),from:n.attrs.get("from"),through:n.attrs.get("through"),scenes:o,source:n.source,...i!==void 0?{extend:i}:{}}}parseActionSpan(t){let n=this.takeOpen("action-span");nn(n,["parent","from","through"]),this.skipBlank();let o=this.parseBody();this.skipBlank(),this.takeClose("action-span");let i=pt(t);return{kind:"action-span",parent:n.attrs.get("parent"),from:El(n.attrs.get("from"),n.source,"action-span from",!0),through:El(n.attrs.get("through"),n.source,"action-span through",!0),actions:o,source:n.source,...i!==void 0?{extend:i}:{}}}parseMetadataAndChildren(t,n,o,i){let r=new Map,s=[],c=-1,a=!1,d=dt();for(;;){if(this.skipBlank(),this.peekClose(t))return En(d)&&this.throwDangling(d),this.takeClose(t),{values:r,children:s};let p=this.peekSemantic();if(p?.record!==void 0){let f=this.takeRecord();if(f.type==="extensions"||f.type==="extend"||f.type==="aliases"||f.type==="alias"||f.type==="prompt"){d=this.addModifier(d,f);continue}En(d)&&this.throwUnsupportedModifiers(d,f.type);let u=n.indexOf(f.type);if(a||u<0||u<c||r.has(f.type)||f.slots.length!==0)throw U(`Metadata record in <${t}> is invalid or out of order.`,f.source,f.type,`Use each of ${n.join(", ")} at most once in canonical order before child blocks.`);c=u,r.set(f.type,f.content);continue}let l=p?.tag;if(l===void 0||l.closing||l.name!==o){let f=l?.source??{line:this.index+1,column:1};throw U(`Unexpected member in <${t}>.`,f,this.lines[this.index]??"<eof>",`Use metadata records followed by <${o}> blocks.`)}a=!0,s.push(i(d)),d=dt()}}parseOnlyChildren(t,n,o){let i=[],r=dt();for(;;){if(this.skipBlank(),this.peekClose(t))return En(r)&&this.throwDangling(r),this.takeClose(t),i;let s=this.peekSemantic();if(s?.record?.type==="extensions"||s?.record?.type==="extend"){r=this.addModifier(r,this.takeRecord());continue}if(s?.tag===void 0||s.tag.closing||s.tag.name!==n){let c=s?.tag?.source??s?.record?.source??{line:this.index+1,column:1};throw U(`Only <${n}> children are allowed in <${t}>.`,c,this.lines[this.index]??"<eof>",`Add complete <${n}> blocks.`)}i.push(o(r)),r=dt()}}addModifier(t,n){let o={extend:{...t.extend},extendPresent:t.extendPresent,aliases:[...t.aliases],aliasesPresent:t.aliasesPresent,phase:t.phase,...t.prompt!==void 0?{prompt:t.prompt}:{},source:t.source??n.source};if(n.type==="extensions"){if(o.phase!=="extend"||o.extendPresent||n.slots.length!==0||n.content!=="")throw U("Extensions marker is invalid or out of order.",n.source,n.content||"<empty>","Use one [extensions] marker before extension records.");return o.extendPresent=!0,o}if(n.type==="extend"){if(o.phase!=="extend"||n.slots.length!==1||!n.slots[0])throw U("Extend modifier is invalid or out of order.",n.source,n.slots.join("|"),"Place unique [extend|key] records first.");let i=n.slots[0];if(Object.hasOwn(o.extend,i))throw U("Extend key is duplicated.",n.source,i,"Keep one value for each extension key.");let r;try{r=JSON.parse(n.content)}catch{throw U("Extension value is not valid JSON.",n.source,n.content,"Use one canonical JSON value.")}if(!Qa(r))throw U("Extension value is not JSON-compatible.",n.source,n.content,"Use string, number, boolean, null, array, or object.");return o.extendPresent=!0,o.extend[i]=Ya(r),o}if(n.type==="aliases"){if(o.phase!=="extend"||o.aliasesPresent||n.slots.length!==0||n.content!=="")throw U("Aliases marker is invalid or out of order.",n.source,n.content||"<empty>","Use one [aliases] marker after extensions and before alias records.");return o.phase="alias",o.aliasesPresent=!0,o}if(n.type==="alias"){if(o.phase==="prompt"||n.slots.length!==0||!n.content)throw U("Alias modifier is invalid or out of order.",n.source,n.content||"<empty>","Place non-empty [alias] records after extensions and before prompt.");if(o.phase="alias",o.aliasesPresent=!0,o.aliases.includes(n.content))throw U("Alias is duplicated.",n.source,n.content,"Keep each alias once.");return o.aliases.push(n.content),o}if(n.type==="prompt"){if(o.prompt!==void 0||n.slots.length!==3||n.slots.some(i=>!i))throw U("Prompt modifier is invalid.",n.source,n.slots.join("|"),"Use one [prompt|target|process|contrast] after extensions and aliases.");if(!/^(?:actor:act_|location:loc_|prop:prp_)[A-Za-z0-9_-]+$/.test(n.slots[0]))throw U("Prompt target is invalid.",n.source,n.slots[0],"Use actor:act_ID, location:loc_ID, or prop:prp_ID.");return o.phase="prompt",o.prompt={target:n.slots[0],process:n.slots[1],contrast:n.slots[2]},o}throw U("Unknown prefix modifier.",n.source,n.type,"Use extend, alias, or prompt.")}requiredMetadata(t,n,o){let i=t.get(n);if(i===void 0)throw U(`Script ${n} record is missing.`,o,"<script>",`Add [${n}] in canonical metadata order.`);return i}peekSemantic(){if(this.skipBlank(),this.index>=this.lines.length)return null;let t=this.lines[this.index],n=Ky(t,this.index+1);if(n!==null)return{tag:n};if(t.trimStart().startsWith("["))return{record:zo(t,this.index+1)};let o={line:this.index+1,column:Math.max(1,t.search(/\S/)+1)};throw U("Semantic line is neither a tag nor a bracket record.",o,t,"Use only known tags, bracket records, or blank lines.")}peekTag(){return this.peekSemantic()?.tag??null}takeRecord(){let t=this.peekSemantic();if(t?.record===void 0){let n=t?.tag?.source??{line:this.index+1,column:1};throw U("Expected a bracket record.",n,this.lines[this.index]??"<eof>","Use the record required at this position.")}return this.index+=1,t.record}takeOpen(t){let n=this.peekTag();if(n===null||n.closing||n.name!==t){let o=n?.source??{line:this.index+1,column:1};throw U(`Expected <${t}>.`,o,this.lines[this.index]??"<eof>",`Open <${t}> here.`)}return this.index+=1,n}takeClose(t){let n=this.peekTag();if(n===null||!n.closing||n.name!==t){let o=n?.source??{line:this.index+1,column:1};throw U(`Expected </${t}>.`,o,this.lines[this.index]??"<eof>",`Close the current <${t}> block.`)}return this.index+=1,n}peekClose(t){let n=this.peekTag();return n!==null&&n.closing&&n.name===t}skipBlank(){for(;this.index<this.lines.length&&this.lines[this.index].trim()==="";)this.index+=1}eofError(t){return U(`Unexpected end of file inside <${t}>.`,{line:this.lines.length,column:1},"<eof>",`Add </${t}>.`)}throwDangling(t){throw U("Prefix modifier has no following node.",t.source??{line:this.index+1,column:1},"dangling modifier","Move it directly before a supported node.")}throwUnsupportedModifiers(t,n){throw U("Prefix modifier does not apply to this node.",t.source??{line:this.index+1,column:1},n,"Remove the unsupported modifier or move it before a supported node.")}};function xl(e){return new qa(e).parse()}function N(e,t,n){throw new x(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function ec(e,t){let n=e.trim(),o=/^<\/([a-z-]+)>$/.exec(n);if(o)return{name:o[1],closing:!0,attrs:new Map,line:t};let i=/^<([a-z-]+)(?: ([^>]+))?>$/.exec(n);if(!i)return null;let r=new Map,s=i[2]??"",c=s===""?[]:s.split(" ");c.some(a=>a==="")&&N("Tag attributes need one-space separators.",t,n);for(let a of c){let d=/^([a-z]+)=([A-Za-z0-9_./#:-]+)$/.exec(a);(!d||r.has(d[1]))&&N("Tag attributes are invalid.",t,a),r.set(d[1],d[2])}return{name:i[1],closing:!1,attrs:r,line:t}}function Le(e,t,n=[]){let o=new Set([...t,...n]),i=[...e.attrs.keys()].filter(s=>!o.has(s)),r=t.filter(s=>!e.attrs.has(s));(i.length>0||r.length>0)&&N("Tag attributes do not match the canonical grammar.",e.line,[...r.map(s=>`missing:${s}`),...i.map(s=>`unknown:${s}`)].join(","))}var tc=class{lines;index=0;constructor(t){this.lines=t.split(/\r?\n/).map((n,o)=>({raw:n.replace(/^\s+/,""),line:o+1})).filter(n=>n.raw.trim()!=="")}peek(){let t=this.lines[this.index];return t||N("Unexpected end of authoring file.",this.lines.at(-1)?.line??1,"<eof>"),t}take(){let t=this.peek();return this.index++,t}tag(t,n){let o=this.take(),i=ec(o.raw,o.line);return(!i||i.name!==t||i.closing!==n)&&N(`Expected ${n?"</":"<"}${t}>.`,o.line,o.raw),i}record(){let t=this.take();return zo(t.raw,t.line)}nextTag(){let t=this.peek();return ec(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?zo(t.raw,t.line):null}};function nc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(nc):typeof e=="object"&&Object.values(e).every(nc)}function fo(e){let t={},n=e.nextRecord();if(n?.type==="extensions"){e.record();let o={},i=null;for(;(n=e.nextRecord())?.type==="extend";){let r=e.record();(r.slots.length!==1||Object.hasOwn(o,r.slots[0]))&&N("extend record is invalid or duplicated.",r.source.line,r.type);let s=r.slots[0];i!==null&&i>=s&&N("extend keys must use ascending canonical order.",r.source.line,s);let c;try{c=JSON.parse(r.content)}catch{N("extend content must be JSON.",r.source.line,r.content)}nc(c)||N("extend value must be JSON-compatible.",r.source.line,r.content),o[s]=c,i=s}t.extend=o}if(n=e.nextRecord(),n?.type==="aliases"){e.record();let o=[];for(;(n=e.nextRecord())?.type==="alias";){let i=e.record();i.slots.length!==0&&N("alias takes no slots.",i.source.line,i.type),i.content===""&&N("alias must not be empty.",i.source.line,i.type),o.includes(i.content)&&N("alias must not be duplicated.",i.source.line,i.content),o.push(i.content)}t.aliases=o}if(n=e.nextRecord(),n?.type==="prompt"){let o=e.record();(o.slots.length!==3||o.slots.some(r=>r===""))&&N("prompt requires non-empty target, process, and contrast.",o.source.line,o.type);let i=o.slots[0];!C("actor",i)&&!C("location",i)&&!C("prop",i)&&N("prompt target must be an asset ID.",o.source.line,i),t.prompt={target:i,process:o.slots[1],contrast:o.slots[2]}}return t}function Wa(e,t){return e!=="featured"&&e!=="background"&&N("Importance is invalid.",t,e),e}function Hy(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&N("Role type is invalid.",t,e),e}function rc(e,t){return e==="default"||C("state",e)?e:N("State ID is invalid.",t,e)}function Fy(e){let t=e.tag("create",!1);Le(t,[]);let n=[],o=new Map,i=null,r=0,s=a=>{if(i===null)return;let d=o.get(i);(!d||d.states.length===0||d.states[0].state_id!=="default")&&N("A new asset must be followed immediately by its default state.",a,i),i=null};for(;e.nextTag()?.name!=="create"||e.nextTag()?.closing!==!0;){let a=fo(e),d=e.record();if(d.type==="actor"){r>0&&N("Create declarations are not in canonical order.",d.source.line,d.type),s(d.source.line),a.prompt!==void 0&&N("prompt cannot modify an asset.",d.source.line,d.type),(d.slots.length<3||d.slots.length>4||!C("actor",d.slots[0]))&&N("actor declaration is invalid.",d.source.line,d.type);let p=Hy(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:Wa(d.slots[2],d.source.line),description:d.content,states:[],...p===void 0?{}:{role_type:p},...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};l.aliases?.includes(l.actor_name)&&N("An alias must differ from the asset name.",d.source.line,l.actor_name),n.push({kind:"actor",value:l}),o.set(l.actor_id,l),i=l.actor_id}else if(d.type==="location"||d.type==="prop"){let p=d.type==="location"?1:2;p<r&&N("Create declarations are not in canonical order.",d.source.line,d.type),r=p,s(d.source.line),a.prompt!==void 0&&N("prompt cannot modify an asset.",d.source.line,d.type);let l=d.type;if((d.slots.length!==3||(l==="location"?!C("location",d.slots[0]):!C("prop",d.slots[0])))&&N(`${l} declaration is invalid.`,d.source.line,d.type),l==="location"){let f=d.slots[0];C("location",f)||N("location ID is invalid.",d.source.line,f);let u={location_id:f,location_name:d.slots[1],importance:Wa(d.slots[2],d.source.line),description:d.content,states:[],...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};u.aliases?.includes(u.location_name)&&N("An alias must differ from the asset name.",d.source.line,u.location_name),n.push({kind:l,value:u}),o.set(u.location_id,u),i=u.location_id}else{let f=d.slots[0];C("prop",f)||N("prop ID is invalid.",d.source.line,f);let u={prop_id:f,prop_name:d.slots[1],importance:Wa(d.slots[2],d.source.line),description:d.content,states:[],...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};u.aliases?.includes(u.prop_name)&&N("An alias must differ from the asset name.",d.source.line,u.prop_name),n.push({kind:l,value:u}),o.set(u.prop_id,u),i=u.prop_id}}else if(d.type==="state"){(d.slots.length!==3||a.aliases!==void 0||a.prompt!==void 0)&&N("state declaration is invalid.",d.source.line,d.type);let p=d.slots[0],l=o.get(p);l&&i!==p&&N("States for a new asset must immediately follow that asset.",d.source.line,p),l||(s(d.source.line),r=3);let f={state_id:rc(d.slots[1],d.source.line),state_name:d.slots[2],description:d.content,...a.extend===void 0?{}:{extend:a.extend}};l?(l.states.length===0&&f.state_id!=="default"&&N("The first state of a new asset must be default.",d.source.line,f.state_id),l.states.push(f)):n.push({kind:"state",ownerId:p,value:f})}else s(d.source.line),N("Unknown create declaration.",d.source.line,d.type)}s(e.peek().line);let c=e.tag("create",!0);return Le(c,[]),n}function Qy(e,t){let n=e.indexOf("/"),o=n<0?e:e.slice(0,n);if(C("actor",o))return n<0?{actor_id:o}:{actor_id:o,state_id:rc(e.slice(n+1),t)};let i=e.indexOf(":"),r=i<0?e:e.slice(0,i);return["system","broadcast","offscreen","group"].includes(r)?i<0?{kind:r}:{kind:r,label:e.slice(i+1)}:N("Speaker is invalid.",t,e)}function Sl(e){let t=fo(e);t.aliases!==void 0&&N("aliases cannot modify an Action.",e.peek().line,"aliases");let n=e.record();return n.type==="act"||n.type==="trans"?((n.slots.length!==1||!C("action",n.slots[0]))&&N("Narrative Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="act"?"action":"transition",content:n.content,...t.extend===void 0?{}:{extend:t.extend},...t.prompt===void 0?{}:{transition_prompt:t.prompt}}):n.type!=="dlg"&&n.type!=="think"?N("Unknown Action record.",n.source.line,n.type):((n.slots.length!==2&&n.slots.length!==3||!C("action",n.slots[0]))&&N("Speaking Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="dlg"?"dialogue":"inner_thought",speaker:Qy(n.slots[1],n.source.line),content:n.content,...n.slots.length===3?{parenthetical:n.slots[2]}:{},...t.extend===void 0?{}:{extend:t.extend},...t.prompt===void 0?{}:{transition_prompt:t.prompt}})}function Za(e,t){e.length===0&&N("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>rc(o,t));return new Set(n).size!==n.length&&N("Scene reference repeats a state.",t,n.join(",")),n.sort()}function oc(e,t,n,o){Le(t,n===void 0?["id","parent"]:["id"]);let i=t.attrs.get("id")??"";C("scene",i)||N("Scene ID is invalid.",t.line,i);let r=t.attrs.get("parent")??n;r!==void 0&&!C("episode",r)&&N("Scene parent must be an Episode ID.",t.line,r);let s,c,a=[],d=[],p=new Set,l=new Set,f=0;for(;e.nextTag()?.name!=="body";){let g=e.record(),h=g.type==="environment"?0:g.type==="location"?1:g.type==="cast"?2:g.type==="prop"?3:-1;h<f&&N("Scene records are not in canonical order.",g.source.line,g.type),f=h,g.type==="environment"?(s!==void 0&&N("Scene environment is duplicated.",g.source.line,g.type),g.slots.length>2&&N("environment has too many slots.",g.source.line,g.type),s={...g.slots[0]===void 0?{}:{space:g.slots[0]},...g.slots[1]===void 0?{}:{time:g.slots[1]}}):g.type==="location"?(c!==void 0&&N("Scene location is duplicated.",g.source.line,g.type),g.slots.length===0?c=null:(C("location",g.slots[0])||N("Location ref ID is invalid.",g.source.line,g.slots[0]),c={location_id:g.slots[0],state_ids:Za(g.slots.slice(1),g.source.line)})):g.type==="cast"?(C("actor",g.slots[0])||N("Cast ref ID is invalid.",g.source.line,g.slots[0]??""),p.has(g.slots[0])&&N("Scene repeats an actor reference.",g.source.line,g.slots[0]),p.add(g.slots[0]),a.push({actor_id:g.slots[0],state_ids:Za(g.slots.slice(1),g.source.line)})):g.type==="prop"?(C("prop",g.slots[0])||N("Prop ref ID is invalid.",g.source.line,g.slots[0]??""),l.has(g.slots[0])&&N("Scene repeats a prop reference.",g.source.line,g.slots[0]),l.add(g.slots[0]),d.push({prop_id:g.slots[0],state_ids:Za(g.slots.slice(1),g.source.line)})):N("Unknown scene header record.",g.source.line,g.type)}c===void 0&&N("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);Le(u,[]);let m=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)m.push(Sl(e));return Le(e.tag("body",!0),[]),Le(e.tag("scene",!0),[]),{...r===void 0?{}:{parent:r},value:{scene_id:i,...s===void 0?{}:{environment:s},location:c,actors:a,props:d,actions:m,...o===void 0?{}:{extend:o}}}}function ic(e,t,n){Le(t,["id"]);let o=t.attrs.get("id")??"";C("episode",o)||N("Episode ID is invalid.",t.line,o);let i,r,s=[],c=0;for(;e.nextTag()?.name!=="episode"||e.nextTag()?.closing!==!0;){let a=fo(e);(a.aliases!==void 0||a.prompt!==void 0)&&N("Invalid episode child modifier.",e.peek().line,"modifier");let d=e.nextTag();if(d?.name==="scene"&&!d.closing){c=2,e.take(),s.push(oc(e,d,o,a.extend).value);continue}a.extend!==void 0&&N("extend must precede a scene here.",e.peek().line,"extend");let p=e.record(),l=p.type==="title"?0:p.type==="synopsis"?1:-1;l<c&&N("Episode records are not in canonical order.",p.source.line,p.type),c=l,p.type==="title"?(i!==void 0&&N("Episode title is duplicated.",p.source.line,p.type),p.slots.length!==0&&N("Episode title takes no slots.",p.source.line,p.type),i=p.content):p.type==="synopsis"?(r!==void 0&&N("Episode synopsis is duplicated.",p.source.line,p.type),p.slots.length!==0&&N("Episode synopsis takes no slots.",p.source.line,p.type),r=p.content):N("Unknown episode record.",p.source.line,p.type)}return Le(e.tag("episode",!0),[]),{episode_id:o,...i===void 0?{}:{title:i},...r===void 0?{}:{synopsis:r},scenes:s,...n===void 0?{}:{extend:n}}}function Xa(e,t){let n=e.attrs.get("range")??"",o=n.split("..");return(o.length!==2||!o[0]||!o[1]||!C(t,o[0])||!C(t,o[1]))&&N(`Span range must contain two ${t} IDs.`,e.line,n),[o[0],o[1]]}function Yy(e,t,n){Le(t,[]);let o,i,r,s,c,a,d,p,l=[],f=0;for(;e.nextTag()?.name!=="script"||e.nextTag()?.closing!==!0;){let u=fo(e);(u.aliases!==void 0||u.prompt!==void 0)&&N("Invalid script child modifier.",e.peek().line,"modifier");let m=e.nextTag();if(m?.name==="episode"&&!m.closing){f=8,e.take(),l.push(ic(e,m,u.extend));continue}u.extend!==void 0&&N("extend must precede an episode here.",e.peek().line,"extend");let g=e.record(),h=g.type==="title"?0:g.type==="worldview"?1:g.type==="worldview-raw"?2:g.type==="style"?3:g.type==="synopsis"?4:g.type==="logline"?5:g.type==="theme"?6:g.type==="main-characters"||g.type==="main-character"?7:-1;h<f&&N("Script records are not in canonical order.",g.source.line,g.type),f=h,g.type!=="main-character"&&g.slots.length!==0&&N("Script metadata record takes no slots.",g.source.line,g.type),g.type==="title"?(o!==void 0&&N("Script title is duplicated.",g.source.line,g.type),o=g.content):g.type==="worldview"?(i!==void 0&&N("Script worldview is duplicated.",g.source.line,g.type),i=g.content):g.type==="worldview-raw"?(r!==void 0&&N("Script worldview-raw is duplicated.",g.source.line,g.type),r=g.content):g.type==="style"?(s!==void 0&&N("Script style is duplicated.",g.source.line,g.type),s=g.content):g.type==="synopsis"?(c!==void 0&&N("Script synopsis is duplicated.",g.source.line,g.type),c=g.content):g.type==="logline"?(a!==void 0&&N("Script logline is duplicated.",g.source.line,g.type),a=g.content):g.type==="theme"?(d!==void 0&&N("Script theme is duplicated.",g.source.line,g.type),d=g.content):g.type==="main-characters"?(p!==void 0&&N("Script main-characters is duplicated.",g.source.line,g.type),p=[]):g.type==="main-character"&&p!==void 0&&g.slots.length===2&&g.content===""?p.push({name:g.slots[0],role:g.slots[1]}):N("Unknown script record.",g.source.line,g.type)}return Le(e.tag("script",!0),[]),(o===void 0||i===void 0||s===void 0)&&N("Script target needs title, worldview, and style.",e.peek().line,"script"),{kind:"script",value:{title:o,worldview:i,style:s,episodes:l,...r===void 0?{}:{worldview_raw:r},...c===void 0?{}:{synopsis:c},...a===void 0?{}:{logline:a},...d===void 0?{}:{theme:d},...p===void 0?{}:{main_characters:p},...n===void 0?{}:{extend:n}}}}function Il(e){let t=new tc(e),n=t.tag("authoring",!1);Le(n,["version"]),n.attrs.get("version")!=="1"&&N("authoring version must be 1.",1,n.attrs.get("version")??"<missing>");let o=t.nextTag()?.name==="create"?Fy(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=fo(t);(s.aliases!==void 0||s.prompt!==void 0)&&N("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=ec(c.raw,c.line);if((!a||a.closing)&&N("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(Yy(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:ic(t,a,s.extend)});else if(a.name==="scene"){let d=oc(t,a,void 0,s.extend);d.parent||N("Top-level scene needs parent.",c.line,c.raw),i.push({kind:"scene",parent:d.parent,value:d.value})}else if(a.name==="episode-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),Le(a,["range"]);let[d,p]=Xa(a,"episode"),l=[];for(;t.nextTag()?.name!=="episode-span"||t.nextTag()?.closing!==!0;){let f=fo(t);(f.aliases!==void 0||f.prompt!==void 0)&&N("Invalid episode child modifier.",t.peek().line,"modifier");let u=t.tag("episode",!1);l.push(ic(t,u,f.extend))}Le(t.tag("episode-span",!0),[]),i.push({kind:"episode-span",from:d,through:p,values:l})}else if(a.name==="scene-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),Le(a,["parent","range"]);let[d,p]=Xa(a,"scene"),l=a.attrs.get("parent")??N("scene-span needs parent.",c.line,c.raw);C("episode",l)||N("scene-span parent must be an Episode ID.",c.line,l);let f=[];for(;t.nextTag()?.name!=="scene-span"||t.nextTag()?.closing!==!0;){let u=fo(t);(u.aliases!==void 0||u.prompt!==void 0)&&N("Invalid scene child modifier.",t.peek().line,"modifier");let m=t.tag("scene",!1);f.push(oc(t,m,l,u.extend).value)}Le(t.tag("scene-span",!0),[]),i.push({kind:"scene-span",parent:l,from:d,through:p,values:f})}else if(a.name==="action-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),Le(a,["parent","range"]);let[d,p]=Xa(a,"action"),l=a.attrs.get("parent")??N("action-span needs parent.",c.line,c.raw);C("scene",l)||N("action-span parent must be a Scene ID.",c.line,l),Le(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(Sl(t));Le(t.tag("body",!0),[]),Le(t.tag("action-span",!0),[]),i.push({kind:"action-span",parent:l,from:d,through:p,values:f})}else N("Unknown authoring target.",c.line,a.name)}Le(t.tag("authoring",!0),[]),(t.index!==t.lines.length||i.length===0)&&N("Authoring file has trailing content or no targets.",t.peek().line,"<root>");let r=i[0].kind;return i.every(s=>s.kind===r)||N("All targets must have the same kind.",1,r),{declarations:o,targets:i,targetKind:r}}function on(e){if(Array.isArray(e))return e.map(t=>on(t));if(X(e)){let t={};for(let n of Object.keys(e).sort())t[n]=on(e[n]);return t}return e}function sc(e){if(e.length===0)return[];let t={};for(let i of e){let r=v(i.severity);t[r]=(t[r]??0)+1}let n=Object.entries(t).sort(([i],[r])=>i.localeCompare(r)).map(([i,r])=>`${i}: ${r}`),o=e[0];return[n.join("; "),`first: ${o.code} - ${o.summary}`,...o.repair_hint?[`repair: ${o.repair_hint}`]:[]]}function Al(e,t){if(!(t.ok||e!==null&&_a(Te(e),t)))throw new x("The proposed document is not a valid or strictly improved Script v4.",{exitCode:b,errorCode:"AUTHORING_VALIDATION_FAILED",data:{actual:t.errors.slice(0,20).map(n=>`${n.path}: ${n.message}`)}})}function Oe(e,t){throw new x(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function cc(e){return{ids:e.map(t=>t.action_id),counts:{episodes:0,scenes:0,actions:e.length}}}function Ho(e){return{ids:e.flatMap(t=>[t.scene_id,...t.actions.map(n=>n.action_id)]),counts:{episodes:0,scenes:e.length,actions:e.reduce((t,n)=>t+n.actions.length,0)}}}function Kn(e){return{ids:e.flatMap(t=>[t.episode_id,...t.scenes.flatMap(n=>[n.scene_id,...n.actions.map(o=>o.action_id)])]),counts:{episodes:e.length,scenes:e.reduce((t,n)=>t+n.scenes.length,0),actions:e.reduce((t,n)=>t+n.scenes.reduce((o,i)=>o+i.actions.length,0),0)}}}function qy(e){return e.kind==="script"?Kn(e.value.episodes):e.kind==="episode"?Kn([e.value]):e.kind==="episode-span"?Kn(e.values):e.kind==="scene"?Ho([e.value]):e.kind==="scene-span"?Ho(e.values):cc(e.values)}function Wy(e){return{actors:e.filter(t=>t.kind==="actor").map(t=>structuredClone(t.value)),locations:e.filter(t=>t.kind==="location").map(t=>structuredClone(t.value)),props:e.filter(t=>t.kind==="prop").map(t=>structuredClone(t.value))}}function ac(e,t){return JSON.stringify(on(e))===JSON.stringify(on(t))}function kl(e,t){let n=new Set(e===null?[]:[...e.actors.map(d=>d.actor_id),...e.locations.map(d=>d.location_id),...e.props.map(d=>d.prop_id)]),o=new Set(e===null?[]:[...e.actors.flatMap(d=>d.states.map(p=>`${d.actor_id}/${p.state_id}`)),...e.locations.flatMap(d=>d.states.map(p=>`${d.location_id}/${p.state_id}`)),...e.props.flatMap(d=>d.states.map(p=>`${d.prop_id}/${p.state_id}`))]),i=[],r=[],s=[],c=[],a=d=>{(o.has(d)?c:s).push(d)};for(let d of t){if(d.kind==="state"){n.has(d.ownerId)&&r.push(d.ownerId),a(`${d.ownerId}/${d.value.state_id}`);continue}let p=d.kind==="actor"?d.value.actor_id:d.kind==="location"?d.value.location_id:d.value.prop_id;(n.has(p)?r:i).push(p),d.value.states.forEach(l=>{a(`${p}/${l.state_id}`)})}return{createdAssets:i,existingAssets:[...new Set(r)],createdStates:s,existingStates:c}}function bl(e){let t=new Set;for(let n of e.episodes)for(let o of n.scenes)o.location&&t.add(o.location.location_id),o.actors.forEach(i=>t.add(i.actor_id)),o.props.forEach(i=>t.add(i.prop_id)),o.actions.forEach(i=>{i.transition_prompt&&t.add(i.transition_prompt.target)});return[...e.actors.map(n=>n.actor_id),...e.locations.map(n=>n.location_id),...e.props.map(n=>n.prop_id)].filter(n=>!t.has(n))}function vl(e){return[...e.actors.flatMap(t=>[t.actor_id,...t.states.map(n=>`${t.actor_id}/${n.state_id}`)]),...e.locations.flatMap(t=>[t.location_id,...t.states.map(n=>`${t.location_id}/${n.state_id}`)]),...e.props.flatMap(t=>[t.prop_id,...t.states.map(n=>`${t.prop_id}/${n.state_id}`)]),...e.episodes.flatMap(t=>[t.episode_id,...t.scenes.flatMap(n=>[n.scene_id,...n.actions.map(o=>o.action_id)])])]}function Ol(e,t){let n=e===null?[]:vl(e),o=vl(t),i=new Set(n),r=new Set(o);return{createdIds:o.filter(s=>!i.has(s)),removedIds:n.filter(s=>!r.has(s)),retainedIds:n.filter(s=>r.has(s))}}function Zy(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Oe("Declaration cannot redefine an existing actor.",[n.value.actor_id]),e.actors.push(structuredClone(n.value));else if(n.kind==="location")e.locations.some(o=>o.location_id===n.value.location_id)&&Oe("Declaration cannot redefine an existing location.",[n.value.location_id]),e.locations.push(structuredClone(n.value));else if(n.kind==="prop")e.props.some(o=>o.prop_id===n.value.prop_id)&&Oe("Declaration cannot redefine an existing prop.",[n.value.prop_id]),e.props.push(structuredClone(n.value));else{let o=e.actors.find(i=>i.actor_id===n.ownerId)??e.locations.find(i=>i.location_id===n.ownerId)??e.props.find(i=>i.prop_id===n.ownerId);o||Oe("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Oe("State declaration cannot redefine an existing state.",[`${n.ownerId}/${n.value.state_id}`]),o.states.push(structuredClone(n.value))}}function Pt(e,t,n){let o=e.indexOf(t),i=e.indexOf(n);return(o<0||i<0)&&Oe("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function Xy(e,t){if(t.kind==="script")return[0,0];if(t.kind==="episode"||t.kind==="episode-span"){let o=e.episodes.map(i=>i.episode_id);return t.kind==="episode"?Pt(o,t.value.episode_id,t.value.episode_id):Pt(o,t.from,t.through)}if(t.kind==="scene"||t.kind==="scene-span"){let o=e.episodes.flatMap(i=>i.scenes.map(r=>r.scene_id));return t.kind==="scene"?Pt(o,t.value.scene_id,t.value.scene_id):Pt(o,t.from,t.through)}let n=e.episodes.flatMap(o=>o.scenes.flatMap(i=>i.actions.map(r=>r.action_id)));return Pt(n,t.from,t.through)}function e_(e,t){let n=-1;for(let o of t){let[i,r]=Xy(e,o);i<=n&&Oe("Replace targets must follow current document order without overlap.",[Ll(o)]),n=r}}function Ll(e){return e.kind==="script"?"script":e.kind==="episode"?e.value.episode_id:e.kind==="scene"?e.value.scene_id:`${e.from}..${e.through}`}function Rl(e,t){if(t.kind==="script")return{...Kn(e.episodes),siblings:0};if(t.kind==="episode"){let r=en(e,t.value.episode_id);return{...Kn(r?[r.episode]:[]),siblings:Math.max(0,e.episodes.length-(r?1:0))}}if(t.kind==="episode-span"){let[r,s]=Pt(e.episodes.map(c=>c.episode_id),t.from,t.through);return{...Kn(e.episodes.slice(r,s+1)),siblings:e.episodes.length-(s-r+1)}}if(t.kind==="scene"){let r=wn(e,t.value.scene_id),s=en(e,t.parent)?.episode;return{...Ho(r?[r.scene]:[]),siblings:r?Math.max(0,r.episode.scenes.length-1):s?.scenes.length??0}}if(t.kind==="scene-span"){let r=en(e,t.parent)?.episode;if(!r)return{...Ho([]),siblings:0};let[s,c]=Pt(r.scenes.map(a=>a.scene_id),t.from,t.through);return{...Ho(r.scenes.slice(s,c+1)),siblings:r.scenes.length-(c-s+1)}}let n=wn(e,t.parent)?.scene;if(!n)return{...cc([]),siblings:0};let[o,i]=Pt(n.actions.map(r=>r.action_id),t.from,t.through);return{...cc(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function Nl(e,t){let n=qy(e),o=new Set(t.ids),i=new Set(n.ids);return{kind:e.kind,address:Ll(e),before:t.counts,after:n.counts,retainedIds:t.ids.filter(r=>i.has(r)),createdIds:n.ids.filter(r=>!o.has(r)),removedIds:t.ids.filter(r=>!i.has(r)),untouchedSiblings:t.siblings}}function t_(e,t){if(t.kind==="script"&&Oe("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=en(e,t.value.episode_id);n||Oe("Episode replacement target was not found.",[t.value.episode_id]),e.episodes[n.episodeIndex]=structuredClone(t.value)}else if(t.kind==="episode-span"){let[n,o]=Pt(e.episodes.map(i=>i.episode_id),t.from,t.through);t.values.length===0&&Oe("Episode span replacement cannot be empty.",[t.from,t.through]),e.episodes.splice(n,o-n+1,...structuredClone(t.values))}else if(t.kind==="scene"){let n=wn(e,t.value.scene_id);(!n||n.episode.episode_id!==t.parent)&&Oe("Scene replacement target was not found under its parent.",[t.parent,t.value.scene_id]),n.episode.scenes[n.sceneIndex]=structuredClone(t.value)}else if(t.kind==="scene-span"){let n=en(e,t.parent)?.episode;n||Oe("Scene span parent was not found.",[t.parent]);let[o,i]=Pt(n.scenes.map(r=>r.scene_id),t.from,t.through);t.values.length===0&&Oe("Scene span replacement cannot be empty.",[t.from,t.through]),n.scenes.splice(o,i-o+1,...structuredClone(t.values))}else{let n=wn(e,t.parent)?.scene;n||Oe("Action span parent was not found.",[t.parent]);let[o,i]=Pt(n.actions.map(r=>r.action_id),t.from,t.through);t.values.length===0&&Oe("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function n_(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=en(e,t.parent)?.episode;n||Oe("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Oe("This target kind does not support create against an existing script.",[t.kind])}function Ml(e){if(e.targets.length!==1||e.targets[0].kind!=="script")return Oe("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Oe("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...Wy(e.declarations)}}function Tl(e,t,n){let o;if(e===null)n!=="create"&&Oe("A missing target requires one script create target.",[n,t.targetKind]),o=Ml(t);else if(n==="create"&&t.targetKind==="script")o=Ml(t),ac(o,e)||Oe("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&e_(e,t.targets),Zy(o,t.declarations);let r=t.targets.map(a=>Rl(e,a));if(n==="replace")for(let a of[...t.targets].reverse())t_(o,a);else for(let a of t.targets)n_(o,a);let s=t.targets.map((a,d)=>Nl(a,r[d])),c=Te(o);return Al(e,c),{script:o,changed:!ac(e,o),validation:c,targets:s,declarations:kl(e,t.declarations),retainedOrphanAssets:bl(o),identity:Ol(e,o)}}let i=Te(o);return Al(e,i),{script:o,changed:e===null||!ac(e,o),validation:i,declarations:kl(e,t.declarations),retainedOrphanAssets:bl(o),identity:Ol(e,o),targets:t.targets.map(r=>{let s=e===null?{...Kn([]),siblings:0}:Rl(e,r);return Nl(r,s)})}}function mo(e,t){throw new x(e,{exitCode:G,errorCode:"AUTHORING_USAGE_INVALID",hint:"Choose exactly one mode and pass a regular authoring source file.",data:{expected:["scriptctl authoring write <file> (--create|--replace) [--apply --plan <digest>]"],actual:t}})}function o_(e){(!e||e==="-")&&mo("Authoring input must be a named file.",[e||"<missing>"]);let t=Cl.resolve(e),n;try{n=Bi.statSync(t)}catch{throw new x("The authoring source file does not exist.",{exitCode:b,errorCode:"AUTHORING_SOURCE_UNAVAILABLE",hint:"Write the complete authoring draft to a file, then rerun the command.",data:{actual:[t]}})}n.isFile()||mo("Authoring input must be a regular file.",[t]);let o=Bi.readFileSync(t);return{absolutePath:t,bytes:o,text:o.toString("utf-8")}}function i_(e){let t=Mi(e);if(t===null)return{script:null,baseline:"missing",fingerprint:t};let n;try{n=JSON.parse(Bi.readFileSync(e,"utf-8"))}catch(i){throw new x("The local script is not valid JSON.",{exitCode:b,errorCode:"SCRIPT_JSON_INVALID",hint:"Repair the local JSON file, then rerun authoring.",data:{actual:[e,i instanceof Error?i.message:String(i)]}})}let o=zr(n);return{script:o,baseline:Ue(o),fingerprint:t}}function r_(e){let t=e.create===!0,n=e.replace===!0;return t===n&&mo("Choose exactly one authoring mode.",[`create=${t}`,`replace=${n}`]),t?"create":"replace"}function Ul(e){return`sha256:${Se(JSON.stringify(e))}`}function s_(e){return e.targets.reduce((t,n)=>({before:{episodes:t.before.episodes+n.before.episodes,scenes:t.before.scenes+n.before.scenes,actions:t.before.actions+n.before.actions},after:{episodes:t.after.episodes+n.after.episodes,scenes:t.after.scenes+n.after.scenes,actions:t.after.actions+n.after.actions}}),{before:{episodes:0,scenes:0,actions:0},after:{episodes:0,scenes:0,actions:0}})}function a_(e){let t=e.targets.map((n,o)=>[`target[${o}]=${n.address}`,`kind=${n.kind}`,`before=${JSON.stringify(n.before)}`,`after=${JSON.stringify(n.after)}`,`retained=${JSON.stringify(n.retainedIds)}`,`created=${JSON.stringify(n.createdIds)}`,`removed=${JSON.stringify(n.removedIds)}`,`untouched_siblings=${n.untouchedSiblings}`].join(" "));t.push(`created_assets=${JSON.stringify(e.declarations.createdAssets)}`,`existing_assets=${JSON.stringify(e.declarations.existingAssets)}`,`created_states=${JSON.stringify(e.declarations.createdStates)}`,`existing_states=${JSON.stringify(e.declarations.existingStates)}`,`retained_orphan_assets=${JSON.stringify(e.retainedOrphanAssets)}`,`validation_ok=${e.validation.ok} errors=${e.validation.errors.length} warnings=${e.validation.warnings.length}`);for(let n of e.validation.errors)t.push(`validation_error=${n.path} ${n.code} ${n.message}`);for(let n of e.validation.warnings)t.push(`validation_warning=${n.path} ${n.code} ${n.message}`);return t}function c_(e,t,n,o,i){let r=Il(t.text),s=i.script===null?null:Xt(i.script),c=Tl(s,r,n),a=`sha256:${dc.createHash("sha256").update(t.bytes).digest("hex")}`,d={version:1,sourceDigest:a,mode:n,targetKind:r.targetKind,targets:c.targets.map(h=>h.address),baseline:i.baseline,plan:{targets:c.targets,declarations:c.declarations,retainedOrphanAssets:c.retainedOrphanAssets,identity:c.identity,validation:c.validation}},p=Ul(d),l=e.apply===!0,f=v(e.plan).trim();if(l&&!f&&mo("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!l&&f&&mo("--plan is only valid together with --apply.",[`plan=${f}`]),l&&f!==p)throw new x("The supplied plan does not match the current source, mode, targets, or script baseline.",{exitCode:b,errorCode:"AUTHORING_PLAN_MISMATCH",hint:"Review the newly computed plan, then apply its exact digest.",data:{expected:[p],actual:[f]}});l&&c.changed&&(i.script===null?Li(o,i.fingerprint):kt(o,i.baseline),Be(o,c.script));let u=c.targets.map((h,_)=>`target[${_}]=${h.address} kind=${h.kind} before=${JSON.stringify(h.before)} after=${JSON.stringify(h.after)} retained=${JSON.stringify(h.retainedIds)} created=${JSON.stringify(h.createdIds)} removed=${JSON.stringify(h.removedIds)} untouched_siblings=${h.untouchedSiblings}`);return u.push(`created_assets=${JSON.stringify(c.declarations.createdAssets)}`,`existing_assets=${JSON.stringify(c.declarations.existingAssets)}`,`created_states=${JSON.stringify(c.declarations.createdStates)}`,`existing_states=${JSON.stringify(c.declarations.existingStates)}`,`retained_orphan_assets=${JSON.stringify(c.retainedOrphanAssets)}`,`created_ids=${JSON.stringify(c.identity.createdIds)}`,`removed_ids=${JSON.stringify(c.identity.removedIds)}`,`retained_ids=${JSON.stringify(c.identity.retainedIds)}`),[{text:[`${l?"Applied":"Planned"} ${c.targets.length} ${r.targetKind} target(s); validation ${c.validation.ok?"passed":"needs repair"}`,`plan: ${p}`,...u].join(`
|
|
132
|
+
`),data:{op:"write",changed:c.changed,source_path:t.absolutePath,source_digest:a,script_path:o,baseline:i.baseline,script_hash:i.baseline==="missing"?null:i.baseline,plan_digest:p,plan:d.plan,mode:n,target_kind:r.targetKind,targets:c.targets,declarations:c.declarations,retained_orphan_assets:c.retainedOrphanAssets,identity:c.identity,validation:c.validation,applied:l,script_version:4}},B]}function Pl(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"",o=o_(n),i=r_(e),r=xe(e),s=i_(r);if(s.script===null||s.script.version===4)return c_(e,o,i,r,s);let c=xl(o.text),a=_l(It(s.script),c,i),d=`sha256:${dc.createHash("sha256").update(o.bytes).digest("hex")}`,p={version:1,sourceDigest:d,mode:i,targetKind:c.targetKind,targets:a.targets.map(_=>_.address),baseline:s.baseline,plan:{targets:a.targets,declarations:a.declarations,retainedOrphanAssets:a.retainedOrphanAssets,validation:a.validation}},l=Ul(p),f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&mo("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&mo("--plan is only valid together with --apply.",[`plan=${u}`]),f&&u!==l)throw new x("The supplied plan does not match the current source, mode, targets, or script baseline.",{exitCode:b,errorCode:"AUTHORING_PLAN_MISMATCH",hint:"Review the newly computed plan, then apply its exact digest.",data:{expected:[l],actual:[u]}});f&&a.changed&&(s.script===null?Li(r,s.fingerprint):kt(r,s.baseline),Be(r,a.script));let m=s_(a);return[{text:[`${f?"Applied":"Planned"} ${a.targets.length} ${c.targetKind} target(s); episodes ${m.before.episodes}\u2192${m.after.episodes}, scenes ${m.before.scenes}\u2192${m.after.scenes}, actions ${m.before.actions}\u2192${m.after.actions}`,`plan: ${l}`,...a_(a)].join(`
|
|
133
|
+
`),data:{op:"write",changed:a.changed,source_path:o.absolutePath,source_digest:d,script_path:r,baseline:s.baseline,script_hash:s.baseline==="missing"?null:s.baseline,plan_digest:l,plan:p.plan,mode:i,target_kind:c.targetKind,targets:a.targets,declarations:a.declarations,counts:m,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},B]}function $l(e){return Array.isArray(e.rows)}function d_(e){return e.endsWith(`
|
|
134
|
+
`)?e:`${e}
|
|
135
|
+
`}function Vl(e){return Array.isArray(e)?e.map(t=>String(t).replace(/[\r\n]+/g," ")):[]}function p_(e){return e==null?"":(typeof e=="string"?e:JSON.stringify(e)).replace(/\t/g," ").replace(/\r?\n/g," ")}function l_(e){if(!$l(e)||e.rows.length===0||!Array.isArray(e.row_columns))return null;let t=e.row_columns.filter(n=>typeof n=="string");return t.length===0?null:[t.join(" "),...e.rows.map(n=>t.map(o=>p_(n[o])).join(" "))].join(`
|
|
136
|
+
`)}function Dl(e,t,n,o){if(!(e.text===""&&Object.keys(e.data).length===0)){if(o==="addr"&&$l(e.data)){if(e.data.rows.length===0){process.stdout.write("");return}let i=e.data.rows.map(r=>String(r.addr??""));if(i.every(r=>r.length>0)){process.stdout.write(i.join(`
|
|
137
|
+
`)+`
|
|
138
|
+
`);return}}if(n){let i={ok:t===B,exit_code:t,...e.data};i.ok=t===B,i.exit_code=t,process.stdout.write(JSON.stringify(i,null,2)+`
|
|
139
|
+
`)}else process.stdout.write(d_(l_(e.data)??e.text))}}function Ji(e,t){if(t){let n={ok:!1,exit_code:e.exitCode,error_code:e.errorCode,message:e.message,...e.hint?{hint:e.hint}:{},...e.data};n.ok=!1,n.exit_code=e.exitCode,n.error_code=e.errorCode,n.message=e.message,e.hint&&(n.hint=e.hint),process.stdout.write(JSON.stringify(n,null,2)+`
|
|
140
|
+
`)}else{let n=Vl(e.data.actual),o=Vl(e.data.expected),r=[`error: ${n.length>0?`${e.message.replace(/\.$/,"")}: ${n[0]}`:e.message}`];n.length>1&&r.push(`actual: ${n.slice(1).join("; ")}`),o.length>0&&r.push(`expected: ${o.join("; ")}`),e.hint&&r.push(e.hint),process.stderr.write(`${r.join(`
|
|
141
|
+
`)}
|
|
142
|
+
`)}return e.exitCode}var pc=new WeakMap;function u_(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}function f_(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[u_(t),n]))}function m_(e){let t=[],n=e;for(;n;)t.unshift(n),n=n.parent;return Object.assign({},...t.map(o=>o.opts()))}function Y(e,t){return async(...n)=>{let o=n[n.length-1],i=n.slice(0,-2).filter(d=>d!==void 0),r=f_(m_(o));i.length>0&&(r._args=i),t.jsonMode=!!r.json,t.format=typeof r.format=="string"?r.format:void 0;let s=async()=>e(r),[c,a]=pc.get(o)==="write"?await Gr(xe(r),s):await s();Dl(c,a,t.jsonMode,t.format),t.exitCode=a}}function Ie(e,t){return e.registeredArguments.forEach((n,o)=>{n.description=t[o]??""}),e}function se(e,t="write"){return pc.set(e,t),e.option("-p, --script-path <path>","Script JSON file (default: ./workspace/script.json)")}function lc(e){return pc.set(e,"write"),e.option("-p, --script-path <path>","Local script JSON file (default: ./workspace/script.json)").option("--project-group-no <no>","Remote project group number")}function Gl(e,t){let n=e.command("authoring").description("Structured screenplay compilation and atomic application transactions"),o=se(n.command("write <file>")).description("Plan or apply a complete structured authoring document").option("--create","Create the selected target").option("--replace","Replace the selected target").option("--apply","Apply the exact plan").option("--plan <digest>","Exact plan digest to apply").action(Y(Pl,t));Ie(o,["Structured .scriptctl file"]);let i=se(n.command("compose <file>")).description("Compile a readable scene JSON draft with generated identities and timing").option("--apply","Apply the exact plan").option("--plan <digest>","Exact plan digest to apply").action(Y(Qp,t));Ie(i,["Readable scene JSON file"]);let r=n.command("export").description("Export complete structured content, including identities and extensions"),s=["script","episodes","episode-spans","scenes","scene-spans","action-spans"];for(let c of s){let a=se(r.command(c),"read").description(`Export structured ${c}`).requiredOption("-o, --output <file>","Destination .scriptctl file");c!=="script"&&a.requiredOption("-i, --in <selector>","Formal ID or @ep:N selector / inclusive range"),a.action(Y(d=>al(c,d),t))}}import*as es from"node:fs";import*as _c from"node:path";import*as mc from"node:fs";import*as Fo from"node:path";import{fileURLToPath as g_}from"node:url";var fc="@lingjingai/scriptctl",uc="";function gc(){if(uc)return uc;let e=Fo.dirname(g_(import.meta.url));for(;;){try{let n=mc.readFileSync(Fo.join(e,"package.json"),"utf-8");if(JSON.parse(n).name===fc)return uc=e,e}catch{}let t=Fo.dirname(e);if(t===e)throw new Error(`${fc} package root not found`);e=t}}function Qo(){let e=mc.readFileSync(Fo.join(gc(),"package.json"),"utf-8"),t=JSON.parse(e).version;if(typeof t!="string")throw new Error(`${fc} package.json has no string version`);return t}var Bl=/^\d+\.\d+\.\d+$/,h_="unreleased";function Jl(){return _c.join(gc(),"changes")}function y_(){return Qo()}function Ki(e){if(!Bl.test(e))throw new x("Version must use x.y.z.",{exitCode:G,errorCode:"CHANGELOG_VERSION_INVALID",hint:"Pass a released version such as `scriptctl changelog 0.25.10`.",data:{expected:["x.y.z"],actual:[e||"<empty>"]}});let[t,n,o]=e.split(".").map(i=>Number(i));return[t,n,o]}function yc(e,t){let n=Ki(e),o=Ki(t);for(let i=0;i<3;i++)if(n[i]!==o[i])return n[i]-o[i];return 0}function __(){let e=Jl();return es.readdirSync(e).filter(t=>t.endsWith(".md")).map(t=>t.slice(0,-3)).filter(t=>Bl.test(t)).sort(yc)}function Xr(e){return es.readFileSync(_c.join(Jl(),`${e}.md`),"utf-8").trimEnd()}function hc(e,t){return new x(`No changelog entry exists for ${e}.`,{exitCode:b,errorCode:"CHANGELOG_VERSION_NOT_FOUND",hint:t.length>0?`Available versions: ${t.join(", ")}`:"Add changes/<version>.md first.",data:{expected:["existing changelog version"],actual:[e]}})}function w_(e,t){return new x(`No released changelog entries found after ${e} through ${t}.`,{exitCode:b,errorCode:"CHANGELOG_RANGE_EMPTY",hint:"Choose a wider range or run `scriptctl changelog <version>` for a known release.",data:{expected:["a version range containing released changelog entries"],actual:[`--from ${e}`,`--to ${t}`]}})}function E_(e){return e.map(Xr).join(`
|
|
143
|
+
|
|
144
|
+
`)}function Kl(e){let t=e._args??[],n=t[0]?.trim()??"",o=String(e.from??"").trim(),i=String(e.to??"").trim(),r=!!e.unreleased;if(t.length>1)throw new x("changelog accepts at most one version argument.",{exitCode:G,errorCode:"CHANGELOG_TOO_MANY_ARGS",hint:"Pass a single version, or use --from/--to for a range.",data:{expected:["scriptctl changelog [version] [--from X] [--to Y] [--unreleased]"],actual:[t.join(" ")]}});if(r&&(n||o||i))throw new x("--unreleased cannot combine with version, --from, or --to.",{exitCode:G,errorCode:"CHANGELOG_SELECTOR_CONFLICT",hint:"Run `scriptctl changelog --unreleased` by itself.",data:{expected:["either --unreleased, a version, or a --from/--to range"],actual:["--unreleased with another selector"]}});if(n&&(o||i))throw new x("A version argument cannot combine with --from or --to.",{exitCode:G,errorCode:"CHANGELOG_SELECTOR_CONFLICT",hint:"Run `scriptctl changelog 0.25.10` or `scriptctl changelog --from 0.25.8 --to 0.25.10`.",data:{expected:["either a version argument, or --from/--to"],actual:[n,o?`--from ${o}`:"",i?`--to ${i}`:""].filter(Boolean)}});if(r){let d=Xr(h_);return[{text:d,data:{content:d,versions:[],unreleased:!0}},B]}let s=__(),c=y_();if(n){if(Ki(n),!s.includes(n))throw hc(n,s);let d=Xr(n);return[{text:d,data:{content:d,versions:[n],unreleased:!1}},B]}if(o||i){if(!o)throw new x("--from is required for range queries.",{exitCode:G,errorCode:"CHANGELOG_FROM_MISSING",hint:"Run `scriptctl changelog --from 0.25.8 --to 0.25.10`.",data:{expected:["--from <x.y.z>"],actual:[i?`--to ${i}`:"<missing>"]}});Ki(o);let d=i||c;if(Ki(d),!s.includes(d))throw hc(d,s);let p=s.filter(f=>yc(f,o)>0&&yc(f,d)<=0);if(p.length===0)throw w_(o,d);let l=E_(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},B]}if(!s.includes(c))throw hc(c,s);let a=Xr(c);return[{text:a,data:{content:a,versions:[c],unreleased:!1}},B]}import*as bt from"node:fs";import*as _o from"node:path";import{createRequire as Sw}from"node:module";import*as xn from"node:fs";import*as jn from"node:path";import*as zl from"node:os";import{fileURLToPath as x_}from"node:url";function jl(e){return e.startsWith("~")?jn.join(zl.homedir(),e.slice(1)):e}function S_(e){let t=xn.readFileSync(e,"utf-8");for(let n of t.split(/\r?\n/)){let o=n.trim();if(!o||o.startsWith("#"))continue;o.startsWith("export ")&&(o=o.slice(7).trim());let i=o.indexOf("=");if(i<0)continue;let r=o.slice(0,i).trim(),s=o.slice(i+1).trim();s.length>=2&&s[0]===s[s.length-1]&&(s[0]==="'"||s[0]==='"')&&(s=s.slice(1,-1)),r&&s&&!process.env[r]&&(process.env[r]=s)}}function wc(){let e=[],t=(process.env.SCRIPTCTL_ENV_FILE??"").trim();t&&e.push(jl(t));let n=(process.env.SCRIPTCTL_SKILL_DIR??"").trim();n&&e.push(jn.join(jl(n),".env"));let o;try{o=x_(import.meta.url)}catch{o=process.cwd()}let i=jn.resolve(o),r=new Set;for(;;){let s=jn.dirname(i);if(s===i||r.has(s))break;r.add(s),e.push(jn.join(s,".env")),i=s}return e}function Hl(){let e=process.env.SCRIPTCTL_NO_DOTENV;if(e==="1"||e==="true"||e==="True")return;let t=new Set;for(let n of wc()){let o;try{o=xn.existsSync(n)?xn.realpathSync(n):n}catch{o=n}t.has(o)||!xn.existsSync(n)||!xn.statSync(n).isFile()||(t.add(o),S_(n))}}var de=class extends Error{status;code;payload;configMissing;constructor(t,n={}){super(t),this.name="ScriptOutputApiError",this.status=n.status??null,this.code=n.code??null,this.payload=n.payload,this.configMissing=n.configMissing??null}};async function Ec(e,t){if(e.updateEpisodeCount)try{await e.updateEpisodeCount(t)}catch{}}function Fl(e){let t=!!e?.remote,n=!!e?.local;if(t&&n)return{mode:null,conflict:!0};if(t)return{mode:"remote",conflict:!1};if(n)return{mode:"local",conflict:!1};let o=(process.env.SCRIPTCTL_OUTPUT_MODE??"").trim().toLowerCase();if(o==="local"||o==="remote")return{mode:o,conflict:!1};if(o!=="")return{mode:null,conflict:!1};let i=typeof e?.projectGroupNo=="string"?e.projectGroupNo.trim():"",r=(process.env.SANDBOX_PROJECT_GROUP_NO??"").trim();return i!==""||r!==""?{mode:"remote",conflict:!1}:{mode:null,conflict:!1}}import*as Fi from"node:fs";import*as Yl from"node:os";import*as zi from"node:path";import{parseDocument as I_}from"yaml";function ne(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var Sn={"direct.episode-titles":ne("direct.episode-titles","tool",4096),"direct.batch-extract":ne("direct.batch-extract","text",16e3),"direct.episode-synopsis":ne("direct.episode-synopsis","tool",2048),"direct.synopsis-reduction":ne("direct.synopsis-reduction","tool",4096),"direct.script-synopsis":ne("direct.script-synopsis","tool",2048),"direct.asset-grouping":ne("direct.asset-grouping","text",8e3),"direct.asset-curation":ne("direct.asset-curation","text",2e4),"direct.asset-curation-audit":ne("direct.asset-curation-audit","text",2e4),"direct.location-canonicalization":ne("direct.location-canonicalization","text",2e4),"direct.state-curation":ne("direct.state-curation","text",2e4),"direct.state-binding":ne("direct.state-binding","tool",16e3),"metadata.global":ne("metadata.global","text",16e3),"metadata.descriptions":ne("metadata.descriptions","text",16e3),"synopsis.chunk":ne("synopsis.chunk","text",4096),"synopsis.episode":ne("synopsis.episode","text",4096),"synopsis.arc":ne("synopsis.arc","text",16e3),"synopsis.script-overview":ne("synopsis.script-overview","text",16e3),"ingest.body-start":ne("ingest.body-start","text",16e3),"ingest.arc-summary":ne("ingest.arc-summary","text",4096),"ingest.text-normalize":ne("ingest.text-normalize","text",32e3),"ingest.episode-assets":ne("ingest.episode-assets","tool",32e3),"ingest.name-fix":ne("ingest.name-fix","tool",16e3),"ingest.mention-resolve":ne("ingest.mention-resolve","text",8e3),"ingest.asset-extract":ne("ingest.asset-extract","text",8e3),"ingest.asset-curate":ne("ingest.asset-curate","text",32e3),"ingest.asset-recall":ne("ingest.asset-recall","text",65536),"ingest.asset-refine":ne("ingest.asset-refine","text",32e3),"ingest.state-reconcile":ne("ingest.state-reconcile","text",32e3),"ingest.asset-audit":ne("ingest.asset-audit","tool",32e3),"ingest.speaker-audit":ne("ingest.speaker-audit","tool",16e3),"ingest.video-serial":ne("ingest.video-serial","video",65536)},Ql=Object.keys(Sn).filter(xc);function xc(e){return Object.hasOwn(Sn,e)}var A_=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts"]),k_=new Set(["provider","model","thinking","reasoning","temperature"]),b_=new Set(["env"]),v_=new Set(["budgetTokens"]);function Ke(e,t=[]){return new x(e,{exitCode:b,errorCode:"LLM_CONFIG_INVALID",hint:"Fix the selected LLM configuration or environment and rerun `scriptctl doctor`.",data:{expected:["valid scriptctl LLM YAML configuration"],actual:t}})}function Ac(e,t){let n;try{n=new URL(e)}catch{throw Ke(`${t} must be an absolute URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw Ke(`${t} must use http or https.`);return n.toString().replace(/\/$/,"")}function kc(e,t="provider base URL"){return Ac(e,t)}function O_(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function zn(e,t){if(!O_(e))throw Ke(`${t} must be a mapping.`,[`${t}: ${typeof e}`]);return e}function go(e,t){if(typeof e!="string"||!e.trim())throw Ke(`${t} must be a non-empty string.`);return e.trim()}function Ic(e,t,n,o){if(!Number.isInteger(e)||typeof e!="number"||e<n||o!==void 0&&e>o)throw Ke(`${t} must be an integer in ${o===void 0?`[${n}, +\u221E)`:`[${n}, ${o}]`}.`);return e}function Hi(e,t,n){let o=Object.keys(e).filter(i=>!t.has(i));if(o.length>0)throw Ke(`${n} contains unknown fields.`,o)}function R_(e,t){let n=zn(t,`providers.${e}`);Hi(n,A_,`providers.${e}`);let o=go(n.protocol,`providers.${e}.protocol`);if(o!=="anthropic"&&o!=="openai-compatible"&&o!=="google-gemini")throw Ke(`providers.${e}.protocol is unsupported.`,[o]);let i=n.baseUrl===void 0&&o!=="openai-compatible"?null:Ac(go(n.baseUrl,`providers.${e}.baseUrl`),`providers.${e}.baseUrl`),r=zn(n.apiKey,`providers.${e}.apiKey`);Hi(r,b_,`providers.${e}.apiKey`);let s=go(r.env,`providers.${e}.apiKey.env`);if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(s))throw Ke(`providers.${e}.apiKey.env must be an environment variable name.`);return{protocol:o,baseUrl:i,apiKeyEnv:s,timeoutMs:Ic(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:Ic(n.maxAttempts,`providers.${e}.maxAttempts`,1,6)}}function N_(e,t,n){let o=zn(t,`models.${e}`);Hi(o,k_,`models.${e}`);let i=go(o.provider,`models.${e}.provider`),r=n[i];if(!r)throw Ke(`models.${e} references an unknown provider.`,[i]);let s={provider:i,model:go(o.model,`models.${e}.model`)};if(o.reasoning!==void 0&&(s.reasoning=go(o.reasoning,`models.${e}.reasoning`)),o.temperature!==void 0){let c=o.temperature;if(typeof c!="number"||!Number.isFinite(c)||c<0)throw Ke(`models.${e}.temperature must be a number \u2265 0.`);s.temperature=c}if(o.thinking!==void 0){if(r.protocol!=="anthropic")throw Ke(`models.${e}.thinking is only valid for anthropic providers.`);let c=zn(o.thinking,`models.${e}.thinking`);Hi(c,v_,`models.${e}.thinking`),s.thinkingBudgetTokens=Ic(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function M_(e,t){let n=zn(e,"config");if(Hi(n,new Set(["version","providers","models","tasks"]),"config"),n.version!==1)throw Ke("config.version must be 1.");let o=zn(n.providers,"providers"),i={};for(let[a,d]of Object.entries(o))i[a]=R_(a,d);let r=zn(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=N_(a,d,i);if(!s.default)throw Ke("models.default is required.");let c={};if(n.tasks!==void 0){let a=zn(n.tasks,"tasks");for(let[d,p]of Object.entries(a)){if(!xc(d))throw Ke("tasks contains an unknown task id.",[d]);let l=go(p,`tasks.${d}`);if(!s[l])throw Ke(`tasks.${d} references an unknown model profile.`,[l]);c[d]=l}}return{version:1,providers:i,models:s,tasks:c,source:"file",sourcePath:t}}var ji={version:1,providers:{gw:{protocol:"openai-compatible",baseUrl:null,apiKeyEnv:"PROJECT_LITELLM_GATEWAY_API_KEY",timeoutMs:3e5,maxAttempts:3},"google-gemini":{protocol:"google-gemini",baseUrl:null,apiKeyEnv:"GEMINI_API_KEY",timeoutMs:6e5,maxAttempts:3}},models:{default:{provider:"gw",model:"deepseek-v4-flash-packy",temperature:0},"ingest-low":{provider:"gw",model:"deepseek-v4-flash-packy",temperature:0},"ingest-normalize":{provider:"gw",model:"claude-sonnet-4-6-aihubmix",temperature:0},"ingest-video":{provider:"google-gemini",model:"gemini-3.8-flash"},"review-agent":{provider:"google-gemini",model:"gemini-3.8-flash",temperature:0}},tasks:{"ingest.body-start":"ingest-low","ingest.arc-summary":"ingest-low","ingest.text-normalize":"ingest-low","ingest.mention-resolve":"ingest-low","ingest.asset-recall":"ingest-low","ingest.asset-audit":"ingest-normalize","ingest.episode-assets":"ingest-normalize","ingest.name-fix":"ingest-normalize","ingest.video-serial":"ingest-video"},source:"builtin",sourcePath:null};function L_(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?Ac(e,"PROJECT_LITELLM_GATEWAY_BASE_URL"):null;return{...ji,providers:{gw:{...ji.providers.gw,baseUrl:t},"google-gemini":{...ji.providers["google-gemini"]}},models:{...ji.models},tasks:{...ji.tasks}}}function T_(){let e=(process.env.XDG_CONFIG_HOME??"").trim();return e?zi.join(e,"scriptctl","llm.yaml"):zi.join(Yl.homedir(),".config","scriptctl","llm.yaml")}function Sc(e){if(!Fi.existsSync(e))throw Ke("LLM configuration file does not exist.",[e]);let t=I_(Fi.readFileSync(e,"utf-8"),{uniqueKeys:!0});if(t.errors.length>0)throw Ke("LLM configuration YAML is invalid.",t.errors.map(o=>o.message));let n=t.toJS();return M_(n,zi.resolve(e))}function Yo(e){let t=(e??"").trim();if(t)return Sc(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return Sc(n);let o=T_();return Fi.existsSync(o)?Sc(o):L_()}import*as lu from"node:crypto";import P_,{APIConnectionError as V_,APIConnectionTimeoutError as $_,APIError as D_,APIUserAbortError as G_}from"@anthropic-ai/sdk";var bc=1e8;function C_(e){switch(e){case"auth":return{failure_type:"authentication",failure_code:"authentication_failed"};case"permission_denied":return{failure_type:"authorization",failure_code:"permission_denied"};case"endpoint":return{failure_type:"provider",failure_code:"resource_not_found"};case"network":return{failure_type:"network",failure_code:"network_failed"};case"timeout":return{failure_type:"timeout",failure_code:"request_timeout"};case"rate_limited":return{failure_type:"rate_limit",failure_code:"rate_limited"};case"request_failed":return{failure_type:"provider",failure_code:"request_rejected"};case"truncated":return{failure_type:"response",failure_code:"output_truncated"};case"content_filtered":return{failure_type:"policy",failure_code:"content_blocked"};case"empty_response":return{failure_type:"response",failure_code:"empty_response"};case"invalid_response":return{failure_type:"response",failure_code:"malformed_response"};case"cancelled":return{failure_type:"cancelled",failure_code:"cancelled"}}}var P=class extends Error{code;retryable;details;failure;modelFailures;attempts;usage;constructor(t,n,o={}){super(n),this.name="LlmTransportError",this.code=t,this.retryable=o.retryable??!1,this.details=o.details??[],this.attempts=o.attempts??1,this.usage=o.usage??{},this.failure=wt(o.classification??C_(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function U_(e){return new Promise(t=>setTimeout(t,e))}function Vt(e={},t={}){let n=c=>e[c]===void 0&&t[c]===void 0?void 0:(e[c]??0)+(t[c]??0),o=n("inputTokens"),i=n("outputTokens"),r=n("cachedInputTokens"),s=n("cacheCreationTokens");return{...o!==void 0?{inputTokens:o}:{},...i!==void 0?{outputTokens:i}:{},...r!==void 0?{cachedInputTokens:r}:{},...s!==void 0?{cacheCreationTokens:s}:{}}}async function $t(e,t){let n={};for(let o=1;o<=e;o+=1)try{return{value:await t(),attempts:o,failedUsage:n}}catch(i){if(i instanceof P&&(n=Vt(n,i.usage),i.attempts=o,i.usage=n),!(i instanceof P)||!i.retryable||o===e)throw i;await U_(Math.min(3e4,1e3*2**(o-1)))}throw new Error("unreachable retry state")}function ql(e){let t=e.usage;if(!t)return{};let n=t.cache_read_input_tokens??0,o=t.cache_creation_input_tokens??0;return{inputTokens:(t.input_tokens??0)+n+o,outputTokens:t.output_tokens??0,cachedInputTokens:n,cacheCreationTokens:o}}function Wl(e){if(e instanceof P)return e;if(e instanceof G_)return new P("request_failed","Anthropic request was aborted.");if(e instanceof $_)return new P("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof V_)return new P("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof D_){let n=e.status??0,o=n===408||n===429||n>=500,i=n===401||n===403?"auth":n===429?"rate_limited":"request_failed";return new P(i,"Anthropic request failed.",{retryable:o,details:[`status: ${n}`,e.message.slice(0,500)]})}let t=e instanceof Error?e.message:String(e);return new P("request_failed","Anthropic request failed.",{details:[t.slice(0,500)]})}var ts=class{constructor(t,n,o){this.provider=t;this.model=n;let i={apiKey:o};t.baseUrl&&(i.baseURL=t.baseUrl),this.client=new P_({...i,maxRetries:0})}provider;model;client;params(t){let n={model:this.model.model,max_tokens:t.maxOutputTokens,stream:!1,messages:[{role:"user",content:t.user}]};return t.system.trim()&&(n.system=t.system),this.model.thinkingBudgetTokens!==void 0&&(n.thinking={type:"enabled",budget_tokens:this.model.thinkingBudgetTokens}),n}async generateText(t){let n=await $t(this.provider.maxAttempts,async()=>{try{let o=await this.client.messages.create(this.params(t),{timeout:this.provider.timeoutMs,signal:t.signal}),i=ql(o);if(o.stop_reason==="max_tokens")throw new P("truncated","Provider output was truncated.",{usage:i});if(o.stop_reason==="refusal")throw new P("content_filtered","Provider filtered the response.",{usage:i});let r=o.content.filter(s=>s.type==="text").map(s=>s.text).join(`
|
|
145
|
+
`).trim();if(!r)throw new P("empty_response","Provider returned an empty text response.",{usage:i});return{text:r,finishReason:o.stop_reason??"",usage:i,raw:o}}catch(o){throw Wl(o)}});return{...n.value,attempts:n.attempts,usage:Vt(n.failedUsage,n.value.usage)}}async generateTool(t){let n=await $t(this.provider.maxAttempts,async()=>{try{let o={name:t.tool.name,description:t.tool.description,input_schema:{type:"object",...t.tool.inputSchema}},i=await this.client.messages.create({...this.params(t),tools:[o],tool_choice:{type:"tool",name:t.tool.name,disable_parallel_tool_use:!0}},{timeout:this.provider.timeoutMs,signal:t.signal}),r=ql(i);if(i.stop_reason==="max_tokens")throw new P("truncated","Provider tool output was truncated.",{usage:r});if(i.stop_reason==="refusal")throw new P("content_filtered","Provider filtered the response.",{usage:r});let s=i.content.find(c=>c.type==="tool_use"&&c.name===t.tool.name);if(!s||s.type!=="tool_use")throw new P("invalid_response","Provider did not return the required tool call.",{usage:r});return{input:s.input,finishReason:i.stop_reason??"",usage:r,raw:i}}catch(o){throw Wl(o)}});return{...n.value,attempts:n.attempts,usage:Vt(n.failedUsage,n.value.usage)}}};import*as Zl from"node:fs";import*as Xl from"node:path";import{File as H_}from"node:buffer";import{Agent as F_,fetch as os,FormData as Q_}from"undici";function B_(e){return typeof e=="object"&&e!==null}function vc(e){let t=[],n=new Set,o=e;for(;B_(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function ns(e){for(let t of vc(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function J_(e){for(let t of vc(e))if(typeof t.code=="string")return t.code}function K_(e){for(let t of vc(e))if(typeof t.name=="string")return t.name}function j_(e){let t=K_(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function z_(e){return e?["ENOTFOUND","EAI_AGAIN"].includes(e)?{failure_type:"network",failure_code:"dns_failed"}:e==="ECONNREFUSED"?{failure_type:"network",failure_code:"connection_refused"}:["ECONNRESET","EPIPE","UND_ERR_SOCKET"].includes(e)?{failure_type:"network",failure_code:"connection_reset"}:["ENETUNREACH","EHOSTUNREACH"].includes(e)?{failure_type:"network",failure_code:"network_unreachable"}:e.startsWith("ERR_TLS_")||e.startsWith("ERR_SSL_")||e.startsWith("CERT_")||["DEPTH_ZERO_SELF_SIGNED_CERT","SELF_SIGNED_CERT_IN_CHAIN","UNABLE_TO_VERIFY_LEAF_SIGNATURE"].includes(e)?{failure_type:"network",failure_code:"tls_failed"}:["ETIMEDOUT","UND_ERR_CONNECT_TIMEOUT"].includes(e)?{failure_type:"timeout",failure_code:"connect_timeout"}:{failure_type:"network",failure_code:"network_failed"}:{failure_type:"network",failure_code:"network_failed"}}function ho(e,t,n,o,i={}){if(t?.aborted)return new P("cancelled",n,{details:[o],classification:{failure_type:"cancelled",failure_code:"cancelled"},context:i});let r=J_(e),s=j_(e)?{failure_type:"timeout",failure_code:"request_timeout"}:z_(r),c=s.failure_type==="timeout"?"timeout":"network";return new P(c,n,{retryable:!0,details:[o],classification:s,context:{...i,...r?{system_code:r}:{}}})}function yo(e,t,n,o={}){let i,r,s=!1;return e===401?(i="auth",r={failure_type:"authentication",failure_code:"authentication_failed"}):e===403?(i="permission_denied",r={failure_type:"authorization",failure_code:"permission_denied"}):e===404?(i="endpoint",r={failure_type:"provider",failure_code:"resource_not_found"}):e===408?(i="timeout",r={failure_type:"timeout",failure_code:"request_timeout"},s=!0):e===413&&o.operation==="upload"?(i="request_failed",r={failure_type:"media",failure_code:"media_too_large"}):e===415&&o.operation==="upload"?(i="request_failed",r={failure_type:"media",failure_code:"unsupported_media"}):e===429?(i="rate_limited",r={failure_type:"rate_limit",failure_code:"rate_limited"},s=!0):e>=500?(i="request_failed",r={failure_type:"provider",failure_code:"provider_unavailable"},s=!0):o.operation==="upload"?(i="request_failed",r={failure_type:"media",failure_code:"media_upload_failed"}):(i="request_failed",r={failure_type:"provider",failure_code:"request_rejected"}),new P(i,t,{retryable:s,details:[`status: ${e}`,n],classification:r,context:{...o,http_status:e}})}var Y_=2e3;function q_(e){return new Promise(t=>setTimeout(t,e))}function Oc(e,t,n,o){if(e instanceof P)return e;let i=e instanceof Error?e.message:String(e),r=ns(e),s={provider:"doubao",model:o,operation:n};return r!==null?yo(r,`Doubao ${n} failed.`,i.slice(0,500),s):ho(e,t,`Doubao ${n} failed.`,i.slice(0,500),s)}function W_(e){if(!e)return{};let t=n=>typeof n=="number"?n:void 0;return{inputTokens:t(e.input_tokens),outputTokens:t(e.output_tokens)}}function Z_(e){let t=[];for(let n of e.output??[])if(n.type==="message")for(let o of n.content??[])o.type==="output_text"&&typeof o.text=="string"&&t.push(o.text);return t.join("").trim()}var is=class{constructor(t,n,o,i,r,s){this.model=t;this.timeoutMs=n;this.maxAttempts=o;this.client=s??X_(i,r,n)}model;timeoutMs;maxAttempts;client;async run(t){let{value:n}=await $t(this.maxAttempts,async()=>{try{return await this.client.uploadFile({filePath:t.localPath,mimeType:t.localMime,fps:t.fps})}catch(i){throw Oc(i,t.signal,"upload",this.model)}});if(!n.id)throw new P("invalid_response","Doubao upload returned no file id.");let o=await this.pollActive(n.id,t.signal);try{return await this.generateOnce(o,t)}finally{await this.client.deleteFile({id:o}).catch(()=>{})}}async pollActive(t,n){let o=Date.now()+this.timeoutMs,i="processing";for(;i==="processing"||i==="";){if(n?.aborted)throw new P("cancelled","Doubao upload aborted.",{context:{provider:"doubao",model:this.model,operation:"file_poll"}});if(Date.now()>=o)throw new P("timeout","Doubao file processing timed out.",{retryable:!0,classification:{failure_type:"timeout",failure_code:"media_processing_timeout"},context:{provider:"doubao",model:this.model,operation:"file_poll"}});await q_(Y_);let r;try{r=await this.client.getFile({id:t})}catch(s){throw Oc(s,n,"file_poll",this.model)}i=(r.status??"").toLowerCase()}if(i==="failed"||i==="error")throw new P("invalid_response","Doubao file processing failed.",{classification:{failure_type:"media",failure_code:"media_processing_failed"},context:{provider:"doubao",model:this.model,operation:"file_poll"}});return t}async generateOnce(t,n){let o={model:this.model,input:[{role:"user",content:[{type:"input_video",file_id:t},{type:"input_text",text:n.user}]}]};return n.system?.trim()&&(o.instructions=n.system),n.responseJsonSchema&&(o.text={format:{type:"json_schema",name:"video_serial",schema:n.responseJsonSchema}}),this.generateResponse(o,n.signal,!!n.responseJsonSchema)}async generateText(t){let n=this.textParams(t);return t.responseFormat&&(n.text={format:{type:t.responseFormat}}),this.generateResponse(n,t.signal,!!t.responseFormat)}async generateTool(t){let n=this.textParams(t);n.text={format:{type:"json_schema",name:t.tool.name,description:t.tool.description,schema:t.tool.inputSchema}};let o=await this.generateResponse(n,t.signal,!0);return{input:JSON.parse(o.text),finishReason:o.finishReason,attempts:o.attempts,usage:o.usage,raw:o.raw}}textParams(t){return{model:this.model,instructions:t.system,input:[{role:"user",content:[{type:"input_text",text:t.user}]}]}}async generateResponse(t,n,o){let{value:i,attempts:r,failedUsage:s}=await $t(this.maxAttempts,async()=>{let c;try{c=await this.client.createResponse(t,n)}catch(l){throw Oc(l,n,"generate",this.model)}let a=(c.status??"").toLowerCase(),d=W_(c.usage);if(a==="incomplete"){let l=c.incomplete_details?.reason??"unknown";throw l==="max_output_tokens"||l==="length"?new P("truncated","Doubao output was truncated.",{usage:d}):new P("content_filtered",`Doubao response incomplete (reason=${l}).`,{usage:d})}let p=Z_(c);if(!p)throw new P("empty_response","Doubao returned an empty response.",{retryable:!0,usage:d});if(o)try{JSON.parse(p)}catch{throw new P("invalid_response","Doubao returned malformed JSON for a structured response.",{retryable:!0,usage:d,context:{provider:"doubao",model:this.model,operation:"generate"}})}return{text:p,usage:d,raw:c}});return{text:i.text,finishReason:"STOP",attempts:r,usage:Vt(s,i.usage),raw:i.raw}}},Rc=class extends Error{constructor(n,o){super(o);this.status=n;this.name="HttpError"}status};function X_(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new F_({headersTimeout:n,bodyTimeout:n});function s(a){let d=AbortSignal.timeout(n);return a?AbortSignal.any([a,d]):d}async function c(a){let d=await a.text().catch(()=>"");throw new Rc(a.status,d.slice(0,500))}return{async uploadFile({filePath:a,mimeType:d,fps:p}){let l=new Q_,f=Zl.readFileSync(a);l.append("file",new H_([f],Xl.basename(a),{type:d})),l.append("purpose","user_data"),l.append("preprocess_configs[video][fps]",String(p));let u=await os(`${o}/files`,{method:"POST",headers:i,body:l,signal:s(),dispatcher:r});return u.ok||await c(u),await u.json()},async getFile({id:a}){let d=await os(`${o}/files/${a}`,{headers:i,signal:s(),dispatcher:r});return d.ok||await c(d),await d.json()},async createResponse(a,d){let p=await os(`${o}/responses`,{method:"POST",headers:{...i,"Content-Type":"application/json"},body:JSON.stringify(a),signal:s(d),dispatcher:r});return p.ok||await c(p),await p.json()},async deleteFile({id:a}){let d=await os(`${o}/files/${a}`,{method:"DELETE",headers:i,signal:s(),dispatcher:r});d.ok||await c(d)}}}import*as iu from"node:fs";import{createRequire as aw}from"node:module";import*as rs from"node:fs";import*as ew from"node:http";import*as tw from"node:https";import{HttpsProxyAgent as nw}from"https-proxy-agent";var tu="https://generativelanguage.googleapis.com";function ow(e,t){let n=new URL(e??tu);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function iw(e,t){let n=new URL(t??tu),o=new URL(e,n);if(!t)return o;o.protocol=n.protocol,o.host=n.host;let i=n.pathname.replace(/\/+$/,"");return i&&o.pathname!==i&&!o.pathname.startsWith(`${i}/`)&&(o.pathname=`${i}/${o.pathname.replace(/^\/+/,"")}`),o}function qo(e,t){if(!t)return e;let n=e.split(t).join("[REDACTED]"),o=encodeURIComponent(t);return o!==t&&(n=n.split(o).join("[REDACTED]")),n}function rw(e){return e?new nw(e):void 0}function eu(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?ew:tw).request({...t,agent:e.protocol==="https:"?t.agent:void 0,protocol:e.protocol,hostname:e.hostname,port:e.port||void 0,path:`${e.pathname}${e.search}`},a=>{let d="";a.on("data",p=>d+=p),a.on("end",()=>i({status:a.statusCode??0,headers:a.headers,body:d}))});if(c.on("error",r),o){if(o.aborted){c.destroy(new Error("aborted"));return}o.addEventListener("abort",()=>c.destroy(new Error("aborted")),{once:!0})}n&&typeof n.pipe=="function"?n.pipe(c):(n&&c.write(n),c.end())})}function sw(e,t){let n=e[t];return Array.isArray(n)?n[0]??"":n??""}async function nu(e){let t=rs.statSync(e.filePath).size,o={agent:rw(e.proxyUrl??""),timeout:e.timeoutMs},i=ow(e.baseUrl,e.apiKey),r=l=>qo(l,e.apiKey),s;try{s=await eu(i,{...o,method:"POST",headers:{"X-Goog-Upload-Protocol":"resumable","X-Goog-Upload-Command":"start","X-Goog-Upload-Header-Content-Length":String(t),"X-Goog-Upload-Header-Content-Type":e.mimeType,"Content-Type":"application/json"}},JSON.stringify({file:{}}),e.signal)}catch(l){let f=r(l instanceof Error?l.message:String(l));throw ho(l,e.signal,"Gemini upload start failed.",f,{operation:"upload"})}let c=sw(s.headers,"x-goog-upload-url");if(s.status<200||s.status>=300)throw yo(s.status,"Gemini upload start failed.",r(s.body).slice(0,300),{operation:"upload"});if(!c)throw new P("invalid_response","Gemini upload start returned no upload URL.",{details:[r(s.body).slice(0,300)],context:{operation:"upload",http_status:s.status}});let a=iw(c,e.baseUrl),d;try{d=await eu(a,{...o,method:"POST",headers:{"Content-Length":String(t),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"}},rs.createReadStream(e.filePath),e.signal)}catch(l){let f=r(l instanceof Error?l.message:String(l));throw ho(l,e.signal,"Gemini upload transfer failed.",f,{operation:"upload"})}if(d.status<200||d.status>=300)throw yo(d.status,"Gemini upload transfer failed.",r(d.body).slice(0,300),{operation:"upload"});let p;try{p=JSON.parse(d.body)}catch{throw new P("invalid_response","Gemini upload returned invalid JSON.",{details:[r(d.body).slice(0,300)]})}if(!p.file)throw new P("invalid_response","Gemini upload returned no file.",{details:[r(d.body).slice(0,300)]});return p.file}var cw=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),dw=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function Nc(e){switch(e){case"SAFETY":case"PROHIBITED_CONTENT":case"BLOCKLIST":case"SPII":case"RECITATION":case"IMAGE_SAFETY":case"IMAGE_PROHIBITED_CONTENT":case"IMAGE_RECITATION":case"ESCALATION":case"OTHER":return e;case"":case"BLOCK_REASON_UNSPECIFIED":case"FINISH_REASON_UNSPECIFIED":return"UNSPECIFIED";default:return"UNKNOWN"}}function ou(e){if(e?.length)return e.map(t=>({category:t.category??"UNSPECIFIED",probability:t.probability??"UNSPECIFIED",blocked:t.blocked??!1}))}function pw(e){if(typeof e!="object"||e===null)return{};let t=e,n=o=>typeof o=="number"?o:void 0;return{inputTokens:n(t.promptTokenCount),outputTokens:n(t.candidatesTokenCount)}}function lw(e){return/-c\d+$/.test(e)}function uw(e){let t=e.indexOf("{"),n=e.lastIndexOf("}");if(t<0||n<t)throw new SyntaxError("JSON object not found");return e.slice(t,n+1)}var fw=2e3;function mw(e){return new Promise(t=>setTimeout(t,e))}function Mc(e,t,n,o,i,r){if(e instanceof P)return new P(e.code,qo(e.message,o),{retryable:e.retryable,details:e.details.map(d=>qo(d,o)),attempts:e.attempts,usage:e.usage,classification:Vo(e.failure),context:{...bi(e.failure),provider:i,model:r,operation:n},modelFailures:e.modelFailures});let s=qo(e instanceof Error?e.message:String(e),o),c=ns(e),a={provider:i,model:r,operation:n};return c!==null?yo(c,`Gemini ${n} failed.`,s.slice(0,500),a):ho(e,t,`Gemini ${n} failed.`,s.slice(0,500),a)}var ss=class{constructor(t,n,o,i){this.provider=t;this.model=n;this.apiKey=o;this.client=i??hw(o,t.timeoutMs,t.baseUrl)}provider;model;apiKey;client;async prepare(t,n,o,i){return o==="base64"?{kind:"base64",data:iu.readFileSync(t,"base64"),mimeType:n}:{kind:"file-api",file:await this.uploadFile(t,n,i)}}async uploadFile(t,n,o){let{value:i}=await $t(this.provider.maxAttempts,async()=>{try{return await this.client.files.upload({file:t,config:{mimeType:n}})}catch(s){throw Mc(s,o,"upload",this.apiKey,this.model.provider,this.model.model)}}),r=await this.pollActive(i,o);if(!r.name||!r.uri)throw new P("invalid_response","Gemini upload returned no file reference.",{context:{provider:this.model.provider,model:this.model.model,operation:"upload"}});return{name:r.name,uri:r.uri,mimeType:r.mimeType??n}}async pollActive(t,n){let o=t,i=Date.now()+this.provider.timeoutMs;for(;(o.state??"").toUpperCase()==="PROCESSING";){if(n?.aborted)throw new P("cancelled","Gemini upload aborted.",{context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});if(Date.now()>=i)throw new P("timeout","Gemini file processing timed out.",{retryable:!0,classification:{failure_type:"timeout",failure_code:"media_processing_timeout"},context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});if(await mw(fw),!o.name)throw new P("invalid_response","Gemini upload returned no file name to poll.",{context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});try{o=await this.client.files.get({name:o.name})}catch(r){throw Mc(r,n,"file_poll",this.apiKey,this.model.provider,this.model.model)}}if((o.state??"").toUpperCase()==="FAILED")throw new P("invalid_response","Gemini file processing failed.",{details:[qo(o.error?.message??"unknown media error",this.apiKey)],classification:{failure_type:"media",failure_code:"media_processing_failed"},context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});return o}async generate(t){if(t.media.kind==="local-fallback"||t.media.kind==="local")throw new P("invalid_response","A local fallback video cannot be sent to Gemini.");let n=!!t.responseJsonSchema&&lw(this.model.model),o={mediaResolution:"MEDIA_RESOLUTION_HIGH",maxOutputTokens:t.maxOutputTokens},i=[t.system?.trim(),n?`\u8F93\u51FA\u5FC5\u987B\u662F\u4E00\u4E2A\u53EF\u89E3\u6790\u7684 JSON \u5BF9\u8C61\u3002\u53EA\u8FD4\u56DE JSON\uFF0C\u4E0D\u8981\u8F93\u51FA\u4EFB\u4F55\u989D\u5916\u6587\u5B57\u6216 Markdown \u4EE3\u7801\u5757\u3002
|
|
146
|
+
\u4EE5\u4E0B\u662F\u5B8C\u6574\u8F93\u51FA JSON Schema\u3002\u4E25\u683C\u9075\u5B88\u6240\u6709\u5C42\u7EA7\u7684\u5B57\u6BB5\u540D\u3001\u7C7B\u578B\u3001required\u3001\u679A\u4E3E\u3001\u683C\u5F0F\u7EA6\u675F\u548C description\uFF1B\u4E0D\u5F97\u81EA\u884C\u6539\u540D\u6216\u7701\u7565\u5FC5\u586B\u5B57\u6BB5\u3002\u8FD4\u56DE\u7B26\u5408\u8BE5\u5B9A\u4E49\u7684\u6570\u636E\u5BF9\u8C61\uFF0C\u4E0D\u8981\u8FD4\u56DE schema \u672C\u8EAB\u3002
|
|
147
|
+
<output_json_schema>
|
|
148
|
+
${JSON.stringify(t.responseJsonSchema,null,2)}
|
|
149
|
+
</output_json_schema>`:""].filter(Boolean).join(`
|
|
150
|
+
|
|
151
|
+
`);i&&(o.systemInstruction=i),t.responseJsonSchema&&!n&&(o.responseMimeType="application/json",o.responseJsonSchema=t.responseJsonSchema);let r={model:this.model.model,contents:[{role:"user",parts:[t.media.kind==="file-api"?{fileData:{fileUri:t.media.file.uri,mimeType:t.media.file.mimeType},videoMetadata:{fps:t.fps}}:{inlineData:{data:t.media.data,mimeType:t.media.mimeType},videoMetadata:{fps:t.fps}},{text:n?`${t.user}
|
|
152
|
+
|
|
153
|
+
\u53EA\u8FD4\u56DE JSON \u5BF9\u8C61\u672C\u8EAB\uFF0C\u4E0D\u8981\u8F93\u51FA\u4EFB\u4F55\u89E3\u91CA\u3001\u524D\u8A00\u3001Markdown \u4EE3\u7801\u5757\u6216\u5176\u4ED6\u6587\u5B57\u3002`:t.user}]}],config:o},{value:s,attempts:c,failedUsage:a}=await $t(this.provider.maxAttempts,async()=>{let d;try{if(this.client.models.generateContentStream){let h="",_={},y=await this.client.models.generateContentStream(r);for await(let w of y)w.text&&(h+=w.text),_={..._,...w,usageMetadata:w.usageMetadata??_.usageMetadata,promptFeedback:w.promptFeedback??_.promptFeedback,candidates:w.candidates??_.candidates};d={..._,text:h}}else d=await this.client.models.generateContent(r)}catch(h){throw Mc(h,t.signal,"generate",this.apiKey,this.model.provider,this.model.model)}let p=d.candidates?.[0],l=p?.finishReason??"",f=d.promptFeedback?.blockReason??"",u=pw(d.usageMetadata),m={provider:this.model.provider,model:this.model.model,operation:"generate"};if(l==="MAX_TOKENS")throw new P("truncated","Gemini output was truncated.",{usage:u,context:m});if(f)throw new P("content_filtered",`Gemini blocked the prompt (blockReason=${f}).`,{usage:u,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"prompt",provider_reason:Nc(f),...Nc(f)==="UNKNOWN"?{provider_reason_raw:f}:{},safety_ratings:ou(d.promptFeedback?.safetyRatings)}});if(cw.has(l))throw new P("content_filtered",`Gemini filtered the response (finishReason=${l}).`,{usage:u,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"candidate",provider_reason:Nc(l),finish_message:p?.finishMessage,safety_ratings:ou(p?.safetyRatings)}});let g=(d.text??"").trim();if(!g)throw dw.has(l)?new P("invalid_response",`Gemini returned no usable response (finishReason=${l}).`,{usage:u,context:{...m,provider_reason_raw:l,finish_message:p?.finishMessage}}):new P("empty_response",`Gemini returned an empty response (finishReason=${l||"none"}).`,{retryable:!0,usage:u,context:m});if(t.responseJsonSchema)try{let h=n?uw(g):g;return JSON.parse(h),{text:h,finishReason:l,usage:u,raw:d}}catch{throw new P("invalid_response","Gemini returned malformed JSON for a structured video response.",{retryable:!0,usage:u,context:m})}return{text:g,finishReason:l,usage:u,raw:d}});return{text:s.text,finishReason:s.finishReason,attempts:c,usage:Vt(a,s.usage),raw:s.raw}}async release(t,n){if(!(t.kind==="base64"||t.kind==="local-fallback"||t.kind==="local"))try{await this.client.files.delete({name:t.file.name})}catch(o){}}},gw=aw(import.meta.url);function hw(e,t,n){let{GoogleGenAI:o}=gw("@google/genai"),i=new o({apiKey:e,...n?{httpOptions:{baseUrl:n,timeout:t}}:{}}),r=(process.env.https_proxy??process.env.HTTPS_PROXY??process.env.http_proxy??process.env.HTTP_PROXY??"").trim();return r&&!(process.env.NODE_USE_ENV_PROXY??"").trim()&&process.stderr.write(`\u26A0\uFE0F \u68C0\u6D4B\u5230\u4EE3\u7406 ${r}\uFF0C\u4F46\u672A\u8BBE NODE_USE_ENV_PROXY=1\u3002
|
|
154
|
+
Gemini \u4E0A\u4F20\u4F1A\u6210\u529F\u3001\u968F\u540E\u7684\u6587\u4EF6\u8F6E\u8BE2/\u751F\u6210\u4F1A\u6302\uFF08Node \u5185\u7F6E fetch \u9ED8\u8BA4\u4E0D\u8D70\u4EE3\u7406\uFF09\u3002
|
|
155
|
+
\u8BF7\u5728\u547D\u4EE4\u524D\u52A0 NODE_USE_ENV_PROXY=1 \u91CD\u8DD1\u3002
|
|
156
|
+
`),{files:{upload:s=>nu({apiKey:e,filePath:s.file,mimeType:s.config?.mimeType??"video/mp4",timeoutMs:t,proxyUrl:r,baseUrl:n}),get:s=>i.files.get(s),delete:s=>i.files.delete(s)},models:{generateContent:s=>i.models.generateContent(s),generateContentStream:s=>i.models.generateContentStream(s)}}}function ru(e){if(!In(e)||!In(e.usage))return{};let t=e.usage,n=c=>{let a=typeof c=="number"?c:0;return Number.isFinite(a)?a:0},o=In(t.prompt_tokens_details)?t.prompt_tokens_details:{},i=n(t.prompt_tokens),r=n(o.cached_tokens)||n(t.cache_read_input_tokens),s=n(o.cache_creation_tokens)||n(t.cache_creation_input_tokens);return{inputTokens:i+r+s,outputTokens:n(t.completion_tokens),cachedInputTokens:r,cacheCreationTokens:s}}function In(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function yw(e){let t=e.trim().replace(/\/+$/,"");return t.endsWith("/chat/completions")?t:t.endsWith("/v1")?`${t}/chat/completions`:`${t}/v1/chat/completions`}function su(e){return!In(e)||!Array.isArray(e.choices)?null:e.choices.find(In)??null}function au(e){return e&&typeof e.finish_reason=="string"?e.finish_reason:""}function du(e){return e&&In(e.message)?e.message:null}function _w(e){let t=du(e)?.content;return typeof t=="string"?t.trim():Array.isArray(t)?t.flatMap(n=>In(n)&&typeof n.text=="string"?[n.text]:[]).join(`
|
|
157
|
+
`).trim():""}function cu(e){try{return JSON.parse(e)}catch{throw new P("invalid_response","Provider returned invalid JSON.",{details:[e.slice(0,500)]})}}var as=class{constructor(t,n,o){this.provider=t;this.model=n;this.apiKey=o;if(!t.baseUrl)throw new P("endpoint","OpenAI-compatible provider endpoint (baseUrl) is not set \u2014 the built-in gateway reads PROJECT_LITELLM_GATEWAY_BASE_URL.");this.url=yw(t.baseUrl);try{this.host=new URL(this.url).host}catch{this.host=this.url}}provider;model;apiKey;url;host;async post(t,n){let o=await $t(this.provider.maxAttempts,async()=>{let i=AbortSignal.timeout(this.provider.timeoutMs),r=n?AbortSignal.any([n,i]):i,s;try{s=await fetch(this.url,{method:"POST",headers:{authorization:`Bearer ${this.apiKey}`,"content-type":"application/json"},body:JSON.stringify(t),signal:r})}catch(a){let d=a instanceof Error?a.message:String(a),p=r.aborted&&!n?.aborted;throw new P(p?"timeout":"request_failed",p?`OpenAI-compatible request timed out reaching ${this.host}.`:`OpenAI-compatible request could not reach ${this.host}: ${d}`,{retryable:!n?.aborted,details:[d.slice(0,500)]})}let c=await s.text();if(!s.ok){let a=s.status===408||s.status===429||s.status>=500,d=s.status===401||s.status===403?"auth":s.status===429?"rate_limited":"request_failed";throw new P(d,`OpenAI-compatible request to ${this.host} failed (status ${s.status}).`,{retryable:a,details:[`status: ${s.status}`,c.slice(0,500)]})}return cu(c)});return{payload:o.value,attempts:o.attempts,failedUsage:o.failedUsage}}baseBody(t){let n=[];return t.system.trim()&&n.push({role:"system",content:t.system}),n.push({role:"user",content:t.user}),{model:this.model.model,messages:n,...t.responseFormat==="json_object"?{response_format:{type:"json_object"}}:{},...this.model.reasoning?{reasoning_effort:this.model.reasoning}:{},...this.model.temperature!==void 0?{temperature:this.model.temperature}:{}}}async generateText(t){let{payload:n,attempts:o,failedUsage:i}=await this.post(this.baseBody(t),t.signal),r=Vt(i,ru(n));try{let s=su(n),c=au(s);if(c==="length")throw new P("truncated","Provider output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new P("content_filtered",`Provider filtered the response (${c}).`);let a=_w(s);if(!a)throw new P("empty_response","Provider returned an empty text response.");return{text:a,finishReason:c,attempts:o,usage:r,raw:n}}catch(s){throw s instanceof P&&(s.attempts=o,s.usage=r),s}}async generateTool(t){let{payload:n,attempts:o,failedUsage:i}=await this.post({...this.baseBody(t),tools:[{type:"function",function:{name:t.tool.name,description:t.tool.description,parameters:t.tool.inputSchema}}],tool_choice:{type:"function",function:{name:t.tool.name}},parallel_tool_calls:!1},t.signal),r=Vt(i,ru(n));try{let s=su(n),c=au(s);if(c==="length")throw new P("truncated","Provider tool output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new P("content_filtered",`Provider filtered the response (${c}).`);let a=du(s)?.tool_calls;if(!Array.isArray(a))throw new P("invalid_response","Provider did not return a tool call.");for(let d of a){if(!In(d)||!In(d.function))continue;let p=d.function;if(!(p.name!==t.tool.name||typeof p.arguments!="string"))return{input:cu(p.arguments),finishReason:c,attempts:o,usage:r,raw:n}}throw new P("invalid_response","Provider did not return the required tool call.")}catch(s){throw s instanceof P&&(s.attempts=o,s.usage=r),s}}};var rn={model:"ep-20260721150136-98dj9",modelEnv:"ARK_MODEL",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",apiKeyEnv:"ARK_API_KEY",timeoutMs:6e5,maxAttempts:3},ww=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function Ew(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function Lc(e,t,n){let o=Sn[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:Ew(t.baseUrl),model:n.model,thinkingBudgetTokens:n.thinkingBudgetTokens??null});return lu.createHash("sha256").update(i).digest("hex")}function et(e,t,n){return new x(e,{exitCode:b,errorCode:"LLM_CONFIG_INVALID",hint:"Fix the selected LLM configuration and run `scriptctl doctor`.",data:{expected:t,actual:n}})}function Qi(e){return new x("The selected LLM provider credential is not configured.",{exitCode:fe,errorCode:"LLM_CREDENTIAL_MISSING",hint:"Configure the credential and rerun `scriptctl doctor`.",data:{expected:["credential environment variable referenced by the selected provider"],actual:[`provider: ${e}`,"credential: missing"]}})}function Yi(e,t){return wt(Vo(e.failure),{...bi(e.failure),provider:t.provider,model:t.model,retryable:e.failure.retryable,message:e.message})}function cs(e,t){if(t.length===1)return e;let n=Np(t,"All configured model routes failed.");return new P(e.code,n.message,{retryable:n.retryable,classification:Vo(n),context:bi(n),modelFailures:t,details:t.map(Tn)})}function xw(e){return e.protocol==="google-gemini"||/(^|\/)gemini-/i.test(e.model)}function pu(e){let t=e.info.model.slice(0,e.info.model.lastIndexOf("/")+1);return[...new Set([e.info.model,...ww.map(o=>t+o)])].map(o=>{if(o===e.info.model)return e;let i={...e.modelConfig,model:o};return{...e,modelConfig:i,info:{...e.info,model:o,fingerprint:Lc(e.info.task,e.providerConfig,i)}}})}function qi(e,t){return!t?.aborted&&e instanceof P&&e.code!=="cancelled"}var Wi=class{constructor(t,n={}){this.config=t;this.options=n}config;options;adapters=new Map;videoAdapters=new Map;doubaoAdapters=new Map;resolvedRoutes=new Map;usageLog=[];get configSource(){return this.config.source}resolve(t){let n=this.resolvedRoutes.get(t);if(n)return n;let o=Sn[t];if(o.mode==="video"&&this.options.videoProvider?.provider==="doubao"){let l=this.resolveDoubao(t,!0);return this.resolvedRoutes.set(t,l),l}let i=this.config.tasks[t]??o.defaultProfile,r=this.config.models[i];if(!r)throw et("The task route references a missing model profile.",[i],[`task: ${t}`]);let s=this.config.providers[r.provider];if(!s)throw et("The model profile references a missing provider.",[r.provider],[`profile: ${i}`]);if(s.protocol==="openai-compatible"&&!s.baseUrl)throw et("OpenAI-compatible providers require an explicit endpoint \u2014 set the provider's baseUrl, or PROJECT_LITELLM_GATEWAY_BASE_URL for the built-in gateway.",["provider.baseUrl"],[`provider: ${r.provider}`]);if(r.thinkingBudgetTokens!==void 0&&o.mode==="tool")throw et("Anthropic thinking cannot be combined with a forced tool call.",["a text task or a profile without thinking"],[`task: ${t}`,`profile: ${i}`]);if(r.thinkingBudgetTokens!==void 0&&r.thinkingBudgetTokens>=o.maxOutputTokens)throw et("The thinking token budget must be smaller than the task output budget.",[`thinking budget < ${o.maxOutputTokens}`],[`task: ${t}`,`thinking budget: ${r.thinkingBudgetTokens}`]);let c=o.mode==="video"?this.options.videoProvider:void 0,a=c?.baseUrl?{...s,baseUrl:kc(c.baseUrl,"--provider-base-url")}:s,d=c?.model?{...r,model:c.model.trim()}:r;if(c?.model!==void 0&&!d.model)throw et("The video provider model cannot be empty.",["non-empty --provider-model"],["model: empty"]);let p={info:{task:t,profile:i,provider:r.provider,protocol:a.protocol,baseUrl:a.baseUrl,model:d.model,fingerprint:Lc(t,a,d)},providerConfig:a,modelConfig:d};return this.resolvedRoutes.set(t,p),p}route(t){return this.resolve(t).info}routes(){return Ql.map(t=>this.route(t))}emptyUsage(){return{calls:0,succeeded:0,failed:0,reused:0,attempts:0,durationMs:0,inputTokens:0,outputTokens:0,cachedInputTokens:0,cacheCreationTokens:0}}recordReuse(t){let n=new Date().toISOString();this.recordEvent(this.route(t),"reused",n,n,0,{})}usage(){let t=new Map;for(let n of this.usageLog){let o=`${n.task}\0${n.provider}\0${n.protocol}\0${n.model}\0${n.fingerprint}`,i=t.get(o)??{task:n.task,profile:n.profile,provider:n.provider,protocol:n.protocol,baseUrl:n.baseUrl,model:n.model,fingerprint:n.fingerprint,...this.emptyUsage()};n.status==="reused"?i.reused+=1:(i.calls+=1,i[n.status]+=1,i.attempts+=n.attempts,i.durationMs+=n.durationMs,i.inputTokens+=n.inputTokens,i.outputTokens+=n.outputTokens,i.cachedInputTokens+=n.cachedInputTokens,i.cacheCreationTokens+=n.cacheCreationTokens),t.set(o,i)}return[...t.values()]}usageEvents(){return this.usageLog.map(t=>({...t}))}recordEvent(t,n,o,i,r,s,c=0,a){this.usageLog.push({...t,sequence:this.usageLog.length+1,status:n,attempts:c,startedAt:o,endedAt:i,durationMs:r,inputTokens:s.inputTokens??0,outputTokens:s.outputTokens??0,cachedInputTokens:s.cachedInputTokens??0,cacheCreationTokens:s.cacheCreationTokens??0,...a?{errorCode:a}:{}})}async tracked(t,n){let o=Date.now(),i=new Date(o).toISOString();try{let r=await n(),s=Date.now();return this.recordEvent(t,"succeeded",i,new Date(s).toISOString(),s-o,r.usage??{},r.attempts),r}catch(r){let s=Date.now(),c=r instanceof P?r:null;throw this.recordEvent(t,"failed",i,new Date(s).toISOString(),s-o,c?.usage??{},c?.attempts??1,c?.code),r}}resolveDoubao(t,n){let o=n?this.options.videoProvider:void 0,i=n?(o?.model??process.env.ARK_MODEL??"").trim():this.doubaoModel();if(!i)throw et("Doubao requires --provider-model or ARK_MODEL.",["--provider-model <id> or ARK_MODEL"],["model: empty"]);let r={protocol:"openai-compatible",baseUrl:o?.baseUrl?kc(o.baseUrl,"--provider-base-url"):rn.baseUrl,apiKeyEnv:rn.apiKeyEnv,timeoutMs:rn.timeoutMs,maxAttempts:rn.maxAttempts},s={provider:"doubao",model:i};return{info:{task:t,profile:n?"doubao":"doubao-fallback",provider:"doubao",protocol:r.protocol,baseUrl:r.baseUrl,model:i,fingerprint:Lc(t,r,s)},providerConfig:r,modelConfig:s}}doubaoRoute(t){return this.resolveDoubao(t,!1).info}adapter(t){let n=`${t.info.provider}\0${t.info.model}\0${t.modelConfig.thinkingBudgetTokens??""}`,o=this.adapters.get(n);if(o)return o;let i=(process.env[t.providerConfig.apiKeyEnv]??"").trim();if(!i)throw Qi(t.info.provider);let r=t.providerConfig.protocol==="anthropic"?new ts(t.providerConfig,t.modelConfig,i):new as(t.providerConfig,t.modelConfig,i);return this.adapters.set(n,r),r}videoAdapter(t){if(t.providerConfig.protocol!=="google-gemini")throw et("Video tasks require a google-gemini provider.",["provider.protocol: google-gemini"],[`provider: ${t.info.provider}`,`protocol: ${t.providerConfig.protocol}`]);let n=t.info.model,o=`${t.info.provider} ${t.providerConfig.baseUrl??"official"} ${n}`,i=this.videoAdapters.get(o);if(i)return i;let r=this.videoCredential(t);if(!r)throw Qi(t.info.provider);let s=new ss(t.providerConfig,t.modelConfig,r);return this.videoAdapters.set(o,s),s}videoCredential(t){let n=this.options.videoProvider?.apiKey,o=n?.kind==="literal"?n.value.trim():n?.kind==="env"?(process.env[n.name]??"").trim():(process.env[t.providerConfig.apiKeyEnv]??"").trim();if(!o)throw Qi(t.info.provider);return o}videoPort(t){let n=Sn[t];if(n.mode!=="video")throw et("The task does not support video generation.",["video task"],[`task: ${t}`]);let o=this.resolve(t);if(this.options.videoProvider?.provider==="doubao"){let r=this.doubaoAdapter(o);if(!r)throw Qi("doubao");return{prepare:async(s,c,a,d)=>{if(a!=="file-api")throw et("Doubao requires file-api upload mode.",["file-api"],[a]);return d?.throwIfAborted(),{kind:"local",path:s,mimeType:c}},generate:s=>{if(s.media.kind!=="local")throw et("Doubao requires locally prepared video.",["local media"],[s.media.kind]);s.signal?.throwIfAborted();let{path:c,mimeType:a}=s.media;return this.tracked(o.info,()=>r.run({localPath:c,localMime:a,user:s.user,fps:s.fps,maxOutputTokens:n.maxOutputTokens,...s.system?{system:s.system}:{},...s.responseJsonSchema?{responseJsonSchema:s.responseJsonSchema}:{},...s.signal?{signal:s.signal}:{}}))},release:async()=>{}}}if(o.providerConfig.protocol!=="google-gemini")throw et("Video tasks require a google-gemini provider.",["provider.protocol: google-gemini"],[`provider: ${o.info.provider}`,`protocol: ${o.providerConfig.protocol}`]);let i=this.videoAdapter(o);return{prepare:async(r,s,c,a)=>{let d=Date.now();try{return await i.prepare(r,s,c,a)}catch(p){if(!qi(p,a)||!this.doubaoAdapter())throw p;return this.recordEvent(o.info,"failed",new Date(d).toISOString(),new Date().toISOString(),Date.now()-d,p.usage,p.attempts,p.code),{kind:"local-fallback",path:r,mimeType:s,primaryFailure:Yi(p,o.info)}}},release:(r,s)=>r.kind==="local-fallback"?Promise.resolve():i.release(r,s),generate:async r=>{if(r.signal?.throwIfAborted(),r.media.kind==="local-fallback")return this.generateDoubaoVideo(t,r,[r.media.primaryFailure]);let s=pu(o),c=[];for(let[a,d]of s.entries()){r.signal?.throwIfAborted();try{return await this.tracked(d.info,()=>this.videoAdapter(d).generate({...r,maxOutputTokens:n.maxOutputTokens}))}catch(p){if(!qi(p,r.signal))throw p;let l=Yi(p,d.info);c.push(l);let f=s[a+1];if(f){process.stderr.write(`\u21AA\uFE0F ${d.info.model} \u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${f.info.model} (${Tn(l)})
|
|
158
|
+
`);continue}if(!this.doubaoAdapter()||!r.localPath)throw cs(p,c);return this.generateDoubaoVideo(t,r,c)}}throw new Error("Gemini model routes cannot be empty.")}}}async generateDoubaoVideo(t,n,o){let i=this.doubaoAdapter();if(!i)throw Qi("doubao");let r=n.media.kind==="local-fallback"?n.media.path:n.localPath;if(!r)throw et("Doubao video fallback requires the local video.",["localPath"],["localPath: missing"]);let s=n.localMime??(n.media.kind==="file-api"?n.media.file.mimeType:n.media.mimeType),c=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F Gemini \u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${c.model}
|
|
159
|
+
`);try{return await this.tracked(c,()=>i.run({localPath:r,localMime:s,user:n.user,fps:n.fps,maxOutputTokens:Sn[t].maxOutputTokens,...n.system?{system:n.system}:{},...n.responseJsonSchema?{responseJsonSchema:n.responseJsonSchema}:{},...n.signal?{signal:n.signal}:{}}))}catch(a){throw qi(a,n.signal)?cs(a,[...o,Yi(a,c)]):a}}doubaoAdapter(t){return this.arkAdapter(t)}doubaoTextAdapter(){return this.arkAdapter()}arkAdapter(t){let n=t?this.videoCredential(t):(process.env[rn.apiKeyEnv]??"").trim();if(!n)return null;let o=t?.info.model??this.doubaoModel(),i=t?.providerConfig.baseUrl??rn.baseUrl,r=`doubao ${i} ${o}`,s=this.doubaoAdapters.get(r);if(s)return s;let c=new is(o,rn.timeoutMs,rn.maxAttempts,n,i);return this.doubaoAdapters.set(r,c),c}doubaoModel(){return(process.env[rn.modelEnv]??"").trim()||rn.model}async withTextFallback(t,n,o){let i=this.resolve(t),r=xw(i.info),s=r?pu(i):[i],c=[];for(let[a,d]of s.entries()){n?.throwIfAborted();let p=this.adapter(d);try{return await this.tracked(d.info,()=>o(p))}catch(l){if(!qi(l,n)||!r&&l.code!=="content_filtered")throw l;let f=Yi(l,d.info);c.push(f);let u=s[a+1];if(u){process.stderr.write(`\u21AA\uFE0F ${d.info.model} \u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${u.info.model} (${Tn(f)})
|
|
160
|
+
`);continue}let m=this.doubaoTextAdapter();if(!m)throw cs(l,c);let g=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F \u4E3B\u6A21\u578B\u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${g.model}
|
|
161
|
+
`);try{return await this.tracked(g,()=>o(m))}catch(h){throw qi(h,n)?cs(h,[...c,Yi(h,g)]):h}}}throw new Error("Text model routes cannot be empty.")}async generateText(t,n){let o=Sn[t];if(o.mode!=="text")throw et("The task does not support text generation.",["text task"],[`task: ${t}`]);return this.withTextFallback(t,n.signal,i=>i.generateText({...n,maxOutputTokens:o.maxOutputTokens}))}async generateTool(t,n){let o=Sn[t];if(o.mode!=="tool")throw et("The task does not support tool generation.",["tool task"],[`task: ${t}`]);return this.withTextFallback(t,n.signal,i=>i.generateTool({...n,maxOutputTokens:o.maxOutputTokens}))}};function uu(e,t){return new Wi(Yo(e),t)}var Iw=Sw(import.meta.url);function ds(e){try{return Iw.resolve(e),!0}catch{return!1}}function Aw(e){let t=!1;try{bt.statSync(e).isDirectory()&&(bt.accessSync(e,bt.constants.W_OK),t=!0)}catch{t=!1}let n=!1;try{n=bt.statSync(_o.join(e,"script.json")).isFile()}catch{n=!1}return{writable:t,hasScript:n}}function kw(){return _o.join(_o.dirname(_o.resolve("workspace")),"output")}function fu(e={}){let t=wc(),n=[],o=new Set;for(let O of t)try{if(!bt.existsSync(O)||!bt.statSync(O).isFile())continue;let j=bt.realpathSync(O);if(o.has(j))continue;o.add(j),n.push(O)}catch{}let i=typeof e.llm_config=="string"?e.llm_config.trim():"",r=Yo(i||void 0),c=new Wi(r).routes(),a=Object.entries(r.providers).map(([O,j])=>({alias:O,configured:!!(process.env[j.apiKeyEnv]??"").trim(),env:j.apiKeyEnv})),d=Object.entries(r.providers).filter(([,O])=>O.protocol==="openai-compatible").map(([O,j])=>{let Z="not set";if(j.baseUrl)try{Z=new URL(j.baseUrl).host}catch{Z=j.baseUrl}return{alias:O,host:Z}}),{mode:p}=Fl(),l=(process.env.SCRIPTCTL_OUTPUT_DIR??"").trim()||kw(),f=p==="local"?Aw(l):null,u=!!process.env.AWB_BASE_URL,m=!!process.env.LINGJING_AWB_ACCESS_KEY,g=!!process.env.SANDBOX_PROJECT_GROUP_NO,h={"@anthropic-ai/sdk":ds("@anthropic-ai/sdk"),"@google/genai":ds("@google/genai"),jszip:ds("jszip"),"fast-xml-parser":ds("fast-xml-parser")},_=Object.entries(h).filter(([,O])=>!O).map(([O])=>O),y=process.versions.node,w=`env_file: ${n[0]??"missing"}`,I=O=>O?"configured":"not configured",A=[`node: ${y}`,"storage: local-filesystem",w,`llm config: ${r.source}`,`llm routes: ${c.length}`,...a.map(O=>`llm provider ${O.alias}: ${I(O.configured)}`),...d.map(O=>`llm provider ${O.alias} endpoint: ${O.host}`)];p===null?A.push("output target: not configured"):p==="local"&&f?(A.push(`output writable: ${I(f.writable)}`),A.push(`output snapshot: ${f.hasScript?"present":"absent"}`)):(A.push(`gateway endpoint: ${I(u)}`),A.push(`gateway access credential: ${I(m)}`),A.push(`gateway project identifier: ${I(g)}`));for(let[O,j]of Object.entries(h))A.push(`dependency ${O}: ${j?"ok":"missing"}`);let k=[];_.length>0&&k.push("Install missing CLI dependencies (see above)."),a.some(O=>!O.configured)&&k.push("Configure every credential referenced by the selected LLM configuration."),d.some(O=>O.host==="not set")&&k.push("An openai-compatible provider has no endpoint \u2014 set PROJECT_LITELLM_GATEWAY_BASE_URL (built-in gateway) or the provider's baseUrl."),p===null?k.push("Configure an output target before running `publish` / script CRUD."):p==="local"?f&&!f.writable&&k.push("Output target is not writable; check directory permissions."):(!u||!m||!g)&&k.push("Configure gateway credentials before running `publish` / script CRUD against the remote project."),k.length===0&&k.push("Environment looks ready.");let[D,R]=y.split(".").map(O=>parseInt(O,10)),S=(D??0)>20||(D??0)===20&&(R??0)>=0,M=p===null?{configured:!1}:p==="local"?{dir:{ok:!!f?.writable,writable:!!f?.writable,hasScript:!!f?.hasScript}}:{endpoint:{ok:u},access:{ok:m},project:{ok:g}},$={node:{version:y,ok:S},storage:{backend:"local-filesystem",ok:!0},env:{ok:n.length>0,paths:n},llm:{config_source:r.source,...r.sourcePath?{config_path:r.sourcePath}:{},providers:a.map(O=>({alias:O.alias,ok:O.configured,credential_env:O.env,...d.find(j=>j.alias===O.alias)?{endpoint:d.find(j=>j.alias===O.alias).host}:{}})),profiles:Object.keys(r.models),routes:c.map(O=>({task:O.task,profile:O.profile,provider:O.provider,protocol:O.protocol,model:O.model}))},output:M,dependencies:h};return[{text:[...A,...k].join(`
|
|
162
|
+
`),data:{checks:$}},B]}import{spawn as bw}from"node:child_process";var ps="@lingjingai/scriptctl",vw=`${ps}@latest`,Tc="npm";function Ow(){return Qo()}function Rw(e){let t=/^(\d+)\.(\d+)\.\d+/.exec(e);return t?`${ps}@~${t[1]}.${t[2]}.0`:null}function Nw(e){return["install","-g",e]}function Mw(e,t){return[e,...t].join(" ")}function Lw(e,t){return e.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0).slice(-t)}function Tw(e,t){return new Promise(n=>{let o=bw(e,[...t],{stdio:["ignore","pipe","pipe"]}),i=[],r=[];o.stdout.setEncoding("utf-8"),o.stderr.setEncoding("utf-8"),o.stdout.on("data",s=>i.push(s)),o.stderr.on("data",s=>r.push(s)),o.once("error",s=>{n({exitCode:null,signal:null,stdout:i.join(""),stderr:r.join(""),error:s})}),o.once("close",(s,c)=>{n({exitCode:s,signal:c,stdout:i.join(""),stderr:r.join("")})})})}async function mu(e,t=Tw,n=Ow){let o=!!e.patch,i=n(),r=o?Rw(i):vw;if(!r)throw new x(`Cannot compute a patch update range from version ${i}.`,{exitCode:fe,errorCode:"UPDATE_VERSION_INVALID",hint:"Run `scriptctl update` without --patch to install the latest version.",data:{version:i}});let s=[...Nw(r)],c=Mw(Tc,s),a={package:ps,package_spec:r,command:Tc,args:s,command_line:c};if(e.dry_run)return[{text:[`package: ${ps}`,`command: ${c}`,"dry-run: no update performed"].join(`
|
|
163
|
+
`),data:{op:"update",changed:!1,update:a}},B];let d=await t(Tc,s);if(d.error)throw new x(`Failed to start npm: ${d.error.message}`,{exitCode:fe,errorCode:"UPDATE_SPAWN_FAILED",hint:`Run '${c}' after fixing the npm installation.`,data:{update:a,cause:d.error.message}});if(d.exitCode!==B){let f=[`exit: ${d.exitCode===null?`signal ${d.signal??"unknown"}`:String(d.exitCode)}`,...Lw(d.stderr,5).map(u=>`stderr: ${u}`)];throw new x("npm could not update scriptctl.",{exitCode:fe,errorCode:"UPDATE_COMMAND_FAILED",hint:`Run '${c}' after resolving the npm error.`,data:{update:a,actual:f}})}let p=n(),l=p!==i;return[{text:l?`Updated ${i} \u2192 ${p}.`:`Already up to date (${p}).`,data:{op:"update",changed:l,status:l?"updated":"already_latest",previous_version:i,version:p}},B]}function gu(e,t){e.command("doctor").description("Check configuration and runtime dependencies").option("--llm-config <path>","LLM configuration file").action(Y(fu,t)),e.command("update").description("Update scriptctl to the latest release").option("-n, --dry-run","Show the update without installing").option("--patch","Allow a patch-level update").action(Y(mu,t));let n=e.command("changelog [version]").description("Show release notes").option("--from <version>","Start version").option("--to <version>","End version").option("--unreleased","Show unreleased changes").action(Y(Kl,t));Ie(n,["Release version"])}import*as Zi from"node:fs";import*as us from"node:path";import{fileURLToPath as Cw,pathToFileURL as Uw}from"node:url";var Pw="review-agent";function Vw(e,t){let n=t||Pw,o=e.models[n];if(!o)throw new x(`LLM profile "${n}" is not defined.`,{exitCode:b,errorCode:"REVIEW_PROFILE_UNKNOWN",hint:`Define it under models, or pick one of: ${Object.keys(e.models).join(", ")}.`,data:{expected:["a defined models entry"],actual:[n]}});let i=e.providers[o.provider];if(!i)throw new x(`Provider "${o.provider}" is not defined.`,{exitCode:b,errorCode:"REVIEW_PROVIDER_UNKNOWN",hint:`Available providers: ${Object.keys(e.providers).join(", ")}.`,data:{expected:["a defined providers entry"],actual:[o.provider]}});let r=(process.env[i.apiKeyEnv]??"").trim();if(!r)throw new x(`${i.apiKeyEnv} is not set.`,{exitCode:b,errorCode:"REVIEW_API_KEY_MISSING",hint:`Export ${i.apiKeyEnv} for provider ${o.provider}.`,data:{expected:[i.apiKeyEnv],actual:["<empty>"]}});return{provider:o.provider,model:o.model,baseUrl:i.baseUrl,apiKey:r,maxAttempts:i.maxAttempts}}async function hu(){let e=us.dirname(Cw(import.meta.url)),t=us.join(e,"review-agent.js"),n=Zi.existsSync(t)?Uw(t).href:"@lingjingai/review-agent";try{return await import(n)}catch(o){throw new x("The review agent is not installed.",{exitCode:fe,errorCode:"REVIEW_AGENT_MISSING",hint:"Reinstall scriptctl without --omit=optional, or install @mastra/core and @ai-sdk/google.",data:{expected:["@lingjingai/review-agent"],actual:[String(o.message).slice(0,200)]}})}}function yu(e){let t=e.trim();if(!t)return;let n=t.split(",").map(o=>Number(o.trim()));if(n.some(o=>!Number.isInteger(o)||o<1))throw new x("--episodes takes a comma-separated list of 1-based episode numbers.",{exitCode:b,errorCode:"REVIEW_EPISODES_INVALID",hint:"For example: --episodes 1,2,5",data:{expected:["1-based episode numbers"],actual:[t]}});return n}function ls(e,t,n){let o=e[t];if(o===void 0)return n;let i=Number(o);if(!Number.isFinite(i)||i<=0)throw new x(`--${t.replace(/_/g,"-")} must be a positive number.`,{exitCode:b,errorCode:"REVIEW_OPTION_INVALID",hint:`Pass a positive number for --${t.replace(/_/g,"-")}.`,data:{expected:["a positive number"],actual:[String(o)]}});return i}async function _u(e){let t=Yo(v(e.llm_config).trim()||void 0),n=v(e.model).trim(),o=Vw(t,n);if(e.check){let l=typeof(await hu()).reviewScript=="function";return[{text:l?`ready: ${o.provider}/${o.model}`:"the review agent bundle is present but exports no reviewScript",data:{ready:l,provider:o.provider,model:o.model,llm_config:t.sourcePath??"builtin"}},l?B:fe]}let i=xe(e);if(!Zi.existsSync(i))throw new x("Local script file not found.",{exitCode:b,errorCode:"SCRIPT_NOT_FOUND",hint:"Run `scriptctl checkout`, `scriptctl create`, or pass --script-path to an existing script.",data:{expected:["existing local script JSON"],actual:[i]}});let r=(Array.isArray(e.video)?e.video:[]).map(p=>p.trim()).filter(p=>p.length>0),s=r.filter(p=>!Zi.existsSync(p));if(s.length>0)throw new x("A --video path does not exist.",{exitCode:b,errorCode:"REVIEW_SOURCE_NOT_FOUND",hint:"Pass --video once per episode, in episode order.",data:{expected:["existing video files"],actual:s.slice(0,5)}});let c=v(e.source_path).trim();if(c&&!Zi.existsSync(c))throw new x("Video source not found.",{exitCode:b,errorCode:"REVIEW_SOURCE_NOT_FOUND",hint:"Pass -s to a video file or a directory of per-episode videos, or omit it for a script-only review.",data:{expected:["existing video file or directory"],actual:[c]}});let{reviewScript:a}=await hu(),d=p=>process.stdout.write(JSON.stringify(p)+`
|
|
164
|
+
`);try{await a({scriptPath:i,...c?{source:c}:{},...r.length>0?{videos:r}:{},...yu(v(e.episodes))?{episodes:yu(v(e.episodes))}:{},concurrency:ls(e,"concurrency",5),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,apiKey:o.apiKey,maxAttempts:o.maxAttempts,model:o.model,mediaModel:o.model,...o.baseUrl?{baseUrl:o.baseUrl}:{},maxSteps:ls(e,"max_steps",300),mediaBudget:ls(e,"media_budget",1),episodeTimeoutMs:ls(e,"episode_timeout_ms",8*6e4),onEvent:d})}catch(p){throw p instanceof x?p:new x("Review failed.",{exitCode:fe,errorCode:"REVIEW_FAILED",hint:"Read the error details, NDJSON asr-compared/episode reports and .review/asr/ evidence before retrying.",data:{expected:["a completed review run"],actual:[p instanceof Error?p.message:String(p)]}})}return[{text:"",data:{}},B]}function wu(e,t){se(e.command("review"),"write").description("\u6D3E\u53D1 agent \u5BA1\u6838\u5267\u672C\uFF1A\u7ED9 -s \u5C31\u6309\u539F\u89C6\u9891\u62C9\u7247\u6838\u5BF9\uFF0C\u4E0D\u7ED9\u5C31\u7EAF\u5267\u672C\u5BA1\u6838").option("-s, --source-path <path>","\u539F\u89C6\u9891\u6587\u4EF6\u6216\u6BCF\u96C6\u4E00\u4E2A\u89C6\u9891\u7684\u76EE\u5F55").option("--video <path>","\u7B2C N \u96C6\u7684\u89C6\u9891\uFF1B\u6309\u96C6\u987A\u5E8F\u91CD\u590D\u4F20\uFF0C\u8986\u76D6 -s \u7684\u76EE\u5F55\u6392\u5E8F",(n,o)=>[...o,n],[]).option("--episodes <list>","\u53EA\u5BA1\u8FD9\u4E9B\u96C6\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u9ED8\u8BA4\u5168\u5267\uFF09").option("--concurrency <n>","\u540C\u65F6\u5728\u98DE\u7684\u96C6\u6570",Number).option("--episode-timeout-ms <ms>","\u5355\u96C6\u8D85\u65F6\uFF1B\u5230\u70B9\u6536\u5C3E\u5E76\u4FDD\u7559\u5DF2\u8BB0\u5F55\u7684\u7ED3\u8BBA",Number).option("--max-steps <n>","\u5355\u96C6\u6700\u591A\u51E0\u6B65\u5DE5\u5177\u8C03\u7528",Number).option("--media-budget <n>","\u5355\u96C6\u6700\u591A\u51E0\u6B21\u89C6\u9891\u6838\u5BF9",Number).option("--converge-only","\u53EA\u6267\u884C\u5168\u5267\u6536\u655B\uFF0C\u4E0D\u91CD\u65B0\u5BA1\u6838\u5404\u96C6").option("--no-converge","\u8DF3\u8FC7\u5168\u5267\u6536\u655B\u9636\u6BB5").option("--model <profile>","\u8986\u76D6 LLM profile\uFF08\u9ED8\u8BA4 review-agent\uFF09").option("--llm-config <path>","LLM configuration file").option("--check","\u53EA\u68C0\u67E5\u6A21\u578B\u4E0E agent \u662F\u5426\u5C31\u7EEA\uFF0C\u4E0D\u5BA1\u6838").action(Y(_u,t))}import*as Qu from"node:fs";import*as Fn from"node:fs";var Eu=null,$w=0;function z(e,t){Eu&&Eu.push({fn:e,note:t,ms:Math.round((performance.now()-$w)*100)/100})}var Dw=[["actor","actors","actor"],["location","locations","location"],["prop","props","prop"]];function Hn(e){return Array.isArray(e)?e:[]}function _e(e){return typeof e=="string"?e:""}function An(e,t,n,o){if(t){if(e.has(t)&&e.get(t)!==n){o.add(t);return}e.set(t,n)}}function Uc(e){return fs(JSON.parse(Fn.readFileSync(e,"utf8")),e)}function fs(e,t=""){let n=e?.version;if(n!==3&&n!==4)throw new Error(`Unsupported script.version: ${JSON.stringify(n)} (expected 3 or 4)`);let o={version:n,path:t,raw:e,episodes:[],assets:[],byId:new Map,eps:new Map,scenes:new Map,actions:new Map};for(let[a,d,p]of Dw)for(let l of Hn(e[d])){let f={id:_e(l[`${p}_id`]),kind:a,name:_e(l[`${p}_name`]),aliases:Hn(l.aliases).map(_e).filter(Boolean),importance:_e(l.importance),desc:_e(l.description),states:Hn(l.states).map(u=>({id:_e(u.state_id),name:_e(u.state_name),desc:_e(u.description)})),raw:l,label:""};o.assets.push(f),o.byId.set(f.id,f)}let i=new Map;for(let a of o.assets)for(let d of[a.name,...a.aliases])i.set(d,(i.get(d)??0)+1);for(let a of o.assets)a.label=[a.name,...a.aliases].filter(d=>i.get(d)===1).sort((d,p)=>d.length-p.length)[0]??a.name;let r=new Set,s=0,c=0;Hn(e.episodes).forEach((a,d)=>{let p={anchor:String(d+1),id:_e(a.episode_id),no:d+1,title:_e(a.title)||void 0,synopsis:_e(a.synopsis)||void 0,scenes:[],raw:a};Hn(a.scenes).forEach((l,f)=>{s++;let u={anchor:n===4?_e(l.scene_id):`${d+1}-${f+1}`,id:_e(l.scene_id),no:f+1,gno:s,env:l.environment??{},location:Cc(l.location,"location_id"),actors:Hn(l.actors).map(m=>Cc(m,"actor_id")).filter(Boolean),props:Hn(l.props).map(m=>Cc(m,"prop_id")).filter(Boolean),actions:[],raw:l,ep:p};Hn(l.actions).forEach((m,g)=>{c++;let h={anchor:n===4?_e(m.action_id):`${d+1}-${f+1}-${g+1}`,no:g+1,gno:c,type:_e(m.type)||"action",content:_e(m.content),speaker:Gw(m.speaker),paren:typeof m.parenthetical=="string"?m.parenthetical:typeof m.emotion=="string"?m.emotion:void 0,ts:_e(m.extend?.timestamp)||void 0,raw:m,scene:u};u.actions.push(h),An(o.actions,h.anchor,h,r),An(o.actions,`${d+1}-${f+1}-${g+1}`,h,r),n===3&&An(o.actions,`${p.id}/${u.id}#${g}`,h,r)}),p.scenes.push(u),An(o.scenes,u.anchor,u,r),An(o.scenes,`${d+1}-${f+1}`,u,r),An(o.scenes,`${p.id}/${u.id}`,u,r),An(o.scenes,u.id,u,r)}),o.episodes.push(p),An(o.eps,String(d+1),p,r),An(o.eps,p.id,p,r)});for(let a of r)o.actions.delete(a),o.scenes.delete(a),o.eps.delete(a);return z(t?"model.load":"model.parse",`v${n} \xB7 ${o.episodes.length} ep \xB7 ${o.scenes.size} scene keys \xB7 ${o.actions.size} action keys \xB7 ${o.assets.length} assets \xB7 ${r.size} ambiguous keys dropped`),o}function Cc(e,t){if(!e||typeof e!="object")return null;let n=_e(e[t]);if(!n)return null;let o=Array.isArray(e.state_ids)?e.state_ids.map(_e):e.state_id?[_e(e.state_id)]:[];return{id:n,states:o,raw:e}}function Gw(e){if(!(!e||typeof e!="object")){if(e.actor_id)return{id:_e(e.actor_id),state:_e(e.state_id)||void 0};if(e.kind)return{kind:_e(e.kind),label:_e(e.label)||void 0}}}function Re(e,t){let n=t.trim();if(!n)return{t:"script",doc:e};let o=n.indexOf("/");if(o>0&&!e.scenes.has(n)){let p=n.slice(0,o),l=n.slice(o+1),f=e.byId.get(p)??Bw(e,p);if(f){let u=f.states.filter(m=>m.id===l||m.name===l);if(u.length===1)return z("resolve",`"${n}" -> state ${f.id}/${u[0].id} "${u[0].name}"`),{t:"state",asset:f,state:u[0]};throw u.length>1?new Error(`${f.name} has ${u.length} states named "${l}"; address it by state id`):new Error(`${f.name} has no state "${l}" (has: ${f.states.map(m=>`${m.id}(${m.name})`).join(", ")})`)}}let i=e.actions.get(n);if(i)return z("resolve",`"${n}" -> action map hit -> ${i.anchor}`),{t:"action",action:i};let r=e.scenes.get(n);if(r)return z("resolve",`"${n}" -> scene map hit -> ${r.anchor}`),{t:"scene",scene:r};let s=e.eps.get(n);if(s)return z("resolve",`"${n}" -> episode map hit -> ${s.id}`),{t:"ep",ep:s};let c=e.byId.get(n);if(c)return z("resolve",`"${n}" -> asset id hit -> ${c.name}`),{t:"asset",asset:c};let a=e.assets.filter(p=>p.name===n||p.aliases.includes(n));if(a.length===1)return z("resolve",`"${n}" -> exact name/alias -> ${a[0].id} ${a[0].name}`),{t:"asset",asset:a[0]};if(a.length>1)throw new Error(`Ambiguous name "${n}": ${a.map(p=>`${p.id}(${p.name})`).join(", ")}`);let d=e.assets.filter(p=>p.name.includes(n)||p.aliases.some(l=>l.includes(n)));if(d.length===1)return z("resolve",`"${n}" -> substring name match -> ${d[0].id} ${d[0].name}`),{t:"asset",asset:d[0]};throw new Error(`Unknown address "${n}". Use an ordinal (3 / 3-2 / 3-2-5), a canonical ID, or an asset name.`+(d.length?` Did you mean: ${d.slice(0,5).map(p=>p.name).join(", ")}?`:""))}function Bw(e,t){let n=e.assets.filter(i=>i.name===t||i.aliases.includes(t));if(n.length===1)return n[0];if(n.length>1)return;let o=e.assets.filter(i=>i.name.includes(t)||i.aliases.some(r=>r.includes(t)));return o.length===1?o[0]:void 0}function wo(e,t){return e.byId.get(t)?.label||t}function Eo(e,t,n){return e.byId.get(t)?.states.find(i=>i.id===n)?.name||n}function Qn(e){return e.episodes.flatMap(t=>t.scenes.flatMap(n=>n.actions))}var Jw={ep:"episode",scn:"scene",ac:"action",act:"actor",loc:"location",prp:"prop",st:"state"};function Yn(e,t){let n=Oi(Jw[e],t);return t.add(n),z("newId",`${n} (collision-checked against ${t.size-1} live ids)`),n}function we(e){if(Object.assign(e,fs(e.raw,e.path)),!e.path){z("save","skipped: document is not bound to a file");return}xu(e,e.path)}function xu(e,t=e.path){if(!t)throw new Error("commit needs a path: this document is not bound to a file");let n=`${t}.tmp-${process.pid}`;Fn.writeFileSync(n,JSON.stringify(e.raw,null,2)+`
|
|
165
|
+
`),Fn.renameSync(n,t),z("commit",`${Fn.statSync(t).size} bytes -> ${t} (tmp + atomic rename)`)}var Kw={system:"\u65C1\u767D",broadcast:"\u5E7F\u64AD",offscreen:"\u753B\u5916",group:"\u7FA4\u58F0"},Su="\u5FC3\u58F0";function jw(e,t){if(t.kind)return Kw[t.kind]??t.kind;let n=wo(e,t.id);return t.state?`${n}\xB7${Eo(e,t.id,t.state)}`:n}function Xi(e,t,n,o={}){let i=(o.plain?"":t.anchor).padEnd(n),r=o.timestamps?`${t.ts??"[\u65F6\u95F4\u7F3A\u5931]"} `:!o.plain&&t.ts?`${t.ts} `:"",s=(()=>{if(t.type==="transition")return`\u2192 ${t.content}`;if(t.type==="dialogue"||t.type==="inner_thought"){let a=t.speaker?jw(e,t.speaker):"?",d=[t.type==="inner_thought"?Su:"",t.paren??""].filter(Boolean);return`${t.speaker?.kind&&t.speaker.label?`${a}\xB7${t.speaker.label}`:a}${d.length?`(${d.join("/")})`:""}\uFF1A${t.content}`}return t.content})(),c=`${i}${i?" ":""}`;return`${o.timestamps?r+c:c+r}${s}`.replace(/\n/g,"\\n")}function Pc(e,t){let n=wo(e,t.id);return t.states.length===1&&t.states[0]==="default"?n:`${n}(${t.states.map(o=>Eo(e,t.id,o)).join("+")})`}function Wo(e,t){let n=[t.env?.space,t.env?.time].filter(Boolean).join("/").toUpperCase(),o=t.location?Pc(e,t.location):"\u2014",i=`## ${t.ep.no}-${t.no} ${t.anchor===`${t.ep.no}-${t.no}`?t.id:t.anchor} ${n||"\u2014"} ${o} ${t.actions.length} actions`,r=t.actors.map(a=>Pc(e,a)).join(", "),s=t.props.map(a=>Pc(e,a)).join(", "),c=[r&&`cast: ${r}`,s&&`props: ${s}`].filter(Boolean).join(" ");return c?`${i}
|
|
166
|
+
# ${c}`:i}function Vc(e,t,n={}){let o=n.plain?0:Math.max(0,...t.actions.map(i=>i.anchor.length));return z("formatScene",`${t.anchor}: ${t.actions.length} actions, gutter=${o}`),[Wo(e,t),...t.actions.map(i=>Xi(e,i,o,n))].join(`
|
|
167
|
+
`)}var zw=/^([A-Za-z][A-Za-z0-9_]*|\d+(?:-\d+){0,2})\s\s+/;function Iu(e,t){let n=e.trimEnd();if(!n.trim())return null;let o,i=n.match(zw);i&&(o=i[1],n=n.slice(i[0].length)),n=n.replace(/\\n/g,`
|
|
168
|
+
`);let r,s=n.match(/^((?:\d+:)?\d+:\d{2}(?:\.\d{1,3})?)\s/);if(s&&(r=s[1],n=n.slice(s[0].length)),n.startsWith("\u2192"))return{anchor:o,ts:r,type:"transition",content:n.slice(1).trim()};let c=n.indexOf("\uFF1A");if(c>0){let d=n.slice(0,c).match(/^([^()]+)(?:\((.*)\))?$/);if(d&&t(d[1].trim())){let p=(d[2]??"").split("/").map(u=>u.trim()).filter(Boolean),l=p[0]===Su,f=(l?p.slice(1):p).join("/");return{anchor:o,ts:r,type:l?"inner_thought":"dialogue",speakerName:d[1].trim(),paren:f||void 0,content:n.slice(c+1).trim()}}}return{anchor:o,ts:r,type:"action",content:n.trim()}}var Hw=/^(scn[1-9A-HJ-NP-Za-km-z]{6}|scn_\d+)$/,Fw=/^[A-Z.\/]+$/,Qw=/^\d+\s+actions?$/,Yw={EXT:"exterior",EXTERIOR:"exterior",INT:"interior",INTERIOR:"interior"};function Au(e){let t=e.findIndex(i=>i.startsWith("##"));if(t<0)return{body:e};let n=e[t+1]?.startsWith("#")&&!e[t+1].startsWith("##"),o=e.filter((i,r)=>r!==t&&!(n&&r===t+1));return{head:e[t],meta:n?e[t+1]:void 0,body:o}}function $c(e,t){let n={env:{},cast:[],props:[]},o=e.replace(/^##\s*/,"").split(/\s{2,}/).map(i=>i.trim()).filter(Boolean);for(let i of o)if(!(/^\d+-\d+$/.test(i)||Qw.test(i))){if(Hw.test(i)){n.anchor=i;continue}if(Fw.test(i)&&i!=="\u2014"){let[r,s]=i.split("/");r&&(n.env.space=Yw[r]??r.toLowerCase()),s&&(n.env.time=s.toLowerCase());continue}i!=="\u2014"&&n.location===void 0&&(n.location=i)}if(t){let i=t.replace(/^#\s*/,""),r=i.match(/cast:\s*([^]*?)(?:\s\sprops:|$)/),s=i.match(/props:\s*([^]*)$/),c=a=>(a??"").split(",").map(d=>d.trim()).filter(Boolean);n.cast=c(r?.[1]),n.props=c(s?.[1])}return n}function ku(e){let t=e.trim().match(/^(.*?)\s*\(([^)]*)\)$/);return t?{name:t[1].trim(),states:t[2].split("+").map(n=>n.trim()).filter(Boolean)}:{name:e.trim(),states:[]}}function Zo(e,t){throw Object.assign(new Error(e),t)}function Gc(e){return e.episodes.flatMap(t=>t.scenes.flatMap(n=>n.actions.map((o,i)=>({address:e.version===4?o.anchor:`${t.id}/${n.id}#${i}`,episodeId:t.id,episodeNo:t.no,timestamp:o.ts}))))}function Dc(e){try{return Un(e.timestamp??"")}catch(t){if(!(t instanceof Ye))throw t;return Zo(`Action ${e.address} has an invalid stored timestamp.`,{code:"ACTION_SPAN_TIMESTAMP_INVALID",hint:`Fix it with \`scriptctl edit ${e.address} --ts <time>\` or remove it.`,data:{expected:["valid action.extend.timestamp"],actual:[`${e.address}: ${JSON.stringify(e.timestamp??"")}`]}})}}function bu(e,t){return Zo("Action timestamps run backward within the selected episode.",{code:"ACTION_SPAN_TIMESTAMP_NON_MONOTONIC",hint:"Fix the stored timestamps so they do not move backward in document order, then rerun `span`.",data:{actual:[`${e.address}: ${e.timestamp}`,`${t.address}: ${t.timestamp}`]}})}function Bc(e,t){t.length===0&&Zo("The action selection matched nothing.",{code:"ACTION_SPAN_NO_MATCH",hint:"Check the selector with `scriptctl actions` and rerun with `--span`.",data:{actual:["0 matched actions"]}});let n=new Set(t),o=e.filter(m=>n.has(m.address));o.length!==n.size&&Zo("The resolved action selection is inconsistent with the script timeline.",{code:"ACTION_SPAN_SELECTION_INCONSISTENT",data:{expected:[`${n.size} timeline actions`],actual:[`${o.length} timeline actions`]}});let i=new Set(o.map(m=>m.episodeId));i.size!==1&&Zo("An action timestamp span must stay within one episode.",{code:"ACTION_SPAN_CROSSES_EPISODES",hint:"Split the selector into one `span` call per episode.",data:{actual:[...i]}});let r=o[0],s=o[o.length-1];r.timestamp||Zo(`The first selected Action ${r.address} has no timestamp.`,{code:"ACTION_SPAN_START_TIMESTAMP_MISSING",hint:`Set it with \`scriptctl timestamp ${r.address} --set <time>\`, then rerun.`,data:{actual:[r.address]}});let c=Dc(r),a=r,d=c,p="";for(let m of o){if(!m.timestamp)continue;let g=Dc(m);g.milliseconds<d.milliseconds&&bu(a,m),a=m,d=g,m.address===s.address&&(p=g.canonical)}let l=e.findIndex(m=>m.address===s.address),f,u;for(let m=l+1;m<e.length;m+=1){let g=e[m];if(g.episodeId!==r.episodeId)break;if(!g.timestamp)continue;let h=Dc(g);if(h.milliseconds<d.milliseconds&&bu(a,g),h.milliseconds!==d.milliseconds){f=g,u=h;break}}return z("span",`${r.episodeId} ${c.canonical}..${u?.canonical??"(open)"} over ${o.length} action(s)`),{episode_id:r.episodeId,ep_no:r.episodeNo,start_timestamp:c.canonical,last_selected_timestamp:p,end_timestamp:u?.canonical??"",end_open:u===void 0,end_exclusive:!0,start_action:r.address,last_action:s.address,end_boundary_action:f?.address??"",matched_actions:o.length}}var Jc=["episode_id","ep_no","start_timestamp","last_selected_timestamp","end_timestamp","end_open","end_exclusive","start_action","last_action","end_boundary_action","matched_actions"];function Kc(e,t){return t.map(n=>{if(e.version===4)return n.anchor;let o=n.scene.actions.indexOf(n);return`${n.scene.ep.id}/${n.scene.id}#${o}`})}function jc(e,t,n={}){let o=n.offset??0,i=n.limit??20,r=n.context??3;for(let[f,u,m]of[["offset",o,0],["limit",i,1],["context",r,0]])if(!Number.isSafeInteger(u)||u<m)throw new Error(`${f} must be an integer >= ${m}`);let s=Re(e,t);if(s.t!=="asset"&&s.t!=="state")throw new Error("references requires an asset or asset/state address; use read for episodes/scenes/actions");let c=s.asset,a=s.t==="state"?s.state.id:null,d=[...new Set([c.id,c.name,...c.aliases])].filter(Boolean),p=[];for(let f of e.episodes)for(let u of f.scenes){let m=[...u.location?[u.location]:[],...u.actors,...u.props].filter(g=>g.id===c.id&&(a===null||g.states.includes(a)));m.length&&p.push({kind:"scene_binding",scene:u,matched:m.flatMap(g=>g.states)});for(let g of u.actions)if(g.speaker?.id===c.id&&(a===null||g.speaker.state===a)&&p.push({kind:"speaker",scene:u,action:g,matched:[c.id]}),a===null){let h=d.filter(_=>g.content.includes(_));h.length&&p.push({kind:"text_mention",scene:u,action:g,matched:h})}}let l=o+i;return{asset_id:c.id,state_id:a,total:p.length,next_offset:l<p.length?l:null,items:p.slice(o,l).map(({kind:f,scene:u,action:m,matched:g})=>{let h=m?u.actions.indexOf(m):-1,_=m?u.actions.slice(Math.max(0,h-r),h+r+1):[],y=Math.max(0,..._.map(w=>w.anchor.length));return{kind:f,address:m?.anchor??u.anchor,scene_address:u.anchor,episode:u.ep.no,matched:g,text:[Wo(e,u),..._.map(w=>(w===m?"> ":" ")+Xi(e,w,y))].join(`
|
|
169
|
+
`)}})}}function zc(e){return[`${e.asset_id}${e.state_id===null?"":"/"+e.state_id} ${e.total} references \xB7 showing ${e.items.length}`,"scene_binding=explicit scene presence; speaker=explicit speaker; text_mention=name/alias mention only (not proof of presence).",...e.items.map(t=>`${t.address} ${t.kind} ep=${t.episode}
|
|
170
|
+
${t.text}`),e.next_offset===null?"end":`Continue: --offset ${e.next_offset}`].join(`
|
|
171
|
+
|
|
172
|
+
`)}var qw=["\u65C1\u767D","\u5E7F\u64AD","\u753B\u5916","\u7FA4\u58F0"],Ww={\u65C1\u767D:"system",\u5E7F\u64AD:"broadcast",\u753B\u5916:"offscreen",\u7FA4\u58F0:"group"};function Zw(e){let t=new Set(qw);for(let n of e.assets){t.add(n.name);for(let o of n.aliases)t.add(o)}return n=>t.has(n)||t.has(n.split("\xB7")[0])}function gs(e,t="",n={}){let o=Re(e,t);switch(z("read",`dispatch on node kind "${o.t}"`),o.t){case"script":return eE(e);case"ep":return tE(e,o.ep,n);case"scene":return Vc(e,o.scene,n);case"asset":return nE(e,o.asset);case"state":return oE(e,o.asset,o.state);case"action":{let i=n.context??3,r=o.action.scene.actions,s=r.indexOf(o.action),c=r.slice(Math.max(0,s-i),s+i+1),a=n.plain?0:Math.max(...c.map(l=>l.anchor.length)),d=o.action.raw.transition_prompt,p=Object.entries(o.action.raw.extend??{}).filter(([l])=>l!=="timestamp");return[Wo(e,o.action.scene),...c.map(l=>(l===o.action?"> ":" ")+Xi(e,l,a,n)),d?`transition: ${wo(e,d.target)} | ${d.process} | ${d.contrast}`:"",p.length?`extend: ${p.map(([l,f])=>`${l}=${JSON.stringify(f)}`).join(", ")}`:""].filter(Boolean).join(`
|
|
173
|
+
`)}}}function Xw(e){return e.actions.reduce((t,n)=>t+n.content.length,0)}function eE(e){let t=e.raw,n=e.episodes.reduce((r,s)=>r+s.scenes.length,0),o=e.episodes.reduce((r,s)=>r+s.scenes.reduce((c,a)=>c+a.actions.length,0),0),i=[`${t.title||"(untitled)"} v${e.version} ${e.episodes.length} ep \xB7 ${n} scenes \xB7 ${o} actions`];for(let r of["logline","theme","synopsis","worldview","style"])t[r]&&i.push(`${r}: ${er(String(t[r]),300)}`);Array.isArray(t.main_characters)&&t.main_characters.length&&i.push(`main: ${t.main_characters.map(r=>`${r.name}=${r.role}`).join(", ")}`);for(let r of["actor","location","prop"]){let s=e.assets.filter(c=>c.kind===r);if(s.length){i.push("",`${r}s (${s.length})`);for(let c of s.slice(0,40)){let a=c.aliases.length?` ~${c.aliases.join(",")}`:"",d=c.importance?` [${c.importance}]`:"";i.push(` ${c.id} ${c.name}${d} ${c.states.length}st${a}`)}s.length>40&&i.push(` \u2026 ${s.length-40} more`)}}i.push("","episodes");for(let r of e.episodes){let s=r.scenes.reduce((c,a)=>c+Xw(a),0);i.push(` ${r.no} ${r.id} ${r.scenes.length} scenes ${s} chars${r.title?` ${r.title}`:""}`+(r.synopsis?` ${er(r.synopsis,120)}`:""))}return i.join(`
|
|
174
|
+
`)}function tE(e,t,n){let o=`# EP${String(t.no).padStart(2,"0")} ${t.id} ${t.scenes.length} scenes`+(t.title?` ${t.title}`:"");return n.depth==="outline"?[o,...t.scenes.map(i=>Wo(e,i))].join(`
|
|
175
|
+
`):[o,...t.scenes.map(i=>Vc(e,i,n))].join(`
|
|
176
|
+
|
|
177
|
+
`)}function nE(e,t){let n=t.raw.role_type?` <${t.raw.role_type}>`:"",o=[`${t.id} ${t.name} ${t.kind}${t.importance?` [${t.importance}]`:""}${n}`];t.aliases.length&&o.push(`aliases: ${t.aliases.join(", ")}`),t.desc&&o.push(t.desc),o.push(`states (${t.states.length})`);for(let s of t.states)o.push(` ${s.id} ${s.name} ${er(s.desc,160)}`);let i=[],r=new Map;for(let s of e.episodes)for(let c of s.scenes){let a=[c.location,...c.actors,...c.props].find(d=>d&&d.id===t.id);if(a){i.push(c);for(let d of a.states)r.set(d,(r.get(d)??0)+1)}}if(i.length){let s=[...new Set(i.map(a=>a.ep.no))];o.push(`appears: ${i.length} scenes across ${s.length} ep first ${i[0].ep.no}-${i[0].no} last ${i.at(-1).ep.no}-${i.at(-1).no}`),o.push(`state usage: ${[...r].map(([a,d])=>`${Eo(e,t.id,a)}\xD7${d}`).join(", ")}`);let c=t.states.filter(a=>!r.has(a.id));c.length&&o.push(`unused states: ${c.map(a=>`${a.id}(${a.name})`).join(", ")}`)}else o.push("appears: never referenced");return o.join(`
|
|
178
|
+
`)}function oE(e,t,n){let o=[];for(let r of e.episodes)for(let s of r.scenes)[s.location,...s.actors,...s.props].find(a=>a&&a.id===t.id)?.states.includes(n.id)&&o.push(s);let i=Qn(e).filter(r=>r.speaker?.id===t.id&&r.speaker.state===n.id);return[`${t.id}/${n.id} ${n.name} (${t.kind} ${t.name})`,n.desc,o.length?`bound in ${o.length} scene(s): ${o.slice(0,12).map(r=>`${r.ep.no}-${r.no}`).join(", ")}`+(o.length>12?" \u2026":""):"bound in no scene",i.length?`named by ${i.length} speaker reference(s)`:""].filter(Boolean).join(`
|
|
179
|
+
`)}function er(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function Fc(e,t){let n=Qn(e);if(z("find",`pool = all actions (${n.length})`),t.in){let o=Re(e,t.in);if(o.t==="ep")n=o.ep.scenes.flatMap(i=>i.actions);else if(o.t==="scene")n=o.scene.actions;else if(o.t==="action")n=[o.action];else throw new Error(`--in must address an episode, scene or action (got ${o.t})`);z("find",`--in ${t.in} narrows pool to ${n.length}`)}if(t.type&&(n=n.filter(o=>o.type===t.type),z("find",`--type ${t.type} -> ${n.length}`)),t.speaker){let o=Re(e,t.speaker);if(o.t!=="asset")throw new Error("--speaker must name an actor");n=n.filter(i=>i.speaker?.id===o.asset.id),z("find",`--speaker ${t.speaker} -> ${o.asset.id} -> ${n.length}`)}return n}function Nu(e,t,n={}){let o=Fc(e,n),i=t?new RegExp(t,"u"):null,r=o.filter(f=>!i||i.test(f.content));z("find",`regex /${t}/ -> ${r.length} hits`);let s=n.limit??40,c=n.window??16,a=r.slice(0,s),d=Math.max(0,...a.map(f=>f.anchor.length)),p=`${r.length} hit${r.length===1?"":"s"}`+(t?` for /${t}/`:"")+(r.length>a.length?` (showing ${a.length})`:""),l=a.map(f=>{let u=`${f.scene.ep.no}-${f.scene.no}-${f.no}`,m=u===f.anchor?"":u.padEnd(8)+" ",g=f.speaker?.id?wo(e,f.speaker.id)+"\uFF1A":"",h=n.full||!i?f.content:iE(f.content,i,c);return`${f.anchor.padEnd(d)} ${m}${g}${h}`});return[p,...l].join(`
|
|
180
|
+
`)}function iE(e,t,n){let o=e.match(t);if(!o||o.index===void 0)return er(e,n*2);let i=Math.max(0,o.index-n),r=Math.min(e.length,o.index+o[0].length+n);return(i>0?"\u2026":"")+e.slice(i,r)+(r<e.length?"\u2026":"")}function Qc(e,t){return Bc(Gc(e),Kc(e,Fc(e,{in:t})))}function Mu(e,t){let n=Qc(e,t);return Jc.map(o=>`${o}=${n[o]}`).join(" ")}var rE=["content","paren","speaker","ts","type","transition"],sE=["name","desc","importance","aliases","role"],aE=["name","desc"],cE=["title","synopsis"],dE=["space","time"],pE=["title","worldview","style","synopsis","logline","theme","main"];function tr(e,t,n,o){let i=Object.keys(n).filter(s=>n[s]!==void 0);if(!i.length)throw new Error(`Nothing to change on ${e}; pass at least one field`);let r=i.filter(s=>!o.includes(s));if(r.length){let s=/^[aeiou]/.test(t)?"an":"a";throw new Error(`${e} is ${s} ${t}; it has no ${r.join(", ")} \u2014 ${s} ${t} takes ${o.join(", ")}`)}return i}function Lu(e,t,n){let o=Re(e,t);if(o.t==="asset")return uE(e,t,o.asset,n);if(o.t==="state")return fE(e,t,o.asset,o.state,n);if(o.t==="script")return vu(e,t||"script","script",o.doc.raw,n,pE);if(o.t==="ep")return vu(e,t,"episode",o.ep.raw,n,cE);if(o.t==="scene")return lE(e,t,o.scene,n);let i=o.action,r=i.raw,s=tr(i.anchor,"action",n,rE),c=tt(e);if(z("edit",`${i.anchor}: ${s.join(", ")}`),n.type!==void 0&&(r.type=xo("type",n.type,Ct,ln)),n.content!==void 0&&(r.content=n.content),n.paren!==void 0&&ms(e,r,n.paren),n.speaker!==void 0&&(r.speaker=Yc(e,n.speaker)),n.ts!==void 0&&Uu(r,n.ts),n.transition!==void 0)if(n.transition===null)delete r.transition_prompt;else{let[a,d,p]=n.transition.split("|").map(f=>f.trim());if(!a||!d||!p)throw new Error(`transition takes "target|process|contrast" (got "${n.transition}")`);let l=Re(e,a);if(l.t!=="asset")throw new Error(`transition target must be an asset (got ${a})`);r.transition_prompt={target:l.asset.id,process:d,contrast:p}}return we(e),`${i.anchor} ${s.join("+")} ${hs(r)}`+Ce(e,c)}function vu(e,t,n,o,i,r){let s=tr(t,n,i,r),c=tt(e);for(let a of s)if(a==="main")o.main_characters=i.main.split(",").map(d=>{let[p,l]=d.split("=").map(f=>f.trim());if(!p||!l)throw new Error(`main takes "\u540D\u5B57=\u89D2\u8272\u5B9A\u4F4D,\u2026" (got "${d}")`);return{name:p,role:l}});else{if(a==="aliases"||a==="role")throw new Error(`${t} is ${n}; it has no ${a}`);o[a]=i[a]}return z("edit",`${n} ${t}: ${s.join(", ")}`),we(e),`${t} ${s.join("+")}`+Ce(e,c)}function lE(e,t,n,o){let i=tr(t,"scene",o,dE),r=tt(e),s={...n.raw.environment??{}};return o.space!==void 0&&(s.space=xo("space",o.space,Mp,ha)),o.time!==void 0&&(s.time=xo("time",o.time,ga,Ur)),n.raw.environment=s,z("edit",`scene ${n.anchor}: ${i.join(", ")}`),we(e),`${n.anchor} ${i.join("+")} ${[s.space,s.time].filter(Boolean).join("/")}`+Ce(e,r)}function uE(e,t,n,o){let i=tr(t,"asset",o,sE),r=tt(e);if(o.name!==void 0){let s=e.assets.find(c=>c!==n&&(c.name===o.name||c.aliases.includes(o.name)));if(s)throw new Error(`"${o.name}" already names ${s.kind} ${s.id}`);n.raw[`${n.kind}_name`]=o.name}if(o.desc!==void 0&&(n.raw.description=o.desc),o.importance!==void 0&&(n.raw.importance=Bu(o.importance)),o.role!==void 0){if(n.kind!=="actor")throw new Error(`role only applies to actors (${n.name} is a ${n.kind})`);o.role?n.raw.role_type=xo("role",o.role,Cn,$o):delete n.raw.role_type}return o.aliases!==void 0&&(o.aliases.length?n.raw.aliases=o.aliases:delete n.raw.aliases),z("edit",`asset ${n.id}: ${i.join(", ")}`),we(e),`${n.id} ${i.join("+")} ${o.name??n.name}`+Ce(e,r)}function fE(e,t,n,o,i){let r=tr(t,"state",i,aE),s=tt(e),c=n.raw.states.find(a=>a.state_id===o.id);if(i.name!==void 0){if(n.states.some(a=>a.id!==o.id&&a.name===i.name))throw new Error(`${n.name} already has a state named "${i.name}"`);c.state_name=i.name}return i.desc!==void 0&&(c.description=i.desc),z("edit",`state ${n.id}/${o.id}: ${r.join(", ")}`),we(e),`${n.id}/${o.id} ${r.join("+")} ${i.name??o.name}`+Ce(e,s)}function Tu(e,t,n,o,i,r,s){let c=Re(e,t);if(c.t!=="action")throw new Error(`${t} is a ${c.t}; insert needs a sibling action`);let a=c.action,d=tt(e),p={type:xo("type",o,Ct,ln),content:i};if(e.version===4&&(p.action_id=Yn("ac",new Set(e.actions.keys()))),o==="dialogue"||o==="inner_thought"){if(!r)throw new Error(`a ${o} needs a speaker`);p.speaker=Yc(e,r),s!==void 0&&ms(e,p,s)}else if(r||s)throw new Error(`a ${o} takes neither speaker nor paren`);let l=a.scene.raw.actions,f=l.indexOf(a.raw)+(n==="before"?0:1);return l.splice(f,0,p),z("insert",`${p.action_id??`${a.scene.anchor}#${f}`} ${n} ${a.anchor}`),we(e),`${p.action_id??`${a.scene.anchor}#${f}`} ${n} ${a.anchor} ${hs(p)}`+Ce(e,d)}function Cu(e,t,n,o="after"){let i=Re(e,t);if(i.t!=="action")throw new Error(`${t} is a ${i.t}; move targets one action`);let r=Re(e,n);if(r.t!=="action")throw new Error(`${n} is a ${r.t}; move --to takes a sibling action`);if(i.action===r.action)throw new Error(`${t} cannot move relative to itself`);let s=tt(e),c=i.action.scene.raw.actions;c.splice(c.indexOf(i.action.raw),1);let a=r.action.scene.raw.actions;return a.splice(a.indexOf(r.action.raw)+(o==="before"?0:1),0,i.action.raw),z("move",`${i.action.scene.anchor} -> ${r.action.scene.anchor}, identity ${i.action.anchor} preserved`),we(e),`${i.action.anchor} ${o} ${r.action.anchor} (${i.action.scene.anchor} -> ${r.action.scene.anchor})`+Ce(e,s)}function ms(e,t,n){let o=e.version===4?"parenthetical":"emotion";n===null?delete t[o]:t[o]=n}function Uu(e,t){if(t===null){e.extend&&delete e.extend.timestamp;return}let n;try{n=Un(t).canonical}catch(o){throw o instanceof Ye?new Error(`${o.message} (got ${JSON.stringify(t)})`):o}e.extend={...e.extend??{},timestamp:n}}function Yc(e,t){let n=e.assets.find(a=>a.name===t||a.aliases.includes(t)),[o,i]=n?[t,void 0]:mE(t,"\xB7"),r=Ww[o];if(r)return i?{kind:r,label:i}:{kind:r};let s=Re(e,o);if(s.t!=="asset"||s.asset.kind!=="actor")throw new Error(`Not an actor: ${t}`);let c={actor_id:s.asset.id};if(i){let a=s.asset.states.find(d=>d.name===i||d.id===i);if(!a)throw new Error(`Unknown state "${i}" on ${s.asset.name}`);c.state_id=a.id}return c}function mE(e,t){let n=e.indexOf(t);return n<0?[e,void 0]:[e.slice(0,n),e.slice(n+t.length)]}function hs(e){return er(String(e.content??""),40)}function Pu(e,t,n,o={}){let i=fs(structuredClone(e.raw)),r=gE(i,t,n,o);return e.raw=i.raw,we(e),r}function gE(e,t,n,o){if(t==="+"||Number(t)===e.episodes.length+1){let r={scenes:[]};return e.version===4&&(r.episode_id=Yn("ep",new Set(e.eps.keys()))),e.raw.episodes.push(r),z("write",`appending episode ${e.episodes.length+1}`),Ou(e,r,e.episodes.length+1,n,o,!0)}let i=Re(e,t);if(i.t==="scene")return hE(e,i.scene,n,o);if(i.t==="ep")return Ou(e,i.ep.raw,i.ep.no,n,o,!1);throw new Error(`write targets a scene or an episode (got ${i.t})`)}function hE(e,t,n,o){let i=tt(e),r=$u(e,t.raw,t,n,new Set(e.actions.keys()),o);return we(e),Vu(t.anchor,r)+Ce(e,i)}function Vu(e,t){return`${e}: ${t.total} actions (${t.kept} kept, ${t.created} new, ${t.dropped.length} deleted)`+(t.dropped.length?`
|
|
181
|
+
deleted: ${t.dropped.map(n=>`${n.anchor} ${hs(n.raw)}`).join(`
|
|
182
|
+
`)}`:"")}function $u(e,t,n,o,i,r,s,c){let a=Zw(e),{head:d,meta:p,body:l}=Au(o.split(`
|
|
183
|
+
`));if(d){let y=$c(d,p);t.environment=y.env.space||y.env.time?y.env:void 0,t.environment===void 0&&delete t.environment,t.location=y.location?Hc(e,y.location,"location"):null,t.actors=y.cast.map(w=>Hc(e,w,"actor")),t.props=y.props.map(w=>Hc(e,w,"prop"))}let f=s??new Map((n?.actions??[]).map(y=>[y.anchor,y])),u=c??new Set,m=new Set,g=[],h=0,_=n?n.anchor:"this new scene";for(let y of l){let w=Iu(y,a);if(!w)continue;let I=w.anchor?f.get(w.anchor):void 0;if(w.anchor&&!I)throw new Error(`Anchor ${w.anchor} is not in ${_} \u2014 move it with \`move\`, or drop the anchor to create a new action`);if(I&&u.has(I.anchor))throw new Error(`Anchor ${w.anchor} appears twice in ${_} \u2014 drop the anchor from the copy to make it a new action`);let E=I?I.raw:{};!I&&e.version===4&&(E.action_id=Yn("ac",i)),E.type=xo("type",w.type,Ct,ln),E.content=w.content,w.type==="dialogue"||w.type==="inner_thought"?(E.speaker=Yc(e,w.speakerName),ms(e,E,w.paren??null)):(delete E.speaker,ms(e,E,null)),Uu(E,w.ts??null),I?(m.add(I.anchor),u.add(I.anchor)):h++,g.push(E)}if(!g.length&&(n?.actions.length??0)>0&&!r.allowDelete)throw new Error(`That would leave ${_} with no actions${n?` (deleting all ${n.actions.length})`:""} \u2014 the body after the \`##\` header is empty; pass --allow-delete if that is the intent`);if(g.length&&!m.size&&(n?.actions.length??0)>0&&!r.allowDelete)throw new Error(`None of the ${g.length} line(s) carry an anchor from ${_}, so all ${n.actions.length} existing action(s) would be replaced by new ids \u2014 \`read --plain\` output cannot be written back; re-read without --plain, or pass --allow-delete to rewrite the scene from scratch`);return t.actions=g,{total:g.length,kept:m.size,created:h,dropped:s?[]:(n?.actions??[]).filter(y=>!m.has(y.anchor))}}function Ou(e,t,n,o,i,r){let s=tt(e),c=r?[]:e.episodes[n-1].scenes,a=new Map;for(let I of c)a.set(I.anchor,I),a.set(I.id,I);let d=[];for(let I of o.split(`
|
|
184
|
+
`))I.startsWith("##")?d.push(I):d.length&&(d[d.length-1]+=`
|
|
185
|
+
`+I);if(!d.length)throw new Error("No scene headers found \u2014 an episode body needs `## \u2026` lines");let p=new Set(e.actions.keys()),l=new Set(e.scenes.keys()),f=new Map;for(let I of c)for(let E of I.actions)f.set(E.anchor,E);let u=new Set,m=new Set,g=[],h=[],_=0;for(let I of d){let E=$c(I.split(`
|
|
186
|
+
`)[0]),A=E.anchor?a.get(E.anchor):void 0;if(E.anchor&&!A)throw new Error(`Scene ${E.anchor} is not in episode ${n} \u2014 drop the id from the header to create a new scene here`);let k=A?A.raw:{};A?m.add(A.anchor):(e.version===4?k.scene_id=Yn("scn",l):k.scene_id=`scn_${String(c.length+_+1).padStart(3,"0")}`,_++);let D=$u(e,k,A??null,I,p,i,f,u);g.push(k),h.push(Vu(A?A.anchor:`new ${k.scene_id}`,D))}let y=[...f.values()].filter(I=>!u.has(I.anchor));if(y.length&&!i.allowDelete)throw new Error(`This would delete ${y.length} action(s) from episode ${n}: `+y.slice(0,6).map(I=>`${I.anchor}(${I.scene.anchor})`).join(", ")+(y.length>6?" \u2026":"")+" \u2014 keep their lines, or pass --allow-delete if that is the intent");let w=c.filter(I=>!m.has(I.anchor));if(w.length&&!i.allowDelete)throw new Error(`This would delete ${w.length} whole scene(s) from episode ${n}: `+w.map(I=>`${I.anchor}(${I.actions.length} actions)`).join(", ")+" \u2014 include their `##` headers to keep them, or pass --allow-delete if that is the intent");return z("write",`episode ${n}: ${d.length} scene blocks, ${_} new, ${w.length} deleted`),t.scenes=g,we(e),`EP${n}: ${g.length} scenes (${g.length-_} kept, ${_} new, ${w.length} deleted, ${y.length} actions deleted)
|
|
187
|
+
`+h.map(I=>" "+I.replace(/\n/g,`
|
|
188
|
+
`)).join(`
|
|
189
|
+
`)+(w.length?`
|
|
190
|
+
deleted scenes: ${w.map(I=>I.anchor).join(", ")}`:"")+Ce(e,s)}function Hc(e,t,n){let{name:o,states:i}=ku(t),r=Re(e,o);if(r.t!=="asset"||r.asset.kind!==n)throw new Error(`"${o}" is not a registered ${n} \u2014 create it with \`asset\` first`);let s=(i.length?i:["default"]).map(d=>{let p=r.asset.states.filter(l=>l.name===d||l.id===d);if(!p.length)throw new Error(`${r.asset.name} has no state "${d}" (has: ${r.asset.states.map(l=>l.name).join(", ")})`);if(p.length>1)throw new Error(`${r.asset.name} has ${p.length} states named "${d}"; use the state id`);return p[0].id}),c=[...new Set(s)].sort(),a=`${n}_id`;return e.version===4?{[a]:r.asset.id,state_ids:c}:{[a]:r.asset.id,state_id:c[0]}}function Du(e,t,n,o,i=!1){let r=Re(e,t);if(r.t!=="scene")throw new Error(`${t} is a ${r.t}; ref targets one scene`);let s=r.scene,c=Re(e,n);if(c.t!=="asset")throw new Error(`${n} is a ${c.t}; ref takes an actor, location or prop`);let a=c.asset,d=a.kind==="actor"?"actors":a.kind==="prop"?"props":"location",p=tt(e);if(i){if(a.kind==="location"){if(s.location?.id!==a.id)throw new Error(`${s.anchor}'s location is ${s.location?wo(e,s.location.id):"empty"}, not ${a.name}`);s.raw.location=null}else{let g=s.raw[d],h=g.findIndex(_=>_[`${a.kind}_id`]===a.id);if(h<0)throw new Error(`${s.anchor} does not reference ${a.name}`);g.splice(h,1)}return z("ref",`${s.anchor} -= ${a.id}`),we(e),`${s.anchor} removed ${a.name}`+Ce(e,p)}if(!o.length)throw new Error(`ref needs at least one state for ${a.name} (has: ${a.states.map(g=>g.name).join(", ")}) \u2014 nothing is implied, not even default`);let l=[...new Set(o.map(g=>{let h=a.states.filter(_=>_.name===g||_.id===g);if(!h.length)throw new Error(`${a.name} has no state "${g}" (has: ${a.states.map(_=>_.name).join(", ")})`);if(h.length>1)throw new Error(`${a.name} has ${h.length} states named "${g}"; use the state id`);return h[0].id}))].sort(),f=`${a.kind}_id`,u=e.version===4?{[f]:a.id,state_ids:l}:{[f]:a.id,state_id:l[0]};if(e.version===3&&l.length>1)throw new Error("Script v3 holds one state per reference; pass a single state");let m;if(a.kind==="location")m=s.location?s.location.id===a.id?"restated":"replaced":"set",s.raw.location=u;else{let g=s.raw[d],h=g.findIndex(_=>_[f]===a.id);h<0?(g.push(u),m="added"):(g[h]=u,m="restated")}return z("ref",`${s.anchor} ${m} ${a.id} = [${l.join(", ")}]`),we(e),`${s.anchor} ${m} ${a.name}(${l.map(g=>Eo(e,a.id,g)).join("+")})`+Ce(e,p)}function Gu(e,t,n,o={}){if(!t)throw new Error("replace needs a pattern; an empty one would rewrite every action");let i=new RegExp(t,"gu"),r=tt(e),s=Fc(e,o),c=s.filter(p=>(i.lastIndex=0,i.test(p.content)));if(z("replace",`/${t}/ matched ${c.length} of ${s.length} actions in scope`),!c.length)return`0 hits for /${t}/ \u2014 nothing to do`;let a=Math.max(...c.map(p=>p.anchor.length)),d=c.map(p=>{let l=p.content.replace(i,n);return`${p.anchor.padEnd(a)} ${p.scene.ep.no}-${p.scene.no}-${p.no}
|
|
191
|
+
${" ".repeat(a)} - ${p.content}
|
|
192
|
+
${" ".repeat(a)} + ${l}`});if(!o.apply)return`${c.length} action(s) would change (dry run \u2014 pass apply to write)
|
|
193
|
+
`+d.join(`
|
|
194
|
+
`);for(let p of c)i.lastIndex=0,p.raw.content=p.content.replace(i,n);return we(e),z("replace",`wrote ${c.length} actions`),`${c.length} action(s) changed`+Ce(e,r)+`
|
|
195
|
+
`+d.join(`
|
|
196
|
+
`)}function xo(e,t,n,o){if(!n.has(t))throw new Error(`${e} must be one of ${o.join(" | ")} (got "${t}")`);return t}function Bu(e){return xo("importance",e,Et,fn)}function Xo(e){return e.version===4?Te(e.raw):at(e.raw)}function Ju(e){let t=Xo(e);return[`${e.episodes.length} episodes / ${e.scenes.size?[...new Set(e.episodes.flatMap(o=>o.scenes))].length:0} scenes / ${Qn(e).length} actions \u2014 ${t.ok?"ok":`${t.errors.length} error(s)`}`+(t.warnings.length?`, ${t.warnings.length} warning(s)`:""),...Wc([...t.errors.map(o=>["error",o]),...t.warnings.map(o=>["warning",o])])].join(`
|
|
197
|
+
`)}function qc(e,t={}){let n=Xo(e),o=[...n.errors.map(i=>["error",i]),...n.warnings.map(i=>["warning",i])];return t.severity&&(o=o.filter(([i])=>i===t.severity)),t.code&&(o=o.filter(([,i])=>i.code===t.code)),z("issues",`${o.length} matching issue(s)`),o.length?Wc(o).join(`
|
|
198
|
+
`):"No issues."}function Wc(e){return e.map(([t,n])=>`${t} ${n.code} ${n.path} ${n.message}`+(n.repair_hint?`
|
|
199
|
+
fix: ${n.repair_hint}`:""))}function tt(e){return Xo(e)}function Ce(e,t){let n=Xo(e),o=[...wa(t.errors,n.errors).map(i=>["error",i]),...wa(t.warnings,n.warnings).map(i=>["warning",i])];return o.length?(z("check",`${o.length} issue(s) introduced by this edit`),`
|
|
200
|
+
introduced ${o.length} issue(s):
|
|
201
|
+
`+Wc(o).join(`
|
|
202
|
+
`)):""}var Zc={actor:"actors",location:"locations",prop:"props"},Ru={actor:"act",location:"loc",prop:"prp"};function Ku(e,t,n,o,i="featured",r=[]){if(!n.trim())throw new Error("asset needs a name");let s=tt(e),c=e.assets.find(l=>l.name===n||l.aliases.includes(n));if(c)throw new Error(`"${n}" already names ${c.kind} ${c.id}; read it instead`);let a=Zc[t],d=e.version===4?Yn(Ru[t],new Set(e.assets.map(l=>l.id))):`${Ru[t]}_${String(e.raw[a].length+1).padStart(3,"0")}`,p={[`${t}_id`]:d,[`${t}_name`]:n,importance:Bu(i),description:o,states:[{state_id:"default",state_name:n,description:o}]};return r.length&&(p.aliases=r),e.raw[a].push(p),z("asset",`${t} ${d} "${n}" + default state`),we(e),`${d} ${n} ${t} states: default`+Ce(e,s)}function ju(e,t,n,o){let i=Re(e,t);if(i.t!=="asset")throw new Error(`${t} is a ${i.t}; state targets an asset`);let r=tt(e);if(i.asset.states.some(c=>c.name===n))throw new Error(`${i.asset.name} already has a state named "${n}"`);let s=e.version===4?Yn("st",new Set(i.asset.states.map(c=>c.id))):`st_${String(i.asset.states.length).padStart(3,"0")}`;return i.asset.raw.states.push({state_id:s,state_name:n,description:o}),z("state",`${i.asset.id} + ${s} "${n}"`),we(e),`${i.asset.id}/${s} ${n} (${i.asset.name} now has ${i.asset.states.length+1} states)`+Ce(e,r)}function yE(e,t){let n=Re(e,t);switch(n.t){case"script":return{raw:n.doc.raw,label:"script"};case"ep":return{raw:n.ep.raw,label:n.ep.id};case"scene":return{raw:n.scene.raw,label:n.scene.anchor};case"action":return{raw:n.action.raw,label:n.action.anchor};case"asset":return{raw:n.asset.raw,label:n.asset.id};case"state":return{raw:n.asset.raw.states.find(i=>i.state_id===n.state.id),label:`${n.asset.id}/${n.state.id}`}}}function zu(e,t,n,o,i=!1){let{raw:r,label:s}=yE(e,t),c=r.extend??{};if(!n){let a=Object.keys(c);return a.length?`${s} extend:
|
|
203
|
+
`+a.map(d=>` ${d} = ${JSON.stringify(c[d])}`).join(`
|
|
204
|
+
`):`${s} has no extend data`}if(i){if(!(n in c))throw new Error(`${s} has no extend key "${n}"`);return delete c[n],Object.keys(c).length?r.extend=c:delete r.extend,z("ext",`${s} -= ${n}`),we(e),`${s} removed extend.${n}`}if(o===void 0){if(!(n in c))throw new Error(`${s} has no extend key "${n}"`);return`${s} extend.${n} = ${JSON.stringify(c[n])}`}return r.extend={...c,[n]:o},z("ext",`${s} extend.${n} = ${o}`),we(e),`${s} extend.${n} = ${JSON.stringify(o)}`}function Hu(e,t,n={}){let o=Re(e,t),i=tt(e);if(o.t==="action"){let r=o.action.scene.raw.actions;return r.splice(r.indexOf(o.action.raw),1),z("del",`action ${o.action.anchor} from ${o.action.scene.anchor}`),we(e),`deleted ${o.action.anchor} ${hs(o.action.raw)}`+Ce(e,i)}if(o.t==="scene"){if(o.scene.actions.length&&!n.force)throw new Error(`${o.scene.anchor} still holds ${o.scene.actions.length} action(s) \u2014 pass --force to delete the scene and everything in it`);let r=o.scene.ep.raw.scenes;return r.splice(r.indexOf(o.scene.raw),1),z("del",`scene ${o.scene.anchor} (${o.scene.actions.length} actions)`),we(e),`deleted scene ${o.scene.anchor} with ${o.scene.actions.length} action(s)`+Ce(e,i)}if(o.t==="ep"){let r=o.ep.scenes.reduce((c,a)=>c+a.actions.length,0);if(o.ep.scenes.length&&!n.force)throw new Error(`episode ${o.ep.no} still holds ${o.ep.scenes.length} scene(s) / ${r} action(s) \u2014 pass --force to delete the episode and everything in it`);let s=e.raw.episodes;return s.splice(s.indexOf(o.ep.raw),1),z("del",`episode ${o.ep.no}`),we(e),`deleted episode ${o.ep.no} (${o.ep.id}) with ${o.ep.scenes.length} scene(s) / ${r} action(s)`}if(o.t==="asset")return _E(e,o.asset,n)+Ce(e,i);if(o.t==="state")return wE(e,o.asset,o.state,n)+Ce(e,i);throw new Error(`del takes an action, scene, episode, asset or state (got ${o.t})`)}function Fu(e,t){let n=[];for(let o of e.episodes)for(let i of o.scenes)[i.location,...i.actors,...i.props].some(r=>r&&r.id===t)&&n.push(i);return{scenes:n,speakers:Qn(e).filter(o=>o.speaker?.id===t)}}function _E(e,t,n){let{scenes:o,speakers:i}=Fu(e,t.id),r=o.length+i.length;if(r&&!n.replacement&&!n.force)throw new Error(`${t.name} is still referenced by ${o.length} scene(s) and ${i.length} speaker(s) \u2014 merge it into another asset with \`merge ${t.id} <other>\`, or pass --force to strip every reference`);if(n.replacement)return Xc(e,t.id,n.replacement);for(let a of o){a.raw.location?.[`${t.kind}_id`]===t.id&&(a.raw.location=null);for(let d of["actors","props"]){let p=a.raw[d];if(!p)continue;let l=p.findIndex(f=>f[`${t.kind}_id`]===t.id);l>=0&&p.splice(l,1)}}for(let a of i)delete a.raw.speaker;let s=Zc[t.kind],c=e.raw[s];return c.splice(c.indexOf(t.raw),1),z("del",`asset ${t.id}, stripped ${o.length} scene refs + ${i.length} speakers`),we(e),`deleted ${t.kind} ${t.id} ${t.name}`+(r?`
|
|
205
|
+
stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function wE(e,t,n,o){if(n.id==="default")throw new Error("every asset keeps its default state; delete the asset instead");let i=e.episodes.flatMap(d=>d.scenes).filter(d=>[d.location,...d.actors,...d.props].some(p=>p&&p.id===t.id&&p.states.includes(n.id))),r=Qn(e).filter(d=>d.speaker?.id===t.id&&d.speaker.state===n.id),s=i.length+r.length,c="";if(s){if(!o.replacement&&!o.force)throw new Error(`${t.name}/${n.name} is bound in ${i.length} scene(s) and named by ${r.length} speaker(s) \u2014 pass --replacement <state> to rewire them, or --force to drop the bindings`);let d;if(o.replacement){let p=t.states.filter(l=>l.id===o.replacement||l.name===o.replacement);if(p.length!==1)throw new Error(`${t.name} has no single state "${o.replacement}"`);if(p[0].id===n.id)throw new Error("replacement must differ from the state being deleted");d=p[0].id}for(let p of i)for(let l of[p.raw.location,...p.raw.actors??[],...p.raw.props??[]])if(!(!l||l[`${t.kind}_id`]!==t.id))if(e.version===4){let f=new Set(l.state_ids.filter(u=>u!==n.id));d&&f.add(d),f.size||f.add("default"),l.state_ids=[...f].sort()}else l.state_id=d??"default";for(let p of r)d?p.raw.speaker.state_id=d:delete p.raw.speaker.state_id;c=`
|
|
206
|
+
${d?"rewired":"cleared"} ${i.length} scene binding(s) and ${r.length} speaker(s)${d?` to ${Eo(e,t.id,d)}`:""}`}let a=t.raw.states;return a.splice(a.findIndex(d=>d.state_id===n.id),1),z("del",`state ${t.id}/${n.id}`),we(e),`deleted state ${t.id}/${n.id} ${n.name}`+c}function Xc(e,t,n){let o=Re(e,t),i=Re(e,n);if(o.t!=="asset"||i.t!=="asset")throw new Error("merge takes two assets");if(o.asset===i.asset)throw new Error(`cannot merge ${o.asset.name} into itself`);if(o.asset.kind!==i.asset.kind)throw new Error(`cannot merge a ${o.asset.kind} into a ${i.asset.kind}`);let r=tt(e),s=o.asset,c=i.asset,a=`${s.kind}_id`,d=new Set(c.states.map(m=>m.id)),p=new Map;for(let m of s.states){let g=c.states.find(_=>_.name===m.name);if(g){p.set(m.id,g.id);continue}if(m.id==="default"){p.set(m.id,"default");continue}let h=e.version===4?Yn("st",d):`st_${String(c.states.length+p.size).padStart(3,"0")}`;c.raw.states.push({state_id:h,state_name:m.name,description:m.desc}),p.set(m.id,h)}let{scenes:l,speakers:f}=Fu(e,s.id);for(let m of l)for(let g of["location","actors","props"]){let h=m.raw[g],_=g==="location"?h?[h]:[]:h??[];for(let y of _)y[a]===s.id&&(y[a]=c.id,e.version===4?y.state_ids=[...new Set(y.state_ids.map(w=>p.get(w)??"default"))].sort():y.state_id=p.get(y.state_id)??"default");if(g!=="location"&&Array.isArray(h)){let y=[];for(let w of h){let I=y.find(E=>E[a]===w[a]);if(!I){y.push(w);continue}e.version===4&&(I.state_ids=[...new Set([...I.state_ids,...w.state_ids])].sort())}m.raw[g]=y}}for(let m of f)m.raw.speaker.actor_id=c.id,m.raw.speaker.state_id&&(m.raw.speaker.state_id=p.get(m.raw.speaker.state_id)??"default");let u=e.raw[Zc[s.kind]];return u.splice(u.indexOf(s.raw),1),z("merge",`${s.id} -> ${c.id}: ${l.length} scenes, ${f.length} speakers`),we(e),`merged ${s.id} ${s.name} into ${c.id} ${c.name}
|
|
207
|
+
moved ${l.length} scene reference(s), ${f.length} speaker(s), ${[...p].filter(([m,g])=>m!==g).length} state mapping(s)`+Ce(e,r)}var qn="\u5730\u5740\uFF1A\u96C6 `3`\u3001\u573A `3-2`\u3001\u5355\u6761 `3-2-5`\u3001\u6B63\u5F0F ID\u3001\u8D44\u4EA7\u540D\u3001\u6216 `<\u8D44\u4EA7>/<\u72B6\u6001>`";function Pe(e){let t=xe(e);if(!Qu.existsSync(t))throw new x("Local script file not found.",{exitCode:b,errorCode:"SCRIPT_NOT_FOUND",hint:"Run `scriptctl checkout`, `scriptctl create`, or pass --script-path to an existing script.",data:{expected:["existing local script JSON"],actual:[t]}});return Uc(t)}function le(e,t){let n=e[t];return typeof n=="string"?n:void 0}function So(e,t){let n=e[t];if(n==null||n==="")return;let o=Number(n);if(!Number.isFinite(o))throw new x(`--${t} must be a number.`,{exitCode:b,errorCode:"OPTION_NOT_NUMBER",data:{actual:[String(n)]}});return o}function ue(e,t=0){return(e._args??[])[t]??""}function ed(e){return Array.isArray(e)?e.map(String):typeof e=="string"?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function qe(e,t,n=()=>({})){try{let o=e();return[{text:o,data:{op:t,changed:!1,text:o,...n()}},B]}catch(o){throw o instanceof x?o:new x(o instanceof Error?o.message:String(o),{exitCode:b,errorCode:o?.code??"SCRIPT_TOOL_FAILED"})}}function Yu(e,t){let n=se(e.command("read [addr]"),"read").description(`\u8BFB\u4EFB\u610F\u8282\u70B9\uFF1B\u4E0D\u7ED9\u5730\u5740\u8FD4\u56DE\u5267\u672C\u5361\u3002${qn}`).option("--outline","\u53EA\u8981\u573A\u7ED3\u6784\uFF0C\u4E0D\u8981\u6B63\u6587").option("--context <n>","\u5355\u6761 action \u524D\u540E\u5404\u5E26\u51E0\u6761\uFF08\u9ED8\u8BA4 3\uFF09").option("--plain","\u53BB\u6389\u951A\u70B9\u4E0E\u65F6\u95F4\u6233\uFF08\u53EA\u8BFB\uFF0C\u4E0D\u53EF\u56DE\u5199\uFF09").action(Y(y=>{let w=Pe(y);return qe(()=>gs(w,ue(y),{...y.outline?{depth:"outline"}:{},...y.plain?{plain:!0}:{},...So(y,"context")!==void 0?{context:So(y,"context")}:{}}),"read",()=>ue(y)?{}:{document:w.raw})},t));Ie(n,[qn]);let o=se(e.command("scan <episode>"),"read").description("\u4E00\u6B21\u8FD4\u56DE\u67D0\u96C6\u7684\u5B8C\u6574\u4E0A\u4E0B\u6587\uFF1A\u573A\u7ED3\u6784 + \u5168\u90E8\u6B63\u6587 + \u5F53\u524D\u6821\u9A8C\u95EE\u9898").action(Y(y=>qe(()=>{let w=Pe(y),I=ue(y);return[`## \u573A\u7ED3\u6784
|
|
208
|
+
${gs(w,I,{depth:"outline"})}`,`## \u6B63\u6587
|
|
209
|
+
${gs(w,I)}`,`## \u5F53\u524D\u6821\u9A8C\u95EE\u9898
|
|
210
|
+
${qc(w,{})}`].join(`
|
|
211
|
+
|
|
212
|
+
`)},"scan"),t));Ie(o,["\u96C6\u53F7\uFF0C\u4ECE 1 \u5F00\u59CB"]);let i=se(e.command("find [query]"),"read").description("\u6309\u6B63\u6587\u6B63\u5219 / \u8BF4\u8BDD\u4EBA / \u7C7B\u578B\u5B9A\u4F4D action\uFF0C\u8FD4\u56DE\u951A\u70B9 + \u547D\u4E2D\u7A97\u53E3").option("-i, --in <addr>",`\u9650\u5236\u8303\u56F4\uFF0C${qn}`).option("-a, --speaker <name>","\u4EBA\u7269\u540D\u6216 actor id").option("-t, --type <type>","action | dialogue | inner_thought | transition").option("--limit <n>","\u6700\u591A\u8FD4\u56DE\u51E0\u6761\uFF08\u9ED8\u8BA4 40\uFF09").option("--full","\u8FD4\u56DE\u6574\u6761\u6B63\u6587\u800C\u4E0D\u662F\u547D\u4E2D\u7A97\u53E3").action(Y(y=>qe(()=>Nu(Pe(y),ue(y),{...le(y,"in")?{in:le(y,"in")}:{},...le(y,"speaker")?{speaker:le(y,"speaker")}:{},...le(y,"type")?{type:le(y,"type")}:{},...So(y,"limit")!==void 0?{limit:So(y,"limit")}:{},...y.full?{full:!0}:{}}),"find"),t));Ie(i,["\u6B63\u5219\uFF1B\u53EA\u6309 speaker/type \u8FC7\u6EE4\u65F6\u53EF\u7701\u7565"]);let r=se(e.command("refs <addr>"),"read").description("\u53EA\u8BFB\u5B9A\u4F4D\u8D44\u4EA7/\u9020\u578B\u7684\u573A\u666F\u7ED1\u5B9A\u3001\u8BF4\u8BDD\u5F15\u7528\u548C\u6B63\u6587\u63D0\u53CA\uFF0C\u8FD4\u56DE\u53EF read \u7684\u5730\u5740\u53CA\u4E0A\u4E0B\u6587").option("--offset <n>","\u4ECE\u7B2C\u51E0\u6761\u5F15\u7528\u7EE7\u7EED\uFF08\u4ECE 0 \u5F00\u59CB\uFF09").option("--limit <n>","\u672C\u6279\u5F15\u7528\u6570\uFF08\u9ED8\u8BA4 20\uFF09").option("--context <n>","\u6B63\u6587\u547D\u4E2D\u524D\u540E\u5404\u51E0\u6761 action\uFF08\u9ED8\u8BA4 3\uFF09").action(Y(y=>{let w=jc(Pe(y),ue(y),{offset:So(y,"offset"),limit:So(y,"limit"),context:So(y,"context")});return[{text:zc(w),data:{op:"refs",changed:!1,...w}},B]},t));Ie(r,["\u4EBA\u7269/\u573A\u666F/\u9053\u5177 ID \u6216\u540D\u79F0\uFF0C\u6216 <\u8D44\u4EA7>/<\u9020\u578B>\uFF1B\u6B63\u6587\u63D0\u53CA\u4E0D\u7B49\u4E8E\u5B9E\u9645\u51FA\u573A"]);let s=se(e.command("span <range>"),"read").description("\u628A\u4E00\u6BB5 action \u6362\u7B97\u6210\u96C6\u5185\u89C6\u9891\u65F6\u95F4\u7A97\u53E3\uFF08\u534A\u5F00\u533A\u95F4\uFF09").action(Y(y=>{let w=Pe(y);return qe(()=>Mu(w,ue(y)),"span",()=>({rows:[Qc(w,ue(y))]}))},t));Ie(s,[`${qn}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),se(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(Y(y=>{let w=Pe(y),I=Xo(w);return[{text:Ju(w),data:{op:"script.validate",changed:!1,passed:I.ok,script_path:w.path,stats:{actors:w.assets.filter(E=>E.kind==="actor").length,locations:w.assets.filter(E=>E.kind==="location").length,props:w.assets.filter(E=>E.kind==="prop").length,episodes:w.episodes.length,scenes:w.episodes.reduce((E,A)=>E+A.scenes.length,0),actions:Qn(w).length},issues:[...I.errors.map(E=>({...E,severity:"error"})),...I.warnings.map(E=>({...E,severity:"warning"}))]}},I.ok?B:Ln]},t)),se(e.command("issues"),"read").description("\u5217\u5F53\u524D\u6821\u9A8C\u95EE\u9898").option("--severity <severity>","error | warning").option("--code <code>","\u6309 issue code \u8FC7\u6EE4").action(Y(y=>qe(()=>qc(Pe(y),{...le(y,"severity")?{severity:le(y,"severity")}:{},...le(y,"code")?{code:le(y,"code")}:{}}),"issues"),t));let c=se(e.command("edit <addr>"),"write").description(`\u6539\u4E00\u4E2A\u8282\u70B9\u7684\u5B57\u6BB5\uFF1B\u5730\u5740\u51B3\u5B9A\u54EA\u4E9B\u5B57\u6BB5\u5408\u6CD5\u3002${qn}`).option("--content <text>","action \u6B63\u6587").option("--paren <text>","\u8868\u6F14\u63D0\u793A").option("--no-paren","\u5220\u9664\u8868\u6F14\u63D0\u793A\u5B57\u6BB5").option("--speaker <name>","\u4EBA\u7269\u540D\u6216 `\u540D\u5B57\xB7\u72B6\u6001`\uFF1B\u65C1\u767D/\u5E7F\u64AD/\u753B\u5916/\u7FA4\u58F0\u4EA6\u53EF").option("--ts <time>","\u65F6\u95F4\u6233").option("--no-ts","\u5220\u9664\u65F6\u95F4\u6233").option("--type <type>","action | dialogue | inner_thought | transition").option("--transition <spec>","\u8F6C\u573A\u63D0\u793A `\u76EE\u6807|\u8FC7\u7A0B|\u5BF9\u6BD4`").option("--no-transition","\u5220\u9664\u8F6C\u573A\u63D0\u793A").option("--name <text>","\u8D44\u4EA7 / \u72B6\u6001\u540D").option("--desc <text>","\u8D44\u4EA7 / \u72B6\u6001\u63CF\u8FF0").option("--importance <tier>","featured | background").option("--role <type>","\u4E3B\u89D2 | \u914D\u89D2").option("--alias <list>","\u8D44\u4EA7\u522B\u540D\uFF0C\u9017\u53F7\u5206\u9694").option("--space <space>","\u573A\uFF1Ainterior | exterior").option("--time <time>","\u573A\uFF1Aday | night | dawn | dusk").option("--title <text>","\u96C6 / \u5267\u672C\u6807\u9898").option("--synopsis <text>","\u96C6 / \u5267\u672C\u6897\u6982").option("--logline <text>","\u5267\u672C logline").option("--theme <text>","\u5267\u672C\u4E3B\u9898").option("--worldview <text>","\u5267\u672C\u4E16\u754C\u89C2").option("--style <text>","\u5267\u672C\u98CE\u683C").option("--main <list>","\u4E3B\u8981\u4EBA\u7269 `\u540D\u5B57=\u5B9A\u4F4D,\u2026`").action(Y(y=>{let w={};for(let I of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let E=le(y,I);E!==void 0&&(w[I]=E)}for(let I of["paren","ts","transition"])if(y[I]===!1)w[I]=null;else{let E=le(y,I);E!==void 0&&(w[I]=E)}return y.alias!==void 0&&(w.aliases=ed(y.alias)),qe(()=>Lu(Pe(y),ue(y),w),"edit")},t));Ie(c,[qn]);let a=se(e.command("insert <addr> <content>"),"write").description("\u5728\u67D0\u6761 action \u524D/\u540E\u63D2\u5165\u4E00\u6761\u65B0 action").requiredOption("-t, --type <type>","action | dialogue | inner_thought | transition").option("--before","\u63D2\u5230\u76EE\u6807\u4E4B\u524D\uFF08\u9ED8\u8BA4\u4E4B\u540E\uFF09").option("-a, --speaker <name>","dialogue / inner_thought \u5FC5\u586B").option("--paren <text>","\u8868\u6F14\u63D0\u793A").action(Y(y=>qe(()=>Tu(Pe(y),ue(y),y.before?"before":"after",le(y,"type"),ue(y,1),le(y,"speaker"),le(y,"paren")),"insert"),t));Ie(a,["\u76F8\u90BB action \u7684\u5730\u5740","\u65B0 action \u7684\u6B63\u6587"]);let d=se(e.command("move <addr> <to>"),"write").description("\u628A\u4E00\u6761 action \u632A\u5230\u53E6\u4E00\u6761\u65C1\u8FB9\uFF1B\u8DE8\u573A\u4E5F\u4FDD\u6301 action_id").option("--before","\u632A\u5230\u76EE\u6807\u4E4B\u524D\uFF08\u9ED8\u8BA4\u4E4B\u540E\uFF09").action(Y(y=>qe(()=>Cu(Pe(y),ue(y),ue(y,1),y.before?"before":"after"),"move"),t));Ie(d,["\u8981\u632A\u7684 action","\u76EE\u6807\u90BB\u5C45 action"]);let p=se(e.command("write <addr>"),"write").description("\u7528 read \u8F93\u51FA\u7684\u540C\u4E00\u4EFD\u6B63\u6587\u683C\u5F0F\u56DE\u5199\u6574\u573A / \u6574\u96C6 / \u65B0\u96C6\uFF08`+`\uFF09").option("-f, --file <path>","\u6B63\u6587\u6587\u4EF6\uFF1B\u7701\u7565\u5219\u8BFB stdin").option("--allow-delete","\u5141\u8BB8\u5220\u9664\u6587\u672C\u91CC\u6D88\u5931\u7684\u573A / action").action(Y(async y=>{let w=await import("node:fs"),I=le(y,"file"),E=I?w.readFileSync(I,"utf8"):w.readFileSync(0,"utf8");return qe(()=>Pu(Pe(y),ue(y),E,{allowDelete:!!y.allow_delete}),"write")},t));Ie(p,["\u573A / \u96C6\u5730\u5740\uFF0C\u6216 `+` \u8FFD\u52A0\u65B0\u96C6"]);let l=se(e.command("replace <pattern> <to>"),"write").description("\u6279\u91CF\u66FF\u6362\u6B63\u6587\uFF1B\u9ED8\u8BA4\u53EA\u9884\u89C8\uFF0C--apply \u624D\u843D\u76D8\u3002\u8FC7\u6EE4\u53C2\u6570\u4E0E find \u76F8\u540C").option("-i, --in <addr>","\u9650\u5236\u8303\u56F4").option("-a, --speaker <name>","\u9650\u5B9A\u8BF4\u8BDD\u4EBA").option("-t, --type <type>","\u9650\u5B9A action \u7C7B\u578B").option("--apply","\u771F\u7684\u5199\u5165").action(Y(y=>qe(()=>Gu(Pe(y),ue(y),ue(y,1),{...le(y,"in")?{in:le(y,"in")}:{},...le(y,"speaker")?{speaker:le(y,"speaker")}:{},...le(y,"type")?{type:le(y,"type")}:{},...y.apply?{apply:!0}:{}}),"replace"),t));Ie(l,["\u6B63\u5219","\u66FF\u6362\u6210\u4EC0\u4E48"]);let f=se(e.command("ref <scene> <asset>"),"write").description("\u6539\u4E00\u4E2A\u573A\u5BF9\u67D0\u8D44\u4EA7\u7684\u5F15\u7528\uFF1B--state \u662F\u5B8C\u6574\u72B6\u6001\u96C6\u5408\u800C\u975E\u8FFD\u52A0").option("--state <list>","\u5B8C\u6574\u72B6\u6001\u96C6\u5408\uFF08\u540D\u5B57\u6216 ID\uFF09\uFF0C\u9017\u53F7\u5206\u9694\u6216\u91CD\u590D\u7ED9\u51FA",xE,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(Y(y=>qe(()=>Du(Pe(y),ue(y),ue(y,1),ed(y.state).flatMap(w=>w.split(",")).map(w=>w.trim()).filter(Boolean),!!y.remove),"ref"),t));Ie(f,["\u573A\u5730\u5740","\u4EBA\u7269 / \u5730\u70B9 / \u9053\u5177\u7684\u540D\u5B57\u6216 ID"]);let u=se(e.command("asset <kind> <name>"),"write").description("\u767B\u8BB0\u4E00\u4E2A\u65B0\u7684 actor / location / prop").requiredOption("--desc <text>","\u63CF\u8FF0").option("--importance <tier>","featured | background","featured").option("--alias <list>","\u522B\u540D\uFF0C\u9017\u53F7\u5206\u9694").action(Y(y=>qe(()=>Ku(Pe(y),ue(y),ue(y,1),le(y,"desc")??"",le(y,"importance")??"featured",ed(y.alias)),"asset"),t));Ie(u,["actor | location | prop","\u540D\u5B57"]);let m=se(e.command("state <asset> <name>"),"write").description("\u7ED9\u5DF2\u6709\u8D44\u4EA7\u52A0\u4E00\u4E2A\u72B6\u6001\uFF08\u9020\u578B\u6863\u4F4D\uFF09").requiredOption("--desc <text>","\u63CF\u8FF0").action(Y(y=>qe(()=>ju(Pe(y),ue(y),ue(y,1),le(y,"desc")??""),"state"),t));Ie(m,["\u8D44\u4EA7\u540D\u6216 ID","\u72B6\u6001\u540D"]);let g=se(e.command("del <addr>"),"write").description("\u5220\u9664 action / \u573A / \u96C6 / \u8D44\u4EA7 / \u72B6\u6001").option("--replacement <state>","\u5220\u72B6\u6001\u65F6\u628A\u5F15\u7528\u6539\u5199\u5230\u8FD9\u4E2A\u72B6\u6001").option("--force","\u5BB9\u5668\u975E\u7A7A\u65F6\u4ECD\u7136\u5220\u9664").action(Y(y=>qe(()=>Hu(Pe(y),ue(y),{...le(y,"replacement")?{replacement:le(y,"replacement")}:{},...y.force?{force:!0}:{}}),"del"),t));Ie(g,[qn]);let h=se(e.command("merge <src> <dst>"),"write").description("\u628A\u4E00\u4E2A\u8D44\u4EA7\u5E76\u5165\u53E6\u4E00\u4E2A\uFF1A\u5168\u90E8\u573A\u666F\u5F15\u7528\u4E0E speaker \u6539\u5199\u8FC7\u53BB").action(Y(y=>qe(()=>Xc(Pe(y),ue(y),ue(y,1)),"merge"),t));Ie(h,["\u88AB\u5E76\u5165\u7684\u8D44\u4EA7","\u4FDD\u7559\u7684\u8D44\u4EA7"]);let _=se(e.command("ext <addr> [key] [value]"),"write").description("\u8BFB\u6216\u5199\u4EFB\u610F\u8282\u70B9\u7684 extend \u6570\u636E").option("--remove","\u5220\u9664\u8BE5 key").action(Y(y=>qe(()=>zu(Pe(y),ue(y),ue(y,1)||void 0,ue(y,2)||void 0,!!y.remove),"ext"),t));Ie(_,[qn,"extend key","\u503C"])}function xE(e,t){return[...t,e]}import*as cg from"node:path";import*as _s from"node:fs";import*as ws from"node:path";var SE=[".txt",".md",".docx"],td={".mp4":"video/mp4",".mov":"video/mov",".avi":"video/avi",".mpeg":"video/mpeg",".mpg":"video/mpg",".webm":"video/webm",".flv":"video/x-flv",".wmv":"video/wmv"},ys=class extends Error{constructor(n){super(`Unsupported input: ${n}`);this.received=n}received};function qu(e){return ws.extname(e).toLowerCase()}function Wu(e){return Object.hasOwn(td,e)}function Wn(e){if(_s.statSync(e).isDirectory()){let o=_s.readdirSync(e).filter(i=>!i.startsWith(".")).filter(i=>Wu(qu(i))).sort().map(i=>ws.join(e,i));if(o.length===0)throw new ys(`directory has no supported video files: ${e}`);return{kind:"video-directory",path:e,files:o}}let n=qu(e);if(SE.includes(n))return{kind:"text",path:e,ext:n};if(Wu(n))return{kind:"video-file",path:e,ext:n};throw new ys(`file extension ${n||"(none)"} is not supported by ingest (txt/md/docx/video only)`)}var kn={createExecutor:uu};import*as Md from"node:fs";import*as ci from"node:path";var sn=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();var nr=e=>String(e).padStart(3,"0"),nd=e=>e.normalize("NFC").replace(/\s+/g," ").trim();function Zu(e,t={}){let n=[],o=[],i=null,r=null,s=0,c=0,a=new Map,d=(l,f)=>{let u=`text:${l}:${f.chunk}:${f.line_start}:${f.line_end}`,m=(a.get(u)??0)+1;return a.set(u,m),`${u}:${m}`},p=(l,f)=>{let u=l.actors.find(m=>nd(m.name)===nd(f.name));u?f.state&&!u.state&&(u.state=f.state):l.actors.push(f)};for(let l of e)switch(l.kind){case"episode":{s++,i={identity_key:d("episode",l.source),episode_id:`ep_${nr(s)}`,scenes:[]},l.title!==void 0&&(i.title=l.title),n.push(i),r=null;break}case"scene":{i||(s++,i={identity_key:d("synthetic-episode",l.source),episode_id:`ep_${nr(s)}`,scenes:[]},n.push(i)),c++,r={identity_key:d("scene",l.source),scene_id:`scn_${nr(c)}`,location:l.location?{...l.location}:null,actors:(l.actors??[]).map(f=>({...f})),props:(l.props??[]).map(f=>({...f})),actions:[]},l.environment&&(r.environment=l.environment),i.scenes.push(r);break}case"note":o.push({content:l.content,...l.category?{category:l.category}:{},source:l.source});break;case"action":case"transition":{if(!r){o.push({content:l.content,category:"preamble",source:l.source});break}r.actions.push({identity_key:d(l.kind,l.source),type:l.kind,content:l.content});break}case"dialogue":case"inner_thought":{if(!r){o.push({content:l.content,category:"preamble",source:l.source});break}let f={identity_key:d(l.kind,l.source),type:l.kind,content:l.content,speaker:l.speaker};l.emotion!==void 0&&(f.emotion=l.emotion),r.actions.push(f),"name"in l.speaker&&p(r,l.speaker.state!==void 0?{name:l.speaker.name,state:l.speaker.state}:{name:l.speaker.name});break}}return{script:{title:t.title??"",episodes:n},notes:o}}var or=class{constructor(t,n,o){this.prefix=t;this.kind=n;this.nextStateId=o}prefix;kind;nextStateId;byNorm=new Map;order=[];ensure(t,n){let o=nd(t),i=this.byNorm.get(o);return i||(i={provisional_id:`${this.prefix}_${nr(this.order.length+1)}`,kind:this.kind,names:[],states:[],occurrences:[]},this.byNorm.set(o,i),this.order.push(i)),i.names.includes(t)||i.names.push(t),i.occurrences.push(n),i}stateId(t,n){let o=sn(n),i=t.states.find(s=>sn(s.name)===o);if(i)return i.id;let r=this.nextStateId();return t.states.push({name:n,id:r}),r}list(){return this.order}};function IE(e){let t=[{state_id:"default",state_name:"default",description:""}];for(let n of e.states)t.push({state_id:n.id,state_name:n.name,description:""});return t}function Es(e){let t=0,n=()=>`st_${nr(++t)}`,o=new or("act","actor",n),i=new or("loc","location",n),r=new or("prp","prop",n),s={episode:{},scene:{},action:{}},c={episode:new Set,scene:new Set,action:new Set},a=(u,m,g)=>{if(!g||c[u].has(g))throw new Error(`Duplicate or missing ${u} source identity: ${g}`);c[u].add(g),s[u][m]=g},d=(u,m,g,h)=>{let _=u.ensure(m.name,g),y={[h]:_.provisional_id};return m.state!==void 0&&(y.state_id=u.stateId(_,m.state)),y},p=e.episodes.map((u,m)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((g,h)=>{let _=`${u.episode_id}/${g.scene_id}`;a("scene",_,g.identity_key);let y={episode:m,scene:h},w=g.location?d(i,g.location,y,"location_id"):null,I=g.actors.map(k=>d(o,k,y,"actor_id")),E=g.props.map(k=>d(r,k,y,"prop_id")),A=g.actions.map((k,D)=>{a("action",`${_}#${D}`,k.identity_key);let R={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let S=o.ensure(k.speaker.name,y),M={actor_id:S.provisional_id};k.speaker.state!==void 0&&(M.state_id=o.stateId(S,k.speaker.state)),R.speaker=M}else R.speaker=k.speaker.label!==void 0?{kind:k.speaker.kind,label:k.speaker.label}:{kind:k.speaker.kind};return(k.type==="dialogue"||k.type==="inner_thought")&&(k.parenthetical!==void 0?R.emotion=k.parenthetical:k.emotion!==void 0&&(R.emotion=k.emotion)),k.extend!==void 0&&(R.extend=k.extend),R});return{scene_id:g.scene_id,...g.environment?{environment:g.environment}:{},location:w,actors:I,props:E,actions:A}})})),l=(u,m,g)=>u.list().map(h=>({[m]:h.provisional_id,[g]:h.names[0]??h.provisional_id,aliases:h.names.slice(1),description:"",states:IE(h)}));return{script:{version:3,title:e.title,worldview:"",style:"",actors:l(o,"actor_id","actor_name"),locations:l(i,"location_id","location_name"),props:l(r,"prop_id","prop_name"),episodes:p},assets:[...o.list(),...i.list(),...r.list()],identityKeys:s}}function Xu(e,t={}){let n=t.maxChars??500,o=e.split(`
|
|
213
|
+
`),i=[],r=0,s=0,c=a=>{let d=o.slice(r,a).join(`
|
|
214
|
+
`);return d.trim()===""?!1:(i.push({index:i.length,core_line_start:r,core_line_end:a,text:d}),r=a,s=0,!0)};for(let a=0;a<o.length;a++){let d=o[a],l=s+(a===r?0:1)+d.length;d.trim()!==""&&a>r&&l>n&&c(a)?s=d.length:s=l}return c(o.length),i}var ef=["episode","scene","action","dialogue","inner_thought","transition","note"];var AE={day:"day",\u65E5:"day",\u767D\u5929:"day",\u65E5\u95F4:"day",\u663C:"day",\u663C\u95F4:"day",night:"night",\u591C:"night",\u591C\u665A:"night",\u591C\u95F4:"night",\u665A:"night",dawn:"dawn",\u6668:"dawn",\u6E05\u6668:"dawn",\u65E9\u6668:"dawn",\u9ECE\u660E:"dawn",\u62C2\u6653:"dawn",dusk:"dusk",\u660F:"dusk",\u9EC4\u660F:"dusk",\u508D\u665A:"dusk",\u65E5\u843D:"dusk"};function ei(e){if(typeof e!="string")return;let t=e.normalize("NFC").replace(/\s+/g,"").trim().toLocaleLowerCase();return AE[t]}var me=class extends Error{constructor(n,o){super(`line ${o}: ${n}`);this.line=o}line};function ni(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Dt(e,t,n){for(let o of Object.keys(e))if(!t.includes(o))throw new me(`unknown field '${o}'`,n)}function kE(e,t){if(!ni(e))throw new me("missing source",t);Dt(e,["chunk","line_start","line_end"],t);let{chunk:n,line_start:o,line_end:i}=e;if(![n,o,i].every(r=>typeof r=="number"&&Number.isInteger(r)&&r>=0))throw new me("source needs integer chunk/line_start/line_end",t);if(o>=i)throw new me("source line_start must be < line_end",t);return{chunk:n,line_start:o,line_end:i}}function ti(e,t,n){let o=e[t];if(typeof o!="string"||o==="")throw new me(`'${t}' must be a non-empty string`,n);return o}function Zn(e,t,n){if(!(t in e)||e[t]===void 0)return;let o=e[t];if(typeof o!="string"||o==="")throw new me(`'${t}' must be a non-empty string`,n);return o}function tf(e,t,n){if(!Array.isArray(e))throw new me(`'${t}' must be an array`,n);return e.map(o=>{if(!ni(o))throw new me(`'${t}' entries must be objects`,n);Dt(o,["name","state"],n);let i={name:ti(o,"name",n)},r=Zn(o,"state",n);return r!==void 0&&(i.state=r),i})}function bE(e,t){if(!ni(e))throw new me("dialogue/inner_thought needs a speaker",t);if("kind"in e){Dt(e,["kind","label"],t);let r=e.kind;if(typeof r!="string"||!un.includes(r))throw new me(`speaker.kind must be one of ${un.join("|")}`,t);let s={kind:r},c=Zn(e,"label",t);return c!==void 0&&(s.label=c),s}Dt(e,["name","state"],t);let n=ti(e,"name",t);if(!/[\p{L}\p{N}]/u.test(n))throw new me("speaker.name must contain a letter or number",t);let o={name:n},i=Zn(e,"state",t);return i!==void 0&&(o.state=i),o}function vE(e,t){let n=e.kind;if(typeof n!="string"||!ef.includes(n))throw new me(`unknown or missing kind '${String(n)}'`,t);let o=kE(e.source,t);switch(n){case"episode":{Dt(e,["kind","episode","title","source"],t);let i=e.episode;if(typeof i!="number"||!Number.isInteger(i))throw new me("episode must be an integer",t);let r={kind:n,episode:i,source:o},s=Zn(e,"title",t);return s!==void 0&&(r.title=s),r}case"scene":{Dt(e,["kind","scene","environment","location","actors","props","source"],t);let i={kind:n,source:o};if("scene"in e&&e.scene!==void 0){if(typeof e.scene!="number"||!Number.isInteger(e.scene))throw new me("scene must be an integer",t);i.scene=e.scene}if("environment"in e&&e.environment!==void 0){if(!ni(e.environment))throw new me("environment must be an object",t);Dt(e.environment,["space","time"],t);let r={},s=Zn(e.environment,"space",t);s!==void 0&&(r.space=s);let c=Zn(e.environment,"time",t);if(c!==void 0){let a=ei(c);if(!a)throw new me("environment.time must be day|night|dawn|dusk or a recognized Chinese equivalent",t);r.time=a}i.environment=r}if("location"in e&&e.location!==void 0){if(!ni(e.location))throw new me("location must be an object",t);Dt(e.location,["name","state"],t);let r={name:ti(e.location,"name",t)},s=Zn(e.location,"state",t);s!==void 0&&(r.state=s),i.location=r}return"actors"in e&&e.actors!==void 0&&(i.actors=tf(e.actors,"actors",t)),"props"in e&&e.props!==void 0&&(i.props=tf(e.props,"props",t)),i}case"action":case"transition":{Dt(e,["kind","content","source"],t);let i=ti(e,"content",t);return{kind:n,content:i,source:o}}case"dialogue":case"inner_thought":{Dt(e,["kind","speaker","content","emotion","source"],t);let i=ti(e,"content",t),r=bE(e.speaker,t),s={kind:n,speaker:r,content:i,source:o},c=Zn(e,"emotion",t);return c!==void 0&&(s.emotion=c),s}case"note":{Dt(e,["kind","content","category","source"],t);let i=ti(e,"content",t),r={kind:n,content:i,source:o};if("category"in e&&e.category!==void 0){let s=e.category;if(s!=="author_note"&&s!=="format_note"&&s!=="unclassified")throw new me("note.category must be author_note|format_note|unclassified",t);r.category=s}return r}default:throw new me(`unhandled kind '${n}'`,t)}}function ir(e,t=0){let n=[],o=e.split(`
|
|
215
|
+
`);for(let i=0;i<o.length;i++){let r=o[i].trim();if(r==="")continue;let s;try{s=JSON.parse(r)}catch{throw new me("invalid JSON",i+1+t)}if(!ni(s))throw new me("record must be a JSON object",i+1+t);n.push(vE(s,i+1+t))}return n}var q=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),Io=e=>{let t=/[((]/.exec(e);return!t||t.index===0?e:e.slice(0,t.index).trim()},OE=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,id=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,sf=()=>({newEntities:[],merges:[],looks:[],lookChanges:[],subEvents:[],summary:""}),af=()=>({entities:[],lookChanges:{},recent:[],synopsis:[]}),rd={recentEpisodes:6,synopsisChars:3500,arcFold:10},RE=1e4;function cf(e){let t=0,n=0;for(let o of e){n++;let i=o.codePointAt(0);(i>=13312&&i<=40959||i>=12288&&i<=12543||i>=65280&&i<=65519||i>=63744&&i<=64255)&&t++}return Math.round(t*.7+(n-t)*.25)}function df(e,t=RE){let n=[],o=0,i=0;for(let r=0;r<e.length;r++)r>o&&i+e[r]>t&&(n.push([o+1,r]),o=r,i=0),i+=e[r];return o<e.length&&n.push([o+1,e.length]),n}var NE={actor:"\u4EBA\u7269",location:"\u573A\u666F",prop:"\u9053\u5177"};function vt(e,t){let n=q(t);return e.entities.find(o=>q(o.canonical)===n||o.aliases.some(i=>q(i)===n))}var nf=(e,t)=>{q(t)!==q(e.canonical)&&!e.aliases.some(n=>q(n)===q(t))&&e.aliases.push(t)},ME=["\u5E74\u8F7B","\u5E74\u8001","\u5E74\u5E7C","\u5E74\u5C11","\u4E2D\u5E74","\u9752\u5E74","\u5C11\u5E74","\u8001\u5E74","\u5E7C\u5E74","\u8001","\u5C0F","\u5927","\u5C11","\u5E7C"];function LE(e,t){let n=q(e),o=q(t);if(n===o||!n.includes(o))return!1;let i=n.replace(o,"").trim();return i.length>0&&!ME.some(r=>i===r||i.startsWith(r))}function TE(e){let t=e.filter(n=>e.some(o=>o!==n&&LE(n,o)));return t.length?t.reduce((n,o)=>o.length>n.length?o:n):e[0]}var of=["\u4F17\u4EBA","\u7FA4\u4F17","\u6C11\u4F17","\u89C2\u4F17","\u4EBA\u7FA4","\u4EBA\u4EEC","\u5927\u5BB6","\u8DEF\u4EBA","\u884C\u4EBA","\u770B\u5BA2","\u56F4\u89C2\u8005","\u6751\u6C11","\u58EB\u5175","\u767E\u59D3","\u5B66\u751F","\u540C\u5B66","\u4E2B\u9B1F","\u968F\u4ECE","\u4F8D\u536B","\u5BB6\u4E01","\u4EC6\u4EBA","\u4E0B\u4EBA","\u5B69\u5B50","\u8F7F\u592B","\u62A4\u536B","\u624B\u4E0B","\u5C0F\u5F1F","\u55BD\u5570","\u5B98\u5175","\u8859\u5F79","\u592A\u76D1","\u5BAB\u5973","\u5A62\u5973","\u5546\u8D29","\u98DF\u5BA2"],CE=["\u4F17\u4EBA","\u7FA4\u4F17","\u6C11\u4F17","\u89C2\u4F17","\u4EBA\u7FA4","\u4EBA\u4EEC","\u5927\u5BB6","\u767E\u59D3","\u5B98\u5175"],UE=/^(?:一群|一众|全体|所有|几名|数名|多名|[0-9零一二两三四五六七八九十百千]+名?)/;function lt(e){let t=q(e).replace(/[0-9零一二两三四五六七八九十百千]+名?$/,"").trim();return t?t.endsWith("\u4EEC")||of.includes(t)||CE.some(n=>t.endsWith(n))?!0:UE.test(t)&&of.some(n=>t.endsWith(n)):!1}function Xn(e,t){let n=Io(t);return vt(e,n)?.canonical??n}function PE(e,t){let n=q(t);return e.looks.find(o=>q(o.name)===n||o.aliases.some(i=>q(i)===n))?.name??t}var VE=["\u5E38\u6001","\u65E5\u5E38","\u5E73\u65F6","\u57FA\u7840","\u666E\u901A"];function sd(e){if(e.looks.length!==0)return(e.looks.find(t=>VE.some(n=>t.name.includes(n)))??e.looks[0]).name}function od(e,t,n,o){let i=q(Io(n));if(i)return e.entities.find(r=>r.kind===t&&r!==o&&(q(r.canonical)===i||r.aliases.some(s=>q(s)===i)))}function rf(e){let t=[e.canonical,...e.aliases],n=TE(t);q(n)!==q(e.canonical)&&(e.canonical=n,e.aliases=t.filter(o=>q(o)!==q(n)))}function rr(e,t,n,o=n){for(let r of t.newEntities){let s=Io(r.name);if(!s)continue;let c=od(e,r.kind,s);if(!c){let d=[];for(let p of r.aliases){let l=Io(p);l&&q(l)!==q(s)&&!od(e,r.kind,l)&&d.push(l)}e.entities.push({kind:r.kind,canonical:s,aliases:[...new Set(d)],description:r.description,looks:[{name:r.defaultLook.name,aliases:[],description:r.defaultLook.description}],lastSeen:o});continue}for(let d of r.aliases){let p=Io(d);p&&!od(e,r.kind,p,c)&&nf(c,p)}!c.description&&r.description&&(c.description=r.description);let a=c.looks.find(d=>q(d.name)===q(r.defaultLook.name));a?a.description=r.defaultLook.description:c.looks.unshift({name:r.defaultLook.name,aliases:[],description:r.defaultLook.description}),rf(c)}for(let{from:r,into:s}of t.merges){let c=Io(s);if(!c)continue;let a=vt(e,c);if(!a)continue;let d=Io(r);!d||q(d)===q(a.canonical)||vt(e,d)||(nf(a,d),rf(a))}for(let{entity:r,names:s,description:c}of t.looks){let a=vt(e,r);if(!a)continue;let d=s.map(f=>f.trim()).filter(Boolean);if(!d.length)continue;let p=d[0],l=a.looks.find(f=>q(f.name)===q(p)||d.some(u=>f.aliases.some(m=>q(m)===q(u))));if(l){c&&(l.description=c);for(let f of d)q(f)!==q(l.name)&&!l.aliases.some(u=>q(u)===q(f))&&l.aliases.push(f)}else a.looks.push({name:p,aliases:d.slice(1),description:c})}for(let r of t.lookChanges){let s=r.scene.trim(),c=Xn(e,r.entity),a=r.look.trim();if(!s||!c||!a)continue;let d=vt(e,c),p=d?PE(d,a):a;(e.lookChanges[s]??=[]).push({entity:c,look:p}),d&&(d.currentLook=p)}let i=new Set;for(let r of t.newEntities){i.add(r.name);for(let s of r.aliases)i.add(s)}for(let r of t.merges)i.add(r.from),i.add(r.into);for(let r of t.looks)i.add(r.entity);for(let r of t.lookChanges)i.add(r.entity);for(let r of i){let s=vt(e,r);s&&(s.lastSeen=o)}return e.recent.push({startEp:n,endEp:o,summary:t.summary,subEvents:t.subEvents}),e}var $E=e=>e.summary.length+e.subEvents.reduce((t,n)=>t+n.length,0);function pf(e,t=rd){for(;e.recent.length>t.recentEpisodes||e.recent.length>1&&e.recent.reduce((n,o)=>n+$E(o),0)>6e3;){let n=e.recent.shift();n.summary.trim()&&e.synopsis.push({startEp:n.startEp,endEp:n.endEp,line:n.summary.trim()})}return e}function ad(e,t=rd){return e.synopsis.reduce((o,i)=>o+i.line.length,0)<=t.synopsisChars||e.synopsis.length<=t.arcFold?null:e.synopsis.slice(0,t.arcFold)}function lf(e,t,n=rd){let o=e.synopsis.splice(0,n.arcFold);o.length&&e.synopsis.unshift({startEp:o[0].startEp,endEp:o[o.length-1].endEp,line:t.trim()})}var DE=6;function xs(e,t){let n=i=>t===void 0||i.lastSeen>=t-DE,o=["# \u8BBE\u5B9A"];for(let i of["actor","location","prop"]){let r=e.entities.filter(s=>s.kind===i);if(r.length){o.push(`## ${NE[i]}`);for(let s of r){let c=[...s.aliases.length?[`\u522B\u540D ${s.aliases.join("\u3001")}`]:[],...s.currentLook?[`\u5F53\u524D\u9020\u578B ${s.currentLook}`]:[]];if(o.push(`- ${s.canonical}\uFF5C${c.join("\uFF5C")}`),!!n(s)){s.description&&o.push(` \u7B80\u4ECB\uFF1A${s.description}`);for(let a of s.looks){let d=a.aliases.length?`${a.name}(=${a.aliases.join("=")})`:a.name;o.push(` \u9020\u578B ${d}${a.description?`\uFF1A${a.description}`:""}`)}}}}}if(e.synopsis.length){o.push("","# \u524D\u60C5");for(let i of e.synopsis)o.push(`- ${id(i)}\uFF1A${i.line}`)}if(e.recent.length){o.push("","# \u6700\u8FD1");for(let i of e.recent){o.push(`## ${OE(i)}`),i.summary.trim()&&o.push(`\u6897\u6982\uFF1A${i.summary.trim()}`);for(let r of i.subEvents)o.push(`- ${r}`)}}return o.join(`
|
|
216
|
+
`)}var GE=/(?:^|[,。!?;:、\s“”"'((])(他们|她们|它们|其中一人|另一个人|前者|后者|对方|有人|两人|他|她|它)(?!人)/;function Ss(e){let t=[],n=(o,i,r)=>{t.push({code:o,path:i,message:r})};return e.actors.forEach((o,i)=>{lt(o.actor_name)&&n("production_crowd_actor",`$.actors[${i}].actor_name`,`${o.actor_name} is a group speaker, not an actor asset`)}),e.episodes.forEach((o,i)=>{o.scenes.forEach((r,s)=>{let c=`$.episodes[${i}].scenes[${s}]`;r.location===null&&n("production_location_missing",`${c}.location`,"production scene needs one stable location"),r.actions.forEach((a,d)=>{let p=`${c}.actions[${d}]`;if(a.type==="action"){let l=GE.exec(a.content);l&&n("production_action_pronoun",`${p}.content`,`action uses ambiguous reference ${l[1]}`)}})})}),t}var je=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),nt=e=>Array.isArray(e),Is=e=>String(e).padStart(3,"0"),cd=[{key:"actors",idField:"actor_id",prefix:"act"},{key:"locations",idField:"location_id",prefix:"loc"},{key:"props",idField:"prop_id",prefix:"prp"}];function As(e){if(!je(e))throw new Error("renumberIds expects a script object");let t=JSON.parse(JSON.stringify(e)),n={episodes:{},scenes:{},actors:{},locations:{},props:{},states:{}},o={actors:[],locations:[],props:[]},i={actors:new Set,locations:new Set,props:new Set},r=(a,d)=>{typeof d=="string"&&!i[a].has(d)&&(i[a].add(d),o[a].push(d))};for(let a of nt(t.episodes)?t.episodes:[])if(!(!je(a)||!nt(a.scenes))){for(let d of a.scenes)if(je(d)){je(d.location)&&r("locations",d.location.location_id);for(let p of nt(d.actors)?d.actors:[])je(p)&&r("actors",p.actor_id);for(let p of nt(d.props)?d.props:[])je(p)&&r("props",p.prop_id);for(let p of nt(d.actions)?d.actions:[])je(p)&&je(p.speaker)&&r("actors",p.speaker.actor_id)}}for(let{key:a,idField:d}of cd)for(let p of nt(t[a])?t[a]:[])je(p)&&r(a,p[d]);for(let{key:a,prefix:d}of cd)o[a].forEach((p,l)=>{n[a][p]=`${d}_${Is(l+1)}`});for(let{key:a,idField:d}of cd){let p=(nt(t[a])?t[a]:[]).filter(je),l=n[a],f=new Map;for(let u of p){let m=u[d],g=l[m]??m;u[d]=g;let h=0;for(let _ of nt(u.states)?u.states:[]){if(!je(_)||typeof _.state_id!="string"||_.state_id==="default")continue;let y=`st_${Is(++h)}`;n.states[_.state_id]=y,_.state_id=y}f.set(g,u)}t[a]=[...f.entries()].sort((u,m)=>u[0]<m[0]?-1:1).map(u=>u[1])}let s=0;(nt(t.episodes)?t.episodes:[]).forEach((a,d)=>{if(je(a)){if(typeof a.episode_id=="string"){let p=`ep_${Is(d+1)}`;n.episodes[a.episode_id]=p,a.episode_id=p}for(let p of nt(a.scenes)?a.scenes:[])if(je(p)&&typeof p.scene_id=="string"){let l=`scn_${Is(++s)}`;n.scenes[p.scene_id]=l,p.scene_id=l}}});let c=(a,d,p)=>{!je(a)||typeof a[d]!="string"||(a[d]=n[p][a[d]]??a[d],typeof a.state_id=="string"&&n.states[a.state_id]&&(a.state_id=n.states[a.state_id]))};for(let a of nt(t.episodes)?t.episodes:[])if(!(!je(a)||!nt(a.scenes))){for(let d of a.scenes)if(je(d)){c(d.location,"location_id","locations");for(let p of nt(d.actors)?d.actors:[])c(p,"actor_id","actors");for(let p of nt(d.props)?d.props:[])c(p,"prop_id","props");for(let p of nt(d.actions)?d.actions:[])je(p)&&c(p.speaker,"actor_id","actors")}}return{script:t,idMap:n}}import{createHash as BE}from"node:crypto";function sr(e){let t=v(e).trim();if(!t.includes(":"))throw new x("Target invalid.",{exitCode:G,errorCode:"TARGET_INVALID",hint:"Use a concrete asset target.",data:{expected:["target: actor:<id>, location:<id>, or prop:<id>"],actual:[t||"<empty>"]}});let n=t.indexOf(":"),o=t.slice(0,n).trim(),i=t.slice(n+1).trim();if(!vp.has(o)||!i)throw new x("Target invalid.",{exitCode:G,errorCode:"TARGET_INVALID",hint:"Use actor, location, or prop with a non-empty id.",data:{expected:["target: actor:<id>, location:<id>, or prop:<id>"],actual:[t]}});return[o,i]}function oi(){return{version:3,actor:{},location:{},prop:{},state:{},episode:{},scene:{},action:{}}}function Ot(e,t){let n=e.get(t);if(n===void 0)throw new Error(`Missing mapped ID for ${t}`);return n}function ii(e,t=oi(),n={}){if(t.version!==3)throw new Error(`Unsupported v4 identity map version: ${String(t.version)}`);let o=structuredClone(t),i={actor:new Map,location:new Map,prop:new Map},r={actor:new Set,location:new Set,prop:new Set,episode:new Set,scene:new Set,action:new Set},s=(S,M,$,T)=>{let O=$[M];if(O!==void 0){if(!C(S,O))throw new Error(`Invalid persisted ${S} ID for ${M}: ${O}`);if(T.has(O))throw new Error(`Duplicate persisted ${S} ID: ${O}`);return T.add(O),O}let j=ao(S,T);return T.add(j),$[M]=j,j},c=(S,M)=>n[S]?.[M]??M;for(let S of e.actors){let M=s("actor",c("actor",S.actor_id),o.actor,r.actor);i.actor.set(S.actor_id,M)}for(let S of e.locations){let M=s("location",c("location",S.location_id),o.location,r.location);i.location.set(S.location_id,M)}for(let S of e.props){let M=s("prop",c("prop",S.prop_id),o.prop,r.prop);i.prop.set(S.prop_id,M)}let a=new Map,d=(S,M,$)=>{let T=new Map,O=new Set,j=c(S,M),Z=o.state[j]??{};o.state[j]=Z;let De=$.map(J=>{let be;if(J.state_id==="default")be="default";else{let Qe=n.state?.[M]?.[J.state_id]??J.state_id,L=Z[Qe];if(L!==void 0){if(!C("state",L))throw new Error(`Invalid persisted state ID for ${M}/${J.state_id}: ${L}`);if(O.has(L))throw new Error(`Duplicate persisted state ID on ${M}: ${L}`);be=L}else be=ao("state",O),Z[Qe]=be}return O.add(be),T.set(J.state_id,be),{...J,state_id:be}});return a.set(M,T),De},p=(S,M)=>M===void 0?void 0:Ot(a.get(S)??new Map,M),l=e.actors.map(S=>({...S,actor_id:Ot(i.actor,S.actor_id),states:d("actor",S.actor_id,S.states)})),f=e.locations.map(S=>({...S,location_id:Ot(i.location,S.location_id),states:d("location",S.location_id,S.states)})),u=e.props.map(S=>({...S,prop_id:Ot(i.prop,S.prop_id),states:d("prop",S.prop_id,S.states)})),m=S=>{if("actor_id"in S){let M=p(S.actor_id,S.state_id);return{actor_id:Ot(i.actor,S.actor_id),...M===void 0?{}:{state_id:M}}}return S.label===void 0?{kind:S.kind}:{kind:S.kind,label:S.label}},g=S=>{if(S.includes(":")){let[$,T]=sr(S);return Ot($==="actor"?i.actor:$==="location"?i.location:i.prop,T)}let M=i.actor.get(S)??i.location.get(S)??i.prop.get(S);if(M===void 0)throw new Error(`Missing transition target mapping for ${S}`);return M},h=(S,M)=>{let $=s("action",M,o.action,r.action),T=S.transition_prompt===void 0?{}:{transition_prompt:{...S.transition_prompt,target:g(S.transition_prompt.target)}};if(S.type==="dialogue"||S.type==="inner_thought"){if(S.speaker===void 0)throw new Error(`Speaking action ${S.content.slice(0,40)} has no speaker`);return{action_id:$,type:S.type,content:S.content,speaker:m(S.speaker),...S.emotion===void 0?{}:{parenthetical:S.emotion},...T,...S.extend===void 0?{}:{extend:S.extend}}}return{action_id:$,type:S.type,content:S.content,...T,...S.extend===void 0?{}:{extend:S.extend}}},_=(S,M)=>[p(S,M??"default")??"default"],y=(S,M)=>{let $=new Map;for(let T of S){let O=Ot(i.actor,T.actor_id),j=$.get(O)??new Set;_(T.actor_id,T.state_id).forEach(Z=>j.add(Z)),$.set(O,j)}for(let T of M){if(T.speaker===void 0||!("actor_id"in T.speaker))continue;let O=T.speaker.actor_id,j=Ot(i.actor,O),Z=$.get(j)??new Set;_(O,T.speaker.state_id).forEach(De=>Z.add(De)),$.set(j,Z)}return[...$].map(([T,O])=>({actor_id:T,state_ids:[...O].sort()}))},w=S=>{let M=new Map;for(let $ of S){let T=Ot(i.prop,$.prop_id),O=M.get(T)??new Set;_($.prop_id,$.state_id).forEach(j=>O.add(j)),M.set(T,O)}return[...M].map(([$,T])=>({prop_id:$,state_ids:[...T].sort()}))},I=new Set,E=new Set,A=new Set,k={version:4,title:e.title,worldview:e.worldview,style:e.style,...e.worldview_raw===void 0?{}:{worldview_raw:e.worldview_raw},...e.synopsis===void 0?{}:{synopsis:e.synopsis},...e.logline===void 0?{}:{logline:e.logline},...e.theme===void 0?{}:{theme:e.theme},...e.main_characters===void 0?{}:{main_characters:e.main_characters},...e.extend===void 0?{}:{extend:e.extend},actors:l,locations:f,props:u,episodes:e.episodes.map(S=>{let M=n.episode?.[S.episode_id]??S.episode_id;I.add(M);let $=s("episode",M,o.episode,r.episode);return{...S,episode_id:$,scenes:S.scenes.map(T=>{let O=`${S.episode_id}/${T.scene_id}`,j=n.scene?.[O]??O;E.add(j);let Z=s("scene",j,o.scene,r.scene),De=new Map;return{...T,scene_id:Z,location:T.location===null?null:{location_id:Ot(i.location,T.location.location_id),state_ids:_(T.location.location_id,T.location.state_id)},actors:y(T.actors,T.actions),props:w(T.props),actions:T.actions.map((J,be)=>{let Qe=`${O}#${be}`,L=JSON.stringify(on(J)),oe=(De.get(L)??0)+1;De.set(L,oe);let he=BE("sha256").update(L).digest("hex"),rt=n.action?.[Qe]??`${j}:action:${he}:${oe}`;return A.add(rt),h(J,rt)})}})}})},D=(S,M)=>{for(let $ of Object.keys(S))M.has($)||delete S[$]};D(o.actor,new Set(e.actors.map(S=>c("actor",S.actor_id)))),D(o.location,new Set(e.locations.map(S=>c("location",S.location_id)))),D(o.prop,new Set(e.props.map(S=>c("prop",S.prop_id)))),D(o.episode,I),D(o.scene,E),D(o.action,A);let R=[...e.actors.map(S=>({id:c("actor",S.actor_id),oldId:S.actor_id,states:S.states})),...e.locations.map(S=>({id:c("location",S.location_id),oldId:S.location_id,states:S.states})),...e.props.map(S=>({id:c("prop",S.prop_id),oldId:S.prop_id,states:S.states}))];D(o.state,new Set(R.map(S=>S.id)));for(let S of R)D(o.state[S.id]??{},new Set(S.states.map(M=>n.state?.[S.oldId]?.[M.state_id]??M.state_id)));return{script:k,identityMap:o}}import*as wf from"node:fs";import*as uf from"node:fs";import ff from"jszip";import{XMLParser as jE}from"fast-xml-parser";function mf(e){return e==null?"":String(e)}function Rt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ae(e){return Array.isArray(e)}function gf(e){if(e.length===0)return"";let t=[],n="";for(let o=1;o<e.length;o++){let i=e[o];if(i.filter(p=>p).length===0)continue;let s=i[0]??"";if(s.includes("\u{1F3AC}")||/第\s*\d+\s*集/.test(s)){t.push(`
|
|
217
|
+
${s}`);continue}let c=i.length>1?i[1]??"":"";c||(c=n),n=c;let a=[];s&&a.push(`${s}.`);let d=i.slice(2).filter(p=>p);c&&d.length>0?a.push(`${c}\uFF0C${d.join(" ")}`):c?a.push(c):a.push(...d),t.push(a.join(" "))}return t.join(`
|
|
218
|
+
`)}function ri(e,t){let n=e[":@"];return Rt(n)?mf(n[t]).trim():""}function ks(e,t){for(let[n,o]of Object.entries(e))if(bn(n)===t&&Ae(o))return o;return null}function bs(e){let t=[],n=o=>{if(Ae(o)){for(let i of o)if(Rt(i))for(let[r,s]of Object.entries(i))r==="#text"&&s!==null&&s!==void 0?t.push(mf(s)):r!==":@"&&Ae(s)&&n(s)}};return n(e),t.join("")}function vs(e){let t=hf.parse(e);if(!Ae(t))throw new Error("xlsx xml part has an unexpected shape");return t}function eo(e,t){let n=[],o=i=>{let r=Ae(i)?i.filter(Rt):Rt(i)?[i]:[];for(let s of r)for(let[c,a]of Object.entries(s))bn(c)===t&&Ae(a)&&n.push(s),Ae(a)&&o(a)};return o(e),n}function zE(e){let t=/^[A-Z]+/i.exec(e.trim());if(!t)return null;let n=0;for(let o of t[0].toUpperCase())n=n*26+o.charCodeAt(0)-64;return n-1}function HE(e,t){let o=(t.startsWith("/")?t.slice(1):`${e}/${t}`).split("/"),i=[];for(let r of o)!r||r==="."||(r===".."?i.pop():i.push(r));return i.join("/")}async function Os(e,t){let n=e.file(t);return n?n.async("string"):null}async function FE(e){let t=await Os(e,"xl/sharedStrings.xml");if(!t)return[];let n=vs(t),o=[];for(let i of eo(n,"si"))o.push(bs(ks(i,"si")??[]));return o}async function QE(e){let t=await Os(e,"xl/workbook.xml"),n=await Os(e,"xl/_rels/workbook.xml.rels");if(!t||!n)throw new Error("xlsx missing workbook metadata");let o=new Map;for(let r of eo(vs(n),"Relationship")){let s=ri(r,"@_Id"),c=ri(r,"@_Target");s&&c&&o.set(s,HE("xl",c))}let i=[];for(let r of eo(vs(t),"sheet")){let s=ri(r,"@_name"),c=ri(r,"@_r:id"),a=o.get(c);s&&a&&i.push({name:s,path:a})}if(i.length===0)throw new Error("xlsx workbook contains no readable sheets");return i}function YE(e,t){let n=ri(e,"@_t");if(n==="inlineStr"){let s=eo(e,"is")[0],c=s?ks(s,"is"):null;return c?bs(c).trim():""}let o=eo(e,"v")[0],i=o?ks(o,"v"):null,r=i?bs(i).trim():"";if(!r&&n==="str"){let s=eo(e,"is")[0],c=s?ks(s,"is"):null;return c?bs(c).trim():""}if(n==="s"){let s=Number.parseInt(r,10);return Number.isInteger(s)?(t[s]??"").trim():""}return n==="b"?r==="1"?"TRUE":r==="0"?"FALSE":r:r}async function qE(e){let t=await ff.loadAsync(e),[n,o]=await Promise.all([FE(t),QE(t)]),i=[];for(let r of o){let s=await Os(t,r.path);if(!s)throw new Error(`xlsx missing worksheet part: ${r.path}`);let c=[];for(let a of eo(vs(s),"row")){let d=[];for(let p of eo(a,"c")){let l=ri(p,"@_r"),f=l?zE(l):null,u=YE(p,n),m=f??d.length;for(;d.length<m;)d.push("");d[m]=u.trim()}d.some(p=>p)&&c.push(d)}i.push({name:r.name,rows:c})}return i}var hf=new jE({ignoreAttributes:!1,attributeNamePrefix:"@_",preserveOrder:!0,trimValues:!1,textNodeName:"#text"});function bn(e){let t=e.indexOf(":");return t>=0?e.slice(t+1):e}function dd(e){let t=[];function n(o){if(Ae(o)){for(let i of o)if(Rt(i))for(let[r,s]of Object.entries(i)){if(r===":@"||r==="#text"&&typeof s=="string")continue;let c=bn(r);if(c==="t"){if(Ae(s)){for(let a of s)if(Rt(a)){let d=a["#text"];typeof d=="string"&&t.push(d)}}}else c==="tab"?t.push(" "):c==="br"||c==="cr"?t.push(`
|
|
219
|
+
`):Ae(s)&&n(s)}}}return n(e),t.join("").trim()}function WE(e){let t=[];for(let n of e)if(Rt(n))for(let[o,i]of Object.entries(n)){if(bn(o)!=="tr")continue;let r=[];if(Ae(i)){for(let s of i)if(Rt(s)){for(let[c,a]of Object.entries(s))if(bn(c)==="tc"&&Ae(a)){let d=[],p=l=>{if(Ae(l)){for(let f of l)if(Rt(f))for(let[u,m]of Object.entries(f))if(bn(u)==="p"&&Ae(m)){let g=dd(m);g&&d.push(g)}else Ae(m)&&p(m)}};p(a),r.push(d.join(" ").trim())}}}r.some(s=>s)&&t.push(r)}return gf(t)}async function ZE(e){let t=[],n=[];e.forEach(i=>{i.includes("embeddings")&&i.endsWith(".xlsx")&&n.push(i)}),n.sort();let o=0;for(let i of n){o+=1;let r=e.file(i);if(!r)continue;let s=await r.async("nodebuffer"),c=await qE(s);for(let a of c)a.rows.length>0&&t.push([`Embedded Sheet ${o}: ${a.name}`,gf(a.rows)])}return t}async function yf(e){let t;try{t=await ff.loadAsync(uf.readFileSync(e))}catch{throw new Error("source is not a valid docx zip file")}let n=t.file("word/document.xml");if(!n)throw new Error("docx missing word/document.xml");let o=await n.async("string"),i=hf.parse(o),r=null,s=d=>{if(Ae(d)){for(let p of d)if(Rt(p))for(let[l,f]of Object.entries(p)){if(bn(l)==="body"&&Ae(f)){r=f;return}Ae(f)&&s(f)}}};s(i);let c=[];if(r===null){let d=p=>{if(Ae(p)){for(let l of p)if(Rt(l))for(let[f,u]of Object.entries(l))if(bn(f)==="p"&&Ae(u)){let m=dd(u);m&&c.push(m)}else Ae(u)&&d(u)}};d(i)}else for(let d of r)if(Rt(d))for(let[p,l]of Object.entries(d)){if(p.startsWith("@_")||p===":@"||p==="#text"||!Ae(l))continue;let f=bn(p);if(f==="p"){let u=dd(l);u&&c.push(u)}else if(f==="tbl"){let u=WE(l);u&&c.push(u)}}let a=await ZE(t);for(let[d,p]of a)c.push(`
|
|
220
|
+
## ${d}
|
|
221
|
+
`),c.push(p);return[c.join(`
|
|
222
|
+
|
|
223
|
+
`),a.length>0]}var pd=class extends Error{};function _f(e){return e.replace(/^/,"").replace(/\r\n?/g,`
|
|
224
|
+
`)}function XE(e){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new pd("source is not valid UTF-8")}}async function Ef(e,t){if(t===".docx"){let[n]=await yf(e);return _f(n)}return _f(XE(wf.readFileSync(e)))}import*as ke from"node:fs";import*as Ao from"node:path";function xf(e,t){let n=Ao.dirname(e);ke.mkdirSync(n,{recursive:!0});let o=Ao.join(n,`.${Ao.basename(e)}.${process.pid}.tmp`),i=ke.openSync(o,"w");try{ke.writeFileSync(i,t),ke.fsyncSync(i)}finally{ke.closeSync(i)}ke.renameSync(o,e)}function ex(e,t){xf(e,JSON.stringify(t,null,2)+`
|
|
225
|
+
`)}function tx(e){return JSON.parse(ke.readFileSync(e,"utf-8"))}var At=class{constructor(t){this.root=t}root;abs(t){return Ao.join(this.root,t)}ensure(){ke.mkdirSync(this.root,{recursive:!0})}passDir(t){let n=this.abs(t);return ke.mkdirSync(n,{recursive:!0}),n}readText(t){return ke.readFileSync(this.abs(t),"utf-8")}writeText(t,n){xf(this.abs(t),n)}writeJson(t,n){ex(this.abs(t),n)}readJson(t){return tx(this.abs(t))}has(t){return ke.existsSync(this.abs(t))}path(t){return this.abs(t)}clearError(t){let n=this.abs(t);ke.existsSync(n)&&ke.rmSync(n)}};var F=Gt;function ld(){let e=["CgfYC2u","5lUL5lIl5Q2J5PAh5B+f6Ag76ycq6kgm44cb6ycq5y+L5A6m5Pw06l+B5ywLihjLy29YzhpVVjRLR7NNMB3LKOZLHOxLV4pNI6ZNMB3PGjdLRzFKV53NLzNLJP/OR63OQidVVjVLIQJKVzZJGihNJQ/LOOpJGihOVAZLNlRJGihMIBNMS6JLKOZOOAJMVjtMJ5dNPlRLV6dLRP7OVAZMJAlMIjdNROdKVzpKUk3MLOFVVjVKURRNIANLKi3LNkJMIydMNiNORRdLVzxKUk3KV53MJihLJP/MLOFMI7ZLHPNVViZKUi3NV7VOR5hJGihKUi3PN7pOR5hJGilKUi3LVPFPGzFMVi/JGihMKzJOPOhJGihMIkRMLQ3MIjBOOAxPGkdJGilOVPpLH7RLIy3OR7FOH6ROOyZMOlJLR7NMR4/KUidOOyZVViZKUjtKUi3OPOhOVPpLH7RMOlJLR7NOV4FNQiVJGii","DhjPBq","icdMUPaGyoEuSK9t77YA77Yi5Ogq5Owm77Yj5lUw5RkH5Q275zcN77YFycdIHPiGAw5UzxjFDgHVDwDODc5LBw90Aw9Uios4UIbG5Ogq5OwmyooaGG","CMvJB3jKCYdMJiNMUPdMLOFMNkZLJ5hNLj/POBRLUO/MJPlLIjFVViZLJ6RMLl7MUPdMLOFMNkZKUk3LRP7PMyxLRzJLNkJNMOtLHOxLRRNVVjVKUi3OPOhOH4BPGkdOVRNNLyZVViZKUi3OPOhMJ5dKVPSGC291CMnLiowTL+AUTEoaGG","lsdLR7NNMB3VVjP7iMTPBMqIoIjKAwfSB2D1zsiSiNnWzwfRzxiIoNSIBMfTzsi6iUEuSIj9lcjJB250zw50iJOI5y6F6k+DiIWIzw1VDgLVBIi6iUwpR+MaIsj944cc","BwvZC2fNzq","C3rYAw5NAwz5","lsdPM4BOVRNNLyZVVjP7iMTPBMqIoIjLCgLZB2rLiIWIzxbPC29Kzsi6mtKSiNrPDgXLiJOI5y+V6ycj5Qch6AkyiN3JGijLCgLZB2rLiow/HEMHU+wpLUA6KoAwH+ACRowgMEAyJUEAHoMBHUwpT++8M+s5PUwqJEoaGEAlRowpT+oaGEAGH+MIMoAwH+wTL+MdVEs4JEIdVEA3T+I/MYbLCgLZB2rL44cc","icdMUPaGyooaKowTL+w5LE+8MUwBNUMxQoAxPEoaKwaG4OAsigfJDgLVBU+8M+EuU+MDOUAwH+wTL+wXNUs6JUEuU+MDOUwgHEwUUEoaGG","6l+z5PIV5RQq5PAh5lU25BYa5As077YB5Bcp6k+05OIw6z2E5Qch5yEg5PAh5PYS5lUo56YS5lIa5lIQ5y+V56gU6k6K55Qe54MP55cg56M66zE05BU656Ul6AAw5zY644cc","oIbVDxrWDxqGBxvZDcbIzsbHBIbVyMPLy3qGy29UDgfPBMLUzYbVBMX5ihjLy29YzhnBxq","CMvJB3jKig11C3qGyMuGyw4GB2jQzwn0ihDPDgHVDxqGC291CMnL","C3bLywTLCI5Uyw1Liow/HEMHU+wHQ+wgMEwoN+AwH+s4REIdVEEHRUIUPoEAHowfT+s9K+s6UUEjQEwqJEwTL+w5TUs/NEAmGEwoN+wNI+AlVowgME+8M3nJzw5LlMfJDg9YCYdKUi4Gywn0Aw9Uios4REwgJEASOEwhUUEoSoIVPEs6UUEjQEAxTUs9V+EuQowqJos4GoAlVowgMEoaGUEMGEATOUE/U+IVKEoaGEMFS+IVKEoaGEs4REAwH+wmLUs6UUEjQEwqJE+8Jos5N+EMGEATOUEuQooaJU+8N+oaJ+oaJU+8N++8N+oaJ+oaJUACQUEFPEoaJ+oaJNvUA25VD27JGi/NRyNLJAdKVy3LKi3VVjVOUQVKU73ML6dMS5xNOA7ORQtML7BMLlNNLkGGC3bLywTLCI5RAw5Kpw9MzNnJCMvLBU+8JoE+Pos9K+wfSEwqJowpKEwJSoEuQcbNCM91CooaGG","lsdLHOxLV4pNI6ZNMB0V55s75Asw6z+Z77YAEYjRAw5KiJOIAw5UzxjFDgHVDwDODciSiNnWzwfRzxiIoNSIBMfTzsi6iUEuSIj9lcjJB250zw50iJOI5y6F6k+DiIWIzw1VDgLVBIi6iUwpR+MaIsj944cc","5lIL5Qc85l+D5OYb5RQq5PAh5PYS6Ag65BQp77Ym57UD5lIn6yEn5O6s77YA5z2x5BYa5As06iUL5zYO5lU75l2v44co6zUgl+wCUUoaJ+AGH+IUSos5I+wjJEwWSEACIEATO+AwH++8Ios4IUs4GowDL+AYOEwgMEwUJoEAHoAiJ++8IE+8Ja","5y+Q6l6t5yE65lIa5lIQ5Qch5yEgiePtt04G5A+56lgH77Ym5Qc85BYp5B+f6Ag75PIVihSICMvJB3jKCYi6wY4UlL1944cc5B+f6Ag75l2/55sO5y+m5BYv5y+377Ym5lIn6kAbie1HCMTKB3DU44cb5lUJ56cb5zU05Qcp44cbsLnptKZJGihMS6JPH4RMIjBOP6pPH4RJGii","AM9PBG","44cq5B6f6kEe6iYd5yYw55Qe5y6F5PAh54Mh5Q6144cr","AxnbCNjHEq","lsdMIBNMS6JVVjP7iMTPBMqIoIjUB3rLiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHoAjUEAZQciSiMnHDgvNB3j5iJOIyxv0Ag9Yx25VDgv8zM9YBwf0x25VDgv8Dw5JBgfZC2LMAwvKiN3JGii","Aw5Nzxn0lNrLEhqTBM9YBwfSAxPL","su5hrvnux05puK1bteLArv9gquLmruq","C2XPy2u","CMvJB3jKCZOGma","5Q+p56En6k6W5B2v5y+Q6io95l2/55sO5lIk6z2I5yIx5yE655Qe5A2x5Q6177Ym56Ab5Q2I5AkE5yQGig5HBwxJGif0zxH044cbBgLUzEoaGwvWAxnVzgvFDgL0BguG562j6iEQ5yIB5A2x5Q6144cc","A2v5CW","C291CMnL","5B+f6Ag75OQk6l+z5lQB5Q2J5PAh5y6F5l2n5Ps+5zYOihjLy29YzhmG5PYa5yMn6z2I77YBzxbPC29KzsdLJ6RLNkJMUPdMLOFMNkZMMi7NOA7PM4BOVRNNLyZLPitLHPNLHAxJGilMOiFLH4BLIAFMNkZMSR/NLkJLJP/MNiNLNlRNLyZVVjVLSi/OR7tLKOZPNz7MOiFLH4BMLOFMNkZKVP3MJA7LNldNGRNLIiFMJAlJGihMMi7MMl7OT7pML7BJGihLJ5NKUOVNUR/LIiFMJAlJGihMMi7NOA7OVAZLNlRMIjBMJihKUyxOP4BOP4NNIRBMGihLJ5JLJjBLU7RNQ4SGC2nLBMxJGii","icdMUPaGyoMbK+wfT++8MUwPMUs5PU+8JoEoIEs9QwaG4OAsihnJzw5LlNbYB3bZpvT7iM5HBwuIoIlLQzRKUAyIFsX7iM5HBwuIoIlNJONKVAKIFv3JGii","lsdOVAZLNlRVVjP7iMTPBMqIoIj0CMfUC2L0Aw9UiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHoI9RowCUUAwH+wTLYj944cc5BI46kEb5Qc85BYp6k+n5lMF6kAb57+76k+r77Ym5l6l5AAcigbgteftsejbq0TGiokgKIbG6zEQ5zUEyooaGwbcqunlifrpifbsrvnftLrGiokgKIbG5zUE5yIW546W5A6EyooaGG","y2H1BMSG","BgvUz3rO","5PYa6AUy5lYy5ywi57QN5PIV5Q2J5PAh6zU25lII5AsX77YA5y6F5PAh5lIT55Qe5Q+p5lIa5P2H5yQO5l2C44cb546V5Akd5O+p5yAz44cb5A+555M944cb5yAf5B+d54US55M944cb55s75Asw6z+Z44cb5A2x5BMv5zkm6l2S5zY66yo95B+f6Ag75A6m5Pw06l+B5ywLihjLy29YzhpJGilNPOhMRAlLM6dLHOxLRRNPH43LPi3JGihMRkhOPOhJGihOV4FMUkhMGkFLVlRJGihNR4FLUyxPLB/JGihKVB/NLkJLPjBOR63MIjBPMR7KU6xLIiBNSBVOGiZNNihNLAxJGii","5Q+p5P2HigrPywXVz3vLiowpQUwCQowoN+AwH+AyJUEHRUE7MEwhUUAxTU+8JoAjJEAkIUwpKEwJSoAwUEw8J+oaGEwJSoMFS+ADPEA6KoAiLUs4JEAuUEwpMoI/NUE7REAaP+EAHoEFREs/G+s8ToMAJ+wkQos9NoI9RoAnOUAiKoEUGos9K+s4REAwHYbLBw90Aw9U77YB5B2X5zon6lwW5l2n44cb5AE/5yQ/44cb5O6L6kEM44cb6ygt5yw35OIw6l+E57UT5OcN55Qe5yQO5l2C5y2v54US5yAzigfJDgLVBUoaGUwoN+AwH+AYOEACIEIHQoA8LoAiLUwJSoMFS+IVGEAnRUAxTUECGEEvPsbLBw90Aw9U77Ym5lIn5OYj6k+T5Akd6kgL6ycG44cc","icdMUPaGyokwSYdNLllMJQJPL6JOGiZLHAxJGijGiokgKIbHy3rPB27VViXJB250zw50iowoU+AoIEAGVow8J+wjJEE8GcbG4PAZyooaGG","5zY65y+377Yi5AAcigdLNlOZltjG77Yj57UD5lIn5PIV6zUg6l6555wm77YB5y+Q5PYj5y6F5PAh5PIo56gU5yAz5yE6igdNRkXo6zUgycdMIjyGye7PM4zGioAxTUAjJEIdVEI+K+whUIbLCgLZB2rL44cc","5zcm5zYW54k56l+E57UT6jkz5AsQ5Awh5l+D55wz5lIa5lIQihnJzw5Liow5TUEuQcb0CMfUC2L0Aw9U77YB6lEO5zYW54k56jkz5AsQ5Awh5OYj5yMQ6l6r6Ag65BQp5OUg5OIq5AsA5lIQihnJzw5L77Ym5Q+p5zY65AgR5yAz6iEQ5BEX55QeigXVy2f0Aw9U44cbywn0B3jZ44cbChjVChmG5zkmihn0yxrL44cc","6z2E5lQ654MP5y+r5AoW5RQq55QeihnWzwfRzxiUA2LUzcdLJ6RNLkGGC3LZDgvTFgjYB2fKy2fZDhXVzMzZy3jLzw58z3jVDxdVViZLJ6/NLkGGBgfIzwWG6kgL5ywf5zcn56EW77YB5yw35l2t5lQ654MP5AEl57Ui55sOihnWzwfRzxiUBMfTzEoaGG","BwfW","6l+z5PIV5l6B5lIT5PAh57Yw5yMN5Asn5Qc455Qe5Qch5yEg56I/77YAzgLHBg9NDwuG5zkmigLUBMvYx3rOB3vNAhqG55QeignVBNrLBNqG6ycq5A2x5l+D55wz5RQq5PAh5PYS5A6E6zMf6k+T6kIa5lIo5As55P2c6k+T6kIa77Ym57UD5lIn57+76k+r77YB6zMK5Q2K5lUL5Asw77Ymywn0Aw9U44cbDhjHBNnPDgLVBUoaGw5VDgxJGifLBw90Aw9Uios7PEwpIUwCUUAzR+EAHoMaMUEuQowCSoEcUEApJ+I/SoMdVEs9V+EuQoIhQUEeTUoaGEwhHUEHRUEAHoEUGos9K+s4REAwH+oaGUs6UUEjQEwNK+wqJEwCQcbZCgvHA2vYlM5HBwxJGifZy2vUzs5Hy3rVCNpJGifHy3rPB24G5zkm5zco57UT6lwe5lQN55M76k6W5lIT6yo95B+f6Ag75Rk/55sO5RQq5PAh5PYS55Qe5y6F5AEl5OU85yAz77Ym5lIn57+76k+r44cb5lIn6z+Z6k+r44cb5lIn5Ps55OIq5lIT5PAh5zcn77YB5zob54Mm5zkm5RkH5PYj6ycA6kgm6k+r5zcn55Qe5yw25lUw5lIt5zcn5l+D55wz5y6F5PAh44cc5lIn5B6x5OQk5Pw05y+L5Asw6k+T5yQO5l2C5OIw546V5Akd5O+p6l+W5y6F5Qc355wz5zYOigfJDgLVBIdKUk3JGii","AgfZt3DU","ywn0Aw9UioEBToAoPEwgMEwfT+s9K+s6UUEjQEwqJE+8JoAyJUEHRUIHJowkQoIaHEoaGEwkQos9NooaGEs9NoEuQowVUEIXOEoaGEEPUUMxToAwUEwqKEwsJowpR+INGEE7K+AENo+8M+wKMUs4QUwfIowqJUwpKEEuN+EAHowkQos9NooaGEwpJEw6LooaGEAoPEINPUoaGEMbK+wfT+wpMowmLUAiLUMvNowKTowpMowmLUAmIEwoN+AwH+MHUUw6J+wiHUwiQ+AjV+I9VE+8Jos4JEwoI+AiKowjP+AdHEAMGUI/SooaGUI6Q+s7VEAyJUEHRUAxTUA2IoINO+s7O+IVJE+8JoAxOoAZLEEHRUIUPoAxTUs/NEAmGEwpR+AGUoAFPEApJ+I/So+8Jos4JEEmNoA1I+oaGUwpQUEuQowoN+AwH+AyJUEHRUwgMEwhUUEAHoIHQoAdHEoaGEINHUE6V+oaGEIcOUs9K+oaGEMbK+wfT+AiLUEoR+wIG+wpJEw6LoIHQoI+VUEkTUAaGE+8Jos4JEEuQoAdHEE7QUoaGEAaGEw6PUAiLUw/G+EqHUwiPoAwREABV+s7O+wpR+INGEs6I+wUNUoaGG","6l2S5O2I6kEe5yIz77YA","B2jQzwn0","icdOKAhOR63LIQJKVzWGyfvTihbYyxrVigrLig9MzxjLBMrHCYbJywKGzgeGBwvZysbLihnLigvZCgfSAgeGCgvSBYbJAmoJBY5GiokgKIbHy3rPB24Uy29UDgvUDd1G5lIa55Uy5l6B5zob5lUo5Qgm5lIk5O6j6jc977Ym5PwJ6jc95lIa5zYW44ccyooaGUs6UUEjQEIVTowhUUEAHoIrOEIVREwVUEEzVEs7JEMaKowTL+s/NEEvME+8Jos4JEE/U+IVKE+8M1jPy2HHCMtJGiffBwLSEsdNRyNKURRNIANLKi3LP4VNU4JKV53MJihLJP/MLOFMI7ZLHPNJGii","Aw52ywXPzcbZDhj1y3r1CMvKig91Dhb1Da","oIbWCM92AwrLCIbYzxr1CM5LzcbPBNzHBgLKiePtt04","5lQ654MP5y+Q5yIx5yw35l2t5y2v5lQ66kEs6iMY77YB5A625PEpl+ACUUAEHc/NVQtKVzmV5RoB56EW5lIn5yIx5ywLigfJDg9YC+oaGUE+Pos9K+wwIUIVNEEAHcbZCgvHA2vYioEuQcb7iMTPBMqIoIjNCM91Ccj944cc","57UD5lIn6kAb5OQk6z2G5zco5yE6546W55Qe6zUg6l6555wm5O+q5yIW5BYa5As044cc","5Q2J5PAh5y+J5B6e77YAzgLHBg9NDwxJGifPBM5LCL90Ag91z2H0ioEAHcbJB250zw50ioMaKowTL+wUJoAvTos/NEEvME+8Jos4JEA2PUIjSUoaGEs4JEAjQEwgMEoaGEs4JEE6OoMuMEoaGEs4JEE/U+IVKEoaGMfJDgLVBUoaGxrYyw5ZAxrPB27JGifUB3rLiowsJcbLBw90Aw9Uiow/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH++8M+E/U+IVKEs4JEw+L+AuUEwpMooaGEwiOowhJ+AiLUIHPEMaOowoN+AwH+s6I+wUNUoaGEwBOoAENooaGEMHUUw6J+oaGEwkQos9NoE7K+AENooaGEs6UUEjQEEkTUAaGEs7PEwpIUw3SUACIEEAHoACUUs9JEoaGEAzR+wiQ+wsJoMvNowKToI/KowkQooaGUwWJ+IVTowpMEI/SoI9RoAnOUs4UUwpR+EBToAoPEAlJEArHoEAHcbHy3rPB24G5PE26yg15A6i5zcm5lIa6l6555wm44cc5lQ654MPl+MbK+wfT+EAHowCQowCUUwpQUwgMEwCQcbZy2vUzsdNMOqGywn0B3jZl3bYB3bZ44cc","sw5ZCgvJDcb0AguGy2H1BMSGzxjYB3iGC2LKzwnHCIbHBMqGCMvYDw4GyhnJCMLWDgn0BcbPBMDLC3rGlG","oIbUB24Tzw1WDhKGy2H1BMSGChjVzhvJzwqGBM8GCMvJB3jKCW","icdMUPaGyowCUJmTmIdML6uV5yAfiowUOUwoHwaG4OAsios4Gos4QIbZy2vUzE+8M3nWywnLiowpQUEuQcbPBNrLCMLVCI9LEhrLCMLVCU+8JhrPBwuG5y+Q55sOigrHEs9UAwDODc9KyxDUl2r1C2VJGilNMB3LPkKV5PEL6zE05B2sigrHEE+8JowKNoAzMI/LPjZPL7tLVziGBMLNAhtVViZMUixMMAGV6BUo5PIo5B2sigrHD27VViZPU4tMMi8V5ykn5PMA5B2sigr1C2VJGilLJP/MLOFMNkRNM7tMJQxLHPNMMi7ML7BVViZMOlNMJA7NHAFMMi7JGihKVzZMGA/JGihLPkNNQBRLKOZKUiRKUiVMLOFLIktMLQ3VVjVKUi3LVPFNNihNLAxMIjBLHPNNQBRKUllJGii","lsdLNlROVRNNLyZVVjP7iMTPBMqIoIjZy2vUzsiSiMvUDMLYB25Tzw50iJP7iNnWywnLiJOIAw50zxjPB3iIlcj0Aw1LiJOIzgf5iN0SiMXVy2f0Aw9UiJP7iM5HBwuIoIlLRQlLJOuIFsWIywn0B3jZiJPBxsWIChjVChmIoLTDFEoaGUs4JEIMGEI+K+whUIbZy2vUzsdNVjBLJ7FLRzFMRRxVViZNS7VNU5/KVjROH6ROOyZOV57NU63NVjBLJ7FJGilMR4/KUkOGC2nLBMuG6yo95B+f6Ag75AgR5yAzigvUDMLYB25Tzw50lNrPBwxVViZLJ6ROG73KVB/NLkGGzgf5Fg5Pz2H0FgrHD258zhvZA++8M+s+NEASOEwVUEw6LoAxPs/LPjWV5PMOl+AyJ+oaGG","ANnVBL9VyMPLy3q","6l+z5lIQ54Mh5Q615y+V6io95OM/5O6L5lIk5lIa54Mh5Q6155Qe5zcm5lIa5zY677YB5y+Q5PYj5RQq5PAh5PYS5yE6546W55YF5A6E5zY655wm5PE25OMn5BU656Ul5PAW5zY644cc","icdMUPaGyoEuSU+8MUs9OoADPEs6HMaG4OAsigrPywXVz3vL44cc5RQqigdNLllVViJLHRFNRjhVViNVVjRKVAdMNAxKUOzGiokgKIbKAwfSB2D1zs5LBw90Aw9Uios4UIbG5yA356YryooaGG","Aw5KzxG","icdOKAhOR63LIQJKVzWGyfjPy2HHCMqGyxzHBSoNysWGywDHCNjHievTAwX5ihbLBgeGCM91CgeGzsbHihb1EgeGCgfYysbJAw1HlMaG4OAsigfJDgLVBI5JB250zw50pwbsAwnOyxjK5lIk5yMn5OQt5l2prw1PBhNNMOtOOApMNi3VViZMIORLPBNMI73KUOBOTBFMNAxJGijG44cc","6k6W5B2v57g75z6l77YA","icdMUPaGyos6UUEjQE+8MUEuSUoaKoEzVEIHOYZMMi/OV7FJGjhVViZKUzLGiokgKIbZy2vUzs5Hy3rVCNm9w3SIBMfTzsi6iUEuSIiSiNn0yxrLiJOI55M96kgJloAyJ+I/TYj9lhSIBMfTzsi6iUs5Msj9xEoaGG","z2vUzxjHDgvuzxH0","y29Yzv9SAw5Lx3n0yxj0","lsdLIQJKVzWV546V5Akd77YAEYjRAw5KiJOIywn0Aw9UiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHowpR+AlJEArHoApJ+I/Scj944cc","icdLKiZKUidLJ6xNLlhLPjRKURRLKiZML7BOR7tML7BVViZKUlRMR4/KUkROR7tOR53KURRLKitLHPNKUidMNAhNM7JPGRSGzgLHBg9NDwxVViXJB250zw50ioEBUowqJooaGG","CMvJB3jKCW","BM90zsdLJ6RNLkJKUO7NNj/MRApML6dMS5xLVzlLHAxLIAFMNkZJGihKUz/KUi3LSz7KUO7NLlVPNAiV5A+555M955Qe5yAf5A6544cc5RQq5PAh5PYS5z2x55Qe5A6E6lsO5yAf5A655lIn5B6x5lII5AsX44cc","ywn0Aw9U44cbzgLHBg9NDwxJGifPBM5LCL90Ag91z2H044cbDhjHBNnPDgLVBUoaGw5VDguG55QeignVBNrLBNqG5B+f6Ag75PIV6z2E56M65A2x56YM5lIY77YB5lIn5B6x6l6t5yE6ignVBNrLBNqG5lI656M655Qe5y2G5l2n6k6W5B2v44cc5y6F5PAh5RkH5PYj5A+55BQu5Q2J5PAh5PE25BcX5lIn6kAb5yIB5BU66k+L6k6W5B2v44cc","y29Yzv9SAw5Lx2vUza","6ycq6kgm5Ase55cg5y6F5PAh77Ym5BM25zYO6l6t5yE65yMn6ycq6kgm6iEQ5Qoa5Q2J5PAh5PIV5zcM5ywO6yoO5OM/6l2944cc5lIa5lIQ5y6F5PAh5Q616jc95zcR5AsA5y+L5PE25B+f6Ag75l+D55wz5ywO6yoO5y+L5A2q77YB5y+V5lUL5OUg5OIq5AsA5P2H6k6W5B2v77Ym5l2g56Ab5Q2I5OIQ5PAT44cb5Pgy6kAb44cb5zci5BM25zco5RYp5y+L5OIw5y+Q5l+D55wz5Q616jc95yMn5y2k5Q6144cc5yQO5l2C57+76k+r5y+Q6io95Ps55y+y6kgO6l6+6k+T6kIa77Ym5lIn6io95yEp5Bcr5lQl5A6E44cc5lIn6kAb6l6t5yE66iEQ5Qoa6l+h56Il44cc","Bg9JyxrPB24G5PIV5y+V54US56Ul5BId572U5zkm6yEn5Asn5BYv55sO55Qe56IZ5A6A54MP55cg56M66zE077YB5lQ654MP6lEO6zEO5QEB6l+B5ywL5y+M5lIa56M66zE044cb6zwC5As05yIh5yIW5y+M5lIa56M66zE044cb5PIo5PI+6lEZ5PE244cb5yIh5O2I5y+z5lQl57Q/5OIw5y6F5PAh5PIo56gU6l2S5zY65PE25BU656UlihnJzw5L77Ym5lIa5lIQihnJzw5LiowpQUwgMEs4Gos4QUs4UYbSB2nHDgLVBUoaGUwqJos4GoI/NUE7REwCUUwgHEEAHos6UUEjQEI/M+whUUoaGEAdHEE7QUwnH+E6P+oaGEAuU+MySUwBNUwqIooaGEAnOUIJHEoaGEIeSEIHO+oaGEwCSoEcUEwpL+AnN+AiLUMbK+wfT+w9OUAaGEwpMowmLUACRoI6Q+s4JEAEHoAiKoAwScbZy2vUzE+8M+AkIUwpMowmLUI/H+EOI+wgMEwfPsbHy3rPB27VViZLKi7NU63OTytKUQFMSRVNKiBKVjRNU7tMIQtMJihKUyuGC3rHDgxJGii","Dgv4Da","5l2G5PIV5yMN5PYS6kEe6iYd5yYw5zMO44cc5OQk57Uz5A6A55Qe5RQq5PAh5PYS5z2x6l2S5O2I5OIq57Ut5P6e5yYw5yMN5PYS6k6W5B2v44cc"];return ld=function(){return e},ld()}var nx=[F(73),F(33),F(70),F(40),F(16),F(4),"",F(15),F(28),F(49),F(36),"",F(60),F(8),F(54),F(64),F(5),F(14),F(30),F(20),F(68),"",F(43),F(53),F(61),F(29),F(35),F(57),F(3),F(9),F(59),F(45),F(65),"",F(25),F(50),F(42),F(71),F(37),F(48),F(38),F(13),F(34),F(67)][F(17)](`
|
|
226
|
+
`);function Gt(e,t){e=e-0;let n=ld(),o=n[e];if(Gt.gMJLkA===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};Gt.SwGXeP=i,Gt.asHcAy={},Gt.gMJLkA=!0}let r=n[0];Gt.eaCwra!==r&&(Gt.asHcAy={},Gt.eaCwra=r);let s=Gt.asHcAy[e];return s===void 0?(o=Gt.SwGXeP(o),Gt.asHcAy[e]=o):o=s,o}function ox(e){let t=F,n=e[t(58)]===0?t(10):t(56);return[t(18),n,t(1),"",e[t(72)]][t(17)](`
|
|
227
|
+
`)}function Rs(e,t){let n=F;return new x(e,{exitCode:fe,errorCode:n(22),hint:n(51),data:{actual:t}})}function ix(e){let t=F;return typeof e!==t(44)||e===null||Array[t(19)](e)?!1:Object[t(26)](e)[t(32)]===1&&t(66)in e&&Array[t(19)](e[t(66)])}function ud(e,t){let n=F;if(!ix(e))throw Rs(n(31)+t[n(58)]+n(11),[n(46)]);let o={chunk:t[n(58)],line_start:t[n(63)],line_end:t[n(69)]},i;try{let r=e[n(66)][n(39)](s=>{let c=n;if(typeof s!==c(44)||s===null||Array[c(19)](s)||Object[c(41)](s,c(27)))throw new me(c(12),1);return JSON[c(7)]({...s,source:o})})[n(17)](`
|
|
228
|
+
`);i=ir(r)}catch(r){throw r instanceof me?Rs(n(31)+t[n(58)]+": "+r[n(6)],[r[n(6)]]):r}if(i[n(32)]===0&&t[n(72)][n(2)]()!=="")throw Rs(n(31)+t[n(58)]+n(52),[n(24)]);return i}async function Sf(e,t,n){let o=F,i=await e[o(62)](o(21),{system:nx,user:ox(t),responseFormat:o(55),...n?{signal:n}:{}}),r;try{r=JSON[o(0)](i[o(72)])}catch{throw Rs(o(31)+t[o(58)]+o(47),[i[o(72)][o(23)](0,500)])}return{raw:i[o(72)],records:ud(r,t)}}var md=Bt,rx=md(1);function sx(e){let t=md,n=e[t(5)](/起点\s*[::]\s*(\d+)/);return n?{found:!0,line:Math[t(3)](Number(n[1]))}:{found:!1,line:null}}function fd(){let e=["Dgv4Da","5l2G5PIV55+T5yMN5yMN5PYS55Qe44cm5Q2J5PAh6lw354k55A6A5l2n5zMO44cn44cc5lIa5lU95PAh5lU25BI45BI45zYO55YF5Q2J55Qe5yMN5PYS5Q2J5PAh5lMl5yMn77Ym5y6l552a5lIa5AsN5Q61kIRPNz7MRApMLOCQkUEAHoETUEwKH+ADKoAwMEoaGUs9OoIMGEwiPoAwRE+8MIOQ55YF5Q2J55Qe5yMN5PYS5Q2J5PAhkIRMMk/KUi3MMk/LNkJMIjhNU5NKVAdNMOtOV5NMRRxLUkBOOyZLJ7FNMOtMLOFMNkZPH4ZLVidLP4VVViZLPOlMNPZMMk/VViZMIQxLKyRLROpNMOtOTBFLP4VOOyZLJ7FJGiikcUoaKoATO+AwH+MvV+s7Gos5IoAGT+oaKEMaKowCUUEAHowjP+ACRo+8MUs7PEoaJoESRe7PM4BJGi3KUlRPM4BLPltVViZKUiVPNAlNTkFOT5/JGiZLNlPylvKGioAxPs/LHOuG5zYW54k544cn6l+z56En5BIM5zY65QYH57Yw5y+355Qe5zY65PMV5As077Ym5yAn5B6a5lIl5PIV44cm5lI76kAb5lQ654MP77YAl+s6UUEjQE+8MUoaJEwsJos4GoADOEADOEs7PsdILRmG5BYa5As055Qe5yQO5l2C44cb5lUL5y+k5BIM6k+06k+D5lQ655Qe5y+W6k+n44cc6l+z5OMn5PIV5Q2J5PAh44cccGRJGjdLIy3OQidPLB/KU4dKUyJMOlFVViZNU53KUi3NRPFMRApMLOFJGjhVVjOklsdPOBNNM67LN7RMNkZKV6hMGA8GlYdNRzBLIjlLPkFNURiGlYdPOPJMNzdMOiFNRB4GlYdKUidLJ6xOR53MLyxKUOSGlYdMOlJLV4pNNiVNGRNVVjSklsdOP5lOIBlLJAhVVjRKUidMRRxMRRxJGiZKURRNIANOUQVKU70GlYdLPjBOSOZLKOZMNi3PPBdNIBNNGRKGlYdMGkFMOlZMOiFNRB4GlYdLJ7dOR43OR63OQidPO47MOlWGlYdKURRNIANLSi/KVkdJGi3NMOtKU4VNU43VVjSklsdLRO/OP4lNU5pMNOtLPkFNURlVVjRJGiZPMlBMRRxKUiaGlYdPMlBMRRxKUOZIGkBIGkBJGi3OV5NNP43MLBtMRRxLJ5NKUOVMPOlOV7dVViJOR7VOTBFMNAxLG4/LIAFMG4xNROdKU4VVViZMSQhMNiNLNlRMRkhNVjBLJ7FJGihMSQhMNiNPGjdMNAhLJ7dOR43VViNVVjSklsdKUidLJAhPM4BNURlVVjRKUz/KVjRLHPNJGiZNRkXo6zUg77YA5Bcp5Qch6Aky44cn77Ym5l2g5lIl6z2I5y+Q5PIVkIRKUidLJ6xOR53LIldKUidMRRxOR53NMOtLIAFMG4xMKzJOPOeQkU+8JoAYOEACIEoaJowCULGTwEoaJEwCUUASOEoaGEAYOEACIsdILRmG5yQO5l2C44cb5RkH5PYj6ycq5y+L5y+W6k+n44cc6l+z5PIV5PYa5A655PIt6k+V5yIK55Qe6zM36zIX4Ocu4Ocu5A6d5PYj44cm56YStUMBHUoaJEs9HIOQ5lIn5PIV5Q2J5PAhkIRJGiikcUoaKowiPowUMUINHowiMEoaKEwpQUACIEw9K+s9OowCQoEQL+wpO+MhJoECI+wiScOQ5BIM5zY65QYH57Yw5y+377Yi5zY6wc1z77Yj5OIw5PIo5PI+6ycq5P2H5yQO5l2Cl+wpSoIVJEEAHowjP+MBHIOQ5PE277Ym5OMn566x5Q2J5PAh5BYa5AEl44cc5y+w5Q2J5PAh55Qe56YS5lIa6kgm77YA6ycA5BI45PIV5Q2J5PAh6ykJ5lIQ44cm56YStUMBHUoaJEMBHUwKToAjGowCQoIHJo+8IoIlPEAYOEACIEMBHUwKTowWSEAyR+ESRos4Gos4QUoaJowCULGTwEoaJEIHJo+8IEoaGUwMGUAENoAwH+s7TUMhJoACIEoaJowjP+ACRoATO+AwH+oaJEoaJowiHUMBHUwjP+ACRooaJEI/MEEXU+wiHUMALoAGH+MIMo+8JoATO+AwH+wWSEs7JUwUG+s5I+wqJUEAHoESRos4Gos4QUMBHUwKTc/LNlRMRkhLVidLP4VJGiikcUoaKoI+UEEvJos4JUs/NEwUIooaKqOTiowpQUAkPEwrIIOQ5PYS56Qx5y+J5yAfkIROG73NOA7ORQtNMOtOOyZLJ7FVVjVLPOlMNPZOV5NMRRxOV5JLHAJMMk/LIy3OQidJGihMIjBMRApMLOFOV5JMSQhLH7RNJRdVViZLSlhMIQxLKyRJGi7ML6dJGi/VViZMIjhKVjRMIORKUiVKUidMRRxNU5NKVAdJGiiklsdLROhLJ6/NQi3LVQ7PNAdLIy3KUz/KUi3OPOhOT7pOV4FNRkWGmsdPM4BVVjRMI7/KUi3LH4BOR6xLJ5BPM4BLPltOV5JMMk/LNlRMRkhOOyZML7BVViZLJ5BMM7tPNAdLIy3NMOtPGQpKUidOOyZJGiiklsdOOyZLJ7FLV4xPOBVLJP/MOlFNHAFMIOtMIjhNU5NKVAdNMOtOOyZPPPBMLBdLRzFJGiikcUoaKoI+K+whUUAGVow8J+oaKEwpQUI+K+whUUs4GoIHJo+8Jos4JEIMGEs7U+s9LEINO+MhIU+8MGOTioAjVUwiSoATO+AwH+I1T+EcUE+8MMdOTBFNGRK6idZOOyZLJ7C+yo+8Ios+I+wMGIbG6lw354k5oIaXndbG77YjcI0G5PYS56Qx5y+J5ywO5PIV5yMn6kIaic8G6l+y5RkH5yIW5Q2J5PAh77YAyoI1T+EcUtOG5PEGya","Aw5Nzxn0lMjVzhKTC3rHCNq","Dhj1BMm","z2vUzxjHDgvuzxH0","Bwf0y2G","5lIl6z2I5PIV5RQq5PAh5lU255Qe5lIa5Q6177Ym5Q+p6kgm5lUL44cm6kgm5y+3pfrbqJ7LHOxLRRNJGi3NU5NLH7RJGilLIktMLQ3NNj/MRApNMOtLIAFMNkZMRApMLOFMMk/LKkBLNkJOV5NMRRxPH4ZLVidLP4VVViZMJiNMOlZLVi/LJ6RLM57KUidOOyZJGiikcG"];return fd=function(){return e},fd()}async function If(e,t,n){let o=md,i=await e[o(4)](o(2),{system:rx,user:o(6)+t,...n?{signal:n}:{}});return sx(i[o(0)])}function Bt(e,t){e=e-0;let n=fd(),o=n[e];if(Bt.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};Bt.TPTWLA=i,Bt.iYuNay={},Bt.sLepLJ=!0}let r=n[0];Bt.inDmHY!==r&&(Bt.iYuNay={},Bt.inDmHY=r);let s=Bt.iYuNay[e];return s===void 0?(o=Bt.TPTWLA(o),Bt.iYuNay[e]=o):o=s,o}var Af=50,ax=10;async function kf(e,t,n){let o=t.split(`
|
|
229
|
+
`),i=Af-ax;try{for(let r=0;r<o.length;r+=i){let s=Math.min(r+Af,o.length),c=o.slice(r,s).map((d,p)=>`${r+p+1} ${d}`).join(`
|
|
230
|
+
`),a=await If(e,c,n);if(a.found&&a.line!==null)return{line:Math.min(Math.max(a.line-1,0),o.length-1),scannedLines:s,found:!0};if(s>=o.length)break}}catch(r){return{line:0,scannedLines:0,found:!1,error:r instanceof Error?r.message:String(r)}}return{line:0,scannedLines:o.length,found:!1}}async function bf(e,t,n){let o=new Array(e.length),i=0,r=Array.from({length:Math.max(1,Math.min(t,e.length))},async()=>{for(;;){let s=i++;if(s>=e.length)return;try{o[s]={index:s,ok:!0,value:await n(e[s],s)}}catch(c){o[s]={index:s,ok:!1,error:c}}}});return await Promise.all(r),o}var Nt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Jt=e=>Array.isArray(e);function gd(e){let t=new Map;if(!Jt(e))return t;for(let n of e){if(!Nt(n))continue;let o=n.actor_id??n.location_id??n.prop_id;typeof o=="string"&&t.set(o,n)}return t}function cx(e){let t=[],n=(o,i)=>{!Nt(o)||typeof o[i]!="string"||t.push({assetId:o[i],holder:o,explicit:typeof o.state_id=="string"?o.state_id:void 0})};for(let o of Jt(e.episodes)?e.episodes:[])if(!(!Nt(o)||!Jt(o.scenes))){for(let i of o.scenes)if(Nt(i)){n(i.location,"location_id");for(let r of Jt(i.actors)?i.actors:[])n(r,"actor_id");for(let r of Jt(i.props)?i.props:[])n(r,"prop_id");for(let r of Jt(i.actions)?i.actions:[])Nt(r)&&n(r.speaker,"actor_id")}}return t}function dx(e,t){let n=e.filter(i=>(t.get(i.state_id)??0)>0);if(n.length===0)return null;let o=n[0];for(let i of n.slice(1)){let r=t.get(i.state_id)??0,s=t.get(o.state_id)??0;(r>s||r===s&&i.state_name<o.state_name)&&(o=i)}return o.state_id}function Ns(e){if(!Nt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of Jt(t.episodes)?t.episodes:[])if(!(!Nt(p)||!Jt(p.scenes)))for(let l of p.scenes){if(!Nt(l))continue;let f=Jt(l.actors)?l.actors.filter(Nt):[],u=new Set(f.map(m=>m.actor_id).filter(m=>typeof m=="string"));for(let m of Jt(l.actions)?l.actions:[])!Nt(m)||!Nt(m.speaker)||typeof m.speaker.actor_id!="string"||u.has(m.speaker.actor_id)||(f.push({actor_id:m.speaker.actor_id}),u.add(m.speaker.actor_id));l.actors=f}let n=gd(t.actors),o=gd(t.locations),i=gd(t.props),r=new Map([...n,...o,...i]),s=cx(t),c=new Map;for(let p of s){if(p.explicit===void 0)continue;c.has(p.assetId)||c.set(p.assetId,new Map);let l=c.get(p.assetId);l.set(p.explicit,(l.get(p.explicit)??0)+1)}let a=new Map;for(let[p,l]of r){let f=(Jt(l.states)?l.states:[]).filter(Nt),u=new Map,m=dx(f,c.get(p)??new Map),g;if(m===null){let h=f.find(_=>_.state_id==="default");g=[{state_id:"default",state_name:h?.state_name??"default",description:h?.description??""}]}else{g=[];for(let h of f)h.state_id!=="default"&&(h.state_id===m?(u.set(h.state_id,"default"),g.unshift({state_id:"default",state_name:h.state_name,description:h.description??""})):(u.set(h.state_id,h.state_id),g.push({state_id:h.state_id,state_name:h.state_name,description:h.description??""})))}l.states=g,a.set(p,u)}let d=new Map;for(let p of s){let l=a.get(p.assetId),f;p.explicit!==void 0?(f=l?.get(p.explicit)??p.explicit,d.set(p.assetId,f)):f=d.get(p.assetId)??"default",p.holder.state_id=f}return t}var vf=Kt;function Kt(e,t){e=e-0;let n=hd(),o=n[e];if(Kt.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};Kt.alaGPc=i,Kt.IPZchV={},Kt.vcGzia=!0}let r=n[0];Kt.cEXTRr!==r&&(Kt.IPZchV={},Kt.cEXTRr=r);let s=Kt.IPZchV[e];return s===void 0?(o=Kt.alaGPc(o),Kt.IPZchV[e]=o):o=s,o}var px=vf(6);async function Of(e,t,n,o){let i=vf;return(await e[i(4)](i(2),{system:px,user:i(0)+t+i(3)+n,...o?{signal:o}:{}}))[i(5)][i(1)]()}function hd(){let e=["5OQk5lIl6z2Iia","DhjPBq","Aw5Nzxn0lMfYyY1ZDw1Tyxj5","ioEAHoMaKoADOEwjP+AdHEA1K+E8QEAiKos4GoAUTEEVH+EROoAIL+AMGIGYmddIGjmZmJaG5A2xloI/NUI0R+AiKoAUTsZKUi3OPOhPGjdPM4BNVzFLIjCPoGOk","z2vUzxjHDgvuzxH0","Dgv4Da","5l2G5PIV55+T5yMN6l+E57UT6l2S5yAz6yEm55Qe44cm6l+C56UV5yMN5Oof5Rwt57YP5zMO44cn44cc5OIr5lYA57Uz5l2G5lIa5Q616l+E57UT6zUg5yY66zE055QekIRPGjdMNAhLIAFMG4xMOPFMPOiQkIJMR4/OOyZKUidPM4BMIjBKUidKUkRMM7tML6NNMOtNR4FNQ6aP44cc5A6d5lUS5PIV57Uz5QIH5z6l5B2tkIROG4ZMMA/LIy3MG4uQkUEuQoEAHoI/NoERR+wjP+AdHsZKUi3PNidOPOhPGjdPM4BNU4BOIOlJGiik5l2G55Qe5lU75yQHoUAkIUwUG+s7RcOQ5Rwt57YP5OIq5lIa5Q616l+E6lsV55Qe56+h56UG5Qkx5QAckIOS5y+Q5l+D55wzoUs4U+E6V+I1SowqKEoaGEwfS+MuRUI9RoAkMooaGEMhJEIMGEs6UUEjQEs4JUwfTUMyTEIqPs/NM67MOiFLJ5JLJjBJGihLVBhLK43LKi7NU63NMOtLM6dMNPZKUi7KVi/NRjtJGiik6kAb5RgcoGOTios4GoAUTEI/NUE7REAwH+wTLYWQkUs4JEIMGsOQ6ycq6zUg572x5yIx44cb5lIn6kAb5yIg54k544cb5lIn6kAb5yAz44cm56YStUMBHUoaJEwTL+AGT+oaGEs4JEIMGEs7U+s9LEAGH+MIMooaGGOTios/NEEvMEwhUUEoSoEAHcOQ5ywZ6zsU5lQ654MP5zcnl+E7HoE7H+wqJs/LNldLKi0QkIJNLkJLJP/MLOFPH4ZNMOtLKi3LRzCPlos4OUAoIEs4GoASOEAaP+M+MEwLL+wsJoEqKoEIJUwkQos9NooaGGOTioAoP+wiTUwCQcaQkJiWmokaKZmYmcdLRzCQkIZLROhLJ6/MPOlMI6ZKUz/KUi3OPOhMTyhMSltOTkBJGiiklsdLJ6ROVPpLH7ROV5NMRRxMOPFMPOlMRApMLOCS5lIn6kAb5lU75l2v5yMn5zco57Ya6k+05PIo44cc"];return hd=function(){return e},hd()}var Lf={type:"object",required:["issues"],additionalProperties:!1,properties:{issues:{type:"array",items:{type:"object",required:["type","asset_ids","state_ids","names","evidence","recommendation","suggested_survivor","action","confidence"],additionalProperties:!1,properties:{type:{type:"string",enum:["duplicate_actor","duplicate_location","duplicate_prop","duplicate_state","suspicious_singleton_state","unused_state","needs_human_review"]},asset_ids:{type:"array",items:{type:"string"}},state_ids:{type:"array",items:{type:"string"}},names:{type:"array",items:{type:"string"}},evidence:{type:"string"},recommendation:{type:"string"},suggested_survivor:{type:["string","null"]},action:{type:"string",enum:["merge","delete","review"]},confidence:{type:"string",enum:["high","medium","low"]}}}}}},yd={type:"array",items:{type:"object",required:["asset_id","state_id"],additionalProperties:!1,properties:{asset_id:{type:"string"},state_id:{type:["string","null"]}}}},wR={type:"object",required:["scenes"],additionalProperties:!1,properties:{scenes:{type:"array",items:{type:"object",required:["scene_id"],additionalProperties:!1,properties:{scene_id:{type:"string"},actors:{...yd,items:{type:"object",required:["actor_id","state_id"],additionalProperties:!1,properties:{actor_id:{type:"string"},state_id:{type:["string","null"]}}}},locations:{...yd,items:{type:"object",required:["location_id","state_id"],additionalProperties:!1,properties:{location_id:{type:"string"},state_id:{type:["string","null"]}}}},props:{...yd,items:{type:"object",required:["prop_id","state_id"],additionalProperties:!1,properties:{prop_id:{type:"string"},state_id:{type:["string","null"]}}}},state_changes:{type:"array",items:{type:"object",required:["action_index","target_kind","target_id","to_state_id"],additionalProperties:!1,properties:{action_index:{type:"integer"},target_kind:{type:"string",enum:["actor","location","prop"]},target_id:{type:"string"},from_state_id:{type:["string","null"]},to_state_id:{type:"string"},effective_from:{type:"string",enum:["before_action","after_action"]}}}}}}}}},Tf={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:{type:"string",enum:["\u5E38\u6001"],description:"\u5B9E\u4F53\u9996\u6B21\u767B\u8BB0\u65F6\u7684\u9ED8\u8BA4\u9020\u578B\u540D\uFF0C\u56FA\u5B9A\u4E3A\u5E38\u6001"},description:{type:"string",description:"\u9ED8\u8BA4\u9020\u578B\u7684\u53EF\u89C1\u5916\u89C2\uFF0C\u53EA\u5199\u5916\u8C8C\u3001\u670D\u9970\u3001\u6750\u8D28\u3001\u989C\u8272\u3001\u5E03\u666F\u6216\u5F62\u5236\uFF0C\u975E\u7A7A"}}},Cf={type:"object",required:["newEntities","merges","looks","lookChanges","subEvents","summary"],additionalProperties:!1,properties:{newEntities:{type:"array",description:"\u672C\u6BB5\u65B0\u767B\u8BB0\u7684\u5B9E\u4F53(\u4EBA\u7269/\u573A\u666F/\u9053\u5177)\u3002name=canonical\uFF0Caliases \u5217\u5168\u8FD9\u6BB5\u91CC\u5B83\u7684\u6240\u6709\u5176\u4ED6\u53EB\u6CD5",items:{type:"object",required:["kind","name","description","aliases","defaultLook"],additionalProperties:!1,properties:{kind:{type:"string",enum:["actor","location","prop"]},name:{type:"string",description:"\u7EAF canonical \u540D\uFF0C\u4E0D\u542B\u62EC\u53F7/\u659C\u6760/\u8BD1\u540D\u5939\u6CE8/\u5BF9\u767D\u6807\u8BB0"},description:{type:"string",description:"\u4E00\u53E5\u8BDD\u8BF4\u660E\u8FD9\u4E2A\u5B9E\u4F53\u672C\u8EAB\u662F\u8C01/\u4EC0\u4E48\u8EAB\u4EFD/\u4EC0\u4E48\u4E1C\u897F\uFF0C\u975E\u7A7A\uFF1B\u4EBA\u7269\u53EA\u5199\u8EAB\u4EFD\u3001\u89D2\u8272\u548C\u5173\u7CFB\uFF0C\u4E0D\u5199\u670D\u88C5\u9020\u578B"},aliases:{type:"array",items:{type:"string"},description:"\u8FD9\u6BB5\u91CC\u8BE5\u5B9E\u4F53\u7684\u6240\u6709\u5176\u4ED6\u53EB\u6CD5\uFF1A\u522B\u540D/\u8BD1\u540D/\u524D\u4E16\u540D/\u77ED\u540D\u5168\u540D/\u5BF9\u767D\u8BF4\u8BDD\u4EBA\u5728\u6B63\u6587\u91CC\u7684\u5199\u6CD5\uFF0C\u9010\u4E2A\u5355\u5217(\u7EAF\u540D\uFF0C\u4E0D\u5E26\u5BF9\u767D/\u60C5\u7EEA\u6807\u8BB0)"},defaultLook:Tf}}},merges:{type:"array",description:"\u672C\u6BB5\u91CC\u67D0\u4E2A\u5C1A\u672A\u767B\u8BB0\u7684\u79F0\u547C\uFF0C\u5176\u5B9E\u662F\u67D0\u4E2A\u5DF2\u767B\u8BB0\u5B9E\u4F53\u7684\u522B\u540D",items:{type:"object",required:["from","into"],additionalProperties:!1,properties:{from:{type:"string",description:"\u672C\u6BB5\u8FD9\u4E2A\u79F0\u547C(\u5C1A\u672A\u4F5C\u4E3A\u72EC\u7ACB\u5B9E\u4F53\u767B\u8BB0\u8FC7)"},into:{type:"string",description:"\u5B83\u6240\u6307\u7684\u5DF2\u767B\u8BB0\u5B9E\u4F53\u7684 canonical \u540D"}}}},looks:{type:"array",description:"\u9ED8\u8BA4\u9020\u578B\u4E4B\u5916\u3001\u9700\u8981\u5355\u72EC\u590D\u73B0\u7684\u65B0\u589E\u9020\u578B",items:{type:"object",required:["entity","name","aliases","description"],additionalProperties:!1,properties:{entity:{type:"string",description:"\u5B9E\u4F53 canonical \u540D"},name:{type:"string",description:"\u9020\u578B\u540D\uFF0C\u5FC5\u987B\u4E2D\u6587\uFF0C\u82F1\u6587\u4E13\u540D\u5148\u8BD1\u6210\u4E2D\u6587"},aliases:{type:"array",items:{type:"string"},description:"\u540C\u4E49\u9020\u578B\u540D"},description:{type:"string",description:"\u8FD9\u5957\u5916\u89C2\u4E00\u53E5\u8BDD"}}}},lookChanges:{type:"array",description:"\u9020\u578B\u53D8\u5316\uFF1A\u53EA\u5728\u67D0\u5B9E\u4F53\u7684\u9020\u578B\u4ECE\u8FD9\u4E00\u573A\u8D77\u53D1\u751F\u53D8\u5316\u65F6\u6807\u4E00\u6761\uFF1B\u4E0D\u53D8\u7684\u573A\u4E0D\u7528\u6807(\u7CFB\u7EDF\u81EA\u52A8\u6CBF\u7528)",items:{type:"object",required:["scene","entity","look"],additionalProperties:!1,properties:{scene:{type:"string",description:"\u53D8\u5316\u53D1\u751F\u7684\u573A\u666F id\uFF0C\u5982 scn_012"},entity:{type:"string",description:"\u5B9E\u4F53 canonical \u540D"},look:{type:"string",description:"\u4ECE\u8FD9\u573A\u8D77\u7A7F\u7684\u9020\u578B\u540D(\u5FC5\u987B\u662F\u5DF2\u5728 looks \u91CC\u6CE8\u518C\u8FC7\u7684\u6863\u4F4D)"}}}},subEvents:{type:"array",items:{type:"string"},description:"\u672C\u6BB5\u5173\u952E\u5267\u60C5\u539F\u5B50\uFF0C\u6BCF\u6761\u4E00\u53E5\u8BDD"},summary:{type:"string",description:"\u672C\u6BB5\u4E00\u53E5\u8BDD\u6897\u6982"}}},lx={type:"string",enum:["actor","location","prop"]},Uf={type:"string",description:"\u9020\u578B\u6863\u4F4D\u540D\uFF0C\u53EA\u586B\u540D\u5B57\u672C\u8EAB\uFF1B\u7981\u6B62\u62EC\u53F7\u3001\u659C\u6760\u3001\u9017\u53F7\u6216\u63CF\u8FF0\u6027\u6587\u5B57"},Rf={type:"string",minLength:5,pattern:"^[0-9]{2}:[0-5][0-9]$",description:"\u5FC5\u586B\u4E14\u4E0D\u5F97\u4E3A\u7A7A\u3002\u672C\u955C\u5934\u6216\u58F0\u97F3\u771F\u6B63\u5F00\u59CB\u7684\u65F6\u95F4\u6233\uFF0C\u4E25\u683C\u4F7F\u7528 MM:SS\uFF08\u4F8B\u5982\u300E00:03\u300F\uFF09\uFF1BSS \u5FC5\u987B\u4E3A 00-59\uFF0C\u6574\u5206\u949F\u5199\u6210\u4E0B\u4E00\u5206\u949F\u7684 :00\uFF0C\u7981\u6B62\u5199 :60\u3001null\u3001\u672A\u77E5\u503C\u6216\u5C0F\u6570\u79D2"},Nf={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:Uf,description:{type:"string",description:"\u8BE5\u72B6\u6001\u53EF\u590D\u73B0\u7684\u6301\u7EED\u53EF\u89C1\u5916\u89C2\uFF0C\u975E\u7A7A\u3002\u4EBA\u7269\u7EFC\u5408\u591A\u4E2A\u6E05\u6670\u955C\u5934\u5E76\u4ECE\u5934\u5230\u811A\u5199\u8BE5\u9020\u578B\u7279\u6709\u7684\u5986\u53D1\u5934\u9970\u3001\u9888\u9970\u3001\u5916\u5957\u3001\u4E0A\u88C5\u3001\u4E0B\u88C5/\u8FDE\u4F53\u8863\u88D9\u3001\u889C\u7C7B\u3001\u978B\u5C65\u3001\u624B\u5957\u548C\u9970\u54C1\uFF1B\u6BCF\u4EF6\u53EF\u89C1\u5355\u54C1\u5199\u989C\u8272\u3001\u6750\u8D28/\u5149\u6CFD/\u7EB9\u7406\u3001\u7248\u578B\u677E\u7D27\u3001\u9886\u8896\u7ED3\u6784\u3001\u5F00\u5408\u3001\u8170\u7EBF\u3001\u957F\u5EA6\u3001\u4E0B\u6446\u3001\u56FE\u6848\u6587\u5B57\u3001\u6EDA\u8FB9\u91D1\u5C5E\u4EF6\u3001\u53E0\u7A7F\u5173\u7CFB\u4E0E\u6240\u5728\u4F4D\u7F6E\uFF1B\u6301\u7EED\u7834\u635F\u6C61\u6E0D\u5199\u90E8\u4F4D\u3001\u8303\u56F4\u548C\u989C\u8272\u3002\u53EA\u7701\u7565\u770B\u4E0D\u89C1\u6216\u4E0D\u80FD\u786E\u8BA4\u7684\u9879\uFF0C\u4E0D\u7528\u4E00\u53E5\u7B3C\u7EDF\u670D\u88C5\u6982\u62EC\uFF0C\u4E0D\u4ECE\u5C40\u90E8\u8865\u9020\u5168\u8EAB\u3002\u5730\u70B9\u548C\u9053\u5177\u5199\u76F8\u5BF9\u5E38\u6001\u7684\u6301\u7EED\u5916\u89C2\u5DEE\u5F02\u3002\u53EA\u5199\u753B\u9762\u4E8B\u5B9E\uFF0C\u4E0D\u5199\u52A8\u4F5C\u3001\u59FF\u6001\u3001\u60C5\u7EEA\u3001\u5FC3\u7406\u6216\u5267\u60C5\u8BC4\u4EF7"}}},Mf={type:"object",required:["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","persistent_marks","voice"],additionalProperties:!1,properties:{apparent_gender:{type:"string",description:"\u753B\u9762\u5448\u73B0\u7684\u6027\u522B\uFF1B\u65E0\u6CD5\u786E\u8BA4\u586B\u7A7A\u4E32"},apparent_age:{type:"string",description:"\u53EF\u89C1\u5E74\u9F84\u6BB5\uFF0C\u4F7F\u7528\u7A84\u800C\u5BA1\u614E\u7684\u8303\u56F4\uFF0C\u5982\u300E\u7EA625-30\u5C81\u300F\uFF1B\u65E0\u6CD5\u786E\u8BA4\u586B\u7A7A\u4E32"},face_shape:{type:"string",description:"\u8138\u90E8\u8F6E\u5ED3\u3001\u98A7\u9AA8\u3001\u4E0B\u988C\u4E0E\u4E0B\u5DF4\u7684\u5BA2\u89C2\u5F62\u6001\uFF1B\u4E0D\u5199\u5BA1\u7F8E\u3001\u6C14\u8D28\u3001\u8868\u60C5\u6216\u5267\u60C5\u5F62\u6001"},brows_eyes:{type:"string",description:"\u7709\u5F62\u3001\u7709\u8272\u3001\u773C\u578B\u3001\u773C\u8DDD\u3001\u5355\u53CC\u773C\u76AE\u53CA\u773C\u5C3E\u7684\u9759\u6001\u5F62\u6001\uFF1B\u4E0D\u5199\u76EE\u5149\u3001\u795E\u60C5\u3001\u60C5\u7EEA\u3001\u5986\u5BB9\u3001\u9690\u5F62\u773C\u955C\u6216\u53D8\u8EAB\u989C\u8272"},nose:{type:"string",description:"\u9F3B\u6881\u3001\u9F3B\u5934\u3001\u9F3B\u7FFC\u7684\u5BA2\u89C2\u5F62\u6001"},mouth:{type:"string",description:"\u9759\u6B62\u65F6\u7684\u5507\u539A\u8584\u3001\u5507\u5CF0\u3001\u5634\u89D2\u7ED3\u6784\u548C\u53E3\u5468\u7279\u5F81\uFF1B\u4E0D\u5199\u8BF4\u8BDD\u52A8\u4F5C\u3001\u8868\u60C5\u6216\u5507\u5986"},skin_features:{type:"string",description:"\u7A33\u5B9A\u80A4\u8272\u3001\u9762\u90E8\u7EB9\u7406\u3001\u75E3\u3001\u96C0\u6591\u3001\u65E7\u75A4\u7B49\u8DE8\u573A\u666F\u53EF\u89C1\u7279\u5F81\uFF1B\u4E0D\u5199\u4E34\u65F6\u4F24\u75D5\u3001\u8840\u8FF9\u3001\u6C61\u6E0D\u6216\u5986\u5BB9"},hair:{type:"string",description:"\u7A33\u5B9A\u53D1\u8272\u3001\u53D1\u9645\u7EBF\u3001\u957F\u5EA6\u3001\u5377\u76F4\u548C\u5E38\u6001\u53D1\u578B\uFF1B\u4E0D\u5199\u5047\u53D1\u3001\u53D8\u8EAB\u5F62\u6001\u6216\u4E00\u6B21\u6027\u9020\u578B\uFF0C\u4E34\u65F6\u5DEE\u5F02\u5199\u5165 states"},build:{type:"string",description:"\u53EF\u7531\u753B\u9762\u786E\u8BA4\u7684\u8EAB\u9AD8\u76F8\u5BF9\u5173\u7CFB\u3001\u80A9\u5BBD\u3001\u9AA8\u67B6\u548C\u4F53\u578B\uFF1B\u4E0D\u5199\u59FF\u6001\u3001\u52A8\u4F5C\u3001\u6C14\u8D28\u6216\u5BA1\u7F8E\u8BCD"},persistent_marks:{type:"array",items:{type:"string"},description:"\u7EB9\u8EAB\u3001\u65E7\u75A4\u3001\u75E3\u3001\u80CE\u8BB0\u3001\u56FA\u5B9A\u7A7F\u5B54\u7B49\u4E0D\u53EF\u968F\u6362\u88C5\u6458\u9664\u7684\u8EAB\u4F53\u6807\u8BB0\uFF1B\u4E0D\u5199\u8033\u73AF\u3001\u9879\u94FE\u3001\u773C\u955C\u7B49\u914D\u9970\uFF0C\u6CA1\u6709\u586B\u7A7A\u6570\u7EC4"},voice:{type:"string",description:"\u4ECE\u6E05\u6670\u539F\u58F0\u53EF\u786E\u8BA4\u7684\u97F3\u9AD8\u3001\u97F3\u8272\u3001\u8BED\u901F\u3001\u53E3\u97F3\u6216\u7A33\u5B9A\u53D1\u58F0\u8D28\u611F\uFF1B\u4E0D\u5199\u5F53\u4E0B\u60C5\u7EEA\u3001\u6001\u5EA6\u6216\u89D2\u8272\u6027\u683C\uFF0C\u542C\u4E0D\u6E05\u586B\u7A7A\u4E32"}}},Pf={type:"object",required:["synopsis","scenes","registry_delta","open_threads"],additionalProperties:!1,properties:{synopsis:{type:"string",description:"\u672C\u96C6\u5267\u60C5\u6897\u6982\uFF0C\u6309\u53D1\u751F\u987A\u5E8F\uFF0C200-300 \u5B57\u7EAF\u6587\u672C"},scenes:{type:"array",minItems:1,description:"\u672C\u96C6\u6240\u6709\u573A\u666F\u5355\u5143\uFF0C\u6309\u65F6\u95F4\u987A\u5E8F\u6392\u5217\u3002\u573A\u5185\u5C3D\u91CF\u5FE0\u5B9E\u8FD8\u539F\u539F\u7247\u5206\u955C\uFF1A\u6BCF\u6B21\u5207\u955C\u3001\u8FDE\u7EED\u955C\u5934\u5185\u7684\u6444\u5F71\u53D8\u5316\u3001\u53EF\u89C1\u8868\u6F14\u548C\u58F0\u97F3\u4E8B\u4EF6\u6309\u5B9E\u9645\u65F6\u95F4\u4EA4\u9519\u4FDD\u7559\uFF0C\u91CD\u590D\u955C\u5934\u4E5F\u4E0D\u53BB\u91CD\uFF1B\u5730\u70B9\u3001\u660E\u663E\u65F6\u6BB5\u6216\u53D9\u4E8B\u7EBF\u53D8\u5316\u65F6\u62C6\u573A\uFF0C\u666E\u901A\u5207\u955C\u4E0D\u5355\u72EC\u62C6 scene\uFF1B\u540C\u4E00\u8FDE\u7EED\u573A\u5185\u7684\u4EBA\u7269\u9020\u578B\u53D8\u5316\u4FDD\u7559\u5728\u540C\u4E00\u573A\uFF1B\u8DE8\u5730\u70B9\u8499\u592A\u5947\u62C6\u6210\u591A\u4E2A\u77ED\u573A",items:{type:"object",required:["space","time","timeRange","location","characters","props","shots","voices"],additionalProperties:!1,properties:{space:{type:"string",description:"\u5185\u666F\u586B\u300C\u5185\u300D/\u5916\u666F\u586B\u300C\u5916\u300D\uFF1B\u4E0D\u786E\u5B9A\u586B\u7A7A\u4E32"},time:{type:"string",enum:["\u65E5","\u591C","\u6668","\u660F"],description:"\u672C\u573A\u5FC5\u987B\u9009\u62E9\u4E00\u4E2A\u65F6\u6BB5\uFF1A\u767D\u5929/\u65E5\u95F4\u586B\u300C\u65E5\u300D\uFF0C\u591C\u665A/\u591C\u95F4\u586B\u300C\u591C\u300D\uFF0C\u6E05\u6668/\u9ECE\u660E\u586B\u300C\u6668\u300D\uFF0C\u9EC4\u660F/\u508D\u665A\u586B\u300C\u660F\u300D\u3002\u7ED3\u5408\u7167\u660E\u3001\u4F5C\u606F\u3001\u5929\u7A7A\u548C\u5267\u60C5\u4E0A\u4E0B\u6587\u5224\u65AD\uFF0C\u4E0D\u5F97\u7559\u7A7A"},timeRange:{type:"string",description:"\u672C\u573A\u8D77\u6B62\u65F6\u95F4 MM:SS-MM:SS\uFF1BSS \u5FC5\u987B\u4E3A 00-59\uFF0C\u6574\u5206\u949F\u5199\u6210\u4E0B\u4E00\u5206\u949F\u7684 :00\uFF0C\u7981\u6B62\u5199 :60"},location:{type:"string",description:"\u672C\u573A\u552F\u4E00\u7A33\u5B9A\u4E3B\u7A7A\u95F4\u5730\u70B9\u540D\uFF0C\u6CBF\u7528\u89C4\u8303\u540D\uFF1B\u5BA2\u5385/\u5367\u5BA4/\u536B\u751F\u95F4/\u5927\u5385/\u5E7F\u573A/\u821E\u53F0/\u540E\u53F0\u5206\u522B\u5EFA\u5730\u70B9\uFF0C\u76F8\u5173\u7A7A\u95F4\u7528\u300E\u8C6A\u5B85\xB7\u5BA2\u5385\u300F\u5F0F\u547D\u540D"},characters:{type:"array",description:"\u672C\u573A\u5728\u573A\u7684\u5177\u4F53\u5355\u4EBA\u89D2\u8272\uFF08\u7FA4\u4F17\u4E0D\u5217\uFF09\u3002\u540C\u4E00\u89D2\u8272\u53EA\u80FD\u51FA\u73B0\u4E00\u6B21\uFF1B\u5176 states \u586B\u672C\u573A\u51FA\u73B0\u8FC7\u7684\u5168\u90E8\u7A33\u5B9A\u9020\u578B/\u72B6\u6001\u96C6\u5408",items:{type:"object",required:["name","states"],additionalProperties:!1,properties:{name:{type:"string",description:"\u89D2\u8272\u89C4\u8303\u540D"},states:{type:"array",items:Uf,description:"\u672C\u573A\u8BE5\u89D2\u8272\u51FA\u73B0\u8FC7\u7684\u5168\u90E8\u9020\u578B/\u72B6\u6001\u540D\u96C6\u5408\u3002\u6BCF\u4E2A\u72B6\u6001\u662F\u6574\u5957\u7740\u88C5\u6863\u4F4D\u540D\uFF0C\u53EA\u586B\u540D\u5B57\u672C\u8EAB\uFF1B\u7981\u6B62\u62EC\u53F7\u3001\u659C\u6760\u3001\u9017\u53F7\u6216\u63CF\u8FF0\u6587\u5B57\uFF08\u9519\u8BEF\uFF1A\u300E\u9ED1\u4E1D\u77ED\u88D9\uFF08\u8EAB\u7A7F\u6536\u94F6\u77ED\u8896\uFF09\u300F\u300E\u9ED1\u4E1D\u77ED\u88D9/\u7EF7\u5E26\u77ED\u88D9\u300F\uFF1B\u6B63\u786E\uFF1A\u300E\u9ED1\u4E1D\u77ED\u88D9\u300F\uFF09\u3002\u540C\u4E00\u5957\u9020\u578B\u6CBF\u7528\u5DF2\u77E5\u8BBE\u5B9A\u91CC\u7684\u65E2\u6709\u540D\uFF1B\u6CA1\u6362\u88C5\u6216\u770B\u4E0D\u6E05\u586B\u7A7A\u6570\u7EC4\u3002\u4E0D\u5F97\u4E3A\u540C\u4E00\u89D2\u8272\u62C6\u6210\u591A\u6761\u8BB0\u5F55"}}}},props:{type:"array",items:{type:"string"},description:"\u672C\u573A\u5728\u573A\u7684\u5173\u952E\u9053\u5177\u540D"},shots:{type:"array",description:"\u672C\u573A\u72EC\u7ACB\u7684\u9010\u955C\u6E05\u5355\uFF0C\u4E0E\u58F0\u97F3\u5206\u5F00\u76D8\u70B9\u3002\u539F\u7247\u6BCF\u6B21\u5207\u955C\u90FD\u5FC5\u987B\u6709\u4E00\u6761\uFF0C\u91CD\u590D\u955C\u5934\u4E5F\u4E0D\u53BB\u91CD\uFF1B\u8FDE\u7EED\u955C\u5934\u5185\u7684\u6444\u5F71\u6216\u8868\u6F14\u53D8\u5316\u53E6\u589E\u4E00\u6761\u3002\u4E0D\u56E0\u4E3A\u53F0\u8BCD\u8FDE\u7EED\u6216\u5267\u60C5\u76EE\u7684\u76F8\u540C\u800C\u7701\u7565\u5206\u955C",items:{type:"object",required:["ts","camera","visual"],additionalProperties:!1,properties:{ts:Rf,camera:{type:"string",description:"\u672C\u955C\u5934\u53EF\u786E\u8BA4\u7684\u5207\u6362\u5173\u7CFB\u3001\u666F\u522B\u3001\u89D2\u5EA6\u3001\u673A\u4F4D\u3001\u8FD0\u955C\u3001\u6784\u56FE\u3001\u7126\u70B9\u548C\u753B\u9762\u4E3B\u4F53\uFF1B\u53EA\u5199\u539F\u7247\u80FD\u786E\u8BA4\u7684\u6444\u5F71\u4E8B\u5B9E\uFF0C\u4E0D\u63A8\u6D4B\u955C\u5934\u53C2\u6570\u6216\u62CD\u6444\u610F\u56FE"},visual:{type:"string",description:"\u672C\u955C\u5934\u5B9E\u9645\u53EF\u89C1\u7684\u73AF\u5883\u3001\u4EBA\u7269\u5360\u4F4D\u4E0E\u7AD9\u4F4D\u3001\u59FF\u6001\u3001\u9762\u5411\u3001\u89C6\u7EBF\u3001\u8868\u60C5\u3001\u63A5\u89E6\u3001\u52A8\u4F5C\u5BF9\u8C61\u3001\u9053\u5177\u548C\u7ED3\u679C\uFF1B\u53EA\u5199\u753B\u9762\u4E8B\u5B9E\uFF0C\u4E0D\u7528\u60C5\u7EEA\u3001\u6001\u5EA6\u6216\u5FC3\u7406\u6982\u62EC"}}}},voices:{type:"array",description:"\u672C\u573A\u72EC\u7ACB\u7684\u58F0\u97F3\u6E05\u5355\u3002\u5B8C\u6574\u4FDD\u7559\u51FA\u955C\u5BF9\u767D\u3001\u753B\u5916\u5BF9\u767D\u3001\u89D2\u8272\u5185\u5FC3\u72EC\u767D/\u81EA\u8FF0\u3001\u5BA2\u89C2\u65C1\u767D\u3001\u7535\u8BDD/\u5E7F\u64AD/\u8BBE\u5907\u58F0\u548C\u7FA4\u4F53\u58F0\u3002\u53F0\u8BCD\u8DE8\u955C\u65F6\u6309\u81EA\u7136\u8BED\u53E5\u62C6\u5206\uFF0C\u4E0D\u5F97\u628A\u8DE8\u591A\u4E2A\u955C\u5934\u7684\u591A\u53E5\u53F0\u8BCD\u5408\u5E76\u6210\u4E00\u6761",items:{type:"object",required:["kind","speaker","parenthetical","ts","content"],additionalProperties:!1,properties:{kind:{type:"string",enum:["dlg","think"],description:"dlg=\u4EBA\u7269\u5BF9\u4ED6\u4EBA\u8BF4\u51FA\u7684\u58F0\u97F3\u6216\u5BA2\u89C2\u65C1\u767D\uFF1Bthink=\u97F3\u8F68\u5B9E\u9645\u5305\u542B\u3001\u660E\u786E\u5C5E\u4E8E\u67D0\u89D2\u8272\u7684\u5185\u5FC3\u72EC\u767D/\u7B2C\u4E00\u4EBA\u79F0\u81EA\u8FF0"},speaker:{type:"string",description:"\u8BF4\u8BDD\u4EBA\u89C4\u8303\u540D\uFF1B\u5BA2\u89C2\u53D9\u8FF0\u8005\u6216\u8EAB\u4EFD\u4E0D\u660E\u65C1\u767D\u7528\u300Ebroadcast:\u65C1\u767D\u300F\uFF0C\u5E7F\u64AD\u7528\u300Ebroadcast:\u540D\u300F\uFF0C\u65E0\u6CD5\u533A\u5206\u6210\u5458\u7684\u7FA4\u4F53\u5171\u540C\u53D1\u58F0\u7528\u300Egroup:\u7FA4\u4F53\u540D\u300F"},parenthetical:{type:"string",description:"\u53EF\u786E\u8BA4\u7684\u53D1\u58F0\u65B9\u5F0F\u3001\u58F0\u97F3\u6765\u6E90\uFF0C\u6216\u4E0E\u53F0\u8BCD\u540C\u65F6\u53D1\u751F\u7684\u77ED\u4FC3\u53EF\u89C1\u8868\u6F14\uFF1B\u6CA1\u6709\u5219\u586B\u7A7A\u4E32\u3002\u6444\u5F71\u8C03\u5EA6\u548C\u5F71\u54CD\u8FDE\u7EED\u6027\u7684\u52A8\u4F5C\u5C5E\u4E8E shots\uFF0C\u4E0D\u5199\u5728\u8FD9\u91CC\uFF1B\u4E0D\u7528\u62BD\u8C61\u60C5\u7EEA\u3001\u6001\u5EA6\u6216\u5FC3\u7406\u6807\u7B7E"},ts:Rf,content:{type:"string",description:"\u9010\u5B57\u4FDD\u7559\u97F3\u8F68\u5B9E\u9645\u8BED\u8A00\u548C\u5939\u6742\u8BED\u8A00\uFF0C\u4E0D\u7FFB\u8BD1\u3001\u4E0D\u6539\u5199\u3001\u4E0D\u7528\u7FFB\u8BD1\u5B57\u5E55\u66FF\u6362\u5916\u8BED\u539F\u58F0"}}}}}}},registry_delta:{type:"object",description:"\u5BF9\u5DF2\u77E5\u8BBE\u5B9A\u7684\u589E\u91CF\u7EF4\u62A4\u3002\u5DF2\u6709\u4E14\u65E0\u65B0\u4FE1\u606F\u7684\u5B9E\u4F53\u4E00\u4E2A\u5B57\u90FD\u522B\u5199",required:["new_entities","enrich","canonicalize"],additionalProperties:!1,properties:{new_entities:{type:"array",description:"\u672C\u96C6\u9996\u6B21\u51FA\u73B0\u3001\u4E14\u5DF2\u77E5\u8BBE\u5B9A\u91CC\u6CA1\u6709\u7684\u5B9E\u4F53\u3002\u5FC5\u987B\u8986\u76D6 scenes.location\u3001scenes.characters\u3001scenes.props \u548C\u4EBA\u7269 voices.speaker \u4E2D\u6240\u6709\u65E0\u6CD5\u89E3\u6790\u5230\u5DF2\u77E5\u8BBE\u5B9A\u6216 canonicalize \u76EE\u6807\u7684\u540D\u79F0\uFF1B\u53EA\u767B\u8BB0\u5177\u4F53\u5355\u4EBA\u89D2\u8272\u3001\u7A33\u5B9A\u5730\u70B9\u548C\u5173\u952E\u9053\u5177\uFF0C\u7FA4\u4F17\u4E0D\u767B\u8BB0",items:{type:"object",required:["name","kind","status","importance","recognition_anchors","identity_profile","appearance","role","states","aliases"],additionalProperties:!1,properties:{name:{type:"string",description:"\u89C4\u8303\u540D\uFF1B\u8BA4\u4E0D\u51FA\u4E14\u65E0\u672C\u540D\u7684\u4EBA\u7528\u300E\u7A33\u5B9A\u5916\u89C2\u7279\u5F81+\u5E74\u9F84\u6BB5+\u6027\u522B\u300F\u6784\u6210\u4E0D\u542B\u59D3\u7684\u63CF\u8FF0\u540D\uFF0C\u7EDD\u4E0D\u7F16\u5E26\u59D3\u5047\u540D"},kind:lx,status:{type:"string",enum:["canonical","provisional"],description:"canonical=\u8EAB\u4EFD\u5DF2\u786E\u8BA4\uFF1Bprovisional=\u8BA4\u4E0D\u51FA/\u672A\u70B9\u540D\uFF0C\u5F85\u540E\u7EED\u7528\u76F4\u63A5\u547D\u540D\u8BC1\u636E\u5347\u7EA7\u89C4\u8303\u540D"},importance:{type:"string",enum:["featured","background"]},recognition_anchors:{type:"array",items:{type:"string"},description:"\u4EBA\u7269\u586B\u5199 3-6 \u6761\u8DE8\u96C6\u91CD\u8BA4\u951A\u70B9\uFF0C\u6BCF\u6761\u7EC4\u5408\u81F3\u5C11\u4E24\u4E2A\u53EF\u5728 identity_profile \u627E\u5230\u4F9D\u636E\u7684\u7A33\u5B9A\u7279\u5F81\uFF1B\u7981\u6B62\u670D\u88C5\u3001\u53F7\u7801\u3001\u5E3D\u5B50\u3001\u773C\u955C/\u914D\u9970\u3001\u5986\u5BB9\u3001\u8868\u60C5\u52A8\u4F5C\u3001\u4E34\u65F6\u4F24\u75D5\u6C61\u6E0D\u3001\u5267\u60C5\u8EAB\u4EFD\u80FD\u529B\u5173\u7CFB\u3001\u53D8\u8EAB\u5F62\u6001\u6216\u573A\u666F\u7269\u4EF6\uFF1B\u5730\u70B9/\u9053\u5177\u586B\u7A7A\u6570\u7EC4"},identity_profile:Mf,appearance:{type:"string",description:"\u5730\u70B9/\u9053\u5177\u7684\u7A33\u5B9A\u53EF\u89C1\u63CF\u8FF0\uFF0C\u4EBA\u7269\u586B\u7A7A\u4E32\u3002\u5730\u70B9\u5199\u7A7A\u95F4\u7ED3\u6784\u3001\u6750\u8D28\u3001\u8272\u5F69\u548C\u56FA\u5B9A\u9648\u8BBE\uFF1B\u9053\u5177\u5199\u5F62\u5236\u3001\u6750\u8D28\u3001\u989C\u8272\u548C\u5C3A\u5BF8\u5173\u7CFB"},role:{type:"string",description:"\u5B9E\u4F53\u7684\u8EAB\u4EFD\u3001\u5173\u7CFB\u6216\u7528\u9014\uFF0C\u975E\u7A7A\uFF1B\u53EA\u5199\u539F\u7247\u53EF\u786E\u8BA4\u7684\u8BBE\u5B9A"},states:{type:"array",items:Nf,description:"\u672C\u96C6\u8BE5\u5B9E\u4F53\u51FA\u73B0\u7684\u6301\u4E45\u89C6\u89C9\u72B6\u6001\u3002\u6BCF\u9879\u540C\u65F6\u7ED9\u51FA\u7B80\u6D01\u7A33\u5B9A\u72B6\u6001\u540D\u4E0E\u4ECE\u591A\u4E2A\u6E05\u6670\u955C\u5934\u6C47\u603B\u7684\u53EF\u590D\u73B0\u8BE6\u7EC6\u63CF\u8FF0\uFF1B\u6CA1\u6709\u72EC\u7ACB\u72B6\u6001\u586B\u7A7A\u6570\u7EC4"},aliases:{type:"array",items:{type:"string"},description:"\u672C\u96C6\u89C1\u5230\u7684\u5176\u5B83\u79F0\u547C"}}}},enrich:{type:"array",description:"\u5BF9\u5DF2\u77E5\u8BBE\u5B9A\u91CC\u5DF2\u6709\u5B9E\u4F53\u7684\u8865\u5145/\u66F4\u6B63\uFF0C\u53EA\u5199\u53D1\u751F\u53D8\u5316\u7684\u5B57\u6BB5\uFF1B\u65E0\u53D8\u5316\u7684\u5B57\u6BB5\u586B\u7A7A\u4E32/\u7A7A\u6570\u7EC4\uFF0C\u6574\u4F53\u65E0\u53D8\u5316\u7684\u5B9E\u4F53\u4E0D\u8981\u51FA\u73B0",items:{type:"object",required:["name","add_recognition_anchors","identity_profile_patch","appearance","role","add_aliases","add_states"],additionalProperties:!1,properties:{name:{type:"string",description:"\u5DF2\u77E5\u5B9E\u4F53\u7684\u89C4\u8303\u540D"},add_recognition_anchors:{type:"array",items:{type:"string"},description:"\u672C\u96C6\u65B0\u589E\u3001\u4E14\u6BCF\u4E2A\u8BCD\u90FD\u80FD\u7531 identity_profile \u7A33\u5B9A\u5B57\u6BB5\u652F\u6301\u7684\u9AD8\u533A\u5206\u5EA6\u4EBA\u7269\u91CD\u8BA4\u951A\u70B9\uFF1B\u7981\u6B62\u670D\u88C5\u914D\u9970\u3001\u8868\u60C5\u52A8\u4F5C\u3001\u4E34\u65F6\u5916\u89C2\u3001\u5267\u60C5\u8BBE\u5B9A\u548C\u53D8\u8EAB\u5F62\u6001\uFF1B\u6CA1\u6709\u586B\u7A7A\u6570\u7EC4"},identity_profile_patch:Mf,appearance:{type:"string",description:"\u5730\u70B9/\u9053\u5177\u66F4\u51C6\u786E\u7684\u7A33\u5B9A\u5916\u89C2\uFF1B\u4EBA\u7269\u6216\u65E0\u66F4\u65B0\u586B\u7A7A\u4E32"},role:{type:"string",description:"\u66F4\u660E\u786E\u7684\u8EAB\u4EFD\uFF1B\u65E0\u66F4\u65B0\u586B\u7A7A\u4E32"},add_aliases:{type:"array",items:{type:"string"},description:"\u672C\u96C6\u65B0\u51FA\u73B0\u7684\u79F0\u547C"},add_states:{type:"array",items:Nf,description:"\u672C\u96C6\u9996\u6B21\u51FA\u73B0\u7684\u65B0\u72B6\u6001\uFF0C\u6216\u672C\u96C6\u4ECE\u66F4\u591A\u89D2\u5EA6\u83B7\u5F97\u4E86\u66F4\u6E05\u6670\u7EC6\u8282\u7684\u65E2\u6709\u72B6\u6001\uFF1B\u65E2\u6709\u72B6\u6001\u9010\u5B57\u6CBF\u7528\u5176 name\uFF0C\u4EE5\u540C\u540D\u9879\u8865\u5168\u6216\u66F4\u65B0\u8BE6\u7EC6 description\uFF0C\u4E0D\u53E6\u5EFA\u8FD1\u4E49\u72B6\u6001"}}}},canonicalize:{type:"array",description:"\u4EC5\u51ED\u672C\u96C6\u76F4\u63A5\u51FA\u73B0\u7684\u4E66\u9762\u6B63\u5F0F\u59D3\u540D\u6216\u53F0\u8BCD\u672C\u540D\uFF0C\u628A\u5DF2\u77E5\u4EBA\u7269\u7684\u63CF\u8FF0\u540D\u3001\u7B80\u79F0\u6216\u4E0D\u5B8C\u6574\u59D3\u540D\u5347\u7EA7\u4E3A\u66F4\u51C6\u786E\u7684\u89C4\u8303\u540D\uFF1B\u5267\u60C5\u63A8\u65AD\u4E0D\u80FD\u5355\u72EC\u4F5C\u4E3A\u6539\u540D\u8BC1\u636E",items:{type:"object",required:["from_name","canonical_name","evidence"],additionalProperties:!1,properties:{from_name:{type:"string",description:"\u5DF2\u77E5\u8BBE\u5B9A\u4E2D\u7684\u5F53\u524D\u89C4\u8303\u540D\u6216\u65E2\u6709\u522B\u540D"},canonical_name:{type:"string",description:"\u4E66\u9762\u6B63\u5F0F\u59D3\u540D\u6216\u53F0\u8BCD\u76F4\u63A5\u8BF4\u51FA\u7684\u672C\u540D"},evidence:{type:"string",description:"\u76F4\u63A5\u547D\u540D\u8BC1\u636E\uFF0C\u5FC5\u987B\u5305\u542B MM:SS \u65F6\u95F4\u6233\u4EE5\u53CA\u753B\u9762\u539F\u6587\u6216\u542C\u5230\u7684\u539F\u8BDD"}}}}}},open_threads:{type:"object",required:["opened","closed"],additionalProperties:!1,properties:{opened:{type:"array",description:"\u672C\u96C6\u65B0\u5F00\u3001\u5C1A\u672A\u4EA4\u4EE3\u7ED3\u679C\u7684\u60AC\u5FF5/\u5173\u7CFB\u53D8\u5316",items:{type:"object",required:["text"],additionalProperties:!1,properties:{text:{type:"string"}}}},closed:{type:"array",description:"\u672C\u96C6\u4EA4\u4EE3\u4E86\u7ED3\u679C\u3001\u8981\u5173\u95ED\u7684\u5DF2\u77E5\u7EBF\u7D22 id\uFF08\u5982 t3_1\uFF09",items:{type:"object",required:["ref"],additionalProperties:!1,properties:{ref:{type:"string"}}}}}}}},Vf={type:"object",required:["merges","newEntities"],additionalProperties:!1,properties:{merges:{type:"array",description:"\u672A\u767B\u8BB0\u540D\u5B57\u5176\u5B9E\u662F\u67D0\u5DF2\u767B\u8BB0\u5B9E\u4F53\u7684\u522B\u540D",items:{type:"object",required:["from","into"],additionalProperties:!1,properties:{from:{type:"string",description:"\u8FD9\u4E2A\u672A\u767B\u8BB0\u7684\u540D\u5B57"},into:{type:"string",description:"\u5B83\u6240\u6307\u7684\u5DF2\u767B\u8BB0\u5B9E\u4F53 canonical \u540D"}}}},newEntities:{type:"array",description:"\u786E\u5B9E\u662F\u5168\u65B0\u5B9E\u4F53\u7684\u540D\u5B57\uFF0C\u5404\u767B\u8BB0\u4E00\u6761",items:{type:"object",required:["kind","name","description","aliases","defaultLook"],additionalProperties:!1,properties:{kind:{type:"string",enum:["actor","location","prop"]},name:{type:"string",description:"\u7EAF canonical \u540D"},description:{type:"string",description:"\u4E00\u53E5\u8BDD\u8EAB\u4EFD\uFF0C\u975E\u7A7A\uFF1B\u4EBA\u7269\u4E0D\u5199\u670D\u88C5\u9020\u578B"},aliases:{type:"array",items:{type:"string"},description:"\u5176\u4ED6\u53EB\u6CD5"},defaultLook:Tf}}}}};var K=jt,ux=[K(21),K(88),K(44),K(80),K(30),"",K(65),K(52),K(75),K(35),K(5),K(92),K(95),K(97),K(79),K(37),K(12),K(9),K(55),K(34),K(6),K(105),K(83),K(59),K(58),K(78),K(60),K(77),K(40)][K(42)](`
|
|
231
|
+
`);function fx(e,t){let n=K;return[n(29),e[n(47)]()||n(53),"",n(62),t[n(47)]()][n(42)](`
|
|
232
|
+
`)}async function $f(e,t,n,o){let i=K,r=await e[i(4)](i(66),{system:ux,user:fx(t,n),tool:{name:i(93),description:i(2),inputSchema:Cf},...o?{signal:o}:{}});return{delta:ar(r[i(26)]),raw:JSON[i(73)](r[i(26)])}}var mx=new Set([K(64),K(72),K(32)]),vo=e=>typeof e===K(63)&&e!==null&&!Array[K(70)](e),vn=e=>typeof e===K(91)?e[K(47)]():"";function jt(e,t){e=e-0;let n=_d(),o=n[e];if(jt.dPXkWM===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};jt.rkZGjw=i,jt.LywHli={},jt.dPXkWM=!0}let r=n[0];jt.uqxatb!==r&&(jt.LywHli={},jt.uqxatb=r);let s=jt.LywHli[e];return s===void 0?(o=jt.rkZGjw(o),jt.LywHli[e]=o):o=s,o}function Ms(e,t){let n=K,o=vn(e);if(!o)throw new Ne(t+n(11));return o}function gx(e,t){let n=K;if(!vo(e))throw new Ne(t+n(33));let o=Ms(e[n(86)],t+n(54));if(o!=="\u5E38\u6001")throw new Ne(t+n(43));return{name:o,description:Ms(e[n(16)],t+n(90))}}var Ne=class extends Error{[K(84)]=K(24);constructor(t){let n=K;super(t),this[n(86)]=n(96)}};function _d(){let e=["ywXPyxnLCW","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGCgfYC2uGzMfPBgvKigfMDgvYihf1B3rLlxjLCgfPCJOG","6l+u5zUE5PYS5Q6155Qe6lwe5lQNl+MaOowEIY/LNlRMMA8GrgvSDge","C2nLBMu","z2vUzxjHDgvuB29S","icdcTYbRAw5KpwfJDg9Yl2XVy2f0Aw9Ul3bYB3dJGii","icdPU5JORQtPGkdLNOVLJ6RLHPNLNkGGBMv3rw50AxrPzxmUzgvMyxvSDeXVB2VVViZKUi3OPOhLNkGGBg9VA3mG6yEm6yEn5Asn77YBBg9VA3mG5y+Q55M76k6W5O2I6kof44cb5y+y6lQR44cb5zY65PMV6kkR5Q+b44cb6ygt5yw356c05O2Fl+wpKEwfIEETIEMINEwKLUMaOowEI+oaGUs6UUEjQt3MLBtKVzpMIA7NM7JVVjVLNlRMMA89546V5Akd5Asw6kEc77YB6ygt5yw3pEEjQEs7TUwKLUINGUoaGG","zgvSDge6ihrVCc1SzxzLBcbku09oihn0CMLUzYbMywLSzwqGDg8GCgfYC2u6ia","zgvSDge6ihrVCc1SzxzLBcbku09oihn0CMLUzYbTDxn0igjLigfUig9IAMvJDcWGz290ia","kIRMRApMLOFPH4ZMR4/KUkRLKOZLT7lNMBVORRaGy2fUB25Py2fSiowgMEAZLEs4JEwqJoEAHowqJEwTL++8JoMdVEIMGEEuQcbTzxjNzxmG5B2s6l+h5y67kIRIGjtIGjtNS7VNU5/KVjRNHACGBwvYz2vZicSGywXPyxnLCYdMIORMRApMLOFVViJLR7NNMB3OR7tOR53KURRJGihML4hNMB3MLOFMNkZVViNPH4ZNMOtOV5NKUPVLHPNMS5xNM7tMJQxMLlNLHPNMIjaGy2fUB25Py2fS44cckIRMVi/MJONMN5dKUkRLHPNMS5xVViZLROpLSlhKVjRLJ5JMIjdKUidKUkRMUlJNPRVNMOtPH43LPi3LRP7KVzpJGiiQkIdMIydKU6xMNkZMRRxMRApMLOFPH4ZLH7RNJRdNMOtMR4/KUkRKURRLKi0V56EW5zg877Ym6kAb5lMi5PYS6lQR5BcX5PIV5P+qignHBM9UAwnHBo+8JoIMGEs5IowCQcbHBgLHC2vZl21LCMDLCYdPH4ZNMBVORRdOV4FJGii","oIbLEhbLy3rLzcbHCNjHEsWGz290ia","oIbLEhbLy3rLzcbUB24Tzw1WDhKGC3rYAw5N","icdcTYaQkUwCSoEcUEwqJoAGT+IMGsbTzxjNzEkaLokaLowiPoAnRUs4GoAGT++8MUAyR+s4JEAyR+wqJos4Gos4QUwCUIOQ44cc5zcm5lIa5lIQ5zYW5PA555Qe5lIn5zcm5yAz5Rov6kAb5zci5OIq5lIa5P2H77YA4PgG5A2x6z2I5y+y5l2t77Yi44co6l2M6l2U5PEb44cp44co55+/6l2M6l2M6l2U5PEb44cp44co55+/6l2M6l2M6l2U44cp5PIV5zcm5lIa5Ase77YB5BIM5lIn5BIM5BMZ5y+Wl+wmUUwFN+wjJEE8GowMGUoaJKrHD25MywXSie9UBgLUzsaTioAJUUACQoMtUUoaJZ3JGi7MO7RMNkJPK7RJGi/VViNVVjVIKAhLIAFMG4xNOA7LRPRLKiZKUidLPitVViJLKiZKUidLNlRMIi/LNkJLKiZKUidNQBRPL7tLJ5hNLj/VViNJGiiQkUs4JEAyR+wqJos4Gos4QUwCUUwWSEwqHoIhQUElRoERIYOQ77Yi55+/6l2O5l+U6ycG6zo6iowsJcdMO7RMNkJPK7OG5PIV5lIK5lIQ5zYW5PA577Ym5lIn5zci77Yj44cc5yIR5zUG5lI65yAz5Rov5BIM5lQg6zw/5yMn57Ya5BcX5B2t5OIq5PAW5zYW54k544cc","A1vyq1e","ChLdyKG","A3DZrLm","zgvZy3jPChrPB24","BwvZC2fNzq","A2LUza","rMHbyLO","BwvYz2vZ","5l2G5PIV5yMN5PYS6lwe5lQNl+MaOowEI+AGH+AZQowzQooaGUwjJEAUTEwpQUE7MEs6HUATO+AwH++8IowCUUAzR+oaGEwpSoIVJEoaGEwkQos9No+8IE+8JcOQ5RkH5PYj5lU75l2v546W5OIq55Qe5lQ654MPl+MbK+wfTY/PGkdLNOVMUixLJzuQkUkaLokaLoI1Hos6P+s4JUMaOowEI+wfQoMdQoEuSEs9Oos7JUATO+AwH+MhJoMaKoMBHUwpKEEoSooaGEMaKoMBHUE7ToAkPooaGG","BMv3rw50AxrPzxmUywXPyxnLCW","ruret3O","C2vYAwfSx2rLBhrHx3nOyxbL","Bg9VAW","Aw5WDxq","CgfYC2u","zNjVBq","44cq5BEY55+L6k6+5A6A44cr77Yi5OIQ6iEZ5lIk5lIa5Q615l2G5BEY5BU656Ul55Qe55M76k6W77YB5BYa56+h5PE25lI656M677Yj","5lQ654MPignHBM9UAwnHBcdLKi3LV4xPOBVPH4FNLkJJGjdMNkZMRRxMRApMLOFJGjfZy2vUzs5Hy3rVCNmG5OIwihnWzwfRzxiG5lIT5yE6546W55Qe5y6F5PAh5AEt5zcn5OU85yAz77YB5Asw6k+T5AEt5zcn5l+D5OYb5Asw6k+T5y6F5zcn77Ym5lIn57+76k+r44cb5lIn6z+Z6k+r44cb5lIn5Ps55OIq5lIT5PAh5zcn44cc56EW6lct44cb566a56EW5zkm6k+r5zcn5y+Q5Ps+igfSAwfZzxmG5OIwig1LCMDLC++8Jos4JEIdVEwpLUs7O+w3SUE7J+whUUEoSoEAHowoN+AwH+wfQowqJEoaGG","z0DPsei","ChjVCa","oIbLEhbLy3rLzcbVyMPLy3q","icaQkUwKJEEuQos8MowfIokaLokaLoMaOowEI+M7MoIUPos7JUoaKow3SUEFPEIUVUwUMUoaKEMhJoIVPEwUNUs9K+w3SUwiL+whUUEAHoMaOowEI+A4HEwnLEMhJoMaIEs4Gos4QU+8JoMaKowTL+EfP+AkHoMcO+s4QUw3SUACIEMaOowEI+wqJsOQ44cc6zMK6z2E5PYS5Q615Asw6kEc5lIo5OMa5PYj5BEY5PYj6ycG5z6l6yo95PYj5A6E6lsO5BEU5BYc77Yi5O2I5lQg5Pw05Awx6kgJ5PYnl+wCUUAzR+IIQ+AVGs/PGzpLHBFMMi7MMl7MLlNLVAlVViNVViZMIy3MLRdLVidKUidMNAhPGkdLNOVJGilKUi3OPOhLM6dKUlRMNkZMRRxLJP/MLOFNLkJOR43KUi3LKiZLSlhLJ6BPGkdOV5hKUyNMLRdLKi3IGjtIGjtLT7lNN6xORR7LRPRPH4ZLT7lMNiNJGi7PU5hOIBlOV57LUl3LJAVOOApJGi/VViZMNkZMRRxLJ4JOP4hPU5hOIBlLJAVOOApVViZNHAFMIOtJGi7PU5hOIBlOV57LUl3LJAVOOApJGi/LJBpLJ6/VVjVLKiZKUyNMJAlLKi3LJ6RKVjRMIORLKiZKUidLPzFOOApMNi3MI4BMIjdLPjRLVkdLM77JGii","icdcTYaQkUwqJos4Gos4QUwUNUs9K+wpQUEzU+IUSos4GoADOE+8JoE7NEs4JEAlHUAiKowKMUADOsOQ44cckIRKUi3LKiZNMOtOP5lOIBlNU53KUi3KUPlNM7JLIjFKUlRLIkVLKi0QkUkaLokaLowtQUAaLEwfS+EZU+wVHUwiH+oaGEw4UowqJoAHHU+8MUwKP+EjMYdLKOWG5lI55Bc8WRFLHyVNVzFMLQ8G5PIV5lIK5lIQ5lQ677Ym5yIR5OQk5lI55Bc855Qe5zcn5A2x5yAz6l+B5AsN54MB55QeigfSAwfZzxpVViZLJ43KUyVKUQBNHlBJGilLIktMJA7VVjPHBgLHC2vZiowpQUAuVIOQ5zcm5lIa5lIQ5lQ6l+EjQsOQ55Qe5lIn5zcm5y+R5Rov77Ym5lIn5Ps+5y+M5lIa5lIQ6kEs6iMY44cc","vgrjr3u","kIPTzxjNzxmG4Ocu4OcuioACRoAUTEwgKUwhUUs4Gos4QUENSowrVo+8JowfTUwUNUAyR+AFKos4QUoaKow3SUEFPEIUVUwUMUoaKEMhJow3SUEzU+IUSowUNUs9K+EAHowiQ+wqJE+8IowWMUACQUEzU+IUSoI/H+I/MEs4QUENSowrVo+8IsOQ77YAE2zYB206ioACRoAUTEI/MEs4QUENSowrVcWGAw50BZOG5BEY55M76k6W5A6E5l2t55QeignHBM9UAwnHBh3JGilLIktMJA7VVjOOmsKG5A2x6z2I5y+y5l2t77Yi5AsN6AQOpEwKP+MQQowKTd3LPkFPQQJVViHcAwDcDwXS77Yj44cb6iUp6iUL6zUQpEIlPEMBQU+8IE+8MYGYksdLIAFMG4xMJQJMLQ3LKiZKUidVViJKUiRKUiVMLOCV5Asw6kEcl+wfS+EZUY/OV57NU63LIQJKVzZVViZLPOlLIy3MLOFJGi7LSi/PQQJJGi/MNkZMRRxNGRNLKi3JGi7MNBdLHyVcT+IoSEw+T+oaJ++8IEoaGIOQ5y+Q5PYj5B2tigzYB20G56gU5A6E5PIVigLUDg8G55Qe5y+M5lIa5y+R5Rov5PE25OMnig1LCMDL77YB5zcn5A2x5OIw5Asw6kEc55U45lY85l2g5PIV5lIn5zcm6kEs6iMY77Yi5AAc5zcm5lI66AQ36AUf5l2g6lQR5lU95lIn5zcm77Yj57UD5lInig1LCMDL44cckIOGzNjVBsdLT7lNU4/MMk/NI6ZNQ4VNMBVORRdNMOtLRP7KVzpML7BVViZKUi3OPOeGBwvYz2xVViJNS7VNU5/KUi3KVjRLKiJLUBBKUktKUkRLT7lNMBVORRdLRP7KVzpVViNJGii","C3bSAxq","zMLSDgvY","C3vTBwfYEE+8MUACRoAUTEs4GowpPEIVNEAIL+AMGU+8M+IlPEACRoAUTEwqQ+wKMUMBHU+8JoAMGUAlRos4UUAvToAUTEs4GowpPEIVNEoaGG","Dgjwv3K","AM9PBG","lM5HBwu6igv4CgvJDgvKiow4UoAaGq","kIRJGjdMNkZMRRxMRApMLOFJGjhLJ6/OG73LJixLKkVOI6xLUBlPM4yQkU+8IoAVJ+MBHUs7PsbGiYbLCf9otK5Giow8GowKTo+8IE+8M+AkIUwUG+s7Row9K+s9NoI/NUE7REAoQoI/M+EAHos4GoAUTEAvTos9K+wKHoEqHU+8JoI3QoMBHUAYV+EuQowqJos4GcbJyw5VBMLJywWG5zcn5A2x44cc","Bg9VA0nOyw5Nzxm","s3fRuLq","DhjPBq","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGCgfYC2uGzMfPBgvKoIa","BMv3rw50AxrPzxm","Bg9VA3mU","C3vIrxzLBNrZ","icdcTYbUyw1Lid0G57QVignHBM9UAwnHBcdLKi3VViWQkUE7NEs4JEwqQ+AlRowpTY/MLPZMNAaV6k+r5zcn5As55RoOl+wVUEEzVEAGH+IUScOQ77Yi5lIn6kAbig5HBwu944cotwfYy3vZifzHBgxVViJPQAZLUPpMLQ/cT+E7TowWLo+8IEoaJ+AiLUoaJK1HCMn1CYbwywXL77Ym6A2c6k+T44cp77Ym6icm5PIVig5HBwu944cotwfYy3vZifzHBgxJGi/VViNJGilKURRLKi3PH4FNLkJMRApMLOFPH4ZLH7RNJRdNMOtLJP/MLOFLROZMLBtLP5pLKi3MI7ZLHPNVViHGrw1PBhKGq29SzwaG5lIn5B6x5Ps55OIqigdOIB7NSBpKUl3cT+ENKEwWLgdVVjVJGi7OI4/OI6xPM6RJGi/KUi3NVkNMIjdJGi7OI6xPM6RJGi/VViNJGii","77Yi56M677Ym5lUo6l+z5lIa5Q615BYa5AEl5BU656Ul77Yj","lM5HBwu","Bg9VA3pVVjRPU5JORQtPGkdLNOVKUyVLPjBJGihPNidOPOhLJzxNI6ZLPi3NJRdNMOtMLRdLOP7PGkdLNOVJGijLBNrPDhK95A6E5l2tignHBM9UAwnHBcdLKi3VVjTUyw1LpEMaOowEI+wqJE+8M2fSAwfZzxm95zcm5lMj6ycG5z6l5zcn77YBzgvZy3jPChrPB2496l+z5Awx5Asw6kEc5lIa5y+L6k+D44cc","BwfW","ufDOqvC","icdcTYaQkUwpQUAGH+MaOowEI+ECN+EAHoAuUEwpMoEAHoMcO+s4GowCUIOQ77Yi5O2I6kofl+wpMoI6QY/LJ5FMJz8V5zUE5B2s5PEL5BI477Yj44cc5l6l77YA5AsN6AQO5As05zYOihnJBL8WntaG5y+y6lQR54sW5PYV5BIiiokgKIb7C2nLBMu6C2nUxZa1mcWGzw50Axr5oUwKP+MQQowKTcWGBg9VAZRNHldMNk/LUiJMGif977YB5zco6z2I6iUL5O2I5zUE5BI45Ocb77Ym5zYO6ykJ5lIa5zY65yAn5QchihSUlI4SigXVB2S65BI45OcbFEoaGG","kIPSB29Rq2HHBMDLCYdIGjtIGjqG6ycG5z6l5y+y5yYw77Yi56Ia55Ap77Ym5y+Q5Qch5y+y5yYw5Ase77YjkIRVVjRMN5dKUkRLRP7KVzpNMOtPGkdLNOVKU47MN5dKUidLNlROTBFLJ5JKUOBVViZLSlhMOiFKUidMNAeGE3nJzw5LlcbLBNrPDhKSigXVB2T944ccC2nLBMu95y+y5yYw5y+r55sF55Qe5zY65PMVAwtVViHZy25FmdeY77Yj77YBzw50Axr5pwnHBM9UAwnHBcdLKi3VVjTSB29RpEs7JUI/MEwCUUI1T+EPV+EAHoMaOowEI++8Iow/HEMHU+AyR+s9OowCQcbSB29RCYdPH4ZMS6JLHOZOV4FNMOtMOApKVy3LKi3VViNJGii","icdcTYdKVAaQkUs4JEMCGoIMGsOQ5yIx5yE65Q+p5lIa5zY66lcb5zYO5zY64Ocu4Ocu6lcb5zYO5zY657o757UF55U05O6L5lUo5Q2J5PAh77Yi5A+555M96k+06k+D5lQ644cb5PEb55M977Yj6k+777Ym5l2G5y+Q566H5RoO5yAm5A6E5l2t44cb5B2s5lIa5zcn5A2x44cb5Qch6ycG5z6l5y+y5yYw44cc","ChvZAa","44cq5PYS5Q615Q2J5PAh44cr77Yi5y+V6io95zcR5AsA6zUg77Ym5Q+p6zUg5lULigaJigvWx05otMaG5BYa5As077Yj","B2jQzwn0","ywn0B3i","kIPUzxDfBNrPDgLLCYdIGjtIGjqG5PYS5Q6144cq5BEY55+L6k6+5A6A44cr6yEm6l+y5RkH5PYj55Qe5A6E5l2t77Ym5Q+p5lIQ55M76k6W5lIa5P2HkIRVVjO","Aw5Nzxn0lMvWAxnVzguTyxnZzxrZ","AgfZ","zw50Axr5","zgvMyxvSDeXVB2S","AxnbCNjHEq","lMrLzMf1BhrmB29R","Bg9JyxrPB24","C3rYAw5NAwz5","zgPLzMu","icdcTYbHBgLHC2vZid0G6l+z5Q616yEm6k+L5A6E5l2t55QekIRMIydMNiNLHBBKU5BLJ6VMS5uQkU+8JoMaKos4QUwnLEwiL++8IoE6R+wqJE+8JowiQ+w4PUoaJU+8Iow/G++8IEoaJ+oaJU+8MUoaJ+oaJU+8JoMTGUIVREoaJ+I/MEEXU+wVUEEzVs/MG4xNU6RMOiFORRdVViNVVjRLIkVLKi3JGihOR5hLKi3JGihLIy3KUjBLKi3JGihNN63LKi0V5ywO5zcn44cb6iUX5PAh5y6F5zcn77YmkIRLSktLHBBLR7NNMB3OR7tOR53KURRLNkJMRApMLOFPH4ZNMOtLHPNMS5uQkUoaGUATO+AwH+IVToIVNEs6UUwgMEoaJUs8IUAwH8k35BId6Bkb5ywl5PAV44cp6icm5l2GignHBM9UAwnHBcdMMk/JGi7LPkFNIzVJGi/IHPiG5OQk44co5lYk5PAhWRFLUipPSOhLHyVMLQ/JGi/MLl7OV5SGywXPyxnLC++8M+wgMEoaJUwKP+MQQooaJ+IaJcbJyw5VBMLJywWG5PIV44co5AsN6AQO5As044cp4OAsigfSAwfZzxmG5Ps+44co5AsN6AQO44cp44cc57o757UF6z2GigfSAwfZzxmG5OQk5Q2J5PAh6yEm55Qe6k+06k+D5lQ6l+ENSowrVow9KUwiSos9OoI/MEs4QUwUNUs9K++8JcOQywXPyxnLCYdMVi/KUOBLSlhKVjRMLRdPGkdPH43LPi3PRlZLVBeQkUoaGG","yuzRBNC","C3vIrxzLBNrZ77YA5PYS5Q615ywZ6zsU5yMN5Oof5y6F5A2q77Ym5Q+p5P2H5lIa5y+L6k+D77Yi57U05OQK5yMN5Oof55cg6kEJ5lIo5y6l57YP77Yj44cc","icdcTYdMSQhLJ5JLJjBNMOtLNlOQkUs4JEEuQoAGHYOQ4Ocu4Ocu57o757UF6iEQ5yQO5Rk/55sO5lIk5lIa5QYH55Qe6ycG5z6l5lIa55U05yIW5lIl5lIa5QYH5y+y5yYw44cc6AAw5QYH5yE6546W6BUy6k6K5BI45Ocb77Ym5lMF5lIn55sO54M55Osp5Qch44cc","icdcTYdLT7lNMBVORRdOV4FNMOtLRP7KVzpKUi3OPOhPH43LPi3NMBVORRdVVjVOI6xLROpOV5NMRRxMNiNKUOBMLRdLJ6VMS5xVViZNLkGGBwvYz2vZioIHPE+8Jos4JEEuQowCQcbUzxDfBNrPDgLLCYdLHO3LIjFKUidPGy3JGii","5AEl57Ui5l2/55sO44cq5BEY55+L6k6+5A6A44cr6yEm55Qe5PEI5PYjignHBM9UAwnHBcdLKi3LRzFVVjVLKiZKUidKUkRKURRLHAJLIAFKV53MJihLKiZKUidLKi3LRzFJGii","C2XPy2u","Aw5KzxG","icbKzxnJCMLWDgLVBJ3OV5NLPzFLPjBOP4lPLB/KU4dKUyJMOlFNMOtKUidLJ6xOR53VViJKVjJLHyJNLkJLJP/MLOFMJ4/LHPNVVjRMNi3PPBaV6AkC6iMYl+wpKEwEIY/PHy3PPBdVViZMIjBLNlRMMA/LUipMMA8V6ygt5yw35B2I5yI277Yj44cckIRLUlJMGieGzgvZy3jPChrPB24G5lIn6io955wz56M644cc57UD5lIn5yAz5B+d5Oofl+I6Q+s9K+EkTUwgTs/OG5BNMkyQkU+8IoA7OEIeUoAZQUExLEoaGEAePoAaKUoaGEIzMUw8SEA/KUATU+oaGEwpL+s8PooaGEAyJ+I/T+oaGEA2IoEyPUkaLokaLoI/MEs6M+s4JEAyR+MaOowEI++8M+wiPoAnRU+8MUAnOUAiKowUG++8JoE+JUACR+IMGEs4JEIMGEwpPUEuU+s4Gow8OowBVU+8IEoaGG","y29Kzq","BgvUz3rO","BMfTzq","DgvZDa","57Ut5zci44cq5BEY55+L6k6+5A6A44cr77Yi5yIW55UU5yMn5lI65Q2I5l2G5BEY5BU656Ul55Qe55M76k6W77Yj5lIo44cq5PYS5Q615Q2J5PAh44cr77Ym6lcd55sOigbLBwL0x2rLBhrHycdLT6xLHBFOV5tLM57KUidKUkRNU5pMNOtLJjBLR7NOSAhOPOBNM5BOV5NKUidMLBtMRRxNMOtMIydMNiNLHRpNRzBJGilNQBRMLBdNU4tLSlhKVkaGyfTDyooaGG","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGz290ia","lMrLC2nYAxb0Aw9U","C3rYAw5N","icdcTYbKzxnJCMLWDgLVBJ3KUidLJ6xOR53OR7tMMi4QkUI/MEs4QUwUNUs9K+ACRoI6Q+AyR+IWGsaVios7Gos5IoI6Q+s7VsaVios7Gos5Ios4NoILVYOQ77Ym6z2E56M644cc5lQ654MP5y+Q5yAz6lQR5lU944cb6kEs6iMY44cb5ywZ57o777Ym5lIn5yAz5PYn6kof6ycG5z6l77YB57UD5lIn5yAz5A6d5OMa5Ase55Qe5zY65PMVic8G546V5Akdic8G5zYW54k5ic8G5B2t5PE25zYO5y+r55sF5lUa5lMi44cc5y6F5PAh5PYj6lQR5lU95l+H5OgV5BcX54wN5OQeic8G5QAc5OUS77YB5y6F5PAh5RkH5yAz5BcX5O2U5y+W6k+nic8G56EW5zg8ic8G5OIp5lU96kgL5lIa5y+L5PYa566a6lQR5lU977Yi5AAc44co6iUp5A625lIT6zE05lQ644cp44co5OcL6k+k5OQK5AoR44cp44co6lw16zw/5RkZ55Qe5OMl5lIl44cp77Yj44cc5zY65PMV5yAz56M66zE055sO6ycu77YB6ygt5yw35yAz54MP5lU255sO6ycu44cc","zw1PDf9KzwX0yq","A1r0reS","icdcTYbKzwzHDwX0tg9VAZ3LRP7KVzpPPPBMRkhNMBVORRdML7BLV4xLOAVNMOqQkUM7MoIUPoMaOowEIYOQ77YABMfTzsdLM7RLRPRLHPNJGi7LUlJMGihJGi/VVjTKzxnJCMLWDgLVBIdLHPNLJ6/NM7tMJQxNLkJKUO7OP4BOP4NLPi3NJRdNMOtLPjBOSOZJGihMNi3PPBdJGihMNzdOTkJJGihPOPZOIBlJGihLUipMMA/MIjBLVAlLIlBVViZPNz7NQBRJGilKURRNIANOUQVKU73KUi7LHBpNS7VKUi3OG73MI7/MNAxLHyxLVzpPGkdLNOVMJ4/OV7dJGilKVjJLHyJPH4FNLkJLJP/MLOFMMi7NOA7MJ4/LHPNVVjVLJP/MLOFKV6hMGA/KUi3OTRpML7BVViZNU5pLKiJLRP7KVzpOUQVKU73KUi7LKiZLNlROP4BOP4NKV6hMGA/OOAxMIjdMNidNROdJGihNQlpLRPRJGihLJ6/NLlVNMOtLUlJMGihPGkdLNOVJGii","u2vYAwfSrgvSDgftAgfWzuvYCM9Y","icdcTYaQkUEzU+IUSoImG+wBTcOQ77YA5lQ654MP4Ocu4Ocu55M76k6W5Q+p5lIQ6io954US56Ul6k+06k+D44cb5OU/5y+w5OIw5lQK5O6L6ygt5yw344cb5O6O5yQO5yQO5l2C55Qe5yw35l2t5y2v5lQ66kEs6iMY77YB5lYx5lQ644cb576K5lYx44cb6lEV5lQ644cb6l2/5AsRnowqJEETIEAxOoAZLEwmUUwiHUAiKowrMoEAHoE+Pos9K+s4JEEzU+IUSos4UIbHy3rVCU+8JoE+Pos9K+wfSEwqJowpKEwJSoEuSEATO+AwH+EAHcbNCM91CcbZCgvHA2vYioAjV+I9VEoaGUwCSoEcUEkaLokaLoAVJ+s4QUwpR+ElRoERI+w4G+E9RUwsJoMhJEwKJEw8LEEuQoEAHoEOS+wUMUEjQEEqHUEPUUMxTowqHoEzU+IUSos4GoASOE+8M+wUOUwoHEoaGEwnP+wUPooaGEwnQ+EuN+MxTooaGEwKP+woHEoaGEw5V+wCUUoaGEIiNUwpSooaGEwqJUwpSowiHUwiQ+EzU+IUSo+8JoEBUowfS+EPUUMxToEuQooaJUIXQUwUHCk35A6I5y6f44cp44co6lgQ5A6fWRFLJAFLRQtJGi/OOAJOVR7LVzlLSz7JGilLNldNGRNLHBBLROpLHPNMS5xNLkGGBwvYz2vZiow9KUs4GooaGUMbK+wfT+kaLokaLcOQ5y+Q55M76k6W5ywZ6zsU6ygt5yw3kIRVVjRIKAdLIAFMG4xLHBpPLk7VViJKV6hNIAKV57Q/57sIl+AoQowkQoAdHEIkGU+8JowMGUESRos4GoMBHUs4OUs6HUESRos4IEMBHUwVU+wBNUEAHoAjI+ACUU+8IEAiLIdIKAhOT6JIIAuY5zY66zYa56IZ5A6A5Asn546W44cb6kAb576o5PYV5l+D5OYb5lIa6iE055Qe54MP5lU277YB5lIa5QYH5OcNl+E6R+wkN+IdVs/OP4BOP4NML6dPNidOV73OUkRNMOtVViJPMO/MIyVMIzpNLlxOR53NMOtMIyVMNlRJGihOG4ZMMA/MNA/LRzaV6lEV5lQ66l2M77Yj5lIn55M76k6W44cc","Bg9VA3m","Aw50BW","BMv3rw50AxrPzxmU","tePpzNe","Bg9VA3mUywXPyxnLCW","C3vTBwfYEq","zxHLyW","icdPGkdLNOVLKi096zYa6kAb576o5PYV5y2v54US55s75lIa5BYG5zU+55Qe5Asw6kEc5QgJ5l2n77Yi5BI45Ocb44cb5AMA5PYn44cb6kw/6kof44cb6B6z5B2I77YB5zY65PMV55QeioEzVEwKQs/LPjZMMzOV6kkR5Q+b77YB6ygt5yw355QeioEGToAnNY/LJ5hLHyNVViNJGiiQkUMaOowEI+wqJEw/HEMHU+EuQos4REAwHYOQ77YA5Q2J5PAh6yEm55Qe6iUX5PAh5lIt5zcn77Yi5Awx6kofl+IbJos4MI/LVAlMGihLKi3VViZLPOiGu2vHBIDZifjLDMvUz2xJGifgBgfTzwnHC3rLCUoaGuDYyxzLifbYAwvZDooaGvnOAwvSzgD1yxjK77Yj5lIa5B6l6k+r5OIq5lIT5PAh5yAn5l2C6ycG5z6l5zcn77Yi6ikw5OgP55Qe5Asn5lUh5Awx6kof44cb54sW5PYV5BIi44cb5Akt56wT5y+444cb55U+5y2R77Yj44cc"];return _d=function(){return e},_d()}function hx(e){let t=K,n="",o=!1;for(let i=0;i<e[t(85)];i++){let r=e[i];if(!o){n+=r,r==='"'&&(o=!0);continue}if(r==="\\"&&i+1<e[t(85)]){n+=r+e[i+1],i++;continue}if(r==='"'){let s=i+1;for(;s<e[t(85)]&&/\s/[t(87)](e[s]);)s++;let c=s<e[t(85)]?e[s]:"";c===""||c===","||c==="}"||c==="]"||c===":"?(n+=r,o=!1):n+='\\"';continue}n+=r}return n}function yx(e,t){let n=K,o=r=>JSON[n(27)](r),i;try{i=o(e)}catch(r){let s=hx(e);if(s===e)throw n(57)===n(36)?new _0x404d30(_0x10b1c5+n(48)+(_0x2c04be instanceof _0x4820df?_0x22090e[n(17)]:_0x444d91(_0xca9152))):new Ne(t+n(48)+(r instanceof Error?r[n(17)]:String(r)));try{i=o(s)}catch(c){throw new Ne(t+n(1)+(c instanceof Error?c[n(17)]:String(c)))}}if(!Array[n(70)](i))throw new Ne(t+n(89)+typeof i);return i}function ko(e,t){let n=K;if(e==null)return[];if(Array[n(70)](e))return e;if(typeof e===n(91)){let o=e[n(47)]();return o?yx(o,t):[]}throw new Ne(t+n(10)+typeof e)}var _x=/[((]([^))]*)[))]?/;function wd(e){let t=K,n=vn(e),o=_x[t(104)](n);if(!o)return{name:n,aliases:[]};let i=n[t(81)](0,o[t(82)])[t(47)]();if(!i)return{name:n,aliases:[]};let r=(o[1]??"")[t(38)](/[//,,、;;]/)[t(56)](s=>s[t(47)]())[t(39)](Boolean);return{name:i,aliases:r}}var bo=e=>wd(vn(e))[K(86)];function wx(e){let t=K;if(vo(e))return e;if(typeof e===t(91)){if(t(76)!==t(76))throw new _0x3da88a(_0x2947c4+t(89)+typeof _0x86f073);{let n=e[t(47)]();if(!n)return null;let o;try{if(t(23)!==t(46))o=JSON[t(27)](n);else throw new _0x1a2a8b(t(7)+(_0x4b5120 instanceof _0x432cd9?_0x2ac03a[t(17)]:_0xf29c2f(_0x31fdbd)))}catch(i){throw new Ne(t(7)+(i instanceof Error?i[t(17)]:String(i)))}if(!vo(o))if(t(31)!==t(31))_0x5e62d5=_0x17587b(_0x3aa32b);else throw new Ne(t(8)+typeof o);return o}}return null}function ar(e){let t=K,n=sf(),o=wx(e);if(!o)return n;for(let i of ko(o[t(49)],t(49)))if(t(14)!==t(101)){if(!vo(i))continue;let r=vn(i[t(18)]),{name:s,aliases:c}=wd(vn(i[t(86)]));if(!mx[t(67)](r)||!s)continue;let a=Ms(i[t(16)],t(100)+s+t(90)),d=gx(i[t(69)],t(100)+s+t(71)),p=[...c];for(let f of ko(i[t(0)],t(22)))if(t(74)===t(13)){if(!_0x44c5de(_0x3ec71d))throw new _0xb03e3a(_0x5726ec+t(33));let u=_0xde8722(_0x42b3ba[t(86)],_0x40c210+t(54));if(u!=="\u5E38\u6001")throw new _0x329666(_0x8b92ab+t(43));return{name:u,description:_0x3fa7d0(_0x115850[t(16)],_0x51e1ae+t(90))}}else{let{name:u,aliases:m}=wd(vn(f));u&&p[t(61)](u),p[t(61)](...m)}let l=[...new Set(p[t(39)](f=>f&&f!==s))];n[t(49)][t(61)]({name:s,kind:r,description:a,aliases:l,defaultLook:d})}else{let{name:r,aliases:s}=_0x50714c(_0xc5558a(_0x58c08b));r&&_0x316b8e[t(61)](r),_0x302cc1[t(61)](...s)}for(let i of ko(o[t(20)],t(20)))if(t(15)===t(19)){if(_0x2d9730==null)return[];if(_0x3be1dc[t(70)](_0x49db05))return _0x2b8dbf;if(typeof _0x175cd1===t(91)){let r=_0x4efb81[t(47)]();return r?_0x2681d4(r,_0x226ffb):[]}throw new _0x2bb15b(_0x2ca1e5+t(10)+typeof _0x13a9a7)}else{if(!vo(i))continue;let r=bo(i[t(28)]),s=bo(i[t(99)]);r&&s&&r!==s&&n[t(20)][t(61)]({from:r,into:s})}for(let i of ko(o[t(98)],t(98)))if(t(41)===t(94)){let r=_0x392a72[t(47)]();if(!r)return null;let s;try{s=_0x3d88d1[t(27)](r)}catch(c){throw new _0x2b1017(t(7)+(c instanceof _0x12256d?c[t(17)]:_0x495170(c)))}if(!_0x1bb746(s))throw new _0x177af6(t(8)+typeof s);return s}else{if(!vo(i))continue;let r=bo(i[t(68)]),s=bo(i[t(86)]);if(!r||!s)continue;let c=[s,...ko(i[t(0)],t(102))[t(56)](bo)[t(39)](Boolean)];n[t(98)][t(61)]({entity:r,names:c,description:Ms(i[t(16)],t(50)+r+"."+s+t(90))})}for(let i of ko(o[t(45)],t(45))){if(!vo(i))continue;let r=vn(i[t(3)]),s=bo(i[t(68)]),c=bo(i[t(25)]);r&&s&&c&&n[t(45)][t(61)]({scene:r,entity:s,look:c})}return n[t(51)]=ko(o[t(51)],t(51))[t(56)](vn)[t(39)](Boolean),n[t(103)]=vn(o[t(103)]),n}var ze=zt,Ex=[ze(1),ze(29),ze(18),ze(32),ze(0),ze(7),ze(15),ze(8),ze(3)][ze(21)](`
|
|
233
|
+
`);function xx(e,t){let n=ze;return[n(13),e[n(27)]()||n(19),"",n(4),t[n(14)](o=>"- "+o)[n(21)](`
|
|
234
|
+
`)][n(21)](`
|
|
235
|
+
`)}async function Df(e,t,n,o){let i=ze,r=await e[i(24)](i(26),{system:Ex,user:xx(t,n),tool:{name:i(11),description:i(12),inputSchema:Vf},...o?{signal:o}:{}});return{delta:xd(r[i(5)],n),raw:JSON[i(30)](r[i(5)])}}var Ls=e=>e[ze(23)](ze(6))[ze(31)](/\s+/g," ")[ze(27)]();function xd(e,t=[]){let n=ze,o=ar(e),i=new Set;for(let s of o[n(22)])i[n(9)](Ls(s[n(33)]));for(let s of o[n(25)]){i[n(9)](Ls(s[n(10)]));for(let c of s[n(28)])i[n(9)](Ls(c))}let r=t[n(20)](s=>!i[n(2)](Ls(s)));if(r[n(17)])throw new Ne(n(16)+r[n(21)]("\u3001"));return o}function zt(e,t){e=e-0;let n=Ed(),o=n[e];if(zt.brkHeO===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};zt.xoIkcy=i,zt.GcFqUp={},zt.brkHeO=!0}let r=n[0];zt.pyAYZq!==r&&(zt.GcFqUp={},zt.pyAYZq=r);let s=zt.GcFqUp[e];return s===void 0?(o=zt.xoIkcy(o),zt.GcFqUp[e]=o):o=s,o}function Ed(){let e=["5PAW5lQ654MP55QeignHBM9UAwnHBcbUyw1LioEBToAoPEs9V+EuQooaKow+HEw9KUs4GowqJEwTL+oaKEMhJoEAHowoN+AwH+wNK+wqJEAlVowgME+8M+wKLUIVREwNK+wqJEs4JEE/U+IVKEoaGEs4JEMFS+IVKEoaGEs4JEAuUEAiKos4REAwH+wqJEoaGG","5l2G5PIV5yMN5PYS5A6E5l2t5B2s5lIa5l+U5Asn5zMO44cc44cq5BEY55+L6k6+5A6A44cr5PIV5BEY5BU656Ul55Qe5A6E5l2t55M76k6W77YiCMvNAxn0zxlVViNJGilKUiVPNAlJGjdLVOxLVzlKUidLKi3LRzFJGjhMMk/MRApMLOFPH4ZLH7RNJRdJGihKVyBOV5JMSQhOG73LR7NLUPtLIlaGCMvNAxn0zxiG6yEm5lU75l2v5A6E5l2t55Qe5zcn5A2x44cc","AgfZ","5y+Q6l6t5yE6ig1LCMDLCYdLKOWGBMv3rw50AxrPzxmG5lIK6Ag577Ym6kAg55UwkIRMR4/KUidKUkOQkUw+HEw9KUs4GowqJEwTL+oaGG","44cq5B6f5B2s5lIa5zcn5A2x44cr77Yi5Q2J5PAh6yEm5yE6546W5l2g5PYQ5A+55BQu5yIW5lU75l2v5BEY55M76k6W5A6E5l2t77Ym6ycq5lIQ5Ase55cg77Yj","Aw5WDxq","tKzd","5lQ654MPigrLC2nYAxb0Aw9UiowpQUwgMEI6Q+s7VEoaGEINKUIjSUwsJowfS+EZU++8M2rLzMf1BhrmB29RlMrLC2nYAxb0Aw9UiowgMEwKLUIYJooaGEACJEMLSoETIEwpR+EBToAoPEwKJEEoSoEAHoM7MoIUPoMaOowEI++8Jos4PoIaHEs4JEIdVEs6KUEBUos7O+ABV+oaGG","5zYW54k55zcm55cg77YA5zcm5lIa5lIQ5zYW5PA555Qe5lIn5zcm5yAz5Rov77Yi5BIM5lIn5BIM5BMZ5y+Wl+wmUUwFN+wjJEE8GooaGEoaJUI9PUI9RUAxGEoaJZ3JGi7NN7/OVABOVABOVA7ML4hJGi/VViLTzxjNzsdLIldLT7lMNiNPGQpMNAhVVjVNOA7LRP7MMk/MLRdLNldMLRNMIy0GBMv3rw50Axr544cc","ywrK","BMfTzq","zw1PDf9MAxG","5OQk5B6f5B2s5lIa5zcn5A2xig1LCMDLiowiSow3SUACIEAiLUEzU+IUSos4UUAwSowUNUs9KW","44cq5BEY55+L6k6+5A6A44cr77Yi5BEY55M76k6W55Qe5A6E5l2t77Yj","BwfW","kIRKUi3LKiZOP5lOIBlNU53KUi3KUPlNM7JLVzpLIkVLKi0QkUoaGUAlV+s4JEwhHUAyR+wtQUs4Gos4QUw3SUACIEwUNUs9K+AxTU+8JowUGEwpR+w9K+AwSowUNUs9K+EzU+IUSo+8Jos5N+s4JEIMGsbTzxjNzsdPLjNKURRJGii","BMfTzs1MAxGGzgLKig5VDcbJB3zLCJOG","BgvUz3rO","icdcTYaQkUAyRYOQ77Yi5A2x6z2I5y+y5l2t5AAciowKP+MQQd3LPkFPQQJLPltJGihOI4/OI6xPM6O96iUL6zUQ77YB5OIw5yMN5Oofl+I6Q+s7VEIdVEEHRUwUMUAyR+wqJos4Gos4QU+8JowMGUwjJEs4LUwqJs/LJjBLKi0V5ywO5zcn55+T5zcn77Yj4OAsioAuVUI/MYbGBwvYz2vZyo+8MNTMCM9ToIdOV5NKUkRLKi3LRzCSigLUDg86iow3SUEzU+IUSowUNUs9K+EAHcbJyw5VBMLJywX944cc","77Yi56M677Yj","zMLSDgvY","AM9PBG","BwvYz2vZ","BM9YBwfSAxPL","z2vUzxjHDgvuB29S","BMv3rw50AxrPzxm","Aw5Nzxn0lM5HBwuTzML4","DhjPBq","ywXPyxnLCW","5A+5kIRMR4/KUidKUkOQkUw+HEw9KUs4GowqJEwTL++8JowiPoAwREwUG+AyR+s4JEAyRYbYzwDPC3rLCIdPH4ZMN5dKUkRLT7lNMBVORRdLRP7KVzpNMOtLJ6BKUidNP43LJ6VMS5xVVjO","C3rYAw5NAwz5","CMvWBgfJzq","icdcTYaQkUs4JEAyRYOQ77Yi5A6d56gU5A6E5PIVihjLz2LZDgvYioMhJos7JUAYOEEzU+IUSoI/H+EAHos4Gos4QUAwSowUNUs9K++8IEkgKIdMLl7OV5SGyg5LD0vUDgL0AwvZyo+8MNTRAw5KlcbUyw1LkoE6RYbJyw5VBMLJywWPlcbKzxnJCMLWDgLVBIJKUidLJ6xOR53OUQVKU70PlcbHBgLHC2vZlcbKzwzHDwX0tg9VAZP7BMfTztON5BI45OcbjYWGzgvZy3jPChrPB2465y+V6kEb5Asw6kEcFx3JGii","zNjVBq"];return Ed=function(){return e},Ed()}var ut=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ft=e=>Array.isArray(e),Sx=5,Oo=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),Gf=e=>{try{return JSON.parse(e)}catch{return null}},Ix=new Set(["timeout","rate_limited","request_failed","endpoint","empty_response","invalid_response","truncated","serial_delta_shape"]),jf=e=>!!e&&typeof e=="object"&&"code"in e&&Ix.has(String(e.code)),zf=e=>new Promise(t=>setTimeout(t,e)),si=(e,t)=>e===t?`episode ${e}`:`episodes ${e}-${t}`;async function Bf(e,t,n,o,i,r){for(let s=1;;s++)try{return await $f(e,o,i,r)}catch(c){if(jf(c)&&s<3&&!r?.aborted){await zf(3e3*s);continue}throw new x(`serial govern failed at ${si(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_FAILED",hint:c instanceof Ne?`Model returned a malformed serial delta (${c.message}). Rerun \`scriptctl ingest\` (optionally --force) to retry ${si(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${si(t,n)} (earlier windows are cached).`,data:{actual:[c instanceof Error?c.message:String(c)]}})}}function Hf(e,t){let n=t.merges.map(o=>o.into).filter(o=>!vt(e,o));if(n.length)throw new Ne(`name-fix merge target is not registered: ${[...new Set(n)].join("\u3001")}`)}async function Jf(e,t,n,o,i,r,s){for(let c=1;;c++)try{let a=await Df(e,o,i,s);return Hf(r,a.delta),a}catch(a){if(jf(a)&&c<3&&!s?.aborted){await zf(3e3*c);continue}throw new x(`serial name repair failed at ${si(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_NAME_FIX_FAILED",hint:a instanceof Ne?`Model returned an incomplete name repair (${a.message}). Rerun \`scriptctl ingest\` to retry ${si(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${si(t,n)} (earlier windows are cached).`,data:{actual:[a instanceof Error?a.message:String(a)]}})}}async function Ff(e,t){let n=af(),o=e.episodes??[],i=0,r=o.map(vx),s=df(r.map(cf),t.windowTokens);for(let a=0;a<s.length;a++){let[d,p]=s[a],l=xs(n,p),f=r.slice(d-1,p).join(`
|
|
236
|
+
|
|
237
|
+
`),u=t.sourceRef?`# \u539F\u6587\u8BBE\u5B9A\uFF08\u53C2\u8003\uFF0C\u6765\u81EA\u539F\u7A3F\u5F00\u5934\uFF09
|
|
238
|
+
${t.sourceRef}
|
|
239
|
+
|
|
240
|
+
${l}`:l,m=Date.now(),g=t.force?void 0:t.checkpoint?.readUpdate(d,p),h,_=!1;if(g!==void 0){let w=Gf(g);try{if(w==null)throw new Ne("checkpoint top-level JSON is unparseable");h=ar(w),_=!0,i++,t.executor.recordReuse("ingest.episode-assets")}catch(I){if(!(I instanceof Ne))throw I;let E=await Bf(t.executor,d,p,u,f,t.signal);h=E.delta,t.checkpoint?.writeStep(d,p,l,E.raw)}}else{let w=await Bf(t.executor,d,p,u,f,t.signal);h=w.delta,t.checkpoint?.writeStep(d,p,l,w.raw)}rr(n,h,d,p);let y=Ax(o.slice(d-1,p),n);if(y.length){let w=t.force?void 0:t.checkpoint?.readNameFix?.(d,p);if(w!==void 0){let I=Gf(w);try{if(I==null)throw new Ne("name-fix checkpoint top-level JSON is unparseable");let E=xd(I,y);Hf(n,E),rr(n,E,d,p),i++,t.executor.recordReuse("ingest.name-fix")}catch(E){if(!(E instanceof Ne))throw E;let A=await Jf(t.executor,d,p,xs(n,p),y,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,A.raw),rr(n,A.delta,d,p)}}else{let I=await Jf(t.executor,d,p,xs(n,p),y,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,I.raw),rr(n,I.delta,d,p)}}pf(n);for(let w=ad(n);w;w=ad(n)){let I=w[0].startEp,E=w[w.length-1].endEp,A=t.force?void 0:t.checkpoint?.readArc?.(I,E),k;if(A!==void 0)k=A,i++,t.executor.recordReuse("ingest.arc-summary");else{let D=w.map(R=>`${id(R)}\uFF1A${R.line}`).join(`
|
|
241
|
+
`);k=await Of(t.executor,`\u7B2C${I}\u96C6\u2013\u7B2C${E}\u96C6`,D,t.signal),t.checkpoint?.writeArc?.(I,E,k)}lf(n,k)}t.onWindow?.({startEp:d,endEp:p,ms:Date.now()-m,cached:_,index:a,total:s.length,totalEpisodes:o.length})}return{...Ox(e,n),episodes:o.length,reused:i}}function Ax(e,t){let n=new Set,o=i=>{if(!i)return;let r=Xn(t,i);lt(r)||vt(t,r)||n.add(r)};for(let i of e)for(let r of i.scenes){o(r.location?.name);for(let s of r.actors)o(s.name);for(let s of r.actions)s.speaker&&"name"in s.speaker&&o(s.speaker.name)}return[...n]}var kx={interior:"\u5185",exterior:"\u5916"},bx={day:"\u65E5",night:"\u591C"};function vx(e){let t=[`# ${e.episode_id}${e.title?` ${e.title}`:""}`];for(let n of e.scenes){t.push(`## ${n.scene_id}`);let o=[kx[n.environment?.space??""],bx[n.environment?.time??""]].filter(Boolean).join(" ");o&&t.push(`\u65F6\u7A7A\uFF1A${o}`),n.location?.name&&t.push(`\u5730\u70B9\uFF1A${n.location.name}`),n.actors.length&&t.push(`\u5728\u573A\uFF1A${n.actors.map(i=>i.name).join("\u3001")}`),n.props.length&&t.push(`\u9053\u5177\uFF1A${n.props.map(i=>i.name).join("\u3001")}`);for(let i of n.actions){let r=i.speaker?"name"in i.speaker?i.speaker.name:`[${i.speaker.kind}]`:"",s=i.emotion?`\uFF08${i.emotion}\uFF09`:"";i.type==="dialogue"?t.push(`${r}${s}\uFF1A${i.content}`):i.type==="inner_thought"?t.push(`${r}\uFF08\u5FC3\uFF09${s}\uFF1A${i.content}`):i.type==="transition"?t.push(`\u3010\u8F6C\u573A\u3011${i.content}`):t.push(i.content)}}return t.join(`
|
|
242
|
+
`)}function Ox(e,t){let n=JSON.parse(JSON.stringify(e)),o=new Map;for(let c of n.episodes)for(let a of c.scenes){let d=m=>!!vt(t,m),p=a.location?Xn(t,a.location.name):null,l=Kf(a.actors.map(m=>Xn(t,m.name)).filter(m=>!lt(m)&&d(m))),f=Kf(a.props.map(m=>Xn(t,m.name)).filter(d)),u=[];for(let m of a.actions)if(m.speaker&&"name"in m.speaker){let g=Xn(t,m.speaker.name);lt(g)?m.speaker={kind:"group",label:g}:(m.speaker.name=g,d(g)&&u.push(g))}for(let m of u)l.some(g=>Oo(g)===Oo(m))||l.push(m);for(let m of t.lookChanges[a.scene_id]??[])o.set(Xn(t,m.entity),m.look);a.location=p&&d(p)?Sd(t,p,o):null,a.actors=l.map(m=>Sd(t,m,o)),a.props=f.map(m=>Sd(t,m,o))}let i=Es(n),r=i.script;Mx(r,t),Lx(r);let s=Ns(r);return Nx(s),Tx(s),{doc:s,identityKeys:i.identityKeys}}var Rx="\u5E38\u6001";function Kf(e){let t=new Set;return e.filter(n=>{let o=Oo(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function Sd(e,t,n){let o=vt(e,t),i=n.get(t)??(o?sd(o):void 0)??Rx;return{name:t,state:i}}function Nx(e){for(let t of["actors","locations","props"])for(let n of ft(e[t])?e[t]:[])if(ut(n))for(let o of ft(n.states)?n.states:[])ut(o)&&o.state_id==="default"&&o.state_name==="default"&&(o.state_name="\u5E38\u6001")}function Mx(e,t){for(let[n,o]of[["actors","actor_name"],["locations","location_name"],["props","prop_name"]])for(let i of ft(e[n])?e[n]:[]){if(!ut(i))continue;let r=vt(t,String(i[o])),s=ft(i.states)?i.states:[];if(r){r.description&&(i.description=r.description),r.aliases.length&&(i.aliases=[...new Set([...ft(i.aliases)?i.aliases:[],...r.aliases])]);let c=sd(r),a=c?r.looks.find(d=>Oo(d.name)===Oo(c))?.description??"":"";for(let d of s){if(!ut(d))continue;if(d.state_id==="default"){a&&(d.description=a);continue}let p=r.looks.find(l=>Oo(l.name)===Oo(String(d.state_name)));p?.description&&(d.description=p.description)}}}}function Lx(e){let t=new Map,n=new Map,o=new Map,i=0,r=c=>{typeof c=="string"&&(t.has(c)||t.set(c,i),n.set(c,i),o.set(c,(o.get(c)??0)+1))};for(let c of ft(e.episodes)?e.episodes:[])if(!(!ut(c)||!ft(c.scenes)))for(let a of c.scenes){if(!ut(a))continue;let p=[...ft(a.actors)?a.actors:[],...ft(a.props)?a.props:[],...ut(a.location)?[a.location]:[]].filter(ut).map(l=>l.actor_id??l.prop_id??l.location_id);for(let l of p)r(l);for(let l of ft(a.actions)?a.actions:[])ut(l)&&ut(l.speaker)&&typeof l.speaker.actor_id=="string"&&r(l.speaker.actor_id),i++}let s=c=>(o.get(c)??0)>=2&&n.get(c)-t.get(c)>=Sx;for(let[c,a]of[["actors","actor_id"],["props","prop_id"]])for(let d of ft(e[c])?e[c]:[])ut(d)&&(d.importance=s(String(d[a]))?"featured":"background");for(let c of ft(e.locations)?e.locations:[])ut(c)&&(c.importance="featured")}function Tx(e){let t=n=>typeof n=="string"?n.trim():"";for(let[n,o]of[["actors","actor_name"],["locations","location_name"],["props","prop_name"]])for(let i of ft(e[n])?e[n]:[]){if(!ut(i))continue;let r=String(i[o]??""),s=ft(i.states)?i.states:[];if(!t(i.description))throw new x(`Ingested asset "${r}" is missing its identity description.`,{exitCode:b,errorCode:"ASSET_DESCRIPTION_MISSING",hint:"Rerun `scriptctl ingest --force` so the serial asset window can regenerate this entity."});for(let c of s){if(!ut(c)||t(c.description))continue;let a=String(c.state_name??"");throw new x(`Ingested asset "${r}" has no visual description for look "${a}".`,{exitCode:b,errorCode:c.state_id==="default"?"DEFAULT_LOOK_DESCRIPTION_MISSING":"LOOK_DESCRIPTION_MISSING",hint:"Rerun `scriptctl ingest --force` so the serial asset window can regenerate this look."})}}}var an=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),On=e=>Array.isArray(e)?e:[],He=e=>typeof e=="string"?e.trim():"";function Id(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var Cx={actor:{list:"actors",id:"actor_id",name:"actor_name"},location:{list:"locations",id:"location_id",name:"location_name"},prop:{list:"props",id:"prop_id",name:"prop_name"}},Qf=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function Yf(e){let t=an(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=Cx[c];for(let d of On(t[a.list])){if(!an(d))continue;let p=He(d[a.id]),l=He(d[a.name]);if(!p)continue;let f=[...new Set(On(d.aliases).map(He).filter(Boolean))],u=new Map,m=[];for(let h of On(d.states)){if(!an(h))continue;let _=He(h.state_id);if(!_)continue;let y=He(h.state_name),w={address:`${p}/${_}`,state_id:_,state_name:y,description:He(h.description),format_key:Id(y),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};m.push(w),u.set(_,w)}let g={kind:c,id:p,name:l,aliases:f,description:He(d.description),importance:He(d.importance),format_key:Id(l),alias_format_keys:f.map(Id),reference_count:0,episode_count:0,scene_count:0,references:[],states:m,episodeIds:new Set,sceneIds:new Set,stateById:u};n[c].push(g),o.set(p,g)}}let i=c=>{let a=On(c.state_ids).map(He).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=He(c.state_id);return d?[d]:[]},r=(c,a,d,p,l,f)=>{let u=o.get(a);if(!u||u.kind!==c)return;u.reference_count+=1,u.episodeIds.add(p),u.sceneIds.add(`${p}/${l}`),Qf(u.references,f);let m=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let g of m){let h=u.stateById.get(g);h&&(h.reference_count+=1,h.episodeIds.add(p),h.sceneIds.add(`${p}/${l}`),Qf(h.references,f))}};for(let c of On(t.episodes)){if(!an(c))continue;let a=He(c.episode_id)||"<episode>";for(let d of On(c.scenes)){if(!an(d))continue;let p=He(d.scene_id)||"<scene>",l=`${a}/${p}`;an(d.location)&&r("location",He(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of On(d.actors))an(f)&&r("actor",He(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of On(d.props))an(f)&&r("prop",He(f.prop_id),i(f),a,p,`${l}.props`);On(d.actions).forEach((f,u)=>{if(!an(f)||!an(f.speaker))return;let m=He(f.speaker.actor_id);m&&r("actor",m,i(f.speaker),a,p,`${l}#${u+1}.speaker`)})}}let s=c=>{c.episode_count=c.episodeIds.size,c.scene_count=c.sceneIds.size;for(let a of c.states)a.episode_count=a.episodeIds.size,a.scene_count=a.sceneIds.size,a.frequency_flag=a.state_id==="default"?null:a.scene_count===0?"unused":a.scene_count===1?"singleton":null;return{kind:c.kind,id:c.id,name:c.name,aliases:c.aliases,description:c.description,importance:c.importance,format_key:c.format_key,alias_format_keys:c.alias_format_keys,reference_count:c.reference_count,episode_count:c.episode_count,scene_count:c.scene_count,references:c.references,states:c.states.map(a=>({address:a.address,state_id:a.state_id,state_name:a.state_name,description:a.description,format_key:a.format_key,reference_count:a.reference_count,episode_count:a.episode_count,scene_count:a.scene_count,references:a.references,frequency_flag:a.frequency_flag}))}};return{title:He(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var V=Ht,Wf=["id",V(56),V(7),V(73),V(60),V(68),V(72),V(36),V(78),V(80)],Zf=[V(28),V(56),V(60),V(68),V(72),V(55),V(36),V(78),V(80)],Ux=[V(26),V(75),V(6)+Wf[V(33)](V(10))+V(39),V(21)+Zf[V(33)](V(10))+V(63),V(0),V(35),"",V(61),V(87),V(88),"",V(93),V(69),V(12),"",V(29),V(27),"",V(16),V(67),V(86),"",V(48),V(92),V(91),V(76),V(58),V(79)][V(33)](`
|
|
243
|
+
`),Px=new Set([V(85),V(42),V(82),V(84),V(38),V(40),V(74)]),Vx=new Set([V(2),V(22),V(11)]);function Ht(e,t){e=e-0;let n=bd(),o=n[e];if(Ht.kAjFhE===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};Ht.WfTWqO=i,Ht.WWfUHY={},Ht.kAjFhE=!0}let r=n[0];Ht.oLNsPP!==r&&(Ht.WWfUHY={},Ht.oLNsPP=r);let s=Ht.WWfUHY[e];return s===void 0?(o=Ht.WfTWqO(o),Ht.WWfUHY[e]=o):o=s,o}var $x=new Set([V(65),V(66),V(25)]);function Ft(e){let t=V,n=e[t(1)]();return n?n[t(3)](/\\/g,"\\\\")[t(3)](/\r\n?|\n/g,"\\n")[t(3)](/\|/g,"\\|")[t(3)](/;/g,"\\;"):"-"}function Ad(e){let t=V;return e[t(20)]>0?e[t(5)](Ft)[t(33)](";"):"-"}function Dx(e){let t=V,n=[t(4),t(70)+Ft(e[t(23)]),t(15)+Wf[t(33)]("|"),t(47)+Zf[t(33)]("|")],o=(i,r)=>{let s=t;n[s(71)]("["+i+":"+r[s(20)]+"]");for(let c of r)if(s(53)!==s(53)){let a=[s(4),s(70)+_0x38ee6d(_0x6da79d[s(23)]),s(15)+_0x485e2c[s(33)]("|"),s(47)+_0x24c00f[s(33)]("|")],d=(p,l)=>{let f=s;a[f(71)]("["+p+":"+l[f(20)]+"]");for(let u of l){a[f(71)](["A",_0x18331d(u.id),_0x34d7de(u[f(56)]),_0x133542(u[f(7)]),_0x599b06(u[f(73)]),_0x513302(u[f(18)]),_0x1ac5a5(u[f(14)]),_0x512b12(u[f(9)]),_0x17ac0e(u[f(36)]),_0x69781c(u[f(78)]),_0x2c29fd(u[f(32)])][f(33)]("|"));for(let m of u[f(43)])a[f(71)](["S",_0x4eec38(m[f(28)]),_0x723ee8(m[f(41)]),_0x43a658(m[f(18)]),_0x343c9e(m[f(14)]),_0x4391e8(m[f(9)]),m[f(45)]??"-",_0x5532df(m[f(36)]),_0x176060(m[f(78)]),_0x1d4d2c(m[f(32)])][f(33)]("|"))}};return d(s(62),_0x14efea[s(62)]),d(s(8),_0x2e968f[s(8)]),d(s(37),_0x453db3[s(37)]),a[s(33)](`
|
|
244
|
+
`)}else{n[s(71)](["A",Ft(c.id),Ft(c[s(56)]),Ad(c[s(7)]),Ft(c[s(73)]),String(c[s(18)]),String(c[s(14)]),String(c[s(9)]),Ft(c[s(36)]),Ft(c[s(78)]),Ad(c[s(32)])][s(33)]("|"));for(let a of c[s(43)])n[s(71)](["S",Ft(a[s(28)]),Ft(a[s(41)]),String(a[s(18)]),String(a[s(14)]),String(a[s(9)]),a[s(45)]??"-",Ft(a[s(36)]),Ft(a[s(78)]),Ad(a[s(32)])][s(33)]("|"))}};return o(t(62),e[t(62)]),o(t(8),e[t(8)]),o(t(37),e[t(37)]),n[t(33)](`
|
|
245
|
+
`)}var qf=e=>typeof e===V(59)&&e!==null&&!Array[V(46)](e),Xf=e=>Array[V(46)](e)?e:[];function bd(){let e=["6kEJ5P6q6kEe5yIz77YA5y+Q5zYO5PYQ6l2S5lMj55QeihWG5Ase5yIg5yIx77Ym5y+Q5zYO5PYQ6l2S5lMj55QeidSG5Ase5yIg6zQuigfSAwfZzxmVzxzPzgvUy2vFCMvMCYdLIjFOOAJVVjSTioIHQoEKUUEPUUwaVoAiLUAxOoMIKEEoH+AGH+IUSo+8M1X844cbxdVJGifCBUoaGvXCiowiHUwiQ+IHQoEKUUwTL+AUTEwgHEwUUEs4REEAHoERLUE6V+oaGEwiHUwpT+oaGEAnOUIHJowsJowpJEAwNoADOooaGUs4JEIMGEAkIIbbx0nptfvntLmVu19dt0Xvtu5tiow9K+s9NowUNUs9K++8Jos5N+s4JEIMGEAkIIbtioIHJoI3QoI1Hos6P+w9KUwXNUoaGG","DhjPBq","BwvYz2u","CMvWBgfJzq","qvntrvrFqvvesvrFu05bufnit1rFvJe","BwfW","qsdOOyZOOAJNPlRKUidPOBNOTytKUQFJGilLJRVMJONLVidLPltNMOqGqsdLKi7VViZLKitLIjFKU47LT6BLIldLJ7pLM7RLRPRKUlRVVjO","ywXPyxnLCW","Bg9JyxrPB25Z","C2nLBMvFy291BNq","ihWG","CMv2Awv3","5yIK5PAT5Qch5yEg5lIn5PIV5zcn56EW5PIV5zcM5lIa6iE077Ym6icm5PIV5PIV5zcM55YF55Qe6zYa6kAb5yIg5yIR5yI25l2C54US56Ul44cb5y+V5Asn55sO55Qe6kEg6kEj5y+c6icd6lwe5lQN44cc6kEg6kEj5lI75l2t5zkm5OYb57UT5Asw6kEc5lIa6iE05PE25BU66k6U5B2s5BM277YB5PIo56gU5O2I6kof44cb5y+y6lQR44cb5O2F5Q+b44cb5OYb57UT5lYK5yQ/5OIw5yw25lUw5OYb57UT5OcN5y+y5yYw5yIz5l+D5OYb54US56Ul44cc","C3rHDgvFAwrZ","zxbPC29Kzv9JB3vUDa","qv9dt0Xvtu5tFa","5zUB44cb5zYW54k55lIo6ygt5yw35lIa6iE05OcN","C3vNz2vZDgvKx3n1CNzPDM9Y","CMvMzxjLBMnLx2nVDw50","AgfZ","BgvUz3rO","uYdOOyZOOAJNPlRNIRBMGihLUBBPMRBLSz7KUO7LKiZKUidLIiBLJlRKUk3NTkFPGRVLHBBKUiRNMOqGqsdOOyZJGilLJRVMJONLVidLPltNMOqGuYdLKi7VViZLKitLIjFKU47LT6BLIldLJ7pLM7RLRPRKUlRVVjO","zgvSzxrL","DgL0Bgu","CMvJB21Tzw5KyxrPB24","Bg93","5l2G5Q2J5zYO5A+55lIa6yoO5BEY57Up5A6m5OIq6kEJ5P6q55Qe5A6m5Pw05yMN5PYS6l+B6kgm5ywO5Bga6lwe5lQN5lIa6iE05OcN5A6H6k6H44cc55UU5Qch5PIV5y+r546W5zcm5lIa5A6E5l2t6kkR6yEn5Asn5BU65QgJ44cb5zcm5lIa56IZ5A6A6kEg6kEj54Q25Ocb6kkR6yEn5Asn5OUg5yIg77Ym5lUL5y+k5yc85B6x5lQ65BEL6yEn54k55Asn5Qc455Qe5l2o6Akr5BYc5BI454Q25Ocb44cc","6yEn54k55Qoa5P+L6z2EigrLzMf1BhqG5lIu5PYQ6kkR5BYv55sO44cb5y+Q5zYO5lIa5lIQ5zY65PMV5yE6546W44cb5yE6546W5zco56Ul5y2Z5OgI5Asn5y6F54Q25Ocb44cb5lIo5yMn5zco54Q25Ocb5yEG5lMo55U45zcm5OIw5A6E6zMf5BgE5lQo5Oof57UQl+wNV+wkVY/LIQJKVzWV5ywj57Q/l+EERoAxTUI/H+EOI+EAHoEkTUAaGEoaGUs9JUMIKEs4JEETIEs6JUMuMEIVR++8MUAyJUEHRUwVUEw6LowfS+MuRUAnOUIJHEoaGEwjP+AdHEs6I+s7TUoaGEAmGEE7REs8PowkV+oaGEwpMoI6Q+AiLUw/HEIMGEINHUINIEwpMowmLUAxTUw6Los/NEEvME+8Jos4JEIMGEI+K+whUUs4UUMxRUMIMooaGUIVGEAnRUs4JEI2S+AxTIbHy3rPB249CMv2Awv344cc","ywrKCMvZCW","5lIj44cb5l2o6Akr5lIo5BYc5BI454Q25Ocb","C3rYAw5N","BMfTzxm","CMvMzxjLBMnLCW","AM9PBG","zw1PDf9HC3nLDf9HDwrPDa","zM9YBwf0x2TLEsdLJ6RMIPJLJ6dNQBRNMB3JGihMOiFNGRNJGihLPkFLSi/LHPNJGihLHAJLJyROP5lNRyNMOlZLVi/LT67LVilVViZMMk/LJ6ZLM57OR4hMJA7OGiZKUi3MMk/LKiZKUidLRP7KVzpNMOtMNidNU4JNU5pORRRJGii","zM9YBwf0x2TLEq","ChjVChm","C3vZCgLJAw91C19ZAw5NBgv0B25FC3rHDgu","44ccAwqG5PIV6lwe5lQNieLe77YBBMfTzsdMMk/OP4tOJipLKi3VVjTHBgLHC2vZioAyR+wiQ+wqJEwiL+IHQo+8M2LTCg9YDgfUy2uG5PIV6yEn6kAb5BQM77YBCMvMCY9LCgLZB2rLCY9Zy2vUzxmG5PIV5BYv55sO5QYH5PwW44cb6kAg55Uw6zUg5PwW44cb6kAg55Uw5zY65PwW77YBzM9YBwf0x2TLEsdMMk/KU4xMTOJPMAtMOlZLVi/LMARLO7dNMOtLKi3NP7dPLk7VVjTKzxnJCMLWDgLVBIdMMk/OTytKUQFMJ4/OV7dVVjTLDMLKzw5Jzv9YzwzZioAyR+wWKEMhJ+wUNUMzHEw8LEEuQos9JEE9RUoaGG","Dw51C2vKx3n0yxrL","C3rHDgvFBMfTzq","zhvWBgLJyxrLx2XVy2f0Aw9U","C3rHDgvZ","zMXHDe1HCa","zNjLCxvLBMn5x2zSywC","AxnbCNjHEq","u19dt0Xvtu5tFa","5lQu44cb5A6H6k6H6l6555wm5lIo6l6t5yE6","zxzPzgvUy2u","zMLSDgvY","Aw5WDxq","DhLWzq","AMvIDwW","ywn0Aw9U","zNjLCxvLBMn5","BMfTzq","Aw5Nzxn0lMfZC2v0lwf1zgL0","C3rHDgvFAwrZiow/HEMHU+wHQ+wgMEI+K+wfPEMhJoEAHowUJoAvToEkTUAaGsbHzgrYzxnZ77YipgfZC2v0x2LKpI88C3rHDgvFAwq+77Yj77Ym5lIn6io95y+Q5yAz5y+V6io95zYO5AsA5lIQ6lwe5lQN5lIl6yEn5Asn55Qe5Bga6yoOihn0yxrLx2LK44cc","B2jQzwn0","CMvMCW","5lIa44cb5lQ654MP6lQR5lU95lIa6iE05OcN","ywn0B3jZ","44ccywrKCMvZCYdMMk8GpgfZC2v0x2LKpI88C3rHDgvFAwq+iow9OUw8J+EAHowfQowXGoEkTUAaGEwCSowDGo+8M25HBwuG5PIV54Q25Ocb5zcn77YBCMvMCY9LCgLZB2rLCY9Zy2vUzxmG5zcR5lMj5zcm5lIk77YBzNjLCxvLBMn5ios4UIb1BNvZzwtJGifZAw5NBgv0B24G5OIwic3VVjTKzxnJCMLWDgLVBIdMMk/NIRBMGihOP4BOP4NMJ4/OV7dVVjTLDMLKzw5Jzv9YzwzZioAyR+IVPEEkTUAaGEEAHowUNUMzHEw8LEEuQos9JEE9RUoaGG","6l+u5zUE5ywO5yMN6lwe5lQN5lIa6iE05OcN5A6H6k6H5y+r546W","AgLNAa","BwvKAxvT","5Qoa5P+L5zcm5lIa5lIQ54MP55cg5zYW54k55OIw5zcm5lIa5lU25yw35l2t6ygt5yw35PIV5zcM5zUG5zcn56EW44cb5yMn5zco57Ya44cb5B2s5BgE5O+p6l+W44cb566a56EW44cb566a57Mb5l2t44cb6l2S5B2v5BEU5BYc5OIw6kEc5A+F6kEs5BQM5lIn5zcm6icm6yEn5Asn55M76k6W44cc5yY65yIg5zcm5lIa5zYW54k555Qe5lIn5zcm5zcn56EW5lIo5zcm5lIa5BU6562r5lIT55Qe5lIn5zcm54US56Ul56M66zE077Ym5lMF5yY65yIg5zcm5lIa5lU25yw35l2t6ygt5yw35lIo5zcm57g75l2g5A6E6zMf5lIn5zcm55Qe5AsA5lU26ygt5yw344cc","zxbPC29Kzxm","5zYO5zcm5lIa5lIQ5lQ654MP44cb5zYW54k55OIw6ygt5yw35yAf6yoO77Ym5Qoa5P+L5PIV5zcM5zUG5O+p6l+W5PA55BYp44cb6AkC6iMY57ks5BQM44cb5O6Q6l6E6k+M55wL5OIw6kEc5A+F6kEs5BQM5lIn5zcm77Ym5OQk5zcm5lIa5lIQ56IZ5A6A6kEg6kEj54Q25Ocb5OUg5OIq5AsA5lIQihn0yxrL44cc6yEn54k55ywZ5RoO5zcm5lMjl+I/KEs5IEEkTUAaGEoaGEwqJos4GowLL+ACJEIJHEIIQ+MhJEAwSowrVEwqJEoaGEs7HEwfIEE6V+AiLUwXGoMdQoE7HUIkGUMaOoAiKoEAHow3RUw8GU+8Jos7PEwpIUEkTUAaGEwqJEA3T+wfPEAdHEE7QUoaGEwkQos9NoAiLUwCUUAzR+IVToAyJUoaGG","DgL0Bgv8","ChvZAa","C2nLBMvZ","Aw1WB3j0yw5Jzq","BMvLzhnFAhvTyw5FCMv2Awv3","6l6t5ywL5PIV5A6m5Pw06lwe5lQN55M76k6W55Qe57sN5yEr6kgm5BYp5B+R54wN77Ym5lIn5PIViePtt07JGilNRkZKUidOOyWGqvntrvrFqvvesvrFu05bufnit1rFvJeG5PIV5y2p6k6U54Mi5PYS77YBDgL0Bgv8powjP+wqJt4G5PIV5yMN5zcn77YBqv9dt0Xvtu5tl1nFq09mvu1ouYdMMk/LIjFLRPRKUyNVViZKUi3MMk/OTytKUQFMLBdMJA7VVjTBywn0B3jZoK5D44cbw2XVy2f0Aw9UCZPoxEoaGvTWCM9WCZPoxsdLIiBLIkVLVidLP4VKURRNIANJGihLNldNGRNJGihPGzpLHBFLIiBLJlRVViXoioAyR+IVPEwiHUwmUUI1Hos6P+AvSow5TUwgS+wUMUwfTUs4RsbbioIHJoEAHoI1Hos6P+EXU+wEI+oaGG","6lcd55sOigvTAxrFyxnZzxrFyxvKAxqG5BEL5yw36l+u5zUE5A6H6k6H57Ut5P6C44cc","y29UzMLKzw5Jzq","zgvZy3jPChrPB24","5RkH5PYj6zEU6Aky5PE2igLZC3vLCYdKVkdNQBRMLBdNU4tJGii","zxzPzgvUy2vFCMvMCW","z2vUzxjHDgvuB29S","zhvWBgLJyxrLx3bYB3a","yxnZzxrFAwrZ","zhvWBgLJyxrLx3n0yxrL","zhvWBgLJyxrLx2fJDg9Y","6l+z6yEm5Qoa5P+L5zkm5BU66k6U5zci5BM255Qe5PIV6yEn5AsnigXVy2f0Aw9UioI1Hos6P++8Jos4JEAyRYbZy2vUzEoaGUEBUowqJowCSoEcUEwpR+s7PEAjV+I9VEwKMUs4QUs4JEwqJowjP+AdHEwCUUASOE+8Jos4JEIdVEwBOos4UUwCSoEcUEEBUowqJowWSEwqIow5TIbZy2vUzEoaGG","5Qoa5P+L5zcm5lIa5lIQ5lQ654MP5PIV5zcM5zUG5zcn56EW6kgO6l6+5lIn5zcm6kkR55M76k6W5OIq5AsA5lIQigfJDg9Y44cc5BEU5BYc5yYf5OUS5l2g5lIn6zMq5lQo77YA56M65Qc844cb5Qch54k544cb5AsN5Bcp5yAz44cb5ywO5y2k6kEs44cb566a57Mb5l2t77YB5ywO5zcn44cb566a56EW44cb5PI156EW44cb56EW6lct44cb6igm5l2n44cb5PEN5zcn44cb5yYw5zcn44cb6k+r5zcn44cb6z+Z6k+r77YB5yIg6k+n5BEU5BYc44cb6l275B6U6zsz5yIR5A2x44cb6l2S5B2v6k+V5BEU77YB5zcn56EW6zMe5BIM6lQR5lU944cb5Oof57UQ44cb5A+555M95OIw54Q25Ocb6k+05PIo77YB5yMn5PYF6lQR5lU95PYQ5PIo44cb5zco5PYF5y+i5lUL55YF5zcn6yEn5PAW55M76k6W44cc","5l6l5AAc44co5P6x5PYj57kU44cp5zkm44co5P6xioACIEEYRUoaJ+wpQUAyR+AGVow8J+s4JEwqJo+8Jos9HUs4JEIdVEwpQUAmIEwqJEENSoEBUos8Vow6PUwqIow5TUoaGUw/HEMHU+E7VowqIos6UUEjQEwfS+EZU+oaGEwjP+AdHEI6Q+s7VEoaGEwKLUIYJoApJ+I/SooaGEIHJos4UUI9QoI/UEoaGEwVUEEzVEw9KUwXNUoaGEwhUUEoSos9JEE9RUwsJoI3QoMBHUI/NUE7REAaP+wiPoAwREoaGUwNK+wqJEEBUos8VooaGEI6Q+s7VEEBUoI/KEAiLUE7J+w4UowqJoAHHUEAHos4JEwqJos6UUEjQEE7NEs4JEIdVEIVR+wqIooaGG","AxnZDwvZ","yxnZzxqGyxvKAxqGCMvZCg9UC2uGBxvZDcbIzsbHiePtt04GB2jQzwn0","5Q+p5lIQ6zEU6Aky5B+f6Ag757Uz5yE65yw35l2t6k+b5O2U5zkm5Pon5l2C5BU66k6U44cc6AUy572U5l+H5BQM5lUn5y+Q5PIV5BU66k6U77YB5A2y5zYO5yAY56Qb5OIw5PEG5Rov56gU6k6K5PE2igfJDgLVBJ1YzxzPzxFJGifJB25MAwrLBMnLpwXVDYdMIjyGBwvKAxvT44cc","5y+Q5BYv55sO6l6t5ywL5lIT55YF5A6E5A2y5zYO55QeigfZC2v0l3n0yxrLigLK77YB5y+Q6l6t5yE656gU5A6E5y+V55Ar44cb6zYa6kAb5zci5BM2l+wiOoMzPc/KURRLT6xNOA7ORQtNMOtPOBNNM67VViZNOA7ORQtLKiJNKiBNMOtOTytKUQFMIjBKVy7POPhNIRBMGihKUi3OPOhOVPpLH7RJGilKUi3OPOhNM7tMJQxKV67MLlNLIAFMNkZJGii","5lQm44cb6kEg6kEj54Q25Ocb5lIa6iE05OcN"];return bd=function(){return e},bd()}var Ro=e=>typeof e===V(30)?e[V(1)]():"",kd=e=>[...new Set(Xf(e)[V(5)](Ro)[V(50)](Boolean))];function Gx(e,t){let n=V;if(!qf(e))throw new Error(n(90));let o=new Set([...t[n(62)],...t[n(8)],...t[n(37)]][n(5)](s=>s.id)),i=new Set([...t[n(62)],...t[n(8)],...t[n(37)]][n(44)](s=>s[n(43)][n(5)](c=>c[n(28)]))),r=[];for(let s of Xf(e[n(89)])){if(!qf(s))continue;let c=Ro(s[n(52)]),a=Ro(s[n(54)]),d=Ro(s[n(77)]);if(!Px[n(19)](c)||!Vx[n(19)](a)||!$x[n(19)](d))continue;let p=kd(s[n(83)])[n(50)](m=>o[n(19)](m)),l=kd(s[n(13)])[n(50)](m=>i[n(19)](m));if(p[n(20)]===0&&l[n(20)]===0)continue;let f=Ro(s[n(17)]),u=f&&(o[n(19)](f)||i[n(19)](f))?f:null;r[n(71)]({type:c,asset_ids:p,state_ids:l,names:kd(s[n(31)]),evidence:Ro(s[n(49)]),recommendation:Ro(s[n(24)]),suggested_survivor:u,action:a,confidence:d})}return r}async function em(e,t,n){let o=V,i=await e[o(81)](o(57),{system:Ux,user:Dx(t),tool:{name:o(34),description:o(64),inputSchema:Lf},...n?{signal:n}:{}});return Gx(i[o(51)],t)}var tm="1",Bx=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.audit_version===tm&&n.script_hash===t&&n.summary!==null&&typeof n.summary=="object"&&Array.isArray(n.issues)};function Jx(e,t){return{audit_version:tm,script_hash:e,created_at:new Date().toISOString(),summary:{issues:t.length,high:t.filter(n=>n.confidence==="high").length,medium:t.filter(n=>n.confidence==="medium").length,low:t.filter(n=>n.confidence==="low").length},issues:t}}async function vd(e,t,n){let o=Ue(e),i=Yf(e),r=await em(t,i,n);return Jx(o,r)}async function Kx(e){let t=Ue(e.script);if(!e.force&&e.exists())try{let o=e.read();if(Bx(o,t))return e.executor.recordReuse("ingest.asset-audit"),{report:o,reused:!0}}catch{}let n=await vd(e.script,e.executor,e.signal);return e.write(n),{report:n,reused:!1}}async function nm(e,t,n,o={}){return Kx({script:t,executor:n,read:()=>e.readJson("asset-audit.json"),write:i=>e.writeJson("asset-audit.json",i),exists:()=>e.has("asset-audit.json"),...o.force?{force:!0}:{},...o.signal?{signal:o.signal}:{}})}var jx={duplicate_actor:"duplicate actor",duplicate_location:"duplicate location",duplicate_prop:"duplicate prop",duplicate_state:"duplicate state",suspicious_singleton_state:"suspicious singleton state",unused_state:"unused state",needs_human_review:"asset needs human review"};function Od(e){let t=[...e.asset_ids,...e.state_ids].join(", ")||"<unknown>",n=e.evidence||e.recommendation||"review the referenced assets";return`${jx[e.type]} [${t}]: ${n}`}function om(e){return e.issues.map(t=>({code:`asset_audit_${t.type}`,path:"$",message:`${Od(t)}; action=${t.action}; confidence=${t.confidence}`}))}var Ts=class{constructor(t,n=()=>Date.now()){this.flush=t;this.now=n;this.t={startedMs:this.now(),endedMs:null,phases:[],serial:null},this.flush(this.t)}flush;now;t;phaseStart(t){this.t.phases.push({name:t,startedMs:this.now(),endedMs:null}),this.flush(this.t)}phaseEnd(t){for(let n=this.t.phases.length-1;n>=0;n--){let o=this.t.phases[n];if(o.name===t&&o.endedMs===null){o.endedMs=this.now(),this.flush(this.t);return}}}serialStart(t,n){this.t.serial={totalWindows:t,totalEpisodes:n,windows:[]},this.flush(this.t)}windowDone(t,n,o,i){this.t.serial||(this.t.serial={totalWindows:0,totalEpisodes:0,windows:[]}),this.t.serial.windows.push({start:t,end:n,ms:o,cached:i}),this.flush(this.t)}finish(){this.t.endedMs=this.now(),this.flush(this.t)}};function im(e,t){let n=(e.endedMs??t)-e.startedMs,o=e.phases.map(r=>({name:r.name,ms:(r.endedMs??t)-r.startedMs,running:r.endedMs===null})),i=null;if(e.serial){let r=e.serial.windows,s=r.filter(p=>!p.cached),c=s.length?s.reduce((p,l)=>p+l.ms,0)/s.length:null,a=r.reduce((p,l)=>p+(l.end-l.start+1),0),d=Math.max(0,e.serial.totalWindows-r.length);i={doneWindows:r.length,totalWindows:e.serial.totalWindows,doneEpisodes:a,totalEpisodes:e.serial.totalEpisodes,avgWindowMs:c!=null?Math.round(c):null,etaMs:c!=null?Math.round(c*d):null}}return{elapsedMs:n,done:e.endedMs!==null,phases:o,serial:i}}import*as sm from"node:crypto";function Nd(){return{calls:0,succeeded:0,failed:0,reused:0,attempts:0,durationMs:0,inputTokens:0,outputTokens:0,cachedInputTokens:0,cacheCreationTokens:0,totalTokens:0}}function zx(e,t){if(t.status==="reused"){e.reused+=1;return}e.calls+=1,t.status==="succeeded"?e.succeeded+=1:e.failed+=1,e.attempts+=t.attempts,e.durationMs+=t.durationMs,e.inputTokens+=t.inputTokens,e.outputTokens+=t.outputTokens,e.cachedInputTokens+=t.cachedInputTokens,e.cacheCreationTokens+=t.cacheCreationTokens,e.totalTokens=e.inputTokens+e.outputTokens}function Cs(e){let t=Nd();for(let n of e)zx(t,n);return t}var dr=e=>`${e.provider}\0${e.protocol}\0${e.model}`;function am(e){let t=new Map;for(let n of e){let o=dr(n),i=t.get(o)??{identity:{provider:n.provider,protocol:n.protocol,model:n.model},profiles:new Set,fingerprints:new Set,records:[]};i.profiles.add(n.profile),i.fingerprints.add(n.fingerprint),i.records.push(n),t.set(o,i)}return[...t.values()].map(n=>({...n.identity,profiles:[...n.profiles].sort(),fingerprints:[...n.fingerprints].sort(),totals:Cs(n.records)})).sort((n,o)=>dr(n).localeCompare(dr(o)))}function Rd(e){let t=new Map;for(let n of e){let o=t.get(n.task)??[];o.push(n),t.set(n.task,o)}return[...t.entries()].map(([n,o])=>({task:n,totals:Cs(o),byModel:am(o)})).sort((n,o)=>n.task.localeCompare(o.task))}function rm(e){return am(e).map(t=>{let n=e.filter(o=>dr(o)===dr(t));return{...t,byTask:Rd(n).map(({task:o,totals:i})=>({task:o,totals:i}))}})}function Hx(e){let t=e.updatedAt,n=new Map;for(let r of e.episodes)n.set(r.episode,r.runs);let o=[...n.entries()].map(([r,s])=>{let c=new Set(s.flatMap(d=>d.recordIds)),a=e.records.filter(d=>c.has(d.id));return{episode:r,totals:Cs(a),byTask:Rd(a),byModel:rm(a),durationMs:s.reduce((d,p)=>d+p.durationMs,0),runs:s}}).sort((r,s)=>r.episode-s.episode),i=Cs(e.records);return{...e,updatedAt:t,totals:i,byTask:Rd(e.records),byModel:rm(e.records),episodes:o,timing:{totalDurationMs:e.runs.reduce((r,s)=>r+s.durationMs,0),modelDurationMs:i.durationMs,episodeDurationMs:o.reduce((r,s)=>r+s.durationMs,0)}}}function Fx(e){return{version:2,createdAt:e,updatedAt:e,totals:Nd(),byTask:[],byModel:[],episodes:[],runs:[],records:[],timing:{totalDurationMs:0,modelDurationMs:0,episodeDurationMs:0}}}function cr(e){return new Date(e).toISOString()}var ai=class{constructor(t,n,o=()=>Date.now()){this.store=t;this.executor=n;this.now=o;this.startedAtMs=this.now(),this.cursor=n.usageEvents().length;let i=cr(this.startedAtMs);if(this.report=t.has("usage.json")?t.readJson("usage.json"):Fx(i),this.report.version!==2)throw new Error("workspace/usage.json uses an incompatible schema; rerun ingest with --force to rebuild the workspace.");for(let r of this.report.runs)r.status==="running"&&(r.status="interrupted",r.endedAt=this.report.updatedAt,r.durationMs=Math.max(0,Date.parse(this.report.updatedAt)-Date.parse(r.startedAt)));this.report.runs.push({id:this.runId,status:"running",startedAt:i,endedAt:null,durationMs:0}),this.write(this.startedAtMs)}store;executor;now;runId=sm.randomUUID();startedAtMs;cursor;report;flush(t){let n=t.endedAtMs??this.now(),o=t.startedAtMs??n,i=this.executor.usageEvents(),s=i.slice(this.cursor).map(c=>this.toRecord(c,t.scope));if(this.cursor=i.length,this.report.records.push(...s),t.scope.kind==="episode"){let c=t.scope.episode,a=this.report.episodes.find(p=>p.episode===c),d=a?.runs??[];d.push({runId:this.runId,status:t.status??"succeeded",startedAt:cr(o),endedAt:cr(n),durationMs:Math.max(0,n-o),stages:t.stages??{},recordIds:s.map(p=>p.id)}),a||this.report.episodes.push({episode:c,totals:Nd(),byTask:[],byModel:[],durationMs:0,runs:d})}this.write(n)}finish(t){let n=this.now();this.executor.usageEvents().length>this.cursor&&this.flush({scope:{kind:"run"},status:t==="succeeded"?"succeeded":"failed",endedAtMs:n});let o=this.report.runs.find(i=>i.id===this.runId);o&&(o.status=t,o.endedAt=cr(n),o.durationMs=Math.max(0,n-this.startedAtMs)),this.write(n)}toRecord(t,n){return{...t,id:`${this.runId}:${t.sequence}`,runId:this.runId,scope:n}}write(t){let n=this.report.runs.find(o=>o.id===this.runId);n?.status==="running"&&(n.durationMs=Math.max(0,t-this.startedAtMs)),this.report.updatedAt=cr(t),this.report=Hx(this.report),this.store.writeJson("usage.json",this.report)}};var Ld="12",Us=e=>String(e).padStart(3,"0"),cm=e=>e.map(t=>JSON.stringify(t)).join(`
|
|
246
|
+
`)+`
|
|
247
|
+
`;function Qx(e,t,n){if(e.has("manifest.json")){let o=e.readJson("manifest.json");if(o.source?.sha256&&o.source.sha256!==t)throw new x("This workspace was built from a different source. --force cannot switch sources.",{exitCode:b,errorCode:"INGEST_SOURCE_MISMATCH",hint:"Choose a fresh --workspace-path for the new source.",data:{actual:["workspace source differs from --source-path"]}});if(!n&&o.pipeline_version&&o.pipeline_version!==Ld)throw new x("This workspace was created by an older text-ingest pipeline.",{exitCode:b,errorCode:"INGEST_PIPELINE_MISMATCH",hint:"Rerun `scriptctl ingest --force` with the same source to rebuild its checkpoints.",data:{actual:[`workspace pipeline ${o.pipeline_version}; current ${Ld}`]}})}if(n){for(let o of["pass1","pass2","pass3","pass5","serial"])Md.rmSync(e.path(o),{recursive:!0,force:!0});for(let o of["body.json","script.initial.json","script.json","validation.json","asset-audit.json","notes.json","issues.json","provisional_assets.json","usage.json","v4_identity_map.json"])Md.rmSync(e.path(o),{force:!0})}}async function dm(e){let t=Wn(e.sourcePath);if(t.kind!=="text")throw new x("runTextIngest received a non-text source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=await Ef(t.path,t.ext),o=Se(n),i=new At(e.workspacePath);i.ensure(),Qx(i,o,e.force??!1);let r=new Ts(a=>i.writeJson("timings.json",a)),s=new ai(i,e.executor),c="failed";try{let a=Date.now(),d=0;if(!e.force&&i.has("pass1/body_start.json"))d=i.readJson("pass1/body_start.json").line??0,e.executor.recordReuse("ingest.body-start");else{let L=await kf(e.executor,n,e.signal);d=L.line,i.writeJson("pass1/body_start.json",L)}let p=n.split(`
|
|
248
|
+
`),l=d>0?p.slice(d).join(`
|
|
249
|
+
`):n,f=d>0?p.slice(0,d).join(`
|
|
250
|
+
`).trim().slice(0,6e3):"",u=Xu(l);i.writeText("pass1/source.txt",n),i.writeJson("pass1/chunks.json",u.map(L=>({index:L.index,core_line_start:L.core_line_start,core_line_end:L.core_line_end}))),i.writeJson("manifest.json",{version:1,pipeline_version:Ld,updated:new Date().toISOString(),source:{path:ci.resolve(t.path),sha256:o,kind:"text",ext:t.ext},chunks:u.length}),s.flush({scope:{kind:"phase",phase:"prepare"},status:"succeeded",startedAtMs:a});let m=0;r.phaseStart("normalize");let g=await bf(u,e.concurrency??30,async L=>{let oe=`pass2/chunk_${Us(L.index)}.json`,he=`pass2/chunk_${Us(L.index)}.error.json`;if(i.has(oe)&&!e.force){let We=ud(i.readJson(oe),L);return i.clearError(he),m++,e.executor.recordReuse("ingest.text-normalize"),We}let{raw:rt,records:qt}=await Sf(e.executor,L,e.signal);return i.writeText(oe,rt),i.writeText(`pass2/chunk_${Us(L.index)}.jsonl`,cm(qt)),i.clearError(he),qt}),h=g.filter(L=>!L.ok);for(let L of h){let oe=L.error instanceof Error?L.error.message:String(L.error);i.writeJson(`pass2/chunk_${Us(L.index)}.error.json`,{chunk:L.index,error:oe})}if(s.flush({scope:{kind:"phase",phase:"normalize"},status:h.length?"failed":"succeeded"}),h.length>0)throw new x(`${h.length}/${u.length} chunk(s) failed normalization.`,{exitCode:b,errorCode:"INGEST_NORMALIZE_INCOMPLETE",hint:"Inspect pass2/chunk_NNN.error.json and rerun `scriptctl ingest` to resume.",data:{actual:h.map(L=>`chunk ${L.index}`)}});r.phaseEnd("normalize");let _,y,w;if(!e.force&&i.has("body.json"))_=i.readJson("body.json"),y=i.has("pass3/script.jsonl")?ir(i.readText("pass3/script.jsonl")).length:0,w=i.has("notes.json")?i.readJson("notes.json").length:0,m++;else{let L=[];for(let qt of g)qt.ok&&L.push(...qt.value);i.writeText("pass3/script.jsonl",cm(L));let oe=ir(i.readText("pass3/script.jsonl")),he=Yx(t.path),rt=Zu(oe,{title:he});i.writeJson("notes.json",rt.notes),_=rt.script,i.writeJson("body.json",_),y=L.length,w=rt.notes.length}let I=L=>String(L).padStart(3,"0"),E=(L,oe)=>`serial/win_${I(L)}_${I(oe)}.json`,A={readUpdate:(L,oe)=>i.has(E(L,oe))?i.readText(E(L,oe)):void 0,writeStep:(L,oe,he,rt)=>{i.writeText(`serial/context_${I(L)}.md`,he),i.writeText(E(L,oe),rt)},readArc:(L,oe)=>{let he=`serial/arc_${I(L)}_${I(oe)}.md`;return i.has(he)?i.readText(he):void 0},writeArc:(L,oe,he)=>{i.writeText(`serial/arc_${I(L)}_${I(oe)}.md`,he)},readNameFix:(L,oe)=>{let he=`serial/fix_${I(L)}_${I(oe)}.json`;return i.has(he)?i.readText(he):void 0},writeNameFix:(L,oe,he)=>i.writeText(`serial/fix_${I(L)}_${I(oe)}.json`,he)};r.phaseStart("serial");let k=await Ff(_,{executor:e.executor,checkpoint:A,force:e.force??!1,...f?{sourceRef:f}:{},onWindow:L=>{L.index===0&&r.serialStart(L.total,L.totalEpisodes),r.windowDone(L.startEp,L.endEp,L.ms,L.cached);let oe=L.startEp===L.endEp?{kind:"episode",episode:L.startEp}:{kind:"episode-range",startEpisode:L.startEp,endEpisode:L.endEp},he=Date.now();s.flush({scope:oe,status:L.cached?"reused":"succeeded",startedAtMs:he-L.ms,endedAtMs:he})},...e.signal?{signal:e.signal}:{}}),D=k.doc;m+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:R,idMap:S}=As(D);i.writeJson("id_map.json",S);let M=at(R);if(!M.ok)throw i.writeJson("validation.json",M),new x("Intermediate script failed validation before v4 identity assignment.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:M.errors.slice(0,5).map(L=>`${L.path}: ${L.message}`)}});let $=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,T=ii(It(D),$,k.identityKeys),O=T.script,j=Te(O),Z=[],De=Date.now(),J="failed";try{if(j.ok){let L=await nm(i,O,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});Z=om(L.report)}J="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:J,startedAtMs:De})}let be={...j,warnings:[...j.warnings,...Ss(O),...Z]};if(i.writeJson("pass5/script.json",O),i.writeJson("v4_identity_map.json",T.identityMap),i.writeJson("validation.json",be),!be.ok)throw new x("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:be.errors.slice(0,5).map(L=>`${L.path}: ${L.message}`)}});i.writeJson("script.json",O),r.phaseEnd("govern"),r.finish();let Qe=O;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:m,records:y,notes:w,assets:{actors:Qe.actors?.length??0,locations:Qe.locations?.length??0,props:Qe.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:be.ok,errors:be.errors.length,warnings:be.warnings.length}}}finally{s.finish(c)}}function Yx(e){return ci.basename(e,ci.extname(e))}import*as Yt from"node:fs";import*as yi from"node:path";function qx(e,t){return e.episode!==t.episode?`episode ${e.episode} was replaced by episode ${t.episode}`:e.ext!==t.ext||e.mime!==t.mime?`episode ${e.episode} changed media type`:e.sha256!==t.sha256?`episode ${e.episode} content changed`:null}function pm(e,t){if(t.length<e.length)return{kind:"incompatible",reason:`source removed ${e.length-t.length} previously accepted episode(s)`};for(let o=0;o<e.length;o+=1){let i=qx(e[o],t[o]);if(i)return{kind:"incompatible",reason:i}}let n=t.slice(e.length);return n.length===0?{kind:"unchanged",appended:[]}:{kind:"append",appended:n}}function Ps(e){for(let t=0;t<e.length;t+=1){let n=t+1,o=e[t].episode;if(o!==n)return`expected episode ${n}, found episode ${o}`}return null}function di(e){let t=typeof e=="string"?e.trim().replace(/\.\d+$/,""):"",n=t.match(/^(?:(\d+):)?(\d+):(\d{2})$/);if(!n)return t;let o=Number(n[1]??0),i=Number(n[2]),r=Number(n[3]);if(![o,i,r].every(Number.isSafeInteger))return t;let s=o*3600+i*60+r,c=Math.floor(s/3600),a=Math.floor(s%3600/60),d=s%60;return c>0?`${c}:${String(a).padStart(2,"0")}:${String(d).padStart(2,"0")}`:`${String(a).padStart(2,"0")}:${String(d).padStart(2,"0")}`}function pi(e,t){if(!e)return e;let n=e.match(/^(\w+):(.+)$/);return n?`${n[1]}:${t.get(n[2])??n[2]}`:t.get(e)??e}var lm=e=>String(e).padStart(3,"0"),Wx={\u5185:"interior",\u5916:"exterior"},Zx={act:"action",dlg:"dialogue",think:"inner_thought"},Td={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function Xx(e){let t=e.match(/^(\w+):(.+)$/);if(t&&Td[t[1]]){let n=t[2].trim();return n?{kind:Td[t[1]],label:n}:{kind:Td[t[1]]}}return lt(e)?{kind:"group",label:e.trim()}:{name:e}}function um(e,t){let n=0,o=e.map((i,r)=>{let s=`video:episode:${i.episode}`,c=new Map;return{identity_key:s,episode_id:`ep_${lm(r+1)}`,scenes:i.scenes.map(a=>{let d=a.timeRange?.trim()?`time:${a.timeRange.trim()}`:`index:${a.index}`,p=(c.get(d)??0)+1;c.set(d,p);let l=`${s}:scene:${d}:${p}`,f={},u=Wx[(a.environment.space??"").trim()],m=ei(a.environment.time);u&&(f.space=u),m&&(f.time=m);let g=[],h=A=>{g.some(k=>k.name===A)||g.push({name:A})};for(let A of a.characters)A.name&&!lt(A.name)&&(A.states.length===0?g.push({name:A.name}):g.push(...A.states.map(k=>({name:A.name,state:k}))));let _=new Map,y=a.anchors.map(A=>{let k=di(A.ts),D=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,R=(_.get(D)??0)+1;_.set(D,R);let S={identity_key:`${l}:action:${D}:${R}`,type:Zx[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let $=Xx(A.speaker);S.speaker=$,"name"in $&&h($.name)}A.parenthetical&&(S.parenthetical=A.parenthetical);let M=di(A.ts);return M&&(S.extend={timestamp:M}),S}),w=(a.location??"").trim(),I=[],E=new Set;for(let A of a.props??[]){if(!A)continue;let k=A.normalize("NFC").replace(/\s+/g," ").trim();!k||E.has(k)||(E.add(k),I.push({name:A}))}return{identity_key:l,scene_id:`scn_${lm(++n)}`,...f.space||f.time?{environment:f}:{},location:w?{name:w}:null,actors:g,props:I,actions:y}})}});return{title:t,episodes:o}}var eS=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""});function li(){return{lastEpisode:0,registry:[],digests:[],openThreads:[]}}var ge=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),pr=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function tS(e,t){let n=ge(t);return e.find(o=>ge(o.name)===n||ge(o.identitySeed)===n||o.aliases.some(i=>ge(i)===n))}var nS=3,oS=12e3;function No(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var iS=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function Vs(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:eS();for(let i of iS){let r=t[i]?.trim()??"";r&&(n||!o[i])&&(o[i]=r)}for(let i of t.persistent_marks??[])No(o.persistent_marks,i);return o}function Cd(e,t,n){let o=t.name.trim();if(!o)return;let i=t.description.trim(),r=e.find(s=>sn(s.name)===sn(o));if(!r){e.push({name:o,description:i});return}i&&(n||!r.description)&&(r.description=i)}function fm(e,t,n,o=!1){let i=(s,c)=>{let a=(c??"").trim();return a&&(o||!s)?a:s};for(let s of t.add_recognition_anchors??[])No(e.recognitionAnchors,s);e.identityProfile=Vs(e.identityProfile,t.identity_profile_patch,o);let r=i(e.appearance,t.appearance);r&&(e.appearance=r),e.role=i(e.role,t.role)??e.role;for(let s of t.add_aliases??[])No(e.aliases,s);for(let s of t.add_states??[])Cd(e.states,s,o);e.lastEpisode=n}function hm(e,t,n){let o=r=>tS(e.registry,r);for(let r of t.registry_delta.new_entities){let s=r.name.trim();if(!s||r.kind==="actor"&<(s))continue;let c=o(s);if(c){fm(c,{add_recognition_anchors:r.recognition_anchors,identity_profile_patch:r.identity_profile,appearance:r.appearance,role:r.role,add_aliases:r.aliases,add_states:r.states},n);continue}let a=[];for(let p of r.states??[])Cd(a,p,!1);let d=[];for(let p of r.aliases??[])No(d,p);e.registry.push({identitySeed:s,name:s,kind:r.kind,status:r.status,importance:r.importance,recognitionAnchors:[...new Set((r.recognition_anchors??[]).map(p=>p.trim()).filter(Boolean))],...r.identity_profile?{identityProfile:Vs(void 0,r.identity_profile,!0)}:{},...r.appearance?{appearance:r.appearance.trim()}:{},role:(r.role??"").trim(),aliases:d,states:a,firstEpisode:n,lastEpisode:n})}for(let r of t.registry_delta.enrich){let s=o(r.name);s&&fm(s,r,n,!0)}for(let r of t.registry_delta.canonicalize){let s=o(r.from_name),c=r.canonical_name.trim();if(!s||!c||ge(c)===ge(s.name))continue;let a=o(c);if(a&&a!==s){let d=s.firstEpisode<a.firstEpisode?s:a,p=d===s?a:s,l=d.states.map(m=>({...m})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(m=>m.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let m of[...s.recognitionAnchors,...a.recognitionAnchors])No(d.recognitionAnchors,m);let u=Vs(void 0,s.identityProfile,!0);d.identityProfile=Vs(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let m of[...l,...p.states])Cd(d.states,m,!1);d.aliases=[...f].filter(m=>ge(m)!==ge(c)),d.firstEpisode=Math.min(s.firstEpisode,a.firstEpisode),d.lastEpisode=Math.max(s.lastEpisode,a.lastEpisode,n),e.registry.splice(e.registry.indexOf(p),1);continue}No(s.aliases,s.name),No(s.aliases,r.from_name),s.name=c,s.status="canonical",s.aliases=s.aliases.filter(d=>ge(d)!==ge(c)),s.lastEpisode=n}let i=0;for(let r of t.open_threads.opened){let s=r.text.trim();s&&e.openThreads.push({id:`t${n}_${++i}`,text:s,sinceEpisode:n})}for(let r of t.open_threads.closed){let s=r.ref.trim();s&&(e.openThreads=e.openThreads.filter(c=>c.id!==s&&c.text!==s))}return e.digests.push({episode:n,synopsis:(t.synopsis??"").trim()}),e.lastEpisode=n,e}function ym(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function rS(e,t){let n=[],o=e.status==="provisional"?"\xB7\u5F85\u5B9A \u26A0":`\xB7${e.importance}`;n.push(`### ${e.name} ${o}`),e.role&&n.push(`- \u4F5C\u7528: ${pr(e.role,t?40:200)}`),e.recognitionAnchors.length&&n.push(`- \u8BC6\u522B\u951A\u70B9: ${e.recognitionAnchors.join("\uFF1B")}`);let i=e.identityProfile;if(i){let r=[i.apparent_gender,i.apparent_age].filter(Boolean).join("\uFF0C");r&&n.push(`- \u5E74\u9F84\u6027\u522B: ${r}`),i.face_shape&&n.push(`- \u8138\u578B\u4E0B\u988C: ${i.face_shape}`),i.brows_eyes&&n.push(`- \u7709\u773C: ${i.brows_eyes}`),i.nose&&n.push(`- \u9F3B\u90E8: ${i.nose}`),i.mouth&&n.push(`- \u5507\u5F62\u5634\u89D2: ${i.mouth}`),i.skin_features&&n.push(`- \u80A4\u8272\u9762\u90E8: ${i.skin_features}`),i.hair&&n.push(`- \u53D1\u578B: ${i.hair}`),i.build&&n.push(`- \u4F53\u6001: ${i.build}`),i.persistent_marks.length&&n.push(`- \u56FA\u5B9A\u6807\u8BB0: ${i.persistent_marks.join("\uFF1B")}`),i.voice&&n.push(`- \u58F0\u7EBF: ${i.voice}`)}return e.aliases.length&&n.push(`- \u66FE\u7528\u79F0\u547C: ${e.aliases.join("\u3001")}`),e.states.length&&n.push(`- \u5DF2\u77E5\u9020\u578B: ${e.states.map(r=>{let s=pr(r.description,t?30:90);return s?`${r.name}\uFF08${s}\uFF09`:r.name}).join(" / ")}`),n.push(`- \u51FA\u73B0: ep ${e.firstEpisode}\u2013${e.lastEpisode}`),e.status==="provisional"&&n.push(`- \u8EAB\u4EFD\u672A\u786E\u8BA4\uFF1A\u672C\u96C6\u82E5\u51FA\u73B0\u4E66\u9762\u59D3\u540D\u6216\u53F0\u8BCD\u672C\u540D\uFF0C\u7528 canonicalize \u4ECE\u300C${e.name}\u300D\u5347\u7EA7\u89C4\u8303\u540D`),n}function mm(e,t){let n=pr(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${pr(i.description,t?20:60)}\uFF09`:i.name).join(" / ");return`- ${e.name} \xB7${e.importance}${n?`\uFF1A${n}`:""}${o?`\uFF1B\u72B6\u6001\uFF1A${o}`:""}`}function gm(e,t,n){let o=[];o.push(`# \u5DF2\u77E5\u8BBE\u5B9A\uFF08\u89E3\u6790\u7B2C ${e.lastEpisode+1} \u96C6\u65F6\u5BF9\u7167\u672C\u8868\uFF09`,""),o.push("\u8BA4\u5F97\u51FA\u7684\u4EBA/\u7269\u6CBF\u7528\u5176**\u89C4\u8303\u540D**\uFF0C\u522B\u81EA\u5DF1\u65B0\u8D77\u540D\uFF1B\u4EBA\u7269\u4F18\u5148\u6BD4\u5BF9\u8BC6\u522B\u951A\u70B9\u4E0E\u7ED3\u6784\u5316\u8EAB\u4EFD\u753B\u50CF\uFF0C\u670D\u88C5\u53EA\u4F5C\u5F31\u8F85\u52A9\u3002","");let i=e.registry.filter(a=>a.kind==="actor"),r=e.registry.filter(a=>a.kind==="location"),s=e.registry.filter(a=>a.kind==="prop");if(i.length){o.push("## \u4EBA\u7269","");for(let a of i)o.push(...rS(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(mm(a,n));for(let a of s)o.push(mm(a,n));o.push("")}let c=e.digests.filter(a=>a.episode>e.lastEpisode-t);if(c.length){o.push("## \u5267\u60C5\u8FDB\u5C55","");for(let a of[...c].sort((d,p)=>d.episode-p.episode))o.push(a.outcome==="skipped"?`\u7B2C${a.episode}\u96C6\u5DF2\u4EBA\u5DE5\u8DF3\u8FC7\uFF0C\u5267\u60C5\u672A\u77E5\u3002`:`\u7B2C${a.episode}\u96C6\uFF1A${n?pr(a.synopsis,40):a.synopsis}`);o.push("")}if(e.openThreads.length){o.push("## \u672A\u95ED\u5408\u7EBF\u7D22\uFF08\u82E5\u672C\u96C6\u4EA4\u4EE3\u4E86\uFF0C\u7528 open_threads.closed \u5F15\u7528\u5176 [id] \u5173\u95ED\uFF09","");for(let a of e.openThreads)o.push(`- [${a.id}] ${a.text}`);o.push("")}return o.join(`
|
|
251
|
+
`)}function _m(e){for(let t=nS;t>=1;t--){let n=gm(e,t,!1);if(n.length<=oS)return n}return gm(e,1,!0)}function lr(e){let t=new Map;for(let n of e)for(let o of[n.identitySeed,...n.aliases])ge(o)!==ge(n.name)&&t.set(o,n.name);return t}function sS(e){let t=e.identityProfile,n=[];if(t){let o=[t.apparent_gender,t.apparent_age].filter(Boolean).join("\uFF0C");o&&n.push(`\u5916\u89C2\u5E74\u9F84\u4E0E\u6027\u522B\uFF1A${o}`),t.face_shape&&n.push(`\u8138\u578B\u4E0B\u988C\uFF1A${t.face_shape}`),t.brows_eyes&&n.push(`\u7709\u773C\uFF1A${t.brows_eyes}`),t.nose&&n.push(`\u9F3B\u90E8\uFF1A${t.nose}`),t.mouth&&n.push(`\u5507\u5F62\u53E3\u5468\uFF1A${t.mouth}`),t.skin_features&&n.push(`\u80A4\u8272\u9762\u90E8\uFF1A${t.skin_features}`),t.hair&&n.push(`\u5934\u53D1\uFF1A${t.hair}`),t.build&&n.push(`\u9AA8\u67B6\u4F53\u578B\uFF1A${t.build}`),t.persistent_marks.length&&n.push(`\u56FA\u5B9A\u6807\u8BB0\uFF1A${t.persistent_marks.join("\u3001")}`),t.voice&&n.push(`\u58F0\u7EBF\uFF1A${t.voice}`)}return e.recognitionAnchors.length&&n.push(`\u8BC6\u522B\u951A\u70B9\uFF1A${e.recognitionAnchors.join("\uFF1B")}`),e.role&&n.push(`\u89D2\u8272\u8BED\u5883\uFF1A${e.role}`),n.map(o=>o.replace(/[。;]+$/,"")).join("\uFF1B")}function wm(e,t){let n=new Map,o=new Map,i=(s,c)=>{let a=ge(s),d=c.trim();!d||ge(d)===a||(o.has(a)||o.set(a,new Set),o.get(a).add(d))};for(let s of t){n.set(ge(s.name),s.importance);for(let c of s.aliases)n.set(ge(c),s.importance);n.set(ge(s.identitySeed),s.importance);for(let c of new Set([s.identitySeed,...s.aliases]))i(s.name,c)}let r=(s,c)=>{for(let a of s??[]){let d=String(a[c]??""),p=[d,...a.aliases??[]],l;for(let m of p)if(l=t.find(g=>ge(g.name)===ge(m)||ge(g.identitySeed)===ge(m)||g.aliases.some(h=>ge(h)===ge(m))),l)break;a.importance=l?.importance??n.get(ge(d))??"featured";let f=o.get(ge(d));if(f?.size&&(a.aliases=[...new Set([...a.aliases??[],...f])]),!l)continue;let u=l.kind==="actor"?sS(l):[l.appearance,l.role].map(m=>(m?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let m of a.states??[]){let g=l.states.find(h=>sn(h.name)===sn(m.state_name));g?.description?m.description=g.description:m.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(m.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function Em(e,t){let n=e.scenes.map((o,i)=>{let r={};o.environment?.space&&(r.space=o.environment.space),o.environment?.time&&(r.time=o.environment.time);let s=(o.anchors??[]).map(c=>({kind:c.kind,...c.speaker?{speaker:c.speaker}:{},...c.parenthetical?{parenthetical:c.parenthetical}:{},...c.ts?{ts:c.ts}:{},content:c.content??""}));return{index:i+1,environment:r,...o.timeRange?{timeRange:o.timeRange}:{},...o.location?{location:o.location}:{},characters:(o.characters??[]).filter(c=>c.name).map(c=>({name:c.name,states:[...c.states]})),props:(o.props??[]).filter(Boolean),anchors:s}});return{episode:t,synopsis:(e.synopsis??"").trim(),scenes:n,actors:[],locations:[],props:[],speakers:[],actorStates:[],locationStates:[],propStates:[]}}var aS=60,cS=6,dS=[-1e3,0,1e3],Am=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,Ud=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,Pd=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,xm=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,km=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,bm=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,vm=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function to(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function Om(e){let t=e.trim().match(/^(?:(\d{1,2}):)?(\d{1,2}):(\d{2})(?:\.(\d{1,3}))?$/);if(!t)return null;let n=Number(t[1]??0),o=Number(t[2]),i=Number(t[3]);if(o>=60&&t[1]!==void 0||i>=60)return null;let r=String(t[4]??"").padEnd(3,"0");return((n*60+o)*60+i)*1e3+Number(r||0)}function Rm(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function Nm(e,t="clock"){return t==="legacy_centiseconds"?Rm(e):Om(e)}function Vd(e,t){return e===null?!1:t===void 0||e<=t}function pS(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(Mm)).filter(Boolean),o=n.filter(r=>Vd(Om(r),t)).length;return n.filter(r=>Vd(Rm(r),t)).length>o?"legacy_centiseconds":"clock"}function Sm(e){let t=Math.floor(e/6e4),n=Math.floor(e%6e4/1e3),o=e%1e3;return`${String(t).padStart(2,"0")}:${String(n).padStart(2,"0")}.${String(o).padStart(3,"0")}`}function Mm(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function lS(e,t){let n=new Set([e.actor_name,...e.aliases??[]].map(to).filter(Boolean));for(let[o,i]of t)to(i)===to(e.actor_name)&&n.add(to(o));return[...n].sort((o,i)=>i.length-o.length)}function Lm(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function Tm(e,t,n){return t.filter(o=>Lm(e,n.get(o.actor_id)??[])>=0).length}function uS({action:e,actor:t,actorCount:n,allActors:o,surfaces:i,surfacesByActor:r,stateName:s}){let c=e.type==="action"||e.type==="transition",a=to(c?e.content:"parenthetical"in e?e.parenthetical??"":""),d=Lm(a,i),p=d>=0&&d<=12,l=d>=0,u=e.type==="dialogue"&&"speaker"in e&&"actor_id"in e.speaker&&e.speaker.actor_id===t.actor_id&&!vm.test(a),m=n===1&&(c&&a.length>0||u&&a.length>0&&(Pd.test(a)||xm.test(a)));if(!l&&!u&&!m)return null;let g=p||u?"target_anchor":"scene_fallback",h=u?250:p?65:l?50:45,_=u?250:p?65:l?50:45;n===1&&(h+=20,_+=20);let y=to(s);return y&&y!=="default"&&y!=="\u9ED8\u8BA4"&&a.includes(y)&&(h+=35),Am.test(a)&&(h+=30),Ud.test(a)?(h+=25,_+=15):Pd.test(a)&&(h+=15,_+=5),xm.test(a)&&(_+=30,Ud.test(a)||(h-=20)),km.test(a)&&(h-=70,_-=70),bm.test(a)&&(h-=40),Tm(a,o,r)>=2&&(h-=15,_-=15),{stateScore:h,identityScore:_,selection:g}}function fS(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?to(e.parenthetical??""):"";if(!o&&vm.test(i))return null;let r=to(o?e.content:i),s=o?0:-40;return s-=Tm(r,t,n)*20,Am.test(r)&&(s+=10),Ud.test(r)?s+=10:Pd.test(r)&&(s+=5),km.test(r)&&(s-=20),bm.test(r)&&(s-=10),{stateScore:s,identityScore:Number.NEGATIVE_INFINITY,selection:"scene_fallback"}}function ur(e,t,n){let o=(n.get(`${e.episode}:${e.milliseconds}`)?.size??0)>1;return e[t]-(o?35:0)}function Cm(e,t,n,o,i){let r=new Map;for(let a of e){let d=`${a.episode}:${a.milliseconds}`,p=r.get(d);(!p||ur(a,t,n)>ur(p,t,n))&&r.set(d,a)}let s=[...r.values()].sort((a,d)=>ur(d,t,n)-ur(a,t,n)||a.episode-d.episode||a.milliseconds-d.milliseconds).filter(a=>i===null||ur(a,t,n)>=i),c=[];for(let a of s)if(!c.some(p=>p.episode===a.episode&&p.sceneId===a.sceneId&&Math.abs(p.milliseconds-a.milliseconds)<3e3)&&(c.push(a),c.length>=o))break;return c}function mS(e,t,n){return Cm(e,t,n,1,null)[0]??null}function Im(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function $s(e,t,n,o,i){let r=new Map(o.map(h=>[h.episode,h])),s=lr(n.registry),c=new Map(t.actors.map(h=>[h.actor_id,h])),a=new Map(t.actors.map(h=>[h.actor_id,lS(h,s)])),d=new Map,p=new Map,l=new Map,f=new Map;for(let h=0;h<t.episodes.length;h+=1){let _=t.episodes[h],y=h+1,w=r.get(y);if(!w)continue;let I=pS(_,w.duration_ms);for(let E=0;E<_.scenes.length;E+=1){let A=_.scenes[E],k=A.actors.map(D=>c.get(D.actor_id)).filter(D=>!!D);for(let D of A.actors){d.set(D.actor_id,(d.get(D.actor_id)??0)+1);let R=c.get(D.actor_id);if(!R)continue;let S=a.get(R.actor_id)??[R.actor_name],M=[],$=D.state_ids.length===1?D.state_ids[0]:null,T=$?R.states.find(O=>O.state_id===$):null;for(let O of A.actions){let j=Mm(O),Z=Nm(j,I);if(!Vd(Z,w.duration_ms))continue;let De=uS({action:O,actor:R,actorCount:k.length,allActors:k,surfaces:S,surfacesByActor:a,stateName:T?.state_name??"default"}),J=De??(T?fS(O,k,a):null);if(!J)continue;let be={actorId:R.actor_id,episode:y,episodeId:_.episode_id,sceneId:A.scene_id,timestamp:Sm(Z),milliseconds:Z,durationMs:w.duration_ms,stateScore:J.stateScore,identityScore:J.identityScore,selection:J.selection,sourcePath:w.path,sourceSha256:w.sha256};if(M.push(be),De){let Qe=`${y}:${Z}`,L=f.get(Qe)??new Set;L.add(R.actor_id),f.set(Qe,L)}}if(M.length>0){let O=p.get(R.actor_id)??[];if(O.push(...M),p.set(R.actor_id,O),T){let j=`${R.actor_id}:${T.state_id}`,Z=l.get(j)??[];Z.push(...M),l.set(j,Z)}}}}}let u=(h,_)=>{let y=c.get(h),w=c.get(_),I=y?.importance==="background"?1:0,E=w?.importance==="background"?1:0;return I-E||(d.get(_)??0)-(d.get(h)??0)||(y?.actor_name??h).localeCompare(w?.actor_name??_,"zh-CN")},m=[...l.entries()].flatMap(([h,_])=>{let[y,w]=h.split(":"),I=y?c.get(y):void 0,E=I?.states.find(R=>R.state_id===w),A=mS(_,"stateScore",f);if(!I||!E||!A)return[];let k=`state:${I.actor_id}:${E.state_id}`,D=dS.map(R=>{let S=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),M=Math.min(S,Math.max(0,A.milliseconds+R)),$=Sm(M);return{evidence_id:`${k}:${A.episode}:${$}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:$,offset_ms:R,selection:A.selection,source_sha256:A.sourceSha256,source_path:A.sourcePath,frame_path:`evidence/frames/${I.actor_id}/${E.state_id}/ep_${String(A.episode).padStart(3,"0")}_${Im($)}.jpg`,frame_status:"pending"}}).filter((R,S,M)=>M.findIndex($=>$.timestamp===R.timestamp)===S);return[{evidence_id:k,asset_kind:"actor",actor_id:I.actor_id,actor_name:I.actor_name,state_id:E.state_id,state_name:E.state_name,samples:D}]}).sort((h,_)=>u(h.actor_id,_.actor_id)||h.state_name.localeCompare(_.state_name,"zh-CN")),g=[...p.entries()].flatMap(([h,_])=>{let y=c.get(h),w=Cm(_,"identityScore",f,cS,aS);if(!y||w.length===0)return[];let I=`identity:${y.actor_id}`;return[{evidence_id:I,asset_kind:"actor",actor_id:y.actor_id,actor_name:y.actor_name,samples:w.map(E=>({evidence_id:`${I}:${E.episode}:${E.timestamp}`,episode:E.episode,episode_id:E.episodeId,scene_id:E.sceneId,timestamp:E.timestamp,offset_ms:0,selection:E.selection,source_sha256:E.sourceSha256,source_path:E.sourcePath,frame_path:`evidence/frames/${y.actor_id}/identity/ep_${String(E.episode).padStart(3,"0")}_${Im(E.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((h,_)=>u(h.actor_id,_.actor_id));return{version:2,source_sha256:i,items:m,identities:g}}function Um(e){return Nm(e)}import*as ui from"node:path";function Vm(e){return ui.extname(e).toLowerCase()}function gS(e){return td[Vm(e)]??"application/octet-stream"}function hS(e){let t=ui.basename(e,ui.extname(e)),n=t.match(/第\s*0*(\d+)\s*[集话回]/u)??t.match(/(?:^|[._\-\s])(?:ep(?:isode)?|e)\s*[._\-\s]*0*(\d+)(?=$|[._\-\s])/iu);if(n)return Number(n[1]);let o=t.match(/\d+/);return o?Number(o[0]):null}function Pm(e,t){return new x(e,{exitCode:b,errorCode:"INGEST_VIDEO_DISCOVERY",hint:"Name every episode file with a number, or none of them, and rerun `scriptctl ingest`.",data:{actual:t}})}function $d(e,t){return{episode:t,path:e,ext:Vm(e),mime:gS(e)}}function Ds(e){if(e.kind==="text")throw new x("discoverEpisodes received a text source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});if(e.kind==="video-file")return[$d(e.path,1)];let t=e.files,n=t.map(hS),o=n.filter(r=>r!==null);if(o.length===0)return t.map((r,s)=>$d(r,s+1));if(o.length!==t.length){let r=t.filter((s,c)=>n[c]===null).map(s=>ui.basename(s));throw Pm("Some episode files carry a number and some do not.",[`unnumbered: ${r.join(", ")}`])}let i=new Set;for(let r of o){if(i.has(r))throw Pm("Two episode files resolve to the same number.",[`duplicate episode: ${r}`]);i.add(r)}return t.map((r,s)=>$d(r,n[s])).sort((r,s)=>r.episode-s.episode)}import*as $m from"node:fs";import*as Dm from"node:path";function Gm(e,t=[],n){let o=new Map(t.map(r=>[r.episode,r])),i=n?Date.parse(n):Number.NaN;return e.map(r=>{let s=Dm.resolve(r.path),c=$m.statSync(s),a=c.size,d=Math.trunc(c.mtimeMs),p=o.get(r.episode),l=p&&p.size_bytes===a&&p.mtime_ms===d,f=p&&p.size_bytes===void 0&&p.mtime_ms===void 0&&p.path===s&&Number.isFinite(i)&&c.mtimeMs<=i,u=p&&p.ext===r.ext&&p.mime===r.mime&&(l||f)?p.sha256:ma(s);return{episode:r.episode,path:s,ext:r.ext,mime:r.mime,sha256:u,size_bytes:a,mtime_ms:d}})}function Gs(e){return Se(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as yS}from"node:child_process";import*as ot from"node:fs";import*as Bm from"node:path";var _S=20*1024*1024,wS="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function ES(e,t){return["-y","-loglevel","error","-i",e,"-vf",wS,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function xS(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=yS("ffmpeg",ES(e,t),{stdio:["ignore","ignore","pipe"]}),s="";r.stderr?.on("data",a=>{s+=String(a)});let c=()=>{r.kill("SIGKILL")};n?.addEventListener("abort",c,{once:!0}),r.on("error",a=>{n?.removeEventListener("abort",c),i(a)}),r.on("close",a=>{n?.removeEventListener("abort",c),a===0?o():i(new Error(`ffmpeg exited ${a}: ${s.trim().slice(0,300)}`))})})}async function Jm(e,t,n,o){if(ot.existsSync(t)&&(ot.statSync(t).size??0)>0)return{path:t,mime:"video/mp4",transcoded:!0};let i=0;try{i=ot.statSync(e).size}catch{}if(i>0&&i<=_S)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(ot.mkdirSync(Bm.dirname(t),{recursive:!0}),ot.rmSync(r,{force:!0}),await xS(e,r,o),!ot.existsSync(r)||ot.statSync(r).size===0)throw new Error("ffmpeg produced no output");return ot.renameSync(r,t),{path:t,mime:"video/mp4",transcoded:!0}}catch(s){try{ot.rmSync(r,{force:!0}),ot.rmSync(t,{force:!0})}catch{}if(o?.aborted)throw s instanceof Error?s:new Error(String(s));let c=s instanceof Error?s.message:String(s);return{path:e,mime:n,transcoded:!1,note:`transcode failed, uploading original (${c})`}}}import{spawn as SS}from"node:child_process";import*as Ve from"node:fs";import*as Km from"node:path";var IS="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",AS=4;function kS(e){let t=Um(e);return t===null?null:(t/1e3).toFixed(3)}var bS=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=kS(t);if(i===null)return{ok:!1,error:"invalid timestamp"};try{if(!Ve.existsSync(e)||Ve.statSync(e).size===0)return{ok:!1,error:"source video is unavailable or empty"}}catch{return{ok:!1,error:"source video is unavailable"}}Ve.mkdirSync(Km.dirname(n),{recursive:!0});let r=`${n}.part`;return Ve.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=SS("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",IS,"-q:v","3","-f","image2",r],{stdio:["ignore","ignore","pipe"]});a.stderr?.resume();let d=()=>{a.kill("SIGKILL")};o?.addEventListener("abort",d,{once:!0}),a.on("error",()=>{o?.removeEventListener("abort",d),Ve.rmSync(r,{force:!0}),o?.aborted?c(new Error("aborted")):s({ok:!1,error:"frame extractor unavailable"})}),a.on("close",p=>{if(o?.removeEventListener("abort",d),o?.aborted){Ve.rmSync(r,{force:!0}),c(new Error("aborted"));return}if(p===0&&Ve.existsSync(r)&&Ve.statSync(r).size>0){Ve.renameSync(r,n),s({ok:!0});return}Ve.rmSync(r,{force:!0}),s({ok:!1,error:`frame extraction failed (exit ${p??"unknown"})`})})})};function vS(e){let{source_path:t,...n}=e;return n}async function Bs(e,t,n,o=bS,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(m=>m.samples),...(t.identities??[]).flatMap(m=>m.samples)],c=new Map,a=0,d=async()=>{for(;;){let m=a;if(a+=1,m>=s.length)return;if(n?.aborted)throw new Error("aborted");let g=s[m],h=e.path(g.frame_path),_;r&&Ve.existsSync(h)&&Ve.statSync(h).size>0?_={ok:!0}:(Ve.rmSync(h,{force:!0}),_=await o(g.source_path,g.timestamp,h,n)),c.set(g,vS({...g,frame_status:_.ok?"ready":"unavailable",..._.error?{error:_.error}:{}}))}};await Promise.all(Array.from({length:Math.min(AS,s.length)},()=>d()));let p=m=>m.map(g=>c.get(g)),l=t.items.map(m=>({...m,samples:p(m.samples)})),f=(t.identities??[]).map(m=>({...m,samples:p(m.samples)})),u={version:2,generated_at:new Date().toISOString(),source_sha256:t.source_sha256,items:l,...f.length>0?{identities:f}:{}};if(e.has("evidence/state-evidence.json"))try{let m=e.readJson("evidence/state-evidence.json"),g=h=>JSON.stringify({version:h.version,source_sha256:h.source_sha256,items:h.items,identities:h.identities??[]});if(g(m)===g(u))return m}catch{}return e.writeJson("evidence/state-evidence.json",u),u}import*as jm from"node:fs";import*as zm from"node:path";import OS from"proper-lockfile";async function fi(e,t){let n=zm.resolve(e);jm.mkdirSync(n,{recursive:!0});let o=null;try{o=await OS.lock(n,{realpath:!1,stale:12e4,update:1e4,retries:0})}catch(i){throw new x("The ingest workspace is busy.",{exitCode:fe,errorCode:"INGEST_WORKSPACE_BUSY",hint:"Wait for the other ingest or skip command to finish, then retry.",data:{actual:[n,i instanceof Error?i.message:String(i)]}})}try{return await t()}finally{await o()}}var pe=Qt,RS=pe(85);function NS(e,t){let n=pe,o=t[n(21)]()?n(127)+t+`
|
|
252
|
+
`:n(84);return n(23)+e+n(17)+o}function Dd(e,t){let n=pe;return new x(e,{exitCode:fe,errorCode:n(78),hint:n(40),data:{actual:t}})}var Gd=e=>{let t=pe;return typeof e===t(13)?e[t(92)](/\u0000/g,""):Array[t(48)](e)?e[t(80)](Gd):it(e)?Object[t(120)](Object[t(108)](e)[t(80)](([n,o])=>[n,Gd(o)])):e},it=e=>typeof e===pe(93)&&e!==null&&!Array[pe(48)](e),W=e=>typeof e===pe(13)?e[pe(21)]():"",Fe=e=>Array[pe(48)](e)?e:[];function Qt(e,t){e=e-0;let n=Bd(),o=n[e];if(Qt.hBEzAX===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,m=0;u=c.charAt(m++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};Qt.QXybbD=i,Qt.TiUcli={},Qt.hBEzAX=!0}let r=n[0];Qt.oSeAPE!==r&&(Qt.TiUcli={},Qt.oSeAPE=r);let s=Qt.TiUcli[e];return s===void 0?(o=Qt.QXybbD(o),Qt.TiUcli[e]=o):o=s,o}var Ym=e=>{let t=pe,n=W(e);return n?n[t(118)](/[((//,,、]/)[0][t(21)]():""},MS=e=>[...new Set(Fe(e)[pe(80)](Ym)[pe(28)](Boolean))],Hm=e=>{let t=pe,n=[];for(let o of Fe(e))if(t(14)!==t(14)){let i=_0x3a6f68(_0x2bd625);return i?i[t(118)](/[((//,,、]/)[0][t(21)]():""}else{if(!it(o))continue;let i=Ym(o[t(134)]);if(!i)continue;let r=W(o[t(43)]),s=n[t(88)](c=>c[t(134)]===i);if(s)if(t(4)===t(4))!s[t(43)]&&r&&(s[t(43)]=r);else return new _0x1235fc(_0x19c748,{exitCode:_0xad80eb,errorCode:t(78),hint:t(40),data:{actual:_0x47c6c5}});else n[t(45)]({name:i,description:r})}return n},LS=[pe(113),pe(6),pe(52),pe(34),pe(121),pe(9),pe(117),pe(36),pe(56),pe(75)],Fm=e=>{let t=pe;if(!it(e))return;let n={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:Fe(e[t(124)])[t(80)](W)[t(28)](Boolean),voice:""};for(let o of LS)n[o]=W(e[o]);return n},Qm=e=>{let t=pe;if(!e)return Number[t(100)];let n=e[t(118)](":")[t(80)](Number);return n[t(49)](o=>!Number[t(95)](o))?Number[t(100)]:n[t(44)]===2?n[0]*60+n[1]:n[t(44)]===3?n[0]*3600+n[1]*60+n[2]:Number[t(100)]};function Bd(){let e=["ywrK","BwLTzq","zw5YAwnO","Dg1bvKi","EMvQqNu","DgLTzq","yxbWyxjLBNrFywDL","C2HVDhm","Cgf0Aa","Bw91DgG","Dg9ju09tDhjPBMC","igfUy2HVCNmGC3rPBgWGAgf2zsbUBYb0Aw1LC3rHBxaGywz0zxiGmYbYzxrYAwvZlG","zxzPzgvUy2u","C3rYAw5N","zwnLBeS","z2vUzxjHDgu","ywn0","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHoI/LowBNUs4Gos4QIbku09oiowVUEIXOEoaGUwpQUI/LowBNIbku09oioACRoI6Q++8Jos4JEIMGEI+K+whUUINO+MhIUoaGEwjJEIOGoAiLIbnyxjRzg93BIdKU6pNOihLNzFJGijZy2vUzxmG6ycq5zY66kAg55Uw5ywO6zUg77YB5Q+p5zY65ywi54US56Ul5A6m5OIq6ycq6zwCihnOB3rZ77Ym5yAn54US56Ul5A6m5OIqihzVAwnLC+oaGNnOB3rZiow/HEMHU+IMHUEBLUAVJ+ASOEwiH+MvNowsJowpR+EHRUIUPoEAHoArHow9Ss/OOAJMVjtLJ5JLJjBVViZKUi3LJRVPH43PH43LPi3PLzZLPltVViZKUi3LKiJLUBBLHyJLKi7LJ5hNLj/NMOtLIiBPLzZMIjBLIQJKVzZVVjT2B2LJzxmG5A6m5Pw05l+D55wz5y6F5AoW5BM25zYO6lEO6zwC5PE25OYj6iEQ54s26k+T5y+L5OUg5yIg44ccCMvNAxn0CNLFzgvSDgeG5y+Q5OQL5AkE6yEp77Yi5BEY55+L5lIu5PEG5PAW5l+H5OgV55Qe5A6E5l2t5lIn6kAb5yAz77Yj44cc5A6m5OIq5yMn5yIg5yIR5Asn5Qc4ihnOB3rZioEAHowiH+MvNooaGEAzR+wiQY/OP5lLUQyV6l+q6zwCl+AEHowBVI/NHkBNGRNJGihLJ6/OP4hOOAJMVjtLKOZNQ5NKVy3LHBpNS7VVViZKU6xLJ4OGDM9Py2vZioEAHowfQoMdQos6UUwJSos4JUINHUMIKEACGowqJUwnGEENKUoaGGOk","y2HHCMfJDgvYCW","tKzd","ywrKx3jLy29NBML0Aw9Ux2fUy2HVCNm","DhjPBq","DgLTzxn0yw1Wx21PC3nPBMC","6kEJ5P6q56YSia","rxbPC29Kzsa","DgLTzvjHBMDL","CMvM","DMLZDwfS","zMLSDgvY","C2XPy2u","y2fUB25Py2fS","u3D0DvK","y29UDgvUDa","yw5JAg9YCW","yNjVD3nFzxLLCW","ioADOEMvNowKToAiLUwJSoMFS+E8UUwWKsb0C++8JoACQUIIQ+AoPEwpL+oaGUE8UUwKSEs9JEE9RU+8MG","AgfPCG","tunUDvC","xs5HBMnOB3jZwW","yxbWzwfYyw5Jzq","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbGC2nYAxb0y3rSigLUz2vZDgaGDg8GCMvZDw1LlG","C29YDa","zgXN","zgvZy3jPChrPB24","BgvUz3rO","ChvZAa","C3rHDgvZ","CMvNAxn0CNLFzgvSDge","AxnbCNjHEq","C29Tzq","cGRKUiRMRkhOVPpLH7RMNiKG","B3bLBL90AhjLywrZ","zMfJzv9ZAgfWzq","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbPBMDLC3qGDg8GCMvZDw1LlG","tfvtzxi","B3bLBMvK","yNvPBgq","xsaO","CM9Szq","zxbPC29Kzsa","z3PJyK8","C3rHDhvZ","BM9YBwfSAxPL","C2nLBMvZ","A2v5CW","y2XVC2vK","y2fUB25Py2fSx25HBwu","DMfSDwvZ","44cc6k+36yEn5PAW6kEc55Yl5B2t5yMn6zUg77Ym5lI65Q+p5lIa5P2HihnOB3rZiowsJcb2B2LJzxmG5AgR5yAz55YF5A6E6lw354k5ihrZ77Yitu06u1pVViNVViZKUi3LVPFNVlRLPlhJGihNLzNNQBRMIjBLOASGBNvSBo+8M+I/LowBNUwUJoAvTcbku09o77Ym5lIn6kAb5y+Q6l+u5zUE5l+U6kgL5A2x5Q6144cc","DgHPBMS","su5hrvnux1zjrevpx1rjtuvtvefnuf9nsvntsu5h","oIbZzxjPywWGB3v0Chv0ihrVBYbZAg9YDcaOzMLUAxnOuMvHC29Upq","A2LUza","ywn0B3i","ChjVCa","DM9Py2u","CgfYC2u","zMLUAxnOuMvHC29U","su5hrvnux1zjrevpx1nfuKLbtf9gquLmruq","Bg9JyxrPB24","BwfW","ywXPyxnLCW","y2fUB25Py2fSAxPL","C3LUB3bZAxm","77Yi6l+z5PIV56YS5lIa6zUg77Ym5PQc5PEG5BEY55+L6k6+5A6A44cc77YjcG","5l2G5PIV55+T5yMN6kEg6Akr6l2S5yMN5PYS55Qe5lIY6kgm6kEJ5P6q5zMO44cc6l6t5ywL5PIVkIRMN5dKUidPM4yQkUERLUwXJ+EFREwjP+INHUMIKE+8IdeTmIdLIiBPKP/VViKRios4Gos7VEwiSos4IUs4GoMBHUs4UUATOUE0R+ENR+EAHcOQ5BEY55+L6k6+5A6AkIRVViJKURRNIANOIRhLKi3LHOWV5yMN5Oof6l+B5Bgvl+ACQUMxREwqIoE6V+E0OU+8IEoaGUs9OoIMGEI+K+whUIOQ5lIa5lIQ57Ut5P6e5yYwiePtt04G5A+56lgHkIRVViJKUkxMOlZNRkBLKiJMNkZKU7VLIQhLRPRKUyNNMOqGsLnptIdNU5pMNOtVViNVViZLKiZML7BLJixLKkVVVjRIKAdOV5NKUidPM4BLSl3PH4/LV6dLRP7OV5JLJP/LJP/NIyFNMOqQkUwiHUMvNowjP+ACRcOQ77YiC2nLBMvZ77Yj77YB4PgH5A+55BEY55+L6k6+5A6A55QekIRLOP7PH4/NU7tMIQqQkU+8IhjLz2LZDhj5x2rLBhrH77YA5lQ654MP6iQX5zcn5yAm5BIM54Q25Ocb5Qch5RoO44cb6kEe6iYd5zcn5y2h57QN77YjkYdLIAFMG4xNUR/NTklVViHVCgvUx3rOCMvHzhpVViNJGiiQkUwpQUI+K+whUUIVPsbku09o77Ym5lIn6kAb5lU75l2v6AkD5Asw5PAh5A2x44cb6kEJ6yEk5OIw5lUJ56cb5z2x5yYf6ko544cckIOk5Qc45B+d6kAb5Rgc77YA6ycq6zwC5l+D55wz5y6F54Mh55Qe5y+V6kEb5l+H5OgV44cb5lQ654MP6kgO5RYu44cb56Uz5l2n5ywZ57o744cb5Pge5B2X6lcd5BQM5lIo5ywO6yoO5AoW6z+Z77YB5yQO5l2Cl+wVUEEzVs/LRP7KVzpLH4BNOA7VViZKUi3OHjhOOAxVViZML7BPL7tMIlpLR7NPVzdNLlVPNAlJGiik44cq5PE26zE05OIZ6ycq5P2H5B+f5AgR44cr5Q+p5lIa5P2HihnOB3rZiowsJcb2B2LJzxmG6yo95B+f6Ag75AgR5yAz6k+L6zwC5As05OIw5AoW6z+Z55YF5Q2J5BYa5AEl55Qe6z2E56M6ihrZ77Ym5Qc85BYp5lIL5Qc85lI6ie1noLnt77Yi5l6l5AAc44comda6mdpJGi/VViNJGilKUi3LVPFNLzNNQBRJGihLOASGBNvSBooaGEwHQ+ACQUEFPEwaVoAiLUECGEEvPEwTL+AUTE+8M+s4JEEHRUwUMUAxTUMhJEAwSoINGUECI+EuU+MDOUAiLUwqRoMFS+I9Qo+8JowHQ+wgMEACGoAoPEI/KEEAHowUNUMzHEI1T+EcUEoaGUs7U+s4GoADOEE8UUwWKEwqIoAZLsb0CYdML7BVViZMLBtKU70GsLnptIdPG73KUi3OG73MJ5dKUQtJGiikC2nLBMvZiow/HEMHU+wmHEwqQ+ACRoMBHUwUNUMzHEwpR+INGEEAHowCUUAzR++8JoIhS+wWKEs4GoMHUE+8M+AxOoAwSos6UUEjQEoaGEAxOowVUEEzVEAiLUAYOEACIEIUVUwUMUwINUMhJ+AxTUs7JEMHU+wUJoAvToIUSow9LEACRoMBHUEuU+MDOU+8Jos4JEIdVEwpQUI/LowBNUAIL+AMGUAiLIbYzwDPC3rYEv9KzwX0yE+8Jos5N+s4JEIdVEEuQoEPUIbZy2vUzxmG6kgO56s65Rk/55sO5lIk6zUg6k6+5A6A44cccUoaKownLEASOEINO+AEKoMHUUw6J+kaLokaLow/HEMHU+s+NEASOEwUJoAiKooaKEESRos4GoATPE+8Jos7JUINHUMIKEw8GowKTowiSoE7K+wWVUwUJoAvTowqRos4GoMbJEMFS+I9Qo+8JoAmIEAxTUMxToMHUUw6J+EBMoEcUEAjGoACIEwpR+I+QoIVHUs6UUwJSo+8JowHQ+wfPEwqHcbZy2vUzsdNMOqGDM9Py2vZ77YB56YS5lQm5Q2L77Ym5lUo5BYa5As05yIW57Ut5Bc+6ycq6zwC55Uy54k55Q+p5QYH5yIh6zwC44cb6l+E57UT6zwC5As05yAf55Qe5Pge5B2X5y+y5yYw44cb55s76z2I5lI75l2t44cb56Uz5l2n44cb5yQO5l2C44cb6kgO5Oof44cb6kEg57Q/44cb5O6L6kEM44cb6ygt5yw35zkm546V5Akd5y+y5yYw77Ym5AgR5ywL5zceihnJzw5LioEAHcbZAg90C++8M+ESRos4IEATPE+8JowiHUwiQ+wKJEAGUcb2B2LJzxmG5PIV5zcM5A6m5Pw044cbC2HVDhmG5PIV5zcM6ycq6zwC6kAg55Uw5ywO54Mh44cc5A6m5OIqiePtt04G5yMn5yAn5QYH5Asn5Qc45PYa5zco5y2b56Es77Ym56gU6k6K5O+s5ywL55s76z2I44cb5OMl5PY6l+wXJ+w5LEEuU+MDOUoaGEwBNUw/HUoaGEIsMEwKQUwLH+oaGEMhJEwKJEEuU+MDOUoaGEwpJEAjK+wsJoEjH+wWVUwjJEwpJEw6LoMdVEAYOEACIEA8J+wgMEoaGUEBMoEcUEwsJowKJEAGUowpQUwCQowgHEMdQowUJoAiKo+8Jos4JEwpPUwINUI+K+whUUwTL+AUTEoaGGRJGjdOUQVKU73LVzlLSz7IGjtIGjtMNkZKU7VLIQhPH43NGRNJGjhLUkBNNydLT7lNN6xORR7LRPRNNiVOV5NKUidPM4BVVjOklsdLH7RNJRdNMOtKURRLHyJLIktMLQ0QkUAyR+s4JEAyR+IkSEwqJEwgJoMhJow3SUACIEEAHoAFKos4QUs6UIOQ77YA5lYy5ywi5Q+u5A+55AsA5P2HihjLy29NBML0Aw9Ux2fUy2HVCNmG5zkmigLKzw50Axr5x3bYB2zPBguG5lIT6lEO6ycG5z6l56IZ5A6A55Qe6is46yoO57Ut5P6e44cb5zU65A6A5Qch6k6W44cb5y+r6zMf57Q/l+w4UoAaGEwpKEwEI+oaGEMQQoAETUs9K+wEI+s4JUwJSoE6V++8M+ACJEIJHEoaGEwMHUwUUEwsJow9K+s4I+wNV+AaGEwpQUs9Now8SEI+HEwkQE+8JhjVBguG5y+Q5O+q5l6B6kEs6iMY6k+T5Akd77Ym5lIn6io95PU/5lUJ6kEg6kEj6k+b5O2U44cc56IZ5A6A54M55B6b5lIa6iE05OMn5Rk/55sO5yw2kIROP4tOJipLKi0QkUoaGUIlPEwfS+MuRUEOS+wUMUEjUEw+GEwgSUEQGE+8Jos4JEIMGEw8UUIHJowqIow5TU+8Jos/NEEvMEAiLUEzU+IUSoElRoERIYbWCM92AxnPB25HBcdOUQVKU73NRyNLVOxNM7tMJQxOR4hMJA7JGiiklsdORQtKUi3LH7RJGihKUz/MSQhLKkZLIldMNkZLKi3NMOtKUROG4OEsicOQ5lIn6kAb56gS54YC44cb5lIn6kAb57Yw5BIM5AEt55Qe5ygh5zcnkIRJGilNLkJJGi7NQlpLRPRLPjBOP4lNIBNLVOeR5BM06B6e5Q61k+AaP+wiQ+oaJ+AEHoAiKos4JEwqQ+wNK+AWJ+EAHoApJ+I/SowqJE+8Jhn0yxr1CYdMOiCGyhbYB3zPC2LVBMfSyo+8Jos7JEMCGowHQ+wgMEwUJoAvTowpR+INGEI6Q+s7VEEuU+wdJ+oaGEIVHUwiQ+MuMUEcUEs4JUs9NoEuQooaGGOTioApJ+I/SowqJEoaGEEUGoENSoAiLUs4JEwUJoAvTowNK+wqJEwpQUACIEwCQoACRoMBHUwhUUEoScOQ5lMM6z2I5Q2J5BYp5AEt5zcn5OIw5y+W6k+n55U05O6L6k+05yE65PYS5zcnkIRML7BMIy3OG73LJyFNUQFOP4tOJipLKi3VVjVLNkGGCMvNAxn0CNLFzgvSDgeUy2fUB25Py2fSAxPLiowgMsb7zNjVBv9Uyw1LlcbJyw5VBMLJywXFBMfTzsWGzxzPzgvUy2v977YmzxzPzgvUy2uG5B+f6Ag75yAz5PIo5PE26zE05OIZ5zkm5B2t5PE25y+V6kEb55Qe5y6F5PAh5OIw5zcS5yIW55Qe5y6F6k+D44cc5yMN5Oof5ywZ57o75y+Q6io95BIU5yQP5yIK5PAT5PIV5lIn5PIV5zcm5lIa5lIQ5lQ677Ym5lIn6io95y2v54US5l2C5lI65Ps55zcn6k+b5O2U44cccI0G5A6m5OIq5yMn5OMN6kgm6lwe5lQN5A+56lsM77YA5Rgh5Oc7ihnJzw5LCY5SB2nHDgLVBUoaGxnJzw5LCY5JAgfYywn0zxjZ44cbC2nLBMvZlNbYB3bZios4JUs6UUEjQsb2B2LJzxmUC3bLywTLCIdKUk3LH7RNJRdNMOtMR4/KUkROTytKUQFLKi3VViZPGjdPOBNNOA7ORQtLROpOG73OP6pMNPdLIldLT7lNN6xORR7LRPRJGifYzwDPC3rYEv9KzwX0ys5UzxDFzw50AxrPzxmG5OIw5PYS6zUgignHBM9UAwnHBgL6zsdNMOtNM67MOiFJGilKU7VKVzxMNkRNMBVORRdKURRNIANLV4xPOBVOOAxLHAuGBMv3x2vUDgL0AwvZiow5TUwHQ+wgMsbPzgvUDgL0Ev9WCM9MAwXL44cbCMvJB2DUAxrPB25Fyw5JAg9YC+oaGxjVBguG5lIoihn0yxrLC++8M+ACQUEzU+IUSowCSoEcUs/PGzpLHBFLV4xPOBVLOAVLHPKGyxbWzwfYyw5JzEoaGxjVBguG5lIoihn0yxrLC+oaGUIlPEs4Gos4QUEjQEs7TUs4JEwaVow+L+AiKos4UUwfS+MuRUMbK+wfT+I1Hos6P++8JowWSEs7JIbZy2vUzxmUChjVChmG56E76zMK44cc5A+56lsM5BEU6zUg6z2E56M65PE25lIn5B6x6l6t5yE6iePtt07JGilOP4tOJipLKi3LJyFNUQFLKi7NQ4VLJBpKVB/NLkGGy2fUB25Py2fSx25HBwxVViZKUi3ORQNMRApMLOFOTytKUQFLKi3OHlhNPRVOIRhLKi3LHOZJGiik44cq5lQ654MP6lQR5lU955s75yop44cr6AAw5QYH55M76k6W5lQ654MP5PE277Ym5lUo5ywO54Mh5AsA5lIQ5RIf5PMW6kEs5BQM57U85zci5AgR5yAzigLKzw50Axr5x3bYB2zPBgxVViZOGiZKUi3MMk/NLkJKUidLJ6xNRlZNU5/LPjBOSOZMPOlMI6ZJGilPGjdPOBNORRdLVzxLJ6/OP4hMGkFLIkVKUi7LUBtPVOtMRRxJGihOHlJLNOSV6AkN6AQOl+s4I+MIJooaGEECIEECVooaGEM8U+MdQooaGEMDMEAaGEwuH+w9OUs4JUwpO+wrQooaGEEOS+wUMUIcPoIjSUwsJoMDOUMdQoEjUEw+GEoaGEEOS+wUMUwpKEIjSI/LJ5hPMyxNUR8V5BI45Ocb5y+r5z6l44cb6AQO5P625l2t5z6l44cb5zU65A6A6lQR5l2t5Qch6k6W77YB5AoW57Q/5lUf5l6D5O2U5RIf5PMW5y6F5AoW5AgR5yAz44cc55Yl5lIn5RIf55Qe5A2x5Q6155wz56M677Ym5lIn54YC5Rwl44cc5O+p6l+W5l2/55sO5y+V6kEc5A+F55Qe5B2I54Q244cb5Q+u5l6l44cb5l2n572U44cb6AkC6iMY5lIo57Q555cg77Ym6yg/5ywn5A6H576o44cb5Rcu6lsO44cb5OcN5Qc844cb5Oof57UQ5zkm5yMN5Oof6k+e5lU344cc5PYn6AwW44cb5AAg5A6544cb5y+V5Pgy6AwW5zob44cb5B2t5lIl6kgO5Oof5lIo6kEg57Q/44cb5yQO5l2C44cb5AE/5Ocb44cb5lI05PE25lYK55Evl+IHGoI/Us/MSAhMUi3JGihLJ5JOUQVMIjBLHBBKU5BPMlBMRRxMGkFLVAlMGihLSz7KUO4GC3rHDgvZioAiLIbZAg90C++8Jos4JEA3T+wfPEI6Q+s7VEEuU+wdJ+oaGUwHQ+wgMEwUJoMaKowTL+AUTEAJGoAFPE+8MUwbH+IUVUs6UUEjQEAnOUIJHEoaGEwnUowMHUoaGEArMoAoIEMfJEMLSooaGEAuUEwpMoIHQoAdHEw5TUI/M+wfPEwpPUs4GowCUUAzR++8JoIVPEApJ+I/SoAyR+wqPUs7JEAiKoERI++8M+s4JEAiKoERI+wWSEs7JIbPzgvUDgL0Ev9WCM9MAwXLioENU+whUUoaGGRJGjdOR4BLIkVPLjRNGRNJGjhKURRNIAKGCMvJB2DUAxrPB25Fyw5JAg9YCYdLHPKGmY02ioADOEACGoMaGUwqIoI3QoMBHUMhJEIUPoEAHoE7HowqIoEjUEw+GE+8M+AVJ+ADOEIhS+wWKEE7HowqIos4Pos4QUADPEIhQIbPzgvUDgL0Ev9WCM9MAwXLioEAHoEOS+wUMUoaGEwpR+wmUUwiHUE6V+E0OU+8Jow5TUwWVEMhJ+IMHUEBLUIeUoMdQoE7K+AEHooaGEs6LowUMoAVLos+I+oaGEwBUUwUMUI6Q+s9K+AGH+IUSooaGEwpKEMzHEE6VY/LUlJMGihLPltLJ5hJGihPQQJMNRBKVzpLNOVMIjBLO7dNUR/NRyNKUi3LKiZNU7tLUQBJGilPLjRNGRNKUi3LVPFLJixLKkVMNi3OO4xJGihLIlBMNi3LJ7FNOihJGihLUl3LRzdJGihNNlZPLzZMIjBLHBBKU5BLJ6/MKzJPHy3PPBdJGihLPOBLRRNJGihLVzpKUiVNPz7MG4uV5yQO5l2Cl+wNV+AaGEoaGEs4ToAxTUs8PoExLEAXOEA4JEoaGEwjP+AdHEI6Q+s7Vs/OG73LIPSV5ywZ57o744cb5y+y6lQR5B2I5Ocb5OIw6zQp5zY65PMV5y+y5yYw55Qe54MP5lU244cc5BEY5PYj5A6E5l2t5zYO5PYS6zUg5yE6546W5PU05RIf5PMW6kEs5BQM5PE277Ym55sOigvUCMLJAc5PzgvUDgL0Ev9WCM9MAwXLx3bHDgnOiowpQUIHPEwfHEAiLUs/RUATO+ACIEAwSoIVGEAnRUEAHowTL+AUTE+8Jow5TUEuQcbHzgrFCMvJB2DUAxrPB25Fyw5JAg9YCYdLOP7LIQdMLRdPLjRNGRNVVjVKUi3OPOhMIORMLBtMRRxML6FNLlVLG4/MLlNLHPNMIjdLJ6BKUidLJ6xJGilOVPpLH7RLIy3PGjdMNAhMOlJLR7NVVjRPLjRNGRNKUk3NMOtMR4/KUkROR43PG73OG73LNkGGAwrLBNrPDhLFChjVzMLSzsdMIB7LIldNQlpLRPRKVP3MJA7VViZLKkBLIjNPH43LHPNMIjBLIkdPMAtJGiik44cq5zYW54k544cb6ygt5yw35lIo54Q25Ocb5O+p6l+W44cr5zYW54k5igfWCgvHCMfUy2uG5yAz56M66zE057Ut5P6e44cb5P2q6lsO44cb6iMY5B2P5zkm5zU65A6A6zMi6k6+77YmCM9SzsdLHPNNQBRPL7tNLkJPGjtVVjVPGzpLHBCGyxbWzwfYyw5JzsdLHPNLVAlLIlBJGihMNzdOTkJJGihPOPZOIBlLKOZLSlRLR7JLHBpNS7VVViXYB2XLiowgMEEuQoMaLooaGNn0yxrLCYdNMOtMR4/POBNPG73LV4xPOBVLKiZML7BNU5NLH7RLJ6/LPi3NJRdNMOtPNz7NQBOGzgvZy3jPChrPB27JGilKURRNIANPGkdLNOVLHyJNU7ZLKiJMNkZPM4BLPjRKUkRMUixMMBdPLzZLPltVViZLHO3MJiNKU47LPltLIldOHjRNMOtNQlpLRPRLSylMRkhMJ4/OV7dVVjROR6xPGkdLNOVNIBNMNiNNMOtLJ5hLNOVKUi7LPltPPBdJGihLPOBLRRNJGihPOOJPG6JPPBdNIANJGihLPjBLPzFJGihKUiROO4xJGihKUiVOO4xMIjBOV57KVzpOOApOO5NJGihOOPZNSBVJGihPNOVLSAxJGihMIyVLPzFLJ4RLHBBKU5BPPBdLK4hVVjVMR4/KU7BNNiVMUixNMOtLJzxLK4hLHPNMMi7POPZOIBlJGihMNzdOTkGV5ywj5Ro9l+E6UEEqHUoaGEEjIowEI+s4JUADVUE0P+oaGEMIHUwEI+oaGEIILUwEI+oaGEw8GowqIooaGEIfSoE6V+oaGEMvV+w6PUoaGEs4I+ArHUoaGEwBVUAHIooaGEAwH+wTL+AGH+IVHUoaGEA7MUI+UEAiLUMhKEwXNUs7TU+8Jow5TUwgMEA4HEwgHEwKLUwpOoEPV+wsJoMfJEMLSoAjGowCQos9JEE9RU+8M+AmGEE7REEGToAnN+oaGEIHGoI/UEoaGEAXOEA4JEAiLUwpMow9OUwgMEAyJUMdQos9JEoaGEImG+wBTos4JUMINoIjSUoaGUwpQUECGEEvPEEuU+MDOUACQUAyVUEKUUAiLUAxOoAZLEEHRUIUPoEAHoMHUE+8Jos4JEEuQooaJUEPV+EDGoAFKoACJEIJHEoaJ+s4GowpPEw4PUI/H++8Jos4JEwhREwXGoMdQoMvNowKToIHPEwfQowfQoI6Q+oaGUwCSoEcUEwsJoMbK+wfT+EkTUAaGEwgMEEBUowVUEw4UoAaGEEAHoAmGEE7REwKLUINGUw3RUw8GUoaGUAjGoACIEApJ+I/SowpQUwgMEEuU+MDOUs6I+wUNU+8Jos4JEwgMEwkQos9NooaGEwNV+AaGEoaGEAdHEE7QUoaGEw/G+EqHUAiLUwjP+AdHEIVHos7T+oaGUw3SUEFPEIUVUwUMUs4REw3SUACIEEAHoEkTUAaGEAYV+EuQowfTIbUyw1L77YB5PYS6zUg55Yl5yIW5PU05AsA6kEs5BQM5OIw5PU05RIf5PMW57Ug6iQc5PE277Ym55sOigvUCMLJAc5HzgrFC3rHDgvZioEAHowqJowqJEMHUEIHPEwfQcbKzxnJCMLWDgLVBUoaGGRJGjdOR7tOR53KURRIGjtIGjtNLkJLIAFMG4xPLihLRPRVViZLIkVLJ6RNNiVOHlJJGjhNN63LIAFLUlJMNiNLH6dKUkRPLB/NM7JNM7JKVlZNMOtKUk3OGihLUBtNLlFMGkFPQ5JNRQhVViZLJzxLUkFKURROHlJKVjRORQtPLjNJGilLHyJKU47LJ7dOR43LHOxLRRNJGihLVBZMRAtNP7dLKBZVViJOSihLJ6VOSihJGiZLK6xJGi3JGiXy5Oc744cn77Yj44cb5zY65PMV5ywZ57o777Yi6lcb5Rgc6lcb44cb6lcb6k6T6lcb44cb6lcb5lIl6lEQ77Yj5O6O5PAT6l+z5zY65zYO5zY65PIV6lcb44cb6lcb5A+56lcb6k+077Ym5yAn5A6A6k+06k+D5lQ644cc5yMN5Oof6zsb5A6A5lYy5ywi5lQo5Asw6lkm44cccUoaKowrVEwqJEs8MowfIoE6P+oaKEs5PUMDOUATO+w8J+wNK+wqJE+8Ios6UUEjQEs7I+E7JEADOs/LT6xNIyWV5P2L55s15PI+56s677YjpIdLJ7dOR43LLORLH7RNMOtMNkZLKi0GpIdNUQ/MJ4/OV7dLKi3JGilMNiNKUABPNAlMRApLVi/LP5pLKi3LSlhNLkJLROpLVzpOP4tOJipLKi3VViZLK6RMGjxLHAJPM4BLJ6RLLOROGyZLIQhJGilNU53KUi3LH63NQBRMJy/PGkdLUkBLP5pMSi/NMOtLGyFLKi3JGiik44cq6kEe6iYd5zcn5zsV5lIa5OcN44cr5lQ654MP6kEe6iYd5zcn5y+Q5yAz5AEt5zcn5OIw56IZ5A6A5O+p6l+W5zcn77Ym6kEs6iMY6igm6io944cb5ywZ57o744cb5Ash5RoO5lIn5B6x5AgE6l+B5OUS5y+344cc6l6t5yE65yMn5OYj5y6756M65Qc844cb57UF5lIa5ywO5y2k6kEs5OUS5y+35BM25B+955wL5OUS5y+35Ash5RoO5zco55Qe5y+V6kEb5zcn56EW5Qoa5P+L6iQX5zcn5yAm77YB5lIK5lIQ5lIn5zcm5lQ654MP5lIn5B6x5B6x5yIW5lYA6kkR5B2s5lIa5OIq5zcm5zcn55Qe6kEe6iYd5zcn44cc6iUL5y+W6k+n5y+Q57Uz5yE655U45zcm56EW5zg877Ym5l+D55wz5BEY55+L5lQ654MP5y6F5zcn77Ym5BM257Uz5PAW5lQ654MP5l2/55sO6io95yY65yIg6lQR5lU95lIu5lIn5BIM5OUS5y+355Qe56IZ5A6A5O+p6l+W5zcn77Ym5l6l5AAc44co5AQs5AMg546l5AM244cp77Ym6kEs6iMY6k+05PIo57UN57UT5yAz5zYOihjVBgxJGiik44cq5AoW6z+Z5A6m5Pw05OcN44cr5Q+p5Q615y+V6l6O6k+g55Qe5lQ65AoW6yo95B+f6Ag75zYOihzVAwnLCYdKUk3LH7RNJRdKUjtLJ6RLH7RNJRdKUidMRkhVViZLJixMI6ZKURRNIANLH7RPLzZLR7NNMB3JGihNLlVLPjBLR7NNMB3JGihOP5lOIBlLHOxLV4pNI6ZNMB0V6iEQ6l+W44cb5A6I6kEc5PEb55M944cb55s16k+Dl+w5V+AsRs/ORR7LPiFLO7dJGihOGlpOR63JGihNVQtKVzpLO7dLKOZOT6JNLlVPNAlOV57NU63ORRlOV7dJGilOR7tOR53ML7BNLlVPNAlLIiFMJAlJGihKURRNIANMNkRLH7RPLzZJGihLJ6RMMl7NPlRMTyhNQiVLM74V5zYW5zU+l+AjI+ACUI/LSy/LUzxJGihOV5VLHAxLM57LV4BMIjBOKPNLPkRLPyFJGihPH43LPi3MN5dMRRxNLlVPNAlJGihLJ6pLNOVKUi3LJ6/OP4hVViZPG73KUi3MMk/NNihNLAxLO7dPN7pNMOtNKiBNLlhJGilOV57NU63ORRlOV7dOT6GGC2nLBMuG5OIw6lEO6zwC5PE25OYj6iEQ54s26k+T5y+L5zYO5A+55BQu5PE26zE054k55OUg5yIg77Ym5y6F6k+D5A6m5Pw05l+D55wz44cb5lIn6yEn5lIn5RYp77YB55sO5zcm6k+T6kIa5A+555M95A2x5BMv6ycq5y+L5Qc45A+56z+Z6l2O77Ym5BcK5yw25Qoa5P+L55+T5y+L5zkm5O+s5ywL55s76z2I5lIk55Qe6l+E57UT5AoW6z+Z44cccUoaKowoN+wJSoIVREIOGoMtGEw+I+oaKxzVAwnLCY5JB250zw50ioMaKowTL+s/NEEvMEMFS+I9QowUNUMzHEs9V+EuQoEAHoIVREIOGooaGEAwH+wTL+wsJowKUEADGUIVREIOGo+8Jos4JEE/U+IVKEoaGEs4JEAuUEwgMEoaGEs4JEEuQos4REAwH+wTL+w5LEABV+AnOUwKLUIVREwoN+wJSooaGUIlSEAwH+MFS+I9QoMfJEs4REAwH+wTL+w5LEAxTUwgMEIlSEAwH+woN+IVJE+8M+wnSowWVoIVREoaGEAZSoIVREAiLUwfTUs7LUIVREIOGoMFS+I9QowgMEwVUEw6LoIVREIOGowoN+IVJE+8M+wqJos4GowpPEwpKEEuNYbJB2rLlxn3AxrJAcdML7BMJiNLKkZLIldNMOtPOBRLUO/LJP/MOlFKV53NLzNJGilOR4hMJA7KVjJLHyJNUQFMMk/LJP/LP4VPN7pOVAGGpIdKUi7PN7pOVAJLKiZOR63OQidNMOtLR7NNMB3LRzFLUzuGpIdNV7VOR5hLRzFLUzxJGilLRzFLUzxLJ6ROG73OVOxLIQNOVQJMUixLKiZOR63OQidLJP/OR43VViZKUi3OG73MLlNLJ5JLJ7dOR43OR63OQidVVjVLKkZKUi3MUixML7BKV53NLzNLJ6/NOA7ORQtPG6JLIiBLUBBLNkGGCgfYzw50Agv0AwnHBcdMOiFJGi7LKkZOVQJLVOxLPi3MOlJJGi/VViZKUi3OPOhNLkJNV7VOR5hLRzFLUzxNJjZLJ7dOR43JGiik44cq55s76z2I5PAh5A2x5lIo5Bwm5Awx55s76z2I44cr5BQv6yoO5A+555M95A2x5BMv5PIV5AoW6z+Z5y+W6k+n55Qe5yAx5l2z6k+b5O2U77Ym5lIn5y2v54US5BU6ihnOB3tVVjVNLkJLROpPGjdLJ6xMOlJLR7KGDM9Py2vZioAyR+wqPUwUJoAvTooaGUAjV+I9VEAwSos/OEAbR+EAHoEuU+MDOUAwH+wTL++8Ios6UUEjQEs7I+E7JEADOs/OUQVKU73LPltOOzqV5PE26zE05zYW54k55lQK5lUJl+EZU+E7N+ApKoEKUI/LHBpPLk7PGzpLHBFKUiRNMOtLRzFVViNLHPNLHAxLR7NLUPqGC2HVDc52Axn1ywZJGilMIyVMNlRJGihNM5hMJQFJGihLSy/LUzxJGihNHAFNIyFLKOZLM57LV4BNLlVPNAlLJ6RLHPNLRP7PMyxLJ6/OP4hNMOtKURRNIANLIQJKVzZJGihNIANKVzpLKOZLJ6/OR7VMLOFLRzFVVjVMSQhMNiNNLlVPNAlJGihLJ7dOR43MIjBMLOFLRzFNM7tMJQxOR4hMMi7ML7BVViZKUi3MJQJMLQ3KURRNIANOUQVKVzpNIRBMGihJGihKUOVKU7BLJP/LM6dJGihLIy3LKi7LHBpNS7VMIjBNU5pMNPZJGiik44cq54Q25OcbpEMaOowEI+oaKxn0yxrLic8GC3rHDgvZid0G5lIa5lIQ6kEs6iMY5lIa5Pw05Awx56IZ5A6A5OMU55U477Yi552a6kofk+wpKEwEIYVMJihNU63LPOBPGkdVViZLPOlJGiZMT7hNGBdOPB/OO4xJGi3VViNVViZKUi3MMk/MG4xNU6OV5AE/5Ocb77Ym5lMF5lIn5PIV5y2v5lU26kgJ5PYn44cc57Uz5P+q6kEs6iMY5Qch6ycG5z6l5yMn77Ym5ywi55Yl5BEY55+L6k6+5A6A6yEm5lUw5zcn5lIl55Qe44cm5BEY55+L6ycG5z6l44cn5RIf5y2v4Ocu4Ocu5y+Q6kAb5PYS6zUg5PIV5lUw5BEY5yIx6l+h55Qe5P+q5Awx5OMU55U477Yi5zoQ5Ocv5y+Q5OUn5yIW5lIk5y2k6lQRl+AnOUs6HUINKUw6PI/LHyNNUR/KUi3LKiWV5AsA55Yl5yIW5Bcr55Yl5yIW5lIa5lU25y2v5zob77Yj77YmkIRPGjdLRzFNHAFMIOtMUixLJzxPH4ZPGQpKUkRPGkdLNOVLKi0QkU+8JowpQUACIEAvTowLL+AnOUIJHEAjJEAwSow7UUoaGUMaOowEI+wqJEwpQUwHQ+EUGoA0GEAHO+s9JEwqJE+8JoIVPUE7HUE7HoAiKowfQoMdQowgMEI/MYbZDgf0zs5KzxnJCMLWDgLVBUoaGUI+K+whUUwjJEwKJEAGUoAVJ+s4QUMaOowEI++8MUEuU+MDOUECI+A4HEEAHoACJEIJHEwXGUASOEoaGEEjIowEI+E7K+AEHooaGEADKoI0QoMfJEIjSUoaGEMEI+IINooaGEwMHUwpKEwsJoMfJEMLSoAyR+wqPUw3SUIMHUEBLU+8M+IlPEABToA4HEAzSoMvNowKToIdVEIHPEwfHEAxOUACIEMaOowEI++8JowWSEABToAwSowqJowqJsbKzxnJCMLWDgLVBU+8Jos4JEwpPUw7UUI/KEs5IEMaOowEI+oaGGRJGjdLNlRNLyZKUi7LNldNGRNJGjhKUidLNlRMMk/LNldNGRNJGihOV57NU63ML7BMRRxLKOZLJ5NKUOVNUR/OV57NU63NMOtNLj/KUQFLJzxLHypJGilLRQlLJOxJGihLJAFLRQtJGihLJAVNLj/PL7tJGihLPkFLJOxJGihLUB/LNlRJGihOIj7LJ7dJGihLKi7LJ7dLIiBLIkVKVB/NLkJNI6ZNQ4SGBg9JyxrPB27VVjVNM7JLHBpNQBRPL7tNU5/KUidLKB3LKi3KUlRJGi7OSARLROxcT+wUOUwoHEoaJ+oaJUIXQUwUHCk35y2N5A6K44cp44cc5lQ654MP6lEO6l+h6zEO5QEB6l+B5ywL5y+M5lIa56M66zE044cb5y+z5lQl6l+B5ywL5y+M5lIa56IZ5A6A56M66zE044cb5PIo5PI+6lEZ5PE244cb5yIh5O2I5y+z5lQl57Q/5OIw5PIo56gU6l2S5zY65PE25BU656Ul5PAWihnJzw5L44cc5lIa5lIQihnJzw5LiowpQUwgMEs4Gos4QUs4UYbSB2nHDgLVBU+8M+wqJos4GoI/NUE7REwCUUwgHEEAHos6UUEjQEMaOowEI+wpMowmLUs4JEAyR+wiHUwCUUEqHUEuSEoaGGRJGjdNIRBMGihLJ5JLJjBKUi7LNlRLHOxOTytKUQFJGjhKURRNIANMJAlMLBtLPzFMNi3OO4xJGihLJ5JOUQVJGihOHlhOOApLVAlMIjdLJ6/MJihNU63MLRdLPjBOP4lML7BVViZMIORLJ5JLJjBLIQJKVzZLHPNLHAxLVzpLIy0GC2nLBMuG55QeihnOB3rZ44ccy2HHCMfJDgvYCYdKUk3LKiZKUidOP4tOJipLKi3LJ6RLH7RNJRdKUidMRkhVVjVOR6xMNAhNMOqGC3rHDgvZioAyR+ACRowCUUwhUUEoSoI/H+EAHowfQoMdQoEOS+wUMUMaOowEI+MBHUwqIo+8Jos4JEIdVEA8J+AoIEwpMowmLUwjJEAiLUwpMowmLUwqJUEkTUAaGE+8Jos5N+s4JEAmIEwfIowqJUAlHUAiKoMhJEwKJEs6UUEjQEoaGUwCSoEcUEIIQ+AVGEAiLUwfS+MuRUMbK+wfT+AyJUAyVUwpMow9OUAxTUEzU+IUSowVUEw6LoAwScbZDgf0zEoaGUAdHEE7QUoaGEwNV+AaGEwsJos4GoASOEAaP+wkQos9Nos/NEEvMEwCQcbZAg90CYdNMOqGDMLZDwfS77Ym5lIn5BU656Ulihn0yxrL44cccUoaKoMaKoMvNoI/MowoN+oaKxnOB3rZioAyR+ElRoERI+wiHUMvNoA4HEwnLEoaGUAVJ+ASOEwiH+MvNoMdVEwCQoI1T+wNI+AxTUMxToAwSowINUs4GoADOsbZAg9077Ym5y2Z5l2/5A6d6yEn5Asn5Bgv56s65lMl5yMn55Qe5yQO5l2C5OIw5RkH5PYj5PAW5yMN5Oof77Ym5lMF6kAb5l+D55wz44cc6l+E57UT6zwC5As05yAf55Qe5PMV5yIR44cb5OUn5Pge6kEs5BQM44cb5PY65l2n44cb6zwC5As056E75yQO44cb5P6e5zU+44cb54sM54k55OIw55s76z2I5lI75l2t5y+y5yYw77Ym5lUL5y+k5Q+p5lIQ5PAW5yQO5l2C44cb5y+n5BQu44cb5O6L6kEMl+wiHUw8GooaGEMbK+wfT+AtJEs9Nos4JUE7K+AENooaGEI/M+whUUwCUUoaGEENU+wkQooaGEwNV+wkVY/MNj3LKjeV6kEg57Q/5OIw56M66zE05ywZ57o75y+y5yYw77Ym6yo95zYO5A6E6zMf5y+r55sF5PE25y+M5AkEihnOB3tJGilKUi3LVPFMIORLHyJLKi7LJ5hNLj/NMOtLIiBPLzZMIjBLIQJKVzZLJOVNVkNMIjdLIAFMG4xMPOlOV7dJGiik44cqC2HVDc5Jyw1LCMhJGjhLJ6RLHPNLJP/NIyFLJ6/OP4hJGihLJ6/LPi3NJRdNMOtMKytLVBhKV6hMGA/VVjROV5ZMMA8V5ywO5PMVl+s4REAzRY/OV5hMMA8V54M55yAz562j5PMV5yIR77Ym5l+V5OUnl+s7SoAlJs/LUBpOP4yV5l6N6z2Il+IdJoMDOUETIEINKUw6PU+8JowBUUwUMUoaGEAoQooaGEAlIEoaGEArH+oaGEENU+oaGEI3N+oaGEEoR+E7LEoaGEwnH+MzJEoaGEEePUEcUEI9RoENU+ETIEwpR+EHRUIUPoEAHoI/KoMvNo+8Jos7PEwpIUwjJEAzRY/KUk3MMA8V5zco5PMV44cb55s76z2I5BEM5y+Z44cb6ygU5OYH5zkm5lI75l2t5y2G5l2n44cc5yIh6zwC44cb5y+n5OMt44cb5O+s5ywL6zwC5As044cb5lI76kEc6zwC5As044cb56M66zwC5zkm6yEn5Asn6zwC5As06yo95AAc5A6E5l+D55wz44cc5lIn5O6O5Rwl55s76z2I5PEG5Rov56gU6k6K55Qe6zwC5As05y+c5PwW44cb6zwC5As05z6l5y+344cb54gV5ywj6k6+572U5OIw5OUn5Pge5Osp5zU+44cccUoaKoERMEs9JEs4JUAmGEE7REEkTUAaGEoaKEAVJ+wCUUESRos4Gos4QIbZAg90ioEAHcb2Axn1ywWG5BU656Ul55s76z2I5y+V56gU6k6K55Qe5lQ654MP56Uz5l2nl+wDKownP+s9JEE9RUoaGEs4JUwCSoEcUEwBUUwUMUwpGUEfP+EjQEEAHowfS+EZU+oaGEs6UUEjQEs5I+MxToEAHoI/NoI/KEs4JUwjJEwqJUw3PUwpS+oaGEwNV+AaGEoaGEMDOUwqKEoaGEINHUE6V+oaGEAoPEINPUwsJoATO+wCQoI/M+IHJoEAHoIHJos4UUoaGUwqJUE7REwiH+MvNoIlPEAyVUEKUUAwSoEAHoAEHowBVUwfS+EZU++8JowgMEA4HEs6UUEjQEwCQoEuU+MDOUw3PI/LJ7pJGihLIy3MMA8V5lIT5PMVl+wqJUAzR+EAHos9JEE9RU+8M+IlPEs6UUEjQEI/M+whUUoaGEENU+wkQooaGEI9RoI6Q+oaGEAuUEwpMowNV+wkV+oaGEAZQoINHUwVUEIXOEoaGEAoPEINPUAiLUwiHUw8Go+8JowgMEA4HEwpMowmLUwjJEwqJUEAHowfS+EZU+oaGUAmGEE7REEkTUAaGEs4JEwBOowVUEEzVEIaJowKSEAvIo+8Jos9HUAVJ+ASOEwiH+MvNos7JEMCGowgMEIVPEMvNowKTowUNUMzHEwrIoEoSoEAHoAEHowBVUwsJos4U+s9K+oaGGRJGjdPGjdLJ6xLR7NNMB3KUi7LKiZMNj/OOAJMVjtLR7NPVzdIGjtIGjtMNkZKU7VLIQhLROZMIjdPL6JJGjhKUlRMR4/MNAeGDM9Py2uG5y2v54US5zUE55Yl6k+L5y+L5BYa5AEl5yMn5yIW6k+05A6m55Qe55s76z2I77Ym56gU6k6K6k+06k+D6icf5zkm5zcm5zY65lQ654MP5B2t5PE255Qe5y+V6kEb5yQO5l2C44cb6kgO5Oof44cb6kEg57Q/44cb5AE/5Ocb44cb5O6L6kEM5zkm5l2n572U5ywZ57o75BEY5zYOihnOB3rZios4REwhHUEHRUAjV+I9VEoaGUs4JUI/MEwpPEIVNEwqJoAxTUwpKEEuN+oaGEs4JEElRoERI+AuUEwpMoI/NUE7REAaP+EAHoEFREs/G+IHQoA8LowpR+wgMEwfPEIVPsb2B2LJzsdNMOqGCgfYzw50Agv0AwnHBo+8M+I1Sos9JEoaGEwNV+wkV+wpMowmLUoaGEAoPEINPI/LIiBLVidJGihPGzpLHBFMK43KVzZMIjBNQBRPL7tLHBpNS7VLJ5JLJjBLHPNLHAxLR7NLUPtML7BPL7tNMOqGC2HVDc52Axn1ywZJGilKUi3LVPFORQNLR7NNMB3ML7BPL7tNGRNLSiBMRApLNkJLJ5hNLj/NMOtLJ6/OP4hOOAJMVjtLJ5JMIjdLR7NNMB3KUyVLKi7NMOtLIQJKVzZJGiik44cqC2HVDc52Axn1ywZJGjhKVB/NLkJKURRNIANOP4tOJipLKi3VViZLHPNMUixOOyZLIQJOGixJGihLIQJKVzZJGihKVzZNLkJLR7NOSAhJGihNQBRPL7tMLRNLKjhLKOZLJ6/OP4hNU5pMNPZJGilLJ6RLHPNLHBFKVzpLJ6/OP4hNMOtNNiNNNlZJGihLMltPG6JJGihLKBZLKlJJGihOP4BNUR/JGihMIyVLIR/JGihLP7/MGihJGihMJQxOP6BJGihNP7VLIQJJGihPGzpLHBFLKOZNJQ/LOOpLJ5JLJjBVViZKUi3NLkJMHktMGjlJGihNHkBOMzhJGihLP5tLSyJJGihNU53MNjVJGihPNiFMG4RJGihLK4dMSylJGihLMllORR3NRyNMG4xNU6RJGihMGihLUQBMIjBLV4pNKiBLIktMLQ3KU6pMM7/NLlVPNAlKUOVLRP7JGilLJ6RLHPNLJP/NIyFOG73LPj/NOA7ORQtNMOtKUOVLRP7VVjVNNiVKUi3MUixNMOtKVy3NVA7JGihMNj3LKjhJGihOOAJMG4xMIjBLIQJKVzZKUi3LHPNVViZKUi3OOAxPGkdJGijZEw5VChnPCYdLJ6/KU6xMPOlMI6ZLIAFMG4xVViXZAg90CYdKUi3LVPFLHPNMIjdLIAFMG4xMOPFMPOlJGiik44cq5Q2J5PAh5lIo6ycG5z6l44cr6kEs6iMY55Qe5PEI5PYj5PYn6kof55sXignOyxjHy3rLCNmUC3rHDgvZiowsJos6UUEjQEI1Hos6P+AjV+I9VE+8JhnOB3qUDMLZDwfSios4JEMhJEwKJEApJ+I/SooaGUwpQUACIEEuU+MDOUs4REwpKEEuN+EAHoAnOUIJHEoaGEIeSEIHO+oaGEACJEIJHEEGToAnN+oaGEAYVUAFK+AZPEAXOEETIEwpR+INGEwpMowmLU+8JoAiLUEHRUACIEw/HEIMGEwmUUwiHUs6UUEjQs/ML7BMRRxML7BMIy3LHPNLHAuGC2HVDc52Axn1ywZJGiik44cqDM9Py2vZ44cr5lQ654MP5A+55lUw5lQ66k+05yE655Qe5AoW6z+Z5yAzigTPBMq9zgXN77YB6z+Z6l2O6yEm5A6E6zMf5zcS5yIW44cb5PIo56gU5BgE5lQo5P+q6kEs6iMY55Qe5yAf5B+d54US55M95OIw56YS5lIa5lQ656EW6iEQ6l+W5yAzigTPBMq9DgHPBMVJGijZCgvHA2vYios9V+EuQoINKUIjSUINHoImG+wqJE+8M+wUOUINGUwpMEI/SoIaHEAiLUI6Q+s7VEAxOoAZLEEHRUIUPoEAHoAxGEEzVEwgMsbZCgvHA2vYpEoaJMjYB2fKy2fZDdRML4hNMB3JGi/VVjVNLlxOR53JGihLUB/MKQ3MIjBORR7LPiFKUk3NMOtMMi7NOA7OR7tOR53KURRLNkGGCgfYzw50Agv0AwnHBcdMOiFMMi7LO7dMUPdJGilLJ6RORRdLVzxPN7pOVAJLRP7PMyxOOAJOVR7NMOtLHOxLV4pVViZKUi3OHjhOOAxMNkROR7tLH7RNMOtLV4pNKiBJGijJB250zw50ios/NEEvMEwoN+IVNE+8M3bHCMvUDgHLDgLJywWG5y+V5yAz5y+V56gU6k6K55Qe5y+r5AoW5PA55BYp44cb5AoW6z+Z5P2L5RQq5OIw5zcm5PYF55+T5l+d6kgO5RYu77Ym5l2g5Pge5B2X6lcd5BQM5zkm5B2X5zon6l+E57UT5OcN55Qe5yQO5l2C5y+Q5yAzihnOB3rZ44cc5A+555M96lEO6lAk5yIh6zwC44cb6zwC5As05lI75l2t5y+y5yYw5OIw54US56Ul5yQO5l2C5PE277Ym5zYO5A+55BQu5PE26zE054k55OYj5y6F5AoW6iEQ54s26k+T5y+L5OUg5yIg77YB5lIn5B6x5OQk6lEO5AsA5lIQ6zwC5As055Qe5AsA5y+L5y+W6k+n5zci5BM25OIq5lIa5P2H44cc5lIK5lQ65zcm5PE26k+06k+D5PE26l6t5yE655U46yk75lIK5P2HihzVAwnL77Ym56YS5lQm5P2HihbHCMvUDgHLDgLJywWG5lUL44co5zcm5PE244cp5BYa5As044cc5yw35l2t5y2v5lQ65l2/55sO6kEe6iYd5zcn77YB5PEG5Rov5yY65yIg5OIq5zgy55Qe5lYx5lQ644cb576K5lYx44cb6lEV5lQ6562j5ywX5zcm5y+r5AoW5PE2ihnWzwfRzxiG5yAz44coz3jVDxa6576K5l2t5zcn44cp77Ym5lIn5yIx5ywLignOyxjHy3rLCNmG5zkmihjLz2LZDhj5x2rLBhrH44cccUoaKoIsMEwKQUwLH+oaKEwqJowCSoEcUEI/NUE7REIsMEwKQUwLH+s/NEEvMEs4GowCUU+8M+I3QowCSoEcUEIsMEwKQUwLH+AmIEwjQUI+KEMHUUw6J+AlHUAiKowKMUs4QUEFRsbZy2vUzE+8JoAVJ+wCUUE7KEwUMUIhQUw3SEEAHcbSB2nHDgLVBUoaGwnOyxjHy3rLCNpJGifWCM9WCYdLKOWGC3rHDgxVViZLUBBNLkGGC2HVDhmG5PIo56gU6jkz5AsQ5Awh5BYa5AEl44cb5yIh5O2I5zkm57Ut5P2F44cc","z2v0","Dgv4Da","zMLUza","Aw5JBhvKzxm","AM9PBG","C3bHy2u","CMvWBgfJzq","B2jQzwn0","AwrLBNrPDhLFChjVzMLSzq","AxngAw5PDgu","C2nLBMvZwW","DM9Py2vZ","AgfZ","sgnmr1a","ue9tsvrjvKvFsu5gsu5jvfK","y2fTzxjH","BgvUz3rOoIa","oIbZzxjPywWGB3v0Chv0ihbYB2r1y2vKig5VihnJzw5LCW","oIbZzxjPywWGB3v0Chv0ihDHCYbUB3qGDMfSAwqGsLnptIaOzMLUAxnOuMvHC29Upq","ywrKx3n0yxrLCW","r3DSv3G","CMvJB2DUAxrPB25Fyw5JAg9YCW","zw50CMLLCW","yMfJA2DYB3vUza","C2v0","yLb2v2u","C3bLywTLCG","yxbWyxjLBNrFz2vUzgvY","zNjVBv9Uyw1L","Aw1WB3j0yw5Jzq","AwrLBNrPDhLFChjVzMLSzv9WyxrJAa","C2TPBL9Mzwf0DxjLCW","C3bSAxq","zMXHDe1HCa","zNjVBuvUDhjPzxm","BM9Zzq","AerhCNC","qvfAEg8","CgvYC2LZDgvUDf9TyxjRCW","ywrKx2fSAwfZzxm","BLbpzfq","pt09pt09pt09psdLT7lNN6xORR7LRPRVViJLIldKUiRKUidPM4BKUlRMRAlVViZOP4tOJipLKi3KU6xMRAtKUlRLH4BVViKGpt09pt09pt09pqO","BMv3x2vUDgL0AwvZ","C3rYAw5NAwz5","zMvHDhvYzwq","t1HnzKK","ChjVDMLZAw9UywW","ChjVChm","BMfTzq","CgfYzw50Agv0AwnHBa","AvnnEg8"];return Bd=function(){return e},Bd()}var TS=(e,t)=>{let n=pe;return e?t?e[n(92)](/[。!?;]+$/,"")+"\u3002"+t:e:t};function CS(e){let t=pe,n={synopsis:"",scenes:[],registry_delta:{new_entities:[],enrich:[],canonicalize:[]},open_threads:{opened:[],closed:[]}};if(!it(e))return n;n[t(83)]=W(e[t(83)]);for(let r of Fe(e[t(63)])){if(!it(r))continue;let s={},c=W(r[t(91)]);c&&(s[t(91)]=c);let a=ei(r[t(5)]);a&&(s[t(5)]=a);let d=new Map;for(let h of Fe(r[t(18)]))if(t(37)!==t(106)){if(!it(h))continue;let _=W(h[t(134)]);if(!_||lt(_))continue;let y=d[t(86)](_)??{name:_,states:[]};for(let w of MS(h[t(46)]))y[t(46)][t(89)](w)||y[t(46)][t(45)](w);d[t(110)](_,y)}else{if(!_0x56374e(_0x73fac7))return;let _={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:_0x1238ff(_0x2f9874[t(124)])[t(80)](_0x4f0052)[t(28)](_0x18c2a9),voice:""};for(let y of _0x1ba618)_[y]=_0x23544e(_0x35aae8[y]);return _}let p=[],l=new Set;for(let h of Fe(r[t(133)])[t(80)](W)[t(28)](Boolean))if(t(31)!==t(31))_0x11e482[t(46)][t(89)](_0x17d37a)||_0x21c487[t(46)][t(45)](_0x42b7ac);else{let _=h[t(62)](t(19))[t(92)](/\s+/g," ")[t(21)]();if(!_||l[t(98)](_))continue;l[t(0)](_),p[t(45)](h[t(21)]())}let f=[];for(let h of Fe(r[t(7)])){if(!it(h))continue;let _=TS(W(h[t(101)]),W(h[t(27)]));if(!_)continue;let y={kind:t(16),content:_},w=di(h.ts);w&&(y.ts=w),f[t(45)](y)}for(let h of Fe(r[t(97)]))if(t(122)===t(122)){if(!it(h))continue;let _=W(h[t(72)]);if(_!==t(42)&&_!==t(69))continue;let y=W(h[t(32)]);if(!y)continue;let w={kind:_,content:y},I=W(h[t(112)]);I&&(w[t(112)]=I);let E=W(h[t(135)]);E&&(w[t(135)]=E);let A=di(h.ts);A&&(w.ts=A),f[t(45)](w)}else{let _=_0x317ac6[t(21)]()?t(127)+_0x4ae2d8+`
|
|
253
|
+
`:t(84);return t(23)+_0x3b528d+t(17)+_}f[t(41)]((h,_)=>{let y=t,w=Qm(h.ts)-Qm(_.ts);return w!==0?w:h[y(72)]===y(16)&&_[y(72)]!==y(16)?-1:h[y(72)]!==y(16)&&_[y(72)]===y(16)?1:0});let u={environment:s,characters:[...d[t(67)]()],props:p,anchors:f},m=W(r[t(25)]);m&&(u[t(25)]=m);let g=W(r[t(79)]);g&&(u[t(79)]=g),n[t(63)][t(45)](u)}let o=it(e[t(47)])?e[t(47)]:{};for(let r of Fe(o[t(128)])){if(!it(r))continue;let s=W(r[t(134)]),c=W(r[t(72)]);if(!s||c!==t(73)&&c!==t(79)&&c!==t(74)||c===t(73)&<(s))continue;let a={name:s,kind:c,status:W(r[t(61)])===t(132)?t(132):t(30),importance:W(r[t(115)])===t(109)?t(109):t(130)},d=Fe(r[t(107)])[t(80)](W)[t(28)](Boolean);d[t(44)]&&(a[t(107)]=d);let p=Fm(r[t(94)]);p&&(a[t(94)]=p);let l=W(r[t(39)]);l&&(a[t(39)]=l);let f=W(r[t(58)]);f&&(a[t(58)]=f);let u=Hm(r[t(46)]);u[t(44)]&&(a[t(46)]=u);let m=Fe(r[t(81)])[t(80)](W)[t(28)](Boolean);m[t(44)]&&(a[t(81)]=m),n[t(47)][t(128)][t(45)](a)}for(let r of Fe(o[t(2)])){if(!it(r))continue;let s=W(r[t(134)]);if(!s)continue;let c={name:s},a=Fe(r[t(20)])[t(80)](W)[t(28)](Boolean);a[t(44)]&&(c[t(20)]=a);let d=Fm(r[t(116)]);d&&(c[t(116)]=d);let p=W(r[t(39)]);p&&(c[t(39)]=p);let l=W(r[t(58)]);l&&(c[t(58)]=l);let f=Fe(r[t(125)])[t(80)](W)[t(28)](Boolean);f[t(44)]&&(c[t(125)]=f);let u=Hm(r[t(105)]);u[t(44)]&&(c[t(105)]=u),Object[t(64)](c)[t(44)]>1&&n[t(47)][t(2)][t(45)](c)}for(let r of Fe(o[t(82)]))if(t(54)!==t(111)){if(!it(r))continue;let s=W(r[t(114)]),c=W(r[t(66)]);s&&c&&n[t(47)][t(82)][t(45)]({from_name:s,canonical_name:c,evidence:W(r[t(12)])})}else _0x12eb09=_0x2b1f21[t(76)](_0x403169);let i=it(e[t(51)])?e[t(51)]:{};for(let r of Fe(i[t(55)])){if(!it(r))continue;let s=W(r[t(87)]);s&&n[t(51)][t(55)][t(45)]({text:s})}for(let r of Fe(i[t(65)]))if(t(126)===t(99))_0x55bc29[t(45)]({name:_0x4e7945,description:_0x3f2826});else{if(!it(r))continue;let s=W(r[t(26)]);s&&n[t(51)][t(65)][t(45)]({ref:s})}return n}async function qm(e,t,n,o,i,r,s,c){let a=pe,d="";for(let p=0;;p++){if(a(136)===a(131))return _0x27b554?_0x52d783?_0x255a03[a(92)](/[。!?;]+$/,"")+"\u3002"+_0x430054:_0xdd7ef9:_0x1d848c;{let l=await e[a(15)]({media:t,system:RS,user:NS(n,o+d),fps:i,responseJsonSchema:Pf,...s?{localPath:s[a(8)],localMime:s[a(1)]}:{},...r?{signal:r}:{}}),f=l[a(87)][a(21)]();if(f[a(44)]<40)throw Dd(a(59)+n+a(71)+l[a(77)]+")",[a(102)+f[a(44)]]);let u;try{u=JSON[a(76)](f)}catch{throw Dd(a(59)+n+a(104)+l[a(77)]+")",[f[a(29)](0,200)])}let m=Gd(u),g=CS(m);if(g[a(63)][a(44)]===0)throw Dd(a(59)+n+a(103),[f[a(29)](0,200)]);let h=g[a(63)][a(119)]((y,w)=>y[a(33)][a(119)]((I,E)=>I.ts?[]:[a(96)+w+a(38)+E+a(57)+I[a(72)]+")"]));if(h[a(44)]>0)if(a(60)===a(60)){if(c?.({event:a(22),at:new Date()[a(10)](),episode:n,attempt:p+1,missing_count:h[a(44)],missing_paths:h,retries_exhausted:p===3}),p===3)throw a(3)!==a(123)?new x(a(24)+n+": "+h[a(44)]+a(11),{exitCode:fe,errorCode:a(70),hint:a(53),data:{actual:h}}):new _0x5bd8f2(a(24)+_0x26c838+": "+_0x3dbd21[a(44)]+a(11),{exitCode:_0x73b6c3,errorCode:a(70),hint:a(53),data:{actual:_0x541452}});d=a(50)+h[a(44)]+a(35)+h[a(90)]("\u3001")+a(68);continue}else{if(!_0x53fffd)return _0x595457[a(100)];let y=_0x1b9235[a(118)](":")[a(80)](_0x5ec78d);return y[a(49)](w=>!_0x13a5a0[a(95)](w))?_0x8458e4[a(100)]:y[a(44)]===2?y[0]*60+y[1]:y[a(44)]===3?y[0]*3600+y[1]*60+y[2]:_0x66c499[a(100)]}return{md:JSON[a(129)](m,null,2),output:g}}}}function Js(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function US(e){switch(e.errorCode){case"LLM_CREDENTIAL_MISSING":return{failure_type:"authentication",failure_code:"authentication_failed"};case"LLM_CONFIG_INVALID":return{failure_type:"provider",failure_code:"request_rejected"};case"INGEST_VIDEO_INLINE_TOO_LARGE":return{failure_type:"media",failure_code:"media_too_large"};case"INGEST_VIDEO_SERIAL_FAILED":return{failure_type:"pipeline",failure_code:"serial_parse_failed"};case"INGEST_VIDEO_TIMESTAMP_MISSING":return{failure_type:"validation",failure_code:"script_validation_failed"};case"INGEST_SOURCE_MISMATCH":return{failure_type:"pipeline",failure_code:"source_mismatch"};case"INGEST_PIPELINE_MISMATCH":return{failure_type:"pipeline",failure_code:"pipeline_mismatch"};case"INGEST_VALIDATION_FAILED":return{failure_type:"validation",failure_code:"script_validation_failed"};default:return{failure_type:"unknown",failure_code:"unknown"}}}function PS(e){if(e instanceof P)return{failure:e.failure,attempts:e.modelFailures};if(e instanceof x){let t=e.errorCode==="INGEST_VALIDATION_FAILED"||e.errorCode==="INGEST_VIDEO_SERIAL_FAILED";return{failure:wt(US(e),{retryable:t,message:e.message}),attempts:[]}}return{failure:wt({failure_type:"unknown",failure_code:"unknown"},{retryable:!1,message:e instanceof Error?e.message:String(e)}),attempts:[]}}function Zm(e,t,n){let o=PS(e);return{schema_version:1,unit:{kind:"episode",episode:t},phase:n,occurred_at:new Date().toISOString(),...o}}function Xm(e){return e.retryable?"Inspect the episode error sidecar and rerun `scriptctl ingest` to resume from this episode.":e.failure_type==="policy"?"Inspect the provider policy reason in the episode error sidecar; rerunning the same source is unlikely to help.":e.failure_type==="authentication"||e.failure_type==="authorization"?"Fix the provider credential or permission reported in the episode error sidecar before rerunning.":"Inspect the typed episode error sidecar and resolve the terminal failure before rerunning."}function Wm(e,t){return typeof e=="string"&&t.some(n=>n===e)}function mi(e){return typeof e=="string"?e:void 0}function VS(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Js(n)||typeof n.category!="string"||typeof n.probability!="string"||typeof n.blocked!="boolean")return;t.push({category:n.category,probability:n.probability,blocked:n.blocked})}return t}function $S(e){let t=e.provider_source,n=e.provider_reason;return{provider:mi(e.provider),model:mi(e.model),operation:mi(e.operation),http_status:typeof e.http_status=="number"?e.http_status:void 0,system_code:mi(e.system_code),provider_source:Wm(t,["prompt","candidate"])?t:void 0,provider_reason:Wm(n,["SAFETY","PROHIBITED_CONTENT","BLOCKLIST","SPII","RECITATION","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION","OTHER","UNSPECIFIED","UNKNOWN"])?n:void 0,provider_reason_raw:mi(e.provider_reason_raw),finish_message:mi(e.finish_message),safety_ratings:VS(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function fr(e){if(!Js(e))return null;let t=Rp(e.failure_type,e.failure_code);return!t||typeof e.retryable!="boolean"||typeof e.message!="string"?null:wt(t,{...$S(e),retryable:e.retryable,message:e.message})}function mr(e){if(!Js(e)||e.schema_version!==1)return null;let t=e.unit;if(!Js(t)||t.kind!=="episode"||typeof t.episode!="number"||typeof e.phase!="string"||typeof e.occurred_at!="string")return null;let n=fr(e.failure);if(!n||!Array.isArray(e.attempts))return null;let o=[];for(let i of e.attempts){let r=fr(i);if(!r)return null;o.push(r)}return{schema_version:1,unit:{kind:"episode",episode:t.episode},phase:e.phase,occurred_at:e.occurred_at,failure:n,attempts:o}}function Ks(e){return new x("The video skip ledger is invalid.",{exitCode:b,errorCode:"INGEST_SKIP_LEDGER_INVALID",hint:"Repair or remove skipped.json, then retry.",data:{actual:[e]}})}function DS(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(!Number.isInteger(t.episode)||Number(t.episode)<=0||typeof t.skipped_at!="string"||typeof t.reason!="string"||t.reason.trim().length===0||typeof t.source_sha256!="string"||t.source_sha256.length===0||!Array.isArray(t.attempts))return null;let n=fr(t.failure);if(!n)return null;let o=[];for(let i of t.attempts){let r=fr(i);if(!r)return null;o.push(r)}return{episode:Number(t.episode),skipped_at:t.skipped_at,reason:t.reason,source_sha256:t.source_sha256,failure:n,attempts:o}}function Jd(e){if(!e.has("skipped.json"))return{schema_version:1,episodes:[]};let t=e.readJson("skipped.json");if(typeof t!="object"||t===null||Array.isArray(t))throw Ks("root must be an object");let n=t;if(n.schema_version!==1||!Array.isArray(n.episodes))throw Ks("schema_version must be 1 and episodes must be an array");let o=[],i=new Set;for(let r of n.episodes){let s=DS(r);if(!s)throw Ks("one or more episode records are malformed");if(i.has(s.episode))throw Ks(`episode ${s.episode} appears more than once`);i.add(s.episode),o.push(s)}return o.sort((r,s)=>r.episode-s.episode),{schema_version:1,episodes:o}}function eg(e,t){e.writeJson("skipped.json",t)}function js(e,t){let n=new Map(t.map(o=>[o.episode,o.sha256]));for(let o of e){let i=n.get(o.episode);if(i!==o.source_sha256)throw new x("The video skip ledger no longer matches the source.",{exitCode:b,errorCode:"INGEST_SKIP_SOURCE_MISMATCH",hint:"Restore the source episode recorded by this workspace, or rebuild the same source with --force.",data:{actual:[`episode=${o.episode}`,`ledger_sha256=${o.source_sha256}`,`source_sha256=${i??"<missing>"}`]}})}}function GS(e){return{episode:e,synopsis:"",scenes:[],actors:[],locations:[],props:[],speakers:[],actorStates:[],locationStates:[],propStates:[]}}function zs(e,t,n,o){let i=new Set(o.map(s=>s.episode)),r=[];for(let s of t){if(s.episode>n)break;let c=`ep/ep_${String(s.episode).padStart(3,"0")}.json`;e.has(c)?r.push(e.readJson(c)):i.has(s.episode)&&r.push(GS(s.episode))}return r}function gr(e,t,n){for(let i of n)i.episode<=t.lastEpisode&&e.clearError(`ep/ep_${String(i.episode).padStart(3,"0")}.error.json`);let o=new Map(n.map(i=>[i.episode,i]));for(;;){let i=t.lastEpisode+1;if(!o.has(i))break;ym(t,i),e.writeJson("context.json",t),e.clearError(`ep/ep_${String(i).padStart(3,"0")}.error.json`)}return t}function tg(e,t){for(let n of t){let o=e.episodes[n.episode-1];o&&(o.extend={scriptctl:{ingest:{outcome:"skipped",source_episode:n.episode}}})}}var hr="19",BS=new Set([hr]),gi=e=>String(e).padStart(3,"0"),Kd=2;function og(e){try{return Yt.statSync(e).size}catch{return 0}}function JS(e,t){let n=og(e);if(!(n<bc))throw new x(`Episode ${t} is too large for inline base64 video input.`,{exitCode:b,errorCode:"INGEST_VIDEO_INLINE_TOO_LARGE",hint:"Use --upload-mode file-api, or provide a source that transcodes below the Gemini inline limit.",data:{expected:[`video smaller than ${bc} bytes after ingest transcoding`],actual:[`${n} bytes`]}})}function ng(e,t){try{let n=t.uploadBytes?(t.uploadBytes/1024/1024).toFixed(1):"?",o=JSON.stringify({...t,uploadMB:n,at:new Date().toISOString()})+`
|
|
254
|
+
`;Yt.appendFileSync(e.path("timing.jsonl"),o)}catch{}}function ig(e){return new x("This workspace's accepted video sequence no longer matches the source.",{exitCode:b,errorCode:"INGEST_SOURCE_MISMATCH",hint:"Restore the accepted episode prefix, or choose a fresh --workspace-path for a different source.",data:{actual:[e]}})}function jd(e){if(!e.has("manifest.json"))return null;let t=e.readJson("manifest.json");if(!t.pipeline_version||!BS.has(t.pipeline_version))throw new x("This workspace uses an incompatible video-ingest pipeline.",{exitCode:b,errorCode:"INGEST_PIPELINE_MISMATCH",hint:"Choose a fresh --workspace-path and run ingest again.",data:{actual:[`workspace pipeline ${t.pipeline_version??"(missing)"}; current ${hr}`]}});return e.readJson("manifest.json")}function zd(e,t){if(t.pipeline_version===hr)return t;let n={...t,pipeline_version:hr,updated:new Date().toISOString()};return e.writeJson("manifest.json",n),n}function KS(e,t,n){if(e&&e.source.kind!==t)throw ig(`source kind changed from ${e.source.kind} to ${t}`)}function jS(e,t,n,o){if(t){let i=pm(t.episodes,n);if(i.kind==="incompatible")throw ig(i.reason)}if(o){Yt.rmSync(e.path("ep"),{recursive:!0,force:!0}),Yt.rmSync(e.path("cache"),{recursive:!0,force:!0}),Yt.rmSync(e.path("evidence"),{recursive:!0,force:!0});for(let i of["context.json","script.initial.json","script.json","validation.json","asset-audit.json","id_map.json","timing.jsonl","usage.json","v4_identity_map.json","skipped.json"])Yt.rmSync(e.path(i),{force:!0})}}function zS(e,t){return e.map(n=>{let o=structuredClone(n);for(let i of o.actors)i.name=pi(i.name,t)??i.name;for(let i of o.scenes){for(let c of i.characters)c.name=pi(c.name,t)??c.name;i.location&&(i.location=pi(i.location,t)??i.location);let r=[],s=new Set;for(let c of i.props){let a=(pi(c,t)??c).trim();if(!a)continue;let d=a.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();s.has(d)||(s.add(d),r.push(a))}i.props=r;for(let c of i.anchors)c.speaker=pi(c.speaker,t)}return o})}function HS(e,t){let n=t.slice(0,8).map(o=>`- ${o.path}: ${o.message}`).join(`
|
|
255
|
+
`);return`${e}
|
|
256
|
+
|
|
257
|
+
========== \u4E0A\u4E00\u6B21\u8F93\u51FA\u7684\u6574\u5408\u6821\u9A8C\u53CD\u9988 ==========
|
|
258
|
+
\u4E0A\u4E00\u6B21\u5BF9\u672C\u96C6\u7684\u7ED3\u6784\u5316\u8F93\u51FA\u6CA1\u6709\u5199\u5165 checkpoint\uFF0C\u56E0\u4E3A\u4E0E\u65E2\u6709\u5267\u672C\u5408\u5E76\u540E\u8FDD\u53CD\u4E86\u4EE5\u4E0B\u7EA6\u675F\uFF1A
|
|
259
|
+
${n}
|
|
260
|
+
\u8BF7\u91CD\u65B0\u89C2\u770B\u672C\u96C6\u5E76\u8FD4\u56DE\u5B8C\u6574 JSON\u3002\u4FDD\u6301\u539F\u7247\u4E8B\u5B9E\u3001\u5BF9\u767D\u3001\u955C\u5934\u4E0E\u5DF2\u77E5\u4EBA\u7269\u4E0D\u53D8\uFF0C\u53EA\u4FEE\u6B63\u5BFC\u81F4\u6821\u9A8C\u5931\u8D25\u7684\u4EBA\u7269\u547D\u540D\u3001\u8D44\u4EA7\u7ED1\u5B9A\u6216 registry_delta\u3002\u4EBA\u7269\u89C4\u8303\u540D\u4E0D\u5F97\u7528\u62EC\u53F7\u5907\u6CE8\u533A\u5206\u89D2\u8272\uFF1B\u89D2\u8272\u804C\u80FD\u5199\u5165 role\uFF0C\u4E0D\u540C\u4EBA\u7269\u4F7F\u7528\u5F52\u4E00\u540E\u4ECD\u552F\u4E00\u7684\u89C4\u8303\u540D\u3002`}var hi=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function FS(e,t){let n=lr(t),o=p=>n.get(p)??p,i=new Map;for(let p of t){let l=o(p.name),u=t.find(g=>g.kind===p.kind&&hi(g.name)===hi(l))??p,m=`${p.kind}:${hi(l)}`;i.has(m)||i.set(m,`video:${u.kind}:${u.firstEpisode}:${hi(u.identitySeed)}`)}let r={},s={},c={},a={},d={actor:r,location:s,prop:c};for(let p of e){let l=p.names[0]??p.provisional_id,f=i.get(`${p.kind}:${hi(l)}`)??`video:${p.kind}:source:${hi(l)}`;d[p.kind][p.provisional_id]=f,a[p.provisional_id]=Object.fromEntries(p.states.map(u=>[u.id,`${f}:state:${sn(u.name)}`]))}return{actor:r,location:s,prop:c,state:a}}function rg(e,t,n,o,i=[]){let r=lr(t.registry),s=zS(e,r),c=um(s,n),{script:a,assets:d,identityKeys:p}=Es(c);wm(a,t.registry);let l=Ns(a),{script:f,idMap:u}=As(l),m=at(f);if(!m.ok)return{initial:a,final:f,idMap:u,validation:m,identityMap:o};let g=ii(It(l),o,{...FS(d,t.registry),...p}),h=g.script;tg(h,i);let _=Te(h),y=[...h.actors.map((I,E)=>({asset:I,path:`$.actors[${E}]`})),...h.locations.map((I,E)=>({asset:I,path:`$.locations[${E}]`})),...h.props.map((I,E)=>({asset:I,path:`$.props[${E}]`}))].flatMap(({asset:I,path:E})=>[...I.description.trim()?[]:[{code:"video_asset_description_missing",path:`${E}.description`,message:"video asset needs a source-grounded description"}],...I.states.flatMap((A,k)=>A.description.trim()?[]:[{code:"video_state_description_missing",path:`${E}.states[${k}].description`,message:"video asset state needs a source-grounded visual description"}])]),w={..._,warnings:[..._.warnings,...Ss(h),...y,...i.map(I=>({code:"episode_skipped",path:`$.episodes[${I.episode-1}]`,message:`Episode ${I.episode} was manually skipped: ${I.reason}`}))]};return{initial:a,final:h,idMap:u,validation:w,identityMap:g.identityMap}}function Hs(e,t,n,o,i,r){let s=rg(zs(e,t,n.lastEpisode,r),n,o,i,r.filter(l=>l.episode<=n.lastEpisode)),{initial:c,final:a,idMap:d,validation:p}=s;if(e.writeJson("script.initial.json",c),e.writeJson("id_map.json",d),e.writeJson("validation.json",p),e.writeJson("v4_identity_map.json",s.identityMap),!p.ok)throw new x("Final script.json failed validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:p.errors.slice(0,5).map(l=>`${l.path}: ${l.message}`)}});return e.writeJson("script.json",a),s}async function QS(e,t,n,o,i,r,s){return Bs(e,$s(t,n,o,i,r),s)}async function YS(e){let t=Wn(e.sourcePath);if(t.kind==="text")throw new x("runVideoIngest received a text source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=[...Ds(t)].sort((h,_)=>h.episode-_.episode),o=Ps(n);if(o)throw new x("Video episodes must form one continuous sequence starting at episode 1.",{exitCode:b,errorCode:"INGEST_VIDEO_SEQUENCE",hint:"Add or rename files so the discovered episode numbers are 1..N with no gaps.",data:{actual:[o]}});let i=e.fps??3,r=e.force??!1,s=e.step??!1,c=e.uploadMode??"file-api",a=e.signal,d=new At(e.workspacePath);d.ensure();let p=jd(d),l=yi.resolve(t.path);KS(p,t.kind,l);let f=Gm(n,p?.episodes??[],p?.updated);jS(d,p,f,r);let u={version:2,pipeline_version:hr,updated:new Date().toISOString(),source:{kind:t.kind,path:l,sha256:Gs(f)},episodes:f,fps:i,skips:r?[]:p?.skips??[]};d.writeJson("manifest.json",u);let m=new ai(d,e.executor),g="failed";try{let h=null,_=Fs(e.sourcePath),y=!r&&d.has("context.json")?d.readJson("context.json"):li(),w={schema_version:1,episodes:u.skips??[]};js(w.episodes,f),r||gr(d,y,w.episodes);let I=new Set(w.episodes.map(J=>J.episode)),E=!r&&d.has("v4_identity_map.json")?d.readJson("v4_identity_map.json"):oi(),A=0,k=0;for(let J of n){let be=`ep/ep_${gi(J.episode)}.json`;if(!r&&I.has(J.episode)&&J.episode<=y.lastEpisode)continue;if(!r&&d.has(be)&&J.episode<=y.lastEpisode){A++,e.executor.recordReuse("ingest.video-serial");let gt=Date.now();m.flush({scope:{kind:"episode",episode:J.episode},status:"reused",startedAtMs:gt,endedAtMs:gt});continue}if(s&&k>=1)break;let Qe=_m(y);d.writeText(`ep/ep_${gi(J.episode)}.context.md`,Qe);let L,oe,he,rt,qt=Date.now(),We={episode:J.episode,uploadMode:c,status:"succeeded",totalMs:0},Rr="transcode";try{let gt=Date.now(),st=await Jm(J.path,d.path(`cache/ep_${gi(J.episode)}.mp4`),J.mime,a);We.transcodeMs=Date.now()-gt,We.uploadBytes=og(st.path),We.transcoded=st.transcoded,st.note&&(We.note=st.note),c==="base64"&&JS(st.path,J.episode),Rr="upload",h??=e.executor.videoPort("ingest.video-serial");let aa=Date.now(),Mn=await h.prepare(st.path,st.mime,c,a);We.uploadMs=Date.now()-aa;try{Rr="generate";let ca=Date.now(),ch=zs(d,n,y.lastEpisode,w.episodes),da=Qe;for(let Nr=1;Nr<=Kd;Nr++){let Mr;try{Mr=await qm(h,Mn,J.episode,da,i,a,{path:st.path,mime:st.mime},Tt=>Yt.appendFileSync(d.path("ingest-validation.jsonl"),JSON.stringify(Tt)+`
|
|
261
|
+
`))}catch(Tt){if(!(Tt instanceof x)||Tt.errorCode!=="INGEST_VIDEO_SERIAL_FAILED"||Nr===Kd)throw Tt;da=`${Qe}
|
|
262
|
+
|
|
263
|
+
\u4E0A\u4E00\u6B21\u8F93\u51FA\u672A\u88AB\u63A5\u53D7\uFF0C\u4E5F\u672A\u63A8\u8FDB checkpoint\uFF1A${Tt.message}\u3002\u8BF7\u91CD\u65B0\u89C2\u770B\u5F53\u524D\u96C6\uFF0C\u53EA\u6309\u89C6\u9891\u4E8B\u5B9E\u8FD4\u56DE\u7B26\u5408 schema \u7684\u5B8C\u6574 JSON\uFF0Cscenes \u81F3\u5C11\u5305\u542B\u4E00\u4E2A\u5B9E\u9645\u573A\u666F\uFF1B\u4E0D\u8981\u53EA\u5199\u6897\u6982\u6216\u8BBE\u5B9A\u589E\u91CF\u3002`;continue}let Ap=Em(Mr.output,J.episode),pa=structuredClone(y);hm(pa,Mr.output,J.episode);let Lr=rg([...ch,Ap],pa,_,E,w.episodes.filter(Tt=>Tt.episode<=J.episode));if(Lr.validation.ok){L=Mr.md,oe=Ap,he=pa,rt=Lr;break}if(Rr="validation",Nr===Kd)throw new x("Final script.json failed validation after model correction.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Rerun ingest to continue with the next configured model route.",data:{actual:Lr.validation.errors.slice(0,8).map(Tt=>`${Tt.path}: ${Tt.message}`)}});da=HS(Qe,Lr.validation.errors)}We.generateMs=Date.now()-ca}finally{await h.release(Mn,a).catch(()=>{}),st.transcoded&&Yt.rmSync(st.path,{force:!0})}}catch(gt){let st=Date.now();We.status="failed",We.totalMs=st-qt,ng(d,We),m.flush({scope:{kind:"episode",episode:J.episode},status:"failed",startedAtMs:qt,endedAtMs:st,stages:We});let aa=gt instanceof x&>.errorCode==="INGEST_VIDEO_SERIAL_FAILED"?"parse":Rr,Mn=Zm(gt,J.episode,aa),ca=Tn(Mn.failure);throw d.writeJson(`ep/ep_${gi(J.episode)}.error.json`,Mn),d.writeJson("manifest.json",{...u,updated:Mn.occurred_at,current_error:Mn}),gt instanceof x&&(gt.errorCode==="INGEST_VIDEO_INLINE_TOO_LARGE"||gt.errorCode==="INGEST_VALIDATION_FAILED"||gt.errorCode==="INGEST_VIDEO_TIMESTAMP_MISSING")?gt:new x(`Episode ${J.episode} failed serial parse; later episodes depend on its context.`,{exitCode:b,errorCode:"INGEST_SERIAL_INCOMPLETE",hint:Xm(Mn.failure),data:{actual:[ca]}})}y=he,k+=1,d.writeText(`ep/ep_${gi(J.episode)}.md`,L),d.writeJson(be,oe),d.writeJson("context.json",y),d.clearError(`ep/ep_${gi(J.episode)}.error.json`);let Ip=Date.now();We.totalMs=Ip-qt,ng(d,We),m.flush({scope:{kind:"episode",episode:J.episode},status:"succeeded",startedAtMs:qt,endedAtMs:Ip,stages:We}),E=rt.identityMap,d.writeJson("v4_identity_map.json",E),d.writeJson("script.json",rt.final)}let D=Math.min(y.lastEpisode,n.length),R=n.length-D,S=R===0,M=S?null:n[D]?.episode??null,$=Hs(d,n.slice(0,D),y,_,E,w.episodes),{final:T,validation:O}=$,j=S?await QS(d,zs(d,n,y.lastEpisode,w.episodes),T,y,f,u.source.sha256,a):{items:[]},Z=j.items.flatMap(J=>J.samples),De=T;return g="succeeded",{workspacePath:d.root,episodes:n.length,processed:k,reused:A,skipped:w.episodes.length,skippedEpisodes:w.episodes.map(J=>J.episode),completed:D,remaining:R,complete:S,nextEpisode:M,uploadMode:c,assets:{actors:De.actors?.length??0,locations:De.locations?.length??0,props:De.props?.length??0},evidence:{states:j.items.length,samples:Z.length,ready:Z.filter(J=>J.frame_status==="ready").length},scriptPath:d.path("script.json"),validation:{ok:O.ok,errors:O.errors.length,warnings:O.warnings.length}}}finally{m.finish(g)}}async function sg(e){return fi(e.workspacePath,()=>YS(e))}function Fs(e){return yi.basename(e,yi.extname(e))||""}var yr=e=>e==null?"":String(e),ag=(e,t)=>{let n=Number(e);return Number.isInteger(n)&&n>0?n:t},qS=["video_provider","upload_mode","provider_base_url","provider_api_key","provider_api_key_env","provider_model","step"];function Mo(e,t){return new x(e,{exitCode:b,errorCode:"INGEST_VIDEO_OPTION_INVALID",hint:"Use these options only with a video file or video episode directory.",data:{actual:t}})}function Qs(e,t){return Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==void 0}function _i(e,t,n){if(!Qs(e,t))return;let o=yr(e[t]).trim();if(!o)throw Mo(`${n} requires a non-empty value.`,[n]);return o}function WS(e){let t=_i(e,"upload_mode","--upload-mode")??"file-api";if(t!=="file-api"&&t!=="base64")throw Mo("Video upload mode must be file-api or base64.",[`--upload-mode ${t}`]);return t}function ZS(e){let t=_i(e,"video_provider","--video-provider");if(t!==void 0&&t!=="gemini"&&t!=="doubao")throw Mo("Video provider must be gemini or doubao.",["--video-provider gemini|doubao"]);let n=Qs(e,"provider_api_key"),o=Qs(e,"provider_api_key_env");if(n&&o)throw Mo("Provider API key options are mutually exclusive.",["--provider-api-key","--provider-api-key-env"]);let i=_i(e,"provider_base_url","--provider-base-url"),r=_i(e,"provider_api_key","--provider-api-key"),s=_i(e,"provider_api_key_env","--provider-api-key-env"),c=_i(e,"provider_model","--provider-model");if(s!==void 0&&!/^[A-Za-z_][A-Za-z0-9_]*$/.test(s))throw Mo("Provider API key environment variable name is invalid.",[s]);let a;if(r!==void 0?a={kind:"literal",value:r}:s!==void 0&&(a={kind:"env",name:s}),!(!t&&!i&&!a&&!c))return{...t?{provider:t}:{},...i?{baseUrl:i}:{},...a?{apiKey:a}:{},...c?{model:c}:{}}}async function dg(e,t=kn){let n=yr(e.source_path).trim();if(!n)throw new x("ingest needs a source file or directory.",{exitCode:b,errorCode:"INGEST_NO_SOURCE",hint:"Pass a txt/md/docx file or a video file/directory: scriptctl ingest --source-path <path>.",data:{expected:["--source-path <file|dir>"]}});let o=cg.resolve(yr(e.workspace_path||"workspace")),i=Wn(n),r=qS.filter(d=>{let p=e[d];return typeof p=="boolean"?p:Qs(e,d)});if(i.kind==="text"&&r.length>0)throw Mo("Video ingest options cannot be used with a text source.",r.map(d=>`--${d.replace(/_/g,"-")}`));if(i.kind!=="text"){let d=WS(e),p=ZS(e);if(p?.provider==="doubao"&&d!=="file-api")throw Mo("Doubao requires --upload-mode file-api.",["--upload-mode file-api"]);let l=p?{videoProvider:p}:void 0,f=t.createExecutor(yr(e.llm_config).trim()||void 0,l),u=f.route("ingest.video-serial"),m=await sg({sourcePath:n,workspacePath:o,executor:f,fps:ag(e.fps,3),force:!!e.force,step:!!e.step,uploadMode:d}),g=[`workspace: ${m.workspacePath}`,`${m.completed}/${m.episodes} episodes complete (${m.processed} processed / ${m.reused} reused / ${m.remaining} remaining) \u2192 ${m.scriptPath}`,...m.skipped>0?[`skipped: ${m.skippedEpisodes.join(", ")}`]:[],`assets: ${m.assets.actors} actors / ${m.assets.locations} locations / ${m.assets.props} props`],h=[...f.usageEvents()].reverse().find(_=>_.task==="ingest.video-serial"&&_.status==="succeeded")??u;return[{text:g.join(`
|
|
264
|
+
`),data:{workspace:m.workspacePath,script_path:m.scriptPath,episodes:m.episodes,processed:m.processed,reused:m.reused,parsed:m.completed-m.skipped,skipped:m.skipped,skipped_episodes:m.skippedEpisodes,has_skips:m.skipped>0,completed:m.completed,remaining:m.remaining,complete:m.complete,next_episode:m.nextEpisode,upload_mode:m.uploadMode,route:{protocol:h.protocol,provider:h.provider,base_url:h.baseUrl,model:h.model},assets:m.assets}},B]}let s=t.createExecutor(yr(e.llm_config).trim()||void 0),c=await dm({sourcePath:n,workspacePath:o,executor:s,concurrency:ag(e.concurrency,30),force:!!e.force});return[{text:[`workspace: ${c.workspacePath}`,`${c.records} records, ${c.chunks} chunks \u2192 ${c.scriptPath}`,`assets: ${c.assets.actors} actors / ${c.assets.locations} locations / ${c.assets.props} props`].join(`
|
|
265
|
+
`),data:{workspace:c.workspacePath,script_path:c.scriptPath,records:c.records,chunks:c.chunks,assets:c.assets}},B]}import*as Mt from"node:fs";import*as Lt from"node:path";var XS=e=>e==null?"":String(e);function eI(e){try{let t=JSON.parse(Mt.readFileSync(Lt.join(e,"timings.json"),"utf-8"));return im(t,Date.now())}catch{return null}}function Ys(e,t,n){let o=Lt.join(e,t),i;try{i=Mt.readdirSync(o)}catch{return[]}return i.filter(r=>r.endsWith(n)).sort()}var tI=(e,t,n)=>Ys(e,t,n).length,Yd=(e,t)=>Mt.existsSync(Lt.join(e,t));function nI(e){try{return JSON.parse(Mt.readFileSync(Lt.join(e,"manifest.json"),"utf-8"))}catch{return null}}function oI(e){try{let t=JSON.parse(Mt.readFileSync(Lt.join(e,"validation.json"),"utf-8"));return{ok:!!t.ok,errors:t.errors?.length??0,warnings:t.warnings?.length??0}}catch{return null}}function Hd(e,t,n){return{pass:e,unit:t,phase:e,attempts:[],...wt({failure_type:"unknown",failure_code:"legacy_unclassified"},{retryable:e==="pass2",message:n})}}function iI(e,t,n){try{let o=JSON.parse(Mt.readFileSync(Lt.join(e,t,`${n}.error.json`),"utf-8")),i=mr(o);return i?{pass:t,unit:n,phase:i.phase,attempts:i.attempts,...i.failure}:typeof o=="object"&&o!==null&&"error"in o&&typeof o.error=="string"?Hd(t,n,o.error):Hd(t,n,"Error sidecar has an unsupported schema.")}catch{return Hd(t,n,"Error sidecar is unreadable.")}}function rI(e,t,n=new Set){return Ys(e,t,".error.json").map(o=>o.replace(/\.error\.json$/,"")).filter(o=>!n.has(o)).map(o=>iI(e,t,o))}function sI(e,t,n){let o=mr(e.current_error);if(!o)return[];let i=`ep_${String(o.unit.episode).padStart(3,"0")}`;return o.unit.episode<=t||n.has(i)?[]:[{pass:"ep",unit:i,phase:o.phase,attempts:o.attempts,...o.failure}]}function Fd(e){let t={};for(let o of e)t[o.failure_type]=(t[o.failure_type]??0)+1;let n=e.filter(o=>o.retryable).length;return{total:e.length,retryable:n,terminal:e.length-n,by_type:t}}function aI(e){try{let t=JSON.parse(Mt.readFileSync(Lt.join(e,"body.json"),"utf-8"));return Array.isArray(t.episodes)?t.episodes.length:0}catch{return 0}}function cI(e){try{let t=JSON.parse(Mt.readFileSync(Lt.join(e,"script.json"),"utf-8"));return t.version===4&&Array.isArray(t.episodes)?t.episodes.length:null}catch{return null}}function dI(e,t){try{let n=JSON.parse(Mt.readFileSync(Lt.join(e,"context.json"),"utf-8"));return typeof n.lastEpisode=="number"&&Number.isInteger(n.lastEpisode)?Math.min(Math.max(n.lastEpisode,0),t):0}catch{return 0}}function pI(e,t){let n=t.chunks??0,o={total:n,done:Ys(e,"pass2",".json").filter(a=>/^chunk_\d+\.json$/.test(a)).length,failed:tI(e,"pass2",".error.json")},i=aI(e),r=Ys(e,"serial",".json").reduce((a,d)=>{let p=d.match(/^win_(\d+)_(\d+)\.json$/);return p?a+(Number(p[2])-Number(p[1])+1):a},0),s={total:i,done:r,failed:0};return{passes:[{name:"normalize",done:n>0&&o.done>=n&&o.failed===0,unit:o},{name:"assemble",done:Yd(e,"body.json")},{name:"serial",done:i>0&&r>=i,unit:s},{name:"govern",done:Yd(e,"script.json")}],units:o}}function lI(e,t,n,o,i){let r=t.episodes?.length??0,s=o-n.filter(d=>d.episode<=o).length,c={total:r,done:o,failed:i};return{passes:[{name:"serial",done:r>0&&c.done>=r&&c.failed===0,unit:c},{name:"finalize",done:o>=r&&cI(e)===o}],units:c,parsed:s}}function _r(e){let t=Lt.resolve(e),n=nI(t);if(!n)return{workspace:t,exists:!1,kind:null,state:"empty",phase:"none",passes:[],units:null,script:!1,validation:null,failure_summary:Fd([]),errors:[],updated:null,timings:null};let o=n.source?.kind==="text"?"text":"video",i=n.episodes?.length??0,r=o==="video"?dI(t,i):0,s=o==="video"&&r<i,c=o==="video"?n.skips??[]:[],a=new Set(c.map(E=>`ep_${String(E.episode).padStart(3,"0")}`)),d=o==="video"&&r<i?sI(n,r,a):[],p=o==="video"?lI(t,n,c,r,d.length):null,{passes:l,units:f}=o==="text"?pI(t,n):p,u=o==="text"?rI(t,"pass2"):d;if(s){let E=c.filter(A=>A.episode<=r);return{workspace:t,exists:!0,kind:o,state:u.length>0?"failed":"incomplete",phase:"serial",passes:l,units:f,script:r>0,validation:null,failure_summary:Fd(u),errors:u,updated:n.updated??null,timings:null,completed:r,remaining:i-r,complete:!1,next_episode:r+1,parsed:p?.parsed??r,skipped:E.length,skipped_episodes:c.map(A=>A.episode),has_skips:c.length>0,skips:c.map(A=>({episode:A.episode,skipped_at:A.skipped_at,reason:A.reason,failure_type:A.failure.failure_type,failure_code:A.failure.failure_code}))}}let m=Yd(t,"script.json"),g=oI(t);g&&!g.ok&&u.push({pass:"finalize",unit:"script",phase:"validation",attempts:[],...wt({failure_type:"validation",failure_code:"script_validation_failed"},{retryable:!1,message:`Script validation failed with ${g.errors} error(s).`})});let h,_=l.length>0&&l.every(E=>E.done);(o==="text"||_)&&m&&g?.ok?h="ready":u.length>0||g&&!g.ok?h="failed":h="incomplete";let y=l.find(E=>!E.done),w=h==="ready"?"done":y?y.name:"done",I=o==="video"?{completed:f.done,remaining:Math.max(0,f.total-f.done),complete:f.total>0&&f.done>=f.total&&f.failed===0,next_episode:f.done>=f.total?null:f.done+1,parsed:p?.parsed??0,skipped:c.filter(E=>E.episode<=f.done).length,skipped_episodes:c.map(E=>E.episode),has_skips:c.length>0,skips:c.map(E=>({episode:E.episode,skipped_at:E.skipped_at,reason:E.reason,failure_type:E.failure.failure_type,failure_code:E.failure.failure_code}))}:{};return{workspace:t,exists:!0,kind:o,state:h,phase:w,passes:l,units:f,script:m,validation:g,failure_summary:Fd(u),errors:u,updated:n.updated??null,timings:eI(t),...I}}function uI(e){let t=`${e.done}/${e.total}`;return e.failed>0?`${t} (${e.failed} failed)`:t}function fI(e){if(!e.exists)return[`no ingest workspace at ${e.workspace}`];let t=`${e.kind} ingest: ${e.state} (phase=${e.phase})`,n=e.passes.map(i=>`${i.name} ${i.unit?uI(i.unit):i.done?"\u2713":"-"}`).join(" "),o=[t,n];if(e.timings&&o.push(mI(e.timings)),e.validation&&o.push(`validation: ${e.validation.ok?"ok":`${e.validation.errors} errors`}, ${e.validation.warnings} warnings`),e.has_skips&&o.push(`skipped episodes: ${e.skipped_episodes?.join(", ")}`),e.state==="failed"){for(let i of e.errors.slice(0,3))o.push(`${i.unit}: ${i.failure_type}/${i.failure_code} \xB7 ${i.retryable?"retryable":"terminal"}`);e.failure_summary.retryable>0&&o.push("rerun `scriptctl ingest` to resume retryable failures"),(e.failure_summary.by_type.policy??0)>0&&o.push("provider policy blocked the source; rerunning the same source is unlikely to help"),((e.failure_summary.by_type.authentication??0)>0||(e.failure_summary.by_type.authorization??0)>0)&&o.push("check provider credentials and permissions before rerunning")}return o}function Qd(e){let t=Math.round(e/1e3);return t>=60?`${Math.floor(t/60)}m${String(t%60).padStart(2,"0")}s`:`${t}s`}function mI(e){let t=[`elapsed ${Qd(e.elapsedMs)}${e.done?"":" (running)"}`],n=e.serial;return n&&(t.push(`serial ${n.doneWindows}/${n.totalWindows} windows (${n.doneEpisodes}/${n.totalEpisodes} eps)`),n.avgWindowMs!=null&&t.push(`~${Qd(n.avgWindowMs)}/window`),n.etaMs!=null&&!e.done&&t.push(`eta ~${Qd(n.etaMs)}`)),t.join(" \xB7 ")}function pg(e){let t=XS(e.workspace_path||"workspace"),n=_r(t);return[{text:fI(n).join(`
|
|
266
|
+
`),data:{status:n}},B]}import*as qs from"node:path";function cn(e,t,n,o){return new x(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function gI(e){let t=Number(e);if(!Number.isInteger(t)||t<=0)throw cn("--episode must be a positive integer.","INGEST_SKIP_EPISODE_INVALID","Pass the current next_episode from `scriptctl ingest status`.",[String(e)]);return t}async function hI(e,t,n){let o=new At(e);if(!o.has("manifest.json"))throw cn("The ingest workspace does not exist.","INGEST_SKIP_WORKSPACE_MISSING","Run video ingest first, then retry the failed episode or skip it.",[e]);if(o.readJson("manifest.json").source?.kind==="text")throw cn("Only video ingest episodes can be skipped.","INGEST_SKIP_WRONG_PIPELINE","Use skip only with a video ingest workspace.",[e]);let r=jd(o);if(!r)throw cn("The video ingest manifest is missing.","INGEST_SKIP_WORKSPACE_MISSING","Run video ingest first.",[e]);let s=r.episodes.find(_=>_.episode===t);if(!s)throw cn("The requested episode is not in the video source.","INGEST_SKIP_EPISODE_NOT_FOUND","Pass an episode listed in manifest.json.",[`episode=${t}`]);let c=Jd(o);js(c.episodes,r.episodes);let a=o.has("context.json")?o.readJson("context.json"):li();if(c.episodes.find(_=>_.episode===t)){let _=zd(o,r);a=gr(o,a,c.episodes);let y=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):oi();return Hs(o,_.episodes,a,Fs(_.source.path),y,c.episodes),!1}let p=a.lastEpisode+1;if(t!==p)throw cn("Only the next unresolved video episode can be skipped.","INGEST_SKIP_NOT_NEXT","Read status.next_episode and skip exactly that episode.",[`requested=${t}`,`next_episode=${p}`]);let l=`ep/ep_${String(t).padStart(3,"0")}`;if(o.has(`${l}.json`))throw cn("A parsed episode cannot be skipped.","INGEST_SKIP_ALREADY_PARSED","Continue ingest from the next unresolved episode.",[`episode=${t}`]);if(!o.has(`${l}.error.json`))throw cn("The episode has no recorded ingest failure.","INGEST_SKIP_FAILURE_REQUIRED","Run ingest for this episode first; a typed error sidecar is required before manual skip.",[`episode=${t}`]);let f=mr(o.readJson(`${l}.error.json`));if(!f||f.unit.episode!==t)throw cn("The episode error sidecar is invalid.","INGEST_SKIP_FAILURE_INVALID","Regenerate the typed failure by rerunning video ingest.",[`${l}.error.json`]);let u={episode:t,skipped_at:new Date().toISOString(),reason:n,source_sha256:s.sha256,failure:f.failure,attempts:f.attempts},m=zd(o,r),g=[...c.episodes,u];o.writeJson("manifest.json",{...m,updated:u.skipped_at,current_error:void 0,skips:g}),eg(o,{schema_version:1,episodes:g}),a=gr(o,a,g);let h=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):oi();return Hs(o,m.episodes,a,Fs(m.source.path),h,[...c.episodes,u]),!0}async function lg(e){let t=qs.resolve(typeof e.workspace_path=="string"?e.workspace_path:"workspace"),n=gI(e.episode),o=typeof e.reason=="string"?e.reason.trim():"";if(!o)throw cn("--reason is required.","INGEST_SKIP_REASON_REQUIRED","Record why this episode cannot be parsed.",["--reason <text>"]);let i=await fi(t,()=>hI(t,n,o)),r=_r(t),s=Jd(new At(t)).episodes.map(c=>c.episode);return[{text:i?`Episode ${n} skipped; ingest can continue at episode ${r.next_episode??"end"}.`:`Episode ${n} was already skipped; no changes made.`,data:{workspace:t,episode:n,changed:i,skipped_episodes:s,complete:r.complete??!1,next_episode:r.next_episode??null,script_path:qs.join(t,"script.json")}},B]}import*as Zs from"node:fs";import*as Lo from"node:path";import{spawnSync as yI}from"node:child_process";function Ws(e,t,n,o){return new x(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function _I(e){let t=Ds(Wn(e)),n=Ps(t);if(n)throw Ws("Video episode files are not a continuous 1..N sequence.","EVIDENCE_VIDEO_SEQUENCE_INVALID","Rename the linked videos so every script episode has one matching numbered file.",[n]);return t.map(o=>{let i=Lo.resolve(o.path),r=Zs.statSync(i),s=r.size,c=Math.trunc(r.mtimeMs),a=yI("ffprobe",["-v","error","-show_entries","format=duration","-of","default=noprint_wrappers=1:nokey=1",i],{encoding:"utf-8"}),d=Number(a.stdout.trim()),p=a.status===0&&Number.isFinite(d)&&d>0?Math.round(d*1e3):void 0;return{episode:o.episode,path:i,ext:o.ext,mime:o.mime,sha256:Se(JSON.stringify({absolutePath:i,sizeBytes:s,mtimeMs:c})),size_bytes:s,mtime_ms:c,duration_ms:p}})}async function wI(e){let t=Lo.resolve(e.scriptPath),n=Lo.resolve(e.sourcePath),o=Lo.resolve(e.workspacePath),i=Dr(JSON.parse(Zs.readFileSync(t,"utf-8"))),r=_I(n);if(r.length!==i.episodes.length)throw Ws("The linked video count does not match the script episode count.","EVIDENCE_VIDEO_EPISODE_COUNT_MISMATCH","Bind the complete source-video folder for this script, then retry.",[`script=${i.episodes.length}`,`videos=${r.length}`]);let s=Gs(r),c=$s([],i,li(),r,s),a=await fi(o,async()=>{let p=new At(o);return p.ensure(),Bs(p,c,e.signal,e.extractor,{reuseExistingFrames:e.force!==!0})}),d=[...a.items.flatMap(p=>p.samples),...(a.identities??[]).flatMap(p=>p.samples)];return{output:Lo.join(o,"evidence","state-evidence.json"),states:a.items.length,identities:a.identities?.length??0,samples:d.length,ready:d.filter(p=>p.frame_status==="ready").length,unavailable:d.filter(p=>p.frame_status==="unavailable").length,sourceSha256:s}}async function ug(e){let t=xe(e),n=typeof e.source_path=="string"?e.source_path.trim():"",o=typeof e.workspace_path=="string"?e.workspace_path.trim():"";if(!n)throw Ws("--source-path is required.","EVIDENCE_SOURCE_REQUIRED","Pass the linked source-video file or folder.",["--source-path <path>"]);if(!o)throw Ws("--workspace-path is required.","EVIDENCE_WORKSPACE_REQUIRED","Pass the project workspace directory.",["--workspace-path <path>"]);let i=await wI({scriptPath:t,sourcePath:n,workspacePath:o,force:e.force===!0});return[{text:`Generated ${i.ready}/${i.samples} original-video reference frames for ${i.states} actor states.`,data:{output:i.output,states:i.states,identities:i.identities,samples:i.samples,ready:i.ready,unavailable:i.unavailable,source_sha256:i.sourceSha256}},B]}import*as wi from"node:fs";import*as Xs from"node:path";var mt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Rn=e=>Array.isArray(e),$e=e=>typeof e=="string"?e:"",EI={interior:"\u5185",exterior:"\u5916"},xI={day:"\u65E5",night:"\u591C"},SI=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0},II=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0};function qd(e,t,n){let o=new Map;if(Rn(e))for(let i of e)mt(i)&&typeof i[t]=="string"&&o.set(i[t],$e(i[n]));return o}function AI(e,t){let n=new Map;if(Rn(e))for(let o of e){if(!mt(o)||typeof o[t]!="string")continue;let i=new Map;for(let r of Rn(o.states)?o.states:[])mt(r)&&typeof r.state_id=="string"&&i.set(r.state_id,$e(r.state_name));n.set(o[t],i)}return n}function kI(e,t){return mt(e)?typeof e.actor_id=="string"?t.get(e.actor_id)??e.actor_id:typeof e.kind=="string"?`${e.kind}${e.label?`:${$e(e.label)}`:""}`:"":""}function bI(e){let t=qd(e.actors,"actor_id","actor_name"),n=qd(e.locations,"location_id","location_name"),o=qd(e.props,"prop_id","prop_name"),i=AI(e.actors,"actor_id"),r=(Rn(e.episodes)?e.episodes:[]).filter(mt).map(c=>({episode:SI($e(c.episode_id)),synopsis:$e(c.synopsis),scenes:(Rn(c.scenes)?c.scenes:[]).filter(mt).map(a=>{let d=mt(a.location)?n.get($e(a.location.location_id))??$e(a.location.location_id):"",p=[],l={};for(let m of Rn(a.actors)?a.actors:[]){if(!mt(m)||typeof m.actor_id!="string")continue;let g=t.get(m.actor_id)??m.actor_id;if(p.includes(g)||p.push(g),typeof m.state_id=="string"){let _=(i.get(m.actor_id)?.get(m.state_id)??"")||(m.state_id!=="default"?m.state_id:"");_&&(l[g]=_)}}let f=[];for(let m of Rn(a.props)?a.props:[])if(mt(m)&&typeof m.prop_id=="string"){let g=o.get(m.prop_id)??m.prop_id;f.includes(g)||f.push(g)}let u=mt(a.environment)?a.environment:{};return{scene_num:II($e(a.scene_id)),location_name:d,environment:{space:EI[$e(u.space)]??$e(u.space),time:xI[$e(u.time)]??$e(u.time)},actor_names:p,actor_states:l,prop_names:f,actions:(Rn(a.actions)?a.actions:[]).filter(mt).map(m=>({type:$e(m.type),content:$e(m.content),speaker:kI(m.speaker,t),emotion:typeof m.emotion=="string"?m.emotion:void 0,extend:mt(m.extend)&&typeof m.extend.timestamp=="string"?{timestamp:m.extend.timestamp}:void 0}))}})})),s=(Rn(e.actors)?e.actors:[]).filter(mt).map(c=>({asset_name:$e(c.actor_name),description:$e(c.description),extend:{}}));return{title:$e(e.title),actors:s,episodes:r}}function fg(e){if(!mt(e))throw new Error("review renderer expects a script object");let t=bI(e),n=JSON.stringify(t),o=$e(t.title);return`<!DOCTYPE html>
|
|
267
|
+
<html lang="zh">
|
|
268
|
+
<head>
|
|
269
|
+
<meta charset="utf-8">
|
|
270
|
+
<title>\u5267\u672C\u5BA1\u9605\u5668 \xB7 ${o}</title>
|
|
271
|
+
<style>
|
|
272
|
+
* { box-sizing: border-box; }
|
|
273
|
+
html, body { margin: 0; height: 100%; font: 14px/1.6 -apple-system, "PingFang SC", system-ui, sans-serif; color: #1a1a1a; }
|
|
274
|
+
body { display: flex; flex-direction: column; height: 100vh; background: #f5f5f7; }
|
|
275
|
+
header { display: flex; align-items: center; gap: 12px; padding: 8px 14px; background: #fff; border-bottom: 1px solid #ddd; flex: none; }
|
|
276
|
+
header h1 { font-size: 15px; margin: 0; font-weight: 600; }
|
|
277
|
+
header select, header .nav { font-size: 13px; padding: 4px 8px; border: 1px solid #ccc; border-radius: 6px; background: #fff; cursor: pointer; }
|
|
278
|
+
header .spacer { flex: 1; }
|
|
279
|
+
header .hint { color: #888; font-size: 12px; }
|
|
280
|
+
main { flex: 1; display: flex; min-height: 0; }
|
|
281
|
+
.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; }
|
|
282
|
+
.left video { width: 100%; height: auto; max-height: 72vh; background: #000; }
|
|
283
|
+
.vbar { color: #ccc; font-size: 12px; padding: 6px 10px; width: 100%; display: flex; gap: 12px; align-items: center; background: #111; }
|
|
284
|
+
.vbar b { color: #fff; font-variant-numeric: tabular-nums; }
|
|
285
|
+
.right { flex: 1; overflow-y: auto; padding: 10px 4px 40vh 4px; background: #fafafa; }
|
|
286
|
+
.syn { background: #fff7e6; border: 1px solid #ffe0a3; border-radius: 8px; padding: 10px 12px; margin: 8px 10px 14px; color: #5b4a1f; font-size: 13px; }
|
|
287
|
+
.scene { margin: 0 10px 14px; border: 1px solid #e5e5e5; border-radius: 8px; overflow: hidden; background: #fff; }
|
|
288
|
+
.scene-head { background: #eef2f7; padding: 6px 12px; font-size: 12px; color: #445; display: flex; gap: 14px; flex-wrap: wrap; }
|
|
289
|
+
.scene-head .loc { font-weight: 600; color: #223; }
|
|
290
|
+
.rows { }
|
|
291
|
+
.row { display: flex; gap: 10px; padding: 5px 12px; border-top: 1px solid #f0f0f0; cursor: pointer; align-items: baseline; }
|
|
292
|
+
.row:hover { background: #eef6ff; }
|
|
293
|
+
.row.active { background: #d8ecff; }
|
|
294
|
+
.row .ts { flex: none; width: 46px; color: #3a7; font-variant-numeric: tabular-nums; font-size: 12px; }
|
|
295
|
+
.row .kind { flex: none; width: 58px; font-size: 12px; }
|
|
296
|
+
.row .kind.act { color: #999; }
|
|
297
|
+
.row .kind.dlg { color: #c60; font-weight: 600; }
|
|
298
|
+
.row .kind.think { color: #96c; font-style: italic; }
|
|
299
|
+
.row .body { flex: 1; }
|
|
300
|
+
.row .spk { color: #c60; font-weight: 600; margin-right: 4px; }
|
|
301
|
+
.row .emo { color: #a8a; font-size: 12px; margin-left: 4px; }
|
|
302
|
+
.row .body .subtitle { color: #b00; } /* \u753B\u9762\u5B57\u5E55\u5F15\u8FF0\uFF0C\u7EA2\u8272\u6807\u51FA */
|
|
303
|
+
/* ===== Tab ===== */
|
|
304
|
+
header .tabs { display: flex; gap: 4px; }
|
|
305
|
+
header .tab { font-size: 13px; padding: 5px 14px; border: 1px solid #ccc; border-radius: 6px; background: #fff; cursor: pointer; color: #555; }
|
|
306
|
+
header .tab.active { background: #1a6dff; color: #fff; border-color: #1a6dff; font-weight: 600; }
|
|
307
|
+
header .ep-ctl { display: flex; gap: 8px; align-items: center; }
|
|
308
|
+
/* ===== \u8D44\u4EA7\u603B\u89C8 ===== */
|
|
309
|
+
.assets { flex: 1; overflow-y: auto; padding: 16px 18px 30vh; background: #f5f5f7; }
|
|
310
|
+
.asset-sec { margin: 0 0 26px; }
|
|
311
|
+
.asset-sec > h2 { font-size: 15px; margin: 4px 0 12px; color: #223; display: flex; align-items: center; gap: 8px; }
|
|
312
|
+
.asset-sec > h2 .cnt { font-size: 12px; font-weight: 400; color: #888; background: #ececf0; padding: 1px 8px; border-radius: 10px; }
|
|
313
|
+
.acard { background: #fff; border: 1px solid #e3e3e6; border-radius: 10px; padding: 14px 16px; margin-bottom: 12px; }
|
|
314
|
+
.acard .ah { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
|
|
315
|
+
.acard .ah .nm { font-size: 17px; font-weight: 700; color: #1a1a1a; }
|
|
316
|
+
.acard .ah .id { font-size: 12px; color: #aaa; font-variant-numeric: tabular-nums; }
|
|
317
|
+
.acard .ah .meta { margin-left: auto; font-size: 12px; color: #888; display: flex; gap: 6px; }
|
|
318
|
+
.acard .ah .meta .tag { background: #f0f0f3; border-radius: 6px; padding: 1px 8px; }
|
|
319
|
+
.acard .desc { font-size: 13px; color: #555; margin: 7px 0 4px; }
|
|
320
|
+
.acard .anchor { font-size: 12px; color: #999; margin-bottom: 8px; }
|
|
321
|
+
/* \u72B6\u6001\xD7\u96C6 \u77E9\u9635 */
|
|
322
|
+
.mtx { overflow-x: auto; margin-top: 8px; border: 1px solid #eee; border-radius: 8px; }
|
|
323
|
+
table.tl { border-collapse: collapse; font-size: 12px; width: 100%; }
|
|
324
|
+
table.tl th, table.tl td { border: 1px solid #eee; padding: 5px 7px; text-align: center; white-space: nowrap; }
|
|
325
|
+
table.tl thead th { background: #f7f7f9; color: #556; font-weight: 600; position: sticky; top: 0; }
|
|
326
|
+
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; }
|
|
327
|
+
table.tl .stname.unmk { color: #999; font-weight: 400; }
|
|
328
|
+
table.tl .stname .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; vertical-align: middle; }
|
|
329
|
+
table.tl .stname .sc { color: #aaa; font-weight: 400; font-size: 11px; margin-left: 4px; }
|
|
330
|
+
table.tl td.cell { color: #ccc; }
|
|
331
|
+
table.tl td.hit { background: #fff0f0; }
|
|
332
|
+
table.tl td.hit.unmk { background: #f2f2f2; }
|
|
333
|
+
.scc { display: inline-block; min-width: 20px; margin: 1px; padding: 1px 6px; border-radius: 6px; font-variant-numeric: tabular-nums; cursor: pointer; }
|
|
334
|
+
.scc.on { background: #f4c9c9; color: #7a1f1f; border: 1px solid #e8a9a9; }
|
|
335
|
+
.scc.on.unmk { background: #dcdcdc; color: #555; border-color: #c9c9c9; }
|
|
336
|
+
.scc.on:hover { filter: brightness(0.94); }
|
|
337
|
+
</style>
|
|
338
|
+
</head>
|
|
339
|
+
<body>
|
|
340
|
+
<header>
|
|
341
|
+
<h1>${o||"\u5267\u672C\u5BA1\u9605\u5668"}</h1>
|
|
342
|
+
<div class="tabs">
|
|
343
|
+
<button class="tab active" id="tab-script">\u5267\u672C\u5BA1\u9605</button>
|
|
344
|
+
<button class="tab" id="tab-assets">\u8D44\u4EA7\u603B\u89C8</button>
|
|
345
|
+
</div>
|
|
346
|
+
<span class="ep-ctl">
|
|
347
|
+
<select id="epsel"></select>
|
|
348
|
+
<button class="nav" id="prev">\u25C0 \u4E0A\u4E00\u96C6</button>
|
|
349
|
+
<button class="nav" id="next">\u4E0B\u4E00\u96C6 \u25B6</button>
|
|
350
|
+
</span>
|
|
351
|
+
<span class="spacer"></span>
|
|
352
|
+
<span class="hint" id="hint">\u70B9\u4EFB\u610F\u5267\u672C\u884C \u2192 \u89C6\u9891\u8DF3\u5230\u8BE5\u65F6\u95F4\u6233</span>
|
|
353
|
+
</header>
|
|
354
|
+
<main id="view-script">
|
|
355
|
+
<div class="left">
|
|
356
|
+
<video id="vid" controls preload="metadata"></video>
|
|
357
|
+
<div class="vbar"><span>\u5F53\u524D <b id="cur">00:00</b></span><span id="epinfo"></span></div>
|
|
358
|
+
</div>
|
|
359
|
+
<div class="right" id="right"></div>
|
|
360
|
+
</main>
|
|
361
|
+
<div id="view-assets" class="assets" style="display:none"></div>
|
|
362
|
+
<script>
|
|
363
|
+
const SCRIPT = ${n};
|
|
364
|
+
const eps = SCRIPT.episodes.slice().sort((a,b)=>a.episode-b.episode);
|
|
365
|
+
const vid = document.getElementById('vid');
|
|
366
|
+
const right = document.getElementById('right');
|
|
367
|
+
const epsel = document.getElementById('epsel');
|
|
368
|
+
const cur = document.getElementById('cur');
|
|
369
|
+
const epinfo = document.getElementById('epinfo');
|
|
370
|
+
let curEp = eps.length?eps[0].episode:1;
|
|
371
|
+
|
|
372
|
+
function pad(n){return String(n).padStart(2,'0');}
|
|
373
|
+
function fmt(sec){sec=Math.max(0,sec|0);return pad(sec/60|0)+':'+pad(sec%60);}
|
|
374
|
+
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;}
|
|
375
|
+
function epId(n){return 'ep_'+String(n).padStart(3,'0');}
|
|
376
|
+
function actKind(t){return t==='dialogue'?'dlg':t==='inner_thought'?'think':'act';}
|
|
377
|
+
function actTs(a){return a && a.extend ? a.extend.timestamp : undefined;}
|
|
378
|
+
|
|
379
|
+
function renderBody(content){
|
|
380
|
+
const esc = content.replace(/&/g,'&').replace(/</g,'<');
|
|
381
|
+
return esc.replace(/(\u753B\u9762(?:\u5B57\u5E55|\u6587\u5B57)[:\uFF1A][^\u3002\uFF01\uFF1F\\n]*)/g,'<span class="subtitle">$1</span>');
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
for(const e of eps){
|
|
385
|
+
const o=document.createElement('option');
|
|
386
|
+
o.value=e.episode; o.textContent='\u7B2C '+e.episode+' \u96C6';
|
|
387
|
+
epsel.appendChild(o);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function loadEp(n, targetScene){
|
|
391
|
+
curEp=n;
|
|
392
|
+
epsel.value=n;
|
|
393
|
+
vid.src='src/'+epId(n)+'.mp4';
|
|
394
|
+
const ep=eps.find(e=>e.episode===n);
|
|
395
|
+
if(!ep)return;
|
|
396
|
+
epinfo.textContent='\u7B2C'+n+'\u96C6 \xB7 '+ep.scenes.length+'\u573A';
|
|
397
|
+
right.innerHTML='';
|
|
398
|
+
if(ep.synopsis){const s=document.createElement('div');s.className='syn';s.textContent='\u6897\u6982\uFF1A'+ep.synopsis;right.appendChild(s);}
|
|
399
|
+
for(const sc of ep.scenes){
|
|
400
|
+
const box=document.createElement('div');box.className='scene';
|
|
401
|
+
box.dataset.scene=sc.scene_num;
|
|
402
|
+
const head=document.createElement('div');head.className='scene-head';
|
|
403
|
+
const env=(sc.environment&&(sc.environment.space||'')+' '+(sc.environment.time||''))||'';
|
|
404
|
+
const chNames=sc.actor_names||[]; const chSt=sc.actor_states||{};
|
|
405
|
+
head.innerHTML='<span class="loc">\u573A\u666F'+sc.scene_num+' \xB7 '+(sc.location_name||'')+'</span>'+
|
|
406
|
+
'<span>'+env+'</span>'+
|
|
407
|
+
(chNames.length?'<span>\u89D2\u8272: '+chNames.map(nm=>nm+(chSt[nm]?'('+chSt[nm]+')':'')).join('\u3001')+'</span>':'');
|
|
408
|
+
box.appendChild(head);
|
|
409
|
+
const rows=document.createElement('div');rows.className='rows';
|
|
410
|
+
for(const a of sc.actions){
|
|
411
|
+
const ts=actTs(a); const kd=actKind(a.type); const sec=tsToSec(ts);
|
|
412
|
+
const row=document.createElement('div');row.className='row';row.dataset.sec=sec==null?'':sec;
|
|
413
|
+
const spk=a.speaker?'<span class="spk">'+a.speaker+'</span>':'';
|
|
414
|
+
const emo=a.emotion?'<span class="emo">['+a.emotion+']</span>':'';
|
|
415
|
+
row.innerHTML='<span class="ts">'+(ts||'')+'</span>'+
|
|
416
|
+
'<span class="kind '+kd+'">'+kd+'</span>'+
|
|
417
|
+
'<span class="body">'+spk+renderBody(a.content)+emo+'</span>';
|
|
418
|
+
if(sec!=null)row.addEventListener('click',()=>{vid.currentTime=sec;vid.play();});
|
|
419
|
+
rows.appendChild(row);
|
|
420
|
+
}
|
|
421
|
+
box.appendChild(rows);right.appendChild(box);
|
|
422
|
+
}
|
|
423
|
+
if(targetScene){
|
|
424
|
+
const tb=right.querySelector('.scene[data-scene="'+targetScene+'"]');
|
|
425
|
+
if(tb){tb.scrollIntoView({block:'start'}); tb.style.outline='2px solid #1a6dff'; setTimeout(()=>tb.style.outline='',1600);}
|
|
426
|
+
} else { right.scrollTop=0; }
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
vid.addEventListener('timeupdate',()=>{
|
|
430
|
+
cur.textContent=fmt(vid.currentTime);
|
|
431
|
+
const t=vid.currentTime;
|
|
432
|
+
const rows=[...right.querySelectorAll('.row')].filter(r=>r.dataset.sec!=='');
|
|
433
|
+
let active=null;
|
|
434
|
+
for(const r of rows){ if(+r.dataset.sec<=t+0.25) active=r; else break; }
|
|
435
|
+
right.querySelectorAll('.row.active').forEach(r=>r.classList.remove('active'));
|
|
436
|
+
if(active){active.classList.add('active');}
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
epsel.addEventListener('change',()=>loadEp(+epsel.value));
|
|
440
|
+
document.getElementById('prev').addEventListener('click',()=>{const i=eps.findIndex(e=>e.episode===curEp);if(i>0)loadEp(eps[i-1].episode);});
|
|
441
|
+
document.getElementById('next').addEventListener('click',()=>{const i=eps.findIndex(e=>e.episode===curEp);if(i<eps.length-1)loadEp(eps[i+1].episode);});
|
|
442
|
+
|
|
443
|
+
if(eps.length)loadEp(curEp);
|
|
444
|
+
|
|
445
|
+
// ===================== \u8D44\u4EA7\u603B\u89C8 =====================
|
|
446
|
+
const allEps = eps.map(e=>e.episode).sort((a,b)=>a-b);
|
|
447
|
+
const actorMeta = {};
|
|
448
|
+
for(const a of (SCRIPT.actors||[])){
|
|
449
|
+
const ext=a.extend||{};
|
|
450
|
+
actorMeta[a.asset_name]={role:a.description||'',anchor:ext.anchor||''};
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function aggAssets(){
|
|
454
|
+
const person={}, loc={}, prop={};
|
|
455
|
+
const addP=(nm,st,n,idx)=>{(person[nm]=person[nm]||{});(person[nm][st]=person[nm][st]||new Map()).set(n+':'+idx,{n,idx});};
|
|
456
|
+
const addX=(bag,nm,n,idx)=>{(bag[nm]=bag[nm]||new Map()).set(n+':'+idx,{n,idx});};
|
|
457
|
+
for(const ep of eps){ const n=ep.episode;
|
|
458
|
+
for(const sc of ep.scenes){ const idx=sc.scene_num;
|
|
459
|
+
const names=sc.actor_names||[]; const st=sc.actor_states||{};
|
|
460
|
+
for(const nm of names) addP(nm, st[nm]||'\u672A\u6807\u6CE8', n, idx);
|
|
461
|
+
if(sc.location_name) addX(loc, sc.location_name, n, idx);
|
|
462
|
+
for(const p of (sc.prop_names||[])) addX(prop, p, n, idx);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return {person,loc,prop};
|
|
466
|
+
}
|
|
467
|
+
const AG = aggAssets();
|
|
468
|
+
|
|
469
|
+
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); }
|
|
470
|
+
function sceneChips(occMap, unmk){
|
|
471
|
+
const byEp={}; for(const {n,idx} of occMap.values()){(byEp[n]=byEp[n]||[]).push(idx);}
|
|
472
|
+
return byEp;
|
|
473
|
+
}
|
|
474
|
+
function chipEl(n, idx, unmk){
|
|
475
|
+
const c=document.createElement('span'); c.className='scc on'+(unmk?' unmk':''); c.textContent=idx;
|
|
476
|
+
c.title='\u7B2C'+n+'\u96C6 \xB7 \u573A'+idx+' \u2192 \u8DF3\u8F6C';
|
|
477
|
+
c.addEventListener('click',(e)=>{e.stopPropagation();gotoScene(n,idx);});
|
|
478
|
+
return c;
|
|
479
|
+
}
|
|
480
|
+
function gotoScene(n, idx){ switchTab('script'); loadEp(n, idx); }
|
|
481
|
+
|
|
482
|
+
function personCard(name){
|
|
483
|
+
const states=AG.person[name]; const stKeys=Object.keys(states);
|
|
484
|
+
const involved=epsOf(Object.values(states));
|
|
485
|
+
const card=document.createElement('div'); card.className='acard';
|
|
486
|
+
const meta=actorMeta[name]||{};
|
|
487
|
+
const totalScenes=new Set(); for(const m of Object.values(states)) for(const k of m.keys()) totalScenes.add(k);
|
|
488
|
+
const head=document.createElement('div'); head.className='ah';
|
|
489
|
+
head.innerHTML='<span class="nm">'+esc(name)+'</span>'+
|
|
490
|
+
'<span class="meta"><span class="tag">'+totalScenes.size+' \u573A</span><span class="tag">'+involved.length+' \u96C6</span><span class="tag">'+stKeys.length+' \u72B6\u6001</span></span>';
|
|
491
|
+
card.appendChild(head);
|
|
492
|
+
if(meta.role){const d=document.createElement('div');d.className='desc';d.textContent=meta.role;card.appendChild(d);}
|
|
493
|
+
if(meta.anchor){const d=document.createElement('div');d.className='anchor';d.textContent='\u951A\u70B9\uFF1A'+meta.anchor;card.appendChild(d);}
|
|
494
|
+
const wrap=document.createElement('div'); wrap.className='mtx';
|
|
495
|
+
const tb=document.createElement('table'); tb.className='tl';
|
|
496
|
+
let thead='<thead><tr><th class="stname">\u72B6\u6001\uFF3C\u96C6</th>';
|
|
497
|
+
for(const n of involved) thead+='<th>'+n+'</th>';
|
|
498
|
+
thead+='</tr></thead>';
|
|
499
|
+
const ordered=stKeys.filter(s=>s!=='\u672A\u6807\u6CE8').sort((a,b)=>states[b].size-states[a].size);
|
|
500
|
+
if(states['\u672A\u6807\u6CE8']) ordered.push('\u672A\u6807\u6CE8');
|
|
501
|
+
const tbody=document.createElement('tbody');
|
|
502
|
+
for(const st of ordered){
|
|
503
|
+
const unmk=st==='\u672A\u6807\u6CE8';
|
|
504
|
+
const byEp=sceneChips(states[st], unmk);
|
|
505
|
+
const tr=document.createElement('tr');
|
|
506
|
+
const th=document.createElement('td'); th.className='stname'+(unmk?' unmk':'');
|
|
507
|
+
th.innerHTML='<span class="dot" style="background:'+(unmk?'#bbb':'#d9534f')+'"></span>'+esc(st)+'<span class="sc">'+states[st].size+'</span>';
|
|
508
|
+
tr.appendChild(th);
|
|
509
|
+
for(const n of involved){
|
|
510
|
+
const td=document.createElement('td'); td.className='cell'+(byEp[n]?' hit'+(unmk?' unmk':''):'');
|
|
511
|
+
if(byEp[n]){ for(const idx of byEp[n].sort((a,b)=>a-b)) td.appendChild(chipEl(n,idx,unmk)); }
|
|
512
|
+
tr.appendChild(td);
|
|
513
|
+
}
|
|
514
|
+
tbody.appendChild(tr);
|
|
515
|
+
}
|
|
516
|
+
tb.innerHTML=thead; tb.appendChild(tbody);
|
|
517
|
+
wrap.appendChild(tb); card.appendChild(wrap);
|
|
518
|
+
return card;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
function occCard(name, occMap){
|
|
522
|
+
const involved=epsOf([occMap]);
|
|
523
|
+
const card=document.createElement('div'); card.className='acard';
|
|
524
|
+
const head=document.createElement('div'); head.className='ah';
|
|
525
|
+
head.innerHTML='<span class="nm">'+esc(name)+'</span>'+
|
|
526
|
+
'<span class="meta"><span class="tag">'+occMap.size+' \u573A</span><span class="tag">'+involved.length+' \u96C6</span></span>';
|
|
527
|
+
card.appendChild(head);
|
|
528
|
+
const wrap=document.createElement('div'); wrap.className='mtx';
|
|
529
|
+
const tb=document.createElement('table'); tb.className='tl';
|
|
530
|
+
let thead='<thead><tr><th class="stname">\u51FA\u73B0\uFF3C\u96C6</th>';
|
|
531
|
+
for(const n of involved) thead+='<th>'+n+'</th>'; thead+='</tr></thead>';
|
|
532
|
+
const byEp=sceneChips(occMap,false);
|
|
533
|
+
const tbody=document.createElement('tbody'); const tr=document.createElement('tr');
|
|
534
|
+
const th=document.createElement('td'); th.className='stname';
|
|
535
|
+
th.innerHTML='<span class="dot" style="background:#5b8def"></span>\u51FA\u73B0';
|
|
536
|
+
tr.appendChild(th);
|
|
537
|
+
for(const n of involved){ const td=document.createElement('td'); td.className='cell'+(byEp[n]?' hit':'');
|
|
538
|
+
if(byEp[n]){ for(const idx of byEp[n].sort((a,b)=>a-b)) td.appendChild(chipEl(n,idx,false)); } tr.appendChild(td);}
|
|
539
|
+
tbody.appendChild(tr); tb.innerHTML=thead; tb.appendChild(tbody);
|
|
540
|
+
wrap.appendChild(tb); card.appendChild(wrap);
|
|
541
|
+
return card;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function esc(s){return String(s).replace(/&/g,'&').replace(/</g,'<');}
|
|
545
|
+
|
|
546
|
+
let assetsRendered=false;
|
|
547
|
+
function renderAssets(){
|
|
548
|
+
if(assetsRendered) return; assetsRendered=true;
|
|
549
|
+
const root=document.getElementById('view-assets');
|
|
550
|
+
const persons=Object.keys(AG.person).sort((a,b)=>{
|
|
551
|
+
const ea=new Set(),eb=new Set();
|
|
552
|
+
for(const m of Object.values(AG.person[a])) for(const {n} of m.values()) ea.add(n);
|
|
553
|
+
for(const m of Object.values(AG.person[b])) for(const {n} of m.values()) eb.add(n);
|
|
554
|
+
return eb.size-ea.size;
|
|
555
|
+
});
|
|
556
|
+
const secP=document.createElement('div'); secP.className='asset-sec';
|
|
557
|
+
secP.innerHTML='<h2>\u4EBA\u7269 <span class="cnt">'+persons.length+'</span></h2>';
|
|
558
|
+
for(const nm of persons) secP.appendChild(personCard(nm));
|
|
559
|
+
root.appendChild(secP);
|
|
560
|
+
const locs=Object.keys(AG.loc).sort((a,b)=>AG.loc[b].size-AG.loc[a].size);
|
|
561
|
+
const secL=document.createElement('div'); secL.className='asset-sec';
|
|
562
|
+
secL.innerHTML='<h2>\u573A\u666F <span class="cnt">'+locs.length+'</span></h2>';
|
|
563
|
+
for(const nm of locs) secL.appendChild(occCard(nm,AG.loc[nm]));
|
|
564
|
+
root.appendChild(secL);
|
|
565
|
+
const props=Object.keys(AG.prop).sort((a,b)=>AG.prop[b].size-AG.prop[a].size);
|
|
566
|
+
const secD=document.createElement('div'); secD.className='asset-sec';
|
|
567
|
+
secD.innerHTML='<h2>\u9053\u5177 <span class="cnt">'+props.length+'</span></h2>';
|
|
568
|
+
for(const nm of props) secD.appendChild(occCard(nm,AG.prop[nm]));
|
|
569
|
+
root.appendChild(secD);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
const tabScript=document.getElementById('tab-script'), tabAssets=document.getElementById('tab-assets');
|
|
573
|
+
const viewScript=document.getElementById('view-script'), viewAssets=document.getElementById('view-assets');
|
|
574
|
+
const epCtl=document.querySelector('.ep-ctl'), hint=document.getElementById('hint');
|
|
575
|
+
function switchTab(which){
|
|
576
|
+
const asset=which==='assets';
|
|
577
|
+
tabScript.classList.toggle('active',!asset); tabAssets.classList.toggle('active',asset);
|
|
578
|
+
viewScript.style.display=asset?'none':'flex'; viewAssets.style.display=asset?'block':'none';
|
|
579
|
+
epCtl.style.display=asset?'none':'flex';
|
|
580
|
+
hint.textContent=asset?'\u70B9\u573A\u53F7 \u2192 \u8DF3\u56DE\u5267\u672C\u5BA1\u9605\u5BF9\u5E94\u96C6/\u573A':'\u70B9\u4EFB\u610F\u5267\u672C\u884C \u2192 \u89C6\u9891\u8DF3\u5230\u8BE5\u65F6\u95F4\u6233';
|
|
581
|
+
if(asset) renderAssets();
|
|
582
|
+
}
|
|
583
|
+
tabScript.addEventListener('click',()=>switchTab('script'));
|
|
584
|
+
tabAssets.addEventListener('click',()=>switchTab('assets'));
|
|
585
|
+
</script>
|
|
586
|
+
</body>
|
|
587
|
+
</html>`}import*as mg from"node:http";import*as no from"node:fs";import*as dn from"node:path";import{spawn as vI}from"node:child_process";var OI=e=>e==null?"":String(e);function RI(e){let t=r=>{try{let s=no.statSync(dn.join(e,r));return{rel:r,size:s.size,mtime:s.mtimeMs}}catch{return null}},n=(r,s)=>{let c=[];try{c=no.readdirSync(dn.join(e,r))}catch{return[]}return c.filter(s).sort().map(a=>t(`${r}/${a}`)).filter(a=>!!a)},o=r=>r.filter(s=>!!s),i=r=>n("ep",s=>s.endsWith(r)&&!s.endsWith(".error.json"));return{\u7ED3\u679C:o([t("script.json"),t("validation.json"),t("asset-audit.json"),t("usage.json"),t("review.html"),t("timings.json")]),\u4E0A\u4E0B\u6587:n("serial",r=>r.startsWith("context_")&&r.endsWith(".md")),\u6BCF\u7A97\u66F4\u65B0:n("serial",r=>r.startsWith("win_")&&r.endsWith(".json")),\u7BC7\u7AE0\u6897\u6982:n("serial",r=>r.startsWith("arc_")&&r.endsWith(".md")),\u524D\u6BB5:n("pass2",r=>/^chunk_\d+\.json$/.test(r)),\u8F6C\u5F55:i(".md").filter(r=>!r.rel.endsWith(".context.md")),\u9001\u6A21\u4E0A\u4E0B\u6587:i(".context.md"),\u89E3\u6790:i(".json"),\u82B1\u540D\u518C:o([t("context.json")]),\u8BA1\u65F6:o([t("timing.jsonl")]),\u4E2D\u95F4\u4EA7\u7269:o([t("script.initial.json"),t("provisional_assets.json"),t("notes.json"),t("id_map.json"),t("manifest.json")])}}function NI(e){let t="";try{t=no.readFileSync(dn.join(e,"timing.jsonl"),"utf-8")}catch{return{episodes:[],totalMs:0}}let n=[],o=0;for(let i of t.split(/\r?\n/)){let r=i.trim();if(r)try{let s=JSON.parse(r);if(typeof s.episode!="number")continue;let c={episode:s.episode};typeof s.transcodeMs=="number"&&(c.transcodeMs=s.transcodeMs,o+=s.transcodeMs),typeof s.uploadMs=="number"&&(c.uploadMs=s.uploadMs,o+=s.uploadMs),typeof s.generateMs=="number"&&(c.generateMs=s.generateMs,o+=s.generateMs),typeof s.uploadMB=="string"&&(c.uploadMB=s.uploadMB),typeof s.transcoded=="boolean"&&(c.transcoded=s.transcoded),n.push(c)}catch{}}return{episodes:n,totalMs:o}}function MI(e){try{return JSON.parse(no.readFileSync(dn.join(e,"usage.json"),"utf-8"))}catch{return null}}function LI(e,t){let n=dn.resolve(e,t);if(n!==e&&!n.startsWith(e+dn.sep))return{ok:!1};try{return{ok:!0,text:no.readFileSync(n,"utf-8")}}catch{return{ok:!1}}}function wr(e,t,n,o){e.writeHead(t,{"Content-Type":n,"Cache-Control":"no-store"}),e.end(o)}async function gg(e){let t=dn.resolve(OI(e.workspace_path||"workspace")),n=Number(e.port)||0,o=mg.createServer((s,c)=>{let a=new URL(s.url??"/","http://localhost");if(a.pathname==="/")return wr(c,200,"text/html; charset=utf-8",TI);if(a.pathname==="/api/state"){let d=_r(t);return wr(c,200,"application/json",JSON.stringify({root:t,status:d,groups:RI(t),timing:NI(t),usage:MI(t)}))}if(a.pathname==="/api/file"){let d=a.searchParams.get("path")??"",p=LI(t,d);return p.ok?wr(c,200,"text/plain; charset=utf-8",p.text):wr(c,404,"text/plain","not found")}wr(c,404,"text/plain","not found")}),r=`http://127.0.0.1:${await new Promise((s,c)=>{o.once("error",c),o.listen(n,"127.0.0.1",()=>s(o.address().port))})}/`;if(process.stderr.write(`Ingest monitor: ${r}
|
|
588
|
+
Workspace: ${t}
|
|
589
|
+
Press Ctrl-C to stop.
|
|
590
|
+
`),process.platform==="darwin"&&process.stderr.isTTY)try{vI("open",[r],{detached:!0,stdio:"ignore"}).unref()}catch{}return process.once("SIGINT",()=>o.close()),process.once("SIGTERM",()=>o.close()),[{text:r,data:{url:r,workspace:t}},B]}var TI=`<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
591
|
+
<title>scriptctl ingest \u76D1\u542C</title>
|
|
592
|
+
<style>
|
|
593
|
+
:root{--bg:#f6f7f9;--panel:#ffffff;--panel2:#f0f2f5;--line:#e3e6ea;--fg:#1f2430;--dim:#6b7280;--acc:#2563eb;--ok:#16a34a;--warn:#d97706;--err:#dc2626}
|
|
594
|
+
*{box-sizing:border-box}body{margin:0;font:13px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;background:var(--bg);color:var(--fg);height:100vh;display:grid;grid-template-rows:auto auto 1fr}
|
|
595
|
+
header{padding:12px 16px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;gap:16px;align-items:center;flex-wrap:wrap}
|
|
596
|
+
header .title{font-weight:700;font-size:15px}
|
|
597
|
+
.now{font-size:14px}.now b{color:var(--acc)}
|
|
598
|
+
.state{padding:3px 12px;border-radius:20px;font-weight:600;font-size:12px}
|
|
599
|
+
.state.ready{background:#e7f6ee;color:var(--ok)}.state.incomplete{background:#e8f0fe;color:var(--acc)}.state.failed{background:#fde8e8;color:var(--err)}.state.empty{background:var(--panel2);color:var(--dim)}
|
|
600
|
+
.dim{color:var(--dim)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
601
|
+
/* overall bar + stage stepper */
|
|
602
|
+
.progress{background:var(--panel);border-bottom:1px solid var(--line);padding:12px 16px}
|
|
603
|
+
.ovwrap{display:flex;align-items:center;gap:10px;margin-bottom:12px}
|
|
604
|
+
.ovtrack{flex:1;height:10px;background:var(--panel2);border-radius:6px;overflow:hidden}
|
|
605
|
+
.ovtrack i{display:block;height:100%;background:linear-gradient(90deg,#3b82f6,#2563eb);border-radius:6px;transition:width .4s}
|
|
606
|
+
.ovpct{font-weight:700;min-width:44px;text-align:right}
|
|
607
|
+
.stages{display:flex;align-items:stretch;gap:0}
|
|
608
|
+
.stage{flex:1;padding:8px 12px;border:1px solid var(--line);background:var(--panel);border-radius:8px;margin-right:8px}
|
|
609
|
+
.stage:last-child{margin-right:0}
|
|
610
|
+
.stage-h{display:flex;align-items:center;gap:7px;font-weight:600}
|
|
611
|
+
.stage .dot{width:9px;height:9px;border-radius:50%;background:#cbd2dc;flex:none}
|
|
612
|
+
.stage .cnt{margin-left:auto;font-size:12px;color:var(--dim)}
|
|
613
|
+
.stage .track{height:6px;background:var(--panel2);border-radius:4px;margin-top:8px;overflow:hidden}
|
|
614
|
+
.stage .track i{display:block;height:100%;width:0;border-radius:4px;transition:width .4s}
|
|
615
|
+
.stage.wait{opacity:.7}
|
|
616
|
+
.stage.done{border-color:#bfe6cd}.stage.done .dot{background:var(--ok)}.stage.done .track i{background:var(--ok)}.stage.done .stage-h b{color:var(--ok)}
|
|
617
|
+
.stage.run{border-color:#bcd3fb;box-shadow:0 0 0 2px #e8f0fe}.stage.run .dot{background:var(--acc);animation:pulse 1.2s infinite}.stage.run .track i{background:var(--acc)}
|
|
618
|
+
.stage.fail{border-color:#f3bcbc}.stage.fail .dot{background:var(--err)}.stage.fail .track i{background:var(--err)}
|
|
619
|
+
@keyframes pulse{50%{opacity:.35}}
|
|
620
|
+
main{display:grid;grid-template-columns:280px 1fr;min-height:0}
|
|
621
|
+
aside{background:var(--panel);border-right:1px solid var(--line);overflow:auto;padding:8px}
|
|
622
|
+
.grp{margin:8px 4px 2px;color:var(--dim);font-size:11px;font-weight:700;letter-spacing:.04em}
|
|
623
|
+
.f{padding:4px 8px;border-radius:6px;cursor:pointer;display:flex;justify-content:space-between;gap:8px;white-space:nowrap;overflow:hidden}
|
|
624
|
+
.f:hover{background:var(--panel2)}.f.sel{background:#e8f0fe;color:var(--acc);font-weight:600}
|
|
625
|
+
.f .sz{color:var(--dim);font-size:11px}
|
|
626
|
+
section{overflow:auto;background:var(--panel)}
|
|
627
|
+
.toolbar{position:sticky;top:0;background:var(--panel2);border-bottom:1px solid var(--line);padding:6px 12px;display:flex;gap:14px;align-items:center;font-size:12px}
|
|
628
|
+
label{cursor:pointer;user-select:none}.empty{color:var(--dim);padding:34px;text-align:center}
|
|
629
|
+
#view{padding:14px 18px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
|
|
630
|
+
#view h1,#view h2{margin:14px 0 4px}#view h1{color:var(--acc);font-size:15px}#view h2{color:var(--warn);font-size:13px}
|
|
631
|
+
#view .b{color:var(--dim)}
|
|
632
|
+
/* per-episode timing table (video only) */
|
|
633
|
+
.timing{padding:8px 16px 4px;background:var(--panel);border-bottom:1px solid var(--line);overflow:auto;max-height:132px}
|
|
634
|
+
table.tm{border-collapse:collapse;font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
|
|
635
|
+
table.tm th,table.tm td{padding:2px 10px 2px 0;text-align:right}table.tm th:first-child,table.tm td:first-child{text-align:left}
|
|
636
|
+
table.tm th{color:var(--dim);font-weight:600;border-bottom:1px solid var(--line)}
|
|
637
|
+
table.tm td.slow{color:var(--warn)}
|
|
638
|
+
</style></head><body>
|
|
639
|
+
<header>
|
|
640
|
+
<span class="title">scriptctl ingest</span>
|
|
641
|
+
<span id="stateBadge" class="state empty">\u2014</span>
|
|
642
|
+
<span class="now">\u5F53\u524D\uFF1A<b id="curState">\u2014</b></span>
|
|
643
|
+
<span class="now">\u8017\u65F6 <b id="elapsed">\u2014</b></span>
|
|
644
|
+
<span class="dim" id="eta"></span>
|
|
645
|
+
<span class="now" id="tokWrap" style="display:none">Token <b id="tokTotal">\u2014</b> <span class="dim" id="tokIO"></span></span>
|
|
646
|
+
<span class="dim mono" id="root" style="margin-left:auto"></span>
|
|
647
|
+
<span class="dim" id="tick"></span>
|
|
648
|
+
</header>
|
|
649
|
+
<div class="progress">
|
|
650
|
+
<div class="ovwrap"><span class="dim">\u603B\u8FDB\u5EA6</span><div class="ovtrack"><i id="ovBar"></i></div><span class="ovpct" id="ovPct">0%</span></div>
|
|
651
|
+
<div class="stages" id="stages"></div>
|
|
652
|
+
</div>
|
|
653
|
+
<div class="timing" id="timingWrap" style="display:none"><table class="tm" id="tmTable"></table></div>
|
|
654
|
+
<div class="timing" id="usageWrap" style="display:none"><table class="tm" id="usageTable"></table></div>
|
|
655
|
+
<main>
|
|
656
|
+
<aside id="side"></aside>
|
|
657
|
+
<section>
|
|
658
|
+
<div class="toolbar">
|
|
659
|
+
<span id="cur" class="mono dim">\u672A\u9009\u62E9\u6587\u4EF6</span>
|
|
660
|
+
<label style="margin-left:auto"><input type="checkbox" id="follow" checked> \u8DDF\u968F\u6700\u65B0\u96C6</label>
|
|
661
|
+
</div>
|
|
662
|
+
<div id="view"><div class="empty">\u5DE6\u4FA7\u9009\u62E9\u6587\u4EF6\uFF0C\u6216\u7B49\u5F85 ingest \u4EA7\u51FA\u2026</div></div>
|
|
663
|
+
</section>
|
|
664
|
+
</main>
|
|
665
|
+
<script>
|
|
666
|
+
var NAMES={normalize:'\u89C4\u8303\u5316',assemble:'\u88C5\u914D',serial:'\u4E32\u884C\u89E3\u6790',govern:'\u6CBB\u7406\u6210\u7A3F',finalize:'\u6CBB\u7406\u6210\u7A3F',transcribe:'\u8F6C\u5199',roster:'\u89D2\u8272\u5408\u5E76',correct:'\u6821\u6B63',speaker:'\u53D1\u58F0\u6E90'};
|
|
667
|
+
var cur=null, follow=true, lastLatest=null;
|
|
668
|
+
var timing=null, timingAt=0; // last status.timings + client time it arrived (avoids clock skew)
|
|
669
|
+
function $(s){return document.querySelector(s)}
|
|
670
|
+
function fmtDur(ms){if(ms==null)return '\u2014';var s=Math.round(ms/1000);return s>=60?(Math.floor(s/60)+'m'+('0'+(s%60)).slice(-2)+'s'):s+'s'}
|
|
671
|
+
// per-episode timing table (video only; hidden when there is no timing.jsonl)
|
|
672
|
+
function fmtTok(n){if(n==null)return '\u2014';if(n>=1e6)return (n/1e6).toFixed(2)+'M';if(n>=1e3)return (n/1e3).toFixed(1)+'k';return ''+n}
|
|
673
|
+
var TASKNAMES={'ingest.body-start':'\u6B63\u6587\u5B9A\u4F4D','ingest.text-normalize':'\u89C4\u8303\u5316','ingest.serial-govern':'\u4E32\u884C\u6CBB\u7406','ingest.name-fix':'\u547D\u540D\u4FEE\u590D','ingest.episode-assets':'\u5206\u96C6\u8D44\u4EA7','ingest.asset-curate':'\u8D44\u4EA7\u7504\u9009','ingest.asset-govern':'\u8D44\u4EA7\u603B\u89C8','ingest.arc-summary':'\u7BC7\u7AE0\u6897\u6982','ingest.state-reconcile':'\u72B6\u6001\u5F52\u5E76','ingest.asset-audit':'\u8D44\u4EA7\u5BA1\u8BA1','ingest.mention-resolve':'\u6307\u79F0\u6D88\u89E3','ingest.video-serial':'\u89C6\u9891\u4E32\u884C'};
|
|
674
|
+
// Token accounting table + header badge. Hidden until usage.json exists.
|
|
675
|
+
function renderUsage(u){
|
|
676
|
+
if(!u||!u.totals){$('#usageWrap').style.display='none';$('#tokWrap').style.display='none';return}
|
|
677
|
+
var t=u.totals;
|
|
678
|
+
$('#tokWrap').style.display='';
|
|
679
|
+
$('#tokTotal').textContent=fmtTok(t.totalTokens);
|
|
680
|
+
var cacheHit=(t.cachedInputTokens||0),cacheNew=(t.cacheCreationTokens||0);
|
|
681
|
+
var cacheStr=(cacheHit||cacheNew)?' \xB7 \u7F13\u5B58\u547D\u4E2D '+fmtTok(cacheHit)+(cacheNew?'/\u5EFA '+fmtTok(cacheNew):''):'';
|
|
682
|
+
$('#tokIO').textContent='(\u5165 '+fmtTok(t.inputTokens)+' / \u51FA '+fmtTok(t.outputTokens)+cacheStr+' \xB7 '+t.calls+'\u6B21'+(t.reused?' \xB7 \u590D\u7528'+t.reused:'')+')';
|
|
683
|
+
var rows=[];
|
|
684
|
+
(u.byTask||[]).forEach(function(task){
|
|
685
|
+
(task.byModel||[]).forEach(function(model){
|
|
686
|
+
var r=model.totals||{};
|
|
687
|
+
if(r.calls>0||r.reused>0||r.inputTokens>0||r.outputTokens>0)rows.push({task:task.task,model:model.model,provider:model.provider,totals:r});
|
|
688
|
+
});
|
|
689
|
+
});
|
|
690
|
+
if(!rows.length){$('#usageWrap').style.display='none';return}
|
|
691
|
+
rows.sort(function(a,b){return (b.totals.totalTokens||0)-(a.totals.totalTokens||0)});
|
|
692
|
+
$('#usageWrap').style.display='block';
|
|
693
|
+
var h=['<tr><th>\u4EFB\u52A1</th><th>\u6A21\u578B</th><th>\u8C03\u7528</th><th>\u5931\u8D25</th><th>\u590D\u7528</th><th>\u5165token</th><th title="\u7F13\u5B58\u547D\u4E2D/\u65B0\u5EFA\uFF0C\u5747\u4E3A\u5165token\u7684\u5B50\u96C6">\u7F13\u5B58(\u547D\u4E2D/\u5EFA)</th><th>\u51FAtoken</th><th>\u5408\u8BA1</th></tr>'];
|
|
694
|
+
rows.forEach(function(row){
|
|
695
|
+
var r=row.totals,ch=r.cachedInputTokens||0,cn=r.cacheCreationTokens||0;
|
|
696
|
+
h.push('<tr><td>'+(TASKNAMES[row.task]||row.task)+'</td><td class="mono">'+row.provider+'/'+row.model+'</td><td>'+r.calls+'</td><td>'+(r.failed||0)+'</td><td>'+(r.reused||0)+'</td><td>'+fmtTok(r.inputTokens)+'</td><td class="dim">'+(ch||cn?fmtTok(ch)+'/'+fmtTok(cn):'\u2014')+'</td><td>'+fmtTok(r.outputTokens)+'</td><td>'+fmtTok(r.totalTokens)+'</td></tr>');
|
|
697
|
+
});
|
|
698
|
+
h.push('<tr><td class="dim">\u5408\u8BA1</td><td></td><td class="dim">'+t.calls+'</td><td class="dim">'+t.failed+'</td><td class="dim">'+t.reused+'</td><td class="dim">'+fmtTok(t.inputTokens)+'</td><td class="dim">'+(t.cachedInputTokens||t.cacheCreationTokens?fmtTok(t.cachedInputTokens||0)+'/'+fmtTok(t.cacheCreationTokens||0):'\u2014')+'</td><td class="dim">'+fmtTok(t.outputTokens)+'</td><td class="dim">'+fmtTok(t.totalTokens)+'</td></tr>');
|
|
699
|
+
$('#usageTable').innerHTML=h.join('');
|
|
700
|
+
}
|
|
701
|
+
function renderEpTiming(tm){
|
|
702
|
+
if(!tm||!tm.episodes||!tm.episodes.length){$('#timingWrap').style.display='none';return}
|
|
703
|
+
$('#timingWrap').style.display='block';
|
|
704
|
+
var rows=['<tr><th>\u96C6</th><th>\u8F6C\u7801</th><th>\u5927\u5C0F</th><th>\u4E0A\u4F20</th><th>\u89E3\u6790</th></tr>'];
|
|
705
|
+
tm.episodes.forEach(function(e){
|
|
706
|
+
var slow=e.generateMs>60000?' class="slow"':'';
|
|
707
|
+
rows.push('<tr><td>ep'+('00'+e.episode).slice(-3)+'</td><td>'+fmtDur(e.transcodeMs)+(e.transcoded===false?'*':'')+'</td><td>'+(e.uploadMB||'?')+'M</td><td>'+fmtDur(e.uploadMs)+'</td><td'+slow+'>'+fmtDur(e.generateMs)+'</td></tr>');
|
|
708
|
+
});
|
|
709
|
+
rows.push('<tr><td class="dim">\u7D2F\u8BA1</td><td></td><td></td><td></td><td class="dim">'+fmtDur(tm.totalMs)+'</td></tr>');
|
|
710
|
+
$('#tmTable').innerHTML=rows.join('');
|
|
711
|
+
}
|
|
712
|
+
// tick the total elapsed locally between polls; serial ETA/rate from the summary
|
|
713
|
+
function renderTiming(){
|
|
714
|
+
if(!timing){$('#elapsed').textContent='\u2014';$('#eta').textContent='';return}
|
|
715
|
+
var live=timing.elapsedMs+(timing.done?0:(Date.now()-timingAt));
|
|
716
|
+
$('#elapsed').textContent=fmtDur(live)+(timing.done?'':' \u2026');
|
|
717
|
+
var ser=timing.serial,eta='';
|
|
718
|
+
if(ser){
|
|
719
|
+
eta='\u4E32\u884C '+ser.doneWindows+'/'+ser.totalWindows+' \u7A97\u53E3';
|
|
720
|
+
if(ser.avgWindowMs!=null)eta+=' \xB7 ~'+fmtDur(ser.avgWindowMs)+'/\u7A97';
|
|
721
|
+
if(ser.etaMs!=null&&!timing.done)eta+=' \xB7 \u9884\u8BA1\u5269\u4F59 '+fmtDur(ser.etaMs);
|
|
722
|
+
}
|
|
723
|
+
$('#eta').textContent=eta;
|
|
724
|
+
}
|
|
725
|
+
$('#follow').onchange=function(e){follow=e.target.checked};
|
|
726
|
+
function esc(s){return s.replace(/[&<>]/g,function(c){return{'&':'&','<':'<','>':'>'}[c]})}
|
|
727
|
+
function renderContent(rel,text){
|
|
728
|
+
if(rel.endsWith('.jsonl')){$('#view').textContent=text.split('\\n').map(function(l){try{return JSON.stringify(JSON.parse(l))}catch(e){return l}}).join('\\n');return}
|
|
729
|
+
if(rel.endsWith('.json')){try{text=JSON.stringify(JSON.parse(text),null,2)}catch(e){}$('#view').textContent=text;return}
|
|
730
|
+
if(rel.endsWith('.md')){
|
|
731
|
+
$('#view').innerHTML=text.split('\\n').map(function(l){
|
|
732
|
+
if(l.indexOf('## ')===0)return '<h2>'+esc(l.slice(3))+'</h2>';
|
|
733
|
+
if(l.indexOf('# ')===0)return '<h1>'+esc(l.slice(2))+'</h1>';
|
|
734
|
+
if(l.indexOf(' ')===0||l.indexOf('- ')===0||l.indexOf('> ')===0)return '<span class="b">'+esc(l)+'</span>';
|
|
735
|
+
return esc(l)||' ';
|
|
736
|
+
}).join('\\n');return}
|
|
737
|
+
$('#view').textContent=text;
|
|
738
|
+
}
|
|
739
|
+
function loadFile(rel){
|
|
740
|
+
cur=rel;$('#cur').textContent=rel;
|
|
741
|
+
var fs=document.querySelectorAll('.f');for(var i=0;i<fs.length;i++)fs[i].classList.toggle('sel',fs[i].dataset.rel===rel);
|
|
742
|
+
fetch('/api/file?path='+encodeURIComponent(rel)).then(function(r){return r.text()}).then(function(t){renderContent(rel,t)}).catch(function(){});
|
|
743
|
+
}
|
|
744
|
+
function frac(p){return p.unit&&p.unit.total?p.unit.done/p.unit.total:(p.done?1:0)}
|
|
745
|
+
function poll(){
|
|
746
|
+
fetch('/api/state').then(function(r){return r.json()}).then(function(d){
|
|
747
|
+
var s=d.status,passes=s.passes||[];
|
|
748
|
+
$('#root').textContent=d.root;
|
|
749
|
+
$('#stateBadge').className='state '+s.state;
|
|
750
|
+
$('#stateBadge').textContent={ready:'\u5DF2\u5B8C\u6210',incomplete:'\u8FDB\u884C\u4E2D',failed:'\u5931\u8D25',empty:'\u7A7A'}[s.state]||s.state;
|
|
751
|
+
// overall progress = mean of per-stage fractions
|
|
752
|
+
var sum=0;passes.forEach(function(p){sum+=frac(p)});
|
|
753
|
+
var pct=passes.length?Math.round(100*sum/passes.length):0;
|
|
754
|
+
$('#ovBar').style.width=pct+'%';$('#ovPct').textContent=pct+'%';
|
|
755
|
+
// current stage
|
|
756
|
+
var curP=null;for(var i=0;i<passes.length;i++){if(!passes[i].done){curP=passes[i];break}}
|
|
757
|
+
$('#curState').textContent=s.state==='ready'?'\u5DF2\u5B8C\u6210 \u2713':(curP?(NAMES[curP.name]||curP.name)+(curP.unit?' \xB7 '+curP.unit.done+'/'+curP.unit.total:''):'\u2014');
|
|
758
|
+
// per-phase durations from timings (real wall-clock)
|
|
759
|
+
var ph={};((s.timings&&s.timings.phases)||[]).forEach(function(x){ph[x.name]=x});
|
|
760
|
+
// staged stepper with per-stage bars + real durations
|
|
761
|
+
$('#stages').innerHTML=passes.map(function(p){
|
|
762
|
+
var st=p.done?'done':(p.unit&&p.unit.failed?'fail':(p.unit&&p.unit.done>0||p===curP?'run':'wait'));
|
|
763
|
+
var cnt=p.unit?(p.unit.done+'/'+p.unit.total+(p.unit.failed?' \u2717'+p.unit.failed:'')):(p.done?'\u2713':'\u2014');
|
|
764
|
+
var d=ph[p.name]?('<span class="cnt">'+fmtDur(ph[p.name].ms)+(ph[p.name].running?' \u2026':'')+'</span>'):'';
|
|
765
|
+
return '<div class="stage '+st+'"><div class="stage-h"><span class="dot"></span><b>'+(NAMES[p.name]||p.name)+'</b><span class="cnt">'+cnt+'</span></div><div class="track"><i style="width:'+Math.round(frac(p)*100)+'%"></i></div>'+(d?'<div class="dim" style="margin-top:4px">'+d+'</div>':'')+'</div>';
|
|
766
|
+
}).join('');
|
|
767
|
+
timing=s.timings||null;timingAt=Date.now();renderTiming();
|
|
768
|
+
renderEpTiming(d.timing);
|
|
769
|
+
renderUsage(d.usage);
|
|
770
|
+
// sidebar
|
|
771
|
+
var html='',latest=null;
|
|
772
|
+
Object.keys(d.groups).forEach(function(grp){
|
|
773
|
+
var files=d.groups[grp];if(!files.length)return;html+='<div class="grp">'+grp+'</div>';
|
|
774
|
+
files.forEach(function(f){
|
|
775
|
+
html+='<div class="f" data-rel="'+f.rel+'"><span>'+f.rel.split('/').pop()+'</span><span class="sz">'+(f.size>1024?(f.size/1024).toFixed(0)+'k':f.size)+'</span></div>';
|
|
776
|
+
if(grp==='\u6BCF\u7A97\u66F4\u65B0'||grp==='\u4E0A\u4E0B\u6587'||grp==='\u8F6C\u5F55'||grp==='\u89E3\u6790')latest=f.rel;
|
|
777
|
+
});
|
|
778
|
+
});
|
|
779
|
+
$('#side').innerHTML=html;
|
|
780
|
+
var els=document.querySelectorAll('.f');
|
|
781
|
+
for(var j=0;j<els.length;j++){(function(el){el.onclick=function(){follow=false;$('#follow').checked=false;loadFile(el.dataset.rel)};if(el.dataset.rel===cur)el.classList.add('sel')})(els[j])}
|
|
782
|
+
$('#tick').textContent='\u25CF '+new Date().toLocaleTimeString();
|
|
783
|
+
if(follow&&latest&&latest!==lastLatest){lastLatest=latest;loadFile(latest)}
|
|
784
|
+
else if(cur){loadFile(cur)}
|
|
785
|
+
}).catch(function(){$('#tick').textContent='\u25CF \u79BB\u7EBF'});
|
|
786
|
+
}
|
|
787
|
+
poll();setInterval(poll,1500);setInterval(renderTiming,1000);
|
|
788
|
+
</script></body></html>`;var CI=e=>e==null?"":String(e),UI=e=>String(e).padStart(3,"0");function PI(e){if(!e.has("manifest.json"))return;let t=e.readJson("manifest.json");if(!Array.isArray(t.episodes))return;let n=e.path("src");wi.mkdirSync(n,{recursive:!0});for(let o of t.episodes){if(typeof o.episode!="number"||typeof o.path!="string")continue;let i=Xs.join(n,`ep_${UI(o.episode)}.mp4`);try{wi.rmSync(i,{force:!0}),wi.symlinkSync(o.path,i)}catch{}}}async function hg(e){if(e.watch){if((process.env.SANDBOX_PROJECT_GROUP_NO??"").trim())throw new x("`view --watch` runs a local web server and opens a browser; it is local-only and unavailable in the sandbox.",{exitCode:b,errorCode:"VIEW_WATCH_SANDBOX",hint:"Use `scriptctl ingest status` for progress in the sandbox; run `view --watch` on your local machine."});return gg(e)}let t=CI(e.workspace_path||"workspace"),n=new At(Xs.resolve(t));if(!n.has("script.json"))throw new x("workspace has no script.json to render.",{exitCode:b,errorCode:"VIEW_NO_SCRIPT",hint:"Run `scriptctl ingest --source-path <src> --workspace-path <dir>` first.",data:{actual:[n.path("script.json")]}});PI(n);let o=fg(n.readJson("script.json"));n.writeText("review.html",o);let i=n.path("review.html");return[{text:i,data:{output:i}},B]}import*as To from"node:path";import VI from"fast-json-patch";var{compare:yg}=VI;var _g="/api/anime/workbench/v2/script/project-groups",$I="/api/anime/workbench/projectGroup/updateProjectGroupInfo",DI=5e3,wg=8*1024*1024;function GI(e){let t=e.trim().replace(/\/+$/,"");for(let n of["/api/anime/workbench","/api/sandbox"])if(t.endsWith(n)){t=t.slice(0,-n.length);break}return t.replace(/\/+$/,"")}function Eg(e){return encodeURIComponent(String(e))}function BI(e,t,n){if(t===404&&n.includes("/imports"))return new de("backend lacks episode import API",{status:t,payload:e});let o=null;try{o=e?JSON.parse(e):null}catch{o=null}if(o&&typeof o=="object"){let i=o,r=String(i.msg??i.message??`HTTP ${t}`);return new de(r,{status:t,code:i.code??null,payload:i})}return new de(e||`HTTP ${t}`,{status:t,payload:e})}function xg(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=wg))throw new de(`script ${e} body too large: ${n} bytes (limit ${wg})`)}async function Sg(e,t,n,o,i,r={}){let s=r.body===void 0?void 0:JSON.stringify(r.body),c={Accept:"application/json","X-Access-Key":t};s!==void 0&&(c["Content-Type"]="application/json; charset=utf-8");let a=new AbortController,d=setTimeout(()=>a.abort(),n),p,l;try{let g=await fetch(`${e}${i}`,{method:o,headers:c,body:s,signal:a.signal});p=g.status,l=await g.text()}catch(g){if(g instanceof Error&&g.name==="AbortError")throw new de("Gateway request timed out");let h=g instanceof Error?g.message:String(g);throw new de(`Gateway request failed: ${h}`)}finally{clearTimeout(d)}if(p>=400)throw BI(l,p,i);let f=null;if(l)try{f=JSON.parse(l)}catch{throw new de("Gateway response is not valid JSON",{status:p,payload:l})}if(f===null)return null;if(typeof f!="object")return f;let u=f,m=u.code;if(m!=null&&String(m)!=="200"){let g=String(u.msg??u.message??"script-output API failed");if(r.allowMissing&&typeof g=="string"&&g.includes("\u5267\u672C\u4E0D\u5B58\u5728"))return null;throw new de(g,{status:p,code:m,payload:u})}return"data"in u?u.data:u}var Wd=class e{gatewayBase;projectGroupNo;accessKey;timeoutMs;constructor(t){this.gatewayBase=t.gatewayBase,this.projectGroupNo=t.projectGroupNo,this.accessKey=t.accessKey,this.timeoutMs=t.timeoutMs??3e5}static fromEnv(t){let n=(t??process.env.SANDBOX_PROJECT_GROUP_NO??"").trim();if(!n)throw new de("projectGroupNo missing; pass --project-group-no or set SANDBOX_PROJECT_GROUP_NO",{configMissing:"project"});let o=GI(process.env.AWB_BASE_URL||"");if(!o)throw new de("gateway URL missing; set AWB_BASE_URL",{configMissing:"gateway"});let i=(process.env.LINGJING_AWB_ACCESS_KEY||"").trim();if(!i)throw new de("access key missing; set LINGJING_AWB_ACCESS_KEY",{configMissing:"access"});return new e({gatewayBase:o,projectGroupNo:n,accessKey:i})}get projectPrefix(){return`${_g}/${Eg(this.projectGroupNo)}`}async getScript(){return await this.request("GET",this.projectPrefix,{allowMissing:!0})}async getRevision(){return await this.request("GET",`${this.projectPrefix}/revision`,{allowMissing:!0})}async getSnapshot(){return await this.request("GET",`${this.projectPrefix}/snapshot`,{allowMissing:!0})}async publishPatch(t){return await this.request("PATCH",`${this.projectPrefix}/publish`,{body:{baseRevision:t.baseRevision,patch:yg(t.old,t.edited),validation:t.validation}})}async replaceScript(t){let n={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",script:t.script};return xg("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=yg(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return xg("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${_g}/${Eg(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await Sg(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,DI),"POST",$I,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return Sg(this.gatewayBase,this.accessKey,this.timeoutMs,t,n,o)}};function Zd(e){return Wd.fromEnv(e)}var Er=class{workspace;script;version;baseline;baselineHash;scriptPath;client;projectGroupNo;revision;constructor(t){this.workspace=t.workspace,this.script=t.script,this.version=co(t.script),this.baseline=structuredClone(t.script),this.baselineHash=Ue(t.script),this.scriptPath=t.scriptPath??null,this.client=t.client??null,this.projectGroupNo=t.projectGroupNo??null,this.revision=t.revision??null}get remote(){return this.client!==null}get artifactLabel(){return this.remote?`script-output/${this.projectGroupNo}@revision/${this.revision??0}`:this.scriptPath??""}};function oo(e,t){let n=t.message||"script-output API failed",o=String(t.code)==="9002"||n.includes("\u7248\u672C\u51B2\u7A81"),i=n.includes("\u5267\u672C\u4E0D\u5B58\u5728"),r=o?"Script has been updated by another revision; keep local work and merge before retrying.":i?"Script not found on the gateway.":"Gateway request failed.";return new x(r,{exitCode:t.status!==null&&t.status>=500?fe:b,errorCode:o?"REVISION_CONFLICT":i?"SCRIPT_NOT_FOUND":"SCRIPT_API_FAILED",hint:o?"Keep the local file, inspect the latest remote snapshot, and merge before publishing again.":i?"Run `scriptctl publish` to publish a script first.":"Run `scriptctl doctor` to verify gateway configuration; retry if it was transient.",data:{expected:["successful script-output gateway request"],actual:[n,`status: ${t.status??"<unknown>"}`]}})}async function xr(e){let t=v(e.workspace_path||"workspace"),n=xe(e);if(!ro(n))throw new x("Local script file not found.",{exitCode:b,errorCode:"SCRIPT_NOT_FOUND",hint:"Run `scriptctl checkout`, `scriptctl create`, or pass --script-path to an existing script.",data:{expected:["existing local script JSON"],actual:[n]}});let o;try{o=ki(n)}catch(i){throw new x("script JSON invalid.",{exitCode:b,errorCode:"SCRIPT_JSON_INVALID",hint:"Fix the local script JSON syntax before editing.",data:{expected:["valid JSON"],actual:[`${n}: ${i.message}`]}})}if(!X(o))throw new x("script root invalid.",{exitCode:G,errorCode:"SCRIPT_ROOT_INVALID",hint:"Use a valid script document object.",data:{expected:["script root object"],actual:[Array.isArray(o)?"array":typeof o]}});return new Er({workspace:t,scriptPath:n,script:o})}function Sr(e,t={}){let n=Xd(e.script);return e.remote&&(n.script_path=e.artifactLabel),n}function JI(e,t){let{ok:n,errors:o,warnings:i}=t,r=[...o.map(d=>({severity:"error",code:d.code,path:d.path,summary:d.message,...d.repair_hint?{repair_hint:d.repair_hint}:{}})),...i.map(d=>({severity:"warning",code:d.code,path:d.path,summary:d.message,...d.repair_hint?{repair_hint:d.repair_hint}:{}}))],s=ee(e.episodes),c=0,a=0;for(let d of s)for(let p of ee(d.scenes))c+=1,a+=ee(p.actions).length;return{passed:n,has_blocking:!n,issues:r,stats:{actors:ee(e.actors).length,locations:ee(e.locations).length,props:ee(e.props).length,episodes:s.length,scenes:c,actions:a}}}function Xd(e){return JI(e,Ci(e))}function KI(e){if(e.path)return v(e.path);let t=[];return e.episode!==null&&e.episode!==void 0&&t.push(v(e.episode)),e.scene!==null&&e.scene!==void 0&&t.push(v(e.scene)),e.action_index!==null&&e.action_index!==void 0&&t.push(`action[${e.action_index}]`),t.length>0?t.join("/"):null}function jI(e){let t=v(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function zI(e){let t=ee(e.issues),n=e.passed?"valid":"invalid",o={passed:!!e.passed,hasBlocking:!!e.has_blocking,stats:e.stats??{},issueCount:t.length},i=[];for(let r of t){if(!X(r))continue;let s={...r};for(let c of["severity","code","path","summary","repair_hint"])delete s[c];i.push({severity:jI(r.severity),code:v(r.code||"SCRIPT_VALIDATION_ISSUE"),path:KI(r),summary:v(r.summary),repairHint:r.repair_hint,payload:s})}return[n,o,i]}async function ep(e,t,n){if(!e.remote||e.client===null)return;let o=Number(n??e.revision??0);if(o<=0)return;let[i,r,s]=zI(t);try{await e.client.saveValidationResult({revision:o,validationStatus:i,validationSummary:r,issues:s})}catch(c){throw c instanceof de?oo("SCRIPT API BLOCKED: Validation sync failed",c):c}}async function tp(e,t,n){if(e.scriptPath===null)throw new Error("local script session missing script path");return kt(e.scriptPath,e.baselineHash),Be(e.scriptPath,e.script),[null,!1]}async function Ig(e,t=kn){let n=await xr(e),o=t.createExecutor(v(e.llm_config).trim()||void 0),i=await vd(n.script,o);n.scriptPath&&kt(n.scriptPath,n.baselineHash);let r=n.scriptPath?To.dirname(n.scriptPath):To.resolve(n.workspace),s=To.resolve(v(e.output).trim()||To.join(r,"asset-audit.json"));Be(s,i);let c=i.issues.length>0,a=i.issues.map(Od);return[{text:[`${i.summary.issues} issues; confidence high=${i.summary.high} medium=${i.summary.medium} low=${i.summary.low}`,...a,`output: ${s}`,...c?["Inspect each finding, repair confirmed duplicates, then rerun `scriptctl audit-assets` and `scriptctl validate`."]:[]].join(`
|
|
789
|
+
`),data:{op:"script.audit-assets",changed:!1,issues:i.issues,output:s,asset_audit:i,config_source:o.configSource,llm_routes:o.usage()}},c?Ln:B]}function Ag(e=""){return{version:4,title:e,worldview:"",style:"",actors:[],locations:[],props:[],episodes:[]}}function io(e){let t=X(e.location)?e.location:null;return{actors:hn(e.actors)?e.actors:[],props:hn(e.props)?e.props:[],locations:t&&String(t.location_id??"").trim()?[t]:[]}}function Tg(e,t,n){let o=!!t.passed,i=[`created: blank script (Script v${e.version})`,`validation: ${o?"passed":"needs repair"}`];return e.remote&&(i.push(`revision: ${e.revision}`),n!==null&&i.push(`idempotent: ${String(n).toLowerCase()}`)),{text:i.join(`
|
|
790
|
+
`),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function Cg(e){let t=v(e.workspace_path||"workspace"),n=!!e.force,o=v(e.title).trim(),i=Ag(o),r=xe(e);if(ro(r)&&!n)throw new x("A script already exists at the target.",{exitCode:b,errorCode:"SCRIPT_EXISTS",hint:"Edit the existing script with the atomic verbs, or pass --force to overwrite with a blank scaffold.",data:{expected:["a non-existent target, or --force to overwrite"],actual:[r]}});Be(r,i);let s=new Er({workspace:t,scriptPath:r,script:i}),c=Sr(s),a=!!c.passed;return[Tg(s,c,null),a?B:Ln]}import*as xi from"node:fs";import*as Uo from"node:path";function rA(e){let t={};for(let n of e.episodes)for(let o of n.scenes){let i=`${n.episode_id}/${o.scene_id}`;o.actions.forEach((r,s)=>{let c=`${i}#${s}`;t[c]=c})}return t}function Co(e){return X(e)&&Object.values(e).every(t=>typeof t=="string")}function sA(e){return X(e)&&Object.values(e).every(Co)}function aA(e){return X(e)&&e.version===3&&Co(e.actor)&&Co(e.location)&&Co(e.prop)&&sA(e.state)&&Co(e.episode)&&Co(e.scene)&&Co(e.action)}function cA(e){if(e!==void 0){if(aA(e.identityMap))return e.identityMap;throw new x("Migration manifest contains an invalid v3-to-v4 identity map.",{exitCode:b,errorCode:"MIGRATE_MANIFEST_INVALID"})}}function Ug(e,t){let n=It(e),o=ii(n,cA(t),{action:rA(n)});return{script:o.script,artifact:{sourceVersion:3,targetVersion:4,identityMap:o.identityMap}}}var dA=[{sourceVersion:3,targetVersion:4,migrate:Ug}];function pA(e){return X(e)&&$n(e.source_version)&&$n(e.target_version)&&e.source_version<e.target_version&&"identity_map"in e}function Pg(e){if(!Array.isArray(e))throw new x("Migration manifest steps must be an array.",{exitCode:b,errorCode:"MIGRATE_MANIFEST_INVALID"});return e.map(t=>{if(!pA(t))throw new x("Migration manifest contains an invalid step artifact.",{exitCode:b,errorCode:"MIGRATE_MANIFEST_INVALID"});return{sourceVersion:t.source_version,targetVersion:t.target_version,identityMap:t.identity_map}})}function lA(e,t){return dA.find(n=>n.sourceVersion===e&&n.targetVersion<=t)}function uA(e,t){return e.find(n=>n.sourceVersion===t.sourceVersion&&n.targetVersion===t.targetVersion)}function Vg(e,t,n=[]){let o=co(e);if(t<o)throw new x("A migration target must be newer than the source script.",{exitCode:b,errorCode:"MIGRATE_TARGET_OLDER",data:{expected:[String(o)],actual:[String(t)]}});let i=jr(e),r=o,s=[];for(;r<t;){let c=lA(r,t);if(c===void 0)throw new x(`No migration path exists from Script v${r} to Script v${t}.`,{exitCode:b,errorCode:"MIGRATE_PATH_UNSUPPORTED",data:{actual:[String(r),String(t)]}});let a=c.migrate(i,uA(n,c));i=a.script,r=c.targetVersion,s.push(a.artifact)}return{sourceVersion:o,targetVersion:t,script:i,steps:s}}function Ir(e,t){let n=e[t];return typeof n=="string"?n.trim():""}function fA(e,t){let n=Ir(e,t);return/^\d+$/.test(n)?Number(n):null}function mA(e){let t=fA(e,"to");if($n(t))return t;throw new x("A supported migration target version is required.",{exitCode:G,errorCode:"MIGRATE_TARGET_INVALID",hint:"Pass --to <version> with a supported Script version.",data:{expected:Pa.map(String),actual:[Ir(e,"to")||"<empty>"]}})}function gA(e){let t=Uo.extname(e);return`${t.length>0?e.slice(0,-t.length):e}.migration.json`}function hA(e,t,n){let o=[e,t,n].map(i=>Uo.resolve(i));if(o[0]===o[1])throw new x("The migration destination must differ from the source.",{exitCode:G,errorCode:"MIGRATE_SAME_PATH",hint:"Choose a separate --output path. The source file stays unchanged.",data:{actual:[e]}});if(o[0]===o[2]||o[1]===o[2])throw new x("The migration manifest needs its own file path.",{exitCode:G,errorCode:"MIGRATE_MANIFEST_PATH",hint:"Choose a --manifest path separate from the source and output files.",data:{actual:[n]}})}function $g(e,t){if(!t&&xi.existsSync(e))throw new x("Migration destination already exists.",{exitCode:G,errorCode:"MIGRATE_OUTPUT_EXISTS",hint:"Choose a new path, or pass --force to replace the migration artifact.",data:{actual:[e]}})}function yA(e){let t;try{t=xi.readFileSync(e,"utf8")}catch(n){throw new x("Cannot read the source script.",{exitCode:G,errorCode:"MIGRATE_SOURCE_READ_FAILED",hint:"Pass an existing JSON file with --script-path.",data:{actual:[e,n instanceof Error?n.message:String(n)]}})}try{return{raw:t,value:JSON.parse(t)}}catch(n){throw new x("The source script is not valid JSON.",{exitCode:G,errorCode:"MIGRATE_SOURCE_JSON_INVALID",hint:"Repair the JSON syntax, then rerun migrate.",data:{actual:[n instanceof Error?n.message:String(n)]}})}}function _A(e,t){if(!t||!xi.existsSync(e))return;let n;try{n=JSON.parse(xi.readFileSync(e,"utf8"))}catch(o){throw new x("Cannot reuse the existing migration manifest.",{exitCode:G,errorCode:"MIGRATE_MANIFEST_INVALID",hint:"Restore the migration manifest, or choose a new --manifest path.",data:{actual:[e,o instanceof Error?o.message:String(o)]}})}if(!X(n)||n.version!==1||!$n(n.source_version)||!$n(n.target_version)||typeof n.source_path!="string"||typeof n.source_sha256!="string")throw new x("Cannot reuse the existing migration manifest.",{exitCode:G,errorCode:"MIGRATE_MANIFEST_INVALID",hint:"Restore the migration manifest, or choose a new --manifest path.",data:{actual:[e]}});return{version:1,source_version:n.source_version,target_version:n.target_version,source_path:n.source_path,source_sha256:n.source_sha256,steps:Pg(n.steps)}}async function Dg(e){let t=Ir(e,"script_path"),n=Ir(e,"output");if(!t||!n)throw new x("Migration paths are required.",{exitCode:G,errorCode:"MIGRATE_PATH_MISSING",hint:"Pass --script-path <source.json> and --output <target.json>.",data:{expected:["--script-path <source.json>","--output <target.json>"]}});let o=Uo.resolve(t),i=Uo.resolve(n),r=Uo.resolve(Ir(e,"manifest")||gA(i)),s=mA(e),c=!!e.force;return hA(o,i,r),Gr(i,async()=>{$g(i,c),$g(r,c);let a=yA(o),d=co(a.value);if(s<=d)throw new x("The migration target must be newer than the source script.",{exitCode:G,errorCode:"MIGRATE_TARGET_NOT_NEWER",data:{expected:[`>${d}`],actual:[String(s)]}});let p=Ci(a.value),l=_A(r,c),f=Vg(a.value,s,l?.steps),u=Ci(f.script),m={version:1,source_version:f.sourceVersion,target_version:f.targetVersion,source_path:o,source_sha256:Se(a.raw),steps:f.steps};Be(r,{...m,steps:m.steps.map(_=>({source_version:_.sourceVersion,target_version:_.targetVersion,identity_map:_.identityMap}))}),Be(i,f.script);let g={op:"script.migrate",changed:!0,source_script_path:o,script_path:i,manifest_path:r,source_version:f.sourceVersion,target_version:f.targetVersion,source_validation:{ok:p.ok,errors:p.errors.length,warnings:p.warnings.length},validation:{ok:u.ok,errors:u.errors.length,warnings:u.warnings.length,issues:u.errors.slice(0,100)}};return[{text:u.ok?[`Script v${f.targetVersion}: ${i}`,`Migration manifest: ${r}`,"validation: ok"].join(`
|
|
791
|
+
`):[`Script v${f.targetVersion}: ${i}`,`Migration manifest: ${r}`,`validation: ${u.errors.length} errors; repair before production use`].join(`
|
|
792
|
+
`),data:g},u.ok?B:Ln]})}import*as Si from"node:path";import*as Bg from"node:path";function Gg(e,t){let n=Se(t);return Bg.join(e,`${n}.json`)}function Ar(e){return{read(t){let n=Gg(e,t);return ro(n)?ki(n):null},write(t){fa(Gg(e,t.key),t)}}}function dp(){return{read(){return null},write(){}}}function pp(e){if(Array.isArray(e))return`[${e.map(t=>pp(t)).join(",")}]`;if(e&&typeof e=="object"){let t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${pp(t[n])}`).join(",")}}`}return JSON.stringify(e)}function lp(e){return Se(pp(e))}function up(e,t,n){return{key:e,signature:t,value:n,createdAt:new Date().toISOString()}}function wA(e,t){return[e.trim(),t.trim()].filter(Boolean).join(`
|
|
793
|
+
|
|
794
|
+
`)}function Kg(e,t){return{system:wA(e.instruction,e.format),user:e.input?e.input({parcel:t}):String(t)}}function EA(e,t,n){if(e.kind==="llm"){if(!n.executor)throw new Error("loom llm task requires run({ executor })");let o=Kg(e,t),i=n.executor.route(e.taskId);return{request:o,payload:{step:"extract",kind:"llm",taskId:e.taskId,version:e.version??"",routeFingerprint:i.fingerprint,system:o.system,user:o.user,salt:n.checkpointSalt}}}return{payload:{step:"extract",kind:"fn",version:e.version??"",parcel:t,salt:n.checkpointSalt}}}function ta(e){return{kind:"root",children:e}}function hp(e,t,n){return{kind:"scope",scope:e,data:n,children:t}}function kr(e){return{kind:"parcel",data:e}}function vr(e){return{kind:"llm",...e}}var fp=class e{constructor(t,n=[]){this.input=t;this.steps=n}input;steps;split(t){return new e(this.input,[...this.steps,{kind:"split",spec:t}])}extract(t){return new e(this.input,[...this.steps,{kind:"extract",task:t}])}reduce(t,n){let o=typeof n=="function"?{run:n}:n;return new e(this.input,[...this.steps,{kind:"reduce",scope:t,task:o}])}plan(){return{input:this.input,steps:[...this.steps]}}async run(t={}){return await bA(this.input,this.steps,t)}};function na(e){return new fp(e)}async function xA(e,t,n){if(e.length===0)return[];let o=new Array(e.length),i=0,r=Math.max(1,Math.min(t,e.length));return await Promise.all(Array.from({length:r},async()=>{for(;;){let s=i++;if(s>=e.length)break;o[s]=await n(e[s],s)}})),o}function SA(e,t){let n=t.partition(e);return ta(n.map(o=>{let i=t.chunk(o).map(r=>kr(r));return hp(t.scope,i,o)}))}function mp(e,t=[]){if(e.kind==="parcel")return[{parcel:e.data,path:t}];let n=(e.kind==="root",e.children),o=[];for(let i=0;i<n.length;i++){let r=n[i],s=r.kind==="scope"?[...t,`${r.scope}:${i}`]:[...t,`parcel:${i}`];o.push(...mp(r,s))}return o}function br(e,t){return e?.(t),t}async function IA(e,t){return br(e.validate,await e.run({parcel:t}))}async function AA(e,t,n){if(!n.executor)throw new Error("loom llm task requires run({ executor })");return n.executor.generateText(e.taskId,{system:t.system,user:t.user,signal:n.signal})}function Jg(e,t,n){return br(e.validate,e.parse({text:n.text,parcel:t,raw:n.raw}))}function jg(e,t,n){if(e.kind==="parcel"){let i=t[n.index];return n.index+=1,kr(i)}let o=e.children.map(i=>jg(i,t,n));return e.kind==="root"?ta(o):hp(e.scope,o,e.data)}function kA(e){return e.children.every(t=>t.kind==="parcel")}async function zg(e,t,n,o,i){if(e.kind==="parcel")return e;let r=[];for(let _=0;_<e.children.length;_++){let y=e.children[_];r.push(await zg(y,t,n,o,[...i,`${y.kind}:${_}`]))}let s=e.kind==="root"?ta(r):hp(e.scope,r,e.data),c=t==="root"&&s.kind==="root",a=s.kind==="scope"&&s.scope===t;if(!c&&!a||!kA(s))return s;let d=s.children.map(_=>_.data),p=s.kind==="scope"?s.data:null,l=s.kind==="scope"?s.scope:"root",f=n.version??"",u=`reduce:${t}:${i.join("/")}:${lp({items:d,scopeData:p,version:f,salt:o.checkpointSalt})}`,m=lp({step:"reduce",scope:t,version:f,items:d,scopeData:p,salt:o.checkpointSalt}),g=await gp(o.checkpoint,u,m);if(g.hit)return o.report.reused+=1,kr(br(n.validate,g.value));let h=br(n.validate,await n.run(d,{scope:p,scopeName:l}));return o.report.ran+=1,await o.checkpoint.write(up(u,m,h)),kr(h)}async function gp(e,t,n){let o=await e.read(t);return o&&o.signature===n?{hit:!0,value:o.value}:{hit:!1}}async function bA(e,t,n){let o={executor:n.executor,signal:n.signal,checkpointSalt:n.checkpointSalt,checkpoint:n.checkpoint??dp(),concurrency:n.concurrency??4,report:{reused:0,ran:0}},i=null,r=e;for(let c of t){if(c.kind==="split"){i=SA(r,c.spec),r=i;continue}if(i||(i=ta([kr(r)])),c.kind==="extract"){let a=mp(i),d=await xA(a,o.concurrency,async p=>{let l=EA(c.task,p.parcel,o),f=lp(l.payload),u=`extract:${p.path.join("/")}:${f}`;if(c.task.kind==="llm"){let h=await gp(o.checkpoint,u,f);if(h.hit)return o.report.reused+=1,o.executor?.recordReuse(c.task.taskId),Jg(c.task,p.parcel,h.value);let _=l.request??Kg(c.task,p.parcel),y=await AA(c.task,_,o),w=Jg(c.task,p.parcel,y);return o.report.ran+=1,await o.checkpoint.write(up(u,f,y)),w}let m=await gp(o.checkpoint,u,f);if(m.hit)return o.report.reused+=1,br(c.task.validate,m.value);let g=await IA(c.task,p.parcel);return o.report.ran+=1,await o.checkpoint.write(up(u,f,g)),g});i=jg(i,d,{index:0}),r=i;continue}i=await zg(i,c.scope,c.task,o,[]),r=i}if(!i)return{value:r,report:o.report};let s=mp(i);if(s.length!==1)throw new Error(`loom plan ended with ${s.length} result(s); reduce to root before run completes`);return{value:s[0].parcel,report:o.report}}var Qg={episodeInputMaxChars:6e3,episodeChunkTargetChars:4800,arcEpisodeCount:10,finalMaxInputChars:12e3},vA="\u4ECE\u5F53\u524D\u5267\u672C\u7247\u6BB5\u4E2D\u63D0\u53D6\u5267\u60C5\u6897\u6982\u548C\u5173\u952E\u4E8B\u4EF6\u3002\u53EA\u57FA\u4E8E\u5F53\u524D\u7247\u6BB5\uFF0C\u4E0D\u8981\u63A8\u6D4B\u540E\u7EED\u3002",OA=["\u8F93\u51FA\u683C\u5F0F\uFF1A\u4E00\u4E2A\u7EAF\u6587\u672C\u7ED3\u6784\u5316\u6587\u6863\u3002\u4E0D\u8981\u5305\u88F9\u4EE3\u7801\u5757\uFF0C\u4E0D\u8981\u5728\u6587\u6863\u524D\u540E\u6DFB\u52A0\u89E3\u91CA\u3002","","## \u7247\u6BB5\u6897\u6982","<\u5982\u679C\u5F53\u524D\u96C6\u53EA\u6709\u4E00\u4E2A\u7247\u6BB5\uFF0C\u5199 200-300 \u5B57\uFF1B\u5982\u679C\u5F53\u524D\u96C6\u88AB\u5207\u6210\u591A\u4E2A\u7247\u6BB5\uFF0C\u5199 80-150 \u5B57\u3002\u6309\u53D1\u751F\u987A\u5E8F\u6982\u62EC\uFF0C\u53EA\u5199\u5F53\u524D\u7247\u6BB5\u3002>","","## \u5173\u952E\u4E8B\u4EF6","- <\u4E8B\u4EF61>","- <\u4E8B\u4EF62>","","## \u4EBA\u7269\u53D8\u5316","- <\u4EBA\u7269\u540D> | <\u53D8\u5316>","","## \u7ED3\u5C3E\u94A9\u5B50","<\u6709\u5219\u5199\u4E00\u53E5\uFF1B\u6CA1\u6709\u5219\u7559\u7A7A>"].join(`
|
|
795
|
+
`),RA="\u628A\u540C\u4E00\u96C6\u7684\u591A\u4E2A\u7247\u6BB5\u6897\u6982\u5408\u5E76\u4E3A\u4E00\u96C6\u6897\u6982\u3002\u53EA\u4F7F\u7528\u8F93\u5165\u7247\u6BB5\uFF0C\u4E0D\u8981\u65B0\u589E\u5267\u60C5\u3002",NA=["\u8F93\u51FA\u683C\u5F0F\uFF1A\u4E00\u4E2A\u7EAF\u6587\u672C\u7ED3\u6784\u5316\u6587\u6863\u3002\u4E0D\u8981\u5305\u88F9\u4EE3\u7801\u5757\uFF0C\u4E0D\u8981\u5728\u6587\u6863\u524D\u540E\u6DFB\u52A0\u89E3\u91CA\u3002","","## \u5206\u96C6\u6897\u6982","<200-300 \u5B57\uFF0C\u6309\u5267\u60C5\u53D1\u751F\u987A\u5E8F\u5199\u6210\u8FDE\u8D2F\u6BB5\u843D\u3002>","","## \u5355\u53E5\u6897\u6982","<30-50 \u5B57\uFF0C\u6982\u62EC\u672C\u96C6\u4E3B\u7EBF\u3002>","","## \u5173\u952E\u4E8B\u4EF6","- <\u4E8B\u4EF61>","- <\u4E8B\u4EF62>"].join(`
|
|
796
|
+
`),MA="\u628A\u4E00\u7EC4\u8FDE\u7EED\u5206\u96C6\u6897\u6982\u538B\u7F29\u4E3A\u9636\u6BB5\u6897\u6982\u3002\u53EA\u4F7F\u7528\u8F93\u5165\u5206\u96C6\uFF0C\u4E0D\u8981\u65B0\u589E\u5267\u60C5\u3002",LA=["\u8F93\u51FA\u683C\u5F0F\uFF1A\u4E00\u4E2A\u7EAF\u6587\u672C\u7ED3\u6784\u5316\u6587\u6863\u3002\u4E0D\u8981\u5305\u88F9\u4EE3\u7801\u5757\uFF0C\u4E0D\u8981\u5728\u6587\u6863\u524D\u540E\u6DFB\u52A0\u89E3\u91CA\u3002","","## \u9636\u6BB5\u6897\u6982","<400-600 \u5B57\uFF0C\u6982\u62EC\u8FD9\u4E00\u9636\u6BB5\u7684\u4E3B\u7EBF\u63A8\u8FDB\u3002>","","## \u5173\u952E\u8F6C\u6298","- <\u8F6C\u62981>","- <\u8F6C\u62982>","","## \u672A\u89E3\u51B3\u60AC\u5FF5","- <\u60AC\u5FF51>"].join(`
|
|
797
|
+
`),TA="\u6839\u636E\u5206\u96C6\u7D22\u5F15\u548C\u9636\u6BB5\u6897\u6982\u751F\u6210\u5168\u5267\u603B\u89C8\u3002\u53EA\u4F7F\u7528\u8F93\u5165\u5185\u5BB9\uFF0C\u4E0D\u8981\u65B0\u589E\u5267\u60C5\u3001\u4EBA\u7269\u6216\u5173\u7CFB\u3002",CA=["\u8F93\u51FA\u683C\u5F0F\uFF1A\u4E00\u4E2A\u7EAF\u6587\u672C\u7ED3\u6784\u5316\u6587\u6863\u3002\u4E0D\u8981\u5305\u88F9\u4EE3\u7801\u5757\uFF0C\u4E0D\u8981\u5728\u6587\u6863\u524D\u540E\u6DFB\u52A0\u89E3\u91CA\u3002","","## \u5168\u6587\u6897\u6982","<800-1200 \u5B57\uFF0C\u8986\u76D6\u5168\u5267\u4E3B\u7EBF\u3001\u5173\u952E\u5173\u7CFB\u3001\u4E3B\u8981\u51B2\u7A81\u548C\u7ED3\u5C40\u8D70\u5411\u3002>","","## \u4E3B\u9898","<\u4E00\u53E5\u8BDD\u6216\u4E00\u4E2A\u77ED\u8BED>","","## \u4E00\u53E5\u8BDD","<\u4E00\u53E5\u5B8C\u6574 logline>","","## \u98CE\u683C","<\u7C7B\u578B / \u6C14\u8D28 / \u53D9\u4E8B\u98CE\u683C>","","## \u4E3B\u8981\u4EBA\u7269","- <\u540D\u5B57> | <\u89D2\u8272\u5B9A\u4F4D>"].join(`
|
|
798
|
+
`);function UA(e,t,n){let o=v(t.episode_id).trim()||`ep_${String(n+1).padStart(3,"0")}`,i=WA(o,n),r=v(t.title).trim(),s=[],c=v(e.title).trim();c&&s.push(`\u5267\u540D\uFF1A${c}`),s.push(`\u96C6\u6570\uFF1A\u7B2C${i}\u96C6`),r&&s.push(`\u6807\u9898\uFF1A${r}`),s.push("");for(let a of ee(t.scenes)){s.push(YA(e,a));for(let d of ee(a.actions)){let p=qA(e,d);p&&s.push(p)}s.push("")}return{episodeIndex:n,episodeId:o,episodeNo:i,title:r,existingSynopsis:v(t.synopsis).trim(),text:s.join(`
|
|
799
|
+
`).trim()}}function PA(e,t=Qg){let n=e.text.split(/\r?\n/),o=n.flatMap(c=>HA(c,t.episodeChunkTargetChars));if(e.text.length<=t.episodeInputMaxChars&&o.length===n.length)return[{episodeIndex:e.episodeIndex,episodeId:e.episodeId,episodeNo:e.episodeNo,title:e.title,part:1,partCount:1,text:e.text,sourceHash:Se(e.text)}];let i=[],r=[],s=0;for(let c of o){let a=c.length+(r.length>0?1:0);r.length>0&&s+a>t.episodeChunkTargetChars&&(i.push(r.join(`
|
|
800
|
+
`).trim()),r=[],s=0);let d=c.length+(r.length>0?1:0);r.push(c),s+=d}return r.length>0&&i.push(r.join(`
|
|
801
|
+
`).trim()),i.map((c,a)=>({episodeIndex:e.episodeIndex,episodeId:e.episodeId,episodeNo:e.episodeNo,title:e.title,part:a+1,partCount:i.length,text:c,sourceHash:Se(c)}))}function VA(e,t){let n=ia(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,part:t.part,partCount:t.partCount,synopsis:Nn(n,"\u7247\u6BB5\u6897\u6982"),events:Ii(n.get("\u5173\u952E\u4E8B\u4EF6")??""),characterChanges:XA(n.get("\u4EBA\u7269\u53D8\u5316")??""),hook:(n.get("\u7ED3\u5C3E\u94A9\u5B50")??"").trim()}}function $A(e,t){let n=s5(t.scope,"episode"),o=[...e].sort((i,r)=>i.part-r.part);return{episodeIndex:n.episodeIndex,episodeId:n.episodeId,episodeNo:n.episodeNo,title:n.title,synopsis:o.map(i=>i.synopsis).filter(i=>i.trim()).join(`
|
|
802
|
+
`),oneLine:c5(o.map(i=>i.synopsis)),events:wp(o.flatMap(i=>i.events))}}function DA(e,t){let n=ia(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,synopsis:Nn(n,"\u5206\u96C6\u6897\u6982"),oneLine:Nn(n,"\u5355\u53E5\u6897\u6982"),events:Ii(n.get("\u5173\u952E\u4E8B\u4EF6")??"")}}function GA(e,t){let n=[];for(let o=0;o<e.length;o+=t){let i=e.slice(o,o+t),r=i[0],s=i[i.length-1];n.push({index:n.length+1,startEpisodeNo:r.episodeNo,endEpisodeNo:s.episodeNo,text:o5(i)})}return n}function BA(e,t){let n=[];for(let o=0;o<e.length;o+=t){let i=e.slice(o,o+t),r=i[0],s=i[i.length-1];n.push({index:n.length+1,startEpisodeNo:r.startEpisodeNo,endEpisodeNo:s.endEpisodeNo,text:i5(i)})}return n}function JA(e,t){let n=ia(e);return{index:t.index,startEpisodeNo:t.startEpisodeNo,endEpisodeNo:t.endEpisodeNo,synopsis:Nn(n,"\u9636\u6BB5\u6897\u6982"),turns:Ii(n.get("\u5173\u952E\u8F6C\u6298")??""),openQuestions:Ii(n.get("\u672A\u89E3\u51B3\u60AC\u5FF5")??"")}}function KA(e){let t=[...e].sort((i,r)=>i.startEpisodeNo-r.startEpisodeNo),n=t[0],o=t[t.length-1];if(!n||!o)throw new Error("arc reduce requires at least one item");return{index:n.index,startEpisodeNo:n.startEpisodeNo,endEpisodeNo:o.endEpisodeNo,synopsis:t.map(i=>`\u7B2C${i.startEpisodeNo}-${i.endEpisodeNo}\u96C6\uFF1A${i.synopsis}`).join(`
|
|
803
|
+
`),turns:wp(t.flatMap(i=>i.turns)),openQuestions:wp(t.flatMap(i=>i.openQuestions))}}function yp(e,t){let n=["\u5206\u96C6\u7D22\u5F15\uFF1A"];for(let o of[...e].sort((i,r)=>i.episodeNo-r.episodeNo))n.push(`\u7B2C${o.episodeNo}\u96C6\uFF1A${o.oneLine||o.synopsis}`);n.push("","\u9636\u6BB5\u6897\u6982\uFF1A");for(let o of[...t].sort((i,r)=>i.startEpisodeNo-r.startEpisodeNo))n.push(`\u7B2C${o.startEpisodeNo}-${o.endEpisodeNo}\u96C6\uFF1A${o.synopsis}`);return n.join(`
|
|
804
|
+
`)}function jA(e){let t=ia(e);return{synopsis:Nn(t,"\u5168\u6587\u6897\u6982"),theme:Nn(t,"\u4E3B\u9898"),logline:Nn(t,"\u4E00\u53E5\u8BDD"),style:Nn(t,"\u98CE\u683C"),mainCharacters:e5(Nn(t,"\u4E3B\u8981\u4EBA\u7269"))}}async function zA(e){let t=e.config??Qg,n=ee(e.script.episodes);if(n.length===0)throw new x("No episodes found in script.",{exitCode:G,errorCode:"SCRIPT_EPISODES_MISSING",hint:"Create or parse episodes before generating synopsis.",data:{expected:["script.episodes[] with at least one episode"],actual:["episodes: 0"]}});let o=n.map((u,m)=>UA(e.script,u,m)),i=e.overwrite?o:o.filter(u=>!u.existingSynopsis),r=i.length===0?[]:await na(e.script).split({scope:"episode",partition:()=>i,chunk:u=>PA(u,t)}).extract(vr({taskId:"synopsis.chunk",instruction:vA,format:OA,input:({parcel:u})=>t5(u),parse:({text:u,parcel:m})=>VA(u,m)})).reduce("episode",$A).extract(vr({taskId:"synopsis.episode",instruction:RA,format:NA,input:({parcel:u})=>n5(u),parse:({text:u,parcel:m})=>DA(u,m)})).reduce("root",u=>[...u].sort((m,g)=>m.episodeNo-g.episodeNo)).run({concurrency:e.concurrency,checkpoint:Ar(Si.join(e.checkpointDir,"episode")),checkpointSalt:e.checkpointSalt,executor:e.executor}),s=Array.isArray(r)?r:r.value,c=new Map(s.map(u=>[u.episodeIndex,u])),a=o.map(u=>c.get(u.episodeIndex)??{episodeIndex:u.episodeIndex,episodeId:u.episodeId,episodeNo:u.episodeNo,title:u.title,synopsis:u.existingSynopsis,oneLine:d5(u.existingSynopsis),events:[]}),d=a.filter(u=>!u.synopsis.trim()).map(u=>u.episodeId);if(d.length>0)throw new x("Some episode synopses are still missing.",{exitCode:fe,errorCode:"EPISODE_SYNOPSIS_MISSING",hint:"Use --overwrite to regenerate, or manually set missing episode synopses.",data:{expected:["every episode has synopsis"],actual:d}});let p=e.overwrite||l5(e.script),l=p?await FA({episodes:a,executor:e.executor,checkpointDir:Si.join(e.checkpointDir,"arc"),checkpointSalt:e.checkpointSalt,concurrency:e.concurrency,config:t}):{value:[],report:{reused:0,ran:0}},f=p?await QA({episodes:a,arcs:l.value,executor:e.executor,checkpointDir:Si.join(e.checkpointDir,"final"),checkpointSalt:e.checkpointSalt,config:t}):{value:u5(e.script),report:{reused:0,ran:0}};return{episodeBriefs:a,overview:f.value,overviewGenerated:p,report:{reused:(Array.isArray(r)?0:r.report.reused)+l.report.reused+f.report.reused,ran:(Array.isArray(r)?0:r.report.ran)+l.report.ran+f.report.ran}}}async function Yg(e,t=kn){let n=p5(e.concurrency,kp,"--concurrency"),o=!!e.overwrite,i=!!e.apply,r=!!e.dry_run;if(i&&r)throw new x("--apply and --dry-run are mutually exclusive.",{exitCode:G,errorCode:"SYNOPSIS_GENERATE_FLAG_CONFLICT",hint:"Pick one mode and retry.",data:{expected:["at most one of --apply / --dry-run"],actual:["--apply","--dry-run"]}});let s=v(e.workspace_path||"workspace"),c=await xr(e),a=t.createExecutor(v(e.llm_config).trim()||void 0),d=v(e.checkpoint).trim()||Si.join(Op(s),"loom","synopsis-generate"),p=await zA({script:c.script,executor:a,checkpointDir:d,concurrency:n,overwrite:o}),l=new Set,f=ee(c.script.episodes);for(let A of p.episodeBriefs){let k=f[A.episodeIndex];k&&(o||!v(k.synopsis).trim())&&v(k.synopsis)!==A.synopsis&&(k.synopsis=A.synopsis,l.add(A.episodeId))}let u=!1;if(u=oa(c.script,"synopsis",p.overview.synopsis,o)||u,u=oa(c.script,"theme",p.overview.theme,o)||u,u=oa(c.script,"logline",p.overview.logline,o)||u,u=oa(c.script,"style",p.overview.style,o)||u,o||ee(c.script.main_characters).length===0){let A=p.overview.mainCharacters.map(k=>({name:k.name,role:k.role}));JSON.stringify(c.script.main_characters??[])!==JSON.stringify(A)&&(c.script.main_characters=A,u=!0)}let m=l.size>0||u,g=Sr(c),h=!!g.passed,_=[`${p.episodeBriefs.length} episodes; ${l.size} synopses ${i?"written":"would change"}; overview ${p.overviewGenerated?"generated":"reused"}; validation ${h?i?"passed":"would pass":i?"needs repair":"would need repair"}${i?"":"; dry-run, no write"}`,`loom: ran=${p.report.ran}, reused=${p.report.reused}`,`llm config: ${a.configSource}; routes: ${a.usage().length}`],y,w;i&&m&&([y,w]=await tp(c,e,"synopsis.generate"),await ep(c,g,y),c.remote&&_.push(`revision ${y}; idempotent ${String(w).toLowerCase()}`));let I=sc(ee(g.issues));return i||_.push("Run again with --apply to write the generated synopsis fields."),[{text:[..._,...I].join(`
|
|
805
|
+
`),data:{op:i?"synopsis.generate":"synopsis.generate.dry-run",changed:i&&m,revision:y,idempotent:w,validation:g,issues:I,script_path:c.artifactLabel,episode_synopses:p.episodeBriefs.map(A=>({episode_id:A.episodeId,title:A.title,synopsis:A.synopsis,one_line:A.oneLine})),config_source:a.configSource,llm_routes:a.usage()}},B]}function HA(e,t){if(e.length<=t)return[e];let n=[];for(let o=0;o<e.length;o+=t)n.push(e.slice(o,o+t));return n}async function FA(e){let t=GA(e.episodes,e.config.arcEpisodeCount),n=1,o={reused:0,ran:0};for(;;){let i=await na(t).split({scope:"arc",partition:c=>c,chunk:c=>[c]}).extract(vr({taskId:"synopsis.arc",instruction:MA,format:LA,input:({parcel:c})=>r5(c),parse:({text:c,parcel:a})=>JA(c,a)})).reduce("arc",c=>a5(c,"arc")).reduce("root",c=>[...c].sort((a,d)=>a.startEpisodeNo-d.startEpisodeNo)).run({concurrency:e.concurrency,checkpoint:Ar(Si.join(e.checkpointDir,`level-${n}`)),checkpointSalt:e.checkpointSalt,executor:e.executor});o.reused+=i.report.reused,o.ran+=i.report.ran;let r=i.value;if(yp(e.episodes,r).length<=e.config.finalMaxInputChars||r.length<=1)return{value:r,report:o};t=BA(r,e.config.arcEpisodeCount),n+=1}}async function QA(e){let t=e.arcs;for(;yp(e.episodes,t).length>e.config.finalMaxInputChars&&t.length>1;)t=[KA(t)];let n=await na({episodes:e.episodes,arcs:t}).extract(vr({taskId:"synopsis.script-overview",instruction:TA,format:CA,input:({parcel:o})=>yp(o.episodes,o.arcs),parse:({text:o})=>jA(o)})).run({concurrency:1,checkpoint:Ar(e.checkpointDir),checkpointSalt:e.checkpointSalt,executor:e.executor});return{value:n.value,report:n.report}}function YA(e,t){let n=X(t.environment)?t.environment:{},o=v(n.space).trim(),i=v(n.time).trim(),r=io(t),s=ee(r.locations).map(p=>_p(e,"locations","location_id","location_name",v(p.location_id))).filter(p=>p),c=ee(r.actors).map(p=>_p(e,"actors","actor_id","actor_name",v(p.actor_id))).filter(p=>p),a=s.join("\u3001")||"-";return`[\u573A\u666F] ${[o,i].filter(p=>p).join(" ")||"-"}\uFF5C${a}\uFF5C\u51FA\u573A\uFF1A${c.join("\u3001")||"-"}`}function qA(e,t){let n=v(t.type).trim();if(n==="dialogue"){let i=Hg(e,t),r=v(t.content).trim();return r?`[\u5BF9\u767D] ${i?`${i}\uFF1A`:""}${r}`:""}if(n==="inner_thought"){let i=Hg(e,t),r=v(t.content).trim();return r?`[\u5FC3\u58F0] ${i?`${i}\uFF1A`:""}${r}`:""}let o=v(t.content).trim();return o?`[\u52A8\u4F5C] ${o}`:""}function Hg(e,t){let n=t.speaker;if(!X(n))return"";let o=v(n.actor_id).trim();if(o)return _p(e,"actors","actor_id","actor_name",o)||o;let i=v(n.kind).trim();return i?v(n.label).trim()||i:""}function _p(e,t,n,o,i){let r=ee(e[t]).find(s=>v(s[n])===i);return r?v(r[o]).trim():""}function WA(e,t){let n=/^ep_(\d+)$/.exec(e);return n?Number(n[1]):t+1}function ia(e){let t=new Map,n=null,o=[],i=()=>{n&&t.set(n,o.join(`
|
|
806
|
+
`).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=ZA(r);if(s){if(n===s.name&&s.inline){o.push(r);continue}i(),n=s.name,s.inline&&o.push(s.inline);continue}n&&o.push(r)}return i(),t}var Fg=new Set(["\u7247\u6BB5\u6897\u6982","\u5173\u952E\u4E8B\u4EF6","\u4EBA\u7269\u53D8\u5316","\u7ED3\u5C3E\u94A9\u5B50","\u5206\u96C6\u6897\u6982","\u5355\u53E5\u6897\u6982","\u9636\u6BB5\u6897\u6982","\u5173\u952E\u8F6C\u6298","\u672A\u89E3\u51B3\u60AC\u5FF5","\u5168\u6587\u6897\u6982","\u4E3B\u9898","\u4E00\u53E5\u8BDD","\u98CE\u683C","\u4E3B\u8981\u4EBA\u7269"]);function ZA(e){let t=e.trim(),n=/^#{1,6}\s+(.+?)\s*$/.exec(t);if(n){let r=n[1].trim();return Fg.has(r)?{name:r,inline:""}:null}let o=t.search(/[::]/),i=(o>=0?t.slice(0,o):t).trim();return Fg.has(i)?{name:i,inline:o>=0?t.slice(o+1).trim():""}:null}function Nn(e,t){let n=(e.get(t)??"").trim();if(!n)throw new Error(`synopsis output missing section: ${t}`);return n}function Ii(e){return e.split(/\r?\n/).map(t=>t.trim()).map(t=>t.replace(/^[-*]\s*/,"").trim()).filter(t=>t.length>0)}function XA(e){return Ii(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),change:o.join("|").trim()}}).filter(t=>t.name&&t.change)}function e5(e){return Ii(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),role:o.join("|").trim()}}).filter(t=>t.name&&t.role)}function t5(e){return[`\u5F53\u524D\u5206\u96C6\uFF1A\u7B2C${e.episodeNo}\u96C6 ${e.title||""}`.trim(),`\u5F53\u524D\u7247\u6BB5\uFF1A${e.part}/${e.partCount}`,"","\u8FD9\u662F\u5F53\u524D\u4EFB\u52A1\u7684\u539F\u6587\uFF1A",e.text].join(`
|
|
807
|
+
`)}function n5(e){return[`\u5F53\u524D\u5206\u96C6\uFF1A\u7B2C${e.episodeNo}\u96C6 ${e.title||""}`.trim(),"","\u7247\u6BB5\u6897\u6982\uFF1A",e.synopsis,"","\u7247\u6BB5\u5173\u952E\u4E8B\u4EF6\uFF1A",...e.events.map(t=>`- ${t}`)].join(`
|
|
808
|
+
`)}function o5(e){let t=[];for(let n of e){if(t.push(`\u7B2C${n.episodeNo}\u96C6 ${n.title||""}`.trim()),t.push(`\u5355\u53E5\uFF1A${n.oneLine}`),t.push(`\u6897\u6982\uFF1A${n.synopsis}`),n.events.length>0){t.push("\u5173\u952E\u4E8B\u4EF6\uFF1A");for(let o of n.events)t.push(`- ${o}`)}t.push("")}return t.join(`
|
|
809
|
+
`).trim()}function i5(e){let t=[];for(let n of e){if(t.push(`\u7B2C${n.startEpisodeNo}-${n.endEpisodeNo}\u96C6`),t.push(`\u9636\u6BB5\u6897\u6982\uFF1A${n.synopsis}`),n.turns.length>0){t.push("\u5173\u952E\u8F6C\u6298\uFF1A");for(let o of n.turns)t.push(`- ${o}`)}if(n.openQuestions.length>0){t.push("\u672A\u89E3\u51B3\u60AC\u5FF5\uFF1A");for(let o of n.openQuestions)t.push(`- ${o}`)}t.push("")}return t.join(`
|
|
810
|
+
`).trim()}function r5(e){return[`\u5F53\u524D\u9636\u6BB5\uFF1A\u7B2C${e.startEpisodeNo}-${e.endEpisodeNo}\u96C6`,"","\u5206\u96C6\u6897\u6982\uFF1A",e.text].join(`
|
|
811
|
+
`)}function s5(e,t){if(e===null)throw new Error(`${t} scope missing`);return e}function a5(e,t){let n=e[0];if(!n||e.length!==1)throw new Error(`${t} reduce requires exactly one item`);return n}function c5(e){return e.map(t=>t.trim()).find(t=>t.length>0)??""}function wp(e){let t=new Set,n=[];for(let o of e.map(i=>i.trim()).filter(i=>i.length>0))t.has(o)||(t.add(o),n.push(o));return n}function d5(e){let t=e.replace(/\s+/g," ").trim();return t.length>50?t.slice(0,50):t}function p5(e,t,n){if(e==null||e==="")return t;let o=Number(e);if(!Number.isFinite(o)||o<=0)throw new x(`${n} must be a positive integer.`,{exitCode:G,errorCode:"NUMERIC_OPTION_INVALID",hint:`Pass ${n} ${t}.`,data:{expected:[`${n}: positive integer`],actual:[v(e)]}});return Math.floor(o)}function oa(e,t,n,o){return!o&&v(e[t]).trim()||v(e[t])===n?!1:(e[t]=n,!0)}function l5(e){return!v(e.synopsis).trim()||!v(e.theme).trim()||!v(e.logline).trim()||!v(e.style).trim()||ee(e.main_characters).length===0}function u5(e){return{synopsis:v(e.synopsis).trim(),theme:v(e.theme).trim(),logline:v(e.logline).trim(),style:v(e.style).trim(),mainCharacters:ee(e.main_characters).map(t=>({name:v(t.name).trim(),role:v(t.role).trim()})).filter(t=>t.name&&t.role)}}import*as Or from"node:fs";var Wg=3;function Ep(e){return v(e.project_group_no||process.env.SANDBOX_PROJECT_GROUP_NO).trim()}function xp(e){try{return Zd(e)}catch(t){throw t instanceof de?oo("SCRIPT API BLOCKED: gateway not configured",t):t}}function Zg(e,t){let n=Ep(e);if(n&&n!==t.projectGroupNo)throw qg(t,`configured projectGroupNo=${n}`);let o=xp(t.projectGroupNo);if(o.gatewayBase!==t.apiBaseUrl)throw qg(t,`configured apiBaseUrl=${o.gatewayBase}`);return o}function qg(e,t){return new x("The configured remote does not match this working copy.",{exitCode:b,errorCode:"WORKING_COPY_REMOTE_MISMATCH",hint:"Restore the checkout environment for this working copy, or checkout another file.",data:{expected:[`projectGroupNo=${e.projectGroupNo}`,`apiBaseUrl=${e.apiBaseUrl}`],actual:[t]}})}function Sp(e){let t;try{t=JSON.parse(Or.readFileSync(e,"utf-8"))}catch(n){throw new x("The local script is missing or invalid JSON.",{exitCode:b,errorCode:"SCRIPT_JSON_INVALID",hint:"Fix the local script JSON before continuing.",data:{actual:[e,n instanceof Error?n.message:String(n)]}})}if(!X(t))throw new x("The script root must be a JSON object.",{exitCode:b,errorCode:"SCRIPT_ROOT_INVALID",hint:"Replace the file with a valid Script v3 JSON object.",data:{actual:[e,Array.isArray(t)?"array":typeof t]}});return t}function Xg(e){return String(e.code)==="9002"||e.message.includes("\u7248\u672C\u51B2\u7A81")}function ra(e){let t=e.status!==null&&e.status>=200&&e.status<300&&e.code===null;return e.status===null||e.status>=500||t}function eh(e){let t=Number(e.revision);if(!Number.isInteger(t)||t<0)throw new x("The gateway returned an invalid snapshot revision.",{exitCode:fe,errorCode:"PUBLISH_OUTCOME_UNKNOWN",hint:"Inspect the remote script before retrying.",data:{actual:[JSON.stringify(e)]}});return t}function th(e,t){return new x("The publish outcome could not be confirmed after retrying.",{exitCode:fe,errorCode:"PUBLISH_OUTCOME_UNKNOWN",hint:"Run publish again; it will inspect the latest snapshot before sending another patch.",data:{actual:[...t,`baseRevision=${e}`]}})}async function f5(e,t,n,o,i,r){let s=[];for(let c=1;c<=Wg;c+=1){let a;try{a=await e.getSnapshot()}catch(p){if(p instanceof de&&ra(p)){s.push(`snapshot attempt ${c}: ${p.message}`);continue}throw p instanceof de?oo("PUBLISH BLOCKED: snapshot query failed",p):p}if(a===null||!X(a.script))throw new x("The managed working copy no longer has a remote script.",{exitCode:b,errorCode:"REMOTE_SCRIPT_NOT_FOUND",hint:"Publish a new unmanaged file to create the remote script, or restore the remote project.",data:{actual:[`projectGroupNo=${e.projectGroupNo}`]}});let d=eh(a);if(Ue(a.script)===o&&a.validationStatus==="valid")return{revision:d,patchedFromRevision:d,attempts:c,recovered:d!==i.baseRevision};kt(t,o);try{let p=await e.publishPatch({baseRevision:d,old:a.script,edited:n,validation:r}),l=X(p)?Number(p.revision):Number.NaN;if(Number.isInteger(l)&&l>d)return{revision:l,patchedFromRevision:d,attempts:c,recovered:c>1};s.push(`patch attempt ${c}: invalid response ${JSON.stringify(p)}`)}catch(p){if(p instanceof de&&(Xg(p)||ra(p))){s.push(`patch attempt ${c}: ${p.message}`);continue}throw p instanceof de?oo("PUBLISH BLOCKED: patch failed",p):p}}throw th(i.baseRevision,s)}async function m5(e,t,n,o,i){let r=[];for(let s=1;s<=Wg;s+=1){let c;try{c=await e.getSnapshot()}catch(a){if(a instanceof de&&ra(a)){r.push(`snapshot attempt ${s}: ${a.message}`);continue}throw a instanceof de?oo("PUBLISH BLOCKED: snapshot query failed",a):a}if(c!==null){let a=eh(c);if(X(c.script)&&Ue(c.script)===o&&c.validationStatus==="valid")return{revision:a,patchedFromRevision:0,attempts:s,recovered:!0};throw new x("An unmanaged local script cannot replace an existing remote script.",{exitCode:b,errorCode:"REMOTE_SCRIPT_EXISTS",hint:"Checkout the remote script, apply the local changes to that managed working copy, then publish.",data:{actual:[`projectGroupNo=${e.projectGroupNo}`,`revision=${a}`]}})}kt(t,o);try{let a=await e.publishPatch({baseRevision:0,old:{},edited:n,validation:i}),d=X(a)?Number(a.revision):Number.NaN;if(Number.isInteger(d)&&d>0)return{revision:d,patchedFromRevision:0,attempts:s,recovered:s>1};r.push(`patch attempt ${s}: invalid response ${JSON.stringify(a)}`)}catch(a){if(a instanceof de&&(Xg(a)||ra(a))){r.push(`patch attempt ${s}: ${a.message}`);continue}throw a instanceof de?oo("PUBLISH BLOCKED: patch failed",a):a}}throw th(0,r)}async function nh(e){let t=xe(e),n=!!e.discard_local,o=Ti(t),i=Jr(t),r=Or.existsSync(t),s=Mi(t);if(r&&i===null&&!n)throw new x("The target is an unmanaged local script.",{exitCode:b,errorCode:"LOCAL_TARGET_EXISTS",hint:`Run \`scriptctl checkout --script-path ${t} --discard-local\` only if the local file may be discarded.`,data:{actual:[t]}});if(r&&i!==null&&!n&&Ue(Sp(t))!==i.baseContentHash)throw new x("The working copy has unpublished local changes.",{exitCode:b,errorCode:"WORKING_COPY_DIRTY",hint:"Publish the local changes, or pass --discard-local to replace them with the remote snapshot.",data:{actual:[t,`baseRevision=${i.baseRevision}`]}});let c=i!==null&&!n?Zg(e,i):xp(Ep(e)||null),a;try{a=await c.getSnapshot()}catch(l){throw l instanceof de?oo("CHECKOUT BLOCKED: snapshot query failed",l):l}if(a===null||!X(a.script))throw new x("No remote script_v2 snapshot exists for this project.",{exitCode:b,errorCode:"REMOTE_SCRIPT_NOT_FOUND",hint:"Use the ingest/create workflow and publish the first script instead of checkout.",data:{actual:[`projectGroupNo=${c.projectGroupNo}`]}});Li(t,s);let d=Ue(a.script);return Be(t,a.script),Kr(t,{schemaVersion:1,projectGroupNo:c.projectGroupNo,apiBaseUrl:c.gatewayBase,baseRevision:Number(a.revision),baseContentHash:d}),[{text:n&&r?`Discarded the local file and checked out revision ${a.revision} to ${t}`:`Checked out revision ${a.revision} to ${t}`,data:{changed:!0,script_path:t,metadata_path:o.metadataPath,managed:!0,dirty:!1,discarded_local:n&&r,project_group_no:c.projectGroupNo,base_revision:Number(a.revision)}},B]}function oh(e){let t=xe(e),n=Or.existsSync(t),o=Jr(t),i=n&&o!==null?Ue(Sp(t))!==o.baseContentHash:null;return[{text:o===null?`${t}: unmanaged local script`:`${t}: ${i?"dirty":"clean"} at revision ${o.baseRevision}`,data:{script_path:t,exists:n,managed:o!==null,dirty:i,...o===null?{}:{project_group_no:o.projectGroupNo,api_base_url:o.apiBaseUrl,base_revision:o.baseRevision}}},B]}async function ih(e){let t=xe(e),n=Sp(t),o=Ue(n),i=Jr(t);if(i!==null&&i.baseContentHash===o)return[{text:`No local changes; revision remains ${i.baseRevision}`,data:{changed:!1,published:!1,reason:"NO_CHANGES",revision:i.baseRevision,script_path:t}},B];let r=Xd(n);if(!r.passed)throw new x("The local script does not pass its declared Script version validation.",{exitCode:b,errorCode:"PUBLISH_VALIDATION_FAILED",hint:`Run \`scriptctl validate --script-path ${t}\`, repair the issues, then publish again.`,data:{actual:r.issues.slice(0,5).map(p=>`${p.path??"<root>"}: ${p.summary}`)}});let s=jr(n).episodes.length,c={status:"valid",summary:{passed:!0,hasBlocking:!1,stats:r.stats??{},issueCount:0}};if(i!==null){let p=Zg(e,i),l=await f5(p,t,n,o,i,c);return Kr(t,{schemaVersion:1,projectGroupNo:p.projectGroupNo,apiBaseUrl:p.gatewayBase,baseRevision:l.revision,baseContentHash:o}),await Ec(p,s),[{text:`Published local content over revision ${l.patchedFromRevision} \u2192 ${l.revision}`,data:{changed:!0,published:!0,created:!1,transport:"patch",script_path:t,project_group_no:p.projectGroupNo,base_revision:l.patchedFromRevision,revision:l.revision,attempts:l.attempts,recovered:l.recovered}},B]}let a=xp(Ep(e)||null),d=await m5(a,t,n,o,c);return Kr(t,{schemaVersion:1,projectGroupNo:a.projectGroupNo,apiBaseUrl:a.gatewayBase,baseRevision:d.revision,baseContentHash:o}),await Ec(a,s),[{text:`Published revision ${d.patchedFromRevision} \u2192 ${d.revision}`,data:{changed:!0,published:!0,created:!0,transport:"patch",script_path:t,project_group_no:a.projectGroupNo,base_revision:d.patchedFromRevision,revision:d.revision,attempts:d.attempts,recovered:d.recovered}},B]}function rh(e,t,n){e.command("migrate").description("Create a newer Script schema copy through the registered migration chain").requiredOption("-p, --script-path <path>","Source Script JSON file").requiredOption("-o, --output <file>","Destination Script JSON file").requiredOption("--to <version>","Target Script version").option("--manifest <file>","Migration manifest output").option("--force","Replace existing migration artifacts").addHelpText("after",`
|
|
812
|
+
Example:
|
|
813
|
+
scriptctl migrate -p ./old-script.json -o ./script-v4.json --to 4
|
|
814
|
+
`).action(Y(Dg,t));let o=e.command("ingest").description("Convert source files into a Script v4 workspace").option("-s, --source-path <path>","Source file or directory").option("-w, --workspace-path <path>","Workspace directory","workspace").option("--llm-config <path>","LLM configuration file").option("--concurrency <n>","Maximum concurrent model calls").option("--fps <n>","Video sampling rate").option("--upload-mode <mode>","Video transport: file-api (default) or base64").option("--video-provider <provider>","Video provider: gemini or doubao (explicit selection disables fallback)").option("--provider-base-url <url>","Selected video provider service root").option("--provider-api-key <key>","Provider API key (visible in process arguments; prefer --provider-api-key-env)").option("--provider-api-key-env <name>","Environment variable containing the provider API key").option("--provider-model <model>","Selected video provider model (Doubao defaults to ARK_MODEL)").option("--step","Process only the next unfinished video episode").option("--force","Rebuild completed stages").addHelpText("after",`
|
|
815
|
+
Example:
|
|
816
|
+
scriptctl ingest --source-path ./draft.md --workspace-path ./workspace
|
|
817
|
+
`).action(Y(r=>dg(r,n),t));o.command("status").description("Show ingest workspace progress").option("-w, --workspace-path <path>","Workspace directory").action(Y(pg,t)),o.command("skip").description("Manually accept the next failed video episode as empty").option("-w, --workspace-path <path>","Workspace directory").requiredOption("--episode <n>","Failed episode number").requiredOption("--reason <text>","Why this episode is being skipped").addHelpText("after",`
|
|
818
|
+
Example:
|
|
819
|
+
scriptctl ingest skip -w ./workspace --episode 7 --reason "provider policy block"
|
|
820
|
+
`).action(Y(lg,t)),e.command("evidence").description("Generate local original-video reference frames from final Script v4 timestamps").option("-p, --script-path <path>","Final Script v4 JSON file").requiredOption("-s, --source-path <path>","Linked source-video file or episode directory").requiredOption("-w, --workspace-path <path>","Project workspace directory").option("--force","Re-extract frames even when deterministic output files already exist").addHelpText("after",`
|
|
821
|
+
Example:
|
|
822
|
+
scriptctl evidence -p ./script.json -s /Volumes/NAS/videos -w ./workspace --force
|
|
823
|
+
`).action(Y(ug,t)),e.command("view").description("Render or serve the workspace review page").option("-w, --workspace-path <path>","Workspace directory","workspace").option("--watch","Serve and refresh the review page").option("--port <n>","HTTP server port").action(Y(hg,t)),lc(e.command("checkout")).description("Download a remote script into a managed local copy").option("--discard-local","Replace an existing dirty local copy").action(Y(nh,t)),se(e.command("status"),"read").description("Show local working-copy state").action(Y(oh,t)),lc(e.command("publish")).description("Validate and publish the local working copy").action(Y(ih,t)),se(e.command("create")).description("Create an empty script").option("--title <title>","Script title").option("--force","Replace an existing script file").action(Y(Cg,t)),se(e.command("audit-assets"),"read").description("Audit asset consistency with an LLM").option("--llm-config <path>","LLM configuration file").option("-o, --output <path>","Audit JSON output file").action(Y(r=>Ig(r,n),t));let i=e.command("synopsis").description("Generate synopsis fields with an LLM").action(()=>i.outputHelp());se(i.command("generate")).description("Generate synopsis fields with an LLM").option("--llm-config <path>","LLM configuration file").option("--concurrency <n>","Maximum concurrent model calls","30").option("--checkpoint <dir>","Checkpoint directory").option("--overwrite","Regenerate existing synopsis fields").option("--apply","Write generated fields").option("-n, --dry-run","Generate a preview without writing").action(Y(r=>Yg(r,n),t))}function y5(e,t=kn){let n=new g5("scriptctl").description("Read, edit, ingest, and publish structured scripts").usage("<command> [options]").exitOverride().allowExcessArguments(!1).allowUnknownOption(!1).showHelpAfterError(!1).configureOutput({writeOut:o=>process.stdout.write(o),writeErr:()=>{}}).option("-j, --json","Output structured JSON").option("--format <format>","Output format (addr)").version(Qo(),"-v, --version","Show the scriptctl version");return rh(n,e,t),Yu(n,e),Gl(n,e),wu(n,e),gu(n,e),n}function sa(e,t){let n=t.split("=",1)[0],o=e;for(;o;){let i=o.options.find(r=>r.short===n||r.long===n);if(i)return i;o=o.parent}}function ah(e,t){if(!t.startsWith("-")||t.startsWith("--")||t.length<2)return{recognized:!1,json:!1,hasAttachedValue:!1};let n=!1;for(let o=1;o<t.length;o+=1){let i=sa(e,`-${t[o]}`);if(!i?.short)return{recognized:!1,json:!1,hasAttachedValue:!1};if(i.short==="-j"&&(n=!0),i.required||i.optional)return{recognized:!0,json:n,valueOption:i,hasAttachedValue:o<t.length-1}}return{recognized:!0,json:n,hasAttachedValue:!1}}function _5(e,t){return t==="--"?!0:t.startsWith("--")?sa(e,t)!==void 0:ah(e,t).recognized}function sh(e,t,n){return n===void 0||n==="--"?!1:t.required?!_5(e,n):t.optional&&!n.startsWith("-")}function w5(e,t){let n=e;for(let o=0;o<t.length;o+=1){let i=t[o];if(i==="--")break;if(i.startsWith("--")){if(i==="--json")return!0;let s=sa(n,i);s&&!i.includes("=")&&sh(n,s,t[o+1])&&(o+=1);continue}if(i.startsWith("-")){let s=ah(n,i);if(s.recognized&&s.json)return!0;s.recognized&&s.valueOption&&!s.hasAttachedValue&&sh(n,s.valueOption,t[o+1])&&(o+=1);continue}let r=n.commands.find(s=>s.name()===i);r&&(n=r)}return!1}function E5(e,t){let n=e;for(let r=0;r<t.length;r+=1){let s=t[r];if(s.startsWith("-")){let a=sa(n,s);a&&!s.includes("=")&&(a.required||a.optional)&&(r+=1);continue}let c=n.commands.find(a=>a.name()===s);if(!c)break;n=c}let o=[],i=n;for(;i&&i.parent;)o.unshift(i.name()),i=i.parent;return["scriptctl",...o,"--help"].join(" ")}function x5(e){return e.message.replace(/^error:\s*/i,"").replace(/\.$/,"")}async function lG(e=null,t=kn){Hl();let n=e??process.argv.slice(2),o={jsonMode:!1,exitCode:B},i=y5(o,t);if(o.jsonMode=w5(i,n),n.length===0)return i.outputHelp(),B;try{return await i.parseAsync(n,{from:"user"}),o.exitCode}catch(r){if(r instanceof h5)return r.code==="commander.help"||r.code==="commander.helpDisplayed"||r.code==="commander.version"?B:Ji(new x(x5(r),{exitCode:G,errorCode:"USAGE_ERROR",hint:`Run '${E5(i,n)}'.`}),o.jsonMode);if(r instanceof x)return Ji(r,o.jsonMode);if(r instanceof P)return Ji(new x(Tn(r.failure),{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode);let s=r instanceof Error?r.message:String(r);return Ji(new x(s,{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode)}}export{y5 as a,lG as b};
|