@lingjingai/scriptctl 0.65.0 → 0.65.1
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/changes/0.65.1.md +13 -0
- package/dist/bin.js +1 -1
- package/dist/{chunk-C5RYWU5E.js → chunk-5KDKNZCX.js} +137 -137
- package/dist/cli.js +1 -1
- package/package.json +17 -18
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{Command as
|
|
2
|
-
`)}list(t,n="*"){if(!
|
|
1
|
+
import{Command as xb,CommanderError as Eb}from"commander";import*as nc from"node:crypto";import*as hi from"node:fs";import*as sr from"node:path";import*as Re from"node:fs";import*as kt from"node:path";var fs=class{workspace;constructor(t){this.workspace=t}get sourceText(){return kt.join(this.workspace,"source.txt")}get directDir(){return kt.join(this.workspace,"draft","scriptctl","direct")}get directScript(){return kt.join(this.directDir,"script.initial.json")}get validation(){return kt.join(this.directDir,"validation.json")}get runState(){return kt.join(this.directDir,"run_state.json")}get episodeResultsDir(){return kt.join(this.directDir,"episode_results")}get batchResultsDir(){return kt.join(this.directDir,"batch_results")}outputScript(t){return kt.join(t,"script.json")}};function jy(e){let t="";for(let n of e)n==="*"?t+="[^/]*":n==="?"?t+="[^/]":".+^$()[]{}|\\".includes(n)?t+="\\"+n:t+=n;return new RegExp("^"+t+"$")}var tc=class{exists(t){return Re.existsSync(t)}readText(t){return Re.readFileSync(t,"utf-8")}writeText(t,n){Re.mkdirSync(kt.dirname(t),{recursive:!0}),Re.writeFileSync(t,n,"utf-8")}readJson(t){return JSON.parse(Re.readFileSync(t,"utf-8"))}writeJson(t,n){this.writeText(t,JSON.stringify(n,null,2)+`
|
|
2
|
+
`)}list(t,n="*"){if(!Re.existsSync(t))return[];let o=jy(n),i=Re.readdirSync(t),r=[];for(let s of i)o.test(s)&&r.push(kt.join(t,s));return r.sort(),r}delete(t){Re.existsSync(t)&&Re.unlinkSync(t)}deleteTree(t){Re.existsSync(t)&&Re.rmSync(t,{recursive:!0,force:!0})}copyToPath(t,n){Re.mkdirSync(kt.dirname(n),{recursive:!0}),Re.copyFileSync(t,n)}},ms=new tc;var J=0,G=64,b=66,ge=70,Xn=78,Nl=30;var Rb=sr.join("draft","scriptctl","direct"),zy=sr.join("workspace","script.json");var Ul=["\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"],Cl=new Set(["actor","location","prop"]);var Mb=`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
3
|
|
|
4
4
|
ep_001.md, ep_002.md, ... \u6B63\u6587\uFF08\u6BCF\u96C6\u4E00\u4E2A\uFF0C\u53EA\u653E\u5267\u672C\u672C\u8EAB\uFF09
|
|
5
5
|
\u4EBA\u7269.md \u5168\u5267\u552F\u4E00\u4E00\u4EFD\u89D2\u8272\u767B\u8BB0\uFF08\u6240\u6709 worker \u5171\u540C\u5F80\u91CC\u52A0\uFF09
|
|
@@ -79,7 +79,7 @@ import{Command as _b,CommanderError as xb}from"commander";import*as tc from"node
|
|
|
79
79
|
<\u6574\u90E8\u5168\u6587\u6897\u6982\uFF0C\u7EAF\u6587\u672C\uFF0C\u53EF\u591A\u884C>
|
|
80
80
|
|
|
81
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`+
|
|
82
|
+
worldview: <\u4E16\u754C\u89C2\uFF0C\u53D6\u8FD9\u4E9B\u679A\u4E3E\u4E4B\u4E00\uFF1A`+Ul.join(" / ")+`>
|
|
83
83
|
style: <\u98CE\u683C\uFF0C\u81EA\u7531\u6587\u672C\uFF0C\u5982 \u90FD\u5E02\u751C\u5BA0 / \u60AC\u7591\u590D\u4EC7>
|
|
84
84
|
title: <\u5267\u540D>
|
|
85
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
|
|
@@ -119,30 +119,30 @@ Rules:
|
|
|
119
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
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
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
|
-
`,S=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 zy(e){return new us(e)}function Cl(e){return zy(e).directDir}function Ae(e){let t=e.script_path??e.scriptPath;return rr.resolve(typeof t=="string"&&t.length>0?t:jy)}function sr(e){return fs.readJson(e)}function nc(e,t){fs.writeJson(e,t)}function Co(e){return fs.exists(e)}function he(e){return tc.createHash("sha256").update(e,"utf-8").digest("hex")}function oc(e){let t=tc.createHash("sha256"),n=mi.openSync(e,"r");try{let o=Buffer.alloc(1048576);for(;;){let i=mi.readSync(n,o,0,o.length,null);if(i<=0)break;t.update(o.subarray(0,i))}}finally{mi.closeSync(n)}return t.digest("hex")}var Ot={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 vt(e,t){return typeof e=="string"&&t.some(n=>n===e)}function Pl(e,t){switch(e){case"policy":return vt(t,Ot.policy)?{failure_type:e,failure_code:t}:null;case"network":return vt(t,Ot.network)?{failure_type:e,failure_code:t}:null;case"timeout":return vt(t,Ot.timeout)?{failure_type:e,failure_code:t}:null;case"rate_limit":return vt(t,Ot.rate_limit)?{failure_type:e,failure_code:t}:null;case"authentication":return vt(t,Ot.authentication)?{failure_type:e,failure_code:t}:null;case"authorization":return vt(t,Ot.authorization)?{failure_type:e,failure_code:t}:null;case"provider":return vt(t,Ot.provider)?{failure_type:e,failure_code:t}:null;case"media":return vt(t,Ot.media)?{failure_type:e,failure_code:t}:null;case"response":return vt(t,Ot.response)?{failure_type:e,failure_code:t}:null;case"pipeline":return vt(t,Ot.pipeline)?{failure_type:e,failure_code:t}:null;case"validation":return vt(t,Ot.validation)?{failure_type:e,failure_code:t}:null;case"cancelled":return vt(t,Ot.cancelled)?{failure_type:e,failure_code:t}:null;case"unknown":return vt(t,Ot.unknown)?{failure_type:e,failure_code:t}:null;default:return null}}function Rt(e,t){return{...e,...t}}function gi(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 ar(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 Tl(e,t){if(e.length===0)return Rt({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)?gi(n):{failure_type:"provider",failure_code:"attempts_exhausted"};return Rt(i,{retryable:e.some(r=>r.retryable),message:t})}function ln(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 Zl from"node:crypto";import*as Wl from"node:fs";import*as Xl from"node:path";import*as jl from"node:crypto";var Rn=["action","dialogue","inner_thought","transition"],zt=new Set(Rn),Mn=["system","broadcast","offscreen","group"],Po=new Set(Mn),Ln=["featured","background"],Mt=new Set(Ln),hi=["\u4E3B\u89D2","\u914D\u89D2"],eo=new Set(hi),ms=["day","night","dawn","dusk"],ic=new Set(ms);function cr(e){return typeof e=="string"&&ic.has(e)}var rc=["interior","exterior"],Vl=new Set(rc);function ct(e){return e.normalize("NFKC").toLowerCase()}function $l(e){return JSON.stringify([e.code,e.path,e.message])}function sc(e){let t=new Map;for(let n of e){let o=$l(n);t.set(o,(t.get(o)??0)+1)}return t}function ac(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=sc(e.errors),o=sc(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function cc(e,t){let n=sc(e),o=[];for(let i of t){let r=$l(i),s=n.get(r)??0;s>0?n.set(r,s-1):o.push(i)}return o}import{customAlphabet as Hy}from"nanoid";var yi="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",dc=6,wi={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},Qy=Hy(yi,dc),Fy=`[${yi}]`,Dl=Object.fromEntries(Object.entries(wi).map(([e,t])=>[e,new RegExp(`^${t}${Fy}{${dc}}$`)]));function V(e,t){return typeof t=="string"&&Dl[e].test(t)}var pc="ID_SPACE_EXHAUSTED";function dr(e,t=new Set,n=Qy){let o=wi[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:pc})}var Xe=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},Yy=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,qy=/^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;function Gl(e){return e?Number(e.padEnd(3,"0")):0}function Jl(e,t){if(!Number.isSafeInteger(t))throw new Xe(e,"Timestamp exceeds the supported numeric range.");return t}function Bl(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 to(e){let t=e.trim();if(!t)throw new Xe(e,"Timestamp must not be empty.");let n=t.match(qy);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new Xe(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new Xe(e,"Timestamp seconds must be between 00 and 59.");let f=Jl(e,((a*60+d)*60+p)*1e3+Gl(l));return{canonical:Bl(f,l),milliseconds:f,fractionDigits:l?.length??0}}let o=t.match(Yy);if(!o)throw new Xe(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 Xe(e,"Timestamp seconds must be between 00 and 59.");let c=Jl(e,(i*60+r)*1e3+Gl(s));return{canonical:Bl(c,s),milliseconds:c,fractionDigits:s?.length??0}}function Zy(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 gs(e,t,n){let o=null;e.forEach((i,r)=>{let s=Zy(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=to(s)}catch(d){if(!(d instanceof Xe))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 ht=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Nn=e=>Array.isArray(e),_e=e=>typeof e=="string",Wy=["state_changes","actor_id","speakers","lines"];function yt(e){let t=[],n=[],o=(u,h,y,m)=>t.push({code:u,path:h,message:y,...m?{repair_hint:m}:{}}),i=(u,h,y)=>n.push({code:u,path:h,message:y});if(!ht(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"])_e(e[u])||o("field",`$.${u}`,`${u} must be a string`);let r=new Map,s=new Map,c=new Map,a=(u,h,y,m,w)=>{if(!Nn(u)){o("field",w,`${w} must be an array`);return}u.forEach((g,_)=>{let E=`${w}[${_}]`;if(!ht(g)){o("asset",E,"asset must be an object");return}let x=g[y];if(!_e(x)){o("asset_id",`${E}.${y}`,`${y} required`);return}if(s.has(x)&&o("dup_id",`${E}.${y}`,`duplicate id ${x}`),s.set(x,h),!_e(g[m]))o("asset_name",`${E}.${m}`,`${m} required`);else if(h==="actor"){let O=ct(g[m]),I=c.get(O);I!==void 0?o("dup_actor_name",`${E}.${m}`,`actor name ${g[m]} already belongs to ${I}`):c.set(O,x)}(!_e(g.importance)||!Ln.includes(g.importance))&&o("importance",`${E}.importance`,`importance must be one of ${Ln.join("|")}`),_e(g.description)||o("asset_desc",`${E}.description`,"description must be a string");let A=new Set,k=new Set,U=0;!Nn(g.states)||g.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):g.states.forEach((O,I)=>{let L=`${E}.states[${I}]`;if(!ht(O)||!_e(O.state_id)){o("state_id",L,"state_id required");return}A.has(O.state_id)&&o("dup_state",L,`duplicate state_id ${O.state_id}`),A.add(O.state_id),O.state_id==="default"&&U++,_e(O.state_name)?(k.has(O.state_name)&&o("dup_state_name",`${L}.state_name`,`duplicate state_name ${O.state_name}`),k.add(O.state_name)):o("state_name",`${L}.state_name`,"state_name required")}),Nn(g.states)&&U!==1&&o("default_state",`${E}.states`,`exactly one 'default' state required, found ${U}`),r.set(x,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,h,y,m)=>{if(s.get(u)!==y){o("ref",m,`${y} ${u} not found`);return}h!==void 0&&(!_e(h)||!r.get(u)?.has(h))&&o("state_ref",m,`state ${String(h)} not materialized on ${u}`)},p=(u,h,y,m)=>{if(u===void 0){o("field",m,`${m} required (may be empty array)`);return}if(!Nn(u)){o("field",m,`${m} must be an array`);return}u.forEach((w,g)=>{if(!ht(w)||!_e(w[y])){o("ref",`${m}[${g}]`,`${y} required`);return}d(w[y],w.state_id,h,`${m}[${g}]`)})},l=(u,h,y,m)=>{if(!ht(u)){o("action",h,"action must be an object");return}for(let g of Wy)g in u&&o("legacy_field",`${h}.${g}`,`v3 forbids action.${g}`);let w=u.type;if((!_e(w)||!Rn.includes(w))&&o("action_type",`${h}.type`,`invalid action type ${String(w)}`),_e(u.content)||o("content",`${h}.content`,"content must be a plain-text string"),w==="dialogue"||w==="inner_thought"){let g=u.speaker;if(!ht(g))o("speaker",`${h}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in g)(!_e(g.kind)||!Mn.includes(g.kind))&&o("speaker_kind",`${h}.speaker.kind`,"invalid non-actor speaker kind");else if(_e(g.actor_id)){if(d(g.actor_id,g.state_id,"actor",`${h}.speaker`),!y.has(g.actor_id)){let _=r.get(g.actor_id),E=_e(g.state_id)&&_?.has(g.state_id)?g.state_id:_?.has("default")?"default":_?.values().next().value,x=m&&E?`scriptctl scene-ref ${m} actor:${g.actor_id} --state ${E} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${h}.speaker.actor_id`,`actor ${g.actor_id} is not referenced by this scene`,x)}}else o("speaker",`${h}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return Nn(f)?f.forEach((u,h)=>{let y=`$.episodes[${h}]`;if(!ht(u)||!_e(u.episode_id)){o("episode_id",y,"episode_id required");return}if(!Nn(u.scenes)){o("scenes",`${y}.scenes`,"scenes must be an array");return}u.scenes.forEach((m,w)=>{let g=`${y}.scenes[${w}]`;if(!ht(m)){o("scene",g,"scene must be an object");return}"context"in m&&o("legacy_field",`${g}.context`,"v3 forbids scene.context"),_e(m.scene_id)||o("scene_id",g,"scene_id required");let _=m.environment;_===void 0||ht(_)&&(!_e(_.time)||_.time.trim()==="")?i("scene_time_missing",`${g}.environment.time`,"scene time is required for production review"):!ht(_)||_.space!==void 0&&!_e(_.space)||!_e(_.time)?o("environment",`${g}.environment`,"environment must contain optional string space and a time string"):cr(_.time)||o("scene_time",`${g}.environment.time`,"scene time must be day|night|dawn|dusk"),(m.environment===void 0||ht(m.environment)&&(!_e(m.environment.space)||m.environment.space.trim()===""))&&i("scene_space_missing",`${g}.environment.space`,"scene interior/exterior is required for production review"),m.location===null&&i("scene_location_missing",`${g}.location`,"scene location is required for production review");let E=m.location;if(E!==null&&(!ht(E)||!_e(E.location_id)?o("location",`${g}.location`,"location must be null or {location_id}"):d(E.location_id,E.state_id,"location",`${g}.location`)),p(m.actors,"actor","actor_id",`${g}.actors`),p(m.props,"prop","prop_id",`${g}.props`),Nn(m.props)){let A=new Set;m.props.forEach((k,U)=>{!ht(k)||!_e(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${g}.props[${U}]`,`duplicate prop ref ${k.prop_id}`),A.add(k.prop_id))})}let x=new Set(Nn(m.actors)?m.actors.filter(A=>ht(A)).map(A=>A.actor_id).filter(A=>_e(A)):[]);if(!Nn(m.actions))o("actions",`${g}.actions`,"actions must be an array");else{let A=_e(m.scene_id)?`${u.episode_id}/${m.scene_id}`:void 0;m.actions.forEach((k,U)=>l(k,`${g}.actions[${U}]`,x,A)),gs(m.actions,`${g}.actions`,o)}})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}var et=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),se=e=>typeof e=="string",un=e=>Array.isArray(e);function lc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(lc):et(e)&&Object.values(e).every(lc)}function _i(e,t,n){e!==void 0&&(!et(e)||!Object.values(e).every(lc))&&n("extend",t,"extend must be an object containing JSON values")}function Xy(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Le(e){let t=[],n=[],o=(u,h,y,m)=>t.push({code:u,path:h,message:y,...m?{repair_hint:m}:{}}),i=(u,h,y,m)=>n.push({code:u,path:h,message:y,...m?{repair_hint:m}:{}});if(!et(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"])se(e[u])||o("field",`$.${u}`,`${u} must be a string`);for(let u of["worldview_raw","synopsis","logline","theme"])e[u]!==void 0&&!se(e[u])&&o("field",`$.${u}`,`${u} must be a string`);e.main_characters!==void 0&&(!un(e.main_characters)||!e.main_characters.every(u=>et(u)&&se(u.name)&&se(u.role)))&&o("main_characters","$.main_characters","main_characters must contain {name, role} string records"),_i(e.extend,"$.extend",o);let r=new Map,s=new Map,c=new Set,a=(u,h,y,m,w)=>{if(!un(u)){o("field",w,`${w} must be an array`);return}let g=new Set;u.forEach((_,E)=>{let x=`${w}[${E}]`;if(!et(_)){o("asset",x,"asset must be an object");return}let A=_[y];if(!V(h,A)){o("asset_id",`${x}.${y}`,`${y} must be ${h} ID`);return}if(g.has(A)&&o("dup_id",`${x}.${y}`,`duplicate ${y} ${A}`),g.add(A),r.set(A,h),!se(_[m])||_[m].trim()==="")o("asset_name",`${x}.${m}`,`${m} must be a non-empty string`);else if(h==="actor"){let I=_[m].trim().toLocaleLowerCase();c.has(I)&&o("dup_actor_name",`${x}.${m}`,`duplicate actor name ${_[m]}`),c.add(I)}if((!se(_.importance)||!Ln.includes(_.importance))&&o("importance",`${x}.importance`,`importance must be ${Ln.join("|")}`),h==="actor"&&_.role_type!==void 0&&(!se(_.role_type)||!hi.includes(_.role_type))&&o("role_type",`${x}.role_type`,`role_type must be ${hi.join("|")}`),se(_.description)||o("asset_desc",`${x}.description`,"description must be a string"),_.aliases!==void 0&&(!un(_.aliases)||!_.aliases.every(se)))o("aliases",`${x}.aliases`,"aliases must be an array of strings");else if(un(_.aliases)&&_.aliases.every(se)){let I=new Set,L=se(_[m])?_[m]:"";_.aliases.forEach((T,C)=>{T===""&&o("alias_empty",`${x}.aliases[${C}]`,"alias must not be empty"),T===L&&o("alias_equals_name",`${x}.aliases[${C}]`,"alias must differ from the asset name"),I.has(T)&&o("dup_alias",`${x}.aliases[${C}]`,`duplicate alias ${T}`),I.add(T)})}_i(_.extend,`${x}.extend`,o);let k=new Set,U=new Set,O=0;!un(_.states)||_.states.length===0?o("states",`${x}.states`,"states must be a non-empty array"):_.states.forEach((I,L)=>{let T=`${x}.states[${L}]`;if(!et(I)){o("state",T,"state must be an object");return}let C=I.state_id;if(C!=="default"&&!V("state",C)){o("state_id",`${T}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(C)&&o("dup_state",`${T}.state_id`,`duplicate state_id ${C}`),k.add(C),C==="default"&&O++,!se(I.state_name)||I.state_name.trim()===""?o("state_name",`${T}.state_name`,"state_name must be a non-empty string"):(U.has(I.state_name)&&o("dup_state_name",`${T}.state_name`,`duplicate state_name ${I.state_name}`),U.add(I.state_name)),se(I.description)||o("state_description",`${T}.description`,"description must be a string"),_i(I.extend,`${T}.extend`,o)}),O!==1&&o("default_state",`${x}.states`,`exactly one default state required, found ${O}`),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,h,y)=>{if(!un(h)||h.length===0||!h.every(se))return o("state_ids",y,"state_ids must be a non-empty array of strings"),[];let m=h,w=new Set;return m.forEach((g,_)=>{w.has(g)&&o("dup_state_ref",`${y}[${_}]`,`duplicate state_id ${g}`),w.add(g),s.get(u)?.has(g)||o("state_ref",`${y}[${_}]`,`state ${g} not found on ${u}`)}),Xy(m)||o("state_ids_order",y,"state_ids must be sorted lexically"),m},p=new Set,l=new Set,f=new Set;return un(e.episodes)?e.episodes.forEach((u,h)=>{let y=`$.episodes[${h}]`;if(!et(u)){o("episode",y,"episode must be an object");return}V("episode",u.episode_id)?(p.has(u.episode_id)&&o("dup_episode_id",`${y}.episode_id`,`duplicate episode_id ${u.episode_id}`),p.add(u.episode_id)):o("episode_id",`${y}.episode_id`,"episode_id must be ep plus six Base58 characters");for(let m of["title","synopsis"])u[m]!==void 0&&!se(u[m])&&o("field",`${y}.${m}`,`${m} must be a string`);if(_i(u.extend,`${y}.extend`,o),!un(u.scenes)){o("scenes",`${y}.scenes`,"scenes must be an array");return}u.scenes.forEach((m,w)=>{let g=`${y}.scenes[${w}]`;if(!et(m)){o("scene",g,"scene must be an object");return}V("scene",m.scene_id)?(l.has(m.scene_id)&&o("dup_scene_id",`${g}.scene_id`,`duplicate scene_id ${m.scene_id}`),l.add(m.scene_id)):o("scene_id",`${g}.scene_id`,"scene_id must be scn plus six Base58 characters"),_i(m.extend,`${g}.extend`,o),m.environment===void 0||et(m.environment)&&(!se(m.environment.time)||m.environment.time.trim()==="")?i("scene_time_missing",`${g}.environment.time`,"scene time is required for production review"):!et(m.environment)||m.environment.space!==void 0&&!se(m.environment.space)||!se(m.environment.time)?o("environment",`${g}.environment`,"environment must contain optional string space and a time string"):cr(m.environment.time)||o("scene_time",`${g}.environment.time`,"scene time must be day|night|dawn|dusk"),(m.environment===void 0||et(m.environment)&&(!se(m.environment.space)||m.environment.space.trim()===""))&&i("scene_space_missing",`${g}.environment.space`,"scene interior/exterior is required for production review"),m.location===null&&i("scene_location_missing",`${g}.location`,"scene location is required for production review"),m.location!==null&&(!et(m.location)||!V("location",m.location.location_id)?o("location",`${g}.location`,"location must be null or a typed v4 location reference"):("state_id"in m.location&&o("v3_field",`${g}.location.state_id`,"Script v4 scene references use state_ids"),r.get(m.location.location_id)!=="location"&&o("location_ref",`${g}.location.location_id`,`location ${m.location.location_id} not found`),d(m.location.location_id,m.location.state_ids,`${g}.location.state_ids`)));let _=new Map,E=(x,A,k,U)=>{if(!un(x)){o("field",U,`${U} must be an array`);return}let O=new Set;x.forEach((I,L)=>{let T=`${U}[${L}]`;if(!et(I)||!V(A,I[k])){o("ref",T,`${k} must be a typed v4 ID`);return}let C=I[k];"state_id"in I&&o("v3_field",`${T}.state_id`,"Script v4 scene references use state_ids"),O.has(C)&&o("dup_asset_ref",`${T}.${k}`,`duplicate ${A} ref ${C}`),O.add(C),r.get(C)!==A&&o("asset_ref",`${T}.${k}`,`${A} ${C} not found`);let R=d(C,I.state_ids,`${T}.state_ids`);A==="actor"&&_.set(C,new Set(R))})};if(E(m.actors,"actor","actor_id",`${g}.actors`),E(m.props,"prop","prop_id",`${g}.props`),!un(m.actions)){o("actions",`${g}.actions`,"actions must be an array");return}m.actions.forEach((x,A)=>{let k=`${g}.actions[${A}]`;if(!et(x)){o("action",k,"action must be an object");return}if(V("action",x.action_id)?(f.has(x.action_id)&&o("dup_action_id",`${k}.action_id`,`duplicate action_id ${x.action_id}`),f.add(x.action_id)):o("action_id",`${k}.action_id`,"action_id must be ac plus six Base58 characters"),(!se(x.type)||!Rn.includes(x.type))&&o("action_type",`${k}.type`,`invalid action type ${String(x.type)}`),se(x.content)||o("content",`${k}.content`,"content must be a string"),"emotion"in x&&o("v3_field",`${k}.emotion`,"Script v4 does not allow emotion"),_i(x.extend,`${k}.extend`,o),x.type==="dialogue"||x.type==="inner_thought")if(x.parenthetical!==void 0&&!se(x.parenthetical)&&o("parenthetical",`${k}.parenthetical`,"parenthetical must be a string"),!et(x.speaker))o("speaker",`${k}.speaker`,"dialogue/inner_thought requires a speaker");else if(se(x.speaker.actor_id)){("kind"in x.speaker||"label"in x.speaker)&&o("speaker_shape",`${k}.speaker`,"actor speaker cannot contain non-actor speaker fields");let O=x.speaker.actor_id;(!V("actor",O)||r.get(O)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${O} not found`);let I=_.get(O),L=s.get(O),T=se(x.speaker.state_id)&&L?.has(x.speaker.state_id)?x.speaker.state_id:void 0,C=L?.has("default")?"default":L?.values().next().value,R=T?[T]:C?[C]:[],j=V("scene",m.scene_id)&&V("actor",O)&&R.length>0?`scriptctl scene-ref ${m.scene_id} ${O} ${R.map(W=>`--state ${W}`).join(" ")} -p "$SCRIPT"`:void 0;if(I||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${O} is not referenced by this scene`,j),x.speaker.state_id!==void 0&&(!se(x.speaker.state_id)||!I?.has(x.speaker.state_id))){let W=T?[...new Set([...I??[],T])].sort():[],ve=V("scene",m.scene_id)&&V("actor",O)&&W.length>0?`scriptctl scene-ref ${m.scene_id} ${O} ${W.map(K=>`--state ${K}`).join(" ")} -p "$SCRIPT"`:j;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(x.speaker.state_id)} is not in this scene's actor state_ids`,ve)}}else se(x.speaker.kind)?(("actor_id"in x.speaker||"state_id"in x.speaker)&&o("speaker_shape",`${k}.speaker`,"non-actor speaker cannot contain actor speaker fields"),Mn.includes(x.speaker.kind)||o("speaker_kind",`${k}.speaker.kind`,"invalid non-actor speaker kind"),x.speaker.label!==void 0&&!se(x.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 x&&o("parenthetical_type",`${k}.parenthetical`,"parenthetical only belongs to speaking actions"),"speaker"in x&&o("speaker_type",`${k}.speaker`,"speaker only belongs to speaking actions");if(x.transition_prompt!==void 0){let O=x.transition_prompt;!et(O)||!se(O.target)||!se(O.process)||O.process===""||!se(O.contrast)||O.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(O.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${O.target} not found`)}}),gs(m.actions,`${g}.actions`,o)})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}function To(e,t=new Set,n){try{return n?dr(e,t,n):dr(e,t)}catch(o){throw o?.code!==pc?o:new S(`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 xe(e,t=[]){throw new S(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 Un(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Y(e,t=""){return String(e??"").replace(/\s+/gu," ").trim()||t}function ew(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&xe(`${t} must be a positive integer.`,[e]),n}function tw(e){return e===void 0?{}:(Un(e)||xe("Action extensions must be an object."),structuredClone(e))}function nw(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 no(e,t,n){for(let o=0;o<128;o+=1){let i=jl.createHash("sha256").update(`${e}:${t}:${o}`).digest(),r="";for(let c=0;c<6;c+=1)r+=yi[i[c]%yi.length];let s=`${wi[e]}${r}`;if(!n.has(s))return n.add(s),s}xe(`Could not allocate a stable ${e} ID.`)}function ow(e){let t=Y(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 iw(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function rw(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function sw(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(ow(n.extend?.timestamp)??t)+rw(n);return t}function zl(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(Un))&&xe("Asset variants must be an array of readable objects."),e)}function aw(e,t){let n=e.assets;if(n===void 0)return[];Un(n)||xe("assets must be an object.");let o=n[t];return o===void 0?[]:((!Array.isArray(o)||!o.every(Un))&&xe(`assets.${t} must be an array.`),o)}function cw(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function dw(e,t){return e[t]}function pw(e,t){return[cw(e,t),...t.aliases??[]].map(ct)}function Hl(e,t,n){let o=ct(n);return aw(e,t).find(i=>[i.name,...Array.isArray(i.aliases)?i.aliases:[]].map(r=>ct(Y(r))).includes(o))??null}function Ql(e,t){if(!e)return null;let n=ct(t);return zl(e.variants).find(o=>{let i=ct(Y(o.name));return i===n||["default","\u9ED8\u8BA4"].includes(n)&&["default","\u9ED8\u8BA4"].includes(i)})??null}function Fl(e,t,n){let o=Ql(e,n),i=Y(o?.description);return(!o||!i)&&xe(`${t}/${n} is a new variant and requires a readable assets declaration with a self-contained description.`),o}function lw(e,t){let n=Y(t?.name);return n&&!["default","\u9ED8\u8BA4"].includes(ct(n))?n:e==="actors"?"\u57FA\u7840\u9020\u578B":e==="locations"?"\u5E38\u89C4\u5E03\u7F6E":"\u57FA\u7840\u5916\u89C2"}function uw(e,t,n,o,i,r){let s=Hl(t,n,o);s||xe(`${o} is not an existing ${n} asset and has no readable declaration.`);let c=Y(s.name,o),a=zl(s.variants),d=Ql(s,"\u9ED8\u8BA4")??a[0]??null;n==="actors"&&!Y(s.description)&&xe(`${c} requires an identity description separate from its appearance variants.`),n==="actors"&&!Y(d?.description)&&xe(`${c} requires its first variant to provide a self-contained base appearance description.`);let p=[{state_id:"default",state_name:lw(n,d),description:Y(d?.description,Y(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let h=Y(u.name);if(u===d||!h||["default","\u9ED8\u8BA4"].includes(ct(h)))continue;let y=no("state",`${n}:${c}:${h}`,i);p.push({state_id:y,state_name:h,description:Y(Fl(s,c,h).description)}),r.states.push(`${c}/${h}`)}let l={aliases:Array.isArray(s.aliases)?[...new Set(s.aliases.map(u=>Y(u)).filter(u=>u&&u!==c))]:[],importance:s.importance==="background"?"background":"featured",description:Y(s.description,`${c}\u7684\u57FA\u7840\u8BBE\u5B9A\u3002`),states:p};if(n==="actors"){let u={...l,actor_id:no("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:no("location",c,i),location_name:c};return e.locations.push(u),r.locations.push(c),u}let f={...l,prop_id:no("prop",c,i),prop_name:c};return e.props.push(f),r.props.push(c),f}function ys(e,t,n,o,i,r){let s=Y(o);s||xe(`${n} reference requires a readable name.`);let c=ct(s);return dw(e,n).find(d=>pw(n,d).includes(c))??uw(e,t,n,s,i,r)}function pr(e,t,n,o,i,r){let s=Y(t,"\u9ED8\u8BA4"),c=ct(s),a=e.states.find(u=>ct(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=Hl(n,o,d),l=Fl(p,d,s),f={state_id:no("state",`${d}:${s}`,i),state_name:s,description:Y(l.description)};return e.states.push(f),r.states.push(`${d}/${s}`),f.state_id}function Kl(e,t){return e===void 0?[]:((!Array.isArray(e)||!e.every(Un))&&xe(`${t} must be an array of readable references.`),e)}function hs(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 fw(e,t){return!!(e&&e.location?.location_id&&t.location?.location_id&&e.location.location_id===t.location.location_id&&Y(e.environment?.space)===Y(t.environment?.space)&&Y(e.environment?.time)===Y(t.environment?.time))}function mw(e,t,n,o,i,r,s,c){(!Array.isArray(e)||e.length===0||!e.every(Un))&&xe("scene.actions must contain at least one readable Action.");let a=structuredClone(o),d=r;return{actions:e.map((l,f)=>{let u=Y(l.type,"action");["action","transition","dialogue","inner_thought"].includes(u)||xe(`Action ${f+1} has an unsupported type.`,[u]);let h=Y(l.content);h||xe(`Action ${f+1} has empty content.`);let y=Math.max(400,Math.min(8e3,Math.round(Number(l.durationMs)||Number(l.weight||1)*1200))),m=tw(l.extensions);m.timestamp=iw(d),m.duration_ms=y,m.rewrite_duration_ms!==void 0&&(m.rewrite_duration_ms=y);let w={action_id:no("action",`${i}:${f+1}:${h}`,s),type:u,content:h,extend:m};if(d+=y,u==="action"||u==="transition")return w;let g=Y(l.speaker);g||xe(`Action ${f+1} requires a speaker.`);let _=g.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${_}\\s*[:\uFF1A]`,"iu").test(h)&&xe(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(h)&&xe(`Action ${f+1} wraps dialogue content in quotation marks.`);let E=ct(g);if(["\u65C1\u767D","narrator"].includes(E))return{...w,speaker:{kind:"broadcast",label:"\u65C1\u767D"},...Y(l.parenthetical)?{parenthetical:Y(l.parenthetical)}:{}};if(["\u753B\u5916\u97F3","offscreen"].includes(E))return{...w,speaker:{kind:"offscreen",label:"\u753B\u5916\u97F3"},...Y(l.parenthetical)?{parenthetical:Y(l.parenthetical)}:{}};let x=ys(t,n,"actors",g,s,c),A=Y(l.speakerVariant),k=a.find(O=>O.actor_id===x.actor_id),U;if(A)U=pr(x,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,U])].sort():a.push({actor_id:x.actor_id,state_ids:[U]});else if(!k){let O=pr(x,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:x.actor_id,state_ids:[O]})}return{...w,speaker:{actor_id:x.actor_id,...U?{state_id:U}:{}},...Y(l.parenthetical)?{parenthetical:Y(l.parenthetical)}:{}}}),actorRefs:a}}function Yl(e,t){(!Un(t)||t.version!==1)&&xe("Creative draft version must be 1."),(!Un(t.episode)||!Un(t.scene))&&xe("Creative draft requires episode and scene objects.");let n=structuredClone(t),o=n.episode,i=n.scene,r=structuredClone(e),s=nw(r),c={actors:[],locations:[],props:[],states:[]},a=ew(o.number,"episode.number");a>r.episodes.length+1&&xe("Episodes must be composed in order.",[a]);let d=r.episodes[a-1];d?(Y(d.title)||(d.title=Y(o.title,`\u7B2C ${a} \u96C6`)),Y(d.synopsis)||(d.synopsis=Y(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`))):(d={episode_id:no("episode",`episode:${a}`,s),title:Y(o.title,`\u7B2C ${a} \u96C6`),synopsis:Y(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`),scenes:[]},r.episodes.push(d));let p=ys(r,n,"locations",i.location,s,c),l=pr(p,i.locationVariant,n,"locations",s,c),f=Kl(i.actors,"scene.actors").map(I=>{let L=ys(r,n,"actors",I.name,s,c);return{actor_id:L.actor_id,state_ids:[pr(L,I.variant,n,"actors",s,c)]}}),u=hs([],f,I=>I.actor_id),h=Kl(i.props,"scene.props").map(I=>{let L=ys(r,n,"props",I.name,s,c);return{prop_id:L.prop_id,state_ids:[pr(L,I.variant,n,"props",s,c)]}}),y=hs([],h,I=>I.prop_id),m=d.scenes.at(-1),w={scene_id:no("scene",`episode:${a}:scene:${d.scenes.length+1}:${Y(i.title)}`,s),environment:{space:Y(i.space,"interior"),time:Y(i.time,"day")},location:{location_id:p.location_id,state_ids:[l]},actors:u,props:y,actions:[],extend:{scene_title:Y(i.title,`\u7B2C ${d.scenes.length+1} \u573A`)}},g=Y(i.boundary,"auto");["auto","new","continue"].includes(g)||xe("scene.boundary must be auto, new, or continue.");let _=fw(m,w);g==="continue"&&!_&&xe("scene.boundary=continue requires the same location, space, and time as the previous scene.");let E=g!=="new"&&_,x=E&&m?m:w,A=E?d.scenes.length:d.scenes.length+1,k=hs(x.actors,w.actors,I=>I.actor_id),U=mw(i.actions,r,n,k,x.scene_id,sw(d),s,c);x.actors=U.actorRefs,x.props=hs(x.props,w.props,I=>I.prop_id),x.location&&w.location&&(x.location.state_ids=[...new Set([...x.location.state_ids,...w.location.state_ids])].sort()),x.actions.push(...U.actions),E||d.scenes.push(x);let O=Le(r);return O.ok||xe("Composed screenplay does not pass Script v4 validation.",O.errors.slice(0,12).map(I=>`${I.path}: ${I.message}`)),{script:r,validation:O,episodeNumber:a,sceneNumber:A,sceneId:x.scene_id,actionIds:U.actions.map(I=>I.action_id),joinedPreviousScene:E,created:c}}function je(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function fn(e,t){return e[t]===void 0||typeof e[t]=="string"}function uc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(uc):je(e)&&Object.values(e).every(uc)}function xi(e){return e.extend===void 0||je(e.extend)&&Object.values(e.extend).every(uc)}function fc(e){return e==="default"||V("state",e)}function gw(e){return je(e)&&fc(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&xi(e)}function mc(e){return typeof e.importance=="string"&&Mt.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(gw)&&xi(e)}function hw(e){return je(e)&&V("actor",e.actor_id)&&typeof e.actor_name=="string"&&(e.role_type===void 0||typeof e.role_type=="string"&&eo.has(e.role_type))&&mc(e)}function yw(e){return je(e)&&V("location",e.location_id)&&typeof e.location_name=="string"&&mc(e)}function ww(e){return je(e)&&V("prop",e.prop_id)&&typeof e.prop_name=="string"&&mc(e)}function gc(e){return Array.isArray(e)&&e.every(fc)}function _w(e){return je(e)&&V("actor",e.actor_id)&&gc(e.state_ids)}function xw(e){return je(e)&&V("location",e.location_id)&&gc(e.state_ids)}function Ew(e){return je(e)&&V("prop",e.prop_id)&&gc(e.state_ids)}function Sw(e){return V("actor",e.actor_id)&&(e.state_id===void 0||fc(e.state_id))}function Iw(e){return typeof e.kind=="string"&&Po.has(e.kind)&&fn(e,"label")}function Aw(e){return!(!je(e)||!V("action",e.action_id)||typeof e.type!="string"||!zt.has(e.type)||typeof e.content!="string"||!fn(e,"parenthetical")||!xi(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!je(e.speaker)||!Sw(e.speaker)&&!Iw(e.speaker))||e.transition_prompt!==void 0&&(!je(e.transition_prompt)||!V("actor",e.transition_prompt.target)&&!V("location",e.transition_prompt.target)&&!V("prop",e.transition_prompt.target)||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string"))}function kw(e){return!(!je(e)||!V("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(_w)||!Array.isArray(e.props)||!e.props.every(Ew)||!Array.isArray(e.actions)||!e.actions.every(Aw)||!xi(e)||e.location!==null&&!xw(e.location)||e.environment!==void 0&&(!je(e.environment)||!fn(e.environment,"space")||!fn(e.environment,"time")))}function bw(e){return je(e)&&V("episode",e.episode_id)&&fn(e,"title")&&fn(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(kw)&&xi(e)}function Ow(e){return je(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&fn(e,"worldview_raw")&&fn(e,"synopsis")&&fn(e,"logline")&&fn(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(hw)&&Array.isArray(e.locations)&&e.locations.every(yw)&&Array.isArray(e.props)&&e.props.every(ww)&&Array.isArray(e.episodes)&&e.episodes.every(bw)&&xi(e)}function Ei(e){let t=Le(e);if(t.ok)return e;throw new S("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 mn(e){if(Ow(e))return e;throw new S("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 lr from"node:crypto";import*as Te from"node:fs";import*as Lt from"node:path";import vw from"proper-lockfile";function yc(e){if(Array.isArray(e))return e.map(yc);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=yc(t[o]);return n}return e}function De(e){let t=JSON.stringify(yc(e));return`sha256:${lr.createHash("sha256").update(t).digest("hex")}`}function ur(e){return Te.existsSync(e)?`sha256:${lr.createHash("sha256").update(Te.readFileSync(e)).digest("hex")}`:null}function fr(e,t){let n=ur(e);if(n!==t)throw new S("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 mr(e){let t=Lt.resolve(e),n=Lt.join(Lt.dirname(t),".scriptctl"),o=Lt.basename(t);return{scriptPath:t,stateDir:n,metadataPath:Lt.join(n,`${o}.working-copy.json`),lockPath:Lt.join(n,o)}}async function ws(e,t){let n=mr(e);Te.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await vw.lock(n.lockPath,{realpath:!1,stale:12e4,update:1e4,retries:{retries:60,factor:1,minTimeout:500,maxTimeout:500}})}catch(i){throw new S("Timed out waiting for the script file lock.",{exitCode:me,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 ze(e,t){_s(e,`${JSON.stringify(t,null,2)}
|
|
123
|
-
`)}function
|
|
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}},J]}import*as
|
|
122
|
+
`,S=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 Hy(e){return new fs(e)}function Pl(e){return Hy(e).directDir}function ke(e){let t=e.script_path??e.scriptPath;return sr.resolve(typeof t=="string"&&t.length>0?t:zy)}function ar(e){return ms.readJson(e)}function oc(e,t){ms.writeJson(e,t)}function Co(e){return ms.exists(e)}function ye(e){return nc.createHash("sha256").update(e,"utf-8").digest("hex")}function ic(e){let t=nc.createHash("sha256"),n=hi.openSync(e,"r");try{let o=Buffer.alloc(1048576);for(;;){let i=hi.readSync(n,o,0,o.length,null);if(i<=0)break;t.update(o.subarray(0,i))}}finally{hi.closeSync(n)}return t.digest("hex")}var bt={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 Ot(e,t){return typeof e=="string"&&t.some(n=>n===e)}function Tl(e,t){switch(e){case"policy":return Ot(t,bt.policy)?{failure_type:e,failure_code:t}:null;case"network":return Ot(t,bt.network)?{failure_type:e,failure_code:t}:null;case"timeout":return Ot(t,bt.timeout)?{failure_type:e,failure_code:t}:null;case"rate_limit":return Ot(t,bt.rate_limit)?{failure_type:e,failure_code:t}:null;case"authentication":return Ot(t,bt.authentication)?{failure_type:e,failure_code:t}:null;case"authorization":return Ot(t,bt.authorization)?{failure_type:e,failure_code:t}:null;case"provider":return Ot(t,bt.provider)?{failure_type:e,failure_code:t}:null;case"media":return Ot(t,bt.media)?{failure_type:e,failure_code:t}:null;case"response":return Ot(t,bt.response)?{failure_type:e,failure_code:t}:null;case"pipeline":return Ot(t,bt.pipeline)?{failure_type:e,failure_code:t}:null;case"validation":return Ot(t,bt.validation)?{failure_type:e,failure_code:t}:null;case"cancelled":return Ot(t,bt.cancelled)?{failure_type:e,failure_code:t}:null;case"unknown":return Ot(t,bt.unknown)?{failure_type:e,failure_code:t}:null;default:return null}}function vt(e,t){return{...e,...t}}function yi(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 cr(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 Vl(e,t){if(e.length===0)return vt({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)?yi(n):{failure_type:"provider",failure_code:"attempts_exhausted"};return vt(i,{retryable:e.some(r=>r.retryable),message:t})}function pn(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 Wl from"node:crypto";import*as Xl from"node:fs";import*as eu from"node:path";import*as zl from"node:crypto";var Rn=["action","dialogue","inner_thought","transition"],jt=new Set(Rn),Mn=["system","broadcast","offscreen","group"],Po=new Set(Mn),Ln=["featured","background"],Rt=new Set(Ln),wi=["\u4E3B\u89D2","\u914D\u89D2"],eo=new Set(wi),gs=["day","night","dawn","dusk"],rc=new Set(gs);function dr(e){return typeof e=="string"&&rc.has(e)}var sc=["interior","exterior"],$l=new Set(sc);function st(e){return e.normalize("NFKC").toLowerCase()}function Dl(e){return JSON.stringify([e.code,e.path,e.message])}function ac(e){let t=new Map;for(let n of e){let o=Dl(n);t.set(o,(t.get(o)??0)+1)}return t}function cc(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=ac(e.errors),o=ac(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function dc(e,t){let n=ac(e),o=[];for(let i of t){let r=Dl(i),s=n.get(r)??0;s>0?n.set(r,s-1):o.push(i)}return o}import{customAlphabet as Qy}from"nanoid";var _i="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",pc=6,xi={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},Fy=Qy(_i,pc),Yy=`[${_i}]`,Gl=Object.fromEntries(Object.entries(xi).map(([e,t])=>[e,new RegExp(`^${t}${Yy}{${pc}}$`)]));function V(e,t){return typeof t=="string"&&Gl[e].test(t)}var lc="ID_SPACE_EXHAUSTED";function pr(e,t=new Set,n=Fy){let o=xi[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:lc})}var We=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},qy=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,Zy=/^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;function Jl(e){return e?Number(e.padEnd(3,"0")):0}function Bl(e,t){if(!Number.isSafeInteger(t))throw new We(e,"Timestamp exceeds the supported numeric range.");return t}function Kl(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 to(e){let t=e.trim();if(!t)throw new We(e,"Timestamp must not be empty.");let n=t.match(Zy);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new We(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new We(e,"Timestamp seconds must be between 00 and 59.");let f=Bl(e,((a*60+d)*60+p)*1e3+Jl(l));return{canonical:Kl(f,l),milliseconds:f,fractionDigits:l?.length??0}}let o=t.match(qy);if(!o)throw new We(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 We(e,"Timestamp seconds must be between 00 and 59.");let c=Bl(e,(i*60+r)*1e3+Jl(s));return{canonical:Kl(c,s),milliseconds:c,fractionDigits:s?.length??0}}function Wy(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 hs(e,t,n){let o=null;e.forEach((i,r)=>{let s=Wy(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=to(s)}catch(d){if(!(d instanceof We))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 ft=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Nn=e=>Array.isArray(e),xe=e=>typeof e=="string",Xy=["state_changes","actor_id","speakers","lines"];function mt(e){let t=[],n=[],o=(u,h,y,m)=>t.push({code:u,path:h,message:y,...m?{repair_hint:m}:{}}),i=(u,h,y)=>n.push({code:u,path:h,message:y});if(!ft(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"])xe(e[u])||o("field",`$.${u}`,`${u} must be a string`);let r=new Map,s=new Map,c=new Map,a=(u,h,y,m,w)=>{if(!Nn(u)){o("field",w,`${w} must be an array`);return}u.forEach((g,_)=>{let E=`${w}[${_}]`;if(!ft(g)){o("asset",E,"asset must be an object");return}let x=g[y];if(!xe(x)){o("asset_id",`${E}.${y}`,`${y} required`);return}if(s.has(x)&&o("dup_id",`${E}.${y}`,`duplicate id ${x}`),s.set(x,h),!xe(g[m]))o("asset_name",`${E}.${m}`,`${m} required`);else if(h==="actor"){let O=st(g[m]),I=c.get(O);I!==void 0?o("dup_actor_name",`${E}.${m}`,`actor name ${g[m]} already belongs to ${I}`):c.set(O,x)}(!xe(g.importance)||!Ln.includes(g.importance))&&o("importance",`${E}.importance`,`importance must be one of ${Ln.join("|")}`),xe(g.description)||o("asset_desc",`${E}.description`,"description must be a string");let A=new Set,k=new Set,U=0;!Nn(g.states)||g.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):g.states.forEach((O,I)=>{let M=`${E}.states[${I}]`;if(!ft(O)||!xe(O.state_id)){o("state_id",M,"state_id required");return}A.has(O.state_id)&&o("dup_state",M,`duplicate state_id ${O.state_id}`),A.add(O.state_id),O.state_id==="default"&&U++,xe(O.state_name)?(k.has(O.state_name)&&o("dup_state_name",`${M}.state_name`,`duplicate state_name ${O.state_name}`),k.add(O.state_name)):o("state_name",`${M}.state_name`,"state_name required")}),Nn(g.states)&&U!==1&&o("default_state",`${E}.states`,`exactly one 'default' state required, found ${U}`),r.set(x,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,h,y,m)=>{if(s.get(u)!==y){o("ref",m,`${y} ${u} not found`);return}h!==void 0&&(!xe(h)||!r.get(u)?.has(h))&&o("state_ref",m,`state ${String(h)} not materialized on ${u}`)},p=(u,h,y,m)=>{if(u===void 0){o("field",m,`${m} required (may be empty array)`);return}if(!Nn(u)){o("field",m,`${m} must be an array`);return}u.forEach((w,g)=>{if(!ft(w)||!xe(w[y])){o("ref",`${m}[${g}]`,`${y} required`);return}d(w[y],w.state_id,h,`${m}[${g}]`)})},l=(u,h,y,m)=>{if(!ft(u)){o("action",h,"action must be an object");return}for(let g of Xy)g in u&&o("legacy_field",`${h}.${g}`,`v3 forbids action.${g}`);let w=u.type;if((!xe(w)||!Rn.includes(w))&&o("action_type",`${h}.type`,`invalid action type ${String(w)}`),xe(u.content)||o("content",`${h}.content`,"content must be a plain-text string"),w==="dialogue"||w==="inner_thought"){let g=u.speaker;if(!ft(g))o("speaker",`${h}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in g)(!xe(g.kind)||!Mn.includes(g.kind))&&o("speaker_kind",`${h}.speaker.kind`,"invalid non-actor speaker kind");else if(xe(g.actor_id)){if(d(g.actor_id,g.state_id,"actor",`${h}.speaker`),!y.has(g.actor_id)){let _=r.get(g.actor_id),E=xe(g.state_id)&&_?.has(g.state_id)?g.state_id:_?.has("default")?"default":_?.values().next().value,x=m&&E?`scriptctl scene-ref ${m} actor:${g.actor_id} --state ${E} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${h}.speaker.actor_id`,`actor ${g.actor_id} is not referenced by this scene`,x)}}else o("speaker",`${h}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return Nn(f)?f.forEach((u,h)=>{let y=`$.episodes[${h}]`;if(!ft(u)||!xe(u.episode_id)){o("episode_id",y,"episode_id required");return}if(!Nn(u.scenes)){o("scenes",`${y}.scenes`,"scenes must be an array");return}u.scenes.forEach((m,w)=>{let g=`${y}.scenes[${w}]`;if(!ft(m)){o("scene",g,"scene must be an object");return}"context"in m&&o("legacy_field",`${g}.context`,"v3 forbids scene.context"),xe(m.scene_id)||o("scene_id",g,"scene_id required");let _=m.environment;_===void 0||ft(_)&&(!xe(_.time)||_.time.trim()==="")?i("scene_time_missing",`${g}.environment.time`,"scene time is required for production review"):!ft(_)||_.space!==void 0&&!xe(_.space)||!xe(_.time)?o("environment",`${g}.environment`,"environment must contain optional string space and a time string"):dr(_.time)||o("scene_time",`${g}.environment.time`,"scene time must be day|night|dawn|dusk"),(m.environment===void 0||ft(m.environment)&&(!xe(m.environment.space)||m.environment.space.trim()===""))&&i("scene_space_missing",`${g}.environment.space`,"scene interior/exterior is required for production review"),m.location===null&&i("scene_location_missing",`${g}.location`,"scene location is required for production review");let E=m.location;if(E!==null&&(!ft(E)||!xe(E.location_id)?o("location",`${g}.location`,"location must be null or {location_id}"):d(E.location_id,E.state_id,"location",`${g}.location`)),p(m.actors,"actor","actor_id",`${g}.actors`),p(m.props,"prop","prop_id",`${g}.props`),Nn(m.props)){let A=new Set;m.props.forEach((k,U)=>{!ft(k)||!xe(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${g}.props[${U}]`,`duplicate prop ref ${k.prop_id}`),A.add(k.prop_id))})}let x=new Set(Nn(m.actors)?m.actors.filter(A=>ft(A)).map(A=>A.actor_id).filter(A=>xe(A)):[]);if(!Nn(m.actions))o("actions",`${g}.actions`,"actions must be an array");else{let A=xe(m.scene_id)?`${u.episode_id}/${m.scene_id}`:void 0;m.actions.forEach((k,U)=>l(k,`${g}.actions[${U}]`,x,A)),hs(m.actions,`${g}.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),se=e=>typeof e=="string",ln=e=>Array.isArray(e);function uc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(uc):Xe(e)&&Object.values(e).every(uc)}function Ei(e,t,n){e!==void 0&&(!Xe(e)||!Object.values(e).every(uc))&&n("extend",t,"extend must be an object containing JSON values")}function ew(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Me(e){let t=[],n=[],o=(u,h,y,m)=>t.push({code:u,path:h,message:y,...m?{repair_hint:m}:{}}),i=(u,h,y,m)=>n.push({code:u,path:h,message:y,...m?{repair_hint:m}:{}});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"])se(e[u])||o("field",`$.${u}`,`${u} must be a string`);for(let u of["worldview_raw","synopsis","logline","theme"])e[u]!==void 0&&!se(e[u])&&o("field",`$.${u}`,`${u} must be a string`);e.main_characters!==void 0&&(!ln(e.main_characters)||!e.main_characters.every(u=>Xe(u)&&se(u.name)&&se(u.role)))&&o("main_characters","$.main_characters","main_characters must contain {name, role} string records"),Ei(e.extend,"$.extend",o);let r=new Map,s=new Map,c=new Set,a=(u,h,y,m,w)=>{if(!ln(u)){o("field",w,`${w} must be an array`);return}let g=new Set;u.forEach((_,E)=>{let x=`${w}[${E}]`;if(!Xe(_)){o("asset",x,"asset must be an object");return}let A=_[y];if(!V(h,A)){o("asset_id",`${x}.${y}`,`${y} must be ${h} ID`);return}if(g.has(A)&&o("dup_id",`${x}.${y}`,`duplicate ${y} ${A}`),g.add(A),r.set(A,h),!se(_[m])||_[m].trim()==="")o("asset_name",`${x}.${m}`,`${m} must be a non-empty string`);else if(h==="actor"){let I=_[m].trim().toLocaleLowerCase();c.has(I)&&o("dup_actor_name",`${x}.${m}`,`duplicate actor name ${_[m]}`),c.add(I)}if((!se(_.importance)||!Ln.includes(_.importance))&&o("importance",`${x}.importance`,`importance must be ${Ln.join("|")}`),h==="actor"&&_.role_type!==void 0&&(!se(_.role_type)||!wi.includes(_.role_type))&&o("role_type",`${x}.role_type`,`role_type must be ${wi.join("|")}`),se(_.description)||o("asset_desc",`${x}.description`,"description must be a string"),_.aliases!==void 0&&(!ln(_.aliases)||!_.aliases.every(se)))o("aliases",`${x}.aliases`,"aliases must be an array of strings");else if(ln(_.aliases)&&_.aliases.every(se)){let I=new Set,M=se(_[m])?_[m]:"";_.aliases.forEach((T,P)=>{T===""&&o("alias_empty",`${x}.aliases[${P}]`,"alias must not be empty"),T===M&&o("alias_equals_name",`${x}.aliases[${P}]`,"alias must differ from the asset name"),I.has(T)&&o("dup_alias",`${x}.aliases[${P}]`,`duplicate alias ${T}`),I.add(T)})}Ei(_.extend,`${x}.extend`,o);let k=new Set,U=new Set,O=0;!ln(_.states)||_.states.length===0?o("states",`${x}.states`,"states must be a non-empty array"):_.states.forEach((I,M)=>{let T=`${x}.states[${M}]`;if(!Xe(I)){o("state",T,"state must be an object");return}let P=I.state_id;if(P!=="default"&&!V("state",P)){o("state_id",`${T}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(P)&&o("dup_state",`${T}.state_id`,`duplicate state_id ${P}`),k.add(P),P==="default"&&O++,!se(I.state_name)||I.state_name.trim()===""?o("state_name",`${T}.state_name`,"state_name must be a non-empty string"):(U.has(I.state_name)&&o("dup_state_name",`${T}.state_name`,`duplicate state_name ${I.state_name}`),U.add(I.state_name)),se(I.description)||o("state_description",`${T}.description`,"description must be a string"),Ei(I.extend,`${T}.extend`,o)}),O!==1&&o("default_state",`${x}.states`,`exactly one default state required, found ${O}`),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,h,y)=>{if(!ln(h)||h.length===0||!h.every(se))return o("state_ids",y,"state_ids must be a non-empty array of strings"),[];let m=h,w=new Set;return m.forEach((g,_)=>{w.has(g)&&o("dup_state_ref",`${y}[${_}]`,`duplicate state_id ${g}`),w.add(g),s.get(u)?.has(g)||o("state_ref",`${y}[${_}]`,`state ${g} not found on ${u}`)}),ew(m)||o("state_ids_order",y,"state_ids must be sorted lexically"),m},p=new Set,l=new Set,f=new Set;return ln(e.episodes)?e.episodes.forEach((u,h)=>{let y=`$.episodes[${h}]`;if(!Xe(u)){o("episode",y,"episode must be an object");return}V("episode",u.episode_id)?(p.has(u.episode_id)&&o("dup_episode_id",`${y}.episode_id`,`duplicate episode_id ${u.episode_id}`),p.add(u.episode_id)):o("episode_id",`${y}.episode_id`,"episode_id must be ep plus six Base58 characters");for(let m of["title","synopsis"])u[m]!==void 0&&!se(u[m])&&o("field",`${y}.${m}`,`${m} must be a string`);if(Ei(u.extend,`${y}.extend`,o),!ln(u.scenes)){o("scenes",`${y}.scenes`,"scenes must be an array");return}u.scenes.forEach((m,w)=>{let g=`${y}.scenes[${w}]`;if(!Xe(m)){o("scene",g,"scene must be an object");return}V("scene",m.scene_id)?(l.has(m.scene_id)&&o("dup_scene_id",`${g}.scene_id`,`duplicate scene_id ${m.scene_id}`),l.add(m.scene_id)):o("scene_id",`${g}.scene_id`,"scene_id must be scn plus six Base58 characters"),Ei(m.extend,`${g}.extend`,o),m.environment===void 0||Xe(m.environment)&&(!se(m.environment.time)||m.environment.time.trim()==="")?i("scene_time_missing",`${g}.environment.time`,"scene time is required for production review"):!Xe(m.environment)||m.environment.space!==void 0&&!se(m.environment.space)||!se(m.environment.time)?o("environment",`${g}.environment`,"environment must contain optional string space and a time string"):dr(m.environment.time)||o("scene_time",`${g}.environment.time`,"scene time must be day|night|dawn|dusk"),(m.environment===void 0||Xe(m.environment)&&(!se(m.environment.space)||m.environment.space.trim()===""))&&i("scene_space_missing",`${g}.environment.space`,"scene interior/exterior is required for production review"),m.location===null&&i("scene_location_missing",`${g}.location`,"scene location is required for production review"),m.location!==null&&(!Xe(m.location)||!V("location",m.location.location_id)?o("location",`${g}.location`,"location must be null or a typed v4 location reference"):("state_id"in m.location&&o("v3_field",`${g}.location.state_id`,"Script v4 scene references use state_ids"),r.get(m.location.location_id)!=="location"&&o("location_ref",`${g}.location.location_id`,`location ${m.location.location_id} not found`),d(m.location.location_id,m.location.state_ids,`${g}.location.state_ids`)));let _=new Map,E=(x,A,k,U)=>{if(!ln(x)){o("field",U,`${U} must be an array`);return}let O=new Set;x.forEach((I,M)=>{let T=`${U}[${M}]`;if(!Xe(I)||!V(A,I[k])){o("ref",T,`${k} must be a typed v4 ID`);return}let P=I[k];"state_id"in I&&o("v3_field",`${T}.state_id`,"Script v4 scene references use state_ids"),O.has(P)&&o("dup_asset_ref",`${T}.${k}`,`duplicate ${A} ref ${P}`),O.add(P),r.get(P)!==A&&o("asset_ref",`${T}.${k}`,`${A} ${P} not found`);let R=d(P,I.state_ids,`${T}.state_ids`);A==="actor"&&_.set(P,new Set(R))})};if(E(m.actors,"actor","actor_id",`${g}.actors`),E(m.props,"prop","prop_id",`${g}.props`),!ln(m.actions)){o("actions",`${g}.actions`,"actions must be an array");return}m.actions.forEach((x,A)=>{let k=`${g}.actions[${A}]`;if(!Xe(x)){o("action",k,"action must be an object");return}if(V("action",x.action_id)?(f.has(x.action_id)&&o("dup_action_id",`${k}.action_id`,`duplicate action_id ${x.action_id}`),f.add(x.action_id)):o("action_id",`${k}.action_id`,"action_id must be ac plus six Base58 characters"),(!se(x.type)||!Rn.includes(x.type))&&o("action_type",`${k}.type`,`invalid action type ${String(x.type)}`),se(x.content)||o("content",`${k}.content`,"content must be a string"),"emotion"in x&&o("v3_field",`${k}.emotion`,"Script v4 does not allow emotion"),Ei(x.extend,`${k}.extend`,o),x.type==="dialogue"||x.type==="inner_thought")if(x.parenthetical!==void 0&&!se(x.parenthetical)&&o("parenthetical",`${k}.parenthetical`,"parenthetical must be a string"),!Xe(x.speaker))o("speaker",`${k}.speaker`,"dialogue/inner_thought requires a speaker");else if(se(x.speaker.actor_id)){("kind"in x.speaker||"label"in x.speaker)&&o("speaker_shape",`${k}.speaker`,"actor speaker cannot contain non-actor speaker fields");let O=x.speaker.actor_id;(!V("actor",O)||r.get(O)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${O} not found`);let I=_.get(O),M=s.get(O),T=se(x.speaker.state_id)&&M?.has(x.speaker.state_id)?x.speaker.state_id:void 0,P=M?.has("default")?"default":M?.values().next().value,R=T?[T]:P?[P]:[],j=V("scene",m.scene_id)&&V("actor",O)&&R.length>0?`scriptctl scene-ref ${m.scene_id} ${O} ${R.map(W=>`--state ${W}`).join(" ")} -p "$SCRIPT"`:void 0;if(I||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${O} is not referenced by this scene`,j),x.speaker.state_id!==void 0&&(!se(x.speaker.state_id)||!I?.has(x.speaker.state_id))){let W=T?[...new Set([...I??[],T])].sort():[],Pe=V("scene",m.scene_id)&&V("actor",O)&&W.length>0?`scriptctl scene-ref ${m.scene_id} ${O} ${W.map(ue=>`--state ${ue}`).join(" ")} -p "$SCRIPT"`:j;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(x.speaker.state_id)} is not in this scene's actor state_ids`,Pe)}}else se(x.speaker.kind)?(("actor_id"in x.speaker||"state_id"in x.speaker)&&o("speaker_shape",`${k}.speaker`,"non-actor speaker cannot contain actor speaker fields"),Mn.includes(x.speaker.kind)||o("speaker_kind",`${k}.speaker.kind`,"invalid non-actor speaker kind"),x.speaker.label!==void 0&&!se(x.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 x&&o("parenthetical_type",`${k}.parenthetical`,"parenthetical only belongs to speaking actions"),"speaker"in x&&o("speaker_type",`${k}.speaker`,"speaker only belongs to speaking actions");if(x.transition_prompt!==void 0){let O=x.transition_prompt;!Xe(O)||!se(O.target)||!se(O.process)||O.process===""||!se(O.contrast)||O.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(O.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${O.target} not found`)}}),hs(m.actions,`${g}.actions`,o)})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}function To(e,t=new Set,n){try{return n?pr(e,t,n):pr(e,t)}catch(o){throw o?.code!==lc?o:new S(`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 Ee(e,t=[]){throw new S(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 Un(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Y(e,t=""){return String(e??"").replace(/\s+/gu," ").trim()||t}function tw(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&Ee(`${t} must be a positive integer.`,[e]),n}function nw(e){return e===void 0?{}:(Un(e)||Ee("Action extensions must be an object."),structuredClone(e))}function ow(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 no(e,t,n){for(let o=0;o<128;o+=1){let i=zl.createHash("sha256").update(`${e}:${t}:${o}`).digest(),r="";for(let c=0;c<6;c+=1)r+=_i[i[c]%_i.length];let s=`${xi[e]}${r}`;if(!n.has(s))return n.add(s),s}Ee(`Could not allocate a stable ${e} ID.`)}function iw(e){let t=Y(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 rw(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function sw(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function aw(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(iw(n.extend?.timestamp)??t)+sw(n);return t}function Hl(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(Un))&&Ee("Asset variants must be an array of readable objects."),e)}function cw(e,t){let n=e.assets;if(n===void 0)return[];Un(n)||Ee("assets must be an object.");let o=n[t];return o===void 0?[]:((!Array.isArray(o)||!o.every(Un))&&Ee(`assets.${t} must be an array.`),o)}function dw(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function pw(e,t){return e[t]}function lw(e,t){return[dw(e,t),...t.aliases??[]].map(st)}function Ql(e,t,n){let o=st(n);return cw(e,t).find(i=>[i.name,...Array.isArray(i.aliases)?i.aliases:[]].map(r=>st(Y(r))).includes(o))??null}function Fl(e,t){if(!e)return null;let n=st(t);return Hl(e.variants).find(o=>{let i=st(Y(o.name));return i===n||["default","\u9ED8\u8BA4"].includes(n)&&["default","\u9ED8\u8BA4"].includes(i)})??null}function Yl(e,t,n){let o=Fl(e,n),i=Y(o?.description);return(!o||!i)&&Ee(`${t}/${n} is a new variant and requires a readable assets declaration with a self-contained description.`),o}function uw(e,t){let n=Y(t?.name);return n&&!["default","\u9ED8\u8BA4"].includes(st(n))?n:e==="actors"?"\u57FA\u7840\u9020\u578B":e==="locations"?"\u5E38\u89C4\u5E03\u7F6E":"\u57FA\u7840\u5916\u89C2"}function fw(e,t,n,o,i,r){let s=Ql(t,n,o);s||Ee(`${o} is not an existing ${n} asset and has no readable declaration.`);let c=Y(s.name,o),a=Hl(s.variants),d=Fl(s,"\u9ED8\u8BA4")??a[0]??null;n==="actors"&&!Y(s.description)&&Ee(`${c} requires an identity description separate from its appearance variants.`),n==="actors"&&!Y(d?.description)&&Ee(`${c} requires its first variant to provide a self-contained base appearance description.`);let p=[{state_id:"default",state_name:uw(n,d),description:Y(d?.description,Y(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let h=Y(u.name);if(u===d||!h||["default","\u9ED8\u8BA4"].includes(st(h)))continue;let y=no("state",`${n}:${c}:${h}`,i);p.push({state_id:y,state_name:h,description:Y(Yl(s,c,h).description)}),r.states.push(`${c}/${h}`)}let l={aliases:Array.isArray(s.aliases)?[...new Set(s.aliases.map(u=>Y(u)).filter(u=>u&&u!==c))]:[],importance:s.importance==="background"?"background":"featured",description:Y(s.description,`${c}\u7684\u57FA\u7840\u8BBE\u5B9A\u3002`),states:p};if(n==="actors"){let u={...l,actor_id:no("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:no("location",c,i),location_name:c};return e.locations.push(u),r.locations.push(c),u}let f={...l,prop_id:no("prop",c,i),prop_name:c};return e.props.push(f),r.props.push(c),f}function ws(e,t,n,o,i,r){let s=Y(o);s||Ee(`${n} reference requires a readable name.`);let c=st(s);return pw(e,n).find(d=>lw(n,d).includes(c))??fw(e,t,n,s,i,r)}function lr(e,t,n,o,i,r){let s=Y(t,"\u9ED8\u8BA4"),c=st(s),a=e.states.find(u=>st(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=Ql(n,o,d),l=Yl(p,d,s),f={state_id:no("state",`${d}:${s}`,i),state_name:s,description:Y(l.description)};return e.states.push(f),r.states.push(`${d}/${s}`),f.state_id}function jl(e,t){return e===void 0?[]:((!Array.isArray(e)||!e.every(Un))&&Ee(`${t} must be an array of readable references.`),e)}function ys(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 mw(e,t){return!!(e&&e.location?.location_id&&t.location?.location_id&&e.location.location_id===t.location.location_id&&Y(e.environment?.space)===Y(t.environment?.space)&&Y(e.environment?.time)===Y(t.environment?.time))}function gw(e,t,n,o,i,r,s,c){(!Array.isArray(e)||e.length===0||!e.every(Un))&&Ee("scene.actions must contain at least one readable Action.");let a=structuredClone(o),d=r;return{actions:e.map((l,f)=>{let u=Y(l.type,"action");["action","transition","dialogue","inner_thought"].includes(u)||Ee(`Action ${f+1} has an unsupported type.`,[u]);let h=Y(l.content);h||Ee(`Action ${f+1} has empty content.`);let y=Math.max(400,Math.min(8e3,Math.round(Number(l.durationMs)||Number(l.weight||1)*1200))),m=nw(l.extensions);m.timestamp=rw(d),m.duration_ms=y,m.rewrite_duration_ms!==void 0&&(m.rewrite_duration_ms=y);let w={action_id:no("action",`${i}:${f+1}:${h}`,s),type:u,content:h,extend:m};if(d+=y,u==="action"||u==="transition")return w;let g=Y(l.speaker);g||Ee(`Action ${f+1} requires a speaker.`);let _=g.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${_}\\s*[:\uFF1A]`,"iu").test(h)&&Ee(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(h)&&Ee(`Action ${f+1} wraps dialogue content in quotation marks.`);let E=st(g);if(["\u65C1\u767D","narrator"].includes(E))return{...w,speaker:{kind:"broadcast",label:"\u65C1\u767D"},...Y(l.parenthetical)?{parenthetical:Y(l.parenthetical)}:{}};if(["\u753B\u5916\u97F3","offscreen"].includes(E))return{...w,speaker:{kind:"offscreen",label:"\u753B\u5916\u97F3"},...Y(l.parenthetical)?{parenthetical:Y(l.parenthetical)}:{}};let x=ws(t,n,"actors",g,s,c),A=Y(l.speakerVariant),k=a.find(O=>O.actor_id===x.actor_id),U;if(A)U=lr(x,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,U])].sort():a.push({actor_id:x.actor_id,state_ids:[U]});else if(!k){let O=lr(x,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:x.actor_id,state_ids:[O]})}return{...w,speaker:{actor_id:x.actor_id,...U?{state_id:U}:{}},...Y(l.parenthetical)?{parenthetical:Y(l.parenthetical)}:{}}}),actorRefs:a}}function ql(e,t){(!Un(t)||t.version!==1)&&Ee("Creative draft version must be 1."),(!Un(t.episode)||!Un(t.scene))&&Ee("Creative draft requires episode and scene objects.");let n=structuredClone(t),o=n.episode,i=n.scene,r=structuredClone(e),s=ow(r),c={actors:[],locations:[],props:[],states:[]},a=tw(o.number,"episode.number");a>r.episodes.length+1&&Ee("Episodes must be composed in order.",[a]);let d=r.episodes[a-1];d?(Y(d.title)||(d.title=Y(o.title,`\u7B2C ${a} \u96C6`)),Y(d.synopsis)||(d.synopsis=Y(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`))):(d={episode_id:no("episode",`episode:${a}`,s),title:Y(o.title,`\u7B2C ${a} \u96C6`),synopsis:Y(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`),scenes:[]},r.episodes.push(d));let p=ws(r,n,"locations",i.location,s,c),l=lr(p,i.locationVariant,n,"locations",s,c),f=jl(i.actors,"scene.actors").map(I=>{let M=ws(r,n,"actors",I.name,s,c);return{actor_id:M.actor_id,state_ids:[lr(M,I.variant,n,"actors",s,c)]}}),u=ys([],f,I=>I.actor_id),h=jl(i.props,"scene.props").map(I=>{let M=ws(r,n,"props",I.name,s,c);return{prop_id:M.prop_id,state_ids:[lr(M,I.variant,n,"props",s,c)]}}),y=ys([],h,I=>I.prop_id),m=d.scenes.at(-1),w={scene_id:no("scene",`episode:${a}:scene:${d.scenes.length+1}:${Y(i.title)}`,s),environment:{space:Y(i.space,"interior"),time:Y(i.time,"day")},location:{location_id:p.location_id,state_ids:[l]},actors:u,props:y,actions:[],extend:{scene_title:Y(i.title,`\u7B2C ${d.scenes.length+1} \u573A`)}},g=Y(i.boundary,"auto");["auto","new","continue"].includes(g)||Ee("scene.boundary must be auto, new, or continue.");let _=mw(m,w);g==="continue"&&!_&&Ee("scene.boundary=continue requires the same location, space, and time as the previous scene.");let E=g!=="new"&&_,x=E&&m?m:w,A=E?d.scenes.length:d.scenes.length+1,k=ys(x.actors,w.actors,I=>I.actor_id),U=gw(i.actions,r,n,k,x.scene_id,aw(d),s,c);x.actors=U.actorRefs,x.props=ys(x.props,w.props,I=>I.prop_id),x.location&&w.location&&(x.location.state_ids=[...new Set([...x.location.state_ids,...w.location.state_ids])].sort()),x.actions.push(...U.actions),E||d.scenes.push(x);let O=Me(r);return O.ok||Ee("Composed screenplay does not pass Script v4 validation.",O.errors.slice(0,12).map(I=>`${I.path}: ${I.message}`)),{script:r,validation:O,episodeNumber:a,sceneNumber:A,sceneId:x.scene_id,actionIds:U.actions.map(I=>I.action_id),joinedPreviousScene:E,created:c}}function je(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function un(e,t){return e[t]===void 0||typeof e[t]=="string"}function fc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(fc):je(e)&&Object.values(e).every(fc)}function Si(e){return e.extend===void 0||je(e.extend)&&Object.values(e.extend).every(fc)}function mc(e){return e==="default"||V("state",e)}function hw(e){return je(e)&&mc(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&Si(e)}function gc(e){return typeof e.importance=="string"&&Rt.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(hw)&&Si(e)}function yw(e){return je(e)&&V("actor",e.actor_id)&&typeof e.actor_name=="string"&&(e.role_type===void 0||typeof e.role_type=="string"&&eo.has(e.role_type))&&gc(e)}function ww(e){return je(e)&&V("location",e.location_id)&&typeof e.location_name=="string"&&gc(e)}function _w(e){return je(e)&&V("prop",e.prop_id)&&typeof e.prop_name=="string"&&gc(e)}function hc(e){return Array.isArray(e)&&e.every(mc)}function xw(e){return je(e)&&V("actor",e.actor_id)&&hc(e.state_ids)}function Ew(e){return je(e)&&V("location",e.location_id)&&hc(e.state_ids)}function Sw(e){return je(e)&&V("prop",e.prop_id)&&hc(e.state_ids)}function Iw(e){return V("actor",e.actor_id)&&(e.state_id===void 0||mc(e.state_id))}function Aw(e){return typeof e.kind=="string"&&Po.has(e.kind)&&un(e,"label")}function kw(e){return!(!je(e)||!V("action",e.action_id)||typeof e.type!="string"||!jt.has(e.type)||typeof e.content!="string"||!un(e,"parenthetical")||!Si(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!je(e.speaker)||!Iw(e.speaker)&&!Aw(e.speaker))||e.transition_prompt!==void 0&&(!je(e.transition_prompt)||!V("actor",e.transition_prompt.target)&&!V("location",e.transition_prompt.target)&&!V("prop",e.transition_prompt.target)||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string"))}function bw(e){return!(!je(e)||!V("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(xw)||!Array.isArray(e.props)||!e.props.every(Sw)||!Array.isArray(e.actions)||!e.actions.every(kw)||!Si(e)||e.location!==null&&!Ew(e.location)||e.environment!==void 0&&(!je(e.environment)||!un(e.environment,"space")||!un(e.environment,"time")))}function Ow(e){return je(e)&&V("episode",e.episode_id)&&un(e,"title")&&un(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(bw)&&Si(e)}function vw(e){return je(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&un(e,"worldview_raw")&&un(e,"synopsis")&&un(e,"logline")&&un(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(yw)&&Array.isArray(e.locations)&&e.locations.every(ww)&&Array.isArray(e.props)&&e.props.every(_w)&&Array.isArray(e.episodes)&&e.episodes.every(Ow)&&Si(e)}function Ii(e){let t=Me(e);if(t.ok)return e;throw new S("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 fn(e){if(vw(e))return e;throw new S("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 ur from"node:crypto";import*as Te from"node:fs";import*as Mt from"node:path";import Rw from"proper-lockfile";function wc(e){if(Array.isArray(e))return e.map(wc);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=wc(t[o]);return n}return e}function De(e){let t=JSON.stringify(wc(e));return`sha256:${ur.createHash("sha256").update(t).digest("hex")}`}function fr(e){return Te.existsSync(e)?`sha256:${ur.createHash("sha256").update(Te.readFileSync(e)).digest("hex")}`:null}function mr(e,t){let n=fr(e);if(n!==t)throw new S("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 gr(e){let t=Mt.resolve(e),n=Mt.join(Mt.dirname(t),".scriptctl"),o=Mt.basename(t);return{scriptPath:t,stateDir:n,metadataPath:Mt.join(n,`${o}.working-copy.json`),lockPath:Mt.join(n,o)}}async function _s(e,t){let n=gr(e);Te.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await Rw.lock(n.lockPath,{realpath:!1,stale:12e4,update:1e4,retries:{retries:60,factor:1,minTimeout:500,maxTimeout:500}})}catch(i){throw new S("Timed out waiting for the script file lock.",{exitCode:ge,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 ze(e,t){xs(e,`${JSON.stringify(t,null,2)}
|
|
123
|
+
`)}function xs(e,t){let n=Mt.dirname(e);Te.mkdirSync(n,{recursive:!0});let o=Mt.join(n,`.${Mt.basename(e)}.${process.pid}.${ur.randomUUID()}.tmp`),i=Te.openSync(o,"wx");try{Te.writeFileSync(i,t,"utf-8"),Te.fsyncSync(i)}finally{Te.closeSync(i)}Te.renameSync(o,e)}function Es(e){let t=gr(e).metadataPath;if(!Te.existsSync(t))return null;let n;try{n=JSON.parse(Te.readFileSync(t,"utf-8"))}catch(i){throw yc(t,i instanceof Error?i.message:String(i))}if(n===null||typeof n!="object"||Array.isArray(n))throw yc(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 yc(t,"required fields are missing or invalid");return{schemaVersion:1,projectGroupNo:o.projectGroupNo,apiBaseUrl:o.apiBaseUrl,baseRevision:Number(o.baseRevision),baseContentHash:o.baseContentHash}}function Ss(e,t){ze(gr(e).metadataPath,t)}function yc(e,t){return new S("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 Pt(e,t){let n;try{n=JSON.parse(Te.readFileSync(e,"utf-8"))}catch(i){throw new S("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=De(n);if(o!==t)throw new S("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 te(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Cn(e){return Array.isArray(e)}function ne(e){return Array.isArray(e)?e:[]}function _c(e,t=[]){throw new S(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 Zl(e,t){let n=eu.resolve(e),o;try{o=Xl.readFileSync(n)}catch{throw new S(`${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 S(`${t} is not valid JSON.`,{exitCode:b,errorCode:"CREATIVE_DRAFT_JSON_INVALID",data:{actual:[n,i instanceof Error?i.message:String(i)]}})}}function tu(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"";(!n||n==="-")&&_c("Creative draft input must be a named JSON file.",[n||"<missing>"]);let o=Zl(n,"The creative draft"),i=ke(e),r=Zl(i,"The target Script v4 file"),s=fn(r.value),c=De(s),a=ql(s,o.value),d=`sha256:${Wl.createHash("sha256").update(o.bytes).digest("hex")}`,p={version:1,op:"compose",sourceDigest:d,baseline:c,proposed:De(a.script),episodeNumber:a.episodeNumber,sceneNumber:a.sceneNumber,sceneId:a.sceneId,actionIds:a.actionIds,joinedPreviousScene:a.joinedPreviousScene,created:a.created},l=`sha256:${ye(JSON.stringify(p))}`,f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&_c("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&_c("--plan is only valid together with --apply.",[`plan=${u}`]),f&&u!==l)throw new S("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&&(Pt(i,c),ze(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}},J]}import*as lu from"node:fs";import*as uu from"node:path";var zt={line:1,column:1};function Mw(e){let t=[];for(let n of e.actors){let o=structuredClone(n);o.states=[],t.push({declarationKind:"actor",value:o,source:zt});for(let i of n.states)t.push(xc("actor",n.actor_id,i))}for(let n of e.locations){let o=structuredClone(n);o.states=[],t.push({declarationKind:"location",value:o,source:zt});for(let i of n.states)t.push(xc("location",n.location_id,i))}for(let n of e.props){let o=structuredClone(n);o.states=[],t.push({declarationKind:"prop",value:o,source:zt});for(let i of n.states)t.push(xc("prop",n.prop_id,i))}return t}function xc(e,t,n){return{declarationKind:"state",ownerKind:e,ownerId:t,value:structuredClone(n),source:zt}}function nu(e){let t={kind:"script",title:e.title,worldview:e.worldview,style:e.style,episodes:structuredClone(e.episodes),source:zt};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:Mw(e),targets:[t],targetKind:"script"}}function Ai(e,t){return{version:1,declarations:[],targets:t,targetKind:e}}function Lw(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function Nw(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function pe(e,t,n){let o=[e,...t].map(Lw).join("|"),i=Nw(n);return`[${o}]${i.length>0?` ${i}`:""}`}function Sc(e){if(Array.isArray(e))return e.map(Sc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Sc(e[n]);return t}return e}function Pn(e){return e===void 0?[]:[pe("extensions",[],""),...Object.keys(e).sort().map(t=>pe("extend",[t],JSON.stringify(Sc(e[t]))))]}function Uw(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 ou(e){let t=Pn(e.extend);if(e.transition_prompt!==void 0&&t.push(pe("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=[Uw(e.speaker)];return e.emotion!==void 0&&i.push(e.emotion),t.push(pe(o,i,e.content)),t}let n=e.type==="action"?"act":"trans";return t.push(pe(n,e.emotion===void 0?[]:[e.emotion],e.content)),t}function Ic(e,t){let n=[...Pn(e.extend),`<scene ${t}>`];if(e.environment!==void 0&&(e.environment.time!==void 0?n.push(pe("environment",[e.environment.space??"",e.environment.time],"")):e.environment.space!==void 0?n.push(pe("environment",[e.environment.space],"")):n.push(pe("environment",[],""))),e.location===null)n.push(pe("location",[],""));else{let o=[e.location.location_id];e.location.state_id!==void 0&&o.push(e.location.state_id),n.push(pe("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(pe("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(pe("prop",i,""))}n.push("","<body>");for(let o of e.actions)n.push(...ou(o));return n.push("</body>","","</scene>"),n}function Ec(e){let t=[...Pn(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(pe("title",[],e.title)),e.synopsis!==void 0&&t.push(pe("synopsis",[],e.synopsis)),(e.title!==void 0||e.synopsis!==void 0)&&e.scenes.length>0&&t.push(""),e.scenes.forEach((n,o)=>{t.push(...Ic(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</episode>"),t}function Cw(e){if(e.declarationKind==="state")return Pw(e.ownerKind,e.ownerId,e.value);let t=e.value,n=Pn(t.extend);t.aliases!==void 0&&n.push(pe("aliases",[],""));for(let o of t.aliases??[])n.push(pe("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(pe("actor",i,o.description))}else if(e.declarationKind==="location"){let o=e.value;n.push(pe("location",[o.location_id,o.location_name,o.importance],o.description))}else{let o=e.value;n.push(pe("prop",[o.prop_id,o.prop_name,o.importance],o.description))}return n}function Pw(e,t,n){return[...Pn(n.extend),pe("state",[`${e}:${t}`,n.state_id,n.state_name],n.description)]}function Tw(e){switch(e.kind){case"script":{let t=[...Pn(e.extend),"<script>"];if(t.push(pe("title",[],e.title)),t.push(pe("worldview",[],e.worldview)),e.worldviewRaw!==void 0&&t.push(pe("worldview-raw",[],e.worldviewRaw)),t.push(pe("style",[],e.style)),e.synopsis!==void 0&&t.push(pe("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(pe("logline",[],e.logline)),e.theme!==void 0&&t.push(pe("theme",[],e.theme)),e.mainCharacters!==void 0){t.push(pe("main-characters",[],""));for(let n of e.mainCharacters)t.push(pe("main-character",[n.name,n.role],""))}return e.episodes.length>0&&t.push(""),e.episodes.forEach((n,o)=>{t.push(...Ec(n)),o<e.episodes.length-1&&t.push("")}),t.push("</script>"),t}case"episode":return Ec(e.value);case"episode-span":{let t=[...Pn(e.extend),`<episode-span from=${e.from} through=${e.through}>`];return e.episodes.forEach((n,o)=>{t.push(...Ec(n)),o<e.episodes.length-1&&t.push("")}),t.push("</episode-span>"),t}case"scene":return Ic(e.value,`id=${e.value.scene_id} parent=${e.parent}`);case"scene-span":{let t=[...Pn(e.extend),`<scene-span parent=${e.parent} from=${e.from} through=${e.through}>`];return e.scenes.forEach((n,o)=>{t.push(...Ic(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</scene-span>"),t}case"action-span":{let t=[...Pn(e.extend),`<action-span parent=${e.parent} from=${e.from} through=${e.through}>`,"<body>"];for(let n of e.actions)t.push(...ou(n));return t.push("</body>","</action-span>"),t}}}function iu(e){let t=["<authoring version=1>",""];if(e.declarations.length>0){t.push("<create>");for(let n of e.declarations)t.push(...Cw(n));t.push("</create>","")}return e.targets.forEach((n,o)=>{t.push(...Tw(n)),o<e.targets.length-1&&t.push("")}),t.push("","</authoring>"),`${t.join(`
|
|
125
125
|
`)}
|
|
126
|
-
`}function He(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function wt(e,t){return e[t]===void 0||typeof e[t]=="string"}function Ic(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Ic):He(e)&&Object.values(e).every(Ic)}function oo(e){return e.extend===void 0||He(e.extend)&&Object.values(e.extend).every(Ic)}function Ac(e){return He(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&oo(e)}function Tw(e){return He(e)&&typeof e.actor_id=="string"&&typeof e.actor_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Mt.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(Ac)&&oo(e)}function Vw(e){return He(e)&&typeof e.location_id=="string"&&typeof e.location_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Mt.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(Ac)&&oo(e)}function $w(e){return He(e)&&typeof e.prop_id=="string"&&typeof e.prop_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Mt.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(Ac)&&oo(e)}function Dw(e){if(!He(e)||typeof e.type!="string"||!zt.has(e.type)||typeof e.content!="string"||!wt(e,"emotion"))return!1;if(e.speaker!==void 0){if(!He(e.speaker))return!1;if(typeof e.speaker.actor_id=="string"){if(!wt(e.speaker,"state_id"))return!1}else if(typeof e.speaker.kind=="string"){if(!Po.has(e.speaker.kind)||!wt(e.speaker,"label"))return!1}else return!1}return e.transition_prompt!==void 0&&(!He(e.transition_prompt)||typeof e.transition_prompt.target!="string"||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string")?!1:oo(e)}function Gw(e){return!He(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(Dw)||!e.actors.every(t=>He(t)&&typeof t.actor_id=="string"&&wt(t,"state_id"))||!e.props.every(t=>He(t)&&typeof t.prop_id=="string"&&wt(t,"state_id"))||e.location!==null&&(!He(e.location)||typeof e.location.location_id!="string"||!wt(e.location,"state_id"))||e.environment!==void 0&&(!He(e.environment)||!wt(e.environment,"space")||!wt(e.environment,"time"))?!1:oo(e)}function Jw(e){return He(e)&&typeof e.episode_id=="string"&&wt(e,"title")&&wt(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(Gw)&&oo(e)}function Bw(e){return He(e)&&e.version===3&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&wt(e,"worldview_raw")&&wt(e,"synopsis")&&wt(e,"logline")&&wt(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>He(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(Tw)&&Array.isArray(e.locations)&&e.locations.every(Vw)&&Array.isArray(e.props)&&e.props.every($w)&&Array.isArray(e.episodes)&&e.episodes.every(Jw)&&oo(e)}function Nt(e){if(Bw(e))return e;throw new S("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 kc=[3,4],Kw={3:{version:3,require:Nt,requireStructurallyReadable:Nt,validate:yt},4:{version:4,require:Ei,requireStructurallyReadable:mn,validate:Le}};function io(e){return typeof e=="number"&&kc.some(t=>t===e)}function Vo(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new S("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(io(t))return t;throw new S("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 bc(e){return Kw[Vo(e)]}function Ss(e){return bc(e).require(e)}function Is(e){return bc(e).requireStructurallyReadable(e)}function gr(e){return bc(e).validate(e)}function As(e){throw new S("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 hr(e){let t=typeof e=="string"?e.trim():"",n=t.indexOf("/");if(n>=0){n!==t.lastIndexOf("/")&&As(t);let o=t.slice(0,n),i=t.slice(n+1);return i!=="default"&&!V("state",i)&&As(t),V("actor",o)?{kind:"state",assetKind:"actor",assetId:o,stateId:i}:V("location",o)?{kind:"state",assetKind:"location",assetId:o,stateId:i}:V("prop",o)?{kind:"state",assetKind:"prop",assetId:o,stateId:i}:As(t)}return V("episode",t)?{kind:"episode",id:t}:V("scene",t)?{kind:"scene",id:t}:V("action",t)?{kind:"action",id:t}:V("actor",t)?{kind:"asset",assetKind:"actor",id:t}:V("location",t)?{kind:"asset",assetKind:"location",id:t}:V("prop",t)?{kind:"asset",assetKind:"prop",id:t}:As(t)}function $o(e){return e.episodes.map((t,n)=>({episode:t,episodeIndex:n}))}function Tn(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 Do(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 gn(e,t){return $o(e).find(n=>n.episode.episode_id===t)??null}function Vn(e,t){return Tn(e).find(n=>n.scene.scene_id===t)??null}function ro(e,t){throw new S(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 hn(e,t){return/^[1-9]\d*$/.test(e)||ro(t,"Ordinal positions are 1-based positive integers."),Number(e)}function ks(e,t){let n=/^@ep:(\d+)$/.exec(t);if(n){let o=$o(e)[hn(n[1],t)-1];return o||ro(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=$o(e)[hn(n[1],t)-1],i=o?.episode.scenes[hn(n[2],t)-1];return(!o||!i)&&ro(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=$o(e)[hn(n[1],t)-1],i=o?.episode.scenes[hn(n[2],t)-1],r=i?.actions[hn(n[3],t)-1];return(!o||!i||!r)&&ro(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=Tn(e)[hn(n[1],t)-1];return o||ro(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=Tn(e)[hn(n[1],t)-1],i=o?.scene.actions[hn(n[2],t)-1];return(!o||!i)&&ro(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=Do(e)[hn(n[1],t)-1];return o||ro(t,"Global action ordinal is outside the current script."),{kind:"action",id:o.action.action_id}}return ro(t,"Ordinal anchor syntax is not supported.")}function Ii(e,t){throw new S(e,{exitCode:G,errorCode:"V4_SELECTOR_INVALID",data:{expected:["typed v4 ID or same-kind inclusive range; comma joins regions"],actual:[t]}})}function iu(e,t){return e.kind==="episode"||e.kind==="scene"||e.kind==="action"?e.kind:Ii("Asset and state addresses are not narrative range anchors.",t)}function ru(e){return e.kind==="state"?`${e.assetId}/${e.stateId}`:e.id}function su(e,t,n){return t.startsWith("@")?(n||Ii("Ordinal anchors are query-only.",t),ks(e,t)):hr(t)}function jw(e,t,n,o){let i=e.indexOf(t),r=e.indexOf(n);(i<0||r<0)&&Ii("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 bs(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=$o(e),r=Tn(e),s=Do(e),c=i.map(m=>m.episode.episode_id),a=r.map(m=>m.scene.scene_id),d=s.map(m=>m.action.action_id),p=new Set,l=new Set,f=new Set,u=m=>{p.add(m);let w=i.find(g=>g.episode.episode_id===m)?.episode;w&&w.scenes.forEach(g=>{l.add(g.scene_id),g.actions.forEach(_=>f.add(_.action_id))})},h=m=>{l.add(m);let w=r.find(g=>g.scene.scene_id===m);w&&(p.add(w.episode.episode_id),w.scene.actions.forEach(g=>f.add(g.action_id)))},y=m=>{f.add(m);let w=s.find(g=>g.action.action_id===m);w&&(p.add(w.episode.episode_id),l.add(w.scene.scene_id))};for(let m of o.split(",")){let w=m.trim();w||Ii("Selector contains an empty region.",o);let g=w.split("..");g.length>2&&Ii("Selector region has too many range delimiters.",w);let _=su(e,g[0].trim(),n.allowOrdinals),E=su(e,(g[1]??g[0]).trim(),n.allowOrdinals),x=iu(_,w);iu(E,w)!==x&&Ii("Range endpoints must have the same kind.",w);let A=ru(_),k=ru(E),O=jw(x==="episode"?c:x==="scene"?a:d,A,k,w);x==="episode"?O.forEach(u):x==="scene"?O.forEach(h):O.forEach(y)}return{isEmpty:!1,isWholeScript:!1,matchesEpisode:m=>p.has(m),matchesScene:m=>l.has(m),matchesAction:m=>f.has(m)}}function so(e,t){throw new S(e,{exitCode:G,errorCode:"AUTHORING_SELECTOR_INVALID",data:{actual:t}})}function zw(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function Hw(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function oe(e,t,n=""){let o=[e,...t].map(zw).join("|"),i=Hw(n);return`[${o}]${i?` ${i}`:""}`}function Rc(e){if(Array.isArray(e))return e.map(Rc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Rc(e[n]);return t}return e}function ao(e){return e===void 0?[]:[oe("extensions",[]),...Object.keys(e).sort().map(t=>oe("extend",[t],JSON.stringify(Rc(e[t]))))]}function Qw(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 au(e){let t=ao(e.extend);if(e.transition_prompt!==void 0&&t.push(oe("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,Qw(e.speaker)];"parenthetical"in e&&n.push(e.parenthetical??""),t.push(oe(e.type==="dialogue"?"dlg":"think",n,e.content))}else t.push(oe(e.type==="action"?"act":"trans",[e.action_id],e.content));return t}function Mc(e,t){let n=[...ao(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(oe("environment",o))}n.push(e.location===null?oe("location",[]):oe("location",[e.location.location_id,...e.location.state_ids]));for(let o of e.actors)n.push(oe("cast",[o.actor_id,...o.state_ids]));for(let o of e.props)n.push(oe("prop",[o.prop_id,...o.state_ids]));return n.push("","<body>"),e.actions.forEach(o=>n.push(...au(o))),n.push("</body>","","</scene>"),n}function Lc(e){let t=[...ao(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(oe("title",[],e.title)),e.synopsis!==void 0&&t.push(oe("synopsis",[],e.synopsis)),e.scenes.forEach((n,o)=>{(o>0||e.title!==void 0||e.synopsis!==void 0)&&t.push(""),t.push(...Mc(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function Oc(e,t){return[...ao(t.extend),oe("state",[e,t.state_id,t.state_name],t.description)]}function Fw(e){let t=["<create>"];for(let n of e.actors){t.push(...ao(n.extend)),n.aliases!==void 0&&(t.push(oe("aliases",[])),n.aliases.forEach(i=>t.push(oe("alias",[],i))));let o=[n.actor_id,n.actor_name,n.importance];n.role_type!==void 0&&o.push(n.role_type),t.push(oe("actor",o,n.description)),n.states.forEach(i=>t.push(...Oc(n.actor_id,i)))}for(let n of e.locations)t.push(...ao(n.extend)),n.aliases!==void 0&&(t.push(oe("aliases",[])),n.aliases.forEach(o=>t.push(oe("alias",[],o)))),t.push(oe("location",[n.location_id,n.location_name,n.importance],n.description)),n.states.forEach(o=>t.push(...Oc(n.location_id,o)));for(let n of e.props)t.push(...ao(n.extend)),n.aliases!==void 0&&(t.push(oe("aliases",[])),n.aliases.forEach(o=>t.push(oe("alias",[],o)))),t.push(oe("prop",[n.prop_id,n.prop_name,n.importance],n.description)),n.states.forEach(o=>t.push(...Oc(n.prop_id,o)));return t.push("</create>"),t}function Yw(e){let t=[...ao(e.extend),"<script>"];return t.push(oe("title",[],e.title),oe("worldview",[],e.worldview)),e.worldview_raw!==void 0&&t.push(oe("worldview-raw",[],e.worldview_raw)),t.push(oe("style",[],e.style)),e.synopsis!==void 0&&t.push(oe("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(oe("logline",[],e.logline)),e.theme!==void 0&&t.push(oe("theme",[],e.theme)),e.main_characters!==void 0&&(t.push(oe("main-characters",[])),e.main_characters.forEach(n=>t.push(oe("main-character",[n.name,n.role])))),e.episodes.forEach(n=>t.push("",...Lc(n))),t.push("</script>"),t}function qw(e){return e.trim()||so("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]?so("Selector region is invalid.",[t]):{left:n[0],right:n[1]??n[0]}})}function vc(e,t,n,o,i){let r=-1;return qw(i).map(s=>{let c=f=>{if(!f.startsWith("@"))return f;let u=ks(e,f);return u.kind!==t?so("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)&&so("Selector endpoint was not found.",[s.left,s.right]);let p=Math.min(a,d),l=Math.max(a,d);return p<=r&&so("Selector regions must follow current document order without overlap.",[`${s.left}..${s.right}`]),r=l,n.slice(p,l+1)})}function cu(e,t,n){let o=["<authoring version=1>",""],i=0;if(t==="script")o.push(...Fw(e),"",...Yw(e)),i=1;else if(t==="episodes"){let r=bs(e,n,{allowOrdinals:!0}),s=e.episodes.filter(c=>r.matchesEpisode(c.episode_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...Lc(c))}),i=s.length}else if(t==="episode-spans"){let r=vc(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(...Lc(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=bs(e,n,{allowOrdinals:!0}),s=Tn(e).filter(c=>r.matchesScene(c.scene.scene_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...Mc(c.scene,`id=${c.scene.scene_id} parent=${c.episode.episode_id}`))}),i=s.length}else if(t==="scene-spans"){let r=Tn(e),s=vc(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)||so("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(...Mc(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=Do(e),s=vc(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)||so("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(...au(p.action))),o.push("</body>","</action-span>"),i++}}return i===0&&so("Selector did not match any authoring targets.",[n||"<empty>"]),o.push("","</authoring>"),{content:`${o.join(`
|
|
126
|
+
`}function He(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function gt(e,t){return e[t]===void 0||typeof e[t]=="string"}function Ac(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Ac):He(e)&&Object.values(e).every(Ac)}function oo(e){return e.extend===void 0||He(e.extend)&&Object.values(e.extend).every(Ac)}function kc(e){return He(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&oo(e)}function Vw(e){return He(e)&&typeof e.actor_id=="string"&&typeof e.actor_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Rt.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(kc)&&oo(e)}function $w(e){return He(e)&&typeof e.location_id=="string"&&typeof e.location_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Rt.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(kc)&&oo(e)}function Dw(e){return He(e)&&typeof e.prop_id=="string"&&typeof e.prop_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Rt.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(kc)&&oo(e)}function Gw(e){if(!He(e)||typeof e.type!="string"||!jt.has(e.type)||typeof e.content!="string"||!gt(e,"emotion"))return!1;if(e.speaker!==void 0){if(!He(e.speaker))return!1;if(typeof e.speaker.actor_id=="string"){if(!gt(e.speaker,"state_id"))return!1}else if(typeof e.speaker.kind=="string"){if(!Po.has(e.speaker.kind)||!gt(e.speaker,"label"))return!1}else return!1}return e.transition_prompt!==void 0&&(!He(e.transition_prompt)||typeof e.transition_prompt.target!="string"||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string")?!1:oo(e)}function Jw(e){return!He(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(Gw)||!e.actors.every(t=>He(t)&&typeof t.actor_id=="string"&>(t,"state_id"))||!e.props.every(t=>He(t)&&typeof t.prop_id=="string"&>(t,"state_id"))||e.location!==null&&(!He(e.location)||typeof e.location.location_id!="string"||!gt(e.location,"state_id"))||e.environment!==void 0&&(!He(e.environment)||!gt(e.environment,"space")||!gt(e.environment,"time"))?!1:oo(e)}function Bw(e){return He(e)&&typeof e.episode_id=="string"&>(e,"title")&>(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(Jw)&&oo(e)}function Kw(e){return He(e)&&e.version===3&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&>(e,"worldview_raw")&>(e,"synopsis")&>(e,"logline")&>(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>He(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(Vw)&&Array.isArray(e.locations)&&e.locations.every($w)&&Array.isArray(e.props)&&e.props.every(Dw)&&Array.isArray(e.episodes)&&e.episodes.every(Bw)&&oo(e)}function Lt(e){if(Kw(e))return e;throw new S("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 bc=[3,4],jw={3:{version:3,require:Lt,requireStructurallyReadable:Lt,validate:mt},4:{version:4,require:Ii,requireStructurallyReadable:fn,validate:Me}};function io(e){return typeof e=="number"&&bc.some(t=>t===e)}function Vo(e){if(typeof e!="object"||e===null||Array.isArray(e))throw new S("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(io(t))return t;throw new S("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 Oc(e){return jw[Vo(e)]}function Is(e){return Oc(e).require(e)}function As(e){return Oc(e).requireStructurallyReadable(e)}function hr(e){return Oc(e).validate(e)}function ks(e){throw new S("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 yr(e){let t=typeof e=="string"?e.trim():"",n=t.indexOf("/");if(n>=0){n!==t.lastIndexOf("/")&&ks(t);let o=t.slice(0,n),i=t.slice(n+1);return i!=="default"&&!V("state",i)&&ks(t),V("actor",o)?{kind:"state",assetKind:"actor",assetId:o,stateId:i}:V("location",o)?{kind:"state",assetKind:"location",assetId:o,stateId:i}:V("prop",o)?{kind:"state",assetKind:"prop",assetId:o,stateId:i}:ks(t)}return V("episode",t)?{kind:"episode",id:t}:V("scene",t)?{kind:"scene",id:t}:V("action",t)?{kind:"action",id:t}:V("actor",t)?{kind:"asset",assetKind:"actor",id:t}:V("location",t)?{kind:"asset",assetKind:"location",id:t}:V("prop",t)?{kind:"asset",assetKind:"prop",id:t}:ks(t)}function $o(e){return e.episodes.map((t,n)=>({episode:t,episodeIndex:n}))}function Tn(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 Do(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 mn(e,t){return $o(e).find(n=>n.episode.episode_id===t)??null}function Vn(e,t){return Tn(e).find(n=>n.scene.scene_id===t)??null}function ro(e,t){throw new S(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 gn(e,t){return/^[1-9]\d*$/.test(e)||ro(t,"Ordinal positions are 1-based positive integers."),Number(e)}function bs(e,t){let n=/^@ep:(\d+)$/.exec(t);if(n){let o=$o(e)[gn(n[1],t)-1];return o||ro(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=$o(e)[gn(n[1],t)-1],i=o?.episode.scenes[gn(n[2],t)-1];return(!o||!i)&&ro(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=$o(e)[gn(n[1],t)-1],i=o?.episode.scenes[gn(n[2],t)-1],r=i?.actions[gn(n[3],t)-1];return(!o||!i||!r)&&ro(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=Tn(e)[gn(n[1],t)-1];return o||ro(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=Tn(e)[gn(n[1],t)-1],i=o?.scene.actions[gn(n[2],t)-1];return(!o||!i)&&ro(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=Do(e)[gn(n[1],t)-1];return o||ro(t,"Global action ordinal is outside the current script."),{kind:"action",id:o.action.action_id}}return ro(t,"Ordinal anchor syntax is not supported.")}function ki(e,t){throw new S(e,{exitCode:G,errorCode:"V4_SELECTOR_INVALID",data:{expected:["typed v4 ID or same-kind inclusive range; comma joins regions"],actual:[t]}})}function ru(e,t){return e.kind==="episode"||e.kind==="scene"||e.kind==="action"?e.kind:ki("Asset and state addresses are not narrative range anchors.",t)}function su(e){return e.kind==="state"?`${e.assetId}/${e.stateId}`:e.id}function au(e,t,n){return t.startsWith("@")?(n||ki("Ordinal anchors are query-only.",t),bs(e,t)):yr(t)}function zw(e,t,n,o){let i=e.indexOf(t),r=e.indexOf(n);(i<0||r<0)&&ki("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 Os(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=$o(e),r=Tn(e),s=Do(e),c=i.map(m=>m.episode.episode_id),a=r.map(m=>m.scene.scene_id),d=s.map(m=>m.action.action_id),p=new Set,l=new Set,f=new Set,u=m=>{p.add(m);let w=i.find(g=>g.episode.episode_id===m)?.episode;w&&w.scenes.forEach(g=>{l.add(g.scene_id),g.actions.forEach(_=>f.add(_.action_id))})},h=m=>{l.add(m);let w=r.find(g=>g.scene.scene_id===m);w&&(p.add(w.episode.episode_id),w.scene.actions.forEach(g=>f.add(g.action_id)))},y=m=>{f.add(m);let w=s.find(g=>g.action.action_id===m);w&&(p.add(w.episode.episode_id),l.add(w.scene.scene_id))};for(let m of o.split(",")){let w=m.trim();w||ki("Selector contains an empty region.",o);let g=w.split("..");g.length>2&&ki("Selector region has too many range delimiters.",w);let _=au(e,g[0].trim(),n.allowOrdinals),E=au(e,(g[1]??g[0]).trim(),n.allowOrdinals),x=ru(_,w);ru(E,w)!==x&&ki("Range endpoints must have the same kind.",w);let A=su(_),k=su(E),O=zw(x==="episode"?c:x==="scene"?a:d,A,k,w);x==="episode"?O.forEach(u):x==="scene"?O.forEach(h):O.forEach(y)}return{isEmpty:!1,isWholeScript:!1,matchesEpisode:m=>p.has(m),matchesScene:m=>l.has(m),matchesAction:m=>f.has(m)}}function so(e,t){throw new S(e,{exitCode:G,errorCode:"AUTHORING_SELECTOR_INVALID",data:{actual:t}})}function Hw(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function Qw(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function oe(e,t,n=""){let o=[e,...t].map(Hw).join("|"),i=Qw(n);return`[${o}]${i?` ${i}`:""}`}function Mc(e){if(Array.isArray(e))return e.map(Mc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Mc(e[n]);return t}return e}function ao(e){return e===void 0?[]:[oe("extensions",[]),...Object.keys(e).sort().map(t=>oe("extend",[t],JSON.stringify(Mc(e[t]))))]}function Fw(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 cu(e){let t=ao(e.extend);if(e.transition_prompt!==void 0&&t.push(oe("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,Fw(e.speaker)];"parenthetical"in e&&n.push(e.parenthetical??""),t.push(oe(e.type==="dialogue"?"dlg":"think",n,e.content))}else t.push(oe(e.type==="action"?"act":"trans",[e.action_id],e.content));return t}function Lc(e,t){let n=[...ao(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(oe("environment",o))}n.push(e.location===null?oe("location",[]):oe("location",[e.location.location_id,...e.location.state_ids]));for(let o of e.actors)n.push(oe("cast",[o.actor_id,...o.state_ids]));for(let o of e.props)n.push(oe("prop",[o.prop_id,...o.state_ids]));return n.push("","<body>"),e.actions.forEach(o=>n.push(...cu(o))),n.push("</body>","","</scene>"),n}function Nc(e){let t=[...ao(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(oe("title",[],e.title)),e.synopsis!==void 0&&t.push(oe("synopsis",[],e.synopsis)),e.scenes.forEach((n,o)=>{(o>0||e.title!==void 0||e.synopsis!==void 0)&&t.push(""),t.push(...Lc(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function vc(e,t){return[...ao(t.extend),oe("state",[e,t.state_id,t.state_name],t.description)]}function Yw(e){let t=["<create>"];for(let n of e.actors){t.push(...ao(n.extend)),n.aliases!==void 0&&(t.push(oe("aliases",[])),n.aliases.forEach(i=>t.push(oe("alias",[],i))));let o=[n.actor_id,n.actor_name,n.importance];n.role_type!==void 0&&o.push(n.role_type),t.push(oe("actor",o,n.description)),n.states.forEach(i=>t.push(...vc(n.actor_id,i)))}for(let n of e.locations)t.push(...ao(n.extend)),n.aliases!==void 0&&(t.push(oe("aliases",[])),n.aliases.forEach(o=>t.push(oe("alias",[],o)))),t.push(oe("location",[n.location_id,n.location_name,n.importance],n.description)),n.states.forEach(o=>t.push(...vc(n.location_id,o)));for(let n of e.props)t.push(...ao(n.extend)),n.aliases!==void 0&&(t.push(oe("aliases",[])),n.aliases.forEach(o=>t.push(oe("alias",[],o)))),t.push(oe("prop",[n.prop_id,n.prop_name,n.importance],n.description)),n.states.forEach(o=>t.push(...vc(n.prop_id,o)));return t.push("</create>"),t}function qw(e){let t=[...ao(e.extend),"<script>"];return t.push(oe("title",[],e.title),oe("worldview",[],e.worldview)),e.worldview_raw!==void 0&&t.push(oe("worldview-raw",[],e.worldview_raw)),t.push(oe("style",[],e.style)),e.synopsis!==void 0&&t.push(oe("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(oe("logline",[],e.logline)),e.theme!==void 0&&t.push(oe("theme",[],e.theme)),e.main_characters!==void 0&&(t.push(oe("main-characters",[])),e.main_characters.forEach(n=>t.push(oe("main-character",[n.name,n.role])))),e.episodes.forEach(n=>t.push("",...Nc(n))),t.push("</script>"),t}function Zw(e){return e.trim()||so("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]?so("Selector region is invalid.",[t]):{left:n[0],right:n[1]??n[0]}})}function Rc(e,t,n,o,i){let r=-1;return Zw(i).map(s=>{let c=f=>{if(!f.startsWith("@"))return f;let u=bs(e,f);return u.kind!==t?so("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)&&so("Selector endpoint was not found.",[s.left,s.right]);let p=Math.min(a,d),l=Math.max(a,d);return p<=r&&so("Selector regions must follow current document order without overlap.",[`${s.left}..${s.right}`]),r=l,n.slice(p,l+1)})}function du(e,t,n){let o=["<authoring version=1>",""],i=0;if(t==="script")o.push(...Yw(e),"",...qw(e)),i=1;else if(t==="episodes"){let r=Os(e,n,{allowOrdinals:!0}),s=e.episodes.filter(c=>r.matchesEpisode(c.episode_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...Nc(c))}),i=s.length}else if(t==="episode-spans"){let r=Rc(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(...Nc(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=Os(e,n,{allowOrdinals:!0}),s=Tn(e).filter(c=>r.matchesScene(c.scene.scene_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...Lc(c.scene,`id=${c.scene.scene_id} parent=${c.episode.episode_id}`))}),i=s.length}else if(t==="scene-spans"){let r=Tn(e),s=Rc(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)||so("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(...Lc(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=Do(e),s=Rc(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)||so("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(...cu(p.action))),o.push("</body>","</action-span>"),i++}}return i===0&&so("Selector did not match any authoring targets.",[n||"<empty>"]),o.push("","</authoring>"),{content:`${o.join(`
|
|
127
127
|
`)}
|
|
128
|
-
`,targetCount:i}}function ae(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o,data:{actual:n}})}function Zw(e){let t=Ae(e),n;try{n=JSON.parse(pu.readFileSync(t,"utf-8"))}catch(o){ae("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 Is(n)}function yr(e){return e||ae("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||ae("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&&ae("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)&&ae("AUTHORING_SELECTOR_INVALID","Selector range endpoint is empty.",[n],"Provide both endpoints.",G),{from:i,through:r}})}function Os(e,t,n){if(t.from==="*"&&t.through==="*")return e.length===0&&ae("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)&&ae("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)&&ae("AUTHORING_SELECTOR_NOT_FOUND",`${n} selector endpoint was not found.`,[t.from,t.through],"Use IDs from the current local script."),o>i&&ae("AUTHORING_SELECTOR_REVERSED",`${n} selector is reversed in current document order.`,[t.from,t.through],"Put the earlier document endpoint first."),[o,i]}function uu(e,t){let n=new Set;for(let o of e){let i=t(o);n.has(i)&&ae("AUTHORING_SELECTOR_OVERLAP","Selector regions overlap or repeat a target.",[i],"Use non-overlapping regions."),n.add(i)}return e}function wr(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&&ae("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 Ww(e,t){let n=[],o=e.episodes.map(r=>r.episode_id);for(let r of yr(t)){let[s,c]=Os(o,r,"episode");n.push(...e.episodes.slice(s,c+1))}uu(n,r=>r.episode_id),wr(n.map(r=>[o.indexOf(r.episode_id)]),"Episode");let i=n.map(r=>({kind:"episode",value:structuredClone(r),source:Ht}));return Si("episode",i)}function Xw(e,t){let n=e.episodes.map(s=>s.episode_id),o=[],i=new Set,r=[];for(let s of yr(t)){let[c,a]=Os(n,s,"episode");for(let d=c;d<=a;d+=1)i.has(d)&&ae("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:Ht}),r.push([c])}return wr(r,"Episode span"),Si("episode-span",o)}function e_(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function Nc(e){return`${e.episodeId}/${e.scene.scene_id}`}function t_(e,t){let n=e_(e),o=n.map(Nc),i=[];for(let s of yr(t)){let[c,a]=Os(o,s,"scene");i.push(...n.slice(c,a+1))}uu(i,Nc),wr(i.map(s=>[o.indexOf(Nc(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:Ht}));return Si("scene",r)}function Uc(e){let t=/^([^/#]+)\/([^/#]+)$/.exec(e);return t||ae("AUTHORING_SELECTOR_INVALID","Scene selector endpoint must be ep/scn.",[e],"Use ep_ID/scn_ID."),{episodeId:t[1],sceneId:t[2]}}function n_(e,t){let n=[],o=new Set,i=[];for(let r of yr(t)){(r.from==="*"||r.through==="*")&&ae("AUTHORING_SELECTOR_INVALID","A scene span wildcard has no single parent.",["*"],"Use one explicit region per episode.");let s=Uc(r.from),c=Uc(r.through);s.episodeId!==c.episodeId&&ae("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&&ae("AUTHORING_SELECTOR_NOT_FOUND","Scene span parent episode was not found.",[s.episodeId],"Use an existing episode ID."),a.length>1&&ae("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]=Os(p,{from:s.sceneId,through:c.sceneId},"scene");for(let u=l;u<=f;u+=1){let h=`${d.episode_id}/${p[u]}`;o.has(h)&&ae("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}n.push({kind:"scene-span",parent:d.episode_id,from:p[l],through:p[f],scenes:structuredClone(d.scenes.slice(l,f+1)),source:Ht}),i.push([e.episodes.indexOf(d),l])}return wr(i,"Scene span"),Si("scene-span",n)}function du(e){let t=/^([^/#]+\/[^/#]+)#(\d+)$/.exec(e);t||ae("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)||ae("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 o_(e,t){let n=[],o=new Set,i=[];for(let r of yr(t)){(r.from==="*"||r.through==="*")&&ae("AUTHORING_SELECTOR_INVALID","An action span wildcard has no single parent.",["*"],"Use one explicit region per scene.");let s=du(r.from),c=du(r.through);s.parent!==c.parent&&ae("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=Uc(s.parent),d=e.episodes.filter(u=>u.episode_id===a.episodeId);d.length===0&&ae("AUTHORING_SELECTOR_NOT_FOUND","Action span parent episode was not found.",[a.episodeId],"Use an existing episode ID."),d.length>1&&ae("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&&ae("AUTHORING_SELECTOR_NOT_FOUND","Action span parent scene was not found.",[s.parent],"Use an existing scene address."),l.length>1&&ae("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&&ae("AUTHORING_SELECTOR_REVERSED","Action span is reversed.",[r.from,r.through],"Put the lower current action index first."),c.index>=f.actions.length&&ae("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 h=`${s.parent}#${u}`;o.has(h)&&ae("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}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:Ht}),i.push([e.episodes.indexOf(p),p.scenes.indexOf(f),s.index])}return wr(i,"Action span"),Si("action-span",n)}function fu(e,t){let n=v(t.output).trim();n||ae("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",G);let o=Zw(t),i=v(t.in).trim(),r=lu.resolve(n);if(o.version===4){let p=cu(mn(o),e,i);return _s(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}},J]}let s=Nt(o),c;e==="script"?c=tu(s):e==="episodes"?c=Ww(s,i):e==="episode-spans"?c=Xw(s,i):e==="scenes"?c=t_(s,i):e==="scene-spans"?c=n_(s,i):c=o_(s,i);let a=ou(c);return _s(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}},J]}import*as Wc from"node:crypto";import*as Sr from"node:fs";import*as Gu from"node:path";function Q(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o[0],data:{actual:n}})}function ce(e){return`line ${e.line}, column ${e.column}`}function vs(e){if(Array.isArray(e))return e.map(vs);if(e!==null&&typeof e=="object"){let t={};for(let[n,o]of Object.entries(e).sort(([i],[r])=>i.localeCompare(r)))t[n]=vs(o);return t}return e}function co(e,t){return JSON.stringify(vs(e))===JSON.stringify(vs(t))}function _r(e,t){return"actor_id"in t?t.actor_id:"location_id"in t?t.location_id:t.prop_id}function i_(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function r_(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function s_(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 xu(e,t,n){return r_(e,t).find(o=>_r(t,o)===n)}function a_(e,t){for(let n of["actor","location","prop"]){let o=xu(e,n,t);if(o!==void 0)return{kind:n,value:o}}}function c_(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&&Q("AUTHORING_DECLARATION_ORDER","Asset declarations must precede standalone state declarations.",[ce(a.source)],["Move standalone states to the end of <create>."]);let p=a.declarationKind;o[p]<i&&Q("AUTHORING_DECLARATION_ORDER","Asset declaration groups are out of canonical order.",[ce(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}:${_r(p,l)}`;c.has(u)&&Q("AUTHORING_DECLARATION_DUPLICATE","Asset declaration is duplicated.",[ce(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&&_r(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=_r(a.kind,a.value);(a.value.states.length===0||a.value.states[0].state_id!=="default")&&Q("AUTHORING_DEFAULT_STATE_REQUIRED","Every declared asset must be immediately followed by its states, beginning with default.",[ce(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&&Q("AUTHORING_DEFAULT_STATE_DUPLICATE","Every declared asset must contain exactly one default state.",[ce(a.source),`${a.kind}:${d}`],["Keep exactly one default state."]);let p=a.value.aliases??[];(new Set(p).size!==p.length||p.includes(i_(a.kind,a.value)))&&Q("AUTHORING_ALIAS_INVALID","Asset aliases must be unique and must differ from the canonical name.",[ce(a.source),`${a.kind}:${d}`],["Remove duplicate aliases and the canonical name from aliases."])}return{assets:t,states:n}}function d_(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function Eu(e,t){let n=c_(t),o=d_();for(let i of n.assets){let r=_r(i.kind,i.value),s=`${i.kind}:${r}`,c=a_(e,r);if(c!==void 0){if(c.kind===i.kind&&co(c.value,i.value)){o.existingAssets.push(s),o.existingStates.push(...i.value.states.map(a=>`${s}/${a.state_id}`));continue}Q("AUTHORING_ASSET_CONFLICT","Create-only asset declaration conflicts with an existing asset.",[ce(i.source),`${i.kind}:${r}`],["Use the existing identical definition or change it with an explicit mutation verb."])}s_(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=xu(e,i.kind,i.ownerId);r===void 0&&Q("AUTHORING_STATE_OWNER_NOT_FOUND","Standalone state owner does not exist.",[ce(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&&!co(s,i.value)&&Q("AUTHORING_STATE_CONFLICT","Create-only state declaration conflicts with an existing state on the same asset.",[ce(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 mu(e){return{episodes:0,scenes:e===void 0?0:1,actions:e?.actions.length??0}}function gu(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 Rs(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 hu(e){return{episodes:0,scenes:e.length,actions:e.reduce((t,n)=>t+n.actions.length,0)}}function xr(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 Cc(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&&Q("AUTHORING_SCENE_REF_UNMATERIALIZED","Every scene asset reference in an authored block must bind a state.",[ce(t),...n],["Add the concrete state ID to every location, cast, and prop record."])}function Pc(e,t){for(let n of e.scenes)Cc(n,t)}function Go(e,t){return e.episodes.findIndex(n=>n.episode_id===t)}function Ms(e,t){return e.scenes.findIndex(n=>n.scene_id===t)}function Su(e,t,n){let o=Go(e,t);o<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Episode target does not exist.",[t],["Inspect episodes and use an existing parent."]);let i=Ms(e.episodes[o],n);return i<0&&Q("AUTHORING_SCENE_NOT_FOUND","Scene target does not exist.",[`${t}/${n}`],["Inspect scenes and use an existing target."]),[o,i]}function p_(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 Er(e,t){for(let n=1;n<e.length;n+=1)p_(e[n-1].coord,e[n].coord)>=0&&Q("AUTHORING_TARGET_ORDER",t,[ce(e[n].source)],["List replace targets in current document order without duplicates."],G)}function l_(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>{let c=Go(e,s.value.episode_id);return c<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Episode replace target does not exist.",[ce(s.source),s.value.episode_id],["Use --create for a new episode or choose an existing ID."]),{coord:[c],source:s.source}});Er(r,"Episode replace targets are not in document order.")}for(let r of n){Pc(r.value,r.source);let s=Go(e,r.value.episode_id),c=s<0?void 0:e.episodes[s];o==="create"?c!==void 0?co(c,r.value)||Q("AUTHORING_CREATE_CONFLICT","Episode create target already exists with different content.",[ce(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:gu(c),after:gu(r.value),...xr(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 u_(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>({coord:Su(e,s.parent,s.value.scene_id),source:s.source}));Er(r,"Scene replace targets are not in document order.")}for(let r of n){Cc(r.value,r.source);let s=Go(e,r.parent);s<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Scene parent episode does not exist.",[ce(r.source),r.parent],["Use an existing episode parent."]);let c=e.episodes[s],a=t.episodes[s],d=Ms(c,r.value.scene_id),p=d<0?void 0:c.scenes[d];o==="create"?p!==void 0?co(p,r.value)||Q("AUTHORING_CREATE_CONFLICT","Scene create target already exists with different content.",[ce(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&&Q("AUTHORING_SCENE_NOT_FOUND","Scene replace target does not exist.",[ce(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:mu(p),after:mu(r.value),...xr(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 f_(e,t,n){let o=n.map(r=>{let s=Go(e,r.from),c=Go(e,r.through);(s<0||c<0)&&Q("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Episode-span endpoint does not exist.",[ce(r.source),`${r.from}..${r.through}`],["Use existing episode IDs as span endpoints."]),s>c&&Q("AUTHORING_SPAN_REVERSED","Episode-span endpoints are reversed in current document order.",[ce(r.source),`${r.from}..${r.through}`],["Swap from and through."]),r.episodes.length===0&&Q("AUTHORING_EMPTY_SPAN","Episode-span replacement cannot be empty.",[ce(r.source)],["Include at least one complete episode."]);for(let a of r.episodes)Pc(a,r.source);return{target:r,from:s,through:c}});Er(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&&Q("AUTHORING_SPAN_OVERLAP","Episode spans overlap.",[ce(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:Rs(a),after:Rs(r.episodes),...xr(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 m_(e,t,n){let o=n.map(s=>{let c=Go(e,s.parent);c<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Scene-span parent does not exist.",[ce(s.source),s.parent],["Use an existing parent episode."]);let a=e.episodes[c],d=Ms(a,s.from),p=Ms(a,s.through);(d<0||p<0)&&Q("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Scene-span endpoint does not exist in its parent.",[ce(s.source),`${s.parent}:${s.from}..${s.through}`],["Use scene IDs from the same existing episode."]),d>p&&Q("AUTHORING_SPAN_REVERSED","Scene-span endpoints are reversed in current document order.",[ce(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.scenes.length===0&&Q("AUTHORING_EMPTY_SPAN","Scene-span replacement cannot be empty.",[ce(s.source)],["Include at least one complete scene."]);for(let l of s.scenes)Cc(l,s.source);return{target:s,epIndex:c,from:d,through:p}});Er(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&&Q("AUTHORING_SPAN_OVERLAP","Scene spans overlap.",[ce(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:hu(p),after:hu(s.scenes),...xr(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 g_(e,t,n){let o=n.map(s=>{let c=s.parent.indexOf("/");(c<1||c===s.parent.length-1)&&Q("AUTHORING_SCENE_ADDRESS_INVALID","Action-span parent is not a complete scene address.",[ce(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]=Su(e,a,d),f=e.episodes[p].scenes[l];return s.from>s.through&&Q("AUTHORING_SPAN_REVERSED","Action-span endpoints are reversed.",[ce(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.through>=f.actions.length&&Q("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Action-span endpoint is outside the current scene body.",[ce(s.source),`${s.from}..${s.through}`,`actions=${f.actions.length}`],["Use zero-based endpoints within the current body."]),s.actions.length===0&&Q("AUTHORING_EMPTY_SPAN","Action-span replacement cannot be empty.",[ce(s.source)],["Include at least one action."]),{target:s,epIndex:p,scIndex:l,scene:f,from:s.from,through:s.through}});Er(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&&Q("AUTHORING_SPAN_OVERLAP","Action spans overlap.",[ce(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 Iu(e){let t=new Set,n=new Set;for(let o of e.episodes){t.has(o.episode_id)&&Q("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)&&Q("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 h_(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 yu(e,t){return`${e.code}\0${h_(e.path,t)}\0${e.message}`}function y_(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 w_(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 wu(e,t,n){let o=yt(t),i=y_(n),r=()=>({...o,warnings:[...o.warnings,...w_(e,t,i)]});if(o.ok||e!==null&&co(e,t))return r();let s=new Set(e===null?[]:yt(e).errors.map(a=>yu(a,e))),c=o.errors.filter(a=>{if(!s.has(yu(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&&Q("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 _u(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 __(e){let t=e.targets[0];t?.kind!=="script"&&Q("AUTHORING_TARGET_MODE","Script create requires exactly one script target.",[],["Use a single <script> block."],G);for(let i of t.episodes)Pc(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=Eu(n,e.declarations);return Iu(n),{script:n,declarations:o}}function Au(e,t,n){if(t.targetKind==="script"){n!=="create"&&Q("AUTHORING_TARGET_MODE","Script targets support create only.",[n],["Use --create."],G);let a=__(t),d=a.script;e!==null&&!co(e,d)&&Q("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=wu(e,d,t.targets);return{script:d,changed:e===null||!co(e,d),declarations:p,targets:[{kind:"script",address:"global",before:e===null?{episodes:0,scenes:0,actions:0}:Rs(e.episodes),after:Rs(d.episodes),...xr(e?.episodes.map(f=>f.episode_id)??[],d.episodes.map(f=>f.episode_id)),untouchedSiblings:0}],retainedOrphanAssets:_u(d),validation:l}}e===null&&Q("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"&&Q("AUTHORING_TARGET_MODE",`${t.targetKind} supports replace only.`,[n],["Use --replace."],G);let o=structuredClone(e),i=structuredClone(e),r=Eu(i,t.declarations),s;switch(t.targetKind){case"episode":{let a=t.targets.flatMap(d=>d.kind==="episode"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=l_(o,i,a,n);break}case"scene":{let a=t.targets.flatMap(d=>d.kind==="scene"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=u_(o,i,a,n);break}case"episode-span":{let a=t.targets.flatMap(d=>d.kind==="episode-span"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=f_(o,i,a);break}case"scene-span":{let a=t.targets.flatMap(d=>d.kind==="scene-span"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=m_(o,i,a);break}case"action-span":{let a=t.targets.flatMap(d=>d.kind==="action-span"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=g_(o,i,a);break}default:Q("AUTHORING_TARGET_MODE","Unsupported authoring target.",[t.targetKind],["Use a supported homogeneous target kind."])}Iu(i);let c=wu(e,i,t.targets);return{script:i,changed:!co(e,i),declarations:r,targets:s,retainedOrphanAssets:_u(i),validation:c}}function $(e,t,n,o){return new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",hint:o,data:{actual:[`line ${t.line}, column ${t.column}: ${n}`]}})}function Tc(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 $("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 $("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
|
|
128
|
+
`,targetCount:i}}function ae(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o,data:{actual:n}})}function Ww(e){let t=ke(e),n;try{n=JSON.parse(lu.readFileSync(t,"utf-8"))}catch(o){ae("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 As(n)}function wr(e){return e||ae("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||ae("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&&ae("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)&&ae("AUTHORING_SELECTOR_INVALID","Selector range endpoint is empty.",[n],"Provide both endpoints.",G),{from:i,through:r}})}function vs(e,t,n){if(t.from==="*"&&t.through==="*")return e.length===0&&ae("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)&&ae("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)&&ae("AUTHORING_SELECTOR_NOT_FOUND",`${n} selector endpoint was not found.`,[t.from,t.through],"Use IDs from the current local script."),o>i&&ae("AUTHORING_SELECTOR_REVERSED",`${n} selector is reversed in current document order.`,[t.from,t.through],"Put the earlier document endpoint first."),[o,i]}function fu(e,t){let n=new Set;for(let o of e){let i=t(o);n.has(i)&&ae("AUTHORING_SELECTOR_OVERLAP","Selector regions overlap or repeat a target.",[i],"Use non-overlapping regions."),n.add(i)}return e}function _r(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&&ae("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 Xw(e,t){let n=[],o=e.episodes.map(r=>r.episode_id);for(let r of wr(t)){let[s,c]=vs(o,r,"episode");n.push(...e.episodes.slice(s,c+1))}fu(n,r=>r.episode_id),_r(n.map(r=>[o.indexOf(r.episode_id)]),"Episode");let i=n.map(r=>({kind:"episode",value:structuredClone(r),source:zt}));return Ai("episode",i)}function e_(e,t){let n=e.episodes.map(s=>s.episode_id),o=[],i=new Set,r=[];for(let s of wr(t)){let[c,a]=vs(n,s,"episode");for(let d=c;d<=a;d+=1)i.has(d)&&ae("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:zt}),r.push([c])}return _r(r,"Episode span"),Ai("episode-span",o)}function t_(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function Uc(e){return`${e.episodeId}/${e.scene.scene_id}`}function n_(e,t){let n=t_(e),o=n.map(Uc),i=[];for(let s of wr(t)){let[c,a]=vs(o,s,"scene");i.push(...n.slice(c,a+1))}fu(i,Uc),_r(i.map(s=>[o.indexOf(Uc(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:zt}));return Ai("scene",r)}function Cc(e){let t=/^([^/#]+)\/([^/#]+)$/.exec(e);return t||ae("AUTHORING_SELECTOR_INVALID","Scene selector endpoint must be ep/scn.",[e],"Use ep_ID/scn_ID."),{episodeId:t[1],sceneId:t[2]}}function o_(e,t){let n=[],o=new Set,i=[];for(let r of wr(t)){(r.from==="*"||r.through==="*")&&ae("AUTHORING_SELECTOR_INVALID","A scene span wildcard has no single parent.",["*"],"Use one explicit region per episode.");let s=Cc(r.from),c=Cc(r.through);s.episodeId!==c.episodeId&&ae("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&&ae("AUTHORING_SELECTOR_NOT_FOUND","Scene span parent episode was not found.",[s.episodeId],"Use an existing episode ID."),a.length>1&&ae("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]=vs(p,{from:s.sceneId,through:c.sceneId},"scene");for(let u=l;u<=f;u+=1){let h=`${d.episode_id}/${p[u]}`;o.has(h)&&ae("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}n.push({kind:"scene-span",parent:d.episode_id,from:p[l],through:p[f],scenes:structuredClone(d.scenes.slice(l,f+1)),source:zt}),i.push([e.episodes.indexOf(d),l])}return _r(i,"Scene span"),Ai("scene-span",n)}function pu(e){let t=/^([^/#]+\/[^/#]+)#(\d+)$/.exec(e);t||ae("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)||ae("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 i_(e,t){let n=[],o=new Set,i=[];for(let r of wr(t)){(r.from==="*"||r.through==="*")&&ae("AUTHORING_SELECTOR_INVALID","An action span wildcard has no single parent.",["*"],"Use one explicit region per scene.");let s=pu(r.from),c=pu(r.through);s.parent!==c.parent&&ae("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=Cc(s.parent),d=e.episodes.filter(u=>u.episode_id===a.episodeId);d.length===0&&ae("AUTHORING_SELECTOR_NOT_FOUND","Action span parent episode was not found.",[a.episodeId],"Use an existing episode ID."),d.length>1&&ae("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&&ae("AUTHORING_SELECTOR_NOT_FOUND","Action span parent scene was not found.",[s.parent],"Use an existing scene address."),l.length>1&&ae("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&&ae("AUTHORING_SELECTOR_REVERSED","Action span is reversed.",[r.from,r.through],"Put the lower current action index first."),c.index>=f.actions.length&&ae("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 h=`${s.parent}#${u}`;o.has(h)&&ae("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}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:zt}),i.push([e.episodes.indexOf(p),p.scenes.indexOf(f),s.index])}return _r(i,"Action span"),Ai("action-span",n)}function mu(e,t){let n=v(t.output).trim();n||ae("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",G);let o=Ww(t),i=v(t.in).trim(),r=uu.resolve(n);if(o.version===4){let p=du(fn(o),e,i);return xs(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}},J]}let s=Lt(o),c;e==="script"?c=nu(s):e==="episodes"?c=Xw(s,i):e==="episode-spans"?c=e_(s,i):e==="scenes"?c=n_(s,i):e==="scene-spans"?c=o_(s,i):c=i_(s,i);let a=iu(c);return xs(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}},J]}import*as Xc from"node:crypto";import*as Ir from"node:fs";import*as Ju from"node:path";function Q(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o[0],data:{actual:n}})}function ce(e){return`line ${e.line}, column ${e.column}`}function Rs(e){if(Array.isArray(e))return e.map(Rs);if(e!==null&&typeof e=="object"){let t={};for(let[n,o]of Object.entries(e).sort(([i],[r])=>i.localeCompare(r)))t[n]=Rs(o);return t}return e}function co(e,t){return JSON.stringify(Rs(e))===JSON.stringify(Rs(t))}function xr(e,t){return"actor_id"in t?t.actor_id:"location_id"in t?t.location_id:t.prop_id}function r_(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function s_(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function a_(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 Eu(e,t,n){return s_(e,t).find(o=>xr(t,o)===n)}function c_(e,t){for(let n of["actor","location","prop"]){let o=Eu(e,n,t);if(o!==void 0)return{kind:n,value:o}}}function d_(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&&Q("AUTHORING_DECLARATION_ORDER","Asset declarations must precede standalone state declarations.",[ce(a.source)],["Move standalone states to the end of <create>."]);let p=a.declarationKind;o[p]<i&&Q("AUTHORING_DECLARATION_ORDER","Asset declaration groups are out of canonical order.",[ce(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}:${xr(p,l)}`;c.has(u)&&Q("AUTHORING_DECLARATION_DUPLICATE","Asset declaration is duplicated.",[ce(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&&xr(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=xr(a.kind,a.value);(a.value.states.length===0||a.value.states[0].state_id!=="default")&&Q("AUTHORING_DEFAULT_STATE_REQUIRED","Every declared asset must be immediately followed by its states, beginning with default.",[ce(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&&Q("AUTHORING_DEFAULT_STATE_DUPLICATE","Every declared asset must contain exactly one default state.",[ce(a.source),`${a.kind}:${d}`],["Keep exactly one default state."]);let p=a.value.aliases??[];(new Set(p).size!==p.length||p.includes(r_(a.kind,a.value)))&&Q("AUTHORING_ALIAS_INVALID","Asset aliases must be unique and must differ from the canonical name.",[ce(a.source),`${a.kind}:${d}`],["Remove duplicate aliases and the canonical name from aliases."])}return{assets:t,states:n}}function p_(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function Su(e,t){let n=d_(t),o=p_();for(let i of n.assets){let r=xr(i.kind,i.value),s=`${i.kind}:${r}`,c=c_(e,r);if(c!==void 0){if(c.kind===i.kind&&co(c.value,i.value)){o.existingAssets.push(s),o.existingStates.push(...i.value.states.map(a=>`${s}/${a.state_id}`));continue}Q("AUTHORING_ASSET_CONFLICT","Create-only asset declaration conflicts with an existing asset.",[ce(i.source),`${i.kind}:${r}`],["Use the existing identical definition or change it with an explicit mutation verb."])}a_(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=Eu(e,i.kind,i.ownerId);r===void 0&&Q("AUTHORING_STATE_OWNER_NOT_FOUND","Standalone state owner does not exist.",[ce(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&&!co(s,i.value)&&Q("AUTHORING_STATE_CONFLICT","Create-only state declaration conflicts with an existing state on the same asset.",[ce(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 gu(e){return{episodes:0,scenes:e===void 0?0:1,actions:e?.actions.length??0}}function hu(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 Ms(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 yu(e){return{episodes:0,scenes:e.length,actions:e.reduce((t,n)=>t+n.actions.length,0)}}function Er(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 Pc(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&&Q("AUTHORING_SCENE_REF_UNMATERIALIZED","Every scene asset reference in an authored block must bind a state.",[ce(t),...n],["Add the concrete state ID to every location, cast, and prop record."])}function Tc(e,t){for(let n of e.scenes)Pc(n,t)}function Go(e,t){return e.episodes.findIndex(n=>n.episode_id===t)}function Ls(e,t){return e.scenes.findIndex(n=>n.scene_id===t)}function Iu(e,t,n){let o=Go(e,t);o<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Episode target does not exist.",[t],["Inspect episodes and use an existing parent."]);let i=Ls(e.episodes[o],n);return i<0&&Q("AUTHORING_SCENE_NOT_FOUND","Scene target does not exist.",[`${t}/${n}`],["Inspect scenes and use an existing target."]),[o,i]}function l_(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 Sr(e,t){for(let n=1;n<e.length;n+=1)l_(e[n-1].coord,e[n].coord)>=0&&Q("AUTHORING_TARGET_ORDER",t,[ce(e[n].source)],["List replace targets in current document order without duplicates."],G)}function u_(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>{let c=Go(e,s.value.episode_id);return c<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Episode replace target does not exist.",[ce(s.source),s.value.episode_id],["Use --create for a new episode or choose an existing ID."]),{coord:[c],source:s.source}});Sr(r,"Episode replace targets are not in document order.")}for(let r of n){Tc(r.value,r.source);let s=Go(e,r.value.episode_id),c=s<0?void 0:e.episodes[s];o==="create"?c!==void 0?co(c,r.value)||Q("AUTHORING_CREATE_CONFLICT","Episode create target already exists with different content.",[ce(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:hu(c),after:hu(r.value),...Er(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 f_(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>({coord:Iu(e,s.parent,s.value.scene_id),source:s.source}));Sr(r,"Scene replace targets are not in document order.")}for(let r of n){Pc(r.value,r.source);let s=Go(e,r.parent);s<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Scene parent episode does not exist.",[ce(r.source),r.parent],["Use an existing episode parent."]);let c=e.episodes[s],a=t.episodes[s],d=Ls(c,r.value.scene_id),p=d<0?void 0:c.scenes[d];o==="create"?p!==void 0?co(p,r.value)||Q("AUTHORING_CREATE_CONFLICT","Scene create target already exists with different content.",[ce(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&&Q("AUTHORING_SCENE_NOT_FOUND","Scene replace target does not exist.",[ce(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:gu(p),after:gu(r.value),...Er(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 m_(e,t,n){let o=n.map(r=>{let s=Go(e,r.from),c=Go(e,r.through);(s<0||c<0)&&Q("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Episode-span endpoint does not exist.",[ce(r.source),`${r.from}..${r.through}`],["Use existing episode IDs as span endpoints."]),s>c&&Q("AUTHORING_SPAN_REVERSED","Episode-span endpoints are reversed in current document order.",[ce(r.source),`${r.from}..${r.through}`],["Swap from and through."]),r.episodes.length===0&&Q("AUTHORING_EMPTY_SPAN","Episode-span replacement cannot be empty.",[ce(r.source)],["Include at least one complete episode."]);for(let a of r.episodes)Tc(a,r.source);return{target:r,from:s,through:c}});Sr(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&&Q("AUTHORING_SPAN_OVERLAP","Episode spans overlap.",[ce(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:Ms(a),after:Ms(r.episodes),...Er(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 g_(e,t,n){let o=n.map(s=>{let c=Go(e,s.parent);c<0&&Q("AUTHORING_EPISODE_NOT_FOUND","Scene-span parent does not exist.",[ce(s.source),s.parent],["Use an existing parent episode."]);let a=e.episodes[c],d=Ls(a,s.from),p=Ls(a,s.through);(d<0||p<0)&&Q("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Scene-span endpoint does not exist in its parent.",[ce(s.source),`${s.parent}:${s.from}..${s.through}`],["Use scene IDs from the same existing episode."]),d>p&&Q("AUTHORING_SPAN_REVERSED","Scene-span endpoints are reversed in current document order.",[ce(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.scenes.length===0&&Q("AUTHORING_EMPTY_SPAN","Scene-span replacement cannot be empty.",[ce(s.source)],["Include at least one complete scene."]);for(let l of s.scenes)Pc(l,s.source);return{target:s,epIndex:c,from:d,through:p}});Sr(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&&Q("AUTHORING_SPAN_OVERLAP","Scene spans overlap.",[ce(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:yu(p),after:yu(s.scenes),...Er(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 h_(e,t,n){let o=n.map(s=>{let c=s.parent.indexOf("/");(c<1||c===s.parent.length-1)&&Q("AUTHORING_SCENE_ADDRESS_INVALID","Action-span parent is not a complete scene address.",[ce(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]=Iu(e,a,d),f=e.episodes[p].scenes[l];return s.from>s.through&&Q("AUTHORING_SPAN_REVERSED","Action-span endpoints are reversed.",[ce(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.through>=f.actions.length&&Q("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Action-span endpoint is outside the current scene body.",[ce(s.source),`${s.from}..${s.through}`,`actions=${f.actions.length}`],["Use zero-based endpoints within the current body."]),s.actions.length===0&&Q("AUTHORING_EMPTY_SPAN","Action-span replacement cannot be empty.",[ce(s.source)],["Include at least one action."]),{target:s,epIndex:p,scIndex:l,scene:f,from:s.from,through:s.through}});Sr(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&&Q("AUTHORING_SPAN_OVERLAP","Action spans overlap.",[ce(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 Au(e){let t=new Set,n=new Set;for(let o of e.episodes){t.has(o.episode_id)&&Q("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)&&Q("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 y_(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 wu(e,t){return`${e.code}\0${y_(e.path,t)}\0${e.message}`}function w_(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 __(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 _u(e,t,n){let o=mt(t),i=w_(n),r=()=>({...o,warnings:[...o.warnings,...__(e,t,i)]});if(o.ok||e!==null&&co(e,t))return r();let s=new Set(e===null?[]:mt(e).errors.map(a=>wu(a,e))),c=o.errors.filter(a=>{if(!s.has(wu(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&&Q("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 xu(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 x_(e){let t=e.targets[0];t?.kind!=="script"&&Q("AUTHORING_TARGET_MODE","Script create requires exactly one script target.",[],["Use a single <script> block."],G);for(let i of t.episodes)Tc(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=Su(n,e.declarations);return Au(n),{script:n,declarations:o}}function ku(e,t,n){if(t.targetKind==="script"){n!=="create"&&Q("AUTHORING_TARGET_MODE","Script targets support create only.",[n],["Use --create."],G);let a=x_(t),d=a.script;e!==null&&!co(e,d)&&Q("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=_u(e,d,t.targets);return{script:d,changed:e===null||!co(e,d),declarations:p,targets:[{kind:"script",address:"global",before:e===null?{episodes:0,scenes:0,actions:0}:Ms(e.episodes),after:Ms(d.episodes),...Er(e?.episodes.map(f=>f.episode_id)??[],d.episodes.map(f=>f.episode_id)),untouchedSiblings:0}],retainedOrphanAssets:xu(d),validation:l}}e===null&&Q("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"&&Q("AUTHORING_TARGET_MODE",`${t.targetKind} supports replace only.`,[n],["Use --replace."],G);let o=structuredClone(e),i=structuredClone(e),r=Su(i,t.declarations),s;switch(t.targetKind){case"episode":{let a=t.targets.flatMap(d=>d.kind==="episode"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=u_(o,i,a,n);break}case"scene":{let a=t.targets.flatMap(d=>d.kind==="scene"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=f_(o,i,a,n);break}case"episode-span":{let a=t.targets.flatMap(d=>d.kind==="episode-span"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=m_(o,i,a);break}case"scene-span":{let a=t.targets.flatMap(d=>d.kind==="scene-span"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=g_(o,i,a);break}case"action-span":{let a=t.targets.flatMap(d=>d.kind==="action-span"?[d]:[]);a.length!==t.targets.length&&Q("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],G),s=h_(o,i,a);break}default:Q("AUTHORING_TARGET_MODE","Unsupported authoring target.",[t.targetKind],["Use a supported homogeneous target kind."])}Au(i);let c=_u(e,i,t.targets);return{script:i,changed:!co(e,i),declarations:r,targets:s,retainedOrphanAssets:xu(i),validation:c}}function $(e,t,n,o){return new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",hint:o,data:{actual:[`line ${t.line}, column ${t.column}: ${n}`]}})}function Vc(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 $("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 $("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 bi(e,t){let n={line:t,column:Math.max(1,e.indexOf("[")+1)},o=e.trimStart();if(!o.startsWith("["))throw $("Expected a bracket record.",n,e,"Start the semantic line with a known [type] record.");let i=-1,r=!1;for(let h=1;h<o.length;h+=1){let y=o[h];if(r){r=!1;continue}if(y==="\\"){r=!0;continue}if(y==="]"){i=h;break}}if(i<0)throw $("Bracket record is not closed.",n,e,"Add the closing ].");let s=o.slice(1,i),c=[],a="";r=!1;for(let h=0;h<s.length;h+=1){let y=s[h];r?(a+=`\\${y}`,r=!1):y==="\\"?r=!0:y==="|"?(c.push(a),a=""):a+=y}r&&(a+="\\"),c.push(a);let[d,...p]=c,l=Vc(d??"",n,!0);if(!l)throw $("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(h=>Vc(h,n,!0)),content:Vc(u,{line:t,column:i+2},!1),source:n}}function ht(){return{extend:{},extendPresent:!1,aliases:[],aliasesPresent:!1,phase:"extend"}}function $n(e){return e.extendPresent||e.aliasesPresent||e.prompt!==void 0}function yt(e){return e.extendPresent?e.extend:void 0}function $c(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every($c):typeof e!="object"?!1:Object.values(e).every($c)}function Dc(e){if(Array.isArray(e))return e.map(Dc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Dc(e[n]);return t}return e}function bu(e){return e==="featured"||e==="background"}function E_(e){return e==="\u4E3B\u89D2"||e==="\u914D\u89D2"}function S_(e){return e==="system"||e==="broadcast"||e==="offscreen"||e==="group"}function I_(e){return e==="actor"||e==="location"||e==="prop"}function Ou(e,t,n,o){if(!/^\d+$/.test(e))throw $(`${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 $(`${n} is out of range.`,t,e,`Use ${o?"a non-negative":"a positive"} safe integer.`);return i}function A_(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 $("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 $("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 $("Block attribute syntax is invalid.",o,a,"Use unquoted canonical key=value attributes.");if(s.has(d[1]))throw $("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 hn(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 $(`Attributes for <${e.name}> are invalid.`,e.source,`missing=${r.join(",")||"-"} unknown=${i.join(",")||"-"}`,`Use ${[...t,...n].map(s=>`${s}=...`).join(" ")}.`)}function k_(e,t){if(!e)throw $("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 $("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(!Po.has(r)||!S_(r))throw $("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 b_(e,t){let o={act:"action",dlg:"dialogue",think:"inner_thought",trans:"transition"}[e.type];if(o===void 0||!jt.has(o))throw $("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 $("Speaker record slots are invalid.",e.source,e.slots.join("|"),`Use [${e.type}|speaker|emotion?].`);i.speaker=k_(e.slots[0],e.source),e.slots.length===2&&(i.emotion=e.slots[1])}else{if(e.slots.length>1)throw $("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=yt(t);if(r!==void 0&&(i.extend=r),t.aliasesPresent)throw $("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 Gc=class{lines;index=0;constructor(t){this.lines=t.replace(/\r\n?/g,`
|
|
130
130
|
`).split(`
|
|
131
|
-
`)}parse(){this.skipBlank();let t=this.takeOpen("authoring");if(yn(t,["version"]),t.attrs.get("version")!=="1")throw $("Authoring version is unsupported.",t.source,t.attrs.get("version")??"<missing>","Use <authoring version=1>.");let n=[],o=[],i=!1,r=_t();for(;;){if(this.skipBlank(),this.peekClose("authoring")){$n(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 $("<create> must precede every target.",a.tag.source,"<create>","Move the single <create> block before the targets.");$n(r)&&this.throwUnsupportedModifiers(r,"create"),n.push(...this.parseCreate()),i=!0;continue}i=!0,o.push(this.parseTarget(r)),r=_t()}if(this.skipBlank(),this.index<this.lines.length){let a={line:this.index+1,column:1};throw $("Content exists after </authoring>.",a,this.lines[this.index],"Remove content outside the root block.")}if(o.length===0)throw $("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 $("Authoring targets are not homogeneous.",c.source,c.kind,`Keep only ${s} targets in this file.`);if(s==="script"&&o.length!==1)throw $("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");yn(t,[]);let n=[],o=_t();for(;;){if(this.skipBlank(),this.peekClose("create"))return $n(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 $("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||!Mt.has(c)||!ku(c))throw $("Actor declaration is invalid.",i.source,i.slots.join("|"),"Provide id, name, and featured|background importance.");if(a!==void 0&&(!eo.has(a)||!x_(a)))throw $("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=xt(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=_t();continue}if(i.type==="location"||i.type==="prop"){if(i.slots.length!==3)throw $(`${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||!Mt.has(c)||!ku(c))throw $(`${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=xt(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=_t();continue}if(i.type==="state"){if(i.slots.length!==3)throw $("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||!S_(d)||!s||!c)throw $("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=xt(o);l!==void 0&&(p.extend=l),n.push({declarationKind:"state",ownerKind:d,ownerId:a[2],value:p,source:i.source}),o=_t();continue}throw $("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 $("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,...xt(t)?{extend:xt(t)}:{}};case"episode-span":return this.parseEpisodeSpan(t);case"scene":return yn(n,["id","parent"]),{kind:"scene",parent:n.attrs.get("parent"),value:this.parseScene(t,!0),source:n.source,...xt(t)?{extend:xt(t)}:{}};case"scene-span":return this.parseSceneSpan(t);case"action-span":return this.parseActionSpan(t);default:throw $("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");yn(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=_t();for(;;){if(this.skipBlank(),this.peekClose("script")){$n(d)&&this.throwDangling(d),this.takeClose("script");break}let h=this.peekSemantic();if(h?.record!==void 0){let y=this.takeRecord();if(y.type==="extensions"||y.type==="extend"||y.type==="aliases"||y.type==="alias"||y.type==="prompt"){d=this.addModifier(d,y);continue}$n(d)&&this.throwUnsupportedModifiers(d,y.type);let m=o.indexOf(y.type),w=y.type==="main-character";if(a||m<0||m<c||!w&&i.has(y.type))throw $("Metadata record in <script> is invalid or out of order.",y.source,y.type,`Use ${o.join(", ")} in canonical order before episode blocks.`);if(c=m,y.type==="main-characters"){if(y.slots.length!==0||y.content!=="")throw $("Main characters marker is invalid.",y.source,y.content,"Use [main-characters] with no slots or content.");i.set(y.type,"")}else if(w){if(y.slots.length!==2||!y.slots[0]||!y.slots[1]||y.content!=="")throw $("Main character record is invalid.",y.source,y.slots.join("|"),"Use [main-character|name|role] with no content.");r.push({name:y.slots[0],role:y.slots[1]})}else{if(y.slots.length!==0)throw $("Script metadata record has unexpected slots.",y.source,y.slots.join("|"),`Use [${y.type}] content.`);i.set(y.type,y.content)}continue}if(h?.tag===void 0||h.tag.closing||h.tag.name!=="episode"){let y=h?.tag?.source??{line:this.index+1,column:1};throw $("Unexpected member in <script>.",y,this.lines[this.index]??"<eof>","Use metadata records followed by <episode> blocks.")}a=!0,s.push(this.parseEpisode(d)),d=_t()}let p=this.requiredMetadata(i,"title",n.source),l=this.requiredMetadata(i,"worldview",n.source),f=this.requiredMetadata(i,"style",n.source),u=xt(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");yn(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=xt(t);return r!==void 0&&(i.extend=r),i}parseScene(t,n){let o=this.takeOpen("scene");yn(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 $("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 h=f?.tag?.source??{line:this.index+1,column:1};throw $("Only scene records and <body> are allowed here.",h,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 $("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 $("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 $("Location record is out of order or invalid.",u.source,u.slots.join("|"),"Place exactly one [location|id?|state?] before cast.");a="location";let h=u.slots[0];h===void 0||h===""?r=null:r=u.slots.length===2?{location_id:h,state_id:u.slots[1]}:{location_id:h};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 $("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 $("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 $("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 $("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 $("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=xt(t);return l!==void 0&&(p.extend=l),p}parseBody(){let t=this.takeOpen("body");yn(t,[]);let n=[],o=_t();for(;;){if(this.skipBlank(),this.peekClose("body"))return $n(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(k_(i,o)),o=_t()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");yn(n,["from","through"]);let o=this.parseOnlyChildren("episode-span","episode",r=>this.parseEpisode(r)),i=xt(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");yn(n,["parent","from","through"]);let o=this.parseOnlyChildren("scene-span","scene",r=>this.parseScene(r,!1)),i=xt(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");yn(n,["parent","from","through"]),this.skipBlank();let o=this.parseBody();this.skipBlank(),this.takeClose("action-span");let i=xt(t);return{kind:"action-span",parent:n.attrs.get("parent"),from:bu(n.attrs.get("from"),n.source,"action-span from",!0),through:bu(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=_t();for(;;){if(this.skipBlank(),this.peekClose(t))return $n(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}$n(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 $(`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 $(`Unexpected member in <${t}>.`,f,this.lines[this.index]??"<eof>",`Use metadata records followed by <${o}> blocks.`)}a=!0,s.push(i(d)),d=_t()}}parseOnlyChildren(t,n,o){let i=[],r=_t();for(;;){if(this.skipBlank(),this.peekClose(t))return $n(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 $(`Only <${n}> children are allowed in <${t}>.`,c,this.lines[this.index]??"<eof>",`Add complete <${n}> blocks.`)}i.push(o(r)),r=_t()}}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 $("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 $("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 $("Extend key is duplicated.",n.source,i,"Keep one value for each extension key.");let r;try{r=JSON.parse(n.content)}catch{throw $("Extension value is not valid JSON.",n.source,n.content,"Use one canonical JSON value.")}if(!Vc(r))throw $("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]=$c(r),o}if(n.type==="aliases"){if(o.phase!=="extend"||o.aliasesPresent||n.slots.length!==0||n.content!=="")throw $("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 $("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 $("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 $("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 $("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 $("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 $(`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=I_(t,this.index+1);if(n!==null)return{tag:n};if(t.trimStart().startsWith("["))return{record:Ai(t,this.index+1)};let o={line:this.index+1,column:Math.max(1,t.search(/\S/)+1)};throw $("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 $("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 $(`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 $(`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 $(`Unexpected end of file inside <${t}>.`,{line:this.lines.length,column:1},"<eof>",`Add </${t}>.`)}throwDangling(t){throw $("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 $("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 Ou(e){return new Dc(e).parse()}function M(e,t,n){throw new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function Kc(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==="")&&M("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]))&&M("Tag attributes are invalid.",t,a),r.set(d[1],d[2])}return{name:i[1],closing:!1,attrs:r,line:t}}function Ve(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)&&M("Tag attributes do not match the canonical grammar.",e.line,[...r.map(s=>`missing:${s}`),...i.map(s=>`unknown:${s}`)].join(","))}var jc=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||M("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=Kc(o.raw,o.line);return(!i||i.name!==t||i.closing!==n)&&M(`Expected ${n?"</":"<"}${t}>.`,o.line,o.raw),i}record(){let t=this.take();return Ai(t.raw,t.line)}nextTag(){let t=this.peek();return Kc(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?Ai(t.raw,t.line):null}};function zc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(zc):typeof e=="object"&&Object.values(e).every(zc)}function Jo(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]))&&M("extend record is invalid or duplicated.",r.source.line,r.type);let s=r.slots[0];i!==null&&i>=s&&M("extend keys must use ascending canonical order.",r.source.line,s);let c;try{c=JSON.parse(r.content)}catch{M("extend content must be JSON.",r.source.line,r.content)}zc(c)||M("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&&M("alias takes no slots.",i.source.line,i.type),i.content===""&&M("alias must not be empty.",i.source.line,i.type),o.includes(i.content)&&M("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===""))&&M("prompt requires non-empty target, process, and contrast.",o.source.line,o.type);let i=o.slots[0];!V("actor",i)&&!V("location",i)&&!V("prop",i)&&M("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 Gc(e,t){return e!=="featured"&&e!=="background"&&M("Importance is invalid.",t,e),e}function b_(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&M("Role type is invalid.",t,e),e}function Fc(e,t){return e==="default"||V("state",e)?e:M("State ID is invalid.",t,e)}function O_(e){let t=e.tag("create",!1);Ve(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")&&M("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=Jo(e),d=e.record();if(d.type==="actor"){r>0&&M("Create declarations are not in canonical order.",d.source.line,d.type),s(d.source.line),a.prompt!==void 0&&M("prompt cannot modify an asset.",d.source.line,d.type),(d.slots.length<3||d.slots.length>4||!V("actor",d.slots[0]))&&M("actor declaration is invalid.",d.source.line,d.type);let p=b_(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:Gc(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)&&M("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&&M("Create declarations are not in canonical order.",d.source.line,d.type),r=p,s(d.source.line),a.prompt!==void 0&&M("prompt cannot modify an asset.",d.source.line,d.type);let l=d.type;if((d.slots.length!==3||(l==="location"?!V("location",d.slots[0]):!V("prop",d.slots[0])))&&M(`${l} declaration is invalid.`,d.source.line,d.type),l==="location"){let f=d.slots[0];V("location",f)||M("location ID is invalid.",d.source.line,f);let u={location_id:f,location_name:d.slots[1],importance:Gc(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)&&M("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];V("prop",f)||M("prop ID is invalid.",d.source.line,f);let u={prop_id:f,prop_name:d.slots[1],importance:Gc(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)&&M("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)&&M("state declaration is invalid.",d.source.line,d.type);let p=d.slots[0],l=o.get(p);l&&i!==p&&M("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:Fc(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"&&M("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),M("Unknown create declaration.",d.source.line,d.type)}s(e.peek().line);let c=e.tag("create",!0);return Ve(c,[]),n}function v_(e,t){let n=e.indexOf("/"),o=n<0?e:e.slice(0,n);if(V("actor",o))return n<0?{actor_id:o}:{actor_id:o,state_id:Fc(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)}:M("Speaker is invalid.",t,e)}function vu(e){let t=Jo(e);t.aliases!==void 0&&M("aliases cannot modify an Action.",e.peek().line,"aliases");let n=e.record();return n.type==="act"||n.type==="trans"?((n.slots.length!==1||!V("action",n.slots[0]))&&M("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"?M("Unknown Action record.",n.source.line,n.type):((n.slots.length!==2&&n.slots.length!==3||!V("action",n.slots[0]))&&M("Speaking Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="dlg"?"dialogue":"inner_thought",speaker:v_(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 Jc(e,t){e.length===0&&M("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>Fc(o,t));return new Set(n).size!==n.length&&M("Scene reference repeats a state.",t,n.join(",")),n.sort()}function Hc(e,t,n,o){Ve(t,n===void 0?["id","parent"]:["id"]);let i=t.attrs.get("id")??"";V("scene",i)||M("Scene ID is invalid.",t.line,i);let r=t.attrs.get("parent")??n;r!==void 0&&!V("episode",r)&&M("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 y=e.record(),m=y.type==="environment"?0:y.type==="location"?1:y.type==="cast"?2:y.type==="prop"?3:-1;m<f&&M("Scene records are not in canonical order.",y.source.line,y.type),f=m,y.type==="environment"?(s!==void 0&&M("Scene environment is duplicated.",y.source.line,y.type),y.slots.length>2&&M("environment has too many slots.",y.source.line,y.type),s={...y.slots[0]===void 0?{}:{space:y.slots[0]},...y.slots[1]===void 0?{}:{time:y.slots[1]}}):y.type==="location"?(c!==void 0&&M("Scene location is duplicated.",y.source.line,y.type),y.slots.length===0?c=null:(V("location",y.slots[0])||M("Location ref ID is invalid.",y.source.line,y.slots[0]),c={location_id:y.slots[0],state_ids:Jc(y.slots.slice(1),y.source.line)})):y.type==="cast"?(V("actor",y.slots[0])||M("Cast ref ID is invalid.",y.source.line,y.slots[0]??""),p.has(y.slots[0])&&M("Scene repeats an actor reference.",y.source.line,y.slots[0]),p.add(y.slots[0]),a.push({actor_id:y.slots[0],state_ids:Jc(y.slots.slice(1),y.source.line)})):y.type==="prop"?(V("prop",y.slots[0])||M("Prop ref ID is invalid.",y.source.line,y.slots[0]??""),l.has(y.slots[0])&&M("Scene repeats a prop reference.",y.source.line,y.slots[0]),l.add(y.slots[0]),d.push({prop_id:y.slots[0],state_ids:Jc(y.slots.slice(1),y.source.line)})):M("Unknown scene header record.",y.source.line,y.type)}c===void 0&&M("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);Ve(u,[]);let h=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)h.push(vu(e));return Ve(e.tag("body",!0),[]),Ve(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:h,...o===void 0?{}:{extend:o}}}}function Qc(e,t,n){Ve(t,["id"]);let o=t.attrs.get("id")??"";V("episode",o)||M("Episode ID is invalid.",t.line,o);let i,r,s=[],c=0;for(;e.nextTag()?.name!=="episode"||e.nextTag()?.closing!==!0;){let a=Jo(e);(a.aliases!==void 0||a.prompt!==void 0)&&M("Invalid episode child modifier.",e.peek().line,"modifier");let d=e.nextTag();if(d?.name==="scene"&&!d.closing){c=2,e.take(),s.push(Hc(e,d,o,a.extend).value);continue}a.extend!==void 0&&M("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&&M("Episode records are not in canonical order.",p.source.line,p.type),c=l,p.type==="title"?(i!==void 0&&M("Episode title is duplicated.",p.source.line,p.type),p.slots.length!==0&&M("Episode title takes no slots.",p.source.line,p.type),i=p.content):p.type==="synopsis"?(r!==void 0&&M("Episode synopsis is duplicated.",p.source.line,p.type),p.slots.length!==0&&M("Episode synopsis takes no slots.",p.source.line,p.type),r=p.content):M("Unknown episode record.",p.source.line,p.type)}return Ve(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 Bc(e,t){let n=e.attrs.get("range")??"",o=n.split("..");return(o.length!==2||!o[0]||!o[1]||!V(t,o[0])||!V(t,o[1]))&&M(`Span range must contain two ${t} IDs.`,e.line,n),[o[0],o[1]]}function R_(e,t,n){Ve(t,[]);let o,i,r,s,c,a,d,p,l=[],f=0;for(;e.nextTag()?.name!=="script"||e.nextTag()?.closing!==!0;){let u=Jo(e);(u.aliases!==void 0||u.prompt!==void 0)&&M("Invalid script child modifier.",e.peek().line,"modifier");let h=e.nextTag();if(h?.name==="episode"&&!h.closing){f=8,e.take(),l.push(Qc(e,h,u.extend));continue}u.extend!==void 0&&M("extend must precede an episode here.",e.peek().line,"extend");let y=e.record(),m=y.type==="title"?0:y.type==="worldview"?1:y.type==="worldview-raw"?2:y.type==="style"?3:y.type==="synopsis"?4:y.type==="logline"?5:y.type==="theme"?6:y.type==="main-characters"||y.type==="main-character"?7:-1;m<f&&M("Script records are not in canonical order.",y.source.line,y.type),f=m,y.type!=="main-character"&&y.slots.length!==0&&M("Script metadata record takes no slots.",y.source.line,y.type),y.type==="title"?(o!==void 0&&M("Script title is duplicated.",y.source.line,y.type),o=y.content):y.type==="worldview"?(i!==void 0&&M("Script worldview is duplicated.",y.source.line,y.type),i=y.content):y.type==="worldview-raw"?(r!==void 0&&M("Script worldview-raw is duplicated.",y.source.line,y.type),r=y.content):y.type==="style"?(s!==void 0&&M("Script style is duplicated.",y.source.line,y.type),s=y.content):y.type==="synopsis"?(c!==void 0&&M("Script synopsis is duplicated.",y.source.line,y.type),c=y.content):y.type==="logline"?(a!==void 0&&M("Script logline is duplicated.",y.source.line,y.type),a=y.content):y.type==="theme"?(d!==void 0&&M("Script theme is duplicated.",y.source.line,y.type),d=y.content):y.type==="main-characters"?(p!==void 0&&M("Script main-characters is duplicated.",y.source.line,y.type),p=[]):y.type==="main-character"&&p!==void 0&&y.slots.length===2&&y.content===""?p.push({name:y.slots[0],role:y.slots[1]}):M("Unknown script record.",y.source.line,y.type)}return Ve(e.tag("script",!0),[]),(o===void 0||i===void 0||s===void 0)&&M("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 Ru(e){let t=new jc(e),n=t.tag("authoring",!1);Ve(n,["version"]),n.attrs.get("version")!=="1"&&M("authoring version must be 1.",1,n.attrs.get("version")??"<missing>");let o=t.nextTag()?.name==="create"?O_(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=Jo(t);(s.aliases!==void 0||s.prompt!==void 0)&&M("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=Kc(c.raw,c.line);if((!a||a.closing)&&M("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(R_(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:Qc(t,a,s.extend)});else if(a.name==="scene"){let d=Hc(t,a,void 0,s.extend);d.parent||M("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&&M("A span cannot carry node extensions.",c.line,c.raw),Ve(a,["range"]);let[d,p]=Bc(a,"episode"),l=[];for(;t.nextTag()?.name!=="episode-span"||t.nextTag()?.closing!==!0;){let f=Jo(t);(f.aliases!==void 0||f.prompt!==void 0)&&M("Invalid episode child modifier.",t.peek().line,"modifier");let u=t.tag("episode",!1);l.push(Qc(t,u,f.extend))}Ve(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&&M("A span cannot carry node extensions.",c.line,c.raw),Ve(a,["parent","range"]);let[d,p]=Bc(a,"scene"),l=a.attrs.get("parent")??M("scene-span needs parent.",c.line,c.raw);V("episode",l)||M("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=Jo(t);(u.aliases!==void 0||u.prompt!==void 0)&&M("Invalid scene child modifier.",t.peek().line,"modifier");let h=t.tag("scene",!1);f.push(Hc(t,h,l,u.extend).value)}Ve(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&&M("A span cannot carry node extensions.",c.line,c.raw),Ve(a,["parent","range"]);let[d,p]=Bc(a,"action"),l=a.attrs.get("parent")??M("action-span needs parent.",c.line,c.raw);V("scene",l)||M("action-span parent must be a Scene ID.",c.line,l),Ve(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(vu(t));Ve(t.tag("body",!0),[]),Ve(t.tag("action-span",!0),[]),i.push({kind:"action-span",parent:l,from:d,through:p,values:f})}else M("Unknown authoring target.",c.line,a.name)}Ve(t.tag("authoring",!0),[]),(t.index!==t.lines.length||i.length===0)&&M("Authoring file has trailing content or no targets.",t.peek().line,"<root>");let r=i[0].kind;return i.every(s=>s.kind===r)||M("All targets must have the same kind.",1,r),{declarations:o,targets:i,targetKind:r}}function wn(e){if(Array.isArray(e))return e.map(t=>wn(t));if(te(e)){let t={};for(let n of Object.keys(e).sort())t[n]=wn(e[n]);return t}return e}function Yc(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 Mu(e,t){if(!(t.ok||e!==null&&ac(Le(e),t)))throw new S("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 Ne(e,t){throw new S(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function Zc(e){return{ids:e.map(t=>t.action_id),counts:{episodes:0,scenes:0,actions:e.length}}}function ki(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 po(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 M_(e){return e.kind==="script"?po(e.value.episodes):e.kind==="episode"?po([e.value]):e.kind==="episode-span"?po(e.values):e.kind==="scene"?ki([e.value]):e.kind==="scene-span"?ki(e.values):Zc(e.values)}function L_(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 qc(e,t){return JSON.stringify(wn(e))===JSON.stringify(wn(t))}function Lu(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 Nu(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 Uu(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 Cu(e,t){let n=e===null?[]:Uu(e),o=Uu(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 N_(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Ne("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)&&Ne("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)&&Ne("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||Ne("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Ne("State declaration cannot redefine an existing state.",[`${n.ownerId}/${n.value.state_id}`]),o.states.push(structuredClone(n.value))}}function Qt(e,t,n){let o=e.indexOf(t),i=e.indexOf(n);return(o<0||i<0)&&Ne("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function U_(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"?Qt(o,t.value.episode_id,t.value.episode_id):Qt(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"?Qt(o,t.value.scene_id,t.value.scene_id):Qt(o,t.from,t.through)}let n=e.episodes.flatMap(o=>o.scenes.flatMap(i=>i.actions.map(r=>r.action_id)));return Qt(n,t.from,t.through)}function C_(e,t){let n=-1;for(let o of t){let[i,r]=U_(e,o);i<=n&&Ne("Replace targets must follow current document order without overlap.",[$u(o)]),n=r}}function $u(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 Pu(e,t){if(t.kind==="script")return{...po(e.episodes),siblings:0};if(t.kind==="episode"){let r=gn(e,t.value.episode_id);return{...po(r?[r.episode]:[]),siblings:Math.max(0,e.episodes.length-(r?1:0))}}if(t.kind==="episode-span"){let[r,s]=Qt(e.episodes.map(c=>c.episode_id),t.from,t.through);return{...po(e.episodes.slice(r,s+1)),siblings:e.episodes.length-(s-r+1)}}if(t.kind==="scene"){let r=Vn(e,t.value.scene_id),s=gn(e,t.parent)?.episode;return{...ki(r?[r.scene]:[]),siblings:r?Math.max(0,r.episode.scenes.length-1):s?.scenes.length??0}}if(t.kind==="scene-span"){let r=gn(e,t.parent)?.episode;if(!r)return{...ki([]),siblings:0};let[s,c]=Qt(r.scenes.map(a=>a.scene_id),t.from,t.through);return{...ki(r.scenes.slice(s,c+1)),siblings:r.scenes.length-(c-s+1)}}let n=Vn(e,t.parent)?.scene;if(!n)return{...Zc([]),siblings:0};let[o,i]=Qt(n.actions.map(r=>r.action_id),t.from,t.through);return{...Zc(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function Tu(e,t){let n=M_(e),o=new Set(t.ids),i=new Set(n.ids);return{kind:e.kind,address:$u(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 P_(e,t){if(t.kind==="script"&&Ne("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=gn(e,t.value.episode_id);n||Ne("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]=Qt(e.episodes.map(i=>i.episode_id),t.from,t.through);t.values.length===0&&Ne("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=Vn(e,t.value.scene_id);(!n||n.episode.episode_id!==t.parent)&&Ne("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=gn(e,t.parent)?.episode;n||Ne("Scene span parent was not found.",[t.parent]);let[o,i]=Qt(n.scenes.map(r=>r.scene_id),t.from,t.through);t.values.length===0&&Ne("Scene span replacement cannot be empty.",[t.from,t.through]),n.scenes.splice(o,i-o+1,...structuredClone(t.values))}else{let n=Vn(e,t.parent)?.scene;n||Ne("Action span parent was not found.",[t.parent]);let[o,i]=Qt(n.actions.map(r=>r.action_id),t.from,t.through);t.values.length===0&&Ne("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function T_(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=gn(e,t.parent)?.episode;n||Ne("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Ne("This target kind does not support create against an existing script.",[t.kind])}function Vu(e){if(e.targets.length!==1||e.targets[0].kind!=="script")return Ne("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Ne("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...L_(e.declarations)}}function Du(e,t,n){let o;if(e===null)n!=="create"&&Ne("A missing target requires one script create target.",[n,t.targetKind]),o=Vu(t);else if(n==="create"&&t.targetKind==="script")o=Vu(t),qc(o,e)||Ne("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&C_(e,t.targets),N_(o,t.declarations);let r=t.targets.map(a=>Pu(e,a));if(n==="replace")for(let a of[...t.targets].reverse())P_(o,a);else for(let a of t.targets)T_(o,a);let s=t.targets.map((a,d)=>Tu(a,r[d])),c=Le(o);return Mu(e,c),{script:o,changed:!qc(e,o),validation:c,targets:s,declarations:Lu(e,t.declarations),retainedOrphanAssets:Nu(o),identity:Cu(e,o)}}let i=Le(o);return Mu(e,i),{script:o,changed:e===null||!qc(e,o),validation:i,declarations:Lu(e,t.declarations),retainedOrphanAssets:Nu(o),identity:Cu(e,o),targets:t.targets.map(r=>{let s=e===null?{...po([]),siblings:0}:Pu(e,r);return Tu(r,s)})}}function Bo(e,t){throw new S(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 V_(e){(!e||e==="-")&&Bo("Authoring input must be a named file.",[e||"<missing>"]);let t=Gu.resolve(e),n;try{n=Sr.statSync(t)}catch{throw new S("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()||Bo("Authoring input must be a regular file.",[t]);let o=Sr.readFileSync(t);return{absolutePath:t,bytes:o,text:o.toString("utf-8")}}function $_(e){let t=ur(e);if(t===null)return{script:null,baseline:"missing",fingerprint:t};let n;try{n=JSON.parse(Sr.readFileSync(e,"utf-8"))}catch(i){throw new S("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=Is(n);return{script:o,baseline:De(o),fingerprint:t}}function D_(e){let t=e.create===!0,n=e.replace===!0;return t===n&&Bo("Choose exactly one authoring mode.",[`create=${t}`,`replace=${n}`]),t?"create":"replace"}function Ju(e){return`sha256:${he(JSON.stringify(e))}`}function G_(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 J_(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 B_(e,t,n,o,i){let r=Ru(t.text),s=i.script===null?null:mn(i.script),c=Du(s,r,n),a=`sha256:${Wc.createHash("sha256").update(t.bytes).digest("hex")}`,d={version:1,sourceDigest:a,mode:n,targetKind:r.targetKind,targets:c.targets.map(m=>m.address),baseline:i.baseline,plan:{targets:c.targets,declarations:c.declarations,retainedOrphanAssets:c.retainedOrphanAssets,identity:c.identity,validation:c.validation}},p=Ju(d),l=e.apply===!0,f=v(e.plan).trim();if(l&&!f&&Bo("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!l&&f&&Bo("--plan is only valid together with --apply.",[`plan=${f}`]),l&&f!==p)throw new S("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?fr(o,i.fingerprint):Tt(o,i.baseline),ze(o,c.script));let u=c.targets.map((m,w)=>`target[${w}]=${m.address} kind=${m.kind} before=${JSON.stringify(m.before)} after=${JSON.stringify(m.after)} retained=${JSON.stringify(m.retainedIds)} created=${JSON.stringify(m.createdIds)} removed=${JSON.stringify(m.removedIds)} untouched_siblings=${m.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}},J]}function
|
|
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:h,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},J]}function
|
|
131
|
+
`)}parse(){this.skipBlank();let t=this.takeOpen("authoring");if(hn(t,["version"]),t.attrs.get("version")!=="1")throw $("Authoring version is unsupported.",t.source,t.attrs.get("version")??"<missing>","Use <authoring version=1>.");let n=[],o=[],i=!1,r=ht();for(;;){if(this.skipBlank(),this.peekClose("authoring")){$n(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 $("<create> must precede every target.",a.tag.source,"<create>","Move the single <create> block before the targets.");$n(r)&&this.throwUnsupportedModifiers(r,"create"),n.push(...this.parseCreate()),i=!0;continue}i=!0,o.push(this.parseTarget(r)),r=ht()}if(this.skipBlank(),this.index<this.lines.length){let a={line:this.index+1,column:1};throw $("Content exists after </authoring>.",a,this.lines[this.index],"Remove content outside the root block.")}if(o.length===0)throw $("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 $("Authoring targets are not homogeneous.",c.source,c.kind,`Keep only ${s} targets in this file.`);if(s==="script"&&o.length!==1)throw $("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");hn(t,[]);let n=[],o=ht();for(;;){if(this.skipBlank(),this.peekClose("create"))return $n(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 $("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||!Rt.has(c)||!bu(c))throw $("Actor declaration is invalid.",i.source,i.slots.join("|"),"Provide id, name, and featured|background importance.");if(a!==void 0&&(!eo.has(a)||!E_(a)))throw $("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=yt(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=ht();continue}if(i.type==="location"||i.type==="prop"){if(i.slots.length!==3)throw $(`${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||!Rt.has(c)||!bu(c))throw $(`${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=yt(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=ht();continue}if(i.type==="state"){if(i.slots.length!==3)throw $("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||!I_(d)||!s||!c)throw $("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=yt(o);l!==void 0&&(p.extend=l),n.push({declarationKind:"state",ownerKind:d,ownerId:a[2],value:p,source:i.source}),o=ht();continue}throw $("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 $("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,...yt(t)?{extend:yt(t)}:{}};case"episode-span":return this.parseEpisodeSpan(t);case"scene":return hn(n,["id","parent"]),{kind:"scene",parent:n.attrs.get("parent"),value:this.parseScene(t,!0),source:n.source,...yt(t)?{extend:yt(t)}:{}};case"scene-span":return this.parseSceneSpan(t);case"action-span":return this.parseActionSpan(t);default:throw $("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");hn(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=ht();for(;;){if(this.skipBlank(),this.peekClose("script")){$n(d)&&this.throwDangling(d),this.takeClose("script");break}let h=this.peekSemantic();if(h?.record!==void 0){let y=this.takeRecord();if(y.type==="extensions"||y.type==="extend"||y.type==="aliases"||y.type==="alias"||y.type==="prompt"){d=this.addModifier(d,y);continue}$n(d)&&this.throwUnsupportedModifiers(d,y.type);let m=o.indexOf(y.type),w=y.type==="main-character";if(a||m<0||m<c||!w&&i.has(y.type))throw $("Metadata record in <script> is invalid or out of order.",y.source,y.type,`Use ${o.join(", ")} in canonical order before episode blocks.`);if(c=m,y.type==="main-characters"){if(y.slots.length!==0||y.content!=="")throw $("Main characters marker is invalid.",y.source,y.content,"Use [main-characters] with no slots or content.");i.set(y.type,"")}else if(w){if(y.slots.length!==2||!y.slots[0]||!y.slots[1]||y.content!=="")throw $("Main character record is invalid.",y.source,y.slots.join("|"),"Use [main-character|name|role] with no content.");r.push({name:y.slots[0],role:y.slots[1]})}else{if(y.slots.length!==0)throw $("Script metadata record has unexpected slots.",y.source,y.slots.join("|"),`Use [${y.type}] content.`);i.set(y.type,y.content)}continue}if(h?.tag===void 0||h.tag.closing||h.tag.name!=="episode"){let y=h?.tag?.source??{line:this.index+1,column:1};throw $("Unexpected member in <script>.",y,this.lines[this.index]??"<eof>","Use metadata records followed by <episode> blocks.")}a=!0,s.push(this.parseEpisode(d)),d=ht()}let p=this.requiredMetadata(i,"title",n.source),l=this.requiredMetadata(i,"worldview",n.source),f=this.requiredMetadata(i,"style",n.source),u=yt(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");hn(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=yt(t);return r!==void 0&&(i.extend=r),i}parseScene(t,n){let o=this.takeOpen("scene");hn(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 $("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 h=f?.tag?.source??{line:this.index+1,column:1};throw $("Only scene records and <body> are allowed here.",h,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 $("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 $("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 $("Location record is out of order or invalid.",u.source,u.slots.join("|"),"Place exactly one [location|id?|state?] before cast.");a="location";let h=u.slots[0];h===void 0||h===""?r=null:r=u.slots.length===2?{location_id:h,state_id:u.slots[1]}:{location_id:h};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 $("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 $("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 $("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 $("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 $("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=yt(t);return l!==void 0&&(p.extend=l),p}parseBody(){let t=this.takeOpen("body");hn(t,[]);let n=[],o=ht();for(;;){if(this.skipBlank(),this.peekClose("body"))return $n(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(b_(i,o)),o=ht()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");hn(n,["from","through"]);let o=this.parseOnlyChildren("episode-span","episode",r=>this.parseEpisode(r)),i=yt(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");hn(n,["parent","from","through"]);let o=this.parseOnlyChildren("scene-span","scene",r=>this.parseScene(r,!1)),i=yt(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");hn(n,["parent","from","through"]),this.skipBlank();let o=this.parseBody();this.skipBlank(),this.takeClose("action-span");let i=yt(t);return{kind:"action-span",parent:n.attrs.get("parent"),from:Ou(n.attrs.get("from"),n.source,"action-span from",!0),through:Ou(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=ht();for(;;){if(this.skipBlank(),this.peekClose(t))return $n(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}$n(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 $(`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 $(`Unexpected member in <${t}>.`,f,this.lines[this.index]??"<eof>",`Use metadata records followed by <${o}> blocks.`)}a=!0,s.push(i(d)),d=ht()}}parseOnlyChildren(t,n,o){let i=[],r=ht();for(;;){if(this.skipBlank(),this.peekClose(t))return $n(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 $(`Only <${n}> children are allowed in <${t}>.`,c,this.lines[this.index]??"<eof>",`Add complete <${n}> blocks.`)}i.push(o(r)),r=ht()}}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 $("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 $("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 $("Extend key is duplicated.",n.source,i,"Keep one value for each extension key.");let r;try{r=JSON.parse(n.content)}catch{throw $("Extension value is not valid JSON.",n.source,n.content,"Use one canonical JSON value.")}if(!$c(r))throw $("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]=Dc(r),o}if(n.type==="aliases"){if(o.phase!=="extend"||o.aliasesPresent||n.slots.length!==0||n.content!=="")throw $("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 $("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 $("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 $("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 $("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 $("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 $(`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=A_(t,this.index+1);if(n!==null)return{tag:n};if(t.trimStart().startsWith("["))return{record:bi(t,this.index+1)};let o={line:this.index+1,column:Math.max(1,t.search(/\S/)+1)};throw $("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 $("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 $(`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 $(`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 $(`Unexpected end of file inside <${t}>.`,{line:this.lines.length,column:1},"<eof>",`Add </${t}>.`)}throwDangling(t){throw $("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 $("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 vu(e){return new Gc(e).parse()}function L(e,t,n){throw new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function jc(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==="")&&L("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]))&&L("Tag attributes are invalid.",t,a),r.set(d[1],d[2])}return{name:i[1],closing:!1,attrs:r,line:t}}function Ve(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)&&L("Tag attributes do not match the canonical grammar.",e.line,[...r.map(s=>`missing:${s}`),...i.map(s=>`unknown:${s}`)].join(","))}var zc=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||L("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=jc(o.raw,o.line);return(!i||i.name!==t||i.closing!==n)&&L(`Expected ${n?"</":"<"}${t}>.`,o.line,o.raw),i}record(){let t=this.take();return bi(t.raw,t.line)}nextTag(){let t=this.peek();return jc(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?bi(t.raw,t.line):null}};function Hc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Hc):typeof e=="object"&&Object.values(e).every(Hc)}function Jo(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]))&&L("extend record is invalid or duplicated.",r.source.line,r.type);let s=r.slots[0];i!==null&&i>=s&&L("extend keys must use ascending canonical order.",r.source.line,s);let c;try{c=JSON.parse(r.content)}catch{L("extend content must be JSON.",r.source.line,r.content)}Hc(c)||L("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&&L("alias takes no slots.",i.source.line,i.type),i.content===""&&L("alias must not be empty.",i.source.line,i.type),o.includes(i.content)&&L("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===""))&&L("prompt requires non-empty target, process, and contrast.",o.source.line,o.type);let i=o.slots[0];!V("actor",i)&&!V("location",i)&&!V("prop",i)&&L("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 Jc(e,t){return e!=="featured"&&e!=="background"&&L("Importance is invalid.",t,e),e}function O_(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&L("Role type is invalid.",t,e),e}function Yc(e,t){return e==="default"||V("state",e)?e:L("State ID is invalid.",t,e)}function v_(e){let t=e.tag("create",!1);Ve(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")&&L("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=Jo(e),d=e.record();if(d.type==="actor"){r>0&&L("Create declarations are not in canonical order.",d.source.line,d.type),s(d.source.line),a.prompt!==void 0&&L("prompt cannot modify an asset.",d.source.line,d.type),(d.slots.length<3||d.slots.length>4||!V("actor",d.slots[0]))&&L("actor declaration is invalid.",d.source.line,d.type);let p=O_(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:Jc(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)&&L("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&&L("Create declarations are not in canonical order.",d.source.line,d.type),r=p,s(d.source.line),a.prompt!==void 0&&L("prompt cannot modify an asset.",d.source.line,d.type);let l=d.type;if((d.slots.length!==3||(l==="location"?!V("location",d.slots[0]):!V("prop",d.slots[0])))&&L(`${l} declaration is invalid.`,d.source.line,d.type),l==="location"){let f=d.slots[0];V("location",f)||L("location ID is invalid.",d.source.line,f);let u={location_id:f,location_name:d.slots[1],importance:Jc(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)&&L("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];V("prop",f)||L("prop ID is invalid.",d.source.line,f);let u={prop_id:f,prop_name:d.slots[1],importance:Jc(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)&&L("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)&&L("state declaration is invalid.",d.source.line,d.type);let p=d.slots[0],l=o.get(p);l&&i!==p&&L("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:Yc(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"&&L("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),L("Unknown create declaration.",d.source.line,d.type)}s(e.peek().line);let c=e.tag("create",!0);return Ve(c,[]),n}function R_(e,t){let n=e.indexOf("/"),o=n<0?e:e.slice(0,n);if(V("actor",o))return n<0?{actor_id:o}:{actor_id:o,state_id:Yc(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)}:L("Speaker is invalid.",t,e)}function Ru(e){let t=Jo(e);t.aliases!==void 0&&L("aliases cannot modify an Action.",e.peek().line,"aliases");let n=e.record();return n.type==="act"||n.type==="trans"?((n.slots.length!==1||!V("action",n.slots[0]))&&L("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"?L("Unknown Action record.",n.source.line,n.type):((n.slots.length!==2&&n.slots.length!==3||!V("action",n.slots[0]))&&L("Speaking Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="dlg"?"dialogue":"inner_thought",speaker:R_(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 Bc(e,t){e.length===0&&L("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>Yc(o,t));return new Set(n).size!==n.length&&L("Scene reference repeats a state.",t,n.join(",")),n.sort()}function Qc(e,t,n,o){Ve(t,n===void 0?["id","parent"]:["id"]);let i=t.attrs.get("id")??"";V("scene",i)||L("Scene ID is invalid.",t.line,i);let r=t.attrs.get("parent")??n;r!==void 0&&!V("episode",r)&&L("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 y=e.record(),m=y.type==="environment"?0:y.type==="location"?1:y.type==="cast"?2:y.type==="prop"?3:-1;m<f&&L("Scene records are not in canonical order.",y.source.line,y.type),f=m,y.type==="environment"?(s!==void 0&&L("Scene environment is duplicated.",y.source.line,y.type),y.slots.length>2&&L("environment has too many slots.",y.source.line,y.type),s={...y.slots[0]===void 0?{}:{space:y.slots[0]},...y.slots[1]===void 0?{}:{time:y.slots[1]}}):y.type==="location"?(c!==void 0&&L("Scene location is duplicated.",y.source.line,y.type),y.slots.length===0?c=null:(V("location",y.slots[0])||L("Location ref ID is invalid.",y.source.line,y.slots[0]),c={location_id:y.slots[0],state_ids:Bc(y.slots.slice(1),y.source.line)})):y.type==="cast"?(V("actor",y.slots[0])||L("Cast ref ID is invalid.",y.source.line,y.slots[0]??""),p.has(y.slots[0])&&L("Scene repeats an actor reference.",y.source.line,y.slots[0]),p.add(y.slots[0]),a.push({actor_id:y.slots[0],state_ids:Bc(y.slots.slice(1),y.source.line)})):y.type==="prop"?(V("prop",y.slots[0])||L("Prop ref ID is invalid.",y.source.line,y.slots[0]??""),l.has(y.slots[0])&&L("Scene repeats a prop reference.",y.source.line,y.slots[0]),l.add(y.slots[0]),d.push({prop_id:y.slots[0],state_ids:Bc(y.slots.slice(1),y.source.line)})):L("Unknown scene header record.",y.source.line,y.type)}c===void 0&&L("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);Ve(u,[]);let h=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)h.push(Ru(e));return Ve(e.tag("body",!0),[]),Ve(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:h,...o===void 0?{}:{extend:o}}}}function Fc(e,t,n){Ve(t,["id"]);let o=t.attrs.get("id")??"";V("episode",o)||L("Episode ID is invalid.",t.line,o);let i,r,s=[],c=0;for(;e.nextTag()?.name!=="episode"||e.nextTag()?.closing!==!0;){let a=Jo(e);(a.aliases!==void 0||a.prompt!==void 0)&&L("Invalid episode child modifier.",e.peek().line,"modifier");let d=e.nextTag();if(d?.name==="scene"&&!d.closing){c=2,e.take(),s.push(Qc(e,d,o,a.extend).value);continue}a.extend!==void 0&&L("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&&L("Episode records are not in canonical order.",p.source.line,p.type),c=l,p.type==="title"?(i!==void 0&&L("Episode title is duplicated.",p.source.line,p.type),p.slots.length!==0&&L("Episode title takes no slots.",p.source.line,p.type),i=p.content):p.type==="synopsis"?(r!==void 0&&L("Episode synopsis is duplicated.",p.source.line,p.type),p.slots.length!==0&&L("Episode synopsis takes no slots.",p.source.line,p.type),r=p.content):L("Unknown episode record.",p.source.line,p.type)}return Ve(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 Kc(e,t){let n=e.attrs.get("range")??"",o=n.split("..");return(o.length!==2||!o[0]||!o[1]||!V(t,o[0])||!V(t,o[1]))&&L(`Span range must contain two ${t} IDs.`,e.line,n),[o[0],o[1]]}function M_(e,t,n){Ve(t,[]);let o,i,r,s,c,a,d,p,l=[],f=0;for(;e.nextTag()?.name!=="script"||e.nextTag()?.closing!==!0;){let u=Jo(e);(u.aliases!==void 0||u.prompt!==void 0)&&L("Invalid script child modifier.",e.peek().line,"modifier");let h=e.nextTag();if(h?.name==="episode"&&!h.closing){f=8,e.take(),l.push(Fc(e,h,u.extend));continue}u.extend!==void 0&&L("extend must precede an episode here.",e.peek().line,"extend");let y=e.record(),m=y.type==="title"?0:y.type==="worldview"?1:y.type==="worldview-raw"?2:y.type==="style"?3:y.type==="synopsis"?4:y.type==="logline"?5:y.type==="theme"?6:y.type==="main-characters"||y.type==="main-character"?7:-1;m<f&&L("Script records are not in canonical order.",y.source.line,y.type),f=m,y.type!=="main-character"&&y.slots.length!==0&&L("Script metadata record takes no slots.",y.source.line,y.type),y.type==="title"?(o!==void 0&&L("Script title is duplicated.",y.source.line,y.type),o=y.content):y.type==="worldview"?(i!==void 0&&L("Script worldview is duplicated.",y.source.line,y.type),i=y.content):y.type==="worldview-raw"?(r!==void 0&&L("Script worldview-raw is duplicated.",y.source.line,y.type),r=y.content):y.type==="style"?(s!==void 0&&L("Script style is duplicated.",y.source.line,y.type),s=y.content):y.type==="synopsis"?(c!==void 0&&L("Script synopsis is duplicated.",y.source.line,y.type),c=y.content):y.type==="logline"?(a!==void 0&&L("Script logline is duplicated.",y.source.line,y.type),a=y.content):y.type==="theme"?(d!==void 0&&L("Script theme is duplicated.",y.source.line,y.type),d=y.content):y.type==="main-characters"?(p!==void 0&&L("Script main-characters is duplicated.",y.source.line,y.type),p=[]):y.type==="main-character"&&p!==void 0&&y.slots.length===2&&y.content===""?p.push({name:y.slots[0],role:y.slots[1]}):L("Unknown script record.",y.source.line,y.type)}return Ve(e.tag("script",!0),[]),(o===void 0||i===void 0||s===void 0)&&L("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 Mu(e){let t=new zc(e),n=t.tag("authoring",!1);Ve(n,["version"]),n.attrs.get("version")!=="1"&&L("authoring version must be 1.",1,n.attrs.get("version")??"<missing>");let o=t.nextTag()?.name==="create"?v_(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=Jo(t);(s.aliases!==void 0||s.prompt!==void 0)&&L("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=jc(c.raw,c.line);if((!a||a.closing)&&L("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(M_(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:Fc(t,a,s.extend)});else if(a.name==="scene"){let d=Qc(t,a,void 0,s.extend);d.parent||L("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&&L("A span cannot carry node extensions.",c.line,c.raw),Ve(a,["range"]);let[d,p]=Kc(a,"episode"),l=[];for(;t.nextTag()?.name!=="episode-span"||t.nextTag()?.closing!==!0;){let f=Jo(t);(f.aliases!==void 0||f.prompt!==void 0)&&L("Invalid episode child modifier.",t.peek().line,"modifier");let u=t.tag("episode",!1);l.push(Fc(t,u,f.extend))}Ve(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&&L("A span cannot carry node extensions.",c.line,c.raw),Ve(a,["parent","range"]);let[d,p]=Kc(a,"scene"),l=a.attrs.get("parent")??L("scene-span needs parent.",c.line,c.raw);V("episode",l)||L("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=Jo(t);(u.aliases!==void 0||u.prompt!==void 0)&&L("Invalid scene child modifier.",t.peek().line,"modifier");let h=t.tag("scene",!1);f.push(Qc(t,h,l,u.extend).value)}Ve(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&&L("A span cannot carry node extensions.",c.line,c.raw),Ve(a,["parent","range"]);let[d,p]=Kc(a,"action"),l=a.attrs.get("parent")??L("action-span needs parent.",c.line,c.raw);V("scene",l)||L("action-span parent must be a Scene ID.",c.line,l),Ve(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(Ru(t));Ve(t.tag("body",!0),[]),Ve(t.tag("action-span",!0),[]),i.push({kind:"action-span",parent:l,from:d,through:p,values:f})}else L("Unknown authoring target.",c.line,a.name)}Ve(t.tag("authoring",!0),[]),(t.index!==t.lines.length||i.length===0)&&L("Authoring file has trailing content or no targets.",t.peek().line,"<root>");let r=i[0].kind;return i.every(s=>s.kind===r)||L("All targets must have the same kind.",1,r),{declarations:o,targets:i,targetKind:r}}function yn(e){if(Array.isArray(e))return e.map(t=>yn(t));if(te(e)){let t={};for(let n of Object.keys(e).sort())t[n]=yn(e[n]);return t}return e}function qc(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 Lu(e,t){if(!(t.ok||e!==null&&cc(Me(e),t)))throw new S("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 Le(e,t){throw new S(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function Wc(e){return{ids:e.map(t=>t.action_id),counts:{episodes:0,scenes:0,actions:e.length}}}function Oi(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 po(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 L_(e){return e.kind==="script"?po(e.value.episodes):e.kind==="episode"?po([e.value]):e.kind==="episode-span"?po(e.values):e.kind==="scene"?Oi([e.value]):e.kind==="scene-span"?Oi(e.values):Wc(e.values)}function N_(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 Zc(e,t){return JSON.stringify(yn(e))===JSON.stringify(yn(t))}function Nu(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 Uu(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 Cu(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 Pu(e,t){let n=e===null?[]:Cu(e),o=Cu(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 U_(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Le("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)&&Le("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)&&Le("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||Le("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Le("State declaration cannot redefine an existing state.",[`${n.ownerId}/${n.value.state_id}`]),o.states.push(structuredClone(n.value))}}function Ht(e,t,n){let o=e.indexOf(t),i=e.indexOf(n);return(o<0||i<0)&&Le("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function C_(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"?Ht(o,t.value.episode_id,t.value.episode_id):Ht(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"?Ht(o,t.value.scene_id,t.value.scene_id):Ht(o,t.from,t.through)}let n=e.episodes.flatMap(o=>o.scenes.flatMap(i=>i.actions.map(r=>r.action_id)));return Ht(n,t.from,t.through)}function P_(e,t){let n=-1;for(let o of t){let[i,r]=C_(e,o);i<=n&&Le("Replace targets must follow current document order without overlap.",[Du(o)]),n=r}}function Du(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 Tu(e,t){if(t.kind==="script")return{...po(e.episodes),siblings:0};if(t.kind==="episode"){let r=mn(e,t.value.episode_id);return{...po(r?[r.episode]:[]),siblings:Math.max(0,e.episodes.length-(r?1:0))}}if(t.kind==="episode-span"){let[r,s]=Ht(e.episodes.map(c=>c.episode_id),t.from,t.through);return{...po(e.episodes.slice(r,s+1)),siblings:e.episodes.length-(s-r+1)}}if(t.kind==="scene"){let r=Vn(e,t.value.scene_id),s=mn(e,t.parent)?.episode;return{...Oi(r?[r.scene]:[]),siblings:r?Math.max(0,r.episode.scenes.length-1):s?.scenes.length??0}}if(t.kind==="scene-span"){let r=mn(e,t.parent)?.episode;if(!r)return{...Oi([]),siblings:0};let[s,c]=Ht(r.scenes.map(a=>a.scene_id),t.from,t.through);return{...Oi(r.scenes.slice(s,c+1)),siblings:r.scenes.length-(c-s+1)}}let n=Vn(e,t.parent)?.scene;if(!n)return{...Wc([]),siblings:0};let[o,i]=Ht(n.actions.map(r=>r.action_id),t.from,t.through);return{...Wc(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function Vu(e,t){let n=L_(e),o=new Set(t.ids),i=new Set(n.ids);return{kind:e.kind,address:Du(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"&&Le("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=mn(e,t.value.episode_id);n||Le("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]=Ht(e.episodes.map(i=>i.episode_id),t.from,t.through);t.values.length===0&&Le("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=Vn(e,t.value.scene_id);(!n||n.episode.episode_id!==t.parent)&&Le("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=mn(e,t.parent)?.episode;n||Le("Scene span parent was not found.",[t.parent]);let[o,i]=Ht(n.scenes.map(r=>r.scene_id),t.from,t.through);t.values.length===0&&Le("Scene span replacement cannot be empty.",[t.from,t.through]),n.scenes.splice(o,i-o+1,...structuredClone(t.values))}else{let n=Vn(e,t.parent)?.scene;n||Le("Action span parent was not found.",[t.parent]);let[o,i]=Ht(n.actions.map(r=>r.action_id),t.from,t.through);t.values.length===0&&Le("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function V_(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=mn(e,t.parent)?.episode;n||Le("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Le("This target kind does not support create against an existing script.",[t.kind])}function $u(e){if(e.targets.length!==1||e.targets[0].kind!=="script")return Le("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Le("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...N_(e.declarations)}}function Gu(e,t,n){let o;if(e===null)n!=="create"&&Le("A missing target requires one script create target.",[n,t.targetKind]),o=$u(t);else if(n==="create"&&t.targetKind==="script")o=$u(t),Zc(o,e)||Le("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&P_(e,t.targets),U_(o,t.declarations);let r=t.targets.map(a=>Tu(e,a));if(n==="replace")for(let a of[...t.targets].reverse())T_(o,a);else for(let a of t.targets)V_(o,a);let s=t.targets.map((a,d)=>Vu(a,r[d])),c=Me(o);return Lu(e,c),{script:o,changed:!Zc(e,o),validation:c,targets:s,declarations:Nu(e,t.declarations),retainedOrphanAssets:Uu(o),identity:Pu(e,o)}}let i=Me(o);return Lu(e,i),{script:o,changed:e===null||!Zc(e,o),validation:i,declarations:Nu(e,t.declarations),retainedOrphanAssets:Uu(o),identity:Pu(e,o),targets:t.targets.map(r=>{let s=e===null?{...po([]),siblings:0}:Tu(e,r);return Vu(r,s)})}}function Bo(e,t){throw new S(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 $_(e){(!e||e==="-")&&Bo("Authoring input must be a named file.",[e||"<missing>"]);let t=Ju.resolve(e),n;try{n=Ir.statSync(t)}catch{throw new S("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()||Bo("Authoring input must be a regular file.",[t]);let o=Ir.readFileSync(t);return{absolutePath:t,bytes:o,text:o.toString("utf-8")}}function D_(e){let t=fr(e);if(t===null)return{script:null,baseline:"missing",fingerprint:t};let n;try{n=JSON.parse(Ir.readFileSync(e,"utf-8"))}catch(i){throw new S("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=As(n);return{script:o,baseline:De(o),fingerprint:t}}function G_(e){let t=e.create===!0,n=e.replace===!0;return t===n&&Bo("Choose exactly one authoring mode.",[`create=${t}`,`replace=${n}`]),t?"create":"replace"}function Bu(e){return`sha256:${ye(JSON.stringify(e))}`}function J_(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 B_(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 K_(e,t,n,o,i){let r=Mu(t.text),s=i.script===null?null:fn(i.script),c=Gu(s,r,n),a=`sha256:${Xc.createHash("sha256").update(t.bytes).digest("hex")}`,d={version:1,sourceDigest:a,mode:n,targetKind:r.targetKind,targets:c.targets.map(m=>m.address),baseline:i.baseline,plan:{targets:c.targets,declarations:c.declarations,retainedOrphanAssets:c.retainedOrphanAssets,identity:c.identity,validation:c.validation}},p=Bu(d),l=e.apply===!0,f=v(e.plan).trim();if(l&&!f&&Bo("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!l&&f&&Bo("--plan is only valid together with --apply.",[`plan=${f}`]),l&&f!==p)throw new S("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?mr(o,i.fingerprint):Pt(o,i.baseline),ze(o,c.script));let u=c.targets.map((m,w)=>`target[${w}]=${m.address} kind=${m.kind} before=${JSON.stringify(m.before)} after=${JSON.stringify(m.after)} retained=${JSON.stringify(m.retainedIds)} created=${JSON.stringify(m.createdIds)} removed=${JSON.stringify(m.removedIds)} untouched_siblings=${m.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}},J]}function Ku(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"",o=$_(n),i=G_(e),r=ke(e),s=D_(r);if(s.script===null||s.script.version===4)return K_(e,o,i,r,s);let c=vu(o.text),a=ku(Lt(s.script),c,i),d=`sha256:${Xc.createHash("sha256").update(o.bytes).digest("hex")}`,p={version:1,sourceDigest:d,mode:i,targetKind:c.targetKind,targets:a.targets.map(w=>w.address),baseline:s.baseline,plan:{targets:a.targets,declarations:a.declarations,retainedOrphanAssets:a.retainedOrphanAssets,validation:a.validation}},l=Bu(p),f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&Bo("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&Bo("--plan is only valid together with --apply.",[`plan=${u}`]),f&&u!==l)throw new S("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?mr(r,s.fingerprint):Pt(r,s.baseline),ze(r,a.script));let h=J_(a);return[{text:[`${f?"Applied":"Planned"} ${a.targets.length} ${c.targetKind} target(s); episodes ${h.before.episodes}\u2192${h.after.episodes}, scenes ${h.before.scenes}\u2192${h.after.scenes}, actions ${h.before.actions}\u2192${h.after.actions}`,`plan: ${l}`,...B_(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:h,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},J]}function zu(e){return Array.isArray(e.rows)}function j_(e){return e.endsWith(`
|
|
134
134
|
`)?e:`${e}
|
|
135
|
-
`}function
|
|
136
|
-
`)}function
|
|
135
|
+
`}function ju(e){return Array.isArray(e)?e.map(t=>String(t).replace(/[\r\n]+/g," ")):[]}function z_(e){return e==null?"":(typeof e=="string"?e:JSON.stringify(e)).replace(/\t/g," ").replace(/\r?\n/g," ")}function H_(e){if(!zu(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=>z_(n[o])).join(" "))].join(`
|
|
136
|
+
`)}function Hu(e,t,n,o){if(!(e.text===""&&Object.keys(e.data).length===0)){if(o==="addr"&&zu(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
137
|
`)+`
|
|
138
138
|
`);return}}if(n){let i={ok:t===J,exit_code:t,...e.data};i.ok=t===J,i.exit_code=t,process.stdout.write(JSON.stringify(i,null,2)+`
|
|
139
|
-
`)}else process.stdout.write(
|
|
140
|
-
`)}else{let n=
|
|
139
|
+
`)}else process.stdout.write(j_(H_(e.data)??e.text))}}function Ar(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=ju(e.data.actual),o=ju(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
141
|
`)}
|
|
142
|
-
`)}return e.exitCode}var
|
|
142
|
+
`)}return e.exitCode}var ed=new WeakMap;function Q_(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}function F_(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[Q_(t),n]))}function Y_(e){let t=[],n=e;for(;n;)t.unshift(n),n=n.parent;return Object.assign({},...t.map(o=>o.opts()))}function q(e,t){return async(...n)=>{let o=n[n.length-1],i=n.slice(0,-2).filter(d=>d!==void 0),r=F_(Y_(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]=ed.get(o)==="write"?await _s(ke(r),s):await s();Hu(c,a,t.jsonMode,t.format),t.exitCode=a}}function be(e,t){return e.registeredArguments.forEach((n,o)=>{n.description=t[o]??""}),e}function de(e,t="write"){return ed.set(e,t),e.option("-p, --script-path <path>","Script JSON file (default: ./workspace/script.json)")}function td(e){return ed.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 Qu(e,t){let n=e.command("authoring").description("Structured screenplay compilation and atomic application transactions"),o=de(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(q(Ku,t));be(o,["Structured .scriptctl file"]);let i=de(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(q(tu,t));be(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=de(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(q(d=>mu(c,d),t))}}import*as Us from"node:fs";import*as cd from"node:path";import*as id from"node:fs";import*as vi from"node:path";import{fileURLToPath as q_}from"node:url";var od="@lingjingai/scriptctl",nd="";function rd(){if(nd)return nd;let e=vi.dirname(q_(import.meta.url));for(;;){try{let n=id.readFileSync(vi.join(e,"package.json"),"utf-8");if(JSON.parse(n).name===od)return nd=e,e}catch{}let t=vi.dirname(e);if(t===e)throw new Error(`${od} package root not found`);e=t}}function Ri(){let e=id.readFileSync(vi.join(rd(),"package.json"),"utf-8"),t=JSON.parse(e).version;if(typeof t!="string")throw new Error(`${od} package.json has no string version`);return t}var Fu=/^\d+\.\d+\.\d+$/,Z_="unreleased";function Yu(){return cd.join(rd(),"changes")}function W_(){return Ri()}function kr(e){if(!Fu.test(e))throw new S("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 ad(e,t){let n=kr(e),o=kr(t);for(let i=0;i<3;i++)if(n[i]!==o[i])return n[i]-o[i];return 0}function X_(){let e=Yu();return Us.readdirSync(e).filter(t=>t.endsWith(".md")).map(t=>t.slice(0,-3)).filter(t=>Fu.test(t)).sort(ad)}function Ns(e){return Us.readFileSync(cd.join(Yu(),`${e}.md`),"utf-8").trimEnd()}function sd(e,t){return new S(`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 ex(e,t){return new S(`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 tx(e){return e.map(Ns).join(`
|
|
143
143
|
|
|
144
|
-
`)}function Yu(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 S("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 S("--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 S("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=Ls(q_);return[{text:d,data:{content:d,versions:[],unreleased:!0}},J]}let s=W_(),c=Z_();if(n){if(Ar(n),!s.includes(n))throw rd(n,s);let d=Ls(n);return[{text:d,data:{content:d,versions:[n],unreleased:!1}},J]}if(o||i){if(!o)throw new S("--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>"]}});Ar(o);let d=i||c;if(Ar(d),!s.includes(d))throw rd(d,s);let p=s.filter(f=>sd(f,o)>0&&sd(f,d)<=0);if(p.length===0)throw X_(o,d);let l=ex(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},J]}if(!s.includes(c))throw rd(c,s);let a=Ls(c);return[{text:a,data:{content:a,versions:[c],unreleased:!1}},J]}import*as Vt from"node:fs";import*as Qo from"node:path";import{createRequire as oE}from"node:module";import*as Dn from"node:fs";import*as lo from"node:path";import*as Zu from"node:os";import{fileURLToPath as tx}from"node:url";function qu(e){return e.startsWith("~")?lo.join(Zu.homedir(),e.slice(1)):e}function nx(e){let t=Dn.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 cd(){let e=[],t=(process.env.SCRIPTCTL_ENV_FILE??"").trim();t&&e.push(qu(t));let n=(process.env.SCRIPTCTL_SKILL_DIR??"").trim();n&&e.push(lo.join(qu(n),".env"));let o;try{o=tx(import.meta.url)}catch{o=process.cwd()}let i=lo.resolve(o),r=new Set;for(;;){let s=lo.dirname(i);if(s===i||r.has(s))break;r.add(s),e.push(lo.join(s,".env")),i=s}return e}function Wu(){let e=process.env.SCRIPTCTL_NO_DOTENV;if(e==="1"||e==="true"||e==="True")return;let t=new Set;for(let n of cd()){let o;try{o=Dn.existsSync(n)?Dn.realpathSync(n):n}catch{o=n}t.has(o)||!Dn.existsSync(n)||!Dn.statSync(n).isFile()||(t.add(o),nx(n))}}var le=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 dd(e,t){if(e.updateEpisodeCount)try{await e.updateEpisodeCount(t)}catch{}}function Xu(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 Or from"node:fs";import*as tf from"node:os";import*as kr from"node:path";import{parseDocument as ox}from"yaml";function ie(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var _n={"direct.episode-titles":ie("direct.episode-titles","tool",4096),"direct.batch-extract":ie("direct.batch-extract","text",16e3),"direct.episode-synopsis":ie("direct.episode-synopsis","tool",2048),"direct.synopsis-reduction":ie("direct.synopsis-reduction","tool",4096),"direct.script-synopsis":ie("direct.script-synopsis","tool",2048),"direct.asset-grouping":ie("direct.asset-grouping","text",8e3),"direct.asset-curation":ie("direct.asset-curation","text",2e4),"direct.asset-curation-audit":ie("direct.asset-curation-audit","text",2e4),"direct.location-canonicalization":ie("direct.location-canonicalization","text",2e4),"direct.state-curation":ie("direct.state-curation","text",2e4),"direct.state-binding":ie("direct.state-binding","tool",16e3),"metadata.global":ie("metadata.global","text",16e3),"metadata.descriptions":ie("metadata.descriptions","text",16e3),"synopsis.chunk":ie("synopsis.chunk","text",4096),"synopsis.episode":ie("synopsis.episode","text",4096),"synopsis.arc":ie("synopsis.arc","text",16e3),"synopsis.script-overview":ie("synopsis.script-overview","text",16e3),"ingest.body-start":ie("ingest.body-start","text",16e3),"ingest.arc-summary":ie("ingest.arc-summary","text",4096),"ingest.text-normalize":ie("ingest.text-normalize","text",32e3),"ingest.episode-assets":ie("ingest.episode-assets","tool",32e3),"ingest.name-fix":ie("ingest.name-fix","tool",16e3),"ingest.mention-resolve":ie("ingest.mention-resolve","text",8e3),"ingest.asset-extract":ie("ingest.asset-extract","text",8e3),"ingest.asset-curate":ie("ingest.asset-curate","text",32e3),"ingest.asset-recall":ie("ingest.asset-recall","text",65536),"ingest.asset-refine":ie("ingest.asset-refine","text",32e3),"ingest.state-reconcile":ie("ingest.state-reconcile","text",32e3),"ingest.asset-audit":ie("ingest.asset-audit","tool",32e3),"ingest.speaker-audit":ie("ingest.speaker-audit","tool",16e3),"ingest.comic-serial":{id:"ingest.comic-serial",mode:"document",version:"1",defaultProfile:"default"},"ingest.video-serial":ie("ingest.video-serial","video",65536)},ef=Object.keys(_n).filter(pd);function pd(e){return Object.hasOwn(_n,e)}var ix=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts","videoResponseSchemaField","videoUploadMode","documentResponseSchemaField","documentUploadMode"]),rx=new Set(["provider","model","thinking","reasoning","temperature"]),sx=new Set(["env"]),ax=new Set(["budgetTokens"]);function Ue(e,t=[]){return new S(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 fd(e,t){let n;try{n=new URL(e)}catch{throw Ue(`${t} must be an absolute URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw Ue(`${t} must use http or https.`);return n.toString().replace(/\/$/,"")}function md(e,t="provider base URL"){return fd(e,t)}function cx(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function uo(e,t){if(!cx(e))throw Ue(`${t} must be a mapping.`,[`${t}: ${typeof e}`]);return e}function Ko(e,t){if(typeof e!="string"||!e.trim())throw Ue(`${t} must be a non-empty string.`);return e.trim()}function ud(e,t,n,o){if(!Number.isInteger(e)||typeof e!="number"||e<n||o!==void 0&&e>o)throw Ue(`${t} must be an integer in ${o===void 0?`[${n}, +\u221E)`:`[${n}, ${o}]`}.`);return e}function br(e,t,n){let o=Object.keys(e).filter(i=>!t.has(i));if(o.length>0)throw Ue(`${n} contains unknown fields.`,o)}function dx(e,t){let n=uo(t,`providers.${e}`);br(n,ix,`providers.${e}`);let o=Ko(n.protocol,`providers.${e}.protocol`);if(o!=="anthropic"&&o!=="openai-compatible"&&o!=="google-gemini"&&o!=="google-vertex")throw Ue(`providers.${e}.protocol is unsupported.`,[o]);let i=n.baseUrl===void 0&&o!=="openai-compatible"?null:fd(Ko(n.baseUrl,`providers.${e}.baseUrl`),`providers.${e}.baseUrl`),r="";if(o!=="google-vertex"){let c=uo(n.apiKey,`providers.${e}.apiKey`);if(br(c,sx,`providers.${e}.apiKey`),r=Ko(c.env,`providers.${e}.apiKey.env`),!/^[A-Za-z_][A-Za-z0-9_]*$/.test(r))throw Ue(`providers.${e}.apiKey.env must be an environment variable name.`)}let s={protocol:o,baseUrl:i,apiKeyEnv:r,timeoutMs:ud(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:ud(n.maxAttempts,`providers.${e}.maxAttempts`,1,6)};for(let c of["videoResponseSchemaField","documentResponseSchemaField"]){let a=n[c];if(a!==void 0){if(o!=="google-gemini"&&o!=="google-vertex")throw Ue(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="responseJsonSchema"&&a!=="responseSchema")throw Ue(`providers.${e}.${c} must be responseJsonSchema or responseSchema.`);s[c]=a}}for(let c of["videoUploadMode","documentUploadMode"]){let a=n[c];if(a!==void 0){if(o!=="google-gemini"&&o!=="google-vertex")throw Ue(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="file-api"&&a!=="base64")throw Ue(`providers.${e}.${c} must be file-api or base64.`);s[c]=a}}return s}function px(e,t,n){let o=uo(t,`models.${e}`);br(o,rx,`models.${e}`);let i=Ko(o.provider,`models.${e}.provider`),r=n[i];if(!r)throw Ue(`models.${e} references an unknown provider.`,[i]);let s={provider:i,model:Ko(o.model,`models.${e}.model`)};if(o.reasoning!==void 0&&(s.reasoning=Ko(o.reasoning,`models.${e}.reasoning`)),o.temperature!==void 0){let c=o.temperature;if(typeof c!="number"||!Number.isFinite(c)||c<0)throw Ue(`models.${e}.temperature must be a number \u2265 0.`);s.temperature=c}if(o.thinking!==void 0){if(r.protocol!=="anthropic")throw Ue(`models.${e}.thinking is only valid for anthropic providers.`);let c=uo(o.thinking,`models.${e}.thinking`);br(c,ax,`models.${e}.thinking`),s.thinkingBudgetTokens=ud(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function lx(e,t){let n=uo(e,"config");if(br(n,new Set(["version","providers","models","tasks"]),"config"),n.version!==1)throw Ue("config.version must be 1.");let o=uo(n.providers,"providers"),i={};for(let[a,d]of Object.entries(o))i[a]=dx(a,d);let r=uo(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=px(a,d,i);if(!s.default)throw Ue("models.default is required.");let c={};if(n.tasks!==void 0){let a=uo(n.tasks,"tasks");for(let[d,p]of Object.entries(a)){if(!pd(d))throw Ue("tasks contains an unknown task id.",[d]);let l=Ko(p,`tasks.${d}`);if(!s[l])throw Ue(`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 vi={version:1,providers:{gw:{protocol:"openai-compatible",baseUrl:null,apiKeyEnv:"PROJECT_LITELLM_GATEWAY_API_KEY",timeoutMs:3e5,maxAttempts:3},"google-gemini":{protocol:"google-vertex",baseUrl:null,apiKeyEnv:"",timeoutMs:6e5,maxAttempts:3},nnyyai:{protocol:"google-gemini",baseUrl:"https://api.nnyyai.com",apiKeyEnv:"NNYYAI_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64",documentResponseSchemaField:"responseSchema",documentUploadMode:"base64"}},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:"nnyyai",model:"gemini-3.8-flash"},"ingest-comic":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-text":{provider:"google-gemini",model:"gemini-3.8-flash",temperature:0},"review-comic":{provider:"nnyyai",model:"gemini-3.8-flash",temperature:0},"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","ingest.comic-serial":"ingest-comic"},source:"builtin",sourcePath:null};function ux(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?fd(e,"PROJECT_LITELLM_GATEWAY_BASE_URL"):null;return{...vi,providers:{gw:{...vi.providers.gw,baseUrl:t},"google-gemini":{...vi.providers["google-gemini"]},nnyyai:{...vi.providers.nnyyai}},models:{...vi.models},tasks:{...vi.tasks}}}function fx(){let e=(process.env.XDG_CONFIG_HOME??"").trim();return e?kr.join(e,"scriptctl","llm.yaml"):kr.join(tf.homedir(),".config","scriptctl","llm.yaml")}function ld(e){if(!Or.existsSync(e))throw Ue("LLM configuration file does not exist.",[e]);let t=ox(Or.readFileSync(e,"utf-8"),{uniqueKeys:!0});if(t.errors.length>0)throw Ue("LLM configuration YAML is invalid.",t.errors.map(o=>o.message));let n=t.toJS();return lx(n,kr.resolve(e))}function Ri(e){let t=(e??"").trim();if(t)return ld(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return ld(n);let o=fx();return Or.existsSync(o)?ld(o):ux()}import*as hf from"node:crypto";import*as yf from"node:fs";import hx,{APIConnectionError as yx,APIConnectionTimeoutError as wx,APIError as _x,APIUserAbortError as xx}from"@anthropic-ai/sdk";var gd=1e8;function mx(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=Rt(o.classification??mx(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function gx(e){return new Promise(t=>setTimeout(t,e))}function Ft(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 Yt(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=Ft(n,i.usage),i.attempts=o,i.usage=n),!(i instanceof P)||!i.retryable||o===e)throw i;await gx(Math.min(3e4,1e3*2**(o-1)))}throw new Error("unreachable retry state")}function nf(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 of(e){if(e instanceof P)return e;if(e instanceof xx)return new P("request_failed","Anthropic request was aborted.");if(e instanceof wx)return new P("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof yx)return new P("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof _x){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 Us=class{constructor(t,n,o){this.provider=t;this.model=n;let i={apiKey:o};t.baseUrl&&(i.baseURL=t.baseUrl),this.client=new hx({...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 Yt(this.provider.maxAttempts,async()=>{try{let o=await this.client.messages.create(this.params(t),{timeout:this.provider.timeoutMs,signal:t.signal}),i=nf(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 of(o)}});return{...n.value,attempts:n.attempts,usage:Ft(n.failedUsage,n.value.usage)}}async generateTool(t){let n=await Yt(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=nf(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 of(o)}});return{...n.value,attempts:n.attempts,usage:Ft(n.failedUsage,n.value.usage)}}};import*as _d from"node:fs";import*as xd from"node:path";import{File as bx}from"node:buffer";import{Agent as Ox,fetch as Ps,FormData as vx}from"undici";function Ex(e){return typeof e=="object"&&e!==null}function hd(e){let t=[],n=new Set,o=e;for(;Ex(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function Cs(e){for(let t of hd(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function Sx(e){for(let t of hd(e))if(typeof t.code=="string")return t.code}function Ix(e){for(let t of hd(e))if(typeof t.name=="string")return t.name}function Ax(e){let t=Ix(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function kx(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 jo(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=Sx(e),s=Ax(e)?{failure_type:"timeout",failure_code:"request_timeout"}:kx(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 zo(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 Rx=2e3;function Mx(e){return new Promise(t=>setTimeout(t,e))}function yd(e,t,n,o){if(e instanceof P)return e;let i=e instanceof Error?e.message:String(e),r=Cs(e),s={provider:"doubao",model:o,operation:n};return r!==null?zo(r,`Doubao ${n} failed.`,i.slice(0,500),s):jo(e,t,`Doubao ${n} failed.`,i.slice(0,500),s)}function Lx(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 Nx(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 Ts=class{constructor(t,n,o,i,r,s){this.model=t;this.timeoutMs=n;this.maxAttempts=o;this.client=s??Ux(i,r,n)}model;timeoutMs;maxAttempts;client;async run(t){let{value:n}=await Yt(this.maxAttempts,async()=>{try{return await this.client.uploadFile({filePath:t.localPath,mimeType:t.localMime,fps:t.fps})}catch(i){throw yd(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 Mx(Rx);let r;try{r=await this.client.getFile({id:t})}catch(s){throw yd(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,n.acceptsText)}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 generateDocument(t,n){let o=t.media.kind==="base64"?t.media.data:n?_d.readFileSync(n).toString("base64"):void 0;if(!o)throw new P("invalid_response","Doubao PDF recovery requires the original document bytes.");let i={model:this.model,input:[{role:"user",content:[{type:"input_file",filename:n?xd.basename(n):"document.pdf",file_data:`data:application/pdf;base64,${o}`},{type:"input_text",text:t.user}]}]};return t.system?.trim()&&(i.instructions=t.system),t.responseJsonSchema&&(i.text={format:{type:"json_schema",name:"document",schema:t.responseJsonSchema}}),this.generateResponse(i,t.signal,!!t.responseJsonSchema)}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,i){let{value:r,attempts:s,failedUsage:c}=await Yt(this.maxAttempts,async()=>{let a;try{a=await this.client.createResponse(t,n)}catch(f){throw yd(f,n,"generate",this.model)}let d=(a.status??"").toLowerCase(),p=Lx(a.usage);if(d==="incomplete"){let f=a.incomplete_details?.reason??"unknown";throw f==="max_output_tokens"||f==="length"?new P("truncated","Doubao output was truncated.",{usage:p}):new P("content_filtered",`Doubao response incomplete (reason=${f}).`,{usage:p})}let l=Nx(a);if(!l)throw new P("empty_response","Doubao returned an empty response.",{retryable:!0,usage:p});if(i&&!i(l))throw new P("invalid_response","Doubao response does not match the requested output format.",{retryable:!0,usage:p,context:{provider:"doubao",model:this.model,operation:"generate"}});if(o)try{JSON.parse(l)}catch{throw new P("invalid_response","Doubao returned malformed JSON for a structured response.",{retryable:!0,usage:p,context:{provider:"doubao",model:this.model,operation:"generate"}})}return{text:l,usage:p,raw:a}});return{text:r.text,finishReason:"STOP",attempts:s,usage:Ft(c,r.usage),raw:r.raw}}},wd=class extends Error{constructor(n,o){super(o);this.status=n;this.name="HttpError"}status};function Ux(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new Ox({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 wd(a.status,d.slice(0,500))}return{async uploadFile({filePath:a,mimeType:d,fps:p}){let l=new vx,f=_d.readFileSync(a);l.append("file",new bx([f],xd.basename(a),{type:d})),l.append("purpose","user_data"),l.append("preprocess_configs[video][fps]",String(p));let u=await Ps(`${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 Ps(`${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 Ps(`${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 Ps(`${o}/files/${a}`,{method:"DELETE",headers:i,signal:s(),dispatcher:r});d.ok||await c(d)}}}import{GoogleAuth as Cx}from"google-auth-library";function Vs(){let e=process.env.GOOGLE_CLOUD_PROJECT?.trim();if(!e)throw new Error("GOOGLE_CLOUD_PROJECT is required for official Vertex AI");return e}var rf=new Cx({scopes:["https://www.googleapis.com/auth/cloud-platform"]});import*as pf from"node:fs";import{createRequire as Bx}from"node:module";import*as $s from"node:fs";import*as Px from"node:http";import*as Tx from"node:https";import{HttpsProxyAgent as Vx}from"https-proxy-agent";var af="https://generativelanguage.googleapis.com";function $x(e,t){let n=new URL(e??af);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function Dx(e,t){let n=new URL(t??af),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 Mi(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 Gx(e){return e?new Vx(e):void 0}function sf(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?Px:Tx).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 Jx(e,t){let n=e[t];return Array.isArray(n)?n[0]??"":n??""}async function cf(e){let t=$s.statSync(e.filePath).size,o={agent:Gx(e.proxyUrl??""),timeout:e.timeoutMs},i=$x(e.baseUrl,e.apiKey),r=l=>Mi(l,e.apiKey),s;try{s=await sf(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 jo(l,e.signal,"Gemini upload start failed.",f,{operation:"upload"})}let c=Jx(s.headers,"x-goog-upload-url");if(s.status<200||s.status>=300)throw zo(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=Dx(c,e.baseUrl),d;try{d=await sf(a,{...o,method:"POST",headers:{"Content-Length":String(t),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"}},$s.createReadStream(e.filePath),e.signal)}catch(l){let f=r(l instanceof Error?l.message:String(l));throw jo(l,e.signal,"Gemini upload transfer failed.",f,{operation:"upload"})}if(d.status<200||d.status>=300)throw zo(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 Kx=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),jx=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function Ed(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 df(e){if(e?.length)return e.map(t=>({category:t.category??"UNSPECIFIED",probability:t.probability??"UNSPECIFIED",blocked:t.blocked??!1}))}function zx(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 Hx(e){return/-c\d+$/.test(e)}function Qx(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 Fx=2e3;function Yx(e){return new Promise(t=>setTimeout(t,e))}function Sd(e,t,n,o,i,r){if(e instanceof P)return new P(e.code,Mi(e.message,o),{retryable:e.retryable,details:e.details.map(d=>Mi(d,o)),attempts:e.attempts,usage:e.usage,classification:gi(e.failure),context:{...ar(e.failure),provider:i,model:r,operation:n},modelFailures:e.modelFailures});let s=Mi(e instanceof Error?e.message:String(e),o),c=Cs(e),a={provider:i,model:r,operation:n};return c!==null?zo(c,`Gemini ${n} failed.`,s.slice(0,500),a):jo(e,t,`Gemini ${n} failed.`,s.slice(0,500),a)}var Li=class{constructor(t,n,o,i){this.provider=t;this.model=n;this.apiKey=o;this.client=i??Zx(o,t.timeoutMs,t.baseUrl,t.protocol==="google-vertex")}provider;model;apiKey;client;async prepare(t,n,o,i){return o==="base64"||this.provider.protocol==="google-vertex"?{kind:"base64",data:pf.readFileSync(t,"base64"),mimeType:n}:{kind:"file-api",file:await this.uploadFile(t,n,i)}}async uploadFile(t,n,o){let{value:i}=await Yt(this.provider.maxAttempts,async()=>{try{return await this.client.files.upload({file:t,config:{mimeType:n}})}catch(s){throw Sd(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 Yx(Fx),!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 Sd(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:[Mi(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 generateMedia(t,n){let o=!!t.responseJsonSchema&&Hx(this.model.model),i={mediaResolution:"MEDIA_RESOLUTION_HIGH"},r=[t.system?.trim(),o?`\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
|
|
144
|
+
`)}function qu(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 S("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 S("--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 S("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=Ns(Z_);return[{text:d,data:{content:d,versions:[],unreleased:!0}},J]}let s=X_(),c=W_();if(n){if(kr(n),!s.includes(n))throw sd(n,s);let d=Ns(n);return[{text:d,data:{content:d,versions:[n],unreleased:!1}},J]}if(o||i){if(!o)throw new S("--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>"]}});kr(o);let d=i||c;if(kr(d),!s.includes(d))throw sd(d,s);let p=s.filter(f=>ad(f,o)>0&&ad(f,d)<=0);if(p.length===0)throw ex(o,d);let l=tx(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},J]}if(!s.includes(c))throw sd(c,s);let a=Ns(c);return[{text:a,data:{content:a,versions:[c],unreleased:!1}},J]}import*as Tt from"node:fs";import*as Qo from"node:path";import{createRequire as iE}from"node:module";import*as Dn from"node:fs";import*as lo from"node:path";import*as Wu from"node:os";import{fileURLToPath as nx}from"node:url";function Zu(e){return e.startsWith("~")?lo.join(Wu.homedir(),e.slice(1)):e}function ox(e){let t=Dn.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 dd(){let e=[],t=(process.env.SCRIPTCTL_ENV_FILE??"").trim();t&&e.push(Zu(t));let n=(process.env.SCRIPTCTL_SKILL_DIR??"").trim();n&&e.push(lo.join(Zu(n),".env"));let o;try{o=nx(import.meta.url)}catch{o=process.cwd()}let i=lo.resolve(o),r=new Set;for(;;){let s=lo.dirname(i);if(s===i||r.has(s))break;r.add(s),e.push(lo.join(s,".env")),i=s}return e}function Xu(){let e=process.env.SCRIPTCTL_NO_DOTENV;if(e==="1"||e==="true"||e==="True")return;let t=new Set;for(let n of dd()){let o;try{o=Dn.existsSync(n)?Dn.realpathSync(n):n}catch{o=n}t.has(o)||!Dn.existsSync(n)||!Dn.statSync(n).isFile()||(t.add(o),ox(n))}}var le=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 pd(e,t){if(e.updateEpisodeCount)try{await e.updateEpisodeCount(t)}catch{}}function ef(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 vr from"node:fs";import*as nf from"node:os";import*as br from"node:path";import{parseDocument as ix}from"yaml";function ie(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var wn={"direct.episode-titles":ie("direct.episode-titles","tool",4096),"direct.batch-extract":ie("direct.batch-extract","text",16e3),"direct.episode-synopsis":ie("direct.episode-synopsis","tool",2048),"direct.synopsis-reduction":ie("direct.synopsis-reduction","tool",4096),"direct.script-synopsis":ie("direct.script-synopsis","tool",2048),"direct.asset-grouping":ie("direct.asset-grouping","text",8e3),"direct.asset-curation":ie("direct.asset-curation","text",2e4),"direct.asset-curation-audit":ie("direct.asset-curation-audit","text",2e4),"direct.location-canonicalization":ie("direct.location-canonicalization","text",2e4),"direct.state-curation":ie("direct.state-curation","text",2e4),"direct.state-binding":ie("direct.state-binding","tool",16e3),"metadata.global":ie("metadata.global","text",16e3),"metadata.descriptions":ie("metadata.descriptions","text",16e3),"synopsis.chunk":ie("synopsis.chunk","text",4096),"synopsis.episode":ie("synopsis.episode","text",4096),"synopsis.arc":ie("synopsis.arc","text",16e3),"synopsis.script-overview":ie("synopsis.script-overview","text",16e3),"ingest.body-start":ie("ingest.body-start","text",16e3),"ingest.arc-summary":ie("ingest.arc-summary","text",4096),"ingest.text-normalize":ie("ingest.text-normalize","text",32e3),"ingest.episode-assets":ie("ingest.episode-assets","tool",32e3),"ingest.name-fix":ie("ingest.name-fix","tool",16e3),"ingest.mention-resolve":ie("ingest.mention-resolve","text",8e3),"ingest.asset-extract":ie("ingest.asset-extract","text",8e3),"ingest.asset-curate":ie("ingest.asset-curate","text",32e3),"ingest.asset-recall":ie("ingest.asset-recall","text",65536),"ingest.asset-refine":ie("ingest.asset-refine","text",32e3),"ingest.state-reconcile":ie("ingest.state-reconcile","text",32e3),"ingest.asset-audit":ie("ingest.asset-audit","tool",32e3),"ingest.speaker-audit":ie("ingest.speaker-audit","tool",16e3),"ingest.comic-serial":{id:"ingest.comic-serial",mode:"document",version:"1",defaultProfile:"default"},"ingest.video-serial":ie("ingest.video-serial","video",65536)},tf=Object.keys(wn).filter(ld);function ld(e){return Object.hasOwn(wn,e)}var rx=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts","videoResponseSchemaField","videoUploadMode","documentResponseSchemaField","documentUploadMode"]),sx=new Set(["provider","model","thinking","reasoning","temperature"]),ax=new Set(["env"]),cx=new Set(["budgetTokens"]);function Ne(e,t=[]){return new S(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 md(e,t){let n;try{n=new URL(e)}catch{throw Ne(`${t} must be an absolute URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw Ne(`${t} must use http or https.`);return n.toString().replace(/\/$/,"")}function gd(e,t="provider base URL"){return md(e,t)}function dx(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function uo(e,t){if(!dx(e))throw Ne(`${t} must be a mapping.`,[`${t}: ${typeof e}`]);return e}function Ko(e,t){if(typeof e!="string"||!e.trim())throw Ne(`${t} must be a non-empty string.`);return e.trim()}function fd(e,t,n,o){if(!Number.isInteger(e)||typeof e!="number"||e<n||o!==void 0&&e>o)throw Ne(`${t} must be an integer in ${o===void 0?`[${n}, +\u221E)`:`[${n}, ${o}]`}.`);return e}function Or(e,t,n){let o=Object.keys(e).filter(i=>!t.has(i));if(o.length>0)throw Ne(`${n} contains unknown fields.`,o)}function px(e,t){let n=uo(t,`providers.${e}`);Or(n,rx,`providers.${e}`);let o=Ko(n.protocol,`providers.${e}.protocol`);if(o!=="anthropic"&&o!=="openai-compatible"&&o!=="google-gemini"&&o!=="google-vertex")throw Ne(`providers.${e}.protocol is unsupported.`,[o]);let i=n.baseUrl===void 0&&o!=="openai-compatible"?null:md(Ko(n.baseUrl,`providers.${e}.baseUrl`),`providers.${e}.baseUrl`),r="";if(o!=="google-vertex"){let c=uo(n.apiKey,`providers.${e}.apiKey`);if(Or(c,ax,`providers.${e}.apiKey`),r=Ko(c.env,`providers.${e}.apiKey.env`),!/^[A-Za-z_][A-Za-z0-9_]*$/.test(r))throw Ne(`providers.${e}.apiKey.env must be an environment variable name.`)}let s={protocol:o,baseUrl:i,apiKeyEnv:r,timeoutMs:fd(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:fd(n.maxAttempts,`providers.${e}.maxAttempts`,1,6)};for(let c of["videoResponseSchemaField","documentResponseSchemaField"]){let a=n[c];if(a!==void 0){if(o!=="google-gemini"&&o!=="google-vertex")throw Ne(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="responseJsonSchema"&&a!=="responseSchema")throw Ne(`providers.${e}.${c} must be responseJsonSchema or responseSchema.`);s[c]=a}}for(let c of["videoUploadMode","documentUploadMode"]){let a=n[c];if(a!==void 0){if(o!=="google-gemini"&&o!=="google-vertex")throw Ne(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="file-api"&&a!=="base64")throw Ne(`providers.${e}.${c} must be file-api or base64.`);s[c]=a}}return s}function lx(e,t,n){let o=uo(t,`models.${e}`);Or(o,sx,`models.${e}`);let i=Ko(o.provider,`models.${e}.provider`),r=n[i];if(!r)throw Ne(`models.${e} references an unknown provider.`,[i]);let s={provider:i,model:Ko(o.model,`models.${e}.model`)};if(o.reasoning!==void 0&&(s.reasoning=Ko(o.reasoning,`models.${e}.reasoning`)),o.temperature!==void 0){let c=o.temperature;if(typeof c!="number"||!Number.isFinite(c)||c<0)throw Ne(`models.${e}.temperature must be a number \u2265 0.`);s.temperature=c}if(o.thinking!==void 0){if(r.protocol!=="anthropic")throw Ne(`models.${e}.thinking is only valid for anthropic providers.`);let c=uo(o.thinking,`models.${e}.thinking`);Or(c,cx,`models.${e}.thinking`),s.thinkingBudgetTokens=fd(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function ux(e,t){let n=uo(e,"config");if(Or(n,new Set(["version","providers","models","tasks"]),"config"),n.version!==1)throw Ne("config.version must be 1.");let o=uo(n.providers,"providers"),i={};for(let[a,d]of Object.entries(o))i[a]=px(a,d);let r=uo(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=lx(a,d,i);if(!s.default)throw Ne("models.default is required.");let c={};if(n.tasks!==void 0){let a=uo(n.tasks,"tasks");for(let[d,p]of Object.entries(a)){if(!ld(d))throw Ne("tasks contains an unknown task id.",[d]);let l=Ko(p,`tasks.${d}`);if(!s[l])throw Ne(`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 Mi={version:1,providers:{gw:{protocol:"openai-compatible",baseUrl:null,apiKeyEnv:"PROJECT_LITELLM_GATEWAY_API_KEY",timeoutMs:3e5,maxAttempts:3},"google-gemini":{protocol:"google-vertex",baseUrl:null,apiKeyEnv:"",timeoutMs:6e5,maxAttempts:3},nnyyai:{protocol:"google-gemini",baseUrl:"https://api.nnyyai.com",apiKeyEnv:"NNYYAI_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64",documentResponseSchemaField:"responseSchema",documentUploadMode:"base64"}},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:"nnyyai",model:"gemini-3.8-flash"},"ingest-comic":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-text":{provider:"google-gemini",model:"gemini-3.8-flash",temperature:0},"review-comic":{provider:"nnyyai",model:"gemini-3.8-flash",temperature:0},"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","ingest.comic-serial":"ingest-comic"},source:"builtin",sourcePath:null};function fx(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?md(e,"PROJECT_LITELLM_GATEWAY_BASE_URL"):null;return{...Mi,providers:{gw:{...Mi.providers.gw,baseUrl:t},"google-gemini":{...Mi.providers["google-gemini"]},nnyyai:{...Mi.providers.nnyyai}},models:{...Mi.models},tasks:{...Mi.tasks}}}function mx(){let e=(process.env.XDG_CONFIG_HOME??"").trim();return e?br.join(e,"scriptctl","llm.yaml"):br.join(nf.homedir(),".config","scriptctl","llm.yaml")}function ud(e){if(!vr.existsSync(e))throw Ne("LLM configuration file does not exist.",[e]);let t=ix(vr.readFileSync(e,"utf-8"),{uniqueKeys:!0});if(t.errors.length>0)throw Ne("LLM configuration YAML is invalid.",t.errors.map(o=>o.message));let n=t.toJS();return ux(n,br.resolve(e))}function Li(e){let t=(e??"").trim();if(t)return ud(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return ud(n);let o=mx();return vr.existsSync(o)?ud(o):fx()}import*as yf from"node:crypto";import*as wf from"node:fs";import yx,{APIConnectionError as wx,APIConnectionTimeoutError as _x,APIError as xx,APIUserAbortError as Ex}from"@anthropic-ai/sdk";var hd=1e8;function gx(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 C=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=vt(o.classification??gx(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function hx(e){return new Promise(t=>setTimeout(t,e))}function Qt(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 Ft(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 C&&(n=Qt(n,i.usage),i.attempts=o,i.usage=n),!(i instanceof C)||!i.retryable||o===e)throw i;await hx(Math.min(3e4,1e3*2**(o-1)))}throw new Error("unreachable retry state")}function of(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 rf(e){if(e instanceof C)return e;if(e instanceof Ex)return new C("request_failed","Anthropic request was aborted.");if(e instanceof _x)return new C("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof wx)return new C("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof xx){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 C(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 C("request_failed","Anthropic request failed.",{details:[t.slice(0,500)]})}var Cs=class{constructor(t,n,o){this.provider=t;this.model=n;let i={apiKey:o};t.baseUrl&&(i.baseURL=t.baseUrl),this.client=new yx({...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 Ft(this.provider.maxAttempts,async()=>{try{let o=await this.client.messages.create(this.params(t),{timeout:this.provider.timeoutMs,signal:t.signal}),i=of(o);if(o.stop_reason==="max_tokens")throw new C("truncated","Provider output was truncated.",{usage:i});if(o.stop_reason==="refusal")throw new C("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 C("empty_response","Provider returned an empty text response.",{usage:i});return{text:r,finishReason:o.stop_reason??"",usage:i,raw:o}}catch(o){throw rf(o)}});return{...n.value,attempts:n.attempts,usage:Qt(n.failedUsage,n.value.usage)}}async generateTool(t){let n=await Ft(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=of(i);if(i.stop_reason==="max_tokens")throw new C("truncated","Provider tool output was truncated.",{usage:r});if(i.stop_reason==="refusal")throw new C("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 C("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 rf(o)}});return{...n.value,attempts:n.attempts,usage:Qt(n.failedUsage,n.value.usage)}}};import*as xd from"node:fs";import*as Ed from"node:path";import{File as Ox}from"node:buffer";import{Agent as vx,fetch as Ts,FormData as Rx}from"undici";function Sx(e){return typeof e=="object"&&e!==null}function yd(e){let t=[],n=new Set,o=e;for(;Sx(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function Ps(e){for(let t of yd(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function Ix(e){for(let t of yd(e))if(typeof t.code=="string")return t.code}function Ax(e){for(let t of yd(e))if(typeof t.name=="string")return t.name}function kx(e){let t=Ax(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function bx(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 jo(e,t,n,o,i={}){if(t?.aborted)return new C("cancelled",n,{details:[o],classification:{failure_type:"cancelled",failure_code:"cancelled"},context:i});let r=Ix(e),s=kx(e)?{failure_type:"timeout",failure_code:"request_timeout"}:bx(r),c=s.failure_type==="timeout"?"timeout":"network";return new C(c,n,{retryable:!0,details:[o],classification:s,context:{...i,...r?{system_code:r}:{}}})}function zo(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 C(i,t,{retryable:s,details:[`status: ${e}`,n],classification:r,context:{...o,http_status:e}})}var Mx=2e3;function Lx(e){return new Promise(t=>setTimeout(t,e))}function wd(e,t,n,o){if(e instanceof C)return e;let i=e instanceof Error?e.message:String(e),r=Ps(e),s={provider:"doubao",model:o,operation:n};return r!==null?zo(r,`Doubao ${n} failed.`,i.slice(0,500),s):jo(e,t,`Doubao ${n} failed.`,i.slice(0,500),s)}function Nx(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 Ux(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 Vs=class{constructor(t,n,o,i,r,s){this.model=t;this.timeoutMs=n;this.maxAttempts=o;this.client=s??Cx(i,r,n)}model;timeoutMs;maxAttempts;client;async run(t){let{value:n}=await Ft(this.maxAttempts,async()=>{try{return await this.client.uploadFile({filePath:t.localPath,mimeType:t.localMime,fps:t.fps})}catch(i){throw wd(i,t.signal,"upload",this.model)}});if(!n.id)throw new C("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 C("cancelled","Doubao upload aborted.",{context:{provider:"doubao",model:this.model,operation:"file_poll"}});if(Date.now()>=o)throw new C("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 Lx(Mx);let r;try{r=await this.client.getFile({id:t})}catch(s){throw wd(s,n,"file_poll",this.model)}i=(r.status??"").toLowerCase()}if(i==="failed"||i==="error")throw new C("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,n.acceptsText)}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 generateDocument(t,n){let o=t.media.kind==="base64"?t.media.data:n?xd.readFileSync(n).toString("base64"):void 0;if(!o)throw new C("invalid_response","Doubao PDF recovery requires the original document bytes.");let i={model:this.model,input:[{role:"user",content:[{type:"input_file",filename:n?Ed.basename(n):"document.pdf",file_data:`data:application/pdf;base64,${o}`},{type:"input_text",text:t.user}]}]};return t.system?.trim()&&(i.instructions=t.system),t.responseJsonSchema&&(i.text={format:{type:"json_schema",name:"document",schema:t.responseJsonSchema}}),this.generateResponse(i,t.signal,!!t.responseJsonSchema)}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,i){let{value:r,attempts:s,failedUsage:c}=await Ft(this.maxAttempts,async()=>{let a;try{a=await this.client.createResponse(t,n)}catch(f){throw wd(f,n,"generate",this.model)}let d=(a.status??"").toLowerCase(),p=Nx(a.usage);if(d==="incomplete"){let f=a.incomplete_details?.reason??"unknown";throw f==="max_output_tokens"||f==="length"?new C("truncated","Doubao output was truncated.",{usage:p}):new C("content_filtered",`Doubao response incomplete (reason=${f}).`,{usage:p})}let l=Ux(a);if(!l)throw new C("empty_response","Doubao returned an empty response.",{retryable:!0,usage:p});if(i&&!i(l))throw new C("invalid_response","Doubao response does not match the requested output format.",{retryable:!0,usage:p,context:{provider:"doubao",model:this.model,operation:"generate"}});if(o)try{JSON.parse(l)}catch{throw new C("invalid_response","Doubao returned malformed JSON for a structured response.",{retryable:!0,usage:p,context:{provider:"doubao",model:this.model,operation:"generate"}})}return{text:l,usage:p,raw:a}});return{text:r.text,finishReason:"STOP",attempts:s,usage:Qt(c,r.usage),raw:r.raw}}},_d=class extends Error{constructor(n,o){super(o);this.status=n;this.name="HttpError"}status};function Cx(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new vx({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 _d(a.status,d.slice(0,500))}return{async uploadFile({filePath:a,mimeType:d,fps:p}){let l=new Rx,f=xd.readFileSync(a);l.append("file",new Ox([f],Ed.basename(a),{type:d})),l.append("purpose","user_data"),l.append("preprocess_configs[video][fps]",String(p));let u=await Ts(`${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 Ts(`${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 Ts(`${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 Ts(`${o}/files/${a}`,{method:"DELETE",headers:i,signal:s(),dispatcher:r});d.ok||await c(d)}}}import{GoogleAuth as Px}from"google-auth-library";function $s(){let e=process.env.GOOGLE_CLOUD_PROJECT?.trim();if(!e)throw new Error("GOOGLE_CLOUD_PROJECT is required for official Vertex AI");return e}var sf=new Px({scopes:["https://www.googleapis.com/auth/cloud-platform"]});import*as lf from"node:fs";import{createRequire as Kx}from"node:module";import*as Ds from"node:fs";import*as Tx from"node:http";import*as Vx from"node:https";import{HttpsProxyAgent as $x}from"https-proxy-agent";var cf="https://generativelanguage.googleapis.com";function Dx(e,t){let n=new URL(e??cf);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function Gx(e,t){let n=new URL(t??cf),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 Ni(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 Jx(e){return e?new $x(e):void 0}function af(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?Tx:Vx).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 Bx(e,t){let n=e[t];return Array.isArray(n)?n[0]??"":n??""}async function df(e){let t=Ds.statSync(e.filePath).size,o={agent:Jx(e.proxyUrl??""),timeout:e.timeoutMs},i=Dx(e.baseUrl,e.apiKey),r=l=>Ni(l,e.apiKey),s;try{s=await af(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 jo(l,e.signal,"Gemini upload start failed.",f,{operation:"upload"})}let c=Bx(s.headers,"x-goog-upload-url");if(s.status<200||s.status>=300)throw zo(s.status,"Gemini upload start failed.",r(s.body).slice(0,300),{operation:"upload"});if(!c)throw new C("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=Gx(c,e.baseUrl),d;try{d=await af(a,{...o,method:"POST",headers:{"Content-Length":String(t),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"}},Ds.createReadStream(e.filePath),e.signal)}catch(l){let f=r(l instanceof Error?l.message:String(l));throw jo(l,e.signal,"Gemini upload transfer failed.",f,{operation:"upload"})}if(d.status<200||d.status>=300)throw zo(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 C("invalid_response","Gemini upload returned invalid JSON.",{details:[r(d.body).slice(0,300)]})}if(!p.file)throw new C("invalid_response","Gemini upload returned no file.",{details:[r(d.body).slice(0,300)]});return p.file}var jx=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),zx=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function Sd(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 pf(e){if(e?.length)return e.map(t=>({category:t.category??"UNSPECIFIED",probability:t.probability??"UNSPECIFIED",blocked:t.blocked??!1}))}function Hx(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 Qx(e){return/-c\d+$/.test(e)}function Fx(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 Yx=2e3;function qx(e){return new Promise(t=>setTimeout(t,e))}function Id(e,t,n,o,i,r){if(e instanceof C)return new C(e.code,Ni(e.message,o),{retryable:e.retryable,details:e.details.map(d=>Ni(d,o)),attempts:e.attempts,usage:e.usage,classification:yi(e.failure),context:{...cr(e.failure),provider:i,model:r,operation:n},modelFailures:e.modelFailures});let s=Ni(e instanceof Error?e.message:String(e),o),c=Ps(e),a={provider:i,model:r,operation:n};return c!==null?zo(c,`Gemini ${n} failed.`,s.slice(0,500),a):jo(e,t,`Gemini ${n} failed.`,s.slice(0,500),a)}var Ui=class{constructor(t,n,o,i){this.provider=t;this.model=n;this.apiKey=o;this.client=i??Wx(o,t.timeoutMs,t.baseUrl,t.protocol==="google-vertex")}provider;model;apiKey;client;async prepare(t,n,o,i){return o==="base64"||this.provider.protocol==="google-vertex"?{kind:"base64",data:lf.readFileSync(t,"base64"),mimeType:n}:{kind:"file-api",file:await this.uploadFile(t,n,i)}}async uploadFile(t,n,o){let{value:i}=await Ft(this.provider.maxAttempts,async()=>{try{return await this.client.files.upload({file:t,config:{mimeType:n}})}catch(s){throw Id(s,o,"upload",this.apiKey,this.model.provider,this.model.model)}}),r=await this.pollActive(i,o);if(!r.name||!r.uri)throw new C("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 C("cancelled","Gemini upload aborted.",{context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});if(Date.now()>=i)throw new C("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 qx(Yx),!o.name)throw new C("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 Id(r,n,"file_poll",this.apiKey,this.model.provider,this.model.model)}}if((o.state??"").toUpperCase()==="FAILED")throw new C("invalid_response","Gemini file processing failed.",{details:[Ni(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 generateMedia(t,n){let o=!!t.responseJsonSchema&&Qx(this.model.model),i={mediaResolution:"MEDIA_RESOLUTION_HIGH"},r=[t.system?.trim(),o?`\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
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
147
|
<output_json_schema>
|
|
148
148
|
${JSON.stringify(t.responseJsonSchema,null,2)}
|
|
@@ -150,115 +150,115 @@ ${JSON.stringify(t.responseJsonSchema,null,2)}
|
|
|
150
150
|
|
|
151
151
|
`);if(r&&(i.systemInstruction=r),t.responseJsonSchema&&!o){i.responseMimeType="application/json";let p=n?this.provider.videoResponseSchemaField:this.provider.documentResponseSchemaField;i[p??"responseJsonSchema"]=t.responseJsonSchema}let s={model:this.model.model,contents:[{role:"user",parts:[t.media.kind==="file-api"?{fileData:{fileUri:t.media.file.uri,mimeType:t.media.file.mimeType},...n?{videoMetadata:n}:{}}:{inlineData:{data:t.media.data,mimeType:t.media.mimeType},...n?{videoMetadata:n}:{}},{text:o?`${t.user}
|
|
152
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:i},{value:c,attempts:a,failedUsage:d}=await
|
|
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:i},{value:c,attempts:a,failedUsage:d}=await Ft(this.provider.maxAttempts,async()=>{let p;try{if(this.client.models.generateContentStream){let w="",g={},_=await this.client.models.generateContentStream(s);for await(let E of _)E.text&&(w+=E.text),g={...g,...E,usageMetadata:E.usageMetadata??g.usageMetadata,promptFeedback:E.promptFeedback??g.promptFeedback,candidates:E.candidates??g.candidates};p={...g,text:w}}else p=await this.client.models.generateContent(s)}catch(w){throw Id(w,t.signal,"generate",this.apiKey,this.model.provider,this.model.model)}let l=p.candidates?.[0],f=l?.finishReason??"",u=p.promptFeedback?.blockReason??"",h=Hx(p.usageMetadata),y={provider:this.model.provider,model:this.model.model,operation:"generate"};if(f==="MAX_TOKENS")throw new C("truncated","Gemini output was truncated.",{usage:h,context:y});if(u)throw new C("content_filtered",`Gemini blocked the prompt (blockReason=${u}).`,{usage:h,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...y,provider_source:"prompt",provider_reason:Sd(u),...Sd(u)==="UNKNOWN"?{provider_reason_raw:u}:{},safety_ratings:pf(p.promptFeedback?.safetyRatings)}});if(jx.has(f))throw new C("content_filtered",`Gemini filtered the response (finishReason=${f}).`,{usage:h,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...y,provider_source:"candidate",provider_reason:Sd(f),finish_message:l?.finishMessage,safety_ratings:pf(l?.safetyRatings)}});let m=(p.text??"").trim();if(!m)throw zx.has(f)?new C("invalid_response",`Gemini returned no usable response (finishReason=${f}).`,{usage:h,context:{...y,provider_reason_raw:f,finish_message:l?.finishMessage}}):new C("empty_response",`Gemini returned an empty response (finishReason=${f||"none"}).`,{retryable:!0,usage:h,context:y});if(t.acceptsText&&!t.acceptsText(m))throw new C("invalid_response","Gemini response does not match the requested output format.",{retryable:!0,usage:h,context:{...y,provider_reason_raw:m.slice(0,200)}});if(!f)throw new C("invalid_response","Gemini stream ended before the response finished.",{retryable:!0,usage:h,context:{...y,provider_reason_raw:"missing_finish_reason"}});if(t.responseJsonSchema)try{let w=o?Fx(m):m;return JSON.parse(w),{text:w,finishReason:f,usage:h,raw:p}}catch{throw new C("invalid_response","Gemini returned malformed JSON for a structured media response.",{retryable:!0,usage:h,context:y})}return{text:m,finishReason:f,usage:h,raw:p}});return{text:c.text,finishReason:c.finishReason,attempts:a,usage:Qt(d,c.usage),raw:c.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){}}},Zx=Kx(import.meta.url);function Wx(e,t,n,o){let{GoogleGenAI:i}=Zx("@google/genai"),r=new i({...o?{vertexai:!0,project:$s(),location:"global"}:{apiKey:e},httpOptions:{timeout:t,...n?{baseUrl:n}:{}}}),s=(process.env.https_proxy??process.env.HTTPS_PROXY??process.env.http_proxy??process.env.HTTP_PROXY??"").trim();return s&&!(process.env.NODE_USE_ENV_PROXY??"").trim()&&process.stderr.write(`\u26A0\uFE0F \u68C0\u6D4B\u5230\u4EE3\u7406 ${s}\uFF0C\u4F46\u672A\u8BBE NODE_USE_ENV_PROXY=1\u3002
|
|
154
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
155
|
\u8BF7\u5728\u547D\u4EE4\u524D\u52A0 NODE_USE_ENV_PROXY=1 \u91CD\u8DD1\u3002
|
|
156
|
-
`),{files:{upload:c=>
|
|
157
|
-
`).trim():""}function mf(e){try{return JSON.parse(e)}catch{throw new P("invalid_response","Provider returned invalid JSON.",{details:[e.slice(0,500)]})}}var Gs=class{constructor(t,n,o){this.provider=t;this.model=n;this.apiKey=o;if(!t.baseUrl&&t.protocol!=="google-vertex")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=t.protocol==="google-vertex"?`https://aiplatform.googleapis.com/v1/projects/${Vs()}/locations/global/endpoints/openapi/chat/completions`:Wx(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 Yt(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.provider.protocol==="google-vertex"?await rf.getAccessToken():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 mf(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.provider.protocol==="google-vertex"?`google/${this.model.model.replace(/^google\//,"")}`: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=Ft(i,lf(n,this.provider.protocol==="google-vertex"));try{let s=uf(n),c=ff(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=Xx(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=Ft(i,lf(n,this.provider.protocol==="google-vertex"));try{let s=uf(n),c=ff(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=gf(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(!Gn(d)||!Gn(d.function))continue;let p=d.function;if(!(p.name!==t.tool.name||typeof p.arguments!="string"))return{input:mf(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 xn={model:"ep-20260721150136-98dj9",modelEnv:"ARK_MODEL",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",apiKeyEnv:"ARK_API_KEY",timeoutMs:6e5,maxAttempts:3},eE=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function tE(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function Ad(e,t,n){let o=_n[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:tE(t.baseUrl),model:n.model,thinkingBudgetTokens:n.thinkingBudgetTokens??null,...o.mode==="video"&&t.videoResponseSchemaField==="responseSchema"?{videoResponseSchemaField:t.videoResponseSchemaField}:{},...o.mode==="document"&&t.documentResponseSchemaField==="responseSchema"?{documentResponseSchemaField:t.documentResponseSchemaField}:{}});return hf.createHash("sha256").update(i).digest("hex")}function Ge(e,t,n){return new S(e,{exitCode:b,errorCode:"LLM_CONFIG_INVALID",hint:"Fix the selected LLM configuration and run `scriptctl doctor`.",data:{expected:t,actual:n}})}function Ni(e){return new S("The selected LLM provider credential is not configured.",{exitCode:me,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 Ho(e,t){return Rt(gi(e.failure),{...ar(e.failure),provider:t.provider,model:t.model,retryable:e.failure.retryable,message:e.message})}function Ui(e,t){if(t.length===1)return e;let n=Tl(t,"All configured model routes failed.");return new P(e.code,n.message,{retryable:n.retryable,classification:gi(n),context:ar(n),modelFailures:t,details:t.map(ln)})}function nE(e){return["google-gemini","google-vertex"].includes(e.protocol)||/(^|\/)gemini-/i.test(e.model)}function Id(e){let t=e.info.model.slice(0,e.info.model.lastIndexOf("/")+1);return[...new Set([e.info.model,...eE.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:Ad(e.info.task,e.providerConfig,i)}}})}function fo(e,t){return!t?.aborted&&e instanceof P&&e.code!=="cancelled"}var Rr=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=_n[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 Ge("The task route references a missing model profile.",[i],[`task: ${t}`]);let s=this.config.providers[r.provider];if(!s)throw Ge("The model profile references a missing provider.",[r.provider],[`profile: ${i}`]);if(s.protocol==="openai-compatible"&&!s.baseUrl)throw Ge("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 Ge("Anthropic thinking cannot be combined with a forced tool call.",["a text task or a profile without thinking"],[`task: ${t}`,`profile: ${i}`]);if(o.mode!=="document"&&r.thinkingBudgetTokens!==void 0&&r.thinkingBudgetTokens>=o.maxOutputTokens)throw Ge("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,protocol:"google-gemini",baseUrl:md(c.baseUrl,"--provider-base-url")}:s,d=c?.model?{...r,model:c.model.trim()}:r;if(c?.model!==void 0&&!d.model)throw Ge("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:Ad(t,a,d),...o.mode==="video"&&a.videoUploadMode?{videoUploadMode:a.videoUploadMode}:{}},providerConfig:a,modelConfig:d};return this.resolvedRoutes.set(t,p),p}route(t){return this.resolve(t).info}routes(){return ef.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 Ge("Doubao requires --provider-model or ARK_MODEL.",["--provider-model <id> or ARK_MODEL"],["model: empty"]);let r={protocol:"openai-compatible",baseUrl:o?.baseUrl?md(o.baseUrl,"--provider-base-url"):xn.baseUrl,apiKeyEnv:xn.apiKeyEnv,timeoutMs:xn.timeoutMs,maxAttempts:xn.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:Ad(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&&t.providerConfig.protocol!=="google-vertex")throw Ni(t.info.provider);let r=t.providerConfig.protocol==="anthropic"?new Us(t.providerConfig,t.modelConfig,i):new Gs(t.providerConfig,t.modelConfig,i);return this.adapters.set(n,r),r}videoAdapter(t){if(!["google-gemini","google-vertex"].includes(t.providerConfig.protocol))throw Ge("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&&t.providerConfig.protocol!=="google-vertex")throw Ni(t.info.provider);let s=new Ds(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&&(n||t.providerConfig.protocol!=="google-vertex"))throw Ni(t.info.provider);return o}documentPort(t){if(_n[t].mode!=="document")throw Ge("The task does not support document generation.",["document task"],[t]);let n=this.resolve(t);if(n.providerConfig.protocol!=="google-gemini"&&n.providerConfig.protocol!=="google-vertex")throw Ge("PDF tasks require a Gemini provider.",["google-gemini or google-vertex"],[n.providerConfig.protocol]);let o=(process.env[n.providerConfig.apiKeyEnv]??"").trim();if(!o&&n.providerConfig.protocol!=="google-vertex")throw Ni(n.info.provider);let i=new vr(n.providerConfig,n.modelConfig,o),r=new WeakMap;return{prepare:async(s,c)=>{let a;try{a=await i.prepare(s,c)}catch(d){if(!fo(d,c))throw d;process.stderr.write(`\u21AA\uFE0F PDF \u4E0A\u4F20\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u6587\u6863\u5B57\u8282\u7EE7\u7EED\u6A21\u578B\u8BF7\u6C42 (${ln(d.failure)})
|
|
158
|
-
`),a={kind:"base64",data:
|
|
159
|
-
`);continue}let y=this.arkAdapter();if(!y)throw
|
|
160
|
-
`);try{return await this.tracked(m,()=>y.generateDocument(s,r.get(s.media)))}catch(w){throw fo(w,s.signal)?
|
|
161
|
-
`);continue}if(!this.doubaoAdapter()||!r.localPath)throw
|
|
162
|
-
`);try{return await this.tracked(a,()=>i.run({localPath:r,localMime:s,user:n.user,fps:n.fps,maxOutputTokens:c.maxOutputTokens,...n.system?{system:n.system}:{},...n.responseJsonSchema?{responseJsonSchema:n.responseJsonSchema}:{},...n.acceptsText?{acceptsText:n.acceptsText}:{},...n.signal?{signal:n.signal}:{}}))}catch(d){throw fo(d,n.signal)?
|
|
163
|
-
`);continue}let h=this.doubaoTextAdapter();if(!h)throw
|
|
164
|
-
`);try{return await this.tracked(y,()=>o(h))}catch(m){throw fo(m,n)?
|
|
165
|
-
`),data:{checks:T}},J]}import{spawn as
|
|
166
|
-
`),data:{op:"update",changed:!1,update:a}},J];let d=await t(
|
|
167
|
-
`),go.renameSync(n,t),H("commit",`${go.statSync(t).size} bytes -> ${t} (tmp + atomic rename)`)}var
|
|
168
|
-
# ${c}`:i}function
|
|
169
|
-
`)}var
|
|
170
|
-
`);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]===
|
|
171
|
-
`)}})}}function
|
|
156
|
+
`),{files:{upload:c=>df({apiKey:e,filePath:c.file,mimeType:c.config?.mimeType??"video/mp4",timeoutMs:t,proxyUrl:s,baseUrl:n}),get:c=>r.files.get(c),delete:c=>r.files.delete(c)},models:{generateContent:c=>r.models.generateContent(c),generateContentStream:c=>r.models.generateContentStream(c)}}}var Rr=class{constructor(t,n,o,i){this.provider=t;this.transport=new Ui(t,n,o,i)}provider;transport;prepare(t,n){return this.transport.prepare(t,"application/pdf",this.provider.documentUploadMode??"file-api",n)}generate(t){return this.transport.generateMedia(t)}release(t,n){return this.transport.release(t,n)}};var Gs=class extends Ui{generate(t){let n=t.media;if(n.kind==="local-fallback"||n.kind==="local")throw new C("invalid_response","A local fallback video cannot be sent to Gemini.");return this.generateMedia({...t,media:n},{fps:t.fps})}};function uf(e,t){if(!Gn(e)||!Gn(e.usage))return{};let n=e.usage,o=a=>{let d=typeof a=="number"?a:0;return Number.isFinite(d)?d:0},i=Gn(n.prompt_tokens_details)?n.prompt_tokens_details:{},r=o(n.prompt_tokens),s=o(i.cached_tokens)||o(n.cache_read_input_tokens),c=o(i.cache_creation_tokens)||o(n.cache_creation_input_tokens);return{inputTokens:t?r:r+s+c,outputTokens:o(n.completion_tokens),cachedInputTokens:s,cacheCreationTokens:c}}function Gn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Xx(e){let t=e.trim().replace(/\/+$/,"");return t.endsWith("/chat/completions")?t:t.endsWith("/v1")?`${t}/chat/completions`:`${t}/v1/chat/completions`}function ff(e){return!Gn(e)||!Array.isArray(e.choices)?null:e.choices.find(Gn)??null}function mf(e){return e&&typeof e.finish_reason=="string"?e.finish_reason:""}function hf(e){return e&&Gn(e.message)?e.message:null}function eE(e){let t=hf(e)?.content;return typeof t=="string"?t.trim():Array.isArray(t)?t.flatMap(n=>Gn(n)&&typeof n.text=="string"?[n.text]:[]).join(`
|
|
157
|
+
`).trim():""}function gf(e){try{return JSON.parse(e)}catch{throw new C("invalid_response","Provider returned invalid JSON.",{details:[e.slice(0,500)]})}}var Js=class{constructor(t,n,o){this.provider=t;this.model=n;this.apiKey=o;if(!t.baseUrl&&t.protocol!=="google-vertex")throw new C("endpoint","OpenAI-compatible provider endpoint (baseUrl) is not set \u2014 the built-in gateway reads PROJECT_LITELLM_GATEWAY_BASE_URL.");this.url=t.protocol==="google-vertex"?`https://aiplatform.googleapis.com/v1/projects/${$s()}/locations/global/endpoints/openapi/chat/completions`:Xx(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 Ft(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.provider.protocol==="google-vertex"?await sf.getAccessToken():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 C(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 C(d,`OpenAI-compatible request to ${this.host} failed (status ${s.status}).`,{retryable:a,details:[`status: ${s.status}`,c.slice(0,500)]})}return gf(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.provider.protocol==="google-vertex"?`google/${this.model.model.replace(/^google\//,"")}`: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=Qt(i,uf(n,this.provider.protocol==="google-vertex"));try{let s=ff(n),c=mf(s);if(c==="length")throw new C("truncated","Provider output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new C("content_filtered",`Provider filtered the response (${c}).`);let a=eE(s);if(!a)throw new C("empty_response","Provider returned an empty text response.");return{text:a,finishReason:c,attempts:o,usage:r,raw:n}}catch(s){throw s instanceof C&&(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=Qt(i,uf(n,this.provider.protocol==="google-vertex"));try{let s=ff(n),c=mf(s);if(c==="length")throw new C("truncated","Provider tool output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new C("content_filtered",`Provider filtered the response (${c}).`);let a=hf(s)?.tool_calls;if(!Array.isArray(a))throw new C("invalid_response","Provider did not return a tool call.");for(let d of a){if(!Gn(d)||!Gn(d.function))continue;let p=d.function;if(!(p.name!==t.tool.name||typeof p.arguments!="string"))return{input:gf(p.arguments),finishReason:c,attempts:o,usage:r,raw:n}}throw new C("invalid_response","Provider did not return the required tool call.")}catch(s){throw s instanceof C&&(s.attempts=o,s.usage=r),s}}};var _n={model:"ep-20260721150136-98dj9",modelEnv:"ARK_MODEL",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",apiKeyEnv:"ARK_API_KEY",timeoutMs:6e5,maxAttempts:3},tE=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function nE(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function kd(e,t,n){let o=wn[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:nE(t.baseUrl),model:n.model,thinkingBudgetTokens:n.thinkingBudgetTokens??null,...o.mode==="video"&&t.videoResponseSchemaField==="responseSchema"?{videoResponseSchemaField:t.videoResponseSchemaField}:{},...o.mode==="document"&&t.documentResponseSchemaField==="responseSchema"?{documentResponseSchemaField:t.documentResponseSchemaField}:{}});return yf.createHash("sha256").update(i).digest("hex")}function Ge(e,t,n){return new S(e,{exitCode:b,errorCode:"LLM_CONFIG_INVALID",hint:"Fix the selected LLM configuration and run `scriptctl doctor`.",data:{expected:t,actual:n}})}function Ci(e){return new S("The selected LLM provider credential is not configured.",{exitCode:ge,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 Ho(e,t){return vt(yi(e.failure),{...cr(e.failure),provider:t.provider,model:t.model,retryable:e.failure.retryable,message:e.message})}function Pi(e,t){if(t.length===1)return e;let n=Vl(t,"All configured model routes failed.");return new C(e.code,n.message,{retryable:n.retryable,classification:yi(n),context:cr(n),modelFailures:t,details:t.map(pn)})}function oE(e){return["google-gemini","google-vertex"].includes(e.protocol)||/(^|\/)gemini-/i.test(e.model)}function Ad(e){let t=e.info.model.slice(0,e.info.model.lastIndexOf("/")+1);return[...new Set([e.info.model,...tE.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:kd(e.info.task,e.providerConfig,i)}}})}function fo(e,t){return!t?.aborted&&e instanceof C&&e.code!=="cancelled"}var Mr=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=wn[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 Ge("The task route references a missing model profile.",[i],[`task: ${t}`]);let s=this.config.providers[r.provider];if(!s)throw Ge("The model profile references a missing provider.",[r.provider],[`profile: ${i}`]);if(s.protocol==="openai-compatible"&&!s.baseUrl)throw Ge("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 Ge("Anthropic thinking cannot be combined with a forced tool call.",["a text task or a profile without thinking"],[`task: ${t}`,`profile: ${i}`]);if(o.mode!=="document"&&r.thinkingBudgetTokens!==void 0&&r.thinkingBudgetTokens>=o.maxOutputTokens)throw Ge("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,protocol:"google-gemini",baseUrl:gd(c.baseUrl,"--provider-base-url")}:s,d=c?.model?{...r,model:c.model.trim()}:r;if(c?.model!==void 0&&!d.model)throw Ge("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:kd(t,a,d),...o.mode==="video"&&a.videoUploadMode?{videoUploadMode:a.videoUploadMode}:{}},providerConfig:a,modelConfig:d};return this.resolvedRoutes.set(t,p),p}route(t){return this.resolve(t).info}routes(){return tf.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 C?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 Ge("Doubao requires --provider-model or ARK_MODEL.",["--provider-model <id> or ARK_MODEL"],["model: empty"]);let r={protocol:"openai-compatible",baseUrl:o?.baseUrl?gd(o.baseUrl,"--provider-base-url"):_n.baseUrl,apiKeyEnv:_n.apiKeyEnv,timeoutMs:_n.timeoutMs,maxAttempts:_n.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:kd(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&&t.providerConfig.protocol!=="google-vertex")throw Ci(t.info.provider);let r=t.providerConfig.protocol==="anthropic"?new Cs(t.providerConfig,t.modelConfig,i):new Js(t.providerConfig,t.modelConfig,i);return this.adapters.set(n,r),r}videoAdapter(t){if(!["google-gemini","google-vertex"].includes(t.providerConfig.protocol))throw Ge("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&&t.providerConfig.protocol!=="google-vertex")throw Ci(t.info.provider);let s=new Gs(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&&(n||t.providerConfig.protocol!=="google-vertex"))throw Ci(t.info.provider);return o}documentPort(t){if(wn[t].mode!=="document")throw Ge("The task does not support document generation.",["document task"],[t]);let n=this.resolve(t);if(n.providerConfig.protocol!=="google-gemini"&&n.providerConfig.protocol!=="google-vertex")throw Ge("PDF tasks require a Gemini provider.",["google-gemini or google-vertex"],[n.providerConfig.protocol]);let o=(process.env[n.providerConfig.apiKeyEnv]??"").trim();if(!o&&n.providerConfig.protocol!=="google-vertex")throw Ci(n.info.provider);let i=new Rr(n.providerConfig,n.modelConfig,o),r=new WeakMap;return{prepare:async(s,c)=>{let a;try{a=await i.prepare(s,c)}catch(d){if(!fo(d,c))throw d;process.stderr.write(`\u21AA\uFE0F PDF \u4E0A\u4F20\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u6587\u6863\u5B57\u8282\u7EE7\u7EED\u6A21\u578B\u8BF7\u6C42 (${pn(d.failure)})
|
|
158
|
+
`),a={kind:"base64",data:wf.readFileSync(s).toString("base64"),mimeType:"application/pdf"}}return r.set(a,s),a},generate:async s=>{let c=Ad(n),a=[];for(let[d,p]of c.entries()){s.signal?.throwIfAborted();let l=d===0?i:new Rr(p.providerConfig,p.modelConfig,o);try{return await this.tracked(p.info,()=>l.generate(s))}catch(f){if(!fo(f,s.signal))throw f;let u=Ho(f,p.info);a.push(u);let h=c[d+1];if(h){process.stderr.write(`\u21AA\uFE0F ${p.info.model} \u6587\u6863\u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${h.info.model} (${pn(u)})
|
|
159
|
+
`);continue}let y=this.arkAdapter();if(!y)throw Pi(f,a);let m=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F \u6587\u6863\u6A21\u578B\u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${m.model}
|
|
160
|
+
`);try{return await this.tracked(m,()=>y.generateDocument(s,r.get(s.media)))}catch(w){throw fo(w,s.signal)?Pi(w,[...a,Ho(w,m)]):w}}}throw new Error("Document model routes cannot be empty.")},release:async(s,c)=>{r.delete(s),await i.release(s,c)}}}videoPort(t){let n=wn[t];if(n.mode!=="video")throw Ge("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 Ci("doubao");return{prepare:async(s,c,a,d)=>{if(a!=="file-api")throw Ge("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 Ge("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.acceptsText?{acceptsText:s.acceptsText}:{},...s.signal?{signal:s.signal}:{}}))},release:async()=>{}}}if(!["google-gemini","google-vertex"].includes(o.providerConfig.protocol))throw Ge("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(!fo(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:Ho(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=Ad(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(!fo(p,r.signal))throw p;let l=Ho(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} (${pn(l)})
|
|
161
|
+
`);continue}if(!this.doubaoAdapter()||!r.localPath)throw Pi(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 Ci("doubao");let r=n.media.kind==="local-fallback"?n.media.path:n.localPath;if(!r)throw Ge("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=wn[t];if(c.mode!=="video")throw Ge("Expected a video task.",["video task"],[t]);let a=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F Gemini \u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${a.model}
|
|
162
|
+
`);try{return await this.tracked(a,()=>i.run({localPath:r,localMime:s,user:n.user,fps:n.fps,maxOutputTokens:c.maxOutputTokens,...n.system?{system:n.system}:{},...n.responseJsonSchema?{responseJsonSchema:n.responseJsonSchema}:{},...n.acceptsText?{acceptsText:n.acceptsText}:{},...n.signal?{signal:n.signal}:{}}))}catch(d){throw fo(d,n.signal)?Pi(d,[...o,Ho(d,a)]):d}}doubaoAdapter(t){return this.arkAdapter(t)}doubaoTextAdapter(){return this.arkAdapter()}arkAdapter(t){let n=t?this.videoCredential(t):(process.env[_n.apiKeyEnv]??"").trim();if(!n)return null;let o=t?.info.model??this.doubaoModel(),i=t?.providerConfig.baseUrl??_n.baseUrl,r=`doubao ${i} ${o}`,s=this.doubaoAdapters.get(r);if(s)return s;let c=new Vs(o,_n.timeoutMs,_n.maxAttempts,n,i);return this.doubaoAdapters.set(r,c),c}doubaoModel(){return(process.env[_n.modelEnv]??"").trim()||_n.model}async withTextFallback(t,n,o){let i=this.resolve(t),r=oE(i.info),s=r?Ad(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(!fo(l,n)||!r&&l.code!=="content_filtered")throw l;let f=Ho(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} (${pn(f)})
|
|
163
|
+
`);continue}let h=this.doubaoTextAdapter();if(!h)throw Pi(l,c);let y=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F \u4E3B\u6A21\u578B\u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${y.model}
|
|
164
|
+
`);try{return await this.tracked(y,()=>o(h))}catch(m){throw fo(m,n)?Pi(m,[...c,Ho(m,y)]):m}}}throw new Error("Text model routes cannot be empty.")}async generateText(t,n){let o=wn[t];if(o.mode!=="text")throw Ge("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=wn[t];if(o.mode!=="tool")throw Ge("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 _f(e,t){return new Mr(Li(e),t)}var rE=iE(import.meta.url);function Bs(e){try{return rE.resolve(e),!0}catch{return!1}}function sE(e){let t=!1;try{Tt.statSync(e).isDirectory()&&(Tt.accessSync(e,Tt.constants.W_OK),t=!0)}catch{t=!1}let n=!1;try{n=Tt.statSync(Qo.join(e,"script.json")).isFile()}catch{n=!1}return{writable:t,hasScript:n}}function aE(){return Qo.join(Qo.dirname(Qo.resolve("workspace")),"output")}function xf(e={}){let t=dd(),n=[],o=new Set;for(let R of t)try{if(!Tt.existsSync(R)||!Tt.statSync(R).isFile())continue;let j=Tt.realpathSync(R);if(o.has(j))continue;o.add(j),n.push(R)}catch{}let i=typeof e.llm_config=="string"?e.llm_config.trim():"",r=Li(i||void 0),c=new Mr(r).routes(),a=Object.entries(r.providers).map(([R,j])=>({alias:R,configured:!!(process.env[j.apiKeyEnv]??"").trim(),env:j.apiKeyEnv})),d=Object.entries(r.providers).filter(([,R])=>R.protocol==="openai-compatible").map(([R,j])=>{let W="not set";if(j.baseUrl)try{W=new URL(j.baseUrl).host}catch{W=j.baseUrl}return{alias:R,host:W}}),{mode:p}=ef(),l=(process.env.SCRIPTCTL_OUTPUT_DIR??"").trim()||aE(),f=p==="local"?sE(l):null,u=!!process.env.AWB_BASE_URL,h=!!process.env.LINGJING_AWB_ACCESS_KEY,y=!!process.env.SANDBOX_PROJECT_GROUP_NO,m={"@anthropic-ai/sdk":Bs("@anthropic-ai/sdk"),"@google/genai":Bs("@google/genai"),jszip:Bs("jszip"),"fast-xml-parser":Bs("fast-xml-parser")},w=Object.entries(m).filter(([,R])=>!R).map(([R])=>R),g=process.versions.node,_=`env_file: ${n[0]??"missing"}`,E=R=>R?"configured":"not configured",A=[`node: ${g}`,"storage: local-filesystem",_,`llm config: ${r.source}`,`llm routes: ${c.length}`,...a.map(R=>`llm provider ${R.alias}: ${E(R.configured)}`),...d.map(R=>`llm provider ${R.alias} endpoint: ${R.host}`)];p===null?A.push("output target: not configured"):p==="local"&&f?(A.push(`output writable: ${E(f.writable)}`),A.push(`output snapshot: ${f.hasScript?"present":"absent"}`)):(A.push(`gateway endpoint: ${E(u)}`),A.push(`gateway access credential: ${E(h)}`),A.push(`gateway project identifier: ${E(y)}`));for(let[R,j]of Object.entries(m))A.push(`dependency ${R}: ${j?"ok":"missing"}`);let k=[];w.length>0&&k.push("Install missing CLI dependencies (see above)."),a.some(R=>!R.configured)&&k.push("Configure every credential referenced by the selected LLM configuration."),d.some(R=>R.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||!h||!y)&&k.push("Configure gateway credentials before running `publish` / script CRUD against the remote project."),k.length===0&&k.push("Environment looks ready.");let[U,O]=g.split(".").map(R=>parseInt(R,10)),I=(U??0)>20||(U??0)===20&&(O??0)>=0,M=p===null?{configured:!1}:p==="local"?{dir:{ok:!!f?.writable,writable:!!f?.writable,hasScript:!!f?.hasScript}}:{endpoint:{ok:u},access:{ok:h},project:{ok:y}},T={node:{version:g,ok:I},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(R=>({alias:R.alias,ok:R.configured,credential_env:R.env,...d.find(j=>j.alias===R.alias)?{endpoint:d.find(j=>j.alias===R.alias).host}:{}})),profiles:Object.keys(r.models),routes:c.map(R=>({task:R.task,profile:R.profile,provider:R.provider,protocol:R.protocol,model:R.model}))},output:M,dependencies:m};return[{text:[...A,...k].join(`
|
|
165
|
+
`),data:{checks:T}},J]}import{spawn as cE}from"node:child_process";var Ks="@lingjingai/scriptctl",dE=`${Ks}@latest`,bd="npm";function pE(){return Ri()}function lE(e){let t=/^(\d+)\.(\d+)\.\d+/.exec(e);return t?`${Ks}@~${t[1]}.${t[2]}.0`:null}function uE(e){return["install","-g",e]}function fE(e,t){return[e,...t].join(" ")}function mE(e,t){return e.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0).slice(-t)}function gE(e,t){return new Promise(n=>{let o=cE(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 Ef(e,t=gE,n=pE){let o=!!e.patch,i=n(),r=o?lE(i):dE;if(!r)throw new S(`Cannot compute a patch update range from version ${i}.`,{exitCode:ge,errorCode:"UPDATE_VERSION_INVALID",hint:"Run `scriptctl update` without --patch to install the latest version.",data:{version:i}});let s=[...uE(r)],c=fE(bd,s),a={package:Ks,package_spec:r,command:bd,args:s,command_line:c};if(e.dry_run)return[{text:[`package: ${Ks}`,`command: ${c}`,"dry-run: no update performed"].join(`
|
|
166
|
+
`),data:{op:"update",changed:!1,update:a}},J];let d=await t(bd,s);if(d.error)throw new S(`Failed to start npm: ${d.error.message}`,{exitCode:ge,errorCode:"UPDATE_SPAWN_FAILED",hint:`Run '${c}' after fixing the npm installation.`,data:{update:a,cause:d.error.message}});if(d.exitCode!==J){let f=[`exit: ${d.exitCode===null?`signal ${d.signal??"unknown"}`:String(d.exitCode)}`,...mE(d.stderr,5).map(u=>`stderr: ${u}`)];throw new S("npm could not update scriptctl.",{exitCode:ge,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}},J]}function Sf(e,t){e.command("doctor").description("Check configuration and runtime dependencies").option("--llm-config <path>","LLM configuration file").action(q(xf,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(q(Ef,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(q(qu,t));be(n,["Release version"])}import*as Vr from"node:fs";import*as ra from"node:path";import{fileURLToPath as I5,pathToFileURL as A5}from"node:url";import*as ot from"node:fs";import*as nt from"node:path";import{createHash as dm}from"node:crypto";import{z as tt}from"zod";import*as go from"node:fs";var If=null,hE=0;function H(e,t){If&&If.push({fn:e,note:t,ms:Math.round((performance.now()-hE)*100)/100})}var yE=[["actor","actors","actor"],["location","locations","location"],["prop","props","prop"]];function mo(e){return Array.isArray(e)?e:[]}function Se(e){return typeof e=="string"?e:""}function Jn(e,t,n,o){if(t){if(e.has(t)&&e.get(t)!==n){o.add(t);return}e.set(t,n)}}function vd(e){return ho(JSON.parse(go.readFileSync(e,"utf8")),e)}function ho(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 yE)for(let l of mo(e[d])){let f={id:Se(l[`${p}_id`]),kind:a,name:Se(l[`${p}_name`]),aliases:mo(l.aliases).map(Se).filter(Boolean),importance:Se(l.importance),desc:Se(l.description),states:mo(l.states).map(u=>({id:Se(u.state_id),name:Se(u.state_name),desc:Se(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;mo(e.episodes).forEach((a,d)=>{let p={anchor:String(d+1),id:Se(a.episode_id),no:d+1,title:Se(a.title)||void 0,synopsis:Se(a.synopsis)||void 0,scenes:[],raw:a};mo(a.scenes).forEach((l,f)=>{s++;let u={anchor:n===4?Se(l.scene_id):`${d+1}-${f+1}`,id:Se(l.scene_id),no:f+1,gno:s,env:l.environment??{},location:Od(l.location,"location_id"),actors:mo(l.actors).map(h=>Od(h,"actor_id")).filter(Boolean),props:mo(l.props).map(h=>Od(h,"prop_id")).filter(Boolean),actions:[],raw:l,ep:p};mo(l.actions).forEach((h,y)=>{c++;let m={anchor:n===4?Se(h.action_id):`${d+1}-${f+1}-${y+1}`,no:y+1,gno:c,type:Se(h.type)||"action",content:Se(h.content),speaker:wE(h.speaker),paren:typeof h.parenthetical=="string"?h.parenthetical:typeof h.emotion=="string"?h.emotion:void 0,ts:Se(h.extend?.timestamp)||void 0,raw:h,scene:u};u.actions.push(m),Jn(o.actions,m.anchor,m,r),Jn(o.actions,`${d+1}-${f+1}-${y+1}`,m,r),n===3&&Jn(o.actions,`${p.id}/${u.id}#${y}`,m,r)}),p.scenes.push(u),Jn(o.scenes,u.anchor,u,r),Jn(o.scenes,`${d+1}-${f+1}`,u,r),Jn(o.scenes,`${p.id}/${u.id}`,u,r),Jn(o.scenes,u.id,u,r)}),o.episodes.push(p),Jn(o.eps,String(d+1),p,r),Jn(o.eps,p.id,p,r)});for(let a of r)o.actions.delete(a),o.scenes.delete(a),o.eps.delete(a);return H(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 Od(e,t){if(!e||typeof e!="object")return null;let n=Se(e[t]);if(!n)return null;let o=Array.isArray(e.state_ids)?e.state_ids.map(Se):e.state_id?[Se(e.state_id)]:[];return{id:n,states:o,raw:e}}function wE(e){if(!(!e||typeof e!="object")){if(e.actor_id)return{id:Se(e.actor_id),state:Se(e.state_id)||void 0};if(e.kind)return{kind:Se(e.kind),label:Se(e.label)||void 0}}}function Ue(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)??_E(e,p);if(f){let u=f.states.filter(h=>h.id===l||h.name===l);if(u.length===1)return H("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(h=>`${h.id}(${h.name})`).join(", ")})`)}}let i=e.actions.get(n);if(i)return H("resolve",`"${n}" -> action map hit -> ${i.anchor}`),{t:"action",action:i};let r=e.scenes.get(n);if(r)return H("resolve",`"${n}" -> scene map hit -> ${r.anchor}`),{t:"scene",scene:r};let s=e.eps.get(n);if(s)return H("resolve",`"${n}" -> episode map hit -> ${s.id}`),{t:"ep",ep:s};let c=e.byId.get(n);if(c)return H("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 H("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 H("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 _E(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 Fo(e,t){return e.byId.get(t)?.label||t}function Yo(e,t,n){return e.byId.get(t)?.states.find(i=>i.id===n)?.name||n}function xn(e){return e.episodes.flatMap(t=>t.scenes.flatMap(n=>n.actions))}var xE={ep:"episode",scn:"scene",ac:"action",act:"actor",loc:"location",prp:"prop",st:"state"};function yo(e,t){let n=pr(xE[e],t);return t.add(n),H("newId",`${n} (collision-checked against ${t.size-1} live ids)`),n}function Ie(e){if(Object.assign(e,ho(e.raw,e.path)),!e.path){H("save","skipped: document is not bound to a file");return}Af(e,e.path)}function Af(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}`;go.writeFileSync(n,JSON.stringify(e.raw,null,2)+`
|
|
167
|
+
`),go.renameSync(n,t),H("commit",`${go.statSync(t).size} bytes -> ${t} (tmp + atomic rename)`)}var EE={system:"\u65C1\u767D",broadcast:"\u5E7F\u64AD",offscreen:"\u753B\u5916",group:"\u7FA4\u58F0"},kf="\u5FC3\u58F0";function SE(e,t){if(t.kind)return EE[t.kind]??t.kind;let n=Fo(e,t.id);return t.state?`${n}\xB7${Yo(e,t.id,t.state)}`:n}function Lr(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?SE(e,t.speaker):"?",d=[t.type==="inner_thought"?kf:"",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 Rd(e,t){let n=Fo(e,t.id);return t.states.length===1&&t.states[0]==="default"?n:`${n}(${t.states.map(o=>Yo(e,t.id,o)).join("+")})`}function Ti(e,t){let n=[t.env?.space,t.env?.time].filter(Boolean).join("/").toUpperCase(),o=t.location?Rd(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=>Rd(e,a)).join(", "),s=t.props.map(a=>Rd(e,a)).join(", "),c=[r&&`cast: ${r}`,s&&`props: ${s}`].filter(Boolean).join(" ");return c?`${i}
|
|
168
|
+
# ${c}`:i}function Md(e,t,n={}){let o=n.plain?0:Math.max(0,...t.actions.map(i=>i.anchor.length));return H("formatScene",`${t.anchor}: ${t.actions.length} actions, gutter=${o}`),[Ti(e,t),...t.actions.map(i=>Lr(e,i,o,n))].join(`
|
|
169
|
+
`)}var IE=/^([A-Za-z][A-Za-z0-9_]*|\d+(?:-\d+){0,2})\s\s+/;function bf(e,t){let n=e.trimEnd();if(!n.trim())return null;let o,i=n.match(IE);i&&(o=i[1],n=n.slice(i[0].length)),n=n.replace(/\\n/g,`
|
|
170
|
+
`);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]===kf,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 AE=/^(scn[1-9A-HJ-NP-Za-km-z]{6}|scn_\d+)$/,kE=/^[A-Z.\/]+$/,bE=/^\d+\s+actions?$/,OE={EXT:"exterior",EXTERIOR:"exterior",INT:"interior",INTERIOR:"interior"};function Of(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 Ld(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)||bE.test(i))){if(AE.test(i)){n.anchor=i;continue}if(kE.test(i)&&i!=="\u2014"){let[r,s]=i.split("/");r&&(n.env.space=OE[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 vf(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 Vi(e,t){throw Object.assign(new Error(e),t)}function Ud(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 Nd(e){try{return to(e.timestamp??"")}catch(t){if(!(t instanceof We))throw t;return Vi(`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 Rf(e,t){return Vi("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 Cd(e,t){t.length===0&&Vi("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(h=>n.has(h.address));o.length!==n.size&&Vi("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(h=>h.episodeId));i.size!==1&&Vi("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||Vi(`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=Nd(r),a=r,d=c,p="";for(let h of o){if(!h.timestamp)continue;let y=Nd(h);y.milliseconds<d.milliseconds&&Rf(a,h),a=h,d=y,h.address===s.address&&(p=y.canonical)}let l=e.findIndex(h=>h.address===s.address),f,u;for(let h=l+1;h<e.length;h+=1){let y=e[h];if(y.episodeId!==r.episodeId)break;if(!y.timestamp)continue;let m=Nd(y);if(m.milliseconds<d.milliseconds&&Rf(a,y),m.milliseconds!==d.milliseconds){f=y,u=m;break}}return H("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 Pd=["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 Td(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 Vd(e,t,n={}){let o=n.offset??0,i=n.limit??20,r=n.context??3;for(let[f,u,h]of[["offset",o,0],["limit",i,1],["context",r,0]])if(!Number.isSafeInteger(u)||u<h)throw new Error(`${f} must be an integer >= ${h}`);let s=Ue(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 h=[...u.location?[u.location]:[],...u.actors,...u.props].filter(y=>y.id===c.id&&(a===null||y.states.includes(a)));h.length&&p.push({kind:"scene_binding",scene:u,matched:h.flatMap(y=>y.states)});for(let y of u.actions)if(y.speaker?.id===c.id&&(a===null||y.speaker.state===a)&&p.push({kind:"speaker",scene:u,action:y,matched:[c.id]}),a===null){let m=d.filter(w=>y.content.includes(w));m.length&&p.push({kind:"text_mention",scene:u,action:y,matched:m})}}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:h,matched:y})=>{let m=h?u.actions.indexOf(h):-1,w=h?u.actions.slice(Math.max(0,m-r),m+r+1):[],g=Math.max(0,...w.map(_=>_.anchor.length));return{kind:f,address:h?.anchor??u.anchor,scene_address:u.anchor,episode:u.ep.no,matched:y,text:[Ti(e,u),...w.map(_=>(_===h?"> ":" ")+Lr(e,_,g))].join(`
|
|
171
|
+
`)}})}}function $d(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}
|
|
172
172
|
${t.text}`),e.next_offset===null?"end":`Continue: --offset ${e.next_offset}`].join(`
|
|
173
173
|
|
|
174
|
-
`)}var
|
|
175
|
-
`)}}}function
|
|
176
|
-
`)}function
|
|
177
|
-
`):[o,...t.scenes.map(i=>
|
|
174
|
+
`)}var vE=["\u65C1\u767D","\u5E7F\u64AD","\u753B\u5916","\u7FA4\u58F0"],RE={\u65C1\u767D:"system",\u5E7F\u64AD:"broadcast",\u753B\u5916:"offscreen",\u7FA4\u58F0:"group"};function ME(e){let t=new Set(vE);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 zs(e,t="",n={}){let o=Ue(e,t);switch(H("read",`dispatch on node kind "${o.t}"`),o.t){case"script":return NE(e);case"ep":return UE(e,o.ep,n);case"scene":return Md(e,o.scene,n);case"asset":return CE(e,o.asset);case"state":return PE(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[Ti(e,o.action.scene),...c.map(l=>(l===o.action?"> ":" ")+Lr(e,l,a,n)),d?`transition: ${Fo(e,d.target)} | ${d.process} | ${d.contrast}`:"",p.length?`extend: ${p.map(([l,f])=>`${l}=${JSON.stringify(f)}`).join(", ")}`:""].filter(Boolean).join(`
|
|
175
|
+
`)}}}function LE(e){return e.actions.reduce((t,n)=>t+n.content.length,0)}function NE(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}: ${Nr(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+LE(a),0);i.push(` ${r.no} ${r.id} ${r.scenes.length} scenes ${s} chars${r.title?` ${r.title}`:""}`+(r.synopsis?` ${Nr(r.synopsis,120)}`:""))}return i.join(`
|
|
176
|
+
`)}function UE(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=>Ti(e,i))].join(`
|
|
177
|
+
`):[o,...t.scenes.map(i=>Md(e,i,n))].join(`
|
|
178
178
|
|
|
179
|
-
`)}function
|
|
180
|
-
`)}function
|
|
181
|
-
`)}function
|
|
182
|
-
`)}function
|
|
183
|
-
deleted: ${t.dropped.map(n=>`${n.anchor} ${
|
|
184
|
-
`)}`:"")}function
|
|
185
|
-
`));if(d){let g=
|
|
179
|
+
`)}function CE(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} ${Nr(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])=>`${Yo(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(`
|
|
180
|
+
`)}function PE(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=xn(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(`
|
|
181
|
+
`)}function Nr(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function Gd(e,t){let n=xn(e);if(H("find",`pool = all actions (${n.length})`),t.in){let o=Ue(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})`);H("find",`--in ${t.in} narrows pool to ${n.length}`)}if(t.type&&(n=n.filter(o=>o.type===t.type),H("find",`--type ${t.type} -> ${n.length}`)),t.speaker){let o=Ue(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),H("find",`--speaker ${t.speaker} -> ${o.asset.id} -> ${n.length}`)}return n}function Uf(e,t,n={}){let o=Gd(e,n),i=t?new RegExp(t,"u"):null,r=o.filter(f=>!i||i.test(f.content));H("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}`,h=u===f.anchor?"":u.padEnd(8)+" ",y=f.speaker?.id?Fo(e,f.speaker.id)+"\uFF1A":"",m=n.full||!i?f.content:TE(f.content,i,c);return`${f.anchor.padEnd(d)} ${h}${y}${m}`});return[p,...l].join(`
|
|
182
|
+
`)}function TE(e,t,n){let o=e.match(t);if(!o||o.index===void 0)return Nr(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 Jd(e,t){return Cd(Ud(e),Td(e,Gd(e,{in:t})))}function Cf(e,t){let n=Jd(e,t);return Pd.map(o=>`${o}=${n[o]}`).join(" ")}var VE=["content","paren","speaker","ts","type","transition"],$E=["name","desc","importance","aliases","role"],DE=["name","desc"],GE=["title","synopsis"],JE=["space","time"],BE=["title","worldview","style","synopsis","logline","theme","main"];function Ur(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 Pf(e,t,n){let o=Ue(e,t);if(o.t==="asset")return jE(e,t,o.asset,n);if(o.t==="state")return zE(e,t,o.asset,o.state,n);if(o.t==="script")return Mf(e,t||"script","script",o.doc.raw,n,BE);if(o.t==="ep")return Mf(e,t,"episode",o.ep.raw,n,GE);if(o.t==="scene")return KE(e,t,o.scene,n);let i=o.action,r=i.raw,s=Ur(i.anchor,"action",n,VE),c=at(e);if(H("edit",`${i.anchor}: ${s.join(", ")}`),n.type!==void 0&&(r.type=qo("type",n.type,jt,Rn)),n.content!==void 0&&(r.content=n.content),n.paren!==void 0&&js(e,r,n.paren),n.speaker!==void 0&&(r.speaker=Bd(e,n.speaker)),n.ts!==void 0&&$f(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=Ue(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 Ie(e),`${i.anchor} ${s.join("+")} ${Hs(r)}`+$e(e,c)}function Mf(e,t,n,o,i,r){let s=Ur(t,n,i,r),c=at(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 H("edit",`${n} ${t}: ${s.join(", ")}`),Ie(e),`${t} ${s.join("+")}`+$e(e,c)}function KE(e,t,n,o){let i=Ur(t,"scene",o,JE),r=at(e),s={...n.raw.environment??{}};return o.space!==void 0&&(s.space=qo("space",o.space,$l,sc)),o.time!==void 0&&(s.time=qo("time",o.time,rc,gs)),n.raw.environment=s,H("edit",`scene ${n.anchor}: ${i.join(", ")}`),Ie(e),`${n.anchor} ${i.join("+")} ${[s.space,s.time].filter(Boolean).join("/")}`+$e(e,r)}function jE(e,t,n,o){let i=Ur(t,"asset",o,$E),r=at(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=jf(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=qo("role",o.role,eo,wi):delete n.raw.role_type}return o.aliases!==void 0&&(o.aliases.length?n.raw.aliases=o.aliases:delete n.raw.aliases),H("edit",`asset ${n.id}: ${i.join(", ")}`),Ie(e),`${n.id} ${i.join("+")} ${o.name??n.name}`+$e(e,r)}function zE(e,t,n,o,i){let r=Ur(t,"state",i,DE),s=at(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),H("edit",`state ${n.id}/${o.id}: ${r.join(", ")}`),Ie(e),`${n.id}/${o.id} ${r.join("+")} ${i.name??o.name}`+$e(e,s)}function Tf(e,t,n,o,i,r,s,c){let a=Ue(e,t);if(a.t!=="action")throw new Error(`${t} is a ${a.t}; insert needs a sibling action`);let d=a.action,p=at(e),l={type:qo("type",o,jt,Rn),content:i};if(e.version===4&&(l.action_id=yo("ac",new Set(e.actions.keys()))),o==="dialogue"||o==="inner_thought"){if(!r)throw new Error(`a ${o} needs a speaker`);l.speaker=Bd(e,r),s!==void 0&&js(e,l,s)}else if(r||s)throw new Error(`a ${o} takes neither speaker nor paren`);c!==void 0&&(l.extend=c);let f=d.scene.raw.actions,u=f.indexOf(d.raw)+(n==="before"?0:1);return f.splice(u,0,l),H("insert",`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor}`),Ie(e),`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor} ${Hs(l)}`+$e(e,p)}function Vf(e,t,n,o="after"){let i=Ue(e,t);if(i.t!=="action")throw new Error(`${t} is a ${i.t}; move targets one action`);let r=Ue(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=at(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),H("move",`${i.action.scene.anchor} -> ${r.action.scene.anchor}, identity ${i.action.anchor} preserved`),Ie(e),`${i.action.anchor} ${o} ${r.action.anchor} (${i.action.scene.anchor} -> ${r.action.scene.anchor})`+$e(e,s)}function js(e,t,n){let o=e.version===4?"parenthetical":"emotion";n===null?delete t[o]:t[o]=n}function $f(e,t){if(t===null){e.extend&&delete e.extend.timestamp;return}let n;try{n=to(t).canonical}catch(o){throw o instanceof We?new Error(`${o.message} (got ${JSON.stringify(t)})`):o}e.extend={...e.extend??{},timestamp:n}}function Bd(e,t){let n=e.assets.find(a=>a.name===t||a.aliases.includes(t)),[o,i]=n?[t,void 0]:HE(t,"\xB7"),r=RE[o];if(r)return i?{kind:r,label:i}:{kind:r};let s=Ue(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 HE(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 Nr(String(e.content??""),40)}function Df(e,t,n,o={}){let i=ho(structuredClone(e.raw)),r=QE(i,t,n,o);return e.raw=i.raw,Ie(e),r}function QE(e,t,n,o){if(t==="+"||Number(t)===e.episodes.length+1){let r={scenes:[]};return e.version===4&&(r.episode_id=yo("ep",new Set(e.eps.keys()))),e.raw.episodes.push(r),H("write",`appending episode ${e.episodes.length+1}`),Lf(e,r,e.episodes.length+1,n,o,!0)}let i=Ue(e,t);if(i.t==="scene")return FE(e,i.scene,n,o);if(i.t==="ep")return Lf(e,i.ep.raw,i.ep.no,n,o,!1);throw new Error(`write targets a scene or an episode (got ${i.t})`)}function FE(e,t,n,o){let i=at(e),r=Jf(e,t.raw,t,n,new Set(e.actions.keys()),o);return Ie(e),Gf(t.anchor,r)+$e(e,i)}function Gf(e,t){return`${e}: ${t.total} actions (${t.kept} kept, ${t.created} new, ${t.dropped.length} deleted)`+(t.dropped.length?`
|
|
183
|
+
deleted: ${t.dropped.map(n=>`${n.anchor} ${Hs(n.raw)}`).join(`
|
|
184
|
+
`)}`:"")}function Jf(e,t,n,o,i,r,s,c){let a=ME(e),{head:d,meta:p,body:l}=Of(o.split(`
|
|
185
|
+
`));if(d){let g=Ld(d,p);t.environment=g.env.space||g.env.time?g.env:void 0,t.environment===void 0&&delete t.environment,t.location=g.location?Dd(e,g.location,"location"):null,t.actors=g.cast.map(_=>Dd(e,_,"actor")),t.props=g.props.map(_=>Dd(e,_,"prop"))}let f=s??new Map((n?.actions??[]).map(g=>[g.anchor,g])),u=c??new Set,h=new Set,y=[],m=0,w=n?n.anchor:"this new scene";for(let g of l){let _=bf(g,a);if(!_)continue;let E=_.anchor?f.get(_.anchor):void 0;if(_.anchor&&!E)throw new Error(`Anchor ${_.anchor} is not in ${w} \u2014 move it with \`move\`, or drop the anchor to create a new action`);if(E&&u.has(E.anchor))throw new Error(`Anchor ${_.anchor} appears twice in ${w} \u2014 drop the anchor from the copy to make it a new action`);let x=E?E.raw:{};!E&&e.version===4&&(x.action_id=yo("ac",i)),x.type=qo("type",_.type,jt,Rn),x.content=_.content,_.type==="dialogue"||_.type==="inner_thought"?(x.speaker=Bd(e,_.speakerName),js(e,x,_.paren??null)):(delete x.speaker,js(e,x,null)),$f(x,_.ts??null),E?(h.add(E.anchor),u.add(E.anchor)):m++,y.push(x)}if(!y.length&&(n?.actions.length??0)>0&&!r.allowDelete)throw new Error(`That would leave ${w} 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(y.length&&!h.size&&(n?.actions.length??0)>0&&!r.allowDelete)throw new Error(`None of the ${y.length} line(s) carry an anchor from ${w}, 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=y,{total:y.length,kept:h.size,created:m,dropped:s?[]:(n?.actions??[]).filter(g=>!h.has(g.anchor))}}function Lf(e,t,n,o,i,r){let s=at(e),c=r?[]:e.episodes[n-1].scenes,a=new Map;for(let E of c)a.set(E.anchor,E),a.set(E.id,E);let d=[];for(let E of o.split(`
|
|
186
186
|
`))E.startsWith("##")?d.push(E):d.length&&(d[d.length-1]+=`
|
|
187
|
-
`+E);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 E of c)for(let x of E.actions)f.set(x.anchor,x);let u=new Set,h=new Set,y=[],m=[],w=0;for(let E of d){let x=
|
|
188
|
-
`)[0]),A=x.anchor?a.get(x.anchor):void 0;if(x.anchor&&!A)throw new Error(`Scene ${x.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?h.add(A.anchor):(e.version===4?k.scene_id=yo("scn",l):k.scene_id=`scn_${String(c.length+w+1).padStart(3,"0")}`,w++);let U=
|
|
187
|
+
`+E);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 E of c)for(let x of E.actions)f.set(x.anchor,x);let u=new Set,h=new Set,y=[],m=[],w=0;for(let E of d){let x=Ld(E.split(`
|
|
188
|
+
`)[0]),A=x.anchor?a.get(x.anchor):void 0;if(x.anchor&&!A)throw new Error(`Scene ${x.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?h.add(A.anchor):(e.version===4?k.scene_id=yo("scn",l):k.scene_id=`scn_${String(c.length+w+1).padStart(3,"0")}`,w++);let U=Jf(e,k,A??null,E,p,i,f,u);y.push(k),m.push(Gf(A?A.anchor:`new ${k.scene_id}`,U))}let g=[...f.values()].filter(E=>!u.has(E.anchor));if(g.length&&!i.allowDelete)throw new Error(`This would delete ${g.length} action(s) from episode ${n}: `+g.slice(0,6).map(E=>`${E.anchor}(${E.scene.anchor})`).join(", ")+(g.length>6?" \u2026":"")+" \u2014 keep their lines, or pass --allow-delete if that is the intent");let _=c.filter(E=>!h.has(E.anchor));if(_.length&&!i.allowDelete)throw new Error(`This would delete ${_.length} whole scene(s) from episode ${n}: `+_.map(E=>`${E.anchor}(${E.actions.length} actions)`).join(", ")+" \u2014 include their `##` headers to keep them, or pass --allow-delete if that is the intent");return H("write",`episode ${n}: ${d.length} scene blocks, ${w} new, ${_.length} deleted`),t.scenes=y,Ie(e),`EP${n}: ${y.length} scenes (${y.length-w} kept, ${w} new, ${_.length} deleted, ${g.length} actions deleted)
|
|
189
189
|
`+m.map(E=>" "+E.replace(/\n/g,`
|
|
190
190
|
`)).join(`
|
|
191
191
|
`)+(_.length?`
|
|
192
|
-
deleted scenes: ${_.map(E=>E.anchor).join(", ")}`:"")+$e(e,s)}function
|
|
192
|
+
deleted scenes: ${_.map(E=>E.anchor).join(", ")}`:"")+$e(e,s)}function Dd(e,t,n){let{name:o,states:i}=vf(t),r=Ue(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 Bf(e,t,n,o,i=!1){let r=Ue(e,t);if(r.t!=="scene")throw new Error(`${t} is a ${r.t}; ref targets one scene`);let s=r.scene,c=Ue(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=at(e);if(i){if(a.kind==="location"){if(s.location?.id!==a.id)throw new Error(`${s.anchor}'s location is ${s.location?Fo(e,s.location.id):"empty"}, not ${a.name}`);s.raw.location=null}else{let y=s.raw[d],m=y.findIndex(w=>w[`${a.kind}_id`]===a.id);if(m<0)throw new Error(`${s.anchor} does not reference ${a.name}`);y.splice(m,1)}return H("ref",`${s.anchor} -= ${a.id}`),Ie(e),`${s.anchor} removed ${a.name}`+$e(e,p)}if(!o.length)throw new Error(`ref needs at least one state for ${a.name} (has: ${a.states.map(y=>y.name).join(", ")}) \u2014 nothing is implied, not even default`);let l=[...new Set(o.map(y=>{let m=a.states.filter(w=>w.name===y||w.id===y);if(!m.length)throw new Error(`${a.name} has no state "${y}" (has: ${a.states.map(w=>w.name).join(", ")})`);if(m.length>1)throw new Error(`${a.name} has ${m.length} states named "${y}"; use the state id`);return m[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 h;if(a.kind==="location")h=s.location?s.location.id===a.id?"restated":"replaced":"set",s.raw.location=u;else{let y=s.raw[d],m=y.findIndex(w=>w[f]===a.id);m<0?(y.push(u),h="added"):(y[m]=u,h="restated")}return H("ref",`${s.anchor} ${h} ${a.id} = [${l.join(", ")}]`),Ie(e),`${s.anchor} ${h} ${a.name}(${l.map(y=>Yo(e,a.id,y)).join("+")})`+$e(e,p)}function Kf(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=at(e),s=Gd(e,o),c=s.filter(p=>(i.lastIndex=0,i.test(p.content)));if(H("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}
|
|
193
193
|
${" ".repeat(a)} - ${p.content}
|
|
194
194
|
${" ".repeat(a)} + ${l}`});if(!o.apply)return`${c.length} action(s) would change (dry run \u2014 pass apply to write)
|
|
195
195
|
`+d.join(`
|
|
196
|
-
`);for(let p of c)i.lastIndex=0,p.raw.content=p.content.replace(i,n);return
|
|
196
|
+
`);for(let p of c)i.lastIndex=0,p.raw.content=p.content.replace(i,n);return Ie(e),H("replace",`wrote ${c.length} actions`),`${c.length} action(s) changed`+$e(e,r)+`
|
|
197
197
|
`+d.join(`
|
|
198
|
-
`)}function qo(e,t,n,o){if(!n.has(t))throw new Error(`${e} must be one of ${o.join(" | ")} (got "${t}")`);return t}function
|
|
199
|
-
`)}function
|
|
200
|
-
`):"No issues."}function
|
|
201
|
-
fix: ${n.repair_hint}`:""))}function
|
|
198
|
+
`)}function qo(e,t,n,o){if(!n.has(t))throw new Error(`${e} must be one of ${o.join(" | ")} (got "${t}")`);return t}function jf(e){return qo("importance",e,Rt,Ln)}function $i(e){return e.version===4?Me(e.raw):mt(e.raw)}function zf(e){let t=$i(e);return[`${e.episodes.length} episodes / ${e.scenes.size?[...new Set(e.episodes.flatMap(o=>o.scenes))].length:0} scenes / ${xn(e).length} actions \u2014 ${t.ok?"ok":`${t.errors.length} error(s)`}`+(t.warnings.length?`, ${t.warnings.length} warning(s)`:""),...jd([...t.errors.map(o=>["error",o]),...t.warnings.map(o=>["warning",o])])].join(`
|
|
199
|
+
`)}function Kd(e,t={}){let n=$i(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)),H("issues",`${o.length} matching issue(s)`),o.length?jd(o).join(`
|
|
200
|
+
`):"No issues."}function jd(e){return e.map(([t,n])=>`${t} ${n.code} ${n.path} ${n.message}`+(n.repair_hint?`
|
|
201
|
+
fix: ${n.repair_hint}`:""))}function at(e){return $i(e)}function $e(e,t){let n=$i(e),o=[...dc(t.errors,n.errors).map(i=>["error",i]),...dc(t.warnings,n.warnings).map(i=>["warning",i])];return o.length?(H("check",`${o.length} issue(s) introduced by this edit`),`
|
|
202
202
|
introduced ${o.length} issue(s):
|
|
203
|
-
`+
|
|
204
|
-
`)):""}var
|
|
203
|
+
`+jd(o).join(`
|
|
204
|
+
`)):""}var zd={actor:"actors",location:"locations",prop:"props"},Nf={actor:"act",location:"loc",prop:"prp"};function Hf(e,t,n,o,i="featured",r=[]){if(!n.trim())throw new Error("asset needs a name");let s=at(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=zd[t],d=e.version===4?yo(Nf[t],new Set(e.assets.map(l=>l.id))):`${Nf[t]}_${String(e.raw[a].length+1).padStart(3,"0")}`,p={[`${t}_id`]:d,[`${t}_name`]:n,importance:jf(i),description:o,states:[{state_id:"default",state_name:n,description:o}]};return r.length&&(p.aliases=r),e.raw[a].push(p),H("asset",`${t} ${d} "${n}" + default state`),Ie(e),`${d} ${n} ${t} states: default`+$e(e,s)}function Qf(e,t,n,o){let i=Ue(e,t);if(i.t!=="asset")throw new Error(`${t} is a ${i.t}; state targets an asset`);let r=at(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?yo("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}),H("state",`${i.asset.id} + ${s} "${n}"`),Ie(e),`${i.asset.id}/${s} ${n} (${i.asset.name} now has ${i.asset.states.length+1} states)`+$e(e,r)}function YE(e,t){let n=Ue(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 Ff(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:
|
|
205
205
|
`+a.map(d=>` ${d} = ${JSON.stringify(c[d])}`).join(`
|
|
206
|
-
`):`${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,H("ext",`${s} -= ${n}`),
|
|
207
|
-
stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function
|
|
208
|
-
${d?"rewired":"cleared"} ${i.length} scene binding(s) and ${r.length} speaker(s)${d?` to ${Yo(e,t.id,d)}`:""}`}let a=t.raw.states;return a.splice(a.findIndex(d=>d.state_id===n.id),1),H("del",`state ${t.id}/${n.id}`),
|
|
209
|
-
moved ${l.length} scene reference(s), ${f.length} speaker(s), ${[...p].filter(([h,y])=>h!==y).length} state mapping(s)`+$e(e,r)}import{z as
|
|
210
|
-
`),await
|
|
206
|
+
`):`${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,H("ext",`${s} -= ${n}`),Ie(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},H("ext",`${s} extend.${n} = ${o}`),Ie(e),`${s} extend.${n} = ${JSON.stringify(o)}`}function Yf(e,t,n={}){let o=Ue(e,t),i=at(e);if(o.t==="action"){let r=o.action.scene.raw.actions;return r.splice(r.indexOf(o.action.raw),1),H("del",`action ${o.action.anchor} from ${o.action.scene.anchor}`),Ie(e),`deleted ${o.action.anchor} ${Hs(o.action.raw)}`+$e(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),H("del",`scene ${o.scene.anchor} (${o.scene.actions.length} actions)`),Ie(e),`deleted scene ${o.scene.anchor} with ${o.scene.actions.length} action(s)`+$e(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),H("del",`episode ${o.ep.no}`),Ie(e),`deleted episode ${o.ep.no} (${o.ep.id}) with ${o.ep.scenes.length} scene(s) / ${r} action(s)`}if(o.t==="asset")return qE(e,o.asset,n)+$e(e,i);if(o.t==="state")return ZE(e,o.asset,o.state,n)+$e(e,i);throw new Error(`del takes an action, scene, episode, asset or state (got ${o.t})`)}function qf(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:xn(e).filter(o=>o.speaker?.id===t)}}function qE(e,t,n){let{scenes:o,speakers:i}=qf(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 Hd(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=zd[t.kind],c=e.raw[s];return c.splice(c.indexOf(t.raw),1),H("del",`asset ${t.id}, stripped ${o.length} scene refs + ${i.length} speakers`),Ie(e),`deleted ${t.kind} ${t.id} ${t.name}`+(r?`
|
|
207
|
+
stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function ZE(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=xn(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=`
|
|
208
|
+
${d?"rewired":"cleared"} ${i.length} scene binding(s) and ${r.length} speaker(s)${d?` to ${Yo(e,t.id,d)}`:""}`}let a=t.raw.states;return a.splice(a.findIndex(d=>d.state_id===n.id),1),H("del",`state ${t.id}/${n.id}`),Ie(e),`deleted state ${t.id}/${n.id} ${n.name}`+c}function Hd(e,t,n){let o=Ue(e,t),i=Ue(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=at(e),s=o.asset,c=i.asset,a=`${s.kind}_id`,d=new Set(c.states.map(h=>h.id)),p=new Map;for(let h of s.states){let y=c.states.find(w=>w.name===h.name);if(y){p.set(h.id,y.id);continue}if(h.id==="default"){p.set(h.id,"default");continue}let m=e.version===4?yo("st",d):`st_${String(c.states.length+p.size).padStart(3,"0")}`;c.raw.states.push({state_id:m,state_name:h.name,description:h.desc}),p.set(h.id,m)}let{scenes:l,speakers:f}=qf(e,s.id);for(let h of l)for(let y of["location","actors","props"]){let m=h.raw[y],w=y==="location"?m?[m]:[]:m??[];for(let g of w)g[a]===s.id&&(g[a]=c.id,e.version===4?g.state_ids=[...new Set(g.state_ids.map(_=>p.get(_)??"default"))].sort():g.state_id=p.get(g.state_id)??"default");if(y!=="location"&&Array.isArray(m)){let g=[];for(let _ of m){let E=g.find(x=>x[a]===_[a]);if(!E){g.push(_);continue}e.version===4&&(E.state_ids=[...new Set([...E.state_ids,..._.state_ids])].sort())}h.raw[y]=g}}for(let h of f)h.raw.speaker.actor_id=c.id,h.raw.speaker.state_id&&(h.raw.speaker.state_id=p.get(h.raw.speaker.state_id)??"default");let u=e.raw[zd[s.kind]];return u.splice(u.indexOf(s.raw),1),H("merge",`${s.id} -> ${c.id}: ${l.length} scenes, ${f.length} speakers`),Ie(e),`merged ${s.id} ${s.name} into ${c.id} ${c.name}
|
|
209
|
+
moved ${l.length} scene reference(s), ${f.length} speaker(s), ${[...p].filter(([h,y])=>h!==y).length} state mapping(s)`+$e(e,r)}import{z as Nt}from"zod";var WE=Nt.string().min(1),XE=Nt.array(Nt.number().int().min(1)).min(1).describe("1-based PDF \u7269\u7406\u9875\u7801\uFF1B\u8DE8\u9875\u753B\u683C\u6216\u540C\u4E00\u6C14\u6CE1\u586B\u5199\u76F8\u5173\u7684\u5168\u90E8\u9875\u7801\uFF1B\u540C\u4E00\u4E2A\u8DE8\u9875\u6C14\u6CE1\u5408\u4E3A\u4E00\u6761\u5B8C\u6574\u5BF9\u767D\uFF0C\u6309\u5347\u5E8F\u6392\u5217"),Qs=Nt.number().min(0).max(1e3),Fs=Nt.object({page:Nt.number().int().min(1),kind:Nt.enum(["panel","bubble","text"]),box:Nt.object({top:Qs,left:Qs,bottom:Qs,right:Qs}).describe("\u76F8\u5BF9\u4E8E\u5B8C\u6574 PDF \u7269\u7406\u9875\u7684\u77E9\u5F62\uFF0C\u5DE6\u4E0A\u89D2\u4E3A\u539F\u70B9\uFF0C\u6A2A\u7EB5\u5404\u5F52\u4E00\u5316\u5230 0\u20131000\uFF1B\u4E0D\u662F\u88C1\u526A\u56FE\u6216\u753B\u683C\u5185\u7684\u5750\u6807")}),Ys=Nt.array(Fs).min(1).describe("\u672C\u6761\u6B63\u6587\u5B9E\u9645\u5BF9\u5E94\u7684\u753B\u683C(panel)\u3001\u6C14\u6CE1(bubble)\u6216\u72EC\u7ACB\u6587\u5B57\u5757(text)\uFF1B\u6309\u9605\u8BFB\u987A\u5E8F\u5217\u51FA\u5168\u90E8\u533A\u57DF\u3002\u8DE8\u9875\u533A\u57DF\u5404\u9875\u5206\u522B\u7ED9\u6846\uFF0C\u4E0D\u7528\u6574\u9875\u4EE3\u66FF\u5177\u4F53\u5185\u5BB9");function Cr(e,t){let n=[];for(let o of t){e.includes(o.page)||n.push(`Region page ${o.page} is absent from action pages.`);let{top:i,left:r,bottom:s,right:c}=o.box;(s<=i||c<=r)&&n.push(`Region on page ${o.page} has an empty or inverted box.`)}for(let o of e)t.some(i=>i.page===o)||n.push(`Page ${o} has no source region.`);return n}var Zf=Nt.object({kind:Nt.literal("comic"),document_id:WE,pages:XE,regions:Ys.optional()}),Zo=Nt.object({scriptctl:Nt.object({source:Zf})});import{z as B}from"zod";var et=B.string().min(1),Wo=B.array(et),Wf=B.object({name:et,description:et}),Fd=B.string().length(0),Xf=B.object({apparent_gender:B.string(),apparent_age:B.string(),face_shape:B.string(),brows_eyes:B.string(),nose:B.string(),mouth:B.string(),skin_features:B.string(),hair:B.string(),build:B.string(),persistent_marks:Wo,voice:Fd.describe("\u6F2B\u753B\u6CA1\u6709\u539F\u58F0\u97F3\u8F68\uFF0C\u586B\u7A7A\u4E32")}),e5=B.object({name:et,kind:B.enum(["actor","location","prop"]),status:B.enum(["canonical","provisional"]),importance:B.enum(["featured","background"]),recognition_anchors:Wo,identity_profile:Xf,appearance:B.string(),role:B.string(),states:B.array(Wf),aliases:Wo}),t5=B.object({new_entities:B.array(e5),enrich:B.array(B.object({name:et,add_recognition_anchors:Wo,identity_profile_patch:Xf,appearance:B.string(),role:B.string(),add_aliases:Wo,add_states:B.array(Wf)})),canonicalize:B.array(B.object({from_name:et,canonical_name:et,evidence:et.describe("\u672C\u8BDD PDF \u9875\u7801\u548C\u76F4\u63A5\u51FA\u73B0\u7684\u59D3\u540D\u539F\u6587")}))}),em=B.array(B.number().int().min(1)).min(1).describe("1-based PDF \u7269\u7406\u9875\u7801\uFF1B\u8DE8\u9875\u753B\u683C\u6216\u540C\u4E00\u6C14\u6CE1\u586B\u5199\u76F8\u5173\u7684\u5168\u90E8\u9875\u7801\uFF1B\u540C\u4E00\u4E2A\u8DE8\u9875\u6C14\u6CE1\u5408\u4E3A\u4E00\u6761\u5B8C\u6574\u5BF9\u767D\uFF0C\u6309\u5347\u5E8F\u6392\u5217"),tm="\u4EBA\u7269\u89C4\u8303\u540D\uFF1B\u5BA2\u89C2\u65C1\u767D\u7528 offscreen:\u65C1\u767D\uFF0C\u7CFB\u7EDF\u53D1\u58F0\u7528 system:\u7CFB\u7EDF\uFF0C\u7FA4\u4F53\u7528 group:\u79F0\u547C",nm="\u4E25\u683C\u6309\u6F2B\u753B\u9605\u8BFB\u987A\u5E8F\u6392\u5217\uFF0C\u753B\u9762\u548C\u5BF9\u767D\u4EA4\u9519\uFF1B\u9010\u683C\u5B8C\u6574\u8F6C\u5199",om=B.object({type:B.enum(["dialogue","inner_thought"]),content:et,pages:em,regions:Ys,speaker:et.describe(tm),parenthetical:B.string()}),n5=B.discriminatedUnion("type",[B.object({type:B.enum(["action","transition"]),content:et,pages:em,regions:Ys}),om]),im=B.object({space:B.union([B.enum(["interior","exterior"]),Fd]),time:B.union([B.enum(["day","night","dawn","dusk"]),Fd]),location:B.string().describe("\u672C\u573A\u5730\u70B9\u7684\u89C4\u8303\u540D\uFF0C\u5FC5\u987B\u5DF2\u5728\u5DF2\u77E5\u8BBE\u5B9A\u6216\u672C\u6B21 registry_delta \u767B\u8BB0\uFF1B\u7A7A\u95F4\u65E0\u6CD5\u786E\u8BA4\u586B\u7A7A\u4E32"),characters:B.array(B.object({name:et,states:Wo})),props:Wo,actions:B.array(n5).min(1).describe(nm)}),Yd=B.object({registry_delta:t5,synopsis:et,scenes:B.array(im).min(1),open_threads:B.object({opened:B.array(B.object({text:et})),closed:B.array(B.object({ref:et}))}),ignored_pages:B.array(B.object({page:B.number().int().min(1),reason:et.describe("\u53EA\u7528\u4E8E\u6574\u9875\u7A7A\u767D\u3001\u5C01\u9762\u6216\u5236\u4F5C\u4FE1\u606F\uFF1B\u542B\u5267\u60C5\u6216\u53F0\u8BCD\u7684\u9875\u9762\u5FC5\u987B\u8F6C\u5199")}))}),rm=Yd.extend({scenes:B.array(im.extend({actions:B.array(om.extend({type:B.enum(["action","transition","dialogue","inner_thought"]),speaker:B.string().describe(`${tm}\uFF1Baction/transition \u586B\u7A7A\u4E32`)})).min(1).describe(nm)})).min(1)});import*as Ae from"node:fs";import*as wt from"node:path";import{spawn as o5}from"node:child_process";import{createHash as i5}from"node:crypto";import{PDFDocument as sm}from"pdf-lib";var qd=1200;function am(e,t){return new Promise((n,o)=>{let i=o5("pdftoppm",["-cropbox","-scale-to-x",String(qd),"-scale-to-y","-1","-jpeg","-jpegopt","quality=92",e,t],{stdio:["ignore","ignore","pipe"]}),r="";i.stderr.on("data",s=>{r+=String(s)}),i.on("error",s=>o(new S(`Cannot render comic pages: ${s.message}`,{exitCode:b,errorCode:"VIEW_PDF_RENDER_FAILED",hint:"Install Poppler (pdftoppm), then rerun scriptctl view."}))),i.on("close",s=>{s===0?n():o(new S(`PDF page rendering failed: ${r.trim()}`,{exitCode:b,errorCode:"VIEW_PDF_RENDER_FAILED",data:{actual:[e]}}))})})}async function qs(e,t){let n=`review-pages/cropbox-w${qd}-q92/${e.sha256}`,o=wt.join(t,n),i=String(e.page_count).length,r=Array.from({length:e.page_count},(s,c)=>`page-${String(c+1).padStart(i,"0")}.jpg`);if(!r.every(s=>Ae.existsSync(wt.join(o,s)))){let s=`${o}.part`;Ae.rmSync(s,{recursive:!0,force:!0}),Ae.mkdirSync(s,{recursive:!0}),process.stderr.write(`\u6E32\u67D3\u6F2B\u753B\u539F\u9875 \xB7 ${e.title} \xB7 ${e.page_count} \u9875
|
|
210
|
+
`),await am(e.path,wt.join(s,"page"));for(let c of r)if(!Ae.existsSync(wt.join(s,c))||Ae.statSync(wt.join(s,c)).size===0)throw new S(`PDF renderer did not produce ${c}.`,{exitCode:b,errorCode:"VIEW_PDF_RENDER_FAILED"});Ae.rmSync(o,{recursive:!0,force:!0}),Ae.renameSync(s,o)}return r.map(s=>`${n}/${s}`)}async function cm(e,t,n){Fs.parse(t);let o=Cr([t.page],[t]);if(t.page>e.page_count||o.length)throw new Error(`Invalid comic region: ${o.join("; ")}`);let i=i5("sha256").update(JSON.stringify(t)).digest("hex"),r=`review-pages/cropbox-w${qd}-q92/${e.sha256}/regions/${i}.jpg`,s=wt.join(n,r);if(Ae.existsSync(s)&&Ae.statSync(s).size>0)return r;let c=await sm.load(Ae.readFileSync(e.path)),a=await sm.create(),[d]=await a.copyPages(c,[t.page-1]),p=d.getCropBox(),l=(d.getRotation().angle%360+360)%360,{left:f,right:u,top:h,bottom:y}=t.box,m=f/1e3,w=u/1e3,g=h/1e3,_=y/1e3,E=l===90?[g,m,_,w]:l===180?[1-w,g,1-m,_]:l===270?[1-_,1-w,1-g,1-m]:[m,1-_,w,1-g];d.setCropBox(p.x+E[0]*p.width,p.y+E[1]*p.height,(E[2]-E[0])*p.width,(E[3]-E[1])*p.height),a.addPage(d),Ae.mkdirSync(wt.dirname(s),{recursive:!0});let x=Ae.mkdtempSync(wt.join(wt.dirname(s),".region-"));try{let A=wt.join(x,"crop.pdf");Ae.writeFileSync(A,await a.save()),await am(A,wt.join(x,"page")),Ae.renameSync(wt.join(x,"page-1.jpg"),s)}finally{Ae.rmSync(x,{recursive:!0,force:!0})}return r}var r5=tt.object({episode:tt.number().int().positive(),document_id:tt.string().min(1),source_number:tt.number().nullable(),title:tt.string(),path:tt.string(),sha256:tt.string(),page_count:tt.number().int().positive(),size_bytes:tt.number()}),s5=tt.object({source:tt.object({kind:tt.enum(["comic-file","comic-directory"])}),episodes:tt.array(r5)});function Yt(e){throw new S(e,{exitCode:b,errorCode:"REVIEW_COMIC_SOURCE_INVALID",hint:"Pass -s to the comic ingest workspace, or to its original PDF files with manifest.json beside script.json. Keep the original source PDFs unchanged."})}function a5(e){let t=nt.join(e,"manifest.json");if(!ot.existsSync(t))return!1;let n=tt.object({source:tt.object({kind:tt.string()}).optional()}).parse(JSON.parse(ot.readFileSync(t,"utf8")));return n.source?.kind==="comic-file"||n.source?.kind==="comic-directory"}async function pm(e,t,n){let o=ot.statSync(e).isDirectory()&&a5(e)?nt.resolve(e):nt.dirname(nt.resolve(t)),i=nt.join(o,"manifest.json");ot.existsSync(i)||Yt("Comic review needs the ingest manifest to verify source identity.");let r=s5.safeParse(JSON.parse(ot.readFileSync(i,"utf8")));r.success||Yt(`Invalid comic manifest: ${r.error.message}`);let s=r.data,c=ho(JSON.parse(ot.readFileSync(t,"utf8")));c.version!==4&&Yt("Comic source review requires the ingested Script v4.");let a=c.episodes.filter(w=>!n?.length||n.includes(w.no));a.length||Yt("No selected episodes exist in this script.");let d=nt.resolve(e)===o?void 0:ot.statSync(e).isFile()?[nt.resolve(e)]:ot.readdirSync(e).filter(w=>/\.pdf$/i.test(w)).map(w=>nt.resolve(e,w)),p=new Map;for(let w of d??[])p.set(dm("sha256").update(ot.readFileSync(w)).digest("hex"),w);let l=new Map,f=[];for(let w of a){let g=new Set(w.scenes.flatMap(_=>_.actions.flatMap(E=>{let x=Zo.safeParse(E.raw.extend);return x.success?[x.data.scriptctl.source.document_id]:[]})));g.size||Yt(`Episode ${w.no} has no comic document identity; cannot safely match an original PDF.`);for(let _ of g){let E=s.episodes.find(U=>U.document_id===_);E||Yt(`Unknown comic document: ${_}`),f.some(U=>U.document_id===_&&U.episode!==w.no)&&Yt(`Comic document ${_} is bound to multiple script episodes.`);let x=d?p.get(E.sha256):nt.resolve(o,E.path);(!x||!ot.existsSync(x))&&Yt(`Original PDF missing or changed: ${E.title}`),dm("sha256").update(ot.readFileSync(x)).digest("hex")!==E.sha256&&Yt(`Original PDF content changed: ${E.title}`);let k={...E,path:x};l.set(_,k),f.push({document_id:_,episode:w.no,title:E.title,page_count:E.page_count})}}let u=new Map,h=nt.dirname(nt.resolve(t));function y(w){let g=l.get(w);return g||Yt(`Comic document not available: ${w}`)}function m(w,g){return{path:w,label:g,data:ot.readFileSync(w).toString("base64")}}return{documents:f,async page(w,g){let _=y(w);(!Number.isInteger(g)||g<1||g>_.page_count)&&Yt(`Invalid page ${g} in ${w}.`);let E=u.get(w);E||(E=qs(_,h),u.set(w,E));let x=await E;return m(nt.join(h,x[g-1]),`${w} \u7B2C ${g} \u9875\u6982\u89C8\uFF1B\u6587\u5B57\u4E0D\u6E05\u65F6\u7528 region \u653E\u5927`)},async region(w,g){let _=await cm(y(w),g,h);return m(nt.join(h,_),`${w} \u7B2C ${g.page} \u9875 ${JSON.stringify(g.box)}`)}}}import*as Sn from"node:fs";import*as Tr from"node:path";import{z as ep}from"zod";import*as Gi from"node:fs";import*as Di from"node:path";var Wd=[".txt",".md",".docx"],Xd={".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"},Pr=class extends Error{constructor(n){super(`Unsupported input: ${n}`);this.received=n}received};function Zd(e){return Di.extname(e).toLowerCase()}function lm(e){return Object.hasOwn(Xd,e)}function En(e){if(Gi.statSync(e).isDirectory()){let o=Gi.readdirSync(e).filter(r=>!r.startsWith(".")&&Zd(r)===".pdf"&&Gi.statSync(Di.join(e,r)).isFile()).sort().map(r=>Di.join(e,r)),i=Gi.readdirSync(e).filter(r=>!r.startsWith(".")).filter(r=>lm(Zd(r))).sort().map(r=>Di.join(e,r));if(o.length&&i.length)throw new Pr("directory mixes PDF comics and video episodes; use a directory with one source kind");if(o.length)return{kind:"comic-directory",path:e,files:o};if(i.length===0)throw new Pr(`directory has no supported video or PDF files: ${e}`);return{kind:"video-directory",path:e,files:i}}let n=Zd(e);if(n===".pdf")return{kind:"comic-file",path:e,ext:n};if(Wd.includes(n))return{kind:"text",path:e,ext:n};if(lm(n))return{kind:"video-file",path:e,ext:n};throw new Pr(`file extension ${n||"(none)"} is not supported by ingest (txt/md/docx/video/pdf only)`)}var um=/\.(mp4|mov|mkv|m4v|webm|avi|mpeg|mpg|flv|wmv)$/i;function fm(e,t=!1){if(t)return"video";if(!e)return"script";if(!Sn.existsSync(e))throw new S("Review source not found.",{exitCode:b,errorCode:"REVIEW_SOURCE_NOT_FOUND",hint:"Pass an existing original source or ingest workspace, or omit -s for script-only review."});if(Sn.statSync(e).isFile()){if(/\.pdf$/i.test(e))return"comic";if(Wd.some(n=>Tr.extname(e).toLowerCase()===n))return"text";if(um.test(e))return"video"}else{let n=Sn.readdirSync(e).filter(s=>!s.startsWith(".")&&Sn.statSync(Tr.join(e,s)).isFile()),o=n.some(s=>/\.pdf$/i.test(s)),i=n.some(s=>um.test(s));if(o&&i)throw new S("Review source mixes PDF and video files.",{exitCode:b,errorCode:"REVIEW_SOURCE_AMBIGUOUS",hint:"Use a source directory containing only one media kind."});if(i)return"video";if(o)return"comic";let r=Tr.join(e,"manifest.json");if(Sn.existsSync(r)){let s=ep.object({source:ep.object({kind:ep.string()})}).parse(JSON.parse(Sn.readFileSync(r,"utf8")));if(s.source.kind==="text")return"text";if(["comic-file","comic-directory"].includes(s.source.kind))return"comic"}}throw new S("Unsupported review source.",{exitCode:b,errorCode:"REVIEW_SOURCE_UNSUPPORTED",hint:"Use a text/comic ingest workspace, original txt/md/docx/PDF, a video file or a directory of videos."})}import*as jn from"node:fs";import*as Dt from"node:path";import{z as Qe}from"zod";import{z as Bn}from"zod";var c5=Bn.object({start_line:Bn.number().int().positive(),end_line:Bn.number().int().positive()}),tp=Bn.object({kind:Bn.literal("text"),document_id:Bn.string().min(1),ranges:Bn.array(c5).min(1).describe("\u5B8C\u6574\u89C4\u8303\u5316\u539F\u6587\u7684 1-based \u95ED\u533A\u95F4\uFF1B\u53EF\u4EE5\u662F\u5305\u542B\u76F8\u90BB\u5185\u5BB9\u7684\u5019\u9009\u7A97\u53E3\uFF0C\u9700\u8BFB\u53D6\u539F\u6587\u786E\u8BA4\u5BF9\u5E94\u5173\u7CFB")}),UM=Bn.object({scriptctl:Bn.object({source:tp})});function Zs(e){return`text-${e}`}import*as Em from"node:fs";import*as mm from"node:fs";import gm from"jszip";import{XMLParser as l5}from"fast-xml-parser";function hm(e){return e==null?"":String(e)}function Vt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Oe(e){return Array.isArray(e)}function ym(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(`
|
|
211
211
|
${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(`
|
|
212
|
-
`)}function
|
|
213
|
-
`):
|
|
212
|
+
`)}function Ji(e,t){let n=e[":@"];return Vt(n)?hm(n[t]).trim():""}function Ws(e,t){for(let[n,o]of Object.entries(e))if(Kn(n)===t&&Oe(o))return o;return null}function Xs(e){let t=[],n=o=>{if(Oe(o)){for(let i of o)if(Vt(i))for(let[r,s]of Object.entries(i))r==="#text"&&s!==null&&s!==void 0?t.push(hm(s)):r!==":@"&&Oe(s)&&n(s)}};return n(e),t.join("")}function ea(e){let t=wm.parse(e);if(!Oe(t))throw new Error("xlsx xml part has an unexpected shape");return t}function wo(e,t){let n=[],o=i=>{let r=Oe(i)?i.filter(Vt):Vt(i)?[i]:[];for(let s of r)for(let[c,a]of Object.entries(s))Kn(c)===t&&Oe(a)&&n.push(s),Oe(a)&&o(a)};return o(e),n}function u5(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 f5(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 ta(e,t){let n=e.file(t);return n?n.async("string"):null}async function m5(e){let t=await ta(e,"xl/sharedStrings.xml");if(!t)return[];let n=ea(t),o=[];for(let i of wo(n,"si"))o.push(Xs(Ws(i,"si")??[]));return o}async function g5(e){let t=await ta(e,"xl/workbook.xml"),n=await ta(e,"xl/_rels/workbook.xml.rels");if(!t||!n)throw new Error("xlsx missing workbook metadata");let o=new Map;for(let r of wo(ea(n),"Relationship")){let s=Ji(r,"@_Id"),c=Ji(r,"@_Target");s&&c&&o.set(s,f5("xl",c))}let i=[];for(let r of wo(ea(t),"sheet")){let s=Ji(r,"@_name"),c=Ji(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 h5(e,t){let n=Ji(e,"@_t");if(n==="inlineStr"){let s=wo(e,"is")[0],c=s?Ws(s,"is"):null;return c?Xs(c).trim():""}let o=wo(e,"v")[0],i=o?Ws(o,"v"):null,r=i?Xs(i).trim():"";if(!r&&n==="str"){let s=wo(e,"is")[0],c=s?Ws(s,"is"):null;return c?Xs(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 y5(e){let t=await gm.loadAsync(e),[n,o]=await Promise.all([m5(t),g5(t)]),i=[];for(let r of o){let s=await ta(t,r.path);if(!s)throw new Error(`xlsx missing worksheet part: ${r.path}`);let c=[];for(let a of wo(ea(s),"row")){let d=[];for(let p of wo(a,"c")){let l=Ji(p,"@_r"),f=l?u5(l):null,u=h5(p,n),h=f??d.length;for(;d.length<h;)d.push("");d[h]=u.trim()}d.some(p=>p)&&c.push(d)}i.push({name:r.name,rows:c})}return i}var wm=new l5({ignoreAttributes:!1,attributeNamePrefix:"@_",preserveOrder:!0,trimValues:!1,textNodeName:"#text"});function Kn(e){let t=e.indexOf(":");return t>=0?e.slice(t+1):e}function np(e){let t=[];function n(o){if(Oe(o)){for(let i of o)if(Vt(i))for(let[r,s]of Object.entries(i)){if(r===":@"||r==="#text"&&typeof s=="string")continue;let c=Kn(r);if(c==="t"){if(Oe(s)){for(let a of s)if(Vt(a)){let d=a["#text"];typeof d=="string"&&t.push(d)}}}else c==="tab"?t.push(" "):c==="br"||c==="cr"?t.push(`
|
|
213
|
+
`):Oe(s)&&n(s)}}}return n(e),t.join("").trim()}function w5(e){let t=[];for(let n of e)if(Vt(n))for(let[o,i]of Object.entries(n)){if(Kn(o)!=="tr")continue;let r=[];if(Oe(i)){for(let s of i)if(Vt(s)){for(let[c,a]of Object.entries(s))if(Kn(c)==="tc"&&Oe(a)){let d=[],p=l=>{if(Oe(l)){for(let f of l)if(Vt(f))for(let[u,h]of Object.entries(f))if(Kn(u)==="p"&&Oe(h)){let y=np(h);y&&d.push(y)}else Oe(h)&&p(h)}};p(a),r.push(d.join(" ").trim())}}}r.some(s=>s)&&t.push(r)}return ym(t)}async function _5(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 y5(s);for(let a of c)a.rows.length>0&&t.push([`Embedded Sheet ${o}: ${a.name}`,ym(a.rows)])}return t}async function _m(e){let t;try{t=await gm.loadAsync(mm.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=wm.parse(o),r=null,s=d=>{if(Oe(d)){for(let p of d)if(Vt(p))for(let[l,f]of Object.entries(p)){if(Kn(l)==="body"&&Oe(f)){r=f;return}Oe(f)&&s(f)}}};s(i);let c=[];if(r===null){let d=p=>{if(Oe(p)){for(let l of p)if(Vt(l))for(let[f,u]of Object.entries(l))if(Kn(f)==="p"&&Oe(u)){let h=np(u);h&&c.push(h)}else Oe(u)&&d(u)}};d(i)}else for(let d of r)if(Vt(d))for(let[p,l]of Object.entries(d)){if(p.startsWith("@_")||p===":@"||p==="#text"||!Oe(l))continue;let f=Kn(p);if(f==="p"){let u=np(l);u&&c.push(u)}else if(f==="tbl"){let u=w5(l);u&&c.push(u)}}let a=await _5(t);for(let[d,p]of a)c.push(`
|
|
214
214
|
## ${d}
|
|
215
215
|
`),c.push(p);return[c.join(`
|
|
216
216
|
|
|
217
|
-
`),a.length>0]}var
|
|
218
|
-
`)}function
|
|
219
|
-
`),{line:p}=Qe.object({line:Qe.number().int().nonnegative()}).parse(r("pass1/body_start.json"));p>=d.length
|
|
220
|
-
`);try{let f={scriptPath:a,...
|
|
221
|
-
${
|
|
222
|
-
${
|
|
223
|
-
${
|
|
217
|
+
`),a.length>0]}var op=class extends Error{};function xm(e){return e.replace(/^/,"").replace(/\r\n?/g,`
|
|
218
|
+
`)}function x5(e){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new op("source is not valid UTF-8")}}async function na(e,t){if(t===".docx"){let[n]=await _m(e);return xm(n)}return xm(x5(Em.readFileSync(e)))}import{z as oa}from"zod";function ip(e,t){let n=/^text:[^:]+:\d+:(\d+):(\d+):\d+$/.exec(e);if(!n)throw new Error(`Invalid text ingest identity: ${e}`);let o=Number(n[1]),i=Number(n[2]);if(o>=i)throw new Error(`Empty text ingest window: ${e}`);return{start_line:t+o+1,end_line:t+i}}function rp(e,t,n){return{kind:"text",document_id:t,ranges:[ip(e,n)]}}function Sm(e,t,n){for(let o of e.episodes)for(let i of o.scenes)for(let r of i.actions){let s=oa.object({scriptctl:oa.record(oa.string(),oa.json()).optional()}).parse(r.extend??{});r.extend={...r.extend,scriptctl:{...s.scriptctl,source:rp(r.identity_key,t,n)}}}}var E5=Qe.object({source:Qe.object({kind:Qe.literal("text"),sha256:Qe.string().length(64),path:Qe.string()})}),S5=Qe.object({version:Qe.literal(3),episode:Qe.record(Qe.string(),Qe.string()),action:Qe.record(Qe.string(),Qe.string())});function $t(e){throw new S(e,{exitCode:b,errorCode:"REVIEW_TEXT_SOURCE_INVALID",hint:"Pass -s to the text ingest workspace, or its original txt/md/docx with the ingest workspace beside script.json. Keep pass1/source.txt, body_start.json and v4_identity_map.json."})}async function Im(e,t,n){let o=jn.statSync(e).isDirectory(),i=o?Dt.resolve(e):Dt.dirname(Dt.resolve(t)),r=g=>{let _=Dt.join(i,g);return jn.existsSync(_)||$t(`Text ingest artifact missing: ${_}`),JSON.parse(jn.readFileSync(_,"utf8"))},s=E5.parse(r("manifest.json")),c=Dt.join(i,"pass1/source.txt");jn.existsSync(c)||$t("Text review requires the normalized original source snapshot.");let a=jn.readFileSync(c,"utf8");if(ye(a)!==s.source.sha256&&$t("The original text snapshot has changed since ingest."),!o){let g=await na(e,Dt.extname(e).toLowerCase());ye(g)!==s.source.sha256&&$t("The supplied text does not match this ingest source.")}let d=a.split(`
|
|
219
|
+
`),{line:p}=Qe.object({line:Qe.number().int().nonnegative()}).parse(r("pass1/body_start.json"));p>=d.length&&$t("Text body start is outside the source snapshot.");let l=S5.parse(r("v4_identity_map.json")),f=ho(JSON.parse(jn.readFileSync(t,"utf8")));f.version!==4&&$t("Text source review requires the ingested Script v4.");let u=Zs(s.source.sha256),h=Object.entries(l.episode).map(([g,_])=>({id:_,...ip(g,p)})).sort((g,_)=>g.start_line-_.start_line);h.some(g=>g.end_line>d.length)&&$t("An episode's ingest window is outside the original source.");let y=f.episodes.filter(g=>!n?.length||n.includes(g.no)).map(g=>{let _=h.filter(A=>A.id===g.id);_.length!==1&&$t(`Episode ${g.no} has no unambiguous text source identity.`);let E=_[0],x=h[h.indexOf(E)+1];return{episode:g.no,start_line:h.indexOf(E)===0?p+1:E.start_line,end_line:x?x.end_line:d.length}});y.length||$t("No selected episodes exist in this script.");let m=new Map,w=new Map(Object.entries(l.action).map(([g,_])=>[_,rp(g,u,p)]));for(let g of xn(f)){if(!y.some(x=>x.episode===g.scene.ep.no))continue;let _=Qe.object({scriptctl:Qe.object({source:tp.optional()}).optional()}).safeParse(g.raw.extend??{});_.success||$t(`Invalid text source metadata on ${g.anchor}.`);let E=_.data.scriptctl?.source??w.get(g.anchor);E&&(E.document_id!==u&&$t(`Action ${g.anchor} belongs to a different text document.`),E.ranges.some(x=>x.start_line>x.end_line||x.end_line>d.length)&&$t(`Invalid source lines on ${g.anchor}.`),m.set(g.anchor,E))}return{document_id:u,title:Dt.basename(s.source.path),path:c,lines:d,episodes:y,references:m}}var bm="review-agent";function k5(e,t){let n=t||bm,o=e.models[n];if(!o)throw new S(`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 S(`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&&i.protocol!=="google-vertex")throw new S(`${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 Am(){let e=ra.dirname(I5(import.meta.url)),t=ra.join(e,"review-agent.js"),n=Vr.existsSync(t)?A5(t).href:"@lingjingai/review-agent";try{return await import(n)}catch(o){throw new S("The review agent is not installed.",{exitCode:ge,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 km(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 S("--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 ia(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 S(`--${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 Om(e){let t=Li(v(e.llm_config).trim()||void 0),n=v(e.model).trim(),o=v(e.source_path).trim(),i=(Array.isArray(e.video)?e.video:[]).map(f=>f.trim()).filter(f=>f.length>0),r=fm(o,i.length>0),c=k5(t,n||(r==="comic"?"review-comic":r==="text"?"review-text":bm));if(e.check){let f=await Am(),h=typeof{script:f.reviewPlainScript,text:f.reviewTextScript,comic:f.reviewComicScript,video:f.reviewVideoScript}[r]=="function";return[{text:h?`ready: ${c.provider}/${c.model}`:"the review agent bundle is present but exports no reviewScript",data:{ready:h,review_kind:r,provider:c.provider,model:c.model,llm_config:t.sourcePath??"builtin"}},h?J:ge]}let a=ke(e);if(!Vr.existsSync(a))throw new S("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:[a]}});let d=i.filter(f=>!Vr.existsSync(f));if(d.length>0)throw new S("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:d.slice(0,5)}});if(o&&!Vr.existsSync(o))throw new S("Review source not found.",{exitCode:b,errorCode:"REVIEW_SOURCE_NOT_FOUND",hint:"Pass an existing source or ingest workspace, or omit -s for script-only review.",data:{expected:["existing source or ingest workspace"],actual:[o]}});let p=await Am(),l=f=>process.stdout.write(JSON.stringify(f)+`
|
|
220
|
+
`);try{let f={scriptPath:a,...km(v(e.episodes))?{episodes:km(v(e.episodes))}:{},concurrency:ia(e,"concurrency",5),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,apiKey:c.apiKey,maxAttempts:c.maxAttempts,model:c.model,...c.baseUrl?{baseUrl:c.baseUrl}:{},maxSteps:ia(e,"max_steps",300),episodeTimeoutMs:ia(e,"episode_timeout_ms",48e4),onEvent:l};if(r==="comic"){let u=await pm(o,a,f.converge?void 0:f.episodes);await p.reviewComicScript({...f,comic:u})}else if(r==="text"){let u=await Im(o,a,f.converge?void 0:f.episodes);await p.reviewTextScript({...f,text:u})}else r==="video"?await p.reviewVideoScript({...f,source:o,videos:i,mediaModel:c.model,mediaBudget:ia(e,"media_budget",1)}):await p.reviewPlainScript(f)}catch(f){throw f instanceof S?f:new S("Review failed.",{exitCode:ge,errorCode:"REVIEW_FAILED",hint:r==="video"?"Read the error details, NDJSON asr-compared/episode reports and .review/asr/ evidence before retrying.":`Read the error details and episode reports${r==="script"?"":` in .review/${r}/`} before retrying.`,data:{expected:["a completed review run"],actual:[f instanceof Error?f.message:String(f)]}})}return[{text:"",data:{}},J]}function vm(e,t){de(e.command("review"),"write").description("\u6D3E\u53D1 agent \u5BA1\u6838\u5267\u672C\uFF1A\u7ED9 -s \u5BF9\u7167\u6587\u672C\u3001\u6F2B\u753B\u6216\u89C6\u9891\u539F\u7A3F\uFF0C\u4E0D\u7ED9\u5219\u68C0\u67E5\u5267\u672C\u5185\u90E8\u4E00\u81F4\u6027").option("-s, --source-path <path>","\u6587\u672C/\u6F2B\u753B ingest \u5DE5\u4F5C\u533A\u3001\u539F txt/md/docx/PDF \u6216\u89C6\u9891\u6587\u4EF6/\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\u89C6\u9891/\u7EAF\u5267\u672C\u9ED8\u8BA4 review-agent\uFF0C\u6587\u672C review-text\uFF0C\u6F2B\u753B review-comic\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(q(Om,t))}import*as Rm from"node:fs";var _o="\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 Je(e){let t=ke(e);if(!Rm.existsSync(t))throw new S("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 vd(t)}function fe(e,t){let n=e[t];return typeof n=="string"?n:void 0}function Xo(e,t){let n=e[t];if(n==null||n==="")return;let o=Number(n);if(!Number.isFinite(o))throw new S(`--${t} must be a number.`,{exitCode:b,errorCode:"OPTION_NOT_NUMBER",data:{actual:[String(n)]}});return o}function me(e,t=0){return(e._args??[])[t]??""}function sp(e){return Array.isArray(e)?e.map(String):typeof e=="string"?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function it(e,t,n=()=>({})){try{let o=e();return[{text:o,data:{op:t,changed:!1,text:o,...n()}},J]}catch(o){throw o instanceof S?o:new S(o instanceof Error?o.message:String(o),{exitCode:b,errorCode:o?.code??"SCRIPT_TOOL_FAILED"})}}function Mm(e,t){let n=de(e.command("read [addr]"),"read").description(`\u8BFB\u4EFB\u610F\u8282\u70B9\uFF1B\u4E0D\u7ED9\u5730\u5740\u8FD4\u56DE\u5267\u672C\u5361\u3002${_o}`).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(q(g=>{let _=Je(g);return it(()=>zs(_,me(g),{...g.outline?{depth:"outline"}:{},...g.plain?{plain:!0}:{},...Xo(g,"context")!==void 0?{context:Xo(g,"context")}:{}}),"read",()=>me(g)?{}:{document:_.raw})},t));be(n,[_o]);let o=de(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(q(g=>it(()=>{let _=Je(g),E=me(g);return[`## \u573A\u7ED3\u6784
|
|
221
|
+
${zs(_,E,{depth:"outline"})}`,`## \u6B63\u6587
|
|
222
|
+
${zs(_,E)}`,`## \u5F53\u524D\u6821\u9A8C\u95EE\u9898
|
|
223
|
+
${Kd(_,{})}`].join(`
|
|
224
224
|
|
|
225
|
-
`)},"scan"),t));ke(o,["\u96C6\u53F7\uFF0C\u4ECE 1 \u5F00\u59CB"]);let i=de(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${_o}`).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(q(g=>rt(()=>Nf(Je(g),fe(g),{...ue(g,"in")?{in:ue(g,"in")}:{},...ue(g,"speaker")?{speaker:ue(g,"speaker")}:{},...ue(g,"type")?{type:ue(g,"type")}:{},...Xo(g,"limit")!==void 0?{limit:Xo(g,"limit")}:{},...g.full?{full:!0}:{}}),"find"),t));ke(i,["\u6B63\u5219\uFF1B\u53EA\u6309 speaker/type \u8FC7\u6EE4\u65F6\u53EF\u7701\u7565"]);let r=de(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(q(g=>{let _=Td(Je(g),fe(g),{offset:Xo(g,"offset"),limit:Xo(g,"limit"),context:Xo(g,"context")});return[{text:Vd(_),data:{op:"refs",changed:!1,..._}},J]},t));ke(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=de(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(q(g=>{let _=Je(g);return rt(()=>Uf(_,fe(g)),"span",()=>({rows:[Gd(_,fe(g))]}))},t));ke(s,[`${_o}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),de(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(q(g=>{let _=Je(g),E=Ti(_);return[{text:jf(_),data:{op:"script.validate",changed:!1,passed:E.ok,script_path:_.path,stats:{actors:_.assets.filter(x=>x.kind==="actor").length,locations:_.assets.filter(x=>x.kind==="location").length,props:_.assets.filter(x=>x.kind==="prop").length,episodes:_.episodes.length,scenes:_.episodes.reduce((x,A)=>x+A.scenes.length,0),actions:En(_).length},issues:[...E.errors.map(x=>({...x,severity:"error"})),...E.warnings.map(x=>({...x,severity:"warning"}))]}},E.ok?J:Xn]},t)),de(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(q(g=>rt(()=>Bd(Je(g),{...ue(g,"severity")?{severity:ue(g,"severity")}:{},...ue(g,"code")?{code:ue(g,"code")}:{}}),"issues"),t));let c=de(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${_o}`).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(q(g=>{let _={};for(let E of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let x=ue(g,E);x!==void 0&&(_[E]=x)}for(let E of["paren","ts","transition"])if(g[E]===!1)_[E]=null;else{let x=ue(g,E);x!==void 0&&(_[E]=x)}return g.alias!==void 0&&(_.aliases=rp(g.alias)),rt(()=>Cf(Je(g),fe(g),_),"edit")},t));ke(c,[_o]);let a=de(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(q(g=>rt(()=>Pf(Je(g),fe(g),g.before?"before":"after",ue(g,"type"),fe(g,1),ue(g,"speaker"),ue(g,"paren")),"insert"),t));ke(a,["\u76F8\u90BB action \u7684\u5730\u5740","\u65B0 action \u7684\u6B63\u6587"]);let d=de(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(q(g=>rt(()=>Tf(Je(g),fe(g),fe(g,1),g.before?"before":"after"),"move"),t));ke(d,["\u8981\u632A\u7684 action","\u76EE\u6807\u90BB\u5C45 action"]);let p=de(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(q(async g=>{let _=await import("node:fs"),E=ue(g,"file"),x=E?_.readFileSync(E,"utf8"):_.readFileSync(0,"utf8");return rt(()=>$f(Je(g),fe(g),x,{allowDelete:!!g.allow_delete}),"write")},t));ke(p,["\u573A / \u96C6\u5730\u5740\uFF0C\u6216 `+` \u8FFD\u52A0\u65B0\u96C6"]);let l=de(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(q(g=>rt(()=>Bf(Je(g),fe(g),fe(g,1),{...ue(g,"in")?{in:ue(g,"in")}:{},...ue(g,"speaker")?{speaker:ue(g,"speaker")}:{},...ue(g,"type")?{type:ue(g,"type")}:{},...g.apply?{apply:!0}:{}}),"replace"),t));ke(l,["\u6B63\u5219","\u66FF\u6362\u6210\u4EC0\u4E48"]);let f=de(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",k5,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(q(g=>rt(()=>Jf(Je(g),fe(g),fe(g,1),rp(g.state).flatMap(_=>_.split(",")).map(_=>_.trim()).filter(Boolean),!!g.remove),"ref"),t));ke(f,["\u573A\u5730\u5740","\u4EBA\u7269 / \u5730\u70B9 / \u9053\u5177\u7684\u540D\u5B57\u6216 ID"]);let u=de(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(q(g=>rt(()=>zf(Je(g),fe(g),fe(g,1),ue(g,"desc")??"",ue(g,"importance")??"featured",rp(g.alias)),"asset"),t));ke(u,["actor | location | prop","\u540D\u5B57"]);let h=de(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(q(g=>rt(()=>Hf(Je(g),fe(g),fe(g,1),ue(g,"desc")??""),"state"),t));ke(h,["\u8D44\u4EA7\u540D\u6216 ID","\u72B6\u6001\u540D"]);let y=de(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(q(g=>rt(()=>Ff(Je(g),fe(g),{...ue(g,"replacement")?{replacement:ue(g,"replacement")}:{},...g.force?{force:!0}:{}}),"del"),t));ke(y,[_o]);let m=de(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(q(g=>rt(()=>zd(Je(g),fe(g),fe(g,1)),"merge"),t));ke(m,["\u88AB\u5E76\u5165\u7684\u8D44\u4EA7","\u4FDD\u7559\u7684\u8D44\u4EA7"]);let w=de(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(q(g=>rt(()=>Qf(Je(g),fe(g),fe(g,1)||void 0,fe(g,2)||void 0,!!g.remove),"ext"),t));ke(w,[_o,"extend key","\u503C"])}function k5(e,t){return[...t,e]}import*as Gh from"node:path";var zn={createExecutor:wf};import*as Np from"node:fs";import*as Hi from"node:path";var An=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();var Vr=e=>String(e).padStart(3,"0"),sp=e=>e.normalize("NFC").replace(/\s+/g," ").trim();function Mm(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}`,h=(a.get(u)??0)+1;return a.set(u,h),`${u}:${h}`},p=(l,f)=>{let u=l.actors.find(h=>sp(h.name)===sp(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_${Vr(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_${Vr(s)}`,scenes:[]},n.push(i)),c++,r={identity_key:d("scene",l.source),scene_id:`scn_${Vr(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 $r=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=sp(t),i=this.byNorm.get(o);return i||(i={provisional_id:`${this.prefix}_${Vr(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=An(n),i=t.states.find(s=>An(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 b5(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 ra(e){let t=0,n=()=>`st_${Vr(++t)}`,o=new $r("act","actor",n),i=new $r("loc","location",n),r=new $r("prp","prop",n),s={episode:{},scene:{},action:{}},c={episode:new Set,scene:new Set,action:new Set},a=(u,h,y)=>{if(!y||c[u].has(y))throw new Error(`Duplicate or missing ${u} source identity: ${y}`);c[u].add(y),s[u][h]=y},d=(u,h,y,m)=>{let w=u.ensure(h.name,y),g={[m]:w.provisional_id};return h.state!==void 0&&(g.state_id=u.stateId(w,h.state)),g},p=e.episodes.map((u,h)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((y,m)=>{let w=`${u.episode_id}/${y.scene_id}`;a("scene",w,y.identity_key);let g={episode:h,scene:m},_=y.location?d(i,y.location,g,"location_id"):null,E=y.actors.map(k=>d(o,k,g,"actor_id")),x=y.props.map(k=>d(r,k,g,"prop_id")),A=y.actions.map((k,U)=>{a("action",`${w}#${U}`,k.identity_key);let O={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let I=o.ensure(k.speaker.name,g),L={actor_id:I.provisional_id};k.speaker.state!==void 0&&(L.state_id=o.stateId(I,k.speaker.state)),O.speaker=L}else O.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?O.emotion=k.parenthetical:k.emotion!==void 0&&(O.emotion=k.emotion)),k.extend!==void 0&&(O.extend=k.extend),O});return{scene_id:y.scene_id,...y.environment?{environment:y.environment}:{},location:_,actors:E,props:x,actions:A}})})),l=(u,h,y)=>u.list().map(m=>({[h]:m.provisional_id,[y]:m.names[0]??m.provisional_id,aliases:m.names.slice(1),description:"",states:b5(m)}));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 Lm(e,t={}){let n=t.maxChars??500,o=e.split(`
|
|
225
|
+
`)},"scan"),t));be(o,["\u96C6\u53F7\uFF0C\u4ECE 1 \u5F00\u59CB"]);let i=de(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${_o}`).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(q(g=>it(()=>Uf(Je(g),me(g),{...fe(g,"in")?{in:fe(g,"in")}:{},...fe(g,"speaker")?{speaker:fe(g,"speaker")}:{},...fe(g,"type")?{type:fe(g,"type")}:{},...Xo(g,"limit")!==void 0?{limit:Xo(g,"limit")}:{},...g.full?{full:!0}:{}}),"find"),t));be(i,["\u6B63\u5219\uFF1B\u53EA\u6309 speaker/type \u8FC7\u6EE4\u65F6\u53EF\u7701\u7565"]);let r=de(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(q(g=>{let _=Vd(Je(g),me(g),{offset:Xo(g,"offset"),limit:Xo(g,"limit"),context:Xo(g,"context")});return[{text:$d(_),data:{op:"refs",changed:!1,..._}},J]},t));be(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=de(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(q(g=>{let _=Je(g);return it(()=>Cf(_,me(g)),"span",()=>({rows:[Jd(_,me(g))]}))},t));be(s,[`${_o}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),de(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(q(g=>{let _=Je(g),E=$i(_);return[{text:zf(_),data:{op:"script.validate",changed:!1,passed:E.ok,script_path:_.path,stats:{actors:_.assets.filter(x=>x.kind==="actor").length,locations:_.assets.filter(x=>x.kind==="location").length,props:_.assets.filter(x=>x.kind==="prop").length,episodes:_.episodes.length,scenes:_.episodes.reduce((x,A)=>x+A.scenes.length,0),actions:xn(_).length},issues:[...E.errors.map(x=>({...x,severity:"error"})),...E.warnings.map(x=>({...x,severity:"warning"}))]}},E.ok?J:Xn]},t)),de(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(q(g=>it(()=>Kd(Je(g),{...fe(g,"severity")?{severity:fe(g,"severity")}:{},...fe(g,"code")?{code:fe(g,"code")}:{}}),"issues"),t));let c=de(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${_o}`).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(q(g=>{let _={};for(let E of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let x=fe(g,E);x!==void 0&&(_[E]=x)}for(let E of["paren","ts","transition"])if(g[E]===!1)_[E]=null;else{let x=fe(g,E);x!==void 0&&(_[E]=x)}return g.alias!==void 0&&(_.aliases=sp(g.alias)),it(()=>Pf(Je(g),me(g),_),"edit")},t));be(c,[_o]);let a=de(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(q(g=>it(()=>Tf(Je(g),me(g),g.before?"before":"after",fe(g,"type"),me(g,1),fe(g,"speaker"),fe(g,"paren")),"insert"),t));be(a,["\u76F8\u90BB action \u7684\u5730\u5740","\u65B0 action \u7684\u6B63\u6587"]);let d=de(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(q(g=>it(()=>Vf(Je(g),me(g),me(g,1),g.before?"before":"after"),"move"),t));be(d,["\u8981\u632A\u7684 action","\u76EE\u6807\u90BB\u5C45 action"]);let p=de(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(q(async g=>{let _=await import("node:fs"),E=fe(g,"file"),x=E?_.readFileSync(E,"utf8"):_.readFileSync(0,"utf8");return it(()=>Df(Je(g),me(g),x,{allowDelete:!!g.allow_delete}),"write")},t));be(p,["\u573A / \u96C6\u5730\u5740\uFF0C\u6216 `+` \u8FFD\u52A0\u65B0\u96C6"]);let l=de(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(q(g=>it(()=>Kf(Je(g),me(g),me(g,1),{...fe(g,"in")?{in:fe(g,"in")}:{},...fe(g,"speaker")?{speaker:fe(g,"speaker")}:{},...fe(g,"type")?{type:fe(g,"type")}:{},...g.apply?{apply:!0}:{}}),"replace"),t));be(l,["\u6B63\u5219","\u66FF\u6362\u6210\u4EC0\u4E48"]);let f=de(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",b5,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(q(g=>it(()=>Bf(Je(g),me(g),me(g,1),sp(g.state).flatMap(_=>_.split(",")).map(_=>_.trim()).filter(Boolean),!!g.remove),"ref"),t));be(f,["\u573A\u5730\u5740","\u4EBA\u7269 / \u5730\u70B9 / \u9053\u5177\u7684\u540D\u5B57\u6216 ID"]);let u=de(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(q(g=>it(()=>Hf(Je(g),me(g),me(g,1),fe(g,"desc")??"",fe(g,"importance")??"featured",sp(g.alias)),"asset"),t));be(u,["actor | location | prop","\u540D\u5B57"]);let h=de(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(q(g=>it(()=>Qf(Je(g),me(g),me(g,1),fe(g,"desc")??""),"state"),t));be(h,["\u8D44\u4EA7\u540D\u6216 ID","\u72B6\u6001\u540D"]);let y=de(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(q(g=>it(()=>Yf(Je(g),me(g),{...fe(g,"replacement")?{replacement:fe(g,"replacement")}:{},...g.force?{force:!0}:{}}),"del"),t));be(y,[_o]);let m=de(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(q(g=>it(()=>Hd(Je(g),me(g),me(g,1)),"merge"),t));be(m,["\u88AB\u5E76\u5165\u7684\u8D44\u4EA7","\u4FDD\u7559\u7684\u8D44\u4EA7"]);let w=de(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(q(g=>it(()=>Ff(Je(g),me(g),me(g,1)||void 0,me(g,2)||void 0,!!g.remove),"ext"),t));be(w,[_o,"extend key","\u503C"])}function b5(e,t){return[...t,e]}import*as Jh from"node:path";var zn={createExecutor:_f};import*as Up from"node:fs";import*as Fi from"node:path";var In=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();var $r=e=>String(e).padStart(3,"0"),ap=e=>e.normalize("NFC").replace(/\s+/g," ").trim();function Lm(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}`,h=(a.get(u)??0)+1;return a.set(u,h),`${u}:${h}`},p=(l,f)=>{let u=l.actors.find(h=>ap(h.name)===ap(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_${$r(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_${$r(s)}`,scenes:[]},n.push(i)),c++,r={identity_key:d("scene",l.source),scene_id:`scn_${$r(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 Dr=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=ap(t),i=this.byNorm.get(o);return i||(i={provisional_id:`${this.prefix}_${$r(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=In(n),i=t.states.find(s=>In(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 O5(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 sa(e){let t=0,n=()=>`st_${$r(++t)}`,o=new Dr("act","actor",n),i=new Dr("loc","location",n),r=new Dr("prp","prop",n),s={episode:{},scene:{},action:{}},c={episode:new Set,scene:new Set,action:new Set},a=(u,h,y)=>{if(!y||c[u].has(y))throw new Error(`Duplicate or missing ${u} source identity: ${y}`);c[u].add(y),s[u][h]=y},d=(u,h,y,m)=>{let w=u.ensure(h.name,y),g={[m]:w.provisional_id};return h.state!==void 0&&(g.state_id=u.stateId(w,h.state)),g},p=e.episodes.map((u,h)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((y,m)=>{let w=`${u.episode_id}/${y.scene_id}`;a("scene",w,y.identity_key);let g={episode:h,scene:m},_=y.location?d(i,y.location,g,"location_id"):null,E=y.actors.map(k=>d(o,k,g,"actor_id")),x=y.props.map(k=>d(r,k,g,"prop_id")),A=y.actions.map((k,U)=>{a("action",`${w}#${U}`,k.identity_key);let O={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let I=o.ensure(k.speaker.name,g),M={actor_id:I.provisional_id};k.speaker.state!==void 0&&(M.state_id=o.stateId(I,k.speaker.state)),O.speaker=M}else O.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?O.emotion=k.parenthetical:k.emotion!==void 0&&(O.emotion=k.emotion)),k.extend!==void 0&&(O.extend=k.extend),O});return{scene_id:y.scene_id,...y.environment?{environment:y.environment}:{},location:_,actors:E,props:x,actions:A}})})),l=(u,h,y)=>u.list().map(m=>({[h]:m.provisional_id,[y]:m.names[0]??m.provisional_id,aliases:m.names.slice(1),description:"",states:O5(m)}));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 Nm(e,t={}){let n=t.maxChars??500,o=e.split(`
|
|
226
226
|
`),i=[],r=0,s=0,c=a=>{let d=o.slice(r,a).join(`
|
|
227
|
-
`);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
|
|
228
|
-
`);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
|
|
229
|
-
`)}var
|
|
230
|
-
`)}function
|
|
231
|
-
`);function
|
|
232
|
-
`)}function
|
|
233
|
-
`);i=Dr(r)}catch(r){throw r instanceof ge?pa(n(19)+t[n(73)]+": "+r[n(17)],[r[n(17)]]):r}if(i[n(1)]===0&&t[n(53)][n(52)]()!=="")throw n(60)===n(22)?_0x1b2e63(n(19)+_0x2d4dff[n(73)]+n(63),[n(31)]):pa(n(19)+t[n(73)]+n(69),[n(2)]);return i}function fp(){let e=["lsdOVAZLNlRVVjP7iMTPBMqIoIj0CMfUC2L0Aw9UiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHoI9RowCUUAwH+wTLYj944cc5BI46kEb5Qc85BYp6k+n5lMF6kAb57+76k+r77Ym5l6l5AAcigbgteftsejbq0TGiokgKIbG6zEQ5zUEyooaGwbcqunlifrpifbsrvnftLrGiokgKIbG5zUE5yIW546W5A6EyooaGG","BgvUz3rO","CMvJB3jKCZOGma","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","C2XPy2u","icdOKAhOR63LIQJKVzWGyfjPy2HHCMqGyxzHBSoNysWGywDHCNjHievTAwX5ihbLBgeGCM91CgeGzsbHihb1EgeGCgfYysbJAw1HlMaG4OAsigfJDgLVBI5JB250zw50pwbsAwnOyxjK5lIk5yMn5OQt5l2prw1PBhNNMOtOOApMNi3VViZMIORLPBNMI73KUOBOTBFMNAxJGijG44cc","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","icdMUPaGyoMbK+wfT++8MUwPMUs5PU+8JoEoIEs9QwaG4OAsihnJzw5LlNbYB3bZpvT7iM5HBwuIoIlLQzRKUAyIFsX7iM5HBwuIoIlNJONKVAKIFv3JGii","icdMUPaGyokwSYdNLllMJQJPL6JOGiZLHAxJGijGiokgKIbHy3rPB27VViXJB250zw50iowoU+AoIEAGVow8J+wjJEE8GcbG4PAZyooaGG","su5hrvnux05puK1bteLArv9gquLmruq","5B+f6Ag75OQk6l+z5lQB5Q2J5PAh5y6F5l2n5Ps+5zYOihjLy29YzhmG5PYa5yMn6z2I77YBzxbPC29KzsdLJ6RLNkJMUPdMLOFMNkZMMi7NOA7PM4BOVRNNLyZLPitLHPNLHAxJGilMOiFLH4BLIAFMNkZMSR/NLkJLJP/MNiNLNlRNLyZVVjVLSi/OR7tLKOZPNz7MOiFLH4BMLOFMNkZKVP3MJA7LNldNGRNLIiFMJAlJGihMMi7MMl7OT7pML7BJGihLJ5NKUOVNUR/LIiFMJAlMIjBMMi7NOA7OVAZLNlRLU7RNQ4SGC2nLBMxVVjVLKiZKUidOV57NU63LNlRNMOtMJihKUyxLPjBOSOZLJ5JLJjBLHPNLHAuGywn0Aw9U44cc","5lQ654MP5y+Q5yIx5yw35l2t5y2v5lQ66kEs6iMY77YB5A625PEpl+ACUUAEHc/NVQtKVzmV5RoB56EW5lIn5yIx5ywLigfJDg9YC+oaGUE+Pos9K+wwIUIVNEEAHcbZCgvHA2vYioEuQcb7iMTPBMqIoIjNCM91Ccj944cc","5Q+p56En6k6W5B2v5y+Q6io95l2/55sO5lIk6z2I5yIx5yE655Qe5A2x5Q6177Ym56Ab5Q2I5AkE5yQGig5HBwxJGif0zxH044cbBgLUzEoaGwvWAxnVzgvFDgL0BguG562j6iEQ5yIB5A2x5Q6144cc","ANnVBL9VyMPLy3q","BwvZC2fNzq","icdMUPaGyowCUJmTmIdML6uV5yAfiowUOUwoHwaG4OAsios4Gos4QIbZy2vUzE+8M3nWywnLiowpQUEuQcbPBNrLCMLVCI9LEhrLCMLVCU+8JhrPBwuG5y+Q55sOigrHEs9UAwDODc9KyxDUl2r1C2VJGilNMB3LPkKV5PEL6zE05B2sigrHEE+8JowKNoAzMI/LPjZPL7tLVziGBMLNAhtVViZMUixMMAGV6BUo5PIo5B2sigrHD27VViZPU4tMMi8V5ykn5PMA5B2sigr1C2VJGilLJP/MLOFMNkRNM7tMJQxLHPNMMi7ML7BVViZMOlNMJA7NHAFMMi7JGihKVzZMGA/JGihLPkNNQBRLKOZKUiRKUiVMLOFLIktMLQ3VVjVKUi3LVPFNNihNLAxMIjBLHPNNQBRKUllJGii","y2H1BMSG","5zcm5zYW54k56l+E57UT6jkz5AsQ5Awh5l+D55wz5lIa5lIQihnJzw5Liow5TUEuQcb0CMfUC2L0Aw9U77YB6lEO5zYW54k56jkz5AsQ5Awh5OYj5yMQ6l6r6Ag65BQp5OUg5OIq5AsA5lIQihnJzw5L77Ym5Q+p5zY65AgR5yAz6iEQ5BEX55QeigXVy2f0Aw9U44cbywn0B3jZ44cbChjVChmG5zkmihn0yxrL44cc","CMvJB3jKCYdMJiNMUPdMLOFMNkZLJ5hNLj/POBRLUO/MJPlLIjFVViZLJ6RMLl7MUPdMLOFMNkZKUk3LRP7PMyxLRzJLNkJNMOtLHOxLRRNVVjVKUi3OPOhOH4BPGkdOVRNNLyZVViZKUi3OPOhMJ5dKVPSGC291CMnLiowTL+AUTEoaGG","s2fYENy","6l+z5lIQ54Mh5Q615y+V6io95OM/5O6L5lIk5lIa54Mh5Q6155Qe5zcm5lIa5zY677YB5y+Q5PYj5RQq5PAh5PYS5yE6546W55YF5A6E5zY655wm5PE25OMn5BU656Ul5PAW5zY644cc","6ycq6kgm5Ase55cg5y6F5PAh77Ym5BM25zYO6l6t5yE65yMn6ycq6kgm6iEQ5Qoa5Q2J5PAh5PIV5zcM5ywO6yoO5OM/6l2944cc5lIa5lIQ5y6F5PAh5Q616jc95zcR5AsA5y+L5PE25B+f6Ag75l+D55wz5ywO6yoO5y+L5A2q77YB5y+V5lUL5OUg5OIq5AsA5P2H6k6W5B2v77Ym5l2g56Ab5Q2I5OIQ5PAT44cb5Pgy6kAb44cb5zci5BM25zco5RYp5y+L5OIw5y+Q5l+D55wz5Q616jc95yMn5y2k5Q6144cc5yQO5l2C57+76k+r5y+Q6io95Ps55y+y6kgO6l6+6k+T6kIa77Ym5lIn6io95yEp5Bcr5lQl5A6E44cc5lIn6kAb6l6t5yE66iEQ5Qoa6l+h56Il44cc","BwfW","AgfZt3DU","lsdLIQJKVzWV546V5Akd77YAEYjRAw5KiJOIywn0Aw9UiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHowpR+AlJEArHoApJ+I/Scj944cc","CgfYC2u","B2jQzwn0","sNz4u1y","Aw52ywXPzcbZDhj1y3r1CMvKig91Dhb1Da","C3rYAw5NAwz5","CMvJB3jKCW","57UD5lIn6kAb5OQk6z2G5zco5yE6546W55Qe6zUg6l6555wm5O+q5yIW5BYa5As044cc","lsdPM4BOVRNNLyZVVjP7iMTPBMqIoIjLCgLZB2rLiIWIzxbPC29Kzsi6mtKSiNrPDgXLiJOI5y+V6ycj5Qch6AkyiN3JGijLCgLZB2rLiow/HEMHU+wpLUA6KoAwH+ACRowgMEAyJUEAHoMBHUwpT++8M+s5PUwqJEoaGEAlRowpT+oaGEAGH+MIMoAwH+wTL+MdVEs4JEIdVEA3T+I/MYbLCgLZB2rL44cc","y29Yzv9SAw5Lx2vUza","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","lsdLR7NNMB3VVjP7iMTPBMqIoIjKAwfSB2D1zsiSiNnWzwfRzxiIoNSIBMfTzsi6iUEuSIj9lcjJB250zw50iJOI5y6F6k+DiIWIzw1VDgLVBIi6iUwpR+MaIsj944cc","5l2G5PIV5yMN5PYS6kEe6iYd5yYw5zMO44cc5OQk57Uz5A6A55Qe5RQq5PAh5PYS5z2x6l2S5O2I5OIq57Ut5P6e5yYw5yMN5PYS6k6W5B2v44cc","z2vUzxjHDgvuzxH0","lsdLNlROVRNNLyZVVjP7iMTPBMqIoIjZy2vUzsiSiMvUDMLYB25Tzw50iJP7iNnWywnLiJOIAw50zxjPB3iIlcj0Aw1LiJOIzgf5iN0SiMXVy2f0Aw9UiJP7iM5HBwuIoIlLRQlLJOuIFsWIywn0B3jZiJPBxsWIChjVChmIoLTDFEoaGUs4JEIMGEI+K+whUIbZy2vUzsdNVjBLJ7FLRzFMRRxVViZNS7VNU5/KVjROH6ROOyZOV57NU63NVjBLJ7FJGilMR4/KUkOGC2nLBMuG6yo95B+f6Ag75AgR5yAzigvUDMLYB25Tzw50lNrPBwxVViZLJ6ROG73KVB/NLkGGzgf5Fg5Pz2H0FgrHD258zhvZA++8M+s+NEASOEwVUEw6LoAxPs/LPjWV5PMOl+AyJ+oaGG","lsdLHOxLV4pNI6ZNMB0V55s75Asw6z+Z77YAEYjRAw5KiJOIAw5UzxjFDgHVDwDODciSiNnWzwfRzxiIoNSIBMfTzsi6iUEuSIj9lcjJB250zw50iJOI5y6F6k+DiIWIzw1VDgLVBIi6iUwpR+MaIsj944cc","sw5ZCgvJDcb0AguGy2H1BMSGzxjYB3iGC2LKzwnHCIbHBMqGCMvYDw4GyhnJCMLWDgn0BcbPBMDLC3rGlG","6z2E5lQ654MP5y+r5AoW5RQq55QeihnWzwfRzxiUA2LUzcdLJ6RNLkGGC3LZDgvTFgjYB2fKy2fZDhXVzMzZy3jLzw58z3jVDxdVViZLJ6/NLkGGBgfIzwWG6kgL5ywf5zcn56EW77YB5yw35l2t5lQ654MP5AEl57Ui55sOihnWzwfRzxiUBMfTzEoaGG","AxnbCNjHEq","6l+z5PIV5RQq5PAh5lU25BYa5As077YB5Bcp6k+05OIw6z2E5Qch5yEg5PAh5PYS5lUo56YS5lIa5lIQ5y+V56gU6k6K55Qe54MP55cg56M66zE05BU656Ul6AAw5zY644cc","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","5lUL5lIl5Q2J5PAh5B+f6Ag76ycq6kgm44cb6ycq5y+L5A6m5Pw06l+B5ywLihjLy29YzhpVVjRLR7NNMB3LKOZLHOxLV4pNI6ZNMB3PGjdLRzFKV53NLzNLJP/OR63OQidVVjVLIQJKVzZJGihNJQ/LOOpJGihOVAZLNlRJGihMIBNMS6JLKOZOOAJMVjtMJ5dNPlRLV6dLRP7OVAZMJAlMIjdNROdKVzpKUk3MLOFVVjVKURRNIANLKi3LNkJMIydMNiNORRdLVzxKUk3KV53MJihLJP/MLOFMI7ZLHPNVViZKUi3NV7VOR5hJGihKUi3PN7pOR5hJGilKUi3LVPFPGzFMVi/JGihMKzJOPOhJGihMIkRMLQ3MIjBOOAxPGkdJGilOVPpLH7RLIy3OR7FOH6ROOyZMOlJLR7NMR4/KUidOOyZVViZKUjtKUi3OPOhOVPpLH7RMOlJLR7NOV4FNQiVJGii","oIbWCM92AwrLCIbYzxr1CM5LzcbPBNzHBgLKiePtt04","icdMUPaGyoEuSU+8MUs9OoADPEs6HMaG4OAsigrPywXVz3vL44cc5RQqigdNLllVViJLHRFNRjhVViNVVjRKVAdMNAxKUOzGiokgKIbKAwfSB2D1zs5LBw90Aw9Uios4UIbG5yA356YryooaGG","DhjPBq","Dgv4Da","BM90zsdLJ6RNLkJKUO7NNj/MRApML6dMS5xLVzlLHAxLIAFMNkZJGihKUz/KUi3LSz7KUO7NLlVPNAiV5A+555M955Qe5yAf5A6544cc5RQq5PAh5PYS5z2x55Qe5A6E6lsO5yAf5A655lIn5B6x5lII5AsX44cc","ywn0Aw9U44cbzgLHBg9NDwxJGifPBM5LCL90Ag91z2H044cbDhjHBNnPDgLVBUoaGw5VDguG55QeignVBNrLBNqG5B+f6Ag75PIV6z2E56M65A2x56YM5lIY77YB5lIn5B6x6l6t5yE6ignVBNrLBNqG5lI656M655Qe5y2G5l2n6k6W5B2v44cc5y6F5PAh5RkH5PYj5A+55BQu5Q2J5PAh5PE25BcX5lIn6kAb5yIB5BU66k+L6k6W5B2v44cc","C291CMnL","CMvJB3jKig11C3qGyMuGyw4GB2jQzwn0ihDPDgHVDxqGC291CMnL","icdMUPaGyos6UUEjQE+8MUEuSUoaKoEzVEIHOYZMMi/OV7FJGjhVViZKUzLGiokgKIbZy2vUzs5Hy3rVCNm9w3SIBMfTzsi6iUEuSIiSiNn0yxrLiJOI55M96kgJloAyJ+I/TYj9lhSIBMfTzsi6iUs5Msj9xEoaGG","icdMUPaGyoEuSK9t77YA77Yi5Ogq5Owm77Yj5lUw5RkH5Q275zcN77YFycdIHPiGAw5UzxjFDgHVDwDODc5LBw90Aw9Uios4UIbG5Ogq5OwmyooaGG","C3zJvNG","A2v5CW","5zY65y+377Yi5AAcigdLNlOZltjG77Yj57UD5lIn5PIV6zUg6l6555wm77YB5y+Q5PYj5y6F5PAh5PIo56gU5yAz5yE6igdNRkXo6zUgycdMIjyGye7PM4zGioAxTUAjJEIdVEI+K+whUIbLCgLZB2rL44cc","oIbVDxrWDxqGBxvZDcbIzsbHBIbVyMPLy3qGy29UDgfPBMLUzYbVBMX5ihjLy29YzhnBxq","y29Yzv9SAw5Lx3n0yxj0","5lIL5Qc85l+D5OYb5RQq5PAh5PYS6Ag65BQp77Ym57UD5lIn6yEn5O6s77YA5z2x5BYa5As06iUL5zYO5lU75l2v44co6zUgl+wCUUoaJ+AGH+IUSos5I+wjJEwWSEACIEATO+AwH++8Ios4IUs4GowDL+AYOEwgMEwUJoEAHoAiJ++8IE+8Ja","icdMUPaGyooaKowTL+w5LE+8MUwBNUMxQoAxPEoaKwaG4OAsigfJDgLVBU+8M+EuU+MDOUAwH+wTL+wXNUs6JUEuU+MDOUwgHEwUUEoaGG","ugjquNe","lsdMIBNMS6JVVjP7iMTPBMqIoIjUB3rLiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHoAjUEAZQciSiMnHDgvNB3j5iJOIyxv0Ag9Yx25VDgv8zM9YBwf0x25VDgv8Dw5JBgfZC2LMAwvKiN3JGii","oIbUB24Tzw1WDhKGy2H1BMSGChjVzhvJzwqGBM8GCMvJB3jKCW","6k6W5B2v57g75z6l77YA","Aw5Nzxn0lNrLEhqTBM9YBwfSAxPL","yuDguKW","Aw5KzxG","AM9PBG","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","icdLKiZKUidLJ6xNLlhLPjRKURRLKiZML7BOR7tML7BVViZKUlRMR4/KUkROR7tOR53KURRLKitLHPNKUidMNAhNM7JPGRSGzgLHBg9NDwxVViXJB250zw50ioEBUowqJooaGG","6l2S5O2I6kEe5yIz77YA","44cq5B6f6kEe6iYd5yYw55Qe5y6F5PAh54Mh5Q6144cr"];return fp=function(){return e},fp()}async function Km(e,t,n){let o=F,i=await e[o(41)](o(71),{system:Q5,user:F5(t),responseFormat:o(16),...n?{signal:n}:{}}),r;try{r=JSON[o(28)](i[o(53)])}catch{if(o(67)!==o(67))_0x10022d=_0x3c4a29[o(28)](_0x5ecbb9[o(53)]);else throw pa(o(19)+t[o(73)]+o(50),[i[o(53)][o(7)](0,500)])}return{raw:i[o(53)],records:mp(r,t)}}var hp=Xt,q5=hp(1);function Z5(e){let t=hp,n=e[t(5)](/起点\s*[::]\s*(\d+)/);return n?{found:!0,line:Math[t(3)](Number(n[1]))}:{found:!1,line:null}}function gp(){let e=["Dgv4Da","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","Aw5Nzxn0lMjVzhKTC3rHCNq","Dhj1BMm","z2vUzxjHDgvuzxH0","Bwf0y2G","5lIl6z2I5PIV5RQq5PAh5lU255Qe5lIa5Q6177Ym5Q+p6kgm5lUL44cm6kgm5y+3pfrbqJ7LHOxLRRNJGi3NU5NLH7RJGilLIktMLQ3NNj/MRApNMOtLIAFMNkZMRApMLOFMMk/LKkBLNkJOV5NMRRxPH4ZLVidLP4VVViZMJiNMOlZLVi/LJ6RLM57KUidOOyZJGiikcG"];return gp=function(){return e},gp()}async function jm(e,t,n){let o=hp,i=await e[o(4)](o(2),{system:q5,user:o(6)+t,...n?{signal:n}:{}});return Z5(i[o(0)])}function Xt(e,t){e=e-0;let n=gp(),o=n[e];if(Xt.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};Xt.TPTWLA=i,Xt.iYuNay={},Xt.sLepLJ=!0}let r=n[0];Xt.inDmHY!==r&&(Xt.iYuNay={},Xt.inDmHY=r);let s=Xt.iYuNay[e];return s===void 0?(o=Xt.TPTWLA(o),Xt.iYuNay[e]=o):o=s,o}var zm=50,W5=10;async function Hm(e,t,n){let o=t.split(`
|
|
234
|
-
`),i=
|
|
235
|
-
`),a=await jm(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 Qm(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 Kt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),en=e=>Array.isArray(e);function yp(e){let t=new Map;if(!en(e))return t;for(let n of e){if(!Kt(n))continue;let o=n.actor_id??n.location_id??n.prop_id;typeof o=="string"&&t.set(o,n)}return t}function X5(e){let t=[],n=(o,i)=>{!Kt(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 en(e.episodes)?e.episodes:[])if(!(!Kt(o)||!en(o.scenes))){for(let i of o.scenes)if(Kt(i)){n(i.location,"location_id");for(let r of en(i.actors)?i.actors:[])n(r,"actor_id");for(let r of en(i.props)?i.props:[])n(r,"prop_id");for(let r of en(i.actions)?i.actions:[])Kt(r)&&n(r.speaker,"actor_id")}}return t}function eS(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 la(e){if(!Kt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of en(t.episodes)?t.episodes:[])if(!(!Kt(p)||!en(p.scenes)))for(let l of p.scenes){if(!Kt(l))continue;let f=en(l.actors)?l.actors.filter(Kt):[],u=new Set(f.map(h=>h.actor_id).filter(h=>typeof h=="string"));for(let h of en(l.actions)?l.actions:[])!Kt(h)||!Kt(h.speaker)||typeof h.speaker.actor_id!="string"||u.has(h.speaker.actor_id)||(f.push({actor_id:h.speaker.actor_id}),u.add(h.speaker.actor_id));l.actors=f}let n=yp(t.actors),o=yp(t.locations),i=yp(t.props),r=new Map([...n,...o,...i]),s=X5(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=(en(l.states)?l.states:[]).filter(Kt),u=new Map,h=eS(f,c.get(p)??new Map),y;if(h===null){let m=f.find(w=>w.state_id==="default");y=[{state_id:"default",state_name:m?.state_name??"default",description:m?.description??""}]}else{y=[];for(let m of f)m.state_id!=="default"&&(m.state_id===h?(u.set(m.state_id,"default"),y.unshift({state_id:"default",state_name:m.state_name,description:m.description??""})):(u.set(m.state_id,m.state_id),y.push({state_id:m.state_id,state_name:m.state_name,description:m.description??""})))}l.states=y,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 Fm=tn;function tn(e,t){e=e-0;let n=wp(),o=n[e];if(tn.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};tn.alaGPc=i,tn.IPZchV={},tn.vcGzia=!0}let r=n[0];tn.cEXTRr!==r&&(tn.IPZchV={},tn.cEXTRr=r);let s=tn.IPZchV[e];return s===void 0?(o=tn.alaGPc(o),tn.IPZchV[e]=o):o=s,o}var tS=Fm(6);async function Ym(e,t,n,o){let i=Fm;return(await e[i(4)](i(2),{system:tS,user:i(0)+t+i(3)+n,...o?{signal:o}:{}}))[i(5)][i(1)]()}function wp(){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 wp=function(){return e},wp()}var Xm={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"]}}}}}},_p={type:"array",items:{type:"object",required:["asset_id","state_id"],additionalProperties:!1,properties:{asset_id:{type:"string"},state_id:{type:["string","null"]}}}},gN={type:"object",required:["scenes"],additionalProperties:!1,properties:{scenes:{type:"array",items:{type:"object",required:["scene_id"],additionalProperties:!1,properties:{scene_id:{type:"string"},actors:{..._p,items:{type:"object",required:["actor_id","state_id"],additionalProperties:!1,properties:{actor_id:{type:"string"},state_id:{type:["string","null"]}}}},locations:{..._p,items:{type:"object",required:["location_id","state_id"],additionalProperties:!1,properties:{location_id:{type:"string"},state_id:{type:["string","null"]}}}},props:{..._p,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"]}}}}}}}}},eg={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"}}},tg={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:eg}}},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\u540C\u4E00\u573A\u540C\u4E00\u5B9E\u4F53\u53EF\u6309\u6B63\u6587\u987A\u5E8F\u5217\u51FA\u53D8\u5316\u524D\u540E\u5168\u90E8\u9020\u578B\uFF0C\u6700\u540E\u4E00\u6761\u7531\u540E\u7EED\u4E0D\u53D8\u7684\u573A\u7EE7\u627F\uFF1B\u56DE\u5FC6/\u9884\u6F14\u53CA\u8FD4\u56DE\u73B0\u5B9E\u5747\u663E\u5F0F\u6807\u72B6\u6001",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:"\u672C\u573A\u5B9E\u9645\u51FA\u73B0\u7684\u5DF2\u767B\u8BB0\u9020\u578B\u540D\uFF1B\u540C\u573A\u591A\u9879\u6309\u6B63\u6587\u5148\u540E\u6392\u5217"}}}},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"}}},nS={type:"string",enum:["actor","location","prop"]},ng={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"},qm={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"},Zm={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:ng,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"}}},Wm={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"}}},og={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:ng,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:qm,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:qm,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:nS,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:Wm,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:Zm,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:Wm,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:Zm,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"}}}}}}}},ig={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:eg}}}}};var z=nn;function nn(e,t){e=e-0;let n=xp(),o=n[e];if(nn.AowUYu===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};nn.vGSHGD=i,nn.ykrKeL={},nn.AowUYu=!0}let r=n[0];nn.qbkWqr!==r&&(nn.ykrKeL={},nn.qbkWqr=r);let s=nn.ykrKeL[e];return s===void 0?(o=nn.vGSHGD(o),nn.ykrKeL[e]=o):o=s,o}var oS=[z(37),z(84),z(100),z(83),z(39),"",z(71),z(55),z(1),z(47),z(10),z(70),z(56),z(46),z(92),z(2),z(61),z(24),z(82),z(51),z(79),z(88),z(58),z(30),z(65),z(73),z(27),z(59),z(86)][z(33)](`
|
|
236
|
-
`);function
|
|
237
|
-
`)}async function
|
|
238
|
-
`);else n+='\\"';continue}n+=r}return n}function cS(e,t){let n=z,o=r=>JSON[n(101)](r),i;try{i=o(e)}catch(r){let s=aS(e);if(s===e)throw new Pe(t+n(89)+(r instanceof Error?r[n(20)]:String(r)));try{i=o(s)}catch(c){throw new Pe(t+n(26)+(c instanceof Error?c[n(20)]:String(c)))}}if(!Array[n(13)](i))if(n(6)===n(54))_0x291b73=_0x1aa471(_0x238c2b);else throw new Pe(t+n(91)+typeof i);return i}function ni(e,t){let n=z;if(e==null)return[];if(Array[n(13)](e))return e;if(typeof e===n(9)){let o=e[n(50)]();return o?cS(o,t):[]}throw new Pe(t+n(19)+typeof e)}var dS=/[((]([^))]*)[))]?/;function xp(){let e=["u2vYAwfSrgvSDgftAgfWzuvYCM9Y","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","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","DxDQzw4","44cq5BEY55+L6k6+5A6A44cr77Yi5OIQ6iEZ5lIk5lIa5Q615l2G5BEY5BU656Ul55Qe55M76k6W77YB5BYa56+h5PE25lI656M677Yj","77Yi56M677Ym5lUo6l+z5lIa5Q615BYa5AEl5BU656Ul77Yj","zfnRChe","Bg9VA3mU","rejIDvm","C3rYAw5N","icdcTYbRAw5KpwfJDg9Yl2XVy2f0Aw9Ul3bYB3dJGii","zNjVBq","y29Kzq","AxnbCNjHEq","zxHLyW","zgvZy3jPChrPB24","ywXPyxnLCW","zw50Axr5","zMLSDgvY","oIbLEhbLy3rLzcbHCNjHEsWGz290ia","BwvZC2fNzq","zgvSDge6ihrVCc1SzxzLBcbku09oihn0CMLUzYbTDxn0igjLigfUig9IAMvJDcWGz290ia","6l+u5zUE5PYS5Q6155Qe6lwe5lQNl+MaOowEIY/LNlRMMA8GrgvSDge","Cvjbrwe","kIRMRApMLOFPH4ZMR4/KUkRLKOZLT7lNMBVORRaGy2fUB25Py2fSiowgMEAZLEs4JEwqJoEAHowqJEwTL++8JoMdVEIMGEEuQcbTzxjNzxmG5B2s6l+h5y67kIRIGjtIGjtNS7VNU5/KVjRNHACGBwvYz2vZicSGywXPyxnLCYdMIORMRApMLOFVViJLR7NNMB3OR7tOR53KURRJGihML4hNMB3MLOFMNkZVViNPH4ZNMOtOV5NKUPVLHPNMS5xNM7tMJQxMLlNLHPNMIjaGy2fUB25Py2fS44cckIRMVi/MJONMN5dKUkRLHPNMS5xVViZLROpLSlhKVjRLJ5JMIjdKUidKUkRMUlJNPRVNMOtPH43LPi3LRP7KVzpJGiiQkIdMIydKU6xMNkZMRRxMRApMLOFPH4ZLH7RNJRdNMOtMR4/KUkRKURRLKi0V56EW5zg877Ym6kAb5lMi5PYS6lQR5BcX5PIV5P+qignHBM9UAwnHBo+8JoIMGEs5IowCQcbHBgLHC2vZl21LCMDLCYdPH4ZNMBVORRdOV4FJGii","BMv3rw50AxrPzxm","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGCgfYC2uGzMfPBgvKigfMDgvYihf1B3rLlxjLCgfPCJOG","icdcTYdKVAaQkUs4JEMCGoIMGsOQ5yIx5yE65Q+p5lIa5zY66lcb5zYO5zY64Ocu4Ocu6lcb5zYO5zY657o757UF55U05O6L5lUo5Q2J5PAh77Yi5A+555M96k+06k+D5lQ644cb5PEb55M977Yj6k+777Ym5l2G5y+Q566H5RoO5yAm5A6E5l2t44cb5B2s5lIa5zcn5A2x44cb5Qch6ycG5z6l5y+y5yYw44cc","BgvUz3rO","lM5HBwu6igv4CgvJDgvKiow4UoAaGq","kIPSB29Rq2HHBMDLCYdIGjtIGjqG6ycG5z6l5y+y5yYw77Yi56Ia55Ap77Ym5y+Q5Qch5y+y5yYw5Ase77YjkIRVVjRMN5dKUkRLRP7KVzpNMOtPGkdLNOVKU47MN5dKUidLNlROTBFLJ5JKUOBVViZLSlhMOiFKUidMNAeGE3nJzw5LlcbLBNrPDhKSigXVB2T944ccC2nLBMu95y+y5yYw5y+r55sF55Qe5zY65PMVAwtVViHZy25FmdeY77Yj77YBzw50Axr5pwnHBM9UAwnHBcdLKi3VVjTSB29RpEACRowCUUwUNUMzHEwhUUEoSoEAHoMaOowEI++8Iow/HEMHU+AyR+w3SUEzU+IUSoEAHow4UoAaGEAiLIbSB29RCYdMOApKVy3LKi3VViNJGilLKiZKUidOV57NU63LNlRLHOxNOA7MNiNLJ5JLJjBML7BVViZLR7NLKiZKUiaGC2nLBMuVzw50Axr5ioAmIEATO+AwH+MHUUw6J+wiL+whUUwpMowmLUwjJEwqJUwfQoMdQoEkTUAaGE+8M+ACGowqJUs4GoADOEIHQoEKUUEMU+w8GoACRowCUUAxTUEAHoEkTUAaGE+8JowqJUE7REs4JEwpMoEAHowCUUE7P+AjV+wUG+oaGUwpMowmLUI/H+EOI+s4JUIqVEEcUEEuSEATO+AwHYbHy3rPB24G5l+D55wz77Ym5lIn5lI654Q25Ocb5y+y5yYw5OUg5zY644cc","oIbLEhbLy3rLzcbVyMPLy3q","BMfTzq","AM9PBG","C2vYAwfSx2rLBhrHx3nOyxbL","DLDbwgK","oIbLEhbLy3rLzcbUB24Tzw1WDhKGC3rYAw5N","5l2G5PIV5yMN5PYS6lwe5lQNl+MaOowEI+AGH+AZQowzQooaGUwjJEAUTEwpQUE7MEs6HUATO+AwH++8IowCUUAzR+oaGEwpSoIVJEoaGEwkQos9No+8IE+8JcOQ5RkH5PYj5lU75l2v546W5OIq55Qe5lQ654MPl+MbK+wfTY/PGkdLNOVMUixLJzuQkUkaLokaLoI1Hos6P+s4JUMaOowEI+wfQoMdQoEuSEs9Oos7JUATO+AwH+MhJoMaKoMBHUwpKEEoSooaGEMaKoMBHUE7ToAkPooaGG","C3rYAw5NAwz5","5lQ654MPignHBM9UAwnHBcdLKi3LV4xPOBVPH4FNLkJJGjdMNkZMRRxMRApMLOFJGjfZy2vUzs5Hy3rVCNmG5OIwihnWzwfRzxiG5lIT5yE6546W55Qe5y6F5PAh5AEt5zcn5OU85yAz77YB5Asw6k+T5AEt5zcn5l+D5OYb5Asw6k+T5y6F5zcn77Ym5lIn57+76k+r44cb5lIn6z+Z6k+r44cb5lIn5Ps55OIq5lIT5PAh5zcn44cc56EW6lct44cb566a56EW5zkm6k+r5zcn5y+Q5Ps+igfSAwfZzxmG5OIwig1LCMDLC++8Jos4JEIdVEwpLUs7O+w3SUE7J+whUUEoSoEAHowoN+AwH+wfQowqJEoaGG","Bg9JyxrPB24","DMTquwi","Bg9VA3m","lMrLzMf1BhrmB29R","zw1PDf9KzwX0yq","z2vUzxjHDgvuB29S","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","icdcTYaQkUwqJos4Gos4QUwUNUs9K+wpQUEzU+IUSos4GoADOE+8JoE7NEs4JEAlHUAiKowKMUADOsOQ44cckIRKUi3LKiZNMOtOP5lOIBlNU53KUi3KUPlNM7JLIjFKUlRLIkVLKi0QkUkaLokaLowtQUAaLEwfS+EZU+wVHUwiH+oaGEw4UowqJoAHHU+8MUwKP+EjMYdLKOWG5lI55Bc8WRFLHyVNVzFMLQ8G5PIV5lIK5lIQ5lQ677Ym5yIR5OQk5lI55Bc855Qe5zcn5A2x5yAz6l+B5AsN54MB55QeigfSAwfZzxpVViZLJ43KUyVKUQBNHlBJGilLIktMJA7VVjPHBgLHC2vZiowpQUAuVIOQ5zcm5lIa5lIQ5lQ6l+EjQsOQ55Qe5lIn5zcm5y+R5Rov77Ym5lIn5Ps+5y+M5lIa5lIQ6kEs6iMY44cc","ELDur28","Aw5WDxq","DhjPBq","icaQkUwKJEEuQos8MowfIokaLokaLoMaOowEI+M7MoIUPos7JUoaKow3SUEFPEIUVUwUMUoaKEMhJoIVPEwUNUs9K+w3SUwiL+whUUEAHoMaOowEI+A4HEwnLEMhJoMaIEs4Gos4QU+8JoMaKowTL+EfP+AkHoMcO+s4QUw3SUACIEMaOowEI+wqJsOQ44cc6zMK6z2E5PYS5Q615Asw6kEc5lIo5OMa5PYj5BEY5PYj6ycG5z6l6yo95PYj5A6E6lsO5BEU5BYc77Yi5O2I5lQg5Pw05Awx6kgJ5PYnl+wjP+AdHEAyJUEHRUEAHoIcPowgTEoaGEIdLUEyPUoaGEw5ToM+HoAiLUw9OUAaGEMyTUAUTEAuUEwpMc/LNlRMMA/OOQVMR4eV6ygt5yw35PIo5PI+5Ps55B2I77Yj77Ym5OMn5PAW5BYa5lIa5P2H6ycG5z6l44cc5lIn6kAb5zUG5lI65PYS5Q615y6F5PAh55sO6k+n5lIn5zcm5BcX5y+M6ycG6l+r5lMj5PAW5zcn4Ocu4Ocu5BEY55+L6k6+5A6A6yEm5BEY5PYj44co6BUr6iMY6l+E5BI95y2R6kgJ44cp77Ym5PYS5Q615y+i6kEb6BUr6iMY5y2R6kgJ77Ym54wN5OQe44co6BUr6iMY6l+E5BI95y2R6kgJ44cp5y2Z5y+V77YB5zcm5lMj5O2I5zcn5y+Q5lYA5OQk5zcm5lIa5Awx6kgJ5PYn5OUg5OIq5AsA5BYG5zU+44cc5Asn55sO5yMn5zcm5PE25Qc45A+56kgJ552a5lIo5yMN5Oof5Asw6lkm6zI25Q6177YB5zcm5zcnigrLC2nYAxb0Aw9UioEAHoIHPEwfHEwpQUEuQos6JUwqJos4GoMyTUAUTE+8Jos4JEIdVEAkIUAwSoMyTUAUTEwiL+s4UUAxP+MyTUAUTEEAHcbHBgLHCYdMIjBOPOBNM5BML6FMJ4/OV7dJGilKURRNIANOUQVKU73LKiJLUBBKUz/KUi3NRyNKUO7LHBBLKitPMlBMRRxPGkdLNOVLKiJLUBBJGii","A2LUza","zgvSDge6ihrVCc1SzxzLBcbku09oihn0CMLUzYbMywLSzwqGDg8GCgfYC2u6ia","svbTEfO","icdcTYbUyw1Lid0G57QVignHBM9UAwnHBcdLKi3VViWQkUE7NEs4JEwqQ+AlRowpTY/MLPZMNAaV6k+r5zcn5As55RoOl+wVUEEzVEAGH+IUScOQ77Yi5lIn6kAbig5HBwu944cotwfYy3vZifzHBgxVViJPQAZLUPpMLQ/cT+E7TowWLo+8IEoaJ+AiLUoaJK1HCMn1CYbwywXL77Ym6A2c6k+T44cp77Ym6icm5PIVig5HBwu944cotwfYy3vZifzHBgxJGi/VViNJGilKURRLKi3PH4FNLkJMRApMLOFPH4ZLH7RNJRdNMOtLJP/MLOFLROZMLBtLP5pLKi3MI7ZLHPNVViHGrw1PBhKGq29SzwaG5lIn5B6x5Ps55OIqigdOIB7NSBpKUl3cT+ENKEwWLgdVVjVJGi7OI4/OI6xPM6RJGi/KUi3NVkNMIjdJGi7OI6xPM6RJGi/VViNJGii","icdcTYbKzwzHDwX0tg9VAZ3LRP7KVzpPPPBMRkhNMBVORRdML7BLV4xLOAVNMOqQkUM7MoIUPoMaOowEIYOQ77YABMfTzsdLM7RLRPRLHPNJGi7LUlJMGihJGi/VVjTKzxnJCMLWDgLVBIdLHPNLJ6/NM7tMJQxNLkJKUO7OP4BOP4NLPi3NJRdNMOtLPjBOSOZJGihMNi3PPBdJGihMNzdOTkJJGihPOPZOIBlJGihLUipMMA/MIjBLVAlLIlBVViZPNz7NQBRJGilKURRNIANOUQVKU73KUi7LHBpNS7VKUi3OG73MI7/MNAxLHyxLVzpPGkdLNOVMJ4/OV7dJGilLJ6RMJ4/OV7dPPPBMRkhLRP7PMyxLH7RNJRdNMOtPMlBMRRxVViZNU4JMGihMIjBPOOtMVjtKUi3OPOBNM5BLIj3LP4VLPjBOSOZVVjVPU5JORQtPGkdLNOVLKi3NP7dKUi3KU6pOOAJLHAJLIAFKUi3LJ5JJGilKVjJLHyJPH4FNLkJLJP/MLOFMMi7NOA7MJ4/LHPNVVjVLJP/MLOFKV6hMGA/KUi3OTRpML7BVViZNU5pLKiJLRP7KVzpOUQVKU73KUi7LKiZLNlROP4BOP4NKV6hMGA/OOAxMIjdMNidNROdJGihNQlpLRPRJGihLJ6/NLlVNMOtLUlJMGihPGkdLNOVJGii","BwvYz2vZ","icbKzxnJCMLWDgLVBJ3OV5NLPzFLPjBOP4lPLB/KU4dKUyJMOlFNMOtKUidLJ6xOR53VViJKVjJLHyJNLkJLJP/MLOFMJ4/LHPNVVjRMNi3PPBaV6AkC6iMYl+wpKEwEIY/PHy3PPBdVViZMIjBLNlRMMA/LUipMMA8V6ygt5yw35B2I5yI277Yj44cckIRLUlJMGieGzgvZy3jPChrPB24G5lIn6io955wz56M644cckIOG556S5PE25B+d5Oof44cb5AE/5Ocb5lIo5yQO5l2C55wz5zYO5Q2J5PAh77YB5yMN5Oof5PIo56gU5lIu6zYa6kAb54US56Ul5Asn546W55Qe56wB55Ey44cb5yEp6yEn44cb6kgW6icb44cb5lYK5yQ/5OIw5y+y6lQR5BgE5lQo6ycG5z6l44cc5zcm5lIa6kgJ5PYn6lEO5Asw6lkm6zI25Q615lMF6kAb5yIg5yIR55M76k6W77Ym5yAz5RIf5y+V6kEb5BEU5BYc77YB57Ui5Ocb5Asw6lkm5lIn6io96kAg55Uw5PEP5PYF54Q25Ocb5OIw5ywO5Bga6lQR5lU95O+p6l+W44cc","C3vIrxzLBNrZ77YA5PYS5Q615ywZ6zsU5yMN5Oof5y6F5A2q77Ym5Q+p5P2H5lIa5y+L6k+D77Yi57U05OQK5yMN5Oof55cg6kEJ5lIo5y6l57YP77Yj44cc","ywn0B3i","icdcTYaQkUwCSoEcUEwqJoAGT+IMGsbTzxjNzEkaLokaLowiPoAnRUs4GoAGT++8MUAyR+s4JEAyR+wqJos4Gos4QUwCUIOQ44cc5zcm5lIa5lIQ5zYW5PA555Qe5lIn5zcm5yAz5Rov6kAb5zci5OIq5lIa5P2H77YA4PgG5A2x6z2I5y+y5l2t77Yi44co6l2M6l2U5PEb44cp44co55+/6l2M6l2M6l2U5PEb44cp44co55+/6l2M6l2M6l2U44cp5PIV5zcm5lIa5Ase77YB5BIM5lIn5BIM5BMZ5y+Wl+wmUUwFN+wjJEE8GowMGUoaJKrHD25MywXSie9UBgLUzsaTioAJUUACQoMtUUoaJZ3JGi7MO7RMNkJPK7RJGi/VViNVVjVIKAhLIAFMG4xNOA7LRPRLKiZKUidLPitVViJLKiZKUidLNlRMIi/LNkJLKiZKUidNQBRPL7tLJ5hNLj/VViNJGiiQkUs4JEAyR+wqJos4Gos4QUwCUUwWSEwqHoIhQUElRoERIYOQ77Yi55+/6l2O5l+U6ycG6zo6iowsJcdMO7RMNkJPK7OG5PIV5lIK5lIQ5zYW5PA577Ym5lIn5zci77Yj44cc5yIR5zUG5lI65yAz5Rov5BIM5lQg6zw/5yMn57Ya5BcX5B2t5OIq5PAW5zYW54k544cc","AgfZ","BwfW","Aw5KzxG","icdcTYaQkUwpQUAGH+MaOowEI+ECN+EAHoAuUEwpMoEAHoMcO+s4GowCUIOQ77Yi5O2I6kofl+wpMoI6QY/LJ5FMJz8V5zUE5B2s5PEL5BI477Yj44cc5l6l77YA5AsN6AQO5As05zYOihnJBL8WntaG5y+y6lQR54sW5PYV5BIiiokgKIb7C2nLBMu6C2nUxZa1mcWGzw50Axr5oUwKP+MQQowKTcWGBg9VAZRNHldMNk/LUiJMGif977YB5zco6z2I6iUL5O2I5zUE5BI45Ocb77Ym5zYO6ykJ5lIa5zY65yAn5QchihSUlI4SigXVB2S65BI45OcbFEoaGG","44cq5PYS5Q615Q2J5PAh44cr77Yi5y+V6io95zcR5AsA6zUg77Ym5Q+p6zUg5lULigaJigvWx05otMaG5BYa5As077Yj","txHkALe","BMv3rw50AxrPzxmUywXPyxnLCW","Aw5Nzxn0lMvWAxnVzguTyxnZzxrZ","icdcTYbKzxnJCMLWDgLVBJ3KUidLJ6xOR53OR7tMMi4QkUI/MEs4QUwUNUs9K+ACRoI6Q+AyR+IWGsaVios7Gos5IoI6Q+s7VsaVios7Gos5Ios4NoILVYOQ77Ym6z2E56M644cc5lQ654MP5y+Q5yAz6lQR5lU944cb6kEs6iMY44cb5ywZ57o777Ym5lIn5yAz5PYn6kof6ycG5z6l77YB57UD5lIn5yAz5A6d5OMa5Ase55Qe5zY65PMVic8G546V5Akdic8G5zYW54k5ic8G5B2t5PE25zYO5y+r55sF5lUa5lMi44cc5y6F5PAh5PYj6lQR5lU95l+H5OgV5BcX54wN5OQeic8G5QAc5OUS77YB5y6F5PAh5RkH5yAz5BcX5O2U5y+W6k+nic8G56EW5zg8ic8G5OIp5lU96kgL5lIa5y+L5PYa566a6lQR5lU977Yi5AAc44co6iUp5A625lIT6zE05lQ644cp44co5OcL6k+k5OQK5AoR44cp44co6lw16zw/5RkZ55Qe5OMl5lIl44cp77Yj44cc5zY65PMV5yAz56M66zE055sO6ycu77YB6ygt5yw35yAz54MP5lU255sO6ycu44cc","kIPUzxDfBNrPDgLLCYdIGjtIGjqG5PYS5Q6144cq5BEY55+L6k6+5A6A44cr6yEm6l+y5RkH5PYj55Qe5A6E5l2t77Ym5Q+p5lIQ55M76k6W5lIa5P2HkIRVVjO","t2zerKm","icdcTYdMSQhLJ5JLJjBNMOtLNlOQkUs4JEEuQoAGHYOQ4Ocu4Ocu57o757UF6iEQ5yQO5Rk/55sO5lIk5lIa5QYH55Qe6ycG5z6l5lIa55U05yIW5lIl5lIa5QYH5y+y5yYw44cc6AAw5QYH5yE6546W6BUy6k6K5BI45Ocb77Ym5lMF5lIn55sO54M55Osp5Qch44cc6l+B5ywL5zUE5B+g44cb5BM75OoZ5OIw57o757UF6Ake5RYu5PE25OYj5yw25A6E6zMf6zI25Q615PI+5BYp6ycj6ycG5z6l77Ym5zUE5yIW546W5A6E5zco5PI+5BYp5OgI5Asn546W5A6E6zI25Q6177Ym5lIn6io95Bcg6Ake5RYu57Ui5Ocb5Rk/55sO5yIW546W5A6E44cc5Asw6lkm5OM/5OUf5yMN5Oof5zUG5P6C5PE277Ym5ywi5A+554wN5Q2J5PAh5Qoa5P+L5yID5AEl44cb5Q+p5QYH5y+y5yYw5yMn5zco5zkm5zUE5B+g77Ym5yAn5O+q5lQKierLBhrH77YB5lIn5Qc55O2U5ywO5yMN5QAc6l+W54YC5PYQ5yE6546W55Qe5y+y5yYw44cc","ALntAxe","zgvMyxvSDeXVB2S","ChvZAa","DgvZDa","B2jQzwn0","icdPU5JORQtPGkdLNOVLJ6RLHPNLNkGGBMv3rw50AxrPzxmUzgvMyxvSDeXVB2VVViZKUi3OPOhLNkGGBg9VA3mG6yEm6yEn5Asn77YBBg9VA3mG5y+Q55M76k6W5O2I6kof44cb5yMN5Oof5Asw6lkm6zI25Q615y+y5yYw44cb5zY65PMV6kkR5Q+b44cb6ygt5yw356c05O2Fl+wpKEwfIEETIEMINEwKLUMaOowEI+oaGUs6UUEjQt3MLBtKVzpMIA7NM7JVVjVLNlRMMA89546V5Akd5Asw6kEc77YB6ygt5yw3pEEjQEs7TUwKLUINGUoaGG","Aw50BW","BMv3rw50AxrPzxmU","Bg9VA3pVVjRPU5JORQtPGkdLNOVKUyVLPjBJGihPNidOPOhLJzxNI6ZLPi3NJRdNMOtMLRdLOP7PGkdLNOVJGijLBNrPDhK95A6E5l2tignHBM9UAwnHBcdLKi3VVjTUyw1LpEMaOowEI+wqJE+8M2fSAwfZzxm95zcm5lMj6ycG5z6l5zcn77YBzgvZy3jPChrPB2496l+z5Awx5Asw6kEc5lIa5y+L6k+D44cc","5AEl57Ui5l2/55sO44cq5BEY55+L6k6+5A6A44cr6yEm55Qe5PEI5PYjignHBM9UAwnHBcdLKi3LRzFVVjVLKiZKUidKUkRKURRLHAJLIAFKV53MJihLKiZKUidLKi3LRzFJGii","57Ut5zci44cq5BEY55+L6k6+5A6A44cr77Yi5yIW55UU5yMn5lI65Q2I5l2G5BEY5BU656Ul55Qe55M76k6W77Yj5lIo44cq5PYS5Q615Q2J5PAh44cr77Ym6lcd55sOigbLBwL0x2rLBhrHycdLT6xLHBFOV5tLM57KUidKUkRNU5pMNOtLJjBLR7NOSAhOPOBNM5BOV5NKUidMLBtMRRxNMOtMIydMNiNLHRpNRzBJGilNQBRMLBdNU4tLSlhKVkaGyfTDyooaGG","Bg9VA0nOyw5Nzxm","C3vTBwfYEE+8MUACRoAUTEs4GowpPEIVNEAIL+AMGU+8M+IlPEACRoAUTEwqQ+wKMUMBHU+8JoAMGUAlRos4UUAvToAUTEs4GowpPEIVNEoaGG","C2nLBMu","icdPGkdLNOVLKi096zYa6kAb576o5PYV5y2v54US55s75lIa5BYG5zU+55Qe5Asw6kEc5QgJ5l2n77Yi5BI45Ocb44cb5AMA5PYn44cb6kw/6kof44cb6B6z5B2I77YB5zY65PMV55QeioEzVEwKQs/LPjZMMzOV6kkR5Q+b77YB6ygt5yw355QeioEGToAnNY/LJ5hLHyNVViNJGiiQkUMaOowEI+wqJEw/HEMHU+EuQos4REAwHYOQ77YA5Q2J5PAh6yEm55Qe6iUX5PAh5lIt5zcn77Yi5Awx6kofl+IbJos4MI/LVAlMGihLKi3VViZLPOiGu2vHBIDZifjLDMvUz2xJGifgBgfTzwnHC3rLCUoaGuDYyxzLifbYAwvZDooaGvnOAwvSzgD1yxjK77Yj5lIa5B6l6k+r5OIq5lIT5PAh5yAn5l2C6ycG5z6l5zcn77Yi6ikw5OgP55Qe5Asn5lUh5Awx6kof44cb54sW5PYV5BIi44cb5Akt56wT5y+444cb55U+5y2R77Yj44cc","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGCgfYC2uGzMfPBgvKoIa","lM5HBwu","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGz290ia","icdcTYdLT7lNMBVORRdOV4FNMOtLRP7KVzpKUi3OPOhPH43LPi3NMBVORRdVVjVOI6xLROpOV5NMRRxMNiNKUOBMLRdLJ6VMS5xVViZNLkGGBwvYz2vZioIHPE+8Jos4JEEuQowCQcbUzxDfBNrPDgLLCYdLHO3LIjFKUidPGy3JGii","lMrLC2nYAxb0Aw9U","Bg9VA3mUywXPyxnLCW","DgPUuMy","C3vIrxzLBNrZ","C3vTBwfYEq","C2XPy2u","ChjVCa","kIRJGjdMNkZMRRxMRApMLOFJGjhLJ6/OG73LJixLKkVOI6xLUBlPM4yQkU+8IoAVJ+MBHUs7PsbGiYbLCf9otK5Giow8GowKTo+8IE+8M+AkIUwUG+s7Row9K+s9NoI/NUE7REAoQoI/M+EAHos4GoAUTEAvTos9K+wKHoEqHU+8JoI3QoMBHUAYV+EuQowqJos4GcbJyw5VBMLJywWG5zcn5A2x44cc","CgfYC2u","C3bSAxq","Bg9VAW"];return xp=function(){return e},xp()}function Ep(e){let t=z,n=Hn(e),o=dS[t(14)](n);if(!o)return{name:n,aliases:[]};let i=n[t(98)](0,o[t(64)])[t(50)]();if(!i)return{name:n,aliases:[]};let r=(o[1]??"")[t(102)](/[//,,、;;]/)[t(63)](s=>s[t(50)]())[t(18)](Boolean);return{name:i,aliases:r}}var oi=e=>Ep(Hn(e))[z(32)];function pS(e){let t=z;if(ii(e))return e;if(typeof e===t(9))if(t(74)!==t(72)){let n=e[t(50)]();if(!n)return null;let o;try{t(41)!==t(8)?o=JSON[t(101)](n):_0x2b8a69+='\\"'}catch(i){throw t(23)!==t(23)?new _0x35d905(t(21)+typeof _0x315295):new Pe(t(53)+(i instanceof Error?i[t(20)]:String(i)))}if(!ii(o)){if(t(3)===t(3))throw new Pe(t(21)+typeof o);{let i=_0x2bdcc7(_0x2ac405);if(i===_0x1e5cf5)throw new _0x4316f0(_0x174809+t(89)+(_0x4121a6 instanceof _0x360b19?_0x4fe8c8[t(20)]:_0x4a58de(_0x51367b)));try{_0x35ac52=_0x593204(i)}catch(r){throw new _0x445300(_0x1d355a+t(26)+(r instanceof _0xcc0770?r[t(20)]:_0x4eee3d(r)))}}}return o}else _0x2ddf79+=_0x1d0308,_0x1ed397=!1;return null}function Br(e){let t=z,n=Vm(),o=pS(e);if(!o)return n;for(let i of ni(o[t(25)],t(25))){if(!ii(i))continue;let r=Hn(i[t(52)]),{name:s,aliases:c}=Ep(Hn(i[t(32)]));if(!rS[t(62)](r)||!s)continue;let a=ua(i[t(15)],t(81)+s+t(93)),d=sS(i[t(75)],t(81)+s+t(43)),p=[...c];for(let f of ni(i[t(16)],t(68))){let{name:u,aliases:h}=Ep(Hn(f));u&&p[t(76)](u),p[t(76)](...h)}let l=[...new Set(p[t(18)](f=>f&&f!==s))];n[t(25)][t(76)]({name:s,kind:r,description:a,aliases:l,defaultLook:d})}for(let i of ni(o[t(57)],t(57))){if(!ii(i))continue;let r=oi(i[t(11)]),s=oi(i[t(80)]);r&&s&&r!==s&&n[t(57)][t(76)]({from:r,into:s})}for(let i of ni(o[t(42)],t(42))){if(t(95)!==t(95))throw new _0x2df008(_0x519dc7+t(26)+(_0x40bcf4 instanceof _0x3611af?_0x4f83a8[t(20)]:_0x281cd0(_0x1f7db9)));{if(!ii(i))continue;let r=oi(i[t(17)]),s=oi(i[t(32)]);if(!r||!s)continue;let c=[s,...ni(i[t(16)],t(94))[t(63)](oi)[t(18)](Boolean)];n[t(42)][t(76)]({entity:r,names:c,description:ua(i[t(15)],t(7)+r+"."+s+t(93))})}}for(let i of ni(o[t(85)],t(85))){if(!ii(i))continue;let r=Hn(i[t(87)]),s=oi(i[t(17)]),c=oi(i[t(103)]);r&&s&&c&&n[t(85)][t(76)]({scene:r,entity:s,look:c})}return n[t(96)]=ni(o[t(96)],t(96))[t(63)](Hn)[t(18)](Boolean),n[t(97)]=Hn(o[t(97)]),n}var Ye=on,lS=[Ye(1),Ye(29),Ye(18),Ye(32),Ye(0),Ye(7),Ye(15),Ye(8),Ye(3)][Ye(21)](`
|
|
239
|
-
`);function
|
|
227
|
+
`);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 Um=["episode","scene","action","dialogue","inner_thought","transition","note"];var v5={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 xo(e){if(typeof e!="string")return;let t=e.normalize("NFC").replace(/\s+/g,"").trim().toLocaleLowerCase();return v5[t]}var he=class extends Error{constructor(n,o){super(`line ${o}: ${n}`);this.line=o}line};function Ki(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function qt(e,t,n){for(let o of Object.keys(e))if(!t.includes(o))throw new he(`unknown field '${o}'`,n)}function R5(e,t){if(!Ki(e))throw new he("missing source",t);qt(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 he("source needs integer chunk/line_start/line_end",t);if(o>=i)throw new he("source line_start must be < line_end",t);return{chunk:n,line_start:o,line_end:i}}function Bi(e,t,n){let o=e[t];if(typeof o!="string"||o==="")throw new he(`'${t}' must be a non-empty string`,n);return o}function Eo(e,t,n){if(!(t in e)||e[t]===void 0)return;let o=e[t];if(typeof o!="string"||o==="")throw new he(`'${t}' must be a non-empty string`,n);return o}function Cm(e,t,n){if(!Array.isArray(e))throw new he(`'${t}' must be an array`,n);return e.map(o=>{if(!Ki(o))throw new he(`'${t}' entries must be objects`,n);qt(o,["name","state"],n);let i={name:Bi(o,"name",n)},r=Eo(o,"state",n);return r!==void 0&&(i.state=r),i})}function M5(e,t){if(!Ki(e))throw new he("dialogue/inner_thought needs a speaker",t);if("kind"in e){qt(e,["kind","label"],t);let r=e.kind;if(typeof r!="string"||!Mn.includes(r))throw new he(`speaker.kind must be one of ${Mn.join("|")}`,t);let s={kind:r},c=Eo(e,"label",t);return c!==void 0&&(s.label=c),s}qt(e,["name","state"],t);let n=Bi(e,"name",t);if(!/[\p{L}\p{N}]/u.test(n))throw new he("speaker.name must contain a letter or number",t);let o={name:n},i=Eo(e,"state",t);return i!==void 0&&(o.state=i),o}function L5(e,t){let n=e.kind;if(typeof n!="string"||!Um.includes(n))throw new he(`unknown or missing kind '${String(n)}'`,t);let o=R5(e.source,t);switch(n){case"episode":{qt(e,["kind","episode","title","source"],t);let i=e.episode;if(typeof i!="number"||!Number.isInteger(i))throw new he("episode must be an integer",t);let r={kind:n,episode:i,source:o},s=Eo(e,"title",t);return s!==void 0&&(r.title=s),r}case"scene":{qt(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 he("scene must be an integer",t);i.scene=e.scene}if("environment"in e&&e.environment!==void 0){if(!Ki(e.environment))throw new he("environment must be an object",t);qt(e.environment,["space","time"],t);let r={},s=Eo(e.environment,"space",t);s!==void 0&&(r.space=s);let c=Eo(e.environment,"time",t);if(c!==void 0){let a=xo(c);if(!a)throw new he("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(!Ki(e.location))throw new he("location must be an object",t);qt(e.location,["name","state"],t);let r={name:Bi(e.location,"name",t)},s=Eo(e.location,"state",t);s!==void 0&&(r.state=s),i.location=r}return"actors"in e&&e.actors!==void 0&&(i.actors=Cm(e.actors,"actors",t)),"props"in e&&e.props!==void 0&&(i.props=Cm(e.props,"props",t)),i}case"action":case"transition":{qt(e,["kind","content","source"],t);let i=Bi(e,"content",t);return{kind:n,content:i,source:o}}case"dialogue":case"inner_thought":{qt(e,["kind","speaker","content","emotion","source"],t);let i=Bi(e,"content",t),r=M5(e.speaker,t),s={kind:n,speaker:r,content:i,source:o},c=Eo(e,"emotion",t);return c!==void 0&&(s.emotion=c),s}case"note":{qt(e,["kind","content","category","source"],t);let i=Bi(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 he("note.category must be author_note|format_note|unclassified",t);r.category=s}return r}default:throw new he(`unhandled kind '${n}'`,t)}}function Gr(e,t=0){let n=[],o=e.split(`
|
|
228
|
+
`);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 he("invalid JSON",i+1+t)}if(!Ki(s))throw new he("record must be a JSON object",i+1+t);n.push(L5(s,i+1+t))}return n}var X=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),ei=e=>{let t=/[((]/.exec(e);return!t||t.index===0?e:e.slice(0,t.index).trim()},N5=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,dp=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,$m=()=>({newEntities:[],merges:[],looks:[],lookChanges:[],subEvents:[],summary:""}),Dm=()=>({entities:[],lookChanges:{},recent:[],synopsis:[]}),pp={recentEpisodes:6,synopsisChars:3500,arcFold:10},U5=1e4;function Gm(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 Jm(e,t=U5){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 C5={actor:"\u4EBA\u7269",location:"\u573A\u666F",prop:"\u9053\u5177"};function Gt(e,t){let n=X(t);return e.entities.find(o=>X(o.canonical)===n||o.aliases.some(i=>X(i)===n))}var Pm=(e,t)=>{X(t)!==X(e.canonical)&&!e.aliases.some(n=>X(n)===X(t))&&e.aliases.push(t)},P5=["\u5E74\u8F7B","\u5E74\u8001","\u5E74\u5E7C","\u5E74\u5C11","\u4E2D\u5E74","\u9752\u5E74","\u5C11\u5E74","\u8001\u5E74","\u5E7C\u5E74","\u8001","\u5C0F","\u5927","\u5C11","\u5E7C"];function T5(e,t){let n=X(e),o=X(t);if(n===o||!n.includes(o))return!1;let i=n.replace(o,"").trim();return i.length>0&&!P5.some(r=>i===r||i.startsWith(r))}function V5(e){let t=e.filter(n=>e.some(o=>o!==n&&T5(n,o)));return t.length?t.reduce((n,o)=>o.length>n.length?o:n):e[0]}var Tm=["\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"],$5=["\u4F17\u4EBA","\u7FA4\u4F17","\u6C11\u4F17","\u89C2\u4F17","\u4EBA\u7FA4","\u4EBA\u4EEC","\u5927\u5BB6","\u767E\u59D3","\u5B98\u5175"],D5=/^(?:一群|一众|全体|所有|几名|数名|多名|[0-9零一二两三四五六七八九十百千]+名?)/;function rt(e){let t=X(e).replace(/[0-9零一二两三四五六七八九十百千]+名?$/,"").trim();return t?t.endsWith("\u4EEC")||Tm.includes(t)||$5.some(n=>t.endsWith(n))?!0:D5.test(t)&&Tm.some(n=>t.endsWith(n)):!1}function So(e,t){let n=ei(t);return Gt(e,n)?.canonical??n}function G5(e,t){let n=X(t);return e.looks.find(o=>X(o.name)===n||o.aliases.some(i=>X(i)===n))?.name??t}var J5=["\u5E38\u6001","\u65E5\u5E38","\u5E73\u65F6","\u57FA\u7840","\u666E\u901A"];function lp(e){if(e.looks.length!==0)return(e.looks.find(t=>J5.some(n=>t.name.includes(n)))??e.looks[0]).name}function cp(e,t,n,o){let i=X(ei(n));if(i)return e.entities.find(r=>r.kind===t&&r!==o&&(X(r.canonical)===i||r.aliases.some(s=>X(s)===i)))}function Vm(e){let t=[e.canonical,...e.aliases],n=V5(t);X(n)!==X(e.canonical)&&(e.canonical=n,e.aliases=t.filter(o=>X(o)!==X(n)))}function Jr(e,t,n,o=n){for(let r of t.newEntities){let s=ei(r.name);if(!s)continue;let c=cp(e,r.kind,s);if(!c){let d=[];for(let p of r.aliases){let l=ei(p);l&&X(l)!==X(s)&&!cp(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=ei(d);p&&!cp(e,r.kind,p,c)&&Pm(c,p)}!c.description&&r.description&&(c.description=r.description);let a=c.looks.find(d=>X(d.name)===X(r.defaultLook.name));a?a.description=r.defaultLook.description:c.looks.unshift({name:r.defaultLook.name,aliases:[],description:r.defaultLook.description}),Vm(c)}for(let{from:r,into:s}of t.merges){let c=ei(s);if(!c)continue;let a=Gt(e,c);if(!a)continue;let d=ei(r);!d||X(d)===X(a.canonical)||Gt(e,d)||(Pm(a,d),Vm(a))}for(let{entity:r,names:s,description:c}of t.looks){let a=Gt(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=>X(f.name)===X(p)||d.some(u=>f.aliases.some(h=>X(h)===X(u))));if(l){c&&(l.description=c);for(let f of d)X(f)!==X(l.name)&&!l.aliases.some(u=>X(u)===X(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=So(e,r.entity),a=r.look.trim();if(!s||!c||!a)continue;let d=Gt(e,c),p=d?G5(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=Gt(e,r);s&&(s.lastSeen=o)}return e.recent.push({startEp:n,endEp:o,summary:t.summary,subEvents:t.subEvents}),e}var B5=e=>e.summary.length+e.subEvents.reduce((t,n)=>t+n.length,0);function Bm(e,t=pp){for(;e.recent.length>t.recentEpisodes||e.recent.length>1&&e.recent.reduce((n,o)=>n+B5(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 up(e,t=pp){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 Km(e,t,n=pp){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 K5=6;function aa(e,t){let n=i=>t===void 0||i.lastSeen>=t-K5,o=["# \u8BBE\u5B9A"];for(let i of["actor","location","prop"]){let r=e.entities.filter(s=>s.kind===i);if(r.length){o.push(`## ${C5[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(`- ${dp(i)}\uFF1A${i.line}`)}if(e.recent.length){o.push("","# \u6700\u8FD1");for(let i of e.recent){o.push(`## ${N5(i)}`),i.summary.trim()&&o.push(`\u6897\u6982\uFF1A${i.summary.trim()}`);for(let r of i.subEvents)o.push(`- ${r}`)}}return o.join(`
|
|
229
|
+
`)}var j5=/(?:^|[,。!?;:、\s“”"'((])(他们|她们|它们|其中一人|另一个人|前者|后者|对方|有人|两人|他|她|它)(?!人)/;function ji(e){let t=[],n=(o,i,r)=>{t.push({code:o,path:i,message:r})};return e.actors.forEach((o,i)=>{rt(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=j5.exec(a.content);l&&n("production_action_pronoun",`${p}.content`,`action uses ambiguous reference ${l[1]}`)}})})}),t}var Fe=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ct=e=>Array.isArray(e),ca=e=>String(e).padStart(3,"0"),fp=[{key:"actors",idField:"actor_id",prefix:"act"},{key:"locations",idField:"location_id",prefix:"loc"},{key:"props",idField:"prop_id",prefix:"prp"}];function da(e){if(!Fe(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 ct(t.episodes)?t.episodes:[])if(!(!Fe(a)||!ct(a.scenes))){for(let d of a.scenes)if(Fe(d)){Fe(d.location)&&r("locations",d.location.location_id);for(let p of ct(d.actors)?d.actors:[])Fe(p)&&r("actors",p.actor_id);for(let p of ct(d.props)?d.props:[])Fe(p)&&r("props",p.prop_id);for(let p of ct(d.actions)?d.actions:[])Fe(p)&&Fe(p.speaker)&&r("actors",p.speaker.actor_id)}}for(let{key:a,idField:d}of fp)for(let p of ct(t[a])?t[a]:[])Fe(p)&&r(a,p[d]);for(let{key:a,prefix:d}of fp)o[a].forEach((p,l)=>{n[a][p]=`${d}_${ca(l+1)}`});for(let{key:a,idField:d}of fp){let p=(ct(t[a])?t[a]:[]).filter(Fe),l=n[a],f=new Map;for(let u of p){let h=u[d],y=l[h]??h;u[d]=y;let m=0;for(let w of ct(u.states)?u.states:[]){if(!Fe(w)||typeof w.state_id!="string"||w.state_id==="default")continue;let g=`st_${ca(++m)}`;n.states[w.state_id]=g,w.state_id=g}f.set(y,u)}t[a]=[...f.entries()].sort((u,h)=>u[0]<h[0]?-1:1).map(u=>u[1])}let s=0;(ct(t.episodes)?t.episodes:[]).forEach((a,d)=>{if(Fe(a)){if(typeof a.episode_id=="string"){let p=`ep_${ca(d+1)}`;n.episodes[a.episode_id]=p,a.episode_id=p}for(let p of ct(a.scenes)?a.scenes:[])if(Fe(p)&&typeof p.scene_id=="string"){let l=`scn_${ca(++s)}`;n.scenes[p.scene_id]=l,p.scene_id=l}}});let c=(a,d,p)=>{!Fe(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 ct(t.episodes)?t.episodes:[])if(!(!Fe(a)||!ct(a.scenes))){for(let d of a.scenes)if(Fe(d)){c(d.location,"location_id","locations");for(let p of ct(d.actors)?d.actors:[])c(p,"actor_id","actors");for(let p of ct(d.props)?d.props:[])c(p,"prop_id","props");for(let p of ct(d.actions)?d.actions:[])Fe(p)&&c(p.speaker,"actor_id","actors")}}return{script:t,idMap:n}}import{createHash as z5}from"node:crypto";function Br(e){let t=v(e).trim();if(!t.includes(":"))throw new S("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(!Cl.has(o)||!i)throw new S("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 Io(){return{version:3,actor:{},location:{},prop:{},state:{},episode:{},scene:{},action:{}}}function Jt(e,t){let n=e.get(t);if(n===void 0)throw new Error(`Missing mapped ID for ${t}`);return n}function zi(e,t=Io(),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=(I,M,T,P)=>{let R=T[M];if(R!==void 0){if(!V(I,R))throw new Error(`Invalid persisted ${I} ID for ${M}: ${R}`);if(P.has(R))throw new Error(`Duplicate persisted ${I} ID: ${R}`);return P.add(R),R}let j=To(I,P);return P.add(j),T[M]=j,j},c=(I,M)=>n[I]?.[M]??M;for(let I of e.actors){let M=s("actor",c("actor",I.actor_id),o.actor,r.actor);i.actor.set(I.actor_id,M)}for(let I of e.locations){let M=s("location",c("location",I.location_id),o.location,r.location);i.location.set(I.location_id,M)}for(let I of e.props){let M=s("prop",c("prop",I.prop_id),o.prop,r.prop);i.prop.set(I.prop_id,M)}let a=new Map,d=(I,M,T)=>{let P=new Map,R=new Set,j=c(I,M),W=o.state[j]??{};o.state[j]=W;let Pe=T.map(ue=>{let K;if(ue.state_id==="default")K="default";else{let St=n.state?.[M]?.[ue.state_id]??ue.state_id,N=W[St];if(N!==void 0){if(!V("state",N))throw new Error(`Invalid persisted state ID for ${M}/${ue.state_id}: ${N}`);if(R.has(N))throw new Error(`Duplicate persisted state ID on ${M}: ${N}`);K=N}else K=To("state",R),W[St]=K}return R.add(K),P.set(ue.state_id,K),{...ue,state_id:K}});return a.set(M,P),Pe},p=(I,M)=>M===void 0?void 0:Jt(a.get(I)??new Map,M),l=e.actors.map(I=>({...I,actor_id:Jt(i.actor,I.actor_id),states:d("actor",I.actor_id,I.states)})),f=e.locations.map(I=>({...I,location_id:Jt(i.location,I.location_id),states:d("location",I.location_id,I.states)})),u=e.props.map(I=>({...I,prop_id:Jt(i.prop,I.prop_id),states:d("prop",I.prop_id,I.states)})),h=I=>{if("actor_id"in I){let M=p(I.actor_id,I.state_id);return{actor_id:Jt(i.actor,I.actor_id),...M===void 0?{}:{state_id:M}}}return I.label===void 0?{kind:I.kind}:{kind:I.kind,label:I.label}},y=I=>{if(I.includes(":")){let[T,P]=Br(I);return Jt(T==="actor"?i.actor:T==="location"?i.location:i.prop,P)}let M=i.actor.get(I)??i.location.get(I)??i.prop.get(I);if(M===void 0)throw new Error(`Missing transition target mapping for ${I}`);return M},m=(I,M)=>{let T=s("action",M,o.action,r.action),P=I.transition_prompt===void 0?{}:{transition_prompt:{...I.transition_prompt,target:y(I.transition_prompt.target)}};if(I.type==="dialogue"||I.type==="inner_thought"){if(I.speaker===void 0)throw new Error(`Speaking action ${I.content.slice(0,40)} has no speaker`);return{action_id:T,type:I.type,content:I.content,speaker:h(I.speaker),...I.emotion===void 0?{}:{parenthetical:I.emotion},...P,...I.extend===void 0?{}:{extend:I.extend}}}return{action_id:T,type:I.type,content:I.content,...P,...I.extend===void 0?{}:{extend:I.extend}}},w=(I,M)=>[p(I,M??"default")??"default"],g=(I,M)=>{let T=new Map;for(let P of I){let R=Jt(i.actor,P.actor_id),j=T.get(R)??new Set;w(P.actor_id,P.state_id).forEach(W=>j.add(W)),T.set(R,j)}for(let P of M){if(P.speaker===void 0||!("actor_id"in P.speaker))continue;let R=P.speaker.actor_id,j=Jt(i.actor,R),W=T.get(j)??new Set;w(R,P.speaker.state_id).forEach(Pe=>W.add(Pe)),T.set(j,W)}return[...T].map(([P,R])=>({actor_id:P,state_ids:[...R].sort()}))},_=I=>{let M=new Map;for(let T of I){let P=Jt(i.prop,T.prop_id),R=M.get(P)??new Set;w(T.prop_id,T.state_id).forEach(j=>R.add(j)),M.set(P,R)}return[...M].map(([T,P])=>({prop_id:T,state_ids:[...P].sort()}))},E=new Set,x=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(I=>{let M=n.episode?.[I.episode_id]??I.episode_id;E.add(M);let T=s("episode",M,o.episode,r.episode);return{...I,episode_id:T,scenes:I.scenes.map(P=>{let R=`${I.episode_id}/${P.scene_id}`,j=n.scene?.[R]??R;x.add(j);let W=s("scene",j,o.scene,r.scene),Pe=new Map;return{...P,scene_id:W,location:P.location===null?null:{location_id:Jt(i.location,P.location.location_id),state_ids:w(P.location.location_id,P.location.state_id)},actors:g(P.actors,P.actions),props:_(P.props),actions:P.actions.map((ue,K)=>{let St=`${R}#${K}`,N=JSON.stringify(yn(ue)),re=(Pe.get(N)??0)+1;Pe.set(N,re);let _e=z5("sha256").update(N).digest("hex"),It=n.action?.[St]??`${j}:action:${_e}:${re}`;return A.add(It),m(ue,It)})}})}})},U=(I,M)=>{for(let T of Object.keys(I))M.has(T)||delete I[T]};U(o.actor,new Set(e.actors.map(I=>c("actor",I.actor_id)))),U(o.location,new Set(e.locations.map(I=>c("location",I.location_id)))),U(o.prop,new Set(e.props.map(I=>c("prop",I.prop_id)))),U(o.episode,E),U(o.scene,x),U(o.action,A);let O=[...e.actors.map(I=>({id:c("actor",I.actor_id),oldId:I.actor_id,states:I.states})),...e.locations.map(I=>({id:c("location",I.location_id),oldId:I.location_id,states:I.states})),...e.props.map(I=>({id:c("prop",I.prop_id),oldId:I.prop_id,states:I.states}))];U(o.state,new Set(O.map(I=>I.id)));for(let I of O)U(o.state[I.id]??{},new Set(I.states.map(M=>n.state?.[I.oldId]?.[M.state_id]??M.state_id)));return{script:k,identityMap:o}}import*as ve from"node:fs";import*as ti from"node:path";function pa(e,t){let n=ti.dirname(e);ve.mkdirSync(n,{recursive:!0});let o=ti.join(n,`.${ti.basename(e)}.${process.pid}.tmp`),i=ve.openSync(o,"w");try{ve.writeFileSync(i,t),ve.fsyncSync(i)}finally{ve.closeSync(i)}ve.renameSync(o,e)}function H5(e,t){pa(e,JSON.stringify(t,null,2)+`
|
|
230
|
+
`)}function Q5(e){return JSON.parse(ve.readFileSync(e,"utf-8"))}var dt=class{constructor(t){this.root=t}root;abs(t){return ti.join(this.root,t)}ensure(){ve.mkdirSync(this.root,{recursive:!0})}passDir(t){let n=this.abs(t);return ve.mkdirSync(n,{recursive:!0}),n}readText(t){return ve.readFileSync(this.abs(t),"utf-8")}writeText(t,n){pa(this.abs(t),n)}writeJson(t,n){H5(this.abs(t),n)}readJson(t){return Q5(this.abs(t))}has(t){return ve.existsSync(this.abs(t))}path(t){return this.abs(t)}clearError(t){let n=this.abs(t);ve.existsSync(n)&&ve.rmSync(n)}};function Zt(e,t){e=e-0;let n=mp(),o=n[e];if(Zt.wCYmoh===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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.ccSjUe=i,Zt.dKlJjl={},Zt.wCYmoh=!0}let r=n[0];Zt.sBhMJx!==r&&(Zt.dKlJjl={},Zt.sBhMJx=r);let s=Zt.dKlJjl[e];return s===void 0?(o=Zt.ccSjUe(o),Zt.dKlJjl[e]=o):o=s,o}var F=Zt,F5=[F(40),F(37),F(24),F(75),F(5),F(21),"",F(65),F(13),F(34),F(62),"",F(70),F(35),F(42),F(27),F(39),F(43),F(0),F(68),F(55),"",F(77),F(18),F(58),F(10),F(11),F(51),F(59),F(66),F(8),F(3),F(76),"",F(15),F(4),F(9),F(6),F(20),F(14),F(45),F(48),F(38),F(54)][F(74)](`
|
|
231
|
+
`);function Y5(e){let t=F,n=e[t(73)]===0?t(47):t(23);return[t(78),n,t(49),"",e[t(53)]][t(74)](`
|
|
232
|
+
`)}function la(e,t){let n=F;return new S(e,{exitCode:ge,errorCode:n(12),hint:n(44),data:{actual:t}})}function q5(e){let t=F;return typeof e!==t(29)||e===null||Array[t(46)](e)?!1:Object[t(61)](e)[t(1)]===1&&t(33)in e&&Array[t(46)](e[t(33)])}function gp(e,t){let n=F;if(!q5(e))throw la(n(19)+t[n(73)]+n(63),[n(31)]);let o={chunk:t[n(73)],line_start:t[n(64)],line_end:t[n(36)]},i;try{let r=e[n(33)][n(25)](s=>{let c=n;if(typeof s!==c(29)||s===null||Array[c(46)](s)||Object[c(26)](s,c(56))){if(c(72)!==c(30))throw new he(c(57),1);if(typeof _0x5a19bf!==c(29)||_0x5b66f6===null||_0x10f05d[c(46)](_0x23b052)||_0x733702[c(26)](_0x1cb121,c(56)))throw new _0x3dba95(c(57),1);return _0x5020a9[c(32)]({..._0x80cb75,source:_0x442727})}return JSON[c(32)]({...s,source:o})})[n(74)](`
|
|
233
|
+
`);i=Gr(r)}catch(r){throw r instanceof he?la(n(19)+t[n(73)]+": "+r[n(17)],[r[n(17)]]):r}if(i[n(1)]===0&&t[n(53)][n(52)]()!=="")throw n(60)===n(22)?_0x1b2e63(n(19)+_0x2d4dff[n(73)]+n(63),[n(31)]):la(n(19)+t[n(73)]+n(69),[n(2)]);return i}function mp(){let e=["lsdOVAZLNlRVVjP7iMTPBMqIoIj0CMfUC2L0Aw9UiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHoI9RowCUUAwH+wTLYj944cc5BI46kEb5Qc85BYp6k+n5lMF6kAb57+76k+r77Ym5l6l5AAcigbgteftsejbq0TGiokgKIbG6zEQ5zUEyooaGwbcqunlifrpifbsrvnftLrGiokgKIbG5zUE5yIW546W5A6EyooaGG","BgvUz3rO","CMvJB3jKCZOGma","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","C2XPy2u","icdOKAhOR63LIQJKVzWGyfjPy2HHCMqGyxzHBSoNysWGywDHCNjHievTAwX5ihbLBgeGCM91CgeGzsbHihb1EgeGCgfYysbJAw1HlMaG4OAsigfJDgLVBI5JB250zw50pwbsAwnOyxjK5lIk5yMn5OQt5l2prw1PBhNNMOtOOApMNi3VViZMIORLPBNMI73KUOBOTBFMNAxJGijG44cc","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","icdMUPaGyoMbK+wfT++8MUwPMUs5PU+8JoEoIEs9QwaG4OAsihnJzw5LlNbYB3bZpvT7iM5HBwuIoIlLQzRKUAyIFsX7iM5HBwuIoIlNJONKVAKIFv3JGii","icdMUPaGyokwSYdNLllMJQJPL6JOGiZLHAxJGijGiokgKIbHy3rPB27VViXJB250zw50iowoU+AoIEAGVow8J+wjJEE8GcbG4PAZyooaGG","su5hrvnux05puK1bteLArv9gquLmruq","5B+f6Ag75OQk6l+z5lQB5Q2J5PAh5y6F5l2n5Ps+5zYOihjLy29YzhmG5PYa5yMn6z2I77YBzxbPC29KzsdLJ6RLNkJMUPdMLOFMNkZMMi7NOA7PM4BOVRNNLyZLPitLHPNLHAxJGilMOiFLH4BLIAFMNkZMSR/NLkJLJP/MNiNLNlRNLyZVVjVLSi/OR7tLKOZPNz7MOiFLH4BMLOFMNkZKVP3MJA7LNldNGRNLIiFMJAlJGihMMi7MMl7OT7pML7BJGihLJ5NKUOVNUR/LIiFMJAlMIjBMMi7NOA7OVAZLNlRLU7RNQ4SGC2nLBMxVVjVLKiZKUidOV57NU63LNlRNMOtMJihKUyxLPjBOSOZLJ5JLJjBLHPNLHAuGywn0Aw9U44cc","5lQ654MP5y+Q5yIx5yw35l2t5y2v5lQ66kEs6iMY77YB5A625PEpl+ACUUAEHc/NVQtKVzmV5RoB56EW5lIn5yIx5ywLigfJDg9YC+oaGUE+Pos9K+wwIUIVNEEAHcbZCgvHA2vYioEuQcb7iMTPBMqIoIjNCM91Ccj944cc","5Q+p56En6k6W5B2v5y+Q6io95l2/55sO5lIk6z2I5yIx5yE655Qe5A2x5Q6177Ym56Ab5Q2I5AkE5yQGig5HBwxJGif0zxH044cbBgLUzEoaGwvWAxnVzgvFDgL0BguG562j6iEQ5yIB5A2x5Q6144cc","ANnVBL9VyMPLy3q","BwvZC2fNzq","icdMUPaGyowCUJmTmIdML6uV5yAfiowUOUwoHwaG4OAsios4Gos4QIbZy2vUzE+8M3nWywnLiowpQUEuQcbPBNrLCMLVCI9LEhrLCMLVCU+8JhrPBwuG5y+Q55sOigrHEs9UAwDODc9KyxDUl2r1C2VJGilNMB3LPkKV5PEL6zE05B2sigrHEE+8JowKNoAzMI/LPjZPL7tLVziGBMLNAhtVViZMUixMMAGV6BUo5PIo5B2sigrHD27VViZPU4tMMi8V5ykn5PMA5B2sigr1C2VJGilLJP/MLOFMNkRNM7tMJQxLHPNMMi7ML7BVViZMOlNMJA7NHAFMMi7JGihKVzZMGA/JGihLPkNNQBRLKOZKUiRKUiVMLOFLIktMLQ3VVjVKUi3LVPFNNihNLAxMIjBLHPNNQBRKUllJGii","y2H1BMSG","5zcm5zYW54k56l+E57UT6jkz5AsQ5Awh5l+D55wz5lIa5lIQihnJzw5Liow5TUEuQcb0CMfUC2L0Aw9U77YB6lEO5zYW54k56jkz5AsQ5Awh5OYj5yMQ6l6r6Ag65BQp5OUg5OIq5AsA5lIQihnJzw5L77Ym5Q+p5zY65AgR5yAz6iEQ5BEX55QeigXVy2f0Aw9U44cbywn0B3jZ44cbChjVChmG5zkmihn0yxrL44cc","CMvJB3jKCYdMJiNMUPdMLOFMNkZLJ5hNLj/POBRLUO/MJPlLIjFVViZLJ6RMLl7MUPdMLOFMNkZKUk3LRP7PMyxLRzJLNkJNMOtLHOxLRRNVVjVKUi3OPOhOH4BPGkdOVRNNLyZVViZKUi3OPOhMJ5dKVPSGC291CMnLiowTL+AUTEoaGG","s2fYENy","6l+z5lIQ54Mh5Q615y+V6io95OM/5O6L5lIk5lIa54Mh5Q6155Qe5zcm5lIa5zY677YB5y+Q5PYj5RQq5PAh5PYS5yE6546W55YF5A6E5zY655wm5PE25OMn5BU656Ul5PAW5zY644cc","6ycq6kgm5Ase55cg5y6F5PAh77Ym5BM25zYO6l6t5yE65yMn6ycq6kgm6iEQ5Qoa5Q2J5PAh5PIV5zcM5ywO6yoO5OM/6l2944cc5lIa5lIQ5y6F5PAh5Q616jc95zcR5AsA5y+L5PE25B+f6Ag75l+D55wz5ywO6yoO5y+L5A2q77YB5y+V5lUL5OUg5OIq5AsA5P2H6k6W5B2v77Ym5l2g56Ab5Q2I5OIQ5PAT44cb5Pgy6kAb44cb5zci5BM25zco5RYp5y+L5OIw5y+Q5l+D55wz5Q616jc95yMn5y2k5Q6144cc5yQO5l2C57+76k+r5y+Q6io95Ps55y+y6kgO6l6+6k+T6kIa77Ym5lIn6io95yEp5Bcr5lQl5A6E44cc5lIn6kAb6l6t5yE66iEQ5Qoa6l+h56Il44cc","BwfW","AgfZt3DU","lsdLIQJKVzWV546V5Akd77YAEYjRAw5KiJOIywn0Aw9UiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHowpR+AlJEArHoApJ+I/Scj944cc","CgfYC2u","B2jQzwn0","sNz4u1y","Aw52ywXPzcbZDhj1y3r1CMvKig91Dhb1Da","C3rYAw5NAwz5","CMvJB3jKCW","57UD5lIn6kAb5OQk6z2G5zco5yE6546W55Qe6zUg6l6555wm5O+q5yIW5BYa5As044cc","lsdPM4BOVRNNLyZVVjP7iMTPBMqIoIjLCgLZB2rLiIWIzxbPC29Kzsi6mtKSiNrPDgXLiJOI5y+V6ycj5Qch6AkyiN3JGijLCgLZB2rLiow/HEMHU+wpLUA6KoAwH+ACRowgMEAyJUEAHoMBHUwpT++8M+s5PUwqJEoaGEAlRowpT+oaGEAGH+MIMoAwH+wTL+MdVEs4JEIdVEA3T+I/MYbLCgLZB2rL44cc","y29Yzv9SAw5Lx2vUza","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","lsdLR7NNMB3VVjP7iMTPBMqIoIjKAwfSB2D1zsiSiNnWzwfRzxiIoNSIBMfTzsi6iUEuSIj9lcjJB250zw50iJOI5y6F6k+DiIWIzw1VDgLVBIi6iUwpR+MaIsj944cc","5l2G5PIV5yMN5PYS6kEe6iYd5yYw5zMO44cc5OQk57Uz5A6A55Qe5RQq5PAh5PYS5z2x6l2S5O2I5OIq57Ut5P6e5yYw5yMN5PYS6k6W5B2v44cc","z2vUzxjHDgvuzxH0","lsdLNlROVRNNLyZVVjP7iMTPBMqIoIjZy2vUzsiSiMvUDMLYB25Tzw50iJP7iNnWywnLiJOIAw50zxjPB3iIlcj0Aw1LiJOIzgf5iN0SiMXVy2f0Aw9UiJP7iM5HBwuIoIlLRQlLJOuIFsWIywn0B3jZiJPBxsWIChjVChmIoLTDFEoaGUs4JEIMGEI+K+whUIbZy2vUzsdNVjBLJ7FLRzFMRRxVViZNS7VNU5/KVjROH6ROOyZOV57NU63NVjBLJ7FJGilMR4/KUkOGC2nLBMuG6yo95B+f6Ag75AgR5yAzigvUDMLYB25Tzw50lNrPBwxVViZLJ6ROG73KVB/NLkGGzgf5Fg5Pz2H0FgrHD258zhvZA++8M+s+NEASOEwVUEw6LoAxPs/LPjWV5PMOl+AyJ+oaGG","lsdLHOxLV4pNI6ZNMB0V55s75Asw6z+Z77YAEYjRAw5KiJOIAw5UzxjFDgHVDwDODciSiNnWzwfRzxiIoNSIBMfTzsi6iUEuSIj9lcjJB250zw50iJOI5y6F6k+DiIWIzw1VDgLVBIi6iUwpR+MaIsj944cc","sw5ZCgvJDcb0AguGy2H1BMSGzxjYB3iGC2LKzwnHCIbHBMqGCMvYDw4GyhnJCMLWDgn0BcbPBMDLC3rGlG","6z2E5lQ654MP5y+r5AoW5RQq55QeihnWzwfRzxiUA2LUzcdLJ6RNLkGGC3LZDgvTFgjYB2fKy2fZDhXVzMzZy3jLzw58z3jVDxdVViZLJ6/NLkGGBgfIzwWG6kgL5ywf5zcn56EW77YB5yw35l2t5lQ654MP5AEl57Ui55sOihnWzwfRzxiUBMfTzEoaGG","AxnbCNjHEq","6l+z5PIV5RQq5PAh5lU25BYa5As077YB5Bcp6k+05OIw6z2E5Qch5yEg5PAh5PYS5lUo56YS5lIa5lIQ5y+V56gU6k6K55Qe54MP55cg56M66zE05BU656Ul6AAw5zY644cc","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","5lUL5lIl5Q2J5PAh5B+f6Ag76ycq6kgm44cb6ycq5y+L5A6m5Pw06l+B5ywLihjLy29YzhpVVjRLR7NNMB3LKOZLHOxLV4pNI6ZNMB3PGjdLRzFKV53NLzNLJP/OR63OQidVVjVLIQJKVzZJGihNJQ/LOOpJGihOVAZLNlRJGihMIBNMS6JLKOZOOAJMVjtMJ5dNPlRLV6dLRP7OVAZMJAlMIjdNROdKVzpKUk3MLOFVVjVKURRNIANLKi3LNkJMIydMNiNORRdLVzxKUk3KV53MJihLJP/MLOFMI7ZLHPNVViZKUi3NV7VOR5hJGihKUi3PN7pOR5hJGilKUi3LVPFPGzFMVi/JGihMKzJOPOhJGihMIkRMLQ3MIjBOOAxPGkdJGilOVPpLH7RLIy3OR7FOH6ROOyZMOlJLR7NMR4/KUidOOyZVViZKUjtKUi3OPOhOVPpLH7RMOlJLR7NOV4FNQiVJGii","oIbWCM92AwrLCIbYzxr1CM5LzcbPBNzHBgLKiePtt04","icdMUPaGyoEuSU+8MUs9OoADPEs6HMaG4OAsigrPywXVz3vL44cc5RQqigdNLllVViJLHRFNRjhVViNVVjRKVAdMNAxKUOzGiokgKIbKAwfSB2D1zs5LBw90Aw9Uios4UIbG5yA356YryooaGG","DhjPBq","Dgv4Da","BM90zsdLJ6RNLkJKUO7NNj/MRApML6dMS5xLVzlLHAxLIAFMNkZJGihKUz/KUi3LSz7KUO7NLlVPNAiV5A+555M955Qe5yAf5A6544cc5RQq5PAh5PYS5z2x55Qe5A6E6lsO5yAf5A655lIn5B6x5lII5AsX44cc","ywn0Aw9U44cbzgLHBg9NDwxJGifPBM5LCL90Ag91z2H044cbDhjHBNnPDgLVBUoaGw5VDguG55QeignVBNrLBNqG5B+f6Ag75PIV6z2E56M65A2x56YM5lIY77YB5lIn5B6x6l6t5yE6ignVBNrLBNqG5lI656M655Qe5y2G5l2n6k6W5B2v44cc5y6F5PAh5RkH5PYj5A+55BQu5Q2J5PAh5PE25BcX5lIn6kAb5yIB5BU66k+L6k6W5B2v44cc","C291CMnL","CMvJB3jKig11C3qGyMuGyw4GB2jQzwn0ihDPDgHVDxqGC291CMnL","icdMUPaGyos6UUEjQE+8MUEuSUoaKoEzVEIHOYZMMi/OV7FJGjhVViZKUzLGiokgKIbZy2vUzs5Hy3rVCNm9w3SIBMfTzsi6iUEuSIiSiNn0yxrLiJOI55M96kgJloAyJ+I/TYj9lhSIBMfTzsi6iUs5Msj9xEoaGG","icdMUPaGyoEuSK9t77YA77Yi5Ogq5Owm77Yj5lUw5RkH5Q275zcN77YFycdIHPiGAw5UzxjFDgHVDwDODc5LBw90Aw9Uios4UIbG5Ogq5OwmyooaGG","C3zJvNG","A2v5CW","5zY65y+377Yi5AAcigdLNlOZltjG77Yj57UD5lIn5PIV6zUg6l6555wm77YB5y+Q5PYj5y6F5PAh5PIo56gU5yAz5yE6igdNRkXo6zUgycdMIjyGye7PM4zGioAxTUAjJEIdVEI+K+whUIbLCgLZB2rL44cc","oIbVDxrWDxqGBxvZDcbIzsbHBIbVyMPLy3qGy29UDgfPBMLUzYbVBMX5ihjLy29YzhnBxq","y29Yzv9SAw5Lx3n0yxj0","5lIL5Qc85l+D5OYb5RQq5PAh5PYS6Ag65BQp77Ym57UD5lIn6yEn5O6s77YA5z2x5BYa5As06iUL5zYO5lU75l2v44co6zUgl+wCUUoaJ+AGH+IUSos5I+wjJEwWSEACIEATO+AwH++8Ios4IUs4GowDL+AYOEwgMEwUJoEAHoAiJ++8IE+8Ja","icdMUPaGyooaKowTL+w5LE+8MUwBNUMxQoAxPEoaKwaG4OAsigfJDgLVBU+8M+EuU+MDOUAwH+wTL+wXNUs6JUEuU+MDOUwgHEwUUEoaGG","ugjquNe","lsdMIBNMS6JVVjP7iMTPBMqIoIjUB3rLiIWIy29UDgvUDci6iUw/OowUNUI9RoAnOUAiKoEUGos9K+s4REAwH+EAHoAjUEAZQciSiMnHDgvNB3j5iJOIyxv0Ag9Yx25VDgv8zM9YBwf0x25VDgv8Dw5JBgfZC2LMAwvKiN3JGii","oIbUB24Tzw1WDhKGy2H1BMSGChjVzhvJzwqGBM8GCMvJB3jKCW","6k6W5B2v57g75z6l77YA","Aw5Nzxn0lNrLEhqTBM9YBwfSAxPL","yuDguKW","Aw5KzxG","AM9PBG","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","icdLKiZKUidLJ6xNLlhLPjRKURRLKiZML7BOR7tML7BVViZKUlRMR4/KUkROR7tOR53KURRLKitLHPNKUidMNAhNM7JPGRSGzgLHBg9NDwxVViXJB250zw50ioEBUowqJooaGG","6l2S5O2I6kEe5yIz77YA","44cq5B6f6kEe6iYd5yYw55Qe5y6F5PAh54Mh5Q6144cr"];return mp=function(){return e},mp()}async function jm(e,t,n){let o=F,i=await e[o(41)](o(71),{system:F5,user:Y5(t),responseFormat:o(16),...n?{signal:n}:{}}),r;try{r=JSON[o(28)](i[o(53)])}catch{if(o(67)!==o(67))_0x10022d=_0x3c4a29[o(28)](_0x5ecbb9[o(53)]);else throw la(o(19)+t[o(73)]+o(50),[i[o(53)][o(7)](0,500)])}return{raw:i[o(53)],records:gp(r,t)}}var yp=Wt,Z5=yp(1);function W5(e){let t=yp,n=e[t(5)](/起点\s*[::]\s*(\d+)/);return n?{found:!0,line:Math[t(3)](Number(n[1]))}:{found:!1,line:null}}function hp(){let e=["Dgv4Da","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","Aw5Nzxn0lMjVzhKTC3rHCNq","Dhj1BMm","z2vUzxjHDgvuzxH0","Bwf0y2G","5lIl6z2I5PIV5RQq5PAh5lU255Qe5lIa5Q6177Ym5Q+p6kgm5lUL44cm6kgm5y+3pfrbqJ7LHOxLRRNJGi3NU5NLH7RJGilLIktMLQ3NNj/MRApNMOtLIAFMNkZMRApMLOFMMk/LKkBLNkJOV5NMRRxPH4ZLVidLP4VVViZMJiNMOlZLVi/LJ6RLM57KUidOOyZJGiikcG"];return hp=function(){return e},hp()}async function zm(e,t,n){let o=yp,i=await e[o(4)](o(2),{system:Z5,user:o(6)+t,...n?{signal:n}:{}});return W5(i[o(0)])}function Wt(e,t){e=e-0;let n=hp(),o=n[e];if(Wt.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};Wt.TPTWLA=i,Wt.iYuNay={},Wt.sLepLJ=!0}let r=n[0];Wt.inDmHY!==r&&(Wt.iYuNay={},Wt.inDmHY=r);let s=Wt.iYuNay[e];return s===void 0?(o=Wt.TPTWLA(o),Wt.iYuNay[e]=o):o=s,o}var Hm=50,X5=10;async function Qm(e,t,n){let o=t.split(`
|
|
234
|
+
`),i=Hm-X5;try{for(let r=0;r<o.length;r+=i){let s=Math.min(r+Hm,o.length),c=o.slice(r,s).map((d,p)=>`${r+p+1} ${d}`).join(`
|
|
235
|
+
`),a=await zm(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 Fm(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 Bt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Xt=e=>Array.isArray(e);function wp(e){let t=new Map;if(!Xt(e))return t;for(let n of e){if(!Bt(n))continue;let o=n.actor_id??n.location_id??n.prop_id;typeof o=="string"&&t.set(o,n)}return t}function eS(e){let t=[],n=(o,i)=>{!Bt(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 Xt(e.episodes)?e.episodes:[])if(!(!Bt(o)||!Xt(o.scenes))){for(let i of o.scenes)if(Bt(i)){n(i.location,"location_id");for(let r of Xt(i.actors)?i.actors:[])n(r,"actor_id");for(let r of Xt(i.props)?i.props:[])n(r,"prop_id");for(let r of Xt(i.actions)?i.actions:[])Bt(r)&&n(r.speaker,"actor_id")}}return t}function tS(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 ua(e){if(!Bt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of Xt(t.episodes)?t.episodes:[])if(!(!Bt(p)||!Xt(p.scenes)))for(let l of p.scenes){if(!Bt(l))continue;let f=Xt(l.actors)?l.actors.filter(Bt):[],u=new Set(f.map(h=>h.actor_id).filter(h=>typeof h=="string"));for(let h of Xt(l.actions)?l.actions:[])!Bt(h)||!Bt(h.speaker)||typeof h.speaker.actor_id!="string"||u.has(h.speaker.actor_id)||(f.push({actor_id:h.speaker.actor_id}),u.add(h.speaker.actor_id));l.actors=f}let n=wp(t.actors),o=wp(t.locations),i=wp(t.props),r=new Map([...n,...o,...i]),s=eS(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=(Xt(l.states)?l.states:[]).filter(Bt),u=new Map,h=tS(f,c.get(p)??new Map),y;if(h===null){let m=f.find(w=>w.state_id==="default");y=[{state_id:"default",state_name:m?.state_name??"default",description:m?.description??""}]}else{y=[];for(let m of f)m.state_id!=="default"&&(m.state_id===h?(u.set(m.state_id,"default"),y.unshift({state_id:"default",state_name:m.state_name,description:m.description??""})):(u.set(m.state_id,m.state_id),y.push({state_id:m.state_id,state_name:m.state_name,description:m.description??""})))}l.states=y,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 Ym=en;function en(e,t){e=e-0;let n=_p(),o=n[e];if(en.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};en.alaGPc=i,en.IPZchV={},en.vcGzia=!0}let r=n[0];en.cEXTRr!==r&&(en.IPZchV={},en.cEXTRr=r);let s=en.IPZchV[e];return s===void 0?(o=en.alaGPc(o),en.IPZchV[e]=o):o=s,o}var nS=Ym(6);async function qm(e,t,n,o){let i=Ym;return(await e[i(4)](i(2),{system:nS,user:i(0)+t+i(3)+n,...o?{signal:o}:{}}))[i(5)][i(1)]()}function _p(){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 _p=function(){return e},_p()}var eg={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"]}}}}}},xp={type:"array",items:{type:"object",required:["asset_id","state_id"],additionalProperties:!1,properties:{asset_id:{type:"string"},state_id:{type:["string","null"]}}}},hN={type:"object",required:["scenes"],additionalProperties:!1,properties:{scenes:{type:"array",items:{type:"object",required:["scene_id"],additionalProperties:!1,properties:{scene_id:{type:"string"},actors:{...xp,items:{type:"object",required:["actor_id","state_id"],additionalProperties:!1,properties:{actor_id:{type:"string"},state_id:{type:["string","null"]}}}},locations:{...xp,items:{type:"object",required:["location_id","state_id"],additionalProperties:!1,properties:{location_id:{type:"string"},state_id:{type:["string","null"]}}}},props:{...xp,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"]}}}}}}}}},tg={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"}}},ng={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:tg}}},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\u540C\u4E00\u573A\u540C\u4E00\u5B9E\u4F53\u53EF\u6309\u6B63\u6587\u987A\u5E8F\u5217\u51FA\u53D8\u5316\u524D\u540E\u5168\u90E8\u9020\u578B\uFF0C\u6700\u540E\u4E00\u6761\u7531\u540E\u7EED\u4E0D\u53D8\u7684\u573A\u7EE7\u627F\uFF1B\u56DE\u5FC6/\u9884\u6F14\u53CA\u8FD4\u56DE\u73B0\u5B9E\u5747\u663E\u5F0F\u6807\u72B6\u6001",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:"\u672C\u573A\u5B9E\u9645\u51FA\u73B0\u7684\u5DF2\u767B\u8BB0\u9020\u578B\u540D\uFF1B\u540C\u573A\u591A\u9879\u6309\u6B63\u6587\u5148\u540E\u6392\u5217"}}}},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"}}},oS={type:"string",enum:["actor","location","prop"]},og={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"},Zm={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"},Wm={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:og,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"}}},Xm={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"}}},ig={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:og,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:Zm,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:Zm,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:oS,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:Xm,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:Wm,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:Xm,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:Wm,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"}}}}}}}},rg={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:tg}}}}};var z=tn;function tn(e,t){e=e-0;let n=Ep(),o=n[e];if(tn.AowUYu===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};tn.vGSHGD=i,tn.ykrKeL={},tn.AowUYu=!0}let r=n[0];tn.qbkWqr!==r&&(tn.ykrKeL={},tn.qbkWqr=r);let s=tn.ykrKeL[e];return s===void 0?(o=tn.vGSHGD(o),tn.ykrKeL[e]=o):o=s,o}var iS=[z(37),z(84),z(100),z(83),z(39),"",z(71),z(55),z(1),z(47),z(10),z(70),z(56),z(46),z(92),z(2),z(61),z(24),z(82),z(51),z(79),z(88),z(58),z(30),z(65),z(73),z(27),z(59),z(86)][z(33)](`
|
|
236
|
+
`);function rS(e,t){let n=z;return[n(4),e[n(50)]()||n(5),"",n(66),t[n(50)]()][n(33)](`
|
|
237
|
+
`)}async function sg(e,t,n,o){let i=z,r=await e[i(45)](i(69),{system:iS,user:rS(t,n),tool:{name:i(44),description:i(22),inputSchema:ng},...o?{signal:o}:{}});return{delta:Kr(r[i(49)]),raw:JSON[i(38)](r[i(49)])}}var sS=new Set([z(60),z(40),z(99)]),ii=e=>typeof e===z(78)&&e!==null&&!Array[z(13)](e),Hn=e=>typeof e===z(9)?e[z(50)]():"";function fa(e,t){let n=z,o=Hn(e);if(!o)throw new Ce(t+n(36));return o}function aS(e,t){let n=z;if(!ii(e))throw new Ce(t+n(31));let o=fa(e[n(32)],t+n(90));if(o!=="\u5E38\u6001")throw new Ce(t+n(29));return{name:o,description:fa(e[n(15)],t+n(93))}}var Ce=class extends Error{[z(12)]=z(34);constructor(t){let n=z;super(t),this[n(32)]=n(0)}};function cS(e){let t=z,n="",o=!1;for(let i=0;i<e[t(28)];i++){let r=e[i];if(!o)if(t(48)!==t(67)){n+=r,r==='"'&&(o=!0);continue}else throw new _0x293dd1(_0x17bbe5+t(89)+(_0x24ef46 instanceof _0x59e65f?_0x136fee[t(20)]:_0x3dfec6(_0x4eb04e)));if(r==="\\"&&i+1<e[t(28)]){n+=r+e[i+1],i++;continue}if(r==='"'){let s=i+1;for(;s<e[t(28)]&&/\s/[t(77)](e[s]);)s++;let c=s<e[t(28)]?e[s]:"";if(c===""||c===","||c==="}"||c==="]"||c===":")if(t(35)===t(35))n+=r,o=!1;else return[t(4),_0x49903e[t(50)]()||t(5),"",t(66),_0x1df459[t(50)]()][t(33)](`
|
|
238
|
+
`);else n+='\\"';continue}n+=r}return n}function dS(e,t){let n=z,o=r=>JSON[n(101)](r),i;try{i=o(e)}catch(r){let s=cS(e);if(s===e)throw new Ce(t+n(89)+(r instanceof Error?r[n(20)]:String(r)));try{i=o(s)}catch(c){throw new Ce(t+n(26)+(c instanceof Error?c[n(20)]:String(c)))}}if(!Array[n(13)](i))if(n(6)===n(54))_0x291b73=_0x1aa471(_0x238c2b);else throw new Ce(t+n(91)+typeof i);return i}function ni(e,t){let n=z;if(e==null)return[];if(Array[n(13)](e))return e;if(typeof e===n(9)){let o=e[n(50)]();return o?dS(o,t):[]}throw new Ce(t+n(19)+typeof e)}var pS=/[((]([^))]*)[))]?/;function Ep(){let e=["u2vYAwfSrgvSDgftAgfWzuvYCM9Y","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","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","DxDQzw4","44cq5BEY55+L6k6+5A6A44cr77Yi5OIQ6iEZ5lIk5lIa5Q615l2G5BEY5BU656Ul55Qe55M76k6W77YB5BYa56+h5PE25lI656M677Yj","77Yi56M677Ym5lUo6l+z5lIa5Q615BYa5AEl5BU656Ul77Yj","zfnRChe","Bg9VA3mU","rejIDvm","C3rYAw5N","icdcTYbRAw5KpwfJDg9Yl2XVy2f0Aw9Ul3bYB3dJGii","zNjVBq","y29Kzq","AxnbCNjHEq","zxHLyW","zgvZy3jPChrPB24","ywXPyxnLCW","zw50Axr5","zMLSDgvY","oIbLEhbLy3rLzcbHCNjHEsWGz290ia","BwvZC2fNzq","zgvSDge6ihrVCc1SzxzLBcbku09oihn0CMLUzYbTDxn0igjLigfUig9IAMvJDcWGz290ia","6l+u5zUE5PYS5Q6155Qe6lwe5lQNl+MaOowEIY/LNlRMMA8GrgvSDge","Cvjbrwe","kIRMRApMLOFPH4ZMR4/KUkRLKOZLT7lNMBVORRaGy2fUB25Py2fSiowgMEAZLEs4JEwqJoEAHowqJEwTL++8JoMdVEIMGEEuQcbTzxjNzxmG5B2s6l+h5y67kIRIGjtIGjtNS7VNU5/KVjRNHACGBwvYz2vZicSGywXPyxnLCYdMIORMRApMLOFVViJLR7NNMB3OR7tOR53KURRJGihML4hNMB3MLOFMNkZVViNPH4ZNMOtOV5NKUPVLHPNMS5xNM7tMJQxMLlNLHPNMIjaGy2fUB25Py2fS44cckIRMVi/MJONMN5dKUkRLHPNMS5xVViZLROpLSlhKVjRLJ5JMIjdKUidKUkRMUlJNPRVNMOtPH43LPi3LRP7KVzpJGiiQkIdMIydKU6xMNkZMRRxMRApMLOFPH4ZLH7RNJRdNMOtMR4/KUkRKURRLKi0V56EW5zg877Ym6kAb5lMi5PYS6lQR5BcX5PIV5P+qignHBM9UAwnHBo+8JoIMGEs5IowCQcbHBgLHC2vZl21LCMDLCYdPH4ZNMBVORRdOV4FJGii","BMv3rw50AxrPzxm","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGCgfYC2uGzMfPBgvKigfMDgvYihf1B3rLlxjLCgfPCJOG","icdcTYdKVAaQkUs4JEMCGoIMGsOQ5yIx5yE65Q+p5lIa5zY66lcb5zYO5zY64Ocu4Ocu6lcb5zYO5zY657o757UF55U05O6L5lUo5Q2J5PAh77Yi5A+555M96k+06k+D5lQ644cb5PEb55M977Yj6k+777Ym5l2G5y+Q566H5RoO5yAm5A6E5l2t44cb5B2s5lIa5zcn5A2x44cb5Qch6ycG5z6l5y+y5yYw44cc","BgvUz3rO","lM5HBwu6igv4CgvJDgvKiow4UoAaGq","kIPSB29Rq2HHBMDLCYdIGjtIGjqG6ycG5z6l5y+y5yYw77Yi56Ia55Ap77Ym5y+Q5Qch5y+y5yYw5Ase77YjkIRVVjRMN5dKUkRLRP7KVzpNMOtPGkdLNOVKU47MN5dKUidLNlROTBFLJ5JKUOBVViZLSlhMOiFKUidMNAeGE3nJzw5LlcbLBNrPDhKSigXVB2T944ccC2nLBMu95y+y5yYw5y+r55sF55Qe5zY65PMVAwtVViHZy25FmdeY77Yj77YBzw50Axr5pwnHBM9UAwnHBcdLKi3VVjTSB29RpEACRowCUUwUNUMzHEwhUUEoSoEAHoMaOowEI++8Iow/HEMHU+AyR+w3SUEzU+IUSoEAHow4UoAaGEAiLIbSB29RCYdMOApKVy3LKi3VViNJGilLKiZKUidOV57NU63LNlRLHOxNOA7MNiNLJ5JLJjBML7BVViZLR7NLKiZKUiaGC2nLBMuVzw50Axr5ioAmIEATO+AwH+MHUUw6J+wiL+whUUwpMowmLUwjJEwqJUwfQoMdQoEkTUAaGE+8M+ACGowqJUs4GoADOEIHQoEKUUEMU+w8GoACRowCUUAxTUEAHoEkTUAaGE+8JowqJUE7REs4JEwpMoEAHowCUUE7P+AjV+wUG+oaGUwpMowmLUI/H+EOI+s4JUIqVEEcUEEuSEATO+AwHYbHy3rPB24G5l+D55wz77Ym5lIn5lI654Q25Ocb5y+y5yYw5OUg5zY644cc","oIbLEhbLy3rLzcbVyMPLy3q","BMfTzq","AM9PBG","C2vYAwfSx2rLBhrHx3nOyxbL","DLDbwgK","oIbLEhbLy3rLzcbUB24Tzw1WDhKGC3rYAw5N","5l2G5PIV5yMN5PYS6lwe5lQNl+MaOowEI+AGH+AZQowzQooaGUwjJEAUTEwpQUE7MEs6HUATO+AwH++8IowCUUAzR+oaGEwpSoIVJEoaGEwkQos9No+8IE+8JcOQ5RkH5PYj5lU75l2v546W5OIq55Qe5lQ654MPl+MbK+wfTY/PGkdLNOVMUixLJzuQkUkaLokaLoI1Hos6P+s4JUMaOowEI+wfQoMdQoEuSEs9Oos7JUATO+AwH+MhJoMaKoMBHUwpKEEoSooaGEMaKoMBHUE7ToAkPooaGG","C3rYAw5NAwz5","5lQ654MPignHBM9UAwnHBcdLKi3LV4xPOBVPH4FNLkJJGjdMNkZMRRxMRApMLOFJGjfZy2vUzs5Hy3rVCNmG5OIwihnWzwfRzxiG5lIT5yE6546W55Qe5y6F5PAh5AEt5zcn5OU85yAz77YB5Asw6k+T5AEt5zcn5l+D5OYb5Asw6k+T5y6F5zcn77Ym5lIn57+76k+r44cb5lIn6z+Z6k+r44cb5lIn5Ps55OIq5lIT5PAh5zcn44cc56EW6lct44cb566a56EW5zkm6k+r5zcn5y+Q5Ps+igfSAwfZzxmG5OIwig1LCMDLC++8Jos4JEIdVEwpLUs7O+w3SUE7J+whUUEoSoEAHowoN+AwH+wfQowqJEoaGG","Bg9JyxrPB24","DMTquwi","Bg9VA3m","lMrLzMf1BhrmB29R","zw1PDf9KzwX0yq","z2vUzxjHDgvuB29S","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","icdcTYaQkUwqJos4Gos4QUwUNUs9K+wpQUEzU+IUSos4GoADOE+8JoE7NEs4JEAlHUAiKowKMUADOsOQ44cckIRKUi3LKiZNMOtOP5lOIBlNU53KUi3KUPlNM7JLIjFKUlRLIkVLKi0QkUkaLokaLowtQUAaLEwfS+EZU+wVHUwiH+oaGEw4UowqJoAHHU+8MUwKP+EjMYdLKOWG5lI55Bc8WRFLHyVNVzFMLQ8G5PIV5lIK5lIQ5lQ677Ym5yIR5OQk5lI55Bc855Qe5zcn5A2x5yAz6l+B5AsN54MB55QeigfSAwfZzxpVViZLJ43KUyVKUQBNHlBJGilLIktMJA7VVjPHBgLHC2vZiowpQUAuVIOQ5zcm5lIa5lIQ5lQ6l+EjQsOQ55Qe5lIn5zcm5y+R5Rov77Ym5lIn5Ps+5y+M5lIa5lIQ6kEs6iMY44cc","ELDur28","Aw5WDxq","DhjPBq","icaQkUwKJEEuQos8MowfIokaLokaLoMaOowEI+M7MoIUPos7JUoaKow3SUEFPEIUVUwUMUoaKEMhJoIVPEwUNUs9K+w3SUwiL+whUUEAHoMaOowEI+A4HEwnLEMhJoMaIEs4Gos4QU+8JoMaKowTL+EfP+AkHoMcO+s4QUw3SUACIEMaOowEI+wqJsOQ44cc6zMK6z2E5PYS5Q615Asw6kEc5lIo5OMa5PYj5BEY5PYj6ycG5z6l6yo95PYj5A6E6lsO5BEU5BYc77Yi5O2I5lQg5Pw05Awx6kgJ5PYnl+wjP+AdHEAyJUEHRUEAHoIcPowgTEoaGEIdLUEyPUoaGEw5ToM+HoAiLUw9OUAaGEMyTUAUTEAuUEwpMc/LNlRMMA/OOQVMR4eV6ygt5yw35PIo5PI+5Ps55B2I77Yj77Ym5OMn5PAW5BYa5lIa5P2H6ycG5z6l44cc5lIn6kAb5zUG5lI65PYS5Q615y6F5PAh55sO6k+n5lIn5zcm5BcX5y+M6ycG6l+r5lMj5PAW5zcn4Ocu4Ocu5BEY55+L6k6+5A6A6yEm5BEY5PYj44co6BUr6iMY6l+E5BI95y2R6kgJ44cp77Ym5PYS5Q615y+i6kEb6BUr6iMY5y2R6kgJ77Ym54wN5OQe44co6BUr6iMY6l+E5BI95y2R6kgJ44cp5y2Z5y+V77YB5zcm5lMj5O2I5zcn5y+Q5lYA5OQk5zcm5lIa5Awx6kgJ5PYn5OUg5OIq5AsA5BYG5zU+44cc5Asn55sO5yMn5zcm5PE25Qc45A+56kgJ552a5lIo5yMN5Oof5Asw6lkm6zI25Q6177YB5zcm5zcnigrLC2nYAxb0Aw9UioEAHoIHPEwfHEwpQUEuQos6JUwqJos4GoMyTUAUTE+8Jos4JEIdVEAkIUAwSoMyTUAUTEwiL+s4UUAxP+MyTUAUTEEAHcbHBgLHCYdMIjBOPOBNM5BML6FMJ4/OV7dJGilKURRNIANOUQVKU73LKiJLUBBKUz/KUi3NRyNKUO7LHBBLKitPMlBMRRxPGkdLNOVLKiJLUBBJGii","A2LUza","zgvSDge6ihrVCc1SzxzLBcbku09oihn0CMLUzYbMywLSzwqGDg8GCgfYC2u6ia","svbTEfO","icdcTYbUyw1Lid0G57QVignHBM9UAwnHBcdLKi3VViWQkUE7NEs4JEwqQ+AlRowpTY/MLPZMNAaV6k+r5zcn5As55RoOl+wVUEEzVEAGH+IUScOQ77Yi5lIn6kAbig5HBwu944cotwfYy3vZifzHBgxVViJPQAZLUPpMLQ/cT+E7TowWLo+8IEoaJ+AiLUoaJK1HCMn1CYbwywXL77Ym6A2c6k+T44cp77Ym6icm5PIVig5HBwu944cotwfYy3vZifzHBgxJGi/VViNJGilKURRLKi3PH4FNLkJMRApMLOFPH4ZLH7RNJRdNMOtLJP/MLOFLROZMLBtLP5pLKi3MI7ZLHPNVViHGrw1PBhKGq29SzwaG5lIn5B6x5Ps55OIqigdOIB7NSBpKUl3cT+ENKEwWLgdVVjVJGi7OI4/OI6xPM6RJGi/KUi3NVkNMIjdJGi7OI6xPM6RJGi/VViNJGii","icdcTYbKzwzHDwX0tg9VAZ3LRP7KVzpPPPBMRkhNMBVORRdML7BLV4xLOAVNMOqQkUM7MoIUPoMaOowEIYOQ77YABMfTzsdLM7RLRPRLHPNJGi7LUlJMGihJGi/VVjTKzxnJCMLWDgLVBIdLHPNLJ6/NM7tMJQxNLkJKUO7OP4BOP4NLPi3NJRdNMOtLPjBOSOZJGihMNi3PPBdJGihMNzdOTkJJGihPOPZOIBlJGihLUipMMA/MIjBLVAlLIlBVViZPNz7NQBRJGilKURRNIANOUQVKU73KUi7LHBpNS7VKUi3OG73MI7/MNAxLHyxLVzpPGkdLNOVMJ4/OV7dJGilLJ6RMJ4/OV7dPPPBMRkhLRP7PMyxLH7RNJRdNMOtPMlBMRRxVViZNU4JMGihMIjBPOOtMVjtKUi3OPOBNM5BLIj3LP4VLPjBOSOZVVjVPU5JORQtPGkdLNOVLKi3NP7dKUi3KU6pOOAJLHAJLIAFKUi3LJ5JJGilKVjJLHyJPH4FNLkJLJP/MLOFMMi7NOA7MJ4/LHPNVVjVLJP/MLOFKV6hMGA/KUi3OTRpML7BVViZNU5pLKiJLRP7KVzpOUQVKU73KUi7LKiZLNlROP4BOP4NKV6hMGA/OOAxMIjdMNidNROdJGihNQlpLRPRJGihLJ6/NLlVNMOtLUlJMGihPGkdLNOVJGii","BwvYz2vZ","icbKzxnJCMLWDgLVBJ3OV5NLPzFLPjBOP4lPLB/KU4dKUyJMOlFNMOtKUidLJ6xOR53VViJKVjJLHyJNLkJLJP/MLOFMJ4/LHPNVVjRMNi3PPBaV6AkC6iMYl+wpKEwEIY/PHy3PPBdVViZMIjBLNlRMMA/LUipMMA8V6ygt5yw35B2I5yI277Yj44cckIRLUlJMGieGzgvZy3jPChrPB24G5lIn6io955wz56M644cckIOG556S5PE25B+d5Oof44cb5AE/5Ocb5lIo5yQO5l2C55wz5zYO5Q2J5PAh77YB5yMN5Oof5PIo56gU5lIu6zYa6kAb54US56Ul5Asn546W55Qe56wB55Ey44cb5yEp6yEn44cb6kgW6icb44cb5lYK5yQ/5OIw5y+y6lQR5BgE5lQo6ycG5z6l44cc5zcm5lIa6kgJ5PYn6lEO5Asw6lkm6zI25Q615lMF6kAb5yIg5yIR55M76k6W77Ym5yAz5RIf5y+V6kEb5BEU5BYc77YB57Ui5Ocb5Asw6lkm5lIn6io96kAg55Uw5PEP5PYF54Q25Ocb5OIw5ywO5Bga6lQR5lU95O+p6l+W44cc","C3vIrxzLBNrZ77YA5PYS5Q615ywZ6zsU5yMN5Oof5y6F5A2q77Ym5Q+p5P2H5lIa5y+L6k+D77Yi57U05OQK5yMN5Oof55cg6kEJ5lIo5y6l57YP77Yj44cc","ywn0B3i","icdcTYaQkUwCSoEcUEwqJoAGT+IMGsbTzxjNzEkaLokaLowiPoAnRUs4GoAGT++8MUAyR+s4JEAyR+wqJos4Gos4QUwCUIOQ44cc5zcm5lIa5lIQ5zYW5PA555Qe5lIn5zcm5yAz5Rov6kAb5zci5OIq5lIa5P2H77YA4PgG5A2x6z2I5y+y5l2t77Yi44co6l2M6l2U5PEb44cp44co55+/6l2M6l2M6l2U5PEb44cp44co55+/6l2M6l2M6l2U44cp5PIV5zcm5lIa5Ase77YB5BIM5lIn5BIM5BMZ5y+Wl+wmUUwFN+wjJEE8GowMGUoaJKrHD25MywXSie9UBgLUzsaTioAJUUACQoMtUUoaJZ3JGi7MO7RMNkJPK7RJGi/VViNVVjVIKAhLIAFMG4xNOA7LRPRLKiZKUidLPitVViJLKiZKUidLNlRMIi/LNkJLKiZKUidNQBRPL7tLJ5hNLj/VViNJGiiQkUs4JEAyR+wqJos4Gos4QUwCUUwWSEwqHoIhQUElRoERIYOQ77Yi55+/6l2O5l+U6ycG6zo6iowsJcdMO7RMNkJPK7OG5PIV5lIK5lIQ5zYW5PA577Ym5lIn5zci77Yj44cc5yIR5zUG5lI65yAz5Rov5BIM5lQg6zw/5yMn57Ya5BcX5B2t5OIq5PAW5zYW54k544cc","AgfZ","BwfW","Aw5KzxG","icdcTYaQkUwpQUAGH+MaOowEI+ECN+EAHoAuUEwpMoEAHoMcO+s4GowCUIOQ77Yi5O2I6kofl+wpMoI6QY/LJ5FMJz8V5zUE5B2s5PEL5BI477Yj44cc5l6l77YA5AsN6AQO5As05zYOihnJBL8WntaG5y+y6lQR54sW5PYV5BIiiokgKIb7C2nLBMu6C2nUxZa1mcWGzw50Axr5oUwKP+MQQowKTcWGBg9VAZRNHldMNk/LUiJMGif977YB5zco6z2I6iUL5O2I5zUE5BI45Ocb77Ym5zYO6ykJ5lIa5zY65yAn5QchihSUlI4SigXVB2S65BI45OcbFEoaGG","44cq5PYS5Q615Q2J5PAh44cr77Yi5y+V6io95zcR5AsA6zUg77Ym5Q+p6zUg5lULigaJigvWx05otMaG5BYa5As077Yj","txHkALe","BMv3rw50AxrPzxmUywXPyxnLCW","Aw5Nzxn0lMvWAxnVzguTyxnZzxrZ","icdcTYbKzxnJCMLWDgLVBJ3KUidLJ6xOR53OR7tMMi4QkUI/MEs4QUwUNUs9K+ACRoI6Q+AyR+IWGsaVios7Gos5IoI6Q+s7VsaVios7Gos5Ios4NoILVYOQ77Ym6z2E56M644cc5lQ654MP5y+Q5yAz6lQR5lU944cb6kEs6iMY44cb5ywZ57o777Ym5lIn5yAz5PYn6kof6ycG5z6l77YB57UD5lIn5yAz5A6d5OMa5Ase55Qe5zY65PMVic8G546V5Akdic8G5zYW54k5ic8G5B2t5PE25zYO5y+r55sF5lUa5lMi44cc5y6F5PAh5PYj6lQR5lU95l+H5OgV5BcX54wN5OQeic8G5QAc5OUS77YB5y6F5PAh5RkH5yAz5BcX5O2U5y+W6k+nic8G56EW5zg8ic8G5OIp5lU96kgL5lIa5y+L5PYa566a6lQR5lU977Yi5AAc44co6iUp5A625lIT6zE05lQ644cp44co5OcL6k+k5OQK5AoR44cp44co6lw16zw/5RkZ55Qe5OMl5lIl44cp77Yj44cc5zY65PMV5yAz56M66zE055sO6ycu77YB6ygt5yw35yAz54MP5lU255sO6ycu44cc","kIPUzxDfBNrPDgLLCYdIGjtIGjqG5PYS5Q6144cq5BEY55+L6k6+5A6A44cr6yEm6l+y5RkH5PYj55Qe5A6E5l2t77Ym5Q+p5lIQ55M76k6W5lIa5P2HkIRVVjO","t2zerKm","icdcTYdMSQhLJ5JLJjBNMOtLNlOQkUs4JEEuQoAGHYOQ4Ocu4Ocu57o757UF6iEQ5yQO5Rk/55sO5lIk5lIa5QYH55Qe6ycG5z6l5lIa55U05yIW5lIl5lIa5QYH5y+y5yYw44cc6AAw5QYH5yE6546W6BUy6k6K5BI45Ocb77Ym5lMF5lIn55sO54M55Osp5Qch44cc6l+B5ywL5zUE5B+g44cb5BM75OoZ5OIw57o757UF6Ake5RYu5PE25OYj5yw25A6E6zMf6zI25Q615PI+5BYp6ycj6ycG5z6l77Ym5zUE5yIW546W5A6E5zco5PI+5BYp5OgI5Asn546W5A6E6zI25Q6177Ym5lIn6io95Bcg6Ake5RYu57Ui5Ocb5Rk/55sO5yIW546W5A6E44cc5Asw6lkm5OM/5OUf5yMN5Oof5zUG5P6C5PE277Ym5ywi5A+554wN5Q2J5PAh5Qoa5P+L5yID5AEl44cb5Q+p5QYH5y+y5yYw5yMn5zco5zkm5zUE5B+g77Ym5yAn5O+q5lQKierLBhrH77YB5lIn5Qc55O2U5ywO5yMN5QAc6l+W54YC5PYQ5yE6546W55Qe5y+y5yYw44cc","ALntAxe","zgvMyxvSDeXVB2S","ChvZAa","DgvZDa","B2jQzwn0","icdPU5JORQtPGkdLNOVLJ6RLHPNLNkGGBMv3rw50AxrPzxmUzgvMyxvSDeXVB2VVViZKUi3OPOhLNkGGBg9VA3mG6yEm6yEn5Asn77YBBg9VA3mG5y+Q55M76k6W5O2I6kof44cb5yMN5Oof5Asw6lkm6zI25Q615y+y5yYw44cb5zY65PMV6kkR5Q+b44cb6ygt5yw356c05O2Fl+wpKEwfIEETIEMINEwKLUMaOowEI+oaGUs6UUEjQt3MLBtKVzpMIA7NM7JVVjVLNlRMMA89546V5Akd5Asw6kEc77YB6ygt5yw3pEEjQEs7TUwKLUINGUoaGG","Aw50BW","BMv3rw50AxrPzxmU","Bg9VA3pVVjRPU5JORQtPGkdLNOVKUyVLPjBJGihPNidOPOhLJzxNI6ZLPi3NJRdNMOtMLRdLOP7PGkdLNOVJGijLBNrPDhK95A6E5l2tignHBM9UAwnHBcdLKi3VVjTUyw1LpEMaOowEI+wqJE+8M2fSAwfZzxm95zcm5lMj6ycG5z6l5zcn77YBzgvZy3jPChrPB2496l+z5Awx5Asw6kEc5lIa5y+L6k+D44cc","5AEl57Ui5l2/55sO44cq5BEY55+L6k6+5A6A44cr6yEm55Qe5PEI5PYjignHBM9UAwnHBcdLKi3LRzFVVjVLKiZKUidKUkRKURRLHAJLIAFKV53MJihLKiZKUidLKi3LRzFJGii","57Ut5zci44cq5BEY55+L6k6+5A6A44cr77Yi5yIW55UU5yMn5lI65Q2I5l2G5BEY5BU656Ul55Qe55M76k6W77Yj5lIo44cq5PYS5Q615Q2J5PAh44cr77Ym6lcd55sOigbLBwL0x2rLBhrHycdLT6xLHBFOV5tLM57KUidKUkRNU5pMNOtLJjBLR7NOSAhOPOBNM5BOV5NKUidMLBtMRRxNMOtMIydMNiNLHRpNRzBJGilNQBRMLBdNU4tLSlhKVkaGyfTDyooaGG","Bg9VA0nOyw5Nzxm","C3vTBwfYEE+8MUACRoAUTEs4GowpPEIVNEAIL+AMGU+8M+IlPEACRoAUTEwqQ+wKMUMBHU+8JoAMGUAlRos4UUAvToAUTEs4GowpPEIVNEoaGG","C2nLBMu","icdPGkdLNOVLKi096zYa6kAb576o5PYV5y2v54US55s75lIa5BYG5zU+55Qe5Asw6kEc5QgJ5l2n77Yi5BI45Ocb44cb5AMA5PYn44cb6kw/6kof44cb6B6z5B2I77YB5zY65PMV55QeioEzVEwKQs/LPjZMMzOV6kkR5Q+b77YB6ygt5yw355QeioEGToAnNY/LJ5hLHyNVViNJGiiQkUMaOowEI+wqJEw/HEMHU+EuQos4REAwHYOQ77YA5Q2J5PAh6yEm55Qe6iUX5PAh5lIt5zcn77Yi5Awx6kofl+IbJos4MI/LVAlMGihLKi3VViZLPOiGu2vHBIDZifjLDMvUz2xJGifgBgfTzwnHC3rLCUoaGuDYyxzLifbYAwvZDooaGvnOAwvSzgD1yxjK77Yj5lIa5B6l6k+r5OIq5lIT5PAh5yAn5l2C6ycG5z6l5zcn77Yi6ikw5OgP55Qe5Asn5lUh5Awx6kof44cb54sW5PYV5BIi44cb5Akt56wT5y+444cb55U+5y2R77Yj44cc","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGCgfYC2uGzMfPBgvKoIa","lM5HBwu","oIbLEhbLy3rLzcbku09oigfYCMf5ihn0CMLUzYWGz290ia","icdcTYdLT7lNMBVORRdOV4FNMOtLRP7KVzpKUi3OPOhPH43LPi3NMBVORRdVVjVOI6xLROpOV5NMRRxMNiNKUOBMLRdLJ6VMS5xVViZNLkGGBwvYz2vZioIHPE+8Jos4JEEuQowCQcbUzxDfBNrPDgLLCYdLHO3LIjFKUidPGy3JGii","lMrLC2nYAxb0Aw9U","Bg9VA3mUywXPyxnLCW","DgPUuMy","C3vIrxzLBNrZ","C3vTBwfYEq","C2XPy2u","ChjVCa","kIRJGjdMNkZMRRxMRApMLOFJGjhLJ6/OG73LJixLKkVOI6xLUBlPM4yQkU+8IoAVJ+MBHUs7PsbGiYbLCf9otK5Giow8GowKTo+8IE+8M+AkIUwUG+s7Row9K+s9NoI/NUE7REAoQoI/M+EAHos4GoAUTEAvTos9K+wKHoEqHU+8JoI3QoMBHUAYV+EuQowqJos4GcbJyw5VBMLJywWG5zcn5A2x44cc","CgfYC2u","C3bSAxq","Bg9VAW"];return Ep=function(){return e},Ep()}function Sp(e){let t=z,n=Hn(e),o=pS[t(14)](n);if(!o)return{name:n,aliases:[]};let i=n[t(98)](0,o[t(64)])[t(50)]();if(!i)return{name:n,aliases:[]};let r=(o[1]??"")[t(102)](/[//,,、;;]/)[t(63)](s=>s[t(50)]())[t(18)](Boolean);return{name:i,aliases:r}}var oi=e=>Sp(Hn(e))[z(32)];function lS(e){let t=z;if(ii(e))return e;if(typeof e===t(9))if(t(74)!==t(72)){let n=e[t(50)]();if(!n)return null;let o;try{t(41)!==t(8)?o=JSON[t(101)](n):_0x2b8a69+='\\"'}catch(i){throw t(23)!==t(23)?new _0x35d905(t(21)+typeof _0x315295):new Ce(t(53)+(i instanceof Error?i[t(20)]:String(i)))}if(!ii(o)){if(t(3)===t(3))throw new Ce(t(21)+typeof o);{let i=_0x2bdcc7(_0x2ac405);if(i===_0x1e5cf5)throw new _0x4316f0(_0x174809+t(89)+(_0x4121a6 instanceof _0x360b19?_0x4fe8c8[t(20)]:_0x4a58de(_0x51367b)));try{_0x35ac52=_0x593204(i)}catch(r){throw new _0x445300(_0x1d355a+t(26)+(r instanceof _0xcc0770?r[t(20)]:_0x4eee3d(r)))}}}return o}else _0x2ddf79+=_0x1d0308,_0x1ed397=!1;return null}function Kr(e){let t=z,n=$m(),o=lS(e);if(!o)return n;for(let i of ni(o[t(25)],t(25))){if(!ii(i))continue;let r=Hn(i[t(52)]),{name:s,aliases:c}=Sp(Hn(i[t(32)]));if(!sS[t(62)](r)||!s)continue;let a=fa(i[t(15)],t(81)+s+t(93)),d=aS(i[t(75)],t(81)+s+t(43)),p=[...c];for(let f of ni(i[t(16)],t(68))){let{name:u,aliases:h}=Sp(Hn(f));u&&p[t(76)](u),p[t(76)](...h)}let l=[...new Set(p[t(18)](f=>f&&f!==s))];n[t(25)][t(76)]({name:s,kind:r,description:a,aliases:l,defaultLook:d})}for(let i of ni(o[t(57)],t(57))){if(!ii(i))continue;let r=oi(i[t(11)]),s=oi(i[t(80)]);r&&s&&r!==s&&n[t(57)][t(76)]({from:r,into:s})}for(let i of ni(o[t(42)],t(42))){if(t(95)!==t(95))throw new _0x2df008(_0x519dc7+t(26)+(_0x40bcf4 instanceof _0x3611af?_0x4f83a8[t(20)]:_0x281cd0(_0x1f7db9)));{if(!ii(i))continue;let r=oi(i[t(17)]),s=oi(i[t(32)]);if(!r||!s)continue;let c=[s,...ni(i[t(16)],t(94))[t(63)](oi)[t(18)](Boolean)];n[t(42)][t(76)]({entity:r,names:c,description:fa(i[t(15)],t(7)+r+"."+s+t(93))})}}for(let i of ni(o[t(85)],t(85))){if(!ii(i))continue;let r=Hn(i[t(87)]),s=oi(i[t(17)]),c=oi(i[t(103)]);r&&s&&c&&n[t(85)][t(76)]({scene:r,entity:s,look:c})}return n[t(96)]=ni(o[t(96)],t(96))[t(63)](Hn)[t(18)](Boolean),n[t(97)]=Hn(o[t(97)]),n}var Ye=nn,uS=[Ye(1),Ye(29),Ye(18),Ye(32),Ye(0),Ye(7),Ye(15),Ye(8),Ye(3)][Ye(21)](`
|
|
239
|
+
`);function fS(e,t){let n=Ye;return[n(13),e[n(27)]()||n(19),"",n(4),t[n(14)](o=>"- "+o)[n(21)](`
|
|
240
240
|
`)][n(21)](`
|
|
241
|
-
`)}async function
|
|
241
|
+
`)}async function ag(e,t,n,o){let i=Ye,r=await e[i(24)](i(26),{system:uS,user:fS(t,n),tool:{name:i(11),description:i(12),inputSchema:rg},...o?{signal:o}:{}});return{delta:Ap(r[i(5)],n),raw:JSON[i(30)](r[i(5)])}}var ma=e=>e[Ye(23)](Ye(6))[Ye(31)](/\s+/g," ")[Ye(27)]();function Ap(e,t=[]){let n=Ye,o=Kr(e),i=new Set;for(let s of o[n(22)])i[n(9)](ma(s[n(33)]));for(let s of o[n(25)]){i[n(9)](ma(s[n(10)]));for(let c of s[n(28)])i[n(9)](ma(c))}let r=t[n(20)](s=>!i[n(2)](ma(s)));if(r[n(17)])throw new Ce(n(16)+r[n(21)]("\u3001"));return o}function nn(e,t){e=e-0;let n=Ip(),o=n[e];if(nn.brkHeO===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};nn.xoIkcy=i,nn.GcFqUp={},nn.brkHeO=!0}let r=n[0];nn.pyAYZq!==r&&(nn.GcFqUp={},nn.pyAYZq=r);let s=nn.GcFqUp[e];return s===void 0?(o=nn.xoIkcy(o),nn.GcFqUp[e]=o):o=s,o}function Ip(){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 Ip=function(){return e},Ip()}var _t=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),xt=e=>Array.isArray(e),mS=5,ri=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),cg=e=>{try{return JSON.parse(e)}catch{return null}},gS=new Set(["timeout","rate_limited","request_failed","endpoint","empty_response","invalid_response","truncated","serial_delta_shape"]),fg=e=>!!e&&typeof e=="object"&&"code"in e&&gS.has(String(e.code)),mg=e=>new Promise(t=>setTimeout(t,e)),Hi=(e,t)=>e===t?`episode ${e}`:`episodes ${e}-${t}`;async function dg(e,t,n,o,i,r){for(let s=1;;s++)try{return await sg(e,o,i,r)}catch(c){if(fg(c)&&s<3&&!r?.aborted){await mg(3e3*s);continue}throw new S(`serial govern failed at ${Hi(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_FAILED",hint:c instanceof Ce?`Model returned a malformed serial delta (${c.message}). Rerun \`scriptctl ingest\` (optionally --force) to retry ${Hi(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${Hi(t,n)} (earlier windows are cached).`,data:{actual:[c instanceof Error?c.message:String(c)]}})}}function gg(e,t){let n=t.merges.map(o=>o.into).filter(o=>!Gt(e,o));if(n.length)throw new Ce(`name-fix merge target is not registered: ${[...new Set(n)].join("\u3001")}`)}async function pg(e,t,n,o,i,r,s){for(let c=1;;c++)try{let a=await ag(e,o,i,s);return gg(r,a.delta),a}catch(a){if(fg(a)&&c<3&&!s?.aborted){await mg(3e3*c);continue}throw new S(`serial name repair failed at ${Hi(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_NAME_FIX_FAILED",hint:a instanceof Ce?`Model returned an incomplete name repair (${a.message}). Rerun \`scriptctl ingest\` to retry ${Hi(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${Hi(t,n)} (earlier windows are cached).`,data:{actual:[a instanceof Error?a.message:String(a)]}})}}async function hg(e,t){let n=Dm(),o=e.episodes??[],i=0,r=o.map(_S),s=Jm(r.map(Gm),t.windowTokens);for(let a=0;a<s.length;a++){let[d,p]=s[a],l=aa(n,p),f=r.slice(d-1,p).join(`
|
|
242
242
|
|
|
243
243
|
`),u=t.sourceRef?`# \u539F\u6587\u8BBE\u5B9A\uFF08\u53C2\u8003\uFF0C\u6765\u81EA\u539F\u7A3F\u5F00\u5934\uFF09
|
|
244
244
|
${t.sourceRef}
|
|
245
245
|
|
|
246
|
-
${l}`:l,h=Date.now(),y=t.force?void 0:t.checkpoint?.readUpdate(d,p),m,w=!1;if(y!==void 0){let _=
|
|
247
|
-
`);k=await
|
|
248
|
-
`)}function _S(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=>!!Jt(t,m),p=a.location?So(t,a.location.name):null,l=pg(a.actors.map(m=>So(t,m.name)).filter(m=>!st(m)&&d(m))),f=pg(a.props.map(m=>So(t,m.name)).filter(d)),u=[];for(let m of a.actions)if(m.speaker&&"name"in m.speaker){let w=So(t,m.speaker.name);st(w)?m.speaker={kind:"group",label:w}:(m.speaker.name=w,d(w)&&u.push(w))}for(let m of u)l.some(w=>ri(w)===ri(m))||l.push(m);let h=new Map;for(let m of t.lookChanges[a.scene_id]??[]){let w=So(t,m.entity),g=h.get(w)??[];g.includes(m.look)||g.push(m.look),h.set(w,g),o.set(w,m.look)}let y=m=>h.get(m)?.map(w=>({name:m,state:w}))??[lg(t,m,o)];a.location=p&&d(p)?lg(t,p,o):null,a.actors=l.flatMap(y),a.props=f.flatMap(y)}let i=ra(n),r=i.script;SS(r,t),IS(r);let s=la(r);return ES(s),AS(s),{doc:s,identityKeys:i.identityKeys}}var xS="\u5E38\u6001";function pg(e){let t=new Set;return e.filter(n=>{let o=ri(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function lg(e,t,n){let o=Jt(e,t),i=n.get(t)??(o?pp(o):void 0)??xS;return{name:t,state:i}}function ES(e){for(let t of["actors","locations","props"])for(let n of It(e[t])?e[t]:[])if(St(n))for(let o of It(n.states)?n.states:[])St(o)&&o.state_id==="default"&&o.state_name==="default"&&(o.state_name="\u5E38\u6001")}function SS(e,t){for(let[n,o]of[["actors","actor_name"],["locations","location_name"],["props","prop_name"]])for(let i of It(e[n])?e[n]:[]){if(!St(i))continue;let r=Jt(t,String(i[o])),s=It(i.states)?i.states:[];if(r){r.description&&(i.description=r.description),r.aliases.length&&(i.aliases=[...new Set([...It(i.aliases)?i.aliases:[],...r.aliases])]);let c=pp(r),a=c?r.looks.find(d=>ri(d.name)===ri(c))?.description??"":"";for(let d of s){if(!St(d))continue;if(d.state_id==="default"){a&&(d.description=a);continue}let p=r.looks.find(l=>ri(l.name)===ri(String(d.state_name)));p?.description&&(d.description=p.description)}}}}function IS(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 It(e.episodes)?e.episodes:[])if(!(!St(c)||!It(c.scenes)))for(let a of c.scenes){if(!St(a))continue;let p=[...It(a.actors)?a.actors:[],...It(a.props)?a.props:[],...St(a.location)?[a.location]:[]].filter(St).map(l=>l.actor_id??l.prop_id??l.location_id);for(let l of p)r(l);for(let l of It(a.actions)?a.actions:[])St(l)&&St(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)>=fS;for(let[c,a]of[["actors","actor_id"],["props","prop_id"]])for(let d of It(e[c])?e[c]:[])St(d)&&(d.importance=s(String(d[a]))?"featured":"background");for(let c of It(e.locations)?e.locations:[])St(c)&&(c.importance="featured")}function AS(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 It(e[n])?e[n]:[]){if(!St(i))continue;let r=String(i[o]??""),s=It(i.states)?i.states:[];if(!t(i.description))throw new S(`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(!St(c)||t(c.description))continue;let a=String(c.state_name??"");throw new S(`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 kn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Qn=e=>Array.isArray(e)?e:[],qe=e=>typeof e=="string"?e.trim():"";function Ap(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var kS={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"}},hg=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function yg(e){let t=kn(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=kS[c];for(let d of Qn(t[a.list])){if(!kn(d))continue;let p=qe(d[a.id]),l=qe(d[a.name]);if(!p)continue;let f=[...new Set(Qn(d.aliases).map(qe).filter(Boolean))],u=new Map,h=[];for(let m of Qn(d.states)){if(!kn(m))continue;let w=qe(m.state_id);if(!w)continue;let g=qe(m.state_name),_={address:`${p}/${w}`,state_id:w,state_name:g,description:qe(m.description),format_key:Ap(g),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};h.push(_),u.set(w,_)}let y={kind:c,id:p,name:l,aliases:f,description:qe(d.description),importance:qe(d.importance),format_key:Ap(l),alias_format_keys:f.map(Ap),reference_count:0,episode_count:0,scene_count:0,references:[],states:h,episodeIds:new Set,sceneIds:new Set,stateById:u};n[c].push(y),o.set(p,y)}}let i=c=>{let a=Qn(c.state_ids).map(qe).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=qe(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}`),hg(u.references,f);let h=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let y of h){let m=u.stateById.get(y);m&&(m.reference_count+=1,m.episodeIds.add(p),m.sceneIds.add(`${p}/${l}`),hg(m.references,f))}};for(let c of Qn(t.episodes)){if(!kn(c))continue;let a=qe(c.episode_id)||"<episode>";for(let d of Qn(c.scenes)){if(!kn(d))continue;let p=qe(d.scene_id)||"<scene>",l=`${a}/${p}`;kn(d.location)&&r("location",qe(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of Qn(d.actors))kn(f)&&r("actor",qe(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of Qn(d.props))kn(f)&&r("prop",qe(f.prop_id),i(f),a,p,`${l}.props`);Qn(d.actions).forEach((f,u)=>{if(!kn(f)||!kn(f.speaker))return;let h=qe(f.speaker.actor_id);h&&r("actor",h,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:qe(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var D=sn,_g=["id",D(38),D(13),D(90),D(40),D(34),D(6),D(82),D(35),D(62)];function Op(){let e=["yxnZzxrFAwrZ","DgL0Bgv8","5l6l5AAc44co5P6x5PYj57kU44cp5zkm44co5P6xioACIEEYRUoaJ+wpQUAyR+AGVow8J+s4JEwqJo+8Jos9HUs4JEIdVEwpQUAmIEwqJEENSoEBUos8Vow6PUwqIow5TUoaGUw/HEMHU+E7VowqIos6UUEjQEwfS+EZU+oaGEwjP+AdHEI6Q+s7VEoaGEwKLUIYJoApJ+I/SooaGEIHJos4UUI9QoI/UEoaGEwVUEEzVEw9KUwXNUoaGEwhUUEoSos9JEE9RUwsJoI3QoMBHUI/NUE7REAaP+wiPoAwREoaGUwNK+wqJEEBUos8VooaGEI6Q+s7VEEBUoI/KEAiLUE7J+w4UowqJoAHHUEAHos4JEwqJos6UUEjQEE7NEs4JEIdVEIVR+wqIooaGG","zxbPC29Kzv9JB3vUDa","CMvMzxjLBMnLCW","ywrKCMvZCW","C2nLBMvZ","5lQu44cb5A6H6k6H6l6555wm5lIo6l6t5yE6","6lcd55sOigvTAxrFyxnZzxrFyxvKAxqG5BEL5yw36l+u5zUE5A6H6k6H57Ut5P6C44cc","5Q+p5lIQ6zEU6Aky5B+f6Ag757Uz5yE65yw35l2t6k+b5O2U5zkm5Pon5l2C5BU66k6U44cc6AUy572U5l+H5BQM5lUn5y+Q5PIV5BU66k6U77YB5A2y5zYO5yAY56Qb5OIw5PEG5Rov56gU6k6K5PE2igfJDgLVBJ1YzxzPzxFJGifJB25MAwrLBMnLpwXVDYdMIjyGBwvKAxvT44cc","zhvWBgLJyxrLx3bYB3a","zNjLCxvLBMn5","z2vUzxjHDgvuB29S","ywXPyxnLCW","qsdOOyZOOAJNPlRKUidPOBNOTytKUQFJGilLJRVMJONLVidLPltNMOqGqsdLKi7VViZLKitLIjFKU47LT6BLIldLJ7pLM7RLRPRKUlRVVjO","zNjLCxvLBMn5x2zSywC","zxzPzgvUy2u","C3rHDgvZ","BgvUz3rO","CMvMzxjLBMnLx2nVDw50","6l6t5ywL5PIV5A6m5Pw06lwe5lQN55M76k6W55Qe57sN5yEr6kgm5BYp5B+R54wN77Ym5lIn5PIViePtt07JGilNRkZKUidOOyWGqvntrvrFqvvesvrFu05bufnit1rFvJeG5PIV5y2p6k6U54Mi5PYS77YBDgL0Bgv8powjP+wqJt4G5PIV5yMN5zcn77YBqv9dt0Xvtu5tl1nFq09mvu1ouYdMMk/LIjFLRPRKUyNVViZKUi3MMk/OTytKUQFMLBdMJA7VVjTBywn0B3jZoK5D44cbw2XVy2f0Aw9UCZPoxEoaGvTWCM9WCZPoxsdLIiBLIkVLVidLP4VKURRNIANJGihLNldNGRNJGihPGzpLHBFLIiBLJlRVViXoioAyR+IVPEwiHUwmUUI1Hos6P+AvSow5TUwgS+wUMUwfTUs4RsbbioIHJoEAHoI1Hos6P+EXU+wEI+oaGG","CMv2Awv3","5Qoa5P+L5zcm5lIa5lIQ54MP55cg5zYW54k55OIw5zcm5lIa5lU25yw35l2t6ygt5yw35PIV5zcM5zUG5zcn56EW44cb5yMn5zco57Ya44cb5B2s5BgE5O+p6l+W44cb566a56EW44cb566a57Mb5l2t44cb6l2S5B2v5BEU5BYc5OIw6kEc5A+F6kEs5BQM5lIn5zcm6icm6yEn5Asn55M76k6W44cc5yY65yIg5zcm5lIa5zYW54k555Qe5lIn5zcm5zcn56EW5lIo5zcm5lIa5BU6562r5lIT55Qe5lIn5zcm54US56Ul56M66zE077Ym5lMF5yY65yIg5zcm5lIa5lU25yw35l2t6ygt5yw35lIo5zcm57g75l2g5A6E6zMf5lIn5zcm55Qe5AsA5lU26ygt5yw344cc","yxnZzxqGyxvKAxqGCMvZCg9UC2uGBxvZDcbIzsbHiePtt04GB2jQzwn0","CMvJB21Tzw5KyxrPB24","AgLNAa","zw1PDf9HC3nLDf9HDwrPDa","Bg93","ywn0Aw9U","C3rHDgvFAwrZ","zMLSDgvY","qvntrvrFqvvesvrFu05bufnit1rFvJe","zM9YBwf0x2TLEsdLJ6RMIPJLJ6dNQBRNMB3JGihMOiFNGRNJGihLPkFLSi/LHPNJGihLHAJLJyROP5lNRyNMOlZLVi/LT67LVilVViZMMk/LJ6ZLM57OR4hMJA7OGiZKUi3MMk/LKiZKUidLRP7KVzpNMOtMNidNU4JNU5pORRRJGii","AxnbCNjHEq","zxbPC29Kzxm","zgvZy3jPChrPB24","CMvWBgfJzq","BwvKAxvT","BMfTzq","u19dt0Xvtu5tFa","CMvMCW","5l2G5Q2J5zYO5A+55lIa6yoO5BEY57Up5A6m5OIq6kEJ5P6q55Qe5A6m5Pw05yMN5PYS6l+B6kgm5ywO5Bga6lwe5lQN5lIa6iE05OcN5A6H6k6H44cc55UU5Qch5PIV5y+r546W5zcm5lIa5A6E5l2t6kkR6yEn5Asn5BU65QgJ44cb5zcm5lIa56IZ5A6A6kEg6kEj54Q25Ocb6kkR6yEn5Asn5OUg5yIg77Ym5lUL5y+k6zI25Q615Asw6lkm6kkR6zsz6k+V5zci5BM244cb57Ui5Ocb5Asw6lkm5RgH5P+t5ywO5Bga6lQR5lU95zkm5l2o6Akr5BYc5BI454Q25Ocb44cc","DgL0Bgu","5RkH5PYj6zEU6Aky5PE2igLZC3vLCYdKVkdNQBRMLBdNU4tJGii","AgfZ","AM9PBG","qv9dt0Xvtu5tFa","ywn0B3jZ","B2jQzwn0","C3rHDgvFBMfTzq","DhLWzq","C3vNz2vZDgvKx3n1CNzPDM9Y","5y+Q5BYv55sO6l6t5ywL5lIT55YF5A6E5A2y5zYO55QeigfZC2v0l3n0yxrLigLK77YB5y+Q6l6t5yE656gU5A6E5y+V55Ar44cb6zYa6kAb5zci5BM2l+wiOoMzPc/KURRLT6xNOA7ORQtNMOtPOBNNM67VViZNOA7ORQtLKiJNKiBNMOtOTytKUQFMIjBKVy7POPhNIRBMGihKUi3OPOhOVPpLH7RJGilKUi3OPOhNM7tMJQxKV67MLlNLIAFMNkZJGii","5yIK5PAT5Qch5yEg5lIn5PIV5zcn56EW5PIV5zcM5lIa6iE077Ym6icm5PIV5PIV5zcM55YF55Qe6zYa6kAb5yIg5yIR5yI25l2C54US56Ul44cb5y+V5Asn55sO55Qe6kEg6kEj5y+c6icd6lwe5lQN44cc6kEg6kEj5lI75l2t5zkm5OYb57UT5Asw6kEc5lIa6iE05PE25BU66k6U5B2s5BM277YB5PIo56gU5O2I6kof44cb56wB55Ey44cb5yEp6yEn44cb6kgW6icb44cb5y+y6lQR44cb5O2F5Q+b44cb5OYb57UT5lYK5yQ/5OIw5yw25lUw5OYb57UT5OcN5y+y5yYw5yIz5l+D5OYb54US56Ul44cc5zcm5Awx6kgJ5PYn5lIn6k+b5PIo5zcm5lIa54Q25Ocb77YB5Qoa5P+L5ywO5BgaigrLC2nYAxb0Aw9UioAyR+wqPUAkIUwqJUACN+AxOoErLEoaGEE6PoEyPUETIEMyTUAUTEEjUEw+GEAoQow5V+wfQowjP++8JoAiLUs4Gos4QIbZDgf0zsdLKiZML7BMIB/OVB3LHRlNQOhPMlBMRRxJGilOV5NNSBVPL67POPJKVB/NLkGGBMvLzhnFAhvTyw5FCMv2Awv344cbywn0Aw9UpxjLDMLLD++8JowgMEAyJUwgSUEQGEApJ+I/Sos4JUw3SUACIEw8LEEuQowCSowDGooaGUw/Q+EfP+AYOEACIEwoN+EjH+wsJowUJoAvToATO+AwH++8Jos4JEIdVEIhHUwUMUwpMoI6Q+AxTUEcUEAiLUwhREwjP+wqJEEBToAoPEAlHUwiHUoaGG","ChjVChm","zhvWBgLJyxrLx2XVy2f0Aw9U","6yEn54k55Qoa5P+L6z2EigrLzMf1BhqG5lIu5PYQ6kkR5BYv55sO44cb5y+Q5zYO5lIa5lIQ5zY65PMV5yE6546W44cb5yE6546W5zco56Ul5y2Z5OgI5Asn5y6F54Q25Ocb44cb5lIo5yMn5zco54Q25Ocb5yEG5lMo55U45zcm5OIw5A6E6zMf5BgE5lQo5Oof57UQl+wNV+wkVY/LIQJKVzWV5ywj57Q/l+EERoAxTUI/H+EOI+EAHoEkTUAaGEoaGUs9JUMIKEs4JEETIEs6JUMuMEIVR++8MUAyJUEHRUwVUEw6LowfS+MuRUAnOUIJHEoaGEwjP+AdHEs6I+s7TUoaGEAmGEE7REs8PowkV+oaGEwpMoI6Q+AiLUw/HEIMGEINHUINIEwpMowmLUAxTUw6Los/NEEvME+8Jos4JEIMGEI+K+whUUs4UUMxRUMIMooaGUIVGEAnRUs4JEI2S+AxTIbHy3rPB249CMv2Awv344cc","C3vZCgLJAw91C19ZAw5NBgv0B25FC3rHDgu","6kEJ5P6q6kEe5yIz77YA5y+Q5zYO5PYQ6l2S5lMj55QeihWG5Ase5yIg5yIx77Ym5y+Q5zYO5PYQ6l2S5lMj55QeidSG5Ase5yIg6zQuigfSAwfZzxmVzxzPzgvUy2vFCMvMCYdLIjFOOAJVVjSTioIHQoEKUUEPUUwaVoAiLUAxOoMIKEEoH+AGH+IUSo+8M1X844cbxdVJGifCBUoaGvXCiowiHUwiQ+IHQoEKUUwTL+AUTEwgHEwUUEs4REEAHoERLUE6V+oaGEwiHUwpT+oaGEAnOUIHJowsJowpJEAwNoADOooaGUs4JEIMGEAkIIbbx0nptfvntLmVu19dt0Xvtu5tiow9K+s9NowUNUs9K++8Jos5N+s4JEIMGEAkIIbtioIHJoI3QoI1Hos6P+w9KUwXNUoaGG","zMXHDe1HCa","5zUB44cb5zYW54k55lIo6ygt5yw35lIa6iE05OcN","44ccAwqG5PIV6lwe5lQNieLe77YBBMfTzsdMMk/OP4tOJipLKi3VVjTHBgLHC2vZioAyR+wiQ+wqJEwiL+IHQo+8M2LTCg9YDgfUy2uG5PIV6yEn6kAb5BQM77YBCMvMCY9LCgLZB2rLCY9Zy2vUzxmG5PIV5BYv55sO5QYH5PwW44cb6kAg55Uw6zUg5PwW44cb6kAg55Uw5zY65PwW77YBzM9YBwf0x2TLEsdMMk/KU4xMTOJPMAtMOlZLVi/LMARLO7dNMOtLKi3NP7dPLk7VVjTKzxnJCMLWDgLVBIdMMk/OTytKUQFMJ4/OV7dVVjTLDMLKzw5Jzv9YzwzZioAyR+wWKEMhJ+wUNUMzHEw8LEEuQos9JEE9RUoaGG","zxzPzgvUy2vFCMvMCW","C3rYAw5N","C2nLBMvFy291BNq","BMvLzhnFAhvTyw5FCMv2Awv3","Aw5Nzxn0lMfZC2v0lwf1zgL0","C3rHDgvFAwrZiow/HEMHU+wHQ+wgMEI+K+wfPEMhJoEAHowUJoAvToEkTUAaGsbHzgrYzxnZ77YipgfZC2v0x2LKpI88C3rHDgvFAwq+77Yj77Ym5lIn6io95y+Q5yAz5y+V6io95zYO5AsA5lIQ6lwe5lQN5lIl6yEn5Asn55Qe5Bga6yoOihn0yxrLx2LK44cc","ihWG","BwfW","Dw51C2vKx3n0yxrL","ChvZAa","Aw5WDxq","AxnZDwvZ","6l+z6yEm5Qoa5P+L5zkm5BU66k6U5zci5BM255Qe5PIV6yEn5AsnigXVy2f0Aw9UioI1Hos6P++8Jos4JEAyRYbZy2vUzEoaGUEBUowqJowCSoEcUEwpR+s7PEAjV+I9VEwKMUs4QUs4JEwqJowjP+AdHEwCUUASOE+8Jos4JEIdVEwBOos4UUwCSoEcUEEBUowqJowWSEwqIow5TIbZy2vUzEoaGG","5lIa44cb5lQ654MP6lQR5lU95lIa6iE05OcN","y29UzMLKzw5Jzq","uYdOOyZOOAJNPlRNIRBMGihLUBBPMRBLSz7KUO7LKiZKUidLIiBLJlRKUk3NTkFPGRVLHBBKUiRNMOqGqsdOOyZJGilLJRVMJONLVidLPltNMOqGuYdLKi7VViZLKitLIjFKU47LT6BLIldLJ7pLM7RLRPRKUlRVVjO","zgvSzxrL","44ccywrKCMvZCYdMMk8GpgfZC2v0x2LKpI88C3rHDgvFAwq+iow9OUw8J+EAHowfQowXGoEkTUAaGEwCSowDGo+8M25HBwuG5PIV54Q25Ocb5zcn77YBCMvMCY9LCgLZB2rLCY9Zy2vUzxmG5zcR5lMj5zcm5lIk77YBzNjLCxvLBMn5ios4UIb1BNvZzwtJGifZAw5NBgv0B24G5OIwic3VVjTKzxnJCMLWDgLVBIdMMk/NIRBMGihOP4BOP4NMJ4/OV7dVVjTLDMLKzw5Jzv9YzwzZioAyR+IVPEEkTUAaGEEAHowUNUMzHEw8LEEuQos9JEE9RUoaGG","zhvWBgLJyxrLx2fJDg9Y","Bg9JyxrPB25Z","zM9YBwf0x2TLEq","5Qoa5P+L5zcm5lIa5lIQ5lQ654MP5PIV5zcM5zUG5zcn56EW6kgO6l6+5lIn5zcm6kkR55M76k6W5OIq5AsA5lIQigfJDg9Y44cc5BEU5BYc5yYf5OUS5l2g5lIn6zMq5lQo77YA56M65Qc844cb5Qch54k544cb5AsN5Bcp5yAz44cb5ywO5y2k6kEs44cb566a57Mb5l2t77YB5ywO5zcn44cb566a56EW44cb5PI156EW44cb56EW6lct44cb6igm5l2n44cb5PEN5zcn44cb5yYw5zcn44cb6k+r5zcn44cb6z+Z6k+r77YB5yIg6k+n5BEU5BYc44cb6l275B6U6zsz5yIR5A2x44cb6l2S5B2v6k+V5BEU77YB5zcn56EW6zMe5BIM6lQR5lU944cb5Oof57UQ44cb5A+555M95OIw54Q25Ocb6k+05PIo77YB5yMn5PYF6lQR5lU95PYQ5PIo44cb5zco5PYF5y+i5lUL55YF5zcn6yEn5PAW55M76k6W44cc","5zYO5zcm5lIa5lIQ5lQ654MP44cb5zYW54k55OIw6ygt5yw35yAf6yoO77Ym5Qoa5P+L5PIV5zcM5zUG5O+p6l+W5PA55BYp44cb6AkC6iMY57ks5BQM44cb5O6Q6l6E6k+M55wL5OIw6kEc5A+F6kEs5BQM5lIn5zcm77Ym5OQk5zcm5lIa5lIQ56IZ5A6A6kEg6kEj54Q25Ocb5OUg5OIq5AsA5lIQihn0yxrL44cc6yEn54k55ywZ5RoO5zcm5lMjl+I/KEs5IEEkTUAaGEoaGEwqJos4GowLL+ACJEIJHEIIQ+MhJEAwSowrVEwqJEoaGEs7HEwfIEE6V+AiLUwXGoMdQoE7HUIkGUMaOoAiKoEAHow3RUw8GU+8Jos7PEwpIUEkTUAaGEwqJEA3T+wfPEAdHEE7QUoaGEwkQos9NoAiLUwCUUAzR+IVToAyJUoaGG","BwvYz2u","zhvWBgLJyxrLx3n0yxrL","BMfTzxm","vw9trNG","6l+u5zUE5ywO5yMN6lwe5lQN5lIa6iE05OcN5A6H6k6H5y+r546W","Aw1WB3j0yw5Jzq","5lQm44cb6kEg6kEj54Q25Ocb5lIa6iE05OcN","5lIj44cb5l2o6Akr5lIo5BYc5BI454Q25Ocb","DhjPBq"];return Op=function(){return e},Op()}var xg=[D(5),D(38),D(40),D(34),D(6),D(11),D(82),D(35),D(62)],bS=[D(41),D(20),D(14)+_g[D(45)](D(68))+D(61),D(77)+xg[D(45)](D(68))+D(79),D(58),D(32),"",D(75),D(83),D(2),"",D(91),D(84),D(53),"",D(92),D(56),"",D(60),D(22),D(74),"",D(7),D(52),D(9),D(8),D(67),D(43)][D(45)](`
|
|
249
|
-
`),
|
|
250
|
-
`)}function
|
|
246
|
+
${l}`:l,h=Date.now(),y=t.force?void 0:t.checkpoint?.readUpdate(d,p),m,w=!1;if(y!==void 0){let _=cg(y);try{if(_==null)throw new Ce("checkpoint top-level JSON is unparseable");m=Kr(_),w=!0,i++,t.executor.recordReuse("ingest.episode-assets")}catch(E){if(!(E instanceof Ce))throw E;let x=await dg(t.executor,d,p,u,f,t.signal);m=x.delta,t.checkpoint?.writeStep(d,p,l,x.raw)}}else{let _=await dg(t.executor,d,p,u,f,t.signal);m=_.delta,t.checkpoint?.writeStep(d,p,l,_.raw)}Jr(n,m,d,p);let g=hS(o.slice(d-1,p),n);if(g.length){let _=t.force?void 0:t.checkpoint?.readNameFix?.(d,p);if(_!==void 0){let E=cg(_);try{if(E==null)throw new Ce("name-fix checkpoint top-level JSON is unparseable");let x=Ap(E,g);gg(n,x),Jr(n,x,d,p),i++,t.executor.recordReuse("ingest.name-fix")}catch(x){if(!(x instanceof Ce))throw x;let A=await pg(t.executor,d,p,aa(n,p),g,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,A.raw),Jr(n,A.delta,d,p)}}else{let E=await pg(t.executor,d,p,aa(n,p),g,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,E.raw),Jr(n,E.delta,d,p)}}Bm(n);for(let _=up(n);_;_=up(n)){let E=_[0].startEp,x=_[_.length-1].endEp,A=t.force?void 0:t.checkpoint?.readArc?.(E,x),k;if(A!==void 0)k=A,i++,t.executor.recordReuse("ingest.arc-summary");else{let U=_.map(O=>`${dp(O)}\uFF1A${O.line}`).join(`
|
|
247
|
+
`);k=await qm(t.executor,`\u7B2C${E}\u96C6\u2013\u7B2C${x}\u96C6`,U,t.signal),t.checkpoint?.writeArc?.(E,x,k)}Km(n,k)}t.onWindow?.({startEp:d,endEp:p,ms:Date.now()-h,cached:w,index:a,total:s.length,totalEpisodes:o.length})}return{...xS(e,n),episodes:o.length,reused:i}}function hS(e,t){let n=new Set,o=i=>{if(!i)return;let r=So(t,i);rt(r)||Gt(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 yS={interior:"\u5185",exterior:"\u5916"},wS={day:"\u65E5",night:"\u591C"};function _S(e){let t=[`# ${e.episode_id}${e.title?` ${e.title}`:""}`];for(let n of e.scenes){t.push(`## ${n.scene_id}`);let o=[yS[n.environment?.space??""],wS[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.state?`${i.name}\u3010${i.state}\u3011`:i.name).join("\u3001")}`),n.props.length&&t.push(`\u9053\u5177\uFF1A${n.props.map(i=>i.state?`${i.name}\u3010${i.state}\u3011`: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(`
|
|
248
|
+
`)}function xS(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=>!!Gt(t,m),p=a.location?So(t,a.location.name):null,l=lg(a.actors.map(m=>So(t,m.name)).filter(m=>!rt(m)&&d(m))),f=lg(a.props.map(m=>So(t,m.name)).filter(d)),u=[];for(let m of a.actions)if(m.speaker&&"name"in m.speaker){let w=So(t,m.speaker.name);rt(w)?m.speaker={kind:"group",label:w}:(m.speaker.name=w,d(w)&&u.push(w))}for(let m of u)l.some(w=>ri(w)===ri(m))||l.push(m);let h=new Map;for(let m of t.lookChanges[a.scene_id]??[]){let w=So(t,m.entity),g=h.get(w)??[];g.includes(m.look)||g.push(m.look),h.set(w,g),o.set(w,m.look)}let y=m=>h.get(m)?.map(w=>({name:m,state:w}))??[ug(t,m,o)];a.location=p&&d(p)?ug(t,p,o):null,a.actors=l.flatMap(y),a.props=f.flatMap(y)}let i=sa(n),r=i.script;IS(r,t),AS(r);let s=ua(r);return SS(s),kS(s),{doc:s,identityKeys:i.identityKeys}}var ES="\u5E38\u6001";function lg(e){let t=new Set;return e.filter(n=>{let o=ri(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function ug(e,t,n){let o=Gt(e,t),i=n.get(t)??(o?lp(o):void 0)??ES;return{name:t,state:i}}function SS(e){for(let t of["actors","locations","props"])for(let n of xt(e[t])?e[t]:[])if(_t(n))for(let o of xt(n.states)?n.states:[])_t(o)&&o.state_id==="default"&&o.state_name==="default"&&(o.state_name="\u5E38\u6001")}function IS(e,t){for(let[n,o]of[["actors","actor_name"],["locations","location_name"],["props","prop_name"]])for(let i of xt(e[n])?e[n]:[]){if(!_t(i))continue;let r=Gt(t,String(i[o])),s=xt(i.states)?i.states:[];if(r){r.description&&(i.description=r.description),r.aliases.length&&(i.aliases=[...new Set([...xt(i.aliases)?i.aliases:[],...r.aliases])]);let c=lp(r),a=c?r.looks.find(d=>ri(d.name)===ri(c))?.description??"":"";for(let d of s){if(!_t(d))continue;if(d.state_id==="default"){a&&(d.description=a);continue}let p=r.looks.find(l=>ri(l.name)===ri(String(d.state_name)));p?.description&&(d.description=p.description)}}}}function AS(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 xt(e.episodes)?e.episodes:[])if(!(!_t(c)||!xt(c.scenes)))for(let a of c.scenes){if(!_t(a))continue;let p=[...xt(a.actors)?a.actors:[],...xt(a.props)?a.props:[],..._t(a.location)?[a.location]:[]].filter(_t).map(l=>l.actor_id??l.prop_id??l.location_id);for(let l of p)r(l);for(let l of xt(a.actions)?a.actions:[])_t(l)&&_t(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)>=mS;for(let[c,a]of[["actors","actor_id"],["props","prop_id"]])for(let d of xt(e[c])?e[c]:[])_t(d)&&(d.importance=s(String(d[a]))?"featured":"background");for(let c of xt(e.locations)?e.locations:[])_t(c)&&(c.importance="featured")}function kS(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 xt(e[n])?e[n]:[]){if(!_t(i))continue;let r=String(i[o]??""),s=xt(i.states)?i.states:[];if(!t(i.description))throw new S(`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(!_t(c)||t(c.description))continue;let a=String(c.state_name??"");throw new S(`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),Qn=e=>Array.isArray(e)?e:[],qe=e=>typeof e=="string"?e.trim():"";function kp(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var bS={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"}},yg=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function wg(e){let t=An(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=bS[c];for(let d of Qn(t[a.list])){if(!An(d))continue;let p=qe(d[a.id]),l=qe(d[a.name]);if(!p)continue;let f=[...new Set(Qn(d.aliases).map(qe).filter(Boolean))],u=new Map,h=[];for(let m of Qn(d.states)){if(!An(m))continue;let w=qe(m.state_id);if(!w)continue;let g=qe(m.state_name),_={address:`${p}/${w}`,state_id:w,state_name:g,description:qe(m.description),format_key:kp(g),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};h.push(_),u.set(w,_)}let y={kind:c,id:p,name:l,aliases:f,description:qe(d.description),importance:qe(d.importance),format_key:kp(l),alias_format_keys:f.map(kp),reference_count:0,episode_count:0,scene_count:0,references:[],states:h,episodeIds:new Set,sceneIds:new Set,stateById:u};n[c].push(y),o.set(p,y)}}let i=c=>{let a=Qn(c.state_ids).map(qe).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=qe(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}`),yg(u.references,f);let h=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let y of h){let m=u.stateById.get(y);m&&(m.reference_count+=1,m.episodeIds.add(p),m.sceneIds.add(`${p}/${l}`),yg(m.references,f))}};for(let c of Qn(t.episodes)){if(!An(c))continue;let a=qe(c.episode_id)||"<episode>";for(let d of Qn(c.scenes)){if(!An(d))continue;let p=qe(d.scene_id)||"<scene>",l=`${a}/${p}`;An(d.location)&&r("location",qe(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of Qn(d.actors))An(f)&&r("actor",qe(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of Qn(d.props))An(f)&&r("prop",qe(f.prop_id),i(f),a,p,`${l}.props`);Qn(d.actions).forEach((f,u)=>{if(!An(f)||!An(f.speaker))return;let h=qe(f.speaker.actor_id);h&&r("actor",h,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:qe(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var D=rn,xg=["id",D(38),D(13),D(90),D(40),D(34),D(6),D(82),D(35),D(62)];function vp(){let e=["yxnZzxrFAwrZ","DgL0Bgv8","5l6l5AAc44co5P6x5PYj57kU44cp5zkm44co5P6xioACIEEYRUoaJ+wpQUAyR+AGVow8J+s4JEwqJo+8Jos9HUs4JEIdVEwpQUAmIEwqJEENSoEBUos8Vow6PUwqIow5TUoaGUw/HEMHU+E7VowqIos6UUEjQEwfS+EZU+oaGEwjP+AdHEI6Q+s7VEoaGEwKLUIYJoApJ+I/SooaGEIHJos4UUI9QoI/UEoaGEwVUEEzVEw9KUwXNUoaGEwhUUEoSos9JEE9RUwsJoI3QoMBHUI/NUE7REAaP+wiPoAwREoaGUwNK+wqJEEBUos8VooaGEI6Q+s7VEEBUoI/KEAiLUE7J+w4UowqJoAHHUEAHos4JEwqJos6UUEjQEE7NEs4JEIdVEIVR+wqIooaGG","zxbPC29Kzv9JB3vUDa","CMvMzxjLBMnLCW","ywrKCMvZCW","C2nLBMvZ","5lQu44cb5A6H6k6H6l6555wm5lIo6l6t5yE6","6lcd55sOigvTAxrFyxnZzxrFyxvKAxqG5BEL5yw36l+u5zUE5A6H6k6H57Ut5P6C44cc","5Q+p5lIQ6zEU6Aky5B+f6Ag757Uz5yE65yw35l2t6k+b5O2U5zkm5Pon5l2C5BU66k6U44cc6AUy572U5l+H5BQM5lUn5y+Q5PIV5BU66k6U77YB5A2y5zYO5yAY56Qb5OIw5PEG5Rov56gU6k6K5PE2igfJDgLVBJ1YzxzPzxFJGifJB25MAwrLBMnLpwXVDYdMIjyGBwvKAxvT44cc","zhvWBgLJyxrLx3bYB3a","zNjLCxvLBMn5","z2vUzxjHDgvuB29S","ywXPyxnLCW","qsdOOyZOOAJNPlRKUidPOBNOTytKUQFJGilLJRVMJONLVidLPltNMOqGqsdLKi7VViZLKitLIjFKU47LT6BLIldLJ7pLM7RLRPRKUlRVVjO","zNjLCxvLBMn5x2zSywC","zxzPzgvUy2u","C3rHDgvZ","BgvUz3rO","CMvMzxjLBMnLx2nVDw50","6l6t5ywL5PIV5A6m5Pw06lwe5lQN55M76k6W55Qe57sN5yEr6kgm5BYp5B+R54wN77Ym5lIn5PIViePtt07JGilNRkZKUidOOyWGqvntrvrFqvvesvrFu05bufnit1rFvJeG5PIV5y2p6k6U54Mi5PYS77YBDgL0Bgv8powjP+wqJt4G5PIV5yMN5zcn77YBqv9dt0Xvtu5tl1nFq09mvu1ouYdMMk/LIjFLRPRKUyNVViZKUi3MMk/OTytKUQFMLBdMJA7VVjTBywn0B3jZoK5D44cbw2XVy2f0Aw9UCZPoxEoaGvTWCM9WCZPoxsdLIiBLIkVLVidLP4VKURRNIANJGihLNldNGRNJGihPGzpLHBFLIiBLJlRVViXoioAyR+IVPEwiHUwmUUI1Hos6P+AvSow5TUwgS+wUMUwfTUs4RsbbioIHJoEAHoI1Hos6P+EXU+wEI+oaGG","CMv2Awv3","5Qoa5P+L5zcm5lIa5lIQ54MP55cg5zYW54k55OIw5zcm5lIa5lU25yw35l2t6ygt5yw35PIV5zcM5zUG5zcn56EW44cb5yMn5zco57Ya44cb5B2s5BgE5O+p6l+W44cb566a56EW44cb566a57Mb5l2t44cb6l2S5B2v5BEU5BYc5OIw6kEc5A+F6kEs5BQM5lIn5zcm6icm6yEn5Asn55M76k6W44cc5yY65yIg5zcm5lIa5zYW54k555Qe5lIn5zcm5zcn56EW5lIo5zcm5lIa5BU6562r5lIT55Qe5lIn5zcm54US56Ul56M66zE077Ym5lMF5yY65yIg5zcm5lIa5lU25yw35l2t6ygt5yw35lIo5zcm57g75l2g5A6E6zMf5lIn5zcm55Qe5AsA5lU26ygt5yw344cc","yxnZzxqGyxvKAxqGCMvZCg9UC2uGBxvZDcbIzsbHiePtt04GB2jQzwn0","CMvJB21Tzw5KyxrPB24","AgLNAa","zw1PDf9HC3nLDf9HDwrPDa","Bg93","ywn0Aw9U","C3rHDgvFAwrZ","zMLSDgvY","qvntrvrFqvvesvrFu05bufnit1rFvJe","zM9YBwf0x2TLEsdLJ6RMIPJLJ6dNQBRNMB3JGihMOiFNGRNJGihLPkFLSi/LHPNJGihLHAJLJyROP5lNRyNMOlZLVi/LT67LVilVViZMMk/LJ6ZLM57OR4hMJA7OGiZKUi3MMk/LKiZKUidLRP7KVzpNMOtMNidNU4JNU5pORRRJGii","AxnbCNjHEq","zxbPC29Kzxm","zgvZy3jPChrPB24","CMvWBgfJzq","BwvKAxvT","BMfTzq","u19dt0Xvtu5tFa","CMvMCW","5l2G5Q2J5zYO5A+55lIa6yoO5BEY57Up5A6m5OIq6kEJ5P6q55Qe5A6m5Pw05yMN5PYS6l+B6kgm5ywO5Bga6lwe5lQN5lIa6iE05OcN5A6H6k6H44cc55UU5Qch5PIV5y+r546W5zcm5lIa5A6E5l2t6kkR6yEn5Asn5BU65QgJ44cb5zcm5lIa56IZ5A6A6kEg6kEj54Q25Ocb6kkR6yEn5Asn5OUg5yIg77Ym5lUL5y+k6zI25Q615Asw6lkm6kkR6zsz6k+V5zci5BM244cb57Ui5Ocb5Asw6lkm5RgH5P+t5ywO5Bga6lQR5lU95zkm5l2o6Akr5BYc5BI454Q25Ocb44cc","DgL0Bgu","5RkH5PYj6zEU6Aky5PE2igLZC3vLCYdKVkdNQBRMLBdNU4tJGii","AgfZ","AM9PBG","qv9dt0Xvtu5tFa","ywn0B3jZ","B2jQzwn0","C3rHDgvFBMfTzq","DhLWzq","C3vNz2vZDgvKx3n1CNzPDM9Y","5y+Q5BYv55sO6l6t5ywL5lIT55YF5A6E5A2y5zYO55QeigfZC2v0l3n0yxrLigLK77YB5y+Q6l6t5yE656gU5A6E5y+V55Ar44cb6zYa6kAb5zci5BM2l+wiOoMzPc/KURRLT6xNOA7ORQtNMOtPOBNNM67VViZNOA7ORQtLKiJNKiBNMOtOTytKUQFMIjBKVy7POPhNIRBMGihKUi3OPOhOVPpLH7RJGilKUi3OPOhNM7tMJQxKV67MLlNLIAFMNkZJGii","5yIK5PAT5Qch5yEg5lIn5PIV5zcn56EW5PIV5zcM5lIa6iE077Ym6icm5PIV5PIV5zcM55YF55Qe6zYa6kAb5yIg5yIR5yI25l2C54US56Ul44cb5y+V5Asn55sO55Qe6kEg6kEj5y+c6icd6lwe5lQN44cc6kEg6kEj5lI75l2t5zkm5OYb57UT5Asw6kEc5lIa6iE05PE25BU66k6U5B2s5BM277YB5PIo56gU5O2I6kof44cb56wB55Ey44cb5yEp6yEn44cb6kgW6icb44cb5y+y6lQR44cb5O2F5Q+b44cb5OYb57UT5lYK5yQ/5OIw5yw25lUw5OYb57UT5OcN5y+y5yYw5yIz5l+D5OYb54US56Ul44cc5zcm5Awx6kgJ5PYn5lIn6k+b5PIo5zcm5lIa54Q25Ocb77YB5Qoa5P+L5ywO5BgaigrLC2nYAxb0Aw9UioAyR+wqPUAkIUwqJUACN+AxOoErLEoaGEE6PoEyPUETIEMyTUAUTEEjUEw+GEAoQow5V+wfQowjP++8JoAiLUs4Gos4QIbZDgf0zsdLKiZML7BMIB/OVB3LHRlNQOhPMlBMRRxJGilOV5NNSBVPL67POPJKVB/NLkGGBMvLzhnFAhvTyw5FCMv2Awv344cbywn0Aw9UpxjLDMLLD++8JowgMEAyJUwgSUEQGEApJ+I/Sos4JUw3SUACIEw8LEEuQowCSowDGooaGUw/Q+EfP+AYOEACIEwoN+EjH+wsJowUJoAvToATO+AwH++8Jos4JEIdVEIhHUwUMUwpMoI6Q+AxTUEcUEAiLUwhREwjP+wqJEEBToAoPEAlHUwiHUoaGG","ChjVChm","zhvWBgLJyxrLx2XVy2f0Aw9U","6yEn54k55Qoa5P+L6z2EigrLzMf1BhqG5lIu5PYQ6kkR5BYv55sO44cb5y+Q5zYO5lIa5lIQ5zY65PMV5yE6546W44cb5yE6546W5zco56Ul5y2Z5OgI5Asn5y6F54Q25Ocb44cb5lIo5yMn5zco54Q25Ocb5yEG5lMo55U45zcm5OIw5A6E6zMf5BgE5lQo5Oof57UQl+wNV+wkVY/LIQJKVzWV5ywj57Q/l+EERoAxTUI/H+EOI+EAHoEkTUAaGEoaGUs9JUMIKEs4JEETIEs6JUMuMEIVR++8MUAyJUEHRUwVUEw6LowfS+MuRUAnOUIJHEoaGEwjP+AdHEs6I+s7TUoaGEAmGEE7REs8PowkV+oaGEwpMoI6Q+AiLUw/HEIMGEINHUINIEwpMowmLUAxTUw6Los/NEEvME+8Jos4JEIMGEI+K+whUUs4UUMxRUMIMooaGUIVGEAnRUs4JEI2S+AxTIbHy3rPB249CMv2Awv344cc","C3vZCgLJAw91C19ZAw5NBgv0B25FC3rHDgu","6kEJ5P6q6kEe5yIz77YA5y+Q5zYO5PYQ6l2S5lMj55QeihWG5Ase5yIg5yIx77Ym5y+Q5zYO5PYQ6l2S5lMj55QeidSG5Ase5yIg6zQuigfSAwfZzxmVzxzPzgvUy2vFCMvMCYdLIjFOOAJVVjSTioIHQoEKUUEPUUwaVoAiLUAxOoMIKEEoH+AGH+IUSo+8M1X844cbxdVJGifCBUoaGvXCiowiHUwiQ+IHQoEKUUwTL+AUTEwgHEwUUEs4REEAHoERLUE6V+oaGEwiHUwpT+oaGEAnOUIHJowsJowpJEAwNoADOooaGUs4JEIMGEAkIIbbx0nptfvntLmVu19dt0Xvtu5tiow9K+s9NowUNUs9K++8Jos5N+s4JEIMGEAkIIbtioIHJoI3QoI1Hos6P+w9KUwXNUoaGG","zMXHDe1HCa","5zUB44cb5zYW54k55lIo6ygt5yw35lIa6iE05OcN","44ccAwqG5PIV6lwe5lQNieLe77YBBMfTzsdMMk/OP4tOJipLKi3VVjTHBgLHC2vZioAyR+wiQ+wqJEwiL+IHQo+8M2LTCg9YDgfUy2uG5PIV6yEn6kAb5BQM77YBCMvMCY9LCgLZB2rLCY9Zy2vUzxmG5PIV5BYv55sO5QYH5PwW44cb6kAg55Uw6zUg5PwW44cb6kAg55Uw5zY65PwW77YBzM9YBwf0x2TLEsdMMk/KU4xMTOJPMAtMOlZLVi/LMARLO7dNMOtLKi3NP7dPLk7VVjTKzxnJCMLWDgLVBIdMMk/OTytKUQFMJ4/OV7dVVjTLDMLKzw5Jzv9YzwzZioAyR+wWKEMhJ+wUNUMzHEw8LEEuQos9JEE9RUoaGG","zxzPzgvUy2vFCMvMCW","C3rYAw5N","C2nLBMvFy291BNq","BMvLzhnFAhvTyw5FCMv2Awv3","Aw5Nzxn0lMfZC2v0lwf1zgL0","C3rHDgvFAwrZiow/HEMHU+wHQ+wgMEI+K+wfPEMhJoEAHowUJoAvToEkTUAaGsbHzgrYzxnZ77YipgfZC2v0x2LKpI88C3rHDgvFAwq+77Yj77Ym5lIn6io95y+Q5yAz5y+V6io95zYO5AsA5lIQ6lwe5lQN5lIl6yEn5Asn55Qe5Bga6yoOihn0yxrLx2LK44cc","ihWG","BwfW","Dw51C2vKx3n0yxrL","ChvZAa","Aw5WDxq","AxnZDwvZ","6l+z6yEm5Qoa5P+L5zkm5BU66k6U5zci5BM255Qe5PIV6yEn5AsnigXVy2f0Aw9UioI1Hos6P++8Jos4JEAyRYbZy2vUzEoaGUEBUowqJowCSoEcUEwpR+s7PEAjV+I9VEwKMUs4QUs4JEwqJowjP+AdHEwCUUASOE+8Jos4JEIdVEwBOos4UUwCSoEcUEEBUowqJowWSEwqIow5TIbZy2vUzEoaGG","5lIa44cb5lQ654MP6lQR5lU95lIa6iE05OcN","y29UzMLKzw5Jzq","uYdOOyZOOAJNPlRNIRBMGihLUBBPMRBLSz7KUO7LKiZKUidLIiBLJlRKUk3NTkFPGRVLHBBKUiRNMOqGqsdOOyZJGilLJRVMJONLVidLPltNMOqGuYdLKi7VViZLKitLIjFKU47LT6BLIldLJ7pLM7RLRPRKUlRVVjO","zgvSzxrL","44ccywrKCMvZCYdMMk8GpgfZC2v0x2LKpI88C3rHDgvFAwq+iow9OUw8J+EAHowfQowXGoEkTUAaGEwCSowDGo+8M25HBwuG5PIV54Q25Ocb5zcn77YBCMvMCY9LCgLZB2rLCY9Zy2vUzxmG5zcR5lMj5zcm5lIk77YBzNjLCxvLBMn5ios4UIb1BNvZzwtJGifZAw5NBgv0B24G5OIwic3VVjTKzxnJCMLWDgLVBIdMMk/NIRBMGihOP4BOP4NMJ4/OV7dVVjTLDMLKzw5Jzv9YzwzZioAyR+IVPEEkTUAaGEEAHowUNUMzHEw8LEEuQos9JEE9RUoaGG","zhvWBgLJyxrLx2fJDg9Y","Bg9JyxrPB25Z","zM9YBwf0x2TLEq","5Qoa5P+L5zcm5lIa5lIQ5lQ654MP5PIV5zcM5zUG5zcn56EW6kgO6l6+5lIn5zcm6kkR55M76k6W5OIq5AsA5lIQigfJDg9Y44cc5BEU5BYc5yYf5OUS5l2g5lIn6zMq5lQo77YA56M65Qc844cb5Qch54k544cb5AsN5Bcp5yAz44cb5ywO5y2k6kEs44cb566a57Mb5l2t77YB5ywO5zcn44cb566a56EW44cb5PI156EW44cb56EW6lct44cb6igm5l2n44cb5PEN5zcn44cb5yYw5zcn44cb6k+r5zcn44cb6z+Z6k+r77YB5yIg6k+n5BEU5BYc44cb6l275B6U6zsz5yIR5A2x44cb6l2S5B2v6k+V5BEU77YB5zcn56EW6zMe5BIM6lQR5lU944cb5Oof57UQ44cb5A+555M95OIw54Q25Ocb6k+05PIo77YB5yMn5PYF6lQR5lU95PYQ5PIo44cb5zco5PYF5y+i5lUL55YF5zcn6yEn5PAW55M76k6W44cc","5zYO5zcm5lIa5lIQ5lQ654MP44cb5zYW54k55OIw6ygt5yw35yAf6yoO77Ym5Qoa5P+L5PIV5zcM5zUG5O+p6l+W5PA55BYp44cb6AkC6iMY57ks5BQM44cb5O6Q6l6E6k+M55wL5OIw6kEc5A+F6kEs5BQM5lIn5zcm77Ym5OQk5zcm5lIa5lIQ56IZ5A6A6kEg6kEj54Q25Ocb5OUg5OIq5AsA5lIQihn0yxrL44cc6yEn54k55ywZ5RoO5zcm5lMjl+I/KEs5IEEkTUAaGEoaGEwqJos4GowLL+ACJEIJHEIIQ+MhJEAwSowrVEwqJEoaGEs7HEwfIEE6V+AiLUwXGoMdQoE7HUIkGUMaOoAiKoEAHow3RUw8GU+8Jos7PEwpIUEkTUAaGEwqJEA3T+wfPEAdHEE7QUoaGEwkQos9NoAiLUwCUUAzR+IVToAyJUoaGG","BwvYz2u","zhvWBgLJyxrLx3n0yxrL","BMfTzxm","vw9trNG","6l+u5zUE5ywO5yMN6lwe5lQN5lIa6iE05OcN5A6H6k6H5y+r546W","Aw1WB3j0yw5Jzq","5lQm44cb6kEg6kEj54Q25Ocb5lIa6iE05OcN","5lIj44cb5l2o6Akr5lIo5BYc5BI454Q25Ocb","DhjPBq"];return vp=function(){return e},vp()}var Eg=[D(5),D(38),D(40),D(34),D(6),D(11),D(82),D(35),D(62)],OS=[D(41),D(20),D(14)+xg[D(45)](D(68))+D(61),D(77)+Eg[D(45)](D(68))+D(79),D(58),D(32),"",D(75),D(83),D(2),"",D(91),D(84),D(53),"",D(92),D(56),"",D(60),D(22),D(74),"",D(7),D(52),D(9),D(8),D(67),D(43)][D(45)](`
|
|
249
|
+
`),vS=new Set([D(80),D(55),D(10),D(86),D(57),D(70),D(65)]),RS=new Set([D(85),D(78),D(21)]),MS=new Set([D(25),D(37),D(27)]);function on(e){let t=D,n=e[t(93)]();return n?n[t(36)](/\\/g,"\\\\")[t(36)](/\r\n?|\n/g,"\\n")[t(36)](/\|/g,"\\|")[t(36)](/;/g,"\\;"):"-"}function bp(e){let t=D;return e[t(18)]>0?e[t(69)](on)[t(45)](";"):"-"}function LS(e){let t=D,n=[t(31),t(1)+on(e[t(42)]),t(46)+xg[t(45)]("|"),t(39)+Eg[t(45)]("|")],o=(i,r)=>{let s=t;n[s(71)]("["+i+":"+r[s(18)]+"]");for(let c of r)if(s(88)!==s(88)){_0x4c5672[s(71)](["A",_0x3346d3(_0x10ff10.id),_0x491f28(_0x2e3418[s(38)]),_0x43a7a6(_0x21c903[s(13)]),_0x59e3d3(_0x33921a[s(90)]),_0x5b4072(_0x3f99c5[s(19)]),_0x1e2ca7(_0x46d1f3[s(3)]),_0x7f6b22(_0xcfe569[s(64)]),_0x376ad7(_0x21b2b4[s(82)]),_0x4dc2db(_0xcd97ac[s(35)]),_0x390c6b(_0x4f88f5[s(4)])][s(45)]("|"));for(let a of _0xef23b5[s(17)])_0x5593cc[s(71)](["S",_0x265c62(a[s(5)]),_0x1ae902(a[s(49)]),_0xabc48e(a[s(19)]),_0x4a1d6b(a[s(3)]),_0x514694(a[s(64)]),a[s(15)]??"-",_0x5aa3d6(a[s(82)]),_0x32748e(a[s(35)]),_0x3d8f50(a[s(4)])][s(45)]("|"))}else{n[s(71)](["A",on(c.id),on(c[s(38)]),bp(c[s(13)]),on(c[s(90)]),String(c[s(19)]),String(c[s(3)]),String(c[s(64)]),on(c[s(82)]),on(c[s(35)]),bp(c[s(4)])][s(45)]("|"));for(let a of c[s(17)])n[s(71)](["S",on(a[s(5)]),on(a[s(49)]),String(a[s(19)]),String(a[s(3)]),String(a[s(64)]),a[s(15)]??"-",on(a[s(82)]),on(a[s(35)]),bp(a[s(4)])][s(45)]("|"))}};return o(t(47),e[t(47)]),o(t(81),e[t(81)]),o(t(54),e[t(54)]),n[t(45)](`
|
|
250
|
+
`)}function rn(e,t){e=e-0;let n=vp(),o=n[e];if(rn.qyTtRy===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};rn.uxwRFZ=i,rn.OXUPnC={},rn.qyTtRy=!0}let r=n[0];rn.TDHWfX!==r&&(rn.OXUPnC={},rn.TDHWfX=r);let s=rn.OXUPnC[e];return s===void 0?(o=rn.uxwRFZ(o),rn.OXUPnC[e]=o):o=s,o}var _g=e=>typeof e===D(48)&&e!==null&&!Array[D(33)](e),Sg=e=>Array[D(33)](e)?e:[],si=e=>typeof e===D(63)?e[D(93)]():"",Op=e=>[...new Set(Sg(e)[D(69)](si)[D(30)](Boolean))];function NS(e,t){let n=D;if(!_g(e))throw new Error(n(23));let o=new Set([...t[n(47)],...t[n(81)],...t[n(54)]][n(69)](s=>s.id)),i=new Set([...t[n(47)],...t[n(81)],...t[n(54)]][n(59)](s=>s[n(17)][n(69)](c=>c[n(5)]))),r=[];for(let s of Sg(e[n(73)])){if(!_g(s))continue;let c=si(s[n(50)]),a=si(s[n(28)]),d=si(s[n(76)]);if(!vS[n(44)](c)||!RS[n(44)](a)||!MS[n(44)](d))continue;let p=Op(s[n(0)])[n(30)](h=>o[n(44)](h)),l=Op(s[n(29)])[n(30)](h=>i[n(44)](h));if(p[n(18)]===0&&l[n(18)]===0)continue;let f=si(s[n(51)]),u=f&&(o[n(44)](f)||i[n(44)](f))?f:null;r[n(71)]({type:c,asset_ids:p,state_ids:l,names:Op(s[n(87)]),evidence:si(s[n(16)]),recommendation:si(s[n(24)]),suggested_survivor:u,action:a,confidence:d})}return r}async function Ig(e,t,n){let o=D,i=await e[o(12)](o(66),{system:OS,user:LS(t),tool:{name:o(26),description:o(89),inputSchema:eg},...n?{signal:n}:{}});return NS(i[o(72)],t)}var Ag="1",US=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.audit_version===Ag&&n.script_hash===t&&n.summary!==null&&typeof n.summary=="object"&&Array.isArray(n.issues)};function CS(e,t){return{audit_version:Ag,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 Rp(e,t,n){let o=De(e),i=wg(e),r=await Ig(t,i,n);return CS(o,r)}async function PS(e){let t=De(e.script);if(!e.force&&e.exists())try{let o=e.read();if(US(o,t))return e.executor.recordReuse("ingest.asset-audit"),{report:o,reused:!0}}catch{}let n=await Rp(e.script,e.executor,e.signal);return e.write(n),{report:n,reused:!1}}async function kg(e,t,n,o={}){return PS({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 TS={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 Mp(e){let t=[...e.asset_ids,...e.state_ids].join(", ")||"<unknown>",n=e.evidence||e.recommendation||"review the referenced assets";return`${TS[e.type]} [${t}]: ${n}`}function bg(e){return e.issues.map(t=>({code:`asset_audit_${t.type}`,path:"$",message:`${Mp(t)}; action=${t.action}; confidence=${t.confidence}`}))}var Qi=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 Og(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 Rg from"node:crypto";function Np(){return{calls:0,succeeded:0,failed:0,reused:0,attempts:0,durationMs:0,inputTokens:0,outputTokens:0,cachedInputTokens:0,cacheCreationTokens:0,totalTokens:0}}function VS(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 ga(e){let t=Np();for(let n of e)VS(t,n);return t}var zr=e=>`${e.provider}\0${e.protocol}\0${e.model}`;function Mg(e){let t=new Map;for(let n of e){let o=zr(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:ga(n.records)})).sort((n,o)=>zr(n).localeCompare(zr(o)))}function Lp(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:ga(o),byModel:Mg(o)})).sort((n,o)=>n.task.localeCompare(o.task))}function vg(e){return Mg(e).map(t=>{let n=e.filter(o=>zr(o)===zr(t));return{...t,byTask:Lp(n).map(({task:o,totals:i})=>({task:o,totals:i}))}})}function $S(e){let t=e.updatedAt,n=new Map;for(let c of e.episodes)n.set(c.episode,c.runs);let o=new Map,i=new Map;for(let[c,a]of n){o.set(c,[]);for(let d of a)for(let p of d.recordIds){let l=i.get(p)??new Set;l.add(c),i.set(p,l)}}for(let c of e.records)for(let a of i.get(c.id)??[])o.get(a).push(c);let r=[...n.entries()].map(([c,a])=>{let d=o.get(c);return{episode:c,totals:ga(d),byTask:Lp(d),byModel:vg(d),durationMs:a.reduce((p,l)=>p+l.durationMs,0),runs:a}}).sort((c,a)=>c.episode-a.episode),s=ga(e.records);return{...e,updatedAt:t,totals:s,byTask:Lp(e.records),byModel:vg(e.records),episodes:r,timing:{totalDurationMs:e.runs.reduce((c,a)=>c+a.durationMs,0),modelDurationMs:s.durationMs,episodeDurationMs:r.reduce((c,a)=>c+a.durationMs,0)}}}function DS(e){return{version:2,createdAt:e,updatedAt:e,totals:Np(),byTask:[],byModel:[],episodes:[],runs:[],records:[],timing:{totalDurationMs:0,modelDurationMs:0,episodeDurationMs:0}}}function jr(e){return new Date(e).toISOString()}var Ao=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=jr(this.startedAtMs);if(this.report=t.has("usage.json")?t.readJson("usage.json"):DS(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=Rg.randomUUID();startedAtMs;cursor;report;flush(t){this.write(this.append(t))}recordReusedEpisodes(t,n){if(n.length!==0){for(let o of n){this.executor.recordReuse(t);let i=this.now();this.append({scope:{kind:"episode",episode:o},status:"reused",startedAtMs:i,endedAtMs:i})}this.write(this.now())}}append(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:jr(o),endedAt:jr(n),durationMs:Math.max(0,n-o),stages:t.stages??{},recordIds:s.map(p=>p.id)}),a||this.report.episodes.push({episode:c,totals:Np(),byTask:[],byModel:[],durationMs:0,runs:d})}return 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=jr(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=jr(t),this.report=$S(this.report),this.store.writeJson("usage.json",this.report)}};var Cp="12",ha=e=>String(e).padStart(3,"0"),Lg=e=>e.map(t=>JSON.stringify(t)).join(`
|
|
251
251
|
`)+`
|
|
252
|
-
`;function
|
|
252
|
+
`;function GS(e,t,n){if(e.has("manifest.json")){let o=e.readJson("manifest.json");if(o.source?.sha256&&o.source.sha256!==t)throw new S("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!==Cp)throw new S("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 ${Cp}`]}})}if(n){for(let o of["pass1","pass2","pass3","pass5","serial"])Up.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"])Up.rmSync(e.path(o),{force:!0})}}async function Ng(e){let t=En(e.sourcePath);if(t.kind!=="text")throw new S("runTextIngest received a non-text source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=await na(t.path,t.ext),o=ye(n),i=new dt(e.workspacePath);i.ensure(),GS(i,o,e.force??!1);let r=new Qi(a=>i.writeJson("timings.json",a)),s=new Ao(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 N=await Qm(e.executor,n,e.signal);d=N.line,i.writeJson("pass1/body_start.json",N)}let p=n.split(`
|
|
253
253
|
`),l=d>0?p.slice(d).join(`
|
|
254
254
|
`):n,f=d>0?p.slice(0,d).join(`
|
|
255
|
-
`).trim().slice(0,6e3):"",u=Lm(l);i.writeText("pass1/source.txt",n),i.writeJson("pass1/chunks.json",u.map(N=>({index:N.index,core_line_start:N.core_line_start,core_line_end:N.core_line_end}))),i.writeJson("manifest.json",{version:1,pipeline_version:Up,updated:new Date().toISOString(),source:{path:Hi.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 h=0;r.phaseStart("normalize");let y=await Qm(u,e.concurrency??30,async N=>{let re=`pass2/chunk_${ga(N.index)}.json`,we=`pass2/chunk_${ga(N.index)}.error.json`;if(i.has(re)&&!e.force){let at=mp(i.readJson(re),N);return i.clearError(we),h++,e.executor.recordReuse("ingest.text-normalize"),at}let{raw:mt,records:pn}=await Km(e.executor,N,e.signal);return i.writeText(re,mt),i.writeText(`pass2/chunk_${ga(N.index)}.jsonl`,Mg(pn)),i.clearError(we),pn}),m=y.filter(N=>!N.ok);for(let N of m){let re=N.error instanceof Error?N.error.message:String(N.error);i.writeJson(`pass2/chunk_${ga(N.index)}.error.json`,{chunk:N.index,error:re})}if(s.flush({scope:{kind:"phase",phase:"normalize"},status:m.length?"failed":"succeeded"}),m.length>0)throw new S(`${m.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:m.map(N=>`chunk ${N.index}`)}});r.phaseEnd("normalize");let w,g,_;if(!e.force&&i.has("body.json"))w=i.readJson("body.json"),g=i.has("pass3/script.jsonl")?Dr(i.readText("pass3/script.jsonl")).length:0,_=i.has("notes.json")?i.readJson("notes.json").length:0,h++;else{let N=[];for(let pn of y)pn.ok&&N.push(...pn.value);i.writeText("pass3/script.jsonl",Mg(N));let re=Dr(i.readText("pass3/script.jsonl")),we=GS(t.path),mt=Mm(re,{title:we});i.writeJson("notes.json",mt.notes),w=mt.script,i.writeJson("body.json",w),g=N.length,_=mt.notes.length}Em(w,qs(o),d);let E=N=>String(N).padStart(3,"0"),x=(N,re)=>`serial/win_${E(N)}_${E(re)}.json`,A={readUpdate:(N,re)=>i.has(x(N,re))?i.readText(x(N,re)):void 0,writeStep:(N,re,we,mt)=>{i.writeText(`serial/context_${E(N)}.md`,we),i.writeText(x(N,re),mt)},readArc:(N,re)=>{let we=`serial/arc_${E(N)}_${E(re)}.md`;return i.has(we)?i.readText(we):void 0},writeArc:(N,re,we)=>{i.writeText(`serial/arc_${E(N)}_${E(re)}.md`,we)},readNameFix:(N,re)=>{let we=`serial/fix_${E(N)}_${E(re)}.json`;return i.has(we)?i.readText(we):void 0},writeNameFix:(N,re,we)=>i.writeText(`serial/fix_${E(N)}_${E(re)}.json`,we)};r.phaseStart("serial");let k=await gg(w,{executor:e.executor,checkpoint:A,force:e.force??!1,...f?{sourceRef:f}:{},onWindow:N=>{N.index===0&&r.serialStart(N.total,N.totalEpisodes),r.windowDone(N.startEp,N.endEp,N.ms,N.cached);let re=N.startEp===N.endEp?{kind:"episode",episode:N.startEp}:{kind:"episode-range",startEpisode:N.startEp,endEpisode:N.endEp},we=Date.now();s.flush({scope:re,status:N.cached?"reused":"succeeded",startedAtMs:we-N.ms,endedAtMs:we})},...e.signal?{signal:e.signal}:{}}),U=k.doc;h+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:O,idMap:I}=ca(U);i.writeJson("id_map.json",I);let L=yt(O);if(!L.ok)throw i.writeJson("validation.json",L),new S("Intermediate script failed validation before v4 identity assignment.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:L.errors.slice(0,5).map(N=>`${N.path}: ${N.message}`)}});let T=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,C=Ki(Nt(U),T,k.identityKeys),R=C.script,j=Le(R),W=[],ve=Date.now(),K="failed";try{if(j.ok){let N=await Ag(i,R,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});W=kg(N.report)}K="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:K,startedAtMs:ve})}let Re={...j,warnings:[...j.warnings,...Bi(R),...W]};if(i.writeJson("pass5/script.json",R),i.writeJson("v4_identity_map.json",C.identityMap),i.writeJson("validation.json",Re),!Re.ok)throw new S("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:Re.errors.slice(0,5).map(N=>`${N.path}: ${N.message}`)}});i.writeJson("script.json",R),r.phaseEnd("govern"),r.finish();let We=R;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:h,records:g,notes:_,assets:{actors:We.actors?.length??0,locations:We.locations?.length??0,props:We.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:Re.ok,errors:Re.errors.length,warnings:Re.warnings.length}}}finally{s.finish(c)}}function GS(e){return Hi.basename(e,Hi.extname(e))}import*as vo from"node:fs";import*as ci from"node:path";import{createHash as lI}from"node:crypto";var JS=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""});function ko(){return{lastEpisode:0,registry:[],digests:[],openThreads:[]}}var ye=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),zr=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function BS(e,t){let n=ye(t);return e.find(o=>ye(o.name)===n||ye(o.identitySeed)===n||o.aliases.some(i=>ye(i)===n))}var KS=3,jS=12e3;function ai(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var zS=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function ha(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:JS();for(let i of zS){let r=t[i]?.trim()??"";r&&(n||!o[i])&&(o[i]=r)}for(let i of t.persistent_marks??[])ai(o.persistent_marks,i);return o}function Cp(e,t,n){let o=t.name.trim();if(!o)return;let i=t.description.trim(),r=e.find(s=>An(s.name)===An(o));if(!r){e.push({name:o,description:i});return}i&&(n||!r.description)&&(r.description=i)}function Ng(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??[])ai(e.recognitionAnchors,s);e.identityProfile=ha(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??[])ai(e.aliases,s);for(let s of t.add_states??[])Cp(e.states,s,o);e.lastEpisode=n}function ya(e,t,n){let o=r=>BS(e.registry,r);for(let r of t.registry_delta.new_entities){let s=r.name.trim();if(!s||r.kind==="actor"&&st(s))continue;let c=o(s);if(c){Ng(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??[])Cp(a,p,!1);let d=[];for(let p of r.aliases??[])ai(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:ha(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&&Ng(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||ye(c)===ye(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(h=>({...h})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(h=>h.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let h of[...s.recognitionAnchors,...a.recognitionAnchors])ai(d.recognitionAnchors,h);let u=ha(void 0,s.identityProfile,!0);d.identityProfile=ha(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let h of[...l,...p.states])Cp(d.states,h,!1);d.aliases=[...f].filter(h=>ye(h)!==ye(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}ai(s.aliases,s.name),ai(s.aliases,r.from_name),s.name=c,s.status="canonical",s.aliases=s.aliases.filter(d=>ye(d)!==ye(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 Pg(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function HS(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: ${zr(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=zr(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 Ug(e,t){let n=zr(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${zr(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 Cg(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(...HS(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(Ug(a,n));for(let a of s)o.push(Ug(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?zr(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(`
|
|
256
|
-
`)}function wa(e){for(let t=KS;t>=1;t--){let n=Cg(e,t,!1);if(n.length<=jS)return n}return Cg(e,1,!0)}function bo(e){let t=new Map;for(let n of e)for(let o of[n.identitySeed,...n.aliases])ye(o)!==ye(n.name)&&t.set(o,n.name);return t}function QS(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 Tg(e,t){let n=new Map,o=new Map,i=(s,c)=>{let a=ye(s),d=c.trim();!d||ye(d)===a||(o.has(a)||o.set(a,new Set),o.get(a).add(d))};for(let s of t){n.set(ye(s.name),s.importance);for(let c of s.aliases)n.set(ye(c),s.importance);n.set(ye(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 h of p)if(l=t.find(y=>ye(y.name)===ye(h)||ye(y.identitySeed)===ye(h)||y.aliases.some(m=>ye(m)===ye(h))),l)break;a.importance=l?.importance??n.get(ye(d))??"featured";let f=o.get(ye(d));if(f?.size&&(a.aliases=[...new Set([...a.aliases??[],...f])]),!l)continue;let u=l.kind==="actor"?QS(l):[l.appearance,l.role].map(h=>(h?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let h of a.states??[]){let y=l.states.find(m=>An(m.name)===An(h.state_name));y?.description?h.description=y.description:h.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(h.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function Vg(e,t,n){let o=bo(t.registry),i=d=>o.get(d)??d,r=d=>{let p=d.indexOf(":"),l=d.slice(0,p);return p>0&&(l==="system"||l==="broadcast"||l==="offscreen"||l==="group")?{kind:l,label:d.slice(p+1)}:st(d)?{kind:"group",label:d}:{name:i(d)}},s=0,c={title:n,episodes:e.map(d=>({identity_key:`comic:${d.document_id}`,episode_id:`ep_${String(d.episode).padStart(3,"0")}`,title:d.title,scenes:d.output.scenes.map((p,l)=>{let f=`comic:${d.document_id}:scene:${l+1}`,u=p.characters.flatMap(y=>y.states.length?y.states.map(m=>({name:i(y.name),state:m})):[{name:i(y.name)}]),h=p.actions.map((y,m)=>{let w={kind:"comic",document_id:d.document_id,pages:y.pages,regions:y.regions},g={identity_key:`${f}:action:${m+1}`,type:y.type,content:y.content,extend:{scriptctl:{source:w}}};if((y.type==="dialogue"||y.type==="inner_thought")&&(g.speaker=r(y.speaker),y.parenthetical&&(g.parenthetical=y.parenthetical),"name"in g.speaker)){let _=g.speaker.name;u.some(E=>E.name===_)||u.push({name:_})}return g});return{identity_key:f,scene_id:`scn_${String(++s).padStart(3,"0")}`,environment:{...p.space?{space:p.space}:{},...p.time?{time:xo(p.time)}:{}},location:p.location?{name:i(p.location)}:null,actors:u,props:[...new Set(p.props.map(i))].map(y=>({name:y})),actions:h}})}))},a=new Set(t.registry.map(d=>`${d.kind}:${d.name}`));for(let d of c.episodes)for(let p of d.scenes){let f=[...p.actors.map(u=>`actor:${u.name}`),...p.props.map(u=>`prop:${u.name}`),...p.location?[`location:${p.location.name}`]:[]].filter(u=>!a.has(u));if(f.length)throw new S(`Comic scene references assets absent from the registry: ${f.join(", ")}`,{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"The episode must register every referenced character, location and key prop.",data:{actual:f}})}return c}var Qi=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function FS(e,t,n){let o=bo(t),i=l=>o.get(l)??l,r=new Map;for(let l of t){let f=i(l.name),h=t.find(m=>m.kind===l.kind&&Qi(m.name)===Qi(f))??l,y=`${l.kind}:${Qi(f)}`;r.has(y)||r.set(y,`${n}:${h.kind}:${h.firstEpisode}:${Qi(h.identitySeed)}`)}let s={},c={},a={},d={},p={actor:s,location:c,prop:a};for(let l of e){let f=l.names[0]??l.provisional_id,u=r.get(`${l.kind}:${Qi(f)}`)??`${n}:${l.kind}:source:${Qi(f)}`;p[l.kind][l.provisional_id]=u,d[l.provisional_id]=Object.fromEntries(l.states.map(h=>[h.id,`${u}:state:${An(h.name)}`]))}return{actor:s,location:c,prop:a,state:d}}function _a(e,t,n,o){let{script:i,assets:r,identityKeys:s}=ra(e);Tg(i,t.registry);let c=la(i),{script:a,idMap:d}=ca(c),p=yt(a);if(!p.ok)return{initial:i,final:a,idMap:d,validation:p,identityMap:o,scriptV4:null};let l=Ki(Nt(c),o,{...FS(r,t.registry,n),...s}),f=l.script,u=Le(f);return{initial:i,final:f,scriptV4:f,idMap:d,identityMap:l.identityMap,validation:{...u,warnings:[...u.warnings,...Bi(f)]}}}import*as $g from"node:fs";import*as Fn from"node:path";import{createHash as YS}from"node:crypto";import{PDFDocument as qS}from"pdf-lib";import*as xa from"node:path";function Ea(e){let t=xa.basename(e,xa.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 ZS(e){let t=e.kind==="comic-file"?[e.path]:e.files,n=t.map(i=>({path:i,sourceNumber:Ea(i)})),o=n.flatMap(i=>i.sourceNumber===null?[]:[i.sourceNumber]);if(o.length>0&&o.length!==t.length||new Set(o).size!==o.length)throw new S("Comic chapter ordering is ambiguous.",{exitCode:b,errorCode:"INGEST_COMIC_DISCOVERY",hint:"Give every PDF a unique chapter number, or use unnumbered filenames that sort in reading order.",data:{actual:t.map(i=>Fn.basename(i))}});return n.sort((i,r)=>i.sourceNumber!==null&&r.sourceNumber!==null?i.sourceNumber-r.sourceNumber:Fn.basename(i.path).localeCompare(Fn.basename(r.path),"zh-Hans",{numeric:!0}))}async function Dg(e){let t=[];for(let[n,o]of ZS(e).entries()){let i=$g.readFileSync(o.path),s=(await qS.load(i,{updateMetadata:!1})).getPageCount();if(!s||s>1e3||i.length>5e7)throw new S("PDF is outside the document provider limits.",{exitCode:b,errorCode:"INGEST_COMIC_SIZE",hint:"Provide one chapter per PDF, containing 1\u20131000 pages and at most 50 MB.",data:{actual:[`${o.path}: ${s} pages, ${i.length} bytes`]}});t.push({episode:n+1,document_id:`chapter-${String(n+1).padStart(3,"0")}`,source_number:o.sourceNumber,title:Fn.basename(o.path,Fn.extname(o.path)),path:Fn.resolve(o.path),sha256:YS("sha256").update(i).digest("hex"),page_count:s,size_bytes:i.length})}return t}function Gg(e,t){let n=e.find((o,i)=>{let r=t[i];return!r||o.sha256!==r.sha256||o.source_number!==r.source_number||o.title!==r.title});if(n)throw new S("The comic source prefix changed.",{exitCode:b,errorCode:"INGEST_SOURCE_MISMATCH",hint:"Restore the original chapters or use a fresh workspace. Only tail chapters may be appended.",data:{actual:[n.title]}})}import{PDFDocument as WS,StandardFonts as XS,rgb as eI,pushGraphicsState as tI,popGraphicsState as nI,concatTransformationMatrix as Sa}from"pdf-lib";async function Jg(e){let t=await WS.load(e),n=await t.embedFont(XS.Helvetica),o=eI(0,.45,.85);for(let i of t.getPages()){let r=i.getCropBox(),s=(i.getRotation().angle%360+360)%360,c=s===90||s===270,a=c?r.height:r.width,d=c?r.width:r.height;switch(i.pushOperators(tI()),s){case 90:i.pushOperators(Sa(0,1,-1,0,r.x+r.width,r.y));break;case 180:i.pushOperators(Sa(-1,0,0,-1,r.x+r.width,r.y+r.height));break;case 270:i.pushOperators(Sa(0,-1,1,0,r.x,r.y+r.height));break;default:i.pushOperators(Sa(1,0,0,1,r.x,r.y))}let p=a/70;for(let l=0;l<=1e3;l+=50){let f=d*(1-l/1e3);i.drawLine({start:{x:0,y:f},end:{x:a,y:f},thickness:.5,color:o,opacity:.3});let u=`y=${l}`,h=Math.max(1,Math.min(d-p,f+1));for(let y of[1,a-n.widthOfTextAtSize(u,p)-1])i.drawText(u,{x:y,y:h,size:p,font:n,color:o})}for(let l=100;l<1e3;l+=100){let f=a*l/1e3;i.drawLine({start:{x:f,y:0},end:{x:f,y:d},thickness:.5,color:o,opacity:.3});for(let u=0;u<1e3;u+=250)i.drawText(`x=${l}`,{x:f+1,y:d*(1-u/1e3)-p,size:p,font:n,color:o})}i.pushOperators(nI())}return t.save()}import*as Bg from"node:fs";import*as Kg from"node:path";import oI from"proper-lockfile";async function Oo(e,t){let n=Kg.resolve(e);Bg.mkdirSync(n,{recursive:!0});let o=null;try{o=await oI.lock(n,{realpath:!1,stale:12e4,update:1e4,retries:0})}catch(i){throw new S("The ingest workspace is busy.",{exitCode:me,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()}}import{z as iI}from"zod";var Tp=an;function Pp(){let e=["q29TAwmGzxbPC29KzsbMywLSzwqGDhjHBNnJCMLWDcb2ywXPzgf0Aw9UoIa","CMvNAw9UCW","Dg9ku09ou2nOzw1H","44cc5PYSifberIdLHBeG","zgf0yq","ioMHTE+8JoIVT+wUJoAvToMyHEIVU+w5TUAmIEMHUUw6J+MaKoAGVoI9RowgMEwfQoMdQowjP+AdHEoaGGOk","BwvZC2fNzq","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","BwfW","C2fMzvbHCNnL","Cgf0Aa","C2nLBMvZ","AgfZ","AM9PBG","BgvUz3rO","CgfNzxm","AxnZDwvZ","CgfYC2u","B3bLBMfWAs0ZlJa","su5hrvnux0nptuLdx1nfuKLbtf9gquLmruq","Dgv4Da","C29Tzq","C2XPy2u","CgfNzq","sw52ywXPzcbVCIb1BM9YzgvYzwqGC291CMnLihbHz2vZoIa","zNjVBq","zxjYB3i","sw52ywXPzcbVCIbKDxbSAwnHDguGAwDUB3jLzcbWywDLoIa","ywn0Aw9UCW","5B2t5yMn6k+D77YA","C3vJy2vZCW","zMLSDgvY","ihbHz2vZlG","oYbKB2n1BwvUDcbOyxmG","z2vUzxjHDgu","sw5ZCgvJDcbLCc8QlNjLC3bVBNnLlMPZB24Gyw5KihjLCNvUigLUz2vZDcb3AxrOihrOzsbZyw1LihnVDxjJzsbHBMqGD29YA3nWywnLlG","AwDUB3jLzf9WywDLCW","ywrK"];return Pp=function(){return e},Pp()}function an(e,t){e=e-0;let n=Pp(),o=n[e];if(an.RPngbJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};an.xePDtj=i,an.gnQDUQ={},an.RPngbJ=!0}let r=n[0];an.rPrOht!==r&&(an.gnQDUQ={},an.rPrOht=r);let s=an.gnQDUQ[e];return s===void 0?(o=an.xePDtj(o),an.gnQDUQ[e]=o):o=s,o}var rI=Tp(7);function sI(e,t){let n=Tp,o=Fd[n(10)](JSON[n(18)](e)),i=a=>{let d=n;throw new S(d(0)+a[d(14)]("; "),{exitCode:b,errorCode:d(20),hint:d(36),data:{actual:a}})};if(!o[n(31)])return i(o[n(27)][n(17)][n(23)](0,8)[n(9)](a=>a[n(11)][n(14)](".")+": "+a[n(6)]));let r=o[n(4)],s=new Set;for(let a of r[n(12)])for(let d of a[n(29)]){if(d[n(16)][n(22)]((l,f)=>l>t||f>0&&l<=d[n(16)][f-1]))return i([n(25)+d[n(16)][n(14)](", ")+n(34)+t+n(33)]);let p=Ur(d[n(16)],d[n(1)]);if(p[n(15)])return i(p);for(let l of d[n(16)])s[n(38)](l)}for(let a of r[n(37)]){if(a[n(24)]>t||s[n(13)](a[n(24)]))return i([n(28)+a[n(24)]]);s[n(38)](a[n(24)])}let c=Array[n(26)]({length:t},(a,d)=>d+1)[n(32)](a=>!s[n(13)](a));return c[n(15)]?i([n(8)+c[n(14)](", ")]):r}async function jg(e,t,n,o,i,r,s){let c=Tp,a=await e[c(35)]({media:t,system:rI,user:c(30)+n+c(3)+o+c(5)+i,responseJsonSchema:iI[c(2)](im,{target:c(19)}),signal:s});return r(a[c(21)]),sI(a[c(21)],o)}function Ia(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function aI(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_COMIC_SERIAL_FAILED":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 cI(e){if(e instanceof P)return{failure:e.failure,attempts:e.modelFailures};if(e instanceof S){let t=e.errorCode==="INGEST_VALIDATION_FAILED"||e.errorCode==="INGEST_VIDEO_SERIAL_FAILED"||e.errorCode==="INGEST_COMIC_SERIAL_FAILED";return{failure:Rt(aI(e),{retryable:t,message:e.message}),attempts:[]}}return{failure:Rt({failure_type:"unknown",failure_code:"unknown"},{retryable:!1,message:e instanceof Error?e.message:String(e)}),attempts:[]}}function Aa(e,t,n){let o=cI(e);return{schema_version:1,unit:{kind:"episode",episode:t},phase:n,occurred_at:new Date().toISOString(),...o}}function Hg(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 zg(e,t){return typeof e=="string"&&t.some(n=>n===e)}function Fi(e){return typeof e=="string"?e:void 0}function dI(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Ia(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 pI(e){let t=e.provider_source,n=e.provider_reason;return{provider:Fi(e.provider),model:Fi(e.model),operation:Fi(e.operation),http_status:typeof e.http_status=="number"?e.http_status:void 0,system_code:Fi(e.system_code),provider_source:zg(t,["prompt","candidate"])?t:void 0,provider_reason:zg(n,["SAFETY","PROHIBITED_CONTENT","BLOCKLIST","SPII","RECITATION","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION","OTHER","UNSPECIFIED","UNKNOWN"])?n:void 0,provider_reason_raw:Fi(e.provider_reason_raw),finish_message:Fi(e.finish_message),safety_ratings:dI(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function Hr(e){if(!Ia(e))return null;let t=Pl(e.failure_type,e.failure_code);return!t||typeof e.retryable!="boolean"||typeof e.message!="string"?null:Rt(t,{...pI(e),retryable:e.retryable,message:e.message})}function Qr(e){if(!Ia(e)||e.schema_version!==1)return null;let t=e.unit;if(!Ia(t)||t.kind!=="episode"||typeof t.episode!="number"||typeof e.phase!="string"||typeof e.occurred_at!="string")return null;let n=Hr(e.failure);if(!n||!Array.isArray(e.attempts))return null;let o=[];for(let i of e.attempts){let r=Hr(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}}var Qg="comic-1",ka=e=>String(e).padStart(3,"0"),Fg=["script.initial.json","id_map.json","validation.json","context.json","v4_identity_map.json","script.json"];function Vp(e,t,n){let o=_a(Vg(e,t.context,n),t.context,"comic",t.identityMap);if(!o.scriptV4||!o.validation.ok)throw new S("Comic script failed validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect the current episode response and rerun ingest with the same source and workspace.",data:{actual:o.validation.errors.slice(0,8).map(i=>`${i.path}: ${i.message}`)}});for(let[i,r]of o.scriptV4.episodes.entries())r.synopsis=e[i].output.synopsis;return{...o,scriptV4:o.scriptV4}}function $p(e,t,n){e.writeJson("script.initial.json",t.initial),e.writeJson("id_map.json",t.idMap),e.writeJson("validation.json",t.validation),e.writeJson("context.json",n),e.writeJson("v4_identity_map.json",t.identityMap),e.writeJson("script.json",t.scriptV4)}async function uI(e){let t=Sn(e.sourcePath);if(t.kind!=="comic-file"&&t.kind!=="comic-directory")throw new S("Expected PDF comic source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=new lt(ci.resolve(e.workspacePath));n.ensure();let o=n.has("manifest.json")?n.readJson("manifest.json"):null;if(o&&o.pipeline_version!==Qg)throw new S("This workspace belongs to another ingest pipeline.",{exitCode:b,errorCode:"INGEST_PIPELINE_MISMATCH",hint:"Choose a fresh workspace."});if(!o&&n.has("script.json"))throw new S("Workspace already contains an unmanaged script.json.",{exitCode:b,errorCode:"INGEST_SOURCE_MISMATCH",hint:"Choose a fresh workspace."});let i=await Dg(t);o&&Gg(o.episodes,i);let r={version:1,pipeline_version:Qg,updated:new Date().toISOString(),source:{kind:t.kind,path:ci.resolve(t.path),sha256:lI("sha256").update(i.map(m=>m.sha256).join(`
|
|
257
|
-
`)).digest("hex")},episodes:i,...o?.current_error?{current_error:o.current_error}:{}};if(e.force){for(let m of o?.episodes??[])for(let w of["json","response.json","context.md","error.json","input.pdf"])vo.rmSync(n.path(`ep/ep_${
|
|
255
|
+
`).trim().slice(0,6e3):"",u=Nm(l);i.writeText("pass1/source.txt",n),i.writeJson("pass1/chunks.json",u.map(N=>({index:N.index,core_line_start:N.core_line_start,core_line_end:N.core_line_end}))),i.writeJson("manifest.json",{version:1,pipeline_version:Cp,updated:new Date().toISOString(),source:{path:Fi.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 h=0;r.phaseStart("normalize");let y=await Fm(u,e.concurrency??30,async N=>{let re=`pass2/chunk_${ha(N.index)}.json`,_e=`pass2/chunk_${ha(N.index)}.error.json`;if(i.has(re)&&!e.force){let gi=gp(i.readJson(re),N);return i.clearError(_e),h++,e.executor.recordReuse("ingest.text-normalize"),gi}let{raw:It,records:vn}=await jm(e.executor,N,e.signal);return i.writeText(re,It),i.writeText(`pass2/chunk_${ha(N.index)}.jsonl`,Lg(vn)),i.clearError(_e),vn}),m=y.filter(N=>!N.ok);for(let N of m){let re=N.error instanceof Error?N.error.message:String(N.error);i.writeJson(`pass2/chunk_${ha(N.index)}.error.json`,{chunk:N.index,error:re})}if(s.flush({scope:{kind:"phase",phase:"normalize"},status:m.length?"failed":"succeeded"}),m.length>0)throw new S(`${m.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:m.map(N=>`chunk ${N.index}`)}});r.phaseEnd("normalize");let w,g,_;if(!e.force&&i.has("body.json"))w=i.readJson("body.json"),g=i.has("pass3/script.jsonl")?Gr(i.readText("pass3/script.jsonl")).length:0,_=i.has("notes.json")?i.readJson("notes.json").length:0,h++;else{let N=[];for(let vn of y)vn.ok&&N.push(...vn.value);i.writeText("pass3/script.jsonl",Lg(N));let re=Gr(i.readText("pass3/script.jsonl")),_e=JS(t.path),It=Lm(re,{title:_e});i.writeJson("notes.json",It.notes),w=It.script,i.writeJson("body.json",w),g=N.length,_=It.notes.length}Sm(w,Zs(o),d);let E=N=>String(N).padStart(3,"0"),x=(N,re)=>`serial/win_${E(N)}_${E(re)}.json`,A={readUpdate:(N,re)=>i.has(x(N,re))?i.readText(x(N,re)):void 0,writeStep:(N,re,_e,It)=>{i.writeText(`serial/context_${E(N)}.md`,_e),i.writeText(x(N,re),It)},readArc:(N,re)=>{let _e=`serial/arc_${E(N)}_${E(re)}.md`;return i.has(_e)?i.readText(_e):void 0},writeArc:(N,re,_e)=>{i.writeText(`serial/arc_${E(N)}_${E(re)}.md`,_e)},readNameFix:(N,re)=>{let _e=`serial/fix_${E(N)}_${E(re)}.json`;return i.has(_e)?i.readText(_e):void 0},writeNameFix:(N,re,_e)=>i.writeText(`serial/fix_${E(N)}_${E(re)}.json`,_e)};r.phaseStart("serial");let k=await hg(w,{executor:e.executor,checkpoint:A,force:e.force??!1,...f?{sourceRef:f}:{},onWindow:N=>{N.index===0&&r.serialStart(N.total,N.totalEpisodes),r.windowDone(N.startEp,N.endEp,N.ms,N.cached);let re=N.startEp===N.endEp?{kind:"episode",episode:N.startEp}:{kind:"episode-range",startEpisode:N.startEp,endEpisode:N.endEp},_e=Date.now();s.flush({scope:re,status:N.cached?"reused":"succeeded",startedAtMs:_e-N.ms,endedAtMs:_e})},...e.signal?{signal:e.signal}:{}}),U=k.doc;h+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:O,idMap:I}=da(U);i.writeJson("id_map.json",I);let M=mt(O);if(!M.ok)throw i.writeJson("validation.json",M),new S("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(N=>`${N.path}: ${N.message}`)}});let T=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,P=zi(Lt(U),T,k.identityKeys),R=P.script,j=Me(R),W=[],Pe=Date.now(),ue="failed";try{if(j.ok){let N=await kg(i,R,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});W=bg(N.report)}ue="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:ue,startedAtMs:Pe})}let K={...j,warnings:[...j.warnings,...ji(R),...W]};if(i.writeJson("pass5/script.json",R),i.writeJson("v4_identity_map.json",P.identityMap),i.writeJson("validation.json",K),!K.ok)throw new S("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:K.errors.slice(0,5).map(N=>`${N.path}: ${N.message}`)}});i.writeJson("script.json",R),r.phaseEnd("govern"),r.finish();let St=R;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:h,records:g,notes:_,assets:{actors:St.actors?.length??0,locations:St.locations?.length??0,props:St.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:K.ok,errors:K.errors.length,warnings:K.warnings.length}}}finally{s.finish(c)}}function JS(e){return Fi.basename(e,Fi.extname(e))}import*as vo from"node:fs";import*as ci from"node:path";import{createHash as uI}from"node:crypto";var BS=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""});function ko(){return{lastEpisode:0,registry:[],digests:[],openThreads:[]}}var we=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),Hr=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function KS(e,t){let n=we(t);return e.find(o=>we(o.name)===n||we(o.identitySeed)===n||o.aliases.some(i=>we(i)===n))}var jS=3,zS=12e3;function ai(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var HS=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function ya(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:BS();for(let i of HS){let r=t[i]?.trim()??"";r&&(n||!o[i])&&(o[i]=r)}for(let i of t.persistent_marks??[])ai(o.persistent_marks,i);return o}function Pp(e,t,n){let o=t.name.trim();if(!o)return;let i=t.description.trim(),r=e.find(s=>In(s.name)===In(o));if(!r){e.push({name:o,description:i});return}i&&(n||!r.description)&&(r.description=i)}function Ug(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??[])ai(e.recognitionAnchors,s);e.identityProfile=ya(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??[])ai(e.aliases,s);for(let s of t.add_states??[])Pp(e.states,s,o);e.lastEpisode=n}function wa(e,t,n){let o=r=>KS(e.registry,r);for(let r of t.registry_delta.new_entities){let s=r.name.trim();if(!s||r.kind==="actor"&&rt(s))continue;let c=o(s);if(c){Ug(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??[])Pp(a,p,!1);let d=[];for(let p of r.aliases??[])ai(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:ya(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&&Ug(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||we(c)===we(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(h=>({...h})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(h=>h.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let h of[...s.recognitionAnchors,...a.recognitionAnchors])ai(d.recognitionAnchors,h);let u=ya(void 0,s.identityProfile,!0);d.identityProfile=ya(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let h of[...l,...p.states])Pp(d.states,h,!1);d.aliases=[...f].filter(h=>we(h)!==we(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}ai(s.aliases,s.name),ai(s.aliases,r.from_name),s.name=c,s.status="canonical",s.aliases=s.aliases.filter(d=>we(d)!==we(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 Tg(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function QS(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: ${Hr(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=Hr(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 Cg(e,t){let n=Hr(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${Hr(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 Pg(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(...QS(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(Cg(a,n));for(let a of s)o.push(Cg(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?Hr(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(`
|
|
256
|
+
`)}function _a(e){for(let t=jS;t>=1;t--){let n=Pg(e,t,!1);if(n.length<=zS)return n}return Pg(e,1,!0)}function bo(e){let t=new Map;for(let n of e)for(let o of[n.identitySeed,...n.aliases])we(o)!==we(n.name)&&t.set(o,n.name);return t}function FS(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 Vg(e,t){let n=new Map,o=new Map,i=(s,c)=>{let a=we(s),d=c.trim();!d||we(d)===a||(o.has(a)||o.set(a,new Set),o.get(a).add(d))};for(let s of t){n.set(we(s.name),s.importance);for(let c of s.aliases)n.set(we(c),s.importance);n.set(we(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 h of p)if(l=t.find(y=>we(y.name)===we(h)||we(y.identitySeed)===we(h)||y.aliases.some(m=>we(m)===we(h))),l)break;a.importance=l?.importance??n.get(we(d))??"featured";let f=o.get(we(d));if(f?.size&&(a.aliases=[...new Set([...a.aliases??[],...f])]),!l)continue;let u=l.kind==="actor"?FS(l):[l.appearance,l.role].map(h=>(h?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let h of a.states??[]){let y=l.states.find(m=>In(m.name)===In(h.state_name));y?.description?h.description=y.description:h.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(h.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function $g(e,t,n){let o=bo(t.registry),i=d=>o.get(d)??d,r=d=>{let p=d.indexOf(":"),l=d.slice(0,p);return p>0&&(l==="system"||l==="broadcast"||l==="offscreen"||l==="group")?{kind:l,label:d.slice(p+1)}:rt(d)?{kind:"group",label:d}:{name:i(d)}},s=0,c={title:n,episodes:e.map(d=>({identity_key:`comic:${d.document_id}`,episode_id:`ep_${String(d.episode).padStart(3,"0")}`,title:d.title,scenes:d.output.scenes.map((p,l)=>{let f=`comic:${d.document_id}:scene:${l+1}`,u=p.characters.flatMap(y=>y.states.length?y.states.map(m=>({name:i(y.name),state:m})):[{name:i(y.name)}]),h=p.actions.map((y,m)=>{let w={kind:"comic",document_id:d.document_id,pages:y.pages,regions:y.regions},g={identity_key:`${f}:action:${m+1}`,type:y.type,content:y.content,extend:{scriptctl:{source:w}}};if((y.type==="dialogue"||y.type==="inner_thought")&&(g.speaker=r(y.speaker),y.parenthetical&&(g.parenthetical=y.parenthetical),"name"in g.speaker)){let _=g.speaker.name;u.some(E=>E.name===_)||u.push({name:_})}return g});return{identity_key:f,scene_id:`scn_${String(++s).padStart(3,"0")}`,environment:{...p.space?{space:p.space}:{},...p.time?{time:xo(p.time)}:{}},location:p.location?{name:i(p.location)}:null,actors:u,props:[...new Set(p.props.map(i))].map(y=>({name:y})),actions:h}})}))},a=new Set(t.registry.map(d=>`${d.kind}:${d.name}`));for(let d of c.episodes)for(let p of d.scenes){let f=[...p.actors.map(u=>`actor:${u.name}`),...p.props.map(u=>`prop:${u.name}`),...p.location?[`location:${p.location.name}`]:[]].filter(u=>!a.has(u));if(f.length)throw new S(`Comic scene references assets absent from the registry: ${f.join(", ")}`,{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"The episode must register every referenced character, location and key prop.",data:{actual:f}})}return c}var Yi=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function YS(e,t,n){let o=bo(t),i=l=>o.get(l)??l,r=new Map;for(let l of t){let f=i(l.name),h=t.find(m=>m.kind===l.kind&&Yi(m.name)===Yi(f))??l,y=`${l.kind}:${Yi(f)}`;r.has(y)||r.set(y,`${n}:${h.kind}:${h.firstEpisode}:${Yi(h.identitySeed)}`)}let s={},c={},a={},d={},p={actor:s,location:c,prop:a};for(let l of e){let f=l.names[0]??l.provisional_id,u=r.get(`${l.kind}:${Yi(f)}`)??`${n}:${l.kind}:source:${Yi(f)}`;p[l.kind][l.provisional_id]=u,d[l.provisional_id]=Object.fromEntries(l.states.map(h=>[h.id,`${u}:state:${In(h.name)}`]))}return{actor:s,location:c,prop:a,state:d}}function xa(e,t,n,o){let{script:i,assets:r,identityKeys:s}=sa(e);Vg(i,t.registry);let c=ua(i),{script:a,idMap:d}=da(c),p=mt(a);if(!p.ok)return{initial:i,final:a,idMap:d,validation:p,identityMap:o,scriptV4:null};let l=zi(Lt(c),o,{...YS(r,t.registry,n),...s}),f=l.script,u=Me(f);return{initial:i,final:f,scriptV4:f,idMap:d,identityMap:l.identityMap,validation:{...u,warnings:[...u.warnings,...ji(f)]}}}import*as Dg from"node:fs";import*as Fn from"node:path";import{createHash as qS}from"node:crypto";import{PDFDocument as ZS}from"pdf-lib";import*as Ea from"node:path";function Sa(e){let t=Ea.basename(e,Ea.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 WS(e){let t=e.kind==="comic-file"?[e.path]:e.files,n=t.map(i=>({path:i,sourceNumber:Sa(i)})),o=n.flatMap(i=>i.sourceNumber===null?[]:[i.sourceNumber]);if(o.length>0&&o.length!==t.length||new Set(o).size!==o.length)throw new S("Comic chapter ordering is ambiguous.",{exitCode:b,errorCode:"INGEST_COMIC_DISCOVERY",hint:"Give every PDF a unique chapter number, or use unnumbered filenames that sort in reading order.",data:{actual:t.map(i=>Fn.basename(i))}});return n.sort((i,r)=>i.sourceNumber!==null&&r.sourceNumber!==null?i.sourceNumber-r.sourceNumber:Fn.basename(i.path).localeCompare(Fn.basename(r.path),"zh-Hans",{numeric:!0}))}async function Gg(e){let t=[];for(let[n,o]of WS(e).entries()){let i=Dg.readFileSync(o.path),s=(await ZS.load(i,{updateMetadata:!1})).getPageCount();if(!s||s>1e3||i.length>5e7)throw new S("PDF is outside the document provider limits.",{exitCode:b,errorCode:"INGEST_COMIC_SIZE",hint:"Provide one chapter per PDF, containing 1\u20131000 pages and at most 50 MB.",data:{actual:[`${o.path}: ${s} pages, ${i.length} bytes`]}});t.push({episode:n+1,document_id:`chapter-${String(n+1).padStart(3,"0")}`,source_number:o.sourceNumber,title:Fn.basename(o.path,Fn.extname(o.path)),path:Fn.resolve(o.path),sha256:qS("sha256").update(i).digest("hex"),page_count:s,size_bytes:i.length})}return t}function Jg(e,t){let n=e.find((o,i)=>{let r=t[i];return!r||o.sha256!==r.sha256||o.source_number!==r.source_number||o.title!==r.title});if(n)throw new S("The comic source prefix changed.",{exitCode:b,errorCode:"INGEST_SOURCE_MISMATCH",hint:"Restore the original chapters or use a fresh workspace. Only tail chapters may be appended.",data:{actual:[n.title]}})}import{PDFDocument as XS,StandardFonts as eI,rgb as tI,pushGraphicsState as nI,popGraphicsState as oI,concatTransformationMatrix as Ia}from"pdf-lib";async function Bg(e){let t=await XS.load(e),n=await t.embedFont(eI.Helvetica),o=tI(0,.45,.85);for(let i of t.getPages()){let r=i.getCropBox(),s=(i.getRotation().angle%360+360)%360,c=s===90||s===270,a=c?r.height:r.width,d=c?r.width:r.height;switch(i.pushOperators(nI()),s){case 90:i.pushOperators(Ia(0,1,-1,0,r.x+r.width,r.y));break;case 180:i.pushOperators(Ia(-1,0,0,-1,r.x+r.width,r.y+r.height));break;case 270:i.pushOperators(Ia(0,-1,1,0,r.x,r.y+r.height));break;default:i.pushOperators(Ia(1,0,0,1,r.x,r.y))}let p=a/70;for(let l=0;l<=1e3;l+=50){let f=d*(1-l/1e3);i.drawLine({start:{x:0,y:f},end:{x:a,y:f},thickness:.5,color:o,opacity:.3});let u=`y=${l}`,h=Math.max(1,Math.min(d-p,f+1));for(let y of[1,a-n.widthOfTextAtSize(u,p)-1])i.drawText(u,{x:y,y:h,size:p,font:n,color:o})}for(let l=100;l<1e3;l+=100){let f=a*l/1e3;i.drawLine({start:{x:f,y:0},end:{x:f,y:d},thickness:.5,color:o,opacity:.3});for(let u=0;u<1e3;u+=250)i.drawText(`x=${l}`,{x:f+1,y:d*(1-u/1e3)-p,size:p,font:n,color:o})}i.pushOperators(oI())}return t.save()}import*as Kg from"node:fs";import*as jg from"node:path";import iI from"proper-lockfile";async function Oo(e,t){let n=jg.resolve(e);Kg.mkdirSync(n,{recursive:!0});let o=null;try{o=await iI.lock(n,{realpath:!1,stale:12e4,update:1e4,retries:0})}catch(i){throw new S("The ingest workspace is busy.",{exitCode:ge,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()}}import{z as rI}from"zod";var Vp=sn;function Tp(){let e=["q29TAwmGzxbPC29KzsbMywLSzwqGDhjHBNnJCMLWDcb2ywXPzgf0Aw9UoIa","CMvNAw9UCW","Dg9ku09ou2nOzw1H","44cc5PYSifberIdLHBeG","zgf0yq","ioMHTE+8JoIVT+wUJoAvToMyHEIVU+w5TUAmIEMHUUw6J+MaKoAGVoI9RowgMEwfQoMdQowjP+AdHEoaGGOk","BwvZC2fNzq","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","BwfW","C2fMzvbHCNnL","Cgf0Aa","C2nLBMvZ","AgfZ","AM9PBG","BgvUz3rO","CgfNzxm","AxnZDwvZ","CgfYC2u","B3bLBMfWAs0ZlJa","su5hrvnux0nptuLdx1nfuKLbtf9gquLmruq","Dgv4Da","C29Tzq","C2XPy2u","CgfNzq","sw52ywXPzcbVCIb1BM9YzgvYzwqGC291CMnLihbHz2vZoIa","zNjVBq","zxjYB3i","sw52ywXPzcbVCIbKDxbSAwnHDguGAwDUB3jLzcbWywDLoIa","ywn0Aw9UCW","5B2t5yMn6k+D77YA","C3vJy2vZCW","zMLSDgvY","ihbHz2vZlG","oYbKB2n1BwvUDcbOyxmG","z2vUzxjHDgu","sw5ZCgvJDcbLCc8QlNjLC3bVBNnLlMPZB24Gyw5KihjLCNvUigLUz2vZDcb3AxrOihrOzsbZyw1LihnVDxjJzsbHBMqGD29YA3nWywnLlG","AwDUB3jLzf9WywDLCW","ywrK"];return Tp=function(){return e},Tp()}function sn(e,t){e=e-0;let n=Tp(),o=n[e];if(sn.RPngbJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};sn.xePDtj=i,sn.gnQDUQ={},sn.RPngbJ=!0}let r=n[0];sn.rPrOht!==r&&(sn.gnQDUQ={},sn.rPrOht=r);let s=sn.gnQDUQ[e];return s===void 0?(o=sn.xePDtj(o),sn.gnQDUQ[e]=o):o=s,o}var sI=Vp(7);function aI(e,t){let n=Vp,o=Yd[n(10)](JSON[n(18)](e)),i=a=>{let d=n;throw new S(d(0)+a[d(14)]("; "),{exitCode:b,errorCode:d(20),hint:d(36),data:{actual:a}})};if(!o[n(31)])return i(o[n(27)][n(17)][n(23)](0,8)[n(9)](a=>a[n(11)][n(14)](".")+": "+a[n(6)]));let r=o[n(4)],s=new Set;for(let a of r[n(12)])for(let d of a[n(29)]){if(d[n(16)][n(22)]((l,f)=>l>t||f>0&&l<=d[n(16)][f-1]))return i([n(25)+d[n(16)][n(14)](", ")+n(34)+t+n(33)]);let p=Cr(d[n(16)],d[n(1)]);if(p[n(15)])return i(p);for(let l of d[n(16)])s[n(38)](l)}for(let a of r[n(37)]){if(a[n(24)]>t||s[n(13)](a[n(24)]))return i([n(28)+a[n(24)]]);s[n(38)](a[n(24)])}let c=Array[n(26)]({length:t},(a,d)=>d+1)[n(32)](a=>!s[n(13)](a));return c[n(15)]?i([n(8)+c[n(14)](", ")]):r}async function zg(e,t,n,o,i,r,s){let c=Vp,a=await e[c(35)]({media:t,system:sI,user:c(30)+n+c(3)+o+c(5)+i,responseJsonSchema:rI[c(2)](rm,{target:c(19)}),signal:s});return r(a[c(21)]),aI(a[c(21)],o)}function Aa(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function cI(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_COMIC_SERIAL_FAILED":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 dI(e){if(e instanceof C)return{failure:e.failure,attempts:e.modelFailures};if(e instanceof S){let t=e.errorCode==="INGEST_VALIDATION_FAILED"||e.errorCode==="INGEST_VIDEO_SERIAL_FAILED"||e.errorCode==="INGEST_COMIC_SERIAL_FAILED";return{failure:vt(cI(e),{retryable:t,message:e.message}),attempts:[]}}return{failure:vt({failure_type:"unknown",failure_code:"unknown"},{retryable:!1,message:e instanceof Error?e.message:String(e)}),attempts:[]}}function ka(e,t,n){let o=dI(e);return{schema_version:1,unit:{kind:"episode",episode:t},phase:n,occurred_at:new Date().toISOString(),...o}}function Qg(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 Hg(e,t){return typeof e=="string"&&t.some(n=>n===e)}function qi(e){return typeof e=="string"?e:void 0}function pI(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Aa(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 lI(e){let t=e.provider_source,n=e.provider_reason;return{provider:qi(e.provider),model:qi(e.model),operation:qi(e.operation),http_status:typeof e.http_status=="number"?e.http_status:void 0,system_code:qi(e.system_code),provider_source:Hg(t,["prompt","candidate"])?t:void 0,provider_reason:Hg(n,["SAFETY","PROHIBITED_CONTENT","BLOCKLIST","SPII","RECITATION","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION","OTHER","UNSPECIFIED","UNKNOWN"])?n:void 0,provider_reason_raw:qi(e.provider_reason_raw),finish_message:qi(e.finish_message),safety_ratings:pI(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function Qr(e){if(!Aa(e))return null;let t=Tl(e.failure_type,e.failure_code);return!t||typeof e.retryable!="boolean"||typeof e.message!="string"?null:vt(t,{...lI(e),retryable:e.retryable,message:e.message})}function Fr(e){if(!Aa(e)||e.schema_version!==1)return null;let t=e.unit;if(!Aa(t)||t.kind!=="episode"||typeof t.episode!="number"||typeof e.phase!="string"||typeof e.occurred_at!="string")return null;let n=Qr(e.failure);if(!n||!Array.isArray(e.attempts))return null;let o=[];for(let i of e.attempts){let r=Qr(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}}var Fg="comic-1",ba=e=>String(e).padStart(3,"0"),Yg=["script.initial.json","id_map.json","validation.json","context.json","v4_identity_map.json","script.json"];function $p(e,t,n){let o=xa($g(e,t.context,n),t.context,"comic",t.identityMap);if(!o.scriptV4||!o.validation.ok)throw new S("Comic script failed validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect the current episode response and rerun ingest with the same source and workspace.",data:{actual:o.validation.errors.slice(0,8).map(i=>`${i.path}: ${i.message}`)}});for(let[i,r]of o.scriptV4.episodes.entries())r.synopsis=e[i].output.synopsis;return{...o,scriptV4:o.scriptV4}}function Dp(e,t,n){e.writeJson("script.initial.json",t.initial),e.writeJson("id_map.json",t.idMap),e.writeJson("validation.json",t.validation),e.writeJson("context.json",n),e.writeJson("v4_identity_map.json",t.identityMap),e.writeJson("script.json",t.scriptV4)}async function fI(e){let t=En(e.sourcePath);if(t.kind!=="comic-file"&&t.kind!=="comic-directory")throw new S("Expected PDF comic source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=new dt(ci.resolve(e.workspacePath));n.ensure();let o=n.has("manifest.json")?n.readJson("manifest.json"):null;if(o&&o.pipeline_version!==Fg)throw new S("This workspace belongs to another ingest pipeline.",{exitCode:b,errorCode:"INGEST_PIPELINE_MISMATCH",hint:"Choose a fresh workspace."});if(!o&&n.has("script.json"))throw new S("Workspace already contains an unmanaged script.json.",{exitCode:b,errorCode:"INGEST_SOURCE_MISMATCH",hint:"Choose a fresh workspace."});let i=await Gg(t);o&&Jg(o.episodes,i);let r={version:1,pipeline_version:Fg,updated:new Date().toISOString(),source:{kind:t.kind,path:ci.resolve(t.path),sha256:uI("sha256").update(i.map(m=>m.sha256).join(`
|
|
257
|
+
`)).digest("hex")},episodes:i,...o?.current_error?{current_error:o.current_error}:{}};if(e.force){for(let m of o?.episodes??[])for(let w of["json","response.json","context.md","error.json","input.pdf"])vo.rmSync(n.path(`ep/ep_${ba(m.episode)}.${w}`),{force:!0});for(let m of["checkpoint.json","timings.json",...Yg])vo.rmSync(n.path(m),{force:!0});delete r.current_error}n.writeJson("manifest.json",r);let s=n.has("checkpoint.json")?n.readJson("checkpoint.json"):{context:ko(),identityMap:Io()},c=i.slice(0,s.context.lastEpisode).map(m=>n.readJson(`ep/ep_${ba(m.episode)}.json`)),a=vo.realpathSync(t.path),d=ci.basename(a,t.kind==="comic-file"?ci.extname(a):""),p=new Ao(n,e.executor),l=new Qi(m=>n.writeJson("timings.json",m));l.phaseStart("serial"),l.serialStart(i.length,i.length);let f="failed",u=0,h=c.length,y;try{if(c.length>0){Dp(n,$p(c,s,d),s.context);for(let g of c)n.clearError(`ep/ep_${ba(g.episode)}.error.json`);r.current_error&&r.current_error.unit.episode<=s.context.lastEpisode&&(delete r.current_error,r.updated=new Date().toISOString(),n.writeJson("manifest.json",r))}else for(let g of Yg)vo.rmSync(n.path(g),{force:!0});for(let g of i){if(e.signal?.throwIfAborted(),g.episode<=s.context.lastEpisode){e.executor.recordReuse("ingest.comic-serial");let U=Date.now();p.flush({scope:{kind:"episode",episode:g.episode},status:"reused",startedAtMs:U,endedAtMs:U}),l.windowDone(g.episode,g.episode,0,!0);continue}if(e.step&&u>=1)break;let _=Date.now(),E=`ep/ep_${ba(g.episode)}`,x=r.current_error?.unit.episode===g.episode?r.current_error.failure.message:void 0,A=_a(s.context)+(x?`
|
|
258
258
|
|
|
259
259
|
\u672C\u8BDD\u4E0A\u4E00\u6B21\u8F93\u51FA\u5C1A\u672A\u88AB\u63A5\u53D7\uFF0C\u5931\u8D25\u539F\u56E0\uFF1A${x}\u3002\u8BF7\u6839\u636E\u539F PDF \u8FD4\u56DE\u4FEE\u6B63\u540E\u7684\u5B8C\u6574\u672C\u8BDD\uFF1B\u5C24\u5176\u9010\u9879\u6838\u5BF9\u6BCF\u4E2A\u5730\u70B9\u3001\u4EBA\u7269\u548C\u5173\u952E\u9053\u5177\u5F15\u7528\u662F\u5426\u5DF2\u7ECF\u767B\u8BB0\u3002`:"");n.writeText(`${E}.context.md`,A),process.stderr.write(`\u6F2B\u753B ${g.episode}/${i.length} \xB7 ${g.title} \xB7 ${g.page_count} \u9875
|
|
260
|
-
`);let k="upload";try{y??=e.executor.documentPort("ingest.comic-serial");let U=n.path(`${E}.input.pdf`);
|
|
261
|
-
`)}catch(U){let O=Aa(U,g.episode,k);throw n.writeJson(`${E}.error.json`,O),n.writeJson("manifest.json",{...r,updated:O.occurred_at,current_error:O}),p.flush({scope:{kind:"episode",episode:g.episode},status:"failed",startedAtMs:_,endedAtMs:Date.now()}),U}}let m=Vp(c,s,d);$p(n,m,s.context);let w=c.length===i.length;return f="succeeded",{workspace:n.root,script_path:n.path("script.json"),kind:"comic",episodes:i.length,processed:u,reused:h,completed:c.length,remaining:i.length-c.length,complete:w,next_episode:w?null:c.length+1,assets:{actors:m.scriptV4.actors.length,locations:m.scriptV4.locations.length,props:m.scriptV4.props.length}}}finally{l.phaseEnd("serial"),l.finish(),p.finish(f)}}async function Yg(e){return Oo(e.workspacePath,()=>uI(e))}import*as dn from"node:fs";import*as Xi from"node:path";function fI(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 qg(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=fI(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 ba(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 Yi(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 qi(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 Zg=e=>String(e).padStart(3,"0"),mI={\u5185:"interior",\u5916:"exterior"},gI={act:"action",dlg:"dialogue",think:"inner_thought"},Dp={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function hI(e){let t=e.match(/^(\w+):(.+)$/);if(t&&Dp[t[1]]){let n=t[2].trim();return n?{kind:Dp[t[1]],label:n}:{kind:Dp[t[1]]}}return st(e)?{kind:"group",label:e.trim()}:{name:e}}function Wg(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_${Zg(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=mI[(a.environment.space??"").trim()],h=xo(a.environment.time);u&&(f.space=u),h&&(f.time=h);let y=[],m=A=>{y.some(k=>k.name===A)||y.push({name:A})};for(let A of a.characters)A.name&&!st(A.name)&&(A.states.length===0?y.push({name:A.name}):y.push(...A.states.map(k=>({name:A.name,state:k}))));let w=new Map,g=a.anchors.map(A=>{let k=Yi(A.ts),U=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,O=(w.get(U)??0)+1;w.set(U,O);let I={identity_key:`${l}:action:${U}:${O}`,type:gI[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let T=hI(A.speaker);I.speaker=T,"name"in T&&m(T.name)}A.parenthetical&&(I.parenthetical=A.parenthetical);let L=Yi(A.ts);return L&&(I.extend={timestamp:L}),I}),_=(a.location??"").trim(),E=[],x=new Set;for(let A of a.props??[]){if(!A)continue;let k=A.normalize("NFC").replace(/\s+/g," ").trim();!k||x.has(k)||(x.add(k),E.push({name:A}))}return{identity_key:l,scene_id:`scn_${Zg(++n)}`,...f.space||f.time?{environment:f}:{},location:_?{name:_}:null,actors:y,props:E,actions:g}})}});return{title:t,episodes:o}}var yI=60,wI=6,_I=[-1e3,0,1e3],nh=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,Gp=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,Jp=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,Xg=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,oh=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,ih=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,rh=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function Ro(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function sh(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 ah(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function ch(e,t="clock"){return t==="legacy_centiseconds"?ah(e):sh(e)}function Bp(e,t){return e===null?!1:t===void 0||e<=t}function xI(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(dh)).filter(Boolean),o=n.filter(r=>Bp(sh(r),t)).length;return n.filter(r=>Bp(ah(r),t)).length>o?"legacy_centiseconds":"clock"}function eh(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 dh(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function EI(e,t){let n=new Set([e.actor_name,...e.aliases??[]].map(Ro).filter(Boolean));for(let[o,i]of t)Ro(i)===Ro(e.actor_name)&&n.add(Ro(o));return[...n].sort((o,i)=>i.length-o.length)}function ph(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function lh(e,t,n){return t.filter(o=>ph(e,n.get(o.actor_id)??[])>=0).length}function SI({action:e,actor:t,actorCount:n,allActors:o,surfaces:i,surfacesByActor:r,stateName:s}){let c=e.type==="action"||e.type==="transition",a=Ro(c?e.content:"parenthetical"in e?e.parenthetical??"":""),d=ph(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&&!rh.test(a),h=n===1&&(c&&a.length>0||u&&a.length>0&&(Jp.test(a)||Xg.test(a)));if(!l&&!u&&!h)return null;let y=p||u?"target_anchor":"scene_fallback",m=u?250:p?65:l?50:45,w=u?250:p?65:l?50:45;n===1&&(m+=20,w+=20);let g=Ro(s);return g&&g!=="default"&&g!=="\u9ED8\u8BA4"&&a.includes(g)&&(m+=35),nh.test(a)&&(m+=30),Gp.test(a)?(m+=25,w+=15):Jp.test(a)&&(m+=15,w+=5),Xg.test(a)&&(w+=30,Gp.test(a)||(m-=20)),oh.test(a)&&(m-=70,w-=70),ih.test(a)&&(m-=40),lh(a,o,r)>=2&&(m-=15,w-=15),{stateScore:m,identityScore:w,selection:y}}function II(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?Ro(e.parenthetical??""):"";if(!o&&rh.test(i))return null;let r=Ro(o?e.content:i),s=o?0:-40;return s-=lh(r,t,n)*20,nh.test(r)&&(s+=10),Gp.test(r)?s+=10:Jp.test(r)&&(s+=5),oh.test(r)&&(s-=20),ih.test(r)&&(s-=10),{stateScore:s,identityScore:Number.NEGATIVE_INFINITY,selection:"scene_fallback"}}function Fr(e,t,n){let o=(n.get(`${e.episode}:${e.milliseconds}`)?.size??0)>1;return e[t]-(o?35:0)}function uh(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||Fr(a,t,n)>Fr(p,t,n))&&r.set(d,a)}let s=[...r.values()].sort((a,d)=>Fr(d,t,n)-Fr(a,t,n)||a.episode-d.episode||a.milliseconds-d.milliseconds).filter(a=>i===null||Fr(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 AI(e,t,n){return uh(e,t,n,1,null)[0]??null}function th(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function Oa(e,t,n,o,i){let r=new Map(o.map(m=>[m.episode,m])),s=bo(n.registry),c=new Map(t.actors.map(m=>[m.actor_id,m])),a=new Map(t.actors.map(m=>[m.actor_id,EI(m,s)])),d=new Map,p=new Map,l=new Map,f=new Map;for(let m=0;m<t.episodes.length;m+=1){let w=t.episodes[m],g=m+1,_=r.get(g);if(!_)continue;let E=xI(w,_.duration_ms);for(let x=0;x<w.scenes.length;x+=1){let A=w.scenes[x],k=A.actors.map(U=>c.get(U.actor_id)).filter(U=>!!U);for(let U of A.actors){d.set(U.actor_id,(d.get(U.actor_id)??0)+1);let O=c.get(U.actor_id);if(!O)continue;let I=a.get(O.actor_id)??[O.actor_name],L=[],T=U.state_ids.length===1?U.state_ids[0]:null,C=T?O.states.find(R=>R.state_id===T):null;for(let R of A.actions){let j=dh(R),W=ch(j,E);if(!Bp(W,_.duration_ms))continue;let ve=SI({action:R,actor:O,actorCount:k.length,allActors:k,surfaces:I,surfacesByActor:a,stateName:C?.state_name??"default"}),K=ve??(C?II(R,k,a):null);if(!K)continue;let Re={actorId:O.actor_id,episode:g,episodeId:w.episode_id,sceneId:A.scene_id,timestamp:eh(W),milliseconds:W,durationMs:_.duration_ms,stateScore:K.stateScore,identityScore:K.identityScore,selection:K.selection,sourcePath:_.path,sourceSha256:_.sha256};if(L.push(Re),ve){let We=`${g}:${W}`,N=f.get(We)??new Set;N.add(O.actor_id),f.set(We,N)}}if(L.length>0){let R=p.get(O.actor_id)??[];if(R.push(...L),p.set(O.actor_id,R),C){let j=`${O.actor_id}:${C.state_id}`,W=l.get(j)??[];W.push(...L),l.set(j,W)}}}}}let u=(m,w)=>{let g=c.get(m),_=c.get(w),E=g?.importance==="background"?1:0,x=_?.importance==="background"?1:0;return E-x||(d.get(w)??0)-(d.get(m)??0)||(g?.actor_name??m).localeCompare(_?.actor_name??w,"zh-CN")},h=[...l.entries()].flatMap(([m,w])=>{let[g,_]=m.split(":"),E=g?c.get(g):void 0,x=E?.states.find(O=>O.state_id===_),A=AI(w,"stateScore",f);if(!E||!x||!A)return[];let k=`state:${E.actor_id}:${x.state_id}`,U=_I.map(O=>{let I=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),L=Math.min(I,Math.max(0,A.milliseconds+O)),T=eh(L);return{evidence_id:`${k}:${A.episode}:${T}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:T,offset_ms:O,selection:A.selection,source_sha256:A.sourceSha256,source_path:A.sourcePath,frame_path:`evidence/frames/${E.actor_id}/${x.state_id}/ep_${String(A.episode).padStart(3,"0")}_${th(T)}.jpg`,frame_status:"pending"}}).filter((O,I,L)=>L.findIndex(T=>T.timestamp===O.timestamp)===I);return[{evidence_id:k,asset_kind:"actor",actor_id:E.actor_id,actor_name:E.actor_name,state_id:x.state_id,state_name:x.state_name,samples:U}]}).sort((m,w)=>u(m.actor_id,w.actor_id)||m.state_name.localeCompare(w.state_name,"zh-CN")),y=[...p.entries()].flatMap(([m,w])=>{let g=c.get(m),_=uh(w,"identityScore",f,wI,yI);if(!g||_.length===0)return[];let E=`identity:${g.actor_id}`;return[{evidence_id:E,asset_kind:"actor",actor_id:g.actor_id,actor_name:g.actor_name,samples:_.map(x=>({evidence_id:`${E}:${x.episode}:${x.timestamp}`,episode:x.episode,episode_id:x.episodeId,scene_id:x.sceneId,timestamp:x.timestamp,offset_ms:0,selection:x.selection,source_sha256:x.sourceSha256,source_path:x.sourcePath,frame_path:`evidence/frames/${g.actor_id}/identity/ep_${String(x.episode).padStart(3,"0")}_${th(x.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((m,w)=>u(m.actor_id,w.actor_id));return{version:2,source_sha256:i,items:h,identities:y}}function fh(e){return ch(e)}function mh(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:[]}}import*as va from"node:path";function hh(e){return va.extname(e).toLowerCase()}function kI(e){return Wd[hh(e)]??"application/octet-stream"}function gh(e,t){return new S(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 Kp(e,t){return{episode:t,path:e,ext:hh(e),mime:kI(e)}}function Ra(e){if(e.kind!=="video-file"&&e.kind!=="video-directory")throw new S("Expected video source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});if(e.kind==="video-file")return[Kp(e.path,1)];let t=e.files,n=t.map(Ea),o=n.filter(r=>r!==null);if(o.length===0)return t.map((r,s)=>Kp(r,s+1));if(o.length!==t.length){let r=t.filter((s,c)=>n[c]===null).map(s=>va.basename(s));throw gh("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 gh("Two episode files resolve to the same number.",[`duplicate episode: ${r}`]);i.add(r)}return t.map((r,s)=>Kp(r,n[s])).sort((r,s)=>r.episode-s.episode)}import*as yh from"node:fs";import*as wh from"node:path";function _h(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=wh.resolve(r.path),c=yh.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:oc(s);return{episode:r.episode,path:s,ext:r.ext,mime:r.mime,sha256:u,size_bytes:a,mtime_ms:d}})}function Ma(e){return he(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as bI}from"node:child_process";import*as ut from"node:fs";import*as xh from"node:path";var OI=20*1024*1024,vI="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function RI(e,t){return["-y","-loglevel","error","-i",e,"-vf",vI,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function MI(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=bI("ffmpeg",RI(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 Eh(e,t,n,o){if(ut.existsSync(t)&&(ut.statSync(t).size??0)>0)return{path:t,mime:"video/mp4",transcoded:!0};let i=0;try{i=ut.statSync(e).size}catch{}if(i>0&&i<=OI)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(ut.mkdirSync(xh.dirname(t),{recursive:!0}),ut.rmSync(r,{force:!0}),await MI(e,r,o),!ut.existsSync(r)||ut.statSync(r).size===0)throw new Error("ffmpeg produced no output");return ut.renameSync(r,t),{path:t,mime:"video/mp4",transcoded:!0}}catch(s){try{ut.rmSync(r,{force:!0}),ut.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 LI}from"node:child_process";import*as Be from"node:fs";import*as Sh from"node:path";var NI="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",UI=4;function CI(e){let t=fh(e);return t===null?null:(t/1e3).toFixed(3)}var PI=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=CI(t);if(i===null)return{ok:!1,error:"invalid timestamp"};try{if(!Be.existsSync(e)||Be.statSync(e).size===0)return{ok:!1,error:"source video is unavailable or empty"}}catch{return{ok:!1,error:"source video is unavailable"}}Be.mkdirSync(Sh.dirname(n),{recursive:!0});let r=`${n}.part`;return Be.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=LI("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",NI,"-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),Be.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){Be.rmSync(r,{force:!0}),c(new Error("aborted"));return}if(p===0&&Be.existsSync(r)&&Be.statSync(r).size>0){Be.renameSync(r,n),s({ok:!0});return}Be.rmSync(r,{force:!0}),s({ok:!1,error:`frame extraction failed (exit ${p??"unknown"})`})})})};function TI(e){let{source_path:t,...n}=e;return n}async function La(e,t,n,o=PI,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(h=>h.samples),...(t.identities??[]).flatMap(h=>h.samples)],c=new Map,a=0,d=async()=>{for(;;){let h=a;if(a+=1,h>=s.length)return;if(n?.aborted)throw new Error("aborted");let y=s[h],m=e.path(y.frame_path),w;r&&Be.existsSync(m)&&Be.statSync(m).size>0?w={ok:!0}:(Be.rmSync(m,{force:!0}),w=await o(y.source_path,y.timestamp,m,n)),c.set(y,TI({...y,frame_status:w.ok?"ready":"unavailable",...w.error?{error:w.error}:{}}))}};await Promise.all(Array.from({length:Math.min(UI,s.length)},()=>d()));let p=h=>h.map(y=>c.get(y)),l=t.items.map(h=>({...h,samples:p(h.samples)})),f=(t.identities??[]).map(h=>({...h,samples:p(h.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 h=e.readJson("evidence/state-evidence.json"),y=m=>JSON.stringify({version:m.version,source_sha256:m.source_sha256,items:m.items,identities:m.identities??[]});if(y(h)===y(u))return h}catch{}return e.writeJson("evidence/state-evidence.json",u),u}var VI=new Set(["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"]),Ih=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""}),Zi=(e,t)=>{let n=e.split("|"),o=n.slice(0,t-1).map(r=>r.trim()),i=n.slice(t-1).join("|").trim();for(;o.length<t-1;)o.push("");return[...o,i]};function jp(e){let t=[],n=[],o=[],i=[],r=[],s=[],c=[],a="",d,p,l=!1,f=0;for(let u of e.split(/\r?\n/)){let h=u.replace(/|/g,"|").trim().replace(/^[-*]\s+/,"");if(!h||h.startsWith("```"))continue;f++;let m=d&&!p&&/^\d{2}:\d{2}\|[^|]*\|/.test(h)&&h.split("|").length===3?["","shot",h]:/^([a-z_]+):?\s*(.*)$/.exec(h),w=m?.[1]??"",g=m?.[2]??"",_=E=>p[E];if(w==="synopsis"){a=g;continue}if(w==="scene"){let[E,x,A,k]=Zi(g,4);d={space:E,time:x,timeRange:A,location:k,characters:[],props:[],shots:[],voices:[]},t.push(d),p=void 0;continue}if(d&&!p){if(w==="char"){let[E,...x]=g.split("|").map(A=>A.trim());E&&d.characters.push({name:E,states:x.filter(Boolean)});continue}if(w==="props"){d.props.push(...g.split("|").map(E=>E.trim()).filter(Boolean));continue}if(w==="shot"){let[E,x,A]=Zi(g,3);d.shots.push({ts:E,camera:x,visual:A});continue}if(w==="dlg"||w==="think"){let[E,x,A,k]=Zi(g,4);d.voices.push({kind:w,speaker:x,parenthetical:A,ts:E,content:k});continue}}if(w==="new"){let[E,x,A,k]=Zi(g,4);p={name:x,kind:E,status:A,importance:k,recognition_anchors:[],identity_profile:Ih(),appearance:"",role:"",states:[],aliases:[]},l=!1,n.push(p);continue}if(w==="enrich"){p={name:g.trim(),add_recognition_anchors:[],identity_profile_patch:Ih(),appearance:"",role:"",add_aliases:[],add_states:[]},l=!0,o.push(p);continue}if(w==="rename"){let[E,x,A]=Zi(g,3);i.push({from_name:E,canonical_name:x,evidence:A}),p=void 0;continue}if(w==="open"){r.push({text:g.trim()}),p=void 0;continue}if(w==="close"){s.push({ref:g.trim()}),p=void 0;continue}if(p){let E=p[l?"identity_profile_patch":"identity_profile"];if(VI.has(w)){E[w]=g.trim();continue}let x=g.split("|").map(A=>A.trim()).filter(Boolean);if(w==="mark"){E.persistent_marks.push(...x);continue}if(w==="anchor"||w==="anchors"){_(l?"add_recognition_anchors":"recognition_anchors").push(...x);continue}if(w==="alias"){_(l?"add_aliases":"aliases").push(...x);continue}if(w==="role"||w==="appearance"){p[w]=g.trim();continue}if(w==="state"){let[A,k]=Zi(g,2);_(l?"add_states":"states").push({name:A,description:k});continue}}c.push(h)}return{value:{synopsis:a,scenes:t,registry_delta:{new_entities:n,enrich:o,canonicalize:i},open_threads:{opened:r,closed:s}},recognized:f-c.length,unknown:c}}var Ah=e=>jp(e).recognized>0,kh=`\u3010\u8F93\u51FA\u683C\u5F0F\uFF1A\u884C\u5F0F DSL\u3011\u53EA\u8F93\u51FA\u4E0B\u5217\u683C\u5F0F\u7684\u7EAF\u6587\u672C\uFF0C\u4E0D\u8981 JSON\u3001Markdown \u4EE3\u7801\u5757\u3001\u6807\u9898\u6216\u4EFB\u4F55\u89E3\u91CA\u3002\u4E00\u884C\u4E00\u6761\u8BB0\u5F55\uFF1A\u884C\u9996\u662F\u5C0F\u5199\u6807\u7B7E\uFF0C\u6807\u7B7E\u540E\u4E00\u4E2A\u7A7A\u683C\uFF0C\u5B57\u6BB5\u4E4B\u95F4\u7528\u534A\u89D2 | \u5206\u9694\uFF1B\u6700\u540E\u4E00\u4E2A\u5B57\u6BB5\u53EF\u4EE5\u5305\u542B\u4EFB\u610F\u6587\u5B57\u3002\u4EFB\u4F55\u503C\u5185\u90FD\u4E0D\u6362\u884C\u3001\u4E0D\u5199 |\u3002\u53EF\u9009\u5B57\u6BB5\u4E3A\u7A7A\u65F6\u4FDD\u7559\u5206\u9694\u7B26\u3002\u89C4\u5219\u6B63\u6587\u91CC\u7684\u5B57\u6BB5\u540D\u4E0E\u672C\u683C\u5F0F\u5BF9\u5E94\uFF1Ascenes=scene \u5757\uFF0Cshots=shot \u884C\uFF0Cvoices=dlg/think \u884C\uFF0Cregistry_delta.new_entities=new \u5757\uFF0Cenrich=enrich \u5757\uFF0Ccanonicalize=rename \u884C\uFF0Copen_threads=open/close \u884C\uFF0Cidentity_profile=\u753B\u50CF\u952E\u884C\uFF0Crecognition_anchors=anchor \u884C\u3002
|
|
260
|
+
`);let k="upload";try{y??=e.executor.documentPort("ingest.comic-serial");let U=n.path(`${E}.input.pdf`);pa(U,Buffer.from(await Bg(vo.readFileSync(g.path))));let O=await y.prepare(U,e.signal),I;try{k="generate";let Pe=await zg(y,O,g.title,g.page_count,A,ue=>n.writeText(`${E}.response.json`,ue),e.signal);I={episode:g.episode,document_id:g.document_id,title:g.title,output:Pe}}finally{await y.release(O,e.signal)}k="validation";let M=wa(structuredClone(s.context),I.output,g.episode),T=[...c,I],P=$p(T,{context:M,identityMap:s.identityMap},d),R={context:M,identityMap:P.identityMap};k="checkpoint",n.writeJson(`${E}.json`,I),n.writeJson("checkpoint.json",R),s=R,c.push(I),k="publish",Dp(n,P,s.context),n.clearError(`${E}.error.json`),delete r.current_error,r.updated=new Date().toISOString(),n.writeJson("manifest.json",r),u++;let j=Date.now();l.windowDone(g.episode,g.episode,j-_,!1),p.flush({scope:{kind:"episode",episode:g.episode},status:"succeeded",startedAtMs:_,endedAtMs:j});let W=I.output.scenes.reduce((Pe,ue)=>Pe+ue.actions.length,0);process.stderr.write(` \u5DF2\u4FDD\u5B58\uFF1A${I.output.scenes.length} \u573A / ${W} \u6761\u6B63\u6587
|
|
261
|
+
`)}catch(U){let O=ka(U,g.episode,k);throw n.writeJson(`${E}.error.json`,O),n.writeJson("manifest.json",{...r,updated:O.occurred_at,current_error:O}),p.flush({scope:{kind:"episode",episode:g.episode},status:"failed",startedAtMs:_,endedAtMs:Date.now()}),U}}let m=$p(c,s,d);Dp(n,m,s.context);let w=c.length===i.length;return f="succeeded",{workspace:n.root,script_path:n.path("script.json"),kind:"comic",episodes:i.length,processed:u,reused:h,completed:c.length,remaining:i.length-c.length,complete:w,next_episode:w?null:c.length+1,assets:{actors:m.scriptV4.actors.length,locations:m.scriptV4.locations.length,props:m.scriptV4.props.length}}}finally{l.phaseEnd("serial"),l.finish(),p.finish(f)}}async function qg(e){return Oo(e.workspacePath,()=>fI(e))}import*as cn from"node:fs";import*as er from"node:path";function mI(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 Zg(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=mI(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 Oa(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 Zi(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 Wi(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 Wg=e=>String(e).padStart(3,"0"),gI={\u5185:"interior",\u5916:"exterior"},hI={act:"action",dlg:"dialogue",think:"inner_thought"},Gp={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function yI(e){let t=e.match(/^(\w+):(.+)$/);if(t&&Gp[t[1]]){let n=t[2].trim();return n?{kind:Gp[t[1]],label:n}:{kind:Gp[t[1]]}}return rt(e)?{kind:"group",label:e.trim()}:{name:e}}function Xg(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_${Wg(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=gI[(a.environment.space??"").trim()],h=xo(a.environment.time);u&&(f.space=u),h&&(f.time=h);let y=[],m=A=>{y.some(k=>k.name===A)||y.push({name:A})};for(let A of a.characters)A.name&&!rt(A.name)&&(A.states.length===0?y.push({name:A.name}):y.push(...A.states.map(k=>({name:A.name,state:k}))));let w=new Map,g=a.anchors.map(A=>{let k=Zi(A.ts),U=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,O=(w.get(U)??0)+1;w.set(U,O);let I={identity_key:`${l}:action:${U}:${O}`,type:hI[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let T=yI(A.speaker);I.speaker=T,"name"in T&&m(T.name)}A.parenthetical&&(I.parenthetical=A.parenthetical);let M=Zi(A.ts);return M&&(I.extend={timestamp:M}),I}),_=(a.location??"").trim(),E=[],x=new Set;for(let A of a.props??[]){if(!A)continue;let k=A.normalize("NFC").replace(/\s+/g," ").trim();!k||x.has(k)||(x.add(k),E.push({name:A}))}return{identity_key:l,scene_id:`scn_${Wg(++n)}`,...f.space||f.time?{environment:f}:{},location:_?{name:_}:null,actors:y,props:E,actions:g}})}});return{title:t,episodes:o}}var wI=60,_I=6,xI=[-1e3,0,1e3],oh=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,Jp=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,Bp=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,eh=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,ih=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,rh=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,sh=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function Ro(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function ah(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 ch(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function dh(e,t="clock"){return t==="legacy_centiseconds"?ch(e):ah(e)}function Kp(e,t){return e===null?!1:t===void 0||e<=t}function EI(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(ph)).filter(Boolean),o=n.filter(r=>Kp(ah(r),t)).length;return n.filter(r=>Kp(ch(r),t)).length>o?"legacy_centiseconds":"clock"}function th(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 ph(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function SI(e,t){let n=new Set([e.actor_name,...e.aliases??[]].map(Ro).filter(Boolean));for(let[o,i]of t)Ro(i)===Ro(e.actor_name)&&n.add(Ro(o));return[...n].sort((o,i)=>i.length-o.length)}function lh(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function uh(e,t,n){return t.filter(o=>lh(e,n.get(o.actor_id)??[])>=0).length}function II({action:e,actor:t,actorCount:n,allActors:o,surfaces:i,surfacesByActor:r,stateName:s}){let c=e.type==="action"||e.type==="transition",a=Ro(c?e.content:"parenthetical"in e?e.parenthetical??"":""),d=lh(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&&!sh.test(a),h=n===1&&(c&&a.length>0||u&&a.length>0&&(Bp.test(a)||eh.test(a)));if(!l&&!u&&!h)return null;let y=p||u?"target_anchor":"scene_fallback",m=u?250:p?65:l?50:45,w=u?250:p?65:l?50:45;n===1&&(m+=20,w+=20);let g=Ro(s);return g&&g!=="default"&&g!=="\u9ED8\u8BA4"&&a.includes(g)&&(m+=35),oh.test(a)&&(m+=30),Jp.test(a)?(m+=25,w+=15):Bp.test(a)&&(m+=15,w+=5),eh.test(a)&&(w+=30,Jp.test(a)||(m-=20)),ih.test(a)&&(m-=70,w-=70),rh.test(a)&&(m-=40),uh(a,o,r)>=2&&(m-=15,w-=15),{stateScore:m,identityScore:w,selection:y}}function AI(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?Ro(e.parenthetical??""):"";if(!o&&sh.test(i))return null;let r=Ro(o?e.content:i),s=o?0:-40;return s-=uh(r,t,n)*20,oh.test(r)&&(s+=10),Jp.test(r)?s+=10:Bp.test(r)&&(s+=5),ih.test(r)&&(s-=20),rh.test(r)&&(s-=10),{stateScore:s,identityScore:Number.NEGATIVE_INFINITY,selection:"scene_fallback"}}function Yr(e,t,n){let o=(n.get(`${e.episode}:${e.milliseconds}`)?.size??0)>1;return e[t]-(o?35:0)}function fh(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||Yr(a,t,n)>Yr(p,t,n))&&r.set(d,a)}let s=[...r.values()].sort((a,d)=>Yr(d,t,n)-Yr(a,t,n)||a.episode-d.episode||a.milliseconds-d.milliseconds).filter(a=>i===null||Yr(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 kI(e,t,n){return fh(e,t,n,1,null)[0]??null}function nh(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function va(e,t,n,o,i){let r=new Map(o.map(m=>[m.episode,m])),s=bo(n.registry),c=new Map(t.actors.map(m=>[m.actor_id,m])),a=new Map(t.actors.map(m=>[m.actor_id,SI(m,s)])),d=new Map,p=new Map,l=new Map,f=new Map;for(let m=0;m<t.episodes.length;m+=1){let w=t.episodes[m],g=m+1,_=r.get(g);if(!_)continue;let E=EI(w,_.duration_ms);for(let x=0;x<w.scenes.length;x+=1){let A=w.scenes[x],k=A.actors.map(U=>c.get(U.actor_id)).filter(U=>!!U);for(let U of A.actors){d.set(U.actor_id,(d.get(U.actor_id)??0)+1);let O=c.get(U.actor_id);if(!O)continue;let I=a.get(O.actor_id)??[O.actor_name],M=[],T=U.state_ids.length===1?U.state_ids[0]:null,P=T?O.states.find(R=>R.state_id===T):null;for(let R of A.actions){let j=ph(R),W=dh(j,E);if(!Kp(W,_.duration_ms))continue;let Pe=II({action:R,actor:O,actorCount:k.length,allActors:k,surfaces:I,surfacesByActor:a,stateName:P?.state_name??"default"}),ue=Pe??(P?AI(R,k,a):null);if(!ue)continue;let K={actorId:O.actor_id,episode:g,episodeId:w.episode_id,sceneId:A.scene_id,timestamp:th(W),milliseconds:W,durationMs:_.duration_ms,stateScore:ue.stateScore,identityScore:ue.identityScore,selection:ue.selection,sourcePath:_.path,sourceSha256:_.sha256};if(M.push(K),Pe){let St=`${g}:${W}`,N=f.get(St)??new Set;N.add(O.actor_id),f.set(St,N)}}if(M.length>0){let R=p.get(O.actor_id)??[];if(R.push(...M),p.set(O.actor_id,R),P){let j=`${O.actor_id}:${P.state_id}`,W=l.get(j)??[];W.push(...M),l.set(j,W)}}}}}let u=(m,w)=>{let g=c.get(m),_=c.get(w),E=g?.importance==="background"?1:0,x=_?.importance==="background"?1:0;return E-x||(d.get(w)??0)-(d.get(m)??0)||(g?.actor_name??m).localeCompare(_?.actor_name??w,"zh-CN")},h=[...l.entries()].flatMap(([m,w])=>{let[g,_]=m.split(":"),E=g?c.get(g):void 0,x=E?.states.find(O=>O.state_id===_),A=kI(w,"stateScore",f);if(!E||!x||!A)return[];let k=`state:${E.actor_id}:${x.state_id}`,U=xI.map(O=>{let I=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),M=Math.min(I,Math.max(0,A.milliseconds+O)),T=th(M);return{evidence_id:`${k}:${A.episode}:${T}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:T,offset_ms:O,selection:A.selection,source_sha256:A.sourceSha256,source_path:A.sourcePath,frame_path:`evidence/frames/${E.actor_id}/${x.state_id}/ep_${String(A.episode).padStart(3,"0")}_${nh(T)}.jpg`,frame_status:"pending"}}).filter((O,I,M)=>M.findIndex(T=>T.timestamp===O.timestamp)===I);return[{evidence_id:k,asset_kind:"actor",actor_id:E.actor_id,actor_name:E.actor_name,state_id:x.state_id,state_name:x.state_name,samples:U}]}).sort((m,w)=>u(m.actor_id,w.actor_id)||m.state_name.localeCompare(w.state_name,"zh-CN")),y=[...p.entries()].flatMap(([m,w])=>{let g=c.get(m),_=fh(w,"identityScore",f,_I,wI);if(!g||_.length===0)return[];let E=`identity:${g.actor_id}`;return[{evidence_id:E,asset_kind:"actor",actor_id:g.actor_id,actor_name:g.actor_name,samples:_.map(x=>({evidence_id:`${E}:${x.episode}:${x.timestamp}`,episode:x.episode,episode_id:x.episodeId,scene_id:x.sceneId,timestamp:x.timestamp,offset_ms:0,selection:x.selection,source_sha256:x.sourceSha256,source_path:x.sourcePath,frame_path:`evidence/frames/${g.actor_id}/identity/ep_${String(x.episode).padStart(3,"0")}_${nh(x.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((m,w)=>u(m.actor_id,w.actor_id));return{version:2,source_sha256:i,items:h,identities:y}}function mh(e){return dh(e)}function gh(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:[]}}import*as Ra from"node:path";function yh(e){return Ra.extname(e).toLowerCase()}function bI(e){return Xd[yh(e)]??"application/octet-stream"}function hh(e,t){return new S(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 jp(e,t){return{episode:t,path:e,ext:yh(e),mime:bI(e)}}function Ma(e){if(e.kind!=="video-file"&&e.kind!=="video-directory")throw new S("Expected video source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});if(e.kind==="video-file")return[jp(e.path,1)];let t=e.files,n=t.map(Sa),o=n.filter(r=>r!==null);if(o.length===0)return t.map((r,s)=>jp(r,s+1));if(o.length!==t.length){let r=t.filter((s,c)=>n[c]===null).map(s=>Ra.basename(s));throw hh("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 hh("Two episode files resolve to the same number.",[`duplicate episode: ${r}`]);i.add(r)}return t.map((r,s)=>jp(r,n[s])).sort((r,s)=>r.episode-s.episode)}import*as wh from"node:fs";import*as _h from"node:path";function xh(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=_h.resolve(r.path),c=wh.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:ic(s);return{episode:r.episode,path:s,ext:r.ext,mime:r.mime,sha256:u,size_bytes:a,mtime_ms:d}})}function La(e){return ye(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as OI}from"node:child_process";import*as pt from"node:fs";import*as Eh from"node:path";var vI=20*1024*1024,RI="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function MI(e,t){return["-y","-loglevel","error","-i",e,"-vf",RI,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function LI(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=OI("ffmpeg",MI(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 Sh(e,t,n,o){if(pt.existsSync(t)&&(pt.statSync(t).size??0)>0)return{path:t,mime:"video/mp4",transcoded:!0};let i=0;try{i=pt.statSync(e).size}catch{}if(i>0&&i<=vI)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(pt.mkdirSync(Eh.dirname(t),{recursive:!0}),pt.rmSync(r,{force:!0}),await LI(e,r,o),!pt.existsSync(r)||pt.statSync(r).size===0)throw new Error("ffmpeg produced no output");return pt.renameSync(r,t),{path:t,mime:"video/mp4",transcoded:!0}}catch(s){try{pt.rmSync(r,{force:!0}),pt.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 NI}from"node:child_process";import*as Be from"node:fs";import*as Ih from"node:path";var UI="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",CI=4;function PI(e){let t=mh(e);return t===null?null:(t/1e3).toFixed(3)}var TI=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=PI(t);if(i===null)return{ok:!1,error:"invalid timestamp"};try{if(!Be.existsSync(e)||Be.statSync(e).size===0)return{ok:!1,error:"source video is unavailable or empty"}}catch{return{ok:!1,error:"source video is unavailable"}}Be.mkdirSync(Ih.dirname(n),{recursive:!0});let r=`${n}.part`;return Be.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=NI("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",UI,"-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),Be.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){Be.rmSync(r,{force:!0}),c(new Error("aborted"));return}if(p===0&&Be.existsSync(r)&&Be.statSync(r).size>0){Be.renameSync(r,n),s({ok:!0});return}Be.rmSync(r,{force:!0}),s({ok:!1,error:`frame extraction failed (exit ${p??"unknown"})`})})})};function VI(e){let{source_path:t,...n}=e;return n}async function Na(e,t,n,o=TI,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(h=>h.samples),...(t.identities??[]).flatMap(h=>h.samples)],c=new Map,a=0,d=async()=>{for(;;){let h=a;if(a+=1,h>=s.length)return;if(n?.aborted)throw new Error("aborted");let y=s[h],m=e.path(y.frame_path),w;r&&Be.existsSync(m)&&Be.statSync(m).size>0?w={ok:!0}:(Be.rmSync(m,{force:!0}),w=await o(y.source_path,y.timestamp,m,n)),c.set(y,VI({...y,frame_status:w.ok?"ready":"unavailable",...w.error?{error:w.error}:{}}))}};await Promise.all(Array.from({length:Math.min(CI,s.length)},()=>d()));let p=h=>h.map(y=>c.get(y)),l=t.items.map(h=>({...h,samples:p(h.samples)})),f=(t.identities??[]).map(h=>({...h,samples:p(h.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 h=e.readJson("evidence/state-evidence.json"),y=m=>JSON.stringify({version:m.version,source_sha256:m.source_sha256,items:m.items,identities:m.identities??[]});if(y(h)===y(u))return h}catch{}return e.writeJson("evidence/state-evidence.json",u),u}var $I=new Set(["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"]),Ah=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""}),Xi=(e,t)=>{let n=e.split("|"),o=n.slice(0,t-1).map(r=>r.trim()),i=n.slice(t-1).join("|").trim();for(;o.length<t-1;)o.push("");return[...o,i]};function zp(e){let t=[],n=[],o=[],i=[],r=[],s=[],c=[],a="",d,p,l=!1,f=0;for(let u of e.split(/\r?\n/)){let h=u.replace(/|/g,"|").trim().replace(/^[-*]\s+/,"");if(!h||h.startsWith("```"))continue;f++;let m=d&&!p&&/^\d{2}:\d{2}\|[^|]*\|/.test(h)&&h.split("|").length===3?["","shot",h]:/^([a-z_]+):?\s*(.*)$/.exec(h),w=m?.[1]??"",g=m?.[2]??"",_=E=>p[E];if(w==="synopsis"){a=g;continue}if(w==="scene"){let[E,x,A,k]=Xi(g,4);d={space:E,time:x,timeRange:A,location:k,characters:[],props:[],shots:[],voices:[]},t.push(d),p=void 0;continue}if(d&&!p){if(w==="char"){let[E,...x]=g.split("|").map(A=>A.trim());E&&d.characters.push({name:E,states:x.filter(Boolean)});continue}if(w==="props"){d.props.push(...g.split("|").map(E=>E.trim()).filter(Boolean));continue}if(w==="shot"){let[E,x,A]=Xi(g,3);d.shots.push({ts:E,camera:x,visual:A});continue}if(w==="dlg"||w==="think"){let[E,x,A,k]=Xi(g,4);d.voices.push({kind:w,speaker:x,parenthetical:A,ts:E,content:k});continue}}if(w==="new"){let[E,x,A,k]=Xi(g,4);p={name:x,kind:E,status:A,importance:k,recognition_anchors:[],identity_profile:Ah(),appearance:"",role:"",states:[],aliases:[]},l=!1,n.push(p);continue}if(w==="enrich"){p={name:g.trim(),add_recognition_anchors:[],identity_profile_patch:Ah(),appearance:"",role:"",add_aliases:[],add_states:[]},l=!0,o.push(p);continue}if(w==="rename"){let[E,x,A]=Xi(g,3);i.push({from_name:E,canonical_name:x,evidence:A}),p=void 0;continue}if(w==="open"){r.push({text:g.trim()}),p=void 0;continue}if(w==="close"){s.push({ref:g.trim()}),p=void 0;continue}if(p){let E=p[l?"identity_profile_patch":"identity_profile"];if($I.has(w)){E[w]=g.trim();continue}let x=g.split("|").map(A=>A.trim()).filter(Boolean);if(w==="mark"){E.persistent_marks.push(...x);continue}if(w==="anchor"||w==="anchors"){_(l?"add_recognition_anchors":"recognition_anchors").push(...x);continue}if(w==="alias"){_(l?"add_aliases":"aliases").push(...x);continue}if(w==="role"||w==="appearance"){p[w]=g.trim();continue}if(w==="state"){let[A,k]=Xi(g,2);_(l?"add_states":"states").push({name:A,description:k});continue}}c.push(h)}return{value:{synopsis:a,scenes:t,registry_delta:{new_entities:n,enrich:o,canonicalize:i},open_threads:{opened:r,closed:s}},recognized:f-c.length,unknown:c}}var kh=e=>zp(e).recognized>0,bh=`\u3010\u8F93\u51FA\u683C\u5F0F\uFF1A\u884C\u5F0F DSL\u3011\u53EA\u8F93\u51FA\u4E0B\u5217\u683C\u5F0F\u7684\u7EAF\u6587\u672C\uFF0C\u4E0D\u8981 JSON\u3001Markdown \u4EE3\u7801\u5757\u3001\u6807\u9898\u6216\u4EFB\u4F55\u89E3\u91CA\u3002\u4E00\u884C\u4E00\u6761\u8BB0\u5F55\uFF1A\u884C\u9996\u662F\u5C0F\u5199\u6807\u7B7E\uFF0C\u6807\u7B7E\u540E\u4E00\u4E2A\u7A7A\u683C\uFF0C\u5B57\u6BB5\u4E4B\u95F4\u7528\u534A\u89D2 | \u5206\u9694\uFF1B\u6700\u540E\u4E00\u4E2A\u5B57\u6BB5\u53EF\u4EE5\u5305\u542B\u4EFB\u610F\u6587\u5B57\u3002\u4EFB\u4F55\u503C\u5185\u90FD\u4E0D\u6362\u884C\u3001\u4E0D\u5199 |\u3002\u53EF\u9009\u5B57\u6BB5\u4E3A\u7A7A\u65F6\u4FDD\u7559\u5206\u9694\u7B26\u3002\u89C4\u5219\u6B63\u6587\u91CC\u7684\u5B57\u6BB5\u540D\u4E0E\u672C\u683C\u5F0F\u5BF9\u5E94\uFF1Ascenes=scene \u5757\uFF0Cshots=shot \u884C\uFF0Cvoices=dlg/think \u884C\uFF0Cregistry_delta.new_entities=new \u5757\uFF0Cenrich=enrich \u5757\uFF0Ccanonicalize=rename \u884C\uFF0Copen_threads=open/close \u884C\uFF0Cidentity_profile=\u753B\u50CF\u952E\u884C\uFF0Crecognition_anchors=anchor \u884C\u3002
|
|
262
262
|
\u6309\u4EE5\u4E0B\u987A\u5E8F\u8F93\u51FA\uFF1A
|
|
263
263
|
synopsis \u672C\u96C6\u5267\u60C5\u6897\u6982\uFF0C\u6309\u53D1\u751F\u987A\u5E8F\uFF0C200-300 \u5B57\u7EAF\u6587\u672C
|
|
264
264
|
scene \u5185\u6216\u5916\uFF08\u4E0D\u786E\u5B9A\u7559\u7A7A\uFF09|\u65E5\u3001\u591C\u3001\u6668\u3001\u660F\u5FC5\u9009\u5176\u4E00|\u672C\u573A\u8D77\u6B62 MM:SS-MM:SS\uFF08SS \u4E3A 00-59\uFF0C\u6574\u5206\u949F\u5199\u6210\u4E0B\u4E00\u5206\u949F\u7684 :00\uFF0C\u7981\u6B62 :60\uFF09|\u672C\u573A\u552F\u4E00\u7A33\u5B9A\u4E3B\u7A7A\u95F4\u5730\u70B9\u89C4\u8303\u540D
|
|
@@ -308,25 +308,25 @@ hair \u2026\u2026
|
|
|
308
308
|
build \u2026\u2026
|
|
309
309
|
voice
|
|
310
310
|
state \u9ED1\u897F\u88C5|\u2026\u2026\uFF08\u4ECE\u5934\u5230\u811A\u9010\u4EF6\u5199\u6E05\u989C\u8272\u3001\u6750\u8D28\u3001\u7248\u578B\u4E0E\u914D\u9970\uFF09
|
|
311
|
-
open \u6797\u665A\u662F\u5426\u7B7E\u4E0B\u79BB\u5A5A\u534F\u8BAE`;var Z=
|
|
312
|
-
`+
|
|
313
|
-
`:o(124);return(n===o(130)?o(108)+e+o(49):o(108)+e+o(110))+o(128)+i}function zp(e,t){let n=Z;return new S(e,{exitCode:me,errorCode:n(65),hint:n(29),data:{actual:t}})}var Hp=e=>{let t=Z;return typeof e===t(141)?e[t(42)](/\u0000/g,""):Array[t(137)](e)?e[t(146)](Hp):ft(e)?Object[t(15)](Object[t(9)](e)[t(146)](([n,o])=>[n,Hp(o)])):e},ft=e=>typeof e===Z(148)&&e!==null&&!Array[Z(137)](e),ee=e=>typeof e===Z(141)?e[Z(74)]():"",Ze=e=>Array[Z(137)](e)?e:[],Mh=e=>{let t=Z,n=ee(e);return n?n[t(105)](/[((//,,、]/)[0][t(74)]():""},GI=e=>[...new Set(Ze(e)[Z(146)](Mh)[Z(66)](Boolean))],bh=e=>{let t=Z,n=[];for(let o of Ze(e))if(t(14)===t(12)){let i=_0x533a5c(_0x21fe10);return i?i[t(105)](/[((//,,、]/)[0][t(74)]():""}else{if(!ft(o))continue;let i=Mh(o[t(71)]);if(!i)continue;let r=ee(o[t(91)]),s=n[t(100)](c=>c[t(71)]===i);s?!s[t(91)]&&r&&(s[t(91)]=r):n[t(136)]({name:i,description:r})}return n},JI=[Z(86),Z(78),Z(140),Z(79),Z(88),Z(93),Z(11),Z(28),Z(38),Z(47)],Oh=e=>{let t=Z;if(!ft(e))return;let n={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:Ze(e[t(10)])[t(146)](ee)[t(66)](Boolean),voice:""};for(let o of JI)n[o]=ee(e[o]);return n};function Qp(){let e=["ywn0","y2fTzxjH","cGRKUiRMRkhOVPpLH7RMNiKG","C3bHy2u","C29YDa","pt09pt09pt09psdLT7lNN6xORR7LRPRVViJLIldKUiRKUidPM4BKUlRMRAlVViZOP4tOJipLKi3KU6xMRAtKUlRLH4BVViKGpt09pt09pt09pqO","xsaO","AwrLBNrPDhLFChjVzMLSzq","6l+u5zUE5A6m5Pw0iePtt04","zw50CMLLCW","CgvYC2LZDgvUDf9TyxjRCW","C2TPBL9Mzwf0DxjLCW","t1zSEK0","yxbRBfi","qKXKCei","zNjVBuvUDhjPzxm","zxbPC29Kzsa","ioADOEMvNowKToAiLUwJSoMFS+E8UUwWKsb0C++8JoACQUIIQ+AoPEwpL+oaGUE8UUwKSEs9JEE9RU+8MG","ywXPyxnLCW","igfUy2HVCNmGC3rPBgWGAgf2zsbUBYb0Aw1LC3rHBxaGywz0zxiGmYbYzxrYAwvZlG","C3rHDhvZ","BNvJwhq","DMfSDwvZ","DuTAz2G","zNjVBv9Uyw1L","sLnptG","AwrLBNrPDhLFChjVzMLSzv9WyxrJAa","Dg9ju09tDhjPBMC","AgfPCG","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbGC2nYAxb0y3rSigLUz2vZDgaGDg8GCMvZDw1LlG","ywrKx3jLy29NBML0Aw9Ux2fUy2HVCNm","oIbZzxjPywWGB3v0Chv0ihbYB2r1y2vKig5VihnJzw5LCW","B3bLBL90AhjLywrZ","ue9tsvrjvKvFsu5gsu5jvfK","C2HVDhm","C2v0","y2fUB25Py2fSx25HBwu","Aw1WB3j0yw5Jzq","yNvPBgq","ywrKx3n0yxrLCW","BgvUz3rO","oIbZzxjPywWGB3v0Chv0ihDHCYbUB3qGDMfSAwqGsLnptIaOzMLUAxnOuMvHC29Upq","CMvWBgfJzq","C3LUB3bZAxm","kIRLJ6ROVPpLH7ROR6uGsLnptU+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","5l2G6kAb6l6t5yE6kIRKUidKUkRNU5pMNOtLJjyGsLnptIdLR7NOSAeQkU+8Ios4PEAGVoESPUwqIoACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHo+8Iq","D1jQB2e","DM9Py2u","DgLTzq","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHoIHJow8JYbeu0WG6l+u5zUE57QV5PAh5PYS44cc5y+Q6l+u5zUEierttcdMNkZOUQVVViZKUi3OPOhOVPpLH7ROP6pPH4RJGihLIy3OQidJGifku09oioAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","tKzd","yw5JAg9YCW","6l+u5zUE5A6m5Pw0iertta","zMXHDe1HCa","Bg9JyxrPB24","DgLTzvjHBMDL","AM9PBG","Dgv4Da","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbPBMDLC3qGDg8GCMvZDw1LlG","zxzPzgvUy2u","BwLTzq","zMLUAxnOuMvHC29U","DgHPBMS","CMvM","y29UDgvUDa","su5hrvnux1zjrevpx1nfuKLbtf9gquLmruq","zMLSDgvY","y2fUB25Py2fS","oIbZzxjPywWGB3v0Chv0ihrVBYbZAg9YDcaOzMLUAxnOuMvHC29Upq","Aw5JBhvKzxm","DMLZDwfS","BMfTzq","rxbPC29Kzsa","CgfYzw50Agv0AwnHBa","DhjPBq","zgzzAfy","zw5YAwnO","DMfSDwu","yxbWyxjLBNrFywDL","yNjVD3nFzxLLCW","ywn0B3i","y2HHCMfJDgvYCW","AxngAw5PDgu","CMvWBgfJzufSBa","B3bLBMvK","C29Tzq","yxbWyxjLBNrFz2vUzgvY","ywrKx2fSAwfZzxm","BM9Zzq","DgLTzxn0yw1Wx21PC3nPBMC","zgXN","zgvZy3jPChrPB24","yMfJA2DYB3vUza","Bw91DgG","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","CMvNAxn0CNLFzgvSDge","C2nLBMvZ","77Ym5lIn6kAb5y+Q6l+u5zUE5l+U6kgL5A2x5Q6144cc","CM9Szq","BMv3x2vUDgL0AwvZ","zMLUza","ywrK","kIRLJ6ROVPpLH7ROR6uGrfnmioAwH+ACRo+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","rfnm","ChjVChm","C3bSAxq","y2XVC2vK","C3rYAw5NAwz5","6kEJ5P6q56YSia","shD2Aha","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHoI/LowBNUs4Gos4QIbku09oiowVUEIXOEoaGUwpQUI/LowBNIbku09oioACRoI6Q++8Jos4JEIMGEI+K+whUUINO+MhIUoaGEwjJEIOGoAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","DM9Py2vZ","ywjJzM0","ChjVCa","uLHWzuW","z2v0","A2LUza","z2vUzxjHDgu","y2fUB25Py2fSAxPL","Cu9ru3K","CgfYC2u","AgfZ","C3bLywTLCG","uKriD1C","77Yi6l+z5PIV56YS5lIa6zUg77Ym5PQc5PEG5BEY55+L6k6+5A6A44cc77YjcG","su5hrvnux1zjrevpx1rjtuvtvefnuf9nsvntsu5h","yxbWzwfYyw5Jzq","BgvUz3rOoIa","C2nLBMvZioMaKowCUUIMHUEBLUwfQoMBHU+8M+AVJ+wCUUwfIoElRoERI+wUJoAiKoMaKoMvNcbZAg90C++8JowgJEElRoERI+wUJoAiKcb2B2LJzxpJGijZAg90CYdLV4xPOBVOPOBNM5BMR4/MRkhLIiFPLzZLKOZLJ6/NOA7ORQtNMOtMKytLVBeV6kgO5RYu5y+y5yYw77Ym5lIn5y676yEn6yEn5Asn6zwC5As077Ym5lIn5zci5BM25ywi5zco5y+r55sF55Qe5yIg6zwC5OIw5yQO5l2C77YBDM9Py2vZiowUJoAvTos/NEEvMEwoN+wJSow5TUwCQoI3QoMvNoAxTUAmIEIhQUEeTUIVREwpPEAlHUwiHUoaGNjLz2LZDhj5x2rLBhrHiowpQUAkPEwINUMhJ++8Iow3SUEFPEs4LoAxOoAwSos/OEAbR+EAHowUNUs9K+s4JEIMGEwgME+8IEoaGUwUJoAiKowjJEwiHUwiQ+wKJEAGUcbZAg90CYdNMOtLIiFPLzZJGihMMA/LIkSV6kEs5BQMl+I/KoMvNc/MNOtLM74V54sM54k544cb5y+V6kEb6kgO5RYu5zkm56Uz5l2n5ywZ57o777Ym5lUL5y+kihzVAwnLCYdNMOtLHAJPG6JKURRLO7dKUi7OP4BPOPhMNidLKi7LJyhNP5lJGiikcG","C2nLBMvZwW","zhnS","xs5HBMnOB3jZwW","5l2G6kAb6l6t5yE6kIRKUidKU73KUkxMOlZNRkBLKiJMNkZKU7VLIQhOOyZLVi8GrfnmioEAHoE6R+AwH+ACRcOQ","Cgf0Aa","zMvHDhvYzwq","44cc6k+36yEn5PAW6kEc55Yl5B2t5yMn6zUg77Ym5lI65Q+p5lIa5P2HihnOB3rZiowsJcb2B2LJzxmG5AgR5yAz55YF5A6E6lw354k5ihrZ77Yitu06u1pVViNVViZKUi3LVPFNVlRLPlhJGihNLzNNQBRMIjBLOASGBNvSBo+8MW","ChvZAa","AxnbCNjHEq","A2v5CW","CMvJB2DUAxrPB25Fyw5JAg9YCW","zMfJzv9ZAgfWzq","C3rYAw5N","C2XPy2u","tM5Jzui","C3rHDgvZ","ChjVDMLZAw9UywW","BwfW","BM9YBwfSAxPL","B2jQzwn0"];return Qp=function(){return e},Qp()}var vh=e=>{let t=Z;if(!e)return Number[t(33)];let n=e[t(105)](":")[t(146)](Number);return n[t(85)](o=>!Number[t(82)](o))?Number[t(33)]:n[t(40)]===2?n[0]*60+n[1]:n[t(40)]===3?n[0]*3600+n[1]*60+n[2]:Number[t(33)]};function cn(e,t){e=e-0;let n=Qp(),o=n[e];if(cn.zRdzrV===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};cn.ndpyxG=i,cn.dusoTO={},cn.zRdzrV=!0}let r=n[0];cn.SFihtY!==r&&(cn.dusoTO={},cn.SFihtY=r);let s=cn.dusoTO[e];return s===void 0?(o=cn.ndpyxG(o),cn.dusoTO[e]=o):o=s,o}var BI=(e,t)=>{let n=Z;return e?t?e[n(42)](/[。!?;]+$/,"")+"\u3002"+t:e:t};function KI(e){let t=Z,n={synopsis:"",scenes:[],registry_delta:{new_entities:[],enrich:[],canonicalize:[]},open_threads:{opened:[],closed:[]}};if(!ft(e))return n;n[t(43)]=ee(e[t(43)]);for(let r of Ze(e[t(96)]))if(t(123)!==t(109)){if(!ft(r))continue;let s={},c=ee(r[t(3)]);c&&(s[t(3)]=c);let a=xo(r[t(48)]);a&&(s[t(48)]=a);let d=new Map;for(let m of Ze(r[t(81)])){if(!ft(m))continue;let w=ee(m[t(71)]);if(!w||st(w))continue;let g=d[t(115)](w)??{name:w,states:[]};for(let _ of GI(m[t(144)]))t(114)===t(46)?_0x41a71f=_0x1405e2?_0x31c4b4(_0x3cb513)[t(77)]:_0x204621[t(120)](_0xacffa6):g[t(144)][t(69)](_)||g[t(144)][t(136)](_);d[t(35)](w,g)}let p=[],l=new Set;for(let m of Ze(r[t(104)])[t(146)](ee)[t(66)](Boolean)){let w=m[t(147)](t(50))[t(42)](/\s+/g," ")[t(74)]();!w||l[t(121)](w)||(l[t(101)](w),p[t(136)](m[t(74)]()))}let f=[];for(let m of Ze(r[t(34)]))if(t(23)===t(23)){if(!ft(m))continue;let w=BI(ee(m[t(1)]),ee(m[t(70)]));if(!w)continue;let g={kind:t(0),content:w},_=Yi(m.ts);_&&(g.ts=_),f[t(136)](g)}else{let w=_0x375767[t(74)]()?t(5)+_0x3780c6+`
|
|
314
|
-
`:t(124);return(_0xdb483d===t(130)?t(108)+_0x13339e+t(49):t(108)+_0x1308b6+t(110))+t(128)+w}for(let m of Ze(r[t(111)])){if(!
|
|
315
|
-
`;
|
|
311
|
+
open \u6797\u665A\u662F\u5426\u7B7E\u4E0B\u79BB\u5A5A\u534F\u8BAE`;var Z=an,Mh=Z(94),DI=Mh[Z(42)](Z(45),Z(132))[Z(42)](Z(44),Z(102))[Z(83)](Z(25),Z(103))+`
|
|
312
|
+
`+bh;function GI(e,t,n=Z(130)){let o=Z,i=t[o(74)]()?o(5)+t+`
|
|
313
|
+
`:o(124);return(n===o(130)?o(108)+e+o(49):o(108)+e+o(110))+o(128)+i}function Hp(e,t){let n=Z;return new S(e,{exitCode:ge,errorCode:n(65),hint:n(29),data:{actual:t}})}var Qp=e=>{let t=Z;return typeof e===t(141)?e[t(42)](/\u0000/g,""):Array[t(137)](e)?e[t(146)](Qp):lt(e)?Object[t(15)](Object[t(9)](e)[t(146)](([n,o])=>[n,Qp(o)])):e},lt=e=>typeof e===Z(148)&&e!==null&&!Array[Z(137)](e),ee=e=>typeof e===Z(141)?e[Z(74)]():"",Ze=e=>Array[Z(137)](e)?e:[],Lh=e=>{let t=Z,n=ee(e);return n?n[t(105)](/[((//,,、]/)[0][t(74)]():""},JI=e=>[...new Set(Ze(e)[Z(146)](Lh)[Z(66)](Boolean))],Oh=e=>{let t=Z,n=[];for(let o of Ze(e))if(t(14)===t(12)){let i=_0x533a5c(_0x21fe10);return i?i[t(105)](/[((//,,、]/)[0][t(74)]():""}else{if(!lt(o))continue;let i=Lh(o[t(71)]);if(!i)continue;let r=ee(o[t(91)]),s=n[t(100)](c=>c[t(71)]===i);s?!s[t(91)]&&r&&(s[t(91)]=r):n[t(136)]({name:i,description:r})}return n},BI=[Z(86),Z(78),Z(140),Z(79),Z(88),Z(93),Z(11),Z(28),Z(38),Z(47)],vh=e=>{let t=Z;if(!lt(e))return;let n={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:Ze(e[t(10)])[t(146)](ee)[t(66)](Boolean),voice:""};for(let o of BI)n[o]=ee(e[o]);return n};function Fp(){let e=["ywn0","y2fTzxjH","cGRKUiRMRkhOVPpLH7RMNiKG","C3bHy2u","C29YDa","pt09pt09pt09psdLT7lNN6xORR7LRPRVViJLIldKUiRKUidPM4BKUlRMRAlVViZOP4tOJipLKi3KU6xMRAtKUlRLH4BVViKGpt09pt09pt09pqO","xsaO","AwrLBNrPDhLFChjVzMLSzq","6l+u5zUE5A6m5Pw0iePtt04","zw50CMLLCW","CgvYC2LZDgvUDf9TyxjRCW","C2TPBL9Mzwf0DxjLCW","t1zSEK0","yxbRBfi","qKXKCei","zNjVBuvUDhjPzxm","zxbPC29Kzsa","ioADOEMvNowKToAiLUwJSoMFS+E8UUwWKsb0C++8JoACQUIIQ+AoPEwpL+oaGUE8UUwKSEs9JEE9RU+8MG","ywXPyxnLCW","igfUy2HVCNmGC3rPBgWGAgf2zsbUBYb0Aw1LC3rHBxaGywz0zxiGmYbYzxrYAwvZlG","C3rHDhvZ","BNvJwhq","DMfSDwvZ","DuTAz2G","zNjVBv9Uyw1L","sLnptG","AwrLBNrPDhLFChjVzMLSzv9WyxrJAa","Dg9ju09tDhjPBMC","AgfPCG","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbGC2nYAxb0y3rSigLUz2vZDgaGDg8GCMvZDw1LlG","ywrKx3jLy29NBML0Aw9Ux2fUy2HVCNm","oIbZzxjPywWGB3v0Chv0ihbYB2r1y2vKig5VihnJzw5LCW","B3bLBL90AhjLywrZ","ue9tsvrjvKvFsu5gsu5jvfK","C2HVDhm","C2v0","y2fUB25Py2fSx25HBwu","Aw1WB3j0yw5Jzq","yNvPBgq","ywrKx3n0yxrLCW","BgvUz3rO","oIbZzxjPywWGB3v0Chv0ihDHCYbUB3qGDMfSAwqGsLnptIaOzMLUAxnOuMvHC29Upq","CMvWBgfJzq","C3LUB3bZAxm","kIRLJ6ROVPpLH7ROR6uGsLnptU+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","5l2G6kAb6l6t5yE6kIRKUidKUkRNU5pMNOtLJjyGsLnptIdLR7NOSAeQkU+8Ios4PEAGVoESPUwqIoACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHo+8Iq","D1jQB2e","DM9Py2u","DgLTzq","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHoIHJow8JYbeu0WG6l+u5zUE57QV5PAh5PYS44cc5y+Q6l+u5zUEierttcdMNkZOUQVVViZKUi3OPOhOVPpLH7ROP6pPH4RJGihLIy3OQidJGifku09oioAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","tKzd","yw5JAg9YCW","6l+u5zUE5A6m5Pw0iertta","zMXHDe1HCa","Bg9JyxrPB24","DgLTzvjHBMDL","AM9PBG","Dgv4Da","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbPBMDLC3qGDg8GCMvZDw1LlG","zxzPzgvUy2u","BwLTzq","zMLUAxnOuMvHC29U","DgHPBMS","CMvM","y29UDgvUDa","su5hrvnux1zjrevpx1nfuKLbtf9gquLmruq","zMLSDgvY","y2fUB25Py2fS","oIbZzxjPywWGB3v0Chv0ihrVBYbZAg9YDcaOzMLUAxnOuMvHC29Upq","Aw5JBhvKzxm","DMLZDwfS","BMfTzq","rxbPC29Kzsa","CgfYzw50Agv0AwnHBa","DhjPBq","zgzzAfy","zw5YAwnO","DMfSDwu","yxbWyxjLBNrFywDL","yNjVD3nFzxLLCW","ywn0B3i","y2HHCMfJDgvYCW","AxngAw5PDgu","CMvWBgfJzufSBa","B3bLBMvK","C29Tzq","yxbWyxjLBNrFz2vUzgvY","ywrKx2fSAwfZzxm","BM9Zzq","DgLTzxn0yw1Wx21PC3nPBMC","zgXN","zgvZy3jPChrPB24","yMfJA2DYB3vUza","Bw91DgG","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","CMvNAxn0CNLFzgvSDge","C2nLBMvZ","77Ym5lIn6kAb5y+Q6l+u5zUE5l+U6kgL5A2x5Q6144cc","CM9Szq","BMv3x2vUDgL0AwvZ","zMLUza","ywrK","kIRLJ6ROVPpLH7ROR6uGrfnmioAwH+ACRo+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","rfnm","ChjVChm","C3bSAxq","y2XVC2vK","C3rYAw5NAwz5","6kEJ5P6q56YSia","shD2Aha","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHoI/LowBNUs4Gos4QIbku09oiowVUEIXOEoaGUwpQUI/LowBNIbku09oioACRoI6Q++8Jos4JEIMGEI+K+whUUINO+MhIUoaGEwjJEIOGoAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","DM9Py2vZ","ywjJzM0","ChjVCa","uLHWzuW","z2v0","A2LUza","z2vUzxjHDgu","y2fUB25Py2fSAxPL","Cu9ru3K","CgfYC2u","AgfZ","C3bLywTLCG","uKriD1C","77Yi6l+z5PIV56YS5lIa6zUg77Ym5PQc5PEG5BEY55+L6k6+5A6A44cc77YjcG","su5hrvnux1zjrevpx1rjtuvtvefnuf9nsvntsu5h","yxbWzwfYyw5Jzq","BgvUz3rOoIa","C2nLBMvZioMaKowCUUIMHUEBLUwfQoMBHU+8M+AVJ+wCUUwfIoElRoERI+wUJoAiKoMaKoMvNcbZAg90C++8JowgJEElRoERI+wUJoAiKcb2B2LJzxpJGijZAg90CYdLV4xPOBVOPOBNM5BMR4/MRkhLIiFPLzZLKOZLJ6/NOA7ORQtNMOtMKytLVBeV6kgO5RYu5y+y5yYw77Ym5lIn5y676yEn6yEn5Asn6zwC5As077Ym5lIn5zci5BM25ywi5zco5y+r55sF55Qe5yIg6zwC5OIw5yQO5l2C77YBDM9Py2vZiowUJoAvTos/NEEvMEwoN+wJSow5TUwCQoI3QoMvNoAxTUAmIEIhQUEeTUIVREwpPEAlHUwiHUoaGNjLz2LZDhj5x2rLBhrHiowpQUAkPEwINUMhJ++8Iow3SUEFPEs4LoAxOoAwSos/OEAbR+EAHowUNUs9K+s4JEIMGEwgME+8IEoaGUwUJoAiKowjJEwiHUwiQ+wKJEAGUcbZAg90CYdNMOtLIiFPLzZJGihMMA/LIkSV6kEs5BQMl+I/KoMvNc/MNOtLM74V54sM54k544cb5y+V6kEb6kgO5RYu5zkm56Uz5l2n5ywZ57o777Ym5lUL5y+kihzVAwnLCYdNMOtLHAJPG6JKURRLO7dKUi7OP4BPOPhMNidLKi7LJyhNP5lJGiikcG","C2nLBMvZwW","zhnS","xs5HBMnOB3jZwW","5l2G6kAb6l6t5yE6kIRKUidKU73KUkxMOlZNRkBLKiJMNkZKU7VLIQhOOyZLVi8GrfnmioEAHoE6R+AwH+ACRcOQ","Cgf0Aa","zMvHDhvYzwq","44cc6k+36yEn5PAW6kEc55Yl5B2t5yMn6zUg77Ym5lI65Q+p5lIa5P2HihnOB3rZiowsJcb2B2LJzxmG5AgR5yAz55YF5A6E6lw354k5ihrZ77Yitu06u1pVViNVViZKUi3LVPFNVlRLPlhJGihNLzNNQBRMIjBLOASGBNvSBo+8MW","ChvZAa","AxnbCNjHEq","A2v5CW","CMvJB2DUAxrPB25Fyw5JAg9YCW","zMfJzv9ZAgfWzq","C3rYAw5N","C2XPy2u","tM5Jzui","C3rHDgvZ","ChjVDMLZAw9UywW","BwfW","BM9YBwfSAxPL","B2jQzwn0"];return Fp=function(){return e},Fp()}var Rh=e=>{let t=Z;if(!e)return Number[t(33)];let n=e[t(105)](":")[t(146)](Number);return n[t(85)](o=>!Number[t(82)](o))?Number[t(33)]:n[t(40)]===2?n[0]*60+n[1]:n[t(40)]===3?n[0]*3600+n[1]*60+n[2]:Number[t(33)]};function an(e,t){e=e-0;let n=Fp(),o=n[e];if(an.zRdzrV===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~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)};an.ndpyxG=i,an.dusoTO={},an.zRdzrV=!0}let r=n[0];an.SFihtY!==r&&(an.dusoTO={},an.SFihtY=r);let s=an.dusoTO[e];return s===void 0?(o=an.ndpyxG(o),an.dusoTO[e]=o):o=s,o}var KI=(e,t)=>{let n=Z;return e?t?e[n(42)](/[。!?;]+$/,"")+"\u3002"+t:e:t};function jI(e){let t=Z,n={synopsis:"",scenes:[],registry_delta:{new_entities:[],enrich:[],canonicalize:[]},open_threads:{opened:[],closed:[]}};if(!lt(e))return n;n[t(43)]=ee(e[t(43)]);for(let r of Ze(e[t(96)]))if(t(123)!==t(109)){if(!lt(r))continue;let s={},c=ee(r[t(3)]);c&&(s[t(3)]=c);let a=xo(r[t(48)]);a&&(s[t(48)]=a);let d=new Map;for(let m of Ze(r[t(81)])){if(!lt(m))continue;let w=ee(m[t(71)]);if(!w||rt(w))continue;let g=d[t(115)](w)??{name:w,states:[]};for(let _ of JI(m[t(144)]))t(114)===t(46)?_0x41a71f=_0x1405e2?_0x31c4b4(_0x3cb513)[t(77)]:_0x204621[t(120)](_0xacffa6):g[t(144)][t(69)](_)||g[t(144)][t(136)](_);d[t(35)](w,g)}let p=[],l=new Set;for(let m of Ze(r[t(104)])[t(146)](ee)[t(66)](Boolean)){let w=m[t(147)](t(50))[t(42)](/\s+/g," ")[t(74)]();!w||l[t(121)](w)||(l[t(101)](w),p[t(136)](m[t(74)]()))}let f=[];for(let m of Ze(r[t(34)]))if(t(23)===t(23)){if(!lt(m))continue;let w=KI(ee(m[t(1)]),ee(m[t(70)]));if(!w)continue;let g={kind:t(0),content:w},_=Zi(m.ts);_&&(g.ts=_),f[t(136)](g)}else{let w=_0x375767[t(74)]()?t(5)+_0x3780c6+`
|
|
314
|
+
`:t(124);return(_0xdb483d===t(130)?t(108)+_0x13339e+t(49):t(108)+_0x1308b6+t(110))+t(128)+w}for(let m of Ze(r[t(111)])){if(!lt(m))continue;let w=ee(m[t(116)]);if(w!==t(90)&&w!==t(62))continue;let g=ee(m[t(64)]);if(!g)continue;let _={kind:w,content:g},E=ee(m[t(122)]);E&&(_[t(122)]=E);let x=ee(m[t(73)]);x&&(_[t(73)]=x);let A=Zi(m.ts);A&&(_.ts=A),f[t(136)](_)}f[t(4)]((m,w)=>{let g=t,_=Rh(m.ts)-Rh(w.ts);return _!==0?_:m[g(116)]===g(0)&&w[g(116)]!==g(0)?-1:m[g(116)]!==g(0)&&w[g(116)]===g(0)?1:0});let u={environment:s,characters:[...d[t(22)]()],props:p,anchors:f},h=ee(r[t(55)]);h&&(u[t(55)]=h);let y=ee(r[t(54)]);y&&(u[t(54)]=y),n[t(96)][t(136)](u)}else throw _0x4b7eac(t(16)+_0x365db4+t(41)+_0x2c33b4[t(61)]+")",[_0x117ae0[t(142)](0,200)]);let o=lt(e[t(95)])?e[t(95)]:{};for(let r of Ze(o[t(99)])){if(!lt(r))continue;let s=ee(r[t(71)]),c=ee(r[t(116)]);if(!s||c!==t(80)&&c!==t(54)&&c!==t(113)||c===t(80)&&rt(s))continue;let a={name:s,kind:c,status:ee(r[t(20)])===t(145)?t(145):t(67),importance:ee(r[t(37)])===t(92)?t(92):t(134)},d=Ze(r[t(139)])[t(146)](ee)[t(66)](Boolean);d[t(40)]&&(a[t(139)]=d);let p=vh(r[t(7)]);p&&(a[t(7)]=p);let l=ee(r[t(126)]);l&&(a[t(126)]=l);let f=ee(r[t(98)]);f&&(a[t(98)]=f);let u=Oh(r[t(144)]);u[t(40)]&&(a[t(144)]=u);let h=Ze(r[t(18)])[t(146)](ee)[t(66)](Boolean);h[t(40)]&&(a[t(18)]=h),n[t(95)][t(99)][t(136)](a)}for(let r of Ze(o[t(76)]))if(t(21)!==t(143)){if(!lt(r))continue;let s=ee(r[t(71)]);if(!s)continue;let c={name:s},a=Ze(r[t(30)])[t(146)](ee)[t(66)](Boolean);a[t(40)]&&(c[t(30)]=a);let d=vh(r[t(26)]);d&&(c[t(26)]=d);let p=ee(r[t(126)]);p&&(c[t(126)]=p);let l=ee(r[t(98)]);l&&(c[t(98)]=l);let f=Ze(r[t(87)])[t(146)](ee)[t(66)](Boolean);f[t(40)]&&(c[t(87)]=f);let u=Oh(r[t(39)]);u[t(40)]&&(c[t(39)]=u),Object[t(138)](c)[t(40)]>1&&n[t(95)][t(76)][t(136)](c)}else return new _0x203a3a(_0x57f8a9,{exitCode:_0x197df4,errorCode:t(65),hint:t(29),data:{actual:_0x479c9b}});for(let r of Ze(o[t(118)])){if(!lt(r))continue;let s=ee(r[t(24)]),c=ee(r[t(36)]);s&&c&&n[t(95)][t(118)][t(136)]({from_name:s,canonical_name:c,evidence:ee(r[t(59)])})}let i=lt(e[t(32)])?e[t(32)]:{};for(let r of Ze(i[t(84)])){if(!lt(r))continue;let s=ee(r[t(57)]);s&&n[t(32)][t(84)][t(136)]({text:s})}for(let r of Ze(i[t(106)])){if(!lt(r))continue;let s=ee(r[t(63)]);s&&n[t(32)][t(106)][t(136)]({ref:s})}return n}async function Nh(e,t,n,o,i,{format:r=Z(130),signal:s,local:c,onTimestampMissing:a}={}){let d=Z,p=r===d(130),l="";for(let f=0;;f++){let u=await e[d(117)]({media:t,system:p?DI:Mh,user:GI(n,o+l,r),fps:i,...p?{acceptsText:kh}:{responseJsonSchema:ig},...c?{localPath:c[d(133)],localMime:c[d(60)]}:{},...s?{signal:s}:{}}),h=u[d(57)][d(74)]();if(h[d(40)]<40)throw Hp(d(16)+n+d(68)+u[d(61)]+")",[d(127)+h[d(40)]]);let y;try{y=p?zp(h)[d(77)]:JSON[d(120)](h)}catch{if(d(75)===d(112)){if(!_0x3164a3(_0x191401))return;let E={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:_0x22f48e(_0x2e8bfc[d(10)])[d(146)](_0x98066e)[d(66)](_0x65f094),voice:""};for(let x of _0x1c6ede)E[x]=_0x1bd03c(_0xa9a0f9[x]);return E}else throw Hp(d(16)+n+d(41)+u[d(61)]+")",[h[d(142)](0,200)])}let m=Qp(y),w=jI(m);if(w[d(96)][d(40)]===0)throw Hp(d(16)+n+d(31),[h[d(142)](0,200)]);let g=w[d(96)][d(53)]((E,x)=>E[d(51)][d(53)]((A,k)=>A.ts?[]:[d(129)+x+d(131)+k+d(6)+A[d(116)]+")"]));if(g[d(40)]>0){if(a?.({event:d(89),at:new Date()[d(27)](),episode:n,attempt:f+1,missing_count:g[d(40)],missing_paths:g,retries_exhausted:f===3}),f===3)if(d(119)===d(13))_0xe7d3f1[d(136)]({name:_0xc0ebbe,description:_0x13fa8a});else throw new S(d(72)+n+": "+g[d(40)]+d(19),{exitCode:ge,errorCode:d(125),hint:d(58),data:{actual:g}});l=d(2)+g[d(40)]+d(17)+g[d(56)]("\u3001")+d(135)+d(p?52:8)+d(97);continue}return{transcript:p?h[d(42)](/\u0000/g,""):JSON[d(107)](m,null,2),output:w}}}function Ua(e){return new S("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 zI(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=Qr(t.failure);if(!n)return null;let o=[];for(let i of t.attempts){let r=Qr(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 Yp(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 Ua("root must be an object");let n=t;if(n.schema_version!==1||!Array.isArray(n.episodes))throw Ua("schema_version must be 1 and episodes must be an array");let o=[],i=new Set;for(let r of n.episodes){let s=zI(r);if(!s)throw Ua("one or more episode records are malformed");if(i.has(s.episode))throw Ua(`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 Uh(e,t){e.writeJson("skipped.json",t)}function Ca(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 S("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 HI(e){return{episode:e,synopsis:"",scenes:[],actors:[],locations:[],props:[],speakers:[],actorStates:[],locationStates:[],propStates:[]}}function Pa(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(HI(s.episode))}return r}function qr(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;Tg(t,i),e.writeJson("context.json",t),e.clearError(`ep/ep_${String(i).padStart(3,"0")}.error.json`)}return t}function Ch(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 Zr="19",QI=new Set([Zr]),di=e=>String(e).padStart(3,"0"),qp=2;function Th(e){try{return cn.statSync(e).size}catch{return 0}}function FI(e,t){let n=Th(e);if(!(n<hd))throw new S(`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 ${hd} bytes after ingest transcoding`],actual:[`${n} bytes`]}})}function Ph(e,t){try{let n=t.uploadBytes?(t.uploadBytes/1024/1024).toFixed(1):"?",o=JSON.stringify({...t,uploadMB:n,at:new Date().toISOString()})+`
|
|
315
|
+
`;cn.appendFileSync(e.path("timing.jsonl"),o)}catch{}}function Vh(e){return new S("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 Zp(e){if(!e.has("manifest.json"))return null;let t=e.readJson("manifest.json");if(!t.pipeline_version||!QI.has(t.pipeline_version))throw new S("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 ${Zr}`]}});return e.readJson("manifest.json")}function Wp(e,t){if(t.pipeline_version===Zr)return t;let n={...t,pipeline_version:Zr,updated:new Date().toISOString()};return e.writeJson("manifest.json",n),n}function YI(e,t,n){if(e&&e.source.kind!==t)throw Vh(`source kind changed from ${e.source.kind} to ${t}`)}function qI(e,t,n,o){if(t){let i=Zg(t.episodes,n);if(i.kind==="incompatible")throw Vh(i.reason)}if(o){cn.rmSync(e.path("ep"),{recursive:!0,force:!0}),cn.rmSync(e.path("cache"),{recursive:!0,force:!0}),cn.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"])cn.rmSync(e.path(i),{force:!0})}}function ZI(e,t){return e.map(n=>{let o=structuredClone(n);for(let i of o.actors)i.name=Wi(i.name,t)??i.name;for(let i of o.scenes){for(let c of i.characters)c.name=Wi(c.name,t)??c.name;i.location&&(i.location=Wi(i.location,t)??i.location);let r=[],s=new Set;for(let c of i.props){let a=(Wi(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=Wi(c.speaker,t)}return o})}function WI(e,t){let n=t.slice(0,8).map(o=>`- ${o.path}: ${o.message}`).join(`
|
|
316
316
|
`);return`${e}
|
|
317
317
|
|
|
318
318
|
========== \u4E0A\u4E00\u6B21\u8F93\u51FA\u7684\u6574\u5408\u6821\u9A8C\u53CD\u9988 ==========
|
|
319
319
|
\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
|
|
320
320
|
${n}
|
|
321
|
-
\u8BF7\u91CD\u65B0\u89C2\u770B\u672C\u96C6\u5E76\u8FD4\u56DE\u5B8C\u6574\u8F93\u51FA\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`}function
|
|
322
|
-
`)})}catch(
|
|
321
|
+
\u8BF7\u91CD\u65B0\u89C2\u770B\u672C\u96C6\u5E76\u8FD4\u56DE\u5B8C\u6574\u8F93\u51FA\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`}function $h(e,t,n,o,i=[]){let r=bo(t.registry),s=ZI(e,r),c=Xg(s,n),a=xa(c,t,"video",o);if(!a.scriptV4)return a;let{scriptV4:d,initial:p,idMap:l,identityMap:f}=a;Ch(d,i);let u=Me(d),h=[...d.actors.map((m,w)=>({asset:m,path:`$.actors[${w}]`})),...d.locations.map((m,w)=>({asset:m,path:`$.locations[${w}]`})),...d.props.map((m,w)=>({asset:m,path:`$.props[${w}]`}))].flatMap(({asset:m,path:w})=>[...m.description.trim()?[]:[{code:"video_asset_description_missing",path:`${w}.description`,message:"video asset needs a source-grounded description"}],...m.states.flatMap((g,_)=>g.description.trim()?[]:[{code:"video_state_description_missing",path:`${w}.states[${_}].description`,message:"video asset state needs a source-grounded visual description"}])]),y={...u,warnings:[...u.warnings,...ji(d),...h,...i.map(m=>({code:"episode_skipped",path:`$.episodes[${m.episode-1}]`,message:`Episode ${m.episode} was manually skipped: ${m.reason}`}))]};return{initial:p,final:d,idMap:l,validation:y,identityMap:f}}function Ta(e,t,n,o,i,r){let s=$h(Pa(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 S("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 XI(e,t,n,o,i,r,s){return Na(e,va(t,n,o,i,r),s)}async function eA(e){let t=En(e.sourcePath);if(t.kind!=="video-file"&&t.kind!=="video-directory")throw new S("runVideoIngest requires a video source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=[...Ma(t)].sort((m,w)=>m.episode-w.episode),o=Oa(n);if(o)throw new S("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 dt(e.workspacePath);d.ensure();let p=Zp(d),l=er.resolve(t.path);YI(p,t.kind,l);let f=xh(n,p?.episodes??[],p?.updated);qI(d,p,f,r);let u={version:2,pipeline_version:Zr,updated:new Date().toISOString(),source:{kind:t.kind,path:l,sha256:La(f)},episodes:f,fps:i,skips:r?[]:p?.skips??[]};d.writeJson("manifest.json",u);let h=new Ao(d,e.executor),y="failed";try{let m=null,w=Va(e.sourcePath),g=!r&&d.has("context.json")?d.readJson("context.json"):ko(),_={schema_version:1,episodes:u.skips??[]};Ca(_.episodes,f),r||qr(d,g,_.episodes);let E=new Set(_.episodes.map(K=>K.episode)),x=!r&&d.has("v4_identity_map.json")?d.readJson("v4_identity_map.json"):Io(),A=new Set(n.filter(K=>!r&&!E.has(K.episode)&&K.episode<=g.lastEpisode&&d.has(`ep/ep_${di(K.episode)}.json`)).map(K=>K.episode));h.recordReusedEpisodes("ingest.video-serial",[...A]);let k=A.size,U=0;for(let K of n){let St=`ep/ep_${di(K.episode)}.json`;if(!r&&E.has(K.episode)&&K.episode<=g.lastEpisode||A.has(K.episode))continue;if(s&&U>=1)break;let N=_a(g);d.writeText(`ep/ep_${di(K.episode)}.context.md`,N);let re,_e,It,vn,gi=Date.now(),At={episode:K.episode,uploadMode:c,status:"succeeded",totalMs:0},ds="transcode";try{let dn=Date.now(),ut=await Sh(K.path,d.path(`cache/ep_${di(K.episode)}.mp4`),K.mime,a);At.transcodeMs=Date.now()-dn,At.uploadBytes=Th(ut.path),At.transcoded=ut.transcoded,ut.note&&(At.note=ut.note),c==="base64"&&FI(ut.path,K.episode),ds="upload",m??=e.executor.videoPort("ingest.video-serial");let Za=Date.now(),Wn=await m.prepare(ut.path,ut.mime,c,a);At.uploadMs=Date.now()-Za;try{ds="generate";let Wa=Date.now(),Ky=Pa(d,n,g.lastEpisode,_.episodes),Xa=N;for(let ps=1;ps<=qp;ps++){let ls;try{ls=await Nh(m,Wn,K.episode,Xa,i,{format:e.outputFormat??"dsl",...a?{signal:a}:{},local:{path:ut.path,mime:ut.mime},onTimestampMissing:Kt=>cn.appendFileSync(d.path("ingest-validation.jsonl"),JSON.stringify(Kt)+`
|
|
322
|
+
`)})}catch(Kt){if(!(Kt instanceof S)||Kt.errorCode!=="INGEST_VIDEO_SERIAL_FAILED"||ps===qp)throw Kt;Xa=`${N}
|
|
323
323
|
|
|
324
|
-
\u4E0A\u4E00\u6B21\u8F93\u51FA\u672A\u88AB\u63A5\u53D7\uFF0C\u4E5F\u672A\u63A8\u8FDB checkpoint\uFF1A${
|
|
324
|
+
\u4E0A\u4E00\u6B21\u8F93\u51FA\u672A\u88AB\u63A5\u53D7\uFF0C\u4E5F\u672A\u63A8\u8FDB checkpoint\uFF1A${Kt.message}\u3002\u8BF7\u91CD\u65B0\u89C2\u770B\u5F53\u524D\u96C6\uFF0C\u53EA\u6309\u89C6\u9891\u4E8B\u5B9E\u8FD4\u56DE\u7B26\u5408\u672C\u4EFB\u52A1\u8F93\u51FA\u683C\u5F0F\u7684\u5B8C\u6574\u7ED3\u679C\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 Ll=gh(ls.output,K.episode),ec=structuredClone(g);wa(ec,ls.output,K.episode);let us=$h([...Ky,Ll],ec,w,x,_.episodes.filter(Kt=>Kt.episode<=K.episode));if(us.validation.ok){re=ls.transcript,_e=Ll,It=ec,vn=us;break}if(ds="validation",ps===qp)throw new S("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:us.validation.errors.slice(0,8).map(Kt=>`${Kt.path}: ${Kt.message}`)}});Xa=WI(N,us.validation.errors)}At.generateMs=Date.now()-Wa}finally{await m.release(Wn,a).catch(()=>{}),ut.transcoded&&cn.rmSync(ut.path,{force:!0})}}catch(dn){let ut=Date.now();At.status="failed",At.totalMs=ut-gi,Ph(d,At),h.flush({scope:{kind:"episode",episode:K.episode},status:"failed",startedAtMs:gi,endedAtMs:ut,stages:At});let Za=dn instanceof S&&dn.errorCode==="INGEST_VIDEO_SERIAL_FAILED"?"parse":ds,Wn=ka(dn,K.episode,Za),Wa=pn(Wn.failure);throw d.writeJson(`ep/ep_${di(K.episode)}.error.json`,Wn),d.writeJson("manifest.json",{...u,updated:Wn.occurred_at,current_error:Wn}),dn instanceof S&&(dn.errorCode==="INGEST_VIDEO_INLINE_TOO_LARGE"||dn.errorCode==="INGEST_VALIDATION_FAILED"||dn.errorCode==="INGEST_VIDEO_TIMESTAMP_MISSING")?dn:new S(`Episode ${K.episode} failed serial parse; later episodes depend on its context.`,{exitCode:b,errorCode:"INGEST_SERIAL_INCOMPLETE",hint:Qg(Wn.failure),data:{actual:[Wa]}})}g=It,U+=1,d.writeText(`ep/ep_${di(K.episode)}.${(e.outputFormat??"dsl")==="dsl"?"ep":"md"}`,re),d.writeJson(St,_e),d.writeJson("context.json",g),d.clearError(`ep/ep_${di(K.episode)}.error.json`);let Ml=Date.now();At.totalMs=Ml-gi,Ph(d,At),h.flush({scope:{kind:"episode",episode:K.episode},status:"succeeded",startedAtMs:gi,endedAtMs:Ml,stages:At}),x=vn.identityMap,d.writeJson("v4_identity_map.json",x),d.writeJson("script.json",vn.final)}let O=Math.min(g.lastEpisode,n.length),I=n.length-O,M=I===0,T=M?null:n[O]?.episode??null,P=Ta(d,n.slice(0,O),g,w,x,_.episodes),{final:R,validation:j}=P,W=M?await XI(d,Pa(d,n,g.lastEpisode,_.episodes),R,g,f,u.source.sha256,a):{items:[]},Pe=W.items.flatMap(K=>K.samples),ue=R;return y="succeeded",{workspacePath:d.root,episodes:n.length,processed:U,reused:k,skipped:_.episodes.length,skippedEpisodes:_.episodes.map(K=>K.episode),completed:O,remaining:I,complete:M,nextEpisode:T,uploadMode:c,assets:{actors:ue.actors?.length??0,locations:ue.locations?.length??0,props:ue.props?.length??0},evidence:{states:W.items.length,samples:Pe.length,ready:Pe.filter(K=>K.frame_status==="ready").length},scriptPath:d.path("script.json"),validation:{ok:j.ok,errors:j.errors.length,warnings:j.warnings.length}}}finally{h.finish(y)}}async function Dh(e){return Oo(e.workspacePath,()=>eA(e))}function Va(e){return er.basename(e,er.extname(e))||""}var tr=e=>e==null?"":String(e),Gh=(e,t)=>{let n=Number(e);return Number.isInteger(n)&&n>0?n:t},tA=["fps","video_provider","upload_mode","provider_base_url","provider_api_key","provider_api_key_env","provider_model","video_output","step"];function Yn(e,t){return new S(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 $a(e,t){return Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==void 0}function pi(e,t,n){if(!$a(e,t))return;let o=tr(e[t]).trim();if(!o)throw Yn(`${n} requires a non-empty value.`,[n]);return o}function nA(e){let t=pi(e,"upload_mode","--upload-mode");if(t!==void 0){if(t!=="file-api"&&t!=="base64")throw Yn("Video upload mode must be file-api or base64.",[`--upload-mode ${t}`]);return t}}function oA(e){let t=pi(e,"video_output","--video-output");if(t!==void 0&&t!=="dsl"&&t!=="json")throw Yn("Video output format must be dsl or json.",[`--video-output ${t}`]);return t}function iA(e){let t=pi(e,"video_provider","--video-provider");if(t!==void 0&&t!=="gemini"&&t!=="doubao")throw Yn("Video provider must be gemini or doubao.",["--video-provider gemini|doubao"]);let n=$a(e,"provider_api_key"),o=$a(e,"provider_api_key_env");if(n&&o)throw Yn("Provider API key options are mutually exclusive.",["--provider-api-key","--provider-api-key-env"]);let i=pi(e,"provider_base_url","--provider-base-url"),r=pi(e,"provider_api_key","--provider-api-key"),s=pi(e,"provider_api_key_env","--provider-api-key-env"),c=pi(e,"provider_model","--provider-model");if(s!==void 0&&!/^[A-Za-z_][A-Za-z0-9_]*$/.test(s))throw Yn("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 Bh(e,t=zn){let n=tr(e.source_path).trim();if(!n)throw new S("ingest needs a source file or directory.",{exitCode:b,errorCode:"INGEST_NO_SOURCE",hint:"Pass a txt/md/docx file, a video source or a PDF comic source: scriptctl ingest --source-path <path>.",data:{expected:["--source-path <file|dir>"]}});let o=Jh.resolve(tr(e.workspace_path||"workspace")),i=En(n),r=tA.filter(d=>{let p=e[d];return typeof p=="boolean"?p:$a(e,d)});if(i.kind==="text"&&r.length>0)throw Yn("Video ingest options cannot be used with a text source.",r.map(d=>`--${d.replace(/_/g,"-")}`));if(i.kind==="comic-file"||i.kind==="comic-directory"){let d=r.filter(f=>f!=="step");if(d.length)throw Yn("Video provider options cannot be used with PDF comics; select the comic model with --llm-config.",d);let p=t.createExecutor(tr(e.llm_config).trim()||void 0),l=await qg({sourcePath:n,workspacePath:o,executor:p,force:!!e.force,step:!!e.step});return[{text:`workspace: ${l.workspace}
|
|
325
325
|
${l.completed}/${l.episodes} chapters complete (${l.processed} processed / ${l.reused} reused) \u2192 ${l.script_path}
|
|
326
|
-
assets: ${l.assets.actors} actors / ${l.assets.locations} locations / ${l.assets.props} props`,data:l},J]}if(i.kind!=="text"){let d=
|
|
327
|
-
`),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:g.protocol,provider:g.provider,base_url:g.baseUrl,model:g.model},assets:m.assets}},J]}let s=t.createExecutor(
|
|
328
|
-
`),data:{workspace:c.workspacePath,script_path:c.scriptPath,records:c.records,chunks:c.chunks,assets:c.assets}},J]}import*as
|
|
329
|
-
`),data:{status:n}},J]}import*as
|
|
326
|
+
assets: ${l.assets.actors} actors / ${l.assets.locations} locations / ${l.assets.props} props`,data:l},J]}if(i.kind!=="text"){let d=nA(e),p=oA(e),l=iA(e),f=l?{videoProvider:l}:void 0,u=t.createExecutor(tr(e.llm_config).trim()||void 0,f),h=u.route("ingest.video-serial"),y=d??h.videoUploadMode??"file-api";if(l?.provider==="doubao"&&y!=="file-api")throw Yn("Doubao requires --upload-mode file-api.",["--upload-mode file-api"]);let m=await Dh({sourcePath:n,workspacePath:o,executor:u,fps:Gh(e.fps,3),force:!!e.force,step:!!e.step,uploadMode:y,...p?{outputFormat:p}:{}}),w=[`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`],g=[...u.usageEvents()].reverse().find(_=>_.task==="ingest.video-serial"&&_.status==="succeeded")??h;return[{text:w.join(`
|
|
327
|
+
`),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:g.protocol,provider:g.provider,base_url:g.baseUrl,model:g.model},assets:m.assets}},J]}let s=t.createExecutor(tr(e.llm_config).trim()||void 0),c=await Ng({sourcePath:n,workspacePath:o,executor:s,concurrency:Gh(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(`
|
|
328
|
+
`),data:{workspace:c.workspacePath,script_path:c.scriptPath,records:c.records,chunks:c.chunks,assets:c.assets}},J]}import*as Ut from"node:fs";import*as Ct from"node:path";var rA=e=>e==null?"":String(e);function Kh(e){try{let t=JSON.parse(Ut.readFileSync(Ct.join(e,"timings.json"),"utf-8"));return Og(t,Date.now())}catch{return null}}function Da(e,t,n){let o=Ct.join(e,t),i;try{i=Ut.readdirSync(o)}catch{return[]}return i.filter(r=>r.endsWith(n)).sort()}var sA=(e,t,n)=>Da(e,t,n).length,nl=(e,t)=>Ut.existsSync(Ct.join(e,t));function aA(e){try{return JSON.parse(Ut.readFileSync(Ct.join(e,"manifest.json"),"utf-8"))}catch{return null}}function cA(e){try{let t=JSON.parse(Ut.readFileSync(Ct.join(e,"validation.json"),"utf-8"));return{ok:!!t.ok,errors:t.errors?.length??0,warnings:t.warnings?.length??0}}catch{return null}}function Xp(e,t,n){return{pass:e,unit:t,phase:e,attempts:[],...vt({failure_type:"unknown",failure_code:"legacy_unclassified"},{retryable:e==="pass2",message:n})}}function dA(e,t,n){try{let o=JSON.parse(Ut.readFileSync(Ct.join(e,t,`${n}.error.json`),"utf-8")),i=Fr(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"?Xp(t,n,o.error):Xp(t,n,"Error sidecar has an unsupported schema.")}catch{return Xp(t,n,"Error sidecar is unreadable.")}}function pA(e,t,n=new Set){return Da(e,t,".error.json").map(o=>o.replace(/\.error\.json$/,"")).filter(o=>!n.has(o)).map(o=>dA(e,t,o))}function lA(e,t,n){let o=Fr(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 el(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 uA(e){try{let t=JSON.parse(Ut.readFileSync(Ct.join(e,"body.json"),"utf-8"));return Array.isArray(t.episodes)?t.episodes.length:0}catch{return 0}}function fA(e){try{let t=JSON.parse(Ut.readFileSync(Ct.join(e,"script.json"),"utf-8"));return t.version===4&&Array.isArray(t.episodes)?t.episodes.length:null}catch{return null}}function mA(e,t,n){try{let o;return n==="comic"?o=JSON.parse(Ut.readFileSync(Ct.join(e,"checkpoint.json"),"utf-8")).context:o=JSON.parse(Ut.readFileSync(Ct.join(e,"context.json"),"utf-8")),typeof o.lastEpisode=="number"&&Number.isInteger(o.lastEpisode)?Math.min(Math.max(o.lastEpisode,0),t):0}catch{return 0}}function gA(e,t){let n=t.chunks??0,o={total:n,done:Da(e,"pass2",".json").filter(a=>/^chunk_\d+\.json$/.test(a)).length,failed:sA(e,"pass2",".error.json")},i=uA(e),r=Da(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:nl(e,"body.json")},{name:"serial",done:i>0&&r>=i,unit:s},{name:"govern",done:nl(e,"script.json")}],units:o}}function hA(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&&fA(e)===o}],units:c,parsed:s}}function Wr(e){let t=Ct.resolve(e),n=aA(t);if(!n)return{workspace:t,exists:!1,kind:null,state:"empty",phase:"none",passes:[],units:null,script:!1,validation:null,failure_summary:el([]),errors:[],updated:null,timings:null};let o=n.source?.kind==="text"?"text":n.source?.kind?.startsWith("comic-")?"comic":"video",i=n.episodes?.length??0,r=o!=="text"?mA(t,i,o):0,s=o!=="text"&&r<i,c=o==="video"?n.skips??[]:[],a=new Set(c.map(x=>`ep_${String(x.episode).padStart(3,"0")}`)),d=o!=="text"&&r<i?lA(n,r,a):[],p=o!=="text"?hA(t,n,c,r,d.length):null,{passes:l,units:f}=o==="text"?gA(t,n):p,u=o==="text"?pA(t,"pass2"):d;if(s){let x=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:el(u),errors:u,updated:n.updated??null,timings:Kh(t),completed:r,remaining:i-r,complete:!1,next_episode:r+1,parsed:p?.parsed??r,skipped:x.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 h=nl(t,"script.json"),y=cA(t);y&&!y.ok&&u.push({pass:"finalize",unit:"script",phase:"validation",attempts:[],...vt({failure_type:"validation",failure_code:"script_validation_failed"},{retryable:!1,message:`Script validation failed with ${y.errors} error(s).`})});let m,w=l.length>0&&l.every(x=>x.done);(o==="text"||w)&&h&&y?.ok?m="ready":u.length>0||y&&!y.ok?m="failed":m="incomplete";let g=l.find(x=>!x.done),_=m==="ready"?"done":g?g.name:"done",E=o!=="text"?{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(x=>x.episode<=f.done).length,skipped_episodes:c.map(x=>x.episode),has_skips:c.length>0,skips:c.map(x=>({episode:x.episode,skipped_at:x.skipped_at,reason:x.reason,failure_type:x.failure.failure_type,failure_code:x.failure.failure_code}))}:{};return{workspace:t,exists:!0,kind:o,state:m,phase:_,passes:l,units:f,script:h,validation:y,failure_summary:el(u),errors:u,updated:n.updated??null,timings:Kh(t),...E}}function yA(e){let t=`${e.done}/${e.total}`;return e.failed>0?`${t} (${e.failed} failed)`:t}function wA(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?yA(i.unit):i.done?"\u2713":"-"}`).join(" "),o=[t,n];if(e.timings&&o.push(_A(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 tl(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 _A(e){let t=[`elapsed ${tl(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(`~${tl(n.avgWindowMs)}/window`),n.etaMs!=null&&!e.done&&t.push(`eta ~${tl(n.etaMs)}`)),t.join(" \xB7 ")}function jh(e){let t=rA(e.workspace_path||"workspace"),n=Wr(t);return[{text:wA(n).join(`
|
|
329
|
+
`),data:{status:n}},J]}import*as Ga from"node:path";function kn(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function xA(e){let t=Number(e);if(!Number.isInteger(t)||t<=0)throw kn("--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 EA(e,t,n){let o=new dt(e);if(!o.has("manifest.json"))throw kn("The ingest workspace does not exist.","INGEST_SKIP_WORKSPACE_MISSING","Run video ingest first, then retry the failed episode or skip it.",[e]);let i=o.readJson("manifest.json");if(i.source?.kind!=="video-file"&&i.source?.kind!=="video-directory")throw kn("Only video ingest episodes can be skipped.","INGEST_SKIP_WRONG_PIPELINE","Use skip only with a video ingest workspace.",[e]);let r=Zp(o);if(!r)throw kn("The video ingest manifest is missing.","INGEST_SKIP_WORKSPACE_MISSING","Run video ingest first.",[e]);let s=r.episodes.find(w=>w.episode===t);if(!s)throw kn("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=Yp(o);Ca(c.episodes,r.episodes);let a=o.has("context.json")?o.readJson("context.json"):ko();if(c.episodes.find(w=>w.episode===t)){let w=Wp(o,r);a=qr(o,a,c.episodes);let g=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):Io();return Ta(o,w.episodes,a,Va(w.source.path),g,c.episodes),!1}let p=a.lastEpisode+1;if(t!==p)throw kn("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 kn("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 kn("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=Fr(o.readJson(`${l}.error.json`));if(!f||f.unit.episode!==t)throw kn("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},h=Wp(o,r),y=[...c.episodes,u];o.writeJson("manifest.json",{...h,updated:u.skipped_at,current_error:void 0,skips:y}),Uh(o,{schema_version:1,episodes:y}),a=qr(o,a,y);let m=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):Io();return Ta(o,h.episodes,a,Va(h.source.path),m,[...c.episodes,u]),!0}async function zh(e){let t=Ga.resolve(typeof e.workspace_path=="string"?e.workspace_path:"workspace"),n=xA(e.episode),o=typeof e.reason=="string"?e.reason.trim():"";if(!o)throw kn("--reason is required.","INGEST_SKIP_REASON_REQUIRED","Record why this episode cannot be parsed.",["--reason <text>"]);let i=await Oo(t,()=>EA(t,n,o)),r=Wr(t),s=Yp(new dt(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:Ga.join(t,"script.json")}},J]}import*as Ba from"node:fs";import*as li from"node:path";import{spawnSync as SA}from"node:child_process";function Ja(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function IA(e){let t=Ma(En(e)),n=Oa(t);if(n)throw Ja("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=li.resolve(o.path),r=Ba.statSync(i),s=r.size,c=Math.trunc(r.mtimeMs),a=SA("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:ye(JSON.stringify({absolutePath:i,sizeBytes:s,mtimeMs:c})),size_bytes:s,mtime_ms:c,duration_ms:p}})}async function AA(e){let t=li.resolve(e.scriptPath),n=li.resolve(e.sourcePath),o=li.resolve(e.workspacePath),i=Ii(JSON.parse(Ba.readFileSync(t,"utf-8"))),r=IA(n);if(r.length!==i.episodes.length)throw Ja("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=La(r),c=va([],i,ko(),r,s),a=await Oo(o,async()=>{let p=new dt(o);return p.ensure(),Na(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:li.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 Hh(e){let t=ke(e),n=typeof e.source_path=="string"?e.source_path.trim():"",o=typeof e.workspace_path=="string"?e.workspace_path.trim():"";if(!n)throw Ja("--source-path is required.","EVIDENCE_SOURCE_REQUIRED","Pass the linked source-video file or folder.",["--source-path <path>"]);if(!o)throw Ja("--workspace-path is required.","EVIDENCE_WORKSPACE_REQUIRED","Pass the project workspace directory.",["--workspace-path <path>"]);let i=await AA({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}},J]}import*as Lo from"node:fs";import*as Ka from"node:path";var Et=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),qn=e=>Array.isArray(e),Ke=e=>typeof e=="string"?e:"",kA={interior:"\u5185",exterior:"\u5916"},bA={day:"\u65E5",night:"\u591C"},OA=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0},vA=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0};function ol(e,t,n){let o=new Map;if(qn(e))for(let i of e)Et(i)&&typeof i[t]=="string"&&o.set(i[t],Ke(i[n]));return o}function RA(e,t){let n=new Map;if(qn(e))for(let o of e){if(!Et(o)||typeof o[t]!="string")continue;let i=new Map;for(let r of qn(o.states)?o.states:[])Et(r)&&typeof r.state_id=="string"&&i.set(r.state_id,Ke(r.state_name));n.set(o[t],i)}return n}function MA(e,t){return Et(e)?typeof e.actor_id=="string"?t.get(e.actor_id)??e.actor_id:typeof e.kind=="string"?`${e.kind}${e.label?`:${Ke(e.label)}`:""}`:"":""}function LA(e){let t=ol(e.actors,"actor_id","actor_name"),n=ol(e.locations,"location_id","location_name"),o=ol(e.props,"prop_id","prop_name"),i=RA(e.actors,"actor_id"),r=(qn(e.episodes)?e.episodes:[]).filter(Et).map(c=>({episode:OA(Ke(c.episode_id)),synopsis:Ke(c.synopsis),scenes:(qn(c.scenes)?c.scenes:[]).filter(Et).map(a=>{let d=Et(a.location)?n.get(Ke(a.location.location_id))??Ke(a.location.location_id):"",p=[],l={};for(let h of qn(a.actors)?a.actors:[]){if(!Et(h)||typeof h.actor_id!="string")continue;let y=t.get(h.actor_id)??h.actor_id;if(p.includes(y)||p.push(y),typeof h.state_id=="string"){let w=(i.get(h.actor_id)?.get(h.state_id)??"")||(h.state_id!=="default"?h.state_id:"");w&&(l[y]=w)}}let f=[];for(let h of qn(a.props)?a.props:[])if(Et(h)&&typeof h.prop_id=="string"){let y=o.get(h.prop_id)??h.prop_id;f.includes(y)||f.push(y)}let u=Et(a.environment)?a.environment:{};return{scene_num:vA(Ke(a.scene_id)),location_name:d,environment:{space:kA[Ke(u.space)]??Ke(u.space),time:bA[Ke(u.time)]??Ke(u.time)},actor_names:p,actor_states:l,prop_names:f,actions:(qn(a.actions)?a.actions:[]).filter(Et).map(h=>({type:Ke(h.type),content:Ke(h.content),speaker:MA(h.speaker,t),emotion:typeof h.emotion=="string"?h.emotion:void 0,extend:Et(h.extend)&&typeof h.extend.timestamp=="string"?{timestamp:h.extend.timestamp}:void 0}))}})})),s=(qn(e.actors)?e.actors:[]).filter(Et).map(c=>({asset_name:Ke(c.actor_name),description:Ke(c.description),extend:{}}));return{title:Ke(e.title),actors:s,episodes:r}}function Qh(e){if(!Et(e))throw new Error("review renderer expects a script object");let t=LA(e),n=JSON.stringify(t),o=Ke(t.title);return`<!DOCTYPE html>
|
|
330
330
|
<html lang="zh">
|
|
331
331
|
<head>
|
|
332
332
|
<meta charset="utf-8">
|
|
@@ -647,10 +647,10 @@ tabScript.addEventListener('click',()=>switchTab('script'));
|
|
|
647
647
|
tabAssets.addEventListener('click',()=>switchTab('assets'));
|
|
648
648
|
</script>
|
|
649
649
|
</body>
|
|
650
|
-
</html>`}import*as
|
|
650
|
+
</html>`}import*as Fh from"node:http";import*as Mo from"node:fs";import*as bn from"node:path";import{spawn as NA}from"node:child_process";var UA=e=>e==null?"":String(e);function CA(e){let t=r=>{try{let s=Mo.statSync(bn.join(e,r));return{rel:r,size:s.size,mtime:s.mtimeMs}}catch{return null}},n=(r,s)=>{let c=[];try{c=Mo.readdirSync(bn.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(".ep"),...i(".md").filter(r=>!r.rel.endsWith(".context.md"))].sort((r,s)=>r.rel.localeCompare(s.rel)),\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 PA(e){let t="";try{t=Mo.readFileSync(bn.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 TA(e){try{return JSON.parse(Mo.readFileSync(bn.join(e,"usage.json"),"utf-8"))}catch{return null}}function VA(e,t){let n=bn.resolve(e,t);if(n!==e&&!n.startsWith(e+bn.sep))return{ok:!1};try{return{ok:!0,text:Mo.readFileSync(n,"utf-8")}}catch{return{ok:!1}}}function Xr(e,t,n,o){e.writeHead(t,{"Content-Type":n,"Cache-Control":"no-store"}),e.end(o)}async function Yh(e){let t=bn.resolve(UA(e.workspace_path||"workspace")),n=Number(e.port)||0,o=Fh.createServer((s,c)=>{let a=new URL(s.url??"/","http://localhost");if(a.pathname==="/")return Xr(c,200,"text/html; charset=utf-8",$A);if(a.pathname==="/api/state"){let d=Wr(t);return Xr(c,200,"application/json",JSON.stringify({root:t,status:d,groups:CA(t),timing:PA(t),usage:TA(t)}))}if(a.pathname==="/api/file"){let d=a.searchParams.get("path")??"",p=VA(t,d);return p.ok?Xr(c,200,"text/plain; charset=utf-8",p.text):Xr(c,404,"text/plain","not found")}Xr(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}
|
|
651
651
|
Workspace: ${t}
|
|
652
652
|
Press Ctrl-C to stop.
|
|
653
|
-
`),process.platform==="darwin"&&process.stderr.isTTY)try{
|
|
653
|
+
`),process.platform==="darwin"&&process.stderr.isTTY)try{NA("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}},J]}var $A=`<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
654
654
|
<title>scriptctl ingest \u76D1\u542C</title>
|
|
655
655
|
<style>
|
|
656
656
|
:root{--bg:#f6f7f9;--panel:#ffffff;--panel2:#f0f2f5;--line:#e3e6ea;--fg:#1f2430;--dim:#6b7280;--acc:#2563eb;--ok:#16a34a;--warn:#d97706;--err:#dc2626}
|
|
@@ -848,7 +848,7 @@ function poll(){
|
|
|
848
848
|
}).catch(function(){$('#tick').textContent='\u25CF \u79BB\u7EBF'});
|
|
849
849
|
}
|
|
850
850
|
poll();setInterval(poll,1500);setInterval(renderTiming,1000);
|
|
851
|
-
</script></body></html>`;function
|
|
851
|
+
</script></body></html>`;function qh(e,t){let n=new Map(e.actors.map(s=>[s.actor_id,s.actor_name])),o=new Map(e.locations.map(s=>[s.location_id,s.location_name])),i={title:e.title,documents:t,episodes:e.episodes.map((s,c)=>({title:s.title??`\u7B2C ${c+1} \u8BDD`,synopsis:s.synopsis??"",scenes:s.scenes.map((a,d)=>({title:`${d+1} \xB7 ${a.location?o.get(a.location.location_id):"\u672A\u660E\u786E\u5730\u70B9"}`,actions:a.actions.map(p=>{let l=Zo.safeParse(p.extend);return{id:p.action_id,type:p.type,content:p.content,source:l.success?l.data.scriptctl.source:null,speaker:"speaker"in p?"actor_id"in p.speaker?n.get(p.speaker.actor_id):p.speaker.label??p.speaker.kind:"",parenthetical:"parenthetical"in p?p.parenthetical:""}})}))})),actors:e.actors.map(s=>({name:s.actor_name,description:s.description,states:s.states}))};return`<!doctype html>
|
|
852
852
|
<html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
853
853
|
<title>\u6F2B\u753B\u5267\u672C\u5BA1\u9605</title>
|
|
854
854
|
<style>
|
|
@@ -997,39 +997,39 @@ if(model.episodes.length){
|
|
|
997
997
|
const action=actions.find(action=>action.id===requested.get('action'));
|
|
998
998
|
if(action?.source){const page=Number(requested.get('page'));selectAction(action,action.source.pages.includes(page)?page:action.source.pages[0],true,requested.has('region')?Number(requested.get('region')):undefined);}
|
|
999
999
|
}
|
|
1000
|
-
</script></html>`}var $A=e=>e==null?"":String(e),DA=e=>String(e).padStart(3,"0");function GA(e){if(!e.has("manifest.json"))return;let t=e.readJson("manifest.json");if(!Array.isArray(t.episodes))return;let n=e.path("src");Lo.mkdirSync(n,{recursive:!0});for(let o of t.episodes){if(typeof o.episode!="number"||typeof o.path!="string")continue;let i=Ba.join(n,`ep_${DA(o.episode)}.mp4`);try{Lo.rmSync(i,{force:!0}),Lo.symlinkSync(o.path,i)}catch{}}}async function qh(e){if(e.watch){if((process.env.SANDBOX_PROJECT_GROUP_NO??"").trim())throw new S("`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 Fh(e)}let t=$A(e.workspace_path||"workspace"),n=new lt(Ba.resolve(t));if(!n.has("script.json"))throw new S("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")]}});let o=n.has("manifest.json")?n.readJson("manifest.json"):null,i;if(o?.source?.kind==="comic-file"||o?.source?.kind==="comic-directory"){let s=n.readJson("manifest.json"),c=Ei(n.readJson("script.json")),a=new Set;for(let p of c.episodes)for(let l of p.scenes)for(let f of l.actions){let u=Zo.safeParse(f.extend);u.success&&a.add(u.data.scriptctl.source.document_id)}let d=[];n.passDir("src");for(let p of a){let l=s.episodes.find(h=>h.document_id===p);if(!l)throw new S(`Unknown comic source document: ${p}`,{exitCode:b,errorCode:"VIEW_COMIC_SOURCE_MISSING"});let f=n.path(`src/${l.document_id}.pdf`);Lo.rmSync(f,{force:!0}),Lo.symlinkSync(l.path,f);let u=await Ys(l,n.root);d.push({id:l.document_id,title:l.title,pdf:`src/${l.document_id}.pdf`,images:u})}i=Yh(c,d)}else GA(n),i=Hh(n.readJson("script.json"));n.writeText("review.html",i);let r=n.path("review.html");return[{text:r,data:{output:r}},J]}import*as li from"node:path";import JA from"fast-json-patch";var{compare:Zh}=JA;var Wh="/api/anime/workbench/v2/script/project-groups",BA="/api/anime/workbench/projectGroup/updateProjectGroupInfo",KA=5e3,Xh=8*1024*1024;function jA(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 ey(e){return encodeURIComponent(String(e))}function zA(e,t,n){if(t===404&&n.includes("/imports"))return new le("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 le(r,{status:t,code:i.code??null,payload:i})}return new le(e||`HTTP ${t}`,{status:t,payload:e})}function ty(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=Xh))throw new le(`script ${e} body too large: ${n} bytes (limit ${Xh})`)}async function ny(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 y=await fetch(`${e}${i}`,{method:o,headers:c,body:s,signal:a.signal});p=y.status,l=await y.text()}catch(y){if(y instanceof Error&&y.name==="AbortError")throw new le("Gateway request timed out");let m=y instanceof Error?y.message:String(y);throw new le(`Gateway request failed: ${m}`)}finally{clearTimeout(d)}if(p>=400)throw zA(l,p,i);let f=null;if(l)try{f=JSON.parse(l)}catch{throw new le("Gateway response is not valid JSON",{status:p,payload:l})}if(f===null)return null;if(typeof f!="object")return f;let u=f,h=u.code;if(h!=null&&String(h)!=="200"){let y=String(u.msg??u.message??"script-output API failed");if(r.allowMissing&&typeof y=="string"&&y.includes("\u5267\u672C\u4E0D\u5B58\u5728"))return null;throw new le(y,{status:p,code:h,payload:u})}return"data"in u?u.data:u}var ol=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 le("projectGroupNo missing; pass --project-group-no or set SANDBOX_PROJECT_GROUP_NO",{configMissing:"project"});let o=jA(process.env.AWB_BASE_URL||"");if(!o)throw new le("gateway URL missing; set AWB_BASE_URL",{configMissing:"gateway"});let i=(process.env.LINGJING_AWB_ACCESS_KEY||"").trim();if(!i)throw new le("access key missing; set LINGJING_AWB_ACCESS_KEY",{configMissing:"access"});return new e({gatewayBase:o,projectGroupNo:n,accessKey:i})}get projectPrefix(){return`${Wh}/${ey(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:Zh(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 ty("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=Zh(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return ty("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${Wh}/${ey(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await ny(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,KA),"POST",BA,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return ny(this.gatewayBase,this.accessKey,this.timeoutMs,t,n,o)}};function il(e){return ol.fromEnv(e)}var Xr=class{workspace;script;version;baseline;baselineHash;scriptPath;client;projectGroupNo;revision;constructor(t){this.workspace=t.workspace,this.script=t.script,this.version=Vo(t.script),this.baseline=structuredClone(t.script),this.baselineHash=De(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 No(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 S(r,{exitCode:t.status!==null&&t.status>=500?me: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 es(e){let t=v(e.workspace_path||"workspace"),n=Ae(e);if(!Co(n))throw new S("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=sr(n)}catch(i){throw new S("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(!te(o))throw new S("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 Xr({workspace:t,scriptPath:n,script:o})}function ts(e,t={}){let n=rl(e.script);return e.remote&&(n.script_path=e.artifactLabel),n}function HA(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=ne(e.episodes),c=0,a=0;for(let d of s)for(let p of ne(d.scenes))c+=1,a+=ne(p.actions).length;return{passed:n,has_blocking:!n,issues:r,stats:{actors:ne(e.actors).length,locations:ne(e.locations).length,props:ne(e.props).length,episodes:s.length,scenes:c,actions:a}}}function rl(e){return HA(e,gr(e))}function QA(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 FA(e){let t=v(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function YA(e){let t=ne(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(!te(r))continue;let s={...r};for(let c of["severity","code","path","summary","repair_hint"])delete s[c];i.push({severity:FA(r.severity),code:v(r.code||"SCRIPT_VALIDATION_ISSUE"),path:QA(r),summary:v(r.summary),repairHint:r.repair_hint,payload:s})}return[n,o,i]}async function sl(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]=YA(t);try{await e.client.saveValidationResult({revision:o,validationStatus:i,validationSummary:r,issues:s})}catch(c){throw c instanceof le?No("SCRIPT API BLOCKED: Validation sync failed",c):c}}async function al(e,t,n){if(e.scriptPath===null)throw new Error("local script session missing script path");return Tt(e.scriptPath,e.baselineHash),ze(e.scriptPath,e.script),[null,!1]}async function oy(e,t=zn){let n=await es(e),o=t.createExecutor(v(e.llm_config).trim()||void 0),i=await vp(n.script,o);n.scriptPath&&Tt(n.scriptPath,n.baselineHash);let r=n.scriptPath?li.dirname(n.scriptPath):li.resolve(n.workspace),s=li.resolve(v(e.output).trim()||li.join(r,"asset-audit.json"));ze(s,i);let c=i.issues.length>0,a=i.issues.map(Rp);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(`
|
|
1001
|
-
`),data:{op:"script.audit-assets",changed:!1,issues:i.issues,output:s,asset_audit:i,config_source:o.configSource,llm_routes:o.usage()}},c?Xn:J]}function
|
|
1002
|
-
`),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function
|
|
1000
|
+
</script></html>`}var DA=e=>e==null?"":String(e),GA=e=>String(e).padStart(3,"0");function JA(e){if(!e.has("manifest.json"))return;let t=e.readJson("manifest.json");if(!Array.isArray(t.episodes))return;let n=e.path("src");Lo.mkdirSync(n,{recursive:!0});for(let o of t.episodes){if(typeof o.episode!="number"||typeof o.path!="string")continue;let i=Ka.join(n,`ep_${GA(o.episode)}.mp4`);try{Lo.rmSync(i,{force:!0}),Lo.symlinkSync(o.path,i)}catch{}}}async function Zh(e){if(e.watch){if((process.env.SANDBOX_PROJECT_GROUP_NO??"").trim())throw new S("`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 Yh(e)}let t=DA(e.workspace_path||"workspace"),n=new dt(Ka.resolve(t));if(!n.has("script.json"))throw new S("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")]}});let o=n.has("manifest.json")?n.readJson("manifest.json"):null,i;if(o?.source?.kind==="comic-file"||o?.source?.kind==="comic-directory"){let s=n.readJson("manifest.json"),c=Ii(n.readJson("script.json")),a=new Set;for(let p of c.episodes)for(let l of p.scenes)for(let f of l.actions){let u=Zo.safeParse(f.extend);u.success&&a.add(u.data.scriptctl.source.document_id)}let d=[];n.passDir("src");for(let p of a){let l=s.episodes.find(h=>h.document_id===p);if(!l)throw new S(`Unknown comic source document: ${p}`,{exitCode:b,errorCode:"VIEW_COMIC_SOURCE_MISSING"});let f=n.path(`src/${l.document_id}.pdf`);Lo.rmSync(f,{force:!0}),Lo.symlinkSync(l.path,f);let u=await qs(l,n.root);d.push({id:l.document_id,title:l.title,pdf:`src/${l.document_id}.pdf`,images:u})}i=qh(c,d)}else JA(n),i=Qh(n.readJson("script.json"));n.writeText("review.html",i);let r=n.path("review.html");return[{text:r,data:{output:r}},J]}import*as ui from"node:path";import BA from"fast-json-patch";var{compare:Wh}=BA;var Xh="/api/anime/workbench/v2/script/project-groups",KA="/api/anime/workbench/projectGroup/updateProjectGroupInfo",jA=5e3,ey=8*1024*1024;function zA(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 ty(e){return encodeURIComponent(String(e))}function HA(e,t,n){if(t===404&&n.includes("/imports"))return new le("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 le(r,{status:t,code:i.code??null,payload:i})}return new le(e||`HTTP ${t}`,{status:t,payload:e})}function ny(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=ey))throw new le(`script ${e} body too large: ${n} bytes (limit ${ey})`)}async function oy(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 y=await fetch(`${e}${i}`,{method:o,headers:c,body:s,signal:a.signal});p=y.status,l=await y.text()}catch(y){if(y instanceof Error&&y.name==="AbortError")throw new le("Gateway request timed out");let m=y instanceof Error?y.message:String(y);throw new le(`Gateway request failed: ${m}`)}finally{clearTimeout(d)}if(p>=400)throw HA(l,p,i);let f=null;if(l)try{f=JSON.parse(l)}catch{throw new le("Gateway response is not valid JSON",{status:p,payload:l})}if(f===null)return null;if(typeof f!="object")return f;let u=f,h=u.code;if(h!=null&&String(h)!=="200"){let y=String(u.msg??u.message??"script-output API failed");if(r.allowMissing&&typeof y=="string"&&y.includes("\u5267\u672C\u4E0D\u5B58\u5728"))return null;throw new le(y,{status:p,code:h,payload:u})}return"data"in u?u.data:u}var il=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 le("projectGroupNo missing; pass --project-group-no or set SANDBOX_PROJECT_GROUP_NO",{configMissing:"project"});let o=zA(process.env.AWB_BASE_URL||"");if(!o)throw new le("gateway URL missing; set AWB_BASE_URL",{configMissing:"gateway"});let i=(process.env.LINGJING_AWB_ACCESS_KEY||"").trim();if(!i)throw new le("access key missing; set LINGJING_AWB_ACCESS_KEY",{configMissing:"access"});return new e({gatewayBase:o,projectGroupNo:n,accessKey:i})}get projectPrefix(){return`${Xh}/${ty(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:Wh(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 ny("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=Wh(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return ny("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${Xh}/${ty(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await oy(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,jA),"POST",KA,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return oy(this.gatewayBase,this.accessKey,this.timeoutMs,t,n,o)}};function rl(e){return il.fromEnv(e)}var es=class{workspace;script;version;baseline;baselineHash;scriptPath;client;projectGroupNo;revision;constructor(t){this.workspace=t.workspace,this.script=t.script,this.version=Vo(t.script),this.baseline=structuredClone(t.script),this.baselineHash=De(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 No(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 S(r,{exitCode:t.status!==null&&t.status>=500?ge: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 ts(e){let t=v(e.workspace_path||"workspace"),n=ke(e);if(!Co(n))throw new S("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=ar(n)}catch(i){throw new S("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(!te(o))throw new S("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 es({workspace:t,scriptPath:n,script:o})}function ns(e,t={}){let n=sl(e.script);return e.remote&&(n.script_path=e.artifactLabel),n}function QA(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=ne(e.episodes),c=0,a=0;for(let d of s)for(let p of ne(d.scenes))c+=1,a+=ne(p.actions).length;return{passed:n,has_blocking:!n,issues:r,stats:{actors:ne(e.actors).length,locations:ne(e.locations).length,props:ne(e.props).length,episodes:s.length,scenes:c,actions:a}}}function sl(e){return QA(e,hr(e))}function FA(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 YA(e){let t=v(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function qA(e){let t=ne(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(!te(r))continue;let s={...r};for(let c of["severity","code","path","summary","repair_hint"])delete s[c];i.push({severity:YA(r.severity),code:v(r.code||"SCRIPT_VALIDATION_ISSUE"),path:FA(r),summary:v(r.summary),repairHint:r.repair_hint,payload:s})}return[n,o,i]}async function al(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]=qA(t);try{await e.client.saveValidationResult({revision:o,validationStatus:i,validationSummary:r,issues:s})}catch(c){throw c instanceof le?No("SCRIPT API BLOCKED: Validation sync failed",c):c}}async function cl(e,t,n){if(e.scriptPath===null)throw new Error("local script session missing script path");return Pt(e.scriptPath,e.baselineHash),ze(e.scriptPath,e.script),[null,!1]}async function iy(e,t=zn){let n=await ts(e),o=t.createExecutor(v(e.llm_config).trim()||void 0),i=await Rp(n.script,o);n.scriptPath&&Pt(n.scriptPath,n.baselineHash);let r=n.scriptPath?ui.dirname(n.scriptPath):ui.resolve(n.workspace),s=ui.resolve(v(e.output).trim()||ui.join(r,"asset-audit.json"));ze(s,i);let c=i.issues.length>0,a=i.issues.map(Mp);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(`
|
|
1001
|
+
`),data:{op:"script.audit-assets",changed:!1,issues:i.issues,output:s,asset_audit:i,config_source:o.configSource,llm_routes:o.usage()}},c?Xn:J]}function ry(e=""){return{version:4,title:e,worldview:"",style:"",actors:[],locations:[],props:[],episodes:[]}}function Uo(e){let t=te(e.location)?e.location:null;return{actors:Cn(e.actors)?e.actors:[],props:Cn(e.props)?e.props:[],locations:t&&String(t.location_id??"").trim()?[t]:[]}}function my(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(`
|
|
1002
|
+
`),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function gy(e){let t=v(e.workspace_path||"workspace"),n=!!e.force,o=v(e.title).trim(),i=ry(o),r=ke(e);if(Co(r)&&!n)throw new S("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]}});ze(r,i);let s=new es({workspace:t,scriptPath:r,script:i}),c=ns(s),a=!!c.passed;return[my(s,c,null),a?J:Xn]}import*as or from"node:fs";import*as mi from"node:path";function pk(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 fi(e){return te(e)&&Object.values(e).every(t=>typeof t=="string")}function lk(e){return te(e)&&Object.values(e).every(fi)}function uk(e){return te(e)&&e.version===3&&fi(e.actor)&&fi(e.location)&&fi(e.prop)&&lk(e.state)&&fi(e.episode)&&fi(e.scene)&&fi(e.action)}function fk(e){if(e!==void 0){if(uk(e.identityMap))return e.identityMap;throw new S("Migration manifest contains an invalid v3-to-v4 identity map.",{exitCode:b,errorCode:"MIGRATE_MANIFEST_INVALID"})}}function hy(e,t){let n=Lt(e),o=zi(n,fk(t),{action:pk(n)});return{script:o.script,artifact:{sourceVersion:3,targetVersion:4,identityMap:o.identityMap}}}var mk=[{sourceVersion:3,targetVersion:4,migrate:hy}];function gk(e){return te(e)&&io(e.source_version)&&io(e.target_version)&&e.source_version<e.target_version&&"identity_map"in e}function yy(e){if(!Array.isArray(e))throw new S("Migration manifest steps must be an array.",{exitCode:b,errorCode:"MIGRATE_MANIFEST_INVALID"});return e.map(t=>{if(!gk(t))throw new S("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 hk(e,t){return mk.find(n=>n.sourceVersion===e&&n.targetVersion<=t)}function yk(e,t){return e.find(n=>n.sourceVersion===t.sourceVersion&&n.targetVersion===t.targetVersion)}function wy(e,t,n=[]){let o=Vo(e);if(t<o)throw new S("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=Is(e),r=o,s=[];for(;r<t;){let c=hk(r,t);if(c===void 0)throw new S(`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,yk(n,c));i=a.script,r=c.targetVersion,s.push(a.artifact)}return{sourceVersion:o,targetVersion:t,script:i,steps:s}}function os(e,t){let n=e[t];return typeof n=="string"?n.trim():""}function wk(e,t){let n=os(e,t);return/^\d+$/.test(n)?Number(n):null}function _k(e){let t=wk(e,"to");if(io(t))return t;throw new S("A supported migration target version is required.",{exitCode:G,errorCode:"MIGRATE_TARGET_INVALID",hint:"Pass --to <version> with a supported Script version.",data:{expected:bc.map(String),actual:[os(e,"to")||"<empty>"]}})}function xk(e){let t=mi.extname(e);return`${t.length>0?e.slice(0,-t.length):e}.migration.json`}function Ek(e,t,n){let o=[e,t,n].map(i=>mi.resolve(i));if(o[0]===o[1])throw new S("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 S("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 _y(e,t){if(!t&&or.existsSync(e))throw new S("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 Sk(e){let t;try{t=or.readFileSync(e,"utf8")}catch(n){throw new S("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 S("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 Ik(e,t){if(!t||!or.existsSync(e))return;let n;try{n=JSON.parse(or.readFileSync(e,"utf8"))}catch(o){throw new S("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(!te(n)||n.version!==1||!io(n.source_version)||!io(n.target_version)||typeof n.source_path!="string"||typeof n.source_sha256!="string")throw new S("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:yy(n.steps)}}async function xy(e){let t=os(e,"script_path"),n=os(e,"output");if(!t||!n)throw new S("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=mi.resolve(t),i=mi.resolve(n),r=mi.resolve(os(e,"manifest")||xk(i)),s=_k(e),c=!!e.force;return Ek(o,i,r),_s(i,async()=>{_y(i,c),_y(r,c);let a=Sk(o),d=Vo(a.value);if(s<=d)throw new S("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=hr(a.value),l=Ik(r,c),f=wy(a.value,s,l?.steps),u=hr(f.script),h={version:1,source_version:f.sourceVersion,target_version:f.targetVersion,source_path:o,source_sha256:ye(a.raw),steps:f.steps};ze(r,{...h,steps:h.steps.map(w=>({source_version:w.sourceVersion,target_version:w.targetVersion,identity_map:w.identityMap}))}),ze(i,f.script);let y={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(`
|
|
1003
1003
|
`):[`Script v${f.targetVersion}: ${i}`,`Migration manifest: ${r}`,`validation: ${u.errors.length} errors; repair before production use`].join(`
|
|
1004
|
-
`),data:y},u.ok?J:Xn]})}import*as
|
|
1004
|
+
`),data:y},u.ok?J:Xn]})}import*as ir from"node:path";import*as Sy from"node:path";function Ey(e,t){let n=ye(t);return Sy.join(e,`${n}.json`)}function is(e){return{read(t){let n=Ey(e,t);return Co(n)?ar(n):null},write(t){oc(Ey(e,t.key),t)}}}function hl(){return{read(){return null},write(){}}}function yl(e){if(Array.isArray(e))return`[${e.map(t=>yl(t)).join(",")}]`;if(e&&typeof e=="object"){let t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${yl(t[n])}`).join(",")}}`}return JSON.stringify(e)}function wl(e){return ye(yl(e))}function _l(e,t,n){return{key:e,signature:t,value:n,createdAt:new Date().toISOString()}}function Ak(e,t){return[e.trim(),t.trim()].filter(Boolean).join(`
|
|
1005
1005
|
|
|
1006
|
-
`)}function
|
|
1007
|
-
`),
|
|
1008
|
-
`),
|
|
1009
|
-
`)
|
|
1010
|
-
`);function
|
|
1011
|
-
`).trim()}}function
|
|
1006
|
+
`)}function Ay(e,t){return{system:Ak(e.instruction,e.format),user:e.input?e.input({parcel:t}):String(t)}}function kk(e,t,n){if(e.kind==="llm"){if(!n.executor)throw new Error("loom llm task requires run({ executor })");let o=Ay(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 za(e){return{kind:"root",children:e}}function Il(e,t,n){return{kind:"scope",scope:e,data:n,children:t}}function rs(e){return{kind:"parcel",data:e}}function as(e){return{kind:"llm",...e}}var xl=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 Lk(this.input,this.steps,t)}};function Ha(e){return new xl(e)}async function bk(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 Ok(e,t){let n=t.partition(e);return za(n.map(o=>{let i=t.chunk(o).map(r=>rs(r));return Il(t.scope,i,o)}))}function El(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(...El(r,s))}return o}function ss(e,t){return e?.(t),t}async function vk(e,t){return ss(e.validate,await e.run({parcel:t}))}async function Rk(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 Iy(e,t,n){return ss(e.validate,e.parse({text:n.text,parcel:t,raw:n.raw}))}function ky(e,t,n){if(e.kind==="parcel"){let i=t[n.index];return n.index+=1,rs(i)}let o=e.children.map(i=>ky(i,t,n));return e.kind==="root"?za(o):Il(e.scope,o,e.data)}function Mk(e){return e.children.every(t=>t.kind==="parcel")}async function by(e,t,n,o,i){if(e.kind==="parcel")return e;let r=[];for(let w=0;w<e.children.length;w++){let g=e.children[w];r.push(await by(g,t,n,o,[...i,`${g.kind}:${w}`]))}let s=e.kind==="root"?za(r):Il(e.scope,r,e.data),c=t==="root"&&s.kind==="root",a=s.kind==="scope"&&s.scope===t;if(!c&&!a||!Mk(s))return s;let d=s.children.map(w=>w.data),p=s.kind==="scope"?s.data:null,l=s.kind==="scope"?s.scope:"root",f=n.version??"",u=`reduce:${t}:${i.join("/")}:${wl({items:d,scopeData:p,version:f,salt:o.checkpointSalt})}`,h=wl({step:"reduce",scope:t,version:f,items:d,scopeData:p,salt:o.checkpointSalt}),y=await Sl(o.checkpoint,u,h);if(y.hit)return o.report.reused+=1,rs(ss(n.validate,y.value));let m=ss(n.validate,await n.run(d,{scope:p,scopeName:l}));return o.report.ran+=1,await o.checkpoint.write(_l(u,h,m)),rs(m)}async function Sl(e,t,n){let o=await e.read(t);return o&&o.signature===n?{hit:!0,value:o.value}:{hit:!1}}async function Lk(e,t,n){let o={executor:n.executor,signal:n.signal,checkpointSalt:n.checkpointSalt,checkpoint:n.checkpoint??hl(),concurrency:n.concurrency??4,report:{reused:0,ran:0}},i=null,r=e;for(let c of t){if(c.kind==="split"){i=Ok(r,c.spec),r=i;continue}if(i||(i=za([rs(r)])),c.kind==="extract"){let a=El(i),d=await bk(a,o.concurrency,async p=>{let l=kk(c.task,p.parcel,o),f=wl(l.payload),u=`extract:${p.path.join("/")}:${f}`;if(c.task.kind==="llm"){let m=await Sl(o.checkpoint,u,f);if(m.hit)return o.report.reused+=1,o.executor?.recordReuse(c.task.taskId),Iy(c.task,p.parcel,m.value);let w=l.request??Ay(c.task,p.parcel),g=await Rk(c.task,w,o),_=Iy(c.task,p.parcel,g);return o.report.ran+=1,await o.checkpoint.write(_l(u,f,g)),_}let h=await Sl(o.checkpoint,u,f);if(h.hit)return o.report.reused+=1,ss(c.task.validate,h.value);let y=await vk(c.task,p.parcel);return o.report.ran+=1,await o.checkpoint.write(_l(u,f,y)),y});i=ky(i,d,{index:0}),r=i;continue}i=await by(i,c.scope,c.task,o,[]),r=i}if(!i)return{value:r,report:o.report};let s=El(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 Ry={episodeInputMaxChars:6e3,episodeChunkTargetChars:4800,arcEpisodeCount:10,finalMaxInputChars:12e3},Nk="\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",Uk=["\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(`
|
|
1007
|
+
`),Ck="\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",Pk=["\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(`
|
|
1008
|
+
`),Tk="\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",Vk=["\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(`
|
|
1009
|
+
`),$k="\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",Dk=["\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(`
|
|
1010
|
+
`);function Gk(e,t,n){let o=v(t.episode_id).trim()||`ep_${String(n+1).padStart(3,"0")}`,i=nb(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 ne(t.scenes)){s.push(eb(e,a));for(let d of ne(a.actions)){let p=tb(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(`
|
|
1011
|
+
`).trim()}}function Jk(e,t=Ry){let n=e.text.split(/\r?\n/),o=n.flatMap(c=>Zk(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:ye(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(`
|
|
1012
1012
|
`).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(`
|
|
1013
|
-
`).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:
|
|
1014
|
-
`),oneLine:
|
|
1015
|
-
`),turns:
|
|
1016
|
-
`)}function
|
|
1017
|
-
`),data:{op:i?"synopsis.generate":"synopsis.generate.dry-run",changed:i&&h,revision:g,idempotent:_,validation:y,issues:E,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()}},J]}function
|
|
1018
|
-
`).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=
|
|
1019
|
-
`)}function
|
|
1020
|
-
`)}function
|
|
1021
|
-
`).trim()}function
|
|
1022
|
-
`).trim()}function
|
|
1023
|
-
`)}function
|
|
1013
|
+
`).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:ye(c)}))}function Bk(e,t){let n=Fa(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,part:t.part,partCount:t.partCount,synopsis:Zn(n,"\u7247\u6BB5\u6897\u6982"),events:rr(n.get("\u5173\u952E\u4E8B\u4EF6")??""),characterChanges:ib(n.get("\u4EBA\u7269\u53D8\u5316")??""),hook:(n.get("\u7ED3\u5C3E\u94A9\u5B50")??"").trim()}}function Kk(e,t){let n=lb(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(`
|
|
1014
|
+
`),oneLine:fb(o.map(i=>i.synopsis)),events:bl(o.flatMap(i=>i.events))}}function jk(e,t){let n=Fa(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,synopsis:Zn(n,"\u5206\u96C6\u6897\u6982"),oneLine:Zn(n,"\u5355\u53E5\u6897\u6982"),events:rr(n.get("\u5173\u952E\u4E8B\u4EF6")??"")}}function zk(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:cb(i)})}return n}function Hk(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:db(i)})}return n}function Qk(e,t){let n=Fa(e);return{index:t.index,startEpisodeNo:t.startEpisodeNo,endEpisodeNo:t.endEpisodeNo,synopsis:Zn(n,"\u9636\u6BB5\u6897\u6982"),turns:rr(n.get("\u5173\u952E\u8F6C\u6298")??""),openQuestions:rr(n.get("\u672A\u89E3\u51B3\u60AC\u5FF5")??"")}}function Fk(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(`
|
|
1015
|
+
`),turns:bl(t.flatMap(i=>i.turns)),openQuestions:bl(t.flatMap(i=>i.openQuestions))}}function Al(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(`
|
|
1016
|
+
`)}function Yk(e){let t=Fa(e);return{synopsis:Zn(t,"\u5168\u6587\u6897\u6982"),theme:Zn(t,"\u4E3B\u9898"),logline:Zn(t,"\u4E00\u53E5\u8BDD"),style:Zn(t,"\u98CE\u683C"),mainCharacters:rb(Zn(t,"\u4E3B\u8981\u4EBA\u7269"))}}async function qk(e){let t=e.config??Ry,n=ne(e.script.episodes);if(n.length===0)throw new S("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,h)=>Gk(e.script,u,h)),i=e.overwrite?o:o.filter(u=>!u.existingSynopsis),r=i.length===0?[]:await Ha(e.script).split({scope:"episode",partition:()=>i,chunk:u=>Jk(u,t)}).extract(as({taskId:"synopsis.chunk",instruction:Nk,format:Uk,input:({parcel:u})=>sb(u),parse:({text:u,parcel:h})=>Bk(u,h)})).reduce("episode",Kk).extract(as({taskId:"synopsis.episode",instruction:Ck,format:Pk,input:({parcel:u})=>ab(u),parse:({text:u,parcel:h})=>jk(u,h)})).reduce("root",u=>[...u].sort((h,y)=>h.episodeNo-y.episodeNo)).run({concurrency:e.concurrency,checkpoint:is(ir.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:mb(u.existingSynopsis),events:[]}),d=a.filter(u=>!u.synopsis.trim()).map(u=>u.episodeId);if(d.length>0)throw new S("Some episode synopses are still missing.",{exitCode:ge,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||hb(e.script),l=p?await Wk({episodes:a,executor:e.executor,checkpointDir:ir.join(e.checkpointDir,"arc"),checkpointSalt:e.checkpointSalt,concurrency:e.concurrency,config:t}):{value:[],report:{reused:0,ran:0}},f=p?await Xk({episodes:a,arcs:l.value,executor:e.executor,checkpointDir:ir.join(e.checkpointDir,"final"),checkpointSalt:e.checkpointSalt,config:t}):{value:yb(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 My(e,t=zn){let n=gb(e.concurrency,Nl,"--concurrency"),o=!!e.overwrite,i=!!e.apply,r=!!e.dry_run;if(i&&r)throw new S("--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 ts(e),a=t.createExecutor(v(e.llm_config).trim()||void 0),d=v(e.checkpoint).trim()||ir.join(Pl(s),"loom","synopsis-generate"),p=await qk({script:c.script,executor:a,checkpointDir:d,concurrency:n,overwrite:o}),l=new Set,f=ne(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=Qa(c.script,"synopsis",p.overview.synopsis,o)||u,u=Qa(c.script,"theme",p.overview.theme,o)||u,u=Qa(c.script,"logline",p.overview.logline,o)||u,u=Qa(c.script,"style",p.overview.style,o)||u,o||ne(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 h=l.size>0||u,y=ns(c),m=!!y.passed,w=[`${p.episodeBriefs.length} episodes; ${l.size} synopses ${i?"written":"would change"}; overview ${p.overviewGenerated?"generated":"reused"}; validation ${m?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}`],g,_;i&&h&&([g,_]=await cl(c,e,"synopsis.generate"),await al(c,y,g),c.remote&&w.push(`revision ${g}; idempotent ${String(_).toLowerCase()}`));let E=qc(ne(y.issues));return i||w.push("Run again with --apply to write the generated synopsis fields."),[{text:[...w,...E].join(`
|
|
1017
|
+
`),data:{op:i?"synopsis.generate":"synopsis.generate.dry-run",changed:i&&h,revision:g,idempotent:_,validation:y,issues:E,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()}},J]}function Zk(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 Wk(e){let t=zk(e.episodes,e.config.arcEpisodeCount),n=1,o={reused:0,ran:0};for(;;){let i=await Ha(t).split({scope:"arc",partition:c=>c,chunk:c=>[c]}).extract(as({taskId:"synopsis.arc",instruction:Tk,format:Vk,input:({parcel:c})=>pb(c),parse:({text:c,parcel:a})=>Qk(c,a)})).reduce("arc",c=>ub(c,"arc")).reduce("root",c=>[...c].sort((a,d)=>a.startEpisodeNo-d.startEpisodeNo)).run({concurrency:e.concurrency,checkpoint:is(ir.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(Al(e.episodes,r).length<=e.config.finalMaxInputChars||r.length<=1)return{value:r,report:o};t=Hk(r,e.config.arcEpisodeCount),n+=1}}async function Xk(e){let t=e.arcs;for(;Al(e.episodes,t).length>e.config.finalMaxInputChars&&t.length>1;)t=[Fk(t)];let n=await Ha({episodes:e.episodes,arcs:t}).extract(as({taskId:"synopsis.script-overview",instruction:$k,format:Dk,input:({parcel:o})=>Al(o.episodes,o.arcs),parse:({text:o})=>Yk(o)})).run({concurrency:1,checkpoint:is(e.checkpointDir),checkpointSalt:e.checkpointSalt,executor:e.executor});return{value:n.value,report:n.report}}function eb(e,t){let n=te(t.environment)?t.environment:{},o=v(n.space).trim(),i=v(n.time).trim(),r=Uo(t),s=ne(r.locations).map(p=>kl(e,"locations","location_id","location_name",v(p.location_id))).filter(p=>p),c=ne(r.actors).map(p=>kl(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 tb(e,t){let n=v(t.type).trim();if(n==="dialogue"){let i=Oy(e,t),r=v(t.content).trim();return r?`[\u5BF9\u767D] ${i?`${i}\uFF1A`:""}${r}`:""}if(n==="inner_thought"){let i=Oy(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 Oy(e,t){let n=t.speaker;if(!te(n))return"";let o=v(n.actor_id).trim();if(o)return kl(e,"actors","actor_id","actor_name",o)||o;let i=v(n.kind).trim();return i?v(n.label).trim()||i:""}function kl(e,t,n,o,i){let r=ne(e[t]).find(s=>v(s[n])===i);return r?v(r[o]).trim():""}function nb(e,t){let n=/^ep_(\d+)$/.exec(e);return n?Number(n[1]):t+1}function Fa(e){let t=new Map,n=null,o=[],i=()=>{n&&t.set(n,o.join(`
|
|
1018
|
+
`).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=ob(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 vy=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 ob(e){let t=e.trim(),n=/^#{1,6}\s+(.+?)\s*$/.exec(t);if(n){let r=n[1].trim();return vy.has(r)?{name:r,inline:""}:null}let o=t.search(/[::]/),i=(o>=0?t.slice(0,o):t).trim();return vy.has(i)?{name:i,inline:o>=0?t.slice(o+1).trim():""}:null}function Zn(e,t){let n=(e.get(t)??"").trim();if(!n)throw new Error(`synopsis output missing section: ${t}`);return n}function rr(e){return e.split(/\r?\n/).map(t=>t.trim()).map(t=>t.replace(/^[-*]\s*/,"").trim()).filter(t=>t.length>0)}function ib(e){return rr(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),change:o.join("|").trim()}}).filter(t=>t.name&&t.change)}function rb(e){return rr(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),role:o.join("|").trim()}}).filter(t=>t.name&&t.role)}function sb(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(`
|
|
1019
|
+
`)}function ab(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(`
|
|
1020
|
+
`)}function cb(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(`
|
|
1021
|
+
`).trim()}function db(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(`
|
|
1022
|
+
`).trim()}function pb(e){return[`\u5F53\u524D\u9636\u6BB5\uFF1A\u7B2C${e.startEpisodeNo}-${e.endEpisodeNo}\u96C6`,"","\u5206\u96C6\u6897\u6982\uFF1A",e.text].join(`
|
|
1023
|
+
`)}function lb(e,t){if(e===null)throw new Error(`${t} scope missing`);return e}function ub(e,t){let n=e[0];if(!n||e.length!==1)throw new Error(`${t} reduce requires exactly one item`);return n}function fb(e){return e.map(t=>t.trim()).find(t=>t.length>0)??""}function bl(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 mb(e){let t=e.replace(/\s+/g," ").trim();return t.length>50?t.slice(0,50):t}function gb(e,t,n){if(e==null||e==="")return t;let o=Number(e);if(!Number.isFinite(o)||o<=0)throw new S(`${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 Qa(e,t,n,o){return!o&&v(e[t]).trim()||v(e[t])===n?!1:(e[t]=n,!0)}function hb(e){return!v(e.synopsis).trim()||!v(e.theme).trim()||!v(e.logline).trim()||!v(e.style).trim()||ne(e.main_characters).length===0}function yb(e){return{synopsis:v(e.synopsis).trim(),theme:v(e.theme).trim(),logline:v(e.logline).trim(),style:v(e.style).trim(),mainCharacters:ne(e.main_characters).map(t=>({name:v(t.name).trim(),role:v(t.role).trim()})).filter(t=>t.name&&t.role)}}import*as cs from"node:fs";var Ny=3;function Ol(e){return v(e.project_group_no||process.env.SANDBOX_PROJECT_GROUP_NO).trim()}function vl(e){try{return rl(e)}catch(t){throw t instanceof le?No("SCRIPT API BLOCKED: gateway not configured",t):t}}function Uy(e,t){let n=Ol(e);if(n&&n!==t.projectGroupNo)throw Ly(t,`configured projectGroupNo=${n}`);let o=vl(t.projectGroupNo);if(o.gatewayBase!==t.apiBaseUrl)throw Ly(t,`configured apiBaseUrl=${o.gatewayBase}`);return o}function Ly(e,t){return new S("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 Rl(e){let t;try{t=JSON.parse(cs.readFileSync(e,"utf-8"))}catch(n){throw new S("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(!te(t))throw new S("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 Cy(e){return String(e.code)==="9002"||e.message.includes("\u7248\u672C\u51B2\u7A81")}function Ya(e){let t=e.status!==null&&e.status>=200&&e.status<300&&e.code===null;return e.status===null||e.status>=500||t}function Py(e){let t=Number(e.revision);if(!Number.isInteger(t)||t<0)throw new S("The gateway returned an invalid snapshot revision.",{exitCode:ge,errorCode:"PUBLISH_OUTCOME_UNKNOWN",hint:"Inspect the remote script before retrying.",data:{actual:[JSON.stringify(e)]}});return t}function Ty(e,t){return new S("The publish outcome could not be confirmed after retrying.",{exitCode:ge,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 wb(e,t,n,o,i,r){let s=[];for(let c=1;c<=Ny;c+=1){let a;try{a=await e.getSnapshot()}catch(p){if(p instanceof le&&Ya(p)){s.push(`snapshot attempt ${c}: ${p.message}`);continue}throw p instanceof le?No("PUBLISH BLOCKED: snapshot query failed",p):p}if(a===null||!te(a.script))throw new S("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=Py(a);if(De(a.script)===o&&a.validationStatus==="valid")return{revision:d,patchedFromRevision:d,attempts:c,recovered:d!==i.baseRevision};Pt(t,o);try{let p=await e.publishPatch({baseRevision:d,old:a.script,edited:n,validation:r}),l=te(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 le&&(Cy(p)||Ya(p))){s.push(`patch attempt ${c}: ${p.message}`);continue}throw p instanceof le?No("PUBLISH BLOCKED: patch failed",p):p}}throw Ty(i.baseRevision,s)}async function _b(e,t,n,o,i){let r=[];for(let s=1;s<=Ny;s+=1){let c;try{c=await e.getSnapshot()}catch(a){if(a instanceof le&&Ya(a)){r.push(`snapshot attempt ${s}: ${a.message}`);continue}throw a instanceof le?No("PUBLISH BLOCKED: snapshot query failed",a):a}if(c!==null){let a=Py(c);if(te(c.script)&&De(c.script)===o&&c.validationStatus==="valid")return{revision:a,patchedFromRevision:0,attempts:s,recovered:!0};throw new S("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}`]}})}Pt(t,o);try{let a=await e.publishPatch({baseRevision:0,old:{},edited:n,validation:i}),d=te(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 le&&(Cy(a)||Ya(a))){r.push(`patch attempt ${s}: ${a.message}`);continue}throw a instanceof le?No("PUBLISH BLOCKED: patch failed",a):a}}throw Ty(0,r)}async function Vy(e){let t=ke(e),n=!!e.discard_local,o=gr(t),i=Es(t),r=cs.existsSync(t),s=fr(t);if(r&&i===null&&!n)throw new S("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&&De(Rl(t))!==i.baseContentHash)throw new S("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?Uy(e,i):vl(Ol(e)||null),a;try{a=await c.getSnapshot()}catch(l){throw l instanceof le?No("CHECKOUT BLOCKED: snapshot query failed",l):l}if(a===null||!te(a.script))throw new S("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}`]}});mr(t,s);let d=De(a.script);return ze(t,a.script),Ss(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)}},J]}function $y(e){let t=ke(e),n=cs.existsSync(t),o=Es(t),i=n&&o!==null?De(Rl(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}}},J]}async function Dy(e){let t=ke(e),n=Rl(t),o=De(n),i=Es(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}},J];let r=sl(n);if(!r.passed)throw new S("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=Is(n).episodes.length,c={status:"valid",summary:{passed:!0,hasBlocking:!1,stats:r.stats??{},issueCount:0}};if(i!==null){let p=Uy(e,i),l=await wb(p,t,n,o,i,c);return Ss(t,{schemaVersion:1,projectGroupNo:p.projectGroupNo,apiBaseUrl:p.gatewayBase,baseRevision:l.revision,baseContentHash:o}),await pd(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}},J]}let a=vl(Ol(e)||null),d=await _b(a,t,n,o,c);return Ss(t,{schemaVersion:1,projectGroupNo:a.projectGroupNo,apiBaseUrl:a.gatewayBase,baseRevision:d.revision,baseContentHash:o}),await pd(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}},J]}function Gy(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",`
|
|
1024
1024
|
Example:
|
|
1025
1025
|
scriptctl migrate -p ./old-script.json -o ./script-v4.json --to 4
|
|
1026
|
-
`).action(q(
|
|
1026
|
+
`).action(q(xy,t));let o=e.command("ingest").description("Convert source files into a Script v4 workspace").option("-s, --source-path <path>","Text, video or PDF comic file/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 or base64 (default follows provider)").option("--video-output <format>","Video model output format: dsl or json (default dsl)").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 or comic chapter").option("--force","Rebuild completed stages").addHelpText("after",`
|
|
1027
1027
|
Example:
|
|
1028
1028
|
scriptctl ingest --source-path ./draft.md --workspace-path ./workspace
|
|
1029
|
-
`).action(q(r=>
|
|
1029
|
+
`).action(q(r=>Bh(r,n),t));o.command("status").description("Show ingest workspace progress").option("-w, --workspace-path <path>","Workspace directory").action(q(jh,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",`
|
|
1030
1030
|
Example:
|
|
1031
1031
|
scriptctl ingest skip -w ./workspace --episode 7 --reason "provider policy block"
|
|
1032
|
-
`).action(q(
|
|
1032
|
+
`).action(q(zh,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",`
|
|
1033
1033
|
Example:
|
|
1034
1034
|
scriptctl evidence -p ./script.json -s /Volumes/NAS/videos -w ./workspace --force
|
|
1035
|
-
`).action(q(
|
|
1035
|
+
`).action(q(Hh,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(q(Zh,t)),td(e.command("checkout")).description("Download a remote script into a managed local copy").option("--discard-local","Replace an existing dirty local copy").action(q(Vy,t)),de(e.command("status"),"read").description("Show local working-copy state").action(q($y,t)),td(e.command("publish")).description("Validate and publish the local working copy").action(q(Dy,t)),de(e.command("create")).description("Create an empty script").option("--title <title>","Script title").option("--force","Replace an existing script file").action(q(gy,t)),de(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(q(r=>iy(r,n),t));let i=e.command("synopsis").description("Generate synopsis fields with an LLM").action(()=>i.outputHelp());de(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(q(r=>My(r,n),t))}function Sb(e,t=zn){let n=new xb("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(Ri(),"-v, --version","Show the scriptctl version");return Gy(n,e,t),Mm(n,e),Qu(n,e),vm(n,e),Sf(n,e),n}function qa(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 By(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=qa(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 Ib(e,t){return t==="--"?!0:t.startsWith("--")?qa(e,t)!==void 0:By(e,t).recognized}function Jy(e,t,n){return n===void 0||n==="--"?!1:t.required?!Ib(e,n):t.optional&&!n.startsWith("-")}function Ab(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=qa(n,i);s&&!i.includes("=")&&Jy(n,s,t[o+1])&&(o+=1);continue}if(i.startsWith("-")){let s=By(n,i);if(s.recognized&&s.json)return!0;s.recognized&&s.valueOption&&!s.hasAttachedValue&&Jy(n,s.valueOption,t[o+1])&&(o+=1);continue}let r=n.commands.find(s=>s.name()===i);r&&(n=r)}return!1}function kb(e,t){let n=e;for(let r=0;r<t.length;r+=1){let s=t[r];if(s.startsWith("-")){let a=qa(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 bb(e){return e.message.replace(/^error:\s*/i,"").replace(/\.$/,"")}async function a2(e=null,t=zn){Xu();let n=e??process.argv.slice(2),o={jsonMode:!1,exitCode:J},i=Sb(o,t);if(o.jsonMode=Ab(i,n),n.length===0)return i.outputHelp(),J;try{return await i.parseAsync(n,{from:"user"}),o.exitCode}catch(r){if(r instanceof Eb)return r.code==="commander.help"||r.code==="commander.helpDisplayed"||r.code==="commander.version"?J:Ar(new S(bb(r),{exitCode:G,errorCode:"USAGE_ERROR",hint:`Run '${kb(i,n)}'.`}),o.jsonMode);if(r instanceof S)return Ar(r,o.jsonMode);if(r instanceof C)return Ar(new S(pn(r.failure),{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode);let s=r instanceof Error?r.message:String(r);return Ar(new S(s,{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode)}}export{Sb as a,a2 as b};
|