@gitruck/cli 1.0.7 → 1.0.8
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/README.en.md +679 -678
- package/README.md +697 -696
- package/dist/index.js +125 -125
- package/package.json +1 -1
- package/skills/gtrk-matrix/SKILL.md +423 -401
- package/skills/gtrk-narration/SKILL.md +41 -4
package/dist/index.js
CHANGED
|
@@ -1,87 +1,87 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createRequire as
|
|
3
|
-
`).replace(/^/gm," ".repeat(2))}let K=[`Usage: ${Q.commandUsage(Z)}`,""],G=Q.commandDescription(Z);if(G.length>0)K=K.concat([Q.wrap(G,J,0),""]);let $=Q.visibleArguments(Z).map((
|
|
4
|
-
`)}padWidth(Z,Q){return Math.max(Q.longestOptionTermLength(Z,Q),Q.longestGlobalOptionTermLength(Z,Q),Q.longestSubcommandTermLength(Z,Q),Q.longestArgumentTermLength(Z,Q))}wrap(Z,Q,Y,J=40){let X=new RegExp(`[\\n][${" \\f\\t\\v - \uFEFF"}]+`);if(Z.match(X))return Z;let
|
|
2
|
+
import{createRequire as s$}from"node:module";var d$=Object.create;var{getPrototypeOf:n$,defineProperty:NY,getOwnPropertyNames:p$}=Object;var i$=Object.prototype.hasOwnProperty;function o$(Z){return this[Z]}var r$,a$,V6=(Z,Q,Y)=>{var J=Z!=null&&typeof Z==="object";if(J){var z=Q?r$??=new WeakMap:a$??=new WeakMap,X=z.get(Z);if(X)return X}Y=Z!=null?d$(n$(Z)):{};let W=Q||!Z||!Z.__esModule?NY(Y,"default",{value:Z,enumerable:!0}):Y;for(let V of p$(Z))if(!i$.call(W,V))NY(W,V,{get:o$.bind(Z,V),enumerable:!0});if(J)z.set(Z,W);return W};var B0=(Z,Q)=>()=>(Q||Z((Q={exports:{}}).exports,Q),Q.exports);var j0=s$(import.meta.url);var a9=B0((t$)=>{class s1 extends Error{constructor(Z,Q,Y){super(Y);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=Q,this.exitCode=Z,this.nestedError=void 0}}class BY extends s1{constructor(Z){super(1,"commander.invalidArgument",Z);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}t$.CommanderError=s1;t$.InvalidArgumentError=BY});var K6=B0((JH)=>{var{InvalidArgumentError:QH}=a9();class jY{constructor(Z,Q){switch(this.description=Q||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,Z[0]){case"<":this.required=!0,this._name=Z.slice(1,-1);break;case"[":this.required=!1,this._name=Z.slice(1,-1);break;default:this.required=!0,this._name=Z;break}if(this._name.length>3&&this._name.slice(-3)==="...")this.variadic=!0,this._name=this._name.slice(0,-3)}name(){return this._name}_concatValue(Z,Q){if(Q===this.defaultValue||!Array.isArray(Q))return[Z];return Q.concat(Z)}default(Z,Q){return this.defaultValue=Z,this.defaultValueDescription=Q,this}argParser(Z){return this.parseArg=Z,this}choices(Z){return this.argChoices=Z.slice(),this.parseArg=(Q,Y)=>{if(!this.argChoices.includes(Q))throw new QH(`Allowed choices are ${this.argChoices.join(", ")}.`);if(this.variadic)return this._concatValue(Q,Y);return Q},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}}function YH(Z){let Q=Z.name()+(Z.variadic===!0?"...":"");return Z.required?"<"+Q+">":"["+Q+"]"}JH.Argument=jY;JH.humanReadableArgName=YH});var t1=B0((VH)=>{var{humanReadableArgName:WH}=K6();class FY{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(Z){let Q=Z.commands.filter((J)=>!J._hidden),Y=Z._getHelpCommand();if(Y&&!Y._hidden)Q.push(Y);if(this.sortSubcommands)Q.sort((J,z)=>{return J.name().localeCompare(z.name())});return Q}compareOptions(Z,Q){let Y=(J)=>{return J.short?J.short.replace(/^-/,""):J.long.replace(/^--/,"")};return Y(Z).localeCompare(Y(Q))}visibleOptions(Z){let Q=Z.options.filter((J)=>!J.hidden),Y=Z._getHelpOption();if(Y&&!Y.hidden){let J=Y.short&&Z._findOption(Y.short),z=Y.long&&Z._findOption(Y.long);if(!J&&!z)Q.push(Y);else if(Y.long&&!z)Q.push(Z.createOption(Y.long,Y.description));else if(Y.short&&!J)Q.push(Z.createOption(Y.short,Y.description))}if(this.sortOptions)Q.sort(this.compareOptions);return Q}visibleGlobalOptions(Z){if(!this.showGlobalOptions)return[];let Q=[];for(let Y=Z.parent;Y;Y=Y.parent){let J=Y.options.filter((z)=>!z.hidden);Q.push(...J)}if(this.sortOptions)Q.sort(this.compareOptions);return Q}visibleArguments(Z){if(Z._argsDescription)Z.registeredArguments.forEach((Q)=>{Q.description=Q.description||Z._argsDescription[Q.name()]||""});if(Z.registeredArguments.find((Q)=>Q.description))return Z.registeredArguments;return[]}subcommandTerm(Z){let Q=Z.registeredArguments.map((Y)=>WH(Y)).join(" ");return Z._name+(Z._aliases[0]?"|"+Z._aliases[0]:"")+(Z.options.length?" [options]":"")+(Q?" "+Q:"")}optionTerm(Z){return Z.flags}argumentTerm(Z){return Z.name()}longestSubcommandTermLength(Z,Q){return Q.visibleCommands(Z).reduce((Y,J)=>{return Math.max(Y,Q.subcommandTerm(J).length)},0)}longestOptionTermLength(Z,Q){return Q.visibleOptions(Z).reduce((Y,J)=>{return Math.max(Y,Q.optionTerm(J).length)},0)}longestGlobalOptionTermLength(Z,Q){return Q.visibleGlobalOptions(Z).reduce((Y,J)=>{return Math.max(Y,Q.optionTerm(J).length)},0)}longestArgumentTermLength(Z,Q){return Q.visibleArguments(Z).reduce((Y,J)=>{return Math.max(Y,Q.argumentTerm(J).length)},0)}commandUsage(Z){let Q=Z._name;if(Z._aliases[0])Q=Q+"|"+Z._aliases[0];let Y="";for(let J=Z.parent;J;J=J.parent)Y=J.name()+" "+Y;return Y+Q+" "+Z.usage()}commandDescription(Z){return Z.description()}subcommandDescription(Z){return Z.summary()||Z.description()}optionDescription(Z){let Q=[];if(Z.argChoices)Q.push(`choices: ${Z.argChoices.map((Y)=>JSON.stringify(Y)).join(", ")}`);if(Z.defaultValue!==void 0){if(Z.required||Z.optional||Z.isBoolean()&&typeof Z.defaultValue==="boolean")Q.push(`default: ${Z.defaultValueDescription||JSON.stringify(Z.defaultValue)}`)}if(Z.presetArg!==void 0&&Z.optional)Q.push(`preset: ${JSON.stringify(Z.presetArg)}`);if(Z.envVar!==void 0)Q.push(`env: ${Z.envVar}`);if(Q.length>0)return`${Z.description} (${Q.join(", ")})`;return Z.description}argumentDescription(Z){let Q=[];if(Z.argChoices)Q.push(`choices: ${Z.argChoices.map((Y)=>JSON.stringify(Y)).join(", ")}`);if(Z.defaultValue!==void 0)Q.push(`default: ${Z.defaultValueDescription||JSON.stringify(Z.defaultValue)}`);if(Q.length>0){let Y=`(${Q.join(", ")})`;if(Z.description)return`${Z.description} ${Y}`;return Y}return Z.description}formatHelp(Z,Q){let Y=Q.padWidth(Z,Q),J=Q.helpWidth||80,z=2,X=2;function W(q,U){if(U){let F=`${q.padEnd(Y+2)}${U}`;return Q.wrap(F,J-2,Y+2)}return q}function V(q){return q.join(`
|
|
3
|
+
`).replace(/^/gm," ".repeat(2))}let K=[`Usage: ${Q.commandUsage(Z)}`,""],G=Q.commandDescription(Z);if(G.length>0)K=K.concat([Q.wrap(G,J,0),""]);let $=Q.visibleArguments(Z).map((q)=>{return W(Q.argumentTerm(q),Q.argumentDescription(q))});if($.length>0)K=K.concat(["Arguments:",V($),""]);let H=Q.visibleOptions(Z).map((q)=>{return W(Q.optionTerm(q),Q.optionDescription(q))});if(H.length>0)K=K.concat(["Options:",V(H),""]);if(this.showGlobalOptions){let q=Q.visibleGlobalOptions(Z).map((U)=>{return W(Q.optionTerm(U),Q.optionDescription(U))});if(q.length>0)K=K.concat(["Global Options:",V(q),""])}let N=Q.visibleCommands(Z).map((q)=>{return W(Q.subcommandTerm(q),Q.subcommandDescription(q))});if(N.length>0)K=K.concat(["Commands:",V(N),""]);return K.join(`
|
|
4
|
+
`)}padWidth(Z,Q){return Math.max(Q.longestOptionTermLength(Z,Q),Q.longestGlobalOptionTermLength(Z,Q),Q.longestSubcommandTermLength(Z,Q),Q.longestArgumentTermLength(Z,Q))}wrap(Z,Q,Y,J=40){let X=new RegExp(`[\\n][${" \\f\\t\\v - \uFEFF"}]+`);if(Z.match(X))return Z;let W=Q-Y;if(W<J)return Z;let V=Z.slice(0,Y),K=Z.slice(Y).replace(`\r
|
|
5
5
|
`,`
|
|
6
6
|
`),G=" ".repeat(Y),H=`\\s${""}`,N=new RegExp(`
|
|
7
|
-
|.{1,${
|
|
8
|
-
`)return"";return(
|
|
9
|
-
`)}}
|
|
7
|
+
|.{1,${W-1}}([${H}]|$)|[^${H}]+?([${H}]|$)`,"g"),q=K.match(N)||[];return V+q.map((U,F)=>{if(U===`
|
|
8
|
+
`)return"";return(F>0?G:"")+U.trimEnd()}).join(`
|
|
9
|
+
`)}}VH.Help=FY});var e1=B0((qH)=>{var{InvalidArgumentError:GH}=a9();class MY{constructor(Z,Q){this.flags=Z,this.description=Q||"",this.required=Z.includes("<"),this.optional=Z.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(Z),this.mandatory=!1;let Y=HH(Z);if(this.short=Y.shortFlag,this.long=Y.longFlag,this.negate=!1,this.long)this.negate=this.long.startsWith("--no-");this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(Z,Q){return this.defaultValue=Z,this.defaultValueDescription=Q,this}preset(Z){return this.presetArg=Z,this}conflicts(Z){return this.conflictsWith=this.conflictsWith.concat(Z),this}implies(Z){let Q=Z;if(typeof Z==="string")Q={[Z]:!0};return this.implied=Object.assign(this.implied||{},Q),this}env(Z){return this.envVar=Z,this}argParser(Z){return this.parseArg=Z,this}makeOptionMandatory(Z=!0){return this.mandatory=!!Z,this}hideHelp(Z=!0){return this.hidden=!!Z,this}_concatValue(Z,Q){if(Q===this.defaultValue||!Array.isArray(Q))return[Z];return Q.concat(Z)}choices(Z){return this.argChoices=Z.slice(),this.parseArg=(Q,Y)=>{if(!this.argChoices.includes(Q))throw new GH(`Allowed choices are ${this.argChoices.join(", ")}.`);if(this.variadic)return this._concatValue(Q,Y);return Q},this}name(){if(this.long)return this.long.replace(/^--/,"");return this.short.replace(/^-/,"")}attributeName(){return $H(this.name().replace(/^no-/,""))}is(Z){return this.short===Z||this.long===Z}isBoolean(){return!this.required&&!this.optional&&!this.negate}}class RY{constructor(Z){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,Z.forEach((Q)=>{if(Q.negate)this.negativeOptions.set(Q.attributeName(),Q);else this.positiveOptions.set(Q.attributeName(),Q)}),this.negativeOptions.forEach((Q,Y)=>{if(this.positiveOptions.has(Y))this.dualOptions.add(Y)})}valueFromOption(Z,Q){let Y=Q.attributeName();if(!this.dualOptions.has(Y))return!0;let J=this.negativeOptions.get(Y).presetArg,z=J!==void 0?J:!1;return Q.negate===(z===Z)}}function $H(Z){return Z.split("-").reduce((Q,Y)=>{return Q+Y[0].toUpperCase()+Y.slice(1)})}function HH(Z){let Q,Y,J=Z.split(/[ |,]+/);if(J.length>1&&!/^[[<]/.test(J[1]))Q=J.shift();if(Y=J.shift(),!Q&&/^-[^-]$/.test(Y))Q=Y,Y=void 0;return{shortFlag:Q,longFlag:Y}}qH.Option=MY;qH.DualOptions=RY});var DY=B0((FH)=>{function BH(Z,Q){if(Math.abs(Z.length-Q.length)>3)return Math.max(Z.length,Q.length);let Y=[];for(let J=0;J<=Z.length;J++)Y[J]=[J];for(let J=0;J<=Q.length;J++)Y[0][J]=J;for(let J=1;J<=Q.length;J++)for(let z=1;z<=Z.length;z++){let X=1;if(Z[z-1]===Q[J-1])X=0;else X=1;if(Y[z][J]=Math.min(Y[z-1][J]+1,Y[z][J-1]+1,Y[z-1][J-1]+X),z>1&&J>1&&Z[z-1]===Q[J-2]&&Z[z-2]===Q[J-1])Y[z][J]=Math.min(Y[z][J],Y[z-2][J-2]+1)}return Y[Z.length][Q.length]}function jH(Z,Q){if(!Q||Q.length===0)return"";Q=Array.from(new Set(Q));let Y=Z.startsWith("--");if(Y)Z=Z.slice(2),Q=Q.map((W)=>W.slice(2));let J=[],z=3,X=0.4;if(Q.forEach((W)=>{if(W.length<=1)return;let V=BH(Z,W),K=Math.max(Z.length,W.length);if((K-V)/K>X){if(V<z)z=V,J=[W];else if(V===z)J.push(W)}}),J.sort((W,V)=>W.localeCompare(V)),Y)J=J.map((W)=>`--${W}`);if(J.length>1)return`
|
|
10
10
|
(Did you mean one of ${J.join(", ")}?)`;if(J.length===1)return`
|
|
11
|
-
(Did you mean ${J[0]}?)`;return""}
|
|
12
|
-
- specify the name in Command constructor or using .name()`);if(Q=Q||{},Q.isDefault)this._defaultCommandName=Z._name;if(Q.noHelp||Q.hidden)Z._hidden=!0;return this._registerCommand(Z),Z.parent=this,Z._checkForBrokenPassThrough(),this}createArgument(Z,Q){return new
|
|
13
|
-
Expecting one of '${Y.join("', '")}'`);if(this._lifeCycleHooks[Z])this._lifeCycleHooks[Z].push(Q);else this._lifeCycleHooks[Z]=[Q];return this}exitOverride(Z){if(Z)this._exitCallback=Z;else this._exitCallback=(Q)=>{if(Q.code!=="commander.executeSubCommandAsync")throw Q};return this}_exit(Z,Q,Y){if(this._exitCallback)this._exitCallback(new
|
|
14
|
-
- already used by option '${Q.flags}'`)}this.options.push(Z)}_registerCommand(Z){let Q=(J)=>{return[J.name()].concat(J.aliases())},Y=Q(Z).find((J)=>this._findCommand(J));if(Y){let J=Q(this._findCommand(Y)).join("|"),z=Q(Z).join("|");throw Error(`cannot add command '${z}' as already have command '${J}'`)}this.commands.push(Z)}addOption(Z){this._registerOption(Z);let Q=Z.name(),Y=Z.attributeName();if(Z.negate){let z=Z.long.replace(/^--no-/,"--");if(!this._findOption(z))this.setOptionValueWithSource(Y,Z.defaultValue===void 0?!0:Z.defaultValue,"default")}else if(Z.defaultValue!==void 0)this.setOptionValueWithSource(Y,Z.defaultValue,"default");let J=(z,X,
|
|
11
|
+
(Did you mean ${J[0]}?)`;return""}FH.suggestSimilar=jH});var CY=B0((CH)=>{var RH=j0("node:events").EventEmitter,Z5=j0("node:child_process"),n8=j0("node:path"),Q5=j0("node:fs"),_Z=j0("node:process"),{Argument:DH,humanReadableArgName:PH}=K6(),{CommanderError:Y5}=a9(),{Help:OH}=t1(),{Option:PY,DualOptions:LH}=e1(),{suggestSimilar:OY}=DY();class J5 extends RH{constructor(Z){super();this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=Z||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:(Q)=>_Z.stdout.write(Q),writeErr:(Q)=>_Z.stderr.write(Q),getOutHelpWidth:()=>_Z.stdout.isTTY?_Z.stdout.columns:void 0,getErrHelpWidth:()=>_Z.stderr.isTTY?_Z.stderr.columns:void 0,outputError:(Q,Y)=>Y(Q)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(Z){return this._outputConfiguration=Z._outputConfiguration,this._helpOption=Z._helpOption,this._helpCommand=Z._helpCommand,this._helpConfiguration=Z._helpConfiguration,this._exitCallback=Z._exitCallback,this._storeOptionsAsProperties=Z._storeOptionsAsProperties,this._combineFlagAndOptionalValue=Z._combineFlagAndOptionalValue,this._allowExcessArguments=Z._allowExcessArguments,this._enablePositionalOptions=Z._enablePositionalOptions,this._showHelpAfterError=Z._showHelpAfterError,this._showSuggestionAfterError=Z._showSuggestionAfterError,this}_getCommandAndAncestors(){let Z=[];for(let Q=this;Q;Q=Q.parent)Z.push(Q);return Z}command(Z,Q,Y){let J=Q,z=Y;if(typeof J==="object"&&J!==null)z=J,J=null;z=z||{};let[,X,W]=Z.match(/([^ ]+) *(.*)/),V=this.createCommand(X);if(J)V.description(J),V._executableHandler=!0;if(z.isDefault)this._defaultCommandName=V._name;if(V._hidden=!!(z.noHelp||z.hidden),V._executableFile=z.executableFile||null,W)V.arguments(W);if(this._registerCommand(V),V.parent=this,V.copyInheritedSettings(this),J)return this;return V}createCommand(Z){return new J5(Z)}createHelp(){return Object.assign(new OH,this.configureHelp())}configureHelp(Z){if(Z===void 0)return this._helpConfiguration;return this._helpConfiguration=Z,this}configureOutput(Z){if(Z===void 0)return this._outputConfiguration;return Object.assign(this._outputConfiguration,Z),this}showHelpAfterError(Z=!0){if(typeof Z!=="string")Z=!!Z;return this._showHelpAfterError=Z,this}showSuggestionAfterError(Z=!0){return this._showSuggestionAfterError=!!Z,this}addCommand(Z,Q){if(!Z._name)throw Error(`Command passed to .addCommand() must have a name
|
|
12
|
+
- specify the name in Command constructor or using .name()`);if(Q=Q||{},Q.isDefault)this._defaultCommandName=Z._name;if(Q.noHelp||Q.hidden)Z._hidden=!0;return this._registerCommand(Z),Z.parent=this,Z._checkForBrokenPassThrough(),this}createArgument(Z,Q){return new DH(Z,Q)}argument(Z,Q,Y,J){let z=this.createArgument(Z,Q);if(typeof Y==="function")z.default(J).argParser(Y);else z.default(Y);return this.addArgument(z),this}arguments(Z){return Z.trim().split(/ +/).forEach((Q)=>{this.argument(Q)}),this}addArgument(Z){let Q=this.registeredArguments.slice(-1)[0];if(Q&&Q.variadic)throw Error(`only the last argument can be variadic '${Q.name()}'`);if(Z.required&&Z.defaultValue!==void 0&&Z.parseArg===void 0)throw Error(`a default value for a required argument is never used: '${Z.name()}'`);return this.registeredArguments.push(Z),this}helpCommand(Z,Q){if(typeof Z==="boolean")return this._addImplicitHelpCommand=Z,this;Z=Z??"help [command]";let[,Y,J]=Z.match(/([^ ]+) *(.*)/),z=Q??"display help for command",X=this.createCommand(Y);if(X.helpOption(!1),J)X.arguments(J);if(z)X.description(z);return this._addImplicitHelpCommand=!0,this._helpCommand=X,this}addHelpCommand(Z,Q){if(typeof Z!=="object")return this.helpCommand(Z,Q),this;return this._addImplicitHelpCommand=!0,this._helpCommand=Z,this}_getHelpCommand(){if(this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))){if(this._helpCommand===void 0)this.helpCommand(void 0,void 0);return this._helpCommand}return null}hook(Z,Q){let Y=["preSubcommand","preAction","postAction"];if(!Y.includes(Z))throw Error(`Unexpected value for event passed to hook : '${Z}'.
|
|
13
|
+
Expecting one of '${Y.join("', '")}'`);if(this._lifeCycleHooks[Z])this._lifeCycleHooks[Z].push(Q);else this._lifeCycleHooks[Z]=[Q];return this}exitOverride(Z){if(Z)this._exitCallback=Z;else this._exitCallback=(Q)=>{if(Q.code!=="commander.executeSubCommandAsync")throw Q};return this}_exit(Z,Q,Y){if(this._exitCallback)this._exitCallback(new Y5(Z,Q,Y));_Z.exit(Z)}action(Z){let Q=(Y)=>{let J=this.registeredArguments.length,z=Y.slice(0,J);if(this._storeOptionsAsProperties)z[J]=this;else z[J]=this.opts();return z.push(this),Z.apply(this,z)};return this._actionHandler=Q,this}createOption(Z,Q){return new PY(Z,Q)}_callParseArg(Z,Q,Y,J){try{return Z.parseArg(Q,Y)}catch(z){if(z.code==="commander.invalidArgument"){let X=`${J} ${z.message}`;this.error(X,{exitCode:z.exitCode,code:z.code})}throw z}}_registerOption(Z){let Q=Z.short&&this._findOption(Z.short)||Z.long&&this._findOption(Z.long);if(Q){let Y=Z.long&&this._findOption(Z.long)?Z.long:Z.short;throw Error(`Cannot add option '${Z.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${Y}'
|
|
14
|
+
- already used by option '${Q.flags}'`)}this.options.push(Z)}_registerCommand(Z){let Q=(J)=>{return[J.name()].concat(J.aliases())},Y=Q(Z).find((J)=>this._findCommand(J));if(Y){let J=Q(this._findCommand(Y)).join("|"),z=Q(Z).join("|");throw Error(`cannot add command '${z}' as already have command '${J}'`)}this.commands.push(Z)}addOption(Z){this._registerOption(Z);let Q=Z.name(),Y=Z.attributeName();if(Z.negate){let z=Z.long.replace(/^--no-/,"--");if(!this._findOption(z))this.setOptionValueWithSource(Y,Z.defaultValue===void 0?!0:Z.defaultValue,"default")}else if(Z.defaultValue!==void 0)this.setOptionValueWithSource(Y,Z.defaultValue,"default");let J=(z,X,W)=>{if(z==null&&Z.presetArg!==void 0)z=Z.presetArg;let V=this.getOptionValue(Y);if(z!==null&&Z.parseArg)z=this._callParseArg(Z,z,V,X);else if(z!==null&&Z.variadic)z=Z._concatValue(z,V);if(z==null)if(Z.negate)z=!1;else if(Z.isBoolean()||Z.optional)z=!0;else z="";this.setOptionValueWithSource(Y,z,W)};if(this.on("option:"+Q,(z)=>{let X=`error: option '${Z.flags}' argument '${z}' is invalid.`;J(z,X,"cli")}),Z.envVar)this.on("optionEnv:"+Q,(z)=>{let X=`error: option '${Z.flags}' value '${z}' from env '${Z.envVar}' is invalid.`;J(z,X,"env")});return this}_optionEx(Z,Q,Y,J,z){if(typeof Q==="object"&&Q instanceof PY)throw Error("To add an Option object use addOption() instead of option() or requiredOption()");let X=this.createOption(Q,Y);if(X.makeOptionMandatory(!!Z.mandatory),typeof J==="function")X.default(z).argParser(J);else if(J instanceof RegExp){let W=J;J=(V,K)=>{let G=W.exec(V);return G?G[0]:K},X.default(z).argParser(J)}else X.default(J);return this.addOption(X)}option(Z,Q,Y,J){return this._optionEx({},Z,Q,Y,J)}requiredOption(Z,Q,Y,J){return this._optionEx({mandatory:!0},Z,Q,Y,J)}combineFlagAndOptionalValue(Z=!0){return this._combineFlagAndOptionalValue=!!Z,this}allowUnknownOption(Z=!0){return this._allowUnknownOption=!!Z,this}allowExcessArguments(Z=!0){return this._allowExcessArguments=!!Z,this}enablePositionalOptions(Z=!0){return this._enablePositionalOptions=!!Z,this}passThroughOptions(Z=!0){return this._passThroughOptions=!!Z,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(Z=!0){if(this.options.length)throw Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!Z,this}getOptionValue(Z){if(this._storeOptionsAsProperties)return this[Z];return this._optionValues[Z]}setOptionValue(Z,Q){return this.setOptionValueWithSource(Z,Q,void 0)}setOptionValueWithSource(Z,Q,Y){if(this._storeOptionsAsProperties)this[Z]=Q;else this._optionValues[Z]=Q;return this._optionValueSources[Z]=Y,this}getOptionValueSource(Z){return this._optionValueSources[Z]}getOptionValueSourceWithGlobals(Z){let Q;return this._getCommandAndAncestors().forEach((Y)=>{if(Y.getOptionValueSource(Z)!==void 0)Q=Y.getOptionValueSource(Z)}),Q}_prepareUserArgs(Z,Q){if(Z!==void 0&&!Array.isArray(Z))throw Error("first parameter to parse must be array or undefined");if(Q=Q||{},Z===void 0&&Q.from===void 0){if(_Z.versions?.electron)Q.from="electron";let J=_Z.execArgv??[];if(J.includes("-e")||J.includes("--eval")||J.includes("-p")||J.includes("--print"))Q.from="eval"}if(Z===void 0)Z=_Z.argv;this.rawArgs=Z.slice();let Y;switch(Q.from){case void 0:case"node":this._scriptPath=Z[1],Y=Z.slice(2);break;case"electron":if(_Z.defaultApp)this._scriptPath=Z[1],Y=Z.slice(2);else Y=Z.slice(1);break;case"user":Y=Z.slice(0);break;case"eval":Y=Z.slice(1);break;default:throw Error(`unexpected parse option { from: '${Q.from}' }`)}if(!this._name&&this._scriptPath)this.nameFromFilename(this._scriptPath);return this._name=this._name||"program",Y}parse(Z,Q){let Y=this._prepareUserArgs(Z,Q);return this._parseCommand([],Y),this}async parseAsync(Z,Q){let Y=this._prepareUserArgs(Z,Q);return await this._parseCommand([],Y),this}_executeSubCommand(Z,Q){Q=Q.slice();let Y=!1,J=[".js",".ts",".tsx",".mjs",".cjs"];function z(G,$){let H=n8.resolve(G,$);if(Q5.existsSync(H))return H;if(J.includes(n8.extname($)))return;let N=J.find((q)=>Q5.existsSync(`${H}${q}`));if(N)return`${H}${N}`;return}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let X=Z._executableFile||`${this._name}-${Z._name}`,W=this._executableDir||"";if(this._scriptPath){let G;try{G=Q5.realpathSync(this._scriptPath)}catch($){G=this._scriptPath}W=n8.resolve(n8.dirname(G),W)}if(W){let G=z(W,X);if(!G&&!Z._executableFile&&this._scriptPath){let $=n8.basename(this._scriptPath,n8.extname(this._scriptPath));if($!==this._name)G=z(W,`${$}-${Z._name}`)}X=G||X}Y=J.includes(n8.extname(X));let V;if(_Z.platform!=="win32")if(Y)Q.unshift(X),Q=LY(_Z.execArgv).concat(Q),V=Z5.spawn(_Z.argv[0],Q,{stdio:"inherit"});else V=Z5.spawn(X,Q,{stdio:"inherit"});else Q.unshift(X),Q=LY(_Z.execArgv).concat(Q),V=Z5.spawn(_Z.execPath,Q,{stdio:"inherit"});if(!V.killed)["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(($)=>{_Z.on($,()=>{if(V.killed===!1&&V.exitCode===null)V.kill($)})});let K=this._exitCallback;V.on("close",(G)=>{if(G=G??1,!K)_Z.exit(G);else K(new Y5(G,"commander.executeSubCommandAsync","(close)"))}),V.on("error",(G)=>{if(G.code==="ENOENT"){let $=W?`searched for local subcommand relative to directory '${W}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",H=`'${X}' does not exist
|
|
15
15
|
- if '${Z._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
|
|
16
16
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
17
|
-
- ${$}`;throw Error(H)}else if(G.code==="EACCES")throw Error(`'${X}' not executable`);if(!K)
|
|
17
|
+
- ${$}`;throw Error(H)}else if(G.code==="EACCES")throw Error(`'${X}' not executable`);if(!K)_Z.exit(1);else{let $=new Y5(1,"commander.executeSubCommandAsync","(error)");$.nestedError=G,K($)}}),this.runningCommand=V}_dispatchSubcommand(Z,Q,Y){let J=this._findCommand(Z);if(!J)this.help({error:!0});let z;return z=this._chainOrCallSubCommandHook(z,J,"preSubcommand"),z=this._chainOrCall(z,()=>{if(J._executableHandler)this._executeSubCommand(J,Q.concat(Y));else return J._parseCommand(Q,Y)}),z}_dispatchHelpCommand(Z){if(!Z)this.help();let Q=this._findCommand(Z);if(Q&&!Q._executableHandler)Q.help();return this._dispatchSubcommand(Z,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){if(this.registeredArguments.forEach((Z,Q)=>{if(Z.required&&this.args[Q]==null)this.missingArgument(Z.name())}),this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)return;if(this.args.length>this.registeredArguments.length)this._excessArguments(this.args)}_processArguments(){let Z=(Y,J,z)=>{let X=J;if(J!==null&&Y.parseArg){let W=`error: command-argument value '${J}' is invalid for argument '${Y.name()}'.`;X=this._callParseArg(Y,J,z,W)}return X};this._checkNumberOfArguments();let Q=[];this.registeredArguments.forEach((Y,J)=>{let z=Y.defaultValue;if(Y.variadic){if(J<this.args.length){if(z=this.args.slice(J),Y.parseArg)z=z.reduce((X,W)=>{return Z(Y,W,X)},Y.defaultValue)}else if(z===void 0)z=[]}else if(J<this.args.length){if(z=this.args[J],Y.parseArg)z=Z(Y,z,Y.defaultValue)}Q[J]=z}),this.processedArgs=Q}_chainOrCall(Z,Q){if(Z&&Z.then&&typeof Z.then==="function")return Z.then(()=>Q());return Q()}_chainOrCallHooks(Z,Q){let Y=Z,J=[];if(this._getCommandAndAncestors().reverse().filter((z)=>z._lifeCycleHooks[Q]!==void 0).forEach((z)=>{z._lifeCycleHooks[Q].forEach((X)=>{J.push({hookedCommand:z,callback:X})})}),Q==="postAction")J.reverse();return J.forEach((z)=>{Y=this._chainOrCall(Y,()=>{return z.callback(z.hookedCommand,this)})}),Y}_chainOrCallSubCommandHook(Z,Q,Y){let J=Z;if(this._lifeCycleHooks[Y]!==void 0)this._lifeCycleHooks[Y].forEach((z)=>{J=this._chainOrCall(J,()=>{return z(this,Q)})});return J}_parseCommand(Z,Q){let Y=this.parseOptions(Q);if(this._parseOptionsEnv(),this._parseOptionsImplied(),Z=Z.concat(Y.operands),Q=Y.unknown,this.args=Z.concat(Q),Z&&this._findCommand(Z[0]))return this._dispatchSubcommand(Z[0],Z.slice(1),Q);if(this._getHelpCommand()&&Z[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(Z[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(Q),this._dispatchSubcommand(this._defaultCommandName,Z,Q);if(this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName)this.help({error:!0});this._outputHelpIfRequested(Y.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let J=()=>{if(Y.unknown.length>0)this.unknownOption(Y.unknown[0])},z=`command:${this.name()}`;if(this._actionHandler){J(),this._processArguments();let X;if(X=this._chainOrCallHooks(X,"preAction"),X=this._chainOrCall(X,()=>this._actionHandler(this.processedArgs)),this.parent)X=this._chainOrCall(X,()=>{this.parent.emit(z,Z,Q)});return X=this._chainOrCallHooks(X,"postAction"),X}if(this.parent&&this.parent.listenerCount(z))J(),this._processArguments(),this.parent.emit(z,Z,Q);else if(Z.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",Z,Q);if(this.listenerCount("command:*"))this.emit("command:*",Z,Q);else if(this.commands.length)this.unknownCommand();else J(),this._processArguments()}else if(this.commands.length)J(),this.help({error:!0});else J(),this._processArguments()}_findCommand(Z){if(!Z)return;return this.commands.find((Q)=>Q._name===Z||Q._aliases.includes(Z))}_findOption(Z){return this.options.find((Q)=>Q.is(Z))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach((Z)=>{Z.options.forEach((Q)=>{if(Q.mandatory&&Z.getOptionValue(Q.attributeName())===void 0)Z.missingMandatoryOptionValue(Q)})})}_checkForConflictingLocalOptions(){let Z=this.options.filter((Y)=>{let J=Y.attributeName();if(this.getOptionValue(J)===void 0)return!1;return this.getOptionValueSource(J)!=="default"});Z.filter((Y)=>Y.conflictsWith.length>0).forEach((Y)=>{let J=Z.find((z)=>Y.conflictsWith.includes(z.attributeName()));if(J)this._conflictingOption(Y,J)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach((Z)=>{Z._checkForConflictingLocalOptions()})}parseOptions(Z){let Q=[],Y=[],J=Q,z=Z.slice();function X(V){return V.length>1&&V[0]==="-"}let W=null;while(z.length){let V=z.shift();if(V==="--"){if(J===Y)J.push(V);J.push(...z);break}if(W&&!X(V)){this.emit(`option:${W.name()}`,V);continue}if(W=null,X(V)){let K=this._findOption(V);if(K){if(K.required){let G=z.shift();if(G===void 0)this.optionMissingArgument(K);this.emit(`option:${K.name()}`,G)}else if(K.optional){let G=null;if(z.length>0&&!X(z[0]))G=z.shift();this.emit(`option:${K.name()}`,G)}else this.emit(`option:${K.name()}`);W=K.variadic?K:null;continue}}if(V.length>2&&V[0]==="-"&&V[1]!=="-"){let K=this._findOption(`-${V[1]}`);if(K){if(K.required||K.optional&&this._combineFlagAndOptionalValue)this.emit(`option:${K.name()}`,V.slice(2));else this.emit(`option:${K.name()}`),z.unshift(`-${V.slice(2)}`);continue}}if(/^--[^=]+=/.test(V)){let K=V.indexOf("="),G=this._findOption(V.slice(0,K));if(G&&(G.required||G.optional)){this.emit(`option:${G.name()}`,V.slice(K+1));continue}}if(X(V))J=Y;if((this._enablePositionalOptions||this._passThroughOptions)&&Q.length===0&&Y.length===0){if(this._findCommand(V)){if(Q.push(V),z.length>0)Y.push(...z);break}else if(this._getHelpCommand()&&V===this._getHelpCommand().name()){if(Q.push(V),z.length>0)Q.push(...z);break}else if(this._defaultCommandName){if(Y.push(V),z.length>0)Y.push(...z);break}}if(this._passThroughOptions){if(J.push(V),z.length>0)J.push(...z);break}J.push(V)}return{operands:Q,unknown:Y}}opts(){if(this._storeOptionsAsProperties){let Z={},Q=this.options.length;for(let Y=0;Y<Q;Y++){let J=this.options[Y].attributeName();Z[J]=J===this._versionOptionName?this._version:this[J]}return Z}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((Z,Q)=>Object.assign(Z,Q.opts()),{})}error(Z,Q){if(this._outputConfiguration.outputError(`${Z}
|
|
18
18
|
`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==="string")this._outputConfiguration.writeErr(`${this._showHelpAfterError}
|
|
19
19
|
`);else if(this._showHelpAfterError)this._outputConfiguration.writeErr(`
|
|
20
|
-
`),this.outputHelp({error:!0});let Y=Q||{},J=Y.exitCode||1,z=Y.code||"commander.error";this._exit(J,z,Z)}_parseOptionsEnv(){this.options.forEach((Z)=>{if(Z.envVar&&Z.envVar in
|
|
21
|
-
`),this._exit(0,"commander.version",Z)}),this}description(Z,Q){if(Z===void 0&&Q===void 0)return this._description;if(this._description=Z,Q)this._argsDescription=Q;return this}summary(Z){if(Z===void 0)return this._summary;return this._summary=Z,this}alias(Z){if(Z===void 0)return this._aliases[0];let Q=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)Q=this.commands[this.commands.length-1];if(Z===Q._name)throw Error("Command alias can't be the same as its name");let Y=this.parent?._findCommand(Z);if(Y){let J=[Y.name()].concat(Y.aliases()).join("|");throw Error(`cannot add alias '${Z}' to command '${this.name()}' as already have command '${J}'`)}return Q._aliases.push(Z),this}aliases(Z){if(Z===void 0)return this._aliases;return Z.forEach((Q)=>this.alias(Q)),this}usage(Z){if(Z===void 0){if(this._usage)return this._usage;let Q=this.registeredArguments.map((Y)=>{return
|
|
20
|
+
`),this.outputHelp({error:!0});let Y=Q||{},J=Y.exitCode||1,z=Y.code||"commander.error";this._exit(J,z,Z)}_parseOptionsEnv(){this.options.forEach((Z)=>{if(Z.envVar&&Z.envVar in _Z.env){let Q=Z.attributeName();if(this.getOptionValue(Q)===void 0||["default","config","env"].includes(this.getOptionValueSource(Q)))if(Z.required||Z.optional)this.emit(`optionEnv:${Z.name()}`,_Z.env[Z.envVar]);else this.emit(`optionEnv:${Z.name()}`)}})}_parseOptionsImplied(){let Z=new LH(this.options),Q=(Y)=>{return this.getOptionValue(Y)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(Y))};this.options.filter((Y)=>Y.implied!==void 0&&Q(Y.attributeName())&&Z.valueFromOption(this.getOptionValue(Y.attributeName()),Y)).forEach((Y)=>{Object.keys(Y.implied).filter((J)=>!Q(J)).forEach((J)=>{this.setOptionValueWithSource(J,Y.implied[J],"implied")})})}missingArgument(Z){let Q=`error: missing required argument '${Z}'`;this.error(Q,{code:"commander.missingArgument"})}optionMissingArgument(Z){let Q=`error: option '${Z.flags}' argument missing`;this.error(Q,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(Z){let Q=`error: required option '${Z.flags}' not specified`;this.error(Q,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(Z,Q){let Y=(X)=>{let W=X.attributeName(),V=this.getOptionValue(W),K=this.options.find(($)=>$.negate&&W===$.attributeName()),G=this.options.find(($)=>!$.negate&&W===$.attributeName());if(K&&(K.presetArg===void 0&&V===!1||K.presetArg!==void 0&&V===K.presetArg))return K;return G||X},J=(X)=>{let W=Y(X),V=W.attributeName();if(this.getOptionValueSource(V)==="env")return`environment variable '${W.envVar}'`;return`option '${W.flags}'`},z=`error: ${J(Z)} cannot be used with ${J(Q)}`;this.error(z,{code:"commander.conflictingOption"})}unknownOption(Z){if(this._allowUnknownOption)return;let Q="";if(Z.startsWith("--")&&this._showSuggestionAfterError){let J=[],z=this;do{let X=z.createHelp().visibleOptions(z).filter((W)=>W.long).map((W)=>W.long);J=J.concat(X),z=z.parent}while(z&&!z._enablePositionalOptions);Q=OY(Z,J)}let Y=`error: unknown option '${Z}'${Q}`;this.error(Y,{code:"commander.unknownOption"})}_excessArguments(Z){if(this._allowExcessArguments)return;let Q=this.registeredArguments.length,Y=Q===1?"":"s",z=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${Q} argument${Y} but got ${Z.length}.`;this.error(z,{code:"commander.excessArguments"})}unknownCommand(){let Z=this.args[0],Q="";if(this._showSuggestionAfterError){let J=[];this.createHelp().visibleCommands(this).forEach((z)=>{if(J.push(z.name()),z.alias())J.push(z.alias())}),Q=OY(Z,J)}let Y=`error: unknown command '${Z}'${Q}`;this.error(Y,{code:"commander.unknownCommand"})}version(Z,Q,Y){if(Z===void 0)return this._version;this._version=Z,Q=Q||"-V, --version",Y=Y||"output the version number";let J=this.createOption(Q,Y);return this._versionOptionName=J.attributeName(),this._registerOption(J),this.on("option:"+J.name(),()=>{this._outputConfiguration.writeOut(`${Z}
|
|
21
|
+
`),this._exit(0,"commander.version",Z)}),this}description(Z,Q){if(Z===void 0&&Q===void 0)return this._description;if(this._description=Z,Q)this._argsDescription=Q;return this}summary(Z){if(Z===void 0)return this._summary;return this._summary=Z,this}alias(Z){if(Z===void 0)return this._aliases[0];let Q=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)Q=this.commands[this.commands.length-1];if(Z===Q._name)throw Error("Command alias can't be the same as its name");let Y=this.parent?._findCommand(Z);if(Y){let J=[Y.name()].concat(Y.aliases()).join("|");throw Error(`cannot add alias '${Z}' to command '${this.name()}' as already have command '${J}'`)}return Q._aliases.push(Z),this}aliases(Z){if(Z===void 0)return this._aliases;return Z.forEach((Q)=>this.alias(Q)),this}usage(Z){if(Z===void 0){if(this._usage)return this._usage;let Q=this.registeredArguments.map((Y)=>{return PH(Y)});return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?Q:[]).join(" ")}return this._usage=Z,this}name(Z){if(Z===void 0)return this._name;return this._name=Z,this}nameFromFilename(Z){return this._name=n8.basename(Z,n8.extname(Z)),this}executableDir(Z){if(Z===void 0)return this._executableDir;return this._executableDir=Z,this}helpInformation(Z){let Q=this.createHelp();if(Q.helpWidth===void 0)Q.helpWidth=Z&&Z.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth();return Q.formatHelp(this,Q)}_getHelpContext(Z){Z=Z||{};let Q={error:!!Z.error},Y;if(Q.error)Y=(J)=>this._outputConfiguration.writeErr(J);else Y=(J)=>this._outputConfiguration.writeOut(J);return Q.write=Z.write||Y,Q.command=this,Q}outputHelp(Z){let Q;if(typeof Z==="function")Q=Z,Z=void 0;let Y=this._getHelpContext(Z);this._getCommandAndAncestors().reverse().forEach((z)=>z.emit("beforeAllHelp",Y)),this.emit("beforeHelp",Y);let J=this.helpInformation(Y);if(Q){if(J=Q(J),typeof J!=="string"&&!Buffer.isBuffer(J))throw Error("outputHelp callback must return a string or a Buffer")}if(Y.write(J),this._getHelpOption()?.long)this.emit(this._getHelpOption().long);this.emit("afterHelp",Y),this._getCommandAndAncestors().forEach((z)=>z.emit("afterAllHelp",Y))}helpOption(Z,Q){if(typeof Z==="boolean"){if(Z)this._helpOption=this._helpOption??void 0;else this._helpOption=null;return this}return Z=Z??"-h, --help",Q=Q??"display help for command",this._helpOption=this.createOption(Z,Q),this}_getHelpOption(){if(this._helpOption===void 0)this.helpOption(void 0,void 0);return this._helpOption}addHelpOption(Z){return this._helpOption=Z,this}help(Z){this.outputHelp(Z);let Q=_Z.exitCode||0;if(Q===0&&Z&&typeof Z!=="function"&&Z.error)Q=1;this._exit(Q,"commander.help","(outputHelp)")}addHelpText(Z,Q){let Y=["beforeAll","before","after","afterAll"];if(!Y.includes(Z))throw Error(`Unexpected value for position to addHelpText.
|
|
22
22
|
Expecting one of '${Y.join("', '")}'`);let J=`${Z}Help`;return this.on(J,(z)=>{let X;if(typeof Q==="function")X=Q({error:z.error,command:z.command});else X=Q;if(X)z.write(`${X}
|
|
23
|
-
`)}),this}_outputHelpIfRequested(Z){let Q=this._getHelpOption();if(Q&&Z.find((J)=>Q.is(J)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function
|
|
23
|
+
`)}),this}_outputHelpIfRequested(Z){let Q=this._getHelpOption();if(Q&&Z.find((J)=>Q.is(J)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function LY(Z){return Z.map((Q)=>{if(!Q.startsWith("--inspect"))return Q;let Y,J="127.0.0.1",z="9229",X;if((X=Q.match(/^(--inspect(-brk)?)$/))!==null)Y=X[1];else if((X=Q.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(Y=X[1],/^\d+$/.test(X[3]))z=X[3];else J=X[3];else if((X=Q.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)Y=X[1],J=X[3],z=X[4];if(Y&&z!=="0")return`${Y}=${J}:${parseInt(z)+1}`;return Q})}CH.Command=J5});var EY=B0((EH)=>{var{Argument:_Y}=K6(),{Command:z5}=CY(),{CommanderError:TH,InvalidArgumentError:TY}=a9(),{Help:AH}=t1(),{Option:AY}=e1();EH.program=new z5;EH.createCommand=(Z)=>new z5(Z);EH.createOption=(Z,Q)=>new AY(Z,Q);EH.createArgument=(Z,Q)=>new _Y(Z,Q);EH.Command=z5;EH.Option=AY;EH.Argument=_Y;EH.Help=AH;EH.CommanderError=TH;EH.InvalidArgumentError=TY;EH.InvalidOptionArgumentError=TY});var k6=B0((x6,iJ)=>{/*!
|
|
24
24
|
* hash-wasm (https://www.npmjs.com/package/hash-wasm)
|
|
25
25
|
* (c) Dani Biro
|
|
26
26
|
* @license MIT
|
|
27
|
-
*/(function(Z,Q){typeof A6==="object"&&typeof uJ<"u"?Q(A6):typeof define==="function"&&define.amd?define(["exports"],Q):(Z=typeof globalThis<"u"?globalThis:Z||self,Q(Z.hashwasm={}))})(A6,function(Z){var Q="adler32",Y="AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAgUEAQECAgYOAn8BQYCJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEK6wkGBQBBgAkLCgBBAEEBNgKECAvjCAEHf0EAKAKECCIBQf//A3EhAiABQRB2IQMCQAJAIABBAUcNACACQQAtAIAJaiIBQY+AfGogASABQfD/A0sbIgEgA2oiBEEQdCIFQYCAPGogBSAEQfD/A0sbIAFyIQEMAQsCQAJAAkACQAJAIABBEEkNAEGACSEGIABBsCtJDQFBgAkhBgNAQQAhBQNAIAYgBWoiASgCACIEQf8BcSACaiICIANqIAIgBEEIdkH/AXFqIgJqIAIgBEEQdkH/AXFqIgJqIAIgBEEYdmoiAmogAiABQQRqKAIAIgRB/wFxaiICaiACIARBCHZB/wFxaiICaiACIARBEHZB/wFxaiICaiACIARBGHZqIgJqIAIgAUEIaigCACIEQf8BcWoiAmogAiAEQQh2Qf8BcWoiAmogAiAEQRB2Qf8BcWoiAmogAiAEQRh2aiIEaiAEIAFBDGooAgAiAUH/AXFqIgRqIAQgAUEIdkH/AXFqIgRqIAQgAUEQdkH/AXFqIgRqIAQgAUEYdmoiAmohAyAFQRBqIgVBsCtHDQALIANB8f8DcCEDIAJB8f8DcCECIAZBsCtqIQYgAEHQVGoiAEGvK0sNAAsgAEUNBCAAQQ9LDQEMAgsCQCAARQ0AAkACQCAAQQNxIgUNAEGACSEBIAAhBAwBCyAAQXxxIQRBACEBA0AgAiABQYAJai0AAGoiAiADaiEDIAUgAUEBaiIBRw0ACyAFQYAJaiEBCyAAQQRJDQADQCACIAEtAABqIgUgAS0AAWoiBiABLQACaiIAIAFBA2otAABqIgIgACAGIAUgA2pqamohAyABQQRqIQEgBEF8aiIEDQALCyACQY+AfGogAiACQfD/A0sbIANB8f8DcEEQdHIhAQwECwNAIAYoAgAiAUH/AXEgAmoiBCADaiAEIAFBCHZB/wFxaiIEaiAEIAFBEHZB/wFxaiIEaiAEIAFBGHZqIgRqIAQgBkEEaigCACIBQf8BcWoiBGogBCABQQh2Qf8BcWoiBGogBCABQRB2Qf8BcWoiBGogBCABQRh2aiIEaiAEIAZBCGooAgAiAUH/AXFqIgRqIAQgAUEIdkH/AXFqIgRqIAQgAUEQdkH/AXFqIgRqIAQgAUEYdmoiBGogBCAGQQxqKAIAIgFB/wFxaiIEaiAEIAFBCHZB/wFxaiIEaiAEIAFBEHZB/wFxaiIEaiAEIAFBGHZqIgJqIQMgBkEQaiEGIABBcGoiAEEPSw0ACyAARQ0BCyAAQX9qIQcCQCAAQQNxIgVFDQAgAEF8cSEAIAUhBCAGIQEDQCACIAEtAABqIgIgA2ohAyABQQFqIQEgBEF/aiIEDQALIAYgBWohBgsgB0EDSQ0AA0AgAiAGLQAAaiIBIAYtAAFqIgQgBi0AAmoiBSAGQQNqLQAAaiICIAUgBCABIANqampqIQMgBkEEaiEGIABBfGoiAA0ACwsgA0Hx/wNwIQMgAkHx/wNwIQILIAIgA0EQdHIhAQtBACABNgKECAsxAQF/QQBBACgChAgiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AoAJCwUAQYQICzsAQQBBATYChAggABACQQBBACgChAgiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AoAJCwsVAgBBgAgLBAQAAAAAQYQICwQBAAAA",J="02ddbd17",z={name:Q,data:Y,hash:J};function X(B,C,A,v){function h(u){return u instanceof A?u:new A(function(d){d(u)})}return new(A||(A=Promise))(function(u,d){function o(yZ){try{TZ(v.next(yZ))}catch(kZ){d(kZ)}}function JZ(yZ){try{TZ(v.throw(yZ))}catch(kZ){d(kZ)}}function TZ(yZ){yZ.done?u(yZ.value):h(yZ.value).then(o,JZ)}TZ((v=v.apply(B,C||[])).next())})}typeof SuppressedError==="function"&&SuppressedError;class V{constructor(){this.mutex=Promise.resolve()}lock(){let B=()=>{};return this.mutex=this.mutex.then(()=>new Promise(B)),new Promise((C)=>{B=C})}dispatch(B){return X(this,void 0,void 0,function*(){let C=yield this.lock();try{return yield Promise.resolve(B())}finally{C()}})}}var W;function K(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;return global}let G=K(),$=(W=G.Buffer)!==null&&W!==void 0?W:null,H=G.TextEncoder?new G.TextEncoder:null;function N(B,C){return String.fromCharCode(...B.subarray(0,C))}function U(B,C){return(B&15)+(B>>6|B>>3&8)<<4|(C&15)+(C>>6|C>>3&8)}function q(B,C){let A=C.length>>1;for(let v=0;v<A;v++){let h=v<<1;B[v]=U(C.charCodeAt(h),C.charCodeAt(h+1))}}function M(B,C){if(B.length!==C.length*2)return!1;for(let A=0;A<C.length;A++){let v=A<<1;if(C[A]!==U(B.charCodeAt(v),B.charCodeAt(v+1)))return!1}return!0}let F=87,R=48;function O(B,C,A){let v=0;for(let h=0;h<A;h++){let u=C[h]>>>4;B[v++]=u>9?u+F:u+R,u=C[h]&15,B[v++]=u>9?u+F:u+R}return String.fromCharCode.apply(null,B)}let P=$!==null?(B)=>{if(typeof B==="string"){let C=$.from(B,"utf8");return new Uint8Array(C.buffer,C.byteOffset,C.length)}if($.isBuffer(B))return new Uint8Array(B.buffer,B.byteOffset,B.length);if(ArrayBuffer.isView(B))return new Uint8Array(B.buffer,B.byteOffset,B.byteLength);throw Error("Invalid data type!")}:(B)=>{if(typeof B==="string")return H.encode(B);if(ArrayBuffer.isView(B))return new Uint8Array(B.buffer,B.byteOffset,B.byteLength);throw Error("Invalid data type!")},D="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",T=new Uint8Array(256);for(let B=0;B<D.length;B++)T[D.charCodeAt(B)]=B;function _(B,C=!0){let A=B.length,v=A%3,h=[],u=A-v;for(let d=0;d<u;d+=3){let o=(B[d]<<16&16711680)+(B[d+1]<<8&65280)+(B[d+2]&255),JZ=D.charAt(o>>18&63)+D.charAt(o>>12&63)+D.charAt(o>>6&63)+D.charAt(o&63);h.push(JZ)}if(v===1){let d=B[A-1],o=D.charAt(d>>2),JZ=D.charAt(d<<4&63);if(h.push(`${o}${JZ}`),C)h.push("==")}else if(v===2){let d=(B[A-2]<<8)+B[A-1],o=D.charAt(d>>10),JZ=D.charAt(d>>4&63),TZ=D.charAt(d<<2&63);if(h.push(`${o}${JZ}${TZ}`),C)h.push("=")}return h.join("")}function L(B){let C=Math.floor(B.length*0.75),A=B.length;if(B[A-1]==="="){if(C-=1,B[A-2]==="=")C-=1}return C}function I(B){let C=L(B),A=B.length,v=new Uint8Array(C),h=0;for(let u=0;u<A;u+=4){let d=T[B.charCodeAt(u)],o=T[B.charCodeAt(u+1)],JZ=T[B.charCodeAt(u+2)],TZ=T[B.charCodeAt(u+3)];v[h]=d<<2|o>>4,h+=1,v[h]=(o&15)<<4|JZ>>2,h+=1,v[h]=(JZ&3)<<6|TZ&63,h+=1}return v}let E=16384,y=4,f=new V,S=new Map;function w(B,C){return X(this,void 0,void 0,function*(){let A=null,v=null,h=!1;if(typeof WebAssembly>"u")throw Error("WebAssembly is not supported in this environment!");let u=(XZ,qZ=0)=>{v.set(XZ,qZ)},d=()=>v,o=()=>A.exports,JZ=(XZ)=>{A.exports.Hash_SetMemorySize(XZ);let qZ=A.exports.Hash_GetBuffer(),tZ=A.exports.memory.buffer;v=new Uint8Array(tZ,qZ,XZ)},TZ=()=>{return new DataView(A.exports.memory.buffer).getUint32(A.exports.STATE_SIZE,!0)},yZ=f.dispatch(()=>X(this,void 0,void 0,function*(){if(!S.has(B.name)){let qZ=I(B.data),tZ=WebAssembly.compile(qZ);S.set(B.name,tZ)}let XZ=yield S.get(B.name);A=yield WebAssembly.instantiate(XZ,{})})),kZ=()=>X(this,void 0,void 0,function*(){if(!A)yield yZ;let XZ=A.exports.Hash_GetBuffer(),qZ=A.exports.memory.buffer;v=new Uint8Array(qZ,XZ,E)}),AZ=(XZ=null)=>{h=!0,A.exports.Hash_Init(XZ)},j8=(XZ)=>{let qZ=0;while(qZ<XZ.length){let tZ=XZ.subarray(qZ,qZ+E);qZ+=tZ.length,v.set(tZ),A.exports.Hash_Update(tZ.length)}},rZ=(XZ)=>{if(!h)throw Error("update() called before init()");let qZ=P(XZ);j8(qZ)},n9=new Uint8Array(C*2),$0=(XZ,qZ=null)=>{if(!h)throw Error("digest() called before init()");if(h=!1,A.exports.Hash_Final(qZ),XZ==="binary")return v.slice(0,C);return O(n9,v,C)},C8=()=>{if(!h)throw Error("save() can only be called after init() and before digest()");let XZ=A.exports.Hash_GetState(),qZ=TZ(),tZ=A.exports.memory.buffer,h0=new Uint8Array(tZ,XZ,qZ),p9=new Uint8Array(y+qZ);return q(p9,B.hash),p9.set(h0,y),p9},H0=(XZ)=>{if(!(XZ instanceof Uint8Array))throw Error("load() expects an Uint8Array generated by save()");let qZ=A.exports.Hash_GetState(),tZ=TZ(),h0=y+tZ,p9=A.exports.memory.buffer;if(XZ.length!==h0)throw Error(`Bad state length (expected ${h0} bytes, got ${XZ.length})`);if(!M(B.hash,XZ.subarray(0,y)))throw Error("This state was written by an incompatible hash implementation");let f$=XZ.subarray(y);new Uint8Array(p9,qZ,tZ).set(f$),h=!0},W9=(XZ)=>{if(typeof XZ==="string")return XZ.length<E/4;return XZ.byteLength<E},c8=W9;switch(B.name){case"argon2":case"scrypt":c8=()=>!0;break;case"blake2b":case"blake2s":c8=(XZ,qZ)=>qZ<=512&&W9(XZ);break;case"blake3":c8=(XZ,qZ)=>qZ===0&&W9(XZ);break;case"xxhash64":case"xxhash3":case"xxhash128":case"crc64":c8=()=>!1;break}let q0=(XZ,qZ=null,tZ=null)=>{if(!c8(XZ,qZ))return AZ(qZ),rZ(XZ),$0("hex",tZ);let h0=P(XZ);return v.set(h0),A.exports.Hash_Calculate(h0.length,qZ,tZ),O(n9,v,C)};return yield kZ(),{getMemory:d,writeMemory:u,getExports:o,setMemorySize:JZ,init:AZ,update:rZ,digest:$0,save:C8,load:H0,calculate:q0,hashLength:C}})}function x(B,C,A){return X(this,void 0,void 0,function*(){let v=yield B.lock(),h=yield w(C,A);return v(),h})}let m=new V,r=null;function c(B){if(r===null)return x(m,z,4).then((C)=>{return r=C,r.calculate(B)});try{let C=r.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function g(){return w(z,4).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:4,digestSize:4};return C})}var k="argon2",l="AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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",e="e4cdc523",WZ={name:k,data:l,hash:e},vZ="blake2b",LZ="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",RZ="c6f286e6",cZ={name:vZ,data:LZ,hash:RZ};let bZ=new V,iZ=null;function wZ(B){if(!Number.isInteger(B)||B<8||B>512||B%8!==0)return Error("Invalid variant! Valid values: 8, 16, ..., 512");return null}function DZ(B,C){return B|C<<16}function y8(B,C=512,A=null){if(wZ(C))return Promise.reject(wZ(C));let v=null,h=C;if(A!==null){if(v=P(A),v.length>64)return Promise.reject(Error("Max key length is 64 bytes"));h=DZ(C,v.length)}let u=C/8;if(iZ===null||iZ.hashLength!==u)return x(bZ,cZ,u).then((d)=>{if(iZ=d,h>512)iZ.writeMemory(v);return iZ.calculate(B,h)});try{if(h>512)iZ.writeMemory(v);let d=iZ.calculate(B,h);return Promise.resolve(d)}catch(d){return Promise.reject(d)}}function L8(B=512,C=null){if(wZ(B))return Promise.reject(wZ(B));let A=null,v=B;if(C!==null){if(A=P(C),A.length>64)return Promise.reject(Error("Max key length is 64 bytes"));v=DZ(B,A.length)}let h=B/8;return w(cZ,h).then((u)=>{if(v>512)u.writeMemory(A);u.init(v);let d={init:v>512?()=>{return u.writeMemory(A),u.init(v),d}:()=>{return u.init(v),d},update:(o)=>{return u.update(o),d},digest:(o)=>u.digest(o),save:()=>u.save(),load:(o)=>{return u.load(o),d},blockSize:128,digestSize:h};return d})}function X0(B,C,A){let v=[`m=${C.memorySize}`,`t=${C.iterations}`,`p=${C.parallelism}`].join(",");return`$argon2${C.hashType}$v=19$${v}$${_(B,!1)}$${_(A,!1)}`}let GZ=new DataView(new ArrayBuffer(4));function CZ(B){return GZ.setInt32(0,B,!0),new Uint8Array(GZ.buffer)}function x8(B,C,A){return X(this,void 0,void 0,function*(){if(A<=64){let JZ=yield L8(A*8);return JZ.update(CZ(A)),JZ.update(C),JZ.digest("binary")}let v=Math.ceil(A/32)-2,h=new Uint8Array(A);B.init(),B.update(CZ(A)),B.update(C);let u=B.digest("binary");h.set(u.subarray(0,32),0);for(let JZ=1;JZ<v;JZ++)B.init(),B.update(u),u=B.digest("binary"),h.set(u.subarray(0,32),JZ*32);let d=A-32*v,o;if(d===64)o=B,o.init();else o=yield L8(d*8);return o.update(u),u=o.digest("binary"),h.set(u.subarray(0,d),v*32),h})}function m8(B){switch(B){case"d":return 0;case"i":return 1;default:return 2}}function K8(B){return X(this,void 0,void 0,function*(){var C;let{parallelism:A,iterations:v,hashLength:h}=B,u=P(B.password),d=P(B.salt),o=19,JZ=m8(B.hashType),{memorySize:TZ}=B,yZ=P((C=B.secret)!==null&&C!==void 0?C:""),[kZ,AZ]=yield Promise.all([w(WZ,1024),L8(512)]);kZ.setMemorySize(TZ*1024+1024);let j8=new Uint8Array(24),rZ=new DataView(j8.buffer);rZ.setInt32(0,A,!0),rZ.setInt32(4,h,!0),rZ.setInt32(8,TZ,!0),rZ.setInt32(12,v,!0),rZ.setInt32(16,19,!0),rZ.setInt32(20,JZ,!0),kZ.writeMemory(j8,TZ*1024),AZ.init(),AZ.update(j8),AZ.update(CZ(u.length)),AZ.update(u),AZ.update(CZ(d.length)),AZ.update(d),AZ.update(CZ(yZ.length)),AZ.update(yZ),AZ.update(CZ(0));let $0=Math.floor(TZ/(A*4))*4,C8=new Uint8Array(72),H0=AZ.digest("binary");C8.set(H0);for(let q0=0;q0<A;q0++){C8.set(CZ(0),64),C8.set(CZ(q0),68);let XZ=q0*$0,qZ=yield x8(AZ,C8,1024);kZ.writeMemory(qZ,XZ*1024),XZ+=1,C8.set(CZ(1),64),qZ=yield x8(AZ,C8,1024),kZ.writeMemory(qZ,XZ*1024)}let W9=new Uint8Array(1024);q(W9,kZ.calculate(new Uint8Array([]),TZ));let c8=yield x8(AZ,W9,h);if(B.outputType==="hex"){let q0=new Uint8Array(h*2);return O(q0,c8,h)}if(B.outputType==="encoded")return X0(d,B,c8);return c8})}let k8=(B)=>{var C;if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!B.password)throw Error("Password must be specified");if(B.password=P(B.password),B.password.length<1)throw Error("Password must be specified");if(!B.salt)throw Error("Salt must be specified");if(B.salt=P(B.salt),B.salt.length<8)throw Error("Salt should be at least 8 bytes long");if(B.secret=P((C=B.secret)!==null&&C!==void 0?C:""),!Number.isInteger(B.iterations)||B.iterations<1)throw Error("Iterations should be a positive number");if(!Number.isInteger(B.parallelism)||B.parallelism<1)throw Error("Parallelism should be a positive number");if(!Number.isInteger(B.hashLength)||B.hashLength<4)throw Error("Hash length should be at least 4 bytes.");if(!Number.isInteger(B.memorySize))throw Error("Memory size should be specified.");if(B.memorySize<8*B.parallelism)throw Error("Memory size should be at least 8 * parallelism.");if(B.outputType===void 0)B.outputType="hex";if(!["hex","binary","encoded"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary', 'encoded']`)};function e0(B){return X(this,void 0,void 0,function*(){return k8(B),K8(Object.assign(Object.assign({},B),{hashType:"i"}))})}function k0(B){return X(this,void 0,void 0,function*(){return k8(B),K8(Object.assign(Object.assign({},B),{hashType:"id"}))})}function Z9(B){return X(this,void 0,void 0,function*(){return k8(B),K8(Object.assign(Object.assign({},B),{hashType:"d"}))})}let i=(B,C,A)=>{let v=/^\$argon2(id|i|d)\$v=([0-9]+)\$((?:[mtp]=[0-9]+,){2}[mtp]=[0-9]+)\$([A-Za-z0-9+/]+)\$([A-Za-z0-9+/]+)$/,h=C.match(v);if(!h)throw Error("Invalid hash");let[,u,d,o,JZ,TZ]=h;if(d!=="19")throw Error(`Unsupported version: ${d}`);let yZ={},kZ={m:"memorySize",p:"parallelism",t:"iterations"};for(let AZ of o.split(",")){let[j8,rZ]=AZ.split("=");yZ[kZ[j8]]=Number(rZ)}return Object.assign(Object.assign({},yZ),{password:B,secret:A,hashType:u,salt:I(JZ),hashLength:L(TZ),outputType:"encoded"})},t=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(B.hash===void 0||typeof B.hash!=="string")throw Error("Hash should be specified")};function _Z(B){return X(this,void 0,void 0,function*(){t(B);let C=i(B.password,B.hash,B.secret);k8(C);let A=B.hash.lastIndexOf("$")+1;return(yield K8(C)).substring(A)===B.hash.substring(A)})}var b="blake2s",n="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",p="5c0ff166",KZ={name:b,data:n,hash:p};let zZ=new V,a=null;function YZ(B){if(!Number.isInteger(B)||B<8||B>256||B%8!==0)return Error("Invalid variant! Valid values: 8, 16, ..., 256");return null}function MZ(B,C){return B|C<<16}function Y8(B,C=256,A=null){if(YZ(C))return Promise.reject(YZ(C));let v=null,h=C;if(A!==null){if(v=P(A),v.length>32)return Promise.reject(Error("Max key length is 32 bytes"));h=MZ(C,v.length)}let u=C/8;if(a===null||a.hashLength!==u)return x(zZ,KZ,u).then((d)=>{if(a=d,h>512)a.writeMemory(v);return a.calculate(B,h)});try{if(h>512)a.writeMemory(v);let d=a.calculate(B,h);return Promise.resolve(d)}catch(d){return Promise.reject(d)}}function UZ(B=256,C=null){if(YZ(B))return Promise.reject(YZ(B));let A=null,v=B;if(C!==null){if(A=P(C),A.length>32)return Promise.reject(Error("Max key length is 32 bytes"));v=MZ(B,A.length)}let h=B/8;return w(KZ,h).then((u)=>{if(v>512)u.writeMemory(A);u.init(v);let d={init:v>512?()=>{return u.writeMemory(A),u.init(v),d}:()=>{return u.init(v),d},update:(o)=>{return u.update(o),d},digest:(o)=>u.digest(o),save:()=>u.save(),load:(o)=>{return u.load(o),d},blockSize:64,digestSize:h};return d})}var Q9="blake3",G8="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IQEgAkFAaiICQcAASw0ACwsCQEHAACAHQf8BcSIGayIFIAIgBSACSRsiCUUNACAJQQNxIQtBACEFAkAgCUEESQ0AIAAgBmohByAJQfwAcSEIQQAhBQNAIAcgBWoiAkEoaiABIAVqIgotAAA6AAAgAkEpaiAKQQFqLQAAOgAAIAJBKmogCkECai0AADoAACACQStqIApBA2otAAA6AAAgCCAFQQRqIgVHDQALCwJAIAtFDQAgASAFaiEBIAUgBmogAGpBKGohBQNAIAUgAS0AADoAACABQQFqIQEgBUEBaiEFIAtBf2oiCw0ACwsgAC0AaCEHCyAAIAcgCWo6AGggA0HAAGokAAveAwQFfwN+BX8GfiMAQdABayIBJAACQCAAe6ciAkEALQCQigEiA08NAEEALQCKigFBBHIhBCABQShqIQVBACkDmIkBIQBBACkDkIkBIQZBACkDiIkBIQdBACkDgIkBIQggAyEJA0AgASAANwMYIAEgBjcDECABIAc3AwggASAINwMAIAEgA0EFdCIDQdGJAWoiCikDADcDKCABIANB2YkBaiILKQMANwMwIAEgA0HhiQFqIgwpAwA3AzggASADQemJAWoiDSkDADcDQCABIANB8YkBaikDADcDSCABIANB+YkBaikDADcDUCABIANBgYoBaikDADcDWCADQYmKAWopAwAhDiABQcAAOgBoIAEgDjcDYCABQgA3AyAgASAEOgBpIAEgADcDiAEgASAGNwOAASABIAc3A3ggASAINwNwIAFBkAFqIAFB8ABqIAVBwABCACAEQf8BcRACIAEpA7ABIQ4gASkDkAEhDyABKQO4ASEQIAEpA5gBIREgASkDwAEhEiABKQOgASETIA0gASkDyAEgASkDqAGFNwMAIAwgEiAThTcDACALIBAgEYU3AwAgCiAOIA+FNwMAIAlBf2oiCUH/AXEiAyACSw0AC0EAIAk6AJCKAQsgAUHQAWokAAvHCQIKfwV+IwBB4AJrIgUkAAJAAkAgAUGACEsNACAFIAA2AvwBIAVB/AFqIAFBgAhGIgZBECACQQEgA0EBQQIgBBABIAZBCnQiByABTw0BIAVB4ABqIgZCADcDACAFQdgAaiIIQgA3AwAgBUHQAGoiCUIANwMAIAVByABqIgpCADcDACAFQcAAaiILQgA3AwAgBUE4aiIMQgA3AwAgBUEwaiINQgA3AwAgBSADOgBqIAVCADcDKCAFQQA7AWggBUEAKQOAiQE3AwAgBUEAKQOIiQE3AwggBUEAKQOQiQE3AxAgBUEAKQOYiQE3AxggBSABQYAIRiIOrSACfDcDICAFIAAgB2pBACABIA4bEAQgBUGIAWpBMGogDSkDADcDACAFQYgBakE4aiAMKQMANwMAIAUgBSkDACIPNwOIASAFIAUpAwgiEDcDkAEgBSAFKQMQIhE3A5gBIAUgBSkDGCISNwOgASAFIAUpAyg3A7ABIAUtAGohACAFLQBpIQcgBSkDICECIAUtAGghASAFQYgBakHAAGogCykDADcDACAFQYgBakHIAGogCikDADcDACAFQYgBakHQAGogCSkDADcDACAFQYgBakHYAGogCCkDADcDACAFQYgBakHgAGogBikDADcDACAFIAE6APABIAUgAjcDqAEgBSAAIAdFckECciIAOgDxASAFIBI3A5gCIAUgETcDkAIgBSAQNwOIAiAFIA83A4ACIAVBoAJqIAVBgAJqIAVBsAFqIAEgAiAAQf8BcRACIAUpA8ACIQIgBSkDoAIhDyAFKQPIAiEQIAUpA6gCIREgBSkD0AIhEiAFKQOwAiETIAQgDkEFdGoiASAFKQPYAiAFKQO4AoU3AxggASASIBOFNwMQIAEgECARhTcDCCABIAIgD4U3AwBBAkEBIA4bIQYMAQsgAEIBIAFBf2pBCnZBAXKteUI/hYYiD6dBCnQiDiACIAMgBRAGIQcgACAOaiABIA5rIA9C////AYMgAnwgAyAFQcAAQSAgDkGACEsbahAGIQECQCAHQQFHDQAgBCAFKQMANwMAIAQgBSkDCDcDCCAEIAUpAxA3AxAgBCAFKQMYNwMYIAQgBSkDIDcDICAEIAUpAyg3AyggBCAFKQMwNwMwIAQgBSkDODcDOEECIQYMAQtBACEGQQAhAAJAIAEgB2oiCUECSQ0AIAlBfmoiCkEBdkEBaiIGQQNxIQ5BACEHAkAgCkEGSQ0AIAZB/P///wdxIQhBACEHIAVBiAFqIQEgBSEAA0AgASAANgIAIAFBDGogAEHAAWo2AgAgAUEIaiAAQYABajYCACABQQRqIABBwABqNgIAIABBgAJqIQAgAUEQaiEBIAggB0EEaiIHRw0ACwsgCkF+cSEIAkAgDkUNACAFIAdBBnRqIQEgBUGIAWogB0ECdGohAANAIAAgATYCACABQcAAaiEBIABBBGohACAOQX9qIg4NAAsLIAhBAmohAAsgBUGIAWogBkEBQgBBACADQQRyQQBBACAEEAEgACAJTw0AIAQgBkEFdGoiASAFIAZBBnRqIgApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggBkEBaiEGCyAFQeACaiQAIAYLrRAIAn8EfgF/AX4EfwR+BH8EfiMAQfABayIBJAACQCAARQ0AAkBBAC0AkIoBIgINACABQTBqQQApA9CJATcDACABQThqQQApA9iJATcDACABQQApA6CJASIDNwMAIAFBACkDqIkBIgQ3AwggAUEAKQOwiQEiBTcDECABQQApA7iJASIGNwMYIAFBACkDyIkBNwMoQQAtAIqKASECQQAtAImKASEHQQApA8CJASEIQQAtAIiKASEJIAFBwABqQQApA+CJATcDACABQcgAakEAKQPoiQE3AwAgAUHQAGpBACkD8IkBNwMAIAFB2ABqQQApA/iJATcDACABQeAAakEAKQOAigE3AwAgASAJOgBoIAEgCDcDICABIAIgB0VyIgJBAnI6AGkgAUEoaiEKQgAhCEGACSELIAJBCnJB/wFxIQwDQCABQbABaiABIAogCUH/AXEgCCAMEAIgASABKQPQASINIAEpA7ABhTcDcCABIAEpA9gBIg4gASkDuAGFNwN4IAEgASkD4AEiDyABKQPAAYU3A4ABIAEgASkD6AEiECAGhTcDqAEgASAPIAWFNwOgASABIA4gBIU3A5gBIAEgDSADhTcDkAEgASAQIAEpA8gBhTcDiAEgAEHAACAAQcAASRsiEUF/aiESAkACQCARQQdxIhMNACABQfAAaiECIAshByARIRQMAQsgEUH4AHEhFCABQfAAaiECIAshBwNAIAcgAi0AADoAACAHQQFqIQcgAkEBaiECIBNBf2oiEw0ACwsCQCASQQdJDQADQCAHIAIpAAA3AAAgB0EIaiEHIAJBCGohAiAUQXhqIhQNAAsLIAhCAXwhCCALIBFqIQsgACARayIADQAMAgsLAkACQAJAQQAtAImKASIHQQZ0QQBBAC0AiIoBIhFrRg0AIAEgEToAaCABQQApA4CKATcDYCABQQApA/iJATcDWCABQQApA/CJATcDUCABQQApA+iJATcDSCABQQApA+CJATcDQCABQQApA9iJATcDOCABQQApA9CJATcDMCABQQApA8iJATcDKCABQQApA8CJASIINwMgIAFBACkDuIkBIgM3AxggAUEAKQOwiQEiBDcDECABQQApA6iJASIFNwMIIAFBACkDoIkBIgY3AwAgAUEALQCKigEiEyAHRXJBAnIiCzoAaSATQQRyIRNBACkDmIkBIQ1BACkDkIkBIQ5BACkDiIkBIQ9BACkDgIkBIRAMAQtBwAAhESABQcAAOgBoQgAhCCABQgA3AyAgAUEAKQOYiQEiDTcDGCABQQApA5CJASIONwMQIAFBACkDiIkBIg83AwggAUEAKQOAiQEiEDcDACABQQAtAIqKAUEEciITOgBpIAEgAkF+aiICQQV0IgdByYoBaikDADcDYCABIAdBwYoBaikDADcDWCABIAdBuYoBaikDADcDUCABIAdBsYoBaikDADcDSCABIAdBqYoBaikDADcDQCABIAdBoYoBaikDADcDOCABIAdBmYoBaikDADcDMCABIAdBkYoBaikDADcDKCATIQsgECEGIA8hBSAOIQQgDSEDIAJFDQELIAJBf2oiB0EFdCIUQZGKAWopAwAhFSAUQZmKAWopAwAhFiAUQaGKAWopAwAhFyAUQamKAWopAwAhGCABIAM3A4gBIAEgBDcDgAEgASAFNwN4IAEgBjcDcCABQbABaiABQfAAaiABQShqIhQgESAIIAtB/wFxEAIgASATOgBpIAFBwAA6AGggASAYNwNAIAEgFzcDOCABIBY3AzAgASAVNwMoIAFCADcDICABIA03AxggASAONwMQIAEgDzcDCCABIBA3AwAgASABKQPoASABKQPIAYU3A2AgASABKQPgASABKQPAAYU3A1ggASABKQPYASABKQO4AYU3A1AgASABKQPQASABKQOwAYU3A0ggB0UNACACQQV0QemJAWohAiATQf8BcSERA0AgAkFoaikDACEIIAJBcGopAwAhAyACQXhqKQMAIQQgAikDACEFIAEgDTcDiAEgASAONwOAASABIA83A3ggASAQNwNwIAFBsAFqIAFB8ABqIBRBwABCACAREAIgASATOgBpIAFBwAA6AGggASAFNwNAIAEgBDcDOCABIAM3AzAgASAINwMoIAFCADcDICABIA03AxggASAONwMQIAEgDzcDCCABIBA3AwAgASABKQPoASABKQPIAYU3A2AgASABKQPgASABKQPAAYU3A1ggASABKQPYASABKQO4AYU3A1AgASABKQPQASABKQOwAYU3A0ggAkFgaiECIAdBf2oiBw0ACwsgAUEoaiEJQgAhCEGACSELIBNBCHJB/wFxIQoDQCABQbABaiABIAlBwAAgCCAKEAIgASABKQPQASIDIAEpA7ABhTcDcCABIAEpA9gBIgQgASkDuAGFNwN4IAEgASkD4AEiBSABKQPAAYU3A4ABIAEgDSABKQPoASIGhTcDqAEgASAOIAWFNwOgASABIA8gBIU3A5gBIAEgECADhTcDkAEgASAGIAEpA8gBhTcDiAEgAEHAACAAQcAASRsiEUF/aiESAkACQCARQQdxIhMNACABQfAAaiECIAshByARIRQMAQsgEUH4AHEhFCABQfAAaiECIAshBwNAIAcgAi0AADoAACAHQQFqIQcgAkEBaiECIBNBf2oiEw0ACwsCQCASQQdJDQADQCAHIAIpAAA3AAAgB0EIaiEHIAJBCGohAiAUQXhqIhQNAAsLIAhCAXwhCCALIBFqIQsgACARayIADQALCyABQfABaiQAC6MCAQR+AkACQCAAQSBGDQBCq7OP/JGjs/DbACEBQv+kuYjFkdqCm38hAkLy5rvjo6f9p6V/IQNC58yn0NbQ67O7fyEEQQAhAAwBC0EAKQOYCSEBQQApA5AJIQJBACkDiAkhA0EAKQOACSEEQRAhAAtBACAAOgCKigFBAEIANwOAigFBAEIANwP4iQFBAEIANwPwiQFBAEIANwPoiQFBAEIANwPgiQFBAEIANwPYiQFBAEIANwPQiQFBAEIANwPIiQFBAEIANwPAiQFBACABNwO4iQFBACACNwOwiQFBACADNwOoiQFBACAENwOgiQFBACABNwOYiQFBACACNwOQiQFBACADNwOIiQFBACAENwOAiQFBAEEAOgCQigFBAEEAOwGIigELBgAgABADCwYAIAAQBwsGAEGAiQELqwIBBH4CQAJAIAFBIEYNAEKrs4/8kaOz8NsAIQNC/6S5iMWR2oKbfyEEQvLmu+Ojp/2npX8hBULnzKfQ1tDrs7t/IQZBACEBDAELQQApA5gJIQNBACkDkAkhBEEAKQOICSEFQQApA4AJIQZBECEBC0EAIAE6AIqKAUEAQgA3A4CKAUEAQgA3A/iJAUEAQgA3A/CJAUEAQgA3A+iJAUEAQgA3A+CJAUEAQgA3A9iJAUEAQgA3A9CJAUEAQgA3A8iJAUEAQgA3A8CJAUEAIAM3A7iJAUEAIAQ3A7CJAUEAIAU3A6iJAUEAIAY3A6CJAUEAIAM3A5iJAUEAIAQ3A5CJAUEAIAU3A4iJAUEAIAY3A4CJAUEAQQA6AJCKAUEAQQA7AYiKASAAEAMgAhAHCwsLAQBBgAgLBHgHAAA=",lZ="215d875f",gZ={name:Q9,data:G8,hash:lZ};let W0=new V,$8=null;function f0(B){if(!Number.isInteger(B)||B<8||B%8!==0)return Error("Invalid variant! Valid values: 8, 16, ...");return null}function LK(B,C=256,A=null){if(f0(C))return Promise.reject(f0(C));let v=null,h=0;if(A!==null){if(v=P(A),v.length!==32)return Promise.reject(Error("Key length must be exactly 32 bytes"));h=32}let u=C/8,d=u;if($8===null||$8.hashLength!==u)return x(W0,gZ,u).then((o)=>{if($8=o,h===32)$8.writeMemory(v);return $8.calculate(B,h,d)});try{if(h===32)$8.writeMemory(v);let o=$8.calculate(B,h,d);return Promise.resolve(o)}catch(o){return Promise.reject(o)}}function CK(B=256,C=null){if(f0(B))return Promise.reject(f0(B));let A=null,v=0;if(C!==null){if(A=P(C),A.length!==32)return Promise.reject(Error("Key length must be exactly 32 bytes"));v=32}let h=B/8,u=h;return w(gZ,h).then((d)=>{if(v===32)d.writeMemory(A);d.init(v);let o={init:v===32?()=>{return d.writeMemory(A),d.init(v),o}:()=>{return d.init(v),o},update:(JZ)=>{return d.update(JZ),o},digest:(JZ)=>d.digest(JZ,u),save:()=>d.save(),load:(JZ)=>{return d.load(JZ),o},blockSize:64,digestSize:h};return o})}var _K="crc32",TK="AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwgHAAEBAQIAAwUEAQECAgYOAn8BQZDJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAgtIYXNoX1VwZGF0ZQADCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKkggHBQBBgAkLwwMBA39BgIkBIQFBACECA0AgAUEAQQBBAEEAQQBBAEEAQQAgAkEBcWsgAHEgAkEBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnM2AgAgAUEEaiEBIAJBAWoiAkGAAkcNAAtBACEAA0AgAEGEkQFqIABBhIkBaigCACICQf8BcUECdEGAiQFqKAIAIAJBCHZzIgI2AgAgAEGEmQFqIAJB/wFxQQJ0QYCJAWooAgAgAkEIdnMiAjYCACAAQYShAWogAkH/AXFBAnRBgIkBaigCACACQQh2cyICNgIAIABBhKkBaiACQf8BcUECdEGAiQFqKAIAIAJBCHZzIgI2AgAgAEGEsQFqIAJB/wFxQQJ0QYCJAWooAgAgAkEIdnMiAjYCACAAQYS5AWogAkH/AXFBAnRBgIkBaigCACACQQh2cyICNgIAIABBhMEBaiACQf8BcUECdEGAiQFqKAIAIAJBCHZzNgIAIABBBGoiAEH8B0cNAAsLJwACQEEAKAKAyQEgAEYNACAAEAFBACAANgKAyQELQQBBADYChMkBC4gDAQN/QQAoAoTJAUF/cyEBQYAJIQICQCAAQQhJDQBBgAkhAgNAIAJBBGooAgAiA0EOdkH8B3FBgJEBaigCACADQRZ2QfwHcUGAiQFqKAIAcyADQQZ2QfwHcUGAmQFqKAIAcyADQf8BcUECdEGAoQFqKAIAcyACKAIAIAFzIgFBFnZB/AdxQYCpAWooAgBzIAFBDnZB/AdxQYCxAWooAgBzIAFBBnZB/AdxQYC5AWooAgBzIAFB/wFxQQJ0QYDBAWooAgBzIQEgAkEIaiECIABBeGoiAEEHSw0ACwsCQCAARQ0AAkACQCAAQQFxDQAgACEDDAELIAFB/wFxIAItAABzQQJ0QYCJAWooAgAgAUEIdnMhASACQQFqIQIgAEF/aiEDCyAAQQFGDQADQCABQf8BcSACLQAAc0ECdEGAiQFqKAIAIAFBCHZzIgFB/wFxIAJBAWotAABzQQJ0QYCJAWooAgAgAUEIdnMhASACQQJqIQIgA0F+aiIDDQALC0EAIAFBf3M2AoTJAQsyAQF/QQBBACgChMkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgKACQsGAEGEyQELWQACQEEAKAKAyQEgAUYNACABEAFBACABNgKAyQELQQBBADYChMkBIAAQA0EAQQAoAoTJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCgAkLCwsBAEGACAsEBAAAAA==",AK="d2eba587",o2={name:_K,data:TK,hash:AK};let EK=new V,vQ=null;function wQ(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Polynomial must be a valid 32-bit long unsigned integer");return null}function IK(B,C=3988292384){if(wQ(C))return Promise.reject(wQ(C));if(vQ===null)return x(EK,o2,4).then((A)=>{return vQ=A,vQ.calculate(B,C)});try{let A=vQ.calculate(B,C);return Promise.resolve(A)}catch(A){return Promise.reject(A)}}function SK(B=3988292384){if(wQ(B))return Promise.reject(wQ(B));return w(o2,4).then((C)=>{C.init(B);let A={init:()=>{return C.init(B),A},update:(v)=>{return C.update(v),A},digest:(v)=>C.digest(v),save:()=>C.save(),load:(v)=>{return C.load(v),A},blockSize:4,digestSize:4};return A})}var vK="crc64",wK="AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAQUEAQECAgYOAn8BQZCJBgt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEKgwgGBQBBgAkL9QMDAX4BfwJ+AkBBACkDgIkCQQApA4AJIgBRDQBBgIkBIQFCACECA0AgAUIAQgBCAEIAQgBCAEIAQgAgAkIBg30gAIMgAkIBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIU3AwAgAUEIaiEBIAJCAXwiAkKAAlINAAtBACEBA0AgAUGImQFqIAFBiIkBaikDACICp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiKkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiLkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiMkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiNkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiOkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiPkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhTcDACABQQhqIgFB+A9HDQALQQAgADcDgIkCC0EAQgA3A4iJAguUAwIBfgJ/QQApA4iJAkJ/hSEBQYAJIQICQCAAQQhJDQBBgAkhAgNAIAIpAwAgAYUiAUIwiKdB/wFxQQN0QYCZAWopAwAgAUI4iKdBA3RBgIkBaikDAIUgAUIoiKdB/wFxQQN0QYCpAWopAwCFIAFCIIinQf8BcUEDdEGAuQFqKQMAhSABpyIDQRV2QfgPcUGAyQFqKQMAhSADQQ12QfgPcUGA2QFqKQMAhSADQQV2QfgPcUGA6QFqKQMAhSADQf8BcUEDdEGA+QFqKQMAhSEBIAJBCGohAiAAQXhqIgBBB0sNAAsLAkAgAEUNAAJAAkAgAEEBcQ0AIAAhAwwBCyABQv8BgyACMQAAhadBA3RBgIkBaikDACABQgiIhSEBIAJBAWohAiAAQX9qIQMLIABBAUYNAANAIAFC/wGDIAIxAACFp0EDdEGAiQFqKQMAIAFCCIiFIgFC/wGDIAJBAWoxAACFp0EDdEGAiQFqKQMAIAFCCIiFIQEgAkECaiECIANBfmoiAw0ACwtBACABQn+FNwOIiQILZAEBfkEAQQApA4iJAiIAQjiGIABCgP4Dg0IohoQgAEKAgPwHg0IYhiAAQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwOACQsGAEGIiQILAgALCwsBAEGACAsECAAAAA==",yK="c5ac6c16",r2={name:vK,data:wK,hash:yK};let xK=new V,Y9=null,yQ=new Uint8Array(8);function a2(B){if(typeof B!=="string"||B.length!==16)return{hi:0,lo:0,err:Error("Polynomial must be provided as a 16 char long hex string")};let A=Number(`0x${B.slice(0,8)}`),v=Number(`0x${B.slice(8)}`);if(Number.isNaN(A)||Number.isNaN(v))return{hi:A,lo:v,err:Error("Polynomial must be provided as a 16 char long hex string")};return{hi:A,lo:v,err:null}}function m1(B,C,A){let v=new DataView(B);v.setUint32(0,C,!0),v.setUint32(4,A,!0)}function kK(B,C="c96c5795d7870f42"){let{hi:A,lo:v,err:h}=a2(C);if(h!==null)return Promise.reject(h);if(Y9===null)return x(xK,r2,8).then((u)=>{return Y9=u,m1(yQ.buffer,v,A),Y9.writeMemory(yQ),Y9.calculate(B)});try{m1(yQ.buffer,v,A),Y9.writeMemory(yQ);let u=Y9.calculate(B);return Promise.resolve(u)}catch(u){return Promise.reject(u)}}function fK(B="c96c5795d7870f42"){let{hi:C,lo:A,err:v}=a2(B);if(v!==null)return Promise.reject(v);return w(r2,8).then((h)=>{let u=new Uint8Array(8);m1(u.buffer,A,C),h.writeMemory(u),h.init();let d={init:()=>{return h.writeMemory(u),h.init(),d},update:(o)=>{return h.update(o),d},digest:(o)=>h.digest(o),save:()=>h.save(),load:(o)=>{return h.load(o),d},blockSize:8,digestSize:8};return d})}var hK="md4",bK="AGFzbQEAAAABEgRgAAF/YAAAYAF/AGACf38BfwMIBwABAgMBAAIFBAEBAgIGDgJ/AUGgigULfwBBgAgLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAELSGFzaF9VcGRhdGUAAgpIYXNoX0ZpbmFsAAQNSGFzaF9HZXRTdGF0ZQAFDkhhc2hfQ2FsY3VsYXRlAAYKU1RBVEVfU0laRQMBCucUBwUAQYAJCy0AQQBC/rnrxemOlZkQNwKQiQFBAEKBxpS6lvHq5m83AoiJAUEAQgA3AoCJAQu+BQEHf0EAQQAoAoCJASIBIABqQf////8BcSICNgKAiQFBAEEAKAKEiQEgAiABSWogAEEddmo2AoSJAQJAAkACQAJAAkACQCABQT9xIgMNAEGACSEEDAELIABBwAAgA2siBUkNASAFQQNxIQZBACEBAkAgA0E/c0EDSQ0AIANBgIkBaiEEIAVB/ABxIQdBACEBA0AgBCABaiICQRhqIAFBgAlqLQAAOgAAIAJBGWogAUGBCWotAAA6AAAgAkEaaiABQYIJai0AADoAACACQRtqIAFBgwlqLQAAOgAAIAcgAUEEaiIBRw0ACwsCQCAGRQ0AIANBmIkBaiECA0AgAiABaiABQYAJai0AADoAACABQQFqIQEgBkF/aiIGDQALC0GYiQFBwAAQAxogACAFayEAIAVBgAlqIQQLIABBwABPDQEgACECDAILIABFDQIgAEEDcSEGQQAhAQJAIABBBEkNACADQYCJAWohBCAAQXxxIQBBACEBA0AgBCABaiICQRhqIAFBgAlqLQAAOgAAIAJBGWogAUGBCWotAAA6AAAgAkEaaiABQYIJai0AADoAACACQRtqIAFBgwlqLQAAOgAAIAAgAUEEaiIBRw0ACwsgBkUNAiADQZiJAWohAgNAIAIgAWogAUGACWotAAA6AAAgAUEBaiEBIAZBf2oiBg0ADAMLCyAAQT9xIQIgBCAAQUBxEAMhBAsgAkUNACACQQNxIQZBACEBAkAgAkEESQ0AIAJBPHEhAEEAIQEDQCABQZiJAWogBCABaiICLQAAOgAAIAFBmYkBaiACQQFqLQAAOgAAIAFBmokBaiACQQJqLQAAOgAAIAFBm4kBaiACQQNqLQAAOgAAIAAgAUEEaiIBRw0ACwsgBkUNAANAIAFBmIkBaiAEIAFqLQAAOgAAIAFBAWohASAGQX9qIgYNAAsLC+sKARd/QQAoApSJASECQQAoApCJASEDQQAoAoyJASEEQQAoAoiJASEFA0AgACgCHCIGIAAoAhQiByAAKAIYIgggACgCECIJIAAoAiwiCiAAKAIoIgsgACgCJCIMIAAoAiAiDSALIAggACgCCCIOIANqIAAoAgQiDyACaiAEIAMgAnNxIAJzIAVqIAAoAgAiEGpBA3ciESAEIANzcSADc2pBB3ciEiARIARzcSAEc2pBC3ciE2ogEiAHaiAJIBFqIAAoAgwiFCAEaiATIBIgEXNxIBFzakETdyIRIBMgEnNxIBJzakEDdyISIBEgE3NxIBNzakEHdyITIBIgEXNxIBFzakELdyIVaiATIAxqIBIgDWogESAGaiAVIBMgEnNxIBJzakETdyIRIBUgE3NxIBNzakEDdyISIBEgFXNxIBVzakEHdyITIBIgEXNxIBFzakELdyIVIAAoAjgiFmogEyAAKAI0IhdqIBIgACgCMCIYaiARIApqIBUgEyASc3EgEnNqQRN3IhIgFSATc3EgE3NqQQN3IhMgEiAVc3EgFXNqQQd3IhUgEyASc3EgEnNqQQt3IhFqIAkgFWogECATaiASIAAoAjwiCWogESAVIBNzcSATc2pBE3ciEiARIBVycSARIBVxcmpBmfOJ1AVqQQN3IhMgEiARcnEgEiARcXJqQZnzidQFakEFdyIRIBMgEnJxIBMgEnFyakGZ84nUBWpBCXciFWogByARaiAPIBNqIBggEmogFSARIBNycSARIBNxcmpBmfOJ1AVqQQ13IhIgFSARcnEgFSARcXJqQZnzidQFakEDdyIRIBIgFXJxIBIgFXFyakGZ84nUBWpBBXciEyARIBJycSARIBJxcmpBmfOJ1AVqQQl3IhVqIAggE2ogDiARaiAXIBJqIBUgEyARcnEgEyARcXJqQZnzidQFakENdyIRIBUgE3JxIBUgE3FyakGZ84nUBWpBA3ciEiARIBVycSARIBVxcmpBmfOJ1AVqQQV3IhMgEiARcnEgEiARcXJqQZnzidQFakEJdyIVaiAGIBNqIBQgEmogFiARaiAVIBMgEnJxIBMgEnFyakGZ84nUBWpBDXciESAVIBNycSAVIBNxcmpBmfOJ1AVqQQN3IhIgESAVcnEgESAVcXJqQZnzidQFakEFdyITIBIgEXJxIBIgEXFyakGZ84nUBWpBCXciFWogECASaiAJIBFqIBUgEyAScnEgEyAScXJqQZnzidQFakENdyIGIBVzIhIgE3NqQaHX5/YGakEDdyIRIAZzIA0gE2ogEiARc2pBodfn9gZqQQl3IhJzakGh1+f2BmpBC3ciE2ogDiARaiATIBJzIBggBmogEiARcyATc2pBodfn9gZqQQ93IhFzakGh1+f2BmpBA3ciFSARcyALIBJqIBEgE3MgFXNqQaHX5/YGakEJdyISc2pBodfn9gZqQQt3IhNqIA8gFWogEyAScyAWIBFqIBIgFXMgE3NqQaHX5/YGakEPdyIRc2pBodfn9gZqQQN3IhUgEXMgDCASaiARIBNzIBVzakGh1+f2BmpBCXciEnNqQaHX5/YGakELdyITaiAUIBVqIBMgEnMgFyARaiASIBVzIBNzakGh1+f2BmpBD3ciEXNqQaHX5/YGakEDdyIVIBFzIAogEmogESATcyAVc2pBodfn9gZqQQl3IhJzakGh1+f2BmpBC3ciEyADaiEDIAkgEWogEiAVcyATc2pBodfn9gZqQQ93IARqIQQgEiACaiECIBUgBWohBSAAQcAAaiEAIAFBQGoiAQ0AC0EAIAI2ApSJAUEAIAM2ApCJAUEAIAQ2AoyJAUEAIAU2AoiJASAAC8gDAQV/QQAoAoCJAUE/cSIAQZiJAWpBgAE6AAAgAEEBaiEBAkACQAJAAkAgAEE/cyICQQdLDQAgAkUNASABQZiJAWpBADoAACACQQFGDQEgAEGaiQFqQQA6AAAgAkECRg0BIABBm4kBakEAOgAAIAJBA0YNASAAQZyJAWpBADoAACACQQRGDQEgAEGdiQFqQQA6AAAgAkEFRg0BIABBnokBakEAOgAAIAJBBkYNASAAQZ+JAWpBADoAAAwBCyACQQhGDQJBNiAAayIDIQQCQCACQQNxIgBFDQBBACAAayEEQQAhAANAIABBz4kBakEAOgAAIAQgAEF/aiIARw0ACyADIABqIQQLIANBA0kNAgwBC0GYiQFBwAAQAxpBACEBQTchBAsgAUGAiQFqIQBBfyECA0AgACAEakEVakEANgAAIABBfGohACAEIAJBBGoiAkcNAAsLQQBBACgChIkBNgLUiQFBAEEAKAKAiQEiAEEVdjoA04kBQQAgAEENdjoA0okBQQAgAEEFdjoA0YkBQQAgAEEDdCIAOgDQiQFBACAANgKAiQFBmIkBQcAAEAMaQQBBACkCiIkBNwOACUEAQQApApCJATcDiAkLBgBBgIkBCzMAQQBC/rnrxemOlZkQNwKQiQFBAEKBxpS6lvHq5m83AoiJAUEAQgA3AoCJASAAEAIQBAsLCwEAQYAICwSYAAAA",gK="bd8ce7c7",s2={name:hK,data:bK,hash:gK};let uK=new V,xQ=null;function mK(B){if(xQ===null)return x(uK,s2,16).then((C)=>{return xQ=C,xQ.calculate(B)});try{let C=xQ.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function cK(){return w(s2,16).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:16};return C})}var lK="md5",dK="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",nK="e6508e4b",t2={name:lK,data:dK,hash:nK};let pK=new V,kQ=null;function iK(B){if(kQ===null)return x(pK,t2,16).then((C)=>{return kQ=C,kQ.calculate(B)});try{let C=kQ.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function oK(){return w(t2,16).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:16};return C})}var rK="sha1",aK="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",sK="6b530c24",e2={name:rK,data:aK,hash:sK};let tK=new V,fQ=null;function eK(B){if(fQ===null)return x(tK,e2,20).then((C)=>{return fQ=C,fQ.calculate(B)});try{let C=fQ.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function ZG(){return w(e2,20).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:20};return C})}var QG="sha3",YG="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",JG="fb24e536",hQ={name:QG,data:YG,hash:JG};let zG=new V,l9=null;function bQ(B){if(![224,256,384,512].includes(B))return Error("Invalid variant! Valid values: 224, 256, 384, 512");return null}function XG(B,C=512){if(bQ(C))return Promise.reject(bQ(C));let A=C/8;if(l9===null||l9.hashLength!==A)return x(zG,hQ,A).then((v)=>{return l9=v,l9.calculate(B,C,6)});try{let v=l9.calculate(B,C,6);return Promise.resolve(v)}catch(v){return Promise.reject(v)}}function WG(B=512){if(bQ(B))return Promise.reject(bQ(B));let C=B/8;return w(hQ,C).then((A)=>{A.init(B);let v={init:()=>{return A.init(B),v},update:(h)=>{return A.update(h),v},digest:(h)=>A.digest(h,6),save:()=>A.save(),load:(h)=>{return A.load(h),v},blockSize:200-2*C,digestSize:C};return v})}let VG=new V,d9=null;function gQ(B){if(![224,256,384,512].includes(B))return Error("Invalid variant! Valid values: 224, 256, 384, 512");return null}function KG(B,C=512){if(gQ(C))return Promise.reject(gQ(C));let A=C/8;if(d9===null||d9.hashLength!==A)return x(VG,hQ,A).then((v)=>{return d9=v,d9.calculate(B,C,1)});try{let v=d9.calculate(B,C,1);return Promise.resolve(v)}catch(v){return Promise.reject(v)}}function GG(B=512){if(gQ(B))return Promise.reject(gQ(B));let C=B/8;return w(hQ,C).then((A)=>{A.init(B);let v={init:()=>{return A.init(B),v},update:(h)=>{return A.update(h),v},digest:(h)=>A.digest(h,1),save:()=>A.save(),load:(h)=>{return A.load(h),v},blockSize:200-2*C,digestSize:C};return v})}var $G="sha256",HG="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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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",qG="8c18dd94",uQ={name:$G,data:HG,hash:qG};let UG=new V,mQ=null;function NG(B){if(mQ===null)return x(UG,uQ,28).then((C)=>{return mQ=C,mQ.calculate(B,224)});try{let C=mQ.calculate(B,224);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function BG(){return w(uQ,28).then((B)=>{B.init(224);let C={init:()=>{return B.init(224),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:28};return C})}let jG=new V,cQ=null;function FG(B){if(cQ===null)return x(jG,uQ,32).then((C)=>{return cQ=C,cQ.calculate(B,256)});try{let C=cQ.calculate(B,256);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function ZY(){return w(uQ,32).then((B)=>{B.init(256);let C={init:()=>{return B.init(256),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:32};return C})}var MG="sha512",RG="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",DG="f2e40eb1",lQ={name:MG,data:RG,hash:DG};let OG=new V,dQ=null;function PG(B){if(dQ===null)return x(OG,lQ,48).then((C)=>{return dQ=C,dQ.calculate(B,384)});try{let C=dQ.calculate(B,384);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function LG(){return w(lQ,48).then((B)=>{B.init(384);let C={init:()=>{return B.init(384),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:128,digestSize:48};return C})}let CG=new V,nQ=null;function _G(B){if(nQ===null)return x(CG,lQ,64).then((C)=>{return nQ=C,nQ.calculate(B,512)});try{let C=nQ.calculate(B,512);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function TG(){return w(lQ,64).then((B)=>{B.init(512);let C={init:()=>{return B.init(512),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:128,digestSize:64};return C})}var AG="xxhash32",EG="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",IG="4bb12485",QY={name:AG,data:EG,hash:IG};let SG=new V,pQ=null;function iQ(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be a valid 32-bit long unsigned integer.");return null}function vG(B,C=0){if(iQ(C))return Promise.reject(iQ(C));if(pQ===null)return x(SG,QY,4).then((A)=>{return pQ=A,pQ.calculate(B,C)});try{let A=pQ.calculate(B,C);return Promise.resolve(A)}catch(A){return Promise.reject(A)}}function wG(B=0){if(iQ(B))return Promise.reject(iQ(B));return w(QY,4).then((C)=>{C.init(B);let A={init:()=>{return C.init(B),A},update:(v)=>{return C.update(v),A},digest:(v)=>C.digest(v),save:()=>C.save(),load:(v)=>{return C.load(v),A},blockSize:16,digestSize:4};return A})}var yG="xxhash64",xG="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",kG="177fbfa3",YY={name:yG,data:xG,hash:kG};let fG=new V,J9=null,oQ=new Uint8Array(8);function V0(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be given as two valid 32-bit long unsigned integers (lo + high).");return null}function c1(B,C,A){let v=new DataView(B);v.setUint32(0,C,!0),v.setUint32(4,A,!0)}function hG(B,C=0,A=0){if(V0(C))return Promise.reject(V0(C));if(V0(A))return Promise.reject(V0(A));if(J9===null)return x(fG,YY,8).then((v)=>{return J9=v,c1(oQ.buffer,C,A),J9.writeMemory(oQ),J9.calculate(B)});try{c1(oQ.buffer,C,A),J9.writeMemory(oQ);let v=J9.calculate(B);return Promise.resolve(v)}catch(v){return Promise.reject(v)}}function bG(B=0,C=0){if(V0(B))return Promise.reject(V0(B));if(V0(C))return Promise.reject(V0(C));return w(YY,8).then((A)=>{let v=new Uint8Array(8);c1(v.buffer,B,C),A.writeMemory(v),A.init();let h={init:()=>{return A.writeMemory(v),A.init(),h},update:(u)=>{return A.update(u),h},digest:(u)=>A.digest(u),save:()=>A.save(),load:(u)=>{return A.load(u),h},blockSize:32,digestSize:8};return h})}var gG="xxhash3",uG="AGFzbQEAAAABNAhgAAF/YAR/f39/AGAHf39/f39/fwBgBH9+fn4BfmAEf39/fgF+YAN/f34BfmAAAGABfwADDg0AAQIDBAUFBQYHBgAGBQQBAQICBg4CfwFBwI4FC38AQcAJCwdwCAZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACUhhc2hfSW5pdAAIC0hhc2hfVXBkYXRlAAkKSGFzaF9GaW5hbAAKDUhhc2hfR2V0U3RhdGUACw5IYXNoX0NhbGN1bGF0ZQAMClNUQVRFX1NJWkUDAQr6QQ0FAEGACgvkAwMPfgF/AX4CQCADRQ0AIAApAzAhBCAAKQM4IQUgACkDICEGIAApAyghByAAKQMQIQggACkDGCEJIAApAwAhCiAAKQMIIQsDQCAFIAFBMGopAwAiDHwgAkE4aikDACABQThqKQMAIg2FIgVCIIggBUL/////D4N+fCEFIAcgAUEgaikDACIOfCACQShqKQMAIAFBKGopAwAiD4UiB0IgiCAHQv////8Pg358IQcgCSABQRBqKQMAIhB8IAJBGGopAwAgAUEYaikDACIRhSIJQiCIIAlC/////w+DfnwhCSALIAEpAwAiEnwgAkEIaiITKQMAIAFBCGopAwAiFIUiC0IgiCALQv////8Pg358IQsgAkEwaikDACAMhSIMQiCIIAxC/////w+DfiAEfCANfCEEIAJBIGopAwAgDoUiDEIgiCAMQv////8Pg34gBnwgD3whBiACQRBqKQMAIBCFIgxCIIggDEL/////D4N+IAh8IBF8IQggAikDACAShSIMQiCIIAxC/////w+DfiAKfCAUfCEKIAFBwABqIQEgEyECIANBf2oiAw0ACyAAIAk3AxggACAKNwMAIAAgCzcDCCAAIAc3AyggACAINwMQIAAgBTcDOCAAIAY3AyAgACAENwMwCwveAgIBfwF+AkAgBCACIAEoAgAiB2siAkkNACAAIAMgBSAHQQN0aiACEAEgACAFIAZqIgcpAwAgACkDACIIQi+IhSAIhUKx893xCX43AwAgACAHKQMIIAApAwgiCEIviIUgCIVCsfPd8Ql+NwMIIAAgBykDECAAKQMQIghCL4iFIAiFQrHz3fEJfjcDECAAIAcpAxggACkDGCIIQi+IhSAIhUKx893xCX43AxggACAHKQMgIAApAyAiCEIviIUgCIVCsfPd8Ql+NwMgIAAgBykDKCAAKQMoIghCL4iFIAiFQrHz3fEJfjcDKCAAIAcpAzAgACkDMCIIQi+IhSAIhUKx893xCX43AzAgACAHKQM4IAApAzgiCEIviIUgCIVCsfPd8Ql+NwM4IAAgAyACQQZ0aiAFIAQgAmsiBxABIAEgBzYCAA8LIAAgAyAFIAdBA3RqIAQQASABIAcgBGo2AgALhQEBAX8gAiABhSADpyIEQRh0IARBgP4DcUEIdHIgBEEIdkGA/gNxIARBGHZycq1CIIYgA4V9QQA1AoCMAUIghiAAQfyLAWo1AgCEhSIDQjGJIANCGImFIAOFQqW+4/TRjIfZn39+IgNCI4ggAK18IAOFQqW+4/TRjIfZn39+IgNCHIggA4ULZwAgAiABc60gA3wiA0IhiEEALQCAjAFBEHQgAEEIdHIgAEEBdkGAjAFqLQAAQRh0ciAAQf+LAWotAAByrYUgA4VCz9bTvtLHq9lCfiIDQh2IIAOFQvnz3fGZ9pmrFn4iA0IgiCADhQuJAwEEfgJAIABBCUkNAEEAKQOAjAEgASkDICABKQMYhSACfIUiA0I4hiADQoD+A4NCKIaEIANCgID8B4NCGIYgA0KAgID4D4NCCIaEhCADQgiIQoCAgPgPgyADQhiIQoCA/AeDhCADQiiIQoD+A4MgA0I4iISEhCAArXwgAEH4iwFqKQMAIAEpAzAgASkDKIUgAn2FIgJ8IAJC/////w+DIgQgA0IgiCIFfiIGQv////8PgyACQiCIIgIgA0L/////D4MiA358IAQgA34iA0IgiHwiBEIghiADQv////8Pg4QgBkIgiCACIAV+fCAEQiCIfIV8IgNCJYggA4VC+fPd8ZnymasWfiIDQiCIIAOFDwsCQCAAQQRJDQAgACABQQhqKQMAIAFBEGopAwAgAhADDwsCQCAARQ0AIAAgASgCACABQQRqKAIAIAIQBA8LIAEpAzggASkDQIUgAoUiA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC94IAQZ+IACtQoeVr6+Ytt6bnn9+IQMCQCAAQSFJDQACQCAAQcEASQ0AAkAgAEHhAEkNACABKQNoIAJ9QQApA7iMAYUiBEL/////D4MiBSABKQNgIAJ8QQApA7CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDeCACfSAAQciLAWopAwCFIgNC/////w+DIgQgASkDcCACfCAAQcCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQNIIAJ9QQApA6iMAYUiBEL/////D4MiBSABKQNAIAJ8QQApA6CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDWCACfSAAQdiLAWopAwCFIgNC/////w+DIgQgASkDUCACfCAAQdCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQMoIAJ9QQApA5iMAYUiBEL/////D4MiBSABKQMgIAJ8QQApA5CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDOCACfSAAQeiLAWopAwCFIgNC/////w+DIgQgASkDMCACfCAAQeCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQMIIAJ9QQApA4iMAYUiBEL/////D4MiBSABKQMAIAJ8QQApA4CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDGCACfSAAQfiLAWopAwCFIgNC/////w+DIgQgASkDECACfCAAQfCLAWopAwCFIgJCIIgiBX4iBkL/////D4MgA0IgiCIDIAJC/////w+DIgJ+fCAEIAJ+IgJCIIh8IgRCIIYgAkL/////D4OEIAZCIIggAyAFfnwgBEIgiHyFfCICQiWIIAKFQvnz3fGZ8pmrFn4iAkIgiCAChQv8CgQBfwV+An8BfkEAIQMgASkDeCACfUEAKQP4jAGFIgRC/////w+DIgUgASkDcCACfEEAKQPwjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpA2ggAn1BACkD6IwBhSIEQv////8PgyIFIAEpA2AgAnxBACkD4IwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSABKQNYIAJ9QQApA9iMAYUiBEL/////D4MiBSABKQNQIAJ8QQApA9CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgASkDSCACfUEAKQPIjAGFIgRC/////w+DIgUgASkDQCACfEEAKQPAjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpAzggAn1BACkDuIwBhSIEQv////8PgyIFIAEpAzAgAnxBACkDsIwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSABKQMoIAJ9QQApA6iMAYUiBEL/////D4MiBSABKQMgIAJ8QQApA6CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgASkDGCACfUEAKQOYjAGFIgRC/////w+DIgUgASkDECACfEEAKQOQjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpAwggAn1BACkDiIwBhSIEQv////8PgyIFIAEpAwAgAnxBACkDgIwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSAArUKHla+vmLbem55/fnx8fHx8fHx8IgRCJYggBIVC+fPd8ZnymasWfiIEQiCIIASFIQQCQCAAQZABSA0AIABBBHZBeGohCQNAIAEgA2oiCkELaikDACACfSADQYiNAWopAwCFIgVC/////w+DIgYgCkEDaikDACACfCADQYCNAWopAwCFIgdCIIgiCH4iC0L/////D4MgBUIgiCIFIAdC/////w+DIgd+fCAGIAd+IgZCIIh8IgdCIIYgBkL/////D4OEIAtCIIggBSAIfnwgB0IgiHyFIAR8IQQgA0EQaiEDIAlBf2oiCQ0ACwsgASkDfyACfSAAQfiLAWopAwCFIgVC/////w+DIgYgASkDdyACfCAAQfCLAWopAwCFIgJCIIgiB34iCEL/////D4MgBUIgiCIFIAJC/////w+DIgJ+fCAGIAJ+IgJCIIh8IgZCIIYgAkL/////D4OEIAhCIIggBSAHfnwgBkIgiHyFIAR8IgJCJYggAoVC+fPd8ZnymasWfiICQiCIIAKFC98FAgF+AX8CQAJAQQApA4AKIgBQRQ0AQYAIIQFCACEADAELAkBBACkDoI4BIABSDQBBACEBDAELQQAhAUEAQq+v79e895Kg/gAgAH03A/iLAUEAIABCxZbr+djShYIofDcD8IsBQQBCj/Hjja2P9JhOIAB9NwPoiwFBACAAQqus+MXV79HQfHw3A+CLAUEAQtOt1LKShbW0nn8gAH03A9iLAUEAIABCl5r0jvWWvO3JAHw3A9CLAUEAQsWDgv2v/8SxayAAfTcDyIsBQQAgAELqi7OdyOb09UN8NwPAiwFBAELIv/rLnJveueQAIAB9NwO4iwFBACAAQoqjgd/Ume2sMXw3A7CLAUEAQvm57738+MKnHSAA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QQApA4CKATcDACACQQApA4iKATcDCCACQQApA5CKATcDECACQQApA5iKATcDGCACQQApA6CKATcDICACQQApA6iKATcDKCACQQApA7CKASIFNwMwIAJBACkDuIoBIgY3AzgCQAJAQQAoAoCOASIHQcAASQ0AIAJBACgCiI4BNgJAIAIgAkHAAGpBACgCmI4BQYCMASAHQX9qQQZ2IANBACgCnI4BIgAQAiADIABqIgBBeWopAwAhCCAAKQMJIQkgACkDGSEKIAApAykhCyAHQcCLAWopAwAhBSAAKQMBIQwgB0HIiwFqKQMAIQYgB0HQiwFqKQMAIQ0gACkDESEOIAdB2IsBaikDACEPIAdB4IsBaikDACEQIAApAyEhESAHQeiLAWopAwAhEiACKQMAIRMgAikDECEUIAIpAyAhFSACKQMwIRYgAikDCCEXIAIpAxghGCACKQMoIRkgAiACKQM4IAdB8IsBaikDACIafCAAKQMxIAdB+IsBaikDACIbhSIcQiCIIBxC/////w+Dfnw3AzggGSAQfCARIBKFIhFCIIggEUL/////D4N+fCERIBggDXwgDiAPhSIOQiCIIA5C/////w+DfnwhDiAXIAV8IAwgBoUiDEIgiCAMQv////8Pg358IQwgGyAWIAsgGoUiC0IgiCALQv////8Pg358fCELIBIgFSAKIBCFIhBCIIggEEL/////D4N+fHwhECAPIBQgCSANhSINQiCIIA1C/////w+Dfnx8IRIgBiATIAggBYUiBUIgiCAFQv////8Pg358fCEIDAELIAdBwI0BaiEdQcAAIAdrIR4gAkHAAGohAAJAAkACQCAHQThNDQAgHiEfDAELAkACQEE4IAdrQQN2QQFqQQdxIh8NACACQcAAaiEAIB4hHwwBCyACQcAAaiEAIB9BA3QiICEfA0AgACAdKQMANwMAIABBCGohACAdQQhqIR0gH0F4aiIfDQALQcAAIAcgIGprIR8LAkAgBw0AA0AgACAdKQMANwMAIABBCGogHUEIaikDADcDACAAQRBqIB1BEGopAwA3AwAgAEEYaiAdQRhqKQMANwMAIABBIGogHUEgaikDADcDACAAQShqIB1BKGopAwA3AwAgAEEwaiAdQTBqKQMANwMAIABBOGogHUE4aikDADcDACAAQcAAaiEAIB1BwABqIR0gH0FAaiIfQQdLDQALCyAfRQ0BCyAfQX9qISECQCAfQQdxIiBFDQAgH0F4cSEfA0AgACAdLQAAOgAAIABBAWohACAdQQFqIR0gIEF/aiIgDQALCyAhQQdJDQADQCAAIB0pAAA3AAAgAEEIaiEAIB1BCGohHSAfQXhqIh8NAAsLIAJBwABqIB5qIR1BgIwBIQACQAJAAkAgB0EISQ0AAkAgB0E4akEDdkEBakEHcSIfDQAMAgsgH0EDdCEgQYCMASEAA0AgHSAAKQMANwMAIB1BCGohHSAAQQhqIQAgH0F/aiIfDQALIAcgIGshBwsgB0UNAQJAAkAgB0EHcSIgDQAgByEfDAELIAdBeHEhHwNAIB0gAC0AADoAACAdQQFqIR0gAEEBaiEAICBBf2oiIA0ACwsgB0EISQ0BCwNAIB0gACkAADcAACAdQQhqIR0gAEEIaiEAIB9BeGoiHw0ACwsgA0EAKAKcjgFqIgBBeWopAwAhCiAAKQMJIRMgACkDGSEUIAApAykhCyAAKQMBIQwgACkDESEOIAApAyEhESACKQMAIRUgAikDECEWIAIpAyAhFyACKQMIIRggAikDQCENIAIpA0ghDyACKQMYIRkgAikDUCESIAIpA1ghCCACKQMoIRogAikDYCEQIAIpA2ghCSACIAYgAikDcCIbfCAAKQMxIAIpA3giBoUiHEIgiCAcQv////8Pg358NwM4IBogEHwgESAJhSIRQiCIIBFC/////w+DfnwhESAZIBJ8IA4gCIUiDkIgiCAOQv////8Pg358IQ4gGCANfCAMIA+FIgxCIIggDEL/////D4N+fCEMIAYgCyAbhSILQiCIIAtC/////w+DfiAFfHwhCyAJIBcgFCAQhSIFQiCIIAVC/////w+Dfnx8IRAgCCAWIBMgEoUiBUIgiCAFQv////8Pg358fCESIA8gFSAKIA2FIgVCIIggBUL/////D4N+fHwhCAsgAykDQyACKQM4hSIFQv////8PgyIGIAMpAzsgC4UiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDMyARhSIFQv////8PgyIGIAMpAysgEIUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDIyAOhSIFQv////8PgyIGIAMpAxsgEoUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDEyAMhSIFQv////8PgyIGIAMpAwsgCIUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgBEKHla+vmLbem55/fnx8fHwiBEIliCAEhUL5893xmfKZqxZ+IgRCIIggBIUhBAwBCyAEpyEAAkBBACkDoI4BIgRQDQACQCAAQRBLDQAgAEGACCAEEAUhBAwCCwJAIABBgAFLDQAgAEGACCAEEAYhBAwCCyAAQYAIIAQQByEEDAELAkAgAEEQSw0AIAAgA0IAEAUhBAwBCwJAIABBgAFLDQAgACADQgAQBiEEDAELIAAgA0IAEAchBAtBACAEQjiGIARCgP4Dg0IohoQgBEKAgPwHg0IYhiAEQoCAgPgPg0IIhoSEIARCCIhCgICA+A+DIARCGIhCgID8B4OEIARCKIhCgP4DgyAEQjiIhISENwOACiABJAALBgBBgIoBCwIACwvMAQEAQYAIC8QBuP5sOSOkS758AYEs9yGtHN7UbemDkJfbckCkpLezZx/LeeZOzMDleIJa0H3M/3IhuAhGdPdDJI7gNZDmgTomTDwoUruRwwDLiNBlixtTLqNxZEiXog35TjgZ70ap3qzYqPp2P+OcND/53LvHxwtPHYpR4EvNtFkxyJ9+ydl4c2TqxayDNNPrw8WBoP/6E2PrFw3dUbfw2knTFlUmKdRonisWvlh9R6H8j/i40XrQMc5FyzqPlRYEKK/X+8q7S0B+QAIAAA==",mG="5a2fbdbb",JY={name:gG,data:uG,hash:mG};let cG=new V,z9=null,rQ=new Uint8Array(8);function K0(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be given as two valid 32-bit long unsigned integers (lo + high).");return null}function l1(B,C,A){let v=new DataView(B);v.setUint32(0,C,!0),v.setUint32(4,A,!0)}function lG(B,C=0,A=0){if(K0(C))return Promise.reject(K0(C));if(K0(A))return Promise.reject(K0(A));if(z9===null)return x(cG,JY,8).then((v)=>{return z9=v,l1(rQ.buffer,C,A),z9.writeMemory(rQ),z9.calculate(B)});try{l1(rQ.buffer,C,A),z9.writeMemory(rQ);let v=z9.calculate(B);return Promise.resolve(v)}catch(v){return Promise.reject(v)}}function dG(B=0,C=0){if(K0(B))return Promise.reject(K0(B));if(K0(C))return Promise.reject(K0(C));return w(JY,8).then((A)=>{let v=new Uint8Array(8);l1(v.buffer,B,C),A.writeMemory(v),A.init();let h={init:()=>{return A.writeMemory(v),A.init(),h},update:(u)=>{return A.update(u),h},digest:(u)=>A.digest(u),save:()=>A.save(),load:(u)=>{return A.load(u),h},blockSize:512,digestSize:8};return h})}var nG="xxhash128",pG="AGFzbQEAAAABKwdgAAF/YAR/f39/AGAHf39/f39/fwBgA39/fgF+YAR/f39+AGAAAGABfwADDQwAAQIDBAQEBQYFAAUFBAEBAgIGDgJ/AUHAjgULfwBBwAkLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAcLSGFzaF9VcGRhdGUACApIYXNoX0ZpbmFsAAkNSGFzaF9HZXRTdGF0ZQAKDkhhc2hfQ2FsY3VsYXRlAAsKU1RBVEVfU0laRQMBCqBNDAUAQYAKC+QDAw9+AX8BfgJAIANFDQAgACkDMCEEIAApAzghBSAAKQMgIQYgACkDKCEHIAApAxAhCCAAKQMYIQkgACkDACEKIAApAwghCwNAIAUgAUEwaikDACIMfCACQThqKQMAIAFBOGopAwAiDYUiBUIgiCAFQv////8Pg358IQUgByABQSBqKQMAIg58IAJBKGopAwAgAUEoaikDACIPhSIHQiCIIAdC/////w+DfnwhByAJIAFBEGopAwAiEHwgAkEYaikDACABQRhqKQMAIhGFIglCIIggCUL/////D4N+fCEJIAsgASkDACISfCACQQhqIhMpAwAgAUEIaikDACIUhSILQiCIIAtC/////w+DfnwhCyACQTBqKQMAIAyFIgxCIIggDEL/////D4N+IAR8IA18IQQgAkEgaikDACAOhSIMQiCIIAxC/////w+DfiAGfCAPfCEGIAJBEGopAwAgEIUiDEIgiCAMQv////8Pg34gCHwgEXwhCCACKQMAIBKFIgxCIIggDEL/////D4N+IAp8IBR8IQogAUHAAGohASATIQIgA0F/aiIDDQALIAAgCTcDGCAAIAo3AwAgACALNwMIIAAgBzcDKCAAIAg3AxAgACAFNwM4IAAgBjcDICAAIAQ3AzALC94CAgF/AX4CQCAEIAIgASgCACIHayICSQ0AIAAgAyAFIAdBA3RqIAIQASAAIAUgBmoiBykDACAAKQMAIghCL4iFIAiFQrHz3fEJfjcDACAAIAcpAwggACkDCCIIQi+IhSAIhUKx893xCX43AwggACAHKQMQIAApAxAiCEIviIUgCIVCsfPd8Ql+NwMQIAAgBykDGCAAKQMYIghCL4iFIAiFQrHz3fEJfjcDGCAAIAcpAyAgACkDICIIQi+IhSAIhUKx893xCX43AyAgACAHKQMoIAApAygiCEIviIUgCIVCsfPd8Ql+NwMoIAAgBykDMCAAKQMwIghCL4iFIAiFQrHz3fEJfjcDMCAAIAcpAzggACkDOCIIQi+IhSAIhUKx893xCX43AzggACADIAJBBnRqIAUgBCACayIHEAEgASAHNgIADwsgACADIAUgB0EDdGogBBABIAEgByAEajYCAAvtAwEFfiABKQM4IAApAziFIgNC/////w+DIgQgASkDMCAAKQMwhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMoIAApAyiFIgNC/////w+DIgQgASkDICAAKQMghSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMYIAApAxiFIgNC/////w+DIgQgASkDECAAKQMQhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMIIAApAwiFIgNC/////w+DIgQgASkDACAAKQMAhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSACfHx8fCICQiWIIAKFQvnz3fGZ8pmrFn4iAkIgiCAChQu6CAIFfgN/AkAgAUEJSQ0AIAAgAUH4iwFqKQMAIgQgAikDOCACKQMwhSADfIUiBUL/////D4NC95Svrwh+IAVCgICAgHCDfEEAKQOAjAEgAikDKCACKQMghSADfYUgBIUiA0IgiCIEQrHz3fEJfnwgBEKHla+vCH4iBEIgiHwgBEL/////D4MgA0L/////D4MiA0Kx893xCX58IANCh5Wvrwh+IgRCIIh8IgVCIIh8IgNCOIYgA0KA/gODQiiGhCADQoCA/AeDQhiGIANCgICA+A+DQgiGhIQgA0IIiEKAgID4D4MgA0IYiEKAgPwHg4QgA0IoiEKA/gODIANCOIiEhIQgBEL/////D4MgAUF/aq1CNoaEIAVCIIZ8hSIEQiCIIgVCz9bTvgJ+IgZC/////w+DIARC/////w+DIgRCvdzKlQx+fCAEQs/W074CfiIEQiCIfCIHQiCGIghCJYggCCAEQv////8Pg4SFQvnz3fGZ8pmrFn4iBEIgiCAEhTcDACAAIAVCvdzKlQx+IANCz9bTvtLHq9lCfnwgBkIgiHwgB0IgiHwiA0IliCADhUL5893xmfKZqxZ+IgNCIIggA4U3AwgPCwJAIAFBBEkNACAAIAIpAxggAikDEIUgA6ciAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnKtQiCGIAOFfCABQfyLAWo1AgBCIIZBADUCgIwBhIUiA0IgiCIEIAFBAnRBh5Wvr3hqrSIFfiIGQiCIIARCsfPd8Ql+fCAGQv////8PgyADQv////8PgyIDQrHz3fEJfnwgAyAFfiIDQiCIfCIEQiCIfCAEQiCGIANC/////w+DhCIEQgGGfCIDQiWIIAOFQvnz3fGZ8pmrFn4iBUIgiCAFhTcDCCAAIANCA4ggBIUiA0IjiCADhUKlvuP00YyH2Z9/fiIDQhyIIAOFNwMADwsCQCABRQ0AIAAgAigCBCACKAIAc60gA3wiBEIhiEEALQCAjAFBEHQgAUEIdHIiCSABQQF2QYCMAWotAABBGHRyIgogAUH/iwFqLQAAIgFyIguthSAEhULP1tO+0ser2UJ+IgRCHYggBIVC+fPd8Zn2masWfiIEQiCIIASFNwMAIAAgAigCDCACKAIIc60gA30iA0IhiCABQRh0IAtBgP4DcUEIdHIgCUEIdkGA/gNxIApBGHZyckENd62FIAOFQs/W077Sx6vZQn4iA0IdiCADhUL5893xmfaZqxZ+IgNCIIggA4U3AwgPCyAAIAIpA1AgAikDWIUgA4UiBEIhiCAEhULP1tO+0ser2UJ+IgRCHYggBIVC+fPd8Zn2masWfiIEQiCIIASFNwMIIAAgAikDQCACKQNIhSADhSIDQiGIIAOFQs/W077Sx6vZQn4iA0IdiCADhUL5893xmfaZqxZ+IgNCIIggA4U3AwALwwoBCn4gAa0iBEKHla+vmLbem55/fiEFAkACQCABQSFPDQBCACEGDAELQgAhBwJAIAFBwQBJDQBCACEHAkAgAUHhAEkNACACQfgAaikDACADfSABQciLAWopAwAiCIUiB0L/////D4MiCSACKQNwIAN8IAFBwIsBaikDACIKhSILQiCIIgx+Ig1CIIggB0IgiCIHIAx+fCANQv////8PgyAHIAtC/////w+DIgt+fCAJIAt+IgdCIIh8IglCIIh8QQApA7iMASILQQApA7CMASIMfIUgCUIghiAHQv////8Pg4SFIQcgAkHoAGopAwAgA30gC4UiCUL/////D4MiCyACKQNgIAN8IAyFIgxCIIgiDX4iBkL/////D4MgCUIgiCIJIAxC/////w+DIgx+fCALIAx+IgtCIIh8IgxCIIYgC0L/////D4OEIAZCIIggCSANfnwgDEIgiHyFIAV8IAggCnyFIQULIAJB2ABqKQMAIAN9IAFB2IsBaikDACIIhSIJQv////8PgyIKIAIpA1AgA3wgAUHQiwFqKQMAIguFIgxCIIgiDX4iBkL/////D4MgCUIgiCIJIAxC/////w+DIgx+fCAKIAx+IgpCIIh8IgxCIIYgCkL/////D4OEIAZCIIggCSANfnwgDEIgiHyFIAd8QQApA6iMASIJQQApA6CMASIKfIUhByACQcgAaikDACADfSAJhSIJQv////8PgyIMIAIpA0AgA3wgCoUiCkIgiCINfiIGQv////8PgyAJQiCIIgkgCkL/////D4MiCn58IAwgCn4iCkIgiHwiDEIghiAKQv////8Pg4QgBkIgiCAJIA1+fCAMQiCIfIUgBXwgCCALfIUhBQsgAkE4aikDACADfSABQeiLAWopAwAiCIUiCUL/////D4MiCiACKQMwIAN8IAFB4IsBaikDACILhSIMQiCIIg1+IgZC/////w+DIAlCIIgiCSAMQv////8PgyIMfnwgCiAMfiIKQiCIfCIMQiCGIApC/////w+DhCAGQiCIIAkgDX58IAxCIIh8hSAHfEEAKQOYjAEiB0EAKQOQjAEiCXyFIQYgAkEoaikDACADfSAHhSIHQv////8PgyIKIAIpAyAgA3wgCYUiCUIgiCIMfiINQv////8PgyAHQiCIIgcgCUL/////D4MiCX58IAogCX4iCUIgiHwiCkIghiAJQv////8Pg4QgDUIgiCAHIAx+fCAKQiCIfIUgBXwgCCALfIUhBQsgACACQRhqKQMAIAN9IAFB+IsBaikDACIHhSIIQv////8PgyIJIAIpAxAgA3wgAUHwiwFqKQMAIgqFIgtCIIgiDH4iDUL/////D4MgCEIgiCIIIAtC/////w+DIgt+fCAJIAt+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggCCAMfnwgC0IgiHyFIAZ8QQApA4iMASIIQQApA4CMASIJfIUiCyACQQhqKQMAIAN9IAiFIghC/////w+DIgwgAikDACADfCAJhSIJQiCIIg1+IgZC/////w+DIAhCIIgiCCAJQv////8PgyIJfnwgDCAJfiIJQiCIfCIMQiCGIAlC/////w+DhCAGQiCIIAggDX58IAxCIIh8hSAFfCAHIAp8hSIFfCIHQiWIIAeFQvnz3fGZ8pmrFn4iB0IgiCAHhTcDACAAQgAgBUKHla+vmLbem55/fiAEIAN9Qs/W077Sx6vZQn58IAtC49zKlfzO8vWFf358IgNCJYggA4VC+fPd8ZnymasWfiIDQiCIIAOFfTcDCAuhDwMBfxR+An9BACEEIAJB+ABqKQMAIAN9QQApA/iMASIFhSIGQv////8PgyIHIAIpA3AgA3xBACkD8IwBIgiFIglCIIgiCn4iC0L/////D4MgBkIgiCIGIAlC/////w+DIgl+fCAHIAl+IgdCIIh8IglCIIYgB0L/////D4OEIAtCIIggBiAKfnwgCUIgiHyFIAJB2ABqKQMAIAN9QQApA9iMASIHhSIGQv////8PgyIJIAIpA1AgA3xBACkD0IwBIgqFIgtCIIgiDH4iDUL/////D4MgBkIgiCIGIAtC/////w+DIgt+fCAJIAt+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggBiAMfnwgC0IgiHyFIAJBOGopAwAgA31BACkDuIwBIgmFIgZC/////w+DIgsgAikDMCADfEEAKQOwjAEiDIUiDUIgiCIOfiIPQv////8PgyAGQiCIIgYgDUL/////D4MiDX58IAsgDX4iC0IgiHwiDUIghiALQv////8Pg4QgD0IgiCAGIA5+fCANQiCIfIUgAkEYaikDACADfUEAKQOYjAEiC4UiBkL/////D4MiDSACKQMQIAN8QQApA5CMASIOhSIPQiCIIhB+IhFC/////w+DIAZCIIgiBiAPQv////8PgyIPfnwgDSAPfiINQiCIfCIPQiCGIA1C/////w+DhCARQiCIIAYgEH58IA9CIIh8hUEAKQOIjAEiDUEAKQOAjAEiD3yFfEEAKQOojAEiEEEAKQOgjAEiEXyFfEEAKQPIjAEiEkEAKQPAjAEiE3yFfEEAKQPojAEiFEEAKQPgjAEiFXyFIgZCJYggBoVC+fPd8ZnymasWfiIGQiCIIAaFIQYgAkHoAGopAwAgA30gFIUiFEL/////D4MiFiACKQNgIAN8IBWFIhVCIIgiF34iGEL/////D4MgFEIgiCIUIBVC/////w+DIhV+fCAWIBV+IhVCIIh8IhZCIIYgFUL/////D4OEIBhCIIggFCAXfnwgFkIgiHyFIAJByABqKQMAIAN9IBKFIhJC/////w+DIhQgAikDQCADfCAThSITQiCIIhV+IhZC/////w+DIBJCIIgiEiATQv////8PgyITfnwgFCATfiITQiCIfCIUQiCGIBNC/////w+DhCAWQiCIIBIgFX58IBRCIIh8hSACQShqKQMAIAN9IBCFIhBC/////w+DIhIgAikDICADfCARhSIRQiCIIhN+IhRC/////w+DIBBCIIgiECARQv////8PgyIRfnwgEiARfiIRQiCIfCISQiCGIBFC/////w+DhCAUQiCIIBAgE358IBJCIIh8hSACQQhqKQMAIAN9IA2FIg1C/////w+DIhAgAikDACADfCAPhSIPQiCIIhF+IhJC/////w+DIA1CIIgiDSAPQv////8PgyIPfnwgECAPfiIPQiCIfCIQQiCGIA9C/////w+DhCASQiCIIA0gEX58IBBCIIh8hSABrSIPQoeVr6+Ytt6bnn9+fCALIA58hXwgCSAMfIV8IAcgCnyFfCAFIAh8hSIFQiWIIAWFQvnz3fGZ8pmrFn4iBUIgiCAFhSEFAkAgAUGgAUgNACABQQV2QXxqIRkDQCACIARqIhpBG2opAwAgA30gBEGYjQFqKQMAIgeFIghC/////w+DIgkgGkETaikDACADfCAEQZCNAWopAwAiCoUiC0IgiCIMfiINQv////8PgyAIQiCIIgggC0L/////D4MiC358IAkgC34iCUIgiHwiC0IghiAJQv////8Pg4QgDUIgiCAIIAx+fCALQiCIfIUgBnwgBEGIjQFqKQMAIgggBEGAjQFqKQMAIgl8hSEGIBpBC2opAwAgA30gCIUiCEL/////D4MiCyAaQQNqKQMAIAN8IAmFIglCIIgiDH4iDUL/////D4MgCEIgiCIIIAlC/////w+DIgl+fCALIAl+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggCCAMfnwgC0IgiHyFIAV8IAcgCnyFIQUgBEEgaiEEIBlBf2oiGQ0ACwsgACACQf8AaikDACADfCABQeiLAWopAwAiB4UiCEL/////D4MiCSACKQN3IAN9IAFB4IsBaikDACIKhSILQiCIIgx+Ig1C/////w+DIAhCIIgiCCALQv////8PgyILfnwgCSALfiIJQiCIfCILQiCGIAlC/////w+DhCANQiCIIAggDH58IAtCIIh8hSAGfCABQfiLAWopAwAiBiABQfCLAWopAwAiCHyFIgkgAkHvAGopAwAgA3wgBoUiBkL/////D4MiCyACKQNnIAN9IAiFIghCIIgiDH4iDUL/////D4MgBkIgiCIGIAhC/////w+DIgh+fCALIAh+IghCIIh8IgtCIIYgCEL/////D4OEIA1CIIggBiAMfnwgC0IgiHyFIAV8IAcgCnyFIgZ8IgVCJYggBYVC+fPd8ZnymasWfiIFQiCIIAWFNwMAIABCACAGQoeVr6+Ytt6bnn9+IA8gA31Cz9bTvtLHq9lCfnwgCULj3MqV/M7y9YV/fnwiA0IliCADhUL5893xmfKZqxZ+IgNCIIggA4V9NwMIC98FAgF+AX8CQAJAQQApA4AKIgBQRQ0AQYAIIQFCACEADAELAkBBACkDoI4BIABSDQBBACEBDAELQQAhAUEAQq+v79e895Kg/gAgAH03A/iLAUEAIABCxZbr+djShYIofDcD8IsBQQBCj/Hjja2P9JhOIAB9NwPoiwFBACAAQqus+MXV79HQfHw3A+CLAUEAQtOt1LKShbW0nn8gAH03A9iLAUEAIABCl5r0jvWWvO3JAHw3A9CLAUEAQsWDgv2v/8SxayAAfTcDyIsBQQAgAELqi7OdyOb09UN8NwPAiwFBAELIv/rLnJveueQAIAB9NwO4iwFBACAAQoqjgd/Ume2sMXw3A7CLAUEAQvm57738+MKnHSAAfTcDqIsBQQAgAEKo9dv7s5ynmj98NwOgiwFBAEK4sry3lNW31lggAH03A5iLAUEAIABC8cihuqm0w/zOAHw3A5CLAUEAQoihl9u445SXo38gAH03A4iL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AkHAAGogDGohC0GAjAEhAAJAAkACQCAHQQhJDQACQCAHQThqQQN2QQFqQQdxIg0NAAwCCyANQQN0IQ5BgIwBIQADQCALIAApAwA3AwAgC0EIaiELIABBCGohACANQX9qIg0NAAsgByAOayEHCyAHRQ0BAkACQCAHQQdxIg4NACAHIQ0MAQsgB0F4cSENA0AgCyAALQAAOgAAIAtBAWohCyAAQQFqIQAgDkF/aiIODQALCyAHQQhJDQELA0AgCyAAKQAANwAAIAtBCGohCyAAQQhqIQAgDUF4aiINDQALCyACIAIpAwggAikDQCIIfCADQQAoApyOAWoiACkDASACKQNIIgmFIgpCIIggCkL/////D4N+fDcDCCACIAIpAxggAikDUCIKfCAAKQMRIAIpA1giEIUiEUIgiCARQv////8Pg358NwMYIAIgECAKIAApAwmFIgpCIIggCkL/////D4N+IAIpAxB8fDcDECACIAkgCCAAQXlqKQMAhSIIQiCIIAhC/////w+DfiACKQMAfHw3AwAgACkDGSEIIAIpAyAhCSACIAIpAyggAikDYCIKfCAAKQMhIAIpA2giEIUiEUIgiCARQv////8Pg358NwMoIAIgECAJIAggCoUiCEIgiCAIQv////8Pg358fDcDICACIAYgAikDcCIIfCAAKQMxIAIpA3giBoUiCUIgiCAJQv////8Pg358NwM4IAIgBiAIIAApAymFIghCIIggCEL/////D4N+IAV8fDcDMAsgAiACIANBC2ogBEKHla+vmLbem55/fhADNwNAIAIgAiADQQAoApyOAWpBdWogBELP1tO+0ser2UJ+Qn+FEAM3A0gMAQsgBKchAAJAQQApA6COASIEUA0AAkAgAEEQSw0AIAJBwABqIABBgAggBBAEDAILAkAgAEGAAUsNACACQcAAaiAAQYAIIAQQBQwCCyACQcAAaiAAQYAIIAQQBgwBCwJAIABBEEsNACACQcAAaiAAIANCABAEDAELAkAgAEGAAUsNACACQcAAaiAAIANCABAFDAELIAJBwABqIAAgA0IAEAYLQQAgAikDcDcDuApBACACKQNgNwOoCkEAIAIpA1A3A5gKQQAgAkH4AGopAwA3A8AKQQAgAkHoAGopAwA3A7AKQQAgAkHYAGopAwA3A6AKQQAgAikDSCIEQjiGIARCgP4Dg0IohoQgBEKAgPwHg0IYhiAEQoCAgPgPg0IIhoSEIARCCIhCgICA+A+DIARCGIhCgID8B4OEIARCKIhCgP4DgyAEQjiIhISEIgQ3A4AKQQAgBDcDkApBACACKQNAIgRCOIYgBEKA/gODQiiGhCAEQoCA/AeDQhiGIARCgICA+A+DQgiGhIQgBEIIiEKAgID4D4MgBEIYiEKAgPwHg4QgBEIoiEKA/gODIARCOIiEhIQ3A4gKIAEkAAsGAEGAigELAgALC8wBAQBBgAgLxAG4/mw5I6RLvnwBgSz3Ia0c3tRt6YOQl9tyQKSkt7NnH8t55k7MwOV4glrQfcz/ciG4CEZ090MkjuA1kOaBOiZMPChSu5HDAMuI0GWLG1Muo3FkSJeiDflOOBnvRqnerNio+nY/45w0P/ncu8fHC08dilHgS820WTHIn37J2XhzZOrFrIM00+vDxYGg//oTY+sXDd1Rt/DaSdMWVSYp1GieKxa+WH1HofyP+LjRetAxzkXLOo+VFgQor9f7yrtLQH5AAgAA",iG="b9ab74e2",zY={name:nG,data:pG,hash:iG};let oG=new V,X9=null,aQ=new Uint8Array(8);function G0(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be given as two valid 32-bit long unsigned integers (lo + high).");return null}function d1(B,C,A){let v=new DataView(B);v.setUint32(0,C,!0),v.setUint32(4,A,!0)}function rG(B,C=0,A=0){if(G0(C))return Promise.reject(G0(C));if(G0(A))return Promise.reject(G0(A));if(X9===null)return x(oG,zY,16).then((v)=>{return X9=v,d1(aQ.buffer,C,A),X9.writeMemory(aQ),X9.calculate(B)});try{d1(aQ.buffer,C,A),X9.writeMemory(aQ);let v=X9.calculate(B);return Promise.resolve(v)}catch(v){return Promise.reject(v)}}function aG(B=0,C=0){if(G0(B))return Promise.reject(G0(B));if(G0(C))return Promise.reject(G0(C));return w(zY,16).then((A)=>{let v=new Uint8Array(8);d1(v.buffer,B,C),A.writeMemory(v),A.init();let h={init:()=>{return A.writeMemory(v),A.init(),h},update:(u)=>{return A.update(u),h},digest:(u)=>A.digest(u),save:()=>A.save(),load:(u)=>{return A.load(u),h},blockSize:512,digestSize:16};return h})}var sG="ripemd160",tG="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",eG="6abbce74",XY={name:sG,data:tG,hash:eG};let Z$=new V,sQ=null;function Q$(B){if(sQ===null)return x(Z$,XY,20).then((C)=>{return sQ=C,sQ.calculate(B)});try{let C=sQ.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function Y$(){return w(XY,20).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:20};return C})}function J$(B,C){let{blockSize:A}=B,v=P(C);if(v.length>A){B.update(v);let h=B.digest("binary");return B.init(),h}return new Uint8Array(v.buffer,v.byteOffset,v.length)}function z$(B,C){B.init();let{blockSize:A}=B,v=J$(B,C),h=new Uint8Array(A);h.set(v);let u=new Uint8Array(A);for(let o=0;o<A;o++){let JZ=h[o];u[o]=JZ^92,h[o]=JZ^54}B.update(h);let d={init:()=>{return B.init(),B.update(h),d},update:(o)=>{return B.update(o),d},digest:(o)=>{let JZ=B.digest("binary");return B.init(),B.update(u),B.update(JZ),B.digest(o)},save:()=>{throw Error("save() not supported")},load:()=>{throw Error("load() not supported")},blockSize:B.blockSize,digestSize:B.digestSize};return d}function WY(B,C){if(!B||!B.then)throw Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');return B.then((A)=>z$(A,C))}function X$(B,C,A,v,h){return X(this,void 0,void 0,function*(){let u=new Uint8Array(v),d=new Uint8Array(C.length+4),o=new DataView(d.buffer),JZ=P(C),TZ=new Uint8Array(JZ.buffer,JZ.byteOffset,JZ.length);d.set(TZ);let yZ=0,kZ=B.digestSize,AZ=Math.ceil(v/kZ),j8=null,rZ=null;for(let $0=1;$0<=AZ;$0++){o.setUint32(C.length,$0),B.init(),B.update(d),j8=B.digest("binary"),rZ=j8.slice();for(let C8=1;C8<A;C8++){B.init(),B.update(rZ),rZ=B.digest("binary");for(let H0=0;H0<kZ;H0++)j8[H0]^=rZ[H0]}u.set(j8.subarray(0,v-yZ),yZ),yZ+=kZ}if(h==="binary")return u;let n9=new Uint8Array(v*2);return O(n9,u,v)})}let W$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!B.hashFunction||!B.hashFunction.then)throw Error('Invalid hash function is provided! Usage: pbkdf2("password", "salt", 1000, 32, createSHA1()).');if(!Number.isInteger(B.iterations)||B.iterations<1)throw Error("Iterations should be a positive number");if(!Number.isInteger(B.hashLength)||B.hashLength<1)throw Error("Hash length should be a positive number");if(B.outputType===void 0)B.outputType="hex";if(!["hex","binary"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary']`)};function n1(B){return X(this,void 0,void 0,function*(){W$(B);let C=yield WY(B.hashFunction,B.password);return X$(C,B.salt,B.iterations,B.hashLength,B.outputType)})}var V$="scrypt",K$="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cyICajYCOCAAIAAoAjwgAiAKakESdyAGc2o2AjwLvxIDFX8Bfg5/AkAgAkUNACAAQQd0IgNBQGoiBEEAKAKACCIFIAMgAmwiBmogAyABbGoiByADaiIIaiEJIAAgAkEHdCIKIAFBB3RqIgtsIQwgACALQYABamwhDSAAQQV0IgtBASALQQFLGyILQWBxIQ4gC0EBcSEPIAdBeGohECAHQXBqIREgB0FoaiESIAdBYGohEyAHQVhqIRQgB0FQaiEVIAdBSGohFiAHQUBqIRcgAa1Cf3whGCAEIAdqIRkgByAAQQh0IhpqIRsgACAKQYABamwhHCALQQRJIR1BACEeQQAhHwNAQQAoAoAIIiAgAyAfbGohIQJAIABFDQBBACEiAkAgHQ0AICAgHmohI0EAIQtBACEiA0AgByALaiIEICMgC2oiJCgCADYCACAEQQRqICRBBGooAgA2AgAgBEEIaiAkQQhqKAIANgIAIARBDGogJEEMaigCADYCACALQRBqIQsgDiAiQQRqIiJHDQALCyAPRQ0AIAcgIkECdCILaiAhIAtqKAIANgIACwJAIAFFDQBBACElIBwhIyAGISYDQCAFISQgACEiAkACQCAADQAgGyAXKQMANwMAIBsgFikDADcDCCAbIBUpAwA3AxAgGyAUKQMANwMYIBsgEykDADcDICAbIBIpAwA3AyggGyARKQMANwMwIBsgECkDADcDOAwBCwNAICQgJmoiCyAkIAxqIgQpAwA3AwAgC0EIaiAEQQhqKQMANwMAIAtBEGogBEEQaikDADcDACALQRhqIARBGGopAwA3AwAgC0EgaiAEQSBqKQMANwMAIAtBKGogBEEoaikDADcDACALQTBqIARBMGopAwA3AwAgC0E4aiAEQThqKQMANwMAIAtBwABqIARBwABqKQMANwMAIAtByABqIARByABqKQMANwMAIAtB0ABqIARB0ABqKQMANwMAIAtB2ABqIARB2ABqKQMANwMAIAtB4ABqIARB4ABqKQMANwMAIAtB6ABqIARB6ABqKQMANwMAIAtB8ABqIARB8ABqKQMANwMAIAtB+ABqIARB+ABqKQMANwMAICRBgAFqISQgIkF/aiIiDQALIAcgCCAbIAAQAiAFISQgACEiA0AgJCAjaiILICQgDWoiBCkDADcDACALQQhqIARBCGopAwA3AwAgC0EQaiAEQRBqKQMANwMAIAtBGGogBEEYaikDADcDACALQSBqIARBIGopAwA3AwAgC0EoaiAEQShqKQMANwMAIAtBMGogBEEwaikDADcDACALQThqIARBOGopAwA3AwAgC0HAAGogBEHAAGopAwA3AwAgC0HIAGogBEHIAGopAwA3AwAgC0HQAGogBEHQAGopAwA3AwAgC0HYAGogBEHYAGopAwA3AwAgC0HgAGogBEHgAGopAwA3AwAgC0HoAGogBEHoAGopAwA3AwAgC0HwAGogBEHwAGopAwA3AwAgC0H4AGogBEH4AGopAwA3AwAgJEGAAWohJCAiQX9qIiINAAsLIAggByAbIAAQAiAjIBpqISMgJiAaaiEmICVBAmoiJSABSQ0AC0EAISUDQAJAAkAgAA0AIBsgFykDADcDACAbIBYpAwA3AwggGyAVKQMANwMQIBsgFCkDADcDGCAbIBMpAwA3AyAgGyASKQMANwMoIBsgESkDADcDMCAbIBApAwA3AzgMAQsgACAKIBkpAgAgGIOnQQd0amwhJiAFISQgACEiA0AgJCAMaiILIAspAwAgJCAmaiIEKQMAhTcDACALQQhqIiMgIykDACAEQQhqKQMAhTcDACALQRBqIiMgIykDACAEQRBqKQMAhTcDACALQRhqIiMgIykDACAEQRhqKQMAhTcDACALQSBqIiMgIykDACAEQSBqKQMAhTcDACALQShqIiMgIykDACAEQShqKQMAhTcDACALQTBqIiMgIykDACAEQTBqKQMAhTcDACALQThqIiMgIykDACAEQThqKQMAhTcDACALQcAAaiIjICMpAwAgBEHAAGopAwCFNwMAIAtByABqIiMgIykDACAEQcgAaikDAIU3AwAgC0HQAGoiIyAjKQMAIARB0ABqKQMAhTcDACALQdgAaiIjICMpAwAgBEHYAGopAwCFNwMAIAtB4ABqIiMgIykDACAEQeAAaikDAIU3AwAgC0HoAGoiIyAjKQMAIARB6ABqKQMAhTcDACALQfAAaiIjICMpAwAgBEHwAGopAwCFNwMAIAtB+ABqIgsgCykDACAEQfgAaikDAIU3AwAgJEGAAWohJCAiQX9qIiINAAsgByAIIBsgABACIAAgCiAJKQIAIBiDp0EHdGpsISYgBSEkIAAhIgNAICQgDWoiCyALKQMAICQgJmoiBCkDAIU3AwAgC0EIaiIjICMpAwAgBEEIaikDAIU3AwAgC0EQaiIjICMpAwAgBEEQaikDAIU3AwAgC0EYaiIjICMpAwAgBEEYaikDAIU3AwAgC0EgaiIjICMpAwAgBEEgaikDAIU3AwAgC0EoaiIjICMpAwAgBEEoaikDAIU3AwAgC0EwaiIjICMpAwAgBEEwaikDAIU3AwAgC0E4aiIjICMpAwAgBEE4aikDAIU3AwAgC0HAAGoiIyAjKQMAIARBwABqKQMAhTcDACALQcgAaiIjICMpAwAgBEHIAGopAwCFNwMAIAtB0ABqIiMgIykDACAEQdAAaikDAIU3AwAgC0HYAGoiIyAjKQMAIARB2ABqKQMAhTcDACALQeAAaiIjICMpAwAgBEHgAGopAwCFNwMAIAtB6ABqIiMgIykDACAEQegAaikDAIU3AwAgC0HwAGoiIyAjKQMAIARB8ABqKQMAhTcDACALQfgAaiILIAspAwAgBEH4AGopAwCFNwMAICRBgAFqISQgIkF/aiIiDQALCyAIIAcgGyAAEAIgJUECaiIlIAFJDQALCwJAIABFDQBBACEiAkAgHQ0AICAgHmohI0EAIQtBACEiA0AgIyALaiIEIAcgC2oiJCgCADYCACAEQQRqICRBBGooAgA2AgAgBEEIaiAkQQhqKAIANgIAIARBDGogJEEMaigCADYCACALQRBqIQsgDiAiQQRqIiJHDQALCyAPRQ0AICEgIkECdCILaiAHIAtqKAIANgIACyAeIANqIR4gH0EBaiIfIAJHDQALCws=",G$="b32721f8",$$={name:V$,data:K$,hash:G$};function H$(B){return X(this,void 0,void 0,function*(){let{costFactor:C,blockSize:A,parallelism:v,hashLength:h}=B,u=ZY(),d=yield n1({password:B.password,salt:B.salt,iterations:1,hashLength:128*A*v,hashFunction:u,outputType:"binary"}),o=yield w($$,0),JZ=128*A*C,TZ=256*A;o.setMemorySize(d.length+JZ+TZ),o.writeMemory(d,0),o.getExports().scrypt(A,C,v);let yZ=o.getMemory().subarray(0,128*A*v),kZ=yield n1({password:B.password,salt:yZ,iterations:1,hashLength:h,hashFunction:u,outputType:"binary"});if(B.outputType==="hex"){let AZ=new Uint8Array(h*2);return O(AZ,kZ,h)}return kZ})}let q$=(B)=>B&&!(B&B-1),U$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!Number.isInteger(B.blockSize)||B.blockSize<1)throw Error("Block size should be a positive number");if(!Number.isInteger(B.costFactor)||B.costFactor<2||!q$(B.costFactor))throw Error("Cost factor should be a power of 2, greater than 1");if(!Number.isInteger(B.parallelism)||B.parallelism<1)throw Error("Parallelism should be a positive number");if(!Number.isInteger(B.hashLength)||B.hashLength<1)throw Error("Hash length should be a positive number.");if(B.outputType===void 0)B.outputType="hex";if(!["hex","binary"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary']`)};function N$(B){return X(this,void 0,void 0,function*(){return U$(B),H$(B)})}var B$="bcrypt",j$="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",F$="8bd8822d",VY={name:B$,data:j$,hash:F$};function M$(B){return X(this,void 0,void 0,function*(){let{costFactor:C,password:A,salt:v}=B,h=yield w(VY,0);h.writeMemory(P(v),0);let u=P(A);h.writeMemory(u,16);let d=B.outputType==="encoded"?1:0;h.getExports().bcrypt(u.length,C,d);let o=h.getMemory();if(B.outputType==="encoded")return N(o,60);if(B.outputType==="hex"){let JZ=new Uint8Array(48);return O(JZ,o,24)}return o.slice(0,24)})}let R$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!Number.isInteger(B.costFactor)||B.costFactor<4||B.costFactor>31)throw Error("Cost factor should be a number between 4 and 31");if(B.password=P(B.password),B.password.length<1)throw Error("Password should be at least 1 byte long");if(B.password.length>72)throw Error("Password should be at most 72 bytes long");if(B.salt=P(B.salt),B.salt.length!==16)throw Error("Salt should be 16 bytes long");if(B.outputType===void 0)B.outputType="encoded";if(!["hex","binary","encoded"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary', 'encoded']`)};function D$(B){return X(this,void 0,void 0,function*(){return R$(B),M$(B)})}let O$=(B)=>{if(!/^\$2[axyb]\$[0-3][0-9]\$[./A-Za-z0-9]{53}$/.test(B))return!1;if(B[4]==="0"&&Number(B[5])<4)return!1;if(B[4]==="3"&&Number(B[5])>1)return!1;return!0},P$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(B.hash===void 0||typeof B.hash!=="string")throw Error("Hash should be specified");if(B.hash.length!==60)throw Error("Hash should be 60 bytes long");if(!O$(B.hash))throw Error("Invalid hash");if(B.password=P(B.password),B.password.length<1)throw Error("Password should be at least 1 byte long");if(B.password.length>72)throw Error("Password should be at most 72 bytes long")};function L$(B){return X(this,void 0,void 0,function*(){P$(B);let{hash:C,password:A}=B,v=yield w(VY,0);v.writeMemory(P(C),0);let h=P(A);return v.writeMemory(h,60),!!v.getExports().bcrypt_verify(h.length)})}var C$="whirlpool",_$="AGFzbQEAAAABEQRgAAF/YAF/AGACf38AYAAAAwkIAAECAwEDAAEFBAEBAgIGDgJ/AUHQmwULfwBBgAgLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAMLSGFzaF9VcGRhdGUABApIYXNoX0ZpbmFsAAUNSGFzaF9HZXRTdGF0ZQAGDkhhc2hfQ2FsY3VsYXRlAAcKU1RBVEVfU0laRQMBCu0bCAUAQYAZC8wGAQl+IAApAwAhAUEAQQApA4CbASICNwPAmQEgACkDGCEDIAApAxAhBCAAKQMIIQVBAEEAKQOYmwEiBjcD2JkBQQBBACkDkJsBIgc3A9CZAUEAQQApA4ibASIINwPImQFBACABIAKFNwOAmgFBACAFIAiFNwOImgFBACAEIAeFNwOQmgFBACADIAaFNwOYmgEgACkDICEDQQBBACkDoJsBIgE3A+CZAUEAIAMgAYU3A6CaASAAKQMoIQRBAEEAKQOomwEiAzcD6JkBQQAgBCADhTcDqJoBIAApAzAhBUEAQQApA7CbASIENwPwmQFBACAFIASFNwOwmgEgACkDOCEJQQBBACkDuJsBIgU3A/iZAUEAIAkgBYU3A7iaAUEAQpjGmMb+kO6AzwA3A4CZAUHAmQFBgJkBEAJBgJoBQcCZARACQQBCtszKrp/v28jSADcDgJkBQcCZAUGAmQEQAkGAmgFBwJkBEAJBAELg+O70uJTDvTU3A4CZAUHAmQFBgJkBEAJBgJoBQcCZARACQQBCncDfluzlkv/XADcDgJkBQcCZAUGAmQEQAkGAmgFBwJkBEAJBAEKV7t2p/pO8pVo3A4CZAUHAmQFBgJkBEAJBgJoBQcCZARACQQBC2JKn0ZCW6LWFfzcDgJkBQcCZAUGAmQEQAkGAmgFBwJkBEAJBAEK9u8Ggv9nPgucANwOAmQFBwJkBQYCZARACQYCaAUHAmQEQAkEAQuTPhNr4tN/KWDcDgJkBQcCZAUGAmQEQAkGAmgFBwJkBEAJBAEL73fOz1vvFo55/NwOAmQFBwJkBQYCZARACQYCaAUHAmQEQAkEAQsrb/L3Q1dbBMzcDgJkBQcCZAUGAmQEQAkGAmgFBwJkBEAJBACACQQApA4CaASAAKQMAhYU3A4CbAUEAIAhBACkDiJoBIAApAwiFhTcDiJsBQQAgB0EAKQOQmgEgACkDEIWFNwOQmwFBACAGQQApA5iaASAAKQMYhYU3A5ibAUEAIAFBACkDoJoBIAApAyCFhTcDoJsBQQAgA0EAKQOomgEgACkDKIWFNwOomwFBACAEQQApA7CaASAAKQMwhYU3A7CbAUEAIAVBACkDuJoBIAApAziFhTcDuJsBC4YMCgF+AX8BfgF/AX4BfwF+AX8EfgN/IAAgACkDACICpyIDQf8BcUEDdEGQCGopAwBCOIkgACkDOCIEpyIFQQV2QfgPcUGQCGopAwCFQjiJIAApAzAiBqciB0ENdkH4D3FBkAhqKQMAhUI4iSAAKQMoIginIglBFXZB+A9xQZAIaikDAIVCOIkgACkDICIKQiCIp0H/AXFBA3RBkAhqKQMAhUI4iSAAKQMYIgtCKIinQf8BcUEDdEGQCGopAwCFQjiJIAApAxAiDEIwiKdB/wFxQQN0QZAIaikDAIVCOIkgACkDCCINQjiIp0EDdEGQCGopAwCFQjiJIAEpAwCFNwMAIAAgDaciDkH/AXFBA3RBkAhqKQMAQjiJIANBBXZB+A9xQZAIaikDAIVCOIkgBUENdkH4D3FBkAhqKQMAhUI4iSAHQRV2QfgPcUGQCGopAwCFQjiJIAhCIIinQf8BcUEDdEGQCGopAwCFQjiJIApCKIinQf8BcUEDdEGQCGopAwCFQjiJIAtCMIinQf8BcUEDdEGQCGopAwCFQjiJIAxCOIinQQN0QZAIaikDAIVCOIkgASkDCIU3AwggACAMpyIPQf8BcUEDdEGQCGopAwBCOIkgDkEFdkH4D3FBkAhqKQMAhUI4iSADQQ12QfgPcUGQCGopAwCFQjiJIAVBFXZB+A9xQZAIaikDAIVCOIkgBkIgiKdB/wFxQQN0QZAIaikDAIVCOIkgCEIoiKdB/wFxQQN0QZAIaikDAIVCOIkgCkIwiKdB/wFxQQN0QZAIaikDAIVCOIkgC0I4iKdBA3RBkAhqKQMAhUI4iSABKQMQhTcDECAAIAunIhBB/wFxQQN0QZAIaikDAEI4iSAPQQV2QfgPcUGQCGopAwCFQjiJIA5BDXZB+A9xQZAIaikDAIVCOIkgA0EVdkH4D3FBkAhqKQMAhUI4iSAEQiCIp0H/AXFBA3RBkAhqKQMAhUI4iSAGQiiIp0H/AXFBA3RBkAhqKQMAhUI4iSAIQjCIp0H/AXFBA3RBkAhqKQMAhUI4iSAKQjiIp0EDdEGQCGopAwCFQjiJIAEpAxiFNwMYIAAgCqciA0H/AXFBA3RBkAhqKQMAQjiJIBBBBXZB+A9xQZAIaikDAIVCOIkgD0ENdkH4D3FBkAhqKQMAhUI4iSAOQRV2QfgPcUGQCGopAwCFQjiJIAJCIIinQf8BcUEDdEGQCGopAwCFQjiJIARCKIinQf8BcUEDdEGQCGopAwCFQjiJIAZCMIinQf8BcUEDdEGQCGopAwCFQjiJIAhCOIinQQN0QZAIaikDAIVCOIkgASkDIIU3AyAgACAJQf8BcUEDdEGQCGopAwBCOIkgA0EFdkH4D3FBkAhqKQMAhUI4iSAQQQ12QfgPcUGQCGopAwCFQjiJIA9BFXZB+A9xQZAIaikDAIVCOIkgDUIgiKdB/wFxQQN0QZAIaikDAIVCOIkgAkIoiKdB/wFxQQN0QZAIaikDAIVCOIkgBEIwiKdB/wFxQQN0QZAIaikDAIVCOIkgBkI4iKdBA3RBkAhqKQMAhUI4iSABKQMohTcDKCAAIAdB/wFxQQN0QZAIaikDAEI4iSAJQQV2QfgPcUGQCGopAwCFQjiJIANBDXZB+A9xQZAIaikDAIVCOIkgEEEVdkH4D3FBkAhqKQMAhUI4iSAMQiCIp0H/AXFBA3RBkAhqKQMAhUI4iSANQiiIp0H/AXFBA3RBkAhqKQMAhUI4iSACQjCIp0H/AXFBA3RBkAhqKQMAhUI4iSAEQjiIp0EDdEGQCGopAwCFQjiJIAEpAzCFNwMwIAAgBUH/AXFBA3RBkAhqKQMAQjiJIAdBBXZB+A9xQZAIaikDAIVCOIkgCUENdkH4D3FBkAhqKQMAhUI4iSADQRV2QfgPcUGQCGopAwCFQjiJIAtCIIinQf8BcUEDdEGQCGopAwCFQjiJIAxCKIinQf8BcUEDdEGQCGopAwCFQjiJIA1CMIinQf8BcUEDdEGQCGopAwCFQjiJIAJCOIinQQN0QZAIaikDAIVCOIkgASkDOIU3AzgLXABBAEIANwPImwFBAEIANwO4mwFBAEIANwOwmwFBAEIANwOomwFBAEIANwOgmwFBAEIANwOYmwFBAEIANwOQmwFBAEIANwOImwFBAEIANwOAmwFBAEEANgLAmwELxgMBB39BACEBQQBBACkDyJsBIACtfDcDyJsBAkBBACgCwJsBIgJFDQBBACEBAkAgAiAAaiIDQcAAIANBwABJGyIEIAJB/wFxIgVNDQAgBCAFayIBQQNxIQYCQAJAIAQgBUF/c2pBA08NAEEAIQEMAQsgAUF8cSEHQQAhAQNAIAUgAWoiAkHAmgFqIAFBgBlqLQAAOgAAIAJBwZoBaiABQYEZai0AADoAACACQcKaAWogAUGCGWotAAA6AAAgAkHDmgFqIAFBgxlqLQAAOgAAIAcgAUEEaiIBRw0ACyAFIAFqIgUhAgsgBkUNACACQf8BcUEBaiECA0AgBUHAmgFqIAFBgBlqLQAAOgAAIAIiBUEBaiECIAFBAWohASAFIQUgBkF/aiIGDQALCwJAIANBP00NAEHAmgEQAUEAIQQLQQAgBDYCwJsBCwJAIAAgAWsiAkHAAEkNAANAIAFBgBlqEAEgAUHAAGohASACQUBqIgJBP0sNAAsLAkAgASAARg0AQQAgAjYCwJsBIAJFDQBBACECQQAhBQNAIAJBwJoBaiACIAFqQYAZai0AADoAAEEAKALAmwEgBUEBaiIFQf8BcSICSw0ACwsL/wMCBH8BfiMAQcAAayIAJAAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBGGpCADcDACAAQRBqQgA3AwAgAEIANwMIIABCADcDAEEAIQECQAJAQQAoAsCbASICRQ0AQQAhAwNAIAAgAWogAUHAmgFqLQAAOgAAIAFBAWohASACIANBAWoiA0H/AXFLDQALQQAgAkEBajYCwJsBIAAgAmpBgAE6AAAgAkFgcUEgRw0BIAAQASAAQgA3AxggAEIANwMQIABCADcDCCAAQgA3AwAMAQtBAEEBNgLAmwEgAEGAAToAAAtBACkDyJsBIQRBAEIANwPImwEgAEEAOgA2IABBADYBMiAAQgA3ASogAEEAOgApIABCADcAISAAQQA6ACAgACAEQgWIPAA+IAAgBEINiDwAPSAAIARCFYg8ADwgACAEQh2IPAA7IAAgBEIliDwAOiAAIARCLYg8ADkgACAEQjWIPAA4IAAgBEI9iDwANyAAIASnQQN0OgA/IAAQAUEAQQApA4CbATcDgBlBAEEAKQOImwE3A4gZQQBBACkDkJsBNwOQGUEAQQApA5ibATcDmBlBAEEAKQOgmwE3A6AZQQBBACkDqJsBNwOoGUEAQQApA7CbATcDsBlBAEEAKQO4mwE3A7gZIABBwABqJAALBgBBwJoBC2IAQQBCADcDyJsBQQBCADcDuJsBQQBCADcDsJsBQQBCADcDqJsBQQBCADcDoJsBQQBCADcDmJsBQQBCADcDkJsBQQBCADcDiJsBQQBCADcDgJsBQQBBADYCwJsBIAAQBBAFCwuYEAEAQYAIC5AQkAAAAAAAAAAAAAAAAAAAABgYYBjAeDDYIyOMIwWvRibGxj/GfvmRuOjoh+gTb837h4cmh0yhE8u4uNq4qWJtEQEBBAEIBQIJT08hT0Jung02Ntg2re5sm6amoqZZBFH/0tJv0t69uQz19fP1+wb3Dnl5+XnvgPKWb2+hb1/O3jCRkX6R/O8/bVJSVVKqB6T4YGCdYCf9wEe8vMq8iXZlNZubVpuszSs3jo4CjgSMAYqjo7ajcRVb0gwMMAxgPBhse3vxe/+K9oQ1NdQ1teFqgB0ddB3oaTr14OCn4FNH3bPX13vX9qyzIcLCL8Je7ZmcLi64Lm2WXENLSzFLYnqWKf7+3/6jIeFdV1dBV4IWrtUVFVQVqEEqvXd3wXeftu7oNzfcN6XrbpLl5bPle1bXnp+fRp+M2SMT8PDn8NMX/SNKSjVKan+UINraT9qelalEWFh9WPolsKLJyQPJBsqPzykppClVjVJ8CgooClAiFFqxsf6x4U9/UKCguqBpGl3Ja2uxa3/a1hSFhS6FXKsX2b29zr2Bc2c8XV1pXdI0uo8QEEAQgFAgkPT09/TzA/UHy8sLyxbAi90+Pvg+7cZ80wUFFAUoEQotZ2eBZx/mznjk5Lfkc1PVlycnnCclu04CQUEZQTJYgnOLixaLLJ0Lp6enpqdRAVP2fX3pfc+U+rKVlW6V3Ps3SdjYR9iOn61W+/vL+4sw63Du7p/uI3HBzXx87XzHkfi7ZmaFZhfjzHHd3VPdpo6nexcXXBe4Sy6vR0cBRwJGjkWenkKehNwhGsrKD8oexYnULS20LXWZWli/v8a/kXljLgcHHAc4Gw4/ra2OrQEjR6xaWnVa6i+0sIODNoNstRvvMzPMM4X/ZrZjY5FjP/LGXAICCAIQCgQSqqqSqjk4SZNxcdlxr6ji3sjIB8gOz43GGRlkGch9MtFJSTlJcnCSO9nZQ9mGmq9f8vLv8sMd+THj46vjS0jbqFtbcVviKra5iIgaiDSSDbyamlKapMgpPiYmmCYtvkwLMjLIMo36ZL+wsPqw6Up9Wenpg+kbas/yDw88D3gzHnfV1XPV5qa3M4CAOoB0uh30vr7Cvpl8YSfNzRPNJt6H6zQ00DS95GiJSEg9SHp1kDL//9v/qyTjVHp69Xr3j/SNkJB6kPTqPWRfX2Ffwj6+nSAggCAdoEA9aGi9aGfV0A8aGmga0HI0yq6ugq4ZLEG3tLTqtMledX1UVE1UmhmozpOTdpPs5Tt/IiKIIg2qRC9kZI1kB+nIY/Hx4/HbEv8qc3PRc7+i5swSEkgSkFokgkBAHUA6XYB6CAggCEAoEEjDwyvDVuiblezsl+wze8Xf29tL25aQq02hob6hYR9fwI2NDo0cgweRPT30PfXJesiXl2aXzPEzWwAAAAAAAAAAz88bzzbUg/krK6wrRYdWbnZ2xXaXs+zhgoIygmSwGebW1n/W/qmxKBsbbBvYdzbDtbXutcFbd3Svr4avESlDvmpqtWp339QdUFBdULoNoOpFRQlFEkyKV/Pz6/PLGPs4MDDAMJ3wYK3v75vvK3TDxD8//D/lw37aVVVJVZIcqseiorKieRBZ2+rqj+oDZcnpZWWJZQ/symq6utK6uWhpAy8vvC9lk15KwMAnwE7nnY7e3l/evoGhYBwccBzgbDj8/f3T/bsu50ZNTSlNUmSaH5KScpLk4Dl2dXXJdY+86voGBhgGMB4MNoqKEookmAmusrLysvlAeUvm5r/mY1nRhQ4OOA5wNhx+Hx98H/hjPudiYpViN/fEVdTUd9Tuo7U6qKiaqCkyTYGWlmKWxPQxUvn5w/mbOu9ixcUzxWb2l6MlJZQlNbFKEFlZeVnyILKrhIQqhFSuFdByctVyt6fkxTk55DnV3XLsTEwtTFphmBZeXmVeyju8lHh4/XjnhfCfODjgON3YcOWMjAqMFIYFmNHRY9HGsr8XpaWupUELV+Ti4q/iQ03ZoWFhmWEv+MJOs7P2s/FFe0IhIYQhFaVCNJycSpyU1iUIHh54HvBmPO5DQxFDIlKGYcfHO8d2/JOx/PzX/LMr5U8EBBAEIBQIJFFRWVGyCKLjmZlembzHLyVtbaltT8TaIg0NNA1oORpl+vrP+oM16Xnf31vftoSjaX5+5X7Xm/ypJCSQJD20SBk7O+w7xdd2/qurlqsxPUuazs4fzj7RgfAREUQRiFUimY+PBo8MiQODTk4lTkprnAS3t+a30VFzZuvri+sLYMvgPDzwPP3MeMGBgT6BfL8f/ZSUapTU/jVA9/f79+sM8xy5ud65oWdvGBMTTBOYXyaLLCywLH2cWFHT02vT1ri7Befnu+drXNOMbm6lblfL3DnExDfEbvOVqgMDDAMYDwYbVlZFVooTrNxERA1EGkmIXn9/4X/fnv6gqameqSE3T4gqKqgqTYJUZ7u71ruxbWsKwcEjwUbin4dTU1FTogKm8dzcV9yui6VyCwssC1gnFlOdnU6dnNMnAWxsrWxHwdgrMTHEMZX1YqR0dM10h7no8/b2//bjCfEVRkYFRgpDjEysrIqsCSZFpYmJHok8lw+1FBRQFKBEKLTh4aPhW0LfuhYWWBawTiymOjroOs3SdPdpablpb9DSBgkJJAlILRJBcHDdcKet4Ne2tuK22VRxb9DQZ9DOt70e7e2T7Tt+x9bMzBfMLtuF4kJCFUIqV4RomJhamLTCLSykpKqkSQ5V7SgooChdiFB1XFxtXNoxuIb4+Mf4kz/ta4aGIoZEpBHC",T$="8d8f6035",KY={name:C$,data:_$,hash:T$};let A$=new V,tQ=null;function E$(B){if(tQ===null)return x(A$,KY,64).then((C)=>{return tQ=C,tQ.calculate(B)});try{let C=tQ.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function I$(){return w(KY,64).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:64};return C})}var S$="sm3",v$="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",w$="b6fb4b8e",GY={name:S$,data:v$,hash:w$};let y$=new V,eQ=null;function x$(B){if(eQ===null)return x(y$,GY,32).then((C)=>{return eQ=C,eQ.calculate(B)});try{let C=eQ.calculate(B);return Promise.resolve(C)}catch(C){return Promise.reject(C)}}function k$(){return w(GY,32).then((B)=>{B.init();let C={init:()=>{return B.init(),C},update:(A)=>{return B.update(A),C},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),C},blockSize:64,digestSize:32};return C})}Z.adler32=c,Z.argon2Verify=_Z,Z.argon2d=Z9,Z.argon2i=e0,Z.argon2id=k0,Z.bcrypt=D$,Z.bcryptVerify=L$,Z.blake2b=y8,Z.blake2s=Y8,Z.blake3=LK,Z.crc32=IK,Z.crc64=kK,Z.createAdler32=g,Z.createBLAKE2b=L8,Z.createBLAKE2s=UZ,Z.createBLAKE3=CK,Z.createCRC32=SK,Z.createCRC64=fK,Z.createHMAC=WY,Z.createKeccak=GG,Z.createMD4=cK,Z.createMD5=oK,Z.createRIPEMD160=Y$,Z.createSHA1=ZG,Z.createSHA224=BG,Z.createSHA256=ZY,Z.createSHA3=WG,Z.createSHA384=LG,Z.createSHA512=TG,Z.createSM3=k$,Z.createWhirlpool=I$,Z.createXXHash128=aG,Z.createXXHash3=dG,Z.createXXHash32=wG,Z.createXXHash64=bG,Z.keccak=KG,Z.md4=mK,Z.md5=iK,Z.pbkdf2=n1,Z.ripemd160=Q$,Z.scrypt=N$,Z.sha1=eK,Z.sha224=NG,Z.sha256=FG,Z.sha3=XG,Z.sha384=PG,Z.sha512=_G,Z.sm3=x$,Z.whirlpool=E$,Z.xxhash128=rG,Z.xxhash3=lG,Z.xxhash32=vG,Z.xxhash64=hG})});var _Y=Z6(CY(),1),{program:I_,createCommand:S_,createArgument:v_,createOption:w_,CommanderError:y_,InvalidArgumentError:x_,InvalidOptionArgumentError:k_,Command:TY,Argument:f_,Option:h_,Help:b_}=_Y.default;import{readFileSync as F_}from"node:fs";import{join as M_}from"node:path";import{dirname as AY,join as n8}from"node:path";import{fileURLToPath as yH}from"node:url";import{homedir as SY}from"node:os";import{cpSync as xH,existsSync as Z5,mkdirSync as kH}from"node:fs";function p8(){let Z=AY(yH(import.meta.url));for(let Q=0;Q<8;Q++){if(Z5(n8(Z,"package.json")))return Z;let Y=AY(Z);if(Y===Z)break;Z=Y}return Z}var EY=n8(SY(),".gtrk-cli"),d8=n8(SY(),".gitruck");function V9(){return d8}function Y6(Z){return n8(d8,Z)}function i8(){return n8(d8,"ffmpeg")}function K9(){return n8(d8,"audio-cache")}function o8(){return n8(d8,"fonts")}function B0(){return n8(d8,"tmp")}var IY=!1;function vY(){if(IY)return;IY=!0;try{if(!Z5(EY))return;if(Z5(n8(d8,"config.json")))return;kH(d8,{recursive:!0}),xH(EY,d8,{recursive:!0,force:!1,errorOnExist:!1})}catch{}}import{spawnSync as fH}from"node:child_process";import{existsSync as X6,mkdirSync as hH,cpSync as bH}from"node:fs";import{homedir as yY}from"node:os";import{dirname as Q5,join as _8,resolve as Y5}from"node:path";var o9={dim:(Z)=>`\x1B[2m${Z}\x1B[0m`,cyan:(Z)=>`\x1B[36m${Z}\x1B[0m`,green:(Z)=>`\x1B[32m${Z}\x1B[0m`,yellow:(Z)=>`\x1B[33m${Z}\x1B[0m`,red:(Z)=>`\x1B[31m${Z}\x1B[0m`},z6=process.stdout;function NZ(){z6=process.stderr}var J6=(Z)=>z6.write(`${Z}
|
|
28
|
-
`),j={step:(Z)
|
|
29
|
-
`),tick:(Z)=>
|
|
30
|
-
`)};var
|
|
27
|
+
*/(function(Z,Q){typeof x6==="object"&&typeof iJ<"u"?Q(x6):typeof define==="function"&&define.amd?define(["exports"],Q):(Z=typeof globalThis<"u"?globalThis:Z||self,Q(Z.hashwasm={}))})(x6,function(Z){var Q="adler32",Y="AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAgUEAQECAgYOAn8BQYCJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEK6wkGBQBBgAkLCgBBAEEBNgKECAvjCAEHf0EAKAKECCIBQf//A3EhAiABQRB2IQMCQAJAIABBAUcNACACQQAtAIAJaiIBQY+AfGogASABQfD/A0sbIgEgA2oiBEEQdCIFQYCAPGogBSAEQfD/A0sbIAFyIQEMAQsCQAJAAkACQAJAIABBEEkNAEGACSEGIABBsCtJDQFBgAkhBgNAQQAhBQNAIAYgBWoiASgCACIEQf8BcSACaiICIANqIAIgBEEIdkH/AXFqIgJqIAIgBEEQdkH/AXFqIgJqIAIgBEEYdmoiAmogAiABQQRqKAIAIgRB/wFxaiICaiACIARBCHZB/wFxaiICaiACIARBEHZB/wFxaiICaiACIARBGHZqIgJqIAIgAUEIaigCACIEQf8BcWoiAmogAiAEQQh2Qf8BcWoiAmogAiAEQRB2Qf8BcWoiAmogAiAEQRh2aiIEaiAEIAFBDGooAgAiAUH/AXFqIgRqIAQgAUEIdkH/AXFqIgRqIAQgAUEQdkH/AXFqIgRqIAQgAUEYdmoiAmohAyAFQRBqIgVBsCtHDQALIANB8f8DcCEDIAJB8f8DcCECIAZBsCtqIQYgAEHQVGoiAEGvK0sNAAsgAEUNBCAAQQ9LDQEMAgsCQCAARQ0AAkACQCAAQQNxIgUNAEGACSEBIAAhBAwBCyAAQXxxIQRBACEBA0AgAiABQYAJai0AAGoiAiADaiEDIAUgAUEBaiIBRw0ACyAFQYAJaiEBCyAAQQRJDQADQCACIAEtAABqIgUgAS0AAWoiBiABLQACaiIAIAFBA2otAABqIgIgACAGIAUgA2pqamohAyABQQRqIQEgBEF8aiIEDQALCyACQY+AfGogAiACQfD/A0sbIANB8f8DcEEQdHIhAQwECwNAIAYoAgAiAUH/AXEgAmoiBCADaiAEIAFBCHZB/wFxaiIEaiAEIAFBEHZB/wFxaiIEaiAEIAFBGHZqIgRqIAQgBkEEaigCACIBQf8BcWoiBGogBCABQQh2Qf8BcWoiBGogBCABQRB2Qf8BcWoiBGogBCABQRh2aiIEaiAEIAZBCGooAgAiAUH/AXFqIgRqIAQgAUEIdkH/AXFqIgRqIAQgAUEQdkH/AXFqIgRqIAQgAUEYdmoiBGogBCAGQQxqKAIAIgFB/wFxaiIEaiAEIAFBCHZB/wFxaiIEaiAEIAFBEHZB/wFxaiIEaiAEIAFBGHZqIgJqIQMgBkEQaiEGIABBcGoiAEEPSw0ACyAARQ0BCyAAQX9qIQcCQCAAQQNxIgVFDQAgAEF8cSEAIAUhBCAGIQEDQCACIAEtAABqIgIgA2ohAyABQQFqIQEgBEF/aiIEDQALIAYgBWohBgsgB0EDSQ0AA0AgAiAGLQAAaiIBIAYtAAFqIgQgBi0AAmoiBSAGQQNqLQAAaiICIAUgBCABIANqampqIQMgBkEEaiEGIABBfGoiAA0ACwsgA0Hx/wNwIQMgAkHx/wNwIQILIAIgA0EQdHIhAQtBACABNgKECAsxAQF/QQBBACgChAgiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AoAJCwUAQYQICzsAQQBBATYChAggABACQQBBACgChAgiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AoAJCwsVAgBBgAgLBAQAAAAAQYQICwQBAAAA",J="02ddbd17",z={name:Q,data:Y,hash:J};function X(B,L,A,w){function b(d){return d instanceof A?d:new A(function(p){p(d)})}return new(A||(A=Promise))(function(d,p){function i(wZ){try{LZ(w.next(wZ))}catch(kZ){p(kZ)}}function JZ(wZ){try{LZ(w.throw(wZ))}catch(kZ){p(kZ)}}function LZ(wZ){wZ.done?d(wZ.value):b(wZ.value).then(i,JZ)}LZ((w=w.apply(B,L||[])).next())})}typeof SuppressedError==="function"&&SuppressedError;class W{constructor(){this.mutex=Promise.resolve()}lock(){let B=()=>{};return this.mutex=this.mutex.then(()=>new Promise(B)),new Promise((L)=>{B=L})}dispatch(B){return X(this,void 0,void 0,function*(){let L=yield this.lock();try{return yield Promise.resolve(B())}finally{L()}})}}var V;function K(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;return global}let G=K(),$=(V=G.Buffer)!==null&&V!==void 0?V:null,H=G.TextEncoder?new G.TextEncoder:null;function N(B,L){return String.fromCharCode(...B.subarray(0,L))}function q(B,L){return(B&15)+(B>>6|B>>3&8)<<4|(L&15)+(L>>6|L>>3&8)}function U(B,L){let A=L.length>>1;for(let w=0;w<A;w++){let b=w<<1;B[w]=q(L.charCodeAt(b),L.charCodeAt(b+1))}}function F(B,L){if(B.length!==L.length*2)return!1;for(let A=0;A<L.length;A++){let w=A<<1;if(L[A]!==q(B.charCodeAt(w),B.charCodeAt(w+1)))return!1}return!0}let M=87,R=48;function D(B,L,A){let w=0;for(let b=0;b<A;b++){let d=L[b]>>>4;B[w++]=d>9?d+M:d+R,d=L[b]&15,B[w++]=d>9?d+M:d+R}return String.fromCharCode.apply(null,B)}let O=$!==null?(B)=>{if(typeof B==="string"){let L=$.from(B,"utf8");return new Uint8Array(L.buffer,L.byteOffset,L.length)}if($.isBuffer(B))return new Uint8Array(B.buffer,B.byteOffset,B.length);if(ArrayBuffer.isView(B))return new Uint8Array(B.buffer,B.byteOffset,B.byteLength);throw Error("Invalid data type!")}:(B)=>{if(typeof B==="string")return H.encode(B);if(ArrayBuffer.isView(B))return new Uint8Array(B.buffer,B.byteOffset,B.byteLength);throw Error("Invalid data type!")},C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",T=new Uint8Array(256);for(let B=0;B<C.length;B++)T[C.charCodeAt(B)]=B;function _(B,L=!0){let A=B.length,w=A%3,b=[],d=A-w;for(let p=0;p<d;p+=3){let i=(B[p]<<16&16711680)+(B[p+1]<<8&65280)+(B[p+2]&255),JZ=C.charAt(i>>18&63)+C.charAt(i>>12&63)+C.charAt(i>>6&63)+C.charAt(i&63);b.push(JZ)}if(w===1){let p=B[A-1],i=C.charAt(p>>2),JZ=C.charAt(p<<4&63);if(b.push(`${i}${JZ}`),L)b.push("==")}else if(w===2){let p=(B[A-2]<<8)+B[A-1],i=C.charAt(p>>10),JZ=C.charAt(p>>4&63),LZ=C.charAt(p<<2&63);if(b.push(`${i}${JZ}${LZ}`),L)b.push("=")}return b.join("")}function P(B){let L=Math.floor(B.length*0.75),A=B.length;if(B[A-1]==="="){if(L-=1,B[A-2]==="=")L-=1}return L}function E(B){let L=P(B),A=B.length,w=new Uint8Array(L),b=0;for(let d=0;d<A;d+=4){let p=T[B.charCodeAt(d)],i=T[B.charCodeAt(d+1)],JZ=T[B.charCodeAt(d+2)],LZ=T[B.charCodeAt(d+3)];w[b]=p<<2|i>>4,b+=1,w[b]=(i&15)<<4|JZ>>2,b+=1,w[b]=(JZ&3)<<6|LZ&63,b+=1}return w}let I=16384,y=4,h=new W,v=new Map;function S(B,L){return X(this,void 0,void 0,function*(){let A=null,w=null,b=!1;if(typeof WebAssembly>"u")throw Error("WebAssembly is not supported in this environment!");let d=(XZ,HZ=0)=>{w.set(XZ,HZ)},p=()=>w,i=()=>A.exports,JZ=(XZ)=>{A.exports.Hash_SetMemorySize(XZ);let HZ=A.exports.Hash_GetBuffer(),Q8=A.exports.memory.buffer;w=new Uint8Array(Q8,HZ,XZ)},LZ=()=>{return new DataView(A.exports.memory.buffer).getUint32(A.exports.STATE_SIZE,!0)},wZ=h.dispatch(()=>X(this,void 0,void 0,function*(){if(!v.has(B.name)){let HZ=E(B.data),Q8=WebAssembly.compile(HZ);v.set(B.name,Q8)}let XZ=yield v.get(B.name);A=yield WebAssembly.instantiate(XZ,{})})),kZ=()=>X(this,void 0,void 0,function*(){if(!A)yield wZ;let XZ=A.exports.Hash_GetBuffer(),HZ=A.exports.memory.buffer;w=new Uint8Array(HZ,XZ,I)}),CZ=(XZ=null)=>{b=!0,A.exports.Hash_Init(XZ)},j8=(XZ)=>{let HZ=0;while(HZ<XZ.length){let Q8=XZ.subarray(HZ,HZ+I);HZ+=Q8.length,w.set(Q8),A.exports.Hash_Update(Q8.length)}},sZ=(XZ)=>{if(!b)throw Error("update() called before init()");let HZ=O(XZ);j8(HZ)},o9=new Uint8Array(L*2),q0=(XZ,HZ=null)=>{if(!b)throw Error("digest() called before init()");if(b=!1,A.exports.Hash_Final(HZ),XZ==="binary")return w.slice(0,L);return D(o9,w,L)},_8=()=>{if(!b)throw Error("save() can only be called after init() and before digest()");let XZ=A.exports.Hash_GetState(),HZ=LZ(),Q8=A.exports.memory.buffer,u0=new Uint8Array(Q8,XZ,HZ),r9=new Uint8Array(y+HZ);return U(r9,B.hash),r9.set(u0,y),r9},U0=(XZ)=>{if(!(XZ instanceof Uint8Array))throw Error("load() expects an Uint8Array generated by save()");let HZ=A.exports.Hash_GetState(),Q8=LZ(),u0=y+Q8,r9=A.exports.memory.buffer;if(XZ.length!==u0)throw Error(`Bad state length (expected ${u0} bytes, got ${XZ.length})`);if(!F(B.hash,XZ.subarray(0,y)))throw Error("This state was written by an incompatible hash implementation");let l$=XZ.subarray(y);new Uint8Array(r9,HZ,Q8).set(l$),b=!0},V9=(XZ)=>{if(typeof XZ==="string")return XZ.length<I/4;return XZ.byteLength<I},d8=V9;switch(B.name){case"argon2":case"scrypt":d8=()=>!0;break;case"blake2b":case"blake2s":d8=(XZ,HZ)=>HZ<=512&&V9(XZ);break;case"blake3":d8=(XZ,HZ)=>HZ===0&&V9(XZ);break;case"xxhash64":case"xxhash3":case"xxhash128":case"crc64":d8=()=>!1;break}let N0=(XZ,HZ=null,Q8=null)=>{if(!d8(XZ,HZ))return CZ(HZ),sZ(XZ),q0("hex",Q8);let u0=O(XZ);return w.set(u0),A.exports.Hash_Calculate(u0.length,HZ,Q8),D(o9,w,L)};return yield kZ(),{getMemory:p,writeMemory:d,getExports:i,setMemorySize:JZ,init:CZ,update:sZ,digest:q0,save:_8,load:U0,calculate:N0,hashLength:L}})}function k(B,L,A){return X(this,void 0,void 0,function*(){let w=yield B.lock(),b=yield S(L,A);return w(),b})}let c=new W,a=null;function u(B){if(a===null)return k(c,z,4).then((L)=>{return a=L,a.calculate(B)});try{let L=a.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function l(){return S(z,4).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:4,digestSize:4};return L})}var f="argon2",n="AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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",QZ="e4cdc523",zZ={name:f,data:n,hash:QZ},BZ="blake2b",PZ="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",oZ="c6f286e6",mZ={name:BZ,data:PZ,hash:oZ};let bZ=new W,pZ=null;function xZ(B){if(!Number.isInteger(B)||B<8||B>512||B%8!==0)return Error("Invalid variant! Valid values: 8, 16, ..., 512");return null}function x8(B,L){return B|L<<16}function k8(B,L=512,A=null){if(xZ(L))return Promise.reject(xZ(L));let w=null,b=L;if(A!==null){if(w=O(A),w.length>64)return Promise.reject(Error("Max key length is 64 bytes"));b=x8(L,w.length)}let d=L/8;if(pZ===null||pZ.hashLength!==d)return k(bZ,mZ,d).then((p)=>{if(pZ=p,b>512)pZ.writeMemory(w);return pZ.calculate(B,b)});try{if(b>512)pZ.writeMemory(w);let p=pZ.calculate(B,b);return Promise.resolve(p)}catch(p){return Promise.reject(p)}}function L8(B=512,L=null){if(xZ(B))return Promise.reject(xZ(B));let A=null,w=B;if(L!==null){if(A=O(L),A.length>64)return Promise.reject(Error("Max key length is 64 bytes"));w=x8(B,A.length)}let b=B/8;return S(mZ,b).then((d)=>{if(w>512)d.writeMemory(A);d.init(w);let p={init:w>512?()=>{return d.writeMemory(A),d.init(w),p}:()=>{return d.init(w),p},update:(i)=>{return d.update(i),p},digest:(i)=>d.digest(i),save:()=>d.save(),load:(i)=>{return d.load(i),p},blockSize:128,digestSize:b};return p})}function EZ(B,L,A){let w=[`m=${L.memorySize}`,`t=${L.iterations}`,`p=${L.parallelism}`].join(",");return`$argon2${L.hashType}$v=19$${w}$${_(B,!1)}$${_(A,!1)}`}let b0=new DataView(new ArrayBuffer(4));function IZ(B){return b0.setInt32(0,B,!0),new Uint8Array(b0.buffer)}function l8(B,L,A){return X(this,void 0,void 0,function*(){if(A<=64){let JZ=yield L8(A*8);return JZ.update(IZ(A)),JZ.update(L),JZ.digest("binary")}let w=Math.ceil(A/32)-2,b=new Uint8Array(A);B.init(),B.update(IZ(A)),B.update(L);let d=B.digest("binary");b.set(d.subarray(0,32),0);for(let JZ=1;JZ<w;JZ++)B.init(),B.update(d),d=B.digest("binary"),b.set(d.subarray(0,32),JZ*32);let p=A-32*w,i;if(p===64)i=B,i.init();else i=yield L8(p*8);return i.update(d),d=i.digest("binary"),b.set(d.subarray(0,p),w*32),b})}function X8(B){switch(B){case"d":return 0;case"i":return 1;default:return 2}}function RZ(B){return X(this,void 0,void 0,function*(){var L;let{parallelism:A,iterations:w,hashLength:b}=B,d=O(B.password),p=O(B.salt),i=19,JZ=X8(B.hashType),{memorySize:LZ}=B,wZ=O((L=B.secret)!==null&&L!==void 0?L:""),[kZ,CZ]=yield Promise.all([S(zZ,1024),L8(512)]);kZ.setMemorySize(LZ*1024+1024);let j8=new Uint8Array(24),sZ=new DataView(j8.buffer);sZ.setInt32(0,A,!0),sZ.setInt32(4,b,!0),sZ.setInt32(8,LZ,!0),sZ.setInt32(12,w,!0),sZ.setInt32(16,19,!0),sZ.setInt32(20,JZ,!0),kZ.writeMemory(j8,LZ*1024),CZ.init(),CZ.update(j8),CZ.update(IZ(d.length)),CZ.update(d),CZ.update(IZ(p.length)),CZ.update(p),CZ.update(IZ(wZ.length)),CZ.update(wZ),CZ.update(IZ(0));let q0=Math.floor(LZ/(A*4))*4,_8=new Uint8Array(72),U0=CZ.digest("binary");_8.set(U0);for(let N0=0;N0<A;N0++){_8.set(IZ(0),64),_8.set(IZ(N0),68);let XZ=N0*q0,HZ=yield l8(CZ,_8,1024);kZ.writeMemory(HZ,XZ*1024),XZ+=1,_8.set(IZ(1),64),HZ=yield l8(CZ,_8,1024),kZ.writeMemory(HZ,XZ*1024)}let V9=new Uint8Array(1024);U(V9,kZ.calculate(new Uint8Array([]),LZ));let d8=yield l8(CZ,V9,b);if(B.outputType==="hex"){let N0=new Uint8Array(b*2);return D(N0,d8,b)}if(B.outputType==="encoded")return EZ(p,B,d8);return d8})}let H8=(B)=>{var L;if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!B.password)throw Error("Password must be specified");if(B.password=O(B.password),B.password.length<1)throw Error("Password must be specified");if(!B.salt)throw Error("Salt must be specified");if(B.salt=O(B.salt),B.salt.length<8)throw Error("Salt should be at least 8 bytes long");if(B.secret=O((L=B.secret)!==null&&L!==void 0?L:""),!Number.isInteger(B.iterations)||B.iterations<1)throw Error("Iterations should be a positive number");if(!Number.isInteger(B.parallelism)||B.parallelism<1)throw Error("Parallelism should be a positive number");if(!Number.isInteger(B.hashLength)||B.hashLength<4)throw Error("Hash length should be at least 4 bytes.");if(!Number.isInteger(B.memorySize))throw Error("Memory size should be specified.");if(B.memorySize<8*B.parallelism)throw Error("Memory size should be at least 8 * parallelism.");if(B.outputType===void 0)B.outputType="hex";if(!["hex","binary","encoded"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary', 'encoded']`)};function g0(B){return X(this,void 0,void 0,function*(){return H8(B),RZ(Object.assign(Object.assign({},B),{hashType:"i"}))})}function K0(B){return X(this,void 0,void 0,function*(){return H8(B),RZ(Object.assign(Object.assign({},B),{hashType:"id"}))})}function KZ(B){return X(this,void 0,void 0,function*(){return H8(B),RZ(Object.assign(Object.assign({},B),{hashType:"d"}))})}let C8=(B,L,A)=>{let w=/^\$argon2(id|i|d)\$v=([0-9]+)\$((?:[mtp]=[0-9]+,){2}[mtp]=[0-9]+)\$([A-Za-z0-9+/]+)\$([A-Za-z0-9+/]+)$/,b=L.match(w);if(!b)throw Error("Invalid hash");let[,d,p,i,JZ,LZ]=b;if(p!=="19")throw Error(`Unsupported version: ${p}`);let wZ={},kZ={m:"memorySize",p:"parallelism",t:"iterations"};for(let CZ of i.split(",")){let[j8,sZ]=CZ.split("=");wZ[kZ[j8]]=Number(sZ)}return Object.assign(Object.assign({},wZ),{password:B,secret:A,hashType:d,salt:E(JZ),hashLength:P(LZ),outputType:"encoded"})},Y9=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(B.hash===void 0||typeof B.hash!=="string")throw Error("Hash should be specified")};function n9(B){return X(this,void 0,void 0,function*(){Y9(B);let L=C8(B.password,B.hash,B.secret);H8(L);let A=B.hash.lastIndexOf("$")+1;return(yield RZ(L)).substring(A)===B.hash.substring(A)})}var m="blake2s",o="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",r="5c0ff166",GZ={name:m,data:o,hash:r};let WZ=new W,x=null;function g(B){if(!Number.isInteger(B)||B<8||B>256||B%8!==0)return Error("Invalid variant! Valid values: 8, 16, ..., 256");return null}function t(B,L){return B|L<<16}function FZ(B,L=256,A=null){if(g(L))return Promise.reject(g(L));let w=null,b=L;if(A!==null){if(w=O(A),w.length>32)return Promise.reject(Error("Max key length is 32 bytes"));b=t(L,w.length)}let d=L/8;if(x===null||x.hashLength!==d)return k(WZ,GZ,d).then((p)=>{if(x=p,b>512)x.writeMemory(w);return x.calculate(B,b)});try{if(b>512)x.writeMemory(w);let p=x.calculate(B,b);return Promise.resolve(p)}catch(p){return Promise.reject(p)}}function YZ(B=256,L=null){if(g(B))return Promise.reject(g(B));let A=null,w=B;if(L!==null){if(A=O(L),A.length>32)return Promise.reject(Error("Max key length is 32 bytes"));w=t(B,A.length)}let b=B/8;return S(GZ,b).then((d)=>{if(w>512)d.writeMemory(A);d.init(w);let p={init:w>512?()=>{return d.writeMemory(A),d.init(w),p}:()=>{return d.init(w),p},update:(i)=>{return d.update(i),p},digest:(i)=>d.digest(i),save:()=>d.save(),load:(i)=>{return d.load(i),p},blockSize:64,digestSize:b};return p})}var SZ="blake3",rZ="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IQEgAkFAaiICQcAASw0ACwsCQEHAACAHQf8BcSIGayIFIAIgBSACSRsiCUUNACAJQQNxIQtBACEFAkAgCUEESQ0AIAAgBmohByAJQfwAcSEIQQAhBQNAIAcgBWoiAkEoaiABIAVqIgotAAA6AAAgAkEpaiAKQQFqLQAAOgAAIAJBKmogCkECai0AADoAACACQStqIApBA2otAAA6AAAgCCAFQQRqIgVHDQALCwJAIAtFDQAgASAFaiEBIAUgBmogAGpBKGohBQNAIAUgAS0AADoAACABQQFqIQEgBUEBaiEFIAtBf2oiCw0ACwsgAC0AaCEHCyAAIAcgCWo6AGggA0HAAGokAAveAwQFfwN+BX8GfiMAQdABayIBJAACQCAAe6ciAkEALQCQigEiA08NAEEALQCKigFBBHIhBCABQShqIQVBACkDmIkBIQBBACkDkIkBIQZBACkDiIkBIQdBACkDgIkBIQggAyEJA0AgASAANwMYIAEgBjcDECABIAc3AwggASAINwMAIAEgA0EFdCIDQdGJAWoiCikDADcDKCABIANB2YkBaiILKQMANwMwIAEgA0HhiQFqIgwpAwA3AzggASADQemJAWoiDSkDADcDQCABIANB8YkBaikDADcDSCABIANB+YkBaikDADcDUCABIANBgYoBaikDADcDWCADQYmKAWopAwAhDiABQcAAOgBoIAEgDjcDYCABQgA3AyAgASAEOgBpIAEgADcDiAEgASAGNwOAASABIAc3A3ggASAINwNwIAFBkAFqIAFB8ABqIAVBwABCACAEQf8BcRACIAEpA7ABIQ4gASkDkAEhDyABKQO4ASEQIAEpA5gBIREgASkDwAEhEiABKQOgASETIA0gASkDyAEgASkDqAGFNwMAIAwgEiAThTcDACALIBAgEYU3AwAgCiAOIA+FNwMAIAlBf2oiCUH/AXEiAyACSw0AC0EAIAk6AJCKAQsgAUHQAWokAAvHCQIKfwV+IwBB4AJrIgUkAAJAAkAgAUGACEsNACAFIAA2AvwBIAVB/AFqIAFBgAhGIgZBECACQQEgA0EBQQIgBBABIAZBCnQiByABTw0BIAVB4ABqIgZCADcDACAFQdgAaiIIQgA3AwAgBUHQAGoiCUIANwMAIAVByABqIgpCADcDACAFQcAAaiILQgA3AwAgBUE4aiIMQgA3AwAgBUEwaiINQgA3AwAgBSADOgBqIAVCADcDKCAFQQA7AWggBUEAKQOAiQE3AwAgBUEAKQOIiQE3AwggBUEAKQOQiQE3AxAgBUEAKQOYiQE3AxggBSABQYAIRiIOrSACfDcDICAFIAAgB2pBACABIA4bEAQgBUGIAWpBMGogDSkDADcDACAFQYgBakE4aiAMKQMANwMAIAUgBSkDACIPNwOIASAFIAUpAwgiEDcDkAEgBSAFKQMQIhE3A5gBIAUgBSkDGCISNwOgASAFIAUpAyg3A7ABIAUtAGohACAFLQBpIQcgBSkDICECIAUtAGghASAFQYgBakHAAGogCykDADcDACAFQYgBakHIAGogCikDADcDACAFQYgBakHQAGogCSkDADcDACAFQYgBakHYAGogCCkDADcDACAFQYgBakHgAGogBikDADcDACAFIAE6APABIAUgAjcDqAEgBSAAIAdFckECciIAOgDxASAFIBI3A5gCIAUgETcDkAIgBSAQNwOIAiAFIA83A4ACIAVBoAJqIAVBgAJqIAVBsAFqIAEgAiAAQf8BcRACIAUpA8ACIQIgBSkDoAIhDyAFKQPIAiEQIAUpA6gCIREgBSkD0AIhEiAFKQOwAiETIAQgDkEFdGoiASAFKQPYAiAFKQO4AoU3AxggASASIBOFNwMQIAEgECARhTcDCCABIAIgD4U3AwBBAkEBIA4bIQYMAQsgAEIBIAFBf2pBCnZBAXKteUI/hYYiD6dBCnQiDiACIAMgBRAGIQcgACAOaiABIA5rIA9C////AYMgAnwgAyAFQcAAQSAgDkGACEsbahAGIQECQCAHQQFHDQAgBCAFKQMANwMAIAQgBSkDCDcDCCAEIAUpAxA3AxAgBCAFKQMYNwMYIAQgBSkDIDcDICAEIAUpAyg3AyggBCAFKQMwNwMwIAQgBSkDODcDOEECIQYMAQtBACEGQQAhAAJAIAEgB2oiCUECSQ0AIAlBfmoiCkEBdkEBaiIGQQNxIQ5BACEHAkAgCkEGSQ0AIAZB/P///wdxIQhBACEHIAVBiAFqIQEgBSEAA0AgASAANgIAIAFBDGogAEHAAWo2AgAgAUEIaiAAQYABajYCACABQQRqIABBwABqNgIAIABBgAJqIQAgAUEQaiEBIAggB0EEaiIHRw0ACwsgCkF+cSEIAkAgDkUNACAFIAdBBnRqIQEgBUGIAWogB0ECdGohAANAIAAgATYCACABQcAAaiEBIABBBGohACAOQX9qIg4NAAsLIAhBAmohAAsgBUGIAWogBkEBQgBBACADQQRyQQBBACAEEAEgACAJTw0AIAQgBkEFdGoiASAFIAZBBnRqIgApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggBkEBaiEGCyAFQeACaiQAIAYLrRAIAn8EfgF/AX4EfwR+BH8EfiMAQfABayIBJAACQCAARQ0AAkBBAC0AkIoBIgINACABQTBqQQApA9CJATcDACABQThqQQApA9iJATcDACABQQApA6CJASIDNwMAIAFBACkDqIkBIgQ3AwggAUEAKQOwiQEiBTcDECABQQApA7iJASIGNwMYIAFBACkDyIkBNwMoQQAtAIqKASECQQAtAImKASEHQQApA8CJASEIQQAtAIiKASEJIAFBwABqQQApA+CJATcDACABQcgAakEAKQPoiQE3AwAgAUHQAGpBACkD8IkBNwMAIAFB2ABqQQApA/iJATcDACABQeAAakEAKQOAigE3AwAgASAJOgBoIAEgCDcDICABIAIgB0VyIgJBAnI6AGkgAUEoaiEKQgAhCEGACSELIAJBCnJB/wFxIQwDQCABQbABaiABIAogCUH/AXEgCCAMEAIgASABKQPQASINIAEpA7ABhTcDcCABIAEpA9gBIg4gASkDuAGFNwN4IAEgASkD4AEiDyABKQPAAYU3A4ABIAEgASkD6AEiECAGhTcDqAEgASAPIAWFNwOgASABIA4gBIU3A5gBIAEgDSADhTcDkAEgASAQIAEpA8gBhTcDiAEgAEHAACAAQcAASRsiEUF/aiESAkACQCARQQdxIhMNACABQfAAaiECIAshByARIRQMAQsgEUH4AHEhFCABQfAAaiECIAshBwNAIAcgAi0AADoAACAHQQFqIQcgAkEBaiECIBNBf2oiEw0ACwsCQCASQQdJDQADQCAHIAIpAAA3AAAgB0EIaiEHIAJBCGohAiAUQXhqIhQNAAsLIAhCAXwhCCALIBFqIQsgACARayIADQAMAgsLAkACQAJAQQAtAImKASIHQQZ0QQBBAC0AiIoBIhFrRg0AIAEgEToAaCABQQApA4CKATcDYCABQQApA/iJATcDWCABQQApA/CJATcDUCABQQApA+iJATcDSCABQQApA+CJATcDQCABQQApA9iJATcDOCABQQApA9CJATcDMCABQQApA8iJATcDKCABQQApA8CJASIINwMgIAFBACkDuIkBIgM3AxggAUEAKQOwiQEiBDcDECABQQApA6iJASIFNwMIIAFBACkDoIkBIgY3AwAgAUEALQCKigEiEyAHRXJBAnIiCzoAaSATQQRyIRNBACkDmIkBIQ1BACkDkIkBIQ5BACkDiIkBIQ9BACkDgIkBIRAMAQtBwAAhESABQcAAOgBoQgAhCCABQgA3AyAgAUEAKQOYiQEiDTcDGCABQQApA5CJASIONwMQIAFBACkDiIkBIg83AwggAUEAKQOAiQEiEDcDACABQQAtAIqKAUEEciITOgBpIAEgAkF+aiICQQV0IgdByYoBaikDADcDYCABIAdBwYoBaikDADcDWCABIAdBuYoBaikDADcDUCABIAdBsYoBaikDADcDSCABIAdBqYoBaikDADcDQCABIAdBoYoBaikDADcDOCABIAdBmYoBaikDADcDMCABIAdBkYoBaikDADcDKCATIQsgECEGIA8hBSAOIQQgDSEDIAJFDQELIAJBf2oiB0EFdCIUQZGKAWopAwAhFSAUQZmKAWopAwAhFiAUQaGKAWopAwAhFyAUQamKAWopAwAhGCABIAM3A4gBIAEgBDcDgAEgASAFNwN4IAEgBjcDcCABQbABaiABQfAAaiABQShqIhQgESAIIAtB/wFxEAIgASATOgBpIAFBwAA6AGggASAYNwNAIAEgFzcDOCABIBY3AzAgASAVNwMoIAFCADcDICABIA03AxggASAONwMQIAEgDzcDCCABIBA3AwAgASABKQPoASABKQPIAYU3A2AgASABKQPgASABKQPAAYU3A1ggASABKQPYASABKQO4AYU3A1AgASABKQPQASABKQOwAYU3A0ggB0UNACACQQV0QemJAWohAiATQf8BcSERA0AgAkFoaikDACEIIAJBcGopAwAhAyACQXhqKQMAIQQgAikDACEFIAEgDTcDiAEgASAONwOAASABIA83A3ggASAQNwNwIAFBsAFqIAFB8ABqIBRBwABCACAREAIgASATOgBpIAFBwAA6AGggASAFNwNAIAEgBDcDOCABIAM3AzAgASAINwMoIAFCADcDICABIA03AxggASAONwMQIAEgDzcDCCABIBA3AwAgASABKQPoASABKQPIAYU3A2AgASABKQPgASABKQPAAYU3A1ggASABKQPYASABKQO4AYU3A1AgASABKQPQASABKQOwAYU3A0ggAkFgaiECIAdBf2oiBw0ACwsgAUEoaiEJQgAhCEGACSELIBNBCHJB/wFxIQoDQCABQbABaiABIAlBwAAgCCAKEAIgASABKQPQASIDIAEpA7ABhTcDcCABIAEpA9gBIgQgASkDuAGFNwN4IAEgASkD4AEiBSABKQPAAYU3A4ABIAEgDSABKQPoASIGhTcDqAEgASAOIAWFNwOgASABIA8gBIU3A5gBIAEgECADhTcDkAEgASAGIAEpA8gBhTcDiAEgAEHAACAAQcAASRsiEUF/aiESAkACQCARQQdxIhMNACABQfAAaiECIAshByARIRQMAQsgEUH4AHEhFCABQfAAaiECIAshBwNAIAcgAi0AADoAACAHQQFqIQcgAkEBaiECIBNBf2oiEw0ACwsCQCASQQdJDQADQCAHIAIpAAA3AAAgB0EIaiEHIAJBCGohAiAUQXhqIhQNAAsLIAhCAXwhCCALIBFqIQsgACARayIADQALCyABQfABaiQAC6MCAQR+AkACQCAAQSBGDQBCq7OP/JGjs/DbACEBQv+kuYjFkdqCm38hAkLy5rvjo6f9p6V/IQNC58yn0NbQ67O7fyEEQQAhAAwBC0EAKQOYCSEBQQApA5AJIQJBACkDiAkhA0EAKQOACSEEQRAhAAtBACAAOgCKigFBAEIANwOAigFBAEIANwP4iQFBAEIANwPwiQFBAEIANwPoiQFBAEIANwPgiQFBAEIANwPYiQFBAEIANwPQiQFBAEIANwPIiQFBAEIANwPAiQFBACABNwO4iQFBACACNwOwiQFBACADNwOoiQFBACAENwOgiQFBACABNwOYiQFBACACNwOQiQFBACADNwOIiQFBACAENwOAiQFBAEEAOgCQigFBAEEAOwGIigELBgAgABADCwYAIAAQBwsGAEGAiQELqwIBBH4CQAJAIAFBIEYNAEKrs4/8kaOz8NsAIQNC/6S5iMWR2oKbfyEEQvLmu+Ojp/2npX8hBULnzKfQ1tDrs7t/IQZBACEBDAELQQApA5gJIQNBACkDkAkhBEEAKQOICSEFQQApA4AJIQZBECEBC0EAIAE6AIqKAUEAQgA3A4CKAUEAQgA3A/iJAUEAQgA3A/CJAUEAQgA3A+iJAUEAQgA3A+CJAUEAQgA3A9iJAUEAQgA3A9CJAUEAQgA3A8iJAUEAQgA3A8CJAUEAIAM3A7iJAUEAIAQ3A7CJAUEAIAU3A6iJAUEAIAY3A6CJAUEAIAM3A5iJAUEAIAQ3A5CJAUEAIAU3A4iJAUEAIAY3A4CJAUEAQQA6AJCKAUEAQQA7AYiKASAAEAMgAhAHCwsLAQBBgAgLBHgHAAA=",vZ="215d875f",Z8={name:SZ,data:rZ,hash:vZ};let aZ=new W,f8=null;function h8(B){if(!Number.isInteger(B)||B<8||B%8!==0)return Error("Invalid variant! Valid values: 8, 16, ...");return null}function hQ(B,L=256,A=null){if(h8(L))return Promise.reject(h8(L));let w=null,b=0;if(A!==null){if(w=O(A),w.length!==32)return Promise.reject(Error("Key length must be exactly 32 bytes"));b=32}let d=L/8,p=d;if(f8===null||f8.hashLength!==d)return k(aZ,Z8,d).then((i)=>{if(f8=i,b===32)f8.writeMemory(w);return f8.calculate(B,b,p)});try{if(b===32)f8.writeMemory(w);let i=f8.calculate(B,b,p);return Promise.resolve(i)}catch(i){return Promise.reject(i)}}function vK(B=256,L=null){if(h8(B))return Promise.reject(h8(B));let A=null,w=0;if(L!==null){if(A=O(L),A.length!==32)return Promise.reject(Error("Key length must be exactly 32 bytes"));w=32}let b=B/8,d=b;return S(Z8,b).then((p)=>{if(w===32)p.writeMemory(A);p.init(w);let i={init:w===32?()=>{return p.writeMemory(A),p.init(w),i}:()=>{return p.init(w),i},update:(JZ)=>{return p.update(JZ),i},digest:(JZ)=>p.digest(JZ,d),save:()=>p.save(),load:(JZ)=>{return p.load(JZ),i},blockSize:64,digestSize:b};return i})}var wK="crc32",yK="AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwgHAAEBAQIAAwUEAQECAgYOAn8BQZDJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAgtIYXNoX1VwZGF0ZQADCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKkggHBQBBgAkLwwMBA39BgIkBIQFBACECA0AgAUEAQQBBAEEAQQBBAEEAQQAgAkEBcWsgAHEgAkEBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnM2AgAgAUEEaiEBIAJBAWoiAkGAAkcNAAtBACEAA0AgAEGEkQFqIABBhIkBaigCACICQf8BcUECdEGAiQFqKAIAIAJBCHZzIgI2AgAgAEGEmQFqIAJB/wFxQQJ0QYCJAWooAgAgAkEIdnMiAjYCACAAQYShAWogAkH/AXFBAnRBgIkBaigCACACQQh2cyICNgIAIABBhKkBaiACQf8BcUECdEGAiQFqKAIAIAJBCHZzIgI2AgAgAEGEsQFqIAJB/wFxQQJ0QYCJAWooAgAgAkEIdnMiAjYCACAAQYS5AWogAkH/AXFBAnRBgIkBaigCACACQQh2cyICNgIAIABBhMEBaiACQf8BcUECdEGAiQFqKAIAIAJBCHZzNgIAIABBBGoiAEH8B0cNAAsLJwACQEEAKAKAyQEgAEYNACAAEAFBACAANgKAyQELQQBBADYChMkBC4gDAQN/QQAoAoTJAUF/cyEBQYAJIQICQCAAQQhJDQBBgAkhAgNAIAJBBGooAgAiA0EOdkH8B3FBgJEBaigCACADQRZ2QfwHcUGAiQFqKAIAcyADQQZ2QfwHcUGAmQFqKAIAcyADQf8BcUECdEGAoQFqKAIAcyACKAIAIAFzIgFBFnZB/AdxQYCpAWooAgBzIAFBDnZB/AdxQYCxAWooAgBzIAFBBnZB/AdxQYC5AWooAgBzIAFB/wFxQQJ0QYDBAWooAgBzIQEgAkEIaiECIABBeGoiAEEHSw0ACwsCQCAARQ0AAkACQCAAQQFxDQAgACEDDAELIAFB/wFxIAItAABzQQJ0QYCJAWooAgAgAUEIdnMhASACQQFqIQIgAEF/aiEDCyAAQQFGDQADQCABQf8BcSACLQAAc0ECdEGAiQFqKAIAIAFBCHZzIgFB/wFxIAJBAWotAABzQQJ0QYCJAWooAgAgAUEIdnMhASACQQJqIQIgA0F+aiIDDQALC0EAIAFBf3M2AoTJAQsyAQF/QQBBACgChMkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgKACQsGAEGEyQELWQACQEEAKAKAyQEgAUYNACABEAFBACABNgKAyQELQQBBADYChMkBIAAQA0EAQQAoAoTJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCgAkLCwsBAEGACAsEBAAAAA==",xK="d2eba587",t2={name:wK,data:yK,hash:xK};let kK=new W,bQ=null;function gQ(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Polynomial must be a valid 32-bit long unsigned integer");return null}function fK(B,L=3988292384){if(gQ(L))return Promise.reject(gQ(L));if(bQ===null)return k(kK,t2,4).then((A)=>{return bQ=A,bQ.calculate(B,L)});try{let A=bQ.calculate(B,L);return Promise.resolve(A)}catch(A){return Promise.reject(A)}}function hK(B=3988292384){if(gQ(B))return Promise.reject(gQ(B));return S(t2,4).then((L)=>{L.init(B);let A={init:()=>{return L.init(B),A},update:(w)=>{return L.update(w),A},digest:(w)=>L.digest(w),save:()=>L.save(),load:(w)=>{return L.load(w),A},blockSize:4,digestSize:4};return A})}var bK="crc64",gK="AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAQUEAQECAgYOAn8BQZCJBgt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEKgwgGBQBBgAkL9QMDAX4BfwJ+AkBBACkDgIkCQQApA4AJIgBRDQBBgIkBIQFCACECA0AgAUIAQgBCAEIAQgBCAEIAQgAgAkIBg30gAIMgAkIBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIU3AwAgAUEIaiEBIAJCAXwiAkKAAlINAAtBACEBA0AgAUGImQFqIAFBiIkBaikDACICp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiKkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiLkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiMkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiNkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiOkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiPkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhTcDACABQQhqIgFB+A9HDQALQQAgADcDgIkCC0EAQgA3A4iJAguUAwIBfgJ/QQApA4iJAkJ/hSEBQYAJIQICQCAAQQhJDQBBgAkhAgNAIAIpAwAgAYUiAUIwiKdB/wFxQQN0QYCZAWopAwAgAUI4iKdBA3RBgIkBaikDAIUgAUIoiKdB/wFxQQN0QYCpAWopAwCFIAFCIIinQf8BcUEDdEGAuQFqKQMAhSABpyIDQRV2QfgPcUGAyQFqKQMAhSADQQ12QfgPcUGA2QFqKQMAhSADQQV2QfgPcUGA6QFqKQMAhSADQf8BcUEDdEGA+QFqKQMAhSEBIAJBCGohAiAAQXhqIgBBB0sNAAsLAkAgAEUNAAJAAkAgAEEBcQ0AIAAhAwwBCyABQv8BgyACMQAAhadBA3RBgIkBaikDACABQgiIhSEBIAJBAWohAiAAQX9qIQMLIABBAUYNAANAIAFC/wGDIAIxAACFp0EDdEGAiQFqKQMAIAFCCIiFIgFC/wGDIAJBAWoxAACFp0EDdEGAiQFqKQMAIAFCCIiFIQEgAkECaiECIANBfmoiAw0ACwtBACABQn+FNwOIiQILZAEBfkEAQQApA4iJAiIAQjiGIABCgP4Dg0IohoQgAEKAgPwHg0IYhiAAQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwOACQsGAEGIiQILAgALCwsBAEGACAsECAAAAA==",uK="c5ac6c16",e2={name:bK,data:gK,hash:uK};let mK=new W,J9=null,uQ=new Uint8Array(8);function ZY(B){if(typeof B!=="string"||B.length!==16)return{hi:0,lo:0,err:Error("Polynomial must be provided as a 16 char long hex string")};let A=Number(`0x${B.slice(0,8)}`),w=Number(`0x${B.slice(8)}`);if(Number.isNaN(A)||Number.isNaN(w))return{hi:A,lo:w,err:Error("Polynomial must be provided as a 16 char long hex string")};return{hi:A,lo:w,err:null}}function p1(B,L,A){let w=new DataView(B);w.setUint32(0,L,!0),w.setUint32(4,A,!0)}function cK(B,L="c96c5795d7870f42"){let{hi:A,lo:w,err:b}=ZY(L);if(b!==null)return Promise.reject(b);if(J9===null)return k(mK,e2,8).then((d)=>{return J9=d,p1(uQ.buffer,w,A),J9.writeMemory(uQ),J9.calculate(B)});try{p1(uQ.buffer,w,A),J9.writeMemory(uQ);let d=J9.calculate(B);return Promise.resolve(d)}catch(d){return Promise.reject(d)}}function lK(B="c96c5795d7870f42"){let{hi:L,lo:A,err:w}=ZY(B);if(w!==null)return Promise.reject(w);return S(e2,8).then((b)=>{let d=new Uint8Array(8);p1(d.buffer,A,L),b.writeMemory(d),b.init();let p={init:()=>{return b.writeMemory(d),b.init(),p},update:(i)=>{return b.update(i),p},digest:(i)=>b.digest(i),save:()=>b.save(),load:(i)=>{return b.load(i),p},blockSize:8,digestSize:8};return p})}var dK="md4",nK="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",pK="bd8ce7c7",QY={name:dK,data:nK,hash:pK};let iK=new W,mQ=null;function oK(B){if(mQ===null)return k(iK,QY,16).then((L)=>{return mQ=L,mQ.calculate(B)});try{let L=mQ.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function rK(){return S(QY,16).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:16};return L})}var aK="md5",sK="AGFzbQEAAAABEgRgAAF/YAAAYAF/AGACf38BfwMIBwABAgMBAAIFBAEBAgIGDgJ/AUGgigULfwBBgAgLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAELSGFzaF9VcGRhdGUAAgpIYXNoX0ZpbmFsAAQNSGFzaF9HZXRTdGF0ZQAFDkhhc2hfQ2FsY3VsYXRlAAYKU1RBVEVfU0laRQMBCoMaBwUAQYAJCy0AQQBC/rnrxemOlZkQNwKQiQFBAEKBxpS6lvHq5m83AoiJAUEAQgA3AoCJAQu+BQEHf0EAQQAoAoCJASIBIABqQf////8BcSICNgKAiQFBAEEAKAKEiQEgAiABSWogAEEddmo2AoSJAQJAAkACQAJAAkACQCABQT9xIgMNAEGACSEEDAELIABBwAAgA2siBUkNASAFQQNxIQZBACEBAkAgA0E/c0EDSQ0AIANBgIkBaiEEIAVB/ABxIQdBACEBA0AgBCABaiICQRhqIAFBgAlqLQAAOgAAIAJBGWogAUGBCWotAAA6AAAgAkEaaiABQYIJai0AADoAACACQRtqIAFBgwlqLQAAOgAAIAcgAUEEaiIBRw0ACwsCQCAGRQ0AIANBmIkBaiECA0AgAiABaiABQYAJai0AADoAACABQQFqIQEgBkF/aiIGDQALC0GYiQFBwAAQAxogACAFayEAIAVBgAlqIQQLIABBwABPDQEgACECDAILIABFDQIgAEEDcSEGQQAhAQJAIABBBEkNACADQYCJAWohBCAAQXxxIQBBACEBA0AgBCABaiICQRhqIAFBgAlqLQAAOgAAIAJBGWogAUGBCWotAAA6AAAgAkEaaiABQYIJai0AADoAACACQRtqIAFBgwlqLQAAOgAAIAAgAUEEaiIBRw0ACwsgBkUNAiADQZiJAWohAgNAIAIgAWogAUGACWotAAA6AAAgAUEBaiEBIAZBf2oiBg0ADAMLCyAAQT9xIQIgBCAAQUBxEAMhBAsgAkUNACACQQNxIQZBACEBAkAgAkEESQ0AIAJBPHEhAEEAIQEDQCABQZiJAWogBCABaiICLQAAOgAAIAFBmYkBaiACQQFqLQAAOgAAIAFBmokBaiACQQJqLQAAOgAAIAFBm4kBaiACQQNqLQAAOgAAIAAgAUEEaiIBRw0ACwsgBkUNAANAIAFBmIkBaiAEIAFqLQAAOgAAIAFBAWohASAGQX9qIgYNAAsLC4cQARl/QQAoApSJASECQQAoApCJASEDQQAoAoyJASEEQQAoAoiJASEFA0AgACgCCCIGIAAoAhgiByAAKAIoIgggACgCOCIJIAAoAjwiCiAAKAIMIgsgACgCHCIMIAAoAiwiDSAMIAsgCiANIAkgCCAHIAMgBmogAiAAKAIEIg5qIAUgBCACIANzcSACc2ogACgCACIPakH4yKq7fWpBB3cgBGoiECAEIANzcSADc2pB1u6exn5qQQx3IBBqIhEgECAEc3EgBHNqQdvhgaECakERdyARaiISaiAAKAIUIhMgEWogACgCECIUIBBqIAQgC2ogEiARIBBzcSAQc2pB7p33jXxqQRZ3IBJqIhAgEiARc3EgEXNqQa+f8Kt/akEHdyAQaiIRIBAgEnNxIBJzakGqjJ+8BGpBDHcgEWoiEiARIBBzcSAQc2pBk4zBwXpqQRF3IBJqIhVqIAAoAiQiFiASaiAAKAIgIhcgEWogDCAQaiAVIBIgEXNxIBFzakGBqppqakEWdyAVaiIQIBUgEnNxIBJzakHYsYLMBmpBB3cgEGoiESAQIBVzcSAVc2pBr++T2nhqQQx3IBFqIhIgESAQc3EgEHNqQbG3fWpBEXcgEmoiFWogACgCNCIYIBJqIAAoAjAiGSARaiANIBBqIBUgEiARc3EgEXNqQb6v88p4akEWdyAVaiIQIBUgEnNxIBJzakGiosDcBmpBB3cgEGoiESAQIBVzcSAVc2pBk+PhbGpBDHcgEWoiFSARIBBzcSAQc2pBjofls3pqQRF3IBVqIhJqIAcgFWogDiARaiAKIBBqIBIgFSARc3EgEXNqQaGQ0M0EakEWdyASaiIQIBJzIBVxIBJzakHiyviwf2pBBXcgEGoiESAQcyAScSAQc2pBwOaCgnxqQQl3IBFqIhIgEXMgEHEgEXNqQdG0+bICakEOdyASaiIVaiAIIBJqIBMgEWogDyAQaiAVIBJzIBFxIBJzakGqj9vNfmpBFHcgFWoiECAVcyAScSAVc2pB3aC8sX1qQQV3IBBqIhEgEHMgFXEgEHNqQdOokBJqQQl3IBFqIhIgEXMgEHEgEXNqQYHNh8V9akEOdyASaiIVaiAJIBJqIBYgEWogFCAQaiAVIBJzIBFxIBJzakHI98++fmpBFHcgFWoiECAVcyAScSAVc2pB5puHjwJqQQV3IBBqIhEgEHMgFXEgEHNqQdaP3Jl8akEJdyARaiISIBFzIBBxIBFzakGHm9Smf2pBDncgEmoiFWogBiASaiAYIBFqIBcgEGogFSAScyARcSASc2pB7anoqgRqQRR3IBVqIhAgFXMgEnEgFXNqQYXSj896akEFdyAQaiIRIBBzIBVxIBBzakH4x75nakEJdyARaiISIBFzIBBxIBFzakHZhby7BmpBDncgEmoiFWogFyASaiATIBFqIBkgEGogFSAScyARcSASc2pBipmp6XhqQRR3IBVqIhAgFXMiFSASc2pBwvJoakEEdyAQaiIRIBVzakGB7ce7eGpBC3cgEWoiEiARcyIaIBBzakGiwvXsBmpBEHcgEmoiFWogFCASaiAOIBFqIAkgEGogFSAac2pBjPCUb2pBF3cgFWoiECAVcyIVIBJzakHE1PulempBBHcgEGoiESAVc2pBqZ/73gRqQQt3IBFqIhIgEXMiCSAQc2pB4JbttX9qQRB3IBJqIhVqIA8gEmogGCARaiAIIBBqIBUgCXNqQfD4/vV7akEXdyAVaiIQIBVzIhUgEnNqQcb97cQCakEEdyAQaiIRIBVzakH6z4TVfmpBC3cgEWoiEiARcyIIIBBzakGF4bynfWpBEHcgEmoiFWogGSASaiAWIBFqIAcgEGogFSAIc2pBhbqgJGpBF3cgFWoiESAVcyIQIBJzakG5oNPOfWpBBHcgEWoiEiAQc2pB5bPutn5qQQt3IBJqIhUgEnMiByARc2pB+PmJ/QFqQRB3IBVqIhBqIAwgFWogDyASaiAGIBFqIBAgB3NqQeWssaV8akEXdyAQaiIRIBVBf3NyIBBzakHExKShf2pBBncgEWoiEiAQQX9zciARc2pBl/+rmQRqQQp3IBJqIhAgEUF/c3IgEnNqQafH0Nx6akEPdyAQaiIVaiALIBBqIBkgEmogEyARaiAVIBJBf3NyIBBzakG5wM5kakEVdyAVaiIRIBBBf3NyIBVzakHDs+2qBmpBBncgEWoiECAVQX9zciARc2pBkpmz+HhqQQp3IBBqIhIgEUF/c3IgEHNqQf3ov39qQQ93IBJqIhVqIAogEmogFyAQaiAOIBFqIBUgEEF/c3IgEnNqQdG7kax4akEVdyAVaiIQIBJBf3NyIBVzakHP/KH9BmpBBncgEGoiESAVQX9zciAQc2pB4M2zcWpBCncgEWoiEiAQQX9zciARc2pBlIaFmHpqQQ93IBJqIhVqIA0gEmogFCARaiAYIBBqIBUgEUF/c3IgEnNqQaGjoPAEakEVdyAVaiIQIBJBf3NyIBVzakGC/c26f2pBBncgEGoiESAVQX9zciAQc2pBteTr6XtqQQp3IBFqIhIgEEF/c3IgEXNqQbul39YCakEPdyASaiIVIARqIBYgEGogFSARQX9zciASc2pBkaeb3H5qQRV3aiEEIBUgA2ohAyASIAJqIQIgESAFaiEFIABBwABqIQAgAUFAaiIBDQALQQAgAjYClIkBQQAgAzYCkIkBQQAgBDYCjIkBQQAgBTYCiIkBIAALyAMBBX9BACgCgIkBQT9xIgBBmIkBakGAAToAACAAQQFqIQECQAJAAkACQCAAQT9zIgJBB0sNACACRQ0BIAFBmIkBakEAOgAAIAJBAUYNASAAQZqJAWpBADoAACACQQJGDQEgAEGbiQFqQQA6AAAgAkEDRg0BIABBnIkBakEAOgAAIAJBBEYNASAAQZ2JAWpBADoAACACQQVGDQEgAEGeiQFqQQA6AAAgAkEGRg0BIABBn4kBakEAOgAADAELIAJBCEYNAkE2IABrIgMhBAJAIAJBA3EiAEUNAEEAIABrIQRBACEAA0AgAEHPiQFqQQA6AAAgBCAAQX9qIgBHDQALIAMgAGohBAsgA0EDSQ0CDAELQZiJAUHAABADGkEAIQFBNyEECyABQYCJAWohAEF/IQIDQCAAIARqQRVqQQA2AAAgAEF8aiEAIAQgAkEEaiICRw0ACwtBAEEAKAKEiQE2AtSJAUEAQQAoAoCJASIAQRV2OgDTiQFBACAAQQ12OgDSiQFBACAAQQV2OgDRiQFBACAAQQN0IgA6ANCJAUEAIAA2AoCJAUGYiQFBwAAQAxpBAEEAKQKIiQE3A4AJQQBBACkCkIkBNwOICQsGAEGAiQELMwBBAEL+uevF6Y6VmRA3ApCJAUEAQoHGlLqW8ermbzcCiIkBQQBCADcCgIkBIAAQAhAECwsLAQBBgAgLBJgAAAA=",tK="e6508e4b",YY={name:aK,data:sK,hash:tK};let eK=new W,cQ=null;function ZG(B){if(cQ===null)return k(eK,YY,16).then((L)=>{return cQ=L,cQ.calculate(B)});try{let L=cQ.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function QG(){return S(YY,16).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:16};return L})}var YG="sha1",JG="AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwkIAAECAwECAAEFBAEBAgIGDgJ/AUHgiQULfwBBgAgLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAILSGFzaF9VcGRhdGUABApIYXNoX0ZpbmFsAAUNSGFzaF9HZXRTdGF0ZQAGDkhhc2hfQ2FsY3VsYXRlAAcKU1RBVEVfU0laRQMBCpoqCAUAQYAJC68iCgF+An8BfgF/AX4DfwF+AX8Bfkd/QQAgACkDECIBQiCIpyICQRh0IAJBgP4DcUEIdHIgAUIoiKdBgP4DcSABQjiIp3JyIgMgACkDCCIEQiCIpyICQRh0IAJBgP4DcUEIdHIgBEIoiKdBgP4DcSAEQjiIp3JyIgVzIAApAygiBkIgiKciAkEYdCACQYD+A3FBCHRyIAZCKIinQYD+A3EgBkI4iKdyciIHcyAEpyICQRh0IAJBgP4DcUEIdHIgAkEIdkGA/gNxIAJBGHZyciIIIAApAwAiBKciAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiCXMgACkDICIKpyICQRh0IAJBgP4DcUEIdHIgAkEIdkGA/gNxIAJBGHZyciILcyAAKQMwIgxCIIinIgJBGHQgAkGA/gNxQQh0ciAMQiiIp0GA/gNxIAxCOIincnIiAnNBAXciDXNBAXciDiAFIARCIIinIg9BGHQgD0GA/gNxQQh0ciAEQiiIp0GA/gNxIARCOIincnIiEHMgCkIgiKciD0EYdCAPQYD+A3FBCHRyIApCKIinQYD+A3EgCkI4iKdyciIRcyAAKQM4IgSnIg9BGHQgD0GA/gNxQQh0ciAPQQh2QYD+A3EgD0EYdnJyIg9zQQF3IhJzIAcgEXMgEnMgCyAAKQMYIgqnIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyIhNzIA9zIA5zQQF3IgBzQQF3IhRzIA0gD3MgAHMgAiAHcyAOcyAGpyIVQRh0IBVBgP4DcUEIdHIgFUEIdkGA/gNxIBVBGHZyciIWIAtzIA1zIApCIIinIhVBGHQgFUGA/gNxQQh0ciAKQiiIp0GA/gNxIApCOIincnIiFyADcyACcyABpyIVQRh0IBVBgP4DcUEIdHIgFUEIdkGA/gNxIBVBGHZyciIYIAhzIBZzIARCIIinIhVBGHQgFUGA/gNxQQh0ciAEQiiIp0GA/gNxIARCOIincnIiFXNBAXciGXNBAXciGnNBAXciG3NBAXciHHNBAXciHXNBAXciHiASIBVzIBEgF3MgFXMgEyAYcyAMpyIfQRh0IB9BgP4DcUEIdHIgH0EIdkGA/gNxIB9BGHZyciIgcyASc0EBdyIfc0EBdyIhcyAPICBzIB9zIBRzQQF3IiJzQQF3IiNzIBQgIXMgI3MgACAfcyAicyAec0EBdyIkc0EBdyIlcyAdICJzICRzIBwgFHMgHnMgGyAAcyAdcyAaIA5zIBxzIBkgDXMgG3MgFSACcyAacyAgIBZzIBlzICFzQQF3IiZzQQF3IidzQQF3IihzQQF3IilzQQF3IipzQQF3IitzQQF3IixzQQF3Ii0gIyAncyAhIBpzICdzIB8gGXMgJnMgI3NBAXciLnNBAXciL3MgIiAmcyAucyAlc0EBdyIwc0EBdyIxcyAlIC9zIDFzICQgLnMgMHMgLXNBAXciMnNBAXciM3MgLCAwcyAycyArICVzIC1zICogJHMgLHMgKSAecyArcyAoIB1zICpzICcgHHMgKXMgJiAbcyAocyAvc0EBdyI0c0EBdyI1c0EBdyI2c0EBdyI3c0EBdyI4c0EBdyI5c0EBdyI6c0EBdyI7IDEgNXMgLyApcyA1cyAuIChzIDRzIDFzQQF3IjxzQQF3Ij1zIDAgNHMgPHMgM3NBAXciPnNBAXciP3MgMyA9cyA/cyAyIDxzID5zIDtzQQF3IkBzQQF3IkFzIDogPnMgQHMgOSAzcyA7cyA4IDJzIDpzIDcgLXMgOXMgNiAscyA4cyA1ICtzIDdzIDQgKnMgNnMgPXNBAXciQnNBAXciQ3NBAXciRHNBAXciRXNBAXciRnNBAXciR3NBAXciSHNBAXciSSA+IEJzIDwgNnMgQnMgP3NBAXciSnMgQXNBAXciSyA9IDdzIENzIEpzQQF3IkwgRCA5IDIgMSA0ICkgHSAUIB8gFSAWQQAoAoCJASJNQQV3QQAoApCJASJOaiAJakEAKAKMiQEiT0EAKAKIiQEiCXNBACgChIkBIlBxIE9zakGZ84nUBWoiUUEedyJSIANqIFBBHnciAyAFaiBPIAMgCXMgTXEgCXNqIBBqIFFBBXdqQZnzidQFaiIQIFIgTUEedyIFc3EgBXNqIAkgCGogUSADIAVzcSADc2ogEEEFd2pBmfOJ1AVqIlFBBXdqQZnzidQFaiJTIFFBHnciAyAQQR53IghzcSAIc2ogBSAYaiBRIAggUnNxIFJzaiBTQQV3akGZ84nUBWoiBUEFd2pBmfOJ1AVqIhhBHnciUmogU0EedyIWIAtqIAggE2ogBSAWIANzcSADc2ogGEEFd2pBmfOJ1AVqIgggUiAFQR53IgtzcSALc2ogAyAXaiAYIAsgFnNxIBZzaiAIQQV3akGZ84nUBWoiBUEFd2pBmfOJ1AVqIhMgBUEedyIWIAhBHnciA3NxIANzaiALIBFqIAUgAyBSc3EgUnNqIBNBBXdqQZnzidQFaiIRQQV3akGZ84nUBWoiUkEedyILaiACIBNBHnciFWogByADaiARIBUgFnNxIBZzaiBSQQV3akGZ84nUBWoiByALIBFBHnciAnNxIAJzaiAgIBZqIFIgAiAVc3EgFXNqIAdBBXdqQZnzidQFaiIRQQV3akGZ84nUBWoiFiARQR53IhUgB0EedyIHc3EgB3NqIA8gAmogESAHIAtzcSALc2ogFkEFd2pBmfOJ1AVqIgtBBXdqQZnzidQFaiIRQR53IgJqIBIgFWogESALQR53Ig8gFkEedyISc3EgEnNqIA0gB2ogCyASIBVzcSAVc2ogEUEFd2pBmfOJ1AVqIg1BBXdqQZnzidQFaiIVQR53Ih8gDUEedyIHcyAZIBJqIA0gAiAPc3EgD3NqIBVBBXdqQZnzidQFaiINc2ogDiAPaiAVIAcgAnNxIAJzaiANQQV3akGZ84nUBWoiAkEFd2pBodfn9gZqIg5BHnciD2ogACAfaiACQR53IgAgDUEedyINcyAOc2ogGiAHaiANIB9zIAJzaiAOQQV3akGh1+f2BmoiAkEFd2pBodfn9gZqIg5BHnciEiACQR53IhRzICEgDWogDyAAcyACc2ogDkEFd2pBodfn9gZqIgJzaiAbIABqIBQgD3MgDnNqIAJBBXdqQaHX5/YGaiIAQQV3akGh1+f2BmoiDUEedyIOaiAcIBJqIABBHnciDyACQR53IgJzIA1zaiAmIBRqIAIgEnMgAHNqIA1BBXdqQaHX5/YGaiIAQQV3akGh1+f2BmoiDUEedyISIABBHnciFHMgIiACaiAOIA9zIABzaiANQQV3akGh1+f2BmoiAHNqICcgD2ogFCAOcyANc2ogAEEFd2pBodfn9gZqIgJBBXdqQaHX5/YGaiINQR53Ig5qICggEmogAkEedyIPIABBHnciAHMgDXNqICMgFGogACAScyACc2ogDUEFd2pBodfn9gZqIgJBBXdqQaHX5/YGaiINQR53IhIgAkEedyIUcyAeIABqIA4gD3MgAnNqIA1BBXdqQaHX5/YGaiIAc2ogLiAPaiAUIA5zIA1zaiAAQQV3akGh1+f2BmoiAkEFd2pBodfn9gZqIg1BHnciDmogKiAAQR53IgBqIA4gAkEedyIPcyAkIBRqIAAgEnMgAnNqIA1BBXdqQaHX5/YGaiIUc2ogLyASaiAPIABzIA1zaiAUQQV3akGh1+f2BmoiDUEFd2pBodfn9gZqIgAgDUEedyICciAUQR53IhJxIAAgAnFyaiAlIA9qIBIgDnMgDXNqIABBBXdqQaHX5/YGaiINQQV3akHc+e74eGoiDkEedyIPaiA1IABBHnciAGogKyASaiANIAByIAJxIA0gAHFyaiAOQQV3akHc+e74eGoiEiAPciANQR53Ig1xIBIgD3FyaiAwIAJqIA4gDXIgAHEgDiANcXJqIBJBBXdqQdz57vh4aiIAQQV3akHc+e74eGoiAiAAQR53Ig5yIBJBHnciEnEgAiAOcXJqICwgDWogACASciAPcSAAIBJxcmogAkEFd2pB3Pnu+HhqIgBBBXdqQdz57vh4aiINQR53Ig9qIDwgAkEedyICaiA2IBJqIAAgAnIgDnEgACACcXJqIA1BBXdqQdz57vh4aiISIA9yIABBHnciAHEgEiAPcXJqIC0gDmogDSAAciACcSANIABxcmogEkEFd2pB3Pnu+HhqIgJBBXdqQdz57vh4aiINIAJBHnciDnIgEkEedyIScSANIA5xcmogNyAAaiACIBJyIA9xIAIgEnFyaiANQQV3akHc+e74eGoiAEEFd2pB3Pnu+HhqIgJBHnciD2ogMyANQR53Ig1qID0gEmogACANciAOcSAAIA1xcmogAkEFd2pB3Pnu+HhqIhIgD3IgAEEedyIAcSASIA9xcmogOCAOaiACIAByIA1xIAIgAHFyaiASQQV3akHc+e74eGoiAkEFd2pB3Pnu+HhqIg0gAkEedyIOciASQR53IhJxIA0gDnFyaiBCIABqIAIgEnIgD3EgAiAScXJqIA1BBXdqQdz57vh4aiIAQQV3akHc+e74eGoiAkEedyIPaiBDIA5qIAIgAEEedyIUciANQR53Ig1xIAIgFHFyaiA+IBJqIAAgDXIgDnEgACANcXJqIAJBBXdqQdz57vh4aiIAQQV3akHc+e74eGoiAkEedyISIABBHnciDnMgOiANaiAAIA9yIBRxIAAgD3FyaiACQQV3akHc+e74eGoiAHNqID8gFGogAiAOciAPcSACIA5xcmogAEEFd2pB3Pnu+HhqIgJBBXdqQdaDi9N8aiINQR53Ig9qIEogEmogAkEedyIUIABBHnciAHMgDXNqIDsgDmogACAScyACc2ogDUEFd2pB1oOL03xqIgJBBXdqQdaDi9N8aiINQR53Ig4gAkEedyIScyBFIABqIA8gFHMgAnNqIA1BBXdqQdaDi9N8aiIAc2ogQCAUaiASIA9zIA1zaiAAQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciD2ogQSAOaiACQR53IhQgAEEedyIAcyANc2ogRiASaiAAIA5zIAJzaiANQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciDiACQR53IhJzIEIgOHMgRHMgTHNBAXciFSAAaiAPIBRzIAJzaiANQQV3akHWg4vTfGoiAHNqIEcgFGogEiAPcyANc2ogAEEFd2pB1oOL03xqIgJBBXdqQdaDi9N8aiINQR53Ig9qIEggDmogAkEedyIUIABBHnciAHMgDXNqIEMgOXMgRXMgFXNBAXciGSASaiAAIA5zIAJzaiANQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciDiACQR53IhJzID8gQ3MgTHMgS3NBAXciGiAAaiAPIBRzIAJzaiANQQV3akHWg4vTfGoiAHNqIEQgOnMgRnMgGXNBAXciGyAUaiASIA9zIA1zaiAAQQV3akHWg4vTfGoiAkEFd2pB1oOL03xqIg1BHnciDyBOajYCkIkBQQAgTyBKIERzIBVzIBpzQQF3IhQgEmogAEEedyIAIA5zIAJzaiANQQV3akHWg4vTfGoiEkEedyIVajYCjIkBQQAgCSBFIDtzIEdzIBtzQQF3IA5qIAJBHnciAiAAcyANc2ogEkEFd2pB1oOL03xqIg1BHndqNgKIiQFBACBQIEAgSnMgS3MgSXNBAXcgAGogDyACcyASc2ogDUEFd2pB1oOL03xqIgBqNgKEiQFBACBNIEwgRXMgGXMgFHNBAXdqIAJqIBUgD3MgDXNqIABBBXdqQdaDi9N8ajYCgIkBCzoAQQBC/rnrxemOlZkQNwKIiQFBAEKBxpS6lvHq5m83AoCJAUEAQvDDy54MNwKQiQFBAEEANgKYiQELqAMBCH9BACECQQBBACgClIkBIgMgAUEDdGoiBDYClIkBQQBBACgCmIkBIAQgA0lqIAFBHXZqNgKYiQECQCADQQN2QT9xIgUgAWpBwABJDQBBwAAgBWsiAkEDcSEGQQAhAwJAIAVBP3NBA0kNACAFQYCJAWohByACQfwAcSEIQQAhAwNAIAcgA2oiBEEcaiAAIANqIgktAAA6AAAgBEEdaiAJQQFqLQAAOgAAIARBHmogCUECai0AADoAACAEQR9qIAlBA2otAAA6AAAgCCADQQRqIgNHDQALCwJAIAZFDQAgACADaiEEIAMgBWpBnIkBaiEDA0AgAyAELQAAOgAAIARBAWohBCADQQFqIQMgBkF/aiIGDQALC0GciQEQASAFQf8AcyEDQQAhBSADIAFPDQADQCAAIAJqEAEgAkH/AGohAyACQcAAaiIEIQIgAyABSQ0ACyAEIQILAkAgASACRg0AIAEgAmshCSAAIAJqIQIgBUGciQFqIQNBACEEA0AgAyACLQAAOgAAIAJBAWohAiADQQFqIQMgCSAEQQFqIgRB/wFxSw0ACwsLCQBBgAkgABADC6YDAQJ/IwBBEGsiACQAIABBgAE6AAcgAEEAKAKYiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AAggAEEAKAKUiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AAwgAEEHakEBEAMCQEEAKAKUiQFB+ANxQcADRg0AA0AgAEEAOgAHIABBB2pBARADQQAoApSJAUH4A3FBwANHDQALCyAAQQhqQQgQA0EAQQAoAoCJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCgAlBAEEAKAKEiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AoQJQQBBACgCiIkBIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgKICUEAQQAoAoyJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCjAlBAEEAKAKQiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2ApAJIABBEGokAAsGAEGAiQELQwBBAEL+uevF6Y6VmRA3AoiJAUEAQoHGlLqW8ermbzcCgIkBQQBC8MPLngw3ApCJAUEAQQA2ApiJAUGACSAAEAMQBQsLCwEAQYAICwRcAAAA",zG="6b530c24",JY={name:YG,data:JG,hash:zG};let XG=new W,lQ=null;function WG(B){if(lQ===null)return k(XG,JY,20).then((L)=>{return lQ=L,lQ.calculate(B)});try{let L=lQ.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function VG(){return S(JY,20).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:20};return L})}var KG="sha3",GG="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",$G="fb24e536",dQ={name:KG,data:GG,hash:$G};let HG=new W,p9=null;function nQ(B){if(![224,256,384,512].includes(B))return Error("Invalid variant! Valid values: 224, 256, 384, 512");return null}function qG(B,L=512){if(nQ(L))return Promise.reject(nQ(L));let A=L/8;if(p9===null||p9.hashLength!==A)return k(HG,dQ,A).then((w)=>{return p9=w,p9.calculate(B,L,6)});try{let w=p9.calculate(B,L,6);return Promise.resolve(w)}catch(w){return Promise.reject(w)}}function UG(B=512){if(nQ(B))return Promise.reject(nQ(B));let L=B/8;return S(dQ,L).then((A)=>{A.init(B);let w={init:()=>{return A.init(B),w},update:(b)=>{return A.update(b),w},digest:(b)=>A.digest(b,6),save:()=>A.save(),load:(b)=>{return A.load(b),w},blockSize:200-2*L,digestSize:L};return w})}let NG=new W,i9=null;function pQ(B){if(![224,256,384,512].includes(B))return Error("Invalid variant! Valid values: 224, 256, 384, 512");return null}function BG(B,L=512){if(pQ(L))return Promise.reject(pQ(L));let A=L/8;if(i9===null||i9.hashLength!==A)return k(NG,dQ,A).then((w)=>{return i9=w,i9.calculate(B,L,1)});try{let w=i9.calculate(B,L,1);return Promise.resolve(w)}catch(w){return Promise.reject(w)}}function jG(B=512){if(pQ(B))return Promise.reject(pQ(B));let L=B/8;return S(dQ,L).then((A)=>{A.init(B);let w={init:()=>{return A.init(B),w},update:(b)=>{return A.update(b),w},digest:(b)=>A.digest(b,1),save:()=>A.save(),load:(b)=>{return A.load(b),w},blockSize:200-2*L,digestSize:L};return w})}var FG="sha256",MG="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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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",RG="8c18dd94",iQ={name:FG,data:MG,hash:RG};let DG=new W,oQ=null;function PG(B){if(oQ===null)return k(DG,iQ,28).then((L)=>{return oQ=L,oQ.calculate(B,224)});try{let L=oQ.calculate(B,224);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function OG(){return S(iQ,28).then((B)=>{B.init(224);let L={init:()=>{return B.init(224),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:28};return L})}let LG=new W,rQ=null;function CG(B){if(rQ===null)return k(LG,iQ,32).then((L)=>{return rQ=L,rQ.calculate(B,256)});try{let L=rQ.calculate(B,256);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function zY(){return S(iQ,32).then((B)=>{B.init(256);let L={init:()=>{return B.init(256),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:32};return L})}var _G="sha512",TG="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",AG="f2e40eb1",aQ={name:_G,data:TG,hash:AG};let EG=new W,sQ=null;function IG(B){if(sQ===null)return k(EG,aQ,48).then((L)=>{return sQ=L,sQ.calculate(B,384)});try{let L=sQ.calculate(B,384);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function SG(){return S(aQ,48).then((B)=>{B.init(384);let L={init:()=>{return B.init(384),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:128,digestSize:48};return L})}let vG=new W,tQ=null;function wG(B){if(tQ===null)return k(vG,aQ,64).then((L)=>{return tQ=L,tQ.calculate(B,512)});try{let L=tQ.calculate(B,512);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function yG(){return S(aQ,64).then((B)=>{B.init(512);let L={init:()=>{return B.init(512),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:128,digestSize:64};return L})}var xG="xxhash32",kG="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",fG="4bb12485",XY={name:xG,data:kG,hash:fG};let hG=new W,eQ=null;function Z6(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be a valid 32-bit long unsigned integer.");return null}function bG(B,L=0){if(Z6(L))return Promise.reject(Z6(L));if(eQ===null)return k(hG,XY,4).then((A)=>{return eQ=A,eQ.calculate(B,L)});try{let A=eQ.calculate(B,L);return Promise.resolve(A)}catch(A){return Promise.reject(A)}}function gG(B=0){if(Z6(B))return Promise.reject(Z6(B));return S(XY,4).then((L)=>{L.init(B);let A={init:()=>{return L.init(B),A},update:(w)=>{return L.update(w),A},digest:(w)=>L.digest(w),save:()=>L.save(),load:(w)=>{return L.load(w),A},blockSize:16,digestSize:4};return A})}var uG="xxhash64",mG="AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAQUEAQECAgYOAn8BQdCJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEKmxEGBQBBgAkLYwEBfkEAQgA3A8iJAUEAQQApA4AJIgA3A5CJAUEAIABC+erQ0OfJoeThAHw3A5iJAUEAIABCz9bTvtLHq9lCfDcDiIkBQQAgAELW64Lu6v2J9eAAfDcDgIkBQQBBADYCwIkBC70IAwV/BH4CfwJAIABFDQBBAEEAKQPIiQEgAK18NwPIiQECQEEAKALAiQEiASAAakEfSw0AAkACQCAAQQNxIgINAEGACSEDIAAhAQwBCyAAQXxxIQFBgAkhAwNAQQBBACgCwIkBIgRBAWo2AsCJASAEQaCJAWogAy0AADoAACADQQFqIQMgAkF/aiICDQALCyAAQQRJDQEDQEEAQQAoAsCJASICQQFqNgLAiQEgAkGgiQFqIAMtAAA6AAAgA0EBai0AACECQQBBACgCwIkBIgRBAWo2AsCJASAEQaCJAWogAjoAACADQQJqLQAAIQJBAEEAKALAiQEiBEEBajYCwIkBIARBoIkBaiACOgAAIANBA2otAAAhAkEAQQAoAsCJASIEQQFqNgLAiQEgBEGgiQFqIAI6AAAgA0EEaiEDIAFBfGoiAQ0ADAILCyAAQeAIaiEFAkACQCABDQBBACkDmIkBIQZBACkDkIkBIQdBACkDiIkBIQhBACkDgIkBIQlBgAkhAwwBC0GACSEDAkAgAUEfSw0AQYAJIQMCQAJAQQAgAWtBA3EiBA0AIAEhAgwBCyABIQIDQCACQaCJAWogAy0AADoAACACQQFqIQIgA0EBaiEDIARBf2oiBA0ACwsgAUFjakEDSQ0AQSAgAmshCkEAIQQDQCACIARqIgFBoIkBaiADIARqIgstAAA6AAAgAUGhiQFqIAtBAWotAAA6AAAgAUGiiQFqIAtBAmotAAA6AAAgAUGjiQFqIAtBA2otAAA6AAAgCiAEQQRqIgRHDQALIAMgBGohAwtBAEEAKQOgiQFCz9bTvtLHq9lCfkEAKQOAiQF8Qh+JQoeVr6+Ytt6bnn9+Igk3A4CJAUEAQQApA6iJAULP1tO+0ser2UJ+QQApA4iJAXxCH4lCh5Wvr5i23puef34iCDcDiIkBQQBBACkDsIkBQs/W077Sx6vZQn5BACkDkIkBfEIfiUKHla+vmLbem55/fiIHNwOQiQFBAEEAKQO4iQFCz9bTvtLHq9lCfkEAKQOYiQF8Qh+JQoeVr6+Ytt6bnn9+IgY3A5iJAQsgAEGACWohAgJAIAMgBUsNAANAIAMpAwBCz9bTvtLHq9lCfiAJfEIfiUKHla+vmLbem55/fiEJIANBGGopAwBCz9bTvtLHq9lCfiAGfEIfiUKHla+vmLbem55/fiEGIANBEGopAwBCz9bTvtLHq9lCfiAHfEIfiUKHla+vmLbem55/fiEHIANBCGopAwBCz9bTvtLHq9lCfiAIfEIfiUKHla+vmLbem55/fiEIIANBIGoiAyAFTQ0ACwtBACAGNwOYiQFBACAHNwOQiQFBACAINwOIiQFBACAJNwOAiQFBACACIANrNgLAiQEgAiADRg0AQQAhAgNAIAJBoIkBaiADIAJqLQAAOgAAIAJBAWoiAkEAKALAiQFJDQALCwvlBwIFfgV/AkACQEEAKQPIiQEiAEIgVA0AQQApA4iJASIBQgeJQQApA4CJASICQgGJfEEAKQOQiQEiA0IMiXxBACkDmIkBIgRCEol8IAJCz9bTvtLHq9lCfkIfiUKHla+vmLbem55/foVCh5Wvr5i23puef35C49zKlfzO8vWFf3wgAULP1tO+0ser2UJ+Qh+JQoeVr6+Ytt6bnn9+hUKHla+vmLbem55/fkLj3MqV/M7y9YV/fCADQs/W077Sx6vZQn5CH4lCh5Wvr5i23puef36FQoeVr6+Ytt6bnn9+QuPcypX8zvL1hX98IARCz9bTvtLHq9lCfkIfiUKHla+vmLbem55/foVCh5Wvr5i23puef35C49zKlfzO8vWFf3whAQwBC0EAKQOQiQFCxc/ZsvHluuonfCEBCyABIAB8IQBBoIkBIQVBqIkBIQYCQEEAKALAiQEiB0GgiQFqIghBqIkBSQ0AQaCJASEFAkAgB0F4aiIJQQhxDQBBACkDoIkBQs/W077Sx6vZQn5CH4lCh5Wvr5i23puef34gAIVCG4lCh5Wvr5i23puef35C49zKlfzO8vWFf3whAEGwiQEhBkGoiQEhBSAJQQhJDQELA0AgBikDAELP1tO+0ser2UJ+Qh+JQoeVr6+Ytt6bnn9+IAUpAwBCz9bTvtLHq9lCfkIfiUKHla+vmLbem55/fiAAhUIbiUKHla+vmLbem55/fkLj3MqV/M7y9YV/fIVCG4lCh5Wvr5i23puef35C49zKlfzO8vWFf3whACAGQQhqIQUgBkEQaiIGIAhNDQALIAZBeGohBQsCQAJAIAVBBGoiCSAITQ0AIAUhCQwBCyAFNQIAQoeVr6+Ytt6bnn9+IACFQheJQs/W077Sx6vZQn5C+fPd8Zn2masWfCEACwJAIAkgCEYNACAHQZ+JAWohBQJAAkAgByAJa0EBcQ0AIAkhBgwBCyAJQQFqIQYgCTEAAELFz9my8eW66id+IACFQguJQoeVr6+Ytt6bnn9+IQALIAUgCUYNAANAIAZBAWoxAABCxc/ZsvHluuonfiAGMQAAQsXP2bLx5brqJ34gAIVCC4lCh5Wvr5i23puef36FQguJQoeVr6+Ytt6bnn9+IQAgBkECaiIGIAhHDQALC0EAIABCIYggAIVCz9bTvtLHq9lCfiIAQh2IIACFQvnz3fGZ9pmrFn4iAEIgiCAAhSIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwOACQsGAEGAiQELAgALCwsBAEGACAsEUAAAAA==",cG="177fbfa3",WY={name:uG,data:mG,hash:cG};let lG=new W,z9=null,Q6=new Uint8Array(8);function G0(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be given as two valid 32-bit long unsigned integers (lo + high).");return null}function i1(B,L,A){let w=new DataView(B);w.setUint32(0,L,!0),w.setUint32(4,A,!0)}function dG(B,L=0,A=0){if(G0(L))return Promise.reject(G0(L));if(G0(A))return Promise.reject(G0(A));if(z9===null)return k(lG,WY,8).then((w)=>{return z9=w,i1(Q6.buffer,L,A),z9.writeMemory(Q6),z9.calculate(B)});try{i1(Q6.buffer,L,A),z9.writeMemory(Q6);let w=z9.calculate(B);return Promise.resolve(w)}catch(w){return Promise.reject(w)}}function nG(B=0,L=0){if(G0(B))return Promise.reject(G0(B));if(G0(L))return Promise.reject(G0(L));return S(WY,8).then((A)=>{let w=new Uint8Array(8);i1(w.buffer,B,L),A.writeMemory(w),A.init();let b={init:()=>{return A.writeMemory(w),A.init(),b},update:(d)=>{return A.update(d),b},digest:(d)=>A.digest(d),save:()=>A.save(),load:(d)=>{return A.load(d),b},blockSize:32,digestSize:8};return b})}var pG="xxhash3",iG="AGFzbQEAAAABNAhgAAF/YAR/f39/AGAHf39/f39/fwBgBH9+fn4BfmAEf39/fgF+YAN/f34BfmAAAGABfwADDg0AAQIDBAUFBQYHBgAGBQQBAQICBg4CfwFBwI4FC38AQcAJCwdwCAZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACUhhc2hfSW5pdAAIC0hhc2hfVXBkYXRlAAkKSGFzaF9GaW5hbAAKDUhhc2hfR2V0U3RhdGUACw5IYXNoX0NhbGN1bGF0ZQAMClNUQVRFX1NJWkUDAQr6QQ0FAEGACgvkAwMPfgF/AX4CQCADRQ0AIAApAzAhBCAAKQM4IQUgACkDICEGIAApAyghByAAKQMQIQggACkDGCEJIAApAwAhCiAAKQMIIQsDQCAFIAFBMGopAwAiDHwgAkE4aikDACABQThqKQMAIg2FIgVCIIggBUL/////D4N+fCEFIAcgAUEgaikDACIOfCACQShqKQMAIAFBKGopAwAiD4UiB0IgiCAHQv////8Pg358IQcgCSABQRBqKQMAIhB8IAJBGGopAwAgAUEYaikDACIRhSIJQiCIIAlC/////w+DfnwhCSALIAEpAwAiEnwgAkEIaiITKQMAIAFBCGopAwAiFIUiC0IgiCALQv////8Pg358IQsgAkEwaikDACAMhSIMQiCIIAxC/////w+DfiAEfCANfCEEIAJBIGopAwAgDoUiDEIgiCAMQv////8Pg34gBnwgD3whBiACQRBqKQMAIBCFIgxCIIggDEL/////D4N+IAh8IBF8IQggAikDACAShSIMQiCIIAxC/////w+DfiAKfCAUfCEKIAFBwABqIQEgEyECIANBf2oiAw0ACyAAIAk3AxggACAKNwMAIAAgCzcDCCAAIAc3AyggACAINwMQIAAgBTcDOCAAIAY3AyAgACAENwMwCwveAgIBfwF+AkAgBCACIAEoAgAiB2siAkkNACAAIAMgBSAHQQN0aiACEAEgACAFIAZqIgcpAwAgACkDACIIQi+IhSAIhUKx893xCX43AwAgACAHKQMIIAApAwgiCEIviIUgCIVCsfPd8Ql+NwMIIAAgBykDECAAKQMQIghCL4iFIAiFQrHz3fEJfjcDECAAIAcpAxggACkDGCIIQi+IhSAIhUKx893xCX43AxggACAHKQMgIAApAyAiCEIviIUgCIVCsfPd8Ql+NwMgIAAgBykDKCAAKQMoIghCL4iFIAiFQrHz3fEJfjcDKCAAIAcpAzAgACkDMCIIQi+IhSAIhUKx893xCX43AzAgACAHKQM4IAApAzgiCEIviIUgCIVCsfPd8Ql+NwM4IAAgAyACQQZ0aiAFIAQgAmsiBxABIAEgBzYCAA8LIAAgAyAFIAdBA3RqIAQQASABIAcgBGo2AgALhQEBAX8gAiABhSADpyIEQRh0IARBgP4DcUEIdHIgBEEIdkGA/gNxIARBGHZycq1CIIYgA4V9QQA1AoCMAUIghiAAQfyLAWo1AgCEhSIDQjGJIANCGImFIAOFQqW+4/TRjIfZn39+IgNCI4ggAK18IAOFQqW+4/TRjIfZn39+IgNCHIggA4ULZwAgAiABc60gA3wiA0IhiEEALQCAjAFBEHQgAEEIdHIgAEEBdkGAjAFqLQAAQRh0ciAAQf+LAWotAAByrYUgA4VCz9bTvtLHq9lCfiIDQh2IIAOFQvnz3fGZ9pmrFn4iA0IgiCADhQuJAwEEfgJAIABBCUkNAEEAKQOAjAEgASkDICABKQMYhSACfIUiA0I4hiADQoD+A4NCKIaEIANCgID8B4NCGIYgA0KAgID4D4NCCIaEhCADQgiIQoCAgPgPgyADQhiIQoCA/AeDhCADQiiIQoD+A4MgA0I4iISEhCAArXwgAEH4iwFqKQMAIAEpAzAgASkDKIUgAn2FIgJ8IAJC/////w+DIgQgA0IgiCIFfiIGQv////8PgyACQiCIIgIgA0L/////D4MiA358IAQgA34iA0IgiHwiBEIghiADQv////8Pg4QgBkIgiCACIAV+fCAEQiCIfIV8IgNCJYggA4VC+fPd8ZnymasWfiIDQiCIIAOFDwsCQCAAQQRJDQAgACABQQhqKQMAIAFBEGopAwAgAhADDwsCQCAARQ0AIAAgASgCACABQQRqKAIAIAIQBA8LIAEpAzggASkDQIUgAoUiA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC94IAQZ+IACtQoeVr6+Ytt6bnn9+IQMCQCAAQSFJDQACQCAAQcEASQ0AAkAgAEHhAEkNACABKQNoIAJ9QQApA7iMAYUiBEL/////D4MiBSABKQNgIAJ8QQApA7CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDeCACfSAAQciLAWopAwCFIgNC/////w+DIgQgASkDcCACfCAAQcCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQNIIAJ9QQApA6iMAYUiBEL/////D4MiBSABKQNAIAJ8QQApA6CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDWCACfSAAQdiLAWopAwCFIgNC/////w+DIgQgASkDUCACfCAAQdCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQMoIAJ9QQApA5iMAYUiBEL/////D4MiBSABKQMgIAJ8QQApA5CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDOCACfSAAQeiLAWopAwCFIgNC/////w+DIgQgASkDMCACfCAAQeCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQMIIAJ9QQApA4iMAYUiBEL/////D4MiBSABKQMAIAJ8QQApA4CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDGCACfSAAQfiLAWopAwCFIgNC/////w+DIgQgASkDECACfCAAQfCLAWopAwCFIgJCIIgiBX4iBkL/////D4MgA0IgiCIDIAJC/////w+DIgJ+fCAEIAJ+IgJCIIh8IgRCIIYgAkL/////D4OEIAZCIIggAyAFfnwgBEIgiHyFfCICQiWIIAKFQvnz3fGZ8pmrFn4iAkIgiCAChQv8CgQBfwV+An8BfkEAIQMgASkDeCACfUEAKQP4jAGFIgRC/////w+DIgUgASkDcCACfEEAKQPwjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpA2ggAn1BACkD6IwBhSIEQv////8PgyIFIAEpA2AgAnxBACkD4IwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSABKQNYIAJ9QQApA9iMAYUiBEL/////D4MiBSABKQNQIAJ8QQApA9CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgASkDSCACfUEAKQPIjAGFIgRC/////w+DIgUgASkDQCACfEEAKQPAjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpAzggAn1BACkDuIwBhSIEQv////8PgyIFIAEpAzAgAnxBACkDsIwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSABKQMoIAJ9QQApA6iMAYUiBEL/////D4MiBSABKQMgIAJ8QQApA6CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgASkDGCACfUEAKQOYjAGFIgRC/////w+DIgUgASkDECACfEEAKQOQjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpAwggAn1BACkDiIwBhSIEQv////8PgyIFIAEpAwAgAnxBACkDgIwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSAArUKHla+vmLbem55/fnx8fHx8fHx8IgRCJYggBIVC+fPd8ZnymasWfiIEQiCIIASFIQQCQCAAQZABSA0AIABBBHZBeGohCQNAIAEgA2oiCkELaikDACACfSADQYiNAWopAwCFIgVC/////w+DIgYgCkEDaikDACACfCADQYCNAWopAwCFIgdCIIgiCH4iC0L/////D4MgBUIgiCIFIAdC/////w+DIgd+fCAGIAd+IgZCIIh8IgdCIIYgBkL/////D4OEIAtCIIggBSAIfnwgB0IgiHyFIAR8IQQgA0EQaiEDIAlBf2oiCQ0ACwsgASkDfyACfSAAQfiLAWopAwCFIgVC/////w+DIgYgASkDdyACfCAAQfCLAWopAwCFIgJCIIgiB34iCEL/////D4MgBUIgiCIFIAJC/////w+DIgJ+fCAGIAJ+IgJCIIh8IgZCIIYgAkL/////D4OEIAhCIIggBSAHfnwgBkIgiHyFIAR8IgJCJYggAoVC+fPd8ZnymasWfiICQiCIIAKFC98FAgF+AX8CQAJAQQApA4AKIgBQRQ0AQYAIIQFCACEADAELAkBBACkDoI4BIABSDQBBACEBDAELQQAhAUEAQq+v79e895Kg/gAgAH03A/iLAUEAIABCxZbr+djShYIofDcD8IsBQQBCj/Hjja2P9JhOIAB9NwPoiwFBACAAQqus+MXV79HQfHw3A+CLAUEAQtOt1LKShbW0nn8gAH03A9iLAUEAIABCl5r0jvWWvO3JAHw3A9CLAUEAQsWDgv2v/8SxayAAfTcDyIsBQQAgAELqi7OdyOb09UN8NwPAiwFBAELIv/rLnJveueQAIAB9NwO4iwFBACAAQoqjgd/Ume2sMXw3A7CLAUEAQvm57738+MKnHSAA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QQApA4CKATcDACACQQApA4iKATcDCCACQQApA5CKATcDECACQQApA5iKATcDGCACQQApA6CKATcDICACQQApA6iKATcDKCACQQApA7CKASIFNwMwIAJBACkDuIoBIgY3AzgCQAJAQQAoAoCOASIHQcAASQ0AIAJBACgCiI4BNgJAIAIgAkHAAGpBACgCmI4BQYCMASAHQX9qQQZ2IANBACgCnI4BIgAQAiADIABqIgBBeWopAwAhCCAAKQMJIQkgACkDGSEKIAApAykhCyAHQcCLAWopAwAhBSAAKQMBIQwgB0HIiwFqKQMAIQYgB0HQiwFqKQMAIQ0gACkDESEOIAdB2IsBaikDACEPIAdB4IsBaikDACEQIAApAyEhESAHQeiLAWopAwAhEiACKQMAIRMgAikDECEUIAIpAyAhFSACKQMwIRYgAikDCCEXIAIpAxghGCACKQMoIRkgAiACKQM4IAdB8IsBaikDACIafCAAKQMxIAdB+IsBaikDACIbhSIcQiCIIBxC/////w+Dfnw3AzggGSAQfCARIBKFIhFCIIggEUL/////D4N+fCERIBggDXwgDiAPhSIOQiCIIA5C/////w+DfnwhDiAXIAV8IAwgBoUiDEIgiCAMQv////8Pg358IQwgGyAWIAsgGoUiC0IgiCALQv////8Pg358fCELIBIgFSAKIBCFIhBCIIggEEL/////D4N+fHwhECAPIBQgCSANhSINQiCIIA1C/////w+Dfnx8IRIgBiATIAggBYUiBUIgiCAFQv////8Pg358fCEIDAELIAdBwI0BaiEdQcAAIAdrIR4gAkHAAGohAAJAAkACQCAHQThNDQAgHiEfDAELAkACQEE4IAdrQQN2QQFqQQdxIh8NACACQcAAaiEAIB4hHwwBCyACQcAAaiEAIB9BA3QiICEfA0AgACAdKQMANwMAIABBCGohACAdQQhqIR0gH0F4aiIfDQALQcAAIAcgIGprIR8LAkAgBw0AA0AgACAdKQMANwMAIABBCGogHUEIaikDADcDACAAQRBqIB1BEGopAwA3AwAgAEEYaiAdQRhqKQMANwMAIABBIGogHUEgaikDADcDACAAQShqIB1BKGopAwA3AwAgAEEwaiAdQTBqKQMANwMAIABBOGogHUE4aikDADcDACAAQcAAaiEAIB1BwABqIR0gH0FAaiIfQQdLDQALCyAfRQ0BCyAfQX9qISECQCAfQQdxIiBFDQAgH0F4cSEfA0AgACAdLQAAOgAAIABBAWohACAdQQFqIR0gIEF/aiIgDQALCyAhQQdJDQADQCAAIB0pAAA3AAAgAEEIaiEAIB1BCGohHSAfQXhqIh8NAAsLIAJBwABqIB5qIR1BgIwBIQACQAJAAkAgB0EISQ0AAkAgB0E4akEDdkEBakEHcSIfDQAMAgsgH0EDdCEgQYCMASEAA0AgHSAAKQMANwMAIB1BCGohHSAAQQhqIQAgH0F/aiIfDQALIAcgIGshBwsgB0UNAQJAAkAgB0EHcSIgDQAgByEfDAELIAdBeHEhHwNAIB0gAC0AADoAACAdQQFqIR0gAEEBaiEAICBBf2oiIA0ACwsgB0EISQ0BCwNAIB0gACkAADcAACAdQQhqIR0gAEEIaiEAIB9BeGoiHw0ACwsgA0EAKAKcjgFqIgBBeWopAwAhCiAAKQMJIRMgACkDGSEUIAApAykhCyAAKQMBIQwgACkDESEOIAApAyEhESACKQMAIRUgAikDECEWIAIpAyAhFyACKQMIIRggAikDQCENIAIpA0ghDyACKQMYIRkgAikDUCESIAIpA1ghCCACKQMoIRogAikDYCEQIAIpA2ghCSACIAYgAikDcCIbfCAAKQMxIAIpA3giBoUiHEIgiCAcQv////8Pg358NwM4IBogEHwgESAJhSIRQiCIIBFC/////w+DfnwhESAZIBJ8IA4gCIUiDkIgiCAOQv////8Pg358IQ4gGCANfCAMIA+FIgxCIIggDEL/////D4N+fCEMIAYgCyAbhSILQiCIIAtC/////w+DfiAFfHwhCyAJIBcgFCAQhSIFQiCIIAVC/////w+Dfnx8IRAgCCAWIBMgEoUiBUIgiCAFQv////8Pg358fCESIA8gFSAKIA2FIgVCIIggBUL/////D4N+fHwhCAsgAykDQyACKQM4hSIFQv////8PgyIGIAMpAzsgC4UiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDMyARhSIFQv////8PgyIGIAMpAysgEIUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDIyAOhSIFQv////8PgyIGIAMpAxsgEoUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDEyAMhSIFQv////8PgyIGIAMpAwsgCIUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgBEKHla+vmLbem55/fnx8fHwiBEIliCAEhUL5893xmfKZqxZ+IgRCIIggBIUhBAwBCyAEpyEAAkBBACkDoI4BIgRQDQACQCAAQRBLDQAgAEGACCAEEAUhBAwCCwJAIABBgAFLDQAgAEGACCAEEAYhBAwCCyAAQYAIIAQQByEEDAELAkAgAEEQSw0AIAAgA0IAEAUhBAwBCwJAIABBgAFLDQAgACADQgAQBiEEDAELIAAgA0IAEAchBAtBACAEQjiGIARCgP4Dg0IohoQgBEKAgPwHg0IYhiAEQoCAgPgPg0IIhoSEIARCCIhCgICA+A+DIARCGIhCgID8B4OEIARCKIhCgP4DgyAEQjiIhISENwOACiABJAALBgBBgIoBCwIACwvMAQEAQYAIC8QBuP5sOSOkS758AYEs9yGtHN7UbemDkJfbckCkpLezZx/LeeZOzMDleIJa0H3M/3IhuAhGdPdDJI7gNZDmgTomTDwoUruRwwDLiNBlixtTLqNxZEiXog35TjgZ70ap3qzYqPp2P+OcND/53LvHxwtPHYpR4EvNtFkxyJ9+ydl4c2TqxayDNNPrw8WBoP/6E2PrFw3dUbfw2knTFlUmKdRonisWvlh9R6H8j/i40XrQMc5FyzqPlRYEKK/X+8q7S0B+QAIAAA==",oG="5a2fbdbb",VY={name:pG,data:iG,hash:oG};let rG=new W,X9=null,Y6=new Uint8Array(8);function $0(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be given as two valid 32-bit long unsigned integers (lo + high).");return null}function o1(B,L,A){let w=new DataView(B);w.setUint32(0,L,!0),w.setUint32(4,A,!0)}function aG(B,L=0,A=0){if($0(L))return Promise.reject($0(L));if($0(A))return Promise.reject($0(A));if(X9===null)return k(rG,VY,8).then((w)=>{return X9=w,o1(Y6.buffer,L,A),X9.writeMemory(Y6),X9.calculate(B)});try{o1(Y6.buffer,L,A),X9.writeMemory(Y6);let w=X9.calculate(B);return Promise.resolve(w)}catch(w){return Promise.reject(w)}}function sG(B=0,L=0){if($0(B))return Promise.reject($0(B));if($0(L))return Promise.reject($0(L));return S(VY,8).then((A)=>{let w=new Uint8Array(8);o1(w.buffer,B,L),A.writeMemory(w),A.init();let b={init:()=>{return A.writeMemory(w),A.init(),b},update:(d)=>{return A.update(d),b},digest:(d)=>A.digest(d),save:()=>A.save(),load:(d)=>{return A.load(d),b},blockSize:512,digestSize:8};return b})}var tG="xxhash128",eG="AGFzbQEAAAABKwdgAAF/YAR/f39/AGAHf39/f39/fwBgA39/fgF+YAR/f39+AGAAAGABfwADDQwAAQIDBAQEBQYFAAUFBAEBAgIGDgJ/AUHAjgULfwBBwAkLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAcLSGFzaF9VcGRhdGUACApIYXNoX0ZpbmFsAAkNSGFzaF9HZXRTdGF0ZQAKDkhhc2hfQ2FsY3VsYXRlAAsKU1RBVEVfU0laRQMBCqBNDAUAQYAKC+QDAw9+AX8BfgJAIANFDQAgACkDMCEEIAApAzghBSAAKQMgIQYgACkDKCEHIAApAxAhCCAAKQMYIQkgACkDACEKIAApAwghCwNAIAUgAUEwaikDACIMfCACQThqKQMAIAFBOGopAwAiDYUiBUIgiCAFQv////8Pg358IQUgByABQSBqKQMAIg58IAJBKGopAwAgAUEoaikDACIPhSIHQiCIIAdC/////w+DfnwhByAJIAFBEGopAwAiEHwgAkEYaikDACABQRhqKQMAIhGFIglCIIggCUL/////D4N+fCEJIAsgASkDACISfCACQQhqIhMpAwAgAUEIaikDACIUhSILQiCIIAtC/////w+DfnwhCyACQTBqKQMAIAyFIgxCIIggDEL/////D4N+IAR8IA18IQQgAkEgaikDACAOhSIMQiCIIAxC/////w+DfiAGfCAPfCEGIAJBEGopAwAgEIUiDEIgiCAMQv////8Pg34gCHwgEXwhCCACKQMAIBKFIgxCIIggDEL/////D4N+IAp8IBR8IQogAUHAAGohASATIQIgA0F/aiIDDQALIAAgCTcDGCAAIAo3AwAgACALNwMIIAAgBzcDKCAAIAg3AxAgACAFNwM4IAAgBjcDICAAIAQ3AzALC94CAgF/AX4CQCAEIAIgASgCACIHayICSQ0AIAAgAyAFIAdBA3RqIAIQASAAIAUgBmoiBykDACAAKQMAIghCL4iFIAiFQrHz3fEJfjcDACAAIAcpAwggACkDCCIIQi+IhSAIhUKx893xCX43AwggACAHKQMQIAApAxAiCEIviIUgCIVCsfPd8Ql+NwMQIAAgBykDGCAAKQMYIghCL4iFIAiFQrHz3fEJfjcDGCAAIAcpAyAgACkDICIIQi+IhSAIhUKx893xCX43AyAgACAHKQMoIAApAygiCEIviIUgCIVCsfPd8Ql+NwMoIAAgBykDMCAAKQMwIghCL4iFIAiFQrHz3fEJfjcDMCAAIAcpAzggACkDOCIIQi+IhSAIhUKx893xCX43AzggACADIAJBBnRqIAUgBCACayIHEAEgASAHNgIADwsgACADIAUgB0EDdGogBBABIAEgByAEajYCAAvtAwEFfiABKQM4IAApAziFIgNC/////w+DIgQgASkDMCAAKQMwhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMoIAApAyiFIgNC/////w+DIgQgASkDICAAKQMghSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMYIAApAxiFIgNC/////w+DIgQgASkDECAAKQMQhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMIIAApAwiFIgNC/////w+DIgQgASkDACAAKQMAhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSACfHx8fCICQiWIIAKFQvnz3fGZ8pmrFn4iAkIgiCAChQu6CAIFfgN/AkAgAUEJSQ0AIAAgAUH4iwFqKQMAIgQgAikDOCACKQMwhSADfIUiBUL/////D4NC95Svrwh+IAVCgICAgHCDfEEAKQOAjAEgAikDKCACKQMghSADfYUgBIUiA0IgiCIEQrHz3fEJfnwgBEKHla+vCH4iBEIgiHwgBEL/////D4MgA0L/////D4MiA0Kx893xCX58IANCh5Wvrwh+IgRCIIh8IgVCIIh8IgNCOIYgA0KA/gODQiiGhCADQoCA/AeDQhiGIANCgICA+A+DQgiGhIQgA0IIiEKAgID4D4MgA0IYiEKAgPwHg4QgA0IoiEKA/gODIANCOIiEhIQgBEL/////D4MgAUF/aq1CNoaEIAVCIIZ8hSIEQiCIIgVCz9bTvgJ+IgZC/////w+DIARC/////w+DIgRCvdzKlQx+fCAEQs/W074CfiIEQiCIfCIHQiCGIghCJYggCCAEQv////8Pg4SFQvnz3fGZ8pmrFn4iBEIgiCAEhTcDACAAIAVCvdzKlQx+IANCz9bTvtLHq9lCfnwgBkIgiHwgB0IgiHwiA0IliCADhUL5893xmfKZqxZ+IgNCIIggA4U3AwgPCwJAIAFBBEkNACAAIAIpAxggAikDEIUgA6ciAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnKtQiCGIAOFfCABQfyLAWo1AgBCIIZBADUCgIwBhIUiA0IgiCIEIAFBAnRBh5Wvr3hqrSIFfiIGQiCIIARCsfPd8Ql+fCAGQv////8PgyADQv////8PgyIDQrHz3fEJfnwgAyAFfiIDQiCIfCIEQiCIfCAEQiCGIANC/////w+DhCIEQgGGfCIDQiWIIAOFQvnz3fGZ8pmrFn4iBUIgiCAFhTcDCCAAIANCA4ggBIUiA0IjiCADhUKlvuP00YyH2Z9/fiIDQhyIIAOFNwMADwsCQCABRQ0AIAAgAigCBCACKAIAc60gA3wiBEIhiEEALQCAjAFBEHQgAUEIdHIiCSABQQF2QYCMAWotAABBGHRyIgogAUH/iwFqLQAAIgFyIguthSAEhULP1tO+0ser2UJ+IgRCHYggBIVC+fPd8Zn2masWfiIEQiCIIASFNwMAIAAgAigCDCACKAIIc60gA30iA0IhiCABQRh0IAtBgP4DcUEIdHIgCUEIdkGA/gNxIApBGHZyckENd62FIAOFQs/W077Sx6vZQn4iA0IdiCADhUL5893xmfaZqxZ+IgNCIIggA4U3AwgPCyAAIAIpA1AgAikDWIUgA4UiBEIhiCAEhULP1tO+0ser2UJ+IgRCHYggBIVC+fPd8Zn2masWfiIEQiCIIASFNwMIIAAgAikDQCACKQNIhSADhSIDQiGIIAOFQs/W077Sx6vZQn4iA0IdiCADhUL5893xmfaZqxZ+IgNCIIggA4U3AwALwwoBCn4gAa0iBEKHla+vmLbem55/fiEFAkACQCABQSFPDQBCACEGDAELQgAhBwJAIAFBwQBJDQBCACEHAkAgAUHhAEkNACACQfgAaikDACADfSABQciLAWopAwAiCIUiB0L/////D4MiCSACKQNwIAN8IAFBwIsBaikDACIKhSILQiCIIgx+Ig1CIIggB0IgiCIHIAx+fCANQv////8PgyAHIAtC/////w+DIgt+fCAJIAt+IgdCIIh8IglCIIh8QQApA7iMASILQQApA7CMASIMfIUgCUIghiAHQv////8Pg4SFIQcgAkHoAGopAwAgA30gC4UiCUL/////D4MiCyACKQNgIAN8IAyFIgxCIIgiDX4iBkL/////D4MgCUIgiCIJIAxC/////w+DIgx+fCALIAx+IgtCIIh8IgxCIIYgC0L/////D4OEIAZCIIggCSANfnwgDEIgiHyFIAV8IAggCnyFIQULIAJB2ABqKQMAIAN9IAFB2IsBaikDACIIhSIJQv////8PgyIKIAIpA1AgA3wgAUHQiwFqKQMAIguFIgxCIIgiDX4iBkL/////D4MgCUIgiCIJIAxC/////w+DIgx+fCAKIAx+IgpCIIh8IgxCIIYgCkL/////D4OEIAZCIIggCSANfnwgDEIgiHyFIAd8QQApA6iMASIJQQApA6CMASIKfIUhByACQcgAaikDACADfSAJhSIJQv////8PgyIMIAIpA0AgA3wgCoUiCkIgiCINfiIGQv////8PgyAJQiCIIgkgCkL/////D4MiCn58IAwgCn4iCkIgiHwiDEIghiAKQv////8Pg4QgBkIgiCAJIA1+fCAMQiCIfIUgBXwgCCALfIUhBQsgAkE4aikDACADfSABQeiLAWopAwAiCIUiCUL/////D4MiCiACKQMwIAN8IAFB4IsBaikDACILhSIMQiCIIg1+IgZC/////w+DIAlCIIgiCSAMQv////8PgyIMfnwgCiAMfiIKQiCIfCIMQiCGIApC/////w+DhCAGQiCIIAkgDX58IAxCIIh8hSAHfEEAKQOYjAEiB0EAKQOQjAEiCXyFIQYgAkEoaikDACADfSAHhSIHQv////8PgyIKIAIpAyAgA3wgCYUiCUIgiCIMfiINQv////8PgyAHQiCIIgcgCUL/////D4MiCX58IAogCX4iCUIgiHwiCkIghiAJQv////8Pg4QgDUIgiCAHIAx+fCAKQiCIfIUgBXwgCCALfIUhBQsgACACQRhqKQMAIAN9IAFB+IsBaikDACIHhSIIQv////8PgyIJIAIpAxAgA3wgAUHwiwFqKQMAIgqFIgtCIIgiDH4iDUL/////D4MgCEIgiCIIIAtC/////w+DIgt+fCAJIAt+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggCCAMfnwgC0IgiHyFIAZ8QQApA4iMASIIQQApA4CMASIJfIUiCyACQQhqKQMAIAN9IAiFIghC/////w+DIgwgAikDACADfCAJhSIJQiCIIg1+IgZC/////w+DIAhCIIgiCCAJQv////8PgyIJfnwgDCAJfiIJQiCIfCIMQiCGIAlC/////w+DhCAGQiCIIAggDX58IAxCIIh8hSAFfCAHIAp8hSIFfCIHQiWIIAeFQvnz3fGZ8pmrFn4iB0IgiCAHhTcDACAAQgAgBUKHla+vmLbem55/fiAEIAN9Qs/W077Sx6vZQn58IAtC49zKlfzO8vWFf358IgNCJYggA4VC+fPd8ZnymasWfiIDQiCIIAOFfTcDCAuhDwMBfxR+An9BACEEIAJB+ABqKQMAIAN9QQApA/iMASIFhSIGQv////8PgyIHIAIpA3AgA3xBACkD8IwBIgiFIglCIIgiCn4iC0L/////D4MgBkIgiCIGIAlC/////w+DIgl+fCAHIAl+IgdCIIh8IglCIIYgB0L/////D4OEIAtCIIggBiAKfnwgCUIgiHyFIAJB2ABqKQMAIAN9QQApA9iMASIHhSIGQv////8PgyIJIAIpA1AgA3xBACkD0IwBIgqFIgtCIIgiDH4iDUL/////D4MgBkIgiCIGIAtC/////w+DIgt+fCAJIAt+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggBiAMfnwgC0IgiHyFIAJBOGopAwAgA31BACkDuIwBIgmFIgZC/////w+DIgsgAikDMCADfEEAKQOwjAEiDIUiDUIgiCIOfiIPQv////8PgyAGQiCIIgYgDUL/////D4MiDX58IAsgDX4iC0IgiHwiDUIghiALQv////8Pg4QgD0IgiCAGIA5+fCANQiCIfIUgAkEYaikDACADfUEAKQOYjAEiC4UiBkL/////D4MiDSACKQMQIAN8QQApA5CMASIOhSIPQiCIIhB+IhFC/////w+DIAZCIIgiBiAPQv////8PgyIPfnwgDSAPfiINQiCIfCIPQiCGIA1C/////w+DhCARQiCIIAYgEH58IA9CIIh8hUEAKQOIjAEiDUEAKQOAjAEiD3yFfEEAKQOojAEiEEEAKQOgjAEiEXyFfEEAKQPIjAEiEkEAKQPAjAEiE3yFfEEAKQPojAEiFEEAKQPgjAEiFXyFIgZCJYggBoVC+fPd8ZnymasWfiIGQiCIIAaFIQYgAkHoAGopAwAgA30gFIUiFEL/////D4MiFiACKQNgIAN8IBWFIhVCIIgiF34iGEL/////D4MgFEIgiCIUIBVC/////w+DIhV+fCAWIBV+IhVCIIh8IhZCIIYgFUL/////D4OEIBhCIIggFCAXfnwgFkIgiHyFIAJByABqKQMAIAN9IBKFIhJC/////w+DIhQgAikDQCADfCAThSITQiCIIhV+IhZC/////w+DIBJCIIgiEiATQv////8PgyITfnwgFCATfiITQiCIfCIUQiCGIBNC/////w+DhCAWQiCIIBIgFX58IBRCIIh8hSACQShqKQMAIAN9IBCFIhBC/////w+DIhIgAikDICADfCARhSIRQiCIIhN+IhRC/////w+DIBBCIIgiECARQv////8PgyIRfnwgEiARfiIRQiCIfCISQiCGIBFC/////w+DhCAUQiCIIBAgE358IBJCIIh8hSACQQhqKQMAIAN9IA2FIg1C/////w+DIhAgAikDACADfCAPhSIPQiCIIhF+IhJC/////w+DIA1CIIgiDSAPQv////8PgyIPfnwgECAPfiIPQiCIfCIQQiCGIA9C/////w+DhCASQiCIIA0gEX58IBBCIIh8hSABrSIPQoeVr6+Ytt6bnn9+fCALIA58hXwgCSAMfIV8IAcgCnyFfCAFIAh8hSIFQiWIIAWFQvnz3fGZ8pmrFn4iBUIgiCAFhSEFAkAgAUGgAUgNACABQQV2QXxqIRkDQCACIARqIhpBG2opAwAgA30gBEGYjQFqKQMAIgeFIghC/////w+DIgkgGkETaikDACADfCAEQZCNAWopAwAiCoUiC0IgiCIMfiINQv////8PgyAIQiCIIgggC0L/////D4MiC358IAkgC34iCUIgiHwiC0IghiAJQv////8Pg4QgDUIgiCAIIAx+fCALQiCIfIUgBnwgBEGIjQFqKQMAIgggBEGAjQFqKQMAIgl8hSEGIBpBC2opAwAgA30gCIUiCEL/////D4MiCyAaQQNqKQMAIAN8IAmFIglCIIgiDH4iDUL/////D4MgCEIgiCIIIAlC/////w+DIgl+fCALIAl+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggCCAMfnwgC0IgiHyFIAV8IAcgCnyFIQUgBEEgaiEEIBlBf2oiGQ0ACwsgACACQf8AaikDACADfCABQeiLAWopAwAiB4UiCEL/////D4MiCSACKQN3IAN9IAFB4IsBaikDACIKhSILQiCIIgx+Ig1C/////w+DIAhCIIgiCCALQv////8PgyILfnwgCSALfiIJQiCIfCILQiCGIAlC/////w+DhCANQiCIIAggDH58IAtCIIh8hSAGfCABQfiLAWopAwAiBiABQfCLAWopAwAiCHyFIgkgAkHvAGopAwAgA3wgBoUiBkL/////D4MiCyACKQNnIAN9IAiFIghCIIgiDH4iDUL/////D4MgBkIgiCIGIAhC/////w+DIgh+fCALIAh+IghCIIh8IgtCIIYgCEL/////D4OEIA1CIIggBiAMfnwgC0IgiHyFIAV8IAcgCnyFIgZ8IgVCJYggBYVC+fPd8ZnymasWfiIFQiCIIAWFNwMAIABCACAGQoeVr6+Ytt6bnn9+IA8gA31Cz9bTvtLHq9lCfnwgCULj3MqV/M7y9YV/fnwiA0IliCADhUL5893xmfKZqxZ+IgNCIIggA4V9NwMIC98FAgF+AX8CQAJAQQApA4AKIgBQRQ0AQYAIIQFCACEADAELAkBBACkDoI4BIABSDQBBACEBDAELQQAhAUEAQq+v79e895Kg/gAgAH03A/iLAUEAIABCxZbr+djShYIofDcD8IsBQQBCj/Hjja2P9JhOIAB9NwPoiwFBACAAQqus+MXV79HQfHw3A+CLAUEAQtOt1LKShbW0nn8gAH03A9iLAUEAIABCl5r0jvWWvO3JAHw3A9CLAUEAQsWDgv2v/8SxayAAfTcDyIsBQQAgAELqi7OdyOb09UN8NwPAiwFBAELIv/rLnJveueQAIAB9NwO4iwFBACAAQoqjgd/Ume2sMXw3A7CLAUEAQvm57738+MKnHSAAfTcDqIsBQQAgAEKo9dv7s5ynmj98NwOgiwFBAEK4sry3lNW31lggAH03A5iLAUEAIABC8cihuqm0w/zOAHw3A5CLAUEAQoihl9u445SXo38gAH03A4iL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AkHAAGogDGohC0GAjAEhAAJAAkACQCAHQQhJDQACQCAHQThqQQN2QQFqQQdxIg0NAAwCCyANQQN0IQ5BgIwBIQADQCALIAApAwA3AwAgC0EIaiELIABBCGohACANQX9qIg0NAAsgByAOayEHCyAHRQ0BAkACQCAHQQdxIg4NACAHIQ0MAQsgB0F4cSENA0AgCyAALQAAOgAAIAtBAWohCyAAQQFqIQAgDkF/aiIODQALCyAHQQhJDQELA0AgCyAAKQAANwAAIAtBCGohCyAAQQhqIQAgDUF4aiINDQALCyACIAIpAwggAikDQCIIfCADQQAoApyOAWoiACkDASACKQNIIgmFIgpCIIggCkL/////D4N+fDcDCCACIAIpAxggAikDUCIKfCAAKQMRIAIpA1giEIUiEUIgiCARQv////8Pg358NwMYIAIgECAKIAApAwmFIgpCIIggCkL/////D4N+IAIpAxB8fDcDECACIAkgCCAAQXlqKQMAhSIIQiCIIAhC/////w+DfiACKQMAfHw3AwAgACkDGSEIIAIpAyAhCSACIAIpAyggAikDYCIKfCAAKQMhIAIpA2giEIUiEUIgiCARQv////8Pg358NwMoIAIgECAJIAggCoUiCEIgiCAIQv////8Pg358fDcDICACIAYgAikDcCIIfCAAKQMxIAIpA3giBoUiCUIgiCAJQv////8Pg358NwM4IAIgBiAIIAApAymFIghCIIggCEL/////D4N+IAV8fDcDMAsgAiACIANBC2ogBEKHla+vmLbem55/fhADNwNAIAIgAiADQQAoApyOAWpBdWogBELP1tO+0ser2UJ+Qn+FEAM3A0gMAQsgBKchAAJAQQApA6COASIEUA0AAkAgAEEQSw0AIAJBwABqIABBgAggBBAEDAILAkAgAEGAAUsNACACQcAAaiAAQYAIIAQQBQwCCyACQcAAaiAAQYAIIAQQBgwBCwJAIABBEEsNACACQcAAaiAAIANCABAEDAELAkAgAEGAAUsNACACQcAAaiAAIANCABAFDAELIAJBwABqIAAgA0IAEAYLQQAgAikDcDcDuApBACACKQNgNwOoCkEAIAIpA1A3A5gKQQAgAkH4AGopAwA3A8AKQQAgAkHoAGopAwA3A7AKQQAgAkHYAGopAwA3A6AKQQAgAikDSCIEQjiGIARCgP4Dg0IohoQgBEKAgPwHg0IYhiAEQoCAgPgPg0IIhoSEIARCCIhCgICA+A+DIARCGIhCgID8B4OEIARCKIhCgP4DgyAEQjiIhISEIgQ3A4AKQQAgBDcDkApBACACKQNAIgRCOIYgBEKA/gODQiiGhCAEQoCA/AeDQhiGIARCgICA+A+DQgiGhIQgBEIIiEKAgID4D4MgBEIYiEKAgPwHg4QgBEIoiEKA/gODIARCOIiEhIQ3A4gKIAEkAAsGAEGAigELAgALC8wBAQBBgAgLxAG4/mw5I6RLvnwBgSz3Ia0c3tRt6YOQl9tyQKSkt7NnH8t55k7MwOV4glrQfcz/ciG4CEZ090MkjuA1kOaBOiZMPChSu5HDAMuI0GWLG1Muo3FkSJeiDflOOBnvRqnerNio+nY/45w0P/ncu8fHC08dilHgS820WTHIn37J2XhzZOrFrIM00+vDxYGg//oTY+sXDd1Rt/DaSdMWVSYp1GieKxa+WH1HofyP+LjRetAxzkXLOo+VFgQor9f7yrtLQH5AAgAA",Z$="b9ab74e2",KY={name:tG,data:eG,hash:Z$};let Q$=new W,W9=null,J6=new Uint8Array(8);function H0(B){if(!Number.isInteger(B)||B<0||B>4294967295)return Error("Seed must be given as two valid 32-bit long unsigned integers (lo + high).");return null}function r1(B,L,A){let w=new DataView(B);w.setUint32(0,L,!0),w.setUint32(4,A,!0)}function Y$(B,L=0,A=0){if(H0(L))return Promise.reject(H0(L));if(H0(A))return Promise.reject(H0(A));if(W9===null)return k(Q$,KY,16).then((w)=>{return W9=w,r1(J6.buffer,L,A),W9.writeMemory(J6),W9.calculate(B)});try{r1(J6.buffer,L,A),W9.writeMemory(J6);let w=W9.calculate(B);return Promise.resolve(w)}catch(w){return Promise.reject(w)}}function J$(B=0,L=0){if(H0(B))return Promise.reject(H0(B));if(H0(L))return Promise.reject(H0(L));return S(KY,16).then((A)=>{let w=new Uint8Array(8);r1(w.buffer,B,L),A.writeMemory(w),A.init();let b={init:()=>{return A.writeMemory(w),A.init(),b},update:(d)=>{return A.update(d),b},digest:(d)=>A.digest(d),save:()=>A.save(),load:(d)=>{return A.load(d),b},blockSize:512,digestSize:16};return b})}var z$="ripemd160",X$="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",W$="6abbce74",GY={name:z$,data:X$,hash:W$};let V$=new W,z6=null;function K$(B){if(z6===null)return k(V$,GY,20).then((L)=>{return z6=L,z6.calculate(B)});try{let L=z6.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function G$(){return S(GY,20).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:20};return L})}function $$(B,L){let{blockSize:A}=B,w=O(L);if(w.length>A){B.update(w);let b=B.digest("binary");return B.init(),b}return new Uint8Array(w.buffer,w.byteOffset,w.length)}function H$(B,L){B.init();let{blockSize:A}=B,w=$$(B,L),b=new Uint8Array(A);b.set(w);let d=new Uint8Array(A);for(let i=0;i<A;i++){let JZ=b[i];d[i]=JZ^92,b[i]=JZ^54}B.update(b);let p={init:()=>{return B.init(),B.update(b),p},update:(i)=>{return B.update(i),p},digest:(i)=>{let JZ=B.digest("binary");return B.init(),B.update(d),B.update(JZ),B.digest(i)},save:()=>{throw Error("save() not supported")},load:()=>{throw Error("load() not supported")},blockSize:B.blockSize,digestSize:B.digestSize};return p}function $Y(B,L){if(!B||!B.then)throw Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');return B.then((A)=>H$(A,L))}function q$(B,L,A,w,b){return X(this,void 0,void 0,function*(){let d=new Uint8Array(w),p=new Uint8Array(L.length+4),i=new DataView(p.buffer),JZ=O(L),LZ=new Uint8Array(JZ.buffer,JZ.byteOffset,JZ.length);p.set(LZ);let wZ=0,kZ=B.digestSize,CZ=Math.ceil(w/kZ),j8=null,sZ=null;for(let q0=1;q0<=CZ;q0++){i.setUint32(L.length,q0),B.init(),B.update(p),j8=B.digest("binary"),sZ=j8.slice();for(let _8=1;_8<A;_8++){B.init(),B.update(sZ),sZ=B.digest("binary");for(let U0=0;U0<kZ;U0++)j8[U0]^=sZ[U0]}d.set(j8.subarray(0,w-wZ),wZ),wZ+=kZ}if(b==="binary")return d;let o9=new Uint8Array(w*2);return D(o9,d,w)})}let U$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!B.hashFunction||!B.hashFunction.then)throw Error('Invalid hash function is provided! Usage: pbkdf2("password", "salt", 1000, 32, createSHA1()).');if(!Number.isInteger(B.iterations)||B.iterations<1)throw Error("Iterations should be a positive number");if(!Number.isInteger(B.hashLength)||B.hashLength<1)throw Error("Hash length should be a positive number");if(B.outputType===void 0)B.outputType="hex";if(!["hex","binary"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary']`)};function a1(B){return X(this,void 0,void 0,function*(){U$(B);let L=yield $Y(B.hashFunction,B.password);return q$(L,B.salt,B.iterations,B.hashLength,B.outputType)})}var N$="scrypt",B$="AGFzbQEAAAABGwVgAX8Bf2AAAX9gBH9/f38AYAF/AGADf39/AAMGBQABAgMEBQYBAQKAgAIGCAF/AUGQiAQLBzkEBm1lbW9yeQIAEkhhc2hfU2V0TWVtb3J5U2l6ZQAADkhhc2hfR2V0QnVmZmVyAAEGc2NyeXB0AAQK7iYFWAECf0EAIQECQCAAQQAoAogIIgJGDQACQCAAIAJrIgBBEHYgAEGAgHxxIABJaiIAQABBf0cNAEH/AcAPC0EAIQFBAEEAKQOICCAAQRB0rXw3A4gICyABwAtwAQJ/AkBBACgCgAgiAA0AQQA/AEEQdCIANgKACEEAKAKICCIBQYCAIEYNAAJAQYCAICABayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBBAA8LQQBBACkDiAggAEEQdK18NwOICEEAKAKACCEACyAAC6QFAQN/IAIgA0EHdCAAakFAaiIEKQMANwMAIAIgBCkDCDcDCCACIAQpAxA3AxAgAiAEKQMYNwMYIAIgBCkDIDcDICACIAQpAyg3AyggAiAEKQMwNwMwIAIgBCkDODcDOAJAIANFDQAgA0EBdCEFIANBBnQhBkEAIQMDQCACIAIpAwAgACkDAIU3AwAgAiACKQMIIABBCGopAwCFNwMIIAIgAikDECAAQRBqKQMAhTcDECACIAIpAxggAEEYaikDAIU3AxggAiACKQMgIABBIGopAwCFNwMgIAIgAikDKCAAQShqKQMAhTcDKCACIAIpAzAgAEEwaikDAIU3AzAgAiACKQM4IABBOGopAwCFNwM4IAIQAyABIAIpAwA3AwAgAUEIaiACKQMINwMAIAFBEGogAikDEDcDACABQRhqIAIpAxg3AwAgAUEgaiACKQMgNwMAIAFBKGogAikDKDcDACABQTBqIAIpAzA3AwAgAUE4aiACKQM4NwMAIAIgAikDACAAQcAAaikDAIU3AwAgAiACKQMIIABByABqKQMAhTcDCCACIAIpAxAgAEHQAGopAwCFNwMQIAIgAikDGCAAQdgAaikDAIU3AxggAiACKQMgIABB4ABqKQMAhTcDICACIAIpAyggAEHoAGopAwCFNwMoIAIgAikDMCAAQfAAaikDAIU3AzAgAiACKQM4IABB+ABqKQMAhTcDOCACEAMgASAGaiIEIAIpAwA3AwAgBEEIaiACKQMINwMAIARBEGogAikDEDcDACAEQRhqIAIpAxg3AwAgBEEgaiACKQMgNwMAIARBKGogAikDKDcDACAEQTBqIAIpAzA3AwAgBEE4aiACKQM4NwMAIABBgAFqIQAgAUHAAGohASADQQJqIgMgBUkNAAsLC7oNCAF+AX8BfgF/AX4BfwF+En8gACAAKAIEIAApAygiAUIgiKciAiAAKQM4IgNCIIinIgRqQQd3IAApAwgiBUIgiKdzIgYgBGpBCXcgACkDGCIHQiCIp3MiCCAGakENdyACcyIJIAenIgogAaciC2pBB3cgA6dzIgIgC2pBCXcgBadzIgwgAmpBDXcgCnMiDSAMakESdyALcyIOIAApAwAiAUIgiKciDyAAKQMQIgNCIIinIhBqQQd3IAApAyAiBUIgiKdzIgtqQQd3cyIKIAkgCGpBEncgBHMiESACakEHdyAAKQMwIgenIgkgAaciEmpBB3cgA6dzIgQgEmpBCXcgBadzIhMgBGpBDXcgCXMiFHMiCSARakEJdyALIBBqQQl3IAdCIIincyIVcyIWIAlqQQ13IAJzIhcgFmpBEncgEXMiEWpBB3cgBiAUIBNqQRJ3IBJzIhJqQQd3IBUgC2pBDXcgD3MiFHMiAiASakEJdyAMcyIPIAJqQQ13IAZzIhhzIgYgEWpBCXcgCCANIBQgFWpBEncgEHMiECAEakEHd3MiDCAQakEJd3MiCHMiFSAGakENdyAKcyIUIAwgCiAOakEJdyATcyITIApqQQ13IAtzIhkgE2pBEncgDnMiCmpBB3cgF3MiCyAKakEJdyAPcyIOIAtqQQ13IAxzIhcgDmpBEncgCnMiDSACIAggDGpBDXcgBHMiDCAIakESdyAQcyIIakEHdyAZcyIKakEHd3MiBCAUIBVqQRJ3IBFzIhAgC2pBB3cgCSAYIA9qQRJ3IBJzIhFqQQd3IAxzIgwgEWpBCXcgE3MiEiAMakENdyAJcyIPcyIJIBBqQQl3IAogCGpBCXcgFnMiE3MiFiAJakENdyALcyIUIBZqQRJ3IBBzIhBqQQd3IAYgDyASakESdyARcyIRakEHdyATIApqQQ13IAJzIgtzIgIgEWpBCXcgDnMiDiACakENdyAGcyIYcyIGIBBqQQl3IBUgFyALIBNqQRJ3IAhzIgggDGpBB3dzIgsgCGpBCXdzIhNzIhUgBmpBDXcgBHMiFyALIAQgDWpBCXcgEnMiEiAEakENdyAKcyIZIBJqQRJ3IA1zIgRqQQd3IBRzIgogBGpBCXcgDnMiDyAKakENdyALcyIUIA9qQRJ3IARzIg0gAiATIAtqQQ13IAxzIgwgE2pBEncgCHMiCGpBB3cgGXMiC2pBB3dzIgQgFyAVakESdyAQcyIQIApqQQd3IAkgGCAOakESdyARcyIOakEHdyAMcyIMIA5qQQl3IBJzIhEgDGpBDXcgCXMiF3MiCSAQakEJdyALIAhqQQl3IBZzIhJzIhMgCWpBDXcgCnMiGCATakESdyAQcyIQakEHdyAGIBcgEWpBEncgDnMiCmpBB3cgEiALakENdyACcyIXcyICIApqQQl3IA9zIg4gAmpBDXcgBnMiFnMiBiAJIBYgDmpBEncgCnMiFmpBB3cgFSAUIBcgEmpBEncgCHMiCCAMakEHd3MiCiAIakEJd3MiEiAKakENdyAMcyIPcyIMIBZqQQl3IAQgDWpBCXcgEXMiEXMiFSAMakENdyAJcyIUIBVqQRJ3IBZzIglqQQd3IAIgDyASakESdyAIcyIIakEHdyARIARqQQ13IAtzIg9zIgsgCGpBCXcgE3MiEyALakENdyACcyIXcyIWajYCBCAAIAAoAgggFiAJakEJdyAKIA8gEWpBEncgDXMiEWpBB3cgGHMiAiARakEJdyAOcyIOcyIPajYCCCAAIAAoAgwgDyAWakENdyAGcyINajYCDCAAIAAoAhAgBiAQakEJdyAScyISIA4gAmpBDXcgCnMiGCAXIBNqQRJ3IAhzIgogDGpBB3dzIgggCmpBCXdzIhYgCGpBDXcgDHMiDGo2AhAgACAAKAIAIA0gD2pBEncgCXNqNgIAIAAgACgCFCAMIBZqQRJ3IApzajYCFCAAIAAoAhggCGo2AhggACAAKAIcIBZqNgIcIAAgACgCICASIAZqQQ13IARzIgkgGCAOakESdyARcyIGIAtqQQd3cyIKIAZqQQl3IBVzIgRqNgIgIAAgACgCJCAEIApqQQ13IAtzIgtqNgIkIAAgACgCKCALIARqQRJ3IAZzajYCKCAAIAAoAiwgCmo2AiwgACAAKAIwIAkgEmpBEncgEHMiBiACakEHdyAUcyILajYCMCAAIAAoAjQgCyAGakEJdyATcyIKajYCNCAAIAAoAjggCiALakENdyACcyICajYCOCAAIAAoAjwgAiAKakESdyAGc2o2AjwLvxIDFX8Bfg5/AkAgAkUNACAAQQd0IgNBQGoiBEEAKAKACCIFIAMgAmwiBmogAyABbGoiByADaiIIaiEJIAAgAkEHdCIKIAFBB3RqIgtsIQwgACALQYABamwhDSAAQQV0IgtBASALQQFLGyILQWBxIQ4gC0EBcSEPIAdBeGohECAHQXBqIREgB0FoaiESIAdBYGohEyAHQVhqIRQgB0FQaiEVIAdBSGohFiAHQUBqIRcgAa1Cf3whGCAEIAdqIRkgByAAQQh0IhpqIRsgACAKQYABamwhHCALQQRJIR1BACEeQQAhHwNAQQAoAoAIIiAgAyAfbGohIQJAIABFDQBBACEiAkAgHQ0AICAgHmohI0EAIQtBACEiA0AgByALaiIEICMgC2oiJCgCADYCACAEQQRqICRBBGooAgA2AgAgBEEIaiAkQQhqKAIANgIAIARBDGogJEEMaigCADYCACALQRBqIQsgDiAiQQRqIiJHDQALCyAPRQ0AIAcgIkECdCILaiAhIAtqKAIANgIACwJAIAFFDQBBACElIBwhIyAGISYDQCAFISQgACEiAkACQCAADQAgGyAXKQMANwMAIBsgFikDADcDCCAbIBUpAwA3AxAgGyAUKQMANwMYIBsgEykDADcDICAbIBIpAwA3AyggGyARKQMANwMwIBsgECkDADcDOAwBCwNAICQgJmoiCyAkIAxqIgQpAwA3AwAgC0EIaiAEQQhqKQMANwMAIAtBEGogBEEQaikDADcDACALQRhqIARBGGopAwA3AwAgC0EgaiAEQSBqKQMANwMAIAtBKGogBEEoaikDADcDACALQTBqIARBMGopAwA3AwAgC0E4aiAEQThqKQMANwMAIAtBwABqIARBwABqKQMANwMAIAtByABqIARByABqKQMANwMAIAtB0ABqIARB0ABqKQMANwMAIAtB2ABqIARB2ABqKQMANwMAIAtB4ABqIARB4ABqKQMANwMAIAtB6ABqIARB6ABqKQMANwMAIAtB8ABqIARB8ABqKQMANwMAIAtB+ABqIARB+ABqKQMANwMAICRBgAFqISQgIkF/aiIiDQALIAcgCCAbIAAQAiAFISQgACEiA0AgJCAjaiILICQgDWoiBCkDADcDACALQQhqIARBCGopAwA3AwAgC0EQaiAEQRBqKQMANwMAIAtBGGogBEEYaikDADcDACALQSBqIARBIGopAwA3AwAgC0EoaiAEQShqKQMANwMAIAtBMGogBEEwaikDADcDACALQThqIARBOGopAwA3AwAgC0HAAGogBEHAAGopAwA3AwAgC0HIAGogBEHIAGopAwA3AwAgC0HQAGogBEHQAGopAwA3AwAgC0HYAGogBEHYAGopAwA3AwAgC0HgAGogBEHgAGopAwA3AwAgC0HoAGogBEHoAGopAwA3AwAgC0HwAGogBEHwAGopAwA3AwAgC0H4AGogBEH4AGopAwA3AwAgJEGAAWohJCAiQX9qIiINAAsLIAggByAbIAAQAiAjIBpqISMgJiAaaiEmICVBAmoiJSABSQ0AC0EAISUDQAJAAkAgAA0AIBsgFykDADcDACAbIBYpAwA3AwggGyAVKQMANwMQIBsgFCkDADcDGCAbIBMpAwA3AyAgGyASKQMANwMoIBsgESkDADcDMCAbIBApAwA3AzgMAQsgACAKIBkpAgAgGIOnQQd0amwhJiAFISQgACEiA0AgJCAMaiILIAspAwAgJCAmaiIEKQMAhTcDACALQQhqIiMgIykDACAEQQhqKQMAhTcDACALQRBqIiMgIykDACAEQRBqKQMAhTcDACALQRhqIiMgIykDACAEQRhqKQMAhTcDACALQSBqIiMgIykDACAEQSBqKQMAhTcDACALQShqIiMgIykDACAEQShqKQMAhTcDACALQTBqIiMgIykDACAEQTBqKQMAhTcDACALQThqIiMgIykDACAEQThqKQMAhTcDACALQcAAaiIjICMpAwAgBEHAAGopAwCFNwMAIAtByABqIiMgIykDACAEQcgAaikDAIU3AwAgC0HQAGoiIyAjKQMAIARB0ABqKQMAhTcDACALQdgAaiIjICMpAwAgBEHYAGopAwCFNwMAIAtB4ABqIiMgIykDACAEQeAAaikDAIU3AwAgC0HoAGoiIyAjKQMAIARB6ABqKQMAhTcDACALQfAAaiIjICMpAwAgBEHwAGopAwCFNwMAIAtB+ABqIgsgCykDACAEQfgAaikDAIU3AwAgJEGAAWohJCAiQX9qIiINAAsgByAIIBsgABACIAAgCiAJKQIAIBiDp0EHdGpsISYgBSEkIAAhIgNAICQgDWoiCyALKQMAICQgJmoiBCkDAIU3AwAgC0EIaiIjICMpAwAgBEEIaikDAIU3AwAgC0EQaiIjICMpAwAgBEEQaikDAIU3AwAgC0EYaiIjICMpAwAgBEEYaikDAIU3AwAgC0EgaiIjICMpAwAgBEEgaikDAIU3AwAgC0EoaiIjICMpAwAgBEEoaikDAIU3AwAgC0EwaiIjICMpAwAgBEEwaikDAIU3AwAgC0E4aiIjICMpAwAgBEE4aikDAIU3AwAgC0HAAGoiIyAjKQMAIARBwABqKQMAhTcDACALQcgAaiIjICMpAwAgBEHIAGopAwCFNwMAIAtB0ABqIiMgIykDACAEQdAAaikDAIU3AwAgC0HYAGoiIyAjKQMAIARB2ABqKQMAhTcDACALQeAAaiIjICMpAwAgBEHgAGopAwCFNwMAIAtB6ABqIiMgIykDACAEQegAaikDAIU3AwAgC0HwAGoiIyAjKQMAIARB8ABqKQMAhTcDACALQfgAaiILIAspAwAgBEH4AGopAwCFNwMAICRBgAFqISQgIkF/aiIiDQALCyAIIAcgGyAAEAIgJUECaiIlIAFJDQALCwJAIABFDQBBACEiAkAgHQ0AICAgHmohI0EAIQtBACEiA0AgIyALaiIEIAcgC2oiJCgCADYCACAEQQRqICRBBGooAgA2AgAgBEEIaiAkQQhqKAIANgIAIARBDGogJEEMaigCADYCACALQRBqIQsgDiAiQQRqIiJHDQALCyAPRQ0AICEgIkECdCILaiAHIAtqKAIANgIACyAeIANqIR4gH0EBaiIfIAJHDQALCws=",j$="b32721f8",F$={name:N$,data:B$,hash:j$};function M$(B){return X(this,void 0,void 0,function*(){let{costFactor:L,blockSize:A,parallelism:w,hashLength:b}=B,d=zY(),p=yield a1({password:B.password,salt:B.salt,iterations:1,hashLength:128*A*w,hashFunction:d,outputType:"binary"}),i=yield S(F$,0),JZ=128*A*L,LZ=256*A;i.setMemorySize(p.length+JZ+LZ),i.writeMemory(p,0),i.getExports().scrypt(A,L,w);let wZ=i.getMemory().subarray(0,128*A*w),kZ=yield a1({password:B.password,salt:wZ,iterations:1,hashLength:b,hashFunction:d,outputType:"binary"});if(B.outputType==="hex"){let CZ=new Uint8Array(b*2);return D(CZ,kZ,b)}return kZ})}let R$=(B)=>B&&!(B&B-1),D$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!Number.isInteger(B.blockSize)||B.blockSize<1)throw Error("Block size should be a positive number");if(!Number.isInteger(B.costFactor)||B.costFactor<2||!R$(B.costFactor))throw Error("Cost factor should be a power of 2, greater than 1");if(!Number.isInteger(B.parallelism)||B.parallelism<1)throw Error("Parallelism should be a positive number");if(!Number.isInteger(B.hashLength)||B.hashLength<1)throw Error("Hash length should be a positive number.");if(B.outputType===void 0)B.outputType="hex";if(!["hex","binary"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary']`)};function P$(B){return X(this,void 0,void 0,function*(){return D$(B),M$(B)})}var O$="bcrypt",L$="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",C$="8bd8822d",HY={name:O$,data:L$,hash:C$};function _$(B){return X(this,void 0,void 0,function*(){let{costFactor:L,password:A,salt:w}=B,b=yield S(HY,0);b.writeMemory(O(w),0);let d=O(A);b.writeMemory(d,16);let p=B.outputType==="encoded"?1:0;b.getExports().bcrypt(d.length,L,p);let i=b.getMemory();if(B.outputType==="encoded")return N(i,60);if(B.outputType==="hex"){let JZ=new Uint8Array(48);return D(JZ,i,24)}return i.slice(0,24)})}let T$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(!Number.isInteger(B.costFactor)||B.costFactor<4||B.costFactor>31)throw Error("Cost factor should be a number between 4 and 31");if(B.password=O(B.password),B.password.length<1)throw Error("Password should be at least 1 byte long");if(B.password.length>72)throw Error("Password should be at most 72 bytes long");if(B.salt=O(B.salt),B.salt.length!==16)throw Error("Salt should be 16 bytes long");if(B.outputType===void 0)B.outputType="encoded";if(!["hex","binary","encoded"].includes(B.outputType))throw Error(`Insupported output type ${B.outputType}. Valid values: ['hex', 'binary', 'encoded']`)};function A$(B){return X(this,void 0,void 0,function*(){return T$(B),_$(B)})}let E$=(B)=>{if(!/^\$2[axyb]\$[0-3][0-9]\$[./A-Za-z0-9]{53}$/.test(B))return!1;if(B[4]==="0"&&Number(B[5])<4)return!1;if(B[4]==="3"&&Number(B[5])>1)return!1;return!0},I$=(B)=>{if(!B||typeof B!=="object")throw Error("Invalid options parameter. It requires an object.");if(B.hash===void 0||typeof B.hash!=="string")throw Error("Hash should be specified");if(B.hash.length!==60)throw Error("Hash should be 60 bytes long");if(!E$(B.hash))throw Error("Invalid hash");if(B.password=O(B.password),B.password.length<1)throw Error("Password should be at least 1 byte long");if(B.password.length>72)throw Error("Password should be at most 72 bytes long")};function S$(B){return X(this,void 0,void 0,function*(){I$(B);let{hash:L,password:A}=B,w=yield S(HY,0);w.writeMemory(O(L),0);let b=O(A);return w.writeMemory(b,60),!!w.getExports().bcrypt_verify(b.length)})}var v$="whirlpool",w$="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",y$="8d8f6035",qY={name:v$,data:w$,hash:y$};let x$=new W,X6=null;function k$(B){if(X6===null)return k(x$,qY,64).then((L)=>{return X6=L,X6.calculate(B)});try{let L=X6.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function f$(){return S(qY,64).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:64};return L})}var h$="sm3",b$="AGFzbQEAAAABDANgAAF/YAAAYAF/AAMIBwABAgIBAAIFBAEBAgIGDgJ/AUHwiQULfwBBgAgLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAELSGFzaF9VcGRhdGUAAgpIYXNoX0ZpbmFsAAQNSGFzaF9HZXRTdGF0ZQAFDkhhc2hfQ2FsY3VsYXRlAAYKU1RBVEVfU0laRQMBCtodBwUAQYAJC1EAQQBCzdy3nO7Jw/2wfzcCoIkBQQBCvOG8y6qVzpgWNwKYiQFBAELXhZG5gcCBxVo3ApCJAUEAQu+sgJyX16yKyQA3AoiJAUEAQgA3AoCJAQvvAwEIfwJAIABFDQBBACEBQQBBACgCgIkBIgIgAGoiAzYCgIkBIAJBP3EhBAJAIAMgAk8NAEEAQQAoAoSJAUEBajYChIkBC0GACSECAkAgBEUNAAJAIABBwAAgBGsiBU8NACAEIQEMAQsgBEE/cyEGIARBqIkBaiECQYAJIQMCQAJAIAVBB3EiBw0AIAUhCAwBCyAHIQgDQCACIAMtAAA6AAAgAkEBaiECIANBAWohAyAIQX9qIggNAAtBwAAgByAEamshCAsCQCAGQQdJDQADQCACIAMpAAA3AAAgAkEIaiECIANBCGohAyAIQXhqIggNAAsLQaiJARADIAVBgAlqIQIgACAFayEACwJAIABBwABJDQADQCACEAMgAkHAAGohAiAAQUBqIgBBP0sNAAsLIABFDQAgAUGoiQFqIQMCQAJAIABBB3EiCA0AIAAhBAwBCyAAQThxIQQDQCADIAItAAA6AAAgA0EBaiEDIAJBAWohAiAIQX9qIggNAAsLIABBCEkNAANAIAMgAi0AADoAACADIAItAAE6AAEgAyACLQACOgACIAMgAi0AAzoAAyADIAItAAQ6AAQgAyACLQAFOgAFIAMgAi0ABjoABiADIAItAAc6AAcgA0EIaiEDIAJBCGohAiAEQXhqIgQNAAsLC+wLARl/IwBBkAJrIgEkACABIAAoAhgiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiAzYCGCABIAAoAhQiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiBDYCFCABIAAoAggiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiBTYCCCABIAAoAhAiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiBjYCECABIAAoAiAiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiBzYCICABIAAoAgQiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiCDYCBCABIAAoAgwiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiCTYCDCABIAAoAhwiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiCjYCHCABIAAoAgAiAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnIiCzYCACAAKAIkIQIgASAAKAI0IgxBGHQgDEGA/gNxQQh0ciAMQQh2QYD+A3EgDEEYdnJyIg02AjQgASAAKAIoIgxBGHQgDEGA/gNxQQh0ciAMQQh2QYD+A3EgDEEYdnJyIg42AiggASALIA1BD3dzIApzIgxBF3cgDEEPd3MgCUEHd3MgDnMgDHMiCjYCQCABIAAoAjgiDEEYdCAMQYD+A3FBCHRyIAxBCHZBgP4DcSAMQRh2cnIiCzYCOCABIAAoAiwiDEEYdCAMQYD+A3FBCHRyIAxBCHZBgP4DcSAMQRh2cnIiDzYCLCABIAggC0EPd3MgB3MiDEEXdyAMQQ93cyAGQQd3cyAPcyAMczYCRCABIAAoAjwiDEEYdCAMQYD+A3FBCHRyIAxBCHZBgP4DcSAMQRh2cnIiDDYCPCABIAJBGHQgAkGA/gNxQQh0ciACQQh2QYD+A3EgAkEYdnJyIgI2AiQgASAAKAIwIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyIgY2AjAgASAFIAxBD3dzIAJzIgBBF3cgAEEPd3MgBEEHd3MgBnMgAHM2AkggASAOIApBD3dzIAlzIgBBF3cgAEEPd3MgA0EHd3MgDXMgAHM2AkxBACEGQSAhByABIQxBACgCiIkBIhAhCUEAKAKkiQEiESEPQQAoAqCJASISIQ1BACgCnIkBIhMhCEEAKAKYiQEiFCEOQQAoApSJASIVIRZBACgCkIkBIhchA0EAKAKMiQEiGCELA0AgCCAOIgJzIA0iBHMgD2ogCSIAQQx3Ig0gAmpBmYqxzgcgB3ZBmYqxzgcgBnRyakEHdyIPaiAMKAIAIhlqIglBEXcgCUEJd3MgCXMhDiADIgUgC3MgAHMgFmogDyANc2ogDEEQaigCACAZc2ohCSAMQQRqIQwgB0F/aiEHIAhBE3chDSALQQl3IQMgBCEPIAIhCCAFIRYgACELIAZBAWoiBkEQRw0AC0EAIQZBECEHA0AgASAGaiIMQdAAaiAMQThqKAIAIAxBLGooAgAgDEEQaigCAHMgDEHEAGooAgAiFkEPd3MiCEEXd3MgCEEPd3MgDEEcaigCAEEHd3MgCHMiGTYCACANIg8gDiIMQX9zcSACIAxxciAEaiAJIghBDHciDSAMakGKu57UByAHd2pBB3ciBGogCmoiCUERdyAJQQl3cyAJcyEOIAggAyILIABycSALIABxciAFaiAEIA1zaiAZIApzaiEJIAZBBGohBiACQRN3IQ0gAEEJdyEDIBYhCiAPIQQgDCECIAshBSAIIQAgB0EBaiIHQcAARw0AC0EAIA8gEXM2AqSJAUEAIA0gEnM2AqCJAUEAIAwgE3M2ApyJAUEAIA4gFHM2ApiJAUEAIAsgFXM2ApSJAUEAIAMgF3M2ApCJAUEAIAggGHM2AoyJAUEAIAkgEHM2AoiJASABQZACaiQAC4ILAQp/IwBBEGsiACQAIABBACgCgIkBIgFBG3QgAUELdEGAgPwHcXIgAUEFdkGA/gNxIAFBA3RBGHZycjYCDCAAQQAoAoSJASICQQN0IgMgAUEddnIiBEEYdCAEQYD+A3FBCHRyIAJBBXZBgP4DcSADQRh2cnI2AggCQEE4QfgAIAFBP3EiBUE4SRsgBWsiA0UNAEEAIAMgAWoiATYCgIkBAkAgASADTw0AQQAgAkEBajYChIkBC0GQCCEBQQAhBgJAIAVFDQACQCADQcAAIAVrIgdPDQAgBSEGDAELIAVBP3MhCCAFQaiJAWohAUGQCCECAkACQCAHQQdxIgkNACAHIQQMAQsgCSEEA0AgASACLQAAOgAAIAFBAWohASACQQFqIQIgBEF/aiIEDQALQcAAIAkgBWprIQQLAkAgCEEHSQ0AA0AgASACKQAANwAAIAFBCGohASACQQhqIQIgBEF4aiIEDQALC0GoiQEQAyAHQZAIaiEBIAMgB2shAwsCQCADQcAASQ0AA0AgARADIAFBwABqIQEgA0FAaiIDQT9LDQALCyADRQ0AIAZBqIkBaiECAkACQCADQQdxIgQNACADIQUMAQsgA0E4cSEFA0AgAiABLQAAOgAAIAJBAWohAiABQQFqIQEgBEF/aiIEDQALCyADQQhJDQADQCACIAEtAAA6AAAgAiABLQABOgABIAIgAS0AAjoAAiACIAEtAAM6AAMgAiABLQAEOgAEIAIgAS0ABToABSACIAEtAAY6AAYgAiABLQAHOgAHIAJBCGohAiABQQhqIQEgBUF4aiIFDQALC0EAQQAoAoCJASICQQhqNgKAiQEgAkE/cSEBAkAgAkF4SQ0AQQBBACgChIkBQQFqNgKEiQELAkACQAJAAkAgAQ0AQQAhAQwBCyABQThJDQAgAUGoiQFqIAAtAAg6AAACQCABQT9GDQAgAUGpiQFqIAAtAAk6AAAgAUE+Rg0AIAFBqokBaiAALQAKOgAAIAFBPUYNACABQauJAWogAC0ACzoAACABQTxGDQAgAUGsiQFqIAAtAAw6AAAgAUE7Rg0AIAFBrYkBaiAALQANOgAAIAFBOkYNACABQa6JAWogAC0ADjoAACABQTlGDQAgAUGviQFqIAAtAA86AABBqIkBEAMMAwtBqIkBEAMgAkEHcSIERQ0CIAFBR2ohBSAAQQhqQcAAIAFraiECIAFBSGohBkGoiQEhASAEIQMDQCABIAItAAA6AAAgAUEBaiEBIAJBAWohAiADQX9qIgMNAAsgBUEHSQ0CIAYgBGshAwwBCyABQaiJAWohASAAQQhqIQJBCCEDCwNAIAEgAikAADcAACABQQhqIQEgAkEIaiECIANBeGoiAw0ACwtBAEEAKAKIiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AoAJQQBBACgCjIkBIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgKECUEAQQAoApCJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCiAlBAEEAKAKUiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AowJQQBBACgCmIkBIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgKQCUEAQQAoApyJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYClAlBAEEAKAKgiQEiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2ApgJQQBBACgCpIkBIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgKcCSAAQRBqJAALBgBBgIkBC5UCAQR/QQBCzdy3nO7Jw/2wfzcCoIkBQQBCvOG8y6qVzpgWNwKYiQFBAELXhZG5gcCBxVo3ApCJAUEAQu+sgJyX16yKyQA3AoiJAUEAQgA3AoCJAQJAIABFDQBBACAANgKAiQFBgAkhAQJAIABBwABJDQBBgAkhAQNAIAEQAyABQcAAaiEBIABBQGoiAEE/Sw0ACyAARQ0BCyAAQX9qIQICQAJAIABBB3EiAw0AQaiJASEEDAELIABBeHEhAEGoiQEhBANAIAQgAS0AADoAACAEQQFqIQQgAUEBaiEBIANBf2oiAw0ACwsgAkEHSQ0AA0AgBCABKQAANwAAIARBCGohBCABQQhqIQEgAEF4aiIADQALCxAECwtRAgBBgAgLBGgAAAAAQZAIC0CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",g$="b6fb4b8e",UY={name:h$,data:b$,hash:g$};let u$=new W,W6=null;function m$(B){if(W6===null)return k(u$,UY,32).then((L)=>{return W6=L,W6.calculate(B)});try{let L=W6.calculate(B);return Promise.resolve(L)}catch(L){return Promise.reject(L)}}function c$(){return S(UY,32).then((B)=>{B.init();let L={init:()=>{return B.init(),L},update:(A)=>{return B.update(A),L},digest:(A)=>B.digest(A),save:()=>B.save(),load:(A)=>{return B.load(A),L},blockSize:64,digestSize:32};return L})}Z.adler32=u,Z.argon2Verify=n9,Z.argon2d=KZ,Z.argon2i=g0,Z.argon2id=K0,Z.bcrypt=A$,Z.bcryptVerify=S$,Z.blake2b=k8,Z.blake2s=FZ,Z.blake3=hQ,Z.crc32=fK,Z.crc64=cK,Z.createAdler32=l,Z.createBLAKE2b=L8,Z.createBLAKE2s=YZ,Z.createBLAKE3=vK,Z.createCRC32=hK,Z.createCRC64=lK,Z.createHMAC=$Y,Z.createKeccak=jG,Z.createMD4=rK,Z.createMD5=QG,Z.createRIPEMD160=G$,Z.createSHA1=VG,Z.createSHA224=OG,Z.createSHA256=zY,Z.createSHA3=UG,Z.createSHA384=SG,Z.createSHA512=yG,Z.createSM3=c$,Z.createWhirlpool=f$,Z.createXXHash128=J$,Z.createXXHash3=sG,Z.createXXHash32=gG,Z.createXXHash64=nG,Z.keccak=BG,Z.md4=oK,Z.md5=ZG,Z.pbkdf2=a1,Z.ripemd160=K$,Z.scrypt=P$,Z.sha1=WG,Z.sha224=PG,Z.sha256=CG,Z.sha3=qG,Z.sha384=IG,Z.sha512=wG,Z.sm3=m$,Z.whirlpool=k$,Z.xxhash128=Y$,Z.xxhash3=aG,Z.xxhash32=bG,Z.xxhash64=dG})});var IY=V6(EY(),1),{program:u_,createCommand:m_,createArgument:c_,createOption:l_,CommanderError:d_,InvalidArgumentError:n_,InvalidOptionArgumentError:p_,Command:SY,Argument:i_,Option:o_,Help:r_}=IY.default;import{readFileSync as E_}from"node:fs";import{join as I_}from"node:path";import{dirname as vY,join as i8}from"node:path";import{fileURLToPath as uH}from"node:url";import{homedir as xY}from"node:os";import{cpSync as mH,existsSync as X5,mkdirSync as cH}from"node:fs";function o8(){let Z=vY(uH(import.meta.url));for(let Q=0;Q<8;Q++){if(X5(i8(Z,"package.json")))return Z;let Y=vY(Z);if(Y===Z)break;Z=Y}return Z}var wY=i8(xY(),".gtrk-cli"),p8=i8(xY(),".gitruck");function K9(){return p8}function G6(Z){return i8(p8,Z)}function r8(){return i8(p8,"ffmpeg")}function G9(){return i8(p8,"audio-cache")}function a8(){return i8(p8,"fonts")}function F0(){return i8(p8,"tmp")}var yY=!1;function kY(){if(yY)return;yY=!0;try{if(!X5(wY))return;if(X5(i8(p8,"config.json")))return;cH(p8,{recursive:!0}),mH(wY,p8,{recursive:!0,force:!1,errorOnExist:!1})}catch{}}import{spawnSync as lH}from"node:child_process";import{existsSync as q6,mkdirSync as dH,cpSync as nH}from"node:fs";import{homedir as hY}from"node:os";import{dirname as W5,join as T8,resolve as V5}from"node:path";var s9={dim:(Z)=>`\x1B[2m${Z}\x1B[0m`,cyan:(Z)=>`\x1B[36m${Z}\x1B[0m`,green:(Z)=>`\x1B[32m${Z}\x1B[0m`,yellow:(Z)=>`\x1B[33m${Z}\x1B[0m`,red:(Z)=>`\x1B[31m${Z}\x1B[0m`},H6=process.stdout;function qZ(){H6=process.stderr}var $6=(Z)=>H6.write(`${Z}
|
|
28
|
+
`),j={step:(Z)=>$6(s9.cyan(Z)),info:(Z)=>$6(s9.dim(` ${Z}`)),ok:(Z)=>$6(s9.green(`✅ ${Z}`)),warn:(Z)=>$6(s9.yellow(`⚠️ ${Z}`)),err:(Z)=>process.stderr.write(`${s9.red(`❌ ${Z}`)}
|
|
29
|
+
`),tick:(Z)=>H6.write(`\r ${Z}\x1B[K`),tickEnd:()=>H6.write(`
|
|
30
|
+
`)};var bY=["gtrk-oralcut","gtrk-long2short","gtrk-splitter","gtrk-matrix","gtrk-mg","gtrk-ai-drama","gtrk-style-maker","gtrk-transcript","gtrk-tools","gtrk-music-visualizer","gtrk-cover","gtrk-travel-recap","gtrk-live-slicing","gtrk-talking-head","gtrk-narration","gtrk-voiceover","gtrk-food-recap"],gY=[{id:"workbuddy",displayName:"WorkBuddy",dataDir:".workbuddy"},{id:"qoderwork",displayName:"QoderWork",dataDir:".qoderwork"},{id:"comate",displayName:"Baidu Comate",dataDir:".comate"}],fY=new Set(gY.map((Z)=>Z.id)),pH={claude:"claude-code","trae-global":"trae","tencent-workbuddy":"workbuddy","qoder-work":"qoderwork","baidu-comate":"comate","wenxin-comate":"comate",qwen:"qwen-code",kimi:"kimi-code-cli","kimi-code":"kimi-code-cli",iflow:"iflow-cli",codearts:"codearts-agent","tongyi-lingma":"lingma","tencent-codebuddy":"codebuddy"},iH=/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/u,oH=/\x1B\[[0-?]*[ -/]*[@-~]/gu,rH="PromptScript: PromptScript does not support global skill installation";function aH(Z){let Q=(Z??"").split(/[\s,]+/u).map((J)=>J.trim().toLowerCase()).filter(Boolean).map((J)=>pH[J]??J),Y=Q.filter((J)=>!iH.test(J));if(Y.length>0)throw Error(`Agent ID 格式不合法:${Y.join(", ")}`);return[...new Set(Q)]}function K5(Z){let Q=aH(Z);return{requested:Q,upstream:Q.filter((Y)=>!fY.has(Y)),supplemental:Q.filter((Y)=>fY.has(Y))}}function sH(Z={},Q=hY(),Y=q6){let J=K5(Z.agents),z=new Set(J.supplemental);return gY.filter((X)=>{if(Z.all)return!0;if(J.requested.length>0)return z.has(X.id);return Y(T8(Q,X.dataDir))}).map((X)=>({id:X.id,displayName:X.displayName,destRoot:T8(Q,X.dataDir,"skills")}))}function t9(Z){return Z.replace(oH,"").trim()}function tH(Z){let Q=Z.includes(`\r
|
|
31
31
|
`)?`\r
|
|
32
32
|
`:`
|
|
33
|
-
`,Y=Z.split(/\r?\n/u),J=Y.findIndex((K)=>
|
|
33
|
+
`,Y=Z.split(/\r?\n/u),J=Y.findIndex((K)=>t9(K).includes("Failed to install"));if(J<0)return{output:Z,suppressedPromptScriptFailures:0};let z=Y.findIndex((K,G)=>G>J&&t9(K).includes("Done!"));if(z<0)return{output:Z,suppressedPromptScriptFailures:0};let X=Y.slice(J,z).map(t9).filter((K)=>K.includes("✗"));if(X.length===0||X.some((K)=>!K.includes(rH)))return{output:Z,suppressedPromptScriptFailures:0};let W=J;while(W>0){let K=t9(Y[W-1]??"");if(K!==""&&K!=="│"&&K!=="|")break;W-=1}let V=z+1;while(V<Y.length&&t9(Y[V]??"")==="")V+=1;return{output:[...Y.slice(0,W),...Y.slice(V)].join(Q),suppressedPromptScriptFailures:X.length}}function eH(Z,Q={}){let Y=["-y","skills","add",Z,"-g","-y"];if(Q.all)Y.push("--all");else for(let J of K5(Q.agents).upstream)Y.push("--agent",J);if(Q.copy)Y.push("--copy");return Y}function Zq(Z){let Q=process.env.npm_execpath,J=[Q&&T8(W5(Q),"npx-cli.js"),T8(W5(process.execPath),"node_modules","npm","bin","npx-cli.js"),V5(W5(process.execPath),"..","lib","node_modules","npm","bin","npx-cli.js")].filter((z)=>Boolean(z)).find((z)=>q6(z));if(J)return{command:process.execPath,args:[J,...Z],shell:!1};return{command:"npx",args:Z,shell:process.platform==="win32"}}function uY(Z){let Q=!0;for(let Y of bY){let J=T8(Z,Y,"SKILL.md");if(!q6(J))j.warn(`找不到打包的 skill 源:${J}(跳过 ${Y},不影响命令行)`),Q=!1}return Q}function mY(Z,Q,Y){let J=V5(Z),z=uY(Q);for(let X of bY){let W=T8(Q,X);if(!q6(T8(W,"SKILL.md")))continue;let V=T8(J,X);try{dH(V,{recursive:!0}),nH(W,V,{recursive:!0}),j.ok(`已安装 ${X}${Y?` → ${Y}`:""}:${T8(V,"SKILL.md")}`)}catch(K){z=!1,j.warn(`skill 安装失败(${X},不影响命令行使用):${K instanceof Error?K.message:String(K)}`)}}if(Y)j.info(`已写入 ${Y};若当前会话未出现新 Skill,请重启或刷新该 Agent。`);else j.info("已写入自定义 skills 目录;具体调用入口以该 Agent 的界面为准。");return z}function Qq(Z,Q=T8(o8(),"skills")){return mY(Z,Q)}function G5(Z={}){let Q=V5(Z.source??T8(o8(),"skills"));if(Z.dir)return Qq(Z.dir,Q);let Y;try{Y=K5(Z.agents)}catch(K){return j.err(K instanceof Error?K.message:String(K)),!1}let J=uY(Q),z=Z.all||Y.requested.length===0||Y.upstream.length>0,X=!0;if(z){let K=eH(Q,{...Z,agents:Y.upstream.join(",")});j.info("使用通用 Agent Skills 适配器:自动探测宿主、统一存储,并链接到各 Agent。");let G=Zq(K),$=lH(G.command,G.args,{stdio:["inherit","pipe","pipe"],shell:G.shell,encoding:"utf8",maxBuffer:16777216}),N=!Z.all&&Y.requested.length===0?tH($.stdout??""):{output:$.stdout??"",suppressedPromptScriptFailures:0};if(N.output){if(process.stdout.write(N.output),!N.output.endsWith(`
|
|
34
34
|
`))process.stdout.write(`
|
|
35
|
-
`)}if($.stderr)process.stderr.write($.stderr);if(N.suppressedPromptScriptFailures>0)j.info("已跳过 PromptScript:它只支持项目级 Skill,不参与本次全局安装;其他 Agent 不受影响。");if($.error)X=!1,j.warn(`无法启动 skills 适配器:${$.error.message}`),j.info(`可手动重试:npx -y skills add "${Q}" -g -y`);else if($.status!==0)X=!1,j.warn(`skills 适配器安装失败(退出码 ${$.status??"未知"})。`),j.info(`可查看支持的 Agent ID:npx -y skills add "${Q}" --list`)}let
|
|
35
|
+
`)}if($.stderr)process.stderr.write($.stderr);if(N.suppressedPromptScriptFailures>0)j.info("已跳过 PromptScript:它只支持项目级 Skill,不参与本次全局安装;其他 Agent 不受影响。");if($.error)X=!1,j.warn(`无法启动 skills 适配器:${$.error.message}`),j.info(`可手动重试:npx -y skills add "${Q}" -g -y`);else if($.status!==0)X=!1,j.warn(`skills 适配器安装失败(退出码 ${$.status??"未知"})。`),j.info(`可查看支持的 Agent ID:npx -y skills add "${Q}" --list`)}let W=!0,V=sH(Z,Z.home??hY());for(let K of V)if(j.info(`使用 gtrk 补充适配:${K.displayName} → ${K.destRoot}`),!mY(K.destRoot,Q,K.displayName))W=!1;if(X&&W)j.info("若当前会话没有立刻出现新 skill,请刷新窗口或新开一个会话。");return J&&X&&W}function cY(Z){Z.command("skills").description("管理跨 Agent Skills(通用适配器 + gtrk 补充宿主)").command("install").description("把 gtrk 全家框架 skill 安装到自动检测或指定的 Agent").option("--agents <list>","指定 Agent ID,逗号分隔,如 codex,trae-cn,workbuddy,comate").option("--all","安装到上游和 gtrk 已登记的全部 Agent").option("--copy","每个 Agent 各复制一份(默认统一存储 + symlink/junction)").option("--dir <dir>","兼容模式:直接复制到单个 skills 目录,绕过 Agent 适配器").action((Y)=>{if(!G5(Y))process.exitCode=1})}import{join as qU,resolve as OJ}from"node:path";import{existsSync as RJ}from"node:fs";import{join as Yq}from"node:path";import{existsSync as Jq,mkdirSync as zq,readFileSync as Xq,writeFileSync as Wq}from"node:fs";var M0="https://api.ai-mcn.tv:10000",lY=K9(),U6=Yq(lY,"config.json");function F8(){return U6}function TZ(){if(!Jq(U6))return{};try{return JSON.parse(Xq(U6,"utf8"))}catch{return{}}}function m0(Z){zq(lY,{recursive:!0});let Q={...TZ(),...Z};Wq(U6,JSON.stringify(Q,null,2))}var dY="terms-2026-08",Vq="https://hocassian.feishu.cn/wiki/T6UywR8b3ik4Mgk7tP9c1b7Kn0b",Kq="https://hocassian.feishu.cn/wiki/ZLRNwlEhfishYtkosUhcofMYnPf",Gq='《"OpenCut Gitruck Edition 客户端"与"gtrk CLI"用户协议》',$q=[`⚖️ 合规告知:本机将按${Gq}使用同合云云端能力;你是所处理内容合法性的第一责任人。`,` 用户协议 ${Vq}`,` 隐私政策 ${Kq}`];function Hq(){return` 告知留痕未能写入 ${F8()}:不影响本次执行,下次运行会再提示一次`}var nY=!1;function q8(Z={}){let Q=Z.write??((X)=>void process.stderr.write(X)),Y;try{Y=(Z.readConfig??TZ)().termsNoticeVersion}catch{Y=void 0}if(Y===dY)return!1;if(nY)return!1;let[J,...z]=$q;Q(`\x1B[36m${J}\x1B[0m
|
|
36
36
|
\x1B[2m${z.join(`
|
|
37
37
|
`)}\x1B[0m
|
|
38
|
-
`),
|
|
39
|
-
`)}return!0}var
|
|
38
|
+
`),nY=!0;try{(Z.writeConfig??m0)({termsNoticeVersion:dY,termsNoticeAt:(Z.now??(()=>new Date))().toISOString()})}catch{Q(`\x1B[2m${Hq()}\x1B[0m
|
|
39
|
+
`)}return!0}var qq="https://hocassian.feishu.cn/wiki/HCFpwoF7SivIFbkKosgcFMcEnxk",Uq="https://cloud.ai-mcn.tv/zh-CN/docs/quick-start",$5=['① 命令行直接剪:gtrk oralcut "<毛片.mp4>" --script "<文字稿.txt>"(无稿就别加 --script)',"② 刷新你常用的 AI Agent,在它的 Skills 入口选择或点名 gtrk-oralcut;不同客户端也都可以直接描述剪辑需求触发。"],Nq=["\uD83D\uDC4B 第一次用 gtrk?三步跑通第一条口播:"," 1) gtrk install —— 装依赖与运行时资产"," 2) gtrk init —— 填 API Key、认剪映草稿目录(跑完会自动体检)",` 3) ${$5[0]}`,` 使用教程 ${qq}`,` 快速开始 ${Uq}`];function Bq(){return` 首跑留痕未能写入 ${F8()}:不影响本次执行,下次运行会再提示一次`}var pY=!1;function jq(Z){return typeof Z.apiKey==="string"&&Z.apiKey.trim().length>0}function iY(Z={}){let Q=Z.write??((W)=>void process.stderr.write(W)),Y;try{Y=(Z.readConfig??TZ)()}catch{Y={}}let J=()=>{try{return(Z.writeConfig??m0)({firstRunNoticeAt:(Z.now??(()=>new Date))().toISOString()}),!0}catch{return!1}};if(typeof Y.firstRunNoticeAt==="string"&&Y.firstRunNoticeAt.length>0)return!1;if(jq(Y))return J(),!1;if(pY)return!1;let[z,...X]=Nq;if(Q(`\x1B[36m${z}\x1B[0m
|
|
40
40
|
\x1B[2m${X.join(`
|
|
41
41
|
`)}\x1B[0m
|
|
42
|
-
`),
|
|
43
|
-
`);return!0}import{join as
|
|
44
|
-
`){
|
|
45
|
-
`),
|
|
46
|
-
`),
|
|
47
|
-
`),hint
|
|
48
|
-
`).filter(Boolean))j.info(Y);j.warn(`正在用**可能已过期**的派单快照时码继续。${vq(Q.reason)}`);return}j.step(`▶ ${eY(Q)}`);for(let Y of Q.degraded_entries)j.warn(`${Y.beat}:无法重投影(${Y.text}),本条回退派单快照时码`);for(let Y of Q.shrunk)j.warn(`${Y}:span 内有句被剪,已按存活包络收缩(建议人工复核)`);for(let Y of Q.dropped)j.warn(`${Y}:重投影后零存活(整段已被剪出成片),本条跳过——不按快照时码铺回去`)}function U6(Z,Q,Y){let J=Z.struct_meta??{},z=J[Q];if(!z)return Z;return{...Z,struct_meta:{...J,[Q]:{...z,timecode_source:Y.summary.mode==="reprojected"?"reprojected":"dispatch_snapshot",...Y.summary.projected_at?{reprojected_at:Y.summary.projected_at}:{},...Y.summary.reason?{timecode_degrade_reason:Y.summary.reason}:{}}}}}function eY(Z){if(Z.mode==="dispatch_snapshot")return`重投影降级:按派单快照时码铺 ${Z.total} 个条目(原因:${Z.reason_text??Z.reason})——快照可能已过期`;let Q=[`重投影 ${Z.reprojected} 个 beat`,`漂移 ${Z.drifted} 条`];if(Z.drifted>0)Q.push(`最大偏移 ${Z.max_offset}s`);if(Z.shrunk.length)Q.push(`收缩 ${Z.shrunk.length} 条`);if(Z.dropped.length)Q.push(`整段被剪跳过 ${Z.dropped.length} 条`);if(Z.degraded_entries.length)Q.push(`逐条降级 ${Z.degraded_entries.length} 条`);return Q.join(" · ")}function vq(Z){switch(Z){case"transcript_missing":case"transcript_unreadable":return"复原:把 transcript.json 补回产物目录(transcript/ 或 json/ 下),或用新版 gtrk oralcut 重出产物后重跑本命令。";case"no_project":case"gtrk_unreadable":return"复原:把工程放回 <产物目录>/gtrk/project.gtrk(或用 --project 指到工程所在的产物目录)后重跑本命令。";case"project_not_v1":return"复原:用新链路重产 v1 工程后重跑本命令。";case"no_material_clip":return $5}}var N6=["真人出镜","口播继续","旁白主导"],ZQ=["A_ROLL","MG","AI_DRAMA","FILM_BROLL"],B6=["mirror-hook","demolition","container-translation","abyssal-fall","holding","reversal-elevation","callback-closure","typography-emphasis"],j6=["none","seed","expand","translate","rupture","flip","callback"],wq=["必须真人出镜","优先 MG","可被 B-roll 替代","可降级处理"],yq=["quote-card","term-callout","network-diagram","archive-caption","pause-card","data-annotation","timeline-tag","overlay"],ZJ=2,xq={RRV_MG:"MG"};function U5(Z){if(typeof Z!=="string")return;if(ZQ.includes(Z))return Z;return xq[Z]}function fZ(Z){return typeof Z==="string"&&Z.trim().length>0}function e9(Z,Q){return typeof Z==="string"&&Q.includes(Z)}function QJ(Z,Q){let Y=[],J=[];if(typeof Z!=="object"||Z===null||Array.isArray(Z))return{errors:["拆分稿必须是一个 JSON 对象"],warnings:J};let z=Z,X=Q.vocab??{narrative:B6,container_stage:j6,base_track:N6},V=X.unknown_narrative==="allow";if(z.contract_version!=="v1")Y.push(`contract_version 必须为 "v1"(实际:${JSON.stringify(z.contract_version)})`);if(!fZ(z.transcript_hash))Y.push("缺 transcript_hash(应从投影视图透传)");else if(z.transcript_hash!==Q.transcriptHash)Y.push(`transcript_hash 不匹配:拆分稿 ${z.transcript_hash} ≠ 当前 transcript ${Q.transcriptHash}——转写已变更,请重新导出视图并重拆`);if(!Array.isArray(z.beats)||z.beats.length===0)return Y.push("beats 必须是非空数组"),{errors:Y,warnings:J};let W=new Map;Q.utteranceIds.forEach((H,N)=>W.set(H,N));let K=[],G=new Set;z.beats.forEach((H,N)=>{let U=(()=>{let O=H?.id;return fZ(O)?O:`beats[${N}]`})();if(typeof H!=="object"||H===null||Array.isArray(H)){Y.push(`${U}:beat 必须是对象`);return}let q=H;if(!fZ(q.id))Y.push(`${U}:缺 id`);else if(!/^B\d{2,}$/.test(q.id))Y.push(`${q.id}:id 须为 "B"+两位起序号(如 B01)`);else if(G.has(q.id))Y.push(`${q.id}:beat id 重复`);else G.add(q.id);if(V){if(!fZ(q.base_track))Y.push(`${U}:缺 base_track`);if(!fZ(q.narrative))Y.push(`${U}:缺 narrative`);if(!fZ(q.container_stage))Y.push(`${U}:缺 container_stage`)}else{if(!e9(q.base_track,X.base_track))Y.push(`${U}:base_track 非法(栏目词表:${X.base_track.join(" | ")})`);if(!e9(q.narrative,X.narrative))Y.push(`${U}:narrative 非法(不在栏目词表内)`);if(!e9(q.container_stage,X.container_stage))Y.push(`${U}:container_stage 非法(不在栏目词表内)`)}if(!U5(q.lane))Y.push(`${U}:lane 非法(四选一:${ZQ.join(" | ")})`);if(!e9(q.irreplaceability,wq))Y.push(`${U}:irreplaceability 非法(四枚举之一)`);if(!fZ(q.rhythm))Y.push(`${U}:缺 rhythm(人读节奏标签)`);if(!fZ(q.visual_task))Y.push(`${U}:缺 visual_task(一句话视觉任务)`);let M=q.span,F=-1,R=-1;if(!M||!fZ(M.from)||!fZ(M.to))Y.push(`${U}:缺 span.from / span.to(utterance id 区间)`);else{if(!W.has(M.from))Y.push(`${U}:span.from 引用了不存在的 utterance id ${M.from}`);else F=W.get(M.from);if(!W.has(M.to))Y.push(`${U}:span.to 引用了不存在的 utterance id ${M.to}`);else R=W.get(M.to);if(F>=0&&R>=0){if(F>R)Y.push(`${U}:区间倒序(span.from ${M.from} 晚于 span.to ${M.to})`);else if(fZ(q.id))K.push({id:q.id,from:F,to:R})}}if(kq(U,q,Y,J),fq(U,q,W,F,R,Q.utteranceTexts,Y,J),q.aux_layers!=null)if(!Array.isArray(q.aux_layers))Y.push(`${U}:aux_layers 必须是数组`);else q.aux_layers.forEach((O,P)=>hq(`${U}.aux[${P}]`,O,W,Y,J))});let $=[...K].sort((H,N)=>H.from-N.from||H.to-N.to);for(let H=1;H<$.length;H++){let N=$[H-1],U=$[H];if(U.from<=N.to)Y.push(`${N.id} 与 ${U.id}:utterance 区间重叠(beats 之间不允许交集)`)}return{errors:Y,warnings:J}}function kq(Z,Q,Y,J){let{lane:z,handoff:X}=Q;if(z==="A_ROLL"){if(X!=null)J.push(`${Z}:A_ROLL 不应带 handoff,已忽略`);return}if(z==="MG"||z==="RRV_MG"){if(!X||typeof X.duration_hint!=="number")Y.push(`${Z}:MG 的 handoff.duration_hint 必填(秒,数值)`);if(X&&X.category!==void 0&&!JJ(X.category))J.push(`${Z}:handoff.category「${String(X.category)}」非已知品类(${YJ.join("/")}),已透传但下游按 opaque 反推`);return}if(z==="FILM_BROLL"){let V=X?.queries;if(!Array.isArray(V)||V.length===0||!V.every((W)=>fZ(W)))Y.push(`${Z}:FILM_BROLL 缺检索 query(handoff.queries 必须为非空字符串数组)`);return}}function fq(Z,Q,Y,J,z,X,V,W){let G=Q.handoff?.anchors;if(G===void 0)return;if(U5(Q.lane)!=="FILM_BROLL"){W.push(`${Z}:handoff.anchors 仅 FILM_BROLL 主层消费(当前 lane=${String(Q.lane)}),已忽略不透传`);return}if(!Array.isArray(G)){V.push(`${Z}:handoff.anchors 必须是数组`);return}if(G.length>ZJ)V.push(`${Z}:anchors 至多 ${ZJ} 个/beat(得到 ${G.length})——锚过密会把序贯填充区间切碎`);G.forEach(($,H)=>{let N=`${Z}.anchors[${H}]`;if(typeof $!=="object"||$===null||Array.isArray($)){V.push(`${N}:锚必须是对象({keyword, utterance, query})`);return}let U=$;if(!fZ(U.keyword))V.push(`${N}:缺 keyword(关键词原文)`);if(!fZ(U.query))V.push(`${N}:缺 query(锚专属检索词,写视觉描述)`);if(!fZ(U.utterance)){V.push(`${N}:缺 utterance(关键词所在句 id)`);return}let q=Y.get(U.utterance);if(q===void 0){V.push(`${N}:utterance 引用了不存在的 id ${U.utterance}`);return}if(J>=0&&z>=0&&(q<J||q>z))V.push(`${N}:utterance ${U.utterance} 不在该 beat 的 span 区间内`);let M=X?.get(U.utterance);if(fZ(U.keyword)&&typeof M==="string"&&!M.includes(U.keyword))V.push(`${N}:keyword「${U.keyword}」不是句 ${U.utterance} 文本的子串——照原句抄写关键词(勿改写、勿增删标点)`)})}function hq(Z,Q,Y,J,z){if(typeof Q!=="object"||Q===null||Array.isArray(Q)){J.push(`${Z}:辅助层必须是对象`);return}let X=Q;if(!e9(X.type,yq))J.push(`${Z}:type 非法(八类之一)`);if(!fZ(X.role))J.push(`${Z}:缺 role(职责)`);if(X.type==="overlay"){let W=X.handoff;if(!W||typeof W.duration_hint!=="number"||!(W.duration_hint>0))J.push(`${Z}:overlay aux 缺颗粒时长(handoff.duration_hint 必填且须为正数)`);if(W&&W.category!==void 0&&!JJ(W.category))z.push(`${Z}:handoff.category「${String(W.category)}」非已知品类(${YJ.join("/")}),已透传但下游按 opaque 反推`)}let V=X.mount;if(V==="same_beat")return;if(typeof V==="object"&&V!==null){let W=V;if(fZ(W.trigger)){if(!Y.has(W.trigger))J.push(`${Z}:mount.trigger 引用了不存在的 utterance id ${W.trigger}`);return}if(fZ(W.from)&&fZ(W.to)){if(!Y.has(W.from))J.push(`${Z}:mount.from 引用了不存在的 utterance id ${W.from}`);if(!Y.has(W.to))J.push(`${Z}:mount.to 引用了不存在的 utterance id ${W.to}`);if(Y.has(W.from)&&Y.has(W.to)&&Y.get(W.from)>Y.get(W.to))J.push(`${Z}:mount 区间倒序`);return}}J.push(`${Z}:mount 非法(应为 "same_beat" | {from,to} | {trigger})`)}var YJ=["overlay","fullscreen","subtitle","title"],bq={overlay:!1,fullscreen:!0,subtitle:!1,title:!0,"rrv-overlay":!1,"mg-fullscreen":!0,"explain-subtitle":!1,"op-ed-title":!0};function JJ(Z){return typeof Z==="string"&&Object.prototype.hasOwnProperty.call(bq,Z)}function q9(Z){return Math.round(Z*1000)/1000}function zJ(Z,Q,Y){let J=q5(Q,Y.utteranceIds),z={contract_version:Z.contract_version,transcript_hash:Z.transcript_hash,projected_at:Y.projectedAt,...Y.sourceIndex?{material_id:Y.sourceIndex.materialId}:{},beats:[]},X={mg:[],film_broll:[],ai_drama:[]},V=[],W=[],K=new Set;for(let G of Z.beats){let $=q6(J,G.span);if($.kind!=="ok"){V.push({beat:G.id,reason:"span 内全部 utterance 被剪,未落轨"});continue}let{track_st:H,track_ed:N,shrunk:U}=$,q=U5(G.lane)??G.lane,M={id:G.id,lane:q,span:G.span,track_st:H,track_ed:N};if(Y.sourceIndex){let P=Y.sourceIndex.utterances.get(G.span.from),D=Y.sourceIndex.utterances.get(G.span.to);if(P&&D&&D.ed>P.st)M.source_ranges=[{st:q9(P.st),ed:q9(D.ed)}]}if(U)M.shrunk=!0;if(G.narrative)M.narrative=G.narrative;if(G.container_stage)M.container_stage=G.container_stage;if(G.visual_task)M.visual_task=G.visual_task;if(q==="MG"&&typeof G.handoff?.category==="string")M.category=G.handoff.category;if(q!=="A_ROLL"&&G.handoff)M.handoff=G.handoff;if(z.beats.push(M),U)W.push({beat:G.id,kept:$.kept,dropped:$.dropped,track_st:H,track_ed:N});let F=G.handoff??{},R=`${Y.projectSlug}-${G.id}`;if(q==="MG")X.mg.push({beat:G.id,composition_id:R,duration:q9(N-H),duration_hint:typeof F.duration_hint==="number"?F.duration_hint:null,...F.category!==void 0?{category:F.category}:{},theme:F.theme,bg:F.bg,slug_hint:F.slug_hint,track_st:H,track_ed:N,span:G.span});else if(q==="FILM_BROLL"){let P=Array.isArray(F.anchors)&&F.anchors.length?F.anchors:void 0;X.film_broll.push({beat:G.id,queries:Array.isArray(F.queries)?F.queries:[],shots:F.shots,per_shot_sec:F.per_shot_sec,exclude:F.exclude,...P?{anchors:P}:{},track_st:H,track_ed:N,span:G.span})}else if(q==="AI_DRAMA")X.ai_drama.push({beat:G.id,...F,track_st:H,track_ed:N,span:G.span});else if(q!=="A_ROLL")K.add(q);let O=0;for(let P of G.aux_layers??[]){if(P.type!=="overlay")continue;O+=1;let D=`${G.id}-aux${O}`,T=P.mount,_,L;if(T==="same_beat")_=G.span.from,L=G.span.to;else if("from"in T&&"to"in T)_=T.from,L=T.to;else{V.push({beat:D,reason:"overlay aux 使用 {trigger} 点挂载,一期不支持(二期补合成窗口)"});continue}let I={from:_,to:L},E=q6(J,I);if(E.kind!=="ok"){V.push({beat:D,reason:"overlay aux 源区间 utterance 全被剪,未落轨"});continue}let{track_st:y,track_ed:f}=E,S=`${Y.projectSlug}-${G.id}-aux${O}`,w=P.handoff;X.mg.push({beat:G.id,composition_id:S,duration:q9(f-y),duration_hint:w&&typeof w.duration_hint==="number"?w.duration_hint:null,category:"overlay",theme:w?.theme,bg:w?.bg,slug_hint:w?.slug_hint,track_st:y,track_ed:f,span:I});let x={id:D,lane:"MG",span:I,track_st:y,track_ed:f,category:"overlay"};if(Y.sourceIndex){let m=Y.sourceIndex.utterances.get(_),r=Y.sourceIndex.utterances.get(L);if(m&&r&&r.ed>m.st)x.source_ranges=[{st:q9(m.st),ed:q9(r.ed)}]}z.beats.push(x)}}return{split:z,dispatch:X,skipped:V,shrunk:W,unhandledLanes:[...K]}}function XJ(Z,Q,Y){let J=[],z=new Map(Q.split.beats.map((V)=>[V.id,V])),X=new Set(Q.skipped.map((V)=>V.beat));J.push(`# 视觉拆分稿(${Y.projectSlug})`),J.push(""),J.push(`- contract_version:\`${Z.contract_version}\``),J.push(`- transcript_hash:\`${Z.transcript_hash}\``),J.push(`- projected_at:\`${Y.projectedAt}\``),J.push(`- beats:${Z.beats.length}(落轨 ${Q.split.beats.length} · 跳过 ${Q.skipped.length} · 收缩 ${Q.shrunk.length})`),J.push(""),J.push("# Beat Timeline"),J.push("");for(let V of Z.beats){let W=z.get(V.id);if(J.push(`## ${V.id}${X.has(V.id)?"(整段被剪 · 跳过)":W?.shrunk?"(部分被剪 · 已收缩)":""}`),J.push(`- 文稿范围:\`${V.span.from} … ${V.span.to}\``),J.push(`- 底轨:\`${V.base_track}\``),J.push(`- 主层:\`${V.lane}\``),J.push(`- 叙事功能:\`${V.narrative}\``),J.push(`- 容器阶段:\`${V.container_stage}\``),V.rhythm)J.push(`- 节奏标签:\`${V.rhythm}\``);if(J.push(`- 视觉任务:${V.visual_task}`),J.push(`- 不可替代性:\`${V.irreplaceability}\``),W)J.push(`- 轨道时码:\`${W.track_st}s … ${W.track_ed}s\``);if(V.callback_of)J.push(`- 回扣对象:\`${V.callback_of}\``);for(let K of V.aux_layers??[]){let G=K.mount==="same_beat"?"同 beat":("trigger"in K.mount)?`触发 ${K.mount.trigger}`:`${K.mount.from} … ${K.mount.to}`;J.push(` - 辅助层 \`${K.type}\`(${G}):${K.role}`)}J.push("")}J.push("# Production Queues"),J.push(""),J.push("## A_ROLL Queue");for(let V of Z.beats.filter((W)=>W.lane==="A_ROLL"&&!X.has(W.id)))J.push(`- \`${V.id}\` ${V.visual_task}`);J.push(""),J.push("## MG Queue");for(let V of Q.dispatch.mg){let W=V.duration!=null?` · 坑位 ${V.duration}s`:"",K=V.duration_hint!=null?` · hint ${V.duration_hint}s`:"";J.push(`- \`${V.beat}\` composition_id=\`${V.composition_id}\`${W}${K}`)}J.push(""),J.push("## AI_DRAMA Queue");for(let V of Q.dispatch.ai_drama)J.push(`- \`${V.beat}\` ${V.track_st}s…${V.track_ed}s`);J.push(""),J.push("## FILM_BROLL Queue");for(let V of Q.dispatch.film_broll){let W=V.anchors?.length?` · 锚=[${V.anchors.map((K)=>K.keyword).join(" / ")}]`:"";J.push(`- \`${V.beat}\` queries=[${V.queries.join(" / ")}]${W}`)}return J.push(""),J.join(`
|
|
49
|
-
`)}var
|
|
50
|
-
`+" 也可自行把 ffmpeg/ffprobe 放到该目录,或用 --ffmpeg-path <目录> 指定已装位置。",
|
|
42
|
+
`),pY=!0,!J())Q(`\x1B[2m${Bq()}\x1B[0m
|
|
43
|
+
`);return!0}import{join as N6,resolve as Fq}from"node:path";import{existsSync as rY}from"node:fs";import{cp as Mq,mkdir as Rq,readdir as Dq}from"node:fs/promises";function B6(){let Z=process.env.LOCALAPPDATA;if(!Z)return;return[N6(Z,"JianyingPro","User Data","Projects","com.lveditor.draft"),N6(Z,"CapCut","User Data","Projects","com.lveditor.draft")].find((Y)=>rY(Y))}function R0(Z){if(Z&&Z!=="auto")return Fq(Z);let Q=TZ().jianyingDraftDir;if(Q&&rY(Q))return Q;return B6()}var oY=["draft_content.json","draft_meta_info.json"];async function j6(Z,Q){let Y=(await Dq(Z,{withFileTypes:!0})).sort((V,K)=>V.name<K.name?-1:V.name>K.name?1:0),J=new Map;for(let V of oY){let K=Y.filter(($)=>$.isFile()&&$.name.toLowerCase().endsWith(V)),G=K.find(($)=>$.name.toLowerCase()===V)??K[0];if(G)J.set(G.name,V)}await Rq(Q,{recursive:!0});let z={},X=[];for(let V of Y){let K=J.get(V.name),G=N6(Q,K??V.name);if(await Mq(N6(Z,V.name),G,{recursive:!0}),K)z[K]=G;else X.push(V.name)}let W=oY.filter((V)=>!z[V]);return{landed:z,missing:W,complete:W.length===0,passthrough:X}}import{spawn as Pq}from"node:child_process";function D0(Z){let Q=process.platform;sY(Q==="win32"?["explorer",Z]:Q==="darwin"?["open",Z]:["xdg-open",Z])}function aY(Z){let Q=process.platform;sY(Q==="win32"?["cmd","/c","start","",Z]:Q==="darwin"?["open",Z]:["xdg-open",Z])}function sY(Z){try{Pq(Z[0],Z.slice(1),{stdio:"ignore",detached:!0}).unref()}catch{}}import{stdin as P0,stdout as e9}from"node:process";import{spawnSync as F6}from"node:child_process";var H5={dim:(Z)=>`\x1B[2m${Z}\x1B[0m`,cyan:(Z)=>`\x1B[36m${Z}\x1B[0m`};function Oq(){try{if(process.platform==="win32")return(F6("powershell",["-NoProfile","-Command","Get-Clipboard"],{encoding:"utf8"}).stdout??"").replace(/\r?\n$/,"");if(process.platform==="darwin")return F6("pbpaste",{encoding:"utf8"}).stdout??"";let Z=F6("xclip",["-selection","clipboard","-o"],{encoding:"utf8"});if(Z.status===0)return Z.stdout??"";return F6("wl-paste",["-n"],{encoding:"utf8"}).stdout??""}catch{return""}}function q5(Z,Q={}){return new Promise((Y)=>{let J=Q.defaultValue?H5.dim(` (${Q.defaultValue})`):"";e9.write(`${H5.cyan("?")} ${Z}${J} `);let z="",X=(G)=>e9.write(Q.mask?"•".repeat([...G].length):G),W=P0.isRaw??!1;P0.setRawMode?.(!0),P0.resume(),P0.setEncoding("utf8");let V=()=>{P0.off("data",K),P0.setRawMode?.(W),P0.pause()},K=(G)=>{for(let $ of G){if($==="\r"||$===`
|
|
44
|
+
`){e9.write(`
|
|
45
|
+
`),V(),Y(z||Q.defaultValue||"");return}if($==="\x03")e9.write(`
|
|
46
|
+
`),V(),process.exit(130);if($==="\x16"){let H=Oq().replace(/[\r\n]+/g,"");z+=H,X(H);continue}if($===""||$==="\b"){if(z.length)z=z.slice(0,-1),e9.write("\b \b");continue}if($.charCodeAt(0)>=32)z+=$,X($)}};P0.on("data",K)})}function U5(Z,Q={}){return q5(Z,{defaultValue:Q.defaultValue})}function tY(Z){return q5(Z,{mask:!0})}async function $9(Z,Q=!0){let Y=(await q5(`${Z} ${H5.dim(Q?"[Y/n]":"[y/N]")}`)).trim().toLowerCase();if(!Y)return Q;return Y==="y"||Y==="yes"}import{existsSync as E6}from"node:fs";import{join as $U}from"node:path";import{join as HJ}from"node:path";import{existsSync as pq,readFileSync as iq}from"node:fs";import{existsSync as Iq}from"node:fs";import{readFile as Sq}from"node:fs/promises";import{basename as vq,join as j5}from"node:path";function M6(Z){return Math.round(Z*1000)/1000}function Lq(Z){let Q=Z.clip_st??0,Y=Z.track_st??0,J=Z.duration??(Z.clip_ed!=null?Z.clip_ed-Q:0),z=Z.clip_ed??Q+J;return{clip_st:Q,clip_ed:z,track_st:Y}}function eY(Z){if(!Z.length)return;let Q=Z[0],Y=Q.track_index??0;for(let J of Z){let z=J.track_index??0;if(z<Y)Q=J,Y=z}return Q}var Cq=/^ex-solid-[0-9a-f]{6}-[1-9][0-9]*x[1-9][0-9]*$/,_q="broll-";function Tq(Z){let Q=Z.struct_meta?.broll,Y=new Set;for(let z of Array.isArray(Q?.lay_tracks)?Q.lay_tracks:[])if(typeof z==="number"&&Number.isFinite(z))Y.add(z);let J=typeof Q?.black_track==="number"?Q.black_track:null;if(J!=null)Y.add(J);return{laid:Y,black:J}}function Aq(Z){let Q=Z.track_timeline??[];if(!Q.length)return!1;return Q.every((Y)=>{if(Y.material==null)return!1;let J=String(Y.material);return Cq.test(J)||J.startsWith(_q)})}function N5(Z){let{laid:Q,black:Y}=Tq(Z),J=[],z=[];for(let K of Z.video_track??[]){let G=K.track_index??0;if(Q.has(G)){J.push({track_index:G,why:G===Y?"black_bed":"self_laid"});continue}if(Q.size===0&&Aq(K)){J.push({track_index:G,why:"self_laid_guess"});continue}z.push(K)}let X=eY(z),W=X?.track_timeline??[];if(W.length)return{clips:[...W],source:"video",track_index:X?.track_index??0,skipped:J};let V=(Z.audio_track??[]).filter((K)=>(K.track_timeline??[]).length>0);if(V.length)return{clips:V.flatMap((K)=>K.track_timeline??[]),source:"audio",track_index:eY(V)?.track_index??0,skipped:J};return{clips:[],source:"none",track_index:null,skipped:J}}var B5="复原:① 配音驱动工程的口播在 audio 轨——确认配音轨还在、其 material 与 transcript.material_id 一致;"+"② 铺过 B-roll / 黑底垫轨的工程,确认 .gtrk 的 struct_meta.broll 登记还在"+"(经后端 video_project_struct 往返会被裁掉);③ 拿另一个工程的 transcript / dispatch 来跑也会命中本情形。",Eq={black_bed:"CLI 自产黑底垫轨(struct_meta.broll.black_track 登记)",self_laid:"CLI 自产 B-roll 候选轨(struct_meta.broll.lay_tracks 登记)",self_laid_guess:"疑似 CLI 自产轨(全轨都是 ex-solid-* / broll-* 素材;struct_meta.broll 无登记)"};function H9(Z,Q){let Y=String(Q),J=N5(Z),z=new Map(J.skipped.map((H)=>[H.track_index,H.why])),X=(H)=>(H.track_timeline??[]).filter((N)=>N.material!=null&&String(N.material)===Y).length,W=[];for(let H of Z.video_track??[]){let N=H.track_index??0;W.push({bucket:"video",track_index:N,clips:(H.track_timeline??[]).length,matched:X(H),...z.has(N)?{skipped:z.get(N)}:{}})}for(let H of Z.audio_track??[])W.push({bucket:"audio",track_index:H.track_index??0,clips:(H.track_timeline??[]).length,matched:X(H)});let V=J.clips.filter((H)=>H.material!=null&&String(H.material)===Y).length,K=(Z.audio_track??[]).filter((H)=>(H.track_timeline??[]).length>0).length,$=[`· 选中的投影主轨:${J.source==="none"?"无可用主轨(video / audio 轨上都没有 clip)":J.source==="video"?`video 轨 #${J.track_index}`:`audio 轨(回退扫全部 ${K} 条,最小号 #${J.track_index})`}——命中口播素材(material_id=${Y})${V} 条 clip`];if(J.skipped.length)$.push(`· 跳过的 video 轨:${J.skipped.map((H)=>`#${H.track_index}(${Eq[H.why]})`).join("、")}`);if(W.length)$.push(`· 各轨命中/总数:${W.map((H)=>`${H.bucket}#${H.track_index} ${H.matched}/${H.clips}`).join(" · ")}`);return{source:J.source,track_index:J.track_index,material_id:Y,total_clips:J.clips.length,matched_clips:V,skipped:J.skipped,tracks:W,text:$.join(`
|
|
47
|
+
`),hint:B5}}function ZJ(Z,Q){let Y=String(Q);return N5(Z).clips.filter((J)=>J.material!=null&&String(J.material)===Y).length}function c0(Z,Q,Y={}){let J=String(Z.material_id),z=N5(Q).clips.filter((K)=>K.material!=null&&String(K.material)===J).map(Lq),X=[];Z.utterances.forEach((K,G)=>{let $=K.words?.length??0,H=[];for(let N of z){let q=[];for(let U of K.words??[]){let F=Math.max(U.st,N.clip_st),M=Math.min(U.ed,N.clip_ed);if(M>F)q.push({w:U.w,track_st:M6(N.track_st+(F-N.clip_st)),track_ed:M6(N.track_st+(M-N.clip_st))})}if(q.length)H.push({track_st:Math.min(...q.map((U)=>U.track_st)),track_ed:Math.max(...q.map((U)=>U.track_ed)),kept_words:q.length,words:q});else if($===0){let U=Math.max(K.st,N.clip_st),F=Math.min(K.ed,N.clip_ed);if(F>U)H.push({track_st:M6(N.track_st+(U-N.clip_st)),track_ed:M6(N.track_st+(F-N.clip_st)),kept_words:0,words:[]})}}if(!H.length)X.push({id:K.id,text:K.text,dropped:!0,sourceIndex:G,instIndex:0,track_st:null,track_ed:null,kept_words:0,total_words:$,words:[],sortKey:0});else H.sort((N,q)=>N.track_st-q.track_st),H.forEach((N,q)=>{X.push({id:K.id,text:K.text,dropped:!1,sourceIndex:G,instIndex:q,track_st:N.track_st,track_ed:N.track_ed,kept_words:N.kept_words,total_words:$,words:N.words,sortKey:N.track_st})})});let W=0;for(let K of X)if(K.dropped)K.sortKey=W;else W=Math.max(W,K.track_ed??W);X.sort((K,G)=>K.sortKey-G.sortKey||K.sourceIndex-G.sourceIndex||K.instIndex-G.instIndex);let V=X.map((K)=>{let G={id:K.id,text:K.text,track_st:K.track_st,track_ed:K.track_ed,dropped:K.dropped,kept_words:K.kept_words,total_words:K.total_words};if(Y.words)G.words=K.words;return G});return{transcript_hash:Z.text_hash,projected_at:Y.projectedAt??new Date().toISOString(),utterances:V}}function F5(Z,Q){let Y=new Map;for(let z of Q)Y.set(z,[]);for(let z of Z.utterances){if(z.dropped||z.track_st==null||z.track_ed==null)continue;if(!Y.has(z.id))Y.set(z.id,[]);Y.get(z.id).push({track_st:z.track_st,track_ed:z.track_ed})}let J=new Map;return Q.forEach((z,X)=>J.set(z,X)),{utteranceIds:Q,byId:Y,idIndex:J}}function R6(Z,Q){let Y=Z.idIndex.get(Q.from),J=Z.idIndex.get(Q.to);if(Y===void 0||J===void 0)return{kind:"unresolved"};let z=Z.utteranceIds.slice(Y,J+1),X=z.flatMap((V)=>Z.byId.get(V)??[]);if(X.length===0)return{kind:"dropped"};let W=z.filter((V)=>(Z.byId.get(V)?.length??0)===0).length;return{kind:"ok",track_st:Math.min(...X.map((V)=>V.track_st)),track_ed:Math.max(...X.map((V)=>V.track_ed)),shrunk:W>0,kept:z.length-W,dropped:W}}function wq(Z){return[j5(Z,"transcript","transcript.json"),j5(Z,"json","transcript.json"),j5(Z,"transcript.json")]}var yq={no_project:"定位不到工程文件(.gtrk)",gtrk_unreadable:"工程文件读不出来(JSON 不可解析)",project_not_v1:"工程不是 v1(重投影不介入,版本门行为不变)",transcript_missing:"找不到 transcript.json",transcript_unreadable:"transcript.json 读不出来或结构异常",no_material_clip:"当刻主轨查不到命中口播素材(material_id)的 clip"},QJ={no_span:"派单条目无 span,且 struct_meta.split 里也定位不到(老档 + 工程账本对不上)",span_unresolved:"span 端点在当刻 transcript 里不存在(transcript 被换过)"};function YJ(Z){return Math.round(Z*1000)/1000}function xq(Z){return Z.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"")||"project"}function kq(Z){let Q=new Map,Y=Z?.struct_meta?.split;for(let J of Y?.beats??[]){let z=J?.span;if(typeof J?.id!=="string"||typeof z?.from!=="string"||typeof z?.to!=="string")continue;Q.set(J.id,{from:z.from,to:z.to})}return Q}function fq(Z,Q,Y){let J=`${Q}-`,z=[...Y];if(Z.startsWith(J)){let W=Z.slice(J.length);if(z.includes(W))return W}let X;for(let W of z){if(!Z.endsWith(`-${W}`))continue;if(X===void 0||W.length>X.length)X=W}return X}function hq(Z){let Q;try{Q=JSON.parse(Z)}catch{return}let Y=Q;if(!Y||!Array.isArray(Y.utterances)||typeof Y.material_id!=="string")return;return Y}function q9(Z,Q,Y){let J=Z.map((z)=>({key:z.key,beat:z.beat,track_st:z.track_st,track_ed:z.track_ed,source:"dispatch_snapshot",drifted:!1,offset:0,shrunk:!1,dropped:!1}));return{summary:{mode:"dispatch_snapshot",degraded:!0,reason:Q,reason_text:yq[Q],projected_at:null,total:Z.length,reprojected:0,drifted:0,max_offset:0,shrunk:[],dropped:[],degraded_entries:[]},entries:J,windows:new Map(J.map((z)=>[z.key,{track_st:z.track_st,track_ed:z.track_ed}])),...Y?{diagnostic:Y}:{}}}async function ZQ(Z){let{baseDir:Q,entries:Y}=Z;if(Z.gtrkUnreadable)return q9(Y,"gtrk_unreadable");if(!Z.gtrk)return q9(Y,"no_project");if(Z.gtrk.version!=="v1")return q9(Y,"project_not_v1");let J=wq(Q).find((O)=>Iq(O));if(!J)return q9(Y,"transcript_missing");let z;try{z=hq(await Sq(J,"utf8"))}catch{z=void 0}if(!z)return q9(Y,"transcript_unreadable");let X=Z.gtrk;if(ZJ(X,z.material_id)===0)return q9(Y,"no_material_clip",H9(X,z.material_id).text);let W=Z.now??new Date().toISOString(),V=c0(z,X,{projectedAt:W}),K=F5(V,z.utterances.map((O)=>O.id)),G=new Map;for(let O of z.utterances){let C=K.byId.get(O.id)??[];if(!C.length)continue;G.set(O.id,{track_st:Math.min(...C.map((T)=>T.track_st)),track_ed:Math.max(...C.map((T)=>T.track_ed)),text:O.text??""})}let $=kq(Z.gtrk),H=xq(vq(Q)),N=[],q=[],U=[],F=[],M=0,R=0,D=0;for(let O of Y){let C=O.span;if(!C){let E=O.compositionId?fq(O.compositionId,H,$.keys()):O.beat;C=E?$.get(E):void 0}if(!C){N.push({key:O.key,beat:O.beat,track_st:O.track_st,track_ed:O.track_ed,source:"dispatch_snapshot",drifted:!1,offset:0,shrunk:!1,dropped:!1,degradeReason:"no_span"}),F.push({beat:O.beat,reason:"no_span",text:QJ.no_span});continue}let T=R6(K,C);if(T.kind==="unresolved"){N.push({key:O.key,beat:O.beat,track_st:O.track_st,track_ed:O.track_ed,source:"dispatch_snapshot",drifted:!1,offset:0,shrunk:!1,dropped:!1,degradeReason:"span_unresolved"}),F.push({beat:O.beat,reason:"span_unresolved",text:QJ.span_unresolved});continue}if(T.kind==="dropped"){D+=1,U.push(O.beat),N.push({key:O.key,beat:O.beat,track_st:O.track_st,track_ed:O.track_ed,source:"reprojected",drifted:!1,offset:0,shrunk:!1,dropped:!0});continue}D+=1;let _=YJ(Math.max(Math.abs(T.track_st-O.track_st),Math.abs(T.track_ed-O.track_ed))),P=_>0;if(P)M+=1,R=Math.max(R,_);if(T.shrunk)q.push(O.beat);N.push({key:O.key,beat:O.beat,track_st:T.track_st,track_ed:T.track_ed,source:"reprojected",drifted:P,offset:_,shrunk:T.shrunk,dropped:!1})}return{summary:{mode:"reprojected",degraded:F.length>0,projected_at:W,total:Y.length,reprojected:D,drifted:M,max_offset:YJ(R),shrunk:q,dropped:U,degraded_entries:F},entries:N,windows:new Map(N.map((O)=>[O.key,{track_st:O.track_st,track_ed:O.track_ed}])),utteranceIndex:G}}function QQ(Z){let Q=Z.summary;if(Q.mode==="dispatch_snapshot"){j.warn(JJ(Q));for(let Y of(Z.diagnostic??"").split(`
|
|
48
|
+
`).filter(Boolean))j.info(Y);j.warn(`正在用**可能已过期**的派单快照时码继续。${bq(Q.reason)}`);return}j.step(`▶ ${JJ(Q)}`);for(let Y of Q.degraded_entries)j.warn(`${Y.beat}:无法重投影(${Y.text}),本条回退派单快照时码`);for(let Y of Q.shrunk)j.warn(`${Y}:span 内有句被剪,已按存活包络收缩(建议人工复核)`);for(let Y of Q.dropped)j.warn(`${Y}:重投影后零存活(整段已被剪出成片),本条跳过——不按快照时码铺回去`)}function D6(Z,Q,Y){let J=Z.struct_meta??{},z=J[Q];if(!z)return Z;return{...Z,struct_meta:{...J,[Q]:{...z,timecode_source:Y.summary.mode==="reprojected"?"reprojected":"dispatch_snapshot",...Y.summary.projected_at?{reprojected_at:Y.summary.projected_at}:{},...Y.summary.reason?{timecode_degrade_reason:Y.summary.reason}:{}}}}}function JJ(Z){if(Z.mode==="dispatch_snapshot")return`重投影降级:按派单快照时码铺 ${Z.total} 个条目(原因:${Z.reason_text??Z.reason})——快照可能已过期`;let Q=[`重投影 ${Z.reprojected} 个 beat`,`漂移 ${Z.drifted} 条`];if(Z.drifted>0)Q.push(`最大偏移 ${Z.max_offset}s`);if(Z.shrunk.length)Q.push(`收缩 ${Z.shrunk.length} 条`);if(Z.dropped.length)Q.push(`整段被剪跳过 ${Z.dropped.length} 条`);if(Z.degraded_entries.length)Q.push(`逐条降级 ${Z.degraded_entries.length} 条`);return Q.join(" · ")}function bq(Z){switch(Z){case"transcript_missing":case"transcript_unreadable":return"复原:把 transcript.json 补回产物目录(transcript/ 或 json/ 下),或用新版 gtrk oralcut 重出产物后重跑本命令。";case"no_project":case"gtrk_unreadable":return"复原:把工程放回 <产物目录>/gtrk/project.gtrk(或用 --project 指到工程所在的产物目录)后重跑本命令。";case"project_not_v1":return"复原:用新链路重产 v1 工程后重跑本命令。";case"no_material_clip":return B5}}var P6=["真人出镜","口播继续","旁白主导"],JQ=["A_ROLL","MG","AI_DRAMA","FILM_BROLL"],O6=["mirror-hook","demolition","container-translation","abyssal-fall","holding","reversal-elevation","callback-closure","typography-emphasis"],L6=["none","seed","expand","translate","rupture","flip","callback"],gq=["必须真人出镜","优先 MG","可被 B-roll 替代","可降级处理"],uq=["quote-card","term-callout","network-diagram","archive-caption","pause-card","data-annotation","timeline-tag","overlay"],zJ=2,mq={RRV_MG:"MG"};function M5(Z){if(typeof Z!=="string")return;if(JQ.includes(Z))return Z;return mq[Z]}function fZ(Z){return typeof Z==="string"&&Z.trim().length>0}function YQ(Z,Q){return typeof Z==="string"&&Q.includes(Z)}function XJ(Z,Q){let Y=[],J=[];if(typeof Z!=="object"||Z===null||Array.isArray(Z))return{errors:["拆分稿必须是一个 JSON 对象"],warnings:J};let z=Z,X=Q.vocab??{narrative:O6,container_stage:L6,base_track:P6},W=X.unknown_narrative==="allow";if(z.contract_version!=="v1")Y.push(`contract_version 必须为 "v1"(实际:${JSON.stringify(z.contract_version)})`);if(!fZ(z.transcript_hash))Y.push("缺 transcript_hash(应从投影视图透传)");else if(z.transcript_hash!==Q.transcriptHash)Y.push(`transcript_hash 不匹配:拆分稿 ${z.transcript_hash} ≠ 当前 transcript ${Q.transcriptHash}——转写已变更,请重新导出视图并重拆`);if(!Array.isArray(z.beats)||z.beats.length===0)return Y.push("beats 必须是非空数组"),{errors:Y,warnings:J};let V=new Map;Q.utteranceIds.forEach((H,N)=>V.set(H,N));let K=[],G=new Set;z.beats.forEach((H,N)=>{let q=(()=>{let D=H?.id;return fZ(D)?D:`beats[${N}]`})();if(typeof H!=="object"||H===null||Array.isArray(H)){Y.push(`${q}:beat 必须是对象`);return}let U=H;if(!fZ(U.id))Y.push(`${q}:缺 id`);else if(!/^B\d{2,}$/.test(U.id))Y.push(`${U.id}:id 须为 "B"+两位起序号(如 B01)`);else if(G.has(U.id))Y.push(`${U.id}:beat id 重复`);else G.add(U.id);if(W){if(!fZ(U.base_track))Y.push(`${q}:缺 base_track`);if(!fZ(U.narrative))Y.push(`${q}:缺 narrative`);if(!fZ(U.container_stage))Y.push(`${q}:缺 container_stage`)}else{if(!YQ(U.base_track,X.base_track))Y.push(`${q}:base_track 非法(栏目词表:${X.base_track.join(" | ")})`);if(!YQ(U.narrative,X.narrative))Y.push(`${q}:narrative 非法(不在栏目词表内)`);if(!YQ(U.container_stage,X.container_stage))Y.push(`${q}:container_stage 非法(不在栏目词表内)`)}if(!M5(U.lane))Y.push(`${q}:lane 非法(四选一:${JQ.join(" | ")})`);if(!YQ(U.irreplaceability,gq))Y.push(`${q}:irreplaceability 非法(四枚举之一)`);if(!fZ(U.rhythm))Y.push(`${q}:缺 rhythm(人读节奏标签)`);if(!fZ(U.visual_task))Y.push(`${q}:缺 visual_task(一句话视觉任务)`);let F=U.span,M=-1,R=-1;if(!F||!fZ(F.from)||!fZ(F.to))Y.push(`${q}:缺 span.from / span.to(utterance id 区间)`);else{if(!V.has(F.from))Y.push(`${q}:span.from 引用了不存在的 utterance id ${F.from}`);else M=V.get(F.from);if(!V.has(F.to))Y.push(`${q}:span.to 引用了不存在的 utterance id ${F.to}`);else R=V.get(F.to);if(M>=0&&R>=0){if(M>R)Y.push(`${q}:区间倒序(span.from ${F.from} 晚于 span.to ${F.to})`);else if(fZ(U.id))K.push({id:U.id,from:M,to:R})}}if(cq(q,U,Y,J),lq(q,U,V,M,R,Q.utteranceTexts,Y,J),U.aux_layers!=null)if(!Array.isArray(U.aux_layers))Y.push(`${q}:aux_layers 必须是数组`);else U.aux_layers.forEach((D,O)=>dq(`${q}.aux[${O}]`,D,V,Y,J))});let $=[...K].sort((H,N)=>H.from-N.from||H.to-N.to);for(let H=1;H<$.length;H++){let N=$[H-1],q=$[H];if(q.from<=N.to)Y.push(`${N.id} 与 ${q.id}:utterance 区间重叠(beats 之间不允许交集)`)}return{errors:Y,warnings:J}}function cq(Z,Q,Y,J){let{lane:z,handoff:X}=Q;if(z==="A_ROLL"){if(X!=null)J.push(`${Z}:A_ROLL 不应带 handoff,已忽略`);return}if(z==="MG"||z==="RRV_MG"){if(!X||typeof X.duration_hint!=="number")Y.push(`${Z}:MG 的 handoff.duration_hint 必填(秒,数值)`);if(X&&X.category!==void 0&&!VJ(X.category))J.push(`${Z}:handoff.category「${String(X.category)}」非已知品类(${WJ.join("/")}),已透传但下游按 opaque 反推`);return}if(z==="FILM_BROLL"){let W=X?.queries;if(!Array.isArray(W)||W.length===0||!W.every((V)=>fZ(V)))Y.push(`${Z}:FILM_BROLL 缺检索 query(handoff.queries 必须为非空字符串数组)`);return}}function lq(Z,Q,Y,J,z,X,W,V){let G=Q.handoff?.anchors;if(G===void 0)return;if(M5(Q.lane)!=="FILM_BROLL"){V.push(`${Z}:handoff.anchors 仅 FILM_BROLL 主层消费(当前 lane=${String(Q.lane)}),已忽略不透传`);return}if(!Array.isArray(G)){W.push(`${Z}:handoff.anchors 必须是数组`);return}if(G.length>zJ)W.push(`${Z}:anchors 至多 ${zJ} 个/beat(得到 ${G.length})——锚过密会把序贯填充区间切碎`);G.forEach(($,H)=>{let N=`${Z}.anchors[${H}]`;if(typeof $!=="object"||$===null||Array.isArray($)){W.push(`${N}:锚必须是对象({keyword, utterance, query})`);return}let q=$;if(!fZ(q.keyword))W.push(`${N}:缺 keyword(关键词原文)`);if(!fZ(q.query))W.push(`${N}:缺 query(锚专属检索词,写视觉描述)`);if(!fZ(q.utterance)){W.push(`${N}:缺 utterance(关键词所在句 id)`);return}let U=Y.get(q.utterance);if(U===void 0){W.push(`${N}:utterance 引用了不存在的 id ${q.utterance}`);return}if(J>=0&&z>=0&&(U<J||U>z))W.push(`${N}:utterance ${q.utterance} 不在该 beat 的 span 区间内`);let F=X?.get(q.utterance);if(fZ(q.keyword)&&typeof F==="string"&&!F.includes(q.keyword))W.push(`${N}:keyword「${q.keyword}」不是句 ${q.utterance} 文本的子串——照原句抄写关键词(勿改写、勿增删标点)`)})}function dq(Z,Q,Y,J,z){if(typeof Q!=="object"||Q===null||Array.isArray(Q)){J.push(`${Z}:辅助层必须是对象`);return}let X=Q;if(!YQ(X.type,uq))J.push(`${Z}:type 非法(八类之一)`);if(!fZ(X.role))J.push(`${Z}:缺 role(职责)`);if(X.type==="overlay"){let V=X.handoff;if(!V||typeof V.duration_hint!=="number"||!(V.duration_hint>0))J.push(`${Z}:overlay aux 缺颗粒时长(handoff.duration_hint 必填且须为正数)`);if(V&&V.category!==void 0&&!VJ(V.category))z.push(`${Z}:handoff.category「${String(V.category)}」非已知品类(${WJ.join("/")}),已透传但下游按 opaque 反推`)}let W=X.mount;if(W==="same_beat")return;if(typeof W==="object"&&W!==null){let V=W;if(fZ(V.trigger)){if(!Y.has(V.trigger))J.push(`${Z}:mount.trigger 引用了不存在的 utterance id ${V.trigger}`);return}if(fZ(V.from)&&fZ(V.to)){if(!Y.has(V.from))J.push(`${Z}:mount.from 引用了不存在的 utterance id ${V.from}`);if(!Y.has(V.to))J.push(`${Z}:mount.to 引用了不存在的 utterance id ${V.to}`);if(Y.has(V.from)&&Y.has(V.to)&&Y.get(V.from)>Y.get(V.to))J.push(`${Z}:mount 区间倒序`);return}}J.push(`${Z}:mount 非法(应为 "same_beat" | {from,to} | {trigger})`)}var WJ=["overlay","fullscreen","subtitle","title"],nq={overlay:!1,fullscreen:!0,subtitle:!1,title:!0,"rrv-overlay":!1,"mg-fullscreen":!0,"explain-subtitle":!1,"op-ed-title":!0};function VJ(Z){return typeof Z==="string"&&Object.prototype.hasOwnProperty.call(nq,Z)}function U9(Z){return Math.round(Z*1000)/1000}function KJ(Z,Q,Y){let J=F5(Q,Y.utteranceIds),z={contract_version:Z.contract_version,transcript_hash:Z.transcript_hash,projected_at:Y.projectedAt,...Y.sourceIndex?{material_id:Y.sourceIndex.materialId}:{},beats:[]},X={mg:[],film_broll:[],ai_drama:[]},W=[],V=[],K=new Set;for(let G of Z.beats){let $=R6(J,G.span);if($.kind!=="ok"){W.push({beat:G.id,reason:"span 内全部 utterance 被剪,未落轨"});continue}let{track_st:H,track_ed:N,shrunk:q}=$,U=M5(G.lane)??G.lane,F={id:G.id,lane:U,span:G.span,track_st:H,track_ed:N};if(Y.sourceIndex){let O=Y.sourceIndex.utterances.get(G.span.from),C=Y.sourceIndex.utterances.get(G.span.to);if(O&&C&&C.ed>O.st)F.source_ranges=[{st:U9(O.st),ed:U9(C.ed)}]}if(q)F.shrunk=!0;if(G.narrative)F.narrative=G.narrative;if(G.container_stage)F.container_stage=G.container_stage;if(G.visual_task)F.visual_task=G.visual_task;if(U==="MG"&&typeof G.handoff?.category==="string")F.category=G.handoff.category;if(U!=="A_ROLL"&&G.handoff)F.handoff=G.handoff;if(z.beats.push(F),q)V.push({beat:G.id,kept:$.kept,dropped:$.dropped,track_st:H,track_ed:N});let M=G.handoff??{},R=`${Y.projectSlug}-${G.id}`;if(U==="MG")X.mg.push({beat:G.id,composition_id:R,duration:U9(N-H),duration_hint:typeof M.duration_hint==="number"?M.duration_hint:null,...M.category!==void 0?{category:M.category}:{},theme:M.theme,bg:M.bg,slug_hint:M.slug_hint,track_st:H,track_ed:N,span:G.span});else if(U==="FILM_BROLL"){let O=Array.isArray(M.anchors)&&M.anchors.length?M.anchors:void 0;X.film_broll.push({beat:G.id,queries:Array.isArray(M.queries)?M.queries:[],shots:M.shots,per_shot_sec:M.per_shot_sec,exclude:M.exclude,...O?{anchors:O}:{},track_st:H,track_ed:N,span:G.span})}else if(U==="AI_DRAMA")X.ai_drama.push({beat:G.id,...M,track_st:H,track_ed:N,span:G.span});else if(U!=="A_ROLL")K.add(U);let D=0;for(let O of G.aux_layers??[]){if(O.type!=="overlay")continue;D+=1;let C=`${G.id}-aux${D}`,T=O.mount,_,P;if(T==="same_beat")_=G.span.from,P=G.span.to;else if("from"in T&&"to"in T)_=T.from,P=T.to;else{W.push({beat:C,reason:"overlay aux 使用 {trigger} 点挂载,一期不支持(二期补合成窗口)"});continue}let E={from:_,to:P},I=R6(J,E);if(I.kind!=="ok"){W.push({beat:C,reason:"overlay aux 源区间 utterance 全被剪,未落轨"});continue}let{track_st:y,track_ed:h}=I,v=`${Y.projectSlug}-${G.id}-aux${D}`,S=O.handoff;X.mg.push({beat:G.id,composition_id:v,duration:U9(h-y),duration_hint:S&&typeof S.duration_hint==="number"?S.duration_hint:null,category:"overlay",theme:S?.theme,bg:S?.bg,slug_hint:S?.slug_hint,track_st:y,track_ed:h,span:E});let k={id:C,lane:"MG",span:E,track_st:y,track_ed:h,category:"overlay"};if(Y.sourceIndex){let c=Y.sourceIndex.utterances.get(_),a=Y.sourceIndex.utterances.get(P);if(c&&a&&a.ed>c.st)k.source_ranges=[{st:U9(c.st),ed:U9(a.ed)}]}z.beats.push(k)}}return{split:z,dispatch:X,skipped:W,shrunk:V,unhandledLanes:[...K]}}function GJ(Z,Q,Y){let J=[],z=new Map(Q.split.beats.map((W)=>[W.id,W])),X=new Set(Q.skipped.map((W)=>W.beat));J.push(`# 视觉拆分稿(${Y.projectSlug})`),J.push(""),J.push(`- contract_version:\`${Z.contract_version}\``),J.push(`- transcript_hash:\`${Z.transcript_hash}\``),J.push(`- projected_at:\`${Y.projectedAt}\``),J.push(`- beats:${Z.beats.length}(落轨 ${Q.split.beats.length} · 跳过 ${Q.skipped.length} · 收缩 ${Q.shrunk.length})`),J.push(""),J.push("# Beat Timeline"),J.push("");for(let W of Z.beats){let V=z.get(W.id);if(J.push(`## ${W.id}${X.has(W.id)?"(整段被剪 · 跳过)":V?.shrunk?"(部分被剪 · 已收缩)":""}`),J.push(`- 文稿范围:\`${W.span.from} … ${W.span.to}\``),J.push(`- 底轨:\`${W.base_track}\``),J.push(`- 主层:\`${W.lane}\``),J.push(`- 叙事功能:\`${W.narrative}\``),J.push(`- 容器阶段:\`${W.container_stage}\``),W.rhythm)J.push(`- 节奏标签:\`${W.rhythm}\``);if(J.push(`- 视觉任务:${W.visual_task}`),J.push(`- 不可替代性:\`${W.irreplaceability}\``),V)J.push(`- 轨道时码:\`${V.track_st}s … ${V.track_ed}s\``);if(W.callback_of)J.push(`- 回扣对象:\`${W.callback_of}\``);for(let K of W.aux_layers??[]){let G=K.mount==="same_beat"?"同 beat":("trigger"in K.mount)?`触发 ${K.mount.trigger}`:`${K.mount.from} … ${K.mount.to}`;J.push(` - 辅助层 \`${K.type}\`(${G}):${K.role}`)}J.push("")}J.push("# Production Queues"),J.push(""),J.push("## A_ROLL Queue");for(let W of Z.beats.filter((V)=>V.lane==="A_ROLL"&&!X.has(V.id)))J.push(`- \`${W.id}\` ${W.visual_task}`);J.push(""),J.push("## MG Queue");for(let W of Q.dispatch.mg){let V=W.duration!=null?` · 坑位 ${W.duration}s`:"",K=W.duration_hint!=null?` · hint ${W.duration_hint}s`:"";J.push(`- \`${W.beat}\` composition_id=\`${W.composition_id}\`${V}${K}`)}J.push(""),J.push("## AI_DRAMA Queue");for(let W of Q.dispatch.ai_drama)J.push(`- \`${W.beat}\` ${W.track_st}s…${W.track_ed}s`);J.push(""),J.push("## FILM_BROLL Queue");for(let W of Q.dispatch.film_broll){let V=W.anchors?.length?` · 锚=[${W.anchors.map((K)=>K.keyword).join(" / ")}]`:"";J.push(`- \`${W.beat}\` queries=[${W.queries.join(" / ")}]${V}`)}return J.push(""),J.join(`
|
|
49
|
+
`)}var oq={meta:{id:"real-roam-guide",name:"实在界漫游指南(内置默认)"},vocab:{narrative:[...O6],container_stage:[...L6],base_track:[...P6]},lanes:{enabled:[...JQ]},fallback:{unknown_narrative:"reject"}};function D5(){return HJ(K9(),"columns")}var R5=(Z)=>[...new Set(Z)];function C6(Z){if(!Array.isArray(Z))return;return Z.filter((Q)=>typeof Q==="string")}function rq(Z){let Q={};for(let Y of Z){if(!Y||typeof Y!=="object"||Array.isArray(Y))continue;if(Y.meta&&typeof Y.meta==="object")Q.meta={...Q.meta,...Y.meta};if(Y.vocab&&typeof Y.vocab==="object"){Q.vocab??={};for(let J of["narrative","container_stage","base_track"]){let z=C6(Y.vocab[J]);if(z)Q.vocab[J]=R5([...Q.vocab[J]??[],...z])}}if(Y.lanes&&typeof Y.lanes==="object"){Q.lanes??={};let J=C6(Y.lanes.enabled);if(J)Q.lanes.enabled=R5([...Q.lanes.enabled??[],...J]);if(Y.lanes.appearance&&typeof Y.lanes.appearance==="object")Q.lanes.appearance=Y.lanes.appearance}if(Y.broll&&typeof Y.broll==="object"){Q.broll??={};let J=C6(Y.broll.column_tag_ids);if(J)Q.broll.column_tag_ids=R5([...Q.broll.column_tag_ids??[],...J]);let z=C6(Y.broll.facet_allowed);if(z)Q.broll.facet_allowed=Q.broll.facet_allowed?Q.broll.facet_allowed.filter((X)=>z.includes(X)):[...z];if(typeof Y.broll.material_class_policy==="string")Q.broll.material_class_policy=Y.broll.material_class_policy;if(Y.broll.facet_defaults&&typeof Y.broll.facet_defaults==="object")Q.broll.facet_defaults=Y.broll.facet_defaults}if(Y.style!==void 0)Q.style=Y.style;if(Y.fallback&&typeof Y.fallback==="object"){let J=Y.fallback.unknown_narrative;if(J==="allow"||J==="reject")Q.fallback={unknown_narrative:J}}}return Q}function aq(Z,Q,Y){let J=HJ(Q,`${Z}.json`);if(!pq(J)){Y.push(`栏目配置不存在:${J},回落内置默认`);return}try{let z=JSON.parse(iq(J,"utf8"));if(typeof z!=="object"||z===null||Array.isArray(z)){Y.push(`栏目配置格式异常(非 JSON 对象):${J},回落内置默认`);return}return z}catch{Y.push(`栏目配置损坏(JSON 解析失败):${J},回落内置默认`);return}}function _6(Z={}){let Q=[],Y=[oq];if(Z.columnId){let z=aq(Z.columnId,Z.columnsDir??D5(),Q);if(z)Y.push(z)}let J=rq(Y);J.style=ZU(J.style,Q);for(let z of JU(J.style))Q.push(z);return{config:J,warnings:Q}}var qJ=JQ,sq={RRV_MG:"MG"};function tq(Z){return sq[Z]??Z}function eq(Z){return qJ.includes(tq(Z))}function $J(Z,Q,Y){if(Z===void 0)return;if(!Array.isArray(Z)){Y.push(`style.${Q} 非数组,已忽略`);return}let J=[];return Z.forEach((z,X)=>{if(typeof z!=="object"||z===null||Array.isArray(z)){Y.push(`style.${Q}[${X}] 非对象,已跳过`);return}let W=z;if(typeof W.id!=="string"||typeof W.ref!=="string"||!W.id||!W.ref){Y.push(`style.${Q}[${X}] 缺 id/ref,已跳过`);return}J.push(z)}),J}function ZU(Z,Q){if(Z===void 0)return;if(typeof Z!=="object"||Z===null||Array.isArray(Z)){Q.push("style 块非对象,已忽略");return}let Y=Z,J={},z=$J(Y.skills,"skills",Q);if(z)J.skills=z;let X=$J(Y.shared,"shared",Q);if(X)J.shared=X;if(typeof Y.bundle_ref==="string")J.bundle_ref=Y.bundle_ref;return J}function QU(Z,Q){let Y=Z.length,J=Q.length;if(Y===0)return J;if(J===0)return Y;let z=Array.from({length:J+1},(X,W)=>W);for(let X=1;X<=Y;X++){let W=[X];for(let V=1;V<=J;V++)W[V]=Math.min(z[V]+1,W[V-1]+1,z[V-1]+(Z[X-1]===Q[V-1]?0:1));z=W}return z[J]}function YU(Z){if(typeof Z.produces==="string")return[Z.produces];if(Array.isArray(Z.produces))return Z.produces.filter((Q)=>typeof Q==="string");return[]}function JU(Z){let Q=[];if(!Z?.skills)return Q;let Y=new Set;for(let J of Z.skills){if(J.routing==="none")continue;for(let z of YU(J)){if(eq(z)||Y.has(z))continue;let X=qJ.find((W)=>W.toLowerCase()===z.toLowerCase()||QU(W.toUpperCase(),z.toUpperCase())<=2);if(X)Y.add(z),Q.push(`style.skills[${J.id}].produces="${z}" 疑似拼写(接近注册类型 "${X}");如确为管线外产物可设 routing:"none"`)}}return Q}function UJ(Z){return{narrative:Z.vocab?.narrative??[...O6],container_stage:Z.vocab?.container_stage??[...L6],base_track:Z.vocab?.base_track??[...P6],unknown_narrative:Z.fallback?.unknown_narrative}}import{spawn as zU,spawnSync as zQ}from"node:child_process";import{existsSync as NJ}from"node:fs";import{join as BJ}from"node:path";var XU=process.platform==="win32",jJ=(Z)=>XU?`${Z}.exe`:Z,WU="未找到 ffmpeg/ffprobe。装它:gtrk deps install --ffmpeg"+`(从同合云镜像拉,自动过 sha256 校验,落 ${r8()};agent 可代办)。
|
|
50
|
+
`+" 也可自行把 ffmpeg/ffprobe 放到该目录,或用 --ffmpeg-path <目录> 指定已装位置。",P5=new Map;function FJ(Z){try{return zQ(Z,["-version"],{stdio:"ignore"}).status===0}catch{return!1}}function b8(Z){let Q=Z??"";if(P5.has(Q))return P5.get(Q)??null;let Y=[];if(Z)Y.push([Z,Z]);Y.push([r8(),"~/.gitruck/ffmpeg"]);let J=null;for(let[z,X]of Y){let W=BJ(z,jJ("ffmpeg")),V=BJ(z,jJ("ffprobe"));if(NJ(W)&&NJ(V)){J={ffmpeg:W,ffprobe:V,source:X};break}}if(!J&&FJ("ffmpeg")&&FJ("ffprobe"))J={ffmpeg:"ffmpeg",ffprobe:"ffprobe",source:"system"};return P5.set(Q,J),J}function AZ(Z){let Q=b8(Z);if(!Q)throw Error(WU);return Q}function N9(Z,Q){let Y=zQ(Z,Q,{encoding:"utf8",maxBuffer:33554432});if(Y.status!==0)throw Error(`ffprobe 失败(code=${Y.status}):${(Y.stderr||"").slice(-300)}`);return JSON.parse(Y.stdout||"{}")}function M8(Z,Q,Y){return new Promise((J,z)=>{let X=zU(Z,Q,{env:process.env}),W="";X.stderr.on("data",(V)=>{let K=V.toString("utf8");if(W=(W+K).slice(-4000),Y){for(let G of K.split(/\r?\n/))if(G)Y(G)}}),X.on("error",(V)=>z(V)),X.on("close",(V)=>{if(V===0)J();else z(Error(`ffmpeg 退出码 ${V}:${W.slice(-600)}`))})})}function T6(Z){let Y=(zQ(Z.ffmpeg,["-version"],{encoding:"utf8"}).stdout||"").split(/\r?\n/)[0]?.trim()||"unknown",J=zQ(Z.ffmpeg,["-hide_banner","-encoders"],{encoding:"utf8",maxBuffer:16777216}),z=zQ(Z.ffmpeg,["-hide_banner","-filters"],{encoding:"utf8",maxBuffer:16777216}),X=new Set;for(let V of(J.stdout||"").split(/\r?\n/)){let K=V.trim().match(/^\S+\s+(\S+)/);if(K)X.add(K[1])}let W=new Set;for(let V of(z.stdout||"").split(/\r?\n/)){let K=V.trim().match(/^\S+\s+(\S+)/);if(K)W.add(K[1])}return{version:Y,encoders:X,filters:W,hasLibx264:X.has("libx264"),hasAac:X.has("aac"),hasAfade:W.has("afade"),hasAresample:W.has("aresample")}}import{readFileSync as VU}from"node:fs";import{join as KU}from"node:path";var GU="https://registry.npmjs.org/@gitruck%2Fcli";function O0(){try{let{version:Z}=JSON.parse(VU(KU(o8(),"package.json"),"utf8"));return Z}catch{return"0.0.0"}}async function A6(Z=5000){try{let Q=await fetch(GU,{headers:{accept:"application/vnd.npm.install-v1+json"},signal:AbortSignal.timeout(Z)});if(!Q.ok)return null;return(await Q.json())["dist-tags"]?.latest??null}catch{return null}}function XQ(Z,Q){let Y=(X)=>X.replace(/^v/,"").split("-")[0].split(".").map((W)=>parseInt(W,10)||0),J=Y(Z),z=Y(Q);for(let X=0;X<3;X++){let W=(J[X]??0)-(z[X]??0);if(W!==0)return W>0?1:-1}return 0}function MJ(Z){Z.command("doctor").description("体检:配置 / 云端连通 / 剪映目录 / 运行时是否就绪").action(async()=>{await I6()})}var HU={ok:"✅",warn:"⚠️ ",fail:"❌"};async function I6(){let Z=[],Q=A6(5000).catch(()=>null),Y=process.versions.bun;Z.push({name:"运行时",status:"ok",detail:Y?`bun ${Y}`:`node ${process.version}`});let J=TZ(),z=(process.env.GITRUCK_API_KEY??J.apiKey??"").trim(),X=(process.env.GITRUCK_API_BASE??J.apiBase??M0).trim().replace(/\/+$/,"");Z.push({name:"API Key",status:z?"ok":"fail",detail:z?`已配(${z.slice(0,6)}…,来源 ${process.env.GITRUCK_API_KEY?"环境变量":"gtrk init"})`:"未配 —— 跑 gtrk init"}),Z.push({name:"API 根地址",status:"ok",detail:X});let W="warn",V="跳过(未配 Key)";if(z)try{let M=await fetch(`${X}/user/get_user_info`,{method:"POST",headers:{accept:"application/json",Authorization:z},body:"",signal:AbortSignal.timeout(8000)}),R=await M.json().catch(()=>({}));if(R.code===200)W="ok",V="可达,鉴权通过";else W="fail",V=`可达,但鉴权失败(code=${R.code??M.status}${R.msg?`,${R.msg}`:""})—— 检查 API Key`}catch(M){W="fail",V=`连不上:${M instanceof Error?M.message:String(M)}`}Z.push({name:"云端连通 + 鉴权",status:W,detail:V});let K=R0(void 0),G=!!K&&E6(K);Z.push({name:"剪映草稿目录",status:G?"ok":"warn",detail:G?K:"未配/未探到 —— 要剪映直开就跑 gtrk init 或加 --jianying-draft-dir"}),Z.push({name:"配置文件",status:E6(F8())?"ok":"warn",detail:E6(F8())?F8():`未生成 —— 跑 gtrk init(${F8()})`});let $=J.defaultColumn,H=$?$U(D5(),`${$}.json`):void 0;Z.push({name:"当前栏目",status:"ok",detail:$?`${$}${H&&E6(H)?`(${H})`:`(⚠ 配置文件缺失:${H},将回落内置默认)`}`:"内置默认 —— 想建自己栏目的风格体系,跑 /gtrk-style-maker(不建也能直接用默认)"});let N=b8();if(N){let M=!1,R="";try{let D=T6(N);M=D.hasLibx264,R=D.version.replace(/^ffmpeg version\s*/i,"v")}catch{}Z.push({name:"本地渲染 (ffmpeg)",status:M?"ok":"warn",detail:M?`就绪(来源 ${N.source}${R?`,${R.split(/\s/)[0]}`:""})`:`找到 ffmpeg(${N.source})但缺 libx264 —— 本地渲染需换含 libx264 的构建`})}else Z.push({name:"本地渲染 (ffmpeg)",status:"warn",detail:"未找到 —— 只出工程文件可忽略;要本地渲染成片,让 agent 装 ffmpeg/ffprobe 到 ~/.gitruck/ffmpeg 或 --ffmpeg-path"});let q=O0(),U=await Q;Z.splice(1,0,{name:"CLI 版本",status:U&&XQ(U,q)>0?"warn":"ok",detail:U&&XQ(U,q)>0?`v${q} —— 有新版 v${U},跑 gtrk upgrade 升级`:U?`v${q}(已是最新)`:`v${q}`}),console.log(`
|
|
51
51
|
gtrk 体检:
|
|
52
|
-
`);for(let
|
|
52
|
+
`);for(let M of Z)console.log(` ${HU[M.status]} ${M.name}:${M.detail}`);let F=Z.some((M)=>M.status==="fail");if(console.log(F?`
|
|
53
53
|
有项不通,按提示处理后再开剪。
|
|
54
54
|
`:`
|
|
55
55
|
一切就绪,可以开剪。
|
|
56
|
-
`),
|
|
57
|
-
Content-Disposition: form-data; name="file"; filename="${
|
|
56
|
+
`),F)process.exitCode=1;return!F}var UU=qU(o8(),"assets","jianying-draft-path.png");function LJ(Z){Z.command("init").description("一次性配置:API Key + 剪映草稿目录(之后所有命令免重复配置)").option("--api-key <key>","非交互:直接指定 API Key").option("--api-base <url>","非交互:指定 API 根地址(缺省用默认生产地址)").option("--jianying-draft-dir <dir>","非交互:剪映草稿目录(传 auto 则自动探测)").option("--reconfigure","重走配置向导(默认:已配过则跳过、保留现有配置)").option("-y, --yes","非交互:用传入值 + 自动探测,不弹任何提示").action(O5)}async function O5(Z){if(Z.yes||Z.apiKey)return NU(Z);if(!process.stdin.isTTY){j.err("交互式 init 需要真实终端;脚本/agent 请用:gtrk init --api-key <KEY> -y"),process.exitCode=1;return}let Q=TZ(),Y=!!Q.apiKey;if(j.step("▶ gtrk 安装配置"),Y&&!Z.reconfigure){if(j.info(`检测到已有配置:API Key ${DJ(Q.apiKey)}|根地址 ${Q.apiBase??M0}|剪映目录 ${Q.jianyingDraftDir??"未配"}`),await $9("保留现有配置、跳过重填?(要改配置选 N)",!0))return j.info("已保留现有配置(要改配置随时跑 gtrk init --reconfigure)。"),PJ();j.info("好,重新配置——各项可直接回车沿用现有值。")}let J=Q.apiKey??"",z=J?`粘贴新的 API Key,或直接回车沿用现有(${DJ(J)}):`:"粘贴同合云 API Key(Ctrl+V 粘贴):";for(;;){let K=(await tY(z)).trim();if(K){J=K;break}if(J)break;j.warn("API Key 不能为空,再来一次")}let X=(await U5("云端 API 根地址(回车用默认):",{defaultValue:Q.apiBase??M0})).trim(),W;if(Q.jianyingDraftDir&&RJ(Q.jianyingDraftDir)){if(await $9(`剪映草稿目录现为 ${Q.jianyingDraftDir},保留吗?`,!0))W=Q.jianyingDraftDir}if(!W){let K=B6();if(K&&await $9(`自动找到剪映草稿目录:${K},用它吗?`,!0))W=K}if(!W){j.info("没自动找到(或你选了手动)。已打开一张指引图:剪映 → 全局设置 → 草稿 →「草稿位置」,把那一行路径复制过来;留空则跳过(剪映只产 draft_content.json、缺 meta、需手动导入)。"),aY(UU);let K=(await U5("剪映草稿根目录(…\\com.lveditor.draft),留空跳过:")).trim();if(K)if(RJ(K))W=OJ(K);else j.warn(`目录不存在,已跳过:${K}`)}let V={apiKey:J,apiBase:X};if(W)V.jianyingDraftDir=W;if(m0(V),j.ok(`配置已写入 ${F8()}`),q8(),!W)j.warn("未配剪映草稿目录:要剪映直接打开,之后可重跑 gtrk init,或单次加 --jianying-draft-dir");return PJ()}function DJ(Z){return`${Z.slice(0,6)}…`}async function PJ(){if(await I6()){j.step("装好了!两种用法任选:");for(let Q of $5)j.info(Q);j.info("想有自己栏目的风格体系?在 agent 里跑 /gtrk-style-maker 建一次「你的厨房」(skill 家族 + 栏目配置);不建就直接用默认,照常开剪。")}else j.warn("上面体检有项没通,按提示处理好再开剪(多半是 API Key 或剪映目录)。")}async function NU(Z){let Q=TZ(),Y=(Z.apiKey??Q.apiKey??"").trim();if(!Y){j.err("非交互模式需要 --api-key(或改用交互式 gtrk init)"),process.exitCode=1;return}let J=(Z.apiBase??Q.apiBase??M0).trim(),z,X=Z.jianyingDraftDir;if(X&&X!=="auto")z=OJ(X);else if(X==="auto"||!Q.jianyingDraftDir)z=B6();else z=Q.jianyingDraftDir;let W={apiKey:Y,apiBase:J};if(z)W.jianyingDraftDir=z;m0(W),j.ok(`配置已写入 ${F8()}`),q8(),j.info(`剪映草稿目录:${z??"未配(剪映需手动导入,可加 --jianying-draft-dir)"}`),await I6()}function CJ(Z){Z.command("install").description("一条命令装全:安装 /gtrk-oralcut skill + 配置(对标飞书 lark-cli install)").option("--api-key <key>","非交互:直接指定 API Key").option("--api-base <url>","非交互:指定 API 根地址").option("--jianying-draft-dir <dir>","非交互:剪映草稿目录(传 auto 则自动探测)").option("--skills-dir <dir>","自定义单个 skills 目录(优先于 Agent 自动检测)").option("--skill-agents <list>","skills CLI Agent ID,逗号分隔,如 codex,cursor,trae-cn").option("--all-agents","把 skill 安装到上游和 gtrk 已登记的全部 Agent").option("--copy-skills","每个 Agent 各复制一份(默认统一存储 + symlink/junction)").option("--reconfigure","重走配置向导(默认:已配过则保留现有配置、只刷新 skill)").option("-y, --yes","非交互:用传入值 + 自动探测,不弹任何提示").action(async(Q)=>{if(j.step("① 安装 / 刷新 agent skill…"),!G5({dir:Q.skillsDir,agents:Q.skillAgents,all:Q.allAgents,copy:Q.copySkills}))process.exitCode=1;j.step("② 配置 + 体检…"),await O5(Q)})}import{resolve as t5,join as e5,dirname as hz,basename as p6,extname as FB}from"node:path";import{mkdir as MB,writeFile as RB,readFile as DB}from"node:fs/promises";import{existsSync as bz}from"node:fs";function jZ(){let Z=TZ(),Q=(process.env.GITRUCK_API_KEY??Z.apiKey??"").trim(),Y=(process.env.GITRUCK_API_BASE??Z.apiBase??M0).trim().replace(/\/+$/,"");if(!Q)throw Error("缺 API Key —— 先跑 `gtrk init` 配置(或设环境变量 GITRUCK_API_KEY)");return{base:Y,apiKey:Q}}import{basename as _J}from"node:path";import{writeFile as BU,stat as jU}from"node:fs/promises";import{createReadStream as FU}from"node:fs";import{Readable as TJ}from"node:stream";import{randomBytes as MU}from"node:crypto";class OZ extends Error{code;constructor(Z,Q){super(Q);this.code=Z;this.name="CloudError"}}function L0(Z){let Q=Z&&typeof Z==="object"?Z.code:void 0;return typeof Q==="number"?Q:void 0}async function tZ(Z){try{return await Z.json()}catch{throw Error(`服务响应解析失败 (HTTP ${Z.status})`)}}function RU(){let Z=globalThis.Bun;return Z?Z.file.bind(Z):void 0}async function AJ(Z,Q,Y={}){let J=Y.fetchFn??fetch,z=Y.bunFile??RU(),X=Y.runtime?Y.runtime==="bun":z!=null,W;if(X){if(!z)throw Error("Bun 上传运行时缺少 Bun.file");let G=new FormData;G.append("file",z(Q),_J(Q)),W=await J(`${Z.base}/base/file/upload`,{method:"POST",headers:{Authorization:Z.apiKey},body:G})}else{let G=(await jU(Q)).size,$=`----gtrkFormBoundary${MU(16).toString("hex")}`,H=Buffer.from(`--${$}\r
|
|
57
|
+
Content-Disposition: form-data; name="file"; filename="${_J(Q)}"\r
|
|
58
58
|
Content-Type: application/octet-stream\r
|
|
59
59
|
\r
|
|
60
60
|
`,"utf8"),N=Buffer.from(`\r
|
|
61
61
|
--${$}--\r
|
|
62
|
-
`,"utf8");async function*U(){yield H;for await(let q of $U(Q))yield q;yield N}V=await J(`${Z.base}/base/file/upload`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":`multipart/form-data; boundary=${$}`,"Content-Length":String(H.length+G+N.length)},body:PJ.toWeb(PJ.from(U())),duplex:"half"})}let W=await aZ(V),K=W.data?.file_id??W.data?.id;if(W.code===200&&K)return String(K);throw new PZ(W.code,`上传失败 (code=${W.code??"?"}):${W.msg??"未知错误"}`)}async function J8(Z,Q,Y){let J=await fetch(`${Z.base}/task/${Q}`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Y)}),z=await aZ(J);if(z.code===200&&z.data?.task_id)return String(z.data.task_id);throw new PZ(z.code,`提交失败 (code=${z.code??"?"}):${z.msg??"未知错误"}`)}async function T8(Z,Q,Y){let J=await fetch(`${Z.base}/task/${Q}/${Y}`,{headers:{Authorization:Z.apiKey}}),z=await aZ(J);if(z.code!=null&&z.code!==200)throw new PZ(z.code,`任务查询失败 (code=${z.code}):${z.msg??""}`);let X=z.data??{};return{status:String(X.status??""),progress:typeof X.progress==="number"?X.progress:void 0,output:X.output_result??{}}}async function N9(Z,Q,Y,J){let z=Date.now(),X=1800000,V=5000;for(;;){if(Date.now()-z>1800000)throw Error("任务超时(超过 30 分钟)。可稍后在云端查任务或重试。");await new Promise((K)=>setTimeout(K,5000));let W;try{W=await T8(Z,Q,Y)}catch(K){if(K instanceof PZ)throw K;continue}if(W.status==="completed")return W.output;if(W.status==="failed"||W.status==="cancelled"){let K=W.output;throw Error(K?.error??(W.status==="failed"?"任务失败":"任务已取消"))}J?.(W.status||"处理中",W.progress)}}async function h8(Z,Q){let Y=await fetch(Z);if(!Y.ok)throw Error(`下载失败 HTTP ${Y.status}:${Z}`);let J=Buffer.from(await Y.arrayBuffer());await KU(Q,J)}async function CJ(Z){let Q=Z?.asr_result_download_url;if(typeof Q!=="string"||!Q.trim())return Z??{};let Y=await fetch(Q);if(!Y.ok)throw Error(`下载全量转写 JSON 失败 HTTP ${Y.status}:${Q}`);let J=await Y.json();if(!J||typeof J!=="object"||Array.isArray(J))throw Error("全量转写 JSON 形态异常(应为对象)");return J}import{readFile as cU}from"node:fs/promises";import{dirname as lU,isAbsolute as fJ,relative as dU,resolve as x5}from"node:path";import{deflateSync as UU}from"node:zlib";var u0="000000",B9="ex-solid-",NU="assets/builtin",_J=8192,BU=Buffer.from([137,80,78,71,13,10,26,10]),jU=(()=>{let Z=new Uint32Array(256);for(let Q=0;Q<256;Q++){let Y=Q;for(let J=0;J<8;J++)Y=Y&1?3988292384^Y>>>1:Y>>>1;Z[Q]=Y>>>0}return Z})();function FU(Z){let Q=4294967295;for(let Y=0;Y<Z.length;Y++)Q=(jU[(Q^Z[Y])&255]^Q>>>8)>>>0;return(Q^4294967295)>>>0}function M5(Z,Q){let Y=Buffer.alloc(4);Y.writeUInt32BE(Q.length,0);let J=Buffer.concat([Buffer.from(Z,"ascii"),Q]),z=Buffer.alloc(4);return z.writeUInt32BE(FU(J),0),Buffer.concat([Y,J,z])}function R5(Z){let Q=Z.replace(/^#/,"").toLowerCase();return/^[0-9a-f]{6}$/.test(Q)?Q:null}function D5({hex:Z,width:Q,height:Y}){let J=R5(Z);if(!J)throw Error(`非法纯色 hex:${Z}`);return`${B9}${J}-${Q}x${Y}`}function JQ({hex:Z,width:Q,height:Y}){let J=R5(Z);if(!J)throw Error(`非法纯色 hex:${Z}`);return`${NU}/solid-${J}-${Q}x${Y}.png`}function L6(Z){if(!Array.isArray(Z)||Z.length!==2)return!1;return Z.every((Q)=>typeof Q==="number"&&Number.isInteger(Q)&&Q>0&&Q<=_J)}function TJ({hex:Z,width:Q,height:Y}){let J=R5(Z);if(!J)throw Error(`非法纯色 hex:${Z}`);if(!L6([Q,Y]))throw Error(`纯色画布尺寸非法或超上限(${Q}x${Y},上限 ${_J})`);let z=Number.parseInt(J.slice(0,2),16),X=Number.parseInt(J.slice(2,4),16),V=Number.parseInt(J.slice(4,6),16),W=Buffer.alloc(13);W.writeUInt32BE(Q,0),W.writeUInt32BE(Y,4),W[8]=8,W[9]=2,W[10]=0,W[11]=0,W[12]=0;let K=1+Q*3,G=Buffer.alloc(K);G[0]=0;for(let H=0;H<Q;H++){let N=1+H*3;G[N]=z,G[N+1]=X,G[N+2]=V}let $=Buffer.alloc(K*Y);for(let H=0;H<Y;H++)G.copy($,H*K);return Buffer.concat([BU,M5("IHDR",W),M5("IDAT",UU($,{level:9})),M5("IEND",Buffer.alloc(0))])}var _5="assets/broll-preview",T5="assets/broll-cover",r8="broll-",vJ="broll-raw-",P0="broll-local-";function L0(Z){return`${r8}${Z}`}var A5=12,P5=3,q8=1.2,AJ=1,T6=0.2,MU=0.5,RU=32,zQ=0.7,C6=0.1,DU=0.75,OU=1.25;function PU(Z){let Q=Z.eps??C6,Y=[];for(let V of Z.beats)for(let W of V.slots)Y.push(W.track_st,W.track_ed);Y.sort((V,W)=>V-W);let J=new Set,z=0,X=0;for(let V of Z.starts){let W=Math.round(V*1000);if(J.has(W))continue;if(!Z.beats.some((H)=>V>=H.track_st-Q&&V<H.track_ed-Q))continue;J.add(W),z++;let K=0,G=Y.length;while(K<G){let H=K+G>>1;if(Y[H]<V)K=H+1;else G=H}if(Math.min(K<Y.length?Math.abs(Y[K]-V):Number.POSITIVE_INFINITY,K>0?Math.abs(Y[K-1]-V):Number.POSITIVE_INFINITY)<=Q)X++}return{starts_total:z,aligned:X,ratio:z>0?Math.round(X/z*1000)/1000:0}}var LU=2,CU=0.05,_U=0.03,TU=0.02,O5=["local","concept","common"],L5=(Z)=>Z==="local"||Z==="concept"||Z==="common";function AU(Z,Q,Y){if(Y==="material")return Z.clip_id;if(Z.kind==="image")return Z.clip_id;if(Z.source==="local"||typeof Z.local_path==="string")return`${Z.clip_id}@${Q.start}`;return Z.clip_id}var F9=0.001;function E5(Z){let Q=Z.filter((J)=>Number.isFinite(J.track_st)&&Number.isFinite(J.track_ed)&&J.track_ed>J.track_st).sort((J,z)=>J.track_st-z.track_st),Y=[];for(let J of Q){let z=Y[Y.length-1];if(z&&J.track_st-z.track_ed<=F9){if(J.track_ed>z.track_ed)z.track_ed=J.track_ed;continue}Y.push({track_st:J.track_st,track_ed:J.track_ed})}return Y.map((J)=>({track_st:$Z(J.track_st),track_ed:$Z(J.track_ed)}))}var EU=3,IU=0.15;function EJ(Z){let Q=[];for(let Y of Z.beats){if(!(Y.track_ed-Y.track_st>F9))continue;let J=E5(Y.slots.map((V)=>({track_st:Math.max(Y.track_st,V.track_st),track_ed:Math.min(Y.track_ed,V.track_ed)}))),z=(V,W)=>{let K=$Z(V),G=$Z(W);if(G-K>F9)Q.push({beat:Y.beat,track_st:K,track_ed:G,sec:$Z(G-K)})},X=Y.track_st;for(let V of J)if(z(X,V.track_st),V.track_ed>X)X=V.track_ed;z(X,Y.track_ed)}return Q.sort((Y,J)=>Y.track_st-J.track_st||Y.track_ed-J.track_ed),{holes:Q,totalSec:$Z(Q.reduce((Y,J)=>Y+J.sec,0))}}function j9(Z){let Q=[];for(let Y of Z.queries)for(let J of Y.results??[])Q.push(J);return Q.sort((Y,J)=>J.score-Y.score)}function wJ(Z){let Q=Z.preview_url;if(typeof Q==="string"&&Q)return Q;let Y=Z.cover_url;if(typeof Y==="string"){let J=Y.replace(/\/keyframe\/([^/]+)\/cover\.jpg.*$/,"/preview/$1.mp4");if(J!==Y)return J}return null}function SU(Z,Q){if(!Z||!Q||Z<=0||Q<=0)return;if(Z<=640)return[Z,Q];return[640,Math.max(2,Math.round(Q*640/Z/2)*2)]}var $Z=(Z)=>Math.round(Z*1000)/1000,m0=(Z)=>Z.cand.kind==="image";function I5(Z,Q,Y={}){let J=Y.dedupScope??"scene",z=typeof Y.markWeight==="number"&&Y.markWeight>0?Math.min(1,Y.markWeight):0,X=typeof Y.highlightWeight==="number"&&Y.highlightWeight>0?Math.min(1,Y.highlightWeight):0,V=Math.max(0,Math.min(X,1-z)),W=[];for(let K of Z.queries){let G=[];for(let $ of K.results??[]){let H=$.pinned===!0;if(!H&&$.excluded_hint)continue;if(Y.noImage&&$.kind==="image")continue;let N=$.segments?.length?$.segments:[{start:0,end:$.duration??P5,best:($.duration??P5)/2,score:$.score}];for(let U of N){if(!H&&U.score<Q)continue;let q=U.score;if(z>0||V>0){let O=Math.round(U.best*1000),P=z>0?Y.markLookup?.($.clip_id,O):void 0,D=V>0?Y.highlightLookup?.($.clip_id,O):void 0,T=typeof P==="number"&&Number.isFinite(P),_=typeof D==="number"&&Number.isFinite(D),L=T?z:0,I=_?V:0;if(q=U.score*(1-L-I)+(T?Math.min(100,Math.max(0,P))/100*L:0)+(_?Math.min(100,Math.max(0,D))/100*I:0),z>0)if(T)Y.markStats?.hit.add($.clip_id);else Y.markStats?.neutral.add($.clip_id);if(V>0)if(_)Y.markStats?.hlHit.add($.clip_id);else Y.markStats?.hlNeutral.add($.clip_id)}let M=U.motion?.p50,F=typeof M==="number"&&Number.isFinite(M)&&M>CU,R=$.describe?.usable_flags?.blurry===!0;G.push({cand:$,seg:U,query:K.query,key:AU($,U,J),pinned:H,fused:q,hot:F,blurry:R,rank:q-(F?TU:0)-(R?_U:0)})}}if(G.sort(($,H)=>Number(H.pinned)-Number($.pinned)||H.rank-$.rank||H.fused-$.fused||H.seg.score-$.seg.score||Number(m0($))-Number(m0(H))),G.length)W.push({query:K.query,pool:G})}return W}function S5(Z,Q){if(m0(Z))return{clipSt:0,clipEd:Q};let Y=Z.seg.start,J=Math.max(Y,Z.seg.end-Q),z=Math.min(Math.max(Z.seg.best-Q/2,Y),J);return{clipSt:z,clipEd:Math.min(z+Q,Z.seg.end)}}function _6(Z,Q,Y){if(m0(Z))return Q;let J=0.000001,{clipSt:z,clipEd:X}=Q,V=!1,W=!1,K=Z.seg.cuts;if(Array.isArray(K)&&K.length){let $=K.filter((H)=>Number.isFinite(H)&&H>z+J&&H<X-J);if($.length){let H=$[0];if(H-z<AJ)z=H,V=!0;let N=$[$.length-1];if(N>z+J&&X-N<AJ)X=N,W=!0}}let G=Z.cand.fps;if(typeof G==="number"&&Number.isFinite(G)&&G>0){let $=V?Math.ceil(z*G-J)/G:Math.round(z*G)/G,H=Math.min(Math.max($,Z.seg.start),X),N=Math.min(W?Math.floor(X*G+J)/G:Math.round(X*G)/G,Z.seg.end);if(N-H>Y+J)N=H+Math.floor((Y+J)*G)/G;if(N-H>J)z=H,X=N}if(X-z>Y+J)X=z+Y;if(X-z<q8)return null;return{clipSt:z,clipEd:X}}function M9(Z){if(m0(Z))return Number.POSITIVE_INFINITY;return Math.max(0,Z.seg.end-Z.seg.start)}function vU(Z){let Q=2166136261;for(let Y=0;Y<Z.length;Y++)Q^=Z.charCodeAt(Y),Q=Math.imul(Q,16777619);return Q>>>0}function wU(Z){let Q=Z>>>0;return()=>{Q=Q+1831565813>>>0;let Y=Q;return Y=Math.imul(Y^Y>>>15,Y|1),Y^=Y+Math.imul(Y^Y>>>7,Y|61),((Y^Y>>>14)>>>0)/4294967296}}function yU(Z,Q){let Y=typeof Z.requested_shots==="number"&&Z.requested_shots>0?Z.requested_shots:void 0,J=typeof Z.per_shot_sec==="number"&&Z.per_shot_sec>0?Z.per_shot_sec:Y?Math.min(Math.max(Q/Y,1.5),6):void 0;if(J===void 0)return[2,4];let z=Math.max(1.5,J*0.8),X=Math.max(z+0.5,Math.min(8,J*1.6));return[z,X]}function C5(Z){let{beat:Q,trackOrder:Y,consumed:J,scoreFloor:z}=Z,X=Q.track_ed-Q.track_st;if(!(X>0))return[];let[V,W]=yU(Q,X),K=wU(vU(`${Q.beat}#${Y}`)),G=Z.cutAlign&&Z.cutAlign.ratio>0&&Z.cutAlign.starts.length?Z.cutAlign:void 0;if(G&&G.starts.some((R)=>Math.abs(R-Q.track_st)<=C6))G.state.chances++,G.state.snapped++;let $=I5(Q,z,{noImage:Z.noImage,dedupScope:Z.dedupScope,markWeight:Z.markWeight,markLookup:Z.markLookup,highlightWeight:Z.highlightWeight,highlightLookup:Z.highlightLookup,markStats:Z.markStats});if(!$.length)return[];let H=[],N=Q.track_st,U=null,q=null,M=0;for(let R=0;R<RU;R++){let O=Q.track_ed-N;if(O<q8)break;let P;if(O<=W)P=O;else if(O<W+V)P=O/2;else P=V+K()*(W-V);let D,T=P;if(G){let g=N+Math.max(q8,V*DU),k=N+Math.min(W*OU,O),l,e=Number.POSITIVE_INFINITY;for(let WZ of G.starts){if(WZ<g-0.000001)continue;if(WZ>k+0.000001)break;let vZ=Q.track_ed-WZ;if(vZ>0.000001&&vZ<q8)continue;let LZ=Math.abs(WZ-(N+P));if(LZ<e)l=WZ,e=LZ}if(l!==void 0){if(G.state.chances++,G.state.snapped/G.state.chances<G.ratio-0.000000001)G.state.snapped++,D=l,P=l-N}}let _=Math.min(q8,O),L=(g)=>Math.min(P,M9(g),O),I=(g)=>{if(J.has(g.key)||M9(g)<_)return!1;let k=Z.beatOwners?.get(g.cand.clip_id);return k===void 0||k===Y},E=(g)=>_6(g,S5(g,L(g)),O),y=(g,k)=>{if(!U||R-U.slotIdx>=2)return!1;if(g.cand.clip_id!==U.clipId)return!1;return Math.abs(k.clipSt-U.clipEd)<LU},f=(g)=>{for(let k=0;k<$.length;k++){let{pool:l}=$[(R+k)%$.length];for(let e of l){if(!I(e))continue;let WZ=E(e);if(!WZ||y(e,WZ))continue;if(g&&D!==void 0&&WZ.clipEd-WZ.clipSt<D-N-C6)continue;return{p:e,win:WZ}}}return null},S=null,w=null,x=f(D!==void 0);if(!x&&D!==void 0&&G)G.state.snapped--,D=void 0,P=T,x=f(!1);if(x)S=x.p,w=x.win;let m=!1;if(!S){for(let g=0;g<$.length&&!S;g++){let{pool:k}=$[(R+g)%$.length];for(let l of k){if(!I(l))continue;let e=E(l);if(!e){m=!0;continue}S=l,w=e;break}}if(S&&Z.stats)Z.stats.adjacentWaived++}if(!S||!w){if(Z.stats){if(Z.stats.emptySlots++,m)Z.stats.emptySlotsByRefine++}if(M++,M>=2)break;N+=Math.min(P,O);continue}M=0;let r=w,c=r.clipEd-r.clipSt;if(G&&D!==void 0&&Math.abs(N+c-D)>C6)G.state.snapped--;if(H.push({clip_id:S.cand.clip_id,query:S.query,score:S.seg.score,clip_st:$Z(r.clipSt),clip_ed:$Z(r.clipEd),track_st:$Z(N),track_ed:$Z(N+c)}),S.pinned&&Z.stats)Z.stats.pinnedPlaced++;if(S.hot&&Z.stats)Z.stats.hotSlotsPlaced++;if(S.blurry&&Z.stats)Z.stats.blurrySlotsPlaced++;J.add(S.key),Z.beatOwners?.set(S.cand.clip_id,Y),U={slotIdx:R,clipId:S.cand.clip_id,clipEd:r.clipEd},q=S,N+=c}let F=H[H.length-1];if(F&&q){let R=Q.track_ed-F.track_ed;if(R>0.000001&&R<q8){let O=m0(q)?Number.POSITIVE_INFINITY:q.seg.end,P=Math.min(R,Math.max(0,O-F.clip_ed));if(P>0.000001){let D=Q.track_ed-F.track_st,T=_6(q,{clipSt:F.clip_st,clipEd:F.clip_ed+P},D);if(T&&T.clipEd>F.clip_ed+0.000001){let _=T.clipEd-F.clip_ed;F.clip_ed=$Z(T.clipEd),F.track_ed=$Z(F.track_ed+_)}}}}return H}function xU(Z,Q){let Y=Z.queries.find((J)=>J.query===Q);if(!Y)return`锚 query「${Q}」在 plan 内无检索记录(该 query 被编辑删除或检索未跑)——重跑 gtrk matrix 可恢复`;if(Y.error)return`锚 query「${Q}」检索失败(${Y.error.msg})`;if(!Y.results?.length)return Z.queries.some((z)=>z!==Y&&(z.results??[]).some((X)=>X.also_matched_queries?.includes(Q)))?`锚 query「${Q}」的命中被 beat 内去重折进同 beat 其他 query(旧版 plan 形态)——重跑 gtrk matrix 生成新 plan 即恢复`:`锚 query「${Q}」检索零命中`;return`锚 query「${Q}」无 ≥score 地板的命中`}function kU(Z){let{beat:Q}=Z,Y=Array.isArray(Q.anchors)?Q.anchors:[];if(!Y.length)return{slots:C5(Z),anchors:[]};let J=[],z=[],X=Q.track_ed-Q.track_st,V=(F,R)=>{J.push({beat:Q.beat,keyword:F.keyword,at_sec:F.at_sec??null,track_st:null,clip_id:null,status:"degraded",reason:R})};if(!(X>0)){for(let F of Y)V({keyword:F.keyword,at_sec:F.at_sec??null},"beat 窗口无长度");return{slots:[],anchors:J}}let W=I5(Q,Z.scoreFloor,{noImage:Z.noImage,dedupScope:Z.dedupScope,markWeight:Z.markWeight,markLookup:Z.markLookup,highlightWeight:Z.highlightWeight,highlightLookup:Z.highlightLookup,markStats:Z.markStats}),K=new Map(W.map((F)=>[F.query,F.pool])),$=(typeof Q.per_shot_sec==="number"&&Q.per_shot_sec>0?Q.per_shot_sec:P5)*2,H=Y.map((F,R)=>({a:F,i:R})).sort((F,R)=>(F.a.at_sec??Number.POSITIVE_INFINITY)-(R.a.at_sec??Number.POSITIVE_INFINITY)||F.i-R.i),N=Q.track_st;for(let{a:F}of H){if(typeof F.at_sec!=="number"||!Number.isFinite(F.at_sec)){V(F,"at_sec 缺失(plan 内插失败:文本漂移/句被剪/重投影降级)");continue}let R=Math.max(Q.track_st,F.at_sec-MU);R=Math.min(R,Q.track_ed-q8),R=Math.max(R,Q.track_st,N);let O=Q.track_ed-R;if(O<q8-0.000001){V(F,"锚点窗口不足(与前锚重叠或过近 beat 末端)");continue}let P=K.get(F.query);if(!P?.length){V(F,xU(Q,F.query));continue}let D=null,T=null;for(let L of P){if(Z.consumed.has(L.key))continue;if(M9(L)<Math.min(q8,O))continue;let I=Z.beatOwners?.get(L.cand.clip_id);if(I!==void 0&&I!==Z.trackOrder)continue;let E=_6(L,S5(L,Math.min($,M9(L),O)),O);if(!E)continue;D=L,T=E;break}if(!D||!T){V(F,`锚 query「${F.query}」候选耗尽或精修后不足最小槽长`);continue}let _=T.clipEd-T.clipSt;if(z.push({clip_id:D.cand.clip_id,query:F.query,score:D.seg.score,clip_st:$Z(T.clipSt),clip_ed:$Z(T.clipEd),track_st:$Z(R),track_ed:$Z(R+_)}),Z.consumed.add(D.key),Z.beatOwners?.set(D.cand.clip_id,Z.trackOrder),D.pinned&&Z.stats)Z.stats.pinnedPlaced++;if(D.hot&&Z.stats)Z.stats.hotSlotsPlaced++;if(D.blurry&&Z.stats)Z.stats.blurrySlotsPlaced++;N=R+_,J.push({beat:Q.beat,keyword:F.keyword,at_sec:F.at_sec,track_st:$Z(R),clip_id:D.cand.clip_id,status:D.pinned?"pinned":"planned"})}let U=[],q=Q.track_st;for(let F of[...z].sort((R,O)=>R.track_st-O.track_st)){if(F.track_st-q>=q8)U.push({st:q,ed:F.track_st});q=Math.max(q,F.track_ed)}if(Q.track_ed-q>=q8)U.push({st:q,ed:Q.track_ed});let M=[...z];return U.forEach((F,R)=>{let O={...Q,beat:`${Q.beat}~a${R}`,track_st:F.st,track_ed:F.ed};M.push(...C5({...Z,beat:O}))}),M.sort((F,R)=>F.track_st-R.track_st),{slots:M,anchors:J}}function fU(Z,Q){let Y=[...Q].sort((X,V)=>X.track_st-V.track_st),J=[],z=Z.track_st;for(let X of Y){if(X.track_st-z>F9)J.push({st:z,ed:X.track_st});z=Math.max(z,X.track_ed)}if(Z.track_ed-z>F9)J.push({st:z,ed:Z.track_ed});return J}function hU(Z){let{beat:Q,slots:Y}=Z,J=F9,z,X=()=>{if(!z)z=I5(Q,0,{noImage:Z.noImage,dedupScope:Z.dedupScope}).flatMap((W)=>W.pool).filter((W)=>!m0(W)).sort((W,K)=>K.rank-W.rank||K.fused-W.fused||K.seg.score-W.seg.score);return z},V=(W)=>{for(let K of Q.queries)for(let G of K.results??[]){if(G.clip_id!==W.clip_id||G.kind==="image")continue;for(let $ of G.segments??[])if($.start<=W.clip_st+0.000001&&W.clip_ed<=$.end+0.000001)return{lo:$.start,hi:$.end,...typeof G.duration==="number"?{dur:G.duration}:{}};if(!G.segments?.length)return{lo:0,hi:G.duration??W.clip_ed,...typeof G.duration==="number"?{dur:G.duration}:{}}}return};for(let W of fU(Q,Y)){let K=W.st;while(W.ed-K>=q8-J){let $=!1;for(let H of X()){if(Z.consumed.has(H.key))continue;let N=W.ed-K;if(M9(H)<Math.min(q8,N))continue;let U=Z.beatOwners.get(H.cand.clip_id);if(U!==void 0&&U!==0)continue;let q=_6(H,S5(H,Math.min(N,M9(H))),N);if(!q)continue;let M=q.clipEd-q.clipSt,F={clip_id:H.cand.clip_id,query:H.query,score:H.seg.score,clip_st:$Z(q.clipSt),clip_ed:$Z(q.clipEd),track_st:$Z(K),track_ed:$Z(K+M),gap_fill:!0};Y.push(F),Z.consumed.add(H.key),Z.beatOwners.set(H.cand.clip_id,0),Z.entries.push({beat:Q.beat,kind:"candidate",clip_id:H.cand.clip_id,track_st:F.track_st,track_ed:F.track_ed,sec:$Z(M)}),K+=M,$=!0;break}if(!$)break}let G=0.05;if(W.ed-K>J){let $=Y.find((H)=>Math.abs(H.track_ed-K)<=J);if($&&$.material_id===void 0){let H=V($);if(H){let N=W.ed-K,U=N<=G?Math.min(H.hi+N,H.dur??H.hi+N):H.hi,q=Math.min(N,Math.max(0,U-$.clip_ed));if(q>J)$.clip_ed=$Z($.clip_ed+q),$.track_ed=$Z($.track_ed+q),Z.entries.push({beat:Q.beat,kind:"extend",clip_id:$.clip_id,track_st:$Z(K),track_ed:$Z(K+q),sec:$Z(q)}),K=$.track_ed}}}if(W.ed-K>J){let $=Y.find((H)=>Math.abs(H.track_st-W.ed)<=J);if($&&$.material_id===void 0){let H=V($);if(H){let N=W.ed-K,U=N<=G?Math.max(0,H.lo-N):H.lo,q=Math.min(N,Math.max(0,$.clip_st-U));if(q>J)$.clip_st=$Z($.clip_st-q),$.track_st=$Z($.track_st-q),Z.entries.push({beat:Q.beat,kind:"extend",clip_id:$.clip_id,track_st:$.track_st,track_ed:$Z(W.ed),sec:$Z(q)})}}}}Y.sort((W,K)=>W.track_st-K.track_st)}function v5(Z,Q,Y,J={}){let z=new Map,X=new Set,V=new Set,W={emptySlots:0,emptySlotsByRefine:0,hotSlotsPlaced:0,blurrySlotsPlaced:0,adjacentWaived:0,pinnedPlaced:0,pinnedYielded:0},K={hit:new Set,neutral:new Set,hlHit:new Set,hlNeutral:new Set},G=[],$=J.cutAlign&&J.cutAlign.ratio>0&&J.cutAlign.starts.length>0?J.cutAlign:void 0,H=$?.ratio??0;if($&&!$.calibrated&&$.ratio<1){let D=v5(Z,Q,Y,{...J,cutAlign:{ratio:1,starts:$.starts,calibrated:!0}}).cutAlign?.ratio??0;H=D>0?Math.min(1,$.ratio/D):1}let N=new Map,U=(P)=>{if(!$)return;let D=N.get(P);if(!D)D={chances:0,snapped:0},N.set(P,D);return{ratio:H,starts:$.starts,state:D}},q=new Map;for(let P of Z.beats){let D=[],T=new Map;q.set(P.beat,T);for(let _=0;_<Math.max(0,Q);_++){let L={beat:P,trackOrder:_,consumed:V,scoreFloor:Y,noImage:J.noImage,dedupScope:J.dedupScope,markWeight:J.markWeight,markLookup:J.markLookup,highlightWeight:J.highlightWeight,highlightLookup:J.highlightLookup,markStats:K,beatOwners:T,stats:W,cutAlign:U(_)},I;if(_===0&&Array.isArray(P.anchors)&&P.anchors.length){let E=kU(L);I=E.slots,G.push(...E.anchors)}else I=C5(L);D.push(I);for(let E of I)X.add(E.clip_id)}z.set(P.beat,D)}let M=new Set;for(let P of Z.beats)for(let D of P.queries)for(let T of D.results??[])if(T.pinned===!0)M.add(T.clip_id);let F;if(J.gapFill==="fast"&&Math.max(0,Q)>0){F=[];for(let P of Z.beats){let D=z.get(P.beat)?.[0];if(!D)continue;hU({beat:P,slots:D,consumed:V,beatOwners:q.get(P.beat),noImage:J.noImage,dedupScope:J.dedupScope,entries:F});for(let T of D)X.add(T.clip_id)}}let R=[...M].filter((P)=>!X.has(P));W.pinnedYielded=R.length;let O;if($){let P=PU({beats:Z.beats.map((D)=>({track_st:D.track_st,track_ed:D.track_ed,slots:z.get(D.beat)?.[0]??[]})),starts:$.starts});O={target:$.ratio,...P}}return{fills:z,clipIds:X,stats:W,pinnedOutcome:{requested:[...M],yielded:R},markStats:{hit:K.hit.size,neutral:K.neutral.size,hlHit:K.hlHit.size,hlNeutral:K.hlNeutral.size},anchors:G,...O?{cutAlign:O}:{},...F?{gapFills:F}:{}}}function w5(Z){return Z.some((Q)=>{let Y=Array.isArray(Q.track_timeline)?Q.track_timeline:[];return Y.length>0&&Y.some((J)=>{let z=typeof J?.material==="string"?J.material:"";return!(z.startsWith(r8)||z.startsWith(B9))})})}var IJ=(Z)=>`${Z.kind==="black"?"黑底轨":"候选轨"}#${Z.trackIndex}=${Z.clipCount} clip`;function bU(Z){if(!Z||typeof Z!=="object")return[];let Q=Z,Y=Array.isArray(Q.beats)?Q.beats:[],J=Q.track_layers&&typeof Q.track_layers==="object"?Q.track_layers:{},z=[],X=new Map;for(let V of Y)for(let W of Array.isArray(V?.laid)?V.laid:[]){let{track_index:K,slots:G}=W;if(typeof K!=="number"||!Array.isArray(G)||G.length===0)continue;let $=X.get(K)??{count:0};$.count+=G.length;let H=W.source_layer;if(!$.layer&&L5(H))$.layer=H;X.set(K,$)}for(let[V,W]of[...X.entries()].sort((K,G)=>K[0]-G[0])){let K=J[String(V)],G=W.layer??(L5(K)?K:void 0);z.push({kind:"candidate",trackIndex:V,clipCount:W.count,...G?{layer:G}:{}})}if(typeof Q.black_track==="number"){let V=Y.filter((K)=>Array.isArray(K?.laid)&&K.laid.length>0).map((K)=>({track_st:Number(K.track_st),track_ed:Number(K.track_ed)})),W=E5(V).length;if(W>0)z.push({kind:"black",trackIndex:Q.black_track,clipCount:W})}return z}function gU(Z,Q,Y){let J=null,z=Number.POSITIVE_INFINITY;for(let X of Z){if(X.clipCount!==Q)continue;let V=Y===null?0:Math.abs(X.trackIndex-Y);if(V<z||V===z&&J!==null&&X.trackIndex<J.trackIndex)J=X,z=V}return J}function SJ(Z,Q,Y={}){let J=Array.isArray(Z.track_timeline)?Z.track_timeline:[],z=typeof Z.track_index==="number"?Z.track_index:null,X=J.map((U)=>typeof U?.material==="string"?U.material:""),V=X.filter((U)=>U.startsWith(vJ)).length,W=X.filter((U)=>!(U.startsWith(r8)||U.startsWith(B9))).length,K={trackIndex:z,clipCount:J.length,rawClips:V,foreignClips:W,samples:[...new Set(X.filter(Boolean))].slice(0,2),matched:null},G=Y.registered??Q.length>0;if(J.length===0)return{...K,cls:"user",reason:"空轨(track_timeline 为空)"};if(!G)return{...K,cls:"user",reason:"盘上无 struct_meta.broll 登记(或上轮一条都没铺成):宁留勿删"};if(V>0)return{...K,cls:"self-produced-edited",reason:`${V}/${J.length} 个 clip 的 material 已是 broll-raw-*(你在客户端确认过原片)`};if(W>0)return{...K,cls:"user",reason:`${W}/${J.length} 个 clip 的 material 非自产前缀(用户轨 / 混合轨)`};let $=Y.matched!==void 0?Y.matched:gU(Q,J.length,z);if($)return{...K,matched:$,cls:"self-produced",reason:`与登记吻合(${IJ($)})`};let H=new Set(Y.layTracks??[]).has(z??Number.NaN),N=Q.length?Q.map(IJ).join("、"):"(登记里一条自产轨都没有)";if(H)return{...K,cls:"self-produced-edited",reason:`clip 数 ${J.length} 与登记的自产轨条数都对不上(登记:${N}),而该 track_index 在 lay_tracks 在册`};return{...K,cls:"user",reason:`clip 数 ${J.length} 对不上任何登记指纹(登记:${N})且 track_index 不在 lay_tracks 在册:按用户轨保留`}}function uU(Z,Q,Y=[]){let J=Q.length>0,z=Z.map((W,K)=>({i:K,idx:typeof W.track_index==="number"?W.track_index:null,v:SJ(W,[],{registered:!0,matched:null})})).filter((W)=>W.v.clipCount>0&&W.v.rawClips===0&&W.v.foreignClips===0),X=new Map,V=new Set;for(let W of Q){let K=-1,G=Number.POSITIVE_INFINITY,$=Number.POSITIVE_INFINITY;for(let H of z){if(V.has(H.i)||H.v.clipCount!==W.clipCount)continue;let N=H.idx??Number.MAX_SAFE_INTEGER,U=Math.abs(N-W.trackIndex);if(U<G||U===G&&N<$)K=H.i,G=U,$=N}if(K>=0)V.add(K),X.set(K,W)}return Z.map((W,K)=>SJ(W,Q,{layTracks:Y,registered:J,matched:X.get(K)??null}))}function mU(Z,Q){if(Q)return Q;let Y=(Array.isArray(Z.track_timeline)?Z.track_timeline:[]).map((J)=>typeof J?.material==="string"?J.material:"");if(Y.length&&Y.every((J)=>J.startsWith(P0)))return"local";return}function yJ(Z){let Q=[...Z.video_track??[]],Y=(Z.struct_meta??{}).broll,J=new Set(Array.isArray(Y?.lay_tracks)?Y.lay_tracks.filter((W)=>typeof W==="number"):[]),z=uU(Q,bU(Y),J),X=Q.filter((W,K)=>z[K].cls==="self-produced-edited"),V=X.map((W)=>typeof W.track_index==="number"?W.track_index:-1).filter((W)=>W>=0);return{videoTracks:Q,verdicts:z,prevBroll:Y,prevIndices:J,editedTracks:X,keptEditedTracks:V}}function xJ(Z,Q){let Y=[];for(let J of Z){if(J.cls!=="self-produced-edited")continue;let z=J.samples.length?`,material 样例 ${J.samples.join(" / ")}`:"";Y.push(`候选轨 track_index=${J.trackIndex} 判定为「已被你编辑」:${J.reason}(该轨 ${J.clipCount} clip${z})。`+(Q?"已按 --force-relay 强制剥离重铺。":"本次不剥它、也不铺新轨——在客户端处置该轨后重跑,或加 --force-relay 强剥重铺。"))}return Y}function kJ(Z,Q=!1){let{verdicts:Y,editedTracks:J,keptEditedTracks:z}=yJ(Z);return{refused:J.length>0&&!Q,keptEditedTracks:z,warnings:xJ(Y,Q)}}function y5(Z){let{gtrk:Q,plan:Y,lay:J,fills:z,downloads:X}=Z,V=Z.blackBed!==!1,W=Z.forceRelay===!0,K=Z.sourceLayer??(Y.member_type==="local"?"local":"common"),G=[],$=[...Q.materials??[]],H={...Q.struct_meta??{}},{videoTracks:N,verdicts:U,prevBroll:q,prevIndices:M,editedTracks:F,keptEditedTracks:R}=yJ(Q),O=[],P=[],D=[],T=[];for(let b=0;b<N.length;b++){let n=N[b],p=U[b];if(p.cls==="self-produced-edited"){if(W)O.push(n);else P.push(n);continue}if(p.cls!=="self-produced"){P.push(n);continue}if(p.matched?.kind==="black"){O.push(n);continue}let KZ=mU(n,p.matched?.layer);if(KZ===K)O.push(n);else if(KZ!==void 0)D.push({track:n,layer:KZ,oldIndex:typeof n.track_index==="number"?n.track_index:0});else{if(P.push(n),typeof n.track_index==="number")T.push(n.track_index);G.push(`存量自产轨 track_index=${n.track_index} 无 source_layer 层登记、也无法从材料前缀推断层归属:`+"按过渡期保守口径保留不剥(本轮新轨照常追加)。要重铺它请在客户端删除该轨后重跑,或先跑一轮对应层的铺轨重建登记。")}}let _=[...P,...D.map((b)=>b.track)];if(G.push(...xJ(U,W)),F.length>0&&!W){let b=0;for(let n of Y.beats)if(j9(n).length>0)b++;return G.push("本次未铺任何轨、工程文件零改动(.gtrk 未写回、struct_meta.broll 未刷新);"+"broll-plan.json 与已落盘的 preview 代理照常产出/复用。"),{next:Q,summary:{sourceLayer:K,laidTracks:[],laidClips:0,beatsWithCandidates:b,blackTrack:null,removedTracks:[],keptEditedTracks:R,refused:!0,blackBedSkipped:null,blackBedHoleSec:0,blackBedHoles:[]},broll:q??{contract_version:"v1",generated_at:Z.generatedAt,plan_path:Z.planPath,lay_tracks:[],black_track:null,holes:[],confirmed:!1,beats:[]},warnings:G}}let L=new Set;for(let b of O)for(let n of b.track_timeline??[]){let p=n.material;if(typeof p==="string"&&(p.startsWith(r8)||p.startsWith(B9)))L.add(p)}let I=new Set;for(let b of[_,Q.beat_track??[],Q.audio_track??[]])for(let n of b)for(let p of n.track_timeline??[])if(typeof p.material==="string")I.add(p.material);for(let b of I)L.delete(b);let E=$.filter((b)=>!(typeof b.id==="string"&&L.has(b.id)));if(W){let b=[...L].filter((n)=>n.startsWith(vJ)).length;if(b>0)G.push(`--force-relay:本次强制剥离将删除 ${b} 条 broll-raw-* 素材登记,`+"gtrk/assets/broll/ 下对应的已下载原片文件会就地成孤儿(CLI 不删字节,但工程里再无引用)。")}for(let b of _){let n=b.track_timeline??[];if(!n.length)continue;if(n.every((p)=>typeof p.material==="string"&&p.material.startsWith(B9)))G.push(`检测到疑似手工纯色底轨(track_index=${b.track_index}):与自动黑底垫轨功能重复。建议删除该轨后重跑,或用 --no-black-bed 保留手工轨。`)}let y=Array.isArray(Q.video_size)?Q.video_size:[1920,1080],f=P.reduce((b,n)=>Math.max(b,typeof n.track_index==="number"?n.track_index:0),-1)+1,S=w5(P),w=V&&S?1:0,x={local:0,concept:0,common:0};for(let b of D)x[b.layer]++;let m={},r=f+w;for(let b of[...O5].reverse())m[b]=r,r+=b===K?Math.max(0,J):x[b];let c=new Map,g=[];for(let b of O5){if(b===K)continue;D.filter((p)=>p.layer===b).sort((p,KZ)=>p.oldIndex-KZ.oldIndex).forEach((p,KZ)=>{let zZ=m[b]+KZ;c.set(p.oldIndex,{newIndex:zZ,layer:b}),g.push(p.oldIndex===zZ?p.track:{...p.track,track_index:zZ})})}let k=new Map;for(let b of Y.beats)for(let n of j9(b))if(!k.has(n.clip_id))k.set(n.clip_id,n);let l=Z.gapFill&&Z.gapFill.mode!=="none"?Z.gapFill:void 0,e=m[K],WZ=O5.some((b)=>b!==K&&x[b]>0&&m[b]<e),vZ=l!==void 0&&!S&&P.length===0&&!WZ&&Math.max(0,J)>0,LZ=[],RZ=!1,cZ=[],bZ=new Map,iZ=new Map,wZ=0,DZ=0;for(let b of Y.beats){let n=j9(b);if(n.length>0)DZ++;let p=z.get(b.beat)??[],KZ=[];for(let a=0;a<p.length;a++){let YZ=p[a].filter((UZ)=>(!UZ.gap_fill||vZ)&&(X.has(UZ.clip_id)||UZ.material_id!==void 0&&Z.injectedMaterials?.has(UZ.material_id)));if(!YZ.length)continue;let MZ=m[K]+a,Y8=iZ.get(MZ)??[];YZ.forEach((UZ,Q9)=>{let G8=UZ.material_id??L0(UZ.clip_id);if(!bZ.has(G8)){let lZ=UZ.material_id!==void 0?Z.injectedMaterials?.get(UZ.material_id):void 0;if(lZ)bZ.set(G8,{...lZ});else{let gZ=k.get(UZ.clip_id),W0=X.get(UZ.clip_id),$8={id:G8,path:W0.rel};if(typeof gZ?.duration==="number")$8.duration=gZ.duration;if(W0.source==="local"){if(gZ?.width&&gZ?.height)$8.video_size=[gZ.width,gZ.height]}else{let f0=SU(gZ?.width,gZ?.height);if(f0)$8.video_size=f0}if(typeof gZ?.fps==="number")$8.video_rate=gZ.fps;bZ.set(G8,$8)}}Y8.push({clip_id:`${b.beat}-broll-${a}-${Q9}`,material:G8,clip_st:UZ.clip_st,clip_ed:UZ.clip_ed,track_st:UZ.track_st,track_ed:UZ.track_ed,duration:$Z(UZ.track_ed-UZ.track_st)}),wZ++}),iZ.set(MZ,Y8),KZ.push({order:a,clip_id:YZ[0].clip_id,track_index:MZ,slots:YZ,source_layer:K})}if(vZ){let a=KZ.find((MZ)=>MZ.order===0),{holes:YZ}=EJ({beats:[{beat:b.beat,track_st:b.track_st,track_ed:b.track_ed,slots:a?.slots??[]}]});if(YZ.length)if(!L6([y[0],y[1]])){if(!RZ)RZ=!0,G.push(`画布尺寸非法(${y[0]}x${y[1]}),主轨 gap 黑片兜底跳过——主轨仍有 gap,客户端若开主轨磁吸请注意与配音错位的风险。`)}else{let MZ=y[0],Y8=y[1],UZ=D5({hex:u0,width:MZ,height:Y8});if(!bZ.has(UZ))bZ.set(UZ,{id:UZ,path:JQ({hex:u0,width:MZ,height:Y8}),video_size:[MZ,Y8]});let Q9=iZ.get(e)??[],G8=a;if(!G8)G8={order:0,clip_id:UZ,track_index:e,slots:[],source_layer:K},KZ.push(G8),KZ.sort((lZ,gZ)=>lZ.order-gZ.order);YZ.forEach((lZ,gZ)=>{let W0=$Z(lZ.track_ed-lZ.track_st);Q9.push({clip_id:`${b.beat}-gapfill-${gZ}`,material:UZ,clip_st:0,clip_ed:W0,track_st:lZ.track_st,track_ed:lZ.track_ed,duration:W0}),G8.slots.push({clip_id:UZ,query:"gap_fill",score:0,clip_st:0,clip_ed:W0,track_st:lZ.track_st,track_ed:lZ.track_ed,gap_fill:!0}),LZ.push({beat:b.beat,kind:"solid",track_st:lZ.track_st,track_ed:lZ.track_ed,sec:lZ.sec}),wZ++}),iZ.set(e,Q9),G8.slots.sort((lZ,gZ)=>lZ.track_st-gZ.track_st)}}let zZ={beat:b.beat,track_st:b.track_st,track_ed:b.track_ed,candidates:n.slice(0,A5).map((a)=>{let YZ=X.get(a.clip_id),MZ=a.segments?.[0],Y8=a.source==="local"||typeof a.local_path==="string",UZ={clip_id:a.clip_id,score:a.score,cover_url:a.cover_url??null,preview_path:Y8?null:YZ?.rel??null,source:YZ?.source??(Y8?"local":null),raw_url:a.url??null,seg:MZ?{start:MZ.start,end:MZ.end,best:MZ.best}:null,source_layer:K};if(Y8){if(typeof a.local_path==="string")UZ.local_path=a.local_path;if(UZ.cover_path=Z.covers?.get(a.clip_id)??null,a.kind==="image"&&typeof a.local_path==="string")UZ.source_image_path=a.local_path}return UZ}),laid:KZ,pinned:null};if(typeof b.per_shot_sec==="number")zZ.per_shot_sec=b.per_shot_sec;cZ.push(zZ)}let y8;if(vZ&&l){let n=[...l.planned.filter((p)=>p.clip_id!==void 0&&X.has(p.clip_id)),...LZ].sort((p,KZ)=>p.track_st-KZ.track_st||p.track_ed-KZ.track_ed);y8={mode:l.mode,filledSec:$Z(n.reduce((p,KZ)=>p+KZ.sec,0)),fills:n}}let L8=[...iZ.entries()].filter(([,b])=>b.length>0).sort((b,n)=>b[0]-n[0]).map(([b,n])=>({track_index:b,track_size:[y[0],y[1]],muted:!0,track_timeline:n.sort((p,KZ)=>p.track_st-KZ.track_st)}));{let b=new Map;for(let[n,p]of c)b.set(n,p);for(let n of T)if(!b.has(n))b.set(n,{newIndex:n});if(q&&b.size>0){let n=new Map(cZ.map((p)=>[p.beat,p]));for(let p of Array.isArray(q.beats)?q.beats:[]){if(!p||typeof p!=="object")continue;let KZ=(Array.isArray(p.laid)?p.laid:[]).filter((YZ)=>typeof YZ?.track_index==="number"&&b.has(YZ.track_index)).map((YZ)=>{let MZ=b.get(YZ.track_index);return{...YZ,track_index:MZ.newIndex,...MZ.layer?{source_layer:MZ.layer}:{}}}),zZ=(Array.isArray(p.candidates)?p.candidates:[]).filter((YZ)=>L5(YZ?.source_layer)&&YZ.source_layer!==K);if(!KZ.length&&!zZ.length)continue;let a=n.get(p.beat);if(a){a.laid.push(...KZ);for(let YZ of zZ)if(!a.candidates.some((MZ)=>MZ.clip_id===YZ.clip_id&&MZ.source_layer===YZ.source_layer))a.candidates.push(YZ)}else{let YZ={...p,candidates:zZ,laid:KZ};cZ.push(YZ),n.set(YZ.beat,YZ)}}}}let X0=L8.length>0||g.length>0||T.length>0,GZ=V&&!S&&X0?"audio_driven":null,CZ=null,x8=null;if(V&&S&&X0)if(!L6([y[0],y[1]]))G.push(`画布尺寸非法(${y[0]}x${y[1]}),跳过铺纯黑底轨(候选轨照常铺)。`);else{let b=cZ.filter((p)=>p.laid.length>0).map((p)=>({track_st:p.track_st,track_ed:p.track_ed})),n=E5(b);if(n.length>0){let p=y[0],KZ=y[1],zZ=D5({hex:u0,width:p,height:KZ});bZ.set(zZ,{id:zZ,path:JQ({hex:u0,width:p,height:KZ}),video_size:[p,KZ]}),CZ=f,x8={track_index:CZ,track_size:[p,KZ],muted:!0,track_timeline:n.map((a,YZ)=>({clip_id:`blackbed-${YZ}`,material:zZ,clip_st:0,clip_ed:$Z(a.track_ed-a.track_st),track_st:a.track_st,track_ed:a.track_ed,duration:$Z(a.track_ed-a.track_st)}))}}}if(V&&S&&X0&&CZ===null)G.push("异常:本轮有 B-roll 内容轨在场、也没有 --no-black-bed,却没能铺出纯黑底垫轨 —— "+"这些 B-roll 段落底下会直接露出口播 A-roll。请回报此告警(含本轮命令行)以便定位。");let m8=[],K8=0;if(CZ!==null){let b=cZ.filter((zZ)=>zZ.laid.length>0).map((zZ)=>({beat:zZ.beat,track_st:zZ.track_st,track_ed:zZ.track_ed,slots:zZ.laid.flatMap((a)=>a.slots)}));({holes:m8,totalSec:K8}=EJ({beats:b}));let n=new Map(b.map((zZ)=>[zZ.beat,zZ.track_ed-zZ.track_st])),p=new Map;for(let zZ of m8){let a=p.get(zZ.beat);if(!a)p.set(zZ.beat,{sec:zZ.sec,longest:zZ});else if(a.sec=$Z(a.sec+zZ.sec),zZ.sec>a.longest.sec)a.longest=zZ}let KZ=[...p.entries()].filter(([zZ,a])=>{let YZ=n.get(zZ)??0;return a.longest.sec>=EU||YZ>0&&a.sec/YZ>=IU});if(KZ.length>0){let zZ=KZ.map(([a,YZ])=>{let MZ=n.get(a)??0,Y8=MZ>0?Math.round(YZ.sec/MZ*100):0;return`${a} 纯黑 ${YZ.sec}s / 占 ${Y8}%(最长一段 ${YZ.longest.sec}s @ ${YZ.longest.track_st}–${YZ.longest.track_ed})`}).join(";");G.push(`黑底空洞:${KZ.length} 个 beat 的黑底之上没有任何 B-roll,这几段现在是纯黑压住口播——${zZ};`+`全片累计纯黑 ${K8}s。铺轨已照常完成(黑底按 beat 包络整条铺,槽位没填满处就是纯黑,属粗剪期预期内);`+"想调整可:调低 --score-floor 放宽取材、或改用 --no-black-bed 让这些地方露出主轨口播、或到客户端手动往这几段补片。")}}let k8=L8.map((b)=>b.track_index),e0=[...k8,...g.map((b)=>b.track_index),...T].sort((b,n)=>b-n),k0={};for(let b of k8)k0[String(b)]=K;for(let[,b]of c)if(b.layer)k0[String(b.newIndex)]=b.layer;let Z9={contract_version:"v1",generated_at:Z.generatedAt,plan_path:Z.planPath,lay_tracks:(CZ===null?e0:[...e0,CZ]).slice().sort((b,n)=>b-n),track_layers:k0,black_track:CZ,holes:m8.map((b)=>({track_st:b.track_st,track_ed:b.track_ed})),confirmed:!1,beats:cZ},i=new Map;for(let b of E)if(typeof b.id==="string")i.set(b.id,b);else i.set(`__anon_${i.size}`,b);for(let[b,n]of bZ)i.set(b,n);let t=[...g,...L8].sort((b,n)=>b.track_index-n.track_index);return{next:{...Q,materials:[...i.values()],video_track:[...P,...t,...x8?[x8]:[]],struct_meta:{...H,broll:Z9}},summary:{sourceLayer:K,laidTracks:k8,laidClips:wZ,beatsWithCandidates:DZ,blackTrack:CZ,removedTracks:O.map((b)=>typeof b.track_index==="number"?b.track_index:-1).filter((b)=>b>=0).sort((b,n)=>b-n),keptEditedTracks:W?[]:R,refused:!1,blackBedSkipped:GZ,blackBedHoleSec:K8,blackBedHoles:m8,...y8?{gapFill:y8}:{}},broll:Z9,warnings:G}}var hJ="local_broll_cloud_render_rejected";class bJ extends Error{violations;code=hJ;constructor(Z){let Q=Z.slice(0,3).map((Y)=>`${Y.materialId}${Y.path?`(${Y.path})`:""}`).join("、");super(`工程含本地 B-roll 素材(${Z.length} 条,如 ${Q}),已拒绝云端提交`+`(code=${hJ})——`+"本地素材本体不上云是硬承诺,不会静默上传归一化为 file_id。"+"本地 B-roll 工程请走客户端本地出片(或 gtrk render 本地渲染)。");this.violations=Z;this.name="CloudSubmitGuardError"}}function nU(Z,Q){let Y=[],J=Array.isArray(Z.materials)?Z.materials:[];for(let z of J){let X=typeof z.id==="string"?z.id:"";if(!X.startsWith(r8))continue;let V=typeof z.path==="string"?z.path:null;if(X.startsWith(P0)){Y.push({materialId:X,path:V,reason:"broll_local_prefix"});continue}if(V&&fJ(V)){if(!Q){Y.push({materialId:X,path:V,reason:"external_absolute_path"});continue}let W=dU(x5(Q),x5(V));if(W===""||W.startsWith("..")||fJ(W))Y.push({materialId:X,path:V,reason:"external_absolute_path"})}}return Y}function pU(Z,Q){let Y=nU(Z,Q);if(Y.length)throw new bJ(Y)}async function gJ(Z){let Q;try{let Y=JSON.parse(await cU(Z,"utf8"));if(typeof Y!=="object"||Y===null||Array.isArray(Y))return;Q=Y}catch{return}pU(Q,lU(x5(Z)))}import{join as rJ}from"node:path";import{stat as aJ,mkdir as sJ,readFile as tJ,writeFile as eJ}from"node:fs/promises";import{existsSync as Zz}from"node:fs";var f5=Z6(E6(),1);import{open as nJ,stat as iU}from"node:fs/promises";import{basename as oU}from"node:path";var pJ=268435456,rU=3,mJ=3,cJ=[2000,4000,8000],aU=2,sU=1,h5=6024,tU=6025,eU=6026,ZN=6027,k5=8192,QN=67108864;async function YN(Z){try{let Q=await f5.createBLAKE3();Q.init();let Y=await nJ(Z,"r");try{let J=Buffer.alloc(k5),z=0,X=0;for(;;){let{bytesRead:V}=await Y.read(J,0,k5,X);if(V===0)break;if(z+=k5,z>=QN)break;Q.update(J.subarray(0,V)),X+=V}return Q.digest("hex")}finally{await Y.close()}}catch{return}}async function JN(Z){let Q=await f5.createBLAKE3();return Q.init(),Q.update(Z),Q.digest("hex")}class R9 extends Error{constructor(){super("分片会话已失效");this.name="SessionGoneError"}}function zN(Z){let Q=String(Z?.message??Z);return/fetch failed|ECONNRESET|ETIMEDOUT|EPIPE|UND_ERR|服务响应解析失败 \(HTTP 5/i.test(Q)}async function XN(Z){await new Promise((Q)=>setTimeout(Q,Z))}async function iJ(Z,Q,Y){let J=(await iU(Q)).size,z=oU(Q);for(let X=0;;X++)try{return await WN(Z,Q,z,J,Y)}catch(V){if(V instanceof R9&&X<sU){await Y.store.clear(Y.fingerprint),j.warn("云端分片会话已失效,自动重建整传一次");continue}throw V}}async function WN(Z,Q,Y,J,z){let{fingerprint:X,store:V,force:W}=z,K=W?void 0:await V.load(X),G;if(K){let $=await lJ(Z,K.uploadId);if($===void 0)await V.clear(X),K=void 0;else if(K={...K,partSize:$.part_size,totalParts:$.total_parts},G=$.missing,G.length<K.totalParts)j.info(`断点续传:云端已有 ${K.totalParts-G.length}/${K.totalParts} 片,补 ${G.length} 片`)}if(!K){let $=W?void 0:await YN(Q),H={filename:Y,size:J};if($)H.blake3_id=$;let N=await fetch(`${Z.base}/base/file/upload/chunk/init`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(H)}),U=await aZ(N);if(U.code!==200)throw Error(`分片上传 init 失败 (code=${U.code??"?"}):${U.msg??"未知错误"}`);if(U.data?.file_id!=null)return j.info("秒传命中:云端已有同内容文件,零字节上传"),String(U.data.file_id);if(U.data?.upload_id==null||!U.data.part_size||!U.data.total_parts)throw Error("分片上传 init 响应缺字段(upload_id/part_size/total_parts)");K={uploadId:String(U.data.upload_id),partSize:U.data.part_size,totalParts:U.data.total_parts,size:J,path:Q,createdAt:Date.now()},await V.save(X,K),G=void 0}if(G===void 0)G=Array.from({length:K.totalParts},($,H)=>H);await dJ(Z,Q,K,G);for(let $=0;;$++){let H=await fetch(`${Z.base}/base/file/upload/chunk/${K.uploadId}/complete`,{method:"POST",headers:{Authorization:Z.apiKey}}),N=await aZ(H);if(N.code===200&&N.data?.file_id!=null)return await V.clear(X),String(N.data.file_id);if(N.code===h5)throw new R9;if(N.code===ZN&&$<aU){let U=await lJ(Z,K.uploadId);if(U===void 0)throw new R9;await dJ(Z,Q,K,U.missing);continue}throw Error(`分片上传 complete 失败 (code=${N.code??"?"}):${N.msg??"未知错误"}`)}}async function lJ(Z,Q){let Y=await fetch(`${Z.base}/base/file/upload/chunk/${Q}`,{headers:{Authorization:Z.apiKey}}),J=await aZ(Y);if(J.code===h5)return;if(J.code!==200||!J.data)throw Error(`分片会话查询失败 (code=${J.code??"?"}):${J.msg??"未知错误"}`);return J.data}async function dJ(Z,Q,Y,J){if(J.length===0)return;let{uploadId:z,partSize:X,totalParts:V,size:W}=Y,K=V-J.length,G=await nJ(Q,"r");try{let $=[...J],H=async()=>{let N=Buffer.alloc(X);for(;;){let U=$.shift();if(U===void 0)return;let q=U*X,M=U===V-1?W-q:X,{bytesRead:F}=await G.read(N,0,M,q);if(F!==M)throw Error(`本地文件读取不足(第${U}片期望${M}字节实读${F})——文件被改动?`);let R=N.subarray(0,M);await VN(Z,z,U,R),K++,j.tick(`分片上传 ${K}/${V}(${Math.round(K/V*100)}%)`)}};await Promise.all(Array.from({length:Math.min(rU,J.length)},H))}finally{j.tickEnd(),await G.close()}}async function VN(Z,Q,Y,J){let z=await JN(J),X;for(let V=0;V<=mJ;V++){if(V>0)await XN(cJ[Math.min(V-1,cJ.length-1)]);try{let W=await fetch(`${Z.base}/base/file/upload/chunk/${Q}/${Y}?blake3=${z}`,{method:"PUT",headers:{Authorization:Z.apiKey,"Content-Type":"application/octet-stream"},body:J}),K=await aZ(W);if(K.code===200)return;if(K.code===h5)throw new R9;if(K.code===eU||K.code===tU){X=Error(`第${Y}片被拒 (code=${K.code}):${K.msg??""}`);continue}throw Error(`第${Y}片上传失败 (code=${K.code??"?"}):${K.msg??"未知错误"}`)}catch(W){if(W instanceof R9)throw W;if(!zN(W))throw W;X=W}}throw X instanceof Error?X:Error(`第${Y}片重试${mJ}次仍失败`)}var I6=V9(),g5=rJ(I6,"upload-cache.json"),u5=rJ(I6,"upload-sessions.json");function Qz(Z){return`${Z.size}:${Math.round(Z.mtimeMs)}`}async function KN(Z){return Qz(await aJ(Z))}async function Yz(){if(!Zz(g5))return{};try{return JSON.parse(await tJ(g5,"utf8"))}catch{return{}}}async function Jz(Z){await sJ(I6,{recursive:!0}),await eJ(g5,JSON.stringify(Z,null,2))}var GN={stat:aJ,uploadFile:LJ,uploadChunked:iJ,cacheStore:{load:Yz,save:Jz}};async function z8(Z){let Q=await KN(Z),Y=await Yz();if(Y[Q])delete Y[Q],await Jz(Y)}async function b5(){if(!Zz(u5))return{};try{return JSON.parse(await tJ(u5,"utf8"))}catch{return{}}}async function oJ(Z){await sJ(I6,{recursive:!0}),await eJ(u5,JSON.stringify(Z,null,2))}var $N={async load(Z){return(await b5())[Z]},async save(Z,Q){let Y=await b5();Y[Z]=Q,await oJ(Y)},async clear(Z){let Q=await b5();if(Q[Z])delete Q[Z],await oJ(Q)}};async function uZ(Z,Q,Y,J=GN){H8();let z=await J.stat(Q),X=Qz(z),V=await J.cacheStore.load(),W=V[X]?.fileId;if(!Y?.force&&W)return{fileId:W,cached:!0};let K=z.size>=pJ?await J.uploadChunked(Z,Q,{fingerprint:X,store:$N,force:Y?.force}):await J.uploadFile(Z,Q),G=await J.stat(Q);if(G.size!==z.size||Math.round(G.mtimeMs)!==Math.round(z.mtimeMs))throw Error("上传过程中输入文件发生变化,请等待文件写入完成后重试");return V[X]={fileId:K,size:G.size,mtimeMs:Math.round(G.mtimeMs),path:Q,uploadedAt:Date.now()},await J.cacheStore.save(V),{fileId:K,cached:!1}}var zz=6004,D9=[250,750,1500,3000],HN={uploadCached:uZ,invalidateUpload:z8,submitTask:J8,sleep:(Z)=>new Promise((Q)=>setTimeout(Q,Z))};async function qN(Z,Q,Y,J,z,X){for(let V=0;;V++)try{return await X.submitTask(Z,Q,J(Y))}catch(W){if(O0(W)!==zz||V>=z.length)throw W;await X.sleep(z[V])}}async function R8(Z,Q,Y,J,z={},X=HN){if(/\.gtrk$/i.test(Q))await gJ(Q);let V=await X.uploadCached(Z,Q,{force:z.force});z.onUploaded?.(V);let W=z.visibilityBackoffMs??D9;if(V.cached)try{return{taskId:await X.submitTask(Z,Y,J(V.fileId)),fileId:V.fileId,cached:!0}}catch(G){if(O0(G)!==zz)throw G;z.onCacheInvalid?.(),await X.invalidateUpload(Q),V=await X.uploadCached(Z,Q,{force:!0})}return{taskId:await qN(Z,Y,V.fileId,J,W,X),fileId:V.fileId,cached:!1}}import{mkdir as _N,stat as TN}from"node:fs/promises";import{closeSync as AN,existsSync as Fz,openSync as EN,readSync as XQ,readdirSync as IN}from"node:fs";import{homedir as SN}from"node:os";import{basename as vN,extname as wN,join as _0}from"node:path";import{spawnSync as Kz}from"node:child_process";import{createHash as UN}from"node:crypto";import{createWriteStream as NN,existsSync as S6,mkdirSync as v6,chmodSync as BN,renameSync as Gz,rmSync as c0,readdirSync as jN}from"node:fs";import{createReadStream as FN}from"node:fs";import{once as Xz}from"node:events";import{pipeline as MN}from"node:stream/promises";import{basename as RN,dirname as DN,join as C0}from"node:path";var m5="https://api.ai-mcn.tv:9000/broadcast/exe/ffmpeg/dist/manifest.json",Wz=1;function c5(Z){if(!/^https:\/\//i.test(Z))throw Error(`运行时资产下载 MUST 用 https,收到:${Z}`)}var Vz=["win-x64","linux-x64","mac-x64","mac-arm64"];function w6(Z=process.platform,Q=process.arch){let Y={win32:"win",linux:"linux",darwin:"mac"}[Z],J={x64:"x64",arm64:"arm64"}[Q],z=Y&&J?`${Y}-${J}`:"";if(!z||!Vz.includes(z))throw Error(`当前平台 ${Z}-${Q} 无对应的 ffmpeg 分发包(已分发:${Vz.join(" / ")})。`+`请自行安装 ffmpeg/ffprobe 到 ${i8()},或用 --ffmpeg-path <目录> 指定已装位置。`);return z}function ON(Z){if(!Z||typeof Z!=="object")throw Error("manifest 不是对象");let Q=Z;if(typeof Q.schema!=="number")throw Error("manifest 缺 schema 字段");if(Q.schema>Wz)throw Error(`manifest schema=${Q.schema} 高于本 CLI 支持的 ${Wz},请先升级 CLI(gtrk upgrade)`);if(!Q.base||!Q.ffmpeg||!Q.font)throw Error("manifest 缺 base/ffmpeg/font 字段");return c5(Q.base),Q}async function l5(Z=m5){c5(Z);let Q=await fetch(Z);if(!Q.ok)throw Error(`取 manifest 失败:HTTP ${Q.status} ${Z}`);return ON(await Q.json())}async function PN(Z){let Q=UN("sha256");return await MN(FN(Z),Q),Q.digest("hex")}function $z(){if(process.platform==="win32"){let Z=C0(process.env.SystemRoot||"C:\\Windows","System32","tar.exe");if(S6(Z))return Z}return"tar"}function LN(){try{return Kz($z(),["--version"],{stdio:"ignore"}).status===0}catch{return!1}}async function Hz(Z,Q,Y){c5(Z),v6(B0(),{recursive:!0});let J=C0(B0(),`dl-${Date.now()}-${Z.split("/").pop()??"asset"}`);try{let z=await fetch(Z);if(!z.ok)throw Error(`下载失败:HTTP ${z.status} ${Z}`);if(!z.body)throw Error(`下载失败:响应无 body ${Z}`);let X=Number(z.headers.get("content-length")??0),V=0,W=z.body.getReader(),K=NN(J);try{for(;;){let{done:$,value:H}=await W.read();if($)break;if(V+=H.length,Y)Y(V,X);if(!K.write(H))await Xz(K,"drain")}}finally{K.end()}await Xz(K,"close");let G=await PN(J);if(G!==Q)throw c0(J,{force:!0}),Error(`sha256 校验不通过,已丢弃下载物、未落地任何文件。
|
|
62
|
+
`,"utf8");async function*q(){yield H;for await(let U of FU(Q))yield U;yield N}W=await J(`${Z.base}/base/file/upload`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":`multipart/form-data; boundary=${$}`,"Content-Length":String(H.length+G+N.length)},body:TJ.toWeb(TJ.from(q())),duplex:"half"})}let V=await tZ(W),K=V.data?.file_id??V.data?.id;if(V.code===200&&K)return String(K);throw new OZ(V.code,`上传失败 (code=${V.code??"?"}):${V.msg??"未知错误"}`)}async function W8(Z,Q,Y){let J=await fetch(`${Z.base}/task/${Q}`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Y)}),z=await tZ(J);if(z.code===200&&z.data?.task_id)return String(z.data.task_id);throw new OZ(z.code,`提交失败 (code=${z.code??"?"}):${z.msg??"未知错误"}`)}async function A8(Z,Q,Y){let J=await fetch(`${Z.base}/task/${Q}/${Y}`,{headers:{Authorization:Z.apiKey}}),z=await tZ(J);if(z.code!=null&&z.code!==200)throw new OZ(z.code,`任务查询失败 (code=${z.code}):${z.msg??""}`);let X=z.data??{};return{status:String(X.status??""),progress:typeof X.progress==="number"?X.progress:void 0,output:X.output_result??{}}}async function B9(Z,Q,Y,J){let z=Date.now(),X=1800000,W=5000;for(;;){if(Date.now()-z>1800000)throw Error("任务超时(超过 30 分钟)。可稍后在云端查任务或重试。");await new Promise((K)=>setTimeout(K,5000));let V;try{V=await A8(Z,Q,Y)}catch(K){if(K instanceof OZ)throw K;continue}if(V.status==="completed")return V.output;if(V.status==="failed"||V.status==="cancelled"){let K=V.output;throw Error(K?.error??(V.status==="failed"?"任务失败":"任务已取消"))}J?.(V.status||"处理中",V.progress)}}async function g8(Z,Q){let Y=await fetch(Z);if(!Y.ok)throw Error(`下载失败 HTTP ${Y.status}:${Z}`);let J=Buffer.from(await Y.arrayBuffer());await BU(Q,J)}async function EJ(Z){let Q=Z?.asr_result_download_url;if(typeof Q!=="string"||!Q.trim())return Z??{};let Y=await fetch(Q);if(!Y.ok)throw Error(`下载全量转写 JSON 失败 HTTP ${Y.status}:${Q}`);let J=await Y.json();if(!J||typeof J!=="object"||Array.isArray(J))throw Error("全量转写 JSON 形态异常(应为对象)");return J}import{readFile as tU}from"node:fs/promises";import{dirname as eU,isAbsolute as lJ,relative as ZN,resolve as h5}from"node:path";import{deflateSync as DU}from"node:zlib";var l0="000000",j9="ex-solid-",PU="assets/builtin",IJ=8192,OU=Buffer.from([137,80,78,71,13,10,26,10]),LU=(()=>{let Z=new Uint32Array(256);for(let Q=0;Q<256;Q++){let Y=Q;for(let J=0;J<8;J++)Y=Y&1?3988292384^Y>>>1:Y>>>1;Z[Q]=Y>>>0}return Z})();function CU(Z){let Q=4294967295;for(let Y=0;Y<Z.length;Y++)Q=(LU[(Q^Z[Y])&255]^Q>>>8)>>>0;return(Q^4294967295)>>>0}function L5(Z,Q){let Y=Buffer.alloc(4);Y.writeUInt32BE(Q.length,0);let J=Buffer.concat([Buffer.from(Z,"ascii"),Q]),z=Buffer.alloc(4);return z.writeUInt32BE(CU(J),0),Buffer.concat([Y,J,z])}function C5(Z){let Q=Z.replace(/^#/,"").toLowerCase();return/^[0-9a-f]{6}$/.test(Q)?Q:null}function _5({hex:Z,width:Q,height:Y}){let J=C5(Z);if(!J)throw Error(`非法纯色 hex:${Z}`);return`${j9}${J}-${Q}x${Y}`}function WQ({hex:Z,width:Q,height:Y}){let J=C5(Z);if(!J)throw Error(`非法纯色 hex:${Z}`);return`${PU}/solid-${J}-${Q}x${Y}.png`}function S6(Z){if(!Array.isArray(Z)||Z.length!==2)return!1;return Z.every((Q)=>typeof Q==="number"&&Number.isInteger(Q)&&Q>0&&Q<=IJ)}function SJ({hex:Z,width:Q,height:Y}){let J=C5(Z);if(!J)throw Error(`非法纯色 hex:${Z}`);if(!S6([Q,Y]))throw Error(`纯色画布尺寸非法或超上限(${Q}x${Y},上限 ${IJ})`);let z=Number.parseInt(J.slice(0,2),16),X=Number.parseInt(J.slice(2,4),16),W=Number.parseInt(J.slice(4,6),16),V=Buffer.alloc(13);V.writeUInt32BE(Q,0),V.writeUInt32BE(Y,4),V[8]=8,V[9]=2,V[10]=0,V[11]=0,V[12]=0;let K=1+Q*3,G=Buffer.alloc(K);G[0]=0;for(let H=0;H<Q;H++){let N=1+H*3;G[N]=z,G[N+1]=X,G[N+2]=W}let $=Buffer.alloc(K*Y);for(let H=0;H<Y;H++)G.copy($,H*K);return Buffer.concat([OU,L5("IHDR",V),L5("IDAT",DU($,{level:9})),L5("IEND",Buffer.alloc(0))])}var E5="assets/broll-preview",I5="assets/broll-cover",s8="broll-",kJ="broll-raw-",C0="broll-local-";function _0(Z){return`${s8}${Z}`}var S5=12,fJ=3,cZ=1.2,vJ=1,w6=0.2,_U=0.5,TU=32,GQ=0.7,v6=0.1,AU=0.75,EU=1.25;function IU(Z){let Q=Z.eps??v6,Y=[];for(let W of Z.beats)for(let V of W.slots)Y.push(V.track_st,V.track_ed);Y.sort((W,V)=>W-V);let J=new Set,z=0,X=0;for(let W of Z.starts){let V=Math.round(W*1000);if(J.has(V))continue;if(!Z.beats.some((H)=>W>=H.track_st-Q&&W<H.track_ed-Q))continue;J.add(V),z++;let K=0,G=Y.length;while(K<G){let H=K+G>>1;if(Y[H]<W)K=H+1;else G=H}if(Math.min(K<Y.length?Math.abs(Y[K]-W):Number.POSITIVE_INFINITY,K>0?Math.abs(Y[K-1]-W):Number.POSITIVE_INFINITY)<=Q)X++}return{starts_total:z,aligned:X,ratio:z>0?Math.round(X/z*1000)/1000:0}}var SU=2,vU=0.05,wU=0.03,yU=0.02,hJ=0.5,T5=["local","concept","common"],A5=(Z)=>Z==="local"||Z==="concept"||Z==="common";function xU(Z,Q,Y){if(Y==="material")return Z.clip_id;if(Z.kind==="image")return Z.clip_id;if(Z.source==="local"||typeof Z.local_path==="string")return`${Z.clip_id}@${Q.start}`;return Z.clip_id}var M9=0.001;function v5(Z){let Q=Z.filter((J)=>Number.isFinite(J.track_st)&&Number.isFinite(J.track_ed)&&J.track_ed>J.track_st).sort((J,z)=>J.track_st-z.track_st),Y=[];for(let J of Q){let z=Y[Y.length-1];if(z&&J.track_st-z.track_ed<=M9){if(J.track_ed>z.track_ed)z.track_ed=J.track_ed;continue}Y.push({track_st:J.track_st,track_ed:J.track_ed})}return Y.map((J)=>({track_st:MZ(J.track_st),track_ed:MZ(J.track_ed)}))}var kU=3,fU=0.15;function wJ(Z){let Q=[];for(let Y of Z.beats){if(!(Y.track_ed-Y.track_st>M9))continue;let J=v5(Y.slots.map((W)=>({track_st:Math.max(Y.track_st,W.track_st),track_ed:Math.min(Y.track_ed,W.track_ed)}))),z=(W,V)=>{let K=MZ(W),G=MZ(V);if(G-K>M9)Q.push({beat:Y.beat,track_st:K,track_ed:G,sec:MZ(G-K)})},X=Y.track_st;for(let W of J)if(z(X,W.track_st),W.track_ed>X)X=W.track_ed;z(X,Y.track_ed)}return Q.sort((Y,J)=>Y.track_st-J.track_st||Y.track_ed-J.track_ed),{holes:Q,totalSec:MZ(Q.reduce((Y,J)=>Y+J.sec,0))}}function F9(Z){let Q=[];for(let Y of Z.queries)for(let J of Y.results??[])Q.push(J);return Q.sort((Y,J)=>J.score-Y.score)}function bJ(Z){let Q=Z.preview_url;if(typeof Q==="string"&&Q)return Q;let Y=Z.cover_url;if(typeof Y==="string"){let J=Y.replace(/\/keyframe\/([^/]+)\/cover\.jpg.*$/,"/preview/$1.mp4");if(J!==Y)return J}return null}function hU(Z,Q){if(!Z||!Q||Z<=0||Q<=0)return;if(Z<=640)return[Z,Q];return[640,Math.max(2,Math.round(Q*640/Z/2)*2)]}var MZ=(Z)=>Math.round(Z*1000)/1000;function D9(Z,Q){return`${Z}@${Math.round(Q.best*1000)}`}function d0(Z,Q,Y){let J=MZ(Z),z=MZ(Q),X=MZ(Y);return{clip_st:J,clip_ed:MZ(J+X),track_st:z,track_ed:MZ(z+X)}}function bU(Z,Q){let Y=(K)=>typeof K==="number"?Math.round(K*1000):void 0,[J,z,X,W,V]=[Y(Z.clip_st),Y(Z.clip_ed),Y(Z.track_st),Y(Z.track_ed),Y(Z.duration)];if(J!==void 0&&z!==void 0&&z-J!==V)throw Error(`铺轨自检失败(${Q}):clip_ed − clip_st = ${z-J}ms ≠ duration ${V}ms。`+"裁剪恒等式须**构造性成立**(composition-contract-v1 §3),"+"两个端点 MUST NOT 各自舍入——见 slotTimes 头注。");if(X!==void 0&&W!==void 0&&W-X!==V)throw Error(`铺轨自检失败(${Q}):track_ed − track_st = ${W-X}ms ≠ duration ${V}ms。`)}var n0=(Z)=>Z.cand.kind==="image";function y6(Z){if(Z.segments?.length)return Z.segments;let Q=Z.duration??fJ;return[{start:0,end:Q,best:Q/2,score:Z.score}]}function gJ(Z,Q){return(Y)=>Y.pinned&&Q?Q.has(D9(Y.cand.clip_id,Y.seg)):Z.has(Y.key)}function w5(Z,Q,Y={}){let J=Y.dedupScope??"scene",z=typeof Y.markWeight==="number"&&Y.markWeight>0?Math.min(1,Y.markWeight):0,X=typeof Y.highlightWeight==="number"&&Y.highlightWeight>0?Math.min(1,Y.highlightWeight):0,W=Math.max(0,Math.min(X,1-z)),V=[];for(let K of Z.queries){let G=[];for(let $ of K.results??[]){let H=$.pinned===!0;if(!H&&$.excluded_hint)continue;if(Y.noImage&&$.kind==="image")continue;for(let N of y6($)){if(!H&&N.score<Q)continue;let q=N.score;if(z>0||W>0){let R=Math.round(N.best*1000),D=z>0?Y.markLookup?.($.clip_id,R):void 0,O=W>0?Y.highlightLookup?.($.clip_id,R):void 0,C=typeof D==="number"&&Number.isFinite(D),T=typeof O==="number"&&Number.isFinite(O),_=C?z:0,P=T?W:0;q=N.score*(1-_-P)+(C?Math.min(100,Math.max(0,D))/100*_:0)+(T?Math.min(100,Math.max(0,O))/100*P:0);let E=D9($.clip_id,N);if(z>0)if(C)Y.markStats?.hit.add(E);else Y.markStats?.neutral.add(E);if(W>0)if(T)Y.markStats?.hlHit.add(E);else Y.markStats?.hlNeutral.add(E)}let U=N.motion?.p50,F=typeof U==="number"&&Number.isFinite(U)&&U>vU,M=$.describe?.usable_flags?.blurry===!0;G.push({cand:$,seg:N,query:K.query,key:xU($,N,J),pinned:H,fused:q,hot:F,blurry:M,rank:q-(F?yU:0)-(M?wU:0)})}}if(G.sort(($,H)=>Number(H.pinned)-Number($.pinned)||H.rank-$.rank||H.fused-$.fused||H.seg.score-$.seg.score||Number(n0($))-Number(n0(H))),G.length)V.push({query:K.query,pool:G})}return V}function y5(Z,Q){if(n0(Z))return{clipSt:0,clipEd:Q};let Y=Z.seg.start,J=Math.max(Y,Z.seg.end-Q),z=Math.min(Math.max(Z.seg.best-Q/2,Y),J);return{clipSt:z,clipEd:Math.min(z+Q,Z.seg.end)}}function VQ(Z,Q,Y,J){if(n0(Z))return Q;let z=0.000001,{clipSt:X,clipEd:W}=Q,V=!1,K=!1,G=J?.snapCuts===!1?void 0:Z.seg.cuts;if(Array.isArray(G)&&G.length){let H=G.filter((N)=>Number.isFinite(N)&&N>X+z&&N<W-z);if(H.length){let N=H[0];if(N-X<vJ)X=N,V=!0;let q=H[H.length-1];if(q>X+z&&W-q<vJ)W=q,K=!0}}let $=Z.cand.fps;if(typeof $==="number"&&Number.isFinite($)&&$>0){let H=J?.gridInward===!0,N=V||H?Math.ceil(X*$-z)/$:Math.round(X*$)/$,q=Math.min(Math.max(N,Z.seg.start),W),U=Math.min(K||H?Math.floor(W*$+z)/$:Math.round(W*$)/$,Z.seg.end);if(U-q>Y+z)U=q+Math.floor((Y+z)*$)/$;if(U-q>z)X=q,W=U}if(W-X>Y+z)W=X+Y;if(W-X<cZ)return null;return{clipSt:X,clipEd:W}}function R9(Z){if(n0(Z))return Number.POSITIVE_INFINITY;return Math.max(0,Z.seg.end-Z.seg.start)}function gU(Z){let Q=2166136261;for(let Y=0;Y<Z.length;Y++)Q^=Z.charCodeAt(Y),Q=Math.imul(Q,16777619);return Q>>>0}function uU(Z){let Q=Z>>>0;return()=>{Q=Q+1831565813>>>0;let Y=Q;return Y=Math.imul(Y^Y>>>15,Y|1),Y^=Y+Math.imul(Y^Y>>>7,Y|61),((Y^Y>>>14)>>>0)/4294967296}}function mU(Z,Q){let Y=typeof Z.requested_shots==="number"&&Z.requested_shots>0?Z.requested_shots:void 0,J=typeof Z.per_shot_sec==="number"&&Z.per_shot_sec>0?Z.per_shot_sec:Y?Math.min(Math.max(Q/Y,1.5),6):void 0;if(J===void 0)return[2,4];let z=Math.max(1.5,J*0.8),X=Math.max(z+0.5,Math.min(8,J*1.6));return[z,X]}function KQ(Z){let{beat:Q,trackOrder:Y,consumed:J,scoreFloor:z}=Z,X=Q.track_ed-Q.track_st;if(!(X>0))return[];let[W,V]=mU(Q,X),K=uU(gU(`${Q.beat}#${Y}`)),G=Z.cutAlign&&Z.cutAlign.ratio>0&&Z.cutAlign.starts.length?Z.cutAlign:void 0;if(G&&G.starts.some((D)=>Math.abs(D-Q.track_st)<=v6))G.state.chances++,G.state.snapped++;let $=w5(Q,z,{noImage:Z.noImage,dedupScope:Z.dedupScope,markWeight:Z.markWeight,markLookup:Z.markLookup,highlightWeight:Z.highlightWeight,highlightLookup:Z.highlightLookup,markStats:Z.markStats});if(!$.length)return[];let H=gJ(J,Z.pinnedPlaced),N=[],q=Q.track_st,U=null,F=null,M=0;for(let D=0;D<TU;D++){let O=Q.track_ed-q;if(O<cZ)break;let C;if(O<=V)C=O;else if(O<V+W)C=O/2;else C=W+K()*(V-W);let T,_=C;if(G){let f=q+Math.max(cZ,W*AU),n=q+Math.min(V*EU,O),QZ,zZ=Number.POSITIVE_INFINITY;for(let BZ of G.starts){if(BZ<f-0.000001)continue;if(BZ>n+0.000001)break;let PZ=Q.track_ed-BZ;if(PZ>0.000001&&PZ<cZ)continue;let oZ=Math.abs(BZ-(q+C));if(oZ<zZ)QZ=BZ,zZ=oZ}if(QZ!==void 0){if(G.state.chances++,G.state.snapped/G.state.chances<G.ratio-0.000000001)G.state.snapped++,T=QZ,C=QZ-q}}let P=Math.min(cZ,O),E=(f)=>Math.min(C,R9(f),O),I=(f)=>{if(R9(f)<P)return!1;if(H(f))return!1;let n=Z.beatOwners?.get(f.cand.clip_id);return n===void 0||n===Y},y=(f)=>VQ(f,y5(f,E(f)),O),h=(f,n)=>{if(f.pinned)return!1;if(!U||D-U.slotIdx>=2)return!1;if(f.cand.clip_id!==U.clipId)return!1;return Math.abs(n.clipSt-U.clipEd)<SU},v=(f)=>{for(let n=0;n<$.length;n++){let{pool:QZ}=$[(D+n)%$.length];for(let zZ of QZ){if(!I(zZ))continue;let BZ=y(zZ);if(!BZ||h(zZ,BZ))continue;if(f&&T!==void 0&&BZ.clipEd-BZ.clipSt<T-q-v6)continue;return{p:zZ,win:BZ}}}return null},S=null,k=null,c=v(T!==void 0);if(!c&&T!==void 0&&G)G.state.snapped--,T=void 0,C=_,c=v(!1);if(c)S=c.p,k=c.win;let a=!1;if(!S){for(let f=0;f<$.length&&!S;f++){let{pool:n}=$[(D+f)%$.length];for(let QZ of n){if(!I(QZ))continue;let zZ=y(QZ);if(!zZ){a=!0;continue}S=QZ,k=zZ;break}}if(S&&Z.stats)Z.stats.adjacentWaived++}if(!S||!k){if(Z.stats){if(Z.stats.emptySlots++,a)Z.stats.emptySlotsByRefine++}if(M++,M>=2)break;q+=Math.min(C,O);continue}M=0;let u=k,l=u.clipEd-u.clipSt;if(G&&T!==void 0&&Math.abs(q+l-T)>v6)G.state.snapped--;if(N.push({clip_id:S.cand.clip_id,query:S.query,score:S.seg.score,...d0(u.clipSt,q,l)}),S.pinned)Z.pinnedPlaced?.add(D9(S.cand.clip_id,S.seg));if(S.hot&&Z.stats)Z.stats.hotSlotsPlaced++;if(S.blurry&&Z.stats)Z.stats.blurrySlotsPlaced++;J.add(S.key),Z.beatOwners?.set(S.cand.clip_id,Y),U={slotIdx:D,clipId:S.cand.clip_id,clipEd:u.clipEd},F=S,q+=l}let R=N[N.length-1];if(R&&F){let D=Q.track_ed-R.track_ed;if(D>0.000001&&D<cZ){let O=n0(F)?Number.POSITIVE_INFINITY:F.seg.end,C=Math.min(D,Math.max(0,O-R.clip_ed));if(C>0.000001){let T=Q.track_ed-R.track_st,_=VQ(F,{clipSt:R.clip_st,clipEd:R.clip_ed+C},T);if(_&&_.clipEd>R.clip_ed+0.000001){let P=d0(R.clip_st,R.track_st,_.clipEd-R.clip_st);R.clip_ed=P.clip_ed,R.track_ed=P.track_ed}}}}return N}function cU(Z,Q){let Y=Z.queries.find((J)=>J.query===Q);if(!Y)return`锚 query「${Q}」在 plan 内无检索记录(该 query 被编辑删除或检索未跑)——重跑 gtrk matrix 可恢复`;if(Y.error)return`锚 query「${Q}」检索失败(${Y.error.msg})`;if(!Y.results?.length)return Z.queries.some((z)=>z!==Y&&(z.results??[]).some((X)=>X.also_matched_queries?.includes(Q)))?`锚 query「${Q}」的命中被 beat 内去重折进同 beat 其他 query(旧版 plan 形态)——重跑 gtrk matrix 生成新 plan 即恢复`:`锚 query「${Q}」检索零命中`;return`锚 query「${Q}」无 ≥score 地板的命中`}function lU(Z){let{beat:Q}=Z,Y=Array.isArray(Q.anchors)?Q.anchors:[];if(!Y.length)return{slots:KQ(Z),anchors:[]};let J=[],z=[],X=Q.track_ed-Q.track_st,W=(R,D)=>{J.push({beat:Q.beat,keyword:R.keyword,at_sec:R.at_sec??null,track_st:null,clip_id:null,status:"degraded",reason:D})};if(!(X>0)){for(let R of Y)W({keyword:R.keyword,at_sec:R.at_sec??null},"beat 窗口无长度");return{slots:[],anchors:J}}let V=w5(Q,Z.scoreFloor,{noImage:Z.noImage,dedupScope:Z.dedupScope,markWeight:Z.markWeight,markLookup:Z.markLookup,highlightWeight:Z.highlightWeight,highlightLookup:Z.highlightLookup,markStats:Z.markStats}),K=new Map(V.map((R)=>[R.query,R.pool])),G=gJ(Z.consumed,Z.pinnedPlaced),H=(typeof Q.per_shot_sec==="number"&&Q.per_shot_sec>0?Q.per_shot_sec:fJ)*2,N=Y.map((R,D)=>({a:R,i:D})).sort((R,D)=>(R.a.at_sec??Number.POSITIVE_INFINITY)-(D.a.at_sec??Number.POSITIVE_INFINITY)||R.i-D.i),q=Q.track_st;for(let{a:R}of N){if(typeof R.at_sec!=="number"||!Number.isFinite(R.at_sec)){W(R,"at_sec 缺失(plan 内插失败:文本漂移/句被剪/重投影降级)");continue}let D=Math.max(Q.track_st,R.at_sec-_U);D=Math.min(D,Q.track_ed-cZ),D=Math.max(D,Q.track_st,q);let O=Q.track_ed-D;if(O<cZ-0.000001){W(R,"锚点窗口不足(与前锚重叠或过近 beat 末端)");continue}let C=K.get(R.query);if(!C?.length){W(R,cU(Q,R.query));continue}let T=null,_=null;for(let E of C){if(G(E))continue;if(R9(E)<Math.min(cZ,O))continue;let I=Z.beatOwners?.get(E.cand.clip_id);if(I!==void 0&&I!==Z.trackOrder)continue;let y=VQ(E,y5(E,Math.min(H,R9(E),O)),O);if(!y)continue;T=E,_=y;break}if(!T||!_){W(R,`锚 query「${R.query}」候选耗尽或精修后不足最小槽长`);continue}let P=_.clipEd-_.clipSt;if(z.push({clip_id:T.cand.clip_id,query:R.query,score:T.seg.score,...d0(_.clipSt,D,P)}),Z.consumed.add(T.key),Z.beatOwners?.set(T.cand.clip_id,Z.trackOrder),T.pinned)Z.pinnedPlaced?.add(D9(T.cand.clip_id,T.seg));if(T.hot&&Z.stats)Z.stats.hotSlotsPlaced++;if(T.blurry&&Z.stats)Z.stats.blurrySlotsPlaced++;q=D+P,J.push({beat:Q.beat,keyword:R.keyword,at_sec:R.at_sec,track_st:MZ(D),clip_id:T.cand.clip_id,status:T.pinned?"pinned":"planned"})}let U=[],F=Q.track_st;for(let R of[...z].sort((D,O)=>D.track_st-O.track_st)){if(R.track_st-F>=cZ)U.push({st:F,ed:R.track_st});F=Math.max(F,R.track_ed)}if(Q.track_ed-F>=cZ)U.push({st:F,ed:Q.track_ed});let M=[...z];return U.forEach((R,D)=>{let O={...Q,beat:`${Q.beat}~a${D}`,track_st:R.st,track_ed:R.ed};M.push(...KQ({...Z,beat:O}))}),M.sort((R,D)=>R.track_st-D.track_st),{slots:M,anchors:J}}function dU(Z,Q,Y){let J,z=[];for(let K of Z.queries)for(let G of K.results??[]){if(G.clip_id!==Q.clip_id)continue;J??=G;for(let $ of G.segments??[])for(let H of $.cuts??[])if(Number.isFinite(H)&&H>Q.clip_st&&H<Q.clip_ed)z.push(H)}z.sort((K,G)=>K-G);let X=J??{clip_id:Q.clip_id,score:0},W=X.fps===void 0?Y?.(Q.clip_id):void 0;return{cand:typeof W==="number"?{...X,fps:W}:X,seg:{start:Q.clip_st,end:Q.clip_ed,best:(Q.clip_st+Q.clip_ed)/2,score:0,...z.length?{cuts:z}:{}},query:Q.query??"",key:`${Q.clip_id}@direct@${Q.clip_st}`,pinned:!1,fused:0,rank:0,hot:!1,blurry:!1}}function nU(Z){let{beat:Q}=Z,Y=Array.isArray(Q.direct_slots)?Q.direct_slots:[];if(!Y.length)return{slots:KQ(Z),direct:[]};let J=[],z=[];if(!(Q.track_ed-Q.track_st>0)){for(let q of Y)J.push({beat:Q.beat,clip_id:q.clip_id,track_st:null,status:"rejected",code:"beat_no_span",refined:!1,has_cuts:!1,cut_snap:"no_data",fps:null});return{slots:[],direct:J}}let W=Y.filter((q)=>typeof q.track_st==="number"&&typeof q.track_ed==="number"),V=Y.filter((q)=>!(typeof q.track_st==="number"&&typeof q.track_ed==="number"));W.sort((q,U)=>q.track_st-U.track_st);let K=(q,U)=>z.some((F)=>q<F.track_ed-0.000001&&U>F.track_st+0.000001),G=(q,U,F,M)=>{let R=dU(Q,q,Z.fpsOf),D=Array.isArray(R.seg.cuts)&&R.seg.cuts.length>0,O=q.slot_role!=="quote",C=!O?"skipped_quote":D?"applied":"no_data",T=typeof R.cand.fps==="number"&&Number.isFinite(R.cand.fps)&&R.cand.fps>0?R.cand.fps:null,_=Math.min(F-U,Q.track_ed-U),P={clipSt:q.clip_st,clipEd:q.clip_ed},E=VQ(R,P,_,{gridInward:!0,snapCuts:O}),I=E??P,y=E!==null&&(Math.abs(E.clipSt-P.clipSt)>0.000001||Math.abs(E.clipEd-P.clipEd)>0.000001),h=Math.max(0,q.clip_ed-I.clipSt),v=Math.min(h,_),S=M?_:v,k=T?1/T:0,a=S-v>k+0.000001?v:S,u=S-a;z.push({clip_id:q.clip_id,query:q.query??"",score:0,...d0(I.clipSt,U,a)});let l=E===null||a<cZ-0.000001;J.push({beat:Q.beat,clip_id:q.clip_id,track_st:MZ(U),status:l?"sliver":"planned",...l?{code:"sliver"}:{},refined:y,has_cuts:D,cut_snap:C,fps:T,...u>k+0.000001?{starved_sec:MZ(u)}:{}})};for(let q of W){let{track_st:U,track_ed:F}=q;if(!(F>U)||U<Q.track_st-0.000001||F>Q.track_ed+0.000001){J.push({beat:Q.beat,clip_id:q.clip_id,track_st:null,status:"rejected",code:"out_of_beat",refined:!1,has_cuts:!1,cut_snap:"no_data",fps:null});continue}if(K(U,F)){J.push({beat:Q.beat,clip_id:q.clip_id,track_st:null,status:"rejected",code:"overlap",refined:!1,has_cuts:!1,cut_snap:"no_data",fps:null});continue}G(q,U,F,!0)}for(let q of V){let U=q.clip_ed-q.clip_st,F=Q.track_st,M=!1;for(let R of[...z].sort((D,O)=>D.track_st-O.track_st)){if(R.track_st-F>=Math.min(U,cZ)){G(q,F,Math.min(F+U,R.track_st),!1),M=!0;break}F=Math.max(F,R.track_ed)}if(!M)if(Q.track_ed-F>=Math.min(U,cZ))G(q,F,Math.min(F+U,Q.track_ed),!1);else J.push({beat:Q.beat,clip_id:q.clip_id,track_st:null,status:"rejected",code:"no_room",refined:!1,has_cuts:!1,cut_snap:"no_data",fps:null})}let $=[],H=Q.track_st;for(let q of[...z].sort((U,F)=>U.track_st-F.track_st)){if(q.track_st-H>=cZ)$.push({st:H,ed:q.track_st});H=Math.max(H,q.track_ed)}if(Q.track_ed-H>=cZ)$.push({st:H,ed:Q.track_ed});let N=[...z];return $.forEach((q,U)=>{let F={...Q,beat:`${Q.beat}~d${U}`,track_st:q.st,track_ed:q.ed,direct_slots:void 0};N.push(...KQ({...Z,beat:F}))}),N.sort((q,U)=>q.track_st-U.track_st),{slots:N,direct:J}}function pU(Z,Q){let Y=[...Q].sort((X,W)=>X.track_st-W.track_st),J=[],z=Z.track_st;for(let X of Y){if(X.track_st-z>M9)J.push({st:z,ed:X.track_st});z=Math.max(z,X.track_ed)}if(Z.track_ed-z>M9)J.push({st:z,ed:Z.track_ed});return J}function iU(Z){let{beat:Q,slots:Y}=Z,J=M9,z,X=()=>{if(!z)z=w5(Q,0,{noImage:Z.noImage,dedupScope:Z.dedupScope}).flatMap((V)=>V.pool).filter((V)=>!n0(V)).sort((V,K)=>K.rank-V.rank||K.fused-V.fused||K.seg.score-V.seg.score);return z},W=(V)=>{for(let K of Q.queries)for(let G of K.results??[]){if(G.clip_id!==V.clip_id||G.kind==="image")continue;for(let $ of G.segments??[])if($.start<=V.clip_st+0.000001&&V.clip_ed<=$.end+0.000001)return{lo:$.start,hi:$.end,...typeof G.duration==="number"?{dur:G.duration}:{}};if(!G.segments?.length)return{lo:0,hi:G.duration??V.clip_ed,...typeof G.duration==="number"?{dur:G.duration}:{}}}return};for(let V of pU(Q,Y)){let K=V.st;while(V.ed-K>=cZ-J){let $=!1;for(let H of X()){if(Z.consumed.has(H.key))continue;let N=V.ed-K;if(R9(H)<Math.min(cZ,N))continue;let q=Z.beatOwners.get(H.cand.clip_id);if(q!==void 0&&q!==0)continue;let U=VQ(H,y5(H,Math.min(N,R9(H))),N);if(!U)continue;let F=U.clipEd-U.clipSt,M={clip_id:H.cand.clip_id,query:H.query,score:H.seg.score,...d0(U.clipSt,K,F),gap_fill:!0};if(Y.push(M),H.pinned)Z.pinnedPlaced?.add(D9(H.cand.clip_id,H.seg));Z.consumed.add(H.key),Z.beatOwners.set(H.cand.clip_id,0),Z.entries.push({beat:Q.beat,kind:"candidate",clip_id:H.cand.clip_id,track_st:M.track_st,track_ed:M.track_ed,sec:MZ(F)}),K+=F,$=!0;break}if(!$)break}let G=0.05;if(V.ed-K>J){let $=Y.find((H)=>Math.abs(H.track_ed-K)<=J);if($&&$.material_id===void 0){let H=W($);if(H){let N=V.ed-K,q=N<=G?Math.min(H.hi+N,H.dur??H.hi+N):H.hi,U=Math.min(N,Math.max(0,q-$.clip_ed));if(U>J){{let F=d0($.clip_st,$.track_st,$.clip_ed+U-$.clip_st);$.clip_ed=F.clip_ed,$.track_ed=F.track_ed}Z.entries.push({beat:Q.beat,kind:"extend",clip_id:$.clip_id,track_st:MZ(K),track_ed:MZ(K+U),sec:MZ(U)}),K=$.track_ed}}}}if(V.ed-K>J){let $=Y.find((H)=>Math.abs(H.track_st-V.ed)<=J);if($&&$.material_id===void 0){let H=W($);if(H){let N=V.ed-K,q=N<=G?Math.max(0,H.lo-N):H.lo,U=Math.min(N,Math.max(0,$.clip_st-q));if(U>J){{let F=MZ($.clip_st-U),M=d0(F,$.track_st-U,$.clip_ed-F);$.clip_st=M.clip_st,$.track_st=M.track_st,$.clip_ed=M.clip_ed,$.track_ed=M.track_ed}Z.entries.push({beat:Q.beat,kind:"extend",clip_id:$.clip_id,track_st:$.track_st,track_ed:MZ(V.ed),sec:MZ(U)})}}}}}Y.sort((V,K)=>V.track_st-K.track_st)}function x5(Z,Q,Y,J={}){let z=new Map,X=new Set,W=new Set,V={emptySlots:0,emptySlotsByRefine:0,hotSlotsPlaced:0,blurrySlotsPlaced:0,adjacentWaived:0,pinnedPlaced:0,pinnedYielded:0},K={hit:new Set,neutral:new Set,hlHit:new Set,hlNeutral:new Set},G=new Set,$=[],H=[],N=J.cutAlign&&J.cutAlign.ratio>0&&J.cutAlign.starts.length>0?J.cutAlign:void 0,q=N?.ratio??0;if(N&&!N.calibrated&&N.ratio<1){let E=x5(Z,Q,Y,{...J,cutAlign:{ratio:1,starts:N.starts,calibrated:!0}}).cutAlign?.ratio??0;q=E>0?Math.min(1,N.ratio/E):1}let U=new Map,F=(P)=>{if(!N)return;let E=U.get(P);if(!E)E={chances:0,snapped:0},U.set(P,E);return{ratio:q,starts:N.starts,state:E}},M=new Map;for(let P of Z.beats)for(let E of P.queries)for(let I of E.results??[]){let y=I.fps;if(typeof y==="number"&&Number.isFinite(y)&&y>0&&!M.has(I.clip_id))M.set(I.clip_id,y)}let R=(P)=>M.get(P),D=new Map;for(let P of Z.beats){let E=[],I=new Map;D.set(P.beat,I);for(let y=0;y<Math.max(0,Q);y++){let h={beat:P,trackOrder:y,consumed:W,scoreFloor:Y,noImage:J.noImage,dedupScope:J.dedupScope,markWeight:J.markWeight,markLookup:J.markLookup,highlightWeight:J.highlightWeight,highlightLookup:J.highlightLookup,markStats:K,beatOwners:I,stats:V,pinnedPlaced:G,cutAlign:F(y),fpsOf:R},v;if(y===0&&P.arrange_mode==="direct"&&Array.isArray(P.direct_slots)&&P.direct_slots.length){let S=nU(h);v=S.slots,H.push(...S.direct)}else if(y===0&&Array.isArray(P.anchors)&&P.anchors.length){let S=lU(h);v=S.slots,$.push(...S.anchors)}else v=KQ(h);E.push(v);for(let S of v)X.add(S.clip_id)}z.set(P.beat,E)}let O=new Set;for(let P of Z.beats)for(let E of P.queries)for(let I of E.results??[]){if(I.pinned!==!0)continue;for(let y of y6(I))O.add(D9(I.clip_id,y))}let C;if(J.gapFill==="fast"&&Math.max(0,Q)>0){C=[];for(let P of Z.beats){let E=z.get(P.beat)?.[0];if(!E)continue;iU({beat:P,slots:E,consumed:W,beatOwners:D.get(P.beat),noImage:J.noImage,dedupScope:J.dedupScope,entries:C,pinnedPlaced:G});for(let I of E)X.add(I.clip_id)}}V.pinnedPlaced=G.size;let T=[...O].filter((P)=>!G.has(P));V.pinnedYielded=T.length;let _;if(N){let P=IU({beats:Z.beats.map((E)=>({track_st:E.track_st,track_ed:E.track_ed,slots:z.get(E.beat)?.[0]??[]})),starts:N.starts});_={target:N.ratio,...P}}return{fills:z,clipIds:X,stats:V,pinnedOutcome:{requested:[...O],yielded:T},markStats:{hit:K.hit.size,neutral:K.neutral.size,hlHit:K.hlHit.size,hlNeutral:K.hlNeutral.size},anchors:$,...H.length?{direct:H}:{},..._?{cutAlign:_}:{},...C?{gapFills:C}:{}}}function k5(Z){return Z.some((Q)=>{let Y=Array.isArray(Q.track_timeline)?Q.track_timeline:[];return Y.length>0&&Y.some((J)=>{let z=typeof J?.material==="string"?J.material:"";return!(z.startsWith(s8)||z.startsWith(j9))})})}var yJ=(Z)=>`${Z.kind==="black"?"黑底轨":"候选轨"}#${Z.trackIndex}=${Z.clipCount} clip`;function oU(Z){if(!Z||typeof Z!=="object")return[];let Q=Z,Y=Array.isArray(Q.beats)?Q.beats:[],J=Q.track_layers&&typeof Q.track_layers==="object"?Q.track_layers:{},z=[],X=new Map;for(let W of Y)for(let V of Array.isArray(W?.laid)?W.laid:[]){let{track_index:K,slots:G}=V;if(typeof K!=="number"||!Array.isArray(G)||G.length===0)continue;let $=X.get(K)??{count:0};$.count+=G.length;let H=V.source_layer;if(!$.layer&&A5(H))$.layer=H;X.set(K,$)}for(let[W,V]of[...X.entries()].sort((K,G)=>K[0]-G[0])){let K=J[String(W)],G=V.layer??(A5(K)?K:void 0);z.push({kind:"candidate",trackIndex:W,clipCount:V.count,...G?{layer:G}:{}})}if(typeof Q.black_track==="number"){let W=Y.filter((K)=>Array.isArray(K?.laid)&&K.laid.length>0).map((K)=>({track_st:Number(K.track_st),track_ed:Number(K.track_ed)})),V=v5(W).length;if(V>0)z.push({kind:"black",trackIndex:Q.black_track,clipCount:V})}return z}function rU(Z,Q,Y){let J=null,z=Number.POSITIVE_INFINITY;for(let X of Z){if(X.clipCount!==Q)continue;let W=Y===null?0:Math.abs(X.trackIndex-Y);if(W<z||W===z&&J!==null&&X.trackIndex<J.trackIndex)J=X,z=W}return J}function xJ(Z,Q,Y={}){let J=Array.isArray(Z.track_timeline)?Z.track_timeline:[],z=typeof Z.track_index==="number"?Z.track_index:null,X=J.map((q)=>typeof q?.material==="string"?q.material:""),W=X.filter((q)=>q.startsWith(kJ)).length,V=X.filter((q)=>!(q.startsWith(s8)||q.startsWith(j9))).length,K={trackIndex:z,clipCount:J.length,rawClips:W,foreignClips:V,samples:[...new Set(X.filter(Boolean))].slice(0,2),matched:null},G=Y.registered??Q.length>0;if(J.length===0)return{...K,cls:"user",reason:"空轨(track_timeline 为空)"};if(!G)return{...K,cls:"user",reason:"盘上无 struct_meta.broll 登记(或上轮一条都没铺成):宁留勿删"};if(W>0)return{...K,cls:"self-produced-edited",reason:`${W}/${J.length} 个 clip 的 material 已是 broll-raw-*(你在客户端确认过原片)`};if(V>0)return{...K,cls:"user",reason:`${V}/${J.length} 个 clip 的 material 非自产前缀(用户轨 / 混合轨)`};let $=Y.matched!==void 0?Y.matched:rU(Q,J.length,z);if($)return{...K,matched:$,cls:"self-produced",reason:`与登记吻合(${yJ($)})`};let H=new Set(Y.layTracks??[]).has(z??Number.NaN),N=Q.length?Q.map(yJ).join("、"):"(登记里一条自产轨都没有)";if(H)return{...K,cls:"self-produced-edited",reason:`clip 数 ${J.length} 与登记的自产轨条数都对不上(登记:${N}),而该 track_index 在 lay_tracks 在册`};return{...K,cls:"user",reason:`clip 数 ${J.length} 对不上任何登记指纹(登记:${N})且 track_index 不在 lay_tracks 在册:按用户轨保留`}}function aU(Z,Q,Y=[]){let J=Q.length>0,z=Z.map((V,K)=>({i:K,idx:typeof V.track_index==="number"?V.track_index:null,v:xJ(V,[],{registered:!0,matched:null})})).filter((V)=>V.v.clipCount>0&&V.v.rawClips===0&&V.v.foreignClips===0),X=new Map,W=new Set;for(let V of Q){let K=-1,G=Number.POSITIVE_INFINITY,$=Number.POSITIVE_INFINITY;for(let H of z){if(W.has(H.i)||H.v.clipCount!==V.clipCount)continue;let N=H.idx??Number.MAX_SAFE_INTEGER,q=Math.abs(N-V.trackIndex);if(q<G||q===G&&N<$)K=H.i,G=q,$=N}if(K>=0)W.add(K),X.set(K,V)}return Z.map((V,K)=>xJ(V,Q,{layTracks:Y,registered:J,matched:X.get(K)??null}))}function sU(Z,Q){if(Q)return Q;let Y=(Array.isArray(Z.track_timeline)?Z.track_timeline:[]).map((J)=>typeof J?.material==="string"?J.material:"");if(Y.length&&Y.every((J)=>J.startsWith(C0)))return"local";return}function uJ(Z){let Q=[...Z.video_track??[]],Y=(Z.struct_meta??{}).broll,J=new Set(Array.isArray(Y?.lay_tracks)?Y.lay_tracks.filter((V)=>typeof V==="number"):[]),z=aU(Q,oU(Y),J),X=Q.filter((V,K)=>z[K].cls==="self-produced-edited"),W=X.map((V)=>typeof V.track_index==="number"?V.track_index:-1).filter((V)=>V>=0);return{videoTracks:Q,verdicts:z,prevBroll:Y,prevIndices:J,editedTracks:X,keptEditedTracks:W}}function mJ(Z,Q){let Y=[];for(let J of Z){if(J.cls!=="self-produced-edited")continue;let z=J.samples.length?`,material 样例 ${J.samples.join(" / ")}`:"";Y.push(`候选轨 track_index=${J.trackIndex} 判定为「已被你编辑」:${J.reason}(该轨 ${J.clipCount} clip${z})。`+(Q?"已按 --force-relay 强制剥离重铺。":"本次不剥它、也不铺新轨——在客户端处置该轨后重跑,或加 --force-relay 强剥重铺。"))}return Y}function cJ(Z,Q=!1){let{verdicts:Y,editedTracks:J,keptEditedTracks:z}=uJ(Z);return{refused:J.length>0&&!Q,keptEditedTracks:z,warnings:mJ(Y,Q)}}function f5(Z){let{gtrk:Q,plan:Y,lay:J,fills:z,downloads:X}=Z,W=Z.blackBed!==!1,V=Z.forceRelay===!0,K=Z.sourceLayer??(Y.member_type==="local"?"local":"common"),G=[],$=[...Q.materials??[]],H={...Q.struct_meta??{}},{videoTracks:N,verdicts:q,prevBroll:U,prevIndices:F,editedTracks:M,keptEditedTracks:R}=uJ(Q),D=[],O=[],C=[],T=[];for(let m=0;m<N.length;m++){let o=N[m],r=q[m];if(r.cls==="self-produced-edited"){if(V)D.push(o);else O.push(o);continue}if(r.cls!=="self-produced"){O.push(o);continue}if(r.matched?.kind==="black"){D.push(o);continue}let GZ=sU(o,r.matched?.layer);if(GZ===K)D.push(o);else if(GZ!==void 0)C.push({track:o,layer:GZ,oldIndex:typeof o.track_index==="number"?o.track_index:0});else{if(O.push(o),typeof o.track_index==="number")T.push(o.track_index);G.push(`存量自产轨 track_index=${o.track_index} 无 source_layer 层登记、也无法从材料前缀推断层归属:`+"按过渡期保守口径保留不剥(本轮新轨照常追加)。要重铺它请在客户端删除该轨后重跑,或先跑一轮对应层的铺轨重建登记。")}}let _=[...O,...C.map((m)=>m.track)];if(G.push(...mJ(q,V)),M.length>0&&!V){let m=0;for(let o of Y.beats)if(F9(o).length>0)m++;return G.push("本次未铺任何轨、工程文件零改动(.gtrk 未写回、struct_meta.broll 未刷新);"+"broll-plan.json 与已落盘的 preview 代理照常产出/复用。"),{next:Q,summary:{sourceLayer:K,laidTracks:[],laidClips:0,beatsWithCandidates:m,blackTrack:null,removedTracks:[],keptEditedTracks:R,refused:!0,blackBedSkipped:null,blackBedHoleSec:0,blackBedHoles:[]},broll:U??{contract_version:"v1",generated_at:Z.generatedAt,plan_path:Z.planPath,lay_tracks:[],black_track:null,holes:[],confirmed:!1,beats:[]},warnings:G}}let P=new Set;for(let m of D)for(let o of m.track_timeline??[]){let r=o.material;if(typeof r==="string"&&(r.startsWith(s8)||r.startsWith(j9)))P.add(r)}let E=new Set;for(let m of[_,Q.beat_track??[],Q.audio_track??[]])for(let o of m)for(let r of o.track_timeline??[])if(typeof r.material==="string")E.add(r.material);for(let m of E)P.delete(m);let I=$.filter((m)=>!(typeof m.id==="string"&&P.has(m.id)));if(V){let m=[...P].filter((o)=>o.startsWith(kJ)).length;if(m>0)G.push(`--force-relay:本次强制剥离将删除 ${m} 条 broll-raw-* 素材登记,`+"gtrk/assets/broll/ 下对应的已下载原片文件会就地成孤儿(CLI 不删字节,但工程里再无引用)。")}for(let m of _){let o=m.track_timeline??[];if(!o.length)continue;if(o.every((r)=>typeof r.material==="string"&&r.material.startsWith(j9)))G.push(`检测到疑似手工纯色底轨(track_index=${m.track_index}):与自动黑底垫轨功能重复。建议删除该轨后重跑,或用 --no-black-bed 保留手工轨。`)}let y=Array.isArray(Q.video_size)?Q.video_size:[1920,1080],h=O.reduce((m,o)=>Math.max(m,typeof o.track_index==="number"?o.track_index:0),-1)+1,v=k5(O),S=W&&v?1:0,k={local:0,concept:0,common:0};for(let m of C)k[m.layer]++;let c={},a=h+S;for(let m of[...T5].reverse())c[m]=a,a+=m===K?Math.max(0,J):k[m];let u=new Map,l=[];for(let m of T5){if(m===K)continue;C.filter((r)=>r.layer===m).sort((r,GZ)=>r.oldIndex-GZ.oldIndex).forEach((r,GZ)=>{let WZ=c[m]+GZ;u.set(r.oldIndex,{newIndex:WZ,layer:m}),l.push(r.oldIndex===WZ?r.track:{...r.track,track_index:WZ})})}let f=new Map;for(let m of Y.beats)for(let o of F9(m))if(!f.has(o.clip_id))f.set(o.clip_id,o);let n=Z.gapFill&&Z.gapFill.mode!=="none"?Z.gapFill:void 0,QZ=c[K],zZ=T5.some((m)=>m!==K&&k[m]>0&&c[m]<QZ),BZ=n!==void 0&&!v&&O.length===0&&!zZ&&Math.max(0,J)>0,PZ=[],oZ=!1,mZ=[],bZ=new Map,pZ=new Map,xZ=0,x8=0;for(let m of Y.beats){let o=F9(m);if(o.length>0)x8++;let r=z.get(m.beat)??[],GZ=[];for(let x=0;x<r.length;x++){let g=r[x].filter((YZ)=>(!YZ.gap_fill||BZ)&&(X.has(YZ.clip_id)||YZ.material_id!==void 0&&Z.injectedMaterials?.has(YZ.material_id)));if(!g.length)continue;let t=c[K]+x,FZ=pZ.get(t)??[];g.forEach((YZ,SZ)=>{let rZ=YZ.material_id??_0(YZ.clip_id);if(!bZ.has(rZ)){let Z8=YZ.material_id!==void 0?Z.injectedMaterials?.get(YZ.material_id):void 0;if(Z8)bZ.set(rZ,{...Z8});else{let aZ=f.get(YZ.clip_id),f8=X.get(YZ.clip_id),h8={id:rZ,path:f8.rel};if(typeof aZ?.duration==="number")h8.duration=aZ.duration;if(f8.source==="local"){if(aZ?.width&&aZ?.height)h8.video_size=[aZ.width,aZ.height]}else{let hQ=hU(aZ?.width,aZ?.height);if(hQ)h8.video_size=hQ}if(typeof aZ?.fps==="number")h8.video_rate=aZ.fps;bZ.set(rZ,h8)}}let vZ={clip_id:`${m.beat}-broll-${x}-${SZ}`,material:rZ,clip_st:YZ.clip_st,clip_ed:YZ.clip_ed,track_st:YZ.track_st,track_ed:YZ.track_ed,duration:MZ(YZ.track_ed-YZ.track_st)};bU(vZ,`${m.beat} 轨${t} 槽${SZ}`),FZ.push(vZ),xZ++}),pZ.set(t,FZ),GZ.push({order:x,clip_id:g[0].clip_id,track_index:t,slots:g,source_layer:K})}if(BZ){let x=GZ.find((t)=>t.order===0),{holes:g}=wJ({beats:[{beat:m.beat,track_st:m.track_st,track_ed:m.track_ed,slots:x?.slots??[]}]});if(g.length)if(!S6([y[0],y[1]])){if(!oZ)oZ=!0,G.push(`画布尺寸非法(${y[0]}x${y[1]}),主轨 gap 黑片兜底跳过——主轨仍有 gap,客户端若开主轨磁吸请注意与配音错位的风险。`)}else{let t=y[0],FZ=y[1],YZ=_5({hex:l0,width:t,height:FZ});if(!bZ.has(YZ))bZ.set(YZ,{id:YZ,path:WQ({hex:l0,width:t,height:FZ}),video_size:[t,FZ]});let SZ=pZ.get(QZ)??[],rZ=x;if(!rZ)rZ={order:0,clip_id:YZ,track_index:QZ,slots:[],source_layer:K},GZ.push(rZ),GZ.sort((vZ,Z8)=>vZ.order-Z8.order);g.forEach((vZ,Z8)=>{let aZ=MZ(vZ.track_ed-vZ.track_st);SZ.push({clip_id:`${m.beat}-gapfill-${Z8}`,material:YZ,clip_st:0,clip_ed:aZ,track_st:vZ.track_st,track_ed:vZ.track_ed,duration:aZ}),rZ.slots.push({clip_id:YZ,query:"gap_fill",score:0,clip_st:0,clip_ed:aZ,track_st:vZ.track_st,track_ed:vZ.track_ed,gap_fill:!0}),PZ.push({beat:m.beat,kind:"solid",track_st:vZ.track_st,track_ed:vZ.track_ed,sec:vZ.sec}),xZ++}),pZ.set(QZ,SZ),rZ.slots.sort((vZ,Z8)=>vZ.track_st-Z8.track_st)}}let WZ={beat:m.beat,track_st:m.track_st,track_ed:m.track_ed,candidates:o.slice(0,S5).map((x)=>{let g=X.get(x.clip_id),t=x.segments?.[0],FZ=x.source==="local"||typeof x.local_path==="string",YZ={clip_id:x.clip_id,score:x.score,cover_url:x.cover_url??null,preview_path:FZ?null:g?.rel??null,source:g?.source??(FZ?"local":null),raw_url:x.url??null,seg:t?{start:t.start,end:t.end,best:t.best}:null,source_layer:K};if(FZ){if(typeof x.local_path==="string")YZ.local_path=x.local_path;if(YZ.cover_path=Z.covers?.get(x.clip_id)??null,x.kind==="image"&&typeof x.local_path==="string")YZ.source_image_path=x.local_path}return YZ}),laid:GZ,pinned:null};if(typeof m.per_shot_sec==="number")WZ.per_shot_sec=m.per_shot_sec;mZ.push(WZ)}let k8;if(BZ&&n){let o=[...n.planned.filter((r)=>r.clip_id!==void 0&&X.has(r.clip_id)),...PZ].sort((r,GZ)=>r.track_st-GZ.track_st||r.track_ed-GZ.track_ed);k8={mode:n.mode,filledSec:MZ(o.reduce((r,GZ)=>r+GZ.sec,0)),fills:o}}let L8=[...pZ.entries()].filter(([,m])=>m.length>0).sort((m,o)=>m[0]-o[0]).map(([m,o])=>({track_index:m,track_size:[y[0],y[1]],muted:!0,track_timeline:o.sort((r,GZ)=>r.track_st-GZ.track_st)}));{let m=new Map;for(let[o,r]of u)m.set(o,r);for(let o of T)if(!m.has(o))m.set(o,{newIndex:o});if(U&&m.size>0){let o=new Map(mZ.map((r)=>[r.beat,r]));for(let r of Array.isArray(U.beats)?U.beats:[]){if(!r||typeof r!=="object")continue;let GZ=(Array.isArray(r.laid)?r.laid:[]).filter((g)=>typeof g?.track_index==="number"&&m.has(g.track_index)).map((g)=>{let t=m.get(g.track_index);return{...g,track_index:t.newIndex,...t.layer?{source_layer:t.layer}:{}}}),WZ=(Array.isArray(r.candidates)?r.candidates:[]).filter((g)=>A5(g?.source_layer)&&g.source_layer!==K);if(!GZ.length&&!WZ.length)continue;let x=o.get(r.beat);if(x){x.laid.push(...GZ);for(let g of WZ)if(!x.candidates.some((t)=>t.clip_id===g.clip_id&&t.source_layer===g.source_layer))x.candidates.push(g)}else{let g={...r,candidates:WZ,laid:GZ};mZ.push(g),o.set(g.beat,g)}}}}let EZ=L8.length>0||l.length>0||T.length>0,b0=W&&!v&&EZ?"audio_driven":null,IZ=null,l8=null;if(W&&v&&EZ)if(!S6([y[0],y[1]]))G.push(`画布尺寸非法(${y[0]}x${y[1]}),跳过铺纯黑底轨(候选轨照常铺)。`);else{let m=mZ.filter((r)=>r.laid.length>0).map((r)=>({track_st:r.track_st,track_ed:r.track_ed})),o=v5(m);if(o.length>0){let r=y[0],GZ=y[1],WZ=_5({hex:l0,width:r,height:GZ});bZ.set(WZ,{id:WZ,path:WQ({hex:l0,width:r,height:GZ}),video_size:[r,GZ]}),IZ=h,l8={track_index:IZ,track_size:[r,GZ],muted:!0,track_timeline:o.map((x,g)=>({clip_id:`blackbed-${g}`,material:WZ,clip_st:0,clip_ed:MZ(x.track_ed-x.track_st),track_st:x.track_st,track_ed:x.track_ed,duration:MZ(x.track_ed-x.track_st)}))}}}if(W&&v&&EZ&&IZ===null)G.push("异常:本轮有 B-roll 内容轨在场、也没有 --no-black-bed,却没能铺出纯黑底垫轨 —— "+"这些 B-roll 段落底下会直接露出口播 A-roll。请回报此告警(含本轮命令行)以便定位。");let X8=[],RZ=0;if(IZ!==null){let m=mZ.filter((WZ)=>WZ.laid.length>0).map((WZ)=>({beat:WZ.beat,track_st:WZ.track_st,track_ed:WZ.track_ed,slots:WZ.laid.flatMap((x)=>x.slots)}));({holes:X8,totalSec:RZ}=wJ({beats:m}));let o=new Map(m.map((WZ)=>[WZ.beat,WZ.track_ed-WZ.track_st])),r=new Map;for(let WZ of X8){let x=r.get(WZ.beat);if(!x)r.set(WZ.beat,{sec:WZ.sec,longest:WZ});else if(x.sec=MZ(x.sec+WZ.sec),WZ.sec>x.longest.sec)x.longest=WZ}let GZ=[...r.entries()].filter(([WZ,x])=>{let g=o.get(WZ)??0;return x.longest.sec>=kU||g>0&&x.sec/g>=fU});if(GZ.length>0){let WZ=GZ.map(([x,g])=>{let t=o.get(x)??0,FZ=t>0?Math.round(g.sec/t*100):0;return`${x} 纯黑 ${g.sec}s / 占 ${FZ}%(最长一段 ${g.longest.sec}s @ ${g.longest.track_st}–${g.longest.track_ed})`}).join(";");G.push(`黑底空洞:${GZ.length} 个 beat 的黑底之上没有任何 B-roll,这几段现在是纯黑压住口播——${WZ};`+`全片累计纯黑 ${RZ}s。铺轨已照常完成(黑底按 beat 包络整条铺,槽位没填满处就是纯黑,属粗剪期预期内);`+"想调整可:调低 --score-floor 放宽取材、或改用 --no-black-bed 让这些地方露出主轨口播、或到客户端手动往这几段补片。")}}let H8=L8.map((m)=>m.track_index),g0=[...H8,...l.map((m)=>m.track_index),...T].sort((m,o)=>m-o),K0={};for(let m of H8)K0[String(m)]=K;for(let[,m]of u)if(m.layer)K0[String(m.newIndex)]=m.layer;let KZ={contract_version:"v1",generated_at:Z.generatedAt,plan_path:Z.planPath,lay_tracks:(IZ===null?g0:[...g0,IZ]).slice().sort((m,o)=>m-o),track_layers:K0,black_track:IZ,holes:X8.map((m)=>({track_st:m.track_st,track_ed:m.track_ed})),confirmed:!1,beats:mZ},C8=new Map;for(let m of I)if(typeof m.id==="string")C8.set(m.id,m);else C8.set(`__anon_${C8.size}`,m);for(let[m,o]of bZ)C8.set(m,o);let Y9=[...l,...L8].sort((m,o)=>m.track_index-o.track_index);return{next:{...Q,materials:[...C8.values()],video_track:[...O,...Y9,...l8?[l8]:[]],struct_meta:{...H,broll:KZ}},summary:{sourceLayer:K,laidTracks:H8,laidClips:xZ,beatsWithCandidates:x8,blackTrack:IZ,removedTracks:D.map((m)=>typeof m.track_index==="number"?m.track_index:-1).filter((m)=>m>=0).sort((m,o)=>m-o),keptEditedTracks:V?[]:R,refused:!1,blackBedSkipped:b0,blackBedHoleSec:RZ,blackBedHoles:X8,...k8?{gapFill:k8}:{}},broll:KZ,warnings:G}}var dJ="local_broll_cloud_render_rejected";class nJ extends Error{violations;code=dJ;constructor(Z){let Q=Z.slice(0,3).map((Y)=>`${Y.materialId}${Y.path?`(${Y.path})`:""}`).join("、");super(`工程含本地 B-roll 素材(${Z.length} 条,如 ${Q}),已拒绝云端提交`+`(code=${dJ})——`+"本地素材本体不上云是硬承诺,不会静默上传归一化为 file_id。"+"本地 B-roll 工程请走客户端本地出片(或 gtrk render 本地渲染)。");this.violations=Z;this.name="CloudSubmitGuardError"}}function QN(Z,Q){let Y=[],J=Array.isArray(Z.materials)?Z.materials:[];for(let z of J){let X=typeof z.id==="string"?z.id:"";if(!X.startsWith(s8))continue;let W=typeof z.path==="string"?z.path:null;if(X.startsWith(C0)){Y.push({materialId:X,path:W,reason:"broll_local_prefix"});continue}if(W&&lJ(W)){if(!Q){Y.push({materialId:X,path:W,reason:"external_absolute_path"});continue}let V=ZN(h5(Q),h5(W));if(V===""||V.startsWith("..")||lJ(V))Y.push({materialId:X,path:W,reason:"external_absolute_path"})}}return Y}function YN(Z,Q){let Y=QN(Z,Q);if(Y.length)throw new nJ(Y)}async function pJ(Z){let Q;try{let Y=JSON.parse(await tU(Z,"utf8"));if(typeof Y!=="object"||Y===null||Array.isArray(Y))return;Q=Y}catch{return}YN(Q,eU(h5(Z)))}import{join as Yz}from"node:path";import{stat as Jz,mkdir as zz,readFile as Xz,writeFile as Wz}from"node:fs/promises";import{existsSync as Vz}from"node:fs";var g5=V6(k6(),1);import{open as tJ,stat as JN}from"node:fs/promises";import{basename as zN}from"node:path";var eJ=268435456,XN=3,oJ=3,rJ=[2000,4000,8000],WN=2,VN=1,u5=6024,KN=6025,GN=6026,$N=6027,b5=8192,HN=67108864;async function qN(Z){try{let Q=await g5.createBLAKE3();Q.init();let Y=await tJ(Z,"r");try{let J=Buffer.alloc(b5),z=0,X=0;for(;;){let{bytesRead:W}=await Y.read(J,0,b5,X);if(W===0)break;if(z+=b5,z>=HN)break;Q.update(J.subarray(0,W)),X+=W}return Q.digest("hex")}finally{await Y.close()}}catch{return}}async function UN(Z){let Q=await g5.createBLAKE3();return Q.init(),Q.update(Z),Q.digest("hex")}class P9 extends Error{constructor(){super("分片会话已失效");this.name="SessionGoneError"}}function NN(Z){let Q=String(Z?.message??Z);return/fetch failed|ECONNRESET|ETIMEDOUT|EPIPE|UND_ERR|服务响应解析失败 \(HTTP 5/i.test(Q)}async function BN(Z){await new Promise((Q)=>setTimeout(Q,Z))}async function Zz(Z,Q,Y){let J=(await JN(Q)).size,z=zN(Q);for(let X=0;;X++)try{return await jN(Z,Q,z,J,Y)}catch(W){if(W instanceof P9&&X<VN){await Y.store.clear(Y.fingerprint),j.warn("云端分片会话已失效,自动重建整传一次");continue}throw W}}async function jN(Z,Q,Y,J,z){let{fingerprint:X,store:W,force:V}=z,K=V?void 0:await W.load(X),G;if(K){let $=await aJ(Z,K.uploadId);if($===void 0)await W.clear(X),K=void 0;else if(K={...K,partSize:$.part_size,totalParts:$.total_parts},G=$.missing,G.length<K.totalParts)j.info(`断点续传:云端已有 ${K.totalParts-G.length}/${K.totalParts} 片,补 ${G.length} 片`)}if(!K){let $=V?void 0:await qN(Q),H={filename:Y,size:J};if($)H.blake3_id=$;let N=await fetch(`${Z.base}/base/file/upload/chunk/init`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(H)}),q=await tZ(N);if(q.code!==200)throw Error(`分片上传 init 失败 (code=${q.code??"?"}):${q.msg??"未知错误"}`);if(q.data?.file_id!=null)return j.info("秒传命中:云端已有同内容文件,零字节上传"),String(q.data.file_id);if(q.data?.upload_id==null||!q.data.part_size||!q.data.total_parts)throw Error("分片上传 init 响应缺字段(upload_id/part_size/total_parts)");K={uploadId:String(q.data.upload_id),partSize:q.data.part_size,totalParts:q.data.total_parts,size:J,path:Q,createdAt:Date.now()},await W.save(X,K),G=void 0}if(G===void 0)G=Array.from({length:K.totalParts},($,H)=>H);await sJ(Z,Q,K,G);for(let $=0;;$++){let H=await fetch(`${Z.base}/base/file/upload/chunk/${K.uploadId}/complete`,{method:"POST",headers:{Authorization:Z.apiKey}}),N=await tZ(H);if(N.code===200&&N.data?.file_id!=null)return await W.clear(X),String(N.data.file_id);if(N.code===u5)throw new P9;if(N.code===$N&&$<WN){let q=await aJ(Z,K.uploadId);if(q===void 0)throw new P9;await sJ(Z,Q,K,q.missing);continue}throw Error(`分片上传 complete 失败 (code=${N.code??"?"}):${N.msg??"未知错误"}`)}}async function aJ(Z,Q){let Y=await fetch(`${Z.base}/base/file/upload/chunk/${Q}`,{headers:{Authorization:Z.apiKey}}),J=await tZ(Y);if(J.code===u5)return;if(J.code!==200||!J.data)throw Error(`分片会话查询失败 (code=${J.code??"?"}):${J.msg??"未知错误"}`);return J.data}async function sJ(Z,Q,Y,J){if(J.length===0)return;let{uploadId:z,partSize:X,totalParts:W,size:V}=Y,K=W-J.length,G=await tJ(Q,"r");try{let $=[...J],H=async()=>{let N=Buffer.alloc(X);for(;;){let q=$.shift();if(q===void 0)return;let U=q*X,F=q===W-1?V-U:X,{bytesRead:M}=await G.read(N,0,F,U);if(M!==F)throw Error(`本地文件读取不足(第${q}片期望${F}字节实读${M})——文件被改动?`);let R=N.subarray(0,F);await FN(Z,z,q,R),K++,j.tick(`分片上传 ${K}/${W}(${Math.round(K/W*100)}%)`)}};await Promise.all(Array.from({length:Math.min(XN,J.length)},H))}finally{j.tickEnd(),await G.close()}}async function FN(Z,Q,Y,J){let z=await UN(J),X;for(let W=0;W<=oJ;W++){if(W>0)await BN(rJ[Math.min(W-1,rJ.length-1)]);try{let V=await fetch(`${Z.base}/base/file/upload/chunk/${Q}/${Y}?blake3=${z}`,{method:"PUT",headers:{Authorization:Z.apiKey,"Content-Type":"application/octet-stream"},body:J}),K=await tZ(V);if(K.code===200)return;if(K.code===u5)throw new P9;if(K.code===GN||K.code===KN){X=Error(`第${Y}片被拒 (code=${K.code}):${K.msg??""}`);continue}throw Error(`第${Y}片上传失败 (code=${K.code??"?"}):${K.msg??"未知错误"}`)}catch(V){if(V instanceof P9)throw V;if(!NN(V))throw V;X=V}}throw X instanceof Error?X:Error(`第${Y}片重试${oJ}次仍失败`)}var f6=K9(),c5=Yz(f6,"upload-cache.json"),l5=Yz(f6,"upload-sessions.json");function Kz(Z){return`${Z.size}:${Math.round(Z.mtimeMs)}`}async function MN(Z){return Kz(await Jz(Z))}async function Gz(){if(!Vz(c5))return{};try{return JSON.parse(await Xz(c5,"utf8"))}catch{return{}}}async function $z(Z){await zz(f6,{recursive:!0}),await Wz(c5,JSON.stringify(Z,null,2))}var RN={stat:Jz,uploadFile:AJ,uploadChunked:Zz,cacheStore:{load:Gz,save:$z}};async function V8(Z){let Q=await MN(Z),Y=await Gz();if(Y[Q])delete Y[Q],await $z(Y)}async function m5(){if(!Vz(l5))return{};try{return JSON.parse(await Xz(l5,"utf8"))}catch{return{}}}async function Qz(Z){await zz(f6,{recursive:!0}),await Wz(l5,JSON.stringify(Z,null,2))}var DN={async load(Z){return(await m5())[Z]},async save(Z,Q){let Y=await m5();Y[Z]=Q,await Qz(Y)},async clear(Z){let Q=await m5();if(Q[Z])delete Q[Z],await Qz(Q)}};async function gZ(Z,Q,Y,J=RN){q8();let z=await J.stat(Q),X=Kz(z),W=await J.cacheStore.load(),V=W[X]?.fileId;if(!Y?.force&&V)return{fileId:V,cached:!0};let K=z.size>=eJ?await J.uploadChunked(Z,Q,{fingerprint:X,store:DN,force:Y?.force}):await J.uploadFile(Z,Q),G=await J.stat(Q);if(G.size!==z.size||Math.round(G.mtimeMs)!==Math.round(z.mtimeMs))throw Error("上传过程中输入文件发生变化,请等待文件写入完成后重试");return W[X]={fileId:K,size:G.size,mtimeMs:Math.round(G.mtimeMs),path:Q,uploadedAt:Date.now()},await J.cacheStore.save(W),{fileId:K,cached:!1}}var Hz=6004,O9=[250,750,1500,3000],PN={uploadCached:gZ,invalidateUpload:V8,submitTask:W8,sleep:(Z)=>new Promise((Q)=>setTimeout(Q,Z))};async function ON(Z,Q,Y,J,z,X){for(let W=0;;W++)try{return await X.submitTask(Z,Q,J(Y))}catch(V){if(L0(V)!==Hz||W>=z.length)throw V;await X.sleep(z[W])}}async function R8(Z,Q,Y,J,z={},X=PN){if(/\.gtrk$/i.test(Q))await pJ(Q);let W=await X.uploadCached(Z,Q,{force:z.force});z.onUploaded?.(W);let V=z.visibilityBackoffMs??O9;if(W.cached)try{return{taskId:await X.submitTask(Z,Y,J(W.fileId)),fileId:W.fileId,cached:!0}}catch(G){if(L0(G)!==Hz)throw G;z.onCacheInvalid?.(),await X.invalidateUpload(Q),W=await X.uploadCached(Z,Q,{force:!0})}return{taskId:await ON(Z,Y,W.fileId,J,V,X),fileId:W.fileId,cached:!1}}import{mkdir as kN,stat as fN}from"node:fs/promises";import{closeSync as hN,existsSync as Cz,openSync as bN,readSync as $Q,readdirSync as gN}from"node:fs";import{homedir as uN}from"node:os";import{basename as mN,extname as cN,join as A0}from"node:path";import{spawnSync as Bz}from"node:child_process";import{createHash as LN}from"node:crypto";import{createWriteStream as CN,existsSync as h6,mkdirSync as b6,chmodSync as _N,renameSync as jz,rmSync as p0,readdirSync as TN}from"node:fs";import{createReadStream as AN}from"node:fs";import{once as qz}from"node:events";import{pipeline as EN}from"node:stream/promises";import{basename as IN,dirname as SN,join as T0}from"node:path";var d5="https://api.ai-mcn.tv:9000/broadcast/exe/ffmpeg/dist/manifest.json",Uz=1;function n5(Z){if(!/^https:\/\//i.test(Z))throw Error(`运行时资产下载 MUST 用 https,收到:${Z}`)}var Nz=["win-x64","linux-x64","mac-x64","mac-arm64"];function g6(Z=process.platform,Q=process.arch){let Y={win32:"win",linux:"linux",darwin:"mac"}[Z],J={x64:"x64",arm64:"arm64"}[Q],z=Y&&J?`${Y}-${J}`:"";if(!z||!Nz.includes(z))throw Error(`当前平台 ${Z}-${Q} 无对应的 ffmpeg 分发包(已分发:${Nz.join(" / ")})。`+`请自行安装 ffmpeg/ffprobe 到 ${r8()},或用 --ffmpeg-path <目录> 指定已装位置。`);return z}function vN(Z){if(!Z||typeof Z!=="object")throw Error("manifest 不是对象");let Q=Z;if(typeof Q.schema!=="number")throw Error("manifest 缺 schema 字段");if(Q.schema>Uz)throw Error(`manifest schema=${Q.schema} 高于本 CLI 支持的 ${Uz},请先升级 CLI(gtrk upgrade)`);if(!Q.base||!Q.ffmpeg||!Q.font)throw Error("manifest 缺 base/ffmpeg/font 字段");return n5(Q.base),Q}async function p5(Z=d5){n5(Z);let Q=await fetch(Z);if(!Q.ok)throw Error(`取 manifest 失败:HTTP ${Q.status} ${Z}`);return vN(await Q.json())}async function wN(Z){let Q=LN("sha256");return await EN(AN(Z),Q),Q.digest("hex")}function Fz(){if(process.platform==="win32"){let Z=T0(process.env.SystemRoot||"C:\\Windows","System32","tar.exe");if(h6(Z))return Z}return"tar"}function yN(){try{return Bz(Fz(),["--version"],{stdio:"ignore"}).status===0}catch{return!1}}async function Mz(Z,Q,Y){n5(Z),b6(F0(),{recursive:!0});let J=T0(F0(),`dl-${Date.now()}-${Z.split("/").pop()??"asset"}`);try{let z=await fetch(Z);if(!z.ok)throw Error(`下载失败:HTTP ${z.status} ${Z}`);if(!z.body)throw Error(`下载失败:响应无 body ${Z}`);let X=Number(z.headers.get("content-length")??0),W=0,V=z.body.getReader(),K=CN(J);try{for(;;){let{done:$,value:H}=await V.read();if($)break;if(W+=H.length,Y)Y(W,X);if(!K.write(H))await qz(K,"drain")}}finally{K.end()}await qz(K,"close");let G=await wN(J);if(G!==Q)throw p0(J,{force:!0}),Error(`sha256 校验不通过,已丢弃下载物、未落地任何文件。
|
|
63
63
|
期望 ${Q}
|
|
64
64
|
实得 ${G}
|
|
65
|
-
来源 ${Z}`);return J}catch(z){throw
|
|
66
|
-
`+`Windows 10+/macOS/Linux 通常自带;若确无,请手工解开该 .tar.xz 并把二进制放到 ${Q}。`);
|
|
65
|
+
来源 ${Z}`);return J}catch(z){throw p0(J,{force:!0}),z}}function xN(Z,Q){if(!yN())throw Error(`未找到可用的系统 tar,无法解包 ${Z}。
|
|
66
|
+
`+`Windows 10+/macOS/Linux 通常自带;若确无,请手工解开该 .tar.xz 并把二进制放到 ${Q}。`);b6(Q,{recursive:!0});let Y=Bz(Fz(),["-xf",IN(Z),"-C",Q],{cwd:SN(Z),encoding:"utf8"});if(Y.status!==0)throw Error(`tar 解包失败(code=${Y.status}):${(Y.stderr||"").slice(-300)}`)}async function Rz(Z,Q={}){let Y=g6(),J=Z.ffmpeg[Y];if(!J)throw Error(`manifest 中无 ${Y} 的 ffmpeg 包(可用:${Object.keys(Z.ffmpeg).join(" / ")})。`+`请自行安装到 ${r8()} 或用 --ffmpeg-path。`);let z=r8();if(J.members.every((V)=>h6(T0(z,V)))&&!Q.force)return{installed:!1,reason:"已存在",detail:`${z}(--force 可覆盖)`};let W=await Mz(`${Z.base}/${J.file}`,J.sha256,Q.onProgress);try{let V=T0(F0(),`x-${Date.now()}`);xN(W,V);for(let K of J.members)if(!h6(T0(V,K)))throw p0(V,{recursive:!0,force:!0}),Error(`解包结果缺成员 ${K},已中止,未改动 ${z}`);b6(z,{recursive:!0});for(let K of J.members){let G=T0(z,K);if(p0(G,{force:!0}),jz(T0(V,K),G),process.platform!=="win32")_N(G,493)}return p0(V,{recursive:!0,force:!0}),{installed:!0,detail:`${J.version} → ${z}`}}finally{p0(W,{force:!0})}}async function Dz(Z,Q={}){let Y=[],J=a8();for(let[z,X]of Object.entries(Z.font)){let W=T0(J,X.file);if(h6(W)&&!Q.force){Y.push({installed:!1,reason:"已存在",detail:`${z} → ${W}`});continue}let V=await Mz(X.url,X.sha256,Q.onProgress);b6(J,{recursive:!0}),p0(W,{force:!0}),jz(V,W),Y.push({installed:!0,detail:`${z} → ${W}`})}return Y}function Pz(){try{return TN(a8()).some((Z)=>/\.(otf|ttf|ttc|otc)$/i.test(Z))}catch{return!1}}function lN(Z){if(typeof Z!=="string")return 0;let[Q,Y]=Z.split("/").map(Number);if(!Q||!Y)return Number(Z)||0;return Q/Y}function hZ(Z,Q){let{ffprobe:Y}=AZ(Q),J=N9(Y,["-v","error","-select_streams","v:0","-show_entries","stream=width,height,r_frame_rate,codec_name,pix_fmt","-show_entries","format=duration","-of","json",Z]),z=J.streams&&J.streams[0]||{},X=Number(J.format?.duration)||0;return{width:Number(z.width)||0,height:Number(z.height)||0,fps:lN(z.r_frame_rate),duration:X,codecName:typeof z.codec_name==="string"?z.codec_name:void 0,pixFmt:typeof z.pix_fmt==="string"?z.pix_fmt:void 0}}function _z(Z,Q){let Y;try{let{ffprobe:W}=AZ(Q);Y=N9(W,["-v","error","-select_streams","a:0","-show_entries","stream=channel_layout,channels","-of","json",Z])}catch{return}let J=Y.streams?.[0];if(!J)return;let z=typeof J.channel_layout==="string"?J.channel_layout.trim():"";if(z)return z;let X=Number(J.channels);if(X===1)return"mono";if(X===2)return"stereo";return X>0?String(X):void 0}function U8(Z,Q){let{ffprobe:Y}=AZ(Q),J=N9(Y,["-v","error","-show_entries","format=duration","-of","json",Z]);return Number(J.format?.duration)||0}async function Tz(Z,Q){let Y=await fN(Z),J=mN(Z,cN(Z));return await kN(G9(),{recursive:!0}),A0(G9(),`${J}.${Y.size}_${Math.round(Y.mtimeMs)}.${Q}`)}async function E0(Z,Q){let{ffmpeg:Y}=AZ(Q),J=await Tz(Z,"mp3");if(Cz(J))return J;return await M8(Y,["-y","-v","error","-i",Z,"-vn","-ac","1","-ar","16000","-c:a","libmp3lame","-b:a","64k",J]),J}async function c6(Z,Q){let{ffmpeg:Y}=AZ(Q),J=await Tz(Z,"720p.mp4");if(Cz(J))return J;return await M8(Y,["-y","-v","error","-i",Z,"-vf","scale=-2:720","-c:v","libx264","-preset","veryfast","-crf","28","-c:a","aac","-movflags","+faststart",J]),J}function L9(Z,Q,Y,J=1){let z=U8(Q,Y);if(Z>0&&Math.abs(z-Z)>J)throw Error(`抽出物时长(${z.toFixed(2)}s)与原片(${Z.toFixed(2)}s)不一致(容差 ${J}s),`+"疑似抽取异常,已中止上传")}var Oz=7200;function l6(Z,Q){if(!(Z>Oz))return;let Y=(Z/60).toFixed(1),J=(Z/3600).toFixed(2),z=Oz/3600;throw Error(`源片时长 ${Y}min(${J}h)超过服务端 ${z} 小时上限,已在上传前拦下`+`(零抽取、零上传、零提交、零扣费)。
|
|
67
67
|
`+`出路:先把源片分段,再逐段跑 ${Q.command}。建议每段 ≤ 40 分钟`+`(依据:轮询墙钟 60min ÷ 开分屏实测耗时比上界 1.25× ≈ 48min,取 40 留余量)。
|
|
68
68
|
`+`切段示例(流拷贝、不重编码、秒级完成):
|
|
69
69
|
`+` ffmpeg -ss 0 -t 2400 -i "<源片>" -c copy "<源片名>_seg01.mp4"
|
|
70
70
|
`+` ffmpeg -ss 2400 -t 2400 -i "<源片>" -c copy "<源片名>_seg02.mp4" # 依次类推
|
|
71
|
-
`+`${Q.afterward}`)}function Dz(Z){let Q=new Set;for(let Y of Z.split(/\r?\n/)){if(!Y.startsWith("Style:"))continue;let J=Y.slice(6).split(",")[1]?.trim();if(J)Q.add(J)}return[...Q]}async function xN(Z,Q){let{ffmpeg:Y}=SZ(Q);try{return await M8(Y,["-v","error","-f","lavfi","-i","color=c=black:s=64x64:d=0.04","-vf",`drawtext=font='${Z}':text=A`,"-frames:v","1","-f","null","-"]),!0}catch(J){let z=J instanceof Error?J.message:String(J);if(/valid font|font.*not found|Fontconfig error/i.test(z))return!1;return null}}function jz(Z){return Z.replace(/\\/g,"/").replace(/:/g,"\\:")}function kN(Z){let Q=[];if(Z.length<6)return Q;let Y=Z.readUInt16BE(2),J=Z.readUInt16BE(4);for(let z=0;z<Y;z++){let X=6+z*12;if(X+12>Z.length)break;let V=Z.readUInt16BE(X),W=Z.readUInt16BE(X+6);if(W!==1&&W!==4&&W!==16)continue;let K=Z.readUInt16BE(X+8),G=J+Z.readUInt16BE(X+10);if(G+K>Z.length)continue;let $=Z.subarray(G,G+K),H;if(V===1)H=$.toString("latin1");else{let U=$.length%2===0?$:$.subarray(0,$.length-1);H=Buffer.from(U).swap16().toString("utf16le")}let N=H.replace(/\0/g,"").trim();if(N)Q.push(N)}return Q}function fN(Z){let Q=null;try{Q=EN(Z,"r");let Y=Buffer.alloc(12);if(XQ(Q,Y,0,12,0)<12)return[];let J=[];if(Y.toString("latin1",0,4)==="ttcf"){let X=Y.readUInt32BE(8),V=Buffer.alloc(Math.min(X,64)*4);XQ(Q,V,0,V.length,12);for(let W=0;W<V.length/4;W++)J.push(V.readUInt32BE(W*4))}else J.push(0);let z=[];for(let X of J){let V=X===0?Y:Buffer.alloc(12);if(X!==0&&XQ(Q,V,0,12,X)<12)continue;let W=V.readUInt16BE(4);if(!W||W>512)continue;let K=Buffer.alloc(W*16);if(XQ(Q,K,0,K.length,X+12)<K.length)continue;let G=0,$=0;for(let N=0;N<W;N++)if(K.toString("latin1",N*16,N*16+4)==="name"){G=K.readUInt32BE(N*16+8),$=K.readUInt32BE(N*16+12);break}if(!G||!$||$>1048576)continue;let H=Buffer.alloc($);if(XQ(Q,H,0,$,G)<$)continue;z.push(...kN(H))}return z}catch{return[]}finally{if(Q!==null)try{AN(Q)}catch{}}}var hN=/\.(otf|ttf|ttc|otc)$/i;function d5(Z,Q,Y=0){if(Y>3)return;let J;try{J=IN(Z,{withFileTypes:!0})}catch{return}for(let z of J){let X=_0(Z,z.name);if(z.isDirectory())d5(X,Q,Y+1);else if(hN.test(z.name))for(let V of fN(X))Q.add(V)}}var y6=null;function bN(){if(y6)return y6;let Z=new Set;return d5(o8(),Z),y6=[...Z],y6}function gN(){let Z=SN();if(process.platform==="win32")return[_0(process.env.SystemRoot||"C:\\Windows","Fonts"),_0(process.env.LOCALAPPDATA||_0(Z,"AppData","Local"),"Microsoft","Windows","Fonts")];if(process.platform==="darwin")return["/System/Library/Fonts","/Library/Fonts",_0(Z,"Library","Fonts")];return["/usr/share/fonts","/usr/local/share/fonts",_0(Z,".local/share/fonts"),_0(Z,".fonts")]}var x6=null;function uN(){if(x6)return x6;let Z=new Set;for(let Q of gN())d5(Q,Z);return x6=[...Z],x6}async function Oz(Z,Q,Y,J={}){let{ffmpeg:z}=SZ(J.ffmpegPath),X=`ass='${jz(Q)}'`;if(Nz())X+=`:fontsdir='${jz(o8())}'`;return await M8(z,["-y","-v","error","-i",Z,"-vf",X,"-c:v",J.codec??"libx264","-crf",String(J.crf??18),"-preset","medium","-c:a","copy","-movflags","+faststart",Y]),Y}async function Pz(Z,Q){let Y=bN(),J=uN();if(Y.includes(Z)||J.includes(Z))return!0;if(Y.length===0&&J.length===0)return await xN(Z,Q)!==!1;return!1}import{join as l0,basename as Iz,dirname as YB}from"node:path";import{mkdir as Ez,writeFile as JB}from"node:fs/promises";import{writeFile as mN,unlink as cN,readFile as lN}from"node:fs/promises";import{existsSync as dN}from"node:fs";import{tmpdir as nN}from"node:os";import{isAbsolute as pN,join as iN,resolve as oN}from"node:path";var n5=48000,p5="stereo",rN=18,aN=8,Lz=500,Cz=2,_z=(Z)=>String(Number(Z.toPrecision(6))),a8=(Z)=>Z.toFixed(6),i5=(Z)=>Z.toFixed(3);function Az(Z,Q){let Y=Z.struct_meta?.broll?.black_track??null;if(typeof Y==="number"){let J=Q.filter((z)=>z.track_index!==Y);if(J.length>0)return J[0]}return Q[0]}var sN=(Z)=>Z.material===null||Z.material===void 0;function o5(Z){return Z.map((Q,Y)=>({key:Q.track_index!=null?Q.track_index:Y,t:Q})).sort((Q,Y)=>Q.key-Y.key).map((Q)=>Q.t)}function tN(Z){if(!Number.isFinite(Z))return;if(Z<0)return 10**(Math.max(-60,Math.min(20,Z))/20);if(Z===0)return;return Z}function Tz(Z,Q){let Y=[...Z].sort((X,V)=>Number(X.track_st)-Number(V.track_st)),J=[],z=0;for(let X of Y){let V=Number(X.track_st),W=Number(X.duration);if(W<=0)throw Error(`clip duration 非法: ${JSON.stringify(X)}`);if(V<z-0.000001)throw Error(`track_timeline 时间重叠: track_st=${V} < cursor=${z.toFixed(6)}`);if(V>z+0.000001)J.push({kind:"gap",duration:V-z});if(!sN(X)){let K=typeof X.volume==="number"?X.volume:Q,G=typeof K==="number"?tN(K):void 0;J.push({kind:"clip",material:X.material,clip_st:Number(X.clip_st),duration:W,...typeof G==="number"&&G!==1?{volume:G}:{}})}else J.push({kind:"gap",duration:W});z=V+W}return[J,z]}function eN(Z,Q){let Y=[],J=0,z=0;for(let X of Z){J+=X.duration;let V=Math.round(J*Q);Y.push(V-z),z=V}return Y}function ZB(Z,Q,Y={}){let J=Math.trunc(Y.audio_crossfade_ms??aN),z=Math.max(J,0)/1000,X=o5(Z.video_track||[]);if(X.length===0)throw Error("gtrk v1 缺少 video_track");let V=Az(Z,X),W=o5(Z.audio_track||[]),K=[V,...W].reduce((y,f)=>y+(f.track_timeline?.length||0),0);if(K>Lz)throw Error(`clip 总数 ${K} 超过上限 ${Lz}`);let G=Math.trunc(Z.video_size[0]),$=Math.trunc(Z.video_size[1]),H=Number(Z.video_rate),N=[],U={},q=(y)=>{let f=Q[String(y)];if(f===void 0)throw Error(`gtrk 引用素材 ${y} 缺本地路径`);if(!(f in U))U[f]=N.length,N.push(f);return U[f]},M=[],F=0,R=()=>`s${++F}`,[O,P]=Tz(V.track_timeline),D=[],T=[];for(let y of W){let[f,S]=Tz(y.track_timeline,typeof y.volume==="number"?y.volume:void 0);D.push(f),T.push(S)}let _=T.length?Math.max(P,...T):P;if(_<=0)throw Error("时间线总时长为 0");if(_>P+0.000001)O.push({kind:"gap",duration:_-P});let L=eN(O,H),I=[];O.forEach((y,f)=>{let S=R(),w=L[f];if(y.kind==="clip"){let x=q(y.material),m=y.clip_st,r=y.clip_st+y.duration;M.push(`[${x}:v]trim=start=${a8(m)}:end=${a8(r)},setpts=PTS-STARTPTS,fps=${_z(H)},tpad=stop_mode=clone:stop_duration=${a8(Cz/H)},trim=end_frame=${w},setpts=PTS-STARTPTS,scale=${G}:${$}:force_original_aspect_ratio=decrease,pad=${G}:${$}:(ow-iw)/2:(oh-ih)/2:black,setsar=1,format=yuv420p[${S}]`)}else M.push(`color=black:s=${G}x${$}:r=${_z(H)}:d=${a8((w+Cz)/H)},trim=end_frame=${w},setpts=PTS-STARTPTS,format=yuv420p[${S}]`);I.push(S)}),M.push(I.map((y)=>`[${y}]`).join("")+`concat=n=${I.length}:v=1:a=0[vout]`);let E=[];for(let y=0;y<D.length;y++){let f=D[y],S=T[y];if(_>S+0.000001)f.push({kind:"gap",duration:_-S});let w=[];for(let m of f){let r=R();if(m.kind==="clip"){let c=q(m.material),g=m.clip_st,k=m.clip_st+m.duration,l=[`[${c}:a]atrim=start=${a8(g)}:end=${a8(k)}`,"asetpts=PTS-STARTPTS",`aresample=${n5}`,`aformat=sample_fmts=fltp:channel_layouts=${p5}`];if(typeof m.volume==="number")l.push(`volume=${i5(m.volume)}`);if(z>0)l.push(`afade=t=in:d=${i5(z)}`),l.push(`afade=t=out:st=${a8(Math.max(m.duration-z,0))}:d=${i5(z)}`);M.push(l.join(",")+`[${r}]`)}else M.push(`anullsrc=r=${n5}:cl=${p5},atrim=end=${a8(m.duration)}[${r}]`);w.push(r)}let x=R();M.push(w.map((m)=>`[${m}]`).join("")+`concat=n=${w.length}:v=0:a=1[${x}]`),E.push(x)}if(E.length===0)M.push(`anullsrc=r=${n5}:cl=${p5},atrim=end=${a8(_)}[aout]`);else if(E.length===1)M.push(`[${E[0]}]anull[aout]`);else M.push(E.map((y)=>`[${y}]`).join("")+`amix=inputs=${E.length}:duration=longest:normalize=0[aout]`);return{inputs:N,graph:M.join(";"),total:_}}function QB(Z,Q={}){let Y=new Set,J=o5(Z.video_track||[]),z=J.length?[Az(Z,J),...Z.audio_track||[]]:[...Z.audio_track||[]];for(let V of z){if(!V)continue;for(let W of V.track_timeline||[]){let K=W.material;if(K!=null)Y.add(String(K))}}let X={};for(let V of Z.materials||[]){if(!Y.has(String(V.id)))continue;if(!V.path)throw Error(`gtrk 素材 ${V.id} 缺 path(source_path),无法本地渲染`);let W=!pN(V.path)&&Q.gtrkDir?oN(Q.gtrkDir,V.path):V.path;if(!dN(W))throw Error(`gtrk 素材文件不存在:${V.path}`);X[String(V.id)]=W}return X}async function h6(Z,Q,Y={}){let J=Y.codec??"h264";if(J!=="h264")throw Error(`v1 仅支持 h264,实际 ${J}`);let z=Y.crf??rN,{ffmpeg:X}=SZ(Y.ffmpegPath),V=QB(Z,{gtrkDir:Y.gtrkDir}),{inputs:W,graph:K,total:G}=ZB(Z,V,{crf:z}),$=iN(nN(),`gtrk-filter-${process.pid}-${W.length}.txt`);await mN($,K,"utf8");try{let H=["-y"];for(let N of W)H.push("-i",N);return H.push("-filter_complex_script",$,"-map","[vout]","-map","[aout]","-c:v","libx264","-preset","medium","-crf",String(z),"-c:a","aac","-b:a","192k","-movflags","+faststart",Q),await M8(X,H,Y.onLine),{outputPath:Q,duration:G}}finally{await cN($).catch(()=>{})}}async function b6(Z){return JSON.parse(await lN(Z,"utf8"))}function zB(Z){if(Z.startsWith("jianying"))return"jianying";if(Z.startsWith("capcut"))return"capcut";return Z}var WQ={gtrk:{label:"客户端 (gtrk)",openHint:(Z)=>`客户端里「打开工程」选 ${Z}`},jianying:{label:"剪映 (jianying)",openHint:(Z)=>`剪映里打开即见草稿(目录 ${Z})`},capcut:{label:"CapCut",openHint:(Z)=>`CapCut 里打开即见草稿(目录 ${Z})`},xml:{label:"PR/FCP (Premiere XML)",openHint:(Z)=>`Premiere Pro:文件 > 导入 ${Z}`},fcpxml:{label:"Final Cut (fcpxml)",openHint:(Z)=>`Final Cut Pro:导入 ${Z}`},otio:{label:"OpenTimelineIO",openHint:(Z)=>`用支持 OTIO 的工具打开 ${Z}`}},XB=(Z)=>/HTTP 404/.test(Z);function WB(Z){let Q=Z.materials?.[0]?.path;if(!Q)return;let Y=Iz(Q),J=Y.lastIndexOf(".");return J>0?Y.slice(0,J):Y}async function P9(Z){let{outDir:Q,output:Y,taskId:J}=Z,z=Z.download??h8,X=Y.files??[];if(!X.length)throw Error("任务无工程文件产物(检查 project_formats / 任务是否产出)");let V={...Y.errors??{}};await Ez(Q,{recursive:!0});let W=l0(Q,"result.json"),K=async(U)=>{let q={ok:Object.keys(V).length===0,outDir:Q,files:{},jianyingDraftPath:null,rendered:null,report:Y.report??null,errors:V,taskId:J,fileId:Z.fileId??null,...U};return await JB(W,JSON.stringify(q,null,2)),q};await K({}),j.step("拉回产物到本地…");let G={};for(let U of X){let q=zB(U.format),M=l0(Q,q);await Ez(M,{recursive:!0});let F=l0(M,U.filename);try{await z(U.download_url,F),(G[q]??=[]).push(F),j.info(`${WQ[q]?.label??U.format} ← ${U.filename}`)}catch(R){let O=R instanceof Error?R.message:String(R);if(V[`${U.format}:${U.filename}`]=O,XB(O))j.warn(`产物已过期(${U.filename}):文件已被清理,报告仍可用`);else j.warn(`产物下载失败(${U.filename}):${O}`)}}let $=null;if(G.jianying&&Z.draftDir){let U=l0(Z.draftDir,Iz(Q));try{let q=await G6(l0(Q,"jianying"),U);if(q.complete)$=U,j.info(`剪映草稿已落到:${U}`);else V["jianying:draft"]=`草稿两件套不全(缺 ${q.missing.join("、")}),剪映列表里不会显示:${U}`,j.warn(V["jianying:draft"])}catch(q){V["jianying:draft"]=q instanceof Error?q.message:String(q),j.warn(`剪映草稿落盘失败:${V["jianying:draft"]}`)}}let H=null;if(Z.render){let U=(G.gtrk??[])[0];if(!U)j.warn("已请求 --render,但无可用 gtrk 工程(未产出或已过期),跳过渲染;报告仍已落盘");else{j.step("本地渲染成片(ffmpeg)…");let q=await b6(U),M=Z.projName??WB(q)??J,F=l0(Q,`${M}.mp4`),R=await h6(q,F,{crf:Z.crf!=null?Number(Z.crf):void 0,codec:Z.codec,ffmpegPath:Z.ffmpegPath,gtrkDir:YB(U),onLine:(O)=>{let P=O.match(/time=(\S+)/);if(P)j.tick(`渲染中 ${P[1]}`)}});j.tickEnd(),H=R.outputPath,j.info(`成片:${H}(${R.duration.toFixed(1)}s)`)}}let N=await K({files:G,jianyingDraftPath:$,rendered:H});if(!Z.json&&!Z.quiet){if(Object.keys(G).length)j.step("三方打开(产物已就位,按需自取):");for(let U of Object.keys(G)){let q=WQ[U],M=U==="jianying"?$??l0(Q,"jianying"):G[U][0];console.log(` • ${q?.label??U}:${q?.openHint(M)??M}`)}if(H)console.log(` • 成片 (mp4):${H}`);console.log(` • 结果清单:${W}`)}if(Z.open)M0(Q),j.info("已打开产物目录文件夹");if(Z.json&&!Z.quiet)console.log(JSON.stringify(N));return N}var s5="cli/video_oral_cut_for_cli";function HB(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}var qB=(Z,Q)=>{return Q.push(Z),Q};function UB(Z={}){return{loadConfig:Z.loadConfig??FZ,probe:Z.probe??hZ,extract:Z.extract??T0,compress:Z.compress??k6}}var NB={command:"oralcut",afterward:"各段各出一份工程,逐段精修互不影响。"};function BB(Z){if(Z==="true")return!0;if(Z==="false")return!1;if(Z.trim()!==""&&!Number.isNaN(Number(Z)))return Number(Z);return Z}function jB(Z,Q){let Y={};for(let J of Z){let z=J.indexOf("=");if(z<0)throw Error(`--param 需要 key=value 格式:「${J}」`);Y[J.slice(0,z).trim()]=BB(J.slice(z+1))}if(Q){let J;try{J=JSON.parse(Q)}catch{throw Error(`--params-json 不是合法 JSON:${Q}`)}if(typeof J!=="object"||J===null||Array.isArray(J))throw Error("--params-json 必须是一个 JSON 对象");Object.assign(Y,J)}return Y}function wz(Z){Z.command("oralcut <input>").description("智能口播剪辑闭环:本地抽音频/720p → 只传抽出物 → 云端剪辑 → 拉回 gtrk/剪映/PR →(可选)本地渲染").option("-s, --script <file>","文稿 txt 路径(缺省走无稿智能重建)").option("-p, --preset <preset>","节奏预设 steady|concise|compact","concise").option("-o, --out <dir>","工程产物目录(缺省 = <毛片同目录>/<毛片名>-video-project-<YYMMDD-HHMMSS>)").option("-f, --formats <list>","三方格式(逗号分隔)","gtrk,jianying,xml").option("--jianying-draft-dir <dir>","剪映草稿根目录;传路径或 auto(默认读 gtrk init 配置 / 自动探测)").option("--lang <code>","语言代码(默认 zh-CN;如 en-US / ja-JP)").option("--visual-assist","视觉兜底:本地改传 720p 代理,云端用人脸/说话检测保护并重识别(剪不准/怕剪掉真内容时开)").option("--no-adaptive-rhythm","关闭自适应节奏(默认开;关了改用固定标点停顿表)").option("--render","额外本地渲染成片(ffmpeg 按 gtrk EDL 出 mp4;毛片仍不出本地)").option("--crf <n>","本地渲染视频质量 CRF 14-28(越小越清晰/文件越大,默认 18;需配 --render)").option("--codec <c>","本地渲染视频编码(默认 h264;需配 --render)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--param <k=v>","透传任意云端参数(标量、可重复;如 --param intra_gap_max=0.4)",qB,[]).option("--params-json <json>",`透传任意云端参数(JSON 对象、支持嵌套;如 '{"punctuation_breaks":{"。":0.3}}')`).option("--reupload","强制重新上传,忽略本地上传缓存").option("--no-open","完成后不自动打开产物目录(默认会自动打开)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON(给 agent/脚本解析)").action(async(Q,Y)=>{await FB(Q,Y)})}async function FB(Z,Q,Y={}){if(Q.json)NZ();let J=UB(Y),z=J.loadConfig(),X=r5(Z);if(!vz(X))throw Error(`毛片不存在:${X}`);let V=g6(X,VB(X)),W=Q.formats.split(",").map((T)=>T.trim()).filter(Boolean);if(Q.render&&!W.includes("gtrk"))W.push("gtrk");let K=W.some((T)=>T==="jianying"||T==="capcut"),G=r5(Q.out??a5(Sz(X),`${V}-video-project-${HB()}`)),$=Q.script?r5(Q.script):void 0;if(!$){let T=a5(Sz(X),`${V}.txt`);if(vz(T))$=T,j.info(`自动识别到同名文稿:${T}(按有稿剪辑;不想用就改名或显式 --script)`)}let H=$?await $B($,"utf8"):void 0,N;if(K)if(N=F0(Q.jianyingDraftDir),N)j.info(`剪映草稿目录:${N}`);else j.warn("没找到剪映草稿目录 → 将只产 draft_content.json、缺 meta。可加 --jianying-draft-dir <你的草稿目录> 重跑。");j.step(`▶ 智能口播剪辑:${g6(X)}(预设 ${Q.preset}${Q.visualAssist?" · 视觉兜底(720p)":""},格式 ${W.join("/")}${Q.render?" · 本地渲染":""})`);let U=jB(Q.param,Q.paramsJson);j.step("① 本地预处理(探几何 + 抽音频/720p)…");let q=J.probe(X,Q.ffmpegPath);j.info(`原片几何 ${q.width}x${q.height} @ ${q.fps.toFixed(2)}fps · ${q.duration.toFixed(1)}s`),f6(q.duration,NB);let M=Q.visualAssist?await J.compress(X,Q.ffmpegPath):await J.extract(X,Q.ffmpegPath);O9(q.duration,M,Q.ffmpegPath),j.info(Q.visualAssist?`已压 720p 代理(上传物):${g6(M)}`:`已抽 16k 单声道 mp3(上传物):${g6(M)}`),j.step("② 上传抽出物到云端…");let R=await R8(z,M,s5,(T)=>{let _={file_id:T,la:Q.lang??"zh-CN",project_formats:W,source_path:X,video_size:[q.width,q.height],video_rate:q.fps,video_duration:q.duration,rhythm_preset:Q.preset};if(H)_.script=H;if(N)_.struct_meta={nle_draft_dir:N};if(Q.visualAssist)_.visual_assist=!0;if(Q.adaptiveRhythm===!1)_.adaptive_rhythm=!1;for(let[L,I]of Object.entries(U)){let E=_[L],y=!!E&&!!I&&typeof E==="object"&&typeof I==="object"&&!Array.isArray(E)&&!Array.isArray(I);_[L]=y?{...E,...I}:I}return _},{force:Q.reupload,onUploaded:(T)=>{j.info(T.cached?`命中上传缓存,复用 file_id = ${T.fileId}(免二次上传)`:`file_id = ${T.fileId}`),j.step("③ 提交智能口播剪辑任务…")},onCacheInvalid:()=>j.warn("缓存的 file_id 在云端已失效,重新上传后重试…")}),{taskId:O}=R,P={fileId:R.fileId,cached:R.cached};j.info(`task_id = ${O}`),await KB(G,{recursive:!0}),await GB(a5(G,"task.json"),JSON.stringify({taskId:O,taskType:s5,fileId:P.fileId,source:X,formats:W,createdAt:new Date().toISOString()},null,2)),j.step("④ 云端处理中(每 5s 轮询)…");let D=await N9(z,s5,O,(T,_)=>{j.tick(`${T}${_!=null?` ${Math.round(_)}%`:""}`)});j.tickEnd(),await P9({outDir:G,output:D,taskId:O,fileId:P.fileId,draftDir:N,render:Q.render,crf:Q.crf,codec:Q.codec,ffmpegPath:Q.ffmpegPath,projName:V,json:Q.json,open:Q.open}),j.ok(`闭环完成。产物目录:${G}`)}import{resolve as $7,join as I8,dirname as H7,basename as A0,extname as tz}from"node:path";import{mkdir as q7,writeFile as GQ}from"node:fs/promises";import{existsSync as U7}from"node:fs";var eZ=(Z)=>{let Q=typeof Z==="string"?Z.trim():"";return Q?Q:void 0},X8=(Z)=>typeof Z==="number"&&Number.isFinite(Z)?Z:void 0,s8=(Z)=>Array.isArray(Z)?Z.map((Q)=>eZ(Q)).filter((Q)=>!!Q):[];function b8(Z){let Q=Math.max(0,Math.round((X8(Z)??0)/1000)),Y=Q%60,J=Math.floor(Q/60)%60,z=Math.floor(Q/3600),X=z?String(J).padStart(2,"0"):String(J);return`${z?`${z}:`:""}${X}:${String(Y).padStart(2,"0")}`}var yz=(Z)=>Z.split(/[\\/]/).pop()||Z,u6=(Z)=>Z.replace(/\|/g,"\\|").replace(/\s*\n\s*/g," ");function xz(Z){if(Z==="jumpcut_off")return"未启用跳剪(`--no-jump-cut`),片段按原样保留。";if(Z==="too_short")return"片段过短,跳剪跳过(保留全部内容)。";if(Z==="degraded")return"跳剪降级:本条未压缩,保留全部内容。";return Z}function m6(Z){return X8(Z.total_duration_ms)??X8(Z.duration_ms)}function kz(Z){return X8(Z.segment_count)??(Array.isArray(Z.segments)?Z.segments.length:void 0)}function fz(Z){let Q=Array.isArray(Z.segments)?Z.segments:[];if(Q.length){let z=X8(Q[0]?.begin_time),X=X8(Q[Q.length-1]?.end_time);if(z!=null&&X!=null)return[z,X]}let Y=X8(Z.begin_time),J=X8(Z.end_time);return Y!=null&&J!=null?[Y,J]:void 0}function hz(Z,Q,Y={}){let J=eZ(Z.title),z=[`# clip${Q}${J?`「${J}」`:""}`,""],X=[],V=m6(Z);if(V!=null)X.push(`时长 ${b8(V)}`);let W=kz(Z);if(W!=null)X.push(`${W} 个保留片段`);let K=fz(Z);if(K)X.push(`源片 ${b8(K[0])}–${b8(K[1])}`);if(X.length)z.push(`- ${X.join(" · ")}`,"");let G=X8(Z.score),$=eZ(Z.score_reason);if(G!=null||$)z.push("## 入选理由",""),z.push([G!=null?`**评分 ${G}**`:null,$].filter(Boolean).join(" — "),"");let H=eZ(Z.summary);if(H)z.push("## 简介","",H,"");let N=eZ(Z.jumpcut_note);if(N)z.push("## 跳剪","",xz(N),"");let q=[["主题",s8(Z.themes)],["标签",s8(Z.tags)],["类型",s8(Z.genres)],["调性",s8(Z.moods)]].filter(([,O])=>O.length);if(q.length){z.push("## 分类与调性","");for(let[O,P]of q)z.push(`- ${O}:${P.join("、")}`);z.push("")}let F=(Array.isArray(Z.highlight_words)?Z.highlight_words:[]).map((O)=>({text:eZ(O?.text),at:X8(O?.begin_time)})).filter((O)=>O.text);if(F.length){z.push("## 高光词(源片时码)","");for(let O of F)z.push(`- ${O.at!=null?`${b8(O.at)} `:""}「${O.text}」`);z.push("")}let R=Object.keys(Y).filter((O)=>Y[O]?.length);if(R.length){z.push("## 本条工程文件","");for(let O of R)z.push(`- ${O}:${Y[O].map(yz).join("、")}`);z.push("")}return`${z.join(`
|
|
71
|
+
`+`${Q.afterward}`)}function Az(Z){let Q=new Set;for(let Y of Z.split(/\r?\n/)){if(!Y.startsWith("Style:"))continue;let J=Y.slice(6).split(",")[1]?.trim();if(J)Q.add(J)}return[...Q]}async function dN(Z,Q){let{ffmpeg:Y}=AZ(Q);try{return await M8(Y,["-v","error","-f","lavfi","-i","color=c=black:s=64x64:d=0.04","-vf",`drawtext=font='${Z}':text=A`,"-frames:v","1","-f","null","-"]),!0}catch(J){let z=J instanceof Error?J.message:String(J);if(/valid font|font.*not found|Fontconfig error/i.test(z))return!1;return null}}function Lz(Z){return Z.replace(/\\/g,"/").replace(/:/g,"\\:")}function nN(Z){let Q=[];if(Z.length<6)return Q;let Y=Z.readUInt16BE(2),J=Z.readUInt16BE(4);for(let z=0;z<Y;z++){let X=6+z*12;if(X+12>Z.length)break;let W=Z.readUInt16BE(X),V=Z.readUInt16BE(X+6);if(V!==1&&V!==4&&V!==16)continue;let K=Z.readUInt16BE(X+8),G=J+Z.readUInt16BE(X+10);if(G+K>Z.length)continue;let $=Z.subarray(G,G+K),H;if(W===1)H=$.toString("latin1");else{let q=$.length%2===0?$:$.subarray(0,$.length-1);H=Buffer.from(q).swap16().toString("utf16le")}let N=H.replace(/\0/g,"").trim();if(N)Q.push(N)}return Q}function pN(Z){let Q=null;try{Q=bN(Z,"r");let Y=Buffer.alloc(12);if($Q(Q,Y,0,12,0)<12)return[];let J=[];if(Y.toString("latin1",0,4)==="ttcf"){let X=Y.readUInt32BE(8),W=Buffer.alloc(Math.min(X,64)*4);$Q(Q,W,0,W.length,12);for(let V=0;V<W.length/4;V++)J.push(W.readUInt32BE(V*4))}else J.push(0);let z=[];for(let X of J){let W=X===0?Y:Buffer.alloc(12);if(X!==0&&$Q(Q,W,0,12,X)<12)continue;let V=W.readUInt16BE(4);if(!V||V>512)continue;let K=Buffer.alloc(V*16);if($Q(Q,K,0,K.length,X+12)<K.length)continue;let G=0,$=0;for(let N=0;N<V;N++)if(K.toString("latin1",N*16,N*16+4)==="name"){G=K.readUInt32BE(N*16+8),$=K.readUInt32BE(N*16+12);break}if(!G||!$||$>1048576)continue;let H=Buffer.alloc($);if($Q(Q,H,0,$,G)<$)continue;z.push(...nN(H))}return z}catch{return[]}finally{if(Q!==null)try{hN(Q)}catch{}}}var iN=/\.(otf|ttf|ttc|otc)$/i;function i5(Z,Q,Y=0){if(Y>3)return;let J;try{J=gN(Z,{withFileTypes:!0})}catch{return}for(let z of J){let X=A0(Z,z.name);if(z.isDirectory())i5(X,Q,Y+1);else if(iN.test(z.name))for(let W of pN(X))Q.add(W)}}var u6=null;function oN(){if(u6)return u6;let Z=new Set;return i5(a8(),Z),u6=[...Z],u6}function rN(){let Z=uN();if(process.platform==="win32")return[A0(process.env.SystemRoot||"C:\\Windows","Fonts"),A0(process.env.LOCALAPPDATA||A0(Z,"AppData","Local"),"Microsoft","Windows","Fonts")];if(process.platform==="darwin")return["/System/Library/Fonts","/Library/Fonts",A0(Z,"Library","Fonts")];return["/usr/share/fonts","/usr/local/share/fonts",A0(Z,".local/share/fonts"),A0(Z,".fonts")]}var m6=null;function aN(){if(m6)return m6;let Z=new Set;for(let Q of rN())i5(Q,Z);return m6=[...Z],m6}async function Ez(Z,Q,Y,J={}){let{ffmpeg:z}=AZ(J.ffmpegPath),X=`ass='${Lz(Q)}'`;if(Pz())X+=`:fontsdir='${Lz(a8())}'`;return await M8(z,["-y","-v","error","-i",Z,"-vf",X,"-c:v",J.codec??"libx264","-crf",String(J.crf??18),"-preset","medium","-c:a","copy","-movflags","+faststart",Y]),Y}async function Iz(Z,Q){let Y=oN(),J=aN();if(Y.includes(Z)||J.includes(Z))return!0;if(Y.length===0&&J.length===0)return await dN(Z,Q)!==!1;return!1}import{join as i0,basename as fz,dirname as qB}from"node:path";import{mkdir as kz,writeFile as UB}from"node:fs/promises";import{writeFile as sN,unlink as tN,readFile as eN}from"node:fs/promises";import{existsSync as ZB}from"node:fs";import{tmpdir as QB}from"node:os";import{isAbsolute as YB,join as JB,resolve as zB}from"node:path";var o5=48000,r5="stereo",XB=18,WB=8,Sz=500,vz=2,wz=(Z)=>String(Number(Z.toPrecision(6))),t8=(Z)=>Z.toFixed(6),a5=(Z)=>Z.toFixed(3);function xz(Z,Q){let Y=Z.struct_meta?.broll?.black_track??null;if(typeof Y==="number"){let J=Q.filter((z)=>z.track_index!==Y);if(J.length>0)return J[0]}return Q[0]}var VB=(Z)=>Z.material===null||Z.material===void 0;function s5(Z){return Z.map((Q,Y)=>({key:Q.track_index!=null?Q.track_index:Y,t:Q})).sort((Q,Y)=>Q.key-Y.key).map((Q)=>Q.t)}function KB(Z){if(!Number.isFinite(Z))return;if(Z<0)return 10**(Math.max(-60,Math.min(20,Z))/20);if(Z===0)return;return Z}function yz(Z,Q){let Y=[...Z].sort((X,W)=>Number(X.track_st)-Number(W.track_st)),J=[],z=0;for(let X of Y){let W=Number(X.track_st),V=Number(X.duration);if(V<=0)throw Error(`clip duration 非法: ${JSON.stringify(X)}`);if(W<z-0.000001)throw Error(`track_timeline 时间重叠: track_st=${W} < cursor=${z.toFixed(6)}`);if(W>z+0.000001)J.push({kind:"gap",duration:W-z});if(!VB(X)){let K=typeof X.volume==="number"?X.volume:Q,G=typeof K==="number"?KB(K):void 0;J.push({kind:"clip",material:X.material,clip_st:Number(X.clip_st),duration:V,...typeof G==="number"&&G!==1?{volume:G}:{}})}else J.push({kind:"gap",duration:V});z=W+V}return[J,z]}function GB(Z,Q){let Y=[],J=0,z=0;for(let X of Z){J+=X.duration;let W=Math.round(J*Q);Y.push(W-z),z=W}return Y}function $B(Z,Q,Y={}){let J=Math.trunc(Y.audio_crossfade_ms??WB),z=Math.max(J,0)/1000,X=s5(Z.video_track||[]);if(X.length===0)throw Error("gtrk v1 缺少 video_track");let W=xz(Z,X),V=s5(Z.audio_track||[]),K=[W,...V].reduce((y,h)=>y+(h.track_timeline?.length||0),0);if(K>Sz)throw Error(`clip 总数 ${K} 超过上限 ${Sz}`);let G=Math.trunc(Z.video_size[0]),$=Math.trunc(Z.video_size[1]),H=Number(Z.video_rate),N=[],q={},U=(y)=>{let h=Q[String(y)];if(h===void 0)throw Error(`gtrk 引用素材 ${y} 缺本地路径`);if(!(h in q))q[h]=N.length,N.push(h);return q[h]},F=[],M=0,R=()=>`s${++M}`,[D,O]=yz(W.track_timeline),C=[],T=[];for(let y of V){let[h,v]=yz(y.track_timeline,typeof y.volume==="number"?y.volume:void 0);C.push(h),T.push(v)}let _=T.length?Math.max(O,...T):O;if(_<=0)throw Error("时间线总时长为 0");if(_>O+0.000001)D.push({kind:"gap",duration:_-O});let P=GB(D,H),E=[];D.forEach((y,h)=>{let v=R(),S=P[h];if(y.kind==="clip"){let k=U(y.material),c=y.clip_st,a=y.clip_st+y.duration;F.push(`[${k}:v]trim=start=${t8(c)}:end=${t8(a)},setpts=PTS-STARTPTS,fps=${wz(H)},tpad=stop_mode=clone:stop_duration=${t8(vz/H)},trim=end_frame=${S},setpts=PTS-STARTPTS,scale=${G}:${$}:force_original_aspect_ratio=decrease,pad=${G}:${$}:(ow-iw)/2:(oh-ih)/2:black,setsar=1,format=yuv420p[${v}]`)}else F.push(`color=black:s=${G}x${$}:r=${wz(H)}:d=${t8((S+vz)/H)},trim=end_frame=${S},setpts=PTS-STARTPTS,format=yuv420p[${v}]`);E.push(v)}),F.push(E.map((y)=>`[${y}]`).join("")+`concat=n=${E.length}:v=1:a=0[vout]`);let I=[];for(let y=0;y<C.length;y++){let h=C[y],v=T[y];if(_>v+0.000001)h.push({kind:"gap",duration:_-v});let S=[];for(let c of h){let a=R();if(c.kind==="clip"){let u=U(c.material),l=c.clip_st,f=c.clip_st+c.duration,n=[`[${u}:a]atrim=start=${t8(l)}:end=${t8(f)}`,"asetpts=PTS-STARTPTS",`aresample=${o5}`,`aformat=sample_fmts=fltp:channel_layouts=${r5}`];if(typeof c.volume==="number")n.push(`volume=${a5(c.volume)}`);if(z>0)n.push(`afade=t=in:d=${a5(z)}`),n.push(`afade=t=out:st=${t8(Math.max(c.duration-z,0))}:d=${a5(z)}`);F.push(n.join(",")+`[${a}]`)}else F.push(`anullsrc=r=${o5}:cl=${r5},atrim=end=${t8(c.duration)}[${a}]`);S.push(a)}let k=R();F.push(S.map((c)=>`[${c}]`).join("")+`concat=n=${S.length}:v=0:a=1[${k}]`),I.push(k)}if(I.length===0)F.push(`anullsrc=r=${o5}:cl=${r5},atrim=end=${t8(_)}[aout]`);else if(I.length===1)F.push(`[${I[0]}]anull[aout]`);else F.push(I.map((y)=>`[${y}]`).join("")+`amix=inputs=${I.length}:duration=longest:normalize=0[aout]`);return{inputs:N,graph:F.join(";"),total:_}}function HB(Z,Q={}){let Y=new Set,J=s5(Z.video_track||[]),z=J.length?[xz(Z,J),...Z.audio_track||[]]:[...Z.audio_track||[]];for(let W of z){if(!W)continue;for(let V of W.track_timeline||[]){let K=V.material;if(K!=null)Y.add(String(K))}}let X={};for(let W of Z.materials||[]){if(!Y.has(String(W.id)))continue;if(!W.path)throw Error(`gtrk 素材 ${W.id} 缺 path(source_path),无法本地渲染`);let V=!YB(W.path)&&Q.gtrkDir?zB(Q.gtrkDir,W.path):W.path;if(!ZB(V))throw Error(`gtrk 素材文件不存在:${W.path}`);X[String(W.id)]=V}return X}async function d6(Z,Q,Y={}){let J=Y.codec??"h264";if(J!=="h264")throw Error(`v1 仅支持 h264,实际 ${J}`);let z=Y.crf??XB,{ffmpeg:X}=AZ(Y.ffmpegPath),W=HB(Z,{gtrkDir:Y.gtrkDir}),{inputs:V,graph:K,total:G}=$B(Z,W,{crf:z}),$=JB(QB(),`gtrk-filter-${process.pid}-${V.length}.txt`);await sN($,K,"utf8");try{let H=["-y"];for(let N of V)H.push("-i",N);return H.push("-filter_complex_script",$,"-map","[vout]","-map","[aout]","-c:v","libx264","-preset","medium","-crf",String(z),"-c:a","aac","-b:a","192k","-movflags","+faststart",Q),await M8(X,H,Y.onLine),{outputPath:Q,duration:G}}finally{await tN($).catch(()=>{})}}async function n6(Z){return JSON.parse(await eN(Z,"utf8"))}function NB(Z){if(Z.startsWith("jianying"))return"jianying";if(Z.startsWith("capcut"))return"capcut";return Z}var HQ={gtrk:{label:"客户端 (gtrk)",openHint:(Z)=>`客户端里「打开工程」选 ${Z}`},jianying:{label:"剪映 (jianying)",openHint:(Z)=>`剪映里打开即见草稿(目录 ${Z})`},capcut:{label:"CapCut",openHint:(Z)=>`CapCut 里打开即见草稿(目录 ${Z})`},xml:{label:"PR/FCP (Premiere XML)",openHint:(Z)=>`Premiere Pro:文件 > 导入 ${Z}`},fcpxml:{label:"Final Cut (fcpxml)",openHint:(Z)=>`Final Cut Pro:导入 ${Z}`},otio:{label:"OpenTimelineIO",openHint:(Z)=>`用支持 OTIO 的工具打开 ${Z}`}},BB=(Z)=>/HTTP 404/.test(Z);function jB(Z){let Q=Z.materials?.[0]?.path;if(!Q)return;let Y=fz(Q),J=Y.lastIndexOf(".");return J>0?Y.slice(0,J):Y}async function C9(Z){let{outDir:Q,output:Y,taskId:J}=Z,z=Z.download??g8,X=Y.files??[];if(!X.length)throw Error("任务无工程文件产物(检查 project_formats / 任务是否产出)");let W={...Y.errors??{}};await kz(Q,{recursive:!0});let V=i0(Q,"result.json"),K=async(q)=>{let U={ok:Object.keys(W).length===0,outDir:Q,files:{},jianyingDraftPath:null,rendered:null,report:Y.report??null,errors:W,taskId:J,fileId:Z.fileId??null,...q};return await UB(V,JSON.stringify(U,null,2)),U};await K({}),j.step("拉回产物到本地…");let G={};for(let q of X){let U=NB(q.format),F=i0(Q,U);await kz(F,{recursive:!0});let M=i0(F,q.filename);try{await z(q.download_url,M),(G[U]??=[]).push(M),j.info(`${HQ[U]?.label??q.format} ← ${q.filename}`)}catch(R){let D=R instanceof Error?R.message:String(R);if(W[`${q.format}:${q.filename}`]=D,BB(D))j.warn(`产物已过期(${q.filename}):文件已被清理,报告仍可用`);else j.warn(`产物下载失败(${q.filename}):${D}`)}}let $=null;if(G.jianying&&Z.draftDir){let q=i0(Z.draftDir,fz(Q));try{let U=await j6(i0(Q,"jianying"),q);if(U.complete)$=q,j.info(`剪映草稿已落到:${q}`);else W["jianying:draft"]=`草稿两件套不全(缺 ${U.missing.join("、")}),剪映列表里不会显示:${q}`,j.warn(W["jianying:draft"])}catch(U){W["jianying:draft"]=U instanceof Error?U.message:String(U),j.warn(`剪映草稿落盘失败:${W["jianying:draft"]}`)}}let H=null;if(Z.render){let q=(G.gtrk??[])[0];if(!q)j.warn("已请求 --render,但无可用 gtrk 工程(未产出或已过期),跳过渲染;报告仍已落盘");else{j.step("本地渲染成片(ffmpeg)…");let U=await n6(q),F=Z.projName??jB(U)??J,M=i0(Q,`${F}.mp4`),R=await d6(U,M,{crf:Z.crf!=null?Number(Z.crf):void 0,codec:Z.codec,ffmpegPath:Z.ffmpegPath,gtrkDir:qB(q),onLine:(D)=>{let O=D.match(/time=(\S+)/);if(O)j.tick(`渲染中 ${O[1]}`)}});j.tickEnd(),H=R.outputPath,j.info(`成片:${H}(${R.duration.toFixed(1)}s)`)}}let N=await K({files:G,jianyingDraftPath:$,rendered:H});if(!Z.json&&!Z.quiet){if(Object.keys(G).length)j.step("三方打开(产物已就位,按需自取):");for(let q of Object.keys(G)){let U=HQ[q],F=q==="jianying"?$??i0(Q,"jianying"):G[q][0];console.log(` • ${U?.label??q}:${U?.openHint(F)??F}`)}if(H)console.log(` • 成片 (mp4):${H}`);console.log(` • 结果清单:${V}`)}if(Z.open)D0(Q),j.info("已打开产物目录文件夹");if(Z.json&&!Z.quiet)console.log(JSON.stringify(N));return N}var Z7="cli/video_oral_cut_for_cli";function PB(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}var OB=(Z,Q)=>{return Q.push(Z),Q};function LB(Z={}){return{loadConfig:Z.loadConfig??jZ,probe:Z.probe??hZ,extract:Z.extract??E0,compress:Z.compress??c6}}var CB={command:"oralcut",afterward:"各段各出一份工程,逐段精修互不影响。"};function _B(Z){if(Z==="true")return!0;if(Z==="false")return!1;if(Z.trim()!==""&&!Number.isNaN(Number(Z)))return Number(Z);return Z}function TB(Z,Q){let Y={};for(let J of Z){let z=J.indexOf("=");if(z<0)throw Error(`--param 需要 key=value 格式:「${J}」`);Y[J.slice(0,z).trim()]=_B(J.slice(z+1))}if(Q){let J;try{J=JSON.parse(Q)}catch{throw Error(`--params-json 不是合法 JSON:${Q}`)}if(typeof J!=="object"||J===null||Array.isArray(J))throw Error("--params-json 必须是一个 JSON 对象");Object.assign(Y,J)}return Y}function gz(Z){Z.command("oralcut <input>").description("智能口播剪辑闭环:本地抽音频/720p → 只传抽出物 → 云端剪辑 → 拉回 gtrk/剪映/PR →(可选)本地渲染").option("-s, --script <file>","文稿 txt 路径(缺省走无稿智能重建)").option("-p, --preset <preset>","节奏预设 steady|concise|compact","concise").option("-o, --out <dir>","工程产物目录(缺省 = <毛片同目录>/<毛片名>-video-project-<YYMMDD-HHMMSS>)").option("-f, --formats <list>","三方格式(逗号分隔)","gtrk,jianying,xml").option("--jianying-draft-dir <dir>","剪映草稿根目录;传路径或 auto(默认读 gtrk init 配置 / 自动探测)").option("--lang <code>","语言代码(默认 zh-CN;如 en-US / ja-JP)").option("--visual-assist","视觉兜底:本地改传 720p 代理,云端用人脸/说话检测保护并重识别(剪不准/怕剪掉真内容时开)").option("--no-adaptive-rhythm","关闭自适应节奏(默认开;关了改用固定标点停顿表)").option("--render","额外本地渲染成片(ffmpeg 按 gtrk EDL 出 mp4;毛片仍不出本地)").option("--crf <n>","本地渲染视频质量 CRF 14-28(越小越清晰/文件越大,默认 18;需配 --render)").option("--codec <c>","本地渲染视频编码(默认 h264;需配 --render)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--param <k=v>","透传任意云端参数(标量、可重复;如 --param intra_gap_max=0.4)",OB,[]).option("--params-json <json>",`透传任意云端参数(JSON 对象、支持嵌套;如 '{"punctuation_breaks":{"。":0.3}}')`).option("--reupload","强制重新上传,忽略本地上传缓存").option("--no-open","完成后不自动打开产物目录(默认会自动打开)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON(给 agent/脚本解析)").action(async(Q,Y)=>{await AB(Q,Y)})}async function AB(Z,Q,Y={}){if(Q.json)qZ();let J=LB(Y),z=J.loadConfig(),X=t5(Z);if(!bz(X))throw Error(`毛片不存在:${X}`);let W=p6(X,FB(X)),V=Q.formats.split(",").map((T)=>T.trim()).filter(Boolean);if(Q.render&&!V.includes("gtrk"))V.push("gtrk");let K=V.some((T)=>T==="jianying"||T==="capcut"),G=t5(Q.out??e5(hz(X),`${W}-video-project-${PB()}`)),$=Q.script?t5(Q.script):void 0;if(!$){let T=e5(hz(X),`${W}.txt`);if(bz(T))$=T,j.info(`自动识别到同名文稿:${T}(按有稿剪辑;不想用就改名或显式 --script)`)}let H=$?await DB($,"utf8"):void 0,N;if(K)if(N=R0(Q.jianyingDraftDir),N)j.info(`剪映草稿目录:${N}`);else j.warn("没找到剪映草稿目录 → 将只产 draft_content.json、缺 meta。可加 --jianying-draft-dir <你的草稿目录> 重跑。");j.step(`▶ 智能口播剪辑:${p6(X)}(预设 ${Q.preset}${Q.visualAssist?" · 视觉兜底(720p)":""},格式 ${V.join("/")}${Q.render?" · 本地渲染":""})`);let q=TB(Q.param,Q.paramsJson);j.step("① 本地预处理(探几何 + 抽音频/720p)…");let U=J.probe(X,Q.ffmpegPath);j.info(`原片几何 ${U.width}x${U.height} @ ${U.fps.toFixed(2)}fps · ${U.duration.toFixed(1)}s`),l6(U.duration,CB);let F=Q.visualAssist?await J.compress(X,Q.ffmpegPath):await J.extract(X,Q.ffmpegPath);L9(U.duration,F,Q.ffmpegPath),j.info(Q.visualAssist?`已压 720p 代理(上传物):${p6(F)}`:`已抽 16k 单声道 mp3(上传物):${p6(F)}`),j.step("② 上传抽出物到云端…");let R=await R8(z,F,Z7,(T)=>{let _={file_id:T,la:Q.lang??"zh-CN",project_formats:V,source_path:X,video_size:[U.width,U.height],video_rate:U.fps,video_duration:U.duration,rhythm_preset:Q.preset};if(H)_.script=H;if(N)_.struct_meta={nle_draft_dir:N};if(Q.visualAssist)_.visual_assist=!0;if(Q.adaptiveRhythm===!1)_.adaptive_rhythm=!1;for(let[P,E]of Object.entries(q)){let I=_[P],y=!!I&&!!E&&typeof I==="object"&&typeof E==="object"&&!Array.isArray(I)&&!Array.isArray(E);_[P]=y?{...I,...E}:E}return _},{force:Q.reupload,onUploaded:(T)=>{j.info(T.cached?`命中上传缓存,复用 file_id = ${T.fileId}(免二次上传)`:`file_id = ${T.fileId}`),j.step("③ 提交智能口播剪辑任务…")},onCacheInvalid:()=>j.warn("缓存的 file_id 在云端已失效,重新上传后重试…")}),{taskId:D}=R,O={fileId:R.fileId,cached:R.cached};j.info(`task_id = ${D}`),await MB(G,{recursive:!0}),await RB(e5(G,"task.json"),JSON.stringify({taskId:D,taskType:Z7,fileId:O.fileId,source:X,formats:V,createdAt:new Date().toISOString()},null,2)),j.step("④ 云端处理中(每 5s 轮询)…");let C=await B9(z,Z7,D,(T,_)=>{j.tick(`${T}${_!=null?` ${Math.round(_)}%`:""}`)});j.tickEnd(),await C9({outDir:G,output:C,taskId:D,fileId:O.fileId,draftDir:N,render:Q.render,crf:Q.crf,codec:Q.codec,ffmpegPath:Q.ffmpegPath,projName:W,json:Q.json,open:Q.open}),j.ok(`闭环完成。产物目录:${G}`)}import{resolve as U7,join as S8,dirname as N7,basename as I0,extname as XX}from"node:path";import{mkdir as B7,writeFile as NQ}from"node:fs/promises";import{existsSync as j7}from"node:fs";var Y8=(Z)=>{let Q=typeof Z==="string"?Z.trim():"";return Q?Q:void 0},K8=(Z)=>typeof Z==="number"&&Number.isFinite(Z)?Z:void 0,e8=(Z)=>Array.isArray(Z)?Z.map((Q)=>Y8(Q)).filter((Q)=>!!Q):[];function u8(Z){let Q=Math.max(0,Math.round((K8(Z)??0)/1000)),Y=Q%60,J=Math.floor(Q/60)%60,z=Math.floor(Q/3600),X=z?String(J).padStart(2,"0"):String(J);return`${z?`${z}:`:""}${X}:${String(Y).padStart(2,"0")}`}var uz=(Z)=>Z.split(/[\\/]/).pop()||Z,i6=(Z)=>Z.replace(/\|/g,"\\|").replace(/\s*\n\s*/g," ");function mz(Z){if(Z==="jumpcut_off")return"未启用跳剪(`--no-jump-cut`),片段按原样保留。";if(Z==="too_short")return"片段过短,跳剪跳过(保留全部内容)。";if(Z==="degraded")return"跳剪降级:本条未压缩,保留全部内容。";return Z}function o6(Z){return K8(Z.total_duration_ms)??K8(Z.duration_ms)}function cz(Z){return K8(Z.segment_count)??(Array.isArray(Z.segments)?Z.segments.length:void 0)}function lz(Z){let Q=Array.isArray(Z.segments)?Z.segments:[];if(Q.length){let z=K8(Q[0]?.begin_time),X=K8(Q[Q.length-1]?.end_time);if(z!=null&&X!=null)return[z,X]}let Y=K8(Z.begin_time),J=K8(Z.end_time);return Y!=null&&J!=null?[Y,J]:void 0}function dz(Z,Q,Y={}){let J=Y8(Z.title),z=[`# clip${Q}${J?`「${J}」`:""}`,""],X=[],W=o6(Z);if(W!=null)X.push(`时长 ${u8(W)}`);let V=cz(Z);if(V!=null)X.push(`${V} 个保留片段`);let K=lz(Z);if(K)X.push(`源片 ${u8(K[0])}–${u8(K[1])}`);if(X.length)z.push(`- ${X.join(" · ")}`,"");let G=K8(Z.score),$=Y8(Z.score_reason);if(G!=null||$)z.push("## 入选理由",""),z.push([G!=null?`**评分 ${G}**`:null,$].filter(Boolean).join(" — "),"");let H=Y8(Z.summary);if(H)z.push("## 简介","",H,"");let N=Y8(Z.jumpcut_note);if(N)z.push("## 跳剪","",mz(N),"");let U=[["主题",e8(Z.themes)],["标签",e8(Z.tags)],["类型",e8(Z.genres)],["调性",e8(Z.moods)]].filter(([,D])=>D.length);if(U.length){z.push("## 分类与调性","");for(let[D,O]of U)z.push(`- ${D}:${O.join("、")}`);z.push("")}let M=(Array.isArray(Z.highlight_words)?Z.highlight_words:[]).map((D)=>({text:Y8(D?.text),at:K8(D?.begin_time)})).filter((D)=>D.text);if(M.length){z.push("## 高光词(源片时码)","");for(let D of M)z.push(`- ${D.at!=null?`${u8(D.at)} `:""}「${D.text}」`);z.push("")}let R=Object.keys(Y).filter((D)=>Y[D]?.length);if(R.length){z.push("## 本条工程文件","");for(let D of R)z.push(`- ${D}:${Y[D].map(uz).join("、")}`);z.push("")}return`${z.join(`
|
|
72
72
|
`).replace(/\n{3,}/g,`
|
|
73
73
|
|
|
74
74
|
`).trimEnd()}
|
|
75
|
-
`}function
|
|
75
|
+
`}function nz(Z,Q){let J=[`# ${Q.source.split(/[\\/]/).pop()||Q.source} · 长剪短总览`,""];if(J.push(`- 源片:\`${Q.source}\``),J.push(`- 切片:${Z.length} 条`),J.push(`- 跳剪:${Q.jumpCut?"开":"关"}`),Q.splitMaterials?.total)J.push(`- 分屏素材:${Q.splitMaterials.landed}/${Q.splitMaterials.total} 条已落地`);if(Q.taskId)J.push(`- task_id:\`${Q.taskId}\``);J.push(""),J.push("| # | 标题 | 时长 | 评分 | 简介 |","| --- | --- | --- | --- | --- |");for(let[z,X]of Z.entries()){let W=o6(X),V=K8(X.score);J.push(`| clip${z} | ${i6(Y8(X.title)??"—")} | ${W!=null?u8(W):"—"} | ${V??"—"} | ${i6(Y8(X.summary)??"—")} |`)}return J.push("","> 逐条入选理由、跳剪说明、高光词见各 `clip{i}/clip.md`。"),`${J.join(`
|
|
76
76
|
`)}
|
|
77
|
-
`}var
|
|
77
|
+
`}var EB={split_screen:"智能分屏",camera:"克制运镜",speed:"整体调速",seam:"接缝过渡",subtitle:"智能字幕",subtitle_remap:"字幕时轴重映射",purify_source:"去除原字幕",unknown:"未具名润色项"};function pz(Z,Q,Y){let z=[`# ${Y.source.split(/[\/]/).pop()||Y.source} · 长剪短精剪报告`,""];z.push(`- 源片:\`${Y.source}\``),z.push(`- 成片:${Z.length} 条`);let X=Q?.jump_cut;if(typeof X==="boolean")z.push(`- 跳剪:${X?"开":"关"}`);if(Y.taskId)z.push(`- task_id:\`${Y.taskId}\``);z.push(""),z.push("| # | 标题 | 时长 | 评分 | 简介 |","| --- | --- | --- | --- | --- |");for(let[K,G]of Z.entries()){let $=o6(G),H=K8(G.score);z.push(`| clip${K} | ${i6(Y8(G.title)??"—")} | ${$!=null?u8($):"—"} | ${H??"—"} | ${i6(Y8(G.summary)??"—")} |`)}z.push("");let W=Q?.degraded_items,V=[];if(W&&typeof W==="object"&&!Array.isArray(W))for(let[K,G]of Object.entries(W)){let $=e8(G).map((H)=>EB[H]??H);if($.length)V.push(`- **${K}**:${$.join("、")}`)}if(V.length)z.push("## ⚠️ 润色降级",""),z.push("以下片子照常出片,但列出的润色项**没有做成**——效果与预期不同,别当成完整成片直接发布。",""),z.push(...V,"");for(let[K,G]of Z.entries()){let $=Y8(G.title);z.push("---","",`## clip${K}${$?`「${$}」`:""}`,"");let H=[],N=o6(G);if(N!=null)H.push(`时长 ${u8(N)}`);let q=cz(G);if(q!=null)H.push(`${q} 个保留片段`);let U=lz(G);if(U)H.push(`源片 ${u8(U[0])}–${u8(U[1])}`);let F=Y.clipFiles?.[K];if(F)H.push(`成片 ${uz(F)}`);if(H.length)z.push(`- ${H.join(" · ")}`,"");let M=K8(G.score),R=Y8(G.score_reason);if(M!=null||R)z.push("### 入选理由",""),z.push([M!=null?`**评分 ${M}**`:null,R].filter(Boolean).join(" — "),"");let D=Y8(G.summary);if(D)z.push("### 简介","",D,"");let O=Y8(G.jumpcut_note);if(O)z.push("### 跳剪","",mz(O),"");let T=[["主题",e8(G.themes)],["标签",e8(G.tags)],["类型",e8(G.genres)],["调性",e8(G.moods)]].filter(([,E])=>E.length);if(T.length){z.push("### 分类与调性","");for(let[E,I]of T)z.push(`- ${E}:${I.join("、")}`);z.push("")}let P=(Array.isArray(G.highlight_words)?G.highlight_words:[]).map((E)=>({text:Y8(E?.text),at:K8(E?.begin_time)})).filter((E)=>E.text);if(P.length){z.push("### 高光词(源片时码)","");for(let E of P)z.push(`- ${E.at!=null?`${u8(E.at)} `:""}「${E.text}」`);z.push("")}}return`${z.join(`
|
|
78
78
|
`).replace(/\n{3,}/g,`
|
|
79
79
|
|
|
80
80
|
`).trimEnd()}
|
|
81
|
-
`}import{resolve as X7,join as _9,dirname as Nj,basename as W7,extname as d6}from"node:path";import{mkdir as Bj,writeFile as z7,stat as jj}from"node:fs/promises";import{createWriteStream as Fj,existsSync as rz}from"node:fs";import{Readable as Mj}from"node:stream";import{pipeline as Rj}from"node:stream/promises";function t5(Z){return typeof Z==="number"&&Number.isFinite(Z)}function RB(Z){if(!Array.isArray(Z))throw Error("价格表响应不是数组");let Q=new Map;for(let Y of Z){if(!Y||typeof Y!=="object")continue;let J=Y,z=typeof J.key==="string"?J.key.trim():"",X=typeof J.measure==="string"?J.measure.trim():"";if(!z||!X||!t5(J.price)||!t5(J.exPrice))continue;Q.set(z,{...t5(J.taskTypeId)?{taskTypeId:J.taskTypeId}:{},...typeof J.name==="string"?{name:J.name}:{},key:z,price:J.price,exPrice:J.exPrice,measure:X,...typeof J.note==="string"?{note:J.note}:{}})}return Q}async function e5(Z=fetch){let Q=await Z("https://cloud.ai-mcn.tv/api/get_price_list",{method:"GET",headers:{Accept:"application/json"},signal:AbortSignal.timeout(5000)});if(!Q.ok)throw Error(`价格表请求失败 HTTP ${Q.status}`);return RB(await Q.json())}function DB(Z,Q){let Y;if(Z.price===0&&Z.exPrice===0)Y=`免费(0 积分/${Z.measure})`;else if(Z.price===Z.exPrice)Y=`${Z.price} 积分/${Z.measure}`;else Y=`标准价 ${Z.price} 积分/${Z.measure};超额价 ${Z.exPrice} 积分/${Z.measure}`;return Q?`${Q}:${Y}`:Y}function c6(Z,Q,Y){let J=Q?.get(Z);if(!J)return{billingHint:Y?`${Y}:${"实时价格暂不可用,以服务端结算为准"}`:"实时价格暂不可用,以服务端结算为准",pricing:{key:Z,available:!1}};return{billingHint:DB(J,Y),pricing:{key:Z,available:!0,price:J.price,exPrice:J.exPrice,measure:J.measure}}}async function g8(Z,Q,Y=fetch){try{return c6(Z,await e5(Y),Q)}catch{return c6(Z,void 0,Q)}}import{readFileSync as OB}from"node:fs";import{readFile as PB,writeFile as LB}from"node:fs/promises";import{dirname as mz,extname as cz,join as lz,resolve as CB}from"node:path";var VQ=new Set(["images","videos"]),_B=[".jpg",".jpeg",".png",".webp",".bmp",".gif",".tif",".tiff",".heic",".heif",".avif"],dz=[".mp4",".mov",".mkv",".webm",".avi",".m4v",".flv",".wmv",".mpg",".mpeg",".ts",".m2ts"],l6=[".mp3",".wav",".m4a",".aac",".flac",".ogg",".opus",".wma"],TB=[".ass",".srt"],Z7=(Z)=>l6.includes(cz(Z).toLowerCase()),Z8=[".mp4",".avi",".mpg",".mov",".flv",".mxf",".mpeg",".ogg",".3gp",".wmv",".h264",".m4v",".ts"];function mZ(Z){if(Z==="image"||Z==="images")return _B;if(Z==="video"||Z==="videos")return dz;if(Z==="audio")return l6;if(Z==="subtitle")return TB;return}function HZ(Z,Q){for(let Y of Q){let J=Z[Y];if(typeof J==="string"&&J.trim())return J}return}function VZ(Z,Q){let Y=Z;try{Y=new URL(Z).pathname}catch{Y=Z.split("?")[0]??Z}return cz(Y)||Q}function AB(Z){if(!Z||!(Z.width>0)||!(Z.height>0))return{fellBack:!0};return Z.height>Z.width?{width:1080,height:1920,fellBack:!1}:{width:1920,height:1080,fellBack:!1}}function EB(Z,Q){if(!f8(Q))return;try{let Y=hZ(Z,Q);if(Y.width>0&&Y.height>0)return{width:Y.width,height:Y.height}}catch{}return}var IB=new Set(["up_to_down","down_to_up","left_to_right","right_to_left","right_up_to_left_down","left_up_to_right_down","right_down_to_left_up","left_down_to_right_up","zoom_in_up","zoom_in_down","zoom_in_left","zoom_in_right","zoom_in_left_up","zoom_in_right_up","zoom_in_left_down","zoom_in_right_down","zoom_in_center","zoom_out_up","zoom_out_down","zoom_out_left","zoom_out_right","zoom_out_left_up","zoom_out_right_up","zoom_out_left_down","zoom_out_right_down","zoom_out_center"]),SB={name:"image_move",title:"图转运镜",description:"把一张静态图生成带运镜的短视频。",kind:"cloud",input:{kind:"image"},priceKey:"image_move_local",outputHint:"运镜视频",enabled:!0,taskType:"image_move",options:[{flag:"--motion <value>",desc:"运镜方式(未传则云端自动选择;显式指定后同图同参重跑结果一致)。"+"平移 8:up_to_down/down_to_up/left_to_right/right_to_left 及四条对角线;"+"放大锚点 9:zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center};"+"缩小锚点 9:zoom_out_ 同九方位"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.motion!=null){let z=String(Q.opts.motion);if(!IB.has(z))throw Error(`--motion 不支持「${z}」。合法值:平移 8(up_to_down/down_to_up/left_to_right/right_to_left/`+"right_up_to_left_down/left_up_to_right_down/right_down_to_left_up/left_down_to_right_up)、"+"放大锚点 9(zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center})、"+"缩小锚点 9(zoom_out_ 同九方位)");Y.motion=z}if(!(Q.extraParams.width!=null||Q.extraParams.height!=null)&&Q.inputAbs){let z=EB(Q.inputAbs,Q.ffmpegPath),X=AB(z);if(X.width&&X.height)Y.width=X.width,Y.height=X.height;if(X.fellBack)Q.warn("未探测到图片朝向(缺 ffprobe),将按云端默认横屏 1920×1080 出片;"+"可用 --param width=… --param height=… 显式指定几何。")}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url","video_download_url","url"]);if(!Y)return[];return[{url:Y,filename:`${Q.baseName}-image_move${VZ(Y,".mp4")}`}]}},vB={name:"image_matting",title:"图片抠像",description:"把图片主体从背景抠出,产透明背景 png(可经 --param 请求额外背景底板输出)。",kind:"cloud",input:{kind:"image"},priceKey:"image_matting",outputHint:"透明 png",enabled:!0,taskType:"image_matting",buildPayload(Z){return{file_id:Z,output_format:"png"}},mapOutputs(Z,Q){let Y=[],J=HZ(Z,["download_url","image_download_url","url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-matte${VZ(J,".png")}`});let z=HZ(Z,["background_download_url","bg_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}-bg${VZ(z,".png")}`});return Y}},wB={name:"image_blackborder_remove",title:"图片去黑边",description:"自动检测并裁去单张图片四周的黑边,保留有效画面。",kind:"cloud",input:{kind:"image"},priceKey:"image_blackborder_remove",outputHint:"去黑边图片",enabled:!0,taskType:"image_blackborder_remove",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-blackborder-removed${VZ(Y,".jpg")}`}]:[]}},yB={name:"image_canvas_adapt",title:"图片比例转换",description:"把单张图片适配到目标画布尺寸,可选适配、矩形裁剪或方形裁剪。",kind:"cloud",input:{kind:"image"},priceKey:"image_canvas_adapt",outputHint:"比例适配图片",enabled:!0,taskType:"image_canvas_adapt",options:[{flag:"--canvas-width <px>",desc:"目标画布宽度(像素;未传则使用服务端默认)"},{flag:"--canvas-height <px>",desc:"目标画布高度(像素;未传则使用服务端默认)"},{flag:"--canvas-type <normal|rectangle|square>",desc:"画布模式:normal、rectangle 或 square(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z};for(let[J,z,X]of[["canvasWidth","canvas_width","--canvas-width"],["canvasHeight","canvas_height","--canvas-height"]]){if(Q.opts[J]==null)continue;let V=Number(Q.opts[J]);if(!Number.isFinite(V))throw Error(`${X} 必须是数字`);Y[z]=V}if(Q.opts.canvasType!=null){let J=String(Q.opts.canvasType);if(J!=="normal"&&J!=="rectangle"&&J!=="square")throw Error("--canvas-type 只支持 normal、rectangle 或 square");Y.canvas_type=J}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-canvas-adapted${VZ(Y,".jpg")}`}]:[]}},xB={name:"image_purify",title:"图片净化",description:"清理你有权处理的图片中的水印、Logo 或叠加元素。",kind:"cloud",input:{kind:"image"},priceKey:"image_purify",outputHint:"净化图片",enabled:!0,taskType:"image_purify",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-purified${VZ(Y,".jpg")}`}]:[]}},kB={name:"video_blackborder_remove",title:"视频去黑边",description:"自动检测并裁去单条视频四周的黑边,保留有效画面与原音轨。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_blackborder_remove",outputHint:"去黑边视频",enabled:!0,taskType:"video_blackborder_remove",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-blackborder-removed${VZ(Y,".mp4")}`}]:[]}},fB={name:"video_canvas_adapt",title:"视频比例转换",description:"把单条视频适配到目标画布,可选截取时间片段并移除音轨。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_canvas_adapt",outputHint:"比例适配视频",enabled:!0,taskType:"video_canvas_adapt",options:[{flag:"--canvas-width <px>",desc:"目标画布宽度(像素;未传则使用服务端默认)"},{flag:"--canvas-height <px>",desc:"目标画布高度(像素;未传则使用服务端默认)"},{flag:"--canvas-type <normal|rectangle|square>",desc:"画布模式:normal、rectangle 或 square(未传则使用服务端默认)"},{flag:"--clip-start <frame>",desc:"截取起始帧序号(未传则使用服务端默认)"},{flag:"--clip-end <frame>",desc:"截取结束帧序号(未传则使用服务端默认)"},{flag:"--without-audio",desc:"输出视频不保留音轨"}],buildPayload(Z,Q){let Y={file_id:Z};for(let[J,z,X]of[["canvasWidth","target_width","--canvas-width"],["canvasHeight","target_height","--canvas-height"]]){if(Q.opts[J]==null)continue;let V=Number(Q.opts[J]);if(!Number.isFinite(V)||!Number.isInteger(V))throw Error(`${X} 必须是有限整数`);Y[z]=V}for(let[J,z,X]of[["clipStart","start","--clip-start"],["clipEnd","end","--clip-end"]]){if(Q.opts[J]==null)continue;let V=Number(Q.opts[J]);if(!Number.isFinite(V)||!Number.isInteger(V))throw Error(`${X} 必须是有限整数帧号`);Y[z]=V}if(Q.opts.canvasType!=null){let J=String(Q.opts.canvasType);if(J!=="normal"&&J!=="rectangle"&&J!=="square")throw Error("--canvas-type 只支持 normal、rectangle 或 square");Y.canvas_type=J}if(Q.opts.withoutAudio===!0)Y.need_audio=!1;return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-canvas-adapted${VZ(Y,".mp4")}`}]:[]}},hB={name:"video_stabilizer",title:"视频防抖",description:"稳定手持或运动拍摄画面;exp 为实验方式,产物观感需自行检查。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_stabilizer",outputHint:"防抖视频",enabled:!0,taskType:"video_stabilizer",options:[{flag:"--stabilizer-method <fast|exp|turbo>",desc:"防抖方式(未传则使用服务端 turbo 默认值)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.stabilizerMethod==null)return Y;let J=String(Q.opts.stabilizerMethod);if(J!=="fast"&&J!=="exp"&&J!=="turbo")throw Error("--stabilizer-method 只支持 fast、exp 或 turbo");return Y.method=J,Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-stabilized${VZ(Y,".mp4")}`}]:[]}},bB={name:"video_vaporwave",title:"视频蒸汽波滤镜",description:"按精确预设名称为单条视频应用蒸汽波风格滤镜。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_vaporwave",outputHint:"蒸汽波滤镜视频",enabled:!0,taskType:"video_vaporwave",options:[{flag:"--vaporwave-filter <name>",desc:"精确滤镜名称(默认:愈漸升溫)"}],buildPayload(Z,Q){let Y=Q.opts.vaporwaveFilter,J=Y==null?"愈漸升溫":String(Y);if(!J.trim())throw Error("--vaporwave-filter 不能为空");return{file_id:Z,filter:J}},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-vaporwave${VZ(Y,".mp4")}`}]:[]}};function uz(Z){let Q,Y=!1;if(typeof Z==="string"){Y=!0;let K=Z.split(",");if(K.length!==4||K.some((G)=>!G.trim()))throw Error("--purify-roi 必须是 x,y,w,h 四个归一化数字");Q=K}else if(Z&&typeof Z==="object"&&!Array.isArray(Z)){let K=Z;Q=[K.x,K.y,K.w,K.h]}else throw Error("ROI 必须包含归一化数字 x、y、w、h");let J=Q.map((K)=>{if(typeof K==="number")return K;if(Y&&typeof K==="string")return Number(K);return Number.NaN});if(J.some((K)=>!Number.isFinite(K)))throw Error("ROI 的 x、y、w、h 必须是有限数字");let[z,X,V,W]=J;if(z<0||z>1||X<0||X>1||V<=0||V>1||W<=0||W>1||z+V>1||X+W>1)throw Error("ROI 必须满足 0≤x,y≤1、0<w,h≤1、x+w≤1、y+h≤1");return{x:z,y:X,w:V,h:W}}var gB={name:"video_purify",title:"视频净化",description:"清理你有权处理的视频中的水印、字幕或指定区域;不承诺还原被遮挡的原始内容。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_purify",outputHint:"净化视频",enabled:!0,taskType:"video_purify",pollTimeoutMs:14400000,options:[{flag:"--purify-scope <full_screen|subtitle|custom>",desc:"净化范围;未传时使用服务端 full_screen 默认值"},{flag:"--purify-method <ffmpeg|raft>",desc:"净化方式;未传时使用服务端 ffmpeg 默认值,raft 仅支持 20 分钟以内视频"},{flag:"--purify-roi <x,y,w,h>",desc:"custom 模式的归一化矩形区域"}],buildPayload(Z,Q){let Y={file_id:Z},J=Q.opts.purifyScope,z=J==null?void 0:String(J);if(z!=null&&z!=="full_screen"&&z!=="subtitle"&&z!=="custom")throw Error("--purify-scope 只支持 full_screen、subtitle 或 custom");if(z!=null)Y.purify_scope=z;let X=Q.opts.purifyMethod,V=X==null?void 0:String(X);if(V!=null&&V!=="ffmpeg"&&V!=="raft")throw Error("--purify-method 只支持 ffmpeg 或 raft");if(V!=null)Y.purify_func_type=V;let W=Q.opts.purifyRoi;if(W!=null){if(z!=="custom")throw Error("--purify-roi 只能与 --purify-scope custom 一起使用");Y.roi=uz(W)}else if(z==="custom"){if(Q.extraParams.roi==null)throw Error("--purify-scope custom 必须同时提供 --purify-roi 或 params-json.roi");uz(Q.extraParams.roi)}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-purified${VZ(Y,".mp4")}`}]:[]}},uB={name:"video_upscale",title:"视频超分",description:"对一分钟以内的低分辨率视频做实验性 GPU 超分;效果需自行检查。",kind:"cloud",input:{kind:"video",exts:Z8,maxDurationSec:60},priceKey:"video_upscale",outputHint:"超分视频",enabled:!0,taskType:"video_upscale",pollTimeoutMs:14400000,options:[{flag:"--upscale-times <2|3|4>",desc:"超分倍数;未传时使用服务端 2 倍默认值"},{flag:"--upscale-type <Reality|Anime>",desc:"写实或动漫类型;未传时使用服务端 Reality 默认值"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.upscaleTimes!=null){let J=Number(Q.opts.upscaleTimes);if(!Number.isInteger(J)||J!==2&&J!==3&&J!==4)throw Error("--upscale-times 只支持 2、3 或 4");Y.times=J}if(Q.opts.upscaleType!=null){let J=String(Q.opts.upscaleType);if(J!=="Reality"&&J!=="Anime")throw Error("--upscale-type 只支持 Reality 或 Anime");Y.upscale_type=J}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-upscaled${VZ(Y,".mp4")}`}]:[]}},mB={name:"video_interpolate",title:"视频插帧",description:"以 GPU 帧插值提升视频流畅度;不附加未经服务端声明的时长限制。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_interpolate",outputHint:"插帧视频",enabled:!0,taskType:"video_interpolate",pollTimeoutMs:14400000,options:[{flag:"--interpolate-multiplier <2|3|4>",desc:"插帧倍数;未传时使用服务端 2 倍默认值"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.interpolateMultiplier!=null){let J=Number(Q.opts.interpolateMultiplier);if(!Number.isInteger(J)||J!==2&&J!==3&&J!==4)throw Error("--interpolate-multiplier 只支持 2、3 或 4");Y.multiplier=J}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-interpolated${VZ(Y,".mp4")}`}]:[]}},cB={name:"video_matting",title:"视频抠像",description:"把视频主体从背景抠出,产透明背景 webm(像素级、原片直传不压代理;单片 ≤10 分钟)。",kind:"cloud",input:{kind:"video",maxDurationSec:600},priceKey:"video_matting",outputHint:"透明 webm",enabled:!0,taskType:"video_matting",pollTimeoutMs:3600000,buildPayload(Z){return{file_id:Z,target_mode:"auto",output_format:"webm"}},mapOutputs(Z,Q){let Y=[],J=HZ(Z,["download_url","video_download_url","url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-matte${VZ(J,".webm")}`});let z=HZ(Z,["mask_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}-mask${VZ(z,".webm")}`});return Y}},lB={name:"audio_separation",title:"人声伴奏分离",description:"把单条音频分离为人声与伴奏,可返回其中一项或两项。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_separation",outputHint:"人声与伴奏音频",enabled:!0,taskType:"audio_separation",options:[{flag:"--mode <fast|turbo>",desc:"处理档位(默认 fast,可选 turbo)"}],buildPayload(Z,Q){let Y=Q.opts.mode,J=Y==null?"fast":String(Y);if(J!=="fast"&&J!=="turbo")throw Error("--mode 只支持 fast 或 turbo");return{file_id:Z,mode:J}},mapOutputs(Z,Q){if(!Array.isArray(Z.files))return[];let Y=[];for(let J of Z.files){if(!J||typeof J!=="object")continue;let z=J,X=z.type,V=z.download_url;if(X!=="vocals"&&X!=="instrumental"||typeof V!=="string"||!V.trim())continue;Y.push({url:V,filename:`${Q.baseName}-${X}${VZ(V,".wav")}`})}return Y}},dB={name:"audio_noise_reduce",title:"音频降噪",description:"对音频或视频中的声音降噪,输出降噪后的音频。",kind:"cloud",input:{kind:"audio",exts:[...l6,...dz]},priceKey:"audio_noise_reduce",outputHint:"降噪音频",enabled:!0,taskType:"audio_noise_reduce",options:[{flag:"--prop-decrease <0..1>",desc:"降噪强度(0 到 1;未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.propDecrease!=null){let J=Number(Q.opts.propDecrease);if(!Number.isFinite(J)||J<0||J>1)throw Error("--prop-decrease 必须是 0 到 1 的数字");Y.prop_decrease=J}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-denoise${VZ(Y,".wav")}`}]:[]}},nB={name:"audio_silence_remove",title:"静音片段移除",description:"移除音频中过长的静音片段,输出压缩停顿后的音频。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_silence_remove",outputHint:"去静音音频",enabled:!0,taskType:"audio_silence_remove",options:[{flag:"--min-silence-len <ms>",desc:"被视为静音片段的最短毫秒数(未传则使用服务端默认)"},{flag:"--desired-silence-len <ms>",desc:"处理后保留的静音毫秒数(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z};for(let[J,z,X]of[["minSilenceLen","min_silence_len","--min-silence-len"],["desiredSilenceLen","desired_silence_len","--desired-silence-len"]]){if(Q.opts[J]==null)continue;let V=Number(Q.opts[J]);if(!Number.isFinite(V)||V<0)throw Error(`${X} 必须是非负毫秒数`);Y[z]=V}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-desilence${VZ(Y,".wav")}`}]:[]}},pB={name:"video_segment",title:"视频机械分镜",description:"按画面变动率把视频切成分镜区间,输出结构化 JSON(场景数与各段起止/时长),不产切片文件。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_segment",outputHint:"分镜区间结构(result-output.json)",enabled:!0,taskType:"video_segment",options:[{flag:"--detector <content|adaptive>",desc:"切分算法(未传则使用服务端默认)"},{flag:"--threshold <number>",desc:"切分阈值(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z,only_struct:!0};if(Q.opts.detector!=null){let J=String(Q.opts.detector);if(J!=="content"&&J!=="adaptive")throw Error("--detector 只支持 content 或 adaptive");Y.detector=J}if(Q.opts.threshold!=null){let J=Number(Q.opts.threshold);if(!Number.isFinite(J))throw Error("--threshold 必须是数字");Y.threshold=J}return Y},mapResult(Z){return Z}},iB={name:"video_ai_segment",title:"视频智能分镜",description:"按语义把视频切成带类目、景别、标签、描述的镜头结构,输出结构化 JSON,不产切片文件。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_ai_segment",outputHint:"语义分镜结构(result-output.json)",enabled:!0,taskType:"video_ai_segment",options:[{flag:"--segment-mode <scene|shot_type|narrative|subject>",desc:"分镜维度(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z,only_struct:!0};if(Q.opts.segmentMode!=null){let J=String(Q.opts.segmentMode);if(J!=="scene"&&J!=="shot_type"&&J!=="narrative"&&J!=="subject")throw Error("--segment-mode 只支持 scene、shot_type、narrative 或 subject");Y.mode=J}return Y},mapResult(Z){return Z}},oB={name:"video_motion_cut",title:"视频运镜高光",description:"用光流分析提取运镜/高光片段,输出结构化 JSON(每片帧号、秒级时码与运动特征),不产文件。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_motion_cut",outputHint:"运镜高光片段结构(result-output.json)",enabled:!0,taskType:"video_motion_cut",buildPayload(Z){return{file_id:Z}},mapResult(Z){return Z}};function A8(Z,Q){if(Z==null)return;let Y=Number(Z);if(!Number.isFinite(Y))throw Error(`${Q} 需要有限数值,拿到「${String(Z)}」`);return Y}var rB={name:"video_speaker_detect",title:"音视频说话人检测",description:"检测画面中谁在何时说话(融合语音转写与人脸/人身追踪),输出可见说话人结构化 JSON,不产文件。重 GPU 能力、按分钟计费较高,长片先想清楚。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_speaker_detect",outputHint:"可见说话人结构(result-output.json,时基以服务端输出为准)",enabled:!0,taskType:"video_speaker_detect",options:[{flag:"--max-faces-per-frame <n>",desc:"单帧最多检测人脸数(未传则服务端默认)"},{flag:"--detect-body",desc:"同时检测人身(未传则服务端默认关闭)"},{flag:"--track-sample-fps <n>",desc:"追踪采样帧率(未传则服务端默认)"}],buildPayload(Z,Q){let Y=Q.opts,J={file_id:Z};if(typeof Y.language==="string"&&Y.language.trim())J.language=Y.language;let z=A8(Y.maxFacesPerFrame,"--max-faces-per-frame");if(z!=null)J.max_faces_per_frame=z;if(Y.detectBody===!0)J.detect_body=!0;let X=A8(Y.trackSampleFps,"--track-sample-fps");if(X!=null)J.track_sample_fps=X;return J},mapResult(Z){return Z}},aB={name:"video_face_track",title:"多脸追踪/身份聚类",description:"追踪视频中的人脸并聚成稳定人物 ID(出场时间段与轨迹),输出结构化 JSON,不产文件;`time_ranges` 经 --params-json 透传。重 GPU 能力、按分钟计费较高。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_face_track",outputHint:"人物 ID/时间段/轨迹结构(result-output.json,时基以服务端输出为准)",enabled:!0,taskType:"video_face_track",options:[{flag:"--sample-fps <n>",desc:"检测采样帧率(未传则服务端默认)"},{flag:"--max-faces <n>",desc:"最多聚类人物数(未传则服务端默认)"},{flag:"--min-face-ratio <n>",desc:"最小人脸占比阈值(未传则服务端默认)"},{flag:"--enable-body-match",desc:"启用人身匹配辅助聚类(未传则服务端默认关闭)"},{flag:"--similarity-threshold <n>",desc:"身份聚类相似度阈值(未传则服务端默认)"}],buildPayload(Z,Q){let Y=Q.opts,J={file_id:Z},z=A8(Y.sampleFps,"--sample-fps");if(z!=null)J.sample_fps=z;let X=A8(Y.maxFaces,"--max-faces");if(X!=null)J.max_faces=X;let V=A8(Y.minFaceRatio,"--min-face-ratio");if(V!=null)J.min_face_ratio=V;if(Y.enableBodyMatch===!0)J.enable_body_match=!0;let W=A8(Y.similarityThreshold,"--similarity-threshold");if(W!=null)J.similarity_threshold=W;return J},mapResult(Z){return Z}},sB={name:"audio_speaker_split",title:"按说话人分轨",description:"把多说话人音频按说话人分成独立音轨,并产说话人时间线结构;--only-struct 只出结构不切文件。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_speaker_split",outputHint:"各说话人音轨 + 时间线结构",enabled:!0,taskType:"audio_speaker_split",options:[{flag:"--only-struct",desc:"只输出说话人时间线结构,不切分音轨文件"}],buildPayload(Z,Q){return{file_id:Z,only_struct:Q.opts.onlyStruct===!0}},mapOutputs(Z,Q){if(!Array.isArray(Z.files))return[];let Y=[];for(let J of Z.files){if(!J||typeof J!=="object")continue;let z=J,X=z.download_url;if(typeof X!=="string"||!X.trim())continue;let V=typeof z.speaker==="string"&&z.speaker.trim()?z.speaker:`speaker_${Y.length+1}`;Y.push({url:X,filename:`${Q.baseName}-${V}${VZ(X,".wav")}`})}return Y},mapResult(Z){return{spoken_list:Array.isArray(Z.spoken_list)?Z.spoken_list:[]}}},tB={name:"audio_stretch",title:"音频变调变速",description:"对音频独立调整音高(半音)与速度(倍率),输出处理后的音频。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_stretch",outputHint:"变调变速音频",enabled:!0,taskType:"audio_stretch",options:[{flag:"--semitones <n>",desc:"变调半音(升正降负;未传则不变调)"},{flag:"--speed <n>",desc:"变速/语速倍率(各工具范围与缺省见各自说明)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.semitones!=null){let J=Number(Q.opts.semitones);if(!Number.isFinite(J))throw Error("--semitones 必须是数字");Y.semitones=J}if(Q.opts.speed!=null){let J=Number(Q.opts.speed);if(!Number.isFinite(J)||J<=0)throw Error("--speed 必须是大于 0 的数字");Y.speed=J}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-stretch${VZ(Y,".wav")}`}]:[]}},eB={name:"piano_audio_to_midi",title:"钢琴音频转 MIDI",description:"把钢琴演奏音频扒谱为 MIDI 文件。",kind:"cloud",input:{kind:"audio"},priceKey:"piano_audio_to_midi",outputHint:"MIDI 文件(.mid)",enabled:!0,taskType:"piano_audio_to_midi",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}${VZ(Y,".mid")}`}]:[]}},Zj={name:"piano_audio_enhance",title:"钢琴音频修复增强",description:"修复并增强钢琴录音音质,产高质量 WAV 与配套 MIDI。",kind:"cloud",input:{kind:"audio"},priceKey:"piano_audio_enhance",outputHint:"高质量 WAV + MIDI",enabled:!0,taskType:"piano_audio_enhance",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=[],J=HZ(Z,["download_url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-enhanced${VZ(J,".wav")}`});let z=HZ(Z,["midi_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}${VZ(z,".mid")}`});return Y}},Qj={name:"image_to_square",title:"长图转方图",description:"把长图智能转为方形图,可指定最大边长(默认 4000,上限 20000)。",kind:"cloud",input:{kind:"image"},priceKey:"image_to_square",outputHint:"方形图片",enabled:!0,taskType:"image_to_square",options:[{flag:"--max-line <px>",desc:"最大边长像素(默认 4000,上限 20000)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.maxLine!=null){let J=Number(Q.opts.maxLine);if(!Number.isFinite(J)||!Number.isInteger(J)||J<1||J>20000)throw Error("--max-line 必须是 1 到 20000 之间的整数");Y.max_line=J}return Y},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-square${VZ(Y,".jpg")}`}]:[]}},Yj=new Set(["mp4","motion_photo"]),Jj={name:"image_to_live",title:"智能 LivePhoto",description:"让一张静态照片动起来,生成约 4 秒的短视频;"+"--output-format motion_photo 改为直出安卓动态照片(单个 .jpg,长按即播,并附带同一条视频)。",kind:"cloud",input:{kind:"image"},priceKey:"image_to_live",outputHint:"约 4 秒短视频(.mp4,无声);或安卓动态照片(.jpg + 附带同一条 .mp4)",enabled:!0,taskType:"image_to_live",options:[{flag:"--output-format <fmt>",desc:"交付格式(只决定产物怎么封装,不改生成参数、不改计费)。"+"mp4=默认,约 4 秒短视频;"+"motion_photo=安卓动态照片(单个 .jpg 内嵌该视频,长按即播;"+"另附同一条 .mp4。iOS 不识别、按普通静图打开,少数安卓机型可能只显示静图)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.outputFormat!=null){let J=String(Q.opts.outputFormat);if(!Yj.has(J))throw Error(`--output-format 不支持「${J}」。合法值:mp4(默认,约 4 秒短视频)、`+"motion_photo(安卓动态照片 .jpg,另附同一条 .mp4)");Y.output_format=J}return Y},mapOutputs(Z,Q){let Y=[],J=HZ(Z,["download_url","video_download_url","url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-live${VZ(J,".mp4")}`});let z=HZ(Z,["video_download_url"]);if(z&&z!==J)Y.push({url:z,filename:`${Q.baseName}-live${VZ(z,".mp4")}`});return Y}},L9=["default","outline","cinema_yellow","immersive_box","wide_spacing","deep_shadow","boxed"],C9=["雅黑","淡绿","森林绿","湖蓝","道奇蓝","钢蓝","浅粉红","深橙","珊瑚橙","橙红","土豪金"],zj={name:"video_ai_subtitle",title:"智能字幕识别",description:"为视频(或音频)智能生成字幕,可选双语翻译、烧录进视频、去除原字幕;另产 LLM 摘要与字级时间轴。翻译已有字幕文件请用 subtitle_translate。",kind:"cloud",input:{kind:"video",exts:[...Z8,...l6]},priceKey:"video_ai_subtitle",outputHint:"字幕 .ass + 可选烧录/去字幕视频 + 摘要/字级时轴结构",enabled:!0,taskType:"video_ai_subtitle",pollTimeoutMs:14400000,options:[{flag:"--language <code>",desc:"源语种代码(video_ai_subtitle 必填、其余工具可选;具体取值由服务端支持列表校验)"},{flag:"--translate-language <code>",desc:"译文目标语种(未传则单语)"},{flag:"--need-render",desc:"把字幕烧录进视频(仅视频输入有效)"},{flag:"--need-pure",desc:"先去除原视频中的字幕"},{flag:"--subtitle-type <style>",desc:`字幕样式:${L9.join("/")}(未传则用服务端默认)`},{flag:"--subtitle-color <color>",desc:`字幕颜色:${C9.join("/")}(未传则用服务端默认)`}],async preprocess(Z){let Q=Z.inputAbs;if(Z.opts.needPure===!0)return Z.warn("--need-pure 需要画面(去原字幕是画面操作),本次整片上传;只要字幕文件时去掉该 flag 即可只传音频"),Q;if(Z7(Q))return Q;return await T0(Q,Z.ffmpegPath)},buildPayload(Z,Q){let Y=Q.opts.language==null?"":String(Q.opts.language).trim();if(!Y)throw Error("--language 必填:请指定源语种代码(具体取值见云端 API 文档 / 服务端支持列表)");let J={file_id:Z,language:Y},z=Q.inputAbs;if(z&&!Z7(z))try{let X=hZ(z,Q.ffmpegPath);if(X.width>0&&X.height>0)J.video_size=[X.width,X.height]}catch{Q.warn("探原片几何失败,本次不回传 video_size(服务端将按 1920x1080 兜底出字幕)")}if(Q.opts.translateLanguage!=null){let X=String(Q.opts.translateLanguage).trim();if(X)J.translate_language=X}if(Q.opts.needPure===!0)J.need_pure=!0;if(Q.opts.subtitleType!=null){let X=String(Q.opts.subtitleType);if(!L9.includes(X))throw Error(`--subtitle-type 只支持 ${L9.join("、")}`);J.subtitle_type=X}if(Q.opts.subtitleColor!=null){let X=String(Q.opts.subtitleColor);if(!C9.includes(X))throw Error(`--subtitle-color 只支持 ${C9.join("、")}`);J.subtitle_color=X}return J},mapOutputs(Z,Q){let Y=[],J=HZ(Z,["subtitle_file_download_url"]);if(J)Y.push({url:J,filename:`${Q.baseName}${VZ(J,".ass")}`});let z=HZ(Z,["rendered_file_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}-subtitled${VZ(z,".mp4")}`});let X=HZ(Z,["pure_file_download_url"]);if(X)Y.push({url:X,filename:`${Q.baseName}-pure${VZ(X,".mp4")}`});return Y},async postprocess(Z,Q){if(Z.opts.needRender!==!0)return;let Y=Z.inputAbs;if(Z7(Y))throw Error("--need-render 需要视频输入:本次输入是音频文件,无画面可烧");let J=Q.find((W)=>W.toLowerCase().endsWith(".ass"));if(!J)throw Error("未拉回 .ass 字幕文件,无法本地烧录");let z=Dz(await PB(J,"utf8")),X=[];for(let W of z)if(!await Pz(W,Z.ffmpegPath))X.push(W);if(X.length)throw Error(`本机缺字幕模板所需字体:${X.join("、")}。`+`装它:gtrk deps install --font(落 ~/.gitruck/fonts,不写系统字体表)。
|
|
82
|
-
`+" 装上后重跑即可(字幕文件已落地,无需重新提交任务)。不用替代字体顶——"+"替代字体烧出来的成片观感与模板设计不符且难以察觉。");let V=lz(mz(J),`${Z.baseName}-subtitled.mp4`);return await Oz(Y,J,V,{ffmpegPath:Z.ffmpegPath}),[V]},mapResult(Z){return{summary:typeof Z.summary==="string"?Z.summary:"",asr:Z.asr??null}}},Q7=["ass","srt"],Y7=["resegment","keep"],Xj={name:"subtitle_translate",title:"智能字幕翻译",description:"把已有字幕文件(.ass / .srt)翻译成另一种语言,可选套用字幕样式与颜色、输出双语。不含语音识别——要从音视频生成字幕请用 video_ai_subtitle。",kind:"cloud",input:{kind:"subtitle",rejectHint:"本工具只吃字幕文件;要从音视频生成字幕请用 gtrk tool video_ai_subtitle"},priceKey:"subtitle_translate",outputHint:"译文字幕 .ass 或 .srt + 条数统计与降级标记",enabled:!0,taskType:"subtitle_translate",pollTimeoutMs:3600000,options:[{flag:"--language <code>",desc:"源语种代码(必填;取值由服务端支持列表校验)"},{flag:"--translate-language <code>",desc:"译文目标语种代码(必填)"},{flag:"--output-format <fmt>",desc:`产物格式 ${Q7.join("/")}(未传则跟随输入)`},{flag:"--line-mode <mode>",desc:`翻译粒度 ${Y7.join("/")}(缺省 resegment:先合并回自然句再翻,更通顺但行数与时码会变;keep 严格逐行、时码与输入逐条一致)`},{flag:"--bilingual",desc:"输出双语字幕(原文与译文同框;仅 ass 输出有效)"},{flag:"--subtitle-type <style>",desc:`字幕样式:${L9.join("/")}(仅 ass 输出有效)`},{flag:"--subtitle-color <color>",desc:`字幕颜色:${C9.join("/")}(仅 ass 输出有效)`},{flag:"--canvas <WxH>",desc:"画布几何,决定译文按哪一档折行(未传则:.ass 用文件里的 PlayRes,.srt 无从推断、服务端按横屏 1920x1080)。竖屏务必显式传"}],buildPayload(Z,Q){let Y=Q.opts.language==null?"":String(Q.opts.language).trim(),J=Q.opts.translateLanguage==null?"":String(Q.opts.translateLanguage).trim();if(!Y||!J)throw Error("--language 与 --translate-language 都必填:本工具是「字幕 → 字幕」翻译,源语种与目标语种缺一不可"+"(具体取值见云端 API 文档 / 服务端支持列表)");let z={file_id:Z,language:Y,translate_language:J};if(Q.opts.outputFormat!=null){let X=String(Q.opts.outputFormat).trim().toLowerCase();if(!Q7.includes(X))throw Error(`--output-format 只支持 ${Q7.join("、")}`);z.output_format=X}if(Q.opts.lineMode!=null){let X=String(Q.opts.lineMode).trim().toLowerCase();if(!Y7.includes(X))throw Error(`--line-mode 只支持 ${Y7.join("、")}`);z.line_mode=X}if(Q.opts.bilingual===!0)z.lingual_type="bilingual";if(Q.opts.subtitleType!=null){let X=String(Q.opts.subtitleType);if(!L9.includes(X))throw Error(`--subtitle-type 只支持 ${L9.join("、")}`);z.subtitle_type=X}if(Q.opts.subtitleColor!=null){let X=String(Q.opts.subtitleColor);if(!C9.includes(X))throw Error(`--subtitle-color 只支持 ${C9.join("、")}`);z.subtitle_color=X}if(Q.opts.canvas!=null){let X=String(Q.opts.canvas).trim().toLowerCase(),V=/^(\d+)x(\d+)$/.exec(X);if(!V)throw Error(`--canvas 需要 WxH 形式的两个正整数(如 1080x1920),拿到「${X}」`);let W=Number(V[1]),K=Number(V[2]);if(!W||!K)throw Error(`--canvas 的宽高都必须为正整数,拿到「${X}」`);z.video_size=[W,K]}return z},mapOutputs(Z,Q){let Y=HZ(Z,["subtitle_file_download_url"]);if(!Y)return[];let z=(typeof Z.output_format==="string"?Z.output_format:"")==="srt"?".srt":".ass";return[{url:Y,filename:`${Q.baseName}-translated${VZ(Y,z)}`}]},mapResult(Z){return{output_format:Z.output_format??null,line_mode:Z.line_mode??null,stats:Z.stats??null,degraded:Z.degraded??null}},postprocess(Z,Q,Y){let J=Y.degraded;if(!J||typeof J!=="object")return;let z=J;if(z.summary===!0)Z.warn("上下文摘要求取失败,全篇术语一致性可能下降(产物照常可用,介意可重跑)");if(z.width_budget===!0)Z.warn("渲染宽度预算算不出,本次仅按语义长度折行,个别行可能超出画面——竖屏建议显式传 --canvas");if(z.translation===!0)Z.warn("翻译链路退化到分片重试或机器翻译兜底,译文质量可能下降(介意可重跑)")}},Wj=["auto","short","medium","long"],Vj={name:"video_long2short_pro",title:"长剪短·精剪(直接出片)",description:"长内容按语义抽多条高光短片并一键出成品:选段+跳剪+分屏内核,叠加模糊底画布适配/克制运镜/调速保音高/智能字幕。只出成片,不产工程文件——要可编辑工程请用 gtrk long2short(粗剪)。",kind:"cloud",input:{kind:"video",exts:Z8},priceKey:"video_long2short_pro",outputHint:"逐条高光成片 mp4 + 切片报告 clips.md",enabled:!0,taskType:"video_long2short_pro",pollTimeoutMs:14400000,options:[{flag:"--language <code>",desc:"源语种代码(精剪必填;取值以服务端支持列表为准)"},{flag:"--output-language <code>",desc:"选段/文案的输出语种(未传则同源语种)"},{flag:"--main-topic <text>",desc:"主题引导(影响选段偏好)"},{flag:"--output-size <s>",desc:"成片画幅 9:16|16:9|1:1 或自定义 WxH(未传则服务端默认)"},{flag:"--no-jump-cut",desc:"关闭跳剪(默认开:片内去水词/冗余,只删不重排)"},{flag:"--duration-pref <p>",desc:`成片时长偏好 ${Wj.join("/")}(成片条数由内容语义决定、不可指定)`},{flag:"--max-clip-sec <n>",desc:"单条成片时长安全上限(秒;未传则服务端默认)"},{flag:"--split-screen",desc:"开启智能分屏(多人同框段合成分屏画面)"},{flag:"--split-orientation <o>",desc:"分屏方向 auto|lr|tb(未传则服务端默认)"},{flag:"--speed-factor <n>",desc:"整体调速倍率(保音高;未传则服务端默认)"},{flag:"--no-camera-move",desc:"关闭克制运镜(默认开:亚像素推/拉)"},{flag:"--no-subtitle",desc:"关闭智能字幕(默认开:成片内烧录字幕)"},{flag:"--subtitle-translate-language <code>",desc:"字幕译文语种(未传则单语字幕)"}],buildPayload(Z,Q){let Y=Q.opts,J=Y.language==null?"":String(Y.language).trim();if(!J)throw Error("--language 必填:请指定源语种代码(具体取值见云端 API 文档 / 服务端支持列表)");let z={file_id:Z,language:J};if(Y.outputLanguage!=null&&String(Y.outputLanguage).trim())z.output_language=String(Y.outputLanguage).trim();if(Y.mainTopic!=null&&String(Y.mainTopic).trim())z.main_topic=String(Y.mainTopic).trim();if(Y.outputSize!=null&&String(Y.outputSize).trim())z.output_size=String(Y.outputSize).trim();if(Y.jumpCut===!1)z.jump_cut=!1;let X={};if(Y.durationPref!=null&&String(Y.durationPref).trim())X.pref=String(Y.durationPref).trim();let V=J7(Y.maxClipSec,"--max-clip-sec");if(V!=null)X.max_clip_sec=V;if(Object.keys(X).length)z.duration=X;if(Y.splitScreen===!0){let K={enable:!0};if(Y.splitOrientation!=null&&String(Y.splitOrientation).trim())K.orientation=String(Y.splitOrientation).trim();z.split_screen=K}if(Y.speedFactor!=null){let K=Number(Y.speedFactor);if(!Number.isFinite(K))throw Error(`--speed-factor 需要有限数值,拿到「${Y.speedFactor}」`);z.speed={factor:K}}if(Y.cameraMove===!1)z.camera_move={enable:!1};let W={};if(Y.subtitle===!1)W.enable=!1;if(Y.subtitleTranslateLanguage!=null&&String(Y.subtitleTranslateLanguage).trim())W.translate_language=String(Y.subtitleTranslateLanguage).trim();if(Object.keys(W).length)z.subtitle=W;return z},mapOutputs(Z,Q){let Y=Array.isArray(Z.clips)?Z.clips:[],J=[];for(let[z,X]of Y.entries()){let V=X?.file,W=typeof V?.download_url==="string"?V.download_url:void 0;if(!W)continue;J.push({url:W,filename:`clip${z}${VZ(W,".mp4")}`})}return J},mapResult(Z){return{clips:Z.clips??[],report:Z.report??{}}},async postprocess(Z,Q,Y){let J=Array.isArray(Y.clips)?Y.clips:[];if(!J.length)return;let z=Q.filter((W)=>W.toLowerCase().endsWith(".mp4")),X=J.map((W,K)=>z.find((G)=>new RegExp(`clip${K}.[a-z0-9]+$`,"i").test(G))),V=lz(mz(Q[0]??"."),"clips.md");return await LB(V,gz(J,Y.report??{},{source:Z.inputAbs??Z.baseName,clipFiles:X}),"utf8"),[V]}};function J7(Z,Q){if(Z==null)return;let Y=Number(Z);if(!Number.isFinite(Y)||!Number.isInteger(Y)||Y<0)throw Error(`${Q} 需要有限非负整数,拿到「${String(Z)}」`);return Y}var Kj={name:"image_classic_template",title:"智能拼图/封面",description:"标题 + 多张图 → 成品封面/拼图;--main-title 必填,文件顺序即拼装顺序。",kind:"cloud",input:{kind:"images"},priceKey:"image_classic_template",outputHint:"封面/拼图成品(text/pic/render 三组、可多张)",enabled:!0,taskType:"image_classic_template",options:[{flag:"--main-title <text>",desc:"主标题(image_classic_template 必填)"},{flag:"--sub-title <text>",desc:"副标题(未传则服务端默认)"},{flag:"--template-mode <mode>",desc:"拼图模式(映射服务端 mode;未传则服务端默认)"},{flag:"--aspect <ratio>",desc:"画幅比例(如 3:4;未传则服务端默认)"},{flag:"--quality <q>",desc:"输出质量(如 1080p;未传则服务端默认)"},{flag:"--output-pic-count <n>",desc:"图组产出数量(服务端钳制 ≤20;未传则服务端默认)"},{flag:"--output-text-count <n>",desc:"文字组产出数量(服务端钳制 ≤20;未传则服务端默认)"},{flag:"--title-layout <layout>",desc:"标题版式(映射服务端 output_title_layout;未传则服务端默认)"}],buildPayloadMulti(Z,Q){let Y=Q.opts,J=typeof Y.mainTitle==="string"&&Y.mainTitle.trim()?Y.mainTitle:void 0;if(!J)throw Error("image_classic_template 需要 --main-title <text>(主标题必填)");let z={file_ids:Z,main_title:J};if(typeof Y.subTitle==="string")z.sub_title=Y.subTitle;if(typeof Y.templateMode==="string")z.mode=Y.templateMode;if(typeof Y.aspect==="string")z.aspect=Y.aspect;if(typeof Y.quality==="string")z.quality=Y.quality;let X=J7(Y.outputPicCount,"--output-pic-count");if(X!=null)z.output_pic_count=X;let V=J7(Y.outputTextCount,"--output-text-count");if(V!=null)z.output_text_count=V;if(typeof Y.titleLayout==="string")z.output_title_layout=Y.titleLayout;return z},mapOutputs(Z,Q){let Y=[["text_file_download_url_list","text"],["pic_file_download_url_list","pic"],["render_file_download_url_list","render"]],J=[];for(let[z,X]of Y){let V=Z[z];if(!Array.isArray(V))continue;V.forEach((W,K)=>{if(typeof W==="string"&&W.trim())J.push({url:W,filename:`${Q.baseName}-${X}-${K+1}${VZ(W,".jpg")}`})})}return J}},Gj={name:"image_vertical_stitch",title:"拼长图",description:"多张图片按传入顺序竖向拼接成一张长图。",kind:"cloud",input:{kind:"images"},priceKey:"image_vertical_stitch",outputHint:"垂直拼接长图",enabled:!0,taskType:"image_vertical_stitch",buildPayloadMulti(Z){return{file_ids:Z}},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-stitch${VZ(Y,".jpg")}`}]:[]}},$j={name:"video_split_screen",title:"智能分屏",description:"把 2–16 段视频合成一条分屏成片(reaction/对比/多画面同框);--clips-json 可按 0 起索引精确指定每段毫秒区间与裁剪框,成片时长对齐最短段。",kind:"cloud",input:{kind:"videos",exts:Z8},priceKey:"video_split_screen",outputHint:"分屏成片视频",enabled:!0,taskType:"video_split_screen",options:[{flag:"--clips-json <json>",desc:"结构化条目数组:{input:0 起 positional 序号, begin_time_ms?, end_time_ms?, crop?{x,y,width,height 归一化}};缺省=每个输入整段参与"},{flag:"--layout-mode <m>",desc:"布局模式(auto/template;未传则服务端默认 auto)"},{flag:"--layout-id <n>",desc:"template 模式的布局模板号(合法性由服务端校验)"},{flag:"--output-ratio <r>",desc:"成片画幅(9:16/16:9/1:1;未传则服务端默认)"},{flag:"--fit-mode <m>",desc:"画面贴合方式(cover/contain;未传则服务端默认)"},{flag:"--audio-mode <m>",desc:"音频方式(first/mix/mute;未传则服务端默认)"},{flag:"--gap-ratio <n>",desc:"分屏缝隙比例(0–0.05;未传则服务端默认)"},{flag:"--background-color <c>",desc:"缝隙底色 #RRGGBB(未传则服务端默认)"}],buildPayloadMulti(Z,Q){let Y=Q.opts,J,z=Y.clipsJson;if(typeof z==="string"&&z.trim()){let G;try{G=JSON.parse(z)}catch{throw Error(`--clips-json 不是合法 JSON:${z}`)}if(!Array.isArray(G))throw Error("--clips-json 必须是一个 JSON 数组");if(G.length<2||G.length>16)throw Error(`--clips-json 需要 2–16 个条目,拿到 ${G.length}`);J=G.map(($,H)=>{if(!$||typeof $!=="object"||Array.isArray($))throw Error(`--clips-json 条目[${H}] 必须是对象`);let{input:N,...U}=$;if(typeof N!=="number"||!Number.isInteger(N)||N<0||N>=Z.length)throw Error(`--clips-json 条目[${H}].input 需要 0 起整数且 < 输入文件数(${Z.length}),拿到「${String(N)}」`);return{file_id:Z[N],...U}})}else{if(Z.length<2||Z.length>16)throw Error(`video_split_screen 需要 2–16 个输入视频,拿到 ${Z.length}`);J=Z.map((G)=>({file_id:G}))}let X={clips:J};if(typeof Y.layoutMode==="string")X.layout_mode=Y.layoutMode;let V=A8(Y.layoutId,"--layout-id");if(V!=null){if(!Number.isInteger(V))throw Error(`--layout-id 需要整数,拿到「${String(Y.layoutId)}」`);X.layout_id=V}let W=A8(Y.seed,"--seed");if(W!=null){if(!Number.isInteger(W))throw Error(`--seed 需要整数,拿到「${String(Y.seed)}」`);X.random_seed=W}if(typeof Y.outputRatio==="string")X.output_ratio=Y.outputRatio;if(typeof Y.quality==="string")X.quality=Y.quality;if(typeof Y.fitMode==="string")X.fit_mode=Y.fitMode;if(typeof Y.audioMode==="string")X.audio_mode=Y.audioMode;let K=A8(Y.gapRatio,"--gap-ratio");if(K!=null)X.gap_ratio=K;if(typeof Y.backgroundColor==="string")X.background_color=Y.backgroundColor;return X},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-splitscreen${VZ(Y,".mp4")}`}]:[]}},Hj={name:"audio_tts_clone",title:"声音克隆配音",description:"输入一段文字,用指定音色合成配音音频(--text 短文本或 --text-file 文本文件二选一,≤5000 字)。按文本字符数计费,计量单位与单价以 `gtrk tool list` 实时显示为准。",kind:"cloud",input:{kind:"none"},priceKey:"audio_tts_clone",outputHint:"配音音频(wav/mp3)",enabled:!0,taskType:"audio_tts_clone",options:[{flag:"--text <text>",desc:"待合成的短文本(与 --text-file 二选一)"},{flag:"--text-file <file>",desc:"待合成的文本文件(UTF-8;与 --text 二选一)"},{flag:"--speaker <code>",desc:"音色代号(必填;可用列表见官网文档「可用音色」,传错时报错会列出全部可用项)"},{flag:"--text-lang <lang>",desc:"文本语言(未传则服务端默认 zh)"},{flag:"--output-format <fmt>",desc:"输出音频格式 wav/mp3(未传则服务端默认 wav)"},{flag:"--split-method <m>",desc:"长文切分法 cut0~cut5(未传则跟随该音色调好的参数);它也决定字幕的断句粒度,要一句一条传 cut5"},{flag:"--batch-size <n>",desc:"分段并发批大小 1~16(未传则服务端默认)"},{flag:"--subtitle-format <fmt>",desc:"同时产出字幕文件,如 srt(未传则不出字幕;不额外计费,取值以服务端为准)"}],buildPayloadNone(Z){let Q=Z.opts,Y=typeof Q.text==="string"&&Q.text.trim()!=="",J=typeof Q.textFile==="string"&&Q.textFile.trim()!=="";if(Y&&J)throw Error("--text 与 --text-file 只能给其一");if(!Y&&!J)throw Error("需要 --text <短文本> 或 --text-file <文本文件>(UTF-8)之一");let z=Y?Q.text:OB(CB(Q.textFile),"utf8");if(!z.trim())throw Error("文本内容为空");if(!(typeof Q.speaker==="string"&&Q.speaker.trim()))throw Error("audio_tts_clone 需要 --speaker <音色代号>(可用列表见官网文档;传错时服务端报错会列出可用项)");let X={text:z,speaker:Q.speaker};if(typeof Q.textLang==="string")X.text_lang=Q.textLang;if(typeof Q.outputFormat==="string")X.output_format=Q.outputFormat;let V=A8(Q.speed,"--speed");if(V!=null)X.speed=V;if(typeof Q.splitMethod==="string")X.text_split_method=Q.splitMethod;let W=A8(Q.batchSize,"--batch-size");if(W!=null){if(!Number.isInteger(W))throw Error(`--batch-size 需要整数,拿到「${String(Q.batchSize)}」`);X.batch_size=W}if(typeof Q.subtitleFormat==="string"&&Q.subtitleFormat.trim())X.subtitle_format=Q.subtitleFormat.trim();return X},mapOutputs(Z,Q){let Y=HZ(Z,["download_url"]);if(!Y)return[];let J=typeof Q.opts.outputFormat==="string"?`.${Q.opts.outputFormat}`:".wav",z=typeof Q.opts.speaker==="string"&&Q.opts.speaker.trim()?Q.opts.speaker:"voice",X=[{url:Y,filename:`tts-${z}${VZ(Y,J)}`}],V=HZ(Z,["subtitle_file_download_url"]);if(V)X.push({url:V,filename:`tts-${z}${VZ(V,".srt")}`});return X}},qj={name:"mad",title:"一键剪 MAD",description:"素材文件夹(3~10 条视频)+ 可选 BGM → 自动选技法 → 单一 .jsx,AE 2020+ 跑一遍出 15~30s 卡点成片工程。仅支持 AE。",kind:"local",input:{kind:"directory"},priceKey:"audio_music_analyze",pricingContext:"仅 --bgm 卡点时",outputHint:"AE 母合成工程 .jsx",enabled:!0,options:[{flag:"--bgm <音频文件>",desc:"可选 BGM,卡点到 downbeat(需 API Key,计费一次;无 Key 则 BGM 仍入轨、固定节奏)"},{flag:"--duration <秒>",desc:"成片目标时长(默认 20,文案口径 15~30)"},{flag:"--seed <n>",desc:"随机种子(可复现;各工具语义见各自说明)"},{flag:"--refresh",desc:"强制忽略本地缓存、重拉当前 manifest 版本数据"}]},Uj=new Set(["list"]),d0=[SB,vB,wB,yB,xB,cB,kB,fB,hB,bB,gB,uB,mB,lB,dB,nB,pB,iB,oB,rB,aB,sB,tB,eB,Zj,Qj,Jj,zj,Xj,Kj,Gj,$j,Vj,Hj,qj];function nz(Z,Q=d0){return Q.find((Y)=>Y.name===Z)}function pz(Z=d0){let Q=new Set;for(let Y of Z){if(!Y.name)throw Error("descriptor 缺 name");if(Uj.has(Y.name))throw Error(`descriptor 名与保留字冲突:「${Y.name}」`);if(Q.has(Y.name))throw Error(`descriptor 名重复:「${Y.name}」`);if(Q.add(Y.name),!Y.enabled&&!Y.disabledReason)throw Error(`未启用工具缺 disabledReason:「${Y.name}」`);if(Y.kind==="cloud"&&!Y.taskType)throw Error(`cloud 型工具缺 taskType:「${Y.name}」`);if(Y.kind==="cloud"&&!Y.priceKey)throw Error(`cloud 型工具缺 priceKey:「${Y.name}」`);if(Y.kind==="cloud"&&!Y.mapOutputs&&!Y.mapResult)throw Error(`cloud 型工具须至少声明 mapOutputs 或 mapResult 之一:「${Y.name}」`);if(VQ.has(Y.input.kind)){if(!Y.buildPayloadMulti)throw Error(`多文件工具缺 buildPayloadMulti:「${Y.name}」`);if(Y.buildPayload)throw Error(`多文件工具不得声明 buildPayload(与 buildPayloadMulti 互斥):「${Y.name}」`);if(Y.preprocess)throw Error(`多文件工具不支持 preprocess:「${Y.name}」`);if(Y.input.maxDurationSec!=null)throw Error(`多文件工具不支持 maxDurationSec:「${Y.name}」`)}else if(Y.buildPayloadMulti)throw Error(`非多文件工具不得声明 buildPayloadMulti:「${Y.name}」`);if(Y.input.kind==="subtitle"&&Y.input.maxDurationSec!=null)throw Error(`字幕类工具不支持 maxDurationSec(文本文件无时长):「${Y.name}」`);if(Y.buildPayloadNone){if(Y.input.kind!=="none")throw Error(`非 none 工具不得声明 buildPayloadNone:「${Y.name}」`);if(Y.buildPayload||Y.buildPayloadMulti)throw Error(`buildPayloadNone 与其他 payload 钩子互斥:「${Y.name}」`)}if(Y.kind==="cloud"&&Y.input.kind==="none"){if((Y.preprocess?1:0)+(Y.buildPayloadNone?1:0)!==1)throw Error(`none 工具须声明 preprocess 或 buildPayloadNone 恰一:「${Y.name}」`)}}}var Dj=1800000,Oj=5000;function Pj(Z){if(Z==="true")return!0;if(Z==="false")return!1;if(Z.trim()!==""&&!Number.isNaN(Number(Z)))return Number(Z);return Z}function V7(Z,Q){let Y={};for(let J of Z){let z=J.indexOf("=");if(z<0)throw Error(`--param 需要 key=value 格式:「${J}」`);Y[J.slice(0,z).trim()]=Pj(J.slice(z+1))}if(Q){let J;try{J=JSON.parse(Q)}catch{throw Error(`--params-json 不是合法 JSON:${Q}`)}if(typeof J!=="object"||J===null||Array.isArray(J))throw Error("--params-json 必须是一个 JSON 对象");Object.assign(Y,J)}return Y}function KQ(Z,Q){for(let[Y,J]of Object.entries(Q)){let z=Z[Y],X=!!z&&!!J&&typeof z==="object"&&typeof J==="object"&&!Array.isArray(z)&&!Array.isArray(J);Z[Y]=X?{...z,...J}:J}}function Lj(Z,Q){let Y=Z.input;if(Y.kind==="none")return;if(!Q)throw Error(`${Z.name} 需要输入${Y.kind==="directory"?"目录":"文件"}`);if(!rz(Q))throw Error(`输入不存在:${Q}`);if(Y.kind==="directory")return;let J=Y.exts??mZ(Y.kind);if(J&&J.length){let z=d6(Q).toLowerCase();if(!J.includes(z))throw Error(`${Z.name} 需要 ${Y.kind} 输入,但拿到「${z||"无扩展名"}」(支持:${J.join(" ")})`+(Y.rejectHint?`。${Y.rejectHint}`:""))}}function Cj(Z,Q){if(!Q.length)throw Error(`${Z.name} 需要至少一个输入文件(可传多个,顺序即拼装顺序)`);let Y=Z.input.exts??mZ(Z.input.kind);for(let J of Q){if(!rz(J))throw Error(`输入不存在:${J}`);if(Y&&Y.length){let z=d6(J).toLowerCase();if(!Y.includes(z)){let X=Z.input.kind==="videos"?"视频":"图片";throw Error(`${Z.name} 需要${X}输入,但「${W7(J)}」是「${z||"无扩展名"}」(支持:${Y.join(" ")})`)}}}}function _j(Z,Q,Y,J){let z=Z.input.maxDurationSec;if(z==null||!Q)return;if(Y(Q,J)>z)throw Error(`视频超过 ${Math.round(z/60)} 分钟上限,请先裁剪`)}async function T9(Z,Q){let Y=await fetch(Z);if(!Y.ok||!Y.body)throw Error(`下载失败 HTTP ${Y.status}:${Z}`);await Rj(Mj.fromWeb(Y.body),Fj(Q))}async function E8(Z,Q,Y,J={}){let z=J.timeoutMs??Dj,X=J.intervalMs??Oj,V=J.getResult??T8,W=J.sleep??(($)=>new Promise((H)=>setTimeout(H,$))),K=J.now??Date.now,G=K();for(;;){if(K()-G>z)throw Error(`任务超时(超过 ${Math.round(z/60000)} 分钟)。可稍后凭 task_id(${Y})在云端查询或重试。`);await W(X);let $;try{$=await V(Z,Q,Y)}catch(H){if(K7(H)!=null)throw H;continue}if($.status==="completed")return $.output;if($.status==="failed"||$.status==="cancelled"){let H=$.output;throw Error(H?.error??($.status==="failed"?"任务失败":"任务已取消"))}J.onTick?.($.status||"处理中",$.progress)}}function K7(Z){let Q=Z&&typeof Z==="object"?Z.code:void 0;return typeof Q==="number"?Q:void 0}async function G7(Z){let Q=Z.deps,Y=await R8(Q.cfg,Z.uploadPath,Z.taskType,Z.buildPayload,{force:Z.forceReupload},{uploadCached:Q.uploadCached,invalidateUpload:Q.invalidateUpload,submitTask:Q.submitTask,sleep:Q.sleep??((z)=>new Promise((X)=>setTimeout(X,z)))});await Z.onSubmitted?.(Y);let J=await E8(Q.cfg,Z.taskType,Y.taskId,{timeoutMs:Z.pollTimeoutMs,intervalMs:Q.pollIntervalMs,getResult:Q.getTaskResult,sleep:Q.sleep,now:Q.now,onTick:Z.onTick});return{taskId:Y.taskId,fileId:Y.fileId,output:J}}var az=6004;async function iz(Z,Q,Y){let J=Q?D9:[];for(let z=0;;z++)try{return await Z()}catch(X){if(K7(X)!==az||z>=J.length)throw X;await Y(J[z])}}async function Tj(Z,Q,Y,J,z){let X=Z.sleep??((G)=>new Promise(($)=>setTimeout($,G))),V=[];for(let G of Q)V.push(await Z.uploadCached(Z.cfg,G,{force:z}));let W=()=>Z.submitTask(Z.cfg,Y,J(V.map((G)=>G.fileId))),K=V.some((G)=>!G.cached);try{return{taskId:await iz(W,K,X),fileIds:V.map(($)=>$.fileId),cached:!K}}catch(G){if(K7(G)!==az||!V.some((H)=>H.cached))throw G;for(let H=0;H<Q.length;H++)if(V[H].cached)await Z.invalidateUpload(Q[H]),V[H]=await Z.uploadCached(Z.cfg,Q[H],{force:!0});return{taskId:await iz(W,!0,X),fileIds:V.map((H)=>H.fileId),cached:!1}}}function Aj(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}function Ej(Z,Q,Y){if(Y)return X7(Y);if(Q){let J=W7(Q,d6(Q));return _9(Nj(Q),`${J}-${Z.name}`)}return _9(process.cwd(),`${Z.name}-${Aj()}`)}async function oz(Z){try{let Q=await jj(Z);return`${Q.size}:${Math.round(Q.mtimeMs)}`}catch{return}}function Ij(Z){process.stderr.write(`\x1B[33m⚠️ 计费提示:${Z}\x1B[0m
|
|
83
|
-
`)}async function
|
|
84
|
-
`)},$=Ej(Z,V,Y.out);if(z)Z.buildPayloadMulti(X.map(()=>"__dry_run__"),G);let H=Z.input.kind==="none"&&!!Z.buildPayloadNone,N=V;if(!z&&Z.preprocess)N=await Z.preprocess(G);if(!N&&!H)throw Error(`${Z.name} 缺上传物(input=none 的 cloud 型工具需 preprocess 产上传物或声明 buildPayloadNone)`);let U;try{U=(await(J.resolvePricing??g8)(Z.priceKey,Z.pricingContext)).billingHint}catch{U="实时价格暂不可用,以服务端结算为准"}Ij(U);let q=Z.taskType,M="",F,R,O=async()=>{await Bj($,{recursive:!0});let w=X?await Promise.all(X.map((x)=>oz(x))):V?await oz(V):void 0;await z7(_9($,"task.json"),JSON.stringify({tool:Z.name,taskType:q,taskId:M,fileId:F,...R?{fileIds:R}:{},source:X??V,fingerprint:w,createdAt:new Date().toISOString()},null,2))},P={timeoutMs:Z.pollTimeoutMs,intervalMs:J.pollIntervalMs,getResult:J.getTaskResult,sleep:J.sleep,now:J.now},D;if(H){let w=Z.buildPayloadNone(G);KQ(w,K),M=await J.submitTask(J.cfg,q,w),await O(),D=await E8(J.cfg,q,M,P)}else if(z){let x=await Tj(J,X,q,(m)=>{let r=Z.buildPayloadMulti(m,G);return KQ(r,K),r},!!Y.reupload);M=x.taskId,R=x.fileIds,F=x.fileIds[0],await O(),D=await E8(J.cfg,q,M,P)}else{let x=await G7({deps:J,uploadPath:N,taskType:q,buildPayload:(m)=>{let r=Z.buildPayload?Z.buildPayload(m,G):{file_id:m};return KQ(r,K),r},forceReupload:Y.reupload===!0,pollTimeoutMs:Z.pollTimeoutMs,onSubmitted:async(m)=>{M=m.taskId,F=m.fileId,await O()}});M=x.taskId,F=x.fileId,D=x.output}let T=D,_=[],L={},I=Z.mapOutputs?Z.mapOutputs(T,G):[];for(let w of I){let x=_9($,w.filename);try{await J.downloadStream(w.url,x),_.push(x)}catch(m){L[w.filename]=m instanceof Error?m.message:String(m)}}if(Z.postprocess)try{let w=await Z.postprocess(G,[..._],T);if(Array.isArray(w))_.push(...w)}catch(w){L[`${Z.name}:postprocess`]=w instanceof Error?w.message:String(w)}let E,y=Z.mapResult?Z.mapResult(T,G):void 0;if(y!=null)E=_9($,"result-output.json"),await z7(E,JSON.stringify(y,null,2));if(I.length===0&&E==null)L.output="任务完成但未解析到任何产物(下载链接与结构化结果均为空,output_result 形态异常)";let S={ok:Object.keys(L).length===0&&(_.length>0||E!=null),tool:Z.name,taskType:q,taskId:M,fileId:F,...R?{fileIds:R}:{},outDir:$,files:_,...E?{resultFile:E}:{},...Object.keys(L).length?{errors:L}:{}};return await z7(_9($,"result.json"),JSON.stringify({...S,finishedAt:new Date().toISOString()},null,2)),S}var n6="cli/video_long2short_for_cli",Sj=3600000,vj=(Z,Q)=>{return Q.push(Z),Q};function wj(Z={}){return{loadConfig:Z.loadConfig??FZ,probe:Z.probe??hZ,extract:Z.extract??T0,compress:Z.compress??k6,uploadSubtitle:Z.uploadSubtitle??uZ}}var yj={command:"long2short",afterward:"各段产出的 clip 可事后汇总成一张选题清单(分段是常态动作,不是降级方案)。"};function ez(Z,Q,Y,J,z,X,V){if(!Q.language||!Q.language.trim())throw Error("--language 必填(源语种,如 zh-CN;取值以服务端支持列表为准)");let W={file_id:Z,language:Q.language,project_formats:z,source_path:J,video_size:[Y.width,Y.height],video_rate:Y.fps,video_duration:Y.duration};if(Q.mainTopic)W.main_topic=Q.mainTopic;if(Q.outputSize)W.output_size=Q.outputSize;if(Q.jumpCut===!1)W.jump_cut=!1;if(V)W.subtitle_file_id=V;if(Q.subtitleOut)W.outputs=["project","report","subtitle"];if(Q.keepPunctuation)W.subtitle={strip_punctuation:!1};let K={};if(Q.durationPref)K.pref=Q.durationPref;if(Q.maxClipSec!=null){let G=Number(Q.maxClipSec);if(!Number.isFinite(G))throw Error(`--max-clip-sec 需要有限数值,拿到「${Q.maxClipSec}」`);K.max_clip_sec=G}if(Object.keys(K).length)W.duration=K;if(Q.splitScreen){let G={enable:!0};if(Q.splitOrientation)G.orientation=Q.splitOrientation;W.split_screen=G}if(X)W.struct_meta={nle_draft_dir:X};return KQ(W,V7(Q.param??[],Q.paramsJson)),W}async function xj(Z,Q,Y){let J=[],z=0,X=0;for(let[V,W]of Z.entries()){let K=I8(W,"jianying");if(!U7(K)){J.push(null);continue}X++;let G=`${Q}_clip${V}`;try{let $=await G6(K,G);if($.complete)z++,J.push(G);else J.push(null),Y[`clip${V}:jianying:draft`]=`草稿两件套不全(缺 ${$.missing.join("、")}),剪映列表里不会显示:${G}`}catch($){J.push(null),Y[`clip${V}:jianying:draft`]=$ instanceof Error?$.message:String($)}}return{paths:J,complete:z,attempted:X}}function ZX(Z){Z.command("long2short <input>").description("长剪短闭环:本地抽音频/720p 代理 → 只传抽出物 → 云端选段跳剪(可选分屏)→ 逐 clip 拉回 gtrk/剪映/PR 三方工程").option("--language <code>","源语种(必填,如 zh-CN;取值以服务端支持列表为准)").option("--split-screen","开启智能分屏:本地改传 720p 代理,云端在代理上检测多人同框并烤 720p 分屏素材(素材落毛片旁 split_screen/)").option("--split-orientation <o>","分屏方向 auto|lr|tb(缺省服务端 auto=按内容随机)").option("--main-topic <text>","主题引导(影响选段偏好)").option("--duration-pref <p>","成片时长偏好(缺省服务端 auto;成片条数由内容语义决定、不可指定)").option("--max-clip-sec <n>","单条成片时长安全上限(秒;缺省服务端默认)").option("--no-jump-cut","关闭跳剪(默认开:片内去水词/冗余,只删不重排)").option("--subtitle-file <path>","现成单语字幕文件(.srt/.ass)作转写来源,替代云端 ASR(切点=字幕行边界;双语/多层 .ass 会被拒)").option("--subtitle-out","逐 clip 另产单语 .srt 字幕(按目标画布档位智能拆行,落 clip{i}/srt/)").option("--keep-punctuation","字幕保留全部标点(缺省按统一口径去逗号句号、保留?!等)").option("--output-size <s>","输出画布 9:16|16:9|1:1 或自定义 WxH(缺省服务端 9:16)").option("-f, --formats <list>","三方格式(逗号分隔,云端逐 clip 直产)","gtrk,jianying,xml").option("--jianying-draft-dir <dir>","剪映草稿根目录;传路径或 auto(默认读 gtrk init 配置 / 自动探测)").option("-o, --out <dir>","产物根目录(缺省 = <毛片同目录>/<毛片名>-long2short)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--param <k=v>","透传任意云端参数(标量、可重复)",vj,[]).option("--params-json <json>",`透传任意云端参数(JSON 对象、支持嵌套;如 '{"split_screen":{"prefer_mode":"..."}}')`).option("--reupload","强制重新上传,忽略本地上传缓存").option("--no-open","完成后不自动打开产物根目录(默认会自动打开一次)").option("--json","机读模式:人读日志转 stderr,stdout 只输出根级结果 JSON").action(async(Q,Y)=>{await kj(Q,Y)})}async function kj(Z,Q,Y={}){if(Q.json)NZ();let J=wj(Y),z=J.loadConfig(),X=$7(Z);if(!U7(X))throw Error(`毛片不存在:${X}`);let V=A0(X,tz(X)),W=Q.formats.split(",").map((S)=>S.trim()).filter(Boolean);if(!W.includes("gtrk"))W.push("gtrk");let K=W.some((S)=>S==="jianying"||S==="capcut"),G=$7(Q.out??I8(H7(X),`${V}-long2short`)),$=A0(G),H;if(K)if(H=F0(Q.jianyingDraftDir),H)j.info(`剪映草稿根:${H}`);else j.warn("没找到剪映草稿目录 → 将只产 draft_content.json、缺 meta。可加 --jianying-draft-dir <你的草稿目录> 重跑。");let N=H?I8(H,$):void 0;j.step(`▶ 长剪短:${A0(X)}(${Q.splitScreen?"720p 代理 · 智能分屏":"纯选段 · 音频上传"},格式 ${W.join("/")})`),j.step("① 本地预处理(探几何 + 抽音频/720p 代理)…");let U=J.probe(X,Q.ffmpegPath);j.info(`原片几何 ${U.width}x${U.height} @ ${U.fps.toFixed(2)}fps · ${(U.duration/60).toFixed(1)}min`),f6(U.duration,yj);let q=Q.subtitleFile?$7(Q.subtitleFile):void 0;if(q){if(!U7(q))throw Error(`字幕文件不存在:${q}`);let S=tz(q).toLowerCase();if(S!==".srt"&&S!==".ass")throw Error(`--subtitle-file 只接受单语 .srt/.ass,拿到「${S||"无扩展名"}」`)}ez("__dry_run__",Q,U,X,W,N,void 0);let M=Q.splitScreen?await J.compress(X,Q.ffmpegPath):await J.extract(X,Q.ffmpegPath);O9(U.duration,M,Q.ffmpegPath),j.info(Q.splitScreen?`已压 720p 代理(上传物):${A0(M)}`:`已抽 16k 单声道 mp3(上传物):${A0(M)}`);let F;if(q){let S=await J.uploadSubtitle(z,q,{force:Q.reupload});F=S.fileId,j.info(`${S.cached?"命中上传缓存,复用":"已上传"}字幕文件(转写来源,跳过云端 ASR):${A0(q)}`)}j.step("② 上传抽出物到云端…");let R=await R8(z,M,n6,(S)=>ez(S,Q,U,X,W,N,F),{force:Q.reupload,onUploaded:(S)=>{j.info(S.cached?`命中上传缓存,复用 file_id = ${S.fileId}`:`file_id = ${S.fileId}`),j.step("③ 提交长剪短任务…")},onCacheInvalid:()=>j.warn("缓存的 file_id 在云端已失效,重新上传后重试…")}),{taskId:O,fileId:P}={taskId:R.taskId,fileId:R.fileId};j.info(`task_id = ${O}`),await q7(G,{recursive:!0}),await GQ(I8(G,"task.json"),JSON.stringify({taskId:O,taskType:n6,fileId:P,source:X,formats:W,createdAt:new Date().toISOString()},null,2)),j.step("④ 云端处理中(选段/跳剪"+(Q.splitScreen?"/分屏":"")+",每 5s 轮询)…");let D=await E8(z,n6,O,{timeoutMs:Sj,onTick:(S,w)=>j.tick(`${S}${w!=null?` ${Math.round(w)}%`:""}`)});j.tickEnd();let T=D.clips??[];if(!T.length)throw Error("云端未产出任何高光短片(clips 为空),请查 report/errors");let _={...D.errors??{}},L=D.report?.split_manifest??[],I=0;if(L.length){j.step(`⑤ 拉回分屏素材(${L.length} 条 → 毛片旁 split_screen/)…`);for(let[S,w]of L.entries()){let{expected_path:x,download_url:m}=w;if(!x||!m){_[`split_manifest[${S}]`]="缺 expected_path/download_url,已跳过";continue}if(!/^(?:[A-Za-z]:[\\/]|[\\/])/.test(x))x=I8(H7(X),x);try{await q7(H7(x),{recursive:!0}),await h8(m,x),I++}catch(r){_[`split:${A0(x)}`]=r instanceof Error?r.message:String(r),j.warn(`分屏素材下载失败(${A0(x)}),对应工程中该素材将缺席`)}}if(I)j.info(`分屏素材已落:${I}/${L.length} 条`)}j.step(`⑥ 逐 clip 拉回三方工程(共 ${T.length} 条)…`);let E=[];for(let[S,w]of T.entries()){let x=I8(G,`clip${S}`),{files:m,...r}=w;try{let c=await P9({outDir:x,output:{report:r,files:m??[],errors:{}},taskId:O,fileId:P,projName:`${V}-clip${S}`,json:!1,open:!1,quiet:!0});Object.assign(_,Object.fromEntries(Object.entries(c.errors).map(([g,k])=>[`clip${S}:${g}`,k]))),E.push({dir:x,title:w.title,files:c.files,ok:c.ok}),j.info(`clip${S}${w.title?`「${w.title}」`:""}:${Object.keys(c.files).join("/")||"(无产物)"}`)}catch(c){_[`clip${S}`]=c instanceof Error?c.message:String(c),E.push({dir:x,title:w.title,files:{},ok:!1}),j.warn(`clip${S} 落地失败(不连坐其余):${_[`clip${S}`]}`)}}if(H&&N){let S=await xj(E.map((m)=>m.dir),N,_);S.paths.forEach((m,r)=>{E[r].jianyingDraftPath=m});let{complete:w,attempted:x}=S;if(!x)j.warn("没有任何 clip 产出剪映草稿,草稿根未落地");else if(w===x)j.info(`剪映草稿:<草稿根>/${$}_clip{i} —— ${w}/${x} 条两件套齐全(剪映里直接可见)`);else if(w)j.info(`剪映草稿:<草稿根>/${$}_clip{i} —— ${w}/${x} 条两件套齐全(剪映里可见)`),j.warn(`另有 ${x-w} 条草稿两件套不全,剪映里不会显示(详见 result.json errors)`);else j.warn(`${x} 条草稿两件套均不全,剪映里不会显示(详见 result.json errors)`)}for(let[S,w]of E.entries())try{await q7(w.dir,{recursive:!0}),await GQ(I8(w.dir,"clip.md"),hz(T[S],S,w.files))}catch(x){_[`clip${S}:brief`]=x instanceof Error?x.message:String(x)}try{await GQ(I8(G,"clips.md"),bz(T,{source:X,jumpCut:Q.jumpCut!==!1,splitMaterials:{landed:I,total:L.length},taskId:O})),j.info("总览已生成:clips.md(逐条见 clip{i}/clip.md)")}catch(S){_["clips.md"]=S instanceof Error?S.message:String(S)}await GQ(I8(G,"report.json"),JSON.stringify(D.report??{},null,2));let y=Object.keys(_).length===0&&E.some((S)=>S.ok),f={ok:y,tool:"long2short",taskType:n6,taskId:O,fileId:P,outDir:G,clips:E,splitMaterials:{landed:I,total:L.length},reportFile:I8(G,"report.json"),...Object.keys(_).length?{errors:_}:{}};if(await GQ(I8(G,"result.json"),JSON.stringify({...f,finishedAt:new Date().toISOString()},null,2)),Q.json)console.log(JSON.stringify(f));if(Q.open)M0(G),j.info("已打开产物根目录");if(!y){j.err("部分产物未落地(任务已完成、积分可能已扣)。task.json 已保留,可凭 task_id 恢复取回。"),process.exitCode=1;return}j.ok(`闭环完成:${T.length} 条高光短片。产物根:${G}`)}import{resolve as fj,join as hj}from"node:path";var bj="cli/video_oral_cut_for_cli";function gj(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}function QX(Z){Z.command("oralcut-result <taskId>").description("按 task_id 取回已完成任务的报告 + 三方工程产物(可选 --render),不重跑云端").option("-o, --out <dir>","产物目录(缺省 = <当前目录>/<taskId>-video-project-<时间戳>)").option("--render","额外本地渲染成片(需原毛片仍在 gtrk 内嵌路径 + ffmpeg)").option("--crf <n>","本地渲染 CRF 14-28(默认 18;需配 --render)").option("--codec <c>","本地渲染编码(默认 h264;需配 --render)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 目录(缺省 ~/.gitruck/ffmpeg → 系统)").option("--jianying-draft-dir <dir>","剪映草稿根目录;传路径或 auto(默认读配置 / 自动探测)").option("--no-open","完成后不自动打开产物目录(默认会自动打开)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON(给 agent/脚本解析)").action(async(Q,Y)=>{await uj(Q,Y)})}async function uj(Z,Q){if(Q.json)NZ();let Y=FZ();j.step(`▶ 按 task_id 取回口播剪辑结果:${Z}`);let J;try{J=await T8(Y,bj,Z)}catch(V){if(V instanceof PZ)throw Error(`取任务结果失败(code=${V.code}):${V.message}。`+"注意:取结果需用「提交该任务的同一账号」的 API Key;异账号或已删任务会报 TASK_NOT_FOUND。");throw V}if(J.status!=="completed"){if(J.status==="failed"||J.status==="cancelled"){let W=J.output;throw Error(`任务未成功(${J.status}):${W?.error??"无产物可取回"}`)}let V=J.progress!=null?` ${Math.round(J.progress)}%`:"";throw Error(`任务尚未完成(当前 ${J.status||"未知"}${V}),暂无法取回结果;请稍后再试。`)}let z=fj(Q.out??hj(process.cwd(),`${Z}-video-project-${gj()}`)),X=F0(Q.jianyingDraftDir);await P9({outDir:z,output:J.output,taskId:Z,draftDir:X,render:Q.render,crf:Q.crf,codec:Q.codec,ffmpegPath:Q.ffmpegPath,json:Q.json,open:Q.open}),j.ok(`已取回。产物目录:${z}`)}import{spawnSync as lj}from"node:child_process";var mj=["win32"];function cj(Z=process.platform){return mj.includes(Z)}function YX(Z,Q=process.platform){return cj(Q)?`${Z}:${"irm https://api.ai-mcn.tv:9000/broadcast/exe/install.ps1 | iex"}`:null}function N7(Z){let Q=YX(Z);if(Q)j.info(Q)}function JX(Z){return lj(Z,{stdio:"inherit",shell:!0}).status??1}function zX(Z){Z.command("upgrade").description("升级 gtrk CLI 到最新版 + 刷新 skill(配置保留);--check 只查不装").option("--check","只检查有没有新版本,不执行升级").action(async(Q)=>{let Y=D0();j.step(`当前 v${Y},查询最新版…`);let J=await D6();if(!J){j.warn("查不到最新版本(网络问题?)。手动升级:npm i -g @gitruck/cli@latest"),N7("客户端(桌面端)升级");return}if(YQ(J,Y)<=0){j.ok(`已是最新版 v${Y}。`),N7("客户端(桌面端)如需升级");return}if(j.info(`发现新版本 v${J}(当前 v${Y})。`),Q.check){j.info("跑 `gtrk upgrade` 升级(会保留你现有的配置)。");return}if(j.step(`① 升级 CLI → v${J}…`),JX("npm i -g @gitruck/cli@latest")!==0){j.err("升级失败。手动重试:npm i -g @gitruck/cli@latest(若报权限,按你的 npm 全局目录权限处理)"),process.exitCode=1;return}if(j.step("② 通过通用适配器刷新 Agent Skills…"),JX("gtrk skills install")!==0)j.warn("skill 没刷成,手动跑一次:gtrk skills install");j.ok(`已升级到 v${J}。配置原样保留,直接接着用即可(gtrk doctor 可自检)。`),N7("客户端(桌面端)如需一起升级")})}import{resolve as z3,dirname as E7,join as MM,basename as I7,extname as RM}from"node:path";import{existsSync as DM}from"node:fs";import{resolve as Q1,dirname as GM,join as $M,basename as tX,extname as HM}from"node:path";import{existsSync as A7}from"node:fs";import{writeFile as eX,readFile as qM}from"node:fs/promises";import{createInterface as UM}from"node:readline/promises";import{spawn as SF}from"node:child_process";var _X=Z6(E6(),1);import{mkdirSync as CX,existsSync as aj,readdirSync as sj,statSync as tj,readFileSync as DX,rmSync as OX,unlinkSync as ej}from"node:fs";import{open as ZF}from"node:fs/promises";import{spawn as QF}from"node:child_process";import{dirname as YF,extname as PX,join as HQ,resolve as M7,basename as R7}from"node:path";var $Q="embed_endpoint_unreachable",dj=6033,WX=6201,VX=6202,o6=0.1,p6=16,XX=1024,KX=180000,i6=3,GX=1000;class r6 extends Error{code=$Q;constructor(Z){super(Z);this.name="EmbedError"}}class B7 extends Error{code;rejected=!0;constructor(Z,Q){super(`自建 embed 端点拒绝了请求(code=${Z}):${Q}`+(Z===dj?"——计量会话缺失或已过期(Redis TTL 2h):重跑 gtrk matrix index 会自动重开会话续跑(指纹增量,已完成素材零重算)":""));this.code=Z;this.name="EmbedRejectedError"}}function $X(Z){let Q=process.env.GITRUCK_EMBED_URL?.trim();if(Q)return Q;let Y=IZ().embedUrl?.trim();if(Y)return Y;return`${Z.replace(/\/+$/,"")}/task/cli/embed`}function nj(Z,Q){if(Z===429||Z>=500)return null;try{let Y=JSON.parse(Q);if(typeof Y.code==="number"&&Y.code!==200)return new B7(Y.code,typeof Y.msg==="string"&&Y.msg?Y.msg:`HTTP ${Z}`)}catch{}return null}async function pj(Z,Q,Y){let J=await Y.fetchFn(Z.url,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:JSON.stringify({input:Q,normalized:!0,...Y.sessionToken?{session_token:Y.sessionToken}:{}}),signal:AbortSignal.timeout(Y.timeoutMs)});if(!J.ok){let K=await J.text().catch(()=>""),G=nj(J.status,K);if(G)throw G;throw Error(`HTTP ${J.status}:${K.slice(0,200)}`)}let z=await J.json();if(typeof z.code==="number"&&z.code!==200)throw new B7(z.code,typeof z.msg==="string"?z.msg:`code=${z.code}`);let X=z.data;if(X&&typeof X==="object"&&!Array.isArray(X))X=X.data;if(!Array.isArray(X))throw Error("响应缺 data 数组(非 embed 契约响应)");let V=X;if(V.length!==Q.length)throw Error(`响应条数 ${V.length} 与输入 ${Q.length} 不符`);return[...V].sort((K,G)=>K.index-G.index).map((K)=>{if(!Array.isArray(K.embedding)||K.embedding.length!==XX)throw Error(`embedding 维度异常(期待满 ${XX} 维,得到 ${K.embedding?.length??"?"})`);return Float32Array.from(K.embedding)})}async function j7(Z,Q,Y={}){if(Q.length===0)return[];H8();let J=Y.fetchFn??fetch,z=Y.sleep??((K)=>new Promise((G)=>setTimeout(G,K))),X=Y.backoffBaseMs??GX,V=Y.timeoutMs??KX,W=[];for(let K=0;K<Q.length;K+=p6){let G=Q.slice(K,K+p6),$="",H=!1;for(let N=0;N<=i6;N++){if(N>0)await z(X*2**(N-1));try{W.push(...await pj(Z,G,{fetchFn:J,timeoutMs:V,sessionToken:Y.sessionToken})),H=!0;break}catch(U){if(U?.rejected===!0)throw U;$=U instanceof Error?U.message:String(U)}}if(!H)throw new r6(`自建 embed 端点不可达或响应异常(${Z.url}):${$}——已指数退避重试 ${i6} 次。`+"不会回落第三方端点;请确认同合云 embed API 已上线、~/.gitruck 配置 embedUrl / 环境变量 GITRUCK_EMBED_URL 指向正确")}return W}function HX(Z,Q){return`${Z.replace(/\/+$/,"")}/session/${Q}`}async function qX(Z,Q,Y,J){let z=J.fetchFn??fetch,X=J.sleep??((G)=>new Promise(($)=>setTimeout($,G))),V=J.backoffBaseMs??GX,W=J.timeoutMs??KX,K="";for(let G=0;G<=i6;G++){if(G>0)await X(V*2**(G-1));try{let $=await z(Z,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Q},body:JSON.stringify(Y),signal:AbortSignal.timeout(W)}),H=await $.text().catch(()=>""),N={};try{N=JSON.parse(H)}catch{}let U=typeof N.code==="number"?N.code:void 0;if($.ok&&(U===void 0||U===200))return{code:U,msg:typeof N.msg==="string"?N.msg:void 0,data:N.data};if(U!==void 0&&U!==200&&$.status!==429&&$.status<500)throw new PZ(U,typeof N.msg==="string"&&N.msg?N.msg:`code=${U}`);K=`HTTP ${$.status}:${(typeof N.msg==="string"?N.msg:H).slice(0,200)}`}catch($){if($ instanceof PZ)throw $;K=$ instanceof Error?$.message:String($)}}throw new r6(`计量会话端点不可达或响应异常(${Z}):${K}——已指数退避重试 ${i6} 次`)}async function UX(Z,Q,Y={}){if(!(Number.isInteger(Q)&&Q>0))throw Error(`planned_units 必须为正整数(得到 ${Q})——零计划帧不开会话`);let J=HX(Z.url,"open"),X=(await qX(J,Z.apiKey,{planned_units:Q},Y)).data??{};if(typeof X.session_token!=="string"||!X.session_token)throw new r6(`会话 open 响应缺 session_token(${J})——非计量会话契约响应`);return{sessionToken:X.session_token,preDeductedCredits:typeof X.pre_deducted_credits==="number"?X.pre_deducted_credits:0}}async function NX(Z,Q,Y={}){let J=HX(Z.url,"close"),X=(await qX(J,Z.apiKey,{session_token:Q},Y)).data??{},V=(W)=>typeof W==="number"&&Number.isFinite(W)?W:0;return{usedUnits:V(X.used_units),settledCredits:V(X.settled_credits),refundedCredits:V(X.refunded_credits)}}import{cpus as JF}from"node:os";var F7=2,ij=new Set(["yuv420p","yuvj420p","nv12","yuv420p10le","p010le"]),oj=new Set(["h264","hevc","av1","vp9","mpeg2video","vc1"]);function BX(Z){let Q=Z.proxyWidth??384,Y=Z.proxyScaler??"neighbor";switch(Z.lane){case"gpu":return["-hwaccel","cuda","-hwaccel_output_format","cuda","-i",Z.src,"-vf",`scale_cuda=${Q}:-2:format=nv12,hwdownload,format=nv12,select='gte(scene,0)',metadata=print`,"-f","null","-"];case"cpu_proxy":return["-i",Z.src,"-vf",`scale=${Q}:-2:flags=${Y},select='gte(scene,0)',metadata=print`,"-f","null","-"];case"cpu_full":return["-i",Z.src,"-vf","select='gte(scene,0)',metadata=print","-f","null","-"]}}function jX(Z=0){return["-hide_banner","-v","error","-init_hw_device",`cuda=g:${Z}`,"-filter_hw_device","g","-f","lavfi","-i","color=c=black:s=256x144:d=0.04","-vf","format=nv12,hwupload,scale_cuda=64:-2:format=nv12,hwdownload,format=nv12","-frames:v","1","-f","null","-"]}function FX(Z,Q){let Y=(Z.codecName||"").toLowerCase(),J=(Z.pixFmt||"").toLowerCase();if(!Y||!J)return{ok:!1,reason:"codec_unknown"};if(!oj.has(Y))return{ok:!1,reason:`codec_${Y}`};if(!ij.has(J))return{ok:!1,reason:`pixfmt_${J}`};if(Y==="h264"&&Q.cores>=8)return{ok:!1,reason:"h264_cpu_wins"};return{ok:!0,reason:"ok"}}function MX(Z){if(Z==="gpu")return"cpu_proxy";if(Z==="cpu_proxy")return"cpu_full";return null}function rj(Z){if(Z==="codec_unknown")return"探不到编码信息";if(Z==="h264_cpu_wins")return"H.264 在多核机上软解更快";if(Z.startsWith("pixfmt_"))return`像素格式 ${Z.slice(7)} 无硬解支持`;if(Z.startsWith("codec_"))return`编码 ${Z.slice(6)} 无硬解支持`;return Z}function RX(Z){if(!Z.length)return null;let Q=new Map;for(let J of Z)Q.set(J.reason,(Q.get(J.reason)??0)+1);let Y=[...Q.entries()].sort((J,z)=>z[1]-J[1]).map(([J,z])=>`${rj(J)} ${z} 个`);return`GPU 硬解对 ${Z.length} 个素材不适用(${Y.join("、")}),已自动走 CPU 解码——索引结果不受影响`}var e8=0.3,E0=0.05,zF=0.5,XF=2,LX=512,WF=0.5,TX=/\.(mp4|mov|m4v|mkv|webm|avi|wmv|mpg|mpeg|ts|mts|m2ts|flv)$/i,AX=/\.(jpg|jpeg|png|webp|bmp|gif|tif|tiff|heic|heif|avif)$/i;function qQ(Z){if(TX.test(Z))return"video";if(AX.test(Z))return"image";return null}function VF(){return process.env.GITRUCK_LOCAL_INDEX_DIR?.trim()||Y6("local-broll-index")}function I0(){return HQ(VF(),"index.db")}async function KF(Z){let Q=await _X.createBLAKE3();Q.init();let Y=await ZF(Z,"r");try{let J=Buffer.alloc(8388608);for(;;){let{bytesRead:z}=await Y.read(J,0,J.length,-1);if(z===0)break;Q.update(J.subarray(0,z))}return Q.digest("hex")}finally{await Y.close()}}async function a6(Z){return`${P0}${(await KF(Z)).slice(0,16)}`}async function GF(Z){if(CX(YF(Z),{recursive:!0}),typeof globalThis.Bun<"u"){let{Database:J}=await import("bun:sqlite"),z=new J(Z,{create:!0});return{exec:(X)=>z.exec(X),run:(X,V=[])=>void z.query(X).run(...V),all:(X,V=[])=>z.query(X).all(...V),get:(X,V=[])=>z.query(X).get(...V)??void 0,close:()=>z.close()}}let{DatabaseSync:Q}=await import("node:sqlite"),Y=new Q(Z);return{exec:(J)=>Y.exec(J),run:(J,z=[])=>void Y.prepare(J).run(...z),all:(J,z=[])=>Y.prepare(J).all(...z),get:(J,z=[])=>Y.prepare(J).get(...z)??void 0,close:()=>Y.close()}}function EX(Z,Q){Z.exec("BEGIN IMMEDIATE");try{Q(),Z.exec("COMMIT")}catch(Y){try{Z.exec("ROLLBACK")}catch{}throw Y}}var $F=`
|
|
81
|
+
`}import{resolve as K7,join as A9,dirname as Cj,basename as G7,extname as s6}from"node:path";import{mkdir as _j,writeFile as V7,stat as Tj}from"node:fs/promises";import{createWriteStream as Aj,existsSync as YX}from"node:fs";import{Readable as Ej}from"node:stream";import{pipeline as Ij}from"node:stream/promises";function Q7(Z){return typeof Z==="number"&&Number.isFinite(Z)}function IB(Z){if(!Array.isArray(Z))throw Error("价格表响应不是数组");let Q=new Map;for(let Y of Z){if(!Y||typeof Y!=="object")continue;let J=Y,z=typeof J.key==="string"?J.key.trim():"",X=typeof J.measure==="string"?J.measure.trim():"";if(!z||!X||!Q7(J.price)||!Q7(J.exPrice))continue;Q.set(z,{...Q7(J.taskTypeId)?{taskTypeId:J.taskTypeId}:{},...typeof J.name==="string"?{name:J.name}:{},key:z,price:J.price,exPrice:J.exPrice,measure:X,...typeof J.note==="string"?{note:J.note}:{}})}return Q}async function Y7(Z=fetch){let Q=await Z("https://cloud.ai-mcn.tv/api/get_price_list",{method:"GET",headers:{Accept:"application/json"},signal:AbortSignal.timeout(5000)});if(!Q.ok)throw Error(`价格表请求失败 HTTP ${Q.status}`);return IB(await Q.json())}function SB(Z,Q){let Y;if(Z.price===0&&Z.exPrice===0)Y=`免费(0 积分/${Z.measure})`;else if(Z.price===Z.exPrice)Y=`${Z.price} 积分/${Z.measure}`;else Y=`标准价 ${Z.price} 积分/${Z.measure};超额价 ${Z.exPrice} 积分/${Z.measure}`;return Q?`${Q}:${Y}`:Y}function r6(Z,Q,Y){let J=Q?.get(Z);if(!J)return{billingHint:Y?`${Y}:${"实时价格暂不可用,以服务端结算为准"}`:"实时价格暂不可用,以服务端结算为准",pricing:{key:Z,available:!1}};return{billingHint:SB(J,Y),pricing:{key:Z,available:!0,price:J.price,exPrice:J.exPrice,measure:J.measure}}}async function m8(Z,Q,Y=fetch){try{return r6(Z,await Y7(Y),Q)}catch{return r6(Z,void 0,Q)}}import{readFileSync as vB}from"node:fs";import{readFile as wB,writeFile as yB}from"node:fs/promises";import{dirname as oz,extname as rz,join as az,resolve as xB}from"node:path";var qQ=new Set(["images","videos"]),kB=[".jpg",".jpeg",".png",".webp",".bmp",".gif",".tif",".tiff",".heic",".heif",".avif"],sz=[".mp4",".mov",".mkv",".webm",".avi",".m4v",".flv",".wmv",".mpg",".mpeg",".ts",".m2ts"],a6=[".mp3",".wav",".m4a",".aac",".flac",".ogg",".opus",".wma"],fB=[".ass",".srt"],J7=(Z)=>a6.includes(rz(Z).toLowerCase()),J8=[".mp4",".avi",".mpg",".mov",".flv",".mxf",".mpeg",".ogg",".3gp",".wmv",".h264",".m4v",".ts"];function uZ(Z){if(Z==="image"||Z==="images")return kB;if(Z==="video"||Z==="videos")return sz;if(Z==="audio")return a6;if(Z==="subtitle")return fB;return}function $Z(Z,Q){for(let Y of Q){let J=Z[Y];if(typeof J==="string"&&J.trim())return J}return}function VZ(Z,Q){let Y=Z;try{Y=new URL(Z).pathname}catch{Y=Z.split("?")[0]??Z}return rz(Y)||Q}function hB(Z){if(!Z||!(Z.width>0)||!(Z.height>0))return{fellBack:!0};return Z.height>Z.width?{width:1080,height:1920,fellBack:!1}:{width:1920,height:1080,fellBack:!1}}function bB(Z,Q){if(!b8(Q))return;try{let Y=hZ(Z,Q);if(Y.width>0&&Y.height>0)return{width:Y.width,height:Y.height}}catch{}return}var gB=new Set(["up_to_down","down_to_up","left_to_right","right_to_left","right_up_to_left_down","left_up_to_right_down","right_down_to_left_up","left_down_to_right_up","zoom_in_up","zoom_in_down","zoom_in_left","zoom_in_right","zoom_in_left_up","zoom_in_right_up","zoom_in_left_down","zoom_in_right_down","zoom_in_center","zoom_out_up","zoom_out_down","zoom_out_left","zoom_out_right","zoom_out_left_up","zoom_out_right_up","zoom_out_left_down","zoom_out_right_down","zoom_out_center"]),uB={name:"image_move",title:"图转运镜",description:"把一张静态图生成带运镜的短视频。",kind:"cloud",input:{kind:"image"},priceKey:"image_move_local",outputHint:"运镜视频",enabled:!0,taskType:"image_move",options:[{flag:"--motion <value>",desc:"运镜方式(未传则云端自动选择;显式指定后同图同参重跑结果一致)。"+"平移 8:up_to_down/down_to_up/left_to_right/right_to_left 及四条对角线;"+"放大锚点 9:zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center};"+"缩小锚点 9:zoom_out_ 同九方位"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.motion!=null){let z=String(Q.opts.motion);if(!gB.has(z))throw Error(`--motion 不支持「${z}」。合法值:平移 8(up_to_down/down_to_up/left_to_right/right_to_left/`+"right_up_to_left_down/left_up_to_right_down/right_down_to_left_up/left_down_to_right_up)、"+"放大锚点 9(zoom_in_{up,down,left,right,left_up,right_up,left_down,right_down,center})、"+"缩小锚点 9(zoom_out_ 同九方位)");Y.motion=z}if(!(Q.extraParams.width!=null||Q.extraParams.height!=null)&&Q.inputAbs){let z=bB(Q.inputAbs,Q.ffmpegPath),X=hB(z);if(X.width&&X.height)Y.width=X.width,Y.height=X.height;if(X.fellBack)Q.warn("未探测到图片朝向(缺 ffprobe),将按云端默认横屏 1920×1080 出片;"+"可用 --param width=… --param height=… 显式指定几何。")}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url","video_download_url","url"]);if(!Y)return[];return[{url:Y,filename:`${Q.baseName}-image_move${VZ(Y,".mp4")}`}]}},mB={name:"image_matting",title:"图片抠像",description:"把图片主体从背景抠出,产透明背景 png(可经 --param 请求额外背景底板输出)。",kind:"cloud",input:{kind:"image"},priceKey:"image_matting",outputHint:"透明 png",enabled:!0,taskType:"image_matting",buildPayload(Z){return{file_id:Z,output_format:"png"}},mapOutputs(Z,Q){let Y=[],J=$Z(Z,["download_url","image_download_url","url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-matte${VZ(J,".png")}`});let z=$Z(Z,["background_download_url","bg_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}-bg${VZ(z,".png")}`});return Y}},cB={name:"image_blackborder_remove",title:"图片去黑边",description:"自动检测并裁去单张图片四周的黑边,保留有效画面。",kind:"cloud",input:{kind:"image"},priceKey:"image_blackborder_remove",outputHint:"去黑边图片",enabled:!0,taskType:"image_blackborder_remove",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-blackborder-removed${VZ(Y,".jpg")}`}]:[]}},lB={name:"image_canvas_adapt",title:"图片比例转换",description:"把单张图片适配到目标画布尺寸,可选适配、矩形裁剪或方形裁剪。",kind:"cloud",input:{kind:"image"},priceKey:"image_canvas_adapt",outputHint:"比例适配图片",enabled:!0,taskType:"image_canvas_adapt",options:[{flag:"--canvas-width <px>",desc:"目标画布宽度(像素;未传则使用服务端默认)"},{flag:"--canvas-height <px>",desc:"目标画布高度(像素;未传则使用服务端默认)"},{flag:"--canvas-type <normal|rectangle|square>",desc:"画布模式:normal、rectangle 或 square(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z};for(let[J,z,X]of[["canvasWidth","canvas_width","--canvas-width"],["canvasHeight","canvas_height","--canvas-height"]]){if(Q.opts[J]==null)continue;let W=Number(Q.opts[J]);if(!Number.isFinite(W))throw Error(`${X} 必须是数字`);Y[z]=W}if(Q.opts.canvasType!=null){let J=String(Q.opts.canvasType);if(J!=="normal"&&J!=="rectangle"&&J!=="square")throw Error("--canvas-type 只支持 normal、rectangle 或 square");Y.canvas_type=J}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-canvas-adapted${VZ(Y,".jpg")}`}]:[]}},dB={name:"image_purify",title:"图片净化",description:"清理你有权处理的图片中的水印、Logo 或叠加元素。",kind:"cloud",input:{kind:"image"},priceKey:"image_purify",outputHint:"净化图片",enabled:!0,taskType:"image_purify",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-purified${VZ(Y,".jpg")}`}]:[]}},nB={name:"video_blackborder_remove",title:"视频去黑边",description:"自动检测并裁去单条视频四周的黑边,保留有效画面与原音轨。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_blackborder_remove",outputHint:"去黑边视频",enabled:!0,taskType:"video_blackborder_remove",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-blackborder-removed${VZ(Y,".mp4")}`}]:[]}},pB={name:"video_canvas_adapt",title:"视频比例转换",description:"把单条视频适配到目标画布,可选截取时间片段并移除音轨。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_canvas_adapt",outputHint:"比例适配视频",enabled:!0,taskType:"video_canvas_adapt",options:[{flag:"--canvas-width <px>",desc:"目标画布宽度(像素;未传则使用服务端默认)"},{flag:"--canvas-height <px>",desc:"目标画布高度(像素;未传则使用服务端默认)"},{flag:"--canvas-type <normal|rectangle|square>",desc:"画布模式:normal、rectangle 或 square(未传则使用服务端默认)"},{flag:"--clip-start <frame>",desc:"截取起始帧序号(未传则使用服务端默认)"},{flag:"--clip-end <frame>",desc:"截取结束帧序号(未传则使用服务端默认)"},{flag:"--without-audio",desc:"输出视频不保留音轨"}],buildPayload(Z,Q){let Y={file_id:Z};for(let[J,z,X]of[["canvasWidth","target_width","--canvas-width"],["canvasHeight","target_height","--canvas-height"]]){if(Q.opts[J]==null)continue;let W=Number(Q.opts[J]);if(!Number.isFinite(W)||!Number.isInteger(W))throw Error(`${X} 必须是有限整数`);Y[z]=W}for(let[J,z,X]of[["clipStart","start","--clip-start"],["clipEnd","end","--clip-end"]]){if(Q.opts[J]==null)continue;let W=Number(Q.opts[J]);if(!Number.isFinite(W)||!Number.isInteger(W))throw Error(`${X} 必须是有限整数帧号`);Y[z]=W}if(Q.opts.canvasType!=null){let J=String(Q.opts.canvasType);if(J!=="normal"&&J!=="rectangle"&&J!=="square")throw Error("--canvas-type 只支持 normal、rectangle 或 square");Y.canvas_type=J}if(Q.opts.withoutAudio===!0)Y.need_audio=!1;return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-canvas-adapted${VZ(Y,".mp4")}`}]:[]}},iB={name:"video_stabilizer",title:"视频防抖",description:"稳定手持或运动拍摄画面;exp 为实验方式,产物观感需自行检查。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_stabilizer",outputHint:"防抖视频",enabled:!0,taskType:"video_stabilizer",options:[{flag:"--stabilizer-method <fast|exp|turbo>",desc:"防抖方式(未传则使用服务端 turbo 默认值)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.stabilizerMethod==null)return Y;let J=String(Q.opts.stabilizerMethod);if(J!=="fast"&&J!=="exp"&&J!=="turbo")throw Error("--stabilizer-method 只支持 fast、exp 或 turbo");return Y.method=J,Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-stabilized${VZ(Y,".mp4")}`}]:[]}},oB={name:"video_vaporwave",title:"视频蒸汽波滤镜",description:"按精确预设名称为单条视频应用蒸汽波风格滤镜。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_vaporwave",outputHint:"蒸汽波滤镜视频",enabled:!0,taskType:"video_vaporwave",options:[{flag:"--vaporwave-filter <name>",desc:"精确滤镜名称(默认:愈漸升溫)"}],buildPayload(Z,Q){let Y=Q.opts.vaporwaveFilter,J=Y==null?"愈漸升溫":String(Y);if(!J.trim())throw Error("--vaporwave-filter 不能为空");return{file_id:Z,filter:J}},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-vaporwave${VZ(Y,".mp4")}`}]:[]}};function iz(Z){let Q,Y=!1;if(typeof Z==="string"){Y=!0;let K=Z.split(",");if(K.length!==4||K.some((G)=>!G.trim()))throw Error("--purify-roi 必须是 x,y,w,h 四个归一化数字");Q=K}else if(Z&&typeof Z==="object"&&!Array.isArray(Z)){let K=Z;Q=[K.x,K.y,K.w,K.h]}else throw Error("ROI 必须包含归一化数字 x、y、w、h");let J=Q.map((K)=>{if(typeof K==="number")return K;if(Y&&typeof K==="string")return Number(K);return Number.NaN});if(J.some((K)=>!Number.isFinite(K)))throw Error("ROI 的 x、y、w、h 必须是有限数字");let[z,X,W,V]=J;if(z<0||z>1||X<0||X>1||W<=0||W>1||V<=0||V>1||z+W>1||X+V>1)throw Error("ROI 必须满足 0≤x,y≤1、0<w,h≤1、x+w≤1、y+h≤1");return{x:z,y:X,w:W,h:V}}var rB={name:"video_purify",title:"视频净化",description:"清理你有权处理的视频中的水印、字幕或指定区域;不承诺还原被遮挡的原始内容。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_purify",outputHint:"净化视频",enabled:!0,taskType:"video_purify",pollTimeoutMs:14400000,options:[{flag:"--purify-scope <full_screen|subtitle|custom>",desc:"净化范围;未传时使用服务端 full_screen 默认值"},{flag:"--purify-method <ffmpeg|raft>",desc:"净化方式;未传时使用服务端 ffmpeg 默认值,raft 仅支持 20 分钟以内视频"},{flag:"--purify-roi <x,y,w,h>",desc:"custom 模式的归一化矩形区域"}],buildPayload(Z,Q){let Y={file_id:Z},J=Q.opts.purifyScope,z=J==null?void 0:String(J);if(z!=null&&z!=="full_screen"&&z!=="subtitle"&&z!=="custom")throw Error("--purify-scope 只支持 full_screen、subtitle 或 custom");if(z!=null)Y.purify_scope=z;let X=Q.opts.purifyMethod,W=X==null?void 0:String(X);if(W!=null&&W!=="ffmpeg"&&W!=="raft")throw Error("--purify-method 只支持 ffmpeg 或 raft");if(W!=null)Y.purify_func_type=W;let V=Q.opts.purifyRoi;if(V!=null){if(z!=="custom")throw Error("--purify-roi 只能与 --purify-scope custom 一起使用");Y.roi=iz(V)}else if(z==="custom"){if(Q.extraParams.roi==null)throw Error("--purify-scope custom 必须同时提供 --purify-roi 或 params-json.roi");iz(Q.extraParams.roi)}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-purified${VZ(Y,".mp4")}`}]:[]}},aB={name:"video_upscale",title:"视频超分",description:"对一分钟以内的低分辨率视频做实验性 GPU 超分;效果需自行检查。",kind:"cloud",input:{kind:"video",exts:J8,maxDurationSec:60},priceKey:"video_upscale",outputHint:"超分视频",enabled:!0,taskType:"video_upscale",pollTimeoutMs:14400000,options:[{flag:"--upscale-times <2|3|4>",desc:"超分倍数;未传时使用服务端 2 倍默认值"},{flag:"--upscale-type <Reality|Anime>",desc:"写实或动漫类型;未传时使用服务端 Reality 默认值"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.upscaleTimes!=null){let J=Number(Q.opts.upscaleTimes);if(!Number.isInteger(J)||J!==2&&J!==3&&J!==4)throw Error("--upscale-times 只支持 2、3 或 4");Y.times=J}if(Q.opts.upscaleType!=null){let J=String(Q.opts.upscaleType);if(J!=="Reality"&&J!=="Anime")throw Error("--upscale-type 只支持 Reality 或 Anime");Y.upscale_type=J}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-upscaled${VZ(Y,".mp4")}`}]:[]}},sB={name:"video_interpolate",title:"视频插帧",description:"以 GPU 帧插值提升视频流畅度;不附加未经服务端声明的时长限制。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_interpolate",outputHint:"插帧视频",enabled:!0,taskType:"video_interpolate",pollTimeoutMs:14400000,options:[{flag:"--interpolate-multiplier <2|3|4>",desc:"插帧倍数;未传时使用服务端 2 倍默认值"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.interpolateMultiplier!=null){let J=Number(Q.opts.interpolateMultiplier);if(!Number.isInteger(J)||J!==2&&J!==3&&J!==4)throw Error("--interpolate-multiplier 只支持 2、3 或 4");Y.multiplier=J}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-interpolated${VZ(Y,".mp4")}`}]:[]}},tB={name:"video_matting",title:"视频抠像",description:"把视频主体从背景抠出,产透明背景 webm(像素级、原片直传不压代理;单片 ≤10 分钟)。",kind:"cloud",input:{kind:"video",maxDurationSec:600},priceKey:"video_matting",outputHint:"透明 webm",enabled:!0,taskType:"video_matting",pollTimeoutMs:3600000,buildPayload(Z){return{file_id:Z,target_mode:"auto",output_format:"webm"}},mapOutputs(Z,Q){let Y=[],J=$Z(Z,["download_url","video_download_url","url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-matte${VZ(J,".webm")}`});let z=$Z(Z,["mask_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}-mask${VZ(z,".webm")}`});return Y}},eB={name:"audio_separation",title:"人声伴奏分离",description:"把单条音频分离为人声与伴奏,可返回其中一项或两项。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_separation",outputHint:"人声与伴奏音频",enabled:!0,taskType:"audio_separation",options:[{flag:"--mode <fast|turbo>",desc:"处理档位(默认 fast,可选 turbo)"}],buildPayload(Z,Q){let Y=Q.opts.mode,J=Y==null?"fast":String(Y);if(J!=="fast"&&J!=="turbo")throw Error("--mode 只支持 fast 或 turbo");return{file_id:Z,mode:J}},mapOutputs(Z,Q){if(!Array.isArray(Z.files))return[];let Y=[];for(let J of Z.files){if(!J||typeof J!=="object")continue;let z=J,X=z.type,W=z.download_url;if(X!=="vocals"&&X!=="instrumental"||typeof W!=="string"||!W.trim())continue;Y.push({url:W,filename:`${Q.baseName}-${X}${VZ(W,".wav")}`})}return Y}},Zj={name:"audio_noise_reduce",title:"音频降噪",description:"对音频或视频中的声音降噪,输出降噪后的音频。",kind:"cloud",input:{kind:"audio",exts:[...a6,...sz]},priceKey:"audio_noise_reduce",outputHint:"降噪音频",enabled:!0,taskType:"audio_noise_reduce",options:[{flag:"--prop-decrease <0..1>",desc:"降噪强度(0 到 1;未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.propDecrease!=null){let J=Number(Q.opts.propDecrease);if(!Number.isFinite(J)||J<0||J>1)throw Error("--prop-decrease 必须是 0 到 1 的数字");Y.prop_decrease=J}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-denoise${VZ(Y,".wav")}`}]:[]}},Qj={name:"audio_silence_remove",title:"静音片段移除",description:"移除音频中过长的静音片段,输出压缩停顿后的音频。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_silence_remove",outputHint:"去静音音频",enabled:!0,taskType:"audio_silence_remove",options:[{flag:"--min-silence-len <ms>",desc:"被视为静音片段的最短毫秒数(未传则使用服务端默认)"},{flag:"--desired-silence-len <ms>",desc:"处理后保留的静音毫秒数(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z};for(let[J,z,X]of[["minSilenceLen","min_silence_len","--min-silence-len"],["desiredSilenceLen","desired_silence_len","--desired-silence-len"]]){if(Q.opts[J]==null)continue;let W=Number(Q.opts[J]);if(!Number.isFinite(W)||W<0)throw Error(`${X} 必须是非负毫秒数`);Y[z]=W}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-desilence${VZ(Y,".wav")}`}]:[]}},Yj={name:"video_segment",title:"视频机械分镜",description:"按画面变动率把视频切成分镜区间,输出结构化 JSON(场景数与各段起止/时长),不产切片文件。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_segment",outputHint:"分镜区间结构(result-output.json)",enabled:!0,taskType:"video_segment",options:[{flag:"--detector <content|adaptive>",desc:"切分算法(未传则使用服务端默认)"},{flag:"--threshold <number>",desc:"切分阈值(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z,only_struct:!0};if(Q.opts.detector!=null){let J=String(Q.opts.detector);if(J!=="content"&&J!=="adaptive")throw Error("--detector 只支持 content 或 adaptive");Y.detector=J}if(Q.opts.threshold!=null){let J=Number(Q.opts.threshold);if(!Number.isFinite(J))throw Error("--threshold 必须是数字");Y.threshold=J}return Y},mapResult(Z){return Z}},Jj={name:"video_ai_segment",title:"视频智能分镜",description:"按语义把视频切成带类目、景别、标签、描述的镜头结构,输出结构化 JSON,不产切片文件。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_ai_segment",outputHint:"语义分镜结构(result-output.json)",enabled:!0,taskType:"video_ai_segment",options:[{flag:"--segment-mode <scene|shot_type|narrative|subject>",desc:"分镜维度(未传则使用服务端默认)"}],buildPayload(Z,Q){let Y={file_id:Z,only_struct:!0};if(Q.opts.segmentMode!=null){let J=String(Q.opts.segmentMode);if(J!=="scene"&&J!=="shot_type"&&J!=="narrative"&&J!=="subject")throw Error("--segment-mode 只支持 scene、shot_type、narrative 或 subject");Y.mode=J}return Y},mapResult(Z){return Z}},zj={name:"video_motion_cut",title:"视频运镜高光",description:"用光流分析提取运镜/高光片段,输出结构化 JSON(每片帧号、秒级时码与运动特征),不产文件。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_motion_cut",outputHint:"运镜高光片段结构(result-output.json)",enabled:!0,taskType:"video_motion_cut",buildPayload(Z){return{file_id:Z}},mapResult(Z){return Z}};function E8(Z,Q){if(Z==null)return;let Y=Number(Z);if(!Number.isFinite(Y))throw Error(`${Q} 需要有限数值,拿到「${String(Z)}」`);return Y}var Xj={name:"video_speaker_detect",title:"音视频说话人检测",description:"检测画面中谁在何时说话(融合语音转写与人脸/人身追踪),输出可见说话人结构化 JSON,不产文件。重 GPU 能力、按分钟计费较高,长片先想清楚。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_speaker_detect",outputHint:"可见说话人结构(result-output.json,时基以服务端输出为准)",enabled:!0,taskType:"video_speaker_detect",options:[{flag:"--max-faces-per-frame <n>",desc:"单帧最多检测人脸数(未传则服务端默认)"},{flag:"--detect-body",desc:"同时检测人身(未传则服务端默认关闭)"},{flag:"--track-sample-fps <n>",desc:"追踪采样帧率(未传则服务端默认)"}],buildPayload(Z,Q){let Y=Q.opts,J={file_id:Z};if(typeof Y.language==="string"&&Y.language.trim())J.language=Y.language;let z=E8(Y.maxFacesPerFrame,"--max-faces-per-frame");if(z!=null)J.max_faces_per_frame=z;if(Y.detectBody===!0)J.detect_body=!0;let X=E8(Y.trackSampleFps,"--track-sample-fps");if(X!=null)J.track_sample_fps=X;return J},mapResult(Z){return Z}},Wj={name:"video_face_track",title:"多脸追踪/身份聚类",description:"追踪视频中的人脸并聚成稳定人物 ID(出场时间段与轨迹),输出结构化 JSON,不产文件;`time_ranges` 经 --params-json 透传。重 GPU 能力、按分钟计费较高。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_face_track",outputHint:"人物 ID/时间段/轨迹结构(result-output.json,时基以服务端输出为准)",enabled:!0,taskType:"video_face_track",options:[{flag:"--sample-fps <n>",desc:"检测采样帧率(未传则服务端默认)"},{flag:"--max-faces <n>",desc:"最多聚类人物数(未传则服务端默认)"},{flag:"--min-face-ratio <n>",desc:"最小人脸占比阈值(未传则服务端默认)"},{flag:"--enable-body-match",desc:"启用人身匹配辅助聚类(未传则服务端默认关闭)"},{flag:"--similarity-threshold <n>",desc:"身份聚类相似度阈值(未传则服务端默认)"}],buildPayload(Z,Q){let Y=Q.opts,J={file_id:Z},z=E8(Y.sampleFps,"--sample-fps");if(z!=null)J.sample_fps=z;let X=E8(Y.maxFaces,"--max-faces");if(X!=null)J.max_faces=X;let W=E8(Y.minFaceRatio,"--min-face-ratio");if(W!=null)J.min_face_ratio=W;if(Y.enableBodyMatch===!0)J.enable_body_match=!0;let V=E8(Y.similarityThreshold,"--similarity-threshold");if(V!=null)J.similarity_threshold=V;return J},mapResult(Z){return Z}},Vj={name:"audio_speaker_split",title:"按说话人分轨",description:"把多说话人音频按说话人分成独立音轨,并产说话人时间线结构;--only-struct 只出结构不切文件。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_speaker_split",outputHint:"各说话人音轨 + 时间线结构",enabled:!0,taskType:"audio_speaker_split",options:[{flag:"--only-struct",desc:"只输出说话人时间线结构,不切分音轨文件"}],buildPayload(Z,Q){return{file_id:Z,only_struct:Q.opts.onlyStruct===!0}},mapOutputs(Z,Q){if(!Array.isArray(Z.files))return[];let Y=[];for(let J of Z.files){if(!J||typeof J!=="object")continue;let z=J,X=z.download_url;if(typeof X!=="string"||!X.trim())continue;let W=typeof z.speaker==="string"&&z.speaker.trim()?z.speaker:`speaker_${Y.length+1}`;Y.push({url:X,filename:`${Q.baseName}-${W}${VZ(X,".wav")}`})}return Y},mapResult(Z){return{spoken_list:Array.isArray(Z.spoken_list)?Z.spoken_list:[]}}},Kj={name:"audio_stretch",title:"音频变调变速",description:"对音频独立调整音高(半音)与速度(倍率),输出处理后的音频。",kind:"cloud",input:{kind:"audio"},priceKey:"audio_stretch",outputHint:"变调变速音频",enabled:!0,taskType:"audio_stretch",options:[{flag:"--semitones <n>",desc:"变调半音(升正降负;未传则不变调)"},{flag:"--speed <n>",desc:"变速/语速倍率(各工具范围与缺省见各自说明)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.semitones!=null){let J=Number(Q.opts.semitones);if(!Number.isFinite(J))throw Error("--semitones 必须是数字");Y.semitones=J}if(Q.opts.speed!=null){let J=Number(Q.opts.speed);if(!Number.isFinite(J)||J<=0)throw Error("--speed 必须是大于 0 的数字");Y.speed=J}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-stretch${VZ(Y,".wav")}`}]:[]}},Gj={name:"piano_audio_to_midi",title:"钢琴音频转 MIDI",description:"把钢琴演奏音频扒谱为 MIDI 文件。",kind:"cloud",input:{kind:"audio"},priceKey:"piano_audio_to_midi",outputHint:"MIDI 文件(.mid)",enabled:!0,taskType:"piano_audio_to_midi",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}${VZ(Y,".mid")}`}]:[]}},$j={name:"piano_audio_enhance",title:"钢琴音频修复增强",description:"修复并增强钢琴录音音质,产高质量 WAV 与配套 MIDI。",kind:"cloud",input:{kind:"audio"},priceKey:"piano_audio_enhance",outputHint:"高质量 WAV + MIDI",enabled:!0,taskType:"piano_audio_enhance",buildPayload(Z){return{file_id:Z}},mapOutputs(Z,Q){let Y=[],J=$Z(Z,["download_url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-enhanced${VZ(J,".wav")}`});let z=$Z(Z,["midi_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}${VZ(z,".mid")}`});return Y}},Hj={name:"image_to_square",title:"长图转方图",description:"把长图智能转为方形图,可指定最大边长(默认 4000,上限 20000)。",kind:"cloud",input:{kind:"image"},priceKey:"image_to_square",outputHint:"方形图片",enabled:!0,taskType:"image_to_square",options:[{flag:"--max-line <px>",desc:"最大边长像素(默认 4000,上限 20000)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.maxLine!=null){let J=Number(Q.opts.maxLine);if(!Number.isFinite(J)||!Number.isInteger(J)||J<1||J>20000)throw Error("--max-line 必须是 1 到 20000 之间的整数");Y.max_line=J}return Y},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-square${VZ(Y,".jpg")}`}]:[]}},qj=new Set(["mp4","motion_photo"]),Uj={name:"image_to_live",title:"智能 LivePhoto",description:"让一张静态照片动起来,生成约 4 秒的短视频;"+"--output-format motion_photo 改为直出安卓动态照片(单个 .jpg,长按即播,并附带同一条视频)。",kind:"cloud",input:{kind:"image"},priceKey:"image_to_live",outputHint:"约 4 秒短视频(.mp4,无声);或安卓动态照片(.jpg + 附带同一条 .mp4)",enabled:!0,taskType:"image_to_live",options:[{flag:"--output-format <fmt>",desc:"交付格式(只决定产物怎么封装,不改生成参数、不改计费)。"+"mp4=默认,约 4 秒短视频;"+"motion_photo=安卓动态照片(单个 .jpg 内嵌该视频,长按即播;"+"另附同一条 .mp4。iOS 不识别、按普通静图打开,少数安卓机型可能只显示静图)"}],buildPayload(Z,Q){let Y={file_id:Z};if(Q.opts.outputFormat!=null){let J=String(Q.opts.outputFormat);if(!qj.has(J))throw Error(`--output-format 不支持「${J}」。合法值:mp4(默认,约 4 秒短视频)、`+"motion_photo(安卓动态照片 .jpg,另附同一条 .mp4)");Y.output_format=J}return Y},mapOutputs(Z,Q){let Y=[],J=$Z(Z,["download_url","video_download_url","url"]);if(J)Y.push({url:J,filename:`${Q.baseName}-live${VZ(J,".mp4")}`});let z=$Z(Z,["video_download_url"]);if(z&&z!==J)Y.push({url:z,filename:`${Q.baseName}-live${VZ(z,".mp4")}`});return Y}},_9=["default","outline","cinema_yellow","immersive_box","wide_spacing","deep_shadow","boxed"],T9=["雅黑","淡绿","森林绿","湖蓝","道奇蓝","钢蓝","浅粉红","深橙","珊瑚橙","橙红","土豪金"],Nj={name:"video_ai_subtitle",title:"智能字幕识别",description:"为视频(或音频)智能生成字幕,可选双语翻译、烧录进视频、去除原字幕;另产 LLM 摘要与字级时间轴。翻译已有字幕文件请用 subtitle_translate。",kind:"cloud",input:{kind:"video",exts:[...J8,...a6]},priceKey:"video_ai_subtitle",outputHint:"字幕 .ass + 可选烧录/去字幕视频 + 摘要/字级时轴结构",enabled:!0,taskType:"video_ai_subtitle",pollTimeoutMs:14400000,options:[{flag:"--language <code>",desc:"源语种代码(video_ai_subtitle 必填、其余工具可选;具体取值由服务端支持列表校验)"},{flag:"--translate-language <code>",desc:"译文目标语种(未传则单语)"},{flag:"--need-render",desc:"把字幕烧录进视频(仅视频输入有效)"},{flag:"--need-pure",desc:"先去除原视频中的字幕"},{flag:"--subtitle-type <style>",desc:`字幕样式:${_9.join("/")}(未传则用服务端默认)`},{flag:"--subtitle-color <color>",desc:`字幕颜色:${T9.join("/")}(未传则用服务端默认)`}],async preprocess(Z){let Q=Z.inputAbs;if(Z.opts.needPure===!0)return Z.warn("--need-pure 需要画面(去原字幕是画面操作),本次整片上传;只要字幕文件时去掉该 flag 即可只传音频"),Q;if(J7(Q))return Q;return await E0(Q,Z.ffmpegPath)},buildPayload(Z,Q){let Y=Q.opts.language==null?"":String(Q.opts.language).trim();if(!Y)throw Error("--language 必填:请指定源语种代码(具体取值见云端 API 文档 / 服务端支持列表)");let J={file_id:Z,language:Y},z=Q.inputAbs;if(z&&!J7(z))try{let X=hZ(z,Q.ffmpegPath);if(X.width>0&&X.height>0)J.video_size=[X.width,X.height]}catch{Q.warn("探原片几何失败,本次不回传 video_size(服务端将按 1920x1080 兜底出字幕)")}if(Q.opts.translateLanguage!=null){let X=String(Q.opts.translateLanguage).trim();if(X)J.translate_language=X}if(Q.opts.needPure===!0)J.need_pure=!0;if(Q.opts.subtitleType!=null){let X=String(Q.opts.subtitleType);if(!_9.includes(X))throw Error(`--subtitle-type 只支持 ${_9.join("、")}`);J.subtitle_type=X}if(Q.opts.subtitleColor!=null){let X=String(Q.opts.subtitleColor);if(!T9.includes(X))throw Error(`--subtitle-color 只支持 ${T9.join("、")}`);J.subtitle_color=X}return J},mapOutputs(Z,Q){let Y=[],J=$Z(Z,["subtitle_file_download_url"]);if(J)Y.push({url:J,filename:`${Q.baseName}${VZ(J,".ass")}`});let z=$Z(Z,["rendered_file_download_url"]);if(z)Y.push({url:z,filename:`${Q.baseName}-subtitled${VZ(z,".mp4")}`});let X=$Z(Z,["pure_file_download_url"]);if(X)Y.push({url:X,filename:`${Q.baseName}-pure${VZ(X,".mp4")}`});return Y},async postprocess(Z,Q){if(Z.opts.needRender!==!0)return;let Y=Z.inputAbs;if(J7(Y))throw Error("--need-render 需要视频输入:本次输入是音频文件,无画面可烧");let J=Q.find((V)=>V.toLowerCase().endsWith(".ass"));if(!J)throw Error("未拉回 .ass 字幕文件,无法本地烧录");let z=Az(await wB(J,"utf8")),X=[];for(let V of z)if(!await Iz(V,Z.ffmpegPath))X.push(V);if(X.length)throw Error(`本机缺字幕模板所需字体:${X.join("、")}。`+`装它:gtrk deps install --font(落 ~/.gitruck/fonts,不写系统字体表)。
|
|
82
|
+
`+" 装上后重跑即可(字幕文件已落地,无需重新提交任务)。不用替代字体顶——"+"替代字体烧出来的成片观感与模板设计不符且难以察觉。");let W=az(oz(J),`${Z.baseName}-subtitled.mp4`);return await Ez(Y,J,W,{ffmpegPath:Z.ffmpegPath}),[W]},mapResult(Z){return{summary:typeof Z.summary==="string"?Z.summary:"",asr:Z.asr??null}}},z7=["ass","srt"],X7=["resegment","keep"],Bj={name:"subtitle_translate",title:"智能字幕翻译",description:"把已有字幕文件(.ass / .srt)翻译成另一种语言,可选套用字幕样式与颜色、输出双语。不含语音识别——要从音视频生成字幕请用 video_ai_subtitle。",kind:"cloud",input:{kind:"subtitle",rejectHint:"本工具只吃字幕文件;要从音视频生成字幕请用 gtrk tool video_ai_subtitle"},priceKey:"subtitle_translate",outputHint:"译文字幕 .ass 或 .srt + 条数统计与降级标记",enabled:!0,taskType:"subtitle_translate",pollTimeoutMs:3600000,options:[{flag:"--language <code>",desc:"源语种代码(必填;取值由服务端支持列表校验)"},{flag:"--translate-language <code>",desc:"译文目标语种代码(必填)"},{flag:"--output-format <fmt>",desc:`产物格式 ${z7.join("/")}(未传则跟随输入)`},{flag:"--line-mode <mode>",desc:`翻译粒度 ${X7.join("/")}(缺省 resegment:先合并回自然句再翻,更通顺但行数与时码会变;keep 严格逐行、时码与输入逐条一致)`},{flag:"--bilingual",desc:"输出双语字幕(原文与译文同框;仅 ass 输出有效)"},{flag:"--subtitle-type <style>",desc:`字幕样式:${_9.join("/")}(仅 ass 输出有效)`},{flag:"--subtitle-color <color>",desc:`字幕颜色:${T9.join("/")}(仅 ass 输出有效)`},{flag:"--canvas <WxH>",desc:"画布几何,决定译文按哪一档折行(未传则:.ass 用文件里的 PlayRes,.srt 无从推断、服务端按横屏 1920x1080)。竖屏务必显式传"}],buildPayload(Z,Q){let Y=Q.opts.language==null?"":String(Q.opts.language).trim(),J=Q.opts.translateLanguage==null?"":String(Q.opts.translateLanguage).trim();if(!Y||!J)throw Error("--language 与 --translate-language 都必填:本工具是「字幕 → 字幕」翻译,源语种与目标语种缺一不可"+"(具体取值见云端 API 文档 / 服务端支持列表)");let z={file_id:Z,language:Y,translate_language:J};if(Q.opts.outputFormat!=null){let X=String(Q.opts.outputFormat).trim().toLowerCase();if(!z7.includes(X))throw Error(`--output-format 只支持 ${z7.join("、")}`);z.output_format=X}if(Q.opts.lineMode!=null){let X=String(Q.opts.lineMode).trim().toLowerCase();if(!X7.includes(X))throw Error(`--line-mode 只支持 ${X7.join("、")}`);z.line_mode=X}if(Q.opts.bilingual===!0)z.lingual_type="bilingual";if(Q.opts.subtitleType!=null){let X=String(Q.opts.subtitleType);if(!_9.includes(X))throw Error(`--subtitle-type 只支持 ${_9.join("、")}`);z.subtitle_type=X}if(Q.opts.subtitleColor!=null){let X=String(Q.opts.subtitleColor);if(!T9.includes(X))throw Error(`--subtitle-color 只支持 ${T9.join("、")}`);z.subtitle_color=X}if(Q.opts.canvas!=null){let X=String(Q.opts.canvas).trim().toLowerCase(),W=/^(\d+)x(\d+)$/.exec(X);if(!W)throw Error(`--canvas 需要 WxH 形式的两个正整数(如 1080x1920),拿到「${X}」`);let V=Number(W[1]),K=Number(W[2]);if(!V||!K)throw Error(`--canvas 的宽高都必须为正整数,拿到「${X}」`);z.video_size=[V,K]}return z},mapOutputs(Z,Q){let Y=$Z(Z,["subtitle_file_download_url"]);if(!Y)return[];let z=(typeof Z.output_format==="string"?Z.output_format:"")==="srt"?".srt":".ass";return[{url:Y,filename:`${Q.baseName}-translated${VZ(Y,z)}`}]},mapResult(Z){return{output_format:Z.output_format??null,line_mode:Z.line_mode??null,stats:Z.stats??null,degraded:Z.degraded??null}},postprocess(Z,Q,Y){let J=Y.degraded;if(!J||typeof J!=="object")return;let z=J;if(z.summary===!0)Z.warn("上下文摘要求取失败,全篇术语一致性可能下降(产物照常可用,介意可重跑)");if(z.width_budget===!0)Z.warn("渲染宽度预算算不出,本次仅按语义长度折行,个别行可能超出画面——竖屏建议显式传 --canvas");if(z.translation===!0)Z.warn("翻译链路退化到分片重试或机器翻译兜底,译文质量可能下降(介意可重跑)")}},jj=["auto","short","medium","long"],Fj={name:"video_long2short_pro",title:"长剪短·精剪(直接出片)",description:"长内容按语义抽多条高光短片并一键出成品:选段+跳剪+分屏内核,叠加模糊底画布适配/克制运镜/调速保音高/智能字幕。只出成片,不产工程文件——要可编辑工程请用 gtrk long2short(粗剪)。",kind:"cloud",input:{kind:"video",exts:J8},priceKey:"video_long2short_pro",outputHint:"逐条高光成片 mp4 + 切片报告 clips.md",enabled:!0,taskType:"video_long2short_pro",pollTimeoutMs:14400000,options:[{flag:"--language <code>",desc:"源语种代码(精剪必填;取值以服务端支持列表为准)"},{flag:"--output-language <code>",desc:"选段/文案的输出语种(未传则同源语种)"},{flag:"--main-topic <text>",desc:"主题引导(影响选段偏好)"},{flag:"--output-size <s>",desc:"成片画幅 9:16|16:9|1:1 或自定义 WxH(未传则服务端默认)"},{flag:"--no-jump-cut",desc:"关闭跳剪(默认开:片内去水词/冗余,只删不重排)"},{flag:"--duration-pref <p>",desc:`成片时长偏好 ${jj.join("/")}(成片条数由内容语义决定、不可指定)`},{flag:"--max-clip-sec <n>",desc:"单条成片时长安全上限(秒;未传则服务端默认)"},{flag:"--split-screen",desc:"开启智能分屏(多人同框段合成分屏画面)"},{flag:"--split-orientation <o>",desc:"分屏方向 auto|lr|tb(未传则服务端默认)"},{flag:"--speed-factor <n>",desc:"整体调速倍率(保音高;未传则服务端默认)"},{flag:"--no-camera-move",desc:"关闭克制运镜(默认开:亚像素推/拉)"},{flag:"--no-subtitle",desc:"关闭智能字幕(默认开:成片内烧录字幕)"},{flag:"--subtitle-translate-language <code>",desc:"字幕译文语种(未传则单语字幕)"}],buildPayload(Z,Q){let Y=Q.opts,J=Y.language==null?"":String(Y.language).trim();if(!J)throw Error("--language 必填:请指定源语种代码(具体取值见云端 API 文档 / 服务端支持列表)");let z={file_id:Z,language:J};if(Y.outputLanguage!=null&&String(Y.outputLanguage).trim())z.output_language=String(Y.outputLanguage).trim();if(Y.mainTopic!=null&&String(Y.mainTopic).trim())z.main_topic=String(Y.mainTopic).trim();if(Y.outputSize!=null&&String(Y.outputSize).trim())z.output_size=String(Y.outputSize).trim();if(Y.jumpCut===!1)z.jump_cut=!1;let X={};if(Y.durationPref!=null&&String(Y.durationPref).trim())X.pref=String(Y.durationPref).trim();let W=W7(Y.maxClipSec,"--max-clip-sec");if(W!=null)X.max_clip_sec=W;if(Object.keys(X).length)z.duration=X;if(Y.splitScreen===!0){let K={enable:!0};if(Y.splitOrientation!=null&&String(Y.splitOrientation).trim())K.orientation=String(Y.splitOrientation).trim();z.split_screen=K}if(Y.speedFactor!=null){let K=Number(Y.speedFactor);if(!Number.isFinite(K))throw Error(`--speed-factor 需要有限数值,拿到「${Y.speedFactor}」`);z.speed={factor:K}}if(Y.cameraMove===!1)z.camera_move={enable:!1};let V={};if(Y.subtitle===!1)V.enable=!1;if(Y.subtitleTranslateLanguage!=null&&String(Y.subtitleTranslateLanguage).trim())V.translate_language=String(Y.subtitleTranslateLanguage).trim();if(Object.keys(V).length)z.subtitle=V;return z},mapOutputs(Z,Q){let Y=Array.isArray(Z.clips)?Z.clips:[],J=[];for(let[z,X]of Y.entries()){let W=X?.file,V=typeof W?.download_url==="string"?W.download_url:void 0;if(!V)continue;J.push({url:V,filename:`clip${z}${VZ(V,".mp4")}`})}return J},mapResult(Z){return{clips:Z.clips??[],report:Z.report??{}}},async postprocess(Z,Q,Y){let J=Array.isArray(Y.clips)?Y.clips:[];if(!J.length)return;let z=Q.filter((V)=>V.toLowerCase().endsWith(".mp4")),X=J.map((V,K)=>z.find((G)=>new RegExp(`clip${K}.[a-z0-9]+$`,"i").test(G))),W=az(oz(Q[0]??"."),"clips.md");return await yB(W,pz(J,Y.report??{},{source:Z.inputAbs??Z.baseName,clipFiles:X}),"utf8"),[W]}};function W7(Z,Q){if(Z==null)return;let Y=Number(Z);if(!Number.isFinite(Y)||!Number.isInteger(Y)||Y<0)throw Error(`${Q} 需要有限非负整数,拿到「${String(Z)}」`);return Y}var Mj={name:"image_classic_template",title:"智能拼图/封面",description:"标题 + 多张图 → 成品封面/拼图;--main-title 必填,文件顺序即拼装顺序。",kind:"cloud",input:{kind:"images"},priceKey:"image_classic_template",outputHint:"封面/拼图成品(text/pic/render 三组、可多张)",enabled:!0,taskType:"image_classic_template",options:[{flag:"--main-title <text>",desc:"主标题(image_classic_template 必填)"},{flag:"--sub-title <text>",desc:"副标题(未传则服务端默认)"},{flag:"--template-mode <mode>",desc:"拼图模式(映射服务端 mode;未传则服务端默认)"},{flag:"--aspect <ratio>",desc:"画幅比例(如 3:4;未传则服务端默认)"},{flag:"--quality <q>",desc:"输出质量(如 1080p;未传则服务端默认)"},{flag:"--output-pic-count <n>",desc:"图组产出数量(服务端钳制 ≤20;未传则服务端默认)"},{flag:"--output-text-count <n>",desc:"文字组产出数量(服务端钳制 ≤20;未传则服务端默认)"},{flag:"--title-layout <layout>",desc:"标题版式(映射服务端 output_title_layout;未传则服务端默认)"}],buildPayloadMulti(Z,Q){let Y=Q.opts,J=typeof Y.mainTitle==="string"&&Y.mainTitle.trim()?Y.mainTitle:void 0;if(!J)throw Error("image_classic_template 需要 --main-title <text>(主标题必填)");let z={file_ids:Z,main_title:J};if(typeof Y.subTitle==="string")z.sub_title=Y.subTitle;if(typeof Y.templateMode==="string")z.mode=Y.templateMode;if(typeof Y.aspect==="string")z.aspect=Y.aspect;if(typeof Y.quality==="string")z.quality=Y.quality;let X=W7(Y.outputPicCount,"--output-pic-count");if(X!=null)z.output_pic_count=X;let W=W7(Y.outputTextCount,"--output-text-count");if(W!=null)z.output_text_count=W;if(typeof Y.titleLayout==="string")z.output_title_layout=Y.titleLayout;return z},mapOutputs(Z,Q){let Y=[["text_file_download_url_list","text"],["pic_file_download_url_list","pic"],["render_file_download_url_list","render"]],J=[];for(let[z,X]of Y){let W=Z[z];if(!Array.isArray(W))continue;W.forEach((V,K)=>{if(typeof V==="string"&&V.trim())J.push({url:V,filename:`${Q.baseName}-${X}-${K+1}${VZ(V,".jpg")}`})})}return J}},Rj={name:"image_vertical_stitch",title:"拼长图",description:"多张图片按传入顺序竖向拼接成一张长图。",kind:"cloud",input:{kind:"images"},priceKey:"image_vertical_stitch",outputHint:"垂直拼接长图",enabled:!0,taskType:"image_vertical_stitch",buildPayloadMulti(Z){return{file_ids:Z}},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-stitch${VZ(Y,".jpg")}`}]:[]}},Dj={name:"video_split_screen",title:"智能分屏",description:"把 2–16 段视频合成一条分屏成片(reaction/对比/多画面同框);--clips-json 可按 0 起索引精确指定每段毫秒区间与裁剪框,成片时长对齐最短段。",kind:"cloud",input:{kind:"videos",exts:J8},priceKey:"video_split_screen",outputHint:"分屏成片视频",enabled:!0,taskType:"video_split_screen",options:[{flag:"--clips-json <json>",desc:"结构化条目数组:{input:0 起 positional 序号, begin_time_ms?, end_time_ms?, crop?{x,y,width,height 归一化}};缺省=每个输入整段参与"},{flag:"--layout-mode <m>",desc:"布局模式(auto/template;未传则服务端默认 auto)"},{flag:"--layout-id <n>",desc:"template 模式的布局模板号(合法性由服务端校验)"},{flag:"--output-ratio <r>",desc:"成片画幅(9:16/16:9/1:1;未传则服务端默认)"},{flag:"--fit-mode <m>",desc:"画面贴合方式(cover/contain;未传则服务端默认)"},{flag:"--audio-mode <m>",desc:"音频方式(first/mix/mute;未传则服务端默认)"},{flag:"--gap-ratio <n>",desc:"分屏缝隙比例(0–0.05;未传则服务端默认)"},{flag:"--background-color <c>",desc:"缝隙底色 #RRGGBB(未传则服务端默认)"}],buildPayloadMulti(Z,Q){let Y=Q.opts,J,z=Y.clipsJson;if(typeof z==="string"&&z.trim()){let G;try{G=JSON.parse(z)}catch{throw Error(`--clips-json 不是合法 JSON:${z}`)}if(!Array.isArray(G))throw Error("--clips-json 必须是一个 JSON 数组");if(G.length<2||G.length>16)throw Error(`--clips-json 需要 2–16 个条目,拿到 ${G.length}`);J=G.map(($,H)=>{if(!$||typeof $!=="object"||Array.isArray($))throw Error(`--clips-json 条目[${H}] 必须是对象`);let{input:N,...q}=$;if(typeof N!=="number"||!Number.isInteger(N)||N<0||N>=Z.length)throw Error(`--clips-json 条目[${H}].input 需要 0 起整数且 < 输入文件数(${Z.length}),拿到「${String(N)}」`);return{file_id:Z[N],...q}})}else{if(Z.length<2||Z.length>16)throw Error(`video_split_screen 需要 2–16 个输入视频,拿到 ${Z.length}`);J=Z.map((G)=>({file_id:G}))}let X={clips:J};if(typeof Y.layoutMode==="string")X.layout_mode=Y.layoutMode;let W=E8(Y.layoutId,"--layout-id");if(W!=null){if(!Number.isInteger(W))throw Error(`--layout-id 需要整数,拿到「${String(Y.layoutId)}」`);X.layout_id=W}let V=E8(Y.seed,"--seed");if(V!=null){if(!Number.isInteger(V))throw Error(`--seed 需要整数,拿到「${String(Y.seed)}」`);X.random_seed=V}if(typeof Y.outputRatio==="string")X.output_ratio=Y.outputRatio;if(typeof Y.quality==="string")X.quality=Y.quality;if(typeof Y.fitMode==="string")X.fit_mode=Y.fitMode;if(typeof Y.audioMode==="string")X.audio_mode=Y.audioMode;let K=E8(Y.gapRatio,"--gap-ratio");if(K!=null)X.gap_ratio=K;if(typeof Y.backgroundColor==="string")X.background_color=Y.backgroundColor;return X},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);return Y?[{url:Y,filename:`${Q.baseName}-splitscreen${VZ(Y,".mp4")}`}]:[]}},Pj={name:"audio_tts_clone",title:"声音克隆配音",description:"输入一段文字,用指定音色合成配音音频(--text 短文本或 --text-file 文本文件二选一,≤5000 字)。按文本字符数计费,计量单位与单价以 `gtrk tool list` 实时显示为准。",kind:"cloud",input:{kind:"none"},priceKey:"audio_tts_clone",outputHint:"配音音频(wav/mp3)",enabled:!0,taskType:"audio_tts_clone",options:[{flag:"--text <text>",desc:"待合成的短文本(与 --text-file 二选一)"},{flag:"--text-file <file>",desc:"待合成的文本文件(UTF-8;与 --text 二选一)"},{flag:"--speaker <code>",desc:"音色代号(必填;可用列表见官网文档「可用音色」,传错时报错会列出全部可用项)"},{flag:"--text-lang <lang>",desc:"文本语言(未传则服务端默认 zh)"},{flag:"--output-format <fmt>",desc:"输出音频格式 wav/mp3(未传则服务端默认 wav)"},{flag:"--split-method <m>",desc:"长文切分法 cut0~cut5(未传则跟随该音色调好的参数);它也决定字幕的断句粒度,要一句一条传 cut5"},{flag:"--batch-size <n>",desc:"分段并发批大小 1~16(未传则服务端默认)"},{flag:"--subtitle-format <fmt>",desc:"同时产出字幕文件,如 srt(未传则不出字幕;不额外计费,取值以服务端为准)"}],buildPayloadNone(Z){let Q=Z.opts,Y=typeof Q.text==="string"&&Q.text.trim()!=="",J=typeof Q.textFile==="string"&&Q.textFile.trim()!=="";if(Y&&J)throw Error("--text 与 --text-file 只能给其一");if(!Y&&!J)throw Error("需要 --text <短文本> 或 --text-file <文本文件>(UTF-8)之一");let z=Y?Q.text:vB(xB(Q.textFile),"utf8");if(!z.trim())throw Error("文本内容为空");if(!(typeof Q.speaker==="string"&&Q.speaker.trim()))throw Error("audio_tts_clone 需要 --speaker <音色代号>(可用列表见官网文档;传错时服务端报错会列出可用项)");let X={text:z,speaker:Q.speaker};if(typeof Q.textLang==="string")X.text_lang=Q.textLang;if(typeof Q.outputFormat==="string")X.output_format=Q.outputFormat;let W=E8(Q.speed,"--speed");if(W!=null)X.speed=W;if(typeof Q.splitMethod==="string")X.text_split_method=Q.splitMethod;let V=E8(Q.batchSize,"--batch-size");if(V!=null){if(!Number.isInteger(V))throw Error(`--batch-size 需要整数,拿到「${String(Q.batchSize)}」`);X.batch_size=V}if(typeof Q.subtitleFormat==="string"&&Q.subtitleFormat.trim())X.subtitle_format=Q.subtitleFormat.trim();return X},mapOutputs(Z,Q){let Y=$Z(Z,["download_url"]);if(!Y)return[];let J=typeof Q.opts.outputFormat==="string"?`.${Q.opts.outputFormat}`:".wav",z=typeof Q.opts.speaker==="string"&&Q.opts.speaker.trim()?Q.opts.speaker:"voice",X=[{url:Y,filename:`tts-${z}${VZ(Y,J)}`}],W=$Z(Z,["subtitle_file_download_url"]);if(W)X.push({url:W,filename:`tts-${z}${VZ(W,".srt")}`});return X}},Oj={name:"mad",title:"一键剪 MAD",description:"素材文件夹(3~10 条视频)+ 可选 BGM → 自动选技法 → 单一 .jsx,AE 2020+ 跑一遍出 15~30s 卡点成片工程。仅支持 AE。",kind:"local",input:{kind:"directory"},priceKey:"audio_music_analyze",pricingContext:"仅 --bgm 卡点时",outputHint:"AE 母合成工程 .jsx",enabled:!0,options:[{flag:"--bgm <音频文件>",desc:"可选 BGM,卡点到 downbeat(需 API Key,计费一次;无 Key 则 BGM 仍入轨、固定节奏)"},{flag:"--duration <秒>",desc:"成片目标时长(默认 20,文案口径 15~30)"},{flag:"--seed <n>",desc:"随机种子(可复现;各工具语义见各自说明)"},{flag:"--refresh",desc:"强制忽略本地缓存、重拉当前 manifest 版本数据"}]},Lj=new Set(["list"]),o0=[uB,mB,cB,lB,dB,tB,nB,pB,iB,oB,rB,aB,sB,eB,Zj,Qj,Yj,Jj,zj,Xj,Wj,Vj,Kj,Gj,$j,Hj,Uj,Nj,Bj,Mj,Rj,Dj,Fj,Pj,Oj];function tz(Z,Q=o0){return Q.find((Y)=>Y.name===Z)}function ez(Z=o0){let Q=new Set;for(let Y of Z){if(!Y.name)throw Error("descriptor 缺 name");if(Lj.has(Y.name))throw Error(`descriptor 名与保留字冲突:「${Y.name}」`);if(Q.has(Y.name))throw Error(`descriptor 名重复:「${Y.name}」`);if(Q.add(Y.name),!Y.enabled&&!Y.disabledReason)throw Error(`未启用工具缺 disabledReason:「${Y.name}」`);if(Y.kind==="cloud"&&!Y.taskType)throw Error(`cloud 型工具缺 taskType:「${Y.name}」`);if(Y.kind==="cloud"&&!Y.priceKey)throw Error(`cloud 型工具缺 priceKey:「${Y.name}」`);if(Y.kind==="cloud"&&!Y.mapOutputs&&!Y.mapResult)throw Error(`cloud 型工具须至少声明 mapOutputs 或 mapResult 之一:「${Y.name}」`);if(qQ.has(Y.input.kind)){if(!Y.buildPayloadMulti)throw Error(`多文件工具缺 buildPayloadMulti:「${Y.name}」`);if(Y.buildPayload)throw Error(`多文件工具不得声明 buildPayload(与 buildPayloadMulti 互斥):「${Y.name}」`);if(Y.preprocess)throw Error(`多文件工具不支持 preprocess:「${Y.name}」`);if(Y.input.maxDurationSec!=null)throw Error(`多文件工具不支持 maxDurationSec:「${Y.name}」`)}else if(Y.buildPayloadMulti)throw Error(`非多文件工具不得声明 buildPayloadMulti:「${Y.name}」`);if(Y.input.kind==="subtitle"&&Y.input.maxDurationSec!=null)throw Error(`字幕类工具不支持 maxDurationSec(文本文件无时长):「${Y.name}」`);if(Y.buildPayloadNone){if(Y.input.kind!=="none")throw Error(`非 none 工具不得声明 buildPayloadNone:「${Y.name}」`);if(Y.buildPayload||Y.buildPayloadMulti)throw Error(`buildPayloadNone 与其他 payload 钩子互斥:「${Y.name}」`)}if(Y.kind==="cloud"&&Y.input.kind==="none"){if((Y.preprocess?1:0)+(Y.buildPayloadNone?1:0)!==1)throw Error(`none 工具须声明 preprocess 或 buildPayloadNone 恰一:「${Y.name}」`)}}}var Sj=1800000,vj=5000;function wj(Z){if(Z==="true")return!0;if(Z==="false")return!1;if(Z.trim()!==""&&!Number.isNaN(Number(Z)))return Number(Z);return Z}function $7(Z,Q){let Y={};for(let J of Z){let z=J.indexOf("=");if(z<0)throw Error(`--param 需要 key=value 格式:「${J}」`);Y[J.slice(0,z).trim()]=wj(J.slice(z+1))}if(Q){let J;try{J=JSON.parse(Q)}catch{throw Error(`--params-json 不是合法 JSON:${Q}`)}if(typeof J!=="object"||J===null||Array.isArray(J))throw Error("--params-json 必须是一个 JSON 对象");Object.assign(Y,J)}return Y}function UQ(Z,Q){for(let[Y,J]of Object.entries(Q)){let z=Z[Y],X=!!z&&!!J&&typeof z==="object"&&typeof J==="object"&&!Array.isArray(z)&&!Array.isArray(J);Z[Y]=X?{...z,...J}:J}}function yj(Z,Q){let Y=Z.input;if(Y.kind==="none")return;if(!Q)throw Error(`${Z.name} 需要输入${Y.kind==="directory"?"目录":"文件"}`);if(!YX(Q))throw Error(`输入不存在:${Q}`);if(Y.kind==="directory")return;let J=Y.exts??uZ(Y.kind);if(J&&J.length){let z=s6(Q).toLowerCase();if(!J.includes(z))throw Error(`${Z.name} 需要 ${Y.kind} 输入,但拿到「${z||"无扩展名"}」(支持:${J.join(" ")})`+(Y.rejectHint?`。${Y.rejectHint}`:""))}}function xj(Z,Q){if(!Q.length)throw Error(`${Z.name} 需要至少一个输入文件(可传多个,顺序即拼装顺序)`);let Y=Z.input.exts??uZ(Z.input.kind);for(let J of Q){if(!YX(J))throw Error(`输入不存在:${J}`);if(Y&&Y.length){let z=s6(J).toLowerCase();if(!Y.includes(z)){let X=Z.input.kind==="videos"?"视频":"图片";throw Error(`${Z.name} 需要${X}输入,但「${G7(J)}」是「${z||"无扩展名"}」(支持:${Y.join(" ")})`)}}}}function kj(Z,Q,Y,J){let z=Z.input.maxDurationSec;if(z==null||!Q)return;if(Y(Q,J)>z)throw Error(`视频超过 ${Math.round(z/60)} 分钟上限,请先裁剪`)}async function E9(Z,Q){let Y=await fetch(Z);if(!Y.ok||!Y.body)throw Error(`下载失败 HTTP ${Y.status}:${Z}`);await Ij(Ej.fromWeb(Y.body),Aj(Q))}async function I8(Z,Q,Y,J={}){let z=J.timeoutMs??Sj,X=J.intervalMs??vj,W=J.getResult??A8,V=J.sleep??(($)=>new Promise((H)=>setTimeout(H,$))),K=J.now??Date.now,G=K();for(;;){if(K()-G>z)throw Error(`任务超时(超过 ${Math.round(z/60000)} 分钟)。可稍后凭 task_id(${Y})在云端查询或重试。`);await V(X);let $;try{$=await W(Z,Q,Y)}catch(H){if(H7(H)!=null)throw H;continue}if($.status==="completed")return $.output;if($.status==="failed"||$.status==="cancelled"){let H=$.output;throw Error(H?.error??($.status==="failed"?"任务失败":"任务已取消"))}J.onTick?.($.status||"处理中",$.progress)}}function H7(Z){let Q=Z&&typeof Z==="object"?Z.code:void 0;return typeof Q==="number"?Q:void 0}async function q7(Z){let Q=Z.deps,Y=await R8(Q.cfg,Z.uploadPath,Z.taskType,Z.buildPayload,{force:Z.forceReupload},{uploadCached:Q.uploadCached,invalidateUpload:Q.invalidateUpload,submitTask:Q.submitTask,sleep:Q.sleep??((z)=>new Promise((X)=>setTimeout(X,z)))});await Z.onSubmitted?.(Y);let J=await I8(Q.cfg,Z.taskType,Y.taskId,{timeoutMs:Z.pollTimeoutMs,intervalMs:Q.pollIntervalMs,getResult:Q.getTaskResult,sleep:Q.sleep,now:Q.now,onTick:Z.onTick});return{taskId:Y.taskId,fileId:Y.fileId,output:J}}var JX=6004;async function ZX(Z,Q,Y){let J=Q?O9:[];for(let z=0;;z++)try{return await Z()}catch(X){if(H7(X)!==JX||z>=J.length)throw X;await Y(J[z])}}async function fj(Z,Q,Y,J,z){let X=Z.sleep??((G)=>new Promise(($)=>setTimeout($,G))),W=[];for(let G of Q)W.push(await Z.uploadCached(Z.cfg,G,{force:z}));let V=()=>Z.submitTask(Z.cfg,Y,J(W.map((G)=>G.fileId))),K=W.some((G)=>!G.cached);try{return{taskId:await ZX(V,K,X),fileIds:W.map(($)=>$.fileId),cached:!K}}catch(G){if(H7(G)!==JX||!W.some((H)=>H.cached))throw G;for(let H=0;H<Q.length;H++)if(W[H].cached)await Z.invalidateUpload(Q[H]),W[H]=await Z.uploadCached(Z.cfg,Q[H],{force:!0});return{taskId:await ZX(V,!0,X),fileIds:W.map((H)=>H.fileId),cached:!1}}}function hj(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}function bj(Z,Q,Y){if(Y)return K7(Y);if(Q){let J=G7(Q,s6(Q));return A9(Cj(Q),`${J}-${Z.name}`)}return A9(process.cwd(),`${Z.name}-${hj()}`)}async function QX(Z){try{let Q=await Tj(Z);return`${Q.size}:${Math.round(Q.mtimeMs)}`}catch{return}}function gj(Z){process.stderr.write(`\x1B[33m⚠️ 计费提示:${Z}\x1B[0m
|
|
83
|
+
`)}async function zX(Z,Q,Y,J){let z=qQ.has(Z.input.kind),X=z?(Array.isArray(Q)?Q:Q!=null?[Q]:[]).map((S)=>K7(S)):void 0,W=z?X[0]:typeof Q==="string"?K7(Q):void 0,V=W?G7(W,s6(W)):Z.name;if(z)xj(Z,X);else{yj(Z,W);let S=J.probeDurationSec??U8;kj(Z,W,S,Y.ffmpegPath)}let K=$7(Y.param??[],Y.paramsJson),G={inputAbs:W,...X?{inputAbsList:X}:{},baseName:V,ffmpegPath:Y.ffmpegPath,opts:Y,extraParams:K,warn:(S)=>process.stderr.write(`\x1B[2m ${S}\x1B[0m
|
|
84
|
+
`)},$=bj(Z,W,Y.out);if(z)Z.buildPayloadMulti(X.map(()=>"__dry_run__"),G);let H=Z.input.kind==="none"&&!!Z.buildPayloadNone,N=W;if(!z&&Z.preprocess)N=await Z.preprocess(G);if(!N&&!H)throw Error(`${Z.name} 缺上传物(input=none 的 cloud 型工具需 preprocess 产上传物或声明 buildPayloadNone)`);let q;try{q=(await(J.resolvePricing??m8)(Z.priceKey,Z.pricingContext)).billingHint}catch{q="实时价格暂不可用,以服务端结算为准"}gj(q);let U=Z.taskType,F="",M,R,D=async()=>{await _j($,{recursive:!0});let S=X?await Promise.all(X.map((k)=>QX(k))):W?await QX(W):void 0;await V7(A9($,"task.json"),JSON.stringify({tool:Z.name,taskType:U,taskId:F,fileId:M,...R?{fileIds:R}:{},source:X??W,fingerprint:S,createdAt:new Date().toISOString()},null,2))},O={timeoutMs:Z.pollTimeoutMs,intervalMs:J.pollIntervalMs,getResult:J.getTaskResult,sleep:J.sleep,now:J.now},C;if(H){let S=Z.buildPayloadNone(G);UQ(S,K),F=await J.submitTask(J.cfg,U,S),await D(),C=await I8(J.cfg,U,F,O)}else if(z){let k=await fj(J,X,U,(c)=>{let a=Z.buildPayloadMulti(c,G);return UQ(a,K),a},!!Y.reupload);F=k.taskId,R=k.fileIds,M=k.fileIds[0],await D(),C=await I8(J.cfg,U,F,O)}else{let k=await q7({deps:J,uploadPath:N,taskType:U,buildPayload:(c)=>{let a=Z.buildPayload?Z.buildPayload(c,G):{file_id:c};return UQ(a,K),a},forceReupload:Y.reupload===!0,pollTimeoutMs:Z.pollTimeoutMs,onSubmitted:async(c)=>{F=c.taskId,M=c.fileId,await D()}});F=k.taskId,M=k.fileId,C=k.output}let T=C,_=[],P={},E=Z.mapOutputs?Z.mapOutputs(T,G):[];for(let S of E){let k=A9($,S.filename);try{await J.downloadStream(S.url,k),_.push(k)}catch(c){P[S.filename]=c instanceof Error?c.message:String(c)}}if(Z.postprocess)try{let S=await Z.postprocess(G,[..._],T);if(Array.isArray(S))_.push(...S)}catch(S){P[`${Z.name}:postprocess`]=S instanceof Error?S.message:String(S)}let I,y=Z.mapResult?Z.mapResult(T,G):void 0;if(y!=null)I=A9($,"result-output.json"),await V7(I,JSON.stringify(y,null,2));if(E.length===0&&I==null)P.output="任务完成但未解析到任何产物(下载链接与结构化结果均为空,output_result 形态异常)";let v={ok:Object.keys(P).length===0&&(_.length>0||I!=null),tool:Z.name,taskType:U,taskId:F,fileId:M,...R?{fileIds:R}:{},outDir:$,files:_,...I?{resultFile:I}:{},...Object.keys(P).length?{errors:P}:{}};return await V7(A9($,"result.json"),JSON.stringify({...v,finishedAt:new Date().toISOString()},null,2)),v}var t6="cli/video_long2short_for_cli",uj=3600000,mj=(Z,Q)=>{return Q.push(Z),Q};function cj(Z={}){return{loadConfig:Z.loadConfig??jZ,probe:Z.probe??hZ,extract:Z.extract??E0,compress:Z.compress??c6,uploadSubtitle:Z.uploadSubtitle??gZ}}var lj={command:"long2short",afterward:"各段产出的 clip 可事后汇总成一张选题清单(分段是常态动作,不是降级方案)。"};function WX(Z,Q,Y,J,z,X,W){if(!Q.language||!Q.language.trim())throw Error("--language 必填(源语种,如 zh-CN;取值以服务端支持列表为准)");let V={file_id:Z,language:Q.language,project_formats:z,source_path:J,video_size:[Y.width,Y.height],video_rate:Y.fps,video_duration:Y.duration};if(Q.mainTopic)V.main_topic=Q.mainTopic;if(Q.outputSize)V.output_size=Q.outputSize;if(Q.jumpCut===!1)V.jump_cut=!1;if(W)V.subtitle_file_id=W;if(Q.subtitleOut)V.outputs=["project","report","subtitle"];if(Q.keepPunctuation)V.subtitle={strip_punctuation:!1};let K={};if(Q.durationPref)K.pref=Q.durationPref;if(Q.maxClipSec!=null){let G=Number(Q.maxClipSec);if(!Number.isFinite(G))throw Error(`--max-clip-sec 需要有限数值,拿到「${Q.maxClipSec}」`);K.max_clip_sec=G}if(Object.keys(K).length)V.duration=K;if(Q.splitScreen){let G={enable:!0};if(Q.splitOrientation)G.orientation=Q.splitOrientation;V.split_screen=G}if(X)V.struct_meta={nle_draft_dir:X};return UQ(V,$7(Q.param??[],Q.paramsJson)),V}async function dj(Z,Q,Y){let J=[],z=0,X=0;for(let[W,V]of Z.entries()){let K=S8(V,"jianying");if(!j7(K)){J.push(null);continue}X++;let G=`${Q}_clip${W}`;try{let $=await j6(K,G);if($.complete)z++,J.push(G);else J.push(null),Y[`clip${W}:jianying:draft`]=`草稿两件套不全(缺 ${$.missing.join("、")}),剪映列表里不会显示:${G}`}catch($){J.push(null),Y[`clip${W}:jianying:draft`]=$ instanceof Error?$.message:String($)}}return{paths:J,complete:z,attempted:X}}function VX(Z){Z.command("long2short <input>").description("长剪短闭环:本地抽音频/720p 代理 → 只传抽出物 → 云端选段跳剪(可选分屏)→ 逐 clip 拉回 gtrk/剪映/PR 三方工程").option("--language <code>","源语种(必填,如 zh-CN;取值以服务端支持列表为准)").option("--split-screen","开启智能分屏:本地改传 720p 代理,云端在代理上检测多人同框并烤 720p 分屏素材(素材落毛片旁 split_screen/)").option("--split-orientation <o>","分屏方向 auto|lr|tb(缺省服务端 auto=按内容随机)").option("--main-topic <text>","主题引导(影响选段偏好)").option("--duration-pref <p>","成片时长偏好(缺省服务端 auto;成片条数由内容语义决定、不可指定)").option("--max-clip-sec <n>","单条成片时长安全上限(秒;缺省服务端默认)").option("--no-jump-cut","关闭跳剪(默认开:片内去水词/冗余,只删不重排)").option("--subtitle-file <path>","现成单语字幕文件(.srt/.ass)作转写来源,替代云端 ASR(切点=字幕行边界;双语/多层 .ass 会被拒)").option("--subtitle-out","逐 clip 另产单语 .srt 字幕(按目标画布档位智能拆行,落 clip{i}/srt/)").option("--keep-punctuation","字幕保留全部标点(缺省按统一口径去逗号句号、保留?!等)").option("--output-size <s>","输出画布 9:16|16:9|1:1 或自定义 WxH(缺省服务端 9:16)").option("-f, --formats <list>","三方格式(逗号分隔,云端逐 clip 直产)","gtrk,jianying,xml").option("--jianying-draft-dir <dir>","剪映草稿根目录;传路径或 auto(默认读 gtrk init 配置 / 自动探测)").option("-o, --out <dir>","产物根目录(缺省 = <毛片同目录>/<毛片名>-long2short)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--param <k=v>","透传任意云端参数(标量、可重复)",mj,[]).option("--params-json <json>",`透传任意云端参数(JSON 对象、支持嵌套;如 '{"split_screen":{"prefer_mode":"..."}}')`).option("--reupload","强制重新上传,忽略本地上传缓存").option("--no-open","完成后不自动打开产物根目录(默认会自动打开一次)").option("--json","机读模式:人读日志转 stderr,stdout 只输出根级结果 JSON").action(async(Q,Y)=>{await nj(Q,Y)})}async function nj(Z,Q,Y={}){if(Q.json)qZ();let J=cj(Y),z=J.loadConfig(),X=U7(Z);if(!j7(X))throw Error(`毛片不存在:${X}`);let W=I0(X,XX(X)),V=Q.formats.split(",").map((v)=>v.trim()).filter(Boolean);if(!V.includes("gtrk"))V.push("gtrk");let K=V.some((v)=>v==="jianying"||v==="capcut"),G=U7(Q.out??S8(N7(X),`${W}-long2short`)),$=I0(G),H;if(K)if(H=R0(Q.jianyingDraftDir),H)j.info(`剪映草稿根:${H}`);else j.warn("没找到剪映草稿目录 → 将只产 draft_content.json、缺 meta。可加 --jianying-draft-dir <你的草稿目录> 重跑。");let N=H?S8(H,$):void 0;j.step(`▶ 长剪短:${I0(X)}(${Q.splitScreen?"720p 代理 · 智能分屏":"纯选段 · 音频上传"},格式 ${V.join("/")})`),j.step("① 本地预处理(探几何 + 抽音频/720p 代理)…");let q=J.probe(X,Q.ffmpegPath);j.info(`原片几何 ${q.width}x${q.height} @ ${q.fps.toFixed(2)}fps · ${(q.duration/60).toFixed(1)}min`),l6(q.duration,lj);let U=Q.subtitleFile?U7(Q.subtitleFile):void 0;if(U){if(!j7(U))throw Error(`字幕文件不存在:${U}`);let v=XX(U).toLowerCase();if(v!==".srt"&&v!==".ass")throw Error(`--subtitle-file 只接受单语 .srt/.ass,拿到「${v||"无扩展名"}」`)}WX("__dry_run__",Q,q,X,V,N,void 0);let F=Q.splitScreen?await J.compress(X,Q.ffmpegPath):await J.extract(X,Q.ffmpegPath);L9(q.duration,F,Q.ffmpegPath),j.info(Q.splitScreen?`已压 720p 代理(上传物):${I0(F)}`:`已抽 16k 单声道 mp3(上传物):${I0(F)}`);let M;if(U){let v=await J.uploadSubtitle(z,U,{force:Q.reupload});M=v.fileId,j.info(`${v.cached?"命中上传缓存,复用":"已上传"}字幕文件(转写来源,跳过云端 ASR):${I0(U)}`)}j.step("② 上传抽出物到云端…");let R=await R8(z,F,t6,(v)=>WX(v,Q,q,X,V,N,M),{force:Q.reupload,onUploaded:(v)=>{j.info(v.cached?`命中上传缓存,复用 file_id = ${v.fileId}`:`file_id = ${v.fileId}`),j.step("③ 提交长剪短任务…")},onCacheInvalid:()=>j.warn("缓存的 file_id 在云端已失效,重新上传后重试…")}),{taskId:D,fileId:O}={taskId:R.taskId,fileId:R.fileId};j.info(`task_id = ${D}`),await B7(G,{recursive:!0}),await NQ(S8(G,"task.json"),JSON.stringify({taskId:D,taskType:t6,fileId:O,source:X,formats:V,createdAt:new Date().toISOString()},null,2)),j.step("④ 云端处理中(选段/跳剪"+(Q.splitScreen?"/分屏":"")+",每 5s 轮询)…");let C=await I8(z,t6,D,{timeoutMs:uj,onTick:(v,S)=>j.tick(`${v}${S!=null?` ${Math.round(S)}%`:""}`)});j.tickEnd();let T=C.clips??[];if(!T.length)throw Error("云端未产出任何高光短片(clips 为空),请查 report/errors");let _={...C.errors??{}},P=C.report?.split_manifest??[],E=0;if(P.length){j.step(`⑤ 拉回分屏素材(${P.length} 条 → 毛片旁 split_screen/)…`);for(let[v,S]of P.entries()){let{expected_path:k,download_url:c}=S;if(!k||!c){_[`split_manifest[${v}]`]="缺 expected_path/download_url,已跳过";continue}if(!/^(?:[A-Za-z]:[\\/]|[\\/])/.test(k))k=S8(N7(X),k);try{await B7(N7(k),{recursive:!0}),await g8(c,k),E++}catch(a){_[`split:${I0(k)}`]=a instanceof Error?a.message:String(a),j.warn(`分屏素材下载失败(${I0(k)}),对应工程中该素材将缺席`)}}if(E)j.info(`分屏素材已落:${E}/${P.length} 条`)}j.step(`⑥ 逐 clip 拉回三方工程(共 ${T.length} 条)…`);let I=[];for(let[v,S]of T.entries()){let k=S8(G,`clip${v}`),{files:c,...a}=S;try{let u=await C9({outDir:k,output:{report:a,files:c??[],errors:{}},taskId:D,fileId:O,projName:`${W}-clip${v}`,json:!1,open:!1,quiet:!0});Object.assign(_,Object.fromEntries(Object.entries(u.errors).map(([l,f])=>[`clip${v}:${l}`,f]))),I.push({dir:k,title:S.title,files:u.files,ok:u.ok}),j.info(`clip${v}${S.title?`「${S.title}」`:""}:${Object.keys(u.files).join("/")||"(无产物)"}`)}catch(u){_[`clip${v}`]=u instanceof Error?u.message:String(u),I.push({dir:k,title:S.title,files:{},ok:!1}),j.warn(`clip${v} 落地失败(不连坐其余):${_[`clip${v}`]}`)}}if(H&&N){let v=await dj(I.map((c)=>c.dir),N,_);v.paths.forEach((c,a)=>{I[a].jianyingDraftPath=c});let{complete:S,attempted:k}=v;if(!k)j.warn("没有任何 clip 产出剪映草稿,草稿根未落地");else if(S===k)j.info(`剪映草稿:<草稿根>/${$}_clip{i} —— ${S}/${k} 条两件套齐全(剪映里直接可见)`);else if(S)j.info(`剪映草稿:<草稿根>/${$}_clip{i} —— ${S}/${k} 条两件套齐全(剪映里可见)`),j.warn(`另有 ${k-S} 条草稿两件套不全,剪映里不会显示(详见 result.json errors)`);else j.warn(`${k} 条草稿两件套均不全,剪映里不会显示(详见 result.json errors)`)}for(let[v,S]of I.entries())try{await B7(S.dir,{recursive:!0}),await NQ(S8(S.dir,"clip.md"),dz(T[v],v,S.files))}catch(k){_[`clip${v}:brief`]=k instanceof Error?k.message:String(k)}try{await NQ(S8(G,"clips.md"),nz(T,{source:X,jumpCut:Q.jumpCut!==!1,splitMaterials:{landed:E,total:P.length},taskId:D})),j.info("总览已生成:clips.md(逐条见 clip{i}/clip.md)")}catch(v){_["clips.md"]=v instanceof Error?v.message:String(v)}await NQ(S8(G,"report.json"),JSON.stringify(C.report??{},null,2));let y=Object.keys(_).length===0&&I.some((v)=>v.ok),h={ok:y,tool:"long2short",taskType:t6,taskId:D,fileId:O,outDir:G,clips:I,splitMaterials:{landed:E,total:P.length},reportFile:S8(G,"report.json"),...Object.keys(_).length?{errors:_}:{}};if(await NQ(S8(G,"result.json"),JSON.stringify({...h,finishedAt:new Date().toISOString()},null,2)),Q.json)console.log(JSON.stringify(h));if(Q.open)D0(G),j.info("已打开产物根目录");if(!y){j.err("部分产物未落地(任务已完成、积分可能已扣)。task.json 已保留,可凭 task_id 恢复取回。"),process.exitCode=1;return}j.ok(`闭环完成:${T.length} 条高光短片。产物根:${G}`)}import{resolve as pj,join as ij}from"node:path";var oj="cli/video_oral_cut_for_cli";function rj(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}function KX(Z){Z.command("oralcut-result <taskId>").description("按 task_id 取回已完成任务的报告 + 三方工程产物(可选 --render),不重跑云端").option("-o, --out <dir>","产物目录(缺省 = <当前目录>/<taskId>-video-project-<时间戳>)").option("--render","额外本地渲染成片(需原毛片仍在 gtrk 内嵌路径 + ffmpeg)").option("--crf <n>","本地渲染 CRF 14-28(默认 18;需配 --render)").option("--codec <c>","本地渲染编码(默认 h264;需配 --render)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 目录(缺省 ~/.gitruck/ffmpeg → 系统)").option("--jianying-draft-dir <dir>","剪映草稿根目录;传路径或 auto(默认读配置 / 自动探测)").option("--no-open","完成后不自动打开产物目录(默认会自动打开)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON(给 agent/脚本解析)").action(async(Q,Y)=>{await aj(Q,Y)})}async function aj(Z,Q){if(Q.json)qZ();let Y=jZ();j.step(`▶ 按 task_id 取回口播剪辑结果:${Z}`);let J;try{J=await A8(Y,oj,Z)}catch(W){if(W instanceof OZ)throw Error(`取任务结果失败(code=${W.code}):${W.message}。`+"注意:取结果需用「提交该任务的同一账号」的 API Key;异账号或已删任务会报 TASK_NOT_FOUND。");throw W}if(J.status!=="completed"){if(J.status==="failed"||J.status==="cancelled"){let V=J.output;throw Error(`任务未成功(${J.status}):${V?.error??"无产物可取回"}`)}let W=J.progress!=null?` ${Math.round(J.progress)}%`:"";throw Error(`任务尚未完成(当前 ${J.status||"未知"}${W}),暂无法取回结果;请稍后再试。`)}let z=pj(Q.out??ij(process.cwd(),`${Z}-video-project-${rj()}`)),X=R0(Q.jianyingDraftDir);await C9({outDir:z,output:J.output,taskId:Z,draftDir:X,render:Q.render,crf:Q.crf,codec:Q.codec,ffmpegPath:Q.ffmpegPath,json:Q.json,open:Q.open}),j.ok(`已取回。产物目录:${z}`)}import{spawnSync as ej}from"node:child_process";var sj=["win32"];function tj(Z=process.platform){return sj.includes(Z)}function GX(Z,Q=process.platform){return tj(Q)?`${Z}:${"irm https://api.ai-mcn.tv:9000/broadcast/exe/install.ps1 | iex"}`:null}function F7(Z){let Q=GX(Z);if(Q)j.info(Q)}function $X(Z){return ej(Z,{stdio:"inherit",shell:!0}).status??1}function HX(Z){Z.command("upgrade").description("升级 gtrk CLI 到最新版 + 刷新 skill(配置保留);--check 只查不装").option("--check","只检查有没有新版本,不执行升级").action(async(Q)=>{let Y=O0();j.step(`当前 v${Y},查询最新版…`);let J=await A6();if(!J){j.warn("查不到最新版本(网络问题?)。手动升级:npm i -g @gitruck/cli@latest"),F7("客户端(桌面端)升级");return}if(XQ(J,Y)<=0){j.ok(`已是最新版 v${Y}。`),F7("客户端(桌面端)如需升级");return}if(j.info(`发现新版本 v${J}(当前 v${Y})。`),Q.check){j.info("跑 `gtrk upgrade` 升级(会保留你现有的配置)。");return}if(j.step(`① 升级 CLI → v${J}…`),$X("npm i -g @gitruck/cli@latest")!==0){j.err("升级失败。手动重试:npm i -g @gitruck/cli@latest(若报权限,按你的 npm 全局目录权限处理)"),process.exitCode=1;return}if(j.step("② 通过通用适配器刷新 Agent Skills…"),$X("gtrk skills install")!==0)j.warn("skill 没刷成,手动跑一次:gtrk skills install");j.ok(`已升级到 v${J}。配置原样保留,直接接着用即可(gtrk doctor 可自检)。`),F7("客户端(桌面端)如需一起升级")})}import{resolve as H3,dirname as v7,join as EM,basename as w7,extname as IM}from"node:path";import{existsSync as SM}from"node:fs";import{resolve as K1,dirname as RM,join as DM,basename as X3,extname as PM}from"node:path";import{existsSync as S7}from"node:fs";import{writeFile as W3,readFile as OM}from"node:fs/promises";import{createInterface as LM}from"node:readline/promises";import{spawn as uF}from"node:child_process";var wX=V6(k6(),1);import{mkdirSync as vX,existsSync as WF,readdirSync as VF,statSync as KF,readFileSync as AX,rmSync as EX,unlinkSync as GF}from"node:fs";import{open as $F}from"node:fs/promises";import{spawn as HF}from"node:child_process";import{dirname as qF,extname as IX,join as jQ,resolve as P7,basename as O7}from"node:path";var BQ="embed_endpoint_unreachable",ZF=6033,UX=6201,NX=6202,Q1=0.1,e6=16,qX=1024,BX=180000,Z1=3,jX=1000;class Y1 extends Error{code=BQ;constructor(Z){super(Z);this.name="EmbedError"}}class M7 extends Error{code;rejected=!0;constructor(Z,Q){super(`自建 embed 端点拒绝了请求(code=${Z}):${Q}`+(Z===ZF?"——计量会话缺失或已过期(Redis TTL 2h):重跑 gtrk matrix index 会自动重开会话续跑(指纹增量,已完成素材零重算)":""));this.code=Z;this.name="EmbedRejectedError"}}function FX(Z){let Q=process.env.GITRUCK_EMBED_URL?.trim();if(Q)return Q;let Y=TZ().embedUrl?.trim();if(Y)return Y;return`${Z.replace(/\/+$/,"")}/task/cli/embed`}function QF(Z,Q){if(Z===429||Z>=500)return null;try{let Y=JSON.parse(Q);if(typeof Y.code==="number"&&Y.code!==200)return new M7(Y.code,typeof Y.msg==="string"&&Y.msg?Y.msg:`HTTP ${Z}`)}catch{}return null}async function YF(Z,Q,Y){let J=await Y.fetchFn(Z.url,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:JSON.stringify({input:Q,normalized:!0,...Y.sessionToken?{session_token:Y.sessionToken}:{}}),signal:AbortSignal.timeout(Y.timeoutMs)});if(!J.ok){let K=await J.text().catch(()=>""),G=QF(J.status,K);if(G)throw G;throw Error(`HTTP ${J.status}:${K.slice(0,200)}`)}let z=await J.json();if(typeof z.code==="number"&&z.code!==200)throw new M7(z.code,typeof z.msg==="string"?z.msg:`code=${z.code}`);let X=z.data;if(X&&typeof X==="object"&&!Array.isArray(X))X=X.data;if(!Array.isArray(X))throw Error("响应缺 data 数组(非 embed 契约响应)");let W=X;if(W.length!==Q.length)throw Error(`响应条数 ${W.length} 与输入 ${Q.length} 不符`);return[...W].sort((K,G)=>K.index-G.index).map((K)=>{if(!Array.isArray(K.embedding)||K.embedding.length!==qX)throw Error(`embedding 维度异常(期待满 ${qX} 维,得到 ${K.embedding?.length??"?"})`);return Float32Array.from(K.embedding)})}async function R7(Z,Q,Y={}){if(Q.length===0)return[];q8();let J=Y.fetchFn??fetch,z=Y.sleep??((K)=>new Promise((G)=>setTimeout(G,K))),X=Y.backoffBaseMs??jX,W=Y.timeoutMs??BX,V=[];for(let K=0;K<Q.length;K+=e6){let G=Q.slice(K,K+e6),$="",H=!1;for(let N=0;N<=Z1;N++){if(N>0)await z(X*2**(N-1));try{V.push(...await YF(Z,G,{fetchFn:J,timeoutMs:W,sessionToken:Y.sessionToken})),H=!0;break}catch(q){if(q?.rejected===!0)throw q;$=q instanceof Error?q.message:String(q)}}if(!H)throw new Y1(`自建 embed 端点不可达或响应异常(${Z.url}):${$}——已指数退避重试 ${Z1} 次。`+"不会回落第三方端点;请确认同合云 embed API 已上线、~/.gitruck 配置 embedUrl / 环境变量 GITRUCK_EMBED_URL 指向正确")}return V}function MX(Z,Q){return`${Z.replace(/\/+$/,"")}/session/${Q}`}async function RX(Z,Q,Y,J){let z=J.fetchFn??fetch,X=J.sleep??((G)=>new Promise(($)=>setTimeout($,G))),W=J.backoffBaseMs??jX,V=J.timeoutMs??BX,K="";for(let G=0;G<=Z1;G++){if(G>0)await X(W*2**(G-1));try{let $=await z(Z,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Q},body:JSON.stringify(Y),signal:AbortSignal.timeout(V)}),H=await $.text().catch(()=>""),N={};try{N=JSON.parse(H)}catch{}let q=typeof N.code==="number"?N.code:void 0;if($.ok&&(q===void 0||q===200))return{code:q,msg:typeof N.msg==="string"?N.msg:void 0,data:N.data};if(q!==void 0&&q!==200&&$.status!==429&&$.status<500)throw new OZ(q,typeof N.msg==="string"&&N.msg?N.msg:`code=${q}`);K=`HTTP ${$.status}:${(typeof N.msg==="string"?N.msg:H).slice(0,200)}`}catch($){if($ instanceof OZ)throw $;K=$ instanceof Error?$.message:String($)}}throw new Y1(`计量会话端点不可达或响应异常(${Z}):${K}——已指数退避重试 ${Z1} 次`)}async function DX(Z,Q,Y={}){if(!(Number.isInteger(Q)&&Q>0))throw Error(`planned_units 必须为正整数(得到 ${Q})——零计划帧不开会话`);let J=MX(Z.url,"open"),X=(await RX(J,Z.apiKey,{planned_units:Q},Y)).data??{};if(typeof X.session_token!=="string"||!X.session_token)throw new Y1(`会话 open 响应缺 session_token(${J})——非计量会话契约响应`);return{sessionToken:X.session_token,preDeductedCredits:typeof X.pre_deducted_credits==="number"?X.pre_deducted_credits:0}}async function PX(Z,Q,Y={}){let J=MX(Z.url,"close"),X=(await RX(J,Z.apiKey,{session_token:Q},Y)).data??{},W=(V)=>typeof V==="number"&&Number.isFinite(V)?V:0;return{usedUnits:W(X.used_units),settledCredits:W(X.settled_credits),refundedCredits:W(X.refunded_credits)}}import{cpus as UF}from"node:os";var D7=2,JF=new Set(["yuv420p","yuvj420p","nv12","yuv420p10le","p010le"]),zF=new Set(["h264","hevc","av1","vp9","mpeg2video","vc1"]);function OX(Z){let Q=Z.proxyWidth??384,Y=Z.proxyScaler??"neighbor";switch(Z.lane){case"gpu":return["-hwaccel","cuda","-hwaccel_output_format","cuda","-i",Z.src,"-vf",`scale_cuda=${Q}:-2:format=nv12,hwdownload,format=nv12,select='gte(scene,0)',metadata=print`,"-f","null","-"];case"cpu_proxy":return["-i",Z.src,"-vf",`scale=${Q}:-2:flags=${Y},select='gte(scene,0)',metadata=print`,"-f","null","-"];case"cpu_full":return["-i",Z.src,"-vf","select='gte(scene,0)',metadata=print","-f","null","-"]}}function LX(Z=0){return["-hide_banner","-v","error","-init_hw_device",`cuda=g:${Z}`,"-filter_hw_device","g","-f","lavfi","-i","color=c=black:s=256x144:d=0.04","-vf","format=nv12,hwupload,scale_cuda=64:-2:format=nv12,hwdownload,format=nv12","-frames:v","1","-f","null","-"]}function CX(Z,Q){let Y=(Z.codecName||"").toLowerCase(),J=(Z.pixFmt||"").toLowerCase();if(!Y||!J)return{ok:!1,reason:"codec_unknown"};if(!zF.has(Y))return{ok:!1,reason:`codec_${Y}`};if(!JF.has(J))return{ok:!1,reason:`pixfmt_${J}`};if(Y==="h264"&&Q.cores>=8)return{ok:!1,reason:"h264_cpu_wins"};return{ok:!0,reason:"ok"}}function _X(Z){if(Z==="gpu")return"cpu_proxy";if(Z==="cpu_proxy")return"cpu_full";return null}function XF(Z){if(Z==="codec_unknown")return"探不到编码信息";if(Z==="h264_cpu_wins")return"H.264 在多核机上软解更快";if(Z.startsWith("pixfmt_"))return`像素格式 ${Z.slice(7)} 无硬解支持`;if(Z.startsWith("codec_"))return`编码 ${Z.slice(6)} 无硬解支持`;return Z}function TX(Z){if(!Z.length)return null;let Q=new Map;for(let J of Z)Q.set(J.reason,(Q.get(J.reason)??0)+1);let Y=[...Q.entries()].sort((J,z)=>z[1]-J[1]).map(([J,z])=>`${XF(J)} ${z} 个`);return`GPU 硬解对 ${Z.length} 个素材不适用(${Y.join("、")}),已自动走 CPU 解码——索引结果不受影响`}var Q0=0.3,S0=0.05,NF=0.5,BF=2,SX=512,jF=0.5,yX=/\.(mp4|mov|m4v|mkv|webm|avi|wmv|mpg|mpeg|ts|mts|m2ts|flv)$/i,xX=/\.(jpg|jpeg|png|webp|bmp|gif|tif|tiff|heic|heif|avif)$/i;function FQ(Z){if(yX.test(Z))return"video";if(xX.test(Z))return"image";return null}function FF(){return process.env.GITRUCK_LOCAL_INDEX_DIR?.trim()||G6("local-broll-index")}function v0(){return jQ(FF(),"index.db")}async function MF(Z){let Q=await wX.createBLAKE3();Q.init();let Y=await $F(Z,"r");try{let J=Buffer.alloc(8388608);for(;;){let{bytesRead:z}=await Y.read(J,0,J.length,-1);if(z===0)break;Q.update(J.subarray(0,z))}return Q.digest("hex")}finally{await Y.close()}}async function J1(Z){return`${C0}${(await MF(Z)).slice(0,16)}`}async function RF(Z){if(vX(qF(Z),{recursive:!0}),typeof globalThis.Bun<"u"){let{Database:J}=await import("bun:sqlite"),z=new J(Z,{create:!0});return{exec:(X)=>z.exec(X),run:(X,W=[])=>void z.query(X).run(...W),all:(X,W=[])=>z.query(X).all(...W),get:(X,W=[])=>z.query(X).get(...W)??void 0,close:()=>z.close()}}let{DatabaseSync:Q}=await import("node:sqlite"),Y=new Q(Z);return{exec:(J)=>Y.exec(J),run:(J,z=[])=>void Y.prepare(J).run(...z),all:(J,z=[])=>Y.prepare(J).all(...z),get:(J,z=[])=>Y.prepare(J).get(...z)??void 0,close:()=>Y.close()}}function kX(Z,Q){Z.exec("BEGIN IMMEDIATE");try{Q(),Z.exec("COMMIT")}catch(Y){try{Z.exec("ROLLBACK")}catch{}throw Y}}var DF=`
|
|
85
85
|
CREATE TABLE IF NOT EXISTS meta (
|
|
86
86
|
key TEXT PRIMARY KEY,
|
|
87
87
|
value TEXT NOT NULL
|
|
@@ -158,101 +158,101 @@ CREATE TABLE IF NOT EXISTS describes (
|
|
|
158
158
|
created_at TEXT NOT NULL,
|
|
159
159
|
PRIMARY KEY (material_id, ts_ms)
|
|
160
160
|
);
|
|
161
|
-
`;async function S8(Z=I0()){let Q=await GF(Z);Q.exec($F);try{let Y=Q.all("PRAGMA table_info(materials)");if(!Y.some((K)=>K.name==="kind"))Q.exec("ALTER TABLE materials ADD COLUMN kind TEXT NOT NULL DEFAULT 'video'");if(!Q.all("PRAGMA table_info(scenes)").some((K)=>K.name==="stable"))Q.exec("ALTER TABLE scenes ADD COLUMN stable INTEGER");let z=Q.all("PRAGMA table_info(scenes)").map((K)=>K.name);for(let[K,G]of[["motion_p50","REAL"],["motion_p90","REAL"],["motion_samples","INTEGER"],["effective_fps","REAL"],["doubled","INTEGER"]])if(!z.includes(K))Q.exec(`ALTER TABLE scenes ADD COLUMN ${K} ${G}`);if(!Q.all("PRAGMA table_info(cuts)").map((K)=>K.name).includes("origin"))Q.exec("ALTER TABLE cuts ADD COLUMN origin TEXT");let V=Q.all("PRAGMA table_info(describes)").map((K)=>K.name);for(let[K,G]of[["subject","TEXT"],["action","TEXT"],["shot_size","TEXT"],["highlight","REAL"],["rubric_hash","TEXT"]])if(!V.includes(K))Q.exec(`ALTER TABLE describes ADD COLUMN ${K} ${G}`);if(!Y.some((K)=>K.name==="cuts_indexed"))Q.exec("ALTER TABLE materials ADD COLUMN cuts_indexed INTEGER");if(!Q.all("PRAGMA table_info(materials)").map((K)=>K.name).includes("decode_lane"))Q.exec("ALTER TABLE materials ADD COLUMN decode_lane TEXT")}catch(Y){throw Q.close(),Error(`索引库列迁移失败(${Y instanceof Error?Y.message:String(Y)})——索引是可随时重建的本机缓存,`+`建议跑 gtrk matrix index --dirs <...> --rebuild 重建(或删除 ${Z} 后重跑索引)`)}return Q.run("INSERT OR IGNORE INTO meta(key, value) VALUES ('schema_version', '1')"),Q}function HF(Z,Q){Z.run("DELETE FROM frames WHERE material_id = ?",[Q]),Z.run("DELETE FROM scenes WHERE material_id = ?",[Q]),Z.run("DELETE FROM cuts WHERE material_id = ?",[Q]),Z.run("DELETE FROM materials WHERE id = ?",[Q])}function IX(Z,Q,Y){let J=Z.get("SELECT id FROM materials WHERE material_id = ?",[Q]);if(!J)return 0;let z=0;return EX(Z,()=>{for(let X of Y){let V=Math.round(X),W=Z.get("SELECT COUNT(*) AS n FROM cuts WHERE material_id = ? AND t_ms = ?",[J.id,V]);if(W&&W.n>0)continue;Z.run("INSERT INTO cuts(material_id, t_ms, origin) VALUES (?,?,'qc_confirmed')",[J.id,V]),z++}}),z}function qF(Z,Q){Z.run("DELETE FROM describes WHERE material_id = ?",[Q])}var SX=new Uint8Array(new Uint32Array([1]).buffer)[0]===1;function UF(Z){if(SX)return new Uint8Array(Z.buffer.slice(Z.byteOffset,Z.byteOffset+Z.byteLength));let Q=new Uint8Array(Z.length*4),Y=new DataView(Q.buffer);for(let J=0;J<Z.length;J++)Y.setFloat32(J*4,Z[J],!0);return Q}function vX(Z){let Q=new Uint8Array(Z);if(SX)return new Float32Array(Q.buffer,0,Q.byteLength/4);let Y=Q.byteLength/4,J=new DataView(Q.buffer),z=new Float32Array(Y);for(let X=0;X<Y;X++)z[X]=J.getFloat32(X*4,!0);return z}function O7(Z){let Q=[],Y;for(let J of Z.split(/\r?\n/)){if(!J.includes("Parsed_metadata"))continue;let z=J.match(/frame:\d+\s.*\bpts_time:([0-9]+(?:\.[0-9]+)?)/);if(z){Y=Number(z[1]);continue}let X=J.match(/lavfi\.scene_score=([0-9]+(?:\.[0-9]+)?)/);if(X&&Y!==void 0)Q.push({ts:Y,score:Number(X[1])}),Y=void 0}return Q}function NF(Z,Q=e8){return Z.filter((Y)=>Y.score>Q).map((Y)=>Y.ts)}function BF(Z,Q,Y=zF){let J=[0];for(let X of Z)if(X-J[J.length-1]>=Y)J.push(X);if(Q-J[J.length-1]>=Y)J.push(Q);else J[J.length-1]=Q;let z=[];for(let X=0;X<J.length-1;X++)z.push({st:J[X],ed:J[X+1]});return z}function wX(Z,Q){return new Promise((Y,J)=>{let z=QF(Z,Q,{env:process.env}),X="";z.stderr.on("data",(V)=>{X+=V.toString("utf8")}),z.on("error",(V)=>J(V)),z.on("close",(V)=>Y({exitCode:V,stderr:X}))})}async function jF(Z,Q=8000){try{let Y=wX(Z,jX()),J=new Promise((X)=>setTimeout(()=>X(null),Q)),z=await Promise.race([Y,J]);return z!==null&&z.exitCode===0}catch{return!1}}function FF(Z,Q,Y=E0,J){let z=Z.map(()=>[]),X=Z.map((W)=>({st:W.st,ed:W.ed,maxScore:0,stable:!0,motion:{p50:null,p90:null,samples:0,effectiveFps:null,doubled:!1}})),V=0;for(let W of Q){while(V<X.length&&W.ts>=X[V].ed)V++;if(V>=X.length)break;let K=X[V];if(W.ts>K.st){if(W.score>K.maxScore)K.maxScore=W.score;z[V].push(W.score)}}for(let W=0;W<X.length;W++)X[W].stable=X[W].maxScore<Y,X[W].motion=PF(z[W],J);return X}var MF=0.004,RF=0.35,DF=2,OF=12;function PF(Z,Q){if(!Z.length)return{p50:null,p90:null,samples:0,effectiveFps:null,doubled:!1};let Y=0,J=0,z=0,X=[];for(let N of Z)if(N<MF){if(Y++,J++,J>z)z=J}else J=0,X.push(N);let V=Y/Z.length,W=X.length>=OF,K=W&&V>=RF&&z<=DF;if(!W)return{p50:null,p90:null,samples:X.length,effectiveFps:null,doubled:!1};let G=[...X].sort((N,U)=>N-U),$=(N)=>G[Math.min(G.length-1,Math.floor(G.length*N))],H=K&&typeof Q==="number"&&Number.isFinite(Q)&&Q>0?Math.round(Q*(1-V)*10)/10:null;return{p50:$(0.5),p90:$(0.9),samples:X.length,effectiveFps:H,doubled:K}}function LF(Z){let Q=Z.stderr.split(/\r?\n/).filter((Y)=>Y.trim()&&!Y.includes("lavfi.scene_score")&&!Y.includes("pts_time:")).slice(-3).join(" | ").slice(0,400);if(Z.exitCode!==0){let Y=Z.exitCode===null?"null":String(Z.exitCode>2147483647?Z.exitCode-4294967296:Z.exitCode);throw Error(`场景检测 ffmpeg 退出码 ${Y}${Q?`:${Q}`:""}`)}if(Z.frameCount===0)throw Error(`场景检测零帧产出(退出码 0 但一帧 scene score 都没解析到)${Q?`:${Q}`:""}`);if(Z.fps&&Z.fps>0&&Z.durationSec>0){let Y=Z.durationSec*Z.fps,J=Y*WF;if(Z.frameCount<J)throw Error(`场景检测产出残缺:实得 ${Z.frameCount} 帧,按 ${Z.durationSec.toFixed(1)}s × ${Z.fps}fps 应约 `+`${Math.round(Y)} 帧(下限 ${Math.round(J)})${Q?`:${Q}`:""}`)}}async function yX(Z,Q,Y,J=e8,z=E0,X,V){let{frames:W,lane:K}=await CF(Z,Q,Y,X,V),G=NF(W,J);return{scenes:FF(BF(G,Y),W,z,X),cuts:G,lane:K}}async function CF(Z,Q,Y,J,z){let X=z?.fallback!==!1,V=z?.lane??"cpu_full";for(;;){let{exitCode:W,stderr:K}=await wX(Z,BX({src:Q,lane:V,proxyWidth:z?.proxyWidth,proxyScaler:z?.proxyScaler})),G=O7(K);try{return LF({exitCode:W,stderr:K,frameCount:G.length,durationSec:Y,fps:J}),{frames:G,lane:V}}catch($){let H=X?MX(V):null;if(!H)throw $;z?.onDowngrade?.(V,H,$ instanceof Error?$.message:String($)),V=H}}}async function xX(Z,Q,Y,J=e8,z=E0){return(await yX(Z,Q,Y,J,z)).scenes}function D7(Z){let Q=[];for(let Y=0;Y<Z.length;Y++){let{st:J,ed:z,stable:X}=Z[Y],V=z-J;if(V<=4||X===!0)Q.push({sceneIdx:Y,ts:J+V/2});else{let W=J+1;while(W<z-0.5)Q.push({sceneIdx:Y,ts:W}),W+=XF}}return Q}async function t8(Z,Q,Y,J){try{await M8(Z,["-y","-v","error","-ss",Y.toFixed(3),"-i",Q,"-vframes","1","-vf",`scale='if(gte(iw,ih),min(${LX},iw),-2)':'if(lt(iw,ih),min(${LX},ih),-2)'`,"-q:v","3",J])}catch{return!1}return aj(J)}function _F(Z,Q){let Y=[],J=(z,X)=>{if(X>4)return;let V;try{V=sj(z,{withFileTypes:!0})}catch{return}for(let W of V){if(W.name.startsWith("."))continue;let K=HQ(z,W.name);if(W.isDirectory())J(K,X+1);else if(W.isFile()&&Q(W.name))Y.push(M7(K))}};for(let z of Z)J(M7(z),0);return Y.sort()}function TF(Z){return _F(Z,(Q)=>TX.test(Q)||AX.test(Q))}async function AF(Z,Q,Y,J){let z=qQ(Z)??"video",X=await a6(Z);if(z==="image"){let H=0,N=0;try{let U=hZ(Z,J);H=U.width,N=U.height}catch{}return{materialId:X,kind:z,durationMs:0,width:H,height:N,fps:0,scenes:[{st_ms:0,ed_ms:0}],framePlan:[{sceneIdx:0,ts_ms:0}]}}let V=hZ(Z,J);if(!(V.duration>0))throw Error("探测不到有效时长(疑似损坏/非视频文件)");let W=Q.lane??"cpu_full";if(W==="gpu"){let H=FX({codecName:V.codecName,pixFmt:V.pixFmt},{cores:JF().length});if(!H.ok)W="cpu_proxy",Q.onDowngrade?.("gpu","cpu_proxy",H.reason)}let K=await yX(Y.ffmpeg,Z,V.duration,Q.sceneThreshold,Q.stabilityThreshold,V.fps,{lane:W,fallback:Q.fallback,proxyWidth:Q.proxyWidth,proxyScaler:Q.proxyScaler,onDowngrade:Q.onDowngrade}),G=K.scenes,$=D7(G);return{materialId:X,kind:z,durationMs:Math.round(V.duration*1000),width:V.width,height:V.height,fps:V.fps,scenes:G.map((H)=>({st_ms:Math.round(H.st*1000),ed_ms:Math.round(H.ed*1000),stable:H.stable,motion:H.motion})),framePlan:$.map((H)=>({sceneIdx:H.sceneIdx,ts_ms:Math.round(H.ts*1000)})),cutsMs:K.cuts.map((H)=>Math.round(H*1000)),decodeLane:K.lane}}async function EF(Z,Q,Y,J,z){let X=HQ(B0(),`broll-index-${process.pid}`);CX(X,{recursive:!0});let V=[];if(Q.kind==="image")try{let W=HQ(X,`${R7(Z,PX(Z))}_0.jpg`);if(!await t8(Y.ffmpeg,Z,0,W))throw Error("图片 512px 缩放抽取失败(格式可能不受本机 ffmpeg 支持)");let[K]=await J([{image:DX(W).toString("base64")}],z);return[{sceneIdx:0,ts_ms:0,vec:K}]}finally{OX(X,{recursive:!0,force:!0})}try{let W=[],K=async()=>{if(!W.length)return;let G=W.map((H)=>({image:DX(H.jpg).toString("base64")})),$=await J(G,z);W.forEach((H,N)=>V.push({sceneIdx:H.sceneIdx,ts_ms:H.ts_ms,vec:$[N]}));for(let H of W)try{ej(H.jpg)}catch{}W=[]};for(let{sceneIdx:G,ts_ms:$}of Q.framePlan){let H=HQ(X,`${R7(Z,PX(Z))}_${$}.jpg`);if(!await t8(Y.ffmpeg,Z,$/1000,H))continue;if(W.push({sceneIdx:G,ts_ms:$,jpg:H}),W.length>=p6)await K()}await K()}finally{OX(X,{recursive:!0,force:!0})}return V}function IF(Z){let Q=Z;return Q?.code===$Q||Q?.rejected===!0}async function kX(Z){let Q=Date.now(),Y=Z.dbPath??I0(),J=Z.sceneThreshold??e8,z=Z.stabilityThreshold??E0,X=(Z.listFiles??TF)(Z.dirs),V=await S8(Y),W={total:X.length,indexed:0,skipped:0,rebuilt:0,failed:0},K={video:{total:0,indexed:0},image:{total:0,indexed:0}},G={stableScenes:0,unstableScenes:0,framesSaved:0},$=0,H=0,N=Z.planMaterial&&Z.embedFrames?null:SZ(Z.ffmpegPath),U=Z.decodePath??"full",q={baseLane:U==="gpu"?"gpu":U==="cpu"?"cpu_proxy":U==="auto"?"gpu":"cpu_full",fallback:U==="auto",probed:null,probeMs:void 0,tripped:!1,gpuFailStreak:0,gpuStatus:U==="gpu"||U==="auto"?"off_probe":"off_flag",lanes:{},degradeLog:[]},M=Z.probeGpuLane?()=>Z.probeGpuLane():(T)=>jF(T),F=Z.planMaterial??((T,_)=>AF(T,_,N,Z.ffmpegPath)),R=Z.embedFrames??((T,_,L)=>EF(T,_,N,Z.embed,L)),O,P,D=0;try{let T=[];for(let L of X){let I=R7(L);K[qQ(L)??"video"].total++;let E;try{E=tj(L)}catch{W.failed++,Z.onProgress?.(`[${I}] 读不到文件(跳过)`);continue}let y=E.size,f=Math.round(E.mtimeMs),S=V.get("SELECT * FROM materials WHERE path = ?",[L]);if(S&&!Z.rebuild&&S.size===y&&S.mtime_ms===f){W.skipped++,Z.onProgress?.(`[${I}] 指纹未变,跳过`);continue}try{let w=q.baseLane;if(w==="gpu")if(q.tripped)w="cpu_proxy";else{if(q.probed===null){let r=Date.now();if(q.probed=await M(N.ffmpeg),q.probeMs=Date.now()-r,!q.probed){if(q.gpuStatus="off_probe",!q.fallback)throw Error("--decode-path gpu:本机未探到可用的 CUDA 解码设备(显式指定车道时不降级)");Z.onProgress?.("GPU 硬解不可用(本机未探到可用 CUDA 解码设备),本轮走 CPU 解码——索引结果不受影响")}}if(!q.probed)w="cpu_proxy"}let x=q.degradeLog.length,m=await F(L,{sceneThreshold:J,stabilityThreshold:z,lane:w,fallback:q.fallback,proxyWidth:Z.proxyWidth,proxyScaler:Z.proxyScaler,onDowngrade:(r,c,g)=>{if(r==="gpu")q.gpuFailStreak++;q.degradeLog.push({name:I,reason:g})}});if(x===q.degradeLog.length)q.gpuFailStreak=0;if(q.gpuFailStreak>=F7&&!q.tripped)q.tripped=!0,q.gpuStatus="tripped",Z.onProgress?.(`GPU 硬解连续 ${F7} 次失败,本轮余下素材直接走 CPU 解码`);if(m.decodeLane){if(q.lanes[m.decodeLane]=(q.lanes[m.decodeLane]??0)+1,m.decodeLane==="gpu")q.gpuStatus=q.tripped?"tripped":"on"}T.push({path:L,name:I,size:y,mtimeMs:f,prev:S,planned:m})}catch(w){W.failed++,Z.onProgress?.(`[${I}] 探测/场景检测失败:${w instanceof Error?w.message:String(w)}(跳过)`)}}if(D=T.reduce((L,I)=>L+I.planned.framePlan.length,0),T.length)Z.onProgress?.(`抽帧计划就绪:${T.length} 个素材待索引 · 计划 ${D} 帧`);if(Z.session&&D>0)O=await Z.session.open(D),P={plannedUnits:D,preDeductedCredits:O.preDeductedCredits};for(let L of T){let I;try{I=await R(L.path,L.planned,O?.sessionToken)}catch(f){if(IF(f))throw f;W.failed++,Z.onProgress?.(`[${L.name}] 处理失败:${f instanceof Error?f.message:String(f)}(跳过)`);continue}let E=L.planned.kind??qQ(L.path)??"video";if(EX(V,()=>{if(L.prev){if(HF(V,L.prev.id),L.prev.size!==L.size||L.prev.mtime_ms!==L.mtimeMs)qF(V,L.prev.material_id)}V.run("INSERT INTO materials(material_id, path, kind, size, mtime_ms, duration_ms, width, height, fps, indexed_at, cuts_indexed, decode_lane) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",[L.planned.materialId,L.path,E,L.size,L.mtimeMs,L.planned.durationMs,E==="image"?L.planned.width>0?L.planned.width:null:L.planned.width,E==="image"?L.planned.height>0?L.planned.height:null:L.planned.height,E==="image"?null:L.planned.fps,new Date().toISOString(),L.planned.cutsMs!==void 0?1:null,L.planned.decodeLane??null]);let f=Number(V.get("SELECT last_insert_rowid() AS id").id);if(L.planned.cutsMs!==void 0)for(let w of L.planned.cutsMs)V.run("INSERT OR IGNORE INTO cuts(material_id, t_ms, origin) VALUES (?,?,'detected')",[f,w]);let S=[];for(let w of L.planned.scenes)V.run("INSERT INTO scenes(material_id, st_ms, ed_ms, stable, motion_p50, motion_p90, motion_samples, effective_fps, doubled) VALUES (?,?,?,?,?,?,?,?,?)",[f,w.st_ms,w.ed_ms,w.stable===void 0?null:w.stable?1:0,w.motion?.p50??null,w.motion?.p90??null,w.motion?.samples??null,w.motion?.effectiveFps??null,w.motion?w.motion.doubled?1:0:null]),S.push(Number(V.get("SELECT last_insert_rowid() AS id").id));for(let w of I){let x=S[w.sceneIdx];if(x===void 0)continue;V.run("INSERT INTO frames(scene_id, material_id, ts_ms, vec) VALUES (?,?,?,?)",[x,f,w.ts_ms,UF(w.vec)])}}),L.prev)W.rebuilt++;W.indexed++,K[E].indexed++,$+=L.planned.scenes.length,H+=I.length;let y="";if(E==="video"){let f=L.planned.scenes.map((w)=>({st:w.st_ms/1000,ed:w.ed_ms/1000,stable:w.stable}));for(let w of f)w.stable===!0?G.stableScenes++:G.unstableScenes++;let S=D7(f.map(({st:w,ed:x})=>({st:w,ed:x}))).length-D7(f).length;if(G.framesSaved+=S,S>0)y=` · stable 收敛省 ${S} 帧`}Z.onProgress?.(E==="image"?`[${L.name}] 图片 · 单帧向量${L.prev?"(指纹变化,已级联重建)":""}`:`[${L.name}] 时长 ${(L.planned.durationMs/1000).toFixed(1)}s · 场景 ${L.planned.scenes.length} · 帧 ${I.length}${y}${L.prev?"(指纹变化,已级联重建)":""}`)}let _=RX(q.degradeLog);if(_)Z.onProgress?.(_)}finally{if(V.close(),O&&Z.session)try{let T=await Z.session.close(O.sessionToken);if(P)P.usedUnits=T.usedUnits,P.settledCredits=T.settledCredits,P.refundedCredits=T.refundedCredits;Z.onProgress?.(`计量会话已结算:实际用量 ${T.usedUnits} 帧 → 实结 ${T.settledCredits} 积分 · 退还 ${T.refundedCredits} 积分(预扣 ${O.preDeductedCredits})`)}catch(T){if(P)P.reconcilePending=!0;Z.onProgress?.(`计量会话结算调用失败(${T instanceof Error?T.message:String(T)})——服务端 15 分钟内自动对账兜底结算,已用量不会丢`)}}return{dbPath:Y,dirs:Z.dirs.map((T)=>M7(T)),materials:W,kinds:K,scenes:$,frames:H,plannedFrames:D,decode:{requested:U,gpu:q.gpuStatus,lanes:q.lanes,degraded:q.degradeLog.length,probeMs:q.probeMs},stability:G,...P?{billing:P}:{},elapsedMs:Date.now()-Q}}var P7={sceneScore:0.3,flashMaxSec:1,cutMatchTolSec:0.12,blackMinDurSec:0.1,blackPicTh:0.98,blackPixTh:0.1,freezeNoise:0.003,freezeMinDurSec:2,silenceNoiseDb:-50,silenceMinDurSec:2,truePeakDbtp:-1,avDurationDiffSec:0.1},BZ=(Z)=>Math.round(Z*1000)/1000;function fX(Z,Q){return new Promise((Y,J)=>{let z=SF(Z,Q,{env:process.env}),X="";z.stderr.on("data",(V)=>{X+=V.toString("utf8")}),z.on("error",(V)=>J(V)),z.on("close",()=>Y(X))})}function vF(Z){let Q=[];for(let Y of Z.matchAll(/black_start:([0-9.]+)\s+black_end:([0-9.]+)/g))Q.push({st:Number(Y[1]),ed:Number(Y[2])});return Q}function wF(Z){let Q=[],Y;for(let J of Z.split(/\r?\n/)){let z=J.match(/freeze_start:\s*([0-9.]+)/);if(z){Y=Number(z[1]);continue}let X=J.match(/freeze_end:\s*([0-9.]+)/);if(X&&Y!==void 0)Q.push({st:Y,ed:Number(X[1])}),Y=void 0}return Q}function yF(Z){let Q=[],Y;for(let J of Z.split(/\r?\n/)){let z=J.match(/silence_start:\s*(-?[0-9.]+)/);if(z){Y=Math.max(0,Number(z[1]));continue}let X=J.match(/silence_end:\s*([0-9.]+)/);if(X&&Y!==void 0)Q.push({st:Y,ed:Number(X[1])}),Y=void 0}return Q}function xF(Z){let Q=0;for(let J of Z.matchAll(/Number of clipped samples:\s*(\d+)/g))Q+=Number(J[1]);let Y=null;for(let J of Z.matchAll(/True peak:\s*(-?[0-9.]+|-inf)/g)){let z=J[1]==="-inf"?Number.NEGATIVE_INFINITY:Number(J[1]);if(Y===null||z>Y)Y=z}return{clipCount:Q,truePeakDbtp:Y}}function kF(Z,Q=P7.flashMaxSec){let Y=[];for(let J=1;J<Z.length;J++){let z=Z[J]-Z[J-1];if(z>0&&z<=Q)Y.push({st:BZ(Z[J-1]),ed:BZ(Z[J]),sec:BZ(z)})}return Y}function fF(Z,Q){let Y=(J)=>Q!==null&&Q.has(BZ(J));return kF(Z).map((J)=>{if(Q===null)return{type:"flash",severity:"warn",st:J.st,ed:J.ed,evidence:{shot_sec:J.sec,note:"镜头过短;未开工程感知(--gtrk),来源不可判、未分级"}};let z=Y(J.st)||Y(J.ed);return{type:"flash",severity:z?"error":"info",st:J.st,ed:J.ed,evidence:{shot_sec:J.sec,endpoints:`${Y(J.st)?"拼接切":"段内跳切"}→${Y(J.ed)?"拼接切":"段内跳切"}`,note:z?"镜头过短且至少一端是 clip 拼接处:颗粒窗口跨过源切点造成的节奏断裂,可重铺修复":"镜头过短但两端都在同一颗粒内部:源素材自身的快剪节奏,非缺陷"}}})}function hF(Z,Q,Y={}){let J=Y.tolSec??P7.cutMatchTolSec,z=Y.maxDriftSec??1,X=[],V=[],W=new Set,K=0;for(let $ of Q){while(K<Z.length&&Z[K]<$-J)K++;if(K<Z.length&&Z[K]-$<=z)X.push({boundary:BZ($),cut:BZ(Z[K]),drift:BZ(Z[K]-$)}),W.add(K),K++;else V.push(BZ($))}let G=Z.filter(($,H)=>!W.has(H)).map(BZ);return{matched:X,intra:G,missing:V}}function bF(Z){let Q=Z?.struct_meta?.broll?.beats;if(!Array.isArray(Q))return[];let Y=[];for(let J of Q)for(let z of J.laid??[])(z.slots??[]).forEach((X,V)=>{let W=(G)=>typeof G==="number"?G:Number.NaN,K=W(X.track_st);if(!Number.isFinite(K))return;Y.push({beat:String(J.beat??""),slotIndex:V,clipId:String(X.clip_id??""),trackSt:K,trackEd:W(X.track_ed),clipSt:W(X.clip_st),clipEd:W(X.clip_ed)})});return Y.sort((J,z)=>J.trackSt-z.trackSt)}function gF(Z,Q,Y=0.1){let J=Z.filter((z)=>Q>=z.trackSt-Y&&Q<z.trackEd+Y);return J.length===1?J[0]:null}function uF(Z,Q,Y=0.1){let J=gF(Z,Q,Y);if(!J)return null;return{slot:J,src:BZ(J.clipSt+(Q-J.trackSt))}}function mF(Z){let Q=Z,Y=[...Q.video_track??[]].map((V,W)=>({key:typeof V.track_index==="number"?V.track_index:W,t:V})).sort((V,W)=>V.key-W.key);if(!Y.length)return[];let J=Q.struct_meta?.broll?.black_track??null;return[...((typeof J==="number"?Y.filter((V)=>V.key!==J):Y)[0]??Y[0]).t.track_timeline??[]].sort((V,W)=>Number(V.track_st)-Number(W.track_st)).map((V)=>Number(V.track_st)).filter((V)=>Number.isFinite(V)).slice(1)}function cF(Z,Q,Y){let J=Z?.struct_meta?.broll?.holes;if(!Array.isArray(J))return!1;return J.some((z)=>Y>=Number(z.track_st)-0.25&&Q<=Number(z.track_ed)+0.25)}async function L7(Z,Q={}){let Y=SZ(Q.ffmpegPath),J=P7,z=[],V=U9(Y.ffprobe,["-v","error","-show_entries","stream=codec_type,duration,nb_frames,r_frame_rate,avg_frame_rate","-of","json",Z]).streams??[],W=V.find((D)=>D.codec_type==="video"),K=V.find((D)=>D.codec_type==="audio"),G=W?.duration!=null?Number(W.duration):null,$=K?.duration!=null?Number(K.duration):null;if(G!==null&&$!==null){let D=G-$;if(Math.abs(D)>J.avDurationDiffSec)z.push({type:"av_drift",severity:"error",st:BZ(Math.min(G,$)),ed:BZ(Math.max(G,$)),evidence:{video_duration:BZ(G),audio_duration:BZ($),diff_sec:BZ(D),note:"画面与音频总长不一致:画面对口播渐进失步(成片切点相对工程时间线累积漂移)"}})}let H=(D)=>{if(!D)return null;let[T,_]=D.split("/").map(Number);return _?T/_:T??null},N=H(W?.r_frame_rate),U=H(W?.avg_frame_rate);if(N&&U&&Math.abs(N-U)/N>0.01)z.push({type:"vfr",severity:"error",st:0,ed:BZ(G??0),evidence:{r_frame_rate:BZ(N),avg_frame_rate:BZ(U),note:"成片非 CFR(渲染产物应恒为固定帧率)"}});Q.onProgress?.("视频趟:逐帧跳变 + 黑帧 + 冻结检测…");let q=["select='gte(scene,0)'","metadata=print",`blackdetect=d=${J.blackMinDurSec}:pic_th=${J.blackPicTh}:pix_th=${J.blackPixTh}`,`freezedetect=n=${J.freezeNoise}:d=${J.freezeMinDurSec}`].join(","),M=await fX(Y.ffmpeg,["-i",Z,"-vf",q,"-f","null","-"]),R=O7(M).filter((D)=>D.score>J.sceneScore).map((D)=>D.ts),O=null;if(Q.gtrk){let D=mF(Q.gtrk),{matched:T,intra:_}=hF(R,D),L=T.map((E)=>E.drift);O=new Set(T.map((E)=>E.cut));let I=bF(Q.gtrk);for(let E of _){let y=T.filter((w)=>w.cut<=E),f=y.length?y[y.length-1].cut:null,S=uF(I,E);z.push({type:"intra_cut",severity:"warn",st:E,ed:E,evidence:{note:"跳变不落在任何 clip 拼接边界上:颗粒窗口内部越过了源素材的镜头切点",clip_started_at:f,...f!==null?{into_clip_sec:BZ(E-f)}:{},...S?{beat:S.slot.beat,slot_index:S.slot.slotIndex,clip_id:S.slot.clipId,source_window:[S.slot.clipSt,S.slot.clipEd],source_time:S.src}:{coord_note:"跳变落在槽位边界容差内或工程无槽位登记,无法唯一定位"}}})}if(L.length)Q.onProgress?.(`工程对表:${T.length}/${D.length} 个剪切点对齐(漂移 ${BZ(L[0])}s→${BZ(L[L.length-1])}s)· 段内跳切 ${_.length}`)}z.push(...fF(R,O));for(let D of vF(M)){let T=Q.gtrk?cF(Q.gtrk,D.st,D.ed):!1;z.push({type:"black",severity:T?"info":"warn",st:BZ(D.st),ed:BZ(D.ed),evidence:{sec:BZ(D.ed-D.st),...T?{known_black_bed_hole:!0}:{}}})}for(let D of wF(M))z.push({type:"freeze",severity:"warn",st:BZ(D.st),ed:BZ(D.ed),evidence:{sec:BZ(D.ed-D.st)}});if(K){Q.onProgress?.("音频趟:静音 + 削波 + true peak 检测…");let D=[`silencedetect=n=${J.silenceNoiseDb}dB:d=${J.silenceMinDurSec}`,"astats=metadata=1","ebur128=peak=true"].join(","),T=await fX(Y.ffmpeg,["-i",Z,"-af",D,"-f","null","-"]);for(let E of yF(T))z.push({type:"silence",severity:"warn",st:BZ(E.st),ed:BZ(E.ed),evidence:{sec:BZ(E.ed-E.st)}});let{clipCount:_,truePeakDbtp:L}=xF(T),I=L!==null&&L>J.truePeakDbtp;if(_>0||I)z.push({type:"clip",severity:"error",st:0,ed:BZ($??0),evidence:{clipped_samples:_,true_peak_dbtp:L,note:"音频触顶(削波样本 / true peak 越限),成片过响易爆音"}})}z.sort((D,T)=>D.st-T.st||D.ed-T.ed);let P={error:0,warn:0,info:0};for(let D of z)P[D.severity]++;return{qc_version:"v1",input:Z,generated_at:new Date().toISOString(),summary:P,items:z}}function hX(Z,Q){if(Q==="never")return!1;if(Q==="warn")return Z.summary.error>0||Z.summary.warn>0;return Z.summary.error>0}function UQ(Z){let Q=Math.max(0,Z),Y=Math.floor(Q/3600),J=Math.floor(Q%3600/60),z=Q%60;return`${String(Y).padStart(2,"0")}:${String(J).padStart(2,"0")}:${z.toFixed(3).padStart(6,"0")}`}import{copyFileSync as zM,existsSync as Z1,mkdirSync as nX,readFileSync as pX,rmSync as iX,writeFileSync as oX}from"node:fs";import{tmpdir as XM}from"node:os";import{basename as WM,join as D8}from"node:path";import{mkdirSync as lF,readFileSync as dF,rmSync as nF}from"node:fs";import{join as pF}from"node:path";var iF="describe_endpoint_unreachable",t6=1,C7=32,oF=20,rF=120000,bX=3,aF=5000,sF=1800000,tF=1000;class A9 extends Error{code=iF;constructor(Z){super(Z);this.name="DescribeError"}}class e6 extends Error{code;rejected=!0;constructor(Z,Q){super(`素材理解端点拒绝了请求(code=${Z}):${Q}`);this.code=Z;this.name="DescribeRejectedError"}}function NQ(Z){let Q=process.env.GITRUCK_DESCRIBE_URL?.trim();if(Q)return Q;let Y=IZ().describeUrl?.trim();if(Y)return Y;return`${Z.replace(/\/+$/,"")}/task/cli/material_describe`}function gX(Z,Q){if(Z===429||Z>=500)return null;try{let Y=JSON.parse(Q);if(typeof Y.code==="number"&&Y.code!==200)return new e6(Y.code,typeof Y.msg==="string"&&Y.msg?Y.msg:`HTTP ${Z}`)}catch{}return null}function eF(Z){let Q=Z??{},Y=Array.isArray(Q.tags)?Q.tags.filter((W)=>typeof W==="string"):[],J={};if(Q.usable_flags&&typeof Q.usable_flags==="object"&&!Array.isArray(Q.usable_flags))for(let[W,K]of Object.entries(Q.usable_flags))J[W]=K===!0;let z=(W)=>typeof W==="number"&&Number.isFinite(W)?Math.min(100,Math.max(0,W)):null,X={desc:typeof Q.desc==="string"?Q.desc:"",tags:Y,mark:typeof Q.mark==="number"&&Number.isFinite(Q.mark)?Q.mark:0,usable_flags:J,subject:typeof Q.subject==="string"?Q.subject:"",action:typeof Q.action==="string"?Q.action:"",shot_size:typeof Q.shot_size==="string"&&Q.shot_size?Q.shot_size:null,highlight:z(Q.highlight)},V=z(Q.claim_aligned);if(V!==null)X.claim_aligned=V,X.claim_verdict=Q.claim_verdict==="match"||Q.claim_verdict==="mismatch"?Q.claim_verdict:"partial",X.claim_reason=typeof Q.claim_reason==="string"?Q.claim_reason:"";return X}function uX(Z){return{accept:"application/json",Authorization:Z.apiKey}}function ZM(Z,Q){let Y=Z?.data;if(Y&&typeof Y==="object"&&!Array.isArray(Y))Y=Y.data;if(!Array.isArray(Y))throw new A9("任务完成但 output_result 缺 data 数组(非 material_describe 契约响应)");if(Y.length!==Q)throw new A9(`任务完成但结果条数 ${Y.length} 与输入 ${Q} 不符`);return(Y.every((z)=>typeof z?.index==="number")?[...Y].sort((z,X)=>z.index-X.index):Y).map(eF)}async function QM(Z,Q,Y,J){let z={input:Q.map((G)=>({image:G}))};if(J?.highlightRubric?.trim())z.highlight_rubric=J.highlightRubric.trim();if(J?.claims?.some((G)=>G!==null&&G!==void 0&&G.trim()!==""))z.claims=J.claims.map((G)=>G&&G.trim()?G.trim():null);let X=await Y.fetchFn(Z.url,{method:"POST",headers:{...uX(Z),"Content-Type":"application/json"},body:JSON.stringify(z),signal:AbortSignal.timeout(Y.timeoutMs)});if(!X.ok){let G=await X.text().catch(()=>""),$=gX(X.status,G);if($)throw $;throw Error(`HTTP ${X.status}:${G.slice(0,200)}`)}let V=await X.json();if(typeof V.code==="number"&&V.code!==200)throw new e6(V.code,typeof V.msg==="string"?V.msg:`code=${V.code}`);let K=(V.data&&typeof V.data==="object"&&!Array.isArray(V.data)?V.data:V).task_id;if(typeof K!=="string"||!K)throw Error("提交响应缺 task_id(非 material_describe 异步任务契约响应)");return K}async function YM(Z,Q,Y,J){let z=`${Z.url.replace(/\/+$/,"")}/${Q}`,X=J.now();for(;;){if(J.now()-X>J.pollTimeoutMs)throw new A9(`素材理解任务轮询超时(超过 ${Math.round(J.pollTimeoutMs/60000)} 分钟,task_id=${Q})。`+"任务可能仍在云端执行,可稍后重跑查询——未落缓存的帧会重新提交,已完成帧走缓存零重复计费");await J.sleep(J.pollIntervalMs);let V;try{let G=await J.fetchFn(z,{headers:uX(Z),signal:AbortSignal.timeout(J.timeoutMs)});if(!G.ok){let $=await G.text().catch(()=>""),H=gX(G.status,$);if(H)throw H;continue}V=await G.json()}catch(G){if(G?.rejected===!0)throw G;continue}if(typeof V.code==="number"&&V.code!==200)throw new e6(V.code,typeof V.msg==="string"&&V.msg?V.msg:`code=${V.code}`);let W=V.data&&typeof V.data==="object"&&!Array.isArray(V.data)?V.data:V,K=String(W.status??"");if(K==="completed")return ZM(W.output_result,Y);if(K==="failed"||K==="cancelled"){let G=W.output_result,$=G&&typeof G.error==="string"&&G.error?`:${G.error}`:"";throw new A9(K==="failed"?`素材理解任务失败(task_id=${Q})${$}——预扣积分已由服务端自动退款`:`素材理解任务已取消(task_id=${Q})${$}`)}}}async function E9(Z,Q,Y={},J){if(Q.length===0)return[];H8();let z=Y.fetchFn??fetch,X=Y.sleep??(($)=>new Promise((H)=>setTimeout(H,$))),V=Y.backoffBaseMs??tF,W=Y.timeoutMs??rF,K={fetchFn:z,sleep:X,timeoutMs:W,pollIntervalMs:Y.pollIntervalMs??aF,pollTimeoutMs:Y.pollTimeoutMs??sF,now:Y.now??Date.now},G=[];for(let $=0;$<Q.length;$+=C7){let H=Q.slice($,$+C7),N=J?{...J,claims:J.claims?.slice($,$+C7)}:void 0,U,q="";for(let M=0;M<=bX;M++){if(M>0)await X(V*2**(M-1));try{U=await QM(Z,H,{fetchFn:z,timeoutMs:W},N);break}catch(F){if(F?.rejected===!0)throw F;q=F instanceof Error?F.message:String(F)}}if(U===void 0)throw new A9(`素材理解端点不可达或响应异常(${Z.url}):${q}——已指数退避重试 ${bX} 次。`+"请确认同合云 material_describe API 已上线、~/.gitruck 配置 describeUrl / 环境变量 GITRUCK_DESCRIBE_URL 指向正确");G.push(...await YM(Z,U,H.length,K))}return G}function JM(Z,Q,Y){let J=Z.get("SELECT desc_text, tags_json, mark, flags_json, subject, action, shot_size, highlight FROM describes WHERE material_id = ? AND ts_ms = ?",[Q,Y]);if(!J)return;try{return{desc:J.desc_text,tags:JSON.parse(J.tags_json),mark:J.mark??0,usable_flags:JSON.parse(J.flags_json),subject:J.subject??"",action:J.action??"",shot_size:J.shot_size??null,highlight:J.highlight??null}}catch{return}}var mX=15000;function cX(Z,Q,Y){let J=Z.get("SELECT mark, ts_ms FROM describes WHERE material_id = ? ORDER BY ABS(ts_ms - ?) ASC LIMIT 1",[Q,Y]);if(!J)return;if(Math.abs(J.ts_ms-Y)>mX)return;return J.mark??0}function _7(Z,Q,Y){let J=Z.get("SELECT highlight, ts_ms FROM describes WHERE material_id = ? AND highlight IS NOT NULL ORDER BY ABS(ts_ms - ?) ASC LIMIT 1",[Q,Y]);if(!J)return;if(Math.abs(J.ts_ms-Y)>mX)return;return J.highlight??void 0}function T7(Z,Q,Y,J,z){Z.run("INSERT OR REPLACE INTO describes(material_id, ts_ms, desc_text, tags_json, mark, flags_json, subject, action, shot_size, highlight, rubric_hash, created_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",[Q,Y,J.desc,JSON.stringify(J.tags),J.mark,JSON.stringify(J.usable_flags),J.subject||null,J.action||null,J.shot_size,J.highlight,z??null,new Date().toISOString()])}function lX(Z){return{desc:Z.desc,tags:Z.tags,mark:Z.mark,usable_flags:Z.usable_flags,...Z.subject?{subject:Z.subject}:{},...Z.action?{action:Z.action}:{},...Z.shot_size?{shot_size:Z.shot_size}:{},...Z.highlight!==null&&Z.highlight!==void 0?{highlight:Z.highlight}:{}}}var s6=(Z)=>`${Z.materialId}@${Z.tsMs}`;async function dX(Z,Q){let Y=Q.onLog??(()=>{}),J=new Map,z=[];for(let H of Z){let N=s6(H);if(J.has(N))continue;let U=JM(Q.db,H.materialId,H.tsMs);if(U)J.set(N,U);else J.set(N,null),z.push(H)}let X=J.size-z.length,V=z.length*t6,W;if(z.length>oF){W=await Q.probeExempt();let H=`本次将实际调用素材理解 ${z.length} 张(另 ${X} 张缓存命中零计费),`+`预估 ${V} 积分(${t6} 积分/张,异步任务计费:提交预扣→完成结算,失败自动退款)`;if(W)Y(`${H}——同合云内部成员(gc_member_type=internal)计费豁免,免确认继续`);else if(Q.yes)Y(`${H}——已按 --yes 跳过确认`);else if(Y(H),!await Q.confirm(`确认继续理解 ${z.length} 张(约 ${V} 积分)?`))return{ok:!1,declined:!0,described:X,cached:X,called:0,failed:0,estimatedCredits:V,...W!==void 0?{exempt:W}:{},results:Z.map((U)=>J.get(s6(U))??null)}}let K=0,G=0;if(z.length){lF(Q.frameDir,{recursive:!0});let H=Q.readFileBase64??((N)=>dF(N).toString("base64"));try{let N=[];for(let U of z)try{if(U.source.kind==="direct")N.push({item:U,b64:H(U.source.path)});else{let q=pF(Q.frameDir,`${U.materialId}_${U.tsMs}.jpg`);if(!await Q.extractFrame(U.source.src,U.source.tsSec,q))throw Error("抽帧失败(源不可读或 ffmpeg 不支持该格式)");N.push({item:U,b64:H(q)})}}catch(q){K++,Y(`[${U.materialId} @${(U.tsMs/1000).toFixed(1)}s] 取帧失败:${q instanceof Error?q.message:String(q)}(跳过)`)}if(N.length){let U=await Q.describeBatch(N.map((q)=>q.b64));G=N.length,N.forEach((q,M)=>{let F=U[M];T7(Q.db,q.item.materialId,q.item.tsMs,F),J.set(s6(q.item),F)})}}finally{nF(Q.frameDir,{recursive:!0,force:!0})}}let $=Z.map((H)=>J.get(s6(H))??null);return{ok:!0,described:X+G,cached:X,called:G,failed:K,estimatedCredits:V,...W!==void 0?{exempt:W}:{},results:$}}var I9=(Z)=>typeof Z==="number"?Z:Number.parseFloat(Z);function VM(Z){let Q=Z?.beats;if(!Array.isArray(Q))return[];let Y=[];for(let J of Q){let z=J;if(Array.isArray(z.queries)&&z.queries.some((X)=>typeof X?.query==="string"&&X.query.includes("引用段"))&&typeof z.track_st==="number"&&typeof z.track_ed==="number")Y.push([z.track_st,z.track_ed])}return Y}function KM(Z){let Q=[...Z.clips].sort((Y,J)=>I9(Y.track_st)-I9(J.track_st));return Z.utterances.map((Y)=>{let J=(Y.st+Y.ed)/2,z={id:Y.id,sentence:Y.text,track_mid:Math.round(J*1000)/1000,clip_id:null,source_path:null,source_sec:null};if(/^([^)]*原声)/.test(Y.text.trim())||Z.quoteSpans.some(([$,H])=>Y.st>=$-0.05&&Y.ed<=H+0.05))return{...z,skipped:"quote"};let V=Z.leadIds?.has(Y.id)===!1?"follow":"lead",W=Q.find(($)=>I9($.track_st)<=J&&J<I9($.track_ed));if(!W)return{...z,role:V,skipped:"no_clip"};let K=I9(W.clip_st)+(J-I9(W.track_st)),G=W.material?Z.materials[W.material]??null:null;if(!G)return{...z,role:V,clip_id:W.clip_id??null,skipped:"no_material_path"};return{...z,role:V,clip_id:W.clip_id??null,source_path:G,source_sec:Math.round(K*1000)/1000}})}function rX(Z){let Q=Z.filter((J)=>J.verdict);if(Q.length===0)return null;let Y=Q.reduce((J,z)=>J+(z.verdict==="match"?1:z.verdict==="partial"?0.5:0),0);return Math.round(Y/Q.length*1000)/10}async function aX(Z,Q){let Y=Q.onLog??(()=>{}),J=(E)=>JSON.parse(pX(E,"utf-8")),z=D8(Z,"gtrk","project.gtrk"),X=D8(Z,"transcript","transcript.json");if(!Z1(z)||!Z1(X))throw Error(`工程不完整:需要 ${z} 与 ${X}(oralcut/project init 产物布局)`);let V=J(z),W=J(X),K=D8(Z,"split","broll-plan.json"),G=Z1(K)?VM(J(K)):[],$=D8(Z,"split","dispatch.json"),H;if(Z1($)){let y=(J($).film_broll??[]).map((f)=>f.span?.from).filter((f)=>!!f);if(y.length>0)H=new Set(y)}let N=V.video_track?.[0]?.track_timeline??[],U={};for(let E of V.materials??[])if(E.id&&E.path)U[E.id]=E.path;let q=KM({utterances:W.utterances??[],clips:N,materials:U,quoteSpans:G,leadIds:H}),M=D8(Z,"qc"),F=D8(M,"alignment-frames");nX(F,{recursive:!0});let R=D8(XM(),`gtrk-alignment-${process.pid}`);nX(R,{recursive:!0});let O=Q.extractFrame??((E,y,f)=>t8(Q.ffmpeg,E,y,f)),P=[];for(let E of q){if(E.skipped||E.source_path===null||E.source_sec===null)continue;let y=D8(R,`${E.id}.jpg`);if(!await O(E.source_path,E.source_sec,y)){E.skipped="frame_extract_failed";continue}let S=D8(F,`${E.id}.jpg`);zM(y,S),E.thumb=`alignment-frames/${E.id}.jpg`,P.push(E)}let D=P.length*t6;if(P.length>0&&!Q.yes){if(!await Q.confirm(`对齐质检将逐句判定 ${P.length} 帧(约 ${D} 积分,1 积分/帧;引用段已按结构校验跳过)。确认继续?`))throw iX(R,{recursive:!0,force:!0}),Error("对齐质检计费确认被拒绝——零调用零计费")}let T=!1;if(P.length>0){let E=P.map((S)=>pX(D8(R,`${S.id}.jpg`)).toString("base64")),y=P.map((S)=>S.sentence),f=Q.describeBatch?await Q.describeBatch(E,y):await E9(Q.endpoint,E,{},{claims:y});if(T=f.length>0&&f.every((S)=>S.claim_aligned===void 0),f.forEach((S,w)=>{let x=P[w];if(x.frame_desc=S.desc,S.claim_aligned!==void 0)x.aligned=S.claim_aligned,x.verdict=S.claim_verdict,x.reason=S.claim_reason;if(Q.db&&x.source_path!==null&&x.source_sec!==null)try{T7(Q.db,`align-${WM(x.source_path)}`,Math.round(x.source_sec*1000),{...S,claim_aligned:void 0,claim_verdict:void 0,claim_reason:void 0})}catch{}}),T)Y("[对齐质检] 服务端未返回判定字段(material_describe 未升级或旧版本)——降级为配对表+帧描述,"+"裁定交 agent 文本判读(帧 desc 已在报告 items[].frame_desc)");else{let S=f.filter((w)=>w.claim_aligned===void 0).length;if(S>0)Y(`[对齐质检] ${S} 行 VLM 漏出判定字段,按「待裁定」单列(frame_desc 在场可人工/agent 补裁)`)}}iX(R,{recursive:!0,force:!0});let _=q.filter((E)=>E.verdict),L={qc_version:"alignment-v1",project:Z,generated_at:new Date().toISOString(),degraded:T,summary:{audited:P.length,skipped:q.length-P.length,match:_.filter((E)=>E.verdict==="match").length,partial:_.filter((E)=>E.verdict==="partial").length,mismatch:_.filter((E)=>E.verdict==="mismatch").length,rate:rX(q),lead_total:_.filter((E)=>E.role!=="follow").length,lead_mismatch:_.filter((E)=>E.role!=="follow"&&E.verdict==="mismatch").length,lead_rate:rX(_.filter((E)=>E.role!=="follow"))},items:q};oX(D8(M,"alignment-audit.json"),JSON.stringify(L,null,1),"utf-8");let I=[`# 稿句 ↔ 画面对齐审计(${L.generated_at})`,"",L.summary.rate!==null?`**卡点句对齐率 ${L.summary.lead_rate}%(mismatch ${L.summary.lead_mismatch}/${L.summary.lead_total})← 验收判据**;全句口径 ${L.summary.rate}%(match ${L.summary.match} / partial ${L.summary.partial} / mismatch ${L.summary.mismatch},n=${L.summary.audited})。七三开:跟随句为抽象/数字/修辞句,蹭领衔镜头保节奏自然,其 partial/mismatch 属设计非缺陷`:"**降级形态**(服务端未升级):帧描述已产出,逐句裁定交 agent 文本判读","","| 句 | 角色 | 稿句 | 画面 | 判定 | 说明 |","|---|---|---|---|---|---|"];for(let E of q){let y=E.thumb?``:E.skipped==="quote"?"(引用段·结构校验)":`(跳过:${E.skipped??"?"})`,f=E.verdict?`${E.verdict}(${E.aligned})`:E.skipped?"—":"待裁定",S=E.role==="follow"?"跟随":E.skipped==="quote"?"引用":"**卡点**";I.push(`| ${E.id} | ${S} | ${E.sentence.replace(/\|/g,"\\|")} | ${y} | ${f} | ${(E.reason??E.frame_desc??"").replace(/\|/g,"\\|")} |`)}return oX(D8(M,"alignment-audit.md"),I.join(`
|
|
162
|
-
`),"utf-8"),
|
|
163
|
-
`,"utf8"),j.ok(`质检完成:严重 ${
|
|
164
|
-
`,"utf8");let{error:X,warn:
|
|
165
|
-
`),"utf8").digest("hex"),Q}async function
|
|
166
|
-
`);if(Y.matched_clips>0)return j.info(J[0]),Y;j.warn(`当刻工程里没有命中口播素材(material_id=${Y.material_id})的 clip——`+"视图里会表现为「全部被剪」,但真因未必是被剪:");for(let z of J)j.info(z);return j.warn(Y.hint),Y}function
|
|
167
|
-
`+N.map((
|
|
168
|
-
`));let
|
|
169
|
-
`+`${
|
|
170
|
-
${F.hint}`);let R=xM(vM(Q)),O=zJ(X,M,{utteranceIds:H.utteranceIds,projectSlug:R,projectedAt:q,sourceIndex:{materialId:String(V.material_id),utterances:new Map(V.utterances.map((L)=>[L.id,{st:L.st,ed:L.ed}]))}});K3(Y,W,O.split,K);let P=v8(Q,"split");await H3(P,{recursive:!0});let D=v8(P,"dispatch.json");await w7(D,JSON.stringify(O.dispatch,null,2));let T=null;if(z.md)T=v8(P,"visual-split.md"),await w7(T,XJ(X,O,{projectSlug:R,projectedAt:q}));j.ok(`落地完成:${O.split.beats.length}/${X.beats.length} beat 落轨`+`(MG ${O.dispatch.mg.length} · FILM_BROLL ${O.dispatch.film_broll.length} · AI_DRAMA ${O.dispatch.ai_drama.length})`);for(let L of O.skipped)j.warn(`跳过 ${L.beat}:${L.reason}`);for(let L of O.shrunk)j.warn(`收缩 ${L.beat}:${L.dropped} 句被剪,按存活 ${L.kept} 句包络 → ${L.track_st}s…${L.track_ed}s(建议人工复核)`);if(O.unhandledLanes.length>0)j.warn(`未派单 lane:${O.unhandledLanes.join("、")}——通过校验却无 dispatch 分支,落地静默丢队列(新增 lane 时请同步 buildLanding 分派)`);let _={ok:!0,mode:"land",gtrk:Y,dispatchPath:D,mdPath:T,transcript_hash:X.transcript_hash,projected_at:q,beats:{total:X.beats.length,landed:O.split.beats.length,skipped:O.skipped,shrunk:O.shrunk},main_track:j3(F),queues:{mg:O.dispatch.mg.length,film_broll:O.dispatch.film_broll.length,ai_drama:O.dispatch.ai_drama.length}};if(z.json)console.log(JSON.stringify(_));return _}import{existsSync as I3,readFileSync as mM}from"node:fs";import{join as S3,resolve as g7}from"node:path";import{randomBytes as cM}from"node:crypto";function n0(Z,Q){return Math.floor(Z*Q+0.5)}function p0(Z,Q){return Math.round(Z*1000/Q)}function jQ(Z){return Math.round(Z*1000)}function oZ(Z){return Z/1000}function xZ(Z){let Q=typeof Z==="number"?Z:Number(Z);return Number.isFinite(Q)?jQ(Q):Number.NaN}function S9(Z,Q){let Y=Z.stFrame+Z.durFrames,J=p0(Z.stFrame,Q),z=p0(Y,Q),X=z-J,V=Z.clipStMs,W=V===null?null:V+X;return{trackStMs:J,trackEdMs:z,durationMs:X,clipStMs:V,clipEdMs:W,durFrames:Z.durFrames}}var x7={video:"video_track",audio:"audio_track",beat:"beat_track"};function y7(Z){return Array.isArray(Z)?Z:[]}function Z0(Z){let Q=[];for(let Y of["video","audio","beat"])y7(Z[x7[Y]]).forEach((z,X)=>{if(typeof z!=="object"||z===null)return;let V=z,W=typeof V.track_index==="number"?V.track_index:X;y7(V.track_timeline).forEach((K,G)=>{if(typeof K!=="object"||K===null)return;let $=K,H=typeof $.clip_id==="string"?$.clip_id:"";Q.push({ref:{kind:Y,trackArrayIndex:X,clipArrayIndex:G,trackIndex:W},clip:$,clipId:H,isGap:H===""})})});return Q}function v9(Z,Q){let Y=xZ(Z.clip.track_st);return{track:`${Z.ref.kind}:${Z.ref.trackIndex}`,clip_id:Z.clipId,track_st:Number.isFinite(Y)?oZ(Y):Number.NaN}}function bM(Z,Q){let Y=new Set([Z.ref.kind,Q.ref.kind]);if(!(Y.has("video")&&Y.has("audio")))return!1;let J=xZ(Z.clip.track_st),z=xZ(Q.clip.track_st),X=xZ(Z.clip.duration),V=xZ(Q.clip.duration);if(!Number.isFinite(J)||!Number.isFinite(X))return!1;return J===z&&X===V}function M3(Z,Q){if(Q==="")return{kind:"gap-not-addressable"};let Y=Z0(Z).filter((J)=>J.clipId===Q);if(Y.length===0)return{kind:"none"};if(Y.length===1)return{kind:"single",elements:[Y[0]]};if(Y.length===2&&bM(Y[0],Y[1]))return{kind:"mirror-pair",elements:[Y[0],Y[1]]};return{kind:"ambiguous",elements:Y}}function R3(Z,Q,Y,J){let z=jQ(J);return Z0(Z).filter((X)=>{if(X.ref.kind!==Q||X.ref.trackIndex!==Y)return!1;let V=xZ(X.clip.track_st),W=xZ(X.clip.track_ed);if(!Number.isFinite(V))return!1;let K=Number.isFinite(W)?W:V+xZ(X.clip.duration);return z>=V&&z<K})}function D3(Z){return Z==="move"||Z==="trim"||Z==="split"}function k7(Z){if(Z.ref.kind==="beat")return"beat";let Q=Z.clip.material===void 0||Z.clip.material===null||Z.clip.material==="";return Z.isGap||Q?"gap":"clip"}function gM(Z){let Q=new Map;for(let Y of y7(Z.materials)){if(typeof Y!=="object"||Y===null)continue;let J=Y,z=typeof J.id==="string"?J.id:String(J.id??"");if(!z)continue;let X=xZ(J.duration);Q.set(z,Number.isFinite(X)?X:null)}return Q}function FQ(Z){let Q=[],Y=gM(Z),J=Z0(Z);for(let X of J){let V=k7(X),W=`${X.ref.kind}:${X.ref.trackIndex}#${X.ref.clipArrayIndex}`,K=X.clipId||"(gap)",G=xZ(X.clip.track_st),$=xZ(X.clip.duration),H=xZ(X.clip.track_ed);if(!Number.isFinite(G)||!Number.isFinite($)){Q.push({key:`${W}/required`,code:"missing_required_timecode",message:`${W}(${K})缺 track_st 或 duration`});continue}if($<=0)Q.push({key:`${W}/dur_positive`,code:"duration_not_positive",message:`${W}(${K})duration=${oZ($)}s,须 > 0`});if(Number.isFinite(H)&&H-G!==$)Q.push({key:`${W}/E2`,code:"track_identity_broken",message:`${W}(${K})track_ed − track_st = ${H-G}ms ≠ duration ${$}ms`});if(V==="gap"||V==="beat"){if(X.clip.clip_st!==void 0||X.clip.clip_ed!==void 0)Q.push({key:`${W}/no_src_range`,code:"src_range_on_non_clip",message:`${W}(${K})是 ${V},MUST NOT 含 clip_st/clip_ed`});continue}let N=xZ(X.clip.clip_st),U=xZ(X.clip.clip_ed);if(Number.isFinite(N)&&Number.isFinite(U)&&U-N!==$)Q.push({key:`${W}/E1`,code:"clip_identity_broken",message:`${W}(${K})clip_ed − clip_st = ${U-N}ms ≠ duration ${$}ms`});let q=typeof X.clip.material==="string"?X.clip.material:String(X.clip.material??"");if(q&&!Y.has(q))Q.push({key:`${W}/E4`,code:"material_not_found",message:`${W}(${K})material=${q} 不在 materials 中`});if(Number.isFinite(N)){if(N<0)Q.push({key:`${W}/E5_lower`,code:"src_out_of_range",message:`${W}(${K})clip_st=${oZ(N)}s < 0`});if(Number.isFinite(U)&&N>=U)Q.push({key:`${W}/E5_order`,code:"src_range_not_increasing",message:`${W}(${K})clip_st 须 < clip_ed`});let M=Y.get(q);if(M!==null&&M!==void 0&&Number.isFinite(U)&&U>M+1)Q.push({key:`${W}/E5_upper`,code:"src_exceeds_material",message:`${W}(${K})clip_ed=${oZ(U)}s 超出素材时长 ${oZ(M)}s(容差 1ms)`})}}let z=new Map;for(let X of J){let V=`${X.ref.kind}:${X.ref.trackIndex}`;(z.get(V)??z.set(V,[]).get(V)).push(X)}for(let[X,V]of z){let W=[...V].map((K)=>({e:K,st:xZ(K.clip.track_st),dur:xZ(K.clip.duration)})).filter((K)=>Number.isFinite(K.st)&&Number.isFinite(K.dur)).sort((K,G)=>K.st-G.st);for(let K=1;K<W.length;K++){let G=W[K-1],$=W[K];if($.st<G.st+G.dur)Q.push({key:`${X}/overlap/${G.e.clipId}|${$.e.clipId}@${G.st}-${$.st}`,code:"same_track_overlap",message:`${X} 上「${G.e.clipId||"(gap)"}」与「${$.e.clipId||"(gap)"}」时间重叠`})}}return Q}function f7(Z,Q){let Y=new Set(Z.map((J)=>J.key));return{violations:Q.filter((J)=>!Y.has(J.key)),preexisting:Q.filter((J)=>Y.has(J.key))}}function z1(Z){let Q=0;for(let Y of Z0(Z)){let J=xZ(Y.clip.track_st),z=xZ(Y.clip.duration);if(Number.isFinite(J)&&Number.isFinite(z))Q=Math.max(Q,J+z)}return Q}function O3(Z,Q){let Y=xZ(Z.clip.track_st),J=xZ(Z.clip.duration),z=n0(oZ(Y),Q),X=n0(oZ(Y+J),Q)-z,V=k7(Z),W=xZ(Z.clip.clip_st);return{stFrame:z,durFrames:X,clipStMs:V==="clip"&&Number.isFinite(W)?W:null}}function w9(Z){let Q=Z.trim(),Y=/^([+-]?\d+(?:\.\d+)?)f$/i.exec(Q);if(Y){let z=Number(Y[1]);return Number.isInteger(z)?{frames:z,sec:null}:null}let J=/^([+-]?\d+(?:\.\d+)?)s?$/i.exec(Q);if(J){let z=Number(J[1]);return Number.isFinite(z)?{frames:null,sec:z}:null}return null}function F3(Z,Q){return Z.frames!==null?Z.frames:n0(Z.sec??0,Q)}function uM(Z,Q){return Z.frames!==null?p0(Z.frames,Q):jQ(Z.sec??0)}function P3(Z,Q,Y){let J=Q.frames!==null?Q.frames:n0(Q.sec??0,Y);if(J<0)return{ok:!1,error:{code:"negative_start",message:"落点不能为负"}};return{ok:!0,view:{...Z,stFrame:J}}}function L3(Z,Q,Y){let{stFrame:J,durFrames:z,clipStMs:X}=Z;if(Q.slip!==void 0){if(X===null)return{ok:!1,error:{code:"slip_on_non_clip",message:"gap / beat 没有源窗,--slip 不适用"}};return{ok:!0,view:{stFrame:J,durFrames:z,clipStMs:X+uM(Q.slip,Y)}}}if(Q.in!==void 0||Q.setIn!==void 0){let V=Q.setIn!==void 0?Q.setIn.frames!==null?Q.setIn.frames:n0(Q.setIn.sec??0,Y):J+F3(Q.in,Y),W=V-J;if(J=V,z-=W,X!==null)X+=p0(V,Y)-p0(V-W,Y)}if(Q.out!==void 0||Q.setOut!==void 0)z=Q.setOut!==void 0?(Q.setOut.frames!==null?Q.setOut.frames:n0(Q.setOut.sec??0,Y))-J:z+F3(Q.out,Y);if(J<0)return{ok:!1,error:{code:"negative_start",message:"裁剪后落点为负"}};if(z<1)return{ok:!1,error:{code:"duration_below_one_frame",message:"裁剪后时长不足 1 帧"}};if(X!==null&&X<0)return{ok:!1,error:{code:"negative_src_in",message:"裁剪后源窗入点为负"}};return{ok:!0,view:{stFrame:J,durFrames:z,clipStMs:X}}}function C3(Z,Q,Y){let J=Q.frames!==null?Q.frames:n0(Q.sec??0,Y),z=J-Z.stFrame,X=Z.durFrames-z;if(z<1||X<1)return{ok:!1,error:{code:"split_point_out_of_range",message:"切点须落在元素内部且两段各 ≥1 帧"}};let V={...Z,durFrames:z},W=S9(V,Y).durationMs;return{ok:!0,result:{first:V,second:{stFrame:J,durFrames:X,clipStMs:Z.clipStMs===null?null:Z.clipStMs+W}}}}function _3(Z,Q,Y){for(let z=2;z<=999;z++){let X=`${Z}-${z}`;if(!Q.has(X))return X}let J=`${Z}-${Y()}`;while(Q.has(J))J=`${Z}-${Y()}`;return J}function T3(Z,Q){if(Q.trackLevel===void 0)return Z===Q.contractDefault?"deleted_key":"explicit_value";return Q.trackLevel===Z?"deleted_key":"explicit_value"}function MQ(Z,Q,Y){let J={...Z};if(J.track_st=oZ(Y.trackStMs),J.duration=oZ(Y.durationMs),"track_ed"in Z)J.track_ed=oZ(Y.trackEdMs);if(Q==="clip"&&Y.clipStMs!==null&&Y.clipEdMs!==null){if(J.clip_st=oZ(Y.clipStMs),"clip_ed"in Z)J.clip_ed=oZ(Y.clipEdMs)}return J}function RQ(Z,Q,Y){let J=structuredClone(Z),X=J[x7[Q.kind]][Q.trackArrayIndex];return X.track_timeline[Q.clipArrayIndex]=Y,J}function A3(Z,Q,Y,J){let z=structuredClone(Z);return z[x7[Q.kind]][Q.trackArrayIndex].track_timeline.splice(Y,0,J),z}function E3(Z){return k7(Z)}function h7(Z){let Q=Z.video_rate;if(typeof Q!=="number"||!Number.isFinite(Q)||Q<=0)throw Error(`工程缺少合法的 video_rate(读到 ${JSON.stringify(Q)})——帧对齐无从谈起`);return Q}var y9=["move","trim","split","set"],lM=new Set(["list","help"]);class u7 extends Error{code;constructor(Z,Q){super(Z);this.code=Q}}function ZZ(Z,Q){throw new u7(Q,Z)}var dM=/^[0-9a-f]{64}$/;function v3(Z,Q){let Y=Z.expectedRevision;if(Y===void 0)return Q;if(!dM.test(Y))ZZ("bad_expected_revision",`--expected-revision 需 64 位小写 hex(sha256),实得:${JSON.stringify(Y)}`);return Y}function w3(Z,Q,Y,J,z){try{return u8(Z,Q,Y,"patch")}catch(X){if(X instanceof Y1){if(z.json){let V={...J,applied:!1,revision:X.expectedRevision,conflict:{expected_revision:X.expectedRevision,actual_revision:X.actualRevision}};process.stdout.write(`${JSON.stringify(V,null,2)}
|
|
171
|
-
`)}
|
|
172
|
-
下一步:重新读取工程后重试;agent 可拿回执里的 revision 作 --expected-revision 断言(本次 expected=${X.expectedRevision.slice(0,12)}… actual=${X.actualRevision.slice(0,12)}…)。`)}throw X}}function
|
|
173
|
-
`)}function
|
|
174
|
-
`+
|
|
175
|
-
${
|
|
176
|
-
${
|
|
177
|
-
${R}`)}let{violations:G,preexisting:$}=
|
|
178
|
-
`);
|
|
179
|
-
${
|
|
180
|
-
`);
|
|
181
|
-
${R}`)}let
|
|
182
|
-
`);return}let Y=Z.applied?"已写入":"干跑(未写入)";j.step(`${Y}:${Z.gtrk}(video_rate=${Z.video_rate})`);for(let J of Z.ops){if(J.scope==="project"){j.info(`${J.action} --total → duration=${J.after?.duration}s`);continue}for(let z of J.resolved??[])j.info(`${J.action} @ ${z.track} clip_id=${z.clip_id||'""'} track_st=${z.track_st}s`);if(J.before&&J.after){let z=Object.keys(J.after);j.info(` ${z.map((X)=>`${X}: ${J.before?.[X]} → ${J.after?.[X]}`).join(" ")}`)}if(J.note)j.info(` ${J.note}`)}for(let J of Z.warnings)j.warn(`${J.code}:顶层 duration=${J.top_duration}s 短于全轨末端 ${J.max_track_ed}s(产物与计费会按顶层截断;要改走 patch set --total)`);if(Z.preexisting.length>0){j.info(`ℹ️ 入档既存不变量问题 ${Z.preexisting.length} 条(非本次造成,未阻断):`);for(let J of Z.preexisting.slice(0,5))j.info(` · [${J.code}] ${J.message}`);if(Z.preexisting.length>5)j.info(` · …另 ${Z.preexisting.length-5} 条`)}}function
|
|
183
|
-
——双端编排量公式漂移了(多半是 CLI 与服务端版本错配)。升级 CLI 后重试;本次未执行也未计费。`;case
|
|
184
|
-
——本次未执行也未计费。调高 --arrange-cost-cap 或缩小 plan 规模(减 beat / 减候选 / 减轨数)。`;case
|
|
185
|
-
——服务端不认识本地的计量口径版本,且**不会**回落到默认价目执行(回落即按另一套价静默计费)。升级 CLI。`;case
|
|
186
|
-
——同一幂等键此前对应的是另一份请求。这通常意味着本地请求体在重试之间被改动过。`;case
|
|
187
|
-
——服务端尚未实现该编排档位,且 MUST NOT 静默降级到低档执行。改用已实现的档位。`;case
|
|
188
|
-
——额度或余额不足(前置拒绝,本次任务不扣费)。`;default:return""}}function
|
|
189
|
-
`+"重试用的是逐字节相同的请求体,服务端幂等表保证不会因此二次扣费。")}async function
|
|
161
|
+
`;async function v8(Z=v0()){let Q=await RF(Z);Q.exec(DF);try{let Y=Q.all("PRAGMA table_info(materials)");if(!Y.some((K)=>K.name==="kind"))Q.exec("ALTER TABLE materials ADD COLUMN kind TEXT NOT NULL DEFAULT 'video'");if(!Q.all("PRAGMA table_info(scenes)").some((K)=>K.name==="stable"))Q.exec("ALTER TABLE scenes ADD COLUMN stable INTEGER");let z=Q.all("PRAGMA table_info(scenes)").map((K)=>K.name);for(let[K,G]of[["motion_p50","REAL"],["motion_p90","REAL"],["motion_samples","INTEGER"],["effective_fps","REAL"],["doubled","INTEGER"]])if(!z.includes(K))Q.exec(`ALTER TABLE scenes ADD COLUMN ${K} ${G}`);if(!Q.all("PRAGMA table_info(cuts)").map((K)=>K.name).includes("origin"))Q.exec("ALTER TABLE cuts ADD COLUMN origin TEXT");let W=Q.all("PRAGMA table_info(describes)").map((K)=>K.name);for(let[K,G]of[["subject","TEXT"],["action","TEXT"],["shot_size","TEXT"],["highlight","REAL"],["rubric_hash","TEXT"]])if(!W.includes(K))Q.exec(`ALTER TABLE describes ADD COLUMN ${K} ${G}`);if(!Y.some((K)=>K.name==="cuts_indexed"))Q.exec("ALTER TABLE materials ADD COLUMN cuts_indexed INTEGER");if(!Q.all("PRAGMA table_info(materials)").map((K)=>K.name).includes("decode_lane"))Q.exec("ALTER TABLE materials ADD COLUMN decode_lane TEXT")}catch(Y){throw Q.close(),Error(`索引库列迁移失败(${Y instanceof Error?Y.message:String(Y)})——索引是可随时重建的本机缓存,`+`建议跑 gtrk matrix index --dirs <...> --rebuild 重建(或删除 ${Z} 后重跑索引)`)}return Q.run("INSERT OR IGNORE INTO meta(key, value) VALUES ('schema_version', '1')"),Q}function PF(Z,Q){Z.run("DELETE FROM frames WHERE material_id = ?",[Q]),Z.run("DELETE FROM scenes WHERE material_id = ?",[Q]),Z.run("DELETE FROM cuts WHERE material_id = ?",[Q]),Z.run("DELETE FROM materials WHERE id = ?",[Q])}function fX(Z,Q,Y){let J=Z.get("SELECT id FROM materials WHERE material_id = ?",[Q]);if(!J)return 0;let z=0;return kX(Z,()=>{for(let X of Y){let W=Math.round(X),V=Z.get("SELECT COUNT(*) AS n FROM cuts WHERE material_id = ? AND t_ms = ?",[J.id,W]);if(V&&V.n>0)continue;Z.run("INSERT INTO cuts(material_id, t_ms, origin) VALUES (?,?,'qc_confirmed')",[J.id,W]),z++}}),z}function OF(Z,Q){Z.run("DELETE FROM describes WHERE material_id = ?",[Q])}var hX=new Uint8Array(new Uint32Array([1]).buffer)[0]===1;function LF(Z){if(hX)return new Uint8Array(Z.buffer.slice(Z.byteOffset,Z.byteOffset+Z.byteLength));let Q=new Uint8Array(Z.length*4),Y=new DataView(Q.buffer);for(let J=0;J<Z.length;J++)Y.setFloat32(J*4,Z[J],!0);return Q}function bX(Z){let Q=new Uint8Array(Z);if(hX)return new Float32Array(Q.buffer,0,Q.byteLength/4);let Y=Q.byteLength/4,J=new DataView(Q.buffer),z=new Float32Array(Y);for(let X=0;X<Y;X++)z[X]=J.getFloat32(X*4,!0);return z}function C7(Z){let Q=[],Y;for(let J of Z.split(/\r?\n/)){if(!J.includes("Parsed_metadata"))continue;let z=J.match(/frame:\d+\s.*\bpts_time:([0-9]+(?:\.[0-9]+)?)/);if(z){Y=Number(z[1]);continue}let X=J.match(/lavfi\.scene_score=([0-9]+(?:\.[0-9]+)?)/);if(X&&Y!==void 0)Q.push({ts:Y,score:Number(X[1])}),Y=void 0}return Q}function CF(Z,Q=Q0){return Z.filter((Y)=>Y.score>Q).map((Y)=>Y.ts)}function _F(Z,Q,Y=NF){let J=[0];for(let X of Z)if(X-J[J.length-1]>=Y)J.push(X);if(Q-J[J.length-1]>=Y)J.push(Q);else J[J.length-1]=Q;let z=[];for(let X=0;X<J.length-1;X++)z.push({st:J[X],ed:J[X+1]});return z}function gX(Z,Q){return new Promise((Y,J)=>{let z=HF(Z,Q,{env:process.env}),X="";z.stderr.on("data",(W)=>{X+=W.toString("utf8")}),z.on("error",(W)=>J(W)),z.on("close",(W)=>Y({exitCode:W,stderr:X}))})}async function TF(Z,Q=8000){try{let Y=gX(Z,LX()),J=new Promise((X)=>setTimeout(()=>X(null),Q)),z=await Promise.race([Y,J]);return z!==null&&z.exitCode===0}catch{return!1}}function AF(Z,Q,Y=S0,J){let z=Z.map(()=>[]),X=Z.map((V)=>({st:V.st,ed:V.ed,maxScore:0,stable:!0,motion:{p50:null,p90:null,samples:0,effectiveFps:null,doubled:!1}})),W=0;for(let V of Q){while(W<X.length&&V.ts>=X[W].ed)W++;if(W>=X.length)break;let K=X[W];if(V.ts>K.st){if(V.score>K.maxScore)K.maxScore=V.score;z[W].push(V.score)}}for(let V=0;V<X.length;V++)X[V].stable=X[V].maxScore<Y,X[V].motion=wF(z[V],J);return X}var EF=0.004,IF=0.35,SF=2,vF=12;function wF(Z,Q){if(!Z.length)return{p50:null,p90:null,samples:0,effectiveFps:null,doubled:!1};let Y=0,J=0,z=0,X=[];for(let N of Z)if(N<EF){if(Y++,J++,J>z)z=J}else J=0,X.push(N);let W=Y/Z.length,V=X.length>=vF,K=V&&W>=IF&&z<=SF;if(!V)return{p50:null,p90:null,samples:X.length,effectiveFps:null,doubled:!1};let G=[...X].sort((N,q)=>N-q),$=(N)=>G[Math.min(G.length-1,Math.floor(G.length*N))],H=K&&typeof Q==="number"&&Number.isFinite(Q)&&Q>0?Math.round(Q*(1-W)*10)/10:null;return{p50:$(0.5),p90:$(0.9),samples:X.length,effectiveFps:H,doubled:K}}function yF(Z){let Q=Z.stderr.split(/\r?\n/).filter((Y)=>Y.trim()&&!Y.includes("lavfi.scene_score")&&!Y.includes("pts_time:")).slice(-3).join(" | ").slice(0,400);if(Z.exitCode!==0){let Y=Z.exitCode===null?"null":String(Z.exitCode>2147483647?Z.exitCode-4294967296:Z.exitCode);throw Error(`场景检测 ffmpeg 退出码 ${Y}${Q?`:${Q}`:""}`)}if(Z.frameCount===0)throw Error(`场景检测零帧产出(退出码 0 但一帧 scene score 都没解析到)${Q?`:${Q}`:""}`);if(Z.fps&&Z.fps>0&&Z.durationSec>0){let Y=Z.durationSec*Z.fps,J=Y*jF;if(Z.frameCount<J)throw Error(`场景检测产出残缺:实得 ${Z.frameCount} 帧,按 ${Z.durationSec.toFixed(1)}s × ${Z.fps}fps 应约 `+`${Math.round(Y)} 帧(下限 ${Math.round(J)})${Q?`:${Q}`:""}`)}}async function uX(Z,Q,Y,J=Q0,z=S0,X,W){let{frames:V,lane:K}=await xF(Z,Q,Y,X,W),G=CF(V,J);return{scenes:AF(_F(G,Y),V,z,X),cuts:G,lane:K}}async function xF(Z,Q,Y,J,z){let X=z?.fallback!==!1,W=z?.lane??"cpu_full";for(;;){let{exitCode:V,stderr:K}=await gX(Z,OX({src:Q,lane:W,proxyWidth:z?.proxyWidth,proxyScaler:z?.proxyScaler})),G=C7(K);try{return yF({exitCode:V,stderr:K,frameCount:G.length,durationSec:Y,fps:J}),{frames:G,lane:W}}catch($){let H=X?_X(W):null;if(!H)throw $;z?.onDowngrade?.(W,H,$ instanceof Error?$.message:String($)),W=H}}}async function mX(Z,Q,Y,J=Q0,z=S0){return(await uX(Z,Q,Y,J,z)).scenes}function L7(Z){let Q=[];for(let Y=0;Y<Z.length;Y++){let{st:J,ed:z,stable:X}=Z[Y],W=z-J;if(W<=4||X===!0)Q.push({sceneIdx:Y,ts:J+W/2});else{let V=J+1;while(V<z-0.5)Q.push({sceneIdx:Y,ts:V}),V+=BF}}return Q}async function Z0(Z,Q,Y,J){try{await M8(Z,["-y","-v","error","-ss",Y.toFixed(3),"-i",Q,"-vframes","1","-vf",`scale='if(gte(iw,ih),min(${SX},iw),-2)':'if(lt(iw,ih),min(${SX},ih),-2)'`,"-q:v","3",J])}catch{return!1}return WF(J)}function kF(Z,Q){let Y=[],J=(z,X)=>{if(X>4)return;let W;try{W=VF(z,{withFileTypes:!0})}catch{return}for(let V of W){if(V.name.startsWith("."))continue;let K=jQ(z,V.name);if(V.isDirectory())J(K,X+1);else if(V.isFile()&&Q(V.name))Y.push(P7(K))}};for(let z of Z)J(P7(z),0);return Y.sort()}function fF(Z){return kF(Z,(Q)=>yX.test(Q)||xX.test(Q))}async function hF(Z,Q,Y,J){let z=FQ(Z)??"video",X=await J1(Z);if(z==="image"){let H=0,N=0;try{let q=hZ(Z,J);H=q.width,N=q.height}catch{}return{materialId:X,kind:z,durationMs:0,width:H,height:N,fps:0,scenes:[{st_ms:0,ed_ms:0}],framePlan:[{sceneIdx:0,ts_ms:0}]}}let W=hZ(Z,J);if(!(W.duration>0))throw Error("探测不到有效时长(疑似损坏/非视频文件)");let V=Q.lane??"cpu_full";if(V==="gpu"){let H=CX({codecName:W.codecName,pixFmt:W.pixFmt},{cores:UF().length});if(!H.ok)V="cpu_proxy",Q.onDowngrade?.("gpu","cpu_proxy",H.reason)}let K=await uX(Y.ffmpeg,Z,W.duration,Q.sceneThreshold,Q.stabilityThreshold,W.fps,{lane:V,fallback:Q.fallback,proxyWidth:Q.proxyWidth,proxyScaler:Q.proxyScaler,onDowngrade:Q.onDowngrade}),G=K.scenes,$=L7(G);return{materialId:X,kind:z,durationMs:Math.round(W.duration*1000),width:W.width,height:W.height,fps:W.fps,scenes:G.map((H)=>({st_ms:Math.round(H.st*1000),ed_ms:Math.round(H.ed*1000),stable:H.stable,motion:H.motion})),framePlan:$.map((H)=>({sceneIdx:H.sceneIdx,ts_ms:Math.round(H.ts*1000)})),cutsMs:K.cuts.map((H)=>Math.round(H*1000)),decodeLane:K.lane}}async function bF(Z,Q,Y,J,z){let X=jQ(F0(),`broll-index-${process.pid}`);vX(X,{recursive:!0});let W=[];if(Q.kind==="image")try{let V=jQ(X,`${O7(Z,IX(Z))}_0.jpg`);if(!await Z0(Y.ffmpeg,Z,0,V))throw Error("图片 512px 缩放抽取失败(格式可能不受本机 ffmpeg 支持)");let[K]=await J([{image:AX(V).toString("base64")}],z);return[{sceneIdx:0,ts_ms:0,vec:K}]}finally{EX(X,{recursive:!0,force:!0})}try{let V=[],K=async()=>{if(!V.length)return;let G=V.map((H)=>({image:AX(H.jpg).toString("base64")})),$=await J(G,z);V.forEach((H,N)=>W.push({sceneIdx:H.sceneIdx,ts_ms:H.ts_ms,vec:$[N]}));for(let H of V)try{GF(H.jpg)}catch{}V=[]};for(let{sceneIdx:G,ts_ms:$}of Q.framePlan){let H=jQ(X,`${O7(Z,IX(Z))}_${$}.jpg`);if(!await Z0(Y.ffmpeg,Z,$/1000,H))continue;if(V.push({sceneIdx:G,ts_ms:$,jpg:H}),V.length>=e6)await K()}await K()}finally{EX(X,{recursive:!0,force:!0})}return W}function gF(Z){let Q=Z;return Q?.code===BQ||Q?.rejected===!0}async function cX(Z){let Q=Date.now(),Y=Z.dbPath??v0(),J=Z.sceneThreshold??Q0,z=Z.stabilityThreshold??S0,X=(Z.listFiles??fF)(Z.dirs),W=await v8(Y),V={total:X.length,indexed:0,skipped:0,rebuilt:0,failed:0},K={video:{total:0,indexed:0},image:{total:0,indexed:0}},G={stableScenes:0,unstableScenes:0,framesSaved:0},$=0,H=0,N=Z.planMaterial&&Z.embedFrames?null:AZ(Z.ffmpegPath),q=Z.decodePath??"full",U={baseLane:q==="gpu"?"gpu":q==="cpu"?"cpu_proxy":q==="auto"?"gpu":"cpu_full",fallback:q==="auto",probed:null,probeMs:void 0,tripped:!1,gpuFailStreak:0,gpuStatus:q==="gpu"||q==="auto"?"off_probe":"off_flag",lanes:{},degradeLog:[]},F=Z.probeGpuLane?()=>Z.probeGpuLane():(T)=>TF(T),M=Z.planMaterial??((T,_)=>hF(T,_,N,Z.ffmpegPath)),R=Z.embedFrames??((T,_,P)=>bF(T,_,N,Z.embed,P)),D,O,C=0;try{let T=[];for(let P of X){let E=O7(P);K[FQ(P)??"video"].total++;let I;try{I=KF(P)}catch{V.failed++,Z.onProgress?.(`[${E}] 读不到文件(跳过)`);continue}let y=I.size,h=Math.round(I.mtimeMs),v=W.get("SELECT * FROM materials WHERE path = ?",[P]);if(v&&!Z.rebuild&&v.size===y&&v.mtime_ms===h){V.skipped++,Z.onProgress?.(`[${E}] 指纹未变,跳过`);continue}try{let S=U.baseLane;if(S==="gpu")if(U.tripped)S="cpu_proxy";else{if(U.probed===null){let a=Date.now();if(U.probed=await F(N.ffmpeg),U.probeMs=Date.now()-a,!U.probed){if(U.gpuStatus="off_probe",!U.fallback)throw Error("--decode-path gpu:本机未探到可用的 CUDA 解码设备(显式指定车道时不降级)");Z.onProgress?.("GPU 硬解不可用(本机未探到可用 CUDA 解码设备),本轮走 CPU 解码——索引结果不受影响")}}if(!U.probed)S="cpu_proxy"}let k=U.degradeLog.length,c=await M(P,{sceneThreshold:J,stabilityThreshold:z,lane:S,fallback:U.fallback,proxyWidth:Z.proxyWidth,proxyScaler:Z.proxyScaler,onDowngrade:(a,u,l)=>{if(a==="gpu")U.gpuFailStreak++;U.degradeLog.push({name:E,reason:l})}});if(k===U.degradeLog.length)U.gpuFailStreak=0;if(U.gpuFailStreak>=D7&&!U.tripped)U.tripped=!0,U.gpuStatus="tripped",Z.onProgress?.(`GPU 硬解连续 ${D7} 次失败,本轮余下素材直接走 CPU 解码`);if(c.decodeLane){if(U.lanes[c.decodeLane]=(U.lanes[c.decodeLane]??0)+1,c.decodeLane==="gpu")U.gpuStatus=U.tripped?"tripped":"on"}T.push({path:P,name:E,size:y,mtimeMs:h,prev:v,planned:c})}catch(S){V.failed++,Z.onProgress?.(`[${E}] 探测/场景检测失败:${S instanceof Error?S.message:String(S)}(跳过)`)}}if(C=T.reduce((P,E)=>P+E.planned.framePlan.length,0),T.length)Z.onProgress?.(`抽帧计划就绪:${T.length} 个素材待索引 · 计划 ${C} 帧`);if(Z.session&&C>0)D=await Z.session.open(C),O={plannedUnits:C,preDeductedCredits:D.preDeductedCredits};for(let P of T){let E;try{E=await R(P.path,P.planned,D?.sessionToken)}catch(h){if(gF(h))throw h;V.failed++,Z.onProgress?.(`[${P.name}] 处理失败:${h instanceof Error?h.message:String(h)}(跳过)`);continue}let I=P.planned.kind??FQ(P.path)??"video";if(kX(W,()=>{if(P.prev){if(PF(W,P.prev.id),P.prev.size!==P.size||P.prev.mtime_ms!==P.mtimeMs)OF(W,P.prev.material_id)}W.run("INSERT INTO materials(material_id, path, kind, size, mtime_ms, duration_ms, width, height, fps, indexed_at, cuts_indexed, decode_lane) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",[P.planned.materialId,P.path,I,P.size,P.mtimeMs,P.planned.durationMs,I==="image"?P.planned.width>0?P.planned.width:null:P.planned.width,I==="image"?P.planned.height>0?P.planned.height:null:P.planned.height,I==="image"?null:P.planned.fps,new Date().toISOString(),P.planned.cutsMs!==void 0?1:null,P.planned.decodeLane??null]);let h=Number(W.get("SELECT last_insert_rowid() AS id").id);if(P.planned.cutsMs!==void 0)for(let S of P.planned.cutsMs)W.run("INSERT OR IGNORE INTO cuts(material_id, t_ms, origin) VALUES (?,?,'detected')",[h,S]);let v=[];for(let S of P.planned.scenes)W.run("INSERT INTO scenes(material_id, st_ms, ed_ms, stable, motion_p50, motion_p90, motion_samples, effective_fps, doubled) VALUES (?,?,?,?,?,?,?,?,?)",[h,S.st_ms,S.ed_ms,S.stable===void 0?null:S.stable?1:0,S.motion?.p50??null,S.motion?.p90??null,S.motion?.samples??null,S.motion?.effectiveFps??null,S.motion?S.motion.doubled?1:0:null]),v.push(Number(W.get("SELECT last_insert_rowid() AS id").id));for(let S of E){let k=v[S.sceneIdx];if(k===void 0)continue;W.run("INSERT INTO frames(scene_id, material_id, ts_ms, vec) VALUES (?,?,?,?)",[k,h,S.ts_ms,LF(S.vec)])}}),P.prev)V.rebuilt++;V.indexed++,K[I].indexed++,$+=P.planned.scenes.length,H+=E.length;let y="";if(I==="video"){let h=P.planned.scenes.map((S)=>({st:S.st_ms/1000,ed:S.ed_ms/1000,stable:S.stable}));for(let S of h)S.stable===!0?G.stableScenes++:G.unstableScenes++;let v=L7(h.map(({st:S,ed:k})=>({st:S,ed:k}))).length-L7(h).length;if(G.framesSaved+=v,v>0)y=` · stable 收敛省 ${v} 帧`}Z.onProgress?.(I==="image"?`[${P.name}] 图片 · 单帧向量${P.prev?"(指纹变化,已级联重建)":""}`:`[${P.name}] 时长 ${(P.planned.durationMs/1000).toFixed(1)}s · 场景 ${P.planned.scenes.length} · 帧 ${E.length}${y}${P.prev?"(指纹变化,已级联重建)":""}`)}let _=TX(U.degradeLog);if(_)Z.onProgress?.(_)}finally{if(W.close(),D&&Z.session)try{let T=await Z.session.close(D.sessionToken);if(O)O.usedUnits=T.usedUnits,O.settledCredits=T.settledCredits,O.refundedCredits=T.refundedCredits;Z.onProgress?.(`计量会话已结算:实际用量 ${T.usedUnits} 帧 → 实结 ${T.settledCredits} 积分 · 退还 ${T.refundedCredits} 积分(预扣 ${D.preDeductedCredits})`)}catch(T){if(O)O.reconcilePending=!0;Z.onProgress?.(`计量会话结算调用失败(${T instanceof Error?T.message:String(T)})——服务端 15 分钟内自动对账兜底结算,已用量不会丢`)}}return{dbPath:Y,dirs:Z.dirs.map((T)=>P7(T)),materials:V,kinds:K,scenes:$,frames:H,plannedFrames:C,decode:{requested:q,gpu:U.gpuStatus,lanes:U.lanes,degraded:U.degradeLog.length,probeMs:U.probeMs},stability:G,...O?{billing:O}:{},elapsedMs:Date.now()-Q}}var _7={sceneScore:0.3,flashMaxSec:1,cutMatchTolSec:0.12,blackMinDurSec:0.1,blackPicTh:0.98,blackPixTh:0.1,freezeNoise:0.003,freezeMinDurSec:2,silenceNoiseDb:-50,silenceMinDurSec:2,truePeakDbtp:-1,avDurationDiffSec:0.1},UZ=(Z)=>Math.round(Z*1000)/1000;function lX(Z,Q){return new Promise((Y,J)=>{let z=uF(Z,Q,{env:process.env}),X="";z.stderr.on("data",(W)=>{X+=W.toString("utf8")}),z.on("error",(W)=>J(W)),z.on("close",()=>Y(X))})}function mF(Z){let Q=[];for(let Y of Z.matchAll(/black_start:([0-9.]+)\s+black_end:([0-9.]+)/g))Q.push({st:Number(Y[1]),ed:Number(Y[2])});return Q}function cF(Z){let Q=[],Y;for(let J of Z.split(/\r?\n/)){let z=J.match(/freeze_start:\s*([0-9.]+)/);if(z){Y=Number(z[1]);continue}let X=J.match(/freeze_end:\s*([0-9.]+)/);if(X&&Y!==void 0)Q.push({st:Y,ed:Number(X[1])}),Y=void 0}return Q}function lF(Z){let Q=[],Y;for(let J of Z.split(/\r?\n/)){let z=J.match(/silence_start:\s*(-?[0-9.]+)/);if(z){Y=Math.max(0,Number(z[1]));continue}let X=J.match(/silence_end:\s*([0-9.]+)/);if(X&&Y!==void 0)Q.push({st:Y,ed:Number(X[1])}),Y=void 0}return Q}function dF(Z){let Q=0;for(let J of Z.matchAll(/Number of clipped samples:\s*(\d+)/g))Q+=Number(J[1]);let Y=null;for(let J of Z.matchAll(/True peak:\s*(-?[0-9.]+|-inf)/g)){let z=J[1]==="-inf"?Number.NEGATIVE_INFINITY:Number(J[1]);if(Y===null||z>Y)Y=z}return{clipCount:Q,truePeakDbtp:Y}}function nF(Z,Q=_7.flashMaxSec){let Y=[];for(let J=1;J<Z.length;J++){let z=Z[J]-Z[J-1];if(z>0&&z<=Q)Y.push({st:UZ(Z[J-1]),ed:UZ(Z[J]),sec:UZ(z)})}return Y}function pF(Z,Q){let Y=(J)=>Q!==null&&Q.has(UZ(J));return nF(Z).map((J)=>{if(Q===null)return{type:"flash",severity:"warn",st:J.st,ed:J.ed,evidence:{shot_sec:J.sec,note:"镜头过短;未开工程感知(--gtrk),来源不可判、未分级"}};let z=Y(J.st)||Y(J.ed);return{type:"flash",severity:z?"error":"info",st:J.st,ed:J.ed,evidence:{shot_sec:J.sec,endpoints:`${Y(J.st)?"拼接切":"段内跳切"}→${Y(J.ed)?"拼接切":"段内跳切"}`,note:z?"镜头过短且至少一端是 clip 拼接处:颗粒窗口跨过源切点造成的节奏断裂,可重铺修复":"镜头过短但两端都在同一颗粒内部:源素材自身的快剪节奏,非缺陷"}}})}function iF(Z,Q,Y={}){let J=Y.tolSec??_7.cutMatchTolSec,z=Y.maxDriftSec??1,X=[],W=[],V=new Set,K=0;for(let $ of Q){while(K<Z.length&&Z[K]<$-J)K++;if(K<Z.length&&Z[K]-$<=z)X.push({boundary:UZ($),cut:UZ(Z[K]),drift:UZ(Z[K]-$)}),V.add(K),K++;else W.push(UZ($))}let G=Z.filter(($,H)=>!V.has(H)).map(UZ);return{matched:X,intra:G,missing:W}}function oF(Z){let Q=Z?.struct_meta?.broll?.beats;if(!Array.isArray(Q))return[];let Y=[];for(let J of Q)for(let z of J.laid??[])(z.slots??[]).forEach((X,W)=>{let V=(G)=>typeof G==="number"?G:Number.NaN,K=V(X.track_st);if(!Number.isFinite(K))return;Y.push({beat:String(J.beat??""),slotIndex:W,clipId:String(X.clip_id??""),trackSt:K,trackEd:V(X.track_ed),clipSt:V(X.clip_st),clipEd:V(X.clip_ed)})});return Y.sort((J,z)=>J.trackSt-z.trackSt)}function rF(Z,Q,Y=0.1){let J=Z.filter((z)=>Q>=z.trackSt-Y&&Q<z.trackEd+Y);return J.length===1?J[0]:null}function aF(Z,Q,Y=0.1){let J=rF(Z,Q,Y);if(!J)return null;return{slot:J,src:UZ(J.clipSt+(Q-J.trackSt))}}function sF(Z){let Q=Z,Y=[...Q.video_track??[]].map((W,V)=>({key:typeof W.track_index==="number"?W.track_index:V,t:W})).sort((W,V)=>W.key-V.key);if(!Y.length)return[];let J=Q.struct_meta?.broll?.black_track??null;return[...((typeof J==="number"?Y.filter((W)=>W.key!==J):Y)[0]??Y[0]).t.track_timeline??[]].sort((W,V)=>Number(W.track_st)-Number(V.track_st)).map((W)=>Number(W.track_st)).filter((W)=>Number.isFinite(W)).slice(1)}function tF(Z,Q,Y){let J=Z?.struct_meta?.broll?.holes;if(!Array.isArray(J))return!1;return J.some((z)=>Y>=Number(z.track_st)-0.25&&Q<=Number(z.track_ed)+0.25)}async function T7(Z,Q={}){let Y=AZ(Q.ffmpegPath),J=_7,z=[],W=N9(Y.ffprobe,["-v","error","-show_entries","stream=codec_type,duration,nb_frames,r_frame_rate,avg_frame_rate","-of","json",Z]).streams??[],V=W.find((C)=>C.codec_type==="video"),K=W.find((C)=>C.codec_type==="audio"),G=V?.duration!=null?Number(V.duration):null,$=K?.duration!=null?Number(K.duration):null;if(G!==null&&$!==null){let C=G-$;if(Math.abs(C)>J.avDurationDiffSec)z.push({type:"av_drift",severity:"error",st:UZ(Math.min(G,$)),ed:UZ(Math.max(G,$)),evidence:{video_duration:UZ(G),audio_duration:UZ($),diff_sec:UZ(C),note:"画面与音频总长不一致:画面对口播渐进失步(成片切点相对工程时间线累积漂移)"}})}let H=(C)=>{if(!C)return null;let[T,_]=C.split("/").map(Number);return _?T/_:T??null},N=H(V?.r_frame_rate),q=H(V?.avg_frame_rate);if(N&&q&&Math.abs(N-q)/N>0.01)z.push({type:"vfr",severity:"error",st:0,ed:UZ(G??0),evidence:{r_frame_rate:UZ(N),avg_frame_rate:UZ(q),note:"成片非 CFR(渲染产物应恒为固定帧率)"}});Q.onProgress?.("视频趟:逐帧跳变 + 黑帧 + 冻结检测…");let U=["select='gte(scene,0)'","metadata=print",`blackdetect=d=${J.blackMinDurSec}:pic_th=${J.blackPicTh}:pix_th=${J.blackPixTh}`,`freezedetect=n=${J.freezeNoise}:d=${J.freezeMinDurSec}`].join(","),F=await lX(Y.ffmpeg,["-i",Z,"-vf",U,"-f","null","-"]),R=C7(F).filter((C)=>C.score>J.sceneScore).map((C)=>C.ts),D=null;if(Q.gtrk){let C=sF(Q.gtrk),{matched:T,intra:_}=iF(R,C),P=T.map((I)=>I.drift);D=new Set(T.map((I)=>I.cut));let E=oF(Q.gtrk);for(let I of _){let y=T.filter((S)=>S.cut<=I),h=y.length?y[y.length-1].cut:null,v=aF(E,I);z.push({type:"intra_cut",severity:"warn",st:I,ed:I,evidence:{note:"跳变不落在任何 clip 拼接边界上:颗粒窗口内部越过了源素材的镜头切点",clip_started_at:h,...h!==null?{into_clip_sec:UZ(I-h)}:{},...v?{beat:v.slot.beat,slot_index:v.slot.slotIndex,clip_id:v.slot.clipId,source_window:[v.slot.clipSt,v.slot.clipEd],source_time:v.src}:{coord_note:"跳变落在槽位边界容差内或工程无槽位登记,无法唯一定位"}}})}if(P.length)Q.onProgress?.(`工程对表:${T.length}/${C.length} 个剪切点对齐(漂移 ${UZ(P[0])}s→${UZ(P[P.length-1])}s)· 段内跳切 ${_.length}`)}z.push(...pF(R,D));for(let C of mF(F)){let T=Q.gtrk?tF(Q.gtrk,C.st,C.ed):!1;z.push({type:"black",severity:T?"info":"warn",st:UZ(C.st),ed:UZ(C.ed),evidence:{sec:UZ(C.ed-C.st),...T?{known_black_bed_hole:!0}:{}}})}for(let C of cF(F))z.push({type:"freeze",severity:"warn",st:UZ(C.st),ed:UZ(C.ed),evidence:{sec:UZ(C.ed-C.st)}});if(K){Q.onProgress?.("音频趟:静音 + 削波 + true peak 检测…");let C=[`silencedetect=n=${J.silenceNoiseDb}dB:d=${J.silenceMinDurSec}`,"astats=metadata=1","ebur128=peak=true"].join(","),T=await lX(Y.ffmpeg,["-i",Z,"-af",C,"-f","null","-"]);for(let I of lF(T))z.push({type:"silence",severity:"warn",st:UZ(I.st),ed:UZ(I.ed),evidence:{sec:UZ(I.ed-I.st)}});let{clipCount:_,truePeakDbtp:P}=dF(T),E=P!==null&&P>J.truePeakDbtp;if(_>0||E)z.push({type:"clip",severity:"error",st:0,ed:UZ($??0),evidence:{clipped_samples:_,true_peak_dbtp:P,note:"音频触顶(削波样本 / true peak 越限),成片过响易爆音"}})}z.sort((C,T)=>C.st-T.st||C.ed-T.ed);let O={error:0,warn:0,info:0};for(let C of z)O[C.severity]++;return{qc_version:"v1",input:Z,generated_at:new Date().toISOString(),summary:O,items:z}}function dX(Z,Q){if(Q==="never")return!1;if(Q==="warn")return Z.summary.error>0||Z.summary.warn>0;return Z.summary.error>0}function MQ(Z){let Q=Math.max(0,Z),Y=Math.floor(Q/3600),J=Math.floor(Q%3600/60),z=Q%60;return`${String(Y).padStart(2,"0")}:${String(J).padStart(2,"0")}:${z.toFixed(3).padStart(6,"0")}`}import{copyFileSync as NM,existsSync as V1,mkdirSync as tX,readFileSync as eX,rmSync as Z3,writeFileSync as Q3}from"node:fs";import{tmpdir as BM}from"node:os";import{basename as jM,join as D8}from"node:path";import{mkdirSync as eF,readFileSync as ZM,rmSync as QM}from"node:fs";import{join as YM}from"node:path";var JM="describe_endpoint_unreachable",X1=1,A7=32,zM=20,XM=120000,nX=3,WM=5000,VM=1800000,KM=1000;class I9 extends Error{code=JM;constructor(Z){super(Z);this.name="DescribeError"}}class W1 extends Error{code;rejected=!0;constructor(Z,Q){super(`素材理解端点拒绝了请求(code=${Z}):${Q}`);this.code=Z;this.name="DescribeRejectedError"}}function RQ(Z){let Q=process.env.GITRUCK_DESCRIBE_URL?.trim();if(Q)return Q;let Y=TZ().describeUrl?.trim();if(Y)return Y;return`${Z.replace(/\/+$/,"")}/task/cli/material_describe`}function pX(Z,Q){if(Z===429||Z>=500)return null;try{let Y=JSON.parse(Q);if(typeof Y.code==="number"&&Y.code!==200)return new W1(Y.code,typeof Y.msg==="string"&&Y.msg?Y.msg:`HTTP ${Z}`)}catch{}return null}function GM(Z){let Q=Z??{},Y=Array.isArray(Q.tags)?Q.tags.filter((V)=>typeof V==="string"):[],J={};if(Q.usable_flags&&typeof Q.usable_flags==="object"&&!Array.isArray(Q.usable_flags))for(let[V,K]of Object.entries(Q.usable_flags))J[V]=K===!0;let z=(V)=>typeof V==="number"&&Number.isFinite(V)?Math.min(100,Math.max(0,V)):null,X={desc:typeof Q.desc==="string"?Q.desc:"",tags:Y,mark:typeof Q.mark==="number"&&Number.isFinite(Q.mark)?Q.mark:0,usable_flags:J,subject:typeof Q.subject==="string"?Q.subject:"",action:typeof Q.action==="string"?Q.action:"",shot_size:typeof Q.shot_size==="string"&&Q.shot_size?Q.shot_size:null,highlight:z(Q.highlight)},W=z(Q.claim_aligned);if(W!==null)X.claim_aligned=W,X.claim_verdict=Q.claim_verdict==="match"||Q.claim_verdict==="mismatch"?Q.claim_verdict:"partial",X.claim_reason=typeof Q.claim_reason==="string"?Q.claim_reason:"";return X}function iX(Z){return{accept:"application/json",Authorization:Z.apiKey}}function $M(Z,Q){let Y=Z?.data;if(Y&&typeof Y==="object"&&!Array.isArray(Y))Y=Y.data;if(!Array.isArray(Y))throw new I9("任务完成但 output_result 缺 data 数组(非 material_describe 契约响应)");if(Y.length!==Q)throw new I9(`任务完成但结果条数 ${Y.length} 与输入 ${Q} 不符`);return(Y.every((z)=>typeof z?.index==="number")?[...Y].sort((z,X)=>z.index-X.index):Y).map(GM)}async function HM(Z,Q,Y,J){let z={input:Q.map((G)=>({image:G}))};if(J?.highlightRubric?.trim())z.highlight_rubric=J.highlightRubric.trim();if(J?.claims?.some((G)=>G!==null&&G!==void 0&&G.trim()!==""))z.claims=J.claims.map((G)=>G&&G.trim()?G.trim():null);let X=await Y.fetchFn(Z.url,{method:"POST",headers:{...iX(Z),"Content-Type":"application/json"},body:JSON.stringify(z),signal:AbortSignal.timeout(Y.timeoutMs)});if(!X.ok){let G=await X.text().catch(()=>""),$=pX(X.status,G);if($)throw $;throw Error(`HTTP ${X.status}:${G.slice(0,200)}`)}let W=await X.json();if(typeof W.code==="number"&&W.code!==200)throw new W1(W.code,typeof W.msg==="string"?W.msg:`code=${W.code}`);let K=(W.data&&typeof W.data==="object"&&!Array.isArray(W.data)?W.data:W).task_id;if(typeof K!=="string"||!K)throw Error("提交响应缺 task_id(非 material_describe 异步任务契约响应)");return K}async function qM(Z,Q,Y,J){let z=`${Z.url.replace(/\/+$/,"")}/${Q}`,X=J.now();for(;;){if(J.now()-X>J.pollTimeoutMs)throw new I9(`素材理解任务轮询超时(超过 ${Math.round(J.pollTimeoutMs/60000)} 分钟,task_id=${Q})。`+"任务可能仍在云端执行,可稍后重跑查询——未落缓存的帧会重新提交,已完成帧走缓存零重复计费");await J.sleep(J.pollIntervalMs);let W;try{let G=await J.fetchFn(z,{headers:iX(Z),signal:AbortSignal.timeout(J.timeoutMs)});if(!G.ok){let $=await G.text().catch(()=>""),H=pX(G.status,$);if(H)throw H;continue}W=await G.json()}catch(G){if(G?.rejected===!0)throw G;continue}if(typeof W.code==="number"&&W.code!==200)throw new W1(W.code,typeof W.msg==="string"&&W.msg?W.msg:`code=${W.code}`);let V=W.data&&typeof W.data==="object"&&!Array.isArray(W.data)?W.data:W,K=String(V.status??"");if(K==="completed")return $M(V.output_result,Y);if(K==="failed"||K==="cancelled"){let G=V.output_result,$=G&&typeof G.error==="string"&&G.error?`:${G.error}`:"";throw new I9(K==="failed"?`素材理解任务失败(task_id=${Q})${$}——预扣积分已由服务端自动退款`:`素材理解任务已取消(task_id=${Q})${$}`)}}}async function S9(Z,Q,Y={},J){if(Q.length===0)return[];q8();let z=Y.fetchFn??fetch,X=Y.sleep??(($)=>new Promise((H)=>setTimeout(H,$))),W=Y.backoffBaseMs??KM,V=Y.timeoutMs??XM,K={fetchFn:z,sleep:X,timeoutMs:V,pollIntervalMs:Y.pollIntervalMs??WM,pollTimeoutMs:Y.pollTimeoutMs??VM,now:Y.now??Date.now},G=[];for(let $=0;$<Q.length;$+=A7){let H=Q.slice($,$+A7),N=J?{...J,claims:J.claims?.slice($,$+A7)}:void 0,q,U="";for(let F=0;F<=nX;F++){if(F>0)await X(W*2**(F-1));try{q=await HM(Z,H,{fetchFn:z,timeoutMs:V},N);break}catch(M){if(M?.rejected===!0)throw M;U=M instanceof Error?M.message:String(M)}}if(q===void 0)throw new I9(`素材理解端点不可达或响应异常(${Z.url}):${U}——已指数退避重试 ${nX} 次。`+"请确认同合云 material_describe API 已上线、~/.gitruck 配置 describeUrl / 环境变量 GITRUCK_DESCRIBE_URL 指向正确");G.push(...await qM(Z,q,H.length,K))}return G}function UM(Z,Q,Y){let J=Z.get("SELECT desc_text, tags_json, mark, flags_json, subject, action, shot_size, highlight FROM describes WHERE material_id = ? AND ts_ms = ?",[Q,Y]);if(!J)return;try{return{desc:J.desc_text,tags:JSON.parse(J.tags_json),mark:J.mark??0,usable_flags:JSON.parse(J.flags_json),subject:J.subject??"",action:J.action??"",shot_size:J.shot_size??null,highlight:J.highlight??null}}catch{return}}var oX=15000;function rX(Z,Q,Y){let J=Z.get("SELECT mark, ts_ms FROM describes WHERE material_id = ? ORDER BY ABS(ts_ms - ?) ASC LIMIT 1",[Q,Y]);if(!J)return;if(Math.abs(J.ts_ms-Y)>oX)return;return J.mark??0}function E7(Z,Q,Y){let J=Z.get("SELECT highlight, ts_ms FROM describes WHERE material_id = ? AND highlight IS NOT NULL ORDER BY ABS(ts_ms - ?) ASC LIMIT 1",[Q,Y]);if(!J)return;if(Math.abs(J.ts_ms-Y)>oX)return;return J.highlight??void 0}function I7(Z,Q,Y,J,z){Z.run("INSERT OR REPLACE INTO describes(material_id, ts_ms, desc_text, tags_json, mark, flags_json, subject, action, shot_size, highlight, rubric_hash, created_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",[Q,Y,J.desc,JSON.stringify(J.tags),J.mark,JSON.stringify(J.usable_flags),J.subject||null,J.action||null,J.shot_size,J.highlight,z??null,new Date().toISOString()])}function aX(Z){return{desc:Z.desc,tags:Z.tags,mark:Z.mark,usable_flags:Z.usable_flags,...Z.subject?{subject:Z.subject}:{},...Z.action?{action:Z.action}:{},...Z.shot_size?{shot_size:Z.shot_size}:{},...Z.highlight!==null&&Z.highlight!==void 0?{highlight:Z.highlight}:{}}}var z1=(Z)=>`${Z.materialId}@${Z.tsMs}`;async function sX(Z,Q){let Y=Q.onLog??(()=>{}),J=new Map,z=[];for(let H of Z){let N=z1(H);if(J.has(N))continue;let q=UM(Q.db,H.materialId,H.tsMs);if(q)J.set(N,q);else J.set(N,null),z.push(H)}let X=J.size-z.length,W=z.length*X1,V;if(z.length>zM){V=await Q.probeExempt();let H=`本次将实际调用素材理解 ${z.length} 张(另 ${X} 张缓存命中零计费),`+`预估 ${W} 积分(${X1} 积分/张,异步任务计费:提交预扣→完成结算,失败自动退款)`;if(V)Y(`${H}——同合云内部成员(gc_member_type=internal)计费豁免,免确认继续`);else if(Q.yes)Y(`${H}——已按 --yes 跳过确认`);else if(Y(H),!await Q.confirm(`确认继续理解 ${z.length} 张(约 ${W} 积分)?`))return{ok:!1,declined:!0,described:X,cached:X,called:0,failed:0,estimatedCredits:W,...V!==void 0?{exempt:V}:{},results:Z.map((q)=>J.get(z1(q))??null)}}let K=0,G=0;if(z.length){eF(Q.frameDir,{recursive:!0});let H=Q.readFileBase64??((N)=>ZM(N).toString("base64"));try{let N=[];for(let q of z)try{if(q.source.kind==="direct")N.push({item:q,b64:H(q.source.path)});else{let U=YM(Q.frameDir,`${q.materialId}_${q.tsMs}.jpg`);if(!await Q.extractFrame(q.source.src,q.source.tsSec,U))throw Error("抽帧失败(源不可读或 ffmpeg 不支持该格式)");N.push({item:q,b64:H(U)})}}catch(U){K++,Y(`[${q.materialId} @${(q.tsMs/1000).toFixed(1)}s] 取帧失败:${U instanceof Error?U.message:String(U)}(跳过)`)}if(N.length){let q=await Q.describeBatch(N.map((U)=>U.b64));G=N.length,N.forEach((U,F)=>{let M=q[F];I7(Q.db,U.item.materialId,U.item.tsMs,M),J.set(z1(U.item),M)})}}finally{QM(Q.frameDir,{recursive:!0,force:!0})}}let $=Z.map((H)=>J.get(z1(H))??null);return{ok:!0,described:X+G,cached:X,called:G,failed:K,estimatedCredits:W,...V!==void 0?{exempt:V}:{},results:$}}var v9=(Z)=>typeof Z==="number"?Z:Number.parseFloat(Z);function FM(Z){let Q=Z?.beats;if(!Array.isArray(Q))return[];let Y=[];for(let J of Q){let z=J;if(Array.isArray(z.queries)&&z.queries.some((X)=>typeof X?.query==="string"&&X.query.includes("引用段"))&&typeof z.track_st==="number"&&typeof z.track_ed==="number")Y.push([z.track_st,z.track_ed])}return Y}function MM(Z){let Q=[...Z.clips].sort((Y,J)=>v9(Y.track_st)-v9(J.track_st));return Z.utterances.map((Y)=>{let J=(Y.st+Y.ed)/2,z={id:Y.id,sentence:Y.text,track_mid:Math.round(J*1000)/1000,clip_id:null,source_path:null,source_sec:null};if(/^([^)]*原声)/.test(Y.text.trim())||Z.quoteSpans.some(([$,H])=>Y.st>=$-0.05&&Y.ed<=H+0.05))return{...z,skipped:"quote"};let W=Z.leadIds?.has(Y.id)===!1?"follow":"lead",V=Q.find(($)=>v9($.track_st)<=J&&J<v9($.track_ed));if(!V)return{...z,role:W,skipped:"no_clip"};let K=v9(V.clip_st)+(J-v9(V.track_st)),G=V.material?Z.materials[V.material]??null:null;if(!G)return{...z,role:W,clip_id:V.clip_id??null,skipped:"no_material_path"};return{...z,role:W,clip_id:V.clip_id??null,source_path:G,source_sec:Math.round(K*1000)/1000}})}function Y3(Z){let Q=Z.filter((J)=>J.verdict);if(Q.length===0)return null;let Y=Q.reduce((J,z)=>J+(z.verdict==="match"?1:z.verdict==="partial"?0.5:0),0);return Math.round(Y/Q.length*1000)/10}async function J3(Z,Q){let Y=Q.onLog??(()=>{}),J=(I)=>JSON.parse(eX(I,"utf-8")),z=D8(Z,"gtrk","project.gtrk"),X=D8(Z,"transcript","transcript.json");if(!V1(z)||!V1(X))throw Error(`工程不完整:需要 ${z} 与 ${X}(oralcut/project init 产物布局)`);let W=J(z),V=J(X),K=D8(Z,"split","broll-plan.json"),G=V1(K)?FM(J(K)):[],$=D8(Z,"split","dispatch.json"),H;if(V1($)){let y=(J($).film_broll??[]).map((h)=>h.span?.from).filter((h)=>!!h);if(y.length>0)H=new Set(y)}let N=W.video_track?.[0]?.track_timeline??[],q={};for(let I of W.materials??[])if(I.id&&I.path)q[I.id]=I.path;let U=MM({utterances:V.utterances??[],clips:N,materials:q,quoteSpans:G,leadIds:H}),F=D8(Z,"qc"),M=D8(F,"alignment-frames");tX(M,{recursive:!0});let R=D8(BM(),`gtrk-alignment-${process.pid}`);tX(R,{recursive:!0});let D=Q.extractFrame??((I,y,h)=>Z0(Q.ffmpeg,I,y,h)),O=[];for(let I of U){if(I.skipped||I.source_path===null||I.source_sec===null)continue;let y=D8(R,`${I.id}.jpg`);if(!await D(I.source_path,I.source_sec,y)){I.skipped="frame_extract_failed";continue}let v=D8(M,`${I.id}.jpg`);NM(y,v),I.thumb=`alignment-frames/${I.id}.jpg`,O.push(I)}let C=O.length*X1;if(O.length>0&&!Q.yes){if(!await Q.confirm(`对齐质检将逐句判定 ${O.length} 帧(约 ${C} 积分,1 积分/帧;引用段已按结构校验跳过)。确认继续?`))throw Z3(R,{recursive:!0,force:!0}),Error("对齐质检计费确认被拒绝——零调用零计费")}let T=!1;if(O.length>0){let I=O.map((v)=>eX(D8(R,`${v.id}.jpg`)).toString("base64")),y=O.map((v)=>v.sentence),h=Q.describeBatch?await Q.describeBatch(I,y):await S9(Q.endpoint,I,{},{claims:y});if(T=h.length>0&&h.every((v)=>v.claim_aligned===void 0),h.forEach((v,S)=>{let k=O[S];if(k.frame_desc=v.desc,v.claim_aligned!==void 0)k.aligned=v.claim_aligned,k.verdict=v.claim_verdict,k.reason=v.claim_reason;if(Q.db&&k.source_path!==null&&k.source_sec!==null)try{I7(Q.db,`align-${jM(k.source_path)}`,Math.round(k.source_sec*1000),{...v,claim_aligned:void 0,claim_verdict:void 0,claim_reason:void 0})}catch{}}),T)Y("[对齐质检] 服务端未返回判定字段(material_describe 未升级或旧版本)——降级为配对表+帧描述,"+"裁定交 agent 文本判读(帧 desc 已在报告 items[].frame_desc)");else{let v=h.filter((S)=>S.claim_aligned===void 0).length;if(v>0)Y(`[对齐质检] ${v} 行 VLM 漏出判定字段,按「待裁定」单列(frame_desc 在场可人工/agent 补裁)`)}}Z3(R,{recursive:!0,force:!0});let _=U.filter((I)=>I.verdict),P={qc_version:"alignment-v1",project:Z,generated_at:new Date().toISOString(),degraded:T,summary:{audited:O.length,skipped:U.length-O.length,match:_.filter((I)=>I.verdict==="match").length,partial:_.filter((I)=>I.verdict==="partial").length,mismatch:_.filter((I)=>I.verdict==="mismatch").length,rate:Y3(U),lead_total:_.filter((I)=>I.role!=="follow").length,lead_mismatch:_.filter((I)=>I.role!=="follow"&&I.verdict==="mismatch").length,lead_rate:Y3(_.filter((I)=>I.role!=="follow"))},items:U};Q3(D8(F,"alignment-audit.json"),JSON.stringify(P,null,1),"utf-8");let E=[`# 稿句 ↔ 画面对齐审计(${P.generated_at})`,"",P.summary.rate!==null?`**卡点句对齐率 ${P.summary.lead_rate}%(mismatch ${P.summary.lead_mismatch}/${P.summary.lead_total})← 验收判据**;全句口径 ${P.summary.rate}%(match ${P.summary.match} / partial ${P.summary.partial} / mismatch ${P.summary.mismatch},n=${P.summary.audited})。七三开:跟随句为抽象/数字/修辞句,蹭领衔镜头保节奏自然,其 partial/mismatch 属设计非缺陷`:"**降级形态**(服务端未升级):帧描述已产出,逐句裁定交 agent 文本判读","","| 句 | 角色 | 稿句 | 画面 | 判定 | 说明 |","|---|---|---|---|---|---|"];for(let I of U){let y=I.thumb?``:I.skipped==="quote"?"(引用段·结构校验)":`(跳过:${I.skipped??"?"})`,h=I.verdict?`${I.verdict}(${I.aligned})`:I.skipped?"—":"待裁定",v=I.role==="follow"?"跟随":I.skipped==="quote"?"引用":"**卡点**";E.push(`| ${I.id} | ${v} | ${I.sentence.replace(/\|/g,"\\|")} | ${y} | ${h} | ${(I.reason??I.frame_desc??"").replace(/\|/g,"\\|")} |`)}return Q3(D8(F,"alignment-audit.md"),E.join(`
|
|
162
|
+
`),"utf-8"),P}function z3(){return v8().catch(()=>{return})}var CM={error:"严重",warn:"提示",info:"备注"},_M={flash:"过短镜头/节奏断裂",intra_cut:"段内跳切",black:"黑帧/黑段",freeze:"冻结画面",clip:"音频削波",silence:"静音段",av_drift:"音画时长不一致",vfr:"成片非固定帧率"};function V3(Z){return DM(RM(Z),`${X3(Z,PM(Z))}.qc.json`)}function TM(Z){let Q=[],Y=["error","warn","info"];for(let J of Y){let z=Z.items.filter((X)=>X.severity===J);if(!z.length)continue;Q.push(`【${CM[J]}】${z.length} 条`);for(let X of z)Q.push(` ${K3(X)}`)}if(!Q.length)Q.push("未检出缺陷");return Q}function K3(Z){let Q=Z.ed>Z.st?`${MQ(Z.st)} – ${MQ(Z.ed)}(${(Z.ed-Z.st).toFixed(3)}s)`:MQ(Z.st),Y=Object.entries(Z.evidence).filter(([z])=>z!=="note").map(([z,X])=>`${z}=${typeof X==="number"?X:JSON.stringify(X)}`).join(" "),J=typeof Z.evidence.note==="string"?` ${Z.evidence.note}`:"";return`${_M[Z.type]??Z.type} ${Q}${Y?` ${Y}`:""}${J}`}function G3(Z){Z.command("qc [成片]").description("成片质量扫描:闪帧/段内跳切/黑帧/冻结/爆音/静音/音画规整,产报告与时码定位").option("--gtrk <path>","工程感知模式:对表 clip 拼接边界,识别段内跳切、已知黑底空洞降级").option("--json <path>","机读报告落点(缺省 = <成片同目录>/<成片名>.qc.json)").option("--fail-on <level>","退出码门控:error(默认)| warn | never","error").option("--feedback-cuts","把段内跳切映射回源时码并补录进本地索引(标 qc_confirmed,治检测阈值漏网)——须配 --gtrk;不带本开关时常规扫描零写库").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统)").option("--alignment","对齐质检:逐叙述句判定已铺画面是否给到稿句所说(须配 --project;引用段按结构校验跳过;计费=1 积分/句帧)").option("--project <dir>","[alignment] 工程产物目录(定位 gtrk/transcript/split 三件)").option("--yes","[alignment] 跳过计费确认").action(async(Q,Y)=>{if(Y.alignment){await AM(Q,Y);return}if(!Q)throw Error("缺少成片路径(常规质检模式必填;对齐质检走 --alignment --project)");let J=Y.failOn==="warn"||Y.failOn==="never"?Y.failOn:"error",z=K1(Q);if(!S7(z))throw Error(`成片不存在:${z}`);let X;if(Y.gtrk){let K=K1(Y.gtrk);if(!S7(K))throw Error(`gtrk 工程不存在:${K}`);X=JSON.parse(await OM(K,"utf8"))}j.step(`▶ 成片质检:${X3(z)}${X?"(工程感知)":""}`);let W=await T7(z,{gtrk:X,ffmpegPath:Y.ffmpegPath,onProgress:(K)=>j.info(K)});for(let K of TM(W))j.info(K);if(Y.feedbackCuts){if(!X)throw Error("--feedback-cuts 须配 --gtrk(无工程坐标无从映射回源时码)");let K=new Map,G=0;for(let H of W.items){if(H.type!=="intra_cut")continue;let N=H.evidence.clip_id,q=H.evidence.source_time;if(typeof N!=="string"||typeof q!=="number"){G++;continue}let U=N.startsWith("broll-")?N:`broll-${N}`,F=K.get(U)??[];F.push(Math.round(q*1000)),K.set(U,F)}let $=await v8();try{let H=0;for(let[N,q]of K)H+=fX($,N,q);j.ok(`确认切点已回流索引:新增 ${H} 条(跳过 ${G} 条无法唯一映射)`)}finally{$.close()}}let V=K1(Y.json??V3(z));if(await W3(V,`${JSON.stringify(W,null,2)}
|
|
163
|
+
`,"utf8"),j.ok(`质检完成:严重 ${W.summary.error} · 提示 ${W.summary.warn} · 备注 ${W.summary.info} → ${V}`),dX(W,J))process.exitCode=1})}async function AM(Z,Q){let Y=Q.project??Z;if(!Y)throw Error("对齐质检缺工程目录:--project <dir>(或 positional 兜底)");let J=K1(Y);if(!S7(J))throw Error(`工程目录不存在:${J}`);let z=jZ(),X={url:RQ(z.base),apiKey:z.apiKey},W=AZ(Q.ffmpegPath).ffmpeg;j.step(`▶ 对齐质检:${J}`);let V=await z3();try{let K=await J3(J,{endpoint:X,ffmpeg:W,yes:Q.yes===!0,confirm:async($)=>{let H=LM({input:process.stdin,output:process.stderr});try{let N=(await H.question(`${$} [y/N] `)).trim().toLowerCase();return N==="y"||N==="yes"}finally{H.close()}},onLog:($)=>j.info($),db:V}),G=K.summary;if(K.degraded)j.warn(`对齐质检(降级形态):${G.audited} 句已产帧描述,逐句裁定交 agent 文本判读 → qc/alignment-audit.{json,md}`);else{j.ok(`卡点句对齐 ${G.lead_rate}%(mismatch ${G.lead_mismatch}/${G.lead_total})← 验收判据 | 全句 ${G.rate}%:match ${G.match} · partial ${G.partial} · mismatch ${G.mismatch}(n=${G.audited},引用段等跳过 ${G.skipped})→ qc/alignment-audit.{json,md}`);for(let $ of K.items){if($.verdict!=="mismatch")continue;let N=` ${$.role==="follow"?"跟随句(七三开设计内)":"★卡点句"} ${$.id} @${MQ($.track_mid)}:${$.sentence.slice(0,22)}… — ${$.reason??""}`;if($.role==="follow")j.info(N);else j.warn(N)}}}finally{V?.close()}}async function $3(Z,Q,Y={}){try{let J=await T7(Z,{gtrk:Q,ffmpegPath:Y.ffmpegPath}),z=V3(Z);await W3(z,`${JSON.stringify(J,null,2)}
|
|
164
|
+
`,"utf8");let{error:X,warn:W,info:V}=J.summary;if(X+W+V===0)j.ok(`质检通过:未检出缺陷 → ${z}`);else{j.info(`质检:严重 ${X} · 提示 ${W} · 备注 ${V} → ${z}`);for(let K of J.items.filter((G)=>G.severity==="error"))j.info(` ${K3(K)}`)}return J}catch(J){return j.warn(`渲染后质检未完成(${J instanceof Error?J.message:String(J)})——成片已出,可稍后手动跑 gtrk qc`),null}}function q3(Z){Z.command("render <gtrk>").description("本地渲染:gtrk 工程按 EDL 用本地 ffmpeg 渲染成片 mp4(素材取原片本地路径)").option("-o, --out <file>","输出 mp4 路径(缺省 = <gtrk 同目录>/<gtrk 名>.mp4)").option("--crf <n>","视频质量 CRF 14-28(越小越清晰/文件越大,默认 18)").option("--codec <c>","视频编码(默认 h264)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统)").option("--no-open","完成后不自动打开产物目录").option("--no-qc","跳过渲染后质检(缺省渲完自动扫一遍闪帧/黑帧/爆音等并落 .qc.json)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{if(Y.json)qZ();let J=H3(Q);if(!SM(J))throw Error(`gtrk 工程不存在:${J}`);let z=H3(Y.out??EM(v7(J),`${w7(J,IM(J))}.mp4`));j.step(`▶ 本地渲染:${w7(J)} → ${w7(z)}`);let X=await n6(J),W=await d6(X,z,{crf:Y.crf!=null?Number(Y.crf):void 0,codec:Y.codec,ffmpegPath:Y.ffmpegPath,gtrkDir:v7(J),onLine:(K)=>{let G=K.match(/time=(\S+)/);if(G)j.tick(`渲染中 ${G[1]}`)}});j.tickEnd(),j.ok(`渲染完成:${z}(${W.duration.toFixed(1)}s)`);let V=Y.qc===!1?null:await $3(z,X,{ffmpegPath:Y.ffmpegPath});if(Y.open)D0(v7(z));if(Y.json)console.log(JSON.stringify({ok:!0,output:z,duration:W.duration,...V?{qc:V.summary}:{}}))})}import{resolve as $1,join as w8,dirname as uM,basename as mM}from"node:path";import{existsSync as DQ}from"node:fs";import{readFile as F3,writeFile as k7,mkdir as M3}from"node:fs/promises";import{createHash as cM}from"node:crypto";import{readFileSync as U3,writeFileSync as vM,renameSync as wM,unlinkSync as yM}from"node:fs";import{dirname as xM,join as kM,basename as fM}from"node:path";import{randomBytes as hM,createHash as bM}from"node:crypto";function y7(Z){return bM("sha256").update(typeof Z==="string"?Buffer.from(Z,"utf8"):Z).digest("hex")}function lZ(Z){let Q=U3(Z),Y;try{Y=JSON.parse(Q.toString("utf8"))}catch(J){throw Error(`工程文件不是合法 JSON:${Z}(${J instanceof Error?J.message:String(J)})`)}if(typeof Y!=="object"||Y===null||Array.isArray(Y))throw Error(`工程文件结构异常(顶层非对象):${Z}`);return{gtrk:Y,revision:y7(Q)}}function G8(Z){if(Z.version!=="v1")throw Error(`工程文件不是 v1(version=${JSON.stringify(Z.version)}):请用新链路重产 v1 工程后再拆分`)}class G1 extends Error{operation;expectedRevision;actualRevision;phase;name="GtrkWritebackConflictError";constructor(Z,Q,Y,J,z){super(z);this.operation=Z;this.expectedRevision=Q;this.actualRevision=Y;this.phase=J}}function gM(Z){return Z==="matrix"?"工程文件在 matrix 运行期间被外部修改(保存冲突),已拒绝写入;请关闭客户端未保存的工程或重跑(plan 与已下载代理均保留)":`工程文件在 ${Z} 运行期间被外部修改(保存冲突),已拒绝写入;请关闭客户端未保存的工程后重试`}function x7(Z,Q,Y,J){let z=y7(U3(Z));if(z!==Q)throw new G1(Y,Q,z,J,gM(Y))}function N3(Z,Q,Y,J){let z=kM(xM(Z),`.${fM(Z)}.${hM(6).toString("hex")}.tmp`);try{vM(z,Q),x7(Z,Y,J,"precommit"),wM(z,Z)}catch(X){try{yM(z)}catch{}throw X}return y7(Q)}function B3(Z,Q,Y,J){x7(Z,J,"split","guard");let z={...Q.struct_meta??{},split:Y},X={...Q,struct_meta:z};return N3(Z,JSON.stringify(X,null,2),J,"split")}function c8(Z,Q,Y,J="matrix"){return x7(Z,Y,J,"guard"),N3(Z,JSON.stringify(Q,null,2),Y,J)}var R3="工程目录内找不到 transcript.json(可能是旧任务产物):请用新版本重跑 gtrk oralcut(恒出 transcript),"+"或(规划中)用 transcribe 生成后再拆分;本命令不做降级猜测。";function D3(Z){Z.command("split [splitdoc]").description("视觉拆分派单器:无 positional=导出投影视图;带拆分稿=校验落地(写回 struct_meta.split + dispatch)").option("--project <dir>","oralcut 产物目录(自动定位 gtrk/project.gtrk 与 transcript/transcript.json)").option("--gtrk <path>","显式指定 .gtrk 工程文件(非标准布局兜底)").option("--transcript <path>","显式指定 transcript.json(非标准布局兜底)").option("--column <id>","栏目配置 id(~/.gitruck/columns/<id>.json;缺省取 config defaultColumn,再缺省内置默认栏目)").option("--md","落地时额外渲染人读稿 split/visual-split.md").option("--words","视图模式附字级明细(缺省只出句级)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{await nM(Q,Y)})}function j3(Z){return Z.find((Q)=>DQ(Q))}function lM(Z){let Q=Z.project?$1(Z.project):void 0,Y;if(Z.gtrk)Y=$1(Z.gtrk);else if(Q)Y=j3([w8(Q,"gtrk","project.gtrk"),w8(Q,"project.gtrk")])??w8(Q,"gtrk","project.gtrk");else throw Error("需 --project <目录> 或显式 --gtrk <path>");if(!DQ(Y))throw Error(`找不到工程文件:${Y}`);let J;if(Z.transcript)J=$1(Z.transcript);else if(Q)J=j3([w8(Q,"transcript","transcript.json"),w8(Q,"json","transcript.json"),w8(Q,"transcript.json")]);return{baseDir:Q??uM(Y),gtrkPath:Y,transcriptPath:J}}function dM(Z){return Z.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"")||"project"}async function P3(Z){let Q=JSON.parse(await F3(Z,"utf8"));if(!Q||!Array.isArray(Q.utterances)||typeof Q.material_id!=="string"||typeof Q.text_hash!=="string")throw Error(`transcript.json 结构异常(缺 utterances/material_id/text_hash):${Z}`);return Q.text_hash=cM("sha256").update(Q.utterances.map((Y)=>Y.text??"").join(`
|
|
165
|
+
`),"utf8").digest("hex"),Q}async function nM(Z,Q){if(Q.json)qZ();let{baseDir:Y,gtrkPath:J,transcriptPath:z}=lM(Q);return Z?iM($1(Z),Y,J,z,Q):pM(Y,J,z,Q)}function O3(Z,Q){let Y=H9(Z,Q),J=Y.text.split(`
|
|
166
|
+
`);if(Y.matched_clips>0)return j.info(J[0]),Y;j.warn(`当刻工程里没有命中口播素材(material_id=${Y.material_id})的 clip——`+"视图里会表现为「全部被剪」,但真因未必是被剪:");for(let z of J)j.info(z);return j.warn(Y.hint),Y}function L3(Z){return{source:Z.source,track_index:Z.track_index,material_id:Z.material_id,total_clips:Z.total_clips,matched_clips:Z.matched_clips,skipped:Z.skipped,tracks:Z.tracks}}async function pM(Z,Q,Y,J){if(!Y||!DQ(Y))throw Error(R3);j.step("▶ 导出投影视图(transcript × 当刻 .gtrk)…");let z=await P3(Y),{gtrk:X}=lZ(Q),W=c0(z,X,{words:J.words}),V=O3(X,z.material_id),K=w8(Z,"split");await M3(K,{recursive:!0});let G=w8(K,"view.json");await k7(G,JSON.stringify(W,null,2));let $=W.utterances.filter((N)=>N.dropped).length;j.ok(`投影视图已生成:${G}(${W.utterances.length} 条,其中 ${$} 条被剪)`);let H={ok:!0,mode:"view",viewPath:G,transcript_hash:W.transcript_hash,projected_at:W.projected_at,counts:{entries:W.utterances.length,dropped:$},main_track:L3(V),view:W};if(J.json)console.log(JSON.stringify(H));return H}async function iM(Z,Q,Y,J,z){if(!DQ(Z))throw Error(`找不到拆分稿:${Z}`);if(!J||!DQ(J))throw Error(R3);j.step("▶ 校验拆分稿并落地…");let X=JSON.parse(await F3(Z,"utf8")),W=await P3(J),{gtrk:V,revision:K}=lZ(Y);G8(V);let G=z.column??TZ().defaultColumn,$=_6({columnId:G});for(let P of $.warnings)j.warn(P);let H={utteranceIds:W.utterances.map((P)=>P.id),utteranceTexts:new Map(W.utterances.map((P)=>[P.id,P.text??""])),transcriptHash:W.text_hash,vocab:UJ($.config)},{errors:N,warnings:q}=XJ(X,H);for(let P of q)j.warn(P);if(N.length)throw Error(`拆分稿校验失败(${N.length} 条,未写入任何产物):
|
|
167
|
+
`+N.map((P)=>` - ${P}`).join(`
|
|
168
|
+
`));let U=new Date().toISOString(),F=c0(W,V,{projectedAt:U}),M=O3(V,W.material_id);if(M.matched_clips===0)throw Error(`当刻工程里没有命中口播素材(material_id=${M.material_id})的 clip:落地会把空 beats 覆写进 `+`struct_meta.split(工程里原有的拆分账本会被清掉),已拒写、未改动任何产物。
|
|
169
|
+
`+`${M.text}
|
|
170
|
+
${M.hint}`);let R=dM(mM(Q)),D=KJ(X,F,{utteranceIds:H.utteranceIds,projectSlug:R,projectedAt:U,sourceIndex:{materialId:String(W.material_id),utterances:new Map(W.utterances.map((P)=>[P.id,{st:P.st,ed:P.ed}]))}});B3(Y,V,D.split,K);let O=w8(Q,"split");await M3(O,{recursive:!0});let C=w8(O,"dispatch.json");await k7(C,JSON.stringify(D.dispatch,null,2));let T=null;if(z.md)T=w8(O,"visual-split.md"),await k7(T,GJ(X,D,{projectSlug:R,projectedAt:U}));j.ok(`落地完成:${D.split.beats.length}/${X.beats.length} beat 落轨`+`(MG ${D.dispatch.mg.length} · FILM_BROLL ${D.dispatch.film_broll.length} · AI_DRAMA ${D.dispatch.ai_drama.length})`);for(let P of D.skipped)j.warn(`跳过 ${P.beat}:${P.reason}`);for(let P of D.shrunk)j.warn(`收缩 ${P.beat}:${P.dropped} 句被剪,按存活 ${P.kept} 句包络 → ${P.track_st}s…${P.track_ed}s(建议人工复核)`);if(D.unhandledLanes.length>0)j.warn(`未派单 lane:${D.unhandledLanes.join("、")}——通过校验却无 dispatch 分支,落地静默丢队列(新增 lane 时请同步 buildLanding 分派)`);let _={ok:!0,mode:"land",gtrk:Y,dispatchPath:C,mdPath:T,transcript_hash:X.transcript_hash,projected_at:U,beats:{total:X.beats.length,landed:D.split.beats.length,skipped:D.skipped,shrunk:D.shrunk},main_track:L3(M),queues:{mg:D.dispatch.mg.length,film_broll:D.dispatch.film_broll.length,ai_drama:D.dispatch.ai_drama.length}};if(z.json)console.log(JSON.stringify(_));return _}import{existsSync as f3,readFileSync as sM}from"node:fs";import{join as h3,resolve as c7}from"node:path";import{randomBytes as tM}from"node:crypto";function r0(Z,Q){return Math.floor(Z*Q+0.5)}function a0(Z,Q){return Math.round(Z*1000/Q)}function PQ(Z){return Math.round(Z*1000)}function iZ(Z){return Z/1000}function yZ(Z){let Q=typeof Z==="number"?Z:Number(Z);return Number.isFinite(Q)?PQ(Q):Number.NaN}function w9(Z,Q){let Y=Z.stFrame+Z.durFrames,J=a0(Z.stFrame,Q),z=a0(Y,Q),X=z-J,W=Z.clipStMs,V=W===null?null:W+X;return{trackStMs:J,trackEdMs:z,durationMs:X,clipStMs:W,clipEdMs:V,durFrames:Z.durFrames}}var h7={video:"video_track",audio:"audio_track",beat:"beat_track"};function f7(Z){return Array.isArray(Z)?Z:[]}function Y0(Z){let Q=[];for(let Y of["video","audio","beat"])f7(Z[h7[Y]]).forEach((z,X)=>{if(typeof z!=="object"||z===null)return;let W=z,V=typeof W.track_index==="number"?W.track_index:X;f7(W.track_timeline).forEach((K,G)=>{if(typeof K!=="object"||K===null)return;let $=K,H=typeof $.clip_id==="string"?$.clip_id:"";Q.push({ref:{kind:Y,trackArrayIndex:X,clipArrayIndex:G,trackIndex:V},clip:$,clipId:H,isGap:H===""})})});return Q}function y9(Z,Q){let Y=yZ(Z.clip.track_st);return{track:`${Z.ref.kind}:${Z.ref.trackIndex}`,clip_id:Z.clipId,track_st:Number.isFinite(Y)?iZ(Y):Number.NaN}}function oM(Z,Q){let Y=new Set([Z.ref.kind,Q.ref.kind]);if(!(Y.has("video")&&Y.has("audio")))return!1;let J=yZ(Z.clip.track_st),z=yZ(Q.clip.track_st),X=yZ(Z.clip.duration),W=yZ(Q.clip.duration);if(!Number.isFinite(J)||!Number.isFinite(X))return!1;return J===z&&X===W}function _3(Z,Q){if(Q==="")return{kind:"gap-not-addressable"};let Y=Y0(Z).filter((J)=>J.clipId===Q);if(Y.length===0)return{kind:"none"};if(Y.length===1)return{kind:"single",elements:[Y[0]]};if(Y.length===2&&oM(Y[0],Y[1]))return{kind:"mirror-pair",elements:[Y[0],Y[1]]};return{kind:"ambiguous",elements:Y}}function T3(Z,Q,Y,J){let z=PQ(J);return Y0(Z).filter((X)=>{if(X.ref.kind!==Q||X.ref.trackIndex!==Y)return!1;let W=yZ(X.clip.track_st),V=yZ(X.clip.track_ed);if(!Number.isFinite(W))return!1;let K=Number.isFinite(V)?V:W+yZ(X.clip.duration);return z>=W&&z<K})}function A3(Z){return Z==="move"||Z==="trim"||Z==="split"}function b7(Z){if(Z.ref.kind==="beat")return"beat";let Q=Z.clip.material===void 0||Z.clip.material===null||Z.clip.material==="";return Z.isGap||Q?"gap":"clip"}function rM(Z){let Q=new Map;for(let Y of f7(Z.materials)){if(typeof Y!=="object"||Y===null)continue;let J=Y,z=typeof J.id==="string"?J.id:String(J.id??"");if(!z)continue;let X=yZ(J.duration);Q.set(z,Number.isFinite(X)?X:null)}return Q}function OQ(Z){let Q=[],Y=rM(Z),J=Y0(Z);for(let X of J){let W=b7(X),V=`${X.ref.kind}:${X.ref.trackIndex}#${X.ref.clipArrayIndex}`,K=X.clipId||"(gap)",G=yZ(X.clip.track_st),$=yZ(X.clip.duration),H=yZ(X.clip.track_ed);if(!Number.isFinite(G)||!Number.isFinite($)){Q.push({key:`${V}/required`,code:"missing_required_timecode",message:`${V}(${K})缺 track_st 或 duration`});continue}if($<=0)Q.push({key:`${V}/dur_positive`,code:"duration_not_positive",message:`${V}(${K})duration=${iZ($)}s,须 > 0`});if(Number.isFinite(H)&&H-G!==$)Q.push({key:`${V}/E2`,code:"track_identity_broken",message:`${V}(${K})track_ed − track_st = ${H-G}ms ≠ duration ${$}ms`});if(W==="gap"||W==="beat"){if(X.clip.clip_st!==void 0||X.clip.clip_ed!==void 0)Q.push({key:`${V}/no_src_range`,code:"src_range_on_non_clip",message:`${V}(${K})是 ${W},MUST NOT 含 clip_st/clip_ed`});continue}let N=yZ(X.clip.clip_st),q=yZ(X.clip.clip_ed);if(Number.isFinite(N)&&Number.isFinite(q)&&q-N!==$)Q.push({key:`${V}/E1`,code:"clip_identity_broken",message:`${V}(${K})clip_ed − clip_st = ${q-N}ms ≠ duration ${$}ms`});let U=typeof X.clip.material==="string"?X.clip.material:String(X.clip.material??"");if(U&&!Y.has(U))Q.push({key:`${V}/E4`,code:"material_not_found",message:`${V}(${K})material=${U} 不在 materials 中`});if(Number.isFinite(N)){if(N<0)Q.push({key:`${V}/E5_lower`,code:"src_out_of_range",message:`${V}(${K})clip_st=${iZ(N)}s < 0`});if(Number.isFinite(q)&&N>=q)Q.push({key:`${V}/E5_order`,code:"src_range_not_increasing",message:`${V}(${K})clip_st 须 < clip_ed`});let F=Y.get(U);if(F!==null&&F!==void 0&&Number.isFinite(q)&&q>F+1)Q.push({key:`${V}/E5_upper`,code:"src_exceeds_material",message:`${V}(${K})clip_ed=${iZ(q)}s 超出素材时长 ${iZ(F)}s(容差 1ms)`})}}let z=new Map;for(let X of J){let W=`${X.ref.kind}:${X.ref.trackIndex}`;(z.get(W)??z.set(W,[]).get(W)).push(X)}for(let[X,W]of z){let V=[...W].map((K)=>({e:K,st:yZ(K.clip.track_st),dur:yZ(K.clip.duration)})).filter((K)=>Number.isFinite(K.st)&&Number.isFinite(K.dur)).sort((K,G)=>K.st-G.st);for(let K=1;K<V.length;K++){let G=V[K-1],$=V[K];if($.st<G.st+G.dur)Q.push({key:`${X}/overlap/${G.e.clipId}|${$.e.clipId}@${G.st}-${$.st}`,code:"same_track_overlap",message:`${X} 上「${G.e.clipId||"(gap)"}」与「${$.e.clipId||"(gap)"}」时间重叠`})}}return Q}function g7(Z,Q){let Y=new Set(Z.map((J)=>J.key));return{violations:Q.filter((J)=>!Y.has(J.key)),preexisting:Q.filter((J)=>Y.has(J.key))}}function H1(Z){let Q=0;for(let Y of Y0(Z)){let J=yZ(Y.clip.track_st),z=yZ(Y.clip.duration);if(Number.isFinite(J)&&Number.isFinite(z))Q=Math.max(Q,J+z)}return Q}function E3(Z,Q){let Y=yZ(Z.clip.track_st),J=yZ(Z.clip.duration),z=r0(iZ(Y),Q),X=r0(iZ(Y+J),Q)-z,W=b7(Z),V=yZ(Z.clip.clip_st);return{stFrame:z,durFrames:X,clipStMs:W==="clip"&&Number.isFinite(V)?V:null}}function x9(Z){let Q=Z.trim(),Y=/^([+-]?\d+(?:\.\d+)?)f$/i.exec(Q);if(Y){let z=Number(Y[1]);return Number.isInteger(z)?{frames:z,sec:null}:null}let J=/^([+-]?\d+(?:\.\d+)?)s?$/i.exec(Q);if(J){let z=Number(J[1]);return Number.isFinite(z)?{frames:null,sec:z}:null}return null}function C3(Z,Q){return Z.frames!==null?Z.frames:r0(Z.sec??0,Q)}function aM(Z,Q){return Z.frames!==null?a0(Z.frames,Q):PQ(Z.sec??0)}function I3(Z,Q,Y){let J=Q.frames!==null?Q.frames:r0(Q.sec??0,Y);if(J<0)return{ok:!1,error:{code:"negative_start",message:"落点不能为负"}};return{ok:!0,view:{...Z,stFrame:J}}}function S3(Z,Q,Y){let{stFrame:J,durFrames:z,clipStMs:X}=Z;if(Q.slip!==void 0){if(X===null)return{ok:!1,error:{code:"slip_on_non_clip",message:"gap / beat 没有源窗,--slip 不适用"}};return{ok:!0,view:{stFrame:J,durFrames:z,clipStMs:X+aM(Q.slip,Y)}}}if(Q.in!==void 0||Q.setIn!==void 0){let W=Q.setIn!==void 0?Q.setIn.frames!==null?Q.setIn.frames:r0(Q.setIn.sec??0,Y):J+C3(Q.in,Y),V=W-J;if(J=W,z-=V,X!==null)X+=a0(W,Y)-a0(W-V,Y)}if(Q.out!==void 0||Q.setOut!==void 0)z=Q.setOut!==void 0?(Q.setOut.frames!==null?Q.setOut.frames:r0(Q.setOut.sec??0,Y))-J:z+C3(Q.out,Y);if(J<0)return{ok:!1,error:{code:"negative_start",message:"裁剪后落点为负"}};if(z<1)return{ok:!1,error:{code:"duration_below_one_frame",message:"裁剪后时长不足 1 帧"}};if(X!==null&&X<0)return{ok:!1,error:{code:"negative_src_in",message:"裁剪后源窗入点为负"}};return{ok:!0,view:{stFrame:J,durFrames:z,clipStMs:X}}}function v3(Z,Q,Y){let J=Q.frames!==null?Q.frames:r0(Q.sec??0,Y),z=J-Z.stFrame,X=Z.durFrames-z;if(z<1||X<1)return{ok:!1,error:{code:"split_point_out_of_range",message:"切点须落在元素内部且两段各 ≥1 帧"}};let W={...Z,durFrames:z},V=w9(W,Y).durationMs;return{ok:!0,result:{first:W,second:{stFrame:J,durFrames:X,clipStMs:Z.clipStMs===null?null:Z.clipStMs+V}}}}function w3(Z,Q,Y){for(let z=2;z<=999;z++){let X=`${Z}-${z}`;if(!Q.has(X))return X}let J=`${Z}-${Y()}`;while(Q.has(J))J=`${Z}-${Y()}`;return J}function y3(Z,Q){if(Q.trackLevel===void 0)return Z===Q.contractDefault?"deleted_key":"explicit_value";return Q.trackLevel===Z?"deleted_key":"explicit_value"}function LQ(Z,Q,Y){let J={...Z};if(J.track_st=iZ(Y.trackStMs),J.duration=iZ(Y.durationMs),"track_ed"in Z)J.track_ed=iZ(Y.trackEdMs);if(Q==="clip"&&Y.clipStMs!==null&&Y.clipEdMs!==null){if(J.clip_st=iZ(Y.clipStMs),"clip_ed"in Z)J.clip_ed=iZ(Y.clipEdMs)}return J}function CQ(Z,Q,Y){let J=structuredClone(Z),X=J[h7[Q.kind]][Q.trackArrayIndex];return X.track_timeline[Q.clipArrayIndex]=Y,J}function x3(Z,Q,Y,J){let z=structuredClone(Z);return z[h7[Q.kind]][Q.trackArrayIndex].track_timeline.splice(Y,0,J),z}function k3(Z){return b7(Z)}function u7(Z){let Q=Z.video_rate;if(typeof Q!=="number"||!Number.isFinite(Q)||Q<=0)throw Error(`工程缺少合法的 video_rate(读到 ${JSON.stringify(Q)})——帧对齐无从谈起`);return Q}var k9=["move","trim","split","set"],eM=new Set(["list","help"]);class l7 extends Error{code;constructor(Z,Q){super(Z);this.code=Q}}function e(Z,Q){throw new l7(Q,Z)}var ZR=/^[0-9a-f]{64}$/;function b3(Z,Q){let Y=Z.expectedRevision;if(Y===void 0)return Q;if(!ZR.test(Y))e("bad_expected_revision",`--expected-revision 需 64 位小写 hex(sha256),实得:${JSON.stringify(Y)}`);return Y}function g3(Z,Q,Y,J,z){try{return c8(Z,Q,Y,"patch")}catch(X){if(X instanceof G1){if(z.json){let W={...J,applied:!1,revision:X.expectedRevision,conflict:{expected_revision:X.expectedRevision,actual_revision:X.actualRevision}};process.stdout.write(`${JSON.stringify(W,null,2)}
|
|
171
|
+
`)}e("writeback_conflict",`${X.message}
|
|
172
|
+
下一步:重新读取工程后重试;agent 可拿回执里的 revision 作 --expected-revision 断言(本次 expected=${X.expectedRevision.slice(0,12)}… actual=${X.actualRevision.slice(0,12)}…)。`)}throw X}}function u3(Z){let Q=Z.project?c7(Z.project):void 0,Y;if(Z.gtrk)Y=c7(Z.gtrk);else if(Q){let J=[h3(Q,"gtrk","project.gtrk"),h3(Q,"project.gtrk")];Y=J.find((z)=>f3(z))??J[0]}else e("no_project","需 --project <目录> 或显式 --gtrk <path>");if(!f3(Y))e("gtrk_not_found",`找不到工程文件:${Y}`);return Y}function QR(Z){let Q=/^(video|audio|beat):(\d+)$/.exec(Z.trim());if(!Q)e("bad_track_spec",`--track 形如 video:0 / audio:1 / beat:100,读到「${Z}」`);return{kind:Q[1],index:Number(Q[2])}}function m7(Z,Q){return Z.map((Y)=>{let J=y9(Y,Q),z=Y.clip.duration;return` · ${J.track} clip_id=${J.clip_id||'""'} track_st=${J.track_st}s duration=${String(z)}s`}).join(`
|
|
173
|
+
`)}function m3(Z,Q,Y,J){let z=Q.clip!==void 0,X=Q.track!==void 0||Q.at!==void 0;if(z&&X)e("addr_conflict","--clip 与 --track/--at 互斥,二选一");if(!z&&!X)e("addr_missing","需 --clip <clip_id> 或 --track <kind:index> --at <sec>");if(z){let $=_3(Z,Q.clip);switch($.kind){case"gap-not-addressable":e("gap_not_addressable",'空档(gap)不可经 --clip 寻址(契约让多个 gap 合法共享 clip_id="",它不构成地址)——请用 --track <kind:index> --at <sec>');case"none":e("clip_not_found",`工程里没有 clip_id=${Q.clip} 的元素(零副作用,文件未变)`);case"single":return[...$.elements];case"mirror-pair":if(A3(Y))return[...$.elements];e("mirror_pair_needs_disambiguation",`clip_id=${Q.clip} 命中 video/audio 两个投影(契约允许的镜像复用)。`+`参数是**投影私有**的,不能替你猜改哪个——请用 --track <video|audio>:<index> --at <sec> 指明:
|
|
174
|
+
`+m7([...$.elements],J));case"ambiguous":e("clip_id_ambiguous",`clip_id=${Q.clip} 命中 ${$.elements.length} 个元素(同轨重复 id 属存量违规,已容忍不崩但无法据此寻址)。`+`请改用 --track/--at:
|
|
175
|
+
${m7($.elements,J)}`)}}if(Q.track!==void 0&&Q.at===void 0)e("track_level_out_of_scope","--track 单给读起来像「改这整条轨」,但 v1 `patch` 的射程是**元素级**——"+"MUST NOT 写轨对象上的键(轨级 muted / volume / hidden 均不在射程内)。"+"要改某个元素请补 --at <sec> 指明是轨上哪一个(零副作用,文件未变)");if(Q.at===void 0||Q.track===void 0)e("addr_incomplete","--track 与 --at 须同时给出");let{kind:W,index:V}=QR(Q.track),K=x9(Q.at);if(!K||K.sec===null)e("bad_at",`--at 须是秒(如 5.0),读到「${Q.at}」`);let G=T3(Z,W,V,K.sec);if(G.length===0)e("track_at_not_found",`${W}:${V} 在 ${K.sec}s 处没有元素(零副作用)`);if(G.length>1)e("track_at_ambiguous",`${W}:${V} 在 ${K.sec}s 处命中 ${G.length} 个元素(重叠存量数据):
|
|
176
|
+
${m7(G,J)}`);return G}var YR=["track_st","track_ed","duration","clip_st","clip_ed"];function q1(Z){let Q={};for(let Y of YR)if(Y in Z)Q[Y]=typeof Z[Y]==="number"?Z[Y]:null;return Q}function JR(Z){let Q=["in","out","setIn","setOut","slip"].filter((J)=>Z[J]!==void 0);if(Q.length===0)e("trim_no_args","trim 需给 --in/--out(相对增量)、--set-in/--set-out(绝对时码)或 --slip(只换源窗)之一");if(Z.slip!==void 0&&Q.length>1)e("trim_slip_exclusive","--slip 只换源窗,不能与其它 trim 参数同给");if(Z.in!==void 0&&Z.setIn!==void 0)e("trim_in_conflict","--in 与 --set-in 互斥");if(Z.out!==void 0&&Z.setOut!==void 0)e("trim_out_conflict","--out 与 --set-out 互斥");let Y=(J,z)=>{if(J===void 0)return;let X=x9(J);if(!X)e("bad_time_arg",`${z} 的时码字面非法:「${J}」(用 3.5 / 3.5s / 105f)`);return X};return{in:Y(Z.in,"--in"),out:Y(Z.out,"--out"),setIn:Y(Z.setIn,"--set-in"),setOut:Y(Z.setOut,"--set-out"),slip:Y(Z.slip,"--slip")}}function c3(Z,Q,Y,J,z){let X=E3(Q,z),W=k3(Q);if(Y==="move"){if(J.to===void 0)e("move_no_to","move 需 --to <sec|Nf> 指定落点");let U=x9(J.to);if(!U)e("bad_time_arg",`--to 的时码字面非法:「${J.to}」`);let F=I3(X,U,z);if(!F.ok)e(F.error.code,F.error.message);return{next:CQ(Z,Q.ref,LQ(Q.clip,W,w9(F.view,z))),receiptFor:Q}}if(Y==="trim"){let U=S3(X,JR(J),z);if(!U.ok)e(U.error.code,U.error.message);return{next:CQ(Z,Q.ref,LQ(Q.clip,W,w9(U.view,z))),receiptFor:Q}}if(J.cut===void 0)e("split_no_cut","split 需 --cut <sec|Nf> 指定切点(--at 是寻址参数,不是切点)");let V=x9(J.cut);if(!V)e("bad_time_arg",`--cut 的时码字面非法:「${J.cut}」`);let K=v3(X,V,z);if(!K.ok)e(K.error.code,K.error.message);let G=new Set(Y0(Z).map((U)=>U.clipId).filter((U)=>U!=="")),$=Q.clipId===""?"":w3(Q.clipId,G,()=>tM(2).toString("hex")),H=LQ(Q.clip,W,w9(K.result.first,z)),N={...LQ(Q.clip,W,w9(K.result.second,z)),clip_id:$},q=CQ(Z,Q.ref,H);return q=x3(q,Q.ref,Q.ref.clipArrayIndex+1,N),{next:q,receiptFor:Q}}var zR={muted:!1,volume:1,opaque:!1};function l3(Z,Q,Y){let J=Z[`${Q.ref.kind}_track`][Q.ref.trackArrayIndex],z={...Q.clip},X={},W=(V,K)=>{let G=y3(K,{trackLevel:J[V],contractDefault:zR[V]});if(G==="deleted_key")delete z[V];else z[V]=K;X[V]=G};if(Y.muted!==void 0)W("muted",Y.muted);if(Y.opaque!==void 0)W("opaque",Y.opaque);if(Y.volume!==void 0){let V=Number(Y.volume);if(!Number.isFinite(V)||V<0)e("bad_volume",`--volume 须是 ≥0 的数(线性增益,不是 dB),读到「${Y.volume}」`);W("volume",V)}if(Object.keys(X).length===0)e("set_no_params","set 需给 --muted / --volume / --opaque 之一,或用 --total 改工程总长");return{next:CQ(Z,Q.ref,z),forms:X}}function d3(Z,Q,Y){if(!("duration"in Z))e("top_duration_absent","顶层 duration 键不在场——缺席即按全轨末端机械算出;新增该键会改变消费与计费口径,故 --total 硬拒。");let J;if(Q.trim()==="max")J=H1(Z);else{let X=x9(Q);if(!X)e("bad_time_arg",`--total 须是秒、Nf 或 max,读到「${Q}」`);J=X.frames!==null?a0(X.frames,Y):PQ(X.sec??0)}let z=structuredClone(Z);return z.duration=iZ(J),{next:z,value:iZ(J)}}async function XR(Z){let Q=Z==="-"?await new Promise((z,X)=>{let W="";process.stdin.setEncoding("utf8"),process.stdin.on("data",(V)=>{W+=V}),process.stdin.on("end",()=>z(W)),process.stdin.on("error",X)}):sM(c7(Z),"utf8"),Y;try{Y=JSON.parse(Q)}catch(z){e("bad_ops_json",`--ops 不是合法 JSON:${z instanceof Error?z.message:String(z)}`)}let J=Array.isArray(Y)?Y:Y?.ops;if(!Array.isArray(J))e("bad_ops_shape","--ops 须是 op 数组,或 { ops: [...] }");return J.forEach((z,X)=>{let W=z?.action;if(!k9.includes(W))e("bad_ops_action",`--ops 第 ${X+1} 条的 action 非法:${JSON.stringify(W)}(合法:${k9.join(" / ")})`)}),J}function WR(Z,Q,Y,J){let z=Y.clip!==void 0||Y.track!==void 0||Y.at!==void 0,X=Y.muted!==void 0||Y.volume!==void 0||Y.opaque!==void 0;if(Y.total!==void 0){if(Q!=="set")e("total_wrong_action","--total 只属 `patch set`");if(z||X)e("total_not_element_scoped","--total 是工程级 op、不带元素地址;元素级改动请另起一个 op(用 --ops 写成两条有序 op,或分两次调用)");let N=d3(Z,Y.total,J);return{next:N.next,receipt:{action:Q,scope:"project",resolved:null,after:{duration:N.value}}}}let W=m3(Z,Y,Q,J),V=W.map((N)=>q1(N.clip));if(Q==="set"){let N=l3(Z,W[0],Y);return{next:N.next,receipt:{action:Q,scope:"element",resolved:[y9(W[0],J)],note:Object.entries(N.forms).map(([q,U])=>`${q}:${U}`).join(", ")}}}let K=Z,G=[],$=(N)=>Y0(K).find((q)=>q.ref.kind===N.ref.kind&&q.ref.trackArrayIndex===N.ref.trackArrayIndex&&q.ref.clipArrayIndex===N.ref.clipArrayIndex);for(let N of W){G.push(y9(N,J));let q=$(N);if(!q)e("internal_relocate_failed","内部错误:应用动作后无法重新定位元素");K=c3(K,q,Q,Y,J).next}let H=W.map((N)=>{let q=$(N);return q?q1(q.clip):{}});return{next:K,receipt:{action:Q,scope:"element",resolved:G,before:V[0],after:H[0]}}}async function VR(Z,Q){if(Z.length>0)e("ops_with_action",`--ops 自带每条 op 的 action,不该再给动作词「${Z[0]}」`);let Y=await XR(Q.ops);if(Y.length===0)e("ops_empty","--ops 是空数组,没有可执行的操作");let J=u3(Q),{gtrk:z,revision:X}=lZ(J);G8(z);let W=u7(z),V=z,K=[];for(let[U,F]of Y.entries())try{let M=WR(V,F.action,{...F,gtrk:void 0,project:void 0,ops:void 0},W);V=M.next,K.push(M.receipt)}catch(M){let R=M instanceof Error?M.message:String(M),D=M instanceof l7?M.code:"op_failed";e(D,`--ops 第 ${U+1} 条(${F.action})失败,已零写(文件逐字节未变):
|
|
177
|
+
${R}`)}let{violations:G,preexisting:$}=g7(OQ(z),OQ(V));if(G.length>0){let U=G.map((F)=>` · [${F.code}] ${F.message}`).join(`
|
|
178
|
+
`);e("invariant_violated",`批量改动会破坏时码不变量,已拒绝写入(文件逐字节未变):
|
|
179
|
+
${U}`)}let H=KR(V),N=b3(Q,X),q={applied:!1,gtrk:J,revision:X,video_rate:W,ops:K,warnings:H,preexisting:$};if(Q.dryRun)return U1(q,Q),q;return q.revision=g3(J,V,N,q,Q),q.applied=!0,U1(q,Q),q}function KR(Z){let Q=Z.duration;if(typeof Q!=="number")return[];let Y=iZ(H1(Z));return Y>Q?[{code:"top_duration_shorter_than_tracks",top_duration:Q,max_track_ed:Y}]:[]}async function GR(Z,Q){if(Q.json)qZ();if(Q.ops!==void 0)return VR(Z,Q);let Y=Z[0];if(!Y)e("no_action",`用法:gtrk patch <${k9.join("|")}> …(元素级编辑;agent MUST NOT 裸手改 .gtrk JSON)`);if(eM.has(Y))e("reserved_action",`「${Y}」是保留字,不能作动作名。合法动作:${k9.join(" / ")}`);if(!k9.includes(Y))e("unknown_action",`未知动作「${Y}」。合法动作:${k9.join(" / ")}`);let J=u3(Q),{gtrk:z,revision:X}=lZ(J);G8(z);let W=u7(z),V=Q.clip!==void 0||Q.track!==void 0||Q.at!==void 0,K=Q.muted!==void 0||Q.volume!==void 0||Q.opaque!==void 0;if(Q.total!==void 0){if(Y!=="set")e("total_wrong_action","--total 只属 `patch set`");if(V||K)e("total_not_element_scoped","--total 是工程级 op、不带元素地址;元素级改动请另起一个 op(用 --ops 写成两条有序 op,或分两次调用)")}let G=[],$=z;if(Q.total!==void 0){let R=d3($,Q.total,W);$=R.next,G.push({action:Y,scope:"project",resolved:null,after:{duration:R.value}})}else{let R=m3($,Q,Y,W),D=R.map((O)=>q1(O.clip));if(Y==="set"){let O=l3($,R[0],Q);$=O.next,G.push({action:Y,scope:"element",resolved:[y9(R[0],W)],note:Object.entries(O.forms).map(([C,T])=>`${C}:${T}`).join(", ")})}else{let O=[];for(let T of R){O.push(y9(T,W));let _=Y0($).find((P)=>P.ref.kind===T.ref.kind&&P.ref.trackArrayIndex===T.ref.trackArrayIndex&&P.ref.clipArrayIndex===T.ref.clipArrayIndex);if(!_)e("internal_relocate_failed","内部错误:应用动作后无法重新定位元素");$=c3($,_,Y,Q,W).next}let C=R.map((T)=>{let _=Y0($).find((P)=>P.ref.kind===T.ref.kind&&P.ref.trackArrayIndex===T.ref.trackArrayIndex&&P.ref.clipArrayIndex===T.ref.clipArrayIndex);return _?q1(_.clip):{}});G.push({action:Y,scope:"element",resolved:O,before:D[0],after:C[0]})}}let{violations:H,preexisting:N}=g7(OQ(z),OQ($));if(H.length>0){let R=H.map((D)=>` · [${D.code}] ${D.message}`).join(`
|
|
180
|
+
`);e("invariant_violated",`本次改动会破坏时码不变量,已拒绝写入(文件逐字节未变):
|
|
181
|
+
${R}`)}let q=[],U=$.duration;if(typeof U==="number"){let R=iZ(H1($));if(R>U)q.push({code:"top_duration_shorter_than_tracks",top_duration:U,max_track_ed:R})}let F=b3(Q,X),M={applied:!1,gtrk:J,revision:X,video_rate:W,ops:G,warnings:q,preexisting:N};if(Q.dryRun)return U1(M,Q),M;return M.revision=g3(J,$,F,M,Q),M.applied=!0,U1(M,Q),M}function U1(Z,Q){if(Q.json){process.stdout.write(`${JSON.stringify(Z,null,2)}
|
|
182
|
+
`);return}let Y=Z.applied?"已写入":"干跑(未写入)";j.step(`${Y}:${Z.gtrk}(video_rate=${Z.video_rate})`);for(let J of Z.ops){if(J.scope==="project"){j.info(`${J.action} --total → duration=${J.after?.duration}s`);continue}for(let z of J.resolved??[])j.info(`${J.action} @ ${z.track} clip_id=${z.clip_id||'""'} track_st=${z.track_st}s`);if(J.before&&J.after){let z=Object.keys(J.after);j.info(` ${z.map((X)=>`${X}: ${J.before?.[X]} → ${J.after?.[X]}`).join(" ")}`)}if(J.note)j.info(` ${J.note}`)}for(let J of Z.warnings)j.warn(`${J.code}:顶层 duration=${J.top_duration}s 短于全轨末端 ${J.max_track_ed}s(产物与计费会按顶层截断;要改走 patch set --total)`);if(Z.preexisting.length>0){j.info(`ℹ️ 入档既存不变量问题 ${Z.preexisting.length} 条(非本次造成,未阻断):`);for(let J of Z.preexisting.slice(0,5))j.info(` · [${J.code}] ${J.message}`);if(Z.preexisting.length>5)j.info(` · …另 ${Z.preexisting.length-5} 条`)}}function n3(Z){Z.command("patch [words...]").description("元素级编辑 .gtrk 工程:move / trim / split / set(恒等式同步 + 帧对齐,agent 勿裸手改 JSON)").option("--project <dir>","工程目录(自动定位 gtrk/project.gtrk)").option("--gtrk <path>","直接指定 .gtrk 路径").option("--clip <clip_id>","按 clip_id 寻址").option("--track <kind:index>","按轨寻址,形如 video:0 / audio:1 / beat:100").option("--at <sec>","配合 --track 的寻址时刻").option("--cut <sec|Nf>","split 的切点(与 --at 分开:--at 是地址、--cut 是切点)").option("--to <sec|Nf>","move 的落点").option("--in <delta>","trim:入点相对增量(源窗与轨上入点同动)").option("--out <delta>","trim:出点相对增量").option("--set-in <abs>","trim:入点绝对时码").option("--set-out <abs>","trim:出点绝对时码").option("--slip <delta>","trim:只换源窗(轨上落点与时长都不动)").option("--muted","set:静音").option("--no-muted","set:取消静音").option("--volume <gain>","set:线性增益(不是 dB)").option("--opaque","set:不透明").option("--total <sec|Nf|max>","set:改顶层 duration(工程级 op,与元素寻址互斥)").option("--dry-run","只算与校验、不写文件").option("--expected-revision <sha256>","跨命令写回断言:上次回执里的 revision,与盘上内容不符即拒写(agent 用;缺省只护本次读→改→写窗口)").option("--json","机器可读回执到 stdout(日志转 stderr)").action(async(Q,Y)=>{await GR(Q??[],Y)})}import{resolve as X0,join as dZ,dirname as u9,basename as E1}from"node:path";import{existsSync as nZ,readFileSync as iP}from"node:fs";import{readFile as $2,writeFile as t0,mkdir as wQ,rename as oP}from"node:fs/promises";import{createInterface as rP}from"node:readline/promises";var $R="arrange_endpoint_unreachable",HR=6210,qR=6211,UR=6212,NR=6213,BR=6214,jR=6201,FR=6202,MR=120000,RR=3,DR=1000;class p3 extends Error{code=$R;unreachable=!0;constructor(Z){super(Z);this.name="ArrangeError"}}class d7 extends Error{code;rejected=!0;constructor(Z,Q){super(`服务端拒绝了编排请求(code=${Z}):${Q}${PR(Z)}`);this.code=Z;this.name="ArrangeRejectedError"}}function PR(Z){switch(Z){case HR:return`
|
|
183
|
+
——双端编排量公式漂移了(多半是 CLI 与服务端版本错配)。升级 CLI 后重试;本次未执行也未计费。`;case qR:return`
|
|
184
|
+
——本次未执行也未计费。调高 --arrange-cost-cap 或缩小 plan 规模(减 beat / 减候选 / 减轨数)。`;case UR:return`
|
|
185
|
+
——服务端不认识本地的计量口径版本,且**不会**回落到默认价目执行(回落即按另一套价静默计费)。升级 CLI。`;case NR:return`
|
|
186
|
+
——同一幂等键此前对应的是另一份请求。这通常意味着本地请求体在重试之间被改动过。`;case BR:return`
|
|
187
|
+
——服务端尚未实现该编排档位,且 MUST NOT 静默降级到低档执行。改用已实现的档位。`;case jR:case FR:return`
|
|
188
|
+
——额度或余额不足(前置拒绝,本次任务不扣费)。`;default:return""}}function i3(Z){let Q=process.env.GITRUCK_ARRANGE_URL?.trim();if(Q)return Q;return`${Z.replace(/\/+$/,"")}/task/cli/broll_arrange`}function OR(Z,Q){if(Z===429||Z>=500)return null;try{let Y=JSON.parse(Q);if(typeof Y.code==="number"&&Y.code!==200)return new d7(Y.code,typeof Y.msg==="string"&&Y.msg?Y.msg:`HTTP ${Z}`)}catch{}return null}async function LR(Z,Q,Y,J){let z=await Y(Z.url,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:Q,signal:AbortSignal.timeout(J)});if(!z.ok){let W=await z.text().catch(()=>""),V=OR(z.status,W);if(V)throw V;throw Error(`HTTP ${z.status}:${W.slice(0,200)}`)}let X=await z.json();if(typeof X.code==="number"&&X.code!==200)throw new d7(X.code,typeof X.msg==="string"?X.msg:`code=${X.code}`);if(!X.data||typeof X.data!=="object")throw Error("响应缺 data(非编排契约响应)");return X.data}async function o3(Z,Q,Y={}){q8();let J=Y.fetchFn??fetch,z=Y.sleep??(($)=>new Promise((H)=>setTimeout(H,$))),X=Y.backoffBaseMs??DR,W=Y.timeoutMs??MR,V=Y.retries??RR,K=JSON.stringify(Q),G="";for(let $=0;$<=V;$++){if($>0)await z(X*2**($-1));try{return await LR(Z,K,J,W)}catch(H){if(H?.rejected===!0)throw H;G=H instanceof Error?H.message:String(H)}}throw new p3(`编排端点不可达或响应异常(${Z.url}):${G}——已指数退避重试 ${V} 次。
|
|
189
|
+
`+"重试用的是逐字节相同的请求体,服务端幂等表保证不会因此二次扣费。")}async function r3(Z,Q={}){let Y=Q.log??{info:()=>{},warn:()=>{}},J=Q.costCap!==void 0?`(本次上限 ${Q.costCap},超限服务端前置拒绝、零执行零计费)`:"";if(Y.info(`本次云端编排的**编排量**预估为 ${Z}${J}。`+"该值由本地按与服务端同一公式算出,随请求上行仅供一致性校验——"+"实际计费恒以服务端复算值为准,两值不一致时服务端会拒绝执行且不计费。"),Q.assumeYes)return{proceed:!0};if(!Q.confirm)return Y.warn("非交互环境无法确认,本轮不发起云端编排。要在脚本里跑请显式加 --yes。"),{proceed:!1,reason:"no_tty"};let z=await Q.confirm(`确认发起云端编排(编排量 ${Z})?`);if(!z)Y.info("已取消,未发起请求——零执行零计费。");return z?{proceed:!0}:{proceed:!1,reason:"declined"}}var CR=["clip_id","query","score","clip_st","clip_ed","track_st","track_ed","material_id","gap_fill"];function _R(Z){let Q=Z,Y={};for(let J of CR)if(J in Q)Y[J]=Q[J];for(let J of Object.keys(Q).sort())if(!(J in Y))Y[J]=Q[J];return Y}function a3(Z){return JSON.stringify(Z,(Q,Y)=>Y&&typeof Y==="object"&&!Array.isArray(Y)?Object.fromEntries(Object.keys(Y).sort().map((J)=>[J,Y[J]])):Y)}class N1 extends Error{problems;constructor(Z){super(`服务端编排产物结构违约(${Z.length} 处),本轮不落轨:
|
|
190
190
|
${Z.join(`
|
|
191
191
|
`)}
|
|
192
|
-
`+"这不是「与本地算得不一致」——那不是拒绝理由;这是产物形态本身不合契约。");this.problems=Z;this.name="ArrangeResponseInvalid"}}var
|
|
193
|
-
本地 ${
|
|
194
|
-
服务 ${
|
|
192
|
+
`+"这不是「与本地算得不一致」——那不是拒绝理由;这是产物形态本身不合契约。");this.problems=Z;this.name="ArrangeResponseInvalid"}}var J0=(Z)=>typeof Z==="number"&&Number.isFinite(Z),TR=["clip_id","query","score","clip_st","clip_ed","track_st","track_ed"];function AR(Z,Q,Y){if(!Z||typeof Z!=="object"||Array.isArray(Z)){Y.push(`${Q}:槽位不是对象`);return}let J=Z;for(let z of TR)if(!(z in J)){Y.push(`${Q}:缺必填键 ${z}`);return}if(typeof J.clip_id!=="string"||!J.clip_id)Y.push(`${Q}:clip_id 须为非空字符串`);if(typeof J.query!=="string")Y.push(`${Q}:query 须为字符串(红线 1:原文,不是下标)`);for(let z of["score","clip_st","clip_ed","track_st","track_ed"])if(!J0(J[z]))Y.push(`${Q}:${z} 须为有限数字`);if(J0(J.clip_st)&&J0(J.clip_ed)&&!(J.clip_ed>J.clip_st))Y.push(`${Q}:素材窗口非正长(${J.clip_st}–${J.clip_ed})`);if(J0(J.track_st)&&J0(J.track_ed)&&!(J.track_ed>J.track_st))Y.push(`${Q}:时间线窗口非正长(${J.track_st}–${J.track_ed})`);if("material_id"in J)Y.push(`${Q}:槽位带了 material_id —— 那是本地事实(图片运镜后置补丁注入),服务端 MUST NOT 给`);if("gap_fill"in J&&J.gap_fill!==!0)Y.push(`${Q}:gap_fill 只允许取 true(非填充槽位应整键缺席,不是 false)`)}function s3(Z,Q){let Y=[];if(!Z||typeof Z!=="object")throw new N1(["响应不是对象"]);if(!Z.fills||typeof Z.fills!=="object"||Array.isArray(Z.fills))throw new N1(["响应缺 fills 或形态不对"]);let J=new Map,z=new Set;for(let[W,V]of Object.entries(Z.fills)){if(!Array.isArray(V)){Y.push(`beat「${W}」:轨列表不是数组`);continue}if(V.length!==Q)Y.push(`beat「${W}」:轨数 ${V.length} ≠ 请求的 ${Q} —— `+"空轨占位必须保留(track_index 按数组位置定,压一条后面全体错位)");let K=[];V.forEach((G,$)=>{if(!Array.isArray(G)){Y.push(`beat「${W}」轨 ${$}:槽位列表不是数组`),K.push([]);return}G.forEach((N,q)=>AR(N,`beat「${W}」轨 ${$} 槽 ${q}`,Y));let H=G.map((N)=>_R(N));for(let N of H)if(typeof N.clip_id==="string")z.add(N.clip_id);K.push(H)}),J.set(W,K)}if(Array.isArray(Z.clip_ids)){let W=new Set(Z.clip_ids),V=[...z].filter((G)=>!W.has(G)),K=[...W].filter((G)=>!z.has(G));if(V.length||K.length)Y.push(`clip_ids 回显与槽位实际取用不一致(槽位有而回显缺:${V.join(",")||"无"};`+`回显有而槽位无:${K.join(",")||"无"})`)}let X=Z.stats;if(!X||typeof X!=="object")Y.push("缺 stats");else for(let W of["emptySlots","adjacentWaived","pinnedPlaced","emptySlotsByRefine","hotSlotsPlaced","blurrySlotsPlaced","pinnedYielded"])if(!J0(X[W]))Y.push(`stats.${W} 缺失或不是数字`);if(!Z.pinned||!Array.isArray(Z.pinned.requested)||!Array.isArray(Z.pinned.yielded))Y.push("缺 pinned.requested / pinned.yielded(让位名单要指名,MUST NOT 只给计数)");else if(X&&typeof X==="object"&&J0(X.pinnedPlaced)&&J0(X.pinnedYielded)){let W=Z.pinned.requested.length;if(X.pinnedPlaced+X.pinnedYielded!==W)Y.push(`钉选诊断三数不自洽:pinnedPlaced=${X.pinnedPlaced} + pinnedYielded=${X.pinnedYielded} `+`≠ pinned.requested=${W} —— 三者 MUST 同分母(按段计,键 <clip_id>@<round(best×1000)>);`+"对不上通常是服务端只改了其中一处")}if(!Array.isArray(Z.anchors))Y.push("缺 anchors 数组(无锚时应为空数组,不是缺席)");for(let W of Z.anchors??[])if(W?.status==="degraded"&&!W.reason)Y.push(`锚「${W.keyword}」降级但没给 reason —— 降级 MUST NOT 静默`);if(Z.direct!==void 0)if(!Array.isArray(Z.direct))Y.push("direct 在册但不是数组");else for(let W of Z.direct){let V=W?.clip_id??"?";if(W?.status!=="planned"&&!W?.code)Y.push(`直排槽「${V}」非 planned 但没给机读 code —— 非 planned MUST NOT 静默`);if(!(W&&("fps"in W)))Y.push(`直排槽「${V}」缺 fps 键(未知须显式 null)`)}if(Z.cut_align!==void 0){for(let W of["target","starts_total","aligned","ratio"])if(!J0(Z.cut_align[W]))Y.push(`cut_align.${W} 缺失或不是数字`)}if(Y.length)throw new N1(Y);return{fills:J,clipIds:z,stats:{...X},pinnedOutcome:{requested:[...Z.pinned.requested],yielded:[...Z.pinned.yielded]},markStats:{...Z.mark_stats},anchors:Z.anchors.map((W)=>({...W})),...Z.cut_align?{cutAlign:{...Z.cut_align}}:{},...Z.gap_fills?{gapFills:Z.gap_fills.map((W)=>({...W}))}:{},...Z.direct?{direct:Z.direct.map((W)=>({...W}))}:{}}}function t3(Z,Q){let Y=[],J=[...Z.fills.keys()],z=[...Q.fills.keys()],X=J.filter((V)=>!Q.fills.has(V)),W=z.filter((V)=>!Z.fills.has(V));if(X.length||W.length)return Y.push(`beat 集合不同:服务端缺 [${X.join(",")||"无"}],多出 [${W.join(",")||"无"}]`),Y;for(let V of[...J].sort()){let K=Z.fills.get(V)??[],G=Q.fills.get(V)??[];if(K.length!==G.length){Y.push(`beat「${V}」轨数不同:本地 ${K.length} vs 服务端 ${G.length}`);continue}for(let $=0;$<K.length;$++){let H=K[$]??[],N=G[$]??[];if(H.length!==N.length){Y.push(`beat「${V}」轨 ${$} 槽位数不同:本地 ${H.length} vs 服务端 ${N.length}`);continue}for(let q=0;q<H.length;q++){let U=a3(H[q]),F=a3(N[q]);if(U!==F)Y.push(`beat「${V}」轨 ${$} 槽 ${q}:
|
|
193
|
+
本地 ${U}
|
|
194
|
+
服务 ${F}`)}}}if(Z.stats.emptySlots!==Q.stats.emptySlots)Y.push(`留空槽位数不同:本地 ${Z.stats.emptySlots} vs 服务端 ${Q.stats.emptySlots}`);return Y}var e3="arrange-metering@v1";function _Q(Z,Q,Y={}){let J=Z.beats?.length??0,z=0;for(let V of Z.beats??[])for(let K of V.queries??[])for(let G of K.results??[])z+=G.segments?.length??0;let X=Y.cutAlign,W=!!X&&X.ratio>0&&X.ratio<1&&(X.starts?.length??0)>0;return{beats:J,segments:z,lay:Q,calibrationPasses:W?2:1,qcFrames:0}}function TQ(Z){if(Z.beats<=0||Z.lay<=0)return 0;let Q=(8*Z.beats+Z.segments)*Z.lay*Z.calibrationPasses;return Math.floor((Q+32-1)/32)+Z.qcFrames}function w0(Z){return typeof Z==="number"&&Number.isFinite(Z)?Z:void 0}function ER(Z){let Q={start:Z.start,end:Z.end,best:Z.best,score:Z.score};if(Array.isArray(Z.cuts))Q.cuts=Z.cuts.slice();let Y=w0(Z.motion?.p50);if(Y!==void 0)Q.motion={p50:Y};return Q}function IR(Z){let Q={clip_id:Z.clip_id,score:Z.score};if(Z.kind==="image"||Z.kind==="video")Q.kind=Z.kind;if(Z.source==="local"||typeof Z.local_path==="string")Q.source="local";let Y=w0(Z.fps);if(Y!==void 0)Q.fps=Y;let J=w0(Z.duration);if(J!==void 0)Q.duration=J;if(Z.pinned===!0)Q.pinned=!0;if(Z.excluded_hint)Q.excluded_hint=!0;if(Z.describe?.usable_flags?.blurry===!0)Q.describe={usable_flags:{blurry:!0}};if(Array.isArray(Z.segments))Q.segments=Z.segments.map(ER);return Q}function SR(Z){let Q={query:Z.query};if(Array.isArray(Z.results))Q.results=Z.results.map(IR);return Q}function vR(Z){return{keyword:Z.keyword,at_sec:w0(Z.at_sec)??null,query:Z.query}}function wR(Z){let Q={clip_id:Z.clip_id,clip_st:Z.clip_st,clip_ed:Z.clip_ed},Y=w0(Z.track_st),J=w0(Z.track_ed);if(Y!==void 0&&J!==void 0)Q.track_st=Y,Q.track_ed=J;if(Z.query)Q.query=Z.query;if(Z.slot_role!==void 0)Q.slot_role=Z.slot_role;return Q}function yR(Z){let Q={beat:Z.beat,track_st:Z.track_st,track_ed:Z.track_ed,queries:Z.queries.map(SR)},Y=w0(Z.per_shot_sec);if(Y!==void 0)Q.per_shot_sec=Y;let J=w0(Z.requested_shots);if(J!==void 0)Q.requested_shots=J;if(Array.isArray(Z.anchors)&&Z.anchors.length)Q.anchors=Z.anchors.map(vR);if(Z.arrange_mode)Q.arrange_mode=Z.arrange_mode;if(Array.isArray(Z.direct_slots)&&Z.direct_slots.length)Q.direct_slots=Z.direct_slots.map(wR);return Q}function ZW(Z,Q){let Y={};for(let J of Z.beats)for(let z of J.queries)for(let X of z.results??[])for(let W of y6(X)){let V=Math.round(W.best*1000),K=`${X.clip_id}@${V}`;if(K in Y)continue;let G=Q(X.clip_id,V);if(typeof G==="number"&&Number.isFinite(G))Y[K]=G}return Y}function xR(Z,Q){let Y={};if(Q.noImage!==void 0)Y.noImage=Q.noImage;if(Q.dedupScope!==void 0)Y.dedupScope=Q.dedupScope;if(Q.markWeight!==void 0)Y.markWeight=Q.markWeight;if(Q.highlightWeight!==void 0)Y.highlightWeight=Q.highlightWeight;if(Q.markLookup){let J=ZW(Z,Q.markLookup);if(Object.keys(J).length)Y.markTable=J}if(Q.highlightLookup){let J=ZW(Z,Q.highlightLookup);if(Object.keys(J).length)Y.highlightTable=J}if(Q.cutAlign)Y.cutAlign={ratio:Q.cutAlign.ratio,starts:Q.cutAlign.starts.slice()};if(Q.gapFill!==void 0)Y.gapFill=Q.gapFill;return Object.keys(Y).length?Y:void 0}function QW(Z,Q,Y,J={},z={}){let X={plan_version:Z.plan_version,member_type:Z.member_type,beats:Z.beats.map(yR)},W=xR(Z,J),V={plan:X,lay:Q,score_floor:Y,algo_pin:e3,estimated_units:TQ(_Q(Z,Q,J))};if(W)V.opts=W;if(z.costCap!==void 0)V.cost_cap=z.costCap;return V}var kR="GITRUCK_ARRANGE";function p7(Z,Q=process.env){let Y=Q[kR]?.trim().toLowerCase();if(Y==="off"||Y==="0"||Y==="local")return"local";if(Y==="shadow")return Z==="local"?"local":"shadow";return Z}function f9(Z){return Z.member_type==="local"}class n7 extends Error{reason;arrangeUnavailable=!0;constructor(Z,Q){super(`本地素材的 B-roll 编排在云端完成,本轮没能拿到云端产物:${Q}
|
|
195
195
|
`+"本地素材的编排只在服务端跑(算法只在那里迭代),所以这里**不会**改用别的算法把活干完"+`——那会给你一份和云端不同的结果而你并不知情。
|
|
196
196
|
`+"出路:先排查网络与凭据后重试;若持续失败请把这条报错发给我们——"+`这说明是我们这边的问题,不该由你来绕过。
|
|
197
|
-
`+"(素材矩阵那条路的**编排**不受影响,本来就在你机器上跑、也不计费;它的检索照旧按次计费。)");this.reason=Z;this.name="ArrangeUnavailableError"}}var
|
|
198
|
-
${R}`);return
|
|
199
|
-
${R}`),{outcome:K,source:"local",mode:
|
|
200
|
-
${
|
|
201
|
-
`)}`+(
|
|
202
|
-
…另有 ${
|
|
203
|
-
${
|
|
204
|
-
`)}`+(
|
|
205
|
-
…另有 ${
|
|
206
|
-
⚠️ 本次调用服务端已执行并计费(编排量 ${N.units??"?"}),而产物被我们丢弃了。`+"成片不受影响,但这笔账你花得不明不白——请把这条反馈给我们。"),{outcome:K,source:"local",fallback:"self_check_failed",...
|
|
207
|
-
`+"——这几句的画面没给到稿子说的东西。可换个检索词重跑,或在 plan 里手动挑一条候选。")}return{outcome:X,plan:z,rounds:
|
|
197
|
+
`+"(素材矩阵那条路的**编排**不受影响,本来就在你机器上跑、也不计费;它的检索照旧按次计费。)");this.reason=Z;this.name="ArrangeUnavailableError"}}var fR={info:()=>{},warn:()=>{}};async function YW(Z,Q,Y,J,z,X){let W=X.log??fR,V=p7(z);if(V==="local")return{outcome:X.runLocal(),source:"local",mode:V,...z!=="local"?{fallback:"kill_switch"}:{}};if(!f9(Z))return W.info("本轮是素材矩阵路(member_type 非 local),编排继续在本地跑——云端编排只承担本地素材上轨铺排。"),{outcome:X.runLocal(),source:"local",mode:V,fallback:"out_of_scope"};let K=X.runLocal(),G=X.strictCloud===!0&&V==="cloud",$=(M,R)=>{if(G)throw new n7(M,R);return W.warn(`${R}——本轮回落本地编排,工程照常完成。`),{outcome:K,source:"local",mode:V,fallback:M}};if(!X.endpoint)return $("unreachable","未配置编排端点");let H=QW(Z,Q,Y,J,X.costCap!==void 0?{costCap:X.costCap}:{}),N;try{N=await(X.request??o3)(X.endpoint,H,X.clientDeps??{})}catch(M){if(M?.rejected===!0)return $("rejected",`服务端拒绝了本轮云端编排:${M.message}`);if(M?.unreachable===!0)return $("unreachable",M.message);throw M}let q;try{q=s3(N,Q)}catch(M){let R=`⚠️ 本次调用服务端已执行并计费(编排量 ${N.units??"?"}),而产物被我们丢弃了。`+"请把这条连同上面的违约明细反馈给我们。";if(G)throw new n7("malformed",`服务端编排产物结构违约:${M.message}
|
|
198
|
+
${R}`);return W.warn(`服务端编排产物结构违约,本轮弃用:${M.message}
|
|
199
|
+
${R}`),{outcome:K,source:"local",mode:V,fallback:"malformed",...N.units!==void 0?{units:N.units}:{}}}let U=t3(K,q),F={mode:V,diffs:U,...N.units!==void 0?{units:N.units}:{},...N.idempotency_recorded!==void 0?{idempotencyRecorded:N.idempotency_recorded}:{}};if(N.idempotency_recorded===!1)W.warn("服务端幂等登记未写成:本次调用不受幂等保护——字节相同的重发会真的重算并重新计费。");if(V==="shadow"){if(U.length)W.warn(`shadow 对拍发现 ${U.length} 处差异(**不切流,本轮仍用本地产物**):
|
|
200
|
+
${U.slice(0,5).join(`
|
|
201
|
+
`)}`+(U.length>5?`
|
|
202
|
+
…另有 ${U.length-5} 处`:""));else W.info("shadow 对拍:服务端产物与本地逐字节一致。");return{outcome:K,source:"local",...F}}if(X.selfCheck!==!1&&U.length)return W.warn(`本地复算自校验不一致(${U.length} 处),本轮弃用服务端产物、改用本地编排:
|
|
203
|
+
${U.slice(0,5).join(`
|
|
204
|
+
`)}`+(U.length>5?`
|
|
205
|
+
…另有 ${U.length-5} 处`:"")+`
|
|
206
|
+
⚠️ 本次调用服务端已执行并计费(编排量 ${N.units??"?"}),而产物被我们丢弃了。`+"成片不受影响,但这笔账你花得不明不白——请把这条反馈给我们。"),{outcome:K,source:"local",fallback:"self_check_failed",...F};return{outcome:q,source:"cloud",...F}}import{createHash as hR}from"node:crypto";var y0=2;function JW(Z){return hR("sha256").update(Z.normalize("NFC")).digest("hex").slice(0,32)}function bR(Z,Q){let Y=Q.find((J)=>J.track_st<=Z.track_mid&&Z.track_mid<J.track_ed);if(!Y)return null;return{beat:Z.beat,sentenceId:Z.id,sentence:Z.text,clipId:Y.clip_id,sourceSec:Math.round((Y.clip_st+(Z.track_mid-Y.track_st))*1000)/1000,segStart:Y.clip_st}}function gR(Z,Q,Y){let J=JSON.parse(JSON.stringify(Z)),z=!1;for(let X of J.beats)for(let W of X.queries??[])for(let V of W.results??[]){if(V.clip_id!==Q||!Array.isArray(V.segments))continue;let K=V.segments.length;if(V.segments=V.segments.filter((G)=>!(G.start<=Y&&Y<=G.end)),V.segments.length!==K)z=!0}return{plan:J,dropped:z}}var uR={info:()=>{},warn:()=>{}};async function zW(Z,Q,Y){let J=Y.log??uR,z=Z,X=await Y.arrange(z),W=[],V=[],K=!1;if(Q.length===0)return{outcome:X,plan:z,rounds:0,roundRecords:W,residual:V,hitRoundCap:K};for(let G=0;G<y0;G++){let $=Y.slotsOf(X),H=Q.map((C)=>bR(C,$)).filter((C)=>C!==null);if(H.length===0){J.info("编排期 QC:卡点句区间没有已铺槽位,本轮无可判定项。");break}let N=H.map((C)=>Y.cache?.get(C.clipId,Math.round(C.sourceSec*1000),JW(C.sentence))),q=H.filter((C,T)=>N[T]===void 0),U=q.length?await Y.judge(q):[];if(U.length!==q.length)throw Error(`编排期 QC 判定条数不对位(要判 ${q.length} 条,回了 ${U.length} 条)`);let F=0,M=H.map((C,T)=>{let _=N[T];if(_)return _;let P=U[F++];return Y.cache?.put(C.clipId,Math.round(C.sourceSec*1000),JW(C.sentence),P),P}),R=H.filter((C,T)=>M[T].verdict==="mismatch");if(W.push({round:G,judged:H.length,mismatched:R,cacheHits:N.filter((C)=>C!==void 0).length}),R.length===0){J.info(`编排期 QC:卡点句 ${H.length} 句全部对得上(第 ${G+1} 轮,零渲染)。`),V=[];break}if(G===y0-1){V=R,K=!0;break}let D=z,O=!1;for(let C of R){let T=gR(D,C.clipId,C.sourceSec);D=T.plan,O=O||T.dropped}if(!O){J.warn(`编排期 QC:${R.length} 句没对上,但对应的候选段在 plan 里找不到、无从替换——本轮如实登记,不再空转。`),V=R;break}J.info(`编排期 QC:${R.length} 句没对上,换候选重排(第 ${G+2} 轮 / 上限 ${y0})。`),z=D,X=await Y.arrange(z)}if(V.length){let G=V.map(($)=>`「${$.sentence}」(${$.beat})`).join("、");J.warn(`编排期 QC:${V.length} 句卡点句到${K?`轮数上限(${y0} 轮)`:"可换候选用尽时"}仍未对上,`+`已如实登记、工程照常交付:${G}
|
|
207
|
+
`+"——这几句的画面没给到稿子说的东西。可换个检索词重跑,或在 plan 里手动挑一条候选。")}return{outcome:X,plan:z,rounds:W.length,roundRecords:W,residual:V,hitRoundCap:K}}function XW(Z){let Q={unknown:[],clean:0,withCuts:0};for(let Y of Z)if(Y.cuts===void 0)Q.unknown.push({beat:Y.beat,clipId:Y.clipId});else if(Y.cuts.length===0)Q.clean++;else Q.withCuts++;return Q}function WW(Z){if(Z.unknown.length===0)return null;let Q=Z.unknown.length+Z.clean+Z.withCuts,Y=[...new Set(Z.unknown.map((J)=>J.beat))];return`闪帧风险**不可判**:${Q} 颗落位镜头里有 ${Z.unknown.length} 颗取自**没扫过切点**的素材`+`(${Y.slice(0,5).join("、")}${Y.length>5?` 等 ${Y.length} 个段`:""})。
|
|
208
208
|
`+`这不是「有闪帧」,是「不知道有没有」——那些段里若藏着场景切点,铺轨的端点残片收缩这一步
|
|
209
|
-
`+"在它们身上等于没开,成片可能出现一闪而过的异景。跑 `gtrk matrix index --dirs <素材夹> --rebuild`\n"+"补上切点数据后重铺即可判定;不补也能交片,只是这条风险留在暗处。"}import{existsSync as
|
|
210
|
-
`,J);J=X<0?Z.length:X;continue}if(z==="/"&&Z[J+1]==="*"){let X=Z.indexOf("*/",J+2);J=X<0?Z.length:X+1;continue}if(z==="{")Y++;else if(z==="}"&&--Y===0)return Z.slice(Q+1,J)}return Z.slice(Q+1)}function
|
|
211
|
-
`)Q[X]=" ";Y=z}return Q.join("")}function
|
|
212
|
-
`?X:" "),z=Y;while(z){let X=z.index+z[0].length,
|
|
213
|
-
`)Q[K]=" "},J=new Set(["(","[","{","=",":",",",";","!","?","&","|","+","-","*","%","^","~","<",">"]),z=new Set(["return","case","throw","else","do","yield","await"]),X=(
|
|
214
|
-
`,
|
|
215
|
-
`)break;if(Z[$]==="[")K=!0;else if(Z[$]==="]")K=!1;else if(Z[$]==="/"&&!K){G=$+1;while(G<Z.length&&/[A-Za-z]/.test(Z[G]))G++;break}}if(G<0)continue;Y(
|
|
216
|
-
`)Q[X]=" ";Y=z}return Q.join("")}function
|
|
217
|
-
`,J);J=X<0?Z.length:X;continue}if(z==="/"&&Z[J+1]==="*"){let X=Z.indexOf("*/",J+2);J=X<0?Z.length:X+1;continue}if(z==="(")Y++;else if(z===")"&&--Y===0)return J}return-1}function N8(Z,Q){while(Q<Z.length&&/\s/.test(Z[Q]))Q++;return Q}function
|
|
218
|
-
`)&&z===0&&X===0&&
|
|
219
|
-
${
|
|
220
|
-
`)[0]}else if(G=/^([A-Za-z_$][\w$]*)/.exec(W))K=PW(Z,G[1]);if(K&&AW(Z,K,2,new Set))Q.add(X)}let z=[];if(/\.\s*seek\s*=(?!=)|\[\s*["']seek["']\s*\]\s*=(?!=)/.test(Z))z.push("重新赋值 `.seek`");for(let X of Z.matchAll(/window\s*\.\s*__timelines\s*\[[^\]]*\]\s*=\s*([^;\n]*)/g)){let V=X[1].split("//")[0].trim();if(V&&!/^[A-Za-z_$][\w$]*$/.test(V)){z.push("`__timelines[…]` 被赋成包装对象而非时间线本体");break}}return{callbackDom:Q.size>0,hooks:jW.filter((X)=>Q.has(X)),engineApiOverride:z.length>0,overrideForms:z}}var EW=/^[+-]?(?:\d+\.?\d*|\.\d+)(?:px|em|rem|pt|%|vh|vw|vmin|vmax|ch|ex|cm|mm|in|pc|q)?$/i;function IW(Z){let Q=Z.trim();if(!EW.test(Q))return!1;return Number.parseFloat(Q)!==0}function OQ(Z,Q){let Y=o0(Z,Q);return Y<0?null:Z.slice(Q+1,Y)}function XD(Z){let Q=[],Y=0,J="";for(let z=0;z<Z.length;z++){let X=Z[z];if(X==="(")Y++;else if(X===")")Y=Math.max(0,Y-1);if(Y===0&&/\s/.test(X)){if(J)Q.push(J);J="";continue}J+=X}if(J)Q.push(J);return Q}function WD(Z){let Q=XD(Z).filter((Y)=>EW.test(Y));return Q.length>=3&&IW(Q[2])}function H1(Z,Q){let Y=Z.toLowerCase();for(let J of Y.matchAll(/\bblur\s*\(/g)){let z=OQ(Y,J.index+J[0].length-1);if(z!==null&&IW(z))return!0}for(let J of Y.matchAll(/\bdrop-shadow\s*\(/g)){let z=OQ(Y,J.index+J[0].length-1);if(z!==null&&WD(z))return!0}for(let J of Y.matchAll(/\burl\s*\(/g)){let z=OQ(Y,J.index+J[0].length-1);if(z===null)continue;let X=z.trim().replace(/^["']|["']$/g,"").replace(/^#/,"");if(X&&Q.has(X))return!0}return!1}function VD(Z){for(let Q of Z.matchAll(/<fe(GaussianBlur|DropShadow)\b[^>]*>/gi)){let Y=Q8(Q[0],"stdDeviation");if(Y===void 0){if(Q[1].toLowerCase()==="dropshadow")return!0;continue}if(Y.trim().split(/[\s,]+/).some((J)=>/^[+-]?(?:\d+\.?\d*|\.\d+)$/.test(J)&&Number.parseFloat(J)!==0))return!0}return!1}function KD(Z){let Q=new Set;for(let Y of Z.matchAll(/<filter\b([^>]*)>([\s\S]*?)<\/filter\s*>/gi)){let J=Q8(`<filter${Y[1]}>`,"id");if(J&&VD(Y[2]))Q.add(J)}return Q}function RW(Z){let Q=[];for(let Y of Z.matchAll(/(?:^|[;{}\s])\s*(?:-webkit-)?(?:backdrop-)?filter\s*:\s*([^;}]*)/gi))Q.push(Y[1].trim());return Q}function GD(Z){let Q=[];for(let Y of Z.matchAll(/<style\b[^>]*>([\s\S]*?)<\/style\s*>/gi)){let J=Y[1].replace(/\/\*[\s\S]*?\*\//g," "),z=[],X=[],V=0;for(let W=0;W<J.length;W++){let K=J[W];if(K==='"'||K==="'"){W=B8(J,W);continue}if(K==="{")z.push(W),X.push(J.slice(V,W)),V=W+1;else if(K==="}"){let G=z.pop(),$=X.pop()??"";if(V=W+1,G===void 0)continue;let H=J.slice(G+1,W);for(let N="";H!==N;)N=H,H=H.replace(/\{[^{}]*\}/g," ");Q.push({selector:$.trim(),own:H})}else if(K===";")V=W+1}}return Q}function SW(Z,Q){let Y=0;for(let J=Q;J<Z.length;J++){let z=Z[J];if(z==='"'||z==="'"||z==="`"){J=B8(Z,J);continue}if(z==="("||z==="["||z==="{")Y++;else if(z===")"||z==="]"||z==="}"){if(Y===0)return Z.slice(Q,J);Y--}else if(z===","&&Y===0)return Z.slice(Q,J)}return Z.slice(Q)}function vW(Z){let Q=Z.trim();if(Q.length<2)return null;let Y=Q[0];if((Y==='"'||Y==="'")&&Q.endsWith(Y)&&B8(Q,0)===Q.length-1)return Q.slice(1,-1);if(Y==="`"&&Q.endsWith("`")&&B8(Q,0)===Q.length-1&&!Q.includes("${"))return Q.slice(1,-1);return null}function $D(Z){let Q=[],Y=/\.\s*(?:to|from|fromTo|set)\s*\(/g,J;while(J=Y.exec(Z)){let z=J.index+J[0].length-1,X=OQ(Z,z);if(X===null)continue;for(let V=0;V<X.length;V++){let W=X[V];if(W==='"'||W==="'"||W==="`"){V=B8(X,V);continue}if(W!=="{")continue;let K=w8(X,V);Q.push(K),V+=K.length+1}Y.lastIndex=z+1}return Q}var HD=/^(?:transform|x|y|z|xPercent|yPercent|scale|scaleX|scaleY|scaleZ|rotate|rotation|rotationX|rotationY|rotationZ|skew|skewX|skewY|translateX|translateY|translateZ)$/,qD=/^(?:to|from|fromTo)$/;function r7(Z){let Q=[];for(let Y of Z.split(",")){let J=Y.trim().split(/[\s>+~]+/).filter(Boolean).pop();if(!J)continue;let z=J.split(/[:\[]/)[0];for(let X of z.matchAll(/([.#])([A-Za-z_][\w-]*)/g))Q.push(`${X[1]==="#"?"id":"class"}:${X[2]}`)}return Q}function UD(Z){let Q=[],Y=Q8(Z,"id");if(Y)Q.push(`id:${Y.trim()}`);for(let J of(Q8(Z,"class")??"").trim().split(/\s+/))if(J)Q.push(`class:${J}`);return Q}function ND(Z){let Q=[],Y=/\.\s*(to|from|fromTo|set)\s*\(/g,J;while(J=Y.exec(Z)){let z=J.index+J[0].length-1,X=OQ(Z,z);if(Y.lastIndex=z+1,X===null)continue;let V=SW(X,0),W=[];for(let K=0;K<X.length;K++){let G=X[K];if(G==='"'||G==="'"||G==="`"){K=B8(X,K);continue}if(G!=="{")continue;let $=w8(X,K);W.push($),K+=$.length+1}Q.push({method:J[1],target:V,bodies:W})}return Q}function BD(Z){let Q=new Map,Y=/([A-Za-z_$][\w$]*)\s*=\s*(?:[A-Za-z_$][\w$]*\s*\.\s*)?([A-Za-z_$][\w$]*)\s*\(\s*(["'])(.*?)\3\s*\)/g;for(let J of Z.matchAll(Y)){let[,z,X,,V]=J,W=X==="getElementById"?[`id:${V.trim()}`]:/^\s*[.#]/.test(V)?r7(V):[];if(!W.length)continue;let K=Q.get(z)??[];Q.set(z,[...new Set([...K,...W])])}return Q}function jD(Z,Q){let Y=Z.trim(),J=vW(Y);if(J!==null)return/^\s*[.#]/.test(J)?r7(J):[];if(/^[A-Za-z_$][\w$]*$/.test(Y))return Q.get(Y)??[];return[]}function FD(Z){let Q=[],Y=0,J=!0;for(let z=0;z<Z.length;z++){let X=Z[z];if(X==='"'||X==="'"||X==="`"){if(Y===0&&J){let V=B8(Z,z),W=Z.slice(z+1,V),K=Z.slice(V+1);if(/^\s*:/.test(K))Q.push(W),J=!1}z=B8(Z,z);continue}if(X==="("||X==="["||X==="{")Y++;else if(X===")"||X==="]"||X==="}")Y=Math.max(0,Y-1);else if(X===","&&Y===0)J=!0;else if(Y===0&&J&&/[A-Za-z_$]/.test(X)){let V=/^([A-Za-z_$][\w$]*)\s*:/.exec(Z.slice(z));if(V)Q.push(V[1]),J=!1,z+=V[1].length}}return Q}function MD(Z){let Q=CW(Z),Y=KD(Q),J=[],z=[],X=[],V=[],W=($,H)=>{let N=H.replace(/\s+/g," ").trim().slice(0,120);if(!$.includes(N))$.push(N)},K=new Map;for(let{selector:$,own:H}of GD(Q)){let N=RW(H).filter((U)=>H1(U,Y));if(!N.length)continue;if(o7(H))W(z,`<style> 规则:filter:${N[0]}`);for(let U of r7($))if(!K.has(U))K.set(U,`<style> 规则 ${$.slice(0,60)}:filter:${N[0]}`)}for(let $ of Q.matchAll(/<[a-zA-Z][^>]*>/g)){let H=$[0],N=Q8(H,"style")??"",U=RW(N).filter((R)=>H1(R,Y)),q=Q8(H,"filter"),M=q!==void 0&&H1(q,Y)?q:null;if(!U.length&&M===null)continue;let F=U.length?`内联 style:filter:${U[0]}`:`SVG 属性:filter="${M}"`;for(let R of UD(H))if(!K.has(R))K.set(R,F);if(!o7(N))continue;W(z,F)}let G=TW(_W(Q));for(let $ of $D(G)){for(let H of $.matchAll(/(?:^|[{,])\s*["']?(filter|webkitFilter|WebkitFilter|-webkit-filter)["']?\s*:/g)){let N=SW($,H.index+H[0].length),U=vW(N);if(U===null)W(V,`补间属性 ${H[1]}:${N}`);else if(H1(U,Y))W(J,`补间属性 ${H[1]}:"${U}"`)}if(Y.size&&/(?:^|[{,])\s*["']?stdDeviation["']?\s*:/.test($))W(J,"补间驱动 SVG 滤镜基元的 stdDeviation")}if(K.size){let $=BD(G);for(let{method:H,target:N,bodies:U}of ND(G)){if(!qD.test(H))continue;if(!U.some((M)=>FD(M).some((F)=>HD.test(F))))continue;for(let M of jD(N,$)){let F=K.get(M);if(F)W(X,`${F} —— 而 \`.${H}(${N.trim().slice(0,30)}, …)\` 驱动了它的 transform`)}}}return{animated:J,staticFullBleed:z,staticTransformed:X,indeterminate:V}}function LQ(Z,Q={}){let Y=[],J=(q,M,F)=>Y.push({law:q,fatal:M,msg:F});if(!/<template[\s>]/i.test(Z))J("1-template",!0,"缺 <template> 包裹根元素(裸 div 整片渲染失败)");{let q=Z.search(/<\/template>/i);if(q>=0){if(Z.lastIndexOf("<script")>q)J("1b-script-outside-template",!0,"存在 </template> 之后的 <script>——客户端只挂载并执行 template 内的脚本,外部脚本恒不执行(__timelines 不注册 → 颗粒空白)。把全部 <script> 移入根元素内部末尾")}}let z=DW(Z),X=z?Q8(z,"data-composition-id"):void 0;if(!z||!X)J("1-composition-id",!0,"根元素缺 data-composition-id");if(Q.compositionId&&X&&Q.compositionId!==X)J("1-cid-expect",!0,`HTML 内 data-composition-id「${X}」与期望 id「${Q.compositionId}」不符(复制改名漏改内部 id?)——`+`按期望 id 落轨会写出 clip_id/material 指向「${Q.compositionId}」,而本文件注册的是 __timelines["${X}"],渲染必错`);if(z){if(Q8(z,"data-width")!=="1920")J("1-width",!0,`根 data-width 应为 "1920"(实为 ${Q8(z,"data-width")??"缺"})`);if(Q8(z,"data-height")!=="1080")J("1-height",!0,`根 data-height 应为 "1080"(实为 ${Q8(z,"data-height")??"缺"})`)}if(!/gsap\.timeline\s*\(\s*\{[^}]*\bpaused\s*:\s*true\b[^}]*\}\s*\)/.test(Z))J("2-paused",!0,"缺 gsap.timeline({ paused: true })");let V=Z.match(/window\.__timelines\s*\[\s*(["']([^"']+)["']|[A-Za-z_$][\w$]*)\s*\]\s*=/);if(!V)J("2-register",!0,"缺 window.__timelines[<id>] = 注册");else{let q=V[2];if(q===void 0){let M=V[1];if(q=Z.match(new RegExp(`(?:var|const|let)\\s+${M}\\s*=\\s*["']([^"']+)["']`))?.[1],!q)J("2-register",!0,`__timelines[${M}] 的 ${M} 未见字面串赋值,无法静态判定注册 id`)}if(X&&q!==void 0&&q!==X)J("2-id-match",!0,`__timelines 注册 id "${q}" 与 data-composition-id "${X}" 不一致`)}if(/Math\.random\s*\(/.test(Z))J("3-random",!0,"含 Math.random()(破 StaticGuard,逐帧不确定)");if(/Date\.now\s*\(/.test(Z))J("3-date-now",!0,"含 Date.now()");if(/new\s+Date\s*\(\s*\)/.test(Z))J("3-new-date",!0,"含无参 new Date()");for(let q of Z.matchAll(/<script\b[^>]*\bsrc\s*=\s*["']([^"']+)["']/gi)){let M=q[1];if(!/^https?:\/\//i.test(M))J("4-script-rel",!0,`<script src> 非 http(s) 绝对 url:${M}`);else if(cR.some((F)=>F.test(M)))J("5-cdn-jsdelivr",!1,`CDN 用 jsdelivr(国内渲染机不稳,建议 lib.baomitu.com):${M}`);else if(!mR.some((F)=>F.test(M)))J("5-cdn-unknown",!1,`CDN 不在已知可达白名单(渲染机可能拉不到):${M}`)}for(let[q,M]of[[/<img\b[^>]*\bsrc\s*=\s*["'](?!https?:|data:)[^"']+["']/gi,"<img src>"],[/<link\b[^>]*\bhref\s*=\s*["'](?!https?:|data:)[^"']+["']/gi,"<link href>"],[/<use\b[^>]*\b(?:xlink:)?href\s*=\s*["'](?!#|https?:|data:)[^"']+["']/gi,"<use href>"],[/\burl\(\s*["']?(?!https?:|data:|#)[^)"']+["']?\s*\)/gi,"css url()"]])if(q.test(Z))J("4-rel-asset",!0,`含相对外链 ${M}(违反自包含,渲染机读不到)`);let{opaque:W,declared:K,solidOnRoot:G,solidOnChild:$}=pR(z,dR(Z,z));if(z&&!K)J("4-bg-explicit",!1,"根与根下首个全幅子层**都**没有显式声明 background(契约铁律4③:透明与否 MUST 显式)——"+"满屏颗粒应在根下第一个全幅子层(position:absolute;inset:0)声明实心底;"+"透明叠加颗粒应在根显式写 background:transparent。缺省按透明叠加 opaque=false 处理");if(G&&!$)J("4-bg-on-root",!1,"实心底写在**根 style** 上(契约铁律4①②:MUST 下沉为根下第一个全幅子层,根 MUST 保持零视觉)——"+"**根元素的绘制属性会在子合成挂载时被丢弃**,这层底在成片里一个像素都不落地:"+"前景照常渲出、底没了、底轨透出来,观感是「浮空面板」;而本地播放器与客户端预览都看不出(2026-07-26 r69 真渲实测,见契约铁律4证据锚)。"+"改法是机械的:把这条 background 声明整体搬到根下新增的第一个全幅子层"+'(<div style="position:absolute;inset:0;background:<原底色>;z-index:0;"></div>),根上改写 background:transparent');if(/var\(\s*--/.test(Z))J("6-css-var",!0,"含 CSS var(--...)(Hyperframes 不解析→整片全黑,须字面值)");let H=zD(Z);if(H.engineApiOverride)J("x-engine-api-override",!1,`颗粒在运行时覆写了渲染引擎所调用的 API(${H.overrideForms.join("、")})——它会推翻引擎**显式**传入的 `+"seek(t, true)(颗粒无权静默否决引擎意图),且只在引擎恰好走 seek 时有效,引擎改走 time() / progress() 即完全失效。"+"按契约「回调与 seek 语义」,回调可达性应由**引擎侧**承担,颗粒侧垫片属过渡态——"+"引擎侧结论已于 2026-07-26 经真机核实(引擎 producer 0.6.101 定帧时回调可达),既有垫片可择期清理(删后须重渲复验),新颗粒不应再加");if(H.callbackDom&&!H.engineApiOverride)J("x-callback-driven",!1,`画面靠时间线回调驱动(${H.hooks.join(" / ")} 体内写 DOM),且本颗粒无任何 seek 兜底。`+"该写法**合规**——其可达性由契约「回调与 seek 语义」的**引擎侧 MUST 条款**保证"+"(2026-07-26 已真机核实:引擎 producer 0.6.101 定帧时回调可达;结论**绑定该引擎版本**),"+"作者不必也不应为此加装 tl.seek 垫片。本项只是**哨兵**:引擎若失守或换实现,补间属性照常插值、回调不跑 → "+"画面会静默定格在初始态(不是黑屏,本地播放器与客户端预览都看不出)");let N=[/\brequestAnimationFrame\s*\(/.test(Z)?"requestAnimationFrame(":null,/\bsetInterval\s*\(/.test(Z)?"setInterval(":null].filter(Boolean);if(N.length)J("x-raf-interval",!1,`含 ${N.join(" 与 ")}——这类自有时钟**不被 seek 驱动**,逐帧渲染时等于冻结(契约:所有视觉变化必须挂在 tl 上)。`+"静态正则分不清「驱动画面」与其它用途(如一次性布局测量),故只提醒、不拦");if(Q.dispatchIds&&X&&!Q.dispatchIds.includes(X))J("x-dispatch",!1,`composition_id "${X}" 不在 dispatch.mg 派单中`);if(Q.category&&Q.category in BW){let q=BW[Q.category];if(q!==W)J("x-category-opaque",!1,`category「${Q.category}」期望${q?"不透明满屏":"透明叠加"},但颗粒 HTML 反推为${W?"不透明满屏":"透明叠加"}(以 HTML 为准落 clip.opaque=${W})`)}if(typeof Q.slotDuration==="number"&&Q.slotDuration>0){let q=Q.slotDuration,{est:M,parsed:F,skipped:R,hasInfiniteRepeat:O}=oR(Z);if(O)J("7-infinite-repeat",!1,`含 repeat:-1 无限循环 → tl 时长为 Infinity,铁律⑦(总长 ≥ 坑位)无法静态验证;请改用按坑位算死的有限 repeat(次数 = ceil(剩余时长 / 单圈时长)),坑位包络 ${q}s`);if(F===0)J("7-no-estimate",!1,`无法静态估长(无一条可解析的时长调用${R?`,${R} 条因表达式 position / 非字面量 duration 跳过`:""}),铁律⑦未校验——须真渲染引擎 seek 验收颗粒是否占满坑位 ${q}s 并终态驻留`);else if(Number.isFinite(M)&&M<q)J("7-fill-slot",!1,`时间线静态估长 ~${M}s,短于槽位包络 ${q}s(铁律⑦:颗粒应占满坑位并终态驻留)——静态估算是**下界**(${R} 条调用因无法静态解析被跳过),仅供参考,最终以真渲染引擎逐帧为准`)}for(let q of JD(Z)){if(q.perElementDriven||q.count!==null&&q.count<sR)continue;let M=q.count===null?"条数未知(循环边界非数字字面量)":`静态估算 ${q.count} 个`;J("8-primitive-merge",!1,`${q.site} 向同一父节点「${q.parent}」循环生成 ${M} <${q.tag}>。`+"这里有一批可无损合并的重复图元:请按相同 stroke/fill 分档合并成单个 <path> 的多子路径;"+"合并后画面逐像素不变,属零成本改法。本项只提示写法形态,最终画面仍以真渲染出片为准")}let U=MD(Z);if(U.animated.length)J("c-filter-animated",!1,`时间线补间直接驱动了真卷积滤镜(${U.animated.slice(0,3).join(";")})——`+"blur / drop-shadow / feGaussianBlur 是**真卷积**,每帧成本 ∝「被覆盖面积 × 半径 × 帧数」;"+"一旦被补间驱动,卷积结果**每帧失效**、缓存彻底失灵,这是本组三项里成本机制最重的一项。"+"改法:用 `opacity` / `transform`(`scale` / 位移)表达同一叙事动作;"+"确需滤镜就做成**静态两态切换**(滤镜值不随时间连续变),并把被滤元素的几何覆盖面积收到真正需要的那块矩形上。"+"本项是**成本提示**,不影响 ok / 退出码 / 铺轨;**未报 ≠ 这颗便宜**——真判据是真渲染出片计时");if(U.staticFullBleed.length)J("c-filter-static-fullbleed",!1,`整幅静态真卷积滤镜(${U.staticFullBleed.slice(0,3).join(";")})——该声明自身即全幅`+"(`position:absolute|fixed` + `inset:0` 或等价铺满),于是每帧都要对整幅做一次卷积。"+"**首选改法:缩小被滤镜覆盖的几何面积**(把滤镜收到它真正需要的那块矩形上——面积一项同时压掉卷积与整幅逐帧合成两笔成本);"+"次选把静态滤镜结果**预烘成图**,且 MUST 用 **RGBA PNG**(透明叠加颗粒的 alpha 是成片合成的必需通道,"+"烘成 JPEG 或任何无 alpha 格式会在成片里塌成不透明色块),但预烘只消得掉卷积、消不掉整幅逐帧合成,收益有上限、必有残差。"+"去不去滤镜属审美取值,判断权在作者:本项只给信息与改法,**恒非致命**、不拦铺轨;未报 ≠ 便宜,真判据是真渲染出片计时");if(U.staticTransformed.length)J("c-filter-static-transformed",!1,`静态真卷积滤镜的元素,其 transform 被补间驱动(${U.staticTransformed.slice(0,3).join(";")})——`+"滤镜值本身不变,但被滤子树**每帧换一个几何**,卷积结果每帧失效、必须重算,"+"与 `c-filter-animated` 是**同一类缓存失效**,只是驱动源从滤镜值换成了 transform。"+"r69 真渲实测:同颗粒对照下这一档 **+42.7%**,比「补间驱动 blur」的 +36.2% **还贵**——它是本组里最容易被忽略的一档。"+"改法(按优先级):① 把滤镜移到**不参与位移/缩放**的那一层(滤镜层与运动层拆开,运动交给外层容器);"+"② 缩小被滤元素的几何覆盖面积;③ 把静态滤镜结果**预烘成 RGBA PNG** 再让它随 transform 走(预烘图平移是零卷积)。"+"⚠️ 射程只收 `transform`:`opacity` 被补间驱动**不在本项射程**(opacity 侧尚无对照实测,不凭推测扩)。"+"本项恒非致命、不拦铺轨;未报 ≠ 便宜,真判据是真渲染出片计时");if(U.indeterminate.length)J("c-filter-indeterminate",!1,`该处 filter 值无法静态判定是否含真卷积(${U.indeterminate.slice(0,3).join(";")})——`+"补间值不是字符串字面量(变量 / 模板串 / 函数返回),本 lint 不做表达式求值与常量折叠,"+"故对该处**未作判定**:既不是「判过且通过」,也不是命中。请人工确认它是否会驱动 blur / drop-shadow;"+"若是,按 `c-filter-animated` 的改法处理。本项恒非致命、不拦铺轨");return{ok:!Y.some((q)=>q.fatal),violations:Y,opaque:W,compositionId:X}}var U1="html_render_simple",a7=/-B\d+(?:-aux\d+)?$/,PD=["com.lveditor.draft","JianyingPro"];function LD(Z,Q){return yW(Q??N1("mg-render",Z))}function s7(Z){let Q=Z.toLowerCase();for(let Y of PD)if(Q.includes(Y.toLowerCase()))throw Error(`产物落点纪律:不写剪映草稿目录(${Z})——MOV 落普通目录后由你拖进剪映,素材归属才清晰。换个 --out 目录。`)}function CD(Z){let Q=/data-width\s*=\s*["'](\d+)["']/.exec(Z),Y=/data-height\s*=\s*["'](\d+)["']/.exec(Z);if(!Q||!Y)return;return{width:Number(Q[1]),height:Number(Y[1])}}async function xW(Z,Q={}){if(!Number.isFinite(Z.duration)||Z.duration<=0)throw Error("--duration <sec> 必填且须为正数(秒)——独立模式无坑位包络,它就是时长锚(lint 包络 = 成片时长 = 计费时长)。");let Y=Z.format??"qtrle";if(Y!=="qtrle")throw Error(Y==="webm"?"--format webm 暂不支持:剪映不吃 VP8-alpha,本模式首发只出 qtrle(QuickTime Animation alpha MOV,剪映真透底)。":`--format 仅支持 qtrle(收到「${Y}」)。`);let J=yW(Z.file),z=await DD(J,"utf8"),X=CD(z);if(X&&!(X.width===1920&&X.height===1080))return j.err(`颗粒几何 ${X.width}×${X.height}:gsap-emit v1 契约未开竖屏/异形口,首发仅 1920×1080——不静默出坏片。`),{ok:!1,mode:"render",reason:"geometry",geometry:X};let V=RD(J).replace(/\.html?$/i,""),W=LQ(z,{slotDuration:Z.duration,...a7.test(V)?{compositionId:V}:{}});for(let P of W.violations)(P.fatal?j.err:j.warn)(`${P.fatal?"✗":"·"} ${P.law}: ${P.msg}`);if(!W.ok)return j.err(`lint 未过(${W.violations.filter((P)=>P.fatal).length} 项致命)——未提交云任务,零计费。`),{ok:!1,mode:"render",reason:"lint",violations:W.violations};let K=q1(z)??V,G=LD(K,Z.out);s7(G);let $=Math.round(Z.duration/60*1e4)/1e4,{billingHint:H}=await(Q.resolvePricing??g8)(U1,"独立颗粒渲染(qtrle 透明 MOV)");if(j.warn(`计费提示:${H}`),j.warn(`CLI 无本地 HTML 渲染引擎——独立颗粒唯一路 = 云渲计费任务;本次 ${Z.duration}s ≈ ${$} 分钟计费时长。`),!Z.yes){if(!await(Q.confirm??_D)("确认提交云渲?"))return j.warn("已取消:零云端调用、零计费。"),{ok:!1,mode:"render",reason:"declined",declined:!0,composition_id:K}}let N=(Q.loadCfg??FZ)(),U={composition:{video_size:{width:1920,height:1080},tracks:[],beats:[{html:z,start:0,duration:Z.duration}],assets:{file_id:{}}},render:{output_format:"qtrle"}},q=await(Q.submitTask??J8)(N,U1,U),M=Q.now??(()=>new Date().toISOString());await OD(G,{recursive:!0}),await wW(N1(G,"task.json"),JSON.stringify({task_type:U1,task_id:q,composition_id:K,source:J,duration_sec:Z.duration,output_format:"qtrle",submitted_at:M()},null,2)),j.step(`▶ 已提交云渲(task_id=${q}),轮询中…`);let F=await(Q.pollTask??N9)(N,U1,q,(P,D)=>j.info(`${P}${typeof D==="number"?` ${D}%`:""}`)),R=typeof F.download_url==="string"?F.download_url:void 0;if(!R)throw Error(`任务完成但 output_result 缺 download_url(task_id=${q},面包屑在 ${G})`);let O=N1(G,`${K}.mov`);return await(Q.download??h8)(R,O),await wW(N1(G,"result.json"),JSON.stringify({ok:!0,task_id:q,composition_id:K,output:`${K}.mov`,duration_sec:Z.duration,file_id:F.file_id??null,completed_at:M()},null,2)),j.ok(`渲染完成:${O}(qtrle 透明 MOV,直接拖进剪映即用)`),{ok:!0,mode:"render",composition_id:K,task_id:q,output:O,outDir:G,duration:Z.duration}}async function _D(Z){let{createInterface:Q}=await import("node:readline/promises"),Y=Q({input:process.stdin,output:process.stderr});try{let J=(await Y.question(`${Z} [y/N] `)).trim().toLowerCase();return J==="y"||J==="yes"}finally{Y.close()}}var kW=500,SD="未购授予",vD="clip_id 非法",wD="对该素材的关键词跑一次计费检索(gtrk matrix search)即获持久授予,之后可无限免费重签",yD="若该 id 是图片/音频素材:重签面现仅覆盖视频 clip 原片,属暂不支持;若是视频素材则多半已下架/不在库";function xD(Z){return AD(Z??"matrix-fetch")}function kD(Z){try{let Q=new URL(Z).pathname,Y=/\.([A-Za-z0-9]{1,5})$/.exec(Q);return Y?Y[1].toLowerCase():"bin"}catch{return"bin"}}function fD(Z){return(Z??[]).map((Q)=>{let Y=String(Q?.clip_id??""),J=String(Q?.reason??"未知原因");if(J===SD)return{clip_id:Y,reason:J,hint:wD};if(J===vD)return{clip_id:Y,reason:J};return{clip_id:Y,reason:J,hint:yD}})}async function hD(Z,Q,Y=fetch){let J=await Y(`${Z.base}/task/material_resign`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify({clip_ids:Q})}),z=await aZ(J);if(z.code!==200)throw new PZ(z.code,`原片重签失败 (code=${z.code??"?"}):${z.msg??"未知错误"}`);return{clips:z.data?.clips??[],missing:z.data?.missing??[]}}async function fW(Z,Q={}){let Y=[...new Set(Z.clipIds.map((N)=>N.trim()).filter(Boolean))];if(!Y.length)throw Error("用法:gtrk matrix fetch <clip_id...> [--out <dir>]——clip_id 来自 matrix search 的候选结果");if(Y.length>kW)throw Error(`单批最多 ${kW} 条(收到 ${Y.length})——分批再跑;授予持久、重签免费,分几批都不花钱`);let J=xD(Z.out);s7(J),j.step(`▶ 原片重签 ${Y.length} 条(免费——授予的账在计费检索时已记完)…`);let z=(Q.loadCfg??FZ)(),{clips:X,missing:V}=await hD(z,Y,Q.fetchFn),W=fD(V),K=[],G=[];if(X.length)await ED(J,{recursive:!0});for(let N of X){let U=TD(J,`${N.clip_id}.${kD(N.url)}`);try{await(Q.download??h8)(N.url,U);let q=(await ID(U)).size;K.push({clip_id:N.clip_id,file:U,bytes:q}),j.info(`✓ ${N.clip_id} → ${U}(${(q/1048576).toFixed(1)}MB)`)}catch(q){G.push({clip_id:N.clip_id,reason:q.message}),j.warn(`✗ ${N.clip_id} 下载失败:${q.message}(授予仍在,重跑 fetch 该 id 即可)`)}}for(let N of W)j.warn(`✗ ${N.clip_id}:${N.reason}${N.hint?`——${N.hint}`:""}`);let $=W.length===0&&G.length===0,H=`${K.length}/${Y.length} 落盘 → ${J}${W.length?`(${W.length} 条被拦)`:""}${G.length?`(${G.length} 条下载失败)`:""}`;return($?j.ok:j.warn)(`拉取${$?"完成":"完成(有未落盘项)"}:${H}`),{ok:$,mode:"fetch",requested:Y.length,downloaded:K,missing:W,failed:G,outDir:J}}import{existsSync as bD}from"node:fs";import{resolve as gD}from"node:path";var k9=10,t7=(Z)=>Math.round(Z*1000)/1000;function uD(Z){if(typeof Z!=="string"||Z.trim()==="")return{kind:"none",path:typeof Z==="string"?Z:""};let Q=Z.trim();if(/^https?:\/\//i.test(Q))return{kind:"remote",path:Q};if(/^[a-zA-Z]:[\\/]/.test(Q)||/^[\\/]{2}/.test(Q)||/^[\\/]/.test(Q))return{kind:"absolute",path:Q};return{kind:"relative",path:Q}}var mD=(Z)=>Z.replace(/\\/g,"/").replace(/^\.\//,"");function cD(Z){if(typeof Z.track_ed==="number")return Z.track_ed;if(typeof Z.track_st==="number"&&typeof Z.duration==="number")return t7(Z.track_st+Z.duration);return null}var lD=["video_track","audio_track","beat_track"],dD=["material","html_material"];function nD(Z){let Q=new Map;for(let Y of lD){let J=Z[Y];if(!Array.isArray(J))continue;for(let z of J){if(!z||typeof z!=="object")continue;let X=typeof z.track_index==="number"?z.track_index:null,V=Array.isArray(z.track_timeline)?z.track_timeline:[];for(let W of V){if(!W||typeof W!=="object")continue;for(let K of dD){let G=W[K];if(typeof G!=="string"||G==="")continue;let $=Q.get(G)??[];$.push({track:Y,track_index:X,clip_id:typeof W.clip_id==="string"?W.clip_id:null,track_st:typeof W.track_st==="number"?W.track_st:null,track_ed:cD(W),key:K}),Q.set(G,$)}}}}return Q}function pD(Z){let Q=Z.exists??((H)=>bD(H)),Y=Array.isArray(Z.gtrk.materials)?Z.gtrk.materials:[],J=nD(Z.gtrk),z={relative:0,absolute:0,remote:0,noPath:0},X=[],V=[],W=[],K=0,G="";for(let H of Y){let N=typeof H?.id==="string"?H.id:"",{kind:U,path:q}=uD(H?.path);if(U==="none"){z.noPath++,W.push(N||"(无 id)");continue}if(U==="remote"){z.remote++;continue}z[U]++;let M=U==="relative"?gD(Z.gtrkDir,mD(q)):q,F;try{F=Q(M)}catch(P){if(K++,!G)G=P instanceof Error?P.message:String(P);continue}if(F)continue;let R=J.get(N)??[],O={id:N,path:q,kind:U,resolved:M,referenced:R.length>0,refCount:R.length,refs:R};(U==="relative"?X:V).push(O)}let $=(H,N)=>H.referenced===N.referenced?H.id.localeCompare(N.id):H.referenced?-1:1;return X.sort($),V.sort($),{checked:Y.length,counts:z,dangling:X,danglingReferenced:X.filter((H)=>H.referenced).length,danglingOrphan:X.filter((H)=>!H.referenced).length,external:V,noPathIds:W,...K>0?{degraded:{count:K,reason:G}}:{}}}function B1(Z){try{return pD({gtrk:Z.gtrk,gtrkDir:Z.gtrkDir,exists:Z.exists})}catch(Q){Z.log.warn(`素材落盘自检未能完成(${Q instanceof Error?Q.message:String(Q)})——写回结果与命令判定不受影响。`);return}}function hW(Z){if(Z.dangling.length===0)return`素材落盘自检:${Z.checked} 条素材全部就位`;return`素材落盘自检:${Z.checked} 条素材里有 ${Z.dangling.length} 条的文件不在盘上`+`(被时间线引用 ${Z.danglingReferenced} 条 · 孤儿 ${Z.danglingOrphan} 条)——只报不动,工程与文件零改动。`}function iD(Z){let Q=Z.referenced?"被引用":"孤儿";if(!Z.referenced)return`[${Q}] ${Z.id} → ${Z.path}`;let Y=Z.refs[0],J=Y.track_st!==null?` · ${t7(Y.track_st)}→${Y.track_ed===null?"?":t7(Y.track_ed)}s`:"",z=Z.refCount>1?` 等 ${Z.refCount} 处`:"";return`[${Q}] ${Z.id} → ${Z.path}`+`(${Y.track} track_index=${Y.track_index??"?"} · clip ${Y.clip_id??"?"}${J}${z})`}function j1(Z,Q){if(Z.degraded)Q.warn(`素材落盘自检降级:${Z.degraded.count} 条素材查不了存在性(${Z.degraded.reason})——`+"这几条既不算就位也不算悬空,其余条目照常已查。");if(Z.dangling.length===0)Q.info(hW(Z));else{Q.warn(hW(Z));for(let Y of Z.dangling.slice(0,k9))Q.warn(` ${iD(Y)}`);if(Z.dangling.length>k9)Q.warn(` …等共 ${Z.dangling.length} 条(全量见 --json 的 integrity.dangling)`);Q.info("被引用的悬空 = 时间线上那一段没有素材可放(客户端可能 relink 回落到别的素材);孤儿 = 只在 materials 里挂着、不影响画面。"),Q.info("悬空多半是历史遗留(如客户端「确认原片」下载中断);CLI 只报不删,要修就在客户端重新确认原片、或删掉那条 clip。")}if(Z.external.length>0)Q.warn(`另有 ${Z.external.length} 条**绝对路径**素材当前找不到文件(外接盘/网络盘没挂载也会这样,不计入上面的悬空):`+Z.external.slice(0,k9).map((Y)=>`${Y.id} → ${Y.path}`).join(";")+(Z.external.length>k9?` …等共 ${Z.external.length} 条`:""));if(Z.noPathIds.length>0)Q.warn(`另有 ${Z.noPathIds.length} 条素材没有 path(结构问题,非落盘问题):`+Z.noPathIds.slice(0,k9).join("、")+(Z.noPathIds.length>k9?` …等共 ${Z.noPathIds.length} 条`:""))}var bW="local-";function CQ(Z){return Z.source==="local"||typeof Z.local_path==="string"}function oD(Z){let Q=[];if(Z.source!=="local")Q.push('本地 result 必须带 source:"local" 标记');if(!Z.clip_id.startsWith(bW))Q.push(`clip_id 必须为 ${bW}<blake3-16> 且 MUST NOT 预置 broll- 前缀(得到 ${Z.clip_id})——材料 id 由消费方拼 broll-+clip_id 得出`);if(typeof Z.local_path!=="string"||!Z.local_path)Q.push("本地 result 缺 local_path(素材绝对路径)");for(let J of["url","cover_url","url_ttl_note"])if(J in Z)Q.push(`本地 result MUST NOT 出现 ${J}(无签名过期语义)`);let Y=Z.segments??[];for(let J=1;J<Y.length;J++)if(Y[J].score>Y[J-1].score){Q.push("segments 必须按 score 降序");break}for(let J of Y)if(!(J.start<=J.best&&J.best<=J.end)){Q.push(`segment best 必须落在 [start,end] 内(${J.start}–${J.end} best=${J.best})`);break}return Q}var rD=["duration","width","height","fps"];function aD(Z,Q,Y){if(typeof Z.clip_id!=="string"||!Z.clip_id){Y.push(`${Q}:clip_id 不可编辑——必须为非空字符串(得到 ${JSON.stringify(Z.clip_id)})`);return}if(!(typeof Z.score==="number"&&Number.isFinite(Z.score)))Y.push(`${Q}:score 必须为有限数字(得到 ${JSON.stringify(Z.score)})`);for(let J of rD){let z=Z[J];if(z!==void 0&&!(typeof z==="number"&&Number.isFinite(z)&&z>0))Y.push(`${Q}:几何字段 ${J} 不可编辑——须为正数(得到 ${JSON.stringify(z)})`)}if(Z.segments!==void 0)if(!Array.isArray(Z.segments))Y.push(`${Q}:segments 须为数组(可删段,但不可改形态)`);else for(let J of Z.segments){if(![J?.start,J?.end,J?.best,J?.score].every((X)=>typeof X==="number"&&Number.isFinite(X))){Y.push(`${Q}:segment 四键(start/end/best/score)须为有限数字`);break}if(!(J.start<=J.best&&J.best<=J.end)){Y.push(`${Q}:segment 几何不可编辑——best 必须落在 [start,end] 内(${J.start}–${J.end} best=${J.best})`);break}if(J.motion!==void 0){let X=J.motion,V=(K)=>typeof K==="number"&&Number.isFinite(K);if(!X||typeof X!=="object"||Array.isArray(X)||!V(X.p50)||!V(X.p90)||X.p90<X.p50||!(typeof X.samples==="number"&&Number.isInteger(X.samples)&&X.samples>0)||X.effective_fps!==void 0&&!(V(X.effective_fps)&&X.effective_fps>0)){Y.push(`${Q}:segment motion 须为 {p50,p90(≥p50),samples(正整数),effective_fps?(正数)}(可整体删除,不可改坏形态)`);break}}if(J.cuts!==void 0){if(!Array.isArray(J.cuts)||!J.cuts.every((V)=>typeof V==="number"&&Number.isFinite(V))||J.cuts.some((V,W)=>W>0&&V<=J.cuts[W-1]||V<=J.start||V>=J.end)){Y.push(`${Q}:segment cuts 须为升序有限数字且严格落在 (start,end) 开区间内(可整体删除,不可改坏形态)`);break}}}if(Z.pinned!==void 0&&typeof Z.pinned!=="boolean")Y.push(`${Q}:pinned 只能是布尔(钉选写 pinned:true;得到 ${JSON.stringify(Z.pinned)})`);if(Z.describe!==void 0){let J=Z.describe;if(!J||typeof J!=="object"||Array.isArray(J))Y.push(`${Q}:describe 须为对象({desc,tags,mark,usable_flags} 宽松形态)`);else{if(J.desc!==void 0&&typeof J.desc!=="string")Y.push(`${Q}:describe.desc 须为字符串`);if(J.tags!==void 0&&!(Array.isArray(J.tags)&&J.tags.every((z)=>typeof z==="string")))Y.push(`${Q}:describe.tags 须为字符串数组`);if(J.mark!==void 0&&!(typeof J.mark==="number"&&Number.isFinite(J.mark)))Y.push(`${Q}:describe.mark 须为数字`);if(J.usable_flags!==void 0&&(!J.usable_flags||typeof J.usable_flags!=="object"||Array.isArray(J.usable_flags)))Y.push(`${Q}:describe.usable_flags 须为对象`)}}if(CQ(Z))for(let J of oD(Z))Y.push(`${Q}:${J}`)}function uW(Z){let Q=[];if(!Z||typeof Z!=="object"||Array.isArray(Z))return["plan 不是 JSON 对象"];let Y=Z;if(Y.plan_version!=="v1")Q.push(`plan_version 必须为 "v1"(得到 ${JSON.stringify(Y.plan_version)})`);if(!Array.isArray(Y.beats))return Q.push("beats 必须为数组"),Q;for(let J of Y.beats){if(!J||typeof J!=="object"||typeof J.beat!=="string"||!J.beat){Q.push("存在缺 beat 名的 beat 条目");continue}if(!(typeof J.track_st==="number"&&typeof J.track_ed==="number"&&Number.isFinite(J.track_st)&&Number.isFinite(J.track_ed)))Q.push(`beat ${J.beat}:track_st/track_ed 须为有限数字`);if(J.anchors!==void 0){if(!Array.isArray(J.anchors))Q.push(`beat ${J.beat}:anchors 须为数组(可删锚/挪 at_sec,不可改坏形态)`);else for(let z of J.anchors)if(!(z&&typeof z==="object"&&!Array.isArray(z)&&typeof z.keyword==="string"&&z.keyword&&typeof z.utterance==="string"&&z.utterance&&typeof z.query==="string"&&z.query&&(z.at_sec===null||typeof z.at_sec==="number"&&Number.isFinite(z.at_sec)))){Q.push(`beat ${J.beat}:anchor 须为 {keyword/utterance/query 非空字符串, at_sec 有限数字或 null}(可删锚/挪 at_sec,不可改坏形态)`);break}}if(!Array.isArray(J.queries)){Q.push(`beat ${J.beat}:queries 必须为数组`);continue}for(let z of J.queries){if(!z||typeof z!=="object"||typeof z.query!=="string"){Q.push(`beat ${J.beat}:存在缺 query 文本的 query 条目`);continue}if(z.results===void 0)continue;if(!Array.isArray(z.results)){Q.push(`beat ${J.beat}/「${z.query}」:results 须为数组(可删条/重排,不可改形态)`);continue}for(let X of z.results){if(!X||typeof X!=="object"){Q.push(`beat ${J.beat}/「${z.query}」:存在非对象 result 条目`);continue}aD(X,`beat ${J.beat}/「${z.query}」/clip ${String(X.clip_id??"?")}`,Q)}}}return Q}function mW(Z,Q,Y,J){if(!Z||!Q)return null;let z=Z.indexOf(Q);if(z<0)return null;let X=J-Y;if(!(Number.isFinite(Y)&&Number.isFinite(X)&&X>0))return null;return Math.round((Y+z/Z.length*X)*1000)/1000}var sD="结果 url 带签名默认 24h 过期;过期后重跑 gtrk matrix 即重签(plan 幂等重生成)。",cW={internal:"/task/custom/video_clip_search",external:"/task/video_clip_search"};function lW(Z){let Q=Z==="internal"?"internal":"external";return{tier:Q,endpoint:cW[Q]}}var tD=3,eD=10,gW=50,e7=10;function dW(Z){return typeof Z==="number"&&Number.isInteger(Z)&&Z>0?Z:void 0}function nW(Z){return typeof Z==="number"&&Number.isFinite(Z)&&Z>0?Z:void 0}function ZO(Z,Q){if(Q&&Q>0)return Math.min(Math.max(Math.floor(Q),1),gW);let Y=dW(Z);if(!Y)return e7;return Math.min(Math.max(Y*tD,eD),gW)}function QO(Z,Q){if(!Z||typeof Z!=="object")return;let Y=Object.entries(Z).filter(([J])=>!Q||Q.includes(J));return Y.length?Object.fromEntries(Y):void 0}var YO=["real_shot","concept"];function pW(Z,Q,Y,J,z={}){let X={query:Q,top_k:ZO(Y?.shots,z.topK)},V=nW(Y?.per_shot_sec);if(V)X.filters={min_duration:V};if(Z==="internal"){if(J?.column_tag_ids?.length)X.column_tag_ids=[...J.column_tag_ids];let W=z.materialClass??J?.material_class_policy;if(W&&YO.includes(W))X.material_class=W;let K=QO(J?.facet_defaults,J?.facet_allowed);if(K)X.facets=K}return X}function JO(Z){if(!Array.isArray(Z))return;let Q=Z.filter((Y)=>typeof Y==="string");return Q.length?Q:void 0}function zO(Z,Q){if(!Q?.length)return;for(let Y of Z)if(typeof Y.note==="string"&&Y.note&&Q.some((J)=>Y.note.includes(J)))Y.excluded_hint=!0}function XO(Z,Q){let Y=(z)=>Q?.has(z.query)??!1,J=new Map;for(let z=0;z<Z.length;z++){if(Y(Z[z]))continue;for(let X of Z[z].results??[]){let V=J.get(X.clip_id);if(!V||X.score>V.r.score)J.set(X.clip_id,{qi:z,r:X})}}for(let z=0;z<Z.length;z++){let X=Z[z];if(!X.results||Y(X))continue;X.results=X.results.filter((V)=>{let W=J.get(V.clip_id);if(W.qi===z&&W.r===V)return!0;let K=W.r.also_matched_queries??=[];if(!K.includes(X.query))K.push(X.query);return!1})}}function iW(Z,Q){let Y={beat:Z.beat,track_st:Z.track_st,track_ed:Z.track_ed,queries:[]},J=dW(Z.shots);if(J)Y.requested_shots=J;let z=nW(Z.per_shot_sec);if(z)Y.per_shot_sec=z;let X=JO(Z.exclude);if(X)Y.exclude=X;for(let W of Q){if(W.error){Y.queries.push({query:W.query,error:W.error});continue}let K=(W.data?.results??[]).map(($)=>({...$}));zO(K,X);let G={query:W.query,results:K};if(typeof W.data?.recalled==="number")G.recalled=W.data.recalled;Y.queries.push(G)}let V=new Set((Z.anchors??[]).map((W)=>W.query).filter((W)=>typeof W==="string"&&W.length>0));return XO(Y.queries,V.size?V:void 0),Y}function oW(Z){let Q={plan_version:"v1",generated_at:Z.generatedAt,member_type:Z.memberType,...Z.memberType==="local"?{}:{url_ttl_note:sD},beats:Z.beats};if(Z.projectSlug)Q.project_slug=Z.projectSlug;if(Z.columnId)Q.column_id=Z.columnId;return Q}function F1(Z,Q){switch(Z){case 400:return`请求体非法(网关校验):${Q||"请求参数或请求体格式错误"}`;case 6502:return"鉴权失败——检查 API Key(gtrk init 重配)";case 403:return"非矩阵成员或身份可能已变更——矩阵成员口(custom/video_clip_search)仅对 internal 档位开放";case 6401:return"检索上游故障,或检索参数/栏目配置非法(如 facets 值拼写)——稍后重试仍失败请检查栏目配置的 broll 块";case 6402:return"检索上游超时——稍后重试";default:return`云端错误 (code=${Z??"?"}):${Q||"未知错误"}`}}var M1=25000;async function rW(Z){let Q=await fetch(`${Z.base}/user/get_user_info`,{method:"POST",headers:{accept:"application/json",Authorization:Z.apiKey},body:"",signal:AbortSignal.timeout(M1)}),Y=await aZ(Q);if(Y.code!==200)throw new PZ(Y.code,F1(Y.code,Y.msg));return Y.data}async function Z2(Z){return lW((await rW(Z))?.matrix_member_type).tier}async function Q2(Z){return(await rW(Z))?.gc_member_type==="internal"?"internal":"external"}function WO(Z,Q){try{return JSON.parse(Z.replace(/"clip_id"\s*:\s*(\d+)/g,'"clip_id":"$1"'))}catch{throw Error(`服务响应解析失败 (HTTP ${Q})`)}}async function aW(Z,Q,Y){let J=await fetch(`${Z.base}${cW[Q]}`,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:JSON.stringify(Y),signal:AbortSignal.timeout(M1)}),z=WO(await J.text(),J.status);if(z.code!==200)throw new PZ(z.code,F1(z.code,z.msg));return z.data??{}}var sW=["clip","image","audio"],R1="audio",D1=5,VO=50,tW={internal:"/task/custom/material_search",external:"/task/material_search"},Y2={internal:"0 积分(矩阵成员免费,0 元照留痕带 task_id)",external:"1 积分/次"},O1="https://ai-mcn.tv/#creator-network",KO=`加入同和新媒体矩阵可免费搜全库(含非商用/概念素材):${O1}`,GO=`部分槽位没铺上(素材池填不满,成片对应位置会留黑底)——加入同和新媒体矩阵可免费搜全库(含非商用/概念素材):${O1}`;function J2(Z,Q,Y){if(Z!=="external")return;if(Q===0||Q<Y/2)return{message:KO,url:O1};return}function z2(Z,Q){if(Z!=="external")return;if(Q>0)return{message:GO,url:O1};return}function eW(Z){return tW[Z]}function Z4(Z){let Q=(Z??"").trim();if(!Q)return R1;if(!sW.includes(Q))throw Error(`--scope 取值非法(${Z})——只支持 ${sW.join(" | ")}(缺省 ${R1})`);return Q}function Q4(Z){if(Z===void 0||String(Z).trim()==="")return D1;let Q=Number(String(Z).trim());if(!Number.isFinite(Q)||Q<1)throw Error(`--top-k 取值非法(${Z})——须为 ≥1 的整数(缺省 ${D1})`);return Math.min(Math.floor(Q),VO)}function Y4(Z,Q){let Y=(X,V)=>{if(X===void 0||String(X).trim()==="")return;let W=Number(String(X).trim());if(!Number.isFinite(W)||W<0)throw Error(`${V} 取值非法(${X})——须为非负数字(秒)`);return W},J=Y(Z,"--min-duration"),z=Y(Q,"--max-duration");if(J!==void 0&&z!==void 0&&z<J)throw Error(`时长区间非法(--min-duration ${J} > --max-duration ${z})——上界不能小于下界`);return{...J!==void 0?{min:J}:{},...z!==void 0?{max:z}:{}}}function J4(Z,Q){let Y={scope:Q.scope,query:Q.query,top_k:Q.topK};if(Q.diversity)Y.diversity=!0;if(Z==="internal"){Y.copyright_scope=Q.commercialOnly?"commercial":"all";let J={};if(Q.minDuration!==void 0)J.min_duration=Q.minDuration;if(Q.maxDuration!==void 0)J.max_duration=Q.maxDuration;if(Object.keys(J).length)Y.filters=J}return Y}function $O(Z){if(!Z||typeof Z!=="object"||Array.isArray(Z))return;let Q={...Z},Y=Z.id;if(Y===void 0||Y===null||Y==="")return;Q.id=String(Y);let J=Z.score;if(typeof J==="string"&&J.trim()!==""&&Number.isFinite(Number(J)))Q.score=Number(J);return Q}function HO(Z){if(!Array.isArray(Z))return[];return Z.map($O).filter((Q)=>Q!==void 0)}function z4(Z,Q){if(Q.min===void 0&&Q.max===void 0)return Z;return Z.filter((Y)=>{let J=Y.duration;if(typeof J!=="number"||!Number.isFinite(J))return!0;if(Q.min!==void 0&&J<Q.min)return!1;if(Q.max!==void 0&&J>Q.max)return!1;return!0})}function qO(Z,Q){if(Z===403)return"非矩阵成员或身份可能已变更——矩阵成员口(custom/material_search)仅对 internal 档位开放,公开口 /task/material_search 可直接用(1 积分/次,只含可商用素材)";return F1(Z,Q)}function UO(Z,Q){try{return JSON.parse(Z.replace(/"id"\s*:\s*(\d+)/g,'"id":"$1"'))}catch{throw Error(`服务响应解析失败 (HTTP ${Q})`)}}function NO(Z){if(!Z||typeof Z!=="object"||Array.isArray(Z))return{};let Q=Z;if(!Array.isArray(Q.results)&&Q.data&&typeof Q.data==="object"&&!Array.isArray(Q.data))return Q.data;return Q}async function X4(Z,Q,Y){let J=await fetch(`${Z.base}${tW[Q]}`,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:JSON.stringify(Y),signal:AbortSignal.timeout(M1)}),z=UO(await J.text(),J.status);if(z.code!==200)throw new PZ(z.code,qO(z.code,z.msg));let X=NO(z.data);return{...typeof X.request_id==="string"?{request_id:X.request_id}:{},...X.task_id!==void 0&&X.task_id!==null?{task_id:String(X.task_id)}:{},...typeof X.total==="number"?{total:X.total}:{},results:HO(X.results)}}import{existsSync as BO}from"node:fs";import{resolve as jO,sep as W4}from"node:path";var FO=3000,MO=1500,RO=60,DO=0.2,X2=(Z)=>Math.round(Z*1e4)/1e4;function OO(Z,Q={}){if(!Z.length)return[];let Y=Q.gapMs??FO,J=Q.minWidthMs??MO,z=[],X=[Z[0]];for(let W of Z.slice(1))if(W.ts_ms-X[X.length-1].ts_ms<=Y)X.push(W);else z.push(X),X=[W];z.push(X);let V=[];for(let W of z){let K=W[0].scene_st_ms,G=W[W.length-1].scene_ed_ms,$=W.map((U)=>U.score).sort((U,q)=>q-U),H=$.length>=3?0.5*$[0]+0.3*$[1]+0.2*$[2]:$[0],N=W[0];for(let U of W)if(U.score>N.score)N=U;if(G-K<J)continue;V.push({start_ms:K,end_ms:G,best_ts_ms:N.ts_ms,score:X2(H),best_frame_score:X2(N.score),n_frames:W.length})}return V.sort((W,K)=>K.score-W.score),V}function PO(Z,Q){let Y=(z)=>{let X=jO(z);return process.platform==="win32"?X.toLowerCase():X},J=Y(Z);return Q.some((z)=>{let X=Y(z);return J===X||J.startsWith(X.endsWith(W4)?X:X+W4)})}function $4(Z,Q,Y={}){let J=Y.fileExists??BO,z=Z.all(`SELECT f.ts_ms, f.vec, s.st_ms, s.ed_ms, s.stable AS scene_stable,
|
|
209
|
+
`+"在它们身上等于没开,成片可能出现一闪而过的异景。跑 `gtrk matrix index --dirs <素材夹> --rebuild`\n"+"补上切点数据后重铺即可判定;不补也能交片,只是这条风险留在暗处。"}import{existsSync as VW,mkdtempSync as mR,readFileSync as cR,rmSync as lR}from"node:fs";import{tmpdir as dR}from"node:os";import{join as KW}from"node:path";function GW(Z,Q){if(!Z?.film_broll||!Q)return[];let Y=[];for(let J of Z.film_broll){let z=J.span?.from;if(!z)continue;let X=Q.get(z);if(!X)continue;Y.push({id:z,text:X.text,track_mid:Math.round((X.track_st+X.track_ed)/2*1000)/1000,beat:J.beat??z})}return Y}function $W(Z,Q){return{get(Y,J,z){let X=Z.get("SELECT verdict, reason, frame_desc FROM qc_verdicts WHERE material_id = ? AND ts_ms = ? AND claim_hash = ?",[Q(Y),J,z]);if(!X)return;if(X.verdict!=="match"&&X.verdict!=="partial"&&X.verdict!=="mismatch")return;return{verdict:X.verdict,...X.reason?{reason:X.reason}:{},...X.frame_desc?{frame_desc:X.frame_desc}:{}}},put(Y,J,z,X){Z.run("INSERT OR REPLACE INTO qc_verdicts(material_id, ts_ms, claim_hash, verdict, reason, frame_desc, created_at) VALUES (?,?,?,?,?,?,?)",[Q(Y),J,z,X.verdict,X.reason??null,X.frame_desc??null,new Date().toISOString()])}}}function nR(Z){let Q=Z?.claim_aligned,Y=typeof Z?.claim_reason==="string"?Z.claim_reason:void 0,J={...Y?{reason:Y}:{},...Z?.desc?{frame_desc:Z.desc}:{}};if(typeof Q!=="number")return{verdict:"partial",...J};if(Q>=0.8)return{verdict:"match",...J};if(Q>=0.4)return{verdict:"partial",...J};return{verdict:"mismatch",...J}}function HW(Z){let Q=Z.log??{info:()=>{},warn:()=>{}};return async(Y)=>{let J=mR(KW(dR(),"gtrk-arrange-qc-"));try{let z=[],X=Y.map(()=>({verdict:"partial",reason:"未判定"}));for(let V=0;V<Y.length;V++){let K=Y[V],G=Z.sourcePathFor(K.clipId);if(!G||!VW(G)){X[V]={verdict:"partial",reason:"源片不可读,本句跳过判定(不是画面不对)"};continue}let $=KW(J,`${V}.jpg`);if(!(Z.extractFrame?await Z.extractFrame(G,K.sourceSec,$):await Z0(Z.ffmpeg,G,K.sourceSec,$))||!VW($)){X[V]={verdict:"partial",reason:"抽帧失败,本句跳过判定(不是画面不对)"};continue}z.push({i:V,b64:cR($).toString("base64"),sentence:K.sentence})}if(z.length===0)return Q.warn("编排期 QC:本轮一帧都没抽到,全部跳过判定——请检查源片是否还在原位。"),X;let W=Z.describeBatch?await Z.describeBatch(z.map((V)=>V.b64),z.map((V)=>V.sentence)):await S9(Z.endpoint,z.map((V)=>V.b64),{},{claims:z.map((V)=>V.sentence)});return z.forEach((V,K)=>{X[V.i]=nR(W[K])}),X}finally{lR(J,{recursive:!0,force:!0})}}}var UW=V6(k6(),1);import{mkdirSync as pR}from"node:fs";import{rename as iR}from"node:fs/promises";import{dirname as oR}from"node:path";var rR="image_move",i7=2,qW=5,aR=2,sR=12,o7="assets/broll-move",NW=2;function BW(Z){let Q=Z>qW?Math.ceil(Z):qW;return Math.min(sR,Math.max(aR,Q))}async function jW(Z){return(await UW.blake3(`${Z.duration}|${Z.width}|${Z.height}`)).slice(0,8)}function FW(Z){return Z.startsWith("local-")?Z.slice(6):Z}function MW(Z,Q){return`${C0}${Z}-mv${Q}`}function RW(Z){return`${C0}${Z}`}function B1(Z){return`${o7}/${Z}.mp4`}async function DW(Z){let{params:Q}=Z,Y=await q7({deps:Z.deps,uploadPath:Z.imageAbs,taskType:rR,buildPayload:(X)=>({file_id:X,width:Q.width,height:Q.height,duration:Q.duration}),onTick:Z.onTick}),J=$Z(Y.output,["download_url","video_download_url","url"]);if(!J)throw Error("image_move 任务完成但未返回产物下载链接(output_result 形态异常)");pR(oR(Z.destAbs),{recursive:!0});let z=`${Z.destAbs}.tmp-${process.pid}`;return await(Z.download??E9)(J,z),await iR(z,Z.destAbs),{taskId:Y.taskId}}import{join as hD,resolve as bD}from"node:path";import{mkdir as gD}from"node:fs/promises";import{stat as uD}from"node:fs/promises";import{basename as SD,join as R1,resolve as uW}from"node:path";import{readFile as vD,writeFile as gW,mkdir as wD}from"node:fs/promises";var tR=[/lib\.baomitu\.com/i,/cdnjs\.cloudflare\.com/i,/unpkg\.com/i],eR=[/jsdelivr\.net/i];function AW(Z){let Q=Z.match(/<[a-zA-Z][^>]*\bdata-composition-id\s*=[^>]*>/);return Q?Q[0]:null}function z8(Z,Q){let Y=Z.match(new RegExp(`\\b${Q}\\s*=\\s*["']([^"']*)["']`,"i"));return Y?Y[1]:void 0}function F1(Z){let Q=AW(Z);return Q?z8(Q,"data-composition-id"):void 0}var ZD=["style","script","meta","link","title"];function QD(Z,Q){if(!Q)return null;let Y=Z.indexOf(Q);if(Y<0)return null;let J=Y+Q.length;for(;;){while(J<Z.length&&/\s/.test(Z[J]))J++;if(Z.startsWith("<!--",J)){let V=Z.indexOf("-->",J+4);if(V<0)return null;J=V+3;continue}let z=/^<([a-zA-Z][\w-]*)\b[^>]*>/.exec(Z.slice(J));if(!z)return null;let X=z[1].toLowerCase();if(!ZD.includes(X))return z[0];let W=new RegExp(`</${X}\\s*>`,"i").exec(Z.slice(J));J+=W?W.index+W[0].length:z[0].length}}function s7(Z){let Q=Z.toLowerCase();if(!/position\s*:\s*(?:absolute|fixed)/.test(Q))return!1;if(/\binset\s*:\s*0(?:px|%)?\b/.test(Q))return!0;let Y=(z)=>new RegExp(`\\b${z}\\s*:\\s*0(?:px|%)?\\s*(?:;|$)`).test(Q),J=(z)=>new RegExp(`\\b${z}\\s*:\\s*(?:100%|100vw|100vh|1920px|1080px)\\s*(?:;|$)`).test(Q);return Y("top")&&Y("left")&&J("width")&&J("height")}function YD(Z){return s7(z8(Z,"style")??"")}function PW(Z){let Q=Z.match(/background(?:-color)?\s*:\s*([^;"']+)/i);if(!Q)return{declared:!1,opaque:!1};let Y=Q[1].trim().toLowerCase();return{declared:!0,opaque:!(Y==="transparent"||Y==="none"||/rgba\([^)]*,\s*0\s*\)/.test(Y))}}function JD(Z,Q){if(!Z)return{opaque:!1,declared:!1,solidOnRoot:!1,solidOnChild:!1};let Y=PW(z8(Z,"style")??""),z=Q!==null&&YD(Q)?PW(z8(Q,"style")??""):{declared:!1,opaque:!1};return{opaque:Y.opaque||z.opaque,declared:Y.declared||z.declared,solidOnRoot:Y.opaque,solidOnChild:z.opaque}}var OW={overlay:!1,fullscreen:!0,subtitle:!1,title:!0,"rrv-overlay":!1,"mg-fullscreen":!0,"explain-subtitle":!1,"op-ed-title":!0},EW=/^-?\d+(?:\.\d+)?$/;function zD(Z,Q){let Y=new RegExp(`\\b${Q}\\s*:\\s*([^,}\\n]+)`).exec(Z);return Y?Y[1].trim():void 0}function r7(Z,Q){let Y=zD(Z,Q);if(Y===void 0)return null;return EW.test(Y)?Number(Y):Number.NaN}function XD(Z){let Q=/(?:([A-Za-z_$][\w$]*)\s*)?\.\s*(?:to|from|fromTo|set|add)\s*\(([\s\S]*?)\)\s*;/g,Y=[],J;while(J=Q.exec(Z)){if(J[1]==="gsap")continue;let H=J[2]??"",N=H.lastIndexOf("}"),q=null;if(N>=0){let U=H.slice(N+1).replace(/^\s*,\s*/,"").trim();if(U)q=U.replace(/^["']|["']$/g,"")}Y.push({body:H,pos:q})}let z=0,X=0,W=0,V=0,K=!1;for(let H of Y){if(H.pos!==null&&!EW.test(H.pos)){V++;continue}let N=r7(H.body,"duration");if(N!==null&&(!Number.isFinite(N)||N<0)){V++;continue}let q=N??0,U=r7(H.body,"repeat"),F;if(U===-1)K=!0,F=Number.POSITIVE_INFINITY;else{let R=U!==null&&Number.isFinite(U)&&U>0?U:0,D=r7(H.body,"repeatDelay"),O=D!==null&&Number.isFinite(D)&&D>0?D:0;F=q*(R+1)+O*R}if((H.pos!==null?Number(H.pos)+F:F)>0)W++;if(H.pos!==null)X=Math.max(X,Number(H.pos)+F);else z+=F}let G=Math.max(z,X);return{est:Number.isFinite(G)?Math.round(G*1000)/1000:G,parsed:W,skipped:V,hasInfiniteRepeat:K}}var LW=["onUpdate","onStart","onComplete","onRepeat"],WD=/\.setAttribute(?:NS)?\s*\(|\.textContent\s*=(?!=)|\.inner(?:HTML|Text)\s*=(?!=)|\.style\.[A-Za-z_$][\w$]*\s*=(?!=)|\.style\.setProperty\s*\(|\.classList\s*\.\s*(?:add|remove|toggle|replace)\s*\(/;function B8(Z,Q){let Y=Z[Q];for(let J=Q+1;J<Z.length;J++){if(Z[J]==="\\"){J++;continue}if(Z[J]===Y)return J}return Z.length}function y8(Z,Q){let Y=0;for(let J=Q;J<Z.length;J++){let z=Z[J];if(z==='"'||z==="'"||z==="`"){J=B8(Z,J);continue}if(z==="/"&&Z[J+1]==="/"){let X=Z.indexOf(`
|
|
210
|
+
`,J);J=X<0?Z.length:X;continue}if(z==="/"&&Z[J+1]==="*"){let X=Z.indexOf("*/",J+2);J=X<0?Z.length:X+1;continue}if(z==="{")Y++;else if(z==="}"&&--Y===0)return Z.slice(Q+1,J)}return Z.slice(Q+1)}function IW(Z,Q){let Y=Q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),J=new RegExp(`\\bfunction\\s+${Y}\\s*\\([^)]*\\)\\s*\\{`).exec(Z);if(J)return y8(Z,J.index+J[0].length-1);let z=new RegExp(`\\b(?:var|let|const)\\s+${Y}\\s*=\\s*(?:function\\s*[\\w$]*\\s*\\([^)]*\\)|\\([^)]*\\)\\s*=>|[A-Za-z_$][\\w$]*\\s*=>)\\s*\\{`).exec(Z);if(z)return y8(Z,z.index+z[0].length-1);return null}var SW=new Set(["if","for","while","switch","catch","return","function","typeof","new","delete","void","in","of","do","else"]),VD=new Set(["line","rect","path","polyline","polygon"]),KD=8;function vW(Z){let Q=Z.split("");for(let Y=Z.indexOf("<!--");Y>=0;Y=Z.indexOf("<!--",Y)){let J=Z.indexOf("-->",Y+4),z=J<0?Z.length:J+3;for(let X=Y;X<z;X++)if(Q[X]!=="\r"&&Q[X]!==`
|
|
211
|
+
`)Q[X]=" ";Y=z}return Q.join("")}function wW(Z){let Q=/<script\b[^>]*>/gi,Y=Q.exec(Z);if(!Y)return Z;let J=Z.split("").map((X)=>X==="\r"||X===`
|
|
212
|
+
`?X:" "),z=Y;while(z){let X=z.index+z[0].length,W=/<\/script\s*>/gi;W.lastIndex=X;let V=W.exec(Z),K=V?.index??Z.length;for(let G=X;G<K;G++)J[G]=Z[G];Q.lastIndex=V?V.index+V[0].length:Z.length,z=Q.exec(Z)}return J.join("")}function yW(Z){let Q=Z.split(""),Y=(W,V)=>{for(let K=W;K<V;K++)if(Q[K]!=="\r"&&Q[K]!==`
|
|
213
|
+
`)Q[K]=" "},J=new Set(["(","[","{","=",":",",",";","!","?","&","|","+","-","*","%","^","~","<",">"]),z=new Set(["return","case","throw","else","do","yield","await"]),X=(W)=>{let V=W-1;while(V>=0&&/\s/.test(Q[V]))V--;if(V<0||J.has(Q[V]))return!0;if(!/[\w$]/.test(Q[V]))return!1;let K=V;while(K>0&&/[\w$]/.test(Q[K-1]))K--;return z.has(Q.slice(K,V+1).join(""))};for(let W=0;W<Z.length;W++){let V=Z[W];if(V==='"'||V==="'"||V==="`"){W=B8(Z,W);continue}if(Z.startsWith("<!--",W)){let $=Z.indexOf("-->",W+4),H=$<0?Z.length:$+3;Y(W,H),W=H-1;continue}if(V==="/"&&Z[W+1]==="/"){let $=Z.indexOf(`
|
|
214
|
+
`,W+2),H=$<0?Z.length:$;Y(W,H),W=H-1;continue}if(V==="/"&&Z[W+1]==="*"){let $=Z.indexOf("*/",W+2),H=$<0?Z.length:$+2;Y(W,H),W=H-1;continue}if(V!=="/"||Z[W+1]==="="||!X(W))continue;let K=!1,G=-1;for(let $=W+1;$<Z.length;$++){if(Z[$]==="\\"){$++;continue}if(Z[$]==="\r"||Z[$]===`
|
|
215
|
+
`)break;if(Z[$]==="[")K=!0;else if(Z[$]==="]")K=!1;else if(Z[$]==="/"&&!K){G=$+1;while(G<Z.length&&/[A-Za-z]/.test(Z[G]))G++;break}}if(G<0)continue;Y(W,G),W=G-1}return Q.join("")}function GD(Z){let Q=Z.split("");for(let Y=0;Y<Z.length;Y++){let J=Z[Y];if(J!=='"'&&J!=="'"&&J!=="`")continue;let z=B8(Z,Y);for(let X=Y;X<=z&&X<Q.length;X++)if(Q[X]!=="\r"&&Q[X]!==`
|
|
216
|
+
`)Q[X]=" ";Y=z}return Q.join("")}function s0(Z,Q){let Y=0;for(let J=Q;J<Z.length;J++){let z=Z[J];if(z==='"'||z==="'"||z==="`"){J=B8(Z,J);continue}if(z==="/"&&Z[J+1]==="/"){let X=Z.indexOf(`
|
|
217
|
+
`,J);J=X<0?Z.length:X;continue}if(z==="/"&&Z[J+1]==="*"){let X=Z.indexOf("*/",J+2);J=X<0?Z.length:X+1;continue}if(z==="(")Y++;else if(z===")"&&--Y===0)return J}return-1}function N8(Z,Q){while(Q<Z.length&&/\s/.test(Z[Q]))Q++;return Q}function CW(Z,Q){let Y=y8(Z,Q),J=Q+1+Y.length;return Z[J]==="}"?J+1:Z.length}function z0(Z,Q){let Y=N8(Z,Q);if(Z[Y]==="{")return CW(Z,Y);let J=/^([A-Za-z_$][\w$]*)\b/.exec(Z.slice(Y))?.[1]??"";if(J==="if"||J==="for"||J==="while"||J==="with"||J==="switch"){let V=Z.indexOf("(",Y+J.length),K=V<0?-1:s0(Z,V);if(K<0)return Z.length;if(J==="switch"){let H=N8(Z,K+1);return Z[H]==="{"?CW(Z,H):z0(Z,H)}let G=z0(Z,K+1);if(J!=="if")return G;let $=N8(Z,G);return/^else\b/.test(Z.slice($))?z0(Z,$+4):G}if(J==="do"){let V=z0(Z,Y+2),K=N8(Z,V);if(!/^while\b/.test(Z.slice(K)))return V;let G=Z.indexOf("(",K+5),$=G<0?-1:s0(Z,G);if($<0)return Z.length;let H=N8(Z,$+1);return Z[H]===";"?H+1:$+1}if(J==="try"){let V=z0(Z,Y+3);for(;;){let K=N8(Z,V);if(/^catch\b/.test(Z.slice(K))){let G=N8(Z,K+5);if(Z[G]==="("){let $=s0(Z,G);if($<0)return Z.length;G=N8(Z,$+1)}V=z0(Z,G);continue}if(/^finally\b/.test(Z.slice(K))){V=z0(Z,K+7);continue}return V}}let z=0,X=0,W=0;for(let V=Y;V<Z.length;V++){let K=Z[V];if(K==='"'||K==="'"||K==="`"){V=B8(Z,V);continue}if(K==="(")z++;else if(K===")")z=Math.max(0,z-1);else if(K==="[")X++;else if(K==="]")X=Math.max(0,X-1);else if(K==="{")W++;else if(K==="}"){if(W===0&&z===0&&X===0)return V;W=Math.max(0,W-1)}else if(K===";"&&z===0&&X===0&&W===0)return V+1;else if((K==="\r"||K===`
|
|
218
|
+
`)&&z===0&&X===0&&W===0){let G=V-1;while(G>=Y&&/\s/.test(Z[G]))G--;let $=N8(Z,V+1);if(G>=Y&&/[\w$)\]'"`}]/.test(Z[G])&&$<Z.length&&!/[.(\[`?+\-*/%&|^<>=,:]/.test(Z[$]))return V}}return Z.length}function $D(Z){let Q=Z.split(";");if(Q.length!==3)return null;let Y=/^(?:(?:var|let|const)\s+)?([A-Za-z_$][\w$]*)\s*=\s*(-?\d+(?:\.\d+)?)\s*$/.exec(Q[0].trim());if(!Y)return null;let z=Y[1].replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),X=new RegExp(`^${z}\\s*(<=|<|>=|>)\\s*(-?\\d+(?:\\.\\d+)?)\\s*$`).exec(Q[1].trim());if(!X)return null;let W=Q[2].trim(),V=null;if(new RegExp(`^(?:${z}\\s*\\+\\+|\\+\\+\\s*${z})$`).test(W))V=1;else if(new RegExp(`^(?:${z}\\s*--|--\\s*${z})$`).test(W))V=-1;else{let U=new RegExp(`^${z}\\s*([+-])=\\s*(-?\\d+(?:\\.\\d+)?)$`).exec(W);if(U)V=(U[1]==="+"?1:-1)*Number(U[2])}if(V===null||!Number.isFinite(V)||V===0)return null;let K=Number(Y[2]),G=Number(X[2]),$=X[1];if(!Number.isFinite(K)||!Number.isFinite(G))return null;let H=(U)=>$==="<"?U<G:$==="<="?U<=G:$===">"?U>G:U>=G;if(!H(K))return 0;if(V>0&&$.startsWith(">")||V<0&&$.startsWith("<"))return null;if(Number.isSafeInteger(K)&&Number.isSafeInteger(G)&&Number.isSafeInteger(V)){let U=V>0?G-K:K-G;if(!Number.isSafeInteger(U)||U<0)return null;let F=Math.abs(V),M=$==="<"||$===">"?Math.ceil(U/F):Math.floor(U/F)+1;return Number.isSafeInteger(M)?M:null}let N=K,q=0;while(H(N)){if(++q>1e6){let F=V>0?G-K:K-G,M=Math.abs(V),R=$==="<"||$===">"?Math.ceil(F/M):Math.floor(F/M)+1;return Number.isSafeInteger(R)&&R>=0?R:null}let U=N+V;if(Object.is(U,N)||!Number.isFinite(U))return null;N=U}return q}function HD(Z){let Q=[],Y=new Set,J=/\bdo\b/g,z;while(z=J.exec(Z)){let V=z0(Z,z.index+z[0].length),K=N8(Z,V);if(/^while\b/.test(Z.slice(K)))Y.add(K)}let X=/\b(for|while)\s*\(/g,W;while(W=X.exec(Z)){if(W[1]==="while"&&Y.has(W.index))continue;let V=W.index+W[0].lastIndexOf("("),K=s0(Z,V);if(K<0)continue;let G=K+1;while(G<Z.length&&/\s/.test(Z[G]))G++;let $=G,H;if(Z[G]==="{"){let U=y8(Z,G);$=G+1,H=$+U.length}else H=z0(Z,G);let N=W[1],q=Z.slice(V+1,K);Q.push({kind:N,bodyStart:$,bodyEnd:H,count:N==="for"?$D(q):null,header:q})}return Q}function qD(Z){let Q=[],Y=(K,G,$)=>{let H=K-1;while(H>=0&&/\s/.test(Z[H]))H--;let N=$||H>=0&&/[(!=,:+\-~?]/.test(Z[H]),q=G+1;while(q<Z.length&&/\s/.test(Z[q]))q++;if(Z[q]==="(")return N;if(Z[H]!=="(")return!1;let U=0,F=H;while(F>=0&&Z[F]==="("){U++,F--;while(F>=0&&/\s/.test(Z[F]))F--}if(F>=0&&/[\w$)\]]/.test(Z[F]))return!1;for(let M=0;M<U;M++){if(Z[q]!==")")return!1;q=N8(Z,q+1)}return N&&Z[q]==="("},J=[{re:/\b(?:var|let|const)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:(?:async\s+)?function\s*\*?\s*[\w$]*\s*\([^)]*\)|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)\s*\{/g,nameGroup:1,expression:!0},{re:/\b(?:async\s+)?function\s*\*?\s+([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*\{/g,nameGroup:1,expression:!1},{re:/\b(?:async\s+)?function\s*\*?\s*\([^)]*\)\s*\{/g,nameGroup:null,expression:!0},{re:/(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*\{/g,nameGroup:null,expression:!0}];for(let{re:K,nameGroup:G,expression:$}of J){let H;while(H=K.exec(Z)){let N=H.index+H[0].lastIndexOf("{"),q=y8(Z,N),U=N+1,F=U+q.length;if(Q.some((_)=>_.bodyStart===U))continue;let M=G===null?null:H[G],R=H[0].slice(0,H[0].lastIndexOf("{")),D=[...R.matchAll(/\(([^()]*)\)/g)],O=/=\s*([A-Za-z_$][\w$]*)\s*=>\s*$/.exec(R),C=D.at(-1)?.[1]??O?.[1]??"",T=new Set(C.split(",").map((_)=>/^([A-Za-z_$][\w$]*)/.exec(_.trim())?.[1]).filter((_)=>Boolean(_)));Q.push({name:M,declStart:H.index,bodyStart:U,bodyEnd:F,body:q,params:T,immediatelyInvoked:Y(H.index,F,$)})}}let z=/\b(?:async\s+)?function\s*\*?\s*([A-Za-z_$][\w$]*)?\s*\(/g,X;while(X=z.exec(Z)){let K=X.index+X[0].lastIndexOf("("),G=s0(Z,K);if(G<0)continue;let $=G+1;while($<Z.length&&/\s/.test(Z[$]))$++;if(Z[$]!=="{")continue;let H=y8(Z,$),N=$+1,q=N+H.length;if(Q.some((D)=>D.bodyStart===N))continue;let U=Z.slice(Math.max(0,X.index-160),X.index),F=/\b(?:var|let|const)\s+([A-Za-z_$][\w$]*)\s*=\s*$/.exec(U),M=F?.[1]??X[1]??null,R=new Set(Z.slice(K+1,G).split(",").map((D)=>/^([A-Za-z_$][\w$]*)/.exec(D.trim())?.[1]).filter((D)=>Boolean(D)));Q.push({name:M,declStart:X.index,bodyStart:N,bodyEnd:q,body:H,params:R,immediatelyInvoked:Y(X.index,q,F!==null||X[1]===void 0)})}let W=/\b(?:var|let|const)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?\(/g,V;while(V=W.exec(Z)){let K=V.index+V[0].lastIndexOf("("),G=s0(Z,K);if(G<0)continue;let $=N8(Z,G+1);if(!Z.startsWith("=>",$))continue;let H=N8(Z,$+2);if(Z[H]!=="{")continue;let N=y8(Z,H),q=H+1,U=q+N.length;if(Q.some((M)=>M.bodyStart===q))continue;let F=new Set(Z.slice(K+1,G).split(",").map((M)=>/^([A-Za-z_$][\w$]*)/.exec(M.trim())?.[1]).filter((M)=>Boolean(M)));Q.push({name:V[1],declStart:V.index,bodyStart:q,bodyEnd:U,body:N,params:F,immediatelyInvoked:Y(V.index,U,!0)})}return Q.sort((K,G)=>K.declStart-G.declStart)}var _W=/\b(?:(?:var|let|const)\s+)?([A-Za-z_$][\w$]*)\s*=(?!=)\s*document\s*\.\s*createElementNS\s*\(\s*[^,]+,\s*["']([A-Za-z][\w-]*)["']\s*\)/gi;function EQ(Z){return Z.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function UD(Z,Q,Y,J){let z=EQ(Q),X=new RegExp(`\\b([A-Za-z_$][\\w$]*)\\s*\\.\\s*appendChild\\s*\\(\\s*${z}\\s*\\)`,"g"),W;while((W=X.exec(Z))&&!J(Y+W.index));if(!W)return null;let V=new RegExp(`\\b(?:(?:var|let|const)\\s+)?${z}\\s*=(?!=)`,"g"),K;while(K=V.exec(Z)){if(K.index>=W.index)break;if(Z[K.index-1]===".")continue;if(J(Y+K.index))return null}return W[1]}function a7(Z,Q,Y){let J=EQ(Y);if(new RegExp(`\\bgsap\\s*\\.\\s*set\\s*\\(\\s*${J}\\b`).test(Q))return!0;if(new RegExp(`\\b[A-Za-z_$][\\w$]*\\s*\\.\\s*(?:to|from|fromTo)\\s*\\(\\s*${J}\\b`).test(Q))return!0;let z=new Set;for(let X of Q.matchAll(new RegExp(`\\b([A-Za-z_$][\\w$]*)(?:\\s*\\[[^\\]]+\\])?\\s*\\.\\s*push\\s*\\(\\s*${J}\\s*\\)`,"g")))z.add(X[1]);for(let X of z){let W=EQ(X);if(new RegExp(`\\b[A-Za-z_$][\\w$]*\\s*\\.\\s*(?:to|from|fromTo)\\s*\\(\\s*${W}(?:\\s*\\[[^\\]]+\\])?\\s*,`).test(Z))return!0}return!1}function ND(Z){let Q=yW(wW(vW(Z))),Y=GD(Q),J=HD(Y),z=qD(Y),X=(_)=>z.filter((P)=>_>=P.bodyStart&&_<P.bodyEnd).sort((P,E)=>P.bodyEnd-P.bodyStart-(E.bodyEnd-E.bodyStart))[0]??null,W=(_)=>X(_.declStart),V=(_,P)=>{if(_.params.has(P))return!0;let E=new RegExp(`\\b(?:var|let|const|class)\\s+${EQ(P)}\\b`,"g");E.lastIndex=_.bodyStart;let I;while((I=E.exec(Y))&&I.index<_.bodyEnd)if(X(I.index)===_)return!0;return!1},K=(_,P)=>{let E=X(P);while(E){let I=z.filter((y)=>y.name===_&&W(y)===E).sort((y,h)=>h.declStart-y.declStart)[0];if(I)return I;if(E.name===_)return E;if(V(E,_))return null;E=W(E)}return z.filter((I)=>I.name===_&&W(I)===null).sort((I,y)=>y.declStart-I.declStart)[0]??null},G=(_,P)=>{let E=_;while(E){if(V(E,P))return E;E=W(E)}return null},$=(_,P,E)=>{let I=EQ(_),y=new RegExp(`\\b(?:var|let|const)\\s+${I}\\s*=\\s*(?:document\\s*\\.\\s*createElement(?:NS)?\\s*\\(|new\\b)`,"g");y.lastIndex=E?.bodyStart??0;let h=null,v;while((v=y.exec(Y))&&v.index<P&&(!E||v.index<E.bodyEnd))if(X(v.index)===E)h=v.index;return h},H=(_,P)=>P===null?_:_.filter((E)=>P<E.bodyStart||P>=E.bodyEnd),N=(_)=>{let P=X(_);return J.filter((E)=>{if(_<E.bodyStart||_>=E.bodyEnd)return!1;if(P)return E.bodyStart>=P.bodyStart&&E.bodyEnd<=P.bodyEnd;return X(E.bodyStart)===null})},q=(_)=>{if(_.some((E)=>E.count===null))return null;let P=1;for(let E of _)if(P*=E.count,!Number.isSafeInteger(P))return null;return P},U=(_,P=N(_))=>{let E=P.sort((I,y)=>I.bodyEnd-I.bodyStart-(y.bodyEnd-y.bodyStart))[0];return E?Y.slice(E.bodyStart,E.bodyEnd):""},F=new Map,M=(_,P,E,I,y,h)=>{let v=`${h}\x00${_}\x00${P}`,S=F.get(v)??{tag:_,parent:P,count:0,unknown:!1,perElementDriven:!1,sites:new Set};if(E===null)S.unknown=!0;else if(S.count+=E,!Number.isSafeInteger(S.count))S.unknown=!0;S.perElementDriven||=I,S.sites.add(y),F.set(v,S)},R=[];_W.lastIndex=0;let D;while(D=_W.exec(Q)){if(!Y[D.index]||/\s/.test(Y[D.index]))continue;let _=D[2].toLowerCase();if(!VD.has(_))continue;let P=X(D.index),E=N(D.index),I=E.slice().sort((k,c)=>k.bodyEnd-k.bodyStart-(c.bodyEnd-c.bodyStart))[0],y=I?.bodyStart??P?.bodyStart??D.index,h=I?Y.slice(I.bodyStart,I.bodyEnd):P?.body??"",v=Math.max(0,D.index-y)+D[0].length,S=UD(h.slice(v),D[1],y+v,(k)=>X(k)===P);if(!S)continue;R.push({at:D.index,tag:_,elVar:D[1],parent:S,fn:P,loops:E})}let O=new Map,C=(_,P)=>{let E=O.get(_.declStart)??[];E.push({at:P,loops:N(P)}),O.set(_.declStart,E)},T=new Set(z.map((_)=>_.name).filter((_)=>_!==null));for(let _ of Y.matchAll(/\b([A-Za-z_$][\w$]*)\s*\(/g)){let P=_[1],E=_.index,I=E-1;while(I>=0&&/\s/.test(Y[I]))I--;if(SW.has(P)||!T.has(P)||Y[I]===".")continue;if(z.some((h)=>h.name===P&&E>=h.declStart&&E<h.bodyStart))continue;let y=K(P,E);if(y)C(y,E)}for(let _ of z)if(_.immediatelyInvoked)C(_,_.bodyEnd);for(let _ of R){if(!_.fn){if(_.loops.length===0)continue;let E=_.loops.slice().sort((h,v)=>h.bodyEnd-h.bodyStart-(v.bodyEnd-v.bodyStart))[0],I=U(_.at,_.loops),y=$(_.parent,_.at,null);M(_.tag,_.parent,q(H(_.loops,y)),a7(Y,I,_.elVar),`${E.kind} (${E.header.trim()})`,y===null?"shared-parent":`fresh-parent:${y}`);continue}let P=O.get(_.fn.declStart)??[];if(P.length===0&&_.loops.length>0){let E=_.loops.slice().sort((h,v)=>h.bodyEnd-h.bodyStart-(v.bodyEnd-v.bodyStart))[0],I=G(_.fn,_.parent),y=$(_.parent,_.at,I);M(_.tag,_.parent,q(H(_.loops,y)),a7(Y,U(_.at,_.loops),_.elVar),`${E.kind} (${E.header.trim()})`,y!==null?`fresh-parent:${y}`:I?`function:${I.declStart}`:"shared-parent")}for(let E of P){if(_.loops.length===0&&E.loops.length===0)continue;let I=U(E.at,E.loops),y=G(_.fn,_.parent),h=$(_.parent,_.at,y),v=q(H(_.loops,h)),S=q(H(E.loops,h)),c=h!==null&&y===_.fn?v:v===null||S===null?null:v*S;M(_.tag,_.parent,c,a7(Y,`${_.fn.body}
|
|
219
|
+
${I}`,_.elVar),_.fn.name?`factory ${_.fn.name}`:`IIFE @${_.fn.declStart}`,h!==null?`fresh-parent:${h}`:y?`function:${y.declStart}`:"shared-parent")}}return[...F.values()].map((_)=>({tag:_.tag,parent:_.parent,count:_.unknown?null:_.count,perElementDriven:_.perElementDriven,site:[..._.sites].join(" + ")}))}function xW(Z,Q,Y,J){if(WD.test(Q))return!0;if(Y<=0)return!1;for(let z of Q.matchAll(/\b([A-Za-z_$][\w$]*)\s*\(/g)){let X=z[1];if(SW.has(X)||J.has(X))continue;J.add(X);let W=IW(Z,X);if(W&&xW(Z,W,Y-1,J))return!0}return!1}function BD(Z){let Q=new Set,Y=new RegExp(`\\b(${LW.join("|")})\\s*:\\s*`,"g"),J;while(J=Y.exec(Z)){let X=J[1],W=J.index+J[0].length,V=Z.slice(W),K=null,G;if(G=/^function\s*[A-Za-z_$]?[\w$]*\s*\([^)]*\)\s*\{/.exec(V))K=y8(Z,W+G[0].length-1);else if(G=/^(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>\s*/.exec(V)){let $=W+G[0].length;K=Z[$]==="{"?y8(Z,$):V.slice(G[0].length).split(`
|
|
220
|
+
`)[0]}else if(G=/^([A-Za-z_$][\w$]*)/.exec(V))K=IW(Z,G[1]);if(K&&xW(Z,K,2,new Set))Q.add(X)}let z=[];if(/\.\s*seek\s*=(?!=)|\[\s*["']seek["']\s*\]\s*=(?!=)/.test(Z))z.push("重新赋值 `.seek`");for(let X of Z.matchAll(/window\s*\.\s*__timelines\s*\[[^\]]*\]\s*=\s*([^;\n]*)/g)){let W=X[1].split("//")[0].trim();if(W&&!/^[A-Za-z_$][\w$]*$/.test(W)){z.push("`__timelines[…]` 被赋成包装对象而非时间线本体");break}}return{callbackDom:Q.size>0,hooks:LW.filter((X)=>Q.has(X)),engineApiOverride:z.length>0,overrideForms:z}}var kW=/^[+-]?(?:\d+\.?\d*|\.\d+)(?:px|em|rem|pt|%|vh|vw|vmin|vmax|ch|ex|cm|mm|in|pc|q)?$/i;function fW(Z){let Q=Z.trim();if(!kW.test(Q))return!1;return Number.parseFloat(Q)!==0}function AQ(Z,Q){let Y=s0(Z,Q);return Y<0?null:Z.slice(Q+1,Y)}function jD(Z){let Q=[],Y=0,J="";for(let z=0;z<Z.length;z++){let X=Z[z];if(X==="(")Y++;else if(X===")")Y=Math.max(0,Y-1);if(Y===0&&/\s/.test(X)){if(J)Q.push(J);J="";continue}J+=X}if(J)Q.push(J);return Q}function FD(Z){let Q=jD(Z).filter((Y)=>kW.test(Y));return Q.length>=3&&fW(Q[2])}function j1(Z,Q){let Y=Z.toLowerCase();for(let J of Y.matchAll(/\bblur\s*\(/g)){let z=AQ(Y,J.index+J[0].length-1);if(z!==null&&fW(z))return!0}for(let J of Y.matchAll(/\bdrop-shadow\s*\(/g)){let z=AQ(Y,J.index+J[0].length-1);if(z!==null&&FD(z))return!0}for(let J of Y.matchAll(/\burl\s*\(/g)){let z=AQ(Y,J.index+J[0].length-1);if(z===null)continue;let X=z.trim().replace(/^["']|["']$/g,"").replace(/^#/,"");if(X&&Q.has(X))return!0}return!1}function MD(Z){for(let Q of Z.matchAll(/<fe(GaussianBlur|DropShadow)\b[^>]*>/gi)){let Y=z8(Q[0],"stdDeviation");if(Y===void 0){if(Q[1].toLowerCase()==="dropshadow")return!0;continue}if(Y.trim().split(/[\s,]+/).some((J)=>/^[+-]?(?:\d+\.?\d*|\.\d+)$/.test(J)&&Number.parseFloat(J)!==0))return!0}return!1}function RD(Z){let Q=new Set;for(let Y of Z.matchAll(/<filter\b([^>]*)>([\s\S]*?)<\/filter\s*>/gi)){let J=z8(`<filter${Y[1]}>`,"id");if(J&&MD(Y[2]))Q.add(J)}return Q}function TW(Z){let Q=[];for(let Y of Z.matchAll(/(?:^|[;{}\s])\s*(?:-webkit-)?(?:backdrop-)?filter\s*:\s*([^;}]*)/gi))Q.push(Y[1].trim());return Q}function DD(Z){let Q=[];for(let Y of Z.matchAll(/<style\b[^>]*>([\s\S]*?)<\/style\s*>/gi)){let J=Y[1].replace(/\/\*[\s\S]*?\*\//g," "),z=[],X=[],W=0;for(let V=0;V<J.length;V++){let K=J[V];if(K==='"'||K==="'"){V=B8(J,V);continue}if(K==="{")z.push(V),X.push(J.slice(W,V)),W=V+1;else if(K==="}"){let G=z.pop(),$=X.pop()??"";if(W=V+1,G===void 0)continue;let H=J.slice(G+1,V);for(let N="";H!==N;)N=H,H=H.replace(/\{[^{}]*\}/g," ");Q.push({selector:$.trim(),own:H})}else if(K===";")W=V+1}}return Q}function hW(Z,Q){let Y=0;for(let J=Q;J<Z.length;J++){let z=Z[J];if(z==='"'||z==="'"||z==="`"){J=B8(Z,J);continue}if(z==="("||z==="["||z==="{")Y++;else if(z===")"||z==="]"||z==="}"){if(Y===0)return Z.slice(Q,J);Y--}else if(z===","&&Y===0)return Z.slice(Q,J)}return Z.slice(Q)}function bW(Z){let Q=Z.trim();if(Q.length<2)return null;let Y=Q[0];if((Y==='"'||Y==="'")&&Q.endsWith(Y)&&B8(Q,0)===Q.length-1)return Q.slice(1,-1);if(Y==="`"&&Q.endsWith("`")&&B8(Q,0)===Q.length-1&&!Q.includes("${"))return Q.slice(1,-1);return null}function PD(Z){let Q=[],Y=/\.\s*(?:to|from|fromTo|set)\s*\(/g,J;while(J=Y.exec(Z)){let z=J.index+J[0].length-1,X=AQ(Z,z);if(X===null)continue;for(let W=0;W<X.length;W++){let V=X[W];if(V==='"'||V==="'"||V==="`"){W=B8(X,W);continue}if(V!=="{")continue;let K=y8(X,W);Q.push(K),W+=K.length+1}Y.lastIndex=z+1}return Q}var OD=/^(?:transform|x|y|z|xPercent|yPercent|scale|scaleX|scaleY|scaleZ|rotate|rotation|rotationX|rotationY|rotationZ|skew|skewX|skewY|translateX|translateY|translateZ)$/,LD=/^(?:to|from|fromTo)$/;function t7(Z){let Q=[];for(let Y of Z.split(",")){let J=Y.trim().split(/[\s>+~]+/).filter(Boolean).pop();if(!J)continue;let z=J.split(/[:\[]/)[0];for(let X of z.matchAll(/([.#])([A-Za-z_][\w-]*)/g))Q.push(`${X[1]==="#"?"id":"class"}:${X[2]}`)}return Q}function CD(Z){let Q=[],Y=z8(Z,"id");if(Y)Q.push(`id:${Y.trim()}`);for(let J of(z8(Z,"class")??"").trim().split(/\s+/))if(J)Q.push(`class:${J}`);return Q}function _D(Z){let Q=[],Y=/\.\s*(to|from|fromTo|set)\s*\(/g,J;while(J=Y.exec(Z)){let z=J.index+J[0].length-1,X=AQ(Z,z);if(Y.lastIndex=z+1,X===null)continue;let W=hW(X,0),V=[];for(let K=0;K<X.length;K++){let G=X[K];if(G==='"'||G==="'"||G==="`"){K=B8(X,K);continue}if(G!=="{")continue;let $=y8(X,K);V.push($),K+=$.length+1}Q.push({method:J[1],target:W,bodies:V})}return Q}function TD(Z){let Q=new Map,Y=/([A-Za-z_$][\w$]*)\s*=\s*(?:[A-Za-z_$][\w$]*\s*\.\s*)?([A-Za-z_$][\w$]*)\s*\(\s*(["'])(.*?)\3\s*\)/g;for(let J of Z.matchAll(Y)){let[,z,X,,W]=J,V=X==="getElementById"?[`id:${W.trim()}`]:/^\s*[.#]/.test(W)?t7(W):[];if(!V.length)continue;let K=Q.get(z)??[];Q.set(z,[...new Set([...K,...V])])}return Q}function AD(Z,Q){let Y=Z.trim(),J=bW(Y);if(J!==null)return/^\s*[.#]/.test(J)?t7(J):[];if(/^[A-Za-z_$][\w$]*$/.test(Y))return Q.get(Y)??[];return[]}function ED(Z){let Q=[],Y=0,J=!0;for(let z=0;z<Z.length;z++){let X=Z[z];if(X==='"'||X==="'"||X==="`"){if(Y===0&&J){let W=B8(Z,z),V=Z.slice(z+1,W),K=Z.slice(W+1);if(/^\s*:/.test(K))Q.push(V),J=!1}z=B8(Z,z);continue}if(X==="("||X==="["||X==="{")Y++;else if(X===")"||X==="]"||X==="}")Y=Math.max(0,Y-1);else if(X===","&&Y===0)J=!0;else if(Y===0&&J&&/[A-Za-z_$]/.test(X)){let W=/^([A-Za-z_$][\w$]*)\s*:/.exec(Z.slice(z));if(W)Q.push(W[1]),J=!1,z+=W[1].length}}return Q}function ID(Z){let Q=vW(Z),Y=RD(Q),J=[],z=[],X=[],W=[],V=($,H)=>{let N=H.replace(/\s+/g," ").trim().slice(0,120);if(!$.includes(N))$.push(N)},K=new Map;for(let{selector:$,own:H}of DD(Q)){let N=TW(H).filter((q)=>j1(q,Y));if(!N.length)continue;if(s7(H))V(z,`<style> 规则:filter:${N[0]}`);for(let q of t7($))if(!K.has(q))K.set(q,`<style> 规则 ${$.slice(0,60)}:filter:${N[0]}`)}for(let $ of Q.matchAll(/<[a-zA-Z][^>]*>/g)){let H=$[0],N=z8(H,"style")??"",q=TW(N).filter((R)=>j1(R,Y)),U=z8(H,"filter"),F=U!==void 0&&j1(U,Y)?U:null;if(!q.length&&F===null)continue;let M=q.length?`内联 style:filter:${q[0]}`:`SVG 属性:filter="${F}"`;for(let R of CD(H))if(!K.has(R))K.set(R,M);if(!s7(N))continue;V(z,M)}let G=yW(wW(Q));for(let $ of PD(G)){for(let H of $.matchAll(/(?:^|[{,])\s*["']?(filter|webkitFilter|WebkitFilter|-webkit-filter)["']?\s*:/g)){let N=hW($,H.index+H[0].length),q=bW(N);if(q===null)V(W,`补间属性 ${H[1]}:${N}`);else if(j1(q,Y))V(J,`补间属性 ${H[1]}:"${q}"`)}if(Y.size&&/(?:^|[{,])\s*["']?stdDeviation["']?\s*:/.test($))V(J,"补间驱动 SVG 滤镜基元的 stdDeviation")}if(K.size){let $=TD(G);for(let{method:H,target:N,bodies:q}of _D(G)){if(!LD.test(H))continue;if(!q.some((F)=>ED(F).some((M)=>OD.test(M))))continue;for(let F of AD(N,$)){let M=K.get(F);if(M)V(X,`${M} —— 而 \`.${H}(${N.trim().slice(0,30)}, …)\` 驱动了它的 transform`)}}}return{animated:J,staticFullBleed:z,staticTransformed:X,indeterminate:W}}function IQ(Z,Q={}){let Y=[],J=(U,F,M)=>Y.push({law:U,fatal:F,msg:M});if(!/<template[\s>]/i.test(Z))J("1-template",!0,"缺 <template> 包裹根元素(裸 div 整片渲染失败)");{let U=Z.search(/<\/template>/i);if(U>=0){if(Z.lastIndexOf("<script")>U)J("1b-script-outside-template",!0,"存在 </template> 之后的 <script>——客户端只挂载并执行 template 内的脚本,外部脚本恒不执行(__timelines 不注册 → 颗粒空白)。把全部 <script> 移入根元素内部末尾")}}let z=AW(Z),X=z?z8(z,"data-composition-id"):void 0;if(!z||!X)J("1-composition-id",!0,"根元素缺 data-composition-id");if(Q.compositionId&&X&&Q.compositionId!==X)J("1-cid-expect",!0,`HTML 内 data-composition-id「${X}」与期望 id「${Q.compositionId}」不符(复制改名漏改内部 id?)——`+`按期望 id 落轨会写出 clip_id/material 指向「${Q.compositionId}」,而本文件注册的是 __timelines["${X}"],渲染必错`);if(z){if(z8(z,"data-width")!=="1920")J("1-width",!0,`根 data-width 应为 "1920"(实为 ${z8(z,"data-width")??"缺"})`);if(z8(z,"data-height")!=="1080")J("1-height",!0,`根 data-height 应为 "1080"(实为 ${z8(z,"data-height")??"缺"})`)}if(!/gsap\.timeline\s*\(\s*\{[^}]*\bpaused\s*:\s*true\b[^}]*\}\s*\)/.test(Z))J("2-paused",!0,"缺 gsap.timeline({ paused: true })");let W=Z.match(/window\.__timelines\s*\[\s*(["']([^"']+)["']|[A-Za-z_$][\w$]*)\s*\]\s*=/);if(!W)J("2-register",!0,"缺 window.__timelines[<id>] = 注册");else{let U=W[2];if(U===void 0){let F=W[1];if(U=Z.match(new RegExp(`(?:var|const|let)\\s+${F}\\s*=\\s*["']([^"']+)["']`))?.[1],!U)J("2-register",!0,`__timelines[${F}] 的 ${F} 未见字面串赋值,无法静态判定注册 id`)}if(X&&U!==void 0&&U!==X)J("2-id-match",!0,`__timelines 注册 id "${U}" 与 data-composition-id "${X}" 不一致`)}if(/Math\.random\s*\(/.test(Z))J("3-random",!0,"含 Math.random()(破 StaticGuard,逐帧不确定)");if(/Date\.now\s*\(/.test(Z))J("3-date-now",!0,"含 Date.now()");if(/new\s+Date\s*\(\s*\)/.test(Z))J("3-new-date",!0,"含无参 new Date()");for(let U of Z.matchAll(/<script\b[^>]*\bsrc\s*=\s*["']([^"']+)["']/gi)){let F=U[1];if(!/^https?:\/\//i.test(F))J("4-script-rel",!0,`<script src> 非 http(s) 绝对 url:${F}`);else if(eR.some((M)=>M.test(F)))J("5-cdn-jsdelivr",!1,`CDN 用 jsdelivr(国内渲染机不稳,建议 lib.baomitu.com):${F}`);else if(!tR.some((M)=>M.test(F)))J("5-cdn-unknown",!1,`CDN 不在已知可达白名单(渲染机可能拉不到):${F}`)}for(let[U,F]of[[/<img\b[^>]*\bsrc\s*=\s*["'](?!https?:|data:)[^"']+["']/gi,"<img src>"],[/<link\b[^>]*\bhref\s*=\s*["'](?!https?:|data:)[^"']+["']/gi,"<link href>"],[/<use\b[^>]*\b(?:xlink:)?href\s*=\s*["'](?!#|https?:|data:)[^"']+["']/gi,"<use href>"],[/\burl\(\s*["']?(?!https?:|data:|#)[^)"']+["']?\s*\)/gi,"css url()"]])if(U.test(Z))J("4-rel-asset",!0,`含相对外链 ${F}(违反自包含,渲染机读不到)`);let{opaque:V,declared:K,solidOnRoot:G,solidOnChild:$}=JD(z,QD(Z,z));if(z&&!K)J("4-bg-explicit",!1,"根与根下首个全幅子层**都**没有显式声明 background(契约铁律4③:透明与否 MUST 显式)——"+"满屏颗粒应在根下第一个全幅子层(position:absolute;inset:0)声明实心底;"+"透明叠加颗粒应在根显式写 background:transparent。缺省按透明叠加 opaque=false 处理");if(G&&!$)J("4-bg-on-root",!1,"实心底写在**根 style** 上(契约铁律4①②:MUST 下沉为根下第一个全幅子层,根 MUST 保持零视觉)——"+"**根元素的绘制属性会在子合成挂载时被丢弃**,这层底在成片里一个像素都不落地:"+"前景照常渲出、底没了、底轨透出来,观感是「浮空面板」;而本地播放器与客户端预览都看不出(2026-07-26 r69 真渲实测,见契约铁律4证据锚)。"+"改法是机械的:把这条 background 声明整体搬到根下新增的第一个全幅子层"+'(<div style="position:absolute;inset:0;background:<原底色>;z-index:0;"></div>),根上改写 background:transparent');if(/var\(\s*--/.test(Z))J("6-css-var",!0,"含 CSS var(--...)(Hyperframes 不解析→整片全黑,须字面值)");let H=BD(Z);if(H.engineApiOverride)J("x-engine-api-override",!1,`颗粒在运行时覆写了渲染引擎所调用的 API(${H.overrideForms.join("、")})——它会推翻引擎**显式**传入的 `+"seek(t, true)(颗粒无权静默否决引擎意图),且只在引擎恰好走 seek 时有效,引擎改走 time() / progress() 即完全失效。"+"按契约「回调与 seek 语义」,回调可达性应由**引擎侧**承担,颗粒侧垫片属过渡态——"+"引擎侧结论已于 2026-07-26 经真机核实(引擎 producer 0.6.101 定帧时回调可达),既有垫片可择期清理(删后须重渲复验),新颗粒不应再加");if(H.callbackDom&&!H.engineApiOverride)J("x-callback-driven",!1,`画面靠时间线回调驱动(${H.hooks.join(" / ")} 体内写 DOM),且本颗粒无任何 seek 兜底。`+"该写法**合规**——其可达性由契约「回调与 seek 语义」的**引擎侧 MUST 条款**保证"+"(2026-07-26 已真机核实:引擎 producer 0.6.101 定帧时回调可达;结论**绑定该引擎版本**),"+"作者不必也不应为此加装 tl.seek 垫片。本项只是**哨兵**:引擎若失守或换实现,补间属性照常插值、回调不跑 → "+"画面会静默定格在初始态(不是黑屏,本地播放器与客户端预览都看不出)");let N=[/\brequestAnimationFrame\s*\(/.test(Z)?"requestAnimationFrame(":null,/\bsetInterval\s*\(/.test(Z)?"setInterval(":null].filter(Boolean);if(N.length)J("x-raf-interval",!1,`含 ${N.join(" 与 ")}——这类自有时钟**不被 seek 驱动**,逐帧渲染时等于冻结(契约:所有视觉变化必须挂在 tl 上)。`+"静态正则分不清「驱动画面」与其它用途(如一次性布局测量),故只提醒、不拦");if(Q.dispatchIds&&X&&!Q.dispatchIds.includes(X))J("x-dispatch",!1,`composition_id "${X}" 不在 dispatch.mg 派单中`);if(Q.category&&Q.category in OW){let U=OW[Q.category];if(U!==V)J("x-category-opaque",!1,`category「${Q.category}」期望${U?"不透明满屏":"透明叠加"},但颗粒 HTML 反推为${V?"不透明满屏":"透明叠加"}(以 HTML 为准落 clip.opaque=${V})`)}if(typeof Q.slotDuration==="number"&&Q.slotDuration>0){let U=Q.slotDuration,{est:F,parsed:M,skipped:R,hasInfiniteRepeat:D}=XD(Z);if(D)J("7-infinite-repeat",!1,`含 repeat:-1 无限循环 → tl 时长为 Infinity,铁律⑦(总长 ≥ 坑位)无法静态验证;请改用按坑位算死的有限 repeat(次数 = ceil(剩余时长 / 单圈时长)),坑位包络 ${U}s`);if(M===0)J("7-no-estimate",!1,`无法静态估长(无一条可解析的时长调用${R?`,${R} 条因表达式 position / 非字面量 duration 跳过`:""}),铁律⑦未校验——须真渲染引擎 seek 验收颗粒是否占满坑位 ${U}s 并终态驻留`);else if(Number.isFinite(F)&&F<U)J("7-fill-slot",!1,`时间线静态估长 ~${F}s,短于槽位包络 ${U}s(铁律⑦:颗粒应占满坑位并终态驻留)——静态估算是**下界**(${R} 条调用因无法静态解析被跳过),仅供参考,最终以真渲染引擎逐帧为准`)}for(let U of ND(Z)){if(U.perElementDriven||U.count!==null&&U.count<KD)continue;let F=U.count===null?"条数未知(循环边界非数字字面量)":`静态估算 ${U.count} 个`;J("8-primitive-merge",!1,`${U.site} 向同一父节点「${U.parent}」循环生成 ${F} <${U.tag}>。`+"这里有一批可无损合并的重复图元:请按相同 stroke/fill 分档合并成单个 <path> 的多子路径;"+"合并后画面逐像素不变,属零成本改法。本项只提示写法形态,最终画面仍以真渲染出片为准")}let q=ID(Z);if(q.animated.length)J("c-filter-animated",!1,`时间线补间直接驱动了真卷积滤镜(${q.animated.slice(0,3).join(";")})——`+"blur / drop-shadow / feGaussianBlur 是**真卷积**,每帧成本 ∝「被覆盖面积 × 半径 × 帧数」;"+"一旦被补间驱动,卷积结果**每帧失效**、缓存彻底失灵,这是本组三项里成本机制最重的一项。"+"改法:用 `opacity` / `transform`(`scale` / 位移)表达同一叙事动作;"+"确需滤镜就做成**静态两态切换**(滤镜值不随时间连续变),并把被滤元素的几何覆盖面积收到真正需要的那块矩形上。"+"本项是**成本提示**,不影响 ok / 退出码 / 铺轨;**未报 ≠ 这颗便宜**——真判据是真渲染出片计时");if(q.staticFullBleed.length)J("c-filter-static-fullbleed",!1,`整幅静态真卷积滤镜(${q.staticFullBleed.slice(0,3).join(";")})——该声明自身即全幅`+"(`position:absolute|fixed` + `inset:0` 或等价铺满),于是每帧都要对整幅做一次卷积。"+"**首选改法:缩小被滤镜覆盖的几何面积**(把滤镜收到它真正需要的那块矩形上——面积一项同时压掉卷积与整幅逐帧合成两笔成本);"+"次选把静态滤镜结果**预烘成图**,且 MUST 用 **RGBA PNG**(透明叠加颗粒的 alpha 是成片合成的必需通道,"+"烘成 JPEG 或任何无 alpha 格式会在成片里塌成不透明色块),但预烘只消得掉卷积、消不掉整幅逐帧合成,收益有上限、必有残差。"+"去不去滤镜属审美取值,判断权在作者:本项只给信息与改法,**恒非致命**、不拦铺轨;未报 ≠ 便宜,真判据是真渲染出片计时");if(q.staticTransformed.length)J("c-filter-static-transformed",!1,`静态真卷积滤镜的元素,其 transform 被补间驱动(${q.staticTransformed.slice(0,3).join(";")})——`+"滤镜值本身不变,但被滤子树**每帧换一个几何**,卷积结果每帧失效、必须重算,"+"与 `c-filter-animated` 是**同一类缓存失效**,只是驱动源从滤镜值换成了 transform。"+"r69 真渲实测:同颗粒对照下这一档 **+42.7%**,比「补间驱动 blur」的 +36.2% **还贵**——它是本组里最容易被忽略的一档。"+"改法(按优先级):① 把滤镜移到**不参与位移/缩放**的那一层(滤镜层与运动层拆开,运动交给外层容器);"+"② 缩小被滤元素的几何覆盖面积;③ 把静态滤镜结果**预烘成 RGBA PNG** 再让它随 transform 走(预烘图平移是零卷积)。"+"⚠️ 射程只收 `transform`:`opacity` 被补间驱动**不在本项射程**(opacity 侧尚无对照实测,不凭推测扩)。"+"本项恒非致命、不拦铺轨;未报 ≠ 便宜,真判据是真渲染出片计时");if(q.indeterminate.length)J("c-filter-indeterminate",!1,`该处 filter 值无法静态判定是否含真卷积(${q.indeterminate.slice(0,3).join(";")})——`+"补间值不是字符串字面量(变量 / 模板串 / 函数返回),本 lint 不做表达式求值与常量折叠,"+"故对该处**未作判定**:既不是「判过且通过」,也不是命中。请人工确认它是否会驱动 blur / drop-shadow;"+"若是,按 `c-filter-animated` 的改法处理。本项恒非致命、不拦铺轨");return{ok:!Y.some((U)=>U.fatal),violations:Y,opaque:V,compositionId:X}}var M1="html_render_simple",e7=/-B\d+(?:-aux\d+)?$/,yD=["com.lveditor.draft","JianyingPro"];function xD(Z,Q){return uW(Q??R1("mg-render",Z))}function Z2(Z){let Q=Z.toLowerCase();for(let Y of yD)if(Q.includes(Y.toLowerCase()))throw Error(`产物落点纪律:不写剪映草稿目录(${Z})——MOV 落普通目录后由你拖进剪映,素材归属才清晰。换个 --out 目录。`)}function kD(Z){let Q=/data-width\s*=\s*["'](\d+)["']/.exec(Z),Y=/data-height\s*=\s*["'](\d+)["']/.exec(Z);if(!Q||!Y)return;return{width:Number(Q[1]),height:Number(Y[1])}}async function mW(Z,Q={}){if(!Number.isFinite(Z.duration)||Z.duration<=0)throw Error("--duration <sec> 必填且须为正数(秒)——独立模式无坑位包络,它就是时长锚(lint 包络 = 成片时长 = 计费时长)。");let Y=Z.format??"qtrle";if(Y!=="qtrle")throw Error(Y==="webm"?"--format webm 暂不支持:剪映不吃 VP8-alpha,本模式首发只出 qtrle(QuickTime Animation alpha MOV,剪映真透底)。":`--format 仅支持 qtrle(收到「${Y}」)。`);let J=uW(Z.file),z=await vD(J,"utf8"),X=kD(z);if(X&&!(X.width===1920&&X.height===1080))return j.err(`颗粒几何 ${X.width}×${X.height}:gsap-emit v1 契约未开竖屏/异形口,首发仅 1920×1080——不静默出坏片。`),{ok:!1,mode:"render",reason:"geometry",geometry:X};let W=SD(J).replace(/\.html?$/i,""),V=IQ(z,{slotDuration:Z.duration,...e7.test(W)?{compositionId:W}:{}});for(let O of V.violations)(O.fatal?j.err:j.warn)(`${O.fatal?"✗":"·"} ${O.law}: ${O.msg}`);if(!V.ok)return j.err(`lint 未过(${V.violations.filter((O)=>O.fatal).length} 项致命)——未提交云任务,零计费。`),{ok:!1,mode:"render",reason:"lint",violations:V.violations};let K=F1(z)??W,G=xD(K,Z.out);Z2(G);let $=Math.round(Z.duration/60*1e4)/1e4,{billingHint:H}=await(Q.resolvePricing??m8)(M1,"独立颗粒渲染(qtrle 透明 MOV)");if(j.warn(`计费提示:${H}`),j.warn(`CLI 无本地 HTML 渲染引擎——独立颗粒唯一路 = 云渲计费任务;本次 ${Z.duration}s ≈ ${$} 分钟计费时长。`),!Z.yes){if(!await(Q.confirm??fD)("确认提交云渲?"))return j.warn("已取消:零云端调用、零计费。"),{ok:!1,mode:"render",reason:"declined",declined:!0,composition_id:K}}let N=(Q.loadCfg??jZ)(),q={composition:{video_size:{width:1920,height:1080},tracks:[],beats:[{html:z,start:0,duration:Z.duration}],assets:{file_id:{}}},render:{output_format:"qtrle"}},U=await(Q.submitTask??W8)(N,M1,q),F=Q.now??(()=>new Date().toISOString());await wD(G,{recursive:!0}),await gW(R1(G,"task.json"),JSON.stringify({task_type:M1,task_id:U,composition_id:K,source:J,duration_sec:Z.duration,output_format:"qtrle",submitted_at:F()},null,2)),j.step(`▶ 已提交云渲(task_id=${U}),轮询中…`);let M=await(Q.pollTask??B9)(N,M1,U,(O,C)=>j.info(`${O}${typeof C==="number"?` ${C}%`:""}`)),R=typeof M.download_url==="string"?M.download_url:void 0;if(!R)throw Error(`任务完成但 output_result 缺 download_url(task_id=${U},面包屑在 ${G})`);let D=R1(G,`${K}.mov`);return await(Q.download??g8)(R,D),await gW(R1(G,"result.json"),JSON.stringify({ok:!0,task_id:U,composition_id:K,output:`${K}.mov`,duration_sec:Z.duration,file_id:M.file_id??null,completed_at:F()},null,2)),j.ok(`渲染完成:${D}(qtrle 透明 MOV,直接拖进剪映即用)`),{ok:!0,mode:"render",composition_id:K,task_id:U,output:D,outDir:G,duration:Z.duration}}async function fD(Z){let{createInterface:Q}=await import("node:readline/promises"),Y=Q({input:process.stdin,output:process.stderr});try{let J=(await Y.question(`${Z} [y/N] `)).trim().toLowerCase();return J==="y"||J==="yes"}finally{Y.close()}}var cW=500,mD="未购授予",cD="clip_id 非法",lD="对该素材的关键词跑一次计费检索(gtrk matrix search)即获持久授予,之后可无限免费重签",dD="若该 id 是图片/音频素材:重签面现仅覆盖视频 clip 原片,属暂不支持;若是视频素材则多半已下架/不在库";function nD(Z){return bD(Z??"matrix-fetch")}function pD(Z){try{let Q=new URL(Z).pathname,Y=/\.([A-Za-z0-9]{1,5})$/.exec(Q);return Y?Y[1].toLowerCase():"bin"}catch{return"bin"}}function iD(Z){return(Z??[]).map((Q)=>{let Y=String(Q?.clip_id??""),J=String(Q?.reason??"未知原因");if(J===mD)return{clip_id:Y,reason:J,hint:lD};if(J===cD)return{clip_id:Y,reason:J};return{clip_id:Y,reason:J,hint:dD}})}async function oD(Z,Q,Y=fetch){let J=await Y(`${Z.base}/task/material_resign`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify({clip_ids:Q})}),z=await tZ(J);if(z.code!==200)throw new OZ(z.code,`原片重签失败 (code=${z.code??"?"}):${z.msg??"未知错误"}`);return{clips:z.data?.clips??[],missing:z.data?.missing??[]}}async function lW(Z,Q={}){let Y=[...new Set(Z.clipIds.map((N)=>N.trim()).filter(Boolean))];if(!Y.length)throw Error("用法:gtrk matrix fetch <clip_id...> [--out <dir>]——clip_id 来自 matrix search 的候选结果");if(Y.length>cW)throw Error(`单批最多 ${cW} 条(收到 ${Y.length})——分批再跑;授予持久、重签免费,分几批都不花钱`);let J=nD(Z.out);Z2(J),j.step(`▶ 原片重签 ${Y.length} 条(免费——授予的账在计费检索时已记完)…`);let z=(Q.loadCfg??jZ)(),{clips:X,missing:W}=await oD(z,Y,Q.fetchFn),V=iD(W),K=[],G=[];if(X.length)await gD(J,{recursive:!0});for(let N of X){let q=hD(J,`${N.clip_id}.${pD(N.url)}`);try{await(Q.download??g8)(N.url,q);let U=(await uD(q)).size;K.push({clip_id:N.clip_id,file:q,bytes:U}),j.info(`✓ ${N.clip_id} → ${q}(${(U/1048576).toFixed(1)}MB)`)}catch(U){G.push({clip_id:N.clip_id,reason:U.message}),j.warn(`✗ ${N.clip_id} 下载失败:${U.message}(授予仍在,重跑 fetch 该 id 即可)`)}}for(let N of V)j.warn(`✗ ${N.clip_id}:${N.reason}${N.hint?`——${N.hint}`:""}`);let $=V.length===0&&G.length===0,H=`${K.length}/${Y.length} 落盘 → ${J}${V.length?`(${V.length} 条被拦)`:""}${G.length?`(${G.length} 条下载失败)`:""}`;return($?j.ok:j.warn)(`拉取${$?"完成":"完成(有未落盘项)"}:${H}`),{ok:$,mode:"fetch",requested:Y.length,downloaded:K,missing:V,failed:G,outDir:J}}import{existsSync as rD}from"node:fs";import{resolve as aD}from"node:path";var h9=10,Q2=(Z)=>Math.round(Z*1000)/1000;function sD(Z){if(typeof Z!=="string"||Z.trim()==="")return{kind:"none",path:typeof Z==="string"?Z:""};let Q=Z.trim();if(/^https?:\/\//i.test(Q))return{kind:"remote",path:Q};if(/^[a-zA-Z]:[\\/]/.test(Q)||/^[\\/]{2}/.test(Q)||/^[\\/]/.test(Q))return{kind:"absolute",path:Q};return{kind:"relative",path:Q}}var tD=(Z)=>Z.replace(/\\/g,"/").replace(/^\.\//,"");function eD(Z){if(typeof Z.track_ed==="number")return Z.track_ed;if(typeof Z.track_st==="number"&&typeof Z.duration==="number")return Q2(Z.track_st+Z.duration);return null}var ZP=["video_track","audio_track","beat_track"],QP=["material","html_material"];function YP(Z){let Q=new Map;for(let Y of ZP){let J=Z[Y];if(!Array.isArray(J))continue;for(let z of J){if(!z||typeof z!=="object")continue;let X=typeof z.track_index==="number"?z.track_index:null,W=Array.isArray(z.track_timeline)?z.track_timeline:[];for(let V of W){if(!V||typeof V!=="object")continue;for(let K of QP){let G=V[K];if(typeof G!=="string"||G==="")continue;let $=Q.get(G)??[];$.push({track:Y,track_index:X,clip_id:typeof V.clip_id==="string"?V.clip_id:null,track_st:typeof V.track_st==="number"?V.track_st:null,track_ed:eD(V),key:K}),Q.set(G,$)}}}}return Q}function JP(Z){let Q=Z.exists??((H)=>rD(H)),Y=Array.isArray(Z.gtrk.materials)?Z.gtrk.materials:[],J=YP(Z.gtrk),z={relative:0,absolute:0,remote:0,noPath:0},X=[],W=[],V=[],K=0,G="";for(let H of Y){let N=typeof H?.id==="string"?H.id:"",{kind:q,path:U}=sD(H?.path);if(q==="none"){z.noPath++,V.push(N||"(无 id)");continue}if(q==="remote"){z.remote++;continue}z[q]++;let F=q==="relative"?aD(Z.gtrkDir,tD(U)):U,M;try{M=Q(F)}catch(O){if(K++,!G)G=O instanceof Error?O.message:String(O);continue}if(M)continue;let R=J.get(N)??[],D={id:N,path:U,kind:q,resolved:F,referenced:R.length>0,refCount:R.length,refs:R};(q==="relative"?X:W).push(D)}let $=(H,N)=>H.referenced===N.referenced?H.id.localeCompare(N.id):H.referenced?-1:1;return X.sort($),W.sort($),{checked:Y.length,counts:z,dangling:X,danglingReferenced:X.filter((H)=>H.referenced).length,danglingOrphan:X.filter((H)=>!H.referenced).length,external:W,noPathIds:V,...K>0?{degraded:{count:K,reason:G}}:{}}}function D1(Z){try{return JP({gtrk:Z.gtrk,gtrkDir:Z.gtrkDir,exists:Z.exists})}catch(Q){Z.log.warn(`素材落盘自检未能完成(${Q instanceof Error?Q.message:String(Q)})——写回结果与命令判定不受影响。`);return}}function dW(Z){if(Z.dangling.length===0)return`素材落盘自检:${Z.checked} 条素材全部就位`;return`素材落盘自检:${Z.checked} 条素材里有 ${Z.dangling.length} 条的文件不在盘上`+`(被时间线引用 ${Z.danglingReferenced} 条 · 孤儿 ${Z.danglingOrphan} 条)——只报不动,工程与文件零改动。`}function zP(Z){let Q=Z.referenced?"被引用":"孤儿";if(!Z.referenced)return`[${Q}] ${Z.id} → ${Z.path}`;let Y=Z.refs[0],J=Y.track_st!==null?` · ${Q2(Y.track_st)}→${Y.track_ed===null?"?":Q2(Y.track_ed)}s`:"",z=Z.refCount>1?` 等 ${Z.refCount} 处`:"";return`[${Q}] ${Z.id} → ${Z.path}`+`(${Y.track} track_index=${Y.track_index??"?"} · clip ${Y.clip_id??"?"}${J}${z})`}function P1(Z,Q){if(Z.degraded)Q.warn(`素材落盘自检降级:${Z.degraded.count} 条素材查不了存在性(${Z.degraded.reason})——`+"这几条既不算就位也不算悬空,其余条目照常已查。");if(Z.dangling.length===0)Q.info(dW(Z));else{Q.warn(dW(Z));for(let Y of Z.dangling.slice(0,h9))Q.warn(` ${zP(Y)}`);if(Z.dangling.length>h9)Q.warn(` …等共 ${Z.dangling.length} 条(全量见 --json 的 integrity.dangling)`);Q.info("被引用的悬空 = 时间线上那一段没有素材可放(客户端可能 relink 回落到别的素材);孤儿 = 只在 materials 里挂着、不影响画面。"),Q.info("悬空多半是历史遗留(如客户端「确认原片」下载中断);CLI 只报不删,要修就在客户端重新确认原片、或删掉那条 clip。")}if(Z.external.length>0)Q.warn(`另有 ${Z.external.length} 条**绝对路径**素材当前找不到文件(外接盘/网络盘没挂载也会这样,不计入上面的悬空):`+Z.external.slice(0,h9).map((Y)=>`${Y.id} → ${Y.path}`).join(";")+(Z.external.length>h9?` …等共 ${Z.external.length} 条`:""));if(Z.noPathIds.length>0)Q.warn(`另有 ${Z.noPathIds.length} 条素材没有 path(结构问题,非落盘问题):`+Z.noPathIds.slice(0,h9).join("、")+(Z.noPathIds.length>h9?` …等共 ${Z.noPathIds.length} 条`:""))}var nW="local-";function SQ(Z){return Z.source==="local"||typeof Z.local_path==="string"}function XP(Z){let Q=[];if(Z.source!=="local")Q.push('本地 result 必须带 source:"local" 标记');if(!Z.clip_id.startsWith(nW))Q.push(`clip_id 必须为 ${nW}<blake3-16> 且 MUST NOT 预置 broll- 前缀(得到 ${Z.clip_id})——材料 id 由消费方拼 broll-+clip_id 得出`);if(typeof Z.local_path!=="string"||!Z.local_path)Q.push("本地 result 缺 local_path(素材绝对路径)");for(let J of["url","cover_url","url_ttl_note"])if(J in Z)Q.push(`本地 result MUST NOT 出现 ${J}(无签名过期语义)`);let Y=Z.segments??[];for(let J=1;J<Y.length;J++)if(Y[J].score>Y[J-1].score){Q.push("segments 必须按 score 降序");break}for(let J of Y)if(!(J.start<=J.best&&J.best<=J.end)){Q.push(`segment best 必须落在 [start,end] 内(${J.start}–${J.end} best=${J.best})`);break}return Q}var WP=["duration","width","height","fps"];function VP(Z,Q,Y){if(typeof Z.clip_id!=="string"||!Z.clip_id){Y.push(`${Q}:clip_id 不可编辑——必须为非空字符串(得到 ${JSON.stringify(Z.clip_id)})`);return}if(!(typeof Z.score==="number"&&Number.isFinite(Z.score)))Y.push(`${Q}:score 必须为有限数字(得到 ${JSON.stringify(Z.score)})`);for(let J of WP){let z=Z[J];if(z!==void 0&&!(typeof z==="number"&&Number.isFinite(z)&&z>0))Y.push(`${Q}:几何字段 ${J} 不可编辑——须为正数(得到 ${JSON.stringify(z)})`)}if(Z.segments!==void 0)if(!Array.isArray(Z.segments))Y.push(`${Q}:segments 须为数组(可删段,但不可改形态)`);else for(let J of Z.segments){if(![J?.start,J?.end,J?.best,J?.score].every((X)=>typeof X==="number"&&Number.isFinite(X))){Y.push(`${Q}:segment 四键(start/end/best/score)须为有限数字`);break}if(!(J.start<=J.best&&J.best<=J.end)){Y.push(`${Q}:segment 几何不可编辑——best 必须落在 [start,end] 内(${J.start}–${J.end} best=${J.best})`);break}if(J.motion!==void 0){let X=J.motion,W=(K)=>typeof K==="number"&&Number.isFinite(K);if(!X||typeof X!=="object"||Array.isArray(X)||!W(X.p50)||!W(X.p90)||X.p90<X.p50||!(typeof X.samples==="number"&&Number.isInteger(X.samples)&&X.samples>0)||X.effective_fps!==void 0&&!(W(X.effective_fps)&&X.effective_fps>0)){Y.push(`${Q}:segment motion 须为 {p50,p90(≥p50),samples(正整数),effective_fps?(正数)}(可整体删除,不可改坏形态)`);break}}if(J.cuts!==void 0){if(!Array.isArray(J.cuts)||!J.cuts.every((W)=>typeof W==="number"&&Number.isFinite(W))||J.cuts.some((W,V)=>V>0&&W<=J.cuts[V-1]||W<=J.start||W>=J.end)){Y.push(`${Q}:segment cuts 须为升序有限数字且严格落在 (start,end) 开区间内(可整体删除,不可改坏形态)`);break}}}if(Z.pinned!==void 0&&typeof Z.pinned!=="boolean")Y.push(`${Q}:pinned 只能是布尔(钉选写 pinned:true;得到 ${JSON.stringify(Z.pinned)})`);if(Z.describe!==void 0){let J=Z.describe;if(!J||typeof J!=="object"||Array.isArray(J))Y.push(`${Q}:describe 须为对象({desc,tags,mark,usable_flags} 宽松形态)`);else{if(J.desc!==void 0&&typeof J.desc!=="string")Y.push(`${Q}:describe.desc 须为字符串`);if(J.tags!==void 0&&!(Array.isArray(J.tags)&&J.tags.every((z)=>typeof z==="string")))Y.push(`${Q}:describe.tags 须为字符串数组`);if(J.mark!==void 0&&!(typeof J.mark==="number"&&Number.isFinite(J.mark)))Y.push(`${Q}:describe.mark 须为数字`);if(J.usable_flags!==void 0&&(!J.usable_flags||typeof J.usable_flags!=="object"||Array.isArray(J.usable_flags)))Y.push(`${Q}:describe.usable_flags 须为对象`)}}if(SQ(Z))for(let J of XP(Z))Y.push(`${Q}:${J}`)}function rW(Z){let Q=[];if(!Z||typeof Z!=="object"||Array.isArray(Z))return["plan 不是 JSON 对象"];let Y=Z;if(Y.plan_version!=="v1")Q.push(`plan_version 必须为 "v1"(得到 ${JSON.stringify(Y.plan_version)})`);if(!Array.isArray(Y.beats))return Q.push("beats 必须为数组"),Q;for(let J of Y.beats){if(!J||typeof J!=="object"||typeof J.beat!=="string"||!J.beat){Q.push("存在缺 beat 名的 beat 条目");continue}if(!(typeof J.track_st==="number"&&typeof J.track_ed==="number"&&Number.isFinite(J.track_st)&&Number.isFinite(J.track_ed)))Q.push(`beat ${J.beat}:track_st/track_ed 须为有限数字`);if(J.anchors!==void 0){if(!Array.isArray(J.anchors))Q.push(`beat ${J.beat}:anchors 须为数组(可删锚/挪 at_sec,不可改坏形态)`);else for(let W of J.anchors)if(!(W&&typeof W==="object"&&!Array.isArray(W)&&typeof W.keyword==="string"&&W.keyword&&typeof W.utterance==="string"&&W.utterance&&typeof W.query==="string"&&W.query&&(W.at_sec===null||typeof W.at_sec==="number"&&Number.isFinite(W.at_sec)))){Q.push(`beat ${J.beat}:anchor 须为 {keyword/utterance/query 非空字符串, at_sec 有限数字或 null}(可删锚/挪 at_sec,不可改坏形态)`);break}}let z=J.arrange_mode;if(z!==void 0&&!(typeof z==="string"&&pW.includes(z)))Q.push(`beat ${J.beat}:arrange_mode 非法(三选一:${pW.join(" | ")};得到 ${JSON.stringify(z)})——越界档位 MUST NOT 静默降级到低档`);let X=J.direct_slots;if(X!==void 0)if(!Array.isArray(X))Q.push(`beat ${J.beat}:direct_slots 须为数组(可删槽,不可改坏形态)`);else{let W=(V)=>typeof V==="number"&&Number.isFinite(V);for(let V of X){if(!V||typeof V!=="object"||Array.isArray(V)){Q.push(`beat ${J.beat}:存在非对象 direct_slot 条目`);break}let{clip_id:K,clip_st:G,clip_ed:$,track_st:H,track_ed:N}=V;if(!(typeof K==="string"&&K)||!W(G)||!W($)){Q.push(`beat ${J.beat}:direct_slot 须为 {clip_id 非空字符串, clip_st/clip_ed 有限数字}(得到 ${JSON.stringify(V)})`);break}if(!(G<$)){Q.push(`beat ${J.beat}:direct_slot 源窗须 clip_st < clip_ed(得到 ${JSON.stringify(G)}–${JSON.stringify($)})——源窗是「出处」的本体`);break}if(H===void 0!==(N===void 0)){Q.push(`beat ${J.beat}:direct_slot 的 track_st/track_ed 要么都给要么都不给(只给一半是无意义的半个约束)`);break}let q=V.slot_role;if(q!==void 0&&!(typeof q==="string"&&iW.includes(q))){Q.push(`beat ${J.beat}:direct_slot 的 slot_role 非法(二选一:${iW.join(" | ")};得到 ${JSON.stringify(q)})——越界值 MUST NOT 静默降级`);break}if(q==="quote"&&H===void 0){Q.push(`beat ${J.beat}:direct_slot 标了 slot_role:"quote" 却没给 track_st/track_ed——引用段要逐秒对齐,没有时间线位置无从对齐`);break}if(H!==void 0&&!(W(H)&&W(N)&&H<N)){Q.push(`beat ${J.beat}:direct_slot 的时间线位置须为有限数字且 track_st < track_ed(得到 ${JSON.stringify(H)}–${JSON.stringify(N)})`);break}}}if(!Array.isArray(J.queries)){Q.push(`beat ${J.beat}:queries 必须为数组`);continue}for(let W of J.queries){if(!W||typeof W!=="object"||typeof W.query!=="string"){Q.push(`beat ${J.beat}:存在缺 query 文本的 query 条目`);continue}if(W.results===void 0)continue;if(!Array.isArray(W.results)){Q.push(`beat ${J.beat}/「${W.query}」:results 须为数组(可删条/重排,不可改形态)`);continue}for(let V of W.results){if(!V||typeof V!=="object"){Q.push(`beat ${J.beat}/「${W.query}」:存在非对象 result 条目`);continue}VP(V,`beat ${J.beat}/「${W.query}」/clip ${String(V.clip_id??"?")}`,Q)}}}return Q}function aW(Z,Q,Y,J){if(!Z||!Q)return null;let z=Z.indexOf(Q);if(z<0)return null;let X=J-Y;if(!(Number.isFinite(Y)&&Number.isFinite(X)&&X>0))return null;return Math.round((Y+z/Z.length*X)*1000)/1000}var pW=["direct","temporal","semantic"],iW=["quote","provenance"],KP="结果 url 带签名默认 24h 过期;过期后重跑 gtrk matrix 即重签(plan 幂等重生成)。",sW={internal:"/task/custom/video_clip_search",external:"/task/video_clip_search"};function tW(Z){let Q=Z==="internal"?"internal":"external";return{tier:Q,endpoint:sW[Q]}}var GP=3,$P=10,oW=50,Y2=10;function eW(Z){return typeof Z==="number"&&Number.isInteger(Z)&&Z>0?Z:void 0}function Z4(Z){return typeof Z==="number"&&Number.isFinite(Z)&&Z>0?Z:void 0}function HP(Z,Q){if(Q&&Q>0)return Math.min(Math.max(Math.floor(Q),1),oW);let Y=eW(Z);if(!Y)return Y2;return Math.min(Math.max(Y*GP,$P),oW)}function qP(Z,Q){if(!Z||typeof Z!=="object")return;let Y=Object.entries(Z).filter(([J])=>!Q||Q.includes(J));return Y.length?Object.fromEntries(Y):void 0}var UP=["real_shot","concept"];function Q4(Z,Q,Y,J,z={}){let X={query:Q,top_k:HP(Y?.shots,z.topK)},W=Z4(Y?.per_shot_sec);if(W)X.filters={min_duration:W};if(Z==="internal"){if(J?.column_tag_ids?.length)X.column_tag_ids=[...J.column_tag_ids];let V=z.materialClass??J?.material_class_policy;if(V&&UP.includes(V))X.material_class=V;let K=qP(J?.facet_defaults,J?.facet_allowed);if(K)X.facets=K}return X}function NP(Z){if(!Array.isArray(Z))return;let Q=Z.filter((Y)=>typeof Y==="string");return Q.length?Q:void 0}function BP(Z,Q){if(!Q?.length)return;for(let Y of Z)if(typeof Y.note==="string"&&Y.note&&Q.some((J)=>Y.note.includes(J)))Y.excluded_hint=!0}function jP(Z,Q){let Y=(z)=>Q?.has(z.query)??!1,J=new Map;for(let z=0;z<Z.length;z++){if(Y(Z[z]))continue;for(let X of Z[z].results??[]){let W=J.get(X.clip_id);if(!W||X.score>W.r.score)J.set(X.clip_id,{qi:z,r:X})}}for(let z=0;z<Z.length;z++){let X=Z[z];if(!X.results||Y(X))continue;X.results=X.results.filter((W)=>{let V=J.get(W.clip_id);if(V.qi===z&&V.r===W)return!0;let K=V.r.also_matched_queries??=[];if(!K.includes(X.query))K.push(X.query);return!1})}}function Y4(Z,Q){let Y={beat:Z.beat,track_st:Z.track_st,track_ed:Z.track_ed,queries:[]},J=eW(Z.shots);if(J)Y.requested_shots=J;let z=Z4(Z.per_shot_sec);if(z)Y.per_shot_sec=z;let X=NP(Z.exclude);if(X)Y.exclude=X;for(let V of Q){if(V.error){Y.queries.push({query:V.query,error:V.error});continue}let K=(V.data?.results??[]).map(($)=>({...$}));BP(K,X);let G={query:V.query,results:K};if(typeof V.data?.recalled==="number")G.recalled=V.data.recalled;Y.queries.push(G)}let W=new Set((Z.anchors??[]).map((V)=>V.query).filter((V)=>typeof V==="string"&&V.length>0));return jP(Y.queries,W.size?W:void 0),Y}function J4(Z){let Q={plan_version:"v1",generated_at:Z.generatedAt,member_type:Z.memberType,...Z.memberType==="local"?{}:{url_ttl_note:KP},beats:Z.beats};if(Z.projectSlug)Q.project_slug=Z.projectSlug;if(Z.columnId)Q.column_id=Z.columnId;return Q}function O1(Z,Q){switch(Z){case 400:return`请求体非法(网关校验):${Q||"请求参数或请求体格式错误"}`;case 6502:return"鉴权失败——检查 API Key(gtrk init 重配)";case 403:return"非矩阵成员或身份可能已变更——矩阵成员口(custom/video_clip_search)仅对 internal 档位开放";case 6401:return"检索上游故障,或检索参数/栏目配置非法(如 facets 值拼写)——稍后重试仍失败请检查栏目配置的 broll 块";case 6402:return"检索上游超时——稍后重试";default:return`云端错误 (code=${Z??"?"}):${Q||"未知错误"}`}}var L1=25000;async function z4(Z){let Q=await fetch(`${Z.base}/user/get_user_info`,{method:"POST",headers:{accept:"application/json",Authorization:Z.apiKey},body:"",signal:AbortSignal.timeout(L1)}),Y=await tZ(Q);if(Y.code!==200)throw new OZ(Y.code,O1(Y.code,Y.msg));return Y.data}async function J2(Z){return tW((await z4(Z))?.matrix_member_type).tier}async function z2(Z){return(await z4(Z))?.gc_member_type==="internal"?"internal":"external"}function FP(Z,Q){try{return JSON.parse(Z.replace(/"clip_id"\s*:\s*(\d+)/g,'"clip_id":"$1"'))}catch{throw Error(`服务响应解析失败 (HTTP ${Q})`)}}async function X4(Z,Q,Y){let J=await fetch(`${Z.base}${sW[Q]}`,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:JSON.stringify(Y),signal:AbortSignal.timeout(L1)}),z=FP(await J.text(),J.status);if(z.code!==200)throw new OZ(z.code,O1(z.code,z.msg));return z.data??{}}var W4=["clip","image","audio"],C1="audio",_1=5,MP=50,V4={internal:"/task/custom/material_search",external:"/task/material_search"},X2={internal:"0 积分(矩阵成员免费,0 元照留痕带 task_id)",external:"1 积分/次"},T1="https://ai-mcn.tv/#creator-network",RP=`加入同和新媒体矩阵可免费搜全库(含非商用/概念素材):${T1}`,DP=`部分槽位没铺上(素材池填不满,成片对应位置会留黑底)——加入同和新媒体矩阵可免费搜全库(含非商用/概念素材):${T1}`;function W2(Z,Q,Y){if(Z!=="external")return;if(Q===0||Q<Y/2)return{message:RP,url:T1};return}function V2(Z,Q){if(Z!=="external")return;if(Q>0)return{message:DP,url:T1};return}function K4(Z){return V4[Z]}function G4(Z){let Q=(Z??"").trim();if(!Q)return C1;if(!W4.includes(Q))throw Error(`--scope 取值非法(${Z})——只支持 ${W4.join(" | ")}(缺省 ${C1})`);return Q}function $4(Z){if(Z===void 0||String(Z).trim()==="")return _1;let Q=Number(String(Z).trim());if(!Number.isFinite(Q)||Q<1)throw Error(`--top-k 取值非法(${Z})——须为 ≥1 的整数(缺省 ${_1})`);return Math.min(Math.floor(Q),MP)}function H4(Z,Q){let Y=(X,W)=>{if(X===void 0||String(X).trim()==="")return;let V=Number(String(X).trim());if(!Number.isFinite(V)||V<0)throw Error(`${W} 取值非法(${X})——须为非负数字(秒)`);return V},J=Y(Z,"--min-duration"),z=Y(Q,"--max-duration");if(J!==void 0&&z!==void 0&&z<J)throw Error(`时长区间非法(--min-duration ${J} > --max-duration ${z})——上界不能小于下界`);return{...J!==void 0?{min:J}:{},...z!==void 0?{max:z}:{}}}function q4(Z,Q){let Y={scope:Q.scope,query:Q.query,top_k:Q.topK};if(Q.diversity)Y.diversity=!0;if(Z==="internal"){Y.copyright_scope=Q.commercialOnly?"commercial":"all";let J={};if(Q.minDuration!==void 0)J.min_duration=Q.minDuration;if(Q.maxDuration!==void 0)J.max_duration=Q.maxDuration;if(Object.keys(J).length)Y.filters=J}return Y}function PP(Z){if(!Z||typeof Z!=="object"||Array.isArray(Z))return;let Q={...Z},Y=Z.id;if(Y===void 0||Y===null||Y==="")return;Q.id=String(Y);let J=Z.score;if(typeof J==="string"&&J.trim()!==""&&Number.isFinite(Number(J)))Q.score=Number(J);return Q}function OP(Z){if(!Array.isArray(Z))return[];return Z.map(PP).filter((Q)=>Q!==void 0)}function U4(Z,Q){if(Q.min===void 0&&Q.max===void 0)return Z;return Z.filter((Y)=>{let J=Y.duration;if(typeof J!=="number"||!Number.isFinite(J))return!0;if(Q.min!==void 0&&J<Q.min)return!1;if(Q.max!==void 0&&J>Q.max)return!1;return!0})}function LP(Z,Q){if(Z===403)return"非矩阵成员或身份可能已变更——矩阵成员口(custom/material_search)仅对 internal 档位开放,公开口 /task/material_search 可直接用(1 积分/次,只含可商用素材)";return O1(Z,Q)}function CP(Z,Q){try{return JSON.parse(Z.replace(/"id"\s*:\s*(\d+)/g,'"id":"$1"'))}catch{throw Error(`服务响应解析失败 (HTTP ${Q})`)}}function _P(Z){if(!Z||typeof Z!=="object"||Array.isArray(Z))return{};let Q=Z;if(!Array.isArray(Q.results)&&Q.data&&typeof Q.data==="object"&&!Array.isArray(Q.data))return Q.data;return Q}async function N4(Z,Q,Y){let J=await fetch(`${Z.base}${V4[Q]}`,{method:"POST",headers:{accept:"application/json","Content-Type":"application/json",Authorization:Z.apiKey},body:JSON.stringify(Y),signal:AbortSignal.timeout(L1)}),z=CP(await J.text(),J.status);if(z.code!==200)throw new OZ(z.code,LP(z.code,z.msg));let X=_P(z.data);return{...typeof X.request_id==="string"?{request_id:X.request_id}:{},...X.task_id!==void 0&&X.task_id!==null?{task_id:String(X.task_id)}:{},...typeof X.total==="number"?{total:X.total}:{},results:OP(X.results)}}import{existsSync as TP}from"node:fs";import{resolve as AP,sep as B4}from"node:path";var EP=3000,IP=1500,SP=60,vP=0.2,K2=(Z)=>Math.round(Z*1e4)/1e4;function wP(Z,Q={}){if(!Z.length)return[];let Y=Q.gapMs??EP,J=Q.minWidthMs??IP,z=[],X=[Z[0]];for(let V of Z.slice(1))if(V.ts_ms-X[X.length-1].ts_ms<=Y)X.push(V);else z.push(X),X=[V];z.push(X);let W=[];for(let V of z){let K=V[0].scene_st_ms,G=V[V.length-1].scene_ed_ms,$=V.map((q)=>q.score).sort((q,U)=>U-q),H=$.length>=3?0.5*$[0]+0.3*$[1]+0.2*$[2]:$[0],N=V[0];for(let q of V)if(q.score>N.score)N=q;if(G-K<J)continue;W.push({start_ms:K,end_ms:G,best_ts_ms:N.ts_ms,score:K2(H),best_frame_score:K2(N.score),n_frames:V.length})}return W.sort((V,K)=>K.score-V.score),W}function yP(Z,Q){let Y=(z)=>{let X=AP(z);return process.platform==="win32"?X.toLowerCase():X},J=Y(Z);return Q.some((z)=>{let X=Y(z);return J===X||J.startsWith(X.endsWith(B4)?X:X+B4)})}function R4(Z,Q,Y={}){let J=Y.fileExists??TP,z=Z.all(`SELECT f.ts_ms, f.vec, s.st_ms, s.ed_ms, s.stable AS scene_stable,
|
|
221
221
|
m.id AS mkey, m.material_id, m.path, m.kind, m.duration_ms, m.width, m.height, m.fps
|
|
222
222
|
FROM frames f
|
|
223
223
|
JOIN scenes s ON f.scene_id = s.id
|
|
224
224
|
JOIN materials m ON f.material_id = m.id
|
|
225
|
-
ORDER BY m.id, f.ts_ms`),X=[],
|
|
226
|
-
FROM scenes WHERE motion_p50 IS NOT NULL ORDER BY material_id, st_ms`)){let
|
|
227
|
-
`,"utf-8")}catch{}}function N4(Z,Q,Y=P1()){kO({title:EO(Z),project:Q},Y)}function B4(Z=_Q,Q=P1()){return new Set(U4(Q).slice(0,Math.max(0,Z)).map((Y)=>Y.key))}function j4(Z,Q){if(Q.size===0||Z.length===0)return{kept:Z,skipped:0,exhausted:!1};let Y=Z.filter((J)=>!Q.has(q4(String(J.title??J.id??""))));if(Y.length===0)return{kept:Z,skipped:0,exhausted:!0};return{kept:Y,skipped:Z.length-Y.length,exhausted:!1}}function C4(Z){Z.command("matrix [words...]").description('B-roll 检索:无 positional=消费 split/dispatch.json 的 film_broll 队列产候选清单;`matrix search "<query>"`=单条 ad-hoc 剪辑向检索;`matrix material "<query>"`=通用三态素材检索(下载向,clip/image/audio,BGM 主场);`matrix fetch <clip_id...>`=精剪期拉原片(对已授予素材免费重签+下载落盘);`matrix index --dirs <a,b>`=本地素材索引;`matrix describe`=按需理解零件(plan 注入/素材文件);`matrix lay`=消费(agent 编辑后的)plan 文件铺轨').option("--project <dir>","oralcut 产物目录(定位 split/dispatch.json 与产物落点)").option("--dispatch <path>","显式指定 dispatch.json(非标准布局兜底)").option("--column <id>","栏目配置 id(缺省取 config defaultColumn,再缺省内置默认栏目;仅云端模式)").option("--top-k <n>",`每 query 候选数上限(覆盖派单 shots 翻译;云端服务端上限 50;matrix material 缺省 ${D1})`).option("--material-class <c>","素材类型 real_shot|concept(仅矩阵成员口;覆盖栏目 material_class_policy)").option("--local","本地检索模式:走本地素材索引检索(须配 --dirs;跳过身份探针,不触任何云端检索端点)").option("--dirs <a,b,...>","本地素材文件夹(逗号分隔)——matrix index 的索引范围 / --local 的检索域").option("--scene-threshold <f>","matrix index:场景切换检测阈值(ffmpeg select gt(scene,X),默认 0.3)").option("--stability-threshold <f>","matrix index:场景稳定性判定阈值——场景内最大帧间 scene score 低于此值判 stable(固定机位),抽帧收敛为中点 1 帧(默认 0.05,保守值待标定;误判 stable 丢检索粒度、误判 unstable 只是不省钱,宁严勿松)").option("--rebuild","matrix index:忽略 size:mtime 指纹,强制全量重建索引").option("--decode-path <mode>","matrix index:场景检测的解码路径 auto|gpu|cpu|full——auto 自动探测硬解并逐素材降级(推荐),gpu/cpu/full 钉死某档且失败不降级(对照与排障用;默认 full = 旧行为)").option("--proxy-width <n>","matrix index:代理解码宽度(默认 384;再往下保真度明显劣化,勿随手调小)").option("--proxy-scaler <name>","matrix index:代理缩放算法(默认 neighbor——点采样不滤波,实测比默认 bicubic 又快又准;改这个基本只有做对照实验才需要)").option("--plan <path>","matrix describe:理解该 plan 的 top 候选并把产物写回 result.describe;matrix lay:显式指定要消费的 plan 文件(缺省 <project>/split/broll-plan.json)").option("--materials <a,b,...>","matrix describe:直接理解素材文件(逗号分隔;视频按场景抽帧、图片直传)").option("--source-window <start,end>","--local 检索:只返回与源时间窗(秒)有交集的命中段(段边界不裁剪;图片候选不参与;窗口无命中返回空结果非错误)").option("--no-image-broll","--local 模式:完全排除图片候选(不出检索结果、不进铺轨候选池、零图片上云)——图片候选默认参与,被选中时经云端 image_move 转运镜视频入轨(图片本体会上云做运镜)").option("--yes","跳过交互确认(当前用于:图片运镜生成前的积分预估确认)").option("--dedup-scope <scope>","铺轨去重粒度:scene=场景级(默认;同素材不同场景可分配,相邻槽位按跳剪豁免避让)| material=严格档(同一素材文件整轮只用一次)").option("--highlight-weight <w>","仅 matrix lay:看点权重 0..1(默认 0 关闭零回归)——与 --mark-weight 正交(mark=画面好不好看,highlight=有没有看点:信息量/戏剧性/情绪强度/稀缺性);两权之和钳到 1,看点分取 describe 理解缓存,无缓存候选中性(权重回吐给 sim)").option("--mark-weight <w>","仅 matrix lay:美观度权重 0..1(默认 0 关闭零回归)——候选融合分 = sim×(1-w)+(mark/100)×w,mark 取 describe 理解缓存(素材内就近帧);无缓存候选按中性处理(融合分=sim,不惩罚不加分)").option("--cut-align <ratio>","句界吸附目标比例 0..1(默认 0.7):约七成字幕句起点恰逢镜头切点、三成有意错开(全对齐会机械);0=关闭回旧节奏切槽。"+"句级时码取 transcript 现场重投影(与关键词锚同源),重投影降级时自动回旧行为并告警").option("--gap-fill <mode>","音频驱动工程主轨空洞填充 fast|solid|none(缺省 solid):fast=放宽 score 地板从候选池随便填、耗尽延长相邻颗粒、再不够垫黑片;"+"solid=黑片垫齐(精修时一眼看出「这里没匹配到」);none=留 gap(客户端主轨磁吸开启时 gap 会被吸除、后续画面整体前移与配音错位,慎用)。"+"口播工程主轨为 A-roll,本参数不适用(照旧留空语义)").option("--arrange <mode>","B-roll 编排取数路 local|shadow|cloud,**按素材来源自动定档,一般不用传**:"+"铺你自己电脑里的素材=cloud(编排在云端做,算法只在服务端迭代,按「编排量」计费,"+"跑前报预估并征求确认、--yes 跳过);铺素材矩阵的素材=local(编排仍在本机、不计费,逐字不动)。"+"shadow=本机照跑照铺轨、云端只对拍不采纳;cloud=采纳云端产物,自校验不一致时回落本机并大声告知。"+"⚠️ 本地素材路上 --arrange local **已不受理**(编排只在服务端迭代,留旧路等于让你在不知情时拿到另一套算法的结果),"+"且云端拿不到产物时**直接报错**、不会悄悄换算法把活干完。"+"它也不是省钱开关——用素材矩阵的素材同样要付检索费,两条路都要花钱、只是花在不同环节").option("--arrange-cost-cap <n>","云端编排单次编排量上限:超限服务端**前置拒绝**、零执行零计费(不是跑到一半掐断)。只在 --arrange shadow|cloud 时有意义").option("--arrange-qc","编排期质检(缺省关):**落轨之前**就查每个 beat 的卡点句「画面有没有给到稿子说的东西」,"+`没给到就换候选重排,最多 ${S0} 轮,到限即交付并如实登记还差哪几句。全程零渲染——`+"替代「铺完→渲→看→重铺→再渲」那两轮。⚠️ 判定走素材理解口,**按帧计费**(每个卡点句 1 帧/轮),"+"跑前会报预估并征求确认(--yes 跳过)").option("--lay <n>","候选铺轨数:下载 preview 代理并在工程里平铺 N 条 B-roll 候选轨(默认 1;0=只出 plan 不铺轨)","1").option("--score-floor <f>","填充置信度地板:segment score 低于此值不采纳,槽位留空——黑底垫轨默认开,留空处露的是黑底(要露主轨口播画面得配 --no-black-bed)。"+"调高会收缩取材池、可能整段无槽位铺成纯黑,调完先看铺轨输出的空洞告警(默认 0.2;--local 模式同为该段的候选池准入地板)").option("--no-black-bed","不铺纯黑底垫轨(默认铺一条,垫在候选轨之下、口播主轨之上,用于 B-roll 期间遮住口播画面)").option("--force-relay","候选轨已被你在客户端编辑过(改过 clip / 确认过原片)时仍强制剥离重铺:缺省会拒铺并保留那条轨,本开关是逃生门——"+"会删除已确认原片的 broll-raw-* 素材登记,盘上已下载的原片文件就地成孤儿,且那条轨上的编辑不可恢复").option("--scope <s>",`matrix material:素材形态 clip|image|audio(缺省 ${R1}——本零件第一场景是 BGM;要剪辑向 segments 请用 matrix search)`).option("--commercial-only","matrix material:只搜可商用素材(矩阵成员口传 copyright_scope=commercial;缺省搜全库含非商用)——公开口本就只含可商用素材,该档位会显式提示").option("--min-duration <sec>","matrix material:最短时长(秒)——BGM 按成片时长挑").option("--max-duration <sec>","matrix material:最长时长(秒)").option("--diversity","matrix material:去同质化,避免返回雷同素材").option("--exclude-recent <n>",`matrix material --scope audio:避让最近 n 首用过的 BGM(缺省 ${_Q};历史由 audio lay 落轨自动记账)`).option("--no-exclude-recent","matrix material --scope audio:关闭选曲避让(允许复用近期曲目)").option("--out <file>","ad-hoc 模式:结果落文件(缺省输出 stdout);matrix fetch:原片落盘目录(缺省 ./matrix-fetch/;绝不写剪映草稿目录)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{await cO(gO(Q),Y)})}function gO(Z){if(!Z||Z.length===0)return{kind:"plan"};if(Z[0]==="material"){let Y=Z.slice(1).join(" ").trim();if(!Y)throw Error('检索词不能为空:gtrk matrix material "<query>"');return{kind:"material",query:Y}}if(Z[0]==="fetch"){let Y=Z.slice(1);if(!Y.length)throw Error("用法:gtrk matrix fetch <clip_id...> [--out <dir>]——clip_id 来自 matrix search 的候选结果(两段式:先 search 挑定、再 fetch 拉原片)");return{kind:"fetch",clipIds:Y}}if(Z[0]==="index"){if(Z.length>1)throw Error(`matrix index 不接受多余参数「${Z.slice(1).join(" ")}」——用法:gtrk matrix index --dirs <a,b,...>`);return{kind:"index"}}if(Z[0]==="describe"){if(Z.length>1)throw Error(`matrix describe 不接受多余参数「${Z.slice(1).join(" ")}」——用法:gtrk matrix describe --plan <path> | --materials <a,b,...>`);return{kind:"describe"}}if(Z[0]==="lay"){if(Z.length>1)throw Error(`matrix lay 不接受多余参数「${Z.slice(1).join(" ")}」——用法:gtrk matrix lay --project <dir> [--plan <path>]`);return{kind:"lay"}}if(Z[0]!=="search")throw Error(`未知子命令「${Z[0]}」——ad-hoc 剪辑向检索:gtrk matrix search "<query>";通用三态素材检索:gtrk matrix material "<query>";精剪期拉原片:gtrk matrix fetch <clip_id...>;派单消费:gtrk matrix --project <dir>;本地索引:gtrk matrix index --dirs <a,b,...>;理解零件:gtrk matrix describe;消费编辑后 plan:gtrk matrix lay`);let Q=Z.slice(1).join(" ").trim();if(!Q)throw Error('检索词不能为空:gtrk matrix search "<query>"');return{kind:"search",query:Q}}function C1(Z){return(Z??"").split(",").map((Q)=>Q.trim()).filter(Boolean).map((Q)=>Y0(Q))}function uO(Z,Q){let Y=C1(Q.dirs);if(Z.kind!=="material"){let J=[[Q.scope,"--scope"],[Q.commercialOnly,"--commercial-only"],[Q.minDuration,"--min-duration"],[Q.maxDuration,"--max-duration"],[Q.diversity,"--diversity"]];for(let[z,X]of J)if(z!==void 0&&z!==!1)throw Error(`${X} 仅用于 gtrk matrix material(通用三态素材检索),不做静默忽略`)}if(Q.highlightWeight!==void 0&&Z.kind!=="lay")throw Error("--highlight-weight 仅用于 matrix lay(融合排序只在消费 plan 铺轨这一步生效,不做静默忽略)");if(Q.markWeight!==void 0&&Z.kind!=="lay")throw Error("--mark-weight 仅用于 matrix lay(融合排序只在消费 plan 铺轨这一步生效,不做静默忽略)");if(Z.kind==="material"){if(Q.local||Y.length)throw Error("matrix material 不接受 --local/--dirs:本零件是素材矩阵检索(本地索引无音频语义面);本地素材检索走 gtrk matrix --local --dirs");if(Q.plan||Q.materials)throw Error("--plan/--materials 仅用于 matrix describe / matrix lay(不做静默忽略)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");if(Q.column)throw Error("matrix material 不接受 --column:栏目检索偏好(column_tag_ids/facets)是剪辑向语义,通用素材口不适用");if(Q.materialClass)throw Error("matrix material 不接受 --material-class:素材形态用 --scope clip|image|audio;概念/实拍分层是剪辑向语义");if(Q.project||Q.dispatch)throw Error("matrix material 不接受 --project/--dispatch:本零件是 ad-hoc 检索,不消费派单也不铺轨");return}if(Z.kind==="fetch"){if(Q.local||Y.length)throw Error("matrix fetch 不接受 --local/--dirs:本地素材本就绝对路径直引、无需拉取(search --local 出路径、直接拖)");if(Q.plan||Q.materials)throw Error("--plan/--materials 仅用于 matrix describe / matrix lay(不做静默忽略)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");if(Q.column||Q.materialClass)throw Error("matrix fetch 不接受 --column/--material-class:拉原片不是检索,无语义过滤面");if(Q.project||Q.dispatch)throw Error("matrix fetch 不接受 --project/--dispatch:产物落普通目录、不进工程(进工程的原片走铺轨「确认原片」链路)");return}if(Z.kind==="describe"){if(!!Q.plan===!!Q.materials)throw Error("matrix describe 需要 --plan <path> 或 --materials <a,b,...> 之一(两者互斥;理解目标永远显式可见)");if(Q.local||Y.length)throw Error("matrix describe 不接受 --local/--dirs(理解目标由 --plan/--materials 显式给出)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");return}if(Z.kind==="lay"){if(!Q.project&&!Q.plan)throw Error("matrix lay 需要 --project <目录>(或 --plan <path> 显式指定 plan 文件)");if(Q.local||Y.length)throw Error("matrix lay 不接受 --local/--dirs(lay 只消费 plan 现值,不检索)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");if(Q.materials)throw Error("--materials 仅用于 matrix describe(不做静默忽略)");return}if(Q.plan)throw Error("--plan 仅用于 matrix describe / matrix lay(不做静默忽略)");if(Q.materials)throw Error("--materials 仅用于 matrix describe(不做静默忽略)");if(Z.kind==="index"){if(!Y.length)throw Error("matrix index 需要 --dirs <a,b,...> 指定素材文件夹(索引范围永远显式可见)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");return}if(Q.local){if(!Y.length)throw Error("--local 需要 --dirs <a,b,...> 圈定检索域(检索域永远用户可见,不静默复用)");if(Q.column)throw Error("--local 与 --column 互斥:栏目检索偏好(column_tag_ids/facets)是云端语义,本地索引不适用");if(Q.materialClass)throw Error("--local 与 --material-class 互斥:素材类型过滤是素材矩阵语义,本地索引不适用");return}if(Y.length)throw Error("--dirs 仅用于 --local 检索或 matrix index(云端检索不接受该参数,不做静默忽略)");if(Q.sceneThreshold!==void 0)throw Error("--scene-threshold 仅用于 matrix index(不做静默忽略)");if(Q.stabilityThreshold!==void 0)throw Error("--stability-threshold 仅用于 matrix index(不做静默忽略)");if(Q.rebuild)throw Error("--rebuild 仅用于 matrix index(不做静默忽略)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(云端检索无源时间窗语义,不做静默忽略)");if(Q.imageBroll===!1)throw Error("--no-image-broll 仅用于 --local 检索/铺轨(云端检索结果恒为视频切片,不做静默忽略)")}function mO(Z){if(Z===void 0)return;let Q=Z.split(",").map((Y)=>Number(Y.trim()));if(Q.length!==2||!Q.every((Y)=>Number.isFinite(Y)&&Y>=0)||Q[0]>=Q[1])throw Error(`--source-window 取值非法(${Z})——格式 <start,end>(秒),且 0 ≤ start < end`);return[Q[0],Q[1]]}async function cO(Z,Q,Y={}){if(Q.json)NZ();uO(Z,Q);let J=FZ();if(Z.kind==="index")return h9("index",Q,()=>iO(J,Q));if(Z.kind==="describe")return h9("describe",Q,()=>eO(J,Q,Y));if(Z.kind==="lay")return h9("lay",Q,()=>ZP(Q,Y));if(Z.kind==="material")return h9("material",Q,()=>HP(Z.query,J,Q));if(Z.kind==="fetch")return h9("fetch",Q,async()=>{let q=await fW({clipIds:Z.clipIds,...Q.out?{out:Q.out}:{}},Y.matrixFetch??{loadCfg:()=>J});if(!q.ok)process.exitCode=1;if(Q.json)console.log(JSON.stringify(q));return q});if(Q.local)return h9(Z.kind,Q,async()=>{let q=await QP(J,Q);return Z.kind==="search"?L4(Z.query,q,Q):F4(q,Q,Y)});j.step("▶ 身份探针(matrix_member_type)…");let z=await Z2(J);j.info(`档位:${z}${z==="internal"?"(矩阵成员口 /task/custom/video_clip_search)":"(通用口 /task/video_clip_search)"}`);let X=Q.column??IZ().defaultColumn,V=M6({columnId:X});for(let q of V.warnings)j.warn(q);let W=V.config.broll,K=X??V.config.meta?.id;if(z==="external"){if(Q.materialClass==="concept")throw Error("external 档位服务端固定 real_shot+有版权素材,concept 不可用(--material-class concept 无法满足)");if(Q.materialClass)j.warn("external 档位服务端固定 real_shot+有版权素材,--material-class 参数不适用(已忽略)");if(W&&(W.column_tag_ids?.length||W.material_class_policy||W.facet_defaults))j.warn("当前身份为 external,栏目检索偏好(column_tag_ids/material_class/facets)不适用")}let $={topK:Q.topK?Number(Q.topK):void 0,materialClass:Q.materialClass},H=z==="internal"?W:void 0,N=z==="internal"?Q.materialClass??W?.material_class_policy:void 0,U={cfg:J,memberType:z,columnId:K,sourceLayer:z==="internal"&&N==="concept"?"concept":"common",search:(q,M)=>aW(J,z,pW(z,q,M,H,$))};return Z.kind==="search"?L4(Z.query,U,Q):F4(U,Q,Y)}async function h9(Z,Q,Y){try{return await Y()}catch(J){let z=J?.code;if(Q.json&&(typeof z==="string"||typeof z==="number"))console.log(JSON.stringify({ok:!1,mode:Z,code:z,msg:J.message}));throw J}}function _4(Z){return{url:$X(Z.base),apiKey:Z.apiKey}}async function lO(Z){try{return await Q2(Z)==="internal"}catch(Q){return j.warn(`身份探测失败(${Q instanceof Error?Q.message:String(Q)})——按非豁免(计量会话计费)继续;同合云内部成员(gc_member_type=internal)本可免会话零计费`),!1}}function dO(Z){return{open:async(Q)=>{let Y=Math.ceil(Q*o6);j.step(`▶ 计量会话预扣:计划 ${Q} 帧 → 预扣 ${Y} 积分(${o6} 积分/张、文本免费;结算按实际用量多退少不补)…`);try{return await UX(Z,Q)}catch(J){let z=O0(J);if(z===WX||z===VX)throw new PZ(z,`积分不足,计量会话未开:本次索引计划 ${Q} 帧,需预扣 ${Y} 积分(${o6} 积分/张)——`+`${J instanceof Error?J.message:String(J)}。充值后重跑本命令即可(指纹增量:已索引素材零重算)`);throw J}},close:(Q)=>NX(Z,Q)}}function nO(Z){if(Z===void 0||Z===null||Z==="")return;let Q=String(Z).toLowerCase();if(Q==="auto"||Q==="gpu"||Q==="cpu"||Q==="full")return Q;throw Error(`--decode-path 只认 auto|gpu|cpu|full,收到「${String(Z)}」`)}function pO(Z,Q){if(Z)return{exempt:!0,planned_units:Q.plannedFrames};let Y=Q.billing;if(!Y)return{exempt:!1,planned_units:Q.plannedFrames};return{exempt:!1,planned_units:Y.plannedUnits,pre_deducted_credits:Y.preDeductedCredits,...Y.usedUnits!==void 0?{used_units:Y.usedUnits}:{},...Y.settledCredits!==void 0?{settled_credits:Y.settledCredits}:{},...Y.refundedCredits!==void 0?{refunded_credits:Y.refundedCredits}:{},...Y.reconcilePending?{reconcile_pending:!0}:{}}}async function iO(Z,Q){let Y=C1(Q.dirs),J=oO(Q.sceneThreshold),z=rO(Q.stabilityThreshold),X=_4(Z);j.step(`▶ 本地素材索引:${Y.join("、")}(场景阈值 ${J} · 稳定阈值 ${z}${Q.rebuild?" · 强制全量重建":""})…`),j.info("免切片:只记场景时间戳,不产生任何切片文件;抽帧图 embed 后即删(素材本体不上云)。");let V=await lO(Z);if(V)j.info("同合云内部成员(gc_member_type=internal):图像 embed 计费豁免(免会话零积分;文本 embed 本就免费)。");let W=nO(Q.decodePath),K=Q.proxyWidth===void 0?void 0:Number(Q.proxyWidth);if(K!==void 0&&(!Number.isFinite(K)||K<64))throw Error("--proxy-width 需为 ≥64 的数字");let G=await kX({dirs:Y,sceneThreshold:J,stabilityThreshold:z,rebuild:Q.rebuild===!0,decodePath:W,proxyWidth:K,proxyScaler:Q.proxyScaler,embed:(R,O)=>j7(X,R,{sessionToken:O}),session:V?void 0:dO(X),onProgress:(R)=>j.info(R)}),$=G.materials,H=pO(V,G),N=V?" · 计费豁免(同合云内部成员)":H.settled_credits!==void 0?` · 实结 ${H.settled_credits} 积分(预扣 ${H.pre_deducted_credits} · 退还 ${H.refunded_credits})`:H.reconcile_pending?` · 计费待服务端对账(预扣 ${H.pre_deducted_credits} 积分)`:H.planned_units===0?" · 零新帧零计费":"",U=G.kinds.image.total>0?`(视频 ${G.kinds.video.indexed}/${G.kinds.video.total} · 图片 ${G.kinds.image.indexed}/${G.kinds.image.total})`:"",q=G.stability,M=q.stableScenes+q.unstableScenes>0?` · stable 场景 ${q.stableScenes} / unstable ${q.unstableScenes}${q.framesSaved?`(收敛省 ${q.framesSaved} 帧)`:""}`:"";j.ok(`索引完成:${$.indexed}/${$.total} 个素材${U}(跳过 ${$.skipped} · 重建 ${$.rebuilt}${$.failed?` · 失败 ${$.failed}`:""})· `+`场景 ${G.scenes} · 帧 ${G.frames}${M} · 耗时 ${(G.elapsedMs/1000).toFixed(1)}s${N}`),j.info(`索引落点:${G.dbPath}(绝对路径为键,跨机不可移植;属本机缓存,可随时重建)`);let F={ok:!0,mode:"index",dirs:G.dirs,dbPath:G.dbPath,materials:G.materials,kinds:G.kinds,scenes:G.scenes,frames:G.frames,stability:{stable_scenes:q.stableScenes,unstable_scenes:q.unstableScenes,frames_saved:q.framesSaved},billing:H,elapsedSec:Math.round(G.elapsedMs/100)/10};if(Q.json)console.log(JSON.stringify(F));return F}function oO(Z){if(Z===void 0)return e8;let Q=Number(Z);if(Number.isFinite(Q)&&Q>0&&Q<1)return Q;return j.warn(`--scene-threshold 取值非法(${Z}),按默认 ${e8} 处理`),e8}function rO(Z){if(Z===void 0)return E0;let Q=Number(Z);if(Number.isFinite(Q)&&Q>0&&Q<1)return Q;return j.warn(`--stability-threshold 取值非法(${Z}),按默认 ${E0} 处理`),E0}function aO(Z,Q){let Y=[],J=[],z=0;for(let X of Z.beats??[])for(let V of X.queries??[]){let W=Q&&Q>0?(V.results??[]).slice(0,Q):V.results??[];for(let K of W){let G=K.segments?.[0],$=G?G.best:typeof K.duration==="number"?K.duration/2:0,H=L0(K.clip_id);if(K.kind==="image"&&typeof K.local_path==="string"){Y.push({materialId:H,tsMs:0,source:{kind:"direct",path:K.local_path}}),J.push(K);continue}let N=typeof K.local_path==="string"&&K.local_path?K.local_path:typeof K.url==="string"&&K.url?K.url:void 0;if(!N){z++,j.warn(`clip ${K.clip_id} 无可取帧来源(缺 local_path/url),跳过理解`);continue}Y.push({materialId:H,tsMs:Math.round($*1000),source:{kind:"frame",src:N,tsSec:$}}),J.push(K)}}return{items:Y,targets:J,skipped:z}}async function sO(Z,Q){let Y=[],J=0;for(let z of Z){if(!pZ(z)){J++,j.warn(`素材不存在:${z}(跳过)`);continue}let X=qQ(z);if(X==="image"){Y.push({materialId:await a6(z),tsMs:0,source:{kind:"direct",path:z}});continue}if(X==="video"){try{let{materialId:V,frameTsSec:W}=await Q(z);for(let K of W)Y.push({materialId:V,tsMs:Math.round(K*1000),source:{kind:"frame",src:z,tsSec:K}})}catch(V){J++,j.warn(`[${L1(z)}] 探测/场景检测失败:${V instanceof Error?V.message:String(V)}(跳过)`)}continue}J++,j.warn(`不支持的素材类型:${z}(视频/图片白名单外,跳过)`)}return{items:Y,skipped:J}}async function tO(Z){let Q=SZ(),Y=hZ(Z);if(!(Y.duration>0))throw Error("探测不到有效时长(疑似损坏/非视频文件)");let J=await xX(Q.ffmpeg,Z,Y.duration,e8);return{materialId:await a6(Z),frameTsSec:J.map((z)=>z.st+(z.ed-z.st)/2)}}async function eO(Z,Q,Y){let J={url:NQ(Z.base),apiKey:Z.apiKey},z=Y.describeBatch??((O)=>E9(J,O)),X=Y.extractFrame??(async(O,P,D)=>t8(SZ().ffmpeg,O,P,D)),V=Y.probeExempt??(async()=>{try{return await Q2(Z)==="internal"}catch(O){return j.warn(`身份探测失败(${O instanceof Error?O.message:String(O)})——按非豁免(1 积分/张同步计费)继续`),!1}}),W=Q.topK?Number(Q.topK):void 0,K,G,$,H,N=0;if(Q.plan){if(H=Y0(Q.plan),!pZ(H))throw Error(`找不到 plan 文件:${H}`);$=JSON.parse(await W2(H,"utf8"));let O=aO($,W);K=O.items,G=O.targets,N=O.skipped,j.step(`▶ 理解 plan 候选:${K.length} 项(${H}${W?` · 每 query 前 ${W} 条`:""})…`)}else{let O=C1(Q.materials),P=await sO(O,Y.videoSceneFrames??tO);K=P.items,N=P.skipped,j.step(`▶ 理解素材文件:${O.length} 个文件 → ${K.length} 帧(视频按场景中点、图片直传)…`)}let U=await S8(),q;try{q=await dX(K,{db:U,describeBatch:z,extractFrame:X,confirm:Y.confirm??_1,probeExempt:V,yes:Q.yes===!0,frameDir:nZ(B0(),`describe-${process.pid}`),onLog:(O)=>j.info(O)})}finally{U.close()}if(q.declined){j.err("已取消:素材理解计费确认被拒绝——零服务端调用、零计费(缓存命中部分照常可用)。可用 --yes 跳过确认,或 --top-k 缩小理解范围后重跑。");let O={ok:!1,mode:"describe",...H?{planPath:H}:{},described:q.described,cached:q.cached,called:0,failed:q.failed,credits_estimated:q.estimatedCredits,...q.exempt!==void 0?{exempt:q.exempt}:{},reason:"describe_billing_declined"};if(process.exitCode=1,Q.json)console.log(JSON.stringify(O));return O}let M=0;if($&&H&&G)G.forEach((O,P)=>{let D=q.results[P];if(D)O.describe=lX(D),M++}),await r0(H,JSON.stringify($,null,2)),j.ok(`理解完成并回写 plan:注入 ${M} 条 result.describe(缓存命中 ${q.cached} · 实际调用 ${q.called} 张${q.failed?` · 取帧失败 ${q.failed}`:""}${N?` · 无源跳过 ${N}`:""})→ ${H}`),j.info("usable_flags 只是给你的信号:剔除与否由你编辑 plan 裁定(删 result 条目后 gtrk matrix lay),CLI 不会替你剔。");else if(j.ok(`理解完成:${q.described} 项(缓存命中 ${q.cached} · 实际调用 ${q.called} 张${q.failed?` · 取帧失败 ${q.failed}`:""}${N?` · 跳过 ${N}`:""})`),!Q.json)K.forEach((O,P)=>{let D=q.results[P];if(!D)return;let T=Object.entries(D.usable_flags).filter(([,_])=>_).map(([_])=>_);j.info(`${O.materialId} @${(O.tsMs/1000).toFixed(1)}s · mark ${D.mark}${T.length?` · ⚠ ${T.join("/")}`:""} · ${D.desc.slice(0,80)}${D.tags.length?` · tags: ${D.tags.join("/")}`:""}`)});let F=q.exempt?"计费豁免(同合云内部成员)":q.called>0?`实际调用 ${q.called} 张 ≈ ${q.called*1} 积分(1 积分/张同步计费)`:"零调用零计费(全部缓存命中)";j.info(`计费:${F};理解产物已入本地缓存(同素材同帧下次零调用)。`);let R={ok:!0,mode:"describe",...H?{planPath:H,injected:M}:{},described:q.described,cached:q.cached,called:q.called,failed:q.failed,credits_estimated:q.estimatedCredits,...q.exempt!==void 0?{exempt:q.exempt}:{},...$?{}:{items:K.map((O,P)=>({material_id:O.materialId,ts_ms:O.tsMs,source:O.source.kind==="direct"?O.source.path:O.source.src,describe:q.results[P]??null}))}};if(Q.json)console.log(JSON.stringify(R));return R}async function ZP(Z,Q){let Y=FZ(),J,z;if(Z.plan)J=Y0(Z.plan),z=Z.project?Y0(Z.project):b9(b9(J));else z=Y0(Z.project),J=nZ(z,"split","broll-plan.json");if(!pZ(J))throw Error(`找不到 plan 文件:${J}(先 gtrk matrix --project <目录> --lay 0 产 plan,或用 --plan 显式指定)`);let X=JSON.parse(await W2(J,"utf8")),V=uW(X);for(let S of X.beats??[])for(let w of S.queries??[])for(let x of w.results??[])if(CQ(x)&&typeof x.local_path==="string"&&x.local_path&&!pZ(x.local_path))V.push(`beat ${S.beat}/clip ${x.clip_id}:local_path 不可编辑且路径无效(${x.local_path} 不存在)——本地素材路径由检索产出,请还原该字段或删除该候选条目`);if(V.length)throw Error(`plan 校验未通过(${V.length} 处)。可编辑面 = results 删条/重排、segments 删段、describe 增删、pinned:true;`+`clip_id/local_path/url/几何字段不可编辑:
|
|
228
|
-
- ${
|
|
229
|
-
- `)}`);let
|
|
225
|
+
ORDER BY m.id, f.ts_ms`),X=[],W=new Map,V=new Map,K=[],G=[],$=0;for(let N of z){let q=V.get(N.mkey);if(q===void 0)q=yP(N.path,Q)&&J(N.path),V.set(N.mkey,q);if(!q)continue;let U=W.get(N.mkey);if(U===void 0)U=X.length,W.set(N.mkey,U),X.push({materialId:N.material_id,path:N.path,kind:N.kind==="image"?"image":"video",durationMs:N.duration_ms,width:N.width,height:N.height,fps:N.fps});let F=bX(N.vec);if($===0)$=F.length;else if(F.length!==$)throw Error(`索引向量维度不一致(${F.length} vs ${$})——索引损坏,请 gtrk matrix index --rebuild`);K.push({matIdx:U,ts_ms:N.ts_ms,scene_st_ms:N.st_ms,scene_ed_ms:N.ed_ms,stable:N.scene_stable===1}),G.push(F)}if(W.size>0){let N=!1;for(let q of Z.all("SELECT id, cuts_indexed FROM materials WHERE cuts_indexed = 1")){let U=W.get(q.id);if(U===void 0)continue;X[U].cutsMs=[],N=!0}if(N)for(let q of Z.all("SELECT material_id, t_ms FROM cuts ORDER BY material_id, t_ms")){let U=W.get(q.material_id);if(U!==void 0)X[U].cutsMs?.push(q.t_ms)}for(let q of Z.all(`SELECT material_id, st_ms, ed_ms, motion_p50, motion_p90, motion_samples, effective_fps
|
|
226
|
+
FROM scenes WHERE motion_p50 IS NOT NULL ORDER BY material_id, st_ms`)){let U=W.get(q.material_id);if(U===void 0)continue;let F=X[U];(F.motionScenes??=[]).push({st_ms:q.st_ms,ed_ms:q.ed_ms,p50:q.motion_p50,p90:q.motion_p90,samples:q.motion_samples,effectiveFps:q.effective_fps})}}let H=new Float32Array(G.length*$);return G.forEach((N,q)=>H.set(N,q*$)),{dim:$,vectors:H,frames:K,materials:X}}function j4(Z){return Z.startsWith(s8)?Z.slice(s8.length):Z}var b9=(Z)=>Math.round(Z*1000)/1000,F4=(Z)=>Math.round(Z*1e4)/1e4;function xP(Z,Q,Y){let J=0,z=0,X=0,W=0,V=0,K=null;for(let G of Z){let $=Math.min(Y,G.ed_ms)-Math.max(Q,G.st_ms);if($<=0)continue;if(J+=$,z+=G.p50*$,X+=G.p90*$,W+=G.samples,$>V)V=$,K=G.effectiveFps}if(J<=0)return;return{p50:F4(z/J),p90:F4(X/J),samples:W,...K!==null?{effective_fps:K}:{}}}var M4=(Z)=>Z.kind==="image"?1:0;function D4(Z,Q,Y={}){let J=Y.topkFrames??SP,z=Y.scoreFloor??vP,X=Y.sourceWindowSec,W=Y.includeImages!==!1&&!X,V=Z.frames.length;if(V===0||Q.length!==Z.dim)return{recalled:0,results:[]};let K=new Float32Array(V),{vectors:G,dim:$}=Z;for(let M=0;M<V;M++){let R=0,D=M*$;for(let O=0;O<$;O++)R+=G[D+O]*Q[O];K[M]=R}let H=[];for(let M=0;M<V;M++){if(!W&&Z.materials[Z.frames[M].matIdx].kind==="image")continue;H.push(M)}let N=H.sort((M,R)=>K[R]-K[M]).slice(0,J),q=new Map;for(let M of N){let R=Z.frames[M],D=Z.materials[R.matIdx],O=q.get(R.matIdx)??[];O.push({ts_ms:R.ts_ms,scene_st_ms:R.scene_st_ms,scene_ed_ms:R.scene_ed_ms,duration_ms:D.durationMs,score:K[M],...R.stable?{stable:!0}:{}}),q.set(R.matIdx,O)}let U=0,F=[];for(let[M,R]of q){let D=Z.materials[M];if(D.kind==="image"){U+=1;let P=K2(R.reduce((E,I)=>Math.max(E,I.score),Number.NEGATIVE_INFINITY));if(P<z)continue;F.push({source:"local",kind:"image",clip_id:j4(D.materialId),score:P,local_path:D.path,...D.width!=null?{width:D.width}:{},...D.height!=null?{height:D.height}:{},...D.width!=null&&D.height!=null?{orientation:D.width>=D.height?"landscape":"portrait"}:{},segments:[{start:0,end:0,best:0,score:P}]});continue}R.sort((P,E)=>P.ts_ms-E.ts_ms);let O=wP(R);if(X){let[P,E]=[X[0]*1000,X[1]*1000];O=O.filter((I)=>I.end_ms>=P&&I.start_ms<=E)}U+=O.length;let C=O.filter((P)=>P.score>=z);if(!C.length)continue;let T=Z.materials[M],_={source:"local",clip_id:j4(T.materialId),score:C[0].score,local_path:T.path,duration:b9(T.durationMs/1000),...T.width!=null?{width:T.width}:{},...T.height!=null?{height:T.height}:{},...T.fps!=null?{fps:b9(T.fps)}:{},...T.width!=null&&T.height!=null?{orientation:T.width>=T.height?"landscape":"portrait"}:{},segments:C.map((P)=>{let E=T.cutsMs?.filter((y)=>y>P.start_ms&&y<P.end_ms)??[],I=T.motionScenes?.length?xP(T.motionScenes,P.start_ms,P.end_ms):void 0;return{start:b9(P.start_ms/1000),end:b9(P.end_ms/1000),best:b9(P.best_ts_ms/1000),score:P.score,...E.length?{cuts:E.map((y)=>b9(y/1000))}:{},...I?{motion:I}:{}}})};F.push(_)}return F.sort((M,R)=>R.score-M.score||M4(M)-M4(R)),{recalled:U,results:F}}import{existsSync as kP,mkdirSync as fP,readFileSync as hP,writeFileSync as bP}from"node:fs";import{basename as gP,dirname as uP,extname as mP,join as cP}from"node:path";import{homedir as lP}from"node:os";var dP=100,vQ=12,nP=/(伴奏|off[-_ ]?vocal|instrumental|inst|karaoke|piano[-_ ]?version|light[-_ ]?ver|acoustic)/gi;function P4(Z){let Q=Z.trim();if(/\.[a-z0-9]{2,4}$/i.test(Q))Q=Q.slice(0,Q.length-mP(Q).length);return Q=Q.replace(/^bgm[-_ ]*/i,""),Q=Q.replace(nP,""),Q=Q.replace(/[((][^))]*[))]/g,""),Q.replace(/[^\p{L}\p{N}]/gu,"").toLowerCase()}function A1(){return cP(lP(),".gitruck","bgm-history.json")}function O4(Z=A1()){try{if(!kP(Z))return[];let Q=JSON.parse(hP(Z,"utf-8"));if(!Array.isArray(Q.entries))return[];return Q.entries.filter((Y)=>!!Y&&typeof Y.key==="string"&&typeof Y.at==="string")}catch{return[]}}function pP(Z,Q=A1()){try{let Y=P4(Z.title);if(!Y)return;let J=O4(Q).filter((X)=>X.key!==Y),z=[{key:Y,title:Z.title,...Z.id?{id:Z.id}:{},at:new Date().toISOString(),...Z.project?{project:Z.project}:{}},...J].slice(0,dP);fP(uP(Q),{recursive:!0}),bP(Q,`${JSON.stringify({entries:z},null,1)}
|
|
227
|
+
`,"utf-8")}catch{}}function L4(Z,Q,Y=A1()){pP({title:gP(Z),project:Q},Y)}function C4(Z=vQ,Q=A1()){return new Set(O4(Q).slice(0,Math.max(0,Z)).map((Y)=>Y.key))}function _4(Z,Q){if(Q.size===0||Z.length===0)return{kept:Z,skipped:0,exhausted:!1};let Y=Z.filter((J)=>!Q.has(P4(String(J.title??J.id??""))));if(Y.length===0)return{kept:Z,skipped:0,exhausted:!0};return{kept:Y,skipped:Z.length-Y.length,exhausted:!1}}function w4(Z){Z.command("matrix [words...]").description('B-roll 检索:无 positional=消费 split/dispatch.json 的 film_broll 队列产候选清单;`matrix search "<query>"`=单条 ad-hoc 剪辑向检索;`matrix material "<query>"`=通用三态素材检索(下载向,clip/image/audio,BGM 主场);`matrix fetch <clip_id...>`=精剪期拉原片(对已授予素材免费重签+下载落盘);`matrix index --dirs <a,b>`=本地素材索引;`matrix describe`=按需理解零件(plan 注入/素材文件);`matrix lay`=消费(agent 编辑后的)plan 文件铺轨').option("--project <dir>","oralcut 产物目录(定位 split/dispatch.json 与产物落点)").option("--dispatch <path>","显式指定 dispatch.json(非标准布局兜底)").option("--column <id>","栏目配置 id(缺省取 config defaultColumn,再缺省内置默认栏目;仅云端模式)").option("--top-k <n>",`每 query 候选数上限(覆盖派单 shots 翻译;云端服务端上限 50;matrix material 缺省 ${_1})`).option("--material-class <c>","素材类型 real_shot|concept(仅矩阵成员口;覆盖栏目 material_class_policy)").option("--local","本地检索模式:走本地素材索引检索(须配 --dirs;跳过身份探针,不触任何云端检索端点)").option("--dirs <a,b,...>","本地素材文件夹(逗号分隔)——matrix index 的索引范围 / --local 的检索域").option("--scene-threshold <f>","matrix index:场景切换检测阈值(ffmpeg select gt(scene,X),默认 0.3)").option("--stability-threshold <f>","matrix index:场景稳定性判定阈值——场景内最大帧间 scene score 低于此值判 stable(固定机位),抽帧收敛为中点 1 帧(默认 0.05,保守值待标定;误判 stable 丢检索粒度、误判 unstable 只是不省钱,宁严勿松)").option("--rebuild","matrix index:忽略 size:mtime 指纹,强制全量重建索引").option("--decode-path <mode>","matrix index:场景检测的解码路径 auto|gpu|cpu|full——auto 自动探测硬解并逐素材降级(推荐),gpu/cpu/full 钉死某档且失败不降级(对照与排障用;默认 full = 旧行为)").option("--proxy-width <n>","matrix index:代理解码宽度(默认 384;再往下保真度明显劣化,勿随手调小)").option("--proxy-scaler <name>","matrix index:代理缩放算法(默认 neighbor——点采样不滤波,实测比默认 bicubic 又快又准;改这个基本只有做对照实验才需要)").option("--plan <path>","matrix describe:理解该 plan 的 top 候选并把产物写回 result.describe;matrix lay:显式指定要消费的 plan 文件(缺省 <project>/split/broll-plan.json)").option("--materials <a,b,...>","matrix describe:直接理解素材文件(逗号分隔;视频按场景抽帧、图片直传)").option("--source-window <start,end>","--local 检索:只返回与源时间窗(秒)有交集的命中段(段边界不裁剪;图片候选不参与;窗口无命中返回空结果非错误)").option("--no-image-broll","--local 模式:完全排除图片候选(不出检索结果、不进铺轨候选池、零图片上云)——图片候选默认参与,被选中时经云端 image_move 转运镜视频入轨(图片本体会上云做运镜)").option("--yes","跳过交互确认(当前用于:图片运镜生成前的积分预估确认)").option("--dedup-scope <scope>","铺轨去重粒度:scene=场景级(默认;同素材不同场景可分配,相邻槽位按跳剪豁免避让)| material=严格档(同一素材文件整轮只用一次)").option("--highlight-weight <w>","仅 matrix lay:看点权重 0..1(默认 0 关闭零回归)——与 --mark-weight 正交(mark=画面好不好看,highlight=有没有看点:信息量/戏剧性/情绪强度/稀缺性);两权之和钳到 1,看点分取 describe 理解缓存,无缓存候选中性(权重回吐给 sim)").option("--mark-weight <w>","仅 matrix lay:美观度权重 0..1(默认 0 关闭零回归)——候选融合分 = sim×(1-w)+(mark/100)×w,mark 取 describe 理解缓存(素材内就近帧);无缓存候选按中性处理(融合分=sim,不惩罚不加分)").option("--cut-align <ratio>","句界吸附目标比例 0..1(默认 0.7):约七成字幕句起点恰逢镜头切点、三成有意错开(全对齐会机械);0=关闭回旧节奏切槽。"+"句级时码取 transcript 现场重投影(与关键词锚同源),重投影降级时自动回旧行为并告警").option("--gap-fill <mode>","音频驱动工程主轨空洞填充 fast|solid|none(缺省 solid):fast=放宽 score 地板从候选池随便填、耗尽延长相邻颗粒、再不够垫黑片;"+"solid=黑片垫齐(精修时一眼看出「这里没匹配到」);none=留 gap(客户端主轨磁吸开启时 gap 会被吸除、后续画面整体前移与配音错位,慎用)。"+"口播工程主轨为 A-roll,本参数不适用(照旧留空语义)").option("--arrange <mode>","B-roll 编排取数路 local|shadow|cloud,**按素材来源自动定档,一般不用传**:"+"铺你自己电脑里的素材=cloud(编排在云端做,算法只在服务端迭代,按「编排量」计费,"+"跑前报预估并征求确认、--yes 跳过);铺素材矩阵的素材=local(编排仍在本机、不计费,逐字不动)。"+"shadow=本机照跑照铺轨、云端只对拍不采纳;cloud=采纳云端产物,自校验不一致时回落本机并大声告知。"+"⚠️ 本地素材路上 --arrange local **已不受理**(编排只在服务端迭代,留旧路等于让你在不知情时拿到另一套算法的结果),"+"且云端拿不到产物时**直接报错**、不会悄悄换算法把活干完。"+"它也不是省钱开关——用素材矩阵的素材同样要付检索费,两条路都要花钱、只是花在不同环节").option("--arrange-cost-cap <n>","云端编排单次编排量上限:超限服务端**前置拒绝**、零执行零计费(不是跑到一半掐断)。只在 --arrange shadow|cloud 时有意义").option("--arrange-qc","编排期质检(缺省关):**落轨之前**就查每个 beat 的卡点句「画面有没有给到稿子说的东西」,"+`没给到就换候选重排,最多 ${y0} 轮,到限即交付并如实登记还差哪几句。全程零渲染——`+"替代「铺完→渲→看→重铺→再渲」那两轮。⚠️ 判定走素材理解口,**按帧计费**(每个卡点句 1 帧/轮),"+"跑前会报预估并征求确认(--yes 跳过)").option("--arrange-estimate-only","只要预估不要执行:走到云端编排的计价确认那一步就停,报出编排量后成功返回——**零云端调用、工程文件零改动**。"+"⚠️ 它省的是**云端那一次调用与其计费**(以及其后的候选下载与落轨),不是整条链:"+"编排量的分母(beat 数/候选段数/轨数/标定遍数)本来就要读工程、读 plan、做重投影才算得出,该走的还得走。"+"与 --yes 同时给时以本开关为准(--yes 的意思是「别问我」,不是「无论如何都跑」)").option("--lay <n>","候选铺轨数:下载 preview 代理并在工程里平铺 N 条 B-roll 候选轨(默认 1;0=只出 plan 不铺轨)","1").option("--score-floor <f>","填充置信度地板:segment score 低于此值不采纳,槽位留空——黑底垫轨默认开,留空处露的是黑底(要露主轨口播画面得配 --no-black-bed)。"+"调高会收缩取材池、可能整段无槽位铺成纯黑,调完先看铺轨输出的空洞告警(默认 0.2;--local 模式同为该段的候选池准入地板)").option("--no-black-bed","不铺纯黑底垫轨(默认铺一条,垫在候选轨之下、口播主轨之上,用于 B-roll 期间遮住口播画面)").option("--force-relay","候选轨已被你在客户端编辑过(改过 clip / 确认过原片)时仍强制剥离重铺:缺省会拒铺并保留那条轨,本开关是逃生门——"+"会删除已确认原片的 broll-raw-* 素材登记,盘上已下载的原片文件就地成孤儿,且那条轨上的编辑不可恢复").option("--scope <s>",`matrix material:素材形态 clip|image|audio(缺省 ${C1}——本零件第一场景是 BGM;要剪辑向 segments 请用 matrix search)`).option("--commercial-only","matrix material:只搜可商用素材(矩阵成员口传 copyright_scope=commercial;缺省搜全库含非商用)——公开口本就只含可商用素材,该档位会显式提示").option("--min-duration <sec>","matrix material:最短时长(秒)——BGM 按成片时长挑").option("--max-duration <sec>","matrix material:最长时长(秒)").option("--diversity","matrix material:去同质化,避免返回雷同素材").option("--exclude-recent <n>",`matrix material --scope audio:避让最近 n 首用过的 BGM(缺省 ${vQ};历史由 audio lay 落轨自动记账)`).option("--no-exclude-recent","matrix material --scope audio:关闭选曲避让(允许复用近期曲目)").option("--out <file>","ad-hoc 模式:结果落文件(缺省输出 stdout);matrix fetch:原片落盘目录(缺省 ./matrix-fetch/;绝不写剪映草稿目录)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{await eP(aP(Q),Y)})}function aP(Z){if(!Z||Z.length===0)return{kind:"plan"};if(Z[0]==="material"){let Y=Z.slice(1).join(" ").trim();if(!Y)throw Error('检索词不能为空:gtrk matrix material "<query>"');return{kind:"material",query:Y}}if(Z[0]==="fetch"){let Y=Z.slice(1);if(!Y.length)throw Error("用法:gtrk matrix fetch <clip_id...> [--out <dir>]——clip_id 来自 matrix search 的候选结果(两段式:先 search 挑定、再 fetch 拉原片)");return{kind:"fetch",clipIds:Y}}if(Z[0]==="index"){if(Z.length>1)throw Error(`matrix index 不接受多余参数「${Z.slice(1).join(" ")}」——用法:gtrk matrix index --dirs <a,b,...>`);return{kind:"index"}}if(Z[0]==="describe"){if(Z.length>1)throw Error(`matrix describe 不接受多余参数「${Z.slice(1).join(" ")}」——用法:gtrk matrix describe --plan <path> | --materials <a,b,...>`);return{kind:"describe"}}if(Z[0]==="lay"){if(Z.length>1)throw Error(`matrix lay 不接受多余参数「${Z.slice(1).join(" ")}」——用法:gtrk matrix lay --project <dir> [--plan <path>]`);return{kind:"lay"}}if(Z[0]!=="search")throw Error(`未知子命令「${Z[0]}」——ad-hoc 剪辑向检索:gtrk matrix search "<query>";通用三态素材检索:gtrk matrix material "<query>";精剪期拉原片:gtrk matrix fetch <clip_id...>;派单消费:gtrk matrix --project <dir>;本地索引:gtrk matrix index --dirs <a,b,...>;理解零件:gtrk matrix describe;消费编辑后 plan:gtrk matrix lay`);let Q=Z.slice(1).join(" ").trim();if(!Q)throw Error('检索词不能为空:gtrk matrix search "<query>"');return{kind:"search",query:Q}}function I1(Z){return(Z??"").split(",").map((Q)=>Q.trim()).filter(Boolean).map((Q)=>X0(Q))}function sP(Z,Q){let Y=I1(Q.dirs);if(Z.kind!=="material"){let J=[[Q.scope,"--scope"],[Q.commercialOnly,"--commercial-only"],[Q.minDuration,"--min-duration"],[Q.maxDuration,"--max-duration"],[Q.diversity,"--diversity"]];for(let[z,X]of J)if(z!==void 0&&z!==!1)throw Error(`${X} 仅用于 gtrk matrix material(通用三态素材检索),不做静默忽略`)}if(Q.highlightWeight!==void 0&&Z.kind!=="lay")throw Error("--highlight-weight 仅用于 matrix lay(融合排序只在消费 plan 铺轨这一步生效,不做静默忽略)");if(Q.markWeight!==void 0&&Z.kind!=="lay")throw Error("--mark-weight 仅用于 matrix lay(融合排序只在消费 plan 铺轨这一步生效,不做静默忽略)");if(Z.kind==="material"){if(Q.local||Y.length)throw Error("matrix material 不接受 --local/--dirs:本零件是素材矩阵检索(本地索引无音频语义面);本地素材检索走 gtrk matrix --local --dirs");if(Q.plan||Q.materials)throw Error("--plan/--materials 仅用于 matrix describe / matrix lay(不做静默忽略)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");if(Q.column)throw Error("matrix material 不接受 --column:栏目检索偏好(column_tag_ids/facets)是剪辑向语义,通用素材口不适用");if(Q.materialClass)throw Error("matrix material 不接受 --material-class:素材形态用 --scope clip|image|audio;概念/实拍分层是剪辑向语义");if(Q.project||Q.dispatch)throw Error("matrix material 不接受 --project/--dispatch:本零件是 ad-hoc 检索,不消费派单也不铺轨");return}if(Z.kind==="fetch"){if(Q.local||Y.length)throw Error("matrix fetch 不接受 --local/--dirs:本地素材本就绝对路径直引、无需拉取(search --local 出路径、直接拖)");if(Q.plan||Q.materials)throw Error("--plan/--materials 仅用于 matrix describe / matrix lay(不做静默忽略)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");if(Q.column||Q.materialClass)throw Error("matrix fetch 不接受 --column/--material-class:拉原片不是检索,无语义过滤面");if(Q.project||Q.dispatch)throw Error("matrix fetch 不接受 --project/--dispatch:产物落普通目录、不进工程(进工程的原片走铺轨「确认原片」链路)");return}if(Z.kind==="describe"){if(!!Q.plan===!!Q.materials)throw Error("matrix describe 需要 --plan <path> 或 --materials <a,b,...> 之一(两者互斥;理解目标永远显式可见)");if(Q.local||Y.length)throw Error("matrix describe 不接受 --local/--dirs(理解目标由 --plan/--materials 显式给出)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");return}if(Z.kind==="lay"){if(!Q.project&&!Q.plan)throw Error("matrix lay 需要 --project <目录>(或 --plan <path> 显式指定 plan 文件)");if(Q.local||Y.length)throw Error("matrix lay 不接受 --local/--dirs(lay 只消费 plan 现值,不检索)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");if(Q.materials)throw Error("--materials 仅用于 matrix describe(不做静默忽略)");return}if(Q.plan)throw Error("--plan 仅用于 matrix describe / matrix lay(不做静默忽略)");if(Q.materials)throw Error("--materials 仅用于 matrix describe(不做静默忽略)");if(Z.kind==="index"){if(!Y.length)throw Error("matrix index 需要 --dirs <a,b,...> 指定素材文件夹(索引范围永远显式可见)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(不做静默忽略)");return}if(Q.local){if(!Y.length)throw Error("--local 需要 --dirs <a,b,...> 圈定检索域(检索域永远用户可见,不静默复用)");if(Q.column)throw Error("--local 与 --column 互斥:栏目检索偏好(column_tag_ids/facets)是云端语义,本地索引不适用");if(Q.materialClass)throw Error("--local 与 --material-class 互斥:素材类型过滤是素材矩阵语义,本地索引不适用");return}if(Y.length)throw Error("--dirs 仅用于 --local 检索或 matrix index(云端检索不接受该参数,不做静默忽略)");if(Q.sceneThreshold!==void 0)throw Error("--scene-threshold 仅用于 matrix index(不做静默忽略)");if(Q.stabilityThreshold!==void 0)throw Error("--stability-threshold 仅用于 matrix index(不做静默忽略)");if(Q.rebuild)throw Error("--rebuild 仅用于 matrix index(不做静默忽略)");if(Q.sourceWindow!==void 0)throw Error("--source-window 仅用于 --local 检索(云端检索无源时间窗语义,不做静默忽略)");if(Q.imageBroll===!1)throw Error("--no-image-broll 仅用于 --local 检索/铺轨(云端检索结果恒为视频切片,不做静默忽略)")}function tP(Z){if(Z===void 0)return;let Q=Z.split(",").map((Y)=>Number(Y.trim()));if(Q.length!==2||!Q.every((Y)=>Number.isFinite(Y)&&Y>=0)||Q[0]>=Q[1])throw Error(`--source-window 取值非法(${Z})——格式 <start,end>(秒),且 0 ≤ start < end`);return[Q[0],Q[1]]}async function eP(Z,Q,Y={}){if(Q.json)qZ();sP(Z,Q);let J=jZ();if(Z.kind==="index")return g9("index",Q,()=>zO(J,Q));if(Z.kind==="describe")return g9("describe",Q,()=>$O(J,Q,Y));if(Z.kind==="lay")return g9("lay",Q,()=>HO(Q,Y));if(Z.kind==="material")return g9("material",Q,()=>OO(Z.query,J,Q));if(Z.kind==="fetch")return g9("fetch",Q,async()=>{let U=await lW({clipIds:Z.clipIds,...Q.out?{out:Q.out}:{}},Y.matrixFetch??{loadCfg:()=>J});if(!U.ok)process.exitCode=1;if(Q.json)console.log(JSON.stringify(U));return U});if(Q.local)return g9(Z.kind,Q,async()=>{let U=await qO(J,Q);return Z.kind==="search"?v4(Z.query,U,Q):T4(U,Q,Y)});j.step("▶ 身份探针(matrix_member_type)…");let z=await J2(J);j.info(`档位:${z}${z==="internal"?"(矩阵成员口 /task/custom/video_clip_search)":"(通用口 /task/video_clip_search)"}`);let X=Q.column??TZ().defaultColumn,W=_6({columnId:X});for(let U of W.warnings)j.warn(U);let V=W.config.broll,K=X??W.config.meta?.id;if(z==="external"){if(Q.materialClass==="concept")throw Error("external 档位服务端固定 real_shot+有版权素材,concept 不可用(--material-class concept 无法满足)");if(Q.materialClass)j.warn("external 档位服务端固定 real_shot+有版权素材,--material-class 参数不适用(已忽略)");if(V&&(V.column_tag_ids?.length||V.material_class_policy||V.facet_defaults))j.warn("当前身份为 external,栏目检索偏好(column_tag_ids/material_class/facets)不适用")}let $={topK:Q.topK?Number(Q.topK):void 0,materialClass:Q.materialClass},H=z==="internal"?V:void 0,N=z==="internal"?Q.materialClass??V?.material_class_policy:void 0,q={cfg:J,memberType:z,columnId:K,sourceLayer:z==="internal"&&N==="concept"?"concept":"common",search:(U,F)=>X4(J,z,Q4(z,U,F,H,$))};return Z.kind==="search"?v4(Z.query,q,Q):T4(q,Q,Y)}async function g9(Z,Q,Y){try{return await Y()}catch(J){let z=J?.code;if(Q.json&&(typeof z==="string"||typeof z==="number"))console.log(JSON.stringify({ok:!1,mode:Z,code:z,msg:J.message}));throw J}}function y4(Z){return{url:FX(Z.base),apiKey:Z.apiKey}}async function ZO(Z){try{return await z2(Z)==="internal"}catch(Q){return j.warn(`身份探测失败(${Q instanceof Error?Q.message:String(Q)})——按非豁免(计量会话计费)继续;同合云内部成员(gc_member_type=internal)本可免会话零计费`),!1}}function QO(Z){return{open:async(Q)=>{let Y=Math.ceil(Q*Q1);j.step(`▶ 计量会话预扣:计划 ${Q} 帧 → 预扣 ${Y} 积分(${Q1} 积分/张、文本免费;结算按实际用量多退少不补)…`);try{return await DX(Z,Q)}catch(J){let z=L0(J);if(z===UX||z===NX)throw new OZ(z,`积分不足,计量会话未开:本次索引计划 ${Q} 帧,需预扣 ${Y} 积分(${Q1} 积分/张)——`+`${J instanceof Error?J.message:String(J)}。充值后重跑本命令即可(指纹增量:已索引素材零重算)`);throw J}},close:(Q)=>PX(Z,Q)}}function YO(Z){if(Z===void 0||Z===null||Z==="")return;let Q=String(Z).toLowerCase();if(Q==="auto"||Q==="gpu"||Q==="cpu"||Q==="full")return Q;throw Error(`--decode-path 只认 auto|gpu|cpu|full,收到「${String(Z)}」`)}function JO(Z,Q){if(Z)return{exempt:!0,planned_units:Q.plannedFrames};let Y=Q.billing;if(!Y)return{exempt:!1,planned_units:Q.plannedFrames};return{exempt:!1,planned_units:Y.plannedUnits,pre_deducted_credits:Y.preDeductedCredits,...Y.usedUnits!==void 0?{used_units:Y.usedUnits}:{},...Y.settledCredits!==void 0?{settled_credits:Y.settledCredits}:{},...Y.refundedCredits!==void 0?{refunded_credits:Y.refundedCredits}:{},...Y.reconcilePending?{reconcile_pending:!0}:{}}}async function zO(Z,Q){let Y=I1(Q.dirs),J=XO(Q.sceneThreshold),z=WO(Q.stabilityThreshold),X=y4(Z);j.step(`▶ 本地素材索引:${Y.join("、")}(场景阈值 ${J} · 稳定阈值 ${z}${Q.rebuild?" · 强制全量重建":""})…`),j.info("免切片:只记场景时间戳,不产生任何切片文件;抽帧图 embed 后即删(素材本体不上云)。");let W=await ZO(Z);if(W)j.info("同合云内部成员(gc_member_type=internal):图像 embed 计费豁免(免会话零积分;文本 embed 本就免费)。");let V=YO(Q.decodePath),K=Q.proxyWidth===void 0?void 0:Number(Q.proxyWidth);if(K!==void 0&&(!Number.isFinite(K)||K<64))throw Error("--proxy-width 需为 ≥64 的数字");let G=await cX({dirs:Y,sceneThreshold:J,stabilityThreshold:z,rebuild:Q.rebuild===!0,decodePath:V,proxyWidth:K,proxyScaler:Q.proxyScaler,embed:(R,D)=>R7(X,R,{sessionToken:D}),session:W?void 0:QO(X),onProgress:(R)=>j.info(R)}),$=G.materials,H=JO(W,G),N=W?" · 计费豁免(同合云内部成员)":H.settled_credits!==void 0?` · 实结 ${H.settled_credits} 积分(预扣 ${H.pre_deducted_credits} · 退还 ${H.refunded_credits})`:H.reconcile_pending?` · 计费待服务端对账(预扣 ${H.pre_deducted_credits} 积分)`:H.planned_units===0?" · 零新帧零计费":"",q=G.kinds.image.total>0?`(视频 ${G.kinds.video.indexed}/${G.kinds.video.total} · 图片 ${G.kinds.image.indexed}/${G.kinds.image.total})`:"",U=G.stability,F=U.stableScenes+U.unstableScenes>0?` · stable 场景 ${U.stableScenes} / unstable ${U.unstableScenes}${U.framesSaved?`(收敛省 ${U.framesSaved} 帧)`:""}`:"";j.ok(`索引完成:${$.indexed}/${$.total} 个素材${q}(跳过 ${$.skipped} · 重建 ${$.rebuilt}${$.failed?` · 失败 ${$.failed}`:""})· `+`场景 ${G.scenes} · 帧 ${G.frames}${F} · 耗时 ${(G.elapsedMs/1000).toFixed(1)}s${N}`),j.info(`索引落点:${G.dbPath}(绝对路径为键,跨机不可移植;属本机缓存,可随时重建)`);let M={ok:!0,mode:"index",dirs:G.dirs,dbPath:G.dbPath,materials:G.materials,kinds:G.kinds,scenes:G.scenes,frames:G.frames,stability:{stable_scenes:U.stableScenes,unstable_scenes:U.unstableScenes,frames_saved:U.framesSaved},billing:H,elapsedSec:Math.round(G.elapsedMs/100)/10};if(Q.json)console.log(JSON.stringify(M));return M}function XO(Z){if(Z===void 0)return Q0;let Q=Number(Z);if(Number.isFinite(Q)&&Q>0&&Q<1)return Q;return j.warn(`--scene-threshold 取值非法(${Z}),按默认 ${Q0} 处理`),Q0}function WO(Z){if(Z===void 0)return S0;let Q=Number(Z);if(Number.isFinite(Q)&&Q>0&&Q<1)return Q;return j.warn(`--stability-threshold 取值非法(${Z}),按默认 ${S0} 处理`),S0}function VO(Z,Q){let Y=[],J=[],z=0;for(let X of Z.beats??[])for(let W of X.queries??[]){let V=Q&&Q>0?(W.results??[]).slice(0,Q):W.results??[];for(let K of V){let G=K.segments?.[0],$=G?G.best:typeof K.duration==="number"?K.duration/2:0,H=_0(K.clip_id);if(K.kind==="image"&&typeof K.local_path==="string"){Y.push({materialId:H,tsMs:0,source:{kind:"direct",path:K.local_path}}),J.push(K);continue}let N=typeof K.local_path==="string"&&K.local_path?K.local_path:typeof K.url==="string"&&K.url?K.url:void 0;if(!N){z++,j.warn(`clip ${K.clip_id} 无可取帧来源(缺 local_path/url),跳过理解`);continue}Y.push({materialId:H,tsMs:Math.round($*1000),source:{kind:"frame",src:N,tsSec:$}}),J.push(K)}}return{items:Y,targets:J,skipped:z}}async function KO(Z,Q){let Y=[],J=0;for(let z of Z){if(!nZ(z)){J++,j.warn(`素材不存在:${z}(跳过)`);continue}let X=FQ(z);if(X==="image"){Y.push({materialId:await J1(z),tsMs:0,source:{kind:"direct",path:z}});continue}if(X==="video"){try{let{materialId:W,frameTsSec:V}=await Q(z);for(let K of V)Y.push({materialId:W,tsMs:Math.round(K*1000),source:{kind:"frame",src:z,tsSec:K}})}catch(W){J++,j.warn(`[${E1(z)}] 探测/场景检测失败:${W instanceof Error?W.message:String(W)}(跳过)`)}continue}J++,j.warn(`不支持的素材类型:${z}(视频/图片白名单外,跳过)`)}return{items:Y,skipped:J}}async function GO(Z){let Q=AZ(),Y=hZ(Z);if(!(Y.duration>0))throw Error("探测不到有效时长(疑似损坏/非视频文件)");let J=await mX(Q.ffmpeg,Z,Y.duration,Q0);return{materialId:await J1(Z),frameTsSec:J.map((z)=>z.st+(z.ed-z.st)/2)}}async function $O(Z,Q,Y){let J={url:RQ(Z.base),apiKey:Z.apiKey},z=Y.describeBatch??((D)=>S9(J,D)),X=Y.extractFrame??(async(D,O,C)=>Z0(AZ().ffmpeg,D,O,C)),W=Y.probeExempt??(async()=>{try{return await z2(Z)==="internal"}catch(D){return j.warn(`身份探测失败(${D instanceof Error?D.message:String(D)})——按非豁免(1 积分/张同步计费)继续`),!1}}),V=Q.topK?Number(Q.topK):void 0,K,G,$,H,N=0;if(Q.plan){if(H=X0(Q.plan),!nZ(H))throw Error(`找不到 plan 文件:${H}`);$=JSON.parse(await $2(H,"utf8"));let D=VO($,V);K=D.items,G=D.targets,N=D.skipped,j.step(`▶ 理解 plan 候选:${K.length} 项(${H}${V?` · 每 query 前 ${V} 条`:""})…`)}else{let D=I1(Q.materials),O=await KO(D,Y.videoSceneFrames??GO);K=O.items,N=O.skipped,j.step(`▶ 理解素材文件:${D.length} 个文件 → ${K.length} 帧(视频按场景中点、图片直传)…`)}let q=await v8(),U;try{U=await sX(K,{db:q,describeBatch:z,extractFrame:X,confirm:Y.confirm??S1,probeExempt:W,yes:Q.yes===!0,frameDir:dZ(F0(),`describe-${process.pid}`),onLog:(D)=>j.info(D)})}finally{q.close()}if(U.declined){j.err("已取消:素材理解计费确认被拒绝——零服务端调用、零计费(缓存命中部分照常可用)。可用 --yes 跳过确认,或 --top-k 缩小理解范围后重跑。");let D={ok:!1,mode:"describe",...H?{planPath:H}:{},described:U.described,cached:U.cached,called:0,failed:U.failed,credits_estimated:U.estimatedCredits,...U.exempt!==void 0?{exempt:U.exempt}:{},reason:"describe_billing_declined"};if(process.exitCode=1,Q.json)console.log(JSON.stringify(D));return D}let F=0;if($&&H&&G)G.forEach((D,O)=>{let C=U.results[O];if(C)D.describe=aX(C),F++}),await t0(H,JSON.stringify($,null,2)),j.ok(`理解完成并回写 plan:注入 ${F} 条 result.describe(缓存命中 ${U.cached} · 实际调用 ${U.called} 张${U.failed?` · 取帧失败 ${U.failed}`:""}${N?` · 无源跳过 ${N}`:""})→ ${H}`),j.info("usable_flags 只是给你的信号:剔除与否由你编辑 plan 裁定(删 result 条目后 gtrk matrix lay),CLI 不会替你剔。");else if(j.ok(`理解完成:${U.described} 项(缓存命中 ${U.cached} · 实际调用 ${U.called} 张${U.failed?` · 取帧失败 ${U.failed}`:""}${N?` · 跳过 ${N}`:""})`),!Q.json)K.forEach((D,O)=>{let C=U.results[O];if(!C)return;let T=Object.entries(C.usable_flags).filter(([,_])=>_).map(([_])=>_);j.info(`${D.materialId} @${(D.tsMs/1000).toFixed(1)}s · mark ${C.mark}${T.length?` · ⚠ ${T.join("/")}`:""} · ${C.desc.slice(0,80)}${C.tags.length?` · tags: ${C.tags.join("/")}`:""}`)});let M=U.exempt?"计费豁免(同合云内部成员)":U.called>0?`实际调用 ${U.called} 张 ≈ ${U.called*1} 积分(1 积分/张同步计费)`:"零调用零计费(全部缓存命中)";j.info(`计费:${M};理解产物已入本地缓存(同素材同帧下次零调用)。`);let R={ok:!0,mode:"describe",...H?{planPath:H,injected:F}:{},described:U.described,cached:U.cached,called:U.called,failed:U.failed,credits_estimated:U.estimatedCredits,...U.exempt!==void 0?{exempt:U.exempt}:{},...$?{}:{items:K.map((D,O)=>({material_id:D.materialId,ts_ms:D.tsMs,source:D.source.kind==="direct"?D.source.path:D.source.src,describe:U.results[O]??null}))}};if(Q.json)console.log(JSON.stringify(R));return R}async function HO(Z,Q){let Y=jZ(),J,z;if(Z.plan)J=X0(Z.plan),z=Z.project?X0(Z.project):u9(u9(J));else z=X0(Z.project),J=dZ(z,"split","broll-plan.json");if(!nZ(J))throw Error(`找不到 plan 文件:${J}(先 gtrk matrix --project <目录> --lay 0 产 plan,或用 --plan 显式指定)`);let X=JSON.parse(await $2(J,"utf8")),W=rW(X);for(let v of X.beats??[])for(let S of v.queries??[])for(let k of S.results??[])if(SQ(k)&&typeof k.local_path==="string"&&k.local_path&&!nZ(k.local_path))W.push(`beat ${v.beat}/clip ${k.clip_id}:local_path 不可编辑且路径无效(${k.local_path} 不存在)——本地素材路径由检索产出,请还原该字段或删除该候选条目`);if(W.length)throw Error(`plan 校验未通过(${W.length} 处)。可编辑面 = results 删条/重排、segments 删段、describe 增删、pinned:true;`+`clip_id/local_path/url/几何字段不可编辑:
|
|
228
|
+
- ${W.join(`
|
|
229
|
+
- `)}`);let V=x4(Z.lay);if(V===0)throw Error("matrix lay 的 --lay 不能为 0(lay 就是铺轨这一步;只要 plan 不铺请直接编辑 plan 文件)");j.step(`▶ 消费 plan:${J}(member_type=${X.member_type} · ${X.beats.length} beat)…`);let K=q2(z),G,$=!1;if(K)try{G=lZ(K).gtrk}catch{$=!0}let H=await ZQ({baseDir:z,gtrk:G,gtrkUnreadable:$,entries:X.beats.map((v)=>({key:v.beat,beat:v.beat,track_st:v.track_st,track_ed:v.track_ed}))});QQ(H);let N=new Set(H.summary.dropped),q=X.beats.filter((v)=>!N.has(v.beat)).map((v)=>{let S=H.windows.get(v.beat);return S?{...v,track_st:S.track_st,track_ed:S.track_ed}:v}),U={...X,beats:q},F=X.member_type==="local"?"local":"common",M=A4(Z.markWeight),R,D;if(M>0){let v=v0();if(nZ(v)){R=await v8(v);let S=R,k=new Map;D=(c,a)=>{let u=`${c}@${a}`;if(k.has(u))return k.get(u);let l=rX(S,_0(c),a);return k.set(u,l),l},j.info(`美观度权重开启(w=${M}):融合分 = sim×${1-M}+(mark/100)×${M};mark 取 describe 理解缓存(素材内就近帧),无缓存候选按中性处理`)}else j.warn(`--mark-weight ${M}:本地索引库不存在(${v}),无任何 describe 缓存——全部候选按中性处理(排序与不开权重一致)。先跑 gtrk matrix describe 产 mark 再开权重才有效`)}let O=A4(Z.highlightWeight),C;if(O>0){if(R){let v=R,S=new Map;C=(k,c)=>{let a=`${k}@${c}`;if(S.has(a))return S.get(a);let u=E7(v,_0(k),c);return S.set(a,u),u}}else{let v=v0();if(nZ(v)){R=await v8(v);let S=R,k=new Map;C=(c,a)=>{let u=`${c}@${a}`;if(k.has(u))return k.get(u);let l=E7(S,_0(c),a);return k.set(u,l),l}}else j.warn(`--highlight-weight ${O}:本地索引库不存在(${v}),无任何理解缓存——全部候选按中性处理。先跑 gtrk matrix describe 产看点分再开权重才有效`)}if(C)j.info(`看点权重开启(wh=${O}):融合分 = sim×${Math.max(0,1-M-O)}+(mark/100)×${M}+(highlight/100)×${O};看点分取 describe 理解缓存(素材内就近帧),无缓存候选按中性处理(权重回吐给 sim)`)}let T;try{T=await g4(z,U,V,H2(Z.scoreFloor),Z.blackBed??!0,Z.forceRelay===!0,H,{imageBroll:Z.imageBroll!==!1,yes:Z.yes===!0,deps:Q,sourceLayer:F,dedupScope:k4(Z.dedupScope),markWeight:M,markLookup:D,highlightWeight:O,highlightLookup:C,cutAlign:f4(Z.cutAlign),gapFill:b4(Z.gapFill),gapFillExplicit:Z.gapFill!==void 0,...h4(Z,Y)})}finally{R?.close()}let _=T?.lay,P=_?.refused===!0?_.keptEditedTracks:void 0,E=T?.declined===!0,I=0;for(let v of U.beats)for(let S of v.queries)I+=S.results?.length??0;let y=V2(X.member_type,Number(_?.dedup?.emptySlots??0)),h={ok:P===void 0&&!E,mode:"lay",memberType:X.member_type,planPath:J,...P?{refused:P,reason:"tracks_edited",planReusable:!0}:{},...E?{reason:"image_move_billing_declined",planReusable:!0}:{},...T?.estimateOnly?{estimateOnly:!0,planReusable:!0}:{},...T?.imageBilling?{image_move_billing:T.imageBilling}:{},..._?{lay:_}:{},...T?.integrity?{integrity:T.integrity}:{},...y?{upsell:y}:{},reprojection:H.summary,counts:{beats:q.length,queries:0,results:I,errors:0}};if(!h.ok)process.exitCode=1;if(y&&!Z.json)j.warn(y.message);if(Z.json)console.log(JSON.stringify(h));return h}async function qO(Z,Q){let Y=I1(Q.dirs),J=y4(Z),z=v0();if(!nZ(z))throw Error(`本地索引不存在(${z})——先跑 gtrk matrix index --dirs ${Y.join(",")} 建索引`);j.step(`▶ 本地检索模式:载入索引(域:${Y.join("、")})…`);let X=await v8(z),W;try{W=R4(X,Y)}finally{X.close()}if(W.frames.length===0)throw Error(`索引里没有该检索域的素材帧(域:${Y.join("、")})——先跑 gtrk matrix index --dirs ${Y.join(",")}(文件消失/未索引的素材不参与检索)`);j.info(`索引就绪:${W.materials.length} 个素材 · ${W.frames.length} 帧(消失文件已过滤)`);let V=H2(Q.scoreFloor),K=Q.topK?Number(Q.topK):void 0,G=Q.imageBroll!==!1,$=tP(Q.sourceWindow);if($)j.info(`源时间窗过滤:${$[0]}s–${$[1]}s(段级交集、段边界不裁剪;图片候选不参与;无命中即空结果,扩窗与否由你裁定)`);let H=new Map;return{cfg:Z,memberType:"local",sourceLayer:"local",search:async(N)=>{let q=H.get(N);if(!q)[q]=await R7(J,[{text:N}]),H.set(N,q);let{recalled:U,results:F}=D4(W,q,{scoreFloor:V,includeImages:G,...$?{sourceWindowSec:$}:{}});return{recalled:U,results:K&&K>0?F.slice(0,K):F}}}}async function T4(Z,Q,Y={}){let J=Z.memberType==="local",z,X;if(Q.dispatch)z=X0(Q.dispatch),X=u9(u9(z));else if(Q.project)X=X0(Q.project),z=dZ(X,"split","dispatch.json");else throw Error('需 --project <目录> 或显式 --dispatch <path>(ad-hoc 检索用:gtrk matrix search "<query>")');if(!nZ(z))throw Error(`找不到派单清单:${z}(先跑 gtrk split <拆分稿> 落地派单)`);let W=JSON.parse(await $2(z,"utf8")),V=Array.isArray(W.film_broll)?W.film_broll:[],K=q2(X),G,$=!1;if(K)try{G=lZ(K).gtrk}catch{$=!0}let H=await ZQ({baseDir:X,gtrk:G,gtrkUnreadable:$,entries:V.map((k)=>({key:k.beat,beat:k.beat,span:k.span,track_st:k.track_st,track_ed:k.track_ed}))});QQ(H);let N=new Set(H.summary.dropped),q=V.filter((k)=>!N.has(k.beat)).map((k)=>{let c=H.windows.get(k.beat);return c?{...k,track_st:c.track_st,track_ed:c.track_ed}:k});j.step(`▶ B-roll 检索:${q.length} 个 beat(${J?"本地索引":`${Z.memberType} 口`})…`);let U=[],F=0,M=0,R=0;for(let k of q){let c=[],a=[...new Set((k.anchors??[]).map((l)=>l.query).filter((l)=>typeof l==="string"&&l&&!k.queries.includes(l)))];for(let l of[...k.queries,...a]){let f=a.includes(l);try{let n=await Z.search(l,k);c.push({query:l,data:n}),F++,R+=n.results?.length??0,j.info(`${k.beat}「${l}」${f?"(锚)":""}→ ${n.results?.length??0} 条候选(召回 ${n.recalled??"?"})`)}catch(n){if(n?.code===BQ)throw n;let QZ=n.code,zZ=n instanceof Error?n.message:String(n);c.push({query:l,error:{...QZ!=null?{code:QZ}:{},msg:zZ}}),M++,j.warn(`${k.beat}「${l}」失败:${zZ}`)}}let u=Y4(k,c);if(k.anchors?.length)u.anchors=k.anchors.map((l)=>{let f=H.utteranceIndex?.get(l.utterance),n=f?aW(f.text,l.keyword,f.track_st,f.track_ed):null;if(n===null)j.warn(f?`${k.beat} 锚「${l.keyword}」:当刻句 ${l.utterance} 文本里找不到该关键词(改稿后文本漂移)——本锚 degraded,铺轨退化普通槽`:`${k.beat} 锚「${l.keyword}」:句 ${l.utterance} 无当刻时码(重投影降级或该句已被剪)——本锚 degraded,铺轨退化普通槽`);return{keyword:l.keyword,utterance:l.utterance,at_sec:n,query:l.query}});U.push(u)}let D=F+M;if(V.length===0)j.warn("无 B-roll 派单(film_broll 队列为空)——照常写出空 plan");if(D>0&&F===0)throw Error(`全部 ${D} 个 query 检索失败,未写入 plan(逐条原因见上方日志)`);let O=LO(E1(X)),C=J4({generatedAt:new Date().toISOString(),memberType:Z.memberType,projectSlug:O,columnId:Z.columnId,beats:U}),T=dZ(X,"split");await wQ(T,{recursive:!0});let _=dZ(T,"broll-plan.json");if(await t0(_,JSON.stringify(C,null,2)),j.ok(`候选清单已生成:${_}(${U.length} beat · ${F}/${D} query 成功 · ${R} 条候选)`),J)j.info("清单只含引用不含素材:本地素材以绝对路径直引(local_path,无 url 签名/过期语义);封面铺轨时现抽。");else j.info("清单只含引用不含素材:cover_url 可直接预览;url 带签名默认 24h 过期,过期重跑本命令即重签。");let P=x4(Q.lay),E;if(P>0)E=await g4(X,C,P,H2(Q.scoreFloor),Q.blackBed??!0,Q.forceRelay===!0,H,{imageBroll:Q.imageBroll!==!1,yes:Q.yes===!0,deps:Y,sourceLayer:Z.sourceLayer,dedupScope:k4(Q.dedupScope),cutAlign:f4(Q.cutAlign),gapFill:b4(Q.gapFill),gapFillExplicit:Q.gapFill!==void 0,...h4(Q,Z.cfg)});let I=E?.lay,y=I?.refused===!0?I.keptEditedTracks:void 0,h=E?.declined===!0,v=V2(Z.memberType,Number(I?.dedup?.emptySlots??0)),S={ok:y===void 0&&!h,mode:"plan",memberType:Z.memberType,...Z.columnId?{columnId:Z.columnId}:{},planPath:_,...y?{refused:y,reason:"tracks_edited",planReusable:!0}:{},...h?{reason:"image_move_billing_declined",planReusable:!0}:{},...E?.estimateOnly?{estimateOnly:!0,planReusable:!0}:{},...E?.imageBilling?{image_move_billing:E.imageBilling}:{},...I?{lay:I}:{},...E?.integrity?{integrity:E.integrity}:{},...v?{upsell:v}:{},reprojection:H.summary,counts:{beats:U.length,queries:D,results:R,errors:M}};if(!S.ok)process.exitCode=1;if(v&&!Q.json)j.warn(v.message);if(Q.json)console.log(JSON.stringify(S));return S}function x4(Z){if(Z===void 0)return 1;let Q=Number(Z);if(Number.isInteger(Q)&&Q>=0)return Q;return j.warn(`--lay 取值非法(${Z}),按默认 1 处理`),1}function k4(Z){if(Z===void 0||Z==="scene")return"scene";if(Z==="material")return"material";throw Error(`--dedup-scope 只支持 scene 或 material(得到「${Z}」)`)}function A4(Z){if(Z===void 0)return 0;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0&&Q<=1)return Q;return j.warn(`--mark-weight 取值非法(${Z}),按 0(关闭)处理`),0}function f4(Z){if(Z===void 0)return GQ;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0&&Q<=1)return Q;return j.warn(`--cut-align 取值非法(${Z}),按默认 ${GQ} 处理`),GQ}async function UO(Z,Q,Y,J,z,X,W){let V=dZ(Q,"split","dispatch.json"),K=nZ(V)?JSON.parse(iP(V,"utf8")):void 0,G=GW(K,Y.utteranceIndex);if(G.length===0)return W.warn("编排期质检跳过:拿不到卡点句(没有 dispatch,或口播轨重投影降级)——"+"**这不等于查过了没问题**,本轮的画音对齐没有被检查。"),{res:z,plan:Z,residual:[]};if(!X.describeEndpoint)return W.warn("编排期质检跳过:未配置素材理解端点。"),{res:z,plan:Z,residual:[]};let $=G.length*y0;if(W.info(`编排期质检:${G.length} 个卡点句,最多判 ${$} 帧`+`(每句 1 帧 × 最多 ${y0} 轮;命中判定缓存的不重复计费)。`),!X.yes){if(!await(X.deps.confirm??S1)(`确认发起编排期质检(最多 ${$} 帧判定)?`))return W.info("已取消编排期质检——零判定零计费,本轮按未质检的编排产物落轨。"),{res:z,plan:Z,residual:[]}}let H=new Map;for(let F of Z.beats)for(let M of F.queries)for(let R of M.results??[])if(typeof R.local_path==="string")H.set(R.clip_id,R.local_path);let N=b8();if(!N)W.warn("未找到 ffmpeg,编排期质检抽不到帧——本轮各句按「跳过判定」处理,不当作画面不对。");let q=HW({endpoint:X.describeEndpoint,ffmpeg:N?.ffmpeg??"ffmpeg",sourcePathFor:(F)=>H.get(F),log:W}),U;try{try{if(nZ(v0()))U=await v8(v0())}catch(M){W.warn(`判定缓存不可用(${M.message})——本轮照跑,只是重跑时不能复用判定。`)}let F=await zW(Z,G,{arrange:(M)=>J(M),slotsOf:(M)=>[...M.outcome.fills.values()].flatMap((R)=>R[0]??[]),judge:q,...U?{cache:$W(U,_0)}:{},log:W});return{res:F.outcome,plan:F.plan,residual:F.residual.map((M)=>({beat:M.beat,sentence:M.sentence}))}}finally{U?.close()}}function h4(Z,Q){let Y=NO(Z.arrange),J=jO(Z.arrangeCostCap),z=Z.arrangeQc===!0;return{...Y!==void 0?{arrangeMode:Y}:{},...J!==void 0?{arrangeCostCap:J}:{},...Y!=="local"&&Q?{arrangeEndpoint:{url:i3(Q.base),apiKey:Q.apiKey}}:{},...z?{arrangeQc:!0}:{},...Z.arrangeEstimateOnly===!0?{arrangeEstimateOnly:!0}:{},...z&&Q?{describeEndpoint:{url:RQ(Q.base),apiKey:Q.apiKey}}:{}}}function NO(Z){if(Z===void 0)return;if(Z==="local"||Z==="shadow"||Z==="cloud")return Z;throw Error(`--arrange 只支持 local、shadow 或 cloud(得到「${Z}」)`)}function BO(Z,Q){if(!f9(Q))return Z??"local";if(Z==="local")throw Error("本地素材的 B-roll 编排只能走云端,`--arrange local` 已不再受理。\n"+`编排算法自 2026-08-31 起只在服务端迭代;再留一条本机旧路,等于让你在不知情时拿到另一套算法的结果。
|
|
230
230
|
`+`⚠️ 它**不是**一个「省钱」开关——用素材矩阵的素材同样要付检索费。两条路都要花钱,只是花在不同环节。
|
|
231
|
-
`+"(素材矩阵那条路的**编排**不受影响、仍在本机跑且不计费;它的**检索**照旧按次计费。)");return Z??"cloud"}function
|
|
231
|
+
`+"(素材矩阵那条路的**编排**不受影响、仍在本机跑且不计费;它的**检索**照旧按次计费。)");return Z??"cloud"}function jO(Z){if(Z===void 0)return;let Q=Number(Z);if(!Number.isInteger(Q)||Q<=0)throw Error(`--arrange-cost-cap 须为正整数(得到「${Z}」)`);return Q}function b4(Z){if(Z===void 0||Z==="solid")return"solid";if(Z==="fast"||Z==="none")return Z;throw Error(`--gap-fill 只支持 fast、solid 或 none(得到「${Z}」)`)}function H2(Z){if(Z===void 0)return w6;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0&&Q<=1)return Q;return j.warn(`--score-floor 取值非法(${Z}),按默认 ${w6} 处理`),w6}function q2(Z){return[dZ(Z,"gtrk","project.gtrk"),dZ(Z,"project.gtrk")].find((Y)=>nZ(Y))}async function S1(Z){let Q=rP({input:process.stdin,output:process.stderr});try{let Y=(await Q.question(`${Z} [y/N] `)).trim().toLowerCase();return Y==="y"||Y==="yes"}finally{Q.close()}}function FO(){let Q={cfg:jZ(),uploadCached:gZ,invalidateUpload:V8,submitTask:W8,getTaskResult:A8};return async({imageAbs:Y,destAbs:J,params:z})=>{await DW({deps:Q,imageAbs:Y,destAbs:J,params:z})}}var G2=(Z)=>Math.round(Z*1000)/1000;function E4(Z,Q,Y){let J=B1(Z),z;try{z=hZ(dZ(Q,...J.split("/")))}catch{}return{id:Z,path:J,duration:z&&z.duration>0?G2(z.duration):Y.duration,video_size:z&&z.width>0&&z.height>0?[z.width,z.height]:[Y.canvas[0],Y.canvas[1]],...z&&z.fps>0?{video_rate:G2(z.fps)}:{}}}function MO(Z,Q){let Y;try{let J=hZ(Q);if(J.width>0&&J.height>0)Y=[J.width,J.height]}catch{}return{id:Z,path:Q,...Y?{video_size:Y}:{}}}async function RO(Z){let Q=new Map,Y=[],J={hasImage:!1,declined:!1,injected:Q,billing:{generated:0,reused:0,estimated_credits:0},failures:Y},z=new Map;for(let F of Z.fills.values())for(let M of F)for(let R of M){let D=Z.candById.get(R.clip_id);if(D?.kind!=="image")continue;let O=D.local_path;if(!O||!nZ(O)){j.warn(`图片素材缺失(clip ${R.clip_id}):${O??"无 local_path"}——该槽位跳过`);continue}let C=BW(R.track_ed-R.track_st),T=await jW({duration:C,width:Z.canvas[0],height:Z.canvas[1]}),_=FW(R.clip_id),P=MW(_,T);R.material_id=P;let E=z.get(P)??{materialId:P,imageAbs:O,hash16:_,duration:C,slots:[]};E.slots.push(R),z.set(P,E)}if(z.size===0)return J;let X=[],W=0;for(let F of z.values())if(nZ(dZ(Z.gtrkDir,...B1(F.materialId).split("/"))))W++,Q.set(F.materialId,E4(F.materialId,Z.gtrkDir,{duration:F.duration,canvas:Z.canvas}));else X.push(F);let V=X.length*i7,K={generated:0,reused:W,estimated_credits:V};if(X.length===0)return j.info(`图片运镜:${W} 张全部缓存命中(工程 assets/broll-move/ 复用,零云端调用零计费)`),{hasImage:!0,declined:!1,injected:Q,billing:K,failures:Y};let G=`${X.length} 张图片将生成运镜视频,约 ${V} 积分`+`(${i7} 积分/张${W?` · 另 ${W} 张缓存命中不计费`:""};`+"注意:图片本体将上云做运镜——与视频素材「本体不上云」不同,不愿图片上云可用 --no-image-broll 排除)";if(Z.yes)j.info(`${G}——已按 --yes 跳过确认`);else if(j.warn(G),!await(Z.deps.confirm??S1)("确认继续生成?"))return{hasImage:!0,declined:!0,injected:Q,billing:K,failures:Y};await wQ(dZ(Z.gtrkDir,...o7.split("/")),{recursive:!0});let $=Z.deps.generateImageMove??FO(),H=[...X],N=X.length,q=0,U=async()=>{for(;;){let F=H.shift();if(!F)return;let M=dZ(Z.gtrkDir,...B1(F.materialId).split("/"));try{await $({imageAbs:F.imageAbs,destAbs:M,params:{width:Z.canvas[0],height:Z.canvas[1],duration:F.duration}}),K.generated++,j.info(`[${++q}/${N}] ${E1(F.imageAbs)} 运镜就绪(${F.duration}s · ${Z.canvas[0]}x${Z.canvas[1]})`),Q.set(F.materialId,E4(F.materialId,Z.gtrkDir,{duration:F.duration,canvas:Z.canvas}))}catch(R){let D=R instanceof Error?R.message:String(R);Y.push({image:F.imageAbs,reason:D});let O=RW(F.hash16);if(!Q.has(O))Q.set(O,MO(O,F.imageAbs));for(let C of F.slots)C.material_id=O;j.warn(`[${++q}/${N}] ${E1(F.imageAbs)} 运镜失败(${D})——该图以静态图片上轨兜底,重铺本命令会自动重试运镜`)}}};return await Promise.all(Array.from({length:Math.min(NW,H.length)},()=>U())),{hasImage:!0,declined:!1,injected:Q,billing:K,failures:Y}}async function DO(Z,Q){let Y=new Map,J=new Map;for(let X of Z.beats)for(let W of F9(X).slice(0,S5))if(SQ(W)&&!J.has(W.clip_id))J.set(W.clip_id,W);if(J.size===0)return Y;let z=b8();if(!z)return j.warn("未找到 ffmpeg,跳过本地候选封面抽取(gtrk deps install --ffmpeg 后重跑可补)"),Y;await wQ(dZ(Q,...I5.split("/")),{recursive:!0});for(let[X,W]of J){let V=`${I5}/${_0(X)}.jpg`,K=dZ(Q,...V.split("/"));if(nZ(K)){Y.set(X,V);continue}let G=W.local_path;if(!G||!nZ(G))continue;let $=W.segments?.[0],H=$?$.best:typeof W.duration==="number"?W.duration/2:0;if(await Z0(z.ffmpeg,G,H,K))Y.set(X,V);else j.warn(`本地候选封面抽取失败(clip ${X} @ ${H}s)——候选照常可用,封面留空`)}return Y}function I4(Z,Q){j.err(`拒绝铺轨:${Z.length} 条候选轨已被你在客户端编辑过(track_index ${Z.join("/")||"-"})——`+"本次不剥它们、也不铺新轨,工程文件零改动。");for(let Y of Q)j.warn(Y);j.warn("下一步二选一:① 在客户端处置那条轨(删掉 / 移走 / 改用别的轨)后重跑本命令;"+"② 确知要丢弃那条轨上的编辑 → 加 --force-relay 强制剥离重铺"+"(会删掉已确认原片的 broll-raw-* 素材登记,盘上原片文件成孤儿,不可恢复)。"),j.warn("已产出的 broll-plan.json 与已落盘的 preview 代理照常可用——拒的只是「改工程」这一步。")}async function g4(Z,Q,Y,J,z,X,W,V={imageBroll:!0,yes:!1,deps:{}}){let K=V,G=q2(Z);if(!G){j.warn(`未找到工程文件(${dZ(Z,"gtrk","project.gtrk")}),跳过铺轨——plan 已产出,可后续在有工程的目录重跑`);return}let{gtrk:$,revision:H}=lZ(G);G8($);let N=cJ($,X);if(N.refused)return I4(N.keptEditedTracks,N.warnings),{lay:{refused:!0,keptEditedTracks:N.keptEditedTracks,laidTracks:[],laidClips:0,removedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[],downloads:{preview:0,raw:0,reused:0,failed:0,local:0}}};let q=V.cutAlign??GQ,U;if(q>0){let x=[...new Set([...W.utteranceIndex?.values()??[]].map((g)=>Math.round(g.track_st*1000)))].sort((g,t)=>g-t).map((g)=>g/1000);if(x.length)U=x;else j.warn(`句界吸附不可用(${W.summary.mode==="dispatch_snapshot"?W.summary.reason_text??"重投影降级":"当刻无存活句"})——本轮按旧节奏切槽(--cut-align 0 可显式关闭本提示对应的功能)`)}let F=V.gapFill??"solid",M=!k5($.video_track??[]),R=M?F:"none";if(!M&&F!=="none"&&V.gapFillExplicit)j.info("主轨 gap 填充未生效:口播工程的主轨是你的 A-roll(磁吸风险不在 B-roll 候选轨),--gap-fill 只作用于音频驱动工程的最低号 B-roll 主轨——本轮按既有留空语义铺轨。");let D={noImage:!V.imageBroll,dedupScope:V.dedupScope,markWeight:V.markWeight,markLookup:V.markLookup,highlightWeight:V.highlightWeight,highlightLookup:V.highlightLookup,...U?{cutAlign:{ratio:q,starts:U}}:{},...R!=="none"?{gapFill:R}:{}},O=p7(BO(V.arrangeMode,Q)),C=f9(Q);if(V.arrangeEstimateOnly){if(!(O!=="local"&&f9(Q)))return j.info("本轮不走云端编排(素材矩阵路或总闸已压回本机),无编排量可估——本机编排不计费。"),{estimateOnly:!0,lay:{estimateOnly:!0,arrange:{applicable:!1}}};let g=_Q(Q,Y,D),t=TQ(g);return j.info(`本次云端编排的**编排量**预估为 ${t}${V.arrangeCostCap!==void 0?`(本次上限 ${V.arrangeCostCap})`:""}。`+"只预估未执行:零云端调用、工程文件零改动。去掉 --arrange-estimate-only 即可真跑。"),{estimateOnly:!0,lay:{estimateOnly:!0,arrange:{applicable:!0,units:t,...V.arrangeCostCap!==void 0?{costCap:V.arrangeCostCap}:{},scale:g}}}}if(O!=="local"&&f9(Q)){let x=V.deps.confirm??(process.stdin.isTTY?S1:void 0);if(!(await r3(TQ(_Q(Q,Y,D)),{assumeYes:V.yes,...V.arrangeCostCap!==void 0?{costCap:V.arrangeCostCap}:{},...x?{confirm:x}:{},log:{info:(t)=>j.info(t),warn:(t)=>j.warn(t)}})).proceed)return j.err("已取消:本地素材的 B-roll 编排计费确认被拒绝——本轮铺轨中止,工程文件零改动、零云端调用"+`(broll-plan.json 照常可用,随时可重跑)。
|
|
232
232
|
`+`这一步只在云端跑,没有本机备用算法可退——不确认就没有编排结果。
|
|
233
|
-
`+"可用 --yes 跳过确认,或 --arrange-cost-cap 先设个上限再跑。"),{declined:!0,lay:{declined:!0,laidTracks:[],laidClips:0,removedTracks:[],keptEditedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[]}}}let T={info:(i)=>j.info(i),warn:(i)=>j.warn(i)},_=(i)=>r3(i,Y,J,O,P,{runLocal:()=>v5(i,Y,J,O),...W.arrangeEndpoint?{endpoint:W.arrangeEndpoint}:{},...W.arrangeCostCap!==void 0?{costCap:W.arrangeCostCap}:{},...D?{strictCloud:!0}:{},log:T}),L=await _(Q),I=[];if(W.arrangeQc){let i=await YP(Q,Z,V,_,L,W,T);L=i.res,Q=i.plan,I=i.residual}let{fills:E,clipIds:y,stats:f,pinnedOutcome:S,markStats:w,anchors:x,cutAlign:m,gapFills:r}=L.outcome;if(L.source==="cloud")j.info(`本轮 B-roll 编排由云端产出(编排量 ${L.units??"?"})——本地复算自校验一致。`);{let i=(b,n)=>{for(let p of Q.beats)for(let KZ of p.queries)for(let zZ of KZ.results??[]){if(zZ.clip_id!==b)continue;for(let a of zZ.segments??[])if(a.start<=n&&n<=a.end)return a.cuts}return},t=[];for(let[b,n]of E)for(let p of n[0]??[])t.push({beat:b,clipId:p.clip_id,cuts:i(p.clip_id,p.clip_st)});let _Z=e3(t3(t));if(_Z)j.warn(_Z)}if(m)j.info(`句界吸附:字幕句起点 ${m.starts_total} · 恰逢镜头切点 ${m.aligned}(实测 ${Math.round(m.ratio*100)}% · 目标 ${Math.round(m.target*100)}%——三成错开是拍板内的自然节奏,非缺陷)`);if(x.length){let i={planned:0,pinned:0,degraded:0};for(let t of x)if(i[t.status]++,t.status==="degraded")j.warn(`${t.beat} 锚「${t.keyword}」降级:${t.reason??"未知原因"}——该锚退化普通槽,区间照常序贯填充`);else j.info(`${t.beat} 锚「${t.keyword}」@ ${t.at_sec}s → clip ${t.clip_id} 钉 ${t.track_st}s(提前量 0.5s${t.status==="pinned"?" · 用户钉选候选占锚槽":""})`);j.info(`关键词锚:钉位 ${i.planned} · 用户钉选 ${i.pinned} · 降级 ${i.degraded}(共 ${x.length} 锚)`)}let c=typeof W.markWeight==="number"&&W.markWeight>0;if(c)j.info(`美观度权重:mark 缓存命中 ${w.hit} 候选 · 中性 ${w.neutral} 候选(w=${W.markWeight})`);let g=typeof W.highlightWeight==="number"&&W.highlightWeight>0,k=[];if(c&&w.hit===0&&w.neutral>0)k.push(`美观度(--mark-weight ${W.markWeight})`);if(g&&w.hlHit===0&&w.hlNeutral>0)k.push(`看点(--highlight-weight ${W.highlightWeight})`);if(k.length)j.warn(`${k.join(" 与 ")}权重开了但**本片零缓存覆盖**:全部候选按中性处理,排序与不开权重完全一致(权重已回吐给语义分)。`+"根因通常是本 plan 未经理解——先跑 gtrk matrix describe --plan <plan 路径> 再重跑 lay 才有效;"+"手写 plan(免索引直排)也走这条路,此时美观度/看点/模糊降权三条信号一并不生效");if(S.yielded.length)j.warn(`pinned 候选未能全部入选:${S.yielded.join("、")} 让位(pinned 间冲突后到让位/供长不足/被排除)——`+"其余 pinned 已优先满足;要强保它们可减少同 beat 的 pinned 数或放宽槽位(--lay/--top-k)后重跑");let l=[...E.values()].flat().reduce((i,t)=>i+t.length,0);j.step(`▶ 候选铺轨(${Y} 轨 · 平铺 ${l} 槽位 · ${y.size} 个 clip)…`);let e=b9(G),WZ=nZ(e,..._5.split("/"));await TQ(WZ,{recursive:!0});let vZ=new Map;for(let i of Q.beats)for(let t of j9(i))if(!vZ.has(t.clip_id))vZ.set(t.clip_id,t);let LZ=Array.isArray($.video_size)?$.video_size:[1920,1080],RZ=await KP({fills:E,candById:vZ,gtrkDir:e,canvas:[LZ[0],LZ[1]],yes:K.yes,deps:K.deps});if(RZ.declined)return j.err("已取消:图片运镜计费确认被拒绝——本轮铺轨中止,工程文件零改动、零云端调用(broll-plan.json 照常可用)。"+"可用 --yes 跳过确认,或 --no-image-broll 排除图片候选后重跑。"),{declined:!0,imageBilling:RZ.billing,lay:{declined:!0,laidTracks:[],laidClips:0,removedTracks:[],keptEditedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[]}};let cZ=await GP(Q,e),bZ=new Map,iZ=$.struct_meta?.broll;for(let i of iZ?.beats??[])for(let t of i.candidates??[])if(typeof t.clip_id==="string"&&t.preview_path&&(t.source==="preview"||t.source==="raw"))bZ.set(t.clip_id,t.source);let wZ=new Map,DZ={preview:0,raw:0,reused:0,failed:0,local:0};for(let i of y){let t=vZ.get(i);if(!t)continue;if(t.kind==="image")continue;if(CQ(t)){let p=t.local_path;if(!p||!pZ(p)){j.warn(`本地素材缺失(clip ${i}):${p??"无 local_path"}——该候选槽位跳过(素材可能在未挂载的可移动盘上,重建索引或挂回后重跑)`),DZ.failed++;continue}wZ.set(i,{rel:p,source:"local"}),DZ.local++;continue}let _Z=`${_5}/${i}.mp4`,b=nZ(e,..._Z.split("/"));if(pZ(b)){let p=bZ.get(i);if(p!=="raw"){wZ.set(i,{rel:_Z,source:p??"preview"}),DZ.reused++;continue}if(await P4(t,b,{previewOnly:!0})==="preview")wZ.set(i,{rel:_Z,source:"preview"}),DZ.preview++,j.info(`clip ${i} 代理已补产,已从原片回落态换回 preview`);else wZ.set(i,{rel:_Z,source:"raw"}),DZ.reused++;continue}let n=await P4(t,b);if(n)wZ.set(i,{rel:_Z,source:n}),DZ[n]++;else DZ.failed++}let{gtrk:y8,revision:L8}=dZ(G);if(W8(y8),L8!==H)j.warn("工程在本轮铺轨期间被改动过(下载/运镜进行中你在客户端存了一次):已按**改后**的工程落轨写回,"+"你那次保存不会被覆盖;但本轮槽位是按改动前的时间线切的,若改的是口播时间线,B-roll 位置可能与新时间线对不齐——"+"觉得不对就直接重跑一次本命令(plan 与已落盘代理都可复用,重跑很快)。");let{next:X0,summary:GZ,warnings:CZ}=y5({gtrk:y8,plan:Q,lay:Y,fills:E,downloads:wZ,covers:cZ,injectedMaterials:RZ.injected,sourceLayer:W.sourceLayer,generatedAt:new Date().toISOString(),planPath:"split/broll-plan.json",blackBed:z,forceRelay:X,...R!=="none"?{gapFill:{mode:R,planned:r??[]}}:{}});if(GZ.refused){let i=GZ.keptEditedTracks;return O4(i,CZ),{lay:{refused:!0,keptEditedTracks:i,laidTracks:[],laidClips:0,removedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[],downloads:DZ},...RZ.hasImage?{imageBilling:RZ.billing}:{}}}let x8=(GZ.gapFill?.fills??[]).some((i)=>i.kind==="solid");if(GZ.blackTrack!==null||x8){let i=y8.video_size,t={hex:u0,width:i[0],height:i[1]},_Z=JQ(t),b=nZ(e,..._Z.split("/"));try{if(!pZ(b)){await TQ(b9(b),{recursive:!0});let n=`${b}.tmp-${process.pid}`;await r0(n,TJ(t)),await hO(n,b)}}catch(n){j.warn(`纯黑 PNG 落盘失败(${_Z}):${n.message} —— 本次不铺黑底垫轨${x8?"、主轨黑片填充一并回退(留 gap——客户端若开主轨磁吸请注意与配音错位的风险)":""},候选轨照常。`),{next:X0,summary:GZ,warnings:CZ}=y5({gtrk:y8,plan:Q,lay:Y,fills:E,downloads:wZ,covers:cZ,injectedMaterials:RZ.injected,sourceLayer:W.sourceLayer,generatedAt:new Date().toISOString(),planPath:"split/broll-plan.json",blackBed:!1,forceRelay:X})}}let m8=U6(X0,"broll",V);u8(G,m8,L8);let K8=B1({gtrk:m8,gtrkDir:e,log:j}),k8=GZ.blackTrack!==null?` · 纯黑底垫轨 track_index ${GZ.blackTrack}`:GZ.blackBedSkipped==="audio_driven"?" · 黑底垫轨跳过(音频驱动工程无口播保留轨,无遮挡对象——2026-08-21 拍板)":z?" · 未铺纯黑底垫轨":" · 纯黑底垫轨已关闭(--no-black-bed)",e0=`剥离 ${GZ.removedTracks.length} 条旧自产轨`+(GZ.removedTracks.length?`(track_index ${GZ.removedTracks.join("/")})`:"")+(X?"(含 --force-relay 强剥的已编辑轨)":"")+" · ",k0=GZ.keptEditedTracks.length?` · 保留 ${GZ.keptEditedTracks.length} 条已被你编辑的轨(track_index ${GZ.keptEditedTracks.join("/")},本次未剥,因由见下方告警)`:"",Z9=RZ.hasImage?` · 图片运镜 生成 ${RZ.billing.generated} / 复用 ${RZ.billing.reused}${RZ.failures.length?` / 静态兜底 ${RZ.failures.length}`:""}`:"";if(j.ok(`铺轨完成:${e0}${GZ.laidTracks.length} 条候选轨(track_index ${GZ.laidTracks.join("/")||"-"})· 平铺 ${GZ.laidClips} 个颗粒 / ${y.size} 个 clip`+`(代理 ${DZ.preview} · 原片回落 ${DZ.raw} · 复用 ${DZ.reused}${DZ.local?` · 本地直引 ${DZ.local}`:""}${DZ.failed?` · 失败 ${DZ.failed}`:""}${Z9})${k8}${k0}`),j.info("opencut 打开工程即见候选轨:轨道头小眼睛可开关对比;确认下载原片属挑选 UI(E-P1)。"),GZ.gapFill){let i=GZ.gapFill,t={candidate:0,extend:0,solid:0};for(let _Z of i.fills)t[_Z.kind]++;j.info(i.fills.length?`主轨 gap 填充(${i.mode}):${i.fills.length} 处共 ${i.filledSec}s(候选 ${t.candidate} · 延长 ${t.extend} · 黑片 ${t.solid})——主轨零 gap,客户端主轨磁吸安全`:`主轨 gap 填充(${i.mode})已开启:本轮无洞可填(主轨本就零 gap)`)}for(let i of CZ)j.warn(i);if(DZ.raw>0)j.warn("部分候选无 preview 代理已回落原片(体积较大)——服务端 backfill 后重跑本命令可换回代理。");if(K8)j1(K8,j);return{lay:{refused:!1,sourceLayer:GZ.sourceLayer,dedup:{scope:W.dedupScope??"scene",emptySlots:f.emptySlots,emptySlotsByRefine:f.emptySlotsByRefine,hotSlotsPlaced:f.hotSlotsPlaced,blurrySlotsPlaced:f.blurrySlotsPlaced,adjacentWaived:f.adjacentWaived},...c?{mark_weight:W.markWeight,mark_hit:w.hit,mark_neutral:w.neutral}:{},...g?{highlight_weight:W.highlightWeight,highlight_hit:w.hlHit,highlight_neutral:w.hlNeutral}:{},...S.requested.length?{pinned:{requested:S.requested.length,placedSlots:f.pinnedPlaced,yielded:S.yielded}}:{},...m?{cut_align:{target:m.target,starts_total:m.starts_total,aligned:m.aligned,ratio:m.ratio}}:{},...x.length?{anchors:{planned:x.filter((i)=>i.status==="planned").length,pinned:x.filter((i)=>i.status==="pinned").length,degraded:x.filter((i)=>i.status==="degraded").length},anchor_details:x.map((i)=>({beat:i.beat,keyword:i.keyword,at_sec:i.at_sec,track_st:i.track_st,clip_id:i.clip_id,status:i.status,...i.reason?{reason:i.reason}:{}}))}:{},laidTracks:GZ.laidTracks,laidClips:GZ.laidClips,removedTracks:GZ.removedTracks,keptEditedTracks:GZ.keptEditedTracks,blackTrack:GZ.blackTrack,...GZ.blackBedSkipped?{blackBedSkipped:GZ.blackBedSkipped}:{},...GZ.gapFill?{gap_fill:{mode:GZ.gapFill.mode,filled_sec:GZ.gapFill.filledSec,fills:GZ.gapFill.fills}}:{},blackBedHoleSec:GZ.blackBedHoleSec,blackBedHoles:GZ.blackBedHoles,downloads:DZ,...RZ.hasImage?{image_move_failures:RZ.failures}:{}},...K8?{integrity:K8}:{},...RZ.hasImage?{imageBilling:RZ.billing}:{}}}async function P4(Z,Q,Y={}){let J=async(X)=>{try{let V=await fetch(X,{signal:AbortSignal.timeout(180000)});if(!V.ok)return null;return Buffer.from(await V.arrayBuffer())}catch{return null}},z=wJ(Z);if(z){let X=await J(z);if(X)return await r0(Q,X),"preview"}if(Y.previewOnly)return null;if(typeof Z.url==="string"&&Z.url){let X=await J(Z.url);if(X)return await r0(Q,X),j.warn(`clip ${Z.clip_id} 无 preview 代理,已回落原片(${(X.length/1048576).toFixed(1)}MB)`),"raw"}return j.warn(`clip ${Z.clip_id} 代理与原片均下载失败,该候选槽位跳过`),null}async function L4(Z,Q,Y){j.step(`▶ ad-hoc 检索「${Z}」(${Q.memberType==="local"?"本地索引":`${Q.memberType} 口`})…`);let J=await Q.search(Z),z=J.results??[];j.ok(`${z.length} 条候选(召回 ${J.recalled??"?"})`);let X=Q.memberType==="local"?void 0:J2(Q.memberType,z.length,Y.topK?Number(Y.topK):e7),V={ok:!0,mode:"search",memberType:Q.memberType,...Q.columnId?{columnId:Q.columnId}:{},results:z,counts:{beats:0,queries:1,results:z.length,errors:0},...X?{upsell:X}:{}};if(Y.out){let W=Y0(Y.out);await r0(W,JSON.stringify({query:Z,recalled:J.recalled,results:z},null,2)),j.ok(`结果已落盘:${W}`),V.outPath=W}else if(!Y.json)for(let W of z.slice(0,10)){let K=W.segments?.[0],G=W.local_path?` · ${W.local_path}`:"";j.info(`clip ${W.clip_id} · score ${W.score}${K?` · 最佳段 ${K.start}s–${K.end}s(锚点 ${K.best}s)`:""}${G}${W.note?` · ${String(W.note).slice(0,40)}`:""}`)}if(X&&!Y.json)j.warn(X.message);if(Y.json)console.log(JSON.stringify(V));return V}function $P(Z,Q,Y){let J=typeof Z.title==="string"&&Z.title?Z.title:typeof Z.note==="string"&&Z.note?Z.note.slice(0,40):String(Z.id),z=[`${Q+1}. ${J}`];if(typeof Z.author==="string"&&Z.author)z.push(String(Z.author));if(typeof Z.duration==="number")z.push(`${Math.round(Z.duration)}s`);if(Z.audio_type)z.push(Z.audio_type==="song"?"song(歌曲)":Z.audio_type==="pure"?"pure(纯音乐)":String(Z.audio_type));if(typeof Z.score==="number")z.push(`score ${Z.score}`);if(typeof Z.is_copyright==="boolean")z.push(Z.is_copyright?"可商用":"非商用");if(typeof Z.material_class==="string")z.push(Z.material_class);let X=[`${z.join(" · ")}(id ${Z.id})`];if(typeof Z.download_url==="string"&&Z.download_url)X.push(` ${Y==="audio"?"试听/下载":"下载"}:${Z.download_url}`);if(typeof Z.accompaniment_url==="string"&&Z.accompaniment_url)X.push(` 伴奏直链(off-vocal,song 类现成):${Z.accompaniment_url}`);if(Array.isArray(Z.tags)&&Z.tags.length)X.push(` 标签:${Z.tags.slice(0,8).join(" / ")}`);return X}async function HP(Z,Q,Y){let J=Z4(Y.scope),z=Q4(Y.topK),X=Y4(Y.minDuration,Y.maxDuration);j.step("▶ 身份探针(matrix_member_type)…");let V=await Z2(Q),W=eW(V);if(j.info(`档位:${V}(${V==="internal"?"矩阵成员口":"通用口"} ${W})· 计费 ${Y2[V]}${V==="internal"?"(搜全库,含非商用/概念素材)":"(服务端固定只含可商用实拍素材)"}`),Y.commercialOnly&&V==="external")j.warn("--commercial-only 在公开口无区别:公开口本就只含可商用素材(服务端固定 is_copyright=true),该参数未随请求发出");if(V==="external"&&(X.min!==void 0||X.max!==void 0))j.warn("公开口入参不含时长过滤(服务端只收 scope/query/top_k/diversity)——--min-duration/--max-duration 改由 CLI 按结果 duration 本地过滤后再出参");let K=J4(V,{scope:J,query:Z,topK:z,diversity:Y.diversity===!0,commercialOnly:Y.commercialOnly===!0,...X.min!==void 0?{minDuration:X.min}:{},...X.max!==void 0?{maxDuration:X.max}:{}}),G=X.min!==void 0||X.max!==void 0?` · 时长 ${X.min??0}s–${X.max!==void 0?`${X.max}s`:"不限"}`:"";j.step(`▶ 通用素材检索「${Z}」(scope=${J} · top_k=${z}${G}${Y.commercialOnly?" · 仅可商用":""})…`);let $=await X4(Q,V,K),H=V==="external"?z4($.results,X):$.results,N=H;if(J==="audio"&&Y.excludeRecent!==!1){let M=typeof Y.excludeRecent==="string"?Number(Y.excludeRecent):_Q,F=Number.isFinite(M)&&M>=0?M:_Q,R=j4(H,B4(F));if(N=R.kept,R.skipped>0)j.info(`选曲新鲜度:已避让近期用过的 ${R.skipped} 首(窗口 ${F} 条;--no-exclude-recent 可关)`);if(R.exhausted)j.warn("选曲新鲜度:本次候选全部是近期用过的曲子——已按原结果返回(避免空手)。建议换检索词或缩小窗口(--exclude-recent <n>)")}j.ok(`${N.length} 条候选${typeof $.total==="number"&&$.total!==N.length?`(服务端返回 ${$.total})`:""}`);let U=J2(V,N.length,z),q={ok:!0,mode:"material",memberType:V,endpoint:W,scope:J,query:Z,top_k:z,billing:Y2[V],results:N,counts:{results:N.length},...$.task_id?{task_id:$.task_id}:{},...U?{upsell:U}:{}};if(Y.out){let M=Y0(Y.out);await r0(M,JSON.stringify({query:Z,scope:J,top_k:z,member_type:V,results:N,...U?{upsell:U}:{}},null,2)),j.ok(`结果已落盘:${M}`),q.outPath=M}else if(!Y.json)for(let[M,F]of N.entries())for(let R of $P(F,M,J))j.info(R);if(U)j.warn(U.message);if(Y.json)console.log(JSON.stringify(q));return q}function qP(Z){return Z.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"")||"project"}import{resolve as AQ,join as v0,dirname as G2,basename as u4}from"node:path";import{existsSync as A1}from"node:fs";import{readFile as $2,mkdir as MP,copyFile as RP}from"node:fs/promises";var UP=(Z)=>Z.startsWith("mg-")||Z.startsWith("rrv-"),NP=["assets/mg/","assets/rrv/"],BP=(Z)=>Z.replace(/\\/g,"/").replace(/^\.\//,"");function jP(Z){if(typeof Z!=="string")return;let Q=BP(Z);for(let Y of NP){if(!Q.startsWith(Y))continue;let J=Q.slice(Y.length);if(J.includes("/"))return;return J.replace(/\.html?$/i,"")}return}var h4=(Z)=>Math.round(Z*1000)/1000,b4=(Z)=>h4(Z.track_ed-Z.track_st);function w4(Z){return Array.isArray(Z?.lay_tracks)?Z.lay_tracks.filter((Q)=>typeof Q==="number"):[]}function T1(Z){return Array.isArray(Z?.beats)?Z.beats.filter((Q)=>!!Q&&typeof Q.composition_id==="string"):[]}function y4(Z){let Q=Z.html_material;if(typeof Q==="string"){if(Q.startsWith("mg-"))return Q.slice(3);if(Q.startsWith("rrv-"))return Q.slice(4)}if(typeof Z.material==="string")return Z.material;return typeof Z.clip_id==="string"?Z.clip_id:void 0}var x4=(Z)=>typeof Z.track_st==="number"?Z.track_st:0;function k4(Z,Q){for(let Y of["material","html_material"]){let J=Z[Y];if(typeof J==="string")Q.add(J)}}function FP(Z,Q){let Y=new Set;for(let J of Object.values(Z)){if(!Array.isArray(J))continue;for(let z of J){if(!z||!Array.isArray(z.track_timeline))continue;for(let X of z.track_timeline)k4(X,Y)}}for(let J of Q)k4(J,Y);return Y}function g4(Z){let{gtrk:Q,items:Y,generatedAt:J}=Z,z=[...Q.beat_track??[]],X=[...Q.materials??[]],V={...Q.struct_meta??{}},W=V.mg,K=V.rrv,G=new Set([...w4(W),...w4(K)]),$=z.filter((c)=>typeof c.track_index==="number"&&G.has(c.track_index)),H=z.filter((c)=>!(typeof c.track_index==="number"&&G.has(c.track_index))),N=new Set([...T1(W).map((c)=>c.composition_id),...T1(K).map((c)=>c.composition_id),...Y.map((c)=>c.composition_id)]);for(let c of $)for(let g of c.track_timeline??[]){let k=y4(g);if(k!==void 0)N.add(k)}let U=(c)=>{if(typeof c.id==="string"&&UP(c.id))return!0;let g=jP(c.path);return g!==void 0&&N.has(g)},q=new Set(Y.map((c)=>c.composition_id)),M=new Set((Z.keep??[]).filter((c)=>!q.has(c))),F=[],R=new Set;for(let c of $)for(let g of c.track_timeline??[]){let k=y4(g);if(k===void 0||!M.has(k)||R.has(k))continue;R.add(k),F.push({...g})}let O=[],P=[],D=[],T=[...H,...Q.video_track??[],...Q.audio_track??[]].map((c)=>typeof c.track_index==="number"?c.track_index:0),_=Math.max(9,...T)+1;for(let c of Y){let g=b4(c);if(!(g>0)){D.push({...f4(c),laid:null});continue}let k=`mg-${c.composition_id}`;O.push({id:k,path:c.html_rel}),P.push({clip_id:c.composition_id,material:c.composition_id,html_material:k,opaque:c.opaque,track_st:c.track_st,duration:g}),D.push({...f4(c),laid:{track_index:_}})}let L=[...F,...P].sort((c,g)=>x4(c)-x4(g)),I=L.length>0?[{track_index:_,track_timeline:L}]:[],E=FP({...Q,beat_track:H},F),y=new Set(O.map((c)=>String(c.id))),f=X.filter((c)=>{if(typeof c.id!=="string")return!0;if(y.has(c.id))return!1;if(!U(c))return!0;return E.has(c.id)}),S=[],w=new Set;for(let c of[...T1(W),...T1(K)]){if(!M.has(c.composition_id)||w.has(c.composition_id))continue;w.add(c.composition_id),S.push({...c,laid:R.has(c.composition_id)?{track_index:_}:null})}let x={contract_version:"v1",generated_at:J,lay_tracks:I.map((c)=>c.track_index),beats:[...S,...D]},m={...V,mg:x};return delete m.rrv,{next:{...Q,materials:[...f,...O],beat_track:[...H,...I],struct_meta:m},summary:{laidTrack:I[0]?.track_index??null,laidParticles:P.length,keptParticles:F.length},mg:x}}function f4(Z){return{beat:Z.beat,composition_id:Z.composition_id,track_st:Z.track_st,track_ed:h4(Z.track_ed),duration:b4(Z),html_path:Z.html_rel,...Z.category?{category:Z.category}:{}}}var m4="assets/mg",c4=["mg","rrv"];function l4(Z){Z.command("mg [words...]").alias("rrv").description("MG 颗粒铺轨:无 positional=消费 dispatch.mg 铺 html-particle;`mg lint <file>`=单文件 lint;`mg status`=看板;`mg render <file> --duration <sec>`=独立颗粒云渲 qtrle 透明 MOV(精剪补给口)").option("--project <dir>","oralcut 产物目录(定位 split/dispatch.json 与工程)").option("--dispatch <path>","显式指定 dispatch.json(非标准布局兜底)").option("--only <beat>","只跑单 beat(收 beat id 如 B12,非 composition_id):增量重铺该 beat,轨上其余已铺颗粒原样保留").option("--lint-only","只 lint 校验,不铺轨不写回").option("--replace-all","显式授权重置整轨:不走增量保留、整轨剥掉重铺——会删掉轨上其余已铺颗粒(不在本次派单/--only 里的那些)").option("--duration <sec>","render 模式必填:显式时长锚(秒)——独立模式无坑位包络,它就是 lint 包络与计费时长").option("--format <fmt>","render 模式产物格式:首发仅 qtrle(剪映可读透明 MOV;webm 剪映不吃、明确拒绝)").option("--out <dir>","render 模式落盘目录(缺省 ./mg-render/<composition_id>/;绝不写剪映草稿目录)").option("--yes","render 模式:跳过计费预估确认").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{if(process.argv[2]==="rrv")j.warn("`gtrk rrv` 已更名为 `gtrk mg`(去品牌化),别名仍可用但建议改用 `gtrk mg`。");await DP(Q??[],Y)})}async function DP(Z,Q){if(Q.json)NZ();let Y=Z[0];if(Y==="lint")return CP(Z.slice(1),Q);if(Y==="status")return _P(Q);if(Y==="render")return LP(Z.slice(1),Q);if(Y)throw Error(`未知子命令「${Y}」——铺轨:gtrk mg --project <dir>;lint:gtrk mg lint <file>;看板:gtrk mg status;独立渲染:gtrk mg render <file> --duration <sec>`);return PP(Q)}function d4(Z){if(Z.dispatch){let Q=AQ(Z.dispatch);return{dispatchPath:Q,baseDir:G2(G2(Q))}}if(Z.project){let Q=AQ(Z.project);return{dispatchPath:v0(Q,"split","dispatch.json"),baseDir:Q}}throw Error("需 --project <目录> 或显式 --dispatch <path>")}function n4(Z){return[v0(Z,"gtrk","project.gtrk"),v0(Z,"project.gtrk")].find((Q)=>A1(Q))}function p4(Z,Q){for(let Y of c4){let J=v0(Z,Y,`${Q}.html`);if(A1(J))return J}return}async function H2(Z){if(!A1(Z))throw Error(`找不到派单清单:${Z}(先跑 gtrk split 落地派单)`);let Q=JSON.parse(await $2(Z,"utf8")),Y=Q.mg??Q.rrv_mg;return Array.isArray(Y)?Y:[]}function OP(Z){if(!Z)return[];let Q=Z.struct_meta,Y=[],J=new Set;for(let z of[Q?.mg,Q?.rrv])for(let X of z?.beats??[]){if(!X?.laid||typeof X.composition_id!=="string"||J.has(X.composition_id))continue;J.add(X.composition_id),Y.push(X.composition_id)}return Y}async function PP(Z){let{dispatchPath:Q,baseDir:Y}=d4(Z),J=await H2(Q),z=Z.only?J.filter((k)=>k.beat===Z.only):J;if(j.step(`▶ MG 颗粒铺轨:${z.length} 个 beat…`),Z.only&&z.length===0){let k=[...new Set(J.map((l)=>l.beat))];j.warn(`--only ${Z.only} 未命中任何 beat——该选择器收的是「beat id」(如 B12),不是 composition_id(如 <slug>-B12)。`),j.warn(`dispatch 现有 beat:${k.slice(0,12).join("、")||"(空)"}${k.length>12?` …共 ${k.length} 个`:""}`)}let X=n4(Y),V,W=!1;if(X)try{V=dZ(X)}catch(k){if(!Z.lintOnly)throw k;W=!0}if(!Z.lintOnly&&V)W8(V.gtrk);let K=OP(Z.lintOnly?void 0:V?.gtrk),G=await s9({baseDir:Y,gtrk:V?.gtrk,gtrkUnreadable:W,entries:z.map((k)=>({key:k.composition_id,beat:k.beat,compositionId:k.composition_id,span:k.span,track_st:k.track_st,track_ed:k.track_ed}))});t9(G);let $=z.map((k)=>k.composition_id),H=[],N=new Map,U=[],q=new Map(G.entries.map((k)=>[k.key,k]));for(let k of z){let l=q.get(k.composition_id);if(l?.dropped){U.push({beat:k.beat,reason:"重投影后零存活(该段已被剪出成片)"});continue}let e=l??{track_st:k.track_st,track_ed:k.track_ed},WZ=p4(Y,k.composition_id);if(!WZ){U.push({beat:k.beat,reason:"缺颗粒 HTML(未产出)"}),j.warn(`${k.beat}:缺 ${v0(Y,c4[0],`${k.composition_id}.html`)},跳过`);continue}let vZ=await $2(WZ,"utf8"),LZ=typeof k.category==="string"?k.category:void 0,RZ=Math.round((e.track_ed-e.track_st)*1000)/1000,cZ=LQ(vZ,{compositionId:k.composition_id,dispatchIds:$,category:LZ,...RZ>0?{slotDuration:RZ}:{}});for(let bZ of cZ.violations)(bZ.fatal?j.warn:j.info)(`${k.beat} lint ${bZ.fatal?"✗":"·"} ${bZ.law}: ${bZ.msg}`);if(!cZ.ok){U.push({beat:k.beat,reason:"lint 未过"}),j.warn(`${k.beat}:lint 未过,跳过`);continue}if(!(RZ>0)){U.push({beat:k.beat,reason:"槽位包络非正数"});continue}N.set(k.composition_id,WZ),H.push({beat:k.beat,composition_id:k.composition_id,track_st:e.track_st,track_ed:e.track_ed,opaque:cZ.opaque,html_rel:`${m4}/${k.composition_id}.html`,...LZ?{category:LZ}:{}})}if(Z.lintOnly){let k=U.length===0;return(k?j.ok:j.warn)(`lint-only:${H.length}/${z.length} 通过,${U.length} 跳过(不铺轨)`),g9(Z,{ok:k,mode:"lay",lintOnly:!0,...k?{}:{reason:"skipped"},passed:H.length,skipped:U,reprojection:G.summary})}if(!X||!V)return j.warn(`未找到工程文件(${v0(Y,"gtrk","project.gtrk")}),跳过铺轨——lint 已完成`),g9(Z,{ok:U.length===0,mode:"lay",reason:"no_project",laid:0,laidTrack:null,track_total:0,removed:0,kept:0,kept_ids:[],skipped:U,note:"工程缺失,未铺轨",reprojection:G.summary});let{gtrk:M,revision:F}=V,R=G2(X),O=new Set(H.map((k)=>k.composition_id)),P=K.filter((k)=>!O.has(k)),D=new Set(J.map((k)=>k.composition_id)),T=Z.replaceAll?[]:Z.only?P:P.filter((k)=>D.has(k)),_=new Set(T),L=K.filter((k)=>!O.has(k)&&!_.has(k)),I=K.length>0&&H.length===0?"empty_queue":void 0;if(I&&!Z.replaceAll){if(j.err(`拒绝写回:本次一条颗粒都没定位到,而轨上已铺 ${K.length} 颗——「一条都没定位到」是派单/选择器出问题的信号,不是清空指令。`),Z.only&&z.length===0)j.warn(`成因:--only ${Z.only} 未命中任何 beat(选择器提示见上)。`);else if(J.length===0)j.warn("dispatch.mg(读旧 rrv_mg)为空或缺失——先跑 gtrk split 落地派单,再铺轨。");else j.warn(`本次 ${z.length} 个条目全部被跳过(${[...new Set(U.map((k)=>k.reason))].join("、")})——先按上面的 lint 报因补产 / 修颗粒,再重铺。`);if(L.length){let k=L.slice(0,8);j.warn(`将被铲掉:${k.join("、")}${L.length>k.length?` …等共 ${L.length} 颗`:""}`)}return j.warn("出路二选一:① 按上面的报因修好派单 / 选择器 / 颗粒后重铺;② 确知要清空整轨 → 加 --replace-all 显式授权(会删掉轨上全部已铺颗粒)"),j.warn(`工程未被改动(.gtrk 逐字节不变,轨上仍 ${K.length} 颗)。`),g9(Z,{ok:!1,mode:"lay",reason:I,refused:!0,laid:0,laidTrack:null,track_total:K.length,removed:0,kept:0,kept_ids:[],blocked:L,skipped:U,reprojection:G.summary})}if(Z.replaceAll&&P.length>0)j.warn(`--replace-all:已显式授权重置整轨,轨上其余 ${P.length} 颗已铺颗粒将被剥离(不走增量保留)。`);await MP(v0(R,...m4.split("/")),{recursive:!0});for(let k of H)await RP(N.get(k.composition_id),v0(R,...k.html_rel.split("/")));let{next:E,summary:y,mg:f}=g4({gtrk:M,items:H,generatedAt:new Date().toISOString(),keep:T}),S=U6(E,"mg",G);u8(X,S,F);let w=B1({gtrk:S,gtrkDir:R,log:j}),x=f.beats.filter((k)=>k.laid).length,m=f.beats.filter((k)=>k.laid&&_.has(k.composition_id)).map((k)=>k.composition_id),r=K.length-m.length,c=U.length===0,g=`本次 ${y.laidParticles} 颗 / 轨上共 ${x} 颗${m.length?`(保留 ${m.length} 颗)`:""}`+` → beat_track ${y.laidTrack??"-"}${r?`(剥旧 ${r} 颗)`:""}${U.length?`(${U.length} beat 跳过)`:""}`;if(y.laidTrack===null)j.warn(`未铺成任何颗粒:${g}`);else if(c)j.ok(`铺轨完成:${g}`);else j.warn(`铺轨完成(有跳过):${g}`);if(m.length){let k=m.slice(0,8);j.warn(`其中 ${m.length} 颗是上轮遗留、本次未重铺:${k.join("、")}${m.length>k.length?` …等共 ${m.length} 颗`:""}`+`——轨上内容 = 本次 ${y.laidParticles} 颗 + 上轮 ${m.length} 颗,与本次派单不完全对应(要全部刷新就去掉 --only 全量重铺)。`)}if(j.info("opencut 打开工程即见 MG overlay 轨(预览需 add-particle-project-folder-preview 上线);出片时客户端云渲。"),w)j1(w,j);return g9(Z,{ok:c,mode:"lay",...c?{}:{reason:"skipped"},laid:y.laidParticles,laidTrack:y.laidTrack,track_total:x,removed:r,kept:m.length,kept_ids:m,skipped:U,...w?{integrity:w}:{},reprojection:G.summary})}async function LP(Z,Q){let Y=Z[0];if(!Y)throw Error("用法:gtrk mg render <particle.html> --duration <sec> [--format qtrle] [--out <dir>] [--yes]");let J=Number(Q.duration),z=await xW({file:Y,duration:J,...Q.format?{format:Q.format}:{},...Q.out?{out:Q.out}:{},...Q.yes?{yes:!0}:{}});return g9(Q,z)}async function CP(Z,Q){let Y=Z[0];if(!Y)throw Error("用法:gtrk mg lint <particle.html> [--dispatch <path>]");let J=await $2(AQ(Y),"utf8"),z=u4(Y).replace(/\.html?$/i,""),X,V,W;if(Q.dispatch&&A1(AQ(Q.dispatch))){let $=await H2(AQ(Q.dispatch));X=$.map((q)=>q.composition_id);let H=$.find((q)=>q.composition_id===z),N=q1(J),U=H??(N?$.find((q)=>q.composition_id===N):void 0);if(U){let q=Math.round((U.track_ed-U.track_st)*1000)/1000;if(q>0)V=q}if(H)W=H.composition_id}if(W===void 0&&a7.test(z))W=z;let K=LQ(J,{...X?{dispatchIds:X}:{},...W?{compositionId:W}:{},...V?{slotDuration:V}:{}});for(let $ of K.violations)($.fatal?j.err:j.warn)(`${$.fatal?"✗":"·"} ${$.law}: ${$.msg}`);if(K.ok)j.ok(`lint 通过(${u4(Y)};opaque=${K.opaque})`);else j.err(`lint 未过(${K.violations.filter(($)=>$.fatal).length} 项致命)`);let G={mode:"lint",...K,ok:K.ok};if(Q.json)console.log(JSON.stringify(G));if(!K.ok)process.exitCode=1;return G}async function _P(Z){let{dispatchPath:Q,baseDir:Y}=d4(Z),J=await H2(Q),z=n4(Y),X=new Set;if(z){let{gtrk:G}=dZ(z),$=G.struct_meta,H=$?.mg??$?.rrv;X=new Set((H?.beats??[]).filter((N)=>N.laid).map((N)=>N.composition_id))}let V=J.map((G)=>{let $=p4(Y,G.composition_id)!==void 0,H=X.has(G.composition_id);return{beat:G.beat,composition_id:G.composition_id,authored:$,laid:H,state:H?"已铺":$?"已产未铺":"缺 HTML"}}),W=V.filter((G)=>G.authored).length,K=V.filter((G)=>G.laid).length;j.step(`▶ MG 看板:${J.length} beat · ${W} 已产 · ${K} 已铺`);for(let G of V)j.info(`${G.beat}(${G.composition_id})→ ${G.state}`);return g9(Z,{ok:!0,mode:"status",total:J.length,authored:W,laid:K,rows:V})}function g9(Z,Q){if(!Q.ok)process.exitCode=1;if(Z.json)console.log(JSON.stringify(Q));return Q}import{mkdir as GL,writeFile as DV}from"node:fs/promises";import{existsSync as $L,statSync as HL}from"node:fs";import{resolve as P2,join as L2}from"node:path";function s(Z,Q=0){return typeof Z==="number"&&isFinite(Z)?Z:Q}function i4(Z){if(!Z||typeof Z!=="string")return null;let Q=Z.match(/cubic-bezier\(\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*\)/);if(!Q)return null;let Y=Q.slice(1,5).map(Number);return Y.every((J)=>isFinite(J))?Y:null}function o4(Z,Q=90){if(!Z)return Q;let Y=Z.match(/([\d.]+)px/);return Y?Math.max(1,parseFloat(Y[1])):Q}function r4(Z){if(!Z||typeof Z!=="string")return null;let Q=Z.trim(),Y=Q.match(/^#([0-9a-fA-F]{3})$/);if(Y){let J=Y[1];return[parseInt(J[0]+J[0],16),parseInt(J[1]+J[1],16),parseInt(J[2]+J[2],16),1]}if(Y=Q.match(/^#([0-9a-fA-F]{6})([0-9a-fA-F]{2})?$/),Y){let J=Y[1],z=Y[2]?parseInt(Y[2],16)/255:1;return[parseInt(J.slice(0,2),16),parseInt(J.slice(2,4),16),parseInt(J.slice(4,6),16),z]}if(Y=Q.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/),Y)return[Math.min(255,parseFloat(Y[1])),Math.min(255,parseFloat(Y[2])),Math.min(255,parseFloat(Y[3])),Y[4]!==void 0?Math.min(1,parseFloat(Y[4])):1];return null}function E1(Z,Q,Y,J){let z=(W,K,G)=>{if(!W||W.length===0)return G;if(K<=W[0].t)return s(W[0].v,G);for(let $=1;$<W.length;$++)if(K<=W[$].t){let H=W[$-1],N=W[$],U=N.t-H.t;if(U<=0)return s(N.v,G);let q=(K-H.t)/U;return s(H.v,G)+(s(N.v,G)-s(H.v,G))*q}return s(W[W.length-1].v,G)},X=new Set;for(let W of Z??[])X.add(W.t);for(let W of Q??[])X.add(W.t);return[...X].sort((W,K)=>W-K).map((W)=>{let K=(Z??[]).find(($)=>$.t===W)?.e,G=(Q??[]).find(($)=>$.t===W)?.e;return{t:W,a:z(Z,W,Y),b:z(Q,W,J),e:K??G??null}})}var IQ=new Set(["shake","pulsate","oscillate","flicker","zoom"]);function sZ(Z,Q,Y){if(!Z||Z.length===0)return Y;if(Q<=Z[0].t)return s(Z[0].v,Y);for(let J=1;J<Z.length;J++){let z=Z[J-1],X=Z[J];if(Q<=X.t){let V=Math.max(X.t-z.t,0.000001),W=(Q-z.t)/V;return s(z.v,Y)+(s(X.v,Y)-s(z.v,Y))*W}}return s(Z[Z.length-1].v,Y)}function TP(Z){return[Math.sin(Z*2.399),Math.cos(Z*3.11)]}var jZ=(Z,Q)=>{let Y=10**Q;return Math.round(Z*Y)/Y},a0=(Z,Q,Y)=>Math.min(Y,Math.max(Q,Z)),EQ=(Z)=>Math.max(2,Math.floor(Z));function q2(Z,Q,Y){return[sZ(Z.x,Y,Q[0]),sZ(Z.y,Y,Q[1])]}function U2(Z,Q){if(Z.scale?.length){let Y=sZ(Z.scale,Q,1);return[Y,Y]}if(Z.sx?.length||Z.sy?.length)return[sZ(Z.sx,Q,1),sZ(Z.sy,Q,1)];return[1,1]}function a4(Z,Q){return sZ(Z.rot,Q,0)}function AP(Z,Q){let Y=s(Z.t0,s(Q.in,0)),J=s(Z.t1,s(Q.out,Y+1));return[Y,J]}function N2(Z){let Q=Z.anim??{},Y=[s(Z.pos?.[0],0),s(Z.pos?.[1],0)],J=[],z=[];for(let X of Z.fx??[]){let V=X.op;if(!IQ.has(V))continue;if(V==="zoom"){let G=X.tracks?.scale;if(!G||G.length<1){z.push(`bake: zoom 无 scale 参数轨,跳过(layer ${Z.id})`);continue}let $=[],H=[];for(let U of G){let q=s(U.t,0),M=s(U.v,1),[F,R]=U2(Q,q);$.push(jZ(q,3)),H.push([jZ(F*M*100,3),jZ(R*M*100,3)])}let N=[$[0],$[$.length-1]];J.push({prop:"scale",times:$,values:H,window:N,ease:"power2.out"});continue}let[W,K]=AP(X,Z);if(V==="flicker"){if(K-W<0.05)continue;let G=s(X.freq,8);G=a0(G>=0.5?G:G*30,0.5,20);let $=a0(s(X.mag,0.6),0.05,1),H=1+$*0.8,N=Math.max(0.3,1-$*0.6),U=Math.min(EQ(Math.max(2,Math.floor((K-W)*G*2))),160),q=[jZ(W,3)],M=[[0]];for(let F=1;F<=U;F++){let R=W+(K-W)*F/U,O=F%2?H:N,P=a0((O-1)*100,-100,100);q.push(jZ(R,3)),M.push([jZ(P,3)])}J.push({prop:"brightness",times:q,values:M,window:[W,K]});continue}if(K-W<0.05)continue;if(V==="shake"){let G=s(X.mag??X.amp,18),$=a0(s(X.freq,20),1,40),H=Math.min(EQ(Math.max(2,Math.floor((K-W)*$))),160),N=X.tracks?.mag,U=[],q=[],M=[];for(let D=0;D<=H;D++){let T=W+(K-W)*D/H,_=sZ(N,T,G);if(X.decay)_*=1-D/H;let[L,I]=TP(D);U.push(jZ(_*L,1)),q.push(jZ(_*I,1)),M.push(jZ(T,3))}let F=U[0],R=q[0],O=[],P=[];for(let D=0;D<=H;D++){let[T,_]=q2(Q,Y,M[D]);O.push(M[D]),P.push([jZ(T+(U[D]-F),3),jZ(_+(q[D]-R),3)])}J.push({prop:"position",times:O,values:P,window:[W,K]});continue}if(V==="oscillate"){if(X.rot===!0){let G=s(X.a1,-3),$=s(X.a2,3),H=a0(s(X.freq,2),0.2,20),N=Math.min(EQ(Math.max(4,Math.floor((K-W)*H*4))),120),U=[jZ(W,3)],q=[[jZ(a4(Q,W),3)]],M=0,F=0;for(let R=1;R<=N;R++){let O=W+(K-W)*R/N,P=Math.sin(2*Math.PI*H*(O-W)),D=(G+$)/2+($-G)/2*P;F+=jZ(D-M,2),M=D,U.push(jZ(O,3)),q.push([jZ(a4(Q,O)+F,3)])}J.push({prop:"rotation",times:U,values:q,window:[W,K]})}else{let G=s(X.mag,40),$=s(X.angle,90)*Math.PI/180,H=a0(s(X.freq,4),0.2,30),N=Math.min(EQ(Math.max(4,Math.floor((K-W)*H*4))),160),U=X.tracks?.mag,q=[jZ(W,3)],[M,F]=q2(Q,Y,W),R=[[jZ(M,3),jZ(F,3)]],O=0,P=0,D=0,T=0;for(let _=1;_<=N;_++){let L=W+(K-W)*_/N,I=sZ(U,L,G),E=Math.sin(2*Math.PI*H*(L-W)),y=I*E*Math.cos($),f=I*E*Math.sin($);D+=jZ(y-O,2),T+=jZ(f-P,2),O=y,P=f;let[S,w]=q2(Q,Y,L);q.push(jZ(L,3)),R.push([jZ(S+D,3),jZ(w+T,3)])}J.push({prop:"position",times:q,values:R,window:[W,K]})}continue}if(V==="pulsate"){let G,$;if(X.amp!=null)G=1-s(X.amp,0),$=1+s(X.amp,0);else G=s(X.min,1),$=s(X.max,1.06);let H=a0(s(X.freq,2),0.2,20),N=Math.min(EQ(Math.max(4,Math.floor((K-W)*H*4))),160),U=X.tracks?.max,q=[jZ(W,3)],[M,F]=U2(Q,W),R=[[jZ(M*100,3),jZ(F*100,3)]];for(let O=1;O<=N;O++){let P=W+(K-W)*O/N,D=sZ(U,P,$),T=(Math.sin(2*Math.PI*H*(P-W))+1)/2,_=jZ(G+(Math.max(D,G)-G)*T,3),[L,I]=U2(Q,P);q.push(jZ(P,3)),R.push([jZ(L*_*100,3),jZ(I*_*100,3)])}J.push({prop:"scale",times:q,values:R,window:[W,K]});continue}}return{tracks:J,warnings:z}}var EP=`// 由技法图鉴重建生成,仅供学习研究;素材为占位,请替换
|
|
233
|
+
`+"可用 --yes 跳过确认,或 --arrange-cost-cap 先设个上限再跑。"),{declined:!0,lay:{declined:!0,laidTracks:[],laidClips:0,removedTracks:[],keptEditedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[]}}}let T={info:(x)=>j.info(x),warn:(x)=>j.warn(x)},_=(x)=>YW(x,Y,J,D,O,{runLocal:()=>x5(x,Y,J,D),...V.arrangeEndpoint?{endpoint:V.arrangeEndpoint}:{},...V.arrangeCostCap!==void 0?{costCap:V.arrangeCostCap}:{},...C?{strictCloud:!0}:{},log:T}),P=await _(Q),E=[];if(V.arrangeQc){let x=await UO(Q,Z,W,_,P,V,T);P=x.res,Q=x.plan,E=x.residual}let{fills:I,clipIds:y,stats:h,pinnedOutcome:v,markStats:S,anchors:k,cutAlign:c,gapFills:a,direct:u}=P.outcome;if(P.source==="cloud")j.info(`本轮 B-roll 编排由云端产出(编排量 ${P.units??"?"})——本地复算自校验一致。`);{let x=(FZ,YZ)=>{for(let SZ of Q.beats)for(let rZ of SZ.queries)for(let vZ of rZ.results??[]){if(vZ.clip_id!==FZ)continue;for(let Z8 of vZ.segments??[])if(Z8.start<=YZ&&YZ<=Z8.end)return Z8.cuts}return},g=[];for(let[FZ,YZ]of I)for(let SZ of YZ[0]??[])g.push({beat:FZ,clipId:SZ.clip_id,cuts:x(SZ.clip_id,SZ.clip_st)});let t=WW(XW(g));if(t)j.warn(t)}if(c)j.info(`句界吸附:字幕句起点 ${c.starts_total} · 恰逢镜头切点 ${c.aligned}(实测 ${Math.round(c.ratio*100)}% · 目标 ${Math.round(c.target*100)}%——三成错开是拍板内的自然节奏,非缺陷)`);if(k.length){let x={planned:0,pinned:0,degraded:0};for(let g of k)if(x[g.status]++,g.status==="degraded")j.warn(`${g.beat} 锚「${g.keyword}」降级:${g.reason??"未知原因"}——该锚退化普通槽,区间照常序贯填充`);else j.info(`${g.beat} 锚「${g.keyword}」@ ${g.at_sec}s → clip ${g.clip_id} 钉 ${g.track_st}s(提前量 0.5s${g.status==="pinned"?" · 用户钉选候选占锚槽":""})`);j.info(`关键词锚:钉位 ${x.planned} · 用户钉选 ${x.pinned} · 降级 ${x.degraded}(共 ${k.length} 锚)`)}let l=(x)=>{switch(x.code){case"sliver":return"精修后短于最小可用镜头长——已按指令照落,成片上会是一个很短的镜头";case"overlap":return"指定的时间线位置与另一直排槽重叠(位置是硬约束,不做静默移位)";case"out_of_beat":return"指定的时间线位置越出 beat 窗口";case"no_room":return"beat 内已无足够空隙容纳该直排槽";case"beat_no_span":return"beat 窗口无长度";default:return"未知原因"}};if(u?.length){let x={planned:0,sliver:0,rejected:0};for(let g of u){if(x[g.status]++,g.status==="rejected"){j.warn(`${g.beat} 直排槽 clip ${g.clip_id} 未落位:${l(g)}——该段没有画面,MUST NOT 当成已铺`);continue}if(g.status==="sliver")j.warn(`${g.beat} 直排槽 clip ${g.clip_id}:${l(g)}`);if(g.fps===null)j.warn(`${g.beat} 直排槽 clip ${g.clip_id}:全 plan 都查不到这条素材的帧率,**帧网格吸附未生效**——`+"端点可能落在非整帧上,不同播放器/渲染器会各自取整。把这条素材过一遍索引即可消除。");if(typeof g.starved_sec==="number")j.warn(`${g.beat} 直排槽 clip ${g.clip_id}:源窗比你给的时间线窗短 ${g.starved_sec}s,`+"成片上这一段的最后一帧会静止这么久。要么把源窗给长一点,要么把时间线窗收短。");if(g.status==="planned"&&g.fps!==null){let t=g.cut_snap==="skipped_quote"?" · 引用段:按你的标注**不动端点**,端点残片保留":g.cut_snap==="no_data"?" · 无切点数据,仅帧网格吸附":"";j.info(`${g.beat} 直排槽 clip ${g.clip_id} 钉 ${g.track_st}s(精修${g.refined?"已生效":"未改动端点"}${t})`)}}j.info(`高档直排:落位 ${x.planned} · 过短照落 ${x.sliver} · 未落位 ${x.rejected}(共 ${u.length} 槽)`)}let f=typeof V.markWeight==="number"&&V.markWeight>0,n=typeof V.highlightWeight==="number"&&V.highlightWeight>0,QZ=(x,g)=>x+g>0?G2(x/(x+g)):void 0,zZ=f?QZ(S.hit,S.neutral):void 0,BZ=n?QZ(S.hlHit,S.hlNeutral):void 0,PZ=(x)=>`${Math.round(x*1000)/10}%`;if(f)j.info(`美观度权重(w=${V.markWeight}):mark 缓存命中 ${S.hit} 段 / 共 ${S.hit+S.neutral} 段`+`${zZ===void 0?"":`(覆盖率 ${PZ(zZ)})`}`);if(n)j.info(`看点权重(w=${V.highlightWeight}):highlight 缓存命中 ${S.hlHit} 段 / 共 ${S.hlHit+S.hlNeutral} 段`+`${BZ===void 0?"":`(覆盖率 ${PZ(BZ)})`}`);let oZ=[...f?[{name:"美观度",flag:`--mark-weight ${V.markWeight}`,cov:zZ}]:[],...n?[{name:"看点",flag:`--highlight-weight ${V.highlightWeight}`,cov:BZ}]:[]],mZ=oZ.filter((x)=>x.cov===0).map((x)=>`${x.name}(${x.flag})`),bZ=oZ.filter((x)=>x.cov!==void 0&&x.cov>0&&x.cov<hJ);if(mZ.length)j.warn(`${mZ.join(" 与 ")}权重开了但**本片零缓存覆盖**:全部候选按中性处理,排序与不开权重完全一致(权重已回吐给语义分)。`+"根因通常是本 plan 未经理解——先跑 gtrk matrix describe --plan <plan 路径> 再重跑 lay 才有效;"+"手写 plan(免索引直排)也走这条路,此时美观度/看点/模糊降权三条信号一并不生效");if(bZ.length)j.warn(`${bZ.map((x)=>`${x.name}(${x.flag})覆盖率仅 ${PZ(x.cov)}`).join(";")}`+"——只有这些候选段拿到了信号分,其余按中性处理,排序主要仍由语义分决定。"+"这一档通常**不是没 describe 过**,而是素材长、描述帧稀疏:一个素材往往只有一个时间点有描述行,"+"离它太远的段就近命中不上。要提高覆盖率得让描述帧更密,重跑一次 describe 不会改善");if(v.yielded.length)j.warn(`钉选段未能全部入选(${v.yielded.length}/${v.requested.length} 段让位):`+`${v.yielded.join("、")}(钉选间冲突后到让位/供长不足/被排除)——`+"名单是「素材@段内锚点毫秒」;其余钉选段已优先满足;"+"要强保它们可减少同 beat 的钉选段数或放宽槽位(--lay/--top-k)后重跑");let pZ=[...I.values()].flat().reduce((x,g)=>x+g.length,0);j.step(`▶ 候选铺轨(${Y} 轨 · 平铺 ${pZ} 槽位 · ${y.size} 个 clip)…`);let xZ=u9(G),x8=dZ(xZ,...E5.split("/"));await wQ(x8,{recursive:!0});let k8=new Map;for(let x of Q.beats)for(let g of F9(x))if(!k8.has(g.clip_id))k8.set(g.clip_id,g);let L8=Array.isArray($.video_size)?$.video_size:[1920,1080],EZ=await RO({fills:I,candById:k8,gtrkDir:xZ,canvas:[L8[0],L8[1]],yes:K.yes,deps:K.deps});if(EZ.declined)return j.err("已取消:图片运镜计费确认被拒绝——本轮铺轨中止,工程文件零改动、零云端调用(broll-plan.json 照常可用)。"+"可用 --yes 跳过确认,或 --no-image-broll 排除图片候选后重跑。"),{declined:!0,imageBilling:EZ.billing,lay:{declined:!0,laidTracks:[],laidClips:0,removedTracks:[],keptEditedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[]}};let b0=await DO(Q,xZ),IZ=new Map,l8=$.struct_meta?.broll;for(let x of l8?.beats??[])for(let g of x.candidates??[])if(typeof g.clip_id==="string"&&g.preview_path&&(g.source==="preview"||g.source==="raw"))IZ.set(g.clip_id,g.source);let X8=new Map,RZ={preview:0,raw:0,reused:0,failed:0,local:0};for(let x of y){let g=k8.get(x);if(!g)continue;if(g.kind==="image")continue;if(SQ(g)){let SZ=g.local_path;if(!SZ||!nZ(SZ)){j.warn(`本地素材缺失(clip ${x}):${SZ??"无 local_path"}——该候选槽位跳过(素材可能在未挂载的可移动盘上,重建索引或挂回后重跑)`),RZ.failed++;continue}X8.set(x,{rel:SZ,source:"local"}),RZ.local++;continue}let t=`${E5}/${x}.mp4`,FZ=dZ(xZ,...t.split("/"));if(nZ(FZ)){let SZ=IZ.get(x);if(SZ!=="raw"){X8.set(x,{rel:t,source:SZ??"preview"}),RZ.reused++;continue}if(await S4(g,FZ,{previewOnly:!0})==="preview")X8.set(x,{rel:t,source:"preview"}),RZ.preview++,j.info(`clip ${x} 代理已补产,已从原片回落态换回 preview`);else X8.set(x,{rel:t,source:"raw"}),RZ.reused++;continue}let YZ=await S4(g,FZ);if(YZ)X8.set(x,{rel:t,source:YZ}),RZ[YZ]++;else RZ.failed++}let{gtrk:H8,revision:g0}=lZ(G);if(G8(H8),g0!==H)j.warn("工程在本轮铺轨期间被改动过(下载/运镜进行中你在客户端存了一次):已按**改后**的工程落轨写回,"+"你那次保存不会被覆盖;但本轮槽位是按改动前的时间线切的,若改的是口播时间线,B-roll 位置可能与新时间线对不齐——"+"觉得不对就直接重跑一次本命令(plan 与已落盘代理都可复用,重跑很快)。");let{next:K0,summary:KZ,warnings:C8}=f5({gtrk:H8,plan:Q,lay:Y,fills:I,downloads:X8,covers:b0,injectedMaterials:EZ.injected,sourceLayer:V.sourceLayer,generatedAt:new Date().toISOString(),planPath:"split/broll-plan.json",blackBed:z,forceRelay:X,...R!=="none"?{gapFill:{mode:R,planned:a??[]}}:{}});if(KZ.refused){let x=KZ.keptEditedTracks;return I4(x,C8),{lay:{refused:!0,keptEditedTracks:x,laidTracks:[],laidClips:0,removedTracks:[],blackTrack:null,blackBedHoleSec:0,blackBedHoles:[],downloads:RZ},...EZ.hasImage?{imageBilling:EZ.billing}:{}}}let Y9=(KZ.gapFill?.fills??[]).some((x)=>x.kind==="solid");if(KZ.blackTrack!==null||Y9){let x=H8.video_size,g={hex:l0,width:x[0],height:x[1]},t=WQ(g),FZ=dZ(xZ,...t.split("/"));try{if(!nZ(FZ)){await wQ(u9(FZ),{recursive:!0});let YZ=`${FZ}.tmp-${process.pid}`;await t0(YZ,SJ(g)),await oP(YZ,FZ)}}catch(YZ){j.warn(`纯黑 PNG 落盘失败(${t}):${YZ.message} —— 本次不铺黑底垫轨${Y9?"、主轨黑片填充一并回退(留 gap——客户端若开主轨磁吸请注意与配音错位的风险)":""},候选轨照常。`),{next:K0,summary:KZ,warnings:C8}=f5({gtrk:H8,plan:Q,lay:Y,fills:I,downloads:X8,covers:b0,injectedMaterials:EZ.injected,sourceLayer:V.sourceLayer,generatedAt:new Date().toISOString(),planPath:"split/broll-plan.json",blackBed:!1,forceRelay:X})}}let n9=D6(K0,"broll",W);c8(G,n9,g0);let m=D1({gtrk:n9,gtrkDir:xZ,log:j}),o=KZ.blackTrack!==null?` · 纯黑底垫轨 track_index ${KZ.blackTrack}`:KZ.blackBedSkipped==="audio_driven"?" · 黑底垫轨跳过(音频驱动工程无口播保留轨,无遮挡对象——2026-08-21 拍板)":z?" · 未铺纯黑底垫轨":" · 纯黑底垫轨已关闭(--no-black-bed)",r=`剥离 ${KZ.removedTracks.length} 条旧自产轨`+(KZ.removedTracks.length?`(track_index ${KZ.removedTracks.join("/")})`:"")+(X?"(含 --force-relay 强剥的已编辑轨)":"")+" · ",GZ=KZ.keptEditedTracks.length?` · 保留 ${KZ.keptEditedTracks.length} 条已被你编辑的轨(track_index ${KZ.keptEditedTracks.join("/")},本次未剥,因由见下方告警)`:"",WZ=EZ.hasImage?` · 图片运镜 生成 ${EZ.billing.generated} / 复用 ${EZ.billing.reused}${EZ.failures.length?` / 静态兜底 ${EZ.failures.length}`:""}`:"";if(j.ok(`铺轨完成:${r}${KZ.laidTracks.length} 条候选轨(track_index ${KZ.laidTracks.join("/")||"-"})· 平铺 ${KZ.laidClips} 个颗粒 / ${y.size} 个 clip`+`(代理 ${RZ.preview} · 原片回落 ${RZ.raw} · 复用 ${RZ.reused}${RZ.local?` · 本地直引 ${RZ.local}`:""}${RZ.failed?` · 失败 ${RZ.failed}`:""}${WZ})${o}${GZ}`),j.info("opencut 打开工程即见候选轨:轨道头小眼睛可开关对比;确认下载原片属挑选 UI(E-P1)。"),KZ.gapFill){let x=KZ.gapFill,g={candidate:0,extend:0,solid:0};for(let t of x.fills)g[t.kind]++;j.info(x.fills.length?`主轨 gap 填充(${x.mode}):${x.fills.length} 处共 ${x.filledSec}s(候选 ${g.candidate} · 延长 ${g.extend} · 黑片 ${g.solid})——主轨零 gap,客户端主轨磁吸安全`:`主轨 gap 填充(${x.mode})已开启:本轮无洞可填(主轨本就零 gap)`)}for(let x of C8)j.warn(x);if(RZ.raw>0)j.warn("部分候选无 preview 代理已回落原片(体积较大)——服务端 backfill 后重跑本命令可换回代理。");if(m)P1(m,j);return{lay:{refused:!1,sourceLayer:KZ.sourceLayer,dedup:{scope:V.dedupScope??"scene",emptySlots:h.emptySlots,emptySlotsByRefine:h.emptySlotsByRefine,hotSlotsPlaced:h.hotSlotsPlaced,blurrySlotsPlaced:h.blurrySlotsPlaced,adjacentWaived:h.adjacentWaived},...f?{mark_weight:V.markWeight,mark_hit:S.hit,mark_neutral:S.neutral}:{},...n?{highlight_weight:V.highlightWeight,highlight_hit:S.hlHit,highlight_neutral:S.hlNeutral}:{},...f||n?{signal_coverage:{...f?{mark:{hit:S.hit,neutral:S.neutral,coverage:zZ??null}}:{},...n?{highlight:{hit:S.hlHit,neutral:S.hlNeutral,coverage:BZ??null}}:{}}}:{},...v.requested.length?{pinned:{requested:v.requested.length,placed:h.pinnedPlaced,yielded:v.yielded}}:{},...c?{cut_align:{target:c.target,starts_total:c.starts_total,aligned:c.aligned,ratio:c.ratio}}:{},...k.length?{anchors:{planned:k.filter((x)=>x.status==="planned").length,pinned:k.filter((x)=>x.status==="pinned").length,degraded:k.filter((x)=>x.status==="degraded").length},anchor_details:k.map((x)=>({beat:x.beat,keyword:x.keyword,at_sec:x.at_sec,track_st:x.track_st,clip_id:x.clip_id,status:x.status,...x.reason?{reason:x.reason}:{}}))}:{},...u?.length?{direct:{planned:u.filter((x)=>x.status==="planned").length,sliver:u.filter((x)=>x.status==="sliver").length,rejected:u.filter((x)=>x.status==="rejected").length,no_fps:u.filter((x)=>x.fps===null).length,cut_snap_skipped_quote:u.filter((x)=>x.cut_snap==="skipped_quote").length,cut_snap_no_data:u.filter((x)=>x.cut_snap==="no_data").length,starved:u.filter((x)=>typeof x.starved_sec==="number").length},direct_details:u.map((x)=>({beat:x.beat,clip_id:x.clip_id,track_st:x.track_st,status:x.status,refined:x.refined,has_cuts:x.has_cuts,cut_snap:x.cut_snap,fps:x.fps,...x.code?{code:x.code}:{},...x.code?{why:l(x)}:{},...typeof x.starved_sec==="number"?{starved_sec:x.starved_sec}:{}}))}:{},laidTracks:KZ.laidTracks,laidClips:KZ.laidClips,removedTracks:KZ.removedTracks,keptEditedTracks:KZ.keptEditedTracks,blackTrack:KZ.blackTrack,...KZ.blackBedSkipped?{blackBedSkipped:KZ.blackBedSkipped}:{},...KZ.gapFill?{gap_fill:{mode:KZ.gapFill.mode,filled_sec:KZ.gapFill.filledSec,fills:KZ.gapFill.fills}}:{},blackBedHoleSec:KZ.blackBedHoleSec,blackBedHoles:KZ.blackBedHoles,downloads:RZ,...EZ.hasImage?{image_move_failures:EZ.failures}:{}},...m?{integrity:m}:{},...EZ.hasImage?{imageBilling:EZ.billing}:{}}}async function S4(Z,Q,Y={}){let J=async(X)=>{try{let W=await fetch(X,{signal:AbortSignal.timeout(180000)});if(!W.ok)return null;return Buffer.from(await W.arrayBuffer())}catch{return null}},z=bJ(Z);if(z){let X=await J(z);if(X)return await t0(Q,X),"preview"}if(Y.previewOnly)return null;if(typeof Z.url==="string"&&Z.url){let X=await J(Z.url);if(X)return await t0(Q,X),j.warn(`clip ${Z.clip_id} 无 preview 代理,已回落原片(${(X.length/1048576).toFixed(1)}MB)`),"raw"}return j.warn(`clip ${Z.clip_id} 代理与原片均下载失败,该候选槽位跳过`),null}async function v4(Z,Q,Y){j.step(`▶ ad-hoc 检索「${Z}」(${Q.memberType==="local"?"本地索引":`${Q.memberType} 口`})…`);let J=await Q.search(Z),z=J.results??[];j.ok(`${z.length} 条候选(召回 ${J.recalled??"?"})`);let X=Q.memberType==="local"?void 0:W2(Q.memberType,z.length,Y.topK?Number(Y.topK):Y2),W={ok:!0,mode:"search",memberType:Q.memberType,...Q.columnId?{columnId:Q.columnId}:{},results:z,counts:{beats:0,queries:1,results:z.length,errors:0},...X?{upsell:X}:{}};if(Y.out){let V=X0(Y.out);await t0(V,JSON.stringify({query:Z,recalled:J.recalled,results:z},null,2)),j.ok(`结果已落盘:${V}`),W.outPath=V}else if(!Y.json)for(let V of z.slice(0,10)){let K=V.segments?.[0],G=V.local_path?` · ${V.local_path}`:"";j.info(`clip ${V.clip_id} · score ${V.score}${K?` · 最佳段 ${K.start}s–${K.end}s(锚点 ${K.best}s)`:""}${G}${V.note?` · ${String(V.note).slice(0,40)}`:""}`)}if(X&&!Y.json)j.warn(X.message);if(Y.json)console.log(JSON.stringify(W));return W}function PO(Z,Q,Y){let J=typeof Z.title==="string"&&Z.title?Z.title:typeof Z.note==="string"&&Z.note?Z.note.slice(0,40):String(Z.id),z=[`${Q+1}. ${J}`];if(typeof Z.author==="string"&&Z.author)z.push(String(Z.author));if(typeof Z.duration==="number")z.push(`${Math.round(Z.duration)}s`);if(Z.audio_type)z.push(Z.audio_type==="song"?"song(歌曲)":Z.audio_type==="pure"?"pure(纯音乐)":String(Z.audio_type));if(typeof Z.score==="number")z.push(`score ${Z.score}`);if(typeof Z.is_copyright==="boolean")z.push(Z.is_copyright?"可商用":"非商用");if(typeof Z.material_class==="string")z.push(Z.material_class);let X=[`${z.join(" · ")}(id ${Z.id})`];if(typeof Z.download_url==="string"&&Z.download_url)X.push(` ${Y==="audio"?"试听/下载":"下载"}:${Z.download_url}`);if(typeof Z.accompaniment_url==="string"&&Z.accompaniment_url)X.push(` 伴奏直链(off-vocal,song 类现成):${Z.accompaniment_url}`);if(Array.isArray(Z.tags)&&Z.tags.length)X.push(` 标签:${Z.tags.slice(0,8).join(" / ")}`);return X}async function OO(Z,Q,Y){let J=G4(Y.scope),z=$4(Y.topK),X=H4(Y.minDuration,Y.maxDuration);j.step("▶ 身份探针(matrix_member_type)…");let W=await J2(Q),V=K4(W);if(j.info(`档位:${W}(${W==="internal"?"矩阵成员口":"通用口"} ${V})· 计费 ${X2[W]}${W==="internal"?"(搜全库,含非商用/概念素材)":"(服务端固定只含可商用实拍素材)"}`),Y.commercialOnly&&W==="external")j.warn("--commercial-only 在公开口无区别:公开口本就只含可商用素材(服务端固定 is_copyright=true),该参数未随请求发出");if(W==="external"&&(X.min!==void 0||X.max!==void 0))j.warn("公开口入参不含时长过滤(服务端只收 scope/query/top_k/diversity)——--min-duration/--max-duration 改由 CLI 按结果 duration 本地过滤后再出参");let K=q4(W,{scope:J,query:Z,topK:z,diversity:Y.diversity===!0,commercialOnly:Y.commercialOnly===!0,...X.min!==void 0?{minDuration:X.min}:{},...X.max!==void 0?{maxDuration:X.max}:{}}),G=X.min!==void 0||X.max!==void 0?` · 时长 ${X.min??0}s–${X.max!==void 0?`${X.max}s`:"不限"}`:"";j.step(`▶ 通用素材检索「${Z}」(scope=${J} · top_k=${z}${G}${Y.commercialOnly?" · 仅可商用":""})…`);let $=await N4(Q,W,K),H=W==="external"?U4($.results,X):$.results,N=H;if(J==="audio"&&Y.excludeRecent!==!1){let F=typeof Y.excludeRecent==="string"?Number(Y.excludeRecent):vQ,M=Number.isFinite(F)&&F>=0?F:vQ,R=_4(H,C4(M));if(N=R.kept,R.skipped>0)j.info(`选曲新鲜度:已避让近期用过的 ${R.skipped} 首(窗口 ${M} 条;--no-exclude-recent 可关)`);if(R.exhausted)j.warn("选曲新鲜度:本次候选全部是近期用过的曲子——已按原结果返回(避免空手)。建议换检索词或缩小窗口(--exclude-recent <n>)")}j.ok(`${N.length} 条候选${typeof $.total==="number"&&$.total!==N.length?`(服务端返回 ${$.total})`:""}`);let q=W2(W,N.length,z),U={ok:!0,mode:"material",memberType:W,endpoint:V,scope:J,query:Z,top_k:z,billing:X2[W],results:N,counts:{results:N.length},...$.task_id?{task_id:$.task_id}:{},...q?{upsell:q}:{}};if(Y.out){let F=X0(Y.out);await t0(F,JSON.stringify({query:Z,scope:J,top_k:z,member_type:W,results:N,...q?{upsell:q}:{}},null,2)),j.ok(`结果已落盘:${F}`),U.outPath=F}else if(!Y.json)for(let[F,M]of N.entries())for(let R of PO(M,F,J))j.info(R);if(q)j.warn(q.message);if(Y.json)console.log(JSON.stringify(U));return U}function LO(Z){return Z.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-+|-+$/g,"")||"project"}import{resolve as yQ,join as x0,dirname as U2,basename as o4}from"node:path";import{existsSync as w1}from"node:fs";import{readFile as N2,mkdir as IO,copyFile as SO}from"node:fs/promises";var CO=(Z)=>Z.startsWith("mg-")||Z.startsWith("rrv-"),_O=["assets/mg/","assets/rrv/"],TO=(Z)=>Z.replace(/\\/g,"/").replace(/^\.\//,"");function AO(Z){if(typeof Z!=="string")return;let Q=TO(Z);for(let Y of _O){if(!Q.startsWith(Y))continue;let J=Q.slice(Y.length);if(J.includes("/"))return;return J.replace(/\.html?$/i,"")}return}var n4=(Z)=>Math.round(Z*1000)/1000,p4=(Z)=>n4(Z.track_ed-Z.track_st);function u4(Z){return Array.isArray(Z?.lay_tracks)?Z.lay_tracks.filter((Q)=>typeof Q==="number"):[]}function v1(Z){return Array.isArray(Z?.beats)?Z.beats.filter((Q)=>!!Q&&typeof Q.composition_id==="string"):[]}function m4(Z){let Q=Z.html_material;if(typeof Q==="string"){if(Q.startsWith("mg-"))return Q.slice(3);if(Q.startsWith("rrv-"))return Q.slice(4)}if(typeof Z.material==="string")return Z.material;return typeof Z.clip_id==="string"?Z.clip_id:void 0}var c4=(Z)=>typeof Z.track_st==="number"?Z.track_st:0;function l4(Z,Q){for(let Y of["material","html_material"]){let J=Z[Y];if(typeof J==="string")Q.add(J)}}function EO(Z,Q){let Y=new Set;for(let J of Object.values(Z)){if(!Array.isArray(J))continue;for(let z of J){if(!z||!Array.isArray(z.track_timeline))continue;for(let X of z.track_timeline)l4(X,Y)}}for(let J of Q)l4(J,Y);return Y}function i4(Z){let{gtrk:Q,items:Y,generatedAt:J}=Z,z=[...Q.beat_track??[]],X=[...Q.materials??[]],W={...Q.struct_meta??{}},V=W.mg,K=W.rrv,G=new Set([...u4(V),...u4(K)]),$=z.filter((u)=>typeof u.track_index==="number"&&G.has(u.track_index)),H=z.filter((u)=>!(typeof u.track_index==="number"&&G.has(u.track_index))),N=new Set([...v1(V).map((u)=>u.composition_id),...v1(K).map((u)=>u.composition_id),...Y.map((u)=>u.composition_id)]);for(let u of $)for(let l of u.track_timeline??[]){let f=m4(l);if(f!==void 0)N.add(f)}let q=(u)=>{if(typeof u.id==="string"&&CO(u.id))return!0;let l=AO(u.path);return l!==void 0&&N.has(l)},U=new Set(Y.map((u)=>u.composition_id)),F=new Set((Z.keep??[]).filter((u)=>!U.has(u))),M=[],R=new Set;for(let u of $)for(let l of u.track_timeline??[]){let f=m4(l);if(f===void 0||!F.has(f)||R.has(f))continue;R.add(f),M.push({...l})}let D=[],O=[],C=[],T=[...H,...Q.video_track??[],...Q.audio_track??[]].map((u)=>typeof u.track_index==="number"?u.track_index:0),_=Math.max(9,...T)+1;for(let u of Y){let l=p4(u);if(!(l>0)){C.push({...d4(u),laid:null});continue}let f=`mg-${u.composition_id}`;D.push({id:f,path:u.html_rel}),O.push({clip_id:u.composition_id,material:u.composition_id,html_material:f,opaque:u.opaque,track_st:u.track_st,duration:l}),C.push({...d4(u),laid:{track_index:_}})}let P=[...M,...O].sort((u,l)=>c4(u)-c4(l)),E=P.length>0?[{track_index:_,track_timeline:P}]:[],I=EO({...Q,beat_track:H},M),y=new Set(D.map((u)=>String(u.id))),h=X.filter((u)=>{if(typeof u.id!=="string")return!0;if(y.has(u.id))return!1;if(!q(u))return!0;return I.has(u.id)}),v=[],S=new Set;for(let u of[...v1(V),...v1(K)]){if(!F.has(u.composition_id)||S.has(u.composition_id))continue;S.add(u.composition_id),v.push({...u,laid:R.has(u.composition_id)?{track_index:_}:null})}let k={contract_version:"v1",generated_at:J,lay_tracks:E.map((u)=>u.track_index),beats:[...v,...C]},c={...W,mg:k};return delete c.rrv,{next:{...Q,materials:[...h,...D],beat_track:[...H,...E],struct_meta:c},summary:{laidTrack:E[0]?.track_index??null,laidParticles:O.length,keptParticles:M.length},mg:k}}function d4(Z){return{beat:Z.beat,composition_id:Z.composition_id,track_st:Z.track_st,track_ed:n4(Z.track_ed),duration:p4(Z),html_path:Z.html_rel,...Z.category?{category:Z.category}:{}}}var r4="assets/mg",a4=["mg","rrv"];function s4(Z){Z.command("mg [words...]").alias("rrv").description("MG 颗粒铺轨:无 positional=消费 dispatch.mg 铺 html-particle;`mg lint <file>`=单文件 lint;`mg status`=看板;`mg render <file> --duration <sec>`=独立颗粒云渲 qtrle 透明 MOV(精剪补给口)").option("--project <dir>","oralcut 产物目录(定位 split/dispatch.json 与工程)").option("--dispatch <path>","显式指定 dispatch.json(非标准布局兜底)").option("--only <beat>","只跑单 beat(收 beat id 如 B12,非 composition_id):增量重铺该 beat,轨上其余已铺颗粒原样保留").option("--lint-only","只 lint 校验,不铺轨不写回").option("--replace-all","显式授权重置整轨:不走增量保留、整轨剥掉重铺——会删掉轨上其余已铺颗粒(不在本次派单/--only 里的那些)").option("--duration <sec>","render 模式必填:显式时长锚(秒)——独立模式无坑位包络,它就是 lint 包络与计费时长").option("--format <fmt>","render 模式产物格式:首发仅 qtrle(剪映可读透明 MOV;webm 剪映不吃、明确拒绝)").option("--out <dir>","render 模式落盘目录(缺省 ./mg-render/<composition_id>/;绝不写剪映草稿目录)").option("--yes","render 模式:跳过计费预估确认").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{if(process.argv[2]==="rrv")j.warn("`gtrk rrv` 已更名为 `gtrk mg`(去品牌化),别名仍可用但建议改用 `gtrk mg`。");await vO(Q??[],Y)})}async function vO(Z,Q){if(Q.json)qZ();let Y=Z[0];if(Y==="lint")return kO(Z.slice(1),Q);if(Y==="status")return fO(Q);if(Y==="render")return xO(Z.slice(1),Q);if(Y)throw Error(`未知子命令「${Y}」——铺轨:gtrk mg --project <dir>;lint:gtrk mg lint <file>;看板:gtrk mg status;独立渲染:gtrk mg render <file> --duration <sec>`);return yO(Q)}function t4(Z){if(Z.dispatch){let Q=yQ(Z.dispatch);return{dispatchPath:Q,baseDir:U2(U2(Q))}}if(Z.project){let Q=yQ(Z.project);return{dispatchPath:x0(Q,"split","dispatch.json"),baseDir:Q}}throw Error("需 --project <目录> 或显式 --dispatch <path>")}function e4(Z){return[x0(Z,"gtrk","project.gtrk"),x0(Z,"project.gtrk")].find((Q)=>w1(Q))}function ZV(Z,Q){for(let Y of a4){let J=x0(Z,Y,`${Q}.html`);if(w1(J))return J}return}async function B2(Z){if(!w1(Z))throw Error(`找不到派单清单:${Z}(先跑 gtrk split 落地派单)`);let Q=JSON.parse(await N2(Z,"utf8")),Y=Q.mg??Q.rrv_mg;return Array.isArray(Y)?Y:[]}function wO(Z){if(!Z)return[];let Q=Z.struct_meta,Y=[],J=new Set;for(let z of[Q?.mg,Q?.rrv])for(let X of z?.beats??[]){if(!X?.laid||typeof X.composition_id!=="string"||J.has(X.composition_id))continue;J.add(X.composition_id),Y.push(X.composition_id)}return Y}async function yO(Z){let{dispatchPath:Q,baseDir:Y}=t4(Z),J=await B2(Q),z=Z.only?J.filter((f)=>f.beat===Z.only):J;if(j.step(`▶ MG 颗粒铺轨:${z.length} 个 beat…`),Z.only&&z.length===0){let f=[...new Set(J.map((n)=>n.beat))];j.warn(`--only ${Z.only} 未命中任何 beat——该选择器收的是「beat id」(如 B12),不是 composition_id(如 <slug>-B12)。`),j.warn(`dispatch 现有 beat:${f.slice(0,12).join("、")||"(空)"}${f.length>12?` …共 ${f.length} 个`:""}`)}let X=e4(Y),W,V=!1;if(X)try{W=lZ(X)}catch(f){if(!Z.lintOnly)throw f;V=!0}if(!Z.lintOnly&&W)G8(W.gtrk);let K=wO(Z.lintOnly?void 0:W?.gtrk),G=await ZQ({baseDir:Y,gtrk:W?.gtrk,gtrkUnreadable:V,entries:z.map((f)=>({key:f.composition_id,beat:f.beat,compositionId:f.composition_id,span:f.span,track_st:f.track_st,track_ed:f.track_ed}))});QQ(G);let $=z.map((f)=>f.composition_id),H=[],N=new Map,q=[],U=new Map(G.entries.map((f)=>[f.key,f]));for(let f of z){let n=U.get(f.composition_id);if(n?.dropped){q.push({beat:f.beat,reason:"重投影后零存活(该段已被剪出成片)"});continue}let QZ=n??{track_st:f.track_st,track_ed:f.track_ed},zZ=ZV(Y,f.composition_id);if(!zZ){q.push({beat:f.beat,reason:"缺颗粒 HTML(未产出)"}),j.warn(`${f.beat}:缺 ${x0(Y,a4[0],`${f.composition_id}.html`)},跳过`);continue}let BZ=await N2(zZ,"utf8"),PZ=typeof f.category==="string"?f.category:void 0,oZ=Math.round((QZ.track_ed-QZ.track_st)*1000)/1000,mZ=IQ(BZ,{compositionId:f.composition_id,dispatchIds:$,category:PZ,...oZ>0?{slotDuration:oZ}:{}});for(let bZ of mZ.violations)(bZ.fatal?j.warn:j.info)(`${f.beat} lint ${bZ.fatal?"✗":"·"} ${bZ.law}: ${bZ.msg}`);if(!mZ.ok){q.push({beat:f.beat,reason:"lint 未过"}),j.warn(`${f.beat}:lint 未过,跳过`);continue}if(!(oZ>0)){q.push({beat:f.beat,reason:"槽位包络非正数"});continue}N.set(f.composition_id,zZ),H.push({beat:f.beat,composition_id:f.composition_id,track_st:QZ.track_st,track_ed:QZ.track_ed,opaque:mZ.opaque,html_rel:`${r4}/${f.composition_id}.html`,...PZ?{category:PZ}:{}})}if(Z.lintOnly){let f=q.length===0;return(f?j.ok:j.warn)(`lint-only:${H.length}/${z.length} 通过,${q.length} 跳过(不铺轨)`),m9(Z,{ok:f,mode:"lay",lintOnly:!0,...f?{}:{reason:"skipped"},passed:H.length,skipped:q,reprojection:G.summary})}if(!X||!W)return j.warn(`未找到工程文件(${x0(Y,"gtrk","project.gtrk")}),跳过铺轨——lint 已完成`),m9(Z,{ok:q.length===0,mode:"lay",reason:"no_project",laid:0,laidTrack:null,track_total:0,removed:0,kept:0,kept_ids:[],skipped:q,note:"工程缺失,未铺轨",reprojection:G.summary});let{gtrk:F,revision:M}=W,R=U2(X),D=new Set(H.map((f)=>f.composition_id)),O=K.filter((f)=>!D.has(f)),C=new Set(J.map((f)=>f.composition_id)),T=Z.replaceAll?[]:Z.only?O:O.filter((f)=>C.has(f)),_=new Set(T),P=K.filter((f)=>!D.has(f)&&!_.has(f)),E=K.length>0&&H.length===0?"empty_queue":void 0;if(E&&!Z.replaceAll){if(j.err(`拒绝写回:本次一条颗粒都没定位到,而轨上已铺 ${K.length} 颗——「一条都没定位到」是派单/选择器出问题的信号,不是清空指令。`),Z.only&&z.length===0)j.warn(`成因:--only ${Z.only} 未命中任何 beat(选择器提示见上)。`);else if(J.length===0)j.warn("dispatch.mg(读旧 rrv_mg)为空或缺失——先跑 gtrk split 落地派单,再铺轨。");else j.warn(`本次 ${z.length} 个条目全部被跳过(${[...new Set(q.map((f)=>f.reason))].join("、")})——先按上面的 lint 报因补产 / 修颗粒,再重铺。`);if(P.length){let f=P.slice(0,8);j.warn(`将被铲掉:${f.join("、")}${P.length>f.length?` …等共 ${P.length} 颗`:""}`)}return j.warn("出路二选一:① 按上面的报因修好派单 / 选择器 / 颗粒后重铺;② 确知要清空整轨 → 加 --replace-all 显式授权(会删掉轨上全部已铺颗粒)"),j.warn(`工程未被改动(.gtrk 逐字节不变,轨上仍 ${K.length} 颗)。`),m9(Z,{ok:!1,mode:"lay",reason:E,refused:!0,laid:0,laidTrack:null,track_total:K.length,removed:0,kept:0,kept_ids:[],blocked:P,skipped:q,reprojection:G.summary})}if(Z.replaceAll&&O.length>0)j.warn(`--replace-all:已显式授权重置整轨,轨上其余 ${O.length} 颗已铺颗粒将被剥离(不走增量保留)。`);await IO(x0(R,...r4.split("/")),{recursive:!0});for(let f of H)await SO(N.get(f.composition_id),x0(R,...f.html_rel.split("/")));let{next:I,summary:y,mg:h}=i4({gtrk:F,items:H,generatedAt:new Date().toISOString(),keep:T}),v=D6(I,"mg",G);c8(X,v,M);let S=D1({gtrk:v,gtrkDir:R,log:j}),k=h.beats.filter((f)=>f.laid).length,c=h.beats.filter((f)=>f.laid&&_.has(f.composition_id)).map((f)=>f.composition_id),a=K.length-c.length,u=q.length===0,l=`本次 ${y.laidParticles} 颗 / 轨上共 ${k} 颗${c.length?`(保留 ${c.length} 颗)`:""}`+` → beat_track ${y.laidTrack??"-"}${a?`(剥旧 ${a} 颗)`:""}${q.length?`(${q.length} beat 跳过)`:""}`;if(y.laidTrack===null)j.warn(`未铺成任何颗粒:${l}`);else if(u)j.ok(`铺轨完成:${l}`);else j.warn(`铺轨完成(有跳过):${l}`);if(c.length){let f=c.slice(0,8);j.warn(`其中 ${c.length} 颗是上轮遗留、本次未重铺:${f.join("、")}${c.length>f.length?` …等共 ${c.length} 颗`:""}`+`——轨上内容 = 本次 ${y.laidParticles} 颗 + 上轮 ${c.length} 颗,与本次派单不完全对应(要全部刷新就去掉 --only 全量重铺)。`)}if(j.info("opencut 打开工程即见 MG overlay 轨(预览需 add-particle-project-folder-preview 上线);出片时客户端云渲。"),S)P1(S,j);return m9(Z,{ok:u,mode:"lay",...u?{}:{reason:"skipped"},laid:y.laidParticles,laidTrack:y.laidTrack,track_total:k,removed:a,kept:c.length,kept_ids:c,skipped:q,...S?{integrity:S}:{},reprojection:G.summary})}async function xO(Z,Q){let Y=Z[0];if(!Y)throw Error("用法:gtrk mg render <particle.html> --duration <sec> [--format qtrle] [--out <dir>] [--yes]");let J=Number(Q.duration),z=await mW({file:Y,duration:J,...Q.format?{format:Q.format}:{},...Q.out?{out:Q.out}:{},...Q.yes?{yes:!0}:{}});return m9(Q,z)}async function kO(Z,Q){let Y=Z[0];if(!Y)throw Error("用法:gtrk mg lint <particle.html> [--dispatch <path>]");let J=await N2(yQ(Y),"utf8"),z=o4(Y).replace(/\.html?$/i,""),X,W,V;if(Q.dispatch&&w1(yQ(Q.dispatch))){let $=await B2(yQ(Q.dispatch));X=$.map((U)=>U.composition_id);let H=$.find((U)=>U.composition_id===z),N=F1(J),q=H??(N?$.find((U)=>U.composition_id===N):void 0);if(q){let U=Math.round((q.track_ed-q.track_st)*1000)/1000;if(U>0)W=U}if(H)V=H.composition_id}if(V===void 0&&e7.test(z))V=z;let K=IQ(J,{...X?{dispatchIds:X}:{},...V?{compositionId:V}:{},...W?{slotDuration:W}:{}});for(let $ of K.violations)($.fatal?j.err:j.warn)(`${$.fatal?"✗":"·"} ${$.law}: ${$.msg}`);if(K.ok)j.ok(`lint 通过(${o4(Y)};opaque=${K.opaque})`);else j.err(`lint 未过(${K.violations.filter(($)=>$.fatal).length} 项致命)`);let G={mode:"lint",...K,ok:K.ok};if(Q.json)console.log(JSON.stringify(G));if(!K.ok)process.exitCode=1;return G}async function fO(Z){let{dispatchPath:Q,baseDir:Y}=t4(Z),J=await B2(Q),z=e4(Y),X=new Set;if(z){let{gtrk:G}=lZ(z),$=G.struct_meta,H=$?.mg??$?.rrv;X=new Set((H?.beats??[]).filter((N)=>N.laid).map((N)=>N.composition_id))}let W=J.map((G)=>{let $=ZV(Y,G.composition_id)!==void 0,H=X.has(G.composition_id);return{beat:G.beat,composition_id:G.composition_id,authored:$,laid:H,state:H?"已铺":$?"已产未铺":"缺 HTML"}}),V=W.filter((G)=>G.authored).length,K=W.filter((G)=>G.laid).length;j.step(`▶ MG 看板:${J.length} beat · ${V} 已产 · ${K} 已铺`);for(let G of W)j.info(`${G.beat}(${G.composition_id})→ ${G.state}`);return m9(Z,{ok:!0,mode:"status",total:J.length,authored:V,laid:K,rows:W})}function m9(Z,Q){if(!Q.ok)process.exitCode=1;if(Z.json)console.log(JSON.stringify(Q));return Q}import{mkdir as DL,writeFile as EV}from"node:fs/promises";import{existsSync as PL,statSync as OL}from"node:fs";import{resolve as T2,join as A2}from"node:path";function s(Z,Q=0){return typeof Z==="number"&&isFinite(Z)?Z:Q}function QV(Z){if(!Z||typeof Z!=="string")return null;let Q=Z.match(/cubic-bezier\(\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*,\s*([-\d.]+)\s*\)/);if(!Q)return null;let Y=Q.slice(1,5).map(Number);return Y.every((J)=>isFinite(J))?Y:null}function YV(Z,Q=90){if(!Z)return Q;let Y=Z.match(/([\d.]+)px/);return Y?Math.max(1,parseFloat(Y[1])):Q}function JV(Z){if(!Z||typeof Z!=="string")return null;let Q=Z.trim(),Y=Q.match(/^#([0-9a-fA-F]{3})$/);if(Y){let J=Y[1];return[parseInt(J[0]+J[0],16),parseInt(J[1]+J[1],16),parseInt(J[2]+J[2],16),1]}if(Y=Q.match(/^#([0-9a-fA-F]{6})([0-9a-fA-F]{2})?$/),Y){let J=Y[1],z=Y[2]?parseInt(Y[2],16)/255:1;return[parseInt(J.slice(0,2),16),parseInt(J.slice(2,4),16),parseInt(J.slice(4,6),16),z]}if(Y=Q.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/),Y)return[Math.min(255,parseFloat(Y[1])),Math.min(255,parseFloat(Y[2])),Math.min(255,parseFloat(Y[3])),Y[4]!==void 0?Math.min(1,parseFloat(Y[4])):1];return null}function y1(Z,Q,Y,J){let z=(V,K,G)=>{if(!V||V.length===0)return G;if(K<=V[0].t)return s(V[0].v,G);for(let $=1;$<V.length;$++)if(K<=V[$].t){let H=V[$-1],N=V[$],q=N.t-H.t;if(q<=0)return s(N.v,G);let U=(K-H.t)/q;return s(H.v,G)+(s(N.v,G)-s(H.v,G))*U}return s(V[V.length-1].v,G)},X=new Set;for(let V of Z??[])X.add(V.t);for(let V of Q??[])X.add(V.t);return[...X].sort((V,K)=>V-K).map((V)=>{let K=(Z??[]).find(($)=>$.t===V)?.e,G=(Q??[]).find(($)=>$.t===V)?.e;return{t:V,a:z(Z,V,Y),b:z(Q,V,J),e:K??G??null}})}var kQ=new Set(["shake","pulsate","oscillate","flicker","zoom"]);function eZ(Z,Q,Y){if(!Z||Z.length===0)return Y;if(Q<=Z[0].t)return s(Z[0].v,Y);for(let J=1;J<Z.length;J++){let z=Z[J-1],X=Z[J];if(Q<=X.t){let W=Math.max(X.t-z.t,0.000001),V=(Q-z.t)/W;return s(z.v,Y)+(s(X.v,Y)-s(z.v,Y))*V}}return s(Z[Z.length-1].v,Y)}function hO(Z){return[Math.sin(Z*2.399),Math.cos(Z*3.11)]}var NZ=(Z,Q)=>{let Y=10**Q;return Math.round(Z*Y)/Y},e0=(Z,Q,Y)=>Math.min(Y,Math.max(Q,Z)),xQ=(Z)=>Math.max(2,Math.floor(Z));function j2(Z,Q,Y){return[eZ(Z.x,Y,Q[0]),eZ(Z.y,Y,Q[1])]}function F2(Z,Q){if(Z.scale?.length){let Y=eZ(Z.scale,Q,1);return[Y,Y]}if(Z.sx?.length||Z.sy?.length)return[eZ(Z.sx,Q,1),eZ(Z.sy,Q,1)];return[1,1]}function zV(Z,Q){return eZ(Z.rot,Q,0)}function bO(Z,Q){let Y=s(Z.t0,s(Q.in,0)),J=s(Z.t1,s(Q.out,Y+1));return[Y,J]}function M2(Z){let Q=Z.anim??{},Y=[s(Z.pos?.[0],0),s(Z.pos?.[1],0)],J=[],z=[];for(let X of Z.fx??[]){let W=X.op;if(!kQ.has(W))continue;if(W==="zoom"){let G=X.tracks?.scale;if(!G||G.length<1){z.push(`bake: zoom 无 scale 参数轨,跳过(layer ${Z.id})`);continue}let $=[],H=[];for(let q of G){let U=s(q.t,0),F=s(q.v,1),[M,R]=F2(Q,U);$.push(NZ(U,3)),H.push([NZ(M*F*100,3),NZ(R*F*100,3)])}let N=[$[0],$[$.length-1]];J.push({prop:"scale",times:$,values:H,window:N,ease:"power2.out"});continue}let[V,K]=bO(X,Z);if(W==="flicker"){if(K-V<0.05)continue;let G=s(X.freq,8);G=e0(G>=0.5?G:G*30,0.5,20);let $=e0(s(X.mag,0.6),0.05,1),H=1+$*0.8,N=Math.max(0.3,1-$*0.6),q=Math.min(xQ(Math.max(2,Math.floor((K-V)*G*2))),160),U=[NZ(V,3)],F=[[0]];for(let M=1;M<=q;M++){let R=V+(K-V)*M/q,D=M%2?H:N,O=e0((D-1)*100,-100,100);U.push(NZ(R,3)),F.push([NZ(O,3)])}J.push({prop:"brightness",times:U,values:F,window:[V,K]});continue}if(K-V<0.05)continue;if(W==="shake"){let G=s(X.mag??X.amp,18),$=e0(s(X.freq,20),1,40),H=Math.min(xQ(Math.max(2,Math.floor((K-V)*$))),160),N=X.tracks?.mag,q=[],U=[],F=[];for(let C=0;C<=H;C++){let T=V+(K-V)*C/H,_=eZ(N,T,G);if(X.decay)_*=1-C/H;let[P,E]=hO(C);q.push(NZ(_*P,1)),U.push(NZ(_*E,1)),F.push(NZ(T,3))}let M=q[0],R=U[0],D=[],O=[];for(let C=0;C<=H;C++){let[T,_]=j2(Q,Y,F[C]);D.push(F[C]),O.push([NZ(T+(q[C]-M),3),NZ(_+(U[C]-R),3)])}J.push({prop:"position",times:D,values:O,window:[V,K]});continue}if(W==="oscillate"){if(X.rot===!0){let G=s(X.a1,-3),$=s(X.a2,3),H=e0(s(X.freq,2),0.2,20),N=Math.min(xQ(Math.max(4,Math.floor((K-V)*H*4))),120),q=[NZ(V,3)],U=[[NZ(zV(Q,V),3)]],F=0,M=0;for(let R=1;R<=N;R++){let D=V+(K-V)*R/N,O=Math.sin(2*Math.PI*H*(D-V)),C=(G+$)/2+($-G)/2*O;M+=NZ(C-F,2),F=C,q.push(NZ(D,3)),U.push([NZ(zV(Q,D)+M,3)])}J.push({prop:"rotation",times:q,values:U,window:[V,K]})}else{let G=s(X.mag,40),$=s(X.angle,90)*Math.PI/180,H=e0(s(X.freq,4),0.2,30),N=Math.min(xQ(Math.max(4,Math.floor((K-V)*H*4))),160),q=X.tracks?.mag,U=[NZ(V,3)],[F,M]=j2(Q,Y,V),R=[[NZ(F,3),NZ(M,3)]],D=0,O=0,C=0,T=0;for(let _=1;_<=N;_++){let P=V+(K-V)*_/N,E=eZ(q,P,G),I=Math.sin(2*Math.PI*H*(P-V)),y=E*I*Math.cos($),h=E*I*Math.sin($);C+=NZ(y-D,2),T+=NZ(h-O,2),D=y,O=h;let[v,S]=j2(Q,Y,P);U.push(NZ(P,3)),R.push([NZ(v+C,3),NZ(S+T,3)])}J.push({prop:"position",times:U,values:R,window:[V,K]})}continue}if(W==="pulsate"){let G,$;if(X.amp!=null)G=1-s(X.amp,0),$=1+s(X.amp,0);else G=s(X.min,1),$=s(X.max,1.06);let H=e0(s(X.freq,2),0.2,20),N=Math.min(xQ(Math.max(4,Math.floor((K-V)*H*4))),160),q=X.tracks?.max,U=[NZ(V,3)],[F,M]=F2(Q,V),R=[[NZ(F*100,3),NZ(M*100,3)]];for(let D=1;D<=N;D++){let O=V+(K-V)*D/N,C=eZ(q,O,$),T=(Math.sin(2*Math.PI*H*(O-V))+1)/2,_=NZ(G+(Math.max(C,G)-G)*T,3),[P,E]=F2(Q,O);U.push(NZ(O,3)),R.push([NZ(P*_*100,3),NZ(E*_*100,3)])}J.push({prop:"scale",times:U,values:R,window:[V,K]});continue}}return{tracks:J,warnings:z}}var gO=`// 由技法图鉴重建生成,仅供学习研究;素材为占位,请替换
|
|
234
234
|
// Generated by gitruck-creation IR->JSX converter. For study only; placeholder footage, replace before use.
|
|
235
|
-
// 用法: AE 菜单 文件>脚本>运行脚本文件 选择本文件(AE 2020+ 建议)`,IP={glow:"ADBE Glo2",blur:"ADBE Gaussian Blur 2",dirBlur:"ADBE Motion Blur",turbulence:"ADBE Turbulent Displace",tile:"ADBE Tile",dropShadow:"ADBE Drop Shadow",invert:"ADBE Invert",wipe:"ADBE Linear Wipe",bulge:"ADBE Bulge",noise:"ADBE Noise",fill:"ADBE Fill",vignette:"ADBE Vignette",colorAdjust:"ADBE Brightness & Contrast 2"};function V8(Z){return String(Z).replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(new RegExp(String.fromCharCode(8232),"g"),"\\u2028").replace(new RegExp(String.fromCharCode(8233),"g"),"\\u2029")}function QZ(Z){return Math.round(Z*1000)/1000}function s4(Z,Q){let Y=r4(Z);if(!Y)return Q;return[QZ(Y[0]/255),QZ(Y[1]/255),QZ(Y[2]/255)]}function SP(Z){let Q=i4(Z);if(!Q)return null;let Y=(J)=>Math.min(100,Math.max(0.1,J));return{out:Y(Q[0]*100||33),inn:Y((1-Q[2])*100||33)}}function J0(Z,Q,Y){if(Y.length===0)return;let J=Z.lines;J.push(" try {"),J.push(` var p = ${Q};`);for(let z of Y)J.push(` p.setValueAtTime(${QZ(z.t)}, ${z.value});`);Y.forEach((z,X)=>{let V=SP(z.e);if(!V)return;J.push(" try {"),J.push(" var dim = 1; try { dim = p.value.length || 1; } catch (e) { dim = 1; }"),J.push(" var eo = [], ei = [];"),J.push(` for (var d = 0; d < Math.min(dim, 3); d++) { eo.push(new KeyframeEase(0, ${QZ(V.out)})); ei.push(new KeyframeEase(0, ${QZ(V.inn)})); }`),J.push(` p.setTemporalEaseAtKey(${X+1}, ei, eo);`),J.push(" } catch (e) {}")}),J.push(" } catch (e) {}")}function B2(Z){let Q=Object.keys(Z).filter((J)=>!["op","src","tracks"].includes(J)).map((J)=>`${J}=${JSON.stringify(Z[J])}`).join(" "),Y=Z.tracks?` tracks:[${Object.keys(Z.tracks).join(",")}]`:"";return`${Z.op}${Z.src?` (原特效: ${Z.src})`:""}${Q?" "+Q:""}${Y}`}function t4(Z,Q,Y){if(!Y||Y.length===0)return;let J=Z.lines;J.push(" // —— 特效(原工程特效清单,已知 matchName 自动 applyEffect,其余 TODO 手动补)——");for(let z of Y){let X=IP[z.op];if(Z.bakeOps&&IQ.has(z.op))continue;if(X&&!IQ.has(z.op))J.push(` // fx: ${V8(B2(z))}`),J.push(` try { ${Q}.property("ADBE Effect Parade").addProperty("${X}"); } catch (e) {}`);else if(IQ.has(z.op))J.push(` // TODO fx(时序算子,请用表达式或关键帧手动复现): ${V8(B2(z))}`),Z.warnings.push(`jsx: 时序算子 ${z.op} 未自动铺帧(已写 TODO 注释)`);else J.push(` // TODO fx(无对应 AE 原生 matchName): ${V8(B2(z))}`),Z.warnings.push(`jsx: 未映射特效 ${z.op}(已写 TODO 注释)`)}}function vP(Z,Q,Y){return[sZ(Z.x,Y,Q[0]),sZ(Z.y,Y,Q[1])]}function wP(Z,Q){if(Z.scale?.length){let Y=sZ(Z.scale,Q,1);return[Y,Y]}if(Z.sx?.length||Z.sy?.length)return[sZ(Z.sx,Q,1),sZ(Z.sy,Q,1)];return[1,1]}function j2(Z,Q,Y,J,z,X){let V=($)=>{for(let H of Y)if($>H[0]+0.000001&&$<H[1]-0.000001)return!0;return!1},W=[];for(let $ of Z)if(!V($.t))W.push($);let K=0.033;for(let $ of Y){if($[1]<X-K){let H=Math.min($[1]+K,X);W.push({t:H,value:J(H),e:null})}if($[0]>z+K){let H=Math.max($[0]-K,z);W.push({t:H,value:J(H),e:null})}}W.push(...Q),W.sort(($,H)=>$.t-H.t);let G=[];for(let $ of W)if(G.length&&Math.abs($.t-G[G.length-1].t)<0.000001)G[G.length-1]=$;else G.push($);return G}function e4(Z,Q){if(!(Z.x?.length||Z.y?.length))return[];return E1(Z.x,Z.y,Q[0],Q[1]).map((J)=>({t:J.t,value:`[${QZ(J.a)}, ${QZ(J.b)}]`,e:J.e}))}function ZV(Z,Q){let Y=(J)=>Q?`${QZ(J)}*${Q}`:`${QZ(J)}`;if(Z.scale?.length)return Z.scale.map((J)=>({t:J.t,value:`[${Y(s(J.v,1)*100)}, ${Y(s(J.v,1)*100)}]`,e:J.e}));if(Z.sx?.length||Z.sy?.length)return E1(Z.sx,Z.sy,1,1).map((z)=>({t:z.t,value:`[${Y(z.a*100)}, ${Y(z.b*100)}]`,e:z.e}));return[]}function yP(Z,Q,Y,J,z){let{tracks:X,warnings:V}=N2(Q);for(let F of V)Z.warnings.push(F);if(X.length===0)return;let W=Q.anim??{},K=[s(Q.pos?.[0],0),s(Q.pos?.[1],0)],G=s(Q.in,0),$=Math.max(G+0.01,s(Q.out,G+1)),H=(F)=>z?`${QZ(F)}*${z}`:`${QZ(F)}`,N=X.filter((F)=>F.prop==="brightness");if(N.length){Z.lines.push(" // fx: flicker → 亮度脉冲(ADBE Brightness & Contrast 2,避开 opacity 通道)"),Z.lines.push(` var flkFx = null; try { flkFx = ${Y}.property("ADBE Effect Parade").addProperty("ADBE Brightness & Contrast 2"); } catch (e) { flkFx = null; }`);for(let F of N){let R=F.times.map((O,P)=>({t:O,value:`${QZ(F.values[P][0])}`,e:null}));J0(Z,"flkFx.property(1)",R)}}let U=X.filter((F)=>F.prop==="position");if(U.length){let F=e4(W,K),R=[],O=[];for(let D of U){O.push(D.window);for(let T=0;T<D.times.length;T++)R.push({t:D.times[T],value:`[${QZ(D.values[T][0])}, ${QZ(D.values[T][1])}]`,e:null})}let P=j2(F,R,O,(D)=>{let[T,_]=vP(W,K,D);return`[${QZ(T)}, ${QZ(_)}]`},G,$);J0(Z,`${J}.property("ADBE Position")`,P)}let q=X.filter((F)=>F.prop==="scale");if(q.length){let F=ZV(W,z),R=[],O=[];for(let D of q){O.push(D.window);for(let T=0;T<D.times.length;T++)R.push({t:D.times[T],value:`[${H(D.values[T][0])}, ${H(D.values[T][1])}]`,e:null})}let P=j2(F,R,O,(D)=>{let[T,_]=wP(W,D);return`[${H(T*100)}, ${H(_*100)}]`},G,$);J0(Z,`${J}.property("ADBE Scale")`,P)}let M=X.filter((F)=>F.prop==="rotation");if(M.length){let F=(W.rot??[]).map((D)=>({t:D.t,value:`${QZ(s(D.v,0))}`,e:D.e})),R=[],O=[];for(let D of M){O.push(D.window);for(let T=0;T<D.times.length;T++)R.push({t:D.times[T],value:`${QZ(D.values[T][0])}`,e:null})}let P=j2(F,R,O,(D)=>`${QZ(sZ(W.rot,D,0))}`,G,$);J0(Z,`${J}.property("ADBE Rotate Z")`,P)}}function QV(Z,Q,Y,J){let{lines:z,compVar:X}=Z,V=Q.canvas,W=++Z.layerSeq,K=`ly${W}`,G=s(Y.in,0),$=Math.max(G+0.01,s(Y.out,V.duration)),H=s(Y.pos?.[0],V.w/2),N=s(Y.pos?.[1],V.h/2),U=V8(`${Y.id||"L"+W} [${Y.type}]`);if(z.push(""),z.push(` // ---- 层 ${U} in=${QZ(G)} out=${QZ($)} ----`),Y.type==="group"){if(z.push(` var ${K} = ${X}.layers.addNull(${QZ(V.duration)});`),z.push(` ${K}.name = "${U}";`),z.push(` ${K}.inPoint = ${QZ(G)}; ${K}.outPoint = ${QZ($)};`),z.push(` ${K}.property("ADBE Transform Group").property("ADBE Anchor Point").setValue([0,0]);`),z.push(` ${K}.property("ADBE Transform Group").property("ADBE Position").setValue([0,0]);`),J)z.push(` try { ${K}.parent = ${J}; } catch (e) {}`);xP(Z,K,Y),t4(Z,K,Y.fx);for(let D of Y.children??[])QV(Z,Q,D,K);return}let q=null,M=Y.type==="image"||Y.type==="video"?Z.footage[Y.id]:void 0,F=M?Z.footageVars.get(M.path):void 0;if(M&&F){let D=Math.max(2,Math.round(s(Y.w,V.w))),T=Math.max(2,Math.round(s(Y.h,V.h))),_=s(M.srcOffset,0),L=`cv${W}`;q=L,z.push(` // 素材注入(${V8(String(Y.type))}): footage srcOffset=${QZ(_)}`),z.push(` var ${K} = null, ${L} = 1;`),z.push(` if (${F} != null) {`),z.push(" try {"),z.push(` ${K} = ${X}.layers.add(${F});`),z.push(` var _fw = ${F}.width || ${D}, _fh = ${F}.height || ${T};`),z.push(` ${L} = Math.max(${D} / _fw, ${T} / _fh);`),z.push(` ${K}.startTime = ${QZ(G)} - ${QZ(_)};`),z.push(` } catch (e) { ${K} = null; }`),z.push(" }"),z.push(` if (${K} == null) {`),z.push(` ${K} = ${X}.layers.addSolid([0.35,0.35,0.4], "${U} [占位]", ${D}, ${T}, 1, ${QZ(V.duration)});`),z.push(` ${L} = 1;`),z.push(" }")}else if(Y.type==="text"){let D=o4(Y.font),T=s4(Y.color,[1,1,1]);z.push(` var ${K} = ${X}.layers.addText("${V8(Y.text??"")}");`),z.push(" try {"),z.push(` var td = ${K}.property("ADBE Text Properties").property("ADBE Text Document");`),z.push(" var tdv = td.value;"),z.push(` tdv.fontSize = ${Math.round(D)};`),z.push(` tdv.fillColor = [${T.join(",")}];`),z.push(" tdv.justification = ParagraphJustification.CENTER_JUSTIFY;"),z.push(" td.setValue(tdv);"),z.push(" } catch (e) {}")}else if(Y.type==="shape"){let D=s4(Y.fill,[0.2,0.33,0.67]),T=Math.max(2,Math.round(s(Y.w,400))),_=Math.max(2,Math.round(s(Y.h,400)));if(Y.shape==="ellipse")z.push(" // TODO: 原层为椭圆形状,固态占位,可手动换 shape layer");z.push(` var ${K} = ${X}.layers.addSolid([${D.join(",")}], "${U}", ${T}, ${_}, 1, ${QZ(V.duration)});`)}else{let D=Math.max(2,Math.round(s(Y.w,V.w))),T=Math.max(2,Math.round(s(Y.h,V.h)));z.push(` // 占位素材(${V8(String(Y.type))}${Y.asset?` asset=${V8(String(Y.asset))}`:""}): 请替换为真实素材`),z.push(` var ${K} = ${X}.layers.addSolid([0.35,0.35,0.4], "${U} [占位]", ${D}, ${T}, 1, ${QZ(V.duration)});`)}if(z.push(` ${K}.name = "${U}";`),z.push(` ${K}.inPoint = ${QZ(G)}; ${K}.outPoint = ${QZ($)};`),J)z.push(` try { ${K}.parent = ${J}; } catch (e) {}`);if(Y.blend&&Y.blend!=="normal"){z.push(` // 混合模式: ${V8(Y.blend)}`);let D=kP[Y.blend];if(D)z.push(` try { ${K}.blendingMode = BlendingMode.${D}; } catch (e) {}`)}let R=`${K}.property("ADBE Transform Group")`;z.push(` ${R}.property("ADBE Position").setValue([${QZ(H)}, ${QZ(N)}]);`);let O=Y.anim??{},P=new Set(Z.bakeOps?N2(Y).tracks.map((D)=>D.prop):[]);if((O.x?.length||O.y?.length)&&!P.has("position"))J0(Z,`${R}.property("ADBE Position")`,e4(O,[H,N]));if(!P.has("scale")){let D=ZV(O,q);if(D.length)J0(Z,`${R}.property("ADBE Scale")`,D);else if(q)z.push(` ${R}.property("ADBE Scale").setValue([100*${q}, 100*${q}]);`)}if(O.rot?.length&&!P.has("rotation"))J0(Z,`${R}.property("ADBE Rotate Z")`,O.rot.map((D)=>({t:D.t,value:`${QZ(s(D.v,0))}`,e:D.e})));if(O.opacity?.length)J0(Z,`${R}.property("ADBE Opacity")`,O.opacity.map((D)=>({t:D.t,value:`${QZ(Math.min(1,Math.max(0,s(D.v,1)))*100)}`,e:D.e})));if(O.ls?.length)z.push(` // TODO: letterspacing 轨未自动映射(AE 需 Animator>Tracking),共 ${O.ls.length} 帧`);if(t4(Z,K,Y.fx),Z.bakeOps)yP(Z,Y,K,R,q);if(Y.raw_fx?.length)z.push(` // TODO 原工程还有未解析特效: ${V8(Y.raw_fx.join(", "))}`)}function xP(Z,Q,Y){let J=Y.anim??{},z=s(Y.pos?.[0],0),X=s(Y.pos?.[1],0);if(J.x?.length||J.y?.length){let V=E1(J.x,J.y,z,X);J0(Z,`${Q}.property("ADBE Transform Group").property("ADBE Position")`,V.map((W)=>({t:W.t,value:`[${QZ(W.a-z)}, ${QZ(W.b-X)}]`,e:W.e})))}for(let V of["scale","rot","opacity"])if(J[V]?.length)Z.lines.push(` // TODO: 组自身 ${V} 动画未映射到 null(子层坐标为画布绝对值,直接缩放会偏移)`),Z.warnings.push(`jsx: 组 ${Y.id} 的 ${V} 动画需手动复现`)}var kP={screen:"SCREEN",add:"ADD",multiply:"MULTIPLY",overlay:"OVERLAY",lighten:"LIGHTEN",darken:"DARKEN","soft-light":"SOFT_LIGHT","hard-light":"HARD_LIGHT",difference:"DIFFERENCE",exclude:"EXCLUSION",hue:"HUE",color:"COLOR"};function YV(Z){return Z.replace(/\\/g,"/")}function fP(Z,Q){let Y=Z.lines,J=[...new Set(Q)];if(J.length===0)return;Y.push(" // —— 素材导入(每素材仅导入一次、变量缓存复用)——");let z=0;for(let X of J){let V=`fg${++z}`;Z.footageVars.set(X,V),Y.push(` var ${V} = null;`),Y.push(` try { ${V} = app.project.importFile(new ImportOptions(new File("${V8(YV(X))}"))); } catch (e) { ${V} = null; }`)}}function hP(Z){return{lines:[],warnings:[],layerSeq:0,compVar:Z?.compVar??"comp",footage:Z?.footage??{},bakeOps:!!Z?.bakeOps,footageVars:new Map}}function JV(Z){let{master:Q,windows:Y}=Z,J=Math.max(4,Math.round(Q.w)),z=Math.max(4,Math.round(Q.h)),X=Math.min(99,Math.max(1,Q.fps||30)),V=V8(Q.name??"MAD Master"),W=[];for(let U of Y)for(let q of Object.values(U.footage??{}))W.push(q.path);let K=hP({bakeOps:!0}),G=K.lines;G.push(Z.header??EP),G.push(""),G.push(`app.beginUndoGroup("MAD Rebuild ${V}");`),G.push("(function () {"),fP(K,W);let $=K.footageVars,H=0.1;for(let U of Y){let q=U.outLen??U.t1-U.t0;H=Math.max(H,U.dropAt+Math.max(0.01,q))}G.push(""),G.push(` var master = app.project.items.addComp("${V}", ${J}, ${z}, 1, ${QZ(H)}, ${QZ(X)});`),G.push(" try { master.bgColor = [0.04,0.04,0.07]; } catch (e) {}");let N=[];if(Y.forEach((U,q)=>{let M=U.ir.canvas,F=Math.max(4,Math.round(s(M.w,1920))),R=Math.max(4,Math.round(s(M.h,1080))),O=Math.min(99,Math.max(1,s(M.fps,30))),P=Math.max(0.1,s(M.duration,3)),D=V8(`${U.uid}-${U.seq}`),T=`sub${q}`;G.push(""),G.push(` // ==== 子合成 #${q} 技法 ${D}(源窗 t0=${QZ(U.t0)} t1=${QZ(U.t1)})====`),G.push(` var ${T} = app.project.items.addComp("${D}", ${F}, ${R}, 1, ${QZ(P)}, ${QZ(O)});`);let _={...U.footage??{}},L={lines:G,warnings:K.warnings,layerSeq:0,compVar:T,footage:_,bakeOps:!0,footageVars:$};for(let I of U.ir.layers??[])QV(L,U.ir,I,null);N.push({subVar:T,win:U})}),G.push(""),G.push(" // ==== 母合成裁窗串接(startTime=落点−t0,inPoint=落点,outPoint=落点+窗长)===="),N.forEach(({subVar:U,win:q},M)=>{let F=Math.max(0.01,q.outLen??q.t1-q.t0),R=`mL${M}`;G.push(` var ${R} = master.layers.add(${U});`),G.push(` ${R}.startTime = ${QZ(q.dropAt-q.t0)};`),G.push(` ${R}.inPoint = ${QZ(q.dropAt)};`),G.push(` ${R}.outPoint = ${QZ(q.dropAt+F)};`),G.push(" try {"),G.push(` var _cov = Math.max(${J} / ${U}.width, ${z} / ${U}.height) * 100;`),G.push(` ${R}.property("ADBE Transform Group").property("ADBE Scale").setValue([_cov, _cov]);`),G.push(` ${R}.property("ADBE Transform Group").property("ADBE Position").setValue([${J/2}, ${z/2}]);`),G.push(" } catch (e) {}")}),Z.bgm){G.push(""),G.push(" // ==== BGM 入轨(importFile 包 try/catch,AE 侧文件缺失/损坏脚本继续跑完仅缺音轨)===="),G.push(" try {"),G.push(` var bgm = app.project.importFile(new ImportOptions(new File("${V8(YV(Z.bgm.path))}")));`),G.push(" var bgmL = master.layers.add(bgm);"),G.push(" bgmL.startTime = 0;"),G.push(" } catch (e) {}");let U=Z.bgm.markers??[];if(U.length){G.push(" // beat marker(downbeat 带标签区分)"),G.push(" try {"),G.push(' var mk = master.property("ADBE Marker");');for(let q of U){let M=q.downbeat?"downbeat":"beat";G.push(` mk.setValueAtTime(${QZ(q.t)}, new MarkerValue("${M}"));`)}G.push(" } catch (e) {}")}}return G.push(""),G.push(" master.openInViewer();"),G.push("})();"),G.push("app.endUndoGroup();"),{jsx:G.join(`
|
|
235
|
+
// 用法: AE 菜单 文件>脚本>运行脚本文件 选择本文件(AE 2020+ 建议)`,uO={glow:"ADBE Glo2",blur:"ADBE Gaussian Blur 2",dirBlur:"ADBE Motion Blur",turbulence:"ADBE Turbulent Displace",tile:"ADBE Tile",dropShadow:"ADBE Drop Shadow",invert:"ADBE Invert",wipe:"ADBE Linear Wipe",bulge:"ADBE Bulge",noise:"ADBE Noise",fill:"ADBE Fill",vignette:"ADBE Vignette",colorAdjust:"ADBE Brightness & Contrast 2"};function $8(Z){return String(Z).replace(/\\/g,"\\\\").replace(/"/g,"\\\"").replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(new RegExp(String.fromCharCode(8232),"g"),"\\u2028").replace(new RegExp(String.fromCharCode(8233),"g"),"\\u2029")}function ZZ(Z){return Math.round(Z*1000)/1000}function XV(Z,Q){let Y=JV(Z);if(!Y)return Q;return[ZZ(Y[0]/255),ZZ(Y[1]/255),ZZ(Y[2]/255)]}function mO(Z){let Q=QV(Z);if(!Q)return null;let Y=(J)=>Math.min(100,Math.max(0.1,J));return{out:Y(Q[0]*100||33),inn:Y((1-Q[2])*100||33)}}function W0(Z,Q,Y){if(Y.length===0)return;let J=Z.lines;J.push(" try {"),J.push(` var p = ${Q};`);for(let z of Y)J.push(` p.setValueAtTime(${ZZ(z.t)}, ${z.value});`);Y.forEach((z,X)=>{let W=mO(z.e);if(!W)return;J.push(" try {"),J.push(" var dim = 1; try { dim = p.value.length || 1; } catch (e) { dim = 1; }"),J.push(" var eo = [], ei = [];"),J.push(` for (var d = 0; d < Math.min(dim, 3); d++) { eo.push(new KeyframeEase(0, ${ZZ(W.out)})); ei.push(new KeyframeEase(0, ${ZZ(W.inn)})); }`),J.push(` p.setTemporalEaseAtKey(${X+1}, ei, eo);`),J.push(" } catch (e) {}")}),J.push(" } catch (e) {}")}function R2(Z){let Q=Object.keys(Z).filter((J)=>!["op","src","tracks"].includes(J)).map((J)=>`${J}=${JSON.stringify(Z[J])}`).join(" "),Y=Z.tracks?` tracks:[${Object.keys(Z.tracks).join(",")}]`:"";return`${Z.op}${Z.src?` (原特效: ${Z.src})`:""}${Q?" "+Q:""}${Y}`}function WV(Z,Q,Y){if(!Y||Y.length===0)return;let J=Z.lines;J.push(" // —— 特效(原工程特效清单,已知 matchName 自动 applyEffect,其余 TODO 手动补)——");for(let z of Y){let X=uO[z.op];if(Z.bakeOps&&kQ.has(z.op))continue;if(X&&!kQ.has(z.op))J.push(` // fx: ${$8(R2(z))}`),J.push(` try { ${Q}.property("ADBE Effect Parade").addProperty("${X}"); } catch (e) {}`);else if(kQ.has(z.op))J.push(` // TODO fx(时序算子,请用表达式或关键帧手动复现): ${$8(R2(z))}`),Z.warnings.push(`jsx: 时序算子 ${z.op} 未自动铺帧(已写 TODO 注释)`);else J.push(` // TODO fx(无对应 AE 原生 matchName): ${$8(R2(z))}`),Z.warnings.push(`jsx: 未映射特效 ${z.op}(已写 TODO 注释)`)}}function cO(Z,Q,Y){return[eZ(Z.x,Y,Q[0]),eZ(Z.y,Y,Q[1])]}function lO(Z,Q){if(Z.scale?.length){let Y=eZ(Z.scale,Q,1);return[Y,Y]}if(Z.sx?.length||Z.sy?.length)return[eZ(Z.sx,Q,1),eZ(Z.sy,Q,1)];return[1,1]}function D2(Z,Q,Y,J,z,X){let W=($)=>{for(let H of Y)if($>H[0]+0.000001&&$<H[1]-0.000001)return!0;return!1},V=[];for(let $ of Z)if(!W($.t))V.push($);let K=0.033;for(let $ of Y){if($[1]<X-K){let H=Math.min($[1]+K,X);V.push({t:H,value:J(H),e:null})}if($[0]>z+K){let H=Math.max($[0]-K,z);V.push({t:H,value:J(H),e:null})}}V.push(...Q),V.sort(($,H)=>$.t-H.t);let G=[];for(let $ of V)if(G.length&&Math.abs($.t-G[G.length-1].t)<0.000001)G[G.length-1]=$;else G.push($);return G}function VV(Z,Q){if(!(Z.x?.length||Z.y?.length))return[];return y1(Z.x,Z.y,Q[0],Q[1]).map((J)=>({t:J.t,value:`[${ZZ(J.a)}, ${ZZ(J.b)}]`,e:J.e}))}function KV(Z,Q){let Y=(J)=>Q?`${ZZ(J)}*${Q}`:`${ZZ(J)}`;if(Z.scale?.length)return Z.scale.map((J)=>({t:J.t,value:`[${Y(s(J.v,1)*100)}, ${Y(s(J.v,1)*100)}]`,e:J.e}));if(Z.sx?.length||Z.sy?.length)return y1(Z.sx,Z.sy,1,1).map((z)=>({t:z.t,value:`[${Y(z.a*100)}, ${Y(z.b*100)}]`,e:z.e}));return[]}function dO(Z,Q,Y,J,z){let{tracks:X,warnings:W}=M2(Q);for(let M of W)Z.warnings.push(M);if(X.length===0)return;let V=Q.anim??{},K=[s(Q.pos?.[0],0),s(Q.pos?.[1],0)],G=s(Q.in,0),$=Math.max(G+0.01,s(Q.out,G+1)),H=(M)=>z?`${ZZ(M)}*${z}`:`${ZZ(M)}`,N=X.filter((M)=>M.prop==="brightness");if(N.length){Z.lines.push(" // fx: flicker → 亮度脉冲(ADBE Brightness & Contrast 2,避开 opacity 通道)"),Z.lines.push(` var flkFx = null; try { flkFx = ${Y}.property("ADBE Effect Parade").addProperty("ADBE Brightness & Contrast 2"); } catch (e) { flkFx = null; }`);for(let M of N){let R=M.times.map((D,O)=>({t:D,value:`${ZZ(M.values[O][0])}`,e:null}));W0(Z,"flkFx.property(1)",R)}}let q=X.filter((M)=>M.prop==="position");if(q.length){let M=VV(V,K),R=[],D=[];for(let C of q){D.push(C.window);for(let T=0;T<C.times.length;T++)R.push({t:C.times[T],value:`[${ZZ(C.values[T][0])}, ${ZZ(C.values[T][1])}]`,e:null})}let O=D2(M,R,D,(C)=>{let[T,_]=cO(V,K,C);return`[${ZZ(T)}, ${ZZ(_)}]`},G,$);W0(Z,`${J}.property("ADBE Position")`,O)}let U=X.filter((M)=>M.prop==="scale");if(U.length){let M=KV(V,z),R=[],D=[];for(let C of U){D.push(C.window);for(let T=0;T<C.times.length;T++)R.push({t:C.times[T],value:`[${H(C.values[T][0])}, ${H(C.values[T][1])}]`,e:null})}let O=D2(M,R,D,(C)=>{let[T,_]=lO(V,C);return`[${H(T*100)}, ${H(_*100)}]`},G,$);W0(Z,`${J}.property("ADBE Scale")`,O)}let F=X.filter((M)=>M.prop==="rotation");if(F.length){let M=(V.rot??[]).map((C)=>({t:C.t,value:`${ZZ(s(C.v,0))}`,e:C.e})),R=[],D=[];for(let C of F){D.push(C.window);for(let T=0;T<C.times.length;T++)R.push({t:C.times[T],value:`${ZZ(C.values[T][0])}`,e:null})}let O=D2(M,R,D,(C)=>`${ZZ(eZ(V.rot,C,0))}`,G,$);W0(Z,`${J}.property("ADBE Rotate Z")`,O)}}function GV(Z,Q,Y,J){let{lines:z,compVar:X}=Z,W=Q.canvas,V=++Z.layerSeq,K=`ly${V}`,G=s(Y.in,0),$=Math.max(G+0.01,s(Y.out,W.duration)),H=s(Y.pos?.[0],W.w/2),N=s(Y.pos?.[1],W.h/2),q=$8(`${Y.id||"L"+V} [${Y.type}]`);if(z.push(""),z.push(` // ---- 层 ${q} in=${ZZ(G)} out=${ZZ($)} ----`),Y.type==="group"){if(z.push(` var ${K} = ${X}.layers.addNull(${ZZ(W.duration)});`),z.push(` ${K}.name = "${q}";`),z.push(` ${K}.inPoint = ${ZZ(G)}; ${K}.outPoint = ${ZZ($)};`),z.push(` ${K}.property("ADBE Transform Group").property("ADBE Anchor Point").setValue([0,0]);`),z.push(` ${K}.property("ADBE Transform Group").property("ADBE Position").setValue([0,0]);`),J)z.push(` try { ${K}.parent = ${J}; } catch (e) {}`);nO(Z,K,Y),WV(Z,K,Y.fx);for(let C of Y.children??[])GV(Z,Q,C,K);return}let U=null,F=Y.type==="image"||Y.type==="video"?Z.footage[Y.id]:void 0,M=F?Z.footageVars.get(F.path):void 0;if(F&&M){let C=Math.max(2,Math.round(s(Y.w,W.w))),T=Math.max(2,Math.round(s(Y.h,W.h))),_=s(F.srcOffset,0),P=`cv${V}`;U=P,z.push(` // 素材注入(${$8(String(Y.type))}): footage srcOffset=${ZZ(_)}`),z.push(` var ${K} = null, ${P} = 1;`),z.push(` if (${M} != null) {`),z.push(" try {"),z.push(` ${K} = ${X}.layers.add(${M});`),z.push(` var _fw = ${M}.width || ${C}, _fh = ${M}.height || ${T};`),z.push(` ${P} = Math.max(${C} / _fw, ${T} / _fh);`),z.push(` ${K}.startTime = ${ZZ(G)} - ${ZZ(_)};`),z.push(` } catch (e) { ${K} = null; }`),z.push(" }"),z.push(` if (${K} == null) {`),z.push(` ${K} = ${X}.layers.addSolid([0.35,0.35,0.4], "${q} [占位]", ${C}, ${T}, 1, ${ZZ(W.duration)});`),z.push(` ${P} = 1;`),z.push(" }")}else if(Y.type==="text"){let C=YV(Y.font),T=XV(Y.color,[1,1,1]);z.push(` var ${K} = ${X}.layers.addText("${$8(Y.text??"")}");`),z.push(" try {"),z.push(` var td = ${K}.property("ADBE Text Properties").property("ADBE Text Document");`),z.push(" var tdv = td.value;"),z.push(` tdv.fontSize = ${Math.round(C)};`),z.push(` tdv.fillColor = [${T.join(",")}];`),z.push(" tdv.justification = ParagraphJustification.CENTER_JUSTIFY;"),z.push(" td.setValue(tdv);"),z.push(" } catch (e) {}")}else if(Y.type==="shape"){let C=XV(Y.fill,[0.2,0.33,0.67]),T=Math.max(2,Math.round(s(Y.w,400))),_=Math.max(2,Math.round(s(Y.h,400)));if(Y.shape==="ellipse")z.push(" // TODO: 原层为椭圆形状,固态占位,可手动换 shape layer");z.push(` var ${K} = ${X}.layers.addSolid([${C.join(",")}], "${q}", ${T}, ${_}, 1, ${ZZ(W.duration)});`)}else{let C=Math.max(2,Math.round(s(Y.w,W.w))),T=Math.max(2,Math.round(s(Y.h,W.h)));z.push(` // 占位素材(${$8(String(Y.type))}${Y.asset?` asset=${$8(String(Y.asset))}`:""}): 请替换为真实素材`),z.push(` var ${K} = ${X}.layers.addSolid([0.35,0.35,0.4], "${q} [占位]", ${C}, ${T}, 1, ${ZZ(W.duration)});`)}if(z.push(` ${K}.name = "${q}";`),z.push(` ${K}.inPoint = ${ZZ(G)}; ${K}.outPoint = ${ZZ($)};`),J)z.push(` try { ${K}.parent = ${J}; } catch (e) {}`);if(Y.blend&&Y.blend!=="normal"){z.push(` // 混合模式: ${$8(Y.blend)}`);let C=pO[Y.blend];if(C)z.push(` try { ${K}.blendingMode = BlendingMode.${C}; } catch (e) {}`)}let R=`${K}.property("ADBE Transform Group")`;z.push(` ${R}.property("ADBE Position").setValue([${ZZ(H)}, ${ZZ(N)}]);`);let D=Y.anim??{},O=new Set(Z.bakeOps?M2(Y).tracks.map((C)=>C.prop):[]);if((D.x?.length||D.y?.length)&&!O.has("position"))W0(Z,`${R}.property("ADBE Position")`,VV(D,[H,N]));if(!O.has("scale")){let C=KV(D,U);if(C.length)W0(Z,`${R}.property("ADBE Scale")`,C);else if(U)z.push(` ${R}.property("ADBE Scale").setValue([100*${U}, 100*${U}]);`)}if(D.rot?.length&&!O.has("rotation"))W0(Z,`${R}.property("ADBE Rotate Z")`,D.rot.map((C)=>({t:C.t,value:`${ZZ(s(C.v,0))}`,e:C.e})));if(D.opacity?.length)W0(Z,`${R}.property("ADBE Opacity")`,D.opacity.map((C)=>({t:C.t,value:`${ZZ(Math.min(1,Math.max(0,s(C.v,1)))*100)}`,e:C.e})));if(D.ls?.length)z.push(` // TODO: letterspacing 轨未自动映射(AE 需 Animator>Tracking),共 ${D.ls.length} 帧`);if(WV(Z,K,Y.fx),Z.bakeOps)dO(Z,Y,K,R,U);if(Y.raw_fx?.length)z.push(` // TODO 原工程还有未解析特效: ${$8(Y.raw_fx.join(", "))}`)}function nO(Z,Q,Y){let J=Y.anim??{},z=s(Y.pos?.[0],0),X=s(Y.pos?.[1],0);if(J.x?.length||J.y?.length){let W=y1(J.x,J.y,z,X);W0(Z,`${Q}.property("ADBE Transform Group").property("ADBE Position")`,W.map((V)=>({t:V.t,value:`[${ZZ(V.a-z)}, ${ZZ(V.b-X)}]`,e:V.e})))}for(let W of["scale","rot","opacity"])if(J[W]?.length)Z.lines.push(` // TODO: 组自身 ${W} 动画未映射到 null(子层坐标为画布绝对值,直接缩放会偏移)`),Z.warnings.push(`jsx: 组 ${Y.id} 的 ${W} 动画需手动复现`)}var pO={screen:"SCREEN",add:"ADD",multiply:"MULTIPLY",overlay:"OVERLAY",lighten:"LIGHTEN",darken:"DARKEN","soft-light":"SOFT_LIGHT","hard-light":"HARD_LIGHT",difference:"DIFFERENCE",exclude:"EXCLUSION",hue:"HUE",color:"COLOR"};function $V(Z){return Z.replace(/\\/g,"/")}function iO(Z,Q){let Y=Z.lines,J=[...new Set(Q)];if(J.length===0)return;Y.push(" // —— 素材导入(每素材仅导入一次、变量缓存复用)——");let z=0;for(let X of J){let W=`fg${++z}`;Z.footageVars.set(X,W),Y.push(` var ${W} = null;`),Y.push(` try { ${W} = app.project.importFile(new ImportOptions(new File("${$8($V(X))}"))); } catch (e) { ${W} = null; }`)}}function oO(Z){return{lines:[],warnings:[],layerSeq:0,compVar:Z?.compVar??"comp",footage:Z?.footage??{},bakeOps:!!Z?.bakeOps,footageVars:new Map}}function HV(Z){let{master:Q,windows:Y}=Z,J=Math.max(4,Math.round(Q.w)),z=Math.max(4,Math.round(Q.h)),X=Math.min(99,Math.max(1,Q.fps||30)),W=$8(Q.name??"MAD Master"),V=[];for(let q of Y)for(let U of Object.values(q.footage??{}))V.push(U.path);let K=oO({bakeOps:!0}),G=K.lines;G.push(Z.header??gO),G.push(""),G.push(`app.beginUndoGroup("MAD Rebuild ${W}");`),G.push("(function () {"),iO(K,V);let $=K.footageVars,H=0.1;for(let q of Y){let U=q.outLen??q.t1-q.t0;H=Math.max(H,q.dropAt+Math.max(0.01,U))}G.push(""),G.push(` var master = app.project.items.addComp("${W}", ${J}, ${z}, 1, ${ZZ(H)}, ${ZZ(X)});`),G.push(" try { master.bgColor = [0.04,0.04,0.07]; } catch (e) {}");let N=[];if(Y.forEach((q,U)=>{let F=q.ir.canvas,M=Math.max(4,Math.round(s(F.w,1920))),R=Math.max(4,Math.round(s(F.h,1080))),D=Math.min(99,Math.max(1,s(F.fps,30))),O=Math.max(0.1,s(F.duration,3)),C=$8(`${q.uid}-${q.seq}`),T=`sub${U}`;G.push(""),G.push(` // ==== 子合成 #${U} 技法 ${C}(源窗 t0=${ZZ(q.t0)} t1=${ZZ(q.t1)})====`),G.push(` var ${T} = app.project.items.addComp("${C}", ${M}, ${R}, 1, ${ZZ(O)}, ${ZZ(D)});`);let _={...q.footage??{}},P={lines:G,warnings:K.warnings,layerSeq:0,compVar:T,footage:_,bakeOps:!0,footageVars:$};for(let E of q.ir.layers??[])GV(P,q.ir,E,null);N.push({subVar:T,win:q})}),G.push(""),G.push(" // ==== 母合成裁窗串接(startTime=落点−t0,inPoint=落点,outPoint=落点+窗长)===="),N.forEach(({subVar:q,win:U},F)=>{let M=Math.max(0.01,U.outLen??U.t1-U.t0),R=`mL${F}`;G.push(` var ${R} = master.layers.add(${q});`),G.push(` ${R}.startTime = ${ZZ(U.dropAt-U.t0)};`),G.push(` ${R}.inPoint = ${ZZ(U.dropAt)};`),G.push(` ${R}.outPoint = ${ZZ(U.dropAt+M)};`),G.push(" try {"),G.push(` var _cov = Math.max(${J} / ${q}.width, ${z} / ${q}.height) * 100;`),G.push(` ${R}.property("ADBE Transform Group").property("ADBE Scale").setValue([_cov, _cov]);`),G.push(` ${R}.property("ADBE Transform Group").property("ADBE Position").setValue([${J/2}, ${z/2}]);`),G.push(" } catch (e) {}")}),Z.bgm){G.push(""),G.push(" // ==== BGM 入轨(importFile 包 try/catch,AE 侧文件缺失/损坏脚本继续跑完仅缺音轨)===="),G.push(" try {"),G.push(` var bgm = app.project.importFile(new ImportOptions(new File("${$8($V(Z.bgm.path))}")));`),G.push(" var bgmL = master.layers.add(bgm);"),G.push(" bgmL.startTime = 0;"),G.push(" } catch (e) {}");let q=Z.bgm.markers??[];if(q.length){G.push(" // beat marker(downbeat 带标签区分)"),G.push(" try {"),G.push(' var mk = master.property("ADBE Marker");');for(let U of q){let F=U.downbeat?"downbeat":"beat";G.push(` mk.setValueAtTime(${ZZ(U.t)}, new MarkerValue("${F}"));`)}G.push(" } catch (e) {}")}}return G.push(""),G.push(" master.openInViewer();"),G.push("})();"),G.push("app.endUndoGroup();"),{jsx:G.join(`
|
|
236
236
|
`)+`
|
|
237
|
-
`,warnings:K.warnings}}import{readdirSync as
|
|
238
|
-
`)}function
|
|
239
|
-
`)}function
|
|
240
|
-
`)),z=Y.emitBilling??((
|
|
241
|
-
`)),X=(Y.now??(()=>new Date))(),
|
|
242
|
-
`);if(!J.trim()||Q.length===0)throw Error("ASR 任务已完成,但没有返回可用的文字或句级时间戳");return{text:J.trim(),sentences:Q,words:Y}}function
|
|
243
|
-
`)}var
|
|
244
|
-
`),"utf8").digest("hex"),duration:_(H.duration),utterances:
|
|
245
|
-
`);let N;if(
|
|
246
|
-
`);if(!_){j.err(`产物下载失败:${JSON.stringify(T)}。可凭 task.json 的 taskId 稍后恢复。`),process.exitCode=1;return}j.ok(`完成。产物目录:${$}`)}import{existsSync as ZC,readdirSync as QC,statSync as YC}from"node:fs";import{join as JC}from"node:path";function bV(Z){let Q=Z.command("deps").description("运行时资产:查看状态 / 显式安装 ffmpeg 与渲染字体");Q.command("status").description("查看 ffmpeg / 字体的当前来源、版本与授权信息").option("--ffmpeg-path <dir>","显式 ffmpeg/ffprobe 目录").action(async(Y)=>{await zC(Y.ffmpegPath)}),Q.command("install").description("从同合云镜像安装运行时资产(已存在则跳过)").option("--ffmpeg","只装 ffmpeg/ffprobe").option("--font","只装渲染字体").option("--force","已存在也覆盖重装").action(async(Y)=>{await XC(Y)})}function T2(Z){return`${(Z/1048576).toFixed(1)} MB`}async function zC(Z){j.step("① ffmpeg / ffprobe");let Q=f8(Z);if(Q){j.ok(`来源:${Q.source}`);try{let X=R6(Q);j.info(X.version),j.info(`libx264 ${X.hasLibx264?"✅":"❌"} ass 滤镜 ${X.filters.has("ass")?"✅":"❌"}`)}catch{j.warn("二进制存在但探测能力失败")}}else j.warn("未找到。装它:gtrk deps install --ffmpeg");j.step("② 渲染字体");let Y=o8(),J=ZC(Y)?QC(Y).filter((X)=>/\.(otf|ttf|ttc|otc)$/i.test(X)):[];if(J.length){j.ok(`${Y}(${J.length} 个)`);for(let X of J)j.info(`${X} ${T2(YC(JC(Y,X)).size)}`);j.info("经 ass 滤镜 fontsdir 供给 libass,未安装进系统字体表")}else j.warn(`${Y} 无字体。装它:gtrk deps install --font`),j.info("(系统已装所需字体时也可直接用,两处任一命中即可)");j.step("③ 分发物授权与源码");let z=null;try{z=await l5()}catch(X){j.warn(`取 manifest 失败:${X instanceof Error?X.message:String(X)}`)}if(z){let X="";try{X=w6()}catch{}for(let[V,W]of Object.entries(z.ffmpeg)){let K=V===X?"→":" ";j.info(`${K} ${V.padEnd(10)} ${W.version.padEnd(20)} ${W.license} 源码 ${W.source}`)}for(let[V,W]of Object.entries(z.font))j.info(` 字体 ${V} ${W.license}`);j.info(`合规说明:${z.base}/SOURCE.md`),j.info("分发不附加任何使用限制(不限 gtrk 用户、不禁转发)")}}async function XC(Z){let Q=Z.ffmpeg||!Z.font,Y=Z.font||!Z.ffmpeg;j.step(`读 manifest:${m5}`);let J=await l5();j.info(`schema ${J.schema},生成于 ${J.generated}`);let z=-1,X=0,V=(W,K)=>{if(K<=0)return;let G=Math.floor(W/K*100),$=Date.now();if(G<100&&G-z<5&&$-X<2000)return;z=G,X=$,j.tick(`下载 ${T2(W)} / ${T2(K)}(${G}%)`)};if(Q){let W=w6();j.step(`① ffmpeg(${W})`);let K=await qz(J,{force:Z.force,onProgress:V});if(j.tickEnd(),K.installed)j.ok(`已安装 ${K.detail}`);else j.info(`跳过(${K.reason}):${K.detail}`)}if(Y){j.step("② 渲染字体");let W=await Uz(J,{force:Z.force,onProgress:V});j.tickEnd();for(let K of W)if(K.installed)j.ok(`已安装 ${K.detail}`);else j.info(`跳过(${K.reason}):${K.detail}`);j.info("未写系统字体表、未改注册表——烧录时经 ass 滤镜 fontsdir 供给")}j.ok(`完成。二进制在 ${i8()},字体在 ${o8()}`)}import{existsSync as gV}from"node:fs";import{mkdir as A2,readFile as WC,writeFile as E2}from"node:fs/promises";import{basename as I2,dirname as VC,extname as uV,join as z0,resolve as S2}from"node:path";var KC="cli/audio_project_struct",GC="audio_tts_clone",$C=[1080,1920];function HC(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}var f1=(Z)=>Math.round(Z*1000)/1000;function qC(Z){if(!Z||Z.length===0)throw Error("缺少子命令——用法:gtrk project init --tts-task <task_id> | --audio <配音> --transcript <json>");if(Z[0]!=="init"||Z.length>1)throw Error(`未知子命令「${Z.join(" ")}」——当前仅支持:gtrk project init`);return"init"}function UC(Z){if(Z===void 0)return[...$C];let Q=/^(\d{2,5})[xX](\d{2,5})$/.exec(Z.trim());if(!Q)throw Error(`--canvas 取值非法(${Z})——格式 WxH(如 1080x1920)`);let Y=Number(Q[1]),J=Number(Q[2]);if(!(Y>0&&J>0))throw Error(`--canvas 取值非法(${Z})——宽高必须为正整数`);return[Y,J]}function NC(Z,Q){let Y=Z;if(!Y||typeof Y!=="object"||!Array.isArray(Y.utterances)||Y.utterances.length===0)throw Error(`transcript.json 结构异常(缺 utterances 数组或为空):${Q}——请用 gtrk transcript <配音音频> --json 产出`);let J=Y.utterances.map((W,K)=>{let G=W??{},$=typeof G.text==="string"?G.text:"",H=Number(G.st),N=Number(G.ed);if(!$||!Number.isFinite(H)||!Number.isFinite(N)||N<H||H<0)throw Error(`transcript.json 第 ${K+1} 条 utterance 非法(需 text 非空、0 ≤ st ≤ ed):${Q}`);return{id:typeof G.id==="string"&&G.id?G.id:`u${K+1}`,text:$,st:f1(H),ed:f1(N)}}),z=Number(Y.duration),X=J.reduce((W,K)=>Math.max(W,K.ed),0),V=Number.isFinite(z)&&z>0?f1(z):f1(X);if(!(V>0))throw Error(`transcript.json 推不出有效时长(duration 缺失且句级时码全 0):${Q}`);return{utterances:J,duration:V}}function BC(Z,Q,Y){let J=Array.isArray(Z.materials)?Z.materials:[],z=typeof Q.material_id==="string"?Q.material_id:void 0,X=z?J.filter((V)=>V.id===z):[];if(X.length===0)X=J;for(let V of X)V.path=Y;return X.length}async function v2(Z,Q,Y=fetch){let J=await Y(`${Z.base}/task/${KC}`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Q)}),z=await aZ(J),X=z.data??{},V=(W)=>!!W&&typeof W==="object"&&!Array.isArray(W);if(z.code===200&&V(X.gtrk)&&V(X.transcript))return{gtrk:X.gtrk,transcript:X.transcript,taskId:X.task_id!=null?String(X.task_id):null};if(z.code===200)throw Error("工程生成响应缺 gtrk/transcript(非 audio_project_struct 契约响应)");throw new PZ(z.code,`工程生成失败 (code=${z.code??"?"}):${z.msg??"未知错误"}`)}async function jC(Z,Q,Y,J,z){let V=await z.upload(Z,Q,{force:J.force});if(j.info(V.cached?`命中上传缓存,复用 file_id = ${V.fileId}(免二次上传)`:`file_id = ${V.fileId}`),V.cached)try{return{resp:await v2(Z,Y(V.fileId),z.fetchFn),fileId:V.fileId}}catch(W){if(O0(W)!==6004)throw W;j.warn("缓存的 file_id 在云端已失效,重新上传后重试…"),await z.invalidate(Q),V=await z.upload(Z,Q,{force:!0})}for(let W=0;;W++)try{return{resp:await v2(Z,Y(V.fileId),z.fetchFn),fileId:V.fileId}}catch(K){if(O0(K)!==6004||W>=D9.length)throw K;await z.sleep(D9[W])}}async function FC(Z,Q={}){if(Z.json)NZ();let Y=!!Z.ttsTask?.trim(),J=!!Z.audio,z=!!Z.transcript;if(Y&&(J||z))throw Error("--tts-task 与 --audio/--transcript 互斥:主路引用 TTS 任务,兜底路自备配音,二选一");if(!Y&&!(J&&z))throw Error("需要 --tts-task <task_id>(主路:刚完成的 audio_tts_clone 任务)或 --audio <配音> --transcript <transcript.json> 成对(兜底路:自备配音)");let X=UC(Z.canvas),V=Z.keepPunctuation?{strip_punctuation:!1}:{},W,K;if(!Y){if(W=S2(Z.audio),!gV(W))throw Error(`配音音频不存在:${W}`);let _=uV(W).toLowerCase();if(!(mZ("audio")??[]).includes(_))throw Error(`不支持的音频格式「${_||"无扩展名"}」;请输入本地配音音频文件(wav/mp3/flac/m4a/aac/ogg 等)`);let L=S2(Z.transcript);if(!gV(L))throw Error(`找不到 transcript.json:${L}`);let I;try{I=JSON.parse(await WC(L,"utf8"))}catch(E){throw Error(`transcript.json 不是合法 JSON:${L}(${E instanceof Error?E.message:String(E)})`)}K=NC(I,L)}let G=Q.cfg??FZ(),$={fetchFn:Q.fetchFn??fetch,upload:Q.upload??uZ,invalidate:Q.invalidate??z8,getTtsResult:Q.getTtsResult??T8,download:Q.download??h8,openFolder:Q.openFolder??M0,sleep:Q.sleep??((_)=>new Promise((L)=>setTimeout(L,_)))},H=Y?`tts-${Z.ttsTask.trim()}`:I2(W,uV(W)),N=Y?process.cwd():VC(W),U=S2(Z.out??z0(N,`${H}-video-project-${HC()}`));if(j.step(`▶ 音频驱动工程起盘:${Y?`TTS 任务 ${Z.ttsTask}`:I2(W)}(画布 ${X[0]}x${X[1]})`),j.info("工程 JSON 由服务端 producer 同步口生成(emit 链单一权威源);本接口 0 积分不计费。"),Z.keepPunctuation)j.info("保留原始标点(--keep-punctuation):transcript 文稿逐字保留逗号句号");let q,M;if(Y)j.step("① 服务端拼装工程(TTS 产物 segments 直出,零 ASR)…"),q=await v2(G,{tts_task_id:Z.ttsTask.trim(),canvas:X,...V},$.fetchFn);else{j.step("① 上传配音并请求服务端拼装工程…");let _=await jC(G,W,(L)=>({file_id:L,utterances:K.utterances,duration:K.duration,canvas:X,...V}),{force:Z.reupload},$);q=_.resp,M=_.fileId}if(q.taskId)j.info(`task_id = ${q.taskId}`);j.step("② 落地产物目录(gtrk / transcript / result.json)…");let F={};await A2(z0(U,"gtrk"),{recursive:!0}),await A2(z0(U,"transcript"),{recursive:!0});let R=null;if(Y)try{let _=await $.getTtsResult(G,GC,Z.ttsTask.trim()),L=HZ(_.output,["download_url"]);if(!L)throw Error("TTS 任务产物缺 download_url(任务未完成或产物已过期)");await A2(z0(U,"audio"),{recursive:!0});let I=z0(U,"audio",`tts-${Z.ttsTask.trim()}${VZ(L,".wav")}`);await $.download(L,I),R=I,j.info(`TTS 配音已下载:${I2(I)}`)}catch(_){let L=_ instanceof Error?_.message:String(_);F["tts_audio:download"]=L,j.warn(`TTS 产物音频下载失败(${L})——工程照常落地,但配音素材路径未本地化,客户端打开需手动定位素材`)}else R=W;let O=0;if(R){if(O=BC(q.gtrk,q.transcript,R),O===0)F["gtrk:materials"]="工程 materials 为空,无从改写配音素材路径(服务端契约异常)",j.warn(F["gtrk:materials"])}let P=z0(U,"gtrk","project.gtrk"),D=z0(U,"transcript","transcript.json");await E2(P,JSON.stringify(q.gtrk,null,2)),await E2(D,JSON.stringify(q.transcript,null,2));let T={ok:Object.keys(F).length===0,mode:"init",outDir:U,gtrkPath:P,transcriptPath:D,audioPath:R,taskId:q.taskId,...Y?{ttsTaskId:Z.ttsTask.trim()}:{},...M?{fileId:M}:{},canvas:X,rewritten:O,errors:F};if(await E2(z0(U,"result.json"),JSON.stringify(T,null,2)),!Z.json)j.step("三方打开(产物已就位,按需自取):"),console.log(` • ${WQ.gtrk.label}:${WQ.gtrk.openHint(P)}`),console.log(` • 结果清单:${z0(U,"result.json")}`);if(Z.open!==!1)$.openFolder(U),j.info("已打开产物目录文件夹");if(j.ok(`配音打底工程已就绪:${U}(可直接 gtrk split --project 投影拆分)`),Z.json)console.log(JSON.stringify(T));return T}function mV(Z){Z.command("project [words...]").description("音频驱动工程族:gtrk project init 从配音起盘建 .gtrk 工程(主路 --tts-task 引用 TTS 任务;兜底 --audio+--transcript 自备配音)").option("--tts-task <task_id>","主路:引用已完成的 audio_tts_clone 任务(服务端取产物音频+句级 segments,零 ASR)").option("--audio <file>","兜底路:自备配音音频(与 --transcript 成对使用;CLI 先上传归一)").option("--transcript <file>","兜底路:transcript.json(gtrk transcript <配音音频> --json 产出)").option("--canvas <WxH>","画布尺寸(默认 1080x1920)").option("-o, --out <dir>","产物目录(缺省 = <基目录>/<名>-video-project-<YYMMDD-HHMMSS>)").option("--reupload","兜底路:强制重新上传配音音频,忽略本地上传缓存").option("--keep-punctuation","transcript 文稿保留全部标点(缺省按统一口径去逗号句号、保留?!等)").option("--no-open","完成后不自动打开产物目录(默认会自动打开)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{qC(Q),await FC(Y)})}import{existsSync as m9}from"node:fs";import{createHash as AC}from"node:crypto";import{basename as g2,extname as u2,join as QK,resolve as x0}from"node:path";import{readFileSync as nV,writeFileSync as MC}from"node:fs";import{basename as pV,dirname as x2,extname as y2,isAbsolute as RC,join as h1,resolve as iV}from"node:path";var u9=4000,y0=100,DC=u9/y0,OC=2,PC=30,LC=0.12,oV=2;async function cV(Z,Q,Y){let{ffmpeg:J}=SZ(Y);await M8(J,["-y","-v","error","-i",Z,"-vn","-ac","1","-ar",String(u9),"-f","s16le","-c:a","pcm_s16le",Q]);let z=nV(Q);return new Int16Array(z.buffer,z.byteOffset,Math.floor(z.byteLength/2))}function lV(Z){let Q=Math.floor(Z.length/y0),Y=new Float64Array(Q);for(let z=0;z<Q;z++){let X=0,V=z*y0;for(let W=0;W<y0;W++){let K=Z[V+W]/32768;X+=K*K}Y[z]=Math.sqrt(X/y0)}let J=0;for(let z=0;z<Q;z++)J+=Y[z];J/=Math.max(1,Q);for(let z=0;z<Q;z++)Y[z]-=J;return Y}function w2(Z,Q,Y){let J=Z.length;for(let z=1,X=0;z<J;z++){let V=J>>1;for(;X&V;V>>=1)X^=V;if(X^=V,z<X)[Z[z],Z[X]]=[Z[X],Z[z]],[Q[z],Q[X]]=[Q[X],Q[z]]}for(let z=2;z<=J;z<<=1){let X=(Y?1:-1)*2*Math.PI/z,V=Math.cos(X),W=Math.sin(X);for(let K=0;K<J;K+=z){let G=1,$=0;for(let H=0;H<z/2;H++){let N=Z[K+H],U=Q[K+H],q=Z[K+H+z/2]*G-Q[K+H+z/2]*$,M=Z[K+H+z/2]*$+Q[K+H+z/2]*G;Z[K+H]=N+q,Q[K+H]=U+M,Z[K+H+z/2]=N-q,Q[K+H+z/2]=U-M;let F=G*V-$*W;$=G*W+$*V,G=F}}}if(Y)for(let z=0;z<J;z++)Z[z]/=J,Q[z]/=J}function CC(Z,Q){let Y=Z.length+Q.length-1,J=1;while(J<Y)J<<=1;let z=new Float64Array(J),X=new Float64Array(J),V=new Float64Array(J),W=new Float64Array(J);z.set(Z),V.set(Q),w2(z,X,!1),w2(V,W,!1);for(let $=0;$<J;$++){let H=z[$]*V[$]+X[$]*W[$],N=X[$]*V[$]-z[$]*W[$];z[$]=H,X[$]=N}w2(z,X,!0);let K=new Float64Array(Y),G=Q.length;for(let $=-(G-1);$<Z.length;$++){let H=$>=0?$:J+$;K[$+G-1]=z[H]}return{corr:K,lagOfIndex:($)=>$-(G-1)}}function _C(Z,Q,Y){let J=0;for(let W=1;W<Z.length;W++)if(Z[W]>Z[J])J=W;let z=Number.NEGATIVE_INFINITY;for(let W=0;W<Z.length;W++){if(Math.abs(W-J)<=Y)continue;if(Z[W]>z)z=Z[W]}let X=Z[J],V=z>0?X/z:X>0?99:1;return{lag:Q(J),confidence:V,peakNorm:X}}function TC(Z,Q,Y){let J=Math.min(PC*u9,Z.length),z=0,X=-1,V=u9;for(let $=0;$+J<=Z.length;$+=V){let H=0;for(let N=$;N<$+J;N+=16)H+=Math.abs(Z[N]);if(H>X)X=H,z=$}let W=Math.round(LC*u9),K=Y,G=Number.NEGATIVE_INFINITY;for(let $=Y-W;$<=Y+W;$+=1){let H=0,N=0;for(let q=z;q<z+J;q+=4){let M=q-$;if(M<0||M>=Q.length)continue;H+=Z[q]/32768*(Q[M]/32768),N++}if(N===0)continue;let U=H/N;if(U>G)G=U,K=$}return K}async function rV(Z,Q,Y,J){let z=await cV(Z,h1(Y,"align-video.pcm"),J),X=await cV(Q,h1(Y,"align-ext.pcm"),J);if(z.length<y0*10||X.length<y0*10)throw Error("音频太短(不足 0.25s),无法对轨");let V=lV(z),W=lV(X),{corr:K,lagOfIndex:G}=CC(V,W),$=0,H=0;for(let F=0;F<V.length;F++)$+=V[F]*V[F];for(let F=0;F<W.length;F++)H+=W[F]*W[F];let N=Math.sqrt($*H)||1;for(let F=0;F<K.length;F++)K[F]/=N;let U=_C(K,G,Math.round(OC*DC)),q=U.lag*y0;return{offsetSec:TC(z,X,q)/u9,confidence:Math.round(U.confidence*100)/100,peakCorr:Math.round(U.peakNorm*1000)/1000}}async function aV(Z,Q,Y,J,z){let{ffmpeg:X}=SZ(z),V=U8(Z,z),W=[],K=["-y","-v","error","-i",Z];if(Y>=0.0005)K.push("-i",Q),W.push(`adelay=${Math.round(Y*1000)}:all=1`);else if(Y<=-0.0005)K.push("-ss",(-Y).toFixed(4),"-i",Q);else K.push("-i",Q);W.push(`apad=whole_dur=${V.toFixed(4)}`),K.push("-map","0:v:0","-map","1:a:0","-c:v","copy","-c:a","aac","-b:a","192k","-af",W.join(","),"-movflags","+faststart",J),await M8(X,K)}var dV=(Z)=>iV(Z).replace(/\\/g,"/"),O8=(Z)=>Math.round(Z*1000)/1000;function sV(Z,Q,Y,J,z){let X=O8(Math.max(0,-Y)),V=O8(Math.max(0,Y));return{version:"v1",video_size:[J.width,J.height],video_rate:Math.max(1,Math.round(J.fps)),duration:O8(Math.max(X+J.duration,V+z)),materials:[{id:"align-video",path:dV(Z),duration:O8(J.duration),video_size:[J.width,J.height],video_rate:Math.max(1,Math.round(J.fps))},{id:"align-ext-audio",path:dV(Q),duration:O8(z),audio_channel:"stereo"}],video_track:[{track_index:0,track_size:[J.width,J.height],track_timeline:[{clip_id:"align-v0",material:"align-video",clip_st:0,clip_ed:O8(J.duration),track_st:X,track_ed:O8(X+J.duration),duration:O8(J.duration)}]}],audio_track:[{track_index:0,track_timeline:[{clip_id:"align-a0",material:"align-ext-audio",clip_st:0,clip_ed:O8(z),track_st:V,track_ed:O8(V+z),duration:O8(z)}]}]}}function tV(Z){let Q=JSON.parse(nV(Z,"utf8")),Y=Q.materials??[],J=new Map(Y.map((q)=>[String(q.id),q])),z=Q.video_track??[],X=Q.audio_track??[],V=(q)=>{for(let M of q)for(let F of M.track_timeline??[])if(F.material)return F;return},W=V(z),K=V(X);if(!W||!K)throw Error("对齐工程不完整:找不到视频/音频 clip");let G=J.get(String(W.material)),$=J.get(String(K.material)),H=String(G?.path??""),N=String($?.path??"");if(!H||!N)throw Error("对齐工程素材缺 path,无法定位原文件");let U=(q)=>RC(q)?q:iV(x2(Z),q);return{videoAbs:U(H),extAudioAbs:U(N),offsetSec:O8(Number(K.track_st??0)-Number(W.track_st??0))}}function k2(Z,Q){let Y=y2(Z).toLowerCase()===".mov"?".mov":".mp4",J=pV(Z,y2(Z));return h1(Q??x2(Z),`${J}_extaudio${Y}`)}function eV(Z,Q){let Y=pV(Z,y2(Z));return h1(Q??x2(Z),`${Y}_align.gtrk`)}function ZK(Z,Q){MC(Z,JSON.stringify(Q,null,1),"utf8")}import{mkdir as EC}from"node:fs/promises";var b1=0.1,IC="audio-lay-",f2=0.05,P8=(Z)=>Math.round(Z*1000)/1000;function SC(Z){if(!Z||Z.length===0)throw Error("缺少子命令——用法:gtrk audio lay --project <目录> --file <音频>;或 gtrk audio align <视频> <外录音频>");if(Z[0]==="lay"){if(Z.length>1)throw Error(`未知参数「${Z.slice(1).join(" ")}」——lay 不收 positional`);return{sub:"lay"}}if(Z[0]==="align"){if(Z.length>3)throw Error("align 最多收两个 positional:<视频毛片> <外录音频>");return{sub:"align",video:Z[1],extAudio:Z[2]}}throw Error(`未知子命令「${Z.join(" ")}」——支持:gtrk audio lay / gtrk audio align`)}function vC(Z){return`${IC}${AC("sha256").update(Z,"utf8").digest("hex").slice(0,16)}`}function wC(Z){let Q=Number(Z.duration);if(Number.isFinite(Q)&&Q>0)return Q;let Y=0;for(let J of Array.isArray(Z.video_track)?Z.video_track:[])for(let z of Array.isArray(J.track_timeline)?J.track_timeline:[]){let X=Number(z.track_ed);if(Number.isFinite(X)&&X>Y)Y=X;else{let V=Number(z.track_st),W=Number(z.duration);if(Number.isFinite(V)&&Number.isFinite(W)&&V+W>Y)Y=V+W}}return Y>0?Y:void 0}function yC(Z,Q){let Y=Q.filter((z)=>Number.isFinite(z)&&z>=0).sort((z,X)=>z-X);if(!Y.length)return;let J=Y[0];for(let z of Y)if(Math.abs(z-Z)<Math.abs(J-Z))J=z;return P8(J)}function xC(Z){if(Z===void 0)return b1;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0&&Q<=1)return Q;return j.warn(`--volume 取值非法(${Z}),按默认 ${b1} 处理`),b1}function kC(Z){if(Z===void 0)return 0;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0)return Math.round(Q);return j.warn(`--offset 取值非法(${Z}),按 0 处理`),0}function fC(Z){let Q=[QK(Z,"gtrk","project.gtrk"),QK(Z,"project.gtrk")],Y=Q.find((J)=>m9(J));if(!Y)throw Error(`未找到工程文件(${Q[0]})——需要 oralcut / project init 产物目录`);return Y}async function hC(Z,Q={}){if(Z.json)NZ();if(!Z.project)throw Error("需要 --project <目录>(工程产物目录)");if(!Z.file)throw Error("需要 --file <音频>(要上轨的 BGM/音频文件)");let Y=x0(Z.file);if(!m9(Y))throw Error(`音频文件不存在:${Y}`);let J=u2(Y).toLowerCase();if(!(mZ("audio")??[]).includes(J))throw Error(`不支持的音频格式「${J||"无扩展名"}」;请输入本地音频文件(wav/mp3/flac/m4a/aac/ogg 等)`);let z=xC(Z.volume),X=kC(Z.offset),V=fC(x0(Z.project)),{gtrk:W,revision:K}=dZ(V);W8(W);let G=Q.probeDur??((g)=>U8(g)),$=Q.probeChannel??((g)=>Mz(g)),H=G(Y);if(!(H>0))throw Error(`探测不到有效音频时长:${Y}`);j.step(`▶ 音频上轨:${g2(Y)}(${H.toFixed(1)}s · 音量 ${z}${Z.beatAlign?" · beat 对齐":""})`);let N=wC(W),U=P8(X/1000);if(N!==void 0&&U>=N)throw Error(`--offset ${X}ms 落在工程末尾(${N.toFixed(2)}s)之外,无处可放`);let q;if(Z.beatAlign){q={aligned:!1,grid:null};try{let g=(Q.loadCfg??FZ)();j.info("节拍分析走云端 audio_music_analyze(计费一次,价格以官网价格表为准)…");let l=await(Q.analyze??((vZ,LZ)=>v1(vZ,LZ,{uploadCached:uZ,invalidateUpload:z8,submitTask:J8,pollToolTask:E8})))(g,Y),e=l.downbeats?.length?"downbeats":l.beats?.length?"beats":null,WZ=e?yC(U,e==="downbeats"?l.downbeats:l.beats):void 0;if(WZ===void 0)q.degradedReason="云端分析未返回可用节拍点(无节拍音乐?)——按原始 offset 上轨",j.warn(`beat 对齐降级:${q.degradedReason}`);else if(N!==void 0&&WZ>=N)q.degradedReason=`最近 downbeat(${WZ}s)已在工程末尾之外——按原始 offset 上轨`,j.warn(`beat 对齐降级:${q.degradedReason}`);else{if(e==="beats")j.info("downbeat 缺失,回退 beats 网格吸附");U=WZ,q.aligned=!0,q.grid=e,j.info(`起点已吸附最近 ${e==="downbeats"?"downbeat":"beat"}:${U}s`)}}catch(g){q.degradedReason=`${g instanceof Error?g.message:String(g)}——BGM 照常上轨(不对齐)`,j.warn(`beat 对齐降级:${q.degradedReason}`)}}let M=N!==void 0?Math.max(0,N-U):H,F=Z.noLoop!==!0&&N!==void 0,R=P8(Math.min(H,M));if(R<f2)throw Error(`起点 ${U}s 之后已放不下音频(工程末尾 ${N?.toFixed(2)}s)`);if(!F&&R<H-0.000001)j.info(`音频长于剩余时间线,已在工程末尾裁剪(上轨 ${R}s / 全长 ${P8(H)}s)`);let O=[...W.materials??[]],P=[...W.audio_track??[]],D=vC(Y),T=new Set(O.filter((g)=>typeof g.id==="string"&&g.path===Y).map((g)=>g.id));T.add(D);let _=P.filter((g)=>!(g.track_timeline??[]).some((k)=>typeof k.material==="string"&&T.has(k.material))),L=P.length-_.length;if(L>0)j.info(`同源幂等:已替换 ${L} 条既有同文件音轨(不叠加重复轨)`);let I=new Set;for(let g of[W.video_track??[],W.beat_track??[],_])for(let k of g)for(let l of k.track_timeline??[])if(typeof l.material==="string")I.add(l.material);let E=O.filter((g)=>!(typeof g.id==="string"&&T.has(g.id)&&!I.has(g.id))),y=_.reduce((g,k)=>Math.max(g,typeof k.track_index==="number"?k.track_index:-1),-1)+1,f=[];{let g=U,k=0,l=N!==void 0?N:U+R;do{let e=P8(l-g),WZ=P8(Math.min(H,e));if(WZ<f2)break;f.push({clip_id:`${D}-${k}`,material:D,clip_st:0,clip_ed:WZ,track_st:P8(g),track_ed:P8(g+WZ),duration:WZ,volume:z}),g=P8(g+WZ),k+=1}while(F&&g<l-f2)}if(f.length===0)throw Error(`起点 ${U}s 之后已放不下音频(工程末尾 ${N?.toFixed(2)}s)`);if(f.length>1){let g=f[f.length-1];j.info(`BGM 循环铺满:${f.length} 段(全长 ${P8(H)}s × ${f.length-1} + 尾段 ${g.duration}s,对齐工程末尾)`)}let S=f[0],w={track_index:y,muted:!1,track_timeline:f},x=$(Y),m={id:D,path:Y,duration:P8(H),...x?{audio_channel:x}:{}},r={...W,materials:[...E.filter((g)=>g.id!==D),m],audio_track:[..._,w].sort((g,k)=>(g.track_index??0)-(k.track_index??0))};u8(V,r,K),j.ok(`音轨已写入:track_index ${y} · ${U}s → ${P8(U+R)}s · 音量 ${z}`+(L?`(替换旧同源轨 ${L} 条)`:"")),j.info("客户端打开工程即见音轨;本地渲染(gtrk render)混音可闻。"),N4(Y,Z.project);let c={ok:!0,mode:"audio-lay",gtrkPath:V,trackIndex:y,replacedTracks:L,materialId:D,volume:z,offsetMs:X,clip:{clip_st:S.clip_st,clip_ed:S.clip_ed,track_st:S.track_st,track_ed:S.track_ed,duration:S.duration},...q?{beatAlign:q}:{},loopCount:f.length};if(Z.json)console.log(JSON.stringify(c));return c}async function bC(Z,Q,Y){if(Y.json)NZ();let J=Y._detect??rV,z=Y._mux??aV,X=Y.threshold!=null?Number(Y.threshold):oV;if(!Number.isFinite(X)||X<=0)throw Error(`--threshold 需要正数,拿到「${Y.threshold}」`);if(Y.resume){let D=x0(Y.resume);if(!m9(D))throw Error(`对齐工程不存在:${D}`);let T=tV(D);j.info(`对齐工程读回:offset = ${T.offsetSec.toFixed(3)}s(音轨 track_st − 视频轨 track_st)`);let _=Y.out?x0(Y.out):k2(T.videoAbs);h2(_,Y.force),await z(T.videoAbs,T.extAudioAbs,T.offsetSec,_,Y.ffmpegPath),b2(_);let L={ok:!0,mode:"resume",offsetSec:T.offsetSec,output:_};if(Y.json)console.log(JSON.stringify(L));return L}if(!Z||!Q)throw Error("用法:gtrk audio align <视频毛片> <外录音频>(或 --resume <对齐工程>)");let V=x0(Z),W=x0(Q);if(!m9(V))throw Error(`视频不存在:${V}`);if(!m9(W))throw Error(`外录音频不存在:${W}`);let K=new Set(mZ("video")),G=new Set(mZ("audio")),$=u2(V).toLowerCase(),H=u2(W).toLowerCase();if(G.has($)&&!K.has($))throw Error(`第一个参数要视频毛片,拿到音频「${g2(V)}」——参数顺序是 <视频> <外录音频>`);if(K.has(H)&&!G.has(H))throw Error(`第二个参数要外录音频,拿到视频「${g2(W)}」——参数顺序是 <视频> <外录音频>`);let N=Y.out?x0(Y.out):k2(V);if(Y.offset!=null){let D=Number(Y.offset);if(!Number.isFinite(D))throw Error(`--offset 需要秒数,拿到「${Y.offset}」`);h2(N,Y.force),await z(V,W,D,N,Y.ffmpegPath),b2(N);let T={ok:!0,mode:"manual-offset",offsetSec:D,output:N};if(Y.json)console.log(JSON.stringify(T));return T}let U=U8(V,Y.ffmpegPath),q=U8(W,Y.ffmpegPath);if(q<U-1)j.warn(`外录(${q.toFixed(1)}s)比视频(${U.toFixed(1)}s)短——成片尾部将无外录声,请确认给对了文件`);j.step("对轨检测(互相关测偏移 + 置信度)…"),await EC(K9(),{recursive:!0});let M=await J(V,W,K9(),Y.ffmpegPath);if(j.info(`偏移 = ${M.offsetSec.toFixed(3)}s(正=外录晚开录) 置信度 = ${M.confidence}(阈值 ${X})`),M.confidence>=X){h2(N,Y.force),await z(V,W,M.offsetSec,N,Y.ffmpegPath),b2(N);let D={ok:!0,mode:"auto",offsetSec:M.offsetSec,confidence:M.confidence,threshold:X,output:N};if(Y.json)console.log(JSON.stringify(D));return D}let F=hZ(V,Y.ffmpegPath),R=Y.out&&Y.out.toLowerCase().endsWith(".gtrk")?x0(Y.out):eV(V),O=sV(V,W,M.offsetSec,F,q);ZK(R,O),j.warn(`置信度 ${M.confidence} < 阈值 ${X},不自动换轨。`),j.info(`已产对齐工程:${R}`),j.info("请在客户端打开该工程,把音轨拖到与画面对齐后保存,然后跑:"),j.info(` gtrk audio align --resume "${R}"`);let P={ok:!0,mode:"align-project",offsetSec:M.offsetSec,confidence:M.confidence,threshold:X,alignProject:R};if(Y.json)console.log(JSON.stringify(P));return P}function h2(Z,Q){if(m9(Z)&&!Q)throw Error(`产物已存在:${Z}(加 --force 覆盖)`)}function b2(Z){j.ok(`换轨完成(视频流零像素改动):${Z}`),j.info("⚠️ 该文件是后续工程的素材,请留存——删了工程会素材脱机。原毛片未动(内录保底轨)。")}function YK(Z){Z.command("audio [words...]").description("音频零件族:gtrk audio lay 往 .gtrk 追加 audio_track(BGM 上轨);gtrk audio align 外录音轨对轨换声(互相关测偏移+置信度分流,纯本地零计费)").option("--project <dir>","[lay] 工程产物目录(定位 gtrk/project.gtrk)").option("--file <audio>","[lay] 要上轨的音频文件(BGM/配乐等)").option("--volume <v>",`[lay] 音量 0..1(默认 ${b1},BGM 垫底音量)`).option("--offset <v>","[lay] 入点偏移毫秒;[align] 显式偏移秒(跳过检测直接换轨,正=外录晚开录)").option("--beat-align","[lay] 云端节拍分析(audio_music_analyze,计费一次)并把起点吸附最近 downbeat;无 Key/失败自动降级为不对齐,不失败整命令").option("--no-loop","[lay] 关闭循环铺满(缺省 BGM 短于工程时循环叠满至末尾、尾段裁齐)").option("--resume <gtrk>","[align] 客户端拖齐保存后的对齐工程,读回偏移完成换轨").option("--threshold <r>","[align] 置信度阈值(主峰/次峰显著性比;缺省真机标定值)").option("-o, --out <path>","[align] 产物路径(缺省 <视频名>_extaudio.<ext>;低置信时为对齐工程路径)").option("--force","[align] 产物已存在时覆盖").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{let J=SC(Q);if(J.sub==="lay"){await hC(Y);return}await bC(J.video,J.extAudio,Y)})}import{existsSync as n2}from"node:fs";import{readFileSync as eC}from"node:fs";import{join as c9,resolve as d2}from"node:path";import{randomUUID as GK}from"node:crypto";var gC=120000,u1=0.8,c2="思源黑体 CN Bold",m2=90,JK=["default","outline","cinema_yellow","immersive_box","wide_spacing","deep_shadow","boxed"],uC="default",zK=["雅黑","淡绿","森林绿","湖蓝","道奇蓝","钢蓝","浅粉红","深橙","珊瑚橙","橙红","土豪金"],mC="雅黑",cC={雅黑:"#333333",淡绿:"#6BC76A",森林绿:"#20A21F",湖蓝:"#11BBF0",道奇蓝:"#1D88F1",钢蓝:"#4682B4",浅粉红:"#F37271",深橙:"#FF8C00",珊瑚橙:"#FF7F50",橙红:"#F74B0E",土豪金:"#ECC71E"},lC=0.3568627450980392,XK="rgba(28, 28, 28, 0.75)",dC="rgba(0, 0, 0, 0.62)",s0={playResX:1080,playResY:1920,marginL:36,marginR:36},t0={playResX:1920,playResY:1080,marginL:100,marginR:100},nC={default:{borderStyle:1,textColor:"#ffffff",shadowColor:XK,glyphScaleX:100,glyphScaleY:100,portrait:{...s0,fontSize:100,outline:0,shadow:4,marginV:400},landscape:{...t0,fontSize:75,outline:0,shadow:4,marginV:75}},outline:{borderStyle:1,textColor:"#ffffff",shadowColor:"#6a6a6a",glyphScaleX:100,glyphScaleY:100,portrait:{...s0,fontSize:100,outline:10,shadow:3.6,marginV:400},landscape:{...t0,fontSize:75,outline:10,shadow:3.6,marginV:50}},cinema_yellow:{borderStyle:1,textColor:"#ffd700",shadowColor:null,glyphScaleX:100,glyphScaleY:100,portrait:{...s0,fontSize:100,outline:10,shadow:0,marginV:400},landscape:{...t0,fontSize:75,outline:10,shadow:0,marginV:50}},immersive_box:{borderStyle:3,textColor:"#ffffff",shadowColor:dC,glyphScaleX:100,glyphScaleY:100,portrait:{...s0,fontSize:100,outline:15,shadow:8,marginV:400},landscape:{...t0,fontSize:75,outline:15,shadow:8,marginV:50}},wide_spacing:{borderStyle:1,textColor:"#ffffff",shadowColor:XK,glyphScaleX:90,glyphScaleY:115,portrait:{...s0,fontSize:100,outline:4,shadow:2,marginV:400},landscape:{...t0,fontSize:75,outline:4,shadow:2,marginV:50}},deep_shadow:{borderStyle:1,textColor:"#ffffff",shadowColor:"#000000",glyphScaleX:100,glyphScaleY:100,portrait:{...s0,fontSize:100,outline:4,shadow:10,marginV:400},landscape:{...t0,fontSize:75,outline:4,shadow:10,marginV:50}},boxed:{borderStyle:3,textColor:"#ffffff",shadowColor:null,glyphScaleX:100,glyphScaleY:100,portrait:{...s0,fontSize:100,outline:20,shadow:0,marginV:400},landscape:{...t0,fontSize:75,outline:20,shadow:0,marginV:50}}};function $K(Z){if(Z===void 0)return uC;if(JK.includes(Z))return Z;throw Error(`未知字幕样式「${Z}」——合法取值:${JK.join(" / ")}`)}function HK(Z){if(Z===void 0)return mC;if(zK.includes(Z))return Z;throw Error(`未知字幕颜色「${Z}」——合法取值:${zK.join(" / ")}`)}function l2(Z){return Z.width>=Z.height?"landscape":"portrait"}function pC(Z,Q){let Y=Z.replace("#",""),J=Number.parseInt(Y.slice(0,2),16),z=Number.parseInt(Y.slice(2,4),16),X=Number.parseInt(Y.slice(4,6),16);return`rgba(${J}, ${z}, ${X}, ${Q})`}function iC(Z){return Z.trim().replace(/\r\n/g,`
|
|
237
|
+
`,warnings:K.warnings}}import{readdirSync as rO,statSync as aO}from"node:fs";import{extname as sO,join as tO}from"node:path";var qV=new Set(uZ("video")??[]);function UV(Z,Q={}){let Y=Q.probe??hZ,J=Q.warn??(()=>{}),z;try{z=rO(Z)}catch{throw Error(`素材文件夹不存在或无法读取:${Z}`)}let X=z.filter(($)=>qV.has(sO($).toLowerCase())).map(($)=>tO(Z,$)).filter(($)=>{try{return aO($).isFile()}catch{return!1}}).sort(),W=[],V=[];for(let $ of X)try{let H=Y($,Q.ffmpegPath);if(!(H.width>0)||!(H.height>0)){V.push($),J(`跳过无法探测几何的文件:${$}`);continue}W.push({path:$,width:H.width,height:H.height,duration:H.duration||0})}catch{V.push($),J(`跳过 ffprobe 失败的文件:${$}`)}if(W.length===0)throw Error(`未在「${Z}」发现可用素材视频。支持的扩展名:${[...qV].join(" ")}。请确认文件夹内含 3~10 条视频。`);let G=W.filter(($)=>$.height>$.width).length>W.length/2?"portrait":"landscape";return{videos:W,orientation:G,skipped:V}}function NV(Z){return Z==="portrait"?{w:1080,h:1920,fps:30}:{w:1920,h:1080,fps:30}}function eO(Z){let Q=Z>>>0;return()=>{Q|=0,Q=Q+1831565813|0;let Y=Math.imul(Q^Q>>>15,1|Q);return Y=Y+Math.imul(Y^Y>>>7,61|Y)^Y,((Y^Y>>>14)>>>0)/4294967296}}function ZL(Z){if(Z==="am"||Z==="nv")return 1;return 0.55}function QL(Z){return Z.h>Z.w?"portrait":"landscape"}function YL(Z,Q){let Y=Math.sqrt(Math.max(1,Z.n_seen)),J=ZL(Z.format),z=QL(Z)===Q?1:0.5,X=Math.max(0.1,1-Math.min(1,Math.max(0,Z.unmapped_fx_ratio)));return Y*J*z*X}function JL(Z,Q){let Y=Z.reduce((z,X)=>z+Math.max(0,X),0);if(Y<=0)return Z.length?Math.floor(Q()*Z.length):-1;let J=Q()*Y;for(let z=0;z<Z.length;z++)if(J-=Math.max(0,Z[z]),J<=0)return z;return Z.length-1}function zL(Z,Q=2.2){let Y=Math.round(Z/Math.max(0.5,Q));return Math.min(12,Math.max(6,Y))}function BV(Z){let{pool:Q,videos:Y,durationSec:J,orientation:z,seed:X}=Z,W=eO(X||1),V=zL(J,Z.targetAvgSec);if(Q.length===0||Y.length===0)return[];let K=[...new Set(Q.map((D)=>D.cat))],G=new Map;for(let D of K)G.set(D,Q.filter((O)=>O.cat===D));let $=[],H=new Set,N=new Set,q=0,U=0,F=new Map,M=(D,O)=>{let C=D.filter((P)=>!N.has(P.uid)&&(O||!H.has(P.pid)));if(C.length===0)return null;let T=C.map((P)=>YL(P,z)),_=JL(T,W);return _>=0?C[_]:null},R=0;while($.length<V&&R<V*(K.length+4)+50){R++;let D=null;for(let E=0;E<K.length&&!D;E++){let I=K[(q+E)%K.length];if(D=M(G.get(I)??[],!1),D)q=(q+E+1)%K.length}if(!D)D=M(Q,!0);if(!D)break;N.add(D.uid),H.add(D.pid);let O=Y[U%Y.length];U++;let C=Math.max(0.4,D.t1-D.t0),T=F.get(O.path)??0,_=Math.max(0.1,O.duration-C),P=_>0?T%_:0;F.set(O.path,T+C),$.push({entry:D,video:O,srcOffsetBase:P})}return $}var P2=(Z,Q,Y)=>Math.min(Y,Math.max(Q,Z)),k0=(Z)=>Math.round(Z*1000)/1000,O2=0.4;function L2(Z){let Q=[],Y=0;for(let J of Z){let z=P2(J,0.4,6);Q.push({dropAt:k0(Y),outLen:k0(z)}),Y+=z}return{placements:Q,markers:[]}}function jV(Z,Q){let Y=(Q.downbeats??[]).filter((q)=>Number.isFinite(q)&&q>=0).sort((q,U)=>q-U),J=(Q.beats??[]).filter((q)=>Number.isFinite(q)&&q>=0).sort((q,U)=>q-U),X=Y.length>=2&&Y[1]-Y[0]<=6?Y:J,W=new Set(Y.map((q)=>k0(q)));if(X.length<2)return{plan:L2(Z),level:2};let V=[],K=0,G=0;for(let q=0;q<Z.length;q++){let U=K;while(G<X.length&&X[G]<=U+0.4)G++;if(G>=X.length){let R=P2(Z[q],0.4,6);V.push({dropAt:k0(U),outLen:k0(R)}),K=U+R;continue}let F=X[G],M=P2(F-U,0.4,6);V.push({dropAt:k0(U),outLen:k0(M)}),K=U+M,G++}let $=V.length?V[V.length-1].dropAt+V[V.length-1].outLen:0,N=[...new Set([...J,...Y].map((q)=>k0(q)))].sort((q,U)=>q-U).filter((q)=>q>=0&&q<=$+0.000001).map((q)=>({t:q,downbeat:W.has(q)}));return{plan:{placements:V,markers:N},level:1}}import{createHash as XL}from"node:crypto";import{mkdir as FV,readFile as C2,rename as WL,rm as VL,writeFile as KL,readdir as GL}from"node:fs/promises";import{existsSync as _2}from"node:fs";import{join as x1}from"node:path";function RV(){return G6("mad-cache")}function $L(){return(process.env.GITRUCK_MAD_BASE??"https://api.ai-mcn.tv:10000").replace(/\/+$/,"")}function HL(){return`${$L()}/task/mad/manifest`}var qL=["mad_pool"];function DV(Z){return XL("sha256").update(Z).digest("hex")}async function UL(Z,Q,Y){let J=new AbortController,z=setTimeout(()=>J.abort(),Y);try{return await Z(Q,{signal:J.signal})}finally{clearTimeout(z)}}async function k1(Z,Q){let Y=`${Z}.tmp-${process.pid}-${Date.now()}`;await KL(Y,Q),await WL(Y,Z)}async function NL(Z,Q){if(!_2(Z))return!1;try{let Y=await C2(Z);return DV(Y)===Q}catch{return!1}}function MV(Z){if(!Z||typeof Z!=="object")throw Error("manifest 结构非法");let Q=Z;if(typeof Q.version!=="number")throw Error("manifest 缺 version");if(!Q.datasets||typeof Q.datasets!=="object")throw Error("manifest 缺 datasets");if(typeof Q.assets_base!=="string"||!/^https:\/\//i.test(Q.assets_base))throw Error("manifest 缺 assets_base(须 HTTPS)");return Q}async function BL(Z,Q,Y){try{let J=await GL(Z);for(let z of J){let X=/^v(\d+)$/.exec(z);if(X&&Number(X[1])!==Q)await VL(x1(Z,z),{recursive:!0,force:!0}).catch(()=>{})}}catch{}}async function PV(Z,Q){let{cacheRoot:Y,warn:J}=Q,z=Q.manifestTimeoutMs??8000,X=Q.manifestUrl??HL(),W=x1(Y,"manifest.json"),V=null,K=!1;try{if(!/^https:\/\//i.test(X))throw Error("manifest 必须 HTTPS");let M=await UL(Q.fetchFn,X,z);if(!M.ok)throw Error(`manifest HTTP ${M.status}`);V=MV(await M.json()),K=!0}catch(M){J(`manifest 拉取失败(${M instanceof Error?M.message:String(M)}),回退本地缓存`)}if(!V){if(!_2(W))throw Error("首次使用需联网下载技法数据。请连网后重跑 `gtrk tool mad`(数据会缓存到本地,之后可离线出片)。");try{V=MV(JSON.parse(await C2(W,"utf8")))}catch{throw Error("本地 manifest 缓存损坏且当前离线。请连网重跑,或加 --refresh 强制重新下载。")}}for(let M of qL)if(!V.datasets[M])throw Error("技法数据尚未就绪,请稍后再试。");let G=V.version,$=x1(Y,`v${G}`),H=x1($,"mad_pool.json"),N=V.datasets.mad_pool,q=await NL(H,N.sha256);if(!!Z.refresh||!q){if(!K){if(_2(H))throw Error("本地技法数据缓存损坏且当前离线。请连网重跑,或加 --refresh 强制重新下载。");throw Error("首次使用需联网下载技法数据。请连网后重跑 `gtrk tool mad`(数据会缓存到本地,之后可离线出片)。")}await FV($,{recursive:!0}),J(`下载技法池数据 mad_pool(版本 v${G},约 ${Math.round(N.size/1024)} KB)…`);let M=await Q.fetchFn(N.url);if(!M.ok)throw Error(`mad_pool 下载失败 HTTP ${M.status}`);let R=new Uint8Array(await M.arrayBuffer());if(DV(R)!==N.sha256)throw Error("mad_pool 下载校验不通过(sha256 不符),请重试或 --refresh。");await k1(H,R),J(`技法池数据就绪(v${G})`)}if(K)await FV(Y,{recursive:!0}),await k1(W,new Uint8Array(Buffer.from(JSON.stringify(V),"utf8"))),await BL(Y,G,J);let F;try{if(F=JSON.parse(await C2(H,"utf8")),!Array.isArray(F))throw Error("mad_pool 非数组")}catch(M){throw Error(`技法池数据装载失败:${M instanceof Error?M.message:String(M)}(可加 --refresh 重拉)`)}return{version:G,assetsBase:V.assets_base,pool:F,verDir:$,online:K}}import{gunzipSync as jL}from"node:zlib";import{mkdir as FL,readFile as ML}from"node:fs/promises";import{existsSync as OV}from"node:fs";import{join as _V}from"node:path";function LV(Z,Q){return _V(Z,"ir",`${Q}.json.gz`)}function CV(Z){let Q=jL(Z).toString("utf8"),Y=JSON.parse(Q);if(!Y||typeof Y!=="object")throw Error("IR 分片结构非法");return Y}function TV(Z,Q,Y,J){let z=new Map,X=Z.replace(/\/+$/,"");async function W(V){let K=z.get(V);if(K)return K;let G=LV(Q,V);if(OV(G))try{let U=CV(await ML(G));return z.set(V,U),U}catch{J.warn(`IR 分片缓存损坏(${V}),尝试重拉`)}if(!Y)throw Error(`离线且 IR 分片「${V}」无缓存。请连网重跑,或加 --refresh 预热数据。`);let $=`${X}/ir/${V}.json.gz`,H=await J.fetchFn($);if(!H.ok)throw Error(`IR 分片下载失败 HTTP ${H.status}:${$}`);let N=new Uint8Array(await H.arrayBuffer()),q=CV(N);return await FL(_V(Q,"ir"),{recursive:!0}),await k1(G,N),z.set(V,q),q}return{async getIr(V){let G=(await W(V.shard))[V.ir];if(!G)throw Error(`IR 分片「${V.shard}」中缺工程 ir=${V.ir}`);return G},shardCached(V){return z.has(V)||OV(LV(Q,V))}}}var AV="audio_music_analyze";function RL(Z){let Q=Z??{},Y=(J)=>Array.isArray(J)?J.filter((z)=>typeof z==="number"&&Number.isFinite(z)):[];return{bpm:typeof Q.bpm==="number"?Q.bpm:void 0,beats:Y(Q.beats),downbeats:Y(Q.downbeats)}}async function f1(Z,Q,Y){let z=await R8(Z,Q,AV,(V)=>({file_id:V}),{},{uploadCached:Y.uploadCached,invalidateUpload:Y.invalidateUpload,submitTask:Y.submitTask,sleep:Y.sleep??((V)=>new Promise((K)=>setTimeout(K,V)))}),{taskId:X}=z,W=await Y.pollToolTask(Z,AV,X,{});return RL(W)}function LL(Z,Q){return["/*═══════════════════════════════════════════════"," MAD 一键工程 — 由 gtrk 自动生成"," ───────────────────────────────────────────────"," 用法:After Effects 文件 › 脚本 › 运行脚本文件… 选择本文件"," 运行后自动生成母合成:素材已按技法段填入各素材位,"," 彩色占位块为素材位,可在合成里替换或微调。",""," 生成工具:gtrk tool mad · 同合云 gitruck"," 了解一键成片流程:https://cloud.ai-mcn.tv/cli",` 版本 ${Z} · 生成于 ${Q}`,"═══════════════════════════════════════════════*/"].join(`
|
|
238
|
+
`)}function CL(Z,Q){return[`工程文件已生成:${Z}(${Q===1?"已按 BGM downbeat 卡点":Q===2?"BGM 已入轨、按固定节奏切窗":"按固定节奏切窗"})`,"用法:装 After Effects 2020+ 后,文件 › 脚本 › 运行脚本文件… 选它,30 秒重建整条时间线。"].join(`
|
|
239
|
+
`)}function _L(Z){let Q=[],Y=(J)=>{for(let z of J){let X=z;if(X.type==="image"||X.type==="video")Q.push(String(X.id??""));if(X.type==="group"&&Array.isArray(X.children))Y(X.children)}};return Y(Z.layers??[]),Q.filter((J)=>J)}var TL=0.3;function AL(Z){let Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}async function IV(Z,Q,Y={}){let J=Y.warn??((n)=>process.stderr.write(`\x1B[2m ${n}\x1B[0m
|
|
240
|
+
`)),z=Y.emitBilling??((n)=>process.stderr.write(`\x1B[33m⚠️ 计费提示:${n}\x1B[0m
|
|
241
|
+
`)),X=(Y.now??(()=>new Date))(),W=Y.fetchFn??fetch,V=Y.probeDurationFn??U8;if(!Z)throw Error("用法:gtrk tool mad <素材文件夹> [--bgm 歌.mp3]");let K=T2(Z);if(!PL(K)||!OL(K).isDirectory())throw Error(`素材文件夹不存在或不是目录:${K}`);let{videos:G,orientation:$,skipped:H}=UV(K,{ffmpegPath:Q.ffmpegPath,probe:Y.probeGeometry,warn:J});for(let n of H);let N=NV($),q={fetchFn:W,cacheRoot:Y.cacheRoot??RV(),warn:J},U=await PV({refresh:Q.refresh},q),F=TV(U.assetsBase,U.verDir,U.online,{fetchFn:W,warn:J}),M=Q.duration&&Q.duration>0?Q.duration:20,R=Q.seed&&Number.isFinite(Q.seed)?Q.seed:Math.floor(Math.random()*2147483648);J(`选窗种子 seed=${R}(复现加 --seed ${R})`);let D=U.online?U.pool:U.pool.filter((n)=>F.shardCached(n.shard));if(!U.online&&D.length===0)throw Error("当前离线且无已缓存的技法数据分片。请连网重跑首拉,或加 --refresh 预热。");let O=BV({pool:D,videos:G,durationSec:M,orientation:$,seed:R});if(O.length===0)throw Error("技法池为空或无可用条目(数据版本可能异常,可加 --refresh 重拉)。");let C=[];for(let n of O)C.push(await F.getIr(n.entry));let T=3,_=null,P,E=Q.bgm?T2(Q.bgm):void 0;if(E){let n=-1;try{n=V(E,Q.ffmpegPath)}catch{n=-1}if(!(n>0))J(`BGM 无法读取(ffprobe 校验失败),按无 BGM 固定节奏出片:${E}`),T=3;else{let QZ=null;try{QZ=(Y.loadConfig??jZ)()}catch{QZ=null}if(!QZ)J("未配置 API Key,无法解锁 BGM 卡点。跑 `gtrk init` 配置后可卡点;本次 BGM 已入轨、按固定节奏出片。"),T=2,P=E;else{let zZ=await(Y.resolvePricing??m8)("audio_music_analyze","仅 --bgm 卡点时");z(zZ.billingHint);let BZ=Y.beatCloud??{uploadCached:gZ,invalidateUpload:V8,submitTask:W8,pollToolTask:I8};try{_=await f1(QZ,E,BZ),T=1,P=E}catch(PZ){J(`BGM 云端分析失败(${PZ instanceof Error?PZ.message:String(PZ)}),BGM 已入轨、切点回退固定节奏`),T=2,P=E}}}}let I=O.map((n)=>Math.max(O2,n.entry.t1-n.entry.t0)),y,h=[];if(T===1&&_){let n=jV(I,_);if(y=n.plan.placements,h=n.plan.markers,n.level===2)J("BGM 无有效节拍(beats/downbeats 均空),切点回退固定节奏。"),T=2,h=[]}else y=L2(I).placements;let v=O.map((n,QZ)=>{let zZ=C[QZ],BZ=_L(zZ),PZ={},oZ=n.video.duration||0,mZ=Math.max(O2,n.entry.t1-n.entry.t0);return BZ.forEach((bZ,pZ)=>{let xZ=n.srcOffsetBase+pZ*TL,x8=Math.max(0,oZ-mZ);if(x8>0)xZ=xZ%x8;else xZ=0;PZ[bZ]={path:n.video.path,srcOffset:Math.round(xZ*1000)/1000}}),{ir:zZ,uid:n.entry.uid,seq:QZ,t0:n.entry.t0,t1:n.entry.t1,dropAt:y[QZ].dropAt,outLen:y[QZ].outLen,footage:PZ}}),S=Y.cliVersion??"",k=LL(S,X.toISOString()),c=T<=2&&P?{path:P,markers:h}:void 0,{jsx:a}=HV({master:N,windows:v,header:k,bgm:c}),u=Q.out?T2(Q.out):A2(process.cwd(),`mad-${AL(X)}`);await DL(u,{recursive:!0});let l=A2(u,"mad.jsx");await EV(l,a);let f={ok:!0,tool:"mad",outDir:u,files:[l],seed:R,dataVersion:U.version,degradeLevel:T,techniques:O.map((n)=>({uid:n.entry.uid,pid:n.entry.pid,cat:n.entry.cat,t0:n.entry.t0,t1:n.entry.t1}))};return await EV(A2(u,"result.json"),JSON.stringify({...f,finishedAt:X.toISOString()},null,2)),J(CL(l,T)),f}var EL=(Z,Q)=>{return Q.push(Z),Q};function IL(Z,Q=o0){Z.description("单点工具族:`gtrk tool <name> [输入...]` 跑单个能力(多文件工具可传多个输入,顺序即拼装顺序);`gtrk tool list` 查全部(含输入/产物/计费/状态)").option("-o, --out <dir>","产物目录(缺省 = <输入名>-<tool>/;input=none 落 cwd 下 <tool>-<时间戳>/)").option("--param <k=v>","透传任意云端参数(标量、可重复;如 --param width=1080)",EL,[]).option("--params-json <json>","透传任意云端参数(JSON 对象)").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--reupload","强制重新上传,忽略本地上传缓存").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON(给 agent/脚本解析)");let Y=new Set;for(let J of Q)for(let z of J.options??[]){if(Y.has(z.flag))continue;Y.add(z.flag),Z.option(z.flag,z.desc)}return Z.action(async(J,z)=>{await SL(J??[],z,Q)}),Z}function SV(Z,Q=o0){ez(Q);let Y=Z.command("tool [words...]");IL(Y,Q)}async function SL(Z,Q,Y=o0,J){if(Q.json)qZ();let z=Z[0];if(!z)throw Error("用法:`gtrk tool <name> [输入...]` 跑工具(多文件工具可传多个输入);`gtrk tool list` 查全部工具");if(z==="list"){await vL(Q,Y);return}let X=tz(z,Y);if(!X){let V=Y.map((K)=>K.name).join(", ");throw Error(`未知工具「${z}」。可用工具:${V||"(空)"}(用 gtrk tool list 查看详情)`)}let W=qQ.has(X.input.kind)?Z.slice(1):Z[1];return wL(X,W,Q,J)}async function vL(Z,Q=o0,Y=Y7){let J;try{J=await Y()}catch{J=void 0}let z=Q.map((X)=>{let W=r6(X.priceKey??X.name,J,X.pricingContext);return{name:X.name,title:X.title,input:X.input.kind,output:X.outputHint,billingHint:W.billingHint,pricing:W.pricing,enabled:X.enabled,...X.disabledReason?{disabledReason:X.disabledReason}:{}}});if(Z.json){console.log(JSON.stringify(z));return}j.step("▶ gtrk 工具族(gtrk tool <name> [input]):");for(let X of z){let W=X.enabled?"已上线":`未开放(${X.disabledReason??"无原因"})`;j.info(`${X.name} — ${X.title}|输入 ${X.input}|产物 ${X.output}|${X.billingHint}|${W}`)}j.info("agent 一律带 --json;缺 API Key 先跑 `gtrk init`;跑前把计费提示转述给用户。")}async function wL(Z,Q,Y,J){if(!Z.enabled)throw Error(`能力未开放:${Z.disabledReason??"(未提供原因)"}(用 gtrk tool list 查看全部工具)`);if(Z.kind==="local"){if(Z.name==="mad")return yL(typeof Q==="string"?Q:void 0,Y);throw Error(`local 型工具「${Z.name}」由后续 change 实现,暂不可用`)}let X={cfg:jZ(),uploadCached:gZ,invalidateUpload:V8,submitTask:W8,getTaskResult:A8,downloadStream:E9,probeDurationSec:(V,K)=>U8(V,K),...J};j.step(`▶ ${Z.title}(${Z.name})…`);let W=await zX(Z,Q,Y,X);if(Y.json)console.log(JSON.stringify(W));if(W.ok)j.ok(`完成。产物目录:${W.outDir}`);else j.err(`部分产物未落地(任务已完成、积分可能已扣)。task.json 已保留,可凭 task_id 恢复:${W.taskId}`),process.exitCode=1;return W}async function yL(Z,Q){j.step("▶ 一键剪 MAD(mad)…");let Y={bgm:typeof Q.bgm==="string"?Q.bgm:void 0,duration:Q.duration!=null?Number(Q.duration):void 0,seed:Q.seed!=null?Number(Q.seed):void 0,refresh:!!Q.refresh,out:Q.out,ffmpegPath:Q.ffmpegPath,json:!!Q.json},J=await IV(Z,Y,{cliVersion:O0()});if(Q.json)console.log(JSON.stringify(J));if(J.ok)j.ok(`完成。产物目录:${J.outDir}`);return{ok:J.ok,tool:J.tool,outDir:J.outDir,files:J.files}}import{existsSync as fL}from"node:fs";import{createHash as hL}from"node:crypto";import{mkdir as bL,rename as gL,rm as uL,stat as mL,writeFile as cL}from"node:fs/promises";import{basename as h1,dirname as hV,extname as fQ,join as lL,resolve as bV}from"node:path";function E2(Z){let Q=typeof Z==="number"?Z:Number(Z);return Number.isFinite(Q)&&Q>=0?Q:void 0}function vV(Z,Q,Y,J){let z=E2(Z[Q]);if(z!=null)return z;let X=E2(Z[Y]);if(X!=null)return X/1000;return E2(Z[J])??0}function wV(Z){if(!Array.isArray(Z))return[];let Q=[];for(let Y of Z){if(!Y||typeof Y!=="object")continue;let J=Y,z=typeof J.text==="string"?J.text.trim():"";if(!z)continue;let X=vV(J,"start_time","begin_time_ms","st"),W=vV(J,"end_time","end_time_ms","ed");Q.push({text:z,start:X,end:Math.max(X,W)})}return Q.sort((Y,J)=>Y.start-J.start||Y.end-J.end)}function xV(Z){let Q=wV(Z.sentence_tc_list??Z.sentence_list),Y=wV(Z.word_tc_list??Z.word_list),J="";for(let z of["asr_text","text"]){let X=Z[z];if(typeof X==="string"&&X.trim()){J=X.trim();break}}if(Q.length===0&&Y.length>0)Q=[{text:J||Y.map((z)=>z.text).join(""),start:Y[0]?.start??0,end:Y[Y.length-1]?.end??0}];if(!J&&Q.length>0)J=Q.map((z)=>z.text).join(`
|
|
242
|
+
`);if(!J.trim()||Q.length===0)throw Error("ASR 任务已完成,但没有返回可用的文字或句级时间戳");return{text:J.trim(),sentences:Q,words:Y}}function yV(Z){let Q=Math.max(0,Math.floor(Number.isFinite(Z)?Z:0)),Y=Math.floor(Q/3600),J=Math.floor(Q%3600/60),z=Q%60;return`${String(Y).padStart(2,"0")}:${String(J).padStart(2,"0")}:${String(z).padStart(2,"0")}`}function xL(Z){let Q=Z.trim();if(!Q)return Q;return/[。!?!?;;::]$/.test(Q)?Q:`${Q}。`}function kL(Z){let Q=(Y)=>String(Y).padStart(2,"0");return`${Z.getFullYear()}-${Q(Z.getMonth()+1)}-${Q(Z.getDate())} ${Q(Z.getHours())}:${Q(Z.getMinutes())}`}function kV(Z){let Q=Z.asr.sentences.flatMap((J)=>[`**[${yV(J.start)}]**`,"",xL(J.text),""]),Y=Z.sourceKind==="audio"?"音频":"视频";return[`# ${Z.title}`,"",`> 生成时间:${kL(Z.generatedAt)} `,`> ${Y}时长:${yV(Z.durationSec)} `,`> 来源:本地${Y} \`${Z.sourceName}\` `,`> 识别语言:${Z.language}`,"","## 总结","","<!-- gtrk:agent-summary-pending -->","> 待驱动 CLI 的 Agent 阅读下方完整文字稿后,在此生成总结。","","## 文字记录","",...Q,"## 纯文本","",Z.asr.text.trim(),""].join(`
|
|
243
|
+
`)}var fV="asr",dL="asr";function nL(Z={}){return{cfg:Z.cfg??jZ(),probe:Z.probe??hZ,extract:Z.extract??E0,assertDuration:Z.assertDuration??L9,resolvePricing:Z.resolvePricing??((Q)=>m8(Q)),upload:Z.upload??gZ,invalidate:Z.invalidate??V8,submit:Z.submit??W8,sleep:Z.sleep??((Q)=>new Promise((Y)=>setTimeout(Y,Q))),poll:Z.poll??(async(Q,Y,J,z)=>await I8(Q,Y,J,{onTick:z})),writeMarkdown:Z.writeMarkdown??aL,now:Z.now??(()=>new Date)}}function pL(Z){return/^[a-z][a-z0-9+.-]*:\/\//i.test(Z.trim())}function iL(Z){return(uZ("audio")??[]).includes(fQ(Z).toLowerCase())}async function oL(Z){if(!Z.trim())throw Error("缺少本地文件路径。用法:gtrk transcript <本地视频|配音音频>");if(pL(Z))throw Error("转文字稿仅支持本地视频/音频文件,不支持 URL、平台地址或远端下载");let Q=bV(Z);if(!fL(Q))throw Error(`本地文件不存在:${Q}`);if(!(await mL(Q)).isFile())throw Error(`输入不是文件:${Q}`);let J=fQ(Q).toLowerCase();if(![...uZ("video")??[],...uZ("audio")??[]].includes(J))throw Error(`不支持的媒体格式「${J||"无扩展名"}」;请输入本地视频或音频文件(音频支持 wav/mp3/flac/m4a/aac/ogg 等)`);return Q}function rL(Z,Q){let Y=h1(Z,fQ(Z)),J=Q?bV(Q):lL(hV(Z),`${Y}-transcript.md`);if(fQ(J).toLowerCase()!==".md")throw Error("--out 必须指向一个 .md 文件");return J}async function aL(Z,Q){await bL(hV(Z),{recursive:!0});let Y=`${Z}.${process.pid}.${Math.random().toString(16).slice(2)}.tmp`;try{await cL(Y,Q,"utf8"),await gL(Y,Z)}finally{await uL(Y,{force:!0})}}async function sL(Z,Q={},Y){if(Q.json)qZ();let J=await oL(Z),z=rL(J,Q.out),X=nL(Y),W=Q.lang?.trim()||"zh-CN",V=h1(J),K=h1(J,fQ(J)),G=iL(J),$=G?"音频":"视频";j.step(`▶ ${$}转文字稿:${V}`),j.step(`① 本地探测${$}…`);let H=X.probe(J,Q.ffmpegPath);if(!(H.duration>0))throw Error(`未探测到有效${$}时长,无法转写`);j.info(`${$}时长 ${H.duration.toFixed(1)}s`);let N=await X.resolvePricing(dL);j.info(`实时计费:${N.billingHint}`),j.step(G?"② 本地转码 16k 单声道音频(原音频文件不动,只传转码衍生物)…":"② 本地抽取 16k 单声道音频(原视频不上传)…");let q=await X.extract(J,Q.ffmpegPath);X.assertDuration(H.duration,q,Q.ffmpegPath),j.info(`上传物:${h1(q)}(仅音频衍生物)`),j.step("③ 上传音频并提交 ASR…");let U=(_)=>({file_id:_,language:W,word_level:!0}),F=await R8(X.cfg,q,fV,U,{force:Q.reupload,onCacheInvalid:()=>j.warn("缓存的 file_id 已失效,重新上传后重试…")},{uploadCached:X.upload,invalidateUpload:X.invalidate,submitTask:X.submit,sleep:X.sleep}),{taskId:M}=F,R={fileId:F.fileId,cached:F.cached};j.info(`task_id = ${M}`),j.step("④ 云端识别中…");let D=await X.poll(X.cfg,fV,M,(_,P)=>{j.tick(`${_}${P!=null?` ${Math.round(P)}%`:""}`)});j.tickEnd();let O=xV(await EJ(D)),C=kV({title:K,sourceName:V,durationSec:H.duration,language:W,generatedAt:X.now(),asr:O,...G?{sourceKind:"audio"}:{}});await X.writeMarkdown(z,C);let T;if(Q.json){let _=(I)=>Math.round(I*1000)/1000,P=O.sentences.map((I,y)=>({id:`u${y+1}`,text:I.text,st:_(I.start),ed:_(Math.max(I.start,I.end))})),E={version:"v1",source:V,material_id:R.fileId,text_hash:hL("sha256").update(P.map((I)=>I.text).join(`
|
|
244
|
+
`),"utf8").digest("hex"),duration:_(H.duration),utterances:P};T=z.replace(/\.md$/i,".json"),await X.writeMarkdown(T,JSON.stringify(E,null,2)),j.info(`transcript.json 已生成:${T}(可直接被 gtrk project init --transcript 兜底路消费)`)}return{ok:!0,taskId:M,fileId:R.fileId,output:z,...T?{transcriptJson:T}:{},summaryPending:!0}}function tL(Z,Q){return Z.description("本地视频/配音音频转文字稿:原文件不上传,只上传 16k 音频衍生物,生成单个待 Agent 补总结的 Markdown(--json 时另产 transcript.json 供 project init 兜底路)").option("-o, --out <file>","输出 Markdown 文件(缺省 <源文件同目录>/<源文件名>-transcript.md)").option("--lang <code>","识别语言代码(默认 zh-CN)","zh-CN").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录").option("--reupload","强制重新上传抽取音频,忽略上传缓存").option("--json","机读模式:stdout 只输出最终结果 JSON;并额外产出 <名>-transcript.json(句级时码,供 project init/split 消费)").action(async(Y,J)=>{let z=await sL(Y,J,Q);if(J.json)console.log(JSON.stringify(z));else j.ok(`带时码文字稿已生成:${z.output}`),j.warn("总结仍待驱动 CLI 的 Agent 阅读全文后写回同一个 Markdown")})}function gV(Z){tL(Z.command("transcript <video>"))}import{resolve as b1,join as g1,dirname as eL,basename as uV,extname as dV}from"node:path";import{mkdir as ZC,writeFile as mV}from"node:fs/promises";import{existsSync as QC}from"node:fs";var u1="music_visualizer",YC="music_visualizer",cV=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/,JC=uZ("audio")??[],lV=uZ("image")??[],zC=uZ("video")??[],XC=(Z,Q)=>{return Q.push(Z),Q};function WC(Z){if(Z==="true")return!0;if(Z==="false")return!1;if(Z.trim()!==""&&!Number.isNaN(Number(Z)))return Number(Z);return Z}function VC(Z,Q){let Y={};for(let J of Z){let z=J.indexOf("=");if(z<0)throw Error(`--param 需要 key=value 格式:「${J}」`);Y[J.slice(0,z).trim()]=WC(J.slice(z+1))}if(Q){let J;try{J=JSON.parse(Q)}catch{throw Error(`--params-json 不是合法 JSON:${Q}`)}if(typeof J!=="object"||J===null||Array.isArray(J))throw Error("--params-json 必须是一个 JSON 对象");Object.assign(Y,J)}return Y}function KC(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}function I2(Z,Q,Y){if(!QC(Z))throw Error(`${Y}不存在:${Z}`);let J=dV(Z).toLowerCase();if(Q.length&&!Q.includes(J))throw Error(`${Y}扩展名不支持:${J}(支持 ${Q.join(" ")})`)}function GC(Z){let Q={};if(Z.track!=null)Q.track=String(Z.track);if(Z.artist!=null)Q.artist=String(Z.artist);if(Z.resolution!=null){let Y=/^(\d+)[xX](\d+)$/.exec(Z.resolution.trim());if(!Y)throw Error(`--resolution 必须是 <宽>x<高> 格式(如 1920x1080):${Z.resolution}`);let J=Number(Y[1]),z=Number(Y[2]);if(!(J>0)||!(z>0))throw Error("--resolution 的宽高必须为正整数");Q.resolution={width:J,height:z}}if(Z.fps!=null){let Y=Number(Z.fps);if(!Number.isInteger(Y)||Y<30||Y>60)throw Error("--fps 必须是 30 到 60 的整数");Q.fps=Y}if(Z.c1!=null){if(!cV.test(Z.c1))throw Error("--c1 必须是十六进制颜色(如 #ff0066 或 #f06)");Q.c1=Z.c1}if(Z.c2!=null){if(!cV.test(Z.c2))throw Error("--c2 必须是十六进制颜色(如 #6600ff 或 #60f)");Q.c2=Z.c2}if(Z.blur!=null){let Y=Number(Z.blur);if(!Number.isInteger(Y)||Y<0||Y>40)throw Error("--blur 必须是 0 到 40 的整数");Q.blur=Y}return Q}function nV(Z){Z.command("music-visualizer <audio>").description("音乐可视化:一首歌 → 频谱可视化成片(可选背景/封面 + 模板/配色样式)").option("-t, --template <id>","可视化模板 id(必填;取值见云端 API 文档 / 服务端模板列表)").option("--background <图或视频>","可选背景素材(图片或视频,独立上传)").option("--cover <图>","可选封面图(仅图片,独立上传)").option("--track <名>","曲名(叠加文字)").option("--artist <名>","歌手名(叠加文字)").option("--resolution <WxH>","输出分辨率(如 1080x1920;默认服务端 1920x1080)").option("--fps <n>","帧率 30-60(默认服务端 30)").option("--c1 <hex>","频谱主色十六进制(如 #ffffff;默认服务端白)").option("--c2 <hex>","频谱第二色十六进制(给定则双色渐变)").option("--blur <n>","背景模糊 0-40(默认服务端 16)").option("-o, --out <dir>","产物目录(缺省 = <音频同目录>/<音频名>-visualizer-<时间戳>)").option("--param <k=v>","透传任意云端参数(标量、可重复)",XC,[]).option("--params-json <json>","透传任意云端参数(JSON 对象)").option("--reupload","强制重新上传,忽略本地上传缓存").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{await $C(Q,Y)})}async function $C(Z,Q){if(Q.json)qZ();let Y=jZ(),J=b1(Z);I2(J,JC,"音频");let z=Q.template==null?"":String(Q.template).trim();if(!z)throw Error("--template 必填:请指定可视化模板 id(取值见云端 API 文档 / 服务端模板列表)");let X=GC(Q),W=Q.background?b1(Q.background):void 0;if(W)I2(W,[...lV,...zC],"背景素材");let V=Q.cover?b1(Q.cover):void 0;if(V)I2(V,lV,"封面图");let K=VC(Q.param,Q.paramsJson),G=uV(J,dV(J)),$=b1(Q.out??g1(eL(J),`${G}-visualizer-${KC()}`));j.step(`▶ 音乐可视化:${uV(J)}(模板 ${z}${W?" · 背景":""}${V?" · 封面":""})`);let H;try{H=(await m8(YC)).billingHint}catch{H="实时价格暂不可用,以服务端结算为准"}process.stderr.write(`\x1B[33m⚠️ 计费提示:${H}\x1B[0m
|
|
245
|
+
`);let N;if(W)j.step("① 上传背景素材…"),N=(await gZ(Y,W,{force:Q.reupload})).fileId,j.info(`背景 file_id = ${N}`);let q;if(V)j.step("① 上传封面图…"),q=(await gZ(Y,V,{force:Q.reupload})).fileId,j.info(`封面 file_id = ${q}`);let F=await R8(Y,J,u1,(E)=>{let I={file_id:E,template_id:z};if(N)I.background_file_id=N;if(q)I.cover_file_id=q;Object.assign(I,X);for(let[y,h]of Object.entries(K)){let v=I[y],S=!!v&&!!h&&typeof v==="object"&&typeof h==="object"&&!Array.isArray(v)&&!Array.isArray(h);I[y]=S?{...v,...h}:h}return I},{force:Q.reupload,onUploaded:(E)=>{j.info(E.cached?`命中上传缓存,复用主音频 file_id = ${E.fileId}`:`主音频 file_id = ${E.fileId}`),j.step("② 提交音乐可视化任务…")},onCacheInvalid:()=>j.warn("缓存的 file_id 在云端已失效,重新上传后重试…")}),{taskId:M}=F;j.info(`task_id = ${M}`),await ZC($,{recursive:!0}),await mV(g1($,"task.json"),JSON.stringify({taskId:M,taskType:u1,fileId:F.fileId,source:J,template:z,createdAt:new Date().toISOString()},null,2)),j.step("③ 云端处理中(每 5s 轮询)…");let R=await B9(Y,u1,M,(E,I)=>{j.tick(`${E}${I!=null?` ${Math.round(I)}%`:""}`)});j.tickEnd();let D=R,O=[D.download_url,D.video_download_url,D.url].find((E)=>typeof E==="string"&&!!E.trim()),C=[],T={};if(O){let E=g1($,`${G}-visualizer${VZ(O,".mp4")}`);try{await E9(O,E),C.push(E)}catch(I){T.output=I instanceof Error?I.message:String(I)}}else T.output="任务完成但未解析到成片下载链接(output_result 形态异常)";let _=C.length>0&&Object.keys(T).length===0,P={ok:_,command:"music-visualizer",taskType:u1,taskId:M,fileId:F.fileId,outDir:$,files:C,...Object.keys(T).length?{errors:T}:{},finishedAt:new Date().toISOString()};if(await mV(g1($,"result.json"),JSON.stringify(P,null,2)),Q.json)process.stdout.write(`${JSON.stringify(P)}
|
|
246
|
+
`);if(!_){j.err(`产物下载失败:${JSON.stringify(T)}。可凭 task.json 的 taskId 稍后恢复。`),process.exitCode=1;return}j.ok(`完成。产物目录:${$}`)}import{existsSync as HC,readdirSync as qC,statSync as UC}from"node:fs";import{join as NC}from"node:path";function pV(Z){let Q=Z.command("deps").description("运行时资产:查看状态 / 显式安装 ffmpeg 与渲染字体");Q.command("status").description("查看 ffmpeg / 字体的当前来源、版本与授权信息").option("--ffmpeg-path <dir>","显式 ffmpeg/ffprobe 目录").action(async(Y)=>{await BC(Y.ffmpegPath)}),Q.command("install").description("从同合云镜像安装运行时资产(已存在则跳过)").option("--ffmpeg","只装 ffmpeg/ffprobe").option("--font","只装渲染字体").option("--force","已存在也覆盖重装").action(async(Y)=>{await jC(Y)})}function S2(Z){return`${(Z/1048576).toFixed(1)} MB`}async function BC(Z){j.step("① ffmpeg / ffprobe");let Q=b8(Z);if(Q){j.ok(`来源:${Q.source}`);try{let X=T6(Q);j.info(X.version),j.info(`libx264 ${X.hasLibx264?"✅":"❌"} ass 滤镜 ${X.filters.has("ass")?"✅":"❌"}`)}catch{j.warn("二进制存在但探测能力失败")}}else j.warn("未找到。装它:gtrk deps install --ffmpeg");j.step("② 渲染字体");let Y=a8(),J=HC(Y)?qC(Y).filter((X)=>/\.(otf|ttf|ttc|otc)$/i.test(X)):[];if(J.length){j.ok(`${Y}(${J.length} 个)`);for(let X of J)j.info(`${X} ${S2(UC(NC(Y,X)).size)}`);j.info("经 ass 滤镜 fontsdir 供给 libass,未安装进系统字体表")}else j.warn(`${Y} 无字体。装它:gtrk deps install --font`),j.info("(系统已装所需字体时也可直接用,两处任一命中即可)");j.step("③ 分发物授权与源码");let z=null;try{z=await p5()}catch(X){j.warn(`取 manifest 失败:${X instanceof Error?X.message:String(X)}`)}if(z){let X="";try{X=g6()}catch{}for(let[W,V]of Object.entries(z.ffmpeg)){let K=W===X?"→":" ";j.info(`${K} ${W.padEnd(10)} ${V.version.padEnd(20)} ${V.license} 源码 ${V.source}`)}for(let[W,V]of Object.entries(z.font))j.info(` 字体 ${W} ${V.license}`);j.info(`合规说明:${z.base}/SOURCE.md`),j.info("分发不附加任何使用限制(不限 gtrk 用户、不禁转发)")}}async function jC(Z){let Q=Z.ffmpeg||!Z.font,Y=Z.font||!Z.ffmpeg;j.step(`读 manifest:${d5}`);let J=await p5();j.info(`schema ${J.schema},生成于 ${J.generated}`);let z=-1,X=0,W=(V,K)=>{if(K<=0)return;let G=Math.floor(V/K*100),$=Date.now();if(G<100&&G-z<5&&$-X<2000)return;z=G,X=$,j.tick(`下载 ${S2(V)} / ${S2(K)}(${G}%)`)};if(Q){let V=g6();j.step(`① ffmpeg(${V})`);let K=await Rz(J,{force:Z.force,onProgress:W});if(j.tickEnd(),K.installed)j.ok(`已安装 ${K.detail}`);else j.info(`跳过(${K.reason}):${K.detail}`)}if(Y){j.step("② 渲染字体");let V=await Dz(J,{force:Z.force,onProgress:W});j.tickEnd();for(let K of V)if(K.installed)j.ok(`已安装 ${K.detail}`);else j.info(`跳过(${K.reason}):${K.detail}`);j.info("未写系统字体表、未改注册表——烧录时经 ass 滤镜 fontsdir 供给")}j.ok(`完成。二进制在 ${r8()},字体在 ${a8()}`)}import{existsSync as iV}from"node:fs";import{mkdir as v2,readFile as FC,writeFile as w2}from"node:fs/promises";import{basename as y2,dirname as MC,extname as oV,join as V0,resolve as x2}from"node:path";var RC="cli/audio_project_struct",DC="audio_tts_clone",PC=[1080,1920];function OC(){let Z=new Date,Q=(Y)=>String(Y).padStart(2,"0");return`${Q(Z.getFullYear()%100)}${Q(Z.getMonth()+1)}${Q(Z.getDate())}-${Q(Z.getHours())}${Q(Z.getMinutes())}${Q(Z.getSeconds())}`}var m1=(Z)=>Math.round(Z*1000)/1000;function LC(Z){if(!Z||Z.length===0)throw Error("缺少子命令——用法:gtrk project init --tts-task <task_id> | --audio <配音> --transcript <json>");if(Z[0]!=="init"||Z.length>1)throw Error(`未知子命令「${Z.join(" ")}」——当前仅支持:gtrk project init`);return"init"}function CC(Z){if(Z===void 0)return[...PC];let Q=/^(\d{2,5})[xX](\d{2,5})$/.exec(Z.trim());if(!Q)throw Error(`--canvas 取值非法(${Z})——格式 WxH(如 1080x1920)`);let Y=Number(Q[1]),J=Number(Q[2]);if(!(Y>0&&J>0))throw Error(`--canvas 取值非法(${Z})——宽高必须为正整数`);return[Y,J]}function _C(Z,Q){let Y=Z;if(!Y||typeof Y!=="object"||!Array.isArray(Y.utterances)||Y.utterances.length===0)throw Error(`transcript.json 结构异常(缺 utterances 数组或为空):${Q}——请用 gtrk transcript <配音音频> --json 产出`);let J=Y.utterances.map((V,K)=>{let G=V??{},$=typeof G.text==="string"?G.text:"",H=Number(G.st),N=Number(G.ed);if(!$||!Number.isFinite(H)||!Number.isFinite(N)||N<H||H<0)throw Error(`transcript.json 第 ${K+1} 条 utterance 非法(需 text 非空、0 ≤ st ≤ ed):${Q}`);return{id:typeof G.id==="string"&&G.id?G.id:`u${K+1}`,text:$,st:m1(H),ed:m1(N)}}),z=Number(Y.duration),X=J.reduce((V,K)=>Math.max(V,K.ed),0),W=Number.isFinite(z)&&z>0?m1(z):m1(X);if(!(W>0))throw Error(`transcript.json 推不出有效时长(duration 缺失且句级时码全 0):${Q}`);return{utterances:J,duration:W}}function TC(Z,Q,Y){let J=Array.isArray(Z.materials)?Z.materials:[],z=typeof Q.material_id==="string"?Q.material_id:void 0,X=z?J.filter((W)=>W.id===z):[];if(X.length===0)X=J;for(let W of X)W.path=Y;return X.length}async function k2(Z,Q,Y=fetch){let J=await Y(`${Z.base}/task/${RC}`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Q)}),z=await tZ(J),X=z.data??{},W=(V)=>!!V&&typeof V==="object"&&!Array.isArray(V);if(z.code===200&&W(X.gtrk)&&W(X.transcript))return{gtrk:X.gtrk,transcript:X.transcript,taskId:X.task_id!=null?String(X.task_id):null};if(z.code===200)throw Error("工程生成响应缺 gtrk/transcript(非 audio_project_struct 契约响应)");throw new OZ(z.code,`工程生成失败 (code=${z.code??"?"}):${z.msg??"未知错误"}`)}async function AC(Z,Q,Y,J,z){let W=await z.upload(Z,Q,{force:J.force});if(j.info(W.cached?`命中上传缓存,复用 file_id = ${W.fileId}(免二次上传)`:`file_id = ${W.fileId}`),W.cached)try{return{resp:await k2(Z,Y(W.fileId),z.fetchFn),fileId:W.fileId}}catch(V){if(L0(V)!==6004)throw V;j.warn("缓存的 file_id 在云端已失效,重新上传后重试…"),await z.invalidate(Q),W=await z.upload(Z,Q,{force:!0})}for(let V=0;;V++)try{return{resp:await k2(Z,Y(W.fileId),z.fetchFn),fileId:W.fileId}}catch(K){if(L0(K)!==6004||V>=O9.length)throw K;await z.sleep(O9[V])}}async function EC(Z,Q={}){if(Z.json)qZ();let Y=!!Z.ttsTask?.trim(),J=!!Z.audio,z=!!Z.transcript;if(Y&&(J||z))throw Error("--tts-task 与 --audio/--transcript 互斥:主路引用 TTS 任务,兜底路自备配音,二选一");if(!Y&&!(J&&z))throw Error("需要 --tts-task <task_id>(主路:刚完成的 audio_tts_clone 任务)或 --audio <配音> --transcript <transcript.json> 成对(兜底路:自备配音)");let X=CC(Z.canvas),W=Z.keepPunctuation?{strip_punctuation:!1}:{},V,K;if(!Y){if(V=x2(Z.audio),!iV(V))throw Error(`配音音频不存在:${V}`);let _=oV(V).toLowerCase();if(!(uZ("audio")??[]).includes(_))throw Error(`不支持的音频格式「${_||"无扩展名"}」;请输入本地配音音频文件(wav/mp3/flac/m4a/aac/ogg 等)`);let P=x2(Z.transcript);if(!iV(P))throw Error(`找不到 transcript.json:${P}`);let E;try{E=JSON.parse(await FC(P,"utf8"))}catch(I){throw Error(`transcript.json 不是合法 JSON:${P}(${I instanceof Error?I.message:String(I)})`)}K=_C(E,P)}let G=Q.cfg??jZ(),$={fetchFn:Q.fetchFn??fetch,upload:Q.upload??gZ,invalidate:Q.invalidate??V8,getTtsResult:Q.getTtsResult??A8,download:Q.download??g8,openFolder:Q.openFolder??D0,sleep:Q.sleep??((_)=>new Promise((P)=>setTimeout(P,_)))},H=Y?`tts-${Z.ttsTask.trim()}`:y2(V,oV(V)),N=Y?process.cwd():MC(V),q=x2(Z.out??V0(N,`${H}-video-project-${OC()}`));if(j.step(`▶ 音频驱动工程起盘:${Y?`TTS 任务 ${Z.ttsTask}`:y2(V)}(画布 ${X[0]}x${X[1]})`),j.info("工程 JSON 由服务端 producer 同步口生成(emit 链单一权威源);本接口 0 积分不计费。"),Z.keepPunctuation)j.info("保留原始标点(--keep-punctuation):transcript 文稿逐字保留逗号句号");let U,F;if(Y)j.step("① 服务端拼装工程(TTS 产物 segments 直出,零 ASR)…"),U=await k2(G,{tts_task_id:Z.ttsTask.trim(),canvas:X,...W},$.fetchFn);else{j.step("① 上传配音并请求服务端拼装工程…");let _=await AC(G,V,(P)=>({file_id:P,utterances:K.utterances,duration:K.duration,canvas:X,...W}),{force:Z.reupload},$);U=_.resp,F=_.fileId}if(U.taskId)j.info(`task_id = ${U.taskId}`);j.step("② 落地产物目录(gtrk / transcript / result.json)…");let M={};await v2(V0(q,"gtrk"),{recursive:!0}),await v2(V0(q,"transcript"),{recursive:!0});let R=null;if(Y)try{let _=await $.getTtsResult(G,DC,Z.ttsTask.trim()),P=$Z(_.output,["download_url"]);if(!P)throw Error("TTS 任务产物缺 download_url(任务未完成或产物已过期)");await v2(V0(q,"audio"),{recursive:!0});let E=V0(q,"audio",`tts-${Z.ttsTask.trim()}${VZ(P,".wav")}`);await $.download(P,E),R=E,j.info(`TTS 配音已下载:${y2(E)}`)}catch(_){let P=_ instanceof Error?_.message:String(_);M["tts_audio:download"]=P,j.warn(`TTS 产物音频下载失败(${P})——工程照常落地,但配音素材路径未本地化,客户端打开需手动定位素材`)}else R=V;let D=0;if(R){if(D=TC(U.gtrk,U.transcript,R),D===0)M["gtrk:materials"]="工程 materials 为空,无从改写配音素材路径(服务端契约异常)",j.warn(M["gtrk:materials"])}let O=V0(q,"gtrk","project.gtrk"),C=V0(q,"transcript","transcript.json");await w2(O,JSON.stringify(U.gtrk,null,2)),await w2(C,JSON.stringify(U.transcript,null,2));let T={ok:Object.keys(M).length===0,mode:"init",outDir:q,gtrkPath:O,transcriptPath:C,audioPath:R,taskId:U.taskId,...Y?{ttsTaskId:Z.ttsTask.trim()}:{},...F?{fileId:F}:{},canvas:X,rewritten:D,errors:M};if(await w2(V0(q,"result.json"),JSON.stringify(T,null,2)),!Z.json)j.step("三方打开(产物已就位,按需自取):"),console.log(` • ${HQ.gtrk.label}:${HQ.gtrk.openHint(O)}`),console.log(` • 结果清单:${V0(q,"result.json")}`);if(Z.open!==!1)$.openFolder(q),j.info("已打开产物目录文件夹");if(j.ok(`配音打底工程已就绪:${q}(可直接 gtrk split --project 投影拆分)`),Z.json)console.log(JSON.stringify(T));return T}function rV(Z){Z.command("project [words...]").description("音频驱动工程族:gtrk project init 从配音起盘建 .gtrk 工程(主路 --tts-task 引用 TTS 任务;兜底 --audio+--transcript 自备配音)").option("--tts-task <task_id>","主路:引用已完成的 audio_tts_clone 任务(服务端取产物音频+句级 segments,零 ASR)").option("--audio <file>","兜底路:自备配音音频(与 --transcript 成对使用;CLI 先上传归一)").option("--transcript <file>","兜底路:transcript.json(gtrk transcript <配音音频> --json 产出)").option("--canvas <WxH>","画布尺寸(默认 1080x1920)").option("-o, --out <dir>","产物目录(缺省 = <基目录>/<名>-video-project-<YYMMDD-HHMMSS>)").option("--reupload","兜底路:强制重新上传配音音频,忽略本地上传缓存").option("--keep-punctuation","transcript 文稿保留全部标点(缺省按统一口径去逗号句号、保留?!等)").option("--no-open","完成后不自动打开产物目录(默认会自动打开)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{LC(Q),await EC(Y)})}import{existsSync as l9}from"node:fs";import{createHash as bC}from"node:crypto";import{basename as l2,extname as d2,join as GK,resolve as h0}from"node:path";import{readFileSync as eV,writeFileSync as IC}from"node:fs";import{basename as ZK,dirname as b2,extname as h2,isAbsolute as SC,join as c1,resolve as QK}from"node:path";var c9=4000,f0=100,vC=c9/f0,wC=2,yC=30,xC=0.12,YK=2;async function aV(Z,Q,Y){let{ffmpeg:J}=AZ(Y);await M8(J,["-y","-v","error","-i",Z,"-vn","-ac","1","-ar",String(c9),"-f","s16le","-c:a","pcm_s16le",Q]);let z=eV(Q);return new Int16Array(z.buffer,z.byteOffset,Math.floor(z.byteLength/2))}function sV(Z){let Q=Math.floor(Z.length/f0),Y=new Float64Array(Q);for(let z=0;z<Q;z++){let X=0,W=z*f0;for(let V=0;V<f0;V++){let K=Z[W+V]/32768;X+=K*K}Y[z]=Math.sqrt(X/f0)}let J=0;for(let z=0;z<Q;z++)J+=Y[z];J/=Math.max(1,Q);for(let z=0;z<Q;z++)Y[z]-=J;return Y}function f2(Z,Q,Y){let J=Z.length;for(let z=1,X=0;z<J;z++){let W=J>>1;for(;X&W;W>>=1)X^=W;if(X^=W,z<X)[Z[z],Z[X]]=[Z[X],Z[z]],[Q[z],Q[X]]=[Q[X],Q[z]]}for(let z=2;z<=J;z<<=1){let X=(Y?1:-1)*2*Math.PI/z,W=Math.cos(X),V=Math.sin(X);for(let K=0;K<J;K+=z){let G=1,$=0;for(let H=0;H<z/2;H++){let N=Z[K+H],q=Q[K+H],U=Z[K+H+z/2]*G-Q[K+H+z/2]*$,F=Z[K+H+z/2]*$+Q[K+H+z/2]*G;Z[K+H]=N+U,Q[K+H]=q+F,Z[K+H+z/2]=N-U,Q[K+H+z/2]=q-F;let M=G*W-$*V;$=G*V+$*W,G=M}}}if(Y)for(let z=0;z<J;z++)Z[z]/=J,Q[z]/=J}function kC(Z,Q){let Y=Z.length+Q.length-1,J=1;while(J<Y)J<<=1;let z=new Float64Array(J),X=new Float64Array(J),W=new Float64Array(J),V=new Float64Array(J);z.set(Z),W.set(Q),f2(z,X,!1),f2(W,V,!1);for(let $=0;$<J;$++){let H=z[$]*W[$]+X[$]*V[$],N=X[$]*W[$]-z[$]*V[$];z[$]=H,X[$]=N}f2(z,X,!0);let K=new Float64Array(Y),G=Q.length;for(let $=-(G-1);$<Z.length;$++){let H=$>=0?$:J+$;K[$+G-1]=z[H]}return{corr:K,lagOfIndex:($)=>$-(G-1)}}function fC(Z,Q,Y){let J=0;for(let V=1;V<Z.length;V++)if(Z[V]>Z[J])J=V;let z=Number.NEGATIVE_INFINITY;for(let V=0;V<Z.length;V++){if(Math.abs(V-J)<=Y)continue;if(Z[V]>z)z=Z[V]}let X=Z[J],W=z>0?X/z:X>0?99:1;return{lag:Q(J),confidence:W,peakNorm:X}}function hC(Z,Q,Y){let J=Math.min(yC*c9,Z.length),z=0,X=-1,W=c9;for(let $=0;$+J<=Z.length;$+=W){let H=0;for(let N=$;N<$+J;N+=16)H+=Math.abs(Z[N]);if(H>X)X=H,z=$}let V=Math.round(xC*c9),K=Y,G=Number.NEGATIVE_INFINITY;for(let $=Y-V;$<=Y+V;$+=1){let H=0,N=0;for(let U=z;U<z+J;U+=4){let F=U-$;if(F<0||F>=Q.length)continue;H+=Z[U]/32768*(Q[F]/32768),N++}if(N===0)continue;let q=H/N;if(q>G)G=q,K=$}return K}async function JK(Z,Q,Y,J){let z=await aV(Z,c1(Y,"align-video.pcm"),J),X=await aV(Q,c1(Y,"align-ext.pcm"),J);if(z.length<f0*10||X.length<f0*10)throw Error("音频太短(不足 0.25s),无法对轨");let W=sV(z),V=sV(X),{corr:K,lagOfIndex:G}=kC(W,V),$=0,H=0;for(let M=0;M<W.length;M++)$+=W[M]*W[M];for(let M=0;M<V.length;M++)H+=V[M]*V[M];let N=Math.sqrt($*H)||1;for(let M=0;M<K.length;M++)K[M]/=N;let q=fC(K,G,Math.round(wC*vC)),U=q.lag*f0;return{offsetSec:hC(z,X,U)/c9,confidence:Math.round(q.confidence*100)/100,peakCorr:Math.round(q.peakNorm*1000)/1000}}async function zK(Z,Q,Y,J,z){let{ffmpeg:X}=AZ(z),W=U8(Z,z),V=[],K=["-y","-v","error","-i",Z];if(Y>=0.0005)K.push("-i",Q),V.push(`adelay=${Math.round(Y*1000)}:all=1`);else if(Y<=-0.0005)K.push("-ss",(-Y).toFixed(4),"-i",Q);else K.push("-i",Q);V.push(`apad=whole_dur=${W.toFixed(4)}`),K.push("-map","0:v:0","-map","1:a:0","-c:v","copy","-c:a","aac","-b:a","192k","-af",V.join(","),"-movflags","+faststart",J),await M8(X,K)}var tV=(Z)=>QK(Z).replace(/\\/g,"/"),P8=(Z)=>Math.round(Z*1000)/1000;function XK(Z,Q,Y,J,z){let X=P8(Math.max(0,-Y)),W=P8(Math.max(0,Y));return{version:"v1",video_size:[J.width,J.height],video_rate:Math.max(1,Math.round(J.fps)),duration:P8(Math.max(X+J.duration,W+z)),materials:[{id:"align-video",path:tV(Z),duration:P8(J.duration),video_size:[J.width,J.height],video_rate:Math.max(1,Math.round(J.fps))},{id:"align-ext-audio",path:tV(Q),duration:P8(z),audio_channel:"stereo"}],video_track:[{track_index:0,track_size:[J.width,J.height],track_timeline:[{clip_id:"align-v0",material:"align-video",clip_st:0,clip_ed:P8(J.duration),track_st:X,track_ed:P8(X+J.duration),duration:P8(J.duration)}]}],audio_track:[{track_index:0,track_timeline:[{clip_id:"align-a0",material:"align-ext-audio",clip_st:0,clip_ed:P8(z),track_st:W,track_ed:P8(W+z),duration:P8(z)}]}]}}function WK(Z){let Q=JSON.parse(eV(Z,"utf8")),Y=Q.materials??[],J=new Map(Y.map((U)=>[String(U.id),U])),z=Q.video_track??[],X=Q.audio_track??[],W=(U)=>{for(let F of U)for(let M of F.track_timeline??[])if(M.material)return M;return},V=W(z),K=W(X);if(!V||!K)throw Error("对齐工程不完整:找不到视频/音频 clip");let G=J.get(String(V.material)),$=J.get(String(K.material)),H=String(G?.path??""),N=String($?.path??"");if(!H||!N)throw Error("对齐工程素材缺 path,无法定位原文件");let q=(U)=>SC(U)?U:QK(b2(Z),U);return{videoAbs:q(H),extAudioAbs:q(N),offsetSec:P8(Number(K.track_st??0)-Number(V.track_st??0))}}function g2(Z,Q){let Y=h2(Z).toLowerCase()===".mov"?".mov":".mp4",J=ZK(Z,h2(Z));return c1(Q??b2(Z),`${J}_extaudio${Y}`)}function VK(Z,Q){let Y=ZK(Z,h2(Z));return c1(Q??b2(Z),`${Y}_align.gtrk`)}function KK(Z,Q){IC(Z,JSON.stringify(Q,null,1),"utf8")}import{mkdir as gC}from"node:fs/promises";var l1=0.1,uC="audio-lay-",u2=0.05,O8=(Z)=>Math.round(Z*1000)/1000;function mC(Z){if(!Z||Z.length===0)throw Error("缺少子命令——用法:gtrk audio lay --project <目录> --file <音频>;或 gtrk audio align <视频> <外录音频>");if(Z[0]==="lay"){if(Z.length>1)throw Error(`未知参数「${Z.slice(1).join(" ")}」——lay 不收 positional`);return{sub:"lay"}}if(Z[0]==="align"){if(Z.length>3)throw Error("align 最多收两个 positional:<视频毛片> <外录音频>");return{sub:"align",video:Z[1],extAudio:Z[2]}}throw Error(`未知子命令「${Z.join(" ")}」——支持:gtrk audio lay / gtrk audio align`)}function cC(Z){return`${uC}${bC("sha256").update(Z,"utf8").digest("hex").slice(0,16)}`}function lC(Z){let Q=Number(Z.duration);if(Number.isFinite(Q)&&Q>0)return Q;let Y=0;for(let J of Array.isArray(Z.video_track)?Z.video_track:[])for(let z of Array.isArray(J.track_timeline)?J.track_timeline:[]){let X=Number(z.track_ed);if(Number.isFinite(X)&&X>Y)Y=X;else{let W=Number(z.track_st),V=Number(z.duration);if(Number.isFinite(W)&&Number.isFinite(V)&&W+V>Y)Y=W+V}}return Y>0?Y:void 0}function dC(Z,Q){let Y=Q.filter((z)=>Number.isFinite(z)&&z>=0).sort((z,X)=>z-X);if(!Y.length)return;let J=Y[0];for(let z of Y)if(Math.abs(z-Z)<Math.abs(J-Z))J=z;return O8(J)}function nC(Z){if(Z===void 0)return l1;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0&&Q<=1)return Q;return j.warn(`--volume 取值非法(${Z}),按默认 ${l1} 处理`),l1}function pC(Z){if(Z===void 0)return 0;let Q=Number(Z);if(Number.isFinite(Q)&&Q>=0)return Math.round(Q);return j.warn(`--offset 取值非法(${Z}),按 0 处理`),0}function iC(Z){let Q=[GK(Z,"gtrk","project.gtrk"),GK(Z,"project.gtrk")],Y=Q.find((J)=>l9(J));if(!Y)throw Error(`未找到工程文件(${Q[0]})——需要 oralcut / project init 产物目录`);return Y}async function oC(Z,Q={}){if(Z.json)qZ();if(!Z.project)throw Error("需要 --project <目录>(工程产物目录)");if(!Z.file)throw Error("需要 --file <音频>(要上轨的 BGM/音频文件)");let Y=h0(Z.file);if(!l9(Y))throw Error(`音频文件不存在:${Y}`);let J=d2(Y).toLowerCase();if(!(uZ("audio")??[]).includes(J))throw Error(`不支持的音频格式「${J||"无扩展名"}」;请输入本地音频文件(wav/mp3/flac/m4a/aac/ogg 等)`);let z=nC(Z.volume),X=pC(Z.offset),W=iC(h0(Z.project)),{gtrk:V,revision:K}=lZ(W);G8(V);let G=Q.probeDur??((l)=>U8(l)),$=Q.probeChannel??((l)=>_z(l)),H=G(Y);if(!(H>0))throw Error(`探测不到有效音频时长:${Y}`);j.step(`▶ 音频上轨:${l2(Y)}(${H.toFixed(1)}s · 音量 ${z}${Z.beatAlign?" · beat 对齐":""})`);let N=lC(V),q=O8(X/1000);if(N!==void 0&&q>=N)throw Error(`--offset ${X}ms 落在工程末尾(${N.toFixed(2)}s)之外,无处可放`);let U;if(Z.beatAlign){U={aligned:!1,grid:null};try{let l=(Q.loadCfg??jZ)();j.info("节拍分析走云端 audio_music_analyze(计费一次,价格以官网价格表为准)…");let n=await(Q.analyze??((BZ,PZ)=>f1(BZ,PZ,{uploadCached:gZ,invalidateUpload:V8,submitTask:W8,pollToolTask:I8})))(l,Y),QZ=n.downbeats?.length?"downbeats":n.beats?.length?"beats":null,zZ=QZ?dC(q,QZ==="downbeats"?n.downbeats:n.beats):void 0;if(zZ===void 0)U.degradedReason="云端分析未返回可用节拍点(无节拍音乐?)——按原始 offset 上轨",j.warn(`beat 对齐降级:${U.degradedReason}`);else if(N!==void 0&&zZ>=N)U.degradedReason=`最近 downbeat(${zZ}s)已在工程末尾之外——按原始 offset 上轨`,j.warn(`beat 对齐降级:${U.degradedReason}`);else{if(QZ==="beats")j.info("downbeat 缺失,回退 beats 网格吸附");q=zZ,U.aligned=!0,U.grid=QZ,j.info(`起点已吸附最近 ${QZ==="downbeats"?"downbeat":"beat"}:${q}s`)}}catch(l){U.degradedReason=`${l instanceof Error?l.message:String(l)}——BGM 照常上轨(不对齐)`,j.warn(`beat 对齐降级:${U.degradedReason}`)}}let F=N!==void 0?Math.max(0,N-q):H,M=Z.noLoop!==!0&&N!==void 0,R=O8(Math.min(H,F));if(R<u2)throw Error(`起点 ${q}s 之后已放不下音频(工程末尾 ${N?.toFixed(2)}s)`);if(!M&&R<H-0.000001)j.info(`音频长于剩余时间线,已在工程末尾裁剪(上轨 ${R}s / 全长 ${O8(H)}s)`);let D=[...V.materials??[]],O=[...V.audio_track??[]],C=cC(Y),T=new Set(D.filter((l)=>typeof l.id==="string"&&l.path===Y).map((l)=>l.id));T.add(C);let _=O.filter((l)=>!(l.track_timeline??[]).some((f)=>typeof f.material==="string"&&T.has(f.material))),P=O.length-_.length;if(P>0)j.info(`同源幂等:已替换 ${P} 条既有同文件音轨(不叠加重复轨)`);let E=new Set;for(let l of[V.video_track??[],V.beat_track??[],_])for(let f of l)for(let n of f.track_timeline??[])if(typeof n.material==="string")E.add(n.material);let I=D.filter((l)=>!(typeof l.id==="string"&&T.has(l.id)&&!E.has(l.id))),y=_.reduce((l,f)=>Math.max(l,typeof f.track_index==="number"?f.track_index:-1),-1)+1,h=[];{let l=q,f=0,n=N!==void 0?N:q+R;do{let QZ=O8(n-l),zZ=O8(Math.min(H,QZ));if(zZ<u2)break;h.push({clip_id:`${C}-${f}`,material:C,clip_st:0,clip_ed:zZ,track_st:O8(l),track_ed:O8(l+zZ),duration:zZ,volume:z}),l=O8(l+zZ),f+=1}while(M&&l<n-u2)}if(h.length===0)throw Error(`起点 ${q}s 之后已放不下音频(工程末尾 ${N?.toFixed(2)}s)`);if(h.length>1){let l=h[h.length-1];j.info(`BGM 循环铺满:${h.length} 段(全长 ${O8(H)}s × ${h.length-1} + 尾段 ${l.duration}s,对齐工程末尾)`)}let v=h[0],S={track_index:y,muted:!1,track_timeline:h},k=$(Y),c={id:C,path:Y,duration:O8(H),...k?{audio_channel:k}:{}},a={...V,materials:[...I.filter((l)=>l.id!==C),c],audio_track:[..._,S].sort((l,f)=>(l.track_index??0)-(f.track_index??0))};c8(W,a,K),j.ok(`音轨已写入:track_index ${y} · ${q}s → ${O8(q+R)}s · 音量 ${z}`+(P?`(替换旧同源轨 ${P} 条)`:"")),j.info("客户端打开工程即见音轨;本地渲染(gtrk render)混音可闻。"),L4(Y,Z.project);let u={ok:!0,mode:"audio-lay",gtrkPath:W,trackIndex:y,replacedTracks:P,materialId:C,volume:z,offsetMs:X,clip:{clip_st:v.clip_st,clip_ed:v.clip_ed,track_st:v.track_st,track_ed:v.track_ed,duration:v.duration},...U?{beatAlign:U}:{},loopCount:h.length};if(Z.json)console.log(JSON.stringify(u));return u}async function rC(Z,Q,Y){if(Y.json)qZ();let J=Y._detect??JK,z=Y._mux??zK,X=Y.threshold!=null?Number(Y.threshold):YK;if(!Number.isFinite(X)||X<=0)throw Error(`--threshold 需要正数,拿到「${Y.threshold}」`);if(Y.resume){let C=h0(Y.resume);if(!l9(C))throw Error(`对齐工程不存在:${C}`);let T=WK(C);j.info(`对齐工程读回:offset = ${T.offsetSec.toFixed(3)}s(音轨 track_st − 视频轨 track_st)`);let _=Y.out?h0(Y.out):g2(T.videoAbs);m2(_,Y.force),await z(T.videoAbs,T.extAudioAbs,T.offsetSec,_,Y.ffmpegPath),c2(_);let P={ok:!0,mode:"resume",offsetSec:T.offsetSec,output:_};if(Y.json)console.log(JSON.stringify(P));return P}if(!Z||!Q)throw Error("用法:gtrk audio align <视频毛片> <外录音频>(或 --resume <对齐工程>)");let W=h0(Z),V=h0(Q);if(!l9(W))throw Error(`视频不存在:${W}`);if(!l9(V))throw Error(`外录音频不存在:${V}`);let K=new Set(uZ("video")),G=new Set(uZ("audio")),$=d2(W).toLowerCase(),H=d2(V).toLowerCase();if(G.has($)&&!K.has($))throw Error(`第一个参数要视频毛片,拿到音频「${l2(W)}」——参数顺序是 <视频> <外录音频>`);if(K.has(H)&&!G.has(H))throw Error(`第二个参数要外录音频,拿到视频「${l2(V)}」——参数顺序是 <视频> <外录音频>`);let N=Y.out?h0(Y.out):g2(W);if(Y.offset!=null){let C=Number(Y.offset);if(!Number.isFinite(C))throw Error(`--offset 需要秒数,拿到「${Y.offset}」`);m2(N,Y.force),await z(W,V,C,N,Y.ffmpegPath),c2(N);let T={ok:!0,mode:"manual-offset",offsetSec:C,output:N};if(Y.json)console.log(JSON.stringify(T));return T}let q=U8(W,Y.ffmpegPath),U=U8(V,Y.ffmpegPath);if(U<q-1)j.warn(`外录(${U.toFixed(1)}s)比视频(${q.toFixed(1)}s)短——成片尾部将无外录声,请确认给对了文件`);j.step("对轨检测(互相关测偏移 + 置信度)…"),await gC(G9(),{recursive:!0});let F=await J(W,V,G9(),Y.ffmpegPath);if(j.info(`偏移 = ${F.offsetSec.toFixed(3)}s(正=外录晚开录) 置信度 = ${F.confidence}(阈值 ${X})`),F.confidence>=X){m2(N,Y.force),await z(W,V,F.offsetSec,N,Y.ffmpegPath),c2(N);let C={ok:!0,mode:"auto",offsetSec:F.offsetSec,confidence:F.confidence,threshold:X,output:N};if(Y.json)console.log(JSON.stringify(C));return C}let M=hZ(W,Y.ffmpegPath),R=Y.out&&Y.out.toLowerCase().endsWith(".gtrk")?h0(Y.out):VK(W),D=XK(W,V,F.offsetSec,M,U);KK(R,D),j.warn(`置信度 ${F.confidence} < 阈值 ${X},不自动换轨。`),j.info(`已产对齐工程:${R}`),j.info("请在客户端打开该工程,把音轨拖到与画面对齐后保存,然后跑:"),j.info(` gtrk audio align --resume "${R}"`);let O={ok:!0,mode:"align-project",offsetSec:F.offsetSec,confidence:F.confidence,threshold:X,alignProject:R};if(Y.json)console.log(JSON.stringify(O));return O}function m2(Z,Q){if(l9(Z)&&!Q)throw Error(`产物已存在:${Z}(加 --force 覆盖)`)}function c2(Z){j.ok(`换轨完成(视频流零像素改动):${Z}`),j.info("⚠️ 该文件是后续工程的素材,请留存——删了工程会素材脱机。原毛片未动(内录保底轨)。")}function $K(Z){Z.command("audio [words...]").description("音频零件族:gtrk audio lay 往 .gtrk 追加 audio_track(BGM 上轨);gtrk audio align 外录音轨对轨换声(互相关测偏移+置信度分流,纯本地零计费)").option("--project <dir>","[lay] 工程产物目录(定位 gtrk/project.gtrk)").option("--file <audio>","[lay] 要上轨的音频文件(BGM/配乐等)").option("--volume <v>",`[lay] 音量 0..1(默认 ${l1},BGM 垫底音量)`).option("--offset <v>","[lay] 入点偏移毫秒;[align] 显式偏移秒(跳过检测直接换轨,正=外录晚开录)").option("--beat-align","[lay] 云端节拍分析(audio_music_analyze,计费一次)并把起点吸附最近 downbeat;无 Key/失败自动降级为不对齐,不失败整命令").option("--no-loop","[lay] 关闭循环铺满(缺省 BGM 短于工程时循环叠满至末尾、尾段裁齐)").option("--resume <gtrk>","[align] 客户端拖齐保存后的对齐工程,读回偏移完成换轨").option("--threshold <r>","[align] 置信度阈值(主峰/次峰显著性比;缺省真机标定值)").option("-o, --out <path>","[align] 产物路径(缺省 <视频名>_extaudio.<ext>;低置信时为对齐工程路径)").option("--force","[align] 产物已存在时覆盖").option("--ffmpeg-path <dir>","指定 ffmpeg/ffprobe 所在目录(缺省 ~/.gitruck/ffmpeg → 系统 PATH)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{let J=mC(Q);if(J.sub==="lay"){await oC(Y);return}await rC(J.video,J.extAudio,Y)})}import{existsSync as r2}from"node:fs";import{readFileSync as $_}from"node:fs";import{join as d9,resolve as o2}from"node:path";import{randomUUID as FK}from"node:crypto";var aC=120000,n1=0.8,p2="思源黑体 CN Bold",n2=90,HK=["default","outline","cinema_yellow","immersive_box","wide_spacing","deep_shadow","boxed"],sC="default",qK=["雅黑","淡绿","森林绿","湖蓝","道奇蓝","钢蓝","浅粉红","深橙","珊瑚橙","橙红","土豪金"],tC="雅黑",eC={雅黑:"#333333",淡绿:"#6BC76A",森林绿:"#20A21F",湖蓝:"#11BBF0",道奇蓝:"#1D88F1",钢蓝:"#4682B4",浅粉红:"#F37271",深橙:"#FF8C00",珊瑚橙:"#FF7F50",橙红:"#F74B0E",土豪金:"#ECC71E"},Z_=0.3568627450980392,UK="rgba(28, 28, 28, 0.75)",Q_="rgba(0, 0, 0, 0.62)",Z9={playResX:1080,playResY:1920,marginL:36,marginR:36},Q9={playResX:1920,playResY:1080,marginL:100,marginR:100},Y_={default:{borderStyle:1,textColor:"#ffffff",shadowColor:UK,glyphScaleX:100,glyphScaleY:100,portrait:{...Z9,fontSize:100,outline:0,shadow:4,marginV:400},landscape:{...Q9,fontSize:75,outline:0,shadow:4,marginV:75}},outline:{borderStyle:1,textColor:"#ffffff",shadowColor:"#6a6a6a",glyphScaleX:100,glyphScaleY:100,portrait:{...Z9,fontSize:100,outline:10,shadow:3.6,marginV:400},landscape:{...Q9,fontSize:75,outline:10,shadow:3.6,marginV:50}},cinema_yellow:{borderStyle:1,textColor:"#ffd700",shadowColor:null,glyphScaleX:100,glyphScaleY:100,portrait:{...Z9,fontSize:100,outline:10,shadow:0,marginV:400},landscape:{...Q9,fontSize:75,outline:10,shadow:0,marginV:50}},immersive_box:{borderStyle:3,textColor:"#ffffff",shadowColor:Q_,glyphScaleX:100,glyphScaleY:100,portrait:{...Z9,fontSize:100,outline:15,shadow:8,marginV:400},landscape:{...Q9,fontSize:75,outline:15,shadow:8,marginV:50}},wide_spacing:{borderStyle:1,textColor:"#ffffff",shadowColor:UK,glyphScaleX:90,glyphScaleY:115,portrait:{...Z9,fontSize:100,outline:4,shadow:2,marginV:400},landscape:{...Q9,fontSize:75,outline:4,shadow:2,marginV:50}},deep_shadow:{borderStyle:1,textColor:"#ffffff",shadowColor:"#000000",glyphScaleX:100,glyphScaleY:100,portrait:{...Z9,fontSize:100,outline:4,shadow:10,marginV:400},landscape:{...Q9,fontSize:75,outline:4,shadow:10,marginV:50}},boxed:{borderStyle:3,textColor:"#ffffff",shadowColor:null,glyphScaleX:100,glyphScaleY:100,portrait:{...Z9,fontSize:100,outline:20,shadow:0,marginV:400},landscape:{...Q9,fontSize:75,outline:20,shadow:0,marginV:50}}};function MK(Z){if(Z===void 0)return sC;if(HK.includes(Z))return Z;throw Error(`未知字幕样式「${Z}」——合法取值:${HK.join(" / ")}`)}function RK(Z){if(Z===void 0)return tC;if(qK.includes(Z))return Z;throw Error(`未知字幕颜色「${Z}」——合法取值:${qK.join(" / ")}`)}function i2(Z){return Z.width>=Z.height?"landscape":"portrait"}function J_(Z,Q){let Y=Z.replace("#",""),J=Number.parseInt(Y.slice(0,2),16),z=Number.parseInt(Y.slice(2,4),16),X=Number.parseInt(Y.slice(4,6),16);return`rgba(${J}, ${z}, ${X}, ${Q})`}function z_(Z){return Z.trim().replace(/\r\n/g,`
|
|
247
247
|
`).split(`
|
|
248
248
|
`).map((Y)=>{let J=Y.trim();return J?J.split(/\s+/).join(" "):""}).join(`
|
|
249
|
-
`)}var
|
|
250
|
-
`).length*
|
|
249
|
+
`)}var X_=/[ -ヿ㐀-䶿一-鿿豈--]/;function W_(Z){let Q="";for(let Y=0;Y<Z.length;Y++){let J=Z[Y];if(J===","||J==="。"){Q+=" ";continue}if(J===","){let z=Y>0?Z[Y-1]:"",X=Y+1<Z.length?Z[Y+1]:"";Q+=/[0-9]/.test(z)&&/[0-9]/.test(X)?J:" ";continue}if(J==="."){let z=Y+1<Z.length?Z[Y+1]:"";Q+=z===""||/\s/.test(z)||X_.test(z)?" ":J;continue}Q+=J}return Q}function NK(Z){return Math.round(Z*aC)}function V_({presetId:Z,colorId:Q,canvas:Y,content:J}){let z=Y_[Z],X=i2(Y)==="landscape"?z.landscape:z.portrait,W=eC[Q],V=X.fontSize/X.playResY*n2,K=(I)=>I*n2/X.playResY,G=z.borderStyle===3,$=G?X.outline*Y.height/X.playResY*(15/V):0,H=G?Z==="boxed"?J_(W,Z_):W:"#000000",N=!G&&X.outline>0,q=z.shadowColor!==null&&X.shadow>0,U=V*(Y.height/n2),F=1.2,M=1.2*U,D=J.split(`
|
|
250
|
+
`).length*M,O=G?$*(V/15):0,C=D/2+O,T=z.glyphScaleY/100,_=Y.height*(X.marginV/X.playResY),P=Y.height-_-C*T-Y.height/2,E=0;return{content:J,fontSize:V,fontFamily:p2,color:z.textColor,textAlign:"center",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",letterSpacing:0,lineHeight:1.2,"background.enabled":G,"background.color":H,"background.cornerRadius":0,"background.paddingX":G?$:30,"background.paddingY":G?$:42,"background.offsetX":0,"background.offsetY":0,"stroke.enabled":N,"stroke.color":N?W:"#000000","stroke.width":N?K(X.outline):0,"shadow.enabled":q,"shadow.color":q?z.shadowColor:"#000000","shadow.offsetX":q?K(X.shadow):0,"shadow.offsetY":q?K(X.shadow):0,"shadow.blur":0,glyphScaleX:z.glyphScaleX,glyphScaleY:z.glyphScaleY,"transform.positionX":0,"transform.positionY":P,"transform.scaleX":1,"transform.scaleY":1,"transform.rotate":0,opacity:1,blendMode:"normal",subtitleCue:!0,subtitlePresetId:Z,subtitleColorId:Q}}function DK({index:Z,text:Q,startSec:Y,durationSec:J,presetId:z,colorId:X,canvas:W,keepPunctuation:V=!1}){let K=z_(V?Q:W_(Q));return{id:FK(),type:"text",name:`Caption ${Z+1}`,startTime:NK(Y),duration:NK(J),trimStart:0,trimEnd:0,params:V_({presetId:z,colorId:X,canvas:W,content:K})}}function BK(Z){let Q=0;for(let Y of Z)Q+=Y.codePointAt(0)>11904?1:0.5;return Q}function K_(Z,Q){let Y=BK(Z.text);if(!Q||Y<=Q)return[Z];let J=Math.max(2,Math.ceil(Y/Q)),z=Y/J,X=[...Z.text],W=[],V=0,K="";for(let U of X)if(K+=U,V+=U.codePointAt(0)>11904?1:0.5,W.length<J-1&&V>=z-0.000000001)W.push(K),K="",V=0;if(K.trim())W.push(K);let G=W.map((U)=>U.trim()).filter(Boolean),$=[],H=Z.startSec,N=G.map((U)=>BK(U)),q=N.reduce((U,F)=>U+F,0)||1;for(let U=0;U<G.length;U++){let F=Z.durationSec*(N[U]/q);$.push({text:G[U],startSec:H,durationSec:F}),H+=F}if($.length){let U=$[$.length-1];U.durationSec=Z.startSec+Z.durationSec-U.startSec}return $}function PK(Z,Q={}){let Y=[],J=0;for(let V of Z){if(V.dropped||V.track_st===null||V.track_ed===null)continue;let K=V.track_ed-V.track_st;if(K<n1){J+=1;continue}Y.push({text:V.text,startSec:V.track_st,durationSec:K})}let z=0,X=[];for(let V of Y){let K=Q.maxUnits?K_(V,Q.maxUnits):[V];if(K.length>1)z+=K.length-1;X.push(...K)}let W=0;if(Q.maxGapSec&&Q.maxGapSec>0)for(let V=0;V+1<X.length;V++){let K=X[V],G=X[V+1],$=G.startSec-(K.startSec+K.durationSec);if($>0&&$<=Q.maxGapSec)K.durationSec=G.startSec-K.startSec,W+=1}return{captions:X,droppedShort:J,splitCount:z,bridgedCount:W}}var jK=1;function d1(Z){return typeof Z==="object"&&Z!==null&&!Array.isArray(Z)}function G_(Z){if(!d1(Z)||Z.type!=="text")return!1;let Q=Z.elements;if(!Array.isArray(Q)||Q.length===0)return!1;return Q.every((Y)=>d1(Y)&&d1(Y.params)&&Y.params.subtitleCue===!0)}function OK(Z,Q){let Y={type:"text",contract:[],elements:Q};if(d1(Z)&&Z.schema===jK&&Array.isArray(Z.lanes)){let J=Z.lanes.filter((z)=>!G_(z));return{mirror:{...Z,lanes:[Y,...J]},replacedLanes:Z.lanes.length-J.length}}return{mirror:{schema:jK,scene_id:FK(),lanes:[Y]},replacedLanes:0}}function H_(Z){if(!Z||Z.length===0)throw Error("缺少子命令——用法:gtrk subtitle lay --project <目录>");if(Z[0]!=="lay"||Z.length>1)throw Error(`未知子命令「${Z.join(" ")}」——当前仅支持:gtrk subtitle lay`);return"lay"}function LK(Z){return Z.find((Q)=>r2(Q))}function q_(Z){let Q=Z.project?o2(Z.project):void 0,Y;if(Z.gtrk)Y=o2(Z.gtrk);else if(Q)Y=LK([d9(Q,"gtrk","project.gtrk"),d9(Q,"project.gtrk")])??d9(Q,"gtrk","project.gtrk");else throw Error("需要 --project <目录> 或显式 --gtrk <path>");if(!r2(Y))throw Error(`找不到工程文件:${Y}`);let J;if(Z.transcript)J=o2(Z.transcript);else if(Q)J=LK([d9(Q,"transcript","transcript.json"),d9(Q,"json","transcript.json"),d9(Q,"transcript.json")]);if(!J||!r2(J))throw Error("工程目录内找不到 transcript.json——字幕以句级时码为源:请用产 transcript 的链路(oralcut / project init)重产,或显式 --transcript 指定");return{gtrkPath:Y,transcriptPath:J}}function U_(Z){let Q;try{Q=JSON.parse($_(Z,"utf8"))}catch(J){throw Error(`transcript.json 不是合法 JSON:${Z}(${J instanceof Error?J.message:String(J)})`)}let Y=Q;if(!Y||!Array.isArray(Y.utterances)||Y.utterances.length===0||typeof Y.material_id!=="string")throw Error(`transcript.json 结构异常(缺 utterances/material_id):${Z}`);if(typeof Y.text_hash!=="string")Y.text_hash="";return Y}function N_(Z){let Q=Z.video_size;if(Array.isArray(Q)&&Q.length===2&&Number.isFinite(Number(Q[0]))&&Number.isFinite(Number(Q[1]))&&Number(Q[0])>0&&Number(Q[1])>0)return{width:Number(Q[0]),height:Number(Q[1])};throw Error(`工程文件缺有效 video_size(读到 ${JSON.stringify(Q)})——字幕几何依赖画布尺寸,无法上轨`)}function B_(Z){if(Z.json)qZ();let Q=MK(Z.style),Y=RK(Z.color),{gtrkPath:J,transcriptPath:z}=q_(Z),{gtrk:X,revision:W}=lZ(J);G8(X);let V=N_(X),K=U_(z);j.step(`▶ 字幕上轨:${K.utterances.length} 句 · 样式 ${Q} · 颜色 ${Y}`);let G=c0(K,X);if(G.utterances.filter((y)=>!y.dropped).length===0){let y=H9(X,K.material_id);throw Error(`投影零命中:transcript 的口播素材(material_id=${K.material_id})在当刻时间线上没有任何存活句。
|
|
251
251
|
${y.text}
|
|
252
|
-
${y.hint}`)}let H=
|
|
253
|
-
`)}function
|
|
254
|
-
`)}var
|
|
255
|
-
`),{ok:!1,submitted:!1,code:"needs_user_confirmation",notice:$,exitCode:1}}if(J(`${
|
|
256
|
-
`),!Q.yes){if(!await(Y.confirm
|
|
257
|
-
`)}else if(J.submitted)j.ok("已记录并反馈给同合云");else if(J.code==="cancelled_by_user")j.info("已取消,未发送");if(J.exitCode!==0)process.exitCode=J.exitCode})}try{process.loadEnvFile?.()}catch{}
|
|
252
|
+
${y.hint}`)}let H=i2(V),N=H==="portrait"?13:20,q=Z.maxUnits!=null?Math.max(0,Number(Z.maxUnits)||0):N,U=Z.maxGap!=null?Math.max(0,Number(Z.maxGap)||0):0.5,{captions:F,droppedShort:M,splitCount:R,bridgedCount:D}=PK(G.utterances,{maxUnits:q,maxGapSec:U});if(M>0)j.warn(`丢弃 ${M} 条短于最小可读时长(${n1}s)的投影实例`);if(R>0)j.info(`超宽句拆窗:+${R} 窗(上限 ${q} 字宽单位/${H==="portrait"?"竖":"横"}屏档)`);if(D>0)j.info(`小 gap 桥接:${D} 处(阈值 ${U}s,消灭字幕闪烁)`);if(F.length===0)throw Error(`存活投影实例全部短于最小可读时长(${n1}s),无字幕可上——请检查剪辑是否把整句都切碎了`);let O=Z.keepPunctuation===!0;if(O)j.info("保留原始标点(--keep-punctuation):跳过逗号句号清洗");let C=F.map((y,h)=>DK({index:h,text:y.text,startSec:y.startSec,durationSec:y.durationSec,presetId:Q,colorId:Y,canvas:V,keepPunctuation:O})),T=X.struct_meta??{},{mirror:_,replacedLanes:P}=OK(T.client_visual_elements,C);if(P>0)j.info(`幂等:已替换 ${P} 条既有字幕 lane(不叠加重复字幕)`);let E={...X,struct_meta:{...T,client_visual_elements:_}};c8(J,E,W),j.ok(`字幕已写入:${C.length} 条 · ${H==="landscape"?"横屏":"竖屏"}档(${V.width}x${V.height})· ${Q}/${Y}`+(P?`(替换旧字幕 lane ${P} 条)`:"")),j.info("客户端打开工程即见字幕(字幕面板可整轨换样式、逐条可编辑)。");let I={ok:!0,mode:"subtitle-lay",gtrkPath:J,laneElements:C.length,replacedLanes:P,droppedShort:M,style:Q,color:Y,canvas:[V.width,V.height],orientation:H,fontFamily:p2,keepPunctuation:O};if(Z.json)console.log(JSON.stringify(I));return I}function CK(Z){Z.command("subtitle [words...]").description("字幕零件:gtrk subtitle lay 把 transcript 逐句投影成客户端契约字幕写进 .gtrk(cve text lane;重跑幂等替换;纯本地零计费)").option("--project <dir>","工程产物目录(自动定位 gtrk/project.gtrk 与 transcript/transcript.json)").option("--gtrk <path>","显式指定 .gtrk 工程文件(非标准布局兜底)").option("--transcript <path>","显式指定 transcript.json(非标准布局兜底)").option("--style <id>","字幕样式(default/outline/cinema_yellow/immersive_box/wide_spacing/deep_shadow/boxed,默认 default)").option("--color <id>","字幕颜色(雅黑/淡绿/森林绿/湖蓝/道奇蓝/钢蓝/浅粉红/深橙/珊瑚橙/橙红/土豪金,默认 雅黑)").option("--keep-punctuation","保留原始标点(默认清洗:中英逗号句号替换为空格,小数/千分位/缩写不误伤)").option("--max-units <n>","单窗最大字宽(CJK=1/ASCII=0.5;缺省按画布档:横屏 20/竖屏 13;0=不拆窗)").option("--max-gap <s>","相邻字幕 gap ≤ 此秒数时桥接前一条(缺省 0.5,消灭闪烁;0=不桥接)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action((Q,Y)=>{H_(Q),B_(Y)})}import{randomUUID as j_}from"node:crypto";import{release as F_}from"node:os";var a2=["complaint","env_unstable","confused","blocked","agent_self_detected","feature_request","other"],M_={complaint:"抱怨吐槽",env_unstable:"环境不稳",confused:"用法困惑",blocked:"使用受阻",agent_self_detected:"助手自查",feature_request:"功能诉求",other:"其他"},R_={win32:"Windows",darwin:"macOS",linux:"Linux"},_K=512,TK=2000,s2={os:{type:"string",pattern:/^(win32|darwin|linux)$/},os_release:{type:"string",pattern:/^[0-9][0-9A-Za-z.\-]{0,31}$/},arch:{type:"string",pattern:/^(x64|arm64|ia32|arm)$/},locale:{type:"string",pattern:/^[a-z]{2}(-[A-Za-z]{2})?$/},command:{type:"string",pattern:/^[a-z][a-z0-9-]{0,31}( [a-z][a-z0-9-]{0,31}){0,2}$/},exit_code:{type:"int",min:-256,max:256},duration_ms:{type:"int",min:0,max:86400000},route:{type:"string",pattern:/^[a-z][a-z0-9/_-]{0,63}$/},webview_version:{type:"string",pattern:/^[0-9][0-9A-Za-z.\-]{0,31}$/},task_type:{type:"string",pattern:/^[a-z][a-z0-9_]{0,63}$/},error_code:{type:"int",min:0,max:65535},project_id:{type:"string",pattern:/^[0-9a-fA-F-]{8,64}$/},column_key:{type:"string",pattern:/^[a-z][a-z0-9_-]{0,63}$/}},AK=["exit_code","duration_ms","task_type","error_code","project_id","column_key"],D_=[{re:/\bbearer\s+\S+/gi,to:"<凭据已隐去>"},{re:/\b(?:api[_-]?key|secret|token|password|passwd|authorization)\b\s*[:=]\s*\S+/gi,to:"<凭据已隐去>"},{re:/\bgc_[A-Za-z0-9_-]{16,}\b/g,to:"<凭据已隐去>"},{re:/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}(?:\.[A-Za-z0-9_-]+)?/g,to:"<凭据已隐去>"},{re:/(?:(?<![A-Za-z])[A-Za-z]:[\\/]|\\\\)[^\s"'<>|]+/g,to:"<路径已隐去>"},{re:/(?:~|\/(?:home|Users|root|mnt|media))\/[^\s"'<>|]*/g,to:"<路径已隐去>"},{re:/(https?:\/\/[^\s"'<>]*?)\?[^\s"'<>]*/g,to:"$1"},{re:/[\p{L}\p{N}_.+-]+@[\p{L}\p{N}_-]+\.[\p{L}\p{N}_.]+/gu,to:"<邮箱已隐去>"},{re:/(?<!\d)1[3-9]\d{9}(?!\d)/g,to:"<手机号已隐去>"},{re:/(?<!\d)\d{17}[\dXx](?!\d)/g,to:"<证件号已隐去>"},{re:/\b[0-9a-fA-F]{32,}\b/g,to:"<凭据已隐去>"},{re:/\b[A-Za-z0-9+/]{40,}={0,2}\b/g,to:"<凭据已隐去>"}];function EK(Z){if(Z==null)return;let Q=String(Z);for(let{re:Y,to:J}of D_)Y.lastIndex=0,Q=Q.replace(Y,J);return Q}function P_(Z){let Q={};for(let Y of Z??[]){let J=Y.indexOf("=");if(J<=0)return{context:Q,error:`--context 需要 k=v 形式,收到「${Y}」`};let z=Y.slice(0,J).trim(),X=Y.slice(J+1).trim(),W=s2[z];if(!W||!AK.includes(z))return{context:Q,error:`--context 不认识「${z}」。可用:${AK.join(" / ")}`};if(W.type==="int"){if(!/^-?\d+$/.test(X))return{context:Q,error:`--context ${z} 需要整数,收到「${X}」`};let V=Number(X);if(W.min!=null&&V<W.min||W.max!=null&&V>W.max)return{context:Q,error:`--context ${z} 超出取值范围(${W.min} ~ ${W.max})`};Q[z]=V;continue}if(W.pattern&&!W.pattern.test(X))return{context:Q,error:`--context ${z} 的写法不符合要求,收到「${X}」`};Q[z]=X}return{context:Q}}function O_(){let Z={},Q=(Y,J)=>{if(s2[Y]?.pattern?.test(J))Z[Y]=J};Q("os",process.platform),Q("arch",process.arch),Q("os_release",F_());try{Q("locale",new Intl.DateTimeFormat().resolvedOptions().locale)}catch{}return Z}function L_(Z,Q,Y={}){let J=(Z??"").trim();if(!J)return{error:"请把要反馈的内容写清楚(第一个参数)"};let z=(Q.command??"").trim();if(!z)return{error:'请用 --command 说明这条反馈发生在哪个命令上,例如 --command "matrix search"'};if(!s2.command.pattern?.test(z))return{error:`--command 只填命令名(可带至多两级子命令),不要带参数。收到「${z}」,`+'应写成 --command "matrix search"'};let X=Q.category??"other";if(!a2.includes(X))return{error:`--category 只能是:${a2.join(" / ")}`};let W=P_(Q.context);if(W.error)return{error:W.error};let V;if(Q.taskId!=null&&String(Q.taskId).trim()!==""){if(!/^\d+$/.test(String(Q.taskId).trim()))return{error:`--task-id 需要纯数字,收到「${Q.taskId}」`};V=Number(String(Q.taskId).trim())}let K=EK(J),G=Q.quote?.trim(),$=G?EK(G):void 0;if([...K].length>_K)return{error:`反馈内容过长(上限 ${_K} 字),请精简后重试`};if($&&[...$].length>TK)return{error:`--quote 过长(上限 ${TK} 字),请精简后重试`};return{payload:{event_id:(Y.randomToken??(()=>j_().replace(/-/g,"")))(),source:Q.disclosed?"agent":"cli",disclosure:Q.disclosed?"agent_disclosed":"user_submitted",category:X,summary:K,...$?{user_quote:$}:{},context:{...O_(),...W.context,command:z},...V!=null?{task_id:V}:{},reporter_version:O0()}}}function IK(Z){let Q=[];if(Z.context.command)Q.push(`命令 ${Z.context.command}`);Q.push(`版本 ${Z.reporter_version}`);let Y=Z.context.os?R_[String(Z.context.os)]:void 0;if(Y)Q.push(`系统 ${Y}${Z.context.arch?` ${Z.context.arch}`:""}`);if(Z.task_id!=null)Q.push(`任务 ${Z.task_id}`);return["────────",...[`类型:${M_[Z.category]}`,`摘要:${Z.summary}`,...Z.user_quote?[`你的原话:${Z.user_quote}`]:[],`随附信息:${Q.join(" | ")}`],"────────"].join(`
|
|
253
|
+
`)}function C_(Z){return["⚠️ 这条反馈还没有经过用户确认,本次未发送。"," 请把下面这段原样念给用户,得到同意后,在原命令上加 --disclosed 重跑:",IK(Z)].join(`
|
|
254
|
+
`)}var __=15000;async function T_(Z,Q,Y=fetch){q8();let J;for(let z=0;z<2;z++)try{let X=await Y(`${Z.base}/feedback/report`,{method:"POST",headers:{Authorization:Z.apiKey,"Content-Type":"application/json"},body:JSON.stringify(Q),signal:AbortSignal.timeout(__)}),W=await tZ(X);if(W.code===200)return{duplicated:(W.data??{}).duplicated===!0,retried:z>0};throw new OZ(W.code,`反馈提交失败 (code=${W.code??"?"}):${W.msg??"未知错误"}`)}catch(X){if(X instanceof OZ)throw X;J=X}throw J instanceof Error?J:Error(String(J))}async function A_(Z,Q,Y={}){if(Q.json)qZ();let J=Y.write??(($)=>void process.stderr.write($)),z=Y.isTty??(()=>process.stdout.isTTY===!0),X=L_(Z,Q,Y);if(X.error||!X.payload)throw Error(X.error??"反馈内容不完整");let W=X.payload;if(!Q.disclosed){if(!z()){let $=C_(W);return J(`${$}
|
|
255
|
+
`),{ok:!1,submitted:!1,code:"needs_user_confirmation",notice:$,exitCode:1}}if(J(`${IK(W)}
|
|
256
|
+
`),!Q.yes){if(!await(Y.confirm??$9)("确认发送?"))return{ok:!0,submitted:!1,code:"cancelled_by_user",exitCode:0}}}let V=Y.cfg??jZ(),{duplicated:K,retried:G}=await T_(V,W,Y.fetchFn);if(K&&!G)j.warn("这条内容刚刚已经报过了,本次未重复记录");return{ok:!0,submitted:!0,duplicated:K,category:W.category,exitCode:0}}function SK(Z){Z.command("feedback <message>").description("把使用中的不顺手反馈给同合云(告知式提交:助手代提时必须先把内容念给你听、得到同意)").option("--command <name>",'这条反馈发生在哪个命令上,如 "matrix search"(必填,不要带参数)').option("--category <c>",`类别:${a2.join(" / ")}(默认 other)`).option("--quote <text>","你的原话(可选)").option("--task-id <id>","关联的任务 ID(可选)").option("--context <k=v>","附加信息,可重复",(Q,Y)=>[...Y,Q],[]).option("--disclosed","声明「已把完整内容念给用户并获得同意」——助手代提时必须带").option("-y, --yes","跳过终端里的确认等待(注意:它不能替代上面那条声明)").option("--json","机读模式:人读日志转 stderr,stdout 只输出结果 JSON").action(async(Q,Y)=>{let J=await A_(Q,Y);if(Y.json){let{exitCode:z,...X}=J;process.stdout.write(`${JSON.stringify(X)}
|
|
257
|
+
`)}else if(J.submitted)j.ok("已记录并反馈给同合云");else if(J.code==="cancelled_by_user")j.info("已取消,未发送");if(J.exitCode!==0)process.exitCode=J.exitCode})}try{process.loadEnvFile?.()}catch{}kY();var{version:S_}=JSON.parse(E_(I_(o8(),"package.json"),"utf8")),DZ=new SY;DZ.name("gtrk").description("同合云成片流水线 CLI —— agent 驱动云端任务、产物拉回本地、三方工程文件(客户端/剪映/PR)互通").version(S_);DZ.hook("preAction",()=>{iY()});CJ(DZ);LJ(DZ);gz(DZ);VX(DZ);KX(DZ);MJ(DZ);cY(DZ);HX(DZ);q3(DZ);G3(DZ);D3(DZ);n3(DZ);w4(DZ);s4(DZ);SV(DZ);gV(DZ);nV(DZ);pV(DZ);rV(DZ);$K(DZ);CK(DZ);SK(DZ);DZ.parseAsync(process.argv).catch((Z)=>{console.error(`
|
|
258
258
|
❌ ${Z instanceof Error?Z.message:String(Z)}`),process.exit(1)});
|