@lingjingai/scriptctl 0.19.2 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +99 -11
- package/dist/cli.js.map +1 -1
- package/dist/common.d.ts +4 -1
- package/dist/common.js +37 -27
- package/dist/common.js.map +1 -1
- package/dist/domain/direct-core.d.ts +6 -3
- package/dist/domain/direct-core.js +89 -72
- package/dist/domain/direct-core.js.map +1 -1
- package/dist/domain/script/address.d.ts +30 -0
- package/dist/domain/script/address.js +141 -0
- package/dist/domain/script/address.js.map +1 -0
- package/dist/domain/script/lookups.d.ts +33 -0
- package/dist/domain/script/lookups.js +309 -0
- package/dist/domain/script/lookups.js.map +1 -0
- package/dist/domain/script/patch/apply.d.ts +4 -0
- package/dist/domain/script/patch/apply.js +38 -0
- package/dist/domain/script/patch/apply.js.map +1 -0
- package/dist/domain/script/patch/helpers.d.ts +11 -0
- package/dist/domain/script/patch/helpers.js +141 -0
- package/dist/domain/script/patch/helpers.js.map +1 -0
- package/dist/domain/script/patch/ops-action.d.ts +12 -0
- package/dist/domain/script/patch/ops-action.js +371 -0
- package/dist/domain/script/patch/ops-action.js.map +1 -0
- package/dist/domain/script/patch/ops-asset.d.ts +13 -0
- package/dist/domain/script/patch/ops-asset.js +363 -0
- package/dist/domain/script/patch/ops-asset.js.map +1 -0
- package/dist/domain/script/patch/ops-dialogue.d.ts +5 -0
- package/dist/domain/script/patch/ops-dialogue.js +233 -0
- package/dist/domain/script/patch/ops-dialogue.js.map +1 -0
- package/dist/domain/script/patch/ops-meta.d.ts +3 -0
- package/dist/domain/script/patch/ops-meta.js +47 -0
- package/dist/domain/script/patch/ops-meta.js.map +1 -0
- package/dist/domain/script/patch/ops-scene.d.ts +6 -0
- package/dist/domain/script/patch/ops-scene.js +345 -0
- package/dist/domain/script/patch/ops-scene.js.map +1 -0
- package/dist/domain/script/patch/ops-state.d.ts +8 -0
- package/dist/domain/script/patch/ops-state.js +146 -0
- package/dist/domain/script/patch/ops-state.js.map +1 -0
- package/dist/domain/script/patch/registry.d.ts +2 -0
- package/dist/domain/script/patch/registry.js +50 -0
- package/dist/domain/script/patch/registry.js.map +1 -0
- package/dist/domain/script/patch/types.d.ts +10 -0
- package/dist/domain/script/patch/types.js +2 -0
- package/dist/domain/script/patch/types.js.map +1 -0
- package/dist/domain/script/refs.d.ts +4 -0
- package/dist/domain/script/refs.js +152 -0
- package/dist/domain/script/refs.js.map +1 -0
- package/dist/domain/script/schema.d.ts +6 -0
- package/dist/domain/script/schema.js +53 -0
- package/dist/domain/script/schema.js.map +1 -0
- package/dist/domain/script/selector.d.ts +45 -0
- package/dist/domain/script/selector.js +187 -0
- package/dist/domain/script/selector.js.map +1 -0
- package/dist/domain/script/shared.d.ts +15 -0
- package/dist/domain/script/shared.js +37 -0
- package/dist/domain/script/shared.js.map +1 -0
- package/dist/domain/script/validate.d.ts +22 -0
- package/dist/domain/script/validate.js +844 -0
- package/dist/domain/script/validate.js.map +1 -0
- package/dist/help-text.js +21 -4
- package/dist/help-text.js.map +1 -1
- package/dist/infra/providers.d.ts +2 -0
- package/dist/infra/providers.js +81 -35
- package/dist/infra/providers.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.js +11 -1
- package/dist/output.js.map +1 -1
- package/dist/usecases/direct.js +1 -1
- package/dist/usecases/direct.js.map +1 -1
- package/dist/usecases/parse.js +1 -1
- package/dist/usecases/parse.js.map +1 -1
- package/dist/usecases/script/actions.d.ts +3 -0
- package/dist/usecases/script/actions.js +71 -0
- package/dist/usecases/script/actions.js.map +1 -0
- package/dist/usecases/script/actor.d.ts +3 -0
- package/dist/usecases/script/actor.js +27 -0
- package/dist/usecases/script/actor.js.map +1 -0
- package/dist/usecases/script/actors.d.ts +3 -0
- package/dist/usecases/script/actors.js +15 -0
- package/dist/usecases/script/actors.js.map +1 -0
- package/dist/usecases/script/add-actor.d.ts +3 -0
- package/dist/usecases/script/add-actor.js +13 -0
- package/dist/usecases/script/add-actor.js.map +1 -0
- package/dist/usecases/script/add-episode.d.ts +3 -0
- package/dist/usecases/script/add-episode.js +9 -0
- package/dist/usecases/script/add-episode.js.map +1 -0
- package/dist/usecases/script/add-location.d.ts +3 -0
- package/dist/usecases/script/add-location.js +11 -0
- package/dist/usecases/script/add-location.js.map +1 -0
- package/dist/usecases/script/add-prop.d.ts +3 -0
- package/dist/usecases/script/add-prop.js +11 -0
- package/dist/usecases/script/add-prop.js.map +1 -0
- package/dist/usecases/script/add-speaker.d.ts +3 -0
- package/dist/usecases/script/add-speaker.js +22 -0
- package/dist/usecases/script/add-speaker.js.map +1 -0
- package/dist/usecases/script/alias.d.ts +3 -0
- package/dist/usecases/script/alias.js +40 -0
- package/dist/usecases/script/alias.js.map +1 -0
- package/dist/usecases/script/assets.d.ts +3 -0
- package/dist/usecases/script/assets.js +21 -0
- package/dist/usecases/script/assets.js.map +1 -0
- package/dist/usecases/script/context.d.ts +3 -0
- package/dist/usecases/script/context.js +20 -0
- package/dist/usecases/script/context.js.map +1 -0
- package/dist/usecases/script/create.d.ts +3 -0
- package/dist/usecases/script/create.js +81 -0
- package/dist/usecases/script/create.js.map +1 -0
- package/dist/usecases/script/delete.d.ts +3 -0
- package/dist/usecases/script/delete.js +79 -0
- package/dist/usecases/script/delete.js.map +1 -0
- package/dist/usecases/script/describe.d.ts +3 -0
- package/dist/usecases/script/describe.js +31 -0
- package/dist/usecases/script/describe.js.map +1 -0
- package/dist/usecases/script/dialogue.d.ts +3 -0
- package/dist/usecases/script/dialogue.js +28 -0
- package/dist/usecases/script/dialogue.js.map +1 -0
- package/dist/usecases/script/do.d.ts +3 -0
- package/dist/usecases/script/do.js +130 -0
- package/dist/usecases/script/do.js.map +1 -0
- package/dist/usecases/script/episodes.d.ts +3 -0
- package/dist/usecases/script/episodes.js +36 -0
- package/dist/usecases/script/episodes.js.map +1 -0
- package/dist/usecases/script/export.d.ts +3 -0
- package/dist/usecases/script/export.js +117 -0
- package/dist/usecases/script/export.js.map +1 -0
- package/dist/usecases/script/insert.d.ts +3 -0
- package/dist/usecases/script/insert.js +87 -0
- package/dist/usecases/script/insert.js.map +1 -0
- package/dist/usecases/script/issues.d.ts +3 -0
- package/dist/usecases/script/issues.js +27 -0
- package/dist/usecases/script/issues.js.map +1 -0
- package/dist/usecases/script/lib.d.ts +77 -0
- package/dist/usecases/script/lib.js +849 -0
- package/dist/usecases/script/lib.js.map +1 -0
- package/dist/usecases/script/locations.d.ts +3 -0
- package/dist/usecases/script/locations.js +15 -0
- package/dist/usecases/script/locations.js.map +1 -0
- package/dist/usecases/script/merge.d.ts +3 -0
- package/dist/usecases/script/merge.js +43 -0
- package/dist/usecases/script/merge.js.map +1 -0
- package/dist/usecases/script/move.d.ts +3 -0
- package/dist/usecases/script/move.js +33 -0
- package/dist/usecases/script/move.js.map +1 -0
- package/dist/usecases/script/overlap.d.ts +3 -0
- package/dist/usecases/script/overlap.js +21 -0
- package/dist/usecases/script/overlap.js.map +1 -0
- package/dist/usecases/script/props.d.ts +3 -0
- package/dist/usecases/script/props.js +15 -0
- package/dist/usecases/script/props.js.map +1 -0
- package/dist/usecases/script/refs.d.ts +3 -0
- package/dist/usecases/script/refs.js +61 -0
- package/dist/usecases/script/refs.js.map +1 -0
- package/dist/usecases/script/rename.d.ts +3 -0
- package/dist/usecases/script/rename.js +17 -0
- package/dist/usecases/script/rename.js.map +1 -0
- package/dist/usecases/script/replace.d.ts +3 -0
- package/dist/usecases/script/replace.js +35 -0
- package/dist/usecases/script/replace.js.map +1 -0
- package/dist/usecases/script/role.d.ts +3 -0
- package/dist/usecases/script/role.js +17 -0
- package/dist/usecases/script/role.js.map +1 -0
- package/dist/usecases/script/scenes.d.ts +3 -0
- package/dist/usecases/script/scenes.js +45 -0
- package/dist/usecases/script/scenes.js.map +1 -0
- package/dist/usecases/script/script-patch.d.ts +3 -0
- package/dist/usecases/script/script-patch.js +187 -0
- package/dist/usecases/script/script-patch.js.map +1 -0
- package/dist/usecases/script/script-validate.d.ts +3 -0
- package/dist/usecases/script/script-validate.js +30 -0
- package/dist/usecases/script/script-validate.js.map +1 -0
- package/dist/usecases/script/session.d.ts +44 -0
- package/dist/usecases/script/session.js +527 -0
- package/dist/usecases/script/session.js.map +1 -0
- package/dist/usecases/script/speakers.d.ts +3 -0
- package/dist/usecases/script/speakers.js +28 -0
- package/dist/usecases/script/speakers.js.map +1 -0
- package/dist/usecases/script/split.d.ts +3 -0
- package/dist/usecases/script/split.js +37 -0
- package/dist/usecases/script/split.js.map +1 -0
- package/dist/usecases/script/state-add.d.ts +3 -0
- package/dist/usecases/script/state-add.js +23 -0
- package/dist/usecases/script/state-add.js.map +1 -0
- package/dist/usecases/script/state-change.d.ts +3 -0
- package/dist/usecases/script/state-change.js +24 -0
- package/dist/usecases/script/state-change.js.map +1 -0
- package/dist/usecases/script/state-delete.d.ts +3 -0
- package/dist/usecases/script/state-delete.js +23 -0
- package/dist/usecases/script/state-delete.js.map +1 -0
- package/dist/usecases/script/state-rename.d.ts +3 -0
- package/dist/usecases/script/state-rename.js +17 -0
- package/dist/usecases/script/state-rename.js.map +1 -0
- package/dist/usecases/script/summary.d.ts +3 -0
- package/dist/usecases/script/summary.js +45 -0
- package/dist/usecases/script/summary.js.map +1 -0
- package/dist/usecases/script/transition.d.ts +3 -0
- package/dist/usecases/script/transition.js +24 -0
- package/dist/usecases/script/transition.js.map +1 -0
- package/dist/usecases/script/type.d.ts +3 -0
- package/dist/usecases/script/type.js +24 -0
- package/dist/usecases/script/type.js.map +1 -0
- package/dist/usecases/script/worldview.d.ts +3 -0
- package/dist/usecases/script/worldview.js +18 -0
- package/dist/usecases/script/worldview.js.map +1 -0
- package/package.json +1 -1
- package/dist/domain/script-core.d.ts +0 -78
- package/dist/domain/script-core.js +0 -3026
- package/dist/domain/script-core.js.map +0 -1
- package/dist/usecases/script.d.ts +0 -67
- package/dist/usecases/script.js +0 -2348
- package/dist/usecases/script.js.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { op_action_state_change, op_action_state_remove, op_action_transition_set, op_action_transition_clear, op_action_content_replace, op_action_content_regex_replace, op_action_type_set, op_action_actor_set, op_action_delete, op_action_insert, op_action_move } from "./ops-action.js";
|
|
2
|
+
import { op_actor_add, op_location_add, op_prop_add, op_asset_role_set, op_asset_rename, op_asset_describe, op_asset_alias_set, op_asset_alias_add, op_asset_alias_remove, op_asset_states_set, op_asset_merge, op_asset_delete } from "./ops-asset.js";
|
|
3
|
+
import { op_speaker_add, op_dialogue_speakers, op_dialogue_overlap, op_speaker_delete } from "./ops-dialogue.js";
|
|
4
|
+
import { op_episode_add, op_meta_worldview_set } from "./ops-meta.js";
|
|
5
|
+
import { op_scene_insert, op_scene_split, op_scene_merge, op_scene_delete, op_scene_move } from "./ops-scene.js";
|
|
6
|
+
import { op_state_add, op_state_rename, op_state_describe, op_state_delete, op_context_set, op_context_clear, op_context_ref_remove } from "./ops-state.js";
|
|
7
|
+
export const OP_REGISTRY = {
|
|
8
|
+
"state.add": op_state_add,
|
|
9
|
+
"state.rename": op_state_rename,
|
|
10
|
+
"state.describe": op_state_describe,
|
|
11
|
+
"state.delete": op_state_delete,
|
|
12
|
+
"context.set": op_context_set,
|
|
13
|
+
"context.clear": op_context_clear,
|
|
14
|
+
"action.state.change": op_action_state_change,
|
|
15
|
+
"action.state.remove": op_action_state_remove,
|
|
16
|
+
"action.transition.set": op_action_transition_set,
|
|
17
|
+
"action.transition.clear": op_action_transition_clear,
|
|
18
|
+
"action.content.replace": op_action_content_replace,
|
|
19
|
+
"action.content.regex-replace": op_action_content_regex_replace,
|
|
20
|
+
"speaker.add": op_speaker_add,
|
|
21
|
+
"dialogue.speakers": op_dialogue_speakers,
|
|
22
|
+
"dialogue.overlap": op_dialogue_overlap,
|
|
23
|
+
"actor.add": op_actor_add,
|
|
24
|
+
"location.add": op_location_add,
|
|
25
|
+
"prop.add": op_prop_add,
|
|
26
|
+
"episode.add": op_episode_add,
|
|
27
|
+
"meta.worldview.set": op_meta_worldview_set,
|
|
28
|
+
"asset.role.set": op_asset_role_set,
|
|
29
|
+
"asset.rename": op_asset_rename,
|
|
30
|
+
"asset.describe": op_asset_describe,
|
|
31
|
+
"asset.alias.set": op_asset_alias_set,
|
|
32
|
+
"asset.alias.add": op_asset_alias_add,
|
|
33
|
+
"asset.alias.remove": op_asset_alias_remove,
|
|
34
|
+
"asset.states.set": op_asset_states_set,
|
|
35
|
+
"asset.merge": op_asset_merge,
|
|
36
|
+
"asset.delete": op_asset_delete,
|
|
37
|
+
"action.type.set": op_action_type_set,
|
|
38
|
+
"action.actor.set": op_action_actor_set,
|
|
39
|
+
"action.delete": op_action_delete,
|
|
40
|
+
"action.insert": op_action_insert,
|
|
41
|
+
"action.move": op_action_move,
|
|
42
|
+
"scene.insert": op_scene_insert,
|
|
43
|
+
"scene.split": op_scene_split,
|
|
44
|
+
"scene.merge": op_scene_merge,
|
|
45
|
+
"scene.delete": op_scene_delete,
|
|
46
|
+
"scene.move": op_scene_move,
|
|
47
|
+
"speaker.delete": op_speaker_delete,
|
|
48
|
+
"context.ref.remove": op_context_ref_remove,
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAC,sBAAsB,EAAC,wBAAwB,EAAC,0BAA0B,EAAC,yBAAyB,EAAC,+BAA+B,EAAC,kBAAkB,EAAC,mBAAmB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtR,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,WAAW,EAAC,iBAAiB,EAAC,eAAe,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,qBAAqB,EAAC,mBAAmB,EAAC,cAAc,EAAC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7O,OAAO,EAAE,cAAc,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAC,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,eAAe,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EAAC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAC,eAAe,EAAC,iBAAiB,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEtJ,MAAM,CAAC,MAAM,WAAW,GAA8B;IACpD,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,eAAe,EAAE,gBAAgB;IACjC,qBAAqB,EAAE,sBAAsB;IAC7C,qBAAqB,EAAE,sBAAsB;IAC7C,uBAAuB,EAAE,wBAAwB;IACjD,yBAAyB,EAAE,0BAA0B;IACrD,wBAAwB,EAAE,yBAAyB;IACnD,8BAA8B,EAAE,+BAA+B;IAC/D,aAAa,EAAE,cAAc;IAC7B,mBAAmB,EAAE,oBAAoB;IACzC,kBAAkB,EAAE,mBAAmB;IACvC,WAAW,EAAE,YAAY;IACzB,cAAc,EAAE,eAAe;IAC/B,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,cAAc;IAC7B,oBAAoB,EAAE,qBAAqB;IAC3C,gBAAgB,EAAE,iBAAiB;IACnC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,iBAAiB,EAAE,kBAAkB;IACrC,iBAAiB,EAAE,kBAAkB;IACrC,oBAAoB,EAAE,qBAAqB;IAC3C,kBAAkB,EAAE,mBAAmB;IACvC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,iBAAiB,EAAE,kBAAkB;IACrC,kBAAkB,EAAE,mBAAmB;IACvC,eAAe,EAAE,gBAAgB;IACjC,eAAe,EAAE,gBAAgB;IACjC,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,aAAa,EAAE,cAAc;IAC7B,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,iBAAiB;IACnC,oBAAoB,EAAE,qBAAqB;CAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/domain/script/patch/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Dict } from "./shared.js";
|
|
2
|
+
export declare function stateRefSummary(kind: string, targetId: string, stateId: string, location: string, role: string): Dict;
|
|
3
|
+
export declare function collectStateRefs(script: Dict, kind: string, targetId: string, stateId: string): Dict[];
|
|
4
|
+
export declare function collectAssetRefs(script: Dict, kind: string, targetId: string): Dict[];
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { asList, isDict, strOf } from "./shared.js";
|
|
2
|
+
import { sceneContext } from "../direct-core.js";
|
|
3
|
+
import { idKeyForKind, pluralForKind } from "./lookups.js";
|
|
4
|
+
import { contextRefsForKind } from "./patch/helpers.js";
|
|
5
|
+
export function stateRefSummary(kind, targetId, stateId, location, role) {
|
|
6
|
+
return { target: `${kind}:${targetId}/${stateId}`, location, role };
|
|
7
|
+
}
|
|
8
|
+
export function collectStateRefs(script, kind, targetId, stateId) {
|
|
9
|
+
const refs = [];
|
|
10
|
+
const idKey = idKeyForKind(kind);
|
|
11
|
+
for (const ep of asList(script["episodes"])) {
|
|
12
|
+
const epId = strOf(ep["episode_id"]);
|
|
13
|
+
for (const scene of asList(ep["scenes"])) {
|
|
14
|
+
const sceneId = strOf(scene["scene_id"]);
|
|
15
|
+
const ctx = sceneContext(scene);
|
|
16
|
+
const refsList = contextRefsForKind(ctx, kind);
|
|
17
|
+
for (let idx = 0; idx < refsList.length; idx++) {
|
|
18
|
+
const ref = refsList[idx];
|
|
19
|
+
if (strOf(ref[idKey]) === targetId && strOf(ref["state_id"]) === stateId) {
|
|
20
|
+
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}.context.${pluralForKind(kind)}[${idx}]`, "scene_initial_state"));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const actions = asList(scene["actions"]);
|
|
24
|
+
for (let actionIdx = 0; actionIdx < actions.length; actionIdx++) {
|
|
25
|
+
const changes = asList(actions[actionIdx]["state_changes"]);
|
|
26
|
+
for (let changeIdx = 0; changeIdx < changes.length; changeIdx++) {
|
|
27
|
+
const change = changes[changeIdx];
|
|
28
|
+
if (strOf(change["target_kind"]) !== kind || strOf(change["target_id"]) !== targetId)
|
|
29
|
+
continue;
|
|
30
|
+
if (strOf(change["from_state_id"]) === stateId) {
|
|
31
|
+
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}#${actionIdx}.state_changes[${changeIdx}].from_state_id`, "state_change_from"));
|
|
32
|
+
}
|
|
33
|
+
if (strOf(change["to_state_id"]) === stateId) {
|
|
34
|
+
refs.push(stateRefSummary(kind, targetId, stateId, `${epId}/${sceneId}#${actionIdx}.state_changes[${changeIdx}].to_state_id`, "state_change_to"));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return refs;
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Universal address parsing + asset reverse lookup (0.6.0 namespace flatten)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// A union over every address format the flat top-level commands accept. The
|
|
46
|
+
// dispatcher (CLI / usecase) picks behavior based on `kind`. Speaker addresses
|
|
47
|
+
// use a bare `spk_XXX` form (no prefix) for terseness, mirroring how the rest
|
|
48
|
+
export function collectAssetRefs(script, kind, targetId) {
|
|
49
|
+
const refs = [];
|
|
50
|
+
const isSpeaker = kind === "speaker";
|
|
51
|
+
const target = isSpeaker ? `speaker:${targetId}` : `${kind}:${targetId}`;
|
|
52
|
+
const idKey = isSpeaker ? null : idKeyForKind(kind);
|
|
53
|
+
for (const ep of asList(script["episodes"])) {
|
|
54
|
+
const epId = strOf(ep["episode_id"]);
|
|
55
|
+
for (const scene of asList(ep["scenes"])) {
|
|
56
|
+
const sceneId = strOf(scene["scene_id"]);
|
|
57
|
+
if (!isSpeaker) {
|
|
58
|
+
const ctx = sceneContext(scene);
|
|
59
|
+
const refsList = contextRefsForKind(ctx, kind);
|
|
60
|
+
for (let i = 0; i < refsList.length; i++) {
|
|
61
|
+
if (strOf(refsList[i][idKey]) === targetId) {
|
|
62
|
+
refs.push({
|
|
63
|
+
target,
|
|
64
|
+
location: `${epId}/${sceneId}.context.${pluralForKind(kind)}[${i}]`,
|
|
65
|
+
role: `scene_${pluralForKind(kind)}`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const actions = asList(scene["actions"]);
|
|
71
|
+
for (let actionIdx = 0; actionIdx < actions.length; actionIdx++) {
|
|
72
|
+
const action = actions[actionIdx];
|
|
73
|
+
if (kind === "actor" && strOf(action["actor_id"]) === targetId) {
|
|
74
|
+
refs.push({
|
|
75
|
+
target,
|
|
76
|
+
location: `${epId}/${sceneId}#${actionIdx}.actor_id`,
|
|
77
|
+
role: "action_actor",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (isSpeaker) {
|
|
81
|
+
if (strOf(action["speaker_id"]) === targetId) {
|
|
82
|
+
refs.push({
|
|
83
|
+
target,
|
|
84
|
+
location: `${epId}/${sceneId}#${actionIdx}.speaker_id`,
|
|
85
|
+
role: "action_speaker",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const speakers = asList(action["speakers"]);
|
|
89
|
+
for (let i = 0; i < speakers.length; i++) {
|
|
90
|
+
if (strOf(speakers[i]["speaker_id"]) === targetId) {
|
|
91
|
+
refs.push({
|
|
92
|
+
target,
|
|
93
|
+
location: `${epId}/${sceneId}#${actionIdx}.speakers[${i}]`,
|
|
94
|
+
role: "dialogue_speaker",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const lines = asList(action["lines"]);
|
|
99
|
+
for (let i = 0; i < lines.length; i++) {
|
|
100
|
+
if (strOf(lines[i]["speaker_id"]) === targetId) {
|
|
101
|
+
refs.push({
|
|
102
|
+
target,
|
|
103
|
+
location: `${epId}/${sceneId}#${actionIdx}.lines[${i}].speaker_id`,
|
|
104
|
+
role: "overlap_line_speaker",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!isSpeaker) {
|
|
110
|
+
const changes = asList(action["state_changes"]);
|
|
111
|
+
for (let i = 0; i < changes.length; i++) {
|
|
112
|
+
const change = changes[i];
|
|
113
|
+
if (strOf(change["target_kind"]) === kind && strOf(change["target_id"]) === targetId) {
|
|
114
|
+
refs.push({
|
|
115
|
+
target,
|
|
116
|
+
location: `${epId}/${sceneId}#${actionIdx}.state_changes[${i}]`,
|
|
117
|
+
role: "state_change_target",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const transition = action["transition_prompt"];
|
|
122
|
+
if (isDict(transition) && strOf(transition["target_kind"]) === kind && strOf(transition["target_id"]) === targetId) {
|
|
123
|
+
refs.push({
|
|
124
|
+
target,
|
|
125
|
+
location: `${epId}/${sceneId}#${actionIdx}.transition_prompt`,
|
|
126
|
+
role: "transition_target",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Speaker registrations pointing at this asset (actor/location/prop only).
|
|
134
|
+
// A speaker.source_id ties an actor/location/prop to a speaker entity; the
|
|
135
|
+
// speaker entry itself counts as a reference, so deleting / merging the
|
|
136
|
+
// asset must surface it.
|
|
137
|
+
if (!isSpeaker) {
|
|
138
|
+
const speakers = asList(script["speakers"]);
|
|
139
|
+
for (let i = 0; i < speakers.length; i++) {
|
|
140
|
+
const s = speakers[i];
|
|
141
|
+
if (strOf(s["source_kind"]) === kind && strOf(s["source_id"]) === targetId) {
|
|
142
|
+
refs.push({
|
|
143
|
+
target,
|
|
144
|
+
location: `speakers[${i}]`,
|
|
145
|
+
role: "speaker_source",
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return refs;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../../src/domain/script/refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Schema for every supported patch op. Used by `scriptctl patch --schema` to
|
|
2
|
+
// dump field definitions agents can introspect without reading source.
|
|
3
|
+
export const PATCH_OP_SCHEMA = {
|
|
4
|
+
// meta
|
|
5
|
+
"meta.worldview.set": { required: ["worldview"], optional: ["worldview_raw"], description: "Set the script.worldview enum." },
|
|
6
|
+
// state
|
|
7
|
+
"state.add": { required: ["target", "name"], optional: ["description", "state_id"], description: "Add a state to an asset's states[]." },
|
|
8
|
+
"state.rename": { required: ["target", "name"], optional: [], description: "Rename an asset state." },
|
|
9
|
+
"state.describe": { required: ["target", "description"], optional: [], description: "Set a state's description." },
|
|
10
|
+
"state.delete": { required: ["target", "strategy"], optional: ["replacement"], description: "Delete a state. strategy: replace|remove." },
|
|
11
|
+
// asset
|
|
12
|
+
"actor.add": { required: ["name"], optional: ["actor_id", "role_type", "description", "aliases"], description: "Register a new actor (human/character). role_type: 主角|配角." },
|
|
13
|
+
"location.add": { required: ["name"], optional: ["location_id", "description"], description: "Register a new location." },
|
|
14
|
+
"prop.add": { required: ["name"], optional: ["prop_id", "description"], description: "Register a new prop." },
|
|
15
|
+
"episode.add": { required: [], optional: ["episode_id", "title"], description: "Append a new empty episode (no scenes)." },
|
|
16
|
+
"asset.rename": { required: ["target", "name"], optional: [], description: "Rename an asset (actor / location / prop)." },
|
|
17
|
+
"asset.describe": { required: ["target", "description"], optional: [], description: "Set asset description." },
|
|
18
|
+
"asset.alias.set": { required: ["target", "aliases"], optional: [], description: "Bulk replace aliases[]." },
|
|
19
|
+
"asset.alias.add": { required: ["target", "alias"], optional: [], description: "Append alias(es)." },
|
|
20
|
+
"asset.alias.remove": { required: ["target", "alias"], optional: [], description: "Remove alias(es)." },
|
|
21
|
+
"asset.states.set": { required: ["target", "states"], optional: ["asset_type"], description: "Bulk replace states[]." },
|
|
22
|
+
"asset.role.set": { required: ["target", "role_type"], optional: [], description: "Set actor role_type (主角|配角)." },
|
|
23
|
+
"asset.merge": { required: ["from", "into"], optional: [], description: "Merge from asset into another; from disappears." },
|
|
24
|
+
"asset.delete": { required: ["target"], optional: ["strategy", "replacement"], description: "Delete an asset. strategy: replace|remove (required if refs exist)." },
|
|
25
|
+
// action
|
|
26
|
+
"action.type.set": { required: ["at", "type"], optional: [], description: "Set action.type (dialogue|action|inner_thought)." },
|
|
27
|
+
"action.actor.set": { required: ["at"], optional: ["actor_id"], description: "Set/clear action.actor_id." },
|
|
28
|
+
"action.content.replace": { required: ["at", "from"], optional: ["to", "all"], description: "Literal substring replace in action.content." },
|
|
29
|
+
"action.content.regex-replace": { required: ["at", "pattern"], optional: ["to", "all"], description: "Regex (/re/flags) replace in action.content. ReDoS-guarded; refuses overlap dialogue." },
|
|
30
|
+
"action.state.change": { required: ["at", "target", "to"], optional: ["from", "effective"], description: "Add/update a state_change on an action." },
|
|
31
|
+
"action.state.remove": { required: ["at", "target"], optional: [], description: "Remove a state_change from an action." },
|
|
32
|
+
"action.transition.set": { required: ["at", "target", "process", "contrast"], optional: [], description: "Set transition_prompt." },
|
|
33
|
+
"action.transition.clear": { required: ["at", "target"], optional: [], description: "Clear transition_prompt." },
|
|
34
|
+
"action.delete": { required: ["at"], optional: [], description: "Remove an action; later indices shift." },
|
|
35
|
+
"action.insert": { required: ["at", "type"], optional: ["content", "at_index", "before", "after", "actor_id", "speaker_id"], description: "Insert an action into a scene." },
|
|
36
|
+
"action.move": { required: ["at", "to"], optional: [], description: "Move an action (within or across scenes)." },
|
|
37
|
+
// scene
|
|
38
|
+
"scene.split": { required: ["at", "at_index"], optional: ["new_scene_id"], description: "Split a scene at an action boundary." },
|
|
39
|
+
"scene.merge": { required: ["from", "into"], optional: [], description: "Merge two scenes within the same episode." },
|
|
40
|
+
"scene.delete": { required: ["at"], optional: ["force"], description: "Delete a scene; empty by default, force=true for non-empty." },
|
|
41
|
+
"scene.move": { required: ["at", "to"], optional: ["at_index"], description: "Move a scene to another episode." },
|
|
42
|
+
"scene.insert": { required: ["at", "location"], optional: ["time", "space", "at_index", "before", "after", "scene_id"], description: "Insert a new empty scene." },
|
|
43
|
+
// context
|
|
44
|
+
"context.set": { required: ["at", "target"], optional: ["state", "state_id"], description: "Upsert (actor/prop) or replace (location) scene context ref + state." },
|
|
45
|
+
"context.clear": { required: ["at", "target"], optional: [], description: "Keep ref, clear state_id." },
|
|
46
|
+
"context.ref.remove": { required: ["at", "target"], optional: [], description: "Remove the ref entirely from scene context." },
|
|
47
|
+
// dialogue / speaker
|
|
48
|
+
"dialogue.speakers": { required: ["at", "speakers"], optional: ["delivery"], description: "Set dialogue speakers; delivery: single|simultaneous|group." },
|
|
49
|
+
"dialogue.overlap": { required: ["at", "lines"], optional: [], description: "Set overlap dialogue lines[]." },
|
|
50
|
+
"speaker.add": { required: ["kind", "name"], optional: ["source_id", "voice_desc", "speaker_id"], description: "Register a new speaker." },
|
|
51
|
+
"speaker.delete": { required: ["target"], optional: ["strategy", "replacement"], description: "Delete a speaker. strategy: replace|remove (required if refs exist)." },
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/domain/script/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CliError } from "../../common.js";
|
|
2
|
+
import { type Dict } from "./shared.js";
|
|
3
|
+
export declare const MAX_GREP_PATTERN_LEN = 256;
|
|
4
|
+
export declare function isDangerousRegex(pattern: string): boolean;
|
|
5
|
+
export type ActionCoord = {
|
|
6
|
+
scn: number;
|
|
7
|
+
idx: number;
|
|
8
|
+
};
|
|
9
|
+
export type SelectorRegion = {
|
|
10
|
+
level: "episode";
|
|
11
|
+
lo: number;
|
|
12
|
+
hi: number;
|
|
13
|
+
} | {
|
|
14
|
+
level: "scene";
|
|
15
|
+
lo: number;
|
|
16
|
+
hi: number;
|
|
17
|
+
} | {
|
|
18
|
+
level: "action";
|
|
19
|
+
lo: ActionCoord;
|
|
20
|
+
hi: ActionCoord;
|
|
21
|
+
};
|
|
22
|
+
export interface InSelector {
|
|
23
|
+
readonly isEmpty: boolean;
|
|
24
|
+
matchesScene(epId: string, sceneId: string): boolean;
|
|
25
|
+
matchesAction(epId: string, sceneId: string, idx: number): boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function cmpAction(a: ActionCoord, b: ActionCoord): number;
|
|
28
|
+
export declare function regionMatchesScene(r: SelectorRegion, ep: number, scn: number): boolean;
|
|
29
|
+
export declare function regionMatchesAction(r: SelectorRegion, ep: number, scn: number, idx: number): boolean;
|
|
30
|
+
export declare class RegionSelector implements InSelector {
|
|
31
|
+
readonly regions: SelectorRegion[];
|
|
32
|
+
constructor(regions: SelectorRegion[]);
|
|
33
|
+
get isEmpty(): boolean;
|
|
34
|
+
matchesScene(epId: string, sceneId: string): boolean;
|
|
35
|
+
matchesAction(epId: string, sceneId: string, idx: number): boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare function inSelectorError(detail: string, received: string): CliError;
|
|
38
|
+
export declare function parseRegion(region: string, full: string): SelectorRegion;
|
|
39
|
+
export declare const WHOLE_SCRIPT: InSelector;
|
|
40
|
+
export declare function parseInSelector(raw: unknown): InSelector;
|
|
41
|
+
export declare function selectorSingleActionPoint(sel: InSelector): {
|
|
42
|
+
scn: number;
|
|
43
|
+
idx: number;
|
|
44
|
+
} | null;
|
|
45
|
+
export declare function expandSelectorToActionRefs(script: Dict, selector: InSelector): string[];
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { CliError, EXIT_USAGE, } from "../../common.js";
|
|
2
|
+
import { asList, idNum, strOf } from "./shared.js";
|
|
3
|
+
import { parseAnyAddress } from "./address.js";
|
|
4
|
+
export const MAX_GREP_PATTERN_LEN = 256;
|
|
5
|
+
export function isDangerousRegex(pattern) {
|
|
6
|
+
if (pattern.length > MAX_GREP_PATTERN_LEN)
|
|
7
|
+
return true;
|
|
8
|
+
return /\([^)]*[*+?{][^)]*\)[*+?{]/.test(pattern);
|
|
9
|
+
}
|
|
10
|
+
export function cmpAction(a, b) {
|
|
11
|
+
return a.scn - b.scn || a.idx - b.idx;
|
|
12
|
+
}
|
|
13
|
+
export function regionMatchesScene(r, ep, scn) {
|
|
14
|
+
switch (r.level) {
|
|
15
|
+
case "episode": return ep >= r.lo && ep <= r.hi;
|
|
16
|
+
case "scene": return scn >= r.lo && scn <= r.hi;
|
|
17
|
+
case "action": return scn >= r.lo.scn && scn <= r.hi.scn;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function regionMatchesAction(r, ep, scn, idx) {
|
|
21
|
+
switch (r.level) {
|
|
22
|
+
case "episode": return ep >= r.lo && ep <= r.hi;
|
|
23
|
+
case "scene": return scn >= r.lo && scn <= r.hi;
|
|
24
|
+
case "action": {
|
|
25
|
+
const p = { scn, idx };
|
|
26
|
+
// Lexicographic (scn, idx) containment covers same-scene, cross-scene
|
|
27
|
+
// start/internal/end in one comparison.
|
|
28
|
+
return cmpAction(r.lo, p) <= 0 && cmpAction(p, r.hi) <= 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class RegionSelector {
|
|
33
|
+
regions;
|
|
34
|
+
constructor(regions) {
|
|
35
|
+
this.regions = regions;
|
|
36
|
+
}
|
|
37
|
+
get isEmpty() {
|
|
38
|
+
return this.regions.length === 0;
|
|
39
|
+
}
|
|
40
|
+
matchesScene(epId, sceneId) {
|
|
41
|
+
if (this.regions.length === 0)
|
|
42
|
+
return true;
|
|
43
|
+
const ep = idNum(epId, "ep");
|
|
44
|
+
const scn = idNum(sceneId, "scn");
|
|
45
|
+
return this.regions.some((r) => regionMatchesScene(r, ep, scn));
|
|
46
|
+
}
|
|
47
|
+
matchesAction(epId, sceneId, idx) {
|
|
48
|
+
if (this.regions.length === 0)
|
|
49
|
+
return true;
|
|
50
|
+
const ep = idNum(epId, "ep");
|
|
51
|
+
const scn = idNum(sceneId, "scn");
|
|
52
|
+
return this.regions.some((r) => regionMatchesAction(r, ep, scn, idx));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function inSelectorError(detail, received) {
|
|
56
|
+
return new CliError("QUERY BLOCKED: --in address invalid", "--in address invalid.", {
|
|
57
|
+
exitCode: EXIT_USAGE,
|
|
58
|
+
required: ["--in: ep_NNN | ep_NNN/scn_NNN | ep_NNN/scn_NNN#idx; ranges via '..'; multiple regions comma-separated"],
|
|
59
|
+
received: [`${received} (${detail})`],
|
|
60
|
+
nextSteps: ["Example: ep_003..ep_007,ep_010/scn_001..ep_010/scn_004"],
|
|
61
|
+
errorCode: "IN_ADDRESS_INVALID",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export function parseRegion(region, full) {
|
|
65
|
+
const parts = region.split("..");
|
|
66
|
+
if (parts.length > 2)
|
|
67
|
+
throw inSelectorError(`too many '..' in "${region}"`, full);
|
|
68
|
+
const loRaw = parts[0].trim();
|
|
69
|
+
const hiRaw = (parts.length === 2 ? parts[1] : parts[0]).trim();
|
|
70
|
+
if (!loRaw || !hiRaw)
|
|
71
|
+
throw inSelectorError(`empty range endpoint in "${region}"`, full);
|
|
72
|
+
let loAddr;
|
|
73
|
+
let hiAddr;
|
|
74
|
+
try {
|
|
75
|
+
loAddr = parseAnyAddress(loRaw);
|
|
76
|
+
hiAddr = parseAnyAddress(hiRaw);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw inSelectorError(`endpoint not a valid address in "${region}"`, full);
|
|
80
|
+
}
|
|
81
|
+
if (loAddr.kind !== hiAddr.kind) {
|
|
82
|
+
throw new CliError("QUERY BLOCKED: --in range endpoints mismatch", "Range endpoints must be the same address kind.", {
|
|
83
|
+
exitCode: EXIT_USAGE,
|
|
84
|
+
required: ["both endpoints episode | scene | action"],
|
|
85
|
+
received: [`${loRaw}(${loAddr.kind})..${hiRaw}(${hiAddr.kind})`],
|
|
86
|
+
nextSteps: ["Make both endpoints the same kind, e.g. ep_003..ep_007 or ep_001/scn_002..ep_003/scn_009."],
|
|
87
|
+
errorCode: "IN_RANGE_KIND_MISMATCH",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (loAddr.kind === "episode" && hiAddr.kind === "episode") {
|
|
91
|
+
const a = idNum(loAddr.episodeId, "ep");
|
|
92
|
+
const b = idNum(hiAddr.episodeId, "ep");
|
|
93
|
+
if (Number.isNaN(a) || Number.isNaN(b))
|
|
94
|
+
throw inSelectorError(`malformed episode id in "${region}"`, full);
|
|
95
|
+
return a <= b ? { level: "episode", lo: a, hi: b } : { level: "episode", lo: b, hi: a };
|
|
96
|
+
}
|
|
97
|
+
if (loAddr.kind === "scene" && hiAddr.kind === "scene") {
|
|
98
|
+
const a = idNum(loAddr.sceneId, "scn");
|
|
99
|
+
const b = idNum(hiAddr.sceneId, "scn");
|
|
100
|
+
if (Number.isNaN(a) || Number.isNaN(b))
|
|
101
|
+
throw inSelectorError(`malformed scene id in "${region}"`, full);
|
|
102
|
+
return a <= b ? { level: "scene", lo: a, hi: b } : { level: "scene", lo: b, hi: a };
|
|
103
|
+
}
|
|
104
|
+
if (loAddr.kind === "action" && hiAddr.kind === "action") {
|
|
105
|
+
const a = { scn: idNum(loAddr.sceneId, "scn"), idx: loAddr.actionIndex };
|
|
106
|
+
const b = { scn: idNum(hiAddr.sceneId, "scn"), idx: hiAddr.actionIndex };
|
|
107
|
+
if (Number.isNaN(a.scn) || Number.isNaN(b.scn))
|
|
108
|
+
throw inSelectorError(`malformed scene id in "${region}"`, full);
|
|
109
|
+
return cmpAction(a, b) <= 0 ? { level: "action", lo: a, hi: b } : { level: "action", lo: b, hi: a };
|
|
110
|
+
}
|
|
111
|
+
// asset / state / speaker addresses are not valid scope anchors for --in.
|
|
112
|
+
throw inSelectorError(`address kind '${loAddr.kind}' not valid in --in`, full);
|
|
113
|
+
}
|
|
114
|
+
// Whole-script selector: `--in '*'`. Distinct from an empty selector — it
|
|
115
|
+
// matches everything but `isEmpty` is false, so writes can tell "scope is
|
|
116
|
+
// intentionally the whole script" apart from "no scope given" (a bare,
|
|
117
|
+
// dangerous dump that callers refuse).
|
|
118
|
+
export const WHOLE_SCRIPT = {
|
|
119
|
+
isEmpty: false,
|
|
120
|
+
matchesScene: () => true,
|
|
121
|
+
matchesAction: () => true,
|
|
122
|
+
};
|
|
123
|
+
export function parseInSelector(raw) {
|
|
124
|
+
const value = strOf(raw).trim();
|
|
125
|
+
if (!value)
|
|
126
|
+
return new RegionSelector([]);
|
|
127
|
+
if (value === "*")
|
|
128
|
+
return WHOLE_SCRIPT;
|
|
129
|
+
const regions = [];
|
|
130
|
+
for (const seg of value.split(",")) {
|
|
131
|
+
const region = seg.trim();
|
|
132
|
+
if (!region)
|
|
133
|
+
throw inSelectorError("empty region (stray comma?)", value);
|
|
134
|
+
regions.push(parseRegion(region, value));
|
|
135
|
+
}
|
|
136
|
+
return new RegionSelector(regions);
|
|
137
|
+
}
|
|
138
|
+
// When the entire selector is a single action point (e.g. `ep_001/scn_003#2`),
|
|
139
|
+
// asset queries preserve their legacy "narrow to that one action's refs"
|
|
140
|
+
// behavior. Any range or multi-region selector falls back to the union over
|
|
141
|
+
// matched scenes. Returns the global scn number + action index, or null.
|
|
142
|
+
export function selectorSingleActionPoint(sel) {
|
|
143
|
+
if (!(sel instanceof RegionSelector))
|
|
144
|
+
return null;
|
|
145
|
+
if (sel.regions.length !== 1)
|
|
146
|
+
return null;
|
|
147
|
+
const r = sel.regions[0];
|
|
148
|
+
if (r.level !== "action")
|
|
149
|
+
return null;
|
|
150
|
+
if (r.lo.scn !== r.hi.scn || r.lo.idx !== r.hi.idx)
|
|
151
|
+
return null;
|
|
152
|
+
return { scn: r.lo.scn, idx: r.lo.idx };
|
|
153
|
+
}
|
|
154
|
+
// Expand a selector into the concrete action refs (`ep/scn#idx`, 0-based) it
|
|
155
|
+
// matches, in document order. The batch-edit framework feeds these straight
|
|
156
|
+
// into parseActionRef-based ops. Safe to expand once and run as a single
|
|
157
|
+
// applyPatchOperations batch for NON-structural ops (renumberSceneIds only
|
|
158
|
+
// runs once at the very end, so scn ids stay stable for the whole batch).
|
|
159
|
+
export function expandSelectorToActionRefs(script, selector) {
|
|
160
|
+
const refs = [];
|
|
161
|
+
for (const ep of asList(script["episodes"])) {
|
|
162
|
+
const epId = strOf(ep["episode_id"]);
|
|
163
|
+
for (const scene of asList(ep["scenes"])) {
|
|
164
|
+
const sceneId = strOf(scene["scene_id"]);
|
|
165
|
+
if (!selector.matchesScene(epId, sceneId))
|
|
166
|
+
continue;
|
|
167
|
+
const actions = asList(scene["actions"]);
|
|
168
|
+
for (let i = 0; i < actions.length; i++) {
|
|
169
|
+
if (!selector.matchesAction(epId, sceneId, i))
|
|
170
|
+
continue;
|
|
171
|
+
refs.push(`${epId}/${sceneId}#${i}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return refs;
|
|
176
|
+
}
|
|
177
|
+
// Reverse lookup for asset / speaker references. Parallel to collectStateRefs
|
|
178
|
+
// but tracks where an actor/location/prop/speaker is mentioned rather than
|
|
179
|
+
// where a specific state is mentioned. Returns one `{target, location, role}`
|
|
180
|
+
// entry per reference site. Walks the same edges the validator does
|
|
181
|
+
// (script-core.ts validateScript) so coverage is complete:
|
|
182
|
+
// - scene.context.{actors|locations|props}[]
|
|
183
|
+
// - action.actor_id (actor only)
|
|
184
|
+
// - action.speaker_id + action.speakers[] + action.lines[].speaker_id (speaker only)
|
|
185
|
+
// - action.state_changes[].target_{kind,id}
|
|
186
|
+
// - action.transition_prompt.target_{kind,id}
|
|
187
|
+
//# sourceMappingURL=selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.js","sourceRoot":"","sources":["../../../src/domain/script/selector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CliError } from "../../common.js";
|
|
2
|
+
export type Dict = Record<string, unknown>;
|
|
3
|
+
export declare function strOf(v: unknown): string;
|
|
4
|
+
export declare function isDict(v: unknown): v is Record<string, unknown>;
|
|
5
|
+
export declare function isList(v: unknown): v is unknown[];
|
|
6
|
+
export declare function asList<T = unknown>(v: unknown): T[];
|
|
7
|
+
export declare function idNum(id: string, prefix: string): number;
|
|
8
|
+
export declare function opErr(title: string, message: string, opts?: {
|
|
9
|
+
exitCode?: number;
|
|
10
|
+
required?: string[];
|
|
11
|
+
received?: string[];
|
|
12
|
+
nextSteps?: string[];
|
|
13
|
+
op?: string;
|
|
14
|
+
errorCode?: string;
|
|
15
|
+
}): CliError;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Shared micro-utilities for the script domain modules.
|
|
2
|
+
// Promoted here so script-core's split modules (selector / validate / patch /
|
|
3
|
+
// ids / …) and the usecase layer share one copy instead of each redefining
|
|
4
|
+
// these generic JSON guards.
|
|
5
|
+
import { CliError, EXIT_USAGE } from "../../common.js";
|
|
6
|
+
export function strOf(v) {
|
|
7
|
+
if (v === null || v === undefined)
|
|
8
|
+
return "";
|
|
9
|
+
return String(v);
|
|
10
|
+
}
|
|
11
|
+
export function isDict(v) {
|
|
12
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
13
|
+
}
|
|
14
|
+
export function isList(v) {
|
|
15
|
+
return Array.isArray(v);
|
|
16
|
+
}
|
|
17
|
+
export function asList(v) {
|
|
18
|
+
return Array.isArray(v) ? v : [];
|
|
19
|
+
}
|
|
20
|
+
// Parse the numeric tail of an id like `ep_007` / `scn_012` (→ 7 / 12).
|
|
21
|
+
// Returns NaN when the id does not match `${prefix}_<digits>`.
|
|
22
|
+
export function idNum(id, prefix) {
|
|
23
|
+
const m = new RegExp(`^${prefix}_(\\d+)$`).exec(strOf(id).trim());
|
|
24
|
+
return m ? parseInt(m[1], 10) : NaN;
|
|
25
|
+
}
|
|
26
|
+
// Error factory used throughout the patch op engine. Defaults to EXIT_USAGE.
|
|
27
|
+
export function opErr(title, message, opts = {}) {
|
|
28
|
+
return new CliError(title, message, {
|
|
29
|
+
exitCode: opts.exitCode ?? EXIT_USAGE,
|
|
30
|
+
required: opts.required,
|
|
31
|
+
received: opts.received,
|
|
32
|
+
nextSteps: opts.nextSteps,
|
|
33
|
+
op: opts.op,
|
|
34
|
+
errorCode: opts.errorCode,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=shared.js.map
|