@lingjingai/scriptctl 0.74.0 → 0.74.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changes/0.74.1.md +13 -0
- package/changes/0.74.2.md +19 -0
- package/dist/bin.js +1 -1
- package/dist/{chunk-QQ7KIXWT.js → chunk-GIHAHL2F.js} +147 -146
- package/dist/cli.js +1 -1
- package/dist/review-agent.js +335 -334
- package/package.json +1 -1
- package/skills/scriptctl/SKILL.md +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{Command as
|
|
2
|
-
`)}list(t,n="*"){if(!Ne.existsSync(t))return[];let o=
|
|
1
|
+
import{Command as Kv,CommanderError as jv}from"commander";import*as Mc from"node:crypto";import*as Ni from"node:fs";import*as Ir from"node:path";import*as Ne from"node:fs";import*as Mt from"node:path";var Cs=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 qw(e){let t="";for(let n of e)n==="*"?t+="[^/]*":n==="?"?t+="[^/]":".+^$()[]{}|\\".includes(n)?t+="\\"+n:t+=n;return new RegExp("^"+t+"$")}var Rc=class{exists(t){return Ne.existsSync(t)}readText(t){return Ne.readFileSync(t,"utf-8")}writeText(t,n){Ne.mkdirSync(Mt.dirname(t),{recursive:!0}),Ne.writeFileSync(t,n,"utf-8")}readJson(t){return JSON.parse(Ne.readFileSync(t,"utf-8"))}writeJson(t,n){this.writeText(t,JSON.stringify(n,null,2)+`
|
|
2
|
+
`)}list(t,n="*"){if(!Ne.existsSync(t))return[];let o=qw(n),i=Ne.readdirSync(t),r=[];for(let s of i)o.test(s)&&r.push(Mt.join(t,s));return r.sort(),r}delete(t){Ne.existsSync(t)&&Ne.unlinkSync(t)}deleteTree(t){Ne.existsSync(t)&&Ne.rmSync(t,{recursive:!0,force:!0})}copyToPath(t,n){Ne.mkdirSync(Mt.dirname(n),{recursive:!0}),Ne.copyFileSync(t,n)}},Ts=new Rc;var G=0,B=64,b=66,X=70,uo=78,_u=30;var Wv=Ir.join("draft","scriptctl","direct"),Zw=Ir.join("workspace","script.json");var Eu=["\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"],xu=new Set(["actor","location","prop"]);var Xv=`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 Nv,CommanderError as Uv}from"commander";import*as kc from"node
|
|
|
79
79
|
<\u6574\u90E8\u5168\u6587\u6897\u6982\uFF0C\u7EAF\u6587\u672C\uFF0C\u53EF\u591A\u884C>
|
|
80
80
|
|
|
81
81
|
==================== 7. \u5143\u4FE1\u606F.md\uFF08\u53EF\u9009\uFF0C\u6574\u90E8\u5143\u4FE1\u606F\uFF1B\u4E00\u822C\u7531 merger \u6536\u53E3\u65F6\u5199\uFF09 ====================
|
|
82
|
-
worldview: <\u4E16\u754C\u89C2\uFF0C\u53D6\u8FD9\u4E9B\u679A\u4E3E\u4E4B\u4E00\uFF1A`+
|
|
82
|
+
worldview: <\u4E16\u754C\u89C2\uFF0C\u53D6\u8FD9\u4E9B\u679A\u4E3E\u4E4B\u4E00\uFF1A`+Eu.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 Jw(e){return new Ls(e)}function hu(e){return Jw(e).directDir}function me(e){let t=e.script_path??e.scriptPath;return xr.resolve(typeof t=="string"&&t.length>0?t:Bw)}function Sr(e){return Ns.readJson(e)}function bc(e,t){Ns.writeJson(e,t)}function Fo(e){return Ns.exists(e)}function _e(e){return kc.createHash("sha256").update(e,"utf-8").digest("hex")}function vc(e){let t=kc.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 yn(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 Tn=["action","dialogue","inner_thought","transition"],qt=new Set(Tn),Vn=["system","broadcast","offscreen","group"],Yo=new Set(Vn),$n=["featured","background"],Pt=new Set($n),Pi=["\u4E3B\u89D2","\u914D\u89D2"],fo=new Set(Pi),Us=["day","night","dawn","dusk"],Oc=new Set(Us);function Ar(e){return typeof e=="string"&&Oc.has(e)}var Rc=["interior","exterior"],_u=new Set(Rc);function lt(e){return e.normalize("NFKC").toLowerCase()}function Eu(e){return JSON.stringify([e.code,e.path,e.message])}function Mc(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 Lc(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=Mc(e.errors),o=Mc(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function Nc(e,t){let n=Mc(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 Kw}from"nanoid";var Ci="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Uc=6,Ti={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},jw=Kw(Ci,Uc),zw=`[${Ci}]`,xu=Object.fromEntries(Object.entries(Ti).map(([e,t])=>[e,new RegExp(`^${t}${zw}{${Uc}}$`)]));function V(e,t){return typeof t=="string"&&xu[e].test(t)}var Pc="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:Pc})}var tt=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},Hw=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,Qw=/^(\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 tt(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 tt(e,"Timestamp must not be empty.");let n=t.match(Qw);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new tt(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new tt(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(Hw);if(!o)throw new tt(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 tt(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 Fw(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 Yw(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=Fw(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 tt))throw d;n("timestamp_invalid",c,d.message);return}o!==null&&Yw(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",qw=["state_changes","actor_id","speakers","lines"];function wt(e){let t=[],n=[],o=(u,h,m,g)=>t.push({code:u,path:h,message:m,...g?{repair_hint:g}:{}}),i=(u,h,m)=>n.push({code:u,path:h,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,h,m,g,w)=>{if(!Dn(u)){o("field",w,`${w} must be an array`);return}u.forEach((y,_)=>{let x=`${w}[${_}]`;if(!yt(y)){o("asset",x,"asset must be an object");return}let E=y[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,h),!Ie(y[g]))o("asset_name",`${x}.${g}`,`${g} required`);else if(h==="actor"){let v=lt(y[g]),I=c.get(v);I!==void 0?o("dup_actor_name",`${x}.${g}`,`actor name ${y[g]} already belongs to ${I}`):c.set(v,E)}(!Ie(y.importance)||!$n.includes(y.importance))&&o("importance",`${x}.importance`,`importance must be one of ${$n.join("|")}`),Ie(y.description)||o("asset_desc",`${x}.description`,"description must be a string");let A=new Set,k=new Set,U=0;!Dn(y.states)||y.states.length===0?o("states",`${x}.states`,"states must be a non-empty array"):y.states.forEach((v,I)=>{let R=`${x}.states[${I}]`;if(!yt(v)||!Ie(v.state_id)){o("state_id",R,"state_id required");return}A.has(v.state_id)&&o("dup_state",R,`duplicate state_id ${v.state_id}`),A.add(v.state_id),v.state_id==="default"&&U++,Ie(v.state_name)?(k.has(v.state_name)&&o("dup_state_name",`${R}.state_name`,`duplicate state_name ${v.state_name}`),k.add(v.state_name)):o("state_name",`${R}.state_name`,"state_name required")}),Dn(y.states)&&U!==1&&o("default_state",`${x}.states`,`exactly one 'default' state required, found ${U}`),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,h,m,g)=>{if(s.get(u)!==m){o("ref",g,`${m} ${u} not found`);return}h!==void 0&&(!Ie(h)||!r.get(u)?.has(h))&&o("state_ref",g,`state ${String(h)} not materialized on ${u}`)},p=(u,h,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,y)=>{if(!yt(w)||!Ie(w[m])){o("ref",`${g}[${y}]`,`${m} required`);return}d(w[m],w.state_id,h,`${g}[${y}]`)})},l=(u,h,m,g)=>{if(!yt(u)){o("action",h,"action must be an object");return}for(let y of qw)y in u&&o("legacy_field",`${h}.${y}`,`v3 forbids action.${y}`);let w=u.type;if((!Ie(w)||!Tn.includes(w))&&o("action_type",`${h}.type`,`invalid action type ${String(w)}`),Ie(u.content)||o("content",`${h}.content`,"content must be a plain-text string"),w==="dialogue"||w==="inner_thought"){let y=u.speaker;if(!yt(y))o("speaker",`${h}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in y)(!Ie(y.kind)||!Vn.includes(y.kind))&&o("speaker_kind",`${h}.speaker.kind`,"invalid non-actor speaker kind");else if(Ie(y.actor_id)){if(d(y.actor_id,y.state_id,"actor",`${h}.speaker`),!m.has(y.actor_id)){let _=r.get(y.actor_id),x=Ie(y.state_id)&&_?.has(y.state_id)?y.state_id:_?.has("default")?"default":_?.values().next().value,E=g&&x?`scriptctl scene-ref ${g} actor:${y.actor_id} --state ${x} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${h}.speaker.actor_id`,`actor ${y.actor_id} is not referenced by this scene`,E)}}else o("speaker",`${h}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return Dn(f)?f.forEach((u,h)=>{let m=`$.episodes[${h}]`;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 y=`${m}.scenes[${w}]`;if(!yt(g)){o("scene",y,"scene must be an object");return}"context"in g&&o("legacy_field",`${y}.context`,"v3 forbids scene.context"),Ie(g.scene_id)||o("scene_id",y,"scene_id required");let _=g.environment;_===void 0||yt(_)&&(!Ie(_.time)||_.time.trim()==="")?i("scene_time_missing",`${y}.environment.time`,"scene time is required for production review"):!yt(_)||_.space!==void 0&&!Ie(_.space)||!Ie(_.time)?o("environment",`${y}.environment`,"environment must contain optional string space and a time string"):Ar(_.time)||o("scene_time",`${y}.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",`${y}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${y}.location`,"scene location is required for production review");let x=g.location;if(x!==null&&(!yt(x)||!Ie(x.location_id)?o("location",`${y}.location`,"location must be null or {location_id}"):d(x.location_id,x.state_id,"location",`${y}.location`)),p(g.actors,"actor","actor_id",`${y}.actors`),p(g.props,"prop","prop_id",`${y}.props`),Dn(g.props)){let A=new Set;g.props.forEach((k,U)=>{!yt(k)||!Ie(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${y}.props[${U}]`,`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",`${y}.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,U)=>l(k,`${y}.actions[${U}]`,E,A)),Ps(g.actions,`${y}.actions`,o)}})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}var nt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),de=e=>typeof e=="string",wn=e=>Array.isArray(e);function Cc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Cc):nt(e)&&Object.values(e).every(Cc)}function Vi(e,t,n){e!==void 0&&(!nt(e)||!Object.values(e).every(Cc))&&n("extend",t,"extend must be an object containing JSON values")}function Zw(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Ue(e){let t=[],n=[],o=(u,h,m,g)=>t.push({code:u,path:h,message:m,...g?{repair_hint:g}:{}}),i=(u,h,m,g)=>n.push({code:u,path:h,message:m,...g?{repair_hint:g}:{}});if(!nt(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&&(!wn(e.main_characters)||!e.main_characters.every(u=>nt(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,h,m,g,w)=>{if(!wn(u)){o("field",w,`${w} must be an array`);return}let y=new Set;u.forEach((_,x)=>{let E=`${w}[${x}]`;if(!nt(_)){o("asset",E,"asset must be an object");return}let A=_[m];if(!V(h,A)){o("asset_id",`${E}.${m}`,`${m} must be ${h} ID`);return}if(y.has(A)&&o("dup_id",`${E}.${m}`,`duplicate ${m} ${A}`),y.add(A),r.set(A,h),!de(_[g])||_[g].trim()==="")o("asset_name",`${E}.${g}`,`${g} must be a non-empty string`);else if(h==="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("|")}`),h==="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&&(!wn(_.aliases)||!_.aliases.every(de)))o("aliases",`${E}.aliases`,"aliases must be an array of strings");else if(wn(_.aliases)&&_.aliases.every(de)){let I=new Set,R=de(_[g])?_[g]:"";_.aliases.forEach((C,L)=>{C===""&&o("alias_empty",`${E}.aliases[${L}]`,"alias must not be empty"),C===R&&o("alias_equals_name",`${E}.aliases[${L}]`,"alias must differ from the asset name"),I.has(C)&&o("dup_alias",`${E}.aliases[${L}]`,`duplicate alias ${C}`),I.add(C)})}Vi(_.extend,`${E}.extend`,o);let k=new Set,U=new Set,v=0;!wn(_.states)||_.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):_.states.forEach((I,R)=>{let C=`${E}.states[${R}]`;if(!nt(I)){o("state",C,"state must be an object");return}let L=I.state_id;if(L!=="default"&&!V("state",L)){o("state_id",`${C}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(L)&&o("dup_state",`${C}.state_id`,`duplicate state_id ${L}`),k.add(L),L==="default"&&v++,!de(I.state_name)||I.state_name.trim()===""?o("state_name",`${C}.state_name`,"state_name must be a non-empty string"):(U.has(I.state_name)&&o("dup_state_name",`${C}.state_name`,`duplicate state_name ${I.state_name}`),U.add(I.state_name)),de(I.description)||o("state_description",`${C}.description`,"description must be a string"),Vi(I.extend,`${C}.extend`,o)}),v!==1&&o("default_state",`${E}.states`,`exactly one default state required, found ${v}`),s.set(A,k)})};a(e.actors,"actor","actor_id","actor_name","$.actors"),a(e.locations,"location","location_id","location_name","$.locations"),a(e.props,"prop","prop_id","prop_name","$.props");let d=(u,h,m)=>{if(!wn(h)||h.length===0||!h.every(de))return o("state_ids",m,"state_ids must be a non-empty array of strings"),[];let g=h,w=new Set;return g.forEach((y,_)=>{w.has(y)&&o("dup_state_ref",`${m}[${_}]`,`duplicate state_id ${y}`),w.add(y),s.get(u)?.has(y)||o("state_ref",`${m}[${_}]`,`state ${y} not found on ${u}`)}),Zw(g)||o("state_ids_order",m,"state_ids must be sorted lexically"),g},p=new Set,l=new Set,f=new Set;return wn(e.episodes)?e.episodes.forEach((u,h)=>{let m=`$.episodes[${h}]`;if(!nt(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),!wn(u.scenes)){o("scenes",`${m}.scenes`,"scenes must be an array");return}u.scenes.forEach((g,w)=>{let y=`${m}.scenes[${w}]`;if(!nt(g)){o("scene",y,"scene must be an object");return}V("scene",g.scene_id)?(l.has(g.scene_id)&&o("dup_scene_id",`${y}.scene_id`,`duplicate scene_id ${g.scene_id}`),l.add(g.scene_id)):o("scene_id",`${y}.scene_id`,"scene_id must be scn plus six Base58 characters"),Vi(g.extend,`${y}.extend`,o),g.environment===void 0||nt(g.environment)&&(!de(g.environment.time)||g.environment.time.trim()==="")?i("scene_time_missing",`${y}.environment.time`,"scene time is required for production review"):!nt(g.environment)||g.environment.space!==void 0&&!de(g.environment.space)||!de(g.environment.time)?o("environment",`${y}.environment`,"environment must contain optional string space and a time string"):Ar(g.environment.time)||o("scene_time",`${y}.environment.time`,"scene time must be day|night|dawn|dusk"),(g.environment===void 0||nt(g.environment)&&(!de(g.environment.space)||g.environment.space.trim()===""))&&i("scene_space_missing",`${y}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${y}.location`,"scene location is required for production review"),g.location!==null&&(!nt(g.location)||!V("location",g.location.location_id)?o("location",`${y}.location`,"location must be null or a typed v4 location reference"):("state_id"in g.location&&o("v3_field",`${y}.location.state_id`,"Script v4 scene references use state_ids"),r.get(g.location.location_id)!=="location"&&o("location_ref",`${y}.location.location_id`,`location ${g.location.location_id} not found`),d(g.location.location_id,g.location.state_ids,`${y}.location.state_ids`)));let _=new Map,x=(E,A,k,U)=>{if(!wn(E)){o("field",U,`${U} must be an array`);return}let v=new Set;E.forEach((I,R)=>{let C=`${U}[${R}]`;if(!nt(I)||!V(A,I[k])){o("ref",C,`${k} must be a typed v4 ID`);return}let L=I[k];"state_id"in I&&o("v3_field",`${C}.state_id`,"Script v4 scene references use state_ids"),v.has(L)&&o("dup_asset_ref",`${C}.${k}`,`duplicate ${A} ref ${L}`),v.add(L),r.get(L)!==A&&o("asset_ref",`${C}.${k}`,`${A} ${L} not found`);let M=d(L,I.state_ids,`${C}.state_ids`);A==="actor"&&_.set(L,new Set(M))})};if(x(g.actors,"actor","actor_id",`${y}.actors`),x(g.props,"prop","prop_id",`${y}.props`),!wn(g.actions)){o("actions",`${y}.actions`,"actions must be an array");return}g.actions.forEach((E,A)=>{let k=`${y}.actions[${A}]`;if(!nt(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"),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"),!nt(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 v=E.speaker.actor_id;(!V("actor",v)||r.get(v)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${v} not found`);let I=_.get(v),R=s.get(v),C=de(E.speaker.state_id)&&R?.has(E.speaker.state_id)?E.speaker.state_id:void 0,L=R?.has("default")?"default":R?.values().next().value,M=C?[C]:L?[L]:[],j=V("scene",g.scene_id)&&V("actor",v)&&M.length>0?`scriptctl scene-ref ${g.scene_id} ${v} ${M.map(Z=>`--state ${Z}`).join(" ")} -p "$SCRIPT"`:void 0;if(I||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${v} is not referenced by this scene`,j),E.speaker.state_id!==void 0&&(!de(E.speaker.state_id)||!I?.has(E.speaker.state_id))){let Z=C?[...new Set([...I??[],C])].sort():[],Be=V("scene",g.scene_id)&&V("actor",v)&&Z.length>0?`scriptctl scene-ref ${g.scene_id} ${v} ${Z.map(ie=>`--state ${ie}`).join(" ")} -p "$SCRIPT"`:j;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(E.speaker.state_id)} is not in this scene's actor state_ids`,Be)}}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 v=E.transition_prompt;!nt(v)||!de(v.target)||!de(v.process)||v.process===""||!de(v.contrast)||v.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(v.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${v.target} not found`)}}),Ps(g.actions,`${y}.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!==Pc?o:new S(`Could not generate an unused ${e} ID.`,{exitCode:b,errorCode:"ID_SPACE_RETRY_EXHAUSTED",hint:"Retry the command. If this persists, inspect the configured ID generator."})}}function 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 Ww(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&Ae(`${t} must be a positive integer.`,[e]),n}function Xw(e){return e===void 0?{}:(Gn(e)||Ae("Action extensions must be an object."),structuredClone(e))}function e_(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 t_(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 n_(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function o_(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function i_(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(t_(n.extend?.timestamp)??t)+o_(n);return t}function vu(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(Gn))&&Ae("Asset variants must be an array of readable objects."),e)}function r_(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 s_(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function a_(e,t){return e[t]}function c_(e,t){return[s_(e,t),...t.aliases??[]].map(lt)}function Ou(e,t,n){let o=lt(n);return r_(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 d_(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 p_(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:d_(n,d),description:q(d?.description,q(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let h=q(u.name);if(u===d||!h||["default","\u9ED8\u8BA4"].includes(lt(h)))continue;let m=go("state",`${n}:${c}:${h}`,i);p.push({state_id:m,state_name:h,description:q(Mu(s,c,h).description)}),r.states.push(`${c}/${h}`)}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 a_(e,n).find(d=>c_(n,d).includes(c))??p_(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(Gn))&&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 l_(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 u_(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 h=q(l.content);h||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=Xw(l.extensions);g.timestamp=n_(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}:${h}`,s),type:u,content:h,extend:g};if(d+=m,u==="action"||u==="transition")return w;let y=q(l.speaker);y||Ae(`Action ${f+1} requires a speaker.`);let _=y.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${_}\\s*[:\uFF1A]`,"iu").test(h)&&Ae(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(h)&&Ae(`Action ${f+1} wraps dialogue content in quotation marks.`);let x=lt(y);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",y,s,c),A=q(l.speakerVariant),k=a.find(v=>v.actor_id===E.actor_id),U;if(A)U=br(E,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,U])].sort():a.push({actor_id:E.actor_id,state_ids:[U]});else if(!k){let v=br(E,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:E.actor_id,state_ids:[v]})}return{...w,speaker:{actor_id:E.actor_id,...U?{state_id:U}:{}},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}}}),actorRefs:a}}function Lu(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=e_(r),c={actors:[],locations:[],props:[],states:[]},a=Ww(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 R=Ts(r,n,"actors",I.name,s,c);return{actor_id:R.actor_id,state_ids:[br(R,I.variant,n,"actors",s,c)]}}),u=Cs([],f,I=>I.actor_id),h=ku(i.props,"scene.props").map(I=>{let R=Ts(r,n,"props",I.name,s,c);return{prop_id:R.prop_id,state_ids:[br(R,I.variant,n,"props",s,c)]}}),m=Cs([],h,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`)}},y=q(i.boundary,"auto");["auto","new","continue"].includes(y)||Ae("scene.boundary must be auto, new, or continue.");let _=l_(g,w);y==="continue"&&!_&&Ae("scene.boundary=continue requires the same location, space, and time as the previous scene.");let x=y!=="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),U=u_(i.actions,r,n,k,E.scene_id,i_(d),s,c);E.actors=U.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(...U.actions),x||d.scenes.push(E);let v=Ue(r);return v.ok||Ae("Composed screenplay does not pass Script v4 validation.",v.errors.slice(0,12).map(I=>`${I.path}: ${I.message}`)),{script:r,validation:v,episodeNumber:a,sceneNumber:A,sceneId:E.scene_id,actionIds:U.actions.map(I=>I.action_id),joinedPreviousScene:x,created:c}}function Qe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _n(e,t){return e[t]===void 0||typeof e[t]=="string"}function Tc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Tc):Qe(e)&&Object.values(e).every(Tc)}function $i(e){return e.extend===void 0||Qe(e.extend)&&Object.values(e.extend).every(Tc)}function Vc(e){return e==="default"||V("state",e)}function f_(e){return Qe(e)&&Vc(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&$i(e)}function $c(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(f_)&&$i(e)}function m_(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))&&$c(e)}function g_(e){return Qe(e)&&V("location",e.location_id)&&typeof e.location_name=="string"&&$c(e)}function h_(e){return Qe(e)&&V("prop",e.prop_id)&&typeof e.prop_name=="string"&&$c(e)}function Dc(e){return Array.isArray(e)&&e.every(Vc)}function y_(e){return Qe(e)&&V("actor",e.actor_id)&&Dc(e.state_ids)}function w_(e){return Qe(e)&&V("location",e.location_id)&&Dc(e.state_ids)}function __(e){return Qe(e)&&V("prop",e.prop_id)&&Dc(e.state_ids)}function E_(e){return V("actor",e.actor_id)&&(e.state_id===void 0||Vc(e.state_id))}function x_(e){return typeof e.kind=="string"&&Yo.has(e.kind)&&_n(e,"label")}function S_(e){return!(!Qe(e)||!V("action",e.action_id)||typeof e.type!="string"||!qt.has(e.type)||typeof e.content!="string"||!_n(e,"parenthetical")||!$i(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!Qe(e.speaker)||!E_(e.speaker)&&!x_(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 I_(e){return!(!Qe(e)||!V("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(y_)||!Array.isArray(e.props)||!e.props.every(__)||!Array.isArray(e.actions)||!e.actions.every(S_)||!$i(e)||e.location!==null&&!w_(e.location)||e.environment!==void 0&&(!Qe(e.environment)||!_n(e.environment,"space")||!_n(e.environment,"time")))}function A_(e){return Qe(e)&&V("episode",e.episode_id)&&_n(e,"title")&&_n(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(I_)&&$i(e)}function k_(e){return Qe(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&_n(e,"worldview_raw")&&_n(e,"synopsis")&&_n(e,"logline")&&_n(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(m_)&&Array.isArray(e.locations)&&e.locations.every(g_)&&Array.isArray(e.props)&&e.props.every(h_)&&Array.isArray(e.episodes)&&e.episodes.every(A_)&&$i(e)}function Di(e){let t=Ue(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 En(e){if(k_(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 Ve from"node:fs";import*as Ct from"node:path";import b_ from"proper-lockfile";function Bc(e){if(Array.isArray(e))return e.map(Bc);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=Bc(t[o]);return n}return e}function Je(e){let t=JSON.stringify(Bc(e));return`sha256:${vr.createHash("sha256").update(t).digest("hex")}`}function Or(e){return Ve.existsSync(e)?`sha256:${vr.createHash("sha256").update(Ve.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);Ve.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await b_.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
|
|
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
|
|
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 Ww(e){return new Cs(e)}function Su(e){return Ww(e).directDir}function me(e){let t=e.script_path??e.scriptPath;return Ir.resolve(typeof t=="string"&&t.length>0?t:Zw)}function Ar(e){return Ts.readJson(e)}function Lc(e,t){Ts.writeJson(e,t)}function Fo(e){return Ts.exists(e)}function _e(e){return Mc.createHash("sha256").update(e,"utf-8").digest("hex")}function Nc(e){let t=Mc.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 Iu(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 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 Au(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 yn(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 Du from"node:crypto";import*as Gu from"node:fs";import*as Bu from"node:path";import*as Nu from"node:crypto";var Tn=["action","dialogue","inner_thought","transition"],qt=new Set(Tn),Vn=["system","broadcast","offscreen","group"],Yo=new Set(Vn),$n=["featured","background"],Pt=new Set($n),Pi=["\u4E3B\u89D2","\u914D\u89D2"],fo=new Set(Pi),Vs=["day","night","dawn","dusk"],Uc=new Set(Vs);function br(e){return typeof e=="string"&&Uc.has(e)}var Pc=["interior","exterior"],ku=new Set(Pc);function lt(e){return e.normalize("NFKC").toLowerCase()}function bu(e){return JSON.stringify([e.code,e.path,e.message])}function Cc(e){let t=new Map;for(let n of e){let o=bu(n);t.set(o,(t.get(o)??0)+1)}return t}function Tc(e,t){if(e.ok||t.errors.length>=e.errors.length)return!1;let n=Cc(e.errors),o=Cc(t.errors);for(let[i,r]of o)if(r>(n.get(i)??0))return!1;return!0}function Vc(e,t){let n=Cc(e),o=[];for(let i of t){let r=bu(i),s=n.get(r)??0;s>0?n.set(r,s-1):o.push(i)}return o}import{customAlphabet as Xw}from"nanoid";var Ci="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",$c=6,Ti={episode:"ep",scene:"scn",action:"ac",actor:"act",location:"loc",prop:"prp",state:"st"},e_=Xw(Ci,$c),t_=`[${Ci}]`,vu=Object.fromEntries(Object.entries(Ti).map(([e,t])=>[e,new RegExp(`^${t}${t_}{${$c}}$`)]));function V(e,t){return typeof t=="string"&&vu[e].test(t)}var Dc="ID_SPACE_EXHAUSTED";function vr(e,t=new Set,n=e_){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:Dc})}var tt=class extends Error{input;constructor(t,n){super(n),this.input=t,this.name="TimestampParseError"}},n_=/^(\d+):(\d{2})(?:\.(\d{1,3}))?$/,o_=/^(\d+):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/;function Ou(e){return e?Number(e.padEnd(3,"0")):0}function Ru(e,t){if(!Number.isSafeInteger(t))throw new tt(e,"Timestamp exceeds the supported numeric range.");return t}function Mu(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 tt(e,"Timestamp must not be empty.");let n=t.match(o_);if(n){let a=Number(n[1]),d=Number(n[2]),p=Number(n[3]),l=n[4];if(d>59)throw new tt(e,"Hour-form timestamps require minutes between 00 and 59.");if(p>59)throw new tt(e,"Timestamp seconds must be between 00 and 59.");let f=Ru(e,((a*60+d)*60+p)*1e3+Ou(l));return{canonical:Mu(f,l),milliseconds:f,fractionDigits:l?.length??0}}let o=t.match(n_);if(!o)throw new tt(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 tt(e,"Timestamp seconds must be between 00 and 59.");let c=Ru(e,(i*60+r)*1e3+Ou(s));return{canonical:Mu(c,s),milliseconds:c,fractionDigits:s?.length??0}}function i_(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 r_(e,t){let n=e.milliseconds-t.milliseconds;return e.fractionDigits===0||t.fractionDigits===0?n>=1e3:n>0}function $s(e,t,n){let o=null;e.forEach((i,r)=>{let s=i_(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 tt))throw d;n("timestamp_invalid",c,d.message);return}o!==null&&r_(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",s_=["state_changes","actor_id","speakers","lines"];function wt(e){let t=[],n=[],o=(u,h,m,g)=>t.push({code:u,path:h,message:m,...g?{repair_hint:g}:{}}),i=(u,h,m)=>n.push({code:u,path:h,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,h,m,g,w)=>{if(!Dn(u)){o("field",w,`${w} must be an array`);return}u.forEach((y,_)=>{let x=`${w}[${_}]`;if(!yt(y)){o("asset",x,"asset must be an object");return}let E=y[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,h),!Ie(y[g]))o("asset_name",`${x}.${g}`,`${g} required`);else if(h==="actor"){let v=lt(y[g]),I=c.get(v);I!==void 0?o("dup_actor_name",`${x}.${g}`,`actor name ${y[g]} already belongs to ${I}`):c.set(v,E)}(!Ie(y.importance)||!$n.includes(y.importance))&&o("importance",`${x}.importance`,`importance must be one of ${$n.join("|")}`),Ie(y.description)||o("asset_desc",`${x}.description`,"description must be a string");let A=new Set,k=new Set,U=0;!Dn(y.states)||y.states.length===0?o("states",`${x}.states`,"states must be a non-empty array"):y.states.forEach((v,I)=>{let R=`${x}.states[${I}]`;if(!yt(v)||!Ie(v.state_id)){o("state_id",R,"state_id required");return}A.has(v.state_id)&&o("dup_state",R,`duplicate state_id ${v.state_id}`),A.add(v.state_id),v.state_id==="default"&&U++,Ie(v.state_name)?(k.has(v.state_name)&&o("dup_state_name",`${R}.state_name`,`duplicate state_name ${v.state_name}`),k.add(v.state_name)):o("state_name",`${R}.state_name`,"state_name required")}),Dn(y.states)&&U!==1&&o("default_state",`${x}.states`,`exactly one 'default' state required, found ${U}`),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,h,m,g)=>{if(s.get(u)!==m){o("ref",g,`${m} ${u} not found`);return}h!==void 0&&(!Ie(h)||!r.get(u)?.has(h))&&o("state_ref",g,`state ${String(h)} not materialized on ${u}`)},p=(u,h,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,y)=>{if(!yt(w)||!Ie(w[m])){o("ref",`${g}[${y}]`,`${m} required`);return}d(w[m],w.state_id,h,`${g}[${y}]`)})},l=(u,h,m,g)=>{if(!yt(u)){o("action",h,"action must be an object");return}for(let y of s_)y in u&&o("legacy_field",`${h}.${y}`,`v3 forbids action.${y}`);let w=u.type;if((!Ie(w)||!Tn.includes(w))&&o("action_type",`${h}.type`,`invalid action type ${String(w)}`),Ie(u.content)||o("content",`${h}.content`,"content must be a plain-text string"),w==="dialogue"||w==="inner_thought"){let y=u.speaker;if(!yt(y))o("speaker",`${h}.speaker`,"dialogue/inner_thought needs a speaker");else if("kind"in y)(!Ie(y.kind)||!Vn.includes(y.kind))&&o("speaker_kind",`${h}.speaker.kind`,"invalid non-actor speaker kind");else if(Ie(y.actor_id)){if(d(y.actor_id,y.state_id,"actor",`${h}.speaker`),!m.has(y.actor_id)){let _=r.get(y.actor_id),x=Ie(y.state_id)&&_?.has(y.state_id)?y.state_id:_?.has("default")?"default":_?.values().next().value,E=g&&x?`scriptctl scene-ref ${g} actor:${y.actor_id} --state ${x} -p "$SCRIPT"`:void 0;o("actor_not_in_scene",`${h}.speaker.actor_id`,`actor ${y.actor_id} is not referenced by this scene`,E)}}else o("speaker",`${h}.speaker`,"speaker needs actor_id or kind")}},f=e.episodes;return Dn(f)?f.forEach((u,h)=>{let m=`$.episodes[${h}]`;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 y=`${m}.scenes[${w}]`;if(!yt(g)){o("scene",y,"scene must be an object");return}"context"in g&&o("legacy_field",`${y}.context`,"v3 forbids scene.context"),Ie(g.scene_id)||o("scene_id",y,"scene_id required");let _=g.environment;_===void 0||yt(_)&&(!Ie(_.time)||_.time.trim()==="")?i("scene_time_missing",`${y}.environment.time`,"scene time is required for production review"):!yt(_)||_.space!==void 0&&!Ie(_.space)||!Ie(_.time)?o("environment",`${y}.environment`,"environment must contain optional string space and a time string"):br(_.time)||o("scene_time",`${y}.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",`${y}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${y}.location`,"scene location is required for production review");let x=g.location;if(x!==null&&(!yt(x)||!Ie(x.location_id)?o("location",`${y}.location`,"location must be null or {location_id}"):d(x.location_id,x.state_id,"location",`${y}.location`)),p(g.actors,"actor","actor_id",`${y}.actors`),p(g.props,"prop","prop_id",`${y}.props`),Dn(g.props)){let A=new Set;g.props.forEach((k,U)=>{!yt(k)||!Ie(k.prop_id)||(A.has(k.prop_id)&&o("dup_prop_ref",`${y}.props[${U}]`,`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",`${y}.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,U)=>l(k,`${y}.actions[${U}]`,E,A)),$s(g.actions,`${y}.actions`,o)}})}):o("episodes","$.episodes","episodes must be an array"),{ok:t.length===0,errors:t,warnings:n}}var nt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),de=e=>typeof e=="string",wn=e=>Array.isArray(e);function Gc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Gc):nt(e)&&Object.values(e).every(Gc)}function Vi(e,t,n){e!==void 0&&(!nt(e)||!Object.values(e).every(Gc))&&n("extend",t,"extend must be an object containing JSON values")}function a_(e){for(let t=1;t<e.length;t++)if(e[t-1]>e[t])return!1;return!0}function Ue(e){let t=[],n=[],o=(u,h,m,g)=>t.push({code:u,path:h,message:m,...g?{repair_hint:g}:{}}),i=(u,h,m,g)=>n.push({code:u,path:h,message:m,...g?{repair_hint:g}:{}});if(!nt(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&&(!wn(e.main_characters)||!e.main_characters.every(u=>nt(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,h,m,g,w)=>{if(!wn(u)){o("field",w,`${w} must be an array`);return}let y=new Set;u.forEach((_,x)=>{let E=`${w}[${x}]`;if(!nt(_)){o("asset",E,"asset must be an object");return}let A=_[m];if(!V(h,A)){o("asset_id",`${E}.${m}`,`${m} must be ${h} ID`);return}if(y.has(A)&&o("dup_id",`${E}.${m}`,`duplicate ${m} ${A}`),y.add(A),r.set(A,h),!de(_[g])||_[g].trim()==="")o("asset_name",`${E}.${g}`,`${g} must be a non-empty string`);else if(h==="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("|")}`),h==="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&&(!wn(_.aliases)||!_.aliases.every(de)))o("aliases",`${E}.aliases`,"aliases must be an array of strings");else if(wn(_.aliases)&&_.aliases.every(de)){let I=new Set,R=de(_[g])?_[g]:"";_.aliases.forEach((C,L)=>{C===""&&o("alias_empty",`${E}.aliases[${L}]`,"alias must not be empty"),C===R&&o("alias_equals_name",`${E}.aliases[${L}]`,"alias must differ from the asset name"),I.has(C)&&o("dup_alias",`${E}.aliases[${L}]`,`duplicate alias ${C}`),I.add(C)})}Vi(_.extend,`${E}.extend`,o);let k=new Set,U=new Set,v=0;!wn(_.states)||_.states.length===0?o("states",`${E}.states`,"states must be a non-empty array"):_.states.forEach((I,R)=>{let C=`${E}.states[${R}]`;if(!nt(I)){o("state",C,"state must be an object");return}let L=I.state_id;if(L!=="default"&&!V("state",L)){o("state_id",`${C}.state_id`,"state_id must be default or st plus six Base58 characters");return}k.has(L)&&o("dup_state",`${C}.state_id`,`duplicate state_id ${L}`),k.add(L),L==="default"&&v++,!de(I.state_name)||I.state_name.trim()===""?o("state_name",`${C}.state_name`,"state_name must be a non-empty string"):(U.has(I.state_name)&&o("dup_state_name",`${C}.state_name`,`duplicate state_name ${I.state_name}`),U.add(I.state_name)),de(I.description)||o("state_description",`${C}.description`,"description must be a string"),Vi(I.extend,`${C}.extend`,o)}),v!==1&&o("default_state",`${E}.states`,`exactly one default state required, found ${v}`),s.set(A,k)})};a(e.actors,"actor","actor_id","actor_name","$.actors"),a(e.locations,"location","location_id","location_name","$.locations"),a(e.props,"prop","prop_id","prop_name","$.props");let d=(u,h,m)=>{if(!wn(h)||h.length===0||!h.every(de))return o("state_ids",m,"state_ids must be a non-empty array of strings"),[];let g=h,w=new Set;return g.forEach((y,_)=>{w.has(y)&&o("dup_state_ref",`${m}[${_}]`,`duplicate state_id ${y}`),w.add(y),s.get(u)?.has(y)||o("state_ref",`${m}[${_}]`,`state ${y} not found on ${u}`)}),a_(g)||o("state_ids_order",m,"state_ids must be sorted lexically"),g},p=new Set,l=new Set,f=new Set;return wn(e.episodes)?e.episodes.forEach((u,h)=>{let m=`$.episodes[${h}]`;if(!nt(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),!wn(u.scenes)){o("scenes",`${m}.scenes`,"scenes must be an array");return}u.scenes.forEach((g,w)=>{let y=`${m}.scenes[${w}]`;if(!nt(g)){o("scene",y,"scene must be an object");return}V("scene",g.scene_id)?(l.has(g.scene_id)&&o("dup_scene_id",`${y}.scene_id`,`duplicate scene_id ${g.scene_id}`),l.add(g.scene_id)):o("scene_id",`${y}.scene_id`,"scene_id must be scn plus six Base58 characters"),Vi(g.extend,`${y}.extend`,o),g.environment===void 0||nt(g.environment)&&(!de(g.environment.time)||g.environment.time.trim()==="")?i("scene_time_missing",`${y}.environment.time`,"scene time is required for production review"):!nt(g.environment)||g.environment.space!==void 0&&!de(g.environment.space)||!de(g.environment.time)?o("environment",`${y}.environment`,"environment must contain optional string space and a time string"):br(g.environment.time)||o("scene_time",`${y}.environment.time`,"scene time must be day|night|dawn|dusk"),(g.environment===void 0||nt(g.environment)&&(!de(g.environment.space)||g.environment.space.trim()===""))&&i("scene_space_missing",`${y}.environment.space`,"scene interior/exterior is required for production review"),g.location===null&&i("scene_location_missing",`${y}.location`,"scene location is required for production review"),g.location!==null&&(!nt(g.location)||!V("location",g.location.location_id)?o("location",`${y}.location`,"location must be null or a typed v4 location reference"):("state_id"in g.location&&o("v3_field",`${y}.location.state_id`,"Script v4 scene references use state_ids"),r.get(g.location.location_id)!=="location"&&o("location_ref",`${y}.location.location_id`,`location ${g.location.location_id} not found`),d(g.location.location_id,g.location.state_ids,`${y}.location.state_ids`)));let _=new Map,x=(E,A,k,U)=>{if(!wn(E)){o("field",U,`${U} must be an array`);return}let v=new Set;E.forEach((I,R)=>{let C=`${U}[${R}]`;if(!nt(I)||!V(A,I[k])){o("ref",C,`${k} must be a typed v4 ID`);return}let L=I[k];"state_id"in I&&o("v3_field",`${C}.state_id`,"Script v4 scene references use state_ids"),v.has(L)&&o("dup_asset_ref",`${C}.${k}`,`duplicate ${A} ref ${L}`),v.add(L),r.get(L)!==A&&o("asset_ref",`${C}.${k}`,`${A} ${L} not found`);let M=d(L,I.state_ids,`${C}.state_ids`);A==="actor"&&_.set(L,new Set(M))})};if(x(g.actors,"actor","actor_id",`${y}.actors`),x(g.props,"prop","prop_id",`${y}.props`),!wn(g.actions)){o("actions",`${y}.actions`,"actions must be an array");return}g.actions.forEach((E,A)=>{let k=`${y}.actions[${A}]`;if(!nt(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"),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"),!nt(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 v=E.speaker.actor_id;(!V("actor",v)||r.get(v)!=="actor")&&o("speaker_actor",`${k}.speaker.actor_id`,`actor ${v} not found`);let I=_.get(v),R=s.get(v),C=de(E.speaker.state_id)&&R?.has(E.speaker.state_id)?E.speaker.state_id:void 0,L=R?.has("default")?"default":R?.values().next().value,M=C?[C]:L?[L]:[],j=V("scene",g.scene_id)&&V("actor",v)&&M.length>0?`scriptctl scene-ref ${g.scene_id} ${v} ${M.map(Z=>`--state ${Z}`).join(" ")} -p "$SCRIPT"`:void 0;if(I||o("actor_not_in_scene",`${k}.speaker.actor_id`,`actor ${v} is not referenced by this scene`,j),E.speaker.state_id!==void 0&&(!de(E.speaker.state_id)||!I?.has(E.speaker.state_id))){let Z=C?[...new Set([...I??[],C])].sort():[],Be=V("scene",g.scene_id)&&V("actor",v)&&Z.length>0?`scriptctl scene-ref ${g.scene_id} ${v} ${Z.map(ie=>`--state ${ie}`).join(" ")} -p "$SCRIPT"`:j;o("speaker_state",`${k}.speaker.state_id`,`speaker state ${String(E.speaker.state_id)} is not in this scene's actor state_ids`,Be)}}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 v=E.transition_prompt;!nt(v)||!de(v.target)||!de(v.process)||v.process===""||!de(v.contrast)||v.contrast===""?o("transition_prompt",`${k}.transition_prompt`,"transition_prompt requires non-empty target/process/contrast"):r.has(v.target)||o("transition_target",`${k}.transition_prompt.target`,`asset ${v.target} not found`)}}),$s(g.actions,`${y}.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?vr(e,t,n):vr(e,t)}catch(o){throw o?.code!==Dc?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 c_(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<1)&&Ae(`${t} must be a positive integer.`,[e]),n}function d_(e){return e===void 0?{}:(Gn(e)||Ae("Action extensions must be an object."),structuredClone(e))}function p_(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=Nu.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 l_(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 u_(e){return`${Math.floor(e/6e4)}:${String(Math.floor(e%6e4/1e3)).padStart(2,"0")}.${String(e%1e3).padStart(3,"0")}`}function f_(e){let t=Number(e.extend?.duration_ms??e.extend?.rewrite_duration_ms);return Number.isFinite(t)&&t>0?Math.round(t):1200}function m_(e){let t=0;for(let n of e.scenes.flatMap(o=>o.actions))t=(l_(n.extend?.timestamp)??t)+f_(n);return t}function Uu(e){return e===void 0?[]:((!Array.isArray(e)||!e.every(Gn))&&Ae("Asset variants must be an array of readable objects."),e)}function g_(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 h_(e,t){return e==="actors"?t.actor_name:e==="locations"?t.location_name:t.prop_name}function y_(e,t){return e[t]}function w_(e,t){return[h_(e,t),...t.aliases??[]].map(lt)}function Pu(e,t,n){let o=lt(n);return g_(e,t).find(i=>[i.name,...Array.isArray(i.aliases)?i.aliases:[]].map(r=>lt(q(r))).includes(o))??null}function Cu(e,t){if(!e)return null;let n=lt(t);return Uu(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 Tu(e,t,n){let o=Cu(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 __(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 E_(e,t,n,o,i,r){let s=Pu(t,n,o);s||Ae(`${o} is not an existing ${n} asset and has no readable declaration.`);let c=q(s.name,o),a=Uu(s.variants),d=Cu(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:__(n,d),description:q(d?.description,q(s.description,`${c}\u7684\u57FA\u7840\u53C2\u8003\u5916\u89C2\u3002`))}];for(let u of a){let h=q(u.name);if(u===d||!h||["default","\u9ED8\u8BA4"].includes(lt(h)))continue;let m=go("state",`${n}:${c}:${h}`,i);p.push({state_id:m,state_name:h,description:q(Tu(s,c,h).description)}),r.states.push(`${c}/${h}`)}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 Gs(e,t,n,o,i,r){let s=q(o);s||Ae(`${n} reference requires a readable name.`);let c=lt(s);return y_(e,n).find(d=>w_(n,d).includes(c))??E_(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=Pu(n,o,d),l=Tu(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 Lu(e,t){return e===void 0?[]:((!Array.isArray(e)||!e.every(Gn))&&Ae(`${t} must be an array of readable references.`),e)}function Ds(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 x_(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 S_(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 h=q(l.content);h||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=d_(l.extensions);g.timestamp=u_(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}:${h}`,s),type:u,content:h,extend:g};if(d+=m,u==="action"||u==="transition")return w;let y=q(l.speaker);y||Ae(`Action ${f+1} requires a speaker.`);let _=y.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");new RegExp(`^${_}\\s*[:\uFF1A]`,"iu").test(h)&&Ae(`Action ${f+1} repeats the speaker name in dialogue content.`),/^(?:“[^”]+”|「[^」]+」|『[^』]+』|"[^"]+")$/u.test(h)&&Ae(`Action ${f+1} wraps dialogue content in quotation marks.`);let x=lt(y);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=Gs(t,n,"actors",y,s,c),A=q(l.speakerVariant),k=a.find(v=>v.actor_id===E.actor_id),U;if(A)U=Or(E,A,n,"actors",s,c),k?k.state_ids=[...new Set([...k.state_ids,U])].sort():a.push({actor_id:E.actor_id,state_ids:[U]});else if(!k){let v=Or(E,"\u9ED8\u8BA4",n,"actors",s,c);a.push({actor_id:E.actor_id,state_ids:[v]})}return{...w,speaker:{actor_id:E.actor_id,...U?{state_id:U}:{}},...q(l.parenthetical)?{parenthetical:q(l.parenthetical)}:{}}}),actorRefs:a}}function Vu(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=p_(r),c={actors:[],locations:[],props:[],states:[]},a=c_(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=Gs(r,n,"locations",i.location,s,c),l=Or(p,i.locationVariant,n,"locations",s,c),f=Lu(i.actors,"scene.actors").map(I=>{let R=Gs(r,n,"actors",I.name,s,c);return{actor_id:R.actor_id,state_ids:[Or(R,I.variant,n,"actors",s,c)]}}),u=Ds([],f,I=>I.actor_id),h=Lu(i.props,"scene.props").map(I=>{let R=Gs(r,n,"props",I.name,s,c);return{prop_id:R.prop_id,state_ids:[Or(R,I.variant,n,"props",s,c)]}}),m=Ds([],h,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`)}},y=q(i.boundary,"auto");["auto","new","continue"].includes(y)||Ae("scene.boundary must be auto, new, or continue.");let _=x_(g,w);y==="continue"&&!_&&Ae("scene.boundary=continue requires the same location, space, and time as the previous scene.");let x=y!=="new"&&_,E=x&&g?g:w,A=x?d.scenes.length:d.scenes.length+1,k=Ds(E.actors,w.actors,I=>I.actor_id),U=S_(i.actions,r,n,k,E.scene_id,m_(d),s,c);E.actors=U.actorRefs,E.props=Ds(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(...U.actions),x||d.scenes.push(E);let v=Ue(r);return v.ok||Ae("Composed screenplay does not pass Script v4 validation.",v.errors.slice(0,12).map(I=>`${I.path}: ${I.message}`)),{script:r,validation:v,episodeNumber:a,sceneNumber:A,sceneId:E.scene_id,actionIds:U.actions.map(I=>I.action_id),joinedPreviousScene:x,created:c}}function Qe(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _n(e,t){return e[t]===void 0||typeof e[t]=="string"}function Bc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Bc):Qe(e)&&Object.values(e).every(Bc)}function $i(e){return e.extend===void 0||Qe(e.extend)&&Object.values(e.extend).every(Bc)}function Jc(e){return e==="default"||V("state",e)}function I_(e){return Qe(e)&&Jc(e.state_id)&&typeof e.state_name=="string"&&typeof e.description=="string"&&$i(e)}function Kc(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(I_)&&$i(e)}function A_(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))&&Kc(e)}function k_(e){return Qe(e)&&V("location",e.location_id)&&typeof e.location_name=="string"&&Kc(e)}function b_(e){return Qe(e)&&V("prop",e.prop_id)&&typeof e.prop_name=="string"&&Kc(e)}function jc(e){return Array.isArray(e)&&e.every(Jc)}function v_(e){return Qe(e)&&V("actor",e.actor_id)&&jc(e.state_ids)}function O_(e){return Qe(e)&&V("location",e.location_id)&&jc(e.state_ids)}function R_(e){return Qe(e)&&V("prop",e.prop_id)&&jc(e.state_ids)}function M_(e){return V("actor",e.actor_id)&&(e.state_id===void 0||Jc(e.state_id))}function L_(e){return typeof e.kind=="string"&&Yo.has(e.kind)&&_n(e,"label")}function N_(e){return!(!Qe(e)||!V("action",e.action_id)||typeof e.type!="string"||!qt.has(e.type)||typeof e.content!="string"||!_n(e,"parenthetical")||!$i(e)||(e.type==="dialogue"||e.type==="inner_thought")&&(!Qe(e.speaker)||!M_(e.speaker)&&!L_(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 U_(e){return!(!Qe(e)||!V("scene",e.scene_id)||!Array.isArray(e.actors)||!e.actors.every(v_)||!Array.isArray(e.props)||!e.props.every(R_)||!Array.isArray(e.actions)||!e.actions.every(N_)||!$i(e)||e.location!==null&&!O_(e.location)||e.environment!==void 0&&(!Qe(e.environment)||!_n(e.environment,"space")||!_n(e.environment,"time")))}function P_(e){return Qe(e)&&V("episode",e.episode_id)&&_n(e,"title")&&_n(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(U_)&&$i(e)}function C_(e){return Qe(e)&&e.version===4&&typeof e.title=="string"&&typeof e.worldview=="string"&&typeof e.style=="string"&&_n(e,"worldview_raw")&&_n(e,"synopsis")&&_n(e,"logline")&&_n(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(A_)&&Array.isArray(e.locations)&&e.locations.every(k_)&&Array.isArray(e.props)&&e.props.every(b_)&&Array.isArray(e.episodes)&&e.episodes.every(P_)&&$i(e)}function Di(e){let t=Ue(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 En(e){if(C_(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 Ve from"node:fs";import*as Ct from"node:path";import T_ from"proper-lockfile";function Hc(e){if(Array.isArray(e))return e.map(Hc);if(e!==null&&typeof e=="object"){let t=e,n={};for(let o of Object.keys(t).sort())n[o]=Hc(t[o]);return n}return e}function Je(e){let t=JSON.stringify(Hc(e));return`sha256:${Rr.createHash("sha256").update(t).digest("hex")}`}function Mr(e){return Ve.existsSync(e)?`sha256:${Rr.createHash("sha256").update(Ve.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 Bs(e,t){let n=Nr(e);Ve.mkdirSync(n.stateDir,{recursive:!0});let o=null;try{o=await T_.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){Js(e,`${JSON.stringify(t,null,2)}
|
|
123
|
+
`)}function Js(e,t){let n=Ct.dirname(e);Ve.mkdirSync(n,{recursive:!0});let o=Ct.join(n,`.${Ct.basename(e)}.${process.pid}.${Rr.randomUUID()}.tmp`),i=Ve.openSync(o,"wx");try{Ve.writeFileSync(i,t,"utf-8"),Ve.fsyncSync(i)}finally{Ve.closeSync(i)}Ve.renameSync(o,e)}function Ks(e){let t=Nr(e).metadataPath;if(!Ve.existsSync(t))return null;let n;try{n=JSON.parse(Ve.readFileSync(t,"utf-8"))}catch(i){throw zc(t,i instanceof Error?i.message:String(i))}if(n===null||typeof n!="object"||Array.isArray(n))throw zc(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 zc(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 zc(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(Ve.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 O(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 Qc(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 $u(e,t){let n=Bu.resolve(e),o;try{o=Gu.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 Ju(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"";(!n||n==="-")&&Qc("Creative draft input must be a named JSON file.",[n||"<missing>"]);let o=$u(n,"The creative draft"),i=me(e),r=$u(i,"The target Script v4 file"),s=En(r.value),c=Je(s),a=Vu(s,o.value),d=`sha256:${Du.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=O(e.plan).trim();if(f&&!u&&Qc("--apply requires the exact digest returned by the current plan.",["plan=<missing>"]),!f&&u&&Qc("--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 Wu from"node:fs";import*as Xu from"node:path";var Zt={line:1,column:1};function V_(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(Fc("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(Fc("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(Fc("prop",n.prop_id,i))}return t}function Fc(e,t,n){return{declarationKind:"state",ownerKind:e,ownerId:t,value:structuredClone(n),source:Zt}}function Ku(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:V_(e),targets:[t],targetKind:"script"}}function Gi(e,t){return{version:1,declarations:[],targets:t,targetKind:e}}function $_(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function D_(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function ue(e,t,n){let o=[e,...t].map($_).join("|"),i=D_(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 G_(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=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=[G_(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 Zc(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(...ju(o));return n.push("</body>","","</scene>"),n}function Yc(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(...Zc(n,`id=${n.scene_id}`)),o<e.scenes.length-1&&t.push("")}),t.push("</episode>"),t}function B_(e){if(e.declarationKind==="state")return J_(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 J_(e,t,n){return[...Jn(n.extend),ue("state",[`${e}:${t}`,n.state_id,n.state_name],n.description)]}function K_(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(...Yc(n)),o<e.episodes.length-1&&t.push("")}),t.push("</script>"),t}case"episode":return Yc(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(...Yc(n)),o<e.episodes.length-1&&t.push("")}),t.push("</episode-span>"),t}case"scene":return Zc(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(...Zc(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(...ju(n));return t.push("</body>","</action-span>"),t}}}function zu(e){let t=["<authoring version=1>",""];if(e.declarations.length>0){t.push("<create>");for(let n of e.declarations)t.push(...B_(n));t.push("</create>","")}return e.targets.forEach((n,o)=>{t.push(...K_(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 Qc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Qc):Ye(e)&&Object.values(e).every(Qc)}function ho(e){return e.extend===void 0||Ye(e.extend)&&Object.values(e.extend).every(Qc)}function Fc(e){return Ye(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&ho(e)}function P_(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(Fc)&&ho(e)}function C_(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(Fc)&&ho(e)}function T_(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(Fc)&&ho(e)}function V_(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 $_(e){return!Ye(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(V_)||!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 D_(e){return Ye(e)&&typeof e.episode_id=="string"&&_t(e,"title")&&_t(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every($_)&&ho(e)}function G_(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(P_)&&Array.isArray(e.locations)&&e.locations.every(C_)&&Array.isArray(e.props)&&e.props.every(T_)&&Array.isArray(e.episodes)&&e.episodes.every(D_)&&ho(e)}function Tt(e){if(G_(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 Yc=[3,4],B_={3:{version:3,require:Tt,requireStructurallyReadable:Tt,validate:wt},4:{version:4,require:Di,requireStructurallyReadable:En,validate:Ue}};function yo(e){return typeof e=="number"&&Yc.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 qc(e){return B_[Zo(e)]}function Bs(e){return qc(e).require(e)}function Js(e){return qc(e).requireStructurallyReadable(e)}function Lr(e){return qc(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 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 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 xn(e,t){return Wo(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 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 Sn(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)[Sn(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)[Sn(n[1],t)-1],i=o?.episode.scenes[Sn(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)[Sn(n[1],t)-1],i=o?.episode.scenes[Sn(n[2],t)-1],r=i?.actions[Sn(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=Kn(e)[Sn(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=Kn(e)[Sn(n[1],t)-1],i=o?.scene.actions[Sn(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)[Sn(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 J_(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=Kn(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(y=>y.episode.episode_id===g)?.episode;w&&w.scenes.forEach(y=>{l.add(y.scene_id),y.actions.forEach(_=>f.add(_.action_id))})},h=g=>{l.add(g);let w=r.find(y=>y.scene.scene_id===g);w&&(p.add(w.episode.episode_id),w.scene.actions.forEach(y=>f.add(y.action_id)))},m=g=>{f.add(g);let w=s.find(y=>y.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 y=w.split("..");y.length>2&&Bi("Selector region has too many range delimiters.",w);let _=Ju(e,y[0].trim(),n.allowOrdinals),x=Ju(e,(y[1]??y[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),v=J_(E==="episode"?c:E==="scene"?a:d,A,k,w);E==="episode"?v.forEach(u):E==="scene"?v.forEach(h):v.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 K_(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(K_).join("|"),i=j_(n);return`[${o}]${i?` ${i}`:""}`}function Xc(e){if(Array.isArray(e))return e.map(Xc);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=Xc(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(Xc(e[t]))))]}function z_(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,z_(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 ed(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 td(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(...ed(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function Zc(e,t){return[...Eo(t.extend),se("state",[e,t.state_id,t.state_name],t.description)]}function H_(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(...Zc(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(...Zc(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(...Zc(n.prop_id,o)));return t.push("</create>"),t}function Q_(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("",...td(n))),t.push("</script>"),t}function F_(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 Wc(e,t,n,o,i){let r=-1;return F_(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(...H_(e),"",...Q_(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(...td(c))}),i=s.length}else if(t==="episode-spans"){let r=Wc(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(...td(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=zs(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(...ed(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=Wc(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(...ed(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=Xo(e),s=Wc(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(`
|
|
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 Wc(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Wc):Ye(e)&&Object.values(e).every(Wc)}function ho(e){return e.extend===void 0||Ye(e.extend)&&Object.values(e.extend).every(Wc)}function Xc(e){return Ye(e)&&typeof e.state_id=="string"&&typeof e.state_name=="string"&&typeof e.description=="string"&&ho(e)}function j_(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(Xc)&&ho(e)}function z_(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(Xc)&&ho(e)}function H_(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(Xc)&&ho(e)}function Q_(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 F_(e){return!Ye(e)||typeof e.scene_id!="string"||!Array.isArray(e.actors)||!Array.isArray(e.props)||!Array.isArray(e.actions)||!e.actions.every(Q_)||!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 Y_(e){return Ye(e)&&typeof e.episode_id=="string"&&_t(e,"title")&&_t(e,"synopsis")&&Array.isArray(e.scenes)&&e.scenes.every(F_)&&ho(e)}function q_(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(j_)&&Array.isArray(e.locations)&&e.locations.every(z_)&&Array.isArray(e.props)&&e.props.every(H_)&&Array.isArray(e.episodes)&&e.episodes.every(Y_)&&ho(e)}function Tt(e){if(q_(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 ed=[3,4],Z_={3:{version:3,require:Tt,requireStructurallyReadable:Tt,validate:wt},4:{version:4,require:Di,requireStructurallyReadable:En,validate:Ue}};function yo(e){return typeof e=="number"&&ed.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 td(e){return Z_[Zo(e)]}function zs(e){return td(e).require(e)}function Hs(e){return td(e).requireStructurallyReadable(e)}function Ur(e){return td(e).validate(e)}function Qs(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("/")&&Qs(t);let o=t.slice(0,n),i=t.slice(n+1);return i!=="default"&&!V("state",i)&&Qs(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}:Qs(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}:Qs(t)}function Wo(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 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 xn(e,t){return Wo(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 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 Sn(e,t){return/^[1-9]\d*$/.test(e)||wo(t,"Ordinal positions are 1-based positive integers."),Number(e)}function Fs(e,t){let n=/^@ep:(\d+)$/.exec(t);if(n){let o=Wo(e)[Sn(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)[Sn(n[1],t)-1],i=o?.episode.scenes[Sn(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)[Sn(n[1],t)-1],i=o?.episode.scenes[Sn(n[2],t)-1],r=i?.actions[Sn(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=Kn(e)[Sn(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=Kn(e)[Sn(n[1],t)-1],i=o?.scene.actions[Sn(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)[Sn(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 Hu(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 Qu(e){return e.kind==="state"?`${e.assetId}/${e.stateId}`:e.id}function Fu(e,t,n){return t.startsWith("@")?(n||Bi("Ordinal anchors are query-only.",t),Fs(e,t)):Pr(t)}function W_(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 Ys(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=Kn(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(y=>y.episode.episode_id===g)?.episode;w&&w.scenes.forEach(y=>{l.add(y.scene_id),y.actions.forEach(_=>f.add(_.action_id))})},h=g=>{l.add(g);let w=r.find(y=>y.scene.scene_id===g);w&&(p.add(w.episode.episode_id),w.scene.actions.forEach(y=>f.add(y.action_id)))},m=g=>{f.add(g);let w=s.find(y=>y.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 y=w.split("..");y.length>2&&Bi("Selector region has too many range delimiters.",w);let _=Fu(e,y[0].trim(),n.allowOrdinals),x=Fu(e,(y[1]??y[0]).trim(),n.allowOrdinals),E=Hu(_,w);Hu(x,w)!==E&&Bi("Range endpoints must have the same kind.",w);let A=Qu(_),k=Qu(x),v=W_(E==="episode"?c:E==="scene"?a:d,A,k,w);E==="episode"?v.forEach(u):E==="scene"?v.forEach(h):v.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 X_(e){return e.replace(/\\/g,"\\\\").replace(/\|/g,"\\|").replace(/\]/g,"\\]").replace(/\n/g,"\\n")}function eE(e){return e.replace(/\\/g,"\\\\").replace(/\n/g,"\\n")}function se(e,t,n=""){let o=[e,...t].map(X_).join("|"),i=eE(n);return`[${o}]${i?` ${i}`:""}`}function id(e){if(Array.isArray(e))return e.map(id);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=id(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(id(e[t]))))]}function tE(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 Yu(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,tE(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 rd(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(...Yu(o))),n.push("</body>","","</scene>"),n}function sd(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(...rd(n,`id=${n.scene_id}`))}),t.push("</episode>"),t}function nd(e,t){return[...Eo(t.extend),se("state",[e,t.state_id,t.state_name],t.description)]}function nE(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(...nd(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(...nd(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(...nd(n.prop_id,o)));return t.push("</create>"),t}function oE(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("",...sd(n))),t.push("</script>"),t}function iE(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 od(e,t,n,o,i){let r=-1;return iE(i).map(s=>{let c=f=>{if(!f.startsWith("@"))return f;let u=Fs(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 qu(e,t,n){let o=["<authoring version=1>",""],i=0;if(t==="script")o.push(...nE(e),"",...oE(e)),i=1;else if(t==="episodes"){let r=Ys(e,n,{allowOrdinals:!0}),s=e.episodes.filter(c=>r.matchesEpisode(c.episode_id));s.forEach((c,a)=>{a>0&&o.push(""),o.push(...sd(c))}),i=s.length}else if(t==="episode-spans"){let r=od(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(...sd(a))),o.push("</episode-span>"),i++}else if(t==="scenes"){let r=Ys(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(...rd(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=od(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(...rd(p.scene,`id=${p.scene.scene_id}`))),o.push("</scene-span>"),i++}}else{let r=Xo(e),s=od(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(...Yu(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 Y_(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 q_(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 Z_(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 W_(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function nd(e){return`${e.episodeId}/${e.scene.scene_id}`}function X_(e,t){let n=W_(e),o=n.map(nd),i=[];for(let s of Ur(t)){let[c,a]=Hs(o,s,"scene");i.push(...n.slice(c,a+1))}Fu(i,nd),Pr(i.map(s=>[o.indexOf(nd(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:Zt}));return Gi("scene",r)}function od(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 eE(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=od(r.from),c=od(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 h=`${d.episode_id}/${p[u]}`;o.has(h)&&pe("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}n.push({kind:"scene-span",parent:d.episode_id,from:p[l],through:p[f],scenes:structuredClone(d.scenes.slice(l,f+1)),source:Zt}),i.push([e.episodes.indexOf(d),l])}return 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 tE(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=od(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 h=`${s.parent}#${u}`;o.has(h)&&pe("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}n.push({kind:"action-span",parent:s.parent,from:s.index,through:c.index,actions:structuredClone(f.actions.slice(s.index,c.index+1)),source:Zt}),i.push([e.episodes.indexOf(p),p.scenes.indexOf(f),s.index])}return Pr(i,"Action span"),Gi("action-span",n)}function Yu(e,t){let n=O(t.output).trim();n||pe("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",B);let o=Y_(t),i=O(t.in).trim(),r=Qu.resolve(n);if(o.version===4){let p=ju(En(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=q_(s,i):e==="episode-spans"?c=Z_(s,i):e==="scenes"?c=X_(s,i):e==="scene-spans"?c=eE(s,i):c=tE(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 Sd 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 nE(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function oE(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function iE(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 oE(e,t).find(o=>Cr(t,o)===n)}function rE(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 sE(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(nE(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 aE(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function of(e,t){let n=sE(t),o=aE();for(let i of n.assets){let r=Cr(i.kind,i.value),s=`${i.kind}:${r}`,c=rE(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."])}iE(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 id(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 rd(e,t){for(let n of e.scenes)id(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 cE(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)cE(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 dE(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){rd(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 pE(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){id(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 lE(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)rd(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 uE(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)id(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 fE(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 mE(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${mE(e.path,t)}\0${e.message}`}function gE(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 hE(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=gE(n),r=()=>({...o,warnings:[...o.warnings,...hE(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 yE(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)rd(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=yE(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=dE(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=pE(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=lE(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=uE(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=fE(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 sd(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 h=1;h<o.length;h+=1){let m=o[h];if(r){r=!1;continue}if(m==="\\"){r=!0;continue}if(m==="]"){i=h;break}}if(i<0)throw $("Bracket record is not closed.",n,e,"Add the closing ].");let s=o.slice(1,i),c=[],a="";r=!1;for(let h=0;h<s.length;h+=1){let m=s[h];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=
|
|
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 rE(e){let t=me(e),n;try{n=JSON.parse(Wu.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 Hs(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 qs(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 ef(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 sE(e,t){let n=[],o=e.episodes.map(r=>r.episode_id);for(let r of Cr(t)){let[s,c]=qs(o,r,"episode");n.push(...e.episodes.slice(s,c+1))}ef(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 Gi("episode",i)}function aE(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]=qs(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"),Gi("episode-span",o)}function cE(e){return e.episodes.flatMap(t=>t.scenes.map(n=>({episodeId:t.episode_id,scene:n})))}function ad(e){return`${e.episodeId}/${e.scene.scene_id}`}function dE(e,t){let n=cE(e),o=n.map(ad),i=[];for(let s of Cr(t)){let[c,a]=qs(o,s,"scene");i.push(...n.slice(c,a+1))}ef(i,ad),Tr(i.map(s=>[o.indexOf(ad(s))]),"Scene");let r=i.map(s=>({kind:"scene",parent:s.episodeId,value:structuredClone(s.scene),source:Zt}));return Gi("scene",r)}function cd(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 pE(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=cd(r.from),c=cd(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]=qs(p,{from:s.sceneId,through:c.sceneId},"scene");for(let u=l;u<=f;u+=1){let h=`${d.episode_id}/${p[u]}`;o.has(h)&&pe("AUTHORING_SELECTOR_OVERLAP","Scene span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}n.push({kind:"scene-span",parent:d.episode_id,from:p[l],through:p[f],scenes:structuredClone(d.scenes.slice(l,f+1)),source:Zt}),i.push([e.episodes.indexOf(d),l])}return Tr(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 lE(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=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=cd(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 h=`${s.parent}#${u}`;o.has(h)&&pe("AUTHORING_SELECTOR_OVERLAP","Action span regions overlap.",[h],"Use non-overlapping regions."),o.add(h)}n.push({kind:"action-span",parent:s.parent,from:s.index,through:c.index,actions:structuredClone(f.actions.slice(s.index,c.index+1)),source:Zt}),i.push([e.episodes.indexOf(p),p.scenes.indexOf(f),s.index])}return Tr(i,"Action span"),Gi("action-span",n)}function tf(e,t){let n=O(t.output).trim();n||pe("AUTHORING_OUTPUT_REQUIRED","Export requires --output.",["<missing>"],"Pass a destination .scriptctl file.",B);let o=rE(t),i=O(t.in).trim(),r=Xu.resolve(n);if(o.version===4){let p=qu(En(o),e,i);return Js(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=Ku(s):e==="episodes"?c=sE(s,i):e==="episode-spans"?c=aE(s,i):e==="scenes"?c=dE(s,i):e==="scene-spans"?c=pE(s,i):c=lE(s,i);let a=zu(c);return Js(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 vd from"node:crypto";import*as Gr from"node:fs";import*as Rf 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 Zs(e){if(Array.isArray(e))return e.map(Zs);if(e!==null&&typeof e=="object"){let t={};for(let[n,o]of Object.entries(e).sort(([i],[r])=>i.localeCompare(r)))t[n]=Zs(o);return t}return e}function xo(e,t){return JSON.stringify(Zs(e))===JSON.stringify(Zs(t))}function Vr(e,t){return"actor_id"in t?t.actor_id:"location_id"in t?t.location_id:t.prop_id}function uE(e,t){return"actor_name"in t?t.actor_name:"location_name"in t?t.location_name:t.prop_name}function fE(e,t){return t==="actor"?e.actors:t==="location"?e.locations:e.props}function mE(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 df(e,t,n){return fE(e,t).find(o=>Vr(t,o)===n)}function gE(e,t){for(let n of["actor","location","prop"]){let o=df(e,n,t);if(o!==void 0)return{kind:n,value:o}}}function hE(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(uE(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 yE(){return{createdAssets:[],existingAssets:[],createdStates:[],existingStates:[]}}function pf(e,t){let n=hE(t),o=yE();for(let i of n.assets){let r=Vr(i.kind,i.value),s=`${i.kind}:${r}`,c=gE(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."])}mE(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=df(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 nf(e){return{episodes:0,scenes:e===void 0?0:1,actions:e?.actions.length??0}}function of(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 Ws(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 rf(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 dd(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 pd(e,t){for(let n of e.scenes)dd(n,t)}function ei(e,t){return e.episodes.findIndex(n=>n.episode_id===t)}function Xs(e,t){return e.scenes.findIndex(n=>n.scene_id===t)}function lf(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=Xs(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 wE(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)wE(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 _E(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}});Dr(r,"Episode replace targets are not in document order.")}for(let r of n){pd(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:of(c),after:of(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 EE(e,t,n,o){let i=[];if(o==="replace"){let r=n.map(s=>({coord:lf(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){dd(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=Xs(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:nf(p),after:nf(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 xE(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)pd(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:Ws(a),after:Ws(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 SE(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=Xs(a,s.from),p=Xs(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)dd(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:rf(p),after:rf(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 IE(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]=lf(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 uf(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 AE(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 sf(e,t){return`${e.code}\0${AE(e.path,t)}\0${e.message}`}function kE(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 bE(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 af(e,t,n){let o=wt(t),i=kE(n),r=()=>({...o,warnings:[...o.warnings,...bE(e,t,i)]});if(o.ok||e!==null&&xo(e,t))return r();let s=new Set(e===null?[]:wt(e).errors.map(a=>sf(a,e))),c=o.errors.filter(a=>{if(!s.has(sf(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 cf(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 vE(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)pd(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=pf(n,e.declarations);return uf(n),{script:n,declarations:o}}function ff(e,t,n){if(t.targetKind==="script"){n!=="create"&&F("AUTHORING_TARGET_MODE","Script targets support create only.",[n],["Use --create."],B);let a=vE(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=af(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}:Ws(e.episodes),after:Ws(d.episodes),...$r(e?.episodes.map(f=>f.episode_id)??[],d.episodes.map(f=>f.episode_id)),untouchedSiblings:0}],retainedOrphanAssets:cf(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=pf(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=_E(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=EE(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=xE(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=SE(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=IE(o,i,a);break}default:F("AUTHORING_TARGET_MODE","Unsupported authoring target.",[t.targetKind],["Use a supported homogeneous target kind."])}uf(i);let c=af(e,i,t.targets);return{script:i,changed:!xo(e,i),declarations:r,targets:s,retainedOrphanAssets:cf(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 ld(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 h=1;h<o.length;h+=1){let m=o[h];if(r){r=!1;continue}if(m==="\\"){r=!0;continue}if(m==="]"){i=h;break}}if(i<0)throw $("Bracket record is not closed.",n,e,"Add the closing ].");let s=o.slice(1,i),c=[],a="";r=!1;for(let h=0;h<s.length;h+=1){let m=s[h];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=ld(d??"",n,!0);if(!l)throw $("Record type is empty.",n,e,"Use a known record type.");let f=o.slice(i+1),u=f.startsWith(" ")?f.slice(1):f;return{type:l,slots:p.map(h=>ld(h,n,!0)),content:ld(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 ud(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(ud):typeof e!="object"?!1:Object.values(e).every(ud)}function fd(e){if(Array.isArray(e))return e.map(fd);if(e!==null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=fd(e[n]);return t}return e}function mf(e){return e==="featured"||e==="background"}function OE(e){return e==="\u4E3B\u89D2"||e==="\u914D\u89D2"}function RE(e){return e==="system"||e==="broadcast"||e==="offscreen"||e==="group"}function ME(e){return e==="actor"||e==="location"||e==="prop"}function gf(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 LE(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 In(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 NE(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)||!RE(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 UE(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=NE(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 md=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(In(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");In(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)||!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)||!wE(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||!EE(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 In(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");In(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 h=this.peekSemantic();if(h?.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(h?.tag===void 0||h.tag.closing||h.tag.name!=="episode"){let m=h?.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");In(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");In(o,n?["id","parent"]:["id"]),(t.aliasesPresent||t.prompt!==void 0)&&this.throwUnsupportedModifiers(t,"scene");let i,r,s=[],c=[],a="environment",d;for(;;){if(this.skipBlank(),this.peekClose("scene")){this.takeClose("scene");break}let f=this.peekSemantic();if(f?.tag?.name==="body"&&!f.tag.closing){if(a==="body")throw $("Scene has more than one body.",f.tag.source,"<body>","Keep exactly one <body>.");a="body",d=this.parseBody();continue}if(f?.record===void 0){let h=f?.tag?.source??{line:this.index+1,column:1};throw $("Only scene records and <body> are allowed here.",h,this.lines[this.index]??"<eof>","Use environment, location, cast, prop, then body.")}let u=this.takeRecord();if(u.type==="extensions"||u.type==="extend"||u.type==="aliases"||u.type==="alias"||u.type==="prompt")throw $("Scene prefix modifier must directly precede <scene>.",u.source,u.type,"Move the modifier before the <scene> opening tag.");if(u.type==="environment"){if(a!=="environment"||i!==void 0||u.slots.length>2)throw $("Environment record is out of order or invalid.",u.source,u.slots.join("|"),"Place at most one [environment|space?|time?] first.");i={},u.slots.length>=1&&u.slots[0]!==""&&(i.space=u.slots[0]),u.slots.length>=2&&u.slots[1]!==""&&(i.time=u.slots[1]);continue}if(u.type==="location"){if(a==="cast"||a==="prop"||a==="body"||r!==void 0||u.slots.length>2)throw $("Location record is out of order or invalid.",u.source,u.slots.join("|"),"Place exactly one [location|id?|state?] before cast.");a="location";let h=u.slots[0];h===void 0||h===""?r=null:r=u.slots.length===2?{location_id:h,state_id:u.slots[1]}:{location_id:h};continue}if(u.type==="cast"){if(r===void 0||a==="prop"||a==="body"||u.slots.length<1||u.slots.length>2||!u.slots[0])throw $("Cast record is out of order or invalid.",u.source,u.slots.join("|"),"Place [cast|actor_id|state_id?] after location and before props.");a="cast",s.push(u.slots.length===2?{actor_id:u.slots[0],state_id:u.slots[1]}:{actor_id:u.slots[0]});continue}if(u.type==="prop"){if(r===void 0||a==="body"||u.slots.length<1||u.slots.length>2||!u.slots[0])throw $("Prop record is out of order or invalid.",u.source,u.slots.join("|"),"Place [prop|prop_id|state_id?] after cast and before body.");a="prop",c.push(u.slots.length===2?{prop_id:u.slots[0],state_id:u.slots[1]}:{prop_id:u.slots[0]});continue}throw $("Record is not allowed in a scene header.",u.source,u.type,"Use environment, location, cast, prop, or body records.")}if(r===void 0)throw $("Scene location record is missing.",o.source,`<scene id=${o.attrs.get("id")}>`,"Add [location] or [location|loc_ID|state_ID].");if(d===void 0)throw $("Scene body is missing.",o.source,`<scene id=${o.attrs.get("id")}>`,"Add one <body> block.");let p={scene_id:o.attrs.get("id"),location:r,actors:s,props:c,actions:d};i!==void 0&&(p.environment=i);let l=xt(t);return l!==void 0&&(p.extend=l),p}parseBody(){let t=this.takeOpen("body");In(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(IE(i,o)),o=Et()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");In(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");In(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");In(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 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(!ad(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]=cd(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=xE(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 dd(e).parse()}function N(e,t,n){throw new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function fd(e,t){let n=e.trim(),o=/^<\/([a-z-]+)>$/.exec(n);if(o)return{name:o[1],closing:!0,attrs:new Map,line:t};let i=/^<([a-z-]+)(?: ([^>]+))?>$/.exec(n);if(!i)return null;let r=new Map,s=i[2]??"",c=s===""?[]:s.split(" ");c.some(a=>a==="")&&N("Tag attributes need one-space separators.",t,n);for(let a of c){let d=/^([a-z]+)=([A-Za-z0-9_./#:-]+)$/.exec(a);(!d||r.has(d[1]))&&N("Tag attributes are invalid.",t,a),r.set(d[1],d[2])}return{name:i[1],closing:!1,attrs:r,line:t}}function $e(e,t,n=[]){let o=new Set([...t,...n]),i=[...e.attrs.keys()].filter(s=>!o.has(s)),r=t.filter(s=>!e.attrs.has(s));(i.length>0||r.length>0)&&N("Tag attributes do not match the canonical grammar.",e.line,[...r.map(s=>`missing:${s}`),...i.map(s=>`unknown:${s}`)].join(","))}var md=class{lines;index=0;constructor(t){this.lines=t.split(/\r?\n/).map((n,o)=>({raw:n.replace(/^\s+/,""),line:o+1})).filter(n=>n.raw.trim()!=="")}peek(){let t=this.lines[this.index];return t||N("Unexpected end of authoring file.",this.lines.at(-1)?.line??1,"<eof>"),t}take(){let t=this.peek();return this.index++,t}tag(t,n){let o=this.take(),i=fd(o.raw,o.line);return(!i||i.name!==t||i.closing!==n)&&N(`Expected ${n?"</":"<"}${t}>.`,o.line,o.raw),i}record(){let t=this.take();return Ji(t.raw,t.line)}nextTag(){let t=this.peek();return fd(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?Ji(t.raw,t.line):null}};function gd(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(gd):typeof e=="object"&&Object.values(e).every(gd)}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]))&&N("extend record is invalid or duplicated.",r.source.line,r.type);let s=r.slots[0];i!==null&&i>=s&&N("extend keys must use ascending canonical order.",r.source.line,s);let c;try{c=JSON.parse(r.content)}catch{N("extend content must be JSON.",r.source.line,r.content)}gd(c)||N("extend value must be JSON-compatible.",r.source.line,r.content),o[s]=c,i=s}t.extend=o}if(n=e.nextRecord(),n?.type==="aliases"){e.record();let o=[];for(;(n=e.nextRecord())?.type==="alias";){let i=e.record();i.slots.length!==0&&N("alias takes no slots.",i.source.line,i.type),i.content===""&&N("alias must not be empty.",i.source.line,i.type),o.includes(i.content)&&N("alias must not be duplicated.",i.source.line,i.content),o.push(i.content)}t.aliases=o}if(n=e.nextRecord(),n?.type==="prompt"){let o=e.record();(o.slots.length!==3||o.slots.some(r=>r===""))&&N("prompt requires non-empty target, process, and contrast.",o.source.line,o.type);let i=o.slots[0];!V("actor",i)&&!V("location",i)&&!V("prop",i)&&N("prompt target must be an asset ID.",o.source.line,i),t.prompt={target:i,process:o.slots[1],contrast:o.slots[2]}}return t}function pd(e,t){return e!=="featured"&&e!=="background"&&N("Importance is invalid.",t,e),e}function AE(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&N("Role type is invalid.",t,e),e}function wd(e,t){return e==="default"||V("state",e)?e:N("State ID is invalid.",t,e)}function kE(e){let t=e.tag("create",!1);$e(t,[]);let n=[],o=new Map,i=null,r=0,s=a=>{if(i===null)return;let d=o.get(i);(!d||d.states.length===0||d.states[0].state_id!=="default")&&N("A new asset must be followed immediately by its default state.",a,i),i=null};for(;e.nextTag()?.name!=="create"||e.nextTag()?.closing!==!0;){let a=ti(e),d=e.record();if(d.type==="actor"){r>0&&N("Create declarations are not in canonical order.",d.source.line,d.type),s(d.source.line),a.prompt!==void 0&&N("prompt cannot modify an asset.",d.source.line,d.type),(d.slots.length<3||d.slots.length>4||!V("actor",d.slots[0]))&&N("actor declaration is invalid.",d.source.line,d.type);let p=AE(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:pd(d.slots[2],d.source.line),description:d.content,states:[],...p===void 0?{}:{role_type:p},...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};l.aliases?.includes(l.actor_name)&&N("An alias must differ from the asset name.",d.source.line,l.actor_name),n.push({kind:"actor",value:l}),o.set(l.actor_id,l),i=l.actor_id}else if(d.type==="location"||d.type==="prop"){let p=d.type==="location"?1:2;p<r&&N("Create declarations are not in canonical order.",d.source.line,d.type),r=p,s(d.source.line),a.prompt!==void 0&&N("prompt cannot modify an asset.",d.source.line,d.type);let l=d.type;if((d.slots.length!==3||(l==="location"?!V("location",d.slots[0]):!V("prop",d.slots[0])))&&N(`${l} declaration is invalid.`,d.source.line,d.type),l==="location"){let f=d.slots[0];V("location",f)||N("location ID is invalid.",d.source.line,f);let u={location_id:f,location_name:d.slots[1],importance:pd(d.slots[2],d.source.line),description:d.content,states:[],...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};u.aliases?.includes(u.location_name)&&N("An alias must differ from the asset name.",d.source.line,u.location_name),n.push({kind:l,value:u}),o.set(u.location_id,u),i=u.location_id}else{let f=d.slots[0];V("prop",f)||N("prop ID is invalid.",d.source.line,f);let u={prop_id:f,prop_name:d.slots[1],importance:pd(d.slots[2],d.source.line),description:d.content,states:[],...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};u.aliases?.includes(u.prop_name)&&N("An alias must differ from the asset name.",d.source.line,u.prop_name),n.push({kind:l,value:u}),o.set(u.prop_id,u),i=u.prop_id}}else if(d.type==="state"){(d.slots.length!==3||a.aliases!==void 0||a.prompt!==void 0)&&N("state declaration is invalid.",d.source.line,d.type);let p=d.slots[0],l=o.get(p);l&&i!==p&&N("States for a new asset must immediately follow that asset.",d.source.line,p),l||(s(d.source.line),r=3);let f={state_id:wd(d.slots[1],d.source.line),state_name:d.slots[2],description:d.content,...a.extend===void 0?{}:{extend:a.extend}};l?(l.states.length===0&&f.state_id!=="default"&&N("The first state of a new asset must be default.",d.source.line,f.state_id),l.states.push(f)):n.push({kind:"state",ownerId:p,value:f})}else s(d.source.line),N("Unknown create declaration.",d.source.line,d.type)}s(e.peek().line);let c=e.tag("create",!0);return $e(c,[]),n}function bE(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:wd(e.slice(n+1),t)};let i=e.indexOf(":"),r=i<0?e:e.slice(0,i);return["system","broadcast","offscreen","group"].includes(r)?i<0?{kind:r}:{kind:r,label:e.slice(i+1)}:N("Speaker is invalid.",t,e)}function lf(e){let t=ti(e);t.aliases!==void 0&&N("aliases cannot modify an Action.",e.peek().line,"aliases");let n=e.record();return n.type==="act"||n.type==="trans"?((n.slots.length!==1||!V("action",n.slots[0]))&&N("Narrative Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="act"?"action":"transition",content:n.content,...t.extend===void 0?{}:{extend:t.extend},...t.prompt===void 0?{}:{transition_prompt:t.prompt}}):n.type!=="dlg"&&n.type!=="think"?N("Unknown Action record.",n.source.line,n.type):((n.slots.length!==2&&n.slots.length!==3||!V("action",n.slots[0]))&&N("Speaking Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="dlg"?"dialogue":"inner_thought",speaker:bE(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 ld(e,t){e.length===0&&N("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>wd(o,t));return new Set(n).size!==n.length&&N("Scene reference repeats a state.",t,n.join(",")),n.sort()}function hd(e,t,n,o){$e(t,n===void 0?["id","parent"]:["id"]);let i=t.attrs.get("id")??"";V("scene",i)||N("Scene ID is invalid.",t.line,i);let r=t.attrs.get("parent")??n;r!==void 0&&!V("episode",r)&&N("Scene parent must be an Episode ID.",t.line,r);let s,c,a=[],d=[],p=new Set,l=new Set,f=0;for(;e.nextTag()?.name!=="body";){let m=e.record(),g=m.type==="environment"?0:m.type==="location"?1:m.type==="cast"?2:m.type==="prop"?3:-1;g<f&&N("Scene records are not in canonical order.",m.source.line,m.type),f=g,m.type==="environment"?(s!==void 0&&N("Scene environment is duplicated.",m.source.line,m.type),m.slots.length>2&&N("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&&N("Scene location is duplicated.",m.source.line,m.type),m.slots.length===0?c=null:(V("location",m.slots[0])||N("Location ref ID is invalid.",m.source.line,m.slots[0]),c={location_id:m.slots[0],state_ids:ld(m.slots.slice(1),m.source.line)})):m.type==="cast"?(V("actor",m.slots[0])||N("Cast ref ID is invalid.",m.source.line,m.slots[0]??""),p.has(m.slots[0])&&N("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:ld(m.slots.slice(1),m.source.line)})):m.type==="prop"?(V("prop",m.slots[0])||N("Prop ref ID is invalid.",m.source.line,m.slots[0]??""),l.has(m.slots[0])&&N("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:ld(m.slots.slice(1),m.source.line)})):N("Unknown scene header record.",m.source.line,m.type)}c===void 0&&N("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);$e(u,[]);let h=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)h.push(lf(e));return $e(e.tag("body",!0),[]),$e(e.tag("scene",!0),[]),{...r===void 0?{}:{parent:r},value:{scene_id:i,...s===void 0?{}:{environment:s},location:c,actors:a,props:d,actions:h,...o===void 0?{}:{extend:o}}}}function yd(e,t,n){$e(t,["id"]);let o=t.attrs.get("id")??"";V("episode",o)||N("Episode ID is invalid.",t.line,o);let i,r,s=[],c=0;for(;e.nextTag()?.name!=="episode"||e.nextTag()?.closing!==!0;){let a=ti(e);(a.aliases!==void 0||a.prompt!==void 0)&&N("Invalid episode child modifier.",e.peek().line,"modifier");let d=e.nextTag();if(d?.name==="scene"&&!d.closing){c=2,e.take(),s.push(hd(e,d,o,a.extend).value);continue}a.extend!==void 0&&N("extend must precede a scene here.",e.peek().line,"extend");let p=e.record(),l=p.type==="title"?0:p.type==="synopsis"?1:-1;l<c&&N("Episode records are not in canonical order.",p.source.line,p.type),c=l,p.type==="title"?(i!==void 0&&N("Episode title is duplicated.",p.source.line,p.type),p.slots.length!==0&&N("Episode title takes no slots.",p.source.line,p.type),i=p.content):p.type==="synopsis"?(r!==void 0&&N("Episode synopsis is duplicated.",p.source.line,p.type),p.slots.length!==0&&N("Episode synopsis takes no slots.",p.source.line,p.type),r=p.content):N("Unknown episode record.",p.source.line,p.type)}return $e(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 ud(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]))&&N(`Span range must contain two ${t} IDs.`,e.line,n),[o[0],o[1]]}function vE(e,t,n){$e(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)&&N("Invalid script child modifier.",e.peek().line,"modifier");let h=e.nextTag();if(h?.name==="episode"&&!h.closing){f=8,e.take(),l.push(yd(e,h,u.extend));continue}u.extend!==void 0&&N("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&&N("Script records are not in canonical order.",m.source.line,m.type),f=g,m.type!=="main-character"&&m.slots.length!==0&&N("Script metadata record takes no slots.",m.source.line,m.type),m.type==="title"?(o!==void 0&&N("Script title is duplicated.",m.source.line,m.type),o=m.content):m.type==="worldview"?(i!==void 0&&N("Script worldview is duplicated.",m.source.line,m.type),i=m.content):m.type==="worldview-raw"?(r!==void 0&&N("Script worldview-raw is duplicated.",m.source.line,m.type),r=m.content):m.type==="style"?(s!==void 0&&N("Script style is duplicated.",m.source.line,m.type),s=m.content):m.type==="synopsis"?(c!==void 0&&N("Script synopsis is duplicated.",m.source.line,m.type),c=m.content):m.type==="logline"?(a!==void 0&&N("Script logline is duplicated.",m.source.line,m.type),a=m.content):m.type==="theme"?(d!==void 0&&N("Script theme is duplicated.",m.source.line,m.type),d=m.content):m.type==="main-characters"?(p!==void 0&&N("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]}):N("Unknown script record.",m.source.line,m.type)}return $e(e.tag("script",!0),[]),(o===void 0||i===void 0||s===void 0)&&N("Script target needs title, worldview, and style.",e.peek().line,"script"),{kind:"script",value:{title:o,worldview:i,style:s,episodes:l,...r===void 0?{}:{worldview_raw:r},...c===void 0?{}:{synopsis:c},...a===void 0?{}:{logline:a},...d===void 0?{}:{theme:d},...p===void 0?{}:{main_characters:p},...n===void 0?{}:{extend:n}}}}function uf(e){let t=new md(e),n=t.tag("authoring",!1);$e(n,["version"]),n.attrs.get("version")!=="1"&&N("authoring version must be 1.",1,n.attrs.get("version")??"<missing>");let o=t.nextTag()?.name==="create"?kE(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=ti(t);(s.aliases!==void 0||s.prompt!==void 0)&&N("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=fd(c.raw,c.line);if((!a||a.closing)&&N("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(vE(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:yd(t,a,s.extend)});else if(a.name==="scene"){let d=hd(t,a,void 0,s.extend);d.parent||N("Top-level scene needs parent.",c.line,c.raw),i.push({kind:"scene",parent:d.parent,value:d.value})}else if(a.name==="episode-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),$e(a,["range"]);let[d,p]=ud(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)&&N("Invalid episode child modifier.",t.peek().line,"modifier");let u=t.tag("episode",!1);l.push(yd(t,u,f.extend))}$e(t.tag("episode-span",!0),[]),i.push({kind:"episode-span",from:d,through:p,values:l})}else if(a.name==="scene-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),$e(a,["parent","range"]);let[d,p]=ud(a,"scene"),l=a.attrs.get("parent")??N("scene-span needs parent.",c.line,c.raw);V("episode",l)||N("scene-span parent must be an Episode ID.",c.line,l);let f=[];for(;t.nextTag()?.name!=="scene-span"||t.nextTag()?.closing!==!0;){let u=ti(t);(u.aliases!==void 0||u.prompt!==void 0)&&N("Invalid scene child modifier.",t.peek().line,"modifier");let h=t.tag("scene",!1);f.push(hd(t,h,l,u.extend).value)}$e(t.tag("scene-span",!0),[]),i.push({kind:"scene-span",parent:l,from:d,through:p,values:f})}else if(a.name==="action-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),$e(a,["parent","range"]);let[d,p]=ud(a,"action"),l=a.attrs.get("parent")??N("action-span needs parent.",c.line,c.raw);V("scene",l)||N("action-span parent must be a Scene ID.",c.line,l),$e(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(lf(t));$e(t.tag("body",!0),[]),$e(t.tag("action-span",!0),[]),i.push({kind:"action-span",parent:l,from:d,through:p,values:f})}else N("Unknown authoring target.",c.line,a.name)}$e(t.tag("authoring",!0),[]),(t.index!==t.lines.length||i.length===0)&&N("Authoring file has trailing content or no targets.",t.peek().line,"<root>");let r=i[0].kind;return i.every(s=>s.kind===r)||N("All targets must have the same kind.",1,r),{declarations:o,targets:i,targetKind:r}}function An(e){if(Array.isArray(e))return e.map(t=>An(t));if(oe(e)){let t={};for(let n of Object.keys(e).sort())t[n]=An(e[n]);return t}return e}function _d(e){if(e.length===0)return[];let t={};for(let i of e){let r=O(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&&Lc(Ue(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 Pe(e,t){throw new S(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function xd(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 OE(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):xd(e.values)}function RE(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 Ed(e,t){return JSON.stringify(An(e))===JSON.stringify(An(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 ME(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Pe("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)&&Pe("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)&&Pe("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||Pe("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Pe("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)&&Pe("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function LE(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 NE(e,t){let n=-1;for(let o of t){let[i,r]=LE(e,o);i<=n&&Pe("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=xn(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=jn(e,t.value.scene_id),s=xn(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=xn(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=jn(e,t.parent)?.scene;if(!n)return{...xd([]),siblings:0};let[o,i]=Wt(n.actions.map(r=>r.action_id),t.from,t.through);return{...xd(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function _f(e,t){let n=OE(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 UE(e,t){if(t.kind==="script"&&Pe("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=xn(e,t.value.episode_id);n||Pe("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&&Pe("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)&&Pe("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=xn(e,t.parent)?.episode;n||Pe("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&&Pe("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||Pe("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&&Pe("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function PE(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=xn(e,t.parent)?.episode;n||Pe("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Pe("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 Pe("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Pe("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...RE(e.declarations)}}function Sf(e,t,n){let o;if(e===null)n!=="create"&&Pe("A missing target requires one script create target.",[n,t.targetKind]),o=Ef(t);else if(n==="create"&&t.targetKind==="script")o=Ef(t),Ed(o,e)||Pe("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&NE(e,t.targets),ME(o,t.declarations);let r=t.targets.map(a=>wf(e,a));if(n==="replace")for(let a of[...t.targets].reverse())UE(o,a);else for(let a of t.targets)PE(o,a);let s=t.targets.map((a,d)=>_f(a,r[d])),c=Ue(o);return ff(e,c),{script:o,changed:!Ed(e,o),validation:c,targets:s,declarations:mf(e,t.declarations),retainedOrphanAssets:gf(o),identity:yf(e,o)}}let i=Ue(o);return ff(e,i),{script:o,changed:e===null||!Ed(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 CE(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 TE(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 VE(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 $E(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 DE(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 GE(e,t,n,o,i){let r=uf(t.text),s=i.script===null?null:En(i.script),c=Sf(s,r,n),a=`sha256:${Sd.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=O(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
|
|
133
|
-
`),data:{op:"write",changed:a.changed,source_path:o.absolutePath,source_digest:d,script_path:r,baseline:s.baseline,script_hash:s.baseline==="missing"?null:s.baseline,plan_digest:l,plan:p.plan,mode:i,target_kind:c.targetKind,targets:a.targets,declarations:a.declarations,counts:h,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},G]}function
|
|
131
|
+
`)}parse(){this.skipBlank();let t=this.takeOpen("authoring");if(In(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");In(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)||!mf(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)||!OE(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)||!mf(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||!ME(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 In(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");In(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 h=this.peekSemantic();if(h?.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(h?.tag===void 0||h.tag.closing||h.tag.name!=="episode"){let m=h?.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");In(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");In(o,n?["id","parent"]:["id"]),(t.aliasesPresent||t.prompt!==void 0)&&this.throwUnsupportedModifiers(t,"scene");let i,r,s=[],c=[],a="environment",d;for(;;){if(this.skipBlank(),this.peekClose("scene")){this.takeClose("scene");break}let f=this.peekSemantic();if(f?.tag?.name==="body"&&!f.tag.closing){if(a==="body")throw $("Scene has more than one body.",f.tag.source,"<body>","Keep exactly one <body>.");a="body",d=this.parseBody();continue}if(f?.record===void 0){let h=f?.tag?.source??{line:this.index+1,column:1};throw $("Only scene records and <body> are allowed here.",h,this.lines[this.index]??"<eof>","Use environment, location, cast, prop, then body.")}let u=this.takeRecord();if(u.type==="extensions"||u.type==="extend"||u.type==="aliases"||u.type==="alias"||u.type==="prompt")throw $("Scene prefix modifier must directly precede <scene>.",u.source,u.type,"Move the modifier before the <scene> opening tag.");if(u.type==="environment"){if(a!=="environment"||i!==void 0||u.slots.length>2)throw $("Environment record is out of order or invalid.",u.source,u.slots.join("|"),"Place at most one [environment|space?|time?] first.");i={},u.slots.length>=1&&u.slots[0]!==""&&(i.space=u.slots[0]),u.slots.length>=2&&u.slots[1]!==""&&(i.time=u.slots[1]);continue}if(u.type==="location"){if(a==="cast"||a==="prop"||a==="body"||r!==void 0||u.slots.length>2)throw $("Location record is out of order or invalid.",u.source,u.slots.join("|"),"Place exactly one [location|id?|state?] before cast.");a="location";let h=u.slots[0];h===void 0||h===""?r=null:r=u.slots.length===2?{location_id:h,state_id:u.slots[1]}:{location_id:h};continue}if(u.type==="cast"){if(r===void 0||a==="prop"||a==="body"||u.slots.length<1||u.slots.length>2||!u.slots[0])throw $("Cast record is out of order or invalid.",u.source,u.slots.join("|"),"Place [cast|actor_id|state_id?] after location and before props.");a="cast",s.push(u.slots.length===2?{actor_id:u.slots[0],state_id:u.slots[1]}:{actor_id:u.slots[0]});continue}if(u.type==="prop"){if(r===void 0||a==="body"||u.slots.length<1||u.slots.length>2||!u.slots[0])throw $("Prop record is out of order or invalid.",u.source,u.slots.join("|"),"Place [prop|prop_id|state_id?] after cast and before body.");a="prop",c.push(u.slots.length===2?{prop_id:u.slots[0],state_id:u.slots[1]}:{prop_id:u.slots[0]});continue}throw $("Record is not allowed in a scene header.",u.source,u.type,"Use environment, location, cast, prop, or body records.")}if(r===void 0)throw $("Scene location record is missing.",o.source,`<scene id=${o.attrs.get("id")}>`,"Add [location] or [location|loc_ID|state_ID].");if(d===void 0)throw $("Scene body is missing.",o.source,`<scene id=${o.attrs.get("id")}>`,"Add one <body> block.");let p={scene_id:o.attrs.get("id"),location:r,actors:s,props:c,actions:d};i!==void 0&&(p.environment=i);let l=xt(t);return l!==void 0&&(p.extend=l),p}parseBody(){let t=this.takeOpen("body");In(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(UE(i,o)),o=Et()}}parseEpisodeSpan(t){let n=this.takeOpen("episode-span");In(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");In(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");In(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:gf(n.attrs.get("from"),n.source,"action-span from",!0),through:gf(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(!ud(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]=fd(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=LE(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 hf(e){return new md(e).parse()}function N(e,t,n){throw new S(e,{exitCode:b,errorCode:"AUTHORING_SOURCE_INVALID",data:{actual:[`line ${t}: ${n}`]}})}function wd(e,t){let n=e.trim(),o=/^<\/([a-z-]+)>$/.exec(n);if(o)return{name:o[1],closing:!0,attrs:new Map,line:t};let i=/^<([a-z-]+)(?: ([^>]+))?>$/.exec(n);if(!i)return null;let r=new Map,s=i[2]??"",c=s===""?[]:s.split(" ");c.some(a=>a==="")&&N("Tag attributes need one-space separators.",t,n);for(let a of c){let d=/^([a-z]+)=([A-Za-z0-9_./#:-]+)$/.exec(a);(!d||r.has(d[1]))&&N("Tag attributes are invalid.",t,a),r.set(d[1],d[2])}return{name:i[1],closing:!1,attrs:r,line:t}}function $e(e,t,n=[]){let o=new Set([...t,...n]),i=[...e.attrs.keys()].filter(s=>!o.has(s)),r=t.filter(s=>!e.attrs.has(s));(i.length>0||r.length>0)&&N("Tag attributes do not match the canonical grammar.",e.line,[...r.map(s=>`missing:${s}`),...i.map(s=>`unknown:${s}`)].join(","))}var _d=class{lines;index=0;constructor(t){this.lines=t.split(/\r?\n/).map((n,o)=>({raw:n.replace(/^\s+/,""),line:o+1})).filter(n=>n.raw.trim()!=="")}peek(){let t=this.lines[this.index];return t||N("Unexpected end of authoring file.",this.lines.at(-1)?.line??1,"<eof>"),t}take(){let t=this.peek();return this.index++,t}tag(t,n){let o=this.take(),i=wd(o.raw,o.line);return(!i||i.name!==t||i.closing!==n)&&N(`Expected ${n?"</":"<"}${t}>.`,o.line,o.raw),i}record(){let t=this.take();return Ji(t.raw,t.line)}nextTag(){let t=this.peek();return wd(t.raw,t.line)}nextRecord(){let t=this.peek();return t.raw.startsWith("[")?Ji(t.raw,t.line):null}};function Ed(e){return e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean"?!0:Array.isArray(e)?e.every(Ed):typeof e=="object"&&Object.values(e).every(Ed)}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]))&&N("extend record is invalid or duplicated.",r.source.line,r.type);let s=r.slots[0];i!==null&&i>=s&&N("extend keys must use ascending canonical order.",r.source.line,s);let c;try{c=JSON.parse(r.content)}catch{N("extend content must be JSON.",r.source.line,r.content)}Ed(c)||N("extend value must be JSON-compatible.",r.source.line,r.content),o[s]=c,i=s}t.extend=o}if(n=e.nextRecord(),n?.type==="aliases"){e.record();let o=[];for(;(n=e.nextRecord())?.type==="alias";){let i=e.record();i.slots.length!==0&&N("alias takes no slots.",i.source.line,i.type),i.content===""&&N("alias must not be empty.",i.source.line,i.type),o.includes(i.content)&&N("alias must not be duplicated.",i.source.line,i.content),o.push(i.content)}t.aliases=o}if(n=e.nextRecord(),n?.type==="prompt"){let o=e.record();(o.slots.length!==3||o.slots.some(r=>r===""))&&N("prompt requires non-empty target, process, and contrast.",o.source.line,o.type);let i=o.slots[0];!V("actor",i)&&!V("location",i)&&!V("prop",i)&&N("prompt target must be an asset ID.",o.source.line,i),t.prompt={target:i,process:o.slots[1],contrast:o.slots[2]}}return t}function gd(e,t){return e!=="featured"&&e!=="background"&&N("Importance is invalid.",t,e),e}function PE(e,t){if(e!==void 0)return e!=="\u4E3B\u89D2"&&e!=="\u914D\u89D2"&&N("Role type is invalid.",t,e),e}function Id(e,t){return e==="default"||V("state",e)?e:N("State ID is invalid.",t,e)}function CE(e){let t=e.tag("create",!1);$e(t,[]);let n=[],o=new Map,i=null,r=0,s=a=>{if(i===null)return;let d=o.get(i);(!d||d.states.length===0||d.states[0].state_id!=="default")&&N("A new asset must be followed immediately by its default state.",a,i),i=null};for(;e.nextTag()?.name!=="create"||e.nextTag()?.closing!==!0;){let a=ti(e),d=e.record();if(d.type==="actor"){r>0&&N("Create declarations are not in canonical order.",d.source.line,d.type),s(d.source.line),a.prompt!==void 0&&N("prompt cannot modify an asset.",d.source.line,d.type),(d.slots.length<3||d.slots.length>4||!V("actor",d.slots[0]))&&N("actor declaration is invalid.",d.source.line,d.type);let p=PE(d.slots[3],d.source.line),l={actor_id:d.slots[0],actor_name:d.slots[1],importance:gd(d.slots[2],d.source.line),description:d.content,states:[],...p===void 0?{}:{role_type:p},...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};l.aliases?.includes(l.actor_name)&&N("An alias must differ from the asset name.",d.source.line,l.actor_name),n.push({kind:"actor",value:l}),o.set(l.actor_id,l),i=l.actor_id}else if(d.type==="location"||d.type==="prop"){let p=d.type==="location"?1:2;p<r&&N("Create declarations are not in canonical order.",d.source.line,d.type),r=p,s(d.source.line),a.prompt!==void 0&&N("prompt cannot modify an asset.",d.source.line,d.type);let l=d.type;if((d.slots.length!==3||(l==="location"?!V("location",d.slots[0]):!V("prop",d.slots[0])))&&N(`${l} declaration is invalid.`,d.source.line,d.type),l==="location"){let f=d.slots[0];V("location",f)||N("location ID is invalid.",d.source.line,f);let u={location_id:f,location_name:d.slots[1],importance:gd(d.slots[2],d.source.line),description:d.content,states:[],...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};u.aliases?.includes(u.location_name)&&N("An alias must differ from the asset name.",d.source.line,u.location_name),n.push({kind:l,value:u}),o.set(u.location_id,u),i=u.location_id}else{let f=d.slots[0];V("prop",f)||N("prop ID is invalid.",d.source.line,f);let u={prop_id:f,prop_name:d.slots[1],importance:gd(d.slots[2],d.source.line),description:d.content,states:[],...a.aliases===void 0?{}:{aliases:a.aliases},...a.extend===void 0?{}:{extend:a.extend}};u.aliases?.includes(u.prop_name)&&N("An alias must differ from the asset name.",d.source.line,u.prop_name),n.push({kind:l,value:u}),o.set(u.prop_id,u),i=u.prop_id}}else if(d.type==="state"){(d.slots.length!==3||a.aliases!==void 0||a.prompt!==void 0)&&N("state declaration is invalid.",d.source.line,d.type);let p=d.slots[0],l=o.get(p);l&&i!==p&&N("States for a new asset must immediately follow that asset.",d.source.line,p),l||(s(d.source.line),r=3);let f={state_id:Id(d.slots[1],d.source.line),state_name:d.slots[2],description:d.content,...a.extend===void 0?{}:{extend:a.extend}};l?(l.states.length===0&&f.state_id!=="default"&&N("The first state of a new asset must be default.",d.source.line,f.state_id),l.states.push(f)):n.push({kind:"state",ownerId:p,value:f})}else s(d.source.line),N("Unknown create declaration.",d.source.line,d.type)}s(e.peek().line);let c=e.tag("create",!0);return $e(c,[]),n}function TE(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:Id(e.slice(n+1),t)};let i=e.indexOf(":"),r=i<0?e:e.slice(0,i);return["system","broadcast","offscreen","group"].includes(r)?i<0?{kind:r}:{kind:r,label:e.slice(i+1)}:N("Speaker is invalid.",t,e)}function yf(e){let t=ti(e);t.aliases!==void 0&&N("aliases cannot modify an Action.",e.peek().line,"aliases");let n=e.record();return n.type==="act"||n.type==="trans"?((n.slots.length!==1||!V("action",n.slots[0]))&&N("Narrative Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="act"?"action":"transition",content:n.content,...t.extend===void 0?{}:{extend:t.extend},...t.prompt===void 0?{}:{transition_prompt:t.prompt}}):n.type!=="dlg"&&n.type!=="think"?N("Unknown Action record.",n.source.line,n.type):((n.slots.length!==2&&n.slots.length!==3||!V("action",n.slots[0]))&&N("Speaking Action record is invalid.",n.source.line,n.type),{action_id:n.slots[0],type:n.type==="dlg"?"dialogue":"inner_thought",speaker:TE(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 hd(e,t){e.length===0&&N("Scene reference needs at least one state.",t,"<empty>");let n=e.map(o=>Id(o,t));return new Set(n).size!==n.length&&N("Scene reference repeats a state.",t,n.join(",")),n.sort()}function xd(e,t,n,o){$e(t,n===void 0?["id","parent"]:["id"]);let i=t.attrs.get("id")??"";V("scene",i)||N("Scene ID is invalid.",t.line,i);let r=t.attrs.get("parent")??n;r!==void 0&&!V("episode",r)&&N("Scene parent must be an Episode ID.",t.line,r);let s,c,a=[],d=[],p=new Set,l=new Set,f=0;for(;e.nextTag()?.name!=="body";){let m=e.record(),g=m.type==="environment"?0:m.type==="location"?1:m.type==="cast"?2:m.type==="prop"?3:-1;g<f&&N("Scene records are not in canonical order.",m.source.line,m.type),f=g,m.type==="environment"?(s!==void 0&&N("Scene environment is duplicated.",m.source.line,m.type),m.slots.length>2&&N("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&&N("Scene location is duplicated.",m.source.line,m.type),m.slots.length===0?c=null:(V("location",m.slots[0])||N("Location ref ID is invalid.",m.source.line,m.slots[0]),c={location_id:m.slots[0],state_ids:hd(m.slots.slice(1),m.source.line)})):m.type==="cast"?(V("actor",m.slots[0])||N("Cast ref ID is invalid.",m.source.line,m.slots[0]??""),p.has(m.slots[0])&&N("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:hd(m.slots.slice(1),m.source.line)})):m.type==="prop"?(V("prop",m.slots[0])||N("Prop ref ID is invalid.",m.source.line,m.slots[0]??""),l.has(m.slots[0])&&N("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:hd(m.slots.slice(1),m.source.line)})):N("Unknown scene header record.",m.source.line,m.type)}c===void 0&&N("Scene must declare location or [location].",e.peek().line,i);let u=e.tag("body",!1);$e(u,[]);let h=[];for(;e.nextTag()?.name!=="body"||e.nextTag()?.closing!==!0;)h.push(yf(e));return $e(e.tag("body",!0),[]),$e(e.tag("scene",!0),[]),{...r===void 0?{}:{parent:r},value:{scene_id:i,...s===void 0?{}:{environment:s},location:c,actors:a,props:d,actions:h,...o===void 0?{}:{extend:o}}}}function Sd(e,t,n){$e(t,["id"]);let o=t.attrs.get("id")??"";V("episode",o)||N("Episode ID is invalid.",t.line,o);let i,r,s=[],c=0;for(;e.nextTag()?.name!=="episode"||e.nextTag()?.closing!==!0;){let a=ti(e);(a.aliases!==void 0||a.prompt!==void 0)&&N("Invalid episode child modifier.",e.peek().line,"modifier");let d=e.nextTag();if(d?.name==="scene"&&!d.closing){c=2,e.take(),s.push(xd(e,d,o,a.extend).value);continue}a.extend!==void 0&&N("extend must precede a scene here.",e.peek().line,"extend");let p=e.record(),l=p.type==="title"?0:p.type==="synopsis"?1:-1;l<c&&N("Episode records are not in canonical order.",p.source.line,p.type),c=l,p.type==="title"?(i!==void 0&&N("Episode title is duplicated.",p.source.line,p.type),p.slots.length!==0&&N("Episode title takes no slots.",p.source.line,p.type),i=p.content):p.type==="synopsis"?(r!==void 0&&N("Episode synopsis is duplicated.",p.source.line,p.type),p.slots.length!==0&&N("Episode synopsis takes no slots.",p.source.line,p.type),r=p.content):N("Unknown episode record.",p.source.line,p.type)}return $e(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 yd(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]))&&N(`Span range must contain two ${t} IDs.`,e.line,n),[o[0],o[1]]}function VE(e,t,n){$e(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)&&N("Invalid script child modifier.",e.peek().line,"modifier");let h=e.nextTag();if(h?.name==="episode"&&!h.closing){f=8,e.take(),l.push(Sd(e,h,u.extend));continue}u.extend!==void 0&&N("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&&N("Script records are not in canonical order.",m.source.line,m.type),f=g,m.type!=="main-character"&&m.slots.length!==0&&N("Script metadata record takes no slots.",m.source.line,m.type),m.type==="title"?(o!==void 0&&N("Script title is duplicated.",m.source.line,m.type),o=m.content):m.type==="worldview"?(i!==void 0&&N("Script worldview is duplicated.",m.source.line,m.type),i=m.content):m.type==="worldview-raw"?(r!==void 0&&N("Script worldview-raw is duplicated.",m.source.line,m.type),r=m.content):m.type==="style"?(s!==void 0&&N("Script style is duplicated.",m.source.line,m.type),s=m.content):m.type==="synopsis"?(c!==void 0&&N("Script synopsis is duplicated.",m.source.line,m.type),c=m.content):m.type==="logline"?(a!==void 0&&N("Script logline is duplicated.",m.source.line,m.type),a=m.content):m.type==="theme"?(d!==void 0&&N("Script theme is duplicated.",m.source.line,m.type),d=m.content):m.type==="main-characters"?(p!==void 0&&N("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]}):N("Unknown script record.",m.source.line,m.type)}return $e(e.tag("script",!0),[]),(o===void 0||i===void 0||s===void 0)&&N("Script target needs title, worldview, and style.",e.peek().line,"script"),{kind:"script",value:{title:o,worldview:i,style:s,episodes:l,...r===void 0?{}:{worldview_raw:r},...c===void 0?{}:{synopsis:c},...a===void 0?{}:{logline:a},...d===void 0?{}:{theme:d},...p===void 0?{}:{main_characters:p},...n===void 0?{}:{extend:n}}}}function wf(e){let t=new _d(e),n=t.tag("authoring",!1);$e(n,["version"]),n.attrs.get("version")!=="1"&&N("authoring version must be 1.",1,n.attrs.get("version")??"<missing>");let o=t.nextTag()?.name==="create"?CE(t):[],i=[];for(;t.nextTag()?.name!=="authoring"||t.nextTag()?.closing!==!0;){let s=ti(t);(s.aliases!==void 0||s.prompt!==void 0)&&N("Invalid target modifier.",t.peek().line,"modifier");let c=t.take(),a=wd(c.raw,c.line);if((!a||a.closing)&&N("Expected an authoring target.",c.line,c.raw),a.name==="script")i.push(VE(t,a,s.extend));else if(a.name==="episode")i.push({kind:"episode",value:Sd(t,a,s.extend)});else if(a.name==="scene"){let d=xd(t,a,void 0,s.extend);d.parent||N("Top-level scene needs parent.",c.line,c.raw),i.push({kind:"scene",parent:d.parent,value:d.value})}else if(a.name==="episode-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),$e(a,["range"]);let[d,p]=yd(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)&&N("Invalid episode child modifier.",t.peek().line,"modifier");let u=t.tag("episode",!1);l.push(Sd(t,u,f.extend))}$e(t.tag("episode-span",!0),[]),i.push({kind:"episode-span",from:d,through:p,values:l})}else if(a.name==="scene-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),$e(a,["parent","range"]);let[d,p]=yd(a,"scene"),l=a.attrs.get("parent")??N("scene-span needs parent.",c.line,c.raw);V("episode",l)||N("scene-span parent must be an Episode ID.",c.line,l);let f=[];for(;t.nextTag()?.name!=="scene-span"||t.nextTag()?.closing!==!0;){let u=ti(t);(u.aliases!==void 0||u.prompt!==void 0)&&N("Invalid scene child modifier.",t.peek().line,"modifier");let h=t.tag("scene",!1);f.push(xd(t,h,l,u.extend).value)}$e(t.tag("scene-span",!0),[]),i.push({kind:"scene-span",parent:l,from:d,through:p,values:f})}else if(a.name==="action-span"){s.extend!==void 0&&N("A span cannot carry node extensions.",c.line,c.raw),$e(a,["parent","range"]);let[d,p]=yd(a,"action"),l=a.attrs.get("parent")??N("action-span needs parent.",c.line,c.raw);V("scene",l)||N("action-span parent must be a Scene ID.",c.line,l),$e(t.tag("body",!1),[]);let f=[];for(;t.nextTag()?.name!=="body"||t.nextTag()?.closing!==!0;)f.push(yf(t));$e(t.tag("body",!0),[]),$e(t.tag("action-span",!0),[]),i.push({kind:"action-span",parent:l,from:d,through:p,values:f})}else N("Unknown authoring target.",c.line,a.name)}$e(t.tag("authoring",!0),[]),(t.index!==t.lines.length||i.length===0)&&N("Authoring file has trailing content or no targets.",t.peek().line,"<root>");let r=i[0].kind;return i.every(s=>s.kind===r)||N("All targets must have the same kind.",1,r),{declarations:o,targets:i,targetKind:r}}function An(e){if(Array.isArray(e))return e.map(t=>An(t));if(oe(e)){let t={};for(let n of Object.keys(e).sort())t[n]=An(e[n]);return t}return e}function Ad(e){if(e.length===0)return[];let t={};for(let i of e){let r=O(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 _f(e,t){if(!(t.ok||e!==null&&Tc(Ue(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 Pe(e,t){throw new S(e,{exitCode:b,errorCode:"AUTHORING_APPLY_INVALID",data:{actual:t}})}function bd(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 $E(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):bd(e.values)}function DE(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 kd(e,t){return JSON.stringify(An(e))===JSON.stringify(An(t))}function Ef(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 xf(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 Sf(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 If(e,t){let n=e===null?[]:Sf(e),o=Sf(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 GE(e,t){for(let n of t)if(n.kind==="actor")e.actors.some(o=>o.actor_id===n.value.actor_id)&&Pe("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)&&Pe("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)&&Pe("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||Pe("State declaration owner was not found.",[n.ownerId]),o.states.some(i=>i.state_id===n.value.state_id)&&Pe("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)&&Pe("Span endpoint was not found.",[t,n]),[Math.min(o,i),Math.max(o,i)]}function BE(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 JE(e,t){let n=-1;for(let o of t){let[i,r]=BE(e,o);i<=n&&Pe("Replace targets must follow current document order without overlap.",[vf(o)]),n=r}}function vf(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 Af(e,t){if(t.kind==="script")return{...So(e.episodes),siblings:0};if(t.kind==="episode"){let r=xn(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=jn(e,t.value.scene_id),s=xn(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=xn(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=jn(e,t.parent)?.scene;if(!n)return{...bd([]),siblings:0};let[o,i]=Wt(n.actions.map(r=>r.action_id),t.from,t.through);return{...bd(n.actions.slice(o,i+1)),siblings:n.actions.length-(i-o+1)}}function kf(e,t){let n=$E(e),o=new Set(t.ids),i=new Set(n.ids);return{kind:e.kind,address:vf(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 KE(e,t){if(t.kind==="script"&&Pe("An existing Script v4 is not replaced through a script root.",["script"]),t.kind==="episode"){let n=xn(e,t.value.episode_id);n||Pe("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&&Pe("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)&&Pe("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=xn(e,t.parent)?.episode;n||Pe("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&&Pe("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||Pe("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&&Pe("Action span replacement cannot be empty.",[t.from,t.through]),n.actions.splice(o,i-o+1,...structuredClone(t.values))}}function jE(e,t){if(t.kind==="episode")e.episodes.push(structuredClone(t.value));else if(t.kind==="scene"){let n=xn(e,t.parent)?.episode;n||Pe("Scene create parent was not found.",[t.parent]),n.scenes.push(structuredClone(t.value))}else Pe("This target kind does not support create against an existing script.",[t.kind])}function bf(e){if(e.targets.length!==1||e.targets[0].kind!=="script")return Pe("Script create requires exactly one script target.",[e.targetKind]);if(e.declarations.some(n=>n.kind==="state"))return Pe("Standalone state declarations need an existing owner.",["state"]);let t=e.targets[0];return{version:4,...structuredClone(t.value),...DE(e.declarations)}}function Of(e,t,n){let o;if(e===null)n!=="create"&&Pe("A missing target requires one script create target.",[n,t.targetKind]),o=bf(t);else if(n==="create"&&t.targetKind==="script")o=bf(t),kd(o,e)||Pe("Script create retry differs from the existing script.",["script"]);else{o=structuredClone(e),n==="replace"&&JE(e,t.targets),GE(o,t.declarations);let r=t.targets.map(a=>Af(e,a));if(n==="replace")for(let a of[...t.targets].reverse())KE(o,a);else for(let a of t.targets)jE(o,a);let s=t.targets.map((a,d)=>kf(a,r[d])),c=Ue(o);return _f(e,c),{script:o,changed:!kd(e,o),validation:c,targets:s,declarations:Ef(e,t.declarations),retainedOrphanAssets:xf(o),identity:If(e,o)}}let i=Ue(o);return _f(e,i),{script:o,changed:e===null||!kd(e,o),validation:i,declarations:Ef(e,t.declarations),retainedOrphanAssets:xf(o),identity:If(e,o),targets:t.targets.map(r=>{let s=e===null?{...So([]),siblings:0}:Af(e,r);return kf(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 zE(e){(!e||e==="-")&&ni("Authoring input must be a named file.",[e||"<missing>"]);let t=Rf.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()||ni("Authoring input must be a regular file.",[t]);let o=Gr.readFileSync(t);return{absolutePath:t,bytes:o,text:o.toString("utf-8")}}function HE(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=Hs(n);return{script:o,baseline:Je(o),fingerprint:t}}function QE(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 Mf(e){return`sha256:${_e(JSON.stringify(e))}`}function FE(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 YE(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 qE(e,t,n,o,i){let r=wf(t.text),s=i.script===null?null:En(i.script),c=Of(s,r,n),a=`sha256:${vd.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=Mf(d),l=e.apply===!0,f=O(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?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 Lf(e){let t=Array.isArray(e._args)?e._args:[],n=typeof t[0]=="string"?t[0]:"",o=zE(n),i=QE(e),r=me(e),s=HE(r);if(s.script===null||s.script.version===4)return qE(e,o,i,r,s);let c=hf(o.text),a=ff(Tt(s.script),c,i),d=`sha256:${vd.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=Mf(p),f=e.apply===!0,u=O(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?Lr(r,s.fingerprint):Gt(r,s.baseline),Fe(r,a.script));let h=FE(a);return[{text:[`${f?"Applied":"Planned"} ${a.targets.length} ${c.targetKind} target(s); episodes ${h.before.episodes}\u2192${h.after.episodes}, scenes ${h.before.scenes}\u2192${h.after.scenes}, actions ${h.before.actions}\u2192${h.after.actions}`,`plan: ${l}`,...YE(a)].join(`
|
|
133
|
+
`),data:{op:"write",changed:a.changed,source_path:o.absolutePath,source_digest:d,script_path:r,baseline:s.baseline,script_hash:s.baseline==="missing"?null:s.baseline,plan_digest:l,plan:p.plan,mode:i,target_kind:c.targetKind,targets:a.targets,declarations:a.declarations,counts:h,validation:a.validation,retained_orphan_assets:a.retainedOrphanAssets,applied:f,script_version:3}},G]}function Uf(e){return Array.isArray(e.rows)}function ZE(e){return e.endsWith(`
|
|
134
134
|
`)?e:`${e}
|
|
135
|
-
`}function
|
|
136
|
-
`)}function
|
|
135
|
+
`}function Nf(e){return Array.isArray(e)?e.map(t=>String(t).replace(/[\r\n]+/g," ")):[]}function WE(e){return e==null?"":(typeof e=="string"?e:JSON.stringify(e)).replace(/\t/g," ").replace(/\r?\n/g," ")}function XE(e){if(!Uf(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=>WE(n[o])).join(" "))].join(`
|
|
136
|
+
`)}function Pf(e,t,n,o){if(!(e.text===""&&Object.keys(e.data).length===0)){if(o==="addr"&&Uf(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(
|
|
140
|
-
`)}else{let n=
|
|
139
|
+
`)}else process.stdout.write(ZE(XE(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=Nf(e.data.actual),o=Nf(e.data.expected),r=[`error: ${n.length>0?`${e.message.replace(/\.$/,"")}: ${n[0]}`:e.message}`];n.length>1&&r.push(`actual: ${n.slice(1).join("; ")}`),o.length>0&&r.push(`expected: ${o.join("; ")}`),e.hint&&r.push(e.hint),process.stderr.write(`${r.join(`
|
|
141
141
|
`)}
|
|
142
|
-
`)}return e.exitCode}var
|
|
142
|
+
`)}return e.exitCode}var Od=new WeakMap;function ex(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase()}function tx(e){return Object.fromEntries(Object.entries(e).map(([t,n])=>[ex(t),n]))}function nx(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=tx(nx(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]=Od.get(o)==="write"?await Bs(me(r),s):await s();Pf(c,a,t.jsonMode,t.format),t.exitCode=a}}function Re(e,t){return e.registeredArguments.forEach((n,o)=>{n.description=t[o]??""}),e}function ee(e,t="write"){return Od.set(e,t),e.option("-p, --script-path <path>","Script JSON file (default: ./workspace/script.json)")}function Rd(e){return Od.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 Cf(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(Lf,t));Re(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(Ju,t));Re(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=>tf(c,d),t))}}import*as ta from"node:fs";import*as Td from"node:path";import*as Nd from"node:fs";import*as ji from"node:path";import{fileURLToPath as ox}from"node:url";var Ld="@lingjingai/scriptctl",Md="";function Ud(){if(Md)return Md;let e=ji.dirname(ox(import.meta.url));for(;;){try{let n=Nd.readFileSync(ji.join(e,"package.json"),"utf-8");if(JSON.parse(n).name===Ld)return Md=e,e}catch{}let t=ji.dirname(e);if(t===e)throw new Error(`${Ld} package root not found`);e=t}}function zi(){let e=Nd.readFileSync(ji.join(Ud(),"package.json"),"utf-8"),t=JSON.parse(e).version;if(typeof t!="string")throw new Error(`${Ld} package.json has no string version`);return t}var Tf=/^\d+\.\d+\.\d+$/,ix="unreleased";function Vf(){return Td.join(Ud(),"changes")}function rx(){return zi()}function Jr(e){if(!Tf.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 Cd(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 sx(){let e=Vf();return ta.readdirSync(e).filter(t=>t.endsWith(".md")).map(t=>t.slice(0,-3)).filter(t=>Tf.test(t)).sort(Cd)}function ea(e){return ta.readFileSync(Td.join(Vf(),`${e}.md`),"utf-8").trimEnd()}function Pd(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 ax(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 cx(e){return e.map(ea).join(`
|
|
143
143
|
|
|
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(FE);return[{text:d,data:{content:d,versions:[],unreleased:!0}},G]}let s=qE(),c=YE();if(n){if(Gr(n),!s.includes(n))throw Rd(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 Rd(d,s);let p=s.filter(f=>Md(f,o)>0&&Md(f,d)<=0);if(p.length===0)throw ZE(o,d);let l=WE(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},G]}if(!s.includes(c))throw Rd(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 e5}from"node:module";import*as Hn from"node:fs";import*as Io from"node:path";import*as Pf from"node:os";import{fileURLToPath as XE}from"node:url";function Uf(e){return e.startsWith("~")?Io.join(Pf.homedir(),e.slice(1)):e}function ex(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 Nd(){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=XE(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 Nd()){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),ex(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 Ud(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 tx}from"yaml";function ae(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var kn={"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(kn).filter(Pd);function Pd(e){return Object.hasOwn(kn,e)}var nx=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts","videoResponseSchemaField","videoUploadMode","documentResponseSchemaField","documentUploadMode"]),ox=new Set(["provider","model","thinking","reasoning","temperature","fallbacks"]),ix=new Set(["env"]),rx=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 Dd(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 Gd(e,t="provider base URL"){return Dd(e,t)}function sx(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ao(e,t){if(!sx(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 $d(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 ax(e,t){let n=Ao(t,`providers.${e}`);Jr(n,nx,`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:Dd(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,ix,`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:$d(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:$d(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 cx(e,t,n){let o=Ao(t,`models.${e}`);Jr(o,ox,`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,rx,`models.${e}.thinking`),s.thinkingBudgetTokens=$d(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function dx(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]=ax(a,d);let r=Ao(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=cx(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(!Pd(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 Fn={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"},Bd="gemini-3.8-flash-anci",Cd={protocol:"google-gemini",baseUrl:"http://15.204.107.123:3000",apiKeyEnv:"MSUICODE_VERTEX_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64"},Td=["review-msuicode-gcp","review-msuicode-t3","review-tuzi","review-doubao-lite","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:oi,"nnyyai-ci":{...oi,apiKeyEnv:"NNYYAI_CI_API_KEY"},"msuicode-vertex":{...Cd},"msuicode-gcp":{...Cd,apiKeyEnv:"MSUICODE_GCP_API_KEY"},"msuicode-t3":{...Cd,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-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:Bd},"ingest-comic":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-text":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Td},"review-comic":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Td},"review-agent":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Td},"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 px(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?Dd(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 lx(){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 Vd(e){if(!Kr.existsSync(e))throw ve("LLM configuration file does not exist.",[e]);let t=tx(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 dx(n,Br.resolve(e))}function bo(e){let t=(e??"").trim();if(t)return Vd(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return Vd(n);let o=lx();return Kr.existsSync(o)?Vd(o):px()}import*as Xf from"node:crypto";import*as qd from"node:fs";import mx,{APIConnectionError as gx,APIConnectionTimeoutError as hx,APIError as yx,APIUserAbortError as wx}from"@anthropic-ai/sdk";var Jd=1e8;function ux(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??ux(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function fx(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 fx(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 wx)return new T("request_failed","Anthropic request was aborted.");if(e instanceof hx)return new T("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof gx)return new T("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof yx){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 mx({...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 Hd from"node:fs";import*as Qd from"node:path";import{File as Ax}from"node:buffer";import{Agent as kx,fetch as ea,FormData as bx}from"undici";function _x(e){return typeof e=="object"&&e!==null}function Kd(e){let t=[],n=new Set,o=e;for(;_x(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function Xs(e){for(let t of Kd(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function Ex(e){for(let t of Kd(e))if(typeof t.code=="string")return t.code}function xx(e){for(let t of Kd(e))if(typeof t.name=="string")return t.name}function Sx(e){let t=xx(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function Ix(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=Ex(e),s=Sx(e)?{failure_type:"timeout",failure_code:"request_timeout"}:Ix(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 vx=2e3;function Ox(e){return new Promise(t=>setTimeout(t,e))}function jd(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 Rx(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 Mx(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??Lx(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 jd(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 Ox(vx);let r;try{r=await this.client.getFile({id:t})}catch(s){throw jd(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?Hd.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?Qd.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 jd(f,n,"generate",this.model)}let d=(a.status??"").toLowerCase(),p=Rx(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=Mx(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}}},zd=class extends Error{constructor(n,o){super(o);this.status=n;this.name="HttpError"}status};function Lx(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new kx({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 zd(a.status,d.slice(0,500))}return{async uploadFile({filePath:a,mimeType:d,fps:p}){let l=new bx,f=Hd.readFileSync(a);l.append("file",new Ax([f],Qd.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 Nx}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 Nx({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 Gx}from"node:module";import*as oa from"node:fs";import*as Ux from"node:http";import*as Px from"node:https";import{HttpsProxyAgent as Cx}from"https-proxy-agent";var jf="https://generativelanguage.googleapis.com";function Tx(e,t){let n=new URL(e??jf);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function Vx(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 $x(e){return e?new Cx(e):void 0}function Kf(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?Ux:Px).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 Dx(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:$x(e.proxyUrl??""),timeout:e.timeoutMs},i=Tx(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=Dx(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=Vx(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 Bx=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),Jx=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function Fd(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 Kx(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 zx(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 Hx=2e3;function Qx(e){return new Promise(t=>setTimeout(t,e))}function Yd(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??Yx(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 Yd(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 Qx(Hx),!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 Yd(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
|
|
144
|
+
`)}function $f(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=ea(ix);return[{text:d,data:{content:d,versions:[],unreleased:!0}},G]}let s=sx(),c=rx();if(n){if(Jr(n),!s.includes(n))throw Pd(n,s);let d=ea(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 Pd(d,s);let p=s.filter(f=>Cd(f,o)>0&&Cd(f,d)<=0);if(p.length===0)throw ax(o,d);let l=cx(p);return[{text:l,data:{content:l,versions:p,from:o,to:d,unreleased:!1}},G]}if(!s.includes(c))throw Pd(c,s);let a=ea(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 p5}from"node:module";import*as Hn from"node:fs";import*as Io from"node:path";import*as Gf from"node:os";import{fileURLToPath as dx}from"node:url";function Df(e){return e.startsWith("~")?Io.join(Gf.homedir(),e.slice(1)):e}function px(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 Vd(){let e=[],t=(process.env.SCRIPTCTL_ENV_FILE??"").trim();t&&e.push(Df(t));let n=(process.env.SCRIPTCTL_SKILL_DIR??"").trim();n&&e.push(Io.join(Df(n),".env"));let o;try{o=dx(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 Bf(){let e=process.env.SCRIPTCTL_NO_DOTENV;if(e==="1"||e==="true"||e==="True")return;let t=new Set;for(let n of Vd()){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),px(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 $d(e,t){if(e.updateEpisodeCount)try{await e.updateEpisodeCount(t)}catch{}}function Jf(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 jf from"node:os";import*as Kr from"node:path";import{parseDocument as lx}from"yaml";function ae(e,t,n){return{id:e,mode:t,version:"1",maxOutputTokens:n,defaultProfile:"default"}}var kn={"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)},Kf=Object.keys(kn).filter(Dd);function Dd(e){return Object.hasOwn(kn,e)}var ux=new Set(["protocol","baseUrl","apiKey","timeoutMs","maxAttempts","videoResponseSchemaField","videoUploadMode","documentResponseSchemaField","documentUploadMode"]),fx=new Set(["provider","model","thinking","reasoning","temperature","fallbacks"]),mx=new Set(["env"]),gx=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 jd(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 zd(e,t="provider base URL"){return jd(e,t)}function hx(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ao(e,t){if(!hx(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 Kd(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 yx(e,t){let n=Ao(t,`providers.${e}`);jr(n,ux,`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:jd(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,mx,`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:Kd(n.timeoutMs,`providers.${e}.timeoutMs`,1),maxAttempts:Kd(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 wx(e,t,n){let o=Ao(t,`models.${e}`);jr(o,fx,`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,gx,`models.${e}.thinking`),s.thinkingBudgetTokens=Kd(c.budgetTokens,`models.${e}.thinking.budgetTokens`,1024)}return s}function _x(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]=yx(a,d);let r=Ao(n.models,"models"),s={};for(let[a,d]of Object.entries(r))s[a]=wx(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(!Dd(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 Fn={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"},Hd="gemini-3.8-flash-anci",Gd={protocol:"google-gemini",baseUrl:"http://15.204.107.123:3000",apiKeyEnv:"MSUICODE_VERTEX_API_KEY",timeoutMs:6e5,maxAttempts:3,videoResponseSchemaField:"responseSchema",videoUploadMode:"base64"},Bd=["review-msuicode-gcp","review-msuicode-t3","review-tuzi","review-doubao-lite","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:oi,"nnyyai-ci":{...oi,apiKeyEnv:"NNYYAI_CI_API_KEY"},"msuicode-vertex":{...Gd},"msuicode-gcp":{...Gd,apiKeyEnv:"MSUICODE_GCP_API_KEY"},"msuicode-t3":{...Gd,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-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:Hd},"ingest-comic":{provider:"nnyyai",model:"gemini-3.8-flash"},"review-text":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Bd},"review-comic":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Bd},"review-agent":{provider:"msuicode-vertex",model:"gemini-3.8-flash",temperature:0,fallbacks:Bd},"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 Ex(){let e=(process.env.PROJECT_LITELLM_GATEWAY_BASE_URL??"").trim(),t=e?jd(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 xx(){let e=(process.env.XDG_CONFIG_HOME??"").trim();return e?Kr.join(e,"scriptctl","llm.yaml"):Kr.join(jf.homedir(),".config","scriptctl","llm.yaml")}function Jd(e){if(!zr.existsSync(e))throw ve("LLM configuration file does not exist.",[e]);let t=lx(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 _x(n,Kr.resolve(e))}function bo(e){let t=(e??"").trim();if(t)return Jd(t);let n=(process.env.SCRIPTCTL_LLM_CONFIG??"").trim();if(n)return Jd(n);let o=xx();return zr.existsSync(o)?Jd(o):Ex()}import*as rm from"node:crypto";import*as tp from"node:fs";import Ax,{APIConnectionError as kx,APIConnectionTimeoutError as bx,APIError as vx,APIUserAbortError as Ox}from"@anthropic-ai/sdk";var Qd=1e8;function Sx(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??Sx(t),{retryable:this.retryable,message:n,...o.context,...this.details.length>0?{details:this.details}:{}}),this.modelFailures=o.modelFailures??[]}};function Ix(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 Ix(Math.min(3e4,1e3*2**(o-1)))}throw new Error("unreachable retry state")}function zf(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 Hf(e){if(e instanceof T)return e;if(e instanceof Ox)return new T("request_failed","Anthropic request was aborted.");if(e instanceof bx)return new T("timeout","Anthropic request timed out.",{retryable:!0});if(e instanceof kx)return new T("request_failed","Anthropic connection failed.",{retryable:!0,details:[e.message.slice(0,500)]});if(e instanceof vx){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 na=class{constructor(t,n,o){this.provider=t;this.model=n;let i={apiKey:o};t.baseUrl&&(i.baseURL=t.baseUrl),this.client=new Ax({...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=zf(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 Hf(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=zf(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 Hf(o)}});return{...n.value,attempts:n.attempts,usage:Xt(n.failedUsage,n.value.usage)}}};import*as Zd from"node:fs";import*as Wd from"node:path";import{File as Px}from"node:buffer";import{Agent as Cx,fetch as ia,FormData as Tx}from"undici";function Rx(e){return typeof e=="object"&&e!==null}function Fd(e){let t=[],n=new Set,o=e;for(;Rx(o)&&!n.has(o);)n.add(o),t.push(o),o=o.cause;return t}function oa(e){for(let t of Fd(e)){if(typeof t.status=="number")return t.status;if(typeof t.statusCode=="number")return t.statusCode}return null}function Mx(e){for(let t of Fd(e))if(typeof t.code=="string")return t.code}function Lx(e){for(let t of Fd(e))if(typeof t.name=="string")return t.name}function Nx(e){let t=Lx(e);return t==="AbortError"||t==="TimeoutError"||t==="RequestTimeoutError"||t==="APIConnectionTimeoutError"}function Ux(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=Mx(e),s=Nx(e)?{failure_type:"timeout",failure_code:"request_timeout"}:Ux(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 Vx=2e3;function $x(e){return new Promise(t=>setTimeout(t,e))}function Yd(e,t,n,o){if(e instanceof T)return e;let i=e instanceof Error?e.message:String(e),r=oa(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 Dx(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 Gx(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 ra=class{constructor(t,n,o,i,r,s){this.model=t;this.timeoutMs=n;this.maxAttempts=o;this.client=s??Bx(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 Yd(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 $x(Vx);let r;try{r=await this.client.getFile({id:t})}catch(s){throw Yd(s,n,"file_poll",this.model)}i=(r.status??"").toLowerCase()}if(i==="failed"||i==="error")throw new 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?Zd.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?Wd.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 Yd(f,n,"generate",this.model)}let d=(a.status??"").toLowerCase(),p=Dx(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=Gx(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 Bx(e,t,n){let o=t.replace(/\/$/,""),i={Authorization:`Bearer ${e}`},r=new Cx({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 Tx,f=Zd.readFileSync(a);l.append("file",new Px([f],Wd.basename(a),{type:d})),l.append("purpose","user_data"),l.append("preprocess_configs[video][fps]",String(p));let u=await ia(`${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 ia(`${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 ia(`${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 ia(`${o}/files/${a}`,{method:"DELETE",headers:i,signal:s(),dispatcher:r});d.ok||await c(d)}}}import{GoogleAuth as Jx}from"google-auth-library";function sa(){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 Qf=new Jx({scopes:["https://www.googleapis.com/auth/cloud-platform"]});function Hr(){return process.env.VERTEX_LOCATION||process.env.GOOGLE_CLOUD_LOCATION||"global"}function Ff(){let e=Hr();return`https://${e==="global"?"aiplatform":`${e}-aiplatform`}.googleapis.com`}import*as Xf from"node:fs";import{createRequire as qx}from"node:module";import*as aa from"node:fs";import*as Kx from"node:http";import*as jx from"node:https";import{HttpsProxyAgent as zx}from"https-proxy-agent";var qf="https://generativelanguage.googleapis.com";function Hx(e,t){let n=new URL(e??qf);return n.pathname=`${n.pathname.replace(/\/+$/,"")}/upload/v1beta/files`,n.searchParams.set("key",t),n}function Qx(e,t){let n=new URL(t??qf),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 Fx(e){return e?new zx(e):void 0}function Yf(e,t,n,o){return new Promise((i,r)=>{let c=(e.protocol==="http:"?Kx:jx).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 Yx(e,t){let n=e[t];return Array.isArray(n)?n[0]??"":n??""}async function Zf(e){let t=aa.statSync(e.filePath).size,o={agent:Fx(e.proxyUrl??""),timeout:e.timeoutMs},i=Hx(e.baseUrl,e.apiKey),r=l=>Hi(l,e.apiKey),s;try{s=await Yf(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=Yx(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=Qx(c,e.baseUrl),d;try{d=await Yf(a,{...o,method:"POST",headers:{"Content-Length":String(t),"X-Goog-Upload-Offset":"0","X-Goog-Upload-Command":"upload, finalize"}},aa.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 Zx=new Set(["SAFETY","PROHIBITED_CONTENT","RECITATION","BLOCKLIST","SPII","IMAGE_SAFETY","IMAGE_PROHIBITED_CONTENT","IMAGE_RECITATION","ESCALATION"]),Wx=new Set(["LANGUAGE","OTHER","MALFORMED_FUNCTION_CALL","IMAGE_OTHER","NO_IMAGE","UNEXPECTED_TOOL_CALL","TOO_MANY_TOOL_CALLS","MISSING_THOUGHT_SIGNATURE","MALFORMED_RESPONSE"]);function Xd(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 Wf(e){if(e?.length)return e.map(t=>({category:t.category??"UNSPECIFIED",probability:t.probability??"UNSPECIFIED",blocked:t.blocked??!1}))}function Xx(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 e5(e){return/-c\d+$/.test(e)}function t5(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 n5=2e3;function o5(e){return new Promise(t=>setTimeout(t,e))}function ep(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:{...kr(e.failure),provider:i,model:r,operation:n},modelFailures:e.modelFailures});let s=Hi(e instanceof Error?e.message:String(e),o),c=oa(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??r5(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:Xf.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 ep(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 o5(n5),!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 ep(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&&e5(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,133 +150,134 @@ ${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="",y={},_=await this.client.models.generateContentStream(s);for await(let x of _)x.text&&(w+=x.text),y={...y,...x,usageMetadata:x.usageMetadata??y.usageMetadata,promptFeedback:x.promptFeedback??y.promptFeedback,candidates:x.candidates??y.candidates};p={...y,text:w}}else p=await this.client.models.generateContent(s)}catch(w){throw
|
|
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="",y={},_=await this.client.models.generateContentStream(s);for await(let x of _)x.text&&(w+=x.text),y={...y,...x,usageMetadata:x.usageMetadata??y.usageMetadata,promptFeedback:x.promptFeedback??y.promptFeedback,candidates:x.candidates??y.candidates};p={...y,text:w}}else p=await this.client.models.generateContent(s)}catch(w){throw ep(w,t.signal,"generate",this.apiKey,this.model.provider,this.model.model)}let l=p.candidates?.[0],f=l?.finishReason??"",u=p.promptFeedback?.blockReason??"",h=Xx(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:h,context:m});if(u)throw new T("content_filtered",`Gemini blocked the prompt (blockReason=${u}).`,{usage:h,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"prompt",provider_reason:Xd(u),...Xd(u)==="UNKNOWN"?{provider_reason_raw:u}:{},safety_ratings:Wf(p.promptFeedback?.safetyRatings)}});if(Zx.has(f))throw new T("content_filtered",`Gemini filtered the response (finishReason=${f}).`,{usage:h,classification:{failure_type:"policy",failure_code:"content_blocked"},context:{...m,provider_source:"candidate",provider_reason:Xd(f),finish_message:l?.finishMessage,safety_ratings:Wf(l?.safetyRatings)}});let g=(p.text??"").trim();if(!g)throw Wx.has(f)?new T("invalid_response",`Gemini returned no usable response (finishReason=${f}).`,{usage:h,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:h,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:h,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:h,context:{...m,provider_reason_raw:"missing_finish_reason"}});if(t.responseJsonSchema)try{let w=o?t5(g):g;return JSON.parse(w),{text:w,finishReason:f,usage:h,raw:p}}catch{throw new T("invalid_response","Gemini returned malformed JSON for a structured media response.",{retryable:!0,usage:h,context:m})}return{text:g,finishReason:f,usage:h,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){}}},i5=qx(import.meta.url);function r5(e,t,n,o){let{GoogleGenAI:i}=i5("@google/genai"),r=new i({...o?{vertexai:!0,project:sa(),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
|
|
154
154
|
Gemini \u4E0A\u4F20\u4F1A\u6210\u529F\u3001\u968F\u540E\u7684\u6587\u4EF6\u8F6E\u8BE2/\u751F\u6210\u4F1A\u6302\uFF08Node \u5185\u7F6E fetch \u9ED8\u8BA4\u4E0D\u8D70\u4EE3\u7406\uFF09\u3002
|
|
155
155
|
\u8BF7\u5728\u547D\u4EE4\u524D\u52A0 NODE_USE_ENV_PROXY=1 \u91CD\u8DD1\u3002
|
|
156
|
-
`),{files:{upload:c=>
|
|
157
|
-
`).trim():""}function 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`:qx(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=Zx(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(!Yn(d)||!Yn(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 Wx={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}},Zd=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function Wd(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function Hr(e,t,n){let o=kn[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:Wd(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 De(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(yn)})}function Xx(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,...Zd.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=kn[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 De("The task route references a missing model profile.",[i],[`task: ${t}`]);let s=this.config.providers[r.provider];if(!s)throw De("The model profile references a missing provider.",[r.provider],[`profile: ${i}`]);if(s.protocol==="openai-compatible"&&!s.baseUrl)throw De("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 De("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 De("The thinking token budget must be smaller than the task output budget.",[`thinking budget < ${o.maxOutputTokens}`],[`task: ${t}`,`thinking budget: ${r.thinkingBudgetTokens}`]);let c=o.mode==="video"?this.options.videoProvider:void 0,a=c?.baseUrl?{...s,protocol:"google-gemini",baseUrl:Gd(c.baseUrl,"--provider-base-url")}:s,d=c?.model?{...r,model:c.model.trim()}:r;if(c?.model!==void 0&&!d.model)throw De("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=Wx[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 De("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?Gd(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 De("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!==Bd||Wd(t.info.baseUrl)!==oi.baseUrl)return aa(t);if(!(process.env[oi.apiKeyEnv]??"").trim())return[t];let n={provider:"nnyyai",model:Zd[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[Fn.apiKeyEnv]??"").trim()||Wd(t.providerConfig.baseUrl)===Fn.baseUrl?[]:Zd.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:Hr(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 De("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:qd.readFileSync(n,"base64"),mimeType:o}}documentPort(t){if(kn[t].mode!=="document")throw De("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 De("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 (${yn(d.failure)})
|
|
158
|
-
`),a={kind:"base64",data:
|
|
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 Qr=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 ca=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 em(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 s5(e){let t=e.trim().replace(/\/+$/,"");return t.endsWith("/chat/completions")?t:t.endsWith("/v1")?`${t}/chat/completions`:`${t}/v1/chat/completions`}function tm(e){return!Yn(e)||!Array.isArray(e.choices)?null:e.choices.find(Yn)??null}function nm(e){return e&&typeof e.finish_reason=="string"?e.finish_reason:""}function im(e){return e&&Yn(e.message)?e.message:null}function a5(e){let t=im(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 om(e){try{return JSON.parse(e)}catch{throw new T("invalid_response","Provider returned invalid JSON.",{details:[e.slice(0,500)]})}}var da=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"?`${Ff()}/v1/projects/${sa()}/locations/${Hr()}/endpoints/openapi/chat/completions`:t.protocol==="google-gemini"?`${t.baseUrl.trim().replace(/\/+$/,"")}/v1beta/openai/chat/completions`:s5(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 Qf.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 om(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,em(n,this.provider.protocol==="google-vertex"||this.provider.protocol==="google-gemini"));try{let s=tm(n),c=nm(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=a5(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,em(n,this.provider.protocol==="google-vertex"||this.provider.protocol==="google-gemini"));try{let s=tm(n),c=nm(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=im(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:om(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 c5={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}},np=["gemini-3.8-flash","gemini-3.7-flash","gemini-3.6-flash"];function op(e){return e?.trim().replace(/\/+$/,"")??"anthropic-sdk-default"}function Fr(e,t,n){let o=kn[e],i=JSON.stringify({task:e,taskVersion:o.version,protocol:t.protocol,baseUrl:op(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 rm.createHash("sha256").update(i).digest("hex")}function De(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),{...kr(e.failure),provider:t.provider,model:t.model,retryable:e.failure.retryable,message:e.message})}function pa(e,t){if(t.length===1)return e;let n=Au(t,"All configured model routes failed.");return new T(e.code,n.message,{retryable:n.retryable,classification:Ui(n),context:kr(n),modelFailures:t,details:t.map(yn)})}function d5(e){return["google-gemini","google-vertex"].includes(e.protocol)||/(^|\/)gemini-/i.test(e.model)}function la(e){let t=e.info.model.slice(0,e.info.model.lastIndexOf("/")+1);return[...new Set([e.info.model,...np.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 vo(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=kn[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 De("The task route references a missing model profile.",[i],[`task: ${t}`]);let s=this.config.providers[r.provider];if(!s)throw De("The model profile references a missing provider.",[r.provider],[`profile: ${i}`]);if(s.protocol==="openai-compatible"&&!s.baseUrl)throw De("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 De("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 De("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:zd(c.baseUrl,"--provider-base-url")}:s,d=c?.model?{...r,model:c.model.trim()}:r;if(c?.model!==void 0&&!d.model)throw De("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 Kf.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=c5[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 De("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?zd(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:Fr(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 na(t.providerConfig,t.modelConfig,i):new da(t.providerConfig,t.modelConfig,i);return this.adapters.set(n,r),r}videoAdapter(t){if(!["google-gemini","google-vertex"].includes(t.providerConfig.protocol))throw De("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 ca(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!==Hd||op(t.info.baseUrl)!==oi.baseUrl)return la(t);if(!(process.env[oi.apiKeyEnv]??"").trim())return[t];let n={provider:"nnyyai",model:np[0]},o={providerConfig:oi,modelConfig:n,info:{...t.info,profile:"nnyyai-fallback",provider:"nnyyai",model:n.model,fingerprint:Fr(t.info.task,oi,n),videoUploadMode:"base64"}};return[t,...la(o)]}grsaiVideoRoutes(t){return!(process.env[Fn.apiKeyEnv]??"").trim()||op(t.providerConfig.baseUrl)===Fn.baseUrl?[]:np.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 De("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:tp.readFileSync(n,"base64"),mimeType:o}}documentPort(t){if(kn[t].mode!=="document")throw De("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 De("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 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(!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 (${yn(d.failure)})
|
|
158
|
+
`),a={kind:"base64",data:tp.readFileSync(s).toString("base64"),mimeType:"application/pdf"}}return r.set(a,s),a},generate:async s=>{let c=la(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(!vo(f,s.signal))throw f;let u=si(f,p.info);a.push(u);let h=c[d+1];if(h){process.stderr.write(`\u21AA\uFE0F ${p.info.model} \u6587\u6863\u8BF7\u6C42\u5931\u8D25\uFF0C\u5207\u6362\u5230 ${h.info.model} (${yn(u)})
|
|
159
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(y){if(!vo(y,s.signal))throw y;a.push(si(y,g.info)),m=y}}}throw
|
|
161
|
-
`);continue}if(!this.doubaoRoutes(t).some(h=>this.doubaoAdapter(h))||!r.localPath&&r.media.kind!=="local-fallback")throw
|
|
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?
|
|
160
|
+
`);try{return await this.tracked(g.info,()=>w.generateDocument(s,r.get(s.media)))}catch(y){if(!vo(y,s.signal))throw y;a.push(si(y,g.info)),m=y}}}throw pa(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=kn[t];if(n.mode!=="video")throw De("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 De("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 De("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 De("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} (${yn(f)})
|
|
161
|
+
`);continue}if(!this.doubaoRoutes(t).some(h=>this.doubaoAdapter(h))||!r.localPath&&r.media.kind!=="local-fallback")throw pa(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 De("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=kn[t];if(s.mode!=="video")throw De("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?pa(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 ra(o,r,s,n,i);return this.doubaoAdapters.set(c,d),d}async withTextFallback(t,n,o){let i=this.resolve(t),r=d5(i.info),s=r?la(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} (${yn(f)})
|
|
163
163
|
`);continue}let h=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)),h=w}}}throw
|
|
165
|
-
`),data:{checks:C}},G]}import{spawn as
|
|
166
|
-
`),data:{op:"update",changed:!1,update:a}},G];let d=await t(
|
|
167
|
-
`),Ro.renameSync(n,t),Q("commit",`${Ro.statSync(t).size} bytes -> ${t} (tmp + atomic rename)`)}var
|
|
168
|
-
# ${c}`:i}function
|
|
169
|
-
`)}var
|
|
170
|
-
`)
|
|
171
|
-
`)}})}}function
|
|
164
|
+
`);try{return await this.tracked(m.info,()=>o(g))}catch(w){if(!vo(w,n))throw w;c.push(si(w,m.info)),h=w}}}throw pa(h,c)}}throw new Error("Text model routes cannot be empty.")}async generateText(t,n){let o=kn[t];if(o.mode!=="text")throw De("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=kn[t];if(o.mode!=="tool")throw De("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 sm(e,t){return new Yr(bo(e),t)}var l5=p5(import.meta.url);function ua(e){try{return l5.resolve(e),!0}catch{return!1}}function u5(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 f5(){return ai.join(ai.dirname(ai.resolve("workspace")),"output")}function am(e={}){let t=Vd(),n=[],o=new Set;for(let M of t)try{if(!Bt.existsSync(M)||!Bt.statSync(M).isFile())continue;let j=Bt.realpathSync(M);if(o.has(j))continue;o.add(j),n.push(M)}catch{}let i=typeof e.llm_config=="string"?e.llm_config.trim():"",r=bo(i||void 0),c=new Yr(r).routes(),a=Object.entries(r.providers).map(([M,j])=>({alias:M,configured:!!(process.env[j.apiKeyEnv]??"").trim(),env:j.apiKeyEnv})),d=Object.entries(r.providers).filter(([,M])=>M.protocol==="openai-compatible").map(([M,j])=>{let Z="not set";if(j.baseUrl)try{Z=new URL(j.baseUrl).host}catch{Z=j.baseUrl}return{alias:M,host:Z}}),{mode:p}=Jf(),l=(process.env.SCRIPTCTL_OUTPUT_DIR??"").trim()||f5(),f=p==="local"?u5(l):null,u=!!process.env.AWB_BASE_URL,h=!!process.env.LINGJING_AWB_ACCESS_KEY,m=!!process.env.SANDBOX_PROJECT_GROUP_NO,g={"@anthropic-ai/sdk":ua("@anthropic-ai/sdk"),"@google/genai":ua("@google/genai"),jszip:ua("jszip"),"fast-xml-parser":ua("fast-xml-parser")},w=Object.entries(g).filter(([,M])=>!M).map(([M])=>M),y=process.versions.node,_=`env_file: ${n[0]??"missing"}`,x=M=>M?"configured":"not configured",A=[`node: ${y}`,"storage: local-filesystem",_,`llm config: ${r.source}`,`llm routes: ${c.length}`,...a.map(M=>`llm provider ${M.alias}: ${x(M.configured)}`),...d.map(M=>`llm provider ${M.alias} endpoint: ${M.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(h)}`),A.push(`gateway project identifier: ${x(m)}`));for(let[M,j]of Object.entries(g))A.push(`dependency ${M}: ${j?"ok":"missing"}`);let k=[];w.length>0&&k.push("Install missing CLI dependencies (see above)."),a.some(M=>!M.configured)&&k.push("Configure every credential referenced by the selected LLM configuration."),d.some(M=>M.host==="not set")&&k.push("An openai-compatible provider has no endpoint \u2014 set PROJECT_LITELLM_GATEWAY_BASE_URL (built-in gateway) or the provider's baseUrl."),p===null?k.push("Configure an output target before running `publish` / script CRUD."):p==="local"?f&&!f.writable&&k.push("Output target is not writable; check directory permissions."):(!u||!h||!m)&&k.push("Configure gateway credentials before running `publish` / script CRUD against the remote project."),k.length===0&&k.push("Environment looks ready.");let[U,v]=y.split(".").map(M=>parseInt(M,10)),I=(U??0)>20||(U??0)===20&&(v??0)>=0,R=p===null?{configured:!1}:p==="local"?{dir:{ok:!!f?.writable,writable:!!f?.writable,hasScript:!!f?.hasScript}}:{endpoint:{ok:u},access:{ok:h},project:{ok:m}},C={node:{version:y,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(M=>({alias:M.alias,ok:M.configured,credential_env:M.env,...d.find(j=>j.alias===M.alias)?{endpoint:d.find(j=>j.alias===M.alias).host}:{}})),profiles:Object.keys(r.models),routes:c.map(M=>({task:M.task,profile:M.profile,provider:M.provider,protocol:M.protocol,model:M.model}))},output:R,dependencies:g};return[{text:[...A,...k].join(`
|
|
165
|
+
`),data:{checks:C}},G]}import{spawn as m5}from"node:child_process";var fa="@lingjingai/scriptctl",g5=`${fa}@latest`,ip="npm";function h5(){return zi()}function y5(e){let t=/^(\d+)\.(\d+)\.\d+/.exec(e);return t?`${fa}@~${t[1]}.${t[2]}.0`:null}function w5(e){return["install","-g",e]}function _5(e,t){return[e,...t].join(" ")}function E5(e,t){return e.split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0).slice(-t)}function x5(e,t){return new Promise(n=>{let o=m5(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 cm(e,t=x5,n=h5){let o=!!e.patch,i=n(),r=o?y5(i):g5;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=[...w5(r)],c=_5(ip,s),a={package:fa,package_spec:r,command:ip,args:s,command_line:c};if(e.dry_run)return[{text:[`package: ${fa}`,`command: ${c}`,"dry-run: no update performed"].join(`
|
|
166
|
+
`),data:{op:"update",changed:!1,update:a}},G];let d=await t(ip,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)}`,...E5(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 dm(e,t){e.command("doctor").description("Check configuration and runtime dependencies").option("--llm-config <path>","LLM configuration file").action(H(am,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(cm,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($f,t));Re(n,["Release version"])}import{Option as FS}from"commander";import*as ui from"node:fs";import*as La from"node:path";import{fileURLToPath as LS,pathToFileURL as NS}from"node:url";import*as st from"node:fs";import*as rt from"node:path";import{createHash as eg}from"node:crypto";import{z as it}from"zod";import*as Ro from"node:fs";var pm=null,S5=0;function Q(e,t){pm&&pm.push({fn:e,note:t,ms:Math.round((performance.now()-S5)*100)/100})}var I5=[["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 qn(e,t,n,o){if(t){if(e.has(t)&&e.get(t)!==n){o.add(t);return}e.set(t,n)}}function sp(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 I5)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:rp(l.location,"location_id"),actors:Oo(l.actors).map(h=>rp(h,"actor_id")).filter(Boolean),props:Oo(l.props).map(h=>rp(h,"prop_id")).filter(Boolean),actions:[],raw:l,ep:p};Oo(l.actions).forEach((h,m)=>{c++;let g={anchor:n===4?ke(h.action_id):`${d+1}-${f+1}-${m+1}`,no:m+1,gno:c,type:ke(h.type)||"action",content:ke(h.content),speaker:A5(h.speaker),paren:typeof h.parenthetical=="string"?h.parenthetical:typeof h.emotion=="string"?h.emotion:void 0,ts:ke(h.extend?.timestamp)||void 0,raw:h,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 rp(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 A5(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 Ce(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)??k5(e,p);if(f){let u=f.states.filter(h=>h.id===l||h.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(h=>`${h.id}(${h.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 k5(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 bn(e){return e.episodes.flatMap(t=>t.scenes.flatMap(n=>n.actions))}var b5={ep:"episode",scn:"scene",ac:"action",act:"actor",loc:"location",prp:"prop",st:"state"};function Lo(e,t){let n=vr(b5[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}lm(e,e.path)}function lm(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 um={system:"\u65C1\u767D",broadcast:"\u5E7F\u64AD",offscreen:"\u753B\u5916",group:"\u7FA4\u58F0"},v5="\u5FC3\u58F0",fm=/^((?:\d+:)?\d+:\d{2}(?:\.\d{1,3})?)\s/,O5=/(^|[//,,、])\s*心声\s*(?=$|[//,,、])/g;function qr(e){let t=e.split("/").map(r=>r.trim()).filter(Boolean).join("/"),n=t.replace(O5,""),o=n!==t,i=o?n.replace(/^[\s//,,、]+/,"").trim():t;return{thought:o,...i?{paren:i}:{}}}function Yi(e){let t=e.match(/^([^()()::,。!?;]+?)\s*(?:[((](.*?)[))])?\s*[::]\s*([\s\S]*)$/);return t?{label:t[1].trim(),...t[2]===void 0?{}:{note:t[2]},content:t[3].trim()}:null}function qi(e,t){let n=e.assets.filter(r=>r.kind==="actor"),o=n.filter(r=>r.name===t||r.aliases.includes(t));if(o.length)return o.length===1?o[0]:void 0;let i=n.filter(r=>r.name.split(/[\s·]+/).includes(t));return i.length===1?i[0]:void 0}function mm(e){let t=new Set(Object.values(um));for(let n of e.assets){t.add(n.name);for(let o of n.aliases)t.add(o)}return n=>t.has(n)||!!qi(e,n)}function Zr(e,t,n=mm(e)){if(n(t))return{base:t};for(let o=t.lastIndexOf("\xB7");o>0;o=t.lastIndexOf("\xB7",o-1)){let i=t.slice(0,o);if(n(i))return{base:i,qualifier:t.slice(o+1)}}return null}function ma(e){let t=mm(e);return n=>!!Zr(e,n,t)}function gm(e,t){let n=Yi(e);return/^(→|\\|##)/.test(e)||fm.test(e)||n&&t(n.label)?`\\${e}`:e}function R5(e,t){if(t.kind)return um[t.kind]??t.kind;let n=ci(e,t.id);return t.state?`${n}\xB7${di(e,t.id,t.state)}`:n}function Wr(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?R5(e,t.speaker):"?",d=[t.type==="inner_thought"?v5:"",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 o.plain?t.content:gm(t.content,ma(e))})(),c=`${i}${i?" ":""}`;return`${o.timestamps?r+c:c+r}${s}`.replace(/\n/g,"\\n")}function ap(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 Zi(e,t){let n=[t.env?.space,t.env?.time].filter(Boolean).join("/").toUpperCase(),o=t.location?ap(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=>ap(e,a)).join(", "),s=t.props.map(a=>ap(e,a)).join(", "),c=[r&&`cast: ${r}`,s&&`props: ${s}`].filter(Boolean).join(" ");return c?`${i}
|
|
168
|
+
# ${c}`:i}function cp(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=>Wr(e,i,o,n))].join(`
|
|
169
|
+
`)}var M5=/^([A-Za-z][A-Za-z0-9_]*|\d+(?:-\d+){0,2})\s\s+/;function hm(e,t){let n=e.trimEnd();if(!n.trim())return null;let o,i=n.match(M5);i&&(o=i[1],n=n.slice(i[0].length));let r,s=n.match(fm);if(s&&(r=s[1],n=n.slice(s[0].length)),n.startsWith("\\"))return{anchor:o,ts:r,type:"action",content:n.slice(1).replace(/\\n/g,`
|
|
170
|
+
`).trim()};if(n=n.replace(/\\n/g,`
|
|
171
|
+
`),n.startsWith("\u2192"))return{anchor:o,ts:r,type:"transition",content:n.slice(1).trim()};let c=Yi(n);if(c&&t(c.label)){let{thought:a,paren:d}=qr(c.note??"");return{anchor:o,ts:r,type:a?"inner_thought":"dialogue",speakerName:c.label,paren:d,content:c.content}}return{anchor:o,ts:r,type:"action",content:n.trim()}}var L5=/^(scn[1-9A-HJ-NP-Za-km-z]{6}|scn_\d+)$/,N5=/^[A-Z.\/]+$/,U5=/^\d+\s+actions?$/,P5={EXT:"exterior",EXTERIOR:"exterior",INT:"interior",INTERIOR:"interior"};function ym(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 dp(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)||U5.test(i))){if(L5.test(i)){n.anchor=i;continue}if(N5.test(i)&&i!=="\u2014"){let[r,s]=i.split("/");r&&(n.env.space=P5[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 wm(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 lp(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 pp(e){try{return mo(e.timestamp??"")}catch(t){if(!(t instanceof tt))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 _m(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 up(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(h=>n.has(h.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(h=>h.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=pp(r),a=r,d=c,p="";for(let h of o){if(!h.timestamp)continue;let m=pp(h);m.milliseconds<d.milliseconds&&_m(a,h),a=h,d=m,h.address===s.address&&(p=m.canonical)}let l=e.findIndex(h=>h.address===s.address),f,u;for(let h=l+1;h<e.length;h+=1){let m=e[h];if(m.episodeId!==r.episodeId)break;if(!m.timestamp)continue;let g=pp(m);if(g.milliseconds<d.milliseconds&&_m(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 fp=["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 mp(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 gp(e,t,n={}){let o=n.offset??0,i=n.limit??20,r=n.context??3;for(let[f,u,h]of[["offset",o,0],["limit",i,1],["context",r,0]])if(!Number.isSafeInteger(u)||u<h)throw new Error(`${f} must be an integer >= ${h}`);let s=Ce(e,t);if(s.t!=="asset"&&s.t!=="state")throw new Error("references requires an asset or asset/state address; use read for episodes/scenes/actions");let c=s.asset,a=s.t==="state"?s.state.id:null,d=[...new Set([c.id,c.name,...c.aliases])].filter(Boolean),p=[];for(let f of e.episodes)for(let u of f.scenes){let h=[...u.location?[u.location]:[],...u.actors,...u.props].filter(m=>m.id===c.id&&(a===null||m.states.includes(a)));h.length&&p.push({kind:"scene_binding",scene:u,matched:h.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:h,matched:m})=>{let g=h?u.actions.indexOf(h):-1,w=h?u.actions.slice(Math.max(0,g-r),g+r+1):[],y=Math.max(0,...w.map(_=>_.anchor.length));return{kind:f,address:h?.anchor??u.anchor,scene_address:u.anchor,episode:u.ep.no,matched:m,text:[Zi(e,u),...w.map(_=>(_===h?"> ":" ")+Wr(e,_,y))].join(`
|
|
172
|
+
`)}})}}function hp(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
173
|
${t.text}`),e.next_offset===null?"end":`Continue: --offset ${e.next_offset}`].join(`
|
|
173
174
|
|
|
174
|
-
`)}var
|
|
175
|
-
`)}}}function
|
|
176
|
-
`)}function
|
|
177
|
-
`):[o,...t.scenes.map(i=>
|
|
175
|
+
`)}var Im={\u65C1\u767D:"system",\u5E7F\u64AD:"broadcast",\u753B\u5916:"offscreen",\u7FA4\u58F0:"group"};function ha(e,t="",n={}){let o=Ce(e,t);switch(Q("read",`dispatch on node kind "${o.t}"`),o.t){case"script":return T5(e);case"ep":return V5(e,o.ep,n);case"scene":return cp(e,o.scene,n);case"asset":return $5(e,o.asset);case"state":return D5(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?"> ":" ")+Wr(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(`
|
|
176
|
+
`)}}}function C5(e){return e.actions.reduce((t,n)=>t+n.content.length,0)}function T5(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}: ${Xr(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+C5(a),0);i.push(` ${r.no} ${r.id} ${r.scenes.length} scenes ${s} chars${r.title?` ${r.title}`:""}`+(r.synopsis?` ${Xr(r.synopsis,120)}`:""))}return i.join(`
|
|
177
|
+
`)}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(`
|
|
178
|
+
`):[o,...t.scenes.map(i=>cp(e,i,n))].join(`
|
|
178
179
|
|
|
179
|
-
`)}function
|
|
180
|
-
`)}function
|
|
181
|
-
`)}function
|
|
182
|
-
`)}function
|
|
183
|
-
deleted: ${t.dropped.map(n=>`${n.anchor} ${
|
|
184
|
-
`)}`:"")}function
|
|
185
|
-
`));if(d){let y=
|
|
180
|
+
`)}function $5(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} ${Xr(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(`
|
|
181
|
+
`)}function D5(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(`
|
|
182
|
+
`)}function Xr(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function wp(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=Ce(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=Ce(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 Am(e,t,n={}){let o=wp(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}`,h=u===f.anchor?"":u.padEnd(8)+" ",m=f.speaker?.id?ci(e,f.speaker.id)+"\uFF1A":"",g=n.full||!i?f.content:G5(f.content,i,c);return`${f.anchor.padEnd(d)} ${h}${m}${g}`});return[p,...l].join(`
|
|
183
|
+
`)}function G5(e,t,n){let o=e.match(t);if(!o||o.index===void 0)return Xr(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 _p(e,t){return up(lp(e),mp(e,wp(e,{in:t})))}function km(e,t){let n=_p(e,t);return fp.map(o=>`${o}=${n[o]}`).join(" ")}var B5=["content","paren","speaker","ts","type","transition"],J5=["name","desc","importance","aliases","role"],K5=["name","desc"],j5=["title","synopsis"],z5=["space","time"],H5=["title","worldview","style","synopsis","logline","theme","main"];function es(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 bm(e,t,n){let o=Ce(e,t);if(o.t==="asset")return F5(e,t,o.asset,n);if(o.t==="state")return Y5(e,t,o.asset,o.state,n);if(o.t==="script")return Em(e,t||"script","script",o.doc.raw,n,H5);if(o.t==="ep")return Em(e,t,"episode",o.ep.raw,n,j5);if(o.t==="scene")return Q5(e,t,o.scene,n);let i=o.action,r=i.raw,s=es(i.anchor,"action",n,B5),c=ut(e);Q("edit",`${i.anchor}: ${s.join(", ")}`),n.type!==void 0&&(r.type=pi("type",n.type,qt,Tn));let a=n.content!==void 0&&Rm.has(r.type)?Ep(e,n.content):null,d=n.paren===void 0?a?.note:n.paren,p=n.speaker===void 0?a?.label:n.speaker;if(n.content!==void 0&&(r.content=a?.content??n.content),d!==void 0){let l=d===null?null:qr(d);l?.thought&&n.type===void 0&&r.type==="dialogue"&&(r.type="inner_thought"),ga(e,r,l?.thought?l.paren??null:d)}if(p===null||p===""?delete r.speaker:p!==void 0&&(r.speaker=xp(e,p)),n.ts!==void 0&&Mm(r,n.ts),n.transition!==void 0)if(n.transition===null)delete r.transition_prompt;else{let[l,f,u]=n.transition.split("|").map(m=>m.trim());if(!l||!f||!u)throw new Error(`transition takes "target|process|contrast" (got "${n.transition}")`);let h=Ce(e,l);if(h.t!=="asset")throw new Error(`transition target must be an asset (got ${l})`);r.transition_prompt={target:h.asset.id,process:f,contrast:u}}return be(e),`${i.anchor} ${s.join("+")} ${ya(r)}`+Ge(e,c)}function Em(e,t,n,o,i,r){let s=es(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("+")}`+Ge(e,c)}function Q5(e,t,n,o){let i=es(t,"scene",o,z5),r=ut(e),s={...n.raw.environment??{}};return o.space!==void 0&&(s.space=pi("space",o.space,ku,Pc)),o.time!==void 0&&(s.time=pi("time",o.time,Uc,Vs)),n.raw.environment=s,Q("edit",`scene ${n.anchor}: ${i.join(", ")}`),be(e),`${n.anchor} ${i.join("+")} ${[s.space,s.time].filter(Boolean).join("/")}`+Ge(e,r)}function F5(e,t,n,o){let i=es(t,"asset",o,J5),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=Tm(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}`+Ge(e,r)}function Y5(e,t,n,o,i){let r=es(t,"state",i,K5),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}`+Ge(e,s)}function vm(e,t,n,o,i,r,s,c){let a=Ce(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,Tn),content:i};if(e.version===4&&(l.action_id=Lo("ac",new Set(e.actions.keys()))),Rm.has(o)){let h=Ep(e,i),m=r||h?.label,g=s??h?.note;if(h&&(l.content=h.content),!m)throw new Error(`a ${o} needs a speaker`);if(l.speaker=xp(e,m),g!==void 0){let w=qr(g);w.thought&&(l.type="inner_thought"),ga(e,l,w.thought?w.paren??null:g)}}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} ${ya(l)}`+Ge(e,p)}function Om(e,t,n,o="after"){let i=Ce(e,t);if(i.t!=="action")throw new Error(`${t} is a ${i.t}; move targets one action`);let r=Ce(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})`+Ge(e,s)}var Rm=new Set(["dialogue","inner_thought"]);function Ep(e,t){let n=Yi(t);if(!n)return null;let o=Zr(e,n.label)?.base;return o&&(Im[o]||qi(e,o))?n:null}function ga(e,t,n){let o=e.version===4?"parenthetical":"emotion";n===null?delete t[o]:t[o]=n}function Mm(e,t){if(t===null){e.extend&&delete e.extend.timestamp;return}let n;try{n=mo(t).canonical}catch(o){throw o instanceof tt?new Error(`${o.message} (got ${JSON.stringify(t)})`):o}e.extend={...e.extend??{},timestamp:n}}function xp(e,t){let n=Zr(e,t),[o,i]=n?[n.base,n.qualifier]:q5(t,"\xB7"),r=Im[o];if(r)return i?{kind:r,label:i}:{kind:r};let s=qi(e,o),c=s?{t:"asset",asset:s}:Ce(e,o);if(c.t!=="asset"||c.asset.kind!=="actor")throw new Error(`Not an actor: ${t}`);let a={actor_id:c.asset.id};if(i){let d=c.asset.states.find(p=>p.name===i||p.id===i);if(!d)throw new Error(`Unknown state "${i}" on ${c.asset.name}`);a.state_id=d.id}return a}function q5(e,t){let n=e.indexOf(t);return n<0?[e,void 0]:[e.slice(0,n),e.slice(n+t.length)]}function ya(e){return Xr(String(e.content??""),40)}function Lm(e,t,n,o={}){let i=Mo(structuredClone(e.raw)),r=Z5(i,t,n,o);return e.raw=i.raw,be(e),r}function Z5(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}`),xm(e,r,e.episodes.length+1,n,o,!0)}let i=Ce(e,t);if(i.t==="scene")return W5(e,i.scene,n,o);if(i.t==="ep")return xm(e,i.ep.raw,i.ep.no,n,o,!1);throw new Error(`write targets a scene or an episode (got ${i.t})`)}function W5(e,t,n,o){let i=ut(e),r=Um(e,t.raw,t,n,new Set(e.actions.keys()),o);return be(e),Nm(t.anchor,r)+Ge(e,i)}function Nm(e,t){return`${e}: ${t.total} actions (${t.kept} kept, ${t.created} new, ${t.dropped.length} deleted)`+(t.dropped.length?`
|
|
184
|
+
deleted: ${t.dropped.map(n=>`${n.anchor} ${ya(n.raw)}`).join(`
|
|
185
|
+
`)}`:"")}function Um(e,t,n,o,i,r,s,c){let a=ma(e),{head:d,meta:p,body:l}=ym(o.split(`
|
|
186
|
+
`));if(d){let y=dp(d,p);t.environment=y.env.space||y.env.time?y.env:void 0,t.environment===void 0&&delete t.environment,t.location=y.location?yp(e,y.location,"location"):null,t.actors=y.cast.map(_=>yp(e,_,"actor")),t.props=y.props.map(_=>yp(e,_,"prop"))}let f=s??new Map((n?.actions??[]).map(y=>[y.anchor,y])),u=c??new Set,h=new Set,m=[],g=0,w=n?n.anchor:"this new scene";for(let y of l){let _=hm(y,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,Tn),E.content=_.content,_.type==="dialogue"||_.type==="inner_thought"?(E.speaker=xp(e,_.speakerName),ga(e,E,_.paren??null)):(delete E.speaker,ga(e,E,null)),Mm(E,_.ts??null),x?(h.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&&!h.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:h.size,created:g,dropped:s?[]:(n?.actions??[]).filter(y=>!h.has(y.anchor))}}function xm(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
187
|
`))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,h=new Set,m=[],g=[],w=0;for(let x of d){let E=
|
|
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?h.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 U=
|
|
188
|
+
`+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,h=new Set,m=[],g=[],w=0;for(let x of d){let E=dp(x.split(`
|
|
189
|
+
`)[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?h.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 U=Um(e,k,A??null,x,p,i,f,u);m.push(k),g.push(Nm(A?A.anchor:`new ${k.scene_id}`,U))}let y=[...f.values()].filter(x=>!u.has(x.anchor));if(y.length&&!i.allowDelete)throw new Error(`This would delete ${y.length} action(s) from episode ${n}: `+y.slice(0,6).map(x=>`${x.anchor}(${x.scene.anchor})`).join(", ")+(y.length>6?" \u2026":"")+" \u2014 keep their lines, or pass --allow-delete if that is the intent");let _=c.filter(x=>!h.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, ${y.length} actions deleted)
|
|
189
190
|
`+g.map(x=>" "+x.replace(/\n/g,`
|
|
190
191
|
`)).join(`
|
|
191
192
|
`)+(_.length?`
|
|
192
|
-
deleted scenes: ${_.map(x=>x.anchor).join(", ")}`:"")+Ge(e,s)}function
|
|
193
|
+
deleted scenes: ${_.map(x=>x.anchor).join(", ")}`:"")+Ge(e,s)}function yp(e,t,n){let{name:o,states:i}=wm(t),r=Ce(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 Pm(e,t,n,o,i=!1){let r=Ce(e,t);if(r.t!=="scene")throw new Error(`${t} is a ${r.t}; ref targets one scene`);let s=r.scene,c=Ce(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}`+Ge(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 h;if(a.kind==="location")h=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),h="added"):(m[g]=u,h="restated")}return Q("ref",`${s.anchor} ${h} ${a.id} = [${l.join(", ")}]`),be(e),`${s.anchor} ${h} ${a.name}(${l.map(m=>di(e,a.id,m)).join("+")})`+Ge(e,p)}function Cm(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=wp(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
194
|
${" ".repeat(a)} - ${p.content}
|
|
194
195
|
${" ".repeat(a)} + ${l}`});if(!o.apply)return`${c.length} action(s) would change (dry run \u2014 pass apply to write)
|
|
195
196
|
`+d.join(`
|
|
196
197
|
`);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`+Ge(e,r)+`
|
|
197
198
|
`+d.join(`
|
|
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
|
|
199
|
-
`)}function
|
|
200
|
-
`):"No issues."}function
|
|
201
|
-
fix: ${n.repair_hint}`:""))}function ut(e){return
|
|
199
|
+
`)}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 Tm(e){return pi("importance",e,Pt,$n)}function Xi(e){let t=e.version===4?Ue(e.raw):wt(e.raw);return{...t,warnings:[...t.warnings,...tS(e)]}}function X5(e){let t=e.assets.filter(o=>o.kind==="actor").flatMap(o=>[...new Set([o.name,...o.aliases,...o.name.split(/[\s·]+/).filter(r=>qi(e,r)===o)])].flatMap(r=>o.states.map(s=>`${r}\xB7${s.name}`))).sort((o,i)=>i.length-o.length);if(!t.length)return()=>{};let n=new RegExp(t.map(o=>o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"));return o=>o.match(n)?.[0]}function eS(e){let t=X5(e),n=[];return e.episodes.forEach((o,i)=>o.scenes.forEach((r,s)=>r.actions.forEach((c,a)=>{if(c.type!=="action")return;let d=`$.episodes[${i}].scenes[${s}].actions[${a}].content`,p=Yi(c.content);p&&(p.note!==void 0||Ep(e,c.content))&&n.push({code:"action_speech_shape",action:c,path:d,found:p.label});let l=t(c.content);l&&n.push({code:"action_look_label",action:c,path:d,found:l})}))),n}function tS(e){return eS(e).map(({code:t,path:n,found:o})=>t==="action_speech_shape"?{code:t,path:n,message:`action text is written as a speech by "${o}"`,repair_hint:"set type and speaker, and keep only the spoken words in content"}:{code:t,path:n,message:`action text holds the speaker label "${o}"`,repair_hint:"name the character only; a look change belongs to the scene's references"})}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)`:""),...Ip([...t.errors.map(o=>["error",o]),...t.warnings.map(o=>["warning",o])])].join(`
|
|
200
|
+
`)}function Sp(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?Ip(o).join(`
|
|
201
|
+
`):"No issues."}function Ip(e){return e.map(([t,n])=>`${t} ${n.code} ${n.path} ${n.message}`+(n.repair_hint?`
|
|
202
|
+
fix: ${n.repair_hint}`:""))}function ut(e){return Xi(e)}function Ge(e,t){let n=Xi(e),o=[...Vc(t.errors,n.errors).map(i=>["error",i]),...Vc(t.warnings,n.warnings).map(i=>["warning",i])];return o.length?(Q("check",`${o.length} issue(s) introduced by this edit`),`
|
|
202
203
|
introduced ${o.length} issue(s):
|
|
203
|
-
`+
|
|
204
|
-
`)):""}var
|
|
204
|
+
`+Ip(o).join(`
|
|
205
|
+
`)):""}var Ap={actor:"actors",location:"locations",prop:"props"},nS={actor:"actors",location:"location",prop:"props"},Sm={actor:"act",location:"loc",prop:"prp"};function $m(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=Ap[t],d=e.version===4?Lo(Sm[t],new Set(e.assets.map(l=>l.id))):`${Sm[t]}_${String(e.raw[a].length+1).padStart(3,"0")}`,p={[`${t}_id`]:d,[`${t}_name`]:n,importance:Tm(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`+Ge(e,s)}function Dm(e,t,n,o){let i=Ce(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)`+Ge(e,r)}function oS(e,t){let n=Ce(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 Gm(e,t,n,o,i=!1){let{raw:r,label:s}=oS(e,t),c=r.extend??{};if(!n){let a=Object.keys(c);return a.length?`${s} extend:
|
|
205
206
|
`+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
|
|
207
|
-
stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function
|
|
208
|
-
${d?"rewired":"cleared"} ${i.length} scene binding(s) and ${r.length} speaker(s)${d?` to ${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
|
|
209
|
-
moved ${f.length} scene reference(s), ${u.length} speaker(s), ${[...p].filter(([m,g])=>m!==g).length} state mapping(s)`+Ge(e,r)}import{z as Vt}from"zod";var
|
|
210
|
-
`),await
|
|
207
|
+
`):`${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 Bm(e,t,n={}){let o=Ce(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} ${ya(o.action.raw)}`+Ge(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)`+Ge(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 iS(e,o.asset,n)+Ge(e,i);if(o.t==="state")return rS(e,o.asset,o.state,n)+Ge(e,i);throw new Error(`del takes an action, scene, episode, asset or state (got ${o.t})`)}function Jm(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 iS(e,t,n){let{scenes:o,speakers:i}=Jm(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 kp(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=Ap[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?`
|
|
208
|
+
stripped ${o.length} scene reference(s) and ${i.length} speaker(s)`:"")}function rS(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=`
|
|
209
|
+
${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 kp(e,t,n){let o=Ce(e,t),i=Ce(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(y=>y.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=nS[s.kind],{scenes:f,speakers:u}=Jm(e,s.id);for(let m of f){let g=m.raw[l],w=l==="location"?g?[g]:[]:g??[];for(let y of w)y[a]===s.id&&(y[a]=c.id,e.version===4?y.state_ids=[...new Set(y.state_ids.map(_=>p.get(_)??"default"))].sort():y.state_id=p.get(y.state_id)??"default");if(l!=="location"&&Array.isArray(g)){let y=[];for(let _ of g){let x=y.find(E=>E[a]===_[a]);if(!x){y.push(_);continue}e.version===4&&(x.state_ids=[...new Set([...x.state_ids,..._.state_ids])].sort())}m.raw[l]=y}}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 h=e.raw[Ap[s.kind]];return h.splice(h.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}
|
|
210
|
+
moved ${f.length} scene reference(s), ${u.length} speaker(s), ${[...p].filter(([m,g])=>m!==g).length} state mapping(s)`+Ge(e,r)}import{z as Vt}from"zod";var sS=Vt.string().min(1),aS=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"),wa=Vt.number().min(0).max(1e3),_a=Vt.object({page:Vt.number().int().min(1),kind:Vt.enum(["panel","bubble","text"]),box:Vt.object({top:wa,left:wa,bottom:wa,right:wa}).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")}),Ea=Vt.array(_a).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 ts(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 Km=Vt.object({kind:Vt.literal("comic"),document_id:sS,pages:aS,regions:Ea.optional()}),li=Vt.object({scriptctl:Vt.object({source:Km})});import{z as J}from"zod";var ot=J.string().min(1),No=J.array(ot),jm=J.object({name:ot,description:ot.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")}),vp=J.string().length(0),Op=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:vp.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"),cS=J.object({name:ot,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:Op,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(jm),aliases:No}),dS=J.object({new_entities:J.array(cS),enrich:J.array(J.object({name:ot,add_recognition_anchors:No.describe("\u586B\u7A7A\u6570\u7EC4"),identity_profile_patch:Op,identity_revision:J.object({profile:Op,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(jm)})),canonicalize:J.array(J.object({from_name:ot,canonical_name:ot,evidence:ot.describe("\u672C\u8BDD PDF \u9875\u7801\u548C\u76F4\u63A5\u51FA\u73B0\u7684\u59D3\u540D\u539F\u6587")}))}),zm=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"),Hm="\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",Qm="\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",Fm=J.object({type:J.enum(["dialogue","inner_thought"]),content:ot,pages:zm,regions:Ea,speaker:ot.describe(Hm),parenthetical:J.string()}),pS=J.discriminatedUnion("type",[J.object({type:J.enum(["action","transition"]),content:ot,pages:zm,regions:Ea}),Fm]),Ym=J.object({space:J.union([J.enum(["interior","exterior"]),vp]),time:J.union([J.enum(["day","night","dawn","dusk"]),vp]),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:ot,states:No})),props:No,actions:J.array(pS).min(1).describe(Qm)}),xa=J.object({registry_delta:dS,synopsis:ot,scenes:J.array(Ym).min(1),open_threads:J.object({opened:J.array(J.object({text:ot})),closed:J.array(J.object({ref:ot}))}),ignored_pages:J.array(J.object({page:J.number().int().min(1),reason:ot.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")}))}),qm=xa.extend({scenes:J.array(Ym.extend({actions:J.array(Fm.extend({type:J.enum(["action","transition","dialogue","inner_thought"]),speaker:J.string().describe(`${Hm}\uFF1Baction/transition \u586B\u7A7A\u4E32`)})).min(1).describe(Qm)})).min(1)});import*as Oe from"node:fs";import*as St from"node:path";import{spawn as lS}from"node:child_process";import{createHash as uS}from"node:crypto";import{PDFDocument as Zm}from"pdf-lib";var Rp=1200;function Wm(e,t){return new Promise((n,o)=>{let i=lS("pdftoppm",["-cropbox","-scale-to-x",String(Rp),"-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 Sa(e,t){let n=`review-pages/cropbox-w${Rp}-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
|
|
211
|
+
`),await Wm(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 Xm(e,t,n){_a.parse(t);let o=ts([t.page],[t]);if(t.page>e.page_count||o.length)throw new Error(`Invalid comic region: ${o.join("; ")}`);let i=uS("sha256").update(JSON.stringify(t)).digest("hex"),r=`review-pages/cropbox-w${Rp}-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 Zm.load(Oe.readFileSync(e.path)),a=await Zm.create(),[d]=await a.copyPages(c,[t.page-1]),p=d.getCropBox(),l=(d.getRotation().angle%360+360)%360,{left:f,right:u,top:h,bottom:m}=t.box,g=f/1e3,w=u/1e3,y=h/1e3,_=m/1e3,x=l===90?[y,g,_,w]:l===180?[1-w,y,1-g,_]:l===270?[1-_,1-w,1-y,1-g]:[g,1-_,w,1-y];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 Wm(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 fS=it.object({episode:it.number().int().positive(),document_id:it.string().min(1),source_number:it.number().nullable(),title:it.string(),path:it.string(),sha256:it.string(),page_count:it.number().int().positive(),size_bytes:it.number()}),mS=it.object({source:it.object({kind:it.enum(["comic-file","comic-directory"])}),episodes:it.array(fS)});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 gS(e){let t=rt.join(e,"manifest.json");if(!st.existsSync(t))return!1;let n=it.object({source:it.object({kind:it.string()}).optional()}).parse(JSON.parse(st.readFileSync(t,"utf8")));return n.source?.kind==="comic-file"||n.source?.kind==="comic-directory"}async function tg(e,t,n){let o=st.statSync(e).isDirectory()&&gS(e)?rt.resolve(e):rt.dirname(rt.resolve(t)),i=rt.join(o,"manifest.json");st.existsSync(i)||tn("Comic review needs the ingest manifest to verify source identity.");let r=mS.safeParse(JSON.parse(st.readFileSync(i,"utf8")));r.success||tn(`Invalid comic manifest: ${r.error.message}`);let s=r.data,c=Mo(JSON.parse(st.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=rt.resolve(e)===o?void 0:st.statSync(e).isFile()?[rt.resolve(e)]:st.readdirSync(e).filter(w=>/\.pdf$/i.test(w)).map(w=>rt.resolve(e,w)),p=new Map;for(let w of d??[])p.set(eg("sha256").update(st.readFileSync(w)).digest("hex"),w);let l=new Map,f=[];for(let w of a){let y=new Set(w.scenes.flatMap(_=>_.actions.flatMap(x=>{let E=li.safeParse(x.raw.extend);return E.success?[E.data.scriptctl.source.document_id]:[]})));y.size||tn(`Episode ${w.no} has no comic document identity; cannot safely match an original PDF.`);for(let _ of y){let x=s.episodes.find(U=>U.document_id===_);x||tn(`Unknown comic document: ${_}`),f.some(U=>U.document_id===_&&U.episode!==w.no)&&tn(`Comic document ${_} is bound to multiple script episodes.`);let E=d?p.get(x.sha256):rt.resolve(o,x.path);(!E||!st.existsSync(E))&&tn(`Original PDF missing or changed: ${x.title}`),eg("sha256").update(st.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,h=rt.dirname(rt.resolve(t));function m(w){let y=l.get(w);return y||tn(`Comic document not available: ${w}`)}function g(w,y){return{path:w,label:y,data:st.readFileSync(w).toString("base64")}}return{documents:f,async page(w,y){let _=m(w);(!Number.isInteger(y)||y<1||y>_.page_count)&&tn(`Invalid page ${y} in ${w}.`);let x=u.get(w);x||(x=Sa(_,h),u.set(w,x));let E=await x;return g(rt.join(h,E[y-1]),`${w} \u7B2C ${y} \u9875\u6982\u89C8\uFF1B\u6587\u5B57\u4E0D\u6E05\u65F6\u7528 region \u653E\u5927`)},async region(w,y){let _=await Xm(m(w),y,h);return g(rt.join(h,_),`${w} \u7B2C ${y.page} \u9875 ${JSON.stringify(y.box)}`)}}}import*as On from"node:fs";import*as os from"node:path";import{z as Up}from"zod";import*as tr from"node:fs";import*as er from"node:path";var Lp=[".txt",".md",".docx"],Np={".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"},ns=class extends Error{constructor(n){super(`Unsupported input: ${n}`);this.received=n}received};function Mp(e){return er.extname(e).toLowerCase()}function ng(e){return Object.hasOwn(Np,e)}function vn(e){if(tr.statSync(e).isDirectory()){let o=tr.readdirSync(e).filter(r=>!r.startsWith(".")&&Mp(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=>ng(Mp(r))).sort().map(r=>er.join(e,r));if(o.length&&i.length)throw new ns("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 ns(`directory has no supported video or PDF files: ${e}`);return{kind:"video-directory",path:e,files:i}}let n=Mp(e);if(n===".pdf")return{kind:"comic-file",path:e,ext:n};if(Lp.includes(n))return{kind:"text",path:e,ext:n};if(ng(n))return{kind:"video-file",path:e,ext:n};throw new ns(`file extension ${n||"(none)"} is not supported by ingest (txt/md/docx/video/pdf only)`)}var og=/\.(mp4|mov|mkv|m4v|webm|avi|mpeg|mpg|flv|wmv)$/i;function ig(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(Lp.some(n=>os.extname(e).toLowerCase()===n))return"text";if(og.test(e))return"video"}else{let n=On.readdirSync(e).filter(s=>!s.startsWith(".")&&On.statSync(os.join(e,s)).isFile()),o=n.some(s=>/\.pdf$/i.test(s)),i=n.some(s=>og.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=os.join(e,"manifest.json");if(On.existsSync(r)){let s=Up.object({source:Up.object({kind:Up.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 hS=Zn.object({start_line:Zn.number().int().positive(),end_line:Zn.number().int().positive()}),Pp=Zn.object({kind:Zn.literal("text"),document_id:Zn.string().min(1),ranges:Zn.array(hS).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")}),oN=Zn.object({scriptctl:Zn.object({source:Pp})});function Ia(e){return`text-${e}`}import*as ug from"node:fs";import*as rg from"node:fs";import sg from"jszip";import{XMLParser as _S}from"fast-xml-parser";function ag(e){return e==null?"":String(e)}function Jt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Me(e){return Array.isArray(e)}function cg(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
212
|
${s}`);continue}let c=i.length>1?i[1]??"":"";c||(c=n),n=c;let a=[];s&&a.push(`${s}.`);let d=i.slice(2).filter(p=>p);c&&d.length>0?a.push(`${c}\uFF0C${d.join(" ")}`):c?a.push(c):a.push(...d),t.push(a.join(" "))}return t.join(`
|
|
212
|
-
`)}function
|
|
213
|
-
`):Me(s)&&n(s)}}}return n(e),t.join("").trim()}function
|
|
213
|
+
`)}function nr(e,t){let n=e[":@"];return Jt(n)?ag(n[t]).trim():""}function Aa(e,t){for(let[n,o]of Object.entries(e))if(Wn(n)===t&&Me(o))return o;return null}function ka(e){let t=[],n=o=>{if(Me(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(ag(s)):r!==":@"&&Me(s)&&n(s)}};return n(e),t.join("")}function ba(e){let t=dg.parse(e);if(!Me(t))throw new Error("xlsx xml part has an unexpected shape");return t}function Uo(e,t){let n=[],o=i=>{let r=Me(i)?i.filter(Jt):Jt(i)?[i]:[];for(let s of r)for(let[c,a]of Object.entries(s))Wn(c)===t&&Me(a)&&n.push(s),Me(a)&&o(a)};return o(e),n}function ES(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 xS(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 va(e,t){let n=e.file(t);return n?n.async("string"):null}async function SS(e){let t=await va(e,"xl/sharedStrings.xml");if(!t)return[];let n=ba(t),o=[];for(let i of Uo(n,"si"))o.push(ka(Aa(i,"si")??[]));return o}async function IS(e){let t=await va(e,"xl/workbook.xml"),n=await va(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(ba(n),"Relationship")){let s=nr(r,"@_Id"),c=nr(r,"@_Target");s&&c&&o.set(s,xS("xl",c))}let i=[];for(let r of Uo(ba(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 AS(e,t){let n=nr(e,"@_t");if(n==="inlineStr"){let s=Uo(e,"is")[0],c=s?Aa(s,"is"):null;return c?ka(c).trim():""}let o=Uo(e,"v")[0],i=o?Aa(o,"v"):null,r=i?ka(i).trim():"";if(!r&&n==="str"){let s=Uo(e,"is")[0],c=s?Aa(s,"is"):null;return c?ka(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 kS(e){let t=await sg.loadAsync(e),[n,o]=await Promise.all([SS(t),IS(t)]),i=[];for(let r of o){let s=await va(t,r.path);if(!s)throw new Error(`xlsx missing worksheet part: ${r.path}`);let c=[];for(let a of Uo(ba(s),"row")){let d=[];for(let p of Uo(a,"c")){let l=nr(p,"@_r"),f=l?ES(l):null,u=AS(p,n),h=f??d.length;for(;d.length<h;)d.push("");d[h]=u.trim()}d.some(p=>p)&&c.push(d)}i.push({name:r.name,rows:c})}return i}var dg=new _S({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 Cp(e){let t=[];function n(o){if(Me(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(Me(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(`
|
|
214
|
+
`):Me(s)&&n(s)}}}return n(e),t.join("").trim()}function bS(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(Me(i)){for(let s of i)if(Jt(s)){for(let[c,a]of Object.entries(s))if(Wn(c)==="tc"&&Me(a)){let d=[],p=l=>{if(Me(l)){for(let f of l)if(Jt(f))for(let[u,h]of Object.entries(f))if(Wn(u)==="p"&&Me(h)){let m=Cp(h);m&&d.push(m)}else Me(h)&&p(h)}};p(a),r.push(d.join(" ").trim())}}}r.some(s=>s)&&t.push(r)}return cg(t)}async function vS(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 kS(s);for(let a of c)a.rows.length>0&&t.push([`Embedded Sheet ${o}: ${a.name}`,cg(a.rows)])}return t}async function pg(e){let t;try{t=await sg.loadAsync(rg.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=dg.parse(o),r=null,s=d=>{if(Me(d)){for(let p of d)if(Jt(p))for(let[l,f]of Object.entries(p)){if(Wn(l)==="body"&&Me(f)){r=f;return}Me(f)&&s(f)}}};s(i);let c=[];if(r===null){let d=p=>{if(Me(p)){for(let l of p)if(Jt(l))for(let[f,u]of Object.entries(l))if(Wn(f)==="p"&&Me(u)){let h=Cp(u);h&&c.push(h)}else Me(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"||!Me(l))continue;let f=Wn(p);if(f==="p"){let u=Cp(l);u&&c.push(u)}else if(f==="tbl"){let u=bS(l);u&&c.push(u)}}let a=await vS(t);for(let[d,p]of a)c.push(`
|
|
214
215
|
## ${d}
|
|
215
216
|
`),c.push(p);return[c.join(`
|
|
216
217
|
|
|
217
|
-
`),a.length>0]}var
|
|
218
|
-
`)}function
|
|
219
|
-
`),{line:p}=qe.object({line:qe.number().int().nonnegative()}).parse(r("pass1/body_start.json"));p>=d.length&&Kt("Text body start is outside the source snapshot.");let l=
|
|
218
|
+
`),a.length>0]}var Tp=class extends Error{};function lg(e){return e.replace(/^/,"").replace(/\r\n?/g,`
|
|
219
|
+
`)}function OS(e){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Tp("source is not valid UTF-8")}}async function Oa(e,t){if(t===".docx"){let[n]=await pg(e);return lg(n)}return lg(OS(ug.readFileSync(e)))}import{z as Ra}from"zod";function Vp(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 $p(e,t,n){return{kind:"text",document_id:t,ranges:[Vp(e,n)]}}function fg(e,t,n){for(let o of e.episodes)for(let i of o.scenes)for(let r of i.actions){let s=Ra.object({scriptctl:Ra.record(Ra.string(),Ra.json()).optional()}).parse(r.extend??{});r.extend={...r.extend,scriptctl:{...s.scriptctl,source:$p(r.identity_key,t,n)}}}}var RS=qe.object({source:qe.object({kind:qe.literal("text"),sha256:qe.string().length(64),path:qe.string()})}),MS=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 mg(e,t,n){let o=Xn.statSync(e).isDirectory(),i=o?jt.resolve(e):jt.dirname(jt.resolve(t)),r=y=>{let _=jt.join(i,y);return Xn.existsSync(_)||Kt(`Text ingest artifact missing: ${_}`),JSON.parse(Xn.readFileSync(_,"utf8"))},s=RS.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 y=await Oa(e,jt.extname(e).toLowerCase());_e(y)!==s.source.sha256&&Kt("The supplied text does not match this ingest source.")}let d=a.split(`
|
|
220
|
+
`),{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=MS.parse(r("v4_identity_map.json")),f=Mo(JSON.parse(Xn.readFileSync(t,"utf8")));f.version!==4&&Kt("Text source review requires the ingested Script v4.");let u=Ia(s.source.sha256),h=Object.entries(l.episode).map(([y,_])=>({id:_,...Vp(y,p)})).sort((y,_)=>y.start_line-_.start_line);h.some(y=>y.end_line>d.length)&&Kt("An episode's ingest window is outside the original source.");let m=f.episodes.filter(y=>!n?.length||n.includes(y.no)).map(y=>{let _=h.filter(A=>A.id===y.id);_.length!==1&&Kt(`Episode ${y.no} has no unambiguous text source identity.`);let x=_[0],E=h[h.indexOf(x)+1];return{episode:y.no,start_line:h.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(([y,_])=>[_,$p(y,u,p)]));for(let y of bn(f)){if(!m.some(E=>E.episode===y.scene.ep.no))continue;let _=qe.object({scriptctl:qe.object({source:Pp.optional()}).optional()}).safeParse(y.raw.extend??{});_.success||Kt(`Invalid text source metadata on ${y.anchor}.`);let x=_.data.scriptctl?.source??w.get(y.anchor);x&&(x.document_id!==u&&Kt(`Action ${y.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 ${y.anchor}.`),g.set(y.anchor,x))}return{document_id:u,title:jt.basename(s.source.path),path:c,lines:d,episodes:m,references:g}}var hg="review-agent",US=["minimal","low","medium","high"];function Ma(e,t){let n=t||hg,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")&&US.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 gg(e){let{baseUrl:t,...n}=e;return{...n,...t?{baseUrl:t}:{}}}function Dp(e,t,n=!1){let o=gg(Ma(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()?[]:[gg(Ma(e,r))]});return{...o,fallbacks:i}}async function nn(){let e=La.dirname(LS(import.meta.url)),t=La.join(e,"review-agent.js"),n=ui.existsSync(t)?NS(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 is(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 at(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 yg(e){let t=bo(O(e.llm_config).trim()||void 0),n=O(e.model).trim(),o=O(e.source_path).trim(),i=(Array.isArray(e.video)?e.video:[]).map(m=>m.trim()).filter(m=>m.length>0),r=ig(o,i.length>0),c=Dp(t,n||(r==="comic"?"review-comic":r==="text"?"review-text":hg),e.fallback===!1),a=O(e.media_model).trim(),d=r==="video"?a?Dp(t,a,e.fallback===!1):t.source==="builtin"&&!n?Dp(t,"review-media",e.fallback===!1):c:void 0,p=O(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
221
|
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(),h=m=>process.stdout.write(JSON.stringify(m)+`
|
|
221
|
-
`);try{let m={scriptPath:l,...
|
|
222
|
-
`).flatMap(w=>{let y;try{y=JSON.parse(w)}catch{return[]}return y&&(y.type==="episode"||y.type==="global")?[y]:[]})),...c,maxSteps:at(e,"max_steps",300),episodeTimeoutMs:at(e,"episode_timeout_ms",9e5),onEvent:h};if(r==="comic"){let g=await
|
|
223
|
-
`),ge.renameSync(`${e}.tmp`,e)}function
|
|
224
|
-
${
|
|
222
|
+
`);try{let m={scriptPath:l,...is(O(e.episodes))?{episodes:is(O(e.episodes))}:{},concurrency:at(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(`
|
|
223
|
+
`).flatMap(w=>{let y;try{y=JSON.parse(w)}catch{return[]}return y&&(y.type==="episode"||y.type==="global")?[y]:[]})),...c,maxSteps:at(e,"max_steps",300),episodeTimeoutMs:at(e,"episode_timeout_ms",9e5),onEvent:h};if(r==="comic"){let g=await tg(o,l,m.converge?void 0:m.episodes);await u.reviewComicScript({...m,comic:g})}else if(r==="text"){let g=await mg(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:at(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 and NDJSON episode reports 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 Rn from"node:fs";import*as ge from"node:fs";import*as Ee from"node:path";import{createHash as PS}from"node:crypto";var rs=["analyze","direction","plan","write","review"],CS={analyze:"reskin",direction:"reskin-claude",plan:"reskin-claude",write:"reskin",review:"reskin-claude"},TS={"claude-opus-5-5":{input:4,cached_input:.2,output:20}};function Gp(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 Na(e,t){ge.mkdirSync(Ee.dirname(e),{recursive:!0}),ge.writeFileSync(`${e}.tmp`,JSON.stringify(t,null,2)+`
|
|
224
|
+
`),ge.renameSync(`${e}.tmp`,e)}function Bp(e){return ge.existsSync(e)?JSON.parse(ge.readFileSync(e,"utf8")):null}function VS(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 wg(e,t){let n=0,o=[];for(let[i,r]of Object.entries(e)){let s=VS(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 $S(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 DS=new Set(["unit-done","episode","global","direction-done"]),GS=["\u6210\u7ACB","\u8981\u6539\u505A\u6CD5","\u7275\u5F3A","\u6491\u4E0D\u4F4F"];function BS(e){if(!e)return"\u672A\u5BA1\u8BFB";let t=[...e.stages,...e.points];return GS.map(n=>[n,t.filter(o=>o.grade===n).length]).filter(([,n])=>n).map(([n,o])=>`${n} ${o}`).join(" \xB7 ")}function _g(e){return e?[...e.stages.filter(t=>t.grade!=="\u6210\u7ACB").map(t=>`${t.stage}\uFF08${t.grade}\uFF09\uFF1A${t.note}`),...e.points.filter(t=>t.grade!=="\u6210\u7ACB").map(t=>`${t.point}\uFF08${t.grade}\uFF09\uFF1A${t.note}`)]:[]}function JS(e,t){return PS("sha256").update(JSON.stringify([ge.readFileSync(e,"utf8"),t.notes??"",t.custom??"",t.market??"",t.rating??"",t.avoid??[]])).digest("hex")}function KS(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}`:"",_g(e.review).length?`\u72EC\u7ACB\u5BA1\u8BFB\u6307\u51FA\u7684\u627F\u63A5\u95EE\u9898\uFF0C\u65B9\u6848\u91CC\u8981\u89E3\u51B3\uFF1A
|
|
225
|
+
${_g(e.review).map(i=>`- ${i}`).join(`
|
|
225
226
|
`)}`:"",e.research?`\u65B0\u58F3\u5728\u5F53\u5730\u7684\u73B0\u5B9E\uFF08\u8054\u7F51\u8C03\u7814\uFF0C\u5177\u4F53\u505A\u6CD5\u4F9D\u636E\u5B83\u8BBE\u8BA1\uFF09\uFF1A
|
|
226
227
|
${e.research.text}`:"",t.research?`\u76EE\u6807\u5E02\u573A\u7684\u5F53\u5730\u73B0\u5B9E\uFF08\u8054\u7F51\u8C03\u7814\uFF09\uFF1A
|
|
227
228
|
${t.research.text}`:"",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(`
|
|
228
229
|
|
|
229
230
|
`)+`
|
|
230
|
-
`}function
|
|
231
|
-
`),
|
|
232
|
-
`)[0].replace(/\|/g,"\uFF0F");return t.length>160?`${t.slice(0,160)}\u2026`:t}function
|
|
233
|
-
`))}var
|
|
234
|
-
`);async function
|
|
235
|
-
`),[{text:"",data:{}},s.type==="paths-done"&&s.state==="completed"?G:X]}catch(s){throw
|
|
236
|
-
`),[{text:"",data:{}},f.type==="direction-done"&&f.state==="completed"?G:X]}catch(f){throw tr(f,"RESKIN_DIRECTION_FAILED")}}async function wg(e){if(e.check)return nr(e,"buildReskinPlan");let{config:t}=on(e),n=Ze(me(e),"source script"),o=Ze(O(e.analysis).trim(),"analysis"),i=Ze(O(e.direction).trim(),"direction"),r=O(e.output).trim(),s=O(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:at(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 _g(e){let t=O(e.review_model).trim()?on({...e,model:e.review_model}).config:void 0;if(e.check)return nr(e,"writeReskinScript");let{config:n}=on(e),o=me(e),i=Ze(O(e.source).trim(),"source script"),r=Ze(O(e.analysis).trim(),"analysis"),s=Ze(O(e.plan).trim(),"plan"),c=es(O(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:at(e,"concurrency",6),...t?{reviewModel:t}:{},episodeTimeoutMs:at(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 Eg(e){if(e.check)return nr(e,"reviewReskinScript");let{config:t}=on(e),n=Ze(me(e),"reskinned script"),o=Ze(O(e.source).trim(),"source script"),i=Ze(O(e.analysis).trim(),"analysis"),r=Ze(O(e.plan).trim(),"plan"),s=es(O(e.episodes)),c=await nn();try{let a=await c.reviewReskinScript({...t,scriptPath:n,sourcePath:o,analysisPath:i,planPath:r,...s?{episodes:s}:{},concurrency:at(e,"concurrency",10),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,maxSteps:at(e,"max_steps",300),episodeTimeoutMs:at(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 xg(e){let t=e._args??[],n=Ze(O(t[0]).trim(),"batch manifest"),o=O(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=O(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=lg(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=O(e.pick).trim();s&&(r.pick=s==="recommended"?"recommended":at(e,"pick",1));let c=new Map([...Object.values(r.models),...r.search?[r.search]:[],...r.ideas??[]].map(l=>[l,on({...e,model:l}).config])),a=await nn();Rn.mkdirSync(o,{recursive:!0});let p=(await ug(r,a,{outputDir:o,until:i||void 0,concurrency:at(e,"concurrency",2),attempts:at(e,"attempts",3),config:l=>c.get(l),onEvent:fi})).filter(l=>l.state==="failed").length;return[{text:"",data:{}},p?X:G]}function Sg(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 VS("--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>","\u9010\u96C6\u5BA1\u6838\u548C\u5168\u5267\u8D44\u4EA7\u6838\u5BF9\u7684\u5E76\u53D1\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\u6307\u5B9A\u4EBA\u7269\u6DF1\u5BA1\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(gg,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(hg,t)),o(ee(n.command("direction"),"read").description("\u4E3A\u4E00\u4E2A\u76EE\u6807\u5E02\u573A\u627E\u65B0\u58F3\uFF1A\u5148\u8054\u7F51\u8C03\u7814\u5F53\u5730\u73B0\u5B9E\uFF08\u7ED9\u51FA --search-model \u65F6\uFF09\uFF0C\u518D\u7531\u5404\u53D1\u6563\u6A21\u578B\u5206\u522B\u5217\u60F3\u6CD5\u3001\u53BB\u91CD\u7559\u4E0B\u81F3\u591A 10 \u4E2A\uFF0C\u9010\u4E2A\u8C03\u7814\u65B0\u58F3\u5728\u5F53\u5730\u7684\u73B0\u5B9E\u5E76\u5C55\u5F00\uFF0C\u7531\u72EC\u7ACB\u5BA1\u8BFB\u9010\u4E2A\u9636\u6BB5\u548C\u9AD8\u8BC6\u522B\u573A\u9762\u7ED9\u51FA\u627F\u63A5\u7A0B\u5EA6\uFF08\u987A\u3001\u8981\u6539\u505A\u6CD5\u3001\u7275\u5F3A\u3001\u6491\u4E0D\u4F4F\uFF09\uFF0C\u6709\u4E00\u5904\u6491\u4E0D\u4F4F\u7684\u5019\u9009\u820D\u5F03\uFF0C\u5176\u4F59\u6392\u5E8F\u5E76\u63A8\u8350\uFF1B\u7ED9\u51FA --custom \u65F6\u5224\u65AD\u7528\u6237\u6307\u5B9A\u7684\u65B9\u5411\u5E76\u6309\u5B83\u8BBE\u8BA1\u3001\u5BA1\u8BFB\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\u60F3\u6CD5\u4E0E\u5B83\u4EEC\u660E\u663E\u4E0D\u540C",(i,r=[])=>[...r,i]).option("--used <path>",'\u8FD9\u4E2A\u76EE\u6807\u5E02\u573A\u5DF2\u505A\u6210\u4EFF\u5199\u5267\u7684\u58F3\uFF08JSON \u6587\u4EF6\uFF0C[{ "drama": \u5267\u540D, "shell": \u65E7\u58F3 \u2192 \u65B0\u58F3 }]\uFF09\uFF1B\u5BA1\u8BFB\u6807\u51FA\u4E0E\u5B83\u4EEC\u76F8\u8FD1\u7684\u5019\u9009').option("--evidence <path>","\u76EE\u6807\u5E02\u573A\u540C\u7C7B\u5267\u6570\u636E\uFF08\u6587\u672C\u6587\u4EF6\uFF09\uFF1A\u4EE3\u8868\u5267\u548C\u5B83\u4EEC\u8BB2\u4EC0\u4E48\uFF0C\u7528\u6765\u542F\u53D1\u60F3\u6CD5\u548C\u5224\u65AD\u89C2\u4F17\u719F\u6089\u7A0B\u5EA6").option("--search-model <profile>","\u8054\u7F51\u641C\u7D22\u7528\u7684 LLM profile\uFF1A\u5B83\u548C\u5B83\u7684 fallbacks \u91CC\u7684 Gemini \u6E20\u9053\u8F6E\u6D41\u5F00\u641C\uFF0C\u8C03\u7814\u5F53\u5730\u73B0\u5B9E\uFF1B\u4E0D\u7ED9\u5219\u4E0D\u8C03\u7814").option("--idea-model <profile>","\u53D1\u6563\u60F3\u6CD5\u7684 LLM profile\uFF0C\u53EF\u91CD\u590D\u7ED9\u51FA\uFF1B\u51E0\u4E2A\u6A21\u578B\u5206\u522B\u5217\u60F3\u6CD5\u540E\u53BB\u91CD\uFF08\u9ED8\u8BA4\u7528 --model\uFF09",(i,r=[])=>[...r,i]).option("-o, --output <path>","\u628A\u7ED3\u679C\u53E6\u5B58\u4E3A JSON")).action(H(yg,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(wg,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(_g,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(Eg,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(xg,t))}import*as Ig 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(!Ig.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 tp(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 Ag(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(y=>{let _=Ke(y);return ct(()=>la(_,ye(y),{...y.outline?{depth:"outline"}:{},...y.plain?{plain:!0}:{},...mi(y,"context")!==void 0?{context:mi(y,"context")}:{}}),"read",()=>ye(y)?{}:{document:_.raw})},t));Re(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(y=>ct(()=>{let _=Ke(y),x=ye(y);return[`## \u573A\u7ED3\u6784
|
|
237
|
-
${
|
|
238
|
-
${
|
|
239
|
-
${
|
|
231
|
+
`}function xg(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:{...CS,...n.models??{}},prices:{...TS,...n.prices??{}},...n.pick!==void 0?{pick:n.pick}:{},...n.search?{search:n.search}:{},...n.ideas?.length?{ideas:n.ideas}:{}}}async function jS(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 eo=class extends Error{constructor(n,o){super(o);this.state=n}state};async function Sg(e,t,n){let o=n.now??Date.now,i=new Map,r=()=>HS(n.outputDir,e,[...i.values()]);async function s(c){let a=Gp(n.outputDir,c.id),d={...Bp(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(),Na(a.status,d),r()},l=v=>n.onEvent?.({drama:c.id,...v});if(!ge.existsSync(a.source)){if(!ge.existsSync(c.source))throw new eo("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(v,I){let R=d.steps[v]??{state:"running",runs:0,wall_ms:0,usage:{}};R.state="running",d.steps[v]=R,d.step=v,p(),l({type:"step-started",step:v}),ge.mkdirSync(Ee.dirname(a.log(v)),{recursive:!0});let C=M=>{ge.appendFileSync(a.log(v),JSON.stringify(M)+`
|
|
232
|
+
`),DS.has(String(M.type))&&Array.isArray(M.usage)&&$S(R.usage,M.usage)},L=null;for(let M=1;M<=n.attempts;M+=1){let j=o();R.runs+=1;try{L=await I(C)}catch(Z){L=Z instanceof Error?Z.message:String(Z)}if(R.wall_ms+=o()-j,p(),!L)break}if(R.state=L?"failed":"completed",L?R.error=L:delete R.error,p(),l({type:"step-done",step:v,state:R.state,error:L}),L)throw new eo("failed",`${v}\uFF1A${L}`)}let u=v=>d.steps[v]?.state==="completed",h=v=>n.until===v;if((!u("analyze")||!ge.existsSync(a.analysis))&&await f("analyze",async v=>{let I=await t.analyzeReskinSource({...n.config(e.models.analyze),sourcePath:a.source,outputPath:a.analysis,onEvent:v});return I.state==="completed"?null:I.error||"\u62C6\u89E3\u672A\u5B8C\u6210"}),h("analyze"))return;let m=JS(a.analysis,c),g=Bp(a.direction);(g?.key!==m||g.result.state!=="completed")&&(g=null,await f("direction",async v=>{let I=await t.proposeReskinDirections({...n.config(e.models.direction),sourcePath:a.source,analysisPath:a.analysis,...e.search?{search:n.config(e.search)}:{},...e.ideas?.length?{ideaModels:e.ideas.map(R=>n.config(R))}:{},notes:c.notes??"",custom:c.custom??"",market:c.market??"",rating:c.rating??"",avoid:c.avoid??[],onEvent:v});return I.type!=="direction-done"||I.state!=="completed"?I.type==="direction-done"&&I.error||"\u65B9\u5411\u672A\u5B8C\u6210":(g={key:m,result:I},Na(a.direction,g),null)}));let w=g.result,y=!!c.custom?.trim(),_=y?1:c.pick??e.pick,x=_==="recommended"?w.recommended:_??null;if(d.direction={mode:y?"custom":"candidates",verdict:w.verdict,verdict_reason:w.reason,candidates:w.candidates.map(({title:v,shell:I,review:R})=>({title:v,shell:I,carry:BS(R)})),recommended:w.recommended,recommendation:w.recommendation,picked:x},d.step="direction",w.verdict==="\u4E0D\u53EF\u884C")throw new eo("stopped",`\u6307\u5B9A\u7684\u65B9\u5411\u4E0D\u53EF\u884C\uFF1A${w.reason}`);if(!w.candidates.length)throw new eo("stopped",`\u8FD9\u4E00\u8F6E\u7684\u65B9\u5411\u90FD\u6709\u6491\u4E0D\u4F4F\u7684\u5730\u65B9\uFF1A${(w.dropped??[]).map(v=>`${v.title}\uFF08${v.breaks.join("\uFF1B")}\uFF09`).join("\uFF1B")}\u3002\u6362\u4E2A\u8981\u6C42\u6216\u5199 custom \u518D\u8FD0\u884C`);if(x===null)throw new eo("stopped",`\u5F85\u4EBA\u5DE5\u9009\u62E9\u65B9\u5411\uFF1A\u5728\u6E05\u5355\u91CC\u7ED9\u8FD9\u90E8\u5267\u5199 pick\uFF081\u2013${w.candidates.length}\uFF0C\u63A8\u8350 ${w.recommended}\uFF09\u540E\u518D\u8FD0\u884C`);let E=w.candidates[x-1];if(!E)throw new eo("stopped",`pick ${x} \u8D85\u51FA\u5019\u9009\u8303\u56F4\uFF08\u5171 ${w.candidates.length} \u4E2A\uFF09`);let A=KS(E,w,c),k=ge.existsSync(a.brief)?ge.readFileSync(a.brief,"utf8"):null;if(k!==A){let v=Ee.dirname(a.script);k!==null&&ge.existsSync(v)&&ge.renameSync(v,`${v}.${new Date(o()).toISOString().replace(/[:.]/g,"-")}`);for(let I of["plan","write","review"])delete d.steps[I];delete d.review,ge.mkdirSync(Ee.dirname(a.brief),{recursive:!0}),ge.writeFileSync(a.brief,A)}if(p(),h("direction")||(u("plan")||await f("plan",async v=>{let I=await t.buildReskinPlan({...n.config(e.models.plan),sourcePath:a.source,analysisPath:a.analysis,directionPath:a.brief,planPath:a.plan,onEvent:v});return I.state==="completed"?null:I.error||"\u65B9\u6848\u672A\u5B8C\u6210"}),h("plan"))||(u("write")||await f("write",async v=>{let I=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:v});return I.type==="done"&&!I.failed?.length?null:`\u8FD9\u4E9B\u96C6\u6CA1\u6709\u5199\u6210\uFF1A${(I.failed??[]).join("\u3001")}`}),h("write")))return;let U=d.review??={converged:!1};u("review")||await f("review",async v=>{U.converged=!1;let I=!1,R=0,C=L=>{v(L),L.type==="global"&&R++,(L.type==="global"||L.type==="episode")&&L.state==="failed"&&(I=!0),L.type==="done"&&(U.converged=R>0&&!I)};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}),U.converged?null:"\u5168\u5267\u6536\u5C3E\u6CA1\u6709\u5B8C\u6210"})}for(let c of e.dramas){let a=Bp(Gp(n.outputDir,c.id).status);i.set(c.id,{...a??{id:c.id,steps:{},step:null,reason:"",updated_at:""},state:"pending"})}return r(),await jS(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 eo?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(),Na(Gp(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 zS(e){let t=e.split(`
|
|
233
|
+
`)[0].replace(/\|/g,"\uFF0F");return t.length>160?`${t.slice(0,160)}\u2026`:t}function Eg(e){return`${Math.round(e/6e4)} \u5206\u949F`}function HS(e,t,n){let o=n.map(s=>{let c=Object.fromEntries(rs.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,...wg(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,...wg(a,t.prices),usage:a,steps:c,direction:s.direction??null}});Na(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??""} | ${Eg(s.wall_ms)} | ${s.usd.toFixed(2)}${s.unpriced.length?`\uFF08\u672A\u8BA1\u4EF7\uFF1A${s.unpriced.join("\u3001")}\uFF09`:""} | ${zS(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} | ${Eg(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.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\u627F\u63A5 ${c.carry}\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(`
|
|
234
|
+
`))}var Ig="reskin",QS=["minimal","low","medium","high"],Jp=["overall","events","beats"];function Ze(e,t){if(!e||!Rn.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 Ag(e,t){let n=Ma(e,t),o=e.providers[e.models[t].provider]?.protocol,i=e.models[t].reasoning,r=o?.startsWith("google")&&QS.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 on(e){let t=bo(O(e.llm_config).trim()||void 0),n=O(e.model).trim()||(t.models[Ig]?Ig:"review-agent"),{profile:o,config:i}=Ag(t,n),r=(t.models[n].fallbacks??[]).flatMap(s=>{try{return[Ag(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 fi=e=>process.stdout.write(JSON.stringify(e)+`
|
|
235
|
+
`);async function ir(e,t){let{llm:n,name:o,profile:i}=on(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 kg(e){if(e.check)return ir(e,"analyzeReskinSource");let{config:t}=on(e),n=Ze(me(e),"source script"),o=O(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:at(e,"concurrency",5)}:{},...e.unit_timeout_ms!==void 0?{unitTimeoutMs:at(e,"unit_timeout_ms",6e5)}:{},onEvent:fi});return[{text:"",data:{}},r.type==="analyze-done"&&r.state==="completed"?G:X]}catch(r){throw or(r,"RESKIN_ANALYZE_FAILED")}}async function bg(e){if(e.check)return ir(e,"assessReskinPaths");let{config:t}=on(e),n=Ze(O(e.analysis).trim(),"analysis"),o=O(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=O(e.output).trim(),r=await nn();try{let s=await r.assessReskinPaths({...t,analysisPath:n,markets:o,notes:O(e.notes),onEvent:fi});return i&&s.type==="paths-done"&&s.state==="completed"&&Rn.writeFileSync(i,JSON.stringify(s,null,2)+`
|
|
236
|
+
`),[{text:"",data:{}},s.type==="paths-done"&&s.state==="completed"?G:X]}catch(s){throw or(s,"RESKIN_PATHS_FAILED")}}async function vg(e){if(e.check)return ir(e,"proposeReskinDirections");let{config:t}=on(e),n=Ze(me(e),"source script"),o=Ze(O(e.analysis).trim(),"analysis"),i=O(e.output).trim(),r=O(e.evidence).trim(),s=r?Rn.readFileSync(Ze(r,"evidence"),"utf8"):void 0,c=O(e.used).trim(),a=c?JSON.parse(Rn.readFileSync(Ze(c,"used"),"utf8")):void 0,d=O(e.search_model).trim()?on({...e,model:e.search_model}).config:void 0,p=(Array.isArray(e.idea_model)?e.idea_model:[]).map(f=>String(f).trim()).filter(Boolean).map(f=>on({...e,model:f}).config),l=await nn();try{let f=await l.proposeReskinDirections({...t,sourcePath:n,analysisPath:o,notes:O(e.notes),custom:O(e.custom),market:O(e.market).trim(),rating:O(e.rating).trim(),avoid:(Array.isArray(e.avoid)?e.avoid:[]).map(u=>String(u).trim()).filter(Boolean),...a?{used:a}:{},...d?{search:d}:{},...p.length?{ideaModels:p}:{},evidence:s,onEvent:fi});return i&&f.type==="direction-done"&&f.state==="completed"&&Rn.writeFileSync(i,JSON.stringify(f,null,2)+`
|
|
237
|
+
`),[{text:"",data:{}},f.type==="direction-done"&&f.state==="completed"?G:X]}catch(f){throw or(f,"RESKIN_DIRECTION_FAILED")}}async function Og(e){if(e.check)return ir(e,"buildReskinPlan");let{config:t}=on(e),n=Ze(me(e),"source script"),o=Ze(O(e.analysis).trim(),"analysis"),i=Ze(O(e.direction).trim(),"direction"),r=O(e.output).trim(),s=O(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&&!Jp.includes(s))throw new S("Unknown plan layer.",{exitCode:b,errorCode:"RESKIN_LAYER_UNKNOWN",hint:`Pass --until ${Jp.join("|")}.`,data:{expected:[...Jp],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:at(e,"unit_timeout_ms",18e5)}:{},onEvent:fi}),d=a.type==="plan-done"&&a.state!=="failed";return[{text:"",data:{}},d?G:X]}catch(a){throw or(a,"RESKIN_PLAN_FAILED")}}async function Rg(e){let t=O(e.review_model).trim()?on({...e,model:e.review_model}).config:void 0;if(e.check)return ir(e,"writeReskinScript");let{config:n}=on(e),o=me(e),i=Ze(O(e.source).trim(),"source script"),r=Ze(O(e.analysis).trim(),"analysis"),s=Ze(O(e.plan).trim(),"plan"),c=is(O(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:at(e,"concurrency",6),...t?{reviewModel:t}:{},episodeTimeoutMs:at(e,"episode_timeout_ms",48e4),onEvent:fi});return[{text:"",data:{}},d.type==="done"&&d.failed.length===0?G:X]}catch(d){throw or(d,"RESKIN_WRITE_FAILED")}}async function Mg(e){if(e.check)return ir(e,"reviewReskinScript");let{config:t}=on(e),n=Ze(me(e),"reskinned script"),o=Ze(O(e.source).trim(),"source script"),i=Ze(O(e.analysis).trim(),"analysis"),r=Ze(O(e.plan).trim(),"plan"),s=is(O(e.episodes)),c=await nn();try{let a=await c.reviewReskinScript({...t,scriptPath:n,sourcePath:o,analysisPath:i,planPath:r,...s?{episodes:s}:{},concurrency:at(e,"concurrency",10),converge:e.converge!==!1,convergeOnly:e.converge_only===!0,maxSteps:at(e,"max_steps",300),episodeTimeoutMs:at(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 or(a,"RESKIN_REVIEW_FAILED")}}async function Lg(e){let t=e._args??[],n=Ze(O(t[0]).trim(),"batch manifest"),o=O(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=O(e.until).trim();if(i&&!rs.includes(i))throw new S("Unknown batch step.",{exitCode:b,errorCode:"RESKIN_LAYER_UNKNOWN",hint:`Pass --until ${rs.join("|")}.`,data:{expected:[...rs],actual:[i]}});let r;try{r=xg(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=O(e.pick).trim();s&&(r.pick=s==="recommended"?"recommended":at(e,"pick",1));let c=new Map([...Object.values(r.models),...r.search?[r.search]:[],...r.ideas??[]].map(l=>[l,on({...e,model:l}).config])),a=await nn();Rn.mkdirSync(o,{recursive:!0});let p=(await Sg(r,a,{outputDir:o,until:i||void 0,concurrency:at(e,"concurrency",2),attempts:at(e,"attempts",3),config:l=>c.get(l),onEvent:fi})).filter(l=>l.state==="failed").length;return[{text:"",data:{}},p?X:G]}function Ng(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 FS("--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>","\u9010\u96C6\u5BA1\u6838\u548C\u5168\u5267\u8D44\u4EA7\u6838\u5BF9\u7684\u5E76\u53D1\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\u6307\u5B9A\u4EBA\u7269\u6DF1\u5BA1\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(yg,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(kg,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(bg,t)),o(ee(n.command("direction"),"read").description("\u4E3A\u4E00\u4E2A\u76EE\u6807\u5E02\u573A\u627E\u65B0\u58F3\uFF1A\u5148\u8054\u7F51\u8C03\u7814\u5F53\u5730\u73B0\u5B9E\uFF08\u7ED9\u51FA --search-model \u65F6\uFF09\uFF0C\u518D\u7531\u5404\u53D1\u6563\u6A21\u578B\u5206\u522B\u5217\u60F3\u6CD5\u3001\u53BB\u91CD\u7559\u4E0B\u81F3\u591A 10 \u4E2A\uFF0C\u9010\u4E2A\u8C03\u7814\u65B0\u58F3\u5728\u5F53\u5730\u7684\u73B0\u5B9E\u5E76\u5C55\u5F00\uFF0C\u7531\u72EC\u7ACB\u5BA1\u8BFB\u9010\u4E2A\u9636\u6BB5\u548C\u9AD8\u8BC6\u522B\u573A\u9762\u7ED9\u51FA\u627F\u63A5\u7A0B\u5EA6\uFF08\u6210\u7ACB\u3001\u8981\u6539\u505A\u6CD5\u3001\u7275\u5F3A\u3001\u6491\u4E0D\u4F4F\uFF09\uFF0C\u6709\u4E00\u5904\u6491\u4E0D\u4F4F\u7684\u5019\u9009\u820D\u5F03\uFF0C\u5176\u4F59\u6392\u5E8F\u5E76\u63A8\u8350\uFF1B\u7ED9\u51FA --custom \u65F6\u5224\u65AD\u7528\u6237\u6307\u5B9A\u7684\u65B9\u5411\u5E76\u6309\u5B83\u8BBE\u8BA1\u3001\u5BA1\u8BFB\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\u60F3\u6CD5\u4E0E\u5B83\u4EEC\u660E\u663E\u4E0D\u540C",(i,r=[])=>[...r,i]).option("--used <path>",'\u8FD9\u4E2A\u76EE\u6807\u5E02\u573A\u5DF2\u505A\u6210\u4EFF\u5199\u5267\u7684\u58F3\uFF08JSON \u6587\u4EF6\uFF0C[{ "drama": \u5267\u540D, "shell": \u65E7\u58F3 \u2192 \u65B0\u58F3 }]\uFF09\uFF1B\u5BA1\u8BFB\u6807\u51FA\u4E0E\u5B83\u4EEC\u76F8\u8FD1\u7684\u5019\u9009').option("--evidence <path>","\u76EE\u6807\u5E02\u573A\u540C\u7C7B\u5267\u6570\u636E\uFF08\u6587\u672C\u6587\u4EF6\uFF09\uFF1A\u4EE3\u8868\u5267\u548C\u5B83\u4EEC\u8BB2\u4EC0\u4E48\uFF0C\u7528\u6765\u542F\u53D1\u60F3\u6CD5\u548C\u5224\u65AD\u89C2\u4F17\u719F\u6089\u7A0B\u5EA6").option("--search-model <profile>","\u8054\u7F51\u641C\u7D22\u7528\u7684 LLM profile\uFF1A\u5B83\u548C\u5B83\u7684 fallbacks \u91CC\u7684 Gemini \u6E20\u9053\u8F6E\u6D41\u5F00\u641C\uFF0C\u8C03\u7814\u5F53\u5730\u73B0\u5B9E\uFF1B\u4E0D\u7ED9\u5219\u4E0D\u8C03\u7814").option("--idea-model <profile>","\u53D1\u6563\u60F3\u6CD5\u7684 LLM profile\uFF0C\u53EF\u91CD\u590D\u7ED9\u51FA\uFF1B\u51E0\u4E2A\u6A21\u578B\u5206\u522B\u5217\u60F3\u6CD5\u540E\u53BB\u91CD\uFF08\u9ED8\u8BA4\u7528 --model\uFF09",(i,r=[])=>[...r,i]).option("-o, --output <path>","\u628A\u7ED3\u679C\u53E6\u5B58\u4E3A JSON")).action(H(vg,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(Og,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(Rg,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(Mg,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(Lg,t))}import*as Ug 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(!Ug.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 sp(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 Kp(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 Pg(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(y=>{let _=Ke(y);return ct(()=>ha(_,ye(y),{...y.outline?{depth:"outline"}:{},...y.plain?{plain:!0}:{},...mi(y,"context")!==void 0?{context:mi(y,"context")}:{}}),"read",()=>ye(y)?{}:{document:_.raw})},t));Re(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(y=>ct(()=>{let _=Ke(y),x=ye(y);return[`## \u573A\u7ED3\u6784
|
|
238
|
+
${ha(_,x,{depth:"outline"})}`,`## \u6B63\u6587
|
|
239
|
+
${ha(_,x)}`,`## \u5F53\u524D\u6821\u9A8C\u95EE\u9898
|
|
240
|
+
${Sp(_,{})}`].join(`
|
|
240
241
|
|
|
241
|
-
`)},"scan"),t));Re(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(y=>ct(()=>gm(Ke(y),ye(y),{...he(y,"in")?{in:he(y,"in")}:{},...he(y,"speaker")?{speaker:he(y,"speaker")}:{},...he(y,"type")?{type:he(y,"type")}:{},...mi(y,"limit")!==void 0?{limit:mi(y,"limit")}:{},...y.full?{full:!0}:{}}),"find"),t));Re(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(y=>{let _=pp(Ke(y),ye(y),{offset:mi(y,"offset"),limit:mi(y,"limit"),context:mi(y,"context")});return[{text:lp(_),data:{op:"refs",changed:!1,..._}},G]},t));Re(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(y=>{let _=Ke(y);return ct(()=>hm(_,ye(y)),"span",()=>({rows:[mp(_,ye(y))]}))},t));Re(s,[`${Po}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),ee(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(H(y=>{let _=Ke(y),x=Zi(_);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: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(y=>ct(()=>hp(Ke(y),{...he(y,"severity")?{severity:he(y,"severity")}:{},...he(y,"code")?{code:he(y,"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(y=>{let _={};for(let x of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let E=he(y,x);E!==void 0&&(_[x]=E)}for(let x of["paren","ts","transition"])if(y[x]===!1)_[x]=null;else{let E=he(y,x);E!==void 0&&(_[x]=E)}return y.alias!==void 0&&(_.aliases=Vp(y.alias)),ct(()=>ym(Ke(y),ye(y),_),"edit")},t));Re(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(y=>ct(()=>wm(Ke(y),ye(y),y.before?"before":"after",he(y,"type"),ye(y,1),he(y,"speaker"),he(y,"paren")),"insert"),t));Re(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(y=>ct(()=>_m(Ke(y),ye(y),ye(y,1),y.before?"before":"after"),"move"),t));Re(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 y=>{let _=await import("node:fs"),x=he(y,"file"),E=x?_.readFileSync(x,"utf8"):_.readFileSync(0,"utf8");return ct(()=>xm(Ke(y),ye(y),E,{allowDelete:!!y.allow_delete}),"write")},t));Re(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(y=>ct(()=>km(Ke(y),ye(y),ye(y,1),{...he(y,"in")?{in:he(y,"in")}:{},...he(y,"speaker")?{speaker:he(y,"speaker")}:{},...he(y,"type")?{type:he(y,"type")}:{},...y.apply?{apply:!0}:{}}),"replace"),t));Re(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",$S,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(H(y=>ct(()=>Am(Ke(y),ye(y),ye(y,1),Vp(y.state).flatMap(_=>_.split(",")).map(_=>_.trim()).filter(Boolean),!!y.remove),"ref"),t));Re(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(y=>ct(()=>Om(Ke(y),ye(y),ye(y,1),he(y,"desc")??"",he(y,"importance")??"featured",Vp(y.alias)),"asset"),t));Re(u,["actor | location | prop","\u540D\u5B57"]);let h=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(y=>ct(()=>Rm(Ke(y),ye(y),ye(y,1),he(y,"desc")??""),"state"),t));Re(h,["\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(y=>ct(()=>Lm(Ke(y),ye(y),{...he(y,"replacement")?{replacement:he(y,"replacement")}:{},...y.force?{force:!0}:{}}),"del"),t));Re(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(y=>ct(()=>_p(Ke(y),ye(y),ye(y,1)),"merge"),t));Re(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(y=>ct(()=>Mm(Ke(y),ye(y),ye(y,1)||void 0,ye(y,2)||void 0,!!y.remove),"ext"),t));Re(w,[Po,"extend key","\u503C"])}function $S(e,t){return[...t,e]}import*as Ty from"node:path";var to={createExecutor:em};import*as pl from"node:fs";import*as dr from"node:path";var Mn=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 kg(e,t={}){let n=[],o=[],i=null,r=null,s=0,c=0,a=new Map,d=(l,f)=>{let u=`text:${l}:${f.chunk}:${f.line_start}:${f.line_end}`,h=(a.get(u)??0)+1;return a.set(u,h),`${u}:${h}`},p=(l,f)=>{let u=l.actors.find(h=>$p(h.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=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 DS(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 Oa(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,h,m)=>{if(!m||c[u].has(m))throw new Error(`Duplicate or missing ${u} source identity: ${m}`);c[u].add(m),s[u][h]=m},d=(u,h,m,g)=>{let w=u.ensure(h.name,m),y={[g]:w.provisional_id};return h.state!==void 0&&(y.state_id=u.stateId(w,h.state)),y},p=e.episodes.map((u,h)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((m,g)=>{let w=`${u.episode_id}/${m.scene_id}`;a("scene",w,m.identity_key);let y={episode:h,scene:g},_=m.location?d(i,m.location,y,"location_id"):null,x=m.actors.map(k=>d(o,k,y,"actor_id")),E=m.props.map(k=>d(r,k,y,"prop_id")),A=m.actions.map((k,U)=>{a("action",`${w}#${U}`,k.identity_key);let v={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let I=o.ensure(k.speaker.name,y),R={actor_id:I.provisional_id};k.speaker.state!==void 0&&(R.state_id=o.stateId(I,k.speaker.state)),v.speaker=R}else v.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?v.emotion=k.parenthetical:k.emotion!==void 0&&(v.emotion=k.emotion)),k.extend!==void 0&&(v.extend=k.extend),v});return{scene_id:m.scene_id,...m.environment?{environment:m.environment}:{},location:_,actors:x,props:E,actions:A}})})),l=(u,h,m)=>u.list().map(g=>({[h]:g.provisional_id,[m]:g.names[0]??g.provisional_id,aliases:g.names.slice(1),description:"",states:DS(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 bg(e,t={}){let n=t.maxChars??500,o=e.split(`
|
|
242
|
+
`)},"scan"),t));Re(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(y=>ct(()=>Am(Ke(y),ye(y),{...he(y,"in")?{in:he(y,"in")}:{},...he(y,"speaker")?{speaker:he(y,"speaker")}:{},...he(y,"type")?{type:he(y,"type")}:{},...mi(y,"limit")!==void 0?{limit:mi(y,"limit")}:{},...y.full?{full:!0}:{}}),"find"),t));Re(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(y=>{let _=gp(Ke(y),ye(y),{offset:mi(y,"offset"),limit:mi(y,"limit"),context:mi(y,"context")});return[{text:hp(_),data:{op:"refs",changed:!1,..._}},G]},t));Re(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(y=>{let _=Ke(y);return ct(()=>km(_,ye(y)),"span",()=>({rows:[_p(_,ye(y))]}))},t));Re(s,[`${Po}\uFF0C\u6216 \`\u8D77ID..\u6B62ID\``]),ee(e.command("validate"),"read").description("\u8DD1\u6574\u672C\u6821\u9A8C").action(H(y=>{let _=Ke(y),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: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(y=>ct(()=>Sp(Ke(y),{...he(y,"severity")?{severity:he(y,"severity")}:{},...he(y,"code")?{code:he(y,"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(y=>{let _={};for(let x of["content","speaker","type","name","desc","importance","role","space","time","title","synopsis","logline","theme","worldview","style","main"]){let E=he(y,x);E!==void 0&&(_[x]=E)}for(let x of["paren","ts","transition"])if(y[x]===!1)_[x]=null;else{let E=he(y,x);E!==void 0&&(_[x]=E)}return y.alias!==void 0&&(_.aliases=Kp(y.alias)),ct(()=>bm(Ke(y),ye(y),_),"edit")},t));Re(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(y=>ct(()=>vm(Ke(y),ye(y),y.before?"before":"after",he(y,"type"),ye(y,1),he(y,"speaker"),he(y,"paren")),"insert"),t));Re(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(y=>ct(()=>Om(Ke(y),ye(y),ye(y,1),y.before?"before":"after"),"move"),t));Re(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 y=>{let _=await import("node:fs"),x=he(y,"file"),E=x?_.readFileSync(x,"utf8"):_.readFileSync(0,"utf8");return ct(()=>Lm(Ke(y),ye(y),E,{allowDelete:!!y.allow_delete}),"write")},t));Re(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(y=>ct(()=>Cm(Ke(y),ye(y),ye(y,1),{...he(y,"in")?{in:he(y,"in")}:{},...he(y,"speaker")?{speaker:he(y,"speaker")}:{},...he(y,"type")?{type:he(y,"type")}:{},...y.apply?{apply:!0}:{}}),"replace"),t));Re(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",YS,[]).option("--remove","\u5220\u9664\u6574\u6761\u5F15\u7528").action(H(y=>ct(()=>Pm(Ke(y),ye(y),ye(y,1),Kp(y.state).flatMap(_=>_.split(",")).map(_=>_.trim()).filter(Boolean),!!y.remove),"ref"),t));Re(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(y=>ct(()=>$m(Ke(y),ye(y),ye(y,1),he(y,"desc")??"",he(y,"importance")??"featured",Kp(y.alias)),"asset"),t));Re(u,["actor | location | prop","\u540D\u5B57"]);let h=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(y=>ct(()=>Dm(Ke(y),ye(y),ye(y,1),he(y,"desc")??""),"state"),t));Re(h,["\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(y=>ct(()=>Bm(Ke(y),ye(y),{...he(y,"replacement")?{replacement:he(y,"replacement")}:{},...y.force?{force:!0}:{}}),"del"),t));Re(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(y=>ct(()=>kp(Ke(y),ye(y),ye(y,1)),"merge"),t));Re(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(y=>ct(()=>Gm(Ke(y),ye(y),ye(y,1)||void 0,ye(y,2)||void 0,!!y.remove),"ext"),t));Re(w,[Po,"extend key","\u503C"])}function YS(e,t){return[...t,e]}import*as Hy from"node:path";var to={createExecutor:sm};import*as hl from"node:fs";import*as lr from"node:path";var Mn=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();var ss=e=>String(e).padStart(3,"0"),jp=e=>e.normalize("NFC").replace(/\s+/g," ").trim();function Cg(e,t={}){let n=[],o=[],i=null,r=null,s=0,c=0,a=new Map,d=(l,f)=>{let u=`text:${l}:${f.chunk}:${f.line_start}:${f.line_end}`,h=(a.get(u)??0)+1;return a.set(u,h),`${u}:${h}`},p=(l,f)=>{let u=l.actors.find(h=>jp(h.name)===jp(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_${ss(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_${ss(s)}`,scenes:[]},n.push(i)),c++,r={identity_key:d("scene",l.source),scene_id:`scn_${ss(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 as=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=jp(t),i=this.byNorm.get(o);return i||(i={provisional_id:`${this.prefix}_${ss(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 qS(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 Ua(e){let t=0,n=()=>`st_${ss(++t)}`,o=new as("act","actor",n),i=new as("loc","location",n),r=new as("prp","prop",n),s={episode:{},scene:{},action:{}},c={episode:new Set,scene:new Set,action:new Set},a=(u,h,m)=>{if(!m||c[u].has(m))throw new Error(`Duplicate or missing ${u} source identity: ${m}`);c[u].add(m),s[u][h]=m},d=(u,h,m,g)=>{let w=u.ensure(h.name,m),y={[g]:w.provisional_id};return h.state!==void 0&&(y.state_id=u.stateId(w,h.state)),y},p=e.episodes.map((u,h)=>(a("episode",u.episode_id,u.identity_key),{episode_id:u.episode_id,...u.title?{title:u.title}:{},scenes:u.scenes.map((m,g)=>{let w=`${u.episode_id}/${m.scene_id}`;a("scene",w,m.identity_key);let y={episode:h,scene:g},_=m.location?d(i,m.location,y,"location_id"):null,x=m.actors.map(k=>d(o,k,y,"actor_id")),E=m.props.map(k=>d(r,k,y,"prop_id")),A=m.actions.map((k,U)=>{a("action",`${w}#${U}`,k.identity_key);let v={type:k.type,content:k.content};if(k.speaker)if("name"in k.speaker){let I=o.ensure(k.speaker.name,y),R={actor_id:I.provisional_id};k.speaker.state!==void 0&&(R.state_id=o.stateId(I,k.speaker.state)),v.speaker=R}else v.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?v.emotion=k.parenthetical:k.emotion!==void 0&&(v.emotion=k.emotion)),k.extend!==void 0&&(v.extend=k.extend),v});return{scene_id:m.scene_id,...m.environment?{environment:m.environment}:{},location:_,actors:x,props:E,actions:A}})})),l=(u,h,m)=>u.list().map(g=>({[h]:g.provisional_id,[m]:g.names[0]??g.provisional_id,aliases:g.names.slice(1),description:"",states:qS(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 Tg(e,t={}){let n=t.maxChars??500,o=e.split(`
|
|
242
243
|
`),i=[],r=0,s=0,c=a=>{let d=o.slice(r,a).join(`
|
|
243
|
-
`);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
|
|
244
|
-
`);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(!
|
|
245
|
-
`)}var
|
|
246
|
-
`)}function
|
|
247
|
-
`);function
|
|
248
|
-
`)}function
|
|
249
|
-
`);i=is(r)}catch(r){throw r instanceof we?Na(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)]):Na(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 $g(e,t,n){let o=Y,i=await e[o(41)](o(71),{system:sI,user:aI(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 Na(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=an,dI=Fp(1);function pI(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 Dg(e,t,n){let o=Fp,i=await e[o(4)](o(2),{system:dI,user:o(6)+t,...n?{signal:n}:{}});return pI(i[o(0)])}function an(e,t){e=e-0;let n=Qp(),o=n[e];if(an.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};an.TPTWLA=i,an.iYuNay={},an.sLepLJ=!0}let r=n[0];an.inDmHY!==r&&(an.iYuNay={},an.inDmHY=r);let s=an.iYuNay[e];return s===void 0?(o=an.TPTWLA(o),an.iYuNay[e]=o):o=s,o}var Gg=50,lI=10;async function Bg(e,t,n){let o=t.split(`
|
|
250
|
-
`),i=
|
|
251
|
-
`),a=await Dg(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 Jg(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),cn=e=>Array.isArray(e);function Yp(e){let t=new Map;if(!cn(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 uI(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 cn(e.episodes)?e.episodes:[])if(!(!Qt(o)||!cn(o.scenes))){for(let i of o.scenes)if(Qt(i)){n(i.location,"location_id");for(let r of cn(i.actors)?i.actors:[])n(r,"actor_id");for(let r of cn(i.props)?i.props:[])n(r,"prop_id");for(let r of cn(i.actions)?i.actions:[])Qt(r)&&n(r.speaker,"actor_id")}}return t}function fI(e,t){let n=e.filter(i=>(t.get(i.state_id)??0)>0);if(n.length===0)return null;let o=n[0];for(let i of n.slice(1)){let r=t.get(i.state_id)??0,s=t.get(o.state_id)??0;(r>s||r===s&&i.state_name<o.state_name)&&(o=i)}return o.state_id}function Ua(e){if(!Qt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of cn(t.episodes)?t.episodes:[])if(!(!Qt(p)||!cn(p.scenes)))for(let l of p.scenes){if(!Qt(l))continue;let f=cn(l.actors)?l.actors.filter(Qt):[],u=new Set(f.map(h=>h.actor_id).filter(h=>typeof h=="string"));for(let h of cn(l.actions)?l.actions:[])!Qt(h)||!Qt(h.speaker)||typeof h.speaker.actor_id!="string"||u.has(h.speaker.actor_id)||(f.push({actor_id:h.speaker.actor_id}),u.add(h.speaker.actor_id));l.actors=f}let n=Yp(t.actors),o=Yp(t.locations),i=Yp(t.props),r=new Map([...n,...o,...i]),s=uI(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=(cn(l.states)?l.states:[]).filter(Qt),u=new Map,h=fI(f,c.get(p)??new Map),m;if(h===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===h?(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 Kg=dn;function dn(e,t){e=e-0;let n=qp(),o=n[e];if(dn.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};dn.alaGPc=i,dn.IPZchV={},dn.vcGzia=!0}let r=n[0];dn.cEXTRr!==r&&(dn.IPZchV={},dn.cEXTRr=r);let s=dn.IPZchV[e];return s===void 0?(o=dn.alaGPc(o),dn.IPZchV[e]=o):o=s,o}var mI=Kg(6);async function jg(e,t,n,o){let i=Kg;return(await e[i(4)](i(2),{system:mI,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 Fg={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"]}}}},DU={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"]}}}}}}}}},Yg={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"}}},qg={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:Yg}}},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"}}},gI={type:"string",enum:["actor","location","prop"]},Zg={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"},zg={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"},Hg={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:Zg,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"}}},Qg={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"}}},Wg={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:Zg,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:zg,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:zg,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:gI,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:Hg,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:Qg,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:Qg,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:Hg,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"}}}}}}}},Xg={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:Yg}}}}};var z=pn;function pn(e,t){e=e-0;let n=Wp(),o=n[e];if(pn.AowUYu===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};pn.vGSHGD=i,pn.ykrKeL={},pn.AowUYu=!0}let r=n[0];pn.qbkWqr!==r&&(pn.ykrKeL={},pn.qbkWqr=r);let s=pn.ykrKeL[e];return s===void 0?(o=pn.vGSHGD(o),pn.ykrKeL[e]=o):o=s,o}var hI=[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)](`
|
|
252
|
-
`);function
|
|
253
|
-
`)}async function
|
|
254
|
-
`);else n+='\\"';continue}n+=r}return n}function xI(e,t){let n=z,o=r=>JSON[n(101)](r),i;try{i=o(e)}catch(r){let s=EI(e);if(s===e)throw new Te(t+n(89)+(r instanceof Error?r[n(20)]:String(r)));try{i=o(s)}catch(c){throw new Te(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 Te(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?xI(o,t):[]}throw new Te(t+n(19)+typeof e)}var SI=/[((]([^))]*)[))]?/;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=SI[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 II(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 Te(t(53)+(i instanceof Error?i[t(20)]:String(i)))}if(!Ei(o)){if(t(3)===t(3))throw new Te(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=Ng(),o=II(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(!wI[t(62)](r)||!s)continue;let a=Pa(i[t(15)],t(81)+s+t(93)),d=_I(i[t(75)],t(81)+s+t(43)),p=[...c];for(let f of wi(i[t(16)],t(68))){let{name:u,aliases:h}=Xp(no(f));u&&p[t(76)](u),p[t(76)](...h)}let l=[...new Set(p[t(18)](f=>f&&f!==s))];n[t(25)][t(76)]({name:s,kind:r,description:a,aliases:l,defaultLook:d})}for(let i of 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:Pa(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 Xe=ln,AI=[Xe(1),Xe(29),Xe(18),Xe(32),Xe(0),Xe(7),Xe(15),Xe(8),Xe(3)][Xe(21)](`
|
|
255
|
-
`);function
|
|
244
|
+
`);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 Vg=["episode","scene","action","dialogue","inner_thought","transition","note"];var ZS={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 ZS[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 rn(e,t,n){for(let o of Object.keys(e))if(!t.includes(o))throw new we(`unknown field '${o}'`,n)}function WS(e,t){if(!sr(e))throw new we("missing source",t);rn(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 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 $g(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);rn(o,["name","state"],n);let i={name:rr(o,"name",n)},r=To(o,"state",n);return r!==void 0&&(i.state=r),i})}function XS(e,t){if(!sr(e))throw new we("dialogue/inner_thought needs a speaker",t);if("kind"in e){rn(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=To(e,"label",t);return c!==void 0&&(s.label=c),s}rn(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=To(e,"state",t);return i!==void 0&&(o.state=i),o}function eI(e,t){let n=e.kind;if(typeof n!="string"||!Vg.includes(n))throw new we(`unknown or missing kind '${String(n)}'`,t);let o=WS(e.source,t);switch(n){case"episode":{rn(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":{rn(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);rn(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(!sr(e.location))throw new we("location must be an object",t);rn(e.location,["name","state"],t);let r={name:rr(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=$g(e.actors,"actors",t)),"props"in e&&e.props!==void 0&&(i.props=$g(e.props,"props",t)),i}case"action":case"transition":{rn(e,["kind","content","source"],t);let i=rr(e,"content",t);return{kind:n,content:i,source:o}}case"dialogue":case"inner_thought":{rn(e,["kind","speaker","content","emotion","source"],t);let i=rr(e,"content",t),r=XS(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":{rn(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 cs(e,t=0){let n=[],o=e.split(`
|
|
245
|
+
`);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(eI(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()},tI=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,Hp=e=>e.startEp===e.endEp?`\u7B2C${e.startEp}\u96C6`:`\u7B2C${e.startEp}\u96C6\u2013\u7B2C${e.endEp}\u96C6`,Jg=()=>({newEntities:[],merges:[],looks:[],lookChanges:[],subEvents:[],summary:""}),Kg=()=>({entities:[],lookChanges:{},recent:[],synopsis:[]}),Qp={recentEpisodes:6,synopsisChars:3500,arcFold:10},nI=1e4;function jg(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 zg(e,t=nI){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 oI={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 Dg=(e,t)=>{ne(t)!==ne(e.canonical)&&!e.aliases.some(n=>ne(n)===ne(t))&&e.aliases.push(t)},iI=["\u5E74\u8F7B","\u5E74\u8001","\u5E74\u5E7C","\u5E74\u5C11","\u4E2D\u5E74","\u9752\u5E74","\u5C11\u5E74","\u8001\u5E74","\u5E7C\u5E74","\u8001","\u5C0F","\u5927","\u5C11","\u5E7C"];function rI(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&&!iI.some(r=>i===r||i.startsWith(r))}function sI(e){let t=e.filter(n=>e.some(o=>o!==n&&rI(n,o)));return t.length?t.reduce((n,o)=>o.length>n.length?o:n):e[0]}var Gg=["\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"],aI=["\u4F17\u4EBA","\u7FA4\u4F17","\u6C11\u4F17","\u89C2\u4F17","\u4EBA\u7FA4","\u4EBA\u4EEC","\u5927\u5BB6","\u767E\u59D3","\u5B98\u5175"],cI=/^(?:一群|一众|全体|所有|几名|数名|多名|[0-9零一二两三四五六七八九十百千]+名?)/;function dt(e){let t=ne(e).replace(/[0-9零一二两三四五六七八九十百千]+名?$/,"").trim();return t?t.endsWith("\u4EEC")||Gg.includes(t)||aI.some(n=>t.endsWith(n))?!0:cI.test(t)&&Gg.some(n=>t.endsWith(n)):!1}function Vo(e,t){let n=gi(t);return zt(e,n)?.canonical??n}function dI(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 pI=["\u5E38\u6001","\u65E5\u5E38","\u5E73\u65F6","\u57FA\u7840","\u666E\u901A"];function Fp(e){if(e.looks.length!==0)return(e.looks.find(t=>pI.some(n=>t.name.includes(n)))??e.looks[0]).name}function zp(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 Bg(e){let t=[e.canonical,...e.aliases],n=sI(t);ne(n)!==ne(e.canonical)&&(e.canonical=n,e.aliases=t.filter(o=>ne(o)!==ne(n)))}function ds(e,t,n,o=n){for(let r of t.newEntities){let s=gi(r.name);if(!s)continue;let c=zp(e,r.kind,s);if(!c){let d=[];for(let p of r.aliases){let l=gi(p);l&&ne(l)!==ne(s)&&!zp(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&&!zp(e,r.kind,p,c)&&Dg(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}),Bg(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)||(Dg(a,d),Bg(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(h=>ne(h)===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?dI(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 lI=e=>e.summary.length+e.subEvents.reduce((t,n)=>t+n.length,0);function Hg(e,t=Qp){for(;e.recent.length>t.recentEpisodes||e.recent.length>1&&e.recent.reduce((n,o)=>n+lI(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 Yp(e,t=Qp){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 Qg(e,t,n=Qp){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 uI=6;function Pa(e,t){let n=i=>t===void 0||i.lastSeen>=t-uI,o=["# \u8BBE\u5B9A"];for(let i of["actor","location","prop"]){let r=e.entities.filter(s=>s.kind===i);if(r.length){o.push(`## ${oI[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(`- ${Hp(i)}\uFF1A${i.line}`)}if(e.recent.length){o.push("","# \u6700\u8FD1");for(let i of e.recent){o.push(`## ${tI(i)}`),i.summary.trim()&&o.push(`\u6897\u6982\uFF1A${i.summary.trim()}`);for(let r of i.subEvents)o.push(`- ${r}`)}}return o.join(`
|
|
246
|
+
`)}var fI=/(?:^|[,。!?;:、\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=fI.exec(a.content);l&&n("production_action_pronoun",`${p}.content`,`action uses ambiguous reference ${l[1]}`)}})})}),t}var We=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ft=e=>Array.isArray(e),Ca=e=>String(e).padStart(3,"0"),qp=[{key:"actors",idField:"actor_id",prefix:"act"},{key:"locations",idField:"location_id",prefix:"loc"},{key:"props",idField:"prop_id",prefix:"prp"}];function Ta(e){if(!We(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(!(!We(a)||!ft(a.scenes))){for(let d of a.scenes)if(We(d)){We(d.location)&&r("locations",d.location.location_id);for(let p of ft(d.actors)?d.actors:[])We(p)&&r("actors",p.actor_id);for(let p of ft(d.props)?d.props:[])We(p)&&r("props",p.prop_id);for(let p of ft(d.actions)?d.actions:[])We(p)&&We(p.speaker)&&r("actors",p.speaker.actor_id)}}for(let{key:a,idField:d}of qp)for(let p of ft(t[a])?t[a]:[])We(p)&&r(a,p[d]);for(let{key:a,prefix:d}of qp)o[a].forEach((p,l)=>{n[a][p]=`${d}_${Ca(l+1)}`});for(let{key:a,idField:d}of qp){let p=(ft(t[a])?t[a]:[]).filter(We),l=n[a],f=new Map;for(let u of p){let h=u[d],m=l[h]??h;u[d]=m;let g=0;for(let w of ft(u.states)?u.states:[]){if(!We(w)||typeof w.state_id!="string"||w.state_id==="default")continue;let y=`st_${Ca(++g)}`;n.states[w.state_id]=y,w.state_id=y}f.set(m,u)}t[a]=[...f.entries()].sort((u,h)=>u[0]<h[0]?-1:1).map(u=>u[1])}let s=0;(ft(t.episodes)?t.episodes:[]).forEach((a,d)=>{if(We(a)){if(typeof a.episode_id=="string"){let p=`ep_${Ca(d+1)}`;n.episodes[a.episode_id]=p,a.episode_id=p}for(let p of ft(a.scenes)?a.scenes:[])if(We(p)&&typeof p.scene_id=="string"){let l=`scn_${Ca(++s)}`;n.scenes[p.scene_id]=l,p.scene_id=l}}});let c=(a,d,p)=>{!We(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(!(!We(a)||!ft(a.scenes))){for(let d of a.scenes)if(We(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:[])We(p)&&c(p.speaker,"actor_id","actors")}}return{script:t,idMap:n}}import{createHash as mI}from"node:crypto";function ps(e){let t=O(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(!xu.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 cr(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,R,C,L)=>{let M=C[R];if(M!==void 0){if(!V(I,M))throw new Error(`Invalid persisted ${I} ID for ${R}: ${M}`);if(L.has(M))throw new Error(`Duplicate persisted ${I} ID: ${M}`);return L.add(M),M}let j=qo(I,L);return L.add(j),C[R]=j,j},c=(I,R)=>n[I]?.[R]??R;for(let I of e.actors){let R=s("actor",c("actor",I.actor_id),o.actor,r.actor);i.actor.set(I.actor_id,R)}for(let I of e.locations){let R=s("location",c("location",I.location_id),o.location,r.location);i.location.set(I.location_id,R)}for(let I of e.props){let R=s("prop",c("prop",I.prop_id),o.prop,r.prop);i.prop.set(I.prop_id,R)}let a=new Map,d=(I,R,C)=>{let L=new Map,M=new Set,j=c(I,R),Z=o.state[j]??{};o.state[j]=Z;let Be=C.map(ie=>{let K;if(ie.state_id==="default")K="default";else{let vt=n.state?.[R]?.[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 ${R}/${ie.state_id}: ${P}`);if(M.has(P))throw new Error(`Duplicate persisted state ID on ${R}: ${P}`);K=P}else K=qo("state",M),Z[vt]=K}return M.add(K),L.set(ie.state_id,K),{...ie,state_id:K}});return a.set(R,L),Be},p=(I,R)=>R===void 0?void 0:Ht(a.get(I)??new Map,R),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)})),h=I=>{if("actor_id"in I){let R=p(I.actor_id,I.state_id);return{actor_id:Ht(i.actor,I.actor_id),...R===void 0?{}:{state_id:R}}}return I.label===void 0?{kind:I.kind}:{kind:I.kind,label:I.label}},m=I=>{if(I.includes(":")){let[C,L]=ps(I);return Ht(C==="actor"?i.actor:C==="location"?i.location:i.prop,L)}let R=i.actor.get(I)??i.location.get(I)??i.prop.get(I);if(R===void 0)throw new Error(`Missing transition target mapping for ${I}`);return R},g=(I,R)=>{let C=s("action",R,o.action,r.action),L=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:C,type:I.type,content:I.content,speaker:h(I.speaker),...I.emotion===void 0?{}:{parenthetical:I.emotion},...L,...I.extend===void 0?{}:{extend:I.extend}}}return{action_id:C,type:I.type,content:I.content,...L,...I.extend===void 0?{}:{extend:I.extend}}},w=(I,R)=>[p(I,R??"default")??"default"],y=(I,R)=>{let C=new Map;for(let L of I){let M=Ht(i.actor,L.actor_id),j=C.get(M)??new Set;w(L.actor_id,L.state_id).forEach(Z=>j.add(Z)),C.set(M,j)}for(let L of R){if(L.speaker===void 0||!("actor_id"in L.speaker))continue;let M=L.speaker.actor_id,j=Ht(i.actor,M),Z=C.get(j)??new Set;w(M,L.speaker.state_id).forEach(Be=>Z.add(Be)),C.set(j,Z)}return[...C].map(([L,M])=>({actor_id:L,state_ids:[...M].sort()}))},_=I=>{let R=new Map;for(let C of I){let L=Ht(i.prop,C.prop_id),M=R.get(L)??new Set;w(C.prop_id,C.state_id).forEach(j=>M.add(j)),R.set(L,M)}return[...R].map(([C,L])=>({prop_id:C,state_ids:[...L].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 R=n.episode?.[I.episode_id]??I.episode_id;x.add(R);let C=s("episode",R,o.episode,r.episode);return{...I,episode_id:C,scenes:I.scenes.map(L=>{let M=`${I.episode_id}/${L.scene_id}`,j=n.scene?.[M]??M;E.add(j);let Z=s("scene",j,o.scene,r.scene),Be=new Map;return{...L,scene_id:Z,location:L.location===null?null:{location_id:Ht(i.location,L.location.location_id),state_ids:w(L.location.location_id,L.location.state_id)},actors:y(L.actors,L.actions),props:_(L.props),actions:L.actions.map((ie,K)=>{let vt=`${M}#${K}`,P=JSON.stringify(An(ie)),ce=(Be.get(P)??0)+1;Be.set(P,ce);let Se=mI("sha256").update(P).digest("hex"),Ot=n.action?.[vt]??`${j}:action:${Se}:${ce}`;return A.add(Ot),g(ie,Ot)})}})}})},U=(I,R)=>{for(let C of Object.keys(I))R.has(C)||delete I[C]};U(o.actor,new Set(e.actors.map(I=>c("actor",I.actor_id)))),U(o.location,new Set(e.locations.map(I=>c("location",I.location_id)))),U(o.prop,new Set(e.props.map(I=>c("prop",I.prop_id)))),U(o.episode,x),U(o.scene,E),U(o.action,A);let v=[...e.actors.map(I=>({id:c("actor",I.actor_id),oldId:I.actor_id,states:I.states})),...e.locations.map(I=>({id:c("location",I.location_id),oldId:I.location_id,states:I.states})),...e.props.map(I=>({id:c("prop",I.prop_id),oldId:I.prop_id,states:I.states}))];U(o.state,new Set(v.map(I=>I.id)));for(let I of v)U(o.state[I.id]??{},new Set(I.states.map(R=>n.state?.[I.oldId]?.[R.state_id]??R.state_id)));return{script:k,identityMap:o}}import*as Le from"node:fs";import*as hi from"node:path";function yi(e,t){let n=hi.dirname(e);Le.mkdirSync(n,{recursive:!0});let o=hi.join(n,`.${hi.basename(e)}.${process.pid}.tmp`),i=Le.openSync(o,"w");try{Le.writeFileSync(i,t),Le.fsyncSync(i)}finally{Le.closeSync(i)}Le.renameSync(o,e)}function gI(e,t){yi(e,JSON.stringify(t,null,2)+`
|
|
247
|
+
`)}function hI(e){return JSON.parse(Le.readFileSync(e,"utf-8"))}var mt=class{constructor(t){this.root=t}root;abs(t){return hi.join(this.root,t)}ensure(){Le.mkdirSync(this.root,{recursive:!0})}passDir(t){let n=this.abs(t);return Le.mkdirSync(n,{recursive:!0}),n}readText(t){return Le.readFileSync(this.abs(t),"utf-8")}writeText(t,n){yi(this.abs(t),n)}writeJson(t,n){gI(this.abs(t),n)}readJson(t){return hI(this.abs(t))}has(t){return Le.existsSync(this.abs(t))}path(t){return this.abs(t)}clearError(t){let n=this.abs(t);Le.existsSync(n)&&Le.rmSync(n)}};function sn(e,t){e=e-0;let n=Zp(),o=n[e];if(sn.wCYmoh===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};sn.ccSjUe=i,sn.dKlJjl={},sn.wCYmoh=!0}let r=n[0];sn.sBhMJx!==r&&(sn.dKlJjl={},sn.sBhMJx=r);let s=sn.dKlJjl[e];return s===void 0?(o=sn.ccSjUe(o),sn.dKlJjl[e]=o):o=s,o}var Y=sn,yI=[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)](`
|
|
248
|
+
`);function wI(e){let t=Y,n=e[t(73)]===0?t(47):t(23);return[t(78),n,t(49),"",e[t(53)]][t(74)](`
|
|
249
|
+
`)}function Va(e,t){let n=Y;return new S(e,{exitCode:X,errorCode:n(12),hint:n(44),data:{actual:t}})}function _I(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 Wp(e,t){let n=Y;if(!_I(e))throw Va(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)](`
|
|
250
|
+
`);i=cs(r)}catch(r){throw r instanceof we?Va(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)]):Va(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 Fg(e,t,n){let o=Y,i=await e[o(41)](o(71),{system:yI,user:wI(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 Va(o(19)+t[o(73)]+o(50),[i[o(53)][o(7)](0,500)])}return{raw:i[o(53)],records:Wp(r,t)}}var el=an,EI=el(1);function xI(e){let t=el,n=e[t(5)](/起点\s*[::]\s*(\d+)/);return n?{found:!0,line:Math[t(3)](Number(n[1]))}:{found:!1,line:null}}function Xp(){let e=["Dgv4Da","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","Aw5Nzxn0lMjVzhKTC3rHCNq","Dhj1BMm","z2vUzxjHDgvuzxH0","Bwf0y2G","5lIl6z2I5PIV5RQq5PAh5lU255Qe5lIa5Q6177Ym5Q+p6kgm5lUL44cm6kgm5y+3pfrbqJ7LHOxLRRNJGi3NU5NLH7RJGilLIktMLQ3NNj/MRApNMOtLIAFMNkZMRApMLOFMMk/LKkBLNkJOV5NMRRxPH4ZLVidLP4VVViZMJiNMOlZLVi/LJ6RLM57KUidOOyZJGiikcG"];return Xp=function(){return e},Xp()}async function Yg(e,t,n){let o=el,i=await e[o(4)](o(2),{system:EI,user:o(6)+t,...n?{signal:n}:{}});return xI(i[o(0)])}function an(e,t){e=e-0;let n=Xp(),o=n[e];if(an.sLepLJ===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};an.TPTWLA=i,an.iYuNay={},an.sLepLJ=!0}let r=n[0];an.inDmHY!==r&&(an.iYuNay={},an.inDmHY=r);let s=an.iYuNay[e];return s===void 0?(o=an.TPTWLA(o),an.iYuNay[e]=o):o=s,o}var qg=50,SI=10;async function Zg(e,t,n){let o=t.split(`
|
|
251
|
+
`),i=qg-SI;try{for(let r=0;r<o.length;r+=i){let s=Math.min(r+qg,o.length),c=o.slice(r,s).map((d,p)=>`${r+p+1} ${d}`).join(`
|
|
252
|
+
`),a=await Yg(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 Wg(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),cn=e=>Array.isArray(e);function tl(e){let t=new Map;if(!cn(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 II(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 cn(e.episodes)?e.episodes:[])if(!(!Qt(o)||!cn(o.scenes))){for(let i of o.scenes)if(Qt(i)){n(i.location,"location_id");for(let r of cn(i.actors)?i.actors:[])n(r,"actor_id");for(let r of cn(i.props)?i.props:[])n(r,"prop_id");for(let r of cn(i.actions)?i.actions:[])Qt(r)&&n(r.speaker,"actor_id")}}return t}function AI(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 $a(e){if(!Qt(e))throw new Error("govern expects a script object");let t=JSON.parse(JSON.stringify(e));for(let p of cn(t.episodes)?t.episodes:[])if(!(!Qt(p)||!cn(p.scenes)))for(let l of p.scenes){if(!Qt(l))continue;let f=cn(l.actors)?l.actors.filter(Qt):[],u=new Set(f.map(h=>h.actor_id).filter(h=>typeof h=="string"));for(let h of cn(l.actions)?l.actions:[])!Qt(h)||!Qt(h.speaker)||typeof h.speaker.actor_id!="string"||u.has(h.speaker.actor_id)||(f.push({actor_id:h.speaker.actor_id}),u.add(h.speaker.actor_id));l.actors=f}let n=tl(t.actors),o=tl(t.locations),i=tl(t.props),r=new Map([...n,...o,...i]),s=II(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=(cn(l.states)?l.states:[]).filter(Qt),u=new Map,h=AI(f,c.get(p)??new Map),m;if(h===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===h?(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 Xg=dn;function dn(e,t){e=e-0;let n=nl(),o=n[e];if(dn.vcGzia===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};dn.alaGPc=i,dn.IPZchV={},dn.vcGzia=!0}let r=n[0];dn.cEXTRr!==r&&(dn.IPZchV={},dn.cEXTRr=r);let s=dn.IPZchV[e];return s===void 0?(o=dn.alaGPc(o),dn.IPZchV[e]=o):o=s,o}var kI=Xg(6);async function eh(e,t,n,o){let i=Xg;return(await e[i(4)](i(2),{system:kI,user:i(0)+t+i(3)+n,...o?{signal:o}:{}}))[i(5)][i(1)]()}function nl(){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 nl=function(){return e},nl()}var ih={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"]}}}}}},ol={type:"array",items:{type:"object",required:["asset_id","state_id"],additionalProperties:!1,properties:{asset_id:{type:"string"},state_id:{type:["string","null"]}}}},ZU={type:"object",required:["scenes"],additionalProperties:!1,properties:{scenes:{type:"array",items:{type:"object",required:["scene_id"],additionalProperties:!1,properties:{scene_id:{type:"string"},actors:{...ol,items:{type:"object",required:["actor_id","state_id"],additionalProperties:!1,properties:{actor_id:{type:"string"},state_id:{type:["string","null"]}}}},locations:{...ol,items:{type:"object",required:["location_id","state_id"],additionalProperties:!1,properties:{location_id:{type:"string"},state_id:{type:["string","null"]}}}},props:{...ol,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"]}}}}}}}}},rh={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"}}},sh={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:rh}}},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"}}},bI={type:"string",enum:["actor","location","prop"]},ah={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"},th={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"},nh={type:"object",required:["name","description"],additionalProperties:!1,properties:{name:ah,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"}}},oh={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"}}},ch={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:ah,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:th,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:th,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:bI,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:nh,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:oh,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:oh,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:nh,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"}}}}}}}},dh={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:rh}}}}};var z=pn;function pn(e,t){e=e-0;let n=il(),o=n[e];if(pn.AowUYu===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};pn.vGSHGD=i,pn.ykrKeL={},pn.AowUYu=!0}let r=n[0];pn.qbkWqr!==r&&(pn.ykrKeL={},pn.qbkWqr=r);let s=pn.ykrKeL[e];return s===void 0?(o=pn.vGSHGD(o),pn.ykrKeL[e]=o):o=s,o}var vI=[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)](`
|
|
253
|
+
`);function OI(e,t){let n=z;return[n(4),e[n(50)]()||n(5),"",n(66),t[n(50)]()][n(33)](`
|
|
254
|
+
`)}async function ph(e,t,n,o){let i=z,r=await e[i(45)](i(69),{system:vI,user:OI(t,n),tool:{name:i(44),description:i(22),inputSchema:sh},...o?{signal:o}:{}});return{delta:ls(r[i(49)]),raw:JSON[i(38)](r[i(49)])}}var RI=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 Da(e,t){let n=z,o=no(e);if(!o)throw new Te(t+n(36));return o}function MI(e,t){let n=z;if(!Ei(e))throw new Te(t+n(31));let o=Da(e[n(32)],t+n(90));if(o!=="\u5E38\u6001")throw new Te(t+n(29));return{name:o,description:Da(e[n(15)],t+n(93))}}var Te=class extends Error{[z(12)]=z(34);constructor(t){let n=z;super(t),this[n(32)]=n(0)}};function LI(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)](`
|
|
255
|
+
`);else n+='\\"';continue}n+=r}return n}function NI(e,t){let n=z,o=r=>JSON[n(101)](r),i;try{i=o(e)}catch(r){let s=LI(e);if(s===e)throw new Te(t+n(89)+(r instanceof Error?r[n(20)]:String(r)));try{i=o(s)}catch(c){throw new Te(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 Te(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?NI(o,t):[]}throw new Te(t+n(19)+typeof e)}var UI=/[((]([^))]*)[))]?/;function il(){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 il=function(){return e},il()}function rl(e){let t=z,n=no(e),o=UI[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=>rl(no(e))[z(32)];function PI(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 Te(t(53)+(i instanceof Error?i[t(20)]:String(i)))}if(!Ei(o)){if(t(3)===t(3))throw new Te(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 ls(e){let t=z,n=Jg(),o=PI(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}=rl(no(i[t(32)]));if(!RI[t(62)](r)||!s)continue;let a=Da(i[t(15)],t(81)+s+t(93)),d=MI(i[t(75)],t(81)+s+t(43)),p=[...c];for(let f of wi(i[t(16)],t(68))){let{name:u,aliases:h}=rl(no(f));u&&p[t(76)](u),p[t(76)](...h)}let l=[...new Set(p[t(18)](f=>f&&f!==s))];n[t(25)][t(76)]({name:s,kind:r,description:a,aliases:l,defaultLook:d})}for(let i of 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:Da(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 Xe=ln,CI=[Xe(1),Xe(29),Xe(18),Xe(32),Xe(0),Xe(7),Xe(15),Xe(8),Xe(3)][Xe(21)](`
|
|
256
|
+
`);function TI(e,t){let n=Xe;return[n(13),e[n(27)]()||n(19),"",n(4),t[n(14)](o=>"- "+o)[n(21)](`
|
|
256
257
|
`)][n(21)](`
|
|
257
|
-
`)}async function
|
|
258
|
+
`)}async function lh(e,t,n,o){let i=Xe,r=await e[i(24)](i(26),{system:CI,user:TI(t,n),tool:{name:i(11),description:i(12),inputSchema:dh},...o?{signal:o}:{}});return{delta:al(r[i(5)],n),raw:JSON[i(30)](r[i(5)])}}var Ga=e=>e[Xe(23)](Xe(6))[Xe(31)](/\s+/g," ")[Xe(27)]();function al(e,t=[]){let n=Xe,o=ls(e),i=new Set;for(let s of o[n(22)])i[n(9)](Ga(s[n(33)]));for(let s of o[n(25)]){i[n(9)](Ga(s[n(10)]));for(let c of s[n(28)])i[n(9)](Ga(c))}let r=t[n(20)](s=>!i[n(2)](Ga(s)));if(r[n(17)])throw new Te(n(16)+r[n(21)]("\u3001"));return o}function ln(e,t){e=e-0;let n=sl(),o=n[e];if(ln.brkHeO===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};ln.xoIkcy=i,ln.GcFqUp={},ln.brkHeO=!0}let r=n[0];ln.pyAYZq!==r&&(ln.GcFqUp={},ln.pyAYZq=r);let s=ln.GcFqUp[e];return s===void 0?(o=ln.xoIkcy(o),ln.GcFqUp[e]=o):o=s,o}function sl(){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 sl=function(){return e},sl()}var It=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),At=e=>Array.isArray(e),VI=5,xi=e=>e.normalize("NFC").replace(/\s+/g," ").trim(),uh=e=>{try{return JSON.parse(e)}catch{return null}},$I=new Set(["timeout","rate_limited","request_failed","endpoint","empty_response","invalid_response","truncated","serial_delta_shape"]),yh=e=>!!e&&typeof e=="object"&&"code"in e&&$I.has(String(e.code)),wh=e=>new Promise(t=>setTimeout(t,e)),dr=(e,t)=>e===t?`episode ${e}`:`episodes ${e}-${t}`;async function fh(e,t,n,o,i,r){for(let s=1;;s++)try{return await ph(e,o,i,r)}catch(c){if(yh(c)&&s<3&&!r?.aborted){await wh(3e3*s);continue}throw new S(`serial govern failed at ${dr(t,n)}.`,{exitCode:b,errorCode:"INGEST_SERIAL_FAILED",hint:c instanceof Te?`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 _h(e,t){let n=t.merges.map(o=>o.into).filter(o=>!zt(e,o));if(n.length)throw new Te(`name-fix merge target is not registered: ${[...new Set(n)].join("\u3001")}`)}async function mh(e,t,n,o,i,r,s){for(let c=1;;c++)try{let a=await lh(e,o,i,s);return _h(r,a.delta),a}catch(a){if(yh(a)&&c<3&&!s?.aborted){await wh(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 Te?`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 Eh(e,t){let n=Kg(),o=e.episodes??[],i=0,r=o.map(JI),s=zg(r.map(jg),t.windowTokens);for(let a=0;a<s.length;a++){let[d,p]=s[a],l=Pa(n,p),f=r.slice(d-1,p).join(`
|
|
258
259
|
|
|
259
260
|
`),u=t.sourceRef?`# \u539F\u6587\u8BBE\u5B9A\uFF08\u53C2\u8003\uFF0C\u6765\u81EA\u539F\u7A3F\u5F00\u5934\uFF09
|
|
260
261
|
${t.sourceRef}
|
|
261
262
|
|
|
262
|
-
${l}`:l,h=Date.now(),m=t.force?void 0:t.checkpoint?.readUpdate(d,p),g,w=!1;if(m!==void 0){let _=
|
|
263
|
-
`);k=await
|
|
264
|
-
`)}function NI(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=rh(a.actors.map(g=>Vo(t,g.name)).filter(g=>!dt(g)&&d(g))),f=rh(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 h=new Map;for(let g of t.lookChanges[a.scene_id]??[]){let w=Vo(t,g.entity),y=h.get(w)??[];y.includes(g.look)||y.push(g.look),h.set(w,y),o.set(w,g.look)}let m=g=>h.get(g)?.map(w=>({name:g,state:w}))??[sh(t,g,o)];a.location=p&&d(p)?sh(t,p,o):null,a.actors=l.flatMap(m),a.props=f.flatMap(m)}let i=Oa(n),r=i.script;CI(r,t),TI(r);let s=Ua(r);return PI(s),VI(s),{doc:s,identityKeys:i.identityKeys}}var UI="\u5E38\u6001";function rh(e){let t=new Set;return e.filter(n=>{let o=xi(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function sh(e,t,n){let o=zt(e,t),i=n.get(t)??(o?Jp(o):void 0)??UI;return{name:t,state:i}}function PI(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 CI(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 TI(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)>=bI;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 VI(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),oo=e=>Array.isArray(e)?e:[],et=e=>typeof e=="string"?e.trim():"";function nl(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var $I={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"}},lh=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function uh(e){let t=Ln(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=$I[c];for(let d of oo(t[a.list])){if(!Ln(d))continue;let p=et(d[a.id]),l=et(d[a.name]);if(!p)continue;let f=[...new Set(oo(d.aliases).map(et).filter(Boolean))],u=new Map,h=[];for(let g of oo(d.states)){if(!Ln(g))continue;let w=et(g.state_id);if(!w)continue;let y=et(g.state_name),_={address:`${p}/${w}`,state_id:w,state_name:y,description:et(g.description),format_key:nl(y),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};h.push(_),u.set(w,_)}let m={kind:c,id:p,name:l,aliases:f,description:et(d.description),importance:et(d.importance),format_key:nl(l),alias_format_keys:f.map(nl),reference_count:0,episode_count:0,scene_count:0,references:[],states:h,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(et).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=et(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}`),lh(u.references,f);let h=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let m of h){let g=u.stateById.get(m);g&&(g.reference_count+=1,g.episodeIds.add(p),g.sceneIds.add(`${p}/${l}`),lh(g.references,f))}};for(let c of oo(t.episodes)){if(!Ln(c))continue;let a=et(c.episode_id)||"<episode>";for(let d of oo(c.scenes)){if(!Ln(d))continue;let p=et(d.scene_id)||"<scene>",l=`${a}/${p}`;Ln(d.location)&&r("location",et(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of oo(d.actors))Ln(f)&&r("actor",et(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of oo(d.props))Ln(f)&&r("prop",et(f.prop_id),i(f),a,p,`${l}.props`);oo(d.actions).forEach((f,u)=>{if(!Ln(f)||!Ln(f.speaker))return;let h=et(f.speaker.actor_id);h&&r("actor",h,i(f.speaker),a,p,`${l}#${u+1}.speaker`)})}}let s=c=>{c.episode_count=c.episodeIds.size,c.scene_count=c.sceneIds.size;for(let a of c.states)a.episode_count=a.episodeIds.size,a.scene_count=a.sceneIds.size,a.frequency_flag=a.state_id==="default"?null:a.scene_count===0?"unused":a.scene_count===1?"singleton":null;return{kind:c.kind,id:c.id,name:c.name,aliases:c.aliases,description:c.description,importance:c.importance,format_key:c.format_key,alias_format_keys:c.alias_format_keys,reference_count:c.reference_count,episode_count:c.episode_count,scene_count:c.scene_count,references:c.references,states:c.states.map(a=>({address:a.address,state_id:a.state_id,state_name:a.state_name,description:a.description,format_key:a.format_key,reference_count:a.reference_count,episode_count:a.episode_count,scene_count:a.scene_count,references:a.references,frequency_flag:a.frequency_flag}))}};return{title:et(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var D=fn,mh=["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 gh=[D(5),D(38),D(40),D(34),D(6),D(11),D(82),D(35),D(62)],DI=[D(41),D(20),D(14)+mh[D(45)](D(68))+D(61),D(77)+gh[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)](`
|
|
265
|
-
`),
|
|
266
|
-
`)}function fn(e,t){e=e-0;let n=
|
|
263
|
+
${l}`:l,h=Date.now(),m=t.force?void 0:t.checkpoint?.readUpdate(d,p),g,w=!1;if(m!==void 0){let _=uh(m);try{if(_==null)throw new Te("checkpoint top-level JSON is unparseable");g=ls(_),w=!0,i++,t.executor.recordReuse("ingest.episode-assets")}catch(x){if(!(x instanceof Te))throw x;let E=await fh(t.executor,d,p,u,f,t.signal);g=E.delta,t.checkpoint?.writeStep(d,p,l,E.raw)}}else{let _=await fh(t.executor,d,p,u,f,t.signal);g=_.delta,t.checkpoint?.writeStep(d,p,l,_.raw)}ds(n,g,d,p);let y=DI(o.slice(d-1,p),n);if(y.length){let _=t.force?void 0:t.checkpoint?.readNameFix?.(d,p);if(_!==void 0){let x=uh(_);try{if(x==null)throw new Te("name-fix checkpoint top-level JSON is unparseable");let E=al(x,y);_h(n,E),ds(n,E,d,p),i++,t.executor.recordReuse("ingest.name-fix")}catch(E){if(!(E instanceof Te))throw E;let A=await mh(t.executor,d,p,Pa(n,p),y,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,A.raw),ds(n,A.delta,d,p)}}else{let x=await mh(t.executor,d,p,Pa(n,p),y,n,t.signal);t.checkpoint?.writeNameFix?.(d,p,x.raw),ds(n,x.delta,d,p)}}Hg(n);for(let _=Yp(n);_;_=Yp(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 U=_.map(v=>`${Hp(v)}\uFF1A${v.line}`).join(`
|
|
264
|
+
`);k=await eh(t.executor,`\u7B2C${x}\u96C6\u2013\u7B2C${E}\u96C6`,U,t.signal),t.checkpoint?.writeArc?.(x,E,k)}Qg(n,k)}t.onWindow?.({startEp:d,endEp:p,ms:Date.now()-h,cached:w,index:a,total:s.length,totalEpisodes:o.length})}return{...KI(e,n),episodes:o.length,reused:i}}function DI(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 GI={interior:"\u5185",exterior:"\u5916"},BI={day:"\u65E5",night:"\u591C"};function JI(e){let t=[`# ${e.episode_id}${e.title?` ${e.title}`:""}`];for(let n of e.scenes){t.push(`## ${n.scene_id}`);let o=[GI[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(`
|
|
265
|
+
`)}function KI(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=gh(a.actors.map(g=>Vo(t,g.name)).filter(g=>!dt(g)&&d(g))),f=gh(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 h=new Map;for(let g of t.lookChanges[a.scene_id]??[]){let w=Vo(t,g.entity),y=h.get(w)??[];y.includes(g.look)||y.push(g.look),h.set(w,y),o.set(w,g.look)}let m=g=>h.get(g)?.map(w=>({name:g,state:w}))??[hh(t,g,o)];a.location=p&&d(p)?hh(t,p,o):null,a.actors=l.flatMap(m),a.props=f.flatMap(m)}let i=Ua(n),r=i.script;HI(r,t),QI(r);let s=$a(r);return zI(s),FI(s),{doc:s,identityKeys:i.identityKeys}}var jI="\u5E38\u6001";function gh(e){let t=new Set;return e.filter(n=>{let o=xi(n);return!n||t.has(o)?!1:(t.add(o),!0)})}function hh(e,t,n){let o=zt(e,t),i=n.get(t)??(o?Fp(o):void 0)??jI;return{name:t,state:i}}function zI(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 HI(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=Fp(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 QI(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)>=VI;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 FI(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),oo=e=>Array.isArray(e)?e:[],et=e=>typeof e=="string"?e.trim():"";function cl(e){return e.normalize("NFKC").toLowerCase().replace(/[\p{White_Space}\p{P}\p{S}]+/gu,"")}var YI={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"}},xh=(e,t,n=8)=>{!t||e.includes(t)||e.length>=n||e.push(t)};function Sh(e){let t=Ln(e)?e:{},n={actor:[],location:[],prop:[]},o=new Map;for(let c of["actor","location","prop"]){let a=YI[c];for(let d of oo(t[a.list])){if(!Ln(d))continue;let p=et(d[a.id]),l=et(d[a.name]);if(!p)continue;let f=[...new Set(oo(d.aliases).map(et).filter(Boolean))],u=new Map,h=[];for(let g of oo(d.states)){if(!Ln(g))continue;let w=et(g.state_id);if(!w)continue;let y=et(g.state_name),_={address:`${p}/${w}`,state_id:w,state_name:y,description:et(g.description),format_key:cl(y),reference_count:0,episode_count:0,scene_count:0,references:[],frequency_flag:null,episodeIds:new Set,sceneIds:new Set};h.push(_),u.set(w,_)}let m={kind:c,id:p,name:l,aliases:f,description:et(d.description),importance:et(d.importance),format_key:cl(l),alias_format_keys:f.map(cl),reference_count:0,episode_count:0,scene_count:0,references:[],states:h,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(et).filter(Boolean);if(a.length>0)return[...new Set(a)];let d=et(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}`),xh(u.references,f);let h=d.length>0?d:u.stateById.has("default")?["default"]:[];for(let m of h){let g=u.stateById.get(m);g&&(g.reference_count+=1,g.episodeIds.add(p),g.sceneIds.add(`${p}/${l}`),xh(g.references,f))}};for(let c of oo(t.episodes)){if(!Ln(c))continue;let a=et(c.episode_id)||"<episode>";for(let d of oo(c.scenes)){if(!Ln(d))continue;let p=et(d.scene_id)||"<scene>",l=`${a}/${p}`;Ln(d.location)&&r("location",et(d.location.location_id),i(d.location),a,p,`${l}.location`);for(let f of oo(d.actors))Ln(f)&&r("actor",et(f.actor_id),i(f),a,p,`${l}.actors`);for(let f of oo(d.props))Ln(f)&&r("prop",et(f.prop_id),i(f),a,p,`${l}.props`);oo(d.actions).forEach((f,u)=>{if(!Ln(f)||!Ln(f.speaker))return;let h=et(f.speaker.actor_id);h&&r("actor",h,i(f.speaker),a,p,`${l}#${u+1}.speaker`)})}}let s=c=>{c.episode_count=c.episodeIds.size,c.scene_count=c.sceneIds.size;for(let a of c.states)a.episode_count=a.episodeIds.size,a.scene_count=a.sceneIds.size,a.frequency_flag=a.state_id==="default"?null:a.scene_count===0?"unused":a.scene_count===1?"singleton":null;return{kind:c.kind,id:c.id,name:c.name,aliases:c.aliases,description:c.description,importance:c.importance,format_key:c.format_key,alias_format_keys:c.alias_format_keys,reference_count:c.reference_count,episode_count:c.episode_count,scene_count:c.scene_count,references:c.references,states:c.states.map(a=>({address:a.address,state_id:a.state_id,state_name:a.state_name,description:a.description,format_key:a.format_key,reference_count:a.reference_count,episode_count:a.episode_count,scene_count:a.scene_count,references:a.references,frequency_flag:a.frequency_flag}))}};return{title:et(t.title),actors:n.actor.map(s),locations:n.location.map(s),props:n.prop.map(s)}}var D=fn,Ah=["id",D(38),D(13),D(90),D(40),D(34),D(6),D(82),D(35),D(62)];function ll(){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 ll=function(){return e},ll()}var kh=[D(5),D(38),D(40),D(34),D(6),D(11),D(82),D(35),D(62)],qI=[D(41),D(20),D(14)+Ah[D(45)](D(68))+D(61),D(77)+kh[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)](`
|
|
266
|
+
`),ZI=new Set([D(80),D(55),D(10),D(86),D(57),D(70),D(65)]),WI=new Set([D(85),D(78),D(21)]),XI=new Set([D(25),D(37),D(27)]);function un(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 dl(e){let t=D;return e[t(18)]>0?e[t(69)](un)[t(45)](";"):"-"}function eA(e){let t=D,n=[t(31),t(1)+un(e[t(42)]),t(46)+Ah[t(45)]("|"),t(39)+kh[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",un(c.id),un(c[s(38)]),dl(c[s(13)]),un(c[s(90)]),String(c[s(19)]),String(c[s(3)]),String(c[s(64)]),un(c[s(82)]),un(c[s(35)]),dl(c[s(4)])][s(45)]("|"));for(let a of c[s(17)])n[s(71)](["S",un(a[s(5)]),un(a[s(49)]),String(a[s(19)]),String(a[s(3)]),String(a[s(64)]),a[s(15)]??"-",un(a[s(82)]),un(a[s(35)]),dl(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)](`
|
|
267
|
+
`)}function fn(e,t){e=e-0;let n=ll(),o=n[e];if(fn.qyTtRy===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};fn.uxwRFZ=i,fn.OXUPnC={},fn.qyTtRy=!0}let r=n[0];fn.TDHWfX!==r&&(fn.OXUPnC={},fn.TDHWfX=r);let s=fn.OXUPnC[e];return s===void 0?(o=fn.uxwRFZ(o),fn.OXUPnC[e]=o):o=s,o}var Ih=e=>typeof e===D(48)&&e!==null&&!Array[D(33)](e),bh=e=>Array[D(33)](e)?e:[],Si=e=>typeof e===D(63)?e[D(93)]():"",pl=e=>[...new Set(bh(e)[D(69)](Si)[D(30)](Boolean))];function tA(e,t){let n=D;if(!Ih(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 bh(e[n(73)])){if(!Ih(s))continue;let c=Si(s[n(50)]),a=Si(s[n(28)]),d=Si(s[n(76)]);if(!ZI[n(44)](c)||!WI[n(44)](a)||!XI[n(44)](d))continue;let p=pl(s[n(0)])[n(30)](h=>o[n(44)](h)),l=pl(s[n(29)])[n(30)](h=>i[n(44)](h));if(p[n(18)]===0&&l[n(18)]===0)continue;let f=Si(s[n(51)]),u=f&&(o[n(44)](f)||i[n(44)](f))?f:null;r[n(71)]({type:c,asset_ids:p,state_ids:l,names:pl(s[n(87)]),evidence:Si(s[n(16)]),recommendation:Si(s[n(24)]),suggested_survivor:u,action:a,confidence:d})}return r}async function vh(e,t,n){let o=D,i=await e[o(12)](o(66),{system:qI,user:eA(t),tool:{name:o(26),description:o(89),inputSchema:ih},...n?{signal:n}:{}});return tA(i[o(72)],t)}var Oh="1",nA=(e,t)=>{if(e===null||typeof e!="object"||Array.isArray(e))return!1;let n=e;return n.audit_version===Oh&&n.script_hash===t&&n.summary!==null&&typeof n.summary=="object"&&Array.isArray(n.issues)};function oA(e,t){return{audit_version:Oh,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 ul(e,t,n){let o=Je(e),i=Sh(e),r=await vh(t,i,n);return oA(o,r)}async function iA(e){let t=Je(e.script);if(!e.force&&e.exists())try{let o=e.read();if(nA(o,t))return e.executor.recordReuse("ingest.asset-audit"),{report:o,reused:!0}}catch{}let n=await ul(e.script,e.executor,e.signal);return e.write(n),{report:n,reused:!1}}async function Rh(e,t,n,o={}){return iA({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 rA={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 fl(e){let t=[...e.asset_ids,...e.state_ids].join(", ")||"<unknown>",n=e.evidence||e.recommendation||"review the referenced assets";return`${rA[e.type]} [${t}]: ${n}`}function Mh(e){return e.issues.map(t=>({code:`asset_audit_${t.type}`,path:"$",message:`${fl(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 Lh(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 Uh from"node:crypto";function gl(){return{calls:0,succeeded:0,failed:0,reused:0,attempts:0,durationMs:0,inputTokens:0,outputTokens:0,cachedInputTokens:0,cacheCreationTokens:0,totalTokens:0}}function sA(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 Ba(e){let t=gl();for(let n of e)sA(t,n);return t}var fs=e=>`${e.provider}\0${e.protocol}\0${e.model}`;function Ph(e){let t=new Map;for(let n of e){let o=fs(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:Ba(n.records)})).sort((n,o)=>fs(n).localeCompare(fs(o)))}function ml(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:Ba(o),byModel:Ph(o)})).sort((n,o)=>n.task.localeCompare(o.task))}function Nh(e){return Ph(e).map(t=>{let n=e.filter(o=>fs(o)===fs(t));return{...t,byTask:ml(n).map(({task:o,totals:i})=>({task:o,totals:i}))}})}function aA(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:Ba(d),byTask:ml(d),byModel:Nh(d),durationMs:a.reduce((p,l)=>p+l.durationMs,0),runs:a}}).sort((c,a)=>c.episode-a.episode),s=Ba(e.records);return{...e,updatedAt:t,totals:s,byTask:ml(e.records),byModel:Nh(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 cA(e){return{version:2,createdAt:e,updatedAt:e,totals:gl(),byTask:[],byModel:[],episodes:[],runs:[],records:[],timing:{totalDurationMs:0,modelDurationMs:0,episodeDurationMs:0}}}function us(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=us(this.startedAtMs);if(this.report=t.has("usage.json")?t.readJson("usage.json"):cA(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=Uh.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:us(o),endedAt:us(n),durationMs:Math.max(0,n-o),stages:t.stages??{},recordIds:s.map(p=>p.id)}),a||this.report.episodes.push({episode:c,totals:gl(),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=us(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=us(t),this.report=aA(this.report),this.store.writeJson("usage.json",this.report)}};var yl="12",Ja=e=>String(e).padStart(3,"0"),Ch=e=>e.map(t=>JSON.stringify(t)).join(`
|
|
267
268
|
`)+`
|
|
268
|
-
`;function
|
|
269
|
+
`;function dA(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!==yl)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 ${yl}`]}})}if(n){for(let o of["pass1","pass2","pass3","pass5","serial"])hl.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"])hl.rmSync(e.path(o),{force:!0})}}async function Th(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 Oa(t.path,t.ext),o=_e(n),i=new mt(e.workspacePath);i.ensure(),dA(i,o,e.force??!1);let r=new pr(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 Zg(e.executor,n,e.signal);d=P.line,i.writeJson("pass1/body_start.json",P)}let p=n.split(`
|
|
269
270
|
`),l=d>0?p.slice(d).join(`
|
|
270
271
|
`):n,f=d>0?p.slice(0,d).join(`
|
|
271
|
-
`).trim().slice(0,6e3):"",u=bg(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 h=0;r.phaseStart("normalize");let m=await Jg(u,e.concurrency??30,async P=>{let ce=`pass2/chunk_${Va(P.index)}.json`,Se=`pass2/chunk_${Va(P.index)}.error.json`;if(i.has(ce)&&!e.force){let Li=Hp(i.readJson(ce),P);return i.clearError(Se),h++,e.executor.recordReuse("ingest.text-normalize"),Li}let{raw:Ot,records:Cn}=await $g(e.executor,P,e.signal);return i.writeText(ce,Ot),i.writeText(`pass2/chunk_${Va(P.index)}.jsonl`,kh(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_${Va(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,y,_;if(!e.force&&i.has("body.json"))w=i.readJson("body.json"),y=i.has("pass3/script.jsonl")?is(i.readText("pass3/script.jsonl")).length:0,_=i.has("notes.json")?i.readJson("notes.json").length:0,h++;else{let P=[];for(let Cn of m)Cn.ok&&P.push(...Cn.value);i.writeText("pass3/script.jsonl",kh(P));let ce=is(i.readText("pass3/script.jsonl")),Se=XI(t.path),Ot=kg(ce,{title:Se});i.writeJson("notes.json",Ot.notes),w=Ot.script,i.writeJson("body.json",w),y=P.length,_=Ot.notes.length}og(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 ph(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}:{}}),U=k.doc;h+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:v,idMap:I}=La(U);i.writeJson("id_map.json",I);let R=wt(v);if(!R.ok)throw i.writeJson("validation.json",R),new S("Intermediate script failed validation before v4 identity assignment.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:R.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});let C=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,L=sr(Tt(U),C,k.identityKeys),M=L.script,j=Ue(M),Z=[],Be=Date.now(),ie="failed";try{if(j.ok){let P=await _h(i,M,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});Z=Eh(P.report)}ie="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:ie,startedAtMs:Be})}let K={...j,warnings:[...j.warnings,...rr(M),...Z]};if(i.writeJson("pass5/script.json",M),i.writeJson("v4_identity_map.json",L.identityMap),i.writeJson("validation.json",K),!K.ok)throw new S("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:K.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});i.writeJson("script.json",M),r.phaseEnd("govern"),r.finish();let vt=M;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:h,records:y,notes:_,assets:{actors:vt.actors?.length??0,locations:vt.locations?.length??0,props:vt.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:K.ok,errors:K.errors.length,warnings:K.warnings.length}}}finally{s.finish(c)}}function XI(e){return dr.basename(e,dr.extname(e))}import*as so from"node:fs";import*as Ai from"node:path";import{createHash as IA}from"node:crypto";var eA=()=>({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(),Da=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function tA(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 nA=3,oA=12e3;function Ii(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var iA=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function $a(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:eA();for(let i of iA){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=>Mn(s.name)===Mn(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=$a(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=>tA(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:$a(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(h=>({...h})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(h=>h.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let h of[...s.recognitionAnchors,...a.recognitionAnchors])Ii(d.recognitionAnchors,h);let u=$a(void 0,s.identityProfile,!0);d.identityProfile=$a(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let h of[...l,...p.states])fl(d.states,h,!1);d.aliases=[...f].filter(h=>xe(h)!==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 Rh(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function rA(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: ${Da(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 vh(e,t){let n=Da(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${Da(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 Oh(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(...rA(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(vh(a,n));for(let a of s)o.push(vh(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?Da(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(`
|
|
272
|
-
`)}function Ga(e){for(let t=nA;t>=1;t--){let n=Oh(e,t,!1);if(n.length<=oA)return n}return Oh(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 sA(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 Mh(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 h of p)if(l=t.find(m=>xe(m.name)===xe(h)||xe(m.identitySeed)===xe(h)||m.aliases.some(g=>xe(g)===xe(h))),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"?sA(l):[l.appearance,l.role].map(h=>(h?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let h of a.states??[]){let m=l.states.find(g=>Mn(g.name)===Mn(h.state_name));m?.description?h.description=m.description:h.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(h.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function Lh(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)}]),h=p.actions.map((m,g)=>{let w={kind:"comic",document_id:d.document_id,pages:m.pages,regions:m.regions},y={identity_key:`${f}:action:${g+1}`,type:m.type,content:m.content,extend:{scriptctl:{source:w}}};if((m.type==="dialogue"||m.type==="inner_thought")&&(y.speaker=r(m.speaker),m.parenthetical&&(y.parenthetical=m.parenthetical),"name"in y.speaker)){let _=y.speaker.name;u.some(x=>x.name===_)||u.push({name:_})}return y});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:h}})}))},a=new Set(t.registry.map(d=>`${d.kind}:${d.name}`));for(let d of c.episodes)for(let p of d.scenes){let f=[...p.actors.map(u=>`actor:${u.name}`),...p.props.map(u=>`prop:${u.name}`),...p.location?[`location:${p.location.name}`]:[]].filter(u=>!a.has(u));if(f.length)throw new S(`Comic scene references assets absent from the registry: ${f.join(", ")}`,{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"The episode must register every referenced character, location and key prop.",data:{actual:f}})}return c}var pr=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function aA(e,t,n){let o=Bo(t),i=l=>o.get(l)??l,r=new Map;for(let l of t){let f=i(l.name),h=t.find(g=>g.kind===l.kind&&pr(g.name)===pr(f))??l,m=`${l.kind}:${pr(f)}`;r.has(m)||r.set(m,`${n}:${h.kind}:${h.firstEpisode}:${pr(h.identitySeed)}`)}let s={},c={},a={},d={},p={actor:s,location:c,prop:a};for(let l of e){let f=l.names[0]??l.provisional_id,u=r.get(`${l.kind}:${pr(f)}`)??`${n}:${l.kind}:source:${pr(f)}`;p[l.kind][l.provisional_id]=u,d[l.provisional_id]=Object.fromEntries(l.states.map(h=>[h.id,`${u}:state:${Mn(h.name)}`]))}return{actor:s,location:c,prop:a,state:d}}function Ba(e,t,n,o){let{script:i,assets:r,identityKeys:s}=Oa(e);Mh(i,t.registry);let c=Ua(i),{script:a,idMap:d}=La(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,{...aA(r,t.registry,n),...s}),f=l.script,u=Ue(f);return{initial:i,final:f,scriptV4:f,idMap:d,identityMap:l.identityMap,validation:{...u,warnings:[...u.warnings,...rr(f)]}}}import*as Nh from"node:fs";import*as io from"node:path";import{createHash as cA}from"node:crypto";import{PDFDocument as dA}from"pdf-lib";import*as Ja from"node:path";function Ka(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 pA(e){let t=e.kind==="comic-file"?[e.path]:e.files,n=t.map(i=>({path:i,sourceNumber:Ka(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 Uh(e){let t=[];for(let[n,o]of pA(e).entries()){let i=Nh.readFileSync(o.path),s=(await dA.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:cA("sha256").update(i).digest("hex"),page_count:s,size_bytes:i.length})}return t}function Ph(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 lA,StandardFonts as uA,rgb as fA,pushGraphicsState as mA,popGraphicsState as gA,concatTransformationMatrix as ja}from"pdf-lib";async function Ch(e){let t=await lA.load(e),n=await t.embedFont(uA.Helvetica),o=fA(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(mA()),s){case 90:i.pushOperators(ja(0,1,-1,0,r.x+r.width,r.y));break;case 180:i.pushOperators(ja(-1,0,0,-1,r.x+r.width,r.y+r.height));break;case 270:i.pushOperators(ja(0,-1,1,0,r.x,r.y+r.height));break;default:i.pushOperators(ja(1,0,0,1,r.x,r.y))}let p=a/70;for(let l=0;l<=1e3;l+=50){let f=d*(1-l/1e3);i.drawLine({start:{x:0,y:f},end:{x:a,y:f},thickness:.5,color:o,opacity:.3});let u=`y=${l}`,h=Math.max(1,Math.min(d-p,f+1));for(let m of[1,a-n.widthOfTextAtSize(u,p)-1])i.drawText(u,{x:m,y:h,size:p,font:n,color:o})}for(let l=100;l<1e3;l+=100){let f=a*l/1e3;i.drawLine({start:{x:f,y:0},end:{x:f,y:d},thickness:.5,color:o,opacity:.3});for(let u=0;u<1e3;u+=250)i.drawText(`x=${l}`,{x:f+1,y:d*(1-u/1e3)-p,size:p,font:n,color:o})}i.pushOperators(gA())}return t.save()}import*as Th from"node:fs";import*as Vh from"node:path";import hA from"proper-lockfile";async function Jo(e,t){let n=Vh.resolve(e);Th.mkdirSync(n,{recursive:!0});let o=null;try{o=await hA.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 $h=lr.object({starts:lr.array(lr.object({page:lr.number().int().min(1),title:lr.string().min(1)}))}),yA="\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 Dh(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 h=await ml.create();for(let m of await h.copyPages(a,Array.from({length:p},(g,w)=>d+w)))h.addPage(m);if(l=await h.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
|
|
273
|
-
`);let u=await n.prepare(f,o);try{let h=await n.generate({media:u,system:yA,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($h,{target:"openapi-3.0"}),signal:o}),m=$h.parse(JSON.parse(h.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 h=await ml.create();for(let m of await h.copyPages(a,Array.from({length:l-p.page+1},(g,w)=>p.page-1+w)))h.addPage(m);ro.mkdirSync(gl.dirname(u),{recursive:!0}),yi(u,Buffer.from(await h.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 Gh}from"zod";var za=mn,wA=za(7);function yl(e,t){let n=za,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 Bh(e,t,n,o,i,r,s){let c=za,a=await e[c(2)]({media:t,system:wA,user:c(3)+n+c(22)+o+c(0)+i,responseJsonSchema:Gh[c(5)](Gm,{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","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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 hl=function(){return e},hl()}async function Jh(e,t,n,o,i,r){let s=za,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:Gh[s(5)](c,{target:s(35)})});return c[s(12)](JSON[s(12)](a[s(26)]))}function mn(e,t){e=e-0;let n=hl(),o=n[e];if(mn.pkbepj===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};mn.AcwwSN=i,mn.wSoQuY={},mn.pkbepj=!0}let r=n[0];mn.aUTMuq!==r&&(mn.wSoQuY={},mn.aUTMuq=r);let s=mn.wSoQuY[e];return s===void 0?(o=mn.AcwwSN(o),mn.wSoQuY[e]=o):o=s,o}function Ha(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function _A(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 EA(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(_A(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 Qa(e,t,n){let o=EA(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 Kh(e,t){return typeof e=="string"&&t.some(n=>n===e)}function ur(e){return typeof e=="string"?e:void 0}function xA(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Ha(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 SA(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:Kh(t,["prompt","candidate"])?t:void 0,provider_reason:Kh(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:xA(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function ls(e){if(!Ha(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,{...SA(e),retryable:e.retryable,message:e.message})}function us(e){if(!Ha(e)||e.schema_version!==1)return null;let t=e.unit;if(!Ha(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 zh="comic-1",Fa=e=>String(e).padStart(3,"0"),Hh=["script.initial.json","id_map.json","validation.json","context.json","v4_identity_map.json","script.json"];function Ya(e,t,n){let o=Ba(Lh(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 AA(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(Ai.resolve(e.workspacePath));n.ensure();let o=n.has("manifest.json")?n.readJson("manifest.json"):null;if(o&&o.pipeline_version!==zh)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 Uh(t),r=o&&!o.episodes.some(w=>w.original_path)?i:await Dh(i,n,e.executor.documentPort("ingest.comic-serial"),e.signal);o&&Ph(o.episodes,r);let s={version:1,pipeline_version:zh,updated:new Date().toISOString(),source:{kind:t.kind,path:Ai.resolve(t.path),sha256:IA("sha256").update(r.map(w=>w.sha256).join(`
|
|
274
|
-
`)).digest("hex")},episodes:r,...o?.current_error?{current_error:o.current_error}:{}};if(e.force){for(let w of o?.episodes??[])for(let y of["json","response.json","context.md","error.json","input.pdf"])so.rmSync(n.path(`ep/ep_${
|
|
272
|
+
`).trim().slice(0,6e3):"",u=Tg(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:yl,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 h=0;r.phaseStart("normalize");let m=await Wg(u,e.concurrency??30,async P=>{let ce=`pass2/chunk_${Ja(P.index)}.json`,Se=`pass2/chunk_${Ja(P.index)}.error.json`;if(i.has(ce)&&!e.force){let Li=Wp(i.readJson(ce),P);return i.clearError(Se),h++,e.executor.recordReuse("ingest.text-normalize"),Li}let{raw:Ot,records:Cn}=await Fg(e.executor,P,e.signal);return i.writeText(ce,Ot),i.writeText(`pass2/chunk_${Ja(P.index)}.jsonl`,Ch(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_${Ja(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,y,_;if(!e.force&&i.has("body.json"))w=i.readJson("body.json"),y=i.has("pass3/script.jsonl")?cs(i.readText("pass3/script.jsonl")).length:0,_=i.has("notes.json")?i.readJson("notes.json").length:0,h++;else{let P=[];for(let Cn of m)Cn.ok&&P.push(...Cn.value);i.writeText("pass3/script.jsonl",Ch(P));let ce=cs(i.readText("pass3/script.jsonl")),Se=pA(t.path),Ot=Cg(ce,{title:Se});i.writeJson("notes.json",Ot.notes),w=Ot.script,i.writeJson("body.json",w),y=P.length,_=Ot.notes.length}fg(w,Ia(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 Eh(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}:{}}),U=k.doc;h+=k.reused,r.phaseEnd("serial"),r.phaseStart("govern");let{script:v,idMap:I}=Ta(U);i.writeJson("id_map.json",I);let R=wt(v);if(!R.ok)throw i.writeJson("validation.json",R),new S("Intermediate script failed validation before v4 identity assignment.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:R.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});let C=!e.force&&i.has("v4_identity_map.json")?i.readJson("v4_identity_map.json"):void 0,L=cr(Tt(U),C,k.identityKeys),M=L.script,j=Ue(M),Z=[],Be=Date.now(),ie="failed";try{if(j.ok){let P=await Rh(i,M,e.executor,{force:e.force??!1,...e.signal?{signal:e.signal}:{}});Z=Mh(P.report)}ie="succeeded"}finally{s.flush({scope:{kind:"phase",phase:"asset-audit"},status:ie,startedAtMs:Be})}let K={...j,warnings:[...j.warnings,...ar(M),...Z]};if(i.writeJson("pass5/script.json",M),i.writeJson("v4_identity_map.json",L.identityMap),i.writeJson("validation.json",K),!K.ok)throw new S("Final script.json failed v4 validation.",{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"Inspect validation.json.",data:{actual:K.errors.slice(0,5).map(P=>`${P.path}: ${P.message}`)}});i.writeJson("script.json",M),r.phaseEnd("govern"),r.finish();let vt=M;return c="succeeded",{workspacePath:i.root,chunks:u.length,reused:h,records:y,notes:_,assets:{actors:vt.actors?.length??0,locations:vt.locations?.length??0,props:vt.props?.length??0},scriptPath:i.path("script.json"),validation:{ok:K.ok,errors:K.errors.length,warnings:K.warnings.length}}}finally{s.finish(c)}}function pA(e){return lr.basename(e,lr.extname(e))}import*as so from"node:fs";import*as Ai from"node:path";import{createHash as PA}from"node:crypto";var lA=()=>({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(),ja=(e,t)=>e.length>t?`${e.slice(0,t)}\u2026`:e;function uA(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 fA=3,mA=12e3;function Ii(e,t){let n=(t??"").trim();n&&!e.includes(n)&&e.push(n)}var gA=["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"];function Ka(e,t,n){if(!t)return e;let o=e?{...e,persistent_marks:[...e.persistent_marks]}:lA();for(let i of gA){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 _l(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 wl(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=Ka(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??[])_l(e.states,s,o);e.lastEpisode=n}function ms(e,t,n){let o=r=>uA(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){wl(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??[])_l(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:Ka(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&&wl(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(h=>({...h})),f=new Set([...s.aliases,...a.aliases,s.identitySeed,a.identitySeed,s.name,a.name,r.from_name].map(h=>h.trim()).filter(Boolean));d.name=c,d.status="canonical",d.importance=s.importance==="featured"||a.importance==="featured"?"featured":"background",d.recognitionAnchors=[];for(let h of[...s.recognitionAnchors,...a.recognitionAnchors])Ii(d.recognitionAnchors,h);let u=Ka(void 0,s.identityProfile,!0);d.identityProfile=Ka(u,a.identityProfile,!0),(a.appearance||s.appearance)&&(d.appearance=a.appearance||s.appearance),d.role=a.role||s.role,d.states=[];for(let h of[...l,...p.states])_l(d.states,h,!1);d.aliases=[...f].filter(h=>xe(h)!==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&&wl(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 Dh(e,t){return e.digests.push({episode:t,synopsis:"",outcome:"skipped"}),e.lastEpisode=t,e}function hA(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: ${ja(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 Vh(e,t){let n=ja(e.appearance||e.role||"",t?30:60),o=e.states.map(i=>i.description?`${i.name}\uFF08${ja(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 $h(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(...hA(a,n),"")}if(r.length||s.length){o.push("## \u573A\u666F / \u9053\u5177","");for(let a of r)o.push(Vh(a,n));for(let a of s)o.push(Vh(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?ja(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(`
|
|
273
|
+
`)}function za(e){for(let t=fA;t>=1;t--){let n=$h(e,t,!1);if(n.length<=mA)return n}return $h(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 yA(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 Gh(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 h of p)if(l=t.find(m=>xe(m.name)===xe(h)||xe(m.identitySeed)===xe(h)||m.aliases.some(g=>xe(g)===xe(h))),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"?yA(l):[l.appearance,l.role].map(h=>(h?.trim()??"").replace(/[。;]+$/,"")).filter(Boolean).join("\uFF1B");u&&(a.description=`${u}\u3002`);for(let h of a.states??[]){let m=l.states.find(g=>Mn(g.name)===Mn(h.state_name));m?.description?h.description=m.description:h.state_name==="default"&&l.kind!=="actor"&&l.appearance&&(h.description=l.appearance)}}};return r(e.actors,"actor_name"),r(e.locations,"location_name"),r(e.props,"prop_name"),e}function Bh(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)}]),h=p.actions.map((m,g)=>{let w={kind:"comic",document_id:d.document_id,pages:m.pages,regions:m.regions},y={identity_key:`${f}:action:${g+1}`,type:m.type,content:m.content,extend:{scriptctl:{source:w}}};if((m.type==="dialogue"||m.type==="inner_thought")&&(y.speaker=r(m.speaker),m.parenthetical&&(y.parenthetical=m.parenthetical),"name"in y.speaker)){let _=y.speaker.name;u.some(x=>x.name===_)||u.push({name:_})}return y});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:h}})}))},a=new Set(t.registry.map(d=>`${d.kind}:${d.name}`));for(let d of c.episodes)for(let p of d.scenes){let f=[...p.actors.map(u=>`actor:${u.name}`),...p.props.map(u=>`prop:${u.name}`),...p.location?[`location:${p.location.name}`]:[]].filter(u=>!a.has(u));if(f.length)throw new S(`Comic scene references assets absent from the registry: ${f.join(", ")}`,{exitCode:b,errorCode:"INGEST_VALIDATION_FAILED",hint:"The episode must register every referenced character, location and key prop.",data:{actual:f}})}return c}var ur=e=>e.normalize("NFC").replace(/\s+/g," ").trim().toLowerCase();function wA(e,t,n){let o=Bo(t),i=l=>o.get(l)??l,r=new Map;for(let l of t){let f=i(l.name),h=t.find(g=>g.kind===l.kind&&ur(g.name)===ur(f))??l,m=`${l.kind}:${ur(f)}`;r.has(m)||r.set(m,`${n}:${h.kind}:${h.firstEpisode}:${ur(h.identitySeed)}`)}let s={},c={},a={},d={},p={actor:s,location:c,prop:a};for(let l of e){let f=l.names[0]??l.provisional_id,u=r.get(`${l.kind}:${ur(f)}`)??`${n}:${l.kind}:source:${ur(f)}`;p[l.kind][l.provisional_id]=u,d[l.provisional_id]=Object.fromEntries(l.states.map(h=>[h.id,`${u}:state:${Mn(h.name)}`]))}return{actor:s,location:c,prop:a,state:d}}function Ha(e,t,n,o){let{script:i,assets:r,identityKeys:s}=Ua(e);Gh(i,t.registry);let c=$a(i),{script:a,idMap:d}=Ta(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,{...wA(r,t.registry,n),...s}),f=l.script,u=Ue(f);return{initial:i,final:f,scriptV4:f,idMap:d,identityMap:l.identityMap,validation:{...u,warnings:[...u.warnings,...ar(f)]}}}import*as Jh from"node:fs";import*as io from"node:path";import{createHash as _A}from"node:crypto";import{PDFDocument as EA}from"pdf-lib";import*as Qa from"node:path";function Fa(e){let t=Qa.basename(e,Qa.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 xA(e){let t=e.kind==="comic-file"?[e.path]:e.files,n=t.map(i=>({path:i,sourceNumber:Fa(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 Kh(e){let t=[];for(let[n,o]of xA(e).entries()){let i=Jh.readFileSync(o.path),s=(await EA.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:_A("sha256").update(i).digest("hex"),page_count:s,size_bytes:i.length})}return t}function jh(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 SA,StandardFonts as IA,rgb as AA,pushGraphicsState as kA,popGraphicsState as bA,concatTransformationMatrix as Ya}from"pdf-lib";async function zh(e){let t=await SA.load(e),n=await t.embedFont(IA.Helvetica),o=AA(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(kA()),s){case 90:i.pushOperators(Ya(0,1,-1,0,r.x+r.width,r.y));break;case 180:i.pushOperators(Ya(-1,0,0,-1,r.x+r.width,r.y+r.height));break;case 270:i.pushOperators(Ya(0,-1,1,0,r.x,r.y+r.height));break;default:i.pushOperators(Ya(1,0,0,1,r.x,r.y))}let p=a/70;for(let l=0;l<=1e3;l+=50){let f=d*(1-l/1e3);i.drawLine({start:{x:0,y:f},end:{x:a,y:f},thickness:.5,color:o,opacity:.3});let u=`y=${l}`,h=Math.max(1,Math.min(d-p,f+1));for(let m of[1,a-n.widthOfTextAtSize(u,p)-1])i.drawText(u,{x:m,y:h,size:p,font:n,color:o})}for(let l=100;l<1e3;l+=100){let f=a*l/1e3;i.drawLine({start:{x:f,y:0},end:{x:f,y:d},thickness:.5,color:o,opacity:.3});for(let u=0;u<1e3;u+=250)i.drawText(`x=${l}`,{x:f+1,y:d*(1-u/1e3)-p,size:p,font:n,color:o})}i.pushOperators(bA())}return t.save()}import*as Hh from"node:fs";import*as Qh from"node:path";import vA from"proper-lockfile";async function Jo(e,t){let n=Qh.resolve(e);Hh.mkdirSync(n,{recursive:!0});let o=null;try{o=await vA.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 xl from"node:path";import{PDFDocument as El}from"pdf-lib";import{z as fr}from"zod";var Fh=fr.object({starts:fr.array(fr.object({page:fr.number().int().min(1),title:fr.string().min(1)}))}),OA="\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 Yh(e,t,n,o){let i=[];for(let r of e){let s=`sources/${r.sha256}.chapters.json`,c,a=await El.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 h=await El.create();for(let m of await h.copyPages(a,Array.from({length:p},(g,w)=>d+w)))h.addPage(m);if(l=await h.save(),l.length<=4e7||p===1)break;p=Math.ceil(p/2)}let f=t.path(`sources/${r.sha256}.scan.pdf`);ro.mkdirSync(xl.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
|
|
274
|
+
`);let u=await n.prepare(f,o);try{let h=await n.generate({media:u,system:OA,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(Fh,{target:"openapi-3.0"}),signal:o}),m=Fh.parse(JSON.parse(h.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 h=await El.create();for(let m of await h.copyPages(a,Array.from({length:l-p.page+1},(g,w)=>p.page-1+w)))h.addPage(m);ro.mkdirSync(xl.dirname(u),{recursive:!0}),yi(u,Buffer.from(await h.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 qh}from"zod";var qa=mn,RA=qa(7);function Il(e,t){let n=qa,o=xa[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=ts(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 Zh(e,t,n,o,i,r,s){let c=qa,a=await e[c(2)]({media:t,system:RA,user:c(3)+n+c(22)+o+c(0)+i,responseJsonSchema:qh[c(5)](qm,{target:c(35)}),signal:s});return r(a[c(26)]),Il(a[c(26)],o)}function Sl(){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 Sl=function(){return e},Sl()}async function Wh(e,t,n,o,i,r){let s=qa,c=xa[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:qh[s(5)](c,{target:s(35)})});return c[s(12)](JSON[s(12)](a[s(26)]))}function mn(e,t){e=e-0;let n=Sl(),o=n[e];if(mn.pkbepj===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};mn.AcwwSN=i,mn.wSoQuY={},mn.pkbepj=!0}let r=n[0];mn.aUTMuq!==r&&(mn.wSoQuY={},mn.aUTMuq=r);let s=mn.wSoQuY[e];return s===void 0?(o=mn.AcwwSN(o),mn.wSoQuY[e]=o):o=s,o}function Za(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function MA(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 LA(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(MA(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 Wa(e,t,n){let o=LA(e);return{schema_version:1,unit:{kind:"episode",episode:t},phase:n,occurred_at:new Date().toISOString(),...o}}function ey(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 Xh(e,t){return typeof e=="string"&&t.some(n=>n===e)}function mr(e){return typeof e=="string"?e:void 0}function NA(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(!Za(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 UA(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:Xh(t,["prompt","candidate"])?t:void 0,provider_reason:Xh(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:NA(e.safety_ratings),details:Array.isArray(e.details)&&e.details.every(i=>typeof i=="string")?e.details:void 0}}function gs(e){if(!Za(e))return null;let t=Iu(e.failure_type,e.failure_code);return!t||typeof e.retryable!="boolean"||typeof e.message!="string"?null:Ut(t,{...UA(e),retryable:e.retryable,message:e.message})}function hs(e){if(!Za(e)||e.schema_version!==1)return null;let t=e.unit;if(!Za(t)||t.kind!=="episode"||typeof t.episode!="number"||typeof e.phase!="string"||typeof e.occurred_at!="string")return null;let n=gs(e.failure);if(!n||!Array.isArray(e.attempts))return null;let o=[];for(let i of e.attempts){let r=gs(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 ty="comic-1",Xa=e=>String(e).padStart(3,"0"),ny=["script.initial.json","id_map.json","validation.json","context.json","v4_identity_map.json","script.json"];function ec(e,t,n){let o=Ha(Bh(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 Al(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 CA(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(Ai.resolve(e.workspacePath));n.ensure();let o=n.has("manifest.json")?n.readJson("manifest.json"):null;if(o&&o.pipeline_version!==ty)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 Kh(t),r=o&&!o.episodes.some(w=>w.original_path)?i:await Yh(i,n,e.executor.documentPort("ingest.comic-serial"),e.signal);o&&jh(o.episodes,r);let s={version:1,pipeline_version:ty,updated:new Date().toISOString(),source:{kind:t.kind,path:Ai.resolve(t.path),sha256:PA("sha256").update(r.map(w=>w.sha256).join(`
|
|
275
|
+
`)).digest("hex")},episodes:r,...o?.current_error?{current_error:o.current_error}:{}};if(e.force){for(let w of o?.episodes??[])for(let y of["json","response.json","context.md","error.json","input.pdf"])so.rmSync(n.path(`ep/ep_${Xa(w.episode)}.${y}`),{force:!0});for(let w of["checkpoint.json","timings.json",...ny])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_${Xa(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 pr(w=>n.writeJson("timings.json",w));f.phaseStart("serial"),f.serialStart(r.length,r.length);let u="failed",h=0,m=a.length,g;try{if(a.length>0){Al(n,ec(a,c,p),c.context);for(let _ of a)n.clearError(`ep/ep_${Xa(_.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 ny)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 v=Date.now();l.flush({scope:{kind:"episode",episode:_.episode},status:"reused",startedAtMs:v,endedAtMs:v}),f.windowDone(_.episode,_.episode,0,!0);continue}if(e.step&&h>=1)break;let x=Date.now(),E=`ep/ep_${Xa(_.episode)}`,A=s.current_error?.unit.episode===_.episode?s.current_error.failure.message:void 0,k=za(c.context)+(A?`
|
|
275
276
|
|
|
276
277
|
\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
|
|
277
|
-
`);let U="upload";try{g??=e.executor.documentPort("ingest.comic-serial");let v=n.path(`${E}.input.pdf`);yi(v,Buffer.from(await
|
|
278
|
-
`);let K=await g.prepare(v,e.signal);try{R.output.registry_delta=await
|
|
279
|
-
`)}catch(v){let I=Qa(v,_.episode,U);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()}),v}}let w=Ya(a,c,p);wl(n,w,c.context);let y=a.length===r.length;return u="succeeded",{workspace:n.root,script_path:n.path("script.json"),kind:"comic",episodes:r.length,processed:h,reused:m,completed:a.length,remaining:r.length-a.length,complete:y,next_episode:y?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 Qh(e){return Jo(e.workspacePath,()=>AA(e))}import*as kt from"node:fs";import*as Ft from"node:path";function kA(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 Fh(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=kA(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 qa(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 Yh=e=>String(e).padStart(3,"0"),bA={\u5185:"interior",\u5916:"exterior"},vA={act:"action",dlg:"dialogue",think:"inner_thought"},_l={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function OA(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 qh(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_${Yh(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=bA[(a.environment.space??"").trim()],h=Co(a.environment.time);u&&(f.space=u),h&&(f.time=h);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,y=a.anchors.map(A=>{let k=fr(A.ts),U=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,v=(w.get(U)??0)+1;w.set(U,v);let I={identity_key:`${l}:action:${U}:${v}`,type:vA[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let C=OA(A.speaker);I.speaker=C,"name"in C&&g(C.name)}A.parenthetical&&(I.parenthetical=A.parenthetical);let R=fr(A.ts);return R&&(I.extend={timestamp:R}),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_${Yh(++n)}`,...f.space||f.time?{environment:f}:{},location:_?{name:_}:null,actors:m,props:x,actions:y}})}});return{title:t,episodes:o}}var RA=60,MA=6,LA=[-1e3,0,1e3],ey=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,El=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,xl=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,Zh=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,ty=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,ny=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,oy=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function Ko(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function iy(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 ry(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function sy(e,t="clock"){return t==="legacy_centiseconds"?ry(e):iy(e)}function Sl(e,t){return e===null?!1:t===void 0||e<=t}function NA(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(ay)).filter(Boolean),o=n.filter(r=>Sl(iy(r),t)).length;return n.filter(r=>Sl(ry(r),t)).length>o?"legacy_centiseconds":"clock"}function Wh(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 ay(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function UA(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 cy(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function dy(e,t,n){return t.filter(o=>cy(e,n.get(o.actor_id)??[])>=0).length}function PA({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=cy(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&&!oy.test(a),h=n===1&&(c&&a.length>0||u&&a.length>0&&(xl.test(a)||Zh.test(a)));if(!l&&!u&&!h)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 y=Ko(s);return y&&y!=="default"&&y!=="\u9ED8\u8BA4"&&a.includes(y)&&(g+=35),ey.test(a)&&(g+=30),El.test(a)?(g+=25,w+=15):xl.test(a)&&(g+=15,w+=5),Zh.test(a)&&(w+=30,El.test(a)||(g-=20)),ty.test(a)&&(g-=70,w-=70),ny.test(a)&&(g-=40),dy(a,o,r)>=2&&(g-=15,w-=15),{stateScore:g,identityScore:w,selection:m}}function CA(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?Ko(e.parenthetical??""):"";if(!o&&oy.test(i))return null;let r=Ko(o?e.content:i),s=o?0:-40;return s-=dy(r,t,n)*20,ey.test(r)&&(s+=10),El.test(r)?s+=10:xl.test(r)&&(s+=5),ty.test(r)&&(s-=20),ny.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 py(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 TA(e,t,n){return py(e,t,n,1,null)[0]??null}function Xh(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function Za(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,UA(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],y=g+1,_=r.get(y);if(!_)continue;let x=NA(w,_.duration_ms);for(let E=0;E<w.scenes.length;E+=1){let A=w.scenes[E],k=A.actors.map(U=>c.get(U.actor_id)).filter(U=>!!U);for(let U of A.actors){d.set(U.actor_id,(d.get(U.actor_id)??0)+1);let v=c.get(U.actor_id);if(!v)continue;let I=a.get(v.actor_id)??[v.actor_name],R=[],C=U.state_ids.length===1?U.state_ids[0]:null,L=C?v.states.find(M=>M.state_id===C):null;for(let M of A.actions){let j=ay(M),Z=sy(j,x);if(!Sl(Z,_.duration_ms))continue;let Be=PA({action:M,actor:v,actorCount:k.length,allActors:k,surfaces:I,surfacesByActor:a,stateName:L?.state_name??"default"}),ie=Be??(L?CA(M,k,a):null);if(!ie)continue;let K={actorId:v.actor_id,episode:y,episodeId:w.episode_id,sceneId:A.scene_id,timestamp:Wh(Z),milliseconds:Z,durationMs:_.duration_ms,stateScore:ie.stateScore,identityScore:ie.identityScore,selection:ie.selection,sourcePath:_.path,sourceSha256:_.sha256};if(R.push(K),Be){let vt=`${y}:${Z}`,P=f.get(vt)??new Set;P.add(v.actor_id),f.set(vt,P)}}if(R.length>0){let M=p.get(v.actor_id)??[];if(M.push(...R),p.set(v.actor_id,M),L){let j=`${v.actor_id}:${L.state_id}`,Z=l.get(j)??[];Z.push(...R),l.set(j,Z)}}}}}let u=(g,w)=>{let y=c.get(g),_=c.get(w),x=y?.importance==="background"?1:0,E=_?.importance==="background"?1:0;return x-E||(d.get(w)??0)-(d.get(g)??0)||(y?.actor_name??g).localeCompare(_?.actor_name??w,"zh-CN")},h=[...l.entries()].flatMap(([g,w])=>{let[y,_]=g.split(":"),x=y?c.get(y):void 0,E=x?.states.find(v=>v.state_id===_),A=TA(w,"stateScore",f);if(!x||!E||!A)return[];let k=`state:${x.actor_id}:${E.state_id}`,U=LA.map(v=>{let I=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),R=Math.min(I,Math.max(0,A.milliseconds+v)),C=Wh(R);return{evidence_id:`${k}:${A.episode}:${C}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:C,offset_ms:v,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")}_${Xh(C)}.jpg`,frame_status:"pending"}}).filter((v,I,R)=>R.findIndex(C=>C.timestamp===v.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:U}]}).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 y=c.get(g),_=py(w,"identityScore",f,MA,RA);if(!y||_.length===0)return[];let x=`identity:${y.actor_id}`;return[{evidence_id:x,asset_kind:"actor",actor_id:y.actor_id,actor_name:y.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/${y.actor_id}/identity/ep_${String(E.episode).padStart(3,"0")}_${Xh(E.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((g,w)=>u(g.actor_id,w.actor_id));return{version:2,source_sha256:i,items:h,identities:m}}function ly(e){return sy(e)}function uy(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 Wa from"node:path";function my(e){return Wa.extname(e).toLowerCase()}function VA(e){return bp[my(e)]??"application/octet-stream"}function fy(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:my(e),mime:VA(e)}}function Xa(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(Ka),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=>Wa.basename(s));throw fy("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 fy("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 gy from"node:fs";import*as hy from"node:path";function yy(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=hy.resolve(r.path),c=gy.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:vc(s);return{episode:r.episode,path:s,ext:r.ext,mime:r.mime,sha256:u,size_bytes:a,mtime_ms:d}})}function ec(e){return _e(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as $A}from"node:child_process";import*as gt from"node:fs";import*as wy from"node:path";var DA=20*1024*1024,GA="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function BA(e,t){return["-y","-loglevel","error","-i",e,"-vf",GA,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function JA(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=$A("ffmpeg",BA(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 _y(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<=DA)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(gt.mkdirSync(wy.dirname(t),{recursive:!0}),gt.rmSync(r,{force:!0}),await JA(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 KA}from"node:child_process";import*as je from"node:fs";import*as Ey from"node:path";var jA="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",zA=4;function HA(e){let t=ly(e);return t===null?null:(t/1e3).toFixed(3)}var QA=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=HA(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(Ey.dirname(n),{recursive:!0});let r=`${n}.part`;return je.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=KA("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",jA,"-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 FA(e){let{source_path:t,...n}=e;return n}async function tc(e,t,n,o=QA,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(h=>h.samples),...(t.identities??[]).flatMap(h=>h.samples)],c=new Map,a=0,d=async()=>{for(;;){let h=a;if(a+=1,h>=s.length)return;if(n?.aborted)throw new Error("aborted");let m=s[h],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,FA({...m,frame_status:w.ok?"ready":"unavailable",...w.error?{error:w.error}:{}}))}};await Promise.all(Array.from({length:Math.min(zA,s.length)},()=>d()));let p=h=>h.map(m=>c.get(m)),l=t.items.map(h=>({...h,samples:p(h.samples)})),f=(t.identities??[]).map(h=>({...h,samples:p(h.samples)})),u={version:2,generated_at:new Date().toISOString(),source_sha256:t.source_sha256,items:l,...f.length>0?{identities:f}:{}};if(e.has("evidence/state-evidence.json"))try{let h=e.readJson("evidence/state-evidence.json"),m=g=>JSON.stringify({version:g.version,source_sha256:g.source_sha256,items:g.items,identities:g.identities??[]});if(m(h)===m(u))return h}catch{}return e.writeJson("evidence/state-evidence.json",u),u}var YA=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 h=u.replace(/|/g,"|").trim().replace(/^[-*]\s+/,"");if(!h||h.startsWith("```"))continue;f++;let g=d&&!p&&/^\d{2}:\d{2}\|[^|]*\|/.test(h)&&h.split("|").length===3?["","shot",h]:/^([a-z_]+):?\s*(.*)$/.exec(h),w=g?.[1]??"",y=g?.[2]??"",_=x=>p[x];if(w==="synopsis"){a=y;continue}if(w==="scene"){let[x,E,A,k]=gr(y,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]=y.split("|").map(A=>A.trim());x&&d.characters.push({name:x,states:E.filter(Boolean)});continue}if(w==="props"){d.props.push(...y.split("|").map(x=>x.trim()).filter(Boolean));continue}if(w==="shot"){let[x,E,A]=gr(y,3);d.shots.push({ts:x,camera:E,visual:A});continue}if(w==="dlg"||w==="think"){let[x,E,A,k]=gr(y,4);d.voices.push({kind:w,speaker:E,parenthetical:A,ts:x,content:k});continue}}if(w==="new"){let[x,E,A,k]=gr(y,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:y.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(y,3);i.push({from_name:x,canonical_name:E,evidence:A}),p=void 0;continue}if(w==="open"){r.push({text:y.trim()}),p=void 0;continue}if(w==="close"){s.push({ref:y.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(YA.has(w)){E[w]=y.trim();continue}let A=y.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]=y.trim();continue}if(w==="state"){let[k,U]=gr(y,2);_(l?"add_states":"states").push({name:k,description:U});continue}}c.push(h)}return{value:{synopsis:a,scenes:t,registry_delta:{new_entities:n,enrich:o,canonicalize:i},open_threads:{opened:r,closed:s}},recognized:f-c.length,unknown:c}}var xy=e=>kl(e).recognized>0,Sy=`\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
|
|
278
|
+
`);let U="upload";try{g??=e.executor.documentPort("ingest.comic-serial");let v=n.path(`${E}.input.pdf`);yi(v,Buffer.from(await zh(so.readFileSync(_.path))));let I=await g.prepare(v,e.signal),R;try{U="generate";let ie=A&&n.has(`${E}.response.json`)&&s.current_error?.phase==="validation"?Il(so.readFileSync(n.path(`${E}.response.json`),"utf8"),_.page_count):await Zh(g,I,_.title,_.page_count,k,K=>n.writeText(`${E}.response.json`,K),e.signal);R={episode:_.episode,document_id:_.document_id,title:_.title,output:ie}}finally{await g.release(I,e.signal)}U="validation";let C=ms(structuredClone(c.context),R.output,_.episode),L=[...a,R],M;try{M=ec(L,{context:C,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
|
|
279
|
+
`);let K=await g.prepare(v,e.signal);try{R.output.registry_delta=await Wh(g,K,R.output,k,ie.message,e.signal),n.writeJson(`${E}.response.json`,R.output)}finally{await g.release(K,e.signal)}C=ms(structuredClone(c.context),R.output,_.episode),M=ec(L,{context:C,identityMap:c.identityMap},p)}let j={context:C,identityMap:M.identityMap};U="checkpoint",n.writeJson(`${E}.json`,R),n.writeJson("checkpoint.json",j),c=j,a.push(R),U="publish",Al(n,M,c.context),n.clearError(`${E}.error.json`),delete s.current_error,s.updated=new Date().toISOString(),n.writeJson("manifest.json",s),h++;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 Be=R.output.scenes.reduce((ie,K)=>ie+K.actions.length,0);process.stderr.write(` \u5DF2\u4FDD\u5B58\uFF1A${R.output.scenes.length} \u573A / ${Be} \u6761\u6B63\u6587
|
|
280
|
+
`)}catch(v){let I=Wa(v,_.episode,U);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()}),v}}let w=ec(a,c,p);Al(n,w,c.context);let y=a.length===r.length;return u="succeeded",{workspace:n.root,script_path:n.path("script.json"),kind:"comic",episodes:r.length,processed:h,reused:m,completed:a.length,remaining:r.length-a.length,complete:y,next_episode:y?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 oy(e){return Jo(e.workspacePath,()=>CA(e))}import*as kt from"node:fs";import*as Ft from"node:path";function TA(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 iy(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=TA(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 tc(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 ry=e=>String(e).padStart(3,"0"),VA={\u5185:"interior",\u5916:"exterior"},$A={act:"action",dlg:"dialogue",think:"inner_thought"},kl={broadcast:"broadcast",system:"system",group:"group",offscreen:"offscreen",prop:"offscreen",location:"offscreen"};function DA(e){let t=e.match(/^(\w+):(.+)$/);if(t&&kl[t[1]]){let n=t[2].trim();return n?{kind:kl[t[1]],label:n}:{kind:kl[t[1]]}}return dt(e)?{kind:"group",label:e.trim()}:{name:e}}function sy(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_${ry(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=VA[(a.environment.space??"").trim()],h=Co(a.environment.time);u&&(f.space=u),h&&(f.time=h);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,y=a.anchors.map(A=>{let k=gr(A.ts),U=k?`time:${k}`:`content:${JSON.stringify([A.kind,A.speaker??"",A.content])}`,v=(w.get(U)??0)+1;w.set(U,v);let I={identity_key:`${l}:action:${U}:${v}`,type:$A[A.kind]??"action",content:A.content};if((A.kind==="dlg"||A.kind==="think")&&A.speaker){let C=DA(A.speaker);I.speaker=C,"name"in C&&g(C.name)}A.parenthetical&&(I.parenthetical=A.parenthetical);let R=gr(A.ts);return R&&(I.extend={timestamp:R}),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_${ry(++n)}`,...f.space||f.time?{environment:f}:{},location:_?{name:_}:null,actors:m,props:x,actions:y}})}});return{title:t,episodes:o}}var GA=60,BA=6,JA=[-1e3,0,1e3],py=/(?:身穿|穿着|服装|造型|衣|裙|袍|衫|夹克|制服|西装|盔甲|装甲|防弹服|套装|裤|靴)/u,bl=/(?:全身|半身|上半身|四分之三身|躯干|胸前|腰部)/u,vl=/(?:站(?:在|立)|坐(?:在|下|起)|跪(?:在|下|倒)?|蹲(?:在|下)?|走(?:在|出|向)|行走|迈步|奔跑|跳起|跃起|转身|抬头|转头)/u,ay=/(?:特写|近景|脸|面容|五官|正脸|侧脸|侧前脸|双眼|眼眶|眉头|嘴角)/u,ly=/(?:背对|背影|远处|极远|模糊|运动模糊|脸被遮|面部遮挡|只露出|纯道具|空镜)/u,uy=/(?:双脚|脚部|膝盖|伤口|手部特写)/u,fy=/(?:画外音|旁白|未入镜|镜外|电话音|广播|\bO\.?S\.?\b)/iu;function Ko(e){return e.normalize("NFC").replace(/\s+/g," ").trim()}function my(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 gy(e){let t=e.trim().match(/^(\d+):(\d{2})$/);return t?Number(t[1])*1e3+Number(t[2])*10:null}function hy(e,t="clock"){return t==="legacy_centiseconds"?gy(e):my(e)}function Ol(e,t){return e===null?!1:t===void 0||e<=t}function KA(e,t){if(t===void 0)return"clock";let n=e.scenes.flatMap(r=>r.actions.map(yy)).filter(Boolean),o=n.filter(r=>Ol(my(r),t)).length;return n.filter(r=>Ol(gy(r),t)).length>o?"legacy_centiseconds":"clock"}function cy(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 yy(e){let t=e.extend?.timestamp;return typeof t=="string"?t.trim():""}function jA(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 wy(e,t){let n=t.map(o=>e.indexOf(o)).filter(o=>o>=0);return n.length>0?Math.min(...n):-1}function _y(e,t,n){return t.filter(o=>wy(e,n.get(o.actor_id)??[])>=0).length}function zA({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=wy(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&&!fy.test(a),h=n===1&&(c&&a.length>0||u&&a.length>0&&(vl.test(a)||ay.test(a)));if(!l&&!u&&!h)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 y=Ko(s);return y&&y!=="default"&&y!=="\u9ED8\u8BA4"&&a.includes(y)&&(g+=35),py.test(a)&&(g+=30),bl.test(a)?(g+=25,w+=15):vl.test(a)&&(g+=15,w+=5),ay.test(a)&&(w+=30,bl.test(a)||(g-=20)),ly.test(a)&&(g-=70,w-=70),uy.test(a)&&(g-=40),_y(a,o,r)>=2&&(g-=15,w-=15),{stateScore:g,identityScore:w,selection:m}}function HA(e,t,n){let o=e.type==="action"||e.type==="transition",i="parenthetical"in e?Ko(e.parenthetical??""):"";if(!o&&fy.test(i))return null;let r=Ko(o?e.content:i),s=o?0:-40;return s-=_y(r,t,n)*20,py.test(r)&&(s+=10),bl.test(r)?s+=10:vl.test(r)&&(s+=5),ly.test(r)&&(s-=20),uy.test(r)&&(s-=10),{stateScore:s,identityScore:Number.NEGATIVE_INFINITY,selection:"scene_fallback"}}function ys(e,t,n){let o=(n.get(`${e.episode}:${e.milliseconds}`)?.size??0)>1;return e[t]-(o?35:0)}function Ey(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||ys(a,t,n)>ys(p,t,n))&&r.set(d,a)}let s=[...r.values()].sort((a,d)=>ys(d,t,n)-ys(a,t,n)||a.episode-d.episode||a.milliseconds-d.milliseconds).filter(a=>i===null||ys(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 QA(e,t,n){return Ey(e,t,n,1,null)[0]??null}function dy(e){return e.replace(/[^0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function nc(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,jA(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],y=g+1,_=r.get(y);if(!_)continue;let x=KA(w,_.duration_ms);for(let E=0;E<w.scenes.length;E+=1){let A=w.scenes[E],k=A.actors.map(U=>c.get(U.actor_id)).filter(U=>!!U);for(let U of A.actors){d.set(U.actor_id,(d.get(U.actor_id)??0)+1);let v=c.get(U.actor_id);if(!v)continue;let I=a.get(v.actor_id)??[v.actor_name],R=[],C=U.state_ids.length===1?U.state_ids[0]:null,L=C?v.states.find(M=>M.state_id===C):null;for(let M of A.actions){let j=yy(M),Z=hy(j,x);if(!Ol(Z,_.duration_ms))continue;let Be=zA({action:M,actor:v,actorCount:k.length,allActors:k,surfaces:I,surfacesByActor:a,stateName:L?.state_name??"default"}),ie=Be??(L?HA(M,k,a):null);if(!ie)continue;let K={actorId:v.actor_id,episode:y,episodeId:w.episode_id,sceneId:A.scene_id,timestamp:cy(Z),milliseconds:Z,durationMs:_.duration_ms,stateScore:ie.stateScore,identityScore:ie.identityScore,selection:ie.selection,sourcePath:_.path,sourceSha256:_.sha256};if(R.push(K),Be){let vt=`${y}:${Z}`,P=f.get(vt)??new Set;P.add(v.actor_id),f.set(vt,P)}}if(R.length>0){let M=p.get(v.actor_id)??[];if(M.push(...R),p.set(v.actor_id,M),L){let j=`${v.actor_id}:${L.state_id}`,Z=l.get(j)??[];Z.push(...R),l.set(j,Z)}}}}}let u=(g,w)=>{let y=c.get(g),_=c.get(w),x=y?.importance==="background"?1:0,E=_?.importance==="background"?1:0;return x-E||(d.get(w)??0)-(d.get(g)??0)||(y?.actor_name??g).localeCompare(_?.actor_name??w,"zh-CN")},h=[...l.entries()].flatMap(([g,w])=>{let[y,_]=g.split(":"),x=y?c.get(y):void 0,E=x?.states.find(v=>v.state_id===_),A=QA(w,"stateScore",f);if(!x||!E||!A)return[];let k=`state:${x.actor_id}:${E.state_id}`,U=JA.map(v=>{let I=A.durationMs===void 0?Number.POSITIVE_INFINITY:Math.max(0,A.durationMs-50),R=Math.min(I,Math.max(0,A.milliseconds+v)),C=cy(R);return{evidence_id:`${k}:${A.episode}:${C}`,episode:A.episode,episode_id:A.episodeId,scene_id:A.sceneId,timestamp:C,offset_ms:v,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")}_${dy(C)}.jpg`,frame_status:"pending"}}).filter((v,I,R)=>R.findIndex(C=>C.timestamp===v.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:U}]}).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 y=c.get(g),_=Ey(w,"identityScore",f,BA,GA);if(!y||_.length===0)return[];let x=`identity:${y.actor_id}`;return[{evidence_id:x,asset_kind:"actor",actor_id:y.actor_id,actor_name:y.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/${y.actor_id}/identity/ep_${String(E.episode).padStart(3,"0")}_${dy(E.timestamp)}.jpg`,frame_status:"pending"}))}]}).sort((g,w)=>u(g.actor_id,w.actor_id));return{version:2,source_sha256:i,items:h,identities:m}}function xy(e){return hy(e)}function Sy(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 oc from"node:path";function Ay(e){return oc.extname(e).toLowerCase()}function FA(e){return Np[Ay(e)]??"application/octet-stream"}function Iy(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 Rl(e,t){return{episode:t,path:e,ext:Ay(e),mime:FA(e)}}function ic(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[Rl(e.path,1)];let t=e.files,n=t.map(Fa),o=n.filter(r=>r!==null);if(o.length===0)return t.map((r,s)=>Rl(r,s+1));if(o.length!==t.length){let r=t.filter((s,c)=>n[c]===null).map(s=>oc.basename(s));throw Iy("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 Iy("Two episode files resolve to the same number.",[`duplicate episode: ${r}`]);i.add(r)}return t.map((r,s)=>Rl(r,n[s])).sort((r,s)=>r.episode-s.episode)}import*as ky from"node:fs";import*as by from"node:path";function vy(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=by.resolve(r.path),c=ky.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:Nc(s);return{episode:r.episode,path:s,ext:r.ext,mime:r.mime,sha256:u,size_bytes:a,mtime_ms:d}})}function rc(e){return _e(JSON.stringify(e.map(t=>({episode:t.episode,ext:t.ext,mime:t.mime,sha256:t.sha256}))))}import{spawn as YA}from"node:child_process";import*as gt from"node:fs";import*as Oy from"node:path";var qA=20*1024*1024,ZA="scale='if(gt(a,1),min(1280,iw),-2)':'if(gt(a,1),-2,min(1280,ih))'";function WA(e,t){return["-y","-loglevel","error","-i",e,"-vf",ZA,"-c:v","libx264","-preset","medium","-crf","27","-pix_fmt","yuv420p","-c:a","aac","-b:a","96k","-movflags","+faststart","-f","mp4",t]}function XA(e,t,n){return new Promise((o,i)=>{if(n?.aborted){i(new Error("aborted"));return}let r=YA("ffmpeg",WA(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 Ry(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<=qA)return{path:e,mime:n,transcoded:!1,note:`already ${(i/1024/1024).toFixed(1)}MB (\u226420MB)`};let r=`${t}.part`;try{if(gt.mkdirSync(Oy.dirname(t),{recursive:!0}),gt.rmSync(r,{force:!0}),await XA(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 ek}from"node:child_process";import*as je from"node:fs";import*as My from"node:path";var tk="scale='if(gt(a,1),min(960,iw),-2)':'if(gt(a,1),-2,min(960,ih))'",nk=4;function ok(e){let t=xy(e);return t===null?null:(t/1e3).toFixed(3)}var ik=async(e,t,n,o)=>{if(o?.aborted)throw new Error("aborted");let i=ok(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(My.dirname(n),{recursive:!0});let r=`${n}.part`;return je.rmSync(r,{force:!0}),new Promise((s,c)=>{let a=ek("ffmpeg",["-y","-loglevel","error","-ss",i,"-i",e,"-frames:v","1","-vf",tk,"-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 rk(e){let{source_path:t,...n}=e;return n}async function sc(e,t,n,o=ik,i={}){let r=i.reuseExistingFrames!==!1,s=[...t.items.flatMap(h=>h.samples),...(t.identities??[]).flatMap(h=>h.samples)],c=new Map,a=0,d=async()=>{for(;;){let h=a;if(a+=1,h>=s.length)return;if(n?.aborted)throw new Error("aborted");let m=s[h],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,rk({...m,frame_status:w.ok?"ready":"unavailable",...w.error?{error:w.error}:{}}))}};await Promise.all(Array.from({length:Math.min(nk,s.length)},()=>d()));let p=h=>h.map(m=>c.get(m)),l=t.items.map(h=>({...h,samples:p(h.samples)})),f=(t.identities??[]).map(h=>({...h,samples:p(h.samples)})),u={version:2,generated_at:new Date().toISOString(),source_sha256:t.source_sha256,items:l,...f.length>0?{identities:f}:{}};if(e.has("evidence/state-evidence.json"))try{let h=e.readJson("evidence/state-evidence.json"),m=g=>JSON.stringify({version:g.version,source_sha256:g.source_sha256,items:g.items,identities:g.identities??[]});if(m(h)===m(u))return h}catch{}return e.writeJson("evidence/state-evidence.json",u),u}var sk=new Set(["apparent_gender","apparent_age","face_shape","brows_eyes","nose","mouth","skin_features","hair","build","voice"]),Ml=()=>({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 Ll(e){let t=[],n=[],o=[],i=[],r=[],s=[],c=[],a="",d,p,l=!1,f=0;for(let u of e.split(/\r?\n/)){let h=u.replace(/|/g,"|").trim().replace(/^[-*]\s+/,"");if(!h||h.startsWith("```"))continue;f++;let g=d&&!p&&/^\d{2}:\d{2}\|[^|]*\|/.test(h)&&h.split("|").length===3?["","shot",h]:/^([a-z_]+):?\s*(.*)$/.exec(h),w=g?.[1]??"",y=g?.[2]??"",_=x=>p[x];if(w==="synopsis"){a=y;continue}if(w==="scene"){let[x,E,A,k]=yr(y,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]=y.split("|").map(A=>A.trim());x&&d.characters.push({name:x,states:E.filter(Boolean)});continue}if(w==="props"){d.props.push(...y.split("|").map(x=>x.trim()).filter(Boolean));continue}if(w==="shot"){let[x,E,A]=yr(y,3);d.shots.push({ts:x,camera:E,visual:A});continue}if(w==="dlg"||w==="think"){let[x,E,A,k]=yr(y,4);d.voices.push({kind:w,speaker:E,parenthetical:A,ts:x,content:k});continue}}if(w==="new"){let[x,E,A,k]=yr(y,4);p={name:E,kind:x,status:A,importance:k,recognition_anchors:[],identity_profile:Ml(),appearance:"",role:"",states:[],aliases:[]},l=!1,n.push(p);continue}if(w==="enrich"){p={name:y.trim(),add_recognition_anchors:[],identity_profile_patch:Ml(),appearance:"",add_aliases:[],add_states:[]},l=!0,o.push(p);continue}if(w==="rename"){let[x,E,A]=yr(y,3);i.push({from_name:x,canonical_name:E,evidence:A}),p=void 0;continue}if(w==="open"){r.push({text:y.trim()}),p=void 0;continue}if(w==="close"){s.push({ref:y.trim()}),p=void 0;continue}if(p){if(l&&w==="identity_revision"){p.identity_revision={profile:Ml(),recognition_anchors:[]};continue}let x=p.identity_revision,E=x?.profile??p[l?"identity_profile_patch":"identity_profile"];if(sk.has(w)){E[w]=y.trim();continue}let A=y.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]=y.trim();continue}if(w==="state"){let[k,U]=yr(y,2);_(l?"add_states":"states").push({name:k,description:U});continue}}c.push(h)}return{value:{synopsis:a,scenes:t,registry_delta:{new_entities:n,enrich:o,canonicalize:i},open_threads:{opened:r,closed:s}},recognized:f-c.length,unknown:c}}var Ly=e=>Ll(e).recognized>0,Ny=`\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
|
|
280
281
|
\u6309\u4EE5\u4E0B\u987A\u5E8F\u8F93\u51FA\uFF1A
|
|
281
282
|
synopsis \u672C\u96C6\u5267\u60C5\u6897\u6982\uFF0C\u6309\u53D1\u751F\u987A\u5E8F\uFF0C200-300 \u5B57\u7EAF\u6587\u672C
|
|
282
283
|
\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
|
|
@@ -313,25 +314,25 @@ shot 00:00|\u5168\u666F\uFF0C\u5E73\u89C6\uFF0C\u56FA\u5B9A|\u6797\u665A\u5750\u
|
|
|
313
314
|
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
|
|
314
315
|
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
|
|
315
316
|
think 00:07|\u6797\u665A|\u753B\u5916\u97F3\uFF0C\u6307\u5C16\u6536\u7D27|\u4ED6\u7EC8\u4E8E\u8FD8\u662F\u6765\u4E86\u3002
|
|
316
|
-
open \u6797\u665A\u662F\u5426\u7B7E\u4E0B\u79BB\u5A5A\u534F\u8BAE`;var W=gn;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 ky=W(148),qA=ky[W(135)](W(95),W(31))[W(135)](W(92),W(126))[W(38)](W(69),W(75))+`
|
|
317
|
-
`+
|
|
318
|
-
`:o(41);return(n===o(49)?o(129)+e+o(51):o(129)+e+o(102))+o(90)+i}function
|
|
319
|
-
`: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 y=d[t(7)](w)??{name:w,states:[]};for(let _ of
|
|
320
|
-
`;kt.appendFileSync(e.path("timing.jsonl"),o)}catch{}}function
|
|
317
|
+
open \u6797\u665A\u662F\u5426\u7B7E\u4E0B\u79BB\u5A5A\u534F\u8BAE`;var W=gn;function Pl(){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 Pl=function(){return e},Pl()}var Cy=W(148),ak=Cy[W(135)](W(95),W(31))[W(135)](W(92),W(126))[W(38)](W(69),W(75))+`
|
|
318
|
+
`+Ny;function ck(e,t,n=W(49)){let o=W,i=t[o(87)]()?o(122)+t+`
|
|
319
|
+
`:o(41);return(n===o(49)?o(129)+e+o(51):o(129)+e+o(102))+o(90)+i}function Nl(e,t){let n=W;return new S(e,{exitCode:X,errorCode:n(4),hint:n(111),data:{actual:t}})}function gn(e,t){e=e-0;let n=Pl(),o=n[e];if(gn.gvzNbS===void 0){var i=function(c){let a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=",d="",p="";for(let l=0,f,u,h=0;u=c.charAt(h++);~u&&(f=l%4?f*64+u:u,l++%4)?d+=String.fromCharCode(255&f>>(-2*l&6)):0)u=a.indexOf(u);for(let l=0,f=d.length;l<f;l++)p+="%"+("00"+d.charCodeAt(l).toString(16)).slice(-2);return decodeURIComponent(p)};gn.rVtMKx=i,gn.XIRwsR={},gn.gvzNbS=!0}let r=n[0];gn.VEyRMQ!==r&&(gn.XIRwsR={},gn.VEyRMQ=r);let s=gn.XIRwsR[e];return s===void 0?(o=gn.rVtMKx(o),gn.XIRwsR[e]=o):o=s,o}var Cl=e=>{let t=W;return typeof e===t(37)?e[t(135)](/\u0000/g,""):Array[t(106)](e)?e[t(9)](Cl):pt(e)?Object[t(89)](Object[t(25)](e)[t(9)](([n,o])=>[n,Cl(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:[],Ty=e=>te(e),dk=e=>[...new Set(ze(e)[W(9)](Ty)[W(112)](Boolean))],Uy=e=>{let t=W,n=[];for(let o of ze(e)){if(!pt(o))continue;let i=Ty(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},pk=[W(93),W(64),W(109),W(50),W(117),W(86),W(110),W(46),W(67),W(84)],Ul=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 pk)n[o]=te(e[o]);return n},Py=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)]},lk=(e,t)=>{let n=W;return e?t?e[n(135)](/[。!?;]+$/,"")+"\u3002"+t:e:t};function uk(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+`
|
|
320
|
+
`: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 y=d[t(7)](w)??{name:w,states:[]};for(let _ of dk(g[t(153)]))y[t(153)][t(21)](_)||y[t(153)][t(113)](_);d[t(96)](w,y)}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=lk(te(g[t(88)]),te(g[t(16)]));if(!w)continue;let y={kind:t(28),content:w},_=gr(g.ts);_&&(y.ts=_),f[t(113)](y)}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 y=te(g[t(136)]);if(!y)continue;let _={kind:w,content:y},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 y=t;if(y(61)!==y(61))throw _0x507431(y(40)+_0x1ad531+y(150)+_0x539c10[y(0)]+")",[_0x3d1d43[y(45)](0,200)]);{let _=Py(g.ts)-Py(w.ts);return _!==0?_:g[y(144)]===y(28)&&w[y(144)]!==y(28)?-1:g[y(144)]!==y(28)&&w[y(144)]===y(28)?1:0}});let u={environment:s,characters:[...d[t(48)]()],props:p,anchors:f},h=te(r[t(91)]);h&&(u[t(91)]=h);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=Ul(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=Uy(r[t(153)]);u[t(132)]&&(a[t(153)]=u);let h=ze(r[t(42)])[t(9)](te)[t(112)](Boolean);h[t(132)]&&(a[t(42)]=h),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=Ul(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 h=Ul(r[t(17)][t(134)]);h&&(c[t(17)]={profile:h,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=Uy(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 Vy(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?ak:Cy,user:ck(n,o+l,r),fps:i,...p?{acceptsText:Ly}:{responseJsonSchema:ch},...c?{localPath:c[d(83)],localMime:c[d(54)]}:{},...s?{signal:s}:{}}),h=u[d(14)][d(87)]();if(h[d(132)]<40)throw Nl(d(40)+n+d(19)+u[d(0)]+")",[d(15)+h[d(132)]]);let m;try{m=p?Ll(h)[d(114)]:JSON[d(100)](h)}catch{if(d(10)!==d(33))throw Nl(d(40)+n+d(150)+u[d(0)]+")",[h[d(45)](0,200)]);_0x2ba042[d(153)][d(21)](_0x38f37b)||_0x210b20[d(153)][d(113)](_0x35eab7)}let g=Cl(m),w=uk(g);if(w[d(120)][d(132)]===0)throw Nl(d(40)+n+d(139),[h[d(45)](0,200)]);let y=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(y[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:y[d(132)],missing_paths:y,retries_exhausted:f===3}),f===3)throw new S(d(23)+n+": "+y[d(132)]+d(27),{exitCode:X,errorCode:d(149),hint:d(11),data:{actual:y}});l=d(137)+y[d(132)]+d(147)+y[d(74)]("\u3001")+d(39)+d(p?116:55)+d(1);continue}return{transcript:p?h[d(135)](/\u0000/g,""):JSON[d(35)](g,null,2),output:w}}else _0x22a139=_0x2af6a8?_0x1bbcff(_0x2b6a02)[d(114)]:_0x487dae[d(100)](_0x12e947)}function ac(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 fk(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=gs(t.failure);if(!n)return null;let o=[];for(let i of t.attempts){let r=gs(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 Tl(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 ac("root must be an object");let n=t;if(n.schema_version!==1||!Array.isArray(n.episodes))throw ac("schema_version must be 1 and episodes must be an array");let o=[],i=new Set;for(let r of n.episodes){let s=fk(r);if(!s)throw ac("one or more episode records are malformed");if(i.has(s.episode))throw ac(`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 $y(e,t){e.writeJson("skipped.json",t)}function cc(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 mk(e){return{episode:e,synopsis:"",scenes:[],actors:[],locations:[],props:[],speakers:[],actorStates:[],locationStates:[],propStates:[]}}function dc(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(mk(s.episode))}return r}function ws(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;Dh(t,i),e.writeJson("context.json",t),e.clearError(`ep/ep_${String(i).padStart(3,"0")}.error.json`)}return t}function Dy(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 _s="19",gk=new Set([_s]),ki=e=>String(e).padStart(3,"0"),Vl=2;function By(e){try{return kt.statSync(e).size}catch{return 0}}function hk(e,t){let n=By(e);if(!(n<Qd))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 ${Qd} bytes after ingest transcoding`],actual:[`${n} bytes`]}})}function Gy(e,t){try{let n=t.uploadBytes?(t.uploadBytes/1024/1024).toFixed(1):"?",o=JSON.stringify({...t,uploadMB:n,at:new Date().toISOString()})+`
|
|
321
|
+
`;kt.appendFileSync(e.path("timing.jsonl"),o)}catch{}}function Jy(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 $l(e){if(!e.has("manifest.json"))return null;let t=e.readJson("manifest.json");if(!t.pipeline_version||!gk.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 ${_s}`]}});return e.readJson("manifest.json")}function Dl(e,t){if(t.pipeline_version===_s)return t;let n={...t,pipeline_version:_s,updated:new Date().toISOString()};return e.writeJson("manifest.json",n),n}function yk(e,t,n){if(e&&e.source.kind!==t)throw Jy(`source kind changed from ${e.source.kind} to ${t}`)}function wk(e,t,n,o){if(t){let i=iy(t.episodes,n);if(i.kind==="incompatible")throw Jy(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 _k(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 Ek(e,t){let n=t.slice(0,8).map(o=>`- ${o.path}: ${o.message}`).join(`
|
|
321
322
|
`);return`${e}
|
|
322
323
|
|
|
323
324
|
========== \u4E0A\u4E00\u6B21\u8F93\u51FA\u7684\u6574\u5408\u6821\u9A8C\u53CD\u9988 ==========
|
|
324
325
|
\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
|
|
325
326
|
${n}
|
|
326
|
-
\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
|
|
327
|
-
`)})}catch(Yt){if(!(Yt instanceof S)||Yt.errorCode!=="INGEST_VIDEO_SERIAL_FAILED"||
|
|
327
|
+
\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 Ky(e,t,n,o,i=[]){let r=Bo(t.registry),s=_k(e,r),c=sy(s,n),a=Ha(c,t,"video",o);if(!a.scriptV4)return a;let{scriptV4:d,initial:p,idMap:l,identityMap:f}=a;Dy(d,i);let u=Ue(d),h=[...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((y,_)=>y.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),...h,...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 pc(e,t,n,o,i,r){let s=Ky(dc(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 xk(e,t,n,o,i,r,s){return sc(e,nc(t,n,o,i,r),s)}async function Sk(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=[...ic(t)].sort((g,w)=>g.episode-w.episode),o=tc(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=$l(d),l=Ft.resolve(t.path);yk(p,t.kind,l);let f=vy(n,p?.episodes??[],p?.updated);wk(d,p,f,r);let u={version:2,pipeline_version:_s,updated:new Date().toISOString(),source:{kind:t.kind,path:l,sha256:rc(f)},episodes:f,fps:i,skips:r?[]:p?.skips??[]};d.writeJson("manifest.json",u);let h=new Do(d,e.executor),m="failed";try{let g=null,w=lc(e.sourcePath),y=!r&&d.has("context.json")?d.readJson("context.json"):Go(),_={schema_version:1,episodes:u.skips??[]};cc(_.episodes,f),r||ws(d,y,_.episodes);let x=new Set(_.episodes.map(K=>K.episode)),E=!r&&d.has("v4_identity_map.json")?d.readJson("v4_identity_map.json"):$o(),A=new Set(n.filter(K=>!r&&!x.has(K.episode)&&K.episode<=y.lastEpisode&&d.has(`ep/ep_${ki(K.episode)}.json`)).map(K=>K.episode));h.recordReusedEpisodes("ingest.video-serial",[...A]);let k=A.size,U=0;for(let K of n){let vt=`ep/ep_${ki(K.episode)}.json`;if(!r&&x.has(K.episode)&&K.episode<=y.lastEpisode||A.has(K.episode))continue;if(s&&U>=1)break;let P=za(y);d.writeText(`ep/ep_${ki(K.episode)}.context.md`,P);let ce,Se,Ot,Cn,Li=Date.now(),Rt={episode:K.episode,uploadMode:c,status:"succeeded",totalMs:0},Ls="transcode";try{let hn=Date.now(),ht=await Ry(K.path,d.path(`cache/ep_${ki(K.episode)}.mp4`),K.mime,a);Rt.transcodeMs=Date.now()-hn,Rt.uploadBytes=By(ht.path),Rt.transcoded=ht.transcoded,ht.note&&(Rt.note=ht.note),c==="base64"&&hk(ht.path,K.episode),Ls="upload",g??=e.executor.videoPort("ingest.video-serial");let kc=Date.now(),lo=await g.prepare(ht.path,ht.mime,c,a);Rt.uploadMs=Date.now()-kc;try{Ls="generate";let bc=Date.now(),Yw=dc(d,n,y.lastEpisode,_.episodes),vc=P;for(let Ns=1;Ns<=Vl;Ns++){let Us;try{Us=await Vy(g,lo,K.episode,vc,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)+`
|
|
328
|
+
`)})}catch(Yt){if(!(Yt instanceof S)||Yt.errorCode!=="INGEST_VIDEO_SERIAL_FAILED"||Ns===Vl)throw Yt;vc=`${P}
|
|
328
329
|
|
|
329
|
-
\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
|
|
330
|
+
\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 wu=Sy(Us.output,K.episode),Oc=structuredClone(y);ms(Oc,Us.output,K.episode);let Ps=Ky([...Yw,wu],Oc,w,E,_.episodes.filter(Yt=>Yt.episode<=K.episode));if(Ps.validation.ok){ce=Us.transcript,Se=wu,Ot=Oc,Cn=Ps;break}if(Ls="validation",Ns===Vl)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:Ps.validation.errors.slice(0,8).map(Yt=>`${Yt.path}: ${Yt.message}`)}});vc=Ek(P,Ps.validation.errors)}Rt.generateMs=Date.now()-bc}finally{await g.release(lo,a).catch(()=>{}),ht.transcoded&&kt.rmSync(ht.path,{force:!0})}}catch(hn){let ht=Date.now();Rt.status="failed",Rt.totalMs=ht-Li,Gy(d,Rt),h.flush({scope:{kind:"episode",episode:K.episode},status:"failed",startedAtMs:Li,endedAtMs:ht,stages:Rt});let kc=hn instanceof S&&hn.errorCode==="INGEST_VIDEO_SERIAL_FAILED"?"parse":Ls,lo=Wa(hn,K.episode,kc),bc=yn(lo.failure);throw d.writeJson(`ep/ep_${ki(K.episode)}.error.json`,lo),d.writeJson("manifest.json",{...u,updated:lo.occurred_at,current_error:lo}),hn instanceof S&&(hn.errorCode==="INGEST_VIDEO_INLINE_TOO_LARGE"||hn.errorCode==="INGEST_VALIDATION_FAILED"||hn.errorCode==="INGEST_VIDEO_TIMESTAMP_MISSING")?hn:new S(`Episode ${K.episode} failed serial parse; later episodes depend on its context.`,{exitCode:b,errorCode:"INGEST_SERIAL_INCOMPLETE",hint:ey(lo.failure),data:{actual:[bc]}})}y=Ot,U+=1,d.writeText(`ep/ep_${ki(K.episode)}.${(e.outputFormat??"dsl")==="dsl"?"ep":"md"}`,ce),d.writeJson(vt,Se),d.writeJson("context.json",y),d.clearError(`ep/ep_${ki(K.episode)}.error.json`);let yu=Date.now();Rt.totalMs=yu-Li,Gy(d,Rt),h.flush({scope:{kind:"episode",episode:K.episode},status:"succeeded",startedAtMs:Li,endedAtMs:yu,stages:Rt}),E=Cn.identityMap,d.writeJson("v4_identity_map.json",E),d.writeJson("script.json",Cn.final)}let v=Math.min(y.lastEpisode,n.length),I=n.length-v,R=I===0,C=R?null:n[v]?.episode??null,L=pc(d,n.slice(0,v),y,w,E,_.episodes),{final:M,validation:j}=L,Z=R?await xk(d,dc(d,n,y.lastEpisode,_.episodes),M,y,f,u.source.sha256,a):{items:[]},Be=Z.items.flatMap(K=>K.samples),ie=M;return m="succeeded",{workspacePath:d.root,episodes:n.length,processed:U,reused:k,skipped:_.episodes.length,skippedEpisodes:_.episodes.map(K=>K.episode),completed:v,remaining:I,complete:R,nextEpisode:C,uploadMode:c,assets:{actors:ie.actors?.length??0,locations:ie.locations?.length??0,props:ie.props?.length??0},evidence:{states:Z.items.length,samples:Be.length,ready:Be.filter(K=>K.frame_status==="ready").length},scriptPath:d.path("script.json"),validation:{ok:j.ok,errors:j.errors.length,warnings:j.warnings.length}}}finally{h.finish(m)}}async function jy(e){return Jo(e.workspacePath,()=>Sk(e))}function lc(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),zy=(e,t)=>{let n=Number(e);return Number.isInteger(n)&&n>0?n:t},Ik=["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 uc(e,t){return Object.prototype.hasOwnProperty.call(e,t)&&e[t]!==void 0}function bi(e,t,n){if(!uc(e,t))return;let o=wr(e[t]).trim();if(!o)throw ao(`${n} requires a non-empty value.`,[n]);return o}function Ak(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 kk(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 bk(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=uc(e,"provider_api_key"),o=uc(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 Qy(e,t=to){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=Hy.resolve(wr(e.workspace_path||"workspace")),i=vn(n),r=Ik.filter(d=>{let p=e[d];return typeof p=="boolean"?p:uc(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(wr(e.llm_config).trim()||void 0),l=await oy({sourcePath:n,workspacePath:o,executor:p,force:!!e.force,step:!!e.step});return[{text:`workspace: ${l.workspace}
|
|
330
331
|
${l.completed}/${l.episodes} chapters complete (${l.processed} processed / ${l.reused} reused) \u2192 ${l.script_path}
|
|
331
|
-
assets: ${l.assets.actors} actors / ${l.assets.locations} locations / ${l.assets.props} props`,data:l},G]}if(i.kind!=="text"){let d=
|
|
332
|
-
`),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:y.protocol,provider:y.provider,base_url:y.baseUrl,model:y.model},assets:g.assets}},G]}let s=t.createExecutor(
|
|
333
|
-
`),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
|
|
334
|
-
`),data:{status:n}},G]}import*as
|
|
332
|
+
assets: ${l.assets.actors} actors / ${l.assets.locations} locations / ${l.assets.props} props`,data:l},G]}if(i.kind!=="text"){let d=Ak(e),p=kk(e),l=bk(e),f=l?{videoProvider:l}:void 0,u=t.createExecutor(wr(e.llm_config).trim()||void 0,f),h=u.route("ingest.video-serial"),m=d??h.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 jy({sourcePath:n,workspacePath:o,executor:u,fps:zy(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`],y=[...u.usageEvents()].reverse().find(_=>_.task==="ingest.video-serial"&&_.status==="succeeded")??h;return[{text:w.join(`
|
|
333
|
+
`),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:y.protocol,provider:y.provider,base_url:y.baseUrl,model:y.model},assets:g.assets}},G]}let s=t.createExecutor(wr(e.llm_config).trim()||void 0),c=await Th({sourcePath:n,workspacePath:o,executor:s,concurrency:zy(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(`
|
|
334
|
+
`),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 vk=e=>e==null?"":String(e);function Fy(e){try{let t=JSON.parse($t.readFileSync(Dt.join(e,"timings.json"),"utf-8"));return Lh(t,Date.now())}catch{return null}}function fc(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 Ok=(e,t,n)=>fc(e,t,n).length,Kl=(e,t)=>$t.existsSync(Dt.join(e,t));function Rk(e){try{return JSON.parse($t.readFileSync(Dt.join(e,"manifest.json"),"utf-8"))}catch{return null}}function Mk(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 Gl(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 Lk(e,t,n){try{let o=JSON.parse($t.readFileSync(Dt.join(e,t,`${n}.error.json`),"utf-8")),i=hs(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"?Gl(t,n,o.error):Gl(t,n,"Error sidecar has an unsupported schema.")}catch{return Gl(t,n,"Error sidecar is unreadable.")}}function Nk(e,t,n=new Set){return fc(e,t,".error.json").map(o=>o.replace(/\.error\.json$/,"")).filter(o=>!n.has(o)).map(o=>Lk(e,t,o))}function Uk(e,t,n){let o=hs(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 Bl(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 Pk(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 Ck(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 Tk(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 Vk(e,t){let n=t.chunks??0,o={total:n,done:fc(e,"pass2",".json").filter(a=>/^chunk_\d+\.json$/.test(a)).length,failed:Ok(e,"pass2",".error.json")},i=Pk(e),r=fc(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:Kl(e,"body.json")},{name:"serial",done:i>0&&r>=i,unit:s},{name:"govern",done:Kl(e,"script.json")}],units:o}}function $k(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&&Ck(e)===o}],units:c,parsed:s}}function Es(e){let t=Dt.resolve(e),n=Rk(t);if(!n)return{workspace:t,exists:!1,kind:null,state:"empty",phase:"none",passes:[],units:null,script:!1,validation:null,failure_summary:Bl([]),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"?Tk(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?Uk(n,r,a):[],p=o!=="text"?$k(t,n,c,r,d.length):null,{passes:l,units:f}=o==="text"?Vk(t,n):p,u=o==="text"?Nk(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:Bl(u),errors:u,updated:n.updated??null,timings:Fy(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 h=Kl(t,"script.json"),m=Mk(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)&&h&&m?.ok?g="ready":u.length>0||m&&!m.ok?g="failed":g="incomplete";let y=l.find(E=>!E.done),_=g==="ready"?"done":y?y.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:h,validation:m,failure_summary:Bl(u),errors:u,updated:n.updated??null,timings:Fy(t),...x}}function Dk(e){let t=`${e.done}/${e.total}`;return e.failed>0?`${t} (${e.failed} failed)`:t}function Gk(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?Dk(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 Jl(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 ${Jl(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(`~${Jl(n.avgWindowMs)}/window`),n.etaMs!=null&&!e.done&&t.push(`eta ~${Jl(n.etaMs)}`)),t.join(" \xB7 ")}function Yy(e){let t=vk(e.workspace_path||"workspace"),n=Es(t);return[{text:Gk(n).join(`
|
|
335
|
+
`),data:{status:n}},G]}import*as mc from"node:path";function Nn(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function Jk(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 Kk(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=$l(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=Tl(o);cc(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=Dl(o,r);a=ws(o,a,c.episodes);let y=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):$o();return pc(o,w.episodes,a,lc(w.source.path),y,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=hs(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},h=Dl(o,r),m=[...c.episodes,u];o.writeJson("manifest.json",{...h,updated:u.skipped_at,current_error:void 0,skips:m}),$y(o,{schema_version:1,episodes:m}),a=ws(o,a,m);let g=o.has("v4_identity_map.json")?o.readJson("v4_identity_map.json"):$o();return pc(o,h.episodes,a,lc(h.source.path),g,[...c.episodes,u]),!0}async function qy(e){let t=mc.resolve(typeof e.workspace_path=="string"?e.workspace_path:"workspace"),n=Jk(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 Jo(t,()=>Kk(t,n,o)),r=Es(t),s=Tl(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:mc.join(t,"script.json")}},G]}import*as hc from"node:fs";import*as vi from"node:path";import{spawnSync as jk}from"node:child_process";function gc(e,t,n,o){return new S(e,{exitCode:b,errorCode:t,hint:n,data:{actual:o}})}function zk(e){let t=ic(vn(e)),n=tc(t);if(n)throw gc("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=hc.statSync(i),s=r.size,c=Math.trunc(r.mtimeMs),a=jk("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 Hk(e){let t=vi.resolve(e.scriptPath),n=vi.resolve(e.sourcePath),o=vi.resolve(e.workspacePath),i=Di(JSON.parse(hc.readFileSync(t,"utf-8"))),r=zk(n);if(r.length!==i.episodes.length)throw gc("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=rc(r),c=nc([],i,Go(),r,s),a=await Jo(o,async()=>{let p=new mt(o);return p.ensure(),sc(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 Zy(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 gc("--source-path is required.","EVIDENCE_SOURCE_REQUIRED","Pass the linked source-video file or folder.",["--source-path <path>"]);if(!o)throw gc("--workspace-path is required.","EVIDENCE_WORKSPACE_REQUIRED","Pass the project workspace directory.",["--workspace-path <path>"]);let i=await Hk({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 yc 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:"",Qk={interior:"\u5185",exterior:"\u5916"},Fk={day:"\u65E5",night:"\u591C"},Yk=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0},qk=e=>{let t=e.match(/(\d+)/);return t?Number(t[1]):0};function jl(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 Zk(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 Wk(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 Xk(e){let t=jl(e.actors,"actor_id","actor_name"),n=jl(e.locations,"location_id","location_name"),o=jl(e.props,"prop_id","prop_name"),i=Zk(e.actors,"actor_id"),r=(co(e.episodes)?e.episodes:[]).filter(bt).map(c=>({episode:Yk(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 h of co(a.actors)?a.actors:[]){if(!bt(h)||typeof h.actor_id!="string")continue;let m=t.get(h.actor_id)??h.actor_id;if(p.includes(m)||p.push(m),typeof h.state_id=="string"){let w=(i.get(h.actor_id)?.get(h.state_id)??"")||(h.state_id!=="default"?h.state_id:"");w&&(l[m]=w)}}let f=[];for(let h of co(a.props)?a.props:[])if(bt(h)&&typeof h.prop_id=="string"){let m=o.get(h.prop_id)??h.prop_id;f.includes(m)||f.push(m)}let u=bt(a.environment)?a.environment:{};return{scene_num:qk(He(a.scene_id)),location_name:d,environment:{space:Qk[He(u.space)]??He(u.space),time:Fk[He(u.time)]??He(u.time)},actor_names:p,actor_states:l,prop_names:f,actions:(co(a.actions)?a.actions:[]).filter(bt).map(h=>({type:He(h.type),content:He(h.content),speaker:Wk(h.speaker,t),emotion:typeof h.emotion=="string"?h.emotion:void 0,extend:bt(h.extend)&&typeof h.extend.timestamp=="string"?{timestamp:h.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 Wy(e){if(!bt(e))throw new Error("review renderer expects a script object");let t=Xk(e),n=JSON.stringify(t),o=He(t.title);return`<!DOCTYPE html>
|
|
335
336
|
<html lang="zh">
|
|
336
337
|
<head>
|
|
337
338
|
<meta charset="utf-8">
|
|
@@ -652,10 +653,10 @@ tabScript.addEventListener('click',()=>switchTab('script'));
|
|
|
652
653
|
tabAssets.addEventListener('click',()=>switchTab('assets'));
|
|
653
654
|
</script>
|
|
654
655
|
</body>
|
|
655
|
-
</html>`}import*as
|
|
656
|
+
</html>`}import*as Xy from"node:http";import*as jo from"node:fs";import*as Un from"node:path";import{spawn as eb}from"node:child_process";var tb=e=>e==null?"":String(e);function nb(e){let t=r=>{try{let s=jo.statSync(Un.join(e,r));return{rel:r,size:s.size,mtime:s.mtimeMs}}catch{return null}},n=(r,s)=>{let c=[];try{c=jo.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 ob(e){let t="";try{t=jo.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 ib(e){try{return JSON.parse(jo.readFileSync(Un.join(e,"usage.json"),"utf-8"))}catch{return null}}function rb(e,t){let n=Un.resolve(e,t);if(n!==e&&!n.startsWith(e+Un.sep))return{ok:!1};try{return{ok:!0,text:jo.readFileSync(n,"utf-8")}}catch{return{ok:!1}}}function xs(e,t,n,o){e.writeHead(t,{"Content-Type":n,"Cache-Control":"no-store"}),e.end(o)}async function ew(e){let t=Un.resolve(tb(e.workspace_path||"workspace")),n=Number(e.port)||0,o=Xy.createServer((s,c)=>{let a=new URL(s.url??"/","http://localhost");if(a.pathname==="/")return xs(c,200,"text/html; charset=utf-8",sb);if(a.pathname==="/api/state"){let d=Es(t);return xs(c,200,"application/json",JSON.stringify({root:t,status:d,groups:nb(t),timing:ob(t),usage:ib(t)}))}if(a.pathname==="/api/file"){let d=a.searchParams.get("path")??"",p=rb(t,d);return p.ok?xs(c,200,"text/plain; charset=utf-8",p.text):xs(c,404,"text/plain","not found")}xs(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}
|
|
656
657
|
Workspace: ${t}
|
|
657
658
|
Press Ctrl-C to stop.
|
|
658
|
-
`),process.platform==="darwin"&&process.stderr.isTTY)try{
|
|
659
|
+
`),process.platform==="darwin"&&process.stderr.isTTY)try{eb("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 sb=`<!doctype html><html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
659
660
|
<title>scriptctl ingest \u76D1\u542C</title>
|
|
660
661
|
<style>
|
|
661
662
|
:root{--bg:#f6f7f9;--panel:#ffffff;--panel2:#f0f2f5;--line:#e3e6ea;--fg:#1f2430;--dim:#6b7280;--acc:#2563eb;--ok:#16a34a;--warn:#d97706;--err:#dc2626}
|
|
@@ -853,7 +854,7 @@ function poll(){
|
|
|
853
854
|
}).catch(function(){$('#tick').textContent='\u25CF \u79BB\u7EBF'});
|
|
854
855
|
}
|
|
855
856
|
poll();setInterval(poll,1500);setInterval(renderTiming,1000);
|
|
856
|
-
</script></body></html>`;function
|
|
857
|
+
</script></body></html>`;function tw(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>
|
|
857
858
|
<html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
858
859
|
<title>\u6F2B\u753B\u5267\u672C\u5BA1\u9605</title>
|
|
859
860
|
<style>
|
|
@@ -1002,39 +1003,39 @@ if(model.episodes.length){
|
|
|
1002
1003
|
const action=actions.find(action=>action.id===requested.get('action'));
|
|
1003
1004
|
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);}
|
|
1004
1005
|
}
|
|
1005
|
-
</script></html>`}var qk=e=>e==null?"":String(e),Zk=e=>String(e).padStart(3,"0");function Wk(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=uc.join(n,`ep_${Zk(o.episode)}.mp4`);try{zo.rmSync(i,{force:!0}),zo.symlinkSync(o.path,i)}catch{}}}async function Hy(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=qk(e.workspace_path||"workspace"),n=new mt(uc.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(h=>h.document_id===p);if(!l)throw new S(`Unknown comic source document: ${p}`,{exitCode:b,errorCode:"VIEW_COMIC_SOURCE_MISSING"});let f=n.path(`src/${l.document_id}.pdf`);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=zy(c,d)}else Wk(n),i=Jy(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 Xk from"fast-json-patch";var{compare:Qy}=Xk;var Fy="/api/anime/workbench/v2/script/project-groups",eb="/api/anime/workbench/projectGroup/updateProjectGroupInfo",tb=5e3,Yy=8*1024*1024;function nb(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 qy(e){return encodeURIComponent(String(e))}function ob(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 Zy(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=Yy))throw new fe(`script ${e} body too large: ${n} bytes (limit ${Yy})`)}async function Wy(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 ob(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,h=u.code;if(h!=null&&String(h)!=="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:h,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=nb(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`${Fy}/${qy(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:Qy(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 Zy("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=Qy(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return Zy("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${Fy}/${qy(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await Wy(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,tb),"POST",eb,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return Wy(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=O(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 ib(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 ib(e,Lr(e))}function rb(e){if(e.path)return O(e.path);let t=[];return e.episode!==null&&e.episode!==void 0&&t.push(O(e.episode)),e.scene!==null&&e.scene!==void 0&&t.push(O(e.scene)),e.action_index!==null&&e.action_index!==void 0&&t.push(`action[${e.action_index}]`),t.length>0?t.join("/"):null}function sb(e){let t=O(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function ab(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:sb(r.severity),code:O(r.code||"SCRIPT_VALIDATION_ISSUE"),path:rb(r),summary:O(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]=ab(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 Xy(e,t=to){let n=await _s(e),o=t.createExecutor(O(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(O(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(`
|
|
1006
|
-
`),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
|
|
1007
|
-
`),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function
|
|
1006
|
+
</script></html>`}var ab=e=>e==null?"":String(e),cb=e=>String(e).padStart(3,"0");function db(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=yc.join(n,`ep_${cb(o.episode)}.mp4`);try{zo.rmSync(i,{force:!0}),zo.symlinkSync(o.path,i)}catch{}}}async function nw(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 ew(e)}let t=ab(e.workspace_path||"workspace"),n=new mt(yc.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(h=>h.document_id===p);if(!l)throw new S(`Unknown comic source document: ${p}`,{exitCode:b,errorCode:"VIEW_COMIC_SOURCE_MISSING"});let f=n.path(`src/${l.document_id}.pdf`);zo.rmSync(f,{force:!0}),zo.symlinkSync(l.path,f);let u=await Sa(l,n.root);d.push({id:l.document_id,title:l.title,pdf:`src/${l.document_id}.pdf`,images:u})}i=tw(c,d)}else db(n),i=Wy(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 pb from"fast-json-patch";var{compare:ow}=pb;var iw="/api/anime/workbench/v2/script/project-groups",lb="/api/anime/workbench/projectGroup/updateProjectGroupInfo",ub=5e3,rw=8*1024*1024;function fb(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 sw(e){return encodeURIComponent(String(e))}function mb(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 aw(e,t){let n=Buffer.byteLength(JSON.stringify(t),"utf8");if(!(n<=rw))throw new fe(`script ${e} body too large: ${n} bytes (limit ${rw})`)}async function cw(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 mb(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,h=u.code;if(h!=null&&String(h)!=="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:h,payload:u})}return"data"in u?u.data:u}var zl=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=fb(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`${iw}/${sw(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:ow(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 aw("root",n),await this.request("PUT",this.projectPrefix,{body:n})}async patchScript(t){let n=ow(t.old,t.edited),o={requestId:t.requestId,baseRevision:t.baseRevision,source:t.source??"ctl",patch:n};return aw("patch",o),await this.request("PATCH",this.projectPrefix,{body:o})}async saveValidationResult(t){return await this.request("POST",`${iw}/${sw(this.projectGroupNo)}/validation-result`,{body:{revision:t.revision,validationStatus:t.validationStatus,validationSummary:t.validationSummary,issues:t.issues}})}async updateEpisodeCount(t){await cw(this.gatewayBase,this.accessKey,Math.min(this.timeoutMs,ub),"POST",lb,{body:{projectGroupNo:this.projectGroupNo,episodeCount:t}})}async request(t,n,o={}){return cw(this.gatewayBase,this.accessKey,this.timeoutMs,t,n,o)}};function Hl(e){return zl.fromEnv(e)}var Ss=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 Is(e){let t=O(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=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 Ss({workspace:t,scriptPath:n,script:o})}function As(e,t={}){let n=Ql(e.script);return e.remote&&(n.script_path=e.artifactLabel),n}function gb(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 Ql(e){return gb(e,Ur(e))}function hb(e){if(e.path)return O(e.path);let t=[];return e.episode!==null&&e.episode!==void 0&&t.push(O(e.episode)),e.scene!==null&&e.scene!==void 0&&t.push(O(e.scene)),e.action_index!==null&&e.action_index!==void 0&&t.push(`action[${e.action_index}]`),t.length>0?t.join("/"):null}function yb(e){let t=O(e||"info");return t==="blocking"||t==="error"?"error":t==="warning"?"warning":"info"}function wb(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:yb(r.severity),code:O(r.code||"SCRIPT_VALIDATION_ISSUE"),path:hb(r),summary:O(r.summary),repairHint:r.repair_hint,payload:s})}return[n,o,i]}async function Fl(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]=wb(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 Yl(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 dw(e,t=to){let n=await Is(e),o=t.createExecutor(O(e.llm_config).trim()||void 0),i=await ul(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(O(e.output).trim()||Oi.join(r,"asset-audit.json"));Fe(s,i);let c=i.issues.length>0,a=i.issues.map(fl);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(`
|
|
1007
|
+
`),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 pw(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:Bn(e.actors)?e.actors:[],props:Bn(e.props)?e.props:[],locations:t&&String(t.location_id??"").trim()?[t]:[]}}function _w(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(`
|
|
1008
|
+
`),data:{op:"script.create",changed:!0,validation:t,script_path:e.artifactLabel,...e.remote?{revision:e.revision,idempotent:n}:{}}}}async function Ew(e){let t=O(e.workspace_path||"workspace"),n=!!e.force,o=O(e.title).trim(),i=pw(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 Ss({workspace:t,scriptPath:r,script:i}),c=As(s),a=!!c.passed;return[_w(s,c,null),a?G:uo]}import*as Er from"node:fs";import*as Mi from"node:path";function Nb(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 Ub(e){return oe(e)&&Object.values(e).every(Ri)}function Pb(e){return oe(e)&&e.version===3&&Ri(e.actor)&&Ri(e.location)&&Ri(e.prop)&&Ub(e.state)&&Ri(e.episode)&&Ri(e.scene)&&Ri(e.action)}function Cb(e){if(e!==void 0){if(Pb(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 xw(e,t){let n=Tt(e),o=cr(n,Cb(t),{action:Nb(n)});return{script:o.script,artifact:{sourceVersion:3,targetVersion:4,identityMap:o.identityMap}}}var Tb=[{sourceVersion:3,targetVersion:4,migrate:xw}];function Vb(e){return oe(e)&&yo(e.source_version)&&yo(e.target_version)&&e.source_version<e.target_version&&"identity_map"in e}function Sw(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(!Vb(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 $b(e,t){return Tb.find(n=>n.sourceVersion===e&&n.targetVersion<=t)}function Db(e,t){return e.find(n=>n.sourceVersion===t.sourceVersion&&n.targetVersion===t.targetVersion)}function Iw(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=zs(e),r=o,s=[];for(;r<t;){let c=$b(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,Db(n,c));i=a.script,r=c.targetVersion,s.push(a.artifact)}return{sourceVersion:o,targetVersion:t,script:i,steps:s}}function ks(e,t){let n=e[t];return typeof n=="string"?n.trim():""}function Gb(e,t){let n=ks(e,t);return/^\d+$/.test(n)?Number(n):null}function Bb(e){let t=Gb(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:ed.map(String),actual:[ks(e,"to")||"<empty>"]}})}function Jb(e){let t=Mi.extname(e);return`${t.length>0?e.slice(0,-t.length):e}.migration.json`}function Kb(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 Aw(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 jb(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 zb(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||!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:Sw(n.steps)}}async function kw(e){let t=ks(e,"script_path"),n=ks(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(ks(e,"manifest")||Jb(i)),s=Bb(e),c=!!e.force;return Kb(o,i,r),Bs(i,async()=>{Aw(i,c),Aw(r,c);let a=jb(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=Ur(a.value),l=zb(r,c),f=Iw(a.value,s,l?.steps),u=Ur(f.script),h={version:1,source_version:f.sourceVersion,target_version:f.targetVersion,source_path:o,source_sha256:_e(a.raw),steps:f.steps};Fe(r,{...h,steps:h.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(`
|
|
1008
1009
|
`):[`Script v${f.targetVersion}: ${i}`,`Migration manifest: ${r}`,`validation: ${u.errors.length} errors; repair before production use`].join(`
|
|
1009
|
-
`),data:m},u.ok?G:uo]})}import*as
|
|
1010
|
+
`),data:m},u.ok?G:uo]})}import*as xr from"node:path";import*as vw from"node:path";function bw(e,t){let n=_e(t);return vw.join(e,`${n}.json`)}function bs(e){return{read(t){let n=bw(e,t);return Fo(n)?Ar(n):null},write(t){Lc(bw(e,t.key),t)}}}function ou(){return{read(){return null},write(){}}}function iu(e){if(Array.isArray(e))return`[${e.map(t=>iu(t)).join(",")}]`;if(e&&typeof e=="object"){let t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${iu(t[n])}`).join(",")}}`}return JSON.stringify(e)}function ru(e){return _e(iu(e))}function su(e,t,n){return{key:e,signature:t,value:n,createdAt:new Date().toISOString()}}function Hb(e,t){return[e.trim(),t.trim()].filter(Boolean).join(`
|
|
1010
1011
|
|
|
1011
|
-
`)}function
|
|
1012
|
-
`),
|
|
1013
|
-
`),
|
|
1014
|
-
`),
|
|
1015
|
-
`);function
|
|
1016
|
-
`).trim()}}function
|
|
1012
|
+
`)}function Rw(e,t){return{system:Hb(e.instruction,e.format),user:e.input?e.input({parcel:t}):String(t)}}function Qb(e,t,n){if(e.kind==="llm"){if(!n.executor)throw new Error("loom llm task requires run({ executor })");let o=Rw(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 _c(e){return{kind:"root",children:e}}function pu(e,t,n){return{kind:"scope",scope:e,data:n,children:t}}function vs(e){return{kind:"parcel",data:e}}function Rs(e){return{kind:"llm",...e}}var au=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 Xb(this.input,this.steps,t)}};function Ec(e){return new au(e)}async function Fb(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 Yb(e,t){let n=t.partition(e);return _c(n.map(o=>{let i=t.chunk(o).map(r=>vs(r));return pu(t.scope,i,o)}))}function cu(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(...cu(r,s))}return o}function Os(e,t){return e?.(t),t}async function qb(e,t){return Os(e.validate,await e.run({parcel:t}))}async function Zb(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 Ow(e,t,n){return Os(e.validate,e.parse({text:n.text,parcel:t,raw:n.raw}))}function Mw(e,t,n){if(e.kind==="parcel"){let i=t[n.index];return n.index+=1,vs(i)}let o=e.children.map(i=>Mw(i,t,n));return e.kind==="root"?_c(o):pu(e.scope,o,e.data)}function Wb(e){return e.children.every(t=>t.kind==="parcel")}async function Lw(e,t,n,o,i){if(e.kind==="parcel")return e;let r=[];for(let w=0;w<e.children.length;w++){let y=e.children[w];r.push(await Lw(y,t,n,o,[...i,`${y.kind}:${w}`]))}let s=e.kind==="root"?_c(r):pu(e.scope,r,e.data),c=t==="root"&&s.kind==="root",a=s.kind==="scope"&&s.scope===t;if(!c&&!a||!Wb(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("/")}:${ru({items:d,scopeData:p,version:f,salt:o.checkpointSalt})}`,h=ru({step:"reduce",scope:t,version:f,items:d,scopeData:p,salt:o.checkpointSalt}),m=await du(o.checkpoint,u,h);if(m.hit)return o.report.reused+=1,vs(Os(n.validate,m.value));let g=Os(n.validate,await n.run(d,{scope:p,scopeName:l}));return o.report.ran+=1,await o.checkpoint.write(su(u,h,g)),vs(g)}async function du(e,t,n){let o=await e.read(t);return o&&o.signature===n?{hit:!0,value:o.value}:{hit:!1}}async function Xb(e,t,n){let o={executor:n.executor,signal:n.signal,checkpointSalt:n.checkpointSalt,checkpoint:n.checkpoint??ou(),concurrency:n.concurrency??4,report:{reused:0,ran:0}},i=null,r=e;for(let c of t){if(c.kind==="split"){i=Yb(r,c.spec),r=i;continue}if(i||(i=_c([vs(r)])),c.kind==="extract"){let a=cu(i),d=await Fb(a,o.concurrency,async p=>{let l=Qb(c.task,p.parcel,o),f=ru(l.payload),u=`extract:${p.path.join("/")}:${f}`;if(c.task.kind==="llm"){let g=await du(o.checkpoint,u,f);if(g.hit)return o.report.reused+=1,o.executor?.recordReuse(c.task.taskId),Ow(c.task,p.parcel,g.value);let w=l.request??Rw(c.task,p.parcel),y=await Zb(c.task,w,o),_=Ow(c.task,p.parcel,y);return o.report.ran+=1,await o.checkpoint.write(su(u,f,y)),_}let h=await du(o.checkpoint,u,f);if(h.hit)return o.report.reused+=1,Os(c.task.validate,h.value);let m=await qb(c.task,p.parcel);return o.report.ran+=1,await o.checkpoint.write(su(u,f,m)),m});i=Mw(i,d,{index:0}),r=i;continue}i=await Lw(i,c.scope,c.task,o,[]),r=i}if(!i)return{value:r,report:o.report};let s=cu(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 Cw={episodeInputMaxChars:6e3,episodeChunkTargetChars:4800,arcEpisodeCount:10,finalMaxInputChars:12e3},ev="\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",tv=["\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(`
|
|
1013
|
+
`),nv="\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",ov=["\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(`
|
|
1014
|
+
`),iv="\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",rv=["\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(`
|
|
1015
|
+
`),sv="\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",av=["\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(`
|
|
1016
|
+
`);function cv(e,t,n){let o=O(t.episode_id).trim()||`ep_${String(n+1).padStart(3,"0")}`,i=Av(o,n),r=O(t.title).trim(),s=[],c=O(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(Sv(e,a));for(let d of re(a.actions)){let p=Iv(e,d);p&&s.push(p)}s.push("")}return{episodeIndex:n,episodeId:o,episodeNo:i,title:r,existingSynopsis:O(t.synopsis).trim(),text:s.join(`
|
|
1017
|
+
`).trim()}}function dv(e,t=Cw){let n=e.text.split(/\r?\n/),o=n.flatMap(c=>_v(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(`
|
|
1017
1018
|
`).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(`
|
|
1018
|
-
`).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
|
|
1019
|
-
`),oneLine:
|
|
1020
|
-
`),turns:
|
|
1021
|
-
`)}function
|
|
1022
|
-
`),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
|
|
1023
|
-
`).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=
|
|
1024
|
-
`)}function
|
|
1025
|
-
`)}function
|
|
1026
|
-
`).trim()}function
|
|
1027
|
-
`).trim()}function
|
|
1028
|
-
`)}function
|
|
1019
|
+
`).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 pv(e,t){let n=Sc(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:Sr(n.get("\u5173\u952E\u4E8B\u4EF6")??""),characterChanges:vv(n.get("\u4EBA\u7269\u53D8\u5316")??""),hook:(n.get("\u7ED3\u5C3E\u94A9\u5B50")??"").trim()}}function lv(e,t){let n=Pv(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(`
|
|
1020
|
+
`),oneLine:Tv(o.map(i=>i.synopsis)),events:fu(o.flatMap(i=>i.events))}}function uv(e,t){let n=Sc(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:Sr(n.get("\u5173\u952E\u4E8B\u4EF6")??"")}}function fv(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:Lv(i)})}return n}function mv(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:Nv(i)})}return n}function gv(e,t){let n=Sc(e);return{index:t.index,startEpisodeNo:t.startEpisodeNo,endEpisodeNo:t.endEpisodeNo,synopsis:po(n,"\u9636\u6BB5\u6897\u6982"),turns:Sr(n.get("\u5173\u952E\u8F6C\u6298")??""),openQuestions:Sr(n.get("\u672A\u89E3\u51B3\u60AC\u5FF5")??"")}}function hv(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(`
|
|
1021
|
+
`),turns:fu(t.flatMap(i=>i.turns)),openQuestions:fu(t.flatMap(i=>i.openQuestions))}}function lu(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(`
|
|
1022
|
+
`)}function yv(e){let t=Sc(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:Ov(po(t,"\u4E3B\u8981\u4EBA\u7269"))}}async function wv(e){let t=e.config??Cw,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,h)=>cv(e.script,u,h)),i=e.overwrite?o:o.filter(u=>!u.existingSynopsis),r=i.length===0?[]:await Ec(e.script).split({scope:"episode",partition:()=>i,chunk:u=>dv(u,t)}).extract(Rs({taskId:"synopsis.chunk",instruction:ev,format:tv,input:({parcel:u})=>Rv(u),parse:({text:u,parcel:h})=>pv(u,h)})).reduce("episode",lv).extract(Rs({taskId:"synopsis.episode",instruction:nv,format:ov,input:({parcel:u})=>Mv(u),parse:({text:u,parcel:h})=>uv(u,h)})).reduce("root",u=>[...u].sort((h,m)=>h.episodeNo-m.episodeNo)).run({concurrency:e.concurrency,checkpoint:bs(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:Vv(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||Dv(e.script),l=p?await Ev({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 xv({episodes:a,arcs:l.value,executor:e.executor,checkpointDir:xr.join(e.checkpointDir,"final"),checkpointSalt:e.checkpointSalt,config:t}):{value:Gv(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 Tw(e,t=to){let n=$v(e.concurrency,_u,"--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=O(e.workspace_path||"workspace"),c=await Is(e),a=O(e.model).trim(),d=t.createExecutor(O(e.llm_config).trim()||void 0,a?{profile:a}:void 0),p=O(e.checkpoint).trim()||xr.join(Su(s),"loom","synopsis-generate"),l=await wv({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 U=u[k.episodeIndex];U&&(o||!O(U.synopsis).trim())&&O(U.synopsis)!==k.synopsis&&(U.synopsis=k.synopsis,f.add(k.episodeId))}let h=!1;if(h=xc(c.script,"synopsis",l.overview.synopsis,o)||h,h=xc(c.script,"theme",l.overview.theme,o)||h,h=xc(c.script,"logline",l.overview.logline,o)||h,h=xc(c.script,"style",l.overview.style,o)||h,o||re(c.script.main_characters).length===0){let k=l.overview.mainCharacters.map(U=>({name:U.name,role:U.role}));JSON.stringify(c.script.main_characters??[])!==JSON.stringify(k)&&(c.script.main_characters=k,h=!0)}let m=f.size>0||h,g=As(c),w=!!g.passed,y=[`${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 Yl(c,e,"synopsis.generate"),await Fl(c,g,_),c.remote&&y.push(`revision ${_}; idempotent ${String(x).toLowerCase()}`));let E=Ad(re(g.issues));return i||y.push("Run again with --apply to write the generated synopsis fields."),[{text:[...y,...E].join(`
|
|
1023
|
+
`),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 _v(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 Ev(e){let t=fv(e.episodes,e.config.arcEpisodeCount),n=1,o={reused:0,ran:0};for(;;){let i=await Ec(t).split({scope:"arc",partition:c=>c,chunk:c=>[c]}).extract(Rs({taskId:"synopsis.arc",instruction:iv,format:rv,input:({parcel:c})=>Uv(c),parse:({text:c,parcel:a})=>gv(c,a)})).reduce("arc",c=>Cv(c,"arc")).reduce("root",c=>[...c].sort((a,d)=>a.startEpisodeNo-d.startEpisodeNo)).run({concurrency:e.concurrency,checkpoint:bs(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(lu(e.episodes,r).length<=e.config.finalMaxInputChars||r.length<=1)return{value:r,report:o};t=mv(r,e.config.arcEpisodeCount),n+=1}}async function xv(e){let t=e.arcs;for(;lu(e.episodes,t).length>e.config.finalMaxInputChars&&t.length>1;)t=[hv(t)];let n=await Ec({episodes:e.episodes,arcs:t}).extract(Rs({taskId:"synopsis.script-overview",instruction:sv,format:av,input:({parcel:o})=>lu(o.episodes,o.arcs),parse:({text:o})=>yv(o)})).run({concurrency:1,checkpoint:bs(e.checkpointDir),checkpointSalt:e.checkpointSalt,executor:e.executor});return{value:n.value,report:n.report}}function Sv(e,t){let n=oe(t.environment)?t.environment:{},o=O(n.space).trim(),i=O(n.time).trim(),r=Qo(t),s=re(r.locations).map(p=>uu(e,"locations","location_id","location_name",O(p.location_id))).filter(p=>p),c=re(r.actors).map(p=>uu(e,"actors","actor_id","actor_name",O(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 Iv(e,t){let n=O(t.type).trim();if(n==="dialogue"){let i=Nw(e,t),r=O(t.content).trim();return r?`[\u5BF9\u767D] ${i?`${i}\uFF1A`:""}${r}`:""}if(n==="inner_thought"){let i=Nw(e,t),r=O(t.content).trim();return r?`[\u5FC3\u58F0] ${i?`${i}\uFF1A`:""}${r}`:""}let o=O(t.content).trim();return o?`[\u52A8\u4F5C] ${o}`:""}function Nw(e,t){let n=t.speaker;if(!oe(n))return"";let o=O(n.actor_id).trim();if(o)return uu(e,"actors","actor_id","actor_name",o)||o;let i=O(n.kind).trim();return i?O(n.label).trim()||i:""}function uu(e,t,n,o,i){let r=re(e[t]).find(s=>O(s[n])===i);return r?O(r[o]).trim():""}function Av(e,t){let n=/^ep_(\d+)$/.exec(e);return n?Number(n[1]):t+1}function Sc(e){let t=new Map,n=null,o=[],i=()=>{n&&t.set(n,o.join(`
|
|
1024
|
+
`).trim()),o=[]};for(let r of e.split(/\r?\n/)){let s=kv(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 Uw=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 kv(e){let t=e.trim(),n=/^#{1,6}\s+(.+?)\s*$/.exec(t);if(n){let r=Pw(n[1].trim());return Uw.has(r)?{name:r,inline:""}:null}let o=t.search(/[::]/),i=Pw((o>=0?t.slice(0,o):t).trim());return Uw.has(i)?{name:i,inline:o>=0?t.slice(o+1).trim():""}:null}var bv={\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 Pw(e){return bv[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 Sr(e){return e.split(/\r?\n/).map(t=>t.trim()).map(t=>t.replace(/^[-*]\s*/,"").trim()).filter(t=>t.length>0)}function vv(e){return Sr(e).map(t=>{let[n,...o]=t.split("|");return{name:O(n).trim(),change:o.join("|").trim()}}).filter(t=>t.name&&t.change)}function Ov(e){return Sr(e).map(t=>{let[n,...o]=t.split("|");return{name:O(n).trim(),role:o.join("|").trim()}}).filter(t=>t.name&&t.role)}function Rv(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(`
|
|
1025
|
+
`)}function Mv(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(`
|
|
1026
|
+
`)}function Lv(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(`
|
|
1027
|
+
`).trim()}function Nv(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(`
|
|
1028
|
+
`).trim()}function Uv(e){return[`\u5F53\u524D\u9636\u6BB5\uFF1A\u7B2C${e.startEpisodeNo}-${e.endEpisodeNo}\u96C6`,"","\u5206\u96C6\u6897\u6982\uFF1A",e.text].join(`
|
|
1029
|
+
`)}function Pv(e,t){if(e===null)throw new Error(`${t} scope missing`);return e}function Cv(e,t){let n=e[0];if(!n||e.length!==1)throw new Error(`${t} reduce requires exactly one item`);return n}function Tv(e){return e.map(t=>t.trim()).find(t=>t.length>0)??""}function fu(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 Vv(e){let t=e.replace(/\s+/g," ").trim();return t.length>50?t.slice(0,50):t}function $v(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:[O(e)]}});return Math.floor(o)}function xc(e,t,n,o){return!o&&O(e[t]).trim()||O(e[t])===n?!1:(e[t]=n,!0)}function Dv(e){return!O(e.synopsis).trim()||!O(e.theme).trim()||!O(e.logline).trim()||!O(e.style).trim()||re(e.main_characters).length===0}function Gv(e){return{synopsis:O(e.synopsis).trim(),theme:O(e.theme).trim(),logline:O(e.logline).trim(),style:O(e.style).trim(),mainCharacters:re(e.main_characters).map(t=>({name:O(t.name).trim(),role:O(t.role).trim()})).filter(t=>t.name&&t.role)}}import*as Ms from"node:fs";var $w=3;function mu(e){return O(e.project_group_no||process.env.SANDBOX_PROJECT_GROUP_NO).trim()}function gu(e){try{return Hl(e)}catch(t){throw t instanceof fe?Ho("SCRIPT API BLOCKED: gateway not configured",t):t}}function Dw(e,t){let n=mu(e);if(n&&n!==t.projectGroupNo)throw Vw(t,`configured projectGroupNo=${n}`);let o=gu(t.projectGroupNo);if(o.gatewayBase!==t.apiBaseUrl)throw Vw(t,`configured apiBaseUrl=${o.gatewayBase}`);return o}function Vw(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 hu(e){let t;try{t=JSON.parse(Ms.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 Gw(e){return String(e.code)==="9002"||e.message.includes("\u7248\u672C\u51B2\u7A81")}function Ic(e){let t=e.status!==null&&e.status>=200&&e.status<300&&e.code===null;return e.status===null||e.status>=500||t}function Bw(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 Jw(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<=$w;c+=1){let a;try{a=await e.getSnapshot()}catch(p){if(p instanceof fe&&Ic(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=Bw(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&&(Gw(p)||Ic(p))){s.push(`patch attempt ${c}: ${p.message}`);continue}throw p instanceof fe?Ho("PUBLISH BLOCKED: patch failed",p):p}}throw Jw(i.baseRevision,s)}async function Jv(e,t,n,o,i){let r=[];for(let s=1;s<=$w;s+=1){let c;try{c=await e.getSnapshot()}catch(a){if(a instanceof fe&&Ic(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=Bw(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&&(Gw(a)||Ic(a))){r.push(`patch attempt ${s}: ${a.message}`);continue}throw a instanceof fe?Ho("PUBLISH BLOCKED: patch failed",a):a}}throw Jw(0,r)}async function Kw(e){let t=me(e),n=!!e.discard_local,o=Nr(t),i=Ks(t),r=Ms.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(hu(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?Dw(e,i):gu(mu(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}`]}});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 jw(e){let t=me(e),n=Ms.existsSync(t),o=Ks(t),i=n&&o!==null?Je(hu(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 zw(e){let t=me(e),n=hu(t),o=Je(n),i=Ks(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=Ql(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=zs(n).episodes.length,c={status:"valid",summary:{passed:!0,hasBlocking:!1,stats:r.stats??{},issueCount:0}};if(i!==null){let p=Dw(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 $d(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=gu(mu(e)||null),d=await Jv(a,t,n,o,c);return js(t,{schemaVersion:1,projectGroupNo:a.projectGroupNo,apiBaseUrl:a.gatewayBase,baseRevision:d.revision,baseContentHash:o}),await $d(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 Hw(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",`
|
|
1029
1030
|
Example:
|
|
1030
1031
|
scriptctl migrate -p ./old-script.json -o ./script-v4.json --to 4
|
|
1031
|
-
`).action(H(
|
|
1032
|
+
`).action(H(kw,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",`
|
|
1032
1033
|
Example:
|
|
1033
1034
|
scriptctl ingest --source-path ./draft.md --workspace-path ./workspace
|
|
1034
|
-
`).action(H(r=>
|
|
1035
|
+
`).action(H(r=>Qy(r,n),t));o.command("status").description("Show ingest workspace progress").option("-w, --workspace-path <path>","Workspace directory").action(H(Yy,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",`
|
|
1035
1036
|
Example:
|
|
1036
1037
|
scriptctl ingest skip -w ./workspace --episode 7 --reason "provider policy block"
|
|
1037
|
-
`).action(H(
|
|
1038
|
+
`).action(H(qy,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",`
|
|
1038
1039
|
Example:
|
|
1039
1040
|
scriptctl evidence -p ./script.json -s /Volumes/NAS/videos -w ./workspace --force
|
|
1040
|
-
`).action(H(
|
|
1041
|
+
`).action(H(Zy,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(nw,t)),Rd(e.command("checkout")).description("Download a remote script into a managed local copy").option("--discard-local","Replace an existing dirty local copy").action(H(Kw,t)),ee(e.command("status"),"read").description("Show local working-copy state").action(H(jw,t)),Rd(e.command("publish")).description("Validate and publish the local working copy").action(H(zw,t)),ee(e.command("create")).description("Create an empty script").option("--title <title>","Script title").option("--force","Replace an existing script file").action(H(Ew,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=>dw(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=>Tw(r,n),t))}function zv(e,t=to){let n=new Kv("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 Hw(n,e,t),Pg(n,e),Cf(n,e),Ng(n,e),dm(n,e),n}function Ac(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 Fw(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=Ac(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 Hv(e,t){return t==="--"?!0:t.startsWith("--")?Ac(e,t)!==void 0:Fw(e,t).recognized}function Qw(e,t,n){return n===void 0||n==="--"?!1:t.required?!Hv(e,n):t.optional&&!n.startsWith("-")}function Qv(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=Ac(n,i);s&&!i.includes("=")&&Qw(n,s,t[o+1])&&(o+=1);continue}if(i.startsWith("-")){let s=Fw(n,i);if(s.recognized&&s.json)return!0;s.recognized&&s.valueOption&&!s.hasAttachedValue&&Qw(n,s.valueOption,t[o+1])&&(o+=1);continue}let r=n.commands.find(s=>s.name()===i);r&&(n=r)}return!1}function Fv(e,t){let n=e;for(let r=0;r<t.length;r+=1){let s=t[r];if(s.startsWith("-")){let a=Ac(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 Yv(e){return e.message.replace(/^error:\s*/i,"").replace(/\.$/,"")}async function Fj(e=null,t=to){Bf();let n=e??process.argv.slice(2),o={jsonMode:!1,exitCode:G},i=zv(o,t);if(o.jsonMode=Qv(i,n),n.length===0)return i.outputHelp(),G;try{return await i.parseAsync(n,{from:"user"}),o.exitCode}catch(r){if(r instanceof jv)return r.code==="commander.help"||r.code==="commander.helpDisplayed"||r.code==="commander.version"?G:Br(new S(Yv(r),{exitCode:B,errorCode:"USAGE_ERROR",hint:`Run '${Fv(i,n)}'.`}),o.jsonMode);if(r instanceof S)return Br(r,o.jsonMode);if(r instanceof T)return Br(new S(yn(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{zv as a,Fj as b};
|