@lingjingai/scriptctl 0.66.20 → 0.66.21

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.
@@ -0,0 +1,15 @@
1
+ # 0.66.21
2
+
3
+ ## Added
4
+ - None.
5
+
6
+ ## Changed
7
+ - `scriptctl review` 的 `find`、`replace` 工具支持多个集、场或 Action 地址,重叠范围去重并按剧本顺序批量处理;替换默认预览,`apply` 后写入。
8
+
9
+ ## Fixed
10
+ - `scriptctl review` 将空工具名的畸形模型响应记为可重试的响应格式错误,按现有配置重试和切换渠道;该响应中的工具不会执行,已完成的步骤保留。
11
+ - `scriptctl review` 的全局身份审核须为收到的每条未决上报记录明确的结论引用;仅调用 `validate` 或在正文提到上报 ID 不再视为完成。遗漏时继续当前审核,达到执行上限仍遗漏则记录失败并保留进度。
12
+ - `scriptctl review` 的失败诊断保存底层异常链、网络错误码、HTTP 状态和可重试标记。
13
+
14
+ ## Breaking
15
+ - None.
package/dist/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{b as s}from"./chunk-BJXWAWKW.js";import{Console as r}from"node:console";var o=new r({stdout:process.stderr,stderr:process.stderr});console.debug=o.debug.bind(o);console.info=o.info.bind(o);console.log=o.log.bind(o);s(process.argv.slice(2)).then(e=>{process.exitCode=e}).catch(e=>{console.error(e),process.exitCode=70});
2
+ import{b as s}from"./chunk-FPG54CMI.js";import{Console as r}from"node:console";var o=new r({stdout:process.stderr,stderr:process.stderr});console.debug=o.debug.bind(o);console.info=o.info.bind(o);console.log=o.log.bind(o);s(process.argv.slice(2)).then(e=>{process.exitCode=e}).catch(e=>{console.error(e),process.exitCode=70});
@@ -178,7 +178,7 @@ ${t.text}`),e.next_offset===null?"end":`Continue: --offset ${e.next_offset}`].jo
178
178
 
179
179
  `)}function k5(e,t){let n=t.raw.role_type?` <${t.raw.role_type}>`:"",o=[`${t.id} ${t.name} ${t.kind}${t.importance?` [${t.importance}]`:""}${n}`];t.aliases.length&&o.push(`aliases: ${t.aliases.join(", ")}`),t.desc&&o.push(t.desc),o.push(`states (${t.states.length})`);for(let s of t.states)o.push(` ${s.id} ${s.name} ${Yr(s.desc,160)}`);let i=[],r=new Map;for(let s of e.episodes)for(let c of s.scenes){let a=[c.location,...c.actors,...c.props].find(d=>d&&d.id===t.id);if(a){i.push(c);for(let d of a.states)r.set(d,(r.get(d)??0)+1)}}if(i.length){let s=[...new Set(i.map(a=>a.ep.no))];o.push(`appears: ${i.length} scenes across ${s.length} ep first ${i[0].ep.no}-${i[0].no} last ${i.at(-1).ep.no}-${i.at(-1).no}`),o.push(`state usage: ${[...r].map(([a,d])=>`${ai(e,t.id,a)}\xD7${d}`).join(", ")}`);let c=t.states.filter(a=>!r.has(a.id));c.length&&o.push(`unused states: ${c.map(a=>`${a.id}(${a.name})`).join(", ")}`)}else o.push("appears: never referenced");return o.join(`
180
180
  `)}function b5(e,t,n){let o=[];for(let r of e.episodes)for(let s of r.scenes)[s.location,...s.actors,...s.props].find(a=>a&&a.id===t.id)?.states.includes(n.id)&&o.push(s);let i=bn(e).filter(r=>r.speaker?.id===t.id&&r.speaker.state===n.id);return[`${t.id}/${n.id} ${n.name} (${t.kind} ${t.name})`,n.desc,o.length?`bound in ${o.length} scene(s): ${o.slice(0,12).map(r=>`${r.ep.no}-${r.no}`).join(", ")}`+(o.length>12?" \u2026":""):"bound in no scene",i.length?`named by ${i.length} speaker reference(s)`:""].filter(Boolean).join(`
181
- `)}function Yr(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function lp(e,t){let n=bn(e);if(F("find",`pool = all actions (${n.length})`),t.in){let o=Te(e,t.in);if(o.t==="ep")n=o.ep.scenes.flatMap(i=>i.actions);else if(o.t==="scene")n=o.scene.actions;else if(o.t==="action")n=[o.action];else throw new Error(`--in must address an episode, scene or action (got ${o.t})`);F("find",`--in ${t.in} narrows pool to ${n.length}`)}if(t.type&&(n=n.filter(o=>o.type===t.type),F("find",`--type ${t.type} -> ${n.length}`)),t.speaker){let o=Te(e,t.speaker);if(o.t!=="asset")throw new Error("--speaker must name an actor");n=n.filter(i=>i.speaker?.id===o.asset.id),F("find",`--speaker ${t.speaker} -> ${o.asset.id} -> ${n.length}`)}return n}function cm(e,t,n={}){let o=lp(e,n),i=t?new RegExp(t,"u"):null,r=o.filter(f=>!i||i.test(f.content));F("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}`,m=u===f.anchor?"":u.padEnd(8)+" ",h=f.speaker?.id?si(e,f.speaker.id)+"\uFF1A":"",g=n.full||!i?f.content:v5(f.content,i,c);return`${f.anchor.padEnd(d)} ${m}${h}${g}`});return[p,...l].join(`
181
+ `)}function Yr(e,t){return e.length>t?e.slice(0,t)+"\u2026":e}function lp(e,t){let n=bn(e);if(F("find",`pool = all actions (${n.length})`),t.in!==void 0){let o=typeof t.in=="string"?[t.in]:t.in,i=new Set(o.flatMap(r=>{let s=Te(e,r);if(s.t==="ep")return s.ep.scenes.flatMap(c=>c.actions);if(s.t==="scene")return s.scene.actions;if(s.t==="action")return[s.action];throw new Error(`--in must address an episode, scene or action (got ${s.t})`)}));n=n.filter(r=>i.has(r)),F("find",`--in ${o.join(", ")} narrows pool to ${n.length}`)}if(t.type&&(n=n.filter(o=>o.type===t.type),F("find",`--type ${t.type} -> ${n.length}`)),t.speaker){let o=Te(e,t.speaker);if(o.t!=="asset")throw new Error("--speaker must name an actor");n=n.filter(i=>i.speaker?.id===o.asset.id),F("find",`--speaker ${t.speaker} -> ${o.asset.id} -> ${n.length}`)}return n}function cm(e,t,n={}){let o=lp(e,n),i=t?new RegExp(t,"u"):null,r=o.filter(f=>!i||i.test(f.content));F("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}`,m=u===f.anchor?"":u.padEnd(8)+" ",h=f.speaker?.id?si(e,f.speaker.id)+"\uFF1A":"",g=n.full||!i?f.content:v5(f.content,i,c);return`${f.anchor.padEnd(d)} ${m}${h}${g}`});return[p,...l].join(`
182
182
  `)}function v5(e,t,n){let o=e.match(t);if(!o||o.index===void 0)return Yr(e,n*2);let i=Math.max(0,o.index-n),r=Math.min(e.length,o.index+o[0].length+n);return(i>0?"\u2026":"")+e.slice(i,r)+(r<e.length?"\u2026":"")}function up(e,t){return rp(ip(e),ap(e,lp(e,{in:t})))}function dm(e,t){let n=up(e,t);return sp.map(o=>`${o}=${n[o]}`).join(" ")}var O5=["content","paren","speaker","ts","type","transition"],R5=["name","desc","importance","aliases","role"],M5=["name","desc"],N5=["title","synopsis"],L5=["space","time"],U5=["title","worldview","style","synopsis","logline","theme","main"];function qr(e,t,n,o){let i=Object.keys(n).filter(s=>n[s]!==void 0);if(!i.length)throw new Error(`Nothing to change on ${e}; pass at least one field`);let r=i.filter(s=>!o.includes(s));if(r.length){let s=/^[aeiou]/.test(t)?"an":"a";throw new Error(`${e} is ${s} ${t}; it has no ${r.join(", ")} \u2014 ${s} ${t} takes ${o.join(", ")}`)}return i}function pm(e,t,n){let o=Te(e,t);if(o.t==="asset")return C5(e,t,o.asset,n);if(o.t==="state")return T5(e,t,o.asset,o.state,n);if(o.t==="script")return rm(e,t||"script","script",o.doc.raw,n,U5);if(o.t==="ep")return rm(e,t,"episode",o.ep.raw,n,N5);if(o.t==="scene")return P5(e,t,o.scene,n);let i=o.action,r=i.raw,s=qr(i.anchor,"action",n,O5),c=pt(e);if(F("edit",`${i.anchor}: ${s.join(", ")}`),n.type!==void 0&&(r.type=ci("type",n.type,qt,Tn)),n.content!==void 0&&(r.content=n.content),n.paren!==void 0&&pa(e,r,n.paren),n.speaker===null?delete r.speaker:n.speaker!==void 0&&(r.speaker=fp(e,n.speaker)),n.ts!==void 0&&fm(r,n.ts),n.transition!==void 0)if(n.transition===null)delete r.transition_prompt;else{let[a,d,p]=n.transition.split("|").map(f=>f.trim());if(!a||!d||!p)throw new Error(`transition takes "target|process|contrast" (got "${n.transition}")`);let l=Te(e,a);if(l.t!=="asset")throw new Error(`transition target must be an asset (got ${a})`);r.transition_prompt={target:l.asset.id,process:d,contrast:p}}return be(e),`${i.anchor} ${s.join("+")} ${ua(r)}`+Be(e,c)}function rm(e,t,n,o,i,r){let s=qr(t,n,i,r),c=pt(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 F("edit",`${n} ${t}: ${s.join(", ")}`),be(e),`${t} ${s.join("+")}`+Be(e,c)}function P5(e,t,n,o){let i=qr(t,"scene",o,L5),r=pt(e),s={...n.raw.environment??{}};return o.space!==void 0&&(s.space=ci("space",o.space,lu,Rc)),o.time!==void 0&&(s.time=ci("time",o.time,Oc,Ps)),n.raw.environment=s,F("edit",`scene ${n.anchor}: ${i.join(", ")}`),be(e),`${n.anchor} ${i.join("+")} ${[s.space,s.time].filter(Boolean).join("/")}`+Be(e,r)}function C5(e,t,n,o){let i=qr(t,"asset",o,R5),r=pt(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=_m(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=ci("role",o.role,uo,Pi):delete n.raw.role_type}return o.aliases!==void 0&&(o.aliases.length?n.raw.aliases=o.aliases:delete n.raw.aliases),F("edit",`asset ${n.id}: ${i.join(", ")}`),be(e),`${n.id} ${i.join("+")} ${o.name??n.name}`+Be(e,r)}function T5(e,t,n,o,i){let r=qr(t,"state",i,M5),s=pt(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),F("edit",`state ${n.id}/${o.id}: ${r.join(", ")}`),be(e),`${n.id}/${o.id} ${r.join("+")} ${i.name??o.name}`+Be(e,s)}function lm(e,t,n,o,i,r,s,c){let a=Te(e,t);if(a.t!=="action")throw new Error(`${t} is a ${a.t}; insert needs a sibling action`);let d=a.action,p=pt(e),l={type:ci("type",o,qt,Tn),content:i};if(e.version===4&&(l.action_id=No("ac",new Set(e.actions.keys()))),o==="dialogue"||o==="inner_thought"){if(!r)throw new Error(`a ${o} needs a speaker`);l.speaker=fp(e,r),s!==void 0&&pa(e,l,s)}else if(r||s)throw new Error(`a ${o} takes neither speaker nor paren`);c!==void 0&&(l.extend=c);let f=d.scene.raw.actions,u=f.indexOf(d.raw)+(n==="before"?0:1);return f.splice(u,0,l),F("insert",`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor}`),be(e),`${l.action_id??`${d.scene.anchor}#${u}`} ${n} ${d.anchor} ${ua(l)}`+Be(e,p)}function um(e,t,n,o="after"){let i=Te(e,t);if(i.t!=="action")throw new Error(`${t} is a ${i.t}; move targets one action`);let r=Te(e,n);if(r.t!=="action")throw new Error(`${n} is a ${r.t}; move --to takes a sibling action`);if(i.action===r.action)throw new Error(`${t} cannot move relative to itself`);let s=pt(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),F("move",`${i.action.scene.anchor} -> ${r.action.scene.anchor}, identity ${i.action.anchor} preserved`),be(e),`${i.action.anchor} ${o} ${r.action.anchor} (${i.action.scene.anchor} -> ${r.action.scene.anchor})`+Be(e,s)}function pa(e,t,n){let o=e.version===4?"parenthetical":"emotion";n===null?delete t[o]:t[o]=n}function fm(e,t){if(t===null){e.extend&&delete e.extend.timestamp;return}let n;try{n=fo(t).canonical}catch(o){throw o instanceof et?new Error(`${o.message} (got ${JSON.stringify(t)})`):o}e.extend={...e.extend??{},timestamp:n}}function fp(e,t){let n=e.assets.find(a=>a.name===t||a.aliases.includes(t)),[o,i]=n?[t,void 0]:V5(t,"\xB7"),r=E5[o];if(r)return i?{kind:r,label:i}:{kind:r};let s=Te(e,o);if(s.t!=="asset"||s.asset.kind!=="actor")throw new Error(`Not an actor: ${t}`);let c={actor_id:s.asset.id};if(i){let a=s.asset.states.find(d=>d.name===i||d.id===i);if(!a)throw new Error(`Unknown state "${i}" on ${s.asset.name}`);c.state_id=a.id}return c}function V5(e,t){let n=e.indexOf(t);return n<0?[e,void 0]:[e.slice(0,n),e.slice(n+t.length)]}function ua(e){return Yr(String(e.content??""),40)}function mm(e,t,n,o={}){let i=Mo(structuredClone(e.raw)),r=$5(i,t,n,o);return e.raw=i.raw,be(e),r}function $5(e,t,n,o){if(t==="+"||Number(t)===e.episodes.length+1){let r={scenes:[]};return e.version===4&&(r.episode_id=No("ep",new Set(e.eps.keys()))),e.raw.episodes.push(r),F("write",`appending episode ${e.episodes.length+1}`),sm(e,r,e.episodes.length+1,n,o,!0)}let i=Te(e,t);if(i.t==="scene")return D5(e,i.scene,n,o);if(i.t==="ep")return sm(e,i.ep.raw,i.ep.no,n,o,!1);throw new Error(`write targets a scene or an episode (got ${i.t})`)}function D5(e,t,n,o){let i=pt(e),r=hm(e,t.raw,t,n,new Set(e.actions.keys()),o);return be(e),gm(t.anchor,r)+Be(e,i)}function gm(e,t){return`${e}: ${t.total} actions (${t.kept} kept, ${t.created} new, ${t.dropped.length} deleted)`+(t.dropped.length?`
183
183
  deleted: ${t.dropped.map(n=>`${n.anchor} ${ua(n.raw)}`).join(`
184
184
  `)}`:"")}function hm(e,t,n,o,i,r,s,c){let a=x5(e),{head:d,meta:p,body:l}=nm(o.split(`
package/dist/cli.js CHANGED
@@ -1 +1 @@
1
- import{a,b}from"./chunk-BJXWAWKW.js";export{a as buildProgram,b as main};
1
+ import{a,b}from"./chunk-FPG54CMI.js";export{a as buildProgram,b as main};