@zleap-ai/sag-cli 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +115 -26
- package/dist/cli.js.map +1 -1
- package/dist/sag-knowledge.zip +0 -0
- package/dist/skill-cli.cjs +3 -3
- package/package.json +1 -1
- package/skill/SKILL.md +32 -15
- package/skill/manifest.json +2 -2
- package/skill/references/cli-reference.md +17 -13
- package/skill/scripts/sag-knowledge.cjs +3 -3
|
@@ -46,7 +46,7 @@ Expecting one of '${allowedValues.join("', '")}'`)}if(this._lifeCycleHooks[event
|
|
|
46
46
|
`);this._exit(0,"commander.version",str)});return this}description(str,argsDescription){if(str===void 0&&argsDescription===void 0)return this._description;this._description=str;if(argsDescription){this._argsDescription=argsDescription}return this}summary(str){if(str===void 0)return this._summary;this._summary=str;return this}alias(alias){if(alias===void 0)return this._aliases[0];let command=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler){command=this.commands[this.commands.length-1]}if(alias===command._name)throw new Error("Command alias can't be the same as its name");const matchingCommand=this.parent?._findCommand(alias);if(matchingCommand){const existingCmd=[matchingCommand.name()].concat(matchingCommand.aliases()).join("|");throw new Error(`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`)}command._aliases.push(alias);return this}aliases(aliases){if(aliases===void 0)return this._aliases;aliases.forEach(alias=>this.alias(alias));return this}usage(str){if(str===void 0){if(this._usage)return this._usage;const args=this.registeredArguments.map(arg=>{return humanReadableArgName(arg)});return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?args:[]).join(" ")}this._usage=str;return this}name(str){if(str===void 0)return this._name;this._name=str;return this}helpGroup(heading){if(heading===void 0)return this._helpGroupHeading??"";this._helpGroupHeading=heading;return this}commandsGroup(heading){if(heading===void 0)return this._defaultCommandGroup??"";this._defaultCommandGroup=heading;return this}optionsGroup(heading){if(heading===void 0)return this._defaultOptionGroup??"";this._defaultOptionGroup=heading;return this}_initOptionGroup(option){if(this._defaultOptionGroup&&!option.helpGroupHeading)option.helpGroup(this._defaultOptionGroup)}_initCommandGroup(cmd){if(this._defaultCommandGroup&&!cmd.helpGroup())cmd.helpGroup(this._defaultCommandGroup)}nameFromFilename(filename){this._name=path16.basename(filename,path16.extname(filename));return this}executableDir(path17){if(path17===void 0)return this._executableDir;this._executableDir=path17;return this}helpInformation(contextOptions){const helper=this.createHelp();const context=this._getOutputContext(contextOptions);helper.prepareContext({error:context.error,helpWidth:context.helpWidth,outputHasColors:context.hasColors});const text=helper.formatHelp(this,helper);if(context.hasColors)return text;return this._outputConfiguration.stripColor(text)}_getOutputContext(contextOptions){contextOptions=contextOptions||{};const error51=!!contextOptions.error;let baseWrite;let hasColors;let helpWidth;if(error51){baseWrite=str=>this._outputConfiguration.writeErr(str);hasColors=this._outputConfiguration.getErrHasColors();helpWidth=this._outputConfiguration.getErrHelpWidth()}else{baseWrite=str=>this._outputConfiguration.writeOut(str);hasColors=this._outputConfiguration.getOutHasColors();helpWidth=this._outputConfiguration.getOutHelpWidth()}const write=str=>{if(!hasColors)str=this._outputConfiguration.stripColor(str);return baseWrite(str)};return{error:error51,write,hasColors,helpWidth}}outputHelp(contextOptions){let deprecatedCallback;if(typeof contextOptions==="function"){deprecatedCallback=contextOptions;contextOptions=void 0}const outputContext=this._getOutputContext(contextOptions);const eventContext={error:outputContext.error,write:outputContext.write,command:this};this._getCommandAndAncestors().reverse().forEach(command=>command.emit("beforeAllHelp",eventContext));this.emit("beforeHelp",eventContext);let helpInformation=this.helpInformation({error:outputContext.error});if(deprecatedCallback){helpInformation=deprecatedCallback(helpInformation);if(typeof helpInformation!=="string"&&!Buffer.isBuffer(helpInformation)){throw new Error("outputHelp callback must return a string or a Buffer")}}outputContext.write(helpInformation);if(this._getHelpOption()?.long){this.emit(this._getHelpOption().long)}this.emit("afterHelp",eventContext);this._getCommandAndAncestors().forEach(command=>command.emit("afterAllHelp",eventContext))}helpOption(flags,description){if(typeof flags==="boolean"){if(flags){if(this._helpOption===null)this._helpOption=void 0;if(this._defaultOptionGroup){this._initOptionGroup(this._getHelpOption())}}else{this._helpOption=null}return this}this._helpOption=this.createOption(flags??"-h, --help",description??"display help for command");if(flags||description)this._initOptionGroup(this._helpOption);return this}_getHelpOption(){if(this._helpOption===void 0){this.helpOption(void 0,void 0)}return this._helpOption}addHelpOption(option){this._helpOption=option;this._initOptionGroup(option);return this}help(contextOptions){this.outputHelp(contextOptions);let exitCode=Number(process6.exitCode??0);if(exitCode===0&&contextOptions&&typeof contextOptions!=="function"&&contextOptions.error){exitCode=1}this._exit(exitCode,"commander.help","(outputHelp)")}addHelpText(position,text){const allowedValues=["beforeAll","before","after","afterAll"];if(!allowedValues.includes(position)){throw new Error(`Unexpected value for position to addHelpText.
|
|
47
47
|
Expecting one of '${allowedValues.join("', '")}'`)}const helpEvent=`${position}Help`;this.on(helpEvent,context=>{let helpStr;if(typeof text==="function"){helpStr=text({error:context.error,command:context.command})}else{helpStr=text}if(helpStr){context.write(`${helpStr}
|
|
48
48
|
`)}});return this}_outputHelpIfRequested(args){const helpOption=this._getHelpOption();const helpRequested=helpOption&&args.find(arg=>helpOption.is(arg));if(helpRequested){this.outputHelp();this._exit(0,"commander.helpDisplayed","(outputHelp)")}}};function incrementNodeInspectorPort(args){return args.map(arg=>{if(!arg.startsWith("--inspect")){return arg}let debugOption;let debugHost="127.0.0.1";let debugPort="9229";let match;if((match=arg.match(/^(--inspect(-brk)?)$/))!==null){debugOption=match[1]}else if((match=arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null){debugOption=match[1];if(/^\d+$/.test(match[3])){debugPort=match[3]}else{debugHost=match[3]}}else if((match=arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null){debugOption=match[1];debugHost=match[3];debugPort=match[4]}if(debugOption&&debugPort!=="0"){return`${debugOption}=${debugHost}:${parseInt(debugPort)+1}`}return arg})}function useColor(){if(process6.env.NO_COLOR||process6.env.FORCE_COLOR==="0"||process6.env.FORCE_COLOR==="false")return false;if(process6.env.FORCE_COLOR||process6.env.CLICOLOR_FORCE!==void 0)return true;return void 0}exports2.Command=Command2;exports2.useColor=useColor}});var require_commander=__commonJS({"node_modules/commander/index.js"(exports2){"use strict";var{Argument:Argument2}=require_argument();var{Command:Command2}=require_command();var{CommanderError:CommanderError2,InvalidArgumentError:InvalidArgumentError2}=require_error();var{Help:Help2}=require_help();var{Option:Option2}=require_option();exports2.program=new Command2;exports2.createCommand=name=>new Command2(name);exports2.createOption=(flags,description)=>new Option2(flags,description);exports2.createArgument=(name,description)=>new Argument2(name,description);exports2.Command=Command2;exports2.Option=Option2;exports2.Argument=Argument2;exports2.Help=Help2;exports2.CommanderError=CommanderError2;exports2.InvalidArgumentError=InvalidArgumentError2;exports2.InvalidOptionArgumentError=InvalidArgumentError2}});var import_node_os5=__toESM(require("os"),1);var keybindings=["emacs","vim"];var keybindingLookup=new Set(keybindings);function isKeybinding(value){return keybindingLookup.has(value)}function getDefaultKeybindings(){const env=process.env["INQUIRER_KEYBINDINGS"];if(!env)return[];return Array.from(new Set(env.toLowerCase().split(/[\s,]+/).filter(isKeybinding)))}var isUpKey=(key,keybindings2=[])=>key.name==="up"||keybindings2.includes("vim")&&key.name==="k"||keybindings2.includes("emacs")&&key.ctrl&&key.name==="p";var isDownKey=(key,keybindings2=[])=>key.name==="down"||keybindings2.includes("vim")&&key.name==="j"||keybindings2.includes("emacs")&&key.ctrl&&key.name==="n";var isSpaceKey=key=>key.name==="space";var isBackspaceKey=key=>key.name==="backspace";var isTabKey=key=>key.name==="tab";var isNumberKey=key=>"1234567890".includes(key.name);var isEnterKey=key=>key.name==="enter"||key.name==="return";var AbortPromptError=class extends Error{name="AbortPromptError";message="Prompt was aborted";constructor(options){super();this.cause=options?.cause}};var CancelPromptError=class extends Error{name="CancelPromptError";message="Prompt was canceled"};var ExitPromptError=class extends Error{name="ExitPromptError"};var HookError=class extends Error{name="HookError"};var ValidationError=class extends Error{name="ValidationError"};var import_node_async_hooks2=require("async_hooks");var import_node_async_hooks=require("async_hooks");var hookStorage=new import_node_async_hooks.AsyncLocalStorage;function createStore(rl){const store={rl,hooks:[],hooksCleanup:[],hooksEffect:[],index:0,handleChange(){}};return store}function withHooks(rl,cb){const store=createStore(rl);return hookStorage.run(store,()=>{function cycle(render){store.handleChange=()=>{store.index=0;render()};store.handleChange()}return cb(cycle)})}function getStore(){const store=hookStorage.getStore();if(!store){throw new HookError("[Inquirer] Hook functions can only be called from within a prompt")}return store}function readline(){return getStore().rl}function withUpdates(fn){const wrapped=(...args)=>{const store=getStore();let shouldUpdate=false;const oldHandleChange=store.handleChange;store.handleChange=()=>{shouldUpdate=true};const returnValue=fn(...args);if(shouldUpdate){oldHandleChange()}store.handleChange=oldHandleChange;return returnValue};return import_node_async_hooks.AsyncResource.bind(wrapped)}function withPointer(cb){const store=getStore();const{index}=store;const pointer={get(){return store.hooks[index]},set(value){store.hooks[index]=value},initialized:index in store.hooks};const returnValue=cb(pointer);store.index++;return returnValue}function handleChange(){getStore().handleChange()}var effectScheduler={queue(cb){const store=getStore();const{index}=store;store.hooksEffect.push(()=>{store.hooksCleanup[index]?.();const cleanFn=cb(readline());if(cleanFn!=null&&typeof cleanFn!=="function"){throw new ValidationError("useEffect return value must be a cleanup function or nothing.")}store.hooksCleanup[index]=cleanFn})},run(){const store=getStore();withUpdates(()=>{store.hooksEffect.forEach(effect=>{effect()});store.hooksEffect.length=0})()},clearAll(){const store=getStore();store.hooksCleanup.forEach(cleanFn=>{cleanFn?.()});store.hooksEffect.length=0;store.hooksCleanup.length=0}};function isFactory(value){return typeof value==="function"}function useState(defaultValue){return withPointer(pointer=>{const setState=import_node_async_hooks2.AsyncResource.bind(function setState2(newValue){if(pointer.get()!==newValue){pointer.set(newValue);handleChange()}});if(pointer.initialized){return[pointer.get(),setState]}const value=isFactory(defaultValue)?defaultValue():defaultValue;pointer.set(value);return[value,setState]})}function useEffect(cb,depArray){withPointer(pointer=>{const oldDeps=pointer.get();const hasChanged=!Array.isArray(oldDeps)||depArray.some((dep,i)=>!Object.is(dep,oldDeps[i]));if(hasChanged){effectScheduler.queue(cb)}pointer.set(depArray)})}var import_node_util=require("util");var import_node_process=__toESM(require("process"),1);function isUnicodeSupported(){if(!import_node_process.default.platform.startsWith("win")){return import_node_process.default.env["TERM"]!=="linux"}return Boolean(import_node_process.default.env["CI"])||Boolean(import_node_process.default.env["WT_SESSION"])||Boolean(import_node_process.default.env["TERMINUS_SUBLIME"])||import_node_process.default.env["ConEmuTask"]==="{cmd::Cmder}"||import_node_process.default.env["TERM_PROGRAM"]==="Terminus-Sublime"||import_node_process.default.env["TERM_PROGRAM"]==="vscode"||import_node_process.default.env["TERM"]==="xterm-256color"||import_node_process.default.env["TERM"]==="alacritty"||import_node_process.default.env["TERMINAL_EMULATOR"]==="JetBrains-JediTerm"}var common={circleQuestionMark:"(?)",questionMarkPrefix:"(?)",square:"\u2588",squareDarkShade:"\u2593",squareMediumShade:"\u2592",squareLightShade:"\u2591",squareTop:"\u2580",squareBottom:"\u2584",squareLeft:"\u258C",squareRight:"\u2590",squareCenter:"\u25A0",bullet:"\u25CF",dot:"\u2024",ellipsis:"\u2026",pointerSmall:"\u203A",triangleUp:"\u25B2",triangleUpSmall:"\u25B4",triangleDown:"\u25BC",triangleDownSmall:"\u25BE",triangleLeftSmall:"\u25C2",triangleRightSmall:"\u25B8",home:"\u2302",heart:"\u2665",musicNote:"\u266A",musicNoteBeamed:"\u266B",arrowUp:"\u2191",arrowDown:"\u2193",arrowLeft:"\u2190",arrowRight:"\u2192",arrowLeftRight:"\u2194",arrowUpDown:"\u2195",almostEqual:"\u2248",notEqual:"\u2260",lessOrEqual:"\u2264",greaterOrEqual:"\u2265",identical:"\u2261",infinity:"\u221E",subscriptZero:"\u2080",subscriptOne:"\u2081",subscriptTwo:"\u2082",subscriptThree:"\u2083",subscriptFour:"\u2084",subscriptFive:"\u2085",subscriptSix:"\u2086",subscriptSeven:"\u2087",subscriptEight:"\u2088",subscriptNine:"\u2089",oneHalf:"\xBD",oneThird:"\u2153",oneQuarter:"\xBC",oneFifth:"\u2155",oneSixth:"\u2159",oneEighth:"\u215B",twoThirds:"\u2154",twoFifths:"\u2156",threeQuarters:"\xBE",threeFifths:"\u2157",threeEighths:"\u215C",fourFifths:"\u2158",fiveSixths:"\u215A",fiveEighths:"\u215D",sevenEighths:"\u215E",line:"\u2500",lineBold:"\u2501",lineDouble:"\u2550",lineDashed0:"\u2504",lineDashed1:"\u2505",lineDashed2:"\u2508",lineDashed3:"\u2509",lineDashed4:"\u254C",lineDashed5:"\u254D",lineDashed6:"\u2574",lineDashed7:"\u2576",lineDashed8:"\u2578",lineDashed9:"\u257A",lineDashed10:"\u257C",lineDashed11:"\u257E",lineDashed12:"\u2212",lineDashed13:"\u2013",lineDashed14:"\u2010",lineDashed15:"\u2043",lineVertical:"\u2502",lineVerticalBold:"\u2503",lineVerticalDouble:"\u2551",lineVerticalDashed0:"\u2506",lineVerticalDashed1:"\u2507",lineVerticalDashed2:"\u250A",lineVerticalDashed3:"\u250B",lineVerticalDashed4:"\u254E",lineVerticalDashed5:"\u254F",lineVerticalDashed6:"\u2575",lineVerticalDashed7:"\u2577",lineVerticalDashed8:"\u2579",lineVerticalDashed9:"\u257B",lineVerticalDashed10:"\u257D",lineVerticalDashed11:"\u257F",lineDownLeft:"\u2510",lineDownLeftArc:"\u256E",lineDownBoldLeftBold:"\u2513",lineDownBoldLeft:"\u2512",lineDownLeftBold:"\u2511",lineDownDoubleLeftDouble:"\u2557",lineDownDoubleLeft:"\u2556",lineDownLeftDouble:"\u2555",lineDownRight:"\u250C",lineDownRightArc:"\u256D",lineDownBoldRightBold:"\u250F",lineDownBoldRight:"\u250E",lineDownRightBold:"\u250D",lineDownDoubleRightDouble:"\u2554",lineDownDoubleRight:"\u2553",lineDownRightDouble:"\u2552",lineUpLeft:"\u2518",lineUpLeftArc:"\u256F",lineUpBoldLeftBold:"\u251B",lineUpBoldLeft:"\u251A",lineUpLeftBold:"\u2519",lineUpDoubleLeftDouble:"\u255D",lineUpDoubleLeft:"\u255C",lineUpLeftDouble:"\u255B",lineUpRight:"\u2514",lineUpRightArc:"\u2570",lineUpBoldRightBold:"\u2517",lineUpBoldRight:"\u2516",lineUpRightBold:"\u2515",lineUpDoubleRightDouble:"\u255A",lineUpDoubleRight:"\u2559",lineUpRightDouble:"\u2558",lineUpDownLeft:"\u2524",lineUpBoldDownBoldLeftBold:"\u252B",lineUpBoldDownBoldLeft:"\u2528",lineUpDownLeftBold:"\u2525",lineUpBoldDownLeftBold:"\u2529",lineUpDownBoldLeftBold:"\u252A",lineUpDownBoldLeft:"\u2527",lineUpBoldDownLeft:"\u2526",lineUpDoubleDownDoubleLeftDouble:"\u2563",lineUpDoubleDownDoubleLeft:"\u2562",lineUpDownLeftDouble:"\u2561",lineUpDownRight:"\u251C",lineUpBoldDownBoldRightBold:"\u2523",lineUpBoldDownBoldRight:"\u2520",lineUpDownRightBold:"\u251D",lineUpBoldDownRightBold:"\u2521",lineUpDownBoldRightBold:"\u2522",lineUpDownBoldRight:"\u251F",lineUpBoldDownRight:"\u251E",lineUpDoubleDownDoubleRightDouble:"\u2560",lineUpDoubleDownDoubleRight:"\u255F",lineUpDownRightDouble:"\u255E",lineDownLeftRight:"\u252C",lineDownBoldLeftBoldRightBold:"\u2533",lineDownLeftBoldRightBold:"\u252F",lineDownBoldLeftRight:"\u2530",lineDownBoldLeftBoldRight:"\u2531",lineDownBoldLeftRightBold:"\u2532",lineDownLeftRightBold:"\u252E",lineDownLeftBoldRight:"\u252D",lineDownDoubleLeftDoubleRightDouble:"\u2566",lineDownDoubleLeftRight:"\u2565",lineDownLeftDoubleRightDouble:"\u2564",lineUpLeftRight:"\u2534",lineUpBoldLeftBoldRightBold:"\u253B",lineUpLeftBoldRightBold:"\u2537",lineUpBoldLeftRight:"\u2538",lineUpBoldLeftBoldRight:"\u2539",lineUpBoldLeftRightBold:"\u253A",lineUpLeftRightBold:"\u2536",lineUpLeftBoldRight:"\u2535",lineUpDoubleLeftDoubleRightDouble:"\u2569",lineUpDoubleLeftRight:"\u2568",lineUpLeftDoubleRightDouble:"\u2567",lineUpDownLeftRight:"\u253C",lineUpBoldDownBoldLeftBoldRightBold:"\u254B",lineUpDownBoldLeftBoldRightBold:"\u2548",lineUpBoldDownLeftBoldRightBold:"\u2547",lineUpBoldDownBoldLeftRightBold:"\u254A",lineUpBoldDownBoldLeftBoldRight:"\u2549",lineUpBoldDownLeftRight:"\u2540",lineUpDownBoldLeftRight:"\u2541",lineUpDownLeftBoldRight:"\u253D",lineUpDownLeftRightBold:"\u253E",lineUpBoldDownBoldLeftRight:"\u2542",lineUpDownLeftBoldRightBold:"\u253F",lineUpBoldDownLeftBoldRight:"\u2543",lineUpBoldDownLeftRightBold:"\u2544",lineUpDownBoldLeftBoldRight:"\u2545",lineUpDownBoldLeftRightBold:"\u2546",lineUpDoubleDownDoubleLeftDoubleRightDouble:"\u256C",lineUpDoubleDownDoubleLeftRight:"\u256B",lineUpDownLeftDoubleRightDouble:"\u256A",lineCross:"\u2573",lineBackslash:"\u2572",lineSlash:"\u2571"};var specialMainSymbols={tick:"\u2714",info:"\u2139",warning:"\u26A0",cross:"\u2718",squareSmall:"\u25FB",squareSmallFilled:"\u25FC",circle:"\u25EF",circleFilled:"\u25C9",circleDotted:"\u25CC",circleDouble:"\u25CE",circleCircle:"\u24DE",circleCross:"\u24E7",circlePipe:"\u24BE",radioOn:"\u25C9",radioOff:"\u25EF",checkboxOn:"\u2612",checkboxOff:"\u2610",checkboxCircleOn:"\u24E7",checkboxCircleOff:"\u24BE",pointer:"\u276F",triangleUpOutline:"\u25B3",triangleLeft:"\u25C0",triangleRight:"\u25B6",lozenge:"\u25C6",lozengeOutline:"\u25C7",hamburger:"\u2630",smiley:"\u32E1",mustache:"\u0DF4",star:"\u2605",play:"\u25B6",nodejs:"\u2B22",oneSeventh:"\u2150",oneNinth:"\u2151",oneTenth:"\u2152"};var specialFallbackSymbols={tick:"\u221A",info:"i",warning:"\u203C",cross:"\xD7",squareSmall:"\u25A1",squareSmallFilled:"\u25A0",circle:"( )",circleFilled:"(*)",circleDotted:"( )",circleDouble:"( )",circleCircle:"(\u25CB)",circleCross:"(\xD7)",circlePipe:"(\u2502)",radioOn:"(*)",radioOff:"( )",checkboxOn:"[\xD7]",checkboxOff:"[ ]",checkboxCircleOn:"(\xD7)",checkboxCircleOff:"( )",pointer:">",triangleUpOutline:"\u2206",triangleLeft:"\u25C4",triangleRight:"\u25BA",lozenge:"\u2666",lozengeOutline:"\u25CA",hamburger:"\u2261",smiley:"\u263A",mustache:"\u250C\u2500\u2510",star:"\u2736",play:"\u25BA",nodejs:"\u2666",oneSeventh:"1/7",oneNinth:"1/9",oneTenth:"1/10"};var mainSymbols={...common,...specialMainSymbols};var fallbackSymbols={...common,...specialFallbackSymbols};var shouldUseMain=isUnicodeSupported();var figures=shouldUseMain?mainSymbols:fallbackSymbols;var dist_default=figures;var replacements=Object.entries(specialMainSymbols);var defaultTheme={prefix:{idle:(0,import_node_util.styleText)("blue","?"),done:(0,import_node_util.styleText)("green",dist_default.tick)},spinner:{interval:80,frames:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"].map(frame=>(0,import_node_util.styleText)("yellow",frame))},keybindings:[],style:{answer:text=>(0,import_node_util.styleText)("cyan",text),message:text=>(0,import_node_util.styleText)("bold",text),error:text=>(0,import_node_util.styleText)("red",`> ${text}`),defaultAnswer:text=>(0,import_node_util.styleText)("dim",`(${text})`),help:text=>(0,import_node_util.styleText)("dim",text),highlight:text=>(0,import_node_util.styleText)("cyan",text),key:text=>(0,import_node_util.styleText)("cyan",(0,import_node_util.styleText)("bold",`<${text}>`))}};function getDefaultTheme(){return{...defaultTheme,keybindings:getDefaultKeybindings()}}function isPlainObject(value){if(typeof value!=="object"||value===null)return false;let proto=value;while(Object.getPrototypeOf(proto)!==null){proto=Object.getPrototypeOf(proto)}return Object.getPrototypeOf(value)===proto}function deepMerge(...objects){const output={};for(const obj of objects){for(const[key,value]of Object.entries(obj)){const prevValue=output[key];output[key]=isPlainObject(prevValue)&&isPlainObject(value)?deepMerge(prevValue,value):value}}return output}function makeTheme(...themes){const themesToMerge=[getDefaultTheme(),...themes.filter(theme=>theme!=null)];return deepMerge(...themesToMerge)}function usePrefix({status:status2="idle",theme}){const[showLoader,setShowLoader]=useState(false);const[tick,setTick]=useState(0);const{prefix,spinner}=makeTheme(theme);useEffect(()=>{if(status2==="loading"){let tickInterval;let inc=-1;const delayTimeout=setTimeout(()=>{setShowLoader(true);tickInterval=setInterval(()=>{inc=inc+1;setTick(inc%spinner.frames.length)},spinner.interval)},300);return()=>{clearTimeout(delayTimeout);clearInterval(tickInterval)}}else{setShowLoader(false)}},[status2]);if(showLoader){return spinner.frames[tick]}const iconName=status2==="loading"?"idle":status2;return typeof prefix==="string"?prefix:prefix[iconName]??prefix["idle"]}function useMemo(fn,dependencies){return withPointer(pointer=>{const prev=pointer.get();if(!prev||prev.dependencies.length!==dependencies.length||prev.dependencies.some((dep,i)=>dep!==dependencies[i])){const value=fn();pointer.set({value,dependencies});return value}return prev.value})}function useRef(val){return useState({current:val})[0]}function useKeypress(userHandler){const signal=useRef(userHandler);signal.current=userHandler;useEffect(rl=>{let ignore=false;const handler=withUpdates((_input,event)=>{if(ignore)return;void signal.current(event,rl)});rl.input.on("keypress",handler);return()=>{ignore=true;rl.input.removeListener("keypress",handler)}},[])}var import_cli_width=__toESM(require_cli_width(),1);var getCodePointsLength=(()=>{const SURROGATE_PAIR_RE=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return input=>{let surrogatePairsNr=0;SURROGATE_PAIR_RE.lastIndex=0;while(SURROGATE_PAIR_RE.test(input)){surrogatePairsNr+=1}return input.length-surrogatePairsNr}})();var isFullWidth=x=>{return x===12288||x>=65281&&x<=65376||x>=65504&&x<=65510};var isWideNotCJKTNotEmoji=x=>{return x===8987||x===9001||x>=12272&&x<=12287||x>=12289&&x<=12350||x>=12441&&x<=12543||x>=12549&&x<=12591||x>=12593&&x<=12686||x>=12688&&x<=12771||x>=12783&&x<=12830||x>=12832&&x<=12871||x>=12880&&x<=19903||x>=65040&&x<=65049||x>=65072&&x<=65106||x>=65108&&x<=65126||x>=65128&&x<=65131||x>=127488&&x<=127490||x>=127504&&x<=127547||x>=127552&&x<=127560||x>=131072&&x<=196605||x>=196608&&x<=262141};var ANSI_RE=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y;var CONTROL_RE=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y;var CJKT_WIDE_RE=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/yu;var TAB_RE=/\t{1,1000}/y;var EMOJI_RE=new RegExp("[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*","yu");var LATIN_RE=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y;var MODIFIER_RE=new RegExp("\\p{M}+","gu");var NO_TRUNCATION={limit:Infinity,ellipsis:""};var getStringTruncatedWidth=(input,truncationOptions={},widthOptions={})=>{const LIMIT=truncationOptions.limit??Infinity;const ELLIPSIS=truncationOptions.ellipsis??"";const ELLIPSIS_WIDTH=truncationOptions?.ellipsisWidth??(ELLIPSIS?getStringTruncatedWidth(ELLIPSIS,NO_TRUNCATION,widthOptions).width:0);const ANSI_WIDTH=0;const CONTROL_WIDTH=widthOptions.controlWidth??0;const TAB_WIDTH=widthOptions.tabWidth??8;const EMOJI_WIDTH=widthOptions.emojiWidth??2;const FULL_WIDTH_WIDTH=2;const REGULAR_WIDTH=widthOptions.regularWidth??1;const WIDE_WIDTH=widthOptions.wideWidth??FULL_WIDTH_WIDTH;const PARSE_BLOCKS=[[LATIN_RE,REGULAR_WIDTH],[ANSI_RE,ANSI_WIDTH],[CONTROL_RE,CONTROL_WIDTH],[TAB_RE,TAB_WIDTH],[EMOJI_RE,EMOJI_WIDTH],[CJKT_WIDE_RE,WIDE_WIDTH]];let indexPrev=0;let index=0;let length=input.length;let lengthExtra=0;let truncationEnabled=false;let truncationIndex=length;let truncationLimit=Math.max(0,LIMIT-ELLIPSIS_WIDTH);let unmatchedStart=0;let unmatchedEnd=0;let width=0;let widthExtra=0;outer:while(true){if(unmatchedEnd>unmatchedStart||index>=length&&index>indexPrev){const unmatched=input.slice(unmatchedStart,unmatchedEnd)||input.slice(indexPrev,index);lengthExtra=0;for(const char of unmatched.replaceAll(MODIFIER_RE,"")){const codePoint=char.codePointAt(0)||0;if(isFullWidth(codePoint)){widthExtra=FULL_WIDTH_WIDTH}else if(isWideNotCJKTNotEmoji(codePoint)){widthExtra=WIDE_WIDTH}else{widthExtra=REGULAR_WIDTH}if(width+widthExtra>truncationLimit){truncationIndex=Math.min(truncationIndex,Math.max(unmatchedStart,indexPrev)+lengthExtra)}if(width+widthExtra>LIMIT){truncationEnabled=true;break outer}lengthExtra+=char.length;width+=widthExtra}unmatchedStart=unmatchedEnd=0}if(index>=length){break outer}for(let i=0,l=PARSE_BLOCKS.length;i<l;i++){const[BLOCK_RE,BLOCK_WIDTH]=PARSE_BLOCKS[i];BLOCK_RE.lastIndex=index;if(BLOCK_RE.test(input)){lengthExtra=BLOCK_RE===CJKT_WIDE_RE?getCodePointsLength(input.slice(index,BLOCK_RE.lastIndex)):BLOCK_RE===EMOJI_RE?1:BLOCK_RE.lastIndex-index;widthExtra=lengthExtra*BLOCK_WIDTH;if(width+widthExtra>truncationLimit){truncationIndex=Math.min(truncationIndex,index+Math.floor((truncationLimit-width)/BLOCK_WIDTH))}if(width+widthExtra>LIMIT){truncationEnabled=true;break outer}width+=widthExtra;unmatchedStart=indexPrev;unmatchedEnd=index;index=indexPrev=BLOCK_RE.lastIndex;continue outer}}index+=1}return{width:truncationEnabled?truncationLimit:width,index:truncationEnabled?truncationIndex:length,truncated:truncationEnabled,ellipsed:truncationEnabled&&LIMIT>=ELLIPSIS_WIDTH}};var dist_default2=getStringTruncatedWidth;var NO_TRUNCATION2={limit:Infinity,ellipsis:"",ellipsisWidth:0};var fastStringWidth=(input,options={})=>{return dist_default2(input,NO_TRUNCATION2,options).width};var dist_default3=fastStringWidth;var ESC="\x1B";var CSI="\x9B";var END_CODE=39;var ANSI_ESCAPE_BELL="\x07";var ANSI_CSI="[";var ANSI_OSC="]";var ANSI_SGR_TERMINATOR="m";var ANSI_ESCAPE_LINK=`${ANSI_OSC}8;;`;var GROUP_REGEX=new RegExp(`(?:\\${ANSI_CSI}(?<code>\\d+)m|\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`,"y");var getClosingCode=openingCode=>{if(openingCode>=30&&openingCode<=37)return 39;if(openingCode>=90&&openingCode<=97)return 39;if(openingCode>=40&&openingCode<=47)return 49;if(openingCode>=100&&openingCode<=107)return 49;if(openingCode===1||openingCode===2)return 22;if(openingCode===3)return 23;if(openingCode===4)return 24;if(openingCode===7)return 27;if(openingCode===8)return 28;if(openingCode===9)return 29;if(openingCode===0)return 0;return void 0};var wrapAnsiCode=code=>`${ESC}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;var wrapAnsiHyperlink=url2=>`${ESC}${ANSI_ESCAPE_LINK}${url2}${ANSI_ESCAPE_BELL}`;var wrapWord=(rows,word,columns)=>{const characters=word[Symbol.iterator]();let isInsideEscape=false;let isInsideLinkEscape=false;let lastRow=rows.at(-1);let visible=lastRow===void 0?0:dist_default3(lastRow);let currentCharacter=characters.next();let nextCharacter=characters.next();let rawCharacterIndex=0;while(!currentCharacter.done){const character=currentCharacter.value;const characterLength=dist_default3(character);if(visible+characterLength<=columns){rows[rows.length-1]+=character}else{rows.push(character);visible=0}if(character===ESC||character===CSI){isInsideEscape=true;isInsideLinkEscape=word.startsWith(ANSI_ESCAPE_LINK,rawCharacterIndex+1)}if(isInsideEscape){if(isInsideLinkEscape){if(character===ANSI_ESCAPE_BELL){isInsideEscape=false;isInsideLinkEscape=false}}else if(character===ANSI_SGR_TERMINATOR){isInsideEscape=false}}else{visible+=characterLength;if(visible===columns&&!nextCharacter.done){rows.push("");visible=0}}currentCharacter=nextCharacter;nextCharacter=characters.next();rawCharacterIndex+=character.length}lastRow=rows.at(-1);if(!visible&&lastRow!==void 0&&lastRow.length&&rows.length>1){rows[rows.length-2]+=rows.pop()}};var stringVisibleTrimSpacesRight=string4=>{const words=string4.split(" ");let last=words.length;while(last){if(dist_default3(words[last-1])){break}last--}if(last===words.length){return string4}return words.slice(0,last).join(" ")+words.slice(last).join("")};var exec=(string4,columns,options={})=>{if(options.trim!==false&&string4.trim()===""){return""}let returnValue="";let escapeCode;let escapeUrl;const words=string4.split(" ");let rows=[""];let rowLength=0;for(let index=0;index<words.length;index++){const word=words[index];if(options.trim!==false){const row=rows.at(-1)??"";const trimmed=row.trimStart();if(row.length!==trimmed.length){rows[rows.length-1]=trimmed;rowLength=dist_default3(trimmed)}}if(index!==0){if(rowLength>=columns&&(options.wordWrap===false||options.trim===false)){rows.push("");rowLength=0}if(rowLength||options.trim===false){rows[rows.length-1]+=" ";rowLength++}}const wordLength=dist_default3(word);if(options.hard&&wordLength>columns){const remainingColumns=columns-rowLength;const breaksStartingThisLine=1+Math.floor((wordLength-remainingColumns-1)/columns);const breaksStartingNextLine=Math.floor((wordLength-1)/columns);if(breaksStartingNextLine<breaksStartingThisLine){rows.push("")}wrapWord(rows,word,columns);rowLength=dist_default3(rows.at(-1)??"");continue}if(rowLength+wordLength>columns&&rowLength&&wordLength){if(options.wordWrap===false&&rowLength<columns){wrapWord(rows,word,columns);rowLength=dist_default3(rows.at(-1)??"");continue}rows.push("");rowLength=0}if(rowLength+wordLength>columns&&options.wordWrap===false){wrapWord(rows,word,columns);rowLength=dist_default3(rows.at(-1)??"");continue}rows[rows.length-1]+=word;rowLength+=wordLength}if(options.trim!==false){rows=rows.map(row=>stringVisibleTrimSpacesRight(row))}const preString=rows.join("\n");let inSurrogate=false;for(let i=0;i<preString.length;i++){const character=preString[i];returnValue+=character;if(!inSurrogate){inSurrogate=character>="\uD800"&&character<="\uDBFF";if(inSurrogate){continue}}else{inSurrogate=false}if(character===ESC||character===CSI){GROUP_REGEX.lastIndex=i+1;const groupsResult=GROUP_REGEX.exec(preString);const groups=groupsResult?.groups;if(groups?.code!==void 0){const code=Number.parseFloat(groups.code);escapeCode=code===END_CODE?void 0:code}else if(groups?.uri!==void 0){escapeUrl=groups.uri.length===0?void 0:groups.uri}}if(preString[i+1]==="\n"){if(escapeUrl){returnValue+=wrapAnsiHyperlink("")}const closingCode=escapeCode?getClosingCode(escapeCode):void 0;if(escapeCode&&closingCode){returnValue+=wrapAnsiCode(closingCode)}}else if(character==="\n"){if(escapeCode&&getClosingCode(escapeCode)){returnValue+=wrapAnsiCode(escapeCode)}if(escapeUrl){returnValue+=wrapAnsiHyperlink(escapeUrl)}}}return returnValue};var CRLF_OR_LF=/\r?\n/;function wrapAnsi(string4,columns,options){return String(string4).normalize().split(CRLF_OR_LF).map(line=>exec(line,columns,options)).join("\n")}function breakLines(content,width){return content.split("\n").flatMap(line=>wrapAnsi(line,width,{trim:false,wordWrap:false}).split("\n").map(str=>str.trimEnd())).join("\n")}function readlineWidth(){return(0,import_cli_width.default)({defaultWidth:80,output:readline().output})}function usePointerPosition({active,renderedItems,pageSize,loop}){const state=useRef({lastPointer:active,lastActive:void 0});const{lastPointer,lastActive}=state.current;const middle=Math.floor(pageSize/2);const renderedLength=renderedItems.reduce((acc,item)=>acc+item.length,0);const defaultPointerPosition=renderedItems.slice(0,active).reduce((acc,item)=>acc+item.length,0);let pointer=defaultPointerPosition;if(renderedLength>pageSize){if(loop){pointer=lastPointer;if(lastActive!=null&&lastActive<active&&active-lastActive<pageSize){pointer=Math.min(middle,Math.abs(active-lastActive)===1?Math.min(lastPointer+(renderedItems[lastActive]?.length??0),Math.max(defaultPointerPosition,lastPointer)):lastPointer+active-lastActive)}}else{const spaceUnderActive=renderedItems.slice(active).reduce((acc,item)=>acc+item.length,0);pointer=spaceUnderActive<pageSize-middle?pageSize-spaceUnderActive:Math.min(defaultPointerPosition,middle)}}state.current.lastPointer=pointer;state.current.lastActive=active;return pointer}function usePagination({items,active,renderItem,pageSize,loop=true}){const width=readlineWidth();const bound=num=>(num%items.length+items.length)%items.length;const renderedItems=items.map((item,index)=>{if(item==null)return[];return breakLines(renderItem({item,index,isActive:index===active}),width).split("\n")});const renderedLength=renderedItems.reduce((acc,item)=>acc+item.length,0);const renderItemAtIndex=index=>renderedItems[index]??[];const pointer=usePointerPosition({active,renderedItems,pageSize,loop});const activeItem=renderItemAtIndex(active).slice(0,pageSize);const activeItemPosition=pointer+activeItem.length<=pageSize?pointer:pageSize-activeItem.length;const pageBuffer=Array.from({length:pageSize});pageBuffer.splice(activeItemPosition,activeItem.length,...activeItem);const itemVisited=new Set([active]);let bufferPointer=activeItemPosition+activeItem.length;let itemPointer=bound(active+1);while(bufferPointer<pageSize&&!itemVisited.has(itemPointer)&&(loop&&renderedLength>pageSize?itemPointer!==active:itemPointer>active)){const lines=renderItemAtIndex(itemPointer);const linesToAdd=lines.slice(0,pageSize-bufferPointer);pageBuffer.splice(bufferPointer,linesToAdd.length,...linesToAdd);itemVisited.add(itemPointer);bufferPointer+=linesToAdd.length;itemPointer=bound(itemPointer+1)}bufferPointer=activeItemPosition-1;itemPointer=bound(active-1);while(bufferPointer>=0&&!itemVisited.has(itemPointer)&&(loop&&renderedLength>pageSize?itemPointer!==active:itemPointer<active)){const lines=renderItemAtIndex(itemPointer);const linesToAdd=lines.slice(Math.max(0,lines.length-bufferPointer-1));pageBuffer.splice(bufferPointer-linesToAdd.length+1,linesToAdd.length,...linesToAdd);itemVisited.add(itemPointer);bufferPointer-=linesToAdd.length;itemPointer=bound(itemPointer-1)}return pageBuffer.filter(line=>typeof line==="string").join("\n")}var readline2=__toESM(require("readline"),1);var import_node_async_hooks3=require("async_hooks");var import_mute_stream=__toESM(require_lib(),1);var signals=[];signals.push("SIGHUP","SIGINT","SIGTERM");if(process.platform!=="win32"){signals.push("SIGALRM","SIGABRT","SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT")}if(process.platform==="linux"){signals.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT")}var processOk=process6=>!!process6&&typeof process6==="object"&&typeof process6.removeListener==="function"&&typeof process6.emit==="function"&&typeof process6.reallyExit==="function"&&typeof process6.listeners==="function"&&typeof process6.kill==="function"&&typeof process6.pid==="number"&&typeof process6.on==="function";var kExitEmitter=Symbol.for("signal-exit emitter");var global2=globalThis;var ObjectDefineProperty=Object.defineProperty.bind(Object);var Emitter=class{emitted={afterExit:false,exit:false};listeners={afterExit:[],exit:[]};count=0;id=Math.random();constructor(){if(global2[kExitEmitter]){return global2[kExitEmitter]}ObjectDefineProperty(global2,kExitEmitter,{value:this,writable:false,enumerable:false,configurable:false})}on(ev,fn){this.listeners[ev].push(fn)}removeListener(ev,fn){const list=this.listeners[ev];const i=list.indexOf(fn);if(i===-1){return}if(i===0&&list.length===1){list.length=0}else{list.splice(i,1)}}emit(ev,code,signal){if(this.emitted[ev]){return false}this.emitted[ev]=true;let ret=false;for(const fn of this.listeners[ev]){ret=fn(code,signal)===true||ret}if(ev==="exit"){ret=this.emit("afterExit",code,signal)||ret}return ret}};var SignalExitBase=class{};var signalExitWrap=handler=>{return{onExit(cb,opts){return handler.onExit(cb,opts)},load(){return handler.load()},unload(){return handler.unload()}}};var SignalExitFallback=class extends SignalExitBase{onExit(){return()=>{}}load(){}unload(){}};var SignalExit=class extends SignalExitBase{#hupSig=process3.platform==="win32"?"SIGINT":"SIGHUP";#emitter=new Emitter;#process;#originalProcessEmit;#originalProcessReallyExit;#sigListeners={};#loaded=false;constructor(process6){super();this.#process=process6;this.#sigListeners={};for(const sig of signals){this.#sigListeners[sig]=()=>{const listeners=this.#process.listeners(sig);let{count}=this.#emitter;const p=process6;if(typeof p.__signal_exit_emitter__==="object"&&typeof p.__signal_exit_emitter__.count==="number"){count+=p.__signal_exit_emitter__.count}if(listeners.length===count){this.unload();const ret=this.#emitter.emit("exit",null,sig);const s=sig==="SIGHUP"?this.#hupSig:sig;if(!ret)process6.kill(process6.pid,s)}}}this.#originalProcessReallyExit=process6.reallyExit;this.#originalProcessEmit=process6.emit}onExit(cb,opts){if(!processOk(this.#process)){return()=>{}}if(this.#loaded===false){this.load()}const ev=opts?.alwaysLast?"afterExit":"exit";this.#emitter.on(ev,cb);return()=>{this.#emitter.removeListener(ev,cb);if(this.#emitter.listeners["exit"].length===0&&this.#emitter.listeners["afterExit"].length===0){this.unload()}}}load(){if(this.#loaded){return}this.#loaded=true;this.#emitter.count+=1;for(const sig of signals){try{const fn=this.#sigListeners[sig];if(fn)this.#process.on(sig,fn)}catch(_){}}this.#process.emit=(ev,...a)=>{return this.#processEmit(ev,...a)};this.#process.reallyExit=code=>{return this.#processReallyExit(code)}}unload(){if(!this.#loaded){return}this.#loaded=false;signals.forEach(sig=>{const listener=this.#sigListeners[sig];if(!listener){throw new Error("Listener not defined for signal: "+sig)}try{this.#process.removeListener(sig,listener)}catch(_){}});this.#process.emit=this.#originalProcessEmit;this.#process.reallyExit=this.#originalProcessReallyExit;this.#emitter.count-=1}#processReallyExit(code){if(!processOk(this.#process)){return 0}this.#process.exitCode=code||0;this.#emitter.emit("exit",this.#process.exitCode,null);return this.#originalProcessReallyExit.call(this.#process,this.#process.exitCode)}#processEmit(ev,...args){const og=this.#originalProcessEmit;if(ev==="exit"&&processOk(this.#process)){if(typeof args[0]==="number"){this.#process.exitCode=args[0]}const ret=og.call(this.#process,ev,...args);this.#emitter.emit("exit",this.#process.exitCode,null);return ret}else{return og.call(this.#process,ev,...args)}}};var process3=globalThis.process;var{onExit,load,unload}=signalExitWrap(processOk(process3)?new SignalExit(process3):new SignalExitFallback);var import_node_util2=require("util");var ESC2="\x1B[";var cursorLeft=ESC2+"G";var cursorHide=ESC2+"?25l";var cursorShow=ESC2+"?25h";var cursorUp=(rows=1)=>rows>0?`${ESC2}${rows}A`:"";var cursorDown=(rows=1)=>rows>0?`${ESC2}${rows}B`:"";var cursorTo=(x,y)=>{if(typeof y==="number"&&!Number.isNaN(y)){return`${ESC2}${y+1};${x+1}H`}return`${ESC2}${x+1}G`};var eraseLine=ESC2+"2K";var eraseLines=lines=>lines>0?(eraseLine+cursorUp(1)).repeat(lines-1)+eraseLine+cursorLeft:"";var height=content=>content.split("\n").length;var lastLine=content=>content.split("\n").pop()??"";var ScreenManager=class{height=0;extraLinesUnderPrompt=0;cursorPos;rl;constructor(rl){this.rl=rl;this.cursorPos=rl.getCursorPos()}write(content){this.rl.output.unmute();this.rl.output.write(content);this.rl.output.mute()}render(content,bottomContent=""){const promptLine=lastLine(content);const rawPromptLine=(0,import_node_util2.stripVTControlCharacters)(promptLine);let prompt=rawPromptLine;if(this.rl.line.length>0){prompt=prompt.slice(0,-this.rl.line.length)}this.rl.setPrompt(prompt);this.cursorPos=this.rl.getCursorPos();const width=readlineWidth();content=breakLines(content,width);bottomContent=breakLines(bottomContent,width);if(rawPromptLine.length%width===0){content+="\n"}let output=content+(bottomContent?"\n"+bottomContent:"");const promptLineUpDiff=Math.floor(rawPromptLine.length/width)-this.cursorPos.rows;const bottomContentHeight=promptLineUpDiff+(bottomContent?height(bottomContent):0);if(bottomContentHeight>0)output+=cursorUp(bottomContentHeight);output+=cursorTo(this.cursorPos.cols);this.write(cursorDown(this.extraLinesUnderPrompt)+eraseLines(this.height)+output);this.extraLinesUnderPrompt=bottomContentHeight;this.height=height(output)}checkCursorPos(){const cursorPos=this.rl.getCursorPos();if(cursorPos.cols!==this.cursorPos.cols){this.write(cursorTo(cursorPos.cols));this.cursorPos=cursorPos}}done({clearContent}){this.rl.setPrompt("");let output=cursorDown(this.extraLinesUnderPrompt);output+=clearContent?eraseLines(this.height):"\n";output+=cursorLeft;output+=cursorShow;this.write(output);this.rl.close()}};var PromisePolyfill=class extends Promise{static withResolver(){let resolve;let reject;const promise2=new Promise((res,rej)=>{resolve=res;reject=rej});return{promise:promise2,resolve,reject}}};var import_node_path=__toESM(require("path"),1);var nativeSetImmediate=globalThis.setImmediate;function getCallSites(){const savedPrepareStackTrace=Error.prepareStackTrace;let result=[];try{Error.prepareStackTrace=(_,callSites)=>{const callSitesWithoutCurrent=callSites.slice(1);result=callSitesWithoutCurrent;return callSitesWithoutCurrent};new Error().stack}catch{return result}Error.prepareStackTrace=savedPrepareStackTrace;return result}function createPrompt(view){const callSites=getCallSites();const prompt=(config2,context={})=>{const{input=process.stdin,signal}=context;const cleanups=new Set;const output=new import_mute_stream.default;output.pipe(context.output??process.stdout);const rl=readline2.createInterface({terminal:true,input,output});output.mute();const screen=new ScreenManager(rl);const{promise:promise2,resolve,reject}=PromisePolyfill.withResolver();const cancel=()=>reject(new CancelPromptError);if(signal){const abort=()=>reject(new AbortPromptError({cause:signal.reason}));if(signal.aborted){abort();return Object.assign(promise2,{cancel})}signal.addEventListener("abort",abort);cleanups.add(()=>signal.removeEventListener("abort",abort))}cleanups.add(onExit((code,signal2)=>{reject(new ExitPromptError(`User force closed the prompt with ${code} ${signal2}`))}));const sigint=()=>reject(new ExitPromptError(`User force closed the prompt with SIGINT`));rl.on("SIGINT",sigint);cleanups.add(()=>rl.removeListener("SIGINT",sigint));return withHooks(rl,cycle=>{const hooksCleanup=import_node_async_hooks3.AsyncResource.bind(()=>effectScheduler.clearAll());rl.on("close",hooksCleanup);cleanups.add(()=>rl.removeListener("close",hooksCleanup));const startCycle=()=>{const checkCursorPos=()=>screen.checkCursorPos();rl.input.on("keypress",checkCursorPos);cleanups.add(()=>rl.input.removeListener("keypress",checkCursorPos));let pendingDone=null;cycle(()=>{let effectsSettled=false;try{const nextView=view(config2,value=>{if(effectsSettled){resolve(value)}else{pendingDone={value}}});if(nextView===void 0){let callerFilename=callSites[1]?.getFileName();if(callerFilename&&!callerFilename.startsWith("file://")){callerFilename=import_node_path.default.resolve(callerFilename)}throw new Error(`Prompt functions must return a string.
|
|
49
|
-
at ${callerFilename}`)}const[content,bottomContent]=typeof nextView==="string"?[nextView]:nextView;screen.render(content,bottomContent);effectScheduler.run()}catch(error51){reject(error51)}effectsSettled=true;if(pendingDone!==null){const{value}=pendingDone;pendingDone=null;resolve(value)}})};if("readableFlowing"in input){nativeSetImmediate(startCycle)}else{startCycle()}return Object.assign(promise2.then(answer=>{effectScheduler.clearAll();return answer},error51=>{effectScheduler.clearAll();throw error51}).finally(()=>{cleanups.forEach(cleanup=>cleanup());screen.done({clearContent:Boolean(context.clearPromptOnDone)});output.end()}).then(()=>promise2),{cancel})})};return prompt}var import_node_util3=require("util");var Separator=class{separator=(0,import_node_util3.styleText)("dim",Array.from({length:15}).join(dist_default.line));type="separator";constructor(separator){if(separator){this.separator=separator}}static isSeparator(choice){return Boolean(choice&&typeof choice==="object"&&"type"in choice&&choice.type==="separator")}};var import_node_util4=require("util");var checkboxTheme={icon:{checked:(0,import_node_util4.styleText)("green",dist_default.circleFilled),unchecked:dist_default.circle,cursor:dist_default.pointer,disabledChecked:(0,import_node_util4.styleText)("green",dist_default.circleDouble),disabledUnchecked:"-"},style:{disabled:text=>(0,import_node_util4.styleText)("dim",text),renderSelectedChoices:selectedChoices=>selectedChoices.map(choice=>choice.short).join(", "),description:text=>(0,import_node_util4.styleText)("cyan",text),keysHelpTip:keys=>keys.map(([key,action])=>`${(0,import_node_util4.styleText)("bold",key)} ${(0,import_node_util4.styleText)("dim",action)}`).join((0,import_node_util4.styleText)("dim"," \u2022 "))},i18n:{disabledError:"This option is disabled and cannot be toggled."}};function isSelectable(item){return!Separator.isSeparator(item)&&!item.disabled}function isNavigable(item){return!Separator.isSeparator(item)}function isChecked(item){return!Separator.isSeparator(item)&&item.checked}function toggle(item){return isSelectable(item)?{...item,checked:!item.checked}:item}function check(checked){return function(item){return isSelectable(item)?{...item,checked}:item}}function normalizeChoices(choices){return choices.map(choice=>{if(Separator.isSeparator(choice))return choice;if(typeof choice!=="object"||choice===null||!("value"in choice)){const name2=String(choice);return{value:choice,name:name2,short:name2,checkedName:name2,disabled:false,checked:false}}const name=choice.name??String(choice.value);const normalizedChoice={value:choice.value,name,short:choice.short??name,checkedName:choice.checkedName??name,disabled:choice.disabled??false,checked:choice.checked??false};if(choice.description){normalizedChoice.description=choice.description}return normalizedChoice})}var dist_default4=createPrompt((config2,done)=>{const{pageSize=7,loop=true,required:required2,validate=()=>true}=config2;const shortcuts={all:"a",invert:"i",...config2.shortcuts};const theme=makeTheme(checkboxTheme,config2.theme);const{keybindings:keybindings2}=theme;const[status2,setStatus]=useState("idle");const prefix=usePrefix({status:status2,theme});const[items,setItems]=useState(normalizeChoices(config2.choices));const bounds=useMemo(()=>{const first=items.findIndex(isNavigable);const last=items.findLastIndex(isNavigable);if(first===-1){throw new ValidationError("[checkbox prompt] No selectable choices. All choices are disabled.")}return{first,last}},[items]);const[active,setActive]=useState(bounds.first);const[errorMsg,setError]=useState();useKeypress(async key=>{if(isEnterKey(key)){const selection=items.filter(isChecked);const isValid=await validate([...selection]);if(required2&&!selection.length){setError("At least one choice must be selected")}else if(isValid===true){setStatus("done");done(selection.map(choice=>choice.value))}else{setError(isValid||"You must select a valid value")}}else if(isUpKey(key,keybindings2)||isDownKey(key,keybindings2)){if(errorMsg){setError(void 0)}if(loop||isUpKey(key,keybindings2)&&active!==bounds.first||isDownKey(key,keybindings2)&&active!==bounds.last){const offset=isUpKey(key,keybindings2)?-1:1;let next=active;do{next=(next+offset+items.length)%items.length}while(!isNavigable(items[next]));setActive(next)}}else if(isSpaceKey(key)){const activeItem=items[active];if(activeItem&&!Separator.isSeparator(activeItem)){if(activeItem.disabled){setError(theme.i18n.disabledError)}else{setError(void 0);setItems(items.map((choice,i)=>i===active?toggle(choice):choice))}}}else if(key.name===shortcuts.all){const selectAll=items.some(choice=>isSelectable(choice)&&!choice.checked);setItems(items.map(check(selectAll)))}else if(key.name===shortcuts.invert){setItems(items.map(toggle))}else if(isNumberKey(key)){const selectedIndex=Number(key.name)-1;let selectableIndex=-1;const position=items.findIndex(item=>{if(Separator.isSeparator(item))return false;selectableIndex++;return selectableIndex===selectedIndex});const selectedItem=items[position];if(selectedItem&&isSelectable(selectedItem)){setActive(position);setItems(items.map((choice,i)=>i===position?toggle(choice):choice))}}});const message=theme.style.message(config2.message,status2);let description;const page=usePagination({items,active,renderItem({item,isActive}){if(Separator.isSeparator(item)){return` ${item.separator}`}const cursor=isActive?theme.icon.cursor:" ";if(item.disabled){const disabledLabel=typeof item.disabled==="string"?item.disabled:"(disabled)";const checkbox2=item.checked?theme.icon.disabledChecked:theme.icon.disabledUnchecked;return theme.style.disabled(`${cursor}${checkbox2} ${item.name} ${disabledLabel}`)}if(isActive){description=item.description}const checkbox=item.checked?theme.icon.checked:theme.icon.unchecked;const name=item.checked?item.checkedName:item.name;const color=isActive?theme.style.highlight:x=>x;return color(`${cursor}${checkbox} ${name}`)},pageSize,loop});if(status2==="done"){const selection=items.filter(isChecked);const answer=theme.style.answer(theme.style.renderSelectedChoices(selection,items));return[prefix,message,answer].filter(Boolean).join(" ")}const keys=[["\u2191\u2193","navigate"],["space","select"]];if(shortcuts.all)keys.push([shortcuts.all,"all"]);if(shortcuts.invert)keys.push([shortcuts.invert,"invert"]);keys.push(["\u23CE","submit"]);const helpLine=theme.style.keysHelpTip(keys);const lines=[[prefix,message].filter(Boolean).join(" "),page," ",description?theme.style.description(description):"",errorMsg?theme.style.error(errorMsg):"",helpLine].filter(Boolean).join("\n").trimEnd();return`${lines}${cursorHide}`});function getBooleanValue(value,defaultValue){let answer=defaultValue!==false;if(/^(y|yes)/i.test(value))answer=true;else if(/^(n|no)/i.test(value))answer=false;return answer}function boolToString(value){return value?"Yes":"No"}var dist_default5=createPrompt((config2,done)=>{const{transformer=boolToString}=config2;const[status2,setStatus]=useState("idle");const[value,setValue]=useState("");const theme=makeTheme(config2.theme);const prefix=usePrefix({status:status2,theme});useKeypress((key,rl)=>{if(status2!=="idle")return;if(isEnterKey(key)){const answer=getBooleanValue(value,config2.default);setValue(transformer(answer));setStatus("done");done(answer)}else if(isTabKey(key)){const answer=boolToString(!getBooleanValue(value,config2.default));rl.clearLine(0);rl.write(answer);setValue(answer)}else{setValue(rl.line)}});let formattedValue=value;let defaultValue="";if(status2==="done"){formattedValue=theme.style.answer(value)}else{defaultValue=` ${theme.style.defaultAnswer(config2.default===false?"y/N":"Y/n")}`}const message=theme.style.message(config2.message,status2);return`${prefix} ${message}${defaultValue} ${formattedValue}`});var inputTheme={validationFailureMode:"keep"};var dist_default6=createPrompt((config2,done)=>{const{prefill="tab"}=config2;const theme=makeTheme(inputTheme,config2.theme);const[status2,setStatus]=useState("idle");const[defaultValue,setDefaultValue]=useState(String(config2.default??""));const[errorMsg,setError]=useState();const[value,setValue]=useState("");const prefix=usePrefix({status:status2,theme});async function validate(value2){const{required:required2,pattern,patternError="Invalid input"}=config2;if(required2&&!value2){return"You must provide a value"}if(pattern&&!pattern.test(value2)){return patternError}if(typeof config2.validate==="function"){return await config2.validate(value2)||"You must provide a valid value"}return true}useKeypress(async(key,rl)=>{if(status2!=="idle"){return}if(isEnterKey(key)){const answer=value||defaultValue;setStatus("loading");const isValid=await validate(answer);if(isValid===true){setValue(answer);setStatus("done");done(answer)}else{if(theme.validationFailureMode==="clear"){setValue("")}else{rl.write(value)}setError(isValid);setStatus("idle")}}else if(isBackspaceKey(key)&&!value){setDefaultValue("")}else if(isTabKey(key)&&!value){setDefaultValue("");rl.clearLine(0);rl.write(defaultValue);setValue(defaultValue)}else{setValue(rl.line);setError(void 0)}});useEffect(rl=>{if(prefill==="editable"&&defaultValue){rl.write(defaultValue);setValue(defaultValue)}},[]);const message=theme.style.message(config2.message,status2);let formattedValue=value;if(typeof config2.transformer==="function"){formattedValue=config2.transformer(value,{isFinal:status2==="done"})}else if(status2==="done"){formattedValue=theme.style.answer(value)}let defaultStr;if(defaultValue&&status2!=="done"&&!value){defaultStr=theme.style.defaultAnswer(defaultValue)}let error51="";if(errorMsg){error51=theme.style.error(errorMsg)}return[[prefix,message,defaultStr,formattedValue].filter(v=>v!==void 0).join(" "),error51]});var import_node_util5=require("util");var selectTheme={icon:{cursor:dist_default.pointer},style:{disabled:text=>(0,import_node_util5.styleText)("dim",text),description:text=>(0,import_node_util5.styleText)("cyan",text),keysHelpTip:keys=>keys.map(([key,action])=>`${(0,import_node_util5.styleText)("bold",key)} ${(0,import_node_util5.styleText)("dim",action)}`).join((0,import_node_util5.styleText)("dim"," \u2022 "))},i18n:{disabledError:"This option is disabled and cannot be selected."},indexMode:"hidden"};function isSelectable2(item){return!Separator.isSeparator(item)&&!item.disabled}function isNavigable2(item){return!Separator.isSeparator(item)}function normalizeChoices2(choices){return choices.map(choice=>{if(Separator.isSeparator(choice))return choice;if(typeof choice!=="object"||choice===null||!("value"in choice)){const name2=String(choice);return{value:choice,name:name2,short:name2,disabled:false}}const name=choice.name??String(choice.value);const normalizedChoice={value:choice.value,name,short:choice.short??name,disabled:choice.disabled??false};if(choice.description){normalizedChoice.description=choice.description}return normalizedChoice})}var dist_default7=createPrompt((config2,done)=>{const{loop=true,pageSize=7}=config2;const theme=makeTheme(selectTheme,config2.theme);const{keybindings:keybindings2}=theme;const[status2,setStatus]=useState("idle");const prefix=usePrefix({status:status2,theme});const searchTimeoutRef=useRef();const searchEnabled=!keybindings2.includes("vim");const items=useMemo(()=>normalizeChoices2(config2.choices),[config2.choices]);const bounds=useMemo(()=>{const first=items.findIndex(isNavigable2);const last=items.findLastIndex(isNavigable2);if(first===-1){throw new ValidationError("[select prompt] No selectable choices. All choices are disabled.")}return{first,last}},[items]);const defaultItemIndex=useMemo(()=>{if(!("default"in config2))return-1;return items.findIndex(item=>isSelectable2(item)&&item.value===config2.default)},[config2.default,items]);const[active,setActive]=useState(defaultItemIndex===-1?bounds.first:defaultItemIndex);const selectedChoice=items[active];if(selectedChoice==null||Separator.isSeparator(selectedChoice)){throw new Error("Active index does not point to a choice")}const[errorMsg,setError]=useState();useKeypress((key,rl)=>{clearTimeout(searchTimeoutRef.current);if(errorMsg){setError(void 0)}if(isEnterKey(key)){if(selectedChoice.disabled){setError(theme.i18n.disabledError)}else{setStatus("done");done(selectedChoice.value)}}else if(isUpKey(key,keybindings2)||isDownKey(key,keybindings2)){rl.clearLine(0);if(loop||isUpKey(key,keybindings2)&&active!==bounds.first||isDownKey(key,keybindings2)&&active!==bounds.last){const offset=isUpKey(key,keybindings2)?-1:1;let next=active;do{next=(next+offset+items.length)%items.length}while(!isNavigable2(items[next]));setActive(next)}}else if(isNumberKey(key)&&!Number.isNaN(Number(rl.line))){const selectedIndex=Number(rl.line)-1;let selectableIndex=-1;const position=items.findIndex(item2=>{if(Separator.isSeparator(item2))return false;selectableIndex++;return selectableIndex===selectedIndex});const item=items[position];if(item!=null&&isSelectable2(item)){setActive(position)}searchTimeoutRef.current=setTimeout(()=>{rl.clearLine(0)},700)}else if(isBackspaceKey(key)){rl.clearLine(0)}else if(searchEnabled){const searchTerm=rl.line.toLowerCase();const matchIndex=items.findIndex(item=>{if(Separator.isSeparator(item)||!isSelectable2(item))return false;return item.name.toLowerCase().startsWith(searchTerm)});if(matchIndex!==-1){setActive(matchIndex)}searchTimeoutRef.current=setTimeout(()=>{rl.clearLine(0)},700)}});useEffect(()=>()=>{clearTimeout(searchTimeoutRef.current)},[]);const message=theme.style.message(config2.message,status2);const helpLine=theme.style.keysHelpTip([["\u2191\u2193","navigate"],["\u23CE","select"]]);let separatorCount=0;const page=usePagination({items,active,renderItem({item,isActive,index}){if(Separator.isSeparator(item)){separatorCount++;return` ${item.separator}`}const cursor=isActive?theme.icon.cursor:" ";const indexLabel=theme.indexMode==="number"?`${index+1-separatorCount}. `:"";if(item.disabled){const disabledLabel=typeof item.disabled==="string"?item.disabled:"(disabled)";const disabledCursor=isActive?theme.icon.cursor:"-";return theme.style.disabled(`${disabledCursor} ${indexLabel}${item.name} ${disabledLabel}`)}const color=isActive?theme.style.highlight:x=>x;return color(`${cursor} ${indexLabel}${item.name}`)},pageSize,loop});if(status2==="done"){return[prefix,message,theme.style.answer(selectedChoice.short)].filter(Boolean).join(" ")}const{description}=selectedChoice;const lines=[[prefix,message].filter(Boolean).join(" "),page," ",description?theme.style.description(description):"",errorMsg?theme.style.error(errorMsg):"",helpLine].filter(Boolean).join("\n").trimEnd();return`${lines}${cursorHide}`});var package_default={name:"@zleap-ai/sag-cli",version:"0.6.0",description:"Command-line client and diagnostics for SAG knowledge bases",type:"module",bin:{sag:"dist/cli.js"},files:["dist","README.md","README.en.md","LICENSE","skill","skills/sag-mcp"],scripts:{build:"tsup && node scripts/sync-skill-runtime.mjs",dev:"tsx src/cli.ts",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",typecheck:"tsc --noEmit",lint:"eslint .",format:"prettier --write .","format:check":"prettier --check .",check:"npm run format:check && npm run lint && npm run typecheck && npm test && npm run build",prepare:"husky",commitlint:"commitlint",changeset:"changeset","version-packages":"changeset version","release:check":"bash scripts/release.sh",release:"bash scripts/release.sh --publish"},engines:{node:">=20.19.0"},publishConfig:{access:"public"},license:"MIT",dependencies:{"@inquirer/prompts":"^8.5.2","@modelcontextprotocol/client":"^2.0.0",commander:"^14.0.3","proper-lockfile":"^4.1.2",yaml:"^2.9.0",zod:"^4.4.3"},optionalDependencies:{"@napi-rs/keyring":"^1.3.0"},devDependencies:{"@changesets/cli":"^2.31.1","@commitlint/cli":"^20.0.0","@commitlint/config-conventional":"^20.0.0","@eslint/js":"^10.0.1","@types/node":"^20.19.43","@types/proper-lockfile":"^4.1.4","@typescript-eslint/eslint-plugin":"^8.65.0","@typescript-eslint/parser":"^8.65.0","@vitest/coverage-v8":"^4.1.10",eslint:"^10.8.0",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.9.6",tsup:"^8.5.1",tsx:"^4.23.1",typescript:"^6.0.3",vitest:"^4.1.10"},"lint-staged":{"*.{ts,js,mjs,cjs}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}};var import_promises=require("fs/promises");var import_node_os=__toESM(require("os"),1);var import_node_path2=__toESM(require("path"),1);var external_exports={};__export(external_exports,{$brand:()=>$brand,$input:()=>$input,$output:()=>$output,NEVER:()=>NEVER,TimePrecision:()=>TimePrecision,ZodAny:()=>ZodAny,ZodArray:()=>ZodArray,ZodBase64:()=>ZodBase64,ZodBase64URL:()=>ZodBase64URL,ZodBigInt:()=>ZodBigInt,ZodBigIntFormat:()=>ZodBigIntFormat,ZodBoolean:()=>ZodBoolean,ZodCIDRv4:()=>ZodCIDRv4,ZodCIDRv6:()=>ZodCIDRv6,ZodCUID:()=>ZodCUID,ZodCUID2:()=>ZodCUID2,ZodCatch:()=>ZodCatch,ZodCodec:()=>ZodCodec,ZodCustom:()=>ZodCustom,ZodCustomStringFormat:()=>ZodCustomStringFormat,ZodDate:()=>ZodDate,ZodDefault:()=>ZodDefault,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodE164:()=>ZodE164,ZodEmail:()=>ZodEmail,ZodEmoji:()=>ZodEmoji,ZodEnum:()=>ZodEnum,ZodError:()=>ZodError,ZodExactOptional:()=>ZodExactOptional,ZodFile:()=>ZodFile,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodFunction:()=>ZodFunction,ZodGUID:()=>ZodGUID,ZodIPv4:()=>ZodIPv4,ZodIPv6:()=>ZodIPv6,ZodISODate:()=>ZodISODate,ZodISODateTime:()=>ZodISODateTime,ZodISODuration:()=>ZodISODuration,ZodISOTime:()=>ZodISOTime,ZodIntersection:()=>ZodIntersection,ZodIssueCode:()=>ZodIssueCode,ZodJWT:()=>ZodJWT,ZodKSUID:()=>ZodKSUID,ZodLazy:()=>ZodLazy,ZodLiteral:()=>ZodLiteral,ZodMAC:()=>ZodMAC,ZodMap:()=>ZodMap,ZodNaN:()=>ZodNaN,ZodNanoID:()=>ZodNanoID,ZodNever:()=>ZodNever,ZodNonOptional:()=>ZodNonOptional,ZodNull:()=>ZodNull,ZodNullable:()=>ZodNullable,ZodNumber:()=>ZodNumber,ZodNumberFormat:()=>ZodNumberFormat,ZodObject:()=>ZodObject,ZodOptional:()=>ZodOptional,ZodPipe:()=>ZodPipe,ZodPrefault:()=>ZodPrefault,ZodPreprocess:()=>ZodPreprocess,ZodPromise:()=>ZodPromise,ZodReadonly:()=>ZodReadonly,ZodRealError:()=>ZodRealError,ZodRecord:()=>ZodRecord,ZodSet:()=>ZodSet,ZodString:()=>ZodString,ZodStringFormat:()=>ZodStringFormat,ZodSuccess:()=>ZodSuccess,ZodSymbol:()=>ZodSymbol,ZodTemplateLiteral:()=>ZodTemplateLiteral,ZodTransform:()=>ZodTransform,ZodTuple:()=>ZodTuple,ZodType:()=>ZodType,ZodULID:()=>ZodULID,ZodURL:()=>ZodURL,ZodUUID:()=>ZodUUID,ZodUndefined:()=>ZodUndefined,ZodUnion:()=>ZodUnion,ZodUnknown:()=>ZodUnknown,ZodVoid:()=>ZodVoid,ZodXID:()=>ZodXID,ZodXor:()=>ZodXor,_ZodString:()=>_ZodString,_default:()=>_default2,_function:()=>_function,any:()=>any,array:()=>array,base64:()=>base642,base64url:()=>base64url2,bigint:()=>bigint2,boolean:()=>boolean2,catch:()=>_catch2,check:()=>check2,cidrv4:()=>cidrv42,cidrv6:()=>cidrv62,clone:()=>clone,codec:()=>codec,coerce:()=>coerce_exports,config:()=>config,core:()=>core_exports2,cuid:()=>cuid3,cuid2:()=>cuid22,custom:()=>custom,date:()=>date3,decode:()=>decode2,decodeAsync:()=>decodeAsync2,describe:()=>describe2,discriminatedUnion:()=>discriminatedUnion,e164:()=>e1642,email:()=>email2,emoji:()=>emoji2,encode:()=>encode2,encodeAsync:()=>encodeAsync2,endsWith:()=>_endsWith,enum:()=>_enum2,exactOptional:()=>exactOptional,file:()=>file,flattenError:()=>flattenError,float32:()=>float32,float64:()=>float64,formatError:()=>formatError,fromJSONSchema:()=>fromJSONSchema,function:()=>_function,getErrorMap:()=>getErrorMap,globalRegistry:()=>globalRegistry,gt:()=>_gt,gte:()=>_gte,guid:()=>guid2,hash:()=>hash,hex:()=>hex2,hostname:()=>hostname2,httpUrl:()=>httpUrl,includes:()=>_includes,instanceof:()=>_instanceof,int:()=>int,int32:()=>int32,int64:()=>int64,intersection:()=>intersection,invertCodec:()=>invertCodec,ipv4:()=>ipv42,ipv6:()=>ipv62,iso:()=>iso_exports,json:()=>json,jwt:()=>jwt,keyof:()=>keyof,ksuid:()=>ksuid2,lazy:()=>lazy,length:()=>_length,literal:()=>literal,locales:()=>locales_exports,looseObject:()=>looseObject,looseRecord:()=>looseRecord,lowercase:()=>_lowercase,lt:()=>_lt,lte:()=>_lte,mac:()=>mac2,map:()=>map,maxLength:()=>_maxLength,maxSize:()=>_maxSize,meta:()=>meta2,mime:()=>_mime,minLength:()=>_minLength,minSize:()=>_minSize,multipleOf:()=>_multipleOf,nan:()=>nan,nanoid:()=>nanoid2,nativeEnum:()=>nativeEnum,negative:()=>_negative,never:()=>never,nonnegative:()=>_nonnegative,nonoptional:()=>nonoptional,nonpositive:()=>_nonpositive,normalize:()=>_normalize,null:()=>_null3,nullable:()=>nullable,nullish:()=>nullish2,number:()=>number2,object:()=>object,optional:()=>optional,overwrite:()=>_overwrite,parse:()=>parse2,parseAsync:()=>parseAsync2,partialRecord:()=>partialRecord,pipe:()=>pipe,positive:()=>_positive,prefault:()=>prefault,preprocess:()=>preprocess,prettifyError:()=>prettifyError,promise:()=>promise,property:()=>_property,readonly:()=>readonly,record:()=>record,refine:()=>refine,regex:()=>_regex,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode2,safeDecodeAsync:()=>safeDecodeAsync2,safeEncode:()=>safeEncode2,safeEncodeAsync:()=>safeEncodeAsync2,safeParse:()=>safeParse2,safeParseAsync:()=>safeParseAsync2,set:()=>set,setErrorMap:()=>setErrorMap,size:()=>_size,slugify:()=>_slugify,startsWith:()=>_startsWith,strictObject:()=>strictObject,string:()=>string2,stringFormat:()=>stringFormat,stringbool:()=>stringbool,success:()=>success,superRefine:()=>superRefine,symbol:()=>symbol,templateLiteral:()=>templateLiteral,toJSONSchema:()=>toJSONSchema,toLowerCase:()=>_toLowerCase,toUpperCase:()=>_toUpperCase,transform:()=>transform,treeifyError:()=>treeifyError,trim:()=>_trim,tuple:()=>tuple,uint32:()=>uint32,uint64:()=>uint64,ulid:()=>ulid2,undefined:()=>_undefined3,union:()=>union,unknown:()=>unknown,uppercase:()=>_uppercase,url:()=>url,util:()=>util_exports,uuid:()=>uuid2,uuidv4:()=>uuidv4,uuidv6:()=>uuidv6,uuidv7:()=>uuidv7,void:()=>_void2,xid:()=>xid2,xor:()=>xor});var core_exports2={};__export(core_exports2,{$ZodAny:()=>$ZodAny,$ZodArray:()=>$ZodArray,$ZodAsyncError:()=>$ZodAsyncError,$ZodBase64:()=>$ZodBase64,$ZodBase64URL:()=>$ZodBase64URL,$ZodBigInt:()=>$ZodBigInt,$ZodBigIntFormat:()=>$ZodBigIntFormat,$ZodBoolean:()=>$ZodBoolean,$ZodCIDRv4:()=>$ZodCIDRv4,$ZodCIDRv6:()=>$ZodCIDRv6,$ZodCUID:()=>$ZodCUID,$ZodCUID2:()=>$ZodCUID2,$ZodCatch:()=>$ZodCatch,$ZodCheck:()=>$ZodCheck,$ZodCheckBigIntFormat:()=>$ZodCheckBigIntFormat,$ZodCheckEndsWith:()=>$ZodCheckEndsWith,$ZodCheckGreaterThan:()=>$ZodCheckGreaterThan,$ZodCheckIncludes:()=>$ZodCheckIncludes,$ZodCheckLengthEquals:()=>$ZodCheckLengthEquals,$ZodCheckLessThan:()=>$ZodCheckLessThan,$ZodCheckLowerCase:()=>$ZodCheckLowerCase,$ZodCheckMaxLength:()=>$ZodCheckMaxLength,$ZodCheckMaxSize:()=>$ZodCheckMaxSize,$ZodCheckMimeType:()=>$ZodCheckMimeType,$ZodCheckMinLength:()=>$ZodCheckMinLength,$ZodCheckMinSize:()=>$ZodCheckMinSize,$ZodCheckMultipleOf:()=>$ZodCheckMultipleOf,$ZodCheckNumberFormat:()=>$ZodCheckNumberFormat,$ZodCheckOverwrite:()=>$ZodCheckOverwrite,$ZodCheckProperty:()=>$ZodCheckProperty,$ZodCheckRegex:()=>$ZodCheckRegex,$ZodCheckSizeEquals:()=>$ZodCheckSizeEquals,$ZodCheckStartsWith:()=>$ZodCheckStartsWith,$ZodCheckStringFormat:()=>$ZodCheckStringFormat,$ZodCheckUpperCase:()=>$ZodCheckUpperCase,$ZodCodec:()=>$ZodCodec,$ZodCustom:()=>$ZodCustom,$ZodCustomStringFormat:()=>$ZodCustomStringFormat,$ZodDate:()=>$ZodDate,$ZodDefault:()=>$ZodDefault,$ZodDiscriminatedUnion:()=>$ZodDiscriminatedUnion,$ZodE164:()=>$ZodE164,$ZodEmail:()=>$ZodEmail,$ZodEmoji:()=>$ZodEmoji,$ZodEncodeError:()=>$ZodEncodeError,$ZodEnum:()=>$ZodEnum,$ZodError:()=>$ZodError,$ZodExactOptional:()=>$ZodExactOptional,$ZodFile:()=>$ZodFile,$ZodFunction:()=>$ZodFunction,$ZodGUID:()=>$ZodGUID,$ZodIPv4:()=>$ZodIPv4,$ZodIPv6:()=>$ZodIPv6,$ZodISODate:()=>$ZodISODate,$ZodISODateTime:()=>$ZodISODateTime,$ZodISODuration:()=>$ZodISODuration,$ZodISOTime:()=>$ZodISOTime,$ZodIntersection:()=>$ZodIntersection,$ZodJWT:()=>$ZodJWT,$ZodKSUID:()=>$ZodKSUID,$ZodLazy:()=>$ZodLazy,$ZodLiteral:()=>$ZodLiteral,$ZodMAC:()=>$ZodMAC,$ZodMap:()=>$ZodMap,$ZodNaN:()=>$ZodNaN,$ZodNanoID:()=>$ZodNanoID,$ZodNever:()=>$ZodNever,$ZodNonOptional:()=>$ZodNonOptional,$ZodNull:()=>$ZodNull,$ZodNullable:()=>$ZodNullable,$ZodNumber:()=>$ZodNumber,$ZodNumberFormat:()=>$ZodNumberFormat,$ZodObject:()=>$ZodObject,$ZodObjectJIT:()=>$ZodObjectJIT,$ZodOptional:()=>$ZodOptional,$ZodPipe:()=>$ZodPipe,$ZodPrefault:()=>$ZodPrefault,$ZodPreprocess:()=>$ZodPreprocess,$ZodPromise:()=>$ZodPromise,$ZodReadonly:()=>$ZodReadonly,$ZodRealError:()=>$ZodRealError,$ZodRecord:()=>$ZodRecord,$ZodRegistry:()=>$ZodRegistry,$ZodSet:()=>$ZodSet,$ZodString:()=>$ZodString,$ZodStringFormat:()=>$ZodStringFormat,$ZodSuccess:()=>$ZodSuccess,$ZodSymbol:()=>$ZodSymbol,$ZodTemplateLiteral:()=>$ZodTemplateLiteral,$ZodTransform:()=>$ZodTransform,$ZodTuple:()=>$ZodTuple,$ZodType:()=>$ZodType,$ZodULID:()=>$ZodULID,$ZodURL:()=>$ZodURL,$ZodUUID:()=>$ZodUUID,$ZodUndefined:()=>$ZodUndefined,$ZodUnion:()=>$ZodUnion,$ZodUnknown:()=>$ZodUnknown,$ZodVoid:()=>$ZodVoid,$ZodXID:()=>$ZodXID,$ZodXor:()=>$ZodXor,$brand:()=>$brand,$constructor:()=>$constructor,$input:()=>$input,$output:()=>$output,Doc:()=>Doc,JSONSchema:()=>json_schema_exports,JSONSchemaGenerator:()=>JSONSchemaGenerator,NEVER:()=>NEVER,TimePrecision:()=>TimePrecision,_any:()=>_any,_array:()=>_array,_base64:()=>_base64,_base64url:()=>_base64url,_bigint:()=>_bigint,_boolean:()=>_boolean,_catch:()=>_catch,_check:()=>_check,_cidrv4:()=>_cidrv4,_cidrv6:()=>_cidrv6,_coercedBigint:()=>_coercedBigint,_coercedBoolean:()=>_coercedBoolean,_coercedDate:()=>_coercedDate,_coercedNumber:()=>_coercedNumber,_coercedString:()=>_coercedString,_cuid:()=>_cuid,_cuid2:()=>_cuid2,_custom:()=>_custom,_date:()=>_date,_decode:()=>_decode,_decodeAsync:()=>_decodeAsync,_default:()=>_default,_discriminatedUnion:()=>_discriminatedUnion,_e164:()=>_e164,_email:()=>_email,_emoji:()=>_emoji2,_encode:()=>_encode,_encodeAsync:()=>_encodeAsync,_endsWith:()=>_endsWith,_enum:()=>_enum,_file:()=>_file,_float32:()=>_float32,_float64:()=>_float64,_gt:()=>_gt,_gte:()=>_gte,_guid:()=>_guid,_includes:()=>_includes,_int:()=>_int,_int32:()=>_int32,_int64:()=>_int64,_intersection:()=>_intersection,_ipv4:()=>_ipv4,_ipv6:()=>_ipv6,_isoDate:()=>_isoDate,_isoDateTime:()=>_isoDateTime,_isoDuration:()=>_isoDuration,_isoTime:()=>_isoTime,_jwt:()=>_jwt,_ksuid:()=>_ksuid,_lazy:()=>_lazy,_length:()=>_length,_literal:()=>_literal,_lowercase:()=>_lowercase,_lt:()=>_lt,_lte:()=>_lte,_mac:()=>_mac,_map:()=>_map,_max:()=>_lte,_maxLength:()=>_maxLength,_maxSize:()=>_maxSize,_mime:()=>_mime,_min:()=>_gte,_minLength:()=>_minLength,_minSize:()=>_minSize,_multipleOf:()=>_multipleOf,_nan:()=>_nan,_nanoid:()=>_nanoid,_nativeEnum:()=>_nativeEnum,_negative:()=>_negative,_never:()=>_never,_nonnegative:()=>_nonnegative,_nonoptional:()=>_nonoptional,_nonpositive:()=>_nonpositive,_normalize:()=>_normalize,_null:()=>_null2,_nullable:()=>_nullable,_number:()=>_number,_optional:()=>_optional,_overwrite:()=>_overwrite,_parse:()=>_parse,_parseAsync:()=>_parseAsync,_pipe:()=>_pipe,_positive:()=>_positive,_promise:()=>_promise,_property:()=>_property,_readonly:()=>_readonly,_record:()=>_record,_refine:()=>_refine,_regex:()=>_regex,_safeDecode:()=>_safeDecode,_safeDecodeAsync:()=>_safeDecodeAsync,_safeEncode:()=>_safeEncode,_safeEncodeAsync:()=>_safeEncodeAsync,_safeParse:()=>_safeParse,_safeParseAsync:()=>_safeParseAsync,_set:()=>_set,_size:()=>_size,_slugify:()=>_slugify,_startsWith:()=>_startsWith,_string:()=>_string,_stringFormat:()=>_stringFormat,_stringbool:()=>_stringbool,_success:()=>_success,_superRefine:()=>_superRefine,_symbol:()=>_symbol,_templateLiteral:()=>_templateLiteral,_toLowerCase:()=>_toLowerCase,_toUpperCase:()=>_toUpperCase,_transform:()=>_transform,_trim:()=>_trim,_tuple:()=>_tuple,_uint32:()=>_uint32,_uint64:()=>_uint64,_ulid:()=>_ulid,_undefined:()=>_undefined2,_union:()=>_union,_unknown:()=>_unknown,_uppercase:()=>_uppercase,_url:()=>_url,_uuid:()=>_uuid,_uuidv4:()=>_uuidv4,_uuidv6:()=>_uuidv6,_uuidv7:()=>_uuidv7,_void:()=>_void,_xid:()=>_xid,_xor:()=>_xor,clone:()=>clone,config:()=>config,createStandardJSONSchemaMethod:()=>createStandardJSONSchemaMethod,createToJSONSchemaMethod:()=>createToJSONSchemaMethod,decode:()=>decode,decodeAsync:()=>decodeAsync,describe:()=>describe,encode:()=>encode,encodeAsync:()=>encodeAsync,extractDefs:()=>extractDefs,finalize:()=>finalize,flattenError:()=>flattenError,formatError:()=>formatError,globalConfig:()=>globalConfig,globalRegistry:()=>globalRegistry,initializeContext:()=>initializeContext,isValidBase64:()=>isValidBase64,isValidBase64URL:()=>isValidBase64URL,isValidJWT:()=>isValidJWT,locales:()=>locales_exports,meta:()=>meta,parse:()=>parse,parseAsync:()=>parseAsync,prettifyError:()=>prettifyError,process:()=>process4,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode,safeDecodeAsync:()=>safeDecodeAsync,safeEncode:()=>safeEncode,safeEncodeAsync:()=>safeEncodeAsync,safeParse:()=>safeParse,safeParseAsync:()=>safeParseAsync,toDotPath:()=>toDotPath,toJSONSchema:()=>toJSONSchema,treeifyError:()=>treeifyError,util:()=>util_exports,version:()=>version});var _a;var NEVER=Object.freeze({status:"aborted"});function $constructor(name,initializer3,params){function init(inst,def){if(!inst._zod){Object.defineProperty(inst,"_zod",{value:{def,constr:_,traits:new Set},enumerable:false})}if(inst._zod.traits.has(name)){return}inst._zod.traits.add(name);initializer3(inst,def);const proto=_.prototype;const keys=Object.keys(proto);for(let i=0;i<keys.length;i++){const k=keys[i];if(!(k in inst)){inst[k]=proto[k].bind(inst)}}}const Parent=params?.Parent??Object;class Definition extends Parent{}Object.defineProperty(Definition,"name",{value:name});function _(def){var _a3;const inst=params?.Parent?new Definition:this;init(inst,def);(_a3=inst._zod).deferred??(_a3.deferred=[]);for(const fn of inst._zod.deferred){fn()}return inst}Object.defineProperty(_,"init",{value:init});Object.defineProperty(_,Symbol.hasInstance,{value:inst=>{if(params?.Parent&&inst instanceof params.Parent)return true;return inst?._zod?.traits?.has(name)}});Object.defineProperty(_,"name",{value:name});return _}var $brand=Symbol("zod_brand");var $ZodAsyncError=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}};var $ZodEncodeError=class extends Error{constructor(name){super(`Encountered unidirectional transform during encode: ${name}`);this.name="ZodEncodeError"}};(_a=globalThis).__zod_globalConfig??(_a.__zod_globalConfig={});var globalConfig=globalThis.__zod_globalConfig;function config(newConfig){if(newConfig)Object.assign(globalConfig,newConfig);return globalConfig}var util_exports={};__export(util_exports,{BIGINT_FORMAT_RANGES:()=>BIGINT_FORMAT_RANGES,Class:()=>Class,NUMBER_FORMAT_RANGES:()=>NUMBER_FORMAT_RANGES,aborted:()=>aborted,allowsEval:()=>allowsEval,assert:()=>assert,assertEqual:()=>assertEqual,assertIs:()=>assertIs,assertNever:()=>assertNever,assertNotEqual:()=>assertNotEqual,assignProp:()=>assignProp,base64ToUint8Array:()=>base64ToUint8Array,base64urlToUint8Array:()=>base64urlToUint8Array,cached:()=>cached,captureStackTrace:()=>captureStackTrace,cleanEnum:()=>cleanEnum,cleanRegex:()=>cleanRegex,clone:()=>clone,cloneDef:()=>cloneDef,createTransparentProxy:()=>createTransparentProxy,defineLazy:()=>defineLazy,esc:()=>esc,escapeRegex:()=>escapeRegex,explicitlyAborted:()=>explicitlyAborted,extend:()=>extend,finalizeIssue:()=>finalizeIssue,floatSafeRemainder:()=>floatSafeRemainder,getElementAtPath:()=>getElementAtPath,getEnumValues:()=>getEnumValues,getLengthableOrigin:()=>getLengthableOrigin,getParsedType:()=>getParsedType,getSizableOrigin:()=>getSizableOrigin,hexToUint8Array:()=>hexToUint8Array,isObject:()=>isObject,isPlainObject:()=>isPlainObject2,issue:()=>issue,joinValues:()=>joinValues,jsonStringifyReplacer:()=>jsonStringifyReplacer,merge:()=>merge,mergeDefs:()=>mergeDefs,normalizeParams:()=>normalizeParams,nullish:()=>nullish,numKeys:()=>numKeys,objectClone:()=>objectClone,omit:()=>omit,optionalKeys:()=>optionalKeys,parsedType:()=>parsedType,partial:()=>partial,pick:()=>pick,prefixIssues:()=>prefixIssues,primitiveTypes:()=>primitiveTypes,promiseAllObject:()=>promiseAllObject,propertyKeyTypes:()=>propertyKeyTypes,randomString:()=>randomString,required:()=>required,safeExtend:()=>safeExtend,shallowClone:()=>shallowClone,slugify:()=>slugify,stringifyPrimitive:()=>stringifyPrimitive,uint8ArrayToBase64:()=>uint8ArrayToBase64,uint8ArrayToBase64url:()=>uint8ArrayToBase64url,uint8ArrayToHex:()=>uint8ArrayToHex,unwrapMessage:()=>unwrapMessage});function assertEqual(val){return val}function assertNotEqual(val){return val}function assertIs(_arg){}function assertNever(_x){throw new Error("Unexpected value in exhaustive check")}function assert(_){}function getEnumValues(entries){const numericValues=Object.values(entries).filter(v=>typeof v==="number");const values=Object.entries(entries).filter(([k,_])=>numericValues.indexOf(+k)===-1).map(([_,v])=>v);return values}function joinValues(array2,separator="|"){return array2.map(val=>stringifyPrimitive(val)).join(separator)}function jsonStringifyReplacer(_,value){if(typeof value==="bigint")return value.toString();return value}function cached(getter){const set2=false;return{get value(){if(!set2){const value=getter();Object.defineProperty(this,"value",{value});return value}throw new Error("cached value already set")}}}function nullish(input){return input===null||input===void 0}function cleanRegex(source){const start=source.startsWith("^")?1:0;const end=source.endsWith("$")?source.length-1:source.length;return source.slice(start,end)}function floatSafeRemainder(val,step){const ratio=val/step;const roundedRatio=Math.round(ratio);const tolerance=Number.EPSILON*Math.max(Math.abs(ratio),1);if(Math.abs(ratio-roundedRatio)<tolerance)return 0;return ratio-roundedRatio}var EVALUATING=Symbol("evaluating");function defineLazy(object2,key,getter){let value=void 0;Object.defineProperty(object2,key,{get(){if(value===EVALUATING){return void 0}if(value===void 0){value=EVALUATING;value=getter()}return value},set(v){Object.defineProperty(object2,key,{value:v})},configurable:true})}function objectClone(obj){return Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj))}function assignProp(target,prop,value){Object.defineProperty(target,prop,{value,writable:true,enumerable:true,configurable:true})}function mergeDefs(...defs){const mergedDescriptors={};for(const def of defs){const descriptors=Object.getOwnPropertyDescriptors(def);Object.assign(mergedDescriptors,descriptors)}return Object.defineProperties({},mergedDescriptors)}function cloneDef(schema){return mergeDefs(schema._zod.def)}function getElementAtPath(obj,path16){if(!path16)return obj;return path16.reduce((acc,key)=>acc?.[key],obj)}function promiseAllObject(promisesObj){const keys=Object.keys(promisesObj);const promises=keys.map(key=>promisesObj[key]);return Promise.all(promises).then(results=>{const resolvedObj={};for(let i=0;i<keys.length;i++){resolvedObj[keys[i]]=results[i]}return resolvedObj})}function randomString(length=10){const chars="abcdefghijklmnopqrstuvwxyz";let str="";for(let i=0;i<length;i++){str+=chars[Math.floor(Math.random()*chars.length)]}return str}function esc(str){return JSON.stringify(str)}function slugify(input){return input.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}var captureStackTrace="captureStackTrace"in Error?Error.captureStackTrace:(..._args)=>{};function isObject(data){return typeof data==="object"&&data!==null&&!Array.isArray(data)}var allowsEval=cached(()=>{if(globalConfig.jitless){return false}if(typeof navigator!=="undefined"&&navigator?.userAgent?.includes("Cloudflare")){return false}try{const F=Function;new F("");return true}catch(_){return false}});function isPlainObject2(o){if(isObject(o)===false)return false;const ctor=o.constructor;if(ctor===void 0)return true;if(typeof ctor!=="function")return true;const prot=ctor.prototype;if(isObject(prot)===false)return false;if(Object.prototype.hasOwnProperty.call(prot,"isPrototypeOf")===false){return false}return true}function shallowClone(o){if(isPlainObject2(o))return{...o};if(Array.isArray(o))return[...o];if(o instanceof Map)return new Map(o);if(o instanceof Set)return new Set(o);return o}function numKeys(data){let keyCount=0;for(const key in data){if(Object.prototype.hasOwnProperty.call(data,key)){keyCount++}}return keyCount}var getParsedType=data=>{const t=typeof data;switch(t){case"undefined":return"undefined";case"string":return"string";case"number":return Number.isNaN(data)?"nan":"number";case"boolean":return"boolean";case"function":return"function";case"bigint":return"bigint";case"symbol":return"symbol";case"object":if(Array.isArray(data)){return"array"}if(data===null){return"null"}if(data.then&&typeof data.then==="function"&&data.catch&&typeof data.catch==="function"){return"promise"}if(typeof Map!=="undefined"&&data instanceof Map){return"map"}if(typeof Set!=="undefined"&&data instanceof Set){return"set"}if(typeof Date!=="undefined"&&data instanceof Date){return"date"}if(typeof File!=="undefined"&&data instanceof File){return"file"}return"object";default:throw new Error(`Unknown data type: ${t}`)}};var propertyKeyTypes=new Set(["string","number","symbol"]);var primitiveTypes=new Set(["string","number","bigint","boolean","symbol","undefined"]);function escapeRegex(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function clone(inst,def,params){const cl=new inst._zod.constr(def??inst._zod.def);if(!def||params?.parent)cl._zod.parent=inst;return cl}function normalizeParams(_params){const params=_params;if(!params)return{};if(typeof params==="string")return{error:()=>params};if(params?.message!==void 0){if(params?.error!==void 0)throw new Error("Cannot specify both `message` and `error` params");params.error=params.message}delete params.message;if(typeof params.error==="string")return{...params,error:()=>params.error};return params}function createTransparentProxy(getter){let target;return new Proxy({},{get(_,prop,receiver){target??(target=getter());return Reflect.get(target,prop,receiver)},set(_,prop,value,receiver){target??(target=getter());return Reflect.set(target,prop,value,receiver)},has(_,prop){target??(target=getter());return Reflect.has(target,prop)},deleteProperty(_,prop){target??(target=getter());return Reflect.deleteProperty(target,prop)},ownKeys(_){target??(target=getter());return Reflect.ownKeys(target)},getOwnPropertyDescriptor(_,prop){target??(target=getter());return Reflect.getOwnPropertyDescriptor(target,prop)},defineProperty(_,prop,descriptor){target??(target=getter());return Reflect.defineProperty(target,prop,descriptor)}})}function stringifyPrimitive(value){if(typeof value==="bigint")return value.toString()+"n";if(typeof value==="string")return`"${value}"`;return`${value}`}function optionalKeys(shape){return Object.keys(shape).filter(k=>{return shape[k]._zod.optin==="optional"&&shape[k]._zod.optout==="optional"})}var NUMBER_FORMAT_RANGES={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};var BIGINT_FORMAT_RANGES={int64:[BigInt("-9223372036854775808"),BigInt("9223372036854775807")],uint64:[BigInt(0),BigInt("18446744073709551615")]};function pick(schema,mask){const currDef=schema._zod.def;const checks=currDef.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){throw new Error(".pick() cannot be used on object schemas containing refinements")}const def=mergeDefs(schema._zod.def,{get shape(){const newShape={};for(const key in mask){if(!(key in currDef.shape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;newShape[key]=currDef.shape[key]}assignProp(this,"shape",newShape);return newShape},checks:[]});return clone(schema,def)}function omit(schema,mask){const currDef=schema._zod.def;const checks=currDef.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){throw new Error(".omit() cannot be used on object schemas containing refinements")}const def=mergeDefs(schema._zod.def,{get shape(){const newShape={...schema._zod.def.shape};for(const key in mask){if(!(key in currDef.shape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;delete newShape[key]}assignProp(this,"shape",newShape);return newShape},checks:[]});return clone(schema,def)}function extend(schema,shape){if(!isPlainObject2(shape)){throw new Error("Invalid input to extend: expected a plain object")}const checks=schema._zod.def.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){const existingShape=schema._zod.def.shape;for(const key in shape){if(Object.getOwnPropertyDescriptor(existingShape,key)!==void 0){throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}}}const def=mergeDefs(schema._zod.def,{get shape(){const _shape={...schema._zod.def.shape,...shape};assignProp(this,"shape",_shape);return _shape}});return clone(schema,def)}function safeExtend(schema,shape){if(!isPlainObject2(shape)){throw new Error("Invalid input to safeExtend: expected a plain object")}const def=mergeDefs(schema._zod.def,{get shape(){const _shape={...schema._zod.def.shape,...shape};assignProp(this,"shape",_shape);return _shape}});return clone(schema,def)}function merge(a,b){if(a._zod.def.checks?.length){throw new Error(".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.")}const def=mergeDefs(a._zod.def,{get shape(){const _shape={...a._zod.def.shape,...b._zod.def.shape};assignProp(this,"shape",_shape);return _shape},get catchall(){return b._zod.def.catchall},checks:b._zod.def.checks??[]});return clone(a,def)}function partial(Class2,schema,mask){const currDef=schema._zod.def;const checks=currDef.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){throw new Error(".partial() cannot be used on object schemas containing refinements")}const def=mergeDefs(schema._zod.def,{get shape(){const oldShape=schema._zod.def.shape;const shape={...oldShape};if(mask){for(const key in mask){if(!(key in oldShape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key]}}else{for(const key in oldShape){shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key]}}assignProp(this,"shape",shape);return shape},checks:[]});return clone(schema,def)}function required(Class2,schema,mask){const def=mergeDefs(schema._zod.def,{get shape(){const oldShape=schema._zod.def.shape;const shape={...oldShape};if(mask){for(const key in mask){if(!(key in shape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]})}}else{for(const key in oldShape){shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]})}}assignProp(this,"shape",shape);return shape}});return clone(schema,def)}function aborted(x,startIndex=0){if(x.aborted===true)return true;for(let i=startIndex;i<x.issues.length;i++){if(x.issues[i]?.continue!==true){return true}}return false}function explicitlyAborted(x,startIndex=0){if(x.aborted===true)return true;for(let i=startIndex;i<x.issues.length;i++){if(x.issues[i]?.continue===false){return true}}return false}function prefixIssues(path16,issues){return issues.map(iss=>{var _a3;(_a3=iss).path??(_a3.path=[]);iss.path.unshift(path16);return iss})}function unwrapMessage(message){return typeof message==="string"?message:message?.message}function finalizeIssue(iss,ctx,config2){const message=iss.message?iss.message:unwrapMessage(iss.inst?._zod.def?.error?.(iss))??unwrapMessage(ctx?.error?.(iss))??unwrapMessage(config2.customError?.(iss))??unwrapMessage(config2.localeError?.(iss))??"Invalid input";const{inst:_inst,continue:_continue,input:_input,...rest}=iss;rest.path??(rest.path=[]);rest.message=message;if(ctx?.reportInput){rest.input=_input}return rest}function getSizableOrigin(input){if(input instanceof Set)return"set";if(input instanceof Map)return"map";if(input instanceof File)return"file";return"unknown"}function getLengthableOrigin(input){if(Array.isArray(input))return"array";if(typeof input==="string")return"string";return"unknown"}function parsedType(data){const t=typeof data;switch(t){case"number":{return Number.isNaN(data)?"nan":"number"}case"object":{if(data===null){return"null"}if(Array.isArray(data)){return"array"}const obj=data;if(obj&&Object.getPrototypeOf(obj)!==Object.prototype&&"constructor"in obj&&obj.constructor){return obj.constructor.name}}}return t}function issue(...args){const[iss,input,inst]=args;if(typeof iss==="string"){return{message:iss,code:"custom",input,inst}}return{...iss}}function cleanEnum(obj){return Object.entries(obj).filter(([k,_])=>{return Number.isNaN(Number.parseInt(k,10))}).map(el=>el[1])}function base64ToUint8Array(base643){const binaryString=atob(base643);const bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++){bytes[i]=binaryString.charCodeAt(i)}return bytes}function uint8ArrayToBase64(bytes){let binaryString="";for(let i=0;i<bytes.length;i++){binaryString+=String.fromCharCode(bytes[i])}return btoa(binaryString)}function base64urlToUint8Array(base64url3){const base643=base64url3.replace(/-/g,"+").replace(/_/g,"/");const padding="=".repeat((4-base643.length%4)%4);return base64ToUint8Array(base643+padding)}function uint8ArrayToBase64url(bytes){return uint8ArrayToBase64(bytes).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function hexToUint8Array(hex3){const cleanHex=hex3.replace(/^0x/,"");if(cleanHex.length%2!==0){throw new Error("Invalid hex string length")}const bytes=new Uint8Array(cleanHex.length/2);for(let i=0;i<cleanHex.length;i+=2){bytes[i/2]=Number.parseInt(cleanHex.slice(i,i+2),16)}return bytes}function uint8ArrayToHex(bytes){return Array.from(bytes).map(b=>b.toString(16).padStart(2,"0")).join("")}var Class=class{constructor(..._args){}};var initializer=(inst,def)=>{inst.name="$ZodError";Object.defineProperty(inst,"_zod",{value:inst._zod,enumerable:false});Object.defineProperty(inst,"issues",{value:def,enumerable:false});inst.message=JSON.stringify(def,jsonStringifyReplacer,2);Object.defineProperty(inst,"toString",{value:()=>inst.message,enumerable:false})};var $ZodError=$constructor("$ZodError",initializer);var $ZodRealError=$constructor("$ZodError",initializer,{Parent:Error});function flattenError(error51,mapper=issue2=>issue2.message){const fieldErrors={};const formErrors=[];for(const sub of error51.issues){if(sub.path.length>0){fieldErrors[sub.path[0]]=fieldErrors[sub.path[0]]||[];fieldErrors[sub.path[0]].push(mapper(sub))}else{formErrors.push(mapper(sub))}}return{formErrors,fieldErrors}}function formatError(error51,mapper=issue2=>issue2.message){const fieldErrors={_errors:[]};const processError=(error52,path16=[])=>{for(const issue2 of error52.issues){if(issue2.code==="invalid_union"&&issue2.errors.length){issue2.errors.map(issues=>processError({issues},[...path16,...issue2.path]))}else if(issue2.code==="invalid_key"){processError({issues:issue2.issues},[...path16,...issue2.path])}else if(issue2.code==="invalid_element"){processError({issues:issue2.issues},[...path16,...issue2.path])}else{const fullpath=[...path16,...issue2.path];if(fullpath.length===0){fieldErrors._errors.push(mapper(issue2))}else{let curr=fieldErrors;let i=0;while(i<fullpath.length){const el=fullpath[i];const terminal=i===fullpath.length-1;if(!terminal){curr[el]=curr[el]||{_errors:[]}}else{curr[el]=curr[el]||{_errors:[]};curr[el]._errors.push(mapper(issue2))}curr=curr[el];i++}}}}};processError(error51);return fieldErrors}function treeifyError(error51,mapper=issue2=>issue2.message){const result={errors:[]};const processError=(error52,path16=[])=>{var _a3,_b;for(const issue2 of error52.issues){if(issue2.code==="invalid_union"&&issue2.errors.length){issue2.errors.map(issues=>processError({issues},[...path16,...issue2.path]))}else if(issue2.code==="invalid_key"){processError({issues:issue2.issues},[...path16,...issue2.path])}else if(issue2.code==="invalid_element"){processError({issues:issue2.issues},[...path16,...issue2.path])}else{const fullpath=[...path16,...issue2.path];if(fullpath.length===0){result.errors.push(mapper(issue2));continue}let curr=result;let i=0;while(i<fullpath.length){const el=fullpath[i];const terminal=i===fullpath.length-1;if(typeof el==="string"){curr.properties??(curr.properties={});(_a3=curr.properties)[el]??(_a3[el]={errors:[]});curr=curr.properties[el]}else{curr.items??(curr.items=[]);(_b=curr.items)[el]??(_b[el]={errors:[]});curr=curr.items[el]}if(terminal){curr.errors.push(mapper(issue2))}i++}}}};processError(error51);return result}function toDotPath(_path){const segs=[];const path16=_path.map(seg=>typeof seg==="object"?seg.key:seg);for(const seg of path16){if(typeof seg==="number")segs.push(`[${seg}]`);else if(typeof seg==="symbol")segs.push(`[${JSON.stringify(String(seg))}]`);else if(/[^\w$]/.test(seg))segs.push(`[${JSON.stringify(seg)}]`);else{if(segs.length)segs.push(".");segs.push(seg)}}return segs.join("")}function prettifyError(error51){const lines=[];const issues=[...error51.issues].sort((a,b)=>(a.path??[]).length-(b.path??[]).length);for(const issue2 of issues){lines.push(`\u2716 ${issue2.message}`);if(issue2.path?.length)lines.push(` \u2192 at ${toDotPath(issue2.path)}`)}return lines.join("\n")}var _parse=_Err=>(schema,value,_ctx,_params)=>{const ctx=_ctx?{..._ctx,async:false}:{async:false};const result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise){throw new $ZodAsyncError}if(result.issues.length){const e=new(_params?.Err??_Err)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())));captureStackTrace(e,_params?.callee);throw e}return result.value};var parse=_parse($ZodRealError);var _parseAsync=_Err=>async(schema,value,_ctx,params)=>{const ctx=_ctx?{..._ctx,async:true}:{async:true};let result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise)result=await result;if(result.issues.length){const e=new(params?.Err??_Err)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())));captureStackTrace(e,params?.callee);throw e}return result.value};var parseAsync=_parseAsync($ZodRealError);var _safeParse=_Err=>(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,async:false}:{async:false};const result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise){throw new $ZodAsyncError}return result.issues.length?{success:false,error:new(_Err??$ZodError)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())))}:{success:true,data:result.value}};var safeParse=_safeParse($ZodRealError);var _safeParseAsync=_Err=>async(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,async:true}:{async:true};let result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise)result=await result;return result.issues.length?{success:false,error:new _Err(result.issues.map(iss=>finalizeIssue(iss,ctx,config())))}:{success:true,data:result.value}};var safeParseAsync=_safeParseAsync($ZodRealError);var _encode=_Err=>(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _parse(_Err)(schema,value,ctx)};var encode=_encode($ZodRealError);var _decode=_Err=>(schema,value,_ctx)=>{return _parse(_Err)(schema,value,_ctx)};var decode=_decode($ZodRealError);var _encodeAsync=_Err=>async(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _parseAsync(_Err)(schema,value,ctx)};var encodeAsync=_encodeAsync($ZodRealError);var _decodeAsync=_Err=>async(schema,value,_ctx)=>{return _parseAsync(_Err)(schema,value,_ctx)};var decodeAsync=_decodeAsync($ZodRealError);var _safeEncode=_Err=>(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _safeParse(_Err)(schema,value,ctx)};var safeEncode=_safeEncode($ZodRealError);var _safeDecode=_Err=>(schema,value,_ctx)=>{return _safeParse(_Err)(schema,value,_ctx)};var safeDecode=_safeDecode($ZodRealError);var _safeEncodeAsync=_Err=>async(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _safeParseAsync(_Err)(schema,value,ctx)};var safeEncodeAsync=_safeEncodeAsync($ZodRealError);var _safeDecodeAsync=_Err=>async(schema,value,_ctx)=>{return _safeParseAsync(_Err)(schema,value,_ctx)};var safeDecodeAsync=_safeDecodeAsync($ZodRealError);var regexes_exports={};__export(regexes_exports,{base64:()=>base64,base64url:()=>base64url,bigint:()=>bigint,boolean:()=>boolean,browserEmail:()=>browserEmail,cidrv4:()=>cidrv4,cidrv6:()=>cidrv6,cuid:()=>cuid,cuid2:()=>cuid2,date:()=>date,datetime:()=>datetime,domain:()=>domain,duration:()=>duration,e164:()=>e164,email:()=>email,emoji:()=>emoji,extendedDuration:()=>extendedDuration,guid:()=>guid,hex:()=>hex,hostname:()=>hostname,html5Email:()=>html5Email,httpProtocol:()=>httpProtocol,idnEmail:()=>idnEmail,integer:()=>integer,ipv4:()=>ipv4,ipv6:()=>ipv6,ksuid:()=>ksuid,lowercase:()=>lowercase,mac:()=>mac,md5_base64:()=>md5_base64,md5_base64url:()=>md5_base64url,md5_hex:()=>md5_hex,nanoid:()=>nanoid,null:()=>_null,number:()=>number,rfc5322Email:()=>rfc5322Email,sha1_base64:()=>sha1_base64,sha1_base64url:()=>sha1_base64url,sha1_hex:()=>sha1_hex,sha256_base64:()=>sha256_base64,sha256_base64url:()=>sha256_base64url,sha256_hex:()=>sha256_hex,sha384_base64:()=>sha384_base64,sha384_base64url:()=>sha384_base64url,sha384_hex:()=>sha384_hex,sha512_base64:()=>sha512_base64,sha512_base64url:()=>sha512_base64url,sha512_hex:()=>sha512_hex,string:()=>string,time:()=>time,ulid:()=>ulid,undefined:()=>_undefined,unicodeEmail:()=>unicodeEmail,uppercase:()=>uppercase,uuid:()=>uuid,uuid4:()=>uuid4,uuid6:()=>uuid6,uuid7:()=>uuid7,xid:()=>xid});var cuid=/^[cC][0-9a-z]{6,}$/;var cuid2=/^[0-9a-z]+$/;var ulid=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;var xid=/^[0-9a-vA-V]{20}$/;var ksuid=/^[A-Za-z0-9]{27}$/;var nanoid=/^[a-zA-Z0-9_-]{21}$/;var duration=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/;var extendedDuration=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/;var guid=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;var uuid=version2=>{if(!version2)return/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version2}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`)};var uuid4=uuid(4);var uuid6=uuid(6);var uuid7=uuid(7);var email=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;var html5Email=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;var rfc5322Email=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;var unicodeEmail=/^[^\s@"]{1,64}@[^\s@]{1,255}$/u;var idnEmail=unicodeEmail;var browserEmail=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;var _emoji=`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`;function emoji(){return new RegExp(_emoji,"u")}var ipv4=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;var ipv6=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;var mac=delimiter=>{const escapedDelim=escapeRegex(delimiter??":");return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`)};var cidrv4=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;var cidrv6=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;var base64=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;var base64url=/^[A-Za-z0-9_-]*$/;var hostname=/^(?=.{1,253}\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\.?$/;var domain=/^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;var httpProtocol=/^https?$/;var e164=/^\+[1-9]\d{6,14}$/;var dateSource=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`;var date=new RegExp(`^${dateSource}$`);function timeSource(args){const hhmm=`(?:[01]\\d|2[0-3]):[0-5]\\d`;const regex=typeof args.precision==="number"?args.precision===-1?`${hhmm}`:args.precision===0?`${hhmm}:[0-5]\\d`:`${hhmm}:[0-5]\\d\\.\\d{${args.precision}}`:`${hhmm}(?::[0-5]\\d(?:\\.\\d+)?)?`;return regex}function time(args){return new RegExp(`^${timeSource(args)}$`)}function datetime(args){const time3=timeSource({precision:args.precision});const opts=["Z"];if(args.local)opts.push("");if(args.offset)opts.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);const timeRegex=`${time3}(?:${opts.join("|")})`;return new RegExp(`^${dateSource}T(?:${timeRegex})$`)}var string=params=>{const regex=params?`[\\s\\S]{${params?.minimum??0},${params?.maximum??""}}`:`[\\s\\S]*`;return new RegExp(`^${regex}$`)};var bigint=/^-?\d+n?$/;var integer=/^-?\d+$/;var number=/^-?\d+(?:\.\d+)?$/;var boolean=/^(?:true|false)$/i;var _null=/^null$/i;var _undefined=/^undefined$/i;var lowercase=/^[^A-Z]*$/;var uppercase=/^[^a-z]*$/;var hex=/^[0-9a-fA-F]*$/;function fixedBase64(bodyLength,padding){return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`)}function fixedBase64url(length){return new RegExp(`^[A-Za-z0-9_-]{${length}}$`)}var md5_hex=/^[0-9a-fA-F]{32}$/;var md5_base64=fixedBase64(22,"==");var md5_base64url=fixedBase64url(22);var sha1_hex=/^[0-9a-fA-F]{40}$/;var sha1_base64=fixedBase64(27,"=");var sha1_base64url=fixedBase64url(27);var sha256_hex=/^[0-9a-fA-F]{64}$/;var sha256_base64=fixedBase64(43,"=");var sha256_base64url=fixedBase64url(43);var sha384_hex=/^[0-9a-fA-F]{96}$/;var sha384_base64=fixedBase64(64,"");var sha384_base64url=fixedBase64url(64);var sha512_hex=/^[0-9a-fA-F]{128}$/;var sha512_base64=fixedBase64(86,"==");var sha512_base64url=fixedBase64url(86);var $ZodCheck=$constructor("$ZodCheck",(inst,def)=>{var _a3;inst._zod??(inst._zod={});inst._zod.def=def;(_a3=inst._zod).onattach??(_a3.onattach=[])});var numericOriginMap={number:"number",bigint:"bigint",object:"date"};var $ZodCheckLessThan=$constructor("$ZodCheckLessThan",(inst,def)=>{$ZodCheck.init(inst,def);const origin=numericOriginMap[typeof def.value];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;const curr=(def.inclusive?bag.maximum:bag.exclusiveMaximum)??Number.POSITIVE_INFINITY;if(def.value<curr){if(def.inclusive)bag.maximum=def.value;else bag.exclusiveMaximum=def.value}});inst._zod.check=payload=>{if(def.inclusive?payload.value<=def.value:payload.value<def.value){return}payload.issues.push({origin,code:"too_big",maximum:typeof def.value==="object"?def.value.getTime():def.value,input:payload.value,inclusive:def.inclusive,inst,continue:!def.abort})}});var $ZodCheckGreaterThan=$constructor("$ZodCheckGreaterThan",(inst,def)=>{$ZodCheck.init(inst,def);const origin=numericOriginMap[typeof def.value];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;const curr=(def.inclusive?bag.minimum:bag.exclusiveMinimum)??Number.NEGATIVE_INFINITY;if(def.value>curr){if(def.inclusive)bag.minimum=def.value;else bag.exclusiveMinimum=def.value}});inst._zod.check=payload=>{if(def.inclusive?payload.value>=def.value:payload.value>def.value){return}payload.issues.push({origin,code:"too_small",minimum:typeof def.value==="object"?def.value.getTime():def.value,input:payload.value,inclusive:def.inclusive,inst,continue:!def.abort})}});var $ZodCheckMultipleOf=$constructor("$ZodCheckMultipleOf",(inst,def)=>{$ZodCheck.init(inst,def);inst._zod.onattach.push(inst2=>{var _a3;(_a3=inst2._zod.bag).multipleOf??(_a3.multipleOf=def.value)});inst._zod.check=payload=>{if(typeof payload.value!==typeof def.value)throw new Error("Cannot mix number and bigint in multiple_of check.");const isMultiple=typeof payload.value==="bigint"?payload.value%def.value===BigInt(0):floatSafeRemainder(payload.value,def.value)===0;if(isMultiple)return;payload.issues.push({origin:typeof payload.value,code:"not_multiple_of",divisor:def.value,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckNumberFormat=$constructor("$ZodCheckNumberFormat",(inst,def)=>{$ZodCheck.init(inst,def);def.format=def.format||"float64";const isInt=def.format?.includes("int");const origin=isInt?"int":"number";const[minimum,maximum]=NUMBER_FORMAT_RANGES[def.format];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.format=def.format;bag.minimum=minimum;bag.maximum=maximum;if(isInt)bag.pattern=integer});inst._zod.check=payload=>{const input=payload.value;if(isInt){if(!Number.isInteger(input)){payload.issues.push({expected:origin,format:def.format,code:"invalid_type",continue:false,input,inst});return}if(!Number.isSafeInteger(input)){if(input>0){payload.issues.push({input,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst,origin,inclusive:true,continue:!def.abort})}else{payload.issues.push({input,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst,origin,inclusive:true,continue:!def.abort})}return}}if(input<minimum){payload.issues.push({origin:"number",input,code:"too_small",minimum,inclusive:true,inst,continue:!def.abort})}if(input>maximum){payload.issues.push({origin:"number",input,code:"too_big",maximum,inclusive:true,inst,continue:!def.abort})}}});var $ZodCheckBigIntFormat=$constructor("$ZodCheckBigIntFormat",(inst,def)=>{$ZodCheck.init(inst,def);const[minimum,maximum]=BIGINT_FORMAT_RANGES[def.format];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.format=def.format;bag.minimum=minimum;bag.maximum=maximum});inst._zod.check=payload=>{const input=payload.value;if(input<minimum){payload.issues.push({origin:"bigint",input,code:"too_small",minimum,inclusive:true,inst,continue:!def.abort})}if(input>maximum){payload.issues.push({origin:"bigint",input,code:"too_big",maximum,inclusive:true,inst,continue:!def.abort})}}});var $ZodCheckMaxSize=$constructor("$ZodCheckMaxSize",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.size!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.maximum??Number.POSITIVE_INFINITY;if(def.maximum<curr)inst2._zod.bag.maximum=def.maximum});inst._zod.check=payload=>{const input=payload.value;const size=input.size;if(size<=def.maximum)return;payload.issues.push({origin:getSizableOrigin(input),code:"too_big",maximum:def.maximum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckMinSize=$constructor("$ZodCheckMinSize",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.size!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.minimum??Number.NEGATIVE_INFINITY;if(def.minimum>curr)inst2._zod.bag.minimum=def.minimum});inst._zod.check=payload=>{const input=payload.value;const size=input.size;if(size>=def.minimum)return;payload.issues.push({origin:getSizableOrigin(input),code:"too_small",minimum:def.minimum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckSizeEquals=$constructor("$ZodCheckSizeEquals",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.size!==void 0});inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.minimum=def.size;bag.maximum=def.size;bag.size=def.size});inst._zod.check=payload=>{const input=payload.value;const size=input.size;if(size===def.size)return;const tooBig=size>def.size;payload.issues.push({origin:getSizableOrigin(input),...tooBig?{code:"too_big",maximum:def.size}:{code:"too_small",minimum:def.size},inclusive:true,exact:true,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckMaxLength=$constructor("$ZodCheckMaxLength",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.length!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.maximum??Number.POSITIVE_INFINITY;if(def.maximum<curr)inst2._zod.bag.maximum=def.maximum});inst._zod.check=payload=>{const input=payload.value;const length=input.length;if(length<=def.maximum)return;const origin=getLengthableOrigin(input);payload.issues.push({origin,code:"too_big",maximum:def.maximum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckMinLength=$constructor("$ZodCheckMinLength",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.length!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.minimum??Number.NEGATIVE_INFINITY;if(def.minimum>curr)inst2._zod.bag.minimum=def.minimum});inst._zod.check=payload=>{const input=payload.value;const length=input.length;if(length>=def.minimum)return;const origin=getLengthableOrigin(input);payload.issues.push({origin,code:"too_small",minimum:def.minimum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckLengthEquals=$constructor("$ZodCheckLengthEquals",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.length!==void 0});inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.minimum=def.length;bag.maximum=def.length;bag.length=def.length});inst._zod.check=payload=>{const input=payload.value;const length=input.length;if(length===def.length)return;const origin=getLengthableOrigin(input);const tooBig=length>def.length;payload.issues.push({origin,...tooBig?{code:"too_big",maximum:def.length}:{code:"too_small",minimum:def.length},inclusive:true,exact:true,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckStringFormat=$constructor("$ZodCheckStringFormat",(inst,def)=>{var _a3,_b;$ZodCheck.init(inst,def);inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.format=def.format;if(def.pattern){bag.patterns??(bag.patterns=new Set);bag.patterns.add(def.pattern)}});if(def.pattern)(_a3=inst._zod).check??(_a3.check=payload=>{def.pattern.lastIndex=0;if(def.pattern.test(payload.value))return;payload.issues.push({origin:"string",code:"invalid_format",format:def.format,input:payload.value,...def.pattern?{pattern:def.pattern.toString()}:{},inst,continue:!def.abort})});else(_b=inst._zod).check??(_b.check=()=>{})});var $ZodCheckRegex=$constructor("$ZodCheckRegex",(inst,def)=>{$ZodCheckStringFormat.init(inst,def);inst._zod.check=payload=>{def.pattern.lastIndex=0;if(def.pattern.test(payload.value))return;payload.issues.push({origin:"string",code:"invalid_format",format:"regex",input:payload.value,pattern:def.pattern.toString(),inst,continue:!def.abort})}});var $ZodCheckLowerCase=$constructor("$ZodCheckLowerCase",(inst,def)=>{def.pattern??(def.pattern=lowercase);$ZodCheckStringFormat.init(inst,def)});var $ZodCheckUpperCase=$constructor("$ZodCheckUpperCase",(inst,def)=>{def.pattern??(def.pattern=uppercase);$ZodCheckStringFormat.init(inst,def)});var $ZodCheckIncludes=$constructor("$ZodCheckIncludes",(inst,def)=>{$ZodCheck.init(inst,def);const escapedRegex=escapeRegex(def.includes);const pattern=new RegExp(typeof def.position==="number"?`^.{${def.position}}${escapedRegex}`:escapedRegex);def.pattern=pattern;inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set);bag.patterns.add(pattern)});inst._zod.check=payload=>{if(payload.value.includes(def.includes,def.position))return;payload.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:def.includes,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckStartsWith=$constructor("$ZodCheckStartsWith",(inst,def)=>{$ZodCheck.init(inst,def);const pattern=new RegExp(`^${escapeRegex(def.prefix)}.*`);def.pattern??(def.pattern=pattern);inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set);bag.patterns.add(pattern)});inst._zod.check=payload=>{if(payload.value.startsWith(def.prefix))return;payload.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:def.prefix,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckEndsWith=$constructor("$ZodCheckEndsWith",(inst,def)=>{$ZodCheck.init(inst,def);const pattern=new RegExp(`.*${escapeRegex(def.suffix)}$`);def.pattern??(def.pattern=pattern);inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set);bag.patterns.add(pattern)});inst._zod.check=payload=>{if(payload.value.endsWith(def.suffix))return;payload.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:def.suffix,input:payload.value,inst,continue:!def.abort})}});function handleCheckPropertyResult(result,payload,property){if(result.issues.length){payload.issues.push(...prefixIssues(property,result.issues))}}var $ZodCheckProperty=$constructor("$ZodCheckProperty",(inst,def)=>{$ZodCheck.init(inst,def);inst._zod.check=payload=>{const result=def.schema._zod.run({value:payload.value[def.property],issues:[]},{});if(result instanceof Promise){return result.then(result2=>handleCheckPropertyResult(result2,payload,def.property))}handleCheckPropertyResult(result,payload,def.property);return}});var $ZodCheckMimeType=$constructor("$ZodCheckMimeType",(inst,def)=>{$ZodCheck.init(inst,def);const mimeSet=new Set(def.mime);inst._zod.onattach.push(inst2=>{inst2._zod.bag.mime=def.mime});inst._zod.check=payload=>{if(mimeSet.has(payload.value.type))return;payload.issues.push({code:"invalid_value",values:def.mime,input:payload.value.type,inst,continue:!def.abort})}});var $ZodCheckOverwrite=$constructor("$ZodCheckOverwrite",(inst,def)=>{$ZodCheck.init(inst,def);inst._zod.check=payload=>{payload.value=def.tx(payload.value)}});var Doc=class{constructor(args=[]){this.content=[];this.indent=0;if(this)this.args=args}indented(fn){this.indent+=1;fn(this);this.indent-=1}write(arg){if(typeof arg==="function"){arg(this,{execution:"sync"});arg(this,{execution:"async"});return}const content=arg;const lines=content.split("\n").filter(x=>x);const minIndent=Math.min(...lines.map(x=>x.length-x.trimStart().length));const dedented=lines.map(x=>x.slice(minIndent)).map(x=>" ".repeat(this.indent*2)+x);for(const line of dedented){this.content.push(line)}}compile(){const F=Function;const args=this?.args;const content=this?.content??[``];const lines=[...content.map(x=>` ${x}`)];return new F(...args,lines.join("\n"))}};var version={major:4,minor:4,patch:3};var $ZodType=$constructor("$ZodType",(inst,def)=>{var _a3;inst??(inst={});inst._zod.def=def;inst._zod.bag=inst._zod.bag||{};inst._zod.version=version;const checks=[...inst._zod.def.checks??[]];if(inst._zod.traits.has("$ZodCheck")){checks.unshift(inst)}for(const ch of checks){for(const fn of ch._zod.onattach){fn(inst)}}if(checks.length===0){(_a3=inst._zod).deferred??(_a3.deferred=[]);inst._zod.deferred?.push(()=>{inst._zod.run=inst._zod.parse})}else{const runChecks=(payload,checks2,ctx)=>{let isAborted=aborted(payload);let asyncResult;for(const ch of checks2){if(ch._zod.def.when){if(explicitlyAborted(payload))continue;const shouldRun=ch._zod.def.when(payload);if(!shouldRun)continue}else if(isAborted){continue}const currLen=payload.issues.length;const _=ch._zod.check(payload);if(_ instanceof Promise&&ctx?.async===false){throw new $ZodAsyncError}if(asyncResult||_ instanceof Promise){asyncResult=(asyncResult??Promise.resolve()).then(async()=>{await _;const nextLen=payload.issues.length;if(nextLen===currLen)return;if(!isAborted)isAborted=aborted(payload,currLen)})}else{const nextLen=payload.issues.length;if(nextLen===currLen)continue;if(!isAborted)isAborted=aborted(payload,currLen)}}if(asyncResult){return asyncResult.then(()=>{return payload})}return payload};const handleCanaryResult=(canary,payload,ctx)=>{if(aborted(canary)){canary.aborted=true;return canary}const checkResult=runChecks(payload,checks,ctx);if(checkResult instanceof Promise){if(ctx.async===false)throw new $ZodAsyncError;return checkResult.then(checkResult2=>inst._zod.parse(checkResult2,ctx))}return inst._zod.parse(checkResult,ctx)};inst._zod.run=(payload,ctx)=>{if(ctx.skipChecks){return inst._zod.parse(payload,ctx)}if(ctx.direction==="backward"){const canary=inst._zod.parse({value:payload.value,issues:[]},{...ctx,skipChecks:true});if(canary instanceof Promise){return canary.then(canary2=>{return handleCanaryResult(canary2,payload,ctx)})}return handleCanaryResult(canary,payload,ctx)}const result=inst._zod.parse(payload,ctx);if(result instanceof Promise){if(ctx.async===false)throw new $ZodAsyncError;return result.then(result2=>runChecks(result2,checks,ctx))}return runChecks(result,checks,ctx)}}defineLazy(inst,"~standard",()=>({validate:value=>{try{const r=safeParse(inst,value);return r.success?{value:r.data}:{issues:r.error?.issues}}catch(_){return safeParseAsync(inst,value).then(r=>r.success?{value:r.data}:{issues:r.error?.issues})}},vendor:"zod",version:1}))});var $ZodString=$constructor("$ZodString",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=[...inst?._zod.bag?.patterns??[]].pop()??string(inst._zod.bag);inst._zod.parse=(payload,_)=>{if(def.coerce)try{payload.value=String(payload.value)}catch(_2){}if(typeof payload.value==="string")return payload;payload.issues.push({expected:"string",code:"invalid_type",input:payload.value,inst});return payload}});var $ZodStringFormat=$constructor("$ZodStringFormat",(inst,def)=>{$ZodCheckStringFormat.init(inst,def);$ZodString.init(inst,def)});var $ZodGUID=$constructor("$ZodGUID",(inst,def)=>{def.pattern??(def.pattern=guid);$ZodStringFormat.init(inst,def)});var $ZodUUID=$constructor("$ZodUUID",(inst,def)=>{if(def.version){const versionMap={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8};const v=versionMap[def.version];if(v===void 0)throw new Error(`Invalid UUID version: "${def.version}"`);def.pattern??(def.pattern=uuid(v))}else def.pattern??(def.pattern=uuid());$ZodStringFormat.init(inst,def)});var $ZodEmail=$constructor("$ZodEmail",(inst,def)=>{def.pattern??(def.pattern=email);$ZodStringFormat.init(inst,def)});var $ZodURL=$constructor("$ZodURL",(inst,def)=>{$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{try{const trimmed=payload.value.trim();if(!def.normalize&&def.protocol?.source===httpProtocol.source){if(!/^https?:\/\//i.test(trimmed)){payload.issues.push({code:"invalid_format",format:"url",note:"Invalid URL format",input:payload.value,inst,continue:!def.abort});return}}const url2=new URL(trimmed);if(def.hostname){def.hostname.lastIndex=0;if(!def.hostname.test(url2.hostname)){payload.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:def.hostname.source,input:payload.value,inst,continue:!def.abort})}}if(def.protocol){def.protocol.lastIndex=0;if(!def.protocol.test(url2.protocol.endsWith(":")?url2.protocol.slice(0,-1):url2.protocol)){payload.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:def.protocol.source,input:payload.value,inst,continue:!def.abort})}}if(def.normalize){payload.value=url2.href}else{payload.value=trimmed}return}catch(_){payload.issues.push({code:"invalid_format",format:"url",input:payload.value,inst,continue:!def.abort})}}});var $ZodEmoji=$constructor("$ZodEmoji",(inst,def)=>{def.pattern??(def.pattern=emoji());$ZodStringFormat.init(inst,def)});var $ZodNanoID=$constructor("$ZodNanoID",(inst,def)=>{def.pattern??(def.pattern=nanoid);$ZodStringFormat.init(inst,def)});var $ZodCUID=$constructor("$ZodCUID",(inst,def)=>{def.pattern??(def.pattern=cuid);$ZodStringFormat.init(inst,def)});var $ZodCUID2=$constructor("$ZodCUID2",(inst,def)=>{def.pattern??(def.pattern=cuid2);$ZodStringFormat.init(inst,def)});var $ZodULID=$constructor("$ZodULID",(inst,def)=>{def.pattern??(def.pattern=ulid);$ZodStringFormat.init(inst,def)});var $ZodXID=$constructor("$ZodXID",(inst,def)=>{def.pattern??(def.pattern=xid);$ZodStringFormat.init(inst,def)});var $ZodKSUID=$constructor("$ZodKSUID",(inst,def)=>{def.pattern??(def.pattern=ksuid);$ZodStringFormat.init(inst,def)});var $ZodISODateTime=$constructor("$ZodISODateTime",(inst,def)=>{def.pattern??(def.pattern=datetime(def));$ZodStringFormat.init(inst,def)});var $ZodISODate=$constructor("$ZodISODate",(inst,def)=>{def.pattern??(def.pattern=date);$ZodStringFormat.init(inst,def)});var $ZodISOTime=$constructor("$ZodISOTime",(inst,def)=>{def.pattern??(def.pattern=time(def));$ZodStringFormat.init(inst,def)});var $ZodISODuration=$constructor("$ZodISODuration",(inst,def)=>{def.pattern??(def.pattern=duration);$ZodStringFormat.init(inst,def)});var $ZodIPv4=$constructor("$ZodIPv4",(inst,def)=>{def.pattern??(def.pattern=ipv4);$ZodStringFormat.init(inst,def);inst._zod.bag.format=`ipv4`});var $ZodIPv6=$constructor("$ZodIPv6",(inst,def)=>{def.pattern??(def.pattern=ipv6);$ZodStringFormat.init(inst,def);inst._zod.bag.format=`ipv6`;inst._zod.check=payload=>{try{new URL(`http://[${payload.value}]`)}catch{payload.issues.push({code:"invalid_format",format:"ipv6",input:payload.value,inst,continue:!def.abort})}}});var $ZodMAC=$constructor("$ZodMAC",(inst,def)=>{def.pattern??(def.pattern=mac(def.delimiter));$ZodStringFormat.init(inst,def);inst._zod.bag.format=`mac`});var $ZodCIDRv4=$constructor("$ZodCIDRv4",(inst,def)=>{def.pattern??(def.pattern=cidrv4);$ZodStringFormat.init(inst,def)});var $ZodCIDRv6=$constructor("$ZodCIDRv6",(inst,def)=>{def.pattern??(def.pattern=cidrv6);$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{const parts=payload.value.split("/");try{if(parts.length!==2)throw new Error;const[address,prefix]=parts;if(!prefix)throw new Error;const prefixNum=Number(prefix);if(`${prefixNum}`!==prefix)throw new Error;if(prefixNum<0||prefixNum>128)throw new Error;new URL(`http://[${address}]`)}catch{payload.issues.push({code:"invalid_format",format:"cidrv6",input:payload.value,inst,continue:!def.abort})}}});function isValidBase64(data){if(data==="")return true;if(/\s/.test(data))return false;if(data.length%4!==0)return false;try{atob(data);return true}catch{return false}}var $ZodBase64=$constructor("$ZodBase64",(inst,def)=>{def.pattern??(def.pattern=base64);$ZodStringFormat.init(inst,def);inst._zod.bag.contentEncoding="base64";inst._zod.check=payload=>{if(isValidBase64(payload.value))return;payload.issues.push({code:"invalid_format",format:"base64",input:payload.value,inst,continue:!def.abort})}});function isValidBase64URL(data){if(!base64url.test(data))return false;const base643=data.replace(/[-_]/g,c=>c==="-"?"+":"/");const padded=base643.padEnd(Math.ceil(base643.length/4)*4,"=");return isValidBase64(padded)}var $ZodBase64URL=$constructor("$ZodBase64URL",(inst,def)=>{def.pattern??(def.pattern=base64url);$ZodStringFormat.init(inst,def);inst._zod.bag.contentEncoding="base64url";inst._zod.check=payload=>{if(isValidBase64URL(payload.value))return;payload.issues.push({code:"invalid_format",format:"base64url",input:payload.value,inst,continue:!def.abort})}});var $ZodE164=$constructor("$ZodE164",(inst,def)=>{def.pattern??(def.pattern=e164);$ZodStringFormat.init(inst,def)});function isValidJWT(token,algorithm=null){try{const tokensParts=token.split(".");if(tokensParts.length!==3)return false;const[header]=tokensParts;if(!header)return false;const parsedHeader=JSON.parse(atob(header));if("typ"in parsedHeader&&parsedHeader?.typ!=="JWT")return false;if(!parsedHeader.alg)return false;if(algorithm&&(!("alg"in parsedHeader)||parsedHeader.alg!==algorithm))return false;return true}catch{return false}}var $ZodJWT=$constructor("$ZodJWT",(inst,def)=>{$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{if(isValidJWT(payload.value,def.alg))return;payload.issues.push({code:"invalid_format",format:"jwt",input:payload.value,inst,continue:!def.abort})}});var $ZodCustomStringFormat=$constructor("$ZodCustomStringFormat",(inst,def)=>{$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{if(def.fn(payload.value))return;payload.issues.push({code:"invalid_format",format:def.format,input:payload.value,inst,continue:!def.abort})}});var $ZodNumber=$constructor("$ZodNumber",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=inst._zod.bag.pattern??number;inst._zod.parse=(payload,_ctx)=>{if(def.coerce)try{payload.value=Number(payload.value)}catch(_){}const input=payload.value;if(typeof input==="number"&&!Number.isNaN(input)&&Number.isFinite(input)){return payload}const received=typeof input==="number"?Number.isNaN(input)?"NaN":!Number.isFinite(input)?"Infinity":void 0:void 0;payload.issues.push({expected:"number",code:"invalid_type",input,inst,...received?{received}:{}});return payload}});var $ZodNumberFormat=$constructor("$ZodNumberFormat",(inst,def)=>{$ZodCheckNumberFormat.init(inst,def);$ZodNumber.init(inst,def)});var $ZodBoolean=$constructor("$ZodBoolean",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=boolean;inst._zod.parse=(payload,_ctx)=>{if(def.coerce)try{payload.value=Boolean(payload.value)}catch(_){}const input=payload.value;if(typeof input==="boolean")return payload;payload.issues.push({expected:"boolean",code:"invalid_type",input,inst});return payload}});var $ZodBigInt=$constructor("$ZodBigInt",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=bigint;inst._zod.parse=(payload,_ctx)=>{if(def.coerce)try{payload.value=BigInt(payload.value)}catch(_){}if(typeof payload.value==="bigint")return payload;payload.issues.push({expected:"bigint",code:"invalid_type",input:payload.value,inst});return payload}});var $ZodBigIntFormat=$constructor("$ZodBigIntFormat",(inst,def)=>{$ZodCheckBigIntFormat.init(inst,def);$ZodBigInt.init(inst,def)});var $ZodSymbol=$constructor("$ZodSymbol",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(typeof input==="symbol")return payload;payload.issues.push({expected:"symbol",code:"invalid_type",input,inst});return payload}});var $ZodUndefined=$constructor("$ZodUndefined",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=_undefined;inst._zod.values=new Set([void 0]);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(typeof input==="undefined")return payload;payload.issues.push({expected:"undefined",code:"invalid_type",input,inst});return payload}});var $ZodNull=$constructor("$ZodNull",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=_null;inst._zod.values=new Set([null]);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(input===null)return payload;payload.issues.push({expected:"null",code:"invalid_type",input,inst});return payload}});var $ZodAny=$constructor("$ZodAny",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=payload=>payload});var $ZodUnknown=$constructor("$ZodUnknown",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=payload=>payload});var $ZodNever=$constructor("$ZodNever",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{payload.issues.push({expected:"never",code:"invalid_type",input:payload.value,inst});return payload}});var $ZodVoid=$constructor("$ZodVoid",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(typeof input==="undefined")return payload;payload.issues.push({expected:"void",code:"invalid_type",input,inst});return payload}});var $ZodDate=$constructor("$ZodDate",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{if(def.coerce){try{payload.value=new Date(payload.value)}catch(_err){}}const input=payload.value;const isDate=input instanceof Date;const isValidDate=isDate&&!Number.isNaN(input.getTime());if(isValidDate)return payload;payload.issues.push({expected:"date",code:"invalid_type",input,...isDate?{received:"Invalid Date"}:{},inst});return payload}});function handleArrayResult(result,final,index){if(result.issues.length){final.issues.push(...prefixIssues(index,result.issues))}final.value[index]=result.value}var $ZodArray=$constructor("$ZodArray",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,ctx)=>{const input=payload.value;if(!Array.isArray(input)){payload.issues.push({expected:"array",code:"invalid_type",input,inst});return payload}payload.value=Array(input.length);const proms=[];for(let i=0;i<input.length;i++){const item=input[i];const result=def.element._zod.run({value:item,issues:[]},ctx);if(result instanceof Promise){proms.push(result.then(result2=>handleArrayResult(result2,payload,i)))}else{handleArrayResult(result,payload,i)}}if(proms.length){return Promise.all(proms).then(()=>payload)}return payload}});function handlePropertyResult(result,final,key,input,isOptionalIn,isOptionalOut){const isPresent=key in input;if(result.issues.length){if(isOptionalIn&&isOptionalOut&&!isPresent){return}final.issues.push(...prefixIssues(key,result.issues))}if(!isPresent&&!isOptionalIn){if(!result.issues.length){final.issues.push({code:"invalid_type",expected:"nonoptional",input:void 0,path:[key]})}return}if(result.value===void 0){if(isPresent){final.value[key]=void 0}}else{final.value[key]=result.value}}function normalizeDef(def){const keys=Object.keys(def.shape);for(const k of keys){if(!def.shape?.[k]?._zod?.traits?.has("$ZodType")){throw new Error(`Invalid element at key "${k}": expected a Zod schema`)}}const okeys=optionalKeys(def.shape);return{...def,keys,keySet:new Set(keys),numKeys:keys.length,optionalKeys:new Set(okeys)}}function handleCatchall(proms,input,payload,ctx,def,inst){const unrecognized=[];const keySet=def.keySet;const _catchall=def.catchall._zod;const t=_catchall.def.type;const isOptionalIn=_catchall.optin==="optional";const isOptionalOut=_catchall.optout==="optional";for(const key in input){if(key==="__proto__")continue;if(keySet.has(key))continue;if(t==="never"){unrecognized.push(key);continue}const r=_catchall.run({value:input[key],issues:[]},ctx);if(r instanceof Promise){proms.push(r.then(r2=>handlePropertyResult(r2,payload,key,input,isOptionalIn,isOptionalOut)))}else{handlePropertyResult(r,payload,key,input,isOptionalIn,isOptionalOut)}}if(unrecognized.length){payload.issues.push({code:"unrecognized_keys",keys:unrecognized,input,inst})}if(!proms.length)return payload;return Promise.all(proms).then(()=>{return payload})}var $ZodObject=$constructor("$ZodObject",(inst,def)=>{$ZodType.init(inst,def);const desc=Object.getOwnPropertyDescriptor(def,"shape");if(!desc?.get){const sh=def.shape;Object.defineProperty(def,"shape",{get:()=>{const newSh={...sh};Object.defineProperty(def,"shape",{value:newSh});return newSh}})}const _normalized=cached(()=>normalizeDef(def));defineLazy(inst._zod,"propValues",()=>{const shape=def.shape;const propValues={};for(const key in shape){const field=shape[key]._zod;if(field.values){propValues[key]??(propValues[key]=new Set);for(const v of field.values)propValues[key].add(v)}}return propValues});const isObject2=isObject;const catchall=def.catchall;let value;inst._zod.parse=(payload,ctx)=>{value??(value=_normalized.value);const input=payload.value;if(!isObject2(input)){payload.issues.push({expected:"object",code:"invalid_type",input,inst});return payload}payload.value={};const proms=[];const shape=value.shape;for(const key of value.keys){const el=shape[key];const isOptionalIn=el._zod.optin==="optional";const isOptionalOut=el._zod.optout==="optional";const r=el._zod.run({value:input[key],issues:[]},ctx);if(r instanceof Promise){proms.push(r.then(r2=>handlePropertyResult(r2,payload,key,input,isOptionalIn,isOptionalOut)))}else{handlePropertyResult(r,payload,key,input,isOptionalIn,isOptionalOut)}}if(!catchall){return proms.length?Promise.all(proms).then(()=>payload):payload}return handleCatchall(proms,input,payload,ctx,_normalized.value,inst)}});var $ZodObjectJIT=$constructor("$ZodObjectJIT",(inst,def)=>{$ZodObject.init(inst,def);const superParse=inst._zod.parse;const _normalized=cached(()=>normalizeDef(def));const generateFastpass=shape=>{const doc=new Doc(["shape","payload","ctx"]);const normalized=_normalized.value;const parseStr=key=>{const k=esc(key);return`shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`};doc.write(`const input = payload.value;`);const ids=Object.create(null);let counter=0;for(const key of normalized.keys){ids[key]=`key_${counter++}`}doc.write(`const newResult = {};`);for(const key of normalized.keys){const id=ids[key];const k=esc(key);const schema=shape[key];const isOptionalIn=schema?._zod?.optin==="optional";const isOptionalOut=schema?._zod?.optout==="optional";doc.write(`const ${id} = ${parseStr(key)};`);if(isOptionalIn&&isOptionalOut){doc.write(`
|
|
49
|
+
at ${callerFilename}`)}const[content,bottomContent]=typeof nextView==="string"?[nextView]:nextView;screen.render(content,bottomContent);effectScheduler.run()}catch(error51){reject(error51)}effectsSettled=true;if(pendingDone!==null){const{value}=pendingDone;pendingDone=null;resolve(value)}})};if("readableFlowing"in input){nativeSetImmediate(startCycle)}else{startCycle()}return Object.assign(promise2.then(answer=>{effectScheduler.clearAll();return answer},error51=>{effectScheduler.clearAll();throw error51}).finally(()=>{cleanups.forEach(cleanup=>cleanup());screen.done({clearContent:Boolean(context.clearPromptOnDone)});output.end()}).then(()=>promise2),{cancel})})};return prompt}var import_node_util3=require("util");var Separator=class{separator=(0,import_node_util3.styleText)("dim",Array.from({length:15}).join(dist_default.line));type="separator";constructor(separator){if(separator){this.separator=separator}}static isSeparator(choice){return Boolean(choice&&typeof choice==="object"&&"type"in choice&&choice.type==="separator")}};var import_node_util4=require("util");var checkboxTheme={icon:{checked:(0,import_node_util4.styleText)("green",dist_default.circleFilled),unchecked:dist_default.circle,cursor:dist_default.pointer,disabledChecked:(0,import_node_util4.styleText)("green",dist_default.circleDouble),disabledUnchecked:"-"},style:{disabled:text=>(0,import_node_util4.styleText)("dim",text),renderSelectedChoices:selectedChoices=>selectedChoices.map(choice=>choice.short).join(", "),description:text=>(0,import_node_util4.styleText)("cyan",text),keysHelpTip:keys=>keys.map(([key,action])=>`${(0,import_node_util4.styleText)("bold",key)} ${(0,import_node_util4.styleText)("dim",action)}`).join((0,import_node_util4.styleText)("dim"," \u2022 "))},i18n:{disabledError:"This option is disabled and cannot be toggled."}};function isSelectable(item){return!Separator.isSeparator(item)&&!item.disabled}function isNavigable(item){return!Separator.isSeparator(item)}function isChecked(item){return!Separator.isSeparator(item)&&item.checked}function toggle(item){return isSelectable(item)?{...item,checked:!item.checked}:item}function check(checked){return function(item){return isSelectable(item)?{...item,checked}:item}}function normalizeChoices(choices){return choices.map(choice=>{if(Separator.isSeparator(choice))return choice;if(typeof choice!=="object"||choice===null||!("value"in choice)){const name2=String(choice);return{value:choice,name:name2,short:name2,checkedName:name2,disabled:false,checked:false}}const name=choice.name??String(choice.value);const normalizedChoice={value:choice.value,name,short:choice.short??name,checkedName:choice.checkedName??name,disabled:choice.disabled??false,checked:choice.checked??false};if(choice.description){normalizedChoice.description=choice.description}return normalizedChoice})}var dist_default4=createPrompt((config2,done)=>{const{pageSize=7,loop=true,required:required2,validate=()=>true}=config2;const shortcuts={all:"a",invert:"i",...config2.shortcuts};const theme=makeTheme(checkboxTheme,config2.theme);const{keybindings:keybindings2}=theme;const[status2,setStatus]=useState("idle");const prefix=usePrefix({status:status2,theme});const[items,setItems]=useState(normalizeChoices(config2.choices));const bounds=useMemo(()=>{const first=items.findIndex(isNavigable);const last=items.findLastIndex(isNavigable);if(first===-1){throw new ValidationError("[checkbox prompt] No selectable choices. All choices are disabled.")}return{first,last}},[items]);const[active,setActive]=useState(bounds.first);const[errorMsg,setError]=useState();useKeypress(async key=>{if(isEnterKey(key)){const selection=items.filter(isChecked);const isValid=await validate([...selection]);if(required2&&!selection.length){setError("At least one choice must be selected")}else if(isValid===true){setStatus("done");done(selection.map(choice=>choice.value))}else{setError(isValid||"You must select a valid value")}}else if(isUpKey(key,keybindings2)||isDownKey(key,keybindings2)){if(errorMsg){setError(void 0)}if(loop||isUpKey(key,keybindings2)&&active!==bounds.first||isDownKey(key,keybindings2)&&active!==bounds.last){const offset=isUpKey(key,keybindings2)?-1:1;let next=active;do{next=(next+offset+items.length)%items.length}while(!isNavigable(items[next]));setActive(next)}}else if(isSpaceKey(key)){const activeItem=items[active];if(activeItem&&!Separator.isSeparator(activeItem)){if(activeItem.disabled){setError(theme.i18n.disabledError)}else{setError(void 0);setItems(items.map((choice,i)=>i===active?toggle(choice):choice))}}}else if(key.name===shortcuts.all){const selectAll=items.some(choice=>isSelectable(choice)&&!choice.checked);setItems(items.map(check(selectAll)))}else if(key.name===shortcuts.invert){setItems(items.map(toggle))}else if(isNumberKey(key)){const selectedIndex=Number(key.name)-1;let selectableIndex=-1;const position=items.findIndex(item=>{if(Separator.isSeparator(item))return false;selectableIndex++;return selectableIndex===selectedIndex});const selectedItem=items[position];if(selectedItem&&isSelectable(selectedItem)){setActive(position);setItems(items.map((choice,i)=>i===position?toggle(choice):choice))}}});const message=theme.style.message(config2.message,status2);let description;const page=usePagination({items,active,renderItem({item,isActive}){if(Separator.isSeparator(item)){return` ${item.separator}`}const cursor=isActive?theme.icon.cursor:" ";if(item.disabled){const disabledLabel=typeof item.disabled==="string"?item.disabled:"(disabled)";const checkbox2=item.checked?theme.icon.disabledChecked:theme.icon.disabledUnchecked;return theme.style.disabled(`${cursor}${checkbox2} ${item.name} ${disabledLabel}`)}if(isActive){description=item.description}const checkbox=item.checked?theme.icon.checked:theme.icon.unchecked;const name=item.checked?item.checkedName:item.name;const color=isActive?theme.style.highlight:x=>x;return color(`${cursor}${checkbox} ${name}`)},pageSize,loop});if(status2==="done"){const selection=items.filter(isChecked);const answer=theme.style.answer(theme.style.renderSelectedChoices(selection,items));return[prefix,message,answer].filter(Boolean).join(" ")}const keys=[["\u2191\u2193","navigate"],["space","select"]];if(shortcuts.all)keys.push([shortcuts.all,"all"]);if(shortcuts.invert)keys.push([shortcuts.invert,"invert"]);keys.push(["\u23CE","submit"]);const helpLine=theme.style.keysHelpTip(keys);const lines=[[prefix,message].filter(Boolean).join(" "),page," ",description?theme.style.description(description):"",errorMsg?theme.style.error(errorMsg):"",helpLine].filter(Boolean).join("\n").trimEnd();return`${lines}${cursorHide}`});function getBooleanValue(value,defaultValue){let answer=defaultValue!==false;if(/^(y|yes)/i.test(value))answer=true;else if(/^(n|no)/i.test(value))answer=false;return answer}function boolToString(value){return value?"Yes":"No"}var dist_default5=createPrompt((config2,done)=>{const{transformer=boolToString}=config2;const[status2,setStatus]=useState("idle");const[value,setValue]=useState("");const theme=makeTheme(config2.theme);const prefix=usePrefix({status:status2,theme});useKeypress((key,rl)=>{if(status2!=="idle")return;if(isEnterKey(key)){const answer=getBooleanValue(value,config2.default);setValue(transformer(answer));setStatus("done");done(answer)}else if(isTabKey(key)){const answer=boolToString(!getBooleanValue(value,config2.default));rl.clearLine(0);rl.write(answer);setValue(answer)}else{setValue(rl.line)}});let formattedValue=value;let defaultValue="";if(status2==="done"){formattedValue=theme.style.answer(value)}else{defaultValue=` ${theme.style.defaultAnswer(config2.default===false?"y/N":"Y/n")}`}const message=theme.style.message(config2.message,status2);return`${prefix} ${message}${defaultValue} ${formattedValue}`});var inputTheme={validationFailureMode:"keep"};var dist_default6=createPrompt((config2,done)=>{const{prefill="tab"}=config2;const theme=makeTheme(inputTheme,config2.theme);const[status2,setStatus]=useState("idle");const[defaultValue,setDefaultValue]=useState(String(config2.default??""));const[errorMsg,setError]=useState();const[value,setValue]=useState("");const prefix=usePrefix({status:status2,theme});async function validate(value2){const{required:required2,pattern,patternError="Invalid input"}=config2;if(required2&&!value2){return"You must provide a value"}if(pattern&&!pattern.test(value2)){return patternError}if(typeof config2.validate==="function"){return await config2.validate(value2)||"You must provide a valid value"}return true}useKeypress(async(key,rl)=>{if(status2!=="idle"){return}if(isEnterKey(key)){const answer=value||defaultValue;setStatus("loading");const isValid=await validate(answer);if(isValid===true){setValue(answer);setStatus("done");done(answer)}else{if(theme.validationFailureMode==="clear"){setValue("")}else{rl.write(value)}setError(isValid);setStatus("idle")}}else if(isBackspaceKey(key)&&!value){setDefaultValue("")}else if(isTabKey(key)&&!value){setDefaultValue("");rl.clearLine(0);rl.write(defaultValue);setValue(defaultValue)}else{setValue(rl.line);setError(void 0)}});useEffect(rl=>{if(prefill==="editable"&&defaultValue){rl.write(defaultValue);setValue(defaultValue)}},[]);const message=theme.style.message(config2.message,status2);let formattedValue=value;if(typeof config2.transformer==="function"){formattedValue=config2.transformer(value,{isFinal:status2==="done"})}else if(status2==="done"){formattedValue=theme.style.answer(value)}let defaultStr;if(defaultValue&&status2!=="done"&&!value){defaultStr=theme.style.defaultAnswer(defaultValue)}let error51="";if(errorMsg){error51=theme.style.error(errorMsg)}return[[prefix,message,defaultStr,formattedValue].filter(v=>v!==void 0).join(" "),error51]});var import_node_util5=require("util");var selectTheme={icon:{cursor:dist_default.pointer},style:{disabled:text=>(0,import_node_util5.styleText)("dim",text),description:text=>(0,import_node_util5.styleText)("cyan",text),keysHelpTip:keys=>keys.map(([key,action])=>`${(0,import_node_util5.styleText)("bold",key)} ${(0,import_node_util5.styleText)("dim",action)}`).join((0,import_node_util5.styleText)("dim"," \u2022 "))},i18n:{disabledError:"This option is disabled and cannot be selected."},indexMode:"hidden"};function isSelectable2(item){return!Separator.isSeparator(item)&&!item.disabled}function isNavigable2(item){return!Separator.isSeparator(item)}function normalizeChoices2(choices){return choices.map(choice=>{if(Separator.isSeparator(choice))return choice;if(typeof choice!=="object"||choice===null||!("value"in choice)){const name2=String(choice);return{value:choice,name:name2,short:name2,disabled:false}}const name=choice.name??String(choice.value);const normalizedChoice={value:choice.value,name,short:choice.short??name,disabled:choice.disabled??false};if(choice.description){normalizedChoice.description=choice.description}return normalizedChoice})}var dist_default7=createPrompt((config2,done)=>{const{loop=true,pageSize=7}=config2;const theme=makeTheme(selectTheme,config2.theme);const{keybindings:keybindings2}=theme;const[status2,setStatus]=useState("idle");const prefix=usePrefix({status:status2,theme});const searchTimeoutRef=useRef();const searchEnabled=!keybindings2.includes("vim");const items=useMemo(()=>normalizeChoices2(config2.choices),[config2.choices]);const bounds=useMemo(()=>{const first=items.findIndex(isNavigable2);const last=items.findLastIndex(isNavigable2);if(first===-1){throw new ValidationError("[select prompt] No selectable choices. All choices are disabled.")}return{first,last}},[items]);const defaultItemIndex=useMemo(()=>{if(!("default"in config2))return-1;return items.findIndex(item=>isSelectable2(item)&&item.value===config2.default)},[config2.default,items]);const[active,setActive]=useState(defaultItemIndex===-1?bounds.first:defaultItemIndex);const selectedChoice=items[active];if(selectedChoice==null||Separator.isSeparator(selectedChoice)){throw new Error("Active index does not point to a choice")}const[errorMsg,setError]=useState();useKeypress((key,rl)=>{clearTimeout(searchTimeoutRef.current);if(errorMsg){setError(void 0)}if(isEnterKey(key)){if(selectedChoice.disabled){setError(theme.i18n.disabledError)}else{setStatus("done");done(selectedChoice.value)}}else if(isUpKey(key,keybindings2)||isDownKey(key,keybindings2)){rl.clearLine(0);if(loop||isUpKey(key,keybindings2)&&active!==bounds.first||isDownKey(key,keybindings2)&&active!==bounds.last){const offset=isUpKey(key,keybindings2)?-1:1;let next=active;do{next=(next+offset+items.length)%items.length}while(!isNavigable2(items[next]));setActive(next)}}else if(isNumberKey(key)&&!Number.isNaN(Number(rl.line))){const selectedIndex=Number(rl.line)-1;let selectableIndex=-1;const position=items.findIndex(item2=>{if(Separator.isSeparator(item2))return false;selectableIndex++;return selectableIndex===selectedIndex});const item=items[position];if(item!=null&&isSelectable2(item)){setActive(position)}searchTimeoutRef.current=setTimeout(()=>{rl.clearLine(0)},700)}else if(isBackspaceKey(key)){rl.clearLine(0)}else if(searchEnabled){const searchTerm=rl.line.toLowerCase();const matchIndex=items.findIndex(item=>{if(Separator.isSeparator(item)||!isSelectable2(item))return false;return item.name.toLowerCase().startsWith(searchTerm)});if(matchIndex!==-1){setActive(matchIndex)}searchTimeoutRef.current=setTimeout(()=>{rl.clearLine(0)},700)}});useEffect(()=>()=>{clearTimeout(searchTimeoutRef.current)},[]);const message=theme.style.message(config2.message,status2);const helpLine=theme.style.keysHelpTip([["\u2191\u2193","navigate"],["\u23CE","select"]]);let separatorCount=0;const page=usePagination({items,active,renderItem({item,isActive,index}){if(Separator.isSeparator(item)){separatorCount++;return` ${item.separator}`}const cursor=isActive?theme.icon.cursor:" ";const indexLabel=theme.indexMode==="number"?`${index+1-separatorCount}. `:"";if(item.disabled){const disabledLabel=typeof item.disabled==="string"?item.disabled:"(disabled)";const disabledCursor=isActive?theme.icon.cursor:"-";return theme.style.disabled(`${disabledCursor} ${indexLabel}${item.name} ${disabledLabel}`)}const color=isActive?theme.style.highlight:x=>x;return color(`${cursor} ${indexLabel}${item.name}`)},pageSize,loop});if(status2==="done"){return[prefix,message,theme.style.answer(selectedChoice.short)].filter(Boolean).join(" ")}const{description}=selectedChoice;const lines=[[prefix,message].filter(Boolean).join(" "),page," ",description?theme.style.description(description):"",errorMsg?theme.style.error(errorMsg):"",helpLine].filter(Boolean).join("\n").trimEnd();return`${lines}${cursorHide}`});var package_default={name:"@zleap-ai/sag-cli",version:"0.6.2",description:"Command-line client and diagnostics for SAG knowledge bases",type:"module",bin:{sag:"dist/cli.js"},files:["dist","README.md","README.en.md","LICENSE","skill","skills/sag-mcp"],scripts:{build:"tsup && node scripts/sync-skill-runtime.mjs",dev:"tsx src/cli.ts",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",typecheck:"tsc --noEmit",lint:"eslint .",format:"prettier --write .","format:check":"prettier --check .",check:"npm run format:check && npm run lint && npm run typecheck && npm test && npm run build",prepare:"husky",commitlint:"commitlint",changeset:"changeset","version-packages":"changeset version","release:check":"bash scripts/release.sh",release:"bash scripts/release.sh --publish"},engines:{node:">=20.19.0"},publishConfig:{access:"public"},license:"MIT",dependencies:{"@inquirer/prompts":"^8.5.2","@modelcontextprotocol/client":"^2.0.0",commander:"^14.0.3","proper-lockfile":"^4.1.2",yaml:"^2.9.0",zod:"^4.4.3"},optionalDependencies:{"@napi-rs/keyring":"^1.3.0"},devDependencies:{"@changesets/cli":"^2.31.1","@commitlint/cli":"^20.0.0","@commitlint/config-conventional":"^20.0.0","@eslint/js":"^10.0.1","@types/node":"^20.19.43","@types/proper-lockfile":"^4.1.4","@typescript-eslint/eslint-plugin":"^8.65.0","@typescript-eslint/parser":"^8.65.0","@vitest/coverage-v8":"^4.1.10",eslint:"^10.8.0",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.9.6",tsup:"^8.5.1",tsx:"^4.23.1",typescript:"^6.0.3",vitest:"^4.1.10"},"lint-staged":{"*.{ts,js,mjs,cjs}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}};var import_promises=require("fs/promises");var import_node_os=__toESM(require("os"),1);var import_node_path2=__toESM(require("path"),1);var external_exports={};__export(external_exports,{$brand:()=>$brand,$input:()=>$input,$output:()=>$output,NEVER:()=>NEVER,TimePrecision:()=>TimePrecision,ZodAny:()=>ZodAny,ZodArray:()=>ZodArray,ZodBase64:()=>ZodBase64,ZodBase64URL:()=>ZodBase64URL,ZodBigInt:()=>ZodBigInt,ZodBigIntFormat:()=>ZodBigIntFormat,ZodBoolean:()=>ZodBoolean,ZodCIDRv4:()=>ZodCIDRv4,ZodCIDRv6:()=>ZodCIDRv6,ZodCUID:()=>ZodCUID,ZodCUID2:()=>ZodCUID2,ZodCatch:()=>ZodCatch,ZodCodec:()=>ZodCodec,ZodCustom:()=>ZodCustom,ZodCustomStringFormat:()=>ZodCustomStringFormat,ZodDate:()=>ZodDate,ZodDefault:()=>ZodDefault,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion,ZodE164:()=>ZodE164,ZodEmail:()=>ZodEmail,ZodEmoji:()=>ZodEmoji,ZodEnum:()=>ZodEnum,ZodError:()=>ZodError,ZodExactOptional:()=>ZodExactOptional,ZodFile:()=>ZodFile,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind,ZodFunction:()=>ZodFunction,ZodGUID:()=>ZodGUID,ZodIPv4:()=>ZodIPv4,ZodIPv6:()=>ZodIPv6,ZodISODate:()=>ZodISODate,ZodISODateTime:()=>ZodISODateTime,ZodISODuration:()=>ZodISODuration,ZodISOTime:()=>ZodISOTime,ZodIntersection:()=>ZodIntersection,ZodIssueCode:()=>ZodIssueCode,ZodJWT:()=>ZodJWT,ZodKSUID:()=>ZodKSUID,ZodLazy:()=>ZodLazy,ZodLiteral:()=>ZodLiteral,ZodMAC:()=>ZodMAC,ZodMap:()=>ZodMap,ZodNaN:()=>ZodNaN,ZodNanoID:()=>ZodNanoID,ZodNever:()=>ZodNever,ZodNonOptional:()=>ZodNonOptional,ZodNull:()=>ZodNull,ZodNullable:()=>ZodNullable,ZodNumber:()=>ZodNumber,ZodNumberFormat:()=>ZodNumberFormat,ZodObject:()=>ZodObject,ZodOptional:()=>ZodOptional,ZodPipe:()=>ZodPipe,ZodPrefault:()=>ZodPrefault,ZodPreprocess:()=>ZodPreprocess,ZodPromise:()=>ZodPromise,ZodReadonly:()=>ZodReadonly,ZodRealError:()=>ZodRealError,ZodRecord:()=>ZodRecord,ZodSet:()=>ZodSet,ZodString:()=>ZodString,ZodStringFormat:()=>ZodStringFormat,ZodSuccess:()=>ZodSuccess,ZodSymbol:()=>ZodSymbol,ZodTemplateLiteral:()=>ZodTemplateLiteral,ZodTransform:()=>ZodTransform,ZodTuple:()=>ZodTuple,ZodType:()=>ZodType,ZodULID:()=>ZodULID,ZodURL:()=>ZodURL,ZodUUID:()=>ZodUUID,ZodUndefined:()=>ZodUndefined,ZodUnion:()=>ZodUnion,ZodUnknown:()=>ZodUnknown,ZodVoid:()=>ZodVoid,ZodXID:()=>ZodXID,ZodXor:()=>ZodXor,_ZodString:()=>_ZodString,_default:()=>_default2,_function:()=>_function,any:()=>any,array:()=>array,base64:()=>base642,base64url:()=>base64url2,bigint:()=>bigint2,boolean:()=>boolean2,catch:()=>_catch2,check:()=>check2,cidrv4:()=>cidrv42,cidrv6:()=>cidrv62,clone:()=>clone,codec:()=>codec,coerce:()=>coerce_exports,config:()=>config,core:()=>core_exports2,cuid:()=>cuid3,cuid2:()=>cuid22,custom:()=>custom,date:()=>date3,decode:()=>decode2,decodeAsync:()=>decodeAsync2,describe:()=>describe2,discriminatedUnion:()=>discriminatedUnion,e164:()=>e1642,email:()=>email2,emoji:()=>emoji2,encode:()=>encode2,encodeAsync:()=>encodeAsync2,endsWith:()=>_endsWith,enum:()=>_enum2,exactOptional:()=>exactOptional,file:()=>file,flattenError:()=>flattenError,float32:()=>float32,float64:()=>float64,formatError:()=>formatError,fromJSONSchema:()=>fromJSONSchema,function:()=>_function,getErrorMap:()=>getErrorMap,globalRegistry:()=>globalRegistry,gt:()=>_gt,gte:()=>_gte,guid:()=>guid2,hash:()=>hash,hex:()=>hex2,hostname:()=>hostname2,httpUrl:()=>httpUrl,includes:()=>_includes,instanceof:()=>_instanceof,int:()=>int,int32:()=>int32,int64:()=>int64,intersection:()=>intersection,invertCodec:()=>invertCodec,ipv4:()=>ipv42,ipv6:()=>ipv62,iso:()=>iso_exports,json:()=>json,jwt:()=>jwt,keyof:()=>keyof,ksuid:()=>ksuid2,lazy:()=>lazy,length:()=>_length,literal:()=>literal,locales:()=>locales_exports,looseObject:()=>looseObject,looseRecord:()=>looseRecord,lowercase:()=>_lowercase,lt:()=>_lt,lte:()=>_lte,mac:()=>mac2,map:()=>map,maxLength:()=>_maxLength,maxSize:()=>_maxSize,meta:()=>meta2,mime:()=>_mime,minLength:()=>_minLength,minSize:()=>_minSize,multipleOf:()=>_multipleOf,nan:()=>nan,nanoid:()=>nanoid2,nativeEnum:()=>nativeEnum,negative:()=>_negative,never:()=>never,nonnegative:()=>_nonnegative,nonoptional:()=>nonoptional,nonpositive:()=>_nonpositive,normalize:()=>_normalize,null:()=>_null3,nullable:()=>nullable,nullish:()=>nullish2,number:()=>number2,object:()=>object,optional:()=>optional,overwrite:()=>_overwrite,parse:()=>parse2,parseAsync:()=>parseAsync2,partialRecord:()=>partialRecord,pipe:()=>pipe,positive:()=>_positive,prefault:()=>prefault,preprocess:()=>preprocess,prettifyError:()=>prettifyError,promise:()=>promise,property:()=>_property,readonly:()=>readonly,record:()=>record,refine:()=>refine,regex:()=>_regex,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode2,safeDecodeAsync:()=>safeDecodeAsync2,safeEncode:()=>safeEncode2,safeEncodeAsync:()=>safeEncodeAsync2,safeParse:()=>safeParse2,safeParseAsync:()=>safeParseAsync2,set:()=>set,setErrorMap:()=>setErrorMap,size:()=>_size,slugify:()=>_slugify,startsWith:()=>_startsWith,strictObject:()=>strictObject,string:()=>string2,stringFormat:()=>stringFormat,stringbool:()=>stringbool,success:()=>success,superRefine:()=>superRefine,symbol:()=>symbol,templateLiteral:()=>templateLiteral,toJSONSchema:()=>toJSONSchema,toLowerCase:()=>_toLowerCase,toUpperCase:()=>_toUpperCase,transform:()=>transform,treeifyError:()=>treeifyError,trim:()=>_trim,tuple:()=>tuple,uint32:()=>uint32,uint64:()=>uint64,ulid:()=>ulid2,undefined:()=>_undefined3,union:()=>union,unknown:()=>unknown,uppercase:()=>_uppercase,url:()=>url,util:()=>util_exports,uuid:()=>uuid2,uuidv4:()=>uuidv4,uuidv6:()=>uuidv6,uuidv7:()=>uuidv7,void:()=>_void2,xid:()=>xid2,xor:()=>xor});var core_exports2={};__export(core_exports2,{$ZodAny:()=>$ZodAny,$ZodArray:()=>$ZodArray,$ZodAsyncError:()=>$ZodAsyncError,$ZodBase64:()=>$ZodBase64,$ZodBase64URL:()=>$ZodBase64URL,$ZodBigInt:()=>$ZodBigInt,$ZodBigIntFormat:()=>$ZodBigIntFormat,$ZodBoolean:()=>$ZodBoolean,$ZodCIDRv4:()=>$ZodCIDRv4,$ZodCIDRv6:()=>$ZodCIDRv6,$ZodCUID:()=>$ZodCUID,$ZodCUID2:()=>$ZodCUID2,$ZodCatch:()=>$ZodCatch,$ZodCheck:()=>$ZodCheck,$ZodCheckBigIntFormat:()=>$ZodCheckBigIntFormat,$ZodCheckEndsWith:()=>$ZodCheckEndsWith,$ZodCheckGreaterThan:()=>$ZodCheckGreaterThan,$ZodCheckIncludes:()=>$ZodCheckIncludes,$ZodCheckLengthEquals:()=>$ZodCheckLengthEquals,$ZodCheckLessThan:()=>$ZodCheckLessThan,$ZodCheckLowerCase:()=>$ZodCheckLowerCase,$ZodCheckMaxLength:()=>$ZodCheckMaxLength,$ZodCheckMaxSize:()=>$ZodCheckMaxSize,$ZodCheckMimeType:()=>$ZodCheckMimeType,$ZodCheckMinLength:()=>$ZodCheckMinLength,$ZodCheckMinSize:()=>$ZodCheckMinSize,$ZodCheckMultipleOf:()=>$ZodCheckMultipleOf,$ZodCheckNumberFormat:()=>$ZodCheckNumberFormat,$ZodCheckOverwrite:()=>$ZodCheckOverwrite,$ZodCheckProperty:()=>$ZodCheckProperty,$ZodCheckRegex:()=>$ZodCheckRegex,$ZodCheckSizeEquals:()=>$ZodCheckSizeEquals,$ZodCheckStartsWith:()=>$ZodCheckStartsWith,$ZodCheckStringFormat:()=>$ZodCheckStringFormat,$ZodCheckUpperCase:()=>$ZodCheckUpperCase,$ZodCodec:()=>$ZodCodec,$ZodCustom:()=>$ZodCustom,$ZodCustomStringFormat:()=>$ZodCustomStringFormat,$ZodDate:()=>$ZodDate,$ZodDefault:()=>$ZodDefault,$ZodDiscriminatedUnion:()=>$ZodDiscriminatedUnion,$ZodE164:()=>$ZodE164,$ZodEmail:()=>$ZodEmail,$ZodEmoji:()=>$ZodEmoji,$ZodEncodeError:()=>$ZodEncodeError,$ZodEnum:()=>$ZodEnum,$ZodError:()=>$ZodError,$ZodExactOptional:()=>$ZodExactOptional,$ZodFile:()=>$ZodFile,$ZodFunction:()=>$ZodFunction,$ZodGUID:()=>$ZodGUID,$ZodIPv4:()=>$ZodIPv4,$ZodIPv6:()=>$ZodIPv6,$ZodISODate:()=>$ZodISODate,$ZodISODateTime:()=>$ZodISODateTime,$ZodISODuration:()=>$ZodISODuration,$ZodISOTime:()=>$ZodISOTime,$ZodIntersection:()=>$ZodIntersection,$ZodJWT:()=>$ZodJWT,$ZodKSUID:()=>$ZodKSUID,$ZodLazy:()=>$ZodLazy,$ZodLiteral:()=>$ZodLiteral,$ZodMAC:()=>$ZodMAC,$ZodMap:()=>$ZodMap,$ZodNaN:()=>$ZodNaN,$ZodNanoID:()=>$ZodNanoID,$ZodNever:()=>$ZodNever,$ZodNonOptional:()=>$ZodNonOptional,$ZodNull:()=>$ZodNull,$ZodNullable:()=>$ZodNullable,$ZodNumber:()=>$ZodNumber,$ZodNumberFormat:()=>$ZodNumberFormat,$ZodObject:()=>$ZodObject,$ZodObjectJIT:()=>$ZodObjectJIT,$ZodOptional:()=>$ZodOptional,$ZodPipe:()=>$ZodPipe,$ZodPrefault:()=>$ZodPrefault,$ZodPreprocess:()=>$ZodPreprocess,$ZodPromise:()=>$ZodPromise,$ZodReadonly:()=>$ZodReadonly,$ZodRealError:()=>$ZodRealError,$ZodRecord:()=>$ZodRecord,$ZodRegistry:()=>$ZodRegistry,$ZodSet:()=>$ZodSet,$ZodString:()=>$ZodString,$ZodStringFormat:()=>$ZodStringFormat,$ZodSuccess:()=>$ZodSuccess,$ZodSymbol:()=>$ZodSymbol,$ZodTemplateLiteral:()=>$ZodTemplateLiteral,$ZodTransform:()=>$ZodTransform,$ZodTuple:()=>$ZodTuple,$ZodType:()=>$ZodType,$ZodULID:()=>$ZodULID,$ZodURL:()=>$ZodURL,$ZodUUID:()=>$ZodUUID,$ZodUndefined:()=>$ZodUndefined,$ZodUnion:()=>$ZodUnion,$ZodUnknown:()=>$ZodUnknown,$ZodVoid:()=>$ZodVoid,$ZodXID:()=>$ZodXID,$ZodXor:()=>$ZodXor,$brand:()=>$brand,$constructor:()=>$constructor,$input:()=>$input,$output:()=>$output,Doc:()=>Doc,JSONSchema:()=>json_schema_exports,JSONSchemaGenerator:()=>JSONSchemaGenerator,NEVER:()=>NEVER,TimePrecision:()=>TimePrecision,_any:()=>_any,_array:()=>_array,_base64:()=>_base64,_base64url:()=>_base64url,_bigint:()=>_bigint,_boolean:()=>_boolean,_catch:()=>_catch,_check:()=>_check,_cidrv4:()=>_cidrv4,_cidrv6:()=>_cidrv6,_coercedBigint:()=>_coercedBigint,_coercedBoolean:()=>_coercedBoolean,_coercedDate:()=>_coercedDate,_coercedNumber:()=>_coercedNumber,_coercedString:()=>_coercedString,_cuid:()=>_cuid,_cuid2:()=>_cuid2,_custom:()=>_custom,_date:()=>_date,_decode:()=>_decode,_decodeAsync:()=>_decodeAsync,_default:()=>_default,_discriminatedUnion:()=>_discriminatedUnion,_e164:()=>_e164,_email:()=>_email,_emoji:()=>_emoji2,_encode:()=>_encode,_encodeAsync:()=>_encodeAsync,_endsWith:()=>_endsWith,_enum:()=>_enum,_file:()=>_file,_float32:()=>_float32,_float64:()=>_float64,_gt:()=>_gt,_gte:()=>_gte,_guid:()=>_guid,_includes:()=>_includes,_int:()=>_int,_int32:()=>_int32,_int64:()=>_int64,_intersection:()=>_intersection,_ipv4:()=>_ipv4,_ipv6:()=>_ipv6,_isoDate:()=>_isoDate,_isoDateTime:()=>_isoDateTime,_isoDuration:()=>_isoDuration,_isoTime:()=>_isoTime,_jwt:()=>_jwt,_ksuid:()=>_ksuid,_lazy:()=>_lazy,_length:()=>_length,_literal:()=>_literal,_lowercase:()=>_lowercase,_lt:()=>_lt,_lte:()=>_lte,_mac:()=>_mac,_map:()=>_map,_max:()=>_lte,_maxLength:()=>_maxLength,_maxSize:()=>_maxSize,_mime:()=>_mime,_min:()=>_gte,_minLength:()=>_minLength,_minSize:()=>_minSize,_multipleOf:()=>_multipleOf,_nan:()=>_nan,_nanoid:()=>_nanoid,_nativeEnum:()=>_nativeEnum,_negative:()=>_negative,_never:()=>_never,_nonnegative:()=>_nonnegative,_nonoptional:()=>_nonoptional,_nonpositive:()=>_nonpositive,_normalize:()=>_normalize,_null:()=>_null2,_nullable:()=>_nullable,_number:()=>_number,_optional:()=>_optional,_overwrite:()=>_overwrite,_parse:()=>_parse,_parseAsync:()=>_parseAsync,_pipe:()=>_pipe,_positive:()=>_positive,_promise:()=>_promise,_property:()=>_property,_readonly:()=>_readonly,_record:()=>_record,_refine:()=>_refine,_regex:()=>_regex,_safeDecode:()=>_safeDecode,_safeDecodeAsync:()=>_safeDecodeAsync,_safeEncode:()=>_safeEncode,_safeEncodeAsync:()=>_safeEncodeAsync,_safeParse:()=>_safeParse,_safeParseAsync:()=>_safeParseAsync,_set:()=>_set,_size:()=>_size,_slugify:()=>_slugify,_startsWith:()=>_startsWith,_string:()=>_string,_stringFormat:()=>_stringFormat,_stringbool:()=>_stringbool,_success:()=>_success,_superRefine:()=>_superRefine,_symbol:()=>_symbol,_templateLiteral:()=>_templateLiteral,_toLowerCase:()=>_toLowerCase,_toUpperCase:()=>_toUpperCase,_transform:()=>_transform,_trim:()=>_trim,_tuple:()=>_tuple,_uint32:()=>_uint32,_uint64:()=>_uint64,_ulid:()=>_ulid,_undefined:()=>_undefined2,_union:()=>_union,_unknown:()=>_unknown,_uppercase:()=>_uppercase,_url:()=>_url,_uuid:()=>_uuid,_uuidv4:()=>_uuidv4,_uuidv6:()=>_uuidv6,_uuidv7:()=>_uuidv7,_void:()=>_void,_xid:()=>_xid,_xor:()=>_xor,clone:()=>clone,config:()=>config,createStandardJSONSchemaMethod:()=>createStandardJSONSchemaMethod,createToJSONSchemaMethod:()=>createToJSONSchemaMethod,decode:()=>decode,decodeAsync:()=>decodeAsync,describe:()=>describe,encode:()=>encode,encodeAsync:()=>encodeAsync,extractDefs:()=>extractDefs,finalize:()=>finalize,flattenError:()=>flattenError,formatError:()=>formatError,globalConfig:()=>globalConfig,globalRegistry:()=>globalRegistry,initializeContext:()=>initializeContext,isValidBase64:()=>isValidBase64,isValidBase64URL:()=>isValidBase64URL,isValidJWT:()=>isValidJWT,locales:()=>locales_exports,meta:()=>meta,parse:()=>parse,parseAsync:()=>parseAsync,prettifyError:()=>prettifyError,process:()=>process4,regexes:()=>regexes_exports,registry:()=>registry,safeDecode:()=>safeDecode,safeDecodeAsync:()=>safeDecodeAsync,safeEncode:()=>safeEncode,safeEncodeAsync:()=>safeEncodeAsync,safeParse:()=>safeParse,safeParseAsync:()=>safeParseAsync,toDotPath:()=>toDotPath,toJSONSchema:()=>toJSONSchema,treeifyError:()=>treeifyError,util:()=>util_exports,version:()=>version});var _a;var NEVER=Object.freeze({status:"aborted"});function $constructor(name,initializer3,params){function init(inst,def){if(!inst._zod){Object.defineProperty(inst,"_zod",{value:{def,constr:_,traits:new Set},enumerable:false})}if(inst._zod.traits.has(name)){return}inst._zod.traits.add(name);initializer3(inst,def);const proto=_.prototype;const keys=Object.keys(proto);for(let i=0;i<keys.length;i++){const k=keys[i];if(!(k in inst)){inst[k]=proto[k].bind(inst)}}}const Parent=params?.Parent??Object;class Definition extends Parent{}Object.defineProperty(Definition,"name",{value:name});function _(def){var _a3;const inst=params?.Parent?new Definition:this;init(inst,def);(_a3=inst._zod).deferred??(_a3.deferred=[]);for(const fn of inst._zod.deferred){fn()}return inst}Object.defineProperty(_,"init",{value:init});Object.defineProperty(_,Symbol.hasInstance,{value:inst=>{if(params?.Parent&&inst instanceof params.Parent)return true;return inst?._zod?.traits?.has(name)}});Object.defineProperty(_,"name",{value:name});return _}var $brand=Symbol("zod_brand");var $ZodAsyncError=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}};var $ZodEncodeError=class extends Error{constructor(name){super(`Encountered unidirectional transform during encode: ${name}`);this.name="ZodEncodeError"}};(_a=globalThis).__zod_globalConfig??(_a.__zod_globalConfig={});var globalConfig=globalThis.__zod_globalConfig;function config(newConfig){if(newConfig)Object.assign(globalConfig,newConfig);return globalConfig}var util_exports={};__export(util_exports,{BIGINT_FORMAT_RANGES:()=>BIGINT_FORMAT_RANGES,Class:()=>Class,NUMBER_FORMAT_RANGES:()=>NUMBER_FORMAT_RANGES,aborted:()=>aborted,allowsEval:()=>allowsEval,assert:()=>assert,assertEqual:()=>assertEqual,assertIs:()=>assertIs,assertNever:()=>assertNever,assertNotEqual:()=>assertNotEqual,assignProp:()=>assignProp,base64ToUint8Array:()=>base64ToUint8Array,base64urlToUint8Array:()=>base64urlToUint8Array,cached:()=>cached,captureStackTrace:()=>captureStackTrace,cleanEnum:()=>cleanEnum,cleanRegex:()=>cleanRegex,clone:()=>clone,cloneDef:()=>cloneDef,createTransparentProxy:()=>createTransparentProxy,defineLazy:()=>defineLazy,esc:()=>esc,escapeRegex:()=>escapeRegex,explicitlyAborted:()=>explicitlyAborted,extend:()=>extend,finalizeIssue:()=>finalizeIssue,floatSafeRemainder:()=>floatSafeRemainder,getElementAtPath:()=>getElementAtPath,getEnumValues:()=>getEnumValues,getLengthableOrigin:()=>getLengthableOrigin,getParsedType:()=>getParsedType,getSizableOrigin:()=>getSizableOrigin,hexToUint8Array:()=>hexToUint8Array,isObject:()=>isObject,isPlainObject:()=>isPlainObject2,issue:()=>issue,joinValues:()=>joinValues,jsonStringifyReplacer:()=>jsonStringifyReplacer,merge:()=>merge,mergeDefs:()=>mergeDefs,normalizeParams:()=>normalizeParams,nullish:()=>nullish,numKeys:()=>numKeys,objectClone:()=>objectClone,omit:()=>omit,optionalKeys:()=>optionalKeys,parsedType:()=>parsedType,partial:()=>partial,pick:()=>pick,prefixIssues:()=>prefixIssues,primitiveTypes:()=>primitiveTypes,promiseAllObject:()=>promiseAllObject,propertyKeyTypes:()=>propertyKeyTypes,randomString:()=>randomString,required:()=>required,safeExtend:()=>safeExtend,shallowClone:()=>shallowClone,slugify:()=>slugify,stringifyPrimitive:()=>stringifyPrimitive,uint8ArrayToBase64:()=>uint8ArrayToBase64,uint8ArrayToBase64url:()=>uint8ArrayToBase64url,uint8ArrayToHex:()=>uint8ArrayToHex,unwrapMessage:()=>unwrapMessage});function assertEqual(val){return val}function assertNotEqual(val){return val}function assertIs(_arg){}function assertNever(_x){throw new Error("Unexpected value in exhaustive check")}function assert(_){}function getEnumValues(entries){const numericValues=Object.values(entries).filter(v=>typeof v==="number");const values=Object.entries(entries).filter(([k,_])=>numericValues.indexOf(+k)===-1).map(([_,v])=>v);return values}function joinValues(array2,separator="|"){return array2.map(val=>stringifyPrimitive(val)).join(separator)}function jsonStringifyReplacer(_,value){if(typeof value==="bigint")return value.toString();return value}function cached(getter){const set2=false;return{get value(){if(!set2){const value=getter();Object.defineProperty(this,"value",{value});return value}throw new Error("cached value already set")}}}function nullish(input){return input===null||input===void 0}function cleanRegex(source){const start=source.startsWith("^")?1:0;const end=source.endsWith("$")?source.length-1:source.length;return source.slice(start,end)}function floatSafeRemainder(val,step){const ratio=val/step;const roundedRatio=Math.round(ratio);const tolerance=Number.EPSILON*Math.max(Math.abs(ratio),1);if(Math.abs(ratio-roundedRatio)<tolerance)return 0;return ratio-roundedRatio}var EVALUATING=Symbol("evaluating");function defineLazy(object2,key,getter){let value=void 0;Object.defineProperty(object2,key,{get(){if(value===EVALUATING){return void 0}if(value===void 0){value=EVALUATING;value=getter()}return value},set(v){Object.defineProperty(object2,key,{value:v})},configurable:true})}function objectClone(obj){return Object.create(Object.getPrototypeOf(obj),Object.getOwnPropertyDescriptors(obj))}function assignProp(target,prop,value){Object.defineProperty(target,prop,{value,writable:true,enumerable:true,configurable:true})}function mergeDefs(...defs){const mergedDescriptors={};for(const def of defs){const descriptors=Object.getOwnPropertyDescriptors(def);Object.assign(mergedDescriptors,descriptors)}return Object.defineProperties({},mergedDescriptors)}function cloneDef(schema){return mergeDefs(schema._zod.def)}function getElementAtPath(obj,path16){if(!path16)return obj;return path16.reduce((acc,key)=>acc?.[key],obj)}function promiseAllObject(promisesObj){const keys=Object.keys(promisesObj);const promises=keys.map(key=>promisesObj[key]);return Promise.all(promises).then(results=>{const resolvedObj={};for(let i=0;i<keys.length;i++){resolvedObj[keys[i]]=results[i]}return resolvedObj})}function randomString(length=10){const chars="abcdefghijklmnopqrstuvwxyz";let str="";for(let i=0;i<length;i++){str+=chars[Math.floor(Math.random()*chars.length)]}return str}function esc(str){return JSON.stringify(str)}function slugify(input){return input.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}var captureStackTrace="captureStackTrace"in Error?Error.captureStackTrace:(..._args)=>{};function isObject(data){return typeof data==="object"&&data!==null&&!Array.isArray(data)}var allowsEval=cached(()=>{if(globalConfig.jitless){return false}if(typeof navigator!=="undefined"&&navigator?.userAgent?.includes("Cloudflare")){return false}try{const F=Function;new F("");return true}catch(_){return false}});function isPlainObject2(o){if(isObject(o)===false)return false;const ctor=o.constructor;if(ctor===void 0)return true;if(typeof ctor!=="function")return true;const prot=ctor.prototype;if(isObject(prot)===false)return false;if(Object.prototype.hasOwnProperty.call(prot,"isPrototypeOf")===false){return false}return true}function shallowClone(o){if(isPlainObject2(o))return{...o};if(Array.isArray(o))return[...o];if(o instanceof Map)return new Map(o);if(o instanceof Set)return new Set(o);return o}function numKeys(data){let keyCount=0;for(const key in data){if(Object.prototype.hasOwnProperty.call(data,key)){keyCount++}}return keyCount}var getParsedType=data=>{const t=typeof data;switch(t){case"undefined":return"undefined";case"string":return"string";case"number":return Number.isNaN(data)?"nan":"number";case"boolean":return"boolean";case"function":return"function";case"bigint":return"bigint";case"symbol":return"symbol";case"object":if(Array.isArray(data)){return"array"}if(data===null){return"null"}if(data.then&&typeof data.then==="function"&&data.catch&&typeof data.catch==="function"){return"promise"}if(typeof Map!=="undefined"&&data instanceof Map){return"map"}if(typeof Set!=="undefined"&&data instanceof Set){return"set"}if(typeof Date!=="undefined"&&data instanceof Date){return"date"}if(typeof File!=="undefined"&&data instanceof File){return"file"}return"object";default:throw new Error(`Unknown data type: ${t}`)}};var propertyKeyTypes=new Set(["string","number","symbol"]);var primitiveTypes=new Set(["string","number","bigint","boolean","symbol","undefined"]);function escapeRegex(str){return str.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function clone(inst,def,params){const cl=new inst._zod.constr(def??inst._zod.def);if(!def||params?.parent)cl._zod.parent=inst;return cl}function normalizeParams(_params){const params=_params;if(!params)return{};if(typeof params==="string")return{error:()=>params};if(params?.message!==void 0){if(params?.error!==void 0)throw new Error("Cannot specify both `message` and `error` params");params.error=params.message}delete params.message;if(typeof params.error==="string")return{...params,error:()=>params.error};return params}function createTransparentProxy(getter){let target;return new Proxy({},{get(_,prop,receiver){target??(target=getter());return Reflect.get(target,prop,receiver)},set(_,prop,value,receiver){target??(target=getter());return Reflect.set(target,prop,value,receiver)},has(_,prop){target??(target=getter());return Reflect.has(target,prop)},deleteProperty(_,prop){target??(target=getter());return Reflect.deleteProperty(target,prop)},ownKeys(_){target??(target=getter());return Reflect.ownKeys(target)},getOwnPropertyDescriptor(_,prop){target??(target=getter());return Reflect.getOwnPropertyDescriptor(target,prop)},defineProperty(_,prop,descriptor){target??(target=getter());return Reflect.defineProperty(target,prop,descriptor)}})}function stringifyPrimitive(value){if(typeof value==="bigint")return value.toString()+"n";if(typeof value==="string")return`"${value}"`;return`${value}`}function optionalKeys(shape){return Object.keys(shape).filter(k=>{return shape[k]._zod.optin==="optional"&&shape[k]._zod.optout==="optional"})}var NUMBER_FORMAT_RANGES={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};var BIGINT_FORMAT_RANGES={int64:[BigInt("-9223372036854775808"),BigInt("9223372036854775807")],uint64:[BigInt(0),BigInt("18446744073709551615")]};function pick(schema,mask){const currDef=schema._zod.def;const checks=currDef.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){throw new Error(".pick() cannot be used on object schemas containing refinements")}const def=mergeDefs(schema._zod.def,{get shape(){const newShape={};for(const key in mask){if(!(key in currDef.shape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;newShape[key]=currDef.shape[key]}assignProp(this,"shape",newShape);return newShape},checks:[]});return clone(schema,def)}function omit(schema,mask){const currDef=schema._zod.def;const checks=currDef.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){throw new Error(".omit() cannot be used on object schemas containing refinements")}const def=mergeDefs(schema._zod.def,{get shape(){const newShape={...schema._zod.def.shape};for(const key in mask){if(!(key in currDef.shape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;delete newShape[key]}assignProp(this,"shape",newShape);return newShape},checks:[]});return clone(schema,def)}function extend(schema,shape){if(!isPlainObject2(shape)){throw new Error("Invalid input to extend: expected a plain object")}const checks=schema._zod.def.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){const existingShape=schema._zod.def.shape;for(const key in shape){if(Object.getOwnPropertyDescriptor(existingShape,key)!==void 0){throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}}}const def=mergeDefs(schema._zod.def,{get shape(){const _shape={...schema._zod.def.shape,...shape};assignProp(this,"shape",_shape);return _shape}});return clone(schema,def)}function safeExtend(schema,shape){if(!isPlainObject2(shape)){throw new Error("Invalid input to safeExtend: expected a plain object")}const def=mergeDefs(schema._zod.def,{get shape(){const _shape={...schema._zod.def.shape,...shape};assignProp(this,"shape",_shape);return _shape}});return clone(schema,def)}function merge(a,b){if(a._zod.def.checks?.length){throw new Error(".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.")}const def=mergeDefs(a._zod.def,{get shape(){const _shape={...a._zod.def.shape,...b._zod.def.shape};assignProp(this,"shape",_shape);return _shape},get catchall(){return b._zod.def.catchall},checks:b._zod.def.checks??[]});return clone(a,def)}function partial(Class2,schema,mask){const currDef=schema._zod.def;const checks=currDef.checks;const hasChecks=checks&&checks.length>0;if(hasChecks){throw new Error(".partial() cannot be used on object schemas containing refinements")}const def=mergeDefs(schema._zod.def,{get shape(){const oldShape=schema._zod.def.shape;const shape={...oldShape};if(mask){for(const key in mask){if(!(key in oldShape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key]}}else{for(const key in oldShape){shape[key]=Class2?new Class2({type:"optional",innerType:oldShape[key]}):oldShape[key]}}assignProp(this,"shape",shape);return shape},checks:[]});return clone(schema,def)}function required(Class2,schema,mask){const def=mergeDefs(schema._zod.def,{get shape(){const oldShape=schema._zod.def.shape;const shape={...oldShape};if(mask){for(const key in mask){if(!(key in shape)){throw new Error(`Unrecognized key: "${key}"`)}if(!mask[key])continue;shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]})}}else{for(const key in oldShape){shape[key]=new Class2({type:"nonoptional",innerType:oldShape[key]})}}assignProp(this,"shape",shape);return shape}});return clone(schema,def)}function aborted(x,startIndex=0){if(x.aborted===true)return true;for(let i=startIndex;i<x.issues.length;i++){if(x.issues[i]?.continue!==true){return true}}return false}function explicitlyAborted(x,startIndex=0){if(x.aborted===true)return true;for(let i=startIndex;i<x.issues.length;i++){if(x.issues[i]?.continue===false){return true}}return false}function prefixIssues(path16,issues){return issues.map(iss=>{var _a3;(_a3=iss).path??(_a3.path=[]);iss.path.unshift(path16);return iss})}function unwrapMessage(message){return typeof message==="string"?message:message?.message}function finalizeIssue(iss,ctx,config2){const message=iss.message?iss.message:unwrapMessage(iss.inst?._zod.def?.error?.(iss))??unwrapMessage(ctx?.error?.(iss))??unwrapMessage(config2.customError?.(iss))??unwrapMessage(config2.localeError?.(iss))??"Invalid input";const{inst:_inst,continue:_continue,input:_input,...rest}=iss;rest.path??(rest.path=[]);rest.message=message;if(ctx?.reportInput){rest.input=_input}return rest}function getSizableOrigin(input){if(input instanceof Set)return"set";if(input instanceof Map)return"map";if(input instanceof File)return"file";return"unknown"}function getLengthableOrigin(input){if(Array.isArray(input))return"array";if(typeof input==="string")return"string";return"unknown"}function parsedType(data){const t=typeof data;switch(t){case"number":{return Number.isNaN(data)?"nan":"number"}case"object":{if(data===null){return"null"}if(Array.isArray(data)){return"array"}const obj=data;if(obj&&Object.getPrototypeOf(obj)!==Object.prototype&&"constructor"in obj&&obj.constructor){return obj.constructor.name}}}return t}function issue(...args){const[iss,input,inst]=args;if(typeof iss==="string"){return{message:iss,code:"custom",input,inst}}return{...iss}}function cleanEnum(obj){return Object.entries(obj).filter(([k,_])=>{return Number.isNaN(Number.parseInt(k,10))}).map(el=>el[1])}function base64ToUint8Array(base643){const binaryString=atob(base643);const bytes=new Uint8Array(binaryString.length);for(let i=0;i<binaryString.length;i++){bytes[i]=binaryString.charCodeAt(i)}return bytes}function uint8ArrayToBase64(bytes){let binaryString="";for(let i=0;i<bytes.length;i++){binaryString+=String.fromCharCode(bytes[i])}return btoa(binaryString)}function base64urlToUint8Array(base64url3){const base643=base64url3.replace(/-/g,"+").replace(/_/g,"/");const padding="=".repeat((4-base643.length%4)%4);return base64ToUint8Array(base643+padding)}function uint8ArrayToBase64url(bytes){return uint8ArrayToBase64(bytes).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function hexToUint8Array(hex3){const cleanHex=hex3.replace(/^0x/,"");if(cleanHex.length%2!==0){throw new Error("Invalid hex string length")}const bytes=new Uint8Array(cleanHex.length/2);for(let i=0;i<cleanHex.length;i+=2){bytes[i/2]=Number.parseInt(cleanHex.slice(i,i+2),16)}return bytes}function uint8ArrayToHex(bytes){return Array.from(bytes).map(b=>b.toString(16).padStart(2,"0")).join("")}var Class=class{constructor(..._args){}};var initializer=(inst,def)=>{inst.name="$ZodError";Object.defineProperty(inst,"_zod",{value:inst._zod,enumerable:false});Object.defineProperty(inst,"issues",{value:def,enumerable:false});inst.message=JSON.stringify(def,jsonStringifyReplacer,2);Object.defineProperty(inst,"toString",{value:()=>inst.message,enumerable:false})};var $ZodError=$constructor("$ZodError",initializer);var $ZodRealError=$constructor("$ZodError",initializer,{Parent:Error});function flattenError(error51,mapper=issue2=>issue2.message){const fieldErrors={};const formErrors=[];for(const sub of error51.issues){if(sub.path.length>0){fieldErrors[sub.path[0]]=fieldErrors[sub.path[0]]||[];fieldErrors[sub.path[0]].push(mapper(sub))}else{formErrors.push(mapper(sub))}}return{formErrors,fieldErrors}}function formatError(error51,mapper=issue2=>issue2.message){const fieldErrors={_errors:[]};const processError=(error52,path16=[])=>{for(const issue2 of error52.issues){if(issue2.code==="invalid_union"&&issue2.errors.length){issue2.errors.map(issues=>processError({issues},[...path16,...issue2.path]))}else if(issue2.code==="invalid_key"){processError({issues:issue2.issues},[...path16,...issue2.path])}else if(issue2.code==="invalid_element"){processError({issues:issue2.issues},[...path16,...issue2.path])}else{const fullpath=[...path16,...issue2.path];if(fullpath.length===0){fieldErrors._errors.push(mapper(issue2))}else{let curr=fieldErrors;let i=0;while(i<fullpath.length){const el=fullpath[i];const terminal=i===fullpath.length-1;if(!terminal){curr[el]=curr[el]||{_errors:[]}}else{curr[el]=curr[el]||{_errors:[]};curr[el]._errors.push(mapper(issue2))}curr=curr[el];i++}}}}};processError(error51);return fieldErrors}function treeifyError(error51,mapper=issue2=>issue2.message){const result={errors:[]};const processError=(error52,path16=[])=>{var _a3,_b;for(const issue2 of error52.issues){if(issue2.code==="invalid_union"&&issue2.errors.length){issue2.errors.map(issues=>processError({issues},[...path16,...issue2.path]))}else if(issue2.code==="invalid_key"){processError({issues:issue2.issues},[...path16,...issue2.path])}else if(issue2.code==="invalid_element"){processError({issues:issue2.issues},[...path16,...issue2.path])}else{const fullpath=[...path16,...issue2.path];if(fullpath.length===0){result.errors.push(mapper(issue2));continue}let curr=result;let i=0;while(i<fullpath.length){const el=fullpath[i];const terminal=i===fullpath.length-1;if(typeof el==="string"){curr.properties??(curr.properties={});(_a3=curr.properties)[el]??(_a3[el]={errors:[]});curr=curr.properties[el]}else{curr.items??(curr.items=[]);(_b=curr.items)[el]??(_b[el]={errors:[]});curr=curr.items[el]}if(terminal){curr.errors.push(mapper(issue2))}i++}}}};processError(error51);return result}function toDotPath(_path){const segs=[];const path16=_path.map(seg=>typeof seg==="object"?seg.key:seg);for(const seg of path16){if(typeof seg==="number")segs.push(`[${seg}]`);else if(typeof seg==="symbol")segs.push(`[${JSON.stringify(String(seg))}]`);else if(/[^\w$]/.test(seg))segs.push(`[${JSON.stringify(seg)}]`);else{if(segs.length)segs.push(".");segs.push(seg)}}return segs.join("")}function prettifyError(error51){const lines=[];const issues=[...error51.issues].sort((a,b)=>(a.path??[]).length-(b.path??[]).length);for(const issue2 of issues){lines.push(`\u2716 ${issue2.message}`);if(issue2.path?.length)lines.push(` \u2192 at ${toDotPath(issue2.path)}`)}return lines.join("\n")}var _parse=_Err=>(schema,value,_ctx,_params)=>{const ctx=_ctx?{..._ctx,async:false}:{async:false};const result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise){throw new $ZodAsyncError}if(result.issues.length){const e=new(_params?.Err??_Err)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())));captureStackTrace(e,_params?.callee);throw e}return result.value};var parse=_parse($ZodRealError);var _parseAsync=_Err=>async(schema,value,_ctx,params)=>{const ctx=_ctx?{..._ctx,async:true}:{async:true};let result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise)result=await result;if(result.issues.length){const e=new(params?.Err??_Err)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())));captureStackTrace(e,params?.callee);throw e}return result.value};var parseAsync=_parseAsync($ZodRealError);var _safeParse=_Err=>(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,async:false}:{async:false};const result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise){throw new $ZodAsyncError}return result.issues.length?{success:false,error:new(_Err??$ZodError)(result.issues.map(iss=>finalizeIssue(iss,ctx,config())))}:{success:true,data:result.value}};var safeParse=_safeParse($ZodRealError);var _safeParseAsync=_Err=>async(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,async:true}:{async:true};let result=schema._zod.run({value,issues:[]},ctx);if(result instanceof Promise)result=await result;return result.issues.length?{success:false,error:new _Err(result.issues.map(iss=>finalizeIssue(iss,ctx,config())))}:{success:true,data:result.value}};var safeParseAsync=_safeParseAsync($ZodRealError);var _encode=_Err=>(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _parse(_Err)(schema,value,ctx)};var encode=_encode($ZodRealError);var _decode=_Err=>(schema,value,_ctx)=>{return _parse(_Err)(schema,value,_ctx)};var decode=_decode($ZodRealError);var _encodeAsync=_Err=>async(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _parseAsync(_Err)(schema,value,ctx)};var encodeAsync=_encodeAsync($ZodRealError);var _decodeAsync=_Err=>async(schema,value,_ctx)=>{return _parseAsync(_Err)(schema,value,_ctx)};var decodeAsync=_decodeAsync($ZodRealError);var _safeEncode=_Err=>(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _safeParse(_Err)(schema,value,ctx)};var safeEncode=_safeEncode($ZodRealError);var _safeDecode=_Err=>(schema,value,_ctx)=>{return _safeParse(_Err)(schema,value,_ctx)};var safeDecode=_safeDecode($ZodRealError);var _safeEncodeAsync=_Err=>async(schema,value,_ctx)=>{const ctx=_ctx?{..._ctx,direction:"backward"}:{direction:"backward"};return _safeParseAsync(_Err)(schema,value,ctx)};var safeEncodeAsync=_safeEncodeAsync($ZodRealError);var _safeDecodeAsync=_Err=>async(schema,value,_ctx)=>{return _safeParseAsync(_Err)(schema,value,_ctx)};var safeDecodeAsync=_safeDecodeAsync($ZodRealError);var regexes_exports={};__export(regexes_exports,{base64:()=>base64,base64url:()=>base64url,bigint:()=>bigint,boolean:()=>boolean,browserEmail:()=>browserEmail,cidrv4:()=>cidrv4,cidrv6:()=>cidrv6,cuid:()=>cuid,cuid2:()=>cuid2,date:()=>date,datetime:()=>datetime,domain:()=>domain,duration:()=>duration,e164:()=>e164,email:()=>email,emoji:()=>emoji,extendedDuration:()=>extendedDuration,guid:()=>guid,hex:()=>hex,hostname:()=>hostname,html5Email:()=>html5Email,httpProtocol:()=>httpProtocol,idnEmail:()=>idnEmail,integer:()=>integer,ipv4:()=>ipv4,ipv6:()=>ipv6,ksuid:()=>ksuid,lowercase:()=>lowercase,mac:()=>mac,md5_base64:()=>md5_base64,md5_base64url:()=>md5_base64url,md5_hex:()=>md5_hex,nanoid:()=>nanoid,null:()=>_null,number:()=>number,rfc5322Email:()=>rfc5322Email,sha1_base64:()=>sha1_base64,sha1_base64url:()=>sha1_base64url,sha1_hex:()=>sha1_hex,sha256_base64:()=>sha256_base64,sha256_base64url:()=>sha256_base64url,sha256_hex:()=>sha256_hex,sha384_base64:()=>sha384_base64,sha384_base64url:()=>sha384_base64url,sha384_hex:()=>sha384_hex,sha512_base64:()=>sha512_base64,sha512_base64url:()=>sha512_base64url,sha512_hex:()=>sha512_hex,string:()=>string,time:()=>time,ulid:()=>ulid,undefined:()=>_undefined,unicodeEmail:()=>unicodeEmail,uppercase:()=>uppercase,uuid:()=>uuid,uuid4:()=>uuid4,uuid6:()=>uuid6,uuid7:()=>uuid7,xid:()=>xid});var cuid=/^[cC][0-9a-z]{6,}$/;var cuid2=/^[0-9a-z]+$/;var ulid=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;var xid=/^[0-9a-vA-V]{20}$/;var ksuid=/^[A-Za-z0-9]{27}$/;var nanoid=/^[a-zA-Z0-9_-]{21}$/;var duration=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/;var extendedDuration=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/;var guid=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;var uuid=version2=>{if(!version2)return/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version2}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`)};var uuid4=uuid(4);var uuid6=uuid(6);var uuid7=uuid(7);var email=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;var html5Email=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;var rfc5322Email=/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;var unicodeEmail=/^[^\s@"]{1,64}@[^\s@]{1,255}$/u;var idnEmail=unicodeEmail;var browserEmail=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;var _emoji=`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`;function emoji(){return new RegExp(_emoji,"u")}var ipv4=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;var ipv6=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;var mac=delimiter=>{const escapedDelim=escapeRegex(delimiter??":");return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`)};var cidrv4=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/;var cidrv6=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;var base64=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;var base64url=/^[A-Za-z0-9_-]*$/;var hostname=/^(?=.{1,253}\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\.?$/;var domain=/^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;var httpProtocol=/^https?$/;var e164=/^\+[1-9]\d{6,14}$/;var dateSource=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`;var date=new RegExp(`^${dateSource}$`);function timeSource(args){const hhmm=`(?:[01]\\d|2[0-3]):[0-5]\\d`;const regex=typeof args.precision==="number"?args.precision===-1?`${hhmm}`:args.precision===0?`${hhmm}:[0-5]\\d`:`${hhmm}:[0-5]\\d\\.\\d{${args.precision}}`:`${hhmm}(?::[0-5]\\d(?:\\.\\d+)?)?`;return regex}function time(args){return new RegExp(`^${timeSource(args)}$`)}function datetime(args){const time3=timeSource({precision:args.precision});const opts=["Z"];if(args.local)opts.push("");if(args.offset)opts.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);const timeRegex=`${time3}(?:${opts.join("|")})`;return new RegExp(`^${dateSource}T(?:${timeRegex})$`)}var string=params=>{const regex=params?`[\\s\\S]{${params?.minimum??0},${params?.maximum??""}}`:`[\\s\\S]*`;return new RegExp(`^${regex}$`)};var bigint=/^-?\d+n?$/;var integer=/^-?\d+$/;var number=/^-?\d+(?:\.\d+)?$/;var boolean=/^(?:true|false)$/i;var _null=/^null$/i;var _undefined=/^undefined$/i;var lowercase=/^[^A-Z]*$/;var uppercase=/^[^a-z]*$/;var hex=/^[0-9a-fA-F]*$/;function fixedBase64(bodyLength,padding){return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`)}function fixedBase64url(length){return new RegExp(`^[A-Za-z0-9_-]{${length}}$`)}var md5_hex=/^[0-9a-fA-F]{32}$/;var md5_base64=fixedBase64(22,"==");var md5_base64url=fixedBase64url(22);var sha1_hex=/^[0-9a-fA-F]{40}$/;var sha1_base64=fixedBase64(27,"=");var sha1_base64url=fixedBase64url(27);var sha256_hex=/^[0-9a-fA-F]{64}$/;var sha256_base64=fixedBase64(43,"=");var sha256_base64url=fixedBase64url(43);var sha384_hex=/^[0-9a-fA-F]{96}$/;var sha384_base64=fixedBase64(64,"");var sha384_base64url=fixedBase64url(64);var sha512_hex=/^[0-9a-fA-F]{128}$/;var sha512_base64=fixedBase64(86,"==");var sha512_base64url=fixedBase64url(86);var $ZodCheck=$constructor("$ZodCheck",(inst,def)=>{var _a3;inst._zod??(inst._zod={});inst._zod.def=def;(_a3=inst._zod).onattach??(_a3.onattach=[])});var numericOriginMap={number:"number",bigint:"bigint",object:"date"};var $ZodCheckLessThan=$constructor("$ZodCheckLessThan",(inst,def)=>{$ZodCheck.init(inst,def);const origin=numericOriginMap[typeof def.value];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;const curr=(def.inclusive?bag.maximum:bag.exclusiveMaximum)??Number.POSITIVE_INFINITY;if(def.value<curr){if(def.inclusive)bag.maximum=def.value;else bag.exclusiveMaximum=def.value}});inst._zod.check=payload=>{if(def.inclusive?payload.value<=def.value:payload.value<def.value){return}payload.issues.push({origin,code:"too_big",maximum:typeof def.value==="object"?def.value.getTime():def.value,input:payload.value,inclusive:def.inclusive,inst,continue:!def.abort})}});var $ZodCheckGreaterThan=$constructor("$ZodCheckGreaterThan",(inst,def)=>{$ZodCheck.init(inst,def);const origin=numericOriginMap[typeof def.value];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;const curr=(def.inclusive?bag.minimum:bag.exclusiveMinimum)??Number.NEGATIVE_INFINITY;if(def.value>curr){if(def.inclusive)bag.minimum=def.value;else bag.exclusiveMinimum=def.value}});inst._zod.check=payload=>{if(def.inclusive?payload.value>=def.value:payload.value>def.value){return}payload.issues.push({origin,code:"too_small",minimum:typeof def.value==="object"?def.value.getTime():def.value,input:payload.value,inclusive:def.inclusive,inst,continue:!def.abort})}});var $ZodCheckMultipleOf=$constructor("$ZodCheckMultipleOf",(inst,def)=>{$ZodCheck.init(inst,def);inst._zod.onattach.push(inst2=>{var _a3;(_a3=inst2._zod.bag).multipleOf??(_a3.multipleOf=def.value)});inst._zod.check=payload=>{if(typeof payload.value!==typeof def.value)throw new Error("Cannot mix number and bigint in multiple_of check.");const isMultiple=typeof payload.value==="bigint"?payload.value%def.value===BigInt(0):floatSafeRemainder(payload.value,def.value)===0;if(isMultiple)return;payload.issues.push({origin:typeof payload.value,code:"not_multiple_of",divisor:def.value,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckNumberFormat=$constructor("$ZodCheckNumberFormat",(inst,def)=>{$ZodCheck.init(inst,def);def.format=def.format||"float64";const isInt=def.format?.includes("int");const origin=isInt?"int":"number";const[minimum,maximum]=NUMBER_FORMAT_RANGES[def.format];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.format=def.format;bag.minimum=minimum;bag.maximum=maximum;if(isInt)bag.pattern=integer});inst._zod.check=payload=>{const input=payload.value;if(isInt){if(!Number.isInteger(input)){payload.issues.push({expected:origin,format:def.format,code:"invalid_type",continue:false,input,inst});return}if(!Number.isSafeInteger(input)){if(input>0){payload.issues.push({input,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst,origin,inclusive:true,continue:!def.abort})}else{payload.issues.push({input,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst,origin,inclusive:true,continue:!def.abort})}return}}if(input<minimum){payload.issues.push({origin:"number",input,code:"too_small",minimum,inclusive:true,inst,continue:!def.abort})}if(input>maximum){payload.issues.push({origin:"number",input,code:"too_big",maximum,inclusive:true,inst,continue:!def.abort})}}});var $ZodCheckBigIntFormat=$constructor("$ZodCheckBigIntFormat",(inst,def)=>{$ZodCheck.init(inst,def);const[minimum,maximum]=BIGINT_FORMAT_RANGES[def.format];inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.format=def.format;bag.minimum=minimum;bag.maximum=maximum});inst._zod.check=payload=>{const input=payload.value;if(input<minimum){payload.issues.push({origin:"bigint",input,code:"too_small",minimum,inclusive:true,inst,continue:!def.abort})}if(input>maximum){payload.issues.push({origin:"bigint",input,code:"too_big",maximum,inclusive:true,inst,continue:!def.abort})}}});var $ZodCheckMaxSize=$constructor("$ZodCheckMaxSize",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.size!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.maximum??Number.POSITIVE_INFINITY;if(def.maximum<curr)inst2._zod.bag.maximum=def.maximum});inst._zod.check=payload=>{const input=payload.value;const size=input.size;if(size<=def.maximum)return;payload.issues.push({origin:getSizableOrigin(input),code:"too_big",maximum:def.maximum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckMinSize=$constructor("$ZodCheckMinSize",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.size!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.minimum??Number.NEGATIVE_INFINITY;if(def.minimum>curr)inst2._zod.bag.minimum=def.minimum});inst._zod.check=payload=>{const input=payload.value;const size=input.size;if(size>=def.minimum)return;payload.issues.push({origin:getSizableOrigin(input),code:"too_small",minimum:def.minimum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckSizeEquals=$constructor("$ZodCheckSizeEquals",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.size!==void 0});inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.minimum=def.size;bag.maximum=def.size;bag.size=def.size});inst._zod.check=payload=>{const input=payload.value;const size=input.size;if(size===def.size)return;const tooBig=size>def.size;payload.issues.push({origin:getSizableOrigin(input),...tooBig?{code:"too_big",maximum:def.size}:{code:"too_small",minimum:def.size},inclusive:true,exact:true,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckMaxLength=$constructor("$ZodCheckMaxLength",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.length!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.maximum??Number.POSITIVE_INFINITY;if(def.maximum<curr)inst2._zod.bag.maximum=def.maximum});inst._zod.check=payload=>{const input=payload.value;const length=input.length;if(length<=def.maximum)return;const origin=getLengthableOrigin(input);payload.issues.push({origin,code:"too_big",maximum:def.maximum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckMinLength=$constructor("$ZodCheckMinLength",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.length!==void 0});inst._zod.onattach.push(inst2=>{const curr=inst2._zod.bag.minimum??Number.NEGATIVE_INFINITY;if(def.minimum>curr)inst2._zod.bag.minimum=def.minimum});inst._zod.check=payload=>{const input=payload.value;const length=input.length;if(length>=def.minimum)return;const origin=getLengthableOrigin(input);payload.issues.push({origin,code:"too_small",minimum:def.minimum,inclusive:true,input,inst,continue:!def.abort})}});var $ZodCheckLengthEquals=$constructor("$ZodCheckLengthEquals",(inst,def)=>{var _a3;$ZodCheck.init(inst,def);(_a3=inst._zod.def).when??(_a3.when=payload=>{const val=payload.value;return!nullish(val)&&val.length!==void 0});inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.minimum=def.length;bag.maximum=def.length;bag.length=def.length});inst._zod.check=payload=>{const input=payload.value;const length=input.length;if(length===def.length)return;const origin=getLengthableOrigin(input);const tooBig=length>def.length;payload.issues.push({origin,...tooBig?{code:"too_big",maximum:def.length}:{code:"too_small",minimum:def.length},inclusive:true,exact:true,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckStringFormat=$constructor("$ZodCheckStringFormat",(inst,def)=>{var _a3,_b;$ZodCheck.init(inst,def);inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.format=def.format;if(def.pattern){bag.patterns??(bag.patterns=new Set);bag.patterns.add(def.pattern)}});if(def.pattern)(_a3=inst._zod).check??(_a3.check=payload=>{def.pattern.lastIndex=0;if(def.pattern.test(payload.value))return;payload.issues.push({origin:"string",code:"invalid_format",format:def.format,input:payload.value,...def.pattern?{pattern:def.pattern.toString()}:{},inst,continue:!def.abort})});else(_b=inst._zod).check??(_b.check=()=>{})});var $ZodCheckRegex=$constructor("$ZodCheckRegex",(inst,def)=>{$ZodCheckStringFormat.init(inst,def);inst._zod.check=payload=>{def.pattern.lastIndex=0;if(def.pattern.test(payload.value))return;payload.issues.push({origin:"string",code:"invalid_format",format:"regex",input:payload.value,pattern:def.pattern.toString(),inst,continue:!def.abort})}});var $ZodCheckLowerCase=$constructor("$ZodCheckLowerCase",(inst,def)=>{def.pattern??(def.pattern=lowercase);$ZodCheckStringFormat.init(inst,def)});var $ZodCheckUpperCase=$constructor("$ZodCheckUpperCase",(inst,def)=>{def.pattern??(def.pattern=uppercase);$ZodCheckStringFormat.init(inst,def)});var $ZodCheckIncludes=$constructor("$ZodCheckIncludes",(inst,def)=>{$ZodCheck.init(inst,def);const escapedRegex=escapeRegex(def.includes);const pattern=new RegExp(typeof def.position==="number"?`^.{${def.position}}${escapedRegex}`:escapedRegex);def.pattern=pattern;inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set);bag.patterns.add(pattern)});inst._zod.check=payload=>{if(payload.value.includes(def.includes,def.position))return;payload.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:def.includes,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckStartsWith=$constructor("$ZodCheckStartsWith",(inst,def)=>{$ZodCheck.init(inst,def);const pattern=new RegExp(`^${escapeRegex(def.prefix)}.*`);def.pattern??(def.pattern=pattern);inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set);bag.patterns.add(pattern)});inst._zod.check=payload=>{if(payload.value.startsWith(def.prefix))return;payload.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:def.prefix,input:payload.value,inst,continue:!def.abort})}});var $ZodCheckEndsWith=$constructor("$ZodCheckEndsWith",(inst,def)=>{$ZodCheck.init(inst,def);const pattern=new RegExp(`.*${escapeRegex(def.suffix)}$`);def.pattern??(def.pattern=pattern);inst._zod.onattach.push(inst2=>{const bag=inst2._zod.bag;bag.patterns??(bag.patterns=new Set);bag.patterns.add(pattern)});inst._zod.check=payload=>{if(payload.value.endsWith(def.suffix))return;payload.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:def.suffix,input:payload.value,inst,continue:!def.abort})}});function handleCheckPropertyResult(result,payload,property){if(result.issues.length){payload.issues.push(...prefixIssues(property,result.issues))}}var $ZodCheckProperty=$constructor("$ZodCheckProperty",(inst,def)=>{$ZodCheck.init(inst,def);inst._zod.check=payload=>{const result=def.schema._zod.run({value:payload.value[def.property],issues:[]},{});if(result instanceof Promise){return result.then(result2=>handleCheckPropertyResult(result2,payload,def.property))}handleCheckPropertyResult(result,payload,def.property);return}});var $ZodCheckMimeType=$constructor("$ZodCheckMimeType",(inst,def)=>{$ZodCheck.init(inst,def);const mimeSet=new Set(def.mime);inst._zod.onattach.push(inst2=>{inst2._zod.bag.mime=def.mime});inst._zod.check=payload=>{if(mimeSet.has(payload.value.type))return;payload.issues.push({code:"invalid_value",values:def.mime,input:payload.value.type,inst,continue:!def.abort})}});var $ZodCheckOverwrite=$constructor("$ZodCheckOverwrite",(inst,def)=>{$ZodCheck.init(inst,def);inst._zod.check=payload=>{payload.value=def.tx(payload.value)}});var Doc=class{constructor(args=[]){this.content=[];this.indent=0;if(this)this.args=args}indented(fn){this.indent+=1;fn(this);this.indent-=1}write(arg){if(typeof arg==="function"){arg(this,{execution:"sync"});arg(this,{execution:"async"});return}const content=arg;const lines=content.split("\n").filter(x=>x);const minIndent=Math.min(...lines.map(x=>x.length-x.trimStart().length));const dedented=lines.map(x=>x.slice(minIndent)).map(x=>" ".repeat(this.indent*2)+x);for(const line of dedented){this.content.push(line)}}compile(){const F=Function;const args=this?.args;const content=this?.content??[``];const lines=[...content.map(x=>` ${x}`)];return new F(...args,lines.join("\n"))}};var version={major:4,minor:4,patch:3};var $ZodType=$constructor("$ZodType",(inst,def)=>{var _a3;inst??(inst={});inst._zod.def=def;inst._zod.bag=inst._zod.bag||{};inst._zod.version=version;const checks=[...inst._zod.def.checks??[]];if(inst._zod.traits.has("$ZodCheck")){checks.unshift(inst)}for(const ch of checks){for(const fn of ch._zod.onattach){fn(inst)}}if(checks.length===0){(_a3=inst._zod).deferred??(_a3.deferred=[]);inst._zod.deferred?.push(()=>{inst._zod.run=inst._zod.parse})}else{const runChecks=(payload,checks2,ctx)=>{let isAborted=aborted(payload);let asyncResult;for(const ch of checks2){if(ch._zod.def.when){if(explicitlyAborted(payload))continue;const shouldRun=ch._zod.def.when(payload);if(!shouldRun)continue}else if(isAborted){continue}const currLen=payload.issues.length;const _=ch._zod.check(payload);if(_ instanceof Promise&&ctx?.async===false){throw new $ZodAsyncError}if(asyncResult||_ instanceof Promise){asyncResult=(asyncResult??Promise.resolve()).then(async()=>{await _;const nextLen=payload.issues.length;if(nextLen===currLen)return;if(!isAborted)isAborted=aborted(payload,currLen)})}else{const nextLen=payload.issues.length;if(nextLen===currLen)continue;if(!isAborted)isAborted=aborted(payload,currLen)}}if(asyncResult){return asyncResult.then(()=>{return payload})}return payload};const handleCanaryResult=(canary,payload,ctx)=>{if(aborted(canary)){canary.aborted=true;return canary}const checkResult=runChecks(payload,checks,ctx);if(checkResult instanceof Promise){if(ctx.async===false)throw new $ZodAsyncError;return checkResult.then(checkResult2=>inst._zod.parse(checkResult2,ctx))}return inst._zod.parse(checkResult,ctx)};inst._zod.run=(payload,ctx)=>{if(ctx.skipChecks){return inst._zod.parse(payload,ctx)}if(ctx.direction==="backward"){const canary=inst._zod.parse({value:payload.value,issues:[]},{...ctx,skipChecks:true});if(canary instanceof Promise){return canary.then(canary2=>{return handleCanaryResult(canary2,payload,ctx)})}return handleCanaryResult(canary,payload,ctx)}const result=inst._zod.parse(payload,ctx);if(result instanceof Promise){if(ctx.async===false)throw new $ZodAsyncError;return result.then(result2=>runChecks(result2,checks,ctx))}return runChecks(result,checks,ctx)}}defineLazy(inst,"~standard",()=>({validate:value=>{try{const r=safeParse(inst,value);return r.success?{value:r.data}:{issues:r.error?.issues}}catch(_){return safeParseAsync(inst,value).then(r=>r.success?{value:r.data}:{issues:r.error?.issues})}},vendor:"zod",version:1}))});var $ZodString=$constructor("$ZodString",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=[...inst?._zod.bag?.patterns??[]].pop()??string(inst._zod.bag);inst._zod.parse=(payload,_)=>{if(def.coerce)try{payload.value=String(payload.value)}catch(_2){}if(typeof payload.value==="string")return payload;payload.issues.push({expected:"string",code:"invalid_type",input:payload.value,inst});return payload}});var $ZodStringFormat=$constructor("$ZodStringFormat",(inst,def)=>{$ZodCheckStringFormat.init(inst,def);$ZodString.init(inst,def)});var $ZodGUID=$constructor("$ZodGUID",(inst,def)=>{def.pattern??(def.pattern=guid);$ZodStringFormat.init(inst,def)});var $ZodUUID=$constructor("$ZodUUID",(inst,def)=>{if(def.version){const versionMap={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8};const v=versionMap[def.version];if(v===void 0)throw new Error(`Invalid UUID version: "${def.version}"`);def.pattern??(def.pattern=uuid(v))}else def.pattern??(def.pattern=uuid());$ZodStringFormat.init(inst,def)});var $ZodEmail=$constructor("$ZodEmail",(inst,def)=>{def.pattern??(def.pattern=email);$ZodStringFormat.init(inst,def)});var $ZodURL=$constructor("$ZodURL",(inst,def)=>{$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{try{const trimmed=payload.value.trim();if(!def.normalize&&def.protocol?.source===httpProtocol.source){if(!/^https?:\/\//i.test(trimmed)){payload.issues.push({code:"invalid_format",format:"url",note:"Invalid URL format",input:payload.value,inst,continue:!def.abort});return}}const url2=new URL(trimmed);if(def.hostname){def.hostname.lastIndex=0;if(!def.hostname.test(url2.hostname)){payload.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:def.hostname.source,input:payload.value,inst,continue:!def.abort})}}if(def.protocol){def.protocol.lastIndex=0;if(!def.protocol.test(url2.protocol.endsWith(":")?url2.protocol.slice(0,-1):url2.protocol)){payload.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:def.protocol.source,input:payload.value,inst,continue:!def.abort})}}if(def.normalize){payload.value=url2.href}else{payload.value=trimmed}return}catch(_){payload.issues.push({code:"invalid_format",format:"url",input:payload.value,inst,continue:!def.abort})}}});var $ZodEmoji=$constructor("$ZodEmoji",(inst,def)=>{def.pattern??(def.pattern=emoji());$ZodStringFormat.init(inst,def)});var $ZodNanoID=$constructor("$ZodNanoID",(inst,def)=>{def.pattern??(def.pattern=nanoid);$ZodStringFormat.init(inst,def)});var $ZodCUID=$constructor("$ZodCUID",(inst,def)=>{def.pattern??(def.pattern=cuid);$ZodStringFormat.init(inst,def)});var $ZodCUID2=$constructor("$ZodCUID2",(inst,def)=>{def.pattern??(def.pattern=cuid2);$ZodStringFormat.init(inst,def)});var $ZodULID=$constructor("$ZodULID",(inst,def)=>{def.pattern??(def.pattern=ulid);$ZodStringFormat.init(inst,def)});var $ZodXID=$constructor("$ZodXID",(inst,def)=>{def.pattern??(def.pattern=xid);$ZodStringFormat.init(inst,def)});var $ZodKSUID=$constructor("$ZodKSUID",(inst,def)=>{def.pattern??(def.pattern=ksuid);$ZodStringFormat.init(inst,def)});var $ZodISODateTime=$constructor("$ZodISODateTime",(inst,def)=>{def.pattern??(def.pattern=datetime(def));$ZodStringFormat.init(inst,def)});var $ZodISODate=$constructor("$ZodISODate",(inst,def)=>{def.pattern??(def.pattern=date);$ZodStringFormat.init(inst,def)});var $ZodISOTime=$constructor("$ZodISOTime",(inst,def)=>{def.pattern??(def.pattern=time(def));$ZodStringFormat.init(inst,def)});var $ZodISODuration=$constructor("$ZodISODuration",(inst,def)=>{def.pattern??(def.pattern=duration);$ZodStringFormat.init(inst,def)});var $ZodIPv4=$constructor("$ZodIPv4",(inst,def)=>{def.pattern??(def.pattern=ipv4);$ZodStringFormat.init(inst,def);inst._zod.bag.format=`ipv4`});var $ZodIPv6=$constructor("$ZodIPv6",(inst,def)=>{def.pattern??(def.pattern=ipv6);$ZodStringFormat.init(inst,def);inst._zod.bag.format=`ipv6`;inst._zod.check=payload=>{try{new URL(`http://[${payload.value}]`)}catch{payload.issues.push({code:"invalid_format",format:"ipv6",input:payload.value,inst,continue:!def.abort})}}});var $ZodMAC=$constructor("$ZodMAC",(inst,def)=>{def.pattern??(def.pattern=mac(def.delimiter));$ZodStringFormat.init(inst,def);inst._zod.bag.format=`mac`});var $ZodCIDRv4=$constructor("$ZodCIDRv4",(inst,def)=>{def.pattern??(def.pattern=cidrv4);$ZodStringFormat.init(inst,def)});var $ZodCIDRv6=$constructor("$ZodCIDRv6",(inst,def)=>{def.pattern??(def.pattern=cidrv6);$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{const parts=payload.value.split("/");try{if(parts.length!==2)throw new Error;const[address,prefix]=parts;if(!prefix)throw new Error;const prefixNum=Number(prefix);if(`${prefixNum}`!==prefix)throw new Error;if(prefixNum<0||prefixNum>128)throw new Error;new URL(`http://[${address}]`)}catch{payload.issues.push({code:"invalid_format",format:"cidrv6",input:payload.value,inst,continue:!def.abort})}}});function isValidBase64(data){if(data==="")return true;if(/\s/.test(data))return false;if(data.length%4!==0)return false;try{atob(data);return true}catch{return false}}var $ZodBase64=$constructor("$ZodBase64",(inst,def)=>{def.pattern??(def.pattern=base64);$ZodStringFormat.init(inst,def);inst._zod.bag.contentEncoding="base64";inst._zod.check=payload=>{if(isValidBase64(payload.value))return;payload.issues.push({code:"invalid_format",format:"base64",input:payload.value,inst,continue:!def.abort})}});function isValidBase64URL(data){if(!base64url.test(data))return false;const base643=data.replace(/[-_]/g,c=>c==="-"?"+":"/");const padded=base643.padEnd(Math.ceil(base643.length/4)*4,"=");return isValidBase64(padded)}var $ZodBase64URL=$constructor("$ZodBase64URL",(inst,def)=>{def.pattern??(def.pattern=base64url);$ZodStringFormat.init(inst,def);inst._zod.bag.contentEncoding="base64url";inst._zod.check=payload=>{if(isValidBase64URL(payload.value))return;payload.issues.push({code:"invalid_format",format:"base64url",input:payload.value,inst,continue:!def.abort})}});var $ZodE164=$constructor("$ZodE164",(inst,def)=>{def.pattern??(def.pattern=e164);$ZodStringFormat.init(inst,def)});function isValidJWT(token,algorithm=null){try{const tokensParts=token.split(".");if(tokensParts.length!==3)return false;const[header]=tokensParts;if(!header)return false;const parsedHeader=JSON.parse(atob(header));if("typ"in parsedHeader&&parsedHeader?.typ!=="JWT")return false;if(!parsedHeader.alg)return false;if(algorithm&&(!("alg"in parsedHeader)||parsedHeader.alg!==algorithm))return false;return true}catch{return false}}var $ZodJWT=$constructor("$ZodJWT",(inst,def)=>{$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{if(isValidJWT(payload.value,def.alg))return;payload.issues.push({code:"invalid_format",format:"jwt",input:payload.value,inst,continue:!def.abort})}});var $ZodCustomStringFormat=$constructor("$ZodCustomStringFormat",(inst,def)=>{$ZodStringFormat.init(inst,def);inst._zod.check=payload=>{if(def.fn(payload.value))return;payload.issues.push({code:"invalid_format",format:def.format,input:payload.value,inst,continue:!def.abort})}});var $ZodNumber=$constructor("$ZodNumber",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=inst._zod.bag.pattern??number;inst._zod.parse=(payload,_ctx)=>{if(def.coerce)try{payload.value=Number(payload.value)}catch(_){}const input=payload.value;if(typeof input==="number"&&!Number.isNaN(input)&&Number.isFinite(input)){return payload}const received=typeof input==="number"?Number.isNaN(input)?"NaN":!Number.isFinite(input)?"Infinity":void 0:void 0;payload.issues.push({expected:"number",code:"invalid_type",input,inst,...received?{received}:{}});return payload}});var $ZodNumberFormat=$constructor("$ZodNumberFormat",(inst,def)=>{$ZodCheckNumberFormat.init(inst,def);$ZodNumber.init(inst,def)});var $ZodBoolean=$constructor("$ZodBoolean",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=boolean;inst._zod.parse=(payload,_ctx)=>{if(def.coerce)try{payload.value=Boolean(payload.value)}catch(_){}const input=payload.value;if(typeof input==="boolean")return payload;payload.issues.push({expected:"boolean",code:"invalid_type",input,inst});return payload}});var $ZodBigInt=$constructor("$ZodBigInt",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=bigint;inst._zod.parse=(payload,_ctx)=>{if(def.coerce)try{payload.value=BigInt(payload.value)}catch(_){}if(typeof payload.value==="bigint")return payload;payload.issues.push({expected:"bigint",code:"invalid_type",input:payload.value,inst});return payload}});var $ZodBigIntFormat=$constructor("$ZodBigIntFormat",(inst,def)=>{$ZodCheckBigIntFormat.init(inst,def);$ZodBigInt.init(inst,def)});var $ZodSymbol=$constructor("$ZodSymbol",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(typeof input==="symbol")return payload;payload.issues.push({expected:"symbol",code:"invalid_type",input,inst});return payload}});var $ZodUndefined=$constructor("$ZodUndefined",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=_undefined;inst._zod.values=new Set([void 0]);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(typeof input==="undefined")return payload;payload.issues.push({expected:"undefined",code:"invalid_type",input,inst});return payload}});var $ZodNull=$constructor("$ZodNull",(inst,def)=>{$ZodType.init(inst,def);inst._zod.pattern=_null;inst._zod.values=new Set([null]);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(input===null)return payload;payload.issues.push({expected:"null",code:"invalid_type",input,inst});return payload}});var $ZodAny=$constructor("$ZodAny",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=payload=>payload});var $ZodUnknown=$constructor("$ZodUnknown",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=payload=>payload});var $ZodNever=$constructor("$ZodNever",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{payload.issues.push({expected:"never",code:"invalid_type",input:payload.value,inst});return payload}});var $ZodVoid=$constructor("$ZodVoid",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{const input=payload.value;if(typeof input==="undefined")return payload;payload.issues.push({expected:"void",code:"invalid_type",input,inst});return payload}});var $ZodDate=$constructor("$ZodDate",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,_ctx)=>{if(def.coerce){try{payload.value=new Date(payload.value)}catch(_err){}}const input=payload.value;const isDate=input instanceof Date;const isValidDate=isDate&&!Number.isNaN(input.getTime());if(isValidDate)return payload;payload.issues.push({expected:"date",code:"invalid_type",input,...isDate?{received:"Invalid Date"}:{},inst});return payload}});function handleArrayResult(result,final,index){if(result.issues.length){final.issues.push(...prefixIssues(index,result.issues))}final.value[index]=result.value}var $ZodArray=$constructor("$ZodArray",(inst,def)=>{$ZodType.init(inst,def);inst._zod.parse=(payload,ctx)=>{const input=payload.value;if(!Array.isArray(input)){payload.issues.push({expected:"array",code:"invalid_type",input,inst});return payload}payload.value=Array(input.length);const proms=[];for(let i=0;i<input.length;i++){const item=input[i];const result=def.element._zod.run({value:item,issues:[]},ctx);if(result instanceof Promise){proms.push(result.then(result2=>handleArrayResult(result2,payload,i)))}else{handleArrayResult(result,payload,i)}}if(proms.length){return Promise.all(proms).then(()=>payload)}return payload}});function handlePropertyResult(result,final,key,input,isOptionalIn,isOptionalOut){const isPresent=key in input;if(result.issues.length){if(isOptionalIn&&isOptionalOut&&!isPresent){return}final.issues.push(...prefixIssues(key,result.issues))}if(!isPresent&&!isOptionalIn){if(!result.issues.length){final.issues.push({code:"invalid_type",expected:"nonoptional",input:void 0,path:[key]})}return}if(result.value===void 0){if(isPresent){final.value[key]=void 0}}else{final.value[key]=result.value}}function normalizeDef(def){const keys=Object.keys(def.shape);for(const k of keys){if(!def.shape?.[k]?._zod?.traits?.has("$ZodType")){throw new Error(`Invalid element at key "${k}": expected a Zod schema`)}}const okeys=optionalKeys(def.shape);return{...def,keys,keySet:new Set(keys),numKeys:keys.length,optionalKeys:new Set(okeys)}}function handleCatchall(proms,input,payload,ctx,def,inst){const unrecognized=[];const keySet=def.keySet;const _catchall=def.catchall._zod;const t=_catchall.def.type;const isOptionalIn=_catchall.optin==="optional";const isOptionalOut=_catchall.optout==="optional";for(const key in input){if(key==="__proto__")continue;if(keySet.has(key))continue;if(t==="never"){unrecognized.push(key);continue}const r=_catchall.run({value:input[key],issues:[]},ctx);if(r instanceof Promise){proms.push(r.then(r2=>handlePropertyResult(r2,payload,key,input,isOptionalIn,isOptionalOut)))}else{handlePropertyResult(r,payload,key,input,isOptionalIn,isOptionalOut)}}if(unrecognized.length){payload.issues.push({code:"unrecognized_keys",keys:unrecognized,input,inst})}if(!proms.length)return payload;return Promise.all(proms).then(()=>{return payload})}var $ZodObject=$constructor("$ZodObject",(inst,def)=>{$ZodType.init(inst,def);const desc=Object.getOwnPropertyDescriptor(def,"shape");if(!desc?.get){const sh=def.shape;Object.defineProperty(def,"shape",{get:()=>{const newSh={...sh};Object.defineProperty(def,"shape",{value:newSh});return newSh}})}const _normalized=cached(()=>normalizeDef(def));defineLazy(inst._zod,"propValues",()=>{const shape=def.shape;const propValues={};for(const key in shape){const field=shape[key]._zod;if(field.values){propValues[key]??(propValues[key]=new Set);for(const v of field.values)propValues[key].add(v)}}return propValues});const isObject2=isObject;const catchall=def.catchall;let value;inst._zod.parse=(payload,ctx)=>{value??(value=_normalized.value);const input=payload.value;if(!isObject2(input)){payload.issues.push({expected:"object",code:"invalid_type",input,inst});return payload}payload.value={};const proms=[];const shape=value.shape;for(const key of value.keys){const el=shape[key];const isOptionalIn=el._zod.optin==="optional";const isOptionalOut=el._zod.optout==="optional";const r=el._zod.run({value:input[key],issues:[]},ctx);if(r instanceof Promise){proms.push(r.then(r2=>handlePropertyResult(r2,payload,key,input,isOptionalIn,isOptionalOut)))}else{handlePropertyResult(r,payload,key,input,isOptionalIn,isOptionalOut)}}if(!catchall){return proms.length?Promise.all(proms).then(()=>payload):payload}return handleCatchall(proms,input,payload,ctx,_normalized.value,inst)}});var $ZodObjectJIT=$constructor("$ZodObjectJIT",(inst,def)=>{$ZodObject.init(inst,def);const superParse=inst._zod.parse;const _normalized=cached(()=>normalizeDef(def));const generateFastpass=shape=>{const doc=new Doc(["shape","payload","ctx"]);const normalized=_normalized.value;const parseStr=key=>{const k=esc(key);return`shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`};doc.write(`const input = payload.value;`);const ids=Object.create(null);let counter=0;for(const key of normalized.keys){ids[key]=`key_${counter++}`}doc.write(`const newResult = {};`);for(const key of normalized.keys){const id=ids[key];const k=esc(key);const schema=shape[key];const isOptionalIn=schema?._zod?.optin==="optional";const isOptionalOut=schema?._zod?.optout==="optional";doc.write(`const ${id} = ${parseStr(key)};`);if(isOptionalIn&&isOptionalOut){doc.write(`
|
|
50
50
|
if (${id}.issues.length) {
|
|
51
51
|
if (${k} in input) {
|
|
52
52
|
payload.issues = payload.issues.concat(${id}.issues.map(iss => ({
|
|
@@ -125,7 +125,7 @@ ${value}`,dataLines++}else isEventPrefix(chunk,searchIndex,firstCharCode)?eventT
|
|
|
125
125
|
`,searchIndex)}return chunk.slice(searchIndex)}for(;searchIndex<chunk.length;){const crIndex=chunk.indexOf("\r",searchIndex),lfIndex=chunk.indexOf(`
|
|
126
126
|
`,searchIndex);let lineEnd=-1;if(crIndex!==-1&&lfIndex!==-1?lineEnd=crIndex<lfIndex?crIndex:lfIndex:crIndex!==-1?crIndex===chunk.length-1?lineEnd=-1:lineEnd=crIndex:lfIndex!==-1&&(lineEnd=lfIndex),lineEnd===-1)break;parseLine(chunk,searchIndex,lineEnd),searchIndex=lineEnd+1,chunk.charCodeAt(searchIndex-1)===CR&&chunk.charCodeAt(searchIndex)===LF&&searchIndex++}return chunk.slice(searchIndex)}function parseLine(chunk,start,end){if(start===end){dispatchEvent();return}const firstCharCode=chunk.charCodeAt(start);if(isDataPrefix(chunk,start,firstCharCode)){const valueStart=chunk.charCodeAt(start+5)===SPACE?start+6:start+5,value2=chunk.slice(valueStart,end);data=dataLines===0?value2:`${data}
|
|
127
127
|
${value2}`,dataLines++;return}if(isEventPrefix(chunk,start,firstCharCode)){eventType=chunk.slice(chunk.charCodeAt(start+6)===SPACE?start+7:start+6,end)||void 0;return}if(firstCharCode===105&&chunk.charCodeAt(start+1)===100&&chunk.charCodeAt(start+2)===58){const value2=chunk.slice(chunk.charCodeAt(start+3)===SPACE?start+4:start+3,end);id=value2.includes("\0")?void 0:value2;return}if(firstCharCode===58){if(onComment){const line2=chunk.slice(start,end);onComment(line2.slice(chunk.charCodeAt(start+1)===SPACE?2:1))}return}const line=chunk.slice(start,end),fieldSeparatorIndex=line.indexOf(":");if(fieldSeparatorIndex===-1){processField(line,"",line);return}const field=line.slice(0,fieldSeparatorIndex),offset=line.charCodeAt(fieldSeparatorIndex+1)===SPACE?2:1,value=line.slice(fieldSeparatorIndex+offset);processField(field,value,line)}function processField(field,value,line){switch(field){case"event":eventType=value||void 0;break;case"data":data=dataLines===0?value:`${data}
|
|
128
|
-
${value}`,dataLines++;break;case"id":id=value.includes("\0")?void 0:value;break;case"retry":/^\d+$/.test(value)?onRetry(parseInt(value,10)):onError(new ParseError(`Invalid \`retry\` value: "${value}"`,{type:"invalid-retry",value,line}));break;default:onError(new ParseError(`Unknown field "${field.length>20?`${field.slice(0,20)}\u2026`:field}"`,{type:"unknown-field",field,value,line}));break}}function dispatchEvent(){dataLines>0&&onEvent({id,event:eventType,data}),id=void 0,data="",dataLines=0,eventType=void 0}function reset(options={}){if(options.consume&&pendingFragments.length>0){const incompleteLine=pendingFragments.join("");parseLine(incompleteLine,0,incompleteLine.length)}isFirstChunk=true,id=void 0,data="",dataLines=0,eventType=void 0,pendingFragments.length=0,pendingFragmentsLength=0,terminated=false}return{feed,reset}}function isDataPrefix(chunk,i,firstCharCode){return firstCharCode===100&&chunk.charCodeAt(i+1)===97&&chunk.charCodeAt(i+2)===116&&chunk.charCodeAt(i+3)===97&&chunk.charCodeAt(i+4)===58}function isEventPrefix(chunk,i,firstCharCode){return firstCharCode===101&&chunk.charCodeAt(i+1)===118&&chunk.charCodeAt(i+2)===101&&chunk.charCodeAt(i+3)===110&&chunk.charCodeAt(i+4)===116&&chunk.charCodeAt(i+5)===58}var EventSourceParserStream=class extends TransformStream{constructor({onError,onRetry,onComment,maxBufferSize}={}){let parser;super({start(controller){parser=createParser({onEvent:event=>{controller.enqueue(event)},onError(error51){typeof onError=="function"&&onError(error51),(onError==="terminate"||error51.type==="max-buffer-size-exceeded")&&controller.error(error51)},onRetry,onComment,maxBufferSize})},transform(chunk){parser.feed(chunk)}})}};var OAuthClientFlowError=class extends Error{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.OAuthClientFlowError"})}static[Symbol.hasInstance](value){return brandedHasInstance(this,value)}static isInstance(value){if(typeof this!=="function")throw new TypeError("isInstance must be called on the class (e.g. `SdkError.isInstance(value)`); for callbacks use `v => SdkError.isInstance(v)`");return brandedHasInstance(this,value)}constructor(message){super(message);this.name=new.target.name;stampErrorBrands(this,new.target)}};var IssuerMismatchError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.IssuerMismatchError"})}kind;expected;received;constructor(kind,expected,received){super(`Issuer mismatch in ${kind==="metadata"?"authorization server metadata (RFC 8414 \xA73.3)":"authorization response (RFC 9207)"}: expected ${JSON.stringify(expected)}, received ${JSON.stringify(received)}`);this.kind=kind;this.expected=expected;this.received=received}};var RegistrationRejectedError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.RegistrationRejectedError"})}status;body;submittedMetadata;constructor(args){super(`Dynamic Client Registration rejected (HTTP ${args.status}): ${args.body}`);this.status=args.status;this.body=args.body;this.submittedMetadata=args.submittedMetadata}};var InsecureTokenEndpointError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.InsecureTokenEndpointError"})}tokenEndpoint;constructor(tokenEndpoint){super(`Refusing to send credentials to non-https token endpoint '${tokenEndpoint}'. OAuth token requests MUST use TLS (localhost / 127.0.0.1 / ::1 are exempt).`);this.tokenEndpoint=tokenEndpoint}};var AuthorizationServerMismatchError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.AuthorizationServerMismatchError"})}constructor(recordedIssuer,currentIssuer){super(`Authorization server changed between redirect and callback (redirected to ${JSON.stringify(recordedIssuer)}, callback resolved ${JSON.stringify(currentIssuer)}); refusing to send authorization_code/code_verifier to a different token endpoint`);this.recordedIssuer=recordedIssuer;this.currentIssuer=currentIssuer}};var InsufficientScopeError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.InsufficientScopeError"})}requiredScope;resourceMetadataUrl;errorDescription;constructor(init){super(`Insufficient scope${init.requiredScope?`: required "${init.requiredScope}"`:""}`);this.requiredScope=init.requiredScope;this.resourceMetadataUrl=init.resourceMetadataUrl;this.errorDescription=init.errorDescription}};function discardIfIssuerMismatch(stored,issuer,opts){if(stored===void 0)return void 0;if(stored.issuer===void 0){if(opts?.canPersistStamp!==false)console.warn("[mcp-sdk] SEP-2352: stored OAuth credential has no 'issuer' stamp (pre-upgrade storage or provider not round-tripping the value). SEP-2352 isolation is inactive for this read; ensure your provider round-trips the issuer field.");return stored}return issuersMatch(stored.issuer,issuer)?stored:void 0}function issuersMatch(a,b){return a===b||a.endsWith("/")&&a.slice(0,-1)===b||b.endsWith("/")&&b.slice(0,-1)===a}function isOAuthClientProvider(provider){if(provider==null)return false;const p=provider;return typeof p.tokens==="function"&&typeof p.clientInformation==="function"}async function handleOAuthUnauthorized(provider,ctx,extraAuthOptions){const{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(ctx.response);if(await auth(provider,{serverUrl:ctx.serverUrl,resourceMetadataUrl,scope,fetchFn:ctx.fetchFn,...extraAuthOptions})!=="AUTHORIZED")throw new UnauthorizedError}function adaptOAuthProvider(provider,extraAuthOptions){return{token:async()=>{return(await provider.tokens())?.access_token},onUnauthorized:async ctx=>handleOAuthUnauthorized(provider,ctx,extraAuthOptions)}}var UnauthorizedError=class extends Error{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.UnauthorizedError"})}static[Symbol.hasInstance](value){return brandedHasInstance(this,value)}static isInstance(value){if(typeof this!=="function")throw new TypeError("isInstance must be called on the class (e.g. `SdkError.isInstance(value)`); for callbacks use `v => SdkError.isInstance(v)`");return brandedHasInstance(this,value)}constructor(message){super(message??"Unauthorized");this.name="UnauthorizedError";stampErrorBrands(this,new.target)}};function isIssParameterSupported(metadata){return metadata?.authorization_response_iss_parameter_supported===true}function validateAuthorizationResponseIssuer({iss,expectedIssuer,issParameterSupported}){if(expectedIssuer===void 0)return;if(iss===void 0){if(issParameterSupported)throw new IssuerMismatchError("authorization_response",expectedIssuer,void 0);return}if(iss!==expectedIssuer)throw new IssuerMismatchError("authorization_response",expectedIssuer,iss)}function computeScopeUnion(...scopes){const seen=new Set;for(const scope of scopes){if(!scope)continue;for(const token of scope.split(/\s+/))if(token)seen.add(token)}return seen.size>0?[...seen].join(" "):void 0}function isStrictScopeSuperset(union2,current){if(!union2)return false;const currentSet=new Set((current??"").split(/\s+/).filter(Boolean));for(const token of union2.split(/\s+/))if(token&&!currentSet.has(token))return true;return false}async function resolveAuthorizationCallbackParams(codeOrParams,iss,provider,serverUrl,opts){if(typeof codeOrParams==="string")return{authorizationCode:codeOrParams,iss};const issParam=codeOrParams.get("iss")??void 0;const code=codeOrParams.get("code");if(code)return{authorizationCode:code,iss:issParam};let metadata=(await provider.discoveryState?.())?.authorizationServerMetadata;if(!metadata)try{metadata=(await discoverOAuthServerInfo(serverUrl,opts)).authorizationServerMetadata}catch{metadata=void 0}if(!metadata)throw new UnauthorizedError("Authorization callback failed and the issuer could not be verified");validateAuthorizationResponseIssuer({iss:issParam,expectedIssuer:metadata.issuer,issParameterSupported:isIssParameterSupported(metadata)});const error51=codeOrParams.get("error");if(error51)throw new OAuthError(error51,codeOrParams.get("error_description")??error51,codeOrParams.get("error_uri")??void 0);throw new UnauthorizedError("Authorization callback contained neither `code` nor `error`")}function isClientAuthMethod(method){return["client_secret_basic","client_secret_post","none"].includes(method)}var AUTHORIZATION_CODE_RESPONSE_TYPE="code";var AUTHORIZATION_CODE_CHALLENGE_METHOD="S256";function selectClientAuthMethod(clientInformation,supportedMethods){const hasClientSecret=clientInformation.client_secret!==void 0;if("token_endpoint_auth_method"in clientInformation&&clientInformation.token_endpoint_auth_method&&isClientAuthMethod(clientInformation.token_endpoint_auth_method)&&(supportedMethods.length===0||supportedMethods.includes(clientInformation.token_endpoint_auth_method)))return clientInformation.token_endpoint_auth_method;if(supportedMethods.length===0)return hasClientSecret?"client_secret_basic":"none";if(hasClientSecret&&supportedMethods.includes("client_secret_basic"))return"client_secret_basic";if(hasClientSecret&&supportedMethods.includes("client_secret_post"))return"client_secret_post";if(supportedMethods.includes("none"))return"none";return hasClientSecret?"client_secret_post":"none"}function applyClientAuthentication(method,clientInformation,headers,params){const{client_id,client_secret}=clientInformation;switch(method){case"client_secret_basic":applyBasicAuth(client_id,client_secret,headers);return;case"client_secret_post":applyPostAuth(client_id,client_secret,params);return;case"none":applyPublicAuth(client_id,params);return;default:throw new Error(`Unsupported client authentication method: ${method}`)}}function applyBasicAuth(clientId,clientSecret,headers){if(!clientSecret)throw new Error("client_secret_basic authentication requires a client_secret");const credentials=btoa(`${clientId}:${clientSecret}`);headers.set("Authorization",`Basic ${credentials}`)}function applyPostAuth(clientId,clientSecret,params){params.set("client_id",clientId);if(clientSecret)params.set("client_secret",clientSecret)}function applyPublicAuth(clientId,params){params.set("client_id",clientId)}function isLoopbackHost(hostname3){return hostname3==="localhost"||hostname3==="127.0.0.1"||hostname3==="[::1]"||hostname3==="::1"}function assertSecureTokenEndpoint(tokenEndpoint){const url2=new URL(String(tokenEndpoint));if(url2.protocol!=="https:"&&!isLoopbackHost(url2.hostname))throw new InsecureTokenEndpointError(url2.href);return url2}function deriveApplicationType(redirectUris){for(const raw of redirectUris??[]){let url2;try{url2=new URL(raw)}catch{continue}if(url2.protocol!=="http:"&&url2.protocol!=="https:")return"native";if(isLoopbackHost(url2.hostname))return"native"}return"web"}function resolveClientMetadata(provider){const clientMetadata=provider.clientMetadata;return{...clientMetadata,grant_types:clientMetadata.grant_types??(provider.redirectUrl===void 0?void 0:["authorization_code","refresh_token"]),application_type:clientMetadata.application_type??deriveApplicationType(clientMetadata.redirect_uris)}}async function parseErrorResponse(input){const statusCode=input instanceof Response?input.status:void 0;const body=input instanceof Response?await input.text():input;try{const result=OAuthErrorResponseSchema.parse(JSON.parse(body));return OAuthError.fromResponse(result)}catch(error51){const errorMessage=`${statusCode?`HTTP ${statusCode}: `:""}Invalid OAuth error response: ${error51}. Raw body: ${body}`;return new OAuthError(OAuthErrorCode.ServerError,errorMessage)}}async function auth(provider,options){try{return await authInternal(provider,options)}catch(error51){if(error51 instanceof OAuthError){if(error51.code===OAuthErrorCode.InvalidClient||error51.code===OAuthErrorCode.UnauthorizedClient){await provider.invalidateCredentials?.("client");await provider.invalidateCredentials?.("tokens");return await authInternal(provider,options)}else if(error51.code===OAuthErrorCode.InvalidGrant){await provider.invalidateCredentials?.("tokens");return await authInternal(provider,options)}}throw error51}}function determineScope(options){const{requestedScope,resourceMetadata,authServerMetadata,clientMetadata}=options;let effectiveScope=requestedScope||resourceMetadata?.scopes_supported?.join(" ")||clientMetadata.scope;if(effectiveScope&&authServerMetadata?.scopes_supported?.includes("offline_access")&&!effectiveScope.split(" ").includes("offline_access")&&clientMetadata.grant_types?.includes("refresh_token"))effectiveScope=`${effectiveScope} offline_access`;return effectiveScope}async function authInternal(provider,{serverUrl,authorizationCode,iss,scope,resourceMetadataUrl,fetchFn,skipIssuerMetadataValidation,forceReauthorization}){const clientMetadata=resolveClientMetadata(provider);const cachedState=await provider.discoveryState?.();let resourceMetadata;let authorizationServerUrl;let metadata;let freshDiscoveryState;let effectiveResourceMetadataUrl=resourceMetadataUrl;if(!effectiveResourceMetadataUrl&&cachedState?.resourceMetadataUrl)effectiveResourceMetadataUrl=new URL(cachedState.resourceMetadataUrl);if(cachedState?.authorizationServerUrl){authorizationServerUrl=cachedState.authorizationServerUrl;resourceMetadata=cachedState.resourceMetadata;metadata=cachedState.authorizationServerMetadata??await discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn,skipIssuerValidation:skipIssuerMetadataValidation});if(!resourceMetadata)try{resourceMetadata=await discoverOAuthProtectedResourceMetadata(serverUrl,{resourceMetadataUrl:effectiveResourceMetadataUrl},fetchFn)}catch(error51){if(error51 instanceof TypeError)throw error51}if(metadata!==cachedState.authorizationServerMetadata||resourceMetadata!==cachedState.resourceMetadata)await provider.saveDiscoveryState?.({authorizationServerUrl:String(authorizationServerUrl),resourceMetadataUrl:effectiveResourceMetadataUrl?.toString(),resourceMetadata,authorizationServerMetadata:metadata})}else{const serverInfo=await discoverOAuthServerInfo(serverUrl,{resourceMetadataUrl:effectiveResourceMetadataUrl,fetchFn,skipIssuerMetadataValidation});authorizationServerUrl=serverInfo.authorizationServerUrl;metadata=serverInfo.authorizationServerMetadata;resourceMetadata=serverInfo.resourceMetadata;freshDiscoveryState={authorizationServerUrl:String(authorizationServerUrl),resourceMetadataUrl:effectiveResourceMetadataUrl?.toString(),resourceMetadata,authorizationServerMetadata:metadata}}const issuer=metadata?.issuer??String(authorizationServerUrl);const infoCtx={issuer};await provider.saveAuthorizationServerUrl?.(issuer);if(authorizationCode!==void 0){const recordedIssuer=cachedState?.authorizationServerMetadata?.issuer??cachedState?.authorizationServerUrl;if(recordedIssuer===void 0){if(provider.saveDiscoveryState!==void 0)throw new AuthorizationServerMismatchError("discoveryState was not available on the callback leg; ensure your provider persists discoveryState alongside codeVerifier",issuer);console.warn("[mcp-sdk] OAuthClientProvider does not implement saveDiscoveryState()/discoveryState(); the SEP-2352 callback-leg authorization-server binding cannot be checked. Implement discoveryState (persist alongside codeVerifier) \u2014 see docs/migration/upgrade-to-v2.md \xA7SEP-2352.")}else if(!issuersMatch(recordedIssuer,issuer))throw new AuthorizationServerMismatchError(recordedIssuer,issuer)}if(freshDiscoveryState)await provider.saveDiscoveryState?.(freshDiscoveryState);const resource=await selectResourceURL(serverUrl,provider,resourceMetadata);if(resource)await provider.saveResourceUrl?.(String(resource));const resolvedScope=determineScope({requestedScope:scope,resourceMetadata,authServerMetadata:metadata,clientMetadata:provider.clientMetadata});const rawClientInfo=await Promise.resolve(provider.clientInformation(infoCtx));let clientInformation=discardIfIssuerMismatch(rawClientInfo,issuer,{canPersistStamp:provider.saveClientInformation!==void 0});if(clientInformation===void 0&&rawClientInfo?.issuer&&provider.saveClientInformation===void 0)throw new AuthorizationServerMismatchError(rawClientInfo.issuer,issuer);if(clientInformation&&clientInformation.issuer===void 0){clientInformation={...clientInformation,issuer};await provider.saveClientInformation?.(clientInformation,infoCtx)}if(!clientInformation){if(authorizationCode!==void 0)throw new Error("Existing OAuth client information is required when exchanging an authorization code");const supportsUrlBasedClientId=metadata?.client_id_metadata_document_supported===true;const clientMetadataUrl=provider.clientMetadataUrl;if(clientMetadataUrl&&!isHttpsUrl(clientMetadataUrl))throw new OAuthError(OAuthErrorCode.InvalidClientMetadata,`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${clientMetadataUrl}`);if(supportsUrlBasedClientId&&clientMetadataUrl){clientInformation={client_id:clientMetadataUrl,issuer};await provider.saveClientInformation?.(clientInformation,infoCtx)}else{if(!provider.saveClientInformation)throw new Error("OAuth client information must be saveable for dynamic registration");clientInformation={...await registerClient(authorizationServerUrl,{metadata,clientMetadata,scope:resolvedScope,fetchFn}),issuer};await provider.saveClientInformation(clientInformation,infoCtx)}}const nonInteractiveFlow=!provider.redirectUrl;if(authorizationCode!==void 0||nonInteractiveFlow){if(authorizationCode!==void 0)validateAuthorizationResponseIssuer({iss,expectedIssuer:metadata?.issuer,issParameterSupported:isIssParameterSupported(metadata)});const tokens$1=await fetchToken(provider,authorizationServerUrl,{metadata,resource,authorizationCode,iss,scope:resolvedScope,fetchFn});await provider.saveTokens({...tokens$1,issuer},infoCtx);return"AUTHORIZED"}let tokens=discardIfIssuerMismatch(await provider.tokens(infoCtx),issuer);if(tokens&&tokens.issuer===void 0){tokens={...tokens,issuer};await provider.saveTokens(tokens,infoCtx)}if(tokens?.refresh_token&&!forceReauthorization)try{const newTokens=await refreshAuthorization(authorizationServerUrl,{metadata,clientInformation,refreshToken:tokens.refresh_token,resource,addClientAuthentication:provider.addClientAuthentication,fetchFn});await provider.saveTokens({...newTokens,issuer},infoCtx);return"AUTHORIZED"}catch(error51){if(error51 instanceof InsecureTokenEndpointError)throw error51;if(!(error51 instanceof OAuthError)||error51.code===OAuthErrorCode.ServerError){}else throw error51}const state=provider.state?await provider.state():void 0;const{authorizationUrl,codeVerifier}=await startAuthorization(authorizationServerUrl,{metadata,clientInformation,state,redirectUrl:provider.redirectUrl,scope:resolvedScope,resource});await provider.saveCodeVerifier(codeVerifier);await provider.redirectToAuthorization(authorizationUrl);return"REDIRECT"}function isHttpsUrl(value){if(!value)return false;try{const url2=new URL(value);return url2.protocol==="https:"&&url2.pathname!=="/"}catch{return false}}async function selectResourceURL(serverUrl,provider,resourceMetadata){const defaultResource=resourceUrlFromServerUrl(serverUrl);if(provider.validateResourceURL)return await provider.validateResourceURL(defaultResource,resourceMetadata?.resource);if(!resourceMetadata)return;if(!checkResourceAllowed({requestedResource:defaultResource,configuredResource:resourceMetadata.resource}))throw new Error(`Protected resource ${resourceMetadata.resource} does not match expected ${defaultResource} (or origin)`);return new URL(resourceMetadata.resource)}function extractWWWAuthenticateParams(res){const authenticateHeader=res.headers.get("WWW-Authenticate");if(!authenticateHeader)return{};const[type,scheme]=authenticateHeader.split(" ");if(type?.toLowerCase()!=="bearer"||!scheme)return{};const resourceMetadataMatch=extractFieldFromWwwAuth(res,"resource_metadata")||void 0;let resourceMetadataUrl;if(resourceMetadataMatch)try{resourceMetadataUrl=new URL(resourceMetadataMatch)}catch{}const scope=extractFieldFromWwwAuth(res,"scope")||void 0;const error51=extractFieldFromWwwAuth(res,"error")||void 0;const errorDescription=extractFieldFromWwwAuth(res,"error_description")||void 0;return{resourceMetadataUrl,scope,error:error51,errorDescription}}function extractFieldFromWwwAuth(response,fieldName){const wwwAuthHeader=response.headers.get("WWW-Authenticate");if(!wwwAuthHeader)return null;const pattern=new RegExp(String.raw`${fieldName}=(?:"([^"]+)"|([^\s,]+))`);const match=wwwAuthHeader.match(pattern);if(match){const result=match[1]||match[2];if(result)return result}return null}async function discoverOAuthProtectedResourceMetadata(serverUrl,opts,fetchFn=fetch){const response=await discoverMetadataWithFallback(serverUrl,"oauth-protected-resource",fetchFn,{protocolVersion:opts?.protocolVersion,metadataUrl:opts?.resourceMetadataUrl});if(!response||response.status===404){await response?.text?.().catch(()=>{});throw new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)}if(!response.ok){await response.text?.().catch(()=>{});throw new Error(`HTTP ${response.status} trying to load well-known OAuth protected resource metadata.`)}return OAuthProtectedResourceMetadataSchema.parse(await response.json())}async function fetchWithCorsRetry(url2,headers,fetchFn=fetch){try{return await fetchFn(url2,{headers})}catch(error51){if(!(error51 instanceof TypeError)||!CORS_IS_POSSIBLE)throw error51;if(headers)try{return await fetchFn(url2,{})}catch(retryError){if(!(retryError instanceof TypeError))throw retryError;return}return}}function buildWellKnownPath(wellKnownPrefix,pathname="",options={}){if(pathname.endsWith("/"))pathname=pathname.slice(0,-1);return options.prependPathname?`${pathname}/.well-known/${wellKnownPrefix}`:`/.well-known/${wellKnownPrefix}${pathname}`}async function tryMetadataDiscovery(url2,protocolVersion,fetchFn=fetch){return await fetchWithCorsRetry(url2,{"MCP-Protocol-Version":protocolVersion},fetchFn)}function shouldAttemptFallback(response,pathname){if(!response)return true;if(pathname==="/")return false;return response.status>=400&&response.status<500||response.status===502}async function discoverMetadataWithFallback(serverUrl,wellKnownType,fetchFn,opts){const issuer=new URL(serverUrl);const protocolVersion=opts?.protocolVersion??LATEST_PROTOCOL_VERSION;let url2;if(opts?.metadataUrl)url2=new URL(opts.metadataUrl);else{const wellKnownPath=buildWellKnownPath(wellKnownType,issuer.pathname);url2=new URL(wellKnownPath,opts?.metadataServerUrl??issuer);url2.search=issuer.search}let response=await tryMetadataDiscovery(url2,protocolVersion,fetchFn);if(!opts?.metadataUrl&&shouldAttemptFallback(response,issuer.pathname))response=await tryMetadataDiscovery(new URL(`/.well-known/${wellKnownType}`,issuer),protocolVersion,fetchFn);return response}function buildDiscoveryUrls(authorizationServerUrl){const url2=typeof authorizationServerUrl==="string"?new URL(authorizationServerUrl):authorizationServerUrl;const hasPath=url2.pathname!=="/";const urlsToTry=[];if(!hasPath){urlsToTry.push({url:new URL("/.well-known/oauth-authorization-server",url2.origin),type:"oauth"},{url:new URL(`/.well-known/openid-configuration`,url2.origin),type:"oidc"});return urlsToTry}let pathname=url2.pathname;if(pathname.endsWith("/"))pathname=pathname.slice(0,-1);urlsToTry.push({url:new URL(`/.well-known/oauth-authorization-server${pathname}`,url2.origin),type:"oauth"},{url:new URL(`/.well-known/openid-configuration${pathname}`,url2.origin),type:"oidc"},{url:new URL(`${pathname}/.well-known/openid-configuration`,url2.origin),type:"oidc"});return urlsToTry}async function discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn=fetch,protocolVersion=LATEST_PROTOCOL_VERSION,skipIssuerValidation=false}={}){const headers={"MCP-Protocol-Version":protocolVersion,Accept:"application/json"};const urlsToTry=buildDiscoveryUrls(authorizationServerUrl);for(const{url:endpointUrl,type}of urlsToTry){const response=await fetchWithCorsRetry(endpointUrl,headers,fetchFn);if(!response)continue;if(!response.ok){await response.text?.().catch(()=>{});if(response.status>=400&&response.status<500||response.status===502)continue;throw new Error(`HTTP ${response.status} trying to load ${type==="oauth"?"OAuth":"OpenID provider"} metadata from ${endpointUrl}`)}const parsed=type==="oauth"?OAuthMetadataSchema.parse(await response.json()):OpenIdProviderDiscoveryMetadataSchema.parse(await response.json());if(!skipIssuerValidation){const expectedIssuer=typeof authorizationServerUrl==="string"?authorizationServerUrl:authorizationServerUrl.href;if(!(parsed.issuer===expectedIssuer||expectedIssuer.endsWith("/")&&parsed.issuer===expectedIssuer.slice(0,-1)))throw new IssuerMismatchError("metadata",expectedIssuer,parsed.issuer)}return parsed}}async function discoverOAuthServerInfo(serverUrl,opts){let resourceMetadata;let authorizationServerUrl;try{resourceMetadata=await discoverOAuthProtectedResourceMetadata(serverUrl,{resourceMetadataUrl:opts?.resourceMetadataUrl},opts?.fetchFn);if(resourceMetadata.authorization_servers&&resourceMetadata.authorization_servers.length>0)authorizationServerUrl=resourceMetadata.authorization_servers[0]}catch(error51){if(error51 instanceof TypeError)throw error51}if(!authorizationServerUrl)authorizationServerUrl=String(new URL("/",serverUrl));const authorizationServerMetadata=await discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn:opts?.fetchFn,skipIssuerValidation:opts?.skipIssuerMetadataValidation});return{authorizationServerUrl,authorizationServerMetadata,resourceMetadata}}async function startAuthorization(authorizationServerUrl,{metadata,clientInformation,redirectUrl,scope,state,resource}){let authorizationUrl;if(metadata){authorizationUrl=new URL(metadata.authorization_endpoint);if(!metadata.response_types_supported.includes(AUTHORIZATION_CODE_RESPONSE_TYPE))throw new Error(`Incompatible auth server: does not support response type ${AUTHORIZATION_CODE_RESPONSE_TYPE}`);if(metadata.code_challenge_methods_supported&&!metadata.code_challenge_methods_supported.includes(AUTHORIZATION_CODE_CHALLENGE_METHOD))throw new Error(`Incompatible auth server: does not support code challenge method ${AUTHORIZATION_CODE_CHALLENGE_METHOD}`)}else authorizationUrl=new URL("/authorize",authorizationServerUrl);const challenge=await pkceChallenge();const codeVerifier=challenge.code_verifier;const codeChallenge=challenge.code_challenge;authorizationUrl.searchParams.set("response_type",AUTHORIZATION_CODE_RESPONSE_TYPE);authorizationUrl.searchParams.set("client_id",clientInformation.client_id);authorizationUrl.searchParams.set("code_challenge",codeChallenge);authorizationUrl.searchParams.set("code_challenge_method",AUTHORIZATION_CODE_CHALLENGE_METHOD);authorizationUrl.searchParams.set("redirect_uri",String(redirectUrl));if(state)authorizationUrl.searchParams.set("state",state);if(scope)authorizationUrl.searchParams.set("scope",scope);if(scope?.split(" ").includes("offline_access"))authorizationUrl.searchParams.append("prompt","consent");if(resource)authorizationUrl.searchParams.set("resource",resource.href);return{authorizationUrl,codeVerifier}}function prepareAuthorizationCodeRequest(authorizationCode,codeVerifier,redirectUri){return new URLSearchParams({grant_type:"authorization_code",code:authorizationCode,code_verifier:codeVerifier,redirect_uri:String(redirectUri)})}async function executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation,addClientAuthentication,resource,fetchFn}){const tokenUrl=assertSecureTokenEndpoint(metadata?.token_endpoint??new URL("/token",authorizationServerUrl));const headers=new Headers({"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"});if(resource)tokenRequestParams.set("resource",resource.href);if(addClientAuthentication)await addClientAuthentication(headers,tokenRequestParams,tokenUrl,metadata);else if(clientInformation)applyClientAuthentication(selectClientAuthMethod(clientInformation,metadata?.token_endpoint_auth_methods_supported??[]),clientInformation,headers,tokenRequestParams);const response=await(fetchFn??fetch)(tokenUrl,{method:"POST",headers,body:tokenRequestParams});if(!response.ok)throw await parseErrorResponse(response);const json2=await response.json();try{return OAuthTokensSchema.parse(json2)}catch(parseError){if(typeof json2==="object"&&json2!==null&&"error"in json2)throw await parseErrorResponse(JSON.stringify(json2));throw parseError}}async function refreshAuthorization(authorizationServerUrl,{metadata,clientInformation,refreshToken,resource,addClientAuthentication,fetchFn}){return{refresh_token:refreshToken,...await executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams:new URLSearchParams({grant_type:"refresh_token",refresh_token:refreshToken}),clientInformation,addClientAuthentication,resource,fetchFn})}}async function fetchToken(provider,authorizationServerUrl,{metadata,resource,authorizationCode,iss,scope,fetchFn}={}){if(authorizationCode!==void 0)validateAuthorizationResponseIssuer({iss,expectedIssuer:metadata?.issuer,issParameterSupported:isIssParameterSupported(metadata)});const effectiveScope=scope??provider.clientMetadata.scope;let tokenRequestParams;if(provider.prepareTokenRequest)tokenRequestParams=await provider.prepareTokenRequest(effectiveScope);if(!tokenRequestParams){if(!authorizationCode)throw new Error("Either provider.prepareTokenRequest() or authorizationCode is required");if(!provider.redirectUrl)throw new Error("redirectUrl is required for authorization_code flow");tokenRequestParams=prepareAuthorizationCodeRequest(authorizationCode,await provider.codeVerifier(),provider.redirectUrl)}const clientInformation=await provider.clientInformation({issuer:metadata?.issuer??String(authorizationServerUrl)});return executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation:clientInformation??void 0,addClientAuthentication:provider.addClientAuthentication,resource,fetchFn})}async function registerClient(authorizationServerUrl,{metadata,clientMetadata,scope,fetchFn}){let registrationUrl;if(metadata){if(!metadata.registration_endpoint)throw new Error("Incompatible auth server: does not support dynamic client registration");registrationUrl=new URL(metadata.registration_endpoint)}else registrationUrl=new URL("/register",authorizationServerUrl);const submittedMetadata={...clientMetadata,...scope===void 0?{}:{scope}};const response=await(fetchFn??fetch)(registrationUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(submittedMetadata)});if(!response.ok)throw new RegistrationRejectedError({status:response.status,body:await response.text(),submittedMetadata});return OAuthClientInformationFullSchema.parse(await response.json())}var CAP_EXEMPT_METHODS=new Set(["tools/list","prompts/list","resources/list","resources/templates/list","server/discover"]);var InMemoryResponseCacheStore=class{_entries=new Map;_maxEntries;_stamp=0;_cappedSize=0;constructor(options){this._maxEntries=options?.maxEntries??512}get size(){return this._entries.size}get(key){return this._entries.get(keyOf(key))}set(key,entry){const k=keyOf(key);const exempt=CAP_EXEMPT_METHODS.has(key.method);const isNew=!this._entries.has(k);if(!exempt&&isNew&&this._maxEntries>0&&this._cappedSize>=this._maxEntries){for(const oldKey of this._entries.keys())if(!CAP_EXEMPT_METHODS.has(oldKey.slice(0,oldKey.indexOf("\0")))){this._entries.delete(oldKey);this._cappedSize--;break}}const stamp=++this._stamp;this._entries.set(k,{...entry,stamp});if(isNew&&!exempt)this._cappedSize++;return stamp}delete(key){if(this._entries.delete(keyOf(key))&&!CAP_EXEMPT_METHODS.has(key.method))this._cappedSize--}evict(method){const prefix=`${method}\0`;const exempt=CAP_EXEMPT_METHODS.has(method);for(const k of this._entries.keys())if(k.startsWith(prefix)){this._entries.delete(k);if(!exempt)this._cappedSize--}}clear(){this._entries.clear();this._cappedSize=0}};function keyOf(key){return`${key.method}\0${JSON.stringify([key.partition??"",key.params??""])}`}function genKey(method,params){return params===void 0?method:`${method}\0${params}`}var MAX_CACHE_TTL_MS=864e5;var ClientResponseCache=class{_evictionGeneration=new Map;_toolIndex;_toolOutputValidatorIndex;_serverIdentity="";constructor(_store,_isUserSupplied,_reportError=()=>{},_cachePartition="",_now=Date.now){this._store=_store;this._isUserSupplied=_isUserSupplied;this._reportError=_reportError;this._cachePartition=_cachePartition;this._now=_now}now(){return this._now()}setServerIdentity(identity){this._serverIdentity=identity}_partitionFor(scope){return JSON.stringify([this._serverIdentity,scope==="public"?"":this._cachePartition])}async _probe(method,params){const key={method,params:params??""};const ownPartition=this._partitionFor("private");const own=await this._store.get({...key,partition:ownPartition});if(own!==void 0)return own;const sharedPartition=this._partitionFor("public");if(sharedPartition===ownPartition)return void 0;const shared=await this._store.get({...key,partition:sharedPartition});return shared?.scope==="public"?shared:void 0}async evict(method){this._evictionGeneration.set(method,(this._evictionGeneration.get(method)??0)+1);await this._deleteBoth(method,"")}async _deleteBoth(method,params){const ownPartition=this._partitionFor("private");const sharedPartition=this._partitionFor("public");try{await this._store.delete({method,params,partition:ownPartition})}catch(error51){this._reportError(error51)}if(sharedPartition!==ownPartition)try{await this._store.delete({method,params,partition:sharedPartition})}catch(error51){this._reportError(error51)}}async evictKey(method,params){const gk=genKey(method,params);const current=this._evictionGeneration.get(gk);if(current!==void 0)this._evictionGeneration.set(gk,current+1);await this._deleteBoth(method,params)}captureGeneration(method,params){const gk=genKey(method,params);const current=this._evictionGeneration.get(gk)??0;this._evictionGeneration.set(gk,current);return current}async write(method,value,capturedGen,freshness){if((this._evictionGeneration.get(genKey(method,freshness?.params))??0)!==capturedGen)return;const params=freshness?.params??"";const ownPartition=this._partitionFor("private");const sharedPartition=this._partitionFor("public");const partition=(freshness?.scope??"private")==="public"?sharedPartition:ownPartition;try{await this._store.set({method,params,partition},{value:encodeCacheValue(value),expiresAt:freshness?.expiresAt,scope:freshness?.scope})}catch(error51){this._reportError(error51)}if(sharedPartition!==ownPartition)try{await this._store.delete({method,params,partition:partition===ownPartition?sharedPartition:ownPartition})}catch(error51){this._reportError(error51)}}async read(method,params){const entry=await this._probe(method,params);if(entry?.expiresAt===void 0||!(entry.expiresAt>this.now()))return void 0;try{const parsed=JSON.parse(entry.value);if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))throw new TypeError("cached document is not an object");return{value:parsed}}catch(error51){this._reportError(error51);await this._deleteBoth(method,params??"");return}}resetForReconnect(){if(!this._isUserSupplied)this._store.clear();this._evictionGeneration.clear();this._toolIndex=void 0;this._toolOutputValidatorIndex=void 0;this._serverIdentity=""}async toolDefinition(name){const entry=await this._probe("tools/list");if(entry===void 0){this._toolIndex=void 0;return}if(this._toolIndex?.stamp!==entry.stamp){const list=this._decodeListTools(entry);const byName=new Map;if(list!==void 0)for(const tool of list.tools)byName.set(tool.name,tool);this._toolIndex={stamp:entry.stamp,byName}}return this._toolIndex.byName.get(name)}async outputValidator(name,compile){const entry=await this._probe("tools/list");if(entry===void 0){this._toolOutputValidatorIndex=void 0;return}if(this._toolOutputValidatorIndex?.stamp!==entry.stamp){const list=this._decodeListTools(entry)??{tools:[]};const byName=new Map;for(const tool of list.tools){const compiled=compile(tool);if(compiled!==void 0)byName.set(tool.name,compiled)}this._toolOutputValidatorIndex={stamp:entry.stamp,byName}}return this._toolOutputValidatorIndex.byName.get(name)}_decodeListTools(entry){try{const parsed=JSON.parse(entry.value);if(!Array.isArray(parsed?.tools)||!parsed.tools.every(t=>t!==null&&typeof t==="object"))throw new TypeError("cached tools/list document has a malformed tools array");return parsed}catch(error51){this._reportError(error51);return}}};function encodeCacheValue(value){let json2;try{json2=JSON.stringify(value)}catch(error51){throw new TypeError(`cache value is not JSON-serializable: ${error51 instanceof Error?error51.message:String(error51)}`)}if(typeof json2!=="string")throw new TypeError("cache value is not JSON-serializable: it has no JSON representation");return json2}var AUTH_SEAM=Symbol.for("mcp.authSeamEscape");function markAuthSeamEscape(error51){if(typeof error51==="object"&&error51!==null||typeof error51==="function")try{Object.defineProperty(error51,AUTH_SEAM,{value:true,configurable:true})}catch{}return error51}function isAuthSeamEscape(error51){return(typeof error51==="object"&&error51!==null||typeof error51==="function")&&error51[AUTH_SEAM]===true}var UNSUPPORTED_PROTOCOL_VERSION=-32022;var NOT_PROBE_RECOGNIZED=new Set([-32001,-32020,-32021]);function classifyProbeOutcome(outcome,context){switch(outcome.kind){case"result":return classifyResult(outcome.result,context);case"rpc-error":return classifyRpcError(outcome,context);case"http-error":return classifyHttpError(outcome,context);case"network-error":return classifyNetworkError(outcome.error,context);case"auth-required":return{kind:"error",error:outcome.error};case"closed":if(context.transportKind==="stdio")return{kind:"legacy"};return classifyNetworkError(new Error("Connection closed during the version negotiation probe"),context);case"timeout":if(context.transportKind==="stdio")return{kind:"legacy"};return{kind:"error",error:new SdkError(SdkErrorCode.RequestTimeout,`Version negotiation probe timed out after ${outcome.timeoutMs}ms`,{timeout:outcome.timeoutMs})}}}function classifyResult(result,context){const parsed=codecForVersion(MODERN_WIRE_REVISION).validateResult("server/discover",result);if(!parsed.ok)return{kind:"legacy"};const supportedVersions=parsed.value.supportedVersions;const overlap=context.clientModernVersions.find(version2=>supportedVersions.includes(version2));if(overlap!==void 0)return{kind:"modern",version:overlap,discover:parsed.value};if(context.fallbackAvailable)return{kind:"legacy"};return{kind:"error",error:new UnsupportedProtocolVersionError({supported:[...supportedVersions],requested:context.requestedVersion})}}function classifyRpcError(outcome,context){const{code,message,data}=outcome;if(code===UNSUPPORTED_PROTOCOL_VERSION){const supported=parseSupportedList(data);if(supported===void 0)return{kind:"legacy"};const error51=new UnsupportedProtocolVersionError({supported,requested:parseRequested(data)??context.requestedVersion},message);const supportedModern=modernProtocolVersions(supported);const mutual=context.clientModernVersions.find(version2=>supportedModern.includes(version2));if(mutual!==void 0)return{kind:"corrective",version:mutual,error:error51};if(supportedModern.length>0)return{kind:"error",error:error51};return context.fallbackAvailable?{kind:"legacy"}:{kind:"error",error:error51}}if(NOT_PROBE_RECOGNIZED.has(code))return{kind:"legacy"};return{kind:"legacy"}}function classifyHttpError(outcome,context){if(outcome.status===401||outcome.status===403){const isDenial=outcome.status===403;return{kind:"error",error:new SdkHttpError(isDenial?SdkErrorCode.ClientHttpForbidden:SdkErrorCode.ClientHttpAuthentication,`Version negotiation failed: ${isDenial?"the server denied access (HTTP 403)":"the server requires authorization (HTTP 401)"}`,{status:outcome.status,statusText:outcome.statusText,text:outcome.body})}}if(outcome.status>=500)return{kind:"error",error:new SdkHttpError(SdkErrorCode.EraNegotiationFailed,`Version negotiation failed: the server answered the probe with HTTP ${outcome.status}`,{status:outcome.status,statusText:outcome.statusText,text:outcome.body})};const rpcError=parseJsonRpcErrorBody(outcome.body);if(rpcError!==void 0)return classifyRpcError(rpcError,context);return{kind:"legacy"}}function classifyNetworkError(error51,context){if(context.environment==="browser"&&isOpaqueFetchTypeError(error51))return{kind:"legacy"};return{kind:"error",error:new SdkError(SdkErrorCode.EraNegotiationFailed,`Version negotiation probe failed: ${describeError(error51)}`,{cause:error51})}}function isOpaqueFetchTypeError(error51){return error51 instanceof TypeError||error51 instanceof Error&&error51.name==="TypeError"}function describeError(error51){return error51 instanceof Error?error51.message:String(error51)}function parseSupportedList(data){if(typeof data!=="object"||data===null)return void 0;const supported=data.supported;if(!Array.isArray(supported)||supported.length===0||!supported.every(v=>typeof v==="string"))return;return supported}function parseRequested(data){if(typeof data!=="object"||data===null)return void 0;const requested=data.requested;return typeof requested==="string"?requested:void 0}function parseJsonRpcErrorBody(body){if(body===void 0||body==="")return void 0;let parsed;try{parsed=JSON.parse(body)}catch{return}if(typeof parsed!=="object"||parsed===null)return void 0;const error51=parsed.error;if(typeof error51!=="object"||error51===null)return void 0;const{code,message,data}=error51;if(typeof code!=="number")return void 0;return{code,message:typeof message==="string"?message:"",data}}var DEFAULT_VERSION_NEGOTIATION_MODE="legacy";function resolveVersionNegotiation(options,supportedProtocolVersionsOption){const mode=options?.mode??DEFAULT_VERSION_NEGOTIATION_MODE;if(mode==="legacy")return{kind:"legacy"};const probe=options?.probe??{};if(typeof mode==="object"){if(!isModernProtocolVersion(mode.pin))throw new TypeError(`versionNegotiation: { pin: '${mode.pin}' } is not a modern protocol revision \u2014 pinning is for 2026-07-28 and later; omit versionNegotiation (or use mode: 'legacy') for 2025-era servers.`);return{kind:"pin",version:mode.pin,probe}}const explicitModern=supportedProtocolVersionsOption?modernProtocolVersions(supportedProtocolVersionsOption):[];return{kind:"auto",modernVersions:explicitModern.length>0?explicitModern:[...SUPPORTED_MODERN_PROTOCOL_VERSIONS],fallbackAvailable:supportedProtocolVersionsOption?legacyProtocolVersions(supportedProtocolVersionsOption).length>0:true,probe}}function detectProbeEnvironment(){const g=globalThis;return g.window!==void 0&&g.document!==void 0?"browser":"node"}function detectProbeTransportKind(transport){return"stderr"in transport&&"pid"in transport?"stdio":"http"}var ProbeWindow=class ProbeWindow2{_pending;_probeCounter=0;_savedOnMessage;_savedOnError;_savedOnClose;_closeDelivered=false;constructor(_transport){this._transport=_transport;this._savedOnMessage=_transport.onmessage;this._savedOnError=_transport.onerror;this._savedOnClose=_transport.onclose}static async open(transport){const window=new ProbeWindow2(transport);transport.onmessage=message=>{const pending=window._pending;if(pending!==void 0&&(isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message))&&message.id===pending.id){window._pending=void 0;if(isJSONRPCResultResponse(message))pending.resolve({kind:"response",result:message.result});else pending.resolve({kind:"response",error:message.error});return}};transport.onerror=error51=>{window._savedOnError?.(error51)};transport.onclose=()=>{const pending=window._pending;if(pending!==void 0){window._pending=void 0;pending.resolve({kind:"closed"})}window._closeDelivered=true;window._savedOnClose?.()};try{await transport.start()}catch(error51){window.detach();throw error51}return window}async exchange(buildRequest,timeoutMs){const id=`server-discover-probe-${++this._probeCounter}`;return new Promise(resolve=>{let settled=false;const settle=reply=>{if(settled)return;settled=true;clearTimeout(timer);if(this._pending?.id===id)this._pending=void 0;resolve(reply)};const timer=setTimeout(()=>settle({kind:"timeout"}),timeoutMs);this._pending={id,resolve:settle};this._transport.send(buildRequest(id)).catch(error51=>settle({kind:"send-error",error:error51}))})}detach(){this._pending=void 0;this._transport.onmessage=this._savedOnMessage;this._transport.onerror=this._savedOnError;if(this._closeDelivered&&this._savedOnClose!==void 0){const saved=this._savedOnClose;const transport=this._transport;let spent=false;const wrapper=()=>{if(!spent){spent=true;return}saved()};transport.onclose=wrapper;pendingSpentCloseGuards.set(transport,()=>{if(transport.onclose===wrapper)transport.onclose=saved})}else this._transport.onclose=this._savedOnClose}release(){this.detach();const transport=this._transport;const originalStart=transport.start;let armed=true;transport.start=async function(){if(armed){armed=false;transport.start=originalStart;return}return originalStart.call(transport)}}};var pendingSpentCloseGuards=new WeakMap;function disarmSpentCloseGuard(transport){const disarm=pendingSpentCloseGuards.get(transport);pendingSpentCloseGuards.delete(transport);disarm?.()}function buildProbeRequest(id,protocolVersion,clientInfo,capabilities){return{jsonrpc:"2.0",id,method:"server/discover",params:{_meta:codecForVersion(protocolVersion).outboundEnvelope({protocolVersion,clientInfo,clientCapabilities:capabilities})}}}function normalizeReply(reply,timeoutMs){switch(reply.kind){case"response":return reply.error===void 0?{kind:"result",result:reply.result}:{kind:"rpc-error",...reply.error};case"send-error":{const error51=reply.error;if(isAuthSeamEscape(error51)||error51 instanceof UnauthorizedError||error51 instanceof Error&&error51.name==="UnauthorizedError")return{kind:"auth-required",error:error51};if(error51 instanceof SdkHttpError){const text=error51.data?.text;return{kind:"http-error",status:error51.data.status,body:typeof text==="string"?text:void 0,statusText:error51.data.statusText}}return{kind:"network-error",error:error51}}case"closed":return{kind:"closed"};case"timeout":return{kind:"timeout",timeoutMs}}}async function negotiateEra(negotiation,deps){const timeoutMs=negotiation.probe.timeoutMs??deps.defaultTimeoutMs;const maxRetries=Math.max(0,negotiation.probe.maxRetries??0);const clientModernVersions=negotiation.kind==="pin"?[negotiation.version]:negotiation.modernVersions;const fallbackAvailable=negotiation.kind==="auto"&&negotiation.fallbackAvailable;const window=await ProbeWindow.open(deps.transport);const probe=async()=>{let requestedVersion=clientModernVersions[0];let correctiveUsed=false;let timeoutRetriesRemaining=maxRetries;for(;;){const reply=await window.exchange(id=>buildProbeRequest(id,requestedVersion,deps.clientInfo,deps.capabilities),timeoutMs);if(reply.kind==="timeout"&&timeoutRetriesRemaining>0){timeoutRetriesRemaining--;continue}const outcome=normalizeReply(reply,timeoutMs);const verdict=classifyProbeOutcome(outcome,{clientModernVersions,requestedVersion,fallbackAvailable,environment:deps.environment,transportKind:deps.transportKind});switch(verdict.kind){case"modern":return{era:"modern",version:verdict.version,discover:verdict.discover};case"corrective":if(correctiveUsed)throw verdict.error;correctiveUsed=true;requestedVersion=verdict.version;continue;case"legacy":{const closedCause=outcome.kind==="closed"?"the connection closed during the server/discover probe":void 0;if(negotiation.kind==="pin")throw new SdkError(SdkErrorCode.EraNegotiationFailed,closedCause===void 0?`Version negotiation failed: the server did not offer pinned protocol version ${negotiation.version} via server/discover (no fallback in pin mode)`:`Version negotiation failed: ${closedCause} before the server offered pinned protocol version ${negotiation.version} (no fallback in pin mode)`);if(!negotiation.fallbackAvailable)throw new SdkError(SdkErrorCode.EraNegotiationFailed,closedCause===void 0?"Version negotiation failed: the server gave no modern evidence and this client supports no pre-2026-07-28 protocol version to fall back to":`Version negotiation failed: ${closedCause} and this client supports no pre-2026-07-28 protocol version to fall back to`);if(closedCause!==void 0&&deps.disposableProbe!==true)throw new SdkError(SdkErrorCode.EraNegotiationFailed,`Version negotiation failed: ${closedCause} (this transport probed in place \u2014 the disposable sibling probe requires the SDK's base StdioClientTransport)`);return{era:"legacy"}}case"error":throw verdict.error}}};let result;try{result=await probe()}catch(error51){window.detach();throw error51}window.release();return result}function readStdioServerParams(transport){const proto=Object.getPrototypeOf(transport);if(proto===null||!Object.prototype.hasOwnProperty.call(proto,"_dispose"))return;const params=transport._serverParams;return typeof params==="object"&¶ms!==null&&typeof params.command==="string"?params:void 0}async function negotiateStdioViaSibling(negotiation,sessionTransport,params,deps){const SiblingTransport=sessionTransport.constructor;const sibling2=new SiblingTransport({...params,stderr:"ignore"});const originalClose=sessionTransport.close;let callerClosed=false;let signalClosed;const closedSignal=new Promise((_,reject)=>{signalClosed=()=>reject(callerCloseAbortError())});sessionTransport.close=async function(){callerClosed=true;signalClosed?.();return originalClose.call(sessionTransport)};let result;try{const negotiated=negotiateEra(negotiation,{...deps,transport:sibling2,transportKind:"stdio",disposableProbe:true});negotiated.catch(()=>{});result=await Promise.race([negotiated,closedSignal])}finally{await disposeSibling(sibling2);sessionTransport.close=originalClose}if(callerClosed)throw callerCloseAbortError();return result}function callerCloseAbortError(){return new SdkError(SdkErrorCode.EraNegotiationFailed,"Version negotiation failed: the transport was closed during the server/discover probe")}async function disposeSibling(sibling2){try{const dispose=sibling2._dispose;await(typeof dispose==="function"?dispose.call(sibling2):sibling2.close())}catch{}}function serverInfoFromDiscover(discover){const fromMeta=discover._meta?.[SERVER_INFO_META_KEY];return isSpecType.Implementation(fromMeta)?fromMeta:void 0}function applyElicitationDefaults(schema,data){if(!schema||data===null||typeof data!=="object")return;if(schema.type==="object"&&schema.properties&&typeof schema.properties==="object"){const obj=data;const props=schema.properties;for(const key of Object.keys(props)){const propSchema=props[key];if(obj[key]===void 0&&Object.prototype.hasOwnProperty.call(propSchema,"default"))obj[key]=propSchema.default;if(obj[key]!==void 0)applyElicitationDefaults(propSchema,obj[key])}}if(Array.isArray(schema.anyOf)){for(const sub of schema.anyOf)if(typeof sub!=="boolean")applyElicitationDefaults(sub,data)}if(Array.isArray(schema.oneOf)){for(const sub of schema.oneOf)if(typeof sub!=="boolean")applyElicitationDefaults(sub,data)}}function getSupportedElicitationModes(capabilities){if(!capabilities)return{supportsFormMode:false,supportsUrlMode:false};const hasFormCapability=capabilities.form!==void 0;const hasUrlCapability=capabilities.url!==void 0;return{supportsFormMode:hasFormCapability||!hasFormCapability&&!hasUrlCapability,supportsUrlMode:hasUrlCapability}}function validatePrior(prior){if(typeof prior==="object"&&prior!==null){if(prior.kind==="legacy"&&!("supportedVersions"in prior)&&!("discover"in prior))return prior;if(prior.kind==="modern"&&DiscoverResultSchema.safeParse(prior.discover).success)return prior}throw new SdkError(SdkErrorCode.EraNegotiationFailed,"connect({ prior }): unrecognized prior \u2014 expected { kind: 'modern', discover } or { kind: 'legacy' }")}var LIST_CHANGED_EVICTIONS={"notifications/tools/list_changed":["tools/list"],"notifications/prompts/list_changed":["prompts/list"],"notifications/resources/list_changed":["resources/list","resources/templates/list"]};var DEFAULT_LIST_MAX_PAGES=64;var Client=class extends Protocol{_serverCapabilities;_serverVersion;_capabilities;_instructions;_jsonSchemaValidator;_cache;_defaultCacheTtlMs;_listMaxPages;_listChangedDebounceTimers=new Map;_listChangedConfig;_enforceStrictCapabilities;_versionNegotiation;_supportedProtocolVersionsOption;_inputRequiredDriverConfig;_listenState=new Map;_nextListenId=0;_autoOpenedSubscription;_discoverResult;_resetConnectionState(){this._negotiatedProtocolVersion=void 0;this._serverCapabilities=void 0;this._serverVersion=void 0;this._instructions=void 0;this._discoverResult=void 0;this._autoOpenedSubscription=void 0;if(this._listenState.size>0){const reason=new SdkError(SdkErrorCode.ConnectionClosed,"subscriptions/listen: client reconnected or closed; subscription state from the previous connection was reset");for(const entry of this._listenState.values())entry.settle({cause:"remote",error:reason})}this._listenState.clear();for(const timer of this._listChangedDebounceTimers.values())clearTimeout(timer);this._listChangedDebounceTimers.clear();this._cache.resetForReconnect()}async close(){try{await super.close()}finally{this._resetConnectionState()}}constructor(_clientInfo,options){super(options);this._clientInfo=_clientInfo;this._capabilities=options?.capabilities?{...options.capabilities}:{};this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator;this._enforceStrictCapabilities=options?.enforceStrictCapabilities??false;this._versionNegotiation=options?.versionNegotiation;this._supportedProtocolVersionsOption=options?.supportedProtocolVersions;this._inputRequiredDriverConfig=resolveInputRequiredDriverConfig(options?.inputRequired);this._cache=new ClientResponseCache(options?.responseCacheStore??new InMemoryResponseCacheStore,options?.responseCacheStore!==void 0,error51=>this._reportStoreError(error51),options?.cachePartition??"");this._defaultCacheTtlMs=options?.defaultCacheTtlMs??0;this._listMaxPages=options?.listMaxPages??DEFAULT_LIST_MAX_PAGES;if(options?.listChanged)this._listChangedConfig=options.listChanged}buildContext(ctx,_transportInfo){return ctx}_shouldDropInbound(message){if(this._negotiatedProtocolVersion!==void 0&&isModernProtocolVersion(this._negotiatedProtocolVersion)&&isJSONRPCRequest(message))return"drop"}_outboundMetaEnvelope(){const version2=this._negotiatedProtocolVersion;if(version2===void 0)return void 0;return this._wireCodec().outboundEnvelope({protocolVersion:version2,clientInfo:this._clientInfo,clientCapabilities:this._capabilities})}_resolveNonCompleteResult(decoded,flow){if(!this._inputRequiredDriverConfig.autoFulfill)return Promise.reject(new SdkError(SdkErrorCode.UnsupportedResultType,`Unsupported result type 'input_required' for ${flow.request.method}: multi-round-trip auto-fulfilment is not enabled on this instance \u2014 pass allowInputRequired: true to handle it manually, or enable inputRequired.autoFulfill`,{resultType:"input_required",method:flow.request.method}));return runInputRequiredFlow({getRequestHandler:method=>this._getRequestHandler(method),buildContext:baseCtx=>this.buildContext(baseCtx,void 0),sessionId:this.transport?.sessionId},this._inputRequiredDriverConfig,decoded,flow)}_setupListChangedHandlers(config2){if(config2.tools&&this._serverCapabilities?.tools?.listChanged)this._setupListChangedHandler("tools","notifications/tools/list_changed",config2.tools,async()=>{return(await this.listTools(void 0,{cacheMode:"refresh"})).tools});if(config2.prompts&&this._serverCapabilities?.prompts?.listChanged)this._setupListChangedHandler("prompts","notifications/prompts/list_changed",config2.prompts,async()=>{return(await this.listPrompts(void 0,{cacheMode:"refresh"})).prompts});if(config2.resources&&this._serverCapabilities?.resources?.listChanged)this._setupListChangedHandler("resources","notifications/resources/list_changed",config2.resources,async()=>{return(await this.listResources(void 0,{cacheMode:"refresh"})).resources})}registerCapabilities(capabilities){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setVersionNegotiation(options){if(this.transport)throw new Error("Cannot configure version negotiation after connecting to transport");this._versionNegotiation=options}_wrapHandler(method,handler){if(method==="elicitation/create")return async(request,ctx)=>{const codec2=codecForVersion(this._negotiatedProtocolVersion);let validatedRequest=codec2.validateRequest("elicitation/create",request);if(!validatedRequest.ok&&validatedRequest.reason==="not-in-era")validatedRequest=codec2.validateInputRequest("elicitation/create",request);if(!validatedRequest.ok)throw new ProtocolError(validatedRequest.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validatedRequest.reason==="not-in-era"?"No wire schema for elicitation/create in the resolved era":`Invalid elicitation request: ${validatedRequest.message}`);const{params}=validatedRequest.value;params.mode=params.mode??"form";const{supportsFormMode,supportsUrlMode}=getSupportedElicitationModes(this._capabilities.elicitation);if(params.mode==="form"&&!supportsFormMode)throw new ProtocolError(ProtocolErrorCode.InvalidParams,"Client does not support form-mode elicitation requests");if(params.mode==="url"&&!supportsUrlMode)throw new ProtocolError(ProtocolErrorCode.InvalidParams,"Client does not support URL-mode elicitation requests");const result=await handler(request,ctx);let validationResult=codec2.validateResult("elicitation/create",result);if(!validationResult.ok&&validationResult.reason==="not-in-era")validationResult=codec2.validateInputResponse("elicitation/create",result);if(!validationResult.ok)throw new ProtocolError(validationResult.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validationResult.reason==="not-in-era"?"No wire schema for elicitation/create in the resolved era":`Invalid elicitation result: ${validationResult.message}`);const validatedResult=validationResult.value;const requestedSchema=params.mode==="form"?params.requestedSchema:void 0;if(params.mode==="form"&&validatedResult.action==="accept"&&validatedResult.content&&requestedSchema&&this._capabilities.elicitation?.form?.applyDefaults)try{applyElicitationDefaults(requestedSchema,validatedResult.content)}catch{}return validatedResult};if(method==="sampling/createMessage")return async(request,ctx)=>{const codec2=codecForVersion(this._negotiatedProtocolVersion);let validatedRequest=codec2.validateRequest("sampling/createMessage",request);if(!validatedRequest.ok&&validatedRequest.reason==="not-in-era")validatedRequest=codec2.validateInputRequest("sampling/createMessage",request);if(!validatedRequest.ok)throw new ProtocolError(validatedRequest.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validatedRequest.reason==="not-in-era"?"No wire schema for sampling/createMessage in the resolved era":`Invalid sampling request: ${validatedRequest.message}`);const{params}=validatedRequest.value;const result=await handler(request,ctx);const hasTools=Boolean(params.tools||params.toolChoice);let validatedResult=codec2.samplingResultVariant(hasTools,result);if(!validatedResult.ok&&validatedResult.reason==="not-in-era")validatedResult=codec2.validateInputResponse("sampling/createMessage",result);if(!validatedResult.ok)throw new ProtocolError(validatedResult.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validatedResult.reason==="not-in-era"?"No result schema for sampling/createMessage in the resolved era":`Invalid sampling result: ${validatedResult.message}`);return validatedResult.value};return handler}assertCapability(capability,method){if(!this._serverCapabilities?.[capability])throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support ${capability} (required for ${method})`)}async connect(transport,options){if(options?.prior!=null)return this._connectFromPrior(transport,validatePrior(options.prior),options);const negotiation=resolveVersionNegotiation(this._versionNegotiation,this._supportedProtocolVersionsOption);if(negotiation.kind!=="legacy")return this._connectNegotiated(transport,negotiation,options);return this._connectPlainLegacy(transport,options)}async _connectPlainLegacy(transport,options){await super.connect(transport);if(transport.sessionId!==void 0){const negotiatedProtocolVersion=this._negotiatedProtocolVersion;if(negotiatedProtocolVersion!==void 0)transport.setProtocolVersion?.(negotiatedProtocolVersion);return}this._resetConnectionState();await this._legacyHandshake(transport,options)}async _legacyHandshake(transport,options){const legacyVersions=legacyProtocolVersions(this._supportedProtocolVersions);try{const offeredVersion=legacyVersions[0];if(offeredVersion===void 0)throw new SdkError(SdkErrorCode.EraNegotiationFailed,"Cannot run the initialize handshake: supportedProtocolVersions contains no pre-2026-07-28 protocol version");const result=await this.request({method:"initialize",params:{protocolVersion:offeredVersion,capabilities:this._capabilities,clientInfo:this._clientInfo}},options);if(result===void 0)throw new Error(`Server sent invalid initialize result: ${result}`);if(!legacyVersions.includes(result.protocolVersion))throw new Error(`Server's protocol version is not supported: ${result.protocolVersion}`);this._serverCapabilities=result.capabilities;this._serverVersion=result.serverInfo;this._cache.setServerIdentity(this._deriveServerIdentity(transport));if(transport.setProtocolVersion)transport.setProtocolVersion(result.protocolVersion);this._instructions=result.instructions;await this.notification({method:"notifications/initialized"});this._negotiatedProtocolVersion=result.protocolVersion;if(this._listChangedConfig)this._setupListChangedHandlers(this._listChangedConfig)}catch(error51){this.close();throw error51}}async _connectNegotiated(transport,negotiation,options){if(transport.sessionId!==void 0){await super.connect(transport);const negotiatedProtocolVersion=this._negotiatedProtocolVersion;if(negotiatedProtocolVersion!==void 0&&transport.setProtocolVersion)transport.setProtocolVersion(negotiatedProtocolVersion);return}this._resetConnectionState();let result;try{const transportKind=detectProbeTransportKind(transport);const baseDeps={clientInfo:this._clientInfo,capabilities:this._capabilities,environment:detectProbeEnvironment(),defaultTimeoutMs:options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC};const stdioParams=transportKind==="stdio"?readStdioServerParams(transport):void 0;result=stdioParams===void 0?await negotiateEra(negotiation,{...baseDeps,transport,transportKind}):await negotiateStdioViaSibling(negotiation,transport,stdioParams,baseDeps)}catch(error51){await transport.close().catch(()=>{});disarmSpentCloseGuard(transport);throw error51}disarmSpentCloseGuard(transport);await super.connect(transport);if(result.era==="legacy"){await this._legacyHandshake(transport,options);return}this._serverCapabilities=result.discover.capabilities;this._serverVersion=serverInfoFromDiscover(result.discover);this._cache.setServerIdentity(this._deriveServerIdentity(transport));this._instructions=result.discover.instructions;this._discoverResult=result.discover;this._negotiatedProtocolVersion=result.version;if(transport.setProtocolVersion)transport.setProtocolVersion(result.version);if(this._listChangedConfig){const config2=this._listChangedConfig;const advertised=this._serverCapabilities;const effective={...config2.tools&&advertised?.tools?.listChanged&&{tools:config2.tools},...config2.prompts&&advertised?.prompts?.listChanged&&{prompts:config2.prompts},...config2.resources&&advertised?.resources?.listChanged&&{resources:config2.resources}};let handlersRegistered=true;try{this._setupListChangedHandlers(effective)}catch(error51){handlersRegistered=false;this.onerror?.(error51 instanceof Error?error51:new Error(String(error51)))}const filter=handlersRegistered?{...effective.tools&&{toolsListChanged:true},...effective.prompts&&{promptsListChanged:true},...effective.resources&&{resourcesListChanged:true}}:{};if(Object.keys(filter).length>0){const ackAbort=new AbortController;const onConnectAbort=()=>ackAbort.abort(options?.signal?.reason);if(options?.signal?.aborted)onConnectAbort();options?.signal?.addEventListener("abort",onConnectAbort);try{this._autoOpenedSubscription=await this.listen(filter,{timeout:options?.timeout,signal:ackAbort.signal})}catch(error51){if(options?.signal?.aborted){await this.close().catch(()=>{});throw error51}this.onerror?.(error51 instanceof Error?error51:new Error(String(error51)))}finally{options?.signal?.removeEventListener("abort",onConnectAbort)}}}}async _connectFromPrior(transport,prior,options){if(prior.kind==="legacy")return this._connectPlainLegacy(transport,options);const discover=prior.discover;this._resetConnectionState();const explicit=this._supportedProtocolVersionsOption;const version2=(explicit&&modernProtocolVersions(explicit).length>0?modernProtocolVersions(explicit):SUPPORTED_MODERN_PROTOCOL_VERSIONS).find(v=>discover.supportedVersions.includes(v));if(version2===void 0)throw new SdkError(SdkErrorCode.EraNegotiationFailed,"connect({ prior }) with a modern verdict requires a 2026-07-28+ mutual protocol version; the supplied DiscoverResult and this client's supportedProtocolVersions have no modern overlap. For a server known to be legacy, pass prior: { kind: 'legacy' } to skip the probe and initialize directly, or use versionNegotiation: { mode: 'auto' } to re-probe with legacy fallback.");await super.connect(transport);this._discoverResult=discover;this._serverCapabilities=discover.capabilities;this._serverVersion=serverInfoFromDiscover(discover);this._cache.setServerIdentity(this._deriveServerIdentity(transport));this._instructions=discover.instructions;this._negotiatedProtocolVersion=version2;transport.setProtocolVersion?.(version2);if(this._listChangedConfig)try{this._setupListChangedHandlers(this._listChangedConfig)}catch(error51){this.onerror?.(error51 instanceof Error?error51:new Error(String(error51)))}}getServerCapabilities(){return this._serverCapabilities}getServerVersion(){return this._serverVersion}_deriveServerIdentity(transport){const v=this._serverVersion;if(v!==void 0)return`${v.name}@${v.version}`;return transport.sessionId??`anonymous:${Date.now()}-${Math.random().toString(36).slice(2)}`}getNegotiatedProtocolVersion(){return this._negotiatedProtocolVersion}getProtocolEra(){const version2=this._negotiatedProtocolVersion;if(version2===void 0)return void 0;return isModernProtocolVersion(version2)?"modern":"legacy"}getInstructions(){return this._instructions}getDiscoverResult(){return this._discoverResult}assertCapabilityForMethod(method){switch(method){case"logging/setLevel":if(!this._serverCapabilities?.logging)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support logging (required for ${method})`);break;case"prompts/get":case"prompts/list":if(!this._serverCapabilities?.prompts)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support prompts (required for ${method})`);break;case"resources/list":case"resources/templates/list":case"resources/read":case"resources/subscribe":case"resources/unsubscribe":if(!this._serverCapabilities?.resources)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support resources (required for ${method})`);if(method==="resources/subscribe"&&!this._serverCapabilities.resources.subscribe)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support resource subscriptions (required for ${method})`);break;case"tools/call":case"tools/list":if(!this._serverCapabilities?.tools)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support tools (required for ${method})`);break;case"completion/complete":if(!this._serverCapabilities?.completions)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support completions (required for ${method})`);break;case"initialize":break;case"server/discover":break;case"ping":break}}assertNotificationCapability(method){switch(method){case"notifications/roots/list_changed":if(!this._capabilities.roots?.listChanged)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support roots list changed notifications (required for ${method})`);break;case"notifications/initialized":break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method){switch(method){case"sampling/createMessage":if(!this._capabilities.sampling)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support sampling capability (required for ${method})`);break;case"elicitation/create":if(!this._capabilities.elicitation)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support elicitation capability (required for ${method})`);break;case"roots/list":if(!this._capabilities.roots)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support roots capability (required for ${method})`);break;case"ping":break}}async ping(options){return this.request({method:"ping"},options)}async discover(options){const result=await this._requestWithSchema({method:"server/discover"},DiscoverResultSchema,options);this._discoverResult=result;return result}async complete(params,options){return this.request({method:"completion/complete",params},options)}async setLoggingLevel(level,options){return this.request({method:"logging/setLevel",params:{level}},options)}async getPrompt(params,options){return this.request({method:"prompts/get",params},options)}async listPrompts(params,options){if(!this._serverCapabilities?.prompts&&!this._enforceStrictCapabilities){console.debug("Client.listPrompts() called but server does not advertise prompts capability - returning empty list");return{prompts:[]}}if(params?.cursor!==void 0)return this.request({method:"prompts/list",params},options);const hit=await this._serveFromCache("prompts/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("prompts/list",params,options,(acc,page)=>acc.prompts.push(...page.prompts))}async listResources(params,options){if(!this._serverCapabilities?.resources&&!this._enforceStrictCapabilities){console.debug("Client.listResources() called but server does not advertise resources capability - returning empty list");return{resources:[]}}if(params?.cursor!==void 0)return this.request({method:"resources/list",params},options);const hit=await this._serveFromCache("resources/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("resources/list",params,options,(acc,page)=>acc.resources.push(...page.resources))}async listResourceTemplates(params,options){if(!this._serverCapabilities?.resources&&!this._enforceStrictCapabilities){console.debug("Client.listResourceTemplates() called but server does not advertise resources capability - returning empty list");return{resourceTemplates:[]}}if(params?.cursor!==void 0)return this.request({method:"resources/templates/list",params},options);const hit=await this._serveFromCache("resources/templates/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("resources/templates/list",params,options,(acc,page)=>acc.resourceTemplates.push(...page.resourceTemplates))}async _listAllPages(method,baseParams,options,append,finalize2){const bypass=options?.cacheMode==="bypass";const generation=this._cache.captureGeneration(method);const acc=await this.request({method,...baseParams&&{params:{...baseParams}}},options);let cursor=acc.nextCursor;const seen=new Set;let pages=1;while(cursor!==void 0&&!seen.has(cursor)){if(this._listMaxPages!==0&&pages>=this._listMaxPages)throw new SdkError(SdkErrorCode.ListPaginationExceeded,`${method}: exceeded listMaxPages (${this._listMaxPages}); server pagination did not terminate`,{method,listMaxPages:this._listMaxPages});seen.add(cursor);const page=await this.request({method,params:{...baseParams,cursor}},options);append(acc,page);cursor=page.nextCursor;pages++}delete acc.nextCursor;finalize2?.(acc);if(bypass)return acc;await this._cache.write(method,acc,generation,this._freshness(acc));return acc}_freshness(result,params){const body=result;const ttlMs=typeof body.ttlMs==="number"?body.ttlMs:this._defaultCacheTtlMs;const scope=body.cacheScope==="public"?"public":"private";return{expiresAt:this._cache.now()+Math.min(Math.max(0,ttlMs),MAX_CACHE_TTL_MS),scope,params}}async _serveFromCache(method,params,options){if(options?.cacheMode==="bypass"||options?.cacheMode==="refresh")return void 0;const hit=await this._cache.read(method,params).catch(error51=>void this._reportStoreError(error51));if(hit!==void 0){if(options?.signal?.aborted){const reason=options.signal.reason;throw reason instanceof SdkError?reason:new SdkError(SdkErrorCode.RequestTimeout,String(reason))}return hit.value}}_reportStoreError(e){this.onerror?.(e instanceof Error?e:new Error(String(e)))}_compileOutputValidator(tool){if(!tool.outputSchema)return void 0;try{return{ok:true,validator:this._jsonSchemaValidator.getValidator(tool.outputSchema)}}catch(error51){return{ok:false,compileError:error51}}}async _resolveXMcpHeaderScan(name,override){const tool=override??await this._cache.toolDefinition(name);return tool===void 0?void 0:scanXMcpHeaderDeclarations(tool.inputSchema)}async readResource(params,options){const hit=await this._serveFromCache("resources/read",params.uri,options);if(hit!==void 0)return hit;const generation=this._cache.captureGeneration("resources/read",params.uri);const result=await this.request({method:"resources/read",params},options);if(options?.cacheMode!=="bypass"){const freshness=this._freshness(result,params.uri);if(freshness.expiresAt>this._cache.now())await this._cache.write("resources/read",result,generation,freshness);else if(options?.cacheMode==="refresh")await this._cache.evictKey("resources/read",params.uri)}return result}async subscribeResource(params,options){return this.request({method:"resources/subscribe",params},options)}async unsubscribeResource(params,options){return this.request({method:"resources/unsubscribe",params},options)}async listen(filter,options){if(this.transport===void 0)throw new SdkError(SdkErrorCode.NotConnected,"Not connected");const negotiated=this._negotiatedProtocolVersion;if(negotiated===void 0||!isModernProtocolVersion(negotiated))throw new SdkError(SdkErrorCode.MethodNotSupportedByProtocolVersion,`subscriptions/listen requires a 2026-07-28-era connection (negotiated: ${negotiated??"none"}). On a 2025-era connection, change notifications are delivered unsolicited: use ClientOptions.listChanged and resources/subscribe instead.`,{method:"subscriptions/listen",protocolVersion:negotiated});if(options?.signal?.aborted){const reason=options.signal.reason;throw reason instanceof SdkError?reason:new SdkError(SdkErrorCode.RequestTimeout,String(reason))}const requestAbort=new AbortController;const listenId=`listen:${this._nextListenId++}`;let state="opening";let ackTimer;let onCallerAbort;let resolveOpening;let rejectOpening;const opening=new Promise((resolve,reject)=>{resolveOpening=resolve;rejectOpening=reject});let resolveClosed;const closed=new Promise(resolve=>{resolveClosed=resolve});const settle=outcome=>{if(state==="closed")return;const wasOpening=state==="opening";if(ackTimer!==void 0){clearTimeout(ackTimer);ackTimer=void 0}if("ack"in outcome){state="open";resolveOpening(outcome.ack);return}state="closed";if(onCallerAbort!==void 0)options?.signal?.removeEventListener("abort",onCallerAbort);this._listenState.delete(listenId);requestAbort.abort();resolveClosed(outcome.cause);if(wasOpening)rejectOpening(outcome.error??new SdkError(SdkErrorCode.ConnectionClosed,"subscriptions/listen closed before the server acknowledged"))};const wireTeardown=async()=>{requestAbort.abort();await this.notification({method:"notifications/cancelled",params:{requestId:listenId}}).catch(()=>{})};const close=async()=>{if(state==="closed")return;settle({cause:"local"});await wireTeardown()};this._listenState.set(listenId,{settle});const ackTimeout=options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC;ackTimer=setTimeout(()=>{settle({cause:"remote",error:new SdkError(SdkErrorCode.RequestTimeout,"subscriptions/listen ack timed out",{timeout:ackTimeout})});wireTeardown().catch(()=>{})},ackTimeout);if(options?.signal){const callerSignal=options.signal;onCallerAbort=()=>{if(state==="closed")return;const reason=callerSignal.reason;settle({cause:"local",error:reason instanceof Error?reason:new Error(String(reason??"Aborted"))});wireTeardown().catch(()=>{})};callerSignal.addEventListener("abort",onCallerAbort,{once:true})}const jsonrpcRequest={jsonrpc:"2.0",id:listenId,method:"subscriptions/listen",params:{_meta:{...this._outboundMetaEnvelope()},notifications:filter}};try{await this.transport.send(jsonrpcRequest,{requestSignal:requestAbort.signal,onRequestStreamEnd:()=>settle({cause:"remote",error:new Error("subscriptions/listen: stream ended")})})}catch(error51){settle({cause:"remote",error:error51 instanceof Error?error51:new Error(String(error51))})}return{honoredFilter:await opening,close,closed}}get autoOpenedSubscription(){return this._autoOpenedSubscription}_onnotification(raw,extra){const evicted=Object.hasOwn(LIST_CHANGED_EVICTIONS,raw.method)?LIST_CHANGED_EVICTIONS[raw.method]:void 0;if(raw.method==="notifications/resources/updated"){const uri=raw.params?.uri;if(typeof uri==="string")this._cache.evictKey("resources/read",uri)}else if(evicted!==void 0)for(const method of evicted)this._cache.evict(method);if(raw.method==="notifications/subscriptions/acknowledged"){const subscriptionId=raw.params?._meta?.[SUBSCRIPTION_ID_META_KEY];const entry=typeof subscriptionId==="string"?this._listenState.get(subscriptionId):void 0;if(entry!==void 0){const honored=this._wireCodec().validateNotification("notifications/subscriptions/acknowledged",raw);entry.settle({ack:honored.ok?honored.value.params.notifications:{}});return}}if(raw.method==="notifications/cancelled"){const cancelledId=raw.params?.requestId;const entry=typeof cancelledId==="string"?this._listenState.get(cancelledId):void 0;if(entry!==void 0){entry.settle({cause:"remote",error:new Error("subscriptions/listen: server cancelled the subscription")});return}}super._onnotification(raw,extra)}_onresponse(response){const id=response.id;const entry=typeof id==="string"?this._listenState.get(id):void 0;if(entry!==void 0){if(isJSONRPCErrorResponse(response))entry.settle({cause:"remote",error:ProtocolError.fromError(response.error.code,response.error.message,response.error.data)});else entry.settle({cause:"graceful",error:new SdkError(SdkErrorCode.ConnectionClosed,"subscriptions/listen: server closed the subscription gracefully before acknowledging")});return}super._onresponse(response)}_onclose(){if(this._listenState.size>0){const reason=new SdkError(SdkErrorCode.ConnectionClosed,"Connection closed");for(const entry of this._listenState.values())entry.settle({cause:"remote",error:reason});this._listenState.clear()}super._onclose()}async callTool(params,options){const mirroringActive=this.getProtocolEra()==="modern"&&detectProbeEnvironment()!=="browser";const buildSendOptions=async()=>{if(!mirroringActive)return options;let scan;try{scan=await this._resolveXMcpHeaderScan(params.name,options?.toolDefinition)}catch(error51){this._reportStoreError(error51)}if(!scan?.valid||scan.declarations.length===0)return options;const paramHeaders=buildMcpParamHeaders(scan.declarations,params.arguments);return Object.keys(paramHeaders).length===0?options:{...options,headers:{...options?.headers,...paramHeaders}}};let compiled=options?.toolDefinition===void 0?await this._cache.outputValidator(params.name,tool=>this._compileOutputValidator(tool)).catch(error51=>void this._reportStoreError(error51)):this._compileOutputValidator(options.toolDefinition);const assertCompiled=()=>{if(compiled===void 0||compiled.ok)return;const err=compiled.compileError;const message=(err instanceof Error?err.message:String(err)).slice(0,200);throw new ProtocolError(ProtocolErrorCode.InvalidParams,`Tool '${params.name}' has an invalid outputSchema: ${message}`)};assertCompiled();let result;try{result=await this.request({method:"tools/call",params},await buildSendOptions())}catch(error51){const isHeaderMismatch=error51 instanceof ProtocolError&&error51.code===HEADER_MISMATCH_ERROR_CODE;if(!mirroringActive||!isHeaderMismatch||options?.toolDefinition!==void 0)throw error51;const refreshOptions={signal:options?.signal,timeout:options?.timeout,cacheMode:"refresh"};await this._cache.evict("tools/list");await this.listTools(void 0,refreshOptions).catch(error_=>this._reportStoreError(error_));compiled=await this._cache.outputValidator(params.name,tool=>this._compileOutputValidator(tool)).catch(error_=>void this._reportStoreError(error_));assertCompiled();result=await this.request({method:"tools/call",params},await buildSendOptions())}const validator=compiled!==void 0&&compiled.ok?compiled.validator:void 0;if(validator){if(result.structuredContent===void 0&&!result.isError)throw new ProtocolError(ProtocolErrorCode.InvalidRequest,`Tool ${params.name} has an output schema but did not return structured content`);if(result.structuredContent!==void 0&&!result.isError)try{const validationResult=validator(result.structuredContent);if(!validationResult.valid)throw new ProtocolError(ProtocolErrorCode.InvalidParams,`Structured content does not match the tool's output schema: ${validationResult.errorMessage}`)}catch(error51){if(error51 instanceof ProtocolError)throw error51;throw new ProtocolError(ProtocolErrorCode.InvalidParams,`Failed to validate structured content: ${error51 instanceof Error?error51.message:String(error51)}`)}}return result}async listTools(params,options){if(!this._serverCapabilities?.tools&&!this._enforceStrictCapabilities){console.debug("Client.listTools() called but server does not advertise tools capability - returning empty list");return{tools:[]}}if(params?.cursor!==void 0){const page=await this.request({method:"tools/list",params},options);this._excludeInvalidXMcpHeaderTools(page);return page}const hit=await this._serveFromCache("tools/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("tools/list",params,options,(acc,page)=>acc.tools.push(...page.tools),acc=>this._excludeInvalidXMcpHeaderTools(acc))}_excludeInvalidXMcpHeaderTools(result){if(this.getProtocolEra()!=="modern"||!this.transport||detectProbeTransportKind(this.transport)==="stdio")return;const filtered=result.tools.filter(tool=>{const scan=scanXMcpHeaderDeclarations(tool.inputSchema);if(!scan.valid){console.warn(`[mcp-sdk] excluding tool '${tool.name}' from tools/list: invalid x-mcp-header declaration \u2014 ${scan.reason}`);return false}return true});if(filtered.length!==result.tools.length)result.tools=filtered}_setupListChangedHandler(listType,notificationMethod,options,fetcher){const parseResult=parseSchema(ListChangedOptionsBaseSchema,options);if(!parseResult.success)throw new Error(`Invalid ${listType} listChanged options: ${parseResult.error.message}`);if(typeof options.onChanged!=="function")throw new TypeError(`Invalid ${listType} listChanged options: onChanged must be a function`);const{autoRefresh,debounceMs}=parseResult.data;const{onChanged}=options;const refresh=async()=>{if(!autoRefresh){onChanged(null,null);return}try{onChanged(null,await fetcher())}catch(error51){onChanged(error51 instanceof Error?error51:new Error(String(error51)),null)}};const handler=()=>{if(debounceMs){const existingTimer=this._listChangedDebounceTimers.get(listType);if(existingTimer)clearTimeout(existingTimer);const timer=setTimeout(refresh,debounceMs);this._listChangedDebounceTimers.set(listType,timer)}else refresh()};this.setNotificationHandler(notificationMethod,handler)}async sendRootsListChanged(){return this.notification({method:"notifications/roots/list_changed"})}};var SseError=class extends Error{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.SseError"})}static[Symbol.hasInstance](value){return brandedHasInstance(this,value)}static isInstance(value){if(typeof this!=="function")throw new TypeError("isInstance must be called on the class (e.g. `SdkError.isInstance(value)`); for callbacks use `v => SdkError.isInstance(v)`");return brandedHasInstance(this,value)}constructor(code,message,event){super(`SSE error: ${message}`);this.code=code;this.event=event;stampErrorBrands(this,new.target)}};var DEFAULT_MAX_STEP_UP_RETRIES=1;var DEFAULT_STREAMABLE_HTTP_RECONNECTION_OPTIONS={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var RESERVED_REQUEST_HEADER_NAMES=new Set(["authorization","content-type","mcp-protocol-version","mcp-method","mcp-name","mcp-session-id"]);function anySignal(a,b){if(typeof AbortSignal.any==="function")return AbortSignal.any([a,b]);const controller=new AbortController;if(a.aborted)return controller.abort(a.reason),controller.signal;if(b.aborted)return controller.abort(b.reason),controller.signal;const cleanup=()=>{a.removeEventListener("abort",onA);b.removeEventListener("abort",onB)};function onA(){cleanup();controller.abort(a.reason)}function onB(){cleanup();controller.abort(b.reason)}a.addEventListener("abort",onA,{once:true});b.addEventListener("abort",onB,{once:true});return controller.signal}var StreamableHTTPClientTransport=class{_abortController;_url;_resourceMetadataUrl;_scope;_requestInit;_authProvider;_oauthProvider;_skipIssuerMetadataValidation;_fetch;_fetchWithInit;_sessionId;_reconnectionOptions;_protocolVersion;_onInsufficientScope;_maxStepUpRetries;_serverRetryMs;_reconnectionScheduler;_cancelReconnection;onclose;onerror;onmessage;hasPerRequestStream=true;constructor(url2,opts){this._url=url2;this._resourceMetadataUrl=void 0;this._scope=void 0;this._requestInit=opts?.requestInit;this._skipIssuerMetadataValidation=opts?.skipIssuerMetadataValidation;if(isOAuthClientProvider(opts?.authProvider)){this._oauthProvider=opts.authProvider;this._authProvider=adaptOAuthProvider(opts.authProvider,{skipIssuerMetadataValidation:opts.skipIssuerMetadataValidation})}else this._authProvider=opts?.authProvider;this._fetch=opts?.fetch;this._fetchWithInit=createFetchWithInit(opts?.fetch,opts?.requestInit);this._sessionId=opts?.sessionId;this._protocolVersion=opts?.protocolVersion;this._reconnectionOptions=opts?.reconnectionOptions??DEFAULT_STREAMABLE_HTTP_RECONNECTION_OPTIONS;this._reconnectionScheduler=opts?.reconnectionScheduler;this._onInsufficientScope=opts?.onInsufficientScope??"reauthorize";this._maxStepUpRetries=Math.max(0,opts?.maxStepUpRetries??DEFAULT_MAX_STEP_UP_RETRIES)}async _stepUpAuthorize(challenge,stepUpRetries){try{return await this._stepUpAuthorizeInner(challenge,stepUpRetries)}catch(error51){throw markAuthSeamEscape(error51)}}async _stepUpAuthorizeInner(challenge,stepUpRetries){if(this._onInsufficientScope==="throw")throw new InsufficientScopeError({requiredScope:challenge.scope,resourceMetadataUrl:challenge.resourceMetadataUrl,errorDescription:challenge.errorDescription});if(!this._oauthProvider)throw new InsufficientScopeError({requiredScope:challenge.scope,resourceMetadataUrl:challenge.resourceMetadataUrl,errorDescription:challenge.errorDescription});if(stepUpRetries>=this._maxStepUpRetries)throw new SdkHttpError(SdkErrorCode.ClientHttpForbidden,`Server returned 403 insufficient_scope after step-up re-authorization (retry limit ${this._maxStepUpRetries} reached)`,{status:403,statusText:challenge.statusText??"Forbidden",text:challenge.text});if(challenge.resourceMetadataUrl)this._resourceMetadataUrl=challenge.resourceMetadataUrl;const tokens=await this._oauthProvider.tokens();const unionScope=computeScopeUnion(this._scope,tokens?.scope,challenge.scope);this._scope=unionScope;const forceReauthorization=isStrictScopeSuperset(unionScope,tokens?.scope);return auth(this._oauthProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:unionScope,forceReauthorization,fetchFn:this._fetchWithInit,skipIssuerMetadataValidation:this._skipIssuerMetadataValidation})}async _commonHeaders(){const headers={};let token;try{token=await this._authProvider?.token()}catch(error51){throw markAuthSeamEscape(error51)}if(token)headers["Authorization"]=`Bearer ${token}`;if(this._sessionId)headers["mcp-session-id"]=this._sessionId;if(this._protocolVersion)headers["mcp-protocol-version"]=this._protocolVersion;const extraHeaders=normalizeHeaders(this._requestInit?.headers);return new Headers({...headers,...extraHeaders})}_applyBodyDerivedHeaders(headers,message){if(Array.isArray(message)||!isJSONRPCRequest(message))return;const envelopeVersion=message.params?._meta?.[PROTOCOL_VERSION_META_KEY];if(typeof envelopeVersion!=="string")return;headers.set("mcp-protocol-version",envelopeVersion);headers.set("mcp-method",message.method);const params=message.params;const nameHeader=message.method==="resources/read"?typeof params?.uri==="string"?params.uri:void 0:typeof params?.name==="string"?params.name:void 0;if(nameHeader!==void 0)headers.set("mcp-name",encodeMcpParamValue(nameHeader))}_isModernEnvelopedRequest(message){if(Array.isArray(message)||!isJSONRPCRequest(message))return false;const v=message.params?._meta?.[PROTOCOL_VERSION_META_KEY];return typeof v==="string"&&isModernProtocolVersion(v)}async _startOrAuthSse(options,isAuthRetry=false,stepUpRetries=0){const{resumptionToken,requestSignal}=options;const isIntentionalAbort=()=>this._abortController?.signal.aborted===true||requestSignal?.aborted===true;try{const headers=await this._commonHeaders();const types=[...headers.get("accept")?.split(",").map(s=>s.trim().toLowerCase())??[],"text/event-stream"];headers.set("accept",[...new Set(types)].join(", "));if(resumptionToken)headers.set("last-event-id",resumptionToken);const transportSignal=this._abortController?.signal;const signal=requestSignal!==void 0&&transportSignal!==void 0?anySignal(transportSignal,requestSignal):requestSignal??transportSignal;const response=await(this._fetch??fetch)(this._url,{...this._requestInit,method:"GET",headers,signal});if(!response.ok){if(response.status===401&&this._authProvider){if(response.headers.has("www-authenticate")){const{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);this._resourceMetadataUrl=resourceMetadataUrl;this._scope=computeScopeUnion(this._scope,scope)}if(this._authProvider.onUnauthorized&&!isAuthRetry){try{await this._authProvider.onUnauthorized({response,serverUrl:this._url,fetchFn:this._fetchWithInit})}catch(error51){throw markAuthSeamEscape(error51)}await response.text?.().catch(()=>{});return this._startOrAuthSse(options,true,stepUpRetries)}await response.text?.().catch(()=>{});if(isAuthRetry)throw markAuthSeamEscape(new SdkHttpError(SdkErrorCode.ClientHttpAuthentication,"Server returned 401 after re-authentication",{status:401,statusText:response.statusText}));throw markAuthSeamEscape(new UnauthorizedError)}if(response.status===403){const{resourceMetadataUrl,scope,error:error51,errorDescription}=extractWWWAuthenticateParams(response);if(error51==="insufficient_scope"){const text=await response.text?.().catch(()=>null);if(await this._stepUpAuthorize({scope,resourceMetadataUrl,errorDescription,statusText:response.statusText,text},stepUpRetries)!=="AUTHORIZED")throw markAuthSeamEscape(new UnauthorizedError);return this._startOrAuthSse(options,isAuthRetry,stepUpRetries+1)}}await response.text?.().catch(()=>{});if(response.status===405){options.onRequestStreamEnd?.();return}throw new SdkHttpError(SdkErrorCode.ClientHttpFailedToOpenStream,`Failed to open SSE stream: ${response.statusText}`,{status:response.status,statusText:response.statusText})}this._handleSseStream(response.body,options,true)}catch(error51){if(!isIntentionalAbort())this.onerror?.(error51);throw error51}}_getNextReconnectionDelay(attempt){if(this._serverRetryMs!==void 0)return this._serverRetryMs;const initialDelay=this._reconnectionOptions.initialReconnectionDelay;const growFactor=this._reconnectionOptions.reconnectionDelayGrowFactor;const maxDelay=this._reconnectionOptions.maxReconnectionDelay;return Math.min(initialDelay*Math.pow(growFactor,attempt),maxDelay)}_scheduleReconnection(options,attemptCount=0){const maxRetries=this._reconnectionOptions.maxRetries;if(attemptCount>=maxRetries){this.onerror?.(new Error(`Maximum reconnection attempts (${maxRetries}) exceeded.`));options.onRequestStreamEnd?.();return}const delay2=this._getNextReconnectionDelay(attemptCount);const reconnect=()=>{this._cancelReconnection=void 0;if(this._abortController?.signal.aborted||options.requestSignal?.aborted)return;this._startOrAuthSse(options).catch(error51=>{if(this._abortController?.signal.aborted||options.requestSignal?.aborted)return;this.onerror?.(new Error(`Failed to reconnect SSE stream: ${error51 instanceof Error?error51.message:String(error51)}`));try{this._scheduleReconnection(options,attemptCount+1)}catch(scheduleError){this.onerror?.(scheduleError instanceof Error?scheduleError:new Error(String(scheduleError)))}})};if(this._reconnectionScheduler){const cancel=this._reconnectionScheduler(reconnect,delay2,attemptCount);this._cancelReconnection=typeof cancel==="function"?cancel:void 0}else{const handle=setTimeout(reconnect,delay2);this._cancelReconnection=()=>clearTimeout(handle)}}_handleSseStream(stream,options,isReconnectable){if(!stream){options.onRequestStreamEnd?.();return}const{onresumptiontoken,replayMessageId,requestSignal,onRequestStreamEnd}=options;const isIntentionalAbort=()=>this._abortController?.signal.aborted===true||requestSignal?.aborted===true;let lastEventId;let hasPrimingEvent=false;let receivedResponse=false;const processStream=async()=>{try{const reader=stream.pipeThrough(new TextDecoderStream).pipeThrough(new EventSourceParserStream({onRetry:retryMs=>{this._serverRetryMs=retryMs}})).getReader();while(true){const{value:event,done}=await reader.read();if(done)break;if(event.id){lastEventId=event.id;hasPrimingEvent=true;onresumptiontoken?.(event.id)}if(!event.data)continue;if(!event.event||event.event==="message")try{const message=JSONRPCMessageSchema.parse(JSON.parse(event.data));if(isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message)){receivedResponse=true;if(replayMessageId!==void 0)message.id=replayMessageId}this.onmessage?.(message)}catch(error51){this.onerror?.(error51)}}if((isReconnectable||hasPrimingEvent)&&!receivedResponse&&this._abortController&&!isIntentionalAbort())this._scheduleReconnection({resumptionToken:lastEventId,onresumptiontoken,replayMessageId,requestSignal,onRequestStreamEnd},0);else if(!isIntentionalAbort())onRequestStreamEnd?.()}catch(error51){if(isIntentionalAbort())return;this.onerror?.(new Error(`SSE stream disconnected: ${error51}`));if((isReconnectable||hasPrimingEvent)&&!receivedResponse&&this._abortController&&!isIntentionalAbort())try{this._scheduleReconnection({resumptionToken:lastEventId,onresumptiontoken,replayMessageId,requestSignal,onRequestStreamEnd},0)}catch(error$1){this.onerror?.(new Error(`Failed to reconnect: ${error$1 instanceof Error?error$1.message:String(error$1)}`));onRequestStreamEnd?.()}else onRequestStreamEnd?.()}};processStream()}async start(){if(this._abortController)throw new Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth(codeOrParams,iss){if(!this._oauthProvider)throw new UnauthorizedError("finishAuth requires an OAuthClientProvider");const{authorizationCode,iss:issParam}=await resolveAuthorizationCallbackParams(codeOrParams,iss,this._oauthProvider,this._url,{fetchFn:this._fetchWithInit,resourceMetadataUrl:this._resourceMetadataUrl});if(await auth(this._oauthProvider,{serverUrl:this._url,authorizationCode,iss:issParam,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit,skipIssuerMetadataValidation:this._skipIssuerMetadataValidation})!=="AUTHORIZED")throw new UnauthorizedError("Failed to authorize")}async close(){try{this._cancelReconnection?.()}finally{this._cancelReconnection=void 0;this._abortController?.abort();this.onclose?.()}}async send(message,options){return this._send(message,options,false)}async _send(message,options,isAuthRetry,stepUpRetries=0){try{const{resumptionToken,onresumptiontoken}=options||{};if(resumptionToken){this._startOrAuthSse({resumptionToken,replayMessageId:isJSONRPCRequest(message)?message.id:void 0,requestSignal:options?.requestSignal}).catch(error51=>this.onerror?.(error51));return}const headers=await this._commonHeaders();this._applyBodyDerivedHeaders(headers,message);const isHandshake=Array.isArray(message)?message.some(m=>isInitializeRequest(m)):isInitializeRequest(message);if(isHandshake)headers.delete("mcp-session-id");if(options?.headers!==void 0)for(const[name,value]of Object.entries(options.headers)){if(RESERVED_REQUEST_HEADER_NAMES.has(name.toLowerCase()))continue;headers.set(name,value)}headers.set("content-type","application/json");const types=[...headers.get("accept")?.split(",").map(s=>s.trim().toLowerCase())??[],"application/json","text/event-stream"];headers.set("accept",[...new Set(types)].join(", "));const transportSignal=this._abortController?.signal;const signal=options?.requestSignal!==void 0&&transportSignal!==void 0?anySignal(transportSignal,options.requestSignal):options?.requestSignal??transportSignal;const init={...this._requestInit,method:"POST",headers,body:JSON.stringify(message),signal};const response=await(this._fetch??fetch)(this._url,init);if(isHandshake&&response.ok)this._sessionId=response.headers.get("mcp-session-id")||void 0;if(!response.ok){if(response.status===401&&this._authProvider){if(response.headers.has("www-authenticate")){const{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);this._resourceMetadataUrl=resourceMetadataUrl;this._scope=computeScopeUnion(this._scope,scope)}if(this._authProvider.onUnauthorized&&!isAuthRetry){try{await this._authProvider.onUnauthorized({response,serverUrl:this._url,fetchFn:this._fetchWithInit})}catch(error51){throw markAuthSeamEscape(error51)}await response.text?.().catch(()=>{});return this._send(message,options,true,stepUpRetries)}await response.text?.().catch(()=>{});if(isAuthRetry)throw markAuthSeamEscape(new SdkHttpError(SdkErrorCode.ClientHttpAuthentication,"Server returned 401 after re-authentication",{status:401,statusText:response.statusText}));throw markAuthSeamEscape(new UnauthorizedError)}const text=await response.text?.().catch(()=>null);if(response.status===403){const{resourceMetadataUrl,scope,error:error51,errorDescription}=extractWWWAuthenticateParams(response);if(error51==="insufficient_scope"){if(await this._stepUpAuthorize({scope,resourceMetadataUrl,errorDescription,statusText:response.statusText,text},stepUpRetries)!=="AUTHORIZED")throw markAuthSeamEscape(new UnauthorizedError);return this._send(message,options,isAuthRetry,stepUpRetries+1)}}if(response.status===400&&typeof text==="string"&&this._isModernEnvelopedRequest(message))try{const parsed=JSONRPCMessageSchema.parse(JSON.parse(text));const requests=(Array.isArray(message)?message:[message]).filter(m=>isJSONRPCRequest(m));if(isJSONRPCErrorResponse(parsed)&&requests.some(r=>r.id===parsed.id)){this.onmessage?.(parsed);return}}catch{}throw new SdkHttpError(SdkErrorCode.ClientHttpNotImplemented,`Error POSTing to endpoint: ${text}`,{status:response.status,statusText:response.statusText,text})}if(response.status===202){await response.text?.().catch(()=>{});if(isInitializedNotification(message))this._startOrAuthSse({resumptionToken:void 0}).catch(error51=>this.onerror?.(error51));return}const hasRequests=(Array.isArray(message)?message:[message]).some(msg=>"method"in msg&&"id"in msg&&msg.id!==void 0);const contentType=response.headers.get("content-type");const responseMediaType=mediaTypeEssence(contentType);if(hasRequests)if(responseMediaType==="text/event-stream")this._handleSseStream(response.body,{onresumptiontoken,requestSignal:options?.requestSignal,onRequestStreamEnd:options?.onRequestStreamEnd},false);else if(responseMediaType==="application/json"){const data=await response.json();const responseMessages=Array.isArray(data)?data.map(msg=>JSONRPCMessageSchema.parse(msg)):[JSONRPCMessageSchema.parse(data)];for(const msg of responseMessages)this.onmessage?.(msg)}else{await response.text?.().catch(()=>{});throw new SdkError(SdkErrorCode.ClientHttpUnexpectedContent,`Unexpected content type: ${contentType}`,{contentType})}else await response.text?.().catch(()=>{})}catch(error51){if(options?.requestSignal?.aborted!==true)this.onerror?.(error51);throw error51}}get sessionId(){return this._sessionId}async terminateSession(){if(!this._sessionId)return;try{const headers=await this._commonHeaders();const init={...this._requestInit,method:"DELETE",headers,signal:this._abortController?.signal};const response=await(this._fetch??fetch)(this._url,init);await response.text?.().catch(()=>{});if(!response.ok&&response.status!==405)throw new SdkHttpError(SdkErrorCode.ClientHttpFailedToTerminateSession,`Failed to terminate session: ${response.statusText}`,{status:response.status,statusText:response.statusText});this._sessionId=void 0}catch(error51){this.onerror?.(error51);throw error51}}setProtocolVersion(version2){this._protocolVersion=version2}get protocolVersion(){return this._protocolVersion}async resumeStream(lastEventId,options){await this._startOrAuthSse({resumptionToken:lastEventId,onresumptiontoken:options?.onresumptiontoken})}};var import_node_process2=__toESM(require("process"),1);var import_node_stream=require("stream");var import_cross_spawn=__toESM(require_cross_spawn(),1);var DEFAULT_INHERITED_ENV_VARS=import_node_process2.default.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function getDefaultEnvironment(){const env={};for(const key of DEFAULT_INHERITED_ENV_VARS){const value=import_node_process2.default.env[key];if(value===void 0)continue;if(value.startsWith("()"))continue;env[key]=value}return env}var StdioClientTransport=class{_process;_readBuffer;_serverParams;_stderrStream=null;onclose;onerror;onmessage;constructor(server){this._serverParams=server;this._readBuffer=new ReadBuffer({maxBufferSize:server.maxBufferSize});if(server.stderr==="pipe"||server.stderr==="overlapped")this._stderrStream=new import_node_stream.PassThrough}async start(){if(this._process)throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");return new Promise((resolve,reject)=>{this._process=(0,import_cross_spawn.default)(this._serverParams.command,this._serverParams.args??[],{env:{...getDefaultEnvironment(),...this._serverParams.env},stdio:["pipe","pipe",this._serverParams.stderr??"inherit"],shell:false,windowsHide:import_node_process2.default.platform==="win32",cwd:this._serverParams.cwd});this._process.on("error",error51=>{reject(error51);this.onerror?.(error51)});this._process.on("spawn",()=>{resolve()});this._process.on("close",_code=>{this._process=void 0;this.onclose?.()});this._process.stdin?.on("error",error51=>{this.onerror?.(error51)});this._process.stdout?.on("data",chunk=>{try{this._readBuffer.append(chunk);this.processReadBuffer()}catch(error51){this.onerror?.(error51);this.close().catch(()=>{})}});this._process.stdout?.on("error",error51=>{this.onerror?.(error51)});if(this._stderrStream&&this._process.stderr)this._process.stderr.pipe(this._stderrStream)})}get stderr(){if(this._stderrStream)return this._stderrStream;return this._process?.stderr??null}get pid(){return this._process?.pid??null}processReadBuffer(){while(true)try{const message=this._readBuffer.readMessage();if(message===null)break;this.onmessage?.(message)}catch(error51){this.onerror?.(error51)}}async _dispose(){const proc=this._process;this._process=void 0;if(proc&&proc.exitCode===null&&proc.signalCode===null){const exited=new Promise(resolve=>proc.once("exit",()=>resolve()));try{proc.stdin?.end()}catch{}try{proc.kill("SIGTERM")}catch{}await Promise.race([exited,new Promise(resolve=>setTimeout(resolve,1e3).unref())]);if(proc.exitCode===null&&proc.signalCode===null)try{proc.kill("SIGKILL")}catch{}await exited}try{proc?.stdout?.destroy()}catch{}try{proc?.stdin?.destroy()}catch{}try{proc?.stderr?.destroy()}catch{}this._readBuffer.clear()}async close(){if(this._process){const processToClose=this._process;this._process=void 0;const closePromise=new Promise(resolve=>{processToClose.once("close",()=>{resolve()})});try{processToClose.stdin?.end()}catch{}await Promise.race([closePromise,new Promise(resolve=>setTimeout(resolve,2e3).unref())]);if(processToClose.exitCode===null){try{processToClose.kill("SIGTERM")}catch{}await Promise.race([closePromise,new Promise(resolve=>setTimeout(resolve,2e3).unref())])}if(processToClose.exitCode===null)try{processToClose.kill("SIGKILL")}catch{}}this._readBuffer.clear()}send(message){return new Promise(resolve=>{if(!this._process?.stdin)throw new SdkError(SdkErrorCode.NotConnected,"Not connected");const json2=serializeMessage(message);if(this._process.stdin.write(json2))resolve();else this._process.stdin.once("drain",resolve)})}};function localMcpFailure(stage,message,options={}){const failureCause={stage,...options.cause?{cause:options.cause}:{}};return new CliError("MCP_FAILED",message,{exitCode:exitCodes.mcpFailed,cause:failureCause,hint:options.hint??"Check the SAG API container logs and retry `sag mcp test`."})}function localMcpFailureStage(error51){if(error51.code!=="MCP_FAILED"||typeof error51.cause!=="object"){return void 0}const stage=error51.cause?.stage;return stage==="entrypoint"||stage==="protocol"||stage==="tools"||stage==="knowledge"?stage:void 0}var MIN_SESSION_CLEANUP_TIMEOUT_MS=50;var MAX_SESSION_CLEANUP_TIMEOUT_MS=250;function mcpFailure(){return new CliError("MCP_FAILED","\u65E0\u6CD5\u4E0E\u4F01\u4E1A HTTP MCP \u901A\u4FE1",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5\u5DF2\u5BFC\u5165\u7684 MCP \u5730\u5740\u548C\u8BBF\u95EE\u5BC6\u94A5\u540E\u91CD\u8BD5\u3002"})}function createClient(cliVersion){return new Client({name:"@zleap-ai/sag-cli",version:cliVersion},{versionNegotiation:{mode:"auto",probe:{timeoutMs:250,maxRetries:0}}})}function createHttpMcpTransport(spec,cleanupTimeoutMs=MAX_SESSION_CLEANUP_TIMEOUT_MS){return new StreamableHTTPClientTransport(new URL(spec.url),{fetch:async(input,init)=>{const headers=new Headers(input instanceof Request?input.headers:void 0);new Headers(init?.headers).forEach((value,name)=>headers.set(name,value));for(const[name,value]of Object.entries(spec.headers)){headers.set(name,value)}const method=init?.method??(input instanceof Request?input.method:"GET");return fetch(input,{...init,headers,...method.toUpperCase()==="DELETE"?{signal:AbortSignal.timeout(cleanupTimeoutMs)}:{}})}})}function sessionCleanupTimeoutMs(operationTimeoutMs){return Math.min(Math.max(operationTimeoutMs,MIN_SESSION_CLEANUP_TIMEOUT_MS),MAX_SESSION_CLEANUP_TIMEOUT_MS)}async function closeHttpMcpClient(client,transport){if(transport.sessionId){await transport.terminateSession().catch(()=>void 0)}await client.close().catch(()=>void 0)}async function withHttpMcpClient(spec,options,action){const client=createClient(options.cliVersion);const transport=createHttpMcpTransport(spec,sessionCleanupTimeoutMs(options.timeoutMs));let result;let primaryFailure;let hasPrimaryFailure=false;try{await client.connect(transport,{timeout:options.timeoutMs});result=await action(client)}catch(cause){hasPrimaryFailure=true;primaryFailure=cause}let cleanupFailure;try{await closeHttpMcpClient(client,transport)}catch(cause){cleanupFailure=cause}if(hasPrimaryFailure){if(primaryFailure instanceof CliError){throw primaryFailure}throw mcpFailure()}if(cleanupFailure){throw cleanupFailure}return result}async function listHttpMcpTools(spec,options){return withHttpMcpClient(spec,options,client=>client.listTools(void 0,{timeout:options.timeoutMs,cacheMode:"refresh"}))}async function callHttpMcpTool(input){return withHttpMcpClient(input.spec,input,async client=>{const listed=await client.listTools(void 0,{timeout:input.timeoutMs,cacheMode:"refresh"});const tool=listed.tools.find(candidate=>candidate.name===input.tool);if(!tool){throw new CliError("RESOURCE_NOT_FOUND",`\u627E\u4E0D\u5230 MCP \u5DE5\u5177\uFF1A${input.tool}`,{exitCode:exitCodes.resourceNotFound})}if(tool.annotations?.readOnlyHint!==true&&!input.yes){throw new CliError("INVALID_ARGUMENT",`MCP \u5DE5\u5177 ${input.tool} \u53EF\u80FD\u4F1A\u4FEE\u6539\u6570\u636E\uFF0C\u9700\u4F7F\u7528 --yes \u786E\u8BA4`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u68C0\u67E5\u5DE5\u5177\u53C2\u6570\uFF0C\u5E76\u4F7F\u7528 --yes \u91CD\u65B0\u6267\u884C\u4EE5\u786E\u8BA4\u3002"})}const result=await client.callTool({name:input.tool,arguments:input.arguments_},{timeout:input.timeoutMs});return{tool:input.tool,result}})}function toMcpToolSummary(input){const annotations={...input.annotations?.title===void 0?{}:{title:input.annotations.title},...input.annotations?.readOnlyHint===void 0?{}:{readOnlyHint:input.annotations.readOnlyHint},...input.annotations?.destructiveHint===void 0?{}:{destructiveHint:input.annotations.destructiveHint},...input.annotations?.idempotentHint===void 0?{}:{idempotentHint:input.annotations.idempotentHint},...input.annotations?.openWorldHint===void 0?{}:{openWorldHint:input.annotations.openWorldHint}};return{name:input.name,...input.description===void 0?{}:{description:input.description},inputSchema:input.inputSchema,...Object.keys(annotations).length?{annotations}:{}}}function classifyTools(tools){const summary={readOnly:0,write:0,destructive:0,unknown:0,hasWarning:false};for(const tool of tools){if(tool.annotations?.destructiveHint===true){summary.destructive+=1}else if(tool.annotations?.readOnlyHint===true){summary.readOnly+=1}else if(tool.annotations?.readOnlyHint===false){summary.write+=1}else{summary.unknown+=1}}summary.hasWarning=summary.write>0||summary.destructive>0||summary.unknown>0;return summary}var REQUIRED_SAG_TOOLS=["list_sources","list_documents","outline","search","grep","get_chunk","read","get_entity"];var McpVerifier=class{constructor(cliVersion){this.cliVersion=cliVersion}cliVersion;async verify(spec,options){if(spec.transport==="streamable-http"){return this.verifyHttp(spec,options)}return this.verifyStdio(spec,options)}createClient(probeTimeoutMs){return new Client({name:"@zleap-ai/sag-cli",version:this.cliVersion},{versionNegotiation:{mode:"auto",probe:{timeoutMs:probeTimeoutMs,maxRetries:0}}})}async verifyStdio(spec,options){const client=this.createClient(Math.min(options.timeoutMs,250));const transport=new StdioClientTransport({command:spec.command,args:spec.args,env:{...getDefaultEnvironment(),...spec.env},stderr:"pipe"});transport.stderr?.on("data",()=>void 0);try{await client.connect(transport,{timeout:options.timeoutMs});const era=client.getProtocolEra();const protocolVersion=client.getNegotiatedProtocolVersion();if(!era||!protocolVersion){throw localMcpFailure("protocol","MCP protocol negotiation returned no version")}const listed=await client.listTools(void 0,{timeout:options.timeoutMs,cacheMode:"refresh"}).catch(cause=>{throw localMcpFailure("tools","Unable to list SAG MCP tools",{cause})});const tools=listed.tools.map(tool=>tool.name);const missingTools=REQUIRED_SAG_TOOLS.filter(required2=>!tools.includes(required2));if(missingTools.length){throw localMcpFailure("tools",`SAG MCP is missing required tools: ${missingTools.join(", ")}`)}const listSources2=await client.callTool({name:"list_sources",arguments:{}},{timeout:options.timeoutMs}).catch(cause=>{throw localMcpFailure("knowledge","Unable to call SAG MCP list_sources",{cause})});if(listSources2.isError){throw localMcpFailure("knowledge","SAG MCP list_sources returned an error")}const server=client.getServerVersion();return{transport:"stdio",era,protocolVersion,...server?{server}:{},tools,missingTools,listSourcesCallable:true}}catch(cause){if(cause instanceof CliError){throw cause}throw localMcpFailure("protocol","Unable to verify SAG MCP",{cause})}finally{await client.close().catch(()=>void 0)}}async verifyHttp(spec,options){const client=this.createClient(Math.min(options.timeoutMs,250));const transport=createHttpMcpTransport(spec,sessionCleanupTimeoutMs(options.timeoutMs));let report;let primaryFailure=false;try{await client.connect(transport,{timeout:options.timeoutMs});const era=client.getProtocolEra();const protocolVersion=client.getNegotiatedProtocolVersion();if(!era||!protocolVersion){throw new Error("MCP protocol negotiation returned no version")}const listed=await client.listTools(void 0,{timeout:options.timeoutMs,cacheMode:"refresh"});const tools=listed.tools.map(toMcpToolSummary);const server=client.getServerVersion();report={transport:"streamable-http",url:spec.url,era,protocolVersion,...server?{server}:{},tools,toolCount:tools.length,risk:classifyTools(tools)}}catch{primaryFailure=true}let cleanupFailure;try{await closeHttpMcpClient(client,transport)}catch(cause){cleanupFailure=cause}if(primaryFailure){throw new CliError("MCP_FAILED","\u65E0\u6CD5\u9A8C\u8BC1\u4F01\u4E1A\u7248 HTTP MCP",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5 MCP \u5730\u5740\u548C AccessKey \u540E\u91CD\u8BD5\u3002"})}if(cleanupFailure){throw cleanupFailure}return report}};var import_node_child_process=require("child_process");var NodeProcessRunner=class{async run(input){return new Promise((resolve,reject)=>{const child=(0,import_node_child_process.spawn)(input.command,input.args,{shell:false,env:input.env??process.env,stdio:[input.stdin==="pipe"?"pipe":"ignore","pipe","pipe"]});const childStdout=child.stdout;const childStderr=child.stderr;let stdout="";let stderr="";let timedOut=false;let forceKill;const timeout=setTimeout(()=>{timedOut=true;child.kill("SIGTERM");forceKill=setTimeout(()=>{child.kill("SIGKILL")},250)},input.timeoutMs);childStdout?.setEncoding("utf8");childStderr?.setEncoding("utf8");childStdout?.on("data",chunk=>{stdout+=chunk});childStderr?.on("data",chunk=>{stderr+=chunk});child.on("error",cause=>{clearTimeout(timeout);if(forceKill)clearTimeout(forceKill);reject(new CliError("DEPENDENCY_MISSING",`Unable to start ${input.command}`,{exitCode:exitCodes.dependencyMissing,cause,hint:`Install ${input.command} and ensure it is available on PATH.`}))});child.on("close",exitCode=>{clearTimeout(timeout);if(forceKill)clearTimeout(forceKill);if(timedOut){reject(new CliError("DEPENDENCY_MISSING",`${input.command} timed out`,{exitCode:exitCodes.dependencyMissing,hint:`Check that ${input.command} is responsive and try again.`}));return}resolve({exitCode:exitCode??1,stdout,stderr})})})}};var import_node_crypto5=require("crypto");var import_promises9=require("fs/promises");var import_node_path11=__toESM(require("path"),1);var import_proper_lockfile6=__toESM(require_proper_lockfile(),1);var recentKnowledgeBaseSchema=external_exports.strictObject({id:external_exports.string().min(1),name:external_exports.string().min(1)});var skillAccountSchema=external_exports.strictObject({accessToken:external_exports.string().min(1),refreshToken:external_exports.string().min(1),accessExpiresAt:external_exports.string().datetime({offset:true}),refreshExpiresAt:external_exports.string().datetime({offset:true}),user:external_exports.strictObject({id:external_exports.string().min(1),name:external_exports.string().min(1)}),recentKnowledgeBase:recentKnowledgeBaseSchema.optional()});var skillAccountConfigSchema=external_exports.object({version:external_exports.literal(1),currentOrigin:external_exports.string().optional(),accounts:external_exports.record(external_exports.string(),skillAccountSchema)}).passthrough();function configurationConflict(message,filePath){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:filePath?`Review or restore ${filePath}.`:"Provide a pure SAG Origin."})}function normalizeSkillOrigin(input){try{const parsed=new URL(input);if(!["http:","https:"].includes(parsed.protocol)||!parsed.hostname||parsed.username||parsed.password||parsed.pathname!=="/"||parsed.search||parsed.hash){throw new Error("not a pure HTTP Origin")}return parsed.origin}catch{throw configurationConflict("SAG address must be a pure HTTP or HTTPS Origin")}}var SkillAccountConfigStore=class{constructor(filePath){this.filePath=filePath}filePath;async load(){let raw;try{raw=await(0,import_promises9.readFile)(this.filePath,"utf8")}catch(error51){if(error51.code==="ENOENT"){return{version:1,accounts:{}}}throw error51}try{return skillAccountConfigSchema.parse(JSON.parse(raw))}catch{throw configurationConflict("SAG account configuration is invalid",this.filePath)}}async saveAccount(origin,account){const normalizedOrigin=normalizeSkillOrigin(origin);let validated;try{validated=skillAccountSchema.parse(account)}catch{throw configurationConflict("SAG account is invalid",this.filePath)}await this.#withLock(async()=>{const config2=await this.load();config2.accounts[normalizedOrigin]=validated;config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async removeAccount(origin){const normalizedOrigin=normalizeSkillOrigin(origin);await this.#withLock(async()=>{const config2=await this.load();delete config2.accounts[normalizedOrigin];if(config2.currentOrigin===normalizedOrigin){config2.currentOrigin=Object.keys(config2.accounts).sort()[0]}await this.#saveUnlocked(config2)})}async setCurrentOrigin(origin){const normalizedOrigin=normalizeSkillOrigin(origin);await this.#withLock(async()=>{const config2=await this.load();config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async getAccount(origin){return(await this.load()).accounts[normalizeSkillOrigin(origin)]??null}async saveRecentKnowledgeBase(origin,knowledgeBase){const normalizedOrigin=normalizeSkillOrigin(origin);const validated=recentKnowledgeBaseSchema.parse(knowledgeBase);await this.#withLock(async()=>{const config2=await this.load();const account=config2.accounts[normalizedOrigin];if(!account){throw configurationConflict("SAG account authorization is required",this.filePath)}config2.accounts[normalizedOrigin]={...account,recentKnowledgeBase:validated};config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async withRefreshLock(origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);const digest2=(0,import_node_crypto5.createHash)("sha256").update(normalizedOrigin).digest("hex");await(0,import_promises9.mkdir)(import_node_path11.default.dirname(this.filePath),{recursive:true});let release;try{release=await(0,import_proper_lockfile6.lock)(`${this.filePath}.refresh-${digest2}`,{realpath:false,stale:1e4,update:2e3,retries:{retries:300,factor:1,minTimeout:100,maxTimeout:100}})}catch{throw new CliError("CONFIG_CONFLICT","SAG account refresh is busy",{exitCode:exitCodes.configConflict,hint:"Wait for the other SAG Skill refresh to finish and retry."})}try{return await operation()}finally{await release()}}async#withLock(operation){await(0,import_promises9.mkdir)(import_node_path11.default.dirname(this.filePath),{recursive:true});let release;try{release=await(0,import_proper_lockfile6.lock)(this.filePath,{realpath:false,stale:1e4,update:2e3,retries:{retries:100,factor:1,minTimeout:10,maxTimeout:10}})}catch{throw new CliError("CONFIG_CONFLICT","SAG account configuration is busy",{exitCode:exitCodes.configConflict,hint:"Wait for the other SAG Skill operation to finish and retry."})}try{return await operation()}finally{await release()}}async#saveUnlocked(config2){let validated;try{validated=skillAccountConfigSchema.parse(config2)}catch{throw configurationConflict("SAG account configuration is invalid",this.filePath)}const directory=import_node_path11.default.dirname(this.filePath);await(0,import_promises9.mkdir)(directory,{recursive:true});const temporaryPath=import_node_path11.default.join(directory,`.${import_node_path11.default.basename(this.filePath)}.${(0,import_node_crypto5.randomUUID)()}.tmp`);let temporaryCreated=false;try{const handle=await(0,import_promises9.open)(temporaryPath,"wx",384);temporaryCreated=true;try{await handle.chmod(384).catch(()=>void 0);await handle.writeFile(JSON.stringify(validated),"utf8")}finally{await handle.close()}await(0,import_promises9.rename)(temporaryPath,this.filePath)}catch(error51){if(temporaryCreated)await(0,import_promises9.unlink)(temporaryPath).catch(()=>void 0);throw error51}}};var SkillError=class extends Error{code;details;exitCode;problemCode;constructor(code,message,options){super(message);this.name="SkillError";this.code=code;this.details=options.details;this.exitCode=options.exitCode;this.problemCode=options.problemCode}};var dateTimeSchema=external_exports.string().datetime({offset:true});var sessionIdSchema=external_exports.uuid();var createSessionSchema=external_exports.strictObject({session_id:sessionIdSchema,verification_url:external_exports.url(),expires_at:dateTimeSchema});var loginSessionSchema=external_exports.strictObject({session_id:sessionIdSchema,status:external_exports.enum(["pending","approved","denied","consumed"]),expires_at:dateTimeSchema});var accountSchema=external_exports.strictObject({access_token:external_exports.string().min(1),refresh_token:external_exports.string().min(1),access_expires_at:dateTimeSchema,refresh_expires_at:dateTimeSchema,user:external_exports.strictObject({id:external_exports.string().min(1),name:external_exports.string().min(1)})});var problemSchema=external_exports.object({code:external_exports.string().min(1)}).passthrough();var SkillAccountAuthHttpClient=class{#fetch;#timeoutMs;constructor(options={}){this.#fetch=options.fetchImplementation??fetch;this.#timeoutMs=options.timeoutMs??1e4}async createLoginSession(origin,pkceChallenge2){const normalizedOrigin=normalizeSkillOrigin(origin);const response=await this.#request(normalizedOrigin,"/api/v1/integrations/skill-account-logins",{method:"POST",body:{pkce_challenge:pkceChallenge2}});const parsed=await this.#parse(response,createSessionSchema);if(normalizeSkillOrigin(new URL(parsed.verification_url).origin)!==normalizedOrigin){throw invalidResponse()}return{sessionId:parsed.session_id,verificationUrl:parsed.verification_url,expiresAt:parsed.expires_at}}async getLoginSession(origin,sessionId){const validatedId=this.#sessionId(sessionId);const response=await this.#request(normalizeSkillOrigin(origin),`/api/v1/integrations/skill-account-logins/${encodeURIComponent(validatedId)}`,{method:"GET"});const parsed=await this.#parse(response,loginSessionSchema);if(parsed.session_id!==validatedId)throw invalidResponse();return{sessionId:parsed.session_id,status:parsed.status,expiresAt:parsed.expires_at}}async exchange(origin,input){const sessionId=this.#sessionId(input.sessionId);const response=await this.#request(normalizeSkillOrigin(origin),`/api/v1/integrations/skill-account-logins/${encodeURIComponent(sessionId)}/exchange`,{method:"POST",body:{pkce_verifier:input.pkceVerifier}});return asAccount(await this.#parse(response,accountSchema))}async refresh(origin,refreshToken){const response=await this.#request(normalizeSkillOrigin(origin),"/api/v1/integrations/skill-account-sessions/refresh",{method:"POST",body:{refresh_token:refreshToken}});return asAccount(await this.#parse(response,accountSchema))}async logout(origin,accessToken,refreshToken){const response=await this.#request(normalizeSkillOrigin(origin),"/api/v1/integrations/skill-account-sessions/current",{method:"DELETE",body:{refresh_token:refreshToken},authorization:`Bearer ${accessToken}`});if(response.status!==204)throw invalidResponse()}#sessionId(value){const parsed=sessionIdSchema.safeParse(value);if(!parsed.success){throw new SkillError("INVALID_ARGUMENT","Skill login session is invalid",{exitCode:exitCodes.invalidArgument})}return parsed.data}async#request(origin,requestPath,options){let response;try{response=await this.#fetch(new URL(requestPath,origin),{headers:{Accept:"application/json","Cache-Control":"no-store",...options.body?{"Content-Type":"application/json"}:{},...options.authorization?{Authorization:options.authorization}:{}},method:options.method,redirect:"error",signal:AbortSignal.timeout(this.#timeoutMs),...options.body?{body:JSON.stringify(options.body)}:{}})}catch{throw new SkillError("NETWORK_UNREACHABLE","Cannot reach the SAG account authorization service",{exitCode:exitCodes.networkUnreachable})}if(response.redirected||response.status>=300&&response.status<400){throw invalidResponse()}if(!response.ok){let code="unknown";try{const problem=problemSchema.safeParse(await response.json());if(problem.success)code=problem.data.code}catch{}throw problemError(code,response.status)}return response}async#parse(response,schema){try{const parsed=schema.safeParse(await response.json());if(parsed.success)return parsed.data}catch{}throw invalidResponse()}};function asAccount(value){return{accessToken:value.access_token,refreshToken:value.refresh_token,accessExpiresAt:value.access_expires_at,refreshExpiresAt:value.refresh_expires_at,user:value.user}}function invalidResponse(){return new SkillError("INVALID_RESPONSE","SAG account authorization returned an incompatible response",{exitCode:exitCodes.internalError})}function problemError(code,status2){if(code==="access_denied"||status2===403){return new SkillError("PERMISSION_DENIED","SAG account authorization was denied",{exitCode:exitCodes.permissionDenied,problemCode:"access_denied"})}if(code==="login_session_expired"||code==="invalid_grant"||status2===410){return new SkillError("AUTH_EXPIRED","SAG account authorization has expired",{exitCode:exitCodes.authRequired,problemCode:code})}if(status2===401){return new SkillError("AUTH_REQUIRED","SAG account authorization is required",{exitCode:exitCodes.authRequired})}if(status2===429||code==="rate_limited"){return new SkillError("RATE_LIMITED","SAG account authorization is rate limited",{exitCode:exitCodes.networkUnreachable,problemCode:"rate_limited"})}return invalidResponse()}var import_node_crypto6=require("crypto");var import_promises10=require("fs/promises");var import_node_path12=__toESM(require("path"),1);var import_proper_lockfile7=__toESM(require_proper_lockfile(),1);var agentSchema=external_exports.enum(["codex","claude-code","workbuddy"]);var digestSchema=external_exports.string().regex(/^sha256:[a-f0-9]{64}$/u);var managedSkillSchema=external_exports.strictObject({agent:agentSchema,backupPath:external_exports.string().min(1).optional(),fingerprint:digestSchema,target:external_exports.string().min(1),version:external_exports.string().min(1)});var skillStateSchema=external_exports.strictObject({schema:external_exports.literal(2),managedSkills:external_exports.record(external_exports.string(),managedSkillSchema)});function emptyState5(){return{schema:2,managedSkills:{}}}function invalidState5(filePath){return new CliError("CONFIG_CONFLICT","Skill installation state is invalid",{exitCode:exitCodes.configConflict,hint:`Remove the unpublished legacy state at ${filePath}, then reinstall the Skill.`})}function managedSkillKey(agent,target){return`${agent}:${target}`}var SkillStateStore=class{constructor(filePath){this.filePath=filePath}filePath;async#withLock(operation){await(0,import_promises10.mkdir)(import_node_path12.default.dirname(this.filePath),{recursive:true});let release;try{release=await(0,import_proper_lockfile7.lock)(this.filePath,{realpath:false,stale:1e4,update:2e3,retries:{retries:100,factor:1,minTimeout:10,maxTimeout:10}})}catch{throw new CliError("CONFIG_CONFLICT","Skill installation state is busy",{exitCode:exitCodes.configConflict})}try{return await operation()}finally{await release()}}async load(){try{return skillStateSchema.parse(JSON.parse(await(0,import_promises10.readFile)(this.filePath,"utf8")))}catch(error51){if(error51.code==="ENOENT")return emptyState5();throw invalidState5(this.filePath)}}async#saveUnlocked(state){const validated=skillStateSchema.parse(state);const directory=import_node_path12.default.dirname(this.filePath);await(0,import_promises10.mkdir)(directory,{recursive:true});const temporaryPath=import_node_path12.default.join(directory,`.${import_node_path12.default.basename(this.filePath)}.${(0,import_node_crypto6.randomUUID)()}.tmp`);let temporaryCreated=false;try{const handle=await(0,import_promises10.open)(temporaryPath,"wx",384);temporaryCreated=true;try{await handle.chmod(384);await handle.writeFile(JSON.stringify(validated),"utf8")}finally{await handle.close()}await(0,import_promises10.rename)(temporaryPath,this.filePath)}catch(error51){if(temporaryCreated)await(0,import_promises10.unlink)(temporaryPath).catch(()=>void 0);throw error51}}async getManagedSkill(agent,target){return(await this.load()).managedSkills[managedSkillKey(agent,target)]??null}async saveManagedSkill(managedSkill){const validated=managedSkillSchema.parse(managedSkill);await this.#withLock(async()=>{const state=await this.load();state.managedSkills[managedSkillKey(validated.agent,validated.target)]=validated;await this.#saveUnlocked(state)})}async deleteManagedSkill(agent,target){await this.#withLock(async()=>{const state=await this.load();delete state.managedSkills[managedSkillKey(agent,target)];await this.#saveUnlocked(state)})}};var import_node_crypto13=require("crypto");var import_index2=__toESM(require_commander(),1);var{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import_index2.default;var dateTime=external_exports.string().min(1);var rootSchema=external_exports.object({name:external_exports.string().min(1),version:external_exports.string().min(1),docs:external_exports.string()}).passthrough();var readySchema=external_exports.object({status:external_exports.string(),db:external_exports.boolean()}).passthrough();var capabilitiesSchema=external_exports.record(external_exports.string(),external_exports.unknown());var userSchema=external_exports.object({id:external_exports.string().min(1),email:external_exports.string(),name:external_exports.string(),created_at:dateTime.optional()}).passthrough();var loginResponseSchema=external_exports.object({access_token:external_exports.string().min(1),user:userSchema}).passthrough();var sourceSchema=external_exports.object({id:external_exports.string().min(1),name:external_exports.string(),description:external_exports.string(),source_type:external_exports.enum(["document","web","message","audio"]),connector_kind:external_exports.string(),status:external_exports.enum(["active","paused","error"]),document_count:external_exports.number().int().nonnegative(),chunk_count:external_exports.number().int().nonnegative(),event_count:external_exports.number().int().nonnegative(),created_at:dateTime,updated_at:dateTime}).passthrough();var documentStatusSchema=external_exports.enum(["pending","loading","extracting","paused","ready","failed"]);var documentSchema=external_exports.object({id:external_exports.string().min(1),source_id:external_exports.string().min(1),filename:external_exports.string(),content_type:external_exports.string(),size_bytes:external_exports.number().int().nonnegative(),status:documentStatusSchema,chunk_count:external_exports.number().int().nonnegative(),event_count:external_exports.number().int().nonnegative(),progress:external_exports.number().int().min(0).max(100),token_usage:external_exports.number().int().nonnegative(),error:external_exports.string().nullable(),created_at:dateTime,updated_at:dateTime}).passthrough();var searchSectionSchema=external_exports.object({chunk_id:external_exports.string().nullable(),heading:external_exports.string(),content:external_exports.string(),score:external_exports.number(),rank:external_exports.number().int(),source_id:external_exports.string().nullable(),source_name:external_exports.string().nullable().optional()}).passthrough();var searchEventSchema=external_exports.object({id:external_exports.string(),title:external_exports.string(),summary:external_exports.string(),rank:external_exports.number().int(),score:external_exports.number()}).passthrough();var sourceHitSchema=external_exports.object({source_id:external_exports.string(),source_name:external_exports.string().nullable().optional(),event_hits:external_exports.number().int(),max_score:external_exports.number(),latest_event_time:external_exports.string().nullable().optional()}).passthrough();var searchResponseSchema=external_exports.object({query:external_exports.string(),sections:external_exports.array(searchSectionSchema),events:external_exports.array(searchEventSchema),entities:external_exports.array(external_exports.record(external_exports.string(),external_exports.unknown())),relations:external_exports.array(external_exports.record(external_exports.string(),external_exports.unknown())),source_hits:external_exports.array(sourceHitSchema),summary:external_exports.string(),exploration_id:external_exports.string().nullable(),stats:external_exports.record(external_exports.string(),external_exports.unknown())}).passthrough();var mcpDescriptorSchema=external_exports.object({name:external_exports.string(),scope:external_exports.string(),source_count:external_exports.number().int().nonnegative(),tools:external_exports.array(external_exports.string()),http:external_exports.object({transport:external_exports.string(),url:external_exports.string().url(),headers:external_exports.record(external_exports.string(),external_exports.string())}).passthrough()}).passthrough();var outlineItemSchema=external_exports.object({rank:external_exports.number().int(),heading:external_exports.string(),chunk_id:external_exports.string()}).passthrough();var outlineSchema=external_exports.object({document_id:external_exports.string(),filename:external_exports.string(),outline:external_exports.array(outlineItemSchema)}).passthrough();var grepMatchSchema=external_exports.object({chunk_id:external_exports.string(),heading:external_exports.string(),snippet:external_exports.string()}).passthrough();var grepResponseSchema=external_exports.object({pattern:external_exports.string(),matches:external_exports.array(grepMatchSchema),count:external_exports.number().int().nonnegative()}).passthrough();var readResponseSchema=external_exports.object({document_id:external_exports.string(),filename:external_exports.string(),total_lines:external_exports.number().int().nonnegative(),offset:external_exports.number().int().positive(),limit:external_exports.number().int().positive(),lines:external_exports.array(external_exports.string())}).passthrough();var entityContextSchema=external_exports.object({entity_id:external_exports.string(),name:external_exports.string(),type:external_exports.string(),description:external_exports.string(),context:external_exports.string(),source_id:external_exports.string(),source_name:external_exports.string()}).passthrough();var searchTimeoutMs=15e3;var SagClient=class{#origin;#token;#timeoutMs;#locale;#fetch;constructor(options){this.#origin=normalizeOrigin(options.origin);this.#token=options.token;this.#timeoutMs=options.timeoutMs??1e4;this.#locale=options.locale??"zh-CN";this.#fetch=options.fetchImplementation??fetch}root(){return this.#request("/",rootSchema,{authenticated:false})}ready(){return this.#request("/api/v1/system/ready",readySchema,{authenticated:false})}capabilities(){return this.#request("/api/v1/system/capabilities",capabilitiesSchema,{authenticated:false})}me(){return this.#request("/api/v1/auth/me",userSchema)}async login(name){const response=await this.#request("/api/v1/auth/login",loginResponseSchema,{authenticated:false,method:"POST",body:{name}});return{accessToken:response.access_token,user:response.user}}mcpDescriptor(){return this.#request("/api/v1/system/mcp",mcpDescriptorSchema)}listSources(){return this.#request("/api/v1/sources",sourceSchema.array())}getSource(sourceId){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}`,sourceSchema)}listDocuments(sourceId){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/documents`,documentSchema.array())}getDocument(sourceId,documentId){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}`,documentSchema)}search(input){return this.#request("/api/v1/search",searchResponseSchema,{method:"POST",body:input,timeoutMs:searchTimeoutMs})}outline(sourceId,documentId){const params=new URLSearchParams({document_id:documentId});return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/outline?${params}`,outlineSchema)}grep(sourceId,pattern,limit){const params=new URLSearchParams({pattern});if(limit!==void 0){params.set("limit",String(limit))}return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/grep?${params}`,grepResponseSchema)}readDocument(sourceId,documentId,offset,limit){const params=new URLSearchParams;if(offset!==void 0){params.set("offset",String(offset))}if(limit!==void 0){params.set("limit",String(limit))}return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}/read?${params}`,readResponseSchema)}getEntityContext(sourceId,name){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/entities/${encodeURIComponent(name)}/context`,entityContextSchema)}async#request(path16,schema,options={}){const authenticated=options.authenticated??true;if(authenticated&&!this.#token){throw new CliError("AUTH_REQUIRED","No SAG token is configured",{exitCode:exitCodes.authRequired,hint:"Run `sag auth login` or set SAG_TOKEN."})}const headers=new Headers({Accept:"application/json","Accept-Language":this.#locale});if(authenticated&&this.#token){headers.set("Authorization",`Bearer ${this.#token}`)}if(options.body!==void 0){headers.set("Content-Type","application/json")}let response;try{response=await this.#fetch(new URL(path16,`${this.#origin}/`),{method:options.method??"GET",headers,...options.body!==void 0?{body:JSON.stringify(options.body)}:{},signal:AbortSignal.timeout(options.timeoutMs??this.#timeoutMs)})}catch(cause){throw new CliError("NETWORK_UNREACHABLE",`Cannot reach SAG at ${this.#origin}`,{exitCode:exitCodes.networkUnreachable,cause,hint:"Check that SAG is running and the URL is reachable."})}const payload=await this.#readPayload(response);if(!response.ok){throw this.#httpError(response.status,payload)}const parsed=schema.safeParse(payload);if(!parsed.success){throw new CliError("INVALID_RESPONSE","SAG returned an incompatible response",{exitCode:exitCodes.internalError,cause:parsed.error,hint:"Check the SAG/CLI compatibility matrix."})}return parsed.data}async#readPayload(response){try{return await response.json()}catch(cause){throw new CliError("INVALID_RESPONSE","SAG returned invalid JSON",{exitCode:exitCodes.internalError,cause})}}#httpError(status2,payload){const serverMessage=payload&&typeof payload==="object"&&"error"in payload&&payload.error&&typeof payload.error==="object"&&"message"in payload.error&&typeof payload.error.message==="string"?payload.error.message:`SAG request failed with HTTP ${status2}`;if(status2===401){return new CliError("AUTH_REQUIRED",serverMessage,{exitCode:exitCodes.authRequired,hint:"Run `sag auth login` to refresh the token."})}if(status2===403){return new CliError("PERMISSION_DENIED",serverMessage,{exitCode:exitCodes.permissionDenied})}if(status2===404){return new CliError("RESOURCE_NOT_FOUND",serverMessage,{exitCode:exitCodes.resourceNotFound})}if(status2===409){return new CliError("DOCUMENT_NOT_READY",serverMessage,{exitCode:exitCodes.documentNotReady})}if(status2>=500){return new CliError("SERVICE_NOT_READY",serverMessage,{exitCode:exitCodes.serviceNotReady})}return new CliError("INVALID_RESPONSE",serverMessage,{exitCode:exitCodes.internalError})}};var SERVER_NAME_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$/u;function validateServerName(serverName){if(!SERVER_NAME_PATTERN.test(serverName)){throw new CliError("INVALID_ARGUMENT","Invalid MCP server name",{exitCode:exitCodes.invalidArgument,hint:"Use 1-64 letters, numbers, dots, underscores, or dashes."})}}function conflict4(message){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:"Choose another `--name` or restore the SAG CLI managed entry."})}function hostFailure4(message,cause,hint){return new CliError("HOST_CONFIG_FAILED",message,{exitCode:exitCodes.hostConfigFailed,...cause?{cause}:{},hint:hint??"Inspect the Agent MCP configuration and run the command again."})}function determinePlan(input){let action;if(!input.hostFingerprint||!input.hostSpecFingerprint){if(input.managed){throw conflict4("Managed state exists but the Agent MCP entry is missing")}action="create"}else if(!input.managed){throw conflict4("The Agent MCP name is already owned by the user")}else if(input.managed.fingerprint!==input.hostFingerprint){throw conflict4("The managed Agent MCP entry was changed outside SAG CLI")}else if(input.hostSpecFingerprint===input.desiredFingerprint){action="unchanged"}else{action="update"}return{action,agent:input.agent,serverName:input.serverName,scope:input.scope,provider:"docker-stdio",target:input.target.name,sourceId:input.sourceId??null,...input.hostSpecFingerprint?{currentFingerprint:input.hostSpecFingerprint}:{},desiredFingerprint:input.desiredFingerprint}}function managedConnection(input,resolved,fingerprint,existing){return{agent:input.agent,provider:"docker-stdio",profile:input.profile,serverName:input.serverName,docker:{...resolved.target.composeProject?{composeProject:resolved.target.composeProject}:{},...resolved.target.composeService?{composeService:resolved.target.composeService}:{},containerName:resolved.target.name},sourceId:input.sourceId??null,scope:input.scope,fingerprint,createdAt:existing?.createdAt??input.now().toISOString()}}async function rollbackHost(input){if(input.previousSpec){try{await input.adapter.remove(input.serverName,input.scope)}catch{}await input.adapter.add(input.serverName,input.scope,input.previousSpec);const restored=await input.adapter.read(input.serverName,input.scope);if(!restored||restored.fingerprint!==(input.previousFingerprint??fingerprintConnection(input.previousSpec))){throw new Error("Previous Agent MCP entry was not restored")}return}await input.adapter.remove(input.serverName,input.scope)}async function connectAgent(input){validateServerName(input.serverName);const resolved=await input.resolveConnection();if(!input.adapter.capabilities.transports.includes(resolved.spec.transport)){throw new CliError("INVALID_ARGUMENT",`${input.agent} adapter does not support ${resolved.spec.transport} MCP connections`,{exitCode:exitCodes.invalidArgument,hint:"Choose a provider supported by the installed Agent adapter."})}if(!input.adapter.capabilities.scopes.includes(input.scope)){throw new CliError("INVALID_ARGUMENT",`${input.agent} adapter does not support ${input.scope} scope`,{exitCode:exitCodes.invalidArgument})}await input.verifier.verify(resolved.spec,{timeoutMs:input.timeoutMs});await input.adapter.detect();const host=await input.adapter.read(input.serverName,input.scope);const key=connectionKey(input.agent,input.scope,input.serverName);const managed=await input.state.get(key);const desiredFingerprint=fingerprintConnection(resolved.spec);const plan=determinePlan({agent:input.agent,serverName:input.serverName,scope:input.scope,target:resolved.target,...input.sourceId?{sourceId:input.sourceId}:{},desiredFingerprint,...host?{hostFingerprint:host.fingerprint}:{},...host?{hostSpecFingerprint:fingerprintConnection(host.spec)}:{},managed});if(plan.action==="unchanged"){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"unchanged",changed:false,verified:true,dryRun:false,plan}}if(input.dryRun){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:plan.action,changed:false,verified:true,dryRun:true,plan}}if(!input.yes&&!await input.confirm(`${plan.action==="create"?"Add":"Update"} ${input.serverName} in ${input.agent}?`)){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"cancelled",changed:false,verified:true,dryRun:false,plan}}try{if(plan.action==="update"){await input.adapter.remove(input.serverName,input.scope)}await input.adapter.add(input.serverName,input.scope,resolved.spec);const readBack=await input.adapter.read(input.serverName,input.scope);if(!readBack||fingerprintConnection(readBack.spec)!==desiredFingerprint){throw hostFailure4("Agent MCP read-back did not match the requested connection")}await input.verifier.verify(readBack.spec,{timeoutMs:input.timeoutMs});await input.state.set(managedConnection(input,resolved,readBack.fingerprint,managed))}catch(cause){try{await rollbackHost({adapter:input.adapter,serverName:input.serverName,scope:input.scope,...host?{previousSpec:host.spec}:{},...host?{previousFingerprint:host.fingerprint}:{}})}catch{throw hostFailure4("Agent MCP configuration failed and rollback also failed",cause,`Inspect the ${input.agent} MCP entry \`${input.serverName}\` before retrying.`)}throw hostFailure4("Agent MCP configuration failed; changes were rolled back",cause)}return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:plan.action,changed:true,verified:true,dryRun:false,plan}}async function disconnectAgent(input){validateServerName(input.serverName);await input.adapter.detect();const key=connectionKey(input.agent,input.scope,input.serverName);const managed=await input.state.get(key);if(!managed){throw conflict4("The Agent MCP entry is not managed by SAG CLI")}const host=await input.adapter.read(input.serverName,input.scope);if(!host){throw conflict4("Managed state exists but the Agent MCP entry is missing")}if(host.fingerprint!==managed.fingerprint){throw conflict4("The managed Agent MCP entry was changed outside SAG CLI")}const plan={action:"unchanged",agent:input.agent,serverName:input.serverName,scope:input.scope,provider:"docker-stdio",target:managed.docker.containerName,sourceId:managed.sourceId,currentFingerprint:host.fingerprint,desiredFingerprint:host.fingerprint};if(!input.yes&&!await input.confirm(`Remove ${input.serverName} from ${input.agent}?`)){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"cancelled",changed:false,verified:true,dryRun:false,plan}}await input.adapter.remove(input.serverName,input.scope);try{await input.state.delete(key)}catch(cause){try{await input.adapter.add(input.serverName,input.scope,host.spec)}catch{throw hostFailure4("Managed state cleanup failed and the Agent entry could not be restored",cause)}throw hostFailure4("Managed state cleanup failed; the Agent entry was restored",cause)}return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"disconnect",changed:true,verified:true,dryRun:false,plan}}var SOURCE_ID_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;var DockerStdioProvider=class{id="docker-stdio";async inspect(input){return{provider:this.id,ready:true,target:input.target.name}}async createSpec(input){if(input.sourceId&&!SOURCE_ID_PATTERN.test(input.sourceId)){throw new CliError("INVALID_ARGUMENT","Invalid SAG source id",{exitCode:exitCodes.invalidArgument,hint:"Use 1-128 letters, numbers, underscores, or dashes."})}const sourceArguments=input.sourceId?["-e",`SAG_MCP_SOURCE_ID=${input.sourceId}`]:[];return{transport:"stdio",command:"docker",args:["exec","-i",...sourceArguments,input.target.name,"python","-m","sag_api.mcp.server"],env:{}}}};var CONTAINER_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/u;function validateContainer(value){if(!CONTAINER_PATTERN.test(value)){throw new CliError("INVALID_ARGUMENT","Invalid Docker container name or id",{exitCode:exitCodes.invalidArgument,hint:"Use 1-128 letters, numbers, dots, underscores, or dashes."})}}function toTarget(inspection){const composeProject=inspection.labels["com.docker.compose.project"]||void 0;const composeService=inspection.labels["com.docker.compose.service"]||void 0;return{id:inspection.id,name:inspection.name,...composeProject?{composeProject}:{},...composeService?{composeService}:{},health:inspection.health}}async function validateTarget(docker,container){const inspection=await docker.inspect(container);if(!inspection.running||inspection.health==="unhealthy"||inspection.health==="starting"){throw new CliError("SERVICE_NOT_READY","SAG API container is not ready",{exitCode:exitCodes.serviceNotReady,hint:"Check the SAG API container health and logs."})}if(!await docker.canImportMcp(inspection.name)){throw localMcpFailure("entrypoint","SAG API container does not provide the stdio MCP entrypoint",{hint:"Use a compatible SAG image that includes sag_api.mcp.server."})}return toTarget(inspection)}async function discoverSagContainer(input){await input.docker.version();if(input.container){validateContainer(input.container);return validateTarget(input.docker,input.container)}const containers=await input.docker.listRunningContainers();const apiCandidates=containers.filter(container=>container.labels["com.docker.compose.service"]==="api");if(!apiCandidates.length){throw new CliError("RESOURCE_NOT_FOUND","No SAG API container was found",{exitCode:exitCodes.resourceNotFound,hint:"Start SAG Docker or pass `--container <name-or-id>`."})}const targets=[];let firstFailure;let preferredFailure;for(const candidate of apiCandidates){try{targets.push(await validateTarget(input.docker,candidate.id))}catch(error51){firstFailure??=error51;if(candidate.labels["com.docker.compose.project"]==="sag"){preferredFailure??=error51}}}if(!targets.length){throw preferredFailure??firstFailure}const preferredTargets=targets.filter(target=>target.composeProject==="sag");const rankedTargets=preferredTargets.length?preferredTargets:targets;if(rankedTargets.length===1){return rankedTargets[0]}if(!input.interactive||!input.select){throw new CliError("CONFIG_CONFLICT","Multiple SAG API containers were found",{exitCode:exitCodes.configConflict,hint:"Pass `--container <name-or-id>` to select one."})}const selectedId=await input.select(rankedTargets);const selected=rankedTargets.find(target=>target.id===selectedId||target.name===selectedId);if(!selected){throw new CliError("INVALID_ARGUMENT","Invalid Docker container selection",{exitCode:exitCodes.invalidArgument})}return selected}async function connectLocalAgent(runtime2,input){return connectAgent({agent:input.agent,serverName:input.serverName,scope:"user",profile:input.profile,...input.sourceId?{sourceId:input.sourceId}:{},timeoutMs:input.timeoutMs,dryRun:input.dryRun,yes:input.yes,resolveConnection:async()=>{const target=await discoverSagContainer({docker:runtime2.docker,...input.container?{container:input.container}:{},interactive:runtime2.interactive,select:runtime2.selectContainer});const spec=await new DockerStdioProvider().createSpec({target,...input.sourceId?{sourceId:input.sourceId}:{}});return{target,spec}},verifier:runtime2.verifier,adapter:runtime2.adapters[input.agent],state:runtime2.state,confirm:input.confirm,now:input.now})}async function agentStatus(runtime2,agent,serverName){const adapter=runtime2.adapters[agent];let version2;try{version2=(await adapter.detect()).version}catch{return{agent,installed:false,serverName,status:"unavailable",managed:false,verified:false}}const key=connectionKey(agent,"user",serverName);const[managed,host]=await Promise.all([runtime2.state.get(key),adapter.read(serverName,"user")]);if(!host){return{agent,installed:true,version:version2,serverName,status:managed?"drifted":"disconnected",managed:Boolean(managed),verified:false}}if(!managed){return{agent,installed:true,version:version2,serverName,status:"unmanaged",managed:false,verified:false}}if(host.fingerprint!==managed.fingerprint){return{agent,installed:true,version:version2,serverName,status:"drifted",managed:true,verified:false}}try{await runtime2.verifier.verify(host.spec,{timeoutMs:15e3});return{agent,installed:true,version:version2,serverName,status:"connected",managed:true,verified:true}}catch{return{agent,installed:true,version:version2,serverName,status:"unavailable",managed:true,verified:false}}}async function statusLocalAgents(runtime2,input){const agents2=input.agent?[input.agent]:["codex","claude-code"];return Promise.all(agents2.map(agent=>agentStatus(runtime2,agent,input.serverName)))}async function listAgentHosts(runtime2){return Promise.all(["codex","claude-code"].map(async agent=>{const managedConnections=(await runtime2.state.list({agent})).length;try{const installation=await runtime2.adapters[agent].detect();return{agent,installed:true,version:installation.version,managedConnections}}catch{return{agent,installed:false,managedConnections}}}))}async function disconnectLocalAgent(runtime2,input){return disconnectAgent({agent:input.agent,serverName:input.serverName,scope:"user",adapter:runtime2.adapters[input.agent],state:runtime2.state,yes:input.yes,confirm:input.confirm})}async function login(input){const environmentToken=input.environmentToken?.trim();if(environmentToken){const user2=await input.validate(environmentToken);await input.store.set(input.credentialRef,environmentToken);return{authenticated:true,credentialRef:input.credentialRef,credentialStore:input.store.kind,user:user2}}const name=(input.name??await input.promptName()).trim();if(!name){throw new CliError("INVALID_ARGUMENT","A SAG user name is required",{exitCode:exitCodes.invalidArgument,hint:"Pass `--name <name>` or enter a name when prompted."})}const{accessToken,user}=await input.authenticate(name);await input.store.set(input.credentialRef,accessToken);return{authenticated:true,credentialRef:input.credentialRef,credentialStore:input.store.kind,user}}async function status(input){const token=input.environmentToken?.trim()||await input.store.get(input.credentialRef);if(!token){return{authenticated:false,credentialRef:input.credentialRef,credentialStore:input.store.kind}}const user=await input.validate(token);return{authenticated:true,credentialRef:input.credentialRef,credentialStore:input.store.kind,user}}async function logout(input){await input.store.delete(input.credentialRef);return{authenticated:false,credentialRef:input.credentialRef}}function requiredIdentifier(value,label){const normalized=value.trim();if(!normalized){throw new CliError("INVALID_ARGUMENT",`${label} is required`,{exitCode:exitCodes.invalidArgument})}return normalized}function summarizeDocuments(documents){const statuses={pending:0,loading:0,extracting:0,paused:0,ready:0,failed:0};for(const document of documents){statuses[document.status]+=1}return{total:documents.length,statuses,searchable:documents.length>0&&statuses.ready===documents.length}}async function listDocuments(client,sourceId){return client.listDocuments(requiredIdentifier(sourceId,"Source ID"))}async function getDocument(client,sourceId,documentId){return client.getDocument(requiredIdentifier(sourceId,"Source ID"),requiredIdentifier(documentId,"Document ID"))}async function documentStatus(client,sourceId,documentId){const normalizedSourceId=requiredIdentifier(sourceId,"Source ID");if(documentId!==void 0){const document=await getDocument(client,normalizedSourceId,documentId);return{mode:"document",document,searchable:document.status==="ready"}}const summary=summarizeDocuments(await client.listDocuments(normalizedSourceId));return{mode:"source",sourceId:normalizedSourceId,total:summary.total,statuses:summary.statuses,searchable:summary.searchable}}function requiredIdentifier2(value,label){const normalized=value.trim();if(!normalized){throw new CliError("INVALID_ARGUMENT",`${label} is required`,{exitCode:exitCodes.invalidArgument})}return normalized}async function outline(client,sourceId,documentId){return client.outline(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(documentId,"Document ID"))}async function grep(client,sourceId,pattern,limit){return client.grep(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(pattern,"Pattern"),limit)}async function read(client,sourceId,documentId,offset,limit){return client.readDocument(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(documentId,"Document ID"),offset,limit)}async function getEntityContext(client,sourceId,name){return client.getEntityContext(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(name,"Entity name"))}async function testLocalMcp(runtime2,input){const container=await discoverSagContainer({docker:runtime2.docker,...input.container?{container:input.container}:{},interactive:runtime2.interactive,select:runtime2.selectContainer});const spec=await new DockerStdioProvider().createSpec({target:container,...input.sourceId?{sourceId:input.sourceId}:{}});const verification=await runtime2.verifier.verify(spec,{timeoutMs:input.timeoutMs});return{provider:"docker-stdio",container,sourceId:input.sourceId??null,...verification}}function skipped(name,detail){return{name,status:"warn",code:"CHECK_SKIPPED",detail}}async function localMcpDoctorChecks(runtime2,input){try{const report=await testLocalMcp(runtime2,input);return[{name:"docker",status:"pass",code:"DOCKER_READY",detail:"Docker daemon is available"},{name:"sagContainer",status:"pass",code:"SAG_CONTAINER_READY",detail:`${report.container.name} is ${report.container.health}`},{name:"mcpEntrypoint",status:"pass",code:"MCP_ENTRYPOINT_READY",detail:"sag_api.mcp.server is importable"},{name:"mcpProtocol",status:"pass",code:"MCP_PROTOCOL_READY",detail:`${report.protocolVersion} ${report.era}`},{name:"mcpTools",status:"pass",code:"MCP_TOOLS_READY",detail:`${report.tools.length} tools`},{name:"mcpKnowledge",status:"pass",code:"MCP_KNOWLEDGE_READY",detail:"list_sources callable"}]}catch(error51){const cliError=toCliError(error51);const mcpStage=localMcpFailureStage(cliError);const failedName=cliError.code==="DEPENDENCY_MISSING"?"docker":cliError.code==="RESOURCE_NOT_FOUND"||cliError.code==="SERVICE_NOT_READY"?"sagContainer":mcpStage==="entrypoint"?"mcpEntrypoint":mcpStage==="tools"?"mcpTools":mcpStage==="knowledge"?"mcpKnowledge":"mcpProtocol";const names=["docker","sagContainer","mcpEntrypoint","mcpProtocol","mcpTools","mcpKnowledge"];const failedIndex=names.indexOf(failedName);return names.map((name,index)=>{if(index<failedIndex){return{name,status:"pass",code:"CHECK_COMPLETED",detail:"Prerequisite check passed"}}if(index===failedIndex){return{name,status:"fail",code:cliError.code,detail:cliError.message,...cliError.hint?{hint:cliError.hint}:{}}}return skipped(name,`Skipped because ${failedName} failed`)})}}function credentialStoreForEnterpriseMcpConnection(connection,stores){return stores[connection.credentialStore]}var import_node_crypto7=require("crypto");function invalidImport(message,cause){return new CliError("INVALID_ARGUMENT",message,{exitCode:exitCodes.invalidArgument,...cause?{cause}:{}})}function parseDocument(input){let decoded;try{decoded=JSON.parse(input)}catch(cause){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u5FC5\u987B\u662F\u6709\u6548\u7684 JSON",cause)}if(!decoded||typeof decoded!=="object"||Array.isArray(decoded)){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u5FC5\u987B\u662F JSON \u5BF9\u8C61")}const root=decoded;if(Object.keys(root).length!==1||!("mcpServers"in root)){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u7684\u6839\u5B57\u6BB5\u5FC5\u987B\u4E14\u53EA\u80FD\u4F7F\u7528 mcpServers")}const servers=root.mcpServers;if(!servers||typeof servers!=="object"||Array.isArray(servers)){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u5FC5\u987B\u5305\u542B\u670D\u52A1\u5668\u914D\u7F6E")}const parsedServers=servers;if(!Object.keys(parsedServers).length){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u4E2D\u6CA1\u6709\u670D\u52A1\u5668")}return parsedServers}function hasForbiddenRawUrlDelimiter(value){const schemeEnd=value.indexOf("://");const authorityAndPath=schemeEnd<0?"":value.slice(schemeEnd+3);const authorityEnd=authorityAndPath.search(/[/?#]/u);const authority=authorityEnd<0?authorityAndPath:authorityAndPath.slice(0,authorityEnd);return authority.includes("@")||value.includes("#")}function parseUrl(value,options){if(typeof value!=="string"){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740")}if(hasForbiddenRawUrlDelimiter(value)){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740")}let url2;try{url2=new URL(value)}catch(cause){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740",cause)}if(!["http:","https:"].includes(url2.protocol)||!url2.hostname||url2.username||url2.password){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740")}const localHosts=new Set(["localhost","127.0.0.1","[::1]"]);if(url2.protocol==="http:"&&!options.allowInsecureHttp&&!localHosts.has(url2.hostname)){throw invalidImport("\u8FDC\u7A0B MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u4F7F\u7528 HTTPS")}return url2.toString()}function parseEnterpriseMcpHeaders(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw invalidImport("MCP \u670D\u52A1\u5668\u914D\u7F6E\u5FC5\u987B\u5305\u542B Authorization \u8BF7\u6C42\u5934")}const entries=Object.entries(value);let authorizationCount=0;for(const[name,headerValue]of entries){if(typeof headerValue!=="string"){throw invalidImport("MCP \u670D\u52A1\u5668\u8BF7\u6C42\u5934\u7684\u503C\u5FC5\u987B\u662F\u5B57\u7B26\u4E32")}try{new Headers({[name]:headerValue})}catch{throw invalidImport("MCP \u670D\u52A1\u5668\u8BF7\u6C42\u5934\u65E0\u6548")}if(name.toLowerCase()==="authorization"){authorizationCount+=1;if(!headerValue.trim().startsWith("Bearer ")){throw invalidImport("MCP Authorization \u8BF7\u6C42\u5934\u5FC5\u987B\u4F7F\u7528 Bearer Token")}}}if(authorizationCount!==1){throw invalidImport("MCP \u670D\u52A1\u5668\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u4E14\u53EA\u80FD\u5305\u542B\u4E00\u4E2A Authorization \u8BF7\u6C42\u5934")}return Object.fromEntries(entries)}function parseServer(serverKey,raw,options){if(!raw||typeof raw!=="object"||Array.isArray(raw)){throw invalidImport("MCP \u670D\u52A1\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}const server=raw;if(server.type!==void 0&&server.type!=="http"){throw invalidImport("MCP \u670D\u52A1\u5668 type \u5FC5\u987B\u662F http")}if(server.transport!==void 0&&server.transport!=="streamable_http"&&server.transport!=="streamable-http"){throw invalidImport("MCP \u670D\u52A1\u5668 transport \u5FC5\u987B\u662F streamable_http")}const connection={transport:"streamable-http",url:parseUrl(server.url,options),headers:parseEnterpriseMcpHeaders(server.headers)};return{serverKey,preferredId:serverKey,connection}}function parseEnterpriseMcpCandidates(raw){return Object.entries(parseDocument(raw)).map(([serverKey,server])=>({serverKey,raw:server}))}function validateEnterpriseMcpServer(candidate,options){return parseServer(candidate.serverKey,candidate.raw,options)}function selectByServerKey(servers,requested=[]){if(!requested.length)return[...servers];const serversByKey=new Map(servers.map(server=>[server.serverKey,server]));return requested.map(serverKey=>{const server=serversByKey.get(serverKey);if(!server){throw invalidImport(`\u627E\u4E0D\u5230 MCP \u670D\u52A1\u5668\uFF1A${serverKey}`)}return server})}function selectEnterpriseMcpCandidates(servers,requested=[]){return selectByServerKey(servers,requested)}function connectionIdForCollision(serverKey,url2){return`${serverKey}-${(0,import_node_crypto7.createHash)("sha256").update(new URL(url2).toString()).digest("hex").slice(0,8)}`}function credentialFailure(){return new CliError("MCP_FAILED","\u4F01\u4E1A MCP \u51ED\u636E\u4E0D\u53EF\u7528\u6216\u65E0\u6548",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5\u4F01\u4E1A MCP \u51ED\u636E\u5B58\u50A8\uFF0C\u5FC5\u8981\u65F6\u91CD\u65B0\u8FDE\u63A5\u3002"})}async function resolveEnterpriseMcpSpec(connection,stores){const store=credentialStoreForEnterpriseMcpConnection(connection,stores);let encodedCredential;try{encodedCredential=await store.get(connection.credentialRef)}catch{throw credentialFailure()}if(!encodedCredential){throw credentialFailure()}try{return{transport:connection.transport,url:connection.url,headers:parseEnterpriseMcpHeaders(JSON.parse(encodedCredential))}}catch{throw credentialFailure()}}var import_node_util6=require("util");function stateId(agent,connectionId){return connectionKey(agent,"user",connectionId)}function configurationConflict2(message){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:"\u8BF7\u68C0\u67E5\u8BE5 Agent \u7684\u540C\u540D MCP \u914D\u7F6E\u540E\u91CD\u8BD5\u3002"})}function hostFailure5(message){return new CliError("HOST_CONFIG_FAILED",message,{exitCode:exitCodes.hostConfigFailed,hint:"\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6B63\u8BE5 Agent \u7684\u540C\u540D MCP \u914D\u7F6E\u540E\u91CD\u8BD5\u3002"})}function ensureSupported(adapter,spec){if(!adapter.capabilities.scopes.includes("user")){throw new CliError("INVALID_ARGUMENT","\u8BE5 Agent \u4E0D\u652F\u6301\u7528\u6237\u7EA7 MCP \u914D\u7F6E",{exitCode:exitCodes.invalidArgument})}if(!adapter.capabilities.transports.includes(spec.transport)){throw new CliError("INVALID_ARGUMENT","\u8BE5 Agent \u4E0D\u652F\u6301 HTTP MCP \u8FDE\u63A5",{exitCode:exitCodes.invalidArgument})}}function determineAction(input){const{connectionId,desired,host,managed}=input;if(!managed&&!host)return"create";if(!managed&&host)return"takeover-unmanaged";if(!managed)return"create";if(managed.connectionId!==connectionId||!host||host.fingerprint!==managed.fingerprint){return"blocked-drift"}return fingerprintConnection(host.spec)===fingerprintConnection(desired)?"unchanged":"update-managed"}function success2(target,status2,message){return{stage:"agent",target,ok:true,status:status2,message}}function failed(target,cause){return{stage:"agent",target,ok:false,status:"failed",...cause instanceof CliError?{code:cause.code}:{code:"HOST_CONFIG_FAILED"},message:"\u4F01\u4E1A MCP \u5728 Agent \u4E2D\u5237\u65B0\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u540C\u540D\u914D\u7F6E\u540E\u91CD\u8BD5\u3002"}}async function restoreHost(adapter,name,backup){try{await adapter.remove(name,"user");if(backup)await adapter.add(name,"user",backup.spec)}catch{throw hostFailure5("\u4F01\u4E1A MCP \u66F4\u65B0\u5931\u8D25\u4E14\u65E0\u6CD5\u6062\u590D\u539F\u6709 Agent \u914D\u7F6E\uFF0C\u8BF7\u68C0\u67E5\u540C\u540D\u914D\u7F6E\u540E\u91CD\u8BD5\u3002")}}function managedRecord(input){return{id:stateId(input.agent,input.connectionId),connectionId:input.connectionId,fingerprint:input.fingerprint,updatedAt:input.now.toISOString()}}async function attachEnterpriseMcp(runtime2,input){const adapter=runtime2.adapters[input.agent];ensureSupported(adapter,input.spec);await adapter.detect();const id=stateId(input.agent,input.connection.id);const[host,managed]=await Promise.all([adapter.read(input.connection.id,"user"),runtime2.managed.getAgent(id)]);const action=determineAction({host,managed,desired:input.spec,connectionId:input.connection.id});if(action==="blocked-drift"){throw configurationConflict2("\u53D7\u7BA1 Agent MCP \u914D\u7F6E\u5DF2\u5728 SAG CLI \u4E4B\u5916\u88AB\u4FEE\u6539")}if(action==="unchanged"){return success2(input.agent,"skipped","Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u5DF2\u7ECF\u662F\u6700\u65B0\u72B6\u6001\u3002")}if(input.dryRun){return success2(input.agent,action==="create"?"created":"updated","\u5DF2\u751F\u6210\u4F01\u4E1A MCP \u63A5\u5165\u8BA1\u5212\uFF0C\u672A\u5199\u5165 Agent \u914D\u7F6E\u3002")}if(action==="takeover-unmanaged"&&!input.yes&&!await runtime2.confirm(`\u662F\u5426\u66FF\u6362 ${input.agent} \u4E2D\u73B0\u6709\u7684 ${input.connection.id} MCP\uFF1F`)){return success2(input.agent,"skipped","\u5DF2\u53D6\u6D88\u63A5\u7BA1 Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u3002")}try{if(host)await adapter.remove(input.connection.id,"user");await adapter.add(input.connection.id,"user",input.spec);const readBack=await adapter.read(input.connection.id,"user");if(!readBack||fingerprintConnection(readBack.spec)!==fingerprintConnection(input.spec)){throw configurationConflict2("Agent MCP \u56DE\u8BFB\u7ED3\u679C\u4E0E\u8BF7\u6C42\u7684\u8FDE\u63A5\u4E0D\u4E00\u81F4")}await runtime2.verifier.verify(readBack.spec,{timeoutMs:input.timeoutMs});await runtime2.managed.setAgent(managedRecord({agent:input.agent,connectionId:input.connection.id,fingerprint:readBack.fingerprint,now:runtime2.now()}))}catch{await restoreHost(adapter,input.connection.id,host);throw hostFailure5("\u4F01\u4E1A MCP \u66F4\u65B0\u5931\u8D25\uFF0C\u5DF2\u6062\u590D Agent \u4E2D\u539F\u6709\u7684\u914D\u7F6E\u3002")}return success2(input.agent,action==="create"?"created":"updated","\u4F01\u4E1A MCP \u5DF2\u63A5\u5165 Agent \u5E76\u901A\u8FC7\u9A8C\u8BC1\u3002")}async function inspectEnterpriseAgent(runtime2,input){const adapter=runtime2.adapters[input.agent];const id=stateId(input.agent,input.connection.id);const[host,managed]=await Promise.all([adapter.read(input.connection.id,"user"),runtime2.managed.getAgent(id)]);return{agent:input.agent,connectionId:input.connection.id,managed:Boolean(managed),connected:Boolean(host),drifted:Boolean(managed&&(managed.connectionId!==input.connection.id||!host||host.fingerprint!==managed.fingerprint||input.spec!==void 0&&fingerprintConnection(host.spec)!==fingerprintConnection(input.spec)))}}async function detachEnterpriseMcp(runtime2,input){const adapter=runtime2.adapters[input.agent];const id=stateId(input.agent,input.connection.id);const[host,managed]=await Promise.all([adapter.read(input.connection.id,"user"),runtime2.managed.getAgent(id)]);if(!managed||managed.connectionId!==input.connection.id||!host){throw configurationConflict2("\u8BE5 Agent MCP \u914D\u7F6E\u4E0D\u53D7\u5F53\u524D\u4F01\u4E1A\u8FDE\u63A5\u7BA1\u7406")}if(host.fingerprint!==managed.fingerprint){throw configurationConflict2("\u53D7\u7BA1 Agent MCP \u914D\u7F6E\u5DF2\u5728 SAG CLI \u4E4B\u5916\u88AB\u4FEE\u6539")}if(input.dryRun){return success2(input.agent,"updated","\u5DF2\u751F\u6210\u4F01\u4E1A MCP \u79FB\u9664\u8BA1\u5212\uFF0C\u672A\u4FEE\u6539 Agent \u914D\u7F6E\u3002")}if(!input.yes&&!await runtime2.confirm(`\u662F\u5426\u4ECE ${input.agent} \u79FB\u9664 ${input.connection.id}\uFF1F`)){return success2(input.agent,"skipped","\u5DF2\u53D6\u6D88\u79FB\u9664 Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u3002")}try{await adapter.remove(input.connection.id,"user");await runtime2.managed.deleteAgent(id)}catch{try{await adapter.add(input.connection.id,"user",host.spec)}catch{throw hostFailure5("\u4F01\u4E1A MCP \u79FB\u9664\u5931\u8D25\uFF0C\u4E14\u65E0\u6CD5\u6062\u590D Agent \u4E2D\u539F\u6709\u7684\u914D\u7F6E\u3002")}throw hostFailure5("\u4F01\u4E1A MCP \u79FB\u9664\u5931\u8D25\uFF0C\u5DF2\u6062\u590D Agent \u4E2D\u539F\u6709\u7684\u914D\u7F6E\u3002")}return success2(input.agent,"updated","\u5DF2\u4ECE Agent \u79FB\u9664\u4F01\u4E1A MCP \u914D\u7F6E\u3002")}function agentForState(state,connectionId){return["codex","claude-code","workbuddy"].find(agent=>state.id===stateId(agent,connectionId))??null}async function refreshManagedAgents(runtime2,input){const managed=await runtime2.managed.listAgents();const matching=managed.filter(state=>state.connectionId===input.connection.id);return Promise.all(matching.map(async state=>{const agent=agentForState(state,input.connection.id);if(!agent)return failed(state.id,configurationConflict2("\u53D7\u7BA1 Agent \u72B6\u6001\u65E0\u6548"));try{return await attachEnterpriseMcp(runtime2,{...input,agent,yes:true})}catch(cause){return failed(agent,cause)}}))}var import_node_crypto8=require("crypto");var import_promises11=require("fs/promises");var import_node_url=require("url");var import_node_path13=__toESM(require("path"),1);var skillName="sag-mcp";var skillDescription="Use connected enterprise SAG MCP servers to search, read, and manage authorized knowledge.";var requiredReferences=["references/cli-reference.md","references/tool-safety.md"];function skillTarget(agent,options){switch(agent){case"codex":return import_node_path13.default.join(options.CODEX_HOME||import_node_path13.default.join(options.home,".codex"),"skills",skillName);case"claude-code":return import_node_path13.default.join(options.home,".claude","skills",skillName);case"workbuddy":return import_node_path13.default.join(options.home,".workbuddy","skills",skillName)}}function managedSkillId(agent){return`${agent}:${skillName}`}function bundledSkillPath(){const moduleDirectory=import_node_path13.default.dirname((0,import_node_url.fileURLToPath)(__sagSkillImportMetaUrl));const packageRoot=import_node_path13.default.basename(moduleDirectory)==="dist"?import_node_path13.default.dirname(moduleDirectory):import_node_path13.default.resolve(moduleDirectory,"../../..");return import_node_path13.default.join(packageRoot,"skills",skillName)}function timestamp(now){return now.toISOString().replace(/[-:.]/gu,"")}function siblingPath(target,prefix,now){return import_node_path13.default.join(import_node_path13.default.dirname(target),`${import_node_path13.default.basename(target)}.${prefix}-${timestamp(now)}-${process.pid}`)}async function exists(target){try{await(0,import_promises11.lstat)(target);return true}catch(cause){if(cause.code==="ENOENT")return false;throw cause}}async function validateSkillBundle(bundlePath){const skill=await(0,import_promises11.readFile)(import_node_path13.default.join(bundlePath,"SKILL.md"),"utf8");const lines=skill.split(/\r?\n/u);const lineCount=skill.endsWith("\n")?lines.length-1:lines.length;if(lineCount>=100||lines[0]!=="---"||lines[1]!==`name: ${skillName}`||lines[2]!==`description: ${skillDescription}`||lines[3]!=="---"){throw new Error("\u968F\u5305\u53D1\u5E03\u7684 SAG MCP Skill frontmatter \u65E0\u6548\u3002")}for(const reference of requiredReferences){await(0,import_promises11.readFile)(import_node_path13.default.join(bundlePath,reference),"utf8");if(!skill.includes(`(${reference})`)){throw new Error(`\u968F\u5305\u53D1\u5E03\u7684 SAG MCP Skill \u672A\u5F15\u7528 ${reference}\u3002`)}}}async function updateDirectoryFingerprint(hash2,root,relative=""){const current=import_node_path13.default.join(root,relative);const entries=await(0,import_promises11.readdir)(current,{withFileTypes:true});for(const entry of entries.sort((left,right)=>left.name.localeCompare(right.name))){const entryRelative=import_node_path13.default.join(relative,entry.name);if(entry.isDirectory()){hash2.update(`directory:${entryRelative}
|
|
128
|
+
${value}`,dataLines++;break;case"id":id=value.includes("\0")?void 0:value;break;case"retry":/^\d+$/.test(value)?onRetry(parseInt(value,10)):onError(new ParseError(`Invalid \`retry\` value: "${value}"`,{type:"invalid-retry",value,line}));break;default:onError(new ParseError(`Unknown field "${field.length>20?`${field.slice(0,20)}\u2026`:field}"`,{type:"unknown-field",field,value,line}));break}}function dispatchEvent(){dataLines>0&&onEvent({id,event:eventType,data}),id=void 0,data="",dataLines=0,eventType=void 0}function reset(options={}){if(options.consume&&pendingFragments.length>0){const incompleteLine=pendingFragments.join("");parseLine(incompleteLine,0,incompleteLine.length)}isFirstChunk=true,id=void 0,data="",dataLines=0,eventType=void 0,pendingFragments.length=0,pendingFragmentsLength=0,terminated=false}return{feed,reset}}function isDataPrefix(chunk,i,firstCharCode){return firstCharCode===100&&chunk.charCodeAt(i+1)===97&&chunk.charCodeAt(i+2)===116&&chunk.charCodeAt(i+3)===97&&chunk.charCodeAt(i+4)===58}function isEventPrefix(chunk,i,firstCharCode){return firstCharCode===101&&chunk.charCodeAt(i+1)===118&&chunk.charCodeAt(i+2)===101&&chunk.charCodeAt(i+3)===110&&chunk.charCodeAt(i+4)===116&&chunk.charCodeAt(i+5)===58}var EventSourceParserStream=class extends TransformStream{constructor({onError,onRetry,onComment,maxBufferSize}={}){let parser;super({start(controller){parser=createParser({onEvent:event=>{controller.enqueue(event)},onError(error51){typeof onError=="function"&&onError(error51),(onError==="terminate"||error51.type==="max-buffer-size-exceeded")&&controller.error(error51)},onRetry,onComment,maxBufferSize})},transform(chunk){parser.feed(chunk)}})}};var OAuthClientFlowError=class extends Error{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.OAuthClientFlowError"})}static[Symbol.hasInstance](value){return brandedHasInstance(this,value)}static isInstance(value){if(typeof this!=="function")throw new TypeError("isInstance must be called on the class (e.g. `SdkError.isInstance(value)`); for callbacks use `v => SdkError.isInstance(v)`");return brandedHasInstance(this,value)}constructor(message){super(message);this.name=new.target.name;stampErrorBrands(this,new.target)}};var IssuerMismatchError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.IssuerMismatchError"})}kind;expected;received;constructor(kind,expected,received){super(`Issuer mismatch in ${kind==="metadata"?"authorization server metadata (RFC 8414 \xA73.3)":"authorization response (RFC 9207)"}: expected ${JSON.stringify(expected)}, received ${JSON.stringify(received)}`);this.kind=kind;this.expected=expected;this.received=received}};var RegistrationRejectedError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.RegistrationRejectedError"})}status;body;submittedMetadata;constructor(args){super(`Dynamic Client Registration rejected (HTTP ${args.status}): ${args.body}`);this.status=args.status;this.body=args.body;this.submittedMetadata=args.submittedMetadata}};var InsecureTokenEndpointError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.InsecureTokenEndpointError"})}tokenEndpoint;constructor(tokenEndpoint){super(`Refusing to send credentials to non-https token endpoint '${tokenEndpoint}'. OAuth token requests MUST use TLS (localhost / 127.0.0.1 / ::1 are exempt).`);this.tokenEndpoint=tokenEndpoint}};var AuthorizationServerMismatchError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.AuthorizationServerMismatchError"})}constructor(recordedIssuer,currentIssuer){super(`Authorization server changed between redirect and callback (redirected to ${JSON.stringify(recordedIssuer)}, callback resolved ${JSON.stringify(currentIssuer)}); refusing to send authorization_code/code_verifier to a different token endpoint`);this.recordedIssuer=recordedIssuer;this.currentIssuer=currentIssuer}};var InsufficientScopeError=class extends OAuthClientFlowError{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.InsufficientScopeError"})}requiredScope;resourceMetadataUrl;errorDescription;constructor(init){super(`Insufficient scope${init.requiredScope?`: required "${init.requiredScope}"`:""}`);this.requiredScope=init.requiredScope;this.resourceMetadataUrl=init.resourceMetadataUrl;this.errorDescription=init.errorDescription}};function discardIfIssuerMismatch(stored,issuer,opts){if(stored===void 0)return void 0;if(stored.issuer===void 0){if(opts?.canPersistStamp!==false)console.warn("[mcp-sdk] SEP-2352: stored OAuth credential has no 'issuer' stamp (pre-upgrade storage or provider not round-tripping the value). SEP-2352 isolation is inactive for this read; ensure your provider round-trips the issuer field.");return stored}return issuersMatch(stored.issuer,issuer)?stored:void 0}function issuersMatch(a,b){return a===b||a.endsWith("/")&&a.slice(0,-1)===b||b.endsWith("/")&&b.slice(0,-1)===a}function isOAuthClientProvider(provider){if(provider==null)return false;const p=provider;return typeof p.tokens==="function"&&typeof p.clientInformation==="function"}async function handleOAuthUnauthorized(provider,ctx,extraAuthOptions){const{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(ctx.response);if(await auth(provider,{serverUrl:ctx.serverUrl,resourceMetadataUrl,scope,fetchFn:ctx.fetchFn,...extraAuthOptions})!=="AUTHORIZED")throw new UnauthorizedError}function adaptOAuthProvider(provider,extraAuthOptions){return{token:async()=>{return(await provider.tokens())?.access_token},onUnauthorized:async ctx=>handleOAuthUnauthorized(provider,ctx,extraAuthOptions)}}var UnauthorizedError=class extends Error{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.UnauthorizedError"})}static[Symbol.hasInstance](value){return brandedHasInstance(this,value)}static isInstance(value){if(typeof this!=="function")throw new TypeError("isInstance must be called on the class (e.g. `SdkError.isInstance(value)`); for callbacks use `v => SdkError.isInstance(v)`");return brandedHasInstance(this,value)}constructor(message){super(message??"Unauthorized");this.name="UnauthorizedError";stampErrorBrands(this,new.target)}};function isIssParameterSupported(metadata){return metadata?.authorization_response_iss_parameter_supported===true}function validateAuthorizationResponseIssuer({iss,expectedIssuer,issParameterSupported}){if(expectedIssuer===void 0)return;if(iss===void 0){if(issParameterSupported)throw new IssuerMismatchError("authorization_response",expectedIssuer,void 0);return}if(iss!==expectedIssuer)throw new IssuerMismatchError("authorization_response",expectedIssuer,iss)}function computeScopeUnion(...scopes){const seen=new Set;for(const scope of scopes){if(!scope)continue;for(const token of scope.split(/\s+/))if(token)seen.add(token)}return seen.size>0?[...seen].join(" "):void 0}function isStrictScopeSuperset(union2,current){if(!union2)return false;const currentSet=new Set((current??"").split(/\s+/).filter(Boolean));for(const token of union2.split(/\s+/))if(token&&!currentSet.has(token))return true;return false}async function resolveAuthorizationCallbackParams(codeOrParams,iss,provider,serverUrl,opts){if(typeof codeOrParams==="string")return{authorizationCode:codeOrParams,iss};const issParam=codeOrParams.get("iss")??void 0;const code=codeOrParams.get("code");if(code)return{authorizationCode:code,iss:issParam};let metadata=(await provider.discoveryState?.())?.authorizationServerMetadata;if(!metadata)try{metadata=(await discoverOAuthServerInfo(serverUrl,opts)).authorizationServerMetadata}catch{metadata=void 0}if(!metadata)throw new UnauthorizedError("Authorization callback failed and the issuer could not be verified");validateAuthorizationResponseIssuer({iss:issParam,expectedIssuer:metadata.issuer,issParameterSupported:isIssParameterSupported(metadata)});const error51=codeOrParams.get("error");if(error51)throw new OAuthError(error51,codeOrParams.get("error_description")??error51,codeOrParams.get("error_uri")??void 0);throw new UnauthorizedError("Authorization callback contained neither `code` nor `error`")}function isClientAuthMethod(method){return["client_secret_basic","client_secret_post","none"].includes(method)}var AUTHORIZATION_CODE_RESPONSE_TYPE="code";var AUTHORIZATION_CODE_CHALLENGE_METHOD="S256";function selectClientAuthMethod(clientInformation,supportedMethods){const hasClientSecret=clientInformation.client_secret!==void 0;if("token_endpoint_auth_method"in clientInformation&&clientInformation.token_endpoint_auth_method&&isClientAuthMethod(clientInformation.token_endpoint_auth_method)&&(supportedMethods.length===0||supportedMethods.includes(clientInformation.token_endpoint_auth_method)))return clientInformation.token_endpoint_auth_method;if(supportedMethods.length===0)return hasClientSecret?"client_secret_basic":"none";if(hasClientSecret&&supportedMethods.includes("client_secret_basic"))return"client_secret_basic";if(hasClientSecret&&supportedMethods.includes("client_secret_post"))return"client_secret_post";if(supportedMethods.includes("none"))return"none";return hasClientSecret?"client_secret_post":"none"}function applyClientAuthentication(method,clientInformation,headers,params){const{client_id,client_secret}=clientInformation;switch(method){case"client_secret_basic":applyBasicAuth(client_id,client_secret,headers);return;case"client_secret_post":applyPostAuth(client_id,client_secret,params);return;case"none":applyPublicAuth(client_id,params);return;default:throw new Error(`Unsupported client authentication method: ${method}`)}}function applyBasicAuth(clientId,clientSecret,headers){if(!clientSecret)throw new Error("client_secret_basic authentication requires a client_secret");const credentials=btoa(`${clientId}:${clientSecret}`);headers.set("Authorization",`Basic ${credentials}`)}function applyPostAuth(clientId,clientSecret,params){params.set("client_id",clientId);if(clientSecret)params.set("client_secret",clientSecret)}function applyPublicAuth(clientId,params){params.set("client_id",clientId)}function isLoopbackHost(hostname3){return hostname3==="localhost"||hostname3==="127.0.0.1"||hostname3==="[::1]"||hostname3==="::1"}function assertSecureTokenEndpoint(tokenEndpoint){const url2=new URL(String(tokenEndpoint));if(url2.protocol!=="https:"&&!isLoopbackHost(url2.hostname))throw new InsecureTokenEndpointError(url2.href);return url2}function deriveApplicationType(redirectUris){for(const raw of redirectUris??[]){let url2;try{url2=new URL(raw)}catch{continue}if(url2.protocol!=="http:"&&url2.protocol!=="https:")return"native";if(isLoopbackHost(url2.hostname))return"native"}return"web"}function resolveClientMetadata(provider){const clientMetadata=provider.clientMetadata;return{...clientMetadata,grant_types:clientMetadata.grant_types??(provider.redirectUrl===void 0?void 0:["authorization_code","refresh_token"]),application_type:clientMetadata.application_type??deriveApplicationType(clientMetadata.redirect_uris)}}async function parseErrorResponse(input){const statusCode=input instanceof Response?input.status:void 0;const body=input instanceof Response?await input.text():input;try{const result=OAuthErrorResponseSchema.parse(JSON.parse(body));return OAuthError.fromResponse(result)}catch(error51){const errorMessage=`${statusCode?`HTTP ${statusCode}: `:""}Invalid OAuth error response: ${error51}. Raw body: ${body}`;return new OAuthError(OAuthErrorCode.ServerError,errorMessage)}}async function auth(provider,options){try{return await authInternal(provider,options)}catch(error51){if(error51 instanceof OAuthError){if(error51.code===OAuthErrorCode.InvalidClient||error51.code===OAuthErrorCode.UnauthorizedClient){await provider.invalidateCredentials?.("client");await provider.invalidateCredentials?.("tokens");return await authInternal(provider,options)}else if(error51.code===OAuthErrorCode.InvalidGrant){await provider.invalidateCredentials?.("tokens");return await authInternal(provider,options)}}throw error51}}function determineScope(options){const{requestedScope,resourceMetadata,authServerMetadata,clientMetadata}=options;let effectiveScope=requestedScope||resourceMetadata?.scopes_supported?.join(" ")||clientMetadata.scope;if(effectiveScope&&authServerMetadata?.scopes_supported?.includes("offline_access")&&!effectiveScope.split(" ").includes("offline_access")&&clientMetadata.grant_types?.includes("refresh_token"))effectiveScope=`${effectiveScope} offline_access`;return effectiveScope}async function authInternal(provider,{serverUrl,authorizationCode,iss,scope,resourceMetadataUrl,fetchFn,skipIssuerMetadataValidation,forceReauthorization}){const clientMetadata=resolveClientMetadata(provider);const cachedState=await provider.discoveryState?.();let resourceMetadata;let authorizationServerUrl;let metadata;let freshDiscoveryState;let effectiveResourceMetadataUrl=resourceMetadataUrl;if(!effectiveResourceMetadataUrl&&cachedState?.resourceMetadataUrl)effectiveResourceMetadataUrl=new URL(cachedState.resourceMetadataUrl);if(cachedState?.authorizationServerUrl){authorizationServerUrl=cachedState.authorizationServerUrl;resourceMetadata=cachedState.resourceMetadata;metadata=cachedState.authorizationServerMetadata??await discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn,skipIssuerValidation:skipIssuerMetadataValidation});if(!resourceMetadata)try{resourceMetadata=await discoverOAuthProtectedResourceMetadata(serverUrl,{resourceMetadataUrl:effectiveResourceMetadataUrl},fetchFn)}catch(error51){if(error51 instanceof TypeError)throw error51}if(metadata!==cachedState.authorizationServerMetadata||resourceMetadata!==cachedState.resourceMetadata)await provider.saveDiscoveryState?.({authorizationServerUrl:String(authorizationServerUrl),resourceMetadataUrl:effectiveResourceMetadataUrl?.toString(),resourceMetadata,authorizationServerMetadata:metadata})}else{const serverInfo=await discoverOAuthServerInfo(serverUrl,{resourceMetadataUrl:effectiveResourceMetadataUrl,fetchFn,skipIssuerMetadataValidation});authorizationServerUrl=serverInfo.authorizationServerUrl;metadata=serverInfo.authorizationServerMetadata;resourceMetadata=serverInfo.resourceMetadata;freshDiscoveryState={authorizationServerUrl:String(authorizationServerUrl),resourceMetadataUrl:effectiveResourceMetadataUrl?.toString(),resourceMetadata,authorizationServerMetadata:metadata}}const issuer=metadata?.issuer??String(authorizationServerUrl);const infoCtx={issuer};await provider.saveAuthorizationServerUrl?.(issuer);if(authorizationCode!==void 0){const recordedIssuer=cachedState?.authorizationServerMetadata?.issuer??cachedState?.authorizationServerUrl;if(recordedIssuer===void 0){if(provider.saveDiscoveryState!==void 0)throw new AuthorizationServerMismatchError("discoveryState was not available on the callback leg; ensure your provider persists discoveryState alongside codeVerifier",issuer);console.warn("[mcp-sdk] OAuthClientProvider does not implement saveDiscoveryState()/discoveryState(); the SEP-2352 callback-leg authorization-server binding cannot be checked. Implement discoveryState (persist alongside codeVerifier) \u2014 see docs/migration/upgrade-to-v2.md \xA7SEP-2352.")}else if(!issuersMatch(recordedIssuer,issuer))throw new AuthorizationServerMismatchError(recordedIssuer,issuer)}if(freshDiscoveryState)await provider.saveDiscoveryState?.(freshDiscoveryState);const resource=await selectResourceURL(serverUrl,provider,resourceMetadata);if(resource)await provider.saveResourceUrl?.(String(resource));const resolvedScope=determineScope({requestedScope:scope,resourceMetadata,authServerMetadata:metadata,clientMetadata:provider.clientMetadata});const rawClientInfo=await Promise.resolve(provider.clientInformation(infoCtx));let clientInformation=discardIfIssuerMismatch(rawClientInfo,issuer,{canPersistStamp:provider.saveClientInformation!==void 0});if(clientInformation===void 0&&rawClientInfo?.issuer&&provider.saveClientInformation===void 0)throw new AuthorizationServerMismatchError(rawClientInfo.issuer,issuer);if(clientInformation&&clientInformation.issuer===void 0){clientInformation={...clientInformation,issuer};await provider.saveClientInformation?.(clientInformation,infoCtx)}if(!clientInformation){if(authorizationCode!==void 0)throw new Error("Existing OAuth client information is required when exchanging an authorization code");const supportsUrlBasedClientId=metadata?.client_id_metadata_document_supported===true;const clientMetadataUrl=provider.clientMetadataUrl;if(clientMetadataUrl&&!isHttpsUrl(clientMetadataUrl))throw new OAuthError(OAuthErrorCode.InvalidClientMetadata,`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${clientMetadataUrl}`);if(supportsUrlBasedClientId&&clientMetadataUrl){clientInformation={client_id:clientMetadataUrl,issuer};await provider.saveClientInformation?.(clientInformation,infoCtx)}else{if(!provider.saveClientInformation)throw new Error("OAuth client information must be saveable for dynamic registration");clientInformation={...await registerClient(authorizationServerUrl,{metadata,clientMetadata,scope:resolvedScope,fetchFn}),issuer};await provider.saveClientInformation(clientInformation,infoCtx)}}const nonInteractiveFlow=!provider.redirectUrl;if(authorizationCode!==void 0||nonInteractiveFlow){if(authorizationCode!==void 0)validateAuthorizationResponseIssuer({iss,expectedIssuer:metadata?.issuer,issParameterSupported:isIssParameterSupported(metadata)});const tokens$1=await fetchToken(provider,authorizationServerUrl,{metadata,resource,authorizationCode,iss,scope:resolvedScope,fetchFn});await provider.saveTokens({...tokens$1,issuer},infoCtx);return"AUTHORIZED"}let tokens=discardIfIssuerMismatch(await provider.tokens(infoCtx),issuer);if(tokens&&tokens.issuer===void 0){tokens={...tokens,issuer};await provider.saveTokens(tokens,infoCtx)}if(tokens?.refresh_token&&!forceReauthorization)try{const newTokens=await refreshAuthorization(authorizationServerUrl,{metadata,clientInformation,refreshToken:tokens.refresh_token,resource,addClientAuthentication:provider.addClientAuthentication,fetchFn});await provider.saveTokens({...newTokens,issuer},infoCtx);return"AUTHORIZED"}catch(error51){if(error51 instanceof InsecureTokenEndpointError)throw error51;if(!(error51 instanceof OAuthError)||error51.code===OAuthErrorCode.ServerError){}else throw error51}const state=provider.state?await provider.state():void 0;const{authorizationUrl,codeVerifier}=await startAuthorization(authorizationServerUrl,{metadata,clientInformation,state,redirectUrl:provider.redirectUrl,scope:resolvedScope,resource});await provider.saveCodeVerifier(codeVerifier);await provider.redirectToAuthorization(authorizationUrl);return"REDIRECT"}function isHttpsUrl(value){if(!value)return false;try{const url2=new URL(value);return url2.protocol==="https:"&&url2.pathname!=="/"}catch{return false}}async function selectResourceURL(serverUrl,provider,resourceMetadata){const defaultResource=resourceUrlFromServerUrl(serverUrl);if(provider.validateResourceURL)return await provider.validateResourceURL(defaultResource,resourceMetadata?.resource);if(!resourceMetadata)return;if(!checkResourceAllowed({requestedResource:defaultResource,configuredResource:resourceMetadata.resource}))throw new Error(`Protected resource ${resourceMetadata.resource} does not match expected ${defaultResource} (or origin)`);return new URL(resourceMetadata.resource)}function extractWWWAuthenticateParams(res){const authenticateHeader=res.headers.get("WWW-Authenticate");if(!authenticateHeader)return{};const[type,scheme]=authenticateHeader.split(" ");if(type?.toLowerCase()!=="bearer"||!scheme)return{};const resourceMetadataMatch=extractFieldFromWwwAuth(res,"resource_metadata")||void 0;let resourceMetadataUrl;if(resourceMetadataMatch)try{resourceMetadataUrl=new URL(resourceMetadataMatch)}catch{}const scope=extractFieldFromWwwAuth(res,"scope")||void 0;const error51=extractFieldFromWwwAuth(res,"error")||void 0;const errorDescription=extractFieldFromWwwAuth(res,"error_description")||void 0;return{resourceMetadataUrl,scope,error:error51,errorDescription}}function extractFieldFromWwwAuth(response,fieldName){const wwwAuthHeader=response.headers.get("WWW-Authenticate");if(!wwwAuthHeader)return null;const pattern=new RegExp(String.raw`${fieldName}=(?:"([^"]+)"|([^\s,]+))`);const match=wwwAuthHeader.match(pattern);if(match){const result=match[1]||match[2];if(result)return result}return null}async function discoverOAuthProtectedResourceMetadata(serverUrl,opts,fetchFn=fetch){const response=await discoverMetadataWithFallback(serverUrl,"oauth-protected-resource",fetchFn,{protocolVersion:opts?.protocolVersion,metadataUrl:opts?.resourceMetadataUrl});if(!response||response.status===404){await response?.text?.().catch(()=>{});throw new Error(`Resource server does not implement OAuth 2.0 Protected Resource Metadata.`)}if(!response.ok){await response.text?.().catch(()=>{});throw new Error(`HTTP ${response.status} trying to load well-known OAuth protected resource metadata.`)}return OAuthProtectedResourceMetadataSchema.parse(await response.json())}async function fetchWithCorsRetry(url2,headers,fetchFn=fetch){try{return await fetchFn(url2,{headers})}catch(error51){if(!(error51 instanceof TypeError)||!CORS_IS_POSSIBLE)throw error51;if(headers)try{return await fetchFn(url2,{})}catch(retryError){if(!(retryError instanceof TypeError))throw retryError;return}return}}function buildWellKnownPath(wellKnownPrefix,pathname="",options={}){if(pathname.endsWith("/"))pathname=pathname.slice(0,-1);return options.prependPathname?`${pathname}/.well-known/${wellKnownPrefix}`:`/.well-known/${wellKnownPrefix}${pathname}`}async function tryMetadataDiscovery(url2,protocolVersion,fetchFn=fetch){return await fetchWithCorsRetry(url2,{"MCP-Protocol-Version":protocolVersion},fetchFn)}function shouldAttemptFallback(response,pathname){if(!response)return true;if(pathname==="/")return false;return response.status>=400&&response.status<500||response.status===502}async function discoverMetadataWithFallback(serverUrl,wellKnownType,fetchFn,opts){const issuer=new URL(serverUrl);const protocolVersion=opts?.protocolVersion??LATEST_PROTOCOL_VERSION;let url2;if(opts?.metadataUrl)url2=new URL(opts.metadataUrl);else{const wellKnownPath=buildWellKnownPath(wellKnownType,issuer.pathname);url2=new URL(wellKnownPath,opts?.metadataServerUrl??issuer);url2.search=issuer.search}let response=await tryMetadataDiscovery(url2,protocolVersion,fetchFn);if(!opts?.metadataUrl&&shouldAttemptFallback(response,issuer.pathname))response=await tryMetadataDiscovery(new URL(`/.well-known/${wellKnownType}`,issuer),protocolVersion,fetchFn);return response}function buildDiscoveryUrls(authorizationServerUrl){const url2=typeof authorizationServerUrl==="string"?new URL(authorizationServerUrl):authorizationServerUrl;const hasPath=url2.pathname!=="/";const urlsToTry=[];if(!hasPath){urlsToTry.push({url:new URL("/.well-known/oauth-authorization-server",url2.origin),type:"oauth"},{url:new URL(`/.well-known/openid-configuration`,url2.origin),type:"oidc"});return urlsToTry}let pathname=url2.pathname;if(pathname.endsWith("/"))pathname=pathname.slice(0,-1);urlsToTry.push({url:new URL(`/.well-known/oauth-authorization-server${pathname}`,url2.origin),type:"oauth"},{url:new URL(`/.well-known/openid-configuration${pathname}`,url2.origin),type:"oidc"},{url:new URL(`${pathname}/.well-known/openid-configuration`,url2.origin),type:"oidc"});return urlsToTry}async function discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn=fetch,protocolVersion=LATEST_PROTOCOL_VERSION,skipIssuerValidation=false}={}){const headers={"MCP-Protocol-Version":protocolVersion,Accept:"application/json"};const urlsToTry=buildDiscoveryUrls(authorizationServerUrl);for(const{url:endpointUrl,type}of urlsToTry){const response=await fetchWithCorsRetry(endpointUrl,headers,fetchFn);if(!response)continue;if(!response.ok){await response.text?.().catch(()=>{});if(response.status>=400&&response.status<500||response.status===502)continue;throw new Error(`HTTP ${response.status} trying to load ${type==="oauth"?"OAuth":"OpenID provider"} metadata from ${endpointUrl}`)}const parsed=type==="oauth"?OAuthMetadataSchema.parse(await response.json()):OpenIdProviderDiscoveryMetadataSchema.parse(await response.json());if(!skipIssuerValidation){const expectedIssuer=typeof authorizationServerUrl==="string"?authorizationServerUrl:authorizationServerUrl.href;if(!(parsed.issuer===expectedIssuer||expectedIssuer.endsWith("/")&&parsed.issuer===expectedIssuer.slice(0,-1)))throw new IssuerMismatchError("metadata",expectedIssuer,parsed.issuer)}return parsed}}async function discoverOAuthServerInfo(serverUrl,opts){let resourceMetadata;let authorizationServerUrl;try{resourceMetadata=await discoverOAuthProtectedResourceMetadata(serverUrl,{resourceMetadataUrl:opts?.resourceMetadataUrl},opts?.fetchFn);if(resourceMetadata.authorization_servers&&resourceMetadata.authorization_servers.length>0)authorizationServerUrl=resourceMetadata.authorization_servers[0]}catch(error51){if(error51 instanceof TypeError)throw error51}if(!authorizationServerUrl)authorizationServerUrl=String(new URL("/",serverUrl));const authorizationServerMetadata=await discoverAuthorizationServerMetadata(authorizationServerUrl,{fetchFn:opts?.fetchFn,skipIssuerValidation:opts?.skipIssuerMetadataValidation});return{authorizationServerUrl,authorizationServerMetadata,resourceMetadata}}async function startAuthorization(authorizationServerUrl,{metadata,clientInformation,redirectUrl,scope,state,resource}){let authorizationUrl;if(metadata){authorizationUrl=new URL(metadata.authorization_endpoint);if(!metadata.response_types_supported.includes(AUTHORIZATION_CODE_RESPONSE_TYPE))throw new Error(`Incompatible auth server: does not support response type ${AUTHORIZATION_CODE_RESPONSE_TYPE}`);if(metadata.code_challenge_methods_supported&&!metadata.code_challenge_methods_supported.includes(AUTHORIZATION_CODE_CHALLENGE_METHOD))throw new Error(`Incompatible auth server: does not support code challenge method ${AUTHORIZATION_CODE_CHALLENGE_METHOD}`)}else authorizationUrl=new URL("/authorize",authorizationServerUrl);const challenge=await pkceChallenge();const codeVerifier=challenge.code_verifier;const codeChallenge=challenge.code_challenge;authorizationUrl.searchParams.set("response_type",AUTHORIZATION_CODE_RESPONSE_TYPE);authorizationUrl.searchParams.set("client_id",clientInformation.client_id);authorizationUrl.searchParams.set("code_challenge",codeChallenge);authorizationUrl.searchParams.set("code_challenge_method",AUTHORIZATION_CODE_CHALLENGE_METHOD);authorizationUrl.searchParams.set("redirect_uri",String(redirectUrl));if(state)authorizationUrl.searchParams.set("state",state);if(scope)authorizationUrl.searchParams.set("scope",scope);if(scope?.split(" ").includes("offline_access"))authorizationUrl.searchParams.append("prompt","consent");if(resource)authorizationUrl.searchParams.set("resource",resource.href);return{authorizationUrl,codeVerifier}}function prepareAuthorizationCodeRequest(authorizationCode,codeVerifier,redirectUri){return new URLSearchParams({grant_type:"authorization_code",code:authorizationCode,code_verifier:codeVerifier,redirect_uri:String(redirectUri)})}async function executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation,addClientAuthentication,resource,fetchFn}){const tokenUrl=assertSecureTokenEndpoint(metadata?.token_endpoint??new URL("/token",authorizationServerUrl));const headers=new Headers({"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"});if(resource)tokenRequestParams.set("resource",resource.href);if(addClientAuthentication)await addClientAuthentication(headers,tokenRequestParams,tokenUrl,metadata);else if(clientInformation)applyClientAuthentication(selectClientAuthMethod(clientInformation,metadata?.token_endpoint_auth_methods_supported??[]),clientInformation,headers,tokenRequestParams);const response=await(fetchFn??fetch)(tokenUrl,{method:"POST",headers,body:tokenRequestParams});if(!response.ok)throw await parseErrorResponse(response);const json2=await response.json();try{return OAuthTokensSchema.parse(json2)}catch(parseError){if(typeof json2==="object"&&json2!==null&&"error"in json2)throw await parseErrorResponse(JSON.stringify(json2));throw parseError}}async function refreshAuthorization(authorizationServerUrl,{metadata,clientInformation,refreshToken,resource,addClientAuthentication,fetchFn}){return{refresh_token:refreshToken,...await executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams:new URLSearchParams({grant_type:"refresh_token",refresh_token:refreshToken}),clientInformation,addClientAuthentication,resource,fetchFn})}}async function fetchToken(provider,authorizationServerUrl,{metadata,resource,authorizationCode,iss,scope,fetchFn}={}){if(authorizationCode!==void 0)validateAuthorizationResponseIssuer({iss,expectedIssuer:metadata?.issuer,issParameterSupported:isIssParameterSupported(metadata)});const effectiveScope=scope??provider.clientMetadata.scope;let tokenRequestParams;if(provider.prepareTokenRequest)tokenRequestParams=await provider.prepareTokenRequest(effectiveScope);if(!tokenRequestParams){if(!authorizationCode)throw new Error("Either provider.prepareTokenRequest() or authorizationCode is required");if(!provider.redirectUrl)throw new Error("redirectUrl is required for authorization_code flow");tokenRequestParams=prepareAuthorizationCodeRequest(authorizationCode,await provider.codeVerifier(),provider.redirectUrl)}const clientInformation=await provider.clientInformation({issuer:metadata?.issuer??String(authorizationServerUrl)});return executeTokenRequest(authorizationServerUrl,{metadata,tokenRequestParams,clientInformation:clientInformation??void 0,addClientAuthentication:provider.addClientAuthentication,resource,fetchFn})}async function registerClient(authorizationServerUrl,{metadata,clientMetadata,scope,fetchFn}){let registrationUrl;if(metadata){if(!metadata.registration_endpoint)throw new Error("Incompatible auth server: does not support dynamic client registration");registrationUrl=new URL(metadata.registration_endpoint)}else registrationUrl=new URL("/register",authorizationServerUrl);const submittedMetadata={...clientMetadata,...scope===void 0?{}:{scope}};const response=await(fetchFn??fetch)(registrationUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(submittedMetadata)});if(!response.ok)throw new RegistrationRejectedError({status:response.status,body:await response.text(),submittedMetadata});return OAuthClientInformationFullSchema.parse(await response.json())}var CAP_EXEMPT_METHODS=new Set(["tools/list","prompts/list","resources/list","resources/templates/list","server/discover"]);var InMemoryResponseCacheStore=class{_entries=new Map;_maxEntries;_stamp=0;_cappedSize=0;constructor(options){this._maxEntries=options?.maxEntries??512}get size(){return this._entries.size}get(key){return this._entries.get(keyOf(key))}set(key,entry){const k=keyOf(key);const exempt=CAP_EXEMPT_METHODS.has(key.method);const isNew=!this._entries.has(k);if(!exempt&&isNew&&this._maxEntries>0&&this._cappedSize>=this._maxEntries){for(const oldKey of this._entries.keys())if(!CAP_EXEMPT_METHODS.has(oldKey.slice(0,oldKey.indexOf("\0")))){this._entries.delete(oldKey);this._cappedSize--;break}}const stamp=++this._stamp;this._entries.set(k,{...entry,stamp});if(isNew&&!exempt)this._cappedSize++;return stamp}delete(key){if(this._entries.delete(keyOf(key))&&!CAP_EXEMPT_METHODS.has(key.method))this._cappedSize--}evict(method){const prefix=`${method}\0`;const exempt=CAP_EXEMPT_METHODS.has(method);for(const k of this._entries.keys())if(k.startsWith(prefix)){this._entries.delete(k);if(!exempt)this._cappedSize--}}clear(){this._entries.clear();this._cappedSize=0}};function keyOf(key){return`${key.method}\0${JSON.stringify([key.partition??"",key.params??""])}`}function genKey(method,params){return params===void 0?method:`${method}\0${params}`}var MAX_CACHE_TTL_MS=864e5;var ClientResponseCache=class{_evictionGeneration=new Map;_toolIndex;_toolOutputValidatorIndex;_serverIdentity="";constructor(_store,_isUserSupplied,_reportError=()=>{},_cachePartition="",_now=Date.now){this._store=_store;this._isUserSupplied=_isUserSupplied;this._reportError=_reportError;this._cachePartition=_cachePartition;this._now=_now}now(){return this._now()}setServerIdentity(identity){this._serverIdentity=identity}_partitionFor(scope){return JSON.stringify([this._serverIdentity,scope==="public"?"":this._cachePartition])}async _probe(method,params){const key={method,params:params??""};const ownPartition=this._partitionFor("private");const own=await this._store.get({...key,partition:ownPartition});if(own!==void 0)return own;const sharedPartition=this._partitionFor("public");if(sharedPartition===ownPartition)return void 0;const shared=await this._store.get({...key,partition:sharedPartition});return shared?.scope==="public"?shared:void 0}async evict(method){this._evictionGeneration.set(method,(this._evictionGeneration.get(method)??0)+1);await this._deleteBoth(method,"")}async _deleteBoth(method,params){const ownPartition=this._partitionFor("private");const sharedPartition=this._partitionFor("public");try{await this._store.delete({method,params,partition:ownPartition})}catch(error51){this._reportError(error51)}if(sharedPartition!==ownPartition)try{await this._store.delete({method,params,partition:sharedPartition})}catch(error51){this._reportError(error51)}}async evictKey(method,params){const gk=genKey(method,params);const current=this._evictionGeneration.get(gk);if(current!==void 0)this._evictionGeneration.set(gk,current+1);await this._deleteBoth(method,params)}captureGeneration(method,params){const gk=genKey(method,params);const current=this._evictionGeneration.get(gk)??0;this._evictionGeneration.set(gk,current);return current}async write(method,value,capturedGen,freshness){if((this._evictionGeneration.get(genKey(method,freshness?.params))??0)!==capturedGen)return;const params=freshness?.params??"";const ownPartition=this._partitionFor("private");const sharedPartition=this._partitionFor("public");const partition=(freshness?.scope??"private")==="public"?sharedPartition:ownPartition;try{await this._store.set({method,params,partition},{value:encodeCacheValue(value),expiresAt:freshness?.expiresAt,scope:freshness?.scope})}catch(error51){this._reportError(error51)}if(sharedPartition!==ownPartition)try{await this._store.delete({method,params,partition:partition===ownPartition?sharedPartition:ownPartition})}catch(error51){this._reportError(error51)}}async read(method,params){const entry=await this._probe(method,params);if(entry?.expiresAt===void 0||!(entry.expiresAt>this.now()))return void 0;try{const parsed=JSON.parse(entry.value);if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))throw new TypeError("cached document is not an object");return{value:parsed}}catch(error51){this._reportError(error51);await this._deleteBoth(method,params??"");return}}resetForReconnect(){if(!this._isUserSupplied)this._store.clear();this._evictionGeneration.clear();this._toolIndex=void 0;this._toolOutputValidatorIndex=void 0;this._serverIdentity=""}async toolDefinition(name){const entry=await this._probe("tools/list");if(entry===void 0){this._toolIndex=void 0;return}if(this._toolIndex?.stamp!==entry.stamp){const list=this._decodeListTools(entry);const byName=new Map;if(list!==void 0)for(const tool of list.tools)byName.set(tool.name,tool);this._toolIndex={stamp:entry.stamp,byName}}return this._toolIndex.byName.get(name)}async outputValidator(name,compile){const entry=await this._probe("tools/list");if(entry===void 0){this._toolOutputValidatorIndex=void 0;return}if(this._toolOutputValidatorIndex?.stamp!==entry.stamp){const list=this._decodeListTools(entry)??{tools:[]};const byName=new Map;for(const tool of list.tools){const compiled=compile(tool);if(compiled!==void 0)byName.set(tool.name,compiled)}this._toolOutputValidatorIndex={stamp:entry.stamp,byName}}return this._toolOutputValidatorIndex.byName.get(name)}_decodeListTools(entry){try{const parsed=JSON.parse(entry.value);if(!Array.isArray(parsed?.tools)||!parsed.tools.every(t=>t!==null&&typeof t==="object"))throw new TypeError("cached tools/list document has a malformed tools array");return parsed}catch(error51){this._reportError(error51);return}}};function encodeCacheValue(value){let json2;try{json2=JSON.stringify(value)}catch(error51){throw new TypeError(`cache value is not JSON-serializable: ${error51 instanceof Error?error51.message:String(error51)}`)}if(typeof json2!=="string")throw new TypeError("cache value is not JSON-serializable: it has no JSON representation");return json2}var AUTH_SEAM=Symbol.for("mcp.authSeamEscape");function markAuthSeamEscape(error51){if(typeof error51==="object"&&error51!==null||typeof error51==="function")try{Object.defineProperty(error51,AUTH_SEAM,{value:true,configurable:true})}catch{}return error51}function isAuthSeamEscape(error51){return(typeof error51==="object"&&error51!==null||typeof error51==="function")&&error51[AUTH_SEAM]===true}var UNSUPPORTED_PROTOCOL_VERSION=-32022;var NOT_PROBE_RECOGNIZED=new Set([-32001,-32020,-32021]);function classifyProbeOutcome(outcome,context){switch(outcome.kind){case"result":return classifyResult(outcome.result,context);case"rpc-error":return classifyRpcError(outcome,context);case"http-error":return classifyHttpError(outcome,context);case"network-error":return classifyNetworkError(outcome.error,context);case"auth-required":return{kind:"error",error:outcome.error};case"closed":if(context.transportKind==="stdio")return{kind:"legacy"};return classifyNetworkError(new Error("Connection closed during the version negotiation probe"),context);case"timeout":if(context.transportKind==="stdio")return{kind:"legacy"};return{kind:"error",error:new SdkError(SdkErrorCode.RequestTimeout,`Version negotiation probe timed out after ${outcome.timeoutMs}ms`,{timeout:outcome.timeoutMs})}}}function classifyResult(result,context){const parsed=codecForVersion(MODERN_WIRE_REVISION).validateResult("server/discover",result);if(!parsed.ok)return{kind:"legacy"};const supportedVersions=parsed.value.supportedVersions;const overlap=context.clientModernVersions.find(version2=>supportedVersions.includes(version2));if(overlap!==void 0)return{kind:"modern",version:overlap,discover:parsed.value};if(context.fallbackAvailable)return{kind:"legacy"};return{kind:"error",error:new UnsupportedProtocolVersionError({supported:[...supportedVersions],requested:context.requestedVersion})}}function classifyRpcError(outcome,context){const{code,message,data}=outcome;if(code===UNSUPPORTED_PROTOCOL_VERSION){const supported=parseSupportedList(data);if(supported===void 0)return{kind:"legacy"};const error51=new UnsupportedProtocolVersionError({supported,requested:parseRequested(data)??context.requestedVersion},message);const supportedModern=modernProtocolVersions(supported);const mutual=context.clientModernVersions.find(version2=>supportedModern.includes(version2));if(mutual!==void 0)return{kind:"corrective",version:mutual,error:error51};if(supportedModern.length>0)return{kind:"error",error:error51};return context.fallbackAvailable?{kind:"legacy"}:{kind:"error",error:error51}}if(NOT_PROBE_RECOGNIZED.has(code))return{kind:"legacy"};return{kind:"legacy"}}function classifyHttpError(outcome,context){if(outcome.status===401||outcome.status===403){const isDenial=outcome.status===403;return{kind:"error",error:new SdkHttpError(isDenial?SdkErrorCode.ClientHttpForbidden:SdkErrorCode.ClientHttpAuthentication,`Version negotiation failed: ${isDenial?"the server denied access (HTTP 403)":"the server requires authorization (HTTP 401)"}`,{status:outcome.status,statusText:outcome.statusText,text:outcome.body})}}if(outcome.status>=500)return{kind:"error",error:new SdkHttpError(SdkErrorCode.EraNegotiationFailed,`Version negotiation failed: the server answered the probe with HTTP ${outcome.status}`,{status:outcome.status,statusText:outcome.statusText,text:outcome.body})};const rpcError=parseJsonRpcErrorBody(outcome.body);if(rpcError!==void 0)return classifyRpcError(rpcError,context);return{kind:"legacy"}}function classifyNetworkError(error51,context){if(context.environment==="browser"&&isOpaqueFetchTypeError(error51))return{kind:"legacy"};return{kind:"error",error:new SdkError(SdkErrorCode.EraNegotiationFailed,`Version negotiation probe failed: ${describeError(error51)}`,{cause:error51})}}function isOpaqueFetchTypeError(error51){return error51 instanceof TypeError||error51 instanceof Error&&error51.name==="TypeError"}function describeError(error51){return error51 instanceof Error?error51.message:String(error51)}function parseSupportedList(data){if(typeof data!=="object"||data===null)return void 0;const supported=data.supported;if(!Array.isArray(supported)||supported.length===0||!supported.every(v=>typeof v==="string"))return;return supported}function parseRequested(data){if(typeof data!=="object"||data===null)return void 0;const requested=data.requested;return typeof requested==="string"?requested:void 0}function parseJsonRpcErrorBody(body){if(body===void 0||body==="")return void 0;let parsed;try{parsed=JSON.parse(body)}catch{return}if(typeof parsed!=="object"||parsed===null)return void 0;const error51=parsed.error;if(typeof error51!=="object"||error51===null)return void 0;const{code,message,data}=error51;if(typeof code!=="number")return void 0;return{code,message:typeof message==="string"?message:"",data}}var DEFAULT_VERSION_NEGOTIATION_MODE="legacy";function resolveVersionNegotiation(options,supportedProtocolVersionsOption){const mode=options?.mode??DEFAULT_VERSION_NEGOTIATION_MODE;if(mode==="legacy")return{kind:"legacy"};const probe=options?.probe??{};if(typeof mode==="object"){if(!isModernProtocolVersion(mode.pin))throw new TypeError(`versionNegotiation: { pin: '${mode.pin}' } is not a modern protocol revision \u2014 pinning is for 2026-07-28 and later; omit versionNegotiation (or use mode: 'legacy') for 2025-era servers.`);return{kind:"pin",version:mode.pin,probe}}const explicitModern=supportedProtocolVersionsOption?modernProtocolVersions(supportedProtocolVersionsOption):[];return{kind:"auto",modernVersions:explicitModern.length>0?explicitModern:[...SUPPORTED_MODERN_PROTOCOL_VERSIONS],fallbackAvailable:supportedProtocolVersionsOption?legacyProtocolVersions(supportedProtocolVersionsOption).length>0:true,probe}}function detectProbeEnvironment(){const g=globalThis;return g.window!==void 0&&g.document!==void 0?"browser":"node"}function detectProbeTransportKind(transport){return"stderr"in transport&&"pid"in transport?"stdio":"http"}var ProbeWindow=class ProbeWindow2{_pending;_probeCounter=0;_savedOnMessage;_savedOnError;_savedOnClose;_closeDelivered=false;constructor(_transport){this._transport=_transport;this._savedOnMessage=_transport.onmessage;this._savedOnError=_transport.onerror;this._savedOnClose=_transport.onclose}static async open(transport){const window=new ProbeWindow2(transport);transport.onmessage=message=>{const pending=window._pending;if(pending!==void 0&&(isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message))&&message.id===pending.id){window._pending=void 0;if(isJSONRPCResultResponse(message))pending.resolve({kind:"response",result:message.result});else pending.resolve({kind:"response",error:message.error});return}};transport.onerror=error51=>{window._savedOnError?.(error51)};transport.onclose=()=>{const pending=window._pending;if(pending!==void 0){window._pending=void 0;pending.resolve({kind:"closed"})}window._closeDelivered=true;window._savedOnClose?.()};try{await transport.start()}catch(error51){window.detach();throw error51}return window}async exchange(buildRequest,timeoutMs){const id=`server-discover-probe-${++this._probeCounter}`;return new Promise(resolve=>{let settled=false;const settle=reply=>{if(settled)return;settled=true;clearTimeout(timer);if(this._pending?.id===id)this._pending=void 0;resolve(reply)};const timer=setTimeout(()=>settle({kind:"timeout"}),timeoutMs);this._pending={id,resolve:settle};this._transport.send(buildRequest(id)).catch(error51=>settle({kind:"send-error",error:error51}))})}detach(){this._pending=void 0;this._transport.onmessage=this._savedOnMessage;this._transport.onerror=this._savedOnError;if(this._closeDelivered&&this._savedOnClose!==void 0){const saved=this._savedOnClose;const transport=this._transport;let spent=false;const wrapper=()=>{if(!spent){spent=true;return}saved()};transport.onclose=wrapper;pendingSpentCloseGuards.set(transport,()=>{if(transport.onclose===wrapper)transport.onclose=saved})}else this._transport.onclose=this._savedOnClose}release(){this.detach();const transport=this._transport;const originalStart=transport.start;let armed=true;transport.start=async function(){if(armed){armed=false;transport.start=originalStart;return}return originalStart.call(transport)}}};var pendingSpentCloseGuards=new WeakMap;function disarmSpentCloseGuard(transport){const disarm=pendingSpentCloseGuards.get(transport);pendingSpentCloseGuards.delete(transport);disarm?.()}function buildProbeRequest(id,protocolVersion,clientInfo,capabilities){return{jsonrpc:"2.0",id,method:"server/discover",params:{_meta:codecForVersion(protocolVersion).outboundEnvelope({protocolVersion,clientInfo,clientCapabilities:capabilities})}}}function normalizeReply(reply,timeoutMs){switch(reply.kind){case"response":return reply.error===void 0?{kind:"result",result:reply.result}:{kind:"rpc-error",...reply.error};case"send-error":{const error51=reply.error;if(isAuthSeamEscape(error51)||error51 instanceof UnauthorizedError||error51 instanceof Error&&error51.name==="UnauthorizedError")return{kind:"auth-required",error:error51};if(error51 instanceof SdkHttpError){const text=error51.data?.text;return{kind:"http-error",status:error51.data.status,body:typeof text==="string"?text:void 0,statusText:error51.data.statusText}}return{kind:"network-error",error:error51}}case"closed":return{kind:"closed"};case"timeout":return{kind:"timeout",timeoutMs}}}async function negotiateEra(negotiation,deps){const timeoutMs=negotiation.probe.timeoutMs??deps.defaultTimeoutMs;const maxRetries=Math.max(0,negotiation.probe.maxRetries??0);const clientModernVersions=negotiation.kind==="pin"?[negotiation.version]:negotiation.modernVersions;const fallbackAvailable=negotiation.kind==="auto"&&negotiation.fallbackAvailable;const window=await ProbeWindow.open(deps.transport);const probe=async()=>{let requestedVersion=clientModernVersions[0];let correctiveUsed=false;let timeoutRetriesRemaining=maxRetries;for(;;){const reply=await window.exchange(id=>buildProbeRequest(id,requestedVersion,deps.clientInfo,deps.capabilities),timeoutMs);if(reply.kind==="timeout"&&timeoutRetriesRemaining>0){timeoutRetriesRemaining--;continue}const outcome=normalizeReply(reply,timeoutMs);const verdict=classifyProbeOutcome(outcome,{clientModernVersions,requestedVersion,fallbackAvailable,environment:deps.environment,transportKind:deps.transportKind});switch(verdict.kind){case"modern":return{era:"modern",version:verdict.version,discover:verdict.discover};case"corrective":if(correctiveUsed)throw verdict.error;correctiveUsed=true;requestedVersion=verdict.version;continue;case"legacy":{const closedCause=outcome.kind==="closed"?"the connection closed during the server/discover probe":void 0;if(negotiation.kind==="pin")throw new SdkError(SdkErrorCode.EraNegotiationFailed,closedCause===void 0?`Version negotiation failed: the server did not offer pinned protocol version ${negotiation.version} via server/discover (no fallback in pin mode)`:`Version negotiation failed: ${closedCause} before the server offered pinned protocol version ${negotiation.version} (no fallback in pin mode)`);if(!negotiation.fallbackAvailable)throw new SdkError(SdkErrorCode.EraNegotiationFailed,closedCause===void 0?"Version negotiation failed: the server gave no modern evidence and this client supports no pre-2026-07-28 protocol version to fall back to":`Version negotiation failed: ${closedCause} and this client supports no pre-2026-07-28 protocol version to fall back to`);if(closedCause!==void 0&&deps.disposableProbe!==true)throw new SdkError(SdkErrorCode.EraNegotiationFailed,`Version negotiation failed: ${closedCause} (this transport probed in place \u2014 the disposable sibling probe requires the SDK's base StdioClientTransport)`);return{era:"legacy"}}case"error":throw verdict.error}}};let result;try{result=await probe()}catch(error51){window.detach();throw error51}window.release();return result}function readStdioServerParams(transport){const proto=Object.getPrototypeOf(transport);if(proto===null||!Object.prototype.hasOwnProperty.call(proto,"_dispose"))return;const params=transport._serverParams;return typeof params==="object"&¶ms!==null&&typeof params.command==="string"?params:void 0}async function negotiateStdioViaSibling(negotiation,sessionTransport,params,deps){const SiblingTransport=sessionTransport.constructor;const sibling2=new SiblingTransport({...params,stderr:"ignore"});const originalClose=sessionTransport.close;let callerClosed=false;let signalClosed;const closedSignal=new Promise((_,reject)=>{signalClosed=()=>reject(callerCloseAbortError())});sessionTransport.close=async function(){callerClosed=true;signalClosed?.();return originalClose.call(sessionTransport)};let result;try{const negotiated=negotiateEra(negotiation,{...deps,transport:sibling2,transportKind:"stdio",disposableProbe:true});negotiated.catch(()=>{});result=await Promise.race([negotiated,closedSignal])}finally{await disposeSibling(sibling2);sessionTransport.close=originalClose}if(callerClosed)throw callerCloseAbortError();return result}function callerCloseAbortError(){return new SdkError(SdkErrorCode.EraNegotiationFailed,"Version negotiation failed: the transport was closed during the server/discover probe")}async function disposeSibling(sibling2){try{const dispose=sibling2._dispose;await(typeof dispose==="function"?dispose.call(sibling2):sibling2.close())}catch{}}function serverInfoFromDiscover(discover){const fromMeta=discover._meta?.[SERVER_INFO_META_KEY];return isSpecType.Implementation(fromMeta)?fromMeta:void 0}function applyElicitationDefaults(schema,data){if(!schema||data===null||typeof data!=="object")return;if(schema.type==="object"&&schema.properties&&typeof schema.properties==="object"){const obj=data;const props=schema.properties;for(const key of Object.keys(props)){const propSchema=props[key];if(obj[key]===void 0&&Object.prototype.hasOwnProperty.call(propSchema,"default"))obj[key]=propSchema.default;if(obj[key]!==void 0)applyElicitationDefaults(propSchema,obj[key])}}if(Array.isArray(schema.anyOf)){for(const sub of schema.anyOf)if(typeof sub!=="boolean")applyElicitationDefaults(sub,data)}if(Array.isArray(schema.oneOf)){for(const sub of schema.oneOf)if(typeof sub!=="boolean")applyElicitationDefaults(sub,data)}}function getSupportedElicitationModes(capabilities){if(!capabilities)return{supportsFormMode:false,supportsUrlMode:false};const hasFormCapability=capabilities.form!==void 0;const hasUrlCapability=capabilities.url!==void 0;return{supportsFormMode:hasFormCapability||!hasFormCapability&&!hasUrlCapability,supportsUrlMode:hasUrlCapability}}function validatePrior(prior){if(typeof prior==="object"&&prior!==null){if(prior.kind==="legacy"&&!("supportedVersions"in prior)&&!("discover"in prior))return prior;if(prior.kind==="modern"&&DiscoverResultSchema.safeParse(prior.discover).success)return prior}throw new SdkError(SdkErrorCode.EraNegotiationFailed,"connect({ prior }): unrecognized prior \u2014 expected { kind: 'modern', discover } or { kind: 'legacy' }")}var LIST_CHANGED_EVICTIONS={"notifications/tools/list_changed":["tools/list"],"notifications/prompts/list_changed":["prompts/list"],"notifications/resources/list_changed":["resources/list","resources/templates/list"]};var DEFAULT_LIST_MAX_PAGES=64;var Client=class extends Protocol{_serverCapabilities;_serverVersion;_capabilities;_instructions;_jsonSchemaValidator;_cache;_defaultCacheTtlMs;_listMaxPages;_listChangedDebounceTimers=new Map;_listChangedConfig;_enforceStrictCapabilities;_versionNegotiation;_supportedProtocolVersionsOption;_inputRequiredDriverConfig;_listenState=new Map;_nextListenId=0;_autoOpenedSubscription;_discoverResult;_resetConnectionState(){this._negotiatedProtocolVersion=void 0;this._serverCapabilities=void 0;this._serverVersion=void 0;this._instructions=void 0;this._discoverResult=void 0;this._autoOpenedSubscription=void 0;if(this._listenState.size>0){const reason=new SdkError(SdkErrorCode.ConnectionClosed,"subscriptions/listen: client reconnected or closed; subscription state from the previous connection was reset");for(const entry of this._listenState.values())entry.settle({cause:"remote",error:reason})}this._listenState.clear();for(const timer of this._listChangedDebounceTimers.values())clearTimeout(timer);this._listChangedDebounceTimers.clear();this._cache.resetForReconnect()}async close(){try{await super.close()}finally{this._resetConnectionState()}}constructor(_clientInfo,options){super(options);this._clientInfo=_clientInfo;this._capabilities=options?.capabilities?{...options.capabilities}:{};this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator;this._enforceStrictCapabilities=options?.enforceStrictCapabilities??false;this._versionNegotiation=options?.versionNegotiation;this._supportedProtocolVersionsOption=options?.supportedProtocolVersions;this._inputRequiredDriverConfig=resolveInputRequiredDriverConfig(options?.inputRequired);this._cache=new ClientResponseCache(options?.responseCacheStore??new InMemoryResponseCacheStore,options?.responseCacheStore!==void 0,error51=>this._reportStoreError(error51),options?.cachePartition??"");this._defaultCacheTtlMs=options?.defaultCacheTtlMs??0;this._listMaxPages=options?.listMaxPages??DEFAULT_LIST_MAX_PAGES;if(options?.listChanged)this._listChangedConfig=options.listChanged}buildContext(ctx,_transportInfo){return ctx}_shouldDropInbound(message){if(this._negotiatedProtocolVersion!==void 0&&isModernProtocolVersion(this._negotiatedProtocolVersion)&&isJSONRPCRequest(message))return"drop"}_outboundMetaEnvelope(){const version2=this._negotiatedProtocolVersion;if(version2===void 0)return void 0;return this._wireCodec().outboundEnvelope({protocolVersion:version2,clientInfo:this._clientInfo,clientCapabilities:this._capabilities})}_resolveNonCompleteResult(decoded,flow){if(!this._inputRequiredDriverConfig.autoFulfill)return Promise.reject(new SdkError(SdkErrorCode.UnsupportedResultType,`Unsupported result type 'input_required' for ${flow.request.method}: multi-round-trip auto-fulfilment is not enabled on this instance \u2014 pass allowInputRequired: true to handle it manually, or enable inputRequired.autoFulfill`,{resultType:"input_required",method:flow.request.method}));return runInputRequiredFlow({getRequestHandler:method=>this._getRequestHandler(method),buildContext:baseCtx=>this.buildContext(baseCtx,void 0),sessionId:this.transport?.sessionId},this._inputRequiredDriverConfig,decoded,flow)}_setupListChangedHandlers(config2){if(config2.tools&&this._serverCapabilities?.tools?.listChanged)this._setupListChangedHandler("tools","notifications/tools/list_changed",config2.tools,async()=>{return(await this.listTools(void 0,{cacheMode:"refresh"})).tools});if(config2.prompts&&this._serverCapabilities?.prompts?.listChanged)this._setupListChangedHandler("prompts","notifications/prompts/list_changed",config2.prompts,async()=>{return(await this.listPrompts(void 0,{cacheMode:"refresh"})).prompts});if(config2.resources&&this._serverCapabilities?.resources?.listChanged)this._setupListChangedHandler("resources","notifications/resources/list_changed",config2.resources,async()=>{return(await this.listResources(void 0,{cacheMode:"refresh"})).resources})}registerCapabilities(capabilities){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setVersionNegotiation(options){if(this.transport)throw new Error("Cannot configure version negotiation after connecting to transport");this._versionNegotiation=options}_wrapHandler(method,handler){if(method==="elicitation/create")return async(request,ctx)=>{const codec2=codecForVersion(this._negotiatedProtocolVersion);let validatedRequest=codec2.validateRequest("elicitation/create",request);if(!validatedRequest.ok&&validatedRequest.reason==="not-in-era")validatedRequest=codec2.validateInputRequest("elicitation/create",request);if(!validatedRequest.ok)throw new ProtocolError(validatedRequest.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validatedRequest.reason==="not-in-era"?"No wire schema for elicitation/create in the resolved era":`Invalid elicitation request: ${validatedRequest.message}`);const{params}=validatedRequest.value;params.mode=params.mode??"form";const{supportsFormMode,supportsUrlMode}=getSupportedElicitationModes(this._capabilities.elicitation);if(params.mode==="form"&&!supportsFormMode)throw new ProtocolError(ProtocolErrorCode.InvalidParams,"Client does not support form-mode elicitation requests");if(params.mode==="url"&&!supportsUrlMode)throw new ProtocolError(ProtocolErrorCode.InvalidParams,"Client does not support URL-mode elicitation requests");const result=await handler(request,ctx);let validationResult=codec2.validateResult("elicitation/create",result);if(!validationResult.ok&&validationResult.reason==="not-in-era")validationResult=codec2.validateInputResponse("elicitation/create",result);if(!validationResult.ok)throw new ProtocolError(validationResult.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validationResult.reason==="not-in-era"?"No wire schema for elicitation/create in the resolved era":`Invalid elicitation result: ${validationResult.message}`);const validatedResult=validationResult.value;const requestedSchema=params.mode==="form"?params.requestedSchema:void 0;if(params.mode==="form"&&validatedResult.action==="accept"&&validatedResult.content&&requestedSchema&&this._capabilities.elicitation?.form?.applyDefaults)try{applyElicitationDefaults(requestedSchema,validatedResult.content)}catch{}return validatedResult};if(method==="sampling/createMessage")return async(request,ctx)=>{const codec2=codecForVersion(this._negotiatedProtocolVersion);let validatedRequest=codec2.validateRequest("sampling/createMessage",request);if(!validatedRequest.ok&&validatedRequest.reason==="not-in-era")validatedRequest=codec2.validateInputRequest("sampling/createMessage",request);if(!validatedRequest.ok)throw new ProtocolError(validatedRequest.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validatedRequest.reason==="not-in-era"?"No wire schema for sampling/createMessage in the resolved era":`Invalid sampling request: ${validatedRequest.message}`);const{params}=validatedRequest.value;const result=await handler(request,ctx);const hasTools=Boolean(params.tools||params.toolChoice);let validatedResult=codec2.samplingResultVariant(hasTools,result);if(!validatedResult.ok&&validatedResult.reason==="not-in-era")validatedResult=codec2.validateInputResponse("sampling/createMessage",result);if(!validatedResult.ok)throw new ProtocolError(validatedResult.reason==="not-in-era"?ProtocolErrorCode.InternalError:ProtocolErrorCode.InvalidParams,validatedResult.reason==="not-in-era"?"No result schema for sampling/createMessage in the resolved era":`Invalid sampling result: ${validatedResult.message}`);return validatedResult.value};return handler}assertCapability(capability,method){if(!this._serverCapabilities?.[capability])throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support ${capability} (required for ${method})`)}async connect(transport,options){if(options?.prior!=null)return this._connectFromPrior(transport,validatePrior(options.prior),options);const negotiation=resolveVersionNegotiation(this._versionNegotiation,this._supportedProtocolVersionsOption);if(negotiation.kind!=="legacy")return this._connectNegotiated(transport,negotiation,options);return this._connectPlainLegacy(transport,options)}async _connectPlainLegacy(transport,options){await super.connect(transport);if(transport.sessionId!==void 0){const negotiatedProtocolVersion=this._negotiatedProtocolVersion;if(negotiatedProtocolVersion!==void 0)transport.setProtocolVersion?.(negotiatedProtocolVersion);return}this._resetConnectionState();await this._legacyHandshake(transport,options)}async _legacyHandshake(transport,options){const legacyVersions=legacyProtocolVersions(this._supportedProtocolVersions);try{const offeredVersion=legacyVersions[0];if(offeredVersion===void 0)throw new SdkError(SdkErrorCode.EraNegotiationFailed,"Cannot run the initialize handshake: supportedProtocolVersions contains no pre-2026-07-28 protocol version");const result=await this.request({method:"initialize",params:{protocolVersion:offeredVersion,capabilities:this._capabilities,clientInfo:this._clientInfo}},options);if(result===void 0)throw new Error(`Server sent invalid initialize result: ${result}`);if(!legacyVersions.includes(result.protocolVersion))throw new Error(`Server's protocol version is not supported: ${result.protocolVersion}`);this._serverCapabilities=result.capabilities;this._serverVersion=result.serverInfo;this._cache.setServerIdentity(this._deriveServerIdentity(transport));if(transport.setProtocolVersion)transport.setProtocolVersion(result.protocolVersion);this._instructions=result.instructions;await this.notification({method:"notifications/initialized"});this._negotiatedProtocolVersion=result.protocolVersion;if(this._listChangedConfig)this._setupListChangedHandlers(this._listChangedConfig)}catch(error51){this.close();throw error51}}async _connectNegotiated(transport,negotiation,options){if(transport.sessionId!==void 0){await super.connect(transport);const negotiatedProtocolVersion=this._negotiatedProtocolVersion;if(negotiatedProtocolVersion!==void 0&&transport.setProtocolVersion)transport.setProtocolVersion(negotiatedProtocolVersion);return}this._resetConnectionState();let result;try{const transportKind=detectProbeTransportKind(transport);const baseDeps={clientInfo:this._clientInfo,capabilities:this._capabilities,environment:detectProbeEnvironment(),defaultTimeoutMs:options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC};const stdioParams=transportKind==="stdio"?readStdioServerParams(transport):void 0;result=stdioParams===void 0?await negotiateEra(negotiation,{...baseDeps,transport,transportKind}):await negotiateStdioViaSibling(negotiation,transport,stdioParams,baseDeps)}catch(error51){await transport.close().catch(()=>{});disarmSpentCloseGuard(transport);throw error51}disarmSpentCloseGuard(transport);await super.connect(transport);if(result.era==="legacy"){await this._legacyHandshake(transport,options);return}this._serverCapabilities=result.discover.capabilities;this._serverVersion=serverInfoFromDiscover(result.discover);this._cache.setServerIdentity(this._deriveServerIdentity(transport));this._instructions=result.discover.instructions;this._discoverResult=result.discover;this._negotiatedProtocolVersion=result.version;if(transport.setProtocolVersion)transport.setProtocolVersion(result.version);if(this._listChangedConfig){const config2=this._listChangedConfig;const advertised=this._serverCapabilities;const effective={...config2.tools&&advertised?.tools?.listChanged&&{tools:config2.tools},...config2.prompts&&advertised?.prompts?.listChanged&&{prompts:config2.prompts},...config2.resources&&advertised?.resources?.listChanged&&{resources:config2.resources}};let handlersRegistered=true;try{this._setupListChangedHandlers(effective)}catch(error51){handlersRegistered=false;this.onerror?.(error51 instanceof Error?error51:new Error(String(error51)))}const filter=handlersRegistered?{...effective.tools&&{toolsListChanged:true},...effective.prompts&&{promptsListChanged:true},...effective.resources&&{resourcesListChanged:true}}:{};if(Object.keys(filter).length>0){const ackAbort=new AbortController;const onConnectAbort=()=>ackAbort.abort(options?.signal?.reason);if(options?.signal?.aborted)onConnectAbort();options?.signal?.addEventListener("abort",onConnectAbort);try{this._autoOpenedSubscription=await this.listen(filter,{timeout:options?.timeout,signal:ackAbort.signal})}catch(error51){if(options?.signal?.aborted){await this.close().catch(()=>{});throw error51}this.onerror?.(error51 instanceof Error?error51:new Error(String(error51)))}finally{options?.signal?.removeEventListener("abort",onConnectAbort)}}}}async _connectFromPrior(transport,prior,options){if(prior.kind==="legacy")return this._connectPlainLegacy(transport,options);const discover=prior.discover;this._resetConnectionState();const explicit=this._supportedProtocolVersionsOption;const version2=(explicit&&modernProtocolVersions(explicit).length>0?modernProtocolVersions(explicit):SUPPORTED_MODERN_PROTOCOL_VERSIONS).find(v=>discover.supportedVersions.includes(v));if(version2===void 0)throw new SdkError(SdkErrorCode.EraNegotiationFailed,"connect({ prior }) with a modern verdict requires a 2026-07-28+ mutual protocol version; the supplied DiscoverResult and this client's supportedProtocolVersions have no modern overlap. For a server known to be legacy, pass prior: { kind: 'legacy' } to skip the probe and initialize directly, or use versionNegotiation: { mode: 'auto' } to re-probe with legacy fallback.");await super.connect(transport);this._discoverResult=discover;this._serverCapabilities=discover.capabilities;this._serverVersion=serverInfoFromDiscover(discover);this._cache.setServerIdentity(this._deriveServerIdentity(transport));this._instructions=discover.instructions;this._negotiatedProtocolVersion=version2;transport.setProtocolVersion?.(version2);if(this._listChangedConfig)try{this._setupListChangedHandlers(this._listChangedConfig)}catch(error51){this.onerror?.(error51 instanceof Error?error51:new Error(String(error51)))}}getServerCapabilities(){return this._serverCapabilities}getServerVersion(){return this._serverVersion}_deriveServerIdentity(transport){const v=this._serverVersion;if(v!==void 0)return`${v.name}@${v.version}`;return transport.sessionId??`anonymous:${Date.now()}-${Math.random().toString(36).slice(2)}`}getNegotiatedProtocolVersion(){return this._negotiatedProtocolVersion}getProtocolEra(){const version2=this._negotiatedProtocolVersion;if(version2===void 0)return void 0;return isModernProtocolVersion(version2)?"modern":"legacy"}getInstructions(){return this._instructions}getDiscoverResult(){return this._discoverResult}assertCapabilityForMethod(method){switch(method){case"logging/setLevel":if(!this._serverCapabilities?.logging)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support logging (required for ${method})`);break;case"prompts/get":case"prompts/list":if(!this._serverCapabilities?.prompts)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support prompts (required for ${method})`);break;case"resources/list":case"resources/templates/list":case"resources/read":case"resources/subscribe":case"resources/unsubscribe":if(!this._serverCapabilities?.resources)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support resources (required for ${method})`);if(method==="resources/subscribe"&&!this._serverCapabilities.resources.subscribe)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support resource subscriptions (required for ${method})`);break;case"tools/call":case"tools/list":if(!this._serverCapabilities?.tools)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support tools (required for ${method})`);break;case"completion/complete":if(!this._serverCapabilities?.completions)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Server does not support completions (required for ${method})`);break;case"initialize":break;case"server/discover":break;case"ping":break}}assertNotificationCapability(method){switch(method){case"notifications/roots/list_changed":if(!this._capabilities.roots?.listChanged)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support roots list changed notifications (required for ${method})`);break;case"notifications/initialized":break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method){switch(method){case"sampling/createMessage":if(!this._capabilities.sampling)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support sampling capability (required for ${method})`);break;case"elicitation/create":if(!this._capabilities.elicitation)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support elicitation capability (required for ${method})`);break;case"roots/list":if(!this._capabilities.roots)throw new SdkError(SdkErrorCode.CapabilityNotSupported,`Client does not support roots capability (required for ${method})`);break;case"ping":break}}async ping(options){return this.request({method:"ping"},options)}async discover(options){const result=await this._requestWithSchema({method:"server/discover"},DiscoverResultSchema,options);this._discoverResult=result;return result}async complete(params,options){return this.request({method:"completion/complete",params},options)}async setLoggingLevel(level,options){return this.request({method:"logging/setLevel",params:{level}},options)}async getPrompt(params,options){return this.request({method:"prompts/get",params},options)}async listPrompts(params,options){if(!this._serverCapabilities?.prompts&&!this._enforceStrictCapabilities){console.debug("Client.listPrompts() called but server does not advertise prompts capability - returning empty list");return{prompts:[]}}if(params?.cursor!==void 0)return this.request({method:"prompts/list",params},options);const hit=await this._serveFromCache("prompts/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("prompts/list",params,options,(acc,page)=>acc.prompts.push(...page.prompts))}async listResources(params,options){if(!this._serverCapabilities?.resources&&!this._enforceStrictCapabilities){console.debug("Client.listResources() called but server does not advertise resources capability - returning empty list");return{resources:[]}}if(params?.cursor!==void 0)return this.request({method:"resources/list",params},options);const hit=await this._serveFromCache("resources/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("resources/list",params,options,(acc,page)=>acc.resources.push(...page.resources))}async listResourceTemplates(params,options){if(!this._serverCapabilities?.resources&&!this._enforceStrictCapabilities){console.debug("Client.listResourceTemplates() called but server does not advertise resources capability - returning empty list");return{resourceTemplates:[]}}if(params?.cursor!==void 0)return this.request({method:"resources/templates/list",params},options);const hit=await this._serveFromCache("resources/templates/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("resources/templates/list",params,options,(acc,page)=>acc.resourceTemplates.push(...page.resourceTemplates))}async _listAllPages(method,baseParams,options,append,finalize2){const bypass=options?.cacheMode==="bypass";const generation=this._cache.captureGeneration(method);const acc=await this.request({method,...baseParams&&{params:{...baseParams}}},options);let cursor=acc.nextCursor;const seen=new Set;let pages=1;while(cursor!==void 0&&!seen.has(cursor)){if(this._listMaxPages!==0&&pages>=this._listMaxPages)throw new SdkError(SdkErrorCode.ListPaginationExceeded,`${method}: exceeded listMaxPages (${this._listMaxPages}); server pagination did not terminate`,{method,listMaxPages:this._listMaxPages});seen.add(cursor);const page=await this.request({method,params:{...baseParams,cursor}},options);append(acc,page);cursor=page.nextCursor;pages++}delete acc.nextCursor;finalize2?.(acc);if(bypass)return acc;await this._cache.write(method,acc,generation,this._freshness(acc));return acc}_freshness(result,params){const body=result;const ttlMs=typeof body.ttlMs==="number"?body.ttlMs:this._defaultCacheTtlMs;const scope=body.cacheScope==="public"?"public":"private";return{expiresAt:this._cache.now()+Math.min(Math.max(0,ttlMs),MAX_CACHE_TTL_MS),scope,params}}async _serveFromCache(method,params,options){if(options?.cacheMode==="bypass"||options?.cacheMode==="refresh")return void 0;const hit=await this._cache.read(method,params).catch(error51=>void this._reportStoreError(error51));if(hit!==void 0){if(options?.signal?.aborted){const reason=options.signal.reason;throw reason instanceof SdkError?reason:new SdkError(SdkErrorCode.RequestTimeout,String(reason))}return hit.value}}_reportStoreError(e){this.onerror?.(e instanceof Error?e:new Error(String(e)))}_compileOutputValidator(tool){if(!tool.outputSchema)return void 0;try{return{ok:true,validator:this._jsonSchemaValidator.getValidator(tool.outputSchema)}}catch(error51){return{ok:false,compileError:error51}}}async _resolveXMcpHeaderScan(name,override){const tool=override??await this._cache.toolDefinition(name);return tool===void 0?void 0:scanXMcpHeaderDeclarations(tool.inputSchema)}async readResource(params,options){const hit=await this._serveFromCache("resources/read",params.uri,options);if(hit!==void 0)return hit;const generation=this._cache.captureGeneration("resources/read",params.uri);const result=await this.request({method:"resources/read",params},options);if(options?.cacheMode!=="bypass"){const freshness=this._freshness(result,params.uri);if(freshness.expiresAt>this._cache.now())await this._cache.write("resources/read",result,generation,freshness);else if(options?.cacheMode==="refresh")await this._cache.evictKey("resources/read",params.uri)}return result}async subscribeResource(params,options){return this.request({method:"resources/subscribe",params},options)}async unsubscribeResource(params,options){return this.request({method:"resources/unsubscribe",params},options)}async listen(filter,options){if(this.transport===void 0)throw new SdkError(SdkErrorCode.NotConnected,"Not connected");const negotiated=this._negotiatedProtocolVersion;if(negotiated===void 0||!isModernProtocolVersion(negotiated))throw new SdkError(SdkErrorCode.MethodNotSupportedByProtocolVersion,`subscriptions/listen requires a 2026-07-28-era connection (negotiated: ${negotiated??"none"}). On a 2025-era connection, change notifications are delivered unsolicited: use ClientOptions.listChanged and resources/subscribe instead.`,{method:"subscriptions/listen",protocolVersion:negotiated});if(options?.signal?.aborted){const reason=options.signal.reason;throw reason instanceof SdkError?reason:new SdkError(SdkErrorCode.RequestTimeout,String(reason))}const requestAbort=new AbortController;const listenId=`listen:${this._nextListenId++}`;let state="opening";let ackTimer;let onCallerAbort;let resolveOpening;let rejectOpening;const opening=new Promise((resolve,reject)=>{resolveOpening=resolve;rejectOpening=reject});let resolveClosed;const closed=new Promise(resolve=>{resolveClosed=resolve});const settle=outcome=>{if(state==="closed")return;const wasOpening=state==="opening";if(ackTimer!==void 0){clearTimeout(ackTimer);ackTimer=void 0}if("ack"in outcome){state="open";resolveOpening(outcome.ack);return}state="closed";if(onCallerAbort!==void 0)options?.signal?.removeEventListener("abort",onCallerAbort);this._listenState.delete(listenId);requestAbort.abort();resolveClosed(outcome.cause);if(wasOpening)rejectOpening(outcome.error??new SdkError(SdkErrorCode.ConnectionClosed,"subscriptions/listen closed before the server acknowledged"))};const wireTeardown=async()=>{requestAbort.abort();await this.notification({method:"notifications/cancelled",params:{requestId:listenId}}).catch(()=>{})};const close=async()=>{if(state==="closed")return;settle({cause:"local"});await wireTeardown()};this._listenState.set(listenId,{settle});const ackTimeout=options?.timeout??DEFAULT_REQUEST_TIMEOUT_MSEC;ackTimer=setTimeout(()=>{settle({cause:"remote",error:new SdkError(SdkErrorCode.RequestTimeout,"subscriptions/listen ack timed out",{timeout:ackTimeout})});wireTeardown().catch(()=>{})},ackTimeout);if(options?.signal){const callerSignal=options.signal;onCallerAbort=()=>{if(state==="closed")return;const reason=callerSignal.reason;settle({cause:"local",error:reason instanceof Error?reason:new Error(String(reason??"Aborted"))});wireTeardown().catch(()=>{})};callerSignal.addEventListener("abort",onCallerAbort,{once:true})}const jsonrpcRequest={jsonrpc:"2.0",id:listenId,method:"subscriptions/listen",params:{_meta:{...this._outboundMetaEnvelope()},notifications:filter}};try{await this.transport.send(jsonrpcRequest,{requestSignal:requestAbort.signal,onRequestStreamEnd:()=>settle({cause:"remote",error:new Error("subscriptions/listen: stream ended")})})}catch(error51){settle({cause:"remote",error:error51 instanceof Error?error51:new Error(String(error51))})}return{honoredFilter:await opening,close,closed}}get autoOpenedSubscription(){return this._autoOpenedSubscription}_onnotification(raw,extra){const evicted=Object.hasOwn(LIST_CHANGED_EVICTIONS,raw.method)?LIST_CHANGED_EVICTIONS[raw.method]:void 0;if(raw.method==="notifications/resources/updated"){const uri=raw.params?.uri;if(typeof uri==="string")this._cache.evictKey("resources/read",uri)}else if(evicted!==void 0)for(const method of evicted)this._cache.evict(method);if(raw.method==="notifications/subscriptions/acknowledged"){const subscriptionId=raw.params?._meta?.[SUBSCRIPTION_ID_META_KEY];const entry=typeof subscriptionId==="string"?this._listenState.get(subscriptionId):void 0;if(entry!==void 0){const honored=this._wireCodec().validateNotification("notifications/subscriptions/acknowledged",raw);entry.settle({ack:honored.ok?honored.value.params.notifications:{}});return}}if(raw.method==="notifications/cancelled"){const cancelledId=raw.params?.requestId;const entry=typeof cancelledId==="string"?this._listenState.get(cancelledId):void 0;if(entry!==void 0){entry.settle({cause:"remote",error:new Error("subscriptions/listen: server cancelled the subscription")});return}}super._onnotification(raw,extra)}_onresponse(response){const id=response.id;const entry=typeof id==="string"?this._listenState.get(id):void 0;if(entry!==void 0){if(isJSONRPCErrorResponse(response))entry.settle({cause:"remote",error:ProtocolError.fromError(response.error.code,response.error.message,response.error.data)});else entry.settle({cause:"graceful",error:new SdkError(SdkErrorCode.ConnectionClosed,"subscriptions/listen: server closed the subscription gracefully before acknowledging")});return}super._onresponse(response)}_onclose(){if(this._listenState.size>0){const reason=new SdkError(SdkErrorCode.ConnectionClosed,"Connection closed");for(const entry of this._listenState.values())entry.settle({cause:"remote",error:reason});this._listenState.clear()}super._onclose()}async callTool(params,options){const mirroringActive=this.getProtocolEra()==="modern"&&detectProbeEnvironment()!=="browser";const buildSendOptions=async()=>{if(!mirroringActive)return options;let scan;try{scan=await this._resolveXMcpHeaderScan(params.name,options?.toolDefinition)}catch(error51){this._reportStoreError(error51)}if(!scan?.valid||scan.declarations.length===0)return options;const paramHeaders=buildMcpParamHeaders(scan.declarations,params.arguments);return Object.keys(paramHeaders).length===0?options:{...options,headers:{...options?.headers,...paramHeaders}}};let compiled=options?.toolDefinition===void 0?await this._cache.outputValidator(params.name,tool=>this._compileOutputValidator(tool)).catch(error51=>void this._reportStoreError(error51)):this._compileOutputValidator(options.toolDefinition);const assertCompiled=()=>{if(compiled===void 0||compiled.ok)return;const err=compiled.compileError;const message=(err instanceof Error?err.message:String(err)).slice(0,200);throw new ProtocolError(ProtocolErrorCode.InvalidParams,`Tool '${params.name}' has an invalid outputSchema: ${message}`)};assertCompiled();let result;try{result=await this.request({method:"tools/call",params},await buildSendOptions())}catch(error51){const isHeaderMismatch=error51 instanceof ProtocolError&&error51.code===HEADER_MISMATCH_ERROR_CODE;if(!mirroringActive||!isHeaderMismatch||options?.toolDefinition!==void 0)throw error51;const refreshOptions={signal:options?.signal,timeout:options?.timeout,cacheMode:"refresh"};await this._cache.evict("tools/list");await this.listTools(void 0,refreshOptions).catch(error_=>this._reportStoreError(error_));compiled=await this._cache.outputValidator(params.name,tool=>this._compileOutputValidator(tool)).catch(error_=>void this._reportStoreError(error_));assertCompiled();result=await this.request({method:"tools/call",params},await buildSendOptions())}const validator=compiled!==void 0&&compiled.ok?compiled.validator:void 0;if(validator){if(result.structuredContent===void 0&&!result.isError)throw new ProtocolError(ProtocolErrorCode.InvalidRequest,`Tool ${params.name} has an output schema but did not return structured content`);if(result.structuredContent!==void 0&&!result.isError)try{const validationResult=validator(result.structuredContent);if(!validationResult.valid)throw new ProtocolError(ProtocolErrorCode.InvalidParams,`Structured content does not match the tool's output schema: ${validationResult.errorMessage}`)}catch(error51){if(error51 instanceof ProtocolError)throw error51;throw new ProtocolError(ProtocolErrorCode.InvalidParams,`Failed to validate structured content: ${error51 instanceof Error?error51.message:String(error51)}`)}}return result}async listTools(params,options){if(!this._serverCapabilities?.tools&&!this._enforceStrictCapabilities){console.debug("Client.listTools() called but server does not advertise tools capability - returning empty list");return{tools:[]}}if(params?.cursor!==void 0){const page=await this.request({method:"tools/list",params},options);this._excludeInvalidXMcpHeaderTools(page);return page}const hit=await this._serveFromCache("tools/list",void 0,options);if(hit!==void 0)return hit;return this._listAllPages("tools/list",params,options,(acc,page)=>acc.tools.push(...page.tools),acc=>this._excludeInvalidXMcpHeaderTools(acc))}_excludeInvalidXMcpHeaderTools(result){if(this.getProtocolEra()!=="modern"||!this.transport||detectProbeTransportKind(this.transport)==="stdio")return;const filtered=result.tools.filter(tool=>{const scan=scanXMcpHeaderDeclarations(tool.inputSchema);if(!scan.valid){console.warn(`[mcp-sdk] excluding tool '${tool.name}' from tools/list: invalid x-mcp-header declaration \u2014 ${scan.reason}`);return false}return true});if(filtered.length!==result.tools.length)result.tools=filtered}_setupListChangedHandler(listType,notificationMethod,options,fetcher){const parseResult=parseSchema(ListChangedOptionsBaseSchema,options);if(!parseResult.success)throw new Error(`Invalid ${listType} listChanged options: ${parseResult.error.message}`);if(typeof options.onChanged!=="function")throw new TypeError(`Invalid ${listType} listChanged options: onChanged must be a function`);const{autoRefresh,debounceMs}=parseResult.data;const{onChanged}=options;const refresh=async()=>{if(!autoRefresh){onChanged(null,null);return}try{onChanged(null,await fetcher())}catch(error51){onChanged(error51 instanceof Error?error51:new Error(String(error51)),null)}};const handler=()=>{if(debounceMs){const existingTimer=this._listChangedDebounceTimers.get(listType);if(existingTimer)clearTimeout(existingTimer);const timer=setTimeout(refresh,debounceMs);this._listChangedDebounceTimers.set(listType,timer)}else refresh()};this.setNotificationHandler(notificationMethod,handler)}async sendRootsListChanged(){return this.notification({method:"notifications/roots/list_changed"})}};var SseError=class extends Error{static{Object.defineProperty(this,"mcpBrand",{value:"mcp.SseError"})}static[Symbol.hasInstance](value){return brandedHasInstance(this,value)}static isInstance(value){if(typeof this!=="function")throw new TypeError("isInstance must be called on the class (e.g. `SdkError.isInstance(value)`); for callbacks use `v => SdkError.isInstance(v)`");return brandedHasInstance(this,value)}constructor(code,message,event){super(`SSE error: ${message}`);this.code=code;this.event=event;stampErrorBrands(this,new.target)}};var DEFAULT_MAX_STEP_UP_RETRIES=1;var DEFAULT_STREAMABLE_HTTP_RECONNECTION_OPTIONS={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};var RESERVED_REQUEST_HEADER_NAMES=new Set(["authorization","content-type","mcp-protocol-version","mcp-method","mcp-name","mcp-session-id"]);function anySignal(a,b){if(typeof AbortSignal.any==="function")return AbortSignal.any([a,b]);const controller=new AbortController;if(a.aborted)return controller.abort(a.reason),controller.signal;if(b.aborted)return controller.abort(b.reason),controller.signal;const cleanup=()=>{a.removeEventListener("abort",onA);b.removeEventListener("abort",onB)};function onA(){cleanup();controller.abort(a.reason)}function onB(){cleanup();controller.abort(b.reason)}a.addEventListener("abort",onA,{once:true});b.addEventListener("abort",onB,{once:true});return controller.signal}var StreamableHTTPClientTransport=class{_abortController;_url;_resourceMetadataUrl;_scope;_requestInit;_authProvider;_oauthProvider;_skipIssuerMetadataValidation;_fetch;_fetchWithInit;_sessionId;_reconnectionOptions;_protocolVersion;_onInsufficientScope;_maxStepUpRetries;_serverRetryMs;_reconnectionScheduler;_cancelReconnection;onclose;onerror;onmessage;hasPerRequestStream=true;constructor(url2,opts){this._url=url2;this._resourceMetadataUrl=void 0;this._scope=void 0;this._requestInit=opts?.requestInit;this._skipIssuerMetadataValidation=opts?.skipIssuerMetadataValidation;if(isOAuthClientProvider(opts?.authProvider)){this._oauthProvider=opts.authProvider;this._authProvider=adaptOAuthProvider(opts.authProvider,{skipIssuerMetadataValidation:opts.skipIssuerMetadataValidation})}else this._authProvider=opts?.authProvider;this._fetch=opts?.fetch;this._fetchWithInit=createFetchWithInit(opts?.fetch,opts?.requestInit);this._sessionId=opts?.sessionId;this._protocolVersion=opts?.protocolVersion;this._reconnectionOptions=opts?.reconnectionOptions??DEFAULT_STREAMABLE_HTTP_RECONNECTION_OPTIONS;this._reconnectionScheduler=opts?.reconnectionScheduler;this._onInsufficientScope=opts?.onInsufficientScope??"reauthorize";this._maxStepUpRetries=Math.max(0,opts?.maxStepUpRetries??DEFAULT_MAX_STEP_UP_RETRIES)}async _stepUpAuthorize(challenge,stepUpRetries){try{return await this._stepUpAuthorizeInner(challenge,stepUpRetries)}catch(error51){throw markAuthSeamEscape(error51)}}async _stepUpAuthorizeInner(challenge,stepUpRetries){if(this._onInsufficientScope==="throw")throw new InsufficientScopeError({requiredScope:challenge.scope,resourceMetadataUrl:challenge.resourceMetadataUrl,errorDescription:challenge.errorDescription});if(!this._oauthProvider)throw new InsufficientScopeError({requiredScope:challenge.scope,resourceMetadataUrl:challenge.resourceMetadataUrl,errorDescription:challenge.errorDescription});if(stepUpRetries>=this._maxStepUpRetries)throw new SdkHttpError(SdkErrorCode.ClientHttpForbidden,`Server returned 403 insufficient_scope after step-up re-authorization (retry limit ${this._maxStepUpRetries} reached)`,{status:403,statusText:challenge.statusText??"Forbidden",text:challenge.text});if(challenge.resourceMetadataUrl)this._resourceMetadataUrl=challenge.resourceMetadataUrl;const tokens=await this._oauthProvider.tokens();const unionScope=computeScopeUnion(this._scope,tokens?.scope,challenge.scope);this._scope=unionScope;const forceReauthorization=isStrictScopeSuperset(unionScope,tokens?.scope);return auth(this._oauthProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:unionScope,forceReauthorization,fetchFn:this._fetchWithInit,skipIssuerMetadataValidation:this._skipIssuerMetadataValidation})}async _commonHeaders(){const headers={};let token;try{token=await this._authProvider?.token()}catch(error51){throw markAuthSeamEscape(error51)}if(token)headers["Authorization"]=`Bearer ${token}`;if(this._sessionId)headers["mcp-session-id"]=this._sessionId;if(this._protocolVersion)headers["mcp-protocol-version"]=this._protocolVersion;const extraHeaders=normalizeHeaders(this._requestInit?.headers);return new Headers({...headers,...extraHeaders})}_applyBodyDerivedHeaders(headers,message){if(Array.isArray(message)||!isJSONRPCRequest(message))return;const envelopeVersion=message.params?._meta?.[PROTOCOL_VERSION_META_KEY];if(typeof envelopeVersion!=="string")return;headers.set("mcp-protocol-version",envelopeVersion);headers.set("mcp-method",message.method);const params=message.params;const nameHeader=message.method==="resources/read"?typeof params?.uri==="string"?params.uri:void 0:typeof params?.name==="string"?params.name:void 0;if(nameHeader!==void 0)headers.set("mcp-name",encodeMcpParamValue(nameHeader))}_isModernEnvelopedRequest(message){if(Array.isArray(message)||!isJSONRPCRequest(message))return false;const v=message.params?._meta?.[PROTOCOL_VERSION_META_KEY];return typeof v==="string"&&isModernProtocolVersion(v)}async _startOrAuthSse(options,isAuthRetry=false,stepUpRetries=0){const{resumptionToken,requestSignal}=options;const isIntentionalAbort=()=>this._abortController?.signal.aborted===true||requestSignal?.aborted===true;try{const headers=await this._commonHeaders();const types=[...headers.get("accept")?.split(",").map(s=>s.trim().toLowerCase())??[],"text/event-stream"];headers.set("accept",[...new Set(types)].join(", "));if(resumptionToken)headers.set("last-event-id",resumptionToken);const transportSignal=this._abortController?.signal;const signal=requestSignal!==void 0&&transportSignal!==void 0?anySignal(transportSignal,requestSignal):requestSignal??transportSignal;const response=await(this._fetch??fetch)(this._url,{...this._requestInit,method:"GET",headers,signal});if(!response.ok){if(response.status===401&&this._authProvider){if(response.headers.has("www-authenticate")){const{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);this._resourceMetadataUrl=resourceMetadataUrl;this._scope=computeScopeUnion(this._scope,scope)}if(this._authProvider.onUnauthorized&&!isAuthRetry){try{await this._authProvider.onUnauthorized({response,serverUrl:this._url,fetchFn:this._fetchWithInit})}catch(error51){throw markAuthSeamEscape(error51)}await response.text?.().catch(()=>{});return this._startOrAuthSse(options,true,stepUpRetries)}await response.text?.().catch(()=>{});if(isAuthRetry)throw markAuthSeamEscape(new SdkHttpError(SdkErrorCode.ClientHttpAuthentication,"Server returned 401 after re-authentication",{status:401,statusText:response.statusText}));throw markAuthSeamEscape(new UnauthorizedError)}if(response.status===403){const{resourceMetadataUrl,scope,error:error51,errorDescription}=extractWWWAuthenticateParams(response);if(error51==="insufficient_scope"){const text=await response.text?.().catch(()=>null);if(await this._stepUpAuthorize({scope,resourceMetadataUrl,errorDescription,statusText:response.statusText,text},stepUpRetries)!=="AUTHORIZED")throw markAuthSeamEscape(new UnauthorizedError);return this._startOrAuthSse(options,isAuthRetry,stepUpRetries+1)}}await response.text?.().catch(()=>{});if(response.status===405){options.onRequestStreamEnd?.();return}throw new SdkHttpError(SdkErrorCode.ClientHttpFailedToOpenStream,`Failed to open SSE stream: ${response.statusText}`,{status:response.status,statusText:response.statusText})}this._handleSseStream(response.body,options,true)}catch(error51){if(!isIntentionalAbort())this.onerror?.(error51);throw error51}}_getNextReconnectionDelay(attempt){if(this._serverRetryMs!==void 0)return this._serverRetryMs;const initialDelay=this._reconnectionOptions.initialReconnectionDelay;const growFactor=this._reconnectionOptions.reconnectionDelayGrowFactor;const maxDelay=this._reconnectionOptions.maxReconnectionDelay;return Math.min(initialDelay*Math.pow(growFactor,attempt),maxDelay)}_scheduleReconnection(options,attemptCount=0){const maxRetries=this._reconnectionOptions.maxRetries;if(attemptCount>=maxRetries){this.onerror?.(new Error(`Maximum reconnection attempts (${maxRetries}) exceeded.`));options.onRequestStreamEnd?.();return}const delay2=this._getNextReconnectionDelay(attemptCount);const reconnect=()=>{this._cancelReconnection=void 0;if(this._abortController?.signal.aborted||options.requestSignal?.aborted)return;this._startOrAuthSse(options).catch(error51=>{if(this._abortController?.signal.aborted||options.requestSignal?.aborted)return;this.onerror?.(new Error(`Failed to reconnect SSE stream: ${error51 instanceof Error?error51.message:String(error51)}`));try{this._scheduleReconnection(options,attemptCount+1)}catch(scheduleError){this.onerror?.(scheduleError instanceof Error?scheduleError:new Error(String(scheduleError)))}})};if(this._reconnectionScheduler){const cancel=this._reconnectionScheduler(reconnect,delay2,attemptCount);this._cancelReconnection=typeof cancel==="function"?cancel:void 0}else{const handle=setTimeout(reconnect,delay2);this._cancelReconnection=()=>clearTimeout(handle)}}_handleSseStream(stream,options,isReconnectable){if(!stream){options.onRequestStreamEnd?.();return}const{onresumptiontoken,replayMessageId,requestSignal,onRequestStreamEnd}=options;const isIntentionalAbort=()=>this._abortController?.signal.aborted===true||requestSignal?.aborted===true;let lastEventId;let hasPrimingEvent=false;let receivedResponse=false;const processStream=async()=>{try{const reader=stream.pipeThrough(new TextDecoderStream).pipeThrough(new EventSourceParserStream({onRetry:retryMs=>{this._serverRetryMs=retryMs}})).getReader();while(true){const{value:event,done}=await reader.read();if(done)break;if(event.id){lastEventId=event.id;hasPrimingEvent=true;onresumptiontoken?.(event.id)}if(!event.data)continue;if(!event.event||event.event==="message")try{const message=JSONRPCMessageSchema.parse(JSON.parse(event.data));if(isJSONRPCResultResponse(message)||isJSONRPCErrorResponse(message)){receivedResponse=true;if(replayMessageId!==void 0)message.id=replayMessageId}this.onmessage?.(message)}catch(error51){this.onerror?.(error51)}}if((isReconnectable||hasPrimingEvent)&&!receivedResponse&&this._abortController&&!isIntentionalAbort())this._scheduleReconnection({resumptionToken:lastEventId,onresumptiontoken,replayMessageId,requestSignal,onRequestStreamEnd},0);else if(!isIntentionalAbort())onRequestStreamEnd?.()}catch(error51){if(isIntentionalAbort())return;this.onerror?.(new Error(`SSE stream disconnected: ${error51}`));if((isReconnectable||hasPrimingEvent)&&!receivedResponse&&this._abortController&&!isIntentionalAbort())try{this._scheduleReconnection({resumptionToken:lastEventId,onresumptiontoken,replayMessageId,requestSignal,onRequestStreamEnd},0)}catch(error$1){this.onerror?.(new Error(`Failed to reconnect: ${error$1 instanceof Error?error$1.message:String(error$1)}`));onRequestStreamEnd?.()}else onRequestStreamEnd?.()}};processStream()}async start(){if(this._abortController)throw new Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth(codeOrParams,iss){if(!this._oauthProvider)throw new UnauthorizedError("finishAuth requires an OAuthClientProvider");const{authorizationCode,iss:issParam}=await resolveAuthorizationCallbackParams(codeOrParams,iss,this._oauthProvider,this._url,{fetchFn:this._fetchWithInit,resourceMetadataUrl:this._resourceMetadataUrl});if(await auth(this._oauthProvider,{serverUrl:this._url,authorizationCode,iss:issParam,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit,skipIssuerMetadataValidation:this._skipIssuerMetadataValidation})!=="AUTHORIZED")throw new UnauthorizedError("Failed to authorize")}async close(){try{this._cancelReconnection?.()}finally{this._cancelReconnection=void 0;this._abortController?.abort();this.onclose?.()}}async send(message,options){return this._send(message,options,false)}async _send(message,options,isAuthRetry,stepUpRetries=0){try{const{resumptionToken,onresumptiontoken}=options||{};if(resumptionToken){this._startOrAuthSse({resumptionToken,replayMessageId:isJSONRPCRequest(message)?message.id:void 0,requestSignal:options?.requestSignal}).catch(error51=>this.onerror?.(error51));return}const headers=await this._commonHeaders();this._applyBodyDerivedHeaders(headers,message);const isHandshake=Array.isArray(message)?message.some(m=>isInitializeRequest(m)):isInitializeRequest(message);if(isHandshake)headers.delete("mcp-session-id");if(options?.headers!==void 0)for(const[name,value]of Object.entries(options.headers)){if(RESERVED_REQUEST_HEADER_NAMES.has(name.toLowerCase()))continue;headers.set(name,value)}headers.set("content-type","application/json");const types=[...headers.get("accept")?.split(",").map(s=>s.trim().toLowerCase())??[],"application/json","text/event-stream"];headers.set("accept",[...new Set(types)].join(", "));const transportSignal=this._abortController?.signal;const signal=options?.requestSignal!==void 0&&transportSignal!==void 0?anySignal(transportSignal,options.requestSignal):options?.requestSignal??transportSignal;const init={...this._requestInit,method:"POST",headers,body:JSON.stringify(message),signal};const response=await(this._fetch??fetch)(this._url,init);if(isHandshake&&response.ok)this._sessionId=response.headers.get("mcp-session-id")||void 0;if(!response.ok){if(response.status===401&&this._authProvider){if(response.headers.has("www-authenticate")){const{resourceMetadataUrl,scope}=extractWWWAuthenticateParams(response);this._resourceMetadataUrl=resourceMetadataUrl;this._scope=computeScopeUnion(this._scope,scope)}if(this._authProvider.onUnauthorized&&!isAuthRetry){try{await this._authProvider.onUnauthorized({response,serverUrl:this._url,fetchFn:this._fetchWithInit})}catch(error51){throw markAuthSeamEscape(error51)}await response.text?.().catch(()=>{});return this._send(message,options,true,stepUpRetries)}await response.text?.().catch(()=>{});if(isAuthRetry)throw markAuthSeamEscape(new SdkHttpError(SdkErrorCode.ClientHttpAuthentication,"Server returned 401 after re-authentication",{status:401,statusText:response.statusText}));throw markAuthSeamEscape(new UnauthorizedError)}const text=await response.text?.().catch(()=>null);if(response.status===403){const{resourceMetadataUrl,scope,error:error51,errorDescription}=extractWWWAuthenticateParams(response);if(error51==="insufficient_scope"){if(await this._stepUpAuthorize({scope,resourceMetadataUrl,errorDescription,statusText:response.statusText,text},stepUpRetries)!=="AUTHORIZED")throw markAuthSeamEscape(new UnauthorizedError);return this._send(message,options,isAuthRetry,stepUpRetries+1)}}if(response.status===400&&typeof text==="string"&&this._isModernEnvelopedRequest(message))try{const parsed=JSONRPCMessageSchema.parse(JSON.parse(text));const requests=(Array.isArray(message)?message:[message]).filter(m=>isJSONRPCRequest(m));if(isJSONRPCErrorResponse(parsed)&&requests.some(r=>r.id===parsed.id)){this.onmessage?.(parsed);return}}catch{}throw new SdkHttpError(SdkErrorCode.ClientHttpNotImplemented,`Error POSTing to endpoint: ${text}`,{status:response.status,statusText:response.statusText,text})}if(response.status===202){await response.text?.().catch(()=>{});if(isInitializedNotification(message))this._startOrAuthSse({resumptionToken:void 0}).catch(error51=>this.onerror?.(error51));return}const hasRequests=(Array.isArray(message)?message:[message]).some(msg=>"method"in msg&&"id"in msg&&msg.id!==void 0);const contentType=response.headers.get("content-type");const responseMediaType=mediaTypeEssence(contentType);if(hasRequests)if(responseMediaType==="text/event-stream")this._handleSseStream(response.body,{onresumptiontoken,requestSignal:options?.requestSignal,onRequestStreamEnd:options?.onRequestStreamEnd},false);else if(responseMediaType==="application/json"){const data=await response.json();const responseMessages=Array.isArray(data)?data.map(msg=>JSONRPCMessageSchema.parse(msg)):[JSONRPCMessageSchema.parse(data)];for(const msg of responseMessages)this.onmessage?.(msg)}else{await response.text?.().catch(()=>{});throw new SdkError(SdkErrorCode.ClientHttpUnexpectedContent,`Unexpected content type: ${contentType}`,{contentType})}else await response.text?.().catch(()=>{})}catch(error51){if(options?.requestSignal?.aborted!==true)this.onerror?.(error51);throw error51}}get sessionId(){return this._sessionId}async terminateSession(){if(!this._sessionId)return;try{const headers=await this._commonHeaders();const init={...this._requestInit,method:"DELETE",headers,signal:this._abortController?.signal};const response=await(this._fetch??fetch)(this._url,init);await response.text?.().catch(()=>{});if(!response.ok&&response.status!==405)throw new SdkHttpError(SdkErrorCode.ClientHttpFailedToTerminateSession,`Failed to terminate session: ${response.statusText}`,{status:response.status,statusText:response.statusText});this._sessionId=void 0}catch(error51){this.onerror?.(error51);throw error51}}setProtocolVersion(version2){this._protocolVersion=version2}get protocolVersion(){return this._protocolVersion}async resumeStream(lastEventId,options){await this._startOrAuthSse({resumptionToken:lastEventId,onresumptiontoken:options?.onresumptiontoken})}};var import_node_process2=__toESM(require("process"),1);var import_node_stream=require("stream");var import_cross_spawn=__toESM(require_cross_spawn(),1);var DEFAULT_INHERITED_ENV_VARS=import_node_process2.default.platform==="win32"?["APPDATA","HOMEDRIVE","HOMEPATH","LOCALAPPDATA","PATH","PROCESSOR_ARCHITECTURE","SYSTEMDRIVE","SYSTEMROOT","TEMP","USERNAME","USERPROFILE","PROGRAMFILES"]:["HOME","LOGNAME","PATH","SHELL","TERM","USER"];function getDefaultEnvironment(){const env={};for(const key of DEFAULT_INHERITED_ENV_VARS){const value=import_node_process2.default.env[key];if(value===void 0)continue;if(value.startsWith("()"))continue;env[key]=value}return env}var StdioClientTransport=class{_process;_readBuffer;_serverParams;_stderrStream=null;onclose;onerror;onmessage;constructor(server){this._serverParams=server;this._readBuffer=new ReadBuffer({maxBufferSize:server.maxBufferSize});if(server.stderr==="pipe"||server.stderr==="overlapped")this._stderrStream=new import_node_stream.PassThrough}async start(){if(this._process)throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");return new Promise((resolve,reject)=>{this._process=(0,import_cross_spawn.default)(this._serverParams.command,this._serverParams.args??[],{env:{...getDefaultEnvironment(),...this._serverParams.env},stdio:["pipe","pipe",this._serverParams.stderr??"inherit"],shell:false,windowsHide:import_node_process2.default.platform==="win32",cwd:this._serverParams.cwd});this._process.on("error",error51=>{reject(error51);this.onerror?.(error51)});this._process.on("spawn",()=>{resolve()});this._process.on("close",_code=>{this._process=void 0;this.onclose?.()});this._process.stdin?.on("error",error51=>{this.onerror?.(error51)});this._process.stdout?.on("data",chunk=>{try{this._readBuffer.append(chunk);this.processReadBuffer()}catch(error51){this.onerror?.(error51);this.close().catch(()=>{})}});this._process.stdout?.on("error",error51=>{this.onerror?.(error51)});if(this._stderrStream&&this._process.stderr)this._process.stderr.pipe(this._stderrStream)})}get stderr(){if(this._stderrStream)return this._stderrStream;return this._process?.stderr??null}get pid(){return this._process?.pid??null}processReadBuffer(){while(true)try{const message=this._readBuffer.readMessage();if(message===null)break;this.onmessage?.(message)}catch(error51){this.onerror?.(error51)}}async _dispose(){const proc=this._process;this._process=void 0;if(proc&&proc.exitCode===null&&proc.signalCode===null){const exited=new Promise(resolve=>proc.once("exit",()=>resolve()));try{proc.stdin?.end()}catch{}try{proc.kill("SIGTERM")}catch{}await Promise.race([exited,new Promise(resolve=>setTimeout(resolve,1e3).unref())]);if(proc.exitCode===null&&proc.signalCode===null)try{proc.kill("SIGKILL")}catch{}await exited}try{proc?.stdout?.destroy()}catch{}try{proc?.stdin?.destroy()}catch{}try{proc?.stderr?.destroy()}catch{}this._readBuffer.clear()}async close(){if(this._process){const processToClose=this._process;this._process=void 0;const closePromise=new Promise(resolve=>{processToClose.once("close",()=>{resolve()})});try{processToClose.stdin?.end()}catch{}await Promise.race([closePromise,new Promise(resolve=>setTimeout(resolve,2e3).unref())]);if(processToClose.exitCode===null){try{processToClose.kill("SIGTERM")}catch{}await Promise.race([closePromise,new Promise(resolve=>setTimeout(resolve,2e3).unref())])}if(processToClose.exitCode===null)try{processToClose.kill("SIGKILL")}catch{}}this._readBuffer.clear()}send(message){return new Promise(resolve=>{if(!this._process?.stdin)throw new SdkError(SdkErrorCode.NotConnected,"Not connected");const json2=serializeMessage(message);if(this._process.stdin.write(json2))resolve();else this._process.stdin.once("drain",resolve)})}};function localMcpFailure(stage,message,options={}){const failureCause={stage,...options.cause?{cause:options.cause}:{}};return new CliError("MCP_FAILED",message,{exitCode:exitCodes.mcpFailed,cause:failureCause,hint:options.hint??"Check the SAG API container logs and retry `sag mcp test`."})}function localMcpFailureStage(error51){if(error51.code!=="MCP_FAILED"||typeof error51.cause!=="object"){return void 0}const stage=error51.cause?.stage;return stage==="entrypoint"||stage==="protocol"||stage==="tools"||stage==="knowledge"?stage:void 0}var MIN_SESSION_CLEANUP_TIMEOUT_MS=50;var MAX_SESSION_CLEANUP_TIMEOUT_MS=250;function mcpFailure(){return new CliError("MCP_FAILED","\u65E0\u6CD5\u4E0E\u4F01\u4E1A HTTP MCP \u901A\u4FE1",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5\u5DF2\u5BFC\u5165\u7684 MCP \u5730\u5740\u548C\u8BBF\u95EE\u5BC6\u94A5\u540E\u91CD\u8BD5\u3002"})}function createClient(cliVersion){return new Client({name:"@zleap-ai/sag-cli",version:cliVersion},{versionNegotiation:{mode:"auto",probe:{timeoutMs:250,maxRetries:0}}})}function createHttpMcpTransport(spec,cleanupTimeoutMs=MAX_SESSION_CLEANUP_TIMEOUT_MS){return new StreamableHTTPClientTransport(new URL(spec.url),{fetch:async(input,init)=>{const headers=new Headers(input instanceof Request?input.headers:void 0);new Headers(init?.headers).forEach((value,name)=>headers.set(name,value));for(const[name,value]of Object.entries(spec.headers)){headers.set(name,value)}const method=init?.method??(input instanceof Request?input.method:"GET");return fetch(input,{...init,headers,...method.toUpperCase()==="DELETE"?{signal:AbortSignal.timeout(cleanupTimeoutMs)}:{}})}})}function sessionCleanupTimeoutMs(operationTimeoutMs){return Math.min(Math.max(operationTimeoutMs,MIN_SESSION_CLEANUP_TIMEOUT_MS),MAX_SESSION_CLEANUP_TIMEOUT_MS)}async function closeHttpMcpClient(client,transport){if(transport.sessionId){await transport.terminateSession().catch(()=>void 0)}await client.close().catch(()=>void 0)}async function withHttpMcpClient(spec,options,action){const client=createClient(options.cliVersion);const transport=createHttpMcpTransport(spec,sessionCleanupTimeoutMs(options.timeoutMs));let result;let primaryFailure;let hasPrimaryFailure=false;try{await client.connect(transport,{timeout:options.timeoutMs});result=await action(client)}catch(cause){hasPrimaryFailure=true;primaryFailure=cause}let cleanupFailure;try{await closeHttpMcpClient(client,transport)}catch(cause){cleanupFailure=cause}if(hasPrimaryFailure){if(primaryFailure instanceof CliError){throw primaryFailure}throw mcpFailure()}if(cleanupFailure){throw cleanupFailure}return result}async function listHttpMcpTools(spec,options){return withHttpMcpClient(spec,options,client=>client.listTools(void 0,{timeout:options.timeoutMs,cacheMode:"refresh"}))}async function callHttpMcpTool(input){return withHttpMcpClient(input.spec,input,async client=>{const listed=await client.listTools(void 0,{timeout:input.timeoutMs,cacheMode:"refresh"});const tool=listed.tools.find(candidate=>candidate.name===input.tool);if(!tool){throw new CliError("RESOURCE_NOT_FOUND",`\u627E\u4E0D\u5230 MCP \u5DE5\u5177\uFF1A${input.tool}`,{exitCode:exitCodes.resourceNotFound})}if(tool.annotations?.readOnlyHint!==true&&!input.yes){throw new CliError("INVALID_ARGUMENT",`MCP \u5DE5\u5177 ${input.tool} \u53EF\u80FD\u4F1A\u4FEE\u6539\u6570\u636E\uFF0C\u9700\u4F7F\u7528 --yes \u786E\u8BA4`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u68C0\u67E5\u5DE5\u5177\u53C2\u6570\uFF0C\u5E76\u4F7F\u7528 --yes \u91CD\u65B0\u6267\u884C\u4EE5\u786E\u8BA4\u3002"})}const result=await client.callTool({name:input.tool,arguments:input.arguments_},{timeout:input.timeoutMs});return{tool:input.tool,result}})}function toMcpToolSummary(input){const annotations={...input.annotations?.title===void 0?{}:{title:input.annotations.title},...input.annotations?.readOnlyHint===void 0?{}:{readOnlyHint:input.annotations.readOnlyHint},...input.annotations?.destructiveHint===void 0?{}:{destructiveHint:input.annotations.destructiveHint},...input.annotations?.idempotentHint===void 0?{}:{idempotentHint:input.annotations.idempotentHint},...input.annotations?.openWorldHint===void 0?{}:{openWorldHint:input.annotations.openWorldHint}};return{name:input.name,...input.description===void 0?{}:{description:input.description},inputSchema:input.inputSchema,...Object.keys(annotations).length?{annotations}:{}}}function classifyTools(tools){const summary={readOnly:0,write:0,destructive:0,unknown:0,hasWarning:false};for(const tool of tools){if(tool.annotations?.destructiveHint===true){summary.destructive+=1}else if(tool.annotations?.readOnlyHint===true){summary.readOnly+=1}else if(tool.annotations?.readOnlyHint===false){summary.write+=1}else{summary.unknown+=1}}summary.hasWarning=summary.write>0||summary.destructive>0||summary.unknown>0;return summary}var REQUIRED_SAG_TOOLS=["list_sources","list_documents","outline","search","grep","get_chunk","read","get_entity"];var McpVerifier=class{constructor(cliVersion){this.cliVersion=cliVersion}cliVersion;async verify(spec,options){if(spec.transport==="streamable-http"){return this.verifyHttp(spec,options)}return this.verifyStdio(spec,options)}createClient(probeTimeoutMs){return new Client({name:"@zleap-ai/sag-cli",version:this.cliVersion},{versionNegotiation:{mode:"auto",probe:{timeoutMs:probeTimeoutMs,maxRetries:0}}})}async verifyStdio(spec,options){const client=this.createClient(Math.min(options.timeoutMs,250));const transport=new StdioClientTransport({command:spec.command,args:spec.args,env:{...getDefaultEnvironment(),...spec.env},stderr:"pipe"});transport.stderr?.on("data",()=>void 0);try{await client.connect(transport,{timeout:options.timeoutMs});const era=client.getProtocolEra();const protocolVersion=client.getNegotiatedProtocolVersion();if(!era||!protocolVersion){throw localMcpFailure("protocol","MCP protocol negotiation returned no version")}const listed=await client.listTools(void 0,{timeout:options.timeoutMs,cacheMode:"refresh"}).catch(cause=>{throw localMcpFailure("tools","Unable to list SAG MCP tools",{cause})});const tools=listed.tools.map(tool=>tool.name);const missingTools=REQUIRED_SAG_TOOLS.filter(required2=>!tools.includes(required2));if(missingTools.length){throw localMcpFailure("tools",`SAG MCP is missing required tools: ${missingTools.join(", ")}`)}const listSources2=await client.callTool({name:"list_sources",arguments:{}},{timeout:options.timeoutMs}).catch(cause=>{throw localMcpFailure("knowledge","Unable to call SAG MCP list_sources",{cause})});if(listSources2.isError){throw localMcpFailure("knowledge","SAG MCP list_sources returned an error")}const server=client.getServerVersion();return{transport:"stdio",era,protocolVersion,...server?{server}:{},tools,missingTools,listSourcesCallable:true}}catch(cause){if(cause instanceof CliError){throw cause}throw localMcpFailure("protocol","Unable to verify SAG MCP",{cause})}finally{await client.close().catch(()=>void 0)}}async verifyHttp(spec,options){const client=this.createClient(Math.min(options.timeoutMs,250));const transport=createHttpMcpTransport(spec,sessionCleanupTimeoutMs(options.timeoutMs));let report;let primaryFailure=false;try{await client.connect(transport,{timeout:options.timeoutMs});const era=client.getProtocolEra();const protocolVersion=client.getNegotiatedProtocolVersion();if(!era||!protocolVersion){throw new Error("MCP protocol negotiation returned no version")}const listed=await client.listTools(void 0,{timeout:options.timeoutMs,cacheMode:"refresh"});const tools=listed.tools.map(toMcpToolSummary);const server=client.getServerVersion();report={transport:"streamable-http",url:spec.url,era,protocolVersion,...server?{server}:{},tools,toolCount:tools.length,risk:classifyTools(tools)}}catch{primaryFailure=true}let cleanupFailure;try{await closeHttpMcpClient(client,transport)}catch(cause){cleanupFailure=cause}if(primaryFailure){throw new CliError("MCP_FAILED","\u65E0\u6CD5\u9A8C\u8BC1\u4F01\u4E1A\u7248 HTTP MCP",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5 MCP \u5730\u5740\u548C AccessKey \u540E\u91CD\u8BD5\u3002"})}if(cleanupFailure){throw cleanupFailure}return report}};var import_node_child_process=require("child_process");var NodeProcessRunner=class{async run(input){return new Promise((resolve,reject)=>{const child=(0,import_node_child_process.spawn)(input.command,input.args,{shell:false,env:input.env??process.env,stdio:[input.stdin==="pipe"?"pipe":"ignore","pipe","pipe"]});const childStdout=child.stdout;const childStderr=child.stderr;let stdout="";let stderr="";let timedOut=false;let forceKill;const timeout=setTimeout(()=>{timedOut=true;child.kill("SIGTERM");forceKill=setTimeout(()=>{child.kill("SIGKILL")},250)},input.timeoutMs);childStdout?.setEncoding("utf8");childStderr?.setEncoding("utf8");childStdout?.on("data",chunk=>{stdout+=chunk});childStderr?.on("data",chunk=>{stderr+=chunk});child.on("error",cause=>{clearTimeout(timeout);if(forceKill)clearTimeout(forceKill);reject(new CliError("DEPENDENCY_MISSING",`Unable to start ${input.command}`,{exitCode:exitCodes.dependencyMissing,cause,hint:`Install ${input.command} and ensure it is available on PATH.`}))});child.on("close",exitCode=>{clearTimeout(timeout);if(forceKill)clearTimeout(forceKill);if(timedOut){reject(new CliError("DEPENDENCY_MISSING",`${input.command} timed out`,{exitCode:exitCodes.dependencyMissing,hint:`Check that ${input.command} is responsive and try again.`}));return}resolve({exitCode:exitCode??1,stdout,stderr})})})}};var import_node_crypto5=require("crypto");var import_promises9=require("fs/promises");var import_node_path11=__toESM(require("path"),1);var import_proper_lockfile6=__toESM(require_proper_lockfile(),1);var recentKnowledgeBaseSchema=external_exports.strictObject({id:external_exports.string().min(1),name:external_exports.string().min(1)});var skillAccountSchema=external_exports.strictObject({accessToken:external_exports.string().min(1),refreshToken:external_exports.string().min(1),accessExpiresAt:external_exports.string().datetime({offset:true}),refreshExpiresAt:external_exports.string().datetime({offset:true}),user:external_exports.strictObject({id:external_exports.string().min(1),name:external_exports.string().min(1)}),recentKnowledgeBase:recentKnowledgeBaseSchema.optional()});var skillLinkTokenSchema=external_exports.strictObject({kind:external_exports.literal("open_link"),token:external_exports.string().regex(/^zmp_[A-Za-z0-9_-]{32,}$/)});var skillAuthorizationSchema=external_exports.union([skillAccountSchema,skillLinkTokenSchema]);var skillAccountConfigSchema=external_exports.object({version:external_exports.literal(1),currentOrigin:external_exports.string().optional(),accounts:external_exports.record(external_exports.string(),skillAuthorizationSchema)}).passthrough();function configurationConflict(message,filePath){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:filePath?`Review or restore ${filePath}.`:"Provide a pure SAG Origin."})}function normalizeSkillOrigin(input){try{const parsed=new URL(input);if(!["http:","https:"].includes(parsed.protocol)||!parsed.hostname||parsed.username||parsed.password||parsed.pathname!=="/"||parsed.search||parsed.hash){throw new Error("not a pure HTTP Origin")}return parsed.origin}catch{throw configurationConflict("SAG address must be a pure HTTP or HTTPS Origin")}}var SkillAccountConfigStore=class{constructor(filePath){this.filePath=filePath}filePath;async load(){let raw;try{raw=await(0,import_promises9.readFile)(this.filePath,"utf8")}catch(error51){if(error51.code==="ENOENT"){return{version:1,accounts:{}}}throw error51}try{return skillAccountConfigSchema.parse(JSON.parse(raw))}catch{throw configurationConflict("SAG account configuration is invalid",this.filePath)}}async saveAccount(origin,account){const normalizedOrigin=normalizeSkillOrigin(origin);let validated;try{validated=skillAccountSchema.parse(account)}catch{throw configurationConflict("SAG account is invalid",this.filePath)}await this.#withLock(async()=>{const config2=await this.load();config2.accounts[normalizedOrigin]=validated;config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async saveLinkToken(origin,token){const normalizedOrigin=normalizeSkillOrigin(origin);let authorization;try{authorization=skillLinkTokenSchema.parse({kind:"open_link",token})}catch{throw configurationConflict("Open Link token is invalid",this.filePath)}await this.#withLock(async()=>{const config2=await this.load();config2.accounts[normalizedOrigin]=authorization;config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async removeAccount(origin){const normalizedOrigin=normalizeSkillOrigin(origin);await this.#withLock(async()=>{const config2=await this.load();delete config2.accounts[normalizedOrigin];if(config2.currentOrigin===normalizedOrigin){config2.currentOrigin=Object.keys(config2.accounts).sort()[0]}await this.#saveUnlocked(config2)})}async setCurrentOrigin(origin){const normalizedOrigin=normalizeSkillOrigin(origin);await this.#withLock(async()=>{const config2=await this.load();config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async getAccount(origin){const authorization=(await this.load()).accounts[normalizeSkillOrigin(origin)];return authorization&&!("kind"in authorization)?authorization:null}async getAuthorization(origin){return(await this.load()).accounts[normalizeSkillOrigin(origin)]??null}async saveRecentKnowledgeBase(origin,knowledgeBase){const normalizedOrigin=normalizeSkillOrigin(origin);const validated=recentKnowledgeBaseSchema.parse(knowledgeBase);await this.#withLock(async()=>{const config2=await this.load();const account=config2.accounts[normalizedOrigin];if(!account){throw configurationConflict("SAG account authorization is required",this.filePath)}if("kind"in account)return;config2.accounts[normalizedOrigin]={...account,recentKnowledgeBase:validated};config2.currentOrigin=normalizedOrigin;await this.#saveUnlocked(config2)})}async withRefreshLock(origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);const digest2=(0,import_node_crypto5.createHash)("sha256").update(normalizedOrigin).digest("hex");await(0,import_promises9.mkdir)(import_node_path11.default.dirname(this.filePath),{recursive:true});let release;try{release=await(0,import_proper_lockfile6.lock)(`${this.filePath}.refresh-${digest2}`,{realpath:false,stale:1e4,update:2e3,retries:{retries:300,factor:1,minTimeout:100,maxTimeout:100}})}catch{throw new CliError("CONFIG_CONFLICT","SAG account refresh is busy",{exitCode:exitCodes.configConflict,hint:"Wait for the other SAG Skill refresh to finish and retry."})}try{return await operation()}finally{await release()}}async#withLock(operation){await(0,import_promises9.mkdir)(import_node_path11.default.dirname(this.filePath),{recursive:true});let release;try{release=await(0,import_proper_lockfile6.lock)(this.filePath,{realpath:false,stale:1e4,update:2e3,retries:{retries:100,factor:1,minTimeout:10,maxTimeout:10}})}catch{throw new CliError("CONFIG_CONFLICT","SAG account configuration is busy",{exitCode:exitCodes.configConflict,hint:"Wait for the other SAG Skill operation to finish and retry."})}try{return await operation()}finally{await release()}}async#saveUnlocked(config2){let validated;try{validated=skillAccountConfigSchema.parse(config2)}catch{throw configurationConflict("SAG account configuration is invalid",this.filePath)}const directory=import_node_path11.default.dirname(this.filePath);await(0,import_promises9.mkdir)(directory,{recursive:true});const temporaryPath=import_node_path11.default.join(directory,`.${import_node_path11.default.basename(this.filePath)}.${(0,import_node_crypto5.randomUUID)()}.tmp`);let temporaryCreated=false;try{const handle=await(0,import_promises9.open)(temporaryPath,"wx",384);temporaryCreated=true;try{await handle.chmod(384).catch(()=>void 0);await handle.writeFile(JSON.stringify(validated),"utf8")}finally{await handle.close()}await(0,import_promises9.rename)(temporaryPath,this.filePath)}catch(error51){if(temporaryCreated)await(0,import_promises9.unlink)(temporaryPath).catch(()=>void 0);throw error51}}};var SkillError=class extends Error{code;details;exitCode;problemCode;constructor(code,message,options){super(message);this.name="SkillError";this.code=code;this.details=options.details;this.exitCode=options.exitCode;this.problemCode=options.problemCode}};var dateTimeSchema=external_exports.string().datetime({offset:true});var sessionIdSchema=external_exports.uuid();var createSessionSchema=external_exports.strictObject({session_id:sessionIdSchema,verification_url:external_exports.url(),expires_at:dateTimeSchema});var loginSessionSchema=external_exports.strictObject({session_id:sessionIdSchema,status:external_exports.enum(["pending","approved","denied","consumed"]),expires_at:dateTimeSchema});var accountSchema=external_exports.strictObject({access_token:external_exports.string().min(1),refresh_token:external_exports.string().min(1),access_expires_at:dateTimeSchema,refresh_expires_at:dateTimeSchema,user:external_exports.strictObject({id:external_exports.string().min(1),name:external_exports.string().min(1)})});var problemSchema=external_exports.object({code:external_exports.string().min(1)}).passthrough();var SkillAccountAuthHttpClient=class{#fetch;#timeoutMs;constructor(options={}){this.#fetch=options.fetchImplementation??fetch;this.#timeoutMs=options.timeoutMs??1e4}async createLoginSession(origin,pkceChallenge2){const normalizedOrigin=normalizeSkillOrigin(origin);const response=await this.#request(normalizedOrigin,"/api/v1/integrations/skill-account-logins",{method:"POST",body:{pkce_challenge:pkceChallenge2}});const parsed=await this.#parse(response,createSessionSchema);if(normalizeSkillOrigin(new URL(parsed.verification_url).origin)!==normalizedOrigin){throw invalidResponse()}return{sessionId:parsed.session_id,verificationUrl:parsed.verification_url,expiresAt:parsed.expires_at}}async getLoginSession(origin,sessionId){const validatedId=this.#sessionId(sessionId);const response=await this.#request(normalizeSkillOrigin(origin),`/api/v1/integrations/skill-account-logins/${encodeURIComponent(validatedId)}`,{method:"GET"});const parsed=await this.#parse(response,loginSessionSchema);if(parsed.session_id!==validatedId)throw invalidResponse();return{sessionId:parsed.session_id,status:parsed.status,expiresAt:parsed.expires_at}}async exchange(origin,input){const sessionId=this.#sessionId(input.sessionId);const response=await this.#request(normalizeSkillOrigin(origin),`/api/v1/integrations/skill-account-logins/${encodeURIComponent(sessionId)}/exchange`,{method:"POST",body:{pkce_verifier:input.pkceVerifier}});return asAccount(await this.#parse(response,accountSchema))}async refresh(origin,refreshToken){const response=await this.#request(normalizeSkillOrigin(origin),"/api/v1/integrations/skill-account-sessions/refresh",{method:"POST",body:{refresh_token:refreshToken}});return asAccount(await this.#parse(response,accountSchema))}async logout(origin,accessToken,refreshToken){const response=await this.#request(normalizeSkillOrigin(origin),"/api/v1/integrations/skill-account-sessions/current",{method:"DELETE",body:{refresh_token:refreshToken},authorization:`Bearer ${accessToken}`});if(response.status!==204)throw invalidResponse()}#sessionId(value){const parsed=sessionIdSchema.safeParse(value);if(!parsed.success){throw new SkillError("INVALID_ARGUMENT","Skill login session is invalid",{exitCode:exitCodes.invalidArgument})}return parsed.data}async#request(origin,requestPath,options){let response;try{response=await this.#fetch(new URL(requestPath,origin),{headers:{Accept:"application/json","Cache-Control":"no-store",...options.body?{"Content-Type":"application/json"}:{},...options.authorization?{Authorization:options.authorization}:{}},method:options.method,redirect:"error",signal:AbortSignal.timeout(this.#timeoutMs),...options.body?{body:JSON.stringify(options.body)}:{}})}catch{throw new SkillError("NETWORK_UNREACHABLE","Cannot reach the SAG account authorization service",{exitCode:exitCodes.networkUnreachable})}if(response.redirected||response.status>=300&&response.status<400){throw invalidResponse()}if(!response.ok){let code="unknown";try{const problem=problemSchema.safeParse(await response.json());if(problem.success)code=problem.data.code}catch{}throw problemError(code,response.status)}return response}async#parse(response,schema){try{const parsed=schema.safeParse(await response.json());if(parsed.success)return parsed.data}catch{}throw invalidResponse()}};function asAccount(value){return{accessToken:value.access_token,refreshToken:value.refresh_token,accessExpiresAt:value.access_expires_at,refreshExpiresAt:value.refresh_expires_at,user:value.user}}function invalidResponse(){return new SkillError("INVALID_RESPONSE","SAG account authorization returned an incompatible response",{exitCode:exitCodes.internalError})}function problemError(code,status2){if(code==="access_denied"||status2===403){return new SkillError("PERMISSION_DENIED","SAG account authorization was denied",{exitCode:exitCodes.permissionDenied,problemCode:"access_denied"})}if(code==="login_session_expired"||code==="invalid_grant"||status2===410){return new SkillError("AUTH_EXPIRED","SAG account authorization has expired",{exitCode:exitCodes.authRequired,problemCode:code})}if(status2===401){return new SkillError("AUTH_REQUIRED","SAG account authorization is required",{exitCode:exitCodes.authRequired})}if(status2===429||code==="rate_limited"){return new SkillError("RATE_LIMITED","SAG account authorization is rate limited",{exitCode:exitCodes.networkUnreachable,problemCode:"rate_limited"})}return invalidResponse()}var import_node_crypto6=require("crypto");var import_promises10=require("fs/promises");var import_node_path12=__toESM(require("path"),1);var import_proper_lockfile7=__toESM(require_proper_lockfile(),1);var agentSchema=external_exports.enum(["codex","claude-code","workbuddy"]);var digestSchema=external_exports.string().regex(/^sha256:[a-f0-9]{64}$/u);var managedSkillSchema=external_exports.strictObject({agent:agentSchema,backupPath:external_exports.string().min(1).optional(),fingerprint:digestSchema,target:external_exports.string().min(1),version:external_exports.string().min(1)});var skillStateSchema=external_exports.strictObject({schema:external_exports.literal(2),managedSkills:external_exports.record(external_exports.string(),managedSkillSchema)});function emptyState5(){return{schema:2,managedSkills:{}}}function invalidState5(filePath){return new CliError("CONFIG_CONFLICT","Skill installation state is invalid",{exitCode:exitCodes.configConflict,hint:`Remove the unpublished legacy state at ${filePath}, then reinstall the Skill.`})}function managedSkillKey(agent,target){return`${agent}:${target}`}var SkillStateStore=class{constructor(filePath){this.filePath=filePath}filePath;async#withLock(operation){await(0,import_promises10.mkdir)(import_node_path12.default.dirname(this.filePath),{recursive:true});let release;try{release=await(0,import_proper_lockfile7.lock)(this.filePath,{realpath:false,stale:1e4,update:2e3,retries:{retries:100,factor:1,minTimeout:10,maxTimeout:10}})}catch{throw new CliError("CONFIG_CONFLICT","Skill installation state is busy",{exitCode:exitCodes.configConflict})}try{return await operation()}finally{await release()}}async load(){try{return skillStateSchema.parse(JSON.parse(await(0,import_promises10.readFile)(this.filePath,"utf8")))}catch(error51){if(error51.code==="ENOENT")return emptyState5();throw invalidState5(this.filePath)}}async#saveUnlocked(state){const validated=skillStateSchema.parse(state);const directory=import_node_path12.default.dirname(this.filePath);await(0,import_promises10.mkdir)(directory,{recursive:true});const temporaryPath=import_node_path12.default.join(directory,`.${import_node_path12.default.basename(this.filePath)}.${(0,import_node_crypto6.randomUUID)()}.tmp`);let temporaryCreated=false;try{const handle=await(0,import_promises10.open)(temporaryPath,"wx",384);temporaryCreated=true;try{await handle.chmod(384);await handle.writeFile(JSON.stringify(validated),"utf8")}finally{await handle.close()}await(0,import_promises10.rename)(temporaryPath,this.filePath)}catch(error51){if(temporaryCreated)await(0,import_promises10.unlink)(temporaryPath).catch(()=>void 0);throw error51}}async getManagedSkill(agent,target){return(await this.load()).managedSkills[managedSkillKey(agent,target)]??null}async saveManagedSkill(managedSkill){const validated=managedSkillSchema.parse(managedSkill);await this.#withLock(async()=>{const state=await this.load();state.managedSkills[managedSkillKey(validated.agent,validated.target)]=validated;await this.#saveUnlocked(state)})}async deleteManagedSkill(agent,target){await this.#withLock(async()=>{const state=await this.load();delete state.managedSkills[managedSkillKey(agent,target)];await this.#saveUnlocked(state)})}};var import_node_crypto13=require("crypto");var import_index2=__toESM(require_commander(),1);var{program,createCommand,createArgument,createOption,CommanderError,InvalidArgumentError,InvalidOptionArgumentError,Command,Argument,Option,Help}=import_index2.default;var dateTime=external_exports.string().min(1);var rootSchema=external_exports.object({name:external_exports.string().min(1),version:external_exports.string().min(1),docs:external_exports.string()}).passthrough();var readySchema=external_exports.object({status:external_exports.string(),db:external_exports.boolean()}).passthrough();var capabilitiesSchema=external_exports.record(external_exports.string(),external_exports.unknown());var userSchema=external_exports.object({id:external_exports.string().min(1),email:external_exports.string(),name:external_exports.string(),created_at:dateTime.optional()}).passthrough();var loginResponseSchema=external_exports.object({access_token:external_exports.string().min(1),user:userSchema}).passthrough();var sourceSchema=external_exports.object({id:external_exports.string().min(1),name:external_exports.string(),description:external_exports.string(),source_type:external_exports.enum(["document","web","message","audio"]),connector_kind:external_exports.string(),status:external_exports.enum(["active","paused","error"]),document_count:external_exports.number().int().nonnegative(),chunk_count:external_exports.number().int().nonnegative(),event_count:external_exports.number().int().nonnegative(),created_at:dateTime,updated_at:dateTime}).passthrough();var documentStatusSchema=external_exports.enum(["pending","loading","extracting","paused","ready","failed"]);var documentSchema=external_exports.object({id:external_exports.string().min(1),source_id:external_exports.string().min(1),filename:external_exports.string(),content_type:external_exports.string(),size_bytes:external_exports.number().int().nonnegative(),status:documentStatusSchema,chunk_count:external_exports.number().int().nonnegative(),event_count:external_exports.number().int().nonnegative(),progress:external_exports.number().int().min(0).max(100),token_usage:external_exports.number().int().nonnegative(),error:external_exports.string().nullable(),created_at:dateTime,updated_at:dateTime}).passthrough();var searchSectionSchema=external_exports.object({chunk_id:external_exports.string().nullable(),heading:external_exports.string(),content:external_exports.string(),score:external_exports.number(),rank:external_exports.number().int(),source_id:external_exports.string().nullable(),source_name:external_exports.string().nullable().optional()}).passthrough();var searchEventSchema=external_exports.object({id:external_exports.string(),title:external_exports.string(),summary:external_exports.string(),rank:external_exports.number().int(),score:external_exports.number()}).passthrough();var sourceHitSchema=external_exports.object({source_id:external_exports.string(),source_name:external_exports.string().nullable().optional(),event_hits:external_exports.number().int(),max_score:external_exports.number(),latest_event_time:external_exports.string().nullable().optional()}).passthrough();var searchResponseSchema=external_exports.object({query:external_exports.string(),sections:external_exports.array(searchSectionSchema),events:external_exports.array(searchEventSchema),entities:external_exports.array(external_exports.record(external_exports.string(),external_exports.unknown())),relations:external_exports.array(external_exports.record(external_exports.string(),external_exports.unknown())),source_hits:external_exports.array(sourceHitSchema),summary:external_exports.string(),exploration_id:external_exports.string().nullable(),stats:external_exports.record(external_exports.string(),external_exports.unknown())}).passthrough();var mcpDescriptorSchema=external_exports.object({name:external_exports.string(),scope:external_exports.string(),source_count:external_exports.number().int().nonnegative(),tools:external_exports.array(external_exports.string()),http:external_exports.object({transport:external_exports.string(),url:external_exports.string().url(),headers:external_exports.record(external_exports.string(),external_exports.string())}).passthrough()}).passthrough();var outlineItemSchema=external_exports.object({rank:external_exports.number().int(),heading:external_exports.string(),chunk_id:external_exports.string()}).passthrough();var outlineSchema=external_exports.object({document_id:external_exports.string(),filename:external_exports.string(),outline:external_exports.array(outlineItemSchema)}).passthrough();var grepMatchSchema=external_exports.object({chunk_id:external_exports.string(),heading:external_exports.string(),snippet:external_exports.string()}).passthrough();var grepResponseSchema=external_exports.object({pattern:external_exports.string(),matches:external_exports.array(grepMatchSchema),count:external_exports.number().int().nonnegative()}).passthrough();var readResponseSchema=external_exports.object({document_id:external_exports.string(),filename:external_exports.string(),total_lines:external_exports.number().int().nonnegative(),offset:external_exports.number().int().positive(),limit:external_exports.number().int().positive(),lines:external_exports.array(external_exports.string())}).passthrough();var entityContextSchema=external_exports.object({entity_id:external_exports.string(),name:external_exports.string(),type:external_exports.string(),description:external_exports.string(),context:external_exports.string(),source_id:external_exports.string(),source_name:external_exports.string()}).passthrough();var searchTimeoutMs=15e3;var SagClient=class{#origin;#token;#timeoutMs;#locale;#fetch;constructor(options){this.#origin=normalizeOrigin(options.origin);this.#token=options.token;this.#timeoutMs=options.timeoutMs??1e4;this.#locale=options.locale??"zh-CN";this.#fetch=options.fetchImplementation??fetch}root(){return this.#request("/",rootSchema,{authenticated:false})}ready(){return this.#request("/api/v1/system/ready",readySchema,{authenticated:false})}capabilities(){return this.#request("/api/v1/system/capabilities",capabilitiesSchema,{authenticated:false})}me(){return this.#request("/api/v1/auth/me",userSchema)}async login(name){const response=await this.#request("/api/v1/auth/login",loginResponseSchema,{authenticated:false,method:"POST",body:{name}});return{accessToken:response.access_token,user:response.user}}mcpDescriptor(){return this.#request("/api/v1/system/mcp",mcpDescriptorSchema)}listSources(){return this.#request("/api/v1/sources",sourceSchema.array())}getSource(sourceId){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}`,sourceSchema)}listDocuments(sourceId){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/documents`,documentSchema.array())}getDocument(sourceId,documentId){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}`,documentSchema)}search(input){return this.#request("/api/v1/search",searchResponseSchema,{method:"POST",body:input,timeoutMs:searchTimeoutMs})}outline(sourceId,documentId){const params=new URLSearchParams({document_id:documentId});return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/outline?${params}`,outlineSchema)}grep(sourceId,pattern,limit){const params=new URLSearchParams({pattern});if(limit!==void 0){params.set("limit",String(limit))}return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/grep?${params}`,grepResponseSchema)}readDocument(sourceId,documentId,offset,limit){const params=new URLSearchParams;if(offset!==void 0){params.set("offset",String(offset))}if(limit!==void 0){params.set("limit",String(limit))}return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/documents/${encodeURIComponent(documentId)}/read?${params}`,readResponseSchema)}getEntityContext(sourceId,name){return this.#request(`/api/v1/sources/${encodeURIComponent(sourceId)}/entities/${encodeURIComponent(name)}/context`,entityContextSchema)}async#request(path16,schema,options={}){const authenticated=options.authenticated??true;if(authenticated&&!this.#token){throw new CliError("AUTH_REQUIRED","No SAG token is configured",{exitCode:exitCodes.authRequired,hint:"Run `sag auth login` or set SAG_TOKEN."})}const headers=new Headers({Accept:"application/json","Accept-Language":this.#locale});if(authenticated&&this.#token){headers.set("Authorization",`Bearer ${this.#token}`)}if(options.body!==void 0){headers.set("Content-Type","application/json")}let response;try{response=await this.#fetch(new URL(path16,`${this.#origin}/`),{method:options.method??"GET",headers,...options.body!==void 0?{body:JSON.stringify(options.body)}:{},signal:AbortSignal.timeout(options.timeoutMs??this.#timeoutMs)})}catch(cause){throw new CliError("NETWORK_UNREACHABLE",`Cannot reach SAG at ${this.#origin}`,{exitCode:exitCodes.networkUnreachable,cause,hint:"Check that SAG is running and the URL is reachable."})}const payload=await this.#readPayload(response);if(!response.ok){throw this.#httpError(response.status,payload)}const parsed=schema.safeParse(payload);if(!parsed.success){throw new CliError("INVALID_RESPONSE","SAG returned an incompatible response",{exitCode:exitCodes.internalError,cause:parsed.error,hint:"Check the SAG/CLI compatibility matrix."})}return parsed.data}async#readPayload(response){try{return await response.json()}catch(cause){throw new CliError("INVALID_RESPONSE","SAG returned invalid JSON",{exitCode:exitCodes.internalError,cause})}}#httpError(status2,payload){const serverMessage=payload&&typeof payload==="object"&&"error"in payload&&payload.error&&typeof payload.error==="object"&&"message"in payload.error&&typeof payload.error.message==="string"?payload.error.message:`SAG request failed with HTTP ${status2}`;if(status2===401){return new CliError("AUTH_REQUIRED",serverMessage,{exitCode:exitCodes.authRequired,hint:"Run `sag auth login` to refresh the token."})}if(status2===403){return new CliError("PERMISSION_DENIED",serverMessage,{exitCode:exitCodes.permissionDenied})}if(status2===404){return new CliError("RESOURCE_NOT_FOUND",serverMessage,{exitCode:exitCodes.resourceNotFound})}if(status2===409){return new CliError("DOCUMENT_NOT_READY",serverMessage,{exitCode:exitCodes.documentNotReady})}if(status2>=500){return new CliError("SERVICE_NOT_READY",serverMessage,{exitCode:exitCodes.serviceNotReady})}return new CliError("INVALID_RESPONSE",serverMessage,{exitCode:exitCodes.internalError})}};var SERVER_NAME_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$/u;function validateServerName(serverName){if(!SERVER_NAME_PATTERN.test(serverName)){throw new CliError("INVALID_ARGUMENT","Invalid MCP server name",{exitCode:exitCodes.invalidArgument,hint:"Use 1-64 letters, numbers, dots, underscores, or dashes."})}}function conflict4(message){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:"Choose another `--name` or restore the SAG CLI managed entry."})}function hostFailure4(message,cause,hint){return new CliError("HOST_CONFIG_FAILED",message,{exitCode:exitCodes.hostConfigFailed,...cause?{cause}:{},hint:hint??"Inspect the Agent MCP configuration and run the command again."})}function determinePlan(input){let action;if(!input.hostFingerprint||!input.hostSpecFingerprint){if(input.managed){throw conflict4("Managed state exists but the Agent MCP entry is missing")}action="create"}else if(!input.managed){throw conflict4("The Agent MCP name is already owned by the user")}else if(input.managed.fingerprint!==input.hostFingerprint){throw conflict4("The managed Agent MCP entry was changed outside SAG CLI")}else if(input.hostSpecFingerprint===input.desiredFingerprint){action="unchanged"}else{action="update"}return{action,agent:input.agent,serverName:input.serverName,scope:input.scope,provider:"docker-stdio",target:input.target.name,sourceId:input.sourceId??null,...input.hostSpecFingerprint?{currentFingerprint:input.hostSpecFingerprint}:{},desiredFingerprint:input.desiredFingerprint}}function managedConnection(input,resolved,fingerprint,existing){return{agent:input.agent,provider:"docker-stdio",profile:input.profile,serverName:input.serverName,docker:{...resolved.target.composeProject?{composeProject:resolved.target.composeProject}:{},...resolved.target.composeService?{composeService:resolved.target.composeService}:{},containerName:resolved.target.name},sourceId:input.sourceId??null,scope:input.scope,fingerprint,createdAt:existing?.createdAt??input.now().toISOString()}}async function rollbackHost(input){if(input.previousSpec){try{await input.adapter.remove(input.serverName,input.scope)}catch{}await input.adapter.add(input.serverName,input.scope,input.previousSpec);const restored=await input.adapter.read(input.serverName,input.scope);if(!restored||restored.fingerprint!==(input.previousFingerprint??fingerprintConnection(input.previousSpec))){throw new Error("Previous Agent MCP entry was not restored")}return}await input.adapter.remove(input.serverName,input.scope)}async function connectAgent(input){validateServerName(input.serverName);const resolved=await input.resolveConnection();if(!input.adapter.capabilities.transports.includes(resolved.spec.transport)){throw new CliError("INVALID_ARGUMENT",`${input.agent} adapter does not support ${resolved.spec.transport} MCP connections`,{exitCode:exitCodes.invalidArgument,hint:"Choose a provider supported by the installed Agent adapter."})}if(!input.adapter.capabilities.scopes.includes(input.scope)){throw new CliError("INVALID_ARGUMENT",`${input.agent} adapter does not support ${input.scope} scope`,{exitCode:exitCodes.invalidArgument})}await input.verifier.verify(resolved.spec,{timeoutMs:input.timeoutMs});await input.adapter.detect();const host=await input.adapter.read(input.serverName,input.scope);const key=connectionKey(input.agent,input.scope,input.serverName);const managed=await input.state.get(key);const desiredFingerprint=fingerprintConnection(resolved.spec);const plan=determinePlan({agent:input.agent,serverName:input.serverName,scope:input.scope,target:resolved.target,...input.sourceId?{sourceId:input.sourceId}:{},desiredFingerprint,...host?{hostFingerprint:host.fingerprint}:{},...host?{hostSpecFingerprint:fingerprintConnection(host.spec)}:{},managed});if(plan.action==="unchanged"){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"unchanged",changed:false,verified:true,dryRun:false,plan}}if(input.dryRun){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:plan.action,changed:false,verified:true,dryRun:true,plan}}if(!input.yes&&!await input.confirm(`${plan.action==="create"?"Add":"Update"} ${input.serverName} in ${input.agent}?`)){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"cancelled",changed:false,verified:true,dryRun:false,plan}}try{if(plan.action==="update"){await input.adapter.remove(input.serverName,input.scope)}await input.adapter.add(input.serverName,input.scope,resolved.spec);const readBack=await input.adapter.read(input.serverName,input.scope);if(!readBack||fingerprintConnection(readBack.spec)!==desiredFingerprint){throw hostFailure4("Agent MCP read-back did not match the requested connection")}await input.verifier.verify(readBack.spec,{timeoutMs:input.timeoutMs});await input.state.set(managedConnection(input,resolved,readBack.fingerprint,managed))}catch(cause){try{await rollbackHost({adapter:input.adapter,serverName:input.serverName,scope:input.scope,...host?{previousSpec:host.spec}:{},...host?{previousFingerprint:host.fingerprint}:{}})}catch{throw hostFailure4("Agent MCP configuration failed and rollback also failed",cause,`Inspect the ${input.agent} MCP entry \`${input.serverName}\` before retrying.`)}throw hostFailure4("Agent MCP configuration failed; changes were rolled back",cause)}return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:plan.action,changed:true,verified:true,dryRun:false,plan}}async function disconnectAgent(input){validateServerName(input.serverName);await input.adapter.detect();const key=connectionKey(input.agent,input.scope,input.serverName);const managed=await input.state.get(key);if(!managed){throw conflict4("The Agent MCP entry is not managed by SAG CLI")}const host=await input.adapter.read(input.serverName,input.scope);if(!host){throw conflict4("Managed state exists but the Agent MCP entry is missing")}if(host.fingerprint!==managed.fingerprint){throw conflict4("The managed Agent MCP entry was changed outside SAG CLI")}const plan={action:"unchanged",agent:input.agent,serverName:input.serverName,scope:input.scope,provider:"docker-stdio",target:managed.docker.containerName,sourceId:managed.sourceId,currentFingerprint:host.fingerprint,desiredFingerprint:host.fingerprint};if(!input.yes&&!await input.confirm(`Remove ${input.serverName} from ${input.agent}?`)){return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"cancelled",changed:false,verified:true,dryRun:false,plan}}await input.adapter.remove(input.serverName,input.scope);try{await input.state.delete(key)}catch(cause){try{await input.adapter.add(input.serverName,input.scope,host.spec)}catch{throw hostFailure4("Managed state cleanup failed and the Agent entry could not be restored",cause)}throw hostFailure4("Managed state cleanup failed; the Agent entry was restored",cause)}return{agent:input.agent,serverName:input.serverName,scope:input.scope,action:"disconnect",changed:true,verified:true,dryRun:false,plan}}var SOURCE_ID_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;var DockerStdioProvider=class{id="docker-stdio";async inspect(input){return{provider:this.id,ready:true,target:input.target.name}}async createSpec(input){if(input.sourceId&&!SOURCE_ID_PATTERN.test(input.sourceId)){throw new CliError("INVALID_ARGUMENT","Invalid SAG source id",{exitCode:exitCodes.invalidArgument,hint:"Use 1-128 letters, numbers, underscores, or dashes."})}const sourceArguments=input.sourceId?["-e",`SAG_MCP_SOURCE_ID=${input.sourceId}`]:[];return{transport:"stdio",command:"docker",args:["exec","-i",...sourceArguments,input.target.name,"python","-m","sag_api.mcp.server"],env:{}}}};var CONTAINER_PATTERN=/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/u;function validateContainer(value){if(!CONTAINER_PATTERN.test(value)){throw new CliError("INVALID_ARGUMENT","Invalid Docker container name or id",{exitCode:exitCodes.invalidArgument,hint:"Use 1-128 letters, numbers, dots, underscores, or dashes."})}}function toTarget(inspection){const composeProject=inspection.labels["com.docker.compose.project"]||void 0;const composeService=inspection.labels["com.docker.compose.service"]||void 0;return{id:inspection.id,name:inspection.name,...composeProject?{composeProject}:{},...composeService?{composeService}:{},health:inspection.health}}async function validateTarget(docker,container){const inspection=await docker.inspect(container);if(!inspection.running||inspection.health==="unhealthy"||inspection.health==="starting"){throw new CliError("SERVICE_NOT_READY","SAG API container is not ready",{exitCode:exitCodes.serviceNotReady,hint:"Check the SAG API container health and logs."})}if(!await docker.canImportMcp(inspection.name)){throw localMcpFailure("entrypoint","SAG API container does not provide the stdio MCP entrypoint",{hint:"Use a compatible SAG image that includes sag_api.mcp.server."})}return toTarget(inspection)}async function discoverSagContainer(input){await input.docker.version();if(input.container){validateContainer(input.container);return validateTarget(input.docker,input.container)}const containers=await input.docker.listRunningContainers();const apiCandidates=containers.filter(container=>container.labels["com.docker.compose.service"]==="api");if(!apiCandidates.length){throw new CliError("RESOURCE_NOT_FOUND","No SAG API container was found",{exitCode:exitCodes.resourceNotFound,hint:"Start SAG Docker or pass `--container <name-or-id>`."})}const targets=[];let firstFailure;let preferredFailure;for(const candidate of apiCandidates){try{targets.push(await validateTarget(input.docker,candidate.id))}catch(error51){firstFailure??=error51;if(candidate.labels["com.docker.compose.project"]==="sag"){preferredFailure??=error51}}}if(!targets.length){throw preferredFailure??firstFailure}const preferredTargets=targets.filter(target=>target.composeProject==="sag");const rankedTargets=preferredTargets.length?preferredTargets:targets;if(rankedTargets.length===1){return rankedTargets[0]}if(!input.interactive||!input.select){throw new CliError("CONFIG_CONFLICT","Multiple SAG API containers were found",{exitCode:exitCodes.configConflict,hint:"Pass `--container <name-or-id>` to select one."})}const selectedId=await input.select(rankedTargets);const selected=rankedTargets.find(target=>target.id===selectedId||target.name===selectedId);if(!selected){throw new CliError("INVALID_ARGUMENT","Invalid Docker container selection",{exitCode:exitCodes.invalidArgument})}return selected}async function connectLocalAgent(runtime2,input){return connectAgent({agent:input.agent,serverName:input.serverName,scope:"user",profile:input.profile,...input.sourceId?{sourceId:input.sourceId}:{},timeoutMs:input.timeoutMs,dryRun:input.dryRun,yes:input.yes,resolveConnection:async()=>{const target=await discoverSagContainer({docker:runtime2.docker,...input.container?{container:input.container}:{},interactive:runtime2.interactive,select:runtime2.selectContainer});const spec=await new DockerStdioProvider().createSpec({target,...input.sourceId?{sourceId:input.sourceId}:{}});return{target,spec}},verifier:runtime2.verifier,adapter:runtime2.adapters[input.agent],state:runtime2.state,confirm:input.confirm,now:input.now})}async function agentStatus(runtime2,agent,serverName){const adapter=runtime2.adapters[agent];let version2;try{version2=(await adapter.detect()).version}catch{return{agent,installed:false,serverName,status:"unavailable",managed:false,verified:false}}const key=connectionKey(agent,"user",serverName);const[managed,host]=await Promise.all([runtime2.state.get(key),adapter.read(serverName,"user")]);if(!host){return{agent,installed:true,version:version2,serverName,status:managed?"drifted":"disconnected",managed:Boolean(managed),verified:false}}if(!managed){return{agent,installed:true,version:version2,serverName,status:"unmanaged",managed:false,verified:false}}if(host.fingerprint!==managed.fingerprint){return{agent,installed:true,version:version2,serverName,status:"drifted",managed:true,verified:false}}try{await runtime2.verifier.verify(host.spec,{timeoutMs:15e3});return{agent,installed:true,version:version2,serverName,status:"connected",managed:true,verified:true}}catch{return{agent,installed:true,version:version2,serverName,status:"unavailable",managed:true,verified:false}}}async function statusLocalAgents(runtime2,input){const agents2=input.agent?[input.agent]:["codex","claude-code"];return Promise.all(agents2.map(agent=>agentStatus(runtime2,agent,input.serverName)))}async function listAgentHosts(runtime2){return Promise.all(["codex","claude-code"].map(async agent=>{const managedConnections=(await runtime2.state.list({agent})).length;try{const installation=await runtime2.adapters[agent].detect();return{agent,installed:true,version:installation.version,managedConnections}}catch{return{agent,installed:false,managedConnections}}}))}async function disconnectLocalAgent(runtime2,input){return disconnectAgent({agent:input.agent,serverName:input.serverName,scope:"user",adapter:runtime2.adapters[input.agent],state:runtime2.state,yes:input.yes,confirm:input.confirm})}async function login(input){const environmentToken=input.environmentToken?.trim();if(environmentToken){const user2=await input.validate(environmentToken);await input.store.set(input.credentialRef,environmentToken);return{authenticated:true,credentialRef:input.credentialRef,credentialStore:input.store.kind,user:user2}}const name=(input.name??await input.promptName()).trim();if(!name){throw new CliError("INVALID_ARGUMENT","A SAG user name is required",{exitCode:exitCodes.invalidArgument,hint:"Pass `--name <name>` or enter a name when prompted."})}const{accessToken,user}=await input.authenticate(name);await input.store.set(input.credentialRef,accessToken);return{authenticated:true,credentialRef:input.credentialRef,credentialStore:input.store.kind,user}}async function status(input){const token=input.environmentToken?.trim()||await input.store.get(input.credentialRef);if(!token){return{authenticated:false,credentialRef:input.credentialRef,credentialStore:input.store.kind}}const user=await input.validate(token);return{authenticated:true,credentialRef:input.credentialRef,credentialStore:input.store.kind,user}}async function logout(input){await input.store.delete(input.credentialRef);return{authenticated:false,credentialRef:input.credentialRef}}function requiredIdentifier(value,label){const normalized=value.trim();if(!normalized){throw new CliError("INVALID_ARGUMENT",`${label} is required`,{exitCode:exitCodes.invalidArgument})}return normalized}function summarizeDocuments(documents){const statuses={pending:0,loading:0,extracting:0,paused:0,ready:0,failed:0};for(const document of documents){statuses[document.status]+=1}return{total:documents.length,statuses,searchable:documents.length>0&&statuses.ready===documents.length}}async function listDocuments(client,sourceId){return client.listDocuments(requiredIdentifier(sourceId,"Source ID"))}async function getDocument(client,sourceId,documentId){return client.getDocument(requiredIdentifier(sourceId,"Source ID"),requiredIdentifier(documentId,"Document ID"))}async function documentStatus(client,sourceId,documentId){const normalizedSourceId=requiredIdentifier(sourceId,"Source ID");if(documentId!==void 0){const document=await getDocument(client,normalizedSourceId,documentId);return{mode:"document",document,searchable:document.status==="ready"}}const summary=summarizeDocuments(await client.listDocuments(normalizedSourceId));return{mode:"source",sourceId:normalizedSourceId,total:summary.total,statuses:summary.statuses,searchable:summary.searchable}}function requiredIdentifier2(value,label){const normalized=value.trim();if(!normalized){throw new CliError("INVALID_ARGUMENT",`${label} is required`,{exitCode:exitCodes.invalidArgument})}return normalized}async function outline(client,sourceId,documentId){return client.outline(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(documentId,"Document ID"))}async function grep(client,sourceId,pattern,limit){return client.grep(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(pattern,"Pattern"),limit)}async function read(client,sourceId,documentId,offset,limit){return client.readDocument(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(documentId,"Document ID"),offset,limit)}async function getEntityContext(client,sourceId,name){return client.getEntityContext(requiredIdentifier2(sourceId,"Source ID"),requiredIdentifier2(name,"Entity name"))}async function testLocalMcp(runtime2,input){const container=await discoverSagContainer({docker:runtime2.docker,...input.container?{container:input.container}:{},interactive:runtime2.interactive,select:runtime2.selectContainer});const spec=await new DockerStdioProvider().createSpec({target:container,...input.sourceId?{sourceId:input.sourceId}:{}});const verification=await runtime2.verifier.verify(spec,{timeoutMs:input.timeoutMs});return{provider:"docker-stdio",container,sourceId:input.sourceId??null,...verification}}function skipped(name,detail){return{name,status:"warn",code:"CHECK_SKIPPED",detail}}async function localMcpDoctorChecks(runtime2,input){try{const report=await testLocalMcp(runtime2,input);return[{name:"docker",status:"pass",code:"DOCKER_READY",detail:"Docker daemon is available"},{name:"sagContainer",status:"pass",code:"SAG_CONTAINER_READY",detail:`${report.container.name} is ${report.container.health}`},{name:"mcpEntrypoint",status:"pass",code:"MCP_ENTRYPOINT_READY",detail:"sag_api.mcp.server is importable"},{name:"mcpProtocol",status:"pass",code:"MCP_PROTOCOL_READY",detail:`${report.protocolVersion} ${report.era}`},{name:"mcpTools",status:"pass",code:"MCP_TOOLS_READY",detail:`${report.tools.length} tools`},{name:"mcpKnowledge",status:"pass",code:"MCP_KNOWLEDGE_READY",detail:"list_sources callable"}]}catch(error51){const cliError=toCliError(error51);const mcpStage=localMcpFailureStage(cliError);const failedName=cliError.code==="DEPENDENCY_MISSING"?"docker":cliError.code==="RESOURCE_NOT_FOUND"||cliError.code==="SERVICE_NOT_READY"?"sagContainer":mcpStage==="entrypoint"?"mcpEntrypoint":mcpStage==="tools"?"mcpTools":mcpStage==="knowledge"?"mcpKnowledge":"mcpProtocol";const names=["docker","sagContainer","mcpEntrypoint","mcpProtocol","mcpTools","mcpKnowledge"];const failedIndex=names.indexOf(failedName);return names.map((name,index)=>{if(index<failedIndex){return{name,status:"pass",code:"CHECK_COMPLETED",detail:"Prerequisite check passed"}}if(index===failedIndex){return{name,status:"fail",code:cliError.code,detail:cliError.message,...cliError.hint?{hint:cliError.hint}:{}}}return skipped(name,`Skipped because ${failedName} failed`)})}}function credentialStoreForEnterpriseMcpConnection(connection,stores){return stores[connection.credentialStore]}var import_node_crypto7=require("crypto");function invalidImport(message,cause){return new CliError("INVALID_ARGUMENT",message,{exitCode:exitCodes.invalidArgument,...cause?{cause}:{}})}function parseDocument(input){let decoded;try{decoded=JSON.parse(input)}catch(cause){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u5FC5\u987B\u662F\u6709\u6548\u7684 JSON",cause)}if(!decoded||typeof decoded!=="object"||Array.isArray(decoded)){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u5FC5\u987B\u662F JSON \u5BF9\u8C61")}const root=decoded;if(Object.keys(root).length!==1||!("mcpServers"in root)){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u7684\u6839\u5B57\u6BB5\u5FC5\u987B\u4E14\u53EA\u80FD\u4F7F\u7528 mcpServers")}const servers=root.mcpServers;if(!servers||typeof servers!=="object"||Array.isArray(servers)){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u5FC5\u987B\u5305\u542B\u670D\u52A1\u5668\u914D\u7F6E")}const parsedServers=servers;if(!Object.keys(parsedServers).length){throw invalidImport("MCP \u8FDE\u63A5\u4FE1\u606F\u4E2D\u6CA1\u6709\u670D\u52A1\u5668")}return parsedServers}function hasForbiddenRawUrlDelimiter(value){const schemeEnd=value.indexOf("://");const authorityAndPath=schemeEnd<0?"":value.slice(schemeEnd+3);const authorityEnd=authorityAndPath.search(/[/?#]/u);const authority=authorityEnd<0?authorityAndPath:authorityAndPath.slice(0,authorityEnd);return authority.includes("@")||value.includes("#")}function parseUrl(value,options){if(typeof value!=="string"){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740")}if(hasForbiddenRawUrlDelimiter(value)){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740")}let url2;try{url2=new URL(value)}catch(cause){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740",cause)}if(!["http:","https:"].includes(url2.protocol)||!url2.hostname||url2.username||url2.password){throw invalidImport("MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u662F\u5B8C\u6574\u7684 HTTP \u6216 HTTPS \u5730\u5740")}const localHosts=new Set(["localhost","127.0.0.1","[::1]"]);if(url2.protocol==="http:"&&!options.allowInsecureHttp&&!localHosts.has(url2.hostname)){throw invalidImport("\u8FDC\u7A0B MCP \u670D\u52A1\u5668 URL \u5FC5\u987B\u4F7F\u7528 HTTPS")}return url2.toString()}function parseEnterpriseMcpHeaders(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw invalidImport("MCP \u670D\u52A1\u5668\u914D\u7F6E\u5FC5\u987B\u5305\u542B Authorization \u8BF7\u6C42\u5934")}const entries=Object.entries(value);let authorizationCount=0;for(const[name,headerValue]of entries){if(typeof headerValue!=="string"){throw invalidImport("MCP \u670D\u52A1\u5668\u8BF7\u6C42\u5934\u7684\u503C\u5FC5\u987B\u662F\u5B57\u7B26\u4E32")}try{new Headers({[name]:headerValue})}catch{throw invalidImport("MCP \u670D\u52A1\u5668\u8BF7\u6C42\u5934\u65E0\u6548")}if(name.toLowerCase()==="authorization"){authorizationCount+=1;if(!headerValue.trim().startsWith("Bearer ")){throw invalidImport("MCP Authorization \u8BF7\u6C42\u5934\u5FC5\u987B\u4F7F\u7528 Bearer Token")}}}if(authorizationCount!==1){throw invalidImport("MCP \u670D\u52A1\u5668\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u4E14\u53EA\u80FD\u5305\u542B\u4E00\u4E2A Authorization \u8BF7\u6C42\u5934")}return Object.fromEntries(entries)}function parseServer(serverKey,raw,options){if(!raw||typeof raw!=="object"||Array.isArray(raw)){throw invalidImport("MCP \u670D\u52A1\u5668\u914D\u7F6E\u5FC5\u987B\u662F\u5BF9\u8C61")}const server=raw;if(server.type!==void 0&&server.type!=="http"){throw invalidImport("MCP \u670D\u52A1\u5668 type \u5FC5\u987B\u662F http")}if(server.transport!==void 0&&server.transport!=="streamable_http"&&server.transport!=="streamable-http"){throw invalidImport("MCP \u670D\u52A1\u5668 transport \u5FC5\u987B\u662F streamable_http")}const connection={transport:"streamable-http",url:parseUrl(server.url,options),headers:parseEnterpriseMcpHeaders(server.headers)};return{serverKey,preferredId:serverKey,connection}}function parseEnterpriseMcpCandidates(raw){return Object.entries(parseDocument(raw)).map(([serverKey,server])=>({serverKey,raw:server}))}function validateEnterpriseMcpServer(candidate,options){return parseServer(candidate.serverKey,candidate.raw,options)}function selectByServerKey(servers,requested=[]){if(!requested.length)return[...servers];const serversByKey=new Map(servers.map(server=>[server.serverKey,server]));return requested.map(serverKey=>{const server=serversByKey.get(serverKey);if(!server){throw invalidImport(`\u627E\u4E0D\u5230 MCP \u670D\u52A1\u5668\uFF1A${serverKey}`)}return server})}function selectEnterpriseMcpCandidates(servers,requested=[]){return selectByServerKey(servers,requested)}function connectionIdForCollision(serverKey,url2){return`${serverKey}-${(0,import_node_crypto7.createHash)("sha256").update(new URL(url2).toString()).digest("hex").slice(0,8)}`}function credentialFailure(){return new CliError("MCP_FAILED","\u4F01\u4E1A MCP \u51ED\u636E\u4E0D\u53EF\u7528\u6216\u65E0\u6548",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5\u4F01\u4E1A MCP \u51ED\u636E\u5B58\u50A8\uFF0C\u5FC5\u8981\u65F6\u91CD\u65B0\u8FDE\u63A5\u3002"})}async function resolveEnterpriseMcpSpec(connection,stores){const store=credentialStoreForEnterpriseMcpConnection(connection,stores);let encodedCredential;try{encodedCredential=await store.get(connection.credentialRef)}catch{throw credentialFailure()}if(!encodedCredential){throw credentialFailure()}try{return{transport:connection.transport,url:connection.url,headers:parseEnterpriseMcpHeaders(JSON.parse(encodedCredential))}}catch{throw credentialFailure()}}var import_node_util6=require("util");function stateId(agent,connectionId){return connectionKey(agent,"user",connectionId)}function configurationConflict2(message){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:"\u8BF7\u68C0\u67E5\u8BE5 Agent \u7684\u540C\u540D MCP \u914D\u7F6E\u540E\u91CD\u8BD5\u3002"})}function hostFailure5(message){return new CliError("HOST_CONFIG_FAILED",message,{exitCode:exitCodes.hostConfigFailed,hint:"\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6B63\u8BE5 Agent \u7684\u540C\u540D MCP \u914D\u7F6E\u540E\u91CD\u8BD5\u3002"})}function ensureSupported(adapter,spec){if(!adapter.capabilities.scopes.includes("user")){throw new CliError("INVALID_ARGUMENT","\u8BE5 Agent \u4E0D\u652F\u6301\u7528\u6237\u7EA7 MCP \u914D\u7F6E",{exitCode:exitCodes.invalidArgument})}if(!adapter.capabilities.transports.includes(spec.transport)){throw new CliError("INVALID_ARGUMENT","\u8BE5 Agent \u4E0D\u652F\u6301 HTTP MCP \u8FDE\u63A5",{exitCode:exitCodes.invalidArgument})}}function determineAction(input){const{connectionId,desired,host,managed}=input;if(!managed&&!host)return"create";if(!managed&&host)return"takeover-unmanaged";if(!managed)return"create";if(managed.connectionId!==connectionId||!host||host.fingerprint!==managed.fingerprint){return"blocked-drift"}return fingerprintConnection(host.spec)===fingerprintConnection(desired)?"unchanged":"update-managed"}function success2(target,status2,message){return{stage:"agent",target,ok:true,status:status2,message}}function failed(target,cause){return{stage:"agent",target,ok:false,status:"failed",...cause instanceof CliError?{code:cause.code}:{code:"HOST_CONFIG_FAILED"},message:"\u4F01\u4E1A MCP \u5728 Agent \u4E2D\u5237\u65B0\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u540C\u540D\u914D\u7F6E\u540E\u91CD\u8BD5\u3002"}}async function restoreHost(adapter,name,backup){try{await adapter.remove(name,"user");if(backup)await adapter.add(name,"user",backup.spec)}catch{throw hostFailure5("\u4F01\u4E1A MCP \u66F4\u65B0\u5931\u8D25\u4E14\u65E0\u6CD5\u6062\u590D\u539F\u6709 Agent \u914D\u7F6E\uFF0C\u8BF7\u68C0\u67E5\u540C\u540D\u914D\u7F6E\u540E\u91CD\u8BD5\u3002")}}function managedRecord(input){return{id:stateId(input.agent,input.connectionId),connectionId:input.connectionId,fingerprint:input.fingerprint,updatedAt:input.now.toISOString()}}async function attachEnterpriseMcp(runtime2,input){const adapter=runtime2.adapters[input.agent];ensureSupported(adapter,input.spec);await adapter.detect();const id=stateId(input.agent,input.connection.id);const[host,managed]=await Promise.all([adapter.read(input.connection.id,"user"),runtime2.managed.getAgent(id)]);const action=determineAction({host,managed,desired:input.spec,connectionId:input.connection.id});if(action==="blocked-drift"){throw configurationConflict2("\u53D7\u7BA1 Agent MCP \u914D\u7F6E\u5DF2\u5728 SAG CLI \u4E4B\u5916\u88AB\u4FEE\u6539")}if(action==="unchanged"){return success2(input.agent,"skipped","Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u5DF2\u7ECF\u662F\u6700\u65B0\u72B6\u6001\u3002")}if(input.dryRun){return success2(input.agent,action==="create"?"created":"updated","\u5DF2\u751F\u6210\u4F01\u4E1A MCP \u63A5\u5165\u8BA1\u5212\uFF0C\u672A\u5199\u5165 Agent \u914D\u7F6E\u3002")}if(action==="takeover-unmanaged"&&!input.yes&&!await runtime2.confirm(`\u662F\u5426\u66FF\u6362 ${input.agent} \u4E2D\u73B0\u6709\u7684 ${input.connection.id} MCP\uFF1F`)){return success2(input.agent,"skipped","\u5DF2\u53D6\u6D88\u63A5\u7BA1 Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u3002")}try{if(host)await adapter.remove(input.connection.id,"user");await adapter.add(input.connection.id,"user",input.spec);const readBack=await adapter.read(input.connection.id,"user");if(!readBack||fingerprintConnection(readBack.spec)!==fingerprintConnection(input.spec)){throw configurationConflict2("Agent MCP \u56DE\u8BFB\u7ED3\u679C\u4E0E\u8BF7\u6C42\u7684\u8FDE\u63A5\u4E0D\u4E00\u81F4")}await runtime2.verifier.verify(readBack.spec,{timeoutMs:input.timeoutMs});await runtime2.managed.setAgent(managedRecord({agent:input.agent,connectionId:input.connection.id,fingerprint:readBack.fingerprint,now:runtime2.now()}))}catch{await restoreHost(adapter,input.connection.id,host);throw hostFailure5("\u4F01\u4E1A MCP \u66F4\u65B0\u5931\u8D25\uFF0C\u5DF2\u6062\u590D Agent \u4E2D\u539F\u6709\u7684\u914D\u7F6E\u3002")}return success2(input.agent,action==="create"?"created":"updated","\u4F01\u4E1A MCP \u5DF2\u63A5\u5165 Agent \u5E76\u901A\u8FC7\u9A8C\u8BC1\u3002")}async function inspectEnterpriseAgent(runtime2,input){const adapter=runtime2.adapters[input.agent];const id=stateId(input.agent,input.connection.id);const[host,managed]=await Promise.all([adapter.read(input.connection.id,"user"),runtime2.managed.getAgent(id)]);return{agent:input.agent,connectionId:input.connection.id,managed:Boolean(managed),connected:Boolean(host),drifted:Boolean(managed&&(managed.connectionId!==input.connection.id||!host||host.fingerprint!==managed.fingerprint||input.spec!==void 0&&fingerprintConnection(host.spec)!==fingerprintConnection(input.spec)))}}async function detachEnterpriseMcp(runtime2,input){const adapter=runtime2.adapters[input.agent];const id=stateId(input.agent,input.connection.id);const[host,managed]=await Promise.all([adapter.read(input.connection.id,"user"),runtime2.managed.getAgent(id)]);if(!managed||managed.connectionId!==input.connection.id||!host){throw configurationConflict2("\u8BE5 Agent MCP \u914D\u7F6E\u4E0D\u53D7\u5F53\u524D\u4F01\u4E1A\u8FDE\u63A5\u7BA1\u7406")}if(host.fingerprint!==managed.fingerprint){throw configurationConflict2("\u53D7\u7BA1 Agent MCP \u914D\u7F6E\u5DF2\u5728 SAG CLI \u4E4B\u5916\u88AB\u4FEE\u6539")}if(input.dryRun){return success2(input.agent,"updated","\u5DF2\u751F\u6210\u4F01\u4E1A MCP \u79FB\u9664\u8BA1\u5212\uFF0C\u672A\u4FEE\u6539 Agent \u914D\u7F6E\u3002")}if(!input.yes&&!await runtime2.confirm(`\u662F\u5426\u4ECE ${input.agent} \u79FB\u9664 ${input.connection.id}\uFF1F`)){return success2(input.agent,"skipped","\u5DF2\u53D6\u6D88\u79FB\u9664 Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u3002")}try{await adapter.remove(input.connection.id,"user");await runtime2.managed.deleteAgent(id)}catch{try{await adapter.add(input.connection.id,"user",host.spec)}catch{throw hostFailure5("\u4F01\u4E1A MCP \u79FB\u9664\u5931\u8D25\uFF0C\u4E14\u65E0\u6CD5\u6062\u590D Agent \u4E2D\u539F\u6709\u7684\u914D\u7F6E\u3002")}throw hostFailure5("\u4F01\u4E1A MCP \u79FB\u9664\u5931\u8D25\uFF0C\u5DF2\u6062\u590D Agent \u4E2D\u539F\u6709\u7684\u914D\u7F6E\u3002")}return success2(input.agent,"updated","\u5DF2\u4ECE Agent \u79FB\u9664\u4F01\u4E1A MCP \u914D\u7F6E\u3002")}function agentForState(state,connectionId){return["codex","claude-code","workbuddy"].find(agent=>state.id===stateId(agent,connectionId))??null}async function refreshManagedAgents(runtime2,input){const managed=await runtime2.managed.listAgents();const matching=managed.filter(state=>state.connectionId===input.connection.id);return Promise.all(matching.map(async state=>{const agent=agentForState(state,input.connection.id);if(!agent)return failed(state.id,configurationConflict2("\u53D7\u7BA1 Agent \u72B6\u6001\u65E0\u6548"));try{return await attachEnterpriseMcp(runtime2,{...input,agent,yes:true})}catch(cause){return failed(agent,cause)}}))}var import_node_crypto8=require("crypto");var import_promises11=require("fs/promises");var import_node_url=require("url");var import_node_path13=__toESM(require("path"),1);var skillName="sag-mcp";var skillDescription="Use connected enterprise SAG MCP servers to search, read, and manage authorized knowledge.";var requiredReferences=["references/cli-reference.md","references/tool-safety.md"];function skillTarget(agent,options){switch(agent){case"codex":return import_node_path13.default.join(options.CODEX_HOME||import_node_path13.default.join(options.home,".codex"),"skills",skillName);case"claude-code":return import_node_path13.default.join(options.home,".claude","skills",skillName);case"workbuddy":return import_node_path13.default.join(options.home,".workbuddy","skills",skillName)}}function managedSkillId(agent){return`${agent}:${skillName}`}function bundledSkillPath(){const moduleDirectory=import_node_path13.default.dirname((0,import_node_url.fileURLToPath)(__sagSkillImportMetaUrl));const packageRoot=import_node_path13.default.basename(moduleDirectory)==="dist"?import_node_path13.default.dirname(moduleDirectory):import_node_path13.default.resolve(moduleDirectory,"../../..");return import_node_path13.default.join(packageRoot,"skills",skillName)}function timestamp(now){return now.toISOString().replace(/[-:.]/gu,"")}function siblingPath(target,prefix,now){return import_node_path13.default.join(import_node_path13.default.dirname(target),`${import_node_path13.default.basename(target)}.${prefix}-${timestamp(now)}-${process.pid}`)}async function exists(target){try{await(0,import_promises11.lstat)(target);return true}catch(cause){if(cause.code==="ENOENT")return false;throw cause}}async function validateSkillBundle(bundlePath){const skill=await(0,import_promises11.readFile)(import_node_path13.default.join(bundlePath,"SKILL.md"),"utf8");const lines=skill.split(/\r?\n/u);const lineCount=skill.endsWith("\n")?lines.length-1:lines.length;if(lineCount>=100||lines[0]!=="---"||lines[1]!==`name: ${skillName}`||lines[2]!==`description: ${skillDescription}`||lines[3]!=="---"){throw new Error("\u968F\u5305\u53D1\u5E03\u7684 SAG MCP Skill frontmatter \u65E0\u6548\u3002")}for(const reference of requiredReferences){await(0,import_promises11.readFile)(import_node_path13.default.join(bundlePath,reference),"utf8");if(!skill.includes(`(${reference})`)){throw new Error(`\u968F\u5305\u53D1\u5E03\u7684 SAG MCP Skill \u672A\u5F15\u7528 ${reference}\u3002`)}}}async function updateDirectoryFingerprint(hash2,root,relative=""){const current=import_node_path13.default.join(root,relative);const entries=await(0,import_promises11.readdir)(current,{withFileTypes:true});for(const entry of entries.sort((left,right)=>left.name.localeCompare(right.name))){const entryRelative=import_node_path13.default.join(relative,entry.name);if(entry.isDirectory()){hash2.update(`directory:${entryRelative}
|
|
129
129
|
`);await updateDirectoryFingerprint(hash2,root,entryRelative);continue}if(!entry.isFile()){throw new Error("SAG MCP Skill \u5305\u542B\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u3002")}hash2.update(`file:${entryRelative}
|
|
130
130
|
`);hash2.update(await(0,import_promises11.readFile)(import_node_path13.default.join(root,entryRelative)))}}async function fingerprintSkillBundle(bundlePath){await validateSkillBundle(bundlePath);const hash2=(0,import_node_crypto8.createHash)("sha256");await updateDirectoryFingerprint(hash2,bundlePath);return`sha256:${hash2.digest("hex")}`}function success3(target,status2){return{stage:"skill",target,ok:true,status:status2,message:"\u4F01\u4E1A SAG MCP Skill \u5DF2\u5B89\u88C5\u3002"}}function failed2(target){return{stage:"skill",target,ok:false,status:"failed",code:"INTERNAL_ERROR",message:"\u4F01\u4E1A SAG MCP Skill \u5B89\u88C5\u5931\u8D25\uFF0C\u5DF2\u6062\u590D\u539F\u6709 Skill\u3002"}}function conflict5(message){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:"\u8BF7\u68C0\u67E5 SAG MCP Skill \u540E\u91CD\u8BD5\u3002"})}async function restoreTarget(input){await(0,import_promises11.rm)(input.temporaryPath,{recursive:true,force:true}).catch(()=>void 0);if(!input.targetMutated)return;if(input.hadTarget&&input.backupPath&&await exists(input.backupPath)){await(0,import_promises11.rm)(input.target,{recursive:true,force:true});await(0,import_promises11.rename)(input.backupPath,input.target);return}if(!input.hadTarget){await(0,import_promises11.rm)(input.target,{recursive:true,force:true})}}async function installEnterpriseSkill(input){const target=skillTarget(input.agent,{home:input.home,CODEX_HOME:input.environment.CODEX_HOME});const bundlePath=input.bundlePath??bundledSkillPath();const temporaryPath=siblingPath(target,"tmp",input.now());let backupPath=null;let hadTarget=false;let targetMutated=false;try{hadTarget=await exists(target);await validateSkillBundle(bundlePath);await(0,import_promises11.mkdir)(import_node_path13.default.dirname(target),{recursive:true});await(0,import_promises11.cp)(bundlePath,temporaryPath,{recursive:true,errorOnExist:true,force:false});await validateSkillBundle(temporaryPath);if(hadTarget){backupPath=siblingPath(target,"backup",input.now());await(0,import_promises11.rename)(target,backupPath);targetMutated=true}await(0,import_promises11.rename)(temporaryPath,target);targetMutated=true;const fingerprint=await fingerprintSkillBundle(target);await input.managed.setSkill({id:managedSkillId(input.agent),fingerprint,backupPath:backupPath??siblingPath(target,"backup",input.now()),updatedAt:input.now().toISOString()});return success3(input.agent,hadTarget?"updated":"created")}catch{await restoreTarget({target,hadTarget,targetMutated,backupPath,temporaryPath}).catch(()=>void 0);return failed2(input.agent)}}async function inspectEnterpriseSkill(input){const target=skillTarget(input.agent,{home:input.home,CODEX_HOME:input.environment.CODEX_HOME});const[managed,installed]=await Promise.all([input.managed.getSkill(managedSkillId(input.agent)),exists(target)]);let fingerprint=null;if(installed){fingerprint=await fingerprintSkillBundle(target).catch(()=>null)}return{agent:input.agent,target,managed:Boolean(managed),installed,drifted:Boolean(managed&&(!fingerprint||managed.fingerprint!==fingerprint))}}async function uninstallEnterpriseSkill(input){const target=skillTarget(input.agent,{home:input.home,CODEX_HOME:input.environment.CODEX_HOME});const state=await input.managed.getSkill(managedSkillId(input.agent));const installed=await exists(target);const fingerprint=installed?await fingerprintSkillBundle(target).catch(()=>null):null;if(!input.force){if(!state||!fingerprint||state.fingerprint!==fingerprint){throw conflict5("\u53D7 SAG CLI \u7BA1\u7406\u7684 SAG MCP Skill \u5DF2\u88AB\u5916\u90E8\u4FEE\u6539\u3002")}const removedPath=siblingPath(target,"remove",input.now());await(0,import_promises11.rename)(target,removedPath);try{await input.managed.deleteSkill(state.id)}catch(cause){await(0,import_promises11.rename)(removedPath,target);throw cause}await(0,import_promises11.rm)(removedPath,{recursive:true,force:true}).catch(()=>void 0);return{stage:"skill",target:input.agent,ok:true,status:"updated",message:"\u4F01\u4E1A SAG MCP Skill \u5DF2\u79FB\u9664\u3002"}}if(!installed){throw conflict5("\u6CA1\u6709\u53EF\u79FB\u9664\u7684 SAG MCP Skill\u3002")}const backupPath=siblingPath(target,"backup",input.now());await(0,import_promises11.rename)(target,backupPath);try{await input.managed.deleteSkill(managedSkillId(input.agent))}catch(cause){await(0,import_promises11.rename)(backupPath,target).catch(()=>void 0);throw cause}return{stage:"skill",target:input.agent,ok:true,status:"updated",message:"\u4F01\u4E1A SAG MCP Skill \u5DF2\u5907\u4EFD\u540E\u5F3A\u5236\u79FB\u9664\u3002"}}var supportedAgents=["codex","claude-code","workbuddy"];async function resolveEnterpriseMcpConnection(input){if(input.server!==void 0){const id=input.server.trim();if(!id){throw new CliError("INVALID_ARGUMENT","\u4F01\u4E1A MCP \u8FDE\u63A5\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A",{exitCode:exitCodes.invalidArgument})}const connection2=await input.store.get(id);if(connection2){return connection2}throw new CliError("RESOURCE_NOT_FOUND",`\u627E\u4E0D\u5230\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1A${id}`,{exitCode:exitCodes.resourceNotFound})}const connection=await input.store.active();if(connection){return connection}throw new CliError("RESOURCE_NOT_FOUND","\u5F53\u524D\u6CA1\u6709\u6B63\u5728\u4F7F\u7528\u7684\u4F01\u4E1A MCP \u8FDE\u63A5",{exitCode:exitCodes.resourceNotFound,hint:"\u8BF7\u5148\u9009\u62E9\u6216\u5BFC\u5165\u4E00\u4E2A\u4F01\u4E1A MCP \u8FDE\u63A5\u3002"})}async function restoreCredential(credentials,reference,previous){if(previous===null){await credentials.delete(reference);return}await credentials.set(reference,previous)}function assertCredentialRef(connection){if(connection.credentialRef!==`enterprise-mcp/${connection.id}`){throw new CliError("INVALID_ARGUMENT","\u4F01\u4E1A MCP \u51ED\u636E\u5F15\u7528\u65E0\u6548",{exitCode:exitCodes.invalidArgument})}}async function restoreAndVerifyPersistence(input){const{credentials,failure:failure2,previousCredential,previousState,reference,restoreConnection,store}=input;const recoveryFailures=[];const operations=await Promise.allSettled([...restoreConnection?[store.restore({previous:previousState})]:[],restoreCredential(credentials,reference,previousCredential)]);if(restoreConnection&&operations[0]?.status==="rejected"){recoveryFailures.push(operations[0].reason)}const credentialRestore=operations.at(-1);if(credentialRestore?.status==="rejected"){recoveryFailures.push(credentialRestore.reason)}const[stateReadback,credentialReadback]=await Promise.allSettled([store.load(),credentials.get(reference)]);if(stateReadback.status==="rejected"||!(0,import_node_util6.isDeepStrictEqual)(stateReadback.value,previousState)){recoveryFailures.push(new Error("\u65E0\u6CD5\u9A8C\u8BC1\u4F01\u4E1A MCP \u8FDE\u63A5\u662F\u5426\u5DF2\u56DE\u6EDA"))}if(credentialReadback.status==="rejected"||credentialReadback.value!==previousCredential){recoveryFailures.push(new Error("\u65E0\u6CD5\u9A8C\u8BC1\u4F01\u4E1A MCP \u51ED\u636E\u662F\u5426\u5DF2\u56DE\u6EDA"))}if(recoveryFailures.length){throw new AggregateError([failure2,...recoveryFailures],"\u4F01\u4E1A MCP \u6301\u4E45\u5316\u6062\u590D\u8FC7\u7A0B\u4E2D\u51FA\u73B0\u5176\u4ED6\u5931\u8D25",{cause:failure2})}}async function recover(input){await restoreAndVerifyPersistence(input);throw input.failure}async function persistVerifiedConnection(input){const{connection,credentials,encodedCredential,store}=input;assertCredentialRef(connection);await store.withPersistenceLock(async()=>{const previousState=await store.load();const previousCredential=await credentials.get(connection.credentialRef);try{await credentials.set(connection.credentialRef,encodedCredential)}catch(failure2){return recover({credentials,store,reference:connection.credentialRef,previousCredential,previousState,failure:failure2,restoreConnection:false})}try{await store.upsert(connection);const[persistedConnection,persistedCredential]=await Promise.all([store.get(connection.id),credentials.get(connection.credentialRef)]);if(!(0,import_node_util6.isDeepStrictEqual)(persistedConnection,connection)){throw new Error("\u4F01\u4E1A MCP \u8FDE\u63A5\u672A\u80FD\u6301\u4E45\u5316")}if(persistedCredential!==encodedCredential){throw new Error("\u4F01\u4E1A MCP \u51ED\u636E\u672A\u80FD\u6301\u4E45\u5316")}}catch(failure2){return recover({credentials,store,reference:connection.credentialRef,previousCredential,previousState,failure:failure2,restoreConnection:true})}})}function stageSuccess(stage,target,status2,message){return{stage,target,ok:true,status:status2,message}}function stageFailure(stage,target,cause,message){const code=cause instanceof CliError?cause.code:stage==="verify"||stage==="reverify"?"MCP_FAILED":stage==="agent"?"HOST_CONFIG_FAILED":"INTERNAL_ERROR";return{stage,target,ok:false,status:"failed",code,message}}function unique(values){return[...new Set(values)]}async function selectServers(input,servers){if(input.requestedServers.length){return unique(selectEnterpriseMcpCandidates(servers,unique(input.requestedServers)).map(server=>server.serverKey)).map(serverKey=>servers.find(server=>server.serverKey===serverKey))}if(!input.interactive){throw new CliError("INVALID_ARGUMENT","\u8BF7\u81F3\u5C11\u4F7F\u7528\u4E00\u6B21 --server \u660E\u786E\u9009\u62E9 MCP Server",{exitCode:exitCodes.invalidArgument,hint:"\u53EF\u91CD\u590D\u4F7F\u7528 --server \u9009\u62E9\u591A\u4E2A Server\uFF1B--yes \u4E0D\u4F1A\u81EA\u52A8\u9009\u62E9\u76EE\u6807\u3002"})}const requested=await input.selectMcpServers(servers.map(server=>({serverKey:server.serverKey})));if(!requested.length)return[];return selectEnterpriseMcpCandidates(servers,unique(requested))}async function selectInstalledAgents(input){if(input.requestedAgents.length)return unique(input.requestedAgents);if(!input.interactive)return[];const detected=await Promise.all(supportedAgents.map(async agent=>{try{await input.runtime.agents.adapters[agent].detect();return agent}catch{return null}}));const installed=detected.filter(agent=>agent!==null);return unique(await input.selectAgents(installed))}async function verifyServer(runtime2,server,timeoutMs){const report=await runtime2.verifier.verify(server.connection,{timeoutMs});if(report.transport!=="streamable-http"){throw new CliError("MCP_FAILED","\u4F01\u4E1A MCP \u8FD4\u56DE\u4E86\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B",{exitCode:exitCodes.mcpFailed})}const tools=[...report.tools];return{parsed:server,tools,risk:classifyTools(tools),observedAt:runtime2.now().toISOString()}}async function connectionIdentity(input){const preferred=await input.connect.runtime.store.get(input.server.preferredId);if(!preferred||preferred.url===input.server.connection.url){return{id:input.server.preferredId,previous:preferred}}let action=input.connect.collisionAction;if(!action){if(!input.connect.interactive){throw new CliError("CONFIG_CONFLICT",`MCP Server ${input.server.serverKey} \u5DF2\u4FDD\u5B58\u4E3A\u5176\u4ED6 URL`,{exitCode:exitCodes.configConflict,hint:"\u81EA\u52A8\u5316\u8BF7\u660E\u786E\u4F7F\u7528 --replace \u6216 --keep-both\u3002"})}action=await input.connect.selectCollisionAction({serverKey:input.server.serverKey,existingUrl:preferred.url,incomingUrl:input.server.connection.url})}if(action==="replace"){return{id:input.server.preferredId,previous:preferred}}const id=connectionIdForCollision(input.server.serverKey,input.server.connection.url);return{id,previous:await input.connect.runtime.store.get(id)}}function buildConnection(input){const{id,previous,verified}=input;return{id,serverKey:verified.parsed.serverKey,preferredId:verified.parsed.preferredId,transport:"streamable-http",url:verified.parsed.connection.url,headerNames:Object.keys(verified.parsed.connection.headers).sort((left,right)=>left.localeCompare(right)),credentialStore:input.credentialStore,credentialRef:`enterprise-mcp/${id}`,toolSnapshot:{count:verified.tools.length,fingerprint:fingerprintValue(verified.tools),risk:verified.risk,observedAt:verified.observedAt},createdAt:previous?.createdAt??input.now,updatedAt:input.now,lastVerifiedAt:input.now}}function translatedAgentStage(result){return{...result,message:result.ok?result.status==="skipped"?"Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u5DF2\u7ECF\u662F\u6700\u65B0\u72B6\u6001\u3002":"Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u5DF2\u5B8C\u6210\u5E76\u901A\u8FC7\u9A8C\u8BC1\u3002":"Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u672A\u80FD\u66F4\u65B0\uFF0C\u8BF7\u68C0\u67E5\u8BE5 Agent \u540E\u91CD\u8BD5\u3002"}}async function reverifyAgent(input,agent,connectionId,spec){const target=`${agent}:${connectionId}`;try{await input.runtime.verifier.verify(spec,{timeoutMs:input.timeoutMs});return stageSuccess("reverify",target,"updated",input.dryRun?"\u5DF2\u5B8C\u6210\u53EA\u8BFB\u7684\u6700\u7EC8\u9A8C\u8BC1\u8BA1\u5212\u3002":"Agent \u63A5\u5165\u540E\u7684 MCP \u5DF2\u518D\u6B21\u9A8C\u8BC1\u3002")}catch(cause){return stageFailure("reverify",target,cause,"Agent \u63A5\u5165\u540E\u7684 MCP \u6700\u7EC8\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u8BE5 Agent \u540E\u91CD\u8BD5\u3002")}}async function attachSelectedAgent(input){let confirmed=true;const runtime2={...input.connect.runtime.agents,confirm:async()=>{confirmed=await input.connect.runtime.agents.confirm(`Agent ${input.agent} \u4E2D\u5DF2\u6709\u540C\u540D MCP\uFF0C\u662F\u5426\u7531 sag-cli \u63A5\u7BA1\u5E76\u66FF\u6362\uFF1F`);return confirmed}};try{const result=await attachEnterpriseMcp(runtime2,{connection:input.connection,spec:input.spec,agent:input.agent,yes:input.connect.yes,timeoutMs:input.connect.timeoutMs,dryRun:input.connect.dryRun});return{stage:translatedAgentStage(result),connected:confirmed}}catch(cause){return{stage:stageFailure("agent",input.agent,cause,"Agent \u4E2D\u7684\u4F01\u4E1A MCP \u914D\u7F6E\u5931\u8D25\uFF1B\u5DF2\u4FDD\u5B58\u7684\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\u3002"),connected:false}}}function skippedAgentStage(agent){return stageSuccess("agent",agent,"skipped","MCP \u672A\u8FD4\u56DE\u53EF\u7528\u5DE5\u5177\uFF0C\u5DF2\u8DF3\u8FC7\u65B0\u7684 Agent \u914D\u7F6E\u3002")}function skippedSkillStage(agent){return stageSuccess("skill",agent,"skipped","MCP \u672A\u8FD4\u56DE\u53EF\u7528\u5DE5\u5177\uFF0C\u5DF2\u8DF3\u8FC7 Skill \u5B89\u88C5\u3002")}async function installSkillForAgent(input,agent){if(input.noSkill){return stageSuccess("skill",agent,"skipped","\u5DF2\u6309 --no-skill \u8DF3\u8FC7 Skill \u5B89\u88C5\u3002")}if(input.dryRun){return stageSuccess("skill",agent,"created","\u5DF2\u751F\u6210 Skill \u5B89\u88C5\u8BA1\u5212\uFF0C\u672A\u5199\u5165\u6587\u4EF6\u6216\u5907\u4EFD\u3002")}const result=await installEnterpriseSkill({...input.runtime.skill,agent});return{...result,message:result.ok?"\u4F01\u4E1A SAG MCP Skill \u5DF2\u5B89\u88C5\u3002":"Skill \u5B89\u88C5\u5931\u8D25\uFF1B\u8FDE\u63A5\u548C Agent MCP \u914D\u7F6E\u4FDD\u6301\u4E0D\u53D8\u3002"}}async function connectEnterpriseMcp(input){const candidates=parseEnterpriseMcpCandidates(input.raw);const selected=await selectServers(input,candidates);const stages=[];const verified=[];for(const candidate of selected){let server;try{server=validateEnterpriseMcpServer(candidate,{allowInsecureHttp:input.allowInsecureHttp});stages.push(stageSuccess("parse",candidate.serverKey,"created","MCP Server \u8F93\u5165\u6821\u9A8C\u901A\u8FC7\u3002"))}catch(cause){stages.push(stageFailure("parse",candidate.serverKey,cause,"MCP Server \u8F93\u5165\u6821\u9A8C\u5931\u8D25\uFF0C\u5176\u4ED6\u5DF2\u9009 Server \u5C06\u7EE7\u7EED\u5904\u7406\u3002"));continue}try{const result=await verifyServer(input.runtime,server,input.timeoutMs);verified.push(result);stages.push(stageSuccess("verify",server.serverKey,"updated","MCP \u521D\u59CB\u5316\u548C\u5DE5\u5177\u5217\u8868\u9A8C\u8BC1\u901A\u8FC7\u3002"))}catch(cause){stages.push(stageFailure("verify",server.serverKey,cause,"MCP \u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u8BE5 Server \u7684\u5730\u5740\u548C\u51ED\u636E\u3002"))}}const agents2=verified.length?await selectInstalledAgents(input):[];const initialActive=await input.runtime.store.active();const connections=[];const skillEligibleAgents=new Set;const zeroToolSkillAgents=new Set;const reverifications=[];let plannedActiveId;for(const item of verified){let connection;let previous;try{const identity=await connectionIdentity({connect:input,server:item.parsed});previous=identity.previous;if(previous&&previous.credentialStore!==input.credentialStore){throw new CliError("CONFIG_CONFLICT","\u4E0D\u80FD\u76F4\u63A5\u5207\u6362\u4F01\u4E1A MCP \u7684\u51ED\u636E\u5B58\u50A8\uFF1B\u8BF7\u5148\u65AD\u5F00\u8FDE\u63A5\uFF0C\u518D\u4F7F\u7528\u6240\u9700\u5B58\u50A8\u91CD\u65B0\u8FDE\u63A5\u3002",{exitCode:exitCodes.configConflict,hint:"\u5148\u8FD0\u884C sag mcp disconnect\uFF0C\u518D\u91CD\u65B0\u8FD0\u884C sag mcp connect\u3002"})}connection=buildConnection({verified:item,id:identity.id,previous,credentialStore:input.credentialStore,now:input.runtime.now().toISOString()});if(!input.dryRun){await persistVerifiedConnection({store:input.runtime.store,credentials:input.runtime.credentials[input.credentialStore],connection,encodedCredential:JSON.stringify(item.parsed.connection.headers)});await input.runtime.store.use(connection.id)}plannedActiveId=connection.id;connections.push({serverKey:item.parsed.serverKey,id:connection.id,url:connection.url,toolCount:item.tools.length,risk:item.risk,persisted:!input.dryRun});stages.push(stageSuccess("persist",connection.id,previous?"updated":"created",input.dryRun?"\u5DF2\u751F\u6210\u8FDE\u63A5\u548C\u51ED\u636E\u4FDD\u5B58\u8BA1\u5212\uFF0C\u672A\u5199\u5165\u672C\u673A\u72B6\u6001\u3002":"\u8FDE\u63A5\u5143\u6570\u636E\u548C\u51ED\u636E\u5DF2\u4FDD\u5B58\u3002"))}catch(cause){stages.push(stageFailure("persist",item.parsed.serverKey,cause,cause instanceof CliError&&cause.code==="CONFIG_CONFLICT"?cause.message:"\u8FDE\u63A5\u672A\u80FD\u4FDD\u5B58\uFF1B\u5176\u4ED6 Server \u4E0D\u53D7\u5F71\u54CD\u3002"));continue}const successfulAgents=new Set;const refreshedAgents=new Set;if(previous){try{const refreshed=await refreshManagedAgents(input.runtime.agents,{connection,spec:item.parsed.connection,timeoutMs:input.timeoutMs,dryRun:input.dryRun});for(const result of refreshed){const translated=translatedAgentStage(result);stages.push(translated);if(supportedAgents.includes(result.target)){const agent=result.target;refreshedAgents.add(agent);if(result.ok)successfulAgents.add(agent)}}}catch(cause){stages.push(stageFailure("agent",connection.id,cause,"\u65E0\u6CD5\u8BFB\u53D6\u53D7\u7BA1 Agent \u72B6\u6001\uFF1B\u5DF2\u4FDD\u5B58\u7684\u8FDE\u63A5\u4FDD\u6301\u6709\u6548\uFF0C\u5176\u4ED6 Server \u5C06\u7EE7\u7EED\u5904\u7406\u3002"))}}if(item.tools.length===0){for(const agent of successfulAgents){reverifications.push({agent,connectionId:connection.id,spec:item.parsed.connection})}for(const agent of agents2){stages.push(skippedAgentStage(agent));zeroToolSkillAgents.add(agent)}continue}let riskAccepted=input.yes||input.dryRun||!item.risk.hasWarning;if(!riskAccepted&&agents2.length){riskAccepted=await input.runtime.agents.confirm(`MCP ${connection.id} \u542B\u6709\u5199\u5165\u3001\u5220\u9664\u6216\u98CE\u9669\u672A\u77E5\u7684\u5DE5\u5177\uFF0C\u662F\u5426\u7EE7\u7EED\u63A5\u5165\u6240\u9009 Agent\uFF1F`)}for(const agent of agents2){if(!riskAccepted){stages.push(stageSuccess("agent",agent,"skipped","\u7528\u6237\u53D6\u6D88\u4E86\u98CE\u9669\u786E\u8BA4\uFF0C\u672A\u4FEE\u6539 Agent \u914D\u7F6E\u3002"));continue}if(refreshedAgents.has(agent))continue;const attached=await attachSelectedAgent({connect:input,connection,spec:item.parsed.connection,agent});stages.push(attached.stage);if(attached.stage.ok&&attached.connected)successfulAgents.add(agent)}for(const agent of successfulAgents){if(agents2.includes(agent))skillEligibleAgents.add(agent);reverifications.push({agent,connectionId:connection.id,spec:item.parsed.connection})}}for(const agent of agents2){if(skillEligibleAgents.has(agent)){stages.push(await installSkillForAgent(input,agent))}else if(zeroToolSkillAgents.has(agent)){stages.push(skippedSkillStage(agent))}}for(const reverify of reverifications){stages.push(await reverifyAgent(input,reverify.agent,reverify.connectionId,reverify.spec))}const active=input.dryRun?initialActive:await input.runtime.store.active();return{kind:"enterprise-mcp-stages",dryRun:input.dryRun,activeId:active?.id??null,...plannedActiveId===void 0?{}:{plannedActiveId},connections,stages}}function publicConnection(connection){return{id:connection.id,endpoint:connection.url}}function cancelledStage(stage,target){return stageSuccess(stage,target,"skipped","\u7528\u6237\u53D6\u6D88\u4E86\u64CD\u4F5C\uFF0C\u672A\u4FEE\u6539\u672C\u673A\u72B6\u6001\u3002")}async function mutationConfirmed(input,message){return input.dryRun||input.yes||input.confirm(message)}function lifecycleAgentStage(target,cause,message){return stageFailure("agent",target,cause,message)}function skillConflict(message){return new CliError("CONFIG_CONFLICT",message,{exitCode:exitCodes.configConflict,hint:"\u8BF7\u5148\u68C0\u67E5\u8BE5 Agent \u7684 sag-mcp Skill\uFF0C\u518D\u91CD\u8BD5\u3002"})}async function attachEnterpriseMcpConnection(input){const connection=await resolveEnterpriseMcpConnection({store:input.runtime.store,...input.server===void 0?{}:{server:input.server}});if(connection.toolSnapshot.count===0){throw new CliError("MCP_FAILED","\u8BE5\u4F01\u4E1A MCP \u6CA1\u6709\u53EF\u7528\u5DE5\u5177\uFF0C\u4E0D\u80FD\u63A5\u5165 Agent\u3002",{exitCode:exitCodes.mcpFailed,hint:"\u8BF7\u68C0\u67E5\u5E73\u53F0\u6743\u9650\u6216\u670D\u52A1\u72B6\u6001\uFF0C\u786E\u8BA4 tools/list \u8FD4\u56DE\u5DE5\u5177\u540E\u518D\u91CD\u8BD5\u3002"})}const spec=await resolveEnterpriseMcpSpec(connection,input.runtime.credentials);if(!await mutationConfirmed(input,`\u5C06\u4F01\u4E1A MCP ${connection.id} \u63A5\u5165 ${input.agent}\uFF1F`)){return{kind:"enterprise-mcp-stages",dryRun:false,connection:publicConnection(connection),stages:[cancelledStage("agent",input.agent)],nextActions:[]}}const stage=await attachEnterpriseMcp(input.runtime.agents,{connection,spec,agent:input.agent,yes:true,timeoutMs:input.timeoutMs,dryRun:input.dryRun});const skillStage=input.noSkill?stageSuccess("skill",input.agent,"skipped","\u5DF2\u6309 --no-skill \u8DF3\u8FC7 Skill \u5B89\u88C5\u3002"):input.dryRun?stageSuccess("skill",input.agent,"created","\u5DF2\u751F\u6210 Skill \u5B89\u88C5\u8BA1\u5212\uFF0C\u672A\u5199\u5165\u6587\u4EF6\u6216\u5907\u4EFD\u3002"):await installEnterpriseSkill({...input.runtime.skill,agent:input.agent});return{kind:"enterprise-mcp-stages",dryRun:input.dryRun,connection:publicConnection(connection),stages:[translatedAgentStage(stage),skillStage],nextActions:[...skillStage.ok?[]:[`sag mcp skill install --agent ${input.agent}`],`sag mcp status --server ${connection.id}`]}}async function detachEnterpriseMcpConnection(input){const connection=await resolveEnterpriseMcpConnection({store:input.runtime.store,...input.server===void 0?{}:{server:input.server}});if(!await mutationConfirmed(input,`\u4ECE ${input.agent} \u79FB\u9664\u4F01\u4E1A MCP ${connection.id}\uFF1F`)){return{kind:"enterprise-mcp-stages",dryRun:false,connection:publicConnection(connection),stages:[cancelledStage("agent",input.agent)],nextActions:[]}}const stage=await detachEnterpriseMcp(input.runtime.agents,{connection,agent:input.agent,yes:true,dryRun:input.dryRun});return{kind:"enterprise-mcp-stages",dryRun:input.dryRun,connection:publicConnection(connection),stages:[{...stage,message:input.dryRun?"\u5DF2\u68C0\u67E5\u53D7\u7BA1 Agent \u914D\u7F6E\uFF0C\u5C06\u53EA\u79FB\u9664\u6307\u7EB9\u5339\u914D\u7684 MCP \u9879\u3002":"\u5DF2\u4ECE Agent \u79FB\u9664\u53D7\u7BA1\u4F01\u4E1A MCP \u914D\u7F6E\u3002"}],nextActions:[`sag mcp status --server ${connection.id}`]}}async function disconnectEnterpriseMcp(input){const connection=await resolveEnterpriseMcpConnection({store:input.runtime.store,...input.server===void 0?{}:{server:input.server}});if(!await mutationConfirmed(input,`\u65AD\u5F00\u5E76\u5220\u9664\u4F01\u4E1A MCP ${connection.id}\uFF1F`)){return{kind:"enterprise-mcp-stages",dryRun:false,connection:publicConnection(connection),stages:[cancelledStage("persist",connection.id)],nextActions:[]}}const stages=[];for(const agent of supportedAgents){const managed=await input.runtime.agents.managed.getAgent(connectionKey(agent,"user",connection.id));if(!managed)continue;try{await inspectEnterpriseAgent(input.runtime.agents,{connection,agent})}catch(cause){stages.push(lifecycleAgentStage(agent,cause,"\u65E0\u6CD5\u68C0\u67E5 Agent \u4E2D\u7684\u53D7\u7BA1 MCP\uFF1B\u8FDE\u63A5\u548C\u51ED\u636E\u4FDD\u6301\u4E0D\u53D8\u3002"));continue}try{const detached=await detachEnterpriseMcp(input.runtime.agents,{connection,agent,yes:true,dryRun:input.dryRun});stages.push({...detached,message:input.dryRun?"\u5DF2\u68C0\u67E5\u53D7\u7BA1 Agent \u914D\u7F6E\uFF0C\u5C06\u79FB\u9664\u6307\u7EB9\u5339\u914D\u7684 MCP \u9879\u3002":"\u5DF2\u4ECE Agent \u79FB\u9664\u53D7\u7BA1\u4F01\u4E1A MCP \u914D\u7F6E\u3002"})}catch(cause){stages.push(lifecycleAgentStage(agent,cause,"Agent MCP \u79FB\u9664\u5931\u8D25\uFF1B\u8FDE\u63A5\u548C\u51ED\u636E\u4FDD\u6301\u4E0D\u53D8\u3002"))}}if(stages.some(stage=>!stage.ok)){return{kind:"enterprise-mcp-stages",dryRun:input.dryRun,connection:publicConnection(connection),stages,nextActions:[`sag mcp status --server ${connection.id}`]}}if(input.dryRun){stages.push(stageSuccess("persist",connection.id,"updated","\u5C06\u5148\u5220\u9664\u51ED\u636E\uFF0C\u518D\u5220\u9664\u8FDE\u63A5\u8BB0\u5F55\uFF1B\u4E0D\u4F1A\u5378\u8F7D\u5171\u4EAB Skill\u3002"));return{kind:"enterprise-mcp-stages",dryRun:true,connection:publicConnection(connection),stages,nextActions:["sag mcp list"]}}const credentialStore=input.runtime.credentials[connection.credentialStore];const previousState=await input.runtime.store.load();const previousCredential=await credentialStore.get(connection.credentialRef);const remaining=(await input.runtime.store.list()).filter(candidate=>candidate.id!==connection.id).sort((left,right)=>{const byUpdated=right.updatedAt.localeCompare(left.updatedAt);return byUpdated||left.id.localeCompare(right.id)});try{await credentialStore.delete(connection.credentialRef);await input.runtime.store.remove(connection.id);const next=remaining[0];if(next)await input.runtime.store.use(next.id);stages.push(stageSuccess("persist",connection.id,"updated","\u51ED\u636E\u548C\u8FDE\u63A5\u8BB0\u5F55\u5DF2\u5220\u9664\uFF1B\u5171\u4EAB Skill \u4FDD\u6301\u5B89\u88C5\u3002"))}catch(cause){try{await restoreAndVerifyPersistence({credentials:credentialStore,store:input.runtime.store,reference:connection.credentialRef,previousCredential,previousState,failure:cause,restoreConnection:true})}catch(recoveryFailure){throw new CliError("INTERNAL_ERROR","\u4F01\u4E1A MCP \u5220\u9664\u5931\u8D25\uFF0C\u4E14\u8FDE\u63A5\u3001\u51ED\u636E\u6216\u5F53\u524D\u9009\u62E9\u7684\u6062\u590D\u65E0\u6CD5\u786E\u8BA4\u3002",{exitCode:exitCodes.internalError,cause:recoveryFailure,hint:"\u8BF7\u8FD0\u884C `sag mcp list` \u68C0\u67E5\u5F53\u524D\u72B6\u6001\uFF0C\u5E76\u624B\u52A8\u6838\u5BF9\u51ED\u636E\u5B58\u50A8\u3002"})}stages.push(stageFailure("persist",connection.id,cause,"\u8FDE\u63A5\u5220\u9664\u5931\u8D25\uFF1B\u8FDE\u63A5\u3001\u51ED\u636E\u548C\u5F53\u524D\u9009\u62E9\u5DF2\u6062\u590D\u5E76\u9A8C\u8BC1\u3002"))}return{kind:"enterprise-mcp-stages",dryRun:false,connection:publicConnection(connection),stages,nextActions:stages.every(stage=>stage.ok)?["sag mcp list"]:[`sag mcp status --server ${connection.id}`]}}function mcpState(input){if(input.drifted)return"drifted";return input.connected&&input.managed?"connected":"disconnected"}function skillState(input){if(input.drifted)return"drifted";if(!input.installed)return"missing";return input.managed?"valid":"unmanaged"}async function inspectEnterpriseMcpStatus(input){const connection=await resolveEnterpriseMcpConnection({store:input.runtime.store,...input.server===void 0?{}:{server:input.server}});const active=await input.runtime.store.active();let health;let toolCount=connection.toolSnapshot.count;let risk=connection.toolSnapshot.risk;let resolvedSpec;try{resolvedSpec=await resolveEnterpriseMcpSpec(connection,input.runtime.credentials);const verified=await input.runtime.verifier.verify(resolvedSpec,{timeoutMs:input.timeoutMs});if(verified.transport!=="streamable-http"){throw new Error("unexpected enterprise MCP transport")}const verifiedTools=[...verified.tools];toolCount=verifiedTools.length;risk=classifyTools(verifiedTools);health="ready"}catch{health="unavailable"}const agents2=await Promise.all(supportedAgents.map(async agent=>{const[mcpInspection,skillInspection]=await Promise.allSettled([inspectEnterpriseAgent(input.runtime.agents,{connection,agent,...resolvedSpec===void 0?{}:{spec:resolvedSpec}}),inspectEnterpriseSkill({...input.runtime.skill,agent})]);const mcp=mcpInspection.status==="fulfilled"?mcpState(mcpInspection.value):"unavailable";const skill=skillInspection.status==="fulfilled"?skillState(skillInspection.value):"unavailable";const nextActions2=[];if(mcp==="disconnected"){nextActions2.push(`sag mcp attach ${agent} --server ${connection.id}`)}else if(mcp==="drifted"){nextActions2.push(`\u68C0\u67E5 ${agent} \u4E2D\u540D\u4E3A ${connection.id} \u7684 MCP \u914D\u7F6E`)}else if(mcp==="unavailable"){nextActions2.push(`\u68C0\u67E5 ${agent} \u7684 MCP \u914D\u7F6E\u662F\u5426\u53EF\u8BFB`)}if(skill!=="valid"&&skill!=="unavailable"){nextActions2.push(`sag mcp skill install --agent ${agent}`)}else if(skill==="unavailable"){nextActions2.push(`\u68C0\u67E5 ${agent} \u7684 Skill \u76EE\u5F55\u662F\u5426\u53EF\u8BFB`)}return{agent,mcp,skill,nextActions:nextActions2}}));const nextActions=agents2.flatMap(agent=>agent.nextActions);if(health!=="ready"){nextActions.unshift(`\u68C0\u67E5\u4F01\u4E1A MCP ${connection.id} \u7684\u7F51\u7EDC\u548C\u51ED\u636E`)}return{kind:"enterprise-mcp-status",connection:{id:connection.id,active:active?.id===connection.id,endpoint:connection.url},health,toolCount,risk,agents:agents2,nextActions}}async function installEnterpriseMcpSkill(input){const inspection=await inspectEnterpriseSkill({...input.runtime.skill,agent:input.agent});if(!await mutationConfirmed(input,`\u4E3A ${input.agent} \u5B89\u88C5\u4F01\u4E1A SAG MCP Skill\uFF1F`)){return{kind:"enterprise-mcp-stages",dryRun:false,stages:[cancelledStage("skill",input.agent)],nextActions:[]}}const stage=input.dryRun?stageSuccess("skill",input.agent,inspection.installed?"updated":"created","\u5DF2\u68C0\u67E5\u73B0\u6709 Skill\uFF0C\u5C06\u5B89\u88C5\u5E76\u4FDD\u7559\u88AB\u66FF\u6362\u7248\u672C\u7684\u5907\u4EFD\u3002"):await installEnterpriseSkill({...input.runtime.skill,agent:input.agent});return{kind:"enterprise-mcp-stages",dryRun:input.dryRun,stages:[stage],nextActions:[`sag mcp skill status --agent ${input.agent}`]}}async function inspectEnterpriseMcpSkillStatus(input){return Promise.all(input.agents.map(async agent=>{try{const inspection=await inspectEnterpriseSkill({...input.runtime.skill,agent});const status2=skillState(inspection);return{agent,status:status2,nextAction:status2==="valid"?`sag mcp status`:`sag mcp skill install --agent ${agent}`}}catch{return{agent,status:"unavailable",nextAction:`\u68C0\u67E5 ${agent} \u7684 Skill \u76EE\u5F55\u662F\u5426\u53EF\u8BFB`}}}))}async function uninstallEnterpriseMcpSkill(input){const inspection=await inspectEnterpriseSkill({...input.runtime.skill,agent:input.agent});if(!input.force&&(!inspection.installed||!inspection.managed||inspection.drifted)){throw skillConflict("\u53D7\u7BA1 SAG MCP Skill \u5DF2\u88AB\u4FEE\u6539\u6216\u4E0D\u5B8C\u6574\uFF0C\u666E\u901A\u5378\u8F7D\u5DF2\u505C\u6B62\u3002")}if(input.force&&!inspection.installed){throw skillConflict("\u627E\u4E0D\u5230\u53EF\u5378\u8F7D\u7684 SAG MCP Skill\u3002")}if(!await mutationConfirmed(input,`\u4ECE ${input.agent} \u5378\u8F7D\u4F01\u4E1A SAG MCP Skill\uFF1F`)){return{kind:"enterprise-mcp-stages",dryRun:false,stages:[cancelledStage("skill",input.agent)],nextActions:[]}}const stage=input.dryRun?stageSuccess("skill",input.agent,"updated",input.force?"\u5DF2\u68C0\u67E5 Skill\uFF1B\u5F3A\u5236\u5378\u8F7D\u524D\u4F1A\u5148\u521B\u5EFA\u5907\u4EFD\u3002":"\u5DF2\u6838\u5BF9\u53D7\u7BA1 Skill \u6307\u7EB9\uFF0C\u5C06\u5B89\u5168\u5378\u8F7D\u3002"):await uninstallEnterpriseSkill({...input.runtime.skill,agent:input.agent,force:input.force});return{kind:"enterprise-mcp-stages",dryRun:input.dryRun,stages:[stage],nextActions:[`sag mcp skill status --agent ${input.agent}`]}}var httpClient={async listTools(spec,options){const listed=await listHttpMcpTools(spec,options);return{tools:listed.tools.map(toMcpToolSummary)}},callTool:callHttpMcpTool};function connectionSummary(connection,active){return{id:connection.id,endpoint:connection.url,toolCount:connection.toolSnapshot.count,risk:connection.toolSnapshot.risk,updatedAt:connection.updatedAt,...active===void 0?{}:{active}}}async function connectEnterpriseMcpCommand(input){return connectEnterpriseMcp(input)}async function resolveConnectionRuntime(runtime2,input){const connection=await resolveEnterpriseMcpConnection({store:runtime2.store,...input.server===void 0?{}:{server:input.server}});return{connection,spec:await resolveEnterpriseMcpSpec(connection,runtime2.credentials)}}function clientFor(runtime2){return runtime2.client??httpClient}function commandOptions(runtime2){return{cliVersion:runtime2.cliVersion,timeoutMs:runtime2.timeoutMs}}async function listConnections(runtime2){const[state,connections]=await Promise.all([runtime2.store.load(),runtime2.store.list()]);return{activeId:state.activeId??null,connections:connections.map(connection=>connectionSummary(connection,state.activeId===connection.id))}}async function useConnection(runtime2,input){const connection=await resolveEnterpriseMcpConnection({store:runtime2.store,server:input.server});if(!input.dryRun)await runtime2.store.use(connection.id);const active=await runtime2.store.active();return{connection:connectionSummary(connection,active?.id===connection.id),dryRun:input.dryRun,plannedActiveId:connection.id}}async function listConnectionTools(runtime2,input){const{connection,spec}=await resolveConnectionRuntime(runtime2,input);const tools=[...(await clientFor(runtime2).listTools(spec,commandOptions(runtime2))).tools];return{connection:connectionSummary(connection),tools,toolCount:tools.length,risk:classifyTools(tools)}}async function callConnectionTool(runtime2,input){const{connection,spec}=await resolveConnectionRuntime(runtime2,input);const tools=await clientFor(runtime2).listTools(spec,commandOptions(runtime2));const tool=tools.tools.find(candidate=>candidate.name===input.tool);if(!tool){throw new CliError("RESOURCE_NOT_FOUND",`\u627E\u4E0D\u5230 MCP \u5DE5\u5177\uFF1A${input.tool}`,{exitCode:exitCodes.resourceNotFound})}if(tool.annotations?.readOnlyHint!==true&&!input.yes){throw new CliError("INVALID_ARGUMENT",`MCP \u5DE5\u5177 ${input.tool} \u53EF\u80FD\u4F1A\u4FEE\u6539\u6570\u636E\uFF0C\u9700\u4F7F\u7528 --yes \u786E\u8BA4`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u68C0\u67E5\u5DE5\u5177\u53C2\u6570\uFF0C\u5E76\u4F7F\u7528 --yes \u91CD\u65B0\u6267\u884C\u4EE5\u786E\u8BA4\u3002"})}const result=await clientFor(runtime2).callTool({spec,tool:input.tool,arguments_:input.arguments_,yes:input.yes,...commandOptions(runtime2)});return{connection:connectionSummary(connection),...result}}async function inspectConnectionStatus(runtime2,input){return inspectEnterpriseMcpStatus({runtime:runtime2,...input.server===void 0?{}:{server:input.server},timeoutMs:runtime2.timeoutMs})}async function attachConnection(runtime2,input){return attachEnterpriseMcpConnection({runtime:runtime2,...input.server===void 0?{}:{server:input.server},agent:input.agent,yes:input.yes,dryRun:input.dryRun,noSkill:input.noSkill,confirm:input.confirm,timeoutMs:runtime2.timeoutMs})}async function detachConnection(runtime2,input){return detachEnterpriseMcpConnection({runtime:runtime2,...input.server===void 0?{}:{server:input.server},agent:input.agent,yes:input.yes,dryRun:input.dryRun,confirm:input.confirm})}async function disconnectConnection(runtime2,input){return disconnectEnterpriseMcp({runtime:runtime2,...input.server===void 0?{}:{server:input.server},yes:input.yes,dryRun:input.dryRun,confirm:input.confirm})}async function installSkill(runtime2,input){return installEnterpriseMcpSkill({runtime:runtime2,...input})}async function skillStatus(runtime2,input){return inspectEnterpriseMcpSkillStatus({runtime:runtime2,agents:input.agents})}async function uninstallSkill(runtime2,input){return uninstallEnterpriseMcpSkill({runtime:runtime2,...input})}function invalid(message){throw new CliError("INVALID_ARGUMENT",message,{exitCode:exitCodes.invalidArgument})}async function searchKnowledge(client,query,options={}){const normalizedQuery=query.trim();if(!normalizedQuery){invalid("Query is required")}if(normalizedQuery.length>4e3){invalid("Query must not exceed 4000 characters")}if(options.topK!==void 0&&(!Number.isInteger(options.topK)||options.topK<1||options.topK>50)){invalid("top-k must be between 1 and 50")}if(options.strategy!==void 0&&!["vector","multi"].includes(options.strategy)){invalid("strategy must be vector or multi")}const sourceIds=[...new Set((options.sourceIds??[]).map(sourceId=>sourceId.trim()).filter(Boolean))];return client.search({query:normalizedQuery,...sourceIds.length?{source_ids:sourceIds}:{},...options.topK!==void 0?{top_k:options.topK}:{},...options.strategy!==void 0?{strategy:options.strategy}:{},save_exploration:false})}function requiredSourceId(sourceId){const normalized=sourceId.trim();if(!normalized){throw new CliError("INVALID_ARGUMENT","Source ID is required",{exitCode:exitCodes.invalidArgument})}return normalized}function listSources(client){return client.listSources()}async function getSource(client,sourceId){return client.getSource(requiredSourceId(sourceId))}async function sourceStatus(client,sourceId){if(sourceId===void 0){const sources=await client.listSources();const documentSummaries=await Promise.all(sources.map(async source2=>summarizeDocuments(await client.listDocuments(source2.id))));return{total:sources.length,statuses:{active:sources.filter(({status:status2})=>status2==="active").length,paused:sources.filter(({status:status2})=>status2==="paused").length,error:sources.filter(({status:status2})=>status2==="error").length},documents:{total:documentSummaries.reduce((total,summary2)=>total+summary2.total,0),ready:documentSummaries.reduce((total,summary2)=>total+summary2.statuses.ready,0),pending:documentSummaries.reduce((total,summary2)=>total+summary2.statuses.pending,0),loading:documentSummaries.reduce((total,summary2)=>total+summary2.statuses.loading,0),extracting:documentSummaries.reduce((total,summary2)=>total+summary2.statuses.extracting,0),paused:documentSummaries.reduce((total,summary2)=>total+summary2.statuses.paused,0),failed:documentSummaries.reduce((total,summary2)=>total+summary2.statuses.failed,0)},searchableSources:documentSummaries.filter(({searchable})=>searchable).length}}const normalizedSourceId=requiredSourceId(sourceId);const[source,documents]=await Promise.all([client.getSource(normalizedSourceId),client.listDocuments(normalizedSourceId)]);const summary=summarizeDocuments(documents);return{source,documents:{total:summary.total,ready:summary.statuses.ready,pending:summary.statuses.pending,loading:summary.statuses.loading,extracting:summary.statuses.extracting,paused:summary.statuses.paused,failed:summary.statuses.failed,searchable:summary.searchable}}}var import_node_crypto9=require("crypto");function directCredentialRef(url2){const fingerprint=(0,import_node_crypto9.createHash)("sha256").update(url2).digest("hex").slice(0,16);return`sag-cli/direct-${fingerprint}`}async function createRuntimeContext(input){const config2=await input.configStore.load();const connection=resolveConnection(input.options,input.environment,config2);const credentialRef=connection.credentialRef??directCredentialRef(connection.url);const token=connection.environmentToken??await input.credentialStore.get(credentialRef)??void 0;return{connection,credentialRef,...token?{token}:{},client:input.createClient({origin:connection.url,...token?{token}:{}})}}var OUTPUT_SCHEMA="sag.cli.v1";function success4(data){return{schema:OUTPUT_SCHEMA,ok:true,data}}function failure(error51){return{schema:OUTPUT_SCHEMA,ok:false,error:error51.toShape()}}function emptyDocumentStatuses(){return{pending:0,loading:0,extracting:0,paused:0,ready:0,failed:0}}function errorCheck(name,error51,fallbackHint){const cliError=toCliError(error51);const hint=cliError.hint??fallbackHint;return{name,status:"fail",code:cliError.code,detail:cliError.message,...hint?{hint}:{}}}function skippedCheck(name,reason){return{name,status:"warn",code:"CHECK_SKIPPED",detail:reason}}function overallStatus(checks){if(checks.some(check3=>check3.status==="fail")){return"fail"}if(checks.some(check3=>check3.status==="warn")){return"warn"}return"pass"}function sagVersionCheck(name,version2){const match=/^(\d+)\.(\d+)(?:\.|$)/u.exec(version2);if(!match){return{name:"service",status:"warn",code:"SAG_VERSION_UNVERIFIED",detail:`${name} ${version2}`,hint:"This SAG version could not be checked against >=1.4.0 <2.0.0."}}const major=Number(match[1]);const minor=Number(match[2]);if(major!==1||minor<4){return{name:"service",status:"fail",code:"SAG_VERSION_INCOMPATIBLE",detail:`${name} ${version2} is outside the supported range >=1.4.0 <2.0.0`,hint:"Use a compatible SAG version or upgrade SAG CLI."}}return{name:"service",status:"pass",code:"SAG_REACHABLE",detail:`${name} ${version2}`}}function documentDetail(total,statuses){const displayOrder=["ready","pending","loading","extracting","paused","failed"];const parts=displayOrder.filter(status2=>statuses[status2]>0).map(status2=>`${statuses[status2]} ${status2}`);return`${total} ${total===1?"document":"documents"}${parts.length?`: ${parts.join(", ")}`:""}`}async function runDoctor(client,input,localMcpChecks){const checks=[];let sagVersion;let authenticated=false;let sources;const documentStatuses=emptyDocumentStatuses();let documentCount=0;let mcpTools=0;try{const root=await client.root();sagVersion=root.version;checks.push(sagVersionCheck(root.name,root.version))}catch(error51){checks.push(errorCheck("service",error51))}try{const ready=await client.ready();if(!ready.db||ready.status!=="ready"){checks.push({name:"readiness",status:"fail",code:"SERVICE_NOT_READY",detail:"SAG database is not ready",hint:"Check SAG API and database logs."})}else{checks.push({name:"readiness",status:"pass",code:"SAG_READY",detail:"Database is ready"})}}catch(error51){checks.push(errorCheck("readiness",error51))}try{const user=await client.me();authenticated=true;checks.push({name:"authentication",status:"pass",code:"AUTH_VALID",detail:`${user.name} <${user.email}>`})}catch(error51){checks.push(errorCheck("authentication",error51,"Run `sag auth login` or set SAG_TOKEN."))}if(!authenticated){const reason="Skipped because authentication failed";checks.push(skippedCheck("sources",reason));checks.push(skippedCheck("documents",reason));checks.push(skippedCheck("mcp",reason))}else{try{sources=await client.listSources();checks.push({name:"sources",status:sources.length?"pass":"warn",code:sources.length?"SOURCES_AVAILABLE":"NO_SOURCES",detail:`${sources.length} ${sources.length===1?"source":"sources"}`,...!sources.length?{hint:"Create and populate a knowledge source in SAG."}:{}})}catch(error51){checks.push(errorCheck("sources",error51))}if(!sources){checks.push(skippedCheck("documents","Skipped because sources could not be listed"))}else{try{const documents=(await Promise.all(sources.map(source=>client.listDocuments(source.id)))).flat();documentCount=documents.length;for(const document of documents){documentStatuses[document.status]+=1}const hasUnready=documentStatuses.pending+documentStatuses.loading+documentStatuses.extracting+documentStatuses.paused+documentStatuses.failed>0;checks.push({name:"documents",status:hasUnready||!documents.length?"warn":"pass",code:!documents.length?"NO_DOCUMENTS":hasUnready?"DOCUMENTS_PROCESSING":"DOCUMENTS_READY",detail:documentDetail(documentCount,documentStatuses),...hasUnready?{hint:`Run \`sag document status --source ${sources[0]?.id??"<source-id>"}\` for details.`}:{}})}catch(error51){checks.push(errorCheck("documents",error51))}}try{const descriptor=await client.mcpDescriptor();mcpTools=descriptor.tools.length;checks.push({name:"mcp",status:"pass",code:"MCP_DESCRIPTOR_READY",detail:`${mcpTools} tools via ${descriptor.http.transport}`})}catch(error51){checks.push(errorCheck("mcp",error51))}}if(localMcpChecks){try{checks.push(...await localMcpChecks())}catch(error51){checks.push(errorCheck("docker",error51))}}return{status:overallStatus(checks),url:input.url,...input.profileName?{profileName:input.profileName}:{},...sagVersion?{sagVersion}:{},checks,summary:{sources:sources?.length??0,documents:documentCount,documentStatuses,mcpTools}}}var SENSITIVE_KEYS=new Set(["authorization","authorization_code","token","access_token","password","secret","secretkey","secret_key","ticket"]);var BEARER_TOKEN=/\bBearer\s+[^\s"',}\]]+/giu;function redactString(value){return value.replace(BEARER_TOKEN,"Bearer [REDACTED]")}function redact(value){if(typeof value==="string"){return redactString(value)}if(Array.isArray(value)){return value.map(item=>redact(item))}if(value&&typeof value==="object"){return Object.fromEntries(Object.entries(value).map(([key,item])=>{const normalizedKey=key.toLowerCase();if(normalizedKey==="authorization"&&typeof item==="string"){return[key,redactString(item)]}return[key,SENSITIVE_KEYS.has(normalizedKey)?"[REDACTED]":redact(item)]}))}return value}function isRecord(value){return Boolean(value)&&typeof value==="object"&&!Array.isArray(value)}function renderRows(rows){if(!rows.length)return"No results.\n";const preferredColumns=["current","agent","installed","version","serverName","managed","verified","managedConnections","active","id","name","filename","status","url","endpoint","toolCount","document_count","chunk_count","progress"];const available=new Set(rows.flatMap(row=>Object.keys(row)));const columns=preferredColumns.filter(column=>available.has(column));const selected=columns.length?columns:Object.keys(rows[0]??{});const widths=selected.map(column=>Math.max(column.length,...rows.map(row=>String(row[column]??"").length)));const line=values=>values.map((value,index)=>String(value??"").padEnd(widths[index]??0)).join(" ").trimEnd();return`${[line(selected),line(widths.map(width=>"-".repeat(width))),...rows.map(row=>line(selected.map(column=>row[column])))].join("\n")}
|
|
131
131
|
`}function renderDoctor(report){const lines=[`SAG doctor: ${report.status.toUpperCase()}`,`URL: ${report.url}`,...report.checks.map(check3=>`${check3.status==="pass"?"\u2713":check3.status==="warn"?"!":"\u2717"} ${check3.name}: ${check3.detail}${check3.hint?` \u2014 ${check3.hint}`:""}`)];return`${lines.join("\n")}
|
|
@@ -153,7 +153,7 @@ ${context}
|
|
|
153
153
|
`)}};var import_node_crypto10=require("crypto");var import_promises12=require("fs/promises");var import_node_url2=require("url");var import_node_path14=__toESM(require("path"),1);var import_proper_lockfile8=__toESM(require_proper_lockfile(),1);var skillName2="sag-knowledge";var packageName="@zleap-ai/sag-cli";var agents=["codex","claude-code","workbuddy"];var requiredFiles=["SKILL.md","references/cli-reference.md","references/ndjson-contract.md","references/safety.md","scripts/sag-knowledge.cjs"];function bundledSkillPath2(){const directory=import_node_path14.default.dirname((0,import_node_url2.fileURLToPath)(__sagSkillImportMetaUrl));const packageRoot=import_node_path14.default.basename(directory)==="dist"?import_node_path14.default.dirname(directory):import_node_path14.default.resolve(directory,"../..");return import_node_path14.default.join(packageRoot,"skill")}function uniqueAgents(selected){return[...new Set(selected??agents)]}function skillTargetPath(agent,input){const home=import_node_path14.default.resolve(input.home);const codexHome=input.environment.CODEX_HOME?import_node_path14.default.resolve(input.environment.CODEX_HOME):import_node_path14.default.join(home,".codex");switch(agent){case"codex":return import_node_path14.default.join(codexHome,"skills",skillName2);case"claude-code":return import_node_path14.default.join(home,".claude","skills",skillName2);case"workbuddy":return import_node_path14.default.join(home,".workbuddy","skills",skillName2)}}function sourceTargetError(){throw new Error("Skill target is outside the configured user-level Agent directory")}function assertUserTarget(target,agent,runtime2){const parent=agent==="codex"?import_node_path14.default.resolve(runtime2.environment.CODEX_HOME??import_node_path14.default.join(runtime2.home,".codex"),"skills"):import_node_path14.default.resolve(runtime2.home,agent==="claude-code"?".claude/skills":".workbuddy/skills");if(import_node_path14.default.dirname(target)!==parent||import_node_path14.default.basename(target)!==skillName2)sourceTargetError()}var SkillTargetLeaseError=class extends Error{};async function withTargetLease(target,operation){await(0,import_promises12.mkdir)(import_node_path14.default.dirname(target),{recursive:true});let release;try{release=await(0,import_proper_lockfile8.lock)(import_node_path14.default.join(import_node_path14.default.dirname(target),`.${skillName2}.lease`),{realpath:false,stale:1e4,update:2e3,retries:{retries:100,factor:1,minTimeout:10,maxTimeout:10}})}catch{throw new SkillTargetLeaseError}try{return await operation()}finally{await release()}}async function exists2(location){try{await(0,import_promises12.lstat)(location);return true}catch(error51){if(error51.code==="ENOENT")return false;throw error51}}async function moveTarget(runtime2,from,to){if(runtime2.filesystem?.rename)return runtime2.filesystem.rename(from,to);await(0,import_promises12.rename)(from,to)}async function removeTarget(runtime2,target){if(runtime2.filesystem?.remove)return runtime2.filesystem.remove(target);await(0,import_promises12.rm)(target,{recursive:true,force:true})}function sameManagedSkill(left,right){return left?.agent===right.agent&&left.target===right.target&&left.fingerprint===right.fingerprint&&left.version===right.version&&left.backupPath===right.backupPath}async function deactivateUnmanagedTarget(input){try{await moveTarget(input.runtime,input.target,input.removed)}catch{return"active-unmanaged"}return await exists2(input.target)?"active-unmanaged":"incomplete"}async function recoverUninstall(input){try{await moveTarget(input.runtime,input.removed,input.target)}catch{return"incomplete"}if(!await exists2(input.target))return"incomplete";try{await validateBundle(input.target,input.agent);if(await fingerprintDirectory(input.target)!==input.managed.fingerprint){return deactivateUnmanagedTarget(input)}}catch{return deactivateUnmanagedTarget(input)}try{const current=await input.runtime.state.getManagedSkill(input.agent,input.target);if(sameManagedSkill(current,input.managed))return"restored";await input.runtime.state.saveManagedSkill(input.managed);const restored=await input.runtime.state.getManagedSkill(input.agent,input.target);if(sameManagedSkill(restored,input.managed))return"restored"}catch{}return deactivateUnmanagedTarget(input)}function digest(value){return`sha256:${(0,import_node_crypto10.createHash)("sha256").update(value).digest("hex")}`}function parseManifest(raw){const value=JSON.parse(raw);if(!value||typeof value!=="object"||Array.isArray(value))throw new Error("invalid manifest");const manifest=value;if(manifest.schema!==1||manifest.name!==skillName2||manifest.package!==packageName||typeof manifest.packageVersion!=="string"||!manifest.packageVersion||typeof manifest.bundleDigest!=="string"||!/^sha256:[a-f0-9]{64}$/u.test(manifest.bundleDigest)||!agents.includes(manifest.agent)&&manifest.agent!=="template"){throw new Error("invalid manifest")}return manifest}async function validateBundle(bundle,expectedAgent){const[rawManifest,runtime2]=await Promise.all([(0,import_promises12.readFile)(import_node_path14.default.join(bundle,"manifest.json"),"utf8"),(0,import_promises12.readFile)(import_node_path14.default.join(bundle,"scripts","sag-knowledge.cjs"))]);const manifest=parseManifest(rawManifest);if(manifest.agent!==expectedAgent||manifest.bundleDigest!==digest(runtime2)){throw new Error("invalid Skill bundle")}await Promise.all(requiredFiles.map(file2=>(0,import_promises12.readFile)(import_node_path14.default.join(bundle,file2))));return manifest}async function fingerprintDirectory(root,relative=""){const hash2=(0,import_node_crypto10.createHash)("sha256");async function visit(nested=""){const entries=await(0,import_promises12.readdir)(import_node_path14.default.join(root,nested),{withFileTypes:true});for(const entry of entries.sort((left,right)=>left.name.localeCompare(right.name))){const entryPath=import_node_path14.default.join(nested,entry.name);if(entry.isDirectory()){hash2.update(`directory:${entryPath}
|
|
154
154
|
`);await visit(entryPath)}else if(entry.isFile()){hash2.update(`file:${entryPath}
|
|
155
155
|
`);hash2.update(await(0,import_promises12.readFile)(import_node_path14.default.join(root,entryPath)))}else{throw new Error("unsupported Skill file")}}}await visit(relative);return`sha256:${hash2.digest("hex")}`}function sibling(target,suffix){return import_node_path14.default.join(import_node_path14.default.dirname(target),`.${skillName2}.${suffix}-${(0,import_node_crypto10.randomUUID)()}`)}async function restore(input){let recovered=true;try{await removeTarget(input.runtime,input.temporary)}catch{recovered=false}const targetMatchesReplacement=async()=>{if(!input.replacementFingerprint||!await exists2(input.target))return false;try{return await fingerprintDirectory(input.target)===input.replacementFingerprint}catch{return false}};if(input.backup&&await exists2(input.backup)){if(await exists2(input.target)){if(!await targetMatchesReplacement())return false;try{await removeTarget(input.runtime,input.target)}catch{return false}}try{await moveTarget(input.runtime,input.backup,input.target)}catch{return false}}else if(!input.hadTarget&&await exists2(input.target)){if(!await targetMatchesReplacement())return false;try{await removeTarget(input.runtime,input.target)}catch{return false}}return recovered}async function inspectOne(runtime2,agent,inspectExplicitTarget=false){const target=skillTargetPath(agent,runtime2);assertUserTarget(target,agent,runtime2);if(!inspectExplicitTarget&&!await runtime2.agents[agent].installed()){return{agent,target,status:"unavailable",message:"Agent is not installed."}}const managed=await runtime2.state.getManagedSkill(agent,target);if(!await exists2(target)){return managed?{agent,target,status:"drifted",code:"INSTALL_TARGET_CONFLICT",message:"Managed Skill directory is missing."}:{agent,target,status:"missing",message:"Skill is not installed."}}if(!managed){return{agent,target,status:"unmanaged",code:"INSTALL_TARGET_CONFLICT",message:"Existing Skill directory is not managed by SAG CLI."}}try{const manifest=await validateBundle(target,agent);const fingerprint=await fingerprintDirectory(target);if(managed.fingerprint!==fingerprint||managed.version!==manifest.packageVersion){return{agent,target,status:"drifted",code:"INSTALL_TARGET_CONFLICT",message:"Managed Skill directory has changed outside SAG CLI."}}return{agent,target,status:"installed",version:manifest.packageVersion,package:manifest.package,message:"Managed Skill is installed."}}catch{return{agent,target,status:"drifted",code:"INSTALL_TARGET_CONFLICT",message:"Managed Skill directory has changed outside SAG CLI."}}}async function activeAgents(runtime2,selected){const choices=uniqueAgents(selected);if(selected)return choices;const installed=await Promise.all(choices.map(async agent=>({agent,installed:await runtime2.agents[agent].installed()})));return installed.filter(choice=>choice.installed).map(choice=>choice.agent)}async function requireConfirmation(runtime2,selection,action){if(selection.yes)return true;return await runtime2.confirm?.(`${action} SAG Knowledge Skill?`)??false}async function inspectSkillTargets(runtime2,input){const source=await validateBundle(runtime2.bundlePath??bundledSkillPath2(),"template");const selected=input.agents?uniqueAgents(input.agents):agents;const targets=await Promise.all(selected.map(agent=>inspectOne(runtime2,agent,input.agents!==void 0)));return{package:source.package,version:source.packageVersion,targets,completedWithErrors:targets.some(target=>target.status==="drifted")}}async function installSkillTargets(runtime2,input){if(input.update&&!runtime2.resolveLatestBundle){throw new CliError("DEPENDENCY_MISSING","Unable to resolve @latest Skill package",{exitCode:exitCodes.dependencyMissing,hint:"Run this update through `npx @zleap-ai/sag-cli@latest` or restore npm access."})}const resolved=input.update?await runtime2.resolveLatestBundle?.():void 0;const sourcePath=resolved?.bundlePath??runtime2.bundlePath??bundledSkillPath2();const source=await validateBundle(sourcePath,"template");const selected=await activeAgents(runtime2,input.agents);if(selected.length===0){return{package:source.package,version:source.packageVersion,targets:agents.map(agent=>({agent,target:skillTargetPath(agent,runtime2),status:"unavailable",message:"No supported Agent was detected on this device."})),completedWithErrors:true}}if(!await requireConfirmation(runtime2,input,"Install")){return{package:source.package,version:source.packageVersion,targets:selected.map(agent=>({agent,target:skillTargetPath(agent,runtime2),status:"skipped",message:"Installation was not confirmed."})),completedWithErrors:false}}const targets=[];try{for(const agent of selected){const target=skillTargetPath(agent,runtime2);assertUserTarget(target,agent,runtime2);try{targets.push(await withTargetLease(target,async()=>{const inspection=await inspectOne(runtime2,agent,input.agents!==void 0);if(inspection.status==="installed"&&inspection.version===source.packageVersion){return{...inspection,status:"skipped",message:"Managed Skill is already current."}}if(inspection.status==="unmanaged"||inspection.status==="drifted"){return{...inspection,status:"conflict"}}if(inspection.status==="unavailable")return inspection;const temporary=sibling(target,"tmp");const hadTarget=inspection.status==="installed";let backup;let replacementFingerprint;try{await(0,import_promises12.cp)(sourcePath,temporary,{recursive:true,errorOnExist:true,force:false});const temporaryManifestPath=import_node_path14.default.join(temporary,"manifest.json");const temporaryManifest=await validateBundle(temporary,"template");await(0,import_promises12.writeFile)(temporaryManifestPath,`${JSON.stringify({...temporaryManifest,agent},null,2)}
|
|
156
|
-
`,"utf8");await validateBundle(temporary,agent);replacementFingerprint=await fingerprintDirectory(temporary);await runtime2.agents[agent].installSkill?.();if(hadTarget){backup=sibling(target,"backup");await moveTarget(runtime2,target,backup)}await moveTarget(runtime2,temporary,target);if(await fingerprintDirectory(target)!==replacementFingerprint){throw new Error("Skill target changed during installation")}const managed={agent,target,version:source.packageVersion,fingerprint:replacementFingerprint,...backup?{backupPath:backup}:{}};await runtime2.state.saveManagedSkill(managed);return{agent,target,status:hadTarget?"updated":"created",version:source.packageVersion,package:source.package,message:"Skill installed."}}catch{const restored=await restore({runtime:runtime2,target,temporary,...backup?{backup}:{},hadTarget,...replacementFingerprint?{replacementFingerprint}:{}}).catch(()=>false);return{agent,target,status:"failed",message:restored?"Skill installation failed and this target was restored.":"Skill installation failed and recovery was incomplete."}}}))}catch(error51){if(!(error51 instanceof SkillTargetLeaseError))throw error51;targets.push({agent,target,status:"conflict",code:"INSTALL_TARGET_CONFLICT",message:"Skill target is busy; wait for the active SAG CLI operation and retry."})}}return{package:source.package,version:source.packageVersion,targets,completedWithErrors:targets.some(target=>["failed","conflict"].includes(target.status))}}finally{await resolved?.cleanup()}}async function uninstallSkillTargets(runtime2,input){const source=await validateBundle(runtime2.bundlePath??bundledSkillPath2(),"template");const selected=await activeAgents(runtime2,input.agents);if(!await requireConfirmation(runtime2,input,"Uninstall")){return{package:source.package,version:source.packageVersion,targets:selected.map(agent=>({agent,target:skillTargetPath(agent,runtime2),status:"skipped",message:"Uninstall was not confirmed."})),completedWithErrors:false}}const targets=[];for(const agent of selected){const target=skillTargetPath(agent,runtime2);assertUserTarget(target,agent,runtime2);try{targets.push(await withTargetLease(target,async()=>{const inspection=await inspectOne(runtime2,agent,input.agents!==void 0);if(inspection.status==="missing")return inspection;if(inspection.status!=="installed"){return{...inspection,status:"conflict",code:"INSTALL_TARGET_CONFLICT"}}const removed=sibling(inspection.target,"remove");const managed=await runtime2.state.getManagedSkill(agent,inspection.target);try{await moveTarget(runtime2,inspection.target,removed);await runtime2.state.deleteManagedSkill(agent,inspection.target);await removeTarget(runtime2,removed);return{agent,target:inspection.target,status:"removed",...inspection.version?{version:inspection.version}:{},package:source.package,message:"Managed Skill was removed."}}catch{const recovery=managed&&await exists2(removed)?await recoverUninstall({runtime:runtime2,agent,target:inspection.target,removed,managed}):"incomplete";return{agent,target:inspection.target,status:"failed",message:recovery==="restored"?"Skill uninstall failed; target and managed state were restored.":recovery==="active-unmanaged"?"Skill uninstall failed; recovery is incomplete and the active target is unmanaged.":"Skill uninstall failed and recovery was incomplete."}}}))}catch(error51){if(!(error51 instanceof SkillTargetLeaseError))throw error51;targets.push({agent,target,status:"conflict",code:"INSTALL_TARGET_CONFLICT",message:"Skill target is busy; wait for the active SAG CLI operation and retry."})}}return{package:source.package,version:source.packageVersion,targets,completedWithErrors:targets.some(target=>["failed","conflict"].includes(target.status))}}var skillInstallerExitCode=exitCodes.configConflict;var import_node_crypto11=require("crypto");var import_promises13=require("timers/promises");async function authorizeSkillAccount(runtime2,origin){const normalizedOrigin=normalizeSkillOrigin(origin);const random2=runtime2.randomBytes??import_node_crypto11.randomBytes;const verifier=random2(32).toString("base64url");const challenge=(0,import_node_crypto11.createHash)("sha256").update(verifier).digest("base64url");const session=await runtime2.client.createLoginSession(normalizedOrigin,challenge);await runtime2.openBrowser(session.verificationUrl);const sleep2=runtime2.sleep??import_promises13.setTimeout;for(;;){if(runtime2.now().getTime()>=new Date(session.expiresAt).getTime()){throw expiredAuthorization()}const current=await runtime2.client.getLoginSession(normalizedOrigin,session.sessionId);if(current.status==="denied"){throw new SkillError("PERMISSION_DENIED","SAG account authorization was denied",{exitCode:exitCodes.permissionDenied})}if(current.status==="consumed")throw expiredAuthorization();if(current.status==="approved"){const account=await runtime2.client.exchange(normalizedOrigin,{sessionId:session.sessionId,pkceVerifier:verifier});await runtime2.config.saveAccount(normalizedOrigin,account);return{origin:normalizedOrigin,account,browserOpened:true}}await sleep2(1e3)}}async function withFreshSkillAccount(runtime2,origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);const current=await requireAccount(runtime2,normalizedOrigin);if(isFuture(current.accessExpiresAt,runtime2.now())){return operation(current.accessToken)}const accessToken=await runtime2.config.withRefreshLock(normalizedOrigin,async()=>{const latest=await requireAccount(runtime2,normalizedOrigin);if(isFuture(latest.accessExpiresAt,runtime2.now()))return latest.accessToken;if(!isFuture(latest.refreshExpiresAt,runtime2.now())){await runtime2.config.removeAccount(normalizedOrigin);throw expiredAuthorization()}try{const rotated=await runtime2.client.refresh(normalizedOrigin,latest.refreshToken);const next={...rotated,...latest.recentKnowledgeBase&&!rotated.recentKnowledgeBase?{recentKnowledgeBase:latest.recentKnowledgeBase}:{}};await runtime2.config.saveAccount(normalizedOrigin,next);return next.accessToken}catch(error51){if(error51 instanceof SkillError&&(error51.code==="AUTH_EXPIRED"||error51.code==="AUTH_REQUIRED")){await runtime2.config.removeAccount(normalizedOrigin)}throw error51}});return operation(accessToken)}async function logoutSkillAccount(runtime2,origin){const normalizedOrigin=normalizeSkillOrigin(origin);const account=await runtime2.config.getAccount(normalizedOrigin);if(!account)return false;await runtime2.client.logout(normalizedOrigin,account.accessToken,account.refreshToken);await runtime2.config.removeAccount(normalizedOrigin);return true}async function requireAccount(runtime2,origin){const account=await runtime2.config.getAccount(origin);if(account)return account;throw new SkillError("AUTH_REQUIRED","SAG account authorization is required",{exitCode:exitCodes.authRequired})}function isFuture(value,now){return new Date(value).getTime()>now.getTime()}function expiredAuthorization(){return new SkillError("AUTH_EXPIRED","SAG account authorization has expired",{exitCode:exitCodes.authRequired})}async function renameSkillAccountDocument(runtime2,origin,input){const knowledgeBase=await selectedKnowledgeBase(runtime2,origin,input.knowledgeBase);const renamed=await withSkillAccountKnowledgeClient(runtime2,origin,client=>client.renameDocument({knowledgeBaseId:knowledgeBase.id,documentId:input.documentId,expectedVersion:input.expectedVersion,idempotencyKey:runtime2.createId(),title:input.title}));await remember(runtime2,origin,knowledgeBase);return renamed}async function deleteSkillAccountDocument(runtime2,origin,input){const knowledgeBase=await selectedKnowledgeBase(runtime2,origin,input.knowledgeBase);const deleted=await withSkillAccountKnowledgeClient(runtime2,origin,client=>client.deleteDocument({knowledgeBaseId:knowledgeBase.id,documentId:input.documentId,expectedVersion:input.expectedVersion,idempotencyKey:runtime2.createId()}));await remember(runtime2,origin,knowledgeBase);return deleted}async function listSkillAccountKnowledgeBases(runtime2,origin){return withSkillAccountKnowledgeClient(runtime2,origin,client=>client.listKnowledgeBases())}async function listSkillAccountDocuments(runtime2,origin,selector){const normalizedOrigin=normalizeSkillOrigin(origin);const knowledgeBases=await listSkillAccountKnowledgeBases(runtime2,normalizedOrigin);const knowledgeBase=resolveKnowledgeBase(knowledgeBases,selector);const documents=await withSkillAccountKnowledgeClient(runtime2,normalizedOrigin,client=>client.listDocuments(knowledgeBase.id));await runtime2.config.saveRecentKnowledgeBase(normalizedOrigin,{id:knowledgeBase.id,name:knowledgeBase.name});return{knowledgeBase,documents}}async function askSkillAccountKnowledge(runtime2,origin,question,selector){const normalizedOrigin=normalizeSkillOrigin(origin);let knowledgeBase;if(selector){knowledgeBase=resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,normalizedOrigin),selector)}const answer=await withSkillAccountKnowledgeClient(runtime2,normalizedOrigin,client=>{if(!client.ask){throw new SkillError("PLATFORM_UNAVAILABLE","SAG account question answering is unavailable",{exitCode:exitCodes.serviceNotReady})}return client.ask(question,knowledgeBase?.id)});if(knowledgeBase){await runtime2.config.saveRecentKnowledgeBase(normalizedOrigin,{id:knowledgeBase.id,name:knowledgeBase.name})}return answer}function resolveKnowledgeBase(knowledgeBases,selector){const exactId=knowledgeBases.find(item=>item.id===selector);if(exactId)return exactId;const exactAlias=knowledgeBases.filter(item=>item.alias===selector);if(exactAlias.length===1)return exactAlias[0];const normalized=selector.trim().toLocaleLowerCase();const names=knowledgeBases.filter(item=>item.name.toLocaleLowerCase()===normalized);if(names.length===1)return names[0];throw new SkillError("INVALID_ARGUMENT",names.length>1?"Knowledge Base name is ambiguous":"Knowledge Base was not found",{details:{selector},exitCode:exitCodes.invalidArgument})}async function selectedKnowledgeBase(runtime2,origin,selector){return resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,origin),selector)}async function remember(runtime2,origin,knowledgeBase){await runtime2.config.saveRecentKnowledgeBase(origin,{id:knowledgeBase.id,name:knowledgeBase.name})}async function withSkillAccountKnowledgeClient(runtime2,origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);return withFreshSkillAccount(runtime2.auth,normalizedOrigin,accessToken=>operation(runtime2.createClient({accessToken,origin:normalizedOrigin})))}var import_node_crypto12=require("crypto");var import_node_fs=require("fs");var import_promises14=require("fs/promises");var import_node_path15=__toESM(require("path"),1);var DEFAULT_MAX_UPLOAD_BYTES=25*1024*1024;async function uploadSkillAccountFile(runtime2,origin,filePath,knowledgeBaseSelector,waitMs=30*60*1e3,overwriteDocumentId){const file2=await inspectFile(filePath);const knowledgeBase=resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,origin),knowledgeBaseSelector);const serverLimit=await withSkillAccountKnowledgeClient(runtime2,origin,client=>{if(!client.getServerLimit)return Promise.resolve(void 0);return client.getServerLimit(knowledgeBase.id)});const limit=Math.min(DEFAULT_MAX_UPLOAD_BYTES,serverLimit??DEFAULT_MAX_UPLOAD_BYTES);if(file2.size>limit){throw new SkillError("FILE_TOO_LARGE",`This file exceeds the ${limit}-byte Knowledge Base upload limit.`,{details:{limit_bytes:limit,size_bytes:file2.size},exitCode:exitCodes.invalidArgument})}const digest2=await sha256(filePath);const receipt=await withSkillAccountKnowledgeClient(runtime2,origin,client=>{if(!client.upload)return unavailableUpload();return client.upload({fileDigest:digest2,fileName:file2.name,filePath,fileSize:file2.size,idempotencyKey:runtime2.createId(),knowledgeBaseId:knowledgeBase.id,...overwriteDocumentId?{overwriteDocumentId}:{}})});const accepted={event:"accepted",importId:receipt.importId,documentId:receipt.documentId,jobId:receipt.jobId};await runtime2.onEvent?.(accepted);if(waitMs===0){const detached={...accepted,event:"detached"};await runtime2.onEvent?.(detached);return[accepted,detached]}const terminal=await poll(runtime2,origin,knowledgeBase.id,receipt.importId,waitMs);return[accepted,terminal]}async function inspectSkillAccountUpload(runtime2,origin,importId,knowledgeBaseSelector){const knowledgeBase=resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,origin),knowledgeBaseSelector);return readStatus(runtime2,origin,knowledgeBase.id,importId)}async function poll(runtime2,origin,knowledgeBaseId,importId,waitMs){const startedAt=runtime2.now().getTime();for(;;){const event=await readStatus(runtime2,origin,knowledgeBaseId,importId);await runtime2.onEvent?.(event);if(event.event!=="processing")return event;if(runtime2.now().getTime()-startedAt>=waitMs){const detached={event:"detached",importId};await runtime2.onEvent?.(detached);return detached}await runtime2.sleep(2e3)}}async function readStatus(runtime2,origin,knowledgeBaseId,importId){const current=await withSkillAccountKnowledgeClient(runtime2,origin,client=>{if(!client.getImportStatus)return unavailableUpload();return client.getImportStatus(knowledgeBaseId,importId)});return{event:current.searchable?"completed":current.state==="failed"?"failed":"processing",importId,...current.failure?{failure:current.failure}:{}}}async function inspectFile(filePath){let metadata;try{metadata=await(0,import_promises14.stat)(filePath)}catch{throw new SkillError("FILE_NOT_FOUND","The upload file could not be found.",{exitCode:exitCodes.invalidArgument})}if(!metadata.isFile()){throw new SkillError("UNSUPPORTED_FILE_TYPE","Upload accepts one regular file, not a directory or batch.",{exitCode:exitCodes.invalidArgument})}return{name:import_node_path15.default.basename(filePath),size:metadata.size}}async function sha256(filePath){const digest2=(0,import_node_crypto12.createHash)("sha256");for await(const chunk of(0,import_node_fs.createReadStream)(filePath))digest2.update(chunk);return`sha256:${digest2.digest("hex")}`}function unavailableUpload(){throw new SkillError("PLATFORM_UNAVAILABLE","SAG upload is unavailable",{exitCode:exitCodes.serviceNotReady})}var import_node_fs2=require("fs");var knowledgeBaseSchema=external_exports.strictObject({alias:external_exports.string().min(1).optional(),id:external_exports.string().min(1),name:external_exports.string().min(1)});var knowledgeBaseDirectorySchema=external_exports.strictObject({items:external_exports.array(knowledgeBaseSchema)});var documentSchema2=external_exports.strictObject({id:external_exports.string().min(1),knowledge_base_id:external_exports.string().min(1),title:external_exports.string().min(1),version:external_exports.number().int().positive()});var documentDirectorySchema=external_exports.strictObject({items:external_exports.array(documentSchema2)});var deletedDocumentSchema=external_exports.strictObject({deleted_at:external_exports.string().datetime({offset:true}),document_id:external_exports.string().min(1),recoverable:external_exports.literal(true),version:external_exports.number().int().positive()});var uploadStateSchema=external_exports.enum(["queued","accepted","processing","completed","failed"]);var uploadResponseSchema=external_exports.strictObject({document_id:external_exports.string().min(1),import_id:external_exports.string().min(1),job_id:external_exports.string().min(1),state:uploadStateSchema});var uploadLimitSchema=external_exports.strictObject({max_upload_bytes:external_exports.number().int().positive()});var importStatusSchema=external_exports.strictObject({failure:external_exports.string().min(1).optional(),searchable:external_exports.boolean(),state:uploadStateSchema});var answerSchema=external_exports.strictObject({answer:external_exports.string().min(1),citations:external_exports.array(external_exports.strictObject({number:external_exports.number().int().positive(),knowledge_base_id:external_exports.string().min(1),document_id:external_exports.string().min(1),document_version_id:external_exports.string().min(1),excerpt:external_exports.string(),location:external_exports.string().min(1).optional()})),search_completeness:external_exports.enum(["complete","partial"]),search_partial_reasons:external_exports.array(external_exports.string().min(1))});var problemSchema2=external_exports.object({code:external_exports.string().min(1),data:external_exports.unknown().optional()}).passthrough();var duplicateImportDetailsSchema=external_exports.object({conflict_type:external_exports.enum(["same_filename_same_checksum","same_filename_changed_checksum"]),existing_document_id:external_exports.string().min(1),existing_import_id:external_exports.string().min(1),existing_filename:external_exports.string().min(1),current_filename:external_exports.string().min(1),checksum_sha256:external_exports.string().min(1),existing_state:external_exports.string().min(1),overwrite_allowed:external_exports.boolean()});function httpError(status2,problemCode,problemData){const normalizedProblemCode=problemCode.toLowerCase();const details={problemCode};if(normalizedProblemCode==="invalid_grant"||normalizedProblemCode==="expired_token"){return new SkillError("AUTH_EXPIRED","SAG account authorization has expired",{exitCode:exitCodes.authRequired,...details})}if(normalizedProblemCode==="document_title_conflict"){return new SkillError("DOCUMENT_TITLE_CONFLICT","The document title conflicts",{exitCode:exitCodes.configConflict,...details})}if(normalizedProblemCode==="document_import_duplicate"){const details2=duplicateImportDetailsSchema.safeParse(problemData);return new SkillError("DOCUMENT_IMPORT_DUPLICATE","A file with the same name already exists in this Knowledge Base",{...details2.success?{details:details2.data}:{},exitCode:exitCodes.configConflict,problemCode})}if(normalizedProblemCode==="stale_version"){return new SkillError("STALE_VERSION","The document version is stale",{exitCode:exitCodes.configConflict,...details})}if(status2===401){return new SkillError("AUTH_REQUIRED","Skill authorization is required",{exitCode:exitCodes.authRequired,...details})}if(status2===403){return new SkillError("PERMISSION_DENIED","Skill authorization was denied",{exitCode:exitCodes.permissionDenied,...details})}if(status2===404){return new SkillError("DOCUMENT_NOT_FOUND","Skill Knowledge resource was not found",{exitCode:exitCodes.resourceNotFound,...details})}if(status2===409){return new SkillError("CONFIG_CONFLICT","Skill Knowledge request conflicts",{exitCode:exitCodes.configConflict,...details})}if(status2===429){return new SkillError("RATE_LIMITED","Skill Knowledge service rate limit reached",{exitCode:exitCodes.networkUnreachable,...details})}if(status2>=500){return new SkillError("PLATFORM_UNAVAILABLE","Skill Knowledge service is unavailable",{exitCode:exitCodes.serviceNotReady,...details})}return new SkillError("INVALID_RESPONSE","Skill Knowledge service returned an incompatible response",{exitCode:exitCodes.internalError,...details})}function throwIfAborted(signal){if(!signal?.aborted)return;throw signal.reason instanceof Error?signal.reason:new DOMException("The request was interrupted.","AbortError")}var SkillKnowledgeHttpClient=class{#accessToken;#fetch;#origin;#timeoutMs;constructor(options){try{this.#origin=normalizeSkillOrigin(options.origin)}catch{throw new SkillError("CONFIG_CONFLICT","SAG address is invalid",{exitCode:exitCodes.configConflict})}if(!options.accessToken){throw new SkillError("AUTH_REQUIRED","Skill authorization is required",{exitCode:exitCodes.authRequired})}this.#accessToken=options.accessToken;this.#fetch=options.fetchImplementation??fetch;this.#timeoutMs=options.timeoutMs??15e3}async ask(question,knowledgeBaseId){const answer=this.#parse(answerSchema,await this.#request("/api/v1/integrations/skill/v1/questions",{body:{question,...knowledgeBaseId?{knowledge_base_id:knowledgeBaseId}:{}},method:"POST"}));return{answer:answer.answer,citations:answer.citations.map(citation=>({number:citation.number,knowledgeBaseId:citation.knowledge_base_id,documentId:citation.document_id,documentVersionId:citation.document_version_id,excerpt:citation.excerpt,...citation.location?{location:citation.location}:{}})),completeness:answer.search_completeness,partialReasons:answer.search_partial_reasons}}async listKnowledgeBases(){const parsed=await this.#request("/api/v1/integrations/skill/v1/knowledge-bases",{method:"GET"});return this.#parse(knowledgeBaseDirectorySchema,parsed).items.map(knowledgeBase=>({id:knowledgeBase.id,name:knowledgeBase.name,...knowledgeBase.alias?{alias:knowledgeBase.alias}:{}}))}async listDocuments(knowledgeBaseId){const parsed=await this.#request(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/documents`,{method:"GET"});return this.#parse(documentDirectorySchema,parsed).items.map(document=>({id:document.id,knowledgeBaseId:document.knowledge_base_id,title:document.title,version:document.version}))}async renameDocument(input){const document=this.#parse(documentSchema2,await this.#request(this.#mutationPath(input),{body:{title:input.title},headers:this.#mutationHeaders(input),method:"PATCH"}));if(document.id!==input.documentId||document.knowledge_base_id!==input.knowledgeBaseId){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service returned a different document",{exitCode:exitCodes.internalError})}return{id:document.id,knowledgeBaseId:document.knowledge_base_id,title:document.title,version:document.version}}async deleteDocument(input){const deleted=this.#parse(deletedDocumentSchema,await this.#request(this.#mutationPath(input),{headers:this.#mutationHeaders(input),method:"DELETE"}));if(deleted.document_id!==input.documentId){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service returned a different document",{exitCode:exitCodes.internalError})}return{deletedAt:deleted.deleted_at,documentId:deleted.document_id,recoverable:deleted.recoverable,version:deleted.version}}async getServerLimit(knowledgeBaseId,signal){return this.#parse(uploadLimitSchema,await this.#request(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/upload-limit`,{method:"GET",...signal?{signal}:{}})).max_upload_bytes}async upload(input,signal){throwIfAborted(signal);const form=new FormData;form.set("file",await(0,import_node_fs2.openAsBlob)(input.filePath),input.fileName);if(input.overwriteDocumentId){form.set("overwrite_document_id",input.overwriteDocumentId)}const payload=await this.#multipartRequest(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents`,form,input.idempotencyKey,signal);const response=this.#parse(uploadResponseSchema,payload);return{documentId:response.document_id,importId:response.import_id,jobId:response.job_id,state:response.state}}async getImportStatus(knowledgeBaseId,importId,signal){const status2=this.#parse(importStatusSchema,await this.#request(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/imports/${encodeURIComponent(importId)}`,{method:"GET",...signal?{signal}:{}}));return{searchable:status2.searchable,state:status2.state,...status2.failure?{failure:status2.failure}:{}}}async#request(path16,options){let response;try{throwIfAborted(options.signal);response=await this.#fetch(new URL(path16,this.#origin),{headers:{Accept:"application/json",Authorization:`Bearer ${this.#accessToken}`,"Cache-Control":"no-store",...options.headers,...options.body===void 0?{}:{"Content-Type":"application/json"}},method:options.method,redirect:"error",signal:this.#requestSignal(options.signal),...options.body===void 0?{}:{body:JSON.stringify(options.body)}})}catch(error51){if(options.signal?.aborted)throw error51;throw new SkillError("NETWORK_UNREACHABLE","Cannot reach the Skill Knowledge service",{exitCode:exitCodes.networkUnreachable})}if(response.redirected||response.status>=300&&response.status<400){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service redirect was rejected",{exitCode:exitCodes.internalError})}const payload=await response.json().catch(()=>void 0);if(!response.ok){const problem=problemSchema2.safeParse(payload);throw httpError(response.status,problem.success?problem.data.code:"unknown",problem.success?problem.data.data:void 0)}return payload}#mutationPath(input){return`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents/${encodeURIComponent(input.documentId)}`}#mutationHeaders(input){return{"Idempotency-Key":input.idempotencyKey,"If-Match":`"document.${input.documentId}.v${input.expectedVersion}"`}}async#multipartRequest(path16,body,idempotencyKey,signal){let response;try{throwIfAborted(signal);response=await this.#fetch(new URL(path16,this.#origin),{headers:{Accept:"application/json",Authorization:`Bearer ${this.#accessToken}`,"Cache-Control":"no-store","Idempotency-Key":idempotencyKey},method:"POST",redirect:"error",signal:this.#requestSignal(signal),body})}catch(error51){if(signal?.aborted)throw error51;throw new SkillError("NETWORK_UNREACHABLE","Cannot reach the Skill Knowledge service",{exitCode:exitCodes.networkUnreachable})}if(response.redirected||response.status>=300&&response.status<400){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service redirect was rejected",{exitCode:exitCodes.internalError})}const payload=await response.json().catch(()=>void 0);if(!response.ok){const problem=problemSchema2.safeParse(payload);throw httpError(response.status,problem.success?problem.data.code:"unknown",problem.success?problem.data.data:void 0)}return payload}#requestSignal(signal){const timeout=AbortSignal.timeout(this.#timeoutMs);return signal?AbortSignal.any([signal,timeout]):timeout}#parse(schema,payload){const parsed=schema.safeParse(payload);if(parsed.success)return parsed.data;throw new SkillError("INVALID_RESPONSE","Skill Knowledge service returned an incompatible response",{exitCode:exitCodes.internalError})}};function parseInteger(value){return Number.parseInt(value,10)}function parsePositiveInteger(value){const parsed=Number.parseInt(value,10);if(!Number.isSafeInteger(parsed)||parsed<=0){throw new CliError("INVALID_ARGUMENT","\u53C2\u6570\u5FC5\u987B\u662F\u6B63\u6574\u6570",{exitCode:exitCodes.invalidArgument})}return parsed}function parseNonNegativeInteger(value){const parsed=Number.parseInt(value,10);if(!Number.isSafeInteger(parsed)||parsed<0){throw new CliError("INVALID_ARGUMENT","\u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6574\u6570",{exitCode:exitCodes.invalidArgument})}return parsed}function parseAgent(value){if(value==="codex"||value==="claude-code"){return value}throw new CliError("INVALID_ARGUMENT",`Unsupported Agent: ${value}`,{exitCode:exitCodes.invalidArgument,hint:"Choose codex or claude-code."})}function parseEnterpriseAgent(value){if(value==="codex"||value==="claude-code"||value==="workbuddy"){return value}throw new CliError("INVALID_ARGUMENT",`\u4E0D\u652F\u6301\u7684 Agent\uFF1A${value}`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u9009\u62E9 codex\u3001claude-code \u6216 workbuddy\u3002"})}function parseCredentialStore(value){if(value==="keychain"||value==="file")return value;throw new CliError("INVALID_ARGUMENT",`\u4E0D\u652F\u6301\u7684\u51ED\u636E\u5B58\u50A8\uFF1A${value}`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u9009\u62E9 keychain \u6216 file\u3002"})}function resolveEnterpriseSkillAgent(positional,option){if(positional&&option&&positional!==option){throw new CliError("INVALID_ARGUMENT","\u4F4D\u7F6E\u53C2\u6570 Agent \u4E0E --agent \u6307\u5B9A\u7684 Agent \u4E0D\u4E00\u81F4",{exitCode:exitCodes.invalidArgument})}const agent=option??positional;if(!agent){throw new CliError("INVALID_ARGUMENT","\u8BF7\u4F7F\u7528 --agent \u6307\u5B9A Agent",{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u9009\u62E9 codex\u3001claude-code \u6216 workbuddy\u3002"})}return agent}function parseMcpToolArguments(value){try{const parsed=JSON.parse(value);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed)){throw new Error("not an object")}return parsed}catch(cause){throw new CliError("INVALID_ARGUMENT","--arguments-json \u5FC5\u987B\u662F\u4E00\u4E2A JSON \u5BF9\u8C61",{exitCode:exitCodes.invalidArgument,cause})}}function collect(value,previous){return[...previous,value]}function commandOptions2(program2){return program2.opts()}var skillWriters=new WeakMap;function skillOperation(program2){const[command,subcommand,action]=program2.args;if(command==="auth"||command==="skill"&&subcommand==="auth"){return"auth"}if(command==="skill"&&subcommand==="knowledge"){if(action==="upload"||action==="upload-status")return"upload";if(action==="ask")return"search";return"document"}if(command==="search")return"search";if(command==="document"&&(subcommand==="upload"||subcommand==="upload-status")){return"upload"}if(command==="mcp"||command==="agent")return"install";if(command==="document"||command==="knowledge")return"document";return"install"}function skillData(program2,data){const base=data&&typeof data==="object"&&!Array.isArray(data)?data:Array.isArray(data)?{items:data}:{value:data};if(program2.args[0]==="knowledge"){return{resource:"knowledge_base",...base}}return base}function commandOutputIsNdjson(arguments_){return arguments_.some((argument,index)=>argument==="--output=ndjson"||argument==="--output"&&arguments_[index+1]==="ndjson")}function skillOperationId(){return`cli-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function skillEvent(program2,event,data,error51,operationId=skillOperationId()){return{schema:"sag.skill.ndjson.v1",operation:skillOperation(program2),event,operation_id:operationId,timestamp:new Date().toISOString(),...data?{data}:{},...error51?{error:error51}:{}}}function emit(program2,dependencies,data){const options=commandOptions2(program2);if(options.output==="ndjson"){skillWriters.get(program2)?.complete(skillEvent(program2,"completed",skillData(program2,data)));return}dependencies.writeStdout(options.json?renderJson(success4(data)):renderHuman(data,options.quiet??false))}async function runtime(program2,dependencies){const options=commandOptions2(program2);return createRuntimeContext({options:{...options.url?{url:options.url}:{},...options.profile?{profile:options.profile}:{}},environment:dependencies.environment,configStore:dependencies.configStore,credentialStore:dependencies.credentialStore,createClient:dependencies.createClient})}function localMcpRuntime(dependencies){if(!dependencies.localMcp){throw new CliError("DEPENDENCY_MISSING","Local MCP runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return dependencies.localMcp}function enterpriseMcpRuntime(dependencies){if(!dependencies.enterpriseMcp){throw new CliError("DEPENDENCY_MISSING","\u4F01\u4E1A MCP \u8FD0\u884C\u73AF\u5883\u4E0D\u53EF\u7528",{exitCode:exitCodes.dependencyMissing})}return dependencies.enterpriseMcp}function enterpriseMcpCommandRuntime(dependencies,timeoutMs){return{...enterpriseMcpRuntime(dependencies),cliVersion:dependencies.version,timeoutMs}}function skillInstallerRuntime(dependencies){if(!dependencies.skill){throw new CliError("DEPENDENCY_MISSING","SAG Knowledge Skill runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return dependencies.skill}function skillAccountAuthRuntime(dependencies){const runtime2=dependencies.skillAccount;if(!runtime2){throw new CliError("DEPENDENCY_MISSING","SAG account authorization runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return runtime2}function skillAccountKnowledgeRuntime(dependencies){const account=dependencies.skillAccount;if(!account){throw new CliError("DEPENDENCY_MISSING","SAG account Knowledge runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return{auth:skillAccountAuthRuntime(dependencies),createId:import_node_crypto13.randomUUID,config:account.config,createClient:dependencies.createSkillKnowledgeClient??(options=>new SkillKnowledgeHttpClient(options))}}function skillAccountUploadRuntime(dependencies){return{...skillAccountKnowledgeRuntime(dependencies),now:()=>new Date,sleep:async milliseconds=>new Promise(resolve=>setTimeout(resolve,milliseconds))}}function emitSkillAccountUpload(program2,dependencies,events){if(commandOptions2(program2).output!=="ndjson"){emit(program2,dependencies,{events});return}const operationId=skillOperationId();const writer=skillWriters.get(program2);events.forEach((event,index)=>{const data={import_id:event.importId,...event.documentId?{document_id:event.documentId}:{},...event.jobId?{job_id:event.jobId}:{},...event.failure?{failure:event.failure}:{}};const frame=skillEvent(program2,event.event,data,void 0,operationId);if(index===events.length-1)writer?.complete(frame);else writer?.emit(frame)})}function emitSkillAccountUploadStatus(program2,dependencies,status2){if(commandOptions2(program2).output!=="ndjson"){emitSkillAccountUpload(program2,dependencies,[status2]);return}skillWriters.get(program2)?.complete(skillEvent(program2,"completed",{import_id:status2.importId,state:status2.event,...status2.documentId?{document_id:status2.documentId}:{},...status2.jobId?{job_id:status2.jobId}:{},...status2.failure?{failure:status2.failure}:{}}))}async function resolveSkillOrigin(dependencies,explicitOrigin,promptWhenMissing=false){if(explicitOrigin)return normalizeSkillOrigin(explicitOrigin);const runtime2=dependencies.skillAccount;if(!runtime2){throw new CliError("DEPENDENCY_MISSING","SAG account authorization runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}const current=(await runtime2.config.load()).currentOrigin;if(current)return normalizeSkillOrigin(current);if(promptWhenMissing&&dependencies.promptSkillOrigin){return normalizeSkillOrigin(await dependencies.promptSkillOrigin())}throw new SkillError("AUTH_REQUIRED","SAG address is required",{exitCode:exitCodes.authRequired,details:{required_option:"--origin"}})}var ReportedSkillTargetFailure=class extends Error{constructor(exitCode){super("Skill target operation completed with errors");this.exitCode=exitCode}exitCode};function emitSkillTargets(program2,dependencies,report,options={}){if(commandOptions2(program2).output!=="ndjson"){emit(program2,dependencies,report);return}const writer=skillWriters.get(program2);const operationId=options.operationId??skillOperationId();for(const target of report.targets){const failed3=target.status==="failed"||target.status==="conflict";writer?.emit(skillEvent(program2,failed3?"target_failed":"target_completed",{agent:target.agent,target:target.target,status:target.status,...target.version?{version:target.version}:{},...target.package?{package:target.package}:{},...target.code?{code:target.code}:{}},void 0,operationId))}const terminal=options.terminal??true;const summary={package:report.package,version:report.version,target_count:report.targets.length};if(!terminal&&(!report.completedWithErrors||options.progressOnErrors)){writer?.emit(skillEvent(program2,options.progressEvent??"installation_completed",options.progressData??summary,void 0,operationId));return}writer?.complete(skillEvent(program2,report.completedWithErrors?"completed_with_errors":"completed",options.terminalData??summary,void 0,operationId))}async function executeSkillTargets(program2,dependencies,report){const resolved=await report;emitSkillTargets(program2,dependencies,resolved);if(resolved.completedWithErrors){const conflict6=resolved.targets.some(target=>target.status==="conflict");throw new ReportedSkillTargetFailure(conflict6?exitCodes.configConflict:exitCodes.internalError)}}function rejectEnterpriseProfile(program2){if(!commandOptions2(program2).profile)return;throw new CliError("INVALID_ARGUMENT","\u4F01\u4E1A MCP \u547D\u4EE4\u4E0D\u4F7F\u7528 Profile",{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u79FB\u9664 --profile\uFF1B\u4E2A\u4EBA Profile \u53EA\u7528\u4E8E sag mcp test \u548C sag agent\u3002"})}async function selectedProfileName(program2,dependencies){const options=commandOptions2(program2);if(options.profile){await dependencies.configStore.getProfile(options.profile);return options.profile}return(await dependencies.configStore.load()).currentProfile??"local"}async function selectedServerName(program2,dependencies,explicitName){const profile=await selectedProfileName(program2,dependencies);return{profile,serverName:explicitName??`sag-knowledge-${profile}`}}function addProfileCommands(program2,dependencies){const profile=program2.command("profile").description("Manage SAG profiles");profile.command("add").argument("<name>").argument("<url>").action(async(name,url2)=>{emit(program2,dependencies,await dependencies.configStore.addProfile(name,url2))});profile.command("list").action(async()=>{emit(program2,dependencies,await dependencies.configStore.listProfiles())});profile.command("use").argument("<name>").action(async name=>{emit(program2,dependencies,await dependencies.configStore.useProfile(name))});profile.command("show").argument("[name]").action(async name=>{emit(program2,dependencies,await dependencies.configStore.getProfile(name))});profile.command("remove").argument("<name>").action(async name=>{if(!commandOptions2(program2).yes&&!await dependencies.confirm(`Remove profile ${name}?`)){emit(program2,dependencies,{removed:null,cancelled:true});return}await dependencies.configStore.removeProfile(name);emit(program2,dependencies,{removed:name})})}function addAuthCommands(program2,dependencies){const auth2=program2.command("auth").description("Manage SAG credentials");auth2.command("login").option("--name <name>","SAG user name for the existing local login").action(async options=>{const context=await runtime(program2,dependencies);const result=await login({credentialRef:context.credentialRef,...context.connection.environmentToken?{environmentToken:context.connection.environmentToken}:{},...options.name?{name:options.name}:{},promptName:dependencies.promptName,authenticate:name=>dependencies.createClient({origin:context.connection.url}).login(name),validate:async token=>dependencies.createClient({origin:context.connection.url,token}).me(),store:dependencies.credentialStore});emit(program2,dependencies,result)});auth2.command("status").action(async()=>{const context=await runtime(program2,dependencies);const result=await status({credentialRef:context.credentialRef,...context.connection.environmentToken?{environmentToken:context.connection.environmentToken}:{},validate:async token=>dependencies.createClient({origin:context.connection.url,token}).me(),store:dependencies.credentialStore});emit(program2,dependencies,result)});auth2.command("logout").action(async()=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await logout({credentialRef:context.credentialRef,store:dependencies.credentialStore}))})}function addKnowledgeCommands(program2,dependencies){program2.command("doctor").action(async()=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await runDoctor(context.client,{url:context.connection.url,...context.connection.profileName?{profileName:context.connection.profileName}:{}},dependencies.localMcp?()=>localMcpDoctorChecks(dependencies.localMcp,{timeoutMs:15e3}):void 0))});const source=program2.command("source").description("Inspect SAG sources");source.command("list").action(async()=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await listSources(context.client))});source.command("get").argument("<source-id>").action(async sourceId=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await getSource(context.client,sourceId))});source.command("status").argument("[source-id]").action(async sourceId=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await sourceStatus(context.client,sourceId))});const document=program2.command("document").description("Inspect SAG documents");document.command("list").requiredOption("--source <source-id>").action(async options=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await listDocuments(context.client,options.source))});document.command("get").argument("<document-id>").requiredOption("--source <source-id>").action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await getDocument(context.client,options.source,documentId))});document.command("status").argument("[document-id]").requiredOption("--source <source-id>").action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await documentStatus(context.client,options.source,documentId))});program2.command("search").argument("<query>").option("--source <source-id...>").option("--top-k <number>","Maximum result count",parseInteger).addOption(new Option("--strategy <strategy>").choices(["vector","multi"])).action(async(query,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await searchKnowledge(context.client,query,{...options.source?{sourceIds:options.source}:{},...options.topK!==void 0?{topK:options.topK}:{},...options.strategy?{strategy:options.strategy}:{}}))});program2.command("outline").argument("<document-id>").requiredOption("--source <source-id>").action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await outline(context.client,options.source,documentId))});program2.command("grep").argument("<pattern>").requiredOption("--source <source-id>").option("--limit <number>","Maximum result count",parseInteger).action(async(pattern,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await grep(context.client,options.source,pattern,options.limit))});program2.command("read").argument("<document-id>").requiredOption("--source <source-id>").option("--offset <number>","Starting line (1-based)",parseInteger).option("--limit <number>","Lines to read",parseInteger).action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await read(context.client,options.source,documentId,options.offset,options.limit))});program2.command("get-entity").argument("<name>").requiredOption("--source <source-id>").action(async(name,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await getEntityContext(context.client,options.source,name))})}function addLocalMcpCommands(program2,dependencies){const mcp=program2.command("mcp").description("\u9A8C\u8BC1\u672C\u673A SAG MCP\uFF0C\u5E76\u7BA1\u7406\u4F01\u4E1A SAG MCP \u8FDE\u63A5");mcp.command("test").option("--source-id <source-id>").option("--container <name-or-id>").option("--timeout <milliseconds>","MCP timeout",parsePositiveInteger,15e3).action(async options=>{emit(program2,dependencies,await testLocalMcp(localMcpRuntime(dependencies),{...options.sourceId?{sourceId:options.sourceId}:{},...options.container?{container:options.container}:{},timeoutMs:options.timeout}))});mcp.command("list").description("\u5217\u51FA\u4F01\u4E1A MCP \u8FDE\u63A5").action(async()=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await listConnections(enterpriseMcpCommandRuntime(dependencies,15e3)))});mcp.command("use").description("\u9009\u62E9\u5F53\u524D\u4F01\u4E1A MCP \u8FDE\u63A5").argument("<server>","\u4F01\u4E1A MCP \u8FDE\u63A5\u540D\u79F0").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u5F53\u524D\u8FDE\u63A5").action(async(server,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await useConnection(enterpriseMcpCommandRuntime(dependencies,15e3),{server,dryRun:options.dryRun??false}))});mcp.command("status").description("\u68C0\u67E5\u4F01\u4E1A MCP\u3001Agent \u548C Skill \u72B6\u6001").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).action(async options=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await inspectConnectionStatus(enterpriseMcpCommandRuntime(dependencies,options.timeout),options.server===void 0?{}:{server:options.server}))});mcp.command("tools").description("\u5217\u51FA\u4F01\u4E1A MCP \u5DE5\u5177\u53CA\u98CE\u9669\u5206\u7C7B").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).action(async options=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await listConnectionTools(enterpriseMcpCommandRuntime(dependencies,options.timeout),options.server===void 0?{}:{server:options.server}))});mcp.command("call").description("\u8C03\u7528\u4F01\u4E1A MCP \u5DE5\u5177").argument("<tool>","\u5DE5\u5177\u540D\u79F0").requiredOption("--arguments-json <json>","\u4F20\u7ED9\u5DE5\u5177\u7684 JSON \u5BF9\u8C61").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).action(async(tool,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await callConnectionTool(enterpriseMcpCommandRuntime(dependencies,options.timeout),{...options.server===void 0?{}:{server:options.server},tool,arguments_:parseMcpToolArguments(options.argumentsJson),yes:commandOptions2(program2).yes??false}))});mcp.command("attach").description("\u628A\u4F01\u4E1A MCP \u63A5\u5165\u4E00\u4E2A Agent").argument("<agent>","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").option("--no-skill","\u4E0D\u5B89\u88C5\u4F01\u4E1A SAG MCP Skill").action(async(agent,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await attachConnection(enterpriseMcpCommandRuntime(dependencies,options.timeout),{...options.server===void 0?{}:{server:options.server},agent,yes:commandOptions2(program2).yes??false,dryRun:options.dryRun??false,noSkill:!options.skill,confirm:dependencies.confirm}))});mcp.command("detach").description("\u4ECE\u4E00\u4E2A Agent \u79FB\u9664\u53D7\u7BA1\u4F01\u4E1A MCP").argument("<agent>","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async(agent,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await detachConnection(enterpriseMcpCommandRuntime(dependencies,15e3),{...options.server===void 0?{}:{server:options.server},agent,yes:commandOptions2(program2).yes??false,dryRun:options.dryRun??false,confirm:dependencies.confirm}))});mcp.command("disconnect").description("\u65AD\u5F00\u5E76\u5220\u9664\u4F01\u4E1A MCP \u8FDE\u63A5").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async options=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await disconnectConnection(enterpriseMcpCommandRuntime(dependencies,15e3),{...options.server===void 0?{}:{server:options.server},yes:commandOptions2(program2).yes??false,dryRun:options.dryRun??false,confirm:dependencies.confirm}))});const skill=mcp.command("skill").description("\u7BA1\u7406\u4F01\u4E1A SAG MCP Skill");skill.command("install").description("\u5B89\u88C5\u4F01\u4E1A SAG MCP Skill").argument("[agent]","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--agent <agent>","\u6307\u5B9A codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async(agent,options)=>{rejectEnterpriseProfile(program2);const selectedAgent=resolveEnterpriseSkillAgent(agent,options?.agent);emit(program2,dependencies,await installSkill(enterpriseMcpCommandRuntime(dependencies,15e3),{agent:selectedAgent,yes:commandOptions2(program2).yes??false,dryRun:options?.dryRun??false,confirm:dependencies.confirm}))});skill.command("status").description("\u68C0\u67E5\u4F01\u4E1A SAG MCP Skill").argument("[agent]","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--agent <agent>","\u6307\u5B9A codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).action(async(agent,options)=>{rejectEnterpriseProfile(program2);const selectedAgent=resolveEnterpriseSkillAgent(agent,options?.agent);const statuses=await skillStatus(enterpriseMcpCommandRuntime(dependencies,15e3),{agents:[selectedAgent]});emit(program2,dependencies,statuses[0])});skill.command("uninstall").description("\u5378\u8F7D\u4F01\u4E1A SAG MCP Skill").argument("[agent]","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--agent <agent>","\u6307\u5B9A codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--force","\u5148\u5907\u4EFD\uFF0C\u518D\u5F3A\u5236\u5378\u8F7D\u5DF2\u53D8\u66F4\u7684 Skill").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async(agent,options)=>{rejectEnterpriseProfile(program2);const selectedAgent=resolveEnterpriseSkillAgent(agent,options?.agent);emit(program2,dependencies,await uninstallSkill(enterpriseMcpCommandRuntime(dependencies,15e3),{agent:selectedAgent,yes:commandOptions2(program2).yes??false,force:options?.force??false,dryRun:options?.dryRun??false,confirm:dependencies.confirm}))});mcp.command("connect").description("\u7C98\u8D34\u5E76\u63A5\u5165\u4F01\u4E1A MCP \u8FDE\u63A5").option("--from-stdin","\u4ECE\u6807\u51C6\u8F93\u5165\u8BFB\u53D6 mcpServers JSON").option("--server <server-key>","\u9009\u62E9\u4E00\u4E2A MCP Server\uFF0C\u53EF\u91CD\u590D",collect,[]).option("--agent <agent>","\u63A5\u5165 codex\u3001claude-code \u6216 workbuddy\uFF0C\u53EF\u91CD\u590D",(value,previous)=>[...previous,parseEnterpriseAgent(value)],[]).option("--replace","\u540C\u540D\u4E0D\u540C URL \u65F6\u66FF\u6362\u539F\u8FDE\u63A5").option("--keep-both","\u540C\u540D\u4E0D\u540C URL \u65F6\u4FDD\u7559\u4E24\u4E2A\u8FDE\u63A5").option("--no-skill","\u4E0D\u5B89\u88C5\u4F01\u4E1A SAG MCP Skill").option("--credential-store <keychain|file>","\u51ED\u636E\u4FDD\u5B58\u4F4D\u7F6E",parseCredentialStore,"keychain").option("--allow-insecure-http","\u5141\u8BB8\u975E\u672C\u673A\u5730\u5740\u4F7F\u7528\u660E\u6587 HTTP").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).option("--dry-run","\u53EA\u9A8C\u8BC1\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async options=>{rejectEnterpriseProfile(program2);if(options.replace&&options.keepBoth){throw new CliError("INVALID_ARGUMENT","--replace \u4E0E --keep-both \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528",{exitCode:exitCodes.invalidArgument})}const interactive=!options.fromStdin&&(dependencies.stdinIsTty??false);let raw;if(options.fromStdin){raw=await dependencies.readStdin()}else if(dependencies.promptMcpJson){raw=await dependencies.promptMcpJson()}else{throw new CliError("DEPENDENCY_MISSING","\u65E0\u6CD5\u8BFB\u53D6\u4F01\u4E1A MCP \u8FDE\u63A5 JSON",{exitCode:exitCodes.dependencyMissing,hint:"\u8BF7\u4F7F\u7528 `sag mcp connect --from-stdin` \u4ECE\u6807\u51C6\u8F93\u5165\u4F20\u5165 JSON\u3002"})}emit(program2,dependencies,await connectEnterpriseMcpCommand({runtime:enterpriseMcpRuntime(dependencies),raw,requestedServers:options.server,requestedAgents:options.agent,credentialStore:options.credentialStore,...options.replace?{collisionAction:"replace"}:options.keepBoth?{collisionAction:"keep-both"}:{},allowInsecureHttp:options.allowInsecureHttp??false,timeoutMs:options.timeout,yes:commandOptions2(program2).yes??false,noSkill:!options.skill,dryRun:options.dryRun??false,interactive,selectMcpServers:async servers=>{if(!dependencies.selectMcpServers){throw new CliError("DEPENDENCY_MISSING","\u65E0\u6CD5\u9009\u62E9 MCP Server",{exitCode:exitCodes.dependencyMissing})}return dependencies.selectMcpServers(servers)},selectAgents:async agents2=>dependencies.selectAgents?dependencies.selectAgents(agents2):[],selectCollisionAction:async collision=>{if(!dependencies.selectCollisionAction){throw new CliError("DEPENDENCY_MISSING","\u65E0\u6CD5\u5904\u7406\u540C\u540D MCP \u8FDE\u63A5",{exitCode:exitCodes.dependencyMissing})}return dependencies.selectCollisionAction(collision)}}))})}function addAgentCommands(program2,dependencies){const agent=program2.command("agent").description("Manage Agent MCP connections");agent.command("list").action(async()=>{emit(program2,dependencies,await listAgentHosts(localMcpRuntime(dependencies)))});agent.command("connect").argument("<agent>","codex or claude-code",parseAgent).option("--source-id <source-id>").option("--container <name-or-id>").option("--name <server-name>").option("--timeout <milliseconds>","MCP timeout",parsePositiveInteger,15e3).option("--dry-run","Show the plan without changing configuration").action(async(agentId,options)=>{const selection=await selectedServerName(program2,dependencies,options.name);emit(program2,dependencies,await connectLocalAgent(localMcpRuntime(dependencies),{agent:agentId,serverName:selection.serverName,profile:selection.profile,...options.sourceId?{sourceId:options.sourceId}:{},...options.container?{container:options.container}:{},timeoutMs:options.timeout,dryRun:options.dryRun??false,yes:commandOptions2(program2).yes??false,confirm:dependencies.confirm,now:()=>new Date}))});agent.command("status").argument("[agent]","codex or claude-code",parseAgent).option("--name <server-name>").action(async(agentId,options)=>{const selection=await selectedServerName(program2,dependencies,options.name);emit(program2,dependencies,await statusLocalAgents(localMcpRuntime(dependencies),{...agentId?{agent:agentId}:{},serverName:selection.serverName}))});agent.command("disconnect").argument("<agent>","codex or claude-code",parseAgent).option("--name <server-name>").action(async(agentId,options)=>{const selection=await selectedServerName(program2,dependencies,options.name);emit(program2,dependencies,await disconnectLocalAgent(localMcpRuntime(dependencies),{agent:agentId,serverName:selection.serverName,yes:commandOptions2(program2).yes??false,confirm:dependencies.confirm}))})}function addSkillCommands(program2,dependencies){const skill=program2.command("skill").description("Install and manage the SAG Knowledge Skill");const selectedAgents=(value,previous)=>[...previous,parseEnterpriseAgent(value)];const addInstall=(name,description)=>{const command=skill.command(name).description(description).option("--agent <agent>","Target codex, claude-code, or workbuddy",selectedAgents,[]);command.option("--origin <origin>","Full SAG HTTP or HTTPS Origin");command.action(async options=>{if(options.origin){const account=dependencies.skillAccount;if(!account){throw new CliError("DEPENDENCY_MISSING","SAG account configuration is unavailable",{exitCode:exitCodes.dependencyMissing})}await account.config.setCurrentOrigin(options.origin)}await executeSkillTargets(program2,dependencies,installSkillTargets(skillInstallerRuntime(dependencies),{...options.agent.length?{agents:options.agent}:{},yes:commandOptions2(program2).yes??false,update:name==="update"}))})};addInstall("install","Install SAG Knowledge for every detected Agent");addInstall("update","Resolve the running @latest package and update managed Skills");const auth2=skill.command("auth").description("Authorize one SAG account Origin");auth2.command("login").description("Open browser approval and authorize the current SAG account").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin,true);emit(program2,dependencies,await authorizeSkillAccount(skillAccountAuthRuntime(dependencies),origin))});auth2.command("status").description("Inspect the saved SAG account authorization").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);const account=await skillAccountAuthRuntime(dependencies).config.getAccount(origin);emit(program2,dependencies,{authenticated:Boolean(account),origin,...account?{user:account.user}:{}})});auth2.command("logout").description("Revoke and remove the saved SAG account authorization").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);const removed=await logoutSkillAccount(skillAccountAuthRuntime(dependencies),origin);emit(program2,dependencies,{origin,removed})});const accountKnowledge=skill.command("knowledge").description("Use Knowledge Bases available to the authorized SAG account");accountKnowledge.command("list").description("List Knowledge Bases available to the current SAG account").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await listSkillAccountKnowledgeBases(skillAccountKnowledgeRuntime(dependencies),origin))});accountKnowledge.command("documents").description("List documents in one exact Knowledge Base").requiredOption("--knowledge-base <id-or-alias-or-name>","Exact Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await listSkillAccountDocuments(skillAccountKnowledgeRuntime(dependencies),origin,options.knowledgeBase))});accountKnowledge.command("ask").description("Ask SAG and relay its answer and citations").argument("<question>","Question for SAG").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").option("--knowledge-base <id-or-alias-or-name>","Optional exact Knowledge Base scope; omit for SAG global search").action(async(question,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await askSkillAccountKnowledge(skillAccountKnowledgeRuntime(dependencies),origin,question,options.knowledgeBase))});accountKnowledge.command("upload").description("Upload one regular file to an exact Knowledge Base").argument("<file>","One regular file").requiredOption("--knowledge-base <id-or-alias-or-name>","Confirmed Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").option("--wait <milliseconds>","Use 0 to detach after acceptance",parseNonNegativeInteger).option("--overwrite-document-id <document-id>","Existing document ID returned by a duplicate upload conflict").action(async(filePath,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);const events=await uploadSkillAccountFile(skillAccountUploadRuntime(dependencies),origin,filePath,options.knowledgeBase,options.wait,options.overwriteDocumentId);emitSkillAccountUpload(program2,dependencies,events)});accountKnowledge.command("upload-status").description("Read upload progress using the returned import ID").argument("<import-id>","Import ID returned by upload").requiredOption("--knowledge-base <id-or-alias-or-name>","Exact Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async(importId,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emitSkillAccountUploadStatus(program2,dependencies,await inspectSkillAccountUpload(skillAccountUploadRuntime(dependencies),origin,importId,options.knowledgeBase))});accountKnowledge.command("rename").description("Rename one exact document version").argument("<document-id>","Exact document ID").requiredOption("--title <title>","New document title").requiredOption("--expected-version <version>","Current document version",parsePositiveInteger).requiredOption("--knowledge-base <id-or-alias-or-name>","Confirmed Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async(documentId,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await renameSkillAccountDocument(skillAccountKnowledgeRuntime(dependencies),origin,{knowledgeBase:options.knowledgeBase,documentId,expectedVersion:options.expectedVersion,title:options.title}))});accountKnowledge.command("delete").description("Move one exact document version to the recoverable recycle bin").argument("<document-id>","Exact document ID").requiredOption("--expected-version <version>","Current document version",parsePositiveInteger).requiredOption("--knowledge-base <id-or-alias-or-name>","Confirmed Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async(documentId,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await deleteSkillAccountDocument(skillAccountKnowledgeRuntime(dependencies),origin,{knowledgeBase:options.knowledgeBase,documentId,expectedVersion:options.expectedVersion}))});skill.command("status").description("Inspect managed SAG Knowledge Skill targets").option("--agent <agent>","Target codex, claude-code, or workbuddy",selectedAgents,[]).action(async options=>{emitSkillTargets(program2,dependencies,await inspectSkillTargets(skillInstallerRuntime(dependencies),{...options.agent.length?{agents:options.agent}:{}}))});skill.command("uninstall").description("Remove unchanged SAG CLI-managed Skills").option("--agent <agent>","Target codex, claude-code, or workbuddy",selectedAgents,[]).action(async options=>{await executeSkillTargets(program2,dependencies,uninstallSkillTargets(skillInstallerRuntime(dependencies),{...options.agent.length?{agents:options.agent}:{},yes:commandOptions2(program2).yes??false}))})}function createProgram(dependencies){const program2=new Command;skillWriters.set(program2,new SkillEventWriter(dependencies.writeStdout));program2.name("sag").description("Command-line client and diagnostics for SAG").showHelpAfterError().exitOverride().option("--json","Output a stable JSON envelope").addOption(new Option("--output <format>","Output format").choices(["human","ndjson"]).conflicts("json")).option("--quiet","Output only essential values").option("--profile <name>","Use a configured SAG profile").option("--url <origin>","Use a SAG origin without saving it").option("--yes","Confirm safe local configuration changes").configureOutput({writeOut:dependencies.writeStdout,writeErr:dependencies.writeStderr});program2.command("version").action(()=>{const options=commandOptions2(program2);if(options.output==="ndjson"){skillWriters.get(program2)?.complete(skillEvent(program2,"completed",{name:"sag",version:dependencies.version}))}else if(options.json){dependencies.writeStdout(renderJson(success4({name:"sag",version:dependencies.version})))}else{dependencies.writeStdout(`sag ${dependencies.version}
|
|
156
|
+
`,"utf8");await validateBundle(temporary,agent);replacementFingerprint=await fingerprintDirectory(temporary);await runtime2.agents[agent].installSkill?.();if(hadTarget){backup=sibling(target,"backup");await moveTarget(runtime2,target,backup)}await moveTarget(runtime2,temporary,target);if(await fingerprintDirectory(target)!==replacementFingerprint){throw new Error("Skill target changed during installation")}const managed={agent,target,version:source.packageVersion,fingerprint:replacementFingerprint,...backup?{backupPath:backup}:{}};await runtime2.state.saveManagedSkill(managed);return{agent,target,status:hadTarget?"updated":"created",version:source.packageVersion,package:source.package,message:"Skill installed."}}catch{const restored=await restore({runtime:runtime2,target,temporary,...backup?{backup}:{},hadTarget,...replacementFingerprint?{replacementFingerprint}:{}}).catch(()=>false);return{agent,target,status:"failed",message:restored?"Skill installation failed and this target was restored.":"Skill installation failed and recovery was incomplete."}}}))}catch(error51){if(!(error51 instanceof SkillTargetLeaseError))throw error51;targets.push({agent,target,status:"conflict",code:"INSTALL_TARGET_CONFLICT",message:"Skill target is busy; wait for the active SAG CLI operation and retry."})}}return{package:source.package,version:source.packageVersion,targets,completedWithErrors:targets.some(target=>["failed","conflict"].includes(target.status))}}finally{await resolved?.cleanup()}}async function uninstallSkillTargets(runtime2,input){const source=await validateBundle(runtime2.bundlePath??bundledSkillPath2(),"template");const selected=await activeAgents(runtime2,input.agents);if(!await requireConfirmation(runtime2,input,"Uninstall")){return{package:source.package,version:source.packageVersion,targets:selected.map(agent=>({agent,target:skillTargetPath(agent,runtime2),status:"skipped",message:"Uninstall was not confirmed."})),completedWithErrors:false}}const targets=[];for(const agent of selected){const target=skillTargetPath(agent,runtime2);assertUserTarget(target,agent,runtime2);try{targets.push(await withTargetLease(target,async()=>{const inspection=await inspectOne(runtime2,agent,input.agents!==void 0);if(inspection.status==="missing")return inspection;if(inspection.status!=="installed"){return{...inspection,status:"conflict",code:"INSTALL_TARGET_CONFLICT"}}const removed=sibling(inspection.target,"remove");const managed=await runtime2.state.getManagedSkill(agent,inspection.target);try{await moveTarget(runtime2,inspection.target,removed);await runtime2.state.deleteManagedSkill(agent,inspection.target);await removeTarget(runtime2,removed);return{agent,target:inspection.target,status:"removed",...inspection.version?{version:inspection.version}:{},package:source.package,message:"Managed Skill was removed."}}catch{const recovery=managed&&await exists2(removed)?await recoverUninstall({runtime:runtime2,agent,target:inspection.target,removed,managed}):"incomplete";return{agent,target:inspection.target,status:"failed",message:recovery==="restored"?"Skill uninstall failed; target and managed state were restored.":recovery==="active-unmanaged"?"Skill uninstall failed; recovery is incomplete and the active target is unmanaged.":"Skill uninstall failed and recovery was incomplete."}}}))}catch(error51){if(!(error51 instanceof SkillTargetLeaseError))throw error51;targets.push({agent,target,status:"conflict",code:"INSTALL_TARGET_CONFLICT",message:"Skill target is busy; wait for the active SAG CLI operation and retry."})}}return{package:source.package,version:source.packageVersion,targets,completedWithErrors:targets.some(target=>["failed","conflict"].includes(target.status))}}var skillInstallerExitCode=exitCodes.configConflict;var import_node_crypto11=require("crypto");var import_promises13=require("timers/promises");async function authorizeSkillAccount(runtime2,origin){const normalizedOrigin=normalizeSkillOrigin(origin);const random2=runtime2.randomBytes??import_node_crypto11.randomBytes;const verifier=random2(32).toString("base64url");const challenge=(0,import_node_crypto11.createHash)("sha256").update(verifier).digest("base64url");const session=await runtime2.client.createLoginSession(normalizedOrigin,challenge);await runtime2.openBrowser(session.verificationUrl);const sleep2=runtime2.sleep??import_promises13.setTimeout;for(;;){if(runtime2.now().getTime()>=new Date(session.expiresAt).getTime()){throw expiredAuthorization()}const current=await runtime2.client.getLoginSession(normalizedOrigin,session.sessionId);if(current.status==="denied"){throw new SkillError("PERMISSION_DENIED","SAG account authorization was denied",{exitCode:exitCodes.permissionDenied})}if(current.status==="consumed")throw expiredAuthorization();if(current.status==="approved"){const account=await runtime2.client.exchange(normalizedOrigin,{sessionId:session.sessionId,pkceVerifier:verifier});await runtime2.config.saveAccount(normalizedOrigin,account);return{origin:normalizedOrigin,account,browserOpened:true}}await sleep2(1e3)}}async function withFreshSkillAccount(runtime2,origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);const current=await requireAccount(runtime2,normalizedOrigin);if(isFuture(current.accessExpiresAt,runtime2.now())){return operation(current.accessToken)}const accessToken=await runtime2.config.withRefreshLock(normalizedOrigin,async()=>{const latest=await requireAccount(runtime2,normalizedOrigin);if(isFuture(latest.accessExpiresAt,runtime2.now()))return latest.accessToken;if(!isFuture(latest.refreshExpiresAt,runtime2.now())){await runtime2.config.removeAccount(normalizedOrigin);throw expiredAuthorization()}try{const rotated=await runtime2.client.refresh(normalizedOrigin,latest.refreshToken);const next={...rotated,...latest.recentKnowledgeBase&&!rotated.recentKnowledgeBase?{recentKnowledgeBase:latest.recentKnowledgeBase}:{}};await runtime2.config.saveAccount(normalizedOrigin,next);return next.accessToken}catch(error51){if(error51 instanceof SkillError&&(error51.code==="AUTH_EXPIRED"||error51.code==="AUTH_REQUIRED")){await runtime2.config.removeAccount(normalizedOrigin)}throw error51}});return operation(accessToken)}async function withSkillAuthorization(runtime2,origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);const authorization=runtime2.config.getAuthorization?await runtime2.config.getAuthorization(normalizedOrigin):null;if(authorization&&"kind"in authorization)return operation(authorization.token);return withFreshSkillAccount(runtime2,normalizedOrigin,operation)}async function logoutSkillAccount(runtime2,origin){const normalizedOrigin=normalizeSkillOrigin(origin);const authorization=runtime2.config.getAuthorization?await runtime2.config.getAuthorization(normalizedOrigin):null;if(authorization&&"kind"in authorization){await runtime2.config.removeAccount(normalizedOrigin);return true}const account=await runtime2.config.getAccount(normalizedOrigin);if(!account)return false;await runtime2.client.logout(normalizedOrigin,account.accessToken,account.refreshToken);await runtime2.config.removeAccount(normalizedOrigin);return true}async function requireAccount(runtime2,origin){const account=await runtime2.config.getAccount(origin);if(account)return account;throw new SkillError("AUTH_REQUIRED","SAG account authorization is required",{exitCode:exitCodes.authRequired})}function isFuture(value,now){return new Date(value).getTime()>now.getTime()}function expiredAuthorization(){return new SkillError("AUTH_EXPIRED","SAG account authorization has expired",{exitCode:exitCodes.authRequired})}async function renameSkillAccountDocument(runtime2,origin,input){const knowledgeBase=await selectedKnowledgeBase(runtime2,origin,input.knowledgeBase);const renamed=await withSkillAccountKnowledgeClient(runtime2,origin,client=>client.renameDocument({knowledgeBaseId:knowledgeBase.id,documentId:input.documentId,expectedVersion:input.expectedVersion,idempotencyKey:runtime2.createId(),title:input.title}));await remember(runtime2,origin,knowledgeBase);return renamed}async function deleteSkillAccountDocument(runtime2,origin,input){const knowledgeBase=await selectedKnowledgeBase(runtime2,origin,input.knowledgeBase);const deleted=await withSkillAccountKnowledgeClient(runtime2,origin,client=>client.deleteDocument({knowledgeBaseId:knowledgeBase.id,documentId:input.documentId,expectedVersion:input.expectedVersion,idempotencyKey:runtime2.createId()}));await remember(runtime2,origin,knowledgeBase);return deleted}async function listSkillAccountKnowledgeBases(runtime2,origin){return withSkillAccountKnowledgeClient(runtime2,origin,client=>client.listKnowledgeBases())}async function listSkillAccountDocuments(runtime2,origin,selector){const normalizedOrigin=normalizeSkillOrigin(origin);const knowledgeBases=await listSkillAccountKnowledgeBases(runtime2,normalizedOrigin);const knowledgeBase=resolveKnowledgeBase(knowledgeBases,selector);const documents=await withSkillAccountKnowledgeClient(runtime2,normalizedOrigin,client=>client.listDocuments(knowledgeBase.id));await runtime2.config.saveRecentKnowledgeBase(normalizedOrigin,{id:knowledgeBase.id,name:knowledgeBase.name});return{knowledgeBase,documents}}async function askSkillAccountKnowledge(runtime2,origin,question,selector){const normalizedOrigin=normalizeSkillOrigin(origin);let knowledgeBase;if(selector){knowledgeBase=resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,normalizedOrigin),selector)}const answer=await withSkillAccountKnowledgeClient(runtime2,normalizedOrigin,client=>{if(!client.ask){throw new SkillError("PLATFORM_UNAVAILABLE","SAG account question answering is unavailable",{exitCode:exitCodes.serviceNotReady})}return client.ask(question,knowledgeBase?.id)});if(knowledgeBase){await runtime2.config.saveRecentKnowledgeBase(normalizedOrigin,{id:knowledgeBase.id,name:knowledgeBase.name})}return answer}function resolveKnowledgeBase(knowledgeBases,selector){const exactId=knowledgeBases.find(item=>item.id===selector);if(exactId)return exactId;const exactAlias=knowledgeBases.filter(item=>item.alias===selector);if(exactAlias.length===1)return exactAlias[0];const normalized=selector.trim().toLocaleLowerCase();const names=knowledgeBases.filter(item=>item.name.toLocaleLowerCase()===normalized);if(names.length===1)return names[0];throw new SkillError("INVALID_ARGUMENT",names.length>1?"Knowledge Base name is ambiguous":"Knowledge Base was not found",{details:{selector},exitCode:exitCodes.invalidArgument})}async function selectedKnowledgeBase(runtime2,origin,selector){return resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,origin),selector)}async function remember(runtime2,origin,knowledgeBase){await runtime2.config.saveRecentKnowledgeBase(origin,{id:knowledgeBase.id,name:knowledgeBase.name})}async function withSkillAccountKnowledgeClient(runtime2,origin,operation){const normalizedOrigin=normalizeSkillOrigin(origin);return withSkillAuthorization(runtime2.auth,normalizedOrigin,accessToken=>operation(runtime2.createClient({accessToken,origin:normalizedOrigin})))}var import_node_crypto12=require("crypto");var import_node_fs=require("fs");var import_promises14=require("fs/promises");var import_node_path15=__toESM(require("path"),1);var DEFAULT_MAX_UPLOAD_BYTES=25*1024*1024;async function uploadSkillAccountFile(runtime2,origin,filePath,knowledgeBaseSelector,waitMs=30*60*1e3,overwriteDocumentId){const file2=await inspectFile(filePath);const knowledgeBase=resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,origin),knowledgeBaseSelector);const serverLimit=await withSkillAccountKnowledgeClient(runtime2,origin,client=>{if(!client.getServerLimit)return Promise.resolve(void 0);return client.getServerLimit(knowledgeBase.id)});const limit=Math.min(DEFAULT_MAX_UPLOAD_BYTES,serverLimit??DEFAULT_MAX_UPLOAD_BYTES);if(file2.size>limit){throw new SkillError("FILE_TOO_LARGE",`This file exceeds the ${limit}-byte Knowledge Base upload limit.`,{details:{limit_bytes:limit,size_bytes:file2.size},exitCode:exitCodes.invalidArgument})}const digest2=await sha256(filePath);const receipt=await withSkillAccountKnowledgeClient(runtime2,origin,client=>{if(!client.upload)return unavailableUpload();return client.upload({fileDigest:digest2,fileName:file2.name,filePath,fileSize:file2.size,idempotencyKey:runtime2.createId(),knowledgeBaseId:knowledgeBase.id,...overwriteDocumentId?{overwriteDocumentId}:{}})});const accepted={event:"accepted",importId:receipt.importId,documentId:receipt.documentId,jobId:receipt.jobId};await runtime2.onEvent?.(accepted);if(waitMs===0){const detached={...accepted,event:"detached"};await runtime2.onEvent?.(detached);return[accepted,detached]}const terminal=await poll(runtime2,origin,knowledgeBase.id,receipt.importId,waitMs);return[accepted,terminal]}async function inspectSkillAccountUpload(runtime2,origin,importId,knowledgeBaseSelector){const knowledgeBase=resolveKnowledgeBase(await listSkillAccountKnowledgeBases(runtime2,origin),knowledgeBaseSelector);return readStatus(runtime2,origin,knowledgeBase.id,importId)}async function poll(runtime2,origin,knowledgeBaseId,importId,waitMs){const startedAt=runtime2.now().getTime();for(;;){const event=await readStatus(runtime2,origin,knowledgeBaseId,importId);await runtime2.onEvent?.(event);if(event.event!=="processing")return event;if(runtime2.now().getTime()-startedAt>=waitMs){const detached={event:"detached",importId};await runtime2.onEvent?.(detached);return detached}await runtime2.sleep(2e3)}}async function readStatus(runtime2,origin,knowledgeBaseId,importId){const current=await withSkillAccountKnowledgeClient(runtime2,origin,client=>{if(!client.getImportStatus)return unavailableUpload();return client.getImportStatus(knowledgeBaseId,importId)});return{event:current.searchable?"completed":current.state==="failed"?"failed":"processing",importId,...current.failure?{failure:current.failure}:{}}}async function inspectFile(filePath){let metadata;try{metadata=await(0,import_promises14.stat)(filePath)}catch{throw new SkillError("FILE_NOT_FOUND","The upload file could not be found.",{exitCode:exitCodes.invalidArgument})}if(!metadata.isFile()){throw new SkillError("UNSUPPORTED_FILE_TYPE","Upload accepts one regular file, not a directory or batch.",{exitCode:exitCodes.invalidArgument})}return{name:import_node_path15.default.basename(filePath),size:metadata.size}}async function sha256(filePath){const digest2=(0,import_node_crypto12.createHash)("sha256");for await(const chunk of(0,import_node_fs.createReadStream)(filePath))digest2.update(chunk);return`sha256:${digest2.digest("hex")}`}function unavailableUpload(){throw new SkillError("PLATFORM_UNAVAILABLE","SAG upload is unavailable",{exitCode:exitCodes.serviceNotReady})}var import_node_fs2=require("fs");var knowledgeBaseSchema=external_exports.strictObject({alias:external_exports.string().min(1).optional(),id:external_exports.string().min(1),name:external_exports.string().min(1)});var knowledgeBaseDirectorySchema=external_exports.strictObject({items:external_exports.array(knowledgeBaseSchema)});var documentSchema2=external_exports.strictObject({id:external_exports.string().min(1),knowledge_base_id:external_exports.string().min(1),title:external_exports.string().min(1),version:external_exports.number().int().positive()});var documentDirectorySchema=external_exports.strictObject({items:external_exports.array(documentSchema2)});var deletedDocumentSchema=external_exports.strictObject({deleted_at:external_exports.string().datetime({offset:true}),document_id:external_exports.string().min(1),recoverable:external_exports.literal(true),version:external_exports.number().int().positive()});var uploadStateSchema=external_exports.enum(["queued","accepted","processing","completed","failed"]);var uploadResponseSchema=external_exports.strictObject({document_id:external_exports.string().min(1),import_id:external_exports.string().min(1),job_id:external_exports.string().min(1),state:uploadStateSchema});var uploadLimitSchema=external_exports.strictObject({max_upload_bytes:external_exports.number().int().positive()});var importStatusSchema=external_exports.strictObject({failure:external_exports.string().min(1).optional(),searchable:external_exports.boolean(),state:uploadStateSchema});var answerSchema=external_exports.strictObject({answer:external_exports.string().min(1),citations:external_exports.array(external_exports.strictObject({number:external_exports.number().int().positive(),knowledge_base_id:external_exports.string().min(1),document_id:external_exports.string().min(1),document_version_id:external_exports.string().min(1),excerpt:external_exports.string(),location:external_exports.string().min(1).optional()})),search_completeness:external_exports.enum(["complete","partial"]),search_partial_reasons:external_exports.array(external_exports.string().min(1))});var problemSchema2=external_exports.object({code:external_exports.string().min(1),data:external_exports.unknown().optional()}).passthrough();var duplicateImportDetailsSchema=external_exports.object({conflict_type:external_exports.enum(["same_filename_same_checksum","same_filename_changed_checksum"]),existing_document_id:external_exports.string().min(1),existing_import_id:external_exports.string().min(1),existing_filename:external_exports.string().min(1),current_filename:external_exports.string().min(1),checksum_sha256:external_exports.string().min(1),existing_state:external_exports.string().min(1),overwrite_allowed:external_exports.boolean()});function httpError(status2,problemCode,problemData){const normalizedProblemCode=problemCode.toLowerCase();const details={problemCode};if(normalizedProblemCode==="invalid_grant"||normalizedProblemCode==="expired_token"){return new SkillError("AUTH_EXPIRED","SAG account authorization has expired",{exitCode:exitCodes.authRequired,...details})}if(normalizedProblemCode==="open_link_token_invalid"){return new SkillError("AUTH_REQUIRED","The Open Link token is no longer valid. Ask the link administrator for a current token.",{exitCode:exitCodes.authRequired,...details})}if(normalizedProblemCode==="document_title_conflict"){return new SkillError("DOCUMENT_TITLE_CONFLICT","The document title conflicts",{exitCode:exitCodes.configConflict,...details})}if(normalizedProblemCode==="document_import_duplicate"){const details2=duplicateImportDetailsSchema.safeParse(problemData);return new SkillError("DOCUMENT_IMPORT_DUPLICATE","A file with the same name already exists in this Knowledge Base",{...details2.success?{details:details2.data}:{},exitCode:exitCodes.configConflict,problemCode})}if(normalizedProblemCode==="stale_version"){return new SkillError("STALE_VERSION","The document version is stale",{exitCode:exitCodes.configConflict,...details})}if(status2===401){return new SkillError("AUTH_REQUIRED","Skill authorization is required",{exitCode:exitCodes.authRequired,...details})}if(status2===403){return new SkillError("PERMISSION_DENIED","Skill authorization was denied",{exitCode:exitCodes.permissionDenied,...details})}if(status2===404){return new SkillError("DOCUMENT_NOT_FOUND","Skill Knowledge resource was not found",{exitCode:exitCodes.resourceNotFound,...details})}if(status2===409){return new SkillError("CONFIG_CONFLICT","Skill Knowledge request conflicts",{exitCode:exitCodes.configConflict,...details})}if(status2===429){return new SkillError("RATE_LIMITED","Skill Knowledge service rate limit reached",{exitCode:exitCodes.networkUnreachable,...details})}if(status2>=500){return new SkillError("PLATFORM_UNAVAILABLE","Skill Knowledge service is unavailable",{exitCode:exitCodes.serviceNotReady,...details})}return new SkillError("INVALID_RESPONSE","Skill Knowledge service returned an incompatible response",{exitCode:exitCodes.internalError,...details})}function throwIfAborted(signal){if(!signal?.aborted)return;throw signal.reason instanceof Error?signal.reason:new DOMException("The request was interrupted.","AbortError")}var SkillKnowledgeHttpClient=class{#accessToken;#fetch;#origin;#timeoutMs;constructor(options){try{this.#origin=normalizeSkillOrigin(options.origin)}catch{throw new SkillError("CONFIG_CONFLICT","SAG address is invalid",{exitCode:exitCodes.configConflict})}if(!options.accessToken){throw new SkillError("AUTH_REQUIRED","Skill authorization is required",{exitCode:exitCodes.authRequired})}this.#accessToken=options.accessToken;this.#fetch=options.fetchImplementation??fetch;this.#timeoutMs=options.timeoutMs??15e3}async ask(question,knowledgeBaseId){const answer=this.#parse(answerSchema,await this.#request("/api/v1/integrations/skill/v1/questions",{body:{question,...knowledgeBaseId?{knowledge_base_id:knowledgeBaseId}:{}},method:"POST"}));return{answer:answer.answer,citations:answer.citations.map(citation=>({number:citation.number,knowledgeBaseId:citation.knowledge_base_id,documentId:citation.document_id,documentVersionId:citation.document_version_id,excerpt:citation.excerpt,...citation.location?{location:citation.location}:{}})),completeness:answer.search_completeness,partialReasons:answer.search_partial_reasons}}async listKnowledgeBases(){const parsed=await this.#request("/api/v1/integrations/skill/v1/knowledge-bases",{method:"GET"});return this.#parse(knowledgeBaseDirectorySchema,parsed).items.map(knowledgeBase=>({id:knowledgeBase.id,name:knowledgeBase.name,...knowledgeBase.alias?{alias:knowledgeBase.alias}:{}}))}async listDocuments(knowledgeBaseId){const parsed=await this.#request(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/documents`,{method:"GET"});return this.#parse(documentDirectorySchema,parsed).items.map(document=>({id:document.id,knowledgeBaseId:document.knowledge_base_id,title:document.title,version:document.version}))}async renameDocument(input){const document=this.#parse(documentSchema2,await this.#request(this.#mutationPath(input),{body:{title:input.title},headers:this.#mutationHeaders(input),method:"PATCH"}));if(document.id!==input.documentId||document.knowledge_base_id!==input.knowledgeBaseId){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service returned a different document",{exitCode:exitCodes.internalError})}return{id:document.id,knowledgeBaseId:document.knowledge_base_id,title:document.title,version:document.version}}async deleteDocument(input){const deleted=this.#parse(deletedDocumentSchema,await this.#request(this.#mutationPath(input),{headers:this.#mutationHeaders(input),method:"DELETE"}));if(deleted.document_id!==input.documentId){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service returned a different document",{exitCode:exitCodes.internalError})}return{deletedAt:deleted.deleted_at,documentId:deleted.document_id,recoverable:deleted.recoverable,version:deleted.version}}async getServerLimit(knowledgeBaseId,signal){return this.#parse(uploadLimitSchema,await this.#request(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/upload-limit`,{method:"GET",...signal?{signal}:{}})).max_upload_bytes}async upload(input,signal){throwIfAborted(signal);const form=new FormData;form.set("file",await(0,import_node_fs2.openAsBlob)(input.filePath),input.fileName);if(input.overwriteDocumentId){form.set("overwrite_document_id",input.overwriteDocumentId)}const payload=await this.#multipartRequest(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents`,form,input.idempotencyKey,signal);const response=this.#parse(uploadResponseSchema,payload);return{documentId:response.document_id,importId:response.import_id,jobId:response.job_id,state:response.state}}async getImportStatus(knowledgeBaseId,importId,signal){const status2=this.#parse(importStatusSchema,await this.#request(`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(knowledgeBaseId)}/imports/${encodeURIComponent(importId)}`,{method:"GET",...signal?{signal}:{}}));return{searchable:status2.searchable,state:status2.state,...status2.failure?{failure:status2.failure}:{}}}async#request(path16,options){let response;try{throwIfAborted(options.signal);response=await this.#fetch(new URL(path16,this.#origin),{headers:{Accept:"application/json",Authorization:`Bearer ${this.#accessToken}`,"Cache-Control":"no-store",...options.headers,...options.body===void 0?{}:{"Content-Type":"application/json"}},method:options.method,redirect:"error",signal:this.#requestSignal(options.signal),...options.body===void 0?{}:{body:JSON.stringify(options.body)}})}catch(error51){if(options.signal?.aborted)throw error51;throw new SkillError("NETWORK_UNREACHABLE","Cannot reach the Skill Knowledge service",{exitCode:exitCodes.networkUnreachable})}if(response.redirected||response.status>=300&&response.status<400){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service redirect was rejected",{exitCode:exitCodes.internalError})}const payload=await response.json().catch(()=>void 0);if(!response.ok){const problem=problemSchema2.safeParse(payload);throw httpError(response.status,problem.success?problem.data.code:"unknown",problem.success?problem.data.data:void 0)}return payload}#mutationPath(input){return`/api/v1/integrations/skill/v1/knowledge-bases/${encodeURIComponent(input.knowledgeBaseId)}/documents/${encodeURIComponent(input.documentId)}`}#mutationHeaders(input){return{"Idempotency-Key":input.idempotencyKey,"If-Match":`"document.${input.documentId}.v${input.expectedVersion}"`}}async#multipartRequest(path16,body,idempotencyKey,signal){let response;try{throwIfAborted(signal);response=await this.#fetch(new URL(path16,this.#origin),{headers:{Accept:"application/json",Authorization:`Bearer ${this.#accessToken}`,"Cache-Control":"no-store","Idempotency-Key":idempotencyKey},method:"POST",redirect:"error",signal:this.#requestSignal(signal),body})}catch(error51){if(signal?.aborted)throw error51;throw new SkillError("NETWORK_UNREACHABLE","Cannot reach the Skill Knowledge service",{exitCode:exitCodes.networkUnreachable})}if(response.redirected||response.status>=300&&response.status<400){throw new SkillError("INVALID_RESPONSE","Skill Knowledge service redirect was rejected",{exitCode:exitCodes.internalError})}const payload=await response.json().catch(()=>void 0);if(!response.ok){const problem=problemSchema2.safeParse(payload);throw httpError(response.status,problem.success?problem.data.code:"unknown",problem.success?problem.data.data:void 0)}return payload}#requestSignal(signal){const timeout=AbortSignal.timeout(this.#timeoutMs);return signal?AbortSignal.any([signal,timeout]):timeout}#parse(schema,payload){const parsed=schema.safeParse(payload);if(parsed.success)return parsed.data;throw new SkillError("INVALID_RESPONSE","Skill Knowledge service returned an incompatible response",{exitCode:exitCodes.internalError})}};function parseInteger(value){return Number.parseInt(value,10)}function parsePositiveInteger(value){const parsed=Number.parseInt(value,10);if(!Number.isSafeInteger(parsed)||parsed<=0){throw new CliError("INVALID_ARGUMENT","\u53C2\u6570\u5FC5\u987B\u662F\u6B63\u6574\u6570",{exitCode:exitCodes.invalidArgument})}return parsed}function parseNonNegativeInteger(value){const parsed=Number.parseInt(value,10);if(!Number.isSafeInteger(parsed)||parsed<0){throw new CliError("INVALID_ARGUMENT","\u53C2\u6570\u5FC5\u987B\u662F\u975E\u8D1F\u6574\u6570",{exitCode:exitCodes.invalidArgument})}return parsed}function parseAgent(value){if(value==="codex"||value==="claude-code"){return value}throw new CliError("INVALID_ARGUMENT",`Unsupported Agent: ${value}`,{exitCode:exitCodes.invalidArgument,hint:"Choose codex or claude-code."})}function parseEnterpriseAgent(value){if(value==="codex"||value==="claude-code"||value==="workbuddy"){return value}throw new CliError("INVALID_ARGUMENT",`\u4E0D\u652F\u6301\u7684 Agent\uFF1A${value}`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u9009\u62E9 codex\u3001claude-code \u6216 workbuddy\u3002"})}function parseCredentialStore(value){if(value==="keychain"||value==="file")return value;throw new CliError("INVALID_ARGUMENT",`\u4E0D\u652F\u6301\u7684\u51ED\u636E\u5B58\u50A8\uFF1A${value}`,{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u9009\u62E9 keychain \u6216 file\u3002"})}function resolveEnterpriseSkillAgent(positional,option){if(positional&&option&&positional!==option){throw new CliError("INVALID_ARGUMENT","\u4F4D\u7F6E\u53C2\u6570 Agent \u4E0E --agent \u6307\u5B9A\u7684 Agent \u4E0D\u4E00\u81F4",{exitCode:exitCodes.invalidArgument})}const agent=option??positional;if(!agent){throw new CliError("INVALID_ARGUMENT","\u8BF7\u4F7F\u7528 --agent \u6307\u5B9A Agent",{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u9009\u62E9 codex\u3001claude-code \u6216 workbuddy\u3002"})}return agent}function parseMcpToolArguments(value){try{const parsed=JSON.parse(value);if(!parsed||typeof parsed!=="object"||Array.isArray(parsed)){throw new Error("not an object")}return parsed}catch(cause){throw new CliError("INVALID_ARGUMENT","--arguments-json \u5FC5\u987B\u662F\u4E00\u4E2A JSON \u5BF9\u8C61",{exitCode:exitCodes.invalidArgument,cause})}}function collect(value,previous){return[...previous,value]}function commandOptions2(program2){return program2.opts()}var skillWriters=new WeakMap;function skillOperation(program2){const[command,subcommand,action]=program2.args;if(command==="auth"||command==="skill"&&subcommand==="auth"){return"auth"}if(command==="skill"&&subcommand==="knowledge"){if(action==="upload"||action==="upload-status")return"upload";if(action==="ask")return"search";return"document"}if(command==="search")return"search";if(command==="document"&&(subcommand==="upload"||subcommand==="upload-status")){return"upload"}if(command==="mcp"||command==="agent")return"install";if(command==="document"||command==="knowledge")return"document";return"install"}function skillData(program2,data){const base=data&&typeof data==="object"&&!Array.isArray(data)?data:Array.isArray(data)?{items:data}:{value:data};if(program2.args[0]==="knowledge"){return{resource:"knowledge_base",...base}}return base}function commandOutputIsNdjson(arguments_){return arguments_.some((argument,index)=>argument==="--output=ndjson"||argument==="--output"&&arguments_[index+1]==="ndjson")}function skillOperationId(){return`cli-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function skillEvent(program2,event,data,error51,operationId=skillOperationId()){return{schema:"sag.skill.ndjson.v1",operation:skillOperation(program2),event,operation_id:operationId,timestamp:new Date().toISOString(),...data?{data}:{},...error51?{error:error51}:{}}}function emit(program2,dependencies,data){const options=commandOptions2(program2);if(options.output==="ndjson"){skillWriters.get(program2)?.complete(skillEvent(program2,"completed",skillData(program2,data)));return}dependencies.writeStdout(options.json?renderJson(success4(data)):renderHuman(data,options.quiet??false))}async function runtime(program2,dependencies){const options=commandOptions2(program2);return createRuntimeContext({options:{...options.url?{url:options.url}:{},...options.profile?{profile:options.profile}:{}},environment:dependencies.environment,configStore:dependencies.configStore,credentialStore:dependencies.credentialStore,createClient:dependencies.createClient})}function localMcpRuntime(dependencies){if(!dependencies.localMcp){throw new CliError("DEPENDENCY_MISSING","Local MCP runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return dependencies.localMcp}function enterpriseMcpRuntime(dependencies){if(!dependencies.enterpriseMcp){throw new CliError("DEPENDENCY_MISSING","\u4F01\u4E1A MCP \u8FD0\u884C\u73AF\u5883\u4E0D\u53EF\u7528",{exitCode:exitCodes.dependencyMissing})}return dependencies.enterpriseMcp}function enterpriseMcpCommandRuntime(dependencies,timeoutMs){return{...enterpriseMcpRuntime(dependencies),cliVersion:dependencies.version,timeoutMs}}function skillInstallerRuntime(dependencies){if(!dependencies.skill){throw new CliError("DEPENDENCY_MISSING","SAG Knowledge Skill runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return dependencies.skill}function skillAccountAuthRuntime(dependencies){const runtime2=dependencies.skillAccount;if(!runtime2){throw new CliError("DEPENDENCY_MISSING","SAG account authorization runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return runtime2}function skillAccountKnowledgeRuntime(dependencies){const account=dependencies.skillAccount;if(!account){throw new CliError("DEPENDENCY_MISSING","SAG account Knowledge runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}return{auth:skillAccountAuthRuntime(dependencies),createId:import_node_crypto13.randomUUID,config:account.config,createClient:dependencies.createSkillKnowledgeClient??(options=>new SkillKnowledgeHttpClient(options))}}function skillAccountUploadRuntime(dependencies){return{...skillAccountKnowledgeRuntime(dependencies),now:()=>new Date,sleep:async milliseconds=>new Promise(resolve=>setTimeout(resolve,milliseconds))}}function emitSkillAccountUpload(program2,dependencies,events){if(commandOptions2(program2).output!=="ndjson"){emit(program2,dependencies,{events});return}const operationId=skillOperationId();const writer=skillWriters.get(program2);events.forEach((event,index)=>{const data={import_id:event.importId,...event.documentId?{document_id:event.documentId}:{},...event.jobId?{job_id:event.jobId}:{},...event.failure?{failure:event.failure}:{}};const frame=skillEvent(program2,event.event,data,void 0,operationId);if(index===events.length-1)writer?.complete(frame);else writer?.emit(frame)})}function emitSkillAccountUploadStatus(program2,dependencies,status2){if(commandOptions2(program2).output!=="ndjson"){emitSkillAccountUpload(program2,dependencies,[status2]);return}skillWriters.get(program2)?.complete(skillEvent(program2,"completed",{import_id:status2.importId,state:status2.event,...status2.documentId?{document_id:status2.documentId}:{},...status2.jobId?{job_id:status2.jobId}:{},...status2.failure?{failure:status2.failure}:{}}))}async function resolveSkillOrigin(dependencies,explicitOrigin,promptWhenMissing=false){if(explicitOrigin)return normalizeSkillOrigin(explicitOrigin);const runtime2=dependencies.skillAccount;if(!runtime2){throw new CliError("DEPENDENCY_MISSING","SAG account authorization runtime is unavailable",{exitCode:exitCodes.dependencyMissing})}const current=(await runtime2.config.load()).currentOrigin;if(current)return normalizeSkillOrigin(current);if(promptWhenMissing&&dependencies.promptSkillOrigin){return normalizeSkillOrigin(await dependencies.promptSkillOrigin())}throw new SkillError("AUTH_REQUIRED","SAG address is required",{exitCode:exitCodes.authRequired,details:{required_option:"--origin"}})}var ReportedSkillTargetFailure=class extends Error{constructor(exitCode){super("Skill target operation completed with errors");this.exitCode=exitCode}exitCode};function emitSkillTargets(program2,dependencies,report,options={}){if(commandOptions2(program2).output!=="ndjson"){emit(program2,dependencies,report);return}const writer=skillWriters.get(program2);const operationId=options.operationId??skillOperationId();for(const target of report.targets){const failed3=target.status==="failed"||target.status==="conflict";writer?.emit(skillEvent(program2,failed3?"target_failed":"target_completed",{agent:target.agent,target:target.target,status:target.status,...target.version?{version:target.version}:{},...target.package?{package:target.package}:{},...target.code?{code:target.code}:{}},void 0,operationId))}const terminal=options.terminal??true;const summary={package:report.package,version:report.version,target_count:report.targets.length};if(!terminal&&(!report.completedWithErrors||options.progressOnErrors)){writer?.emit(skillEvent(program2,options.progressEvent??"installation_completed",options.progressData??summary,void 0,operationId));return}writer?.complete(skillEvent(program2,report.completedWithErrors?"completed_with_errors":"completed",options.terminalData??summary,void 0,operationId))}async function executeSkillTargets(program2,dependencies,report){const resolved=await report;emitSkillTargets(program2,dependencies,resolved);if(resolved.completedWithErrors){const conflict6=resolved.targets.some(target=>target.status==="conflict");throw new ReportedSkillTargetFailure(conflict6?exitCodes.configConflict:exitCodes.internalError)}}function rejectEnterpriseProfile(program2){if(!commandOptions2(program2).profile)return;throw new CliError("INVALID_ARGUMENT","\u4F01\u4E1A MCP \u547D\u4EE4\u4E0D\u4F7F\u7528 Profile",{exitCode:exitCodes.invalidArgument,hint:"\u8BF7\u79FB\u9664 --profile\uFF1B\u4E2A\u4EBA Profile \u53EA\u7528\u4E8E sag mcp test \u548C sag agent\u3002"})}async function selectedProfileName(program2,dependencies){const options=commandOptions2(program2);if(options.profile){await dependencies.configStore.getProfile(options.profile);return options.profile}return(await dependencies.configStore.load()).currentProfile??"local"}async function selectedServerName(program2,dependencies,explicitName){const profile=await selectedProfileName(program2,dependencies);return{profile,serverName:explicitName??`sag-knowledge-${profile}`}}function addProfileCommands(program2,dependencies){const profile=program2.command("profile").description("Manage SAG profiles");profile.command("add").argument("<name>").argument("<url>").action(async(name,url2)=>{emit(program2,dependencies,await dependencies.configStore.addProfile(name,url2))});profile.command("list").action(async()=>{emit(program2,dependencies,await dependencies.configStore.listProfiles())});profile.command("use").argument("<name>").action(async name=>{emit(program2,dependencies,await dependencies.configStore.useProfile(name))});profile.command("show").argument("[name]").action(async name=>{emit(program2,dependencies,await dependencies.configStore.getProfile(name))});profile.command("remove").argument("<name>").action(async name=>{if(!commandOptions2(program2).yes&&!await dependencies.confirm(`Remove profile ${name}?`)){emit(program2,dependencies,{removed:null,cancelled:true});return}await dependencies.configStore.removeProfile(name);emit(program2,dependencies,{removed:name})})}function addAuthCommands(program2,dependencies){const auth2=program2.command("auth").description("Manage SAG credentials");auth2.command("login").option("--name <name>","SAG user name for the existing local login").action(async options=>{const context=await runtime(program2,dependencies);const result=await login({credentialRef:context.credentialRef,...context.connection.environmentToken?{environmentToken:context.connection.environmentToken}:{},...options.name?{name:options.name}:{},promptName:dependencies.promptName,authenticate:name=>dependencies.createClient({origin:context.connection.url}).login(name),validate:async token=>dependencies.createClient({origin:context.connection.url,token}).me(),store:dependencies.credentialStore});emit(program2,dependencies,result)});auth2.command("status").action(async()=>{const context=await runtime(program2,dependencies);const result=await status({credentialRef:context.credentialRef,...context.connection.environmentToken?{environmentToken:context.connection.environmentToken}:{},validate:async token=>dependencies.createClient({origin:context.connection.url,token}).me(),store:dependencies.credentialStore});emit(program2,dependencies,result)});auth2.command("logout").action(async()=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await logout({credentialRef:context.credentialRef,store:dependencies.credentialStore}))})}function addKnowledgeCommands(program2,dependencies){program2.command("doctor").action(async()=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await runDoctor(context.client,{url:context.connection.url,...context.connection.profileName?{profileName:context.connection.profileName}:{}},dependencies.localMcp?()=>localMcpDoctorChecks(dependencies.localMcp,{timeoutMs:15e3}):void 0))});const source=program2.command("source").description("Inspect SAG sources");source.command("list").action(async()=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await listSources(context.client))});source.command("get").argument("<source-id>").action(async sourceId=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await getSource(context.client,sourceId))});source.command("status").argument("[source-id]").action(async sourceId=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await sourceStatus(context.client,sourceId))});const document=program2.command("document").description("Inspect SAG documents");document.command("list").requiredOption("--source <source-id>").action(async options=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await listDocuments(context.client,options.source))});document.command("get").argument("<document-id>").requiredOption("--source <source-id>").action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await getDocument(context.client,options.source,documentId))});document.command("status").argument("[document-id]").requiredOption("--source <source-id>").action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await documentStatus(context.client,options.source,documentId))});program2.command("search").argument("<query>").option("--source <source-id...>").option("--top-k <number>","Maximum result count",parseInteger).addOption(new Option("--strategy <strategy>").choices(["vector","multi"])).action(async(query,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await searchKnowledge(context.client,query,{...options.source?{sourceIds:options.source}:{},...options.topK!==void 0?{topK:options.topK}:{},...options.strategy?{strategy:options.strategy}:{}}))});program2.command("outline").argument("<document-id>").requiredOption("--source <source-id>").action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await outline(context.client,options.source,documentId))});program2.command("grep").argument("<pattern>").requiredOption("--source <source-id>").option("--limit <number>","Maximum result count",parseInteger).action(async(pattern,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await grep(context.client,options.source,pattern,options.limit))});program2.command("read").argument("<document-id>").requiredOption("--source <source-id>").option("--offset <number>","Starting line (1-based)",parseInteger).option("--limit <number>","Lines to read",parseInteger).action(async(documentId,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await read(context.client,options.source,documentId,options.offset,options.limit))});program2.command("get-entity").argument("<name>").requiredOption("--source <source-id>").action(async(name,options)=>{const context=await runtime(program2,dependencies);emit(program2,dependencies,await getEntityContext(context.client,options.source,name))})}function addLocalMcpCommands(program2,dependencies){const mcp=program2.command("mcp").description("\u9A8C\u8BC1\u672C\u673A SAG MCP\uFF0C\u5E76\u7BA1\u7406\u4F01\u4E1A SAG MCP \u8FDE\u63A5");mcp.command("test").option("--source-id <source-id>").option("--container <name-or-id>").option("--timeout <milliseconds>","MCP timeout",parsePositiveInteger,15e3).action(async options=>{emit(program2,dependencies,await testLocalMcp(localMcpRuntime(dependencies),{...options.sourceId?{sourceId:options.sourceId}:{},...options.container?{container:options.container}:{},timeoutMs:options.timeout}))});mcp.command("list").description("\u5217\u51FA\u4F01\u4E1A MCP \u8FDE\u63A5").action(async()=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await listConnections(enterpriseMcpCommandRuntime(dependencies,15e3)))});mcp.command("use").description("\u9009\u62E9\u5F53\u524D\u4F01\u4E1A MCP \u8FDE\u63A5").argument("<server>","\u4F01\u4E1A MCP \u8FDE\u63A5\u540D\u79F0").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u5F53\u524D\u8FDE\u63A5").action(async(server,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await useConnection(enterpriseMcpCommandRuntime(dependencies,15e3),{server,dryRun:options.dryRun??false}))});mcp.command("status").description("\u68C0\u67E5\u4F01\u4E1A MCP\u3001Agent \u548C Skill \u72B6\u6001").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).action(async options=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await inspectConnectionStatus(enterpriseMcpCommandRuntime(dependencies,options.timeout),options.server===void 0?{}:{server:options.server}))});mcp.command("tools").description("\u5217\u51FA\u4F01\u4E1A MCP \u5DE5\u5177\u53CA\u98CE\u9669\u5206\u7C7B").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).action(async options=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await listConnectionTools(enterpriseMcpCommandRuntime(dependencies,options.timeout),options.server===void 0?{}:{server:options.server}))});mcp.command("call").description("\u8C03\u7528\u4F01\u4E1A MCP \u5DE5\u5177").argument("<tool>","\u5DE5\u5177\u540D\u79F0").requiredOption("--arguments-json <json>","\u4F20\u7ED9\u5DE5\u5177\u7684 JSON \u5BF9\u8C61").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).action(async(tool,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await callConnectionTool(enterpriseMcpCommandRuntime(dependencies,options.timeout),{...options.server===void 0?{}:{server:options.server},tool,arguments_:parseMcpToolArguments(options.argumentsJson),yes:commandOptions2(program2).yes??false}))});mcp.command("attach").description("\u628A\u4F01\u4E1A MCP \u63A5\u5165\u4E00\u4E2A Agent").argument("<agent>","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").option("--no-skill","\u4E0D\u5B89\u88C5\u4F01\u4E1A SAG MCP Skill").action(async(agent,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await attachConnection(enterpriseMcpCommandRuntime(dependencies,options.timeout),{...options.server===void 0?{}:{server:options.server},agent,yes:commandOptions2(program2).yes??false,dryRun:options.dryRun??false,noSkill:!options.skill,confirm:dependencies.confirm}))});mcp.command("detach").description("\u4ECE\u4E00\u4E2A Agent \u79FB\u9664\u53D7\u7BA1\u4F01\u4E1A MCP").argument("<agent>","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async(agent,options)=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await detachConnection(enterpriseMcpCommandRuntime(dependencies,15e3),{...options.server===void 0?{}:{server:options.server},agent,yes:commandOptions2(program2).yes??false,dryRun:options.dryRun??false,confirm:dependencies.confirm}))});mcp.command("disconnect").description("\u65AD\u5F00\u5E76\u5220\u9664\u4F01\u4E1A MCP \u8FDE\u63A5").option("--server <server>","\u6307\u5B9A\u4F01\u4E1A MCP \u8FDE\u63A5\uFF1B\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u8FDE\u63A5").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async options=>{rejectEnterpriseProfile(program2);emit(program2,dependencies,await disconnectConnection(enterpriseMcpCommandRuntime(dependencies,15e3),{...options.server===void 0?{}:{server:options.server},yes:commandOptions2(program2).yes??false,dryRun:options.dryRun??false,confirm:dependencies.confirm}))});const skill=mcp.command("skill").description("\u7BA1\u7406\u4F01\u4E1A SAG MCP Skill");skill.command("install").description("\u5B89\u88C5\u4F01\u4E1A SAG MCP Skill").argument("[agent]","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--agent <agent>","\u6307\u5B9A codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async(agent,options)=>{rejectEnterpriseProfile(program2);const selectedAgent=resolveEnterpriseSkillAgent(agent,options?.agent);emit(program2,dependencies,await installSkill(enterpriseMcpCommandRuntime(dependencies,15e3),{agent:selectedAgent,yes:commandOptions2(program2).yes??false,dryRun:options?.dryRun??false,confirm:dependencies.confirm}))});skill.command("status").description("\u68C0\u67E5\u4F01\u4E1A SAG MCP Skill").argument("[agent]","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--agent <agent>","\u6307\u5B9A codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).action(async(agent,options)=>{rejectEnterpriseProfile(program2);const selectedAgent=resolveEnterpriseSkillAgent(agent,options?.agent);const statuses=await skillStatus(enterpriseMcpCommandRuntime(dependencies,15e3),{agents:[selectedAgent]});emit(program2,dependencies,statuses[0])});skill.command("uninstall").description("\u5378\u8F7D\u4F01\u4E1A SAG MCP Skill").argument("[agent]","codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--agent <agent>","\u6307\u5B9A codex\u3001claude-code \u6216 workbuddy",parseEnterpriseAgent).option("--force","\u5148\u5907\u4EFD\uFF0C\u518D\u5F3A\u5236\u5378\u8F7D\u5DF2\u53D8\u66F4\u7684 Skill").option("--dry-run","\u53EA\u68C0\u67E5\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async(agent,options)=>{rejectEnterpriseProfile(program2);const selectedAgent=resolveEnterpriseSkillAgent(agent,options?.agent);emit(program2,dependencies,await uninstallSkill(enterpriseMcpCommandRuntime(dependencies,15e3),{agent:selectedAgent,yes:commandOptions2(program2).yes??false,force:options?.force??false,dryRun:options?.dryRun??false,confirm:dependencies.confirm}))});mcp.command("connect").description("\u7C98\u8D34\u5E76\u63A5\u5165\u4F01\u4E1A MCP \u8FDE\u63A5").option("--from-stdin","\u4ECE\u6807\u51C6\u8F93\u5165\u8BFB\u53D6 mcpServers JSON").option("--server <server-key>","\u9009\u62E9\u4E00\u4E2A MCP Server\uFF0C\u53EF\u91CD\u590D",collect,[]).option("--agent <agent>","\u63A5\u5165 codex\u3001claude-code \u6216 workbuddy\uFF0C\u53EF\u91CD\u590D",(value,previous)=>[...previous,parseEnterpriseAgent(value)],[]).option("--replace","\u540C\u540D\u4E0D\u540C URL \u65F6\u66FF\u6362\u539F\u8FDE\u63A5").option("--keep-both","\u540C\u540D\u4E0D\u540C URL \u65F6\u4FDD\u7559\u4E24\u4E2A\u8FDE\u63A5").option("--no-skill","\u4E0D\u5B89\u88C5\u4F01\u4E1A SAG MCP Skill").option("--credential-store <keychain|file>","\u51ED\u636E\u4FDD\u5B58\u4F4D\u7F6E",parseCredentialStore,"keychain").option("--allow-insecure-http","\u5141\u8BB8\u975E\u672C\u673A\u5730\u5740\u4F7F\u7528\u660E\u6587 HTTP").option("--timeout <milliseconds>","MCP \u8D85\u65F6\u65F6\u95F4",parsePositiveInteger,15e3).option("--dry-run","\u53EA\u9A8C\u8BC1\u5E76\u5C55\u793A\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u672C\u673A\u72B6\u6001").action(async options=>{rejectEnterpriseProfile(program2);if(options.replace&&options.keepBoth){throw new CliError("INVALID_ARGUMENT","--replace \u4E0E --keep-both \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528",{exitCode:exitCodes.invalidArgument})}const interactive=!options.fromStdin&&(dependencies.stdinIsTty??false);let raw;if(options.fromStdin){raw=await dependencies.readStdin()}else if(dependencies.promptMcpJson){raw=await dependencies.promptMcpJson()}else{throw new CliError("DEPENDENCY_MISSING","\u65E0\u6CD5\u8BFB\u53D6\u4F01\u4E1A MCP \u8FDE\u63A5 JSON",{exitCode:exitCodes.dependencyMissing,hint:"\u8BF7\u4F7F\u7528 `sag mcp connect --from-stdin` \u4ECE\u6807\u51C6\u8F93\u5165\u4F20\u5165 JSON\u3002"})}emit(program2,dependencies,await connectEnterpriseMcpCommand({runtime:enterpriseMcpRuntime(dependencies),raw,requestedServers:options.server,requestedAgents:options.agent,credentialStore:options.credentialStore,...options.replace?{collisionAction:"replace"}:options.keepBoth?{collisionAction:"keep-both"}:{},allowInsecureHttp:options.allowInsecureHttp??false,timeoutMs:options.timeout,yes:commandOptions2(program2).yes??false,noSkill:!options.skill,dryRun:options.dryRun??false,interactive,selectMcpServers:async servers=>{if(!dependencies.selectMcpServers){throw new CliError("DEPENDENCY_MISSING","\u65E0\u6CD5\u9009\u62E9 MCP Server",{exitCode:exitCodes.dependencyMissing})}return dependencies.selectMcpServers(servers)},selectAgents:async agents2=>dependencies.selectAgents?dependencies.selectAgents(agents2):[],selectCollisionAction:async collision=>{if(!dependencies.selectCollisionAction){throw new CliError("DEPENDENCY_MISSING","\u65E0\u6CD5\u5904\u7406\u540C\u540D MCP \u8FDE\u63A5",{exitCode:exitCodes.dependencyMissing})}return dependencies.selectCollisionAction(collision)}}))})}function addAgentCommands(program2,dependencies){const agent=program2.command("agent").description("Manage Agent MCP connections");agent.command("list").action(async()=>{emit(program2,dependencies,await listAgentHosts(localMcpRuntime(dependencies)))});agent.command("connect").argument("<agent>","codex or claude-code",parseAgent).option("--source-id <source-id>").option("--container <name-or-id>").option("--name <server-name>").option("--timeout <milliseconds>","MCP timeout",parsePositiveInteger,15e3).option("--dry-run","Show the plan without changing configuration").action(async(agentId,options)=>{const selection=await selectedServerName(program2,dependencies,options.name);emit(program2,dependencies,await connectLocalAgent(localMcpRuntime(dependencies),{agent:agentId,serverName:selection.serverName,profile:selection.profile,...options.sourceId?{sourceId:options.sourceId}:{},...options.container?{container:options.container}:{},timeoutMs:options.timeout,dryRun:options.dryRun??false,yes:commandOptions2(program2).yes??false,confirm:dependencies.confirm,now:()=>new Date}))});agent.command("status").argument("[agent]","codex or claude-code",parseAgent).option("--name <server-name>").action(async(agentId,options)=>{const selection=await selectedServerName(program2,dependencies,options.name);emit(program2,dependencies,await statusLocalAgents(localMcpRuntime(dependencies),{...agentId?{agent:agentId}:{},serverName:selection.serverName}))});agent.command("disconnect").argument("<agent>","codex or claude-code",parseAgent).option("--name <server-name>").action(async(agentId,options)=>{const selection=await selectedServerName(program2,dependencies,options.name);emit(program2,dependencies,await disconnectLocalAgent(localMcpRuntime(dependencies),{agent:agentId,serverName:selection.serverName,yes:commandOptions2(program2).yes??false,confirm:dependencies.confirm}))})}function addSkillCommands(program2,dependencies){const skill=program2.command("skill").description("Install and manage the SAG Knowledge Skill");const selectedAgents=(value,previous)=>[...previous,parseEnterpriseAgent(value)];const addInstall=(name,description)=>{const command=skill.command(name).description(description).option("--agent <agent>","Target codex, claude-code, or workbuddy",selectedAgents,[]);command.option("--origin <origin>","Full SAG HTTP or HTTPS Origin");command.option("--link-token <token>","Open Link token; replaces the saved authorization for this Origin");command.action(async options=>{if(options.linkToken&&!options.origin){throw new CliError("INVALID_ARGUMENT","--link-token requires --origin",{exitCode:exitCodes.invalidArgument})}if(options.origin){const account=dependencies.skillAccount;if(!account){throw new CliError("DEPENDENCY_MISSING","SAG account configuration is unavailable",{exitCode:exitCodes.dependencyMissing})}if(options.linkToken){await account.config.saveLinkToken(options.origin,options.linkToken)}else{await account.config.setCurrentOrigin(options.origin)}}await executeSkillTargets(program2,dependencies,installSkillTargets(skillInstallerRuntime(dependencies),{...options.agent.length?{agents:options.agent}:{},yes:commandOptions2(program2).yes??false,update:name==="update"}))})};addInstall("install","Install SAG Knowledge for every detected Agent");addInstall("update","Resolve the running @latest package and update managed Skills");const auth2=skill.command("auth").description("Authorize one SAG account Origin");auth2.command("paste-token").description("Save an Open Link token for one SAG Origin").requiredOption("--origin <origin>","Full SAG HTTP or HTTPS Origin").requiredOption("--token <token>","Open Link token provided by an administrator").action(async options=>{const account=dependencies.skillAccount;if(!account){throw new CliError("DEPENDENCY_MISSING","SAG account configuration is unavailable",{exitCode:exitCodes.dependencyMissing})}await account.config.saveLinkToken(options.origin,options.token);emit(program2,dependencies,{origin:normalizeSkillOrigin(options.origin),authorized:true,method:"open_link"})});auth2.command("login").description("Open browser approval and authorize the current SAG account").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin,true);emit(program2,dependencies,await authorizeSkillAccount(skillAccountAuthRuntime(dependencies),origin))});auth2.command("status").description("Inspect the saved SAG account authorization").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);const configured=dependencies.skillAccount;if(!configured){throw new CliError("DEPENDENCY_MISSING","SAG account configuration is unavailable",{exitCode:exitCodes.dependencyMissing})}const authorization=await configured.config.getAuthorization(origin);emit(program2,dependencies,{authenticated:Boolean(authorization),origin,...authorization&&"kind"in authorization?{method:"open_link"}:authorization?{method:"browser",user:authorization.user}:{}})});auth2.command("logout").description("Revoke and remove the saved SAG account authorization").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);const removed=await logoutSkillAccount(skillAccountAuthRuntime(dependencies),origin);emit(program2,dependencies,{origin,removed})});const accountKnowledge=skill.command("knowledge").description("Use Knowledge Bases available to the authorized SAG account");accountKnowledge.command("list").description("List Knowledge Bases available to the current SAG account").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await listSkillAccountKnowledgeBases(skillAccountKnowledgeRuntime(dependencies),origin))});accountKnowledge.command("documents").description("List documents in one exact Knowledge Base").requiredOption("--knowledge-base <id-or-alias-or-name>","Exact Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async options=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await listSkillAccountDocuments(skillAccountKnowledgeRuntime(dependencies),origin,options.knowledgeBase))});accountKnowledge.command("ask").description("Ask SAG and relay its answer and citations").argument("<question>","Question for SAG").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").option("--knowledge-base <id-or-alias-or-name>","Optional exact Knowledge Base scope; omit for SAG global search").action(async(question,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await askSkillAccountKnowledge(skillAccountKnowledgeRuntime(dependencies),origin,question,options.knowledgeBase))});accountKnowledge.command("upload").description("Upload one regular file to an exact Knowledge Base").argument("<file>","One regular file").requiredOption("--knowledge-base <id-or-alias-or-name>","Confirmed Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").option("--wait <milliseconds>","Use 0 to detach after acceptance",parseNonNegativeInteger).option("--overwrite-document-id <document-id>","Existing document ID returned by a duplicate upload conflict").action(async(filePath,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);const events=await uploadSkillAccountFile(skillAccountUploadRuntime(dependencies),origin,filePath,options.knowledgeBase,options.wait,options.overwriteDocumentId);emitSkillAccountUpload(program2,dependencies,events)});accountKnowledge.command("upload-status").description("Read upload progress using the returned import ID").argument("<import-id>","Import ID returned by upload").requiredOption("--knowledge-base <id-or-alias-or-name>","Exact Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async(importId,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emitSkillAccountUploadStatus(program2,dependencies,await inspectSkillAccountUpload(skillAccountUploadRuntime(dependencies),origin,importId,options.knowledgeBase))});accountKnowledge.command("rename").description("Rename one exact document version").argument("<document-id>","Exact document ID").requiredOption("--title <title>","New document title").requiredOption("--expected-version <version>","Current document version",parsePositiveInteger).requiredOption("--knowledge-base <id-or-alias-or-name>","Confirmed Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async(documentId,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await renameSkillAccountDocument(skillAccountKnowledgeRuntime(dependencies),origin,{knowledgeBase:options.knowledgeBase,documentId,expectedVersion:options.expectedVersion,title:options.title}))});accountKnowledge.command("delete").description("Move one exact document version to the recoverable recycle bin").argument("<document-id>","Exact document ID").requiredOption("--expected-version <version>","Current document version",parsePositiveInteger).requiredOption("--knowledge-base <id-or-alias-or-name>","Confirmed Knowledge Base ID, alias, or unique name").option("--origin <origin>","Full SAG HTTP or HTTPS Origin").action(async(documentId,options)=>{const origin=await resolveSkillOrigin(dependencies,options.origin);emit(program2,dependencies,await deleteSkillAccountDocument(skillAccountKnowledgeRuntime(dependencies),origin,{knowledgeBase:options.knowledgeBase,documentId,expectedVersion:options.expectedVersion}))});skill.command("status").description("Inspect managed SAG Knowledge Skill targets").option("--agent <agent>","Target codex, claude-code, or workbuddy",selectedAgents,[]).action(async options=>{emitSkillTargets(program2,dependencies,await inspectSkillTargets(skillInstallerRuntime(dependencies),{...options.agent.length?{agents:options.agent}:{}}))});skill.command("uninstall").description("Remove unchanged SAG CLI-managed Skills").option("--agent <agent>","Target codex, claude-code, or workbuddy",selectedAgents,[]).action(async options=>{await executeSkillTargets(program2,dependencies,uninstallSkillTargets(skillInstallerRuntime(dependencies),{...options.agent.length?{agents:options.agent}:{},yes:commandOptions2(program2).yes??false}))})}function createProgram(dependencies){const program2=new Command;skillWriters.set(program2,new SkillEventWriter(dependencies.writeStdout));program2.name("sag").description("Command-line client and diagnostics for SAG").showHelpAfterError().exitOverride().option("--json","Output a stable JSON envelope").addOption(new Option("--output <format>","Output format").choices(["human","ndjson"]).conflicts("json")).option("--quiet","Output only essential values").option("--profile <name>","Use a configured SAG profile").option("--url <origin>","Use a SAG origin without saving it").option("--yes","Confirm safe local configuration changes").configureOutput({writeOut:dependencies.writeStdout,writeErr:dependencies.writeStderr});program2.command("version").action(()=>{const options=commandOptions2(program2);if(options.output==="ndjson"){skillWriters.get(program2)?.complete(skillEvent(program2,"completed",{name:"sag",version:dependencies.version}))}else if(options.json){dependencies.writeStdout(renderJson(success4({name:"sag",version:dependencies.version})))}else{dependencies.writeStdout(`sag ${dependencies.version}
|
|
157
157
|
`)}});addProfileCommands(program2,dependencies);addAuthCommands(program2,dependencies);addKnowledgeCommands(program2,dependencies);addLocalMcpCommands(program2,dependencies);addAgentCommands(program2,dependencies);addSkillCommands(program2,dependencies);return program2}async function runCli(arguments_,dependencies){const json2=arguments_.includes("--json");const program2=createProgram(commandOutputIsNdjson(arguments_)?{...dependencies,writeStderr:()=>void 0}:dependencies);try{await program2.parseAsync(arguments_);return exitCodes.success}catch(error51){if(error51 instanceof ReportedSkillTargetFailure)return error51.exitCode;if(error51 instanceof CommanderError&&error51.exitCode===0){return 0}if(error51 instanceof SkillError){if(json2){dependencies.writeStdout(renderJson({schema:"sag.cli.v1",ok:false,error:{code:error51.code,message:error51.message,...error51.details?{details:error51.details}:{}}}))}else if(commandOutputIsNdjson(arguments_)){const event=skillEvent(program2,"failed",void 0,{code:error51.code,message:error51.message,retryable:error51.code==="NETWORK_UNREACHABLE",...error51.details?{details:error51.details}:{}});const operationId=error51.details?.operation_id;skillWriters.get(program2)?.complete({...event,...typeof operationId==="string"?{operation_id:operationId}:{}})}else{const operationId=error51.details?.operation_id;dependencies.writeStderr(`Error [${error51.code}]: ${error51.message}${typeof operationId==="string"?`
|
|
158
158
|
Operation ID: ${operationId}`:""}
|
|
159
159
|
`)}return error51.exitCode}const cliError=error51 instanceof CommanderError?new CliError("INVALID_ARGUMENT",error51.message,{exitCode:exitCodes.invalidArgument}):toCliError(error51);if(json2){dependencies.writeStdout(renderJson(failure(cliError)))}else if(commandOutputIsNdjson(arguments_)){skillWriters.get(program2)?.complete(skillEvent(program2,"failed",void 0,{code:toSkillErrorCode(cliError.code),message:cliError.message,retryable:cliError.code==="NETWORK_UNREACHABLE"}))}else{dependencies.writeStderr(`Error [${cliError.code}]: ${cliError.message}${cliError.hint?`
|