@lingjingai/scriptctl 0.60.11 → 0.61.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.
Files changed (57) hide show
  1. package/changes/0.60.12.md +2 -0
  2. package/changes/0.60.13.md +1 -0
  3. package/changes/0.61.0.md +19 -0
  4. package/dist/cli/register-script.d.ts +3 -0
  5. package/dist/cli/register-script.js +256 -0
  6. package/dist/cli/register-script.js.map +1 -0
  7. package/dist/cli/register-workflows.js +37 -42
  8. package/dist/cli/register-workflows.js.map +1 -1
  9. package/dist/cli.js +2 -6
  10. package/dist/cli.js.map +1 -1
  11. package/dist/domain/ingest/environment.d.ts +2 -3
  12. package/dist/domain/ingest/environment.js +1 -4
  13. package/dist/domain/ingest/environment.js.map +1 -1
  14. package/dist/domain/script/names.d.ts +1 -1
  15. package/dist/domain/script/names.js +1 -3
  16. package/dist/domain/script/names.js.map +1 -1
  17. package/dist/domain/script/shared/types.d.ts +1 -18
  18. package/dist/domain/script/shared/types.js +4 -8
  19. package/dist/domain/script/shared/types.js.map +1 -1
  20. package/dist/domain/script/shared/validation.d.ts +1 -12
  21. package/dist/domain/script/shared/validation.js +2 -22
  22. package/dist/domain/script/shared/validation.js.map +1 -1
  23. package/dist/domain/script/timestamp.d.ts +1 -23
  24. package/dist/domain/script/timestamp.js +2 -126
  25. package/dist/domain/script/timestamp.js.map +1 -1
  26. package/dist/domain/script/v3/validation.d.ts +2 -3
  27. package/dist/domain/script/v3/validation.js +1 -232
  28. package/dist/domain/script/v3/validation.js.map +1 -1
  29. package/dist/domain/script/v4/ids.d.ts +2 -24
  30. package/dist/domain/script/v4/ids.js +19 -40
  31. package/dist/domain/script/v4/ids.js.map +1 -1
  32. package/dist/domain/script/v4/validation.d.ts +2 -2
  33. package/dist/domain/script/v4/validation.js +1 -410
  34. package/dist/domain/script/v4/validation.js.map +1 -1
  35. package/dist/infra/llm/openai-compatible-model.js +0 -1
  36. package/dist/infra/llm/openai-compatible-model.js.map +1 -1
  37. package/dist/usecases/ingest/serial-govern.js +14 -1
  38. package/dist/usecases/ingest/serial-govern.js.map +1 -1
  39. package/dist/usecases/script/action-span.d.ts +3 -19
  40. package/dist/usecases/script/action-span.js +19 -146
  41. package/dist/usecases/script/action-span.js.map +1 -1
  42. package/package.json +4 -3
  43. package/skills/scriptctl/SKILL.md +148 -214
  44. package/skills/scriptctl/references/ingest-workflow.md +2 -2
  45. package/skills/scriptctl/references/state-reference-repair.md +23 -19
  46. package/skills/scriptctl/references/video-transcript-repair.md +27 -29
  47. package/dist/cli/register-batch.d.ts +0 -3
  48. package/dist/cli/register-batch.js +0 -28
  49. package/dist/cli/register-batch.js.map +0 -1
  50. package/dist/cli/register-edits.d.ts +0 -4
  51. package/dist/cli/register-edits.js +0 -234
  52. package/dist/cli/register-edits.js.map +0 -1
  53. package/dist/cli/register-query.d.ts +0 -4
  54. package/dist/cli/register-query.js +0 -95
  55. package/dist/cli/register-query.js.map +0 -1
  56. package/skills/scriptctl/references/atomic-edit-workflow.md +0 -47
  57. package/skills/scriptctl/references/bulk-authoring.md +0 -50
@@ -1,12 +1 @@
1
- export type ValidationIssue = {
2
- code: string;
3
- path: string;
4
- message: string;
5
- repair_hint?: string;
6
- };
7
- export type ValidationResult = {
8
- ok: boolean;
9
- errors: ValidationIssue[];
10
- warnings: ValidationIssue[];
11
- };
12
- export declare function strictlyReducesValidationErrors(baseline: ValidationResult, proposed: ValidationResult): boolean;
1
+ export { strictlyReducesValidationErrors, type ValidationIssue, type ValidationResult, } from "@lingjingai/screenplay/schema";
@@ -1,23 +1,3 @@
1
- function issueKey(issue) {
2
- return JSON.stringify([issue.code, issue.path, issue.message]);
3
- }
4
- function issueCounts(issues) {
5
- const counts = new Map();
6
- for (const issue of issues) {
7
- const key = issueKey(issue);
8
- counts.set(key, (counts.get(key) ?? 0) + 1);
9
- }
10
- return counts;
11
- }
12
- export function strictlyReducesValidationErrors(baseline, proposed) {
13
- if (baseline.ok || proposed.errors.length >= baseline.errors.length)
14
- return false;
15
- const baselineCounts = issueCounts(baseline.errors);
16
- const proposedCounts = issueCounts(proposed.errors);
17
- for (const [key, count] of proposedCounts) {
18
- if (count > (baselineCounts.get(key) ?? 0))
19
- return false;
20
- }
21
- return true;
22
- }
1
+ // See ./types.ts — the validator moved to `@lingjingai/screenplay/schema`.
2
+ export { strictlyReducesValidationErrors, } from "@lingjingai/screenplay/schema";
23
3
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/domain/script/shared/validation.ts"],"names":[],"mappings":"AAQA,SAAS,QAAQ,CAAC,KAAsB;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,MAAyB;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,QAA0B,EAC1B,QAA0B;IAE1B,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClF,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;QAC1C,IAAI,KAAK,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/domain/script/shared/validation.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EACL,+BAA+B,GAGhC,MAAM,+BAA+B,CAAC"}
@@ -1,23 +1 @@
1
- export interface ParsedTimestamp {
2
- canonical: string;
3
- milliseconds: number;
4
- fractionDigits: number;
5
- }
6
- export interface TimestampRange {
7
- start: ParsedTimestamp;
8
- end: ParsedTimestamp;
9
- }
10
- type TimestampIssue = (code: string, path: string, message: string) => void;
11
- export declare class TimestampParseError extends Error {
12
- readonly input: string;
13
- constructor(input: string, message: string);
14
- }
15
- export declare function parseTimestamp(raw: string): ParsedTimestamp;
16
- export declare function parseTimestampRange(raw: string): TimestampRange;
17
- export declare function timestampInRange(timestamp: ParsedTimestamp, range: TimestampRange): boolean;
18
- /**
19
- * Action timestamps mark simultaneous beats as well as sequential ones, so
20
- * equal timestamps are valid. Only a later Action moving backwards is invalid.
21
- */
22
- export declare function validateActionTimestampOrder(actions: readonly unknown[], actionsPath: string, issue: TimestampIssue): void;
23
- export {};
1
+ export * from "@lingjingai/screenplay/schema";
@@ -1,127 +1,3 @@
1
- export class TimestampParseError extends Error {
2
- input;
3
- constructor(input, message) {
4
- super(message);
5
- this.input = input;
6
- this.name = "TimestampParseError";
7
- }
8
- }
9
- const MINUTE_SECOND_RE = /^(\d+):(\d{2})(?:\.(\d{1,3}))?$/;
10
- const HOUR_MINUTE_SECOND_RE = /^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;
11
- function fractionMilliseconds(raw) {
12
- return raw ? Number(raw.padEnd(3, "0")) : 0;
13
- }
14
- function requireSafeMilliseconds(raw, milliseconds) {
15
- if (!Number.isSafeInteger(milliseconds)) {
16
- throw new TimestampParseError(raw, "Timestamp exceeds the supported numeric range.");
17
- }
18
- return milliseconds;
19
- }
20
- function canonicalTimestamp(milliseconds, fraction) {
21
- const totalSeconds = Math.floor(milliseconds / 1000);
22
- const hours = Math.floor(totalSeconds / 3600);
23
- const minutes = Math.floor((totalSeconds % 3600) / 60);
24
- const seconds = totalSeconds % 60;
25
- const fractionPart = fraction ? `.${fraction}` : "";
26
- if (hours > 0) {
27
- return `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}${fractionPart}`;
28
- }
29
- return `${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}${fractionPart}`;
30
- }
31
- export function parseTimestamp(raw) {
32
- const input = raw.trim();
33
- if (!input) {
34
- throw new TimestampParseError(raw, "Timestamp must not be empty.");
35
- }
36
- const hourMatch = input.match(HOUR_MINUTE_SECOND_RE);
37
- if (hourMatch) {
38
- const hours = Number(hourMatch[1]);
39
- const minutes = Number(hourMatch[2]);
40
- const seconds = Number(hourMatch[3]);
41
- const fraction = hourMatch[4];
42
- if (minutes > 59) {
43
- throw new TimestampParseError(raw, "Hour-form timestamps require minutes between 00 and 59.");
44
- }
45
- if (seconds > 59) {
46
- throw new TimestampParseError(raw, "Timestamp seconds must be between 00 and 59.");
47
- }
48
- const milliseconds = requireSafeMilliseconds(raw, ((hours * 60 + minutes) * 60 + seconds) * 1000 + fractionMilliseconds(fraction));
49
- return {
50
- canonical: canonicalTimestamp(milliseconds, fraction),
51
- milliseconds,
52
- fractionDigits: fraction?.length ?? 0,
53
- };
54
- }
55
- const minuteMatch = input.match(MINUTE_SECOND_RE);
56
- if (!minuteMatch) {
57
- throw new TimestampParseError(raw, "Use M:SS, MM:SS, or H:MM:SS with an optional 1-3 digit fraction.");
58
- }
59
- const minutes = Number(minuteMatch[1]);
60
- const seconds = Number(minuteMatch[2]);
61
- const fraction = minuteMatch[3];
62
- if (seconds > 59) {
63
- throw new TimestampParseError(raw, "Timestamp seconds must be between 00 and 59.");
64
- }
65
- const milliseconds = requireSafeMilliseconds(raw, (minutes * 60 + seconds) * 1000 + fractionMilliseconds(fraction));
66
- return {
67
- canonical: canonicalTimestamp(milliseconds, fraction),
68
- milliseconds,
69
- fractionDigits: fraction?.length ?? 0,
70
- };
71
- }
72
- export function parseTimestampRange(raw) {
73
- const input = raw.trim();
74
- const parts = input.split("..");
75
- if (parts.length > 2 || parts.some((part) => part.trim() === "")) {
76
- throw new TimestampParseError(raw, "Use one timestamp or a closed range such as 00:10..00:20.");
77
- }
78
- const first = parseTimestamp(parts[0]);
79
- const second = parts.length === 2 ? parseTimestamp(parts[1]) : first;
80
- return first.milliseconds <= second.milliseconds
81
- ? { start: first, end: second }
82
- : { start: second, end: first };
83
- }
84
- export function timestampInRange(timestamp, range) {
85
- return timestamp.milliseconds >= range.start.milliseconds
86
- && timestamp.milliseconds <= range.end.milliseconds;
87
- }
88
- function timestampOfAction(action) {
89
- if (typeof action !== "object" || action === null || Array.isArray(action))
90
- return undefined;
91
- const extend = action.extend;
92
- if (typeof extend !== "object" || extend === null || Array.isArray(extend))
93
- return undefined;
94
- return extend.timestamp;
95
- }
96
- /**
97
- * Action timestamps mark simultaneous beats as well as sequential ones, so
98
- * equal timestamps are valid. Only a later Action moving backwards is invalid.
99
- */
100
- export function validateActionTimestampOrder(actions, actionsPath, issue) {
101
- let previous = null;
102
- actions.forEach((action, actionIndex) => {
103
- const rawTimestamp = timestampOfAction(action);
104
- if (rawTimestamp === undefined)
105
- return;
106
- const timestampPath = `${actionsPath}[${actionIndex}].extend.timestamp`;
107
- if (typeof rawTimestamp !== "string") {
108
- issue("timestamp_invalid", timestampPath, "timestamp must be a string in M:SS, MM:SS, or H:MM:SS form");
109
- return;
110
- }
111
- let timestamp;
112
- try {
113
- timestamp = parseTimestamp(rawTimestamp);
114
- }
115
- catch (error) {
116
- if (!(error instanceof TimestampParseError))
117
- throw error;
118
- issue("timestamp_invalid", timestampPath, error.message);
119
- return;
120
- }
121
- if (previous !== null && timestamp.milliseconds < previous.timestamp.milliseconds) {
122
- issue("timestamp_out_of_order", timestampPath, `timestamp ${timestamp.canonical} is earlier than Action ${previous.actionIndex + 1} timestamp ${previous.timestamp.canonical}; equal timestamps are allowed`);
123
- }
124
- previous = { actionIndex, timestamp };
125
- });
126
- }
1
+ // See ./shared/types.ts — timestamp parsing and ordering moved to `@lingjingai/screenplay/schema`.
2
+ export * from "@lingjingai/screenplay/schema";
127
3
  //# sourceMappingURL=timestamp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../src/domain/script/timestamp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../src/domain/script/timestamp.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,cAAc,+BAA+B,CAAC"}
@@ -1,3 +1,2 @@
1
- import type { ValidationResult } from "../shared/validation.js";
2
- export type { ValidationIssue, ValidationResult } from "../shared/validation.js";
3
- export declare function validateScriptV3(doc: unknown): ValidationResult;
1
+ export { validateScriptV3 } from "@lingjingai/screenplay/schema";
2
+ export type { ValidationIssue, ValidationResult } from "@lingjingai/screenplay/schema";
@@ -1,233 +1,2 @@
1
- // Deterministic Script v3 structural + referential validator (§9.9, revised).
2
- // Enforces v3 invariants: plain-text content, single scene-level location,
3
- // scene-level actors/props with materialized state, no legacy v2 fields
4
- // (state_changes / action.actor_id / scene.context / speakers[] / content spans).
5
- import { ACTION_TYPES, IMPORTANCE_TIERS, NON_ACTOR_SPEAKER_KINDS } from "./types.js";
6
- import { canonicalNameKey } from "../names.js";
7
- import { validateActionTimestampOrder } from "../timestamp.js";
8
- import { isSceneTime } from "../../ingest/environment.js";
9
- const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
10
- const isArr = (v) => Array.isArray(v);
11
- const isStr = (v) => typeof v === "string";
12
- const ACTION_LEGACY = ["state_changes", "actor_id", "speakers", "lines"];
13
- export function validateScriptV3(doc) {
14
- const errors = [];
15
- const warnings = [];
16
- const err = (code, path, message, repairHint) => errors.push({ code, path, message, ...(repairHint ? { repair_hint: repairHint } : {}) });
17
- const warn = (code, path, message) => warnings.push({ code, path, message });
18
- if (!isObj(doc))
19
- return { ok: false, errors: [{ code: "not_object", path: "$", message: "script must be an object" }], warnings };
20
- if (doc.version !== 3)
21
- err("version", "$.version", "version must be 3");
22
- for (const key of ["title", "worldview", "style"])
23
- if (!isStr(doc[key]))
24
- err("field", `$.${key}`, `${key} must be a string`);
25
- const stateIds = new Map();
26
- const idKind = new Map();
27
- const actorNames = new Map();
28
- const collect = (list, kind, idField, nameField, path) => {
29
- if (!isArr(list)) {
30
- err("field", path, `${path} must be an array`);
31
- return;
32
- }
33
- list.forEach((raw, i) => {
34
- const p = `${path}[${i}]`;
35
- if (!isObj(raw)) {
36
- err("asset", p, "asset must be an object");
37
- return;
38
- }
39
- const id = raw[idField];
40
- if (!isStr(id)) {
41
- err("asset_id", `${p}.${idField}`, `${idField} required`);
42
- return;
43
- }
44
- if (idKind.has(id))
45
- err("dup_id", `${p}.${idField}`, `duplicate id ${id}`);
46
- idKind.set(id, kind);
47
- if (!isStr(raw[nameField]))
48
- err("asset_name", `${p}.${nameField}`, `${nameField} required`);
49
- else if (kind === "actor") {
50
- const nameKey = canonicalNameKey(raw[nameField]);
51
- const existingId = actorNames.get(nameKey);
52
- if (existingId !== undefined) {
53
- err("dup_actor_name", `${p}.${nameField}`, `actor name ${raw[nameField]} already belongs to ${existingId}`);
54
- }
55
- else {
56
- actorNames.set(nameKey, id);
57
- }
58
- }
59
- if (!isStr(raw.importance) || !IMPORTANCE_TIERS.includes(raw.importance))
60
- err("importance", `${p}.importance`, `importance must be one of ${IMPORTANCE_TIERS.join("|")}`);
61
- if (!isStr(raw.description))
62
- err("asset_desc", `${p}.description`, "description must be a string");
63
- const ids = new Set();
64
- const names = new Set();
65
- let defaults = 0;
66
- if (!isArr(raw.states) || raw.states.length === 0)
67
- err("states", `${p}.states`, "states must be a non-empty array");
68
- else
69
- raw.states.forEach((st, j) => {
70
- const sp = `${p}.states[${j}]`;
71
- if (!isObj(st) || !isStr(st.state_id)) {
72
- err("state_id", sp, "state_id required");
73
- return;
74
- }
75
- if (ids.has(st.state_id))
76
- err("dup_state", sp, `duplicate state_id ${st.state_id}`);
77
- ids.add(st.state_id);
78
- if (st.state_id === "default")
79
- defaults++;
80
- if (!isStr(st.state_name))
81
- err("state_name", `${sp}.state_name`, "state_name required");
82
- else {
83
- if (names.has(st.state_name))
84
- err("dup_state_name", `${sp}.state_name`, `duplicate state_name ${st.state_name}`);
85
- names.add(st.state_name);
86
- }
87
- });
88
- if (isArr(raw.states) && defaults !== 1)
89
- err("default_state", `${p}.states`, `exactly one 'default' state required, found ${defaults}`);
90
- stateIds.set(id, ids);
91
- });
92
- };
93
- collect(doc.actors, "actor", "actor_id", "actor_name", "$.actors");
94
- collect(doc.locations, "location", "location_id", "location_name", "$.locations");
95
- collect(doc.props, "prop", "prop_id", "prop_name", "$.props");
96
- const refState = (assetId, stateId, kind, path) => {
97
- if (idKind.get(assetId) !== kind) {
98
- err("ref", path, `${kind} ${assetId} not found`);
99
- return;
100
- }
101
- if (stateId !== undefined && (!isStr(stateId) || !stateIds.get(assetId)?.has(stateId)))
102
- err("state_ref", path, `state ${String(stateId)} not materialized on ${assetId}`);
103
- };
104
- const checkEntityList = (list, kind, idField, path) => {
105
- if (list === undefined) {
106
- err("field", path, `${path} required (may be empty array)`);
107
- return;
108
- }
109
- if (!isArr(list)) {
110
- err("field", path, `${path} must be an array`);
111
- return;
112
- }
113
- list.forEach((ref, i) => {
114
- if (!isObj(ref) || !isStr(ref[idField])) {
115
- err("ref", `${path}[${i}]`, `${idField} required`);
116
- return;
117
- }
118
- refState(ref[idField], ref.state_id, kind, `${path}[${i}]`);
119
- });
120
- };
121
- const checkAction = (action, path, sceneActorIds, sceneAddress) => {
122
- if (!isObj(action)) {
123
- err("action", path, "action must be an object");
124
- return;
125
- }
126
- for (const bad of ACTION_LEGACY)
127
- if (bad in action)
128
- err("legacy_field", `${path}.${bad}`, `v3 forbids action.${bad}`);
129
- const type = action.type;
130
- if (!isStr(type) || !ACTION_TYPES.includes(type))
131
- err("action_type", `${path}.type`, `invalid action type ${String(type)}`);
132
- if (!isStr(action.content))
133
- err("content", `${path}.content`, "content must be a plain-text string");
134
- if (type === "dialogue" || type === "inner_thought") {
135
- const sp = action.speaker;
136
- if (!isObj(sp))
137
- err("speaker", `${path}.speaker`, "dialogue/inner_thought needs a speaker");
138
- else if ("kind" in sp) {
139
- if (!isStr(sp.kind) || !NON_ACTOR_SPEAKER_KINDS.includes(sp.kind))
140
- err("speaker_kind", `${path}.speaker.kind`, "invalid non-actor speaker kind");
141
- }
142
- else if (isStr(sp.actor_id)) {
143
- refState(sp.actor_id, sp.state_id, "actor", `${path}.speaker`);
144
- if (!sceneActorIds.has(sp.actor_id)) {
145
- const ownedStates = stateIds.get(sp.actor_id);
146
- const requestedState = isStr(sp.state_id) && ownedStates?.has(sp.state_id)
147
- ? sp.state_id
148
- : ownedStates?.has("default")
149
- ? "default"
150
- : ownedStates?.values().next().value;
151
- const repairHint = sceneAddress && requestedState
152
- ? `scriptctl scene-ref ${sceneAddress} actor:${sp.actor_id} --state ${requestedState} -p "$SCRIPT"`
153
- : undefined;
154
- err("actor_not_in_scene", `${path}.speaker.actor_id`, `actor ${sp.actor_id} is not referenced by this scene`, repairHint);
155
- }
156
- }
157
- else
158
- err("speaker", `${path}.speaker`, "speaker needs actor_id or kind");
159
- }
160
- };
161
- const episodes = doc.episodes;
162
- if (!isArr(episodes))
163
- err("episodes", "$.episodes", "episodes must be an array");
164
- else
165
- episodes.forEach((ep, ei) => {
166
- const ep_p = `$.episodes[${ei}]`;
167
- if (!isObj(ep) || !isStr(ep.episode_id)) {
168
- err("episode_id", ep_p, "episode_id required");
169
- return;
170
- }
171
- if (!isArr(ep.scenes)) {
172
- err("scenes", `${ep_p}.scenes`, "scenes must be an array");
173
- return;
174
- }
175
- ep.scenes.forEach((sc, si) => {
176
- const sc_p = `${ep_p}.scenes[${si}]`;
177
- if (!isObj(sc)) {
178
- err("scene", sc_p, "scene must be an object");
179
- return;
180
- }
181
- if ("context" in sc)
182
- err("legacy_field", `${sc_p}.context`, "v3 forbids scene.context");
183
- if (!isStr(sc.scene_id))
184
- err("scene_id", sc_p, "scene_id required");
185
- const environment = sc.environment;
186
- if (environment === undefined || (isObj(environment) && (!isStr(environment.time) || environment.time.trim() === ""))) {
187
- warn("scene_time_missing", `${sc_p}.environment.time`, "scene time is required for production review");
188
- }
189
- else if (!isObj(environment)
190
- || (environment.space !== undefined && !isStr(environment.space))
191
- || !isStr(environment.time)) {
192
- err("environment", `${sc_p}.environment`, "environment must contain optional string space and a time string");
193
- }
194
- else if (!isSceneTime(environment.time)) {
195
- err("scene_time", `${sc_p}.environment.time`, "scene time must be day|night|dawn|dusk");
196
- }
197
- const loc = sc.location;
198
- if (loc !== null) {
199
- if (!isObj(loc) || !isStr(loc.location_id))
200
- err("location", `${sc_p}.location`, "location must be null or {location_id}");
201
- else
202
- refState(loc.location_id, loc.state_id, "location", `${sc_p}.location`);
203
- }
204
- checkEntityList(sc.actors, "actor", "actor_id", `${sc_p}.actors`);
205
- checkEntityList(sc.props, "prop", "prop_id", `${sc_p}.props`);
206
- if (isArr(sc.props)) {
207
- const propIds = new Set();
208
- sc.props.forEach((ref, i) => {
209
- if (!isObj(ref) || !isStr(ref.prop_id))
210
- return;
211
- if (propIds.has(ref.prop_id))
212
- err("dup_prop_ref", `${sc_p}.props[${i}]`, `duplicate prop ref ${ref.prop_id}`);
213
- propIds.add(ref.prop_id);
214
- });
215
- }
216
- const sceneActorIds = new Set(isArr(sc.actors)
217
- ? sc.actors
218
- .filter((ref) => isObj(ref))
219
- .map((ref) => ref.actor_id)
220
- .filter((id) => isStr(id))
221
- : []);
222
- if (!isArr(sc.actions))
223
- err("actions", `${sc_p}.actions`, "actions must be an array");
224
- else {
225
- const sceneAddress = isStr(sc.scene_id) ? `${ep.episode_id}/${sc.scene_id}` : undefined;
226
- sc.actions.forEach((a, ai) => checkAction(a, `${sc_p}.actions[${ai}]`, sceneActorIds, sceneAddress));
227
- validateActionTimestampOrder(sc.actions, `${sc_p}.actions`, err);
228
- }
229
- });
230
- });
231
- return { ok: errors.length === 0, errors, warnings };
232
- }
1
+ export { validateScriptV3 } from "@lingjingai/screenplay/schema";
233
2
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/domain/script/v3/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/domain/script/v3/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -1,27 +1,5 @@
1
- import type { ActionIdV4, ActorIdV4, EpisodeIdV4, LocationIdV4, PropIdV4, SceneIdV4 } from "./types.js";
2
- export declare const V4_ID_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
3
- export declare const V4_ID_RANDOM_LENGTH = 6;
4
- export declare const V4_ID_PREFIXES: {
5
- readonly episode: "ep";
6
- readonly scene: "scn";
7
- readonly action: "ac";
8
- readonly actor: "act";
9
- readonly location: "loc";
10
- readonly prop: "prp";
11
- readonly state: "st";
12
- };
13
- export type V4IdKind = keyof typeof V4_ID_PREFIXES;
14
- export type V4IdByKind = {
15
- episode: EpisodeIdV4;
16
- scene: SceneIdV4;
17
- action: ActionIdV4;
18
- actor: ActorIdV4;
19
- location: LocationIdV4;
20
- prop: PropIdV4;
21
- state: `st${string}`;
22
- };
23
- export declare const V4_ID_PATTERNS: Readonly<Record<V4IdKind, RegExp>>;
24
- export declare function isV4Id<K extends V4IdKind>(kind: K, value: unknown): value is V4IdByKind[K];
1
+ import { type V4IdByKind, type V4IdKind } from "@lingjingai/screenplay/schema";
2
+ export { isV4Id, V4_ID_ALPHABET, V4_ID_PATTERNS, V4_ID_PREFIXES, V4_ID_RANDOM_LENGTH, type V4IdByKind, type V4IdKind, } from "@lingjingai/screenplay/schema";
25
3
  export declare function requireV4Id<K extends V4IdKind>(kind: K, value: unknown, path: string): V4IdByKind[K];
26
4
  export declare function generateV4Id<K extends V4IdKind>(kind: K, existing?: ReadonlySet<string>, generateSuffix?: () => string): V4IdByKind[K];
27
5
  export declare function generateV4Ids<K extends V4IdKind>(kind: K, count: number, existing?: ReadonlySet<string>): V4IdByKind[K][];
@@ -1,25 +1,8 @@
1
- import { customAlphabet } from "nanoid";
1
+ // The v4 identity grammar and generator live in `@lingjingai/screenplay/schema`.
2
+ // Only the wrappers that raise scriptctl's own CliError stay here.
2
3
  import { CliError, EXIT_INPUT } from "../../../common.js";
3
- export const V4_ID_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
4
- export const V4_ID_RANDOM_LENGTH = 6;
5
- export const V4_ID_PREFIXES = {
6
- episode: "ep",
7
- scene: "scn",
8
- action: "ac",
9
- actor: "act",
10
- location: "loc",
11
- prop: "prp",
12
- state: "st",
13
- };
14
- const randomSuffix = customAlphabet(V4_ID_ALPHABET, V4_ID_RANDOM_LENGTH);
15
- const alphabetClass = `[${V4_ID_ALPHABET}]`;
16
- export const V4_ID_PATTERNS = Object.fromEntries(Object.entries(V4_ID_PREFIXES).map(([kind, prefix]) => [
17
- kind,
18
- new RegExp(`^${prefix}${alphabetClass}{${V4_ID_RANDOM_LENGTH}}$`),
19
- ]));
20
- export function isV4Id(kind, value) {
21
- return typeof value === "string" && V4_ID_PATTERNS[kind].test(value);
22
- }
4
+ import { ID_SPACE_EXHAUSTED, generateV4Id as generate, generateV4Ids as generateMany, isV4Id, V4_ID_PREFIXES, } from "@lingjingai/screenplay/schema";
5
+ export { isV4Id, V4_ID_ALPHABET, V4_ID_PATTERNS, V4_ID_PREFIXES, V4_ID_RANDOM_LENGTH, } from "@lingjingai/screenplay/schema";
23
6
  export function requireV4Id(kind, value, path) {
24
7
  if (isV4Id(kind, value))
25
8
  return value;
@@ -29,18 +12,21 @@ export function requireV4Id(kind, value, path) {
29
12
  data: { expected: [`${V4_ID_PREFIXES[kind]} + 6 Bitcoin Base58 characters`], actual: [String(value)] },
30
13
  });
31
14
  }
32
- export function generateV4Id(kind, existing = new Set(), generateSuffix = randomSuffix) {
33
- const prefix = V4_ID_PREFIXES[kind];
34
- for (let attempt = 0; attempt < 128; attempt++) {
35
- const candidate = `${prefix}${generateSuffix()}`;
36
- if (!existing.has(candidate))
37
- return candidate;
15
+ export function generateV4Id(kind, existing = new Set(), generateSuffix) {
16
+ try {
17
+ return generateSuffix ? generate(kind, existing, generateSuffix) : generate(kind, existing);
18
+ }
19
+ catch (error) {
20
+ // Only remap the one failure this is about; anything else keeps its own
21
+ // identity instead of being relabelled as a retry exhaustion.
22
+ if (error?.code !== ID_SPACE_EXHAUSTED)
23
+ throw error;
24
+ throw new CliError(`Could not generate an unused ${kind} ID.`, {
25
+ exitCode: EXIT_INPUT,
26
+ errorCode: "ID_SPACE_RETRY_EXHAUSTED",
27
+ hint: "Retry the command. If this persists, inspect the configured ID generator.",
28
+ });
38
29
  }
39
- throw new CliError(`Could not generate an unused ${kind} ID.`, {
40
- exitCode: EXIT_INPUT,
41
- errorCode: "ID_SPACE_RETRY_EXHAUSTED",
42
- hint: "Retry the command. If this persists, inspect the configured ID generator.",
43
- });
44
30
  }
45
31
  export function generateV4Ids(kind, count, existing = new Set()) {
46
32
  if (!Number.isSafeInteger(count) || count < 1) {
@@ -50,13 +36,6 @@ export function generateV4Ids(kind, count, existing = new Set()) {
50
36
  data: { actual: [String(count)] },
51
37
  });
52
38
  }
53
- const seen = new Set(existing);
54
- const ids = [];
55
- while (ids.length < count) {
56
- const id = generateV4Id(kind, seen);
57
- seen.add(id);
58
- ids.push(id);
59
- }
60
- return ids;
39
+ return generateMany(kind, count, existing);
61
40
  }
62
41
  //# sourceMappingURL=ids.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../../src/domain/script/v4/ids.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../../src/domain/script/v4/ids.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,mEAAmE;AACnE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,YAAY,IAAI,QAAQ,EACxB,aAAa,IAAI,YAAY,EAC7B,MAAM,EACN,cAAc,GAGf,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,MAAM,EACN,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GAGpB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,UAAU,WAAW,CAAqB,IAAO,EAAE,KAAc,EAAE,IAAY;IACnF,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,YAAY,cAAc,CAAC,IAAI,CAAC,8BAA8B,EAAE;QAClF,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,sBAAsB;QACjC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;KACvG,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,WAAgC,IAAI,GAAG,EAAE,EACzC,cAA6B;IAE7B,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wEAAwE;QACxE,8DAA8D;QAC9D,IAAK,KAA2B,EAAE,IAAI,KAAK,kBAAkB;YAAE,MAAM,KAAK,CAAC;QAC3E,MAAM,IAAI,QAAQ,CAAC,gCAAgC,IAAI,MAAM,EAAE;YACvD,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,0BAA0B;YACrC,IAAI,EAAE,2EAA2E;SAClF,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAO,EACP,KAAa,EACb,WAAgC,IAAI,GAAG,EAAE;IAEzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,QAAQ,CAAC,mCAAmC,EAAE;YAChD,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,kBAAkB;YAC7B,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;SAClC,CAAC,CAAC;IACX,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
@@ -1,2 +1,2 @@
1
- import type { ValidationResult } from "../shared/validation.js";
2
- export declare function validateScriptV4(doc: unknown): ValidationResult;
1
+ export { validateScriptV4 } from "@lingjingai/screenplay/schema";
2
+ export type { ValidationIssue, ValidationResult } from "@lingjingai/screenplay/schema";