@nexera-systems/protocol 0.1.3
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/LICENSE +21 -0
- package/README.md +16 -0
- package/dist/index.js +930 -0
- package/package.json +85 -0
- package/scripts/fix-pty-perms.mjs +63 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,930 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as _createRequire } from "module";
|
|
3
|
+
const require = _createRequire(import.meta.url);
|
|
4
|
+
var S0=Object.create;var Eu=Object.defineProperty;var x0=Object.getOwnPropertyDescriptor;var k0=Object.getOwnPropertyNames;var E0=Object.getPrototypeOf,P0=Object.prototype.hasOwnProperty;var xr=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var D=(t,e)=>()=>(t&&(e=t(t=0)),e);var dt=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),va=(t,e)=>{for(var r in e)Eu(t,r,{get:e[r],enumerable:!0})},A0=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of k0(e))!P0.call(t,o)&&o!==r&&Eu(t,o,{get:()=>e[o],enumerable:!(n=x0(e,o))||n.enumerable});return t};var Pu=(t,e,r)=>(r=t!=null?S0(E0(t)):{},A0(e||!t||!t.__esModule?Eu(r,"default",{value:t,enumerable:!0}):r,t));function hm(t){return typeof t>"u"||t===null}function C0(t){return typeof t=="object"&&t!==null}function _0(t){return Array.isArray(t)?t:hm(t)?[]:[t]}function T0(t,e){var r,n,o,i;if(e)for(i=Object.keys(e),r=0,n=i.length;r<n;r+=1)o=i[r],t[o]=e[o];return t}function R0(t,e){var r="",n;for(n=0;n<e;n+=1)r+=t;return r}function I0(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}function mm(t,e){var r="",n=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(r+='in "'+t.mark.name+'" '),r+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(r+=`
|
|
5
|
+
|
|
6
|
+
`+t.mark.snippet),n+" "+r):n}function ui(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=mm(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}function Au(t,e,r,n,o){var i="",s="",a=Math.floor(o/2)-1;return n-e>a&&(i=" ... ",e=n-a+i.length),r-n>a&&(s=" ...",r=n+a-s.length),{str:i+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+i.length}}function Cu(t,e){return Ge.repeat(" ",e-t.length)+t}function F0(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],o=[],i,s=-1;i=r.exec(t.buffer);)o.push(i.index),n.push(i.index+i[0].length),t.position<=i.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var a="",c,l,d=Math.min(t.line+e.linesAfter,o.length).toString().length,p=e.maxLength-(e.indent+d+3);for(c=1;c<=e.linesBefore&&!(s-c<0);c++)l=Au(t.buffer,n[s-c],o[s-c],t.position-(n[s]-n[s-c]),p),a=Ge.repeat(" ",e.indent)+Cu((t.line-c+1).toString(),d)+" | "+l.str+`
|
|
7
|
+
`+a;for(l=Au(t.buffer,n[s],o[s],t.position,p),a+=Ge.repeat(" ",e.indent)+Cu((t.line+1).toString(),d)+" | "+l.str+`
|
|
8
|
+
`,a+=Ge.repeat("-",e.indent+d+3+l.pos)+`^
|
|
9
|
+
`,c=1;c<=e.linesAfter&&!(s+c>=o.length);c++)l=Au(t.buffer,n[s+c],o[s+c],t.position-(n[s]-n[s+c]),p),a+=Ge.repeat(" ",e.indent)+Cu((t.line+c+1).toString(),d)+" | "+l.str+`
|
|
10
|
+
`;return a.replace(/\n$/,"")}function B0(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function H0(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(U0.indexOf(r)===-1)throw new pt('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=B0(e.styleAliases||null),W0.indexOf(this.kind)===-1)throw new pt('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function Zh(t,e){var r=[];return t[e].forEach(function(n){var o=r.length;r.forEach(function(i,s){i.tag===n.tag&&i.kind===n.kind&&i.multi===n.multi&&(o=s)}),r[o]=n}),r}function q0(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(o){o.multi?(t.multi[o.kind].push(o),t.multi.fallback.push(o)):t[o.kind][o.tag]=t.fallback[o.tag]=o}for(e=0,r=arguments.length;e<r;e+=1)arguments[e].forEach(n);return t}function Tu(t){return this.extend(t)}function G0(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function V0(){return null}function z0(t){return t===null}function K0(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function J0(t){return t==="true"||t==="True"||t==="TRUE"}function Y0(t){return Object.prototype.toString.call(t)==="[object Boolean]"}function X0(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function Q0(t){return 48<=t&&t<=55}function Z0(t){return 48<=t&&t<=57}function eE(t){if(t===null)return!1;var e=t.length,r=0,n=!1,o;if(!e)return!1;if(o=t[r],(o==="-"||o==="+")&&(o=t[++r]),o==="0"){if(r+1===e)return!0;if(o=t[++r],o==="b"){for(r++;r<e;r++)if(o=t[r],o!=="_"){if(o!=="0"&&o!=="1")return!1;n=!0}return n&&o!=="_"}if(o==="x"){for(r++;r<e;r++)if(o=t[r],o!=="_"){if(!X0(t.charCodeAt(r)))return!1;n=!0}return n&&o!=="_"}if(o==="o"){for(r++;r<e;r++)if(o=t[r],o!=="_"){if(!Q0(t.charCodeAt(r)))return!1;n=!0}return n&&o!=="_"}}if(o==="_")return!1;for(;r<e;r++)if(o=t[r],o!=="_"){if(!Z0(t.charCodeAt(r)))return!1;n=!0}return!(!n||o==="_")}function tE(t){var e=t,r=1,n;if(e.indexOf("_")!==-1&&(e=e.replace(/_/g,"")),n=e[0],(n==="-"||n==="+")&&(n==="-"&&(r=-1),e=e.slice(1),n=e[0]),e==="0")return 0;if(n==="0"){if(e[1]==="b")return r*parseInt(e.slice(2),2);if(e[1]==="x")return r*parseInt(e.slice(2),16);if(e[1]==="o")return r*parseInt(e.slice(2),8)}return r*parseInt(e,10)}function rE(t){return Object.prototype.toString.call(t)==="[object Number]"&&t%1===0&&!Ge.isNegativeZero(t)}function oE(t){return!(t===null||!nE.test(t)||t[t.length-1]==="_")}function iE(t){var e,r;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function aE(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Ge.isNegativeZero(t))return"-0.0";return r=t.toString(10),sE.test(r)?r.replace("e",".e"):r}function cE(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Ge.isNegativeZero(t))}function lE(t){return t===null?!1:Cm.exec(t)!==null||_m.exec(t)!==null}function uE(t){var e,r,n,o,i,s,a,c=0,l=null,d,p,u;if(e=Cm.exec(t),e===null&&(e=_m.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,o=+e[3],!e[4])return new Date(Date.UTC(r,n,o));if(i=+e[4],s=+e[5],a=+e[6],e[7]){for(c=e[7].slice(0,3);c.length<3;)c+="0";c=+c}return e[9]&&(d=+e[10],p=+(e[11]||0),l=(d*60+p)*6e4,e[9]==="-"&&(l=-l)),u=new Date(Date.UTC(r,n,o,i,s,a,c)),l&&u.setTime(u.getTime()-l),u}function dE(t){return t.toISOString()}function pE(t){return t==="<<"||t===null}function fE(t){if(t===null)return!1;var e,r,n=0,o=t.length,i=Mu;for(r=0;r<o;r++)if(e=i.indexOf(t.charAt(r)),!(e>64)){if(e<0)return!1;n+=6}return n%8===0}function hE(t){var e,r,n=t.replace(/[\r\n=]/g,""),o=n.length,i=Mu,s=0,a=[];for(e=0;e<o;e++)e%4===0&&e&&(a.push(s>>16&255),a.push(s>>8&255),a.push(s&255)),s=s<<6|i.indexOf(n.charAt(e));return r=o%4*6,r===0?(a.push(s>>16&255),a.push(s>>8&255),a.push(s&255)):r===18?(a.push(s>>10&255),a.push(s>>2&255)):r===12&&a.push(s>>4&255),new Uint8Array(a)}function mE(t){var e="",r=0,n,o,i=t.length,s=Mu;for(n=0;n<i;n++)n%3===0&&n&&(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return o=i%3,o===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):o===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):o===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function gE(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function bE(t){if(t===null)return!0;var e=[],r,n,o,i,s,a=t;for(r=0,n=a.length;r<n;r+=1){if(o=a[r],s=!1,yE.call(o)!=="[object Object]")return!1;for(i in o)if(wE.call(o,i))if(!s)s=!0;else return!1;if(!s)return!1;if(e.indexOf(i)===-1)e.push(i);else return!1}return!0}function vE(t){return t!==null?t:[]}function xE(t){if(t===null)return!0;var e,r,n,o,i,s=t;for(i=new Array(s.length),e=0,r=s.length;e<r;e+=1){if(n=s[e],SE.call(n)!=="[object Object]"||(o=Object.keys(n),o.length!==1))return!1;i[e]=[o[0],n[o[0]]]}return!0}function kE(t){if(t===null)return[];var e,r,n,o,i,s=t;for(i=new Array(s.length),e=0,r=s.length;e<r;e+=1)n=s[e],o=Object.keys(n),i[e]=[o[0],n[o[0]]];return i}function PE(t){if(t===null)return!0;var e,r=t;for(e in r)if(EE.call(r,e)&&r[e]!==null)return!1;return!0}function AE(t){return t!==null?t:{}}function tm(t){return Object.prototype.toString.call(t)}function sr(t){return t===10||t===13}function gn(t){return t===9||t===32}function St(t){return t===9||t===32||t===10||t===13}function eo(t){return t===44||t===91||t===93||t===123||t===125}function IE(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function $E(t){return t===120?2:t===117?4:t===85?8:0}function OE(t){return 48<=t&&t<=57?t-48:-1}function rm(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?`
|
|
11
|
+
`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function ME(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}function jm(t,e,r){e==="__proto__"?Object.defineProperty(t,e,{configurable:!0,enumerable:!0,writable:!0,value:r}):t[e]=r}function DE(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||Du,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function Bm(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=j0(r),new pt(e,r)}function Z(t,e){throw Bm(t,e)}function ka(t,e){t.onWarning&&t.onWarning.call(null,Bm(t,e))}function Hr(t,e,r,n){var o,i,s,a;if(e<r){if(a=t.input.slice(e,r),n)for(o=0,i=a.length;o<i;o+=1)s=a.charCodeAt(o),s===9||32<=s&&s<=1114111||Z(t,"expected valid JSON character");else _E.test(a)&&Z(t,"the stream contains non-printable characters");t.result+=a}}function om(t,e,r,n){var o,i,s,a;for(Ge.isObject(r)||Z(t,"cannot merge mappings; the provided source object is unacceptable"),o=Object.keys(r),s=0,a=o.length;s<a;s+=1)i=o[s],qr.call(e,i)||(jm(e,i,r[i]),n[i]=!0)}function to(t,e,r,n,o,i,s,a,c){var l,d;if(Array.isArray(o))for(o=Array.prototype.slice.call(o),l=0,d=o.length;l<d;l+=1)Array.isArray(o[l])&&Z(t,"nested arrays are not supported inside keys"),typeof o=="object"&&tm(o[l])==="[object Object]"&&(o[l]="[object Object]");if(typeof o=="object"&&tm(o)==="[object Object]"&&(o="[object Object]"),o=String(o),e===null&&(e={}),n==="tag:yaml.org,2002:merge")if(Array.isArray(i))for(l=0,d=i.length;l<d;l+=1)om(t,e,i[l],r);else om(t,e,i,r);else!t.json&&!qr.call(r,o)&&qr.call(e,o)&&(t.line=s||t.line,t.lineStart=a||t.lineStart,t.position=c||t.position,Z(t,"duplicated mapping key")),jm(e,o,i),delete r[o];return e}function Nu(t){var e;e=t.input.charCodeAt(t.position),e===10?t.position++:e===13?(t.position++,t.input.charCodeAt(t.position)===10&&t.position++):Z(t,"a line break is expected"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function Be(t,e,r){for(var n=0,o=t.input.charCodeAt(t.position);o!==0;){for(;gn(o);)o===9&&t.firstTabInLine===-1&&(t.firstTabInLine=t.position),o=t.input.charCodeAt(++t.position);if(e&&o===35)do o=t.input.charCodeAt(++t.position);while(o!==10&&o!==13&&o!==0);if(sr(o))for(Nu(t),o=t.input.charCodeAt(t.position),n++,t.lineIndent=0;o===32;)t.lineIndent++,o=t.input.charCodeAt(++t.position);else break}return r!==-1&&n!==0&&t.lineIndent<r&&ka(t,"deficient indentation"),n}function Aa(t){var e=t.position,r;return r=t.input.charCodeAt(e),!!((r===45||r===46)&&r===t.input.charCodeAt(e+1)&&r===t.input.charCodeAt(e+2)&&(e+=3,r=t.input.charCodeAt(e),r===0||St(r)))}function Lu(t,e){e===1?t.result+=" ":e>1&&(t.result+=Ge.repeat(`
|
|
12
|
+
`,e-1))}function NE(t,e,r){var n,o,i,s,a,c,l,d,p=t.kind,u=t.result,f;if(f=t.input.charCodeAt(t.position),St(f)||eo(f)||f===35||f===38||f===42||f===33||f===124||f===62||f===39||f===34||f===37||f===64||f===96||(f===63||f===45)&&(o=t.input.charCodeAt(t.position+1),St(o)||r&&eo(o)))return!1;for(t.kind="scalar",t.result="",i=s=t.position,a=!1;f!==0;){if(f===58){if(o=t.input.charCodeAt(t.position+1),St(o)||r&&eo(o))break}else if(f===35){if(n=t.input.charCodeAt(t.position-1),St(n))break}else{if(t.position===t.lineStart&&Aa(t)||r&&eo(f))break;if(sr(f))if(c=t.line,l=t.lineStart,d=t.lineIndent,Be(t,!1,-1),t.lineIndent>=e){a=!0,f=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=c,t.lineStart=l,t.lineIndent=d;break}}a&&(Hr(t,i,s,!1),Lu(t,t.line-c),i=s=t.position,a=!1),gn(f)||(s=t.position+1),f=t.input.charCodeAt(++t.position)}return Hr(t,i,s,!1),t.result?!0:(t.kind=p,t.result=u,!1)}function LE(t,e){var r,n,o;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=o=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Hr(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,o=t.position;else return!0;else sr(r)?(Hr(t,n,o,!0),Lu(t,Be(t,!1,e)),n=o=t.position):t.position===t.lineStart&&Aa(t)?Z(t,"unexpected end of the document within a single quoted scalar"):(t.position++,o=t.position);Z(t,"unexpected end of the stream within a single quoted scalar")}function FE(t,e){var r,n,o,i,s,a;if(a=t.input.charCodeAt(t.position),a!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(a=t.input.charCodeAt(t.position))!==0;){if(a===34)return Hr(t,r,t.position,!0),t.position++,!0;if(a===92){if(Hr(t,r,t.position,!0),a=t.input.charCodeAt(++t.position),sr(a))Be(t,!1,e);else if(a<256&&Um[a])t.result+=Wm[a],t.position++;else if((s=$E(a))>0){for(o=s,i=0;o>0;o--)a=t.input.charCodeAt(++t.position),(s=IE(a))>=0?i=(i<<4)+s:Z(t,"expected hexadecimal character");t.result+=ME(i),t.position++}else Z(t,"unknown escape sequence");r=n=t.position}else sr(a)?(Hr(t,r,n,!0),Lu(t,Be(t,!1,e)),r=n=t.position):t.position===t.lineStart&&Aa(t)?Z(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Z(t,"unexpected end of the stream within a double quoted scalar")}function jE(t,e){var r=!0,n,o,i,s=t.tag,a,c=t.anchor,l,d,p,u,f,m=Object.create(null),h,w,b,k;if(k=t.input.charCodeAt(t.position),k===91)d=93,f=!1,a=[];else if(k===123)d=125,f=!0,a={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=a),k=t.input.charCodeAt(++t.position);k!==0;){if(Be(t,!0,e),k=t.input.charCodeAt(t.position),k===d)return t.position++,t.tag=s,t.anchor=c,t.kind=f?"mapping":"sequence",t.result=a,!0;r?k===44&&Z(t,"expected the node content, but found ','"):Z(t,"missed comma between flow collection entries"),w=h=b=null,p=u=!1,k===63&&(l=t.input.charCodeAt(t.position+1),St(l)&&(p=u=!0,t.position++,Be(t,!0,e))),n=t.line,o=t.lineStart,i=t.position,ro(t,e,Sa,!1,!0),w=t.tag,h=t.result,Be(t,!0,e),k=t.input.charCodeAt(t.position),(u||t.line===n)&&k===58&&(p=!0,k=t.input.charCodeAt(++t.position),Be(t,!0,e),ro(t,e,Sa,!1,!0),b=t.result),f?to(t,a,m,w,h,b,n,o,i):p?a.push(to(t,null,m,w,h,b,n,o,i)):a.push(h),Be(t,!0,e),k=t.input.charCodeAt(t.position),k===44?(r=!0,k=t.input.charCodeAt(++t.position)):r=!1}Z(t,"unexpected end of the stream within a flow collection")}function UE(t,e){var r,n,o=_u,i=!1,s=!1,a=e,c=0,l=!1,d,p;if(p=t.input.charCodeAt(t.position),p===124)n=!1;else if(p===62)n=!0;else return!1;for(t.kind="scalar",t.result="";p!==0;)if(p=t.input.charCodeAt(++t.position),p===43||p===45)_u===o?o=p===43?em:CE:Z(t,"repeat of a chomping mode identifier");else if((d=OE(p))>=0)d===0?Z(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?Z(t,"repeat of an indentation width identifier"):(a=e+d-1,s=!0);else break;if(gn(p)){do p=t.input.charCodeAt(++t.position);while(gn(p));if(p===35)do p=t.input.charCodeAt(++t.position);while(!sr(p)&&p!==0)}for(;p!==0;){for(Nu(t),t.lineIndent=0,p=t.input.charCodeAt(t.position);(!s||t.lineIndent<a)&&p===32;)t.lineIndent++,p=t.input.charCodeAt(++t.position);if(!s&&t.lineIndent>a&&(a=t.lineIndent),sr(p)){c++;continue}if(t.lineIndent<a){o===em?t.result+=Ge.repeat(`
|
|
13
|
+
`,i?1+c:c):o===_u&&i&&(t.result+=`
|
|
14
|
+
`);break}for(n?gn(p)?(l=!0,t.result+=Ge.repeat(`
|
|
15
|
+
`,i?1+c:c)):l?(l=!1,t.result+=Ge.repeat(`
|
|
16
|
+
`,c+1)):c===0?i&&(t.result+=" "):t.result+=Ge.repeat(`
|
|
17
|
+
`,c):t.result+=Ge.repeat(`
|
|
18
|
+
`,i?1+c:c),i=!0,s=!0,c=0,r=t.position;!sr(p)&&p!==0;)p=t.input.charCodeAt(++t.position);Hr(t,r,t.position,!1)}return!0}function im(t,e){var r,n=t.tag,o=t.anchor,i=[],s,a=!1,c;if(t.firstTabInLine!==-1)return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=i),c=t.input.charCodeAt(t.position);c!==0&&(t.firstTabInLine!==-1&&(t.position=t.firstTabInLine,Z(t,"tab characters must not be used in indentation")),!(c!==45||(s=t.input.charCodeAt(t.position+1),!St(s))));){if(a=!0,t.position++,Be(t,!0,-1)&&t.lineIndent<=e){i.push(null),c=t.input.charCodeAt(t.position);continue}if(r=t.line,ro(t,e,Nm,!1,!0),i.push(t.result),Be(t,!0,-1),c=t.input.charCodeAt(t.position),(t.line===r||t.lineIndent>e)&&c!==0)Z(t,"bad indentation of a sequence entry");else if(t.lineIndent<e)break}return a?(t.tag=n,t.anchor=o,t.kind="sequence",t.result=i,!0):!1}function WE(t,e,r){var n,o,i,s,a,c,l=t.tag,d=t.anchor,p={},u=Object.create(null),f=null,m=null,h=null,w=!1,b=!1,k;if(t.firstTabInLine!==-1)return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=p),k=t.input.charCodeAt(t.position);k!==0;){if(!w&&t.firstTabInLine!==-1&&(t.position=t.firstTabInLine,Z(t,"tab characters must not be used in indentation")),n=t.input.charCodeAt(t.position+1),i=t.line,(k===63||k===58)&&St(n))k===63?(w&&(to(t,p,u,f,m,null,s,a,c),f=m=h=null),b=!0,w=!0,o=!0):w?(w=!1,o=!0):Z(t,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),t.position+=1,k=n;else{if(s=t.line,a=t.lineStart,c=t.position,!ro(t,r,Dm,!1,!0))break;if(t.line===i){for(k=t.input.charCodeAt(t.position);gn(k);)k=t.input.charCodeAt(++t.position);if(k===58)k=t.input.charCodeAt(++t.position),St(k)||Z(t,"a whitespace character is expected after the key-value separator within a block mapping"),w&&(to(t,p,u,f,m,null,s,a,c),f=m=h=null),b=!0,w=!1,o=!1,f=t.tag,m=t.result;else if(b)Z(t,"can not read an implicit mapping pair; a colon is missed");else return t.tag=l,t.anchor=d,!0}else if(b)Z(t,"can not read a block mapping entry; a multiline key may not be an implicit key");else return t.tag=l,t.anchor=d,!0}if((t.line===i||t.lineIndent>e)&&(w&&(s=t.line,a=t.lineStart,c=t.position),ro(t,e,xa,!0,o)&&(w?m=t.result:h=t.result),w||(to(t,p,u,f,m,h,s,a,c),f=m=h=null),Be(t,!0,-1),k=t.input.charCodeAt(t.position)),(t.line===i||t.lineIndent>e)&&k!==0)Z(t,"bad indentation of a mapping entry");else if(t.lineIndent<e)break}return w&&to(t,p,u,f,m,null,s,a,c),b&&(t.tag=l,t.anchor=d,t.kind="mapping",t.result=p),b}function BE(t){var e,r=!1,n=!1,o,i,s;if(s=t.input.charCodeAt(t.position),s!==33)return!1;if(t.tag!==null&&Z(t,"duplication of a tag property"),s=t.input.charCodeAt(++t.position),s===60?(r=!0,s=t.input.charCodeAt(++t.position)):s===33?(n=!0,o="!!",s=t.input.charCodeAt(++t.position)):o="!",e=t.position,r){do s=t.input.charCodeAt(++t.position);while(s!==0&&s!==62);t.position<t.length?(i=t.input.slice(e,t.position),s=t.input.charCodeAt(++t.position)):Z(t,"unexpected end of the stream within a verbatim tag")}else{for(;s!==0&&!St(s);)s===33&&(n?Z(t,"tag suffix cannot contain exclamation marks"):(o=t.input.slice(e-1,t.position+1),Lm.test(o)||Z(t,"named tag handle cannot contain such characters"),n=!0,e=t.position+1)),s=t.input.charCodeAt(++t.position);i=t.input.slice(e,t.position),RE.test(i)&&Z(t,"tag suffix cannot contain flow indicator characters")}i&&!Fm.test(i)&&Z(t,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch{Z(t,"tag name is malformed: "+i)}return r?t.tag=i:qr.call(t.tagMap,o)?t.tag=t.tagMap[o]+i:o==="!"?t.tag="!"+i:o==="!!"?t.tag="tag:yaml.org,2002:"+i:Z(t,'undeclared tag handle "'+o+'"'),!0}function HE(t){var e,r;if(r=t.input.charCodeAt(t.position),r!==38)return!1;for(t.anchor!==null&&Z(t,"duplication of an anchor property"),r=t.input.charCodeAt(++t.position),e=t.position;r!==0&&!St(r)&&!eo(r);)r=t.input.charCodeAt(++t.position);return t.position===e&&Z(t,"name of an anchor node must contain at least one character"),t.anchor=t.input.slice(e,t.position),!0}function qE(t){var e,r,n;if(n=t.input.charCodeAt(t.position),n!==42)return!1;for(n=t.input.charCodeAt(++t.position),e=t.position;n!==0&&!St(n)&&!eo(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&Z(t,"name of an alias node must contain at least one character"),r=t.input.slice(e,t.position),qr.call(t.anchorMap,r)||Z(t,'unidentified alias "'+r+'"'),t.result=t.anchorMap[r],Be(t,!0,-1),!0}function ro(t,e,r,n,o){var i,s,a,c=1,l=!1,d=!1,p,u,f,m,h,w;if(t.listener!==null&&t.listener("open",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,i=s=a=xa===r||Nm===r,n&&Be(t,!0,-1)&&(l=!0,t.lineIndent>e?c=1:t.lineIndent===e?c=0:t.lineIndent<e&&(c=-1)),c===1)for(;BE(t)||HE(t);)Be(t,!0,-1)?(l=!0,a=i,t.lineIndent>e?c=1:t.lineIndent===e?c=0:t.lineIndent<e&&(c=-1)):a=!1;if(a&&(a=l||o),(c===1||xa===r)&&(Sa===r||Dm===r?h=e:h=e+1,w=t.position-t.lineStart,c===1?a&&(im(t,w)||WE(t,w,h))||jE(t,h)?d=!0:(s&&UE(t,h)||LE(t,h)||FE(t,h)?d=!0:qE(t)?(d=!0,(t.tag!==null||t.anchor!==null)&&Z(t,"alias node should not have any properties")):NE(t,h,Sa===r)&&(d=!0,t.tag===null&&(t.tag="?")),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):c===0&&(d=a&&im(t,w))),t.tag===null)t.anchor!==null&&(t.anchorMap[t.anchor]=t.result);else if(t.tag==="?"){for(t.result!==null&&t.kind!=="scalar"&&Z(t,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+t.kind+'"'),p=0,u=t.implicitTypes.length;p<u;p+=1)if(m=t.implicitTypes[p],m.resolve(t.result)){t.result=m.construct(t.result),t.tag=m.tag,t.anchor!==null&&(t.anchorMap[t.anchor]=t.result);break}}else if(t.tag!=="!"){if(qr.call(t.typeMap[t.kind||"fallback"],t.tag))m=t.typeMap[t.kind||"fallback"][t.tag];else for(m=null,f=t.typeMap.multi[t.kind||"fallback"],p=0,u=f.length;p<u;p+=1)if(t.tag.slice(0,f[p].tag.length)===f[p].tag){m=f[p];break}m||Z(t,"unknown tag !<"+t.tag+">"),t.result!==null&&m.kind!==t.kind&&Z(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+m.kind+'", not "'+t.kind+'"'),m.resolve(t.result,t.tag)?(t.result=m.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Z(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||d}function GE(t){var e=t.position,r,n,o,i=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(Be(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(i=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!St(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),o=[],n.length<1&&Z(t,"directive name must not be less than one character in length");s!==0;){for(;gn(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!sr(s));break}if(sr(s))break;for(r=t.position;s!==0&&!St(s);)s=t.input.charCodeAt(++t.position);o.push(t.input.slice(r,t.position))}s!==0&&Nu(t),qr.call(nm,n)?nm[n](t,n,o):ka(t,'unknown document directive "'+n+'"')}if(Be(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Be(t,!0,-1)):i&&Z(t,"directives end mark is expected"),ro(t,t.lineIndent-1,xa,!1,!0),Be(t,!0,-1),t.checkLineBreaks&&TE.test(t.input.slice(e,t.position))&&ka(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&Aa(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Be(t,!0,-1));return}if(t.position<t.length-1)Z(t,"end of the stream or a document separator is expected");else return}function Hm(t,e){t=String(t),e=e||{},t.length!==0&&(t.charCodeAt(t.length-1)!==10&&t.charCodeAt(t.length-1)!==13&&(t+=`
|
|
19
|
+
`),t.charCodeAt(0)===65279&&(t=t.slice(1)));var r=new DE(t,e),n=t.indexOf("\0");for(n!==-1&&(r.position=n,Z(r,"null byte is not allowed in input")),r.input+="\0";r.input.charCodeAt(r.position)===32;)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)GE(r);return r.documents}function VE(t,e,r){e!==null&&typeof e=="object"&&typeof r>"u"&&(r=e,e=null);var n=Hm(t,r);if(typeof e!="function")return n;for(var o=0,i=n.length;o<i;o+=1)e(n[o])}function zE(t,e){var r=Hm(t,e);if(r.length!==0){if(r.length===1)return r[0];throw new pt("expected a single document in the stream, but found more")}}function hP(t,e){var r,n,o,i,s,a,c;if(e===null)return{};for(r={},n=Object.keys(e),o=0,i=n.length;o<i;o+=1)s=n[o],a=String(e[s]),s.slice(0,2)==="!!"&&(s="tag:yaml.org,2002:"+s.slice(2)),c=t.compiledTypeMap.fallback[s],c&&Vm.call(c.styleAliases,a)&&(a=c.styleAliases[a]),r[s]=a;return r}function mP(t){var e,r,n;if(e=t.toString(16).toUpperCase(),t<=255)r="x",n=2;else if(t<=65535)r="u",n=4;else if(t<=4294967295)r="U",n=8;else throw new pt("code point within a string may not be greater than 0xFFFFFFFF");return"\\"+r+Ge.repeat("0",n-e.length)+e}function wP(t){this.schema=t.schema||Du,this.indent=Math.max(1,t.indent||2),this.noArrayIndent=t.noArrayIndent||!1,this.skipInvalid=t.skipInvalid||!1,this.flowLevel=Ge.isNothing(t.flowLevel)?-1:t.flowLevel,this.styleMap=hP(this.schema,t.styles||null),this.sortKeys=t.sortKeys||!1,this.lineWidth=t.lineWidth||80,this.noRefs=t.noRefs||!1,this.noCompatMode=t.noCompatMode||!1,this.condenseFlow=t.condenseFlow||!1,this.quotingType=t.quotingType==='"'?pi:gP,this.forceQuotes=t.forceQuotes||!1,this.replacer=typeof t.replacer=="function"?t.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function sm(t,e){for(var r=Ge.repeat(" ",e),n=0,o=-1,i="",s,a=t.length;n<a;)o=t.indexOf(`
|
|
20
|
+
`,n),o===-1?(s=t.slice(n),n=a):(s=t.slice(n,o+1),n=o+1),s.length&&s!==`
|
|
21
|
+
`&&(i+=r),i+=s;return i}function Iu(t,e){return`
|
|
22
|
+
`+Ge.repeat(" ",t.indent*e)}function yP(t,e){var r,n,o;for(r=0,n=t.implicitTypes.length;r<n;r+=1)if(o=t.implicitTypes[r],o.resolve(e))return!0;return!1}function Pa(t){return t===QE||t===YE}function fi(t){return 32<=t&&t<=126||161<=t&&t<=55295&&t!==8232&&t!==8233||57344<=t&&t<=65533&&t!==Fu||65536<=t&&t<=1114111}function am(t){return fi(t)&&t!==Fu&&t!==XE&&t!==di}function cm(t,e,r){var n=am(t),o=n&&!Pa(t);return(r?n:n&&t!==zm&&t!==Km&&t!==Jm&&t!==Ym&&t!==Xm)&&t!==Ru&&!(e===Ea&&!o)||am(e)&&!Pa(e)&&t===Ru||e===Ea&&o}function bP(t){return fi(t)&&t!==Fu&&!Pa(t)&&t!==iP&&t!==cP&&t!==Ea&&t!==zm&&t!==Km&&t!==Jm&&t!==Ym&&t!==Xm&&t!==Ru&&t!==rP&&t!==oP&&t!==ZE&&t!==dP&&t!==sP&&t!==aP&&t!==nP&&t!==eP&&t!==tP&&t!==lP&&t!==uP}function vP(t){return!Pa(t)&&t!==Ea}function li(t,e){var r=t.charCodeAt(e),n;return r>=55296&&r<=56319&&e+1<t.length&&(n=t.charCodeAt(e+1),n>=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function Qm(t){var e=/^\n* /;return e.test(t)}function SP(t,e,r,n,o,i,s,a){var c,l=0,d=null,p=!1,u=!1,f=n!==-1,m=-1,h=bP(li(t,0))&&vP(li(t,t.length-1));if(e||s)for(c=0;c<t.length;l>=65536?c+=2:c++){if(l=li(t,c),!fi(l))return Zn;h=h&&cm(l,d,a),d=l}else{for(c=0;c<t.length;l>=65536?c+=2:c++){if(l=li(t,c),l===di)p=!0,f&&(u=u||c-m-1>n&&t[m+1]!==" ",m=c);else if(!fi(l))return Zn;h=h&&cm(l,d,a),d=l}u=u||f&&c-m-1>n&&t[m+1]!==" "}return!p&&!u?h&&!s&&!o(t)?Zm:i===pi?Zn:$u:r>9&&Qm(t)?Zn:s?i===pi?Zn:$u:u?tg:eg}function xP(t,e,r,n,o){t.dump=function(){if(e.length===0)return t.quotingType===pi?'""':"''";if(!t.noCompatMode&&(pP.indexOf(e)!==-1||fP.test(e)))return t.quotingType===pi?'"'+e+'"':"'"+e+"'";var i=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-i),a=n||t.flowLevel>-1&&r>=t.flowLevel;function c(l){return yP(t,l)}switch(SP(e,a,t.indent,s,c,t.quotingType,t.forceQuotes&&!n,o)){case Zm:return e;case $u:return"'"+e.replace(/'/g,"''")+"'";case eg:return"|"+lm(e,t.indent)+um(sm(e,i));case tg:return">"+lm(e,t.indent)+um(sm(kP(e,s),i));case Zn:return'"'+EP(e)+'"';default:throw new pt("impossible error: invalid scalar style")}}()}function lm(t,e){var r=Qm(t)?String(e):"",n=t[t.length-1]===`
|
|
23
|
+
`,o=n&&(t[t.length-2]===`
|
|
24
|
+
`||t===`
|
|
25
|
+
`),i=o?"+":n?"":"-";return r+i+`
|
|
26
|
+
`}function um(t){return t[t.length-1]===`
|
|
27
|
+
`?t.slice(0,-1):t}function kP(t,e){for(var r=/(\n+)([^\n]*)/g,n=function(){var l=t.indexOf(`
|
|
28
|
+
`);return l=l!==-1?l:t.length,r.lastIndex=l,dm(t.slice(0,l),e)}(),o=t[0]===`
|
|
29
|
+
`||t[0]===" ",i,s;s=r.exec(t);){var a=s[1],c=s[2];i=c[0]===" ",n+=a+(!o&&!i&&c!==""?`
|
|
30
|
+
`:"")+dm(c,e),o=i}return n}function dm(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,o=0,i,s=0,a=0,c="";n=r.exec(t);)a=n.index,a-o>e&&(i=s>o?s:a,c+=`
|
|
31
|
+
`+t.slice(o,i),o=i+1),s=a;return c+=`
|
|
32
|
+
`,t.length-o>e&&s>o?c+=t.slice(o,s)+`
|
|
33
|
+
`+t.slice(s+1):c+=t.slice(o),c.slice(1)}function EP(t){for(var e="",r=0,n,o=0;o<t.length;r>=65536?o+=2:o++)r=li(t,o),n=it[r],!n&&fi(r)?(e+=t[o],r>=65536&&(e+=t[o+1])):e+=n||mP(r);return e}function PP(t,e,r){var n="",o=t.tag,i,s,a;for(i=0,s=r.length;i<s;i+=1)a=r[i],t.replacer&&(a=t.replacer.call(r,String(i),a)),(kr(t,e,a,!1,!1)||typeof a>"u"&&kr(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=o,t.dump="["+n+"]"}function pm(t,e,r,n){var o="",i=t.tag,s,a,c;for(s=0,a=r.length;s<a;s+=1)c=r[s],t.replacer&&(c=t.replacer.call(r,String(s),c)),(kr(t,e+1,c,!0,!0,!1,!0)||typeof c>"u"&&kr(t,e+1,null,!0,!0,!1,!0))&&((!n||o!=="")&&(o+=Iu(t,e)),t.dump&&di===t.dump.charCodeAt(0)?o+="-":o+="- ",o+=t.dump);t.tag=i,t.dump=o||"[]"}function AP(t,e,r){var n="",o=t.tag,i=Object.keys(r),s,a,c,l,d;for(s=0,a=i.length;s<a;s+=1)d="",n!==""&&(d+=", "),t.condenseFlow&&(d+='"'),c=i[s],l=r[c],t.replacer&&(l=t.replacer.call(r,c,l)),kr(t,e,c,!1,!1)&&(t.dump.length>1024&&(d+="? "),d+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),kr(t,e,l,!1,!1)&&(d+=t.dump,n+=d));t.tag=o,t.dump="{"+n+"}"}function CP(t,e,r,n){var o="",i=t.tag,s=Object.keys(r),a,c,l,d,p,u;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new pt("sortKeys must be a boolean or a function");for(a=0,c=s.length;a<c;a+=1)u="",(!n||o!=="")&&(u+=Iu(t,e)),l=s[a],d=r[l],t.replacer&&(d=t.replacer.call(r,l,d)),kr(t,e+1,l,!0,!0,!0)&&(p=t.tag!==null&&t.tag!=="?"||t.dump&&t.dump.length>1024,p&&(t.dump&&di===t.dump.charCodeAt(0)?u+="?":u+="? "),u+=t.dump,p&&(u+=Iu(t,e)),kr(t,e+1,d,!0,p)&&(t.dump&&di===t.dump.charCodeAt(0)?u+=":":u+=": ",u+=t.dump,o+=u));t.tag=i,t.dump=o||"{}"}function fm(t,e,r){var n,o,i,s,a,c;for(o=r?t.explicitTypes:t.implicitTypes,i=0,s=o.length;i<s;i+=1)if(a=o[i],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof e=="object"&&e instanceof a.instanceOf)&&(!a.predicate||a.predicate(e))){if(r?a.multi&&a.representName?t.tag=a.representName(e):t.tag=a.tag:t.tag="?",a.represent){if(c=t.styleMap[a.tag]||a.defaultStyle,Gm.call(a.represent)==="[object Function]")n=a.represent(e,c);else if(Vm.call(a.represent,c))n=a.represent[c](e,c);else throw new pt("!<"+a.tag+'> tag resolver accepts not "'+c+'" style');t.dump=n}return!0}return!1}function kr(t,e,r,n,o,i,s){t.tag=null,t.dump=r,fm(t,r,!1)||fm(t,r,!0);var a=Gm.call(t.dump),c=n,l;n&&(n=t.flowLevel<0||t.flowLevel>e);var d=a==="[object Object]"||a==="[object Array]",p,u;if(d&&(p=t.duplicates.indexOf(r),u=p!==-1),(t.tag!==null&&t.tag!=="?"||u||t.indent!==2&&e>0)&&(o=!1),u&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(d&&u&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),a==="[object Object]")n&&Object.keys(t.dump).length!==0?(CP(t,e,t.dump,o),u&&(t.dump="&ref_"+p+t.dump)):(AP(t,e,t.dump),u&&(t.dump="&ref_"+p+" "+t.dump));else if(a==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?pm(t,e-1,t.dump,o):pm(t,e,t.dump,o),u&&(t.dump="&ref_"+p+t.dump)):(PP(t,e,t.dump),u&&(t.dump="&ref_"+p+" "+t.dump));else if(a==="[object String]")t.tag!=="?"&&xP(t,t.dump,e,i,c);else{if(a==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new pt("unacceptable kind of an object to dump "+a)}t.tag!==null&&t.tag!=="?"&&(l=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?l="!"+l:l.slice(0,18)==="tag:yaml.org,2002:"?l="!!"+l.slice(18):l="!<"+l+">",t.dump=l+" "+t.dump)}return!0}function _P(t,e){var r=[],n=[],o,i;for(Ou(t,r,n),o=0,i=n.length;o<i;o+=1)e.duplicates.push(r[n[o]]);e.usedDuplicates=new Array(i)}function Ou(t,e,r){var n,o,i;if(t!==null&&typeof t=="object")if(o=e.indexOf(t),o!==-1)r.indexOf(o)===-1&&r.push(o);else if(e.push(t),Array.isArray(t))for(o=0,i=t.length;o<i;o+=1)Ou(t[o],e,r);else for(n=Object.keys(t),o=0,i=n.length;o<i;o+=1)Ou(t[n[o]],e,r)}function TP(t,e){e=e||{};var r=new wP(e);r.noRefs||_P(t,r);var n=t;return r.replacer&&(n=r.replacer.call({"":n},"",n)),kr(r,0,n,!0,!0)?r.dump+`
|
|
34
|
+
`:""}function ju(t,e){return function(){throw new Error("Function yaml."+t+" is removed in js-yaml 4. Use yaml."+e+" instead, which is now safe by default.")}}var $0,O0,M0,D0,N0,L0,Ge,pt,j0,U0,W0,tt,gm,wm,ym,bm,vm,Sm,xm,km,nE,sE,Em,Pm,Am,Cm,_m,Tm,Rm,Mu,Im,wE,yE,$m,SE,Om,EE,Mm,Du,qr,Sa,Dm,Nm,xa,_u,CE,em,_E,TE,RE,Lm,Fm,Um,Wm,mn,nm,KE,JE,qm,Gm,Vm,Fu,YE,di,XE,QE,ZE,eP,Ru,tP,rP,nP,oP,zm,iP,Ea,sP,aP,cP,lP,Km,Jm,uP,Ym,dP,Xm,it,pP,fP,gP,pi,Zm,$u,eg,tg,Zn,RP,IP,$P,OP,MP,DP,NP,LP,FP,jP,UP,WP,BP,HP,qP,GP,Ct,Ca=D(()=>{$0=hm,O0=C0,M0=_0,D0=R0,N0=I0,L0=T0,Ge={isNothing:$0,isObject:O0,toArray:M0,repeat:D0,isNegativeZero:N0,extend:L0};ui.prototype=Object.create(Error.prototype);ui.prototype.constructor=ui;ui.prototype.toString=function(e){return this.name+": "+mm(this,e)};pt=ui;j0=F0,U0=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],W0=["scalar","sequence","mapping"];tt=H0;Tu.prototype.extend=function(e){var r=[],n=[];if(e instanceof tt)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new pt("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(i){if(!(i instanceof tt))throw new pt("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(i.loadKind&&i.loadKind!=="scalar")throw new pt("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(i.multi)throw new pt("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(i){if(!(i instanceof tt))throw new pt("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var o=Object.create(Tu.prototype);return o.implicit=(this.implicit||[]).concat(r),o.explicit=(this.explicit||[]).concat(n),o.compiledImplicit=Zh(o,"implicit"),o.compiledExplicit=Zh(o,"explicit"),o.compiledTypeMap=q0(o.compiledImplicit,o.compiledExplicit),o};gm=Tu,wm=new tt("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}}),ym=new tt("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}}),bm=new tt("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}}),vm=new gm({explicit:[wm,ym,bm]});Sm=new tt("tag:yaml.org,2002:null",{kind:"scalar",resolve:G0,construct:V0,predicate:z0,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});xm=new tt("tag:yaml.org,2002:bool",{kind:"scalar",resolve:K0,construct:J0,predicate:Y0,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"});km=new tt("tag:yaml.org,2002:int",{kind:"scalar",resolve:eE,construct:tE,predicate:rE,represent:{binary:function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),nE=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");sE=/^[-+]?[0-9]+e/;Em=new tt("tag:yaml.org,2002:float",{kind:"scalar",resolve:oE,construct:iE,predicate:cE,represent:aE,defaultStyle:"lowercase"}),Pm=vm.extend({implicit:[Sm,xm,km,Em]}),Am=Pm,Cm=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),_m=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");Tm=new tt("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:lE,construct:uE,instanceOf:Date,represent:dE});Rm=new tt("tag:yaml.org,2002:merge",{kind:"scalar",resolve:pE}),Mu=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
|
|
35
|
+
\r`;Im=new tt("tag:yaml.org,2002:binary",{kind:"scalar",resolve:fE,construct:hE,predicate:gE,represent:mE}),wE=Object.prototype.hasOwnProperty,yE=Object.prototype.toString;$m=new tt("tag:yaml.org,2002:omap",{kind:"sequence",resolve:bE,construct:vE}),SE=Object.prototype.toString;Om=new tt("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:xE,construct:kE}),EE=Object.prototype.hasOwnProperty;Mm=new tt("tag:yaml.org,2002:set",{kind:"mapping",resolve:PE,construct:AE}),Du=Am.extend({implicit:[Tm,Rm],explicit:[Im,$m,Om,Mm]}),qr=Object.prototype.hasOwnProperty,Sa=1,Dm=2,Nm=3,xa=4,_u=1,CE=2,em=3,_E=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,TE=/[\x85\u2028\u2029]/,RE=/[,\[\]\{\}]/,Lm=/^(?:!|!!|![a-z\-]+!)$/i,Fm=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;Um=new Array(256),Wm=new Array(256);for(mn=0;mn<256;mn++)Um[mn]=rm(mn)?1:0,Wm[mn]=rm(mn);nm={YAML:function(e,r,n){var o,i,s;e.version!==null&&Z(e,"duplication of %YAML directive"),n.length!==1&&Z(e,"YAML directive accepts exactly one argument"),o=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),o===null&&Z(e,"ill-formed argument of the YAML directive"),i=parseInt(o[1],10),s=parseInt(o[2],10),i!==1&&Z(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&ka(e,"unsupported YAML version of the document")},TAG:function(e,r,n){var o,i;n.length!==2&&Z(e,"TAG directive accepts exactly two arguments"),o=n[0],i=n[1],Lm.test(o)||Z(e,"ill-formed tag handle (first argument) of the TAG directive"),qr.call(e.tagMap,o)&&Z(e,'there is a previously declared suffix for "'+o+'" tag handle'),Fm.test(i)||Z(e,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch{Z(e,"tag prefix is malformed: "+i)}e.tagMap[o]=i}};KE=VE,JE=zE,qm={loadAll:KE,load:JE},Gm=Object.prototype.toString,Vm=Object.prototype.hasOwnProperty,Fu=65279,YE=9,di=10,XE=13,QE=32,ZE=33,eP=34,Ru=35,tP=37,rP=38,nP=39,oP=42,zm=44,iP=45,Ea=58,sP=61,aP=62,cP=63,lP=64,Km=91,Jm=93,uP=96,Ym=123,dP=124,Xm=125,it={};it[0]="\\0";it[7]="\\a";it[8]="\\b";it[9]="\\t";it[10]="\\n";it[11]="\\v";it[12]="\\f";it[13]="\\r";it[27]="\\e";it[34]='\\"';it[92]="\\\\";it[133]="\\N";it[160]="\\_";it[8232]="\\L";it[8233]="\\P";pP=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],fP=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;gP=1,pi=2;Zm=1,$u=2,eg=3,tg=4,Zn=5;RP=TP,IP={dump:RP};$P=tt,OP=gm,MP=vm,DP=Pm,NP=Am,LP=Du,FP=qm.load,jP=qm.loadAll,UP=IP.dump,WP=pt,BP={binary:Im,float:Em,map:bm,null:Sm,pairs:Om,set:Mm,timestamp:Tm,bool:xm,int:km,merge:Rm,omap:$m,seq:ym,str:wm},HP=ju("safeLoad","load"),qP=ju("safeLoadAll","loadAll"),GP=ju("safeDump","dump"),Ct={Type:$P,Schema:OP,FAILSAFE_SCHEMA:MP,JSON_SCHEMA:DP,CORE_SCHEMA:NP,DEFAULT_SCHEMA:LP,load:FP,loadAll:jP,dump:UP,YAMLException:WP,types:BP,safeLoad:HP,safeLoadAll:qP,safeDump:GP}});function ng(t){return Object.prototype.hasOwnProperty.call(rg,t)}function Uu(t){return rg[t]??!1}function Wu(t){return VP.has(t)}function ig(t){let{provider:e,hasImage:r,mode:n,visionProvider:o}=t;return r?n==="always"?e===o?{action:"unchanged"}:!Uu(o)||!Wu(o)?{action:"refuse",reason:`vision.model=${o} is not a working vision-capable provider`}:{action:"switch",to:o,reason:"vision.mode=always"}:Uu(e)&&Wu(e)?{action:"unchanged"}:n==="off"?{action:"refuse",reason:`${e} cannot see images (vision.mode=off \u2014 auto-fallback disabled)`}:!Uu(o)||!Wu(o)?{action:"refuse",reason:"no working vision-capable provider is configured"}:{action:"switch",to:o,reason:"vision.mode=auto fallback"}:{action:"unchanged"}}var rg,VP,og,_a=D(()=>{"use strict";rg={server:!0,google:!0,deepseek:!1,anthropic:!1,openai:!1,glm:!1,local:!1};VP=new Set(["server","local"]);og=["auto","off","always"]});function wn(t){let e=String(t||"").split(".");if(e.length!==3||!e[1]||e[1].length>16384)return"unknown";let r;try{let o=JSON.parse(Buffer.from(e[1],"base64url").toString("utf8"));if(!o||typeof o!="object"||Array.isArray(o))return"unknown";r=o}catch{return"unknown"}if(r.iss==="protocol"&&r.typ==="access"&&typeof r.sid=="string"&&r.sid.length>0&&typeof r.sub=="string"&&r.sub.length>0&&(r.prv==="google.com"||r.prv==="anonymous"))return"protocol";let n=Object.values(r).some(o=>!!o&&typeof o=="object"&&!Array.isArray(o)&&typeof o.sign_in_provider=="string");return typeof r.iss=="string"&&r.iss.startsWith("https://securetoken.google.com/")&&typeof r.sub=="string"&&r.sub.length>0&&typeof r.aud=="string"&&r.aud.length>0&&n?"legacy":"unknown"}var Bu=D(()=>{"use strict"});import{homedir as zP}from"node:os";import{resolve as KP,join as JP}from"node:path";function Ee(){let t=process.env.PROTOCOL_CLI_CONFIG_DIR?.trim();return t?KP(t):JP(zP(),".protocol-cli")}var Lt=D(()=>{"use strict"});import{existsSync as yn,mkdirSync as Hu,readFileSync as qu,writeFileSync as sg,rmSync as YP,chmodSync as XP}from"fs";import{homedir as hi}from"os";import{join as Kt}from"path";function ag(t){return"kernel"}function Jt(t=""){let e=(new K().get("api").endpoint||Ve.api.endpoint).replace(/\/$/,"");return t?`${e}${t.startsWith("/")?t:`/${t}`}`:e}var be,Ve,K,ge=D(()=>{"use strict";Ca();_a();Bu();Lt();be={cloud:{modelLocation:process.env.PROTOCOL_MODEL_LOCATION||"global",projectId:process.env.PROTOCOL_PROJECT_ID||process.env.PROJECT_ID||""},endpoints:{protocolApi:process.env.PROTOCOL_API_ENDPOINT||process.env.PROTOCOL_ENDPOINT||"https://protocolai.tech",openaiEmbedding:process.env.OPENAI_EMBEDDING_ENDPOINT||process.env.OPENAI_API_BASE||"https://api.openai.com/v1/embeddings"},models:{liteSentinel:process.env.PROTOCOL_MODEL_LITE_SENTINEL||process.env.MODEL_LITE_SENTINEL||"kernel-beta-sub",orchSentinel:process.env.PROTOCOL_MODEL_ORCH_SENTINEL||process.env.MODEL_ORCH_SENTINEL||"orchestrator",default:process.env.PROTOCOL_DEFAULT_MODEL||"@default",orch:process.env.PROTOCOL_ORCH_MODEL||process.env.MODEL_ORCH||"kernel",worker:process.env.PROTOCOL_WORKER_MODEL||process.env.MODEL_WORKER||"fast",localEndpoint:process.env.PROTOCOL_LOCAL_ENDPOINT||"http://127.0.0.1:8080/v1",localModel:process.env.PROTOCOL_LOCAL_MODEL||"",localThinking:process.env.PROTOCOL_LOCAL_THINKING==="1"},embeddings:{openaiModel:process.env.OPENAI_EMBEDDING_MODEL||process.env.EMBEDDING_MODEL||"text-embedding-3-small",localModel:process.env.LOCAL_EMBEDDING_MODEL||"Xenova/all-MiniLM-L6-v2"},auth:{openaiApiKey:process.env.OPENAI_API_KEY||""}},Ve={api:{endpoint:be.endpoints.protocolApi,location:be.cloud.modelLocation,projectId:be.cloud.projectId||void 0},auth:{sessionPath:Kt(Ee(),"session.json")},graph:{path:Kt(hi(),".protocol-cli","graphs"),defaultGraph:"default"},mcp:{servers:[]},storage:{cachePath:Kt(hi(),".protocol-cli","cache.db"),syncEnabled:!0},tools:{enabled:["read_file","write_file","edit_file","bash","grep_search","glob_search"],permissions:{bash:"ask",write_file:"ask",edit_file:"ask"}},plugin:{path:Kt(hi(),".protocol-cli","plugins")},models:{default:be.models.default,orch:be.models.orch,worker:be.models.worker,localEndpoint:be.models.localEndpoint,localModel:be.models.localModel,localThinking:be.models.localThinking},vision:{mode:"auto",model:"server"},chat:{engine:"builtin"},ui:{showLineNumbers:!0,theme:"protocol-scarlet",useNativeBackground:!1,primaryColor:"#ff2e2e"},device:{deviceId:""},embeddings:{provider:"protocol"}},K=class{configPath;defaultSessionPath;config;session=null;constructor(e){let r=Ee();this.defaultSessionPath=Kt(r,"session.json"),this.configPath=e||Kt(r,"config.yaml"),this.config=this.loadConfig(),this.session=this.loadSession()}cloneDefaults(){return{...Ve,api:{...Ve.api},auth:{...Ve.auth,sessionPath:this.defaultSessionPath},graph:{...Ve.graph},mcp:{...Ve.mcp,servers:[...Ve.mcp.servers]},storage:{...Ve.storage},tools:{...Ve.tools,enabled:[...Ve.tools.enabled],permissions:{...Ve.tools.permissions}},plugin:{...Ve.plugin},models:{...Ve.models},vision:{...Ve.vision},chat:{...Ve.chat},ui:{...Ve.ui},device:{...Ve.device},embeddings:{...Ve.embeddings}}}loadConfig(){if(!yn(this.configPath))return this.cloneDefaults();try{let e=qu(this.configPath,"utf-8"),r=Ct.load(e);return this.mergeConfig(this.cloneDefaults(),r)}catch{return this.cloneDefaults()}}normalizeProviderKey(e){if(typeof e=="string")return ng(e)?e:Ve.vision.model}mergeConfig(e,r){let n=this.normalizeProviderKey(r.vision?.model);return{...e,...r,api:{...e.api,...r.api},auth:{...e.auth,...r.auth},graph:{...e.graph,...r.graph},mcp:{...e.mcp,...r.mcp},storage:{...e.storage,...r.storage},tools:{...e.tools,...r.tools},plugin:{...e.plugin,...r.plugin},models:{...e.models,...r.models},vision:{...e.vision,...r.vision,...n?{model:n}:{}},chat:{...e.chat,...r.chat},ui:{...e.ui,...r.ui},device:{...e.device,...r.device},embeddings:{...e.embeddings,...r.embeddings}}}loadSession(){let e=this.config.auth.sessionPath;if(!yn(e))return null;try{let r=qu(e,"utf-8"),n=JSON.parse(r);return!n||!n.access_token||!n.user?null:n}catch{return null}}get(e){return this.config[e]}getAll(){return{...this.config}}set(e,r){this.config[e]={...this.config[e],...r},this.save()}save(){let e=Kt(this.configPath,"..");yn(e)||Hu(e,{recursive:!0});let r=Ct.dump(this.withoutHomedirDefaults());sg(this.configPath,r,"utf-8")}withoutHomedirDefaults(){let e=Kt(hi(),".protocol-cli")+"/",r=(n,o,i)=>{if(n?.[o]!==i)return n;let{[o]:s,...a}=n;return a};return{...this.config,auth:r(this.config.auth,"sessionPath",this.defaultSessionPath),graph:r(this.config.graph,"path",e+"graphs"),storage:r(this.config.storage,"cachePath",e+"cache.db"),plugin:r(this.config.plugin,"path",e+"plugins")}}getSession(){return this.session}setSession(e){this.session=e;let r=this.config.auth.sessionPath,n=Kt(r,"..");yn(n)||Hu(n,{recursive:!0,mode:448}),sg(r,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384});try{XP(r,384)}catch{}}clearSession(){this.session=null;let e=this.config.auth.sessionPath;yn(e)&&YP(e,{force:!0})}getConfigPath(){return this.configPath}resolveCredentials(){let e=this.config.api||{};return{session:this.getSession(),openaiApiKey:be.auth.openaiApiKey||"",projectId:e.projectId||be.cloud.projectId||"",endpoint:(e.endpoint||be.endpoints.protocolApi).replace(/\/$/,""),location:e.location||be.cloud.modelLocation||"global"}}getAuthStatus(){let e=this.resolveCredentials(),r=e.session,n=[],o=Date.now(),i=r?r.expires_at<=o:!0,s=r?Math.max(0,Math.round((r.expires_at-o)/1e3)):void 0,a=!!(r&&r.refresh_token),c=!!e.openaiApiKey,l=this.config.embeddings?.provider??"protocol",d="unauthenticated",p=!1,u="Protocol Session";if(r&&r.access_token&&r.user){let m=wn(r.access_token);d=m==="protocol"?"protocol_session":"legacy_session",u=m==="protocol"?"Protocol Session":"Legacy Session",p=!0}else n.push("Protocol Session (Run `protocol login` to authenticate)");let f;if(p){let m=r?.user?.email||"authenticated user",h=n.length>0?` [MISSING: ${n.join(", ")}]`:"";f=`Auth: ${u} (${m})${h} \xB7 Model: Protocol Proxy \xB7 Embeddings: ${l}`}else f=`Auth: Unauthenticated (Run \`protocol login\`) \xB7 Model: Protocol Proxy \xB7 Embeddings: ${l}`;return{source:d,authenticated:p,userEmail:r?.user?.email,userId:r?.user?.id,hasToken:!!(r&&r.access_token),hasRefreshToken:a,isTokenExpired:i,expiresInSeconds:s,embeddingProvider:l,hasOpenAiKey:c,apiEndpoint:e.endpoint,projectId:e.projectId||void 0,missingCredentials:n,statusLine:f}}ensureDirectories(){let e=[Kt(hi(),".protocol-cli"),this.config.graph.path,this.config.plugin.path];for(let r of e)yn(r)||Hu(r,{recursive:!0})}async getGraphConfig(e){let r=Kt(this.config.graph.path,`${e}.yaml`);if(!yn(r))throw new Error(`Graph config not found: ${e}`);return qu(r,"utf-8")}getDefaultGraph(){return this.config.graph.defaultGraph}getToolDescription(e){return{read:"Read file contents from the local filesystem",write:"Write content to a file",edit:"Edit a file by replacing text",bash:"Execute bash commands",grep:"Search for patterns in files",glob:"Find files matching patterns"}[e]||""}getToolSchema(e){return{read:{type:"object",properties:{file_path:{type:"string"},offset:{type:"number"},limit:{type:"number"}},required:["file_path"]},write:{type:"object",properties:{file_path:{type:"string"},content:{type:"string"},mode:{type:"string",enum:["create","overwrite","append"]}},required:["file_path","content"]},edit:{type:"object",properties:{file_path:{type:"string"},old_string:{type:"string"},new_string:{type:"string"}},required:["file_path","old_string","new_string"]},bash:{type:"object",properties:{command:{type:"string"}},required:["command"]},grep:{type:"object",properties:{pattern:{type:"string"},path:{type:"string"}},required:["pattern"]},glob:{type:"object",properties:{pattern:{type:"string"}},required:["pattern"]}}[e]||{}}}});function cg(t,e=Date.now(),r=3e4){if(typeof t!="string"||!t.trim())return null;let n=Number.isFinite(r)&&r>=0?r:3e4,o=t.trim();if(/^\d+(?:\.\d+)?$/.test(o))return Math.min(n,Math.max(0,Math.ceil(Number(o)*1e3)));let i=Date.parse(o);return!Number.isFinite(i)||i<=e?null:Math.min(n,Math.ceil(i-e))}var lg=D(()=>{});function QP(t){let e=`${t?.code??""} ${t?.message??""} ${String(t?.cause??"")}`;return/ENOTFOUND|EAI_AGAIN|getaddrinfo/i.test(e)?"DNS_UNAVAILABLE":/ENETUNREACH|EHOSTUNREACH|network is unreachable/i.test(e)?"NETWORK_UNREACHABLE":/ConnectTimeout|UND_ERR_CONNECT_TIMEOUT|ETIMEDOUT/i.test(e)?"CONNECT_TIMEOUT":/request timed out after/i.test(e)?"REQUEST_TIMEOUT":"NETWORK_ERROR"}function dg(t){let e=QP(t),r={DNS_UNAVAILABLE:"DNS \uC870\uD68C\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC744 \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",NETWORK_UNREACHABLE:"Protocol \uC11C\uBC84\uB85C \uAC00\uB294 \uB124\uD2B8\uC6CC\uD06C \uACBD\uB85C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uC774 \uBCF5\uAD6C\uB418\uBA74 \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4.",CONNECT_TIMEOUT:"Protocol \uC11C\uBC84 \uC5F0\uACB0 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB410\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",REQUEST_TIMEOUT:"Protocol \uC11C\uBC84 \uC751\uB2F5 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB410\uC2B5\uB2C8\uB2E4. \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",NETWORK_ERROR:"Protocol \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uB124\uD2B8\uC6CC\uD06C\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694."};return new zu(e,`${r[e]} (${e})`,{cause:t})}async function Gu(t,e,r){for(let n=0;;n++)try{let o=await fetch(t,e);if(r&&n<Ta.length&&[502,503,504].includes(o.status)){await pg(cg(o.headers.get("Retry-After"))??Ta[n]);continue}return o}catch(o){if(e.signal?.aborted||!r||n>=Ta.length)throw e.signal?.aborted&&e.signal.reason instanceof Error&&/request timed out after/.test(e.signal.reason.message)?dg(e.signal.reason):e.signal?.aborted?o:dg(o);await pg(Ta[n])}}function Ye(){return Vu||(Vu=new ve),Vu}var ug,Ta,zu,pg,ve,Vu,ze=D(()=>{"use strict";ge();Bu();lg();ug=12e4,Ta=[150,500],zu=class extends Error{constructor(r,n,o){super(n,o);this.code=r;this.name="ProtocolNetworkError"}};pg=t=>new Promise(e=>setTimeout(e,t));ve=class{config;refreshInFlight=null;constructor(e){this.config=e??new K}get endpoint(){let e=this.config.resolveCredentials().endpoint;if(!e)throw new Error("API endpoint not configured. Run `protocol config set api.endpoint <url>`");return e}async refreshProtocolSession(e){let r=await Gu(`${this.endpoint}/api/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e.refresh_token})},!1),n=await r.json().catch(()=>({}));if(!r.ok){let o=n.error==="REFRESH_RACED"?"REFRESH_RACED":r.status===503?"AUTH_UNAVAILABLE":n.error==="INVALID_REFRESH"||n.error==="REFRESH_REUSED"?"AUTH_EXPIRED":"AUTH_REFRESH_FAILED";throw Object.assign(new Error(n.error||`Protocol token refresh failed (${r.status})`),{code:o})}if(!n.accessToken||!n.refreshToken||!n.uid||!Number.isFinite(n.expiresIn))throw Object.assign(new Error("Protocol token refresh returned an incomplete session"),{code:"AUTH_REFRESH_FAILED"});if(n.uid!==e.user.id||wn(n.accessToken)!=="protocol")throw Object.assign(new Error("Protocol token refresh returned a mismatched session"),{code:"AUTH_REFRESH_FAILED"});return{access_token:n.accessToken,refresh_token:n.refreshToken,expires_at:Date.now()+Number(n.expiresIn)*1e3,user:e.user}}async upgradeLegacySession(e){let r=await Gu(`${this.endpoint}/api/auth/upgrade`,{method:"POST",headers:{Authorization:`Bearer ${e.access_token}`}},!1),n=await r.json().catch(()=>({}));if(!r.ok){let o=r.status===401||r.status===403||r.status===404,i=r.status===503?"AUTH_UNAVAILABLE":o?"LEGACY_SESSION_RELOGIN_REQUIRED":"AUTH_UPGRADE_FAILED",s=o?"This session is from an older sign-in and cannot be upgraded. Run `protocol login` again.":n.error||`Session upgrade failed (${r.status})`;throw Object.assign(new Error(s),{code:i})}if(!n.accessToken||!n.refreshToken||!n.uid||!Number.isFinite(n.expiresIn)||n.uid!==e.user.id||wn(n.accessToken)!=="protocol")throw Object.assign(new Error("Session upgrade returned a mismatched session"),{code:"AUTH_UPGRADE_FAILED"});return{access_token:n.accessToken,refresh_token:n.refreshToken,expires_at:Date.now()+Number(n.expiresIn)*1e3,user:e.user}}async refreshSession(e){let r=wn(e.access_token);if(r==="protocol")return await this.refreshProtocolSession(e);if(r==="legacy")return await this.upgradeLegacySession(e);throw Object.assign(new Error("Stored session token format is unknown; login again without deleting the session."),{code:"SESSION_KIND_UNKNOWN"})}async getValidToken(e=()=>{}){let r=this.config.getSession();if(!r)throw new Error("Not authenticated. Run `protocol login` first.");if(wn(r.access_token)==="legacy")try{this.refreshInFlight??=this.upgradeLegacySession(r).finally(()=>{this.refreshInFlight=null}),r=await this.refreshInFlight,e(),this.config.setSession(r)}catch(n){throw n.code==="LEGACY_SESSION_RELOGIN_REQUIRED"&&(e(),this.config.clearSession()),n}if(r.expires_at-Date.now()<6e4&&r.refresh_token)try{this.refreshInFlight??=this.refreshSession(r).finally(()=>{this.refreshInFlight=null}),r=await this.refreshInFlight,e(),this.config.setSession(r)}catch(n){let o=n,i=new Set(["AUTH_EXPIRED"]);if(o.code&&i.has(o.code)){e(),this.config.clearSession();let s="Session expired. Run `protocol login` again.";throw Object.assign(new Error(s),{code:o.code})}throw o}return r.access_token}async request(e,r,n){let o=()=>{if(!n)return;let l=new K().resolveCredentials();if(l.session?.user.id!==n.uid||l.endpoint!==n.endpoint||this.config.getSession()?.user.id!==n.uid||this.endpoint!==n.endpoint)throw new Error("Worker account changed")};o();let i=await this.getValidToken(o);o();let s=new AbortController,a=setTimeout(()=>s.abort(new Error(`request timed out after ${ug/1e3}s`)),ug),c=r?.signal;c&&(c.aborted?s.abort(c.reason):c.addEventListener("abort",()=>s.abort(c.reason),{once:!0}));try{let l=(r?.method??"GET").toUpperCase();return await Gu(`${this.endpoint}${e}`,{...r,signal:s.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`,...r?.headers||{}}},l==="GET"||l==="HEAD")}finally{clearTimeout(a)}}},Vu=null});function gi(t){let e=["codex","claude","claude-code","gemini","gemini-cli"].includes(t);return Object.freeze({resume:e?"next-turn":"unsupported",liveInput:"unsupported",terminalAttach:"unsupported",stop:t==="local"?"abort":"owned-process",externalImport:"unsupported"})}var Ra=D(()=>{});var xg=dt((gN,hA)=>{hA.exports={name:"dotenv",version:"16.6.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var Cg=dt((wN,Er)=>{var Qu=xr("fs"),Da=xr("path"),mA=xr("os"),gA=xr("crypto"),wA=xg(),Zu=wA.version,yA=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function bA(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,`
|
|
36
|
+
`);let n;for(;(n=yA.exec(r))!=null;){let o=n[1],i=n[2]||"";i=i.trim();let s=i[0];i=i.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),s==='"'&&(i=i.replace(/\\n/g,`
|
|
37
|
+
`),i=i.replace(/\\r/g,"\r")),e[o]=i}return e}function vA(t){t=t||{};let e=Ag(t);t.path=e;let r=Ke.configDotenv(t);if(!r.parsed){let s=new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);throw s.code="MISSING_DATA",s}let n=Pg(t).split(","),o=n.length,i;for(let s=0;s<o;s++)try{let a=n[s].trim(),c=xA(r,a);i=Ke.decrypt(c.ciphertext,c.key);break}catch(a){if(s+1>=o)throw a}return Ke.parse(i)}function SA(t){console.log(`[dotenv@${Zu}][WARN] ${t}`)}function yi(t){console.log(`[dotenv@${Zu}][DEBUG] ${t}`)}function Eg(t){console.log(`[dotenv@${Zu}] ${t}`)}function Pg(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function xA(t,e){let r;try{r=new URL(e)}catch(a){if(a.code==="ERR_INVALID_URL"){let c=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw c.code="INVALID_DOTENV_KEY",c}throw a}let n=r.password;if(!n){let a=new Error("INVALID_DOTENV_KEY: Missing key part");throw a.code="INVALID_DOTENV_KEY",a}let o=r.searchParams.get("environment");if(!o){let a=new Error("INVALID_DOTENV_KEY: Missing environment part");throw a.code="INVALID_DOTENV_KEY",a}let i=`DOTENV_VAULT_${o.toUpperCase()}`,s=t.parsed[i];if(!s){let a=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${i} in your .env.vault file.`);throw a.code="NOT_FOUND_DOTENV_ENVIRONMENT",a}return{ciphertext:s,key:n}}function Ag(t){let e=null;if(t&&t.path&&t.path.length>0)if(Array.isArray(t.path))for(let r of t.path)Qu.existsSync(r)&&(e=r.endsWith(".vault")?r:`${r}.vault`);else e=t.path.endsWith(".vault")?t.path:`${t.path}.vault`;else e=Da.resolve(process.cwd(),".env.vault");return Qu.existsSync(e)?e:null}function kg(t){return t[0]==="~"?Da.join(mA.homedir(),t.slice(1)):t}function kA(t){let e=!!(t&&t.debug),r=t&&"quiet"in t?t.quiet:!0;(e||!r)&&Eg("Loading env from encrypted .env.vault");let n=Ke._parseVault(t),o=process.env;return t&&t.processEnv!=null&&(o=t.processEnv),Ke.populate(o,n,t),{parsed:n}}function EA(t){let e=Da.resolve(process.cwd(),".env"),r="utf8",n=!!(t&&t.debug),o=t&&"quiet"in t?t.quiet:!0;t&&t.encoding?r=t.encoding:n&&yi("No encoding is specified. UTF-8 is used by default");let i=[e];if(t&&t.path)if(!Array.isArray(t.path))i=[kg(t.path)];else{i=[];for(let l of t.path)i.push(kg(l))}let s,a={};for(let l of i)try{let d=Ke.parse(Qu.readFileSync(l,{encoding:r}));Ke.populate(a,d,t)}catch(d){n&&yi(`Failed to load ${l} ${d.message}`),s=d}let c=process.env;if(t&&t.processEnv!=null&&(c=t.processEnv),Ke.populate(c,a,t),n||!o){let l=Object.keys(a).length,d=[];for(let p of i)try{let u=Da.relative(process.cwd(),p);d.push(u)}catch(u){n&&yi(`Failed to load ${p} ${u.message}`),s=u}Eg(`injecting env (${l}) from ${d.join(",")}`)}return s?{parsed:a,error:s}:{parsed:a}}function PA(t){if(Pg(t).length===0)return Ke.configDotenv(t);let e=Ag(t);return e?Ke._configVault(t):(SA(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),Ke.configDotenv(t))}function AA(t,e){let r=Buffer.from(e.slice(-64),"hex"),n=Buffer.from(t,"base64"),o=n.subarray(0,12),i=n.subarray(-16);n=n.subarray(12,-16);try{let s=gA.createDecipheriv("aes-256-gcm",r,o);return s.setAuthTag(i),`${s.update(n)}${s.final()}`}catch(s){let a=s instanceof RangeError,c=s.message==="Invalid key length",l=s.message==="Unsupported state or unable to authenticate data";if(a||c){let d=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw d.code="INVALID_DOTENV_KEY",d}else if(l){let d=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw d.code="DECRYPTION_FAILED",d}else throw s}}function CA(t,e,r={}){let n=!!(r&&r.debug),o=!!(r&&r.override);if(typeof e!="object"){let i=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw i.code="OBJECT_REQUIRED",i}for(let i of Object.keys(e))Object.prototype.hasOwnProperty.call(t,i)?(o===!0&&(t[i]=e[i]),n&&yi(o===!0?`"${i}" is already defined and WAS overwritten`:`"${i}" is already defined and was NOT overwritten`)):t[i]=e[i]}var Ke={configDotenv:EA,_configVault:kA,_parseVault:vA,config:PA,decrypt:AA,parse:bA,populate:CA};Er.exports.configDotenv=Ke.configDotenv;Er.exports._configVault=Ke._configVault;Er.exports._parseVault=Ke._parseVault;Er.exports.config=Ke.config;Er.exports.decrypt=Ke.decrypt;Er.exports.parse=Ke.parse;Er.exports.populate=Ke.populate;Er.exports=Ke});var Tg=dt((yN,_g)=>{var vn={};process.env.DOTENV_CONFIG_ENCODING!=null&&(vn.encoding=process.env.DOTENV_CONFIG_ENCODING);process.env.DOTENV_CONFIG_PATH!=null&&(vn.path=process.env.DOTENV_CONFIG_PATH);process.env.DOTENV_CONFIG_QUIET!=null&&(vn.quiet=process.env.DOTENV_CONFIG_QUIET);process.env.DOTENV_CONFIG_DEBUG!=null&&(vn.debug=process.env.DOTENV_CONFIG_DEBUG);process.env.DOTENV_CONFIG_OVERRIDE!=null&&(vn.override=process.env.DOTENV_CONFIG_OVERRIDE);process.env.DOTENV_CONFIG_DOTENV_KEY!=null&&(vn.DOTENV_KEY=process.env.DOTENV_CONFIG_DOTENV_KEY);_g.exports=vn});var Ig=dt((bN,Rg)=>{var _A=/^dotenv_config_(encoding|path|quiet|debug|override|DOTENV_KEY)=(.+)$/;Rg.exports=function(e){let r=e.reduce(function(n,o){let i=o.match(_A);return i&&(n[i[1]]=i[2]),n},{});return"quiet"in r||(r.quiet="true"),r}});var bi=dt(td=>{var Na=class extends Error{constructor(e,r,n){super(n),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=r,this.exitCode=e,this.nestedError=void 0}},ed=class extends Na{constructor(e){super(1,"commander.invalidArgument",e),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};td.CommanderError=Na;td.InvalidArgumentError=ed});var La=dt(nd=>{var{InvalidArgumentError:TA}=bi(),rd=class{constructor(e,r){switch(this.description=r||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,e[0]){case"<":this.required=!0,this._name=e.slice(1,-1);break;case"[":this.required=!1,this._name=e.slice(1,-1);break;default:this.required=!0,this._name=e;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(e,r){return r===this.defaultValue||!Array.isArray(r)?[e]:r.concat(e)}default(e,r){return this.defaultValue=e,this.defaultValueDescription=r,this}argParser(e){return this.parseArg=e,this}choices(e){return this.argChoices=e.slice(),this.parseArg=(r,n)=>{if(!this.argChoices.includes(r))throw new TA(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(r,n):r},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function RA(t){let e=t.name()+(t.variadic===!0?"...":"");return t.required?"<"+e+">":"["+e+"]"}nd.Argument=rd;nd.humanReadableArgName=RA});var id=dt($g=>{var{humanReadableArgName:IA}=La(),od=class{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(e){let r=e.commands.filter(o=>!o._hidden),n=e._getHelpCommand();return n&&!n._hidden&&r.push(n),this.sortSubcommands&&r.sort((o,i)=>o.name().localeCompare(i.name())),r}compareOptions(e,r){let n=o=>o.short?o.short.replace(/^-/,""):o.long.replace(/^--/,"");return n(e).localeCompare(n(r))}visibleOptions(e){let r=e.options.filter(o=>!o.hidden),n=e._getHelpOption();if(n&&!n.hidden){let o=n.short&&e._findOption(n.short),i=n.long&&e._findOption(n.long);!o&&!i?r.push(n):n.long&&!i?r.push(e.createOption(n.long,n.description)):n.short&&!o&&r.push(e.createOption(n.short,n.description))}return this.sortOptions&&r.sort(this.compareOptions),r}visibleGlobalOptions(e){if(!this.showGlobalOptions)return[];let r=[];for(let n=e.parent;n;n=n.parent){let o=n.options.filter(i=>!i.hidden);r.push(...o)}return this.sortOptions&&r.sort(this.compareOptions),r}visibleArguments(e){return e._argsDescription&&e.registeredArguments.forEach(r=>{r.description=r.description||e._argsDescription[r.name()]||""}),e.registeredArguments.find(r=>r.description)?e.registeredArguments:[]}subcommandTerm(e){let r=e.registeredArguments.map(n=>IA(n)).join(" ");return e._name+(e._aliases[0]?"|"+e._aliases[0]:"")+(e.options.length?" [options]":"")+(r?" "+r:"")}optionTerm(e){return e.flags}argumentTerm(e){return e.name()}longestSubcommandTermLength(e,r){return r.visibleCommands(e).reduce((n,o)=>Math.max(n,r.subcommandTerm(o).length),0)}longestOptionTermLength(e,r){return r.visibleOptions(e).reduce((n,o)=>Math.max(n,r.optionTerm(o).length),0)}longestGlobalOptionTermLength(e,r){return r.visibleGlobalOptions(e).reduce((n,o)=>Math.max(n,r.optionTerm(o).length),0)}longestArgumentTermLength(e,r){return r.visibleArguments(e).reduce((n,o)=>Math.max(n,r.argumentTerm(o).length),0)}commandUsage(e){let r=e._name;e._aliases[0]&&(r=r+"|"+e._aliases[0]);let n="";for(let o=e.parent;o;o=o.parent)n=o.name()+" "+n;return n+r+" "+e.usage()}commandDescription(e){return e.description()}subcommandDescription(e){return e.summary()||e.description()}optionDescription(e){let r=[];return e.argChoices&&r.push(`choices: ${e.argChoices.map(n=>JSON.stringify(n)).join(", ")}`),e.defaultValue!==void 0&&(e.required||e.optional||e.isBoolean()&&typeof e.defaultValue=="boolean")&&r.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),e.presetArg!==void 0&&e.optional&&r.push(`preset: ${JSON.stringify(e.presetArg)}`),e.envVar!==void 0&&r.push(`env: ${e.envVar}`),r.length>0?`${e.description} (${r.join(", ")})`:e.description}argumentDescription(e){let r=[];if(e.argChoices&&r.push(`choices: ${e.argChoices.map(n=>JSON.stringify(n)).join(", ")}`),e.defaultValue!==void 0&&r.push(`default: ${e.defaultValueDescription||JSON.stringify(e.defaultValue)}`),r.length>0){let n=`(${r.join(", ")})`;return e.description?`${e.description} ${n}`:n}return e.description}formatHelp(e,r){let n=r.padWidth(e,r),o=r.helpWidth||80,i=2,s=2;function a(m,h){if(h){let w=`${m.padEnd(n+s)}${h}`;return r.wrap(w,o-i,n+s)}return m}function c(m){return m.join(`
|
|
38
|
+
`).replace(/^/gm," ".repeat(i))}let l=[`Usage: ${r.commandUsage(e)}`,""],d=r.commandDescription(e);d.length>0&&(l=l.concat([r.wrap(d,o,0),""]));let p=r.visibleArguments(e).map(m=>a(r.argumentTerm(m),r.argumentDescription(m)));p.length>0&&(l=l.concat(["Arguments:",c(p),""]));let u=r.visibleOptions(e).map(m=>a(r.optionTerm(m),r.optionDescription(m)));if(u.length>0&&(l=l.concat(["Options:",c(u),""])),this.showGlobalOptions){let m=r.visibleGlobalOptions(e).map(h=>a(r.optionTerm(h),r.optionDescription(h)));m.length>0&&(l=l.concat(["Global Options:",c(m),""]))}let f=r.visibleCommands(e).map(m=>a(r.subcommandTerm(m),r.subcommandDescription(m)));return f.length>0&&(l=l.concat(["Commands:",c(f),""])),l.join(`
|
|
39
|
+
`)}padWidth(e,r){return Math.max(r.longestOptionTermLength(e,r),r.longestGlobalOptionTermLength(e,r),r.longestSubcommandTermLength(e,r),r.longestArgumentTermLength(e,r))}wrap(e,r,n,o=40){let i=" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF",s=new RegExp(`[\\n][${i}]+`);if(e.match(s))return e;let a=r-n;if(a<o)return e;let c=e.slice(0,n),l=e.slice(n).replace(`\r
|
|
40
|
+
`,`
|
|
41
|
+
`),d=" ".repeat(n),u="\\s\u200B",f=new RegExp(`
|
|
42
|
+
|.{1,${a-1}}([${u}]|$)|[^${u}]+?([${u}]|$)`,"g"),m=l.match(f)||[];return c+m.map((h,w)=>h===`
|
|
43
|
+
`?"":(w>0?d:"")+h.trimEnd()).join(`
|
|
44
|
+
`)}};$g.Help=od});var ld=dt(cd=>{var{InvalidArgumentError:$A}=bi(),sd=class{constructor(e,r){this.flags=e,this.description=r||"",this.required=e.includes("<"),this.optional=e.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(e),this.mandatory=!1;let n=MA(e);this.short=n.shortFlag,this.long=n.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(e,r){return this.defaultValue=e,this.defaultValueDescription=r,this}preset(e){return this.presetArg=e,this}conflicts(e){return this.conflictsWith=this.conflictsWith.concat(e),this}implies(e){let r=e;return typeof e=="string"&&(r={[e]:!0}),this.implied=Object.assign(this.implied||{},r),this}env(e){return this.envVar=e,this}argParser(e){return this.parseArg=e,this}makeOptionMandatory(e=!0){return this.mandatory=!!e,this}hideHelp(e=!0){return this.hidden=!!e,this}_concatValue(e,r){return r===this.defaultValue||!Array.isArray(r)?[e]:r.concat(e)}choices(e){return this.argChoices=e.slice(),this.parseArg=(r,n)=>{if(!this.argChoices.includes(r))throw new $A(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(r,n):r},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return OA(this.name().replace(/^no-/,""))}is(e){return this.short===e||this.long===e}isBoolean(){return!this.required&&!this.optional&&!this.negate}},ad=class{constructor(e){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,e.forEach(r=>{r.negate?this.negativeOptions.set(r.attributeName(),r):this.positiveOptions.set(r.attributeName(),r)}),this.negativeOptions.forEach((r,n)=>{this.positiveOptions.has(n)&&this.dualOptions.add(n)})}valueFromOption(e,r){let n=r.attributeName();if(!this.dualOptions.has(n))return!0;let o=this.negativeOptions.get(n).presetArg,i=o!==void 0?o:!1;return r.negate===(i===e)}};function OA(t){return t.split("-").reduce((e,r)=>e+r[0].toUpperCase()+r.slice(1))}function MA(t){let e,r,n=t.split(/[ |,]+/);return n.length>1&&!/^[[<]/.test(n[1])&&(e=n.shift()),r=n.shift(),!e&&/^-[^-]$/.test(r)&&(e=r,r=void 0),{shortFlag:e,longFlag:r}}cd.Option=sd;cd.DualOptions=ad});var Mg=dt(Og=>{function DA(t,e){if(Math.abs(t.length-e.length)>3)return Math.max(t.length,e.length);let r=[];for(let n=0;n<=t.length;n++)r[n]=[n];for(let n=0;n<=e.length;n++)r[0][n]=n;for(let n=1;n<=e.length;n++)for(let o=1;o<=t.length;o++){let i=1;t[o-1]===e[n-1]?i=0:i=1,r[o][n]=Math.min(r[o-1][n]+1,r[o][n-1]+1,r[o-1][n-1]+i),o>1&&n>1&&t[o-1]===e[n-2]&&t[o-2]===e[n-1]&&(r[o][n]=Math.min(r[o][n],r[o-2][n-2]+1))}return r[t.length][e.length]}function NA(t,e){if(!e||e.length===0)return"";e=Array.from(new Set(e));let r=t.startsWith("--");r&&(t=t.slice(2),e=e.map(s=>s.slice(2)));let n=[],o=3,i=.4;return e.forEach(s=>{if(s.length<=1)return;let a=DA(t,s),c=Math.max(t.length,s.length);(c-a)/c>i&&(a<o?(o=a,n=[s]):a===o&&n.push(s))}),n.sort((s,a)=>s.localeCompare(a)),r&&(n=n.map(s=>`--${s}`)),n.length>1?`
|
|
45
|
+
(Did you mean one of ${n.join(", ")}?)`:n.length===1?`
|
|
46
|
+
(Did you mean ${n[0]}?)`:""}Og.suggestSimilar=NA});var jg=dt(Fg=>{var LA=xr("node:events").EventEmitter,ud=xr("node:child_process"),Pr=xr("node:path"),dd=xr("node:fs"),Me=xr("node:process"),{Argument:FA,humanReadableArgName:jA}=La(),{CommanderError:pd}=bi(),{Help:UA}=id(),{Option:Dg,DualOptions:WA}=ld(),{suggestSimilar:Ng}=Mg(),fd=class t extends LA{constructor(e){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=e||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:r=>Me.stdout.write(r),writeErr:r=>Me.stderr.write(r),getOutHelpWidth:()=>Me.stdout.isTTY?Me.stdout.columns:void 0,getErrHelpWidth:()=>Me.stderr.isTTY?Me.stderr.columns:void 0,outputError:(r,n)=>n(r)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(e){return this._outputConfiguration=e._outputConfiguration,this._helpOption=e._helpOption,this._helpCommand=e._helpCommand,this._helpConfiguration=e._helpConfiguration,this._exitCallback=e._exitCallback,this._storeOptionsAsProperties=e._storeOptionsAsProperties,this._combineFlagAndOptionalValue=e._combineFlagAndOptionalValue,this._allowExcessArguments=e._allowExcessArguments,this._enablePositionalOptions=e._enablePositionalOptions,this._showHelpAfterError=e._showHelpAfterError,this._showSuggestionAfterError=e._showSuggestionAfterError,this}_getCommandAndAncestors(){let e=[];for(let r=this;r;r=r.parent)e.push(r);return e}command(e,r,n){let o=r,i=n;typeof o=="object"&&o!==null&&(i=o,o=null),i=i||{};let[,s,a]=e.match(/([^ ]+) *(.*)/),c=this.createCommand(s);return o&&(c.description(o),c._executableHandler=!0),i.isDefault&&(this._defaultCommandName=c._name),c._hidden=!!(i.noHelp||i.hidden),c._executableFile=i.executableFile||null,a&&c.arguments(a),this._registerCommand(c),c.parent=this,c.copyInheritedSettings(this),o?this:c}createCommand(e){return new t(e)}createHelp(){return Object.assign(new UA,this.configureHelp())}configureHelp(e){return e===void 0?this._helpConfiguration:(this._helpConfiguration=e,this)}configureOutput(e){return e===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,e),this)}showHelpAfterError(e=!0){return typeof e!="string"&&(e=!!e),this._showHelpAfterError=e,this}showSuggestionAfterError(e=!0){return this._showSuggestionAfterError=!!e,this}addCommand(e,r){if(!e._name)throw new Error(`Command passed to .addCommand() must have a name
|
|
47
|
+
- specify the name in Command constructor or using .name()`);return r=r||{},r.isDefault&&(this._defaultCommandName=e._name),(r.noHelp||r.hidden)&&(e._hidden=!0),this._registerCommand(e),e.parent=this,e._checkForBrokenPassThrough(),this}createArgument(e,r){return new FA(e,r)}argument(e,r,n,o){let i=this.createArgument(e,r);return typeof n=="function"?i.default(o).argParser(n):i.default(n),this.addArgument(i),this}arguments(e){return e.trim().split(/ +/).forEach(r=>{this.argument(r)}),this}addArgument(e){let r=this.registeredArguments.slice(-1)[0];if(r&&r.variadic)throw new Error(`only the last argument can be variadic '${r.name()}'`);if(e.required&&e.defaultValue!==void 0&&e.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${e.name()}'`);return this.registeredArguments.push(e),this}helpCommand(e,r){if(typeof e=="boolean")return this._addImplicitHelpCommand=e,this;e=e??"help [command]";let[,n,o]=e.match(/([^ ]+) *(.*)/),i=r??"display help for command",s=this.createCommand(n);return s.helpOption(!1),o&&s.arguments(o),i&&s.description(i),this._addImplicitHelpCommand=!0,this._helpCommand=s,this}addHelpCommand(e,r){return typeof e!="object"?(this.helpCommand(e,r),this):(this._addImplicitHelpCommand=!0,this._helpCommand=e,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(e,r){let n=["preSubcommand","preAction","postAction"];if(!n.includes(e))throw new Error(`Unexpected value for event passed to hook : '${e}'.
|
|
48
|
+
Expecting one of '${n.join("', '")}'`);return this._lifeCycleHooks[e]?this._lifeCycleHooks[e].push(r):this._lifeCycleHooks[e]=[r],this}exitOverride(e){return e?this._exitCallback=e:this._exitCallback=r=>{if(r.code!=="commander.executeSubCommandAsync")throw r},this}_exit(e,r,n){this._exitCallback&&this._exitCallback(new pd(e,r,n)),Me.exit(e)}action(e){let r=n=>{let o=this.registeredArguments.length,i=n.slice(0,o);return this._storeOptionsAsProperties?i[o]=this:i[o]=this.opts(),i.push(this),e.apply(this,i)};return this._actionHandler=r,this}createOption(e,r){return new Dg(e,r)}_callParseArg(e,r,n,o){try{return e.parseArg(r,n)}catch(i){if(i.code==="commander.invalidArgument"){let s=`${o} ${i.message}`;this.error(s,{exitCode:i.exitCode,code:i.code})}throw i}}_registerOption(e){let r=e.short&&this._findOption(e.short)||e.long&&this._findOption(e.long);if(r){let n=e.long&&this._findOption(e.long)?e.long:e.short;throw new Error(`Cannot add option '${e.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${n}'
|
|
49
|
+
- already used by option '${r.flags}'`)}this.options.push(e)}_registerCommand(e){let r=o=>[o.name()].concat(o.aliases()),n=r(e).find(o=>this._findCommand(o));if(n){let o=r(this._findCommand(n)).join("|"),i=r(e).join("|");throw new Error(`cannot add command '${i}' as already have command '${o}'`)}this.commands.push(e)}addOption(e){this._registerOption(e);let r=e.name(),n=e.attributeName();if(e.negate){let i=e.long.replace(/^--no-/,"--");this._findOption(i)||this.setOptionValueWithSource(n,e.defaultValue===void 0?!0:e.defaultValue,"default")}else e.defaultValue!==void 0&&this.setOptionValueWithSource(n,e.defaultValue,"default");let o=(i,s,a)=>{i==null&&e.presetArg!==void 0&&(i=e.presetArg);let c=this.getOptionValue(n);i!==null&&e.parseArg?i=this._callParseArg(e,i,c,s):i!==null&&e.variadic&&(i=e._concatValue(i,c)),i==null&&(e.negate?i=!1:e.isBoolean()||e.optional?i=!0:i=""),this.setOptionValueWithSource(n,i,a)};return this.on("option:"+r,i=>{let s=`error: option '${e.flags}' argument '${i}' is invalid.`;o(i,s,"cli")}),e.envVar&&this.on("optionEnv:"+r,i=>{let s=`error: option '${e.flags}' value '${i}' from env '${e.envVar}' is invalid.`;o(i,s,"env")}),this}_optionEx(e,r,n,o,i){if(typeof r=="object"&&r instanceof Dg)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let s=this.createOption(r,n);if(s.makeOptionMandatory(!!e.mandatory),typeof o=="function")s.default(i).argParser(o);else if(o instanceof RegExp){let a=o;o=(c,l)=>{let d=a.exec(c);return d?d[0]:l},s.default(i).argParser(o)}else s.default(o);return this.addOption(s)}option(e,r,n,o){return this._optionEx({},e,r,n,o)}requiredOption(e,r,n,o){return this._optionEx({mandatory:!0},e,r,n,o)}combineFlagAndOptionalValue(e=!0){return this._combineFlagAndOptionalValue=!!e,this}allowUnknownOption(e=!0){return this._allowUnknownOption=!!e,this}allowExcessArguments(e=!0){return this._allowExcessArguments=!!e,this}enablePositionalOptions(e=!0){return this._enablePositionalOptions=!!e,this}passThroughOptions(e=!0){return this._passThroughOptions=!!e,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(e=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!e,this}getOptionValue(e){return this._storeOptionsAsProperties?this[e]:this._optionValues[e]}setOptionValue(e,r){return this.setOptionValueWithSource(e,r,void 0)}setOptionValueWithSource(e,r,n){return this._storeOptionsAsProperties?this[e]=r:this._optionValues[e]=r,this._optionValueSources[e]=n,this}getOptionValueSource(e){return this._optionValueSources[e]}getOptionValueSourceWithGlobals(e){let r;return this._getCommandAndAncestors().forEach(n=>{n.getOptionValueSource(e)!==void 0&&(r=n.getOptionValueSource(e))}),r}_prepareUserArgs(e,r){if(e!==void 0&&!Array.isArray(e))throw new Error("first parameter to parse must be array or undefined");if(r=r||{},e===void 0&&r.from===void 0){Me.versions?.electron&&(r.from="electron");let o=Me.execArgv??[];(o.includes("-e")||o.includes("--eval")||o.includes("-p")||o.includes("--print"))&&(r.from="eval")}e===void 0&&(e=Me.argv),this.rawArgs=e.slice();let n;switch(r.from){case void 0:case"node":this._scriptPath=e[1],n=e.slice(2);break;case"electron":Me.defaultApp?(this._scriptPath=e[1],n=e.slice(2)):n=e.slice(1);break;case"user":n=e.slice(0);break;case"eval":n=e.slice(1);break;default:throw new Error(`unexpected parse option { from: '${r.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",n}parse(e,r){let n=this._prepareUserArgs(e,r);return this._parseCommand([],n),this}async parseAsync(e,r){let n=this._prepareUserArgs(e,r);return await this._parseCommand([],n),this}_executeSubCommand(e,r){r=r.slice();let n=!1,o=[".js",".ts",".tsx",".mjs",".cjs"];function i(d,p){let u=Pr.resolve(d,p);if(dd.existsSync(u))return u;if(o.includes(Pr.extname(p)))return;let f=o.find(m=>dd.existsSync(`${u}${m}`));if(f)return`${u}${f}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let s=e._executableFile||`${this._name}-${e._name}`,a=this._executableDir||"";if(this._scriptPath){let d;try{d=dd.realpathSync(this._scriptPath)}catch{d=this._scriptPath}a=Pr.resolve(Pr.dirname(d),a)}if(a){let d=i(a,s);if(!d&&!e._executableFile&&this._scriptPath){let p=Pr.basename(this._scriptPath,Pr.extname(this._scriptPath));p!==this._name&&(d=i(a,`${p}-${e._name}`))}s=d||s}n=o.includes(Pr.extname(s));let c;Me.platform!=="win32"?n?(r.unshift(s),r=Lg(Me.execArgv).concat(r),c=ud.spawn(Me.argv[0],r,{stdio:"inherit"})):c=ud.spawn(s,r,{stdio:"inherit"}):(r.unshift(s),r=Lg(Me.execArgv).concat(r),c=ud.spawn(Me.execPath,r,{stdio:"inherit"})),c.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(p=>{Me.on(p,()=>{c.killed===!1&&c.exitCode===null&&c.kill(p)})});let l=this._exitCallback;c.on("close",d=>{d=d??1,l?l(new pd(d,"commander.executeSubCommandAsync","(close)")):Me.exit(d)}),c.on("error",d=>{if(d.code==="ENOENT"){let p=a?`searched for local subcommand relative to directory '${a}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",u=`'${s}' does not exist
|
|
50
|
+
- if '${e._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
|
|
51
|
+
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
52
|
+
- ${p}`;throw new Error(u)}else if(d.code==="EACCES")throw new Error(`'${s}' not executable`);if(!l)Me.exit(1);else{let p=new pd(1,"commander.executeSubCommandAsync","(error)");p.nestedError=d,l(p)}}),this.runningCommand=c}_dispatchSubcommand(e,r,n){let o=this._findCommand(e);o||this.help({error:!0});let i;return i=this._chainOrCallSubCommandHook(i,o,"preSubcommand"),i=this._chainOrCall(i,()=>{if(o._executableHandler)this._executeSubCommand(o,r.concat(n));else return o._parseCommand(r,n)}),i}_dispatchHelpCommand(e){e||this.help();let r=this._findCommand(e);return r&&!r._executableHandler&&r.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,r)=>{e.required&&this.args[r]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(n,o,i)=>{let s=o;if(o!==null&&n.parseArg){let a=`error: command-argument value '${o}' is invalid for argument '${n.name()}'.`;s=this._callParseArg(n,o,i,a)}return s};this._checkNumberOfArguments();let r=[];this.registeredArguments.forEach((n,o)=>{let i=n.defaultValue;n.variadic?o<this.args.length?(i=this.args.slice(o),n.parseArg&&(i=i.reduce((s,a)=>e(n,a,s),n.defaultValue))):i===void 0&&(i=[]):o<this.args.length&&(i=this.args[o],n.parseArg&&(i=e(n,i,n.defaultValue))),r[o]=i}),this.processedArgs=r}_chainOrCall(e,r){return e&&e.then&&typeof e.then=="function"?e.then(()=>r()):r()}_chainOrCallHooks(e,r){let n=e,o=[];return this._getCommandAndAncestors().reverse().filter(i=>i._lifeCycleHooks[r]!==void 0).forEach(i=>{i._lifeCycleHooks[r].forEach(s=>{o.push({hookedCommand:i,callback:s})})}),r==="postAction"&&o.reverse(),o.forEach(i=>{n=this._chainOrCall(n,()=>i.callback(i.hookedCommand,this))}),n}_chainOrCallSubCommandHook(e,r,n){let o=e;return this._lifeCycleHooks[n]!==void 0&&this._lifeCycleHooks[n].forEach(i=>{o=this._chainOrCall(o,()=>i(this,r))}),o}_parseCommand(e,r){let n=this.parseOptions(r);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(n.operands),r=n.unknown,this.args=e.concat(r),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),r);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(r),this._dispatchSubcommand(this._defaultCommandName,e,r);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(n.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=()=>{n.unknown.length>0&&this.unknownOption(n.unknown[0])},i=`command:${this.name()}`;if(this._actionHandler){o(),this._processArguments();let s;return s=this._chainOrCallHooks(s,"preAction"),s=this._chainOrCall(s,()=>this._actionHandler(this.processedArgs)),this.parent&&(s=this._chainOrCall(s,()=>{this.parent.emit(i,e,r)})),s=this._chainOrCallHooks(s,"postAction"),s}if(this.parent&&this.parent.listenerCount(i))o(),this._processArguments(),this.parent.emit(i,e,r);else if(e.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",e,r);this.listenerCount("command:*")?this.emit("command:*",e,r):this.commands.length?this.unknownCommand():(o(),this._processArguments())}else this.commands.length?(o(),this.help({error:!0})):(o(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(r=>r._name===e||r._aliases.includes(e))}_findOption(e){return this.options.find(r=>r.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(r=>{r.mandatory&&e.getOptionValue(r.attributeName())===void 0&&e.missingMandatoryOptionValue(r)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(n=>{let o=n.attributeName();return this.getOptionValue(o)===void 0?!1:this.getOptionValueSource(o)!=="default"});e.filter(n=>n.conflictsWith.length>0).forEach(n=>{let o=e.find(i=>n.conflictsWith.includes(i.attributeName()));o&&this._conflictingOption(n,o)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let r=[],n=[],o=r,i=e.slice();function s(c){return c.length>1&&c[0]==="-"}let a=null;for(;i.length;){let c=i.shift();if(c==="--"){o===n&&o.push(c),o.push(...i);break}if(a&&!s(c)){this.emit(`option:${a.name()}`,c);continue}if(a=null,s(c)){let l=this._findOption(c);if(l){if(l.required){let d=i.shift();d===void 0&&this.optionMissingArgument(l),this.emit(`option:${l.name()}`,d)}else if(l.optional){let d=null;i.length>0&&!s(i[0])&&(d=i.shift()),this.emit(`option:${l.name()}`,d)}else this.emit(`option:${l.name()}`);a=l.variadic?l:null;continue}}if(c.length>2&&c[0]==="-"&&c[1]!=="-"){let l=this._findOption(`-${c[1]}`);if(l){l.required||l.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${l.name()}`,c.slice(2)):(this.emit(`option:${l.name()}`),i.unshift(`-${c.slice(2)}`));continue}}if(/^--[^=]+=/.test(c)){let l=c.indexOf("="),d=this._findOption(c.slice(0,l));if(d&&(d.required||d.optional)){this.emit(`option:${d.name()}`,c.slice(l+1));continue}}if(s(c)&&(o=n),(this._enablePositionalOptions||this._passThroughOptions)&&r.length===0&&n.length===0){if(this._findCommand(c)){r.push(c),i.length>0&&n.push(...i);break}else if(this._getHelpCommand()&&c===this._getHelpCommand().name()){r.push(c),i.length>0&&r.push(...i);break}else if(this._defaultCommandName){n.push(c),i.length>0&&n.push(...i);break}}if(this._passThroughOptions){o.push(c),i.length>0&&o.push(...i);break}o.push(c)}return{operands:r,unknown:n}}opts(){if(this._storeOptionsAsProperties){let e={},r=this.options.length;for(let n=0;n<r;n++){let o=this.options[n].attributeName();e[o]=o===this._versionOptionName?this._version:this[o]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,r)=>Object.assign(e,r.opts()),{})}error(e,r){this._outputConfiguration.outputError(`${e}
|
|
53
|
+
`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError=="string"?this._outputConfiguration.writeErr(`${this._showHelpAfterError}
|
|
54
|
+
`):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
|
|
55
|
+
`),this.outputHelp({error:!0}));let n=r||{},o=n.exitCode||1,i=n.code||"commander.error";this._exit(o,i,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in Me.env){let r=e.attributeName();(this.getOptionValue(r)===void 0||["default","config","env"].includes(this.getOptionValueSource(r)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,Me.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new WA(this.options),r=n=>this.getOptionValue(n)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(n));this.options.filter(n=>n.implied!==void 0&&r(n.attributeName())&&e.valueFromOption(this.getOptionValue(n.attributeName()),n)).forEach(n=>{Object.keys(n.implied).filter(o=>!r(o)).forEach(o=>{this.setOptionValueWithSource(o,n.implied[o],"implied")})})}missingArgument(e){let r=`error: missing required argument '${e}'`;this.error(r,{code:"commander.missingArgument"})}optionMissingArgument(e){let r=`error: option '${e.flags}' argument missing`;this.error(r,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let r=`error: required option '${e.flags}' not specified`;this.error(r,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,r){let n=s=>{let a=s.attributeName(),c=this.getOptionValue(a),l=this.options.find(p=>p.negate&&a===p.attributeName()),d=this.options.find(p=>!p.negate&&a===p.attributeName());return l&&(l.presetArg===void 0&&c===!1||l.presetArg!==void 0&&c===l.presetArg)?l:d||s},o=s=>{let a=n(s),c=a.attributeName();return this.getOptionValueSource(c)==="env"?`environment variable '${a.envVar}'`:`option '${a.flags}'`},i=`error: ${o(e)} cannot be used with ${o(r)}`;this.error(i,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let r="";if(e.startsWith("--")&&this._showSuggestionAfterError){let o=[],i=this;do{let s=i.createHelp().visibleOptions(i).filter(a=>a.long).map(a=>a.long);o=o.concat(s),i=i.parent}while(i&&!i._enablePositionalOptions);r=Ng(e,o)}let n=`error: unknown option '${e}'${r}`;this.error(n,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let r=this.registeredArguments.length,n=r===1?"":"s",i=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${r} argument${n} but got ${e.length}.`;this.error(i,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],r="";if(this._showSuggestionAfterError){let o=[];this.createHelp().visibleCommands(this).forEach(i=>{o.push(i.name()),i.alias()&&o.push(i.alias())}),r=Ng(e,o)}let n=`error: unknown command '${e}'${r}`;this.error(n,{code:"commander.unknownCommand"})}version(e,r,n){if(e===void 0)return this._version;this._version=e,r=r||"-V, --version",n=n||"output the version number";let o=this.createOption(r,n);return this._versionOptionName=o.attributeName(),this._registerOption(o),this.on("option:"+o.name(),()=>{this._outputConfiguration.writeOut(`${e}
|
|
56
|
+
`),this._exit(0,"commander.version",e)}),this}description(e,r){return e===void 0&&r===void 0?this._description:(this._description=e,r&&(this._argsDescription=r),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let r=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(r=this.commands[this.commands.length-1]),e===r._name)throw new Error("Command alias can't be the same as its name");let n=this.parent?._findCommand(e);if(n){let o=[n.name()].concat(n.aliases()).join("|");throw new Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${o}'`)}return r._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(r=>this.alias(r)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let r=this.registeredArguments.map(n=>jA(n));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?r:[]).join(" ")}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}nameFromFilename(e){return this._name=Pr.basename(e,Pr.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let r=this.createHelp();return r.helpWidth===void 0&&(r.helpWidth=e&&e.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth()),r.formatHelp(this,r)}_getHelpContext(e){e=e||{};let r={error:!!e.error},n;return r.error?n=o=>this._outputConfiguration.writeErr(o):n=o=>this._outputConfiguration.writeOut(o),r.write=e.write||n,r.command=this,r}outputHelp(e){let r;typeof e=="function"&&(r=e,e=void 0);let n=this._getHelpContext(e);this._getCommandAndAncestors().reverse().forEach(i=>i.emit("beforeAllHelp",n)),this.emit("beforeHelp",n);let o=this.helpInformation(n);if(r&&(o=r(o),typeof o!="string"&&!Buffer.isBuffer(o)))throw new Error("outputHelp callback must return a string or a Buffer");n.write(o),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",n),this._getCommandAndAncestors().forEach(i=>i.emit("afterAllHelp",n))}helpOption(e,r){return typeof e=="boolean"?(e?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(e=e??"-h, --help",r=r??"display help for command",this._helpOption=this.createOption(e,r),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this}help(e){this.outputHelp(e);let r=Me.exitCode||0;r===0&&e&&typeof e!="function"&&e.error&&(r=1),this._exit(r,"commander.help","(outputHelp)")}addHelpText(e,r){let n=["beforeAll","before","after","afterAll"];if(!n.includes(e))throw new Error(`Unexpected value for position to addHelpText.
|
|
57
|
+
Expecting one of '${n.join("', '")}'`);let o=`${e}Help`;return this.on(o,i=>{let s;typeof r=="function"?s=r({error:i.error,command:i.command}):s=r,s&&i.write(`${s}
|
|
58
|
+
`)}),this}_outputHelpIfRequested(e){let r=this._getHelpOption();r&&e.find(o=>r.is(o))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Lg(t){return t.map(e=>{if(!e.startsWith("--inspect"))return e;let r,n="127.0.0.1",o="9229",i;return(i=e.match(/^(--inspect(-brk)?)$/))!==null?r=i[1]:(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(r=i[1],/^\d+$/.test(i[3])?o=i[3]:n=i[3]):(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(r=i[1],n=i[3],o=i[4]),r&&o!=="0"?`${r}=${n}:${parseInt(o)+1}`:e})}Fg.Command=fd});var Hg=dt(Ft=>{var{Argument:Ug}=La(),{Command:hd}=jg(),{CommanderError:BA,InvalidArgumentError:Wg}=bi(),{Help:HA}=id(),{Option:Bg}=ld();Ft.program=new hd;Ft.createCommand=t=>new hd(t);Ft.createOption=(t,e)=>new Bg(t,e);Ft.createArgument=(t,e)=>new Ug(t,e);Ft.Command=hd;Ft.Option=Bg;Ft.Argument=Ug;Ft.Help=HA;Ft.CommanderError=BA;Ft.InvalidArgumentError=Wg;Ft.InvalidOptionArgumentError=Wg});var qg,xe,CN,_N,TN,RN,IN,$N,se,ON,MN,DN,De=D(()=>{qg=Pu(Hg(),1),{program:xe,createCommand:CN,createArgument:_N,createOption:TN,CommanderError:RN,InvalidArgumentError:IN,InvalidOptionArgumentError:$N,Command:se,Argument:ON,Option:MN,Help:DN}=qg.default});function so(t){let e=new Set;function r(n){if(n===null||typeof n=="string"||typeof n=="boolean"||typeof n=="number"&&Number.isFinite(n))return n;if(!n||typeof n!="object"||e.has(n))throw new Error("Invalid durable conversation metadata");if(!Array.isArray(n)&&Object.getPrototypeOf(n)!==Object.prototype&&Object.getPrototypeOf(n)!==null)throw new Error("Non-JSON conversation metadata");e.add(n);try{return Array.isArray(n)?Array.from({length:n.length},(o,i)=>{let s=Object.getOwnPropertyDescriptor(n,String(i));if(!s||!("value"in s))throw new Error("Invalid conversation array");return r(s.value)}):Object.fromEntries(Object.keys(n).sort().flatMap(o=>{let i=Object.getOwnPropertyDescriptor(n,o);if(!i||!("value"in i))throw new Error("Conversation accessors are not data");return i.value===void 0?[]:[[o,r(i.value)]]}))}finally{e.delete(n)}}return t.map(n=>{if(!n||typeof n!="object"||Array.isArray(n))throw new Error("Invalid conversation message");let o=Object.fromEntries(Object.keys(n).filter(s=>s!=="retry").map(s=>{let a=Object.getOwnPropertyDescriptor(n,s);if(!a||!("value"in a))throw new Error("Conversation accessors are not data");return[s,a.value]})),i=r(o);if(typeof i.role!="string"||typeof i.content!="string")throw new Error("Invalid conversation message");return i})}function kd(t,e){return JSON.stringify(so([t]))===JSON.stringify(so([e]))}var Jg=D(()=>{});import Cr from"fs";import{join as ao}from"path";function Ad(t,e,r="A",n="B"){let o=0;for(;o<t.length&&o<e.length&&kd(t[o],e[o]);)o++;let i=t.slice(o),s=e.slice(o);return i.length===0?e:s.length===0?t:[...t.slice(0,o),{role:"system",content:`\u2500\u2500 merged: ${r} (${i.length} msgs) \u2500\u2500`},...i,{role:"system",content:`\u2500\u2500 merged: ${n} (${s.length} msgs) \u2500\u2500`},...s]}var Ed,Yt,Yg,cr,Pd,Fa,vi,co,Ne,Sn=D(()=>{"use strict";Jg();ge();ze();Lt();Ed=new WeakMap,Yt=()=>{let{session:t,endpoint:e}=new K().resolveCredentials(),r=t?Buffer.from(JSON.stringify([e,t.user.id])).toString("base64url"):"signed-out";return ao(Ee(),"sessions",r)},Yg=t=>{if(!t||t==="."||t.includes("..")||/[\/\\\x00-\x1f]/.test(t))throw new Error("Invalid conversation name");return t},cr=t=>ao(Yt(),`${Yg(t)}.json`),Pd=t=>`${cr(t)}.archived`,Fa=t=>Cr.existsSync(Pd(t)),vi=t=>ao(Yt(),`${Yg(t)}.snapshots`),co=t=>t.replace(/\.json$/,".unsynced");Ne=class{constructor(e){this.uid=e}revisions=new Map;endpoint=Ye().endpoint;assertOwner(){if(!this.uid)throw new Error("Not authenticated \u2014 run protocol login first.");let e=new K().resolveCredentials();if(e.session?.user.id!==this.uid||e.endpoint!==this.endpoint)throw new Error("Code conversation account changed")}originFor(e,r){let n=new Set([r,...r].map(i=>Ed.get(i)).filter(Boolean));if(n.size>1)throw new Error("Mixed conversation generations");let o=n.values().next().value;if(o&&(o.uid!==this.uid||o.endpoint!==this.endpoint||o.name!==e))throw new Error("Code conversation history owner changed");return o}sessionPath(e){return`/api/user-data/cli_sessions/${encodeURIComponent(e)}`}snapshotPath(e,r){let n=`/api/cli-session-snapshots/${encodeURIComponent(e)}`;return r?`${n}/${encodeURIComponent(r)}`:n}async apiJson(e,r){this.assertOwner();let n=await Ye().request(e,r,{uid:this.uid,endpoint:this.endpoint});if(this.assertOwner(),n.status===404)return null;if(!n.ok)throw Object.assign(new Error(`cli-sessions API ${r?.method??"GET"} ${e} failed (${n.status})`),{status:n.status});let o=await n.json();return this.assertOwner(),o}async load(e){if(!this.uid)return{ok:!1,deleted:!1,messages:null};try{let r=(await this.apiJson(this.sessionPath(e)))?.item??null;if(this.revisions.set(e,Number(r?.archive_revision??0)),r?.archived_at)return this.markArchived(e,!0),{ok:!0,deleted:!1,archived:!0,messages:null};if(this.markArchived(e,!1),r?.deleted===!0)return{ok:!0,deleted:!0,messages:null};let n=r?.messages,o=Array.isArray(n)&&n.length>0?so(n):null;if(o){let i={uid:this.uid,endpoint:this.endpoint,name:e,revision:Number(r?.archive_revision??0)};Ed.set(o,i);for(let s of o)Ed.set(s,i)}return{ok:!0,deleted:!1,messages:o}}catch{return this.assertOwner(),Fa(e)?{ok:!0,deleted:!1,archived:!0,messages:null}:{ok:!1,deleted:!1,messages:null}}}async list(e="active"){this.assertOwner();let r=[],n="",o=new Set;for(;;){let i=await this.apiJson(`/api/user-data/cli_sessions?view=${e}&limit=200&after=${encodeURIComponent(n)}`);if(r.push(...i?.items??[]),!i?.nextCursor)break;if(o.has(i.nextCursor)||r.length>=5e4)throw new Error("Code history pagination incomplete");o.add(i.nextCursor),n=i.nextCursor}return r.filter(i=>i.deleted!==!0&&(e==="all"||e==="archived"==!!i.archived_at)).map(i=>({name:String(i.id),updated_at:i.updated_at,cwd:i.cwd,archived_at:i.archived_at,archive_revision:Number(i.archive_revision??0)})).sort((i,s)=>String(s.updated_at??"").localeCompare(String(i.updated_at??"")))}markArchived(e,r){this.assertOwner(),r?(Cr.mkdirSync(Yt(),{recursive:!0}),Cr.writeFileSync(Pd(e),"archived","utf-8")):Fa(e)&&Cr.rmSync(Pd(e))}async delete(e){this.assertOwner();let r=(await this.apiJson(this.sessionPath(e)))?.item;if(!r)throw new Error("Code conversation not found");if(!(await this.apiJson(this.sessionPath(e),{method:"PATCH",body:JSON.stringify({operation:"archive",expected_archive_revision:Number(r.archive_revision??0)})}))?.ok)throw new Error("Code conversation archive was not acknowledged");this.markArchived(e,!0)}async restore(e,r){if(!(await this.apiJson(this.sessionPath(e),{method:"PATCH",body:JSON.stringify({operation:"restore",expected_archive_revision:r})}))?.ok)throw new Error("Code conversation restore was not acknowledged");this.markArchived(e,!1)}async snapshot(e,r,n){if(this.assertOwner(),n.length===0)return null;this.originFor(e,n);let o=`${Date.now().toString(36)}${Math.random().toString(36).slice(2,6)}`,i={label:r,created_at:new Date().toISOString(),count:n.length,messages:so(n)};try{Cr.mkdirSync(vi(e),{recursive:!0}),Cr.writeFileSync(ao(vi(e),`${o}.json`),JSON.stringify(i,null,2),"utf-8")}catch{}if(this.uid)try{await this.apiJson(this.snapshotPath(e,o),{method:"PUT",body:JSON.stringify(i)})}catch{}return this.assertOwner(),o}async listSnapshots(e){this.assertOwner();let r=new Map;try{for(let n of Cr.readdirSync(vi(e))){if(!n.endsWith(".json"))continue;let o=JSON.parse(Cr.readFileSync(ao(vi(e),n),"utf-8"));r.set(n.replace(/\.json$/,""),{id:n.replace(/\.json$/,""),label:String(o.label??""),created_at:String(o.created_at??""),count:Number(o.count??0)})}}catch{}if(this.uid)try{let n=((await this.apiJson(this.snapshotPath(e)))?.items??[]).filter(o=>typeof o.id=="string").map(o=>({id:o.id,data:o}));for(let o of n)r.set(o.id,{id:o.id,label:String(o.data.label??""),created_at:String(o.data.created_at??""),count:Number(o.data.count??0)})}catch{}return this.assertOwner(),[...r.values()].sort((n,o)=>o.created_at.localeCompare(n.created_at))}async loadSnapshot(e,r){this.assertOwner();try{let n=JSON.parse(Cr.readFileSync(ao(vi(e),`${r}.json`),"utf-8"));if(Array.isArray(n.messages)&&n.messages.length>0)return n.messages}catch{}if(!this.uid)return null;try{let o=((await this.apiJson(this.snapshotPath(e,r)))?.item??null)?.messages;return Array.isArray(o)&&o.length>0?o:null}catch{return this.assertOwner(),null}}async save(e,r){if(!(!this.uid||r.length===0))try{let n=this.originFor(e,r),i={messages:so(r),expected_archive_revision:n?.revision??this.revisions.get(e)??0,cwd:process.cwd(),updated_at:new Date().toISOString()};if(!(await this.apiJson(this.sessionPath(e),{method:"PUT",body:JSON.stringify(i)}))?.ok)throw new Error("Code conversation save was not acknowledged")}catch(n){throw console.warn(`[cli-session] '${e}' \uD074\uB77C\uC6B0\uB4DC \uC800\uC7A5 \uC2E4\uD328 \u2014 \uB85C\uCEEC \uD3F4\uBC31\uC73C\uB85C \uACC4\uC18D\uD569\uB2C8\uB2E4: ${n.message}`),n}}async reconcile(e,r){let n=await this.load(e),o=Array.isArray(r)&&r.length>0?r:[];if(!n.ok)return{ok:!1,action:"offline",messages:o,localMessages:o};if(n.archived)return{ok:!0,action:"archived",messages:[],serverMessages:[],localMessages:o};if(n.deleted)return{ok:!0,action:"deleted",messages:[],serverMessages:[],localMessages:o};let i=n.messages??[];if(i.length===0&&o.length===0)return{ok:!0,action:"synced",messages:[],serverMessages:[],localMessages:[]};if(i.length===0&&o.length>0)return{ok:!0,action:"local_ahead",messages:o,serverMessages:[],localMessages:o};if(i.length>0&&o.length===0)return{ok:!0,action:"recovered",messages:i,recoveredCount:i.length,serverMessages:i,localMessages:[]};let s=0;for(;s<o.length&&s<i.length&&kd(o[s],i[s]);)s++;if(s===o.length&&s===i.length)return{ok:!0,action:"synced",messages:i,serverMessages:i,localMessages:o};if(s===o.length&&s<i.length){let c=i.length-o.length;return{ok:!0,action:"recovered",messages:i,recoveredCount:c,serverMessages:i,localMessages:o}}return s===i.length&&s<o.length?{ok:!0,action:"local_ahead",messages:o,serverMessages:i,localMessages:o}:{ok:!0,action:"merged",messages:Ad(i,o,"server","local"),serverMessages:i,localMessages:o}}}});var nw=dt((Td,Rd)=>{(function(t,e){typeof Td=="object"&&typeof Rd<"u"?Rd.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self,t.tinycolor=e())})(Td,function(){"use strict";function t(y){"@babel/helpers - typeof";return t=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(A){return typeof A}:function(A){return A&&typeof Symbol=="function"&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},t(y)}var e=/^\s+/,r=/\s+$/;function n(y,A){if(y=y||"",A=A||{},y instanceof n)return y;if(!(this instanceof n))return new n(y,A);var E=o(y);this._originalInput=y,this._r=E.r,this._g=E.g,this._b=E.b,this._a=E.a,this._roundA=Math.round(100*this._a)/100,this._format=A.format||E.format,this._gradientType=A.gradientType,this._r<1&&(this._r=Math.round(this._r)),this._g<1&&(this._g=Math.round(this._g)),this._b<1&&(this._b=Math.round(this._b)),this._ok=E.ok}n.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var A=this.toRgb();return(A.r*299+A.g*587+A.b*114)/1e3},getLuminance:function(){var A=this.toRgb(),E,M,H,U,me,ye;return E=A.r/255,M=A.g/255,H=A.b/255,E<=.03928?U=E/12.92:U=Math.pow((E+.055)/1.055,2.4),M<=.03928?me=M/12.92:me=Math.pow((M+.055)/1.055,2.4),H<=.03928?ye=H/12.92:ye=Math.pow((H+.055)/1.055,2.4),.2126*U+.7152*me+.0722*ye},setAlpha:function(A){return this._a=B(A),this._roundA=Math.round(100*this._a)/100,this},toHsv:function(){var A=c(this._r,this._g,this._b);return{h:A.h*360,s:A.s,v:A.v,a:this._a}},toHsvString:function(){var A=c(this._r,this._g,this._b),E=Math.round(A.h*360),M=Math.round(A.s*100),H=Math.round(A.v*100);return this._a==1?"hsv("+E+", "+M+"%, "+H+"%)":"hsva("+E+", "+M+"%, "+H+"%, "+this._roundA+")"},toHsl:function(){var A=s(this._r,this._g,this._b);return{h:A.h*360,s:A.s,l:A.l,a:this._a}},toHslString:function(){var A=s(this._r,this._g,this._b),E=Math.round(A.h*360),M=Math.round(A.s*100),H=Math.round(A.l*100);return this._a==1?"hsl("+E+", "+M+"%, "+H+"%)":"hsla("+E+", "+M+"%, "+H+"%, "+this._roundA+")"},toHex:function(A){return d(this._r,this._g,this._b,A)},toHexString:function(A){return"#"+this.toHex(A)},toHex8:function(A){return p(this._r,this._g,this._b,this._a,A)},toHex8String:function(A){return"#"+this.toHex8(A)},toRgb:function(){return{r:Math.round(this._r),g:Math.round(this._g),b:Math.round(this._b),a:this._a}},toRgbString:function(){return this._a==1?"rgb("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+")":"rgba("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:Math.round(q(this._r,255)*100)+"%",g:Math.round(q(this._g,255)*100)+"%",b:Math.round(q(this._b,255)*100)+"%",a:this._a}},toPercentageRgbString:function(){return this._a==1?"rgb("+Math.round(q(this._r,255)*100)+"%, "+Math.round(q(this._g,255)*100)+"%, "+Math.round(q(this._b,255)*100)+"%)":"rgba("+Math.round(q(this._r,255)*100)+"%, "+Math.round(q(this._g,255)*100)+"%, "+Math.round(q(this._b,255)*100)+"%, "+this._roundA+")"},toName:function(){return this._a===0?"transparent":this._a<1?!1:Y[d(this._r,this._g,this._b,!0)]||!1},toFilter:function(A){var E="#"+u(this._r,this._g,this._b,this._a),M=E,H=this._gradientType?"GradientType = 1, ":"";if(A){var U=n(A);M="#"+u(U._r,U._g,U._b,U._a)}return"progid:DXImageTransform.Microsoft.gradient("+H+"startColorstr="+E+",endColorstr="+M+")"},toString:function(A){var E=!!A;A=A||this._format;var M=!1,H=this._a<1&&this._a>=0,U=!E&&H&&(A==="hex"||A==="hex6"||A==="hex3"||A==="hex4"||A==="hex8"||A==="name");return U?A==="name"&&this._a===0?this.toName():this.toRgbString():(A==="rgb"&&(M=this.toRgbString()),A==="prgb"&&(M=this.toPercentageRgbString()),(A==="hex"||A==="hex6")&&(M=this.toHexString()),A==="hex3"&&(M=this.toHexString(!0)),A==="hex4"&&(M=this.toHex8String(!0)),A==="hex8"&&(M=this.toHex8String()),A==="name"&&(M=this.toName()),A==="hsl"&&(M=this.toHslString()),A==="hsv"&&(M=this.toHsvString()),M||this.toHexString())},clone:function(){return n(this.toString())},_applyModification:function(A,E){var M=A.apply(null,[this].concat([].slice.call(E)));return this._r=M._r,this._g=M._g,this._b=M._b,this.setAlpha(M._a),this},lighten:function(){return this._applyModification(w,arguments)},brighten:function(){return this._applyModification(b,arguments)},darken:function(){return this._applyModification(k,arguments)},desaturate:function(){return this._applyModification(f,arguments)},saturate:function(){return this._applyModification(m,arguments)},greyscale:function(){return this._applyModification(h,arguments)},spin:function(){return this._applyModification(v,arguments)},_applyCombination:function(A,E){return A.apply(null,[this].concat([].slice.call(E)))},analogous:function(){return this._applyCombination(G,arguments)},complement:function(){return this._applyCombination(C,arguments)},monochromatic:function(){return this._applyCombination($,arguments)},splitcomplement:function(){return this._applyCombination(N,arguments)},triad:function(){return this._applyCombination(I,[3])},tetrad:function(){return this._applyCombination(I,[4])}},n.fromRatio=function(y,A){if(t(y)=="object"){var E={};for(var M in y)y.hasOwnProperty(M)&&(M==="a"?E[M]=y[M]:E[M]=Q(y[M]));y=E}return n(y,A)};function o(y){var A={r:0,g:0,b:0},E=1,M=null,H=null,U=null,me=!1,ye=!1;return typeof y=="string"&&(y=yt(y)),t(y)=="object"&&(Ie(y.r)&&Ie(y.g)&&Ie(y.b)?(A=i(y.r,y.g,y.b),me=!0,ye=String(y.r).substr(-1)==="%"?"prgb":"rgb"):Ie(y.h)&&Ie(y.s)&&Ie(y.v)?(M=Q(y.s),H=Q(y.v),A=l(y.h,M,H),me=!0,ye="hsv"):Ie(y.h)&&Ie(y.s)&&Ie(y.l)&&(M=Q(y.s),U=Q(y.l),A=a(y.h,M,U),me=!0,ye="hsl"),y.hasOwnProperty("a")&&(E=y.a)),E=B(E),{ok:me,format:y.format||ye,r:Math.min(255,Math.max(A.r,0)),g:Math.min(255,Math.max(A.g,0)),b:Math.min(255,Math.max(A.b,0)),a:E}}function i(y,A,E){return{r:q(y,255)*255,g:q(A,255)*255,b:q(E,255)*255}}function s(y,A,E){y=q(y,255),A=q(A,255),E=q(E,255);var M=Math.max(y,A,E),H=Math.min(y,A,E),U,me,ye=(M+H)/2;if(M==H)U=me=0;else{var $e=M-H;switch(me=ye>.5?$e/(2-M-H):$e/(M+H),M){case y:U=(A-E)/$e+(A<E?6:0);break;case A:U=(E-y)/$e+2;break;case E:U=(y-A)/$e+4;break}U/=6}return{h:U,s:me,l:ye}}function a(y,A,E){var M,H,U;y=q(y,360),A=q(A,100),E=q(E,100);function me(bt,qe,ue){return ue<0&&(ue+=1),ue>1&&(ue-=1),ue<1/6?bt+(qe-bt)*6*ue:ue<1/2?qe:ue<2/3?bt+(qe-bt)*(2/3-ue)*6:bt}if(A===0)M=H=U=E;else{var ye=E<.5?E*(1+A):E+A-E*A,$e=2*E-ye;M=me($e,ye,y+1/3),H=me($e,ye,y),U=me($e,ye,y-1/3)}return{r:M*255,g:H*255,b:U*255}}function c(y,A,E){y=q(y,255),A=q(A,255),E=q(E,255);var M=Math.max(y,A,E),H=Math.min(y,A,E),U,me,ye=M,$e=M-H;if(me=M===0?0:$e/M,M==H)U=0;else{switch(M){case y:U=(A-E)/$e+(A<E?6:0);break;case A:U=(E-y)/$e+2;break;case E:U=(y-A)/$e+4;break}U/=6}return{h:U,s:me,v:ye}}function l(y,A,E){y=q(y,360)*6,A=q(A,100),E=q(E,100);var M=Math.floor(y),H=y-M,U=E*(1-A),me=E*(1-H*A),ye=E*(1-(1-H)*A),$e=M%6,bt=[E,me,U,U,ye,E][$e],qe=[ye,E,E,me,U,U][$e],ue=[U,U,ye,E,E,me][$e];return{r:bt*255,g:qe*255,b:ue*255}}function d(y,A,E,M){var H=[ee(Math.round(y).toString(16)),ee(Math.round(A).toString(16)),ee(Math.round(E).toString(16))];return M&&H[0].charAt(0)==H[0].charAt(1)&&H[1].charAt(0)==H[1].charAt(1)&&H[2].charAt(0)==H[2].charAt(1)?H[0].charAt(0)+H[1].charAt(0)+H[2].charAt(0):H.join("")}function p(y,A,E,M,H){var U=[ee(Math.round(y).toString(16)),ee(Math.round(A).toString(16)),ee(Math.round(E).toString(16)),ee(Re(M))];return H&&U[0].charAt(0)==U[0].charAt(1)&&U[1].charAt(0)==U[1].charAt(1)&&U[2].charAt(0)==U[2].charAt(1)&&U[3].charAt(0)==U[3].charAt(1)?U[0].charAt(0)+U[1].charAt(0)+U[2].charAt(0)+U[3].charAt(0):U.join("")}function u(y,A,E,M){var H=[ee(Re(M)),ee(Math.round(y).toString(16)),ee(Math.round(A).toString(16)),ee(Math.round(E).toString(16))];return H.join("")}n.equals=function(y,A){return!y||!A?!1:n(y).toRgbString()==n(A).toRgbString()},n.random=function(){return n.fromRatio({r:Math.random(),g:Math.random(),b:Math.random()})};function f(y,A){A=A===0?0:A||10;var E=n(y).toHsl();return E.s-=A/100,E.s=re(E.s),n(E)}function m(y,A){A=A===0?0:A||10;var E=n(y).toHsl();return E.s+=A/100,E.s=re(E.s),n(E)}function h(y){return n(y).desaturate(100)}function w(y,A){A=A===0?0:A||10;var E=n(y).toHsl();return E.l+=A/100,E.l=re(E.l),n(E)}function b(y,A){A=A===0?0:A||10;var E=n(y).toRgb();return E.r=Math.max(0,Math.min(255,E.r-Math.round(255*-(A/100)))),E.g=Math.max(0,Math.min(255,E.g-Math.round(255*-(A/100)))),E.b=Math.max(0,Math.min(255,E.b-Math.round(255*-(A/100)))),n(E)}function k(y,A){A=A===0?0:A||10;var E=n(y).toHsl();return E.l-=A/100,E.l=re(E.l),n(E)}function v(y,A){var E=n(y).toHsl(),M=(E.h+A)%360;return E.h=M<0?360+M:M,n(E)}function C(y){var A=n(y).toHsl();return A.h=(A.h+180)%360,n(A)}function I(y,A){if(isNaN(A)||A<=0)throw new Error("Argument to polyad must be a positive number");for(var E=n(y).toHsl(),M=[n(y)],H=360/A,U=1;U<A;U++)M.push(n({h:(E.h+U*H)%360,s:E.s,l:E.l}));return M}function N(y){var A=n(y).toHsl(),E=A.h;return[n(y),n({h:(E+72)%360,s:A.s,l:A.l}),n({h:(E+216)%360,s:A.s,l:A.l})]}function G(y,A,E){A=A||6,E=E||30;var M=n(y).toHsl(),H=360/E,U=[n(y)];for(M.h=(M.h-(H*A>>1)+720)%360;--A;)M.h=(M.h+H)%360,U.push(n(M));return U}function $(y,A){A=A||6;for(var E=n(y).toHsv(),M=E.h,H=E.s,U=E.v,me=[],ye=1/A;A--;)me.push(n({h:M,s:H,v:U})),U=(U+ye)%1;return me}n.mix=function(y,A,E){E=E===0?0:E||50;var M=n(y).toRgb(),H=n(A).toRgb(),U=E/100,me={r:(H.r-M.r)*U+M.r,g:(H.g-M.g)*U+M.g,b:(H.b-M.b)*U+M.b,a:(H.a-M.a)*U+M.a};return n(me)},n.readability=function(y,A){var E=n(y),M=n(A);return(Math.max(E.getLuminance(),M.getLuminance())+.05)/(Math.min(E.getLuminance(),M.getLuminance())+.05)},n.isReadable=function(y,A,E){var M=n.readability(y,A),H,U;switch(U=!1,H=Vn(E),H.level+H.size){case"AAsmall":case"AAAlarge":U=M>=4.5;break;case"AAlarge":U=M>=3;break;case"AAAsmall":U=M>=7;break}return U},n.mostReadable=function(y,A,E){var M=null,H=0,U,me,ye,$e;E=E||{},me=E.includeFallbackColors,ye=E.level,$e=E.size;for(var bt=0;bt<A.length;bt++)U=n.readability(y,A[bt]),U>H&&(H=U,M=n(A[bt]));return n.isReadable(y,M,{level:ye,size:$e})||!me?M:(E.includeFallbackColors=!1,n.mostReadable(y,["#fff","#000"],E))};var j=n.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Y=n.hexNames=we(j);function we(y){var A={};for(var E in y)y.hasOwnProperty(E)&&(A[y[E]]=E);return A}function B(y){return y=parseFloat(y),(isNaN(y)||y<0||y>1)&&(y=1),y}function q(y,A){L(y)&&(y="100%");var E=Se(y);return y=Math.min(A,Math.max(0,parseFloat(y))),E&&(y=parseInt(y*A,10)/100),Math.abs(y-A)<1e-6?1:y%A/parseFloat(A)}function re(y){return Math.min(1,Math.max(0,y))}function oe(y){return parseInt(y,16)}function L(y){return typeof y=="string"&&y.indexOf(".")!=-1&&parseFloat(y)===1}function Se(y){return typeof y=="string"&&y.indexOf("%")!=-1}function ee(y){return y.length==1?"0"+y:""+y}function Q(y){return y<=1&&(y=y*100+"%"),y}function Re(y){return Math.round(parseFloat(y)*255).toString(16)}function fe(y){return oe(y)/255}var Ce=function(){var y="[-\\+]?\\d+%?",A="[-\\+]?\\d*\\.\\d+%?",E="(?:"+A+")|(?:"+y+")",M="[\\s|\\(]+("+E+")[,|\\s]+("+E+")[,|\\s]+("+E+")\\s*\\)?",H="[\\s|\\(]+("+E+")[,|\\s]+("+E+")[,|\\s]+("+E+")[,|\\s]+("+E+")\\s*\\)?";return{CSS_UNIT:new RegExp(E),rgb:new RegExp("rgb"+M),rgba:new RegExp("rgba"+H),hsl:new RegExp("hsl"+M),hsla:new RegExp("hsla"+H),hsv:new RegExp("hsv"+M),hsva:new RegExp("hsva"+H),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();function Ie(y){return!!Ce.CSS_UNIT.exec(y)}function yt(y){y=y.replace(e,"").replace(r,"").toLowerCase();var A=!1;if(j[y])y=j[y],A=!0;else if(y=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var E;return(E=Ce.rgb.exec(y))?{r:E[1],g:E[2],b:E[3]}:(E=Ce.rgba.exec(y))?{r:E[1],g:E[2],b:E[3],a:E[4]}:(E=Ce.hsl.exec(y))?{h:E[1],s:E[2],l:E[3]}:(E=Ce.hsla.exec(y))?{h:E[1],s:E[2],l:E[3],a:E[4]}:(E=Ce.hsv.exec(y))?{h:E[1],s:E[2],v:E[3]}:(E=Ce.hsva.exec(y))?{h:E[1],s:E[2],v:E[3],a:E[4]}:(E=Ce.hex8.exec(y))?{r:oe(E[1]),g:oe(E[2]),b:oe(E[3]),a:fe(E[4]),format:A?"name":"hex8"}:(E=Ce.hex6.exec(y))?{r:oe(E[1]),g:oe(E[2]),b:oe(E[3]),format:A?"name":"hex"}:(E=Ce.hex4.exec(y))?{r:oe(E[1]+""+E[1]),g:oe(E[2]+""+E[2]),b:oe(E[3]+""+E[3]),a:fe(E[4]+""+E[4]),format:A?"name":"hex8"}:(E=Ce.hex3.exec(y))?{r:oe(E[1]+""+E[1]),g:oe(E[2]+""+E[2]),b:oe(E[3]+""+E[3]),format:A?"name":"hex"}:!1}function Vn(y){var A,E;return y=y||{level:"AA",size:"small"},A=(y.level||"AA").toUpperCase(),E=(y.size||"small").toLowerCase(),A!=="AA"&&A!=="AAA"&&(A="AA"),E!=="small"&&E!=="large"&&(E="small"),{level:A,size:E}}return n})});var uw=dt((vL,lw)=>{var xi=nw(),aw={r:256,g:256,b:256,a:1},cw={h:360,s:1,v:1,a:1};function Od(t,e,r){let n={};for(let o in t)t.hasOwnProperty(o)&&(n[o]=r===0?0:(e[o]-t[o])/r);return n}function Md(t,e,r,n){let o={};for(let i in e)e.hasOwnProperty(i)&&(o[i]=t[i]*r+e[i],o[i]=o[i]<0?o[i]+n[i]:n[i]!==1?o[i]%n[i]:o[i]);return o}function Id(t,e,r){let n=t.color.toRgb(),o=e.color.toRgb(),i=Od(n,o,r),s=[t.color];for(let a=1;a<r;a++){let c=Md(i,n,a,aw);s.push(xi(c))}return s}function ow(t,e,r,n){let o=t.color.toHsv(),i=e.color.toHsv();if(o.s===0||i.s===0)return Id(t,e,r);let s;if(typeof n=="boolean")s=n;else{let d=o.h<i.h&&i.h-o.h<180||o.h>i.h&&o.h-i.h>180;s=n==="long"&&d||n==="short"&&!d}let a=Od(o,i,r),c=[t.color],l;o.h<=i.h&&!s||o.h>=i.h&&s?l=i.h-o.h:s?l=360-i.h+o.h:l=360-o.h+i.h,a.h=Math.pow(-1,s?1:0)*Math.abs(l)/r;for(let d=1;d<r;d++){let p=Md(a,o,d,cw);c.push(xi(p))}return c}function iw(t,e){let r=t.length;if(e=parseInt(e,10),isNaN(e)||e<2)throw new Error("Invalid number of steps (< 2)");if(e<r)throw new Error("Number of steps cannot be inferior to number of stops");let n=[];for(let i=1;i<r;i++){let s=(e-1)*(t[i].pos-t[i-1].pos);n.push(Math.max(1,Math.round(s)))}let o=1;for(let i=r-1;i--;)o+=n[i];for(;o!==e;)if(o<e){let i=Math.min.apply(null,n);n[n.indexOf(i)]++,o++}else{let i=Math.max.apply(null,n);n[n.indexOf(i)]--,o--}return n}function sw(t,e,r,n){if(e<0||e>1)throw new Error("Position must be between 0 and 1");let o,i;for(let c=0,l=t.length;c<l-1;c++)if(e>=t[c].pos&&e<t[c+1].pos){o=t[c],i=t[c+1];break}o||(o=i=t[t.length-1]);let s=Od(o.color[r](),i.color[r](),(i.pos-o.pos)*100),a=Md(s,o.color[r](),(e-o.pos)*100,n);return xi(a)}var $d=class t{constructor(e){if(e.length<2)throw new Error("Invalid number of stops (< 2)");let r=e[0].pos!==void 0,n=e.length,o=-1,i=!1;this.stops=e.map((s,a)=>{let c=s.pos!==void 0;if(r^c)throw new Error("Cannot mix positionned and not posionned color stops");if(c){let l=s.color!==void 0;if(!l&&(i||a===0||a===n-1))throw new Error("Cannot define two consecutive position-only stops");if(i=!l,s={color:l?xi(s.color):null,colorLess:!l,pos:s.pos},s.pos<0||s.pos>1)throw new Error("Color stops positions must be between 0 and 1");if(s.pos<o)throw new Error("Color stops positions are not ordered");o=s.pos}else s={color:xi(s.color!==void 0?s.color:s),pos:a/(n-1)};return s}),this.stops[0].pos!==0&&(this.stops.unshift({color:this.stops[0].color,pos:0}),n++),this.stops[n-1].pos!==1&&this.stops.push({color:this.stops[n-1].color,pos:1})}reverse(){let e=[];return this.stops.forEach(function(r){e.push({color:r.color,pos:1-r.pos})}),new t(e.reverse())}loop(){let e=[],r=[];return this.stops.forEach(n=>{e.push({color:n.color,pos:n.pos/2})}),this.stops.slice(0,-1).forEach(n=>{r.push({color:n.color,pos:1-n.pos/2})}),new t(e.concat(r.reverse()))}rgb(e){let r=iw(this.stops,e),n=[];this.stops.forEach((o,i)=>{o.colorLess&&(o.color=Id(this.stops[i-1],this.stops[i+1],2)[1])});for(let o=0,i=this.stops.length;o<i-1;o++){let s=Id(this.stops[o],this.stops[o+1],r[o]);n.splice(n.length,0,...s)}return n.push(this.stops[this.stops.length-1].color),n}hsv(e,r){let n=iw(this.stops,e),o=[];this.stops.forEach((i,s)=>{i.colorLess&&(i.color=ow(this.stops[s-1],this.stops[s+1],2,r)[1])});for(let i=0,s=this.stops.length;i<s-1;i++){let a=ow(this.stops[i],this.stops[i+1],n[i],r);o.splice(o.length,0,...a)}return o.push(this.stops[this.stops.length-1].color),o}css(e,r){e=e||"linear",r=r||(e==="linear"?"to right":"ellipse at center");let n=e+"-gradient("+r;return this.stops.forEach(function(o){n+=", "+(o.colorLess?"":o.color.toRgbString()+" ")+o.pos*100+"%"}),n+=")",n}rgbAt(e){return sw(this.stops,e,"toRgb",aw)}hsvAt(e){return sw(this.stops,e,"toHsv",cw)}};lw.exports=function(t){if(arguments.length===1){if(!Array.isArray(arguments[0]))throw new Error('"stops" is not an array');t=arguments[0]}else t=Array.prototype.slice.call(arguments);return new $d(t)}});import lo from"chalk";var hw,AC,Ld,ht,uo=D(()=>{"use strict";hw={debug:0,info:1,warn:2,error:3,silent:4},AC={debug:lo.gray,info:lo.blue,warn:lo.yellow,error:lo.red,silent:t=>t},Ld=class t{level;context;transport;constructor(e={}){this.level=e.silent?"silent":e.level??"info",this.context=e.prefix,this.transport=e.transport}child(e){let r=new t({level:this.level,transport:this.transport});return r.context=this.context?`${this.context}:${e}`:e,r}setLevel(e){this.level=e}getLevel(){return this.level}debug(e,r){this.emit("debug",e,r)}info(e,r){this.emit("info",e,r)}warn(e,r){this.emit("warn",e,r)}error(e,r){this.emit("error",e,r)}shouldLog(e){return hw[e]>=hw[this.level]}emit(e,r,n){if(!this.shouldLog(e))return;let o={level:e,message:r,timestamp:Date.now(),context:this.context,data:n};this.transport?this.transport(o):process.stderr.write(this.format(o)+`
|
|
59
|
+
`)}format(e){let r=AC[e.level],n=r(`[${e.level.toUpperCase()}]`),o=e.context?lo.cyan(`[${e.context}]`):"",i=e.message,s=e.data?" "+lo.gray(JSON.stringify(e.data)):"";return`${n}${o} ${i}${s}`}},ht=new Ld({level:process.env.LOG_LEVEL??"info"})});var mt,Vr=D(()=>{"use strict";mt=class{config;ctx;logger;constructor(e,r){this.config=e,this.ctx=r,this.logger=r.logger.child(e.type)}}});var ki,mw=D(()=>{"use strict";Vr();ge();ki=class t extends mt{constructor(e,r){super(e,r)}async execute(e){let{provider:r,model:n,systemPrompt:o,temperature:i,maxTokens:s,stream:a,resetMessages:c,parseContext:l}=this.config.config,d=t.resolveModel(n),p=c?this.buildSummaryMessages(e,o):this.buildMessages(e,o),u=this.ctx.registry.getAllToolDefinitions().map(f=>({name:f.name,description:f.description,parameters:f.parameters}));if(this.logger.debug(`Calling ${r}/${d??"default"} with ${u.length} tools`),!this.ctx.modelRouter)throw new Error("ModelRouter not configured");{let f=this.ctx.modelRouter.getProvider(r);if(!f)throw new Error(`Provider not available: ${r}`);let m={model:d,systemPrompt:o,temperature:i,maxTokens:s,tools:u.length>0?u:void 0},h="";if(a!==!1){let w="",b=new Map,k={input:0,output:0};for await(let C of f.generateStream(p,m))if(C.type==="content"&&C.content)w+=C.content,this.ctx.onChunk?.(C.content);else if(C.type==="tool_call"&&C.toolCall){let I=C.toolCall;if(I.id?.startsWith("partial:")){let N=parseInt(I.id.slice(8),10),G=b.get(N);G&&typeof I.arguments=="string"&&(G.argStr+=I.arguments)}else if(I.id&&I.name){let N=b.size,G=typeof I.arguments=="string"?I.arguments:I.arguments?JSON.stringify(I.arguments):"";b.set(N,{id:I.id,name:I.name,argStr:G})}}else C.type==="usage"&&C.usage&&(k.input+=C.usage.inputTokens,k.output+=C.usage.outputTokens);let v=[];for(let[,C]of b)if(C.name){let I={};try{I=C.argStr?JSON.parse(C.argStr):{}}catch{}v.push({id:C.id,name:C.name,arguments:I})}h=w,this.appendResult(e,w,v.length>0?v:void 0),this.accumulateTokens(e,k),this.setRoutingFlags(e,v.length>0?v:void 0)}else{let w=await f.generate(p,m);h=w.content,this.appendResult(e,w.content,w.toolCalls),w.usage&&this.accumulateTokens(e,{input:w.usage.inputTokens,output:w.usage.outputTokens}),this.setRoutingFlags(e,w.toolCalls)}if(c){let w=e.messages.find(b=>b.role==="user")?.content??"";e.messages=[{role:"user",content:w},{role:"assistant",content:h}]}if(l){let w=h.match(/\[intent:(simple|complex)\]/);if(w){let b=w[1];e.context.is_simple=b==="simple",e.context.is_complex=b==="complex";let k=e.messages[e.messages.length-1];k?.role==="assistant"&&(k.content=k.content.replace(/\[intent:(simple|complex)\]\s*/,"").trimStart())}}}}static resolveModel(e){if(e)switch(e){case"@orchestrator":return be.models.orchSentinel;case"@heavy":return"heavy";case"@coder":case"@default":return"default";case"@light":return"light";default:return e}}buildMessages(e,r){let n=[];r&&n.push({role:"system",content:r});for(let o of e.messages)n.push({role:o.role,content:o.content,name:o.name,toolCalls:o.toolCalls,toolResults:o.toolResults});return n}buildSummaryMessages(e,r){let n=e.messages.find(s=>s.role==="user")?.content??"",o=[];for(let s of e.messages)if(!(s.role==="user"&&s.content===n))if(s.toolCalls?.length)o.push(`[Tool calls: ${s.toolCalls.map(a=>`${a.name}(${JSON.stringify(a.arguments).slice(0,60)})`).join(", ")}]`);else if(s.toolResults?.length)for(let a of s.toolResults)o.push(`[Tool result: ${a.content.slice(0,400)}${a.content.length>400?"\u2026":""}]`);else s.content&&o.push(`${s.role}: ${s.content.slice(0,500)}`);let i=[];return r&&i.push({role:"system",content:r}),i.push({role:"user",content:`Original request:
|
|
60
|
+
${n}
|
|
61
|
+
|
|
62
|
+
What happened during implementation:
|
|
63
|
+
${o.join(`
|
|
64
|
+
`)}`}),i}appendResult(e,r,n){let o={role:"assistant",content:r};n&&n.length>0&&(o.toolCalls=n),e.messages.push(o)}setRoutingFlags(e,r){r&&r.length>0?(e.context.needs_tool=!0,e.context.done=!1,e.context.needs_clarification=!1):(e.context.needs_tool=!1,e.context.done=!0,e.context.needs_clarification=!1)}accumulateTokens(e,r){let n=e.context._tokensUsed??{input:0,output:0};e.context._tokensUsed={input:n.input+r.input,output:n.output+r.output}}}});var Ei,gw=D(()=>{"use strict";Vr();Ei=class extends mt{constructor(e,r){super(e,r)}async execute(e){let{tools:r,parallel:n,timeout:o,injectAsUser:i}=this.config.config,s=this.getToolCalls(e,r);if(s.length===0){this.logger.debug("No tool calls to execute");return}this.logger.debug(`Executing ${s.length} tool(s)${n?" in parallel":" sequentially"}`);let a;if(n)a=await Promise.all(s.map(c=>this.executeToolCall(c,e,o)));else{a=[];for(let c of s)a.push(await this.executeToolCall(c,e,o))}if(i){let c=a.map(l=>l.content).join(`
|
|
65
|
+
|
|
66
|
+
`);e.messages.push({role:"user",content:`[Code changes \u2014 git diff]
|
|
67
|
+
|
|
68
|
+
${c}`})}else e.messages.push(this.buildToolMessage(a))}getToolCalls(e,r){let n=[...e.messages].reverse().find(o=>o.role==="assistant");return n?.toolCalls&&n.toolCalls.length>0?n.toolCalls:r.map((o,i)=>({id:`config-tool-${i}`,name:o,arguments:e.context[o]??{}}))}async executeToolCall(e,r,n){this.ctx.onToolUse?.(e.name,e.arguments);let o=()=>this.ctx.registry.executeTool(e.name,e.arguments,r);try{let i=n?await this.withTimeout(o(),n):await o();return{toolCallId:e.id,content:i.content,isError:i.isError}}catch(i){return this.logger.error(`Tool '${e.name}' failed: ${i.message}`),{toolCallId:e.id,content:"",isError:!0}}}buildToolMessage(e){return{role:"tool",content:"",toolResults:e}}withTimeout(e,r){return Promise.race([e,new Promise((n,o)=>setTimeout(()=>o(new Error(`Tool execution timed out after ${r}ms`)),r))])}}});import{createInterface as CC}from"readline";var Pi,ww=D(()=>{"use strict";Vr();Pi=class extends mt{constructor(e,r){super(e,r)}async execute(e){let{prompt:r,required:n,timeout:o}=this.config.config,i=r??"Input: ";if(!process.stdin.isTTY){this.logger.warn("Non-TTY environment \u2014 skipping human input"),e.context.humanInputReceived=!1;return}let s=await this.promptUser(i,o);!s.trim()&&n&&(this.logger.warn("Empty input received for required prompt, re-prompting"),s=await this.promptUser(i,o)),e.messages.push({role:"user",content:s}),e.context.humanInputReceived=!0,this.logger.debug("Human input received")}promptUser(e,r){let n=CC({input:process.stdin,output:process.stdout}),o=new Promise(i=>{n.question(e,s=>{n.close(),i(s)})});return r?this.withTimeout(o,r,n):o}withTimeout(e,r,n){return Promise.race([e,new Promise((o,i)=>setTimeout(()=>{n?.close(),i(new Error(`Human input timed out after ${r}ms`))},r))])}}});var Ai,yw=D(()=>{"use strict";Vr();Ai=class extends mt{constructor(e,r){super(e,r)}async execute(e){let{conditions:r,default:n}=this.config.config;for(let o of r)if(this.evaluateCondition(o,e)){this.logger.debug(`Routing to '${o.target}'`),e.context.routerTarget=o.target;return}e.context.routerTarget=n??null,this.logger.debug(n?`No condition matched \u2014 routing to default '${n}'`:"No condition matched and no default route")}evaluateCondition(e,r){if(e.key){let n=r.context[e.key];return n===!0||n==="true"}return e.expression?this.evaluateExpression(e.expression,r):!1}evaluateExpression(e,r){try{let n=e.match(/\$\{state\.([^}]+)\}/);if(!n)return!1;let o=n[1].split("."),i=r;for(let s of o)i=i?.[s];return i===!0||i==="true"}catch{return!1}}}});var Ci,bw=D(()=>{"use strict";Vr();Ci=class extends mt{executeNodeFn;constructor(e,r){super(e,r)}setExecuteNodeFn(e){this.executeNodeFn=e}async execute(e){let{branches:r,mergeStrategy:n="wait_all"}=this.config.config;this.logger.debug(`Running ${r.length} parallel branches (strategy: ${n})`);let o=r.map(s=>this.runBranch(s,e)),i;n==="first_completed"?i=[await Promise.race(o)]:i=await Promise.all(o),this.mergeBranchResults(e,i),this.logger.debug(`Parallel branches completed: ${i.length} result(s)`)}async runBranch(e,r){let n=this.cloneState(r),o=Date.now();try{return this.executeNodeFn?await this.executeNodeFn(e,n):this.logger.warn(`No executeNodeFn set \u2014 branch '${e}' skipped`),{branchId:e,context:n.context,messages:n.messages,duration:Date.now()-o}}catch(i){return{branchId:e,context:n.context,messages:n.messages,duration:Date.now()-o,error:i.message}}}cloneState(e){return{messages:e.messages.map(r=>({...r})),context:JSON.parse(JSON.stringify(e.context)),metadata:{...e.metadata,visitedNodes:[...e.metadata.visitedNodes]}}}mergeBranchResults(e,r){e.context.parallelResults=r}}});var _C,_i,vw=D(()=>{"use strict";Vr();_C=50,_i=class extends mt{constructor(e,r){super(e,r)}async execute(e){let{maxIterations:r=_C,exitCondition:n}=this.config.config;if(e.metadata.loopCount+=1,e.metadata.loopCount>=r){this.logger.warn(`Max iterations (${r}) reached \u2014 exiting loop`),e.context.loopExited=!0;return}if(n&&this.evaluateExitCondition(n,e)){this.logger.debug(`Exit condition met at iteration ${e.metadata.loopCount}`),e.context.loopExited=!0;return}this.logger.debug(`Loop iteration ${e.metadata.loopCount}/${r}`),e.context.loopExited=!1}evaluateExitCondition(e,r){try{let n=e.match(/\$\{state\.([^}]+)\}/);if(!n)return!1;let o=n[1].split("."),i=r;for(let s of o)i=i?.[s];return i===!0||i==="true"}catch{return!1}}}});var Sw=D(()=>{"use strict";Vr();mw();gw();ww();yw();bw();vw()});function RC(t,e){for(let r=1;r<=e;r++){if(t.length<2*r)continue;let n=t.slice(t.length-2*r,t.length-r),o=t.slice(t.length-r);if(n.every((i,s)=>i===o[s]))return o}return null}var TC,xw,po,Fd=D(()=>{"use strict";uo();Sw();TC=6,xw=30;po=class{graph;registry;modelRouter;callbacks;engineLogger=ht.child("GraphEngine");constructor(e,r,n,o={}){this.graph=e,this.registry=r,this.modelRouter=n,this.callbacks=o}getNodeContext(){return{registry:this.registry,modelRouter:this.modelRouter,logger:this.engineLogger,onChunk:this.callbacks.onChunk,onToolUse:this.callbacks.onToolUse}}createNode(e){let r=this.getNodeContext();switch(e.type){case"llm":return new ki(e,r);case"tool":return new Ei(e,r);case"human":return new Pi(e,r);case"router":return new Ai(e,r);case"loop":return new _i(e,r);case"parallel":{let n=new Ci(e,r);return n.setExecuteNodeFn(async(o,i)=>{let s=this.getNode(o);s&&await this.executeNode(s,i)}),n}default:throw new Error(`Unknown node type: ${e.type}`)}}async execute(e){let r=new Date,n={messages:[],context:{},metadata:{currentNode:this.graph.entryPoint,visitedNodes:[],startTime:r.getTime(),conversationId:crypto.randomUUID(),loopCount:0,status:"running"},...e};try{let o=this.graph.entryPoint,i=50;for(;n.metadata.status==="running";){if(n.metadata.loopCount>i){let d=n.metadata.visitedNodes.slice(-6).join(" \u2192 ");throw new Error(`\uADF8\uB798\uD504\uAC00 ${i}\uD68C \uBC18\uBCF5\uB410\uC2B5\uB2C8\uB2E4 (\uCD5C\uADFC \uACBD\uB85C: ${d}). \uBAA8\uB378\uC774 \uAC19\uC740 \uB3D9\uC791\uC744 \uBC18\uBCF5\uD558\uBA70 \uC9C4\uC804\uC774 \uC5C6\uB294 \uAC83 \uAC19\uC2B5\uB2C8\uB2E4 \u2014 \uB3C4\uAD6C \uACB0\uACFC\uAC00 LLM \uC5D0 \uD53C\uB4DC\uBC31\uB418\uACE0 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.`)}n.metadata.loopCount++,n.metadata.visitedNodes.push(o),n.metadata.currentNode=o;let a=RC(n.metadata.visitedNodes,TC);if(a){if(n.metadata._cycleRepeats=(n.metadata._cycleRepeats??0)+1,n.metadata._cycleRepeats>xw)throw new Error(`\uADF8\uB798\uD504 \uBB34\uD55C \uB8E8\uD504 \uAC10\uC9C0: [${a.join(" \u2192 ")}] \uC21C\uD658\uC774 ${xw}\uD68C \uC774\uC0C1 \uBC18\uBCF5\uB410\uC2B5\uB2C8\uB2E4. \uBAA8\uB378\uC774 \uAC19\uC740 \uB3C4\uAD6C \uD638\uCD9C\uC744 \uBC18\uBCF5\uD558\uBA70 \uC9C4\uC804\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774\uC804 \uB3C4\uAD6C \uACB0\uACFC\uAC00 LLM \uC5D0 \uD53C\uB4DC\uBC31\uB418\uACE0 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.`)}else n.metadata._cycleRepeats=0;let c=this.getNode(o);if(!c)throw new Error(`Node not found: ${o}`);await this.executeNode(c,n);let l=this.getNextNode(c,n);if(!l){n.metadata.status="completed";continue}o=l}let s=n.context._tokensUsed??{input:0,output:0};return{state:n,output:n.context,duration:Date.now()-r.getTime(),tokensUsed:s}}catch(o){throw n.metadata.status="error",n.context.error=o,o}}getNode(e){return this.graph.nodes.find(r=>r.id===e)}async executeNode(e,r){await this.createNode(e).execute(r)}getNextNode(e,r){let n=this.graph.edges.filter(o=>o.from===e.id);if(e.type==="router"){let o=r.context.routerTarget;return o&&n.find(a=>a.to===o)?o:n.find(s=>!s.condition)?.to??null}for(let o of n)if(!o.condition||this.evaluateEdgeCondition(o.condition,r))return o.to;return null}evaluateEdgeCondition(e,r){if(typeof e=="function")return e(r);let n=e.key,o=e.operator||"==",i=e.value,s=r.context[n];switch(s===void 0&&(s=r.metadata[n]),o){case"===":return s===i;case"!==":return s!==i;case"==":return s==i;case"!=":return s!=i;case">":return s>i;case"<":return s<i;case">=":return s>=i;case"<=":return s<=i;default:return!1}}}});var fo,jd=D(()=>{"use strict";fo=class{apiKey;constructor(e){this.apiKey=e}getModel(e){return this.models.find(r=>r.id===e)}getDefaultModel(){return this.models[0]?.id||""}estimateCost(e,r,n){let o=this.getModel(n);return o?e/1e3*o.pricing.inputPer1k+r/1e3*o.pricing.outputPer1k:0}countTokens(e){return Math.ceil(e.length/4)}validateApiKey(){if(!this.apiKey)throw new Error(`${this.name} API key not configured. Set ${this.name.toUpperCase()}_API_KEY environment variable.`)}}});function ho(t){zr.push(t),zr.length>4&&(zr=zr.slice(-4))}function kw(){let t=zr;return zr=[],t}function Ew(){return zr.length}function Ud(){zr=[]}function Ti(t,e){if(!t||typeof t!="object")return null;let r=t;if(r.type!=="image")return null;if(typeof r.data=="string"&&r.data)return{kind:"image",mediaType:typeof r.mimeType=="string"?r.mimeType:"image/png",data:r.data,fromTool:e};let n=r.source;if(n&&typeof n=="object"){let o=n;if(typeof o.data=="string"&&o.data)return{kind:"image",mediaType:typeof o.media_type=="string"?o.media_type:"image/png",data:o.data,fromTool:e}}return null}function Pw(t){return t.map(e=>({type:"image_url",image_url:{url:`data:${e.mediaType};base64,${e.data}`}}))}var zr,Ri=D(()=>{"use strict";zr=[]});async function OC(t,e){let r;try{return await Promise.race([t.read(),new Promise((n,o)=>{r=setTimeout(()=>o(new Error(`stream stalled after ${Math.round(e/1e3)}s with no data`)),e)})])}finally{r&&clearTimeout(r)}}var IC,wF,$C,Aw,jt,mo=D(()=>{"use strict";jd();ze();Ri();ge();IC=[],wF=be.cloud.modelLocation,$C=be.models.liteSentinel,Aw=be.models.orchSentinel;jt=class extends fo{name="server";models=IC;client=new ve;getDefaultModel(){return"default"}mapTier(e){if(e.startsWith("claude-"))return{thinkingMode:"think",model:Aw};switch(e){case"light":return{thinkingMode:"fast",model:$C};case"default":return{thinkingMode:"fast"};case"orchestrator":return{thinkingMode:"think",model:Aw};case"heavy":return{thinkingMode:"think"};default:return{thinkingMode:"fast"}}}buildBody(e,r,n){let o=r?.model||this.getDefaultModel(),{thinkingMode:i,model:s}=this.mapTier(o),a=[],c=r?.systemPrompt;c&&a.push({role:"system",content:c});for(let p of e){if(p.role==="assistant"&&p.toolCalls&&p.toolCalls.length>0){a.push({role:"assistant",content:p.content,tool_calls:p.toolCalls.map(u=>({id:u.id,name:u.name,function:{name:u.name,arguments:JSON.stringify(u.arguments??{})}}))});continue}if(p.role==="tool"&&p.toolResults&&p.toolResults.length>0){for(let u of p.toolResults)a.push({role:"tool",tool_call_id:u.toolCallId,content:JSON.stringify({isError:u.isError??!1,content:u.content})});continue}a.push({role:p.role,content:p.content})}let l=kw();if(l.length>0)for(let p=a.length-1;p>=0;p--){if(a[p].role!=="user")continue;let u=typeof a[p].content=="string"?a[p].content:"";a[p]={...a[p],content:[...u?[{type:"text",text:u}]:[],...Pw(l)]};break}let d={messages:a,thinkingMode:i,stream:n,systemMode:"replace"};return s&&(d.model=s),r?.tools?.length&&(d.tools=r.tools.map(p=>({name:p.name,description:p.description,parameters:p.parameters}))),d}async post(e,r){let n=await this.client.request("/api/chat",{method:"POST",body:JSON.stringify(e),...r?{signal:r}:{}});if(n.status===401)throw new Error("Unauthorized. Run `protocol login` again.");if(n.status===429){let o=await n.json().catch(()=>({}));throw new Error(`USAGE_LIMIT_EXCEEDED${o.blockedBy?` (${o.blockedBy})`:""}: Protocol \uC0AC\uC6A9\uB7C9 \uD55C\uB3C4\uB97C \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.`)}if(!n.ok){let o=await n.text().catch(()=>"");throw new Error(`Protocol chat error (${n.status}): ${o}`)}return n}async generate(e,r){let n=Date.now(),i=await(await this.post(this.buildBody(e,r,!1),r?.signal)).json(),s=i.tool_calls?.map(a=>({id:a.id,name:a.name,arguments:a.args??{}}));return{content:i.content??"",model:i.model,toolCalls:s?.length?s:void 0,usage:{inputTokens:i.usage?.promptTokens??0,outputTokens:i.usage?.outputTokens??0,thoughtsTokens:i.usage?.thoughtsTokens??0},finishReason:s?.length?"tool_use":"end",latencyMs:Date.now()-n}}async*generateStream(e,r){if(r?.tools?.length){let d=await this.generate(e,r);d.content&&(yield{type:"content",content:d.content});for(let p of d.toolCalls??[])yield{type:"tool_call",toolCall:p};return}let n=await this.post(this.buildBody(e,r,!0),r?.signal);if(!n.body)throw new Error("No response body");let o=n.body.getReader(),i=new TextDecoder,s="",a=12e4,c=6e4,l=!0;for(;;){let{done:d,value:p}=await OC(o,l?a:c);if(d)break;l=!1,s+=i.decode(p,{stream:!0});let u=s.split(`
|
|
69
|
+
`);s=u.pop()||"";for(let f of u){if(!f.startsWith("data: "))continue;let m=f.slice(6).trim();if(m)try{let h=JSON.parse(m);if(h.done)return;typeof h.content=="string"&&(yield{type:"content",content:h.content})}catch{}}}}async isAvailable(){return!0}}});function DC(t){return/stable-diffusion|flux|sdxl|dall|midjourney|pixart|imagen/i.test(t)}function _w(t){return[502,503,504].includes(t)?" \u2014 \uB85C\uCEEC \uC11C\uBC84\uAC00 \uC900\uBE44 \uC911\uC774\uAC70\uB098 \uC77C\uC2DC\uC801\uC73C\uB85C \uBC14\uC060 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC11C\uBC84 \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0 \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.":""}function NC(t){if(typeof t!="string")return"\uC11C\uBC84\uAC00 \uC0C1\uC138 \uC0AC\uC720 \uC5C6\uC774 \uC624\uB958\uB97C \uBC18\uD658\uD588\uC2B5\uB2C8\uB2E4.";let e=t.replace(/\s+/g," ").trim();return e?e.length>Cw?`${e.slice(0,Cw)}\u2026`:e:"\uC11C\uBC84\uAC00 \uC0C1\uC138 \uC0AC\uC720 \uC5C6\uC774 \uC624\uB958\uB97C \uBC18\uD658\uD588\uC2B5\uB2C8\uB2E4."}function Tw(t){if(t instanceof Error){let e=t.cause;if(e instanceof Error){let r=e.code;return r?`${e.message} (${r})`:e.message}return t.name==="AbortError"||t.name==="TimeoutError"?`\uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC (${t.name})`:t.message}return String(t)}var MC,Cw,ja,kn,Wd=D(()=>{"use strict";jd();ge();MC=12e4,Cw=240,ja=[150,500];kn=class extends fo{name="local";models=[];config;resolvedModel=null;constructor(e){super(),this.config=e??new K}get endpoint(){return(this.config.get("models").localEndpoint||"http://127.0.0.1:8080/v1").replace(/\/$/,"")}get configuredModel(){return this.config.get("models").localModel||""}get thinkingEnabled(){return this.config.get("models").localThinking??!1}getDefaultModel(){return"local"}async fetchModels(e){for(let r=0;;r++){let n=await this.withAbort(e,3e3,o=>fetch(`${this.endpoint}/models`,{signal:o}));if(![502,503,504].includes(n.status)||r>=ja.length)return n;await n.body?.cancel(),await new Promise(o=>setTimeout(o,ja[r]))}}async isAvailable(){try{let e=await this.fetchModels(),r=e.ok;return await e.body?.cancel(),r}catch{return!1}}async resolveModel(e){if(this.configuredModel)return this.configuredModel;if(this.resolvedModel)return this.resolvedModel;let r="";try{let n,o;for(let i=0;{res:n,data:o}=await this.withAbort(e,3e3,async s=>{let a=await fetch(`${this.endpoint}/models`,{signal:s});if(s.aborted)throw s.reason;let c=a.ok?await a.json():void 0;return{res:a,data:c}}),!(![502,503,504].includes(n.status)||i>=ja.length);i++)await n.body?.cancel(),await new Promise(s=>setTimeout(s,ja[i]));if(n.ok){let i=(o?.data??[]).map(a=>a.id),s=i.find(a=>!DC(a));s?this.resolvedModel=s:i.length>0?r=`\uC11C\uBC84\uC5D0 \uCC44\uD305 \uAC00\uB2A5\uD55C \uBAA8\uB378\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 (\uB4F1\uB85D\uB41C \uBAA8\uB378: ${i.join(", ")} \u2014 \uC804\uBD80 \uC774\uBBF8\uC9C0 \uC0DD\uC131 \uBAA8\uB378\uB85C \uBCF4\uC785\uB2C8\uB2E4)`:r="\uC11C\uBC84\uAC00 \uBAA8\uB378 \uBAA9\uB85D\uC744 \uBE44\uC5B4 \uC788\uAC8C \uBC18\uD658\uD588\uC2B5\uB2C8\uB2E4"}else r=`${this.endpoint}/models \uC751\uB2F5 ${n.status}${_w(n.status)}`,await n.body?.cancel()}catch(n){if(e?.aborted)throw n;r=`${this.endpoint}/models \uC694\uCCAD \uC2E4\uD328 \u2014 ${Tw(n)}`}if(!this.resolvedModel)throw new Error(`\uB85C\uCEEC \uBAA8\uB378\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4${r?` (${r})`:""}. \`protocol config set models.localModel <model>\` \uB85C \uC9C0\uC815\uD558\uAC70\uB098 \`PROTOCOL_LOCAL_MODEL\` \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.`);return this.resolvedModel}toOpenAIMessages(e,r){let n=[];r&&n.push({role:"system",content:r});for(let o of e){if(o.role==="assistant"&&o.toolCalls&&o.toolCalls.length>0){n.push({role:"assistant",content:o.content,tool_calls:o.toolCalls.map(i=>({id:i.id,type:"function",function:{name:i.name,arguments:JSON.stringify(i.arguments??{})}}))});continue}if(o.role==="tool"&&o.toolResults&&o.toolResults.length>0){for(let i of o.toolResults)n.push({role:"tool",tool_call_id:i.toolCallId,content:i.isError?`[tool error] ${i.content}`:i.content});continue}n.push({role:o.role,content:o.content})}return n}toOpenAITools(e){return e.map(r=>({type:"function",function:{name:r.name,description:r.description,parameters:r.parameters}}))}parseArgs(e){if(!e)return{};try{let r=JSON.parse(e);return r&&typeof r=="object"&&!Array.isArray(r)?r:{_raw:e,_error:"tool arguments must be a JSON object"}}catch{return{_raw:e,_error:"tool arguments are not valid JSON"}}}async withAbort(e,r,n){let o=new AbortController,i=setTimeout(()=>o.abort(new Error(`local model request timed out after ${r/1e3}s`)),r),s=()=>o.abort(e?.reason);e&&(e.aborted?o.abort(e.reason):e.addEventListener("abort",s,{once:!0}));try{if(o.signal.aborted)throw o.signal.reason;return await n(o.signal)}finally{clearTimeout(i),e?.removeEventListener("abort",s)}}async postJson(e,r,n){return this.withAbort(n,MC,async o=>{let i=await fetch(`${this.endpoint}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r),signal:o});if(o.aborted)throw o.reason;let s;try{s=await i.json()}catch(a){if(!i.ok)s={};else throw a}return{res:i,data:s}})}async generate(e,r){let n=Date.now(),o=await this.resolveModel(r?.signal),i={model:o,messages:this.toOpenAIMessages(e,r?.systemPrompt),temperature:r?.temperature??.2,max_tokens:r?.maxTokens??4096,chat_template_kwargs:{enable_thinking:this.thinkingEnabled}};r?.tools?.length&&(i.tools=this.toOpenAITools(r.tools),i.tool_choice="auto");let s,a;try{({res:s,data:a}=await this.postJson("/chat/completions",i,r?.signal))}catch(p){throw r?.signal?.aborted?p:new Error(`\uB85C\uCEEC \uBAA8\uB378 \uC11C\uBC84(${this.endpoint})\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 ${Tw(p)}`)}if(!s.ok)throw new Error(`local model error (${s.status}) [model=${o}]${_w(s.status)}: ${NC(a.error?.message)}`);let c=a.choices?.[0]?.message,l=c?.content?.trim()??"",d=(c?.tool_calls??[]).map((p,u)=>({id:typeof p.id=="string"&&p.id.trim()?p.id:`local-tool-${u+1}`,name:typeof p.function?.name=="string"&&p.function.name.trim()?p.function.name:"__malformed_tool_call__",arguments:this.parseArgs(p.function?.arguments)}));return{content:l,model:o,toolCalls:d.length?d:void 0,finishReason:d.length?"tool_use":"end",latencyMs:Date.now()-n}}async*generateStream(e,r){let n=await this.generate(e,r);n.content&&(yield{type:"content",content:n.content});for(let o of n.toolCalls??[])yield{type:"tool_call",toolCall:o}}}});var go,Bd=D(()=>{"use strict";mo();Wd();go=class{server;local;constructor(){this.server=new jt,this.local=new kn}getProvider(e){if(e==="server")return this.server;if(e==="local")return this.local}}});var En,Kr,Fe,$F,lr=D(()=>{"use strict";En={readonly:"ReadOnly",workspace:"WorkspaceWrite",full:"DangerFullAccess"},Kr={default:{en:"asks before risky actions",ko:"\uC704\uD5D8 \uC791\uC5C5 \uC804 \uD655\uC778"},yolo:{en:"no prompts \xB7 writes confined to this folder (+ temp dirs) \xB7 bash sandboxed",ko:"\uD655\uC778 \uC5C6\uC74C \xB7 \uC4F0\uAE30\uB294 \uD604\uC7AC \uD3F4\uB354(+\uC784\uC2DC \uB514\uB809\uD1A0\uB9AC) \xB7 bash \uC0CC\uB4DC\uBC15\uC2A4"},danger:{en:"no prompts \xB7 writes anywhere \xB7 no sandbox (catastrophic commands still blocked)",ko:"\uD655\uC778 \uC5C6\uC74C \xB7 \uC4F0\uAE30 \uC81C\uD55C \uC5C6\uC74C \xB7 \uC0CC\uB4DC\uBC15\uC2A4 \uC5C6\uC74C (\uD30C\uAD34\uC801 \uBA85\uB839\uC740 \uC5EC\uC804\uD788 \uCC28\uB2E8)"}},Fe=class t{policy;tier;confirmHandler=null;sessionAllowed=new Set;constructor(e={mode:"WorkspaceWrite"},r="default"){this.policy=e,this.tier=r}setConfirmHandler(e){this.confirmHandler=e}clearSessionApprovals(){this.sessionAllowed.clear()}setPolicy(e){this.policy=e}getPolicy(){return this.policy}getTier(){return this.tier}setTier(e){this.tier=e}isAutoApprove(){return this.tier!=="default"}canExecute(e){let r=["ReadOnly","WorkspaceWrite","DangerFullAccess"],n=r.indexOf(this.policy.mode),o=r.indexOf(e);return n>=o}static CATASTROPHIC_COMMANDS=[/rm\s+.*-[rf].*\s+(\/|~|\$HOME|\/(?:etc|usr|var|bin|sbin|boot|root|private|System|Library)\b)(\s|\/|\*|$)/,/rm\s+.*--no-preserve-root/,/:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;?\s*:/,/\bmkfs(\.\w+)?\b/,/\bdd\b[^|]*\bof=\/dev\//,/>\s*\/dev\/(sd|nvme|hd|disk|vd)/,/\b(curl|wget)\b[^|]*\|\s*(sudo\s+)?(ba|z)?sh\b/,/git\s+push\s+.*(--force|-f)\b.*\b(main|master)\b/,/git\s+push\s+.*\b(main|master)\b.*(--force|-f)\b/,/chmod\s+.*-R.*\s+(\/|~|\/(?:etc|usr|var|bin|sbin|boot|root|private|System|Library)\b)(\s|\/|\*|$)/,/chown\s+.*-R.*\s+(\/|~|\/(?:etc|usr|var|bin|sbin|boot|root|private|System|Library)\b)(\s|\/|\*|$)/];static WORK_LOSS_COMMANDS=[/git\s+checkout\s+--\s+.+/,/git\s+restore\s+.+/,/git\s+reset\s+--hard/,/git\s+clean\s+-f/,/git\s+stash(?:\s+(?:push|save)\b|\s*$)/,/\brm\b\s+(?!-rf\s+\/)(?!.*--no-preserve-root).+/];static SYSTEM_DENY_PATHS=["/etc","/dev","/sys","/proc","/boot","/bin","/sbin","/usr/bin","/usr/sbin","/usr/lib","/System","/Library","/private/etc","/var/root"];static isCatastrophicCommand(e){return t.CATASTROPHIC_COMMANDS.some(r=>r.test(e))}static isWorkLossCommand(e){return t.WORK_LOSS_COMMANDS.some(r=>r.test(e))}static isProtectedSystemPath(e){if(t.SYSTEM_DENY_PATHS.some(n=>e===n||e.startsWith(n+"/")))return!0;let r=process.env.HOME||process.env.USERPROFILE||"";return!!(r&&(e===r+"/.ssh"||e.startsWith(r+"/.ssh/")))}static isSecretPath(e){let r=e.split("/").pop()||"";if(/^\.env(\.|$)/.test(r)&&!/\.(example|sample|template|dist)$/.test(r)||/-key\.json$/.test(r)||r==="local.settings.json"||r===".npmrc"||r===".netrc")return!0;let n=process.env.HOME||process.env.USERPROFILE||"";return!!(n&&["/.aws","/.config/gcloud","/.gnupg","/.kube","/.ssh","/.docker/config.json"].some(i=>e===n+i||e.startsWith(n+i+"/")))}static pathWithin(e,r){if(r===e)return!0;let n=e.endsWith("/")?e:e+"/";return r.startsWith(n)}canAccessPath(e,r=!1){if(t.isSecretPath(e)||r&&t.isProtectedSystemPath(e)||this.policy.deniedPaths?.some(n=>t.pathWithin(n,e)))return!1;if(r&&this.policy.writeOnlyAllowedPaths?.length){if(!this.policy.writeOnlyAllowedPaths.some(n=>t.pathWithin(n,e)))return!1}else if(this.policy.allowedPaths?.length&&!this.policy.allowedPaths.some(n=>t.pathWithin(n,e)))return!1;return!(r&&this.policy.mode==="ReadOnly")}canExecuteCommand(e){return!(t.isCatastrophicCommand(e)||this.policy.mode!=="DangerFullAccess"||this.policy.deniedCommands?.some(r=>e.startsWith(r))||this.policy.allowedCommands?.length&&!this.policy.allowedCommands.some(r=>e.startsWith(r)))}createPrompt(e,r){if(this.isAutoApprove())return null;let n="",o="",i="low",s="";switch(e){case"read_file":case"glob_search":case"grep_search":n="Read",o=r.file_path||r.pattern||"files",i="low",s=`Allow reading ${o}?`;break;case"write_file":case"edit_file":n="Write",o=r.file_path||"file",i="medium",s=`Allow modifying ${o}?`;break;case"bash":n="Execute",o=r.command||"command",i="high",s=`Allow executing: ${o}?`;break;default:n="Use",o=e,i="medium",s=`Allow using tool: ${e}?`}return{toolName:e,action:n,resource:o,risk:i,message:s}}async requestApproval(e,r){if(this.isAutoApprove())return{allowed:!0};let n=this.createPrompt(e,r);if(!n||n.risk==="low")return{allowed:!0};if(this.sessionAllowed.has(e))return{allowed:!0};if(!this.confirmHandler)return{allowed:!0};let o=await this.confirmHandler(n);return o==="deny"?{allowed:!1,message:`\uC0AC\uC6A9\uC790\uAC00 \uAC70\uBD80\uD568: ${n.message}`}:(o==="session"&&this.sessionAllowed.add(e),{allowed:!0})}},$F={readOnly:{mode:"ReadOnly"},workspace:{mode:"WorkspaceWrite",allowedPaths:[process.cwd()]},fullAccess:{mode:"DangerFullAccess"}}});function Rw(t){return Hd.find(e=>e.name===t)}var Hd,Iw=D(()=>{"use strict";lr();Hd=[{name:"read_file",description:"Read the contents of a file. Supports reading images (PNG, JPG, etc) and PDF files.",inputSchema:{type:"object",properties:{file_path:{type:"string",description:"The absolute path to the file to read"},offset:{type:"number",description:"Line number to start reading from"},limit:{type:"number",description:"Number of lines to read"}},required:["file_path"]},requiredPermission:"ReadOnly"},{name:"write_file",description:"Write content to a file, creating or overwriting as needed.",inputSchema:{type:"object",properties:{file_path:{type:"string",description:"The absolute path to write to"},content:{type:"string",description:"Content to write to the file"}},required:["file_path","content"]},requiredPermission:"WorkspaceWrite"},{name:"edit_file",description:"Perform exact string replacements in files.",inputSchema:{type:"object",properties:{file_path:{type:"string",description:"The absolute path to the file"},old_string:{type:"string",description:"Text to replace"},new_string:{type:"string",description:"Text to replace with"},replace_all:{type:"boolean",description:"Replace all occurrences"}},required:["file_path","old_string","new_string"]},requiredPermission:"WorkspaceWrite"},{name:"glob_search",description:"Fast file pattern matching using glob patterns.",inputSchema:{type:"object",properties:{pattern:{type:"string",description:"Glob pattern to match files"},path:{type:"string",description:"Directory to search in"}},required:["pattern"]},requiredPermission:"ReadOnly"},{name:"grep_search",description:"Search file contents using regular expressions.",inputSchema:{type:"object",properties:{pattern:{type:"string",description:"Regex pattern to search for"},path:{type:"string",description:"File or directory to search in"},output_mode:{type:"string",enum:["content","files_with_matches","count"],description:"Output format"},ignore_case:{type:"boolean",description:"Case insensitive search"},context:{type:"number",description:"Context lines around match"}},required:["pattern"]},requiredPermission:"ReadOnly"},{name:"bash",description:"Execute shell commands with safety checks.",inputSchema:{type:"object",properties:{command:{type:"string",description:"Command to execute"},timeout:{type:"number",description:"Timeout in milliseconds"},run_in_background:{type:"boolean",description:"Run in background"}},required:["command"]},requiredPermission:"DangerFullAccess"},{name:"web_fetch",description:"Fetch content from a URL. Returns the page text with HTML tags stripped.",inputSchema:{type:"object",properties:{url:{type:"string",description:"The URL to fetch"},max_length:{type:"number",description:"Maximum characters to return"}},required:["url"]},requiredPermission:"ReadOnly"},{name:"web_search",description:"Search the web using DuckDuckGo. Returns top results with titles and URLs.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query"},max_results:{type:"number",description:"Maximum number of results to return"}},required:["query"]},requiredPermission:"ReadOnly"},{name:"git_diff",description:"Show the current git diff \u2014 all uncommitted changes in the working tree.",inputSchema:{type:"object",properties:{staged:{type:"boolean",description:"Show staged changes instead of unstaged"},path:{type:"string",description:"Limit diff to a specific file or directory path"}},required:[]},requiredPermission:"ReadOnly"},{name:"plan",description:"Author a step-by-step plan document and gate work on approval.",inputSchema:{type:"object",properties:{action:{type:"string",enum:["create","add_step","request_approval","status","note"],description:"Plan action to perform"},planId:{type:"string",description:"Plan id (required except for create)"},title:{type:"string",description:"Plan title (create) or step title (add_step)"},goal:{type:"string",description:"What the plan aims to achieve (create)"},detail:{type:"string",description:"Step detail \u2014 what & why (add_step)"},stepId:{type:"string",description:"Step id (request_approval)"},text:{type:"string",description:"Note text (note)"},commands:{type:"array",items:{type:"string"},description:"add_step: exact shell commands this step may run"},paths:{type:"array",items:{type:"string"},description:"add_step: directory subtrees this step may write to"}},required:["action"]},requiredPermission:"ReadOnly"},{name:"debate",description:"Run a multi-model debate for a hard, ambiguous, or high-stakes decision.",inputSchema:{type:"object",properties:{topic:{type:"string",description:"The question or decision to debate"},format:{type:"string",enum:["roundtable","adversarial","panel"]},context:{type:"string",description:"Optional background/context for the debate"},maxRounds:{type:"number",description:"Max debate rounds"}},required:["topic"]},requiredPermission:"ReadOnly"},{name:"agent",description:"Launch a specialized sub-agent to handle a complex task autonomously.",inputSchema:{type:"object",properties:{prompt:{type:"string",description:"The task for the sub-agent to perform"},subagent_type:{type:"string",enum:["general-purpose","Explore","Plan","Verification"],description:"Type of sub-agent to spawn"},description:{type:"string",description:"Brief description of what the agent will do"},model:{type:"string",enum:["heavy","default","light"],description:"Model tier for the sub-agent"}},required:["prompt","subagent_type"]},requiredPermission:"ReadOnly"},{name:"ask_user",description:"Ask the user for confirmation or additional information before proceeding.",inputSchema:{type:"object",properties:{question:{type:"string",description:"The question or confirmation message to show"},type:{type:"string",enum:["confirm","text"],description:"Yes/No or free-form input"}},required:["question"]},requiredPermission:"ReadOnly"},{name:"Skill",description:"Execute a predefined skill, workflow, or slash command.",inputSchema:{type:"object",properties:{skill:{type:"string",description:"Skill name to invoke"},args:{type:"string",description:"Arguments for the skill"}},required:["skill"]},requiredPermission:"ReadOnly"},{name:"cowork_artifacts_list",description:"List the deliverables box (cowork_artifacts) folder tree for the current cowork project.",inputSchema:{type:"object",properties:{path:{type:"string",description:'Folder path to list, e.g. "\uBE0C\uB79C\uB4DC/og". Omit for the root.'}},required:[]},requiredPermission:"ReadOnly"},{name:"cowork_artifact_move",description:"Move one deliverable or one whole folder within the cowork deliverables box.",inputSchema:{type:"object",properties:{from:{type:"string",description:"Source artifact path or folder path"},to:{type:"string",description:'Destination folder path ("" = root)'}},required:["from","to"]},requiredPermission:"WorkspaceWrite"},{name:"cowork_artifact_rename",description:"Rename a folder in the cowork deliverables box (rewrites the last path segment across every artifact under it).",inputSchema:{type:"object",properties:{path:{type:"string",description:"Folder path to rename"},newName:{type:"string",description:"New name for the last segment"}},required:["path","newName"]},requiredPermission:"WorkspaceWrite"}]});var ur,Ua,$i=D(()=>{"use strict";ur=class{hooks=new Map;constructor(){this.hooks.set("PreToolUse",[]),this.hooks.set("PostToolUse",[]),this.hooks.set("OnMessage",[]),this.hooks.set("OnError",[]),this.hooks.set("OnConversationStart",[]),this.hooks.set("OnConversationEnd",[])}register(e){let r=this.hooks.get(e.event)||[];r.push({...e,priority:e.priority??0,enabled:e.enabled??!0}),r.sort((n,o)=>(o.priority??0)-(n.priority??0)),this.hooks.set(e.event,r)}unregister(e,r){let n=this.hooks.get(e)||[],o=n.findIndex(i=>i.handler===r);o>=0&&n.splice(o,1)}async execute(e,r){let n=this.hooks.get(e)||[];for(let o of n)if(o.enabled)try{if(await o.handler(r)===!1)return!1}catch(i){console.error(`Hook error for ${e}:`,i)}return!0}getHooks(e){return this.hooks.get(e)||[]}clear(e){e?this.hooks.set(e,[]):this.hooks.forEach((r,n)=>this.hooks.set(n,[]))}},Ua=[{event:"PostToolUse",priority:0,handler:async t=>{let e=t;console.log(`[Tool] ${e.toolName} executed in ${e.duration}ms`)}},{event:"OnError",priority:100,handler:async t=>{console.error(`[Error] ${t.error.message}`)}}]});var ae,$w,LC,Wa,Pn,Le=D(()=>{"use strict";ae=class{},$w=["write_file","edit_file"],LC=[...$w,"bash"],Wa=t=>$w.includes(t),Pn=t=>LC.includes(t)});function FC(t,e){let r=e?` ${e}`:"";return`
|
|
70
|
+
|
|
71
|
+
[... ${t} \uC0DD\uB7B5\uB428 \u2014 \uC774 \uCD9C\uB825\uC740 \uC804\uCCB4\uAC00 \uC544\uB2C8\uB2E4.${r}]`}function _r(t,e={}){let{maxChars:r=3e4,maxLines:n,keepTail:o=!0,hint:i}=e;if(!t)return{text:t,truncated:!1};let s=t,a=!1,c="";if(n!==void 0){let l=s.split(`
|
|
72
|
+
`),p=l.length>0&&l[l.length-1]===""?l.length-1:l.length;if(p>n){let u=p-n;s=l.slice(0,n).join(`
|
|
73
|
+
`),a=!0,c=`${u}\uC904`}}if(s.length>r){let l=s.length-r;if(o){let d=Math.floor(r*.67),p=r-d;s=`${s.slice(0,d)}
|
|
74
|
+
|
|
75
|
+
[... \uAC00\uC6B4\uB370 ${l.toLocaleString()}\uC790 \uC0DD\uB7B5 ...]
|
|
76
|
+
|
|
77
|
+
${s.slice(-p)}`}else s=s.slice(0,r);a=!0,c=c?`${c} + ${l.toLocaleString()}\uC790`:`${l.toLocaleString()}\uC790`}return a&&(s+=FC(c,i)),{text:s,truncated:a}}var Oi=D(()=>{"use strict"});import{readFile as UC}from"fs/promises";import{existsSync as WC}from"fs";var Mi,qd=D(()=>{"use strict";Le();Oi();Mi=class extends ae{get definition(){return{name:"read_file",description:"Read file contents from the local filesystem",parameters:{type:"object",properties:{file_path:{type:"string",description:"The absolute path to the file to read"},offset:{type:"number",description:"Line number to start reading from (0-indexed)"},limit:{type:"number",description:"Maximum number of lines to read"}},required:["file_path"]}}}async execute(e,r){let n=e.file_path,o=e.offset??0,i=e.limit;try{if(!WC(n))return{content:"",isError:!0,error:`File not found: ${n}`};let a=(await UC(n,"utf-8")).split(`
|
|
78
|
+
`),c=Math.max(0,o),d=c+(i??2e3),p=a.slice(c,d),f=a.length>0&&a[a.length-1]===""?a.length-1:a.length,m=Math.max(0,f-d),h=p.map((b,k)=>`${c+k+1} ${b}`).join(`
|
|
79
|
+
`);m>0&&(h+=`
|
|
80
|
+
|
|
81
|
+
[... ${m}\uC904 \uB354 \uC788\uC74C (\uC804\uCCB4 ${f}\uC904) \u2014 \uC774\uC5B4\uC11C \uBCF4\uB824\uBA74 offset=${d} \uB85C \uB2E4\uC2DC \uC77D\uC744 \uAC83]`);let{text:w}=_r(h,{keepTail:!1,hint:"\uB354 \uC881\uC740 offset/limit \uC73C\uB85C \uB2E4\uC2DC \uC77D\uC744 \uAC83."});return{content:w,isError:!1}}catch(s){return{content:"",isError:!0,error:`Could not read file: ${s instanceof Error?s.message:String(s)}`}}}}});import{writeFile as BC,mkdir as HC}from"fs/promises";import{existsSync as Ow}from"fs";import{dirname as qC}from"path";var Di,Gd=D(()=>{"use strict";Le();Di=class extends ae{get definition(){return{name:"write_file",description:"Write content to a file on the local filesystem",parameters:{type:"object",properties:{file_path:{type:"string",description:"The absolute path to the file to write"},content:{type:"string",description:"The content to write to the file"},mode:{type:"string",enum:["create","overwrite","append"],description:"Write mode: create (fail if exists), overwrite, or append"}},required:["file_path","content"]}}}async execute(e,r){let n=e.file_path,o=e.content,i=e.mode??"overwrite";if(!n||o===void 0)return{content:"",isError:!0,error:"file_path and content are required"};try{if(!["create","overwrite","append"].includes(i))return{content:"",isError:!0,error:`Invalid mode: ${i}. Must be 'create', 'overwrite', or 'append'`};if(i==="create"&&Ow(n))return{content:"",isError:!0,error:`File already exists: ${n}`};let s=qC(n);return Ow(s)||await HC(s,{recursive:!0}),await BC(n,o,{encoding:"utf-8",flag:i==="append"?"a":"w"}),{content:`Successfully wrote to ${n}`}}catch(s){return{content:"",isError:!0,error:s instanceof Error?s.message:String(s)}}}}});import Mw from"fs/promises";import GC from"path";var Ni,Vd=D(()=>{"use strict";Le();Ni=class extends ae{get definition(){return{name:"edit_file",description:"Perform exact string replacements in files. Use for making targeted edits without rewriting entire files.",parameters:{type:"object",properties:{file_path:{type:"string",description:"The absolute path to the file to edit"},old_string:{type:"string",description:"The text to replace (must match exactly)"},new_string:{type:"string",description:"The text to replace with"},replace_all:{type:"boolean",description:"Replace all occurrences (default: false)"}},required:["file_path","old_string","new_string"]}}}async execute(e,r){let n=e.file_path,o=e.old_string,i=e.new_string,s=e.replace_all;if(!n||!o)return{content:"",isError:!0,error:"file_path and old_string are required"};let a=i??"";try{let c=await Mw.readFile(n,"utf-8");if(!c.includes(o))return{content:"",isError:!0,error:`String not found in file: ${o.substring(0,100)}...`};let l;if(s){if(l=c.split(o).join(a),c.split(o).length-1===0)return{content:"",isError:!0,error:"String not found in file"}}else{let d=c.split(o).length-1;if(d>1)return{content:"",isError:!0,error:`Found ${d} occurrences. Use replace_all=true or provide a more specific old_string.`};l=c.replace(o,a)}return await Mw.writeFile(n,l,"utf-8"),{content:`Successfully edited ${GC.basename(n)}`}}catch(c){return c.code==="ENOENT"?{content:"",isError:!0,error:`File not found: ${n}`}:{content:"",isError:!0,error:c.message}}}}});import{execSync as VC}from"child_process";import*as Ut from"path";import*as Li from"os";function Dw(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function KC(t){let e=Dw(Ut.resolve(t.cwd)),r=t.allowNetwork!==!1,n=Li.homedir(),o=Lw.map(s=>`
|
|
82
|
+
(subpath "${Dw(Ut.join(n,s))}")`).join(""),i=[...zC.map(s=>`
|
|
83
|
+
(literal "${s}")`),`
|
|
84
|
+
(subpath "/dev/pts")`,`
|
|
85
|
+
(subpath "/dev/fd")`].join("");return`(version 1)
|
|
86
|
+
(deny default)
|
|
87
|
+
(allow process-exec*)
|
|
88
|
+
(allow process-fork)
|
|
89
|
+
(allow signal (target self))
|
|
90
|
+
(allow file-read*)
|
|
91
|
+
(allow file-write*
|
|
92
|
+
(subpath "${e}")
|
|
93
|
+
(subpath "/tmp")
|
|
94
|
+
(subpath "/private/tmp")
|
|
95
|
+
(subpath "/private/var/folders")${o}${i})
|
|
96
|
+
(allow sysctl-read)
|
|
97
|
+
(allow mach-lookup)
|
|
98
|
+
(allow iokit-open)
|
|
99
|
+
${r?"(allow network*)":"(deny network*)"}
|
|
100
|
+
`}function JC(t,e){return{cmd:"sandbox-exec",args:["-p",KC(e),"/bin/sh","-c",t]}}function YC(){if(!Nw){Nw=!0;try{VC("command -v bwrap",{stdio:"ignore"}),zd=!0}catch{zd=!1}}return zd}function XC(t,e){let r=Ut.resolve(e.cwd),n=e.allowNetwork!==!1,o=Li.tmpdir(),i=Li.homedir(),s=["--ro-bind","/","/","--dev","/dev","--proc","/proc","--bind",r,r,"--bind",o,o];for(let a of Lw){let c=Ut.join(i,a);s.push("--bind-try",c,c)}return s.push("--chdir",r,"--die-with-parent"),n||s.push("--unshare-net"),s.push("/bin/sh","-c",t),{cmd:"bwrap",args:s}}function Fw(t,e){return process.platform==="darwin"?JC(t,e):process.platform==="linux"&&YC()?XC(t,e):null}function jw(t,e){let r=Ut.resolve(t),n=Ut.resolve(e);return!!(r===Ut.sep||r===n||r.split(Ut.sep).filter(Boolean).length<=2||QC.some(i=>r===i||r.startsWith(i+Ut.sep)))}var Lw,zC,Nw,zd,QC,Kd=D(()=>{"use strict";Lw=[".npm",".npm-global",".cache",".cargo",".rustup",".gradle",".m2",".yarn",".pnpm-store",".bun",".deno","Library/Caches"],zC=["/dev/null","/dev/zero","/dev/random","/dev/urandom","/dev/tty","/dev/ptmx"];Nw=!1,zd=!1;QC=["/etc","/usr","/bin","/sbin","/boot","/dev","/proc","/sys","/var","/root","/System","/Library","/private"]});function wo(t){for(let e of ZC)if(e.test(t))return e.source;return null}var ZC,Ba=D(()=>{"use strict";ZC=[/rm\s+.*-[rf].*\s+(\/|~|\$HOME|\/(?:etc|usr|var|bin|sbin|boot|root|private|System|Library)\b)(\s|\/|\*|$)/,/rm\s+.*--no-preserve-root/,/rm\s+-rf\s+.*\.git(\s|\/|$)/,/git\s+push\s+.*(--force|-f)\b.*\b(main|master)\b/,/git\s+push\s+.*\b(main|master)\b.*(--force|-f)\b/,/>\s*\/dev\/(sd|nvme|hd|disk|vd)/,/\bdd\b[^|]*\bof=\/dev\//,/\bmkfs(\.\w+)?\b/,/chmod\s+.*-R.*\s+(\/|~|\/(?:etc|usr|var|bin|sbin|boot|root|private|System|Library)\b)(\s|\/|\*|$)/,/chown\s+.*-R.*\s+(\/|~|\/(?:etc|usr|var|bin|sbin|boot|root|private|System|Library)\b)(\s|\/|\*|$)/,/chmod\s+777\s+\//,/:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;?\s*:/,/\b(curl|wget)\b[^|]*\|\s*(sudo\s+)?(ba|z)?sh\b/]});import{exec as e_,execFile as t_}from"child_process";import{promisify as Uw}from"util";var r_,n_,Fi,Jd=D(()=>{"use strict";Le();Kd();Ba();Oi();r_=Uw(e_),n_=Uw(t_),Fi=class extends ae{get definition(){return{name:"bash",description:"Execute shell commands with safety checks. Use for system commands, git operations, npm, etc.",parameters:{type:"object",properties:{command:{type:"string",description:"Command to execute"},timeout:{type:"number",description:"Timeout in milliseconds (default: 120000)"},run_in_background:{type:"boolean",description:"Run in background (default: false)"}},required:["command"]}}}async execute(e,r){let n=e.command,o=e.timeout??12e4;if(!n)return{content:"",isError:!0,error:"Command is required"};let i=wo(n);if(i)return{content:"",isError:!0,error:`Blocked potentially dangerous command pattern: ${i}`};let s=r.context?.__permissionTier??"default",a=process.cwd(),c=s==="danger"?null:Fw(n,{cwd:a});if(s==="yolo"&&!c)return{content:"",isError:!0,error:`No OS sandbox available here (e.g. bubblewrap(bwrap) not installed on Linux, or an unsupported platform). The current permission tier runs without approval prompts, so the sandbox is the only live guardrail \u2014 bash is not run without it. Install bwrap, or run with approval prompts on (the default tier).
|
|
101
|
+
OS \uC0CC\uB4DC\uBC15\uC2A4\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uD658\uACBD\uC785\uB2C8\uB2E4(\uC608: Linux\uC5D0\uC11C bubblewrap(bwrap) \uBBF8\uC124\uCE58, \uB610\uB294 \uBBF8\uC9C0\uC6D0 \uD50C\uB7AB\uD3FC). \uC9C0\uAE08 \uD2F0\uC5B4\uB294 \uD655\uC778 \uD504\uB86C\uD504\uD2B8\uAC00 \uAEBC\uC838 \uC788\uC5B4 \uC0CC\uB4DC\uBC15\uC2A4\uAC00 \uC720\uC77C\uD55C \uC2E4\uC2DC\uAC04 \uBC29\uC5B4\uC120\uC774\uB77C bash\uB97C \uC2E4\uD589\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 bwrap\uC744 \uC124\uCE58\uD558\uAC70\uB098, \uD655\uC778 \uD504\uB86C\uD504\uD2B8\uAC00 \uCF1C\uC9C4 \uAE30\uBCF8 \uD2F0\uC5B4\uB85C \uC2E4\uD589\uD558\uC138\uC694.`};let d=r.context?.signal?.controller.signal;try{let{stdout:p,stderr:u}=c?await n_(c.cmd,c.args,{timeout:o,maxBuffer:10485760,cwd:a,signal:d}):await r_(n,{timeout:o,maxBuffer:10485760,cwd:a,signal:d}),f="";p&&(f+=p),u&&(f+=`
|
|
102
|
+
[stderr]
|
|
103
|
+
${u}`);let{text:m}=_r(f,{hint:"\uD544\uC694\uD55C \uBD80\uBD84\uB9CC \uBF51\uB3C4\uB85D grep/tail \uC744 \uBD99\uC5EC \uB2E4\uC2DC \uC2E4\uD589\uD560 \uAC83."});return{content:m||"Command completed with no output"}}catch(p){let u=p;if(d?.aborted)return{content:"",isError:!0,error:"Command aborted"};if(u.killed)return{content:"",isError:!0,error:`Command timed out after ${o}ms`};let f=u.message||"Unknown error";u.stdout&&(f+=`
|
|
104
|
+
[stdout]
|
|
105
|
+
${u.stdout}`),u.stderr&&(f+=`
|
|
106
|
+
[stderr]
|
|
107
|
+
${u.stderr}`);let{text:m}=_r(f,{hint:"\uD544\uC694\uD55C \uBD80\uBD84\uB9CC \uBF51\uB3C4\uB85D grep/tail \uC744 \uBD99\uC5EC \uB2E4\uC2DC \uC2E4\uD589\uD560 \uAC83."});return{content:m,isError:!0,error:u.message}}}}});var Yd,dr,ji,x,Tr=D(()=>{"use strict";Yd="en",dr=()=>Yd,ji=t=>{Yd=t},x=(t,e)=>Yd==="ko"?e:t});var Gw=dt((gj,qw)=>{"use strict";qw.exports=Bw;function Bw(t,e,r){t instanceof RegExp&&(t=Ww(t,r)),e instanceof RegExp&&(e=Ww(e,r));var n=Hw(t,e,r);return n&&{start:n[0],end:n[1],pre:r.slice(0,n[0]),body:r.slice(n[0]+t.length,n[1]),post:r.slice(n[1]+e.length)}}function Ww(t,e){var r=e.match(t);return r?r[0]:null}Bw.range=Hw;function Hw(t,e,r){var n,o,i,s,a,c=r.indexOf(t),l=r.indexOf(e,c+1),d=c;if(c>=0&&l>0){if(t===e)return[c,l];for(n=[],i=r.length;d>=0&&!a;)d==c?(n.push(d),c=r.indexOf(t,d+1)):n.length==1?a=[n.pop(),l]:(o=n.pop(),o<i&&(i=o,s=l),l=r.indexOf(e,d+1)),d=c<l&&c>=0?c:l;n.length&&(a=[i,s])}return a}});var Zw=dt((wj,Qw)=>{var Vw=Gw();Qw.exports=s_;var zw="\0SLASH"+Math.random()+"\0",Kw="\0OPEN"+Math.random()+"\0",Qd="\0CLOSE"+Math.random()+"\0",Jw="\0COMMA"+Math.random()+"\0",Yw="\0PERIOD"+Math.random()+"\0";function Xd(t){return parseInt(t,10)==t?parseInt(t,10):t.charCodeAt(0)}function o_(t){return t.split("\\\\").join(zw).split("\\{").join(Kw).split("\\}").join(Qd).split("\\,").join(Jw).split("\\.").join(Yw)}function i_(t){return t.split(zw).join("\\").split(Kw).join("{").split(Qd).join("}").split(Jw).join(",").split(Yw).join(".")}function Xw(t){if(!t)return[""];var e=[],r=Vw("{","}",t);if(!r)return t.split(",");var n=r.pre,o=r.body,i=r.post,s=n.split(",");s[s.length-1]+="{"+o+"}";var a=Xw(i);return i.length&&(s[s.length-1]+=a.shift(),s.push.apply(s,a)),e.push.apply(e,s),e}function s_(t){return t?(t.substr(0,2)==="{}"&&(t="\\{\\}"+t.substr(2)),Ui(o_(t),!0).map(i_)):[]}function a_(t){return"{"+t+"}"}function c_(t){return/^-?0\d/.test(t)}function l_(t,e){return t<=e}function u_(t,e){return t>=e}function Ui(t,e){var r=[],n=Vw("{","}",t);if(!n)return[t];var o=n.pre,i=n.post.length?Ui(n.post,!1):[""];if(/\$$/.test(n.pre))for(var s=0;s<i.length;s++){var a=o+"{"+n.body+"}"+i[s];r.push(a)}else{var c=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(n.body),l=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(n.body),d=c||l,p=n.body.indexOf(",")>=0;if(!d&&!p)return n.post.match(/,(?!,).*\}/)?(t=n.pre+"{"+n.body+Qd+n.post,Ui(t)):[t];var u;if(d)u=n.body.split(/\.\./);else if(u=Xw(n.body),u.length===1&&(u=Ui(u[0],!1).map(a_),u.length===1))return i.map(function(Y){return n.pre+u[0]+Y});var f;if(d){var m=Xd(u[0]),h=Xd(u[1]),w=Math.max(u[0].length,u[1].length),b=u.length==3?Math.max(Math.abs(Xd(u[2])),1):1,k=l_,v=h<m;v&&(b*=-1,k=u_);var C=u.some(c_);f=[];for(var I=m;k(I,h);I+=b){var N;if(l)N=String.fromCharCode(I),N==="\\"&&(N="");else if(N=String(I),C){var G=w-N.length;if(G>0){var $=new Array(G+1).join("0");I<0?N="-"+$+N.slice(1):N=$+N}}f.push(N)}}else{f=[];for(var j=0;j<u.length;j++)f.push.apply(f,Ui(u[j],!1))}for(var j=0;j<f.length;j++)for(var s=0;s<i.length;s++){var a=o+f[j]+i[s];(!e||d||a)&&r.push(a)}}return r}});var Wi,ey=D(()=>{Wi=t=>{if(typeof t!="string")throw new TypeError("invalid pattern");if(t.length>65536)throw new TypeError("pattern is too long")}});var d_,Bi,p_,ty,ry,ny=D(()=>{d_={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},Bi=t=>t.replace(/[[\]\\-]/g,"\\$&"),p_=t=>t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),ty=t=>t.join(""),ry=(t,e)=>{let r=e;if(t.charAt(r)!=="[")throw new Error("not in a brace expression");let n=[],o=[],i=r+1,s=!1,a=!1,c=!1,l=!1,d=r,p="";e:for(;i<t.length;){let h=t.charAt(i);if((h==="!"||h==="^")&&i===r+1){l=!0,i++;continue}if(h==="]"&&s&&!c){d=i+1;break}if(s=!0,h==="\\"&&!c){c=!0,i++;continue}if(h==="["&&!c){for(let[w,[b,k,v]]of Object.entries(d_))if(t.startsWith(w,i)){if(p)return["$.",!1,t.length-r,!0];i+=w.length,v?o.push(b):n.push(b),a=a||k;continue e}}if(c=!1,p){h>p?n.push(Bi(p)+"-"+Bi(h)):h===p&&n.push(Bi(h)),p="",i++;continue}if(t.startsWith("-]",i+1)){n.push(Bi(h+"-")),i+=2;continue}if(t.startsWith("-",i+1)){p=h,i+=2;continue}n.push(Bi(h)),i++}if(d<i)return["",!1,0,!1];if(!n.length&&!o.length)return["$.",!1,t.length-r,!0];if(o.length===0&&n.length===1&&/^\\?.$/.test(n[0])&&!l){let h=n[0].length===2?n[0].slice(-1):n[0];return[p_(h),!1,d-r,!1]}let u="["+(l?"^":"")+ty(n)+"]",f="["+(l?"":"^")+ty(o)+"]";return[n.length&&o.length?"("+u+"|"+f+")":n.length?u:f,a,d-r,!0]}});var Xt,Ha=D(()=>{Xt=(t,{windowsPathsNoEscape:e=!1}={})=>e?t.replace(/\[([^\/\\])\]/g,"$1"):t.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1")});var xt,f_,Zd,oy,h_,m_,g_,iy,w_,qa,y_,b_,v_,S_,ep,sy,ay,An,tp=D(()=>{ny();Ha();f_=new Set(["!","?","+","*","@"]),Zd=t=>f_.has(t),oy=t=>Zd(t.type),h_=new Map([["!",["@"]],["?",["?","@"]],["@",["@"]],["*",["*","+","?","@"]],["+",["+","@"]]]),m_=new Map([["!",["?"]],["@",["?"]],["+",["?","*"]]]),g_=new Map([["!",["?","@"]],["?",["?","@"]],["@",["?","@"]],["*",["*","+","?","@"]],["+",["+","@","?","*"]]]),iy=new Map([["!",new Map([["!","@"]])],["?",new Map([["*","*"],["+","*"]])],["@",new Map([["!","!"],["?","?"],["@","@"],["*","*"],["+","+"]])],["+",new Map([["?","*"],["*","*"]])]]),w_="(?!(?:^|/)\\.\\.?(?:$|/))",qa="(?!\\.)",y_=new Set(["[","."]),b_=new Set(["..","."]),v_=new Set("().*{}+?[]^$\\!"),S_=t=>t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),ep="[^/]",sy=ep+"*?",ay=ep+"+?",An=class{type;#e;#r;#o=!1;#t=[];#s;#S;#l;#d=!1;#c;#a;#i=!1;constructor(e,r,n={}){this.type=e,e&&(this.#r=!0),this.#s=r,this.#e=this.#s?this.#s.#e:this,this.#c=this.#e===this?n:this.#e.#c,this.#l=this.#e===this?[]:this.#e.#l,e==="!"&&!this.#e.#d&&this.#l.push(this),this.#S=this.#s?this.#s.#t.length:0}get hasMagic(){if(this.#r!==void 0)return this.#r;for(let e of this.#t)if(typeof e!="string"&&(e.type||e.hasMagic))return this.#r=!0;return this.#r}toString(){return this.#a!==void 0?this.#a:this.type?this.#a=this.type+"("+this.#t.map(e=>String(e)).join("|")+")":this.#a=this.#t.map(e=>String(e)).join("")}#w(){if(this!==this.#e)throw new Error("should only call on root");if(this.#d)return this;this.toString(),this.#d=!0;let e;for(;e=this.#l.pop();){if(e.type!=="!")continue;let r=e,n=r.#s;for(;n;){for(let o=r.#S+1;!n.type&&o<n.#t.length;o++)for(let i of e.#t){if(typeof i=="string")throw new Error("string part in extglob AST??");i.copyIn(n.#t[o])}r=n,n=r.#s}}return this}push(...e){for(let r of e)if(r!==""){if(typeof r!="string"&&!(r instanceof xt&&r.#s===this))throw new Error("invalid part: "+r);this.#t.push(r)}}toJSON(){let e=this.type===null?this.#t.slice().map(r=>typeof r=="string"?r:r.toJSON()):[this.type,...this.#t.map(r=>r.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#e||this.#e.#d&&this.#s?.type==="!")&&e.push({}),e}isStart(){if(this.#e===this)return!0;if(!this.#s?.isStart())return!1;if(this.#S===0)return!0;let e=this.#s;for(let r=0;r<this.#S;r++){let n=e.#t[r];if(!(n instanceof xt&&n.type==="!"))return!1}return!0}isEnd(){if(this.#e===this||this.#s?.type==="!")return!0;if(!this.#s?.isEnd())return!1;if(!this.type)return this.#s?.isEnd();let e=this.#s?this.#s.#t.length:0;return this.#S===e-1}copyIn(e){typeof e=="string"?this.push(e):this.push(e.clone(this))}clone(e){let r=new xt(this.type,e);for(let n of this.#t)r.copyIn(n);return r}static#y(e,r,n,o,i){let s=o.maxExtglobRecursion??2,a=!1,c=!1,l=-1,d=!1;if(r.type===null){let h=n,w="";for(;h<e.length;){let b=e.charAt(h++);if(a||b==="\\"){a=!a,w+=b;continue}if(c){h===l+1?(b==="^"||b==="!")&&(d=!0):b==="]"&&!(h===l+2&&d)&&(c=!1),w+=b;continue}else if(b==="["){c=!0,l=h,d=!1,w+=b;continue}if(!o.noext&&Zd(b)&&e.charAt(h)==="("&&i<=s){r.push(w),w="";let v=new xt(b,r);h=xt.#y(e,v,h,o,i+1),r.push(v);continue}w+=b}return r.push(w),h}let p=n+1,u=new xt(null,r),f=[],m="";for(;p<e.length;){let h=e.charAt(p++);if(a||h==="\\"){a=!a,m+=h;continue}if(c){p===l+1?(h==="^"||h==="!")&&(d=!0):h==="]"&&!(p===l+2&&d)&&(c=!1),m+=h;continue}else if(h==="["){c=!0,l=p,d=!1,m+=h;continue}if(Zd(h)&&e.charAt(p)==="("&&(i<=s||r&&r.#x(h))){let b=r&&r.#x(h)?0:1;u.push(m),m="";let k=new xt(h,u);u.push(k),p=xt.#y(e,k,p,o,i+b);continue}if(h==="|"){u.push(m),m="",f.push(u),u=new xt(null,r);continue}if(h===")")return m===""&&r.#t.length===0&&(r.#i=!0),u.push(m),m="",r.push(...f,u),p;m+=h}return r.type=null,r.#r=void 0,r.#t=[e.substring(n-1)],p}#m(e){return this.#f(e,m_)}#f(e,r=h_){if(!e||typeof e!="object"||e.type!==null||e.#t.length!==1||this.type===null)return!1;let n=e.#t[0];return!n||typeof n!="object"||n.type===null?!1:this.#x(n.type,r)}#x(e,r=g_){return!!r.get(this.type)?.includes(e)}#h(e,r){let n=e.#t[0],o=new xt(null,n,this.options);o.#t.push(""),n.push(o),this.#E(e,r)}#E(e,r){let n=e.#t[0];this.#t.splice(r,1,...n.#t);for(let o of n.#t)typeof o=="object"&&(o.#s=this);this.#a=void 0}#P(e){return!!iy.get(this.type)?.has(e)}#g(e){if(!e||typeof e!="object"||e.type!==null||e.#t.length!==1||this.type===null||this.#t.length!==1)return!1;let r=e.#t[0];return!r||typeof r!="object"||r.type===null?!1:this.#P(r.type)}#k(e){let r=iy.get(this.type),n=e.#t[0],o=r?.get(n.type);if(!o)return!1;this.#t=n.#t;for(let i of this.#t)typeof i=="object"&&(i.#s=this);this.type=o,this.#a=void 0,this.#i=!1}#b(){if(oy(this)){let e=0,r=!1;do{r=!0;for(let n=0;n<this.#t.length;n++){let o=this.#t[n];typeof o=="object"&&(o.#b(),this.#f(o)?(r=!1,this.#E(o,n)):this.#m(o)?(r=!1,this.#h(o,n)):this.#g(o)&&(r=!1,this.#k(o)))}}while(!r&&++e<10)}else for(let e of this.#t)typeof e=="object"&&e.#b();this.#a=void 0}static fromGlob(e,r={}){let n=new xt(null,void 0,r);return xt.#y(e,n,0,r,0),n}toMMPattern(){if(this!==this.#e)return this.#e.toMMPattern();let e=this.toString(),[r,n,o,i]=this.toRegExpSource();if(!(o||this.#r||this.#c.nocase&&!this.#c.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return n;let a=(this.#c.nocase?"i":"")+(i?"u":"");return Object.assign(new RegExp(`^${r}$`,a),{_src:r,_glob:e})}get options(){return this.#c}toRegExpSource(e){let r=e??!!this.#c.dot;if(this.#e===this&&(this.#b(),this.#w()),!oy(this)){let c=this.isStart()&&this.isEnd(),l=this.#t.map(f=>{let[m,h,w,b]=typeof f=="string"?xt.#A(f,this.#r,c):f.toRegExpSource(e);return this.#r=this.#r||w,this.#o=this.#o||b,m}).join(""),d="";if(this.isStart()&&typeof this.#t[0]=="string"&&!(this.#t.length===1&&b_.has(this.#t[0]))){let m=y_,h=r&&m.has(l.charAt(0))||l.startsWith("\\.")&&m.has(l.charAt(2))||l.startsWith("\\.\\.")&&m.has(l.charAt(4)),w=!r&&!e&&m.has(l.charAt(0));d=h?w_:w?qa:""}let p="";return this.isEnd()&&this.#e.#d&&this.#s?.type==="!"&&(p="(?:$|\\/)"),[d+l+p,Xt(l),this.#r=!!this.#r,this.#o]}let n=this.type==="*"||this.type==="+",o=this.type==="!"?"(?:(?!(?:":"(?:",i=this.#p(r);if(this.isStart()&&this.isEnd()&&!i&&this.type!=="!"){let c=this.toString(),l=this;return l.#t=[c],l.type=null,l.#r=void 0,[c,Xt(this.toString()),!1,!1]}let s=!n||e||r||!qa?"":this.#p(!0);s===i&&(s=""),s&&(i=`(?:${i})(?:${s})*?`);let a="";if(this.type==="!"&&this.#i)a=(this.isStart()&&!r?qa:"")+ay;else{let c=this.type==="!"?"))"+(this.isStart()&&!r&&!e?qa:"")+sy+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&s?")":this.type==="*"&&s?")?":`)${this.type}`;a=o+i+c}return[a,Xt(i),this.#r=!!this.#r,this.#o]}#p(e){return this.#t.map(r=>{if(typeof r=="string")throw new Error("string type in extglob ast??");let[n,o,i,s]=r.toRegExpSource(e);return this.#o=this.#o||s,n}).filter(r=>!(this.isStart()&&this.isEnd())||!!r).join("|")}static#A(e,r,n=!1){let o=!1,i="",s=!1,a=!1;for(let c=0;c<e.length;c++){let l=e.charAt(c);if(o){o=!1,i+=(v_.has(l)?"\\":"")+l,a=!1;continue}if(l==="\\"){c===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[d,p,u,f]=ry(e,c);if(u){i+=d,s=s||p,c+=u-1,r=r||f,a=!1;continue}}if(l==="*"){if(a)continue;a=!0,i+=n&&/^[*]+$/.test(e)?ay:sy,r=!0;continue}else a=!1;if(l==="?"){i+=ep,r=!0;continue}i+=S_(l)}return[i,Xt(e),!!r,s]}};xt=An});var yo,rp=D(()=>{yo=(t,{windowsPathsNoEscape:e=!1}={})=>e?t.replace(/[?*()[\]]/g,"[$&]"):t.replace(/[?*()[\]\\]/g,"\\$&")});var uy,gt,x_,k_,E_,P_,A_,C_,__,T_,R_,I_,$_,O_,M_,D_,N_,L_,F_,j_,dy,py,fy,cy,U_,je,W_,B_,H_,q_,G_,Wt,V_,hy,z_,K_,ly,J_,Rt,Jr=D(()=>{uy=Pu(Zw(),1);ey();tp();rp();Ha();tp();rp();Ha();gt=(t,e,r={})=>(Wi(e),!r.nocomment&&e.charAt(0)==="#"?!1:new Rt(e,r).match(t)),x_=/^\*+([^+@!?\*\[\(]*)$/,k_=t=>e=>!e.startsWith(".")&&e.endsWith(t),E_=t=>e=>e.endsWith(t),P_=t=>(t=t.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(t)),A_=t=>(t=t.toLowerCase(),e=>e.toLowerCase().endsWith(t)),C_=/^\*+\.\*+$/,__=t=>!t.startsWith(".")&&t.includes("."),T_=t=>t!=="."&&t!==".."&&t.includes("."),R_=/^\.\*+$/,I_=t=>t!=="."&&t!==".."&&t.startsWith("."),$_=/^\*+$/,O_=t=>t.length!==0&&!t.startsWith("."),M_=t=>t.length!==0&&t!=="."&&t!=="..",D_=/^\?+([^+@!?\*\[\(]*)?$/,N_=([t,e=""])=>{let r=dy([t]);return e?(e=e.toLowerCase(),n=>r(n)&&n.toLowerCase().endsWith(e)):r},L_=([t,e=""])=>{let r=py([t]);return e?(e=e.toLowerCase(),n=>r(n)&&n.toLowerCase().endsWith(e)):r},F_=([t,e=""])=>{let r=py([t]);return e?n=>r(n)&&n.endsWith(e):r},j_=([t,e=""])=>{let r=dy([t]);return e?n=>r(n)&&n.endsWith(e):r},dy=([t])=>{let e=t.length;return r=>r.length===e&&!r.startsWith(".")},py=([t])=>{let e=t.length;return r=>r.length===e&&r!=="."&&r!==".."},fy=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",cy={win32:{sep:"\\"},posix:{sep:"/"}},U_=fy==="win32"?cy.win32.sep:cy.posix.sep;gt.sep=U_;je=Symbol("globstar **");gt.GLOBSTAR=je;W_="[^/]",B_=W_+"*?",H_="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",q_="(?:(?!(?:\\/|^)\\.).)*?",G_=(t,e={})=>r=>gt(r,t,e);gt.filter=G_;Wt=(t,e={})=>Object.assign({},t,e),V_=t=>{if(!t||typeof t!="object"||!Object.keys(t).length)return gt;let e=gt;return Object.assign((n,o,i={})=>e(n,o,Wt(t,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,Wt(t,i))}static defaults(o){return e.defaults(Wt(t,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,s={}){super(o,i,Wt(t,s))}static fromGlob(o,i={}){return e.AST.fromGlob(o,Wt(t,i))}},unescape:(n,o={})=>e.unescape(n,Wt(t,o)),escape:(n,o={})=>e.escape(n,Wt(t,o)),filter:(n,o={})=>e.filter(n,Wt(t,o)),defaults:n=>e.defaults(Wt(t,n)),makeRe:(n,o={})=>e.makeRe(n,Wt(t,o)),braceExpand:(n,o={})=>e.braceExpand(n,Wt(t,o)),match:(n,o,i={})=>e.match(n,o,Wt(t,i)),sep:e.sep,GLOBSTAR:je})};gt.defaults=V_;hy=(t,e={})=>(Wi(t),e.nobrace||!/\{(?:(?!\{).)*\}/.test(t)?[t]:(0,uy.default)(t));gt.braceExpand=hy;z_=(t,e={})=>new Rt(t,e).makeRe();gt.makeRe=z_;K_=(t,e,r={})=>{let n=new Rt(e,r);return t=t.filter(o=>n.match(o)),n.options.nonull&&!t.length&&t.push(e),t};gt.match=K_;ly=/[?*]|[+@!]\(.*?\)|\[|\]/,J_=t=>t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Rt=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;maxGlobstarRecursion;regexp;constructor(e,r={}){Wi(e),r=r||{},this.options=r,this.maxGlobstarRecursion=r.maxGlobstarRecursion??200,this.pattern=e,this.platform=r.platform||fy,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!r.windowsPathsNoEscape||r.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!r.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!r.nonegate,this.comment=!1,this.empty=!1,this.partial=!!r.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=r.windowsNoMagicRoot!==void 0?r.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let r of e)if(typeof r!="string")return!0;return!1}debug(...e){}make(){let e=this.pattern,r=this.options;if(!r.nocomment&&e.charAt(0)==="#"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],r.debug&&(this.debug=(...i)=>console.error(...i)),this.debug(this.pattern,this.globSet);let n=this.globSet.map(i=>this.slashSplit(i));this.globParts=this.preprocess(n),this.debug(this.pattern,this.globParts);let o=this.globParts.map((i,s,a)=>{if(this.isWindows&&this.windowsNoMagicRoot){let c=i[0]===""&&i[1]===""&&(i[2]==="?"||!ly.test(i[2]))&&!ly.test(i[3]),l=/^[a-z]:/i.test(i[0]);if(c)return[...i.slice(0,4),...i.slice(4).map(d=>this.parse(d))];if(l)return[i[0],...i.slice(1).map(d=>this.parse(d))]}return i.map(c=>this.parse(c))});if(this.debug(this.pattern,o),this.set=o.filter(i=>i.indexOf(!1)===-1),this.isWindows)for(let i=0;i<this.set.length;i++){let s=this.set[i];s[0]===""&&s[1]===""&&this.globParts[i][2]==="?"&&typeof s[3]=="string"&&/^[a-z]:$/i.test(s[3])&&(s[2]="?")}this.debug(this.pattern,this.set)}preprocess(e){if(this.options.noglobstar)for(let n=0;n<e.length;n++)for(let o=0;o<e[n].length;o++)e[n][o]==="**"&&(e[n][o]="*");let{optimizationLevel:r=1}=this.options;return r>=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):r>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(r=>{let n=-1;for(;(n=r.indexOf("**",n+1))!==-1;){let o=n;for(;r[o+1]==="**";)o++;o!==n&&r.splice(n,o-n)}return r})}levelOneOptimize(e){return e.map(r=>(r=r.reduce((n,o)=>{let i=n[n.length-1];return o==="**"&&i==="**"?n:o===".."&&i&&i!==".."&&i!=="."&&i!=="**"?(n.pop(),n):(n.push(o),n)},[]),r.length===0?[""]:r))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let r=!1;do{if(r=!1,!this.preserveMultipleSlashes){for(let o=1;o<e.length-1;o++){let i=e[o];o===1&&i===""&&e[0]===""||(i==="."||i==="")&&(r=!0,e.splice(o,1),o--)}e[0]==="."&&e.length===2&&(e[1]==="."||e[1]==="")&&(r=!0,e.pop())}let n=0;for(;(n=e.indexOf("..",n+1))!==-1;){let o=e[n-1];o&&o!=="."&&o!==".."&&o!=="**"&&(r=!0,e.splice(n-1,2),n-=2)}}while(r);return e.length===0?[""]:e}firstPhasePreProcess(e){let r=!1;do{r=!1;for(let n of e){let o=-1;for(;(o=n.indexOf("**",o+1))!==-1;){let s=o;for(;n[s+1]==="**";)s++;s>o&&n.splice(o+1,s-o);let a=n[o+1],c=n[o+2],l=n[o+3];if(a!==".."||!c||c==="."||c===".."||!l||l==="."||l==="..")continue;r=!0,n.splice(o,1);let d=n.slice(0);d[o]="**",e.push(d),o--}if(!this.preserveMultipleSlashes){for(let s=1;s<n.length-1;s++){let a=n[s];s===1&&a===""&&n[0]===""||(a==="."||a==="")&&(r=!0,n.splice(s,1),s--)}n[0]==="."&&n.length===2&&(n[1]==="."||n[1]==="")&&(r=!0,n.pop())}let i=0;for(;(i=n.indexOf("..",i+1))!==-1;){let s=n[i-1];if(s&&s!=="."&&s!==".."&&s!=="**"){r=!0;let c=i===1&&n[i+1]==="**"?["."]:[];n.splice(i-1,2,...c),n.length===0&&n.push(""),i-=2}}}}while(r);return e}secondPhasePreProcess(e){for(let r=0;r<e.length-1;r++)for(let n=r+1;n<e.length;n++){let o=this.partsMatch(e[r],e[n],!this.preserveMultipleSlashes);if(o){e[r]=[],e[n]=o;break}}return e.filter(r=>r.length)}partsMatch(e,r,n=!1){let o=0,i=0,s=[],a="";for(;o<e.length&&i<r.length;)if(e[o]===r[i])s.push(a==="b"?r[i]:e[o]),o++,i++;else if(n&&e[o]==="**"&&r[i]===e[o+1])s.push(e[o]),o++;else if(n&&r[i]==="**"&&e[o]===r[i+1])s.push(r[i]),i++;else if(e[o]==="*"&&r[i]&&(this.options.dot||!r[i].startsWith("."))&&r[i]!=="**"){if(a==="b")return!1;a="a",s.push(e[o]),o++,i++}else if(r[i]==="*"&&e[o]&&(this.options.dot||!e[o].startsWith("."))&&e[o]!=="**"){if(a==="a")return!1;a="b",s.push(r[i]),o++,i++}else return!1;return e.length===r.length&&s}parseNegate(){if(this.nonegate)return;let e=this.pattern,r=!1,n=0;for(let o=0;o<e.length&&e.charAt(o)==="!";o++)r=!r,n++;n&&(this.pattern=e.slice(n)),this.negate=r}matchOne(e,r,n=!1){let o=0,i=0;if(this.isWindows){let a=typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0]),c=!a&&e[0]===""&&e[1]===""&&e[2]==="?"&&/^[a-z]:$/i.test(e[3]),l=typeof r[0]=="string"&&/^[a-z]:$/i.test(r[0]),d=!l&&r[0]===""&&r[1]===""&&r[2]==="?"&&typeof r[3]=="string"&&/^[a-z]:$/i.test(r[3]),p=c?3:a?0:void 0,u=d?3:l?0:void 0;if(typeof p=="number"&&typeof u=="number"){let[f,m]=[e[p],r[u]];f.toLowerCase()===m.toLowerCase()&&(r[u]=f,i=u,o=p)}}let{optimizationLevel:s=1}=this.options;return s>=2&&(e=this.levelTwoFileOptimize(e)),r.includes(je)?this.#e(e,r,n,o,i):this.#o(e,r,n,o,i)}#e(e,r,n,o,i){let s=r.indexOf(je,i),a=r.lastIndexOf(je),[c,l,d]=n?[r.slice(i,s),r.slice(s+1),[]]:[r.slice(i,s),r.slice(s+1,a),r.slice(a+1)];if(c.length){let k=e.slice(o,o+c.length);if(!this.#o(k,c,n,0,0))return!1;o+=c.length}let p=0;if(d.length){if(d.length+o>e.length)return!1;let k=e.length-d.length;if(this.#o(e,d,n,k,0))p=d.length;else{if(e[e.length-1]!==""||o+d.length===e.length||(k--,!this.#o(e,d,n,k,0)))return!1;p=d.length+1}}if(!l.length){let k=!!p;for(let v=o;v<e.length-p;v++){let C=String(e[v]);if(k=!0,C==="."||C===".."||!this.options.dot&&C.startsWith("."))return!1}return n||k}let u=[[[],0]],f=u[0],m=0,h=[0];for(let k of l)k===je?(h.push(m),f=[[],0],u.push(f)):(f[0].push(k),m++);let w=u.length-1,b=e.length-p;for(let k of u)k[1]=b-(h[w--]+k[0].length);return!!this.#r(e,u,o,0,n,0,!!p)}#r(e,r,n,o,i,s,a){let c=r[o];if(!c){for(let p=n;p<e.length;p++){a=!0;let u=e[p];if(u==="."||u===".."||!this.options.dot&&u.startsWith("."))return!1}return a}let[l,d]=c;for(;n<=d;){if(this.#o(e.slice(0,n+l.length),l,i,n,0)&&s<this.maxGlobstarRecursion){let f=this.#r(e,r,n+l.length,o+1,i,s+1,a);if(f!==!1)return f}let u=e[n];if(u==="."||u===".."||!this.options.dot&&u.startsWith("."))return!1;n++}return i||null}#o(e,r,n,o,i){let s,a,c,l;for(s=o,a=i,l=e.length,c=r.length;s<l&&a<c;s++,a++){this.debug("matchOne loop");let d=r[a],p=e[s];if(this.debug(r,d,p),d===!1||d===je)return!1;let u;if(typeof d=="string"?(u=p===d,this.debug("string match",d,p,u)):(u=d.test(p),this.debug("pattern match",d,p,u)),!u)return!1}if(s===l&&a===c)return!0;if(s===l)return n;if(a===c)return s===l-1&&e[s]==="";throw new Error("wtf?")}braceExpand(){return hy(this.pattern,this.options)}parse(e){Wi(e);let r=this.options;if(e==="**")return je;if(e==="")return"";let n,o=null;(n=e.match($_))?o=r.dot?M_:O_:(n=e.match(x_))?o=(r.nocase?r.dot?A_:P_:r.dot?E_:k_)(n[1]):(n=e.match(D_))?o=(r.nocase?r.dot?L_:N_:r.dot?F_:j_)(n):(n=e.match(C_))?o=r.dot?T_:__:(n=e.match(R_))&&(o=I_);let i=An.fromGlob(e,this.options).toMMPattern();return o&&typeof i=="object"&&Reflect.defineProperty(i,"test",{value:o}),i}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let r=this.options,n=r.noglobstar?B_:r.dot?H_:q_,o=new Set(r.nocase?["i"]:[]),i=e.map(c=>{let l=c.map(d=>{if(d instanceof RegExp)for(let p of d.flags.split(""))o.add(p);return typeof d=="string"?J_(d):d===je?je:d._src});return l.forEach((d,p)=>{let u=l[p+1],f=l[p-1];d!==je||f===je||(f===void 0?u!==void 0&&u!==je?l[p+1]="(?:\\/|"+n+"\\/)?"+u:l[p]=n:u===void 0?l[p-1]=f+"(?:\\/|"+n+")?":u!==je&&(l[p-1]=f+"(?:\\/|\\/"+n+"\\/)"+u,l[p+1]=je))}),l.filter(d=>d!==je).join("/")}).join("|"),[s,a]=e.length>1?["(?:",")"]:["",""];i="^"+s+i+a+"$",this.negate&&(i="^(?!"+i+").+$");try{this.regexp=new RegExp(i,[...o].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,r=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&r)return!0;let n=this.options;this.isWindows&&(e=e.split("\\").join("/"));let o=this.slashSplit(e);this.debug(this.pattern,"split",o);let i=this.set;this.debug(this.pattern,"set",i);let s=o[o.length-1];if(!s)for(let a=o.length-2;!s&&a>=0;a--)s=o[a];for(let a=0;a<i.length;a++){let c=i[a],l=o;if(n.matchBase&&c.length===1&&(l=[s]),this.matchOne(l,c,r))return n.flipNegate?!0:!this.negate}return n.flipNegate?!1:this.negate}static defaults(e){return gt.defaults(e).Minimatch}};gt.AST=An;gt.Minimatch=Rt;gt.escape=yo;gt.unescape=Xt});var bo,gy,np,wy,Ga,my,Y_,Lj,Yr,yy,vo,op,Hi,by=D(()=>{bo=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,gy=new Set,np=typeof process=="object"&&process?process:{},wy=(t,e,r,n)=>{typeof np.emitWarning=="function"?np.emitWarning(t,e,r,n):console.error(`[${r}] ${e}: ${t}`)},Ga=globalThis.AbortController,my=globalThis.AbortSignal;if(typeof Ga>"u"){my=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(n,o){this._onabort.push(o)}},Ga=class{constructor(){e()}signal=new my;abort(n){if(!this.signal.aborted){this.signal.reason=n,this.signal.aborted=!0;for(let o of this.signal._onabort)o(n);this.signal.onabort?.(n)}}};let t=np.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{t&&(t=!1,wy("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e))}}Y_=t=>!gy.has(t),Lj=Symbol("type"),Yr=t=>t&&t===Math.floor(t)&&t>0&&isFinite(t),yy=t=>Yr(t)?t<=Math.pow(2,8)?Uint8Array:t<=Math.pow(2,16)?Uint16Array:t<=Math.pow(2,32)?Uint32Array:t<=Number.MAX_SAFE_INTEGER?vo:null:null,vo=class extends Array{constructor(e){super(e),this.fill(0)}},op=class t{heap;length;static#e=!1;static create(e){let r=yy(e);if(!r)return[];t.#e=!0;let n=new t(e,r);return t.#e=!1,n}constructor(e,r){if(!t.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new r(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},Hi=class t{#e;#r;#o;#t;#s;#S;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#l;#d;#c;#a;#i;#w;#y;#m;#f;#x;#h;#E;#P;#g;#k;#b;#p;static unsafeExposeInternals(e){return{starts:e.#P,ttls:e.#g,sizes:e.#E,keyMap:e.#c,keyList:e.#a,valList:e.#i,next:e.#w,prev:e.#y,get head(){return e.#m},get tail(){return e.#f},free:e.#x,isBackgroundFetch:r=>e.#u(r),backgroundFetch:(r,n,o,i)=>e.#F(r,n,o,i),moveToTail:r=>e.#U(r),indexes:r=>e.#_(r),rindexes:r=>e.#T(r),isStale:r=>e.#v(r)}}get max(){return this.#e}get maxSize(){return this.#r}get calculatedSize(){return this.#d}get size(){return this.#l}get fetchMethod(){return this.#s}get memoMethod(){return this.#S}get dispose(){return this.#o}get disposeAfter(){return this.#t}constructor(e){let{max:r=0,ttl:n,ttlResolution:o=1,ttlAutopurge:i,updateAgeOnGet:s,updateAgeOnHas:a,allowStale:c,dispose:l,disposeAfter:d,noDisposeOnSet:p,noUpdateTTL:u,maxSize:f=0,maxEntrySize:m=0,sizeCalculation:h,fetchMethod:w,memoMethod:b,noDeleteOnFetchRejection:k,noDeleteOnStaleGet:v,allowStaleOnFetchRejection:C,allowStaleOnFetchAbort:I,ignoreFetchAbort:N}=e;if(r!==0&&!Yr(r))throw new TypeError("max option must be a nonnegative integer");let G=r?yy(r):Array;if(!G)throw new Error("invalid max value: "+r);if(this.#e=r,this.#r=f,this.maxEntrySize=m||this.#r,this.sizeCalculation=h,this.sizeCalculation){if(!this.#r&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(b!==void 0&&typeof b!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#S=b,w!==void 0&&typeof w!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#s=w,this.#b=!!w,this.#c=new Map,this.#a=new Array(r).fill(void 0),this.#i=new Array(r).fill(void 0),this.#w=new G(r),this.#y=new G(r),this.#m=0,this.#f=0,this.#x=op.create(r),this.#l=0,this.#d=0,typeof l=="function"&&(this.#o=l),typeof d=="function"?(this.#t=d,this.#h=[]):(this.#t=void 0,this.#h=void 0),this.#k=!!this.#o,this.#p=!!this.#t,this.noDisposeOnSet=!!p,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!k,this.allowStaleOnFetchRejection=!!C,this.allowStaleOnFetchAbort=!!I,this.ignoreFetchAbort=!!N,this.maxEntrySize!==0){if(this.#r!==0&&!Yr(this.#r))throw new TypeError("maxSize must be a positive integer if specified");if(!Yr(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#R()}if(this.allowStale=!!c,this.noDeleteOnStaleGet=!!v,this.updateAgeOnGet=!!s,this.updateAgeOnHas=!!a,this.ttlResolution=Yr(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=n||0,this.ttl){if(!Yr(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#A()}if(this.#e===0&&this.ttl===0&&this.#r===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#e&&!this.#r){let $="LRU_CACHE_UNBOUNDED";Y_($)&&(gy.add($),wy("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",$,t))}}getRemainingTTL(e){return this.#c.has(e)?1/0:0}#A(){let e=new vo(this.#e),r=new vo(this.#e);this.#g=e,this.#P=r,this.#$=(i,s,a=bo.now())=>{if(r[i]=s!==0?a:0,e[i]=s,s!==0&&this.ttlAutopurge){let c=setTimeout(()=>{this.#v(i)&&this.#I(this.#a[i],"expire")},s+1);c.unref&&c.unref()}},this.#C=i=>{r[i]=e[i]!==0?bo.now():0},this.#n=(i,s)=>{if(e[s]){let a=e[s],c=r[s];if(!a||!c)return;i.ttl=a,i.start=c,i.now=n||o();let l=i.now-c;i.remainingTTL=a-l}};let n=0,o=()=>{let i=bo.now();if(this.ttlResolution>0){n=i;let s=setTimeout(()=>n=0,this.ttlResolution);s.unref&&s.unref()}return i};this.getRemainingTTL=i=>{let s=this.#c.get(i);if(s===void 0)return 0;let a=e[s],c=r[s];if(!a||!c)return 1/0;let l=(n||o())-c;return a-l},this.#v=i=>{let s=r[i],a=e[i];return!!a&&!!s&&(n||o())-s>a}}#C=()=>{};#n=()=>{};#$=()=>{};#v=()=>!1;#R(){let e=new vo(this.#e);this.#d=0,this.#E=e,this.#O=r=>{this.#d-=e[r],e[r]=0},this.#D=(r,n,o,i)=>{if(this.#u(n))return 0;if(!Yr(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(n,r),!Yr(o))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return o},this.#M=(r,n,o)=>{if(e[r]=n,this.#r){let i=this.#r-e[r];for(;this.#d>i;)this.#L(!0)}this.#d+=e[r],o&&(o.entrySize=n,o.totalCalculatedSize=this.#d)}}#O=e=>{};#M=(e,r,n)=>{};#D=(e,r,n,o)=>{if(n||o)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#_({allowStale:e=this.allowStale}={}){if(this.#l)for(let r=this.#f;!(!this.#N(r)||((e||!this.#v(r))&&(yield r),r===this.#m));)r=this.#y[r]}*#T({allowStale:e=this.allowStale}={}){if(this.#l)for(let r=this.#m;!(!this.#N(r)||((e||!this.#v(r))&&(yield r),r===this.#f));)r=this.#w[r]}#N(e){return e!==void 0&&this.#c.get(this.#a[e])===e}*entries(){for(let e of this.#_())this.#i[e]!==void 0&&this.#a[e]!==void 0&&!this.#u(this.#i[e])&&(yield[this.#a[e],this.#i[e]])}*rentries(){for(let e of this.#T())this.#i[e]!==void 0&&this.#a[e]!==void 0&&!this.#u(this.#i[e])&&(yield[this.#a[e],this.#i[e]])}*keys(){for(let e of this.#_()){let r=this.#a[e];r!==void 0&&!this.#u(this.#i[e])&&(yield r)}}*rkeys(){for(let e of this.#T()){let r=this.#a[e];r!==void 0&&!this.#u(this.#i[e])&&(yield r)}}*values(){for(let e of this.#_())this.#i[e]!==void 0&&!this.#u(this.#i[e])&&(yield this.#i[e])}*rvalues(){for(let e of this.#T())this.#i[e]!==void 0&&!this.#u(this.#i[e])&&(yield this.#i[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,r={}){for(let n of this.#_()){let o=this.#i[n],i=this.#u(o)?o.__staleWhileFetching:o;if(i!==void 0&&e(i,this.#a[n],this))return this.get(this.#a[n],r)}}forEach(e,r=this){for(let n of this.#_()){let o=this.#i[n],i=this.#u(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(r,i,this.#a[n],this)}}rforEach(e,r=this){for(let n of this.#T()){let o=this.#i[n],i=this.#u(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(r,i,this.#a[n],this)}}purgeStale(){let e=!1;for(let r of this.#T({allowStale:!0}))this.#v(r)&&(this.#I(this.#a[r],"expire"),e=!0);return e}info(e){let r=this.#c.get(e);if(r===void 0)return;let n=this.#i[r],o=this.#u(n)?n.__staleWhileFetching:n;if(o===void 0)return;let i={value:o};if(this.#g&&this.#P){let s=this.#g[r],a=this.#P[r];if(s&&a){let c=s-(bo.now()-a);i.ttl=c,i.start=Date.now()}}return this.#E&&(i.size=this.#E[r]),i}dump(){let e=[];for(let r of this.#_({allowStale:!0})){let n=this.#a[r],o=this.#i[r],i=this.#u(o)?o.__staleWhileFetching:o;if(i===void 0||n===void 0)continue;let s={value:i};if(this.#g&&this.#P){s.ttl=this.#g[r];let a=bo.now()-this.#P[r];s.start=Math.floor(Date.now()-a)}this.#E&&(s.size=this.#E[r]),e.unshift([n,s])}return e}load(e){this.clear();for(let[r,n]of e){if(n.start){let o=Date.now()-n.start;n.start=bo.now()-o}this.set(r,n.value,n)}}set(e,r,n={}){if(r===void 0)return this.delete(e),this;let{ttl:o=this.ttl,start:i,noDisposeOnSet:s=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:c}=n,{noUpdateTTL:l=this.noUpdateTTL}=n,d=this.#D(e,r,n.size||0,a);if(this.maxEntrySize&&d>this.maxEntrySize)return c&&(c.set="miss",c.maxEntrySizeExceeded=!0),this.#I(e,"set"),this;let p=this.#l===0?void 0:this.#c.get(e);if(p===void 0)p=this.#l===0?this.#f:this.#x.length!==0?this.#x.pop():this.#l===this.#e?this.#L(!1):this.#l,this.#a[p]=e,this.#i[p]=r,this.#c.set(e,p),this.#w[this.#f]=p,this.#y[p]=this.#f,this.#f=p,this.#l++,this.#M(p,d,c),c&&(c.set="add"),l=!1;else{this.#U(p);let u=this.#i[p];if(r!==u){if(this.#b&&this.#u(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:f}=u;f!==void 0&&!s&&(this.#k&&this.#o?.(f,e,"set"),this.#p&&this.#h?.push([f,e,"set"]))}else s||(this.#k&&this.#o?.(u,e,"set"),this.#p&&this.#h?.push([u,e,"set"]));if(this.#O(p),this.#M(p,d,c),this.#i[p]=r,c){c.set="replace";let f=u&&this.#u(u)?u.__staleWhileFetching:u;f!==void 0&&(c.oldValue=f)}}else c&&(c.set="update")}if(o!==0&&!this.#g&&this.#A(),this.#g&&(l||this.#$(p,o,i),c&&this.#n(c,p)),!s&&this.#p&&this.#h){let u=this.#h,f;for(;f=u?.shift();)this.#t?.(...f)}return this}pop(){try{for(;this.#l;){let e=this.#i[this.#m];if(this.#L(!0),this.#u(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#p&&this.#h){let e=this.#h,r;for(;r=e?.shift();)this.#t?.(...r)}}}#L(e){let r=this.#m,n=this.#a[r],o=this.#i[r];return this.#b&&this.#u(o)?o.__abortController.abort(new Error("evicted")):(this.#k||this.#p)&&(this.#k&&this.#o?.(o,n,"evict"),this.#p&&this.#h?.push([o,n,"evict"])),this.#O(r),e&&(this.#a[r]=void 0,this.#i[r]=void 0,this.#x.push(r)),this.#l===1?(this.#m=this.#f=0,this.#x.length=0):this.#m=this.#w[r],this.#c.delete(n),this.#l--,r}has(e,r={}){let{updateAgeOnHas:n=this.updateAgeOnHas,status:o}=r,i=this.#c.get(e);if(i!==void 0){let s=this.#i[i];if(this.#u(s)&&s.__staleWhileFetching===void 0)return!1;if(this.#v(i))o&&(o.has="stale",this.#n(o,i));else return n&&this.#C(i),o&&(o.has="hit",this.#n(o,i)),!0}else o&&(o.has="miss");return!1}peek(e,r={}){let{allowStale:n=this.allowStale}=r,o=this.#c.get(e);if(o===void 0||!n&&this.#v(o))return;let i=this.#i[o];return this.#u(i)?i.__staleWhileFetching:i}#F(e,r,n,o){let i=r===void 0?void 0:this.#i[r];if(this.#u(i))return i;let s=new Ga,{signal:a}=n;a?.addEventListener("abort",()=>s.abort(a.reason),{signal:s.signal});let c={signal:s.signal,options:n,context:o},l=(h,w=!1)=>{let{aborted:b}=s.signal,k=n.ignoreFetchAbort&&h!==void 0;if(n.status&&(b&&!w?(n.status.fetchAborted=!0,n.status.fetchError=s.signal.reason,k&&(n.status.fetchAbortIgnored=!0)):n.status.fetchResolved=!0),b&&!k&&!w)return p(s.signal.reason);let v=f;return this.#i[r]===f&&(h===void 0?v.__staleWhileFetching?this.#i[r]=v.__staleWhileFetching:this.#I(e,"fetch"):(n.status&&(n.status.fetchUpdated=!0),this.set(e,h,c.options))),h},d=h=>(n.status&&(n.status.fetchRejected=!0,n.status.fetchError=h),p(h)),p=h=>{let{aborted:w}=s.signal,b=w&&n.allowStaleOnFetchAbort,k=b||n.allowStaleOnFetchRejection,v=k||n.noDeleteOnFetchRejection,C=f;if(this.#i[r]===f&&(!v||C.__staleWhileFetching===void 0?this.#I(e,"fetch"):b||(this.#i[r]=C.__staleWhileFetching)),k)return n.status&&C.__staleWhileFetching!==void 0&&(n.status.returnedStale=!0),C.__staleWhileFetching;if(C.__returned===C)throw h},u=(h,w)=>{let b=this.#s?.(e,i,c);b&&b instanceof Promise&&b.then(k=>h(k===void 0?void 0:k),w),s.signal.addEventListener("abort",()=>{(!n.ignoreFetchAbort||n.allowStaleOnFetchAbort)&&(h(void 0),n.allowStaleOnFetchAbort&&(h=k=>l(k,!0)))})};n.status&&(n.status.fetchDispatched=!0);let f=new Promise(u).then(l,d),m=Object.assign(f,{__abortController:s,__staleWhileFetching:i,__returned:void 0});return r===void 0?(this.set(e,m,{...c.options,status:void 0}),r=this.#c.get(e)):this.#i[r]=m,m}#u(e){if(!this.#b)return!1;let r=e;return!!r&&r instanceof Promise&&r.hasOwnProperty("__staleWhileFetching")&&r.__abortController instanceof Ga}async fetch(e,r={}){let{allowStale:n=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,ttl:s=this.ttl,noDisposeOnSet:a=this.noDisposeOnSet,size:c=0,sizeCalculation:l=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:p=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:f=this.ignoreFetchAbort,allowStaleOnFetchAbort:m=this.allowStaleOnFetchAbort,context:h,forceRefresh:w=!1,status:b,signal:k}=r;if(!this.#b)return b&&(b.fetch="get"),this.get(e,{allowStale:n,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:b});let v={allowStale:n,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:s,noDisposeOnSet:a,size:c,sizeCalculation:l,noUpdateTTL:d,noDeleteOnFetchRejection:p,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:m,ignoreFetchAbort:f,status:b,signal:k},C=this.#c.get(e);if(C===void 0){b&&(b.fetch="miss");let I=this.#F(e,C,v,h);return I.__returned=I}else{let I=this.#i[C];if(this.#u(I)){let Y=n&&I.__staleWhileFetching!==void 0;return b&&(b.fetch="inflight",Y&&(b.returnedStale=!0)),Y?I.__staleWhileFetching:I.__returned=I}let N=this.#v(C);if(!w&&!N)return b&&(b.fetch="hit"),this.#U(C),o&&this.#C(C),b&&this.#n(b,C),I;let G=this.#F(e,C,v,h),j=G.__staleWhileFetching!==void 0&&n;return b&&(b.fetch=N?"stale":"refresh",j&&N&&(b.returnedStale=!0)),j?G.__staleWhileFetching:G.__returned=G}}async forceFetch(e,r={}){let n=await this.fetch(e,r);if(n===void 0)throw new Error("fetch() returned undefined");return n}memo(e,r={}){let n=this.#S;if(!n)throw new Error("no memoMethod provided to constructor");let{context:o,forceRefresh:i,...s}=r,a=this.get(e,s);if(!i&&a!==void 0)return a;let c=n(e,a,{options:s,context:o});return this.set(e,c,s),c}get(e,r={}){let{allowStale:n=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,status:s}=r,a=this.#c.get(e);if(a!==void 0){let c=this.#i[a],l=this.#u(c);return s&&this.#n(s,a),this.#v(a)?(s&&(s.get="stale"),l?(s&&n&&c.__staleWhileFetching!==void 0&&(s.returnedStale=!0),n?c.__staleWhileFetching:void 0):(i||this.#I(e,"expire"),s&&n&&(s.returnedStale=!0),n?c:void 0)):(s&&(s.get="hit"),l?c.__staleWhileFetching:(this.#U(a),o&&this.#C(a),c))}else s&&(s.get="miss")}#j(e,r){this.#y[r]=e,this.#w[e]=r}#U(e){e!==this.#f&&(e===this.#m?this.#m=this.#w[e]:this.#j(this.#y[e],this.#w[e]),this.#j(this.#f,e),this.#f=e)}delete(e){return this.#I(e,"delete")}#I(e,r){let n=!1;if(this.#l!==0){let o=this.#c.get(e);if(o!==void 0)if(n=!0,this.#l===1)this.#W(r);else{this.#O(o);let i=this.#i[o];if(this.#u(i)?i.__abortController.abort(new Error("deleted")):(this.#k||this.#p)&&(this.#k&&this.#o?.(i,e,r),this.#p&&this.#h?.push([i,e,r])),this.#c.delete(e),this.#a[o]=void 0,this.#i[o]=void 0,o===this.#f)this.#f=this.#y[o];else if(o===this.#m)this.#m=this.#w[o];else{let s=this.#y[o];this.#w[s]=this.#w[o];let a=this.#w[o];this.#y[a]=this.#y[o]}this.#l--,this.#x.push(o)}}if(this.#p&&this.#h?.length){let o=this.#h,i;for(;i=o?.shift();)this.#t?.(...i)}return n}clear(){return this.#W("delete")}#W(e){for(let r of this.#T({allowStale:!0})){let n=this.#i[r];if(this.#u(n))n.__abortController.abort(new Error("deleted"));else{let o=this.#a[r];this.#k&&this.#o?.(n,o,e),this.#p&&this.#h?.push([n,o,e])}}if(this.#c.clear(),this.#i.fill(void 0),this.#a.fill(void 0),this.#g&&this.#P&&(this.#g.fill(0),this.#P.fill(0)),this.#E&&this.#E.fill(0),this.#m=0,this.#f=0,this.#x.length=0,this.#d=0,this.#l=0,this.#p&&this.#h){let r=this.#h,n;for(;n=r?.shift();)this.#t?.(...n)}}}});import{EventEmitter as dp}from"node:events";import Ey from"node:stream";import{StringDecoder as X_}from"node:string_decoder";var vy,Q_,Z_,eT,Rr,Ir,Xr,Va,qi,za,Sy,Ka,xy,Qt,So,Xe,Gi,xo,Qe,wt,Ze,ip,Ja,at,Ue,sp,ap,ky,cp,pr,lp,Ya,Vi,Cn,It,zi,tT,rT,nT,oT,Xa,up,iT,sT,Qr,pp=D(()=>{vy=typeof process=="object"&&process?process:{stdout:null,stderr:null},Q_=t=>!!t&&typeof t=="object"&&(t instanceof Qr||t instanceof Ey||Z_(t)||eT(t)),Z_=t=>!!t&&typeof t=="object"&&t instanceof dp&&typeof t.pipe=="function"&&t.pipe!==Ey.Writable.prototype.pipe,eT=t=>!!t&&typeof t=="object"&&t instanceof dp&&typeof t.write=="function"&&typeof t.end=="function",Rr=Symbol("EOF"),Ir=Symbol("maybeEmitEnd"),Xr=Symbol("emittedEnd"),Va=Symbol("emittingEnd"),qi=Symbol("emittedError"),za=Symbol("closed"),Sy=Symbol("read"),Ka=Symbol("flush"),xy=Symbol("flushChunk"),Qt=Symbol("encoding"),So=Symbol("decoder"),Xe=Symbol("flowing"),Gi=Symbol("paused"),xo=Symbol("resume"),Qe=Symbol("buffer"),wt=Symbol("pipes"),Ze=Symbol("bufferLength"),ip=Symbol("bufferPush"),Ja=Symbol("bufferShift"),at=Symbol("objectMode"),Ue=Symbol("destroyed"),sp=Symbol("error"),ap=Symbol("emitData"),ky=Symbol("emitEnd"),cp=Symbol("emitEnd2"),pr=Symbol("async"),lp=Symbol("abort"),Ya=Symbol("aborted"),Vi=Symbol("signal"),Cn=Symbol("dataListeners"),It=Symbol("discarded"),zi=t=>Promise.resolve().then(t),tT=t=>t(),rT=t=>t==="end"||t==="finish"||t==="prefinish",nT=t=>t instanceof ArrayBuffer||!!t&&typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,oT=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),Xa=class{src;dest;opts;ondrain;constructor(e,r,n){this.src=e,this.dest=r,this.opts=n,this.ondrain=()=>e[xo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},up=class extends Xa{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,n){super(e,r,n),this.proxyErrors=o=>this.dest.emit("error",o),e.on("error",this.proxyErrors)}},iT=t=>!!t.objectMode,sT=t=>!t.objectMode&&!!t.encoding&&t.encoding!=="buffer",Qr=class extends dp{[Xe]=!1;[Gi]=!1;[wt]=[];[Qe]=[];[at];[Qt];[pr];[So];[Rr]=!1;[Xr]=!1;[Va]=!1;[za]=!1;[qi]=null;[Ze]=0;[Ue]=!1;[Vi];[Ya]=!1;[Cn]=0;[It]=!1;writable=!0;readable=!0;constructor(...e){let r=e[0]||{};if(super(),r.objectMode&&typeof r.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");iT(r)?(this[at]=!0,this[Qt]=null):sT(r)?(this[Qt]=r.encoding,this[at]=!1):(this[at]=!1,this[Qt]=null),this[pr]=!!r.async,this[So]=this[Qt]?new X_(this[Qt]):null,r&&r.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[Qe]}),r&&r.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[wt]});let{signal:n}=r;n&&(this[Vi]=n,n.aborted?this[lp]():n.addEventListener("abort",()=>this[lp]()))}get bufferLength(){return this[Ze]}get encoding(){return this[Qt]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[at]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[pr]}set async(e){this[pr]=this[pr]||!!e}[lp](){this[Ya]=!0,this.emit("abort",this[Vi]?.reason),this.destroy(this[Vi]?.reason)}get aborted(){return this[Ya]}set aborted(e){}write(e,r,n){if(this[Ya])return!1;if(this[Rr])throw new Error("write after end");if(this[Ue])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(n=r,r="utf8"),r||(r="utf8");let o=this[pr]?zi:tT;if(!this[at]&&!Buffer.isBuffer(e)){if(oT(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(nT(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[at]?(this[Xe]&&this[Ze]!==0&&this[Ka](!0),this[Xe]?this.emit("data",e):this[ip](e),this[Ze]!==0&&this.emit("readable"),n&&o(n),this[Xe]):e.length?(typeof e=="string"&&!(r===this[Qt]&&!this[So]?.lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Qt]&&(e=this[So].write(e)),this[Xe]&&this[Ze]!==0&&this[Ka](!0),this[Xe]?this.emit("data",e):this[ip](e),this[Ze]!==0&&this.emit("readable"),n&&o(n),this[Xe]):(this[Ze]!==0&&this.emit("readable"),n&&o(n),this[Xe])}read(e){if(this[Ue])return null;if(this[It]=!1,this[Ze]===0||e===0||e&&e>this[Ze])return this[Ir](),null;this[at]&&(e=null),this[Qe].length>1&&!this[at]&&(this[Qe]=[this[Qt]?this[Qe].join(""):Buffer.concat(this[Qe],this[Ze])]);let r=this[Sy](e||null,this[Qe][0]);return this[Ir](),r}[Sy](e,r){if(this[at])this[Ja]();else{let n=r;e===n.length||e===null?this[Ja]():typeof n=="string"?(this[Qe][0]=n.slice(e),r=n.slice(0,e),this[Ze]-=e):(this[Qe][0]=n.subarray(e),r=n.subarray(0,e),this[Ze]-=e)}return this.emit("data",r),!this[Qe].length&&!this[Rr]&&this.emit("drain"),r}end(e,r,n){return typeof e=="function"&&(n=e,e=void 0),typeof r=="function"&&(n=r,r="utf8"),e!==void 0&&this.write(e,r),n&&this.once("end",n),this[Rr]=!0,this.writable=!1,(this[Xe]||!this[Gi])&&this[Ir](),this}[xo](){this[Ue]||(!this[Cn]&&!this[wt].length&&(this[It]=!0),this[Gi]=!1,this[Xe]=!0,this.emit("resume"),this[Qe].length?this[Ka]():this[Rr]?this[Ir]():this.emit("drain"))}resume(){return this[xo]()}pause(){this[Xe]=!1,this[Gi]=!0,this[It]=!1}get destroyed(){return this[Ue]}get flowing(){return this[Xe]}get paused(){return this[Gi]}[ip](e){this[at]?this[Ze]+=1:this[Ze]+=e.length,this[Qe].push(e)}[Ja](){return this[at]?this[Ze]-=1:this[Ze]-=this[Qe][0].length,this[Qe].shift()}[Ka](e=!1){do;while(this[xy](this[Ja]())&&this[Qe].length);!e&&!this[Qe].length&&!this[Rr]&&this.emit("drain")}[xy](e){return this.emit("data",e),this[Xe]}pipe(e,r){if(this[Ue])return e;this[It]=!1;let n=this[Xr];return r=r||{},e===vy.stdout||e===vy.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,n?r.end&&e.end():(this[wt].push(r.proxyErrors?new up(this,e,r):new Xa(this,e,r)),this[pr]?zi(()=>this[xo]()):this[xo]()),e}unpipe(e){let r=this[wt].find(n=>n.dest===e);r&&(this[wt].length===1?(this[Xe]&&this[Cn]===0&&(this[Xe]=!1),this[wt]=[]):this[wt].splice(this[wt].indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let n=super.on(e,r);if(e==="data")this[It]=!1,this[Cn]++,!this[wt].length&&!this[Xe]&&this[xo]();else if(e==="readable"&&this[Ze]!==0)super.emit("readable");else if(rT(e)&&this[Xr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[qi]){let o=r;this[pr]?zi(()=>o.call(this,this[qi])):o.call(this,this[qi])}return n}removeListener(e,r){return this.off(e,r)}off(e,r){let n=super.off(e,r);return e==="data"&&(this[Cn]=this.listeners("data").length,this[Cn]===0&&!this[It]&&!this[wt].length&&(this[Xe]=!1)),n}removeAllListeners(e){let r=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Cn]=0,!this[It]&&!this[wt].length&&(this[Xe]=!1)),r}get emittedEnd(){return this[Xr]}[Ir](){!this[Va]&&!this[Xr]&&!this[Ue]&&this[Qe].length===0&&this[Rr]&&(this[Va]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[za]&&this.emit("close"),this[Va]=!1)}emit(e,...r){let n=r[0];if(e!=="error"&&e!=="close"&&e!==Ue&&this[Ue])return!1;if(e==="data")return!this[at]&&!n?!1:this[pr]?(zi(()=>this[ap](n)),!0):this[ap](n);if(e==="end")return this[ky]();if(e==="close"){if(this[za]=!0,!this[Xr]&&!this[Ue])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[qi]=n,super.emit(sp,n);let i=!this[Vi]||this.listeners("error").length?super.emit("error",n):!1;return this[Ir](),i}else if(e==="resume"){let i=super.emit("resume");return this[Ir](),i}else if(e==="finish"||e==="prefinish"){let i=super.emit(e);return this.removeAllListeners(e),i}let o=super.emit(e,...r);return this[Ir](),o}[ap](e){for(let n of this[wt])n.dest.write(e)===!1&&this.pause();let r=this[It]?!1:super.emit("data",e);return this[Ir](),r}[ky](){return this[Xr]?!1:(this[Xr]=!0,this.readable=!1,this[pr]?(zi(()=>this[cp]()),!0):this[cp]())}[cp](){if(this[So]){let r=this[So].end();if(r){for(let n of this[wt])n.dest.write(r);this[It]||super.emit("data",r)}}for(let r of this[wt])r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[at]||(e.dataLength=0);let r=this.promise();return this.on("data",n=>{e.push(n),this[at]||(e.dataLength+=n.length)}),await r,e}async concat(){if(this[at])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[Qt]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,r)=>{this.on(Ue,()=>r(new Error("stream destroyed"))),this.on("error",n=>r(n)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[It]=!1;let e=!1,r=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return r();let o=this.read();if(o!==null)return Promise.resolve({done:!1,value:o});if(this[Rr])return r();let i,s,a=p=>{this.off("data",c),this.off("end",l),this.off(Ue,d),r(),s(p)},c=p=>{this.off("error",a),this.off("end",l),this.off(Ue,d),this.pause(),i({value:p,done:!!this[Rr]})},l=()=>{this.off("error",a),this.off("data",c),this.off(Ue,d),r(),i({done:!0,value:void 0})},d=()=>a(new Error("stream destroyed"));return new Promise((p,u)=>{s=u,i=p,this.once(Ue,d),this.once("error",a),this.once("end",l),this.once("data",c)})},throw:r,return:r,[Symbol.asyncIterator](){return this},[Symbol.asyncDispose]:async()=>{}}}[Symbol.iterator](){this[It]=!1;let e=!1,r=()=>(this.pause(),this.off(sp,r),this.off(Ue,r),this.off("end",r),e=!0,{done:!0,value:void 0}),n=()=>{if(e)return r();let o=this.read();return o===null?r():{done:!1,value:o}};return this.once("end",r),this.once(sp,r),this.once(Ue,r),{next:n,throw:r,return:r,[Symbol.iterator](){return this},[Symbol.dispose]:()=>{}}}destroy(e){if(this[Ue])return e?this.emit("error",e):this.emit(Ue),this;this[Ue]=!0,this[It]=!0,this[Qe].length=0,this[Ze]=0;let r=this;return typeof r.close=="function"&&!this[za]&&r.close(),e?this.emit("error",e):this.emit(Ue),this}static get isStream(){return Q_}}});import{posix as aT,win32 as mp}from"node:path";import{fileURLToPath as cT}from"node:url";import{lstatSync as lT,readdir as uT,readdirSync as dT,readlinkSync as pT,realpathSync as fT}from"fs";import*as hT from"node:fs";import{lstat as gT,readdir as wT,readlink as yT,realpath as bT}from"node:fs/promises";var mT,Ji,Ty,Ry,vT,ST,Ht,Iy,$y,fr,Oy,My,_n,Dy,Bt,Ki,fp,Py,Yi,Zt,Qa,ec,Ay,xT,hp,Cy,Xi,_y,Za,tc,gp,Ny,ct,rc,nc,oc,ko,Eo,Qi,Jj,Ly,Fy=D(()=>{by();pp();mT=fT.native,Ji={lstatSync:lT,readdir:uT,readdirSync:dT,readlinkSync:pT,realpathSync:mT,promises:{lstat:gT,readdir:wT,readlink:yT,realpath:bT}},Ty=t=>!t||t===Ji||t===hT?Ji:{...Ji,...t,promises:{...Ji.promises,...t.promises||{}}},Ry=/^\\\\\?\\([a-z]:)\\?$/i,vT=t=>t.replace(/\//g,"\\").replace(Ry,"$1\\"),ST=/[\\\/]/,Ht=0,Iy=1,$y=2,fr=4,Oy=6,My=8,_n=10,Dy=12,Bt=15,Ki=~Bt,fp=16,Py=32,Yi=64,Zt=128,Qa=256,ec=512,Ay=Yi|Zt|ec,xT=1023,hp=t=>t.isFile()?My:t.isDirectory()?fr:t.isSymbolicLink()?_n:t.isCharacterDevice()?$y:t.isBlockDevice()?Oy:t.isSocket()?Dy:t.isFIFO()?Iy:Ht,Cy=new Map,Xi=t=>{let e=Cy.get(t);if(e)return e;let r=t.normalize("NFKD");return Cy.set(t,r),r},_y=new Map,Za=t=>{let e=_y.get(t);if(e)return e;let r=Xi(t.toLowerCase());return _y.set(t,r),r},tc=class extends Hi{constructor(){super({max:256})}},gp=class extends Hi{constructor(e=16*1024){super({maxSize:e,sizeCalculation:r=>r.length+1})}},Ny=Symbol("PathScurry setAsCwd"),ct=class{name;root;roots;parent;nocase;isCWD=!1;#e;#r;get dev(){return this.#r}#o;get mode(){return this.#o}#t;get nlink(){return this.#t}#s;get uid(){return this.#s}#S;get gid(){return this.#S}#l;get rdev(){return this.#l}#d;get blksize(){return this.#d}#c;get ino(){return this.#c}#a;get size(){return this.#a}#i;get blocks(){return this.#i}#w;get atimeMs(){return this.#w}#y;get mtimeMs(){return this.#y}#m;get ctimeMs(){return this.#m}#f;get birthtimeMs(){return this.#f}#x;get atime(){return this.#x}#h;get mtime(){return this.#h}#E;get ctime(){return this.#E}#P;get birthtime(){return this.#P}#g;#k;#b;#p;#A;#C;#n;#$;#v;#R;get parentPath(){return(this.parent||this).fullpath()}get path(){return this.parentPath}constructor(e,r=Ht,n,o,i,s,a){this.name=e,this.#g=i?Za(e):Xi(e),this.#n=r&xT,this.nocase=i,this.roots=o,this.root=n||this,this.#$=s,this.#b=a.fullpath,this.#A=a.relative,this.#C=a.relativePosix,this.parent=a.parent,this.parent?this.#e=this.parent.#e:this.#e=Ty(a.fs)}depth(){return this.#k!==void 0?this.#k:this.parent?this.#k=this.parent.depth()+1:this.#k=0}childrenCache(){return this.#$}resolve(e){if(!e)return this;let r=this.getRootString(e),o=e.substring(r.length).split(this.splitSep);return r?this.getRoot(r).#O(o):this.#O(o)}#O(e){let r=this;for(let n of e)r=r.child(n);return r}children(){let e=this.#$.get(this);if(e)return e;let r=Object.assign([],{provisional:0});return this.#$.set(this,r),this.#n&=~fp,r}child(e,r){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let n=this.children(),o=this.nocase?Za(e):Xi(e);for(let c of n)if(c.#g===o)return c;let i=this.parent?this.sep:"",s=this.#b?this.#b+i+e:void 0,a=this.newChild(e,Ht,{...r,parent:this,fullpath:s});return this.canReaddir()||(a.#n|=Zt),n.push(a),a}relative(){if(this.isCWD)return"";if(this.#A!==void 0)return this.#A;let e=this.name,r=this.parent;if(!r)return this.#A=this.name;let n=r.relative();return n+(!n||!r.parent?"":this.sep)+e}relativePosix(){if(this.sep==="/")return this.relative();if(this.isCWD)return"";if(this.#C!==void 0)return this.#C;let e=this.name,r=this.parent;if(!r)return this.#C=this.fullpathPosix();let n=r.relativePosix();return n+(!n||!r.parent?"":"/")+e}fullpath(){if(this.#b!==void 0)return this.#b;let e=this.name,r=this.parent;if(!r)return this.#b=this.name;let o=r.fullpath()+(r.parent?this.sep:"")+e;return this.#b=o}fullpathPosix(){if(this.#p!==void 0)return this.#p;if(this.sep==="/")return this.#p=this.fullpath();if(!this.parent){let o=this.fullpath().replace(/\\/g,"/");return/^[a-z]:\//i.test(o)?this.#p=`//?/${o}`:this.#p=o}let e=this.parent,r=e.fullpathPosix(),n=r+(!r||!e.parent?"":"/")+this.name;return this.#p=n}isUnknown(){return(this.#n&Bt)===Ht}isType(e){return this[`is${e}`]()}getType(){return this.isUnknown()?"Unknown":this.isDirectory()?"Directory":this.isFile()?"File":this.isSymbolicLink()?"SymbolicLink":this.isFIFO()?"FIFO":this.isCharacterDevice()?"CharacterDevice":this.isBlockDevice()?"BlockDevice":this.isSocket()?"Socket":"Unknown"}isFile(){return(this.#n&Bt)===My}isDirectory(){return(this.#n&Bt)===fr}isCharacterDevice(){return(this.#n&Bt)===$y}isBlockDevice(){return(this.#n&Bt)===Oy}isFIFO(){return(this.#n&Bt)===Iy}isSocket(){return(this.#n&Bt)===Dy}isSymbolicLink(){return(this.#n&_n)===_n}lstatCached(){return this.#n&Py?this:void 0}readlinkCached(){return this.#v}realpathCached(){return this.#R}readdirCached(){let e=this.children();return e.slice(0,e.provisional)}canReadlink(){if(this.#v)return!0;if(!this.parent)return!1;let e=this.#n&Bt;return!(e!==Ht&&e!==_n||this.#n&Qa||this.#n&Zt)}calledReaddir(){return!!(this.#n&fp)}isENOENT(){return!!(this.#n&Zt)}isNamed(e){return this.nocase?this.#g===Za(e):this.#g===Xi(e)}async readlink(){let e=this.#v;if(e)return e;if(this.canReadlink()&&this.parent)try{let r=await this.#e.promises.readlink(this.fullpath()),n=(await this.parent.realpath())?.resolve(r);if(n)return this.#v=n}catch(r){this.#u(r.code);return}}readlinkSync(){let e=this.#v;if(e)return e;if(this.canReadlink()&&this.parent)try{let r=this.#e.readlinkSync(this.fullpath()),n=this.parent.realpathSync()?.resolve(r);if(n)return this.#v=n}catch(r){this.#u(r.code);return}}#M(e){this.#n|=fp;for(let r=e.provisional;r<e.length;r++){let n=e[r];n&&n.#D()}}#D(){this.#n&Zt||(this.#n=(this.#n|Zt)&Ki,this.#_())}#_(){let e=this.children();e.provisional=0;for(let r of e)r.#D()}#T(){this.#n|=ec,this.#N()}#N(){if(this.#n&Yi)return;let e=this.#n;(e&Bt)===fr&&(e&=Ki),this.#n=e|Yi,this.#_()}#L(e=""){e==="ENOTDIR"||e==="EPERM"?this.#N():e==="ENOENT"?this.#D():this.children().provisional=0}#F(e=""){e==="ENOTDIR"?this.parent.#N():e==="ENOENT"&&this.#D()}#u(e=""){let r=this.#n;r|=Qa,e==="ENOENT"&&(r|=Zt),(e==="EINVAL"||e==="UNKNOWN")&&(r&=Ki),this.#n=r,e==="ENOTDIR"&&this.parent&&this.parent.#N()}#j(e,r){return this.#I(e,r)||this.#U(e,r)}#U(e,r){let n=hp(e),o=this.newChild(e.name,n,{parent:this}),i=o.#n&Bt;return i!==fr&&i!==_n&&i!==Ht&&(o.#n|=Yi),r.unshift(o),r.provisional++,o}#I(e,r){for(let n=r.provisional;n<r.length;n++){let o=r[n];if((this.nocase?Za(e.name):Xi(e.name))===o.#g)return this.#W(e,o,n,r)}}#W(e,r,n,o){let i=r.name;return r.#n=r.#n&Ki|hp(e),i!==e.name&&(r.name=e.name),n!==o.provisional&&(n===o.length-1?o.pop():o.splice(n,1),o.unshift(r)),o.provisional++,r}async lstat(){if(!(this.#n&Zt))try{return this.#G(await this.#e.promises.lstat(this.fullpath())),this}catch(e){this.#F(e.code)}}lstatSync(){if(!(this.#n&Zt))try{return this.#G(this.#e.lstatSync(this.fullpath())),this}catch(e){this.#F(e.code)}}#G(e){let{atime:r,atimeMs:n,birthtime:o,birthtimeMs:i,blksize:s,blocks:a,ctime:c,ctimeMs:l,dev:d,gid:p,ino:u,mode:f,mtime:m,mtimeMs:h,nlink:w,rdev:b,size:k,uid:v}=e;this.#x=r,this.#w=n,this.#P=o,this.#f=i,this.#d=s,this.#i=a,this.#E=c,this.#m=l,this.#r=d,this.#S=p,this.#c=u,this.#o=f,this.#h=m,this.#y=h,this.#t=w,this.#l=b,this.#a=k,this.#s=v;let C=hp(e);this.#n=this.#n&Ki|C|Py,C!==Ht&&C!==fr&&C!==_n&&(this.#n|=Yi)}#H=[];#q=!1;#V(e){this.#q=!1;let r=this.#H.slice();this.#H.length=0,r.forEach(n=>n(null,e))}readdirCB(e,r=!1){if(!this.canReaddir()){r?e(null,[]):queueMicrotask(()=>e(null,[]));return}let n=this.children();if(this.calledReaddir()){let i=n.slice(0,n.provisional);r?e(null,i):queueMicrotask(()=>e(null,i));return}if(this.#H.push(e),this.#q)return;this.#q=!0;let o=this.fullpath();this.#e.readdir(o,{withFileTypes:!0},(i,s)=>{if(i)this.#L(i.code),n.provisional=0;else{for(let a of s)this.#j(a,n);this.#M(n)}this.#V(n.slice(0,n.provisional))})}#B;async readdir(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let r=this.fullpath();if(this.#B)await this.#B;else{let n=()=>{};this.#B=new Promise(o=>n=o);try{for(let o of await this.#e.promises.readdir(r,{withFileTypes:!0}))this.#j(o,e);this.#M(e)}catch(o){this.#L(o.code),e.provisional=0}this.#B=void 0,n()}return e.slice(0,e.provisional)}readdirSync(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let r=this.fullpath();try{for(let n of this.#e.readdirSync(r,{withFileTypes:!0}))this.#j(n,e);this.#M(e)}catch(n){this.#L(n.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&Ay)return!1;let e=Bt&this.#n;return e===Ht||e===fr||e===_n}shouldWalk(e,r){return(this.#n&fr)===fr&&!(this.#n&Ay)&&!e.has(this)&&(!r||r(this))}async realpath(){if(this.#R)return this.#R;if(!((ec|Qa|Zt)&this.#n))try{let e=await this.#e.promises.realpath(this.fullpath());return this.#R=this.resolve(e)}catch{this.#T()}}realpathSync(){if(this.#R)return this.#R;if(!((ec|Qa|Zt)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#R=this.resolve(e)}catch{this.#T()}}[Ny](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let r=new Set([]),n=[],o=this;for(;o&&o.parent;)r.add(o),o.#A=n.join(this.sep),o.#C=n.join("/"),o=o.parent,n.push("..");for(o=e;o&&o.parent&&!r.has(o);)o.#A=void 0,o.#C=void 0,o=o.parent}},rc=class t extends ct{sep="\\";splitSep=ST;constructor(e,r=Ht,n,o,i,s,a){super(e,r,n,o,i,s,a)}newChild(e,r=Ht,n={}){return new t(e,r,this.root,this.roots,this.nocase,this.childrenCache(),n)}getRootString(e){return mp.parse(e).root}getRoot(e){if(e=vT(e.toUpperCase()),e===this.root.name)return this.root;for(let[r,n]of Object.entries(this.roots))if(this.sameRoot(e,r))return this.roots[e]=n;return this.roots[e]=new ko(e,this).root}sameRoot(e,r=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(Ry,"$1\\"),e===r}},nc=class t extends ct{splitSep="/";sep="/";constructor(e,r=Ht,n,o,i,s,a){super(e,r,n,o,i,s,a)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,r=Ht,n={}){return new t(e,r,this.root,this.roots,this.nocase,this.childrenCache(),n)}},oc=class{root;rootPath;roots;cwd;#e;#r;#o;nocase;#t;constructor(e=process.cwd(),r,n,{nocase:o,childrenCacheSize:i=16*1024,fs:s=Ji}={}){this.#t=Ty(s),(e instanceof URL||e.startsWith("file://"))&&(e=cT(e));let a=r.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(a),this.#e=new tc,this.#r=new tc,this.#o=new gp(i);let c=a.substring(this.rootPath.length).split(n);if(c.length===1&&!c[0]&&c.pop(),o===void 0)throw new TypeError("must provide nocase setting to PathScurryBase ctor");this.nocase=o,this.root=this.newRoot(this.#t),this.roots[this.rootPath]=this.root;let l=this.root,d=c.length-1,p=r.sep,u=this.rootPath,f=!1;for(let m of c){let h=d--;l=l.child(m,{relative:new Array(h).fill("..").join(p),relativePosix:new Array(h).fill("..").join("/"),fullpath:u+=(f?"":p)+m}),f=!0}this.cwd=l}depth(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.depth()}childrenCache(){return this.#o}resolve(...e){let r="";for(let i=e.length-1;i>=0;i--){let s=e[i];if(!(!s||s===".")&&(r=r?`${s}/${r}`:s,this.isAbsolute(s)))break}let n=this.#e.get(r);if(n!==void 0)return n;let o=this.cwd.resolve(r).fullpath();return this.#e.set(r,o),o}resolvePosix(...e){let r="";for(let i=e.length-1;i>=0;i--){let s=e[i];if(!(!s||s===".")&&(r=r?`${s}/${r}`:s,this.isAbsolute(s)))break}let n=this.#r.get(r);if(n!==void 0)return n;let o=this.cwd.resolve(r).fullpathPosix();return this.#r.set(r,o),o}relative(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relative()}relativePosix(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relativePosix()}basename(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.name}dirname(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),(e.parent||e).fullpath()}async readdir(e=this.cwd,r={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n}=r;if(e.canReaddir()){let o=await e.readdir();return n?o:o.map(i=>i.name)}else return[]}readdirSync(e=this.cwd,r={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n=!0}=r;return e.canReaddir()?n?e.readdirSync():e.readdirSync().map(o=>o.name):[]}async lstat(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstat()}lstatSync(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstatSync()}async readlink(e=this.cwd,{withFileTypes:r}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e.withFileTypes,e=this.cwd);let n=await e.readlink();return r?n:n?.fullpath()}readlinkSync(e=this.cwd,{withFileTypes:r}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e.withFileTypes,e=this.cwd);let n=e.readlinkSync();return r?n:n?.fullpath()}async realpath(e=this.cwd,{withFileTypes:r}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e.withFileTypes,e=this.cwd);let n=await e.realpath();return r?n:n?.fullpath()}realpathSync(e=this.cwd,{withFileTypes:r}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e.withFileTypes,e=this.cwd);let n=e.realpathSync();return r?n:n?.fullpath()}async walk(e=this.cwd,r={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n=!0,follow:o=!1,filter:i,walkFilter:s}=r,a=[];(!i||i(e))&&a.push(n?e:e.fullpath());let c=new Set,l=(p,u)=>{c.add(p),p.readdirCB((f,m)=>{if(f)return u(f);let h=m.length;if(!h)return u();let w=()=>{--h===0&&u()};for(let b of m)(!i||i(b))&&a.push(n?b:b.fullpath()),o&&b.isSymbolicLink()?b.realpath().then(k=>k?.isUnknown()?k.lstat():k).then(k=>k?.shouldWalk(c,s)?l(k,w):w()):b.shouldWalk(c,s)?l(b,w):w()},!0)},d=e;return new Promise((p,u)=>{l(d,f=>{if(f)return u(f);p(a)})})}walkSync(e=this.cwd,r={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n=!0,follow:o=!1,filter:i,walkFilter:s}=r,a=[];(!i||i(e))&&a.push(n?e:e.fullpath());let c=new Set([e]);for(let l of c){let d=l.readdirSync();for(let p of d){(!i||i(p))&&a.push(n?p:p.fullpath());let u=p;if(p.isSymbolicLink()){if(!(o&&(u=p.realpathSync())))continue;u.isUnknown()&&u.lstatSync()}u.shouldWalk(c,s)&&c.add(u)}}return a}[Symbol.asyncIterator](){return this.iterate()}iterate(e=this.cwd,r={}){return typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd),this.stream(e,r)[Symbol.asyncIterator]()}[Symbol.iterator](){return this.iterateSync()}*iterateSync(e=this.cwd,r={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n=!0,follow:o=!1,filter:i,walkFilter:s}=r;(!i||i(e))&&(yield n?e:e.fullpath());let a=new Set([e]);for(let c of a){let l=c.readdirSync();for(let d of l){(!i||i(d))&&(yield n?d:d.fullpath());let p=d;if(d.isSymbolicLink()){if(!(o&&(p=d.realpathSync())))continue;p.isUnknown()&&p.lstatSync()}p.shouldWalk(a,s)&&a.add(p)}}}stream(e=this.cwd,r={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n=!0,follow:o=!1,filter:i,walkFilter:s}=r,a=new Qr({objectMode:!0});(!i||i(e))&&a.write(n?e:e.fullpath());let c=new Set,l=[e],d=0,p=()=>{let u=!1;for(;!u;){let f=l.shift();if(!f){d===0&&a.end();return}d++,c.add(f);let m=(w,b,k=!1)=>{if(w)return a.emit("error",w);if(o&&!k){let v=[];for(let C of b)C.isSymbolicLink()&&v.push(C.realpath().then(I=>I?.isUnknown()?I.lstat():I));if(v.length){Promise.all(v).then(()=>m(null,b,!0));return}}for(let v of b)v&&(!i||i(v))&&(a.write(n?v:v.fullpath())||(u=!0));d--;for(let v of b){let C=v.realpathCached()||v;C.shouldWalk(c,s)&&l.push(C)}u&&!a.flowing?a.once("drain",p):h||p()},h=!0;f.readdirCB(m,!0),h=!1}};return p(),a}streamSync(e=this.cwd,r={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ct||(r=e,e=this.cwd);let{withFileTypes:n=!0,follow:o=!1,filter:i,walkFilter:s}=r,a=new Qr({objectMode:!0}),c=new Set;(!i||i(e))&&a.write(n?e:e.fullpath());let l=[e],d=0,p=()=>{let u=!1;for(;!u;){let f=l.shift();if(!f){d===0&&a.end();return}d++,c.add(f);let m=f.readdirSync();for(let h of m)(!i||i(h))&&(a.write(n?h:h.fullpath())||(u=!0));d--;for(let h of m){let w=h;if(h.isSymbolicLink()){if(!(o&&(w=h.realpathSync())))continue;w.isUnknown()&&w.lstatSync()}w.shouldWalk(c,s)&&l.push(w)}}u&&!a.flowing&&a.once("drain",p)};return p(),a}chdir(e=this.cwd){let r=this.cwd;this.cwd=typeof e=="string"?this.cwd.resolve(e):e,this.cwd[Ny](r)}},ko=class extends oc{sep="\\";constructor(e=process.cwd(),r={}){let{nocase:n=!0}=r;super(e,mp,"\\",{...r,nocase:n}),this.nocase=n;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return mp.parse(e).root.toUpperCase()}newRoot(e){return new rc(this.rootPath,fr,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:(\/|\\)/i.test(e)}},Eo=class extends oc{sep="/";constructor(e=process.cwd(),r={}){let{nocase:n=!1}=r;super(e,aT,"/",{...r,nocase:n}),this.nocase=n}parseRootPath(e){return"/"}newRoot(e){return new nc(this.rootPath,fr,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},Qi=class extends Eo{constructor(e=process.cwd(),r={}){let{nocase:n=!0}=r;super(e,{...r,nocase:n})}},Jj=process.platform==="win32"?rc:nc,Ly=process.platform==="win32"?ko:process.platform==="darwin"?Qi:Eo});var kT,ET,Po,wp=D(()=>{Jr();kT=t=>t.length>=1,ET=t=>t.length>=1,Po=class t{#e;#r;#o;length;#t;#s;#S;#l;#d;#c;#a=!0;constructor(e,r,n,o){if(!kT(e))throw new TypeError("empty pattern list");if(!ET(r))throw new TypeError("empty glob list");if(r.length!==e.length)throw new TypeError("mismatched pattern list and glob list lengths");if(this.length=e.length,n<0||n>=this.length)throw new TypeError("index out of range");if(this.#e=e,this.#r=r,this.#o=n,this.#t=o,this.#o===0){if(this.isUNC()){let[i,s,a,c,...l]=this.#e,[d,p,u,f,...m]=this.#r;l[0]===""&&(l.shift(),m.shift());let h=[i,s,a,c,""].join("/"),w=[d,p,u,f,""].join("/");this.#e=[h,...l],this.#r=[w,...m],this.length=this.#e.length}else if(this.isDrive()||this.isAbsolute()){let[i,...s]=this.#e,[a,...c]=this.#r;s[0]===""&&(s.shift(),c.shift());let l=i+"/",d=a+"/";this.#e=[l,...s],this.#r=[d,...c],this.length=this.#e.length}}}pattern(){return this.#e[this.#o]}isString(){return typeof this.#e[this.#o]=="string"}isGlobstar(){return this.#e[this.#o]===je}isRegExp(){return this.#e[this.#o]instanceof RegExp}globString(){return this.#S=this.#S||(this.#o===0?this.isAbsolute()?this.#r[0]+this.#r.slice(1).join("/"):this.#r.join("/"):this.#r.slice(this.#o).join("/"))}hasMore(){return this.length>this.#o+1}rest(){return this.#s!==void 0?this.#s:this.hasMore()?(this.#s=new t(this.#e,this.#r,this.#o+1,this.#t),this.#s.#c=this.#c,this.#s.#d=this.#d,this.#s.#l=this.#l,this.#s):this.#s=null}isUNC(){let e=this.#e;return this.#d!==void 0?this.#d:this.#d=this.#t==="win32"&&this.#o===0&&e[0]===""&&e[1]===""&&typeof e[2]=="string"&&!!e[2]&&typeof e[3]=="string"&&!!e[3]}isDrive(){let e=this.#e;return this.#l!==void 0?this.#l:this.#l=this.#t==="win32"&&this.#o===0&&this.length>1&&typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0])}isAbsolute(){let e=this.#e;return this.#c!==void 0?this.#c:this.#c=e[0]===""&&e.length>1||this.isDrive()||this.isUNC()}root(){let e=this.#e[0];return typeof e=="string"&&this.isAbsolute()&&this.#o===0?e:""}checkFollowGlobstar(){return!(this.#o===0||!this.isGlobstar()||!this.#a)}markFollowGlobstar(){return this.#o===0||!this.isGlobstar()||!this.#a?!1:(this.#a=!1,!0)}}});var PT,Ao,yp=D(()=>{Jr();wp();PT=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Ao=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:r,nocase:n,noext:o,noglobstar:i,platform:s=PT}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=s,this.mmopts={dot:!0,nobrace:r,nocase:n,noext:o,noglobstar:i,optimizationLevel:2,platform:s,nocomment:!0,nonegate:!0};for(let a of e)this.add(a)}add(e){let r=new Rt(e,this.mmopts);for(let n=0;n<r.set.length;n++){let o=r.set[n],i=r.globParts[n];if(!o||!i)throw new Error("invalid pattern object");for(;o[0]==="."&&i[0]===".";)o.shift(),i.shift();let s=new Po(o,i,0,this.platform),a=new Rt(s.globString(),this.mmopts),c=i[i.length-1]==="**",l=s.isAbsolute();l?this.absolute.push(a):this.relative.push(a),c&&(l?this.absoluteChildren.push(a):this.relativeChildren.push(a))}}ignored(e){let r=e.fullpath(),n=`${r}/`,o=e.relative()||".",i=`${o}/`;for(let s of this.relative)if(s.match(o)||s.match(i))return!0;for(let s of this.absolute)if(s.match(r)||s.match(n))return!0;return!1}childrenIgnored(e){let r=e.fullpath()+"/",n=(e.relative()||".")+"/";for(let o of this.relativeChildren)if(o.match(n))return!0;for(let o of this.absoluteChildren)if(o.match(r))return!0;return!1}}});var bp,vp,Sp,Zi,jy=D(()=>{Jr();bp=class t{store;constructor(e=new Map){this.store=e}copy(){return new t(new Map(this.store))}hasWalked(e,r){return this.store.get(e.fullpath())?.has(r.globString())}storeWalked(e,r){let n=e.fullpath(),o=this.store.get(n);o?o.add(r.globString()):this.store.set(n,new Set([r.globString()]))}},vp=class{store=new Map;add(e,r,n){let o=(r?2:0)|(n?1:0),i=this.store.get(e);this.store.set(e,i===void 0?o:o&i)}entries(){return[...this.store.entries()].map(([e,r])=>[e,!!(r&2),!!(r&1)])}},Sp=class{store=new Map;add(e,r){if(!e.canReaddir())return;let n=this.store.get(e);n?n.find(o=>o.globString()===r.globString())||n.push(r):this.store.set(e,[r])}get(e){let r=this.store.get(e);if(!r)throw new Error("attempting to walk unknown path");return r}entries(){return this.keys().map(e=>[e,this.store.get(e)])}keys(){return[...this.store.keys()].filter(e=>e.canReaddir())}},Zi=class t{hasWalkedCache;matches=new vp;subwalks=new Sp;patterns;follow;dot;opts;constructor(e,r){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=r?r.copy():new bp}processPatterns(e,r){this.patterns=r;let n=r.map(o=>[e,o]);for(let[o,i]of n){this.hasWalkedCache.storeWalked(o,i);let s=i.root(),a=i.isAbsolute()&&this.opts.absolute!==!1;if(s){o=o.resolve(s==="/"&&this.opts.root!==void 0?this.opts.root:s);let p=i.rest();if(p)i=p;else{this.matches.add(o,!0,!1);continue}}if(o.isENOENT())continue;let c,l,d=!1;for(;typeof(c=i.pattern())=="string"&&(l=i.rest());)o=o.resolve(c),i=l,d=!0;if(c=i.pattern(),l=i.rest(),d){if(this.hasWalkedCache.hasWalked(o,i))continue;this.hasWalkedCache.storeWalked(o,i)}if(typeof c=="string"){let p=c===".."||c===""||c===".";this.matches.add(o.resolve(c),a,p);continue}else if(c===je){(!o.isSymbolicLink()||this.follow||i.checkFollowGlobstar())&&this.subwalks.add(o,i);let p=l?.pattern(),u=l?.rest();if(!l||(p===""||p===".")&&!u)this.matches.add(o,a,p===""||p===".");else if(p===".."){let f=o.parent||o;u?this.hasWalkedCache.hasWalked(f,u)||this.subwalks.add(f,u):this.matches.add(f,a,!0)}}else c instanceof RegExp&&this.subwalks.add(o,i)}return this}subwalkTargets(){return this.subwalks.keys()}child(){return new t(this.opts,this.hasWalkedCache)}filterEntries(e,r){let n=this.subwalks.get(e),o=this.child();for(let i of r)for(let s of n){let a=s.isAbsolute(),c=s.pattern(),l=s.rest();c===je?o.testGlobstar(i,s,l,a):c instanceof RegExp?o.testRegExp(i,c,l,a):o.testString(i,c,l,a)}return o}testGlobstar(e,r,n,o){if((this.dot||!e.name.startsWith("."))&&(r.hasMore()||this.matches.add(e,o,!1),e.canReaddir()&&(this.follow||!e.isSymbolicLink()?this.subwalks.add(e,r):e.isSymbolicLink()&&(n&&r.checkFollowGlobstar()?this.subwalks.add(e,n):r.markFollowGlobstar()&&this.subwalks.add(e,r)))),n){let i=n.pattern();if(typeof i=="string"&&i!==".."&&i!==""&&i!==".")this.testString(e,i,n.rest(),o);else if(i===".."){let s=e.parent||e;this.subwalks.add(s,n)}else i instanceof RegExp&&this.testRegExp(e,i,n.rest(),o)}}testRegExp(e,r,n,o){r.test(e.name)&&(n?this.subwalks.add(e,n):this.matches.add(e,o,!1))}testString(e,r,n,o){e.isNamed(r)&&(n?this.subwalks.add(e,n):this.matches.add(e,o,!1))}}});var AT,ic,es,ts,Uy=D(()=>{pp();yp();jy();AT=(t,e)=>typeof t=="string"?new Ao([t],e):Array.isArray(t)?new Ao(t,e):t,ic=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#e=[];#r;#o;signal;maxDepth;includeChildMatches;constructor(e,r,n){if(this.patterns=e,this.path=r,this.opts=n,this.#o=!n.posix&&n.platform==="win32"?"\\":"/",this.includeChildMatches=n.includeChildMatches!==!1,(n.ignore||!this.includeChildMatches)&&(this.#r=AT(n.ignore??[],n),!this.includeChildMatches&&typeof this.#r.add!="function")){let o="cannot ignore child matches, ignore lacks add() method.";throw new Error(o)}this.maxDepth=n.maxDepth||1/0,n.signal&&(this.signal=n.signal,this.signal.addEventListener("abort",()=>{this.#e.length=0}))}#t(e){return this.seen.has(e)||!!this.#r?.ignored?.(e)}#s(e){return!!this.#r?.childrenIgnored?.(e)}pause(){this.paused=!0}resume(){if(this.signal?.aborted)return;this.paused=!1;let e;for(;!this.paused&&(e=this.#e.shift());)e()}onResume(e){this.signal?.aborted||(this.paused?this.#e.push(e):e())}async matchCheck(e,r){if(r&&this.opts.nodir)return;let n;if(this.opts.realpath){if(n=e.realpathCached()||await e.realpath(),!n)return;e=n}let i=e.isUnknown()||this.opts.stat?await e.lstat():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let s=await i.realpath();s&&(s.isUnknown()||this.opts.stat)&&await s.lstat()}return this.matchCheckTest(i,r)}matchCheckTest(e,r){return e&&(this.maxDepth===1/0||e.depth()<=this.maxDepth)&&(!r||e.canReaddir())&&(!this.opts.nodir||!e.isDirectory())&&(!this.opts.nodir||!this.opts.follow||!e.isSymbolicLink()||!e.realpathCached()?.isDirectory())&&!this.#t(e)?e:void 0}matchCheckSync(e,r){if(r&&this.opts.nodir)return;let n;if(this.opts.realpath){if(n=e.realpathCached()||e.realpathSync(),!n)return;e=n}let i=e.isUnknown()||this.opts.stat?e.lstatSync():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let s=i.realpathSync();s&&(s?.isUnknown()||this.opts.stat)&&s.lstatSync()}return this.matchCheckTest(i,r)}matchFinish(e,r){if(this.#t(e))return;if(!this.includeChildMatches&&this.#r?.add){let i=`${e.relativePosix()}/**`;this.#r.add(i)}let n=this.opts.absolute===void 0?r:this.opts.absolute;this.seen.add(e);let o=this.opts.mark&&e.isDirectory()?this.#o:"";if(this.opts.withFileTypes)this.matchEmit(e);else if(n){let i=this.opts.posix?e.fullpathPosix():e.fullpath();this.matchEmit(i+o)}else{let i=this.opts.posix?e.relativePosix():e.relative(),s=this.opts.dotRelative&&!i.startsWith(".."+this.#o)?"."+this.#o:"";this.matchEmit(i?s+i+o:"."+o)}}async match(e,r,n){let o=await this.matchCheck(e,n);o&&this.matchFinish(o,r)}matchSync(e,r,n){let o=this.matchCheckSync(e,n);o&&this.matchFinish(o,r)}walkCB(e,r,n){this.signal?.aborted&&n(),this.walkCB2(e,r,new Zi(this.opts),n)}walkCB2(e,r,n,o){if(this.#s(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2(e,r,n,o));return}n.processPatterns(e,r);let i=1,s=()=>{--i===0&&o()};for(let[a,c,l]of n.matches.entries())this.#t(a)||(i++,this.match(a,c,l).then(()=>s()));for(let a of n.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let c=a.readdirCached();a.calledReaddir()?this.walkCB3(a,c,n,s):a.readdirCB((l,d)=>this.walkCB3(a,d,n,s),!0)}s()}walkCB3(e,r,n,o){n=n.filterEntries(e,r);let i=1,s=()=>{--i===0&&o()};for(let[a,c,l]of n.matches.entries())this.#t(a)||(i++,this.match(a,c,l).then(()=>s()));for(let[a,c]of n.subwalks.entries())i++,this.walkCB2(a,c,n.child(),s);s()}walkCBSync(e,r,n){this.signal?.aborted&&n(),this.walkCB2Sync(e,r,new Zi(this.opts),n)}walkCB2Sync(e,r,n,o){if(this.#s(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2Sync(e,r,n,o));return}n.processPatterns(e,r);let i=1,s=()=>{--i===0&&o()};for(let[a,c,l]of n.matches.entries())this.#t(a)||this.matchSync(a,c,l);for(let a of n.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let c=a.readdirSync();this.walkCB3Sync(a,c,n,s)}s()}walkCB3Sync(e,r,n,o){n=n.filterEntries(e,r);let i=1,s=()=>{--i===0&&o()};for(let[a,c,l]of n.matches.entries())this.#t(a)||this.matchSync(a,c,l);for(let[a,c]of n.subwalks.entries())i++,this.walkCB2Sync(a,c,n.child(),s);s()}},es=class extends ic{matches=new Set;constructor(e,r,n){super(e,r,n)}matchEmit(e){this.matches.add(e)}async walk(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&await this.path.lstat(),await new Promise((e,r)=>{this.walkCB(this.path,this.patterns,()=>{this.signal?.aborted?r(this.signal.reason):e(this.matches)})}),this.matches}walkSync(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>{if(this.signal?.aborted)throw this.signal.reason}),this.matches}},ts=class extends ic{results;constructor(e,r,n){super(e,r,n),this.results=new Qr({signal:this.signal,objectMode:!0}),this.results.on("drain",()=>this.resume()),this.results.on("resume",()=>this.resume())}matchEmit(e){this.results.write(e),this.results.flowing||this.pause()}stream(){let e=this.path;return e.isUnknown()?e.lstat().then(()=>{this.walkCB(e,this.patterns,()=>this.results.end())}):this.walkCB(e,this.patterns,()=>this.results.end()),this.results}streamSync(){return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>this.results.end()),this.results}}});import{fileURLToPath as CT}from"node:url";var _T,er,xp=D(()=>{Jr();Fy();wp();Uy();_T=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",er=class{absolute;cwd;root;dot;dotRelative;follow;ignore;magicalBraces;mark;matchBase;maxDepth;nobrace;nocase;nodir;noext;noglobstar;pattern;platform;realpath;scurry;stat;signal;windowsPathsNoEscape;withFileTypes;includeChildMatches;opts;patterns;constructor(e,r){if(!r)throw new TypeError("glob options required");if(this.withFileTypes=!!r.withFileTypes,this.signal=r.signal,this.follow=!!r.follow,this.dot=!!r.dot,this.dotRelative=!!r.dotRelative,this.nodir=!!r.nodir,this.mark=!!r.mark,r.cwd?(r.cwd instanceof URL||r.cwd.startsWith("file://"))&&(r.cwd=CT(r.cwd)):this.cwd="",this.cwd=r.cwd||"",this.root=r.root,this.magicalBraces=!!r.magicalBraces,this.nobrace=!!r.nobrace,this.noext=!!r.noext,this.realpath=!!r.realpath,this.absolute=r.absolute,this.includeChildMatches=r.includeChildMatches!==!1,this.noglobstar=!!r.noglobstar,this.matchBase=!!r.matchBase,this.maxDepth=typeof r.maxDepth=="number"?r.maxDepth:1/0,this.stat=!!r.stat,this.ignore=r.ignore,this.withFileTypes&&this.absolute!==void 0)throw new Error("cannot set absolute and withFileTypes:true");if(typeof e=="string"&&(e=[e]),this.windowsPathsNoEscape=!!r.windowsPathsNoEscape||r.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(e=e.map(c=>c.replace(/\\/g,"/"))),this.matchBase){if(r.noglobstar)throw new TypeError("base matching requires globstar");e=e.map(c=>c.includes("/")?c:`./**/${c}`)}if(this.pattern=e,this.platform=r.platform||_T,this.opts={...r,platform:this.platform},r.scurry){if(this.scurry=r.scurry,r.nocase!==void 0&&r.nocase!==r.scurry.nocase)throw new Error("nocase option contradicts provided scurry option")}else{let c=r.platform==="win32"?ko:r.platform==="darwin"?Qi:r.platform?Eo:Ly;this.scurry=new c(this.cwd,{nocase:r.nocase,fs:r.fs})}this.nocase=this.scurry.nocase;let n=this.platform==="darwin"||this.platform==="win32",o={...r,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:n,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},i=this.pattern.map(c=>new Rt(c,o)),[s,a]=i.reduce((c,l)=>(c[0].push(...l.set),c[1].push(...l.globParts),c),[[],[]]);this.patterns=s.map((c,l)=>{let d=a[l];if(!d)throw new Error("invalid pattern object");return new Po(c,d,0,this.platform)})}async walk(){return[...await new es(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walk()]}walkSync(){return[...new es(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walkSync()]}stream(){return new ts(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).stream()}streamSync(){return new ts(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).streamSync()}iterateSync(){return this.streamSync()[Symbol.iterator]()}[Symbol.iterator](){return this.iterateSync()}iterate(){return this.stream()[Symbol.asyncIterator]()}[Symbol.asyncIterator](){return this.iterate()}}});var kp,Ep=D(()=>{Jr();kp=(t,e={})=>{Array.isArray(t)||(t=[t]);for(let r of t)if(new Rt(r,e).hasMagic())return!0;return!1}});function ac(t,e={}){return new er(t,e).streamSync()}function By(t,e={}){return new er(t,e).stream()}function Hy(t,e={}){return new er(t,e).walkSync()}async function Wy(t,e={}){return new er(t,e).walk()}function cc(t,e={}){return new er(t,e).iterateSync()}function qy(t,e={}){return new er(t,e).iterate()}var TT,RT,IT,$T,OT,sc,Gy=D(()=>{Jr();xp();Ep();Jr();xp();Ep();yp();TT=ac,RT=Object.assign(By,{sync:ac}),IT=cc,$T=Object.assign(qy,{sync:cc}),OT=Object.assign(Hy,{stream:ac,iterate:cc}),sc=Object.assign(Wy,{glob:Wy,globSync:Hy,sync:OT,globStream:By,stream:RT,globStreamSync:ac,streamSync:TT,globIterate:qy,iterate:$T,globIterateSync:cc,iterateSync:IT,Glob:er,hasMagic:kp,escape:yo,unescape:Xt});sc.glob=sc});import{existsSync as MT}from"fs";import DT from"path";var rs,Pp=D(()=>{"use strict";Le();Tr();Gy();rs=class extends ae{get definition(){return{name:"glob_search",description:"Fast file pattern matching using glob patterns. Returns matching file paths sorted by modification time.",parameters:{type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match files (e.g., "**/*.ts")'},path:{type:"string",description:"Directory to search in (default: current directory)"}},required:["pattern"]}}}async execute(e,r){let n=e.pattern,o=e.path||process.cwd();if(!n)return{content:"",isError:!0,error:"Pattern is required"};if(!MT(o))return{content:"",isError:!0,error:x(`Search directory not found: ${o}`,`\uAC80\uC0C9\uD560 \uB514\uB809\uD130\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4: ${o}`)};try{let i=await sc(n,{cwd:o,absolute:!0,nodir:!0,ignore:["**/node_modules/**","**/.git/**","**/dist/**"]});if(i.length===0)return{content:`No files found matching pattern: ${n}`};let s=i.map(c=>DT.relative(o,c));return{content:[`Found ${i.length} file(s) matching "${n}":`,"",...s].join(`
|
|
108
|
+
`)}}catch(i){return{content:"",isError:!0,error:x(`Glob search failed: ${i.message}`,`\uD30C\uC77C \uAC80\uC0C9\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4: ${i.message}`)}}}}});import{exec as LT}from"child_process";import{promisify as FT}from"util";var jT,ns,Ap=D(()=>{"use strict";Le();Oi();jT=FT(LT),ns=class extends ae{get definition(){return{name:"grep_search",description:"Search file contents using regular expressions. Supports ripgrep-style options.",parameters:{type:"object",properties:{pattern:{type:"string",description:"Regular expression pattern to search for"},path:{type:"string",description:"File or directory to search in (default: current directory)"},output_mode:{type:"string",enum:["content","files_with_matches","count"],description:"Output format (default: content)"},ignore_case:{type:"boolean",description:"Case insensitive search"},context:{type:"number",description:"Context lines around match"},show_line_numbers:{type:"boolean",description:"Show line numbers (default: true)"}},required:["pattern"]}}}async execute(e,r){let n=e.pattern,o=e.path||".",i=e.output_mode||"content",s=e.ignore_case,a=e.context,c=e.show_line_numbers!==!1;if(!n)return{content:"",isError:!0,error:"Pattern is required"};let l=["grep"];s&&l.push("-i"),c&&l.push("-n"),i==="files_with_matches"?l.push("-l"):i==="count"&&l.push("-c"),a&&l.push("-C",a.toString()),l.push("-E",n),l.push("-r"),l.push("--include=*.{ts,tsx,js,jsx,json,yaml,yml,md,txt}"),l.push("--exclude-dir=node_modules"),l.push("--exclude-dir=.git"),l.push("--exclude-dir=dist"),l.push(o);let d=l.join(" ");try{let{stdout:p}=await jT(d,{maxBuffer:10485760,cwd:process.cwd()});if(!p)return{content:`No matches found for pattern: ${n}`};let{text:u}=_r(p,{maxLines:200,keepTail:!1,hint:"\uD328\uD134\uC744 \uC881\uD788\uAC70\uB098 \uACBD\uB85C\uB97C \uC9C0\uC815\uD574 \uB2E4\uC2DC \uAC80\uC0C9\uD560 \uAC83."});return{content:u}}catch(p){return p.code===1?{content:`No matches found for pattern: ${n}`}:{content:"",isError:!0,error:p.message}}}}});var os,Cp=D(()=>{"use strict";Le();Tr();os=class extends ae{get definition(){return{name:"web_fetch",description:"Fetch content from a URL. Returns the page text with HTML tags stripped.",parameters:{type:"object",properties:{url:{type:"string",description:"The URL to fetch"},max_length:{type:"number",description:"Maximum characters to return (default: 20000)"}},required:["url"]}}}async execute(e,r){let n=e.url,o=e.max_length??2e4;if(!n)return{content:"",isError:!0,error:"url is required"};try{let i;try{i=await fetch(n,{headers:{"User-Agent":"Mozilla/5.0 (compatible; ProtocolCLI/1.0)",Accept:"text/html,application/xhtml+xml,text/plain"},signal:AbortSignal.timeout(15e3)})}catch(l){return{content:"",isError:!0,error:x(`Could not reach the page (network/timeout): ${l.message}`,`\uC6F9 \uD398\uC774\uC9C0\uC5D0 \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C/\uC2DC\uAC04\uCD08\uACFC): ${l.message}`)}}if(!i.ok)return{content:"",isError:!0,error:`HTTP ${i.status}: ${i.statusText}`};let s=i.headers.get("content-type")??"",a=await i.text(),c;return s.includes("text/html")?c=this.stripHtml(a):c=a,c=c.replace(/\n{3,}/g,`
|
|
109
|
+
|
|
110
|
+
`).trim(),c.length>o&&(c=c.slice(0,o)+`
|
|
111
|
+
|
|
112
|
+
[... truncated at ${o} chars]`),{content:`<url>${n}</url>
|
|
113
|
+
|
|
114
|
+
${c}`}}catch(i){return{content:"",isError:!0,error:x(`Failed to fetch the page: ${i.message}`,`\uC6F9 \uD398\uC774\uC9C0\uB97C \uAC00\uC838\uC624\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4: ${i.message}`)}}}stripHtml(e){let r=e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,"").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"");return r=r.replace(/<\/?(p|div|h[1-6]|li|tr|br|hr|blockquote|pre)[^>]*>/gi,`
|
|
115
|
+
`),r=r.replace(/<[^>]+>/g,""),r=r.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/ /g," "),r}}});var is,_p=D(()=>{"use strict";Le();Tr();is=class extends ae{get definition(){return{name:"web_search",description:"Search the web using DuckDuckGo. Returns top results with titles and URLs.",parameters:{type:"object",properties:{query:{type:"string",description:"Search query"},max_results:{type:"number",description:"Maximum number of results to return (default: 8)"}},required:["query"]}}}async execute(e,r){let n=e.query,o=e.max_results??8;if(!n)return{content:"",isError:!0,error:"query is required"};try{let s=`https://api.duckduckgo.com/?q=${encodeURIComponent(n)}&format=json&no_html=1&skip_disambig=1`,a;try{a=await fetch(s,{headers:{"User-Agent":"ProtocolCLI/1.0"},signal:AbortSignal.timeout(1e4)})}catch(p){return{content:"",isError:!0,error:x(`Could not reach the search server (network/timeout): ${p.message}`,`\uAC80\uC0C9 \uC11C\uBC84\uC5D0 \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C/\uC2DC\uAC04\uCD08\uACFC): ${p.message}`)}}if(!a.ok)return{content:"",isError:!0,error:x(`Search server error (HTTP ${a.status}): ${a.statusText}`,`\uAC80\uC0C9 \uC11C\uBC84 \uC624\uB958 (HTTP ${a.status}): ${a.statusText}`)};let c=await a.json(),l=[];c.Text&&c.FirstURL&&l.push({text:c.Text,url:c.FirstURL});for(let p of c.RelatedTopics??[]){if(l.length>=o)break;p.Text&&p.FirstURL&&l.push({text:p.Text,url:p.FirstURL});for(let u of p.Topics??[]){if(l.length>=o)break;u.Text&&u.FirstURL&&l.push({text:u.Text,url:u.FirstURL})}}if(l.length===0)return{content:x(`No results found for: "${n}"
|
|
116
|
+
|
|
117
|
+
Try a more specific query, or use web_fetch with a known URL.`,`\uC77C\uCE58\uD558\uB294 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4: "${n}"
|
|
118
|
+
|
|
119
|
+
\uB354 \uAD6C\uCCB4\uC801\uC778 \uAC80\uC0C9\uC5B4\uB97C \uC785\uB825\uD558\uAC70\uB098 \uD2B9\uC815 URL\uC744 web_fetch \uB85C \uC870\uD68C\uD558\uC138\uC694.`)};let d=l.map((p,u)=>`${u+1}. ${p.text}
|
|
120
|
+
${p.url}`).join(`
|
|
121
|
+
|
|
122
|
+
`);return{content:`Search results for: "${n}"
|
|
123
|
+
|
|
124
|
+
${d}`}}catch(i){return{content:"",isError:!0,error:x(`Search failed: ${i.message}`,`\uAC80\uC0C9 \uCC98\uB9AC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4: ${i.message}`)}}}}});var Vy,zy=D(()=>{"use strict";Vy={Read:{name:"Read",description:"Read file contents",parameters:{type:"object",properties:{file_path:{type:"string"}},required:["file_path"]}},Write:{name:"Write",description:"Write content to file",parameters:{type:"object",properties:{file_path:{type:"string"},content:{type:"string"}},required:["file_path","content"]}},Edit:{name:"Edit",description:"Edit file with string replacement",parameters:{type:"object",properties:{file_path:{type:"string"},old_string:{type:"string"},new_string:{type:"string"},replace_all:{type:"boolean"}},required:["file_path","old_string","new_string"]}},Bash:{name:"Bash",description:"Execute bash command",parameters:{type:"object",properties:{command:{type:"string"},timeout:{type:"number"},description:{type:"string"},run_in_background:{type:"boolean"}},required:["command"]}},Glob:{name:"Glob",description:"Find files matching pattern",parameters:{type:"object",properties:{pattern:{type:"string"},path:{type:"string"}},required:["pattern"]}},Grep:{name:"Grep",description:"Search file contents",parameters:{type:"object",properties:{pattern:{type:"string"},path:{type:"string"},output_mode:{type:"string"},type:{type:"string"}},required:["pattern"]}},Agent:{name:"Agent",description:"Launch a sub-agent for complex tasks",parameters:{type:"object",properties:{prompt:{type:"string"},subagent_type:{type:"string"},description:{type:"string"},model:{type:"string"}},required:["prompt","subagent_type"]}}}});var UT,uc,lc,Ky,Jy=D(()=>{"use strict";zy();UT={Explore:["read_file","glob_search","grep_search","git_diff","web_fetch","web_search","Skill"],Plan:["read_file","glob_search","grep_search","git_diff","web_fetch","web_search","plan","ask_user","Skill"],Verification:["bash","read_file","glob_search","grep_search","git_diff","web_fetch","web_search","Skill"],"general-purpose":["read_file","write_file","edit_file","bash","glob_search","grep_search","git_diff","web_fetch","web_search","plan","debate","ask_user","Skill","cowork_artifacts_list","cowork_artifact_move","cowork_artifact_rename"]},uc=class{static getAllowedTools(e){let r=UT[e]||[];return new Set(r)}static getToolSpecs(e){let r=this.getAllowedTools(e);return Object.values(Vy).filter(n=>r.has(n.name))}static createConfig(e,r){return{type:e,description:r.description,allowedTools:this.getAllowedTools(e),maxTurns:r.maxTurns??50,model:r.model??"default",isolation:r.isolation??"none"}}static isToolAllowed(e,r){return this.getAllowedTools(e).has(r)}},lc=`
|
|
125
|
+
ACCURACY RULES (mandatory):
|
|
126
|
+
- Negative claims ("X is dead" / "unused" / "has no caller" / "not referenced") are your most
|
|
127
|
+
common error. Before asserting one: read the target file, then attach the grep/read output
|
|
128
|
+
that proves it. If you did not run the search, write "unchecked" \u2014 never "confirmed".
|
|
129
|
+
Recommend deletion only after proving every symbol in that file is unreferenced (deletion is
|
|
130
|
+
irreversible \u2014 a "dead" file may actually be live under a stale filename).
|
|
131
|
+
- Severity claims ("locks"/"leaks"/"broken"/"requires reload") must name the exact trigger AND
|
|
132
|
+
the recovery/escape path. If any recovery path exists, do not say "permanent".
|
|
133
|
+
- Every claim needs file:line + a concrete failure scenario. Mark partial confirmation as
|
|
134
|
+
PLAUSIBLE and state what you'd need to confirm. No speculation, no style nits.`,Ky={Explore:`You are an exploration agent. Your job is to search and understand codebases.
|
|
135
|
+
- Use read_file, glob_search, grep_search to explore the codebase
|
|
136
|
+
- Use git_diff to see uncommitted changes
|
|
137
|
+
- Use web_fetch and web_search for external documentation
|
|
138
|
+
- Provide clear summaries of findings
|
|
139
|
+
- Do NOT make any modifications to files
|
|
140
|
+
- Do NOT execute shell commands
|
|
141
|
+
${lc}`,Plan:`You are a planning agent. Your job is to analyze requirements and create implementation plans.
|
|
142
|
+
- Use read_file, glob_search, grep_search to understand the codebase
|
|
143
|
+
- Use plan to author the plan document and gate it on approval
|
|
144
|
+
- Use ask_user to clarify requirements
|
|
145
|
+
- Create detailed, step-by-step implementation plans
|
|
146
|
+
- Identify potential risks and dependencies
|
|
147
|
+
- Do NOT make any modifications to files
|
|
148
|
+
- Do NOT execute shell commands
|
|
149
|
+
${lc}`,Verification:`You are a verification agent. Your job is to test and verify implementations.
|
|
150
|
+
- Use bash to run tests and verification commands
|
|
151
|
+
- Use read_file to examine test results
|
|
152
|
+
- Use git_diff to see exactly what changed
|
|
153
|
+
- Report clear pass/fail results
|
|
154
|
+
- Identify any issues or regressions
|
|
155
|
+
${lc}`,"general-purpose":`You are a general-purpose agent. You can use most tools but cannot spawn sub-agents.
|
|
156
|
+
- Complete the assigned task using available tools
|
|
157
|
+
- Report progress and results clearly
|
|
158
|
+
- Ask for clarification if needed
|
|
159
|
+
${lc}`}});import{EventEmitter as WT}from"events";function pc(t){dc.emit("sub",t)}function Yy(t){return dc.on("sub",t),()=>{dc.off("sub",t)}}var dc,Tp=D(()=>{"use strict";dc=new WT;dc.setMaxListeners(50)});function Rp(t,e){fc=t,ss=e}function Ip(t){as=t}function BT(t){let e=t??{},r=e.file_path??e.path??e.command??e.pattern??e.query??e.url??"";return r?String(r).slice(0,100):""}function Co(t){return t>=1e3?`${(t/1e3).toFixed(1)}K`:String(t)}var fc,ss,as,Xy,$r,_o=D(()=>{"use strict";Le();Jy();Tp();Tr();fc=null,ss=null;as=null;Xy=["general-purpose","Explore","Plan","Verification"];$r=class extends ae{get definition(){return{name:"agent",description:"Launch a specialized sub-agent to handle a complex task autonomously. The agent runs its own LLM + tool loop and returns a result. Use this to parallelize work or delegate complex sub-tasks.",parameters:{type:"object",properties:{prompt:{type:"string",description:"The task for the sub-agent to perform"},subagent_type:{type:"string",enum:["general-purpose","Explore","Plan","Verification"],description:'Type of sub-agent: "Explore" (read-only codebase exploration), "Plan" (analysis + planning, no file writes), "Verification" (run tests + verify), "general-purpose" (all tools except agent)'},description:{type:"string",description:"Brief description of what the agent will do (3-5 words)"},model:{type:"string",enum:["heavy","default","light"],description:"Model tier to use (heavy: \uBCF5\uC7A1\uD55C \uC791\uC5C5, default: \uC77C\uBC18, light: \uBE60\uB978 \uBC18\uBCF5)"},provider:{type:"string",enum:["server","local"],description:'Where the sub-agent runs: "server" (Protocol) or "local" (your own OpenAI-compatible server). Default server.'}},required:["prompt","subagent_type"]}}}async execute(e,r){if(!fc||!ss)return{content:"",isError:!0,error:"Agent tool not initialized. Call setAgentContext() in bootstrap."};let n=e.prompt,o=e.subagent_type??"general-purpose",i=e.model??"default";if(!n)return{content:"",isError:!0,error:"prompt is required"};if(!Xy.includes(o))return{content:"",isError:!0,error:`Invalid subagent_type: ${o}. Must be one of: ${Xy.join(", ")}`};if(i==="light"&&["general-purpose","Verification"].includes(o))return{content:"",isError:!0,error:`'light' tier cannot run a '${o}' sub-agent (it has file-write/shell access). Use 'default' or 'heavy', or choose a read-only type (Explore/Plan).`};let a=["heavy","default","light"].includes(i)?i:"default",c=uc.getAllowedTools(o),l=fc.getAllToolDefinitions().filter(I=>c.has(I.name)),d=Ky[o],p=e.provider==="local"?"local":"server",u=ss.getProvider(p);if(!u)return{content:"",isError:!0,error:`${p} provider not available`};if(p==="local"&&typeof u.isAvailable=="function"&&!await u.isAvailable().catch(()=>!1)&&(p="server",u=ss.getProvider(p),!u))return{content:"",isError:!0,error:`${p} provider not available`};let f=[{role:"user",content:n}],m=20,h="",w=!1,b="",k=`sub_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,v=r?.context?.signal,C=I=>pc({id:k,type:"activity",name:o,agentType:o,persist:!1,line:I});pc({id:k,type:"spawn",name:o,agentType:o,persist:!1,line:n});try{for(let N=0;N<m;N++){if(v?.aborted||as&&await as()){h="(cancelled)";break}let G=Date.now();C(x("Thinking\u2026","\uC0DD\uAC01\uD558\uB294 \uC911\u2026"));let $;try{$=await u.generate(f,{model:a,systemPrompt:d,tools:l,maxTokens:8192,signal:v?.controller.signal})}catch(q){if(v?.aborted)break;if(p==="local"&&!w){w=!0;let re=q instanceof Error?q.message:String(q),oe=ss.getProvider("server");if(oe){p="server",u=oe,b=x(`\u26A0 local model failed (${re}) \u2014 automatically retried on the Protocol server`,`\u26A0 \uB85C\uCEEC \uBAA8\uB378 \uC2E4\uD328(${re}) \u2014 Protocol \uC11C\uBC84\uB85C \uC790\uB3D9 \uC7AC\uC2DC\uB3C4\uD588\uC2B5\uB2C8\uB2E4`),C(b),N--;continue}}throw q}let j=((Date.now()-G)/1e3).toFixed(1),Y=$.usage,we=Y&&(Y.inputTokens>0||Y.outputTokens>0)?x(` \xB7 input ${Co(Y.inputTokens)} \xB7 output ${Co(Y.outputTokens)}${Y.thoughtsTokens?` \xB7 think ${Co(Y.thoughtsTokens)}`:""}`,` \xB7 \uC785\uB825 ${Co(Y.inputTokens)} \xB7 \uCD9C\uB825 ${Co(Y.outputTokens)}${Y.thoughtsTokens?` \xB7 \uCD94\uB860 ${Co(Y.thoughtsTokens)}`:""}`):"";if(C(x(`thought ${j}s`,`\uC0DD\uAC01 ${j}\uCD08`)+we),h=$.content,!$.toolCalls||$.toolCalls.length===0)break;f.push({role:"assistant",content:$.content,toolCalls:$.toolCalls});let B=[];for(let q of $.toolCalls){if(v?.aborted||as&&await as()){B.push({toolCallId:q.id,content:"(cancelled \u2014 \uC911\uB2E8)",isError:!0});continue}if(!c.has(q.name)){B.push({toolCallId:q.id,content:`Tool '${q.name}' is not allowed for ${o} sub-agents.`,isError:!0});continue}let re=BT(q.arguments);C(`${q.name}${re?` ${re}`:""}`);try{let oe=await fc.executeTool(q.name,q.arguments,r);B.push({toolCallId:q.id,content:oe.content||oe.error||"",isError:oe.isError})}catch(oe){B.push({toolCallId:q.id,content:oe.message,isError:!0})}}f.push({role:"tool",content:B.map(q=>`[${q.toolCallId}]: ${q.content}`).join(`
|
|
160
|
+
|
|
161
|
+
`),toolResults:B})}let I=h||"(no output)";return{content:b?`${I}
|
|
162
|
+
|
|
163
|
+
${b}`:I}}finally{pc({id:k,type:"done",name:o,agentType:o,persist:!1})}}}});import{execSync as Qy}from"child_process";var cs,$p=D(()=>{"use strict";Le();cs=class extends ae{get definition(){return{name:"git_diff",description:"Show the current git diff \u2014 all uncommitted changes in the working tree. Use this to see exactly what code was modified before reviewing it.",parameters:{type:"object",properties:{staged:{type:"boolean",description:"Show staged (indexed) changes instead of unstaged working tree"},path:{type:"string",description:"Limit diff to a specific file or directory path"}},required:[]}}}async execute(e,r){try{let n=e.staged?"--staged":"",o=e.path?`-- ${e.path}`:"",i=`git diff ${n} ${o}`.trim(),s=Qy(i,{encoding:"utf-8",cwd:process.cwd(),stdio:["pipe","pipe","pipe"]});if(!s.trim()){let a=Qy("git diff --staged",{encoding:"utf-8",cwd:process.cwd(),stdio:["pipe","pipe","pipe"]});return a.trim()?{content:`Staged changes:
|
|
164
|
+
|
|
165
|
+
${a}`}:{content:"No changes detected in working tree or staging area."}}return{content:s}}catch(n){return{content:`git diff failed: ${n.message}`,isError:!0}}}}});var hc,Zy=D(()=>{"use strict";ge();hc=class{server;constructor(e){this.server=e}resolveModel(e){return e==="@heavy"?"heavy":e==="@default"?"default":e==="@light"?"light":e}async conductDebate(e){let r=Date.now(),n=[],o=await this.runRound(e,1,e.participants);n.push(o);let i=1,s=this.evaluateConsensus(o.responses,e.consensusThreshold||.7);for(;!s.reached&&i<e.maxRounds;){i++;let c=await this.runRound(e,i,e.participants,n);n.push(c),s=this.evaluateConsensus(c.responses,e.consensusThreshold||.7)}let a=s.reached?s:await this.synthesizeConclusion(n,e);return{topic:e.topic,rounds:n,consensus:a,participants:e.participants,totalTime:Date.now()-r}}async runRound(e,r,n,o){let i=[],s=this.buildRoundContext(e,r,o);for(let a of n){let c=this.buildSystemPrompt(a,r,e),l=[{role:"system",content:c},{role:"user",content:s}],d={model:this.resolveModel(a.model),systemPrompt:c,maxTokens:2e3,temperature:.7},p=await this.server.generate(l,d);i.push(this.parseResponse(p.content,a))}return{round:r,responses:i}}buildSystemPrompt(e,r,n){let o={roundtable:"\uBAA8\uB4E0 \uCC38\uAC00\uC790\uAC00 \uC758\uACAC\uC744 \uACF5\uC720\uD558\uACE0 \uD1A0\uB860\uD569\uB2C8\uB2E4. ",adversarial:"\uAC01 \uCC38\uAC00\uC790\uAC00 \uB2E4\uB978 \uC785\uC7A5\uC744 \uAC00\uC9C0\uACE0 \uC8FC\uC7A5\uD569\uB2C8\uB2E4. ",panel:"\uAC01 \uCC38\uAC00\uC790\uAC00 \uC790\uC2E0\uC758 \uC804\uBB38 \uBD84\uC57C\uC5D0\uC11C \uBD84\uC11D\uD569\uB2C8\uB2E4. "};return`\uB2F9\uC2E0\uC740 \uD1A0\uB860\uC758 ${e.perspective} \uC804\uBB38\uAC00\uC785\uB2C8\uB2E4.
|
|
166
|
+
|
|
167
|
+
${o[n.format]}
|
|
168
|
+
|
|
169
|
+
\uD1A0\uB860 \uC8FC\uC81C: "${n.topic}"
|
|
170
|
+
|
|
171
|
+
${r>1?"\uC774\uC804 \uB77C\uC6B4\uB4DC\uB4E4\uC758 \uC758\uACAC\uC744 \uACE0\uB824\uD558\uC5EC \uC751\uB2F5\uD574 \uC8FC\uC138\uC694.":"\uC774\uAC83\uC740 \uCCAB \uBC88\uC9F8 \uB77C\uC6B4\uB4DC\uC785\uB2C8\uB2E4."}
|
|
172
|
+
|
|
173
|
+
\uC790\uC2E0\uC758 \uBD84\uC11D\uACFC \uC8FC\uC7A5\uC744 \uC790\uC2E0\uC758 \uAD00\uC810\uC5D0\uC11C \uB17C\uB9AC\uC801\uC73C\uB85C \uC8FC\uC7A5\uD558\uC138\uC694. \uC911\uC694\uD55C \uC810\uB4E4\uC744 \uD3EC\uD568\uD558\uC138\uC694:
|
|
174
|
+
1. \uACB0\uB860 (\uD55C \uBB38\uC7A5)
|
|
175
|
+
2. 2-3\uAC1C \uD575\uC2EC \uD3EC\uC778\uD2B8
|
|
176
|
+
3. \uC2E0\uB8B0\uB3C4 (0-1)
|
|
177
|
+
|
|
178
|
+
\uB2F9\uC2E0\uC758 \uAD00\uC810\uC5D0\uC11C \uC751\uB2F5\uD558\uC138\uC694. \uAE30\uC874 \uAD00\uC810\uC744 \uC720\uC9C0\uD558\uC138\uC694.`}buildRoundContext(e,r,n){let o=`\uB77C\uC6B4\uB4DC ${r}
|
|
179
|
+
|
|
180
|
+
`;if(o+=`\uD1A0\uB860 \uC8FC\uC81C: "${e.topic}"`,e.context&&(o+=`
|
|
181
|
+
|
|
182
|
+
\uCEE8\uD14D\uC2A4\uD2B8:
|
|
183
|
+
${e.context}
|
|
184
|
+
`),n&&n.length>0){o+=`
|
|
185
|
+
|
|
186
|
+
\uC774\uC804 \uB77C\uC6B4\uB4DC \uC694\uC57D:
|
|
187
|
+
`;for(let i of n){o+=`
|
|
188
|
+
\uB77C\uC6B4\uB4DC ${i.round}:
|
|
189
|
+
`;for(let s of i.responses){let a=e.participants.find(c=>c.model===s.participantId);o+=`- ${s.participantId} (${a?.perspective||"unknown"}): ${s.content}
|
|
190
|
+
`}}}return o}parseResponse(e,r){let n=.7,o=e.match(/신뢰도[:\s]*(\d+\.?\d*)|확신[:\s]*(\d+\.?\d*)/i);o&&(n=Math.min(1,Math.max(0,parseFloat(o[1]||o[2]||"0.7"))));let i="neutral";e.includes("\uCC2C\uC131")||e.includes("\uB3D9\uC758")||e.includes("\uC9C0\uC9C0")?i="support":(e.includes("\uBC18\uB300")||e.includes("\uC6B0\uB824")||e.includes("\uB2E8\uC810"))&&(i="oppose");let s=[],a=e.matchAll(/[0-9]+\.\s+[^\n]+/g);for(let c of a)s.push(c[0].trim());return{participantId:r.model,content:e,confidence:n,arguments:s,stance:i}}evaluateConsensus(e,r){let o=e.filter(s=>s.stance==="support").length/e.length;if(o>=r){let s=e.flatMap(c=>c.arguments),a=this.findCommonElements(s);return{reached:!0,conclusion:`\uB2E4\uC218 \uB3D9\uC758 \uB3C4\uB2EC: ${a.join(", ")}`,confidence:o,agreements:a,disagreements:[]}}let i=e.filter(s=>s.stance==="oppose").flatMap(s=>s.arguments);return{reached:!1,conclusion:"\uD569\uC758\uC5D0 \uB3C4\uB2EC\uD558\uC9C0 \uBABB\uD568",confidence:o,agreements:e.filter(s=>s.stance==="support").flatMap(s=>s.arguments),disagreements:i}}async synthesizeConclusion(e,r){let n=e.map(s=>`\uB77C\uC6B4\uB4DC ${s.round}:
|
|
191
|
+
`+s.responses.map(a=>`- ${a.participantId} (${a.stance}, \uC2E0\uB8B0\uB3C4 ${a.confidence}): ${a.content}`).join(`
|
|
192
|
+
`)).join(`
|
|
193
|
+
|
|
194
|
+
`),o=`\uB2F9\uC2E0\uC740 \uB2E4\uC911 \uBAA8\uB378 \uD1A0\uB860\uC758 \uCD5C\uACE0 \uC2EC\uD310\uC785\uB2C8\uB2E4. \uC544\uB798 "${r.topic}" \uD1A0\uB860 \uAE30\uB85D\uC744 \uAC80\uD1A0\uD558\uACE0 \uCD5C\uC885 \uD569\uC758\uB97C \uC885\uD569\uD558\uC138\uC694.
|
|
195
|
+
|
|
196
|
+
${n}
|
|
197
|
+
|
|
198
|
+
\uBC18\uB4DC\uC2DC \uC544\uB798 JSON \uD615\uC2DD\uC73C\uB85C\uB9CC \uB2F5\uD558\uC138\uC694:
|
|
199
|
+
{
|
|
200
|
+
"reached": true | false,
|
|
201
|
+
"conclusion": "\uCD5C\uC885 \uACB0\uB860 (2-3\uBB38\uC7A5)",
|
|
202
|
+
"confidence": 0.0~1.0,
|
|
203
|
+
"agreements": ["\uD569\uC758\uB41C \uD575\uC2EC \uD3EC\uC778\uD2B8", ...],
|
|
204
|
+
"disagreements": ["\uB0A8\uC740 \uC7C1\uC810", ...]
|
|
205
|
+
}`;try{let a=(await this.server.generate([{role:"user",content:o}],{model:be.models.orchSentinel,maxTokens:1500,temperature:.2})).content.match(/\{[\s\S]*\}/);if(a){let c=JSON.parse(a[0]);return{reached:!!c.reached,conclusion:c.conclusion??"",confidence:typeof c.confidence=="number"?c.confidence:.5,agreements:c.agreements??[],disagreements:c.disagreements??[]}}}catch{}let i=[...new Set(e.flatMap(s=>s.responses).flatMap(s=>s.arguments))].slice(0,5);return{reached:!1,conclusion:`\uD1A0\uB860 \uACB0\uACFC: ${i.join(", ")}`,confidence:.5,agreements:i,disagreements:[]}}findCommonElements(e){let r={};for(let n of e){let o=n.toLowerCase().trim();r[o]=(r[o]||0)+1}return Object.entries(r).filter(([,n])=>n>=2).map(([n])=>n).slice(0,5)}}});var HT,ls,Op=D(()=>{"use strict";Le();mo();Zy();HT=[{model:"@heavy",perspective:"\uBE44\uD310\uC801 \uBD84\uC11D (\uB9AC\uC2A4\uD06C\xB7\uC5E3\uC9C0\uCF00\uC774\uC2A4)"},{model:"@default",perspective:"\uC2E4\uC6A9\uC801 \uAD6C\uD604 (\uC18D\uB3C4\xB7\uB2E8\uC21C\uC131)"}],ls=class extends ae{get definition(){return{name:"debate",description:"Run a multi-model debate for a genuinely hard, ambiguous, or high-stakes decision. Multiple models argue different perspectives over rounds, then the orchestrator synthesizes a final consensus. Use sparingly \u2014 only when a single answer is risky and multiple viewpoints materially help (e.g. architecture choices, irreversible trade-offs).",parameters:{type:"object",properties:{topic:{type:"string",description:"The question or decision to debate"},format:{type:"string",enum:["roundtable","adversarial","panel"],description:"Debate format (default: adversarial)"},context:{type:"string",description:"Optional background/context for the debate"},maxRounds:{type:"number",description:"Max debate rounds (default: 2)"}},required:["topic"]}}}async execute(e,r){let n=e.topic;if(!n)return{content:"",isError:!0,error:"topic is required"};let o=e.format??"adversarial",i=e.context,s=typeof e.maxRounds=="number"?e.maxRounds:NaN,a=Number.isFinite(s)?Math.max(1,Math.min(5,Math.floor(s))):2;try{let l=await new hc(new jt).conductDebate({topic:n,format:o,maxRounds:a,participants:HT,context:i}),d=l.consensus,p=[`\uD1A0\uB860 \uC8FC\uC81C: ${l.topic}`,`\uB77C\uC6B4\uB4DC: ${l.rounds.length} | \uD569\uC758: ${d.reached?"\uB3C4\uB2EC":"\uBBF8\uB3C4\uB2EC"} (\uC2E0\uB8B0\uB3C4 ${d.confidence.toFixed(2)})`,"",`\uACB0\uB860: ${d.conclusion}`];return d.agreements.length&&p.push("","\uD569\uC758\uC810:",...d.agreements.map(u=>` - ${u}`)),d.disagreements.length&&p.push("","\uC7C1\uC810:",...d.disagreements.map(u=>` - ${u}`)),{content:p.join(`
|
|
206
|
+
`)}}catch(c){return{content:"",isError:!0,error:`Debate failed: ${c.message}`}}}}});import qt from"node:fs";import To from"node:path";function VT(t){for(let e=0;e<t.length;e+=1){let r=t.charCodeAt(e);if(r<=31||r===127)return!0}return!1}function Mp(t){return typeof t=="string"&&qT.test(t)}function Dp(t){return typeof t=="string"&&t.trim().length>0&&t.trim().length<=GT&&!VT(t)}function mc(t,e){return t!==void 0&&!Mp(t)?"provider profile id is invalid":e!==void 0&&!Dp(e)?"provider profile label is invalid":e!==void 0&&t===void 0?"provider profile label requires a provider profile id":null}function Tn(){let t;try{t=JSON.parse(qt.readFileSync(Np(),"utf8"))}catch{return[]}return Array.isArray(t)?t.filter(e=>{if(!e||typeof e!="object")return!1;let r=e;return Mp(r.id)&&["claude","codex","gemini","agy"].includes(String(r.provider))&&Dp(r.label)&&typeof r.configDir=="string"&&!r.configDir.includes("\0")&&To.isAbsolute(r.configDir)}):[]}function us(){return Tn().filter(({provider:t})=>t!=="agy").map(({id:t,provider:e,label:r})=>({id:t,provider:e,label:r.trim()}))}function eb(t){if(t.provider==="agy")throw new Error("AGY isolated profiles are unsupported; use active-local.");if(!Mp(t.id))throw new Error("profile id must use letters, numbers, dot, underscore, or dash");if(!Dp(t.label))throw new Error("profile label must be 1-80 characters without control characters");if(t.configDir.includes("\0")||!To.isAbsolute(t.configDir))throw new Error("config directory must be an absolute path");let e=To.resolve(t.configDir);if(e===To.parse(e).root||e===Ee())throw new Error("config directory must be a dedicated directory");let r=Tn();if(r.some(s=>s.id===t.id))throw new Error(`profile '${t.id}' already exists`);if(qt.existsSync(e)&&!qt.statSync(e).isDirectory())throw new Error("config path exists and is not a directory");qt.existsSync(e)||qt.mkdirSync(e,{recursive:!0,mode:448});let n=r;n.push({...t,label:t.label.trim(),configDir:e});let o=Np();qt.mkdirSync(To.dirname(o),{recursive:!0,mode:448});let i=`${o}.${process.pid}.tmp`;qt.writeFileSync(i,JSON.stringify(n,null,2),{mode:384}),qt.renameSync(i,o),qt.chmodSync(o,384)}function tb(t){let e=Tn(),r=e.filter(i=>i.id!==t);if(r.length===e.length)return!1;let n=Np(),o=`${n}.${process.pid}.tmp`;return qt.writeFileSync(o,JSON.stringify(r,null,2),{mode:384}),qt.renameSync(o,n),qt.chmodSync(n,384),!0}function ds(t,e,r=process.env){if(!e||e==="active-local")return{...r};if(t==="agy")throw new Error("AGY isolated profiles are unsupported; use active-local.");let n=Tn().find(i=>i.id===e);if(!n||n.provider!==t)throw new Error(`Provider profile '${e}' is not registered for ${t}.`);let o={...r};return t==="claude"&&(o.CLAUDE_CONFIG_DIR=n.configDir),t==="codex"&&(o.CODEX_HOME=n.configDir),t==="gemini"&&(o.GEMINI_CLI_HOME=n.configDir),o}var qT,GT,Np,Rn=D(()=>{"use strict";Lt();qT=/^[a-zA-Z0-9._-]{1,64}$/,GT=80;Np=()=>To.join(Ee(),"provider-profiles.json")});import*as In from"path";function rb(t){return String(t??"").trim()}function zT(t,e){if(e===t)return!0;let r=t.endsWith(In.sep)?t:t+In.sep;return e.startsWith(r)}function Ro(t,e){let r=In.resolve(e),n=Array.isArray(t?.commands)?t.commands:[],o=Array.isArray(t?.paths)?t.paths:[],i=n.map(a=>rb(typeof a=="string"?a:"")).filter(a=>a.length>0),s=o.filter(a=>typeof a=="string"&&a.trim().length>0).map(a=>In.resolve(r,a.trim()));return{declared:!!t&&(n.length>0||o.length>0),commands:i,paths:s.length>0?s:[r],root:r}}function Lp(t,e){let r=rb(e);return t.commands.includes(r)?{allowed:!0}:{allowed:!1,violation:{kind:"command",needed:{commands:[r]},reason:t.commands.length===0?`\uC774 \uB2E8\uACC4\uB294 \uC178 \uBA85\uB839\uC774 \uC2B9\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uD544\uC694\uD55C \uBA85\uB839: \`${r}\``:`\uC2B9\uC778\uB41C \uBA85\uB839\uC774 \uC544\uB2D9\uB2C8\uB2E4. \uD544\uC694\uD55C \uBA85\uB839: \`${r}\` (\uC2B9\uC778\uB41C \uAC83: ${t.commands.map(n=>`\`${n}\``).join(", ")})`}}}function nb(t,e){let r=In.resolve(e);return t.paths.some(n=>zT(n,r))?{allowed:!0}:{allowed:!1,violation:{kind:"path",needed:{paths:[r]},reason:`\uC2B9\uC778\uB41C \uBC94\uC704 \uBC16 \uC4F0\uAE30\uC785\uB2C8\uB2E4: ${r} (\uC2B9\uC778\uB41C \uBC94\uC704: ${t.paths.join(", ")})`}}}function ib(t,e){let r=i=>(i??[]).filter(s=>typeof s=="string"&&s.trim().length>0),n=r(e.paths),o=r(t?.paths);return n.length===0||o.length>0?{...e}:{...e,paths:[ob,...n]}}function sb(t,e){let r=(s,a)=>{let c=[...s??[],...a??[]].filter(l=>typeof l=="string"&&l.trim().length>0);if(c.length!==0)return Array.from(new Set(c))},n=r(t?.commands,e?.commands),o=r(t?.paths,e?.paths),i={};return n&&(i.commands=n),o&&(i.paths=o),i}function ps(t,e="en"){let r=t?.commands?.filter(s=>s&&s.trim())??[],n=t?.paths?.filter(s=>s&&s.trim())??[];if(r.length===0&&n.length===0)return e==="ko"?"\uAD8C\uD55C \uBBF8\uC120\uC5B8 \u2014 \uC178 \uAE08\uC9C0, \uC4F0\uAE30\uB294 \uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354 \uC548\uC73C\uB85C \uC81C\uD55C":"no declaration \u2014 shell blocked, writes limited to the project folder";let o=n.map(s=>s.trim()===ob?e==="ko"?"\uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354":"project folder":s),i=[];return e==="ko"?(i.push(r.length?`\uBA85\uB839 ${r.length}\uAC1C`:"\uC178 \uAE08\uC9C0"),i.push(o.length?`\uC4F0\uAE30: ${o.join(", ")}`:"\uC4F0\uAE30: \uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354")):(i.push(r.length?`${r.length} command(s)`:"no shell"),i.push(o.length?`writes: ${o.join(", ")}`:"writes: project folder")),i.join(" \xB7 ")}var ob,Zr=D(()=>{"use strict";ob="."});import $n from"node:fs";import{randomUUID as ab}from"node:crypto";import{dirname as KT,join as fs}from"node:path";function wc(t){try{return JSON.parse($n.readFileSync(t,"utf8"))}catch(e){if(e.code==="ENOENT")return;throw new Error("Pending result evidence is unreadable; preserve it for reconciliation.")}}function YT(){let t=wc(JT());if(t===void 0)return[];if(!Array.isArray(t))throw new Error("Legacy pending result evidence requires reconciliation.");return t}function Fp(t){let e=t;return!!e&&typeof e.planId=="string"&&typeof e.stepId=="string"&&typeof e.success=="boolean"&&typeof e.savedAt=="string"}function jp(){let t;try{t=$n.readdirSync(gc())}catch(e){if(e.code==="ENOENT")return[];throw e}return t.filter(e=>/^[a-f0-9-]{36}\.json$/.test(e)).sort().map(e=>({path:fs(gc(),e),value:wc(fs(gc(),e))})).filter(e=>e.value!==void 0)}function cb(t,e){$n.mkdirSync(KT(t),{recursive:!0,mode:448});let r=`${t}.${ab()}.tmp`;$n.writeFileSync(r,JSON.stringify(e,null,2),{encoding:"utf8",mode:384});try{$n.linkSync(r,t)}catch(n){if(n.code!=="EEXIST")throw n}finally{$n.unlinkSync(r)}}function lb(t){let e=jp(),r=e.find(({value:i})=>Fp(i)&&Up(i.id)&&On(i.owner,t.owner)&&i.planId===t.planId&&i.stepId===t.stepId&&i.success===t.success&&i.result===t.result)?.value;if(r)return r;let n=e.reduce((i,{value:s})=>{if(!Fp(s)||!On(s.owner,t.owner))return i;let a=Date.parse(s.savedAt);return Number.isFinite(a)?Math.max(i,a+1):i},Date.now()),o={...t,...t.owner?{owner:{...t.owner}}:{},id:ab(),savedAt:new Date(n).toISOString()};return cb(Wp(o.id),o),o}function ub(t,e){if(!t.id||!On(t.owner,t.owner))throw new Error("Pending result has no bound owner; reconciliation required.");let r=`${Wp(t.id)}.commit`;cb(r,e);let n=wc(r);if(!n||n.id!==e.id||n.plan_id!==t.planId||n.author_id!==t.owner.uid||n.type!=="result"||n.diff?.stepId!==t.stepId||n.diff?.success!==t.success||n.diff?.result!==t.result)throw new Error("Pending result receipt mismatch; reconciliation required.");return n}function Bp(t){if(!t.id)return;let e=Wp(t.id),r=wc(e);if(JSON.stringify(r)===JSON.stringify(t))try{$n.unlinkSync(e)}catch(n){if(n.code!=="ENOENT")throw n}}async function db(t,e){let r=YT(),n=0,o=jp().filter(({value:i})=>Fp(i)&&Up(i.id)&&On(i.owner,e)).map(({value:i})=>i).sort((i,s)=>i.savedAt.localeCompare(s.savedAt));for(let i of o)try{await t(i),Bp(i),n++}catch{break}return{flushed:n,remaining:r.length+jp().length}}var JT,gc,Up,Wp,On,pb=D(()=>{"use strict";Lt();JT=()=>fs(Ee(),"runner-result-outbox.json"),gc=()=>fs(Ee(),"runner-result-outbox"),Up=t=>typeof t=="string"&&/^[a-f0-9-]{36}$/.test(t),Wp=t=>{if(!Up(t))throw new Error("Invalid pending result identity");return fs(gc(),`${t}.json`)},On=(t,e)=>!!t?.uid&&!!t.endpoint&&!!e?.uid&&!!e.endpoint&&t.uid===e.uid&&t.endpoint===e.endpoint});import{createHash as hb,randomUUID as fb}from"crypto";import{execSync as XT}from"child_process";import{basename as QT}from"path";function Hp(){let t=process.cwd();try{let n=XT("git rev-parse --show-toplevel",{cwd:t,stdio:["ignore","pipe","ignore"]}).toString().trim();n&&(t=n)}catch{}let e=QT(t)||t;return{id:hb("sha256").update(t).digest("hex").slice(0,16),name:e,path:t}}function bc(){return{steps:[]}}function ZT(t,e){let r={steps:t.steps.map(i=>({...i})),notes:t.notes?[...t.notes]:void 0},n=e.diff,o=i=>r.steps.find(s=>s.id===i);switch(e.type){case"init":return bc();case"step_add":n.step&&r.steps.push(n.step);break;case"approval_request":{let i=o(n.stepId);i&&(i.status="awaiting_approval",n.scopeRequest&&(i.scopeRequest=n.scopeRequest));break}case"approve":{let i=o(n.stepId);i&&i.status!=="executing"&&i.status!=="done"&&i.status!=="failed"&&(i.status="approved",i.approvedAt=e.created_at,i.scopeRequest&&(i.scope=sb(i.scope,i.scopeRequest),delete i.scopeRequest));break}case"reject":{let i=o(n.stepId);i&&(i.status="rejected");break}case"execute":{let i=o(n.stepId);i&&(i.status="executing");break}case"change":{let i=o(n.stepId);i&&(i.changes=[...i.changes??[],...n.changes??[]]);break}case"result":{let i=o(n.stepId);i&&(i.status=n.success?"done":"failed",i.result=n.result);break}case"note":{let i=n?.text??e.message;i&&(r.notes=[...r.notes??[],i]);break}}return r}function yc(t){return t.reduce(ZT,bc())}function qp(t,e){let r=t.steps.find(n=>n.id===e);return!!r&&r.status!=="pending"&&r.status!=="awaiting_approval"&&r.status!=="rejected"}var kt,Mn=D(()=>{"use strict";ze();ge();Rn();Zr();pb();kt=class{config=new K;client=new ve(this.config);owner;constructor(){let{session:e,endpoint:r}=this.config.resolveCredentials();this.owner=e?.user.id&&r?Object.freeze({uid:e.user.id,endpoint:r}):void 0}assertOwner(){if(!this.owner)throw new Error("Plan store owner unavailable. Sign in and start a fresh owned context.");let{session:e,endpoint:r}=this.config.resolveCredentials();if(!On(this.owner,e?{uid:e.user.id,endpoint:r}:void 0))throw new Error("Plan store account or endpoint changed. Restore its original account, or start a fresh store for new work.");return this.owner}uid(){return this.assertOwner().uid}async apiJson(e,r){let n=await this.client.request(e,r,this.assertOwner());if(this.assertOwner(),!n.ok)throw Object.assign(new Error(`plans API ${r?.method??"GET"} ${e} failed (${n.status}): ${await n.text().catch(()=>"")}`),{status:n.status});let o=await n.json();return this.assertOwner(),o}async readPlanDoc(e){try{return(await this.apiJson(`/api/user-data/cli_plans/${encodeURIComponent(e)}`)).item??null}catch(r){if(r.status===404)return null;throw r}}async writePlanDoc(e,r){await this.apiJson(`/api/user-data/cli_plans/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(r)})}async patchPlanDoc(e,r,n){let o=n?`?expect=${encodeURIComponent(JSON.stringify(n))}`:"";try{return await this.apiJson(`/api/user-data/cli_plans/${encodeURIComponent(e)}${o}`,{method:"PATCH",body:JSON.stringify(r)}),!0}catch(i){let s=i.status;if(s===404||s===409)return!1;throw i}}async appendCommitDoc(e,r,n){await this.apiJson(`/api/cli-plan-commits/${encodeURIComponent(e)}/${encodeURIComponent(r)}`,{method:"PUT",body:JSON.stringify(n)})}async loadCommits(e){return[...(await this.apiJson(`/api/cli-plan-commits/${encodeURIComponent(e)}`)).items??[]].sort((n,o)=>String(n.created_at).localeCompare(String(o.created_at)))}commitId(e,r,n,o,i){let s=`${i??""}
|
|
207
|
+
${e??""}
|
|
208
|
+
${r}
|
|
209
|
+
${n}
|
|
210
|
+
${JSON.stringify(o)}
|
|
211
|
+
${Date.now()}`;return hb("sha256").update(s).digest("hex").slice(0,16)}async commit(e,r,n,o={},i="ai"){let a=(await this.readPlanDoc(e))?.head_commit_id??null,c=this.commitId(a,r,n,o,e),l=await this.loadCommits(e),d=l.length>0?Date.parse(l[l.length-1].created_at):0,p=new Date(Math.max(Date.now(),Number.isFinite(d)?d+1:0)).toISOString(),u={id:c,plan_id:e,parent_id:a,author_type:i,author_id:this.uid(),type:r,message:n,diff:o,created_at:p};await this.appendCommitDoc(e,c,u);let f=yc([...l,u]);return await this.patchPlanDoc(e,{state:f,head_commit_id:c,updated_at:new Date().toISOString()}),u}async createPlan(e,r){let n=fb();return await this.writePlanDoc(n,{title:e,goal:r??null,status:"draft",state:bc(),head_commit_id:null,updated_at:new Date().toISOString(),project:Hp()}),await this.commit(n,"init",`\uAE30\uD68D\uC11C \uC0DD\uC131: ${e}`,{title:e,goal:r}),this.getPlan(n)}async createDispatchedPlan(e,r){let n=e.providerProfileId!==void 0||e.providerProfileLabel!==void 0,o=e.brain==="claude"||e.brain==="agy"||e.brain==="codex"||e.brain==="gemini";if(n&&!o)throw new Error("provider profile metadata requires an external BYO brain");let i=mc(e.providerProfileId,e.providerProfileLabel);if(i)throw new Error(i);let s=fb();return await this.writePlanDoc(s,{title:e.title,goal:e.goal,status:"requested",state:bc(),head_commit_id:null,updated_at:new Date().toISOString(),project:e.project,cwd:e.cwd,agentId:e.agentId,dispatchedByPlanId:r.planId,orchestratorAgentId:r.orchestratorAgentId,...e.brain?{brain:e.brain}:{},...e.targetDeviceId?{targetDeviceId:e.targetDeviceId}:{},...o&&e.providerProfileId?{providerProfileId:e.providerProfileId}:{},...o&&e.providerProfileLabel?{providerProfileLabel:e.providerProfileLabel.trim()}:{},...e.autoApprove?{autoApprove:!0}:{},...e.mode?{mode:e.mode}:{},...e.modeReason?{modeReason:e.modeReason}:{},...e.access?{access:e.access}:{},...e.projectInstructions?{projectInstructions:e.projectInstructions}:{}}),await this.commit(s,"init",`\uAE30\uD68D\uC11C \uC0DD\uC131(\uBD84\uBC30): ${e.title}`,{title:e.title,goal:e.goal,dispatchedByPlanId:r.planId,orchestratorAgentId:r.orchestratorAgentId}),s}async addStep(e,r){let n=this.commitId(null,"step",r.title,r,e).slice(0,8),o={id:n,title:r.title,detail:r.detail,status:"pending",requiresApproval:r.requiresApproval??!0};return r.scope&&((r.scope.commands?.length??0)>0||(r.scope.paths?.length??0)>0)&&(o.scope=r.scope),await this.commit(e,"step_add",`\uB2E8\uACC4 \uCD94\uAC00: ${r.title}`,{step:o}),n}async requestApproval(e,r){await this.commit(e,"approval_request",`\uC2B9\uC778 \uC694\uCCAD: ${r}`,{stepId:r})}async requestScopeAmendment(e,r,n,o){let s=((await this.getPlan(e)).state?.steps??[]).find(c=>c.id===r)?.scope,a={...ib(s,n),reason:o,at:new Date().toISOString()};await this.commit(e,"approval_request",`\uCD94\uAC00 \uAD8C\uD55C \uC2B9\uC778 \uC694\uCCAD: ${r}`,{stepId:r,scopeRequest:a})}async approve(e,r){await this.commit(e,"approve",`\uC2B9\uC778: ${r}`,{stepId:r},"user")}async reject(e,r,n){await this.commit(e,"reject",`\uBC18\uB824: ${r}`,{stepId:r,reason:n},"user")}async getVerifiedPlan(e){let r=await this.getPlan(e),n=yc(await this.loadCommits(e));return{...r,state:n}}async claimPlan(e,r,n=12e4){if(!r)return!1;let o={ownerDeviceId:r,leaseUntil:new Date(Date.now()+n).toISOString()};try{let i=await this.readPlanDoc(e);if(!i)return!1;let s=typeof i.ownerDeviceId=="string"?i.ownerDeviceId:"",a=typeof i.leaseUntil=="string"?Date.parse(i.leaseUntil):0;return s&&s!==r&&Number.isFinite(a)&&a>Date.now()?!1:await this.patchPlanDoc(e,o,{ownerDeviceId:s||null,leaseUntil:i.leaseUntil||null})}catch{return!1}}async releasePlan(e,r){let n={ownerDeviceId:"",leaseUntil:new Date(0).toISOString()};try{await this.patchPlanDoc(e,n,{ownerDeviceId:r})}catch{}}async startStep(e,r){let n=await this.getVerifiedPlan(e);if(!qp(n.state,r))throw new Error(`step ${r} is not approved`);await this.commit(e,"execute",`\uC2E4\uD589 \uC2DC\uC791: ${r}`,{stepId:r})}async autoApproveStep(e,r){await this.commit(e,"approve",`\uC790\uB3D9 \uC2B9\uC778(autoApprove): ${r}`,{stepId:r,auto:!0},"user")}async recordChange(e,r,n,o){await this.commit(e,"change",o??`\uBCC0\uACBD ${n.length}\uAC74: ${r}`,{stepId:r,changes:n})}async recordResultRemote(e){if(!On(e.owner,this.assertOwner())||!e.id)throw new Error("Pending result owner mismatch; preserve for reconciliation.");let{planId:r,stepId:n,success:o,result:i}=e,s=await this.readPlanDoc(r);if(!s)throw new Error("Result plan unavailable; preserve the pending result.");let a=await this.loadCommits(r),c=a.length?Date.parse(a[a.length-1].created_at):0,l=ub(e,{id:e.id,plan_id:r,parent_id:s.head_commit_id??null,author_type:"ai",author_id:this.uid(),type:"result",message:`\uACB0\uACFC(${o?"\uC131\uACF5":"\uC2E4\uD328"}): ${n}`,diff:{stepId:n,success:o,...i===void 0?{}:{result:i}},created_at:new Date(Math.max(Date.now(),Number.isFinite(c)?c+1:0)).toISOString()}),d=a.find(u=>u.id===l.id);if(d&&(d.author_id!==l.author_id||d.type!=="result"||d.plan_id!==r||d.diff.stepId!==n||d.diff.success!==o||d.diff.result!==i))throw new Error("Result commit conflict; preserve the pending result for reconciliation.");d||await this.appendCommitDoc(r,l.id,l);let p=d?a:[...a,l].sort((u,f)=>u.created_at.localeCompare(f.created_at));if(!await this.patchPlanDoc(r,{state:yc(p),head_commit_id:p[p.length-1]?.id??l.id,updated_at:new Date().toISOString()}))throw new Error("Result projection not acknowledged; preserve the pending result.")}async recordResult(e,r,n,o){let i=lb({owner:this.owner,planId:e,stepId:r,success:n,...o===void 0?{}:{result:o}});try{await this.recordResultRemote(i),Bp(i)}catch(s){console.error(`\uACB0\uACFC \uC800\uC7A5\uC744 \uBCF4\uB958\uD588\uC2B5\uB2C8\uB2E4(${e}/${r}) \u2014 \uC5F0\uACB0 \uBCF5\uAD6C \uD6C4 \uC790\uB3D9 \uC7AC\uC2DC\uB3C4\uD569\uB2C8\uB2E4:`,s.message)}}async flushPendingResults(){return db(e=>this.recordResultRemote(e),this.owner)}async setStyleSpec(e,r){await this.patchPlanDoc(e,{styleSpec:r,updated_at:new Date().toISOString()})}async note(e,r){await this.commit(e,"note",r,{text:r})}async getPlan(e){let r=await this.readPlanDoc(e);if(!r)throw Object.assign(new Error(`getPlan failed: ${e} not found`),{code:"PLAN_NOT_FOUND",status:404});return{id:e,...r}}async log(e){return this.loadCommits(e)}async listPlans(){return(await this.listPlanDocsViaApi()).map(r=>({id:r.id,...r.data})).sort((r,n)=>String(n.updated_at??"").localeCompare(String(r.updated_at??"")))}async listPlanDocsViaApi(){return((await this.apiJson("/api/user-data/cli_plans?limit=2000")).items??[]).filter(r=>r.deleted!==!0&&typeof r.id=="string").map(r=>({id:r.id,data:r}))}async updatePlanStatus(e,r){if(!await this.readPlanDoc(e))throw new Error(`updatePlanStatus failed: ${e} not found`);await this.patchPlanDoc(e,{status:r,updated_at:new Date().toISOString()})}async startCommand(e){if(!await this.readPlanDoc(e))throw new Error(`startCommand failed: ${e} not found`);await this.patchPlanDoc(e,{status:"running",started_at:new Date().toISOString(),updated_at:new Date().toISOString()})}async finishCommand(e,r,n){if(!await this.readPlanDoc(e))throw new Error(`finishCommand failed: ${e} not found`);await this.patchPlanDoc(e,{status:r,commandResult:n,updated_at:new Date().toISOString()})}async reconcilePlan(e){let r=await this.readPlanDoc(e);if(!r)throw new Error(`reconcilePlan failed: ${e} not found`);let n=await this.loadCommits(e),o=yc(n),i=n.length>0?n[n.length-1].id:null,s={state:o,head_commit_id:i,updated_at:new Date().toISOString()};return await this.patchPlanDoc(e,s),{id:e,...r,...s}}}});function hs(t){return{content:t}}function Dn(t){return{content:"",isError:!0,error:t}}var ms,Gp=D(()=>{"use strict";Le();Mn();Zr();ms=class extends ae{get definition(){return{name:"plan",description:"Author a step-by-step plan document and gate work on approval. Use for non-trivial tasks: create a plan, add steps one at a time (each needs approval), then request approval. Work only proceeds on approved steps. Every action is recorded immutably (git-style).",parameters:{type:"object",properties:{action:{type:"string",enum:["create","add_step","request_approval","status","note"],description:"create: new plan (title, goal). add_step: append a step (planId, title, detail). request_approval: ask the user to approve a step (planId, stepId). status: show current steps & statuses (planId). note: record a note (planId, text)."},planId:{type:"string",description:"Plan id (required except for create)"},title:{type:"string",description:"Plan title (create) or step title (add_step)"},goal:{type:"string",description:"What the plan aims to achieve (create)"},detail:{type:"string",description:"Step detail \u2014 what & why (add_step)"},stepId:{type:"string",description:"Step id (request_approval)"},text:{type:"string",description:"Note text (note)"},commands:{type:"array",items:{type:"string"},description:'add_step: the EXACT shell commands this step is allowed to run. Matched by exact string \u2014 "npm test" does not permit "npm test --coverage". Omit if the step needs no shell. A step can never run a command that is not listed here.'},paths:{type:"array",items:{type:"string"},description:"add_step: directory subtrees this step may write to (relative to the project root, or absolute). Defaults to the whole project root when omitted. File edits are recoverable via git, so a scope is enough here \u2014 unlike shell commands, which must be pinned exactly."}},required:["action"]}}}async execute(e,r){let n=e.action;try{let o=new kt;switch(n){case"create":{let i=e.title;if(!i)return Dn("title is required for create");let s=await o.createPlan(i,e.goal);return hs(`\uAE30\uD68D\uC11C \uC0DD\uC131\uB428
|
|
212
|
+
planId: ${s.id}
|
|
213
|
+
\uC81C\uBAA9: ${s.title}`)}case"add_step":{let i=e.planId,s=e.title;if(!i||!s)return Dn("planId and title are required for add_step");let a=u=>Array.isArray(u)?u.filter(f=>typeof f=="string"&&f.trim().length>0):void 0,c={},l=a(e.commands),d=a(e.paths);l?.length&&(c.commands=l),d?.length&&(c.paths=d);let p=await o.addStep(i,{title:s,detail:e.detail,scope:c});return hs(`\uB2E8\uACC4 \uCD94\uAC00\uB428
|
|
214
|
+
stepId: ${p}
|
|
215
|
+
\uC81C\uBAA9: ${s}
|
|
216
|
+
\uAD8C\uD55C: ${ps(c,"ko")}`)}case"request_approval":{let i=e.planId,s=e.stepId;return!i||!s?Dn("planId and stepId are required for request_approval"):(await o.requestApproval(i,s),hs(`\uC2B9\uC778 \uC694\uCCAD\uB428: ${s} (\uC2B9\uC778 \uC804\uAE4C\uC9C0 \uC2E4\uD589 \uBCF4\uB958)`))}case"status":{let i=e.planId;if(!i)return Dn("planId is required for status");let s=await o.getPlan(i),a=[`\uAE30\uD68D\uC11C: ${s.title} [${s.status}]`];for(let c of s.state.steps??[])a.push(` - [${c.status}] ${c.title}${c.requiresApproval?"":" (\uC2B9\uC778\uBD88\uC694)"}`),a.push(` \uAD8C\uD55C: ${ps(c.scope,"ko")}`),c.scopeRequest&&a.push(` \u26A0 \uCD94\uAC00 \uAD8C\uD55C \uC694\uCCAD \uB300\uAE30: ${c.scopeRequest.reason??""}`);return hs(a.join(`
|
|
217
|
+
`))}case"note":{let i=e.planId,s=e.text;return!i||!s?Dn("planId and text are required for note"):(await o.note(i,s),hs("\uAE30\uB85D\uB428"))}default:return Dn(`unknown action: ${n}`)}}catch(o){return Dn(`plan tool failed: ${o.message}`)}}}});var gs,Vp=D(()=>{"use strict";Le();gs=class extends ae{get definition(){return{name:"ask_user",description:"Ask the user for confirmation or additional information before proceeding with a dangerous or ambiguous action.",parameters:{type:"object",properties:{question:{type:"string",description:"The question or confirmation message to show to the user."},type:{type:"string",enum:["confirm","text"],description:'Type of interaction: "confirm" for Yes/No, "text" for free-form input.',default:"confirm"}},required:["question"]}}}async execute(e,r){let n=e.question,o=e.type||"confirm";return{content:"",isError:!0,error:`ask_user\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: \uD604\uC7AC \uC2E4\uD589 \uBAA8\uB4DC\uC5D0\uB294 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C8\uBB38\uC744 \uB744\uC6B0\uACE0 \uC751\uB2F5\uC744 \uBC1B\uC744 \uC778\uD130\uB799\uD2F0\uBE0C \uCC44\uB110\uC774 \uC5C6\uC2B5\uB2C8\uB2E4(\uBB34\uC778/\uD5E4\uB4DC\uB9AC\uC2A4 \uC2E4\uD589). \uC0AC\uC6A9\uC790\uAC00 \uC2B9\uC778\uD55C \uAC83\uC73C\uB85C \uAC00\uC815\uD558\uC9C0 \uB9D0\uACE0, \uAC00\uC7A5 \uC548\uC804\uD55C \uAE30\uBCF8\uAC12\uC73C\uB85C \uC9C4\uD589\uD558\uAC70\uB098 \uC548\uC804\uD558\uAC8C \uC911\uB2E8\uD558\uC138\uC694. (question: ${n}, type: ${o})`}}}});var ws,zp=D(()=>{"use strict";Le();ws=class extends ae{get definition(){return{name:"Skill",description:"Execute a predefined skill, workflow, or slash command to solve specific types of problems.",parameters:{type:"object",properties:{skill:{type:"string",description:'The name of the skill or command to invoke (e.g., "debug", "refactor", "analyze").'},args:{type:"string",description:"Arguments required for the skill."}},required:["skill"]}}}async execute(e,r){let n=e.skill,o=e.args||"";return r.context.knowledge+=`
|
|
218
|
+
[SYSTEM] Auto-invoked Skill: ${n} with args: ${o}`,{content:`[SKILL EXECUTED] The specialized skill '${n}' has been applied to the current context.
|
|
219
|
+
|
|
220
|
+
Agent, please analyze the situation again based on this new specialized approach. If the problem persists, prepare to escalate to a full DEBATE.`,isError:!1}}}});import ys from"node:fs";import{dirname as eR,join as tR}from"node:path";function gb(){try{let t=JSON.parse(ys.readFileSync(mb(),"utf8"));return Array.isArray(t)?t.filter(e=>{let r=e;return!!r&&typeof r.id=="string"&&!!r.id&&(r.body===void 0||typeof r.body=="string")&&!!r.metadata&&typeof r.metadata=="object"&&!Array.isArray(r.metadata)&&typeof r.savedAt=="string"}):[]}catch{return[]}}function wb(t){let e=mb();if(ys.mkdirSync(eR(e),{recursive:!0,mode:448}),t.length===0){try{ys.unlinkSync(e)}catch{}return}let r=`${e}.${process.pid}.tmp`;ys.writeFileSync(r,JSON.stringify(t,null,2),{encoding:"utf8",mode:384}),ys.renameSync(r,e)}function yb(t){let e=gb().filter(r=>r.id!==t.id);e.push({...t,savedAt:new Date().toISOString()}),wb(e)}async function bb(t,e){let r=gb(),n=0;for(let o of r)try{o.body!==void 0&&await t(o),await e(o),n+=1}catch{break}return wb(r.slice(n)),{flushed:n,remaining:r.length-n}}var mb,vb=D(()=>{"use strict";Lt();mb=()=>tR(Ee(),"cowork-artifact-outbox.json")});import{randomUUID as rR}from"crypto";function sR(t){let e=String(t??"");return e?Buffer.byteLength(e,"utf8"):0}function aR(t,e,r=iR){return t==="embed"||t==="file"?!1:String(e??"").length>r}function cR(t,e=oR){let r=String(t??"").replace(/\s+/g," ").trim();return r.length>e?`${r.slice(0,e)}\u2026`:r}function lR(t,e=nR){let r=String(t??"");return r.length<=e?{content:r,truncated:!1}:{content:r.slice(0,e),truncated:!0}}function nt(t){return!t||t===xb?null:t.startsWith(Kp)?t.slice(Kp.length):null}function Sc(t){return t===xb||!!t&&t.startsWith(Kp)}function uR(t){return t==="text"||t==="html"||t==="embed"||t==="file"?t:"markdown"}function xc(t){let e=String(t??"").toLowerCase();return e.endsWith(".html")||e.endsWith(".htm")?"html":e.endsWith(".md")||e.endsWith(".markdown")?"markdown":"text"}function pR(t,e={}){if(!t.length)return"";let r=(e.lang??"ko")==="ko",n=e.max??Sb,o=t.slice(0,n),i=r?"\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC774\uBBF8 \uC788\uB294 \uC791\uC5C5\uBB3C:":"Deliverables already in this project:",s=o.map(l=>{let d=dR[l.status][r?"ko":"en"];return`- ${l.name} (${d}) \u2014 ${l.summary}`}),a=[i,...s];t.length>n&&a.push(r?`(\uADF8 \uC678 ${t.length-n}\uAC74\uC740 \uAE38\uC774 \uB54C\uBB38\uC5D0 \uBE90\uC2B5\uB2C8\uB2E4.)`:`(${t.length-n} more left out for length.)`);let c=o.filter(l=>l.status==="changes_requested"&&l.reviewNote?.trim());if(c.length){a.push("",r?"\uB2E4\uC74C \uC784\uBB34\uC5D0\uC11C \uBC18\uC601\uD560 \uD53C\uB4DC\uBC31 (\uC218\uC815 \uC694\uCCAD\uB41C \uC791\uC5C5\uBB3C):":"Feedback to address in the next task (deliverables sent back for changes):");for(let l of c)a.push(`- ${l.name}: ${l.reviewNote.trim()}`)}return a.join(`
|
|
221
|
+
`)}function wR(t){let e=String(t??"").trim();if(!e)return"";let[r,...n]=e.split(hR);if(n.length>0){let o=r.trim();if(o)return o.slice(0,Nn)}if(mR.test(e)){let o=e.split(/[-_]/),i=o.length;for(;i>1&&gR.test(o[i-1]);)i-=1;if(i<o.length)return o.slice(0,i).join("-").slice(0,Nn)}return""}function yR(t){let e=String(t.group??"").trim();return e?e.slice(0,Nn):wR(t.name)}function Et(t){return String(t??"").split(vc).map(e=>e.trim().slice(0,kb)).filter(Boolean).slice(0,fR)}function $t(t){return t.map(e=>e.trim()).filter(Boolean).join(vc).slice(0,Eb)}function bs(t){let e=String(t.folderPath??"").trim();if(e)return Et(e);let r=yR(t);return r?[r]:[]}function Io(t){if(!Array.isArray(t))return[];let e=new Set;for(let r of t){if(typeof r!="string")continue;let n=$t(Et(r));n&&e.add(n)}return Array.from(e).sort((r,n)=>r.localeCompare(n,void 0,{numeric:!0,sensitivity:"base"}))}function bR(t,e,r){let n=$t(e),o=$t(r);if(!n||n===o)return Io(t);let i=`${n}${vc}`;return Io(t.map(s=>s===n?o:s.startsWith(i)?o?`${o}${vc}${s.slice(i.length)}`:s.slice(i.length):s))}function vR(t,e,r=[]){let n=new Map;for(let o of Io(r)){let i=Et(o);if(i.length<=e.length||!e.every((a,c)=>i[c]===a))continue;let s=i[e.length];n.has(s)||n.set(s,{itemCount:0,pendingCount:0})}for(let o of t){let i=bs(o);if(i.length<=e.length)continue;let s=!0;for(let l=0;l<e.length;l+=1)if(i[l]!==e[l]){s=!1;break}if(!s)continue;let a=i[e.length],c=n.get(a)??{itemCount:0,pendingCount:0};c.itemCount+=1,o.status==="submitted"&&(c.pendingCount+=1),n.set(a,c)}return Array.from(n.entries()).map(([o,i])=>({name:o,path:[...e,o],itemCount:i.itemCount,pendingCount:i.pendingCount})).sort((o,i)=>o.pendingCount>0!=i.pendingCount>0?o.pendingCount>0?-1:1:o.name.localeCompare(i.name,void 0,{numeric:!0,sensitivity:"base"}))}function SR(t,e){return t.filter(r=>{let n=bs(r);return n.length===e.length&&n.every((o,i)=>o===e[i])})}function Pb(t,e,r){if(t.length<e.length)return null;for(let n=0;n<e.length;n+=1)if(t[n]!==e[n])return null;return[...r,...t.slice(e.length)]}function xR(t,e){let r=Et(e);if(!r.length)return null;let n=r[r.length-1],o=r.slice(0,-1),i=c=>{let l=bs(c);return l.length===o.length&&l.every((d,p)=>d===o[p])},s=t.find(c=>c.name===n&&i(c));if(s)return s;let a=n.toLowerCase();return t.find(c=>c.name.toLowerCase()===a&&i(c))??null}function Yp(t){return(t??new K).getSession()?.user?.id??null}async function $o(t,e,r){let o=await new ve(t).request(e,r);if(!o.ok)throw Object.assign(new Error(`cowork artifacts API ${r?.method??"GET"} ${e} failed (${o.status})`),{status:o.status});return await o.json()}async function Ab(t){return((await $o(t,"/api/user-data/cowork_artifacts?limit=5000")).items??[]).flatMap(r=>{let n=typeof r.id=="string"?r.id:"";if(!n)return[];let{id:o,...i}=r;return[{id:n,data:i}]})}function Mo(t){let e=t?.coworkProject;if(!(!e||typeof e.id!="string"||!e.id))return{id:e.id,...typeof e.name=="string"?{name:e.name}:{}}}function Cb(t,e){return{id:t,projectId:typeof e.projectId=="string"?e.projectId:"",...typeof e.agentId=="string"&&e.agentId?{agentId:e.agentId}:{},...typeof e.planId=="string"&&e.planId?{planId:e.planId}:{},name:typeof e.name=="string"?e.name:"",...typeof e.group=="string"&&e.group.trim()?{group:e.group.trim()}:{},...typeof e.folderPath=="string"&&e.folderPath.trim()?{folderPath:e.folderPath.trim()}:{},...Array.isArray(e.tags)&&e.tags.length?{tags:e.tags.filter(r=>typeof r=="string"&&r.trim().length>0)}:{},kind:uR(e.kind),content:typeof e.content=="string"?e.content:"",...e.hasBody===!0?{hasBody:!0}:{},...typeof e.contentBytes=="number"&&e.contentBytes>=0?{contentBytes:e.contentBytes}:{},...e.contentTruncated===!0?{contentTruncated:!0}:{},summary:typeof e.summary=="string"?e.summary:"",status:e.status==="approved"||e.status==="changes_requested"?e.status:"submitted",...typeof e.reviewNote=="string"&&e.reviewNote?{reviewNote:e.reviewNote}:{},...typeof e.reviewedAt=="string"&&e.reviewedAt?{reviewedAt:e.reviewedAt}:{},createdAt:typeof e.createdAt=="string"&&e.createdAt?e.createdAt:new Date().toISOString(),updatedAt:typeof e.updatedAt=="string"&&e.updatedAt?e.updatedAt:new Date().toISOString()}}async function kR(t,e){let r=Yp(e),n=nt(t?.id);if(!r||!n)return[];try{return(await Ab(e)).map(i=>Cb(i.id,i.data)).filter(i=>i.projectId===n).sort((i,s)=>(s.updatedAt||"").localeCompare(i.updatedAt||"")).slice(0,Sb)}catch(o){return console.error("\uC791\uC5C5\uBB3C \uBAA9\uB85D \uC870\uD68C \uC2E4\uD328 \u2014 \uB9E5\uB77D \uC5C6\uC774 \uC9C4\uD589\uD569\uB2C8\uB2E4:",o.message),[]}}async function kc(t,e={},r){let n=await kR(t,r);if(!n.length)return"";let o=pR(n.map(i=>({name:i.name,agentId:i.agentId,status:i.status,summary:i.summary,reviewNote:i.reviewNote})),e);return o?`
|
|
222
|
+
${o}
|
|
223
|
+
`:""}async function Do(t,e,r){let n=Yp(r),o=nt(t?.id);if(!(!n||!o))try{let{content:i,truncated:s}=lR(e.content);if(!i.trim())return;let a=new Date().toISOString(),c=rR(),l=e.kind??"text",d=aR(l,i),p={projectId:o,...e.agentId?{agentId:e.agentId}:{},...e.planId?{planId:e.planId}:{},name:e.name.trim().slice(0,200)||"untitled",...e.group?.trim()?{group:e.group.trim().slice(0,Nn)}:{},...e.folderPath?.trim()?{folderPath:$t(Et(e.folderPath))}:{},kind:l,...d?{hasBody:!0}:{content:i},contentBytes:sR(i),...s?{contentTruncated:!0}:{},summary:cR(i),status:"approved",createdAt:a,updatedAt:a};yb({id:c,...d?{body:i}:{},metadata:p}),(await Xp(r)).remaining>0&&console.error(`\uC791\uC5C5\uBB3C \uB4F1\uB85D\uC744 \uBCF4\uB958\uD588\uC2B5\uB2C8\uB2E4(${c}) \u2014 \uC5F0\uACB0 \uBCF5\uAD6C \uD6C4 \uC790\uB3D9 \uC7AC\uC2DC\uB3C4\uD569\uB2C8\uB2E4.`)}catch(i){console.error("\uC791\uC5C5\uBB3C \uB4F1\uB85D \uC2E4\uD328 \u2014 \uC2E4\uD589 \uACB0\uACFC \uC790\uCCB4\uB294 \uC774\uBBF8 \uAE30\uB85D\uB410\uC2B5\uB2C8\uB2E4:",i.message)}}async function Xp(t){return bb(async e=>{await $o(t,`/api/cowork-artifact-body/${encodeURIComponent(e.id)}`,{method:"PUT",body:JSON.stringify({content:e.body})})},async e=>{await $o(t,`/api/user-data/cowork_artifacts/${encodeURIComponent(e.id)}`,{method:"PUT",body:JSON.stringify(e.metadata)})})}async function Qp(t,e){let r=Yp(e);if(!r)throw new Error("\uB85C\uADF8\uC778 \uC138\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 protocol login \uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC138\uC694.");let n=nt(t?.id);if(!n)throw new Error("\uC774 \uC2E4\uD589\uC5D0\uB294 \uC5F0\uACB0\uB41C cowork \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC5B4 \uC791\uC5C5\uBB3C\uD568 \uD3F4\uB354\uB97C \uB2E4\uB8F0 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (\uBBF8\uBD84\uB958 \uD504\uB85C\uC81D\uD2B8\uC774\uAC70\uB098 \uC77C\uBC18 \uCF54\uB529 \uD50C\uB79C\uC785\uB2C8\uB2E4).");let i=(await Ab(e)).map(s=>Cb(s.id,s.data)).filter(s=>s.projectId===n);return{uid:r,projectId:n,artifacts:i}}async function _b(t,e,r){let n=await $o(r,`/api/cli-project-folders/${encodeURIComponent(e)}`);return Io(n.folders)}async function ER(t,e,r,n,o){await $o(n,`/api/cli-project-folders/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify({folders:Io(r),...o?{expectedFolders:Io(o)}:{}})})}async function Jp(t,e,r,n){let o=String(r??"").trim().slice(0,Eb);return await $o(n,`/api/user-data/cowork_artifacts/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({folderPath:o||null,updatedAt:new Date().toISOString()})}),o}async function Tb(t,e,r){let{uid:n,projectId:o,artifacts:i}=await Qp(t,r),s=Et(e),a=await _b(n,o,r),c=vR(i,s,a),l=SR(i,s).map(d=>({id:d.id,name:d.name,kind:d.kind,status:d.status,summary:d.summary})).sort((d,p)=>d.name.localeCompare(p.name,void 0,{numeric:!0,sensitivity:"base"}));return{path:s,folders:c,items:l}}async function Rb(t,e,r,n){let{uid:o,projectId:i,artifacts:s}=await Qp(t,n),a=$t(Et(r)),c=xR(s,e);if(c)return await Jp(o,c.id,a,n),{kind:"item",movedCount:1,to:a};let l=Et(e);if(!l.length)throw new Error(`\uACBD\uB85C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${e}`);let d=Et(a),p=0;for(let f of s){let m=Pb(bs(f),l,d);m!==null&&(await Jp(o,f.id,$t(m),n),p+=1)}let u=await Ib(o,i,l,d,n);if(p===0&&!u)throw new Error(`\uACBD\uB85C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${e}`);return{kind:"folder",movedCount:p,to:a}}async function Ib(t,e,r,n,o){let i=await _b(t,e,o),s=bR(i,r,n);return JSON.stringify(s)===JSON.stringify(i)?!1:(await ER(t,e,s,o,i),!0)}async function $b(t,e,r,n){let{uid:o,projectId:i,artifacts:s}=await Qp(t,n),a=Et(e);if(!a.length)throw new Error("\uD3F4\uB354 \uACBD\uB85C\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.");let c=String(r??"").trim().slice(0,kb);if(!c)throw new Error("\uC0C8 \uD3F4\uB354 \uC774\uB984\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.");let l=[...a.slice(0,-1),c],d=0;for(let u of s){let f=Pb(bs(u),a,l);f!==null&&(await Jp(o,u.id,$t(f),n),d+=1)}let p=await Ib(o,i,a,l,n);if(d===0&&!p)throw new Error(`\uD3F4\uB354\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${$t(a)}`);return{renamedCount:d,to:$t(l)}}var nR,oR,Sb,iR,Oo,Kp,xb,dR,Nn,vc,kb,Eb,fR,hR,mR,gR,Ot=D(()=>{"use strict";ge();ze();vb();nR=9e5,oR=200,Sb=20,iR=2e3;Oo=`\uC0B0\uCD9C\uBB3C \uC791\uC131 \uADDC\uCE59 (\uC791\uC5C5\uBB3C\uD568\uC5D0 \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC800\uC7A5\xB7\uB80C\uB354\uB428):
|
|
224
|
+
- \uB9C8\uD06C\uB2E4\uC6B4\uC73C\uB85C \uC791\uC131\uD55C\uB2E4.
|
|
225
|
+
- \uCCAB \uC904(\uC81C\uBAA9 \uC544\uB798)\uC5D0 \uD55C \uC904 \uC694\uC57D\uC744 \uB454\uB2E4.
|
|
226
|
+
- \uB9C1\uD06C\uB294 \uBC18\uB4DC\uC2DC [\uD45C\uC2DC\uD14D\uC2A4\uD2B8](URL) \uD615\uC2DD\uC73C\uB85C \uC4F4\uB2E4 \u2014 URL\uC744 \uADF8\uB300\uB85C \uB178\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4.
|
|
227
|
+
- \uD45C\uB294 4\uC5F4 \uC774\uD558\uB85C \uC881\uAC8C \uB9CC\uB4E0\uB2E4(\uBAA8\uBC14\uC77C \uBDF0\uC5B4 \uACE0\uB824).
|
|
228
|
+
- \uACFC\uC7A5\uD558\uAC70\uB098 \uC9C0\uC5B4\uB0B8 \uC218\uCE58\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC0AC\uC2E4\uB9CC \uC801\uB294\uB2E4.
|
|
229
|
+
- \uC0B0\uCD9C\uBB3C\uC774 \uC5EC\uB7EC \uD30C\uC77C\uC774\uBA74 \uBAA9\uB85D\uC73C\uB85C \uC815\uB9AC\uD55C\uB2E4.`,Kp="cowork-",xb="cowork";dR={submitted:{ko:"\uC81C\uCD9C\uB428",en:"submitted"},approved:{ko:"\uC2B9\uC778\uB428",en:"approved"},changes_requested:{ko:"\uC218\uC815 \uC694\uCCAD\uB428",en:"changes requested"}};Nn=80,vc="/",kb=Nn,Eb=400,fR=8,hR=/\s·\s/,mR=/^[A-Za-z0-9]+(?:[-_][A-Za-z0-9]+)+$/,gR=/^(?:\d+|en|ko)$/i});var vs,Zp=D(()=>{"use strict";Le();Ot();vs=class extends ae{get definition(){return{name:"cowork_artifacts_list",description:'List the deliverables box (cowork_artifacts) folder tree for the current cowork project. Pass no path (or "") for the root. Returns subfolders (with item counts; folders the user pre-created in the web UI show as empty) and the artifacts sitting directly at that path \u2014 use this before move/rename to see what exists and where. Only works inside a cowork execution (a project must be attached).',parameters:{type:"object",properties:{path:{type:"string",description:'Folder path to list, e.g. "\uBE0C\uB79C\uB4DC/og". Omit or "" for the root.'}},required:[]}}}async execute(e,r){let n=Mo(r.context);if(!n)return{content:"",isError:!0,error:"\uC774 \uC2E4\uD589\uC5D0\uB294 cowork \uD504\uB85C\uC81D\uD2B8 \uB9E5\uB77D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4(\uC77C\uBC18 \uCF54\uB529 \uD50C\uB79C\uC774\uAC70\uB098 \uBBF8\uBD84\uB958 \uD504\uB85C\uC81D\uD2B8) \u2014 \uC791\uC5C5\uBB3C\uD568 \uD3F4\uB354\uB97C \uB2E4\uB8F0 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."};let o=typeof e.path=="string"?e.path:"";try{let i=await Tb(n,o),s=[`\uACBD\uB85C: /${i.path.join("/")}`];if(i.folders.length){s.push("\uD3F4\uB354:");for(let a of i.folders)s.push(a.itemCount===0?` - ${a.name}/ (\uBE48 \uD3F4\uB354)`:` - ${a.name}/ (${a.itemCount}\uAC74${a.pendingCount?`, \uBBF8\uAC80\uD1A0 ${a.pendingCount}\uAC74`:""})`)}if(i.items.length){s.push("\uC791\uC5C5\uBB3C:");for(let a of i.items)s.push(` - ${a.name} [${a.kind}/${a.status}] \u2014 ${a.summary||"(\uC694\uC57D \uC5C6\uC74C)"}`)}return!i.folders.length&&!i.items.length&&s.push("(\uBE44\uC5B4 \uC788\uC74C)"),{content:s.join(`
|
|
230
|
+
`)}}catch(i){return{content:"",isError:!0,error:i.message}}}}});var Ss,ef=D(()=>{"use strict";Le();Ot();Ss=class extends ae{get definition(){return{name:"cowork_artifact_move",description:'Move one deliverable or one whole folder within the cowork deliverables box. "from" resolves to a single artifact by path first (last segment = name, prefix = folder); if no artifact matches, "from" is treated as a folder and everything under it (recursively) is moved. Only works inside a cowork execution (a project must be attached).',parameters:{type:"object",properties:{from:{type:"string",description:'Source path \u2014 an artifact path (e.g. "\uBE0C\uB79C\uB4DC/og/students-og") or a folder path (e.g. "\uBE0C\uB79C\uB4DC/og").'},to:{type:"string",description:'Destination folder path (e.g. "\uBE0C\uB79C\uB4DC/og-\uCE74\uB4DC"). "" moves to the root.'}},required:["from","to"]}}}async execute(e,r){let n=Mo(r.context);if(!n)return{content:"",isError:!0,error:"\uC774 \uC2E4\uD589\uC5D0\uB294 cowork \uD504\uB85C\uC81D\uD2B8 \uB9E5\uB77D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4(\uC77C\uBC18 \uCF54\uB529 \uD50C\uB79C\uC774\uAC70\uB098 \uBBF8\uBD84\uB958 \uD504\uB85C\uC81D\uD2B8) \u2014 \uC791\uC5C5\uBB3C\uD568 \uD3F4\uB354\uB97C \uB2E4\uB8F0 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."};let o=typeof e.from=="string"?e.from.trim():"",i=typeof e.to=="string"?e.to:"";if(!o)return{content:"",isError:!0,error:"from \uC740 \uD544\uC218\uC785\uB2C8\uB2E4."};try{let s=await Rb(n,o,i),a=s.to?`/${s.to}`:"/(\uB8E8\uD2B8)";return{content:s.kind==="item"?`\uC774\uB3D9\uD588\uC2B5\uB2C8\uB2E4: ${o} \u2192 ${a}`:`\uD3F4\uB354\uB97C \uC774\uB3D9\uD588\uC2B5\uB2C8\uB2E4: ${o} \uC544\uB798 ${s.movedCount}\uAC74 \u2192 ${a}`}}catch(s){return{content:"",isError:!0,error:s.message}}}}});var xs,tf=D(()=>{"use strict";Le();Ot();xs=class extends ae{get definition(){return{name:"cowork_artifact_rename",description:"Rename a folder in the cowork deliverables box \u2014 rewrites the last path segment across every artifact under that folder (recursively). Does not rename an individual artifact's own name. Only works inside a cowork execution (a project must be attached).",parameters:{type:"object",properties:{path:{type:"string",description:'Folder path to rename, e.g. "\uBE0C\uB79C\uB4DC/og".'},newName:{type:"string",description:'New name for the last segment, e.g. "og\uCE74\uB4DC" (result: "\uBE0C\uB79C\uB4DC/og\uCE74\uB4DC").'}},required:["path","newName"]}}}async execute(e,r){let n=Mo(r.context);if(!n)return{content:"",isError:!0,error:"\uC774 \uC2E4\uD589\uC5D0\uB294 cowork \uD504\uB85C\uC81D\uD2B8 \uB9E5\uB77D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4(\uC77C\uBC18 \uCF54\uB529 \uD50C\uB79C\uC774\uAC70\uB098 \uBBF8\uBD84\uB958 \uD504\uB85C\uC81D\uD2B8) \u2014 \uC791\uC5C5\uBB3C\uD568 \uD3F4\uB354\uB97C \uB2E4\uB8F0 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."};let o=typeof e.path=="string"?e.path.trim():"",i=typeof e.newName=="string"?e.newName.trim():"";if(!o)return{content:"",isError:!0,error:"path \uB294 \uD544\uC218\uC785\uB2C8\uB2E4."};if(!i)return{content:"",isError:!0,error:"newName \uC740 \uD544\uC218\uC785\uB2C8\uB2E4."};try{let s=await $b(n,o,i);return{content:`\uC774\uB984\uC744 \uBC14\uAFE8\uC2B5\uB2C8\uB2E4: ${o} \u2192 /${s.to} (${s.renamedCount}\uAC74)`}}catch(s){return{content:"",isError:!0,error:s.message}}}}});var Ob,Mb=D(()=>{"use strict";qd();Gd();Vd();Jd();Pp();Ap();Cp();_p();_o();$p();Op();Gp();Vp();zp();Zp();ef();tf();qd();Gd();Vd();Jd();Pp();Ap();Cp();_p();_o();$p();Op();Gp();Vp();zp();Zp();ef();tf();Ob=[new Mi,new Di,new Ni,new Fi,new rs,new ns,new os,new is,new $r,new cs,new ls,new ms,new gs,new ws,new vs,new Ss,new xs]});var Fb={};va(Fb,{createShadowSnapshot:()=>RR});import{exec as PR}from"child_process";import{promisify as AR}from"util";import*as Db from"path";import*as Nb from"os";async function Lb(t){try{let{stdout:e}=await tr('git for-each-ref --sort=-refname --format="%(refname)" refs/protocol-cli/snapshots',{cwd:t});return e.split(`
|
|
231
|
+
`).map(r=>r.trim()).filter(r=>/\/snapshots\/\d{13}-[0-9a-f]{12}$/.test(r))}catch{return[]}}async function _R(t){let e=await Lb(t);if(e.length===0)return null;try{let{stdout:r}=await tr(`git rev-parse "${e[0]}"`,{cwd:t});return r.trim()||null}catch{return null}}async function TR(t){let e=await Lb(t);for(let r of e.slice(CR))await tr(`git update-ref -d "${r}"`,{cwd:t}).catch(n=>{console.warn(`[snapshot] prune git update-ref \uC2E4\uD328 (${r}):`,n?.message)})}async function RR(t,e){try{let r=Nb.tmpdir(),n=Db.join(r,`protocol-idx-${Date.now()}-${Math.random().toString(36).slice(2)}`);await tr(`GIT_INDEX_FILE="${n}" git add -A`,{cwd:t});let{stdout:o}=await tr(`GIT_INDEX_FILE="${n}" git write-tree`,{cwd:t}),i=o.trim();if(!i)return null;let s=await _R(t);if(s)try{let{stdout:f}=await tr(`git rev-parse "${s}^{tree}"`,{cwd:t});if(f.trim()===i)return null}catch{}let a=s||(await tr("git rev-parse HEAD",{cwd:t})).stdout.trim(),{stdout:c}=await tr(`git commit-tree "${i}" -p "${a}" -m "protocol-cli: ${e.replace(/"/g,'\\"')}"`,{cwd:t}),l=c.trim(),d=`refs/protocol-cli/snapshots/${Date.now()}-${l.slice(0,12)}`;await tr(`git update-ref "${d}" "${l}"`,{cwd:t}),await TR(t);let p="";try{let{stdout:f}=await tr("git branch --show-current",{cwd:t});p=f.trim()}catch(f){console.warn("[snapshot] git branch --show-current \uC2E4\uD328:",f?.message)}let u="";try{let{stdout:f}=await tr("git config --get remote.origin.url",{cwd:t});u=f.trim()}catch(f){console.warn("[snapshot] git config remote.origin.url \uC2E4\uD328:",f?.message)}return{ref:d,sha:l,at:Date.now(),reason:e,branch:p,repoRemote:u}}catch(r){return process.env.PROTOCOL_DEBUG&&console.warn("Failed to create shadow snapshot:",r),null}}var tr,CR,jb=D(()=>{"use strict";tr=AR(PR),CR=30});var Ub={};va(Ub,{CliHandoffStore:()=>ks});async function Ec(t){let e=await Pc({method:"PATCH",body:JSON.stringify(t)});if(e.status===409)return!1;if(!e.ok)throw new Error(`handoff API failed (${e.status})`);return!0}var IR,Pc,ks,rf=D(()=>{"use strict";ze();IR="/api/user-data/cli_handoff/current",Pc=t=>Ye().request(IR,t);ks=class{async saveHandoffState(e){try{let r=await Pc();if(r.status!==404&&!r.ok)throw new Error(`handoff API failed (${r.status})`);let n=r.status===404?null:(await r.json()).item??null,o=await Pc({method:"PUT",body:JSON.stringify({...n??{},...e})});if(!o.ok)throw new Error(`handoff API failed (${o.status})`)}catch(r){process.env.PROTOCOL_DEBUG&&console.warn("Failed to save handoff state:",r)}}async loadHandoffState(){try{let e=await Pc();if(e.status===404)return null;if(!e.ok)throw new Error(`handoff API failed (${e.status})`);return(await e.json()).item??null}catch(e){return process.env.PROTOCOL_DEBUG&&console.warn("Failed to load handoff state:",e),null}}async acquireLock(e){try{return await Ec({operation:"acquire",owner:e})}catch(r){return process.env.PROTOCOL_DEBUG&&console.warn("Failed to acquire lock:",r),!1}}async heartbeatLock(e){try{return await Ec({operation:"heartbeat",owner:e})}catch{return!1}}async releaseLock(e){try{await Ec({operation:"release",owner:e})}catch(r){process.env.PROTOCOL_DEBUG&&console.warn("Failed to release lock:",r)}}async addSnapshot(e){try{await Ec({operation:"snapshot",snapshot:e})}catch(r){process.env.PROTOCOL_DEBUG&&console.warn("Failed to save shadow snapshot meta:",r)}}async getSnapshots(){return(await this.loadHandoffState())?.snapshots??[]}}});import*as nf from"path";var $R,en,Ac=D(()=>{"use strict";lr();Iw();$i();Mb();$R=new Set(["agent","ask_user","read_file","glob_search","grep_search","plan"]),en=class{tools=new Map;permissionManager;hookRegistry;constructor(e){this.permissionManager=e?.permissionManager??new Fe,this.hookRegistry=e?.hookRegistry??new ur,this.registerBuiltinTools()}registerBuiltinTools(){for(let e of Ob)this.tools.set(e.definition.name,e)}register(e){this.tools.set(e.definition.name,e)}getTool(e){let r=this.tools.get(e);if(!r)throw new Error(`Tool not found: ${e}`);return r}hasTool(e){return this.tools.has(e)}getToolDefinition(e){return this.tools.get(e)?.definition}getAllTools(){return Array.from(this.tools.values())}getAllToolDefinitions(){return this.getAllTools().map(e=>e.definition)}getToolsByNames(e){return e.map(r=>this.tools.get(r)).filter(r=>r!==void 0)}getToolsForPermission(){let e=Hd.filter(r=>this.permissionManager.canExecute(r.requiredPermission)).map(r=>r.name);return this.getToolsByNames(e)}getToolsForRole(e){let r=this.getToolsForPermission();return e!=="orchestrator"?r:r.filter(n=>$R.has(n.definition.name))}getPermissionManager(){return this.permissionManager}setPermissionManager(e){this.permissionManager=e}getHookRegistry(){return this.hookRegistry}async executeTool(e,r,n,o={}){let i=Rw(e),s=this.getTool(e);if(e==="bash"){let u=r.command||"";if(u&&Fe.isCatastrophicCommand(u))return{content:"",isError:!0,error:"Permission denied: \uD30C\uAD34\uC801 \uBA85\uB839\uC740 \uC5B4\uB5A4 \uBAA8\uB4DC/\uD50C\uB798\uADF8\uC5D0\uC11C\uB3C4 \uCC28\uB2E8\uB429\uB2C8\uB2E4."}}if(e==="read_file"||e==="write_file"||e==="edit_file"||e==="glob_search"||e==="grep_search"){let u=r.file_path??r.path;if(u){let f=nf.resolve(process.cwd(),u),m=e==="write_file"||e==="edit_file";if(Fe.isSecretPath(f))return{content:"",isError:!0,error:"Permission denied: \uBE44\uBC00/\uC790\uACA9\uC99D\uBA85 \uD30C\uC77C \uC811\uADFC\uC740 \uCC28\uB2E8\uB429\uB2C8\uB2E4."};if(m&&Fe.isProtectedSystemPath(f))return{content:"",isError:!0,error:"Permission denied: \uC2DC\uC2A4\uD15C \uD06C\uB9AC\uD2F0\uCEEC \uACBD\uB85C \uC4F0\uAE30\uB294 \uCC28\uB2E8\uB429\uB2C8\uB2E4."}}}if(!o.skipPermission){let u=i?i.requiredPermission:"WorkspaceWrite";if(!this.permissionManager.canExecute(u))return{content:"",isError:!0,error:`Permission denied: Tool '${e}' requires ${u} mode`};if(e==="bash"){let h=r.command;if(h&&!this.permissionManager.canExecuteCommand(h))return{content:"",isError:!0,error:"Permission denied: command blocked by policy"}}if(new Set(["read_file","write_file","edit_file","glob_search","grep_search"]).has(e)){let h=r.file_path??r.path;if(h){let w=e==="write_file"||e==="edit_file",b=nf.resolve(process.cwd(),h);if(!this.permissionManager.canAccessPath(b,w))return{content:"",isError:!0,error:`Permission denied: path '${b}' blocked by policy`}}}let m=await this.permissionManager.requestApproval(e,r);if(!m.allowed)return{content:"",isError:!0,error:m.message??`Permission denied for tool '${e}'`}}let a=e==="write_file"||e==="edit_file",c=e==="bash"&&Fe.isWorkLossCommand(r.command);if(a||c)try{let{createShadowSnapshot:u}=await Promise.resolve().then(()=>(jb(),Fb)),{CliHandoffStore:f}=await Promise.resolve().then(()=>(rf(),Ub)),m="";a?m=`${e}: ${r.file_path??r.path}`:m=`bash: ${r.command}`;let h=await u(process.cwd(),m);h&&await new f().addSnapshot(h)}catch(u){process.env.PROTOCOL_DEBUG&&console.warn("Failed to handle shadow snapshot logic:",u)}if(!o.skipHooks){let u={event:"PreToolUse",timestamp:Date.now(),conversationId:n.metadata.conversationId,state:n,toolName:e,params:r};await this.hookRegistry.execute("PreToolUse",u)}e==="bash"&&(n.context={...n.context,__permissionTier:this.permissionManager.getTier()});let l=Date.now(),d;try{d=await s.execute(r,n)}catch(u){d={content:"",isError:!0,error:u.message}}let p=Date.now()-l;if(!o.skipHooks){let u={event:"PostToolUse",timestamp:Date.now(),conversationId:n.metadata.conversationId,state:n,toolName:e,params:r,result:d,duration:p};await this.hookRegistry.execute("PostToolUse",u)}return d}}});function jR(t,e){if(!t||!e||t.length===0||e.length===0||t.length!==e.length)return 0;let r=0,n=0,o=0;for(let s=0;s<t.length;s++)r+=t[s]*e[s],n+=t[s]*t[s],o+=e[s]*e[s];if(n===0||o===0)return 0;let i=Math.sqrt(n)*Math.sqrt(o);return i>0?r/i:0}function zb(t){return!Array.isArray(t)||t.length===0?!0:t.every(e=>e===0||Math.abs(e)<1e-12)}function Kb(t){if(!Array.isArray(t)||t.length===0)return!0;let e=t[0];return t.every(r=>Math.abs(r-e)<1e-12)}function UR(t,e,r=1e-6){if(!t||!e||t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(Math.abs(t[n]-e[n])>r)return!1;return!0}function WR(t){let e=t instanceof Error?t.message:String(t),r=e.toLowerCase();return r.includes("api key")||r.includes("apikey")||r.includes("openai_api_key")||r.includes("unauthorized")||r.includes("401")||r.includes("not configured")||r.includes("not authenticated")||r.includes("session expired")||r.includes("forbidden")||r.includes("403")?{errorType:"key_missing",message:`\uC784\uBCA0\uB529 API \uD0A4\uAC00 \uC5C6\uAC70\uB098 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (${e})`,summary:"\uC784\uBCA0\uB529 \uD0A4 \uB204\uB77D"}:r.includes("timeout")||r.includes("timed out")||r.includes("aborted")?{errorType:"timeout",message:`\uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8 \uC751\uB2F5 \uC2DC\uAC04 \uCD08\uACFC (${e})`,summary:"\uC751\uB2F5 \uC2DC\uAC04 \uCD08\uACFC"}:r.includes("fetch failed")||r.includes("enotfound")||r.includes("econnrefused")||r.includes("econnreset")||r.includes("etimedout")||r.includes("network")||r.includes("socket")||r.includes("und_err")?{errorType:"network_error",message:`\uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8 \uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0 \uC2E4\uD328 (${e})`,summary:"\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0 \uC2E4\uD328"}:{errorType:"endpoint_error",message:`\uC784\uBCA0\uB529 \uC5D4\uB4DC\uD3EC\uC778\uD2B8 \uC624\uB958: ${e}`,summary:e.length>40?e.slice(0,37)+"...":e}}function No(t){let e="\u2550".repeat(74),r=["",`\u2554${e}\u2557`,`\u2551 \u26A0 RAG EMBEDDING SELF-CHECK FAILED / RAG \uC784\uBCA0\uB529 \uC790\uAE30\uAC80\uC0AC \uC2E4\uD328${" ".repeat(16)}\u2551`,`\u2560${e}\u2563`,`\u2551 \uD504\uB85C\uBC14\uC774\uB354: ${t.provider.padEnd(60)} \u2551`,`\u2551 \uC624\uB958 \uC720\uD615 : ${t.summary.padEnd(60)} \u2551`,`\u2551 \uC0C1\uC138 \uB0B4\uC6A9 : ${t.message.slice(0,58).padEnd(60)} \u2551`,"\u2551 \u2551","\u2551 \u{1F4A1} \uBC30\uACBD: \uD788\uB4E0\uC6D4\uB4DC\uC5D0\uC11C \uD0A4 \uB204\uB77D\uC73C\uB85C \uBAA8\uB4E0 \uBB38\uC7A5\uC774 \uB3D9\uC77C \uB354\uBBF8 \uBCA1\uD130\uAC00 \uB418\uC5B4 \u2551","\u2551 \uAC80\uC0C9\uC774 \uC870\uC6A9\uD788 \uBB34\uD6A8\uD654\uB418\uC5C8\uB358 \uC0AC\uACE0\uB97C \uBC29\uC9C0\uD558\uAE30 \uC704\uD574 \uACBD\uACE0\uD569\uB2C8\uB2E4. \u2551",`\u255A${e}\u255D`,""].join(`
|
|
232
|
+
`);process.stderr.write(r),ht.child("RAG:SelfCheck").warn(t.message,{provider:t.provider,errorType:t.errorType,similarity:t.similarity})}function _c(){return Cc}function tn(t){Cc=t;for(let e of af)try{e(t)}catch(r){ht.debug("Embedding status listener error",{error:String(r)})}}function Jb(t){if(af.add(t),Cc)try{t(Cc)}catch(e){ht.debug("Embedding status listener error",{error:String(e)})}return()=>{af.delete(t)}}async function Yb(t,e){let r=Date.now(),n=e?.testSentences??FR,o=e?.timeoutMs??2500,i=e?.similarityThreshold??.99,s=e?.loudWarning??!0,a="getProviderName"in t?t.getProviderName():t.name;try{let c="getProvider"in t?t.getProvider():t;if(typeof c.isAvailable=="function"){let v=!0;try{v=await c.isAvailable()}catch{v=!1}if(!v){let C={ok:!1,provider:a,status:"unconfigured",errorType:"key_missing",message:"\uC784\uBCA0\uB529 \uD504\uB85C\uBC14\uC774\uB354\uAC00 \uAD6C\uC131\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4 (\uB85C\uADF8\uC778 \uB610\uB294 \uC784\uBCA0\uB529 API \uD0A4 \uD544\uC694). RAG \uAC80\uC0C9\uC740 \uBE44\uD65C\uC131\uD654\uB429\uB2C8\uB2E4.",summary:"\uD504\uB85C\uBC14\uC774\uB354 \uBBF8\uAD6C\uC131 (\uB85C\uADF8\uC778 \uD544\uC694)",checkedAt:new Date,testSentences:n,latencyMs:Date.now()-r};return tn(C),ht.child("RAG:SelfCheck").warn(C.message,{provider:a}),C}}let l=async v=>{if("embed"in t){let C=await t.embed(v);return Array.isArray(C)?C:C.embedding}throw new Error("Invalid embedding target")},d=async()=>{let[v,C]=await Promise.all([l(n[0]),l(n[1])]);return[v,C]},p,u=new Promise((v,C)=>{p=setTimeout(()=>{C(new Error(`Embedding check timed out after ${o}ms`))},o)}),[f,m]=await Promise.race([d(),u]).finally(()=>{p&&clearTimeout(p)}),h=Date.now()-r;if(!Array.isArray(f)||!Array.isArray(m)||f.length===0||m.length===0){let v={ok:!1,provider:a,status:"error",errorType:"dummy_vectors",message:`\uC784\uBCA0\uB529 \uACB0\uACFC\uAC00 \uC62C\uBC14\uB978 \uBCA1\uD130 \uBC30\uC5F4\uC774 \uC544\uB2D9\uB2C8\uB2E4 (A length: ${f?.length}, B length: ${m?.length})`,summary:"\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uBCA1\uD130 \uBC18\uD658",checkedAt:new Date,testSentences:n,latencyMs:h};return tn(v),s&&No(v),v}if(f.length!==m.length){let v={ok:!1,provider:a,status:"error",errorType:"dummy_vectors",message:`\uBB38\uC7A5 \uAC04 \uC784\uBCA0\uB529 \uCC28\uC6D0\uC774 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (${f.length} vs ${m.length})`,summary:"\uC784\uBCA0\uB529 \uCC28\uC6D0 \uBD88\uC77C\uCE58",checkedAt:new Date,testSentences:n,latencyMs:h};return tn(v),s&&No(v),v}if(zb(f)||zb(m)){let v={ok:!1,provider:a,status:"error",errorType:"zero_vector",message:"\uC784\uBCA0\uB529 \uBCA1\uD130\uAC00 \uBAA8\uB450 0\uC73C\uB85C \uCC44\uC6CC\uC9C4 \uB354\uBBF8 \uBCA1\uD130\uC785\uB2C8\uB2E4.",summary:"0 \uBCA1\uD130 \uB354\uBBF8 \uAC10\uC9C0",dimension:f.length,checkedAt:new Date,testSentences:n,latencyMs:h};return tn(v),s&&No(v),v}if(Kb(f)||Kb(m)){let v={ok:!1,provider:a,status:"error",errorType:"constant_vector",message:"\uC784\uBCA0\uB529 \uBCA1\uD130\uAC00 \uBAA8\uB4E0 \uCC28\uC6D0\uC5D0 \uB3D9\uC77C\uD55C \uC0C1\uC218\uAC00 \uCC44\uC6CC\uC9C4 \uB354\uBBF8 \uBCA1\uD130\uC785\uB2C8\uB2E4.",summary:"\uC0C1\uC218 \uBCA1\uD130 \uB354\uBBF8 \uAC10\uC9C0",dimension:f.length,checkedAt:new Date,testSentences:n,latencyMs:h};return tn(v),s&&No(v),v}let w=jR(f,m),b=UR(f,m);if(b||w>=i){let v={ok:!1,provider:a,status:"error",errorType:"dummy_vectors",message:`\uC11C\uB85C \uB2E4\uB978 \uB450 \uBB38\uC7A5\uC5D0 \uB3D9\uC77C/\uC720\uC0AC\uD55C \uBCA1\uD130\uAC00 \uC0DD\uC131\uB418\uC5C8\uC2B5\uB2C8\uB2E4 (\uC720\uC0AC\uB3C4: ${w.toFixed(4)}, \uB3D9\uC77C\uC5EC\uBD80: ${b}). \uB354\uBBF8 \uBCA1\uD130 \uC774\uC0C1 \uAC10\uC9C0!`,summary:"\uB354\uBBF8 \uBCA1\uD130 \uC774\uC0C1 \uAC10\uC9C0 (\uC870\uC6A9\uD55C \uC2E4\uD328)",similarity:w,dimension:f.length,checkedAt:new Date,testSentences:n,latencyMs:h};return tn(v),s&&No(v),v}let k={ok:!0,provider:a,status:"ok",message:`\uC784\uBCA0\uB529 \uC790\uAE30\uAC80\uC0AC \uD1B5\uACFC (\uC720\uC0AC\uB3C4: ${w.toFixed(4)}, \uCC28\uC6D0: ${f.length})`,summary:"\uC815\uC0C1 \uC791\uB3D9",similarity:w,dimension:f.length,checkedAt:new Date,testSentences:n,latencyMs:h};return tn(k),ht.child("RAG:SelfCheck").debug("Embedding self-check passed",{provider:a,similarity:w,dimension:f.length,latencyMs:h}),k}catch(c){let l=Date.now()-r,d=WR(c),p={ok:!1,provider:a,status:d.errorType==="key_missing"?"unconfigured":"error",errorType:d.errorType,message:d.message,summary:d.summary,checkedAt:new Date,testSentences:n,latencyMs:l};return tn(p),s&&No(p),p}}var FR,Cc,af,Tc=D(()=>{"use strict";uo();FR=["\uC0AC\uACFC\uB294 \uACFC\uC77C\uC774\uB2E4","\uC790\uB3D9\uCC28\uB294 \uD0C8\uAC83\uC774\uB2E4"];Cc=null,af=new Set});import{resolve as tv}from"node:path";function rv(t,e){if(!Wa(t))return null;let r=e?.file_path;return typeof r=="string"&&r.length>0?r:null}var hr,Ps=D(()=>{"use strict";Le();hr=class{owners=new Map;claim(e,r){let n=tv(e),o=this.owners.get(n);return o&&o!==r?{ok:!1,file:n,owner:o}:(this.owners.set(n,r),{ok:!0,file:n})}ownerOf(e){return this.owners.get(tv(e))}release(e){let r=[];for(let[n,o]of this.owners)o===e&&(this.owners.delete(n),r.push(n));return r}foreignMentions(e,r){let n=[];for(let[o,i]of this.owners){if(i===r)continue;let s=o.startsWith(process.cwd()+"/")?o.slice(process.cwd().length+1):null,a=o.slice(o.lastIndexOf("/")+1);(e.includes(o)||s&&e.includes(s)||a.length>3&&e.includes(a))&&n.push({file:o,owner:i})}return n}snapshot(){return[...this.owners].map(([e,r])=>({file:e,owner:r}))}clear(){this.owners.clear()}}});import{createHash as rI}from"node:crypto";import{mkdirSync as nI,openSync as oI,closeSync as iI,unlinkSync as sI}from"node:fs";import{join as lv}from"node:path";function aI(t,e){let r=rI("sha256").update(JSON.stringify([t,e])).digest("hex");return lv(Ee(),"provider-session-leases",`${r}.lock`)}function uv(t,e){let r=aI(t,e);nI(lv(Ee(),"provider-session-leases"),{recursive:!0,mode:448});try{iI(oI(r,"wx",384))}catch{throw new Error("PROVIDER_SESSION_UNAVAILABLE: active or unreconciled Protocol turn; resume refused.")}let n=!1;return()=>{n||(n=!0,sI(r))}}var dv=D(()=>{"use strict";Lt()});function Or(t){let e=gi(t.provider);return{...t,sessionCapabilities:e,run(r,n){let o=e.resume==="next-turn";if(n.resumeSessionId&&!o)return n.onText("[Protocol] This provider adapter does not support session resume."),{done:Promise.resolve({ok:!1}),kill(){}};let i=new Map,s=!1,a,c=d=>{i.has(d)||i.set(d,uv(t.provider,d))},l=()=>{for(let d of i.values())d();i.clear()};try{return n.resumeSessionId&&c(n.resumeSessionId),a=t.run(r,{...n,onSessionId(d){if(!s){try{c(d)}catch{s=!0,n.onText("[Protocol] Provider session is already owned or requires reconciliation; stopping this new child."),a?.kill();return}n.onSessionId?.(d)}}}),s&&a.kill(),{kill:()=>a.kill(),done:a.done.then(d=>s?{...d,ok:!1}:d).finally(l)}}catch(d){return l(),n.onText(d instanceof Error?d.message:"Provider session unavailable."),{done:Promise.resolve({ok:!1}),kill(){}}}}}}var pv=D(()=>{"use strict";Ra();dv()});function As(t,e){if(!e)return;let r=!1,n=!1,o,i=a=>{typeof t.pid=="number"&&e({type:a,pid:t.pid,at:new Date().toISOString()})};t.once("spawn",()=>{r||(n=!0,i("spawned"),o=setInterval(()=>{!r&&t.exitCode===null&&t.signalCode===null&&i("heartbeat")},15e3),o.unref?.())});let s=()=>{r||(r=!0,o&&clearInterval(o),n&&i("exited"))};t.once("exit",s),t.once("error",s),t.once("close",s)}var fv=D(()=>{"use strict"});function hv(t){return t.replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?(?:-----END [^-]*PRIVATE KEY-----|$)/g,"[sensitive output omitted]").replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").split(/\r?\n/).map(e=>/(?:BEGIN .*PRIVATE KEY|authorization\s*:|bearer\s+|(?:access[_-]?token|refresh[_-]?token|api[_-]?key|password|secret)\s*[:=]|\bsk-[A-Za-z0-9_-]+|[?&](?:code|token|key)=)/i.test(e)?"[sensitive output omitted]":e.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g,"")).join(`
|
|
233
|
+
`)}function mv(t,e){let r=hv(e),n=t?.nextSequence??1,o=r.length>2e3?`${r.slice(0,1960)}
|
|
234
|
+
[entry truncated]`:r,i=[...t?.entries??[],{sequence:n,text:o}].slice(-40);return{firstSequence:i[0].sequence,nextSequence:n+1,truncated:!!t?.truncated||i[0].sequence>1||o!==r,entries:i}}function gv(t,e){let r="",n=!1,o=!1,i=s=>{/BEGIN .*PRIVATE KEY/.test(s)&&(o=!0),o?(/END .*PRIVATE KEY/.test(s)&&(o=!1),t("[sensitive output omitted]")):s.trim()&&t(hv(s))};return{push(s){for(let a of s.split(/(?<=\n)/)){let c=a.endsWith(`
|
|
235
|
+
`);n||(r+=a),r.length>8192&&(r="",n=!0),c&&(n?t("[oversized output line omitted]"):i(r.trimEnd()),r="",n=!1)}(r||n)&&e?.()},finish(){n?t("[oversized output line omitted]"):r&&i(r),r="",n=!1}}}var uf=D(()=>{"use strict"});import{AsyncLocalStorage as lI}from"node:async_hooks";import{resolve as df}from"path";async function uI(t,e,r){let n=Wa(t)?String(e?.file_path??""):"";if(!n)return r();let o=df(n),s=(wv.get(o)??Promise.resolve()).then(r,r);return wv.set(o,s.then(()=>{},()=>{})),s}function fI(t){let e=t??{},r=e.file_path??e.path??e.command??e.pattern??e.query??e.url??"";return r?` ${String(r).slice(0,100)}`:""}function Lo(t){return t>=1e3?`${(t/1e3).toFixed(1)}K`:String(t)}function hI(t){let e=(t.latencyMs/1e3).toFixed(1),r=t.usage,n=r&&(r.inputTokens>0||r.outputTokens>0)?x(` \xB7 input ${Lo(r.inputTokens)} \xB7 output ${Lo(r.outputTokens)}${r.thoughtsTokens?` \xB7 think ${Lo(r.thoughtsTokens)}`:""}`,` \xB7 \uC785\uB825 ${Lo(r.inputTokens)} \xB7 \uCD9C\uB825 ${Lo(r.outputTokens)}${r.thoughtsTokens?` \xB7 \uCD94\uB860 ${Lo(r.thoughtsTokens)}`:""}`):"";return x(`thought ${e}s`,`\uC0DD\uAC01 ${e}\uCD08`)+n}function mI(t){let e=(t||"").toLowerCase();return/(write|edit|create|apply|patch|replace|insert|append|mkdir|rename|move)/.test(e)?"edit":/(delete|remove|\brm\b|unlink)/.test(e)?"delete":/(read|cat|view|open|show)/.test(e)?"read":/(bash|shell|\brun\b|exec|command|npm|node|git|build|test)/.test(e)?"cmd":/(search|grep|glob|find|list|\bls\b|tree)/.test(e)?"search":"tool"}function gI(t,e){return`${$c[mI(t)]} ${t}${fI(e)}`}function Cs(t){let e=new ur;for(let i of Ua)e.register(i);let r=t.tier==="default"?En[(t.permission||"").toLowerCase()]??"WorkspaceWrite":"DangerFullAccess",n=t.tier==="danger"?{mode:r}:t.tier==="yolo"?t.confineToCwd?{mode:r,allowedPaths:[process.cwd()]}:{mode:r,writeOnlyAllowedPaths:[process.cwd()]}:{mode:r,allowedPaths:[process.cwd()]},o=new Fe(n,t.tier);return o.setConfirmHandler(t.confirm),new en({permissionManager:o,hookRegistry:e})}function wI(t,e,r,n){let o=Ew()>0,i=ig({provider:e,hasImage:o,mode:n?.mode??"auto",visionProvider:n?.model??"server"});if(i.action==="unchanged")return t;if(i.action==="switch"){let s=i.to==="server"?t:null;return s?(r?.(x(`\u{1F5BC} image present \u2014 routing to ${i.to} to view it`,`\u{1F5BC} \uC774\uBBF8\uC9C0\uAC00 \uC788\uC5B4 ${i.to} \uB85C \uCC98\uB9AC\uD569\uB2C8\uB2E4`)),s):(Ud(),r?.(x(`\u26A0 vision.model=${i.to} is not available \u2014 sending without the image`,`\u26A0 \uC124\uC815\uB41C vision \uBAA8\uB378(${i.to})\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774\uBBF8\uC9C0 \uC5C6\uC774 \uC804\uC1A1\uD569\uB2C8\uB2E4`)),t)}return Ud(),r?.(x(`\u26A0 ${e} can't see images \u2014 sent without the image (${i.reason})`,`\u26A0 ${e} \uBAA8\uB378\uC740 \uC774\uBBF8\uC9C0\uB97C \uBCFC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774\uBBF8\uC9C0 \uC5C6\uC774 \uC804\uC1A1\uD588\uC2B5\uB2C8\uB2E4 (${i.reason})`)),t}async function Ln(t,e={}){let r=df(e.cwd??process.cwd());if(r!==df(process.cwd()))throw new Error(`Coding loop cwd must match the CLI process cwd (${process.cwd()}); received ${r}`);let n=e.registry??Cs({tier:e.tier??"default",confirm:async()=>"deny"}),o=e.fileClaims??new hr,i=e.provider??new jt,s=e.role??"worker",a=n.getToolsForRole(s).map(v=>v.definition),c=new Set(a.map(v=>v.name)),l=[{role:"user",content:t}],d={messages:[],context:{signal:e.signal},metadata:{currentNode:"agent",visitedNodes:[],startTime:Date.now(),conversationId:`cli_${Date.now().toString(36)}`,loopCount:0,status:"running"}},p=new K,u=e.workerModel??p.get("models").worker??"fast",f=e.vision??p.get("vision"),m=Math.min(50,Math.max(1,e.maxTurns??12)),h=Math.max(1e3,e.maxDurationMs??10*6e4),w=Date.now()+h,b=Math.max(1e3,e.maxToolOutputChars??3e4),k="";for(let v=0;v<m&&!e.signal?.aborted;v++){if(Date.now()>=w){e.onActivity?.(x("\u23F1 agent time limit reached","\u23F1 \uC5D0\uC774\uC804\uD2B8 \uC2DC\uAC04 \uC81C\uD55C \uB3C4\uB2EC"));break}e.onPhase?.(x("Thinking","\uC0DD\uAC01\uD558\uB294 \uC911"));let I=(i.name??"server")==="server"?wI(i,"server",e.onActivity,f):i,N;try{N=await I.generate(l,{model:Oc(u),systemPrompt:pI(s,r)+(e.systemPromptAppend?`
|
|
236
|
+
${e.systemPromptAppend}`:""),tools:a,maxTokens:e.maxTokens,temperature:e.temperature,signal:e.signal?.controller.signal})}catch($){if(e.signal?.aborted)break;throw $}if(e.onActivity?.(hI(N)),N.content&&(k=N.content,e.onAssistant?.(N.content)),!N.toolCalls||N.toolCalls.length===0)break;l.push({role:"assistant",content:N.content,toolCalls:N.toolCalls});let G=[];for(let $ of N.toolCalls){if(e.signal?.aborted)break;let j=gI($.name,$.arguments);e.onActivity?.(j),e.onPhase?.(j),e.onTool?.($.name);let Y=e.validateToolCall?.($.name,$.arguments??{});if(Y){G.push({toolCallId:$.id,content:Y,isError:!0}),e.onToolError?.();continue}if(!c.has($.name)){G.push({toolCallId:$.id,content:s==="orchestrator"?`Tool '${$.name}' is not available to the orchestrator. Delegate this to a worker with the 'agent' tool.`:`Tool '${$.name}' is not available.`,isError:!0}),e.onToolError?.();continue}let we=rv($.name,$.arguments);if(we){let B=o.claim(we,e.owner??"worker");if(!B.ok){let q=x(`Cannot edit ${we} \u2014 owned by another run (${B.owner}). Wait for it to finish.`,`${we} \uC218\uC815 \uBD88\uAC00 \u2014 \uB2E4\uB978 \uC2E4\uD589(${B.owner})\uC774 \uC791\uC5C5 \uC911\uC785\uB2C8\uB2E4. \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB824\uC8FC\uC138\uC694.`);G.push({toolCallId:$.id,content:q,isError:!0}),e.onToolError?.();continue}}if(Pn($.name)&&e.mutationCheckpoint){let B=await e.mutationCheckpoint.before($.name,$.arguments??{});if(B){G.push({toolCallId:$.id,content:B,isError:!0}),e.onToolError?.();continue}}try{let B=await pf.run({label:e.label??""},()=>uI($.name,$.arguments,()=>n.executeTool($.name,$.arguments,d))),q=B.content||B.error||"",{text:re}=_r(q,{maxChars:b,hint:x("request a narrower slice before retrying","\uB354 \uC881\uC740 \uBC94\uC704\uB97C \uC694\uCCAD\uD55C \uB4A4 \uC7AC\uC2DC\uB3C4\uD560 \uAC83")});G.push({toolCallId:$.id,content:re,isError:B.isError}),!B.isError&&Pn($.name)&&e.mutationCheckpoint&&await e.mutationCheckpoint.after($.name,$.arguments??{})}catch(B){e.onToolError?.(),G.push({toolCallId:$.id,content:B.message,isError:!0})}}l.push({role:"tool",content:G.map($=>`[${$.toolCallId}]: ${$.content}`).join(`
|
|
237
|
+
|
|
238
|
+
`),toolResults:G})}return!e.signal?.aborted&&Date.now()>=w&&e.onActivity?.(x("\u23F1 agent time limit reached","\u23F1 \uC5D0\uC774\uC804\uD2B8 \uC2DC\uAC04 \uC81C\uD55C \uB3C4\uB2EC")),k}var pf,wv,dI,pI,$c,Oc,_s=D(()=>{"use strict";ge();mo();Ac();Le();lr();$i();Ps();_a();Ri();Tr();Oi();pf=new lI,wv=new Map;dI='You are the orchestrator.\n- You do not edit files or run shell commands yourself. You have no such tools and none will be given. Your job is exactly three things: split the mission, assign it to workers via the `agent` tool, and relay the results to the user. Even a one-line fix goes to a worker.\n- If the user asks to run a task on the local model (e.g. "\uB85C\uCEEC \uBAA8\uB378\uB85C \uD574\uC918", "use the local model"), pass `provider: "local"` to the `agent` tool for that delegation. Otherwise leave `provider` unset (defaults to the Protocol server).\n- Routing default (no explicit provider from the user): when you split work into subtasks, prefer `provider: "local"` for a subtask that is small, self-contained, and has a clear success criterion (e.g. a test) \u2014 a single-file bug fix, writing a pure function plus its tests, a small 2-3 file refactor. Do NOT route to local when the subtask needs wide context across many modules, requires design judgment, has a vague success criterion, or is time-sensitive (the user is waiting on a fast reply). A local delegation that fails automatically falls back to the default provider, so this is low-risk \u2014 but still skip local when it obviously won\'t fit. A user-specified provider always overrides this default.\n- Once you establish a cause or a fact in this session, carry it forward. Do not re-investigate what you already settled.\n- When the user asks for something enumerable ("compare the models", "check all of them"), enumerate the full set first, then work through it. Do not silently narrow to a convenient subset.\n- Do not cap output length or truncate when the point of the task is to see the complete result.\n',pI=(t="worker",e=process.cwd())=>`${t==="orchestrator"?`${dI}
|
|
239
|
+
`:""}You are Protocol CLI, an autonomous coding agent running in the user's terminal. Working directory: ${e}.
|
|
240
|
+
${t==="orchestrator"?"You help with software engineering by delegating: read and search the project with the tools you do have, only far enough to split the work, then hand the actual work to workers.":"You help with software engineering: read/edit files, run shell commands, search code \u2014 using the provided tools. Inspect the project with tools before answering; act directly rather than asking."} Keep replies concise and terminal-friendly (no large markdown headers, short bullets only when useful). Reply in ${dr()==="ko"?"Korean":"English"}. When a task is done, briefly state what you did.`;$c={edit:"\u270E",read:"\u25B8",cmd:"$",search:"\u25AA",delete:"\xD7",tool:"\u2699"};Oc=t=>t==="think"?"heavy":"default"});import{createHash as bv,randomUUID as yI}from"node:crypto";import rn from"node:fs";import{join as yv,resolve as bI}from"node:path";function vv(t){let e=bI(t),r=yv(Ee(),"local-agent-checkpoints"),n=bv("sha256").update(e).digest("hex").slice(0,24),o=yv(r,`${n}.json`),i=yI();return{async before(s,a){try{let p=JSON.parse(rn.readFileSync(o,"utf8"));if(p.runId!==i)return`Local agent mutation blocked: a previous run stopped during '${p.toolName}' at ${p.startedAt}. Inspect git status/diff, then remove ${o} to acknowledge the checkpoint before retrying.`}catch(p){if(p.code!=="ENOENT")return`Local agent mutation blocked: cannot safely read checkpoint ${o}.`}let c=!1;try{c=JSON.parse(rn.readFileSync(o,"utf8")).runId===i}catch{}rn.mkdirSync(r,{recursive:!0,mode:448});let l={version:1,runId:i,cwd:e,toolName:s,argsHash:ff(a),startedAt:new Date().toISOString(),tainted:c},d=`${o}.${process.pid}.${i}.tmp`;return rn.writeFileSync(d,`${JSON.stringify(l)}
|
|
241
|
+
`,{mode:384}),rn.renameSync(d,o),null},async after(s,a){try{let c=JSON.parse(rn.readFileSync(o,"utf8"));if(c.runId===i&&c.toolName===s&&c.argsHash===ff(a))if(vI(s,a)||!c.tainted)rn.unlinkSync(o);else{let l={...c,toolName:"unverified_previous_mutation",argsHash:ff({}),tainted:!0};rn.writeFileSync(o,`${JSON.stringify(l)}
|
|
242
|
+
`,{mode:384})}}catch(c){if(c.code!=="ENOENT")throw c}}}}var ff,vI,Sv=D(()=>{"use strict";Lt();ff=t=>bv("sha256").update(JSON.stringify(t)).digest("hex"),vI=(t,e)=>{if(t!=="bash")return!1;let r=String(e.command??"").trim();return/^(?:npm|pnpm|yarn|bun)\s+(?:test|run\s+(?:test|typecheck|check|lint|build))(?:\s+[A-Za-z0-9_.:@=+,-]+)*$/.test(r)}});import{execFile as SI}from"node:child_process";import{mkdirSync as xI,readFileSync as kI,renameSync as EI,rmSync as kv,writeFileSync as PI}from"node:fs";import{randomUUID as AI}from"node:crypto";import{tmpdir as Ev}from"node:os";import{join as Mc}from"node:path";import{promisify as CI}from"node:util";function TI(t){if(!Number.isSafeInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch{return!1}}function Av(t=Pv){if(Dc)return!1;let e=()=>(xI(t,{mode:448}),PI(Mc(t,"pid"),`${process.pid}
|
|
243
|
+
`,{mode:384}),Dc=t,!0);try{return e()}catch(r){if(r.code!=="EEXIST")return!1;let n=0;try{n=Number.parseInt(kI(Mc(t,"pid"),"utf8"),10)}catch{return!1}if(TI(n))return!1;let o=`${t}.stale-${process.pid}-${AI()}`;try{EI(t,o);try{kv(o,{recursive:!0,force:!0})}catch{}return e()}catch{return!1}}}function Cv(t=Pv){if(Dc===t){Dc=null;try{kv(t,{recursive:!0,force:!0})}catch{}}}async function Ts(){if(process.platform!=="darwin")return{ok:!0,fair:!1};try{let[{stdout:t},{stdout:e}]=await Promise.all([xv("swift",["-e","import Foundation; print(ProcessInfo.processInfo.thermalState.rawValue)"],{timeout:8e3,env:_I}),xv("memory_pressure",[],{timeout:5e3})]),r=Number.parseInt(t.trim(),10);if(![0,1,2,3].includes(r))return{ok:!1,fair:!1,reason:`thermal sensor returned invalid state: ${t.trim()||"(empty)"}`};if(r>=2)return{ok:!1,fair:!1,reason:`thermalState=${r} (serious/critical)`};let n=/System-wide memory free percentage:\s*(\d+)%/.exec(e);if(!n)return{ok:!1,fair:r===1,reason:"memory_pressure output could not be parsed"};let o=Number(n[1]);return o<15?{ok:!1,fair:r===1,reason:`memory free=${o}%`}:{ok:!0,fair:r===1}}catch(t){return{ok:!1,fair:!1,reason:`health monitor unavailable: ${t instanceof Error?t.message:String(t)}`}}}function Nc(t,e=1e4){let r=0,n=!1,o=!1,i=async()=>{if(n||o)return;o=!0;let a=await Ts();o=!1,!n&&(r=a.fair?r+1:0,(!a.ok||r>=2)&&(n=!0,clearInterval(s),t(a.reason??"thermalState=fair twice")))},s=setInterval(()=>{i()},e);return s.unref?.(),i(),{stop:()=>{n=!0,clearInterval(s)}}}var xv,Pv,_I,Dc,hf=D(()=>{"use strict";xv=CI(SI),Pv=Mc(Ev(),"protocol-local-agent.lock"),_I={...process.env,CLANG_MODULE_CACHE_PATH:Mc(Ev(),"protocol-swift-module-cache")},Dc=null});function _v(t){let e=new Map,r=new Map,n=new Map;for(let o of t){if(e.has(o.id))throw new Error(`duplicate runtime id: ${o.id}`);e.set(o.id,o.runtime);for(let i of o.aliases){let s=i.trim().toLowerCase();if(!s)throw new Error(`empty runtime alias: ${o.id}`);if(r.has(s))throw new Error(`duplicate runtime alias: ${s}`);r.set(s,o.runtime)}n.set(o.id,o.canonicalName)}return{registrations:t,byId:e,advertisedNames:n,lookup(o){return r.get(o.trim().toLowerCase())??null}}}var Tv=D(()=>{"use strict"});import{spawn as jc,execFile as $v}from"child_process";import{readFileSync as RI,statSync as II}from"fs";import{homedir as $I}from"os";import{join as OI}from"path";import{resolve as Rv}from"path";function Fc(t,e,r=0){if(r>8||!t||typeof t!="object")return 0;let n=Ti(t,e);if(n)return ho(n),1;let o=0;for(let i of Object.values(t))if(Array.isArray(i))for(let s of i)o+=Fc(s,e,r+1);else i&&typeof i=="object"&&(o+=Fc(i,e,r+1));return o}function NI(t,e){let r=0,n=new Set;for(let o of t.matchAll(DI)){let i=o[1];if(!n.has(i)){n.add(i),i.startsWith("~/")&&(i=OI($I(),i.slice(2)));try{let s=II(i);if(!s.isFile()||s.size>MI)continue;let a=i.split(".").pop().toLowerCase();ho({kind:"image",mediaType:a==="png"?"image/png":a==="webp"?"image/webp":"image/jpeg",data:RI(i).toString("base64"),fromTool:e}),r++}catch{}}}return r}function Ov(t,e){if(!Array.isArray(t))return 0;let r=0;for(let n of t){let o=Ti(n,e);if(o){ho(o),r++;continue}let i=n?.content;Array.isArray(i)&&(r+=Ov(i,e))}return r}async function wf(t,e=process.env,r=LI){return t.accountProbe?new Promise(n=>{$v(t.binary,t.accountProbe.args,{env:e,timeout:r,killSignal:"SIGKILL",windowsHide:!0,maxBuffer:64*1024},(o,i,s)=>{let a=`${i}
|
|
244
|
+
${s}`;if(o?.killed||o?.code==="ETIMEDOUT")return n({state:"unverified",detail:"account probe timed out or was terminated"});let c;if(t.provider==="claude-code")try{let l=JSON.parse(i);l&&typeof l=="object"&&"loggedIn"in l&&typeof l.loggedIn=="boolean"&&(c=l.loggedIn)}catch{}else if(t.provider==="codex"){let l=/^Logged in using (?:ChatGPT|an API key(?: - .+)?)$/;[i,s].some(d=>l.test(d.trim()))&&(c=!0)}if(/\b(?:not logged in|logged out|not authenticated)\b/i.test(a)&&(c=!1),c===void 0&&/\b(?:unknown|unrecognized|invalid)\s+(?:command|subcommand|argument|option)\b/i.test(a))return n({state:"unverified",detail:"account status command is unsupported"});if(o||c===!1)return n({state:"action_required",detail:"provider account is not ready",actionHint:t.accountProbe.actionHint});if(c===!0)return n({state:"verified"});n({state:"unverified",detail:"provider sign-in status was not recognized"})})}):{state:"unverified",detail:"provider does not expose a safe non-interactive account status command"}}function Mv(t){return new Promise(e=>{$v(process.platform==="win32"?"where":"which",[t],r=>e(!r))})}function yf(t){return t.isAvailable?t.isAvailable():Mv(t.binary)}function Is(){return{done:Promise.resolve({ok:!1}),kill(){}}}function Fo(t){if(process.platform==="win32"||typeof t.pid!="number"||t.pid<=1)return!1;try{return process.kill(-t.pid,0),!0}catch(e){return e.code==="EPERM"}}function nn(t){if(rr.has(t))return;let e,r=new Promise(d=>{e=d});rr.set(t,{done:r}),gf.add(r),r.then(()=>gf.delete(r));let n=!1,o,i,s=()=>{n||(n=!0,clearTimeout(c),o&&clearTimeout(o),i&&clearTimeout(i),t.removeListener("close",a),e())},a=()=>{Fo(t)||s()};t.once("close",a);let c=setTimeout(()=>{if(i&&clearTimeout(i),Fo(t)||t.exitCode==null&&t.signalCode==null)try{Iv(t,"SIGKILL")}catch{}let d=Date.now()+2e3,p=()=>{if(!n){if(!Fo(t)||Date.now()>=d){s();return}o=setTimeout(p,20)}};p()},FI);try{Fo(t)||t.exitCode==null&&t.signalCode==null?Iv(t,"SIGTERM"):s()}catch{}let l=()=>{if(!n){if(!Fo(t)&&(t.exitCode!=null||t.signalCode!=null)){s();return}i=setTimeout(l,20)}};n||(i=setTimeout(l,20))}async function Uc(t){typeof t.pid=="number"&&t.pid>1&&nn(t),await rr.get(t)?.done}function Iv(t,e){let r=t.pid;if(process.platform!=="win32"&&typeof r=="number"&&r>1)try{process.kill(-r,e);return}catch{}t.kill(e)}async function Dv(t={}){t.shutdown&&(jo=!0);for(let e of Rs)nn(e);Rs.clear(),await Promise.all([...gf])}function Wc(t,e){Rs.add(t);let r=setTimeout(()=>{e?.(),nn(t)},mf);t.once("exit",()=>{Fo(t)&&nn(t)}),t.once("close",()=>{clearTimeout(r),Rs.delete(t)}),t.once("error",()=>{typeof t.pid!="number"&&(clearTimeout(r),Rs.delete(t))})}function Nv(t){if(!t||typeof t!="object")return"";let e=t,r=e.file_path??e.path??e.command??e.pattern??e.url??e.notebook_path;if(typeof r!="string")return"";let n=r.replace(/\s+/g," ").trim();return n?`(${n.length>70?n.slice(0,70)+"\u2026":n})`:""}function Bc(t){return{provider:t.provider,binary:t.binary,tabPrefix:t.tabPrefix,accountLabel:t.accountLabel,run(e,{cwd:r,onText:n,onProcess:o,env:i=process.env}){if(jo)return Is();let s=jc(t.binary,t.args(e),{cwd:r,env:i,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]});As(s,o),Wc(s,()=>n(`[${t.binary}] 10\uBD84 \uD0C0\uC784\uC544\uC6C3 \u2014 \uD504\uB85C\uC138\uC2A4\uB97C \uC885\uB8CC\uD569\uB2C8\uB2E4.`));let a="",c=0,l=gv(n,()=>{Date.now()-c>=5e3&&(c=Date.now(),n("[Receiving output; waiting for a complete safe line]"))}),d="";return s.stdout.setEncoding("utf8"),s.stdout.on("data",u=>{a=(a+u).slice(-65536),l.push(u)}),s.stderr.on("data",u=>{d=(d+u.toString("utf8")).slice(-500)}),{done:new Promise(u=>{s.once("close",async f=>{l.finish();let m=a.trim();if(m){let h=NI(m,t.binary);h>0&&n(`\u{1F441} \uC774\uBBF8\uC9C0 ${h}\uAC1C (\uB2E4\uC74C \uC751\uB2F5\uC5D0 \uCCA8\uBD80)`)}else f!==0&&n(`[${t.binary} \uC885\uB8CC \uCF54\uB4DC ${f}] ${d.trim()||t.loginHint}`);await rr.get(s)?.done,u({ok:f===0&&!rr.has(s)})}),s.once("error",async()=>{n(`[${t.binary} \uC2E4\uD589 \uC2E4\uD328] ${t.binary}\uAC00 \uC124\uCE58\uB3FC \uC788\uB098\uC694?`),await Uc(s),u({ok:!1})})}),kill:()=>nn(s)}}}}function zI(t,e){if(t!=="bash")return null;let r=String(e.command??"").trim();return!r||/[;&|`$<>\n\r\\]|(?:^|\s)(?:\/|~|\.\.)(?:\/|\s|$)/.test(r)||!VI.test(r)?"Local agent shell policy denied this command. Use only test/typecheck/check/lint/build, git status/diff, or cwd-relative rg/grep without shell operators.":null}function Os(t){return Hc.lookup(t)}async function Lv(){let t=Object.values($s),e=await Promise.all(t.map(r=>yf(r)));return t.filter((r,n)=>e[n])}async function JI(){let t=Hc.registrations.filter(r=>r.advertiseOnDevice),e=await Promise.all(t.map(({runtime:r})=>Mv(r.binary)));return t.filter((r,n)=>e[n]).map(r=>r.canonicalName)}async function Fv(){if(Lc&&Date.now()-Lc.at<YI)return Lc.names;let t=await JI();return Lc={at:Date.now(),names:t},t}async function jv(t,e,r){let n=[];return await t.run(e,{cwd:r,onText:i=>n.push(i)}).done,n.join(`
|
|
245
|
+
`).trim()}var MI,DI,LI,mf,FI,Rs,rr,gf,jo,jI,UI,WI,BI,HI,qI,GI,WH,VI,KI,Hc,$s,BH,YI,Lc,Uv,Ms=D(()=>{"use strict";pv();fv();uf();Ri();ge();_s();Wd();Sv();hf();Ps();Tv();MI=4*1024*1024,DI=/(?:^|[\s'"`(])((?:\/|\.\/|~\/)[^\s'"`)]+\.(?:png|jpe?g|webp))/gi;LI=5e3;mf=10*6e4,FI=15e3;Rs=new Set,rr=new WeakMap,gf=new Set,jo=!1;jI={provider:"claude-code",binary:"claude",tabPrefix:"claude",accountLabel:"Anthropic",accountProbe:{args:["auth","status","--json"],actionHint:"claude login"},run(t,{cwd:e,resumeSessionId:r,onText:n,onSessionId:o,onProcess:i,env:s=process.env}){if(jo)return Is();let a=["-p",t,"--output-format","stream-json","--verbose"];r&&a.push("--resume",r);let c=jc("claude",a,{cwd:e,env:s,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]});As(c,i),Wc(c,()=>n("[claude] 10\uBD84 \uD0C0\uC784\uC544\uC6C3 \u2014 \uD504\uB85C\uC138\uC2A4\uB97C \uC885\uB8CC\uD569\uB2C8\uB2E4."));let l,d=new Map,p=!1,u="",f="",m=w=>{let b=w.trim();if(!b)return;let k;try{k=JSON.parse(b)}catch{return}let v=k;if(typeof v.session_id=="string"&&v.session_id.trim()){let C=v.session_id.trim();C!==l&&o?.(C),l=C}if(v.type==="user"){let I=v.message?.content,N=Array.isArray(I)?I:[];for(let G of N){if(G?.type!=="tool_result")continue;let $=d.get(G.tool_use_id??"")??"tool",j=Ov(G.content,$);j>0&&n(`\u{1F441} ${$} \u2014 \uC774\uBBF8\uC9C0 ${j}\uAC1C (\uB2E4\uC74C \uC751\uB2F5\uC5D0 \uCCA8\uBD80)`)}return}if(v.type==="assistant"){let I=v.message?.content,N=Array.isArray(I)?I:[],G=N.filter($=>$?.type==="text"&&typeof $.text=="string").map($=>$.text).join("");G&&(p=!0,n(G));for(let $ of N)$?.type==="tool_use"&&(p=!0,typeof $.id=="string"&&d.set($.id,$.name??""),n(`\u2699 ${$.name}${Nv($.input)}`))}else v.type==="result"&&!p&&typeof v.result=="string"&&v.result&&n(v.result)};return c.stdout.on("data",w=>{u+=w.toString("utf8");let b=u.split(`
|
|
246
|
+
`);u=b.pop()??"";for(let k of b)m(k)}),c.stderr.on("data",w=>{f=(f+w.toString("utf8")).slice(-500)}),{done:new Promise(w=>{c.once("close",async b=>{u&&m(u),b!==0&&!p&&n(`[claude \uC885\uB8CC \uCF54\uB4DC ${b}] ${f.trim()||"\uB85C\uADF8\uC778/\uC124\uCE58 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (claude login)."}`),await rr.get(c)?.done,w({ok:b===0&&!rr.has(c),sessionId:l})}),c.once("error",async()=>{n("[claude \uC2E4\uD589 \uC2E4\uD328] Claude Code\uAC00 \uC124\uCE58\uB3FC \uC788\uB098\uC694? (npm i -g @anthropic-ai/claude-code)"),await Uc(c),w({ok:!1})})}),kill:()=>nn(c)}}},UI={provider:"codex",binary:"codex",tabPrefix:"codex",accountLabel:"OpenAI",accountProbe:{args:["login","status"],actionHint:"codex login"},run(t,{cwd:e,resumeSessionId:r,onText:n,onSessionId:o,onProcess:i,env:s=process.env}){if(jo)return Is();let c=jc("codex",r?["exec","--sandbox","workspace-write","resume",r,"--json",t]:["exec","--json","--sandbox","workspace-write",t],{cwd:e,env:s,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]});As(c,i),Wc(c,()=>n("[codex] 10\uBD84 \uD0C0\uC784\uC544\uC6C3 \u2014 \uD504\uB85C\uC138\uC2A4\uB97C \uC885\uB8CC\uD569\uB2C8\uB2E4."));let l,d=!1,p=!1,u=!1,f=!1,m="",h="",w="",b=v=>{let C=v.trim();if(!C)return;let I;try{I=JSON.parse(C)}catch{h=(h+`
|
|
247
|
+
`+C).slice(-2e3);return}if(!I||typeof I!="object"||Array.isArray(I))return;let N=I;if(N.type==="turn.started"&&(u=!1,p=!1),N.type==="turn.completed"&&(u=!0),N.type==="turn.failed"||N.type==="error"){f=!0;let B=N.error&&typeof N.error=="object"?N.error:N;n(typeof B.message=="string"?`[codex] ${B.message}`:"[codex] execution failed")}let G=N.thread,$=N.thread_id??N.session_id??G?.id;if(typeof $=="string"&&$.trim()){let B=$.trim();B!==l&&o?.(B),l=B}let j=N.item??N;String(j?.type??j?.item_type??"")==="agent_message"&&typeof j.text=="string"&&j.text&&(d=!0,(N.type==="item.completed"||N.type==="agent_message")&&(p=/\b(?:unable|cannot|can't|could not|couldn't|not able|failed)\b[\s\S]{0,160}\b(?:create|write|edit|modify|save|change|file|workspace|read[- ]only|readonly)\b/i.test(j.text)),n(j.text));let we=Fc(I,"codex");we>0&&n(`\u{1F441} \uC774\uBBF8\uC9C0 ${we}\uAC1C (\uB2E4\uC74C \uC751\uB2F5\uC5D0 \uCCA8\uBD80)`)};return c.stdout.on("data",v=>{m+=v.toString("utf8");let C=m.split(`
|
|
248
|
+
`);m=C.pop()??"";for(let I of C)b(I)}),c.stderr.on("data",v=>{w=(w+v.toString("utf8")).slice(-500)}),{done:new Promise(v=>{c.once("close",async C=>{if(m&&b(m),!d){let I=h.trim();I?n(I):C!==0&&n(`[codex \uC885\uB8CC \uCF54\uB4DC ${C}] ${w.trim()||"\uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (codex login)."}`)}C===0&&!u&&!f&&n("[codex] Output stream ended without confirmed turn completion."),await rr.get(c)?.done,v({ok:C===0&&u&&!f&&!p&&!rr.has(c),sessionId:l})}),c.once("error",async()=>{n("[codex \uC2E4\uD589 \uC2E4\uD328] Codex CLI\uAC00 \uC124\uCE58\uB3FC \uC788\uB098\uC694? (npm i -g @openai/codex)"),await Uc(c),v({ok:!1})})}),kill:()=>nn(c)}}};WI=Bc({provider:"antigravity",binary:"agy",tabPrefix:"agy",accountLabel:"Google",args:t=>["-p",t],loginHint:"\uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (agy auth login)."}),BI=Bc({provider:"cursor",binary:"cursor-agent",tabPrefix:"cursor",accountLabel:"Cursor",args:t=>["-p",t],loginHint:"\uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (cursor-agent login)."}),HI=Bc({provider:"copilot",binary:"copilot",tabPrefix:"copilot",accountLabel:"GitHub Copilot",args:t=>["-p",t,"-s","--no-ask-user"],loginHint:"\uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (copilot /login \uB610\uB294 gh auth login)."}),qI=Bc({provider:"opencode",binary:"opencode",tabPrefix:"oc",accountLabel:"OpenCode",args:t=>["run",t],loginHint:"\uC124\uC815 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (opencode auth)."}),GI={provider:"gemini-cli",binary:"gemini",tabPrefix:"gemini",accountLabel:"Google Gemini CLI",run(t,{cwd:e,resumeSessionId:r,onText:n,onSessionId:o,onProcess:i,env:s=process.env}){if(jo)return Is();let a=["-p",t,"--output-format","stream-json"];r&&a.unshift("--resume",r);let c=jc("gemini",a,{cwd:e,env:s,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]});As(c,i),Wc(c,()=>n("[gemini] 10\uBD84 \uD0C0\uC784\uC544\uC6C3 \u2014 \uD504\uB85C\uC138\uC2A4\uB97C \uC885\uB8CC\uD569\uB2C8\uB2E4."));let l,d=!1,p="",u="",f="",m=b=>typeof b=="string"?b:Array.isArray(b)?b.map(k=>{if(!k||typeof k!="object")return"";let v=k;return typeof v.text=="string"?v.text:typeof v.content=="string"?v.content:""}).join(""):"",h=b=>{let k=b.trim();if(!k)return;let v;try{v=JSON.parse(k)}catch{u=(u+`
|
|
249
|
+
`+k).slice(-2e3);return}let C=v,I=C.session_id??C.sessionId??C.init?.session_id;if(typeof I=="string"&&I.trim()){let Y=I.trim();Y!==l&&o?.(Y),l=Y}let N=String(C.type??"");if(N==="tool_use"){let Y=C.name??C.tool_name;typeof Y=="string"&&n(`\u2699 ${Y}${Nv(C.input??C.arguments)}`);return}if(N==="tool_result"){let Y=Fc(v,"gemini");Y>0&&n(`\u{1F441} \uC774\uBBF8\uC9C0 ${Y}\uAC1C (\uB2E4\uC74C \uC751\uB2F5\uC5D0 \uCCA8\uBD80)`);return}let G=C.message&&typeof C.message=="object"?C.message:C,$=G.role??C.role;if(N==="message"&&$!==void 0&&$!=="assistant"&&$!=="model")return;let j=m(G.content??C.content);if(j&&(d=!0,n(j)),N==="result"&&!d){let Y=typeof C.response=="string"?C.response:"";Y&&(d=!0,n(Y))}};return c.stdout.on("data",b=>{p+=b.toString("utf8");let k=p.split(`
|
|
250
|
+
`);p=k.pop()??"";for(let v of k)h(v)}),c.stderr.on("data",b=>{f=(f+b.toString("utf8")).slice(-500)}),{done:new Promise(b=>{c.once("close",async k=>{if(p&&h(p),!d){let v=u.trim();v?n(v):k!==0&&n(`[gemini \uC885\uB8CC \uCF54\uB4DC ${k}] ${f.trim()||"\uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694 (gemini)."}`)}await rr.get(c)?.done,b({ok:k===0&&!rr.has(c),sessionId:l})}),c.once("error",async()=>{n("[gemini \uC2E4\uD589 \uC2E4\uD328] Gemini CLI\uAC00 \uC124\uCE58\uB3FC \uC788\uB098\uC694? (`npm i -g @google/gemini-cli`)"),await Uc(c),b({ok:!1})})}),kill:()=>nn(c)}}},WH=be.models.localEndpoint.replace(/\/$/,""),VI=/^(?:npm|pnpm|yarn|bun)\s+(?:test|run\s+(?:test|typecheck|check|lint|build))(?:\s+[A-Za-z0-9_.:@=+,-]+)*$|^(?:git\s+(?:status|diff)(?:\s+(?:--stat|--check|--cached|--name-only|[A-Za-z0-9_.:@=+,-]+))*|(?:rg|grep)\s+[A-Za-z0-9_.:@=+,'"-]+(?:\s+[A-Za-z0-9_.:@=+,'"-]+)*)$/;KI={provider:"local",binary:"local",tabPrefix:"local",accountLabel:"Local model",async isAvailable(){return new kn(new K).isAvailable()},run(t,{cwd:e,onText:r}){if(jo)return Is();let n=new AbortController,o={aborted:!1,controller:n},i=c=>{o.aborted=!0,n.signal.aborted||n.abort(c)},s=setTimeout(()=>{r("[local agent] 10\uBD84 \uC2E4\uD589 \uC81C\uD55C\uC5D0 \uB3C4\uB2EC\uD574 \uC911\uB2E8\uD569\uB2C8\uB2E4."),i("local agent hard timeout")},mf);return s.unref?.(),{done:(async()=>{if(Rv(e)!==Rv(process.cwd()))return clearTimeout(s),r(`[local agent] \uC791\uC5C5 \uD3F4\uB354\uAC00 \uD604\uC7AC CLI \uD3F4\uB354\uC640 \uB2EC\uB77C \uC548\uC804\uD558\uAC8C \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${e}`),{ok:!1};if(!Av())return clearTimeout(s),r("[local agent] \uB85C\uCEEC \uBAA8\uB378 \uC6CC\uCEE4\uAC00 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4. \uBA54\uBAA8\uB9AC \uBCF4\uD638\uB97C \uC704\uD574 \uB3D9\uC2DC\uC5D0 \uD558\uB098\uB9CC \uC2E4\uD589\uD569\uB2C8\uB2E4."),{ok:!1};let c;try{let l=await Ts();if(!l.ok)return r(`[local agent] \uC2DC\uC2A4\uD15C \uBCF4\uD638\uB85C \uC2DC\uC791\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4: ${l.reason}`),{ok:!1};c=Nc(p=>{r(`[local agent] \uC628\uB3C4/\uBA54\uBAA8\uB9AC \uBCF4\uD638\uB85C \uC911\uB2E8\uD569\uB2C8\uB2E4: ${p}`),i(p)});let d=await Ln(t,{role:"worker",provider:new kn,registry:Cs({tier:"yolo",confineToCwd:!0,confirm:async()=>"once"}),fileClaims:new hr,tier:"yolo",cwd:e,signal:o,owner:"local-agent",label:"local",maxTurns:12,maxDurationMs:mf,maxToolOutputChars:3e4,maxTokens:128,temperature:0,systemPromptAppend:"Shell is allowlisted: only test/typecheck/check/lint/build, git status/diff, and cwd-relative rg/grep are accepted. Never request secrets or paths outside the working directory.",validateToolCall:zI,mutationCheckpoint:vv(e),onActivity:p=>r(`[local agent] ${p}`),onAssistant:p=>r(p)});return!o.aborted&&!d.trim()&&r("[local agent] No result produced \u2014 \uBAA8\uB378\uC774 \uCD5C\uC885 \uC751\uB2F5 \uC5C6\uC774 \uC885\uB8CC\uD588\uC2B5\uB2C8\uB2E4."),{ok:!o.aborted&&d.trim().length>0}}catch(l){return o.aborted||r(`[local agent \uC624\uB958] ${l instanceof Error?l.message:String(l)}`),{ok:!1}}finally{clearTimeout(s),c?.stop(),Cv()}})(),kill:()=>i("user requested stop")}}},Hc=_v([{id:"claude-code",runtime:Or(jI),aliases:["claude","claude-code"],canonicalName:"claude",advertiseOnDevice:!0},{id:"antigravity",runtime:Or(WI),aliases:["agy","antigravity"],canonicalName:"agy",advertiseOnDevice:!0},{id:"codex",runtime:Or(UI),aliases:["codex"],canonicalName:"codex",advertiseOnDevice:!0},{id:"gemini-cli",runtime:Or(GI),aliases:["gemini","gemini-cli"],canonicalName:"gemini",advertiseOnDevice:!0},{id:"cursor",runtime:Or(BI),aliases:["cursor","cursor-agent"],canonicalName:"cursor",advertiseOnDevice:!0},{id:"copilot",runtime:Or(HI),aliases:["copilot"],canonicalName:"copilot",advertiseOnDevice:!0},{id:"opencode",runtime:Or(qI),aliases:["opencode","oc"],canonicalName:"opencode",advertiseOnDevice:!0},{id:"local",runtime:Or(KI),aliases:["local","local-model"],canonicalName:"local"}]),$s=Object.fromEntries(Hc.byId);BH=Object.fromEntries(Hc.advertisedNames);YI=10*6e4,Lc=null;Uv=["claude-code","codex","gemini-cli","cursor","copilot","opencode","antigravity"]});function qc(t){let e;return()=>e||(e=(async()=>{let r,n=Promise.resolve().then(t.cleanup),o=Promise.race([n.catch(()=>{}),new Promise(i=>{r=setTimeout(i,t.cleanupTimeoutMs)})]).finally(()=>{r&&clearTimeout(r)});await Promise.all([Dv({shutdown:!0}),o]),t.exit()})(),e)}var bf=D(()=>{"use strict";Ms()});function e$(t){let e=t.trim();if(!e.startsWith("/"))return null;let r=e.slice(1).split(/\s+/),n=r[0]?.toLowerCase()||"",o=r.slice(1).join(" ");return{command:n,args:o}}var Kc,Xv=D(()=>{"use strict";Kc=class{commands=new Map;aliases=new Map;register(e){if(this.commands.set(e.name.toLowerCase(),e),e.aliases)for(let r of e.aliases)this.aliases.set(r.toLowerCase(),e.name.toLowerCase())}get(e){let r=e.toLowerCase(),n=this.aliases.get(r)||r;return this.commands.get(n)}has(e){let r=e.toLowerCase();return this.commands.has(r)||this.aliases.has(r)}getByCategory(e){return Array.from(this.commands.values()).filter(r=>r.category===e)}getAll(){return Array.from(this.commands.values())}async execute(e,r){let n=e$(e);if(!n)return!1;let o=this.get(n.command);return o?(await o.handler(n.args,r),!0):(r.error(`Unknown command: /${n.command}`),!1)}}});import{Client as t$}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as r$}from"@modelcontextprotocol/sdk/client/stdio.js";var Jc,Qv=D(()=>{"use strict";Ri();Jc=class{client;transport=null;config;status;logger;constructor(e,r){this.config=e,this.logger=r.child(`MCP:${e.name}`),this.client=new t$({name:"protocol-cli",version:"0.1.0"},{capabilities:{}}),this.status={name:e.name,status:"disconnected"}}async connect(){this.status.status="connecting",this.logger.info(`Connecting to MCP server: ${this.config.command}`),this.transport=new r$({command:this.config.command,args:this.config.args??[],env:this.config.env});let e=this.config.timeout??3e4;await Promise.race([this.client.connect(this.transport),new Promise((n,o)=>setTimeout(()=>o(new Error(`MCP connection timed out after ${e}ms`)),e))]),this.status.status="connected",this.status.connectedAt=Date.now();let r=await this.listTools();this.status.tools=r,this.logger.info(`Connected \u2014 ${r.length} tool(s) available`)}async disconnect(){this.transport&&(await this.transport.close(),this.transport=null),this.status.status="disconnected",this.status.connectedAt=void 0,this.logger.info("Disconnected")}async listTools(){try{return(await this.client.listTools()).tools.map(r=>({name:r.name,description:r.description??"",inputSchema:r.inputSchema??{},serverName:this.config.name}))}catch(e){let r=`Failed to list tools: ${e.message}`;return this.status.status="error",this.status.error=r,this.logger.error(r),[]}}async callTool(e,r){try{let n=await this.client.callTool({name:e,arguments:r});return{content:n.content.map(s=>{if(s.type==="text")return s.text??"";let a=Ti(s,e);return a?(ho(a),`[\uC774\uBBF8\uC9C0 ${a.mediaType} \u2014 \uB2E4\uC74C \uC751\uB2F5\uC5D0 \uCCA8\uBD80\uB428]`):JSON.stringify(s)}).join(`
|
|
251
|
+
`),isError:n.isError===!0,rawResult:n}}catch(n){return this.logger.error(`Tool '${e}' call failed: ${n.message}`),{content:n.message,isError:!0}}}getStatus(){return{...this.status}}isConnected(){return this.status.status==="connected"}}});var kf,Yc,Zv=D(()=>{"use strict";Qv();Le();kf=class extends ae{client;toolInfo;constructor(e,r){super(),this.client=e,this.toolInfo=r}get definition(){return{name:`mcp__${this.toolInfo.serverName}__${this.toolInfo.name}`,description:`[MCP:${this.toolInfo.serverName}] ${this.toolInfo.description}`,parameters:{type:"object",properties:this.toolInfo.inputSchema.properties??{},required:this.toolInfo.inputSchema.required}}}async execute(e,r){let n=await this.client.callTool(this.toolInfo.name,e);return{content:n.content,isError:n.isError,error:n.isError?n.content:void 0}}},Yc=class{clients=new Map;config;registry;log;constructor(e,r,n){this.config=e,this.registry=r,this.log=n.child("MCPManager")}async initialize(){let r=this.config.get("mcp").servers??[];if(r.length===0){this.log.debug("No MCP servers configured");return}this.log.info(`Connecting to ${r.length} MCP server(s)`),await Promise.allSettled(r.map(n=>this.connectServer(n).catch(o=>{this.log.error(`Failed to connect to '${n.name}': ${o.message}`)})))}async shutdown(){for(let[e,r]of this.clients)r.isConnected()&&await r.disconnect().catch(n=>this.log.error(`Failed to disconnect '${e}': ${n.message}`));this.clients.clear()}async connectServer(e){let r=new Jc(e,this.log);await r.connect(),this.clients.set(e.name,r),this.registerMCPTools(e.name,await r.listTools())}async disconnectServer(e){let r=this.clients.get(e);if(!r)throw new Error(`MCP server not found: ${e}`);await r.disconnect(),this.clients.delete(e)}registerMCPTools(e,r){let n=this.clients.get(e);if(n)for(let o of r){let i=new kf(n,o);this.registry.register(i),this.log.debug(`Registered tool: ${i.definition.name}`)}}getServerStatus(e){return this.clients.get(e)?.getStatus()}getAllStatuses(){return Array.from(this.clients.values()).map(e=>e.getStatus())}getToolsForServer(e){return this.clients.get(e)?.getStatus().tools??[]}async addServer(e){let n=[...this.config.get("mcp").servers??[]];if(n.find(o=>o.name===e.name))throw new Error(`MCP server '${e.name}' already exists`);n.push(e),this.config.set("mcp",{servers:n}),await this.connectServer(e)}async removeServer(e){await this.disconnectServer(e);let n=(this.config.get("mcp").servers??[]).filter(o=>o.name!==e);this.config.set("mcp",{servers:n})}}});import{existsSync as Xc,readdirSync as n$,readFileSync as o$}from"fs";import{join as Qc}from"path";var Zc,eS=D(()=>{"use strict";Zc=class{logger;constructor(e){this.logger=e.child("PluginLoader")}async loadPlugin(e){let r=Qc(e,"manifest.json");if(!Xc(r))throw new Error(`No manifest.json found in: ${e}`);let n=JSON.parse(o$(r,"utf-8"));if(!this.validateManifest(n))throw new Error(`Invalid manifest in: ${e}`);let o=Qc(e,n.entryPoint);if(!Xc(o))throw new Error(`Entry point not found: ${o}`);this.logger.debug(`Loading plugin from: ${e}`);let i=await import(o),s=i.default??i;if(typeof s.install!="function")throw new Error(`Plugin '${n.name}' missing install() function`);return{manifest:n,install:s.install.bind(s),uninstall:s.uninstall?.bind(s)}}async discoverPlugins(e){return Xc(e)?n$(e,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>Qc(e,n.name)).filter(n=>Xc(Qc(n,"manifest.json"))):[]}validateManifest(e){if(!e||typeof e!="object")return!1;let r=e;return typeof r.name=="string"&&typeof r.version=="string"&&typeof r.entryPoint=="string"}}});import{cpSync as i$,rmSync as s$}from"fs";import{join as a$,basename as c$}from"path";var el,tS=D(()=>{"use strict";eS();el=class{plugins=new Map;loader;registry;hookRegistry;commandRegistry;mcpManager;config;log;constructor(e){this.registry=e.registry,this.hookRegistry=e.hookRegistry,this.commandRegistry=e.commandRegistry,this.mcpManager=e.mcpManager,this.config=e.config,this.log=e.logger.child("PluginManager"),this.loader=new Zc(this.log)}async initialize(){let e=this.config.get("plugin").path,r=await this.loader.discoverPlugins(e);if(r.length===0){this.log.debug("No plugins found");return}this.log.info(`Loading ${r.length} plugin(s)`);for(let n of r)try{let o=await this.loadPlugin(n);await this.enablePlugin(o.manifest.name)}catch(o){this.log.error(`Failed to load plugin from '${n}': ${o.message}`)}}async loadPlugin(e){let r=await this.loader.loadPlugin(e),{manifest:n}=r;if(n.dependencies?.length){for(let i of n.dependencies)if(!this.plugins.has(i))throw new Error(`Plugin '${n.name}' requires '${i}' which is not loaded`)}let o={manifest:n,pluginDir:e,status:"loaded",install:r.install,uninstall:r.uninstall};return this.plugins.set(n.name,o),this.log.debug(`Plugin '${n.name}' v${n.version} loaded`),o}async enablePlugin(e){let r=this.plugins.get(e);if(!r)throw new Error(`Plugin not found: ${e}`);if(r.status==="enabled")return;let n=this.createPluginAPI(e);try{if(await r.install(n),r.status="enabled",this.log.info(`Plugin '${e}' enabled`),r.manifest.mcpServers?.length)for(let o of r.manifest.mcpServers)await this.mcpManager.addServer(o).catch(i=>this.log.warn(`Plugin '${e}' MCP server '${o.name}' failed: ${i.message}`))}catch(o){r.status="error",r.error=o.message,this.log.error(`Plugin '${e}' failed to enable: ${r.error}`)}}async disablePlugin(e){let r=this.plugins.get(e);if(!r)throw new Error(`Plugin not found: ${e}`);if(r.uninstall){let n=this.createPluginAPI(e);await r.uninstall(n).catch(o=>this.log.warn(`Plugin '${e}' uninstall error: ${o.message}`))}r.status="disabled",this.log.info(`Plugin '${e}' disabled`)}async installPlugin(e){let r=this.config.get("plugin").path,n=c$(e),o=a$(r,n);i$(e,o,{recursive:!0});let i=await this.loadPlugin(o);await this.enablePlugin(i.manifest.name),this.log.info(`Plugin installed: ${i.manifest.name}`)}async uninstallPlugin(e){let r=this.plugins.get(e);if(!r)throw new Error(`Plugin not found: ${e}`);await this.disablePlugin(e),s$(r.pluginDir,{recursive:!0,force:!0}),this.plugins.delete(e),this.log.info(`Plugin '${e}' uninstalled`)}listPlugins(){return Array.from(this.plugins.values())}getPlugin(e){return this.plugins.get(e)}createPluginAPI(e){let r=this.registry,n=this.hookRegistry,o=this.commandRegistry,i=this.mcpManager,s=this.config,a=this.log.child(e);return{registerTool:c=>{r.register(c),a.debug(`Registered tool: ${c.definition.name}`)},registerHook:c=>{n.register(c),a.debug(`Registered hook: ${c.event}`)},registerCommand:c=>{o.register(c),a.debug(`Registered command: /${c.name}`)},registerMCPServer:async c=>{await i.addServer(c),a.debug(`Registered MCP server: ${c.name}`)},getLogger:()=>a,getConfig:()=>s}}}});async function rS(t){let e=new Ef;await e.initialize();let r=new Pf;await r.initialize();let n=new Af;return await n.initialize(),{db:e,vector:r,cache:n}}var Ef,Pf,Af,nS=D(()=>{"use strict";Ef=class{async initialize(){}async close(){}async isHealthy(){return!0}async createUser(e,r){return{id:e,email:r,metadata:{},createdAt:new Date,updatedAt:new Date}}async getUser(e){return null}async getUserByEmail(e){return null}async updateUser(e,r){return{id:e,email:"",metadata:{},createdAt:new Date,updatedAt:new Date}}async deleteUser(e){}async createOrganization(e,r){return{id:r,name:e,slug:r,status:"active",settings:{},createdAt:new Date,updatedAt:new Date}}async getOrganization(e){return null}async getOrganizationBySlug(e){return null}async updateOrganization(e,r){return{id:e,name:"",slug:"",status:"active",settings:{},createdAt:new Date,updatedAt:new Date}}async deleteOrganization(e){}async addOrganizationMember(e,r,n,o){return{id:crypto.randomUUID(),organizationId:e,userId:r,role:n,invitedBy:o,joinedAt:new Date,createdAt:new Date,updatedAt:new Date}}async removeOrganizationMember(e,r){}async getOrganizationMembers(e){return[]}async getUserOrganizations(e){return[]}async updateMemberRole(e,r,n){}async createWorkspace(e,r,n,o){return{id:n,name:r,slug:n,organizationId:e,description:o?.description,visibility:o?.visibility??"private",settings:{},createdBy:o?.createdBy??"",createdAt:new Date,updatedAt:new Date}}async getWorkspace(e){return null}async getOrganizationWorkspaces(e){return[]}async getUserWorkspaces(e){return[]}async updateWorkspace(e,r){return{id:e,name:"",slug:"",visibility:"private",settings:{},createdBy:"",createdAt:new Date,updatedAt:new Date}}async deleteWorkspace(e){}async addWorkspaceMember(e,r,n){return{id:crypto.randomUUID(),workspaceId:e,userId:r,role:n,createdAt:new Date,updatedAt:new Date}}async removeWorkspaceMember(e,r){}async getWorkspaceMembers(e){return[]}async createSubscription(e,r){return{id:e,organizationId:e,tier:r,status:"active",currentPeriodStart:new Date,currentPeriodEnd:new Date,createdAt:new Date,updatedAt:new Date}}async getSubscription(e){return null}async getOrganizationSubscription(e){return null}async updateSubscription(e,r){return{id:e,tier:"free",status:"active",currentPeriodStart:new Date,currentPeriodEnd:new Date,createdAt:new Date,updatedAt:new Date}}async cancelSubscription(e){}async createApiKey(e,r,n,o,i,s){return{id:o,organizationId:e,userId:r,name:n,keyHash:o,keyPrefix:i,status:"active",permissions:s?.permissions??[],workspaceId:s?.workspaceId,expiresAt:s?.expiresAt,createdAt:new Date}}async getApiKeyByHash(e){return null}async getOrganizationApiKeys(e){return[]}async revokeApiKey(e){}async updateApiKeyLastUsed(e){}async createConversation(e,r,n){return{id:crypto.randomUUID(),organizationId:e,userId:r,workspaceId:n?.workspaceId,title:n?.title,graphConfig:n?.graphConfig,metadata:{},messageCount:0,totalTokensUsed:0,totalCostUsd:0,createdAt:new Date,updatedAt:new Date}}async getConversation(e){return null}async getUserConversations(e,r){return[]}async updateConversation(e,r){return{id:e,userId:"",metadata:{},messageCount:0,totalTokensUsed:0,totalCostUsd:0,createdAt:new Date,updatedAt:new Date}}async endConversation(e){}async deleteConversation(e){}async addMessage(e,r,n,o,i,s){return{id:crypto.randomUUID(),conversationId:e,role:r,content:n,toolCalls:o,toolResults:i,modelId:s?.modelId,inputTokens:s?.inputTokens,outputTokens:s?.outputTokens,costUsd:s?.costUsd,latencyMs:s?.latencyMs,metadata:{},createdAt:new Date}}async getConversationMessages(e){return[]}async storeMemory(e){return{...e,id:crypto.randomUUID(),createdAt:new Date,updatedAt:new Date}}async getMemory(e){return null}async getUserMemories(e,r){return[]}async updateMemoryAccess(e){}async deleteMemory(e){}async createDocument(e){return{...e,id:crypto.randomUUID(),createdAt:new Date,updatedAt:new Date}}async getDocument(e){return null}async getOrganizationDocuments(e,r){return[]}async updateDocument(e,r){return{id:e,userId:"",source:"",mimeType:"",contentHash:"",chunkCount:0,status:"pending",metadata:{},createdAt:new Date,updatedAt:new Date}}async deleteDocument(e){}async createDocumentChunks(e){return e.map(r=>({...r,id:crypto.randomUUID(),createdAt:new Date}))}async getDocumentChunks(e){return[]}async getChunk(e){return null}async deleteDocumentChunks(e){}async recordUsage(e,r,n,o,i,s){}async getUsage(e,r){return[]}async getOrganizationUsageSummary(e,r,n){return{totalTokens:0,totalCost:0,requestCount:0}}async createAuditLog(e){return{...e,id:crypto.randomUUID(),createdAt:new Date}}async getAuditLogs(e){return[]}async getConversationAuditLogs(e){return[]}async recordModelUsage(e){return{...e,id:crypto.randomUUID(),createdAt:new Date}}async getModelUsage(e){return[]}async getModelUsageSummary(e,r,n){return[]}},Pf=class{entries=new Map;async initialize(){}async close(){this.entries.clear()}async isHealthy(){return!0}async upsert(e){let r=crypto.randomUUID();return this.entries.set(r,{...e,id:r,createdAt:new Date}),r}async get(e){return this.entries.get(e)??null}async delete(e){this.entries.delete(e)}async deleteByEntity(e,r){for(let[n,o]of this.entries)o.entityType===e&&o.entityId===r&&this.entries.delete(n)}async search(e){let r=[];for(let n of this.entries.values()){if(e.organizationId&&n.organizationId!==e.organizationId)continue;let o=this.cosineSimilarity(e.embedding,n.embedding);(!e.threshold||o>=e.threshold)&&r.push({entry:n,score:o})}return r.sort((n,o)=>o.score-n.score).slice(0,e.limit??10)}async upsertBatch(e){return Promise.all(e.map(r=>this.upsert(r)))}async deleteBatch(e){e.forEach(r=>this.entries.delete(r))}cosineSimilarity(e,r){if(e.length!==r.length)return 0;let n=0,o=0,i=0;for(let s=0;s<e.length;s++)n+=e[s]*r[s],o+=e[s]**2,i+=r[s]**2;return o&&i?n/(Math.sqrt(o)*Math.sqrt(i)):0}},Af=class{cache=new Map;embeddingCache=new Map;async get(e){let r=this.cache.get(e);return r?r.expiresAt&&r.expiresAt<Date.now()?(this.cache.delete(e),null):r.value:null}async set(e,r,n){this.cache.set(e,{value:r,expiresAt:n?Date.now()+n*1e3:null})}async delete(e){this.cache.delete(e)}async deletePattern(e){let r=new RegExp("^"+e.replace("*",".*")+"$");for(let n of this.cache.keys())r.test(n)&&this.cache.delete(n)}async exists(e){let r=this.cache.get(e);return r?r.expiresAt&&r.expiresAt<Date.now()?(this.cache.delete(e),!1):!0:!1}async getEmbedding(e){let r=this.embeddingCache.get(e);return r?r.expiresAt&&r.expiresAt<Date.now()?(this.embeddingCache.delete(e),null):r.embedding:null}async setEmbedding(e,r,n){this.embeddingCache.set(e,{embedding:r,expiresAt:n?Date.now()+n*1e3:null})}async initialize(){}async close(){this.cache.clear(),this.embeddingCache.clear()}async isHealthy(){return!0}}});import{randomUUID as Cf}from"crypto";import{hostname as sS,platform as l$,arch as u$,cpus as d$,totalmem as p$,freemem as f$,homedir as h$}from"os";function m$(){return g$(process.env.PROTOCOL_RUNNER_SOLO)}function g$(t){let e=(t||"").trim().toLowerCase();return e==="1"||e==="true"||e==="on"||e==="yes"}async function Ns(t,e){let r=await Ye().request(t,e);if(r.status===404)return null;if(!r.ok)throw new Error(`registry API ${e?.method??"GET"} ${t} failed (${r.status})`);return await r.json().catch(()=>null)}async function w$(t,e){return(await Ns(Ls(t,e)))?.item??null}async function aS(t,e,r){await Ns(Ls(t,e),{method:"PUT",body:JSON.stringify(r)})}async function cS(t,e,r){return await Ns(Ls(t,e),{method:"PATCH",body:JSON.stringify(r)})!==null}async function y$(t,e){await Ns(Ls(t,e),{method:"DELETE"})}async function b$(t){return((await Ns(`${Ls(t)}?limit=2000`))?.items??[]).filter(r=>r.deleted!==!0&&typeof r.id=="string").map(r=>({id:r.id,data:r}))}function Ho(t){return t.getSession()?.user?.id??null}function jn(t){let e=t??new K,r=e.get("device")?.deviceId;if(r)return r;let n=Cf();return e.set("device",{deviceId:n}),n}async function lS(t){try{let e=t??new K;if(!Ho(e))return;let n=jn(e),o=new Date().toISOString(),i=()=>({deviceId:n,hostname:sS(),platform:l$(),arch:u$(),cliVersion:oS,firstSeenAt:o,lastSeenAt:o});await cS("cli_devices",n,{lastSeenAt:o,cliVersion:oS})||await aS("cli_devices",n,i())}catch(e){console.error("\uAE30\uAE30 \uB4F1\uB85D \uC2E4\uD328 \u2014 \uBB34\uC2DC (registry \uBD88\uD1B5\uC774\uC5B4\uB3C4 CLI \uB294 \uACC4\uC18D\uB429\uB2C8\uB2E4):",e)}}async function uS(){try{return await Fv()}catch(t){return console.error("\uC124\uCE58\uB41C CLI \uAC10\uC9C0 \uC2E4\uD328 \u2014 agents \uBCF4\uACE0\uB97C \uAC74\uB108\uB701\uB2C8\uB2E4:",t.message),null}}async function x$(t,e={},r){let n=r??new K;if(!Ho(n))return"";let i=e.serverId??Cf();try{let s=await uS(),a=us(),c={serverId:i,deviceId:jn(n),kind:t,name:e.name||sS(),host:e.host??null,port:e.port??null,startedAt:new Date().toISOString(),lastHeartbeat:new Date().toISOString(),...s?{agents:s}:{},...a.length?{providerProfiles:a}:{},...e.cwd?{cwd:e.cwd}:{},homeDir:h$()};await aS("cli_servers",i,c)}catch(s){return console.error("\uC11C\uBC84 \uB4F1\uB85D \uC2E4\uD328 \u2014 \uBB34\uC2DC (registry \uBD88\uD1B5\uC774\uC5B4\uB3C4 \uC11C\uBC84\uB294 \uACC4\uC18D\uB429\uB2C8\uB2E4):",s),""}return i}function k$(){let t=0,e=0;for(let i of d$()){let s=i.times;t+=s.idle,e+=s.user+s.nice+s.sys+s.idle+s.irq}let r={idle:t,total:e};if(!Ds){Ds=r;return}let n=t-Ds.idle,o=e-Ds.total;if(Ds=r,!(o<=0))return Math.max(0,Math.min(1,1-n/o))}async function E$(t,e){if(!t)return;let r=e??new K;if(Ho(r))try{let o={lastHeartbeat:new Date().toISOString(),memPct:1-f$()/p$()},i=k$();i!==void 0&&(o.cpuPct=i);let s=await uS();s&&(o.agents=s),o.providerProfiles=us(),await cS("cli_servers",t,o)}catch(o){console.error("\uC11C\uBC84 \uD558\uD2B8\uBE44\uD2B8 \uC2E4\uD328 \u2014 \uBB34\uC2DC (\uB2E4\uC74C \uC8FC\uAE30\uC5D0 \uC7AC\uC2DC\uB3C4):",o)}}async function P$(t,e){if(!t)return;let r=e??new K;if(Ho(r))try{await y$("cli_servers",t)}catch(o){console.error("\uC11C\uBC84 \uB4F1\uB85D \uD574\uC81C \uC2E4\uD328 \u2014 \uBB34\uC2DC (lastHeartbeat \uB9CC\uB8CC\uB85C \uC6F9\uC774 \uC815\uB9AC\uB429\uB2C8\uB2E4):",o)}}function tl(t,e={},r){let n=Cf(),o=e.handleSignals!==!1,i=!1,s=null;x$(t,{...e,serverId:n},r).then(c=>{i||!c||(s=setInterval(()=>{E$(c,r)},S$))});let a=async()=>{i||(i=!0,s&&clearInterval(s),n&&await Promise.race([P$(n,r),new Promise(c=>setTimeout(c,2e3))]))};if(o){let c=qc({cleanup:async()=>{await Promise.all([a(),e.onShutdown?.()])},cleanupTimeoutMs:2e3,exit:()=>process.exit(0)});process.on("SIGINT",c),process.on("SIGTERM",c)}return process.once("exit",()=>{s&&clearInterval(s)}),{serverId:n,stop:a}}function T$(t){let{myDeviceId:e,preferredDeviceId:r}=t;if(!r)return{run:!0,reason:"no-preference"};if(r===e)return{run:!0,reason:"preferred"};let n=new Set(t.liveRunnerDeviceIds);if(n.has(r))return{run:!1,reason:"preferred-device-online"};n.add(e),n.delete(r);let[o]=Array.from(n).sort();return o===e?{run:!0,reason:"failover"}:{run:!1,reason:`failover-to:${o}`}}function R$(t){let e=Array.from(new Set(t.liveRunnerDeviceIds)).sort();return e.length===0?{run:!1,reason:"registry-unavailable"}:e.includes(t.myDeviceId)?e[0]===t.myDeviceId?{run:!0,reason:"registry-degraded-elected"}:{run:!1,reason:`registry-degraded-yield:${e[0]}`}:{run:!1,reason:"registry-degraded-unlisted"}}async function I$(t){let e=t??new K;if(!Ho(e))return null;let o=(await w$("cli_prefs","cli"))?.preferredDeviceId;return typeof o=="string"&&o?o:null}async function rl(t){let e=t??new K;if(!Ho(e))return[];let n=await b$("cli_servers"),o=Date.now();return n.filter(i=>i.data.kind==="runner").filter(i=>{let s=i.data.lastHeartbeat,a=typeof s=="string"?Date.parse(s):0;return a>0&&o-a<=v$}).map(i=>String(i.data.deviceId??"")).filter(Boolean)}async function dS(t){if(Bo&&Date.now()-Bo.at<_$(Bo.run))return{run:Bo.run,reason:Bo.reason};let e=t??new K,r;try{let n=await I$(e);r=n?T$({myDeviceId:jn(e),preferredDeviceId:n,liveRunnerDeviceIds:await rl(e)}):{run:!0,reason:"no-preference"}}catch(n){m$()?(console.error("\uC2E4\uD589 \uAE30\uAE30 \uD655\uC778 \uC2E4\uD328 \u2014 \uB2E8\uB3C5 \uBAA8\uB4DC(PROTOCOL_RUNNER_SOLO=1)\uB77C \uACC4\uC18D \uC9C4\uD589\uD569\uB2C8\uB2E4:",n.message),r={run:!0,reason:"registry-unavailable-solo"}):r=await $$(e,n)}return Bo={at:Date.now(),...r},r}async function $$(t,e){let r;try{r=await rl(t)}catch(o){return console.error(`\uC2E4\uD589 \uAE30\uAE30 \uD655\uC778 \uC2E4\uD328 \u2014 \uC911\uBCF5 \uC2E4\uD589\uC744 \uB9C9\uAE30 \uC704\uD574 \uC774\uBC88 \uC0AC\uC774\uD074\uC740 \uC27D\uB2C8\uB2E4. \uC774 \uAE30\uAE30 \uD558\uB098\uB9CC \uB7EC\uB108\uB97C \uB3CC\uB9AC\uB294 \uAC8C \uD655\uC2E4\uD558\uBA74 PROTOCOL_RUNNER_SOLO=1 \uB85C \uCF1C\uC138\uC694: ${e.message} / ${o.message}`),{run:!1,reason:"registry-unavailable"}}let n=R$({myDeviceId:jn(t),liveRunnerDeviceIds:r});return iS!==n.reason&&(iS=n.reason,console.error(`\uAE30\uBCF8 \uC2E4\uD589 \uAE30\uAE30 \uC124\uC815\uC744 \uBABB \uC77D\uC5B4 \uB7EC\uB108 \uBAA9\uB85D\uC73C\uB85C\uB9CC \uD310\uC815\uD569\uB2C8\uB2E4(${n.reason}): ${e.message}`)),n}var Ls,v$,S$,oS,Ds,A$,C$,_$,Bo,iS,nl=D(()=>{"use strict";ge();ze();Ms();Rn();bf();Ls=(t,e)=>`/api/user-data/${t}${e?`/${encodeURIComponent(e)}`:""}`;v$=9e4,S$=3e4,oS="0.1.3";Ds=null;A$=6e4,C$=15e3,_$=t=>t?A$:C$,Bo=null,iS=null});var pS,fS=D(()=>{"use strict";uo();pS=[{event:"PostToolUse",priority:-10,handler:async t=>{let e=t;ht.child("ToolAudit").debug(`${e.toolName??"unknown"} completed in ${e.duration??0}ms`,{isError:e.result?.isError??!1})}},{event:"OnError",priority:100,handler:async t=>{let e=t;ht.child("ErrorHook").error(e.error?.message??"Unknown error")}}]});import He from"chalk";import O$ from"inquirer";import{homedir as M$}from"os";import{join as D$}from"path";function hS(t){_f=t}function il(){return _f||(console.error(He.red("MCP manager not initialized")),process.exit(1)),_f}var _f,Un,ol,Tf=D(()=>{"use strict";De();_f=null;Un=new se("mcp").description("Manage MCP servers");Un.command("list").description("List configured MCP servers").action(()=>{let e=il().getAllStatuses();if(e.length===0){console.log(He.gray(" No MCP servers configured"));return}console.log(He.blue("MCP Servers:"));for(let r of e){let n=r.status==="connected"?He.green:r.status==="error"?He.red:He.gray;console.log(` ${He.bold(r.name)} ${n(`[${r.status}]`)} \u2014 ${r.tools?.length??0} tool(s)`),r.error&&console.log(` ${He.red(r.error)}`)}});Un.command("tools [name]").description("List tools provided by an MCP server").action(t=>{let e=il(),r=t?[e.getServerStatus(t)].filter(Boolean):e.getAllStatuses();for(let n of r){if(!n)continue;console.log(He.blue(`
|
|
252
|
+
${n.name}:`));let o=e.getToolsForServer(n.name);if(o.length===0)console.log(He.gray(" No tools"));else for(let i of o)console.log(` ${He.bold(i.name)} \u2014 ${i.description}`)}});ol={browser:{command:"npx",args:["-y","@playwright/mcp@latest","--browser","chrome"],note:"\uBE0C\uB77C\uC6B0\uC800 \uC81C\uC5B4 (Playwright). \uB9E4\uBC88 \uAE68\uB057\uD55C \uD504\uB85C\uD544 \u2014 \uB85C\uADF8\uC778 \uC548 \uB0A8\uB294\uB2E4."},"browser-profile":{command:"npx",args:["-y","@playwright/mcp@latest","--browser","chrome","--user-data-dir",D$(M$(),".protocol-cli","browser-profile")],note:"\uBE0C\uB77C\uC6B0\uC800 \uC81C\uC5B4 + \uB85C\uADF8\uC778 \uC720\uC9C0 (~/.protocol-cli/browser-profile)."},"browser-attach":{command:"npx",args:["-y","@playwright/mcp@latest","--cdp-endpoint","http://localhost:9222"],note:"\uC774\uBBF8 \uB5A0 \uC788\uB294 \uD06C\uB86C\uC5D0 \uBD99\uAE30 (\uBA3C\uC800 chrome --remote-debugging-port=9222)."}};Un.command("presets").description("List available MCP server presets").action(()=>{console.log(He.blue("Presets:"));for(let[t,e]of Object.entries(ol))console.log(` ${He.bold(t)} \u2014 ${e.note}`),console.log(He.gray(` protocol mcp add ${t} --preset ${t}`))});Un.command("add <name>").description("Add an MCP server").option("-c, --command <command>","Command to run the server").option("-a, --args <args...>","Arguments for the server command").option("-p, --preset <preset>",`Use a preset (${Object.keys(ol).join(", ")})`).action(async(t,e)=>{let r=il();if(e.preset){let o=ol[e.preset];if(!o){console.error(He.red(`Unknown preset '${e.preset}'. Available: ${Object.keys(ol).join(", ")}`));return}e.command=o.command,e.args=o.args,console.log(He.gray(` preset '${e.preset}': ${o.note}`))}let n=e.command;if(!n){let o=await O$.prompt([{type:"input",name:"command",message:"Server command:",validate:i=>!!i||"Required"},{type:"input",name:"args",message:"Arguments (space-separated):",default:""}]);n=o.command,!e.args&&o.args.trim()&&(e.args=o.args.trim().split(/\s+/))}try{await r.addServer({name:t,command:n,args:e.args}),console.log(He.green(`\u2713 MCP server '${t}' added and connected`))}catch(o){console.error(He.red(`Failed: ${o.message}`))}});Un.command("remove <name>").description("Remove an MCP server").action(async t=>{let e=il();try{await e.removeServer(t),console.log(He.green(`\u2713 MCP server '${t}' removed`))}catch(r){console.error(He.red(`Failed: ${r.message}`))}})});import ot from"chalk";function mS(t){Rf=t}function Fs(){return Rf||(console.error(ot.red("Plugin manager not initialized")),process.exit(1)),Rf}var Rf,Wn,If=D(()=>{"use strict";De();Rf=null;Wn=new se("plugin").description("Manage plugins");Wn.command("list").description("List installed plugins").action(()=>{let e=Fs().listPlugins();if(e.length===0){console.log(ot.gray(" No plugins installed"));return}console.log(ot.blue("Installed Plugins:"));for(let r of e){let n=r.status==="enabled"?ot.green:r.status==="error"?ot.red:ot.gray;console.log(` ${ot.bold(r.manifest.name)} v${r.manifest.version} ${n(`[${r.status}]`)}`),r.manifest.description&&console.log(` ${ot.gray(r.manifest.description)}`),r.error&&console.log(` ${ot.red(r.error)}`)}});Wn.command("install <path>").description("Install a plugin from path").action(async t=>{let e=Fs();try{await e.installPlugin(t),console.log(ot.green(`\u2713 Plugin installed from: ${t}`))}catch(r){console.error(ot.red(`Failed: ${r.message}`))}});Wn.command("remove <name>").description("Remove a plugin").action(async t=>{let e=Fs();try{await e.uninstallPlugin(t),console.log(ot.green(`\u2713 Plugin '${t}' removed`))}catch(r){console.error(ot.red(`Failed: ${r.message}`))}});Wn.command("enable <name>").description("Enable a disabled plugin").action(async t=>{let e=Fs();try{await e.enablePlugin(t),console.log(ot.green(`\u2713 Plugin '${t}' enabled`))}catch(r){console.error(ot.red(`Failed: ${r.message}`))}});Wn.command("disable <name>").description("Disable a plugin").action(async t=>{let e=Fs();try{await e.disablePlugin(t),console.log(ot.green(`\u2713 Plugin '${t}' disabled`))}catch(r){console.error(ot.red(`Failed: ${r.message}`))}})});function gS(t,e){let r;switch(t.provider){case"openai":r=new $f({model:t.model});break;case"local":r=new Of;break;case"protocol":r=new Mf;break;default:throw new Error(`Unknown embedding provider: ${t.provider}`)}return new Df(r,e,{cacheEnabled:t.cacheEnabled,cacheTTL:t.cacheTTL})}var $f,Of,Mf,Df,wS=D(()=>{"use strict";ge();ze();Tc();$f=class{name="openai";dimension;model;apiKey;constructor(e){this.model=e?.model||be.embeddings.openaiModel,this.dimension=this.model.includes("large")?3072:1536,this.apiKey=e?.apiKey||be.auth.openaiApiKey||process.env.OPENAI_API_KEY}async embed(e){if(!this.apiKey)throw new Error("OpenAI API key not configured");let r=await fetch(be.endpoints.openaiEmbedding,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:e})});if(!r.ok){let o=await r.text();throw new Error(`OpenAI embedding failed: ${o}`)}return(await r.json()).data[0].embedding}async embedBatch(e){if(!this.apiKey)throw new Error("OpenAI API key not configured");let r=await fetch(be.endpoints.openaiEmbedding,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,input:e})});if(!r.ok){let o=await r.text();throw new Error(`OpenAI embedding failed: ${o}`)}return(await r.json()).data.map(o=>o.embedding)}async isAvailable(){return!!this.apiKey}},Of=class{name="local";dimension=384;model=null;initialized=!1;async initialize(){if(!this.initialized)try{let{pipeline:e}=await import("@xenova/transformers");this.model=await e("feature-extraction",be.embeddings.localModel),this.initialized=!0}catch{throw new Error("Failed to load local embedding model. Install @xenova/transformers")}}async embed(e){if(this.initialized||await this.initialize(),!this.model)throw new Error("Local embedding model not initialized");let r=await this.model(e,{pooling:"mean",normalize:!0});return Array.from(r.data)}async embedBatch(e){let r=[];for(let n of e)r.push(await this.embed(n));return r}async isAvailable(){try{return this.initialized||await this.initialize(),!0}catch{return!1}}},Mf=class{name="protocol";dimension=768;async embed(e){let r=await this.callEmbedding(e);if(!Array.isArray(r.embeddings)||r.embeddings.length===0||typeof r.embeddings[0]!="number")throw new Error("Protocol embedding: invalid response shape (expected { embeddings: number[] })");return r.embeddings}async embedBatch(e){if(e.length===0)return[];let r=await this.callEmbedding(e);if(!Array.isArray(r.embeddings)||!r.embeddings.every(n=>Array.isArray(n)))throw new Error("Protocol embedding: invalid response shape (expected { embeddings: number[][] })");return r.embeddings}async callEmbedding(e){let r=await Ye().request("/api/embedding",{method:"POST",body:JSON.stringify({input:e})});if(!r.ok){let n="";try{n=await r.text()}catch{}throw new Error(`Protocol embedding failed (${r.status}): ${n}`)}return await r.json()}async isAvailable(){try{return await Ye().getValidToken(),!0}catch{return!1}}},Df=class{provider;cache;cacheEnabled;cacheTTL;constructor(e,r,n){this.provider=e,this.cache=r,this.cacheEnabled=n?.cacheEnabled??!0,this.cacheTTL=n?.cacheTTL??86400}async embed(e){if(this.cacheEnabled&&this.cache){let n=await this.cache.getEmbedding(e);if(n)return{embedding:n,dimension:n.length,model:this.provider.name,tokens:0,cached:!0}}let r=await this.provider.embed(e);return this.cacheEnabled&&this.cache&&await this.cache.setEmbedding(e,r,this.cacheTTL),{embedding:r,dimension:r.length,model:this.provider.name,tokens:this.estimateTokens(e),cached:!1}}async embedBatch(e){let r=[],n=[];if(this.cacheEnabled&&this.cache)for(let o=0;o<e.length;o++){let i=await this.cache.getEmbedding(e[o]);i?r[o]={embedding:i,dimension:i.length,model:this.provider.name,tokens:0,cached:!0}:n.push({index:o,text:e[o]})}else for(let o=0;o<e.length;o++)n.push({index:o,text:e[o]});if(n.length>0){let o=await this.provider.embedBatch(n.map(i=>i.text));for(let i=0;i<n.length;i++){let{index:s,text:a}=n[i],c=o[i];r[s]={embedding:c,dimension:c.length,model:this.provider.name,tokens:this.estimateTokens(a),cached:!1},this.cacheEnabled&&this.cache&&await this.cache.setEmbedding(a,c,this.cacheTTL)}}return r}estimateTokens(e){return Math.ceil(e.length/4)}getDimension(){return this.provider.dimension}getProvider(){return this.provider}getProviderName(){return this.provider.name}}});async function qo(){let t=ht;t.debug("Bootstrapping protocol-cli");let e=new K;e.ensureDirectories();let r=e.getAuthStatus();r.authenticated&&r.missingCredentials.length===0?t.info(`\u2713 ${r.statusLine}`):t.warn(`\u26A0 ${r.statusLine}`),lS(e);let n=new ur;for(let m of pS)n.register(m);let o=new en({hookRegistry:n}),i=new Kc,s=await rS({environment:"development"});t.debug("Storage: NullDatabase + in-memory (\uC601\uC18D\uC740 Protocol API PlanStore)");let a=r.embeddingProvider,c=gS({provider:a},s.cache),l=Yb(c,{timeoutMs:1e4,loudWarning:!1}).catch(m=>(t.warn("Embedding self-check unexpected error",{error:String(m)}),null)),d=new go,p=new Yc(e,o,t);hS(p);let u=new el({registry:o,hookRegistry:n,commandRegistry:i,mcpManager:p,config:e,logger:t});mS(u),Rp(o,d),await Promise.all([p.initialize(),u.initialize()]);let f=await l;return t.debug("Bootstrap complete"),{config:e,registry:o,hookRegistry:n,commandRegistry:i,mcpManager:p,pluginManager:u,modelRouter:d,storage:s,logger:t,embeddingService:c,embeddingCheck:f,authStatus:r}}var sl=D(()=>{"use strict";uo();ge();Ac();$i();Xv();Zv();tS();Bd();nS();nl();fS();Tf();If();_o();wS()});var Bx={};va(Bx,{CliAgentPublisher:()=>ph});function Wx(t){return t.replace(/[^\w.-]+/g,"_").slice(0,64)||"default"}function $M(t){if(!t)return"";let e=t.replace(/\s+/g," ").trim();return e.length>Ux?e.slice(0,Ux)+"\u2026":e}var Ux,ph,Hx=D(()=>{"use strict";Mn();ze();Ux=160;ph=class{constructor(e,r){this.session=r}project=Hp();published=new Map;startedAt=new Map;docId(e){return`${Wx(this.session)}__${Wx(e)}`}async writeDoc(e,r){let n=await Ye().request(`/api/user-data/cli_agents/${encodeURIComponent(this.docId(e))}`,{method:"PUT",body:JSON.stringify(r)});if(!n.ok)throw new Error(`cli_agents \uBC1C\uD589 \uC2E4\uD328 (${n.status})`)}async writeDocById(e,r){let n=await Ye().request(`/api/user-data/cli_agents/${encodeURIComponent(e)}`,{method:"PUT",body:JSON.stringify(r)});if(!n.ok)throw new Error(`cli_agents \uC815\uB9AC \uC2E4\uD328 (${n.status})`)}async listDocs(){let e=await Ye().request("/api/user-data/cli_agents?limit=2000");if(!e.ok)throw new Error(`cli_agents \uC870\uD68C \uC2E4\uD328 (${e.status})`);return((await e.json()).items??[]).filter(n=>n.deleted!==!0&&typeof n.id=="string").map(n=>({id:n.id,data:n}))}async cleanupPrevious(){try{let e=await this.listDocs(),r=new Date().toISOString();await Promise.all(e.filter(n=>n.data.session===this.session&&n.data.status!=="done").map(n=>this.writeDocById(n.id,{...n.data,status:"done",updatedAt:r}).catch(o=>console.error("\uC5D0\uC774\uC804\uD2B8 \uC0C1\uD0DC \uB3D9\uAE30\uD654 \uC2E4\uD328 \u2014 \uC6F9\uC5D0\uC11C \uCD5C\uC2E0\uC73C\uB85C \uC548 \uBCF4\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4:",o))))}catch{}}async sync(e){let r=new Date().toISOString();for(let n of e){this.startedAt.has(n.id)||this.startedAt.set(n.id,r);let o={name:n.name,status:n.status,provider:n.provider??"protocol",session:this.session,project:this.project.name,projectId:this.project.id,lastMessage:$M(n.lastMessage),startedAt:this.startedAt.get(n.id),updatedAt:r},i=this.published.get(n.id);if(!i||i.name!==o.name||i.status!==o.status||i.lastMessage!==o.lastMessage)try{await this.writeDoc(n.id,o),this.published.set(n.id,o)}catch{}}}async markAllDone(){let e=new Date().toISOString();await Promise.all([...this.published.entries()].map(([r,n])=>this.writeDoc(r,{...n,status:"done",updatedAt:e}).catch(o=>console.error("\uC5D0\uC774\uC804\uD2B8 \uC644\uB8CC \uD45C\uC2DC \uC2E4\uD328 \u2014 \uC6F9\uC5D0 \uACC4\uC18D \uC9C4\uD589 \uC911\uC73C\uB85C \uBCF4\uC785\uB2C8\uB2E4:",o))))}}});var zl,uk=D(()=>{"use strict";Sn();zl=class{cloud;buffer=new Map;cloudWritable=new Map;taken=new Set;constructor(e){this.cloud=e?new Ne(e):null}async pickName(e){let r=new Set;if(this.cloud)try{for(let i of await this.cloud.list())r.add(i.name)}catch(i){console.warn(`[serve] \uC138\uC158 \uC774\uB984 \uD6C4\uBCF4\uB97C \uD074\uB77C\uC6B0\uB4DC\uC5D0\uC11C \uBABB \uC77D\uC74C \u2014 \uC774 \uD504\uB85C\uC138\uC2A4 \uAE30\uC900\uC73C\uB85C\uB9CC \uACE0\uB985\uB2C8\uB2E4: ${i.message}`)}let n=i=>r.has(i)||this.taken.has(i);if(!n(e))return this.taken.add(e),e;for(let i=2;i<1e3;i++){let s=`${e}-${i}`;if(!n(s))return this.taken.add(s),s}let o=`${e}-${Date.now().toString(36).slice(-4)}`;return this.taken.add(o),o}async load(e){if(!this.cloud)return this.cloudWritable.delete(e),{messages:this.buffer.get(e)??[],cloud:!1};try{let r=await this.cloud.load(e);if(!r.ok||r.deleted||r.archived)return this.cloudWritable.set(e,!1),{messages:this.buffer.get(e)??[],cloud:!1};this.cloudWritable.set(e,!0);let n=r.messages??[];return this.buffer.set(e,n),{messages:n,cloud:!0}}catch(r){return this.cloudWritable.set(e,!1),console.warn(`[serve] \uC138\uC158 '${e}' \uD074\uB77C\uC6B0\uB4DC \uB85C\uB4DC \uC2E4\uD328 \u2014 \uC778\uBA54\uBAA8\uB9AC\uB85C\uB9CC \uB3D9\uC791\uD569\uB2C8\uB2E4: ${r.message}`),{messages:this.buffer.get(e)??[],cloud:!1}}}async save(e,r){if(this.buffer.set(e,[...r]),!!this.cloud&&this.cloudWritable.get(e)===!0)try{await this.cloud.save(e,r)}catch(n){this.cloudWritable.set(e,!1),console.warn(`[serve] Session '${e}' was not synced; local work retained: ${n.message}`)}}}});var dk,pk=D(()=>{"use strict";dk=`<!DOCTYPE html>
|
|
253
|
+
<html lang="en" data-theme="dark">
|
|
254
|
+
<head>
|
|
255
|
+
<meta charset="UTF-8">
|
|
256
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
257
|
+
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
258
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
259
|
+
<meta name="theme-color" content="#111111">
|
|
260
|
+
<title>Protocol</title>
|
|
261
|
+
<style>
|
|
262
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
263
|
+
|
|
264
|
+
/* \u2500\u2500 Dark theme (default) \u2500\u2500 */
|
|
265
|
+
:root,[data-theme="dark"]{
|
|
266
|
+
--red:#cc0000;
|
|
267
|
+
--bg:#111;--bg2:#1a1a1a;
|
|
268
|
+
--border:#252525;
|
|
269
|
+
--text:#ddd;--muted:#555;
|
|
270
|
+
--user-bg:#1a1a2e;--user-border:#2a2a4e;--user-text:#aac;
|
|
271
|
+
--tool-color:#cc0000;
|
|
272
|
+
--inp-bg:#1a1a1a;--inp-border:#252525;
|
|
273
|
+
--new-border:#282828;--new-text:#555;--new-hover-border:#383838;--new-hover-text:#999;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* \u2500\u2500 Light theme \u2500\u2500 */
|
|
277
|
+
[data-theme="light"]{
|
|
278
|
+
--red:#cc0000;
|
|
279
|
+
--bg:#fafafa;--bg2:#f0f0f0;
|
|
280
|
+
--border:#e0e0e0;
|
|
281
|
+
--text:#111;--muted:#888;
|
|
282
|
+
--user-bg:#e8f0fe;--user-border:#c5d5f8;--user-text:#1a3a7a;
|
|
283
|
+
--tool-color:#aa0000;
|
|
284
|
+
--inp-bg:#fff;--inp-border:#d0d0d0;
|
|
285
|
+
--new-border:#d8d8d8;--new-text:#888;--new-hover-border:#aaa;--new-hover-text:#333;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
body{
|
|
289
|
+
background:var(--bg);color:var(--text);
|
|
290
|
+
font-family:'SF Mono',Menlo,monospace;
|
|
291
|
+
height:100dvh;display:flex;flex-direction:column;overflow:hidden;
|
|
292
|
+
transition:background .2s,color .2s
|
|
293
|
+
}
|
|
294
|
+
header{
|
|
295
|
+
padding:12px 16px;border-bottom:1px solid var(--border);
|
|
296
|
+
display:flex;align-items:center;gap:8px;flex-shrink:0;
|
|
297
|
+
padding-top:max(12px, env(safe-area-inset-top));
|
|
298
|
+
background:var(--bg)
|
|
299
|
+
}
|
|
300
|
+
header .logo{width:8px;height:8px;border-radius:50%;background:var(--red)}
|
|
301
|
+
header .title{font-size:13px;font-weight:bold;letter-spacing:2px;color:var(--text)}
|
|
302
|
+
header .sid{font-size:10px;color:var(--muted)}
|
|
303
|
+
#msgs{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:16px;background:var(--bg)}
|
|
304
|
+
.msg{font-size:13px;line-height:1.6;max-width:100%}
|
|
305
|
+
.msg.user{
|
|
306
|
+
align-self:flex-end;
|
|
307
|
+
background:var(--user-bg);border:1px solid var(--user-border);
|
|
308
|
+
padding:10px 14px;border-radius:14px 14px 3px 14px;max-width:80%;
|
|
309
|
+
color:var(--user-text);word-break:break-word
|
|
310
|
+
}
|
|
311
|
+
.msg.assistant{align-self:flex-start;white-space:pre-wrap;word-break:break-word;color:var(--text)}
|
|
312
|
+
.msg.tool{align-self:flex-start;color:var(--tool-color);font-size:11px;opacity:.8;padding:2px 0}
|
|
313
|
+
.cursor{display:inline-block;width:2px;height:13px;background:var(--red);
|
|
314
|
+
animation:blink 1s infinite;vertical-align:text-bottom;margin-left:1px}
|
|
315
|
+
@keyframes blink{0%,49%{opacity:1}50%,100%{opacity:0}}
|
|
316
|
+
#bottom{
|
|
317
|
+
border-top:1px solid var(--border);padding:12px;background:var(--bg);
|
|
318
|
+
display:flex;gap:8px;align-items:flex-end;flex-shrink:0;
|
|
319
|
+
padding-bottom:max(12px, env(safe-area-inset-bottom))
|
|
320
|
+
}
|
|
321
|
+
#inp{
|
|
322
|
+
flex:1;background:var(--inp-bg);border:1px solid var(--inp-border);color:var(--text);
|
|
323
|
+
border-radius:10px;padding:10px 13px;font-family:inherit;font-size:14px;
|
|
324
|
+
resize:none;min-height:44px;max-height:120px;line-height:1.5;outline:none;
|
|
325
|
+
transition:background .2s,color .2s,border-color .2s
|
|
326
|
+
}
|
|
327
|
+
#inp:focus{border-color:var(--muted)}
|
|
328
|
+
#inp::placeholder{color:var(--muted)}
|
|
329
|
+
#btn{
|
|
330
|
+
background:var(--red);border:none;color:#fff;width:44px;height:44px;
|
|
331
|
+
border-radius:10px;cursor:pointer;font-size:20px;flex-shrink:0;
|
|
332
|
+
display:flex;align-items:center;justify-content:center;transition:opacity .15s
|
|
333
|
+
}
|
|
334
|
+
#btn:disabled{opacity:.4;cursor:not-allowed}
|
|
335
|
+
.hdr-right{margin-left:auto;display:flex;align-items:center;gap:8px}
|
|
336
|
+
#theme-btn{
|
|
337
|
+
background:none;border:1px solid var(--new-border);color:var(--new-text);
|
|
338
|
+
font-family:inherit;font-size:14px;padding:3px 7px;border-radius:6px;
|
|
339
|
+
cursor:pointer;transition:border-color .15s,color .15s;line-height:1
|
|
340
|
+
}
|
|
341
|
+
#theme-btn:hover{border-color:var(--new-hover-border);color:var(--new-hover-text)}
|
|
342
|
+
#new-session{
|
|
343
|
+
background:none;border:1px solid var(--new-border);color:var(--new-text);
|
|
344
|
+
font-family:inherit;font-size:11px;padding:4px 8px;border-radius:6px;cursor:pointer
|
|
345
|
+
}
|
|
346
|
+
#new-session:hover{border-color:var(--new-hover-border);color:var(--new-hover-text)}
|
|
347
|
+
</style>
|
|
348
|
+
</head>
|
|
349
|
+
<body>
|
|
350
|
+
<header>
|
|
351
|
+
<div class="logo"></div>
|
|
352
|
+
<span class="title">PROTOCOL</span>
|
|
353
|
+
<div class="hdr-right">
|
|
354
|
+
<button id="theme-btn" title="Toggle theme">\u2600\uFE0E</button>
|
|
355
|
+
<button id="new-session">+ new</button>
|
|
356
|
+
<span class="sid" id="sid"></span>
|
|
357
|
+
</div>
|
|
358
|
+
</header>
|
|
359
|
+
<div id="msgs"></div>
|
|
360
|
+
<div id="bottom">
|
|
361
|
+
<textarea id="inp" placeholder="Ask anything or request code changes\u2026" rows="1"></textarea>
|
|
362
|
+
<button id="btn">\u2191</button>
|
|
363
|
+
</div>
|
|
364
|
+
|
|
365
|
+
<script>
|
|
366
|
+
const $ = id => document.getElementById(id);
|
|
367
|
+
let sid = null;
|
|
368
|
+
let busy = false;
|
|
369
|
+
|
|
370
|
+
// \u2500\u2500 API \uC778\uC99D \u2500\u2500 \uC11C\uBC84\uAC00 \uD398\uC774\uC9C0\uC5D0 \uC2EC\uC5B4\uC900 \uD1A0\uD070\uC744 \uBAA8\uB4E0 fetch \uD5E4\uB354\uC5D0 \uC2E4\uC5B4 \uBCF4\uB0B8\uB2E4.
|
|
371
|
+
// (\uD1A0\uD070\uC774 \uC5C6\uC73C\uBA74 \uC11C\uBC84\uAC00 /api/* \uB97C 401\uB85C \uAC70\uBD80\uD55C\uB2E4.)
|
|
372
|
+
const TOKEN = document.querySelector('meta[name="protocol-token"]')?.content || '';
|
|
373
|
+
const authHeaders = (extra = {}) => Object.assign({}, extra, { 'X-Protocol-Token': TOKEN });
|
|
374
|
+
|
|
375
|
+
// \u2500\u2500 Theme \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
376
|
+
const root = document.documentElement;
|
|
377
|
+
const themeBtn = $('theme-btn');
|
|
378
|
+
let currentTheme = 'dark';
|
|
379
|
+
|
|
380
|
+
function applyTheme(t) {
|
|
381
|
+
currentTheme = t;
|
|
382
|
+
root.setAttribute('data-theme', t);
|
|
383
|
+
themeBtn.textContent = t === 'dark' ? '\u2600\uFE0E' : '\u263E';
|
|
384
|
+
const metaColor = t === 'dark' ? '#111111' : '#fafafa';
|
|
385
|
+
document.querySelector('meta[name="theme-color"]').setAttribute('content', metaColor);
|
|
386
|
+
}
|
|
387
|
+
applyTheme(currentTheme);
|
|
388
|
+
themeBtn.addEventListener('click', () => applyTheme(currentTheme === 'dark' ? 'light' : 'dark'));
|
|
389
|
+
|
|
390
|
+
// \u2500\u2500 Session \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
391
|
+
async function init() {
|
|
392
|
+
if (!sid) await newSession();
|
|
393
|
+
else {
|
|
394
|
+
$('sid').textContent = sid.slice(0,8);
|
|
395
|
+
try {
|
|
396
|
+
const r = await fetch('/api/sessions/' + sid, { headers: authHeaders() });
|
|
397
|
+
if (r.ok) {
|
|
398
|
+
const d = await r.json();
|
|
399
|
+
(d.messages||[]).forEach(m => addMsg(m.role, m.content));
|
|
400
|
+
} else await newSession();
|
|
401
|
+
} catch { await newSession(); }
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
async function newSession() {
|
|
406
|
+
const r = await fetch('/api/sessions', {method:'POST', headers: authHeaders()});
|
|
407
|
+
const d = await r.json();
|
|
408
|
+
sid = d.id;
|
|
409
|
+
$('sid').textContent = sid.slice(0,8);
|
|
410
|
+
$('msgs').innerHTML = '';
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function addMsg(role, content='') {
|
|
414
|
+
const el = document.createElement('div');
|
|
415
|
+
el.className = 'msg ' + role;
|
|
416
|
+
el.textContent = content;
|
|
417
|
+
$('msgs').appendChild(el);
|
|
418
|
+
el.scrollIntoView({behavior:'smooth'});
|
|
419
|
+
return el;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function addTool(name, args) {
|
|
423
|
+
const el = document.createElement('div');
|
|
424
|
+
el.className = 'msg tool';
|
|
425
|
+
const p = JSON.stringify(args||{}).slice(0,60);
|
|
426
|
+
el.textContent = '\u25C6 ' + name + '(' + p + (p.length>=60?'\u2026':'') + ')';
|
|
427
|
+
$('msgs').appendChild(el);
|
|
428
|
+
el.scrollIntoView({behavior:'smooth'});
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
async function send() {
|
|
432
|
+
if (busy) return;
|
|
433
|
+
const msg = $('inp').value.trim();
|
|
434
|
+
if (!msg) return;
|
|
435
|
+
$('inp').value = '';
|
|
436
|
+
$('inp').style.height = 'auto';
|
|
437
|
+
busy = true;
|
|
438
|
+
$('btn').disabled = true;
|
|
439
|
+
|
|
440
|
+
addMsg('user', msg);
|
|
441
|
+
let assistantEl = addMsg('assistant');
|
|
442
|
+
const cursor = document.createElement('span');
|
|
443
|
+
cursor.className = 'cursor';
|
|
444
|
+
assistantEl.appendChild(cursor);
|
|
445
|
+
|
|
446
|
+
try {
|
|
447
|
+
const res = await fetch('/api/sessions/'+sid+'/chat', {
|
|
448
|
+
method:'POST',
|
|
449
|
+
headers: authHeaders({'Content-Type':'application/json'}),
|
|
450
|
+
body: JSON.stringify({message:msg})
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
const reader = res.body.getReader();
|
|
454
|
+
const dec = new TextDecoder();
|
|
455
|
+
let buf = '';
|
|
456
|
+
|
|
457
|
+
while(true) {
|
|
458
|
+
const {done, value} = await reader.read();
|
|
459
|
+
if(done) break;
|
|
460
|
+
buf += dec.decode(value, {stream:true});
|
|
461
|
+
const lines = buf.split('\\n');
|
|
462
|
+
buf = lines.pop();
|
|
463
|
+
for(const line of lines) {
|
|
464
|
+
if(!line.startsWith('data: ')) continue;
|
|
465
|
+
try {
|
|
466
|
+
const ev = JSON.parse(line.slice(6));
|
|
467
|
+
if(ev.type==='chunk') {
|
|
468
|
+
cursor.remove();
|
|
469
|
+
assistantEl.textContent += ev.content;
|
|
470
|
+
assistantEl.appendChild(cursor);
|
|
471
|
+
assistantEl.scrollIntoView({behavior:'smooth'});
|
|
472
|
+
} else if(ev.type==='tool') {
|
|
473
|
+
addTool(ev.name, ev.args);
|
|
474
|
+
assistantEl = addMsg('assistant');
|
|
475
|
+
assistantEl.appendChild(cursor);
|
|
476
|
+
} else if(ev.type==='error') {
|
|
477
|
+
cursor.remove();
|
|
478
|
+
assistantEl.textContent += '\\nError: ' + ev.message;
|
|
479
|
+
} else if(ev.type==='done') {
|
|
480
|
+
cursor.remove();
|
|
481
|
+
}
|
|
482
|
+
} catch (e) { console.error('UI \uCC98\uB9AC \uC2E4\uD328:', e); }
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
} catch(e) {
|
|
486
|
+
cursor.remove();
|
|
487
|
+
assistantEl.textContent += '\\nConnection error';
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
busy = false;
|
|
491
|
+
$('btn').disabled = false;
|
|
492
|
+
$('inp').focus();
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
$('btn').addEventListener('click', send);
|
|
496
|
+
$('new-session').addEventListener('click', newSession);
|
|
497
|
+
$('inp').addEventListener('keydown', e => {
|
|
498
|
+
if(e.key==='Enter' && !e.shiftKey) { e.preventDefault(); send(); }
|
|
499
|
+
});
|
|
500
|
+
$('inp').addEventListener('input', function() {
|
|
501
|
+
this.style.height = 'auto';
|
|
502
|
+
this.style.height = Math.min(this.scrollHeight, 120) + 'px';
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
init();
|
|
506
|
+
</script>
|
|
507
|
+
</body>
|
|
508
|
+
</html>`});var hk={};va(hk,{startServer:()=>TD});import wD from"http";import{randomBytes as yD}from"crypto";import{readFileSync as bD,existsSync as vD}from"fs";import{networkInterfaces as SD}from"os";import{join as fk,basename as xD}from"path";import Vt from"chalk";function kD(t){let e=t.config.get("graph"),r=e?.defaultGraph||"default",n=[fk(e?.path||"",`${r}.yaml`),fk(process.cwd(),"config","default-graph.yaml")];for(let o of n)if(vD(o))return Ct.load(bD(o,"utf-8"));throw new Error("Graph definition not found")}function ED(){return xD(process.cwd()).replace(/[^A-Za-z0-9._-]/g,"-").replace(/^-+|-+$/g,"").replace(/^_+/,"")||"session"}function PD(t){return new Promise((e,r)=>{let n="";t.on("data",o=>n+=o),t.on("end",()=>e(n)),t.on("error",r)})}function AD(t){t.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),t.setHeader("Access-Control-Allow-Headers","Content-Type, X-Protocol-Token, Authorization")}function Kl(t,e,r=200){t.writeHead(r,{"Content-Type":"application/json"}),t.end(JSON.stringify(e))}function CD(t){return t.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),e=>t.write(`data: ${JSON.stringify(e)}
|
|
509
|
+
|
|
510
|
+
`)}function _D(t){for(let e of Object.values(SD()))for(let r of e??[])if(r.family==="IPv4"&&!r.internal)return`http://${r.address}:${t}`;return null}async function TD(t={}){let e=t.port??3e3,r=t.host??"127.0.0.1",n=t.token||process.env.PROTOCOL_SERVER_TOKEN||yD(24).toString("hex"),o=await qo(),i=kD(o),s=o.config.getSession()?.user?.id??null,a=new zl(s),c=(t.permission||"workspace").toLowerCase(),l=En[c]??"WorkspaceWrite",d=new Fe({mode:l,allowedPaths:[process.cwd()]},"default");o.registry.setPermissionManager(d),tl("serve",{host:r,port:e});function p(w){let b=w.headers.authorization,k=typeof b=="string"&&b.startsWith("Bearer ")?b.slice(7):"",v=w.headers["x-protocol-token"],C=Array.isArray(v)?v[0]:v;return k===n||typeof C=="string"&&C===n}let u=n.replace(/[&<>"]/g,w=>({"&":"&","<":"<",">":">",'"':"""})[w]),f=dk.replace("</head>",`<meta name="protocol-token" content="${u}">
|
|
511
|
+
</head>`),m=wD.createServer(async(w,b)=>{if(AD(b),w.method==="OPTIONS"){b.writeHead(204),b.end();return}let v=new URL(w.url,`http://localhost:${e}`).pathname;if(w.method==="GET"&&(v==="/"||v==="/index.html")){b.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),b.end(f);return}if(v.startsWith("/api/")&&!p(w)){Kl(b,{error:"Unauthorized \u2014 X-Protocol-Token \uB610\uB294 Authorization: Bearer <token> \uD5E4\uB354\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4"},401);return}if(w.method==="POST"&&v==="/api/sessions"){let N=await a.pickName(ED());Kl(b,{id:N});return}let C=v.match(/^\/api\/sessions\/([^/]+)$/);if(w.method==="GET"&&C){let{messages:N}=await a.load(C[1]);Kl(b,{messages:N});return}let I=v.match(/^\/api\/sessions\/([^/]+)\/chat$/);if(w.method==="POST"&&I){let N=I[1],G=await PD(w),$;try{({message:$}=JSON.parse(G))}catch{Kl(b,{error:'Invalid JSON body \u2014 {"message": "..."} \uD615\uC2DD\uC73C\uB85C \uBCF4\uB0B4\uC138\uC694'},400);return}let Y=[...(await a.load(N)).messages,{role:"user",content:$}];await a.save(N,Y);let we=CD(b),B="";try{await new po(i,o.registry,o.modelRouter,{onChunk:re=>{B+=re,we({type:"chunk",content:re})},onToolUse:(re,oe)=>we({type:"tool",name:re,args:oe})}).execute({messages:Y.map(re=>({...re}))}),B&&(Y.push({role:"assistant",content:B}),await a.save(N,Y)),we({type:"done"})}catch(q){we({type:"error",message:q.message})}b.end();return}b.writeHead(404),b.end("Not found")}),h=r==="127.0.0.1"||r==="localhost"||r==="::1";m.listen(e,r,()=>{let w=l==="DangerFullAccess"?"full (bash \uC2E4\uD589 \uD5C8\uC6A9)":l==="WorkspaceWrite"?"workspace":"readonly";if(console.log(`
|
|
512
|
+
`+Vt.red.bold(" PROTOCOL SERVER")),console.log(Vt.gray(` Local: http://localhost:${e}`)),h)console.log(Vt.gray(" Mobile(\uD3F0\uC5D0\uC11C \uAC19\uC740 \uB124\uD2B8\uC6CC\uD06C\uB85C \uC5F4\uAE30): protocol serve --host 0.0.0.0"));else{let b=_D(e);b&&console.log(Vt.gray(` LAN: ${b}`)),console.log(Vt.yellow.bold(`
|
|
513
|
+
\u26A0\uFE0F ${r} \uC5D0 \uBC14\uC778\uB529 \u2014 \uC774 \uC11C\uBC84\uB294 \uB85C\uCEEC \uC5D0\uC774\uC804\uD2B8\uB97C \uC778\uC99D \uC5C6\uC774 \uC2E4\uD589\uD569\uB2C8\uB2E4.`)),console.log(Vt.yellow.bold(" \uAC19\uC740 \uB124\uD2B8\uC6CC\uD06C\uC758 \uB204\uAD6C\uB4E0 \uC811\uADFC\uD558\uBA74 \uC774 \uCEF4\uD4E8\uD130\uC758 \uD30C\uC77C\uC744 \uC77D\uACE0/\uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4.")),console.log(Vt.yellow.bold(" \uC2E0\uB8B0\uD558\uB294 \uB124\uD2B8\uC6CC\uD06C\uC5D0\uC11C\uB9CC \uC4F0\uACE0, \uB2E4 \uC4F0\uBA74 \uC885\uB8CC\uD558\uC138\uC694.")),l==="DangerFullAccess"&&(console.log(Vt.red.bold(` \u26A0\uFE0F --permission full + ${r} \u2014 \uD1A0\uD070\uC744 \uC544\uB294 \uB204\uAD6C\uB4E0 bash \uB85C \uC784\uC758 \uBA85\uB839\uC744 \uC2E4\uD589\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`)),console.log(Vt.red.bold(" \uB85C\uCEEC(127.0.0.1)\uC5D0\uC11C\uB9CC \uC4F0\uC138\uC694. \uBC30\uD3EC\uC6A9\uC774\uBA74 \uC11C\uBC84\uB294 \uC5B4\uCC28\uD53C \uB85C\uCEEC\uC5D0\uC11C \uB3D5\uB2C8\uB2E4.")))}console.log(Vt.gray(` Permission: ${w}`)),console.log(Vt.gray(` API \uD1A0\uD070: ${n} (X-Protocol-Token \uD5E4\uB354 \uB610\uB294 Authorization: Bearer)`)),console.log(Vt.gray(` (\uBE0C\uB77C\uC6B0\uC800\uB85C \uC5F4\uBA74 \uD1A0\uD070\uC774 \uC790\uB3D9\uC73C\uB85C \uC2EC\uC5B4\uC838 \uADF8\uB300\uB85C \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4)
|
|
514
|
+
`))})}var mk=D(()=>{"use strict";Ca();sl();Fd();uk();pk();nl();lr()});import{createReadStream as nA}from"node:fs";import{readFile as yg,realpath as Ma,lstat as oA,stat as Oa}from"node:fs/promises";import{createInterface as iA}from"node:readline";import{resolve as bg,relative as vg,join as sA,isAbsolute as aA}from"node:path";import{createHash as cA}from"node:crypto";import{execFileSync as lA}from"node:child_process";ge();ze();var ZP="protocol-external-session-links",bn=`/api/user-data/cli_prefs/${ZP}`,Gr=(t,e=512)=>typeof t=="string"&&t.length>0&&t.length<=e&&!/[\x00-\x1f\x7f]/.test(t),fg=t=>Gr(t)&&Number.isFinite(Date.parse(t)),hg=t=>["completed","failed","stopped"].includes(t),mi=(t,e)=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).every(r=>e.includes(r));function no(t,e){let r=t;if(!mi(r,["id","ownerUid","provider","providerSessionId","groupId","group","projectId","workspace","title","provenance","phases","archivedAt"])||![r.id,r.providerSessionId,r.groupId,r.group,r.projectId,r.workspace,r.title].every(i=>Gr(i))||r.ownerUid!==e||!["codex","claude","agy","gemini"].includes(r.provider)||!mi(r.provenance,["selectionId","owner","manifestSha256"])||![r.provenance.selectionId,r.provenance.owner].every(i=>Gr(i))||!/^[a-f0-9]{64}$/.test(r.provenance.manifestSha256)||!Array.isArray(r.phases)||!r.phases.length||r.phases.length>1e3||r.archivedAt!==void 0&&!fg(r.archivedAt))throw new Error("EXTERNAL_LINK_INVALID");let n=new Set,o=new Set;for(let i of r.phases){if(!mi(i,["id","ordinal","observedAt","state","evidence","resultRef","process"])||!Gr(i.id)||!Number.isSafeInteger(i.ordinal)||i.ordinal<0||n.has(i.id)||o.has(i.ordinal)||!fg(i.observedAt)||!["running","waiting_input","completed","failed","stopped","unknown"].includes(i.state)||!mi(i.evidence,["kind","ref","offset","sha256"])||!Gr(i.evidence.ref)||!["turn.completed","turn.failed","turn.interrupted","process_observed","unverified"].includes(i.evidence.kind)||!Number.isSafeInteger(i.evidence.offset)||i.evidence.offset<0||!/^[a-f0-9]{64}$/.test(i.evidence.sha256)||i.resultRef!==void 0&&!Gr(i.resultRef)||i.state==="completed"&&i.evidence.kind!=="turn.completed"||i.state==="failed"&&i.evidence.kind!=="turn.failed"||i.state==="stopped"&&i.evidence.kind!=="turn.interrupted")throw new Error("EXTERNAL_PHASE_INVALID");if(i.process&&(!mi(i.process,["pid","startIdentity","owner"])||!Number.isSafeInteger(i.process.pid)||i.process.pid<1||!Gr(i.process.startIdentity)||!Gr(i.process.owner)))throw new Error("EXTERNAL_PROCESS_INVALID");if(["running","waiting_input"].includes(i.state)&&(!i.process||i.evidence.kind!=="process_observed"))throw new Error("EXTERNAL_PROCESS_REQUIRED");n.add(i.id),o.add(i.ordinal)}return structuredClone(r)}function Ku(t,{now:e=Date.now(),disconnected:r=!1}={}){return t.map(n=>{let o=[...n.phases].sort((l,d)=>d.ordinal-l.ordinal)[0],i=r||!hg(o.state)&&(o.state==="unknown"||e-Date.parse(o.observedAt)>45e3||Date.parse(o.observedAt)>e+5e3),s=hg(o.state)?o.state:i?"unknown":o.state,a=r?"Connection unavailable; refresh records first.":void 0,c=l=>({enabled:!l,...l?{reason:l}:{}});return{id:`external:${n.id}`,taskId:"",runKey:o.id,task:n.title,group:n.group,groupId:n.groupId,projectId:n.projectId,provider:n.provider,device:n.provenance.owner,state:s,archived:!!n.archivedAt,archivedAt:n.archivedAt,isCurrent:!1,disconnected:r,lastActivityAt:o.observedAt,lastActivity:`${o.state} \xB7 ${n.phases.length} phases${o.resultRef?` \xB7 ${o.resultRef}`:""}`,session:{id:n.id,provider:n.provider,deviceId:n.provenance.owner,status:s,cwd:n.workspace,startedAt:n.phases[0].observedAt,updatedAt:o.observedAt,externalSessionId:n.providerSessionId},externalLink:n,capabilities:{archive:c(a||(n.archivedAt?"Already archived.":void 0)),restore:c(a||(n.archivedAt?void 0:"Not archived."))},executionCapability:{enabled:!1,reason:"Imported metadata only; stop, resume, input, attach and task approvals are unavailable."}}})}Ra();var eA=45e3,Yu=t=>["done","failed","stopped"].includes(t),Ia=t=>t.runId||`legacy:${t.id}:${t.startedAt}`,tA=(t,e)=>JSON.stringify([t,Ia(e)]);function rA(t,e,r=!1){let n=t.worker_session;if(!n)return"unknown";if(Yu(n.status))return n.status==="done"?"completed":n.status;let o=(Array.isArray(n.activity)?n.activity:[]).filter(a=>a&&typeof a.type=="string"&&typeof a.at=="string"),i=o.filter(a=>a.type==="process_observed"||a.type==="process_exited").at(-1),s=Date.parse(i?.at??"");return r||!i||i.type==="process_exited"||!Number.isFinite(s)||s>e+5e3||e-s>eA?"disconnected":n.status==="stopping"||t.status==="cancelled"?"stopping":o.at(-1)?.type==="attention_required"||t.state?.steps?.some(a=>a.status==="awaiting_approval")?"waiting_input":["starting","running"].includes(n.status)?n.status:"unknown"}var mg=t=>({enabled:!t,...t?{reason:t}:{}});function Ju(t,{now:e=Date.now(),disconnected:r=!1}={}){let n=[];for(let o of t){if(!o||typeof o.id!="string"||o.deletedAt||o.status==="deleted")continue;let i=new Map;for(let s of o.worker_session_records??[])s?.session&&Yu(s.session.status)&&i.set(Ia(s.session),s);if(o.worker_session){let s=Ia(o.worker_session);i.set(s,{...i.get(s),session:o.worker_session})}for(let[s,a]of i){let c=a.session,l=!!o.worker_session&&Ia(o.worker_session)===s,d=rA({...o,state:l?o.state:void 0,worker_session:c},e,r),p=typeof a.archivedAt=="string",u=r?"Connection unavailable; refresh this owner\u2019s records first.":Yu(c.status)?void 0:"Only completed, failed or stopped records can be archived.",f=(c.activity??[]).filter(m=>m&&typeof m.at=="string").at(-1);n.push({id:tA(o.id,c),taskId:o.id,runKey:s,task:o.title||o.id,group:o.project?.name||"Unassigned",projectId:o.project?.id,provider:c.provider,device:c.deviceId,planStatus:o.status,awaitingApproval:l&&!!o.state?.steps?.some(m=>m.status==="awaiting_approval"),state:d,archived:p,archivedAt:a.archivedAt,isCurrent:l,disconnected:r,lastActivityAt:c.endedAt||f?.at||c.updatedAt,lastActivity:r?"Connection unavailable \xB7 last known record":f?.reason||f?.type,session:c,capabilities:{archive:mg(u||(p?"Already archived.":void 0)),restore:mg(u||(p?void 0:"Not archived."))}})}}return n.sort((o,i)=>(i.lastActivityAt??"").localeCompare(o.lastActivityAt??"")||o.id.localeCompare(i.id))}function gg(t){let e=null,r=0,n=0,o=null,i=[],s=0,a=!0,c=!1,l=()=>{let m=t.currentOwner(),h=m?JSON.stringify([m.uid,m.endpoint]):null;return h!==e&&(e=h,r++,o=null,i=[],s=0,a=!0,c=!1),h},d=()=>{let m=l(),h=t.currentOwner();if(!m||!h)throw new Error("SESSION_SIGN_IN_REQUIRED");let w=r;return{owner:h,check:()=>{if(l()!==m||r!==w)throw new Error("SESSION_OWNER_CHANGED")},generation:w}},p=()=>[...Ju(o??[],{now:t.now?.()??Date.now(),disconnected:a}),...Ku(i,{now:t.now?.()??Date.now(),disconnected:a})],u=async()=>{let{owner:m,check:h}=d(),w=++n,b=null;try{let k=[],v,C=new Set;do{h();let $=await t.request(`/api/cli-worker-sessions${v?`?after=${encodeURIComponent(v)}`:""}`,{method:"GET"},m);if(h(),!$.ok)throw new Error(`SESSION_READ_FAILED (${$.status})`);let j=await $.json();if(h(),!j||!Array.isArray(j.plans)||j.nextCursor!==void 0&&typeof j.nextCursor!="string")throw new Error("SESSION_INVALID_RESPONSE");if(k.push(...j.plans),v=j.nextCursor,v&&C.has(v))throw new Error("SESSION_INVALID_CURSOR");v&&C.add(v)}while(v);if(k.some($=>!$||typeof $.id!="string"||!$.id))throw new Error("SESSION_INVALID_PLAN");Ju(k),b=k;let I=[],N=0;if(t.externalLinks){let $=await t.request(bn,{method:"GET"},m);if(h(),$.status===404&&i.length)throw new Error("EXTERNAL_LINK_PREVIOUS_RECORDS_UNAVAILABLE");if($.status!==404){if(!$.ok)throw new Error(`EXTERNAL_LINK_READ_FAILED (${$.status})`);let j=await $.json();if(h(),!j?.item||!Array.isArray(j.item.links)||!Number.isSafeInteger(j.item.revision))throw new Error("EXTERNAL_LINK_INVALID_RESPONSE");I=j.item.links.map(Y=>no(Y,m.uid)),N=j.item.revision}}if(h(),w!==n)throw new Error("SESSION_READ_SUPERSEDED");if(k.some($=>!$||typeof $.id!="string"||!$.id))throw new Error("SESSION_INVALID_PLAN");let G=Ju(k,{now:t.now?.()??Date.now()});return o=k,i=I,s=N,a=!1,[...G,...Ku(i,{now:t.now?.()??Date.now()})]}catch(k){if(h(),w!==n)throw k;if(a=!0,o===null&&b!==null&&(o=b),o!==null){let v=p();if(v.length>0)return v}throw k}},f=async(m,h)=>{let{owner:w,check:b,generation:k}=d();if(c)throw new Error("SESSION_ACTION_PENDING");let v=p().find(C=>C.id===h);if(!v||!v.capabilities[m].enabled)throw new Error(v?.capabilities[m].reason||"SESSION_RECORD_UNAVAILABLE");c=!0;try{b();let C=await t.request(v.externalLink?bn:`/api/cli-worker-sessions/${encodeURIComponent(v.taskId)}`,{method:"PATCH",body:JSON.stringify(v.externalLink?{operation:m,id:v.externalLink.id,expectedRevision:s}:{action:m,recordId:h})},w);if(b(),!C.ok)throw new Error(`SESSION_${m.toUpperCase()}_FAILED (${C.status})`);if(a=!0,await u(),b(),a)throw new Error("SESSION_ACTION_CONFIRMATION_UNAVAILABLE")}catch(C){throw b(),a=!0,C}finally{r===k&&(c=!1)}};return{scopeKey:l,read:u,archive:m=>f("archive",m),restore:m=>f("restore",m)}}function Xu(){return{externalLinks:!0,currentOwner(){let t=new K().resolveCredentials();return t.session?{uid:t.session.user.id,endpoint:t.endpoint}:null},request:(t,e,r)=>Ye().request(t,e,r)}}function wg(){return gg(Xu())}var wi=t=>cA("sha256").update(t).digest("hex"),uA=/(^|\/)(\.env[^/]*|local\.settings\.json|[^/]*-key\.json|[^/]*credential[^/]*)(\/|$)/i;async function $a(t,e,r){if(aA(e)||e.split(/[\\/]/).some(s=>s===".."||s===".")||uA.test(e)||!e.endsWith(r))throw new Error("MANIFEST_PATH_DENIED");let n=await Ma(t),o=n;for(let s of e.split("/"))if(o=sA(o,s),(await oA(o)).isSymbolicLink())throw new Error("MANIFEST_SYMLINK_DENIED");let i=await Ma(o);if(vg(n,i).startsWith("..")||!(await Oa(i)).isFile())throw new Error("MANIFEST_PATH_DENIED");return i}function dA(t){if(!Number.isSafeInteger(t)||t<1)return null;try{let r=lA("ps",["-p",String(t),"-o","uid=","-o","lstart=","-o","command="],{encoding:"utf8",timeout:2e3}).trim().match(/^(\d+)\s+(.{24})\s+(.+)$/);return r?{pid:t,owner:r[1],startIdentity:r[2],command:r[3]}:null}catch{return null}}async function pA(t,e,r=dA){let n=await $a(e.groupRoot,vg(bg(e.groupRoot),bg(t)),".manifest.json");if((await Oa(n)).size>256e3)throw new Error("MANIFEST_CAPACITY");let o=await yg(n);if(o.length>256e3||wi(o)!==e.manifestSha256)throw new Error("MANIFEST_APPROVAL_MISMATCH");let i=JSON.parse(o.toString());if(i.version!==1||i.selectionId!==e.selectionId||i.workspace!==e.workspace||i.groupRoot!==e.groupRoot||await Ma(i.workspace)!==await Ma(e.workspace)||!Array.isArray(i.sessions)||!i.sessions.length||i.sessions.length>100)throw new Error("MANIFEST_SCOPE_DENIED");if(i.sessions.reduce((d,p)=>d+(Array.isArray(p.phases)?p.phases.length:0),0)>500)throw new Error("MANIFEST_PHASE_CAPACITY");let s=0,a=new Date().toISOString(),c=[],l=new Set;for(let d of i.sessions){if(d.provider!=="codex"||l.has(d.sessionId)||!d.owner||!Array.isArray(d.phases)||!d.phases.length)throw new Error("MANIFEST_SELECTION_INVALID");l.add(d.sessionId);let p=[];for(let[u,f]of d.phases.entries()){let m=await $a(i.groupRoot,f.events,".events.jsonl"),h=(await Oa(m)).size;if(s+=h,h>64*1024*1024||s>256*1024*1024)throw new Error("MANIFEST_EVENT_CAPACITY");let w,b=0,k=0,v={id:`${f.id}:0`,ordinal:u*1e4,observedAt:a,state:"unknown",evidence:{kind:"unverified",ref:f.events,offset:0,sha256:wi("")}};for await(let C of iA({input:nA(m,{end:Math.max(0,h-1)}),crlfDelay:1/0})){if(b+=Buffer.byteLength(C)+1,!/^\s*\{\s*"type"\s*:\s*"(?:thread\.started|turn\.(?:started|completed|failed|interrupted))"/.test(C))continue;let I;try{I=JSON.parse(C)}catch{continue}if(I.type==="thread.started"){if(w&&w!==I.thread_id)throw new Error("MANIFEST_THREAD_MISMATCH");w=I.thread_id;continue}if(I.type==="turn.started"){if(k>0&&p.push(v),k++,k>=1e4)throw new Error("MANIFEST_PHASE_CAPACITY");v={id:`${f.id}:${k}`,ordinal:u*1e4+k,observedAt:a,state:"unknown",evidence:{kind:"unverified",ref:f.events,offset:b,sha256:wi(C)}}}else{let N=I.type==="turn.completed"?"completed":I.type==="turn.failed"?"failed":"stopped";v={...v,state:N,evidence:{kind:I.type,ref:f.events,offset:b,sha256:wi(C)}}}}if(w!==d.sessionId)throw new Error("MANIFEST_THREAD_MISMATCH");if(f.result)try{await $a(i.groupRoot,f.result,".result.md"),v.resultRef=f.result}catch(C){if(C.code!=="ENOENT")throw C}if(f.process){let C=await $a(i.groupRoot,f.process,".process.json");if((await Oa(C)).size>32e3)throw new Error("MANIFEST_PROCESS_CAPACITY");let I=JSON.parse(await yg(C,"utf8"));if(I.thread!==d.sessionId||I.owner!==d.owner)throw new Error("MANIFEST_OWNER_MISMATCH");let N=r(I.pid);!["completed","failed","stopped"].includes(v.state)&&N&&N.startIdentity===f.pidStartIdentity&&N.owner===String(globalThis.process.getuid?.())&&N.command.includes(`resume ${d.sessionId}`)&&N.command.includes(i.workspace)&&/(^|\s)codex exec\s/.test(N.command)&&(v={...v,state:"running",process:{pid:N.pid,startIdentity:N.startIdentity,owner:N.owner},evidence:{...v.evidence,kind:"process_observed"}})}p.push(v)}c.push(no({id:wi(`${i.selectionId}:${d.provider}:${d.sessionId}`),ownerUid:e.owner.uid,provider:d.provider,providerSessionId:d.sessionId,groupId:i.groupId,group:i.group,projectId:i.projectId,workspace:i.workspace,title:d.title,provenance:{selectionId:i.selectionId,owner:d.owner,manifestSha256:e.manifestSha256},phases:p},e.owner.uid))}return c}async function fA(t,e,r){let n=()=>{let l=r.currentOwner();if(l?.uid!==e.uid||l.endpoint!==e.endpoint)throw new Error("SESSION_OWNER_CHANGED")};n();let o=await r.request(bn,{method:"GET"},e);n();let i=0;if(o.status!==404){if(!o.ok)throw new Error("EXTERNAL_LINK_READ_FAILED");let l=await o.json();n(),i=l.item.revision}let s=await r.request(bn,{method:"PATCH",body:JSON.stringify({operation:"register",expectedRevision:i,links:t.map(l=>no(l,e.uid))})},e);if(n(),!s.ok)throw new Error(`EXTERNAL_LINK_REGISTER_FAILED (${s.status}); refresh and retry explicitly.`);let a=await r.request(bn,{method:"GET"},e);if(n(),!a.ok)throw new Error("EXTERNAL_LINK_CONFIRMATION_FAILED");let c=await a.json();if(n(),c.item.links=c.item.links.map(l=>no(l,e.uid)),!t.every(l=>c.item.links.some(d=>d.id===l.id&&l.phases.every(p=>d.phases.some(u=>u.id===p.id)))))throw new Error("EXTERNAL_LINK_CONFIRMATION_FAILED");return c.item.links.filter(l=>t.some(d=>d.id===l.id))}function Sg(t){t.command("session-links").description("Preview or register explicitly selected external session metadata").requiredOption("--manifest <path>").requiredOption("--sha256 <hash>").requiredOption("--selection <id>").requiredOption("--workspace <path>").requiredOption("--group-root <path>").requiredOption("--owner <uid>").requiredOption("--endpoint <url>").option("--apply","Register through existing Protocol authenticated client").action(async e=>{let r={uid:e.owner,endpoint:e.endpoint},n=await pA(e.manifest,{manifestSha256:e.sha256,selectionId:e.selection,workspace:e.workspace,groupRoot:e.groupRoot,owner:r}),o=e.apply?await fA(n,r,Xu()):n;console.log(JSON.stringify({registered:!!e.apply,links:o},null,2))})}(function(){Cg().config(Object.assign({},Tg(),Ig()(process.argv)))})();De();De();import Pe from"chalk";import{createInterface as QA}from"readline";ze();ge();var rt=class{client;config;constructor(e){this.config=e??new K,this.client=new ve(this.config)}async loginWithSession(e){return this.config.setSession(e),e}async logout(){this.config.clearSession()}async checkSubscription(){if(!this.isAuthenticated())return{active:!1,tier:"free",status:"expired"};try{let e=await this.client.request("/api/account-state");if(!e.ok)throw Object.assign(new Error(`account-state HTTP ${e.status}`),{code:`HTTP_${e.status}`});let r=await e.json();return{active:!0,tier:typeof r.subscription?.tier=="string"?r.subscription.tier:"free",status:r.subscription?.cancelScheduled===!0?"canceled":"active"}}catch(e){let r=e.code;return r==="AUTH_EXPIRED"||r==="TOKEN_EXPIRED"||r==="INVALID_REFRESH_TOKEN"||r==="USER_NOT_FOUND"?(this.config.clearSession(),{active:!1,tier:"free",status:"expired"}):{active:!1,tier:"free",status:"expired"}}}getCurrentUser(){let e=this.config.getSession();if(!e)throw new Error("Not authenticated. Run `protocol login` first.");return{id:e.user.id,email:e.user.email}}isAuthenticated(){return this.config.getSession()!==null}getAuthStatus(){return this.config.getAuthStatus()}async getAccessToken(){return this.client.getValidToken()}};ge();import qA from"http";import{createHash as GA,randomBytes as Gg}from"crypto";import{spawn as VA}from"child_process";function md(){let t=Gg(32).toString("base64url");return{verifier:t,challenge:GA("sha256").update(t).digest("base64url")}}var Ar=class extends Error{constructor(r,n){super(r);this.kind=n;this.name="CliSessionExchangeError"}};async function gd(t,e,r,n=1e4){if(!t||typeof t!="object")throw new Error("invalid callback payload");let o=(d,p)=>typeof d=="string"&&d.length>0&&d.length<=p;if(!o(t.code,32)||!o(r,128))throw new Error("missing or invalid handoff code");let i=new AbortController,s=setTimeout(()=>i.abort(),n),a,c;try{a=await fetch(Jt("/api/auth/exchange"),{method:"POST",headers:{"Content-Type":"application/json"},signal:i.signal,body:JSON.stringify({code:t.code,verifier:r})}),c=await Promise.race([a.json().catch(()=>null),new Promise((d,p)=>i.signal.addEventListener("abort",()=>p(new Error("timeout")),{once:!0}))])}catch{throw new Ar("Could not reach the Protocol login server. Try again.","network")}finally{clearTimeout(s)}if(!a.ok)throw a.status===404?new Ar("The login code expired or was already used. Start login again.","expired"):a.status===403?new Ar("Login verification failed. Start login again.","pkce"):new Ar("Could not exchange the login code. Try again.","network");let l=(d,p)=>typeof d=="string"&&d.length>0&&d.length<=p;if(!c||!l(c.accessToken,16384)||!l(c.refreshToken,16384)||!l(c.uid,128)||c.email!==void 0&&!l(c.email,320)||!Number.isSafeInteger(c.expiresIn)||Number(c.expiresIn)<60||Number(c.expiresIn)>86400)throw new Ar("The login server returned an incomplete session. Start login again.","incomplete");return{access_token:c.accessToken,refresh_token:c.refreshToken,expires_at:Date.now()+Number(c.expiresIn)*1e3,user:{id:c.uid,email:c.email??""}}}function zA(t){let e=process.platform,r=e==="darwin"?"open":e==="win32"?"cmd":"xdg-open",n=e==="win32"?["/c","start","",t]:[t];try{VA(r,n,{stdio:"ignore",detached:!0}).unref()}catch{}}var oo={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type"},KA=128*1024;function Vg(t,e=18e4){let r=Gg(16).toString("hex"),{verifier:n,challenge:o}=md(),i=Jt();return new Promise((s,a)=>{let c=qA.createServer((p,u)=>{if(p.method==="OPTIONS"){u.writeHead(204,oo),u.end();return}if(p.method!=="POST"||!p.url?.startsWith("/callback")){u.writeHead(404,oo),u.end();return}let f="",m=0,h=!1;p.on("data",w=>{if(!h){if(m+=Buffer.byteLength(w),m>KA){h=!0,f="",u.writeHead(413,{...oo,"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,error:"callback payload too large"}));return}f+=String(w)}}),p.on("end",async()=>{if(!h)try{let w=JSON.parse(f);if(w.state!==r){u.writeHead(400,{...oo,"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,error:"state mismatch"}));return}let b=await gd(w,t,n);u.writeHead(200,{...oo,"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!0})),d(),s(b)}catch(w){u.writeHead(400,{...oo,"Content-Type":"application/json"}),u.end(JSON.stringify({ok:!1,error:w.message}))}})}),l=setTimeout(()=>{d(),a(new Error("\uB85C\uADF8\uC778 \uC2DC\uAC04\uC774 \uCD08\uACFC\uB410\uC5B4\uC694. `protocol login`\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC138\uC694."))},e);function d(){clearTimeout(l),c.close()}c.on("error",p=>{d(),a(p)}),c.listen(0,"127.0.0.1",()=>{let p=c.address(),u=typeof p=="object"&&p?p.port:0,f=`${i}/cli-auth?port=${u}&state=${r}&challenge=${encodeURIComponent(o)}`;console.log(`
|
|
515
|
+
\uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C Protocol \uB85C\uADF8\uC778\uC744 \uC9C4\uD589\uD574 \uC8FC\uC138\uC694:`),console.log(` ${f}
|
|
516
|
+
`),zA(f)})})}var io=class extends Error{constructor(r,n){super(r);this.kind=n;this.name="HeadlessCodeError"}},JA="\uCF54\uB4DC\uB97C \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uD654\uBA74\uC5D0 \uD45C\uC2DC\uB41C \uCF54\uB4DC \uC804\uCCB4\uB97C \uBCF5\uC0AC\uD574 \uBD99\uC5EC\uB123\uC5C8\uB294\uC9C0 \uD655\uC778\uD574 \uC8FC\uC138\uC694. / Could not read the code \u2014 make sure you pasted the entire code shown on the page.";function YA(t){return String(t??"").toUpperCase().replace(/[^A-Z0-9]/g,"")}async function XA(t){let e=YA(t);if(e.length!==16)throw new io(JA,"unreadable");return{code:e}}async function zg(t,e,r){try{return await gd(await XA(t),e,r)}catch(n){throw n instanceof Ar?new io(n.message,n.kind==="incomplete"?"incomplete":n.kind):n}}ge();ge();import ar from"chalk";var Kg=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ft={error:(t,e)=>{console.error(`
|
|
517
|
+
${ar.bgRed.white.bold(" ERROR ")} ${ar.red(t)}`),e&&console.error(ar.gray(`
|
|
518
|
+
\u{1F4A1} ${e}`)),console.error()},warn:t=>{console.warn(`
|
|
519
|
+
${ar.bgYellow.black.bold(" WARN ")} ${ar.yellow(t)}
|
|
520
|
+
`)},success:t=>{console.log(`
|
|
521
|
+
${ar.bgGreen.black.bold(" SUCCESS ")} ${ar.green(t)}
|
|
522
|
+
`)},info:t=>{console.log(`
|
|
523
|
+
${ar.blue("\u2139")} ${t}`)},startProgress:t=>{let e=Date.now(),r=t,n=0,o=!1,i=!!(process.stdout&&process.stdout.isTTY),s=()=>{if(o)return;let c=Math.floor((Date.now()-e)/1e3),l=ar.cyan(Kg[n%Kg.length]);i&&process.stdout.write(`\r\x1B[2K${l} ${r} ${ar.gray(`(${c}s)`)}`)};s();let a=setInterval(()=>{n++,s()},80);return{stop:c=>{o||(o=!0,clearInterval(a),i&&process.stdout.write("\r\x1B[2K"),c&&console.log(c))},updateMessage:c=>{r=c,s()},getElapsedSeconds:()=>Math.floor((Date.now()-e)/1e3)}},withProgress:async(t,e)=>{let r=ft.startProgress(t);try{return await e(r.updateMessage)}finally{r.stop()}}};var wd=null;function yd(){return wd||(wd=new rt),wd}function ZA(t){let e=QA({input:process.stdin,output:process.stdout});return new Promise(r=>{let n=!1,o=i=>{n||(n=!0,e.close(),r(i))};e.question(t,o),e.once("close",()=>o(""))})}async function eC(t){let{verifier:e,challenge:r}=md(),n=Jt(`/cli-auth?headless=1&challenge=${encodeURIComponent(r)}`);console.log(`
|
|
524
|
+
\uBE0C\uB77C\uC6B0\uC800\uAC00 \uC788\uB294 \uAE30\uAE30(\uB178\uD2B8\uBD81\xB7\uD3F0)\uC5D0\uC11C \uC544\uB798 \uC8FC\uC18C\uB97C \uC5F4\uACE0 \uB85C\uADF8\uC778\uD574 \uC8FC\uC138\uC694:`),console.log("Open this URL on a device with a browser, then sign in:"),console.log(` ${Pe.cyan(n)}
|
|
525
|
+
`),console.log(Pe.gray("\uB85C\uADF8\uC778\uD558\uBA74 \uD398\uC774\uC9C0\uC5D0 16\uC790 \uCF54\uB4DC\uAC00 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uADF8 \uCF54\uB4DC\uB97C \uC5EC\uAE30\uC5D0 \uBD99\uC5EC\uB123\uC73C\uC138\uC694 (5\uBD84\uAC04 \xB7 1\uD68C\uB9CC \uC720\uD6A8).")),console.log(Pe.gray(`After signing in, the page shows a 16-character code \u2014 paste it here (valid 5 minutes, once).
|
|
526
|
+
`));let o=3;for(let i=1;i<=o;i++){let s=await ZA(Pe.bold("\uCF54\uB4DC \uBD99\uC5EC\uB123\uAE30 / Paste code: "));try{let a=await zg(s,new K,e);return await t.loginWithSession(a)}catch(a){let c=(a instanceof io,a.message);console.error(Pe.red(`\u2717 ${c}`)),i<o&&console.error(Pe.gray(` \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694 (${i}/${o}). / Try again.
|
|
527
|
+
`))}}throw new Error("\uCF54\uB4DC \uD655\uC778\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. / Could not verify the pasted code.")}var bd=new se("login").description("Login to protocol: CLI (protocol: \uAD6C\uAE00 \uACC4\uC815)").option("--headless","\uBE0C\uB77C\uC6B0\uC800 \uC5C6\uB294 \uAE30\uAE30(SSH \uC804\uC6A9 \uC11C\uBC84)\uC5D0\uC11C \uCF54\uB4DC \uBD99\uC5EC\uB123\uAE30\uB85C \uB85C\uADF8\uC778").action(async t=>{try{let e=yd(),r;if(t.headless)r=await eC(e);else{let n=await Vg(new K);r=await ft.withProgress("Authenticating session...",async()=>await e.loginWithSession(n))}console.log(Pe.green("\u2713 Logged in successfully!")),console.log(Pe.gray(` Email: ${r.user.email}`));try{let n=await ft.withProgress("Checking subscription status...",async()=>await e.checkSubscription());n.active?console.log(Pe.green(` Plan: ${n.tier}`)):(console.log(Pe.yellow(" Warning: No active subscription")),console.log(Pe.gray(` ${Jt()} \uC5D0\uC11C \uAD6C\uB3C5\uD558\uC138\uC694`)))}catch{console.log(Pe.yellow(" Warning: Could not fetch subscription status (Offline Mode?)"))}}catch(e){console.error(Pe.red("Login failed:"),e.message),process.exit(1)}}),vd=new se("logout").description("Logout from protocol: CLI").action(async()=>{try{let t=yd();await ft.withProgress("Logging out...",async()=>{await t.logout()}),console.log(Pe.green("\u2713 Logged out successfully"))}catch(t){console.error(Pe.red("Logout failed:"),t.message),process.exit(1)}}),Sd=new se("whoami").description("Show current user info").action(async()=>{try{let t=yd();if(!t.isAuthenticated()){console.log(Pe.yellow("Not logged in")),console.log(Pe.gray("Run `protocol login` to authenticate"));return}let{user:e,subscription:r}=await ft.withProgress("Fetching user info...",async()=>{let n=await t.getCurrentUser(),o=await t.checkSubscription();return{user:n,subscription:o}});console.log(Pe.blue("Current User:")),console.log(Pe.white(` Email: ${e.email}`)),console.log(Pe.white(` ID: ${e.id}`)),console.log(),r.active?(console.log(Pe.green("Subscription:")),console.log(Pe.white(` Plan: ${r.tier}`)),console.log(Pe.white(` Status: ${r.status}`))):(console.log(Pe.yellow("No active subscription")),console.log(Pe.gray(`${Jt()} \uC5D0\uC11C \uAD6C\uB3C5\uD558\uC138\uC694`)))}catch(t){console.error(Pe.red("Error:"),t.message),process.exit(1)}}),xd=new se("auth").description("Authentication commands");xd.addCommand(bd);xd.addCommand(vd);xd.addCommand(Sd);De();import le from"chalk";import qn from"inquirer";import Nr from"fs";import{join as oD,basename as iD}from"path";Sn();ge();Sn();import MM,{useState as ce,useEffect as lt,useRef as Je,useMemo as DM}from"react";import{render as NM,Box as _e,Text as z,useInput as LM,useApp as FM,useStdout as jM}from"ink";import tC,{useState as rC,useEffect as nC}from"react";import{Text as oC,useInput as iC}from"ink";import xn from"chalk";function sC({value:t,placeholder:e="",focus:r=!0,mask:n,highlightPastedText:o=!1,showCursor:i=!0,onChange:s,onSubmit:a}){let[c,l]=rC({cursorOffset:(t||"").length,cursorWidth:0}),{cursorOffset:d,cursorWidth:p}=c;nC(()=>{l(w=>{if(!r||!i)return w;let b=t||"";return w.cursorOffset>b.length-1?{cursorOffset:b.length,cursorWidth:0}:w})},[t,r,i]);let u=o?p:0,f=n?n.repeat(t.length):t,m=f,h=e?xn.grey(e):void 0;if(i&&r){h=e.length>0?xn.inverse(e[0])+xn.grey(e.slice(1)):xn.inverse(" "),m=f.length>0?"":xn.inverse(" ");let w=0;for(let b of f)m+=w>=d-u&&w<=d?xn.inverse(b):b,w++;f.length>0&&d===f.length&&(m+=xn.inverse(" "))}return iC((w,b)=>{if(b.upArrow||b.downArrow||b.ctrl&&w==="c"||b.tab||b.shift&&b.tab)return;if(b.return){a&&a(t);return}let k=d,v=t,C=0;b.leftArrow?i&&k--:b.rightArrow?i&&k++:b.backspace||b.delete?d>0&&(v=t.slice(0,d-1)+t.slice(d,t.length),k--):(v=t.slice(0,d)+w+t.slice(d,t.length),k+=w.length,w.length>1&&(C=w.length)),d<0&&(k=0),d>t.length&&(k=t.length),l({cursorOffset:k,cursorWidth:C}),v!==t&&s(v)},{isActive:r}),tC.createElement(oC,null,e?f.length>0?m:h:m)}var Xg=sC;import Si from"node:fs";import Qg from"node:path";var Zg=".protocol",aC="status.md",ew={idle:"\uB300\uAE30",running:"\uC9C4\uD589",waiting:"\uC2B9\uC778 \uB300\uAE30",blocked:"\uB9C9\uD798",done:"\uC644\uB8CC"};function Cd(t=process.cwd()){return Qg.join(t,Zg,aC)}function cC(t){let e=["# \uC9C0\uAE08 \uD558\uB294 \uC77C","","<!-- protocol CLI \uAC00 \uAD00\uB9AC\uD55C\uB2E4. \uC9C1\uC811 \uACE0\uCCD0\uB3C4 \uB41C\uB2E4 \u2014 \uB2E4\uC74C \uC2E4\uD589\uC5D0 \uBC18\uC601\uB41C\uB2E4. -->",'<!-- \uC5EC\uAE30\uC5D4 "\uBB34\uC5C7\uC744 \uD558\uACE0 \uC788\uB2E4"\uB9CC \uC801\uB294\uB2E4. \uC5B4\uB5BB\uAC8C \uD558\uACE0 \uC788\uB294\uC9C0\uB294 \uAC01 \uC5D0\uC774\uC804\uD2B8 \uC548\uC5D0 \uC788\uB2E4. -->',""];if(t.length===0)e.push("_\uC9C4\uD589 \uC911\uC778 \uC77C\uC774 \uC5C6\uB2E4._","");else{e.push("| \uC0C1\uD0DC | \uC77C | \uB9E1\uC740 \uC5D0\uC774\uC804\uD2B8 | \uAC31\uC2E0 |","|---|---|---|---|");for(let r of t){let n=r.updatedAt?.slice(0,16).replace("T"," ")??"";e.push(`| ${ew[r.status]??r.status} | ${r.title}${r.note?` \u2014 ${r.note}`:""} | ${r.agent??"\u2014"} | ${n} |<!--id:${r.id}-->`)}e.push("")}return e.push("---","","- \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870 \u2192 `docs/MAP.md`","- \uC815\uD574\uC9C4 \uBC29\uD5A5 \u2192 `docs/DECISIONS.md`",""),e.join(`
|
|
528
|
+
`)}function lC(t){let e=[],r=Object.fromEntries(Object.entries(ew).map(([n,o])=>[o,n]));for(let n of t.split(`
|
|
529
|
+
`)){let o=n.match(/<!--id:(.*?)-->\s*$/)?.[1],s=n.replace(/<!--id:.*?-->\s*$/,"").match(/^\|\s*([^|]+?)\s*\|\s*([^|]+?)\s*\|\s*([^|]*?)\s*\|\s*([^|]*?)\s*\|$/);if(!s)continue;let[,a,c,l]=s;if(a==="\uC0C1\uD0DC"||/^-+$/.test(a))continue;let d=r[a]??"idle",[p,u]=c.split(" \u2014 ");e.push({id:o??p.trim(),title:p.trim(),status:d,agent:l&&l!=="\u2014"?l:void 0,note:u?.trim(),updatedAt:new Date().toISOString()})}return e}function tw(t=process.cwd()){try{let e=Cd(t);return Si.existsSync(e)?lC(Si.readFileSync(e,"utf8")):[]}catch(e){return console.error("status.md \uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4:",e),[]}}function uC(t,e=process.cwd()){try{let r=Qg.join(e,Zg);Si.existsSync(r)||Si.mkdirSync(r,{recursive:!0}),Si.writeFileSync(Cd(e),cC(t),"utf8")}catch(r){console.error("status.md \uB97C \uC4F0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uC774\uBC88 \uC9C4\uD589 \uC0C1\uD669\uC740 \uB0A8\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4:",r)}}function _d(t,e=process.cwd()){let r=tw(e),n=r.findIndex(i=>i.id===t.id),o={...t,updatedAt:new Date().toISOString()};n>=0?r[n]=o:r.push(o),uC(r,e)}function rw(t=process.cwd()){return{items:tw(t),path:Cd(t)}}import UM from"os";import Mt from"fs";import{join as qx}from"path";var Dd=Pu(uw(),1);import dw from"chalk";var st=(...t)=>{let e,r;if(t.length===0)throw new Error("Missing gradient colors");if(Array.isArray(t[0]))e=(0,Dd.default)(t[0]),r=Nd(t[1]);else{if(t.length===1)throw new Error(`Expected an array of colors, received ${JSON.stringify(t[0])}`);e=(0,Dd.default)(...t)}let n=(o,i)=>dC(o?o.toString():"",e,i??r);return n.multiline=(o,i)=>pC(o?o.toString():"",e,i??r),n},pw=(t,e,r)=>e.interpolation?.toLowerCase()==="hsv"?t.hsv(r,e.hsvSpin?.toLowerCase()||!1):t.rgb(r);function dC(t,e,r){let n=Nd(r),o=Math.max(t.replace(/\s/g,"").length,e.stops.length),i=pw(e,n,o),s="";for(let a of t)s+=a.match(/\s/g)?a:dw.hex(i.shift()?.toHex()||"#000")(a);return s}function pC(t,e,r){let n=Nd(r),o=t.split(`
|
|
530
|
+
`),i=Math.max(...o.map(c=>c.length),e.stops.length),s=pw(e,n,i),a=[];for(let c of o){let l=s.slice(0),d="";for(let p of c)d+=dw.hex(l.shift()?.toHex()||"#000")(p);a.push(d)}return a.join(`
|
|
531
|
+
`)}function Nd(t){let e={interpolation:"rgb",hsvSpin:"short",...t};if(t!==void 0&&typeof t!="object")throw new TypeError(`Expected \`options\` to be an \`object\`, got \`${typeof t}\``);if(typeof e.interpolation!="string")throw new TypeError(`Expected \`options.interpolation\` to be \`rgb\` or \`hsv\`, got \`${typeof e.interpolation}\``);if(e.interpolation.toLowerCase()==="hsv"&&typeof e.hsvSpin!="string")throw new TypeError(`Expected \`options.hsvSpin\` to be a \`short\` or \`long\`, got \`${typeof e.hsvSpin}\``);return e}var _t={atlas:{colors:["#feac5e","#c779d0","#4bc0c8"],options:{}},cristal:{colors:["#bdfff3","#4ac29a"],options:{}},teen:{colors:["#77a1d3","#79cbca","#e684ae"],options:{}},mind:{colors:["#473b7b","#3584a7","#30d2be"],options:{}},morning:{colors:["#ff5f6d","#ffc371"],options:{interpolation:"hsv"}},vice:{colors:["#5ee7df","#b490ca"],options:{interpolation:"hsv"}},passion:{colors:["#f43b47","#453a94"],options:{}},fruit:{colors:["#ff4e50","#f9d423"],options:{}},instagram:{colors:["#833ab4","#fd1d1d","#fcb045"],options:{}},retro:{colors:["#3f51b1","#5a55ae","#7b5fac","#8f6aae","#a86aa4","#cc6b8e","#f18271","#f3a469","#f7c978"],options:{}},summer:{colors:["#fdbb2d","#22c1c3"],options:{}},rainbow:{colors:["#ff0000","#ff0100"],options:{interpolation:"hsv",hsvSpin:"long"}},pastel:{colors:["#74ebd5","#74ecd5"],options:{interpolation:"hsv",hsvSpin:"long"}}};function Tt(t){let e=r=>st(...t.colors)(r,t.options);return e.multiline=(r="")=>st(...t.colors).multiline(r,t.options),e}var fw=st,fC=Tt(_t.atlas),hC=Tt(_t.cristal),mC=Tt(_t.teen),gC=Tt(_t.mind),wC=Tt(_t.morning),yC=Tt(_t.vice),bC=Tt(_t.passion),vC=Tt(_t.fruit),SC=Tt(_t.instagram),xC=Tt(_t.retro),kC=Tt(_t.summer),EC=Tt(_t.rainbow),PC=Tt(_t.pastel);st.atlas=fC;st.cristal=hC;st.teen=mC;st.mind=gC;st.morning=wC;st.vice=yC;st.passion=bC;st.fruit=vC;st.instagram=SC;st.retro=xC;st.summer=kC;st.rainbow=EC;st.pastel=PC;ge();Fd();Bd();mo();Ac();Le();lr();lr();var OR={en:["Catastrophic commands (rm -rf /, fork bomb, mkfs, force-push to main) \u2014 always blocked","System paths (/etc, /usr, ~/.ssh) \u2014 writes always blocked","Secret files (.env, *-key.json, ~/.aws, ~/.config/gcloud) \u2014 reads and writes always blocked"],ko:["\uD30C\uAD34\uC801 \uBA85\uB839(rm -rf /, fork bomb, mkfs, main force-push) \u2014 \uD56D\uC0C1 \uCC28\uB2E8","\uC2DC\uC2A4\uD15C \uACBD\uB85C(/etc, /usr, ~/.ssh) \u2014 \uC4F0\uAE30 \uD56D\uC0C1 \uCC28\uB2E8","\uBE44\uBC00 \uD30C\uC77C(.env, *-key.json, ~/.aws, ~/.config/gcloud) \u2014 \uC77D\uAE30\xB7\uC4F0\uAE30 \uD56D\uC0C1 \uCC28\uB2E8"]},MR={yolo:{en:["File edits and shell commands run without asking you first","Writes stay inside this folder (plus temp dirs); bash still runs in the OS sandbox","Some of what runs cannot be undone \u2014 deleted files not tracked by git do not come back"],ko:["\uD30C\uC77C \uC218\uC815\uACFC \uC178 \uBA85\uB839\uC774 \uD655\uC778 \uC5C6\uC774 \uC2E4\uD589\uB429\uB2C8\uB2E4","\uC4F0\uAE30\uB294 \uD604\uC7AC \uD3F4\uB354(+\uC784\uC2DC \uB514\uB809\uD1A0\uB9AC) \uC548\uC5D0 \uBA38\uBB3C\uACE0, bash \uB294 OS \uC0CC\uB4DC\uBC15\uC2A4\uC5D0\uC11C \uACC4\uC18D \uB3D5\uB2C8\uB2E4","\uC2E4\uD589\uB418\uB294 \uAC83 \uC911\uC5D0\uB294 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uB294 \uAC83\uB3C4 \uC788\uC2B5\uB2C8\uB2E4 \u2014 git \uC774 \uCD94\uC801\uD558\uC9C0 \uC54A\uB294 \uD30C\uC77C\uC740 \uC9C0\uC6CC\uC9C0\uBA74 \uB05D\uC785\uB2C8\uB2E4"]},danger:{en:["File edits and shell commands run without asking you first","Writes are no longer confined to this folder \u2014 any path you can write, the agent can write","bash runs without the OS sandbox","Some of what runs cannot be undone \u2014 deleted files not tracked by git do not come back"],ko:["\uD30C\uC77C \uC218\uC815\uACFC \uC178 \uBA85\uB839\uC774 \uD655\uC778 \uC5C6\uC774 \uC2E4\uD589\uB429\uB2C8\uB2E4","\uC4F0\uAE30\uAC00 \uD604\uC7AC \uD3F4\uB354\uC5D0 \uAC07\uD788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 \uB0B4\uAC00 \uC4F8 \uC218 \uC788\uB294 \uACBD\uB85C\uBA74 \uC5D0\uC774\uC804\uD2B8\uB3C4 \uC501\uB2C8\uB2E4","bash \uAC00 OS \uC0CC\uB4DC\uBC15\uC2A4 \uC5C6\uC774 \uC2E4\uD589\uB429\uB2C8\uB2E4","\uC2E4\uD589\uB418\uB294 \uAC83 \uC911\uC5D0\uB294 \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uB294 \uAC83\uB3C4 \uC788\uC2B5\uB2C8\uB2E4 \u2014 git \uC774 \uCD94\uC801\uD558\uC9C0 \uC54A\uB294 \uD30C\uC77C\uC740 \uC9C0\uC6CC\uC9C0\uBA74 \uB05D\uC785\uB2C8\uB2E4"]}};function DR(t){return t==="danger"?"--dangerously-skip-permissions":"--yolo"}function Wb(t,e){return{headline:`${DR(t)} \u2014 ${e==="ko"?Kr[t].ko:Kr[t].en}`,skipped:MR[t][e],stillBlocked:OR[e],howToTurnOff:e==="ko"?"\uB044\uAE30: /permissions default (\uC774 \uC138\uC158\uC5D0\uC11C \uC989\uC2DC \uD655\uC778 \uBAA8\uB4DC\uB85C \uB3CC\uC544\uAC11\uB2C8\uB2E4)":"Turn off: /permissions default (returns to asking, immediately, in this session)"}}function Es(t,e){let r=Wb(t,e),n=e==="ko"?"\uC2B9\uC778 \uC5C6\uC774 \uC2E4\uD589\uB429\uB2C8\uB2E4":"Runs without asking",o=e==="ko"?"\uC774 \uBAA8\uB4DC\uC5D0\uC11C\uB3C4 \uACC4\uC18D \uB9C9\uD799\uB2C8\uB2E4":"Still blocked in this mode";return[`\u26A0 ${r.headline}`,` ${n}:`,...r.skipped.map(i=>` \xB7 ${i}`),` ${o}:`,...r.stillBlocked.map(i=>` \xB7 ${i}`),` ${r.howToTurnOff}`].join(`
|
|
532
|
+
`)}function Bb(t,e){let r=Wb(t,e);return[e==="ko"?`\uC2B9\uC778 \uAC8C\uC774\uD2B8\uB97C \uB055\uB2C8\uB2E4 (${t}). \uACC4\uC18D\uD560\uAE4C\uC694?`:`Turn the approval gate off (${t}). Continue?`,"",...r.skipped.map(o=>`\xB7 ${o}`),"",...r.stillBlocked.map(o=>`\xB7 ${o}`)].join(`
|
|
533
|
+
`)}$i();ze();var Hb={free:67e4,plus:12e6,max:7333e4},qb=7,NR=8e4;function LR(t){if(!t)return 0;if(typeof t=="number")return t;let e=Date.parse(String(t));return Number.isNaN(e)?0:e}function of(t){let e=t.tier||"free",n=(Hb[e]??Hb.free)/30,o=n*qb,i=LR(t.bucketUpdatedAt),s=i>0?Math.max(0,(Date.now()-i)/864e5):qb,a=t.bucketBalance===void 0||t.bucketBalance===null?o:Number(t.bucketBalance),c=Math.min(o,a+s*n),l=Math.max(0,Math.min(100,Math.round(c/o*100))),d=Number(t.bonusCredit??0);return{tier:e,remainingPct:l,refillLabel:l>0?"":"\uBA87 \uC2DC\uAC04 \uB4A4\uC5D0 \uC870\uAE08\uC529 \uB2E4\uC2DC \uCC44\uC6CC\uC9D1\uB2C8\uB2E4",bonusPct:Math.min(100,Math.round(d/NR*100))}}async function Gb(){let t=await new ve().request("/api/account-state");if(!t.ok)throw new Error(`account-state HTTP ${t.status}`);return await t.json()}async function sf(t){try{let e=await Gb();return of(e.subscription??{})}catch{return null}}async function Vb(t){try{let r=(await Gb()).profile?.language;return r==="ko"||r==="en"?r:null}catch{return null}}Tp();uo();De();Tc();ge();import{spawn as BR,spawnSync as HR}from"node:child_process";import{existsSync as Xb}from"node:fs";import{dirname as qR,join as GR,resolve as VR}from"node:path";import{fileURLToPath as zR}from"node:url";var KR=VR(qR(zR(import.meta.url)),"../../.."),Rc=GR(KR,"scripts","check-wiring.mjs");function JR(){return Xb(Rc)?{ran:!0,code:HR(process.execPath,[Rc],{stdio:"inherit"}).status??0}:{ran:!1,code:0}}function Qb(){return new Promise(t=>{if(!Xb(Rc))return t("");let e=BR(process.execPath,[Rc,"--warn"],{stdio:["ignore","pipe","pipe"]}),r="";e.stdout.on("data",n=>{r+=n.toString()}),e.stderr.on("data",n=>{r+=n.toString()}),e.on("error",()=>t("")),e.on("close",()=>t(r.trim()))})}var Zb=new se("doctor").description("CLI \uC790\uCCB4 \uC9C4\uB2E8 \u2014 \uC778\uC99D\xB7\uC8FD\uC740 \uD30C\uC77C\xB7\uBBF8\uB4F1\uB85D \uBA85\uB839\xB7\uC870\uC6A9\uD55C catch \uBC0F RAG \uC784\uBCA0\uB529 \uAC80\uC0AC (dev \uC800\uC7A5\uC18C \uC804\uC6A9)").action(()=>{let e=new K().getAuthStatus();if(e.authenticated&&e.missingCredentials.length===0)console.log(`\u2713 [\uC778\uC99D] ${e.statusLine}`);else if(console.warn(`\u2717 [\uC778\uC99D] ${e.statusLine}`),e.missingCredentials.length>0)for(let s of e.missingCredentials)console.warn(` - ${s}`);let r=_c();r&&(r.ok?console.log(`\u2713 RAG \uC784\uBCA0\uB529 \uC790\uAE30\uAC80\uC0AC \uD1B5\uACFC (\uD504\uB85C\uBC14\uC774\uB354: ${r.provider}, \uCC28\uC6D0: ${r.dimension}, \uC720\uC0AC\uB3C4: ${r.similarity?.toFixed(4)})`):r.status==="unconfigured"?console.log(`\u23ED RAG \uC784\uBCA0\uB529 \uBBF8\uAD6C\uC131 \u2014 ${r.summary} (RAG \uAC80\uC0C9 \uBE44\uD65C\uC131\uD654)`):console.warn(`\u2717 RAG \uC784\uBCA0\uB529 \uC790\uAE30\uAC80\uC0AC \uC2E4\uD328 [${r.errorType}]: ${r.message}`));let{ran:n,code:o}=JR();if(!n){console.log("\uC815\uC801 \uBC30\uC120 \uAC80\uC0AC\uB294 dev \uC800\uC7A5\uC18C\uC5D0\uC11C\uB9CC \uB3D9\uC791\uD569\uB2C8\uB2E4 (\uC124\uCE58\uBCF8\uC5D0\uB294 \uC18C\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4).");return}let i=e.authenticated&&e.missingCredentials.length>0;process.exitCode=o!==0||r&&!r.ok||i?1:0});var ev=0;function YR(){return ev+=1,`r${Date.now().toString(36)}_${ev.toString(36)}`}var Ic=class{runs=new Map;signals=new Map;listeners=new Set;doneListeners=new Set;subscribe(e){return this.listeners.add(e),e(this.list()),()=>{this.listeners.delete(e)}}onDone(e){return this.doneListeners.add(e),()=>{this.doneListeners.delete(e)}}list(){return[...this.runs.values()]}running(){return this.list().filter(e=>e.status==="running")}runningFor(e){return this.running().filter(r=>r.agentId===e)}get(e){return this.runs.get(e)}start(e,r,n){let o=YR(),i={aborted:!1,controller:new AbortController},s={id:o,agentId:e,title:r,status:"running",startedAt:Date.now(),workers:[],toolErrors:0,mutated:!1};this.runs.set(o,s),this.signals.set(o,i);let a=l=>{let d=this.runs.get(o);d&&(l(d),this.emit())},c={id:o,signal:i,setWorkers:l=>a(d=>{d.workers=l}),patchWorker:(l,d)=>a(p=>{p.workers=p.workers.map(u=>u.id===l?{...u,...d}:u)}),noteToolError:()=>a(l=>{l.toolErrors+=1}),noteMutation:()=>a(l=>{l.mutated=!0})};return this.emit(),Promise.resolve().then(()=>n(c)).then(l=>{this.finish(o,i.aborted?"aborted":"done",typeof l=="string"?l:void 0)}).catch(l=>{this.finish(o,"failed",void 0,l?.message??String(l))}),o}abort(e){let r=this.signals.get(e);return r?(r.aborted=!0,r.controller.abort(),!0):!1}abortFor(e){let r=0;for(let n of this.runningFor(e))this.abort(n.id)&&(r+=1);return r}abortAll(){let e=0;for(let r of this.running())this.abort(r.id)&&(e+=1);return e}prune(e=6e4,r=Date.now()){let n=!1;for(let[o,i]of this.runs)i.status!=="running"&&i.endedAt&&r-i.endedAt>e&&(this.runs.delete(o),this.signals.delete(o),n=!0);n&&this.emit()}finish(e,r,n,o){let i=this.runs.get(e);if(i){i.status=r,i.endedAt=Date.now(),i.workers=i.workers.map(s=>({...s,status:"idle",activity:void 0})),o&&(i.error=o),this.signals.delete(e),this.emit();for(let s of this.doneListeners)try{s({run:{...i},result:n})}catch(a){console.error("\uC2E4\uD589 \uC644\uB8CC \uC54C\uB9BC \uC2E4\uD328 \u2014 \uACB0\uACFC\uAC00 \uB300\uD654\uC5D0 \uC548 \uB730 \uC218 \uC788\uC2B5\uB2C8\uB2E4:",a)}}}emit(){let e=this.list();for(let r of this.listeners)try{r(e)}catch(n){console.error("\uC2E4\uD589 \uBAA9\uB85D \uAC31\uC2E0 \uC2E4\uD328:",n)}}};Ps();lr();import cf from"node:fs";import{resolve as XR,extname as nv}from"node:path";function ov(t){return t.aborted?!1:t.failedWorkers>0||t.toolErrors>=2}function iv(t){let e=t.match(/\{[\s\S]*\}/);if(!e)return null;let r;try{r=JSON.parse(e[0])}catch{return null}if(!r||typeof r!="object")return null;let n=r,o=s=>typeof s=="string"?s.trim():"",i={file:o(n.file),symptom:o(n.symptom),cause:o(n.cause),rule:o(n.rule)};return!i.file||!i.symptom||!i.cause||!i.rule||/^(none|n\/a|없음)$/i.test(i.file)?null:i}var QR=[/\b(api[_-]?key|secret|password|passwd|token|credential|private[_-]?key)\b\s*[:=]/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/,/\bsk-[A-Za-z0-9]{16,}/,/\bAKIA[0-9A-Z]{16}\b/,/\bghp_[A-Za-z0-9]{20,}/,/\bBearer\s+[A-Za-z0-9._-]{20,}/i,/\beyJ[A-Za-z0-9._-]{20,}/,/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/];function lf(t){return QR.some(e=>e.test(t))}var ZR=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".java",".go",".rs",".c",".h",".cc",".cpp",".css",".scss",".swift",".kt"]),eI=new Set([".py",".sh",".bash",".zsh",".rb",".yml",".yaml",".toml",".conf"]);function tI(t,e=t.file){let r=nv(e).toLowerCase(),n=[`\uC99D\uC0C1: ${t.symptom}`,`\uC9C4\uC9DC \uC6D0\uC778: ${t.cause}`,`\uADF8\uB798\uC11C \uADDC\uCE59: ${t.rule}`];return r===".md"?`
|
|
534
|
+
## \uD568\uC815 \u2014 ${t.symptom}
|
|
535
|
+
|
|
536
|
+
`+n.map(o=>`- ${o}`).join(`
|
|
537
|
+
`)+`
|
|
538
|
+
`:ZR.has(r)?`/**
|
|
539
|
+
* \u26A0\uFE0F ${n[0]}
|
|
540
|
+
* ${n[1]}
|
|
541
|
+
* ${n[2]}
|
|
542
|
+
*/
|
|
543
|
+
`:n.map(o=>`# \u26A0\uFE0F ${o}`).join(`
|
|
544
|
+
`)+`
|
|
545
|
+
`}function sv(t){return[`\u{1F4CC} ${t.file}`,` \uC99D\uC0C1 ${t.symptom}`,` \uC9C4\uC9DC \uC6D0\uC778 ${t.cause}`,` \uADF8\uB798\uC11C \uADDC\uCE59 ${t.rule}`].join(`
|
|
546
|
+
`)}function av(t,e=process.cwd()){let r=XR(e,t.file),n=`${t.symptom}
|
|
547
|
+
${t.cause}
|
|
548
|
+
${t.rule}`;if(lf(n))return{ok:!1,reason:"\uBE44\uBC00\uAC12/\uAC1C\uC778\uC815\uBCF4\uAC00 \uC11E\uC5EC \uC788\uC5B4 \uB0A8\uAE30\uC9C0 \uC54A\uC558\uB2E4"};if(r!==e&&!r.startsWith(e.endsWith("/")?e:e+"/"))return{ok:!1,reason:"\uC791\uC5C5 \uD3F4\uB354 \uBC16\uC758 \uD30C\uC77C\uC774\uB2E4"};if(Fe.isSecretPath(r))return{ok:!1,reason:"\uBE44\uBC00 \uD30C\uC77C\uC774\uB2E4"};if(!cf.existsSync(r))return{ok:!1,reason:"\uADF8\uB7F0 \uD30C\uC77C\uC774 \uC5C6\uB2E4 (\uC0C8 \uD68C\uACE0 \uD30C\uC77C\uC740 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4)"};let o;try{o=cf.readFileSync(r,"utf-8")}catch(a){return{ok:!1,reason:`\uC77D\uC9C0 \uBABB\uD588\uB2E4: ${a.message}`}}let i=tI(t,r),s;if(nv(r).toLowerCase()===".md")s=o.replace(/\s*$/,`
|
|
549
|
+
`)+i;else if(o.startsWith("#!")){let a=o.indexOf(`
|
|
550
|
+
`);s=o.slice(0,a+1)+i+o.slice(a+1)}else s=i+o;try{cf.writeFileSync(r,s,"utf-8")}catch(a){return{ok:!1,reason:`\uC4F0\uC9C0 \uBABB\uD588\uB2E4: ${a.message}`}}return{ok:!0,file:r}}var cv=["You review a coding session that stumbled, and decide whether a trap is worth recording","for whoever opens that file next.","Record ONLY when: (a) something went wrong, or (b) something that looks obvious is actually the opposite.","Never record successes \u2014 noise buries the real warnings.","Never include secrets, tokens, credentials, emails, or personal data.",'Output ONLY JSON: {"file":"<repo-relative path that contains the trap>","symptom":"...","cause":"...","rule":"..."}','The rule must be checkable by the next reader ("be careful" is useless).','If nothing is worth recording, output {"file":"none"}.',"Write symptom/cause/rule in the same language the user used."].join(" ");Sn();Ms();bf();function vf(t,e){return t==="builtin"?{engine:"builtin"}:e(t)?{engine:t,notice:"switched"}:{engine:"builtin",notice:"not-installed"}}function Wv(t){return t==="builtin"}Mn();var Bv=4e3;function Fn(t){return t.length>Bv?t.slice(0,Bv)+"\u2026":t}async function Hv(t,e,r,n){try{let o=new kt,i=await o.createPlan(`[\uD300] ${t}`.slice(0,120),t);for(let s of e){let a=await o.addStep(i.id,{title:`${s.agent}: ${s.subtask.slice(0,80)}`,detail:s.subtask,requiresApproval:!1}),c=r.find(l=>l.agent===s.agent);await o.recordResult(i.id,a,!0,Fn(c?.text??""))}return await o.note(i.id,`\uCDE8\uD569(\uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130):
|
|
551
|
+
${Fn(n)}`),await o.updatePlanStatus(i.id,"done"),i.id}catch{return null}}async function qv(t,e,r){try{let n=new kt,o=await n.createPlan(`[run] ${t}`.slice(0,120),t);for(let i of e){let s=await n.addStep(o.id,{title:`${i.name}: ${i.task.slice(0,80)}`,detail:i.task,requiresApproval:!1});await n.recordResult(o.id,s,!i.failed,Fn(i.failed?i.reason??"failed":i.text))}return r&&await n.note(o.id,`\uCDE8\uD569(\uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130):
|
|
552
|
+
${Fn(r)}`),await n.updatePlanStatus(o.id,"done"),o.id}catch{return null}}async function Gv(t,e,r){try{let n=new kt,o=await n.createPlan(`[\uD1A0\uB860] ${t}`.slice(0,120),t);for(let i of e){let s=await n.addStep(o.id,{title:`${i.name} \uCD5C\uC885 \uC785\uC7A5`,detail:Fn(i.text),requiresApproval:!1});await n.recordResult(o.id,s,!0,Fn(i.text))}return await n.note(o.id,`\uD310\uC815(\uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130):
|
|
553
|
+
${Fn(r)}`),await n.updatePlanStatus(o.id,"done"),o.id}catch{return null}}Tc();var Gc=class{queues=new Map;maxSize;constructor(e=3){this.maxSize=e}getMaxSize(){return this.maxSize}get(e){return[...this.queues.get(e)??[]]}count(e){return this.queues.get(e)?.length??0}isFull(e){return this.count(e)>=this.maxSize}enqueue(e,r){let n=this.queues.get(e)??[];if(n.length>=this.maxSize)return{ok:!1,count:n.length,max:this.maxSize};let o=[...n,r];return this.queues.set(e,o),{ok:!0,count:o.length,max:this.maxSize}}dequeue(e){let r=this.queues.get(e)??[];if(r.length===0)return;let[n,...o]=r;return o.length>0?this.queues.set(e,o):this.queues.delete(e),n}peek(e){return(this.queues.get(e)??[])[0]}clear(e){let n=(this.queues.get(e)??[]).length;return this.queues.delete(e),n}clearAll(){this.queues.clear()}};Tr();function Vv(t){let e=Math.max(1,Math.floor(t)||0);if(e<70)return{kind:"stack",showLeft:!1,leftWidth:0,centerWidth:e};let r=Math.min(26,Math.max(22,Math.floor(e*.2)));return{kind:"two",showLeft:!0,leftWidth:r,centerWidth:Math.max(1,e-r)}}function zv(t,e){return Math.max(1,Math.floor(t)-(e?18:10))}var Kv=(t="chat")=>({focus:t,row:0,lastArrow:null}),Uo=(t,e)=>e<=0?0:Math.min(e-1,Math.max(0,t));function Jv(t,e,r){if(e.type==="focus"){let o=e.to==="workers"?Uo(r.activeRow??t.row,r.workerCount):t.row;return{state:{focus:e.to,row:o,lastArrow:null},handled:!0}}if(t.focus==="workers")return e.type==="cancel"?{state:{...t,focus:"chat",lastArrow:null},handled:!0}:e.type==="confirm"?{state:{...t,focus:"chat",lastArrow:null},handled:!0,activateRow:Uo(t.row,r.workerCount)}:e.dir==="up"?{state:{...t,row:Uo(t.row-1,r.workerCount),lastArrow:null},handled:!0}:e.dir==="down"?{state:{...t,row:Uo(t.row+1,r.workerCount),lastArrow:null},handled:!0}:e.dir==="right"?{state:{...t,focus:"chat",lastArrow:null},handled:!0,activateRow:Uo(t.row,r.workerCount)}:{state:{...t,lastArrow:null},handled:!0};if(e.type==="confirm"||e.type==="cancel")return{state:{...t,lastArrow:null},handled:!1};if(e.dir==="up"||e.dir==="down")return{state:{...t,lastArrow:null},handled:!1};if(e.dir==="right"||!r.inputEmpty||!r.showLeft)return{state:{...t,lastArrow:null},handled:!1};let n=t.lastArrow;return n&&n.dir==="left"&&e.at-n.at<=800?{state:{focus:"workers",row:Uo(r.activeRow??t.row,r.workerCount),lastArrow:null},handled:!0}:{state:{...t,lastArrow:{dir:"left",at:e.at}},handled:!1}}_a();_s();import{resolve as Sf}from"node:path";import{createHash as XI}from"node:crypto";function Yv(t){return t?.uid&&t.endpoint?XI("sha256").update(JSON.stringify([t.uid,t.endpoint])).digest("hex"):void 0}function Vc(t,e,r,n,o){return{provider:e,profileId:t.providerProfileId||"active-local",deviceId:r,cwd:Sf(n),...o?{ownerKey:o}:{},...t.targetDeviceId?{targetDeviceId:t.targetDeviceId}:{},...t.cwd?{planCwd:Sf(t.cwd)}:{}}}function zc(t,e){return t.provider===e.provider&&t.profileId===e.profileId&&t.deviceId===e.deviceId&&t.cwd===e.cwd&&t.targetDeviceId===e.targetDeviceId&&t.planCwd===e.planCwd&&t.ownerKey===e.ownerKey}function xf(t,e){return e.brain!==t.provider||(e.providerProfileId||"active-local")!==t.profileId||(e.targetDeviceId||void 0)!==t.targetDeviceId||(e.cwd?Sf(e.cwd):void 0)!==t.planCwd?"Execution selection changed. Review the selected provider, device and profile before retrying; no different account was started.":null}De();_s();Mn();import{spawnSync as pM}from"child_process";import{statSync as fM}from"fs";import{homedir as ah}from"os";import{join as hM}from"path";_o();Mn();Zr();import{execSync as CS}from"child_process";lr();Zr();Ba();var QI=[/\bnpm\s+publish\b/,/\byarn\s+publish\b/,/\bpnpm\s+publish\b/,/\bgit\s+push\b/,/\bgit\s+tag\s+.*-\s*[af]\b/,/\bdocker\s+push\b/,/\bgh\s+(release|pr|issue)\s+create\b/,/\b(vercel|netlify|firebase|wrangler|fly|heroku)\s+deploy\b/,/\b(scp|rsync)\b[^|]*\s\S+@\S+:/,/\bcurl\b[^|]*(-X\s*(POST|PUT|PATCH|DELETE)|--data|-d\s)/];function ZI(t){return Fe.isWorkLossCommand(t)?!0:QI.some(e=>e.test(t))}var Wo=class extends Fe{scope;haltOnViolation;denyAllWrites;autoApprove;repoAccess;violation=null;halted=!1;constructor(e,r={}){super({mode:"DangerFullAccess",writeOnlyAllowedPaths:r.autoApprove&&r.autoApproveRoot?[r.autoApproveRoot]:e.paths}),this.scope=e,this.haltOnViolation=r.haltOnViolation??!0,this.denyAllWrites=r.denyAllWrites??!1,this.autoApprove=r.autoApprove??!1,this.repoAccess=r.repoAccess??"write"}getViolation(){return this.violation}isHalted(){return this.halted}record(e){this.violation||(this.violation=e),this.haltOnViolation&&(this.halted=!0)}canExecuteCommand(e){if(this.halted||this.repoAccess!=="write"||!super.canExecuteCommand(e))return!1;let r=wo(e);if(r)return this.record({kind:"command",needed:{commands:[e]},reason:`\uCC28\uB2E8\uB41C \uBA85\uB839 \uD328\uD134\uC785\uB2C8\uB2E4: ${r}`}),!1;if(this.autoApprove)return ZI(e)&&!Lp(this.scope,e).allowed?(this.record({kind:"command",needed:{commands:[e]},reason:"\uB418\uB3CC\uB9B4 \uC218 \uC5C6\uAC70\uB098 \uC678\uBD80\uC5D0 \uB098\uAC00\uB294 \uBA85\uB839\uC774\uB77C \uC790\uB3D9 \uC2B9\uC778 \uB300\uC0C1\uC774 \uC544\uB2D9\uB2C8\uB2E4 \u2014 \uC774 \uBA85\uB839\uB9CC \uB530\uB85C \uC2B9\uC778\uD574 \uC8FC\uC138\uC694."}),!1):!0;let n=Lp(this.scope,e);return n.allowed?!0:(this.record(n.violation),!1)}canAccessPath(e,r=!1){if(this.halted||this.repoAccess==="none"||r&&this.repoAccess==="read")return!1;if(r){if(this.denyAllWrites)return this.record({kind:"path",needed:{paths:[e]},reason:`\uC774 \uACBD\uB85C\uC5D0\uB294 \uC4F0\uAE30\uAC00 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4: ${e}`}),!1;if(!this.autoApprove){let n=nb(this.scope,e);if(!n.allowed)return this.record(n.violation),!1}}return super.canAccessPath(e,r)}async requestApproval(e,r){return this.halted?{allowed:!1,message:"\uC774 \uB2E8\uACC4\uB294 \uC2B9\uC778 \uBC94\uC704 \uBC16 \uC791\uC5C5\uC5D0\uC11C \uBA48\uCDC4\uC2B5\uB2C8\uB2E4. \uCD94\uAC00 \uAD8C\uD55C\uC774 \uC2B9\uC778\uB420 \uB54C\uAE4C\uC9C0 \uB354 \uC9C4\uD589\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}:{allowed:!0}}};sl();var Nf=null,js=null;async function al(){return Nf||(js||(js=qo().then(t=>(Nf=t,js=null,t)).catch(t=>{throw js=null,t})),js)}ge();ze();function yS(t){let e=String(t??"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,64);if(!e)throw new Error("coworkMemoryDocId: projectId is required");return`cowork_${e}`}var N$=2e3,L$=40;function F$(t,e={}){if(!t)return"";let r=e.maxChars??N$,n=(e.lang??"ko")==="ko",o=n?`\uC774 \uD504\uB85C\uC81D\uD2B8(${t.projectName||t.projectId})\uC5D0 \uB300\uD574 \uC9C0\uAE08\uAE4C\uC9C0 \uC313\uC778 \uB9E5\uB77D\uC785\uB2C8\uB2E4.`:`Context accumulated for this project (${t.projectName||t.projectId}).`,i=[];t.product&&i.push(n?`\uC81C\uD488: ${t.product}`:`Product: ${t.product}`),t.tone&&i.push(n?`\uD1A4/\uBA54\uC2DC\uC9C0: ${t.tone}`:`Tone / message: ${t.tone}`);let s=[...t.entries??[]].reverse(),a=n?"\uCD5C\uADFC \uC791\uC5C5:":"Recent work:",c=[],l=o.length+i.join(`
|
|
554
|
+
`).length+a.length,d=0;for(let u of s){let f=`- [${u.kind}${u.brain?`/${u.brain}`:""}] ${u.text}`;if(l+f.length+1>r){d++;continue}c.push(f),l+=f.length+1}let p=[o,...i];return c.length&&p.push(a,...c),d>0&&p.push(n?`(\uC624\uB798\uB41C \uC791\uC5C5 ${d}\uAC74\uC740 \uAE38\uC774 \uB54C\uBB38\uC5D0 \uBE90\uC2B5\uB2C8\uB2E4. \uB354 \uD544\uC694\uD558\uBA74 \uBB34\uC5C7\uC774 \uAD81\uAE08\uD55C\uC9C0 \uB9D0\uD574 \uC8FC\uC138\uC694 \u2014 \uC798\uB9B0 \uBD80\uBD84\uC774 \uC788\uB2E4\uB294 \uAC78 \uC804\uC81C\uD558\uACE0 \uD310\uB2E8\uD558\uC138\uC694.)`:`(${d} older items were left out for length. Say what you need and it can be pulled \u2014 assume this view is partial.)`),p.join(`
|
|
555
|
+
`)}function j$(t,e,r=L$){let n=[...t.entries??[],e];return{...t,entries:n.slice(Math.max(0,n.length-r)),updatedAt:e.at}}function Us(t,e=300){let r=String(t??"").replace(/\s+/g," ").trim();return r.length>e?`${r.slice(0,e)}\u2026`:r}function bS(t){return(t??new K).getSession()?.user?.id??null}async function vS(t,e){if(!bS(e)||!t?.id)return null;try{let o=await new ve(e).request(`/api/memory/${encodeURIComponent(yS(t.id))}`);if(!o.ok)throw new Error(`memory HTTP ${o.status}`);let s=(await o.json()).memory??null;return s?{projectId:t.id,projectName:typeof s.projectName=="string"?s.projectName:t.name,product:typeof s.product=="string"?s.product:void 0,tone:typeof s.tone=="string"?s.tone:void 0,entries:Array.isArray(s.entries)?s.entries:[],updatedAt:typeof s.updatedAt=="string"?s.updatedAt:void 0}:null}catch(n){return console.error("\uD504\uB85C\uC81D\uD2B8 \uBA54\uBAA8\uB9AC \uC870\uD68C \uC2E4\uD328 \u2014 \uB9E5\uB77D \uC5C6\uC774 \uC9C4\uD589\uD569\uB2C8\uB2E4:",n.message),null}}async function Ws(t,e,r){if(!(!bS(r)||!t?.id))try{let i=await vS(t,r)??{projectId:t.id,projectName:t.name,entries:[]},s=j$(i,e),a={projectId:s.projectId,...s.projectName?{projectName:s.projectName}:{},...s.product?{product:s.product}:{},...s.tone?{tone:s.tone}:{},entries:s.entries,updatedAt:s.updatedAt??new Date().toISOString()},c=await new ve(r).request(`/api/memory/${encodeURIComponent(yS(t.id))}`,{method:"PUT",body:JSON.stringify({memory:a})});if(!c.ok)throw new Error(`memory HTTP ${c.status}`)}catch(o){console.error("\uD504\uB85C\uC81D\uD2B8 \uBA54\uBAA8\uB9AC \uAE30\uB85D \uC2E4\uD328 \u2014 \uC2E4\uD589\uC740 \uACC4\uC18D\uD569\uB2C8\uB2E4:",o.message)}}async function cl(t,e){let r=await vS(t,e);if(!r)return"";let n=F$(r);return n?`
|
|
556
|
+
${n}
|
|
557
|
+
`:""}Ot();ze();ge();Ot();import{readFile as ES,readdir as q$,stat as G$}from"fs/promises";import{join as V$,extname as z$,basename as jf}from"path";Lt();import Bs from"node:fs";import{dirname as U$,join as W$}from"node:path";import{randomUUID as B$}from"node:crypto";var SS=()=>W$(Ee(),"cowork-file-outbox.json");function H$(t){let e=t;return!!e&&typeof e.id=="string"&&typeof e.projectId=="string"&&typeof e.localPath=="string"&&typeof e.contentType=="string"&&typeof e.sizeBytes=="number"&&["queued","reserved","uploaded"].includes(String(e.phase))&&!!e.metadata&&typeof e.metadata=="object"&&typeof e.savedAt=="string"}function Go(){try{let t=JSON.parse(Bs.readFileSync(SS(),"utf8"));return Array.isArray(t)?t.filter(H$):[]}catch{return[]}}function Lf(t){let e=SS();if(Bs.mkdirSync(U$(e),{recursive:!0,mode:448}),!t.length){try{Bs.unlinkSync(e)}catch{}return}let r=`${e}.${process.pid}.tmp`;Bs.writeFileSync(r,`${JSON.stringify(t,null,2)}
|
|
558
|
+
`,{mode:384}),Bs.renameSync(r,e)}function xS(t){let e=Go(),r=e.find(o=>o.projectId===t.projectId&&o.localPath===t.localPath&&o.metadata.planId===t.metadata.planId);if(r)return r;let n={...t,id:B$(),phase:"queued",savedAt:new Date().toISOString()};return Lf([...e,n]),n}function Ff(t,e){let r=null,n=Go().map(o=>o.id!==t?o:(r={...o,...e,id:o.id,savedAt:o.savedAt},r));return Lf(n),r}function kS(t){Lf(Go().filter(e=>e.id!==t))}var ll=50*1024*1024,K$=5,J$=new Set(["node_modules",".git","dist","build","out",".next",".cache",".venv","venv","__pycache__","coverage","target",".turbo","tmp"]),Y$={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".avif":"image/avif",".mp4":"video/mp4",".webm":"video/webm",".mov":"video/quicktime",".pdf":"application/pdf"};function ul(t){return Y$[z$(String(t??"")).toLowerCase()]??null}async function X$(t,e,r={}){let n=r.maxDepth??3,o=r.max??K$,i=[],s=async(a,c)=>{if(i.length>=o||c>n)return;let l;try{l=await q$(a,{withFileTypes:!0})}catch{return}for(let d of l){if(i.length>=o)return;if(d.name.startsWith(".")&&d.isDirectory())continue;let p=V$(a,d.name);if(d.isDirectory()){if(J$.has(d.name))continue;await s(p,c+1);continue}if(!d.isFile())continue;let u=ul(d.name);if(u)try{let f=await G$(p);if(f.mtimeMs<e||f.size<=0||f.size>ll)continue;i.push({path:p,contentType:u,sizeBytes:f.size})}catch{}}};return await s(t,0),i}async function Mr(t,e,r={},n=new ve(new K)){let o=nt(t?.id);if(!o)return null;let i=r.contentType??ul(e);if(!i)return null;let s;try{s=await ES(e)}catch(c){return console.error(`\uC791\uC5C5\uBB3C \uD30C\uC77C\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(${e}):`,c.message),null}if(s.byteLength<=0||s.byteLength>ll)return null;let a=xS({projectId:o,localPath:e,contentType:i,sizeBytes:s.byteLength,metadata:{name:r.name?.trim()||jf(e),caption:r.caption??"",...r.agentId?{agentId:r.agentId}:{},...r.planId?{planId:r.planId}:{},status:"submitted"}});return PS(a,n)}async function PS(t,e){let r=t,n=jf(r.localPath),o;try{o=await ES(r.localPath)}catch(i){return console.error(`\uC791\uC5C5\uBB3C \uD30C\uC77C \uC7AC\uC2DC\uB3C4 \uB300\uAE30(${r.localPath}):`,i.message),null}try{if(r.phase==="queued"){let i=await e.request("/api/cowork-upload-url",{method:"POST",body:JSON.stringify({projectId:r.projectId,fileName:n,contentType:r.contentType,sizeBytes:r.sizeBytes})});if(!i.ok)throw new Error(`reserve ${i.status}: ${(await i.text().catch(()=>"")).slice(0,120)}`);let s=await i.json();r=Ff(r.id,{phase:"reserved",artifactId:s.artifactId,uploadUrl:s.uploadUrl,uploadHeaders:s.headers})??r}if(r.phase==="reserved"){if(!r.uploadUrl||!r.artifactId)throw new Error("reserved upload ticket is incomplete");let i=/^https?:\/\//i.test(r.uploadUrl)?r.uploadUrl:`${e.endpoint}${r.uploadUrl.startsWith("/")?"":"/"}${r.uploadUrl}`,s=await fetch(i,{method:"PUT",headers:r.uploadHeaders??{"Content-Type":r.contentType},body:new Uint8Array(o)});if(!s.ok)throw new Error(`PUT ${s.status}`);r=Ff(r.id,{phase:"uploaded"})??r}}catch(i){return console.error(`\uD30C\uC77C \uC791\uC5C5\uBB3C \uC5C5\uB85C\uB4DC \uC7AC\uC2DC\uB3C4 \uB300\uAE30(${n}):`,i.message),null}try{let i=await e.request("/api/cowork-upload-done",{method:"POST",body:JSON.stringify({artifactId:r.artifactId,...r.metadata})});if(!i.ok)throw new Error(`done ${i.status}`);return kS(r.id),r.artifactId??null}catch(i){return console.error(`\uD30C\uC77C \uC791\uC5C5\uBB3C \uB4F1\uB85D \uC7AC\uC2DC\uB3C4 \uB300\uAE30(${n}):`,i.message),null}}async function AS(t=new ve(new K)){let e=0;for(let r of Go())await PS(r,t)&&(e+=1);return{flushed:e,remaining:Go().length}}async function dl(t,e){if(!nt(t?.id))return 0;try{let r=e.root??process.cwd(),n=await X$(r,e.sinceMs);if(!n.length)return 0;let o=0;for(let i of n)await Mr(t,i.path,{agentId:e.agentId,planId:e.planId,caption:e.stepTitle?`${e.stepTitle} \u2014 ${jf(i.path)}`:"",contentType:i.contentType})&&o++;return o}catch(r){return console.error("\uD30C\uC77C \uC791\uC5C5\uBB3C \uC5C5\uB85C\uB4DC \uC911 \uC624\uB958 \u2014 \uC2E4\uD589 \uACB0\uACFC \uC790\uCCB4\uB294 \uC774\uBBF8 \uAE30\uB85D\uB410\uC2B5\uB2C8\uB2E4:",r.message),0}}function Vo(t){let e=String(t??"").trim();return e?`\uD504\uB85C\uC81D\uD2B8 \uC9C0\uCE68:
|
|
559
|
+
${e}`:""}function Hs(){try{let t=CS("git diff --name-status HEAD",{encoding:"utf-8"}).trim();return t?t.split(`
|
|
560
|
+
`).map(e=>{let[r,...n]=e.split(" "),o=n.join(" "),i=r.startsWith("A")?"create":r.startsWith("D")?"delete":"modify",s;try{s=CS(`git diff HEAD -- "${o}"`,{encoding:"utf-8"})}catch{}return{path:o,action:i,patch:s}}):[]}catch{return[]}}async function pl(t){let e=new kt,r=await e.getPlan(t.planId),n=(r.state.steps??[]).find(h=>h.id===t.stepId);if(!n)return{success:!1,error:"step not found"};if(!qp(r.state,t.stepId))return{success:!1,error:"step not approved"};await e.startStep(t.planId,t.stepId);let o=Date.now(),i;try{i=await al()}catch(h){let w=h.message;return await e.recordResult(t.planId,t.stepId,!1,`\uC2E4\uD589 \uD658\uACBD \uC900\uBE44 \uC2E4\uD328: ${w}`),{success:!1,error:w}}let s=Ro(n.scope,process.cwd()),a=new Wo(s,{...t.autoApprove?{autoApprove:!0,autoApproveRoot:process.cwd()}:{},repoAccess:r.access?.repo}),c=i.registry.getPermissionManager();i.registry.setPermissionManager(a);let l=async()=>{try{return(await e.getPlan(t.planId)).status==="cancelled"}catch{return!1}};Ip(l);let d=await cl(r.project),p=await kc(r.project),u=Sc(r.project?.id)?Oo:"",f=Vo(r.projectInstructions),m=`\uB2E4\uC74C \uC791\uC5C5\uC744 \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC218\uD589\uD558\uC138\uC694. \uC774 \uB2E8\uACC4\uC5D0 \uD544\uC694\uD55C \uBCC0\uACBD\uB9CC \uD558\uC138\uC694.
|
|
561
|
+
|
|
562
|
+
`+(d?`${d}
|
|
563
|
+
`:"")+(p?`${p}
|
|
564
|
+
`:"")+(u?`${u}
|
|
565
|
+
|
|
566
|
+
`:"")+(f?`${f}
|
|
567
|
+
|
|
568
|
+
`:"")+`\uC81C\uBAA9: ${n.title}
|
|
569
|
+
`+(n.detail?`\uC0C1\uC138: ${n.detail}
|
|
570
|
+
`:"")+(t.autoApprove?`
|
|
571
|
+
\uC774 \uB2E8\uACC4\uB294 \uC790\uB3D9 \uC2B9\uC778 \uBAA8\uB4DC\uC785\uB2C8\uB2E4 \u2014 \uC544\uB798 \uBC94\uC704 \uBC16\uB3C4 \uC2E4\uD589\uB429\uB2C8\uB2E4. \uB2E4\uB9CC \uB418\uB3CC\uB9B4 \uC218 \uC5C6\uAC70\uB098 \uC678\uBD80\uC5D0 \uB098\uAC00\uB294 \uBA85\uB839(git push, npm publish, git reset --hard \uB4F1)\uACFC \uD30C\uAD34\uC801 \uBA85\uB839\uC740 \uC5EC\uC804\uD788 \uB9C9\uD788\uACE0 \uC0AC\uC6A9\uC790 \uC2B9\uC778\uC744 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4.
|
|
572
|
+
`:"")+`
|
|
573
|
+
\uC2B9\uC778\uB41C \uAD8C\uD55C \uBC94\uC704${t.autoApprove?"(\uCC38\uACE0)":"(\uC774 \uBC16\uC758 \uC791\uC5C5\uC740 \uC2E4\uD589\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4)"}:
|
|
574
|
+
- \uC2E4\uD589 \uAC00\uB2A5\uD55C \uC178 \uBA85\uB839: ${s.commands.length?s.commands.map(h=>`\`${h}\``).join(", "):"\uC5C6\uC74C (bash \uC0AC\uC6A9 \uBD88\uAC00)"}
|
|
575
|
+
- \uC4F0\uAE30 \uAC00\uB2A5\uD55C \uACBD\uB85C: ${s.paths.join(", ")}
|
|
576
|
+
`+(r.access?.repo==="none"?`\u26A0 \uC774 \uD50C\uB79C\uC740 \uC800\uC7A5\uC18C \uC811\uADFC\uC774 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uC178/\uD30C\uC77C \uC77D\uAE30/\uC4F0\uAE30 \uC804\uBD80 \uBD88\uAC00\uD569\uB2C8\uB2E4. \uD14D\uC2A4\uD2B8\uB85C\uB9CC \uB2F5\uD558\uC138\uC694.
|
|
577
|
+
`:r.access?.repo==="read"?`\u26A0 \uC774 \uD50C\uB79C\uC740 \uC800\uC7A5\uC18C \uC77D\uAE30 \uC804\uC6A9\uC785\uB2C8\uB2E4 \u2014 \uC178/\uD30C\uC77C \uC4F0\uAE30\uAC00 \uC804\uBD80 \uBD88\uAC00\uD569\uB2C8\uB2E4. \uC77D\uAE30\uB9CC \uD558\uC138\uC694.
|
|
578
|
+
`:"")+`\uBC94\uC704 \uBC16 \uC791\uC5C5\uC774 \uD544\uC694\uD558\uBA74 \uC2DC\uB3C4\uD558\uC9C0 \uB9D0\uACE0 \uBB34\uC5C7\uC774 \uC65C \uD544\uC694\uD55C\uC9C0 \uC124\uBA85\uD558\uACE0 \uC911\uB2E8\uD558\uC138\uC694. \uC6B0\uD68C(\uB2E4\uB978 \uBA85\uB839/\uB2E4\uB978 \uACBD\uB85C)\uB97C \uC2DC\uB3C4\uD558\uBA74 \uADF8 \uB2E8\uACC4\uB294 \uC815\uC9C0\uB418\uACE0 \uC0AC\uC6A9\uC790 \uC7AC\uC2B9\uC778\uC744 \uAE30\uB2E4\uB9AC\uAC8C \uB429\uB2C8\uB2E4.
|
|
579
|
+
`;try{let h=await new $r().execute({prompt:m,subagent_type:"general-purpose",model:t.tier??"heavy"},{messages:[],context:{coworkProject:r.project},metadata:{currentNode:"agent",visitedNodes:[],startTime:Date.now(),conversationId:`planner_executor_${Date.now().toString(36)}`,loopCount:0,status:"running"}});if(await l())return await e.recordResult(t.planId,t.stepId,!1,"\uC0AC\uC6A9\uC790\uAC00 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4."),{success:!1,error:"cancelled by user"};let w=Hs();w.length&&await e.recordChange(t.planId,t.stepId,w);let b=a.getViolation();if(b){let k=`${b.reason}
|
|
580
|
+
(\uB2E8\uACC4: ${n.title})`;return await e.requestScopeAmendment(t.planId,t.stepId,b.needed,k),await e.note(t.planId,`\u26A0 \uC2B9\uC778 \uBC94\uC704 \uBC16\uC5D0\uC11C \uC815\uC9C0: ${b.reason}`),{success:!1,error:`scope violation \u2014 awaiting re-approval: ${b.reason}`}}return h.isError?(await e.recordResult(t.planId,t.stepId,!1,h.error??"execution error"),await Ws(r.project,{at:new Date().toISOString(),kind:"code",brain:"server",text:`${n.title} \u2014 \uC2E4\uD328: ${Us(h.error??"")}`}),{success:!1,error:h.error}):(await e.recordResult(t.planId,t.stepId,!0,h.content?.slice(0,4e3)),await Ws(r.project,{at:new Date().toISOString(),kind:"code",brain:"server",text:`${n.title} \u2014 \uC644\uB8CC: ${Us(h.content??"")}`}),await dl(r.project,{sinceMs:o,agentId:r.agentId,planId:t.planId,stepTitle:n.title}),await Do(r.project,{name:n.title,kind:"markdown",content:h.content??"",agentId:r.agentId,planId:t.planId}),{success:!0})}catch(h){return await e.recordResult(t.planId,t.stepId,!1,h.message),{success:!1,error:h.message}}finally{i.registry.setPermissionManager(c),Ip(null)}}_o();Mn();Zr();async function _S(t){let e=new kt,r=await e.getPlan(t.planId);if(r.status!=="requested")return{success:!1,error:"plan is not in requested state"};let n=await al(),o=`You are the Orchestrator. Your task is to author a step-by-step plan using the 'plan' tool based on the user's request.
|
|
581
|
+
|
|
582
|
+
Plan ID: ${r.id}
|
|
583
|
+
Title: ${r.title}
|
|
584
|
+
`+(r.goal?`Goal: ${r.goal}
|
|
585
|
+
`:"")+`
|
|
586
|
+
Use the 'plan' tool to add steps using action='add_step'. Add as many steps as necessary to achieve the goal.
|
|
587
|
+
Each step must require approval.
|
|
588
|
+
|
|
589
|
+
Every step MUST declare what it is allowed to do \u2014 the user approves that declaration, not the prose title:
|
|
590
|
+
- commands: the EXACT shell commands the step may run (exact string match; "npm test" does not permit
|
|
591
|
+
"npm test --coverage"). Omit entirely if the step only edits files \u2014 a step with no declared command
|
|
592
|
+
cannot use bash at all.
|
|
593
|
+
- paths: the directory subtrees the step may write to (relative to the project root). Omit to allow the
|
|
594
|
+
whole project root.
|
|
595
|
+
Declare the narrowest set that actually gets the step done. Anything outside it will not run: the step
|
|
596
|
+
stops mid-execution and waits for the user to approve the extra permission.
|
|
597
|
+
|
|
598
|
+
Once you have added all the steps, you are done.`,i=new Wo(Ro(void 0,process.cwd()),{haltOnViolation:!1,denyAllWrites:!0}),s=n.registry.getPermissionManager();n.registry.setPermissionManager(i);try{let a=await new $r().execute({prompt:o,subagent_type:"general-purpose",model:"orchestrator"},{messages:[],context:{},metadata:{currentNode:"agent",visitedNodes:[],startTime:Date.now(),conversationId:`planner_author_${Date.now().toString(36)}`,loopCount:0,status:"running"}});return a.isError?(await e.note(t.planId,`Authoring failed: ${a.error??"unknown error"}`),{success:!1,error:a.error}):(await e.updatePlanStatus(t.planId,"proposed"),await e.note(t.planId,"Authoring complete."),{success:!0})}catch(a){return await e.note(t.planId,`Authoring failed: ${a.message}`),{success:!1,error:a.message}}finally{n.registry.setPermissionManager(s)}}Zr();nl();import fl from"fs";import{dirname as Q$,join as Z$}from"path";import{homedir as eO}from"os";function RS(){return Z$(eO(),".protocol-cli","runner.lock")}function tO(t){if(!Number.isFinite(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return e.code!=="ESRCH"}}function IS(t){try{let e=JSON.parse(fl.readFileSync(t,"utf-8"));return e&&typeof e.pid=="number"?e:null}catch{return null}}var Uf=new Set,TS=!1;function hl(t={}){let e=t.path??RS(),r=t.isPidAlive??tO,n=IS(e);if(n&&n.pid!==process.pid&&r(n.pid))return{acquired:!1,heldByPid:n.pid};try{fl.mkdirSync(Q$(e),{recursive:!0});let o={pid:process.pid,startedAt:new Date().toISOString()};fl.writeFileSync(e,JSON.stringify(o),"utf-8")}catch(o){return console.error("\uB7EC\uB108 \uB85C\uCEEC \uC7A0\uAE08 \uD30C\uC77C\uC744 \uC4F0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uBB34\uC2DC\uD558\uACE0 \uACC4\uC18D\uD569\uB2C8\uB2E4:",o.message),{acquired:!0}}return Uf.add(e),TS||(TS=!0,process.once("exit",()=>{for(let o of Uf)$S(o)})),{acquired:!0}}function $S(t){try{let e=IS(t);(!e||e.pid===process.pid)&&fl.rmSync(t,{force:!0})}catch{}Uf.delete(t)}function ml(t={}){let e=t.path??RS();$S(e)}ge();ge();Ra();ze();Ms();Rn();import{join as GS}from"path";import{tmpdir as SO}from"os";import{mkdtempSync as xO}from"fs";import{resolve as VS}from"node:path";Lt();import zo from"node:fs";import{createHash as rO}from"node:crypto";import{execFileSync as OS}from"node:child_process";import{dirname as nO,join as DS}from"node:path";var NS=()=>DS(Ee(),"execution-checkpoints.json"),Hf=()=>{try{let t=JSON.parse(zo.readFileSync(NS(),"utf8"));return Array.isArray(t)?t:[]}catch{return[]}},LS=t=>{let e=NS();if(zo.mkdirSync(nO(e),{recursive:!0,mode:448}),!t.length){try{zo.unlinkSync(e)}catch{}return}let r=`${e}.${process.pid}.tmp`;zo.writeFileSync(r,JSON.stringify(t,null,2),{mode:384}),zo.renameSync(r,e)},Wf=t=>LS([...Hf().filter(e=>e.key!==t.key),t]),oO=t=>LS(Hf().filter(e=>e.key!==t)),MS=t=>Hf().find(e=>e.key===t);function FS(t){let e=t.toLowerCase();return/usage.?limit|quota|rate.?limit|too many requests|\b429\b/.test(e)?"usage_limit":/\b503\b|service unavailable|temporarily unavailable|overloaded/.test(e)?"transient_503":/timed? out|timeout|no response|unresponsive|hung/.test(e)?"unresponsive":/unauthorized|authentication|auth required|login required|please log.?in|\b401\b/.test(e)?"auth_required":"permanent"}function qf(t){try{let e=OS("git",["diff","--binary","HEAD"],{cwd:t}),r=OS("git",["status","--porcelain=v1","-z","--untracked-files=all"],{cwd:t}),n=rO("sha256").update(e).update(r),o=r.toString("utf8").split("\0").filter(Boolean);for(let i of o){if(!i.startsWith("?? "))continue;let s=i.slice(3);try{n.update(s).update(zo.readFileSync(DS(t,s)))}catch{n.update("unreadable")}}return n.digest("hex")}catch{return"unavailable"}}var Bf=3;async function Gf(t){let e=t.now??(()=>new Date),r=t.profiles[0],n=MS(t.key),o=async(s,a=n)=>(await t.onActivity?.({type:"attention_required",at:e().toISOString(),reason:s,profileId:a?.profileId??r,attempt:a?.attempt}),{ok:!1,failureKind:"permanent",reason:s,attentionRequired:!0,resumeCheckpoint:a});if(!r)return o("No selected profile. Reconnect or explicitly select the execution account.");if(t.identity&&t.identity.profileId!==r)return o("Checkpoint selection does not match the execution profile.");if(n&&(n.profileId!==r||t.identity&&(!n.identity||!zc(n.identity,t.identity))))return o("Execution identity changed or the older checkpoint has no identity binding. Review the previous attempt before retrying; no other account was used.");if(n?.state==="attention_required")return o(n.reason??"Review the previous execution before retrying.");if(n?.state==="running")return o("An interrupted provider attempt requires reconciliation before retrying.");let i=n?.initialFingerprint??t.fingerprint();if(n&&(n.state!=="retrying"||!Number.isInteger(n.attempt)||n.attempt<1||n.attempt>=Bf||i==="unavailable"||t.fingerprint()!==i))return o("Previous retry is invalid, exhausted, or the repository changed; review before retrying.");for(let s=(n?.attempt??0)+1;s<=Bf;s++){if(s>1&&(i==="unavailable"||t.fingerprint()!==i))return o("Repository changed before the retry; review before retrying.",MS(t.key));let a={key:t.key,initialFingerprint:i,attempt:s,profileId:r,...t.identity?{identity:t.identity}:{},state:"running",updatedAt:e().toISOString()};Wf(a);let c=await t.execute(r,s);if(c.ok)return oO(t.key),c;let l=i==="unavailable"||t.fingerprint()!==i;if(l||c.failureKind!=="transient_503"||s===Bf){let p=l?`Automatic retry blocked: repository changed or is unverified after ${r} started.`:`${c.reason??"Selected provider execution failed."} Reconnect the selected account or explicitly reselect after reviewing this attempt; no other account was used.`,u={...a,state:"attention_required",reason:p,externalSessionId:c.externalSessionId,updatedAt:e().toISOString()};return Wf(u),await t.onActivity?.({type:"attention_required",at:u.updatedAt,reason:p,attempt:s,profileId:r}),{...c,reason:p,attentionRequired:!0,resumeCheckpoint:u}}let d=new Date(e().getTime()+Math.min(250*s,1e3)).toISOString();await t.onActivity?.({type:"service_unavailable",at:e().toISOString(),reason:c.reason,attempt:s,profileId:r}),await t.onActivity?.({type:"retry_scheduled",at:e().toISOString(),attempt:s+1,retryAt:d,profileId:r}),Wf({...a,state:"retrying",reason:c.reason,externalSessionId:c.externalSessionId,updatedAt:e().toISOString()}),await(t.sleep??(p=>new Promise(u=>setTimeout(u,p))))(Math.min(250*s,1e3))}return o("Selected account retry limit reached. Review the previous execution.")}Zr();Ot();Ot();import{readdir as iO,readFile as sO,stat as aO,appendFile as cO}from"fs/promises";import{readFileSync as lO}from"fs";import{join as gl,relative as uO,resolve as Vf,dirname as dO,sep as jS,extname as US}from"path";import{tmpdir as pO}from"os";var fO=new Set([".md",".markdown",".html",".htm",".txt"]),Kf=2*1024*1024,hO=10,mO=3,gO=5e3,WS=new Set(["node_modules",".git","dist","build","out",".next",".cache",".venv","venv","__pycache__","coverage","target",".turbo","tmp","node_modules/.bin"]),BS=new Set(["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb","Cargo.lock","poetry.lock","composer.lock","Gemfile.lock","requirements.lock.txt"]);function yl(t){return fO.has(US(String(t??"")).toLowerCase())}function wO(t,e){let r=String(t??"");if(!r)return!1;let n=r.split("/"),o=n[n.length-1];return!o||BS.has(o)||n.slice(0,-1).some(i=>WS.has(i)||i.startsWith("."))||o.startsWith(".")||!yl(o)?!1:e>0&&e<=Kf}function zf(t){return jS==="/"?t:t.split(jS).join("/")}async function Jf(t,e={}){let r=e.maxDepth??mO,n=e.maxEntries??gO,o=new Map,i=async(s,a)=>{if(o.size>=n||a>r)return;let c;try{c=await iO(s,{withFileTypes:!0})}catch{return}for(let l of c){if(o.size>=n)return;let d=gl(s,l.name);if(l.isDirectory()){if(WS.has(l.name)||l.name.startsWith("."))continue;await i(d,a+1);continue}if(l.isFile()&&!(!yl(l.name)||BS.has(l.name)||l.name.startsWith(".")))try{let p=await aO(d),u=zf(uO(t,d));if(!wO(u,p.size))continue;o.set(u,{mtimeMs:p.mtimeMs,size:p.size})}catch{}}};return await i(t,0),o}function yO(t,e){let r=[];for(let[n,o]of e){let i=t.get(n);(!i||o.mtimeMs>i.mtimeMs||o.size!==i.size)&&r.push(n)}return r.sort((n,o)=>n.localeCompare(o,void 0,{numeric:!0,sensitivity:"base"}))}var wl="deliverables";function Yf(t){let e=zf(String(t??"")).replace(/^\.\//,""),r=US(e);return r&&(e=e.slice(0,-r.length)),e.toLowerCase().startsWith(`${wl}/`)&&(e=e.slice(wl.length+1)),e.trim()||zf(String(t??""))}var bO=/(?:세트|set)\s*[::]?\s*["'“„«『「]([^"'“”„»』」\n]{1,80})["'”„»』」]/i;function Xf(t){return(bO.exec(String(t?.goal??""))?.[1]??t?.title??"").trim().slice(0,Nn)}var Ko="PROTOCOL_COWORK_PROJECT",qs="PROTOCOL_COWORK_PROJECT_NAME",Gs="PROTOCOL_COWORK_PLAN",Vs="PROTOCOL_COWORK_AGENT",bl="PROTOCOL_COWORK_SET",vl="PROTOCOL_COWORK_ARTIFACT_LEDGER";async function HS(t,e){let r={};for(let[n,o]of Object.entries(t))r[n]=process.env[n],o===void 0||o===""?delete process.env[n]:process.env[n]=o;try{return await e()}finally{for(let[n,o]of Object.entries(r))o===void 0?delete process.env[n]:process.env[n]=o}}function vO(t){if(!t)return new Set;try{return new Set(lO(t,"utf-8").split(`
|
|
599
|
+
`).map(e=>e.trim()).filter(Boolean))}catch{return new Set}}async function Qf(t,e){if(t)try{await cO(t,`${e}
|
|
600
|
+
`,"utf-8")}catch{}}async function qS(t){if(!nt(t.project?.id))return 0;try{let e=t.after??await Jf(t.root),r=vO(t.ledgerPath),n=t.ledgerPath?Vf(t.ledgerPath):void 0,o=Vf(pO()),i=yO(t.before,e).filter(l=>{let d=Vf(gl(t.root,l));return n&&d===n||dO(d)===o?!1:!r.has(gl(t.root,l))}).slice(0,t.max??hO);if(!i.length)return 0;let s=Xf(t.plan),a=$t(Et(s)),c=0;for(let l of i){let d;try{d=await sO(gl(t.root,l),"utf-8")}catch(u){console.error(`\uC791\uC5C5\uBB3C \uD30C\uC77C\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(${l}):`,u.message);continue}if(!d.trim())continue;let p=xc(l);await Do(t.project,{name:Yf(l),kind:p,content:d,...s?{group:s}:{},...a?{folderPath:a}:{},...t.agentId?{agentId:t.agentId}:{},planId:t.plan.id}),c+=1}return c}catch(e){return console.error("\uC791\uC5C5\uBB3C \uC790\uB3D9 \uB4F1\uB85D \uC911 \uC624\uB958 \u2014 \uC2E4\uD589 \uACB0\uACFC \uC790\uCCB4\uB294 \uC774\uBBF8 \uAE30\uB85D\uB410\uC2B5\uB2C8\uB2E4:",e.message),0}}function on(t){return t==="claude"||t==="agy"||t==="codex"||t==="gemini"}function zs(t){return Os(t)}function Ks(t,e,r=t.cwd,n){let o=t.worker_session;if(!(!n||!o?.deviceId||o.deviceId!==n||t.targetDeviceId&&t.targetDeviceId!==n)&&!o.activity?.some(i=>i.type==="failover")&&!(o?.provider!==e||typeof o.externalSessionId!="string")&&(o.providerProfileId??"active-local")===(t.providerProfileId??"active-local")&&!(!["done","failed","stopped"].includes(o.status??"")||!r||!o.cwd||VS(r)!==VS(o.cwd))&&gi(e).resume==="next-turn")return o.externalSessionId.trim()||void 0}var kO=5*6e4,Bn=null;async function EO(t){if(Bn&&Date.now()-Bn.at<kO)return Bn.tier;let e=t??new K;if(!e.getSession()?.user?.id)return Bn={at:Date.now(),tier:null},null;try{let n=await new ve(e).request("/api/account-state");if(!n.ok)return console.error(`\uAD6C\uB3C5 \uD2F0\uC5B4 \uD655\uC778 \uBD88\uAC00 \u2014 account-state HTTP ${n.status}. \uC2E4\uD589\uC740 \uACC4\uC18D\uD569\uB2C8\uB2E4.`),Bn={at:Date.now(),tier:null},null;let i=(await n.json()).subscription??{},s=typeof i.tier=="string"&&i.tier?i.tier:"free";return Bn={at:Date.now(),tier:s},s}catch(n){return console.error("\uAD6C\uB3C5 \uD2F0\uC5B4 \uD655\uC778 \uC2E4\uD328 \u2014 \uC2E4\uD589\uC744 \uACC4\uC18D\uD569\uB2C8\uB2E4:",n.message),Bn={at:Date.now(),tier:null},null}}function JS(t){let e=t.access?.repo;return!e||e==="write"?null:`\uC678\uBD80 \uC2E4\uD589 \uB450\uB1CC '${t.brain}' \uB294 \uBCC4\uB3C4 \uD504\uB85C\uC138\uC2A4\uB85C \uB3CC\uC544 \uC774 \uD50C\uB79C\uC758 \uC800\uC7A5\uC18C \uC811\uADFC \uC81C\uD55C('${e}')\uC744 \uAC15\uC81C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC2E4\uD589\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC11C\uBC84 \uB450\uB1CC\uB97C \uC4F0\uAC70\uB098 \uC811\uADFC \uBC94\uC704\uB97C write\uB85C \uBC14\uAFD4 \uC8FC\uC138\uC694. / External brain '${t.brain}' runs as a separate process and can't enforce this plan's repo access restriction ('${e}') \u2014 refused. Use the server brain, or set repo access to write.`}async function mr(t,e,r){if(await EO(e)==="free")return{ok:!1,reason:"cowork \uC2E4\uD589\uC740 \uC720\uB8CC \uD50C\uB79C\uC5D0\uC11C\uB9CC \uAC00\uB2A5\uD569\uB2C8\uB2E4 (\uD604\uC7AC Free). / cowork execution requires a paid plan (currently Free)."};let o=zs(t);if(!o)return{ok:!1,reason:`\uC54C \uC218 \uC5C6\uB294 \uC2E4\uD589 \uB450\uB1CC '${t}' \uC785\uB2C8\uB2E4. / Unknown execution brain '${t}'.`};if(!await yf(o))return{ok:!1,reason:`\uC774 \uAE30\uAE30\uC5D0 ${o.binary} \uAC00 \uC124\uCE58\uB3FC \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (\uC2E4\uD589 \uB450\uB1CC '${t}'). / ${o.binary} is not installed on this device (execution brain '${t}').`};let i;try{i=ds(t,r)}catch(a){return{ok:!1,reason:`${a.message} / Provider profile is not usable.`}}let s;try{s=await wf(o,i)}catch{return{ok:!1,reason:"Selected account readiness check failed. Reconnect and retry on the selected execution device."}}return s.state==="unverified"&&/timed out|terminated/i.test(s.detail)?{ok:!1,accountStatus:s,reason:"Selected account check timed out. Retry the check on this device; no other account was used."}:s.state==="action_required"?{ok:!1,accountStatus:s,reason:o.provider==="codex"?"\uC120\uD0DD\uD55C \uC2E4\uD589 \uD638\uC2A4\uD2B8\uC640 \uACC4\uC815\uC5D0\uC11C Codex \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uD734\uB300\uD3F0\uC774\uB098 \uB85C\uCEEC \uBE0C\uB77C\uC6B0\uC800\uC758 \uB85C\uADF8\uC778\uB9CC\uC73C\uB85C \uC2E4\uD589\uAE30\uAC00 \uC900\uBE44\uB418\uC5C8\uB2E4\uACE0 \uBCFC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC6D0\uACA9/\uD5E4\uB4DC\uB9AC\uC2A4 \uD658\uACBD\uC5D0\uC11C\uB294 \uBA3C\uC800 ChatGPT \uBCF4\uC548(Security) \uC124\uC815\uC5D0\uC11C \uAE30\uAE30 \uCF54\uB4DC \uC778\uC99D\uC744 \uD65C\uC131\uD654\uD55C \uB4A4, \uC120\uD0DD\uD55C \uC2E4\uD589 \uD638\uC2A4\uD2B8\uC640 \uACC4\uC815\uC5D0\uC11C codex login --device-auth \uB97C \uC2E4\uD589\uD558\uC138\uC694. \uC77C\uBC18 codex login \uC740 \uC2E4\uD589 \uBA38\uC2E0\uC758 localhost \uB85C \uB3CC\uC544\uC624\uBBC0\uB85C, \uADF8 URL\uC744 \uD734\uB300\uD3F0\uC5D0 \uACF5\uC720\uD558\uB294 \uAC83\uB9CC\uC73C\uB85C\uB294 \uB85C\uADF8\uC778\uC774 \uC644\uB8CC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. / Codex authentication is required on the selected execution host/account. Signing in on a phone or local browser does not prove the runner is ready. For remote/headless use, first enable device-code authentication in ChatGPT Security settings, then run codex login --device-auth on the selected execution host/account. Regular codex login returns to localhost on the execution machine; sharing that URL with a phone alone does not complete login.":`${o.accountLabel} \uACC4\uC815 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4: ${s.actionHint}. / ${o.accountLabel} account action required: ${s.actionHint}.`}:{ok:!0,accountStatus:s}}var zS=4e3;function KS(t){return String(t??"").replace(/[^A-Za-z0-9_-]/g,"_").slice(0,64)||"unknown"}function YS(t){return t.length>zS?`${t.slice(0,zS)}
|
|
601
|
+
\u2026 (\uCD9C\uB825\uC774 \uC798\uB838\uC2B5\uB2C8\uB2E4 / output truncated)`:t}function PO(){return["\uC0B0\uCD9C\uBB3C \uC778\uACC4 (\uC774\uAC78 \uC548 \uD558\uBA74 \uACB0\uACFC\uBB3C\uC774 \uC0AC\uC6A9\uC790 \uAC80\uD1A0\uD568\uC5D0 \uB728\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4):",`- \uC644\uC131\uD55C \uC0B0\uCD9C\uBB3C\uC740 \`./${wl}/\` \uC544\uB798\uC5D0 \uD30C\uC77C\uB85C \uC4F0\uC138\uC694 (.md \xB7 .html \xB7 .txt).`," \uC774 \uB2E8\uACC4\uAC00 \uB05D\uB098\uBA74 \uADF8 \uD30C\uC77C\uB4E4\uC774 \uC790\uB3D9\uC73C\uB85C \uC791\uC5C5\uBB3C\uD568\uC5D0 \uB4F1\uB85D\uB429\uB2C8\uB2E4.","- \uB2E4\uB978 \uC704\uCE58\uC5D0 \uB9CC\uB4E4\uC5C8\uAC70\uB098 \uC774\uB984\uC744 \uC9C1\uC811 \uC815\uD558\uACE0 \uC2F6\uC73C\uBA74 \uD30C\uC77C\uB9C8\uB2E4 \uB2E4\uC74C\uC744 \uC2E4\uD589\uD558\uC138\uC694:",' protocol artifact submit <\uD30C\uC77C\uACBD\uB85C> [--name "\uC774\uB984"] [--set "\uC138\uD2B8"]',"- \uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\xB7PDF \uB3C4 \uAC19\uC740 \uCEE4\uB9E8\uB4DC\uB85C \uC81C\uCD9C\uD569\uB2C8\uB2E4(\uC6B0\uB9AC \uC2A4\uD1A0\uB9AC\uC9C0\uB85C \uC62C\uB77C\uAC11\uB2C8\uB2E4).","- \uACBD\uB85C\uB9CC \uC54C\uB824 \uC8FC\uACE0 \uB05D\uB0B4\uC9C0 \uB9C8\uC138\uC694 \u2014 \uC774 \uAE30\uAE30\uB294 \uC5B8\uC81C\uB4E0 \uAEBC\uC9C0\uB294 \uC791\uC5C5\uB300\uB77C \uD30C\uC77C \uACBD\uB85C\uB294 \uBCF4\uAD00\uBCF8\uC774 \uC544\uB2D9\uB2C8\uB2E4."].join(`
|
|
602
|
+
`)}function AO(t,e,r,n="",o={}){let i=Ro(e.scope,r),s=["\uB2E4\uC74C \uC791\uC5C5\uC744 \uD604\uC7AC \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC218\uD589\uD558\uC138\uC694. \uC774 \uB2E8\uACC4\uC5D0 \uD544\uC694\uD55C \uBCC0\uACBD\uB9CC \uD558\uC138\uC694.",""];n&&s.push(n,""),o.artifactsBlock&&s.push(o.artifactsBlock,""),Sc(t.project?.id)&&s.push(Oo,""),nt(t.project?.id)&&s.push(PO(),"");let a=Vo(t.projectInstructions);return a&&s.push(a,""),s.push(`\uAE30\uD68D: ${t.title}`),t.goal&&s.push(`\uBAA9\uD45C: ${t.goal}`),s.push(`\uB2E8\uACC4: ${e.title}`),e.detail&&s.push(`\uC0C1\uC138: ${e.detail}`),s.push("","\uC0AC\uC6A9\uC790\uAC00 \uC2B9\uC778\uD55C \uBC94\uC704(\uC774 \uBC16\uC758 \uC791\uC5C5\uC740 \uD558\uC9C0 \uB9D0\uACE0 \uBB34\uC5C7\uC774 \uC65C \uD544\uC694\uD55C\uC9C0 \uC124\uBA85\uD558\uACE0 \uC911\uB2E8\uD558\uC138\uC694):",`- \uC2E4\uD589 \uAC00\uB2A5\uD55C \uC178 \uBA85\uB839: ${i.commands.length?i.commands.map(c=>`\`${c}\``).join(", "):"\uC5C6\uC74C"}`,`- \uC4F0\uAE30 \uAC00\uB2A5\uD55C \uACBD\uB85C: ${i.paths.join(", ")}`),s.join(`
|
|
603
|
+
`)}async function Sl(t,e,r,n,o,i,s,a,c,l){if(c?.aborted)return{ok:!1,output:"Runner stopped before provider execution.",failureKind:"permanent"};let d=[],p=t.run(e,{cwd:r,resumeSessionId:i,env:s,onSessionId:a,onProcess:l,onText:f=>{d.push(f),n?.(f)}}),u=()=>p.kill();c?.addEventListener("abort",u,{once:!0}),c?.aborted&&u();try{o?.(p);let f=await p.done,m=f.ok&&!c?.aborted,h=d.join(`
|
|
604
|
+
`).trim();return{ok:m,output:h,sessionId:f.sessionId,...m?{}:{failureKind:c?.aborted?"permanent":FS(h)}}}finally{c?.removeEventListener("abort",u)}}async function xl(t,e,r){let n;try{n=ds(e,r)}catch{throw new Error("Selected provider profile is unavailable. Reconnect it or explicitly reselect; no other account was used.")}let o;try{o=await wf(t,n)}catch{throw new Error("Selected account readiness check failed. Reconnect the selected account before retrying.")}if(o.state==="unverified"&&/timed out|terminated/i.test(o.detail))throw new Error("Selected account check timed out. Retry the check on this device; no other account was used.");if(o.state==="action_required")throw new Error("Selected provider authentication requires attention. Sign in on the selected execution device/profile and retry; no other account was used.");return n}function XS(t,e,r,n,o,i){return t.brain&&t.brain!==e||t.targetDeviceId&&t.targetDeviceId!==n?"Selected provider or device does not match this execution. Review the selection before retrying.":o&&(!n||!i||!zc(i,Vc(t,e,n,r,i.ownerKey)))?"Provider resume identity is missing or changed. Review the selected provider/device/profile before retrying.":null}async function QS(t){let{store:e,plan:r,step:n,brain:o}=t,i=t.cwd??process.cwd(),s=zs(o);if(!s){let v=`\uC54C \uC218 \uC5C6\uB294 \uC2E4\uD589 \uB450\uB1CC '${o}' \uC785\uB2C8\uB2E4. / Unknown execution brain '${o}'.`;return await e.recordResult(r.id,n.id,!1,v),{success:!1,error:v}}let a=XS(r,o,i,t.deviceId,t.resumeSessionId,t.resumeIdentity)??JS(r);if(a)return await e.recordResult(r.id,n.id,!1,a),{success:!1,error:a};t.skipStart||await e.startStep(r.id,n.id);let c=r.agentId,l=!!nt(r.project?.id),d=Date.now(),p=null,u;if(l){p=await Jf(i).catch(()=>null);let v=xO(GS(SO(),`protocol-cowork-${KS(r.id)}-${KS(n.id)}-`));u=GS(v,"submitted.txt")}let f=!1,m="",h,w;try{let v=await cl(r.project),C=await kc(r.project),I=AO(r,n,i,v,{artifactsBlock:C}),N=await xl(s,o,r.providerProfileId),G=await t.validateSelection?.();if(G)throw new Error(G);let $=await HS({[Ko]:l?r.project?.id:void 0,[qs]:l?r.project?.name:void 0,[Gs]:l?r.id:void 0,[Vs]:l?c:void 0,[bl]:l?Xf(r):void 0,[vl]:u},()=>Sl(s,I,i,t.onText,j=>t.onKill?.(j.kill),t.resumeSessionId??Ks(r,o,i,t.deviceId),N,t.onSessionId,t.signal,t.onProcess));f=$.ok,m=$.output,h=$.sessionId,w=$.failureKind}catch(v){let C=v.message;return t.deferResult||await e.recordResult(r.id,n.id,!1,`[${o}] \uC2E4\uD589 \uC2E4\uD328 / execution failed: ${C}`),{success:!1,error:C,output:C,failureKind:"permanent"}}let b=Hs();!t.deferResult&&b.length&&await e.recordChange(r.id,n.id,b);let k=YS(m||(f?"(\uCD9C\uB825 \uC5C6\uC74C / no output)":"(\uCD9C\uB825 \uC5C6\uC74C \xB7 \uC2E4\uD328 / no output \xB7 failed)"));return t.deferResult||await e.recordResult(r.id,n.id,f,`[${o}] ${k}`),(f||!t.deferResult)&&await Ws(r.project,{at:new Date().toISOString(),kind:"code",brain:o,text:`${n.title} \u2014 ${f?"\uC644\uB8CC":"\uC2E4\uD328"}: ${Us(m)}`}),f&&p&&(await dl(r.project,{sinceMs:d,root:i,agentId:c,planId:r.id,stepTitle:n.title}),await qS({project:r.project,plan:r,root:i,before:p,agentId:c,ledgerPath:u})),f?{success:!0,output:k,sessionId:h}:{success:!1,error:`${o} \uC2E4\uD589 \uC2E4\uD328 / ${o} run failed`,output:k,sessionId:h,failureKind:w}}async function ZS(t){let{store:e,plan:r,brain:n,cwd:o}=t,i=Date.now(),s=zs(n);if(!s)return await e.finishCommand(r.id,"failed",{output:`\uC54C \uC218 \uC5C6\uB294 \uC2E4\uD589 \uB450\uB1CC '${n}' \uC785\uB2C8\uB2E4. / Unknown execution brain '${n}'.`,exitCode:null,durationMs:0}),{success:!1};let a=XS(r,n,o,t.deviceId,t.resumeSessionId,t.resumeIdentity)??JS(r);if(a)return await e.finishCommand(r.id,"failed",{output:a,exitCode:null,durationMs:0}),{success:!1};t.skipStart||await e.startCommand(r.id);try{let c=await xl(s,n,r.providerProfileId),l=await t.validateSelection?.();if(l)throw new Error(l);let{ok:d,output:p,sessionId:u,failureKind:f}=await Sl(s,r.command??"",o,t.onText,h=>t.onKill?.(h.kill),t.resumeSessionId??Ks(r,n,o,t.deviceId),c,t.onSessionId,t.signal,t.onProcess),m=YS(`[${n}] ${p||"(\uCD9C\uB825 \uC5C6\uC74C / no output)"}`);return t.deferFinish||await e.finishCommand(r.id,d?"done":"failed",{output:m,exitCode:d?0:null,durationMs:Date.now()-i}),{success:d,sessionId:u,output:m,failureKind:f}}catch(c){return t.deferFinish||await e.finishCommand(r.id,"failed",{output:`[${n}] \uC2E4\uD589 \uC2E4\uD328 / execution failed: ${c.message}`,exitCode:null,durationMs:Date.now()-i}).catch(()=>{}),console.error(`byo command ${r.id} threw: ${c.message}`),{success:!1,output:c.message,failureKind:"permanent"}}}Ot();Rn();var CO=`\uB2F9\uC2E0\uC740 \uC5EC\uB7EC \uC6CC\uCEE4\uC5D0\uAC8C \uC791\uC5C5\uC744 \uB098\uB220\uC8FC\uB294 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130\uB2E4.
|
|
605
|
+
\uC8FC\uC5B4\uC9C4 "\uC6CC\uCEE4 \uBAA9\uB85D"\uC758 \uAC01 \uD56D\uBAA9\uC5D0\uC11C workerId \uB97C \uADF8\uB300\uB85C \uC0AC\uC6A9\uD574, \uC804\uCCB4 \uC784\uBB34\uB97C \uC6CC\uCEE4\uBCC4 \uD558\uC704 \uC784\uBB34\uB85C \uB098\uB220\uB77C.
|
|
606
|
+
\uBAA8\uB4E0 \uC6CC\uCEE4\uC5D0\uAC8C \uBC18\uB4DC\uC2DC \uC77C\uC744 \uBC30\uC815\uD560 \uD544\uC694\uB294 \uC5C6\uB2E4 \u2014 \uC774 \uC784\uBB34\uC5D0 \uB9DE\uB294 \uC6CC\uCEE4\uC5D0\uAC8C\uB9CC \uBC30\uC815\uD558\uB77C.
|
|
607
|
+
\uBC18\uB4DC\uC2DC JSON \uBC30\uC5F4\uB85C\uB9CC \uB2F5\uD558\uB77C. \uB2E4\uB978 \uD14D\uC2A4\uD2B8/\uC124\uBA85/\uCF54\uB4DC\uD39C\uC2A4 \uAE08\uC9C0.
|
|
608
|
+
\uD615\uC2DD: [{"workerId":"\uBAA9\uB85D\uC5D0 \uC788\uB294 id \uADF8\uB300\uB85C","goal":"\uC774 \uC6CC\uCEE4\uAC00 \uD560 \uAD6C\uCCB4\uC801\uC778 \uD558\uC704 \uC784\uBB34"}]
|
|
609
|
+
|
|
610
|
+
\uAC01 \uC6CC\uCEE4\uC758 goal \uC744 \uC801\uC744 \uB54C, \uADF8 \uC6CC\uCEE4\uAC00 \uB9CC\uB4E4 \uC0B0\uCD9C\uBB3C\uC774 \uB2E4\uC74C \uADDC\uC57D\uC744 \uC9C0\uCF1C\uC57C \uD55C\uB2E4\uB294 \uAC83\uC744 \uAC10\uC548\uD574\uC11C \uC368\uB77C:
|
|
611
|
+
${Oo}`,_O=["\uC124\uACC4","\uBD84\uC11D","\uC804\uB7B5","\uC544\uD0A4\uD14D\uCC98","\uB9AC\uD329\uD1A0\uB9C1","architecture","refactor","strategy","analy","design"],TO=600;function RO(t,e){let r=String(t??"");if(e==="dispatch")return{mode:"think",reason:"auto:dispatch"};if(r.length>TO)return{mode:"think",reason:`auto:long:${r.length}`};let n=_O.find(o=>r.includes(o));return n?{mode:"think",reason:`auto:keyword:${n}`}:e==="code"?{mode:"think",reason:"auto:code"}:{mode:"fast",reason:"auto:default"}}var IO=2e3;function $O(t,e,r){let n=t.workers.map(s=>`- ${s.id}: ${s.name} (${s.kind})`).join(`
|
|
612
|
+
`),o=[CO,"",`\uC6CC\uCEE4 \uBAA9\uB85D:
|
|
613
|
+
${n}`,"",`\uC784\uBB34:
|
|
614
|
+
${t.mission}`],i=Vo(r);return i&&o.push("",i),e==="none"?o.push("","\u26A0 \uC774 \uBD84\uBC30\uB294 \uC800\uC7A5\uC18C \uC811\uADFC\uC774 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uD30C\uC77C\uC744 \uC77D\uC9C0 \uB9D0\uACE0 \uC704 \uC815\uBCF4\uB9CC\uC73C\uB85C \uB098\uB204\uC138\uC694."):e==="read"&&o.push("","\u26A0 \uC774 \uBD84\uBC30\uB294 \uC800\uC7A5\uC18C \uC77D\uAE30 \uC804\uC6A9\uC785\uB2C8\uB2E4 \u2014 \uD30C\uC77C\uC744 \uACE0\uCE58\uC9C0 \uB9D0\uACE0 \uB098\uB204\uAE30\uB9CC \uD558\uC138\uC694."),o.join(`
|
|
615
|
+
`)}function OO(t,e){let r=new Map(e.workers.map(a=>[a.id,a])),n=String(t??"").match(/\[[\s\S]*\]/);if(!n)return{ok:!1,error:"\uBD84\uBC30 \uC751\uB2F5\uC5D0\uC11C JSON \uBC30\uC5F4\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4."};let o;try{o=JSON.parse(n[0])}catch(a){return{ok:!1,error:`\uBD84\uBC30 \uC751\uB2F5 JSON \uD30C\uC2F1 \uC2E4\uD328: ${a.message}`}}if(!Array.isArray(o))return{ok:!1,error:"\uBD84\uBC30 \uC751\uB2F5\uC774 JSON \uBC30\uC5F4\uC774 \uC544\uB2D9\uB2C8\uB2E4."};if(o.length===0)return{ok:!1,error:"\uBD84\uBC30 \uC751\uB2F5\uC5D0 \uBC30\uC815\uC774 \uD558\uB098\uB3C4 \uC5C6\uC2B5\uB2C8\uB2E4."};let i=new Set,s=[];for(let a of o){let c=String(a?.workerId??"").trim(),l=String(a?.goal??"").trim().slice(0,IO);if(!c)return{ok:!1,error:"workerId \uAC00 \uBE48 \uBC30\uC815\uC774 \uC788\uC2B5\uB2C8\uB2E4."};if(c===e.orchestratorAgentId)return{ok:!1,error:`\uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130 \uC790\uC2E0(${c})\uC5D0\uAC8C\uB294 \uBD84\uBC30\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`};let d=r.get(c);if(!d)return{ok:!1,error:`\uC6CC\uCEE4 \uBA85\uB2E8\uC5D0 \uC5C6\uB294 \uB300\uC0C1\uC785\uB2C8\uB2E4: ${c}`};if(i.has(c))return{ok:!1,error:`\uAC19\uC740 \uC6CC\uCEE4\uC5D0 \uB450 \uBC88 \uBC30\uC815\uB410\uC2B5\uB2C8\uB2E4: ${c}`};if(!l)return{ok:!1,error:`\uD558\uC704 \uC784\uBB34\uAC00 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4: ${c}`};if(d.kind!=="code")return{ok:!1,error:`\uCF54\uB4DC \uC6CC\uCEE4\uAC00 \uC544\uB2D9\uB2C8\uB2E4: ${c}`};if(!d.cwd)return{ok:!1,error:`\uC791\uC5C5 \uD3F4\uB354\uAC00 \uC9C0\uC815\uB418\uC9C0 \uC54A\uC740 \uC6CC\uCEE4\uC785\uB2C8\uB2E4: ${c}`};i.add(c),s.push({worker:d,goal:l})}return{ok:!0,items:s}}function MO(t){let e=t;return!e||typeof e!="object"?{ok:!1,error:"\uBD84\uBC30 \uB9E5\uB77D(dispatchContext)\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}:e.orchestratorAgentId?String(e.mission??"").trim()?!Array.isArray(e.workers)||e.workers.length===0?{ok:!1,error:"\uBD84\uBC30\uD560 \uC6CC\uCEE4 \uBA85\uB2E8\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}:e.workers.some(r=>r.id===e.orchestratorAgentId)?{ok:!1,error:"\uC6CC\uCEE4 \uBA85\uB2E8\uC5D0 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130 \uC790\uC2E0\uC774 \uB4E4\uC5B4 \uC788\uC2B5\uB2C8\uB2E4(\uC21C\uD658)."}:{ok:!0,ctx:e}:{ok:!1,error:"\uBD84\uBC30 \uB9E5\uB77D\uC5D0 \uC784\uBB34\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}:{ok:!1,error:"\uBD84\uBC30 \uB9E5\uB77D\uC5D0 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130 id \uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}}function DO(t){return t.length>60?`${t.slice(0,60)}\u2026`:t}function NO(t){let e=t.worker,r=e.engine==="protocol",n=e.providerProfileId!==void 0||e.providerProfileLabel!==void 0,o=mc(e.providerProfileId,e.providerProfileLabel);if(o)throw new Error(o);if(r&&n)throw new Error("provider profile metadata requires an external BYO brain");let i=r&&e.mode==="auto"?RO(t.goal,e.kind):void 0,s=i?i.mode:r&&e.mode&&e.mode!=="auto"?e.mode:void 0;return{title:DO(t.goal),goal:t.goal,project:e.project,cwd:e.cwd,agentId:e.id,...r?{}:{brain:e.engine},...e.targetDeviceId?{targetDeviceId:e.targetDeviceId}:{},...!r&&e.providerProfileId?{providerProfileId:e.providerProfileId}:{},...!r&&e.providerProfileLabel?{providerProfileLabel:e.providerProfileLabel}:{},...e.autoApprove?{autoApprove:!0}:{},...s?{mode:s}:{},...i?{modeReason:i.reason}:{},...e.access?{access:e.access}:{},...e.projectInstructions?{projectInstructions:e.projectInstructions}:{}}}var ex=4e3,tx=t=>t.length>ex?`${t.slice(0,ex)}
|
|
616
|
+
\u2026 (\uCD9C\uB825\uC774 \uC798\uB838\uC2B5\uB2C8\uB2E4 / output truncated)`:t;async function Hn(t,e,r){return await t.note(e,`\u26D4 \uBD84\uBC30 \uC2E4\uD328: ${r}`).catch(()=>{}),await t.updatePlanStatus(e,"failed").catch(()=>{}),{success:!1,error:r}}async function rx(t){let{store:e,plan:r,brain:n,cwd:o}=t,i=MO(r.dispatchContext);if(!i.ok)return Hn(e,r.id,i.error);let s=i.ctx,a=zs(n);if(!a)return Hn(e,r.id,`\uC54C \uC218 \uC5C6\uB294 \uC2E4\uD589 \uB450\uB1CC '${n}' \uC785\uB2C8\uB2E4.`);let c="";try{let u=await xl(a,n,r.providerProfileId),f=await t.validateSelection?.();if(f)return Hn(e,r.id,f);let m=await Sl(a,$O(s,r.access?.repo,r.projectInstructions),o,t.onText,void 0,void 0,u);if(c=m.output,!m.ok)return Hn(e,r.id,`[${n}] \uBD84\uD574 \uC2E4\uD589 \uC2E4\uD328: ${tx(c)||"(\uCD9C\uB825 \uC5C6\uC74C)"}`)}catch(u){return Hn(e,r.id,`[${n}] \uBD84\uD574 \uC2E4\uD589 \uC2E4\uD328: ${u.message}`)}let l=OO(c,s);if(!l.ok)return Hn(e,r.id,`${l.error}
|
|
617
|
+
(\uC751\uB2F5: ${tx(c)})`);await e.note(r.id,`\uBD84\uBC30(${n}) \u2014 ${l.items.map(u=>`${u.worker.name}(${u.worker.id}): ${u.goal}`).join(`
|
|
618
|
+
`)}`).catch(()=>{});let d=[],p=[];for(let u of l.items)try{let f=await e.createDispatchedPlan(NO(u),{planId:r.id,orchestratorAgentId:s.orchestratorAgentId});d.push(f)}catch(f){p.push(`${u.worker.id}: ${f.message}`)}return await e.note(r.id,`\uBD84\uBC30 \uC644\uB8CC \u2014 \uC6CC\uCEE4 plan ${d.length}\uAC74 \uC0DD\uC131${p.length?`, ${p.length}\uAC74 \uC2E4\uD328:
|
|
619
|
+
${p.join(`
|
|
620
|
+
`)}`:""}`).catch(()=>{}),p.length>0&&d.length===0?Hn(e,r.id,`\uC6CC\uCEE4 plan \uC0DD\uC131\uC774 \uC804\uBD80 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4:
|
|
621
|
+
${p.join(`
|
|
622
|
+
`)}`):(await e.updatePlanStatus(r.id,p.length>0?"failed":"done").catch(()=>{}),p.length>0?{success:!1,error:`\uC77C\uBD80 \uC6CC\uCEE4 plan \uC0DD\uC131 \uC2E4\uD328: ${p.join(", ")}`}:{success:!0})}ge();ze();import{spawn as LO}from"node:child_process";import{mkdtemp as ox,writeFile as kl,rm as Js}from"node:fs/promises";import{existsSync as ix}from"node:fs";import{tmpdir as sx}from"node:os";import sn from"node:path";Ot();var nx={"9x16":{width:1080,height:1920},"16x9":{width:1920,height:1080}},FO=10,jO=25,El="scripts/video/render-motion.mjs",Zf="scripts/video/render-doc.mjs",eh=30*6e4,Pl=`\uC774 \uD3F4\uB354\uC5D0\uC11C ${El} \uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uC601\uC0C1 \uB80C\uB354\uB294 protocol-mvp \uCCB4\uD06C\uC544\uC6C3\uC5D0\uC11C \uB3CC\uC544\uC57C \uD569\uB2C8\uB2E4. / Could not find ${El} here \u2014 video render must run inside a protocol-mvp checkout.`;function UO(t){if(!t)return"no-job";if(t.motionDocId!==void 0||t.format==="doc")return WO(t);if(!t.sceneArtifactId||typeof t.sceneArtifactId!="string")return"no-scene";if(!t.projectId||typeof t.projectId!="string")return"no-project";if(!t.format||!(t.format in nx))return"bad-format";let e=nx[t.format];if(t.width!==e.width||t.height!==e.height)return"bad-size";let r=Number(t.durationSec);if(!Number.isFinite(r)||r<FO||r>jO)return"bad-duration";let n=Number(t.fps);return!Number.isFinite(n)||n<12||n>60?"bad-fps":!t.outputName||/[\\/]|\.\./.test(t.outputName)?"bad-name":null}function WO(t){if(!t.motionDocId||!/^[A-Za-z0-9_.-]{1,64}$/.test(t.motionDocId))return"no-doc";if(t.mode!=="stills"&&t.mode!=="video")return"bad-mode";if(t.format!=="doc")return"bad-format";if(!t.projectId||typeof t.projectId!="string")return"no-project";let e=Number(t.width),r=Number(t.height);if(!Number.isFinite(e)||!Number.isFinite(r)||e<16||r<16||e>8192||r>8192)return"bad-size";let n=Number(t.durationSec);if(!Number.isFinite(n)||n<=0||n>600)return"bad-duration";let o=Number(t.fps);return!Number.isFinite(o)||o<1||o>120?"bad-fps":t.mode==="stills"&&(!Array.isArray(t.times)||t.times.length===0||t.times.length>400||!t.times.every(i=>Number.isFinite(i)&&i>=0))?"bad-times":!t.outputName||/[\\/]|\.\./.test(t.outputName)?"bad-name":null}async function BO(t,e){let r=await e.request(`/api/cowork-motion?id=${encodeURIComponent(t)}`,{method:"GET"});if(!r.ok)throw new Error(`\uD3B8\uC9D1\uBCF8\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (HTTP ${r.status}).`);let n=await r.json();if(!n.doc||typeof n.doc!="object")throw new Error("\uD3B8\uC9D1\uBCF8 \uC751\uB2F5\uC774 \uBE44\uC5C8\uC2B5\uB2C8\uB2E4.");return{doc:n.doc,version:Number(n.version)||0}}function HO(t){let e=t.split(`
|
|
623
|
+
`).filter(n=>n.startsWith("RESULT ")),r=e[e.length-1];if(!r)return null;try{let n=JSON.parse(r.slice(7));return typeof n.sheet!="string"||!Array.isArray(n.times)?null:{sheet:n.sheet,times:n.times.map(Number),cols:Number(n.cols)||1,cellW:Number(n.cellW)||0,cellH:Number(n.cellH)||0,workDir:typeof n.workDir=="string"?n.workDir:"",sizeBytes:Number(n.sizeBytes)||0}}catch{return null}}async function qO(t,e){let r=await e.request(`/api/user-data/cowork_artifacts/${encodeURIComponent(t)}`);if(r.status===404)throw new Error(`\uC52C \uC791\uC5C5\uBB3C\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (${t}).`);if(!r.ok)throw new Error(`\uC52C \uC791\uC5C5\uBB3C\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (HTTP ${r.status}).`);let{item:n}=await r.json();if(!n)throw new Error(`\uC52C \uC791\uC5C5\uBB3C\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (${t}).`);if(typeof n.content=="string"&&n.content.trim())return n.content;let o=await e.request(`/api/cowork-artifact-body/${encodeURIComponent(t)}`);if(!o.ok)throw new Error(`\uC52C \uC791\uC5C5\uBB3C \uBCF8\uBB38\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (HTTP ${o.status}).`);let i=await o.json(),s=typeof i.content=="string"?i.content:"";if(!s.trim())throw new Error(`\uC52C \uC791\uC5C5\uBB3C\uC758 \uBCF8\uBB38\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${t}).`);return s}function ax(t){let e=t.split(`
|
|
624
|
+
`).filter(n=>n.startsWith("RESULT ")),r=e[e.length-1];if(!r)return null;try{let n=JSON.parse(r.slice(7));return typeof n.mp4!="string"||!n.mp4?null:{mp4:n.mp4,workDir:typeof n.workDir=="string"?n.workDir:"",sizeBytes:Number(n.sizeBytes)||0}}catch{return null}}function cx(t,e,r,n=El,o="--scene"){return new Promise(i=>{let s=LO(process.execPath,[n,o,e,"--job",r],{cwd:t,shell:!1,stdio:["ignore","pipe","pipe"]}),a="",c="",l=!1,d=(u,f)=>(u+f).slice(-64e3);s.stdout?.on("data",u=>{a=d(a,String(u))}),s.stderr?.on("data",u=>{c=d(c,String(u))});let p=setTimeout(()=>{l=!0,s.kill("SIGKILL")},eh);s.on("error",u=>{clearTimeout(p),i({code:null,stdout:a,stderr:c+String(u),timedOut:l})}),s.on("close",u=>{clearTimeout(p),i({code:u,stdout:a,stderr:c,timedOut:l})})})}async function lx(t){let{store:e,plan:r,cwd:n}=t,o=t.log??{info:f=>console.log(f),error:f=>console.error(f)},i=t.config??new K,s=r.renderJob,a=UO(s);if(a||!s)return{success:!1,error:`\uB80C\uB354 \uC7A1 \uBA85\uC138\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (${a}). / Invalid render job spec (${a}).`};if(!i.getSession()?.user?.id)return{success:!1,error:"\uB85C\uADF8\uC778 \uC138\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 protocol login \uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC138\uC694."};let l=new ve(i),d=nt(r.project?.id);if(d!==s.projectId)return{success:!1,error:`\uB80C\uB354 \uC7A1\uC758 \uD504\uB85C\uC81D\uD2B8(${s.projectId})\uAC00 \uD50C\uB79C\uC758 \uD504\uB85C\uC81D\uD2B8(${d??"\uBBF8\uBD84\uB958"})\uC640 \uB2E4\uB985\uB2C8\uB2E4.`};if(s.motionDocId)return GO({store:e,plan:r,cwd:n,job:s,config:i,log:o});if(!ix(sn.join(n,El)))return{success:!1,error:Pl};let p;try{p=await qO(s.sceneArtifactId,l)}catch(f){return{success:!1,error:f.message}}let u=await ox(sn.join(sx(),"protocol-motion-"));try{let f=sn.join(u,"scene.html"),m=sn.join(u,"job.json");await kl(f,p,"utf8"),await kl(m,JSON.stringify(s),"utf8"),o.info(` \uB80C\uB354 \uC2DC\uC791 \u2014 ${s.format} ${s.width}\xD7${s.height} \xB7 ${s.durationSec}s @ ${s.fps}fps`);let h=await cx(n,f,m);if(h.timedOut)return{success:!1,error:`\uB80C\uB354\uAC00 ${Math.round(eh/6e4)}\uBD84\uC744 \uB118\uACA8 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4.`};if(h.code!==0){let k=(h.stderr||h.stdout).trim().split(`
|
|
625
|
+
`).slice(-6).join(`
|
|
626
|
+
`);return{success:!1,error:`\uB80C\uB354 \uC2E4\uD328 (exit ${h.code}):
|
|
627
|
+
${k}`}}let w=ax(h.stdout);if(!w)return{success:!1,error:"\uB80C\uB354 \uACB0\uACFC\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(RESULT \uC904\uC774 \uC5C6\uC2B5\uB2C8\uB2E4)."};o.info(` \u2713 ${(w.sizeBytes/1048576).toFixed(1)}MB \u2014 \uC791\uC5C5\uBB3C\uB85C \uC62C\uB9AC\uB294 \uC911`);let b=await Mr(r.project,w.mp4,{name:s.outputName,caption:s.caption??"",contentType:"video/mp4",planId:r.id,...r.agentId?{agentId:r.agentId}:{}});return b?(await e.note(r.id,`\uC601\uC0C1 \uB80C\uB354 \uC644\uB8CC \u2014 ${(w.sizeBytes/1048576).toFixed(1)}MB`).catch(()=>{}),w.workDir&&await Js(w.workDir,{recursive:!0,force:!0}).catch(()=>{}),{success:!0,artifactId:b}):{success:!1,error:"\uC601\uC0C1\uC740 \uB9CC\uB4E4\uC5B4\uC84C\uC9C0\uB9CC \uC791\uC5C5\uBB3C \uB4F1\uB85D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4(\uC6A9\uB7C9 \uD55C\uB3C4\uC774\uAC70\uB098 \uC11C\uBC84 \uAC70\uC808)."}}catch(f){return{success:!1,error:f.message}}finally{await Js(u,{recursive:!0,force:!0}).catch(()=>{})}}async function GO(t){let{store:e,plan:r,cwd:n,job:o,config:i,log:s}=t,a=new ve(i);if(!ix(sn.join(n,Zf)))return{success:!1,error:`\uC774 \uD3F4\uB354\uC5D0\uC11C ${Zf} \uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 protocol-mvp \uCCB4\uD06C\uC544\uC6C3\uC5D0\uC11C \uB3CC\uC544\uC57C \uD569\uB2C8\uB2E4.`};let c;try{c=await BO(o.motionDocId,a)}catch(d){return{success:!1,error:d.message}}let l=await ox(sn.join(sx(),"protocol-motion-doc-"));try{let d=sn.join(l,"doc.json"),p=sn.join(l,"job.json");await kl(d,JSON.stringify(c.doc),"utf8"),await kl(p,JSON.stringify(o),"utf8"),s.info(` \uD3B8\uC9D1\uBCF8 ${o.motionDocId} v${c.version} \u2014 ${o.mode} ${o.width}\xD7${o.height} \xB7 ${o.durationSec}s`);let u=await cx(n,d,p,Zf,"--doc");if(u.timedOut)return{success:!1,error:`\uB80C\uB354\uAC00 ${Math.round(eh/6e4)}\uBD84\uC744 \uB118\uACA8 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4.`};if(u.code!==0){let w=(u.stderr||u.stdout).trim().split(`
|
|
628
|
+
`).slice(-6).join(`
|
|
629
|
+
`);return{success:!1,error:`\uB80C\uB354 \uC2E4\uD328 (exit ${u.code}):
|
|
630
|
+
${w}`}}if(o.mode==="video"){let w=ax(u.stdout);if(!w)return{success:!1,error:"\uB80C\uB354 \uACB0\uACFC\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(RESULT \uC904\uC774 \uC5C6\uC2B5\uB2C8\uB2E4)."};let b=await Mr(r.project,w.mp4,{name:o.outputName,caption:o.caption??"",contentType:"video/mp4",planId:r.id,...r.agentId?{agentId:r.agentId}:{}});return b?(await e.note(r.id,`\uC601\uC0C1 \uB80C\uB354 \uC644\uB8CC \u2014 ${(w.sizeBytes/1048576).toFixed(1)}MB`).catch(()=>{}),w.workDir&&await Js(w.workDir,{recursive:!0,force:!0}).catch(()=>{}),{success:!0,artifactId:b}):{success:!1,error:"\uC601\uC0C1\uC740 \uB9CC\uB4E4\uC5B4\uC84C\uC9C0\uB9CC \uC791\uC5C5\uBB3C \uB4F1\uB85D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4(\uC6A9\uB7C9 \uD55C\uB3C4\uC774\uAC70\uB098 \uC11C\uBC84 \uAC70\uC808)."}}let f=HO(u.stdout);if(!f)return{success:!1,error:"\uBBF8\uB9AC\uBCF4\uAE30 \uACB0\uACFC\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(RESULT \uC904\uC774 \uC5C6\uC2B5\uB2C8\uB2E4)."};let m=await Mr(r.project,f.sheet,{name:`${o.outputName}.jpg`,caption:o.caption??"",contentType:"image/jpeg",planId:r.id,...r.agentId?{agentId:r.agentId}:{}});if(!m)return{success:!1,error:"\uBBF8\uB9AC\uBCF4\uAE30\uB294 \uB9CC\uB4E4\uC5B4\uC84C\uC9C0\uB9CC \uC791\uC5C5\uBB3C \uB4F1\uB85D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."};let h=await a.request("/api/cowork-motion",{method:"POST",body:JSON.stringify({action:"preview",id:o.motionDocId,preview:{artifactId:m,times:f.times,cols:f.cols,cellW:f.cellW,cellH:f.cellH,docVersion:c.version}})});return h.ok?(await e.note(r.id,`\uBBF8\uB9AC\uBCF4\uAE30 ${f.times.length}\uC7A5 \u2014 \uD3B8\uC9D1\uBCF8 v${c.version}`).catch(()=>{}),f.workDir&&await Js(f.workDir,{recursive:!0,force:!0}).catch(()=>{}),{success:!0,artifactId:m}):{success:!1,error:`\uBBF8\uB9AC\uBCF4\uAE30\uB97C \uBB38\uC11C\uC5D0 \uBD99\uC774\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (HTTP ${h.status}).`,artifactId:m}}catch(d){return{success:!1,error:d.message}}finally{await Js(l,{recursive:!0,force:!0}).catch(()=>{})}}ge();import{spawn as VO}from"node:child_process";import{mkdtemp as zO,writeFile as KO,rm as ux}from"node:fs/promises";import{existsSync as JO}from"node:fs";import{tmpdir as YO}from"node:os";import th from"node:path";Ot();var dx={instagram:["instagram.com","www.instagram.com"],youtube:["youtube.com","www.youtube.com","m.youtube.com","youtu.be","www.youtu.be"],tiktok:["tiktok.com","www.tiktok.com","vm.tiktok.com","m.tiktok.com"]},nh=600,Al="scripts/video/analyze-reference.mjs",XO=20*6e4,Cl=`\uC774 \uD3F4\uB354\uC5D0\uC11C ${Al} \uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uB808\uD37C\uB7F0\uC2A4 \uBD84\uC11D\uC740 protocol-mvp \uCCB4\uD06C\uC544\uC6C3\uC5D0\uC11C \uB3CC\uC544\uC57C \uD569\uB2C8\uB2E4. / Could not find ${Al} here \u2014 reference analysis must run inside a protocol-mvp checkout.`;function QO(t){let e;try{e=new URL(String(t??""))}catch{return null}if(e.protocol!=="https:")return null;let r=e.hostname.toLowerCase();return Object.keys(dx).find(n=>dx[n].includes(r))??null}function ZO(t){if(!t)return"no-job";if(!t.projectId||typeof t.projectId!="string")return"no-project";if(!t.sourceUrl||typeof t.sourceUrl!="string")return"no-url";let e=QO(t.sourceUrl);if(!e)return"bad-url";if(t.platform!==e)return"bad-platform";let r=Number(t.tiles),n=Number(t.cols),o=Number(t.rows);if(!Number.isInteger(r)||r<4||r>24)return"bad-tiles";if(!Number.isInteger(n)||!Number.isInteger(o)||n<1||o<1||n*o!==r)return"bad-grid";let i=Number(t.tileWidth);if(!Number.isInteger(i)||i<240||i>960)return"bad-tile-width";let s=Number(t.maxSourceSec);return!Number.isFinite(s)||s<5||s>nh?"bad-duration":!t.outputName||/[\\/]|\.\./.test(t.outputName)?"bad-name":null}function rh(t){let e={"yt-dlp-missing":"\uC774 \uCEF4\uD4E8\uD130\uC5D0 yt-dlp \uAC00 \uC5C6\uC5B4 \uC601\uC0C1\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. `brew install yt-dlp`(\uB9E5) \uB610\uB294 `pipx install yt-dlp` \uB85C \uC124\uCE58\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / yt-dlp is not installed on this machine. Install it (`brew install yt-dlp` or `pipx install yt-dlp`) and try again.","ffmpeg-missing":"\uC774 \uCEF4\uD4E8\uD130\uC5D0 ffmpeg \uAC00 \uC5C6\uC5B4 \uD504\uB808\uC784\uC744 \uBF51\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. `brew install ffmpeg` \uB85C \uC124\uCE58\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / ffmpeg is not installed on this machine. Install it (`brew install ffmpeg`) and try again.",private:"\uBE44\uACF5\uAC1C(\uB610\uB294 \uB85C\uADF8\uC778\uC774 \uD544\uC694\uD55C) \uC601\uC0C1\uC774\uB77C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uACF5\uAC1C\uB41C \uB9C1\uD06C\uB85C \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / The video is private or requires a login, so it could not be fetched. Try a public link.","region-blocked":"\uC774 \uC9C0\uC5ED\uC5D0\uC11C \uB9C9\uD600 \uC788\uB294 \uC601\uC0C1\uC785\uB2C8\uB2E4. \uB2E4\uB978 \uB9C1\uD06C\uB85C \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / This video is blocked in your region. Try another link.",gone:"\uC601\uC0C1\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC0AD\uC81C\uB410\uAC70\uB098 \uC8FC\uC18C\uAC00 \uBC14\uB010 \uAC83 \uAC19\uC2B5\uB2C8\uB2E4. / The video could not be found \u2014 it looks deleted or moved.",unsupported:"\uC774 \uB9C1\uD06C\uC5D0\uC11C\uB294 \uC601\uC0C1 \uD30C\uC77C\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uAC8C\uC2DC\uBB3C\uC774 \uC544\uB2C8\uB77C \uC601\uC0C1 \uC790\uCCB4\uC758 \uB9C1\uD06C\uC778\uC9C0 \uD655\uC778\uD574 \uC8FC\uC138\uC694. / No video stream was found at that link. Check that it points at the video itself.",drm:"\uBCF4\uD638(DRM)\uB41C \uC601\uC0C1\uC774\uB77C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. / The video is DRM-protected and cannot be fetched.","rate-limited":"\uD50C\uB7AB\uD3FC\uC774 \uC694\uCCAD\uC744 \uC7A0\uC2DC \uC81C\uD55C\uD588\uC2B5\uB2C8\uB2E4. \uBA87 \uBD84 \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / The platform rate-limited us. Try again in a few minutes.",network:"\uB124\uD2B8\uC6CC\uD06C\uAC00 \uB04A\uACA8 \uC601\uC0C1\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uC744 \uD655\uC778\uD558\uACE0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / The download failed on a network error. Check the connection and try again.","too-long":`\uC601\uC0C1\uC774 \uB108\uBB34 \uAE41\uB2C8\uB2E4(${nh}\uCD08 \uC774\uD558\uB9CC \uBD84\uC11D\uD569\uB2C8\uB2E4). \uC9E7\uC740 \uD074\uB9BD\uC73C\uB85C \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694. / The video is too long (we analyze up to ${nh}s). Try a shorter clip.`,"too-short":"\uD504\uB808\uC784\uC744 12\uC7A5 \uBF51\uAE30\uC5D0 \uC601\uC0C1\uC774 \uB108\uBB34 \uC9E7\uC2B5\uB2C8\uB2E4. / The video is too short to sample 12 frames.","frames-failed":"\uC601\uC0C1\uC5D0\uC11C \uD504\uB808\uC784\uC744 \uBF51\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(\uD30C\uC77C\uC774 \uC190\uC0C1\uB410\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4). / Could not extract frames from the video (the file may be damaged).","sheet-failed":"\uD504\uB808\uC784\uC740 \uBF51\uC558\uC9C0\uB9CC \uC2DC\uD2B8\uB97C \uD569\uC131\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. / Frames were extracted but the contact sheet could not be composed.",timeout:"\uC2DC\uAC04\uC774 \uB108\uBB34 \uC624\uB798 \uAC78\uB824 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4. / It took too long and was stopped.","download-failed":"\uC601\uC0C1\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. / The video could not be downloaded."};if(e[t])return e[t];if(t.startsWith("bad-job:")){let r=t.slice(8);return`\uBD84\uC11D \uC7A1 \uBA85\uC138\uAC00 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (${r}). / Invalid analysis job spec (${r}).`}return`\uB808\uD37C\uB7F0\uC2A4 \uBD84\uC11D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (${t}). / Reference analysis failed (${t}).`}function eM(t){let e=t.split(`
|
|
631
|
+
`).filter(n=>n.startsWith("RESULT ")),r=e[e.length-1];if(!r)return null;try{let n=JSON.parse(r.slice(7));return typeof n.sheet!="string"||!n.sheet?null:{sheet:n.sheet,outDir:typeof n.outDir=="string"?n.outDir:"",sizeBytes:Number(n.sizeBytes)||0,durationSec:Number(n.durationSec)||0,title:typeof n.title=="string"?n.title:"",tiles:Number(n.tiles)||0,cols:Number(n.cols)||0,rows:Number(n.rows)||0,...n.styleSpec&&typeof n.styleSpec=="object"?{styleSpec:n.styleSpec}:{}}}catch{return null}}function tM(t){let e=t.split(`
|
|
632
|
+
`).filter(n=>n.startsWith("REASON ")),r=e[e.length-1];return r&&r.slice(7).trim()||null}function rM(t){return` \xB7 src ${Math.round(Number(t.durationSec)||0)}s \xB7 ${t.tiles} frames \xB7 ${t.cols}\xD7${t.rows}`}function nM(t,e,r){return new Promise(n=>{let o=VO(process.execPath,[Al,"--job",e,"--out",r],{cwd:t,shell:!1,stdio:["ignore","pipe","pipe"]}),i="",s="",a=!1,c=(d,p)=>(d+p).slice(-64e3);o.stdout?.on("data",d=>{i=c(i,String(d))}),o.stderr?.on("data",d=>{s=c(s,String(d))});let l=setTimeout(()=>{a=!0,o.kill("SIGKILL")},XO);o.on("error",d=>{clearTimeout(l),n({code:null,stdout:i,stderr:s+String(d),timedOut:a})}),o.on("close",d=>{clearTimeout(l),n({code:d,stdout:i,stderr:s,timedOut:a})})})}async function px(t){let{store:e,plan:r,cwd:n}=t,o=t.log??{info:u=>console.log(u),error:u=>console.error(u)},i=t.config??new K,s=r.referenceJob,a=ZO(s);if(a||!s)return{success:!1,error:rh(`bad-job:${a}`)};if(!i.getSession()?.user?.id)return{success:!1,error:"\uB85C\uADF8\uC778 \uC138\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 protocol login \uC744 \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC138\uC694."};let l=nt(r.project?.id);if(l!==s.projectId)return{success:!1,error:`\uBD84\uC11D \uC7A1\uC758 \uD504\uB85C\uC81D\uD2B8(${s.projectId})\uAC00 \uD50C\uB79C\uC758 \uD504\uB85C\uC81D\uD2B8(${l??"\uBBF8\uBD84\uB958"})\uC640 \uB2E4\uB985\uB2C8\uB2E4.`};if(!JO(th.join(n,Al)))return{success:!1,error:Cl};let d=await zO(th.join(YO(),"protocol-reference-job-")),p="";try{let u=th.join(d,"job.json");await KO(u,JSON.stringify(s),"utf8"),o.info(` \uB808\uD37C\uB7F0\uC2A4 \uBD84\uC11D \uC2DC\uC791 \u2014 ${s.platform} \xB7 \uD504\uB808\uC784 ${s.tiles}\uC7A5 (${s.cols}\xD7${s.rows})`);let f=await nM(n,u,d);if(f.timedOut)return{success:!1,error:rh("timeout")};if(f.code!==0){let w=tM(f.stdout),b=(f.stderr||"").trim().split(`
|
|
633
|
+
`).slice(-4).join(`
|
|
634
|
+
`),k=rh(w??"download-failed");return{success:!1,error:w&&w!=="download-failed"?k:`${k}
|
|
635
|
+
${b}`.trim()}}let m=eM(f.stdout);if(!m)return{success:!1,error:"\uBD84\uC11D \uACB0\uACFC\uB97C \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(RESULT \uC904\uC774 \uC5C6\uC2B5\uB2C8\uB2E4)."};p=m.outDir,o.info(` \u2713 \uC2DC\uD2B8 ${(m.sizeBytes/1048576).toFixed(1)}MB \u2014 \uC791\uC5C5\uBB3C\uB85C \uC62C\uB9AC\uB294 \uC911`);let h=await Mr(r.project,m.sheet,{name:`${s.outputName}.jpg`,caption:`${s.caption??""}${rM(m)}`.trim(),contentType:"image/jpeg",planId:r.id,...r.agentId?{agentId:r.agentId}:{}});return h?(m.styleSpec&&await e.setStyleSpec(r.id,m.styleSpec).catch(()=>{}),await e.note(r.id,`\uB808\uD37C\uB7F0\uC2A4 \uD504\uB808\uC784 \uC2DC\uD2B8 \uC644\uB8CC \u2014 ${m.tiles}\uC7A5${m.durationSec?` \xB7 \uC6D0\uBCF8 ${Math.round(m.durationSec)}\uCD08`:""}${m.title?` \xB7 ${m.title}`:""}`).catch(()=>{}),{success:!0,artifactId:h}):{success:!1,error:"\uC2DC\uD2B8\uB294 \uB9CC\uB4E4\uC5C8\uC9C0\uB9CC \uC791\uC5C5\uBB3C \uB4F1\uB85D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4(\uC6A9\uB7C9 \uD55C\uB3C4\uC774\uAC70\uB098 \uC11C\uBC84 \uAC70\uC808)."}}catch(u){return{success:!1,error:u.message}}finally{await ux(d,{recursive:!0,force:!0}).catch(()=>{}),p&&p!==d&&await ux(p,{recursive:!0,force:!0}).catch(()=>{})}}Ba();lr();Kd();ze();ge();uf();import{randomUUID as cM}from"node:crypto";Lt();import{join as oh}from"path";import Ys from"fs";import oM from"net";import{fileURLToPath as iM}from"url";var _l=()=>oh(Ee(),"attach"),Dr=t=>oh(_l(),`${t}.sock`);function Tl(){let t=_l();return Ys.mkdirSync(t,{recursive:!0,mode:448}),t}function an(t){return(t??"main").trim().replace(/[^A-Za-z0-9._-]/g,"-").replace(/^-+|-+$/g,"")||"main"}function cn(t,e=700){return new Promise(r=>{if(!Ys.existsSync(t))return r(!1);let n=oM.connect(t),o=i=>{if(n.removeAllListeners(),n.destroy(),!i)try{Ys.unlinkSync(t)}catch{}r(i)};n.setTimeout(e,()=>o(!1)),n.once("connect",()=>o(!0)),n.once("error",()=>o(!1))})}async function fx(){let t=[];try{t=Ys.readdirSync(_l()).filter(r=>r.endsWith(".sock"))}catch{return[]}let e=[];for(let r of t)await cn(oh(_l(),r))&&e.push(r.replace(/\.sock$/,""));return e.sort()}function Rl(){let t=process.argv[1];return t&&Ys.existsSync(t)?t:iM(new URL("../index.js",import.meta.url))}Lt();import gr from"node:fs";import{join as Il}from"node:path";import{createHash as sM,randomUUID as aM}from"node:crypto";var Xs=()=>Il(Ee(),"worker-session-outbox-v2"),mx=t=>sM("sha256").update(JSON.stringify(t)).digest("hex"),gx=t=>Il(Xs(),`${mx(t)}.json`);function hx(){let t;try{t=gr.readdirSync(Xs())}catch{return[]}return t.filter(e=>/^[a-f0-9]{64}\.json$/.test(e)).flatMap(e=>{try{let r=JSON.parse(gr.readFileSync(Il(Xs(),e),"utf8"));return r?.owner?.uid&&r.owner.endpoint&&r.session?.runId&&Number.isSafeInteger(r.session.revision)&&`${mx(r)}.json`===e?[r]:[]}catch{return[]}}).sort((e,r)=>e.session.startedAt.localeCompare(r.session.startedAt)||(e.session.revision??0)-(r.session.revision??0))}function wx(t){if(!t.owner?.uid||!t.owner.endpoint||!t.session.runId)throw new Error("Worker owner unavailable");gr.mkdirSync(Xs(),{recursive:!0,mode:448});let e=Il(Xs(),`${aM()}.tmp`),r=gr.openSync(e,"wx",384);try{gr.writeFileSync(r,JSON.stringify(t)),gr.fsyncSync(r)}finally{gr.closeSync(r)}try{gr.linkSync(e,gx(t))}catch(n){if(n.code!=="EEXIST")throw n}finally{gr.unlinkSync(e)}}function $l(t){try{gr.unlinkSync(gx(t))}catch(e){if(e.code!=="ENOENT")throw e}}async function yx(t){let e=0;for(let r of hx())try{await t(r),$l(r),e++}catch{}return{flushed:e,remaining:hx().length}}var bx=50;function lM(t){return`worker-${an(t).replace(/[.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,96)||"session"}`}function Ol(t,e,r,n,o=new Date().toISOString(),i){return{runId:cM(),revision:1,id:lM(t),provider:e,status:"starting",deviceId:r,cwd:n,attachable:!1,accountScope:i&&i!=="active-local"?"profile":"active-local",...i?{providerProfileId:i}:{},startedAt:o,updatedAt:o}}function ln(t,e,r=new Date().toISOString()){return{...t,...e,revision:(t.revision??0)+1,updatedAt:r}}function Ml(t,e,r){let n=new K().resolveCredentials(),o=n.session?{uid:n.session.user.id,endpoint:n.endpoint}:void 0,i=e,s=!1,a,c=Promise.resolve(),l,d=!1,p=u=>(i=u,c=c.catch(()=>{}).then(()=>r({planId:t,session:u,...o?{owner:o}:{}})),c.catch(()=>{}),c);return{start:()=>p(e),markRunning:()=>{s||i.status!=="starting"||p(ln(i,{status:"running"}))},observeProcess:u=>{if(s||(u.type==="spawned"&&(a=u.pid),u.pid!==a))return;let f=u.type==="exited";f&&(a=void 0);let m={type:f?"process_exited":"process_observed",at:u.at},h=(i.activity??[]).filter(w=>w.type!=="process_observed"&&w.type!=="process_exited");p(ln(i,{...!f&&i.status==="starting"?{status:"running"}:{},activity:[...h,m].slice(-bx)}))},markStopping:()=>{s||i.status==="stopping"||p(ln(i,{status:"stopping"}))},clearIdentity:()=>{!s&&i.externalSessionId&&p(ln(i,{externalSessionId:void 0}))},identify:u=>{let f=u.trim();s||!f||i.externalSessionId===f||p(ln(i,{externalSessionId:f}))},appendActivity:u=>{if(s)return;let f=[...i.activity??[],u].slice(-bx);p(ln(i,{activity:f}))},appendOutput:u=>{s||!u||(i=ln(i,{output:mv(i.output,u)}),d=!0,l||(l=setTimeout(()=>{l=void 0,!s&&d&&(d=!1,p(i))},500)))},finish:async(u,f={})=>{if(s)return c;s=!0,l&&clearTimeout(l),l=void 0,d=!1,await p(ln(i,{status:u,...f}))}}}async function vx(t){wx(t),await Sx(t),$l(t)}async function Sx(t){if(!t.owner)throw new Error("Worker owner unavailable");let e=`/api/cli-worker-sessions/${encodeURIComponent(t.planId)}`,r=await Ye().request(e,{method:"PUT",body:JSON.stringify({session:t.session})},t.owner);if(!r.ok){if(r.status===404||r.status===409){let n=await r.json().catch(()=>({}));if(n.error==="WORKER_PLAN_GONE"||n.error==="WORKER_STALE")$l(t);else if(r.status===404)throw new Error("Worker output API unavailable; server upgrade required (404)")}throw new Error(`worker session update failed (${r.status})`)}}function xx(){return yx(Sx)}var uM=t=>{if(!t||typeof t!="object")return!1;let e=t;return e.code==="PLAN_NOT_FOUND"||e.status===404},dM=t=>!!t&&(t.status==="cancelled"||t.status==="deleted"||!!t.deletedAt);async function ih(t,e,r){let n=!1,o=!1,i=null,s,a=l=>{if(i=l,o)try{l()}catch{}},c=async()=>{if(!(n||o)){try{let l=await t.getPlan(e);if(!n&&dM(l)){o=!0;try{i?.()}catch{}return}}catch(l){if(!n&&uM(l)){o=!0;try{i?.()}catch{}return}}!n&&!o&&(s=setTimeout(()=>{c()},500))}};s=setTimeout(()=>{c()},500);try{return{result:await r(a),cancelled:o}}finally{n=!0,s&&clearTimeout(s)}}Ot();Rn();async function kx(t){let e=t.requestedProfileId||"active-local";if(e!=="active-local"&&!t.profiles.some(i=>i.provider===t.provider&&i.id===e)){let i=`Selected ${t.provider} profile '${e}' is unavailable on this runner. Reconnect that profile or explicitly select another account; no other account was used.`;return await t.onEvent?.({type:"attention_required",provider:t.provider,reason:i}),{ok:!1,reason:i}}let r=[e],n=[];for(let i=0;i<r.length;i++){let s=r[i];await t.onEvent?.({type:"profile_attempt",provider:t.provider,profileId:s,attempt:i+1});let a;try{a=await t.check(s==="active-local"?void 0:s)}catch{a={ok:!1,reason:"Selected account readiness could not be checked. Reconnect this profile and retry."}}if(a.ok)return await t.onEvent?.({type:"profile_ready",provider:t.provider,profileId:s,attempt:i+1}),{ok:!0,...s==="active-local"?{}:{profileId:s}};if(n.push(`${s}: ${a.reason}`),await t.onEvent?.({type:"profile_rejected",provider:t.provider,profileId:s,attempt:i+1,reason:a.reason}),!a.accountStatus||a.accountStatus.state!=="action_required")break}let o=`\uC120\uD0DD\uD55C \uACC4\uC815\uC744 \uB2E4\uC2DC \uC5F0\uACB0\uD558\uAC70\uB098 \uB2E4\uB978 \uACC4\uC815\uC744 \uC9C1\uC811 \uC120\uD0DD\uD574 \uC8FC\uC138\uC694. ${n.join(" | ")} / Reconnect the selected ${t.provider} account or explicitly choose another; no other account was used.`;return await t.onEvent?.({type:"attention_required",provider:t.provider,reason:o}),{ok:!1,reason:o}}var _x={info:t=>console.log(t),error:t=>console.error(t)},Ex="cowork";function Tx(t){let e=t.project?.id;return e===Ex||typeof e=="string"&&e.startsWith(Ex+"-")}function mM(t,e){if(!on(t.brain)||!t.providerProfileId||t.providerProfileId==="active-local"||e.some(n=>n.provider===t.brain&&n.id===t.providerProfileId))return null;let r=t.providerProfileLabel?.trim()||t.providerProfileId;return`\uC774 \uAE30\uAE30\uC5D0\uB294 ${t.brain} \uD504\uB85C\uD544 '${r}'\uC774 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. / This device does not have the ${t.brain} profile '${r}' connected.`}function gM(t,e){return t.mode?Oc(t.mode):Tx(t)?Oc("fast"):e}var wM="\uC2E4\uD589 \uD3F4\uB354\uAC00 \uC9C0\uC815\uB418\uC9C0 \uC54A\uC544 \uC2E4\uD589\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4 \u2014 \uC5B4\uB290 \uD3F4\uB354\uC5D0\uC11C \uC791\uC5C5\uD560\uC9C0 \uC571\uC5D0\uC11C \uACE8\uB77C \uC8FC\uC138\uC694. / No working folder was specified, so nothing ran \u2014 choose one in the app.",Px="\uC774 \uAE30\uAE30\uB294 \uC9C1\uC811 \uBA85\uB839 \uC2E4\uD589\uC774 \uAEBC\uC838 \uC788\uC2B5\uB2C8\uB2E4. \uD5C8\uC6A9\uD558\uB824\uBA74 \uB7EC\uB108\uB97C `protocol runner --allow-raw-command` \uB85C \uB2E4\uC2DC \uC2DC\uC791\uD558\uC138\uC694. / Direct shell commands are disabled on this device. Restart the runner with `protocol runner --allow-raw-command` to allow them.",yM="\uC704\uD5D8\uD55C \uBA85\uB839\uC73C\uB85C \uD310\uC815\uB418\uC5B4 \uC2E4\uD589\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4 \u2014 \uC774 \uCC28\uB2E8\uC740 \uC5B4\uB5A4 \uC124\uC815\uC73C\uB85C\uB3C4 \uB04C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. / Refused as a dangerous command \u2014 this block cannot be turned off by any setting.",bM=t=>`\uC800\uC7A5\uC18C \uACBD\uB85C\uAC00 \uB108\uBB34 \uB113\uC2B5\uB2C8\uB2E4: ${t}. \uD504\uB85C\uC81D\uD2B8 \uD3F4\uB354\uB97C \uC9C0\uC815\uD558\uC138\uC694. / Repository path is too broad: ${t}. Specify a project folder.`,vM=6e5,Pt=t=>{if(t)return t==="~"?ah():t.startsWith("~/")?hM(ah(),t.slice(2)):t},Dl=t=>{try{return process.chdir(t),null}catch(e){return e.message}};function SM(t){try{return fM(t).isDirectory()}catch{return!1}}var sh=3,xM=5e3,Rx=t=>Math.min(xM*Math.pow(2,t-1),2e4),Nl=new Map,ch=3,kM=60*6e4,Ll=new Map;function EM(t,e){let r=Ll.get(t),n=r&&r.reason===e?r.count+1:1,o=n>=ch;return Ll.set(t,{count:n,nextAttemptAt:Date.now()+(o?kM:Rx(n)),reason:e}),{count:n,giveUp:o}}function PM(t){let e=Ll.get(t);return e?Math.max(0,e.nextAttemptAt-Date.now()):0}var AM=new Set(["failed","expired"]),Ax=new Set;var Cx=new Set;async function CM(t,e){let r=e.log??_x,n=t;try{let u=await n.flushPendingResults?.();u?.flushed&&r.info(`\u21BB \uC644\uB8CC \uACB0\uACFC ${u.flushed}\uAC74\uC744 \uC11C\uBC84\uC5D0 \uBCF5\uAD6C\uD588\uC2B5\uB2C8\uB2E4.`)}catch(u){r.error(`\uC644\uB8CC \uACB0\uACFC \uBCF5\uAD6C \uC2E4\uD328 \u2014 \uB2E4\uC74C \uD3F4\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4: ${u.message}`)}try{let u=await xx();u.flushed&&r.info(`\u21BB \uC6CC\uCEE4 \uC138\uC158 ${u.flushed}\uAC74\uC744 \uC11C\uBC84\uC5D0 \uBCF5\uAD6C\uD588\uC2B5\uB2C8\uB2E4.`)}catch(u){r.error(`\uC6CC\uCEE4 \uC138\uC158 \uBCF5\uAD6C \uC2E4\uD328 \u2014 \uB2E4\uC74C \uD3F4\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4: ${u.message}`)}try{let u=await(e.flushArtifacts??Xp)();u.flushed&&r.info(`\u21BB \uC791\uC5C5\uBB3C ${u.flushed}\uAC74\uC744 \uC11C\uBC84\uC5D0 \uBCF5\uAD6C\uD588\uC2B5\uB2C8\uB2E4.`)}catch(u){r.error(`\uC791\uC5C5\uBB3C \uBCF5\uAD6C \uC2E4\uD328 \u2014 \uB2E4\uC74C \uD3F4\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4: ${u.message}`)}try{let u=await(e.flushArtifactFiles??AS)();u.flushed&&r.info(`\u21BB \uD30C\uC77C \uC791\uC5C5\uBB3C ${u.flushed}\uAC74\uC744 \uC11C\uBC84\uC5D0 \uBCF5\uAD6C\uD588\uC2B5\uB2C8\uB2E4.`)}catch(u){r.error(`\uD30C\uC77C \uC791\uC5C5\uBB3C \uBCF5\uAD6C \uC2E4\uD328 \u2014 \uB2E4\uC74C \uD3F4\uC5D0\uC11C \uB2E4\uC2DC \uC2DC\uB3C4\uD569\uB2C8\uB2E4: ${u.message}`)}let o=async u=>{try{await e.onWorkerSession?.(u),d.set(u.planId,u.session.runId)}catch(f){throw r.error("Worker session persistence unavailable."),f}},i=!1,s=process.cwd(),a=()=>{try{let{session:u,endpoint:f}=new K().resolveCredentials();return Yv(u?{uid:u.user.id,endpoint:f}:void 0)}catch{return}},c=a(),l=await t.listPlans(),d=new Map(l.map(u=>[u.id,u.worker_session?.runId])),p=e.providerProfiles??us();for(let u of l){if(e.signal?.aborted)break;let f=u.worker_session,m=u.targetDeviceId||(on(u.brain)?f?.deviceId:void 0);if(m&&m!==e.myDeviceId||!m&&!e.globalRun)continue;if(on(u.brain)&&(!c||a()!==c)){r.error("Protocol account or server changed/unavailable. Restore the selected account and refresh before executing.");continue}let h=on(u.brain)?Vc(u,u.brain,e.myDeviceId,Pt(u.cwd)||process.cwd(),c):null,w=async()=>{if(!h)return null;try{let k=()=>a()!==c;if(k())return"Protocol account or server changed. Restore the original account before retrying; no provider was started.";let v=await t.getPlan(u.id);return k()?"Protocol account or server changed. Restore the original account before retrying; no provider was started.":!v||v.deletedAt||["cancelled","deleted","done","failed","completed","expired"].includes(v.status)?"Task stopped or unavailable; no provider was started.":xf(h,v)}catch{return"Execution selection could not be refreshed. Reconnect and retry; no provider was started."}},b=mM(u,p);if(b){m===e.myDeviceId&&(r.error(`\u26D4 ${u.title}: ${b}`),u.kind==="command"?await t.finishCommand(u.id,"failed",{output:b,exitCode:null,durationMs:0}).catch(()=>{}):(await t.note(u.id,b).catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{})));continue}if(u.status!=="cancelled"&&!(u.deletedAt||u.status==="deleted")&&!AM.has(u.status)&&!(PM(u.id)>0)&&u.planKind!=="content"){if(u.cwd){let k=Pt(u.cwd);if(jw(k,ah())){let v=bM(k);r.error(`\u26D4 ${u.title}: ${v}`),u.kind==="command"?await t.finishCommand(u.id,"failed",{output:v,exitCode:null,durationMs:0}).catch(C=>r.error(` \uACB0\uACFC \uAE30\uB85D \uC2E4\uD328: ${C.message}`)):u.status!=="failed"&&(await t.updatePlanStatus(u.id,"failed").catch(()=>{}),await t.note(u.id,v).catch(()=>{}));continue}}if(u.cwd){let k=Pt(u.cwd);if(!SM(k)){Ax.has(u.id)||(Ax.add(u.id),r.info(`\u21B7 ${u.title}: \uC791\uC5C5 \uD3F4\uB354 ${k} \uAC00 \uC774 \uAE30\uAE30\uC5D0 \uC5C6\uC5B4 \uB118\uAE41\uB2C8\uB2E4(\uB2E4\uB978 \uAE30\uAE30 \uBAAB). / skipped \u2014 working folder is not on this device.`));continue}}if(u.planKind==="dispatch"){if(u.status!=="requested")continue;i=!0;let k=on(u.brain)?u.brain:null;if(!k){let C=`\uBD84\uBC30 \uD50C\uB79C\uC5D0 \uC678\uBD80 \uC2E4\uD589 \uB450\uB1CC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4(brain='${u.brain??"server"}'). / Dispatch plan has no external brain.`;r.error(`\u26D4 ${u.title}: ${C}`),await t.note(u.id,C).catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{});continue}let v=u.providerProfileId?await(e.checkCoworkGate??mr)(k,void 0,u.providerProfileId):await(e.checkCoworkGate??mr)(k);if(!v.ok){r.error(`\u26D4 ${u.title}: ${v.reason}`),await t.note(u.id,v.reason).catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{});continue}if(!await t.claimPlan(u.id,e.myDeviceId))continue;if(Cx.has(u.id)){let C="\uC774\uBBF8 \uBD84\uD574\uB97C \uC2E4\uD589\uD588\uC73C\uB098 \uC0C1\uD0DC \uAE30\uB85D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uB450\uB1CC\uB97C \uB2E4\uC2DC \uD0DC\uC6B0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. / Decomposition already ran; only the status write failed \u2014 not re-running the brain.";r.error(`\u26D4 ${u.title}: ${C}`),await t.note(u.id,C).catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{}),await t.releasePlan(u.id,e.myDeviceId).catch(()=>{});continue}Cx.add(u.id);try{e.onActive?.(u.title),r.info(`\u25B6 [${k}] \uBD84\uBC30: ${u.title} (${u.id})`);let C=await rx({store:t,plan:u,brain:k,cwd:Pt(u.cwd)||process.cwd(),validateSelection:w});r.info(C.success?" \u2713 \uBD84\uBC30 \uC644\uB8CC":` \u2717 ${C.error}`)}catch(C){r.error(` \u2717 \uBD84\uBC30 ${u.id} threw: ${C.message}`)}finally{await t.releasePlan(u.id,e.myDeviceId).catch(()=>{})}continue}if(u.planKind==="render"){if(u.status!=="requested")continue;if(!u.cwd){r.error(`\u26D4 ${u.title}: ${Pl}`),await t.updatePlanStatus(u.id,"failed").catch(()=>{}),await t.note(u.id,Pl).catch(()=>{});continue}if(i=!0,!await t.claimPlan(u.id,e.myDeviceId))continue;try{e.onActive?.(u.title),r.info(`\u25B6 \uC601\uC0C1 \uB80C\uB354: ${u.title} (${u.id})`);let k=await lx({store:t,plan:u,cwd:Pt(u.cwd),log:r});k.success?(r.info(" \u2713 \uB80C\uB354 \uC644\uB8CC"),await t.updatePlanStatus(u.id,"done").catch(()=>{})):(r.error(` \u2717 ${k.error}`),await t.note(u.id,k.error??"\uB80C\uB354 \uC2E4\uD328").catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{}))}catch(k){r.error(` \u2717 \uB80C\uB354 ${u.id} threw: ${k.message}`),await t.updatePlanStatus(u.id,"failed").catch(()=>{})}finally{e.onActive?.(null),await t.releasePlan(u.id,e.myDeviceId).catch(()=>{})}continue}if(u.planKind==="reference-analyze"){if(u.status!=="requested")continue;if(!u.cwd){r.error(`\u26D4 ${u.title}: ${Cl}`),await t.updatePlanStatus(u.id,"failed").catch(()=>{}),await t.note(u.id,Cl).catch(()=>{});continue}if(i=!0,!await t.claimPlan(u.id,e.myDeviceId))continue;try{e.onActive?.(u.title),r.info(`\u25B6 \uB808\uD37C\uB7F0\uC2A4 \uBD84\uC11D: ${u.title} (${u.id})`);let k=await px({store:t,plan:u,cwd:Pt(u.cwd),log:r});k.success?(r.info(" \u2713 \uD504\uB808\uC784 \uC2DC\uD2B8 \uC644\uB8CC"),await t.updatePlanStatus(u.id,"done").catch(()=>{})):(r.error(` \u2717 ${k.error}`),await t.note(u.id,k.error??"\uB808\uD37C\uB7F0\uC2A4 \uBD84\uC11D \uC2E4\uD328").catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{}))}catch(k){r.error(` \u2717 \uB808\uD37C\uB7F0\uC2A4 \uBD84\uC11D ${u.id} threw: ${k.message}`),await t.updatePlanStatus(u.id,"failed").catch(()=>{})}finally{e.onActive?.(null),await t.releasePlan(u.id,e.myDeviceId).catch(()=>{})}continue}if(Tx(u)&&!u.cwd){let k=wM;u.status!=="failed"&&(r.error(`\u26D4 ${u.title}: ${k}`),await t.updatePlanStatus(u.id,"failed").catch(()=>{}),await t.note(u.id,k).catch(()=>{}));continue}if(u.kind==="command"){if(u.status==="requested"&&u.command){if(i=!0,on(u.brain)){let v=u.brain,C=[],I=await kx({provider:v,requestedProfileId:u.providerProfileId,profiles:p,check:j=>(e.checkCoworkGate??mr)(v,void 0,j),onEvent:async j=>{let Y={type:j.type,at:new Date().toISOString(),..."profileId"in j?{profileId:j.profileId}:{},..."attempt"in j?{attempt:j.attempt}:{},..."reason"in j?{reason:j.reason}:{}};C.push(Y),await e.onSupervisorEvent?.({...j,planId:u.id})}});if(e.signal?.aborted)continue;if(!I.ok){r.error(`\u26D4 ${u.title}: ${I.reason}`);let j={...Ol(u.id,u.brain,e.myDeviceId,Pt(u.cwd)||process.cwd(),void 0,u.providerProfileId),replacesRunId:d.get(u.id),activity:C.slice(-50)},Y=Ml(u.id,j,o);await Y.start(),await Y.finish("failed",{endedAt:new Date().toISOString()}),await t.finishCommand(u.id,"failed",{output:I.reason,exitCode:null,durationMs:0}).catch(we=>r.error(` \uACB0\uACFC \uAE30\uB85D \uC2E4\uD328: ${we.message}`));continue}let N=u;e.onActive?.(u.title),r.info(`\u25B6 [${u.brain}] ${u.command}`);let G={...Ol(u.id,u.brain,e.myDeviceId,Pt(u.cwd)||process.cwd(),void 0,I.profileId),replacesRunId:d.get(u.id),activity:C.slice(-50)},$=Ml(u.id,G,o);try{await $.start();let j=Pt(u.cwd)||process.cwd(),Y=[I.profileId??"active-local"],we=Ks(u,v,j,e.myDeviceId),B=!1,q=await(e.runExecutionCheckpoint??Gf)({key:`${u.id}:command`,profiles:Y,identity:h,fingerprint:()=>(e.repositoryFingerprint??qf)(j),onActivity:re=>$.appendActivity(re),execute:async(re,oe)=>{if(e.signal?.aborted)return{ok:!1,failureKind:"permanent",reason:"Runner stopped."};if(re!==h.profileId)return{ok:!1,failureKind:"permanent",reason:"Selected account changed; execution refused."};let L=await w();if(L)return{ok:!1,failureKind:"permanent",reason:L};let Se=await(e.checkCoworkGate??mr)(v,void 0,I.profileId);if(!Se.ok)return{ok:!1,failureKind:Se.accountStatus?.state==="action_required"?"auth_required":"permanent",reason:Se.reason};let ee=N,Q=await ih(t,u.id,Re=>ZS({store:t,plan:ee,brain:v,cwd:j,deviceId:e.myDeviceId,validateSelection:w,skipStart:oe>1,deferFinish:!0,signal:e.signal,resumeSessionId:we,resumeIdentity:h,onKill:fe=>Re(()=>{$.markStopping(),fe()}),onProcess:fe=>$.observeProcess(fe),onSessionId:fe=>{re===(I.profileId??"active-local")&&$.identify(fe)},onText:fe=>$.appendOutput(fe)}));return B||=Q.cancelled||e.signal?.aborted===!0,Q.result.sessionId&&(we=Q.result.sessionId,$.identify(Q.result.sessionId)),{ok:Q.result.success,failureKind:Q.result.failureKind,reason:Q.result.output,externalSessionId:Q.result.sessionId}}});await t.finishCommand(u.id,B?"failed":q.ok?"done":"failed",{output:q.reason??(q.ok?`[${v}] done`:`[${v}] failed`),exitCode:q.ok?0:null,durationMs:0}),await $.finish(B?"stopped":q.ok?"done":"failed",{endedAt:new Date().toISOString()})}catch(j){throw await $.finish("failed",{endedAt:new Date().toISOString()}),j}continue}if(!e.allowRawCommand){r.error(`\u26D4 ${u.title}: ${Px}`),await t.finishCommand(u.id,"failed",{output:Px,exitCode:null,durationMs:0}).catch(v=>r.error(` \uACB0\uACFC \uAE30\uB85D \uC2E4\uD328: ${v.message}`));continue}let k=wo(u.command)??(Fe.isCatastrophicCommand(u.command)?"catastrophic-command":null);if(k){let v=`${yM} (${k})`;r.error(`\u26D4 ${u.title}: ${v}`),await t.finishCommand(u.id,"failed",{output:v,exitCode:null,durationMs:0}).catch(C=>r.error(` \uACB0\uACFC \uAE30\uB85D \uC2E4\uD328: ${C.message}`));continue}if(!await t.claimPlan(u.id,e.myDeviceId))continue;try{e.onActive?.(u.title),await t.startCommand(u.id);let v=Date.now(),C=pM(u.command,{shell:!0,cwd:Pt(u.cwd)||process.cwd(),encoding:"utf8",timeout:vM}),I=[];C.stdout&&I.push(C.stdout.trimEnd()),C.stderr&&I.push(C.stderr.trimEnd()),C.error&&I.push(`[\uC624\uB958] ${C.error.message}`),C.signal&&I.push(`[\uC885\uB8CC] signal ${C.signal}`);let N=I.join(`
|
|
636
|
+
`).trim(),G=C.error?null:C.status??null,$=!C.error&&C.status===0;await t.finishCommand(u.id,$?"done":"failed",{output:N,exitCode:G,durationMs:Date.now()-v}),r.info($?`\u2713 ${u.command} (${Date.now()-v}ms)`:`\u2717 ${u.command} (exit ${G??"signal"})`)}catch(v){await t.finishCommand(u.id,"failed",{output:`\uC2E4\uD589 \uC2E4\uD328: ${v.message}`,exitCode:null,durationMs:0}).catch(()=>{}),r.error(`command ${u.id} threw: ${v.message}`)}}continue}if(u.cwd){let k=Pt(u.cwd),v=Dl(k);if(v){Dl(s);let{count:C,giveUp:I}=EM(u.id,`chdir:${v}`);if(r.error(`\u26D4 ${u.title}: \uC791\uC5C5 \uD3F4\uB354 ${k} \uB85C \uC774\uB3D9 \uC2E4\uD328 (${C}/${ch}) (${v})`),!I)continue;await t.updatePlanStatus(u.id,"failed").catch(N=>r.error(` failed \uD45C\uAE30 \uC2E4\uD328: ${N.message}`)),await t.note(u.id,`\uC791\uC5C5 \uD3F4\uB354 ${k} \uB85C \uC774\uB3D9 ${ch}\uD68C \uC2E4\uD328\uB85C \uC911\uB2E8: ${v}`).catch(N=>r.error(` note \uAE30\uB85D \uC2E4\uD328: ${N.message}`));continue}Ll.delete(u.id)}else Dl(s);try{if(u.status==="requested"){let B=Nl.get(u.id);if(B&&Date.now()<B.nextAttemptAt){let re=Math.ceil((B.nextAttemptAt-Date.now())/1e3);r.info(`\u23F3 ${u.title} \u2014 \uC791\uC131 \uC7AC\uC2DC\uB3C4 \uBC31\uC624\uD504 \uC911 (\uB2E4\uC74C \uC2DC\uB3C4 ${re}s \uD6C4)`);continue}i=!0,r.info(`\u{1F4DD} Authoring plan for requested task: ${u.title} (${u.id})`);let q=await _S({planId:u.id});if(q.success)Nl.delete(u.id),r.info(" \u2713 plan authored");else{let re=(B?.count??0)+1;r.info(` \u2717 failed to author plan (${re}/${sh}): ${q.error??"unknown error"}`),re>=sh?(await t.updatePlanStatus(u.id,"failed"),await t.note(u.id,`\uC791\uC131 ${sh}\uD68C \uC5F0\uC18D \uC2E4\uD328\uB85C \uC911\uB2E8 (\uB9C8\uC9C0\uB9C9 \uC624\uB958: ${q.error??"unknown error"}).`),Nl.delete(u.id),r.info(" \u2717 plan marked 'failed' \u2014 \uB354 \uC774\uC0C1 \uC790\uB3D9 \uC7AC\uC2DC\uB3C4\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.")):Nl.set(u.id,{count:re,nextAttemptAt:Date.now()+Rx(re)})}continue}if(!(u.state?.steps??[]).some(B=>B.status==="approved"||u.autoApprove&&B.status==="awaiting_approval")||!await t.claimPlan(u.id,e.myDeviceId))continue;let v=await t.getVerifiedPlan(u.id);if(h&&a()!==c){r.error("Protocol account or server changed before approval. Restore the original account and refresh.");continue}let C=h?xf(h,v):null;if(C){await t.note(u.id,C),await t.updatePlanStatus(u.id,"failed");continue}let I=on(u.brain)?u.brain:null,N=null,G=!1;if(I&&v.autoApprove&&(v.state?.steps??[]).some(B=>B.status==="awaiting_approval")){let B=u.providerProfileId?await(e.checkCoworkGate??mr)(I,void 0,u.providerProfileId):await(e.checkCoworkGate??mr)(I);if(G=!0,!B.ok){N=B.reason,await t.note(u.id,B.reason).catch(()=>{}),await t.updatePlanStatus(u.id,"failed").catch(()=>{});continue}}if(v.autoApprove)for(let B of v.state?.steps??[])B.status==="awaiting_approval"&&await t.autoApproveStep(u.id,B.id).catch(q=>r.error(` \uC790\uB3D9 \uC2B9\uC778 \uAE30\uB85D \uC2E4\uD328 (${B.id}): ${q.message}`));let $=v.autoApprove?await t.getVerifiedPlan(u.id):v;if(e.signal?.aborted)continue;if(I&&!G&&($.state?.steps??[]).some(B=>B.status==="approved")){let B=u.providerProfileId?await(e.checkCoworkGate??mr)(I,void 0,u.providerProfileId):await(e.checkCoworkGate??mr)(I);B.ok||(N=B.reason)}let j=0,Y=I?Ks($,I,Pt(u.cwd)||process.cwd(),e.myDeviceId):void 0,we=u.providerProfileId??"active-local";for(let B of $.state?.steps??[]){if(e.signal?.aborted)break;if(B.status!=="approved")continue;let q=j===0?$:await t.getPlan(u.id).catch(()=>$);if(e.signal?.aborted)break;if(q.deletedAt||q.status==="cancelled"||q.status==="deleted"){r.info(`\u23F8 ${u.title}: \uC2E4\uD589 \uC911 \uC0AD\uC81C/\uC911\uB2E8\uB428 \u2014 \uB0A8\uC740 \uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);break}if(j++,i=!0,N){r.error(`\u26D4 ${u.title} / ${B.title}: ${N}`),await t.recordResult(u.id,B.id,!1,N).catch(re=>r.error(` \uACB0\uACFC \uAE30\uB85D \uC2E4\uD328: ${re.message}`));continue}try{e.onActive?.(u.title),r.info(`\u25B6 ${I?`[${I}] `:""}${u.title} / ${B.title} (${B.id})`),r.info(` \uAD8C\uD55C: ${ps(B.scope,"ko")}`);let re=I?{...Ol(u.id,I,e.myDeviceId,Pt(u.cwd)||process.cwd(),void 0,u.providerProfileId),replacesRunId:d.get(u.id)}:null,oe=re?Ml(u.id,re,o):null;try{oe&&await oe.start();let L=!1,Se=I?await(e.runExecutionCheckpoint??Gf)({key:`${u.id}:${B.id}`,profiles:[u.providerProfileId??"active-local"],identity:h,fingerprint:()=>(e.repositoryFingerprint??qf)(Pt(u.cwd)||process.cwd()),onActivity:Q=>oe?.appendActivity(Q),execute:async(Q,Re)=>{if(e.signal?.aborted)return{ok:!1,failureKind:"permanent",reason:"Runner stopped."};if(Q!==h.profileId)return{ok:!1,failureKind:"permanent",reason:"Selected account changed; execution refused."};let fe=await w();if(fe)return{ok:!1,failureKind:"permanent",reason:fe};let Ce=await(e.checkCoworkGate??mr)(I,void 0,u.providerProfileId);if(!Ce.ok)return{ok:!1,failureKind:Ce.accountStatus?.state==="action_required"?"auth_required":"permanent",reason:Ce.reason};let Ie=u,yt=await ih(t,u.id,Vn=>QS({store:t,plan:Ie,step:B,brain:I,deviceId:e.myDeviceId,validateSelection:w,resumeIdentity:h,deferResult:!0,skipStart:Re>1,signal:e.signal,onKill:y=>Vn(()=>{oe?.markStopping(),y()}),onProcess:y=>oe?.observeProcess(y),onSessionId:y=>{Q===(u.providerProfileId??"active-local")&&oe?.identify(y)},resumeSessionId:Q===we?Y:void 0,onText:y=>oe?.appendOutput(y)}));return yt.result.sessionId&&(we=Q,Y=yt.result.sessionId),L||=yt.cancelled||e.signal?.aborted===!0,{ok:yt.result.success,failureKind:yt.result.failureKind,reason:yt.result.output??yt.result.error,externalSessionId:yt.result.sessionId}}}):null;if(I&&Se){let Q=Hs();Q.length&&await t.recordChange(u.id,B.id,Q),await t.recordResult(u.id,B.id,Se.ok,`[${I}] ${Se.reason??(Se.ok?"done":"failed")}`)}let ee=Se?{success:Se.ok,error:Se.reason,sessionId:Se.externalSessionId}:await pl({planId:u.id,stepId:B.id,tier:gM(u,e.tier),autoApprove:$.autoApprove===!0});"sessionId"in ee&&typeof ee.sessionId=="string"&&(Y=ee.sessionId),oe&&await oe.finish(L?"stopped":ee.success?"done":"failed",{..."sessionId"in ee&&typeof ee.sessionId=="string"&&we===(u.providerProfileId??"active-local")?{externalSessionId:ee.sessionId}:{},endedAt:new Date().toISOString()}),r.info(ee.success?" \u2713 done":` \u2717 ${ee.error}`)}catch(L){throw oe&&await oe.finish("failed",{endedAt:new Date().toISOString()}),L}}catch(re){r.error(` \u2717 step ${B.id} threw: ${re.message}`)}}}catch(k){r.error(`plan ${u.id} \uCC98\uB9AC \uC911 \uC624\uB958 (\uB2E4\uC74C \uD50C\uB79C\uC740 \uACC4\uC18D \uC9C4\uD589): ${k.message}`)}finally{await t.releasePlan(u.id,e.myDeviceId).catch(()=>{})}}}return Dl(s),e.onActive?.(null),i}var _M=6e4;function Ix(t,e="en"){let r=e==="ko";switch(t.state){case"running":{let n=(t.title??"").trim(),o=n.length>28?n.slice(0,27)+"\u2026":n;return o?r?`\u25CF \uC2E4\uD589 \uC911: ${o}`:`\u25CF running: ${o}`:r?"\u25CF \uC2E4\uD589 \uC911":"\u25CF running"}case"external":return r?"\u25CF \uC628\uB77C\uC778 (runner \uBCC4\uB3C4 \uC2E4\uD589 \uC911)":"\u25CF online (runner running separately)";case"idle":return r?"\u25CF \uC628\uB77C\uC778 \xB7 \uC2E4\uD589 \uB300\uAE30":"\u25CF online \xB7 waiting";case"offline":default:return r?"\u25CB \uC624\uD504\uB77C\uC778(\uB85C\uADF8\uC778 \uD544\uC694)":"\u25CB offline (sign in)"}}function TM(){try{return new K().getSession()?.user?.id??null}catch{return null}}function lh(t={}){let e=t.log??_x,r=m=>{try{t.onStatus?.(m)}catch{}},n=t.intervalMs??5e3,o=t.poll??CM,i=!1,s=new AbortController,a,c=null,l=null,d=m=>new Promise(h=>{let w=setTimeout(()=>{c=null,h()},m);c=()=>{clearTimeout(w),c=null,h()}}),p=(async()=>{try{if(!TM()){if(r({state:"offline"}),t.requireAuth)return;e.error("\uB85C\uADF8\uC778\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 `protocol login` \uD6C4 \uB2E4\uC2DC \uC2DC\uC791\uD558\uC138\uC694. / Not signed in.")}if(t.skipIfRunnerLive){let b=await rl().catch(()=>[]);if(!i&&b.includes(jn())){r({state:"external"});return}}if(i)return;if(t.lock&&!t.lock.acquire().acquired){r({state:"external"});return}if(i){t.lock?.release();return}l=tl("runner",{cwd:t.cwd??process.cwd(),handleSignals:t.handleSignals,onShutdown:()=>u()}),r({state:"idle"});let m=n,h=null,w=jn();for(;!i;){let b=!1;if(t.pause?.()){await d(n);continue}let k=await dS();if(i)break;h!==k.reason&&(e.info(k.run?`\u25B6 \uC774 \uAE30\uAE30\uAC00 \uC2E4\uD589\uC744 \uB9E1\uC2B5\uB2C8\uB2E4 (${k.reason}).`:k.reason==="registry-unavailable"||k.reason==="registry-degraded-unlisted"?"\u23F8 \uAE30\uAE30 \uBAA9\uB85D\uC744 \uC77D\uC9C0 \uBABB\uD574 \uC2E4\uD589\uC744 \uBCF4\uB958\uD569\uB2C8\uB2E4 \u2014 \uC911\uBCF5 \uC2E4\uD589 \uBC29\uC9C0(fail-closed). \uC774 \uAE30\uAE30 \uD558\uB098\uB9CC \uB7EC\uB108\uB97C \uB3CC\uB9AC\uB294 \uAC8C \uD655\uC2E4\uD558\uBA74 PROTOCOL_RUNNER_SOLO=1 \uB85C \uCF1C\uC138\uC694. (\uC6F9\uC5D0\uC11C \uC774 \uAE30\uAE30\uB97C \uC9C0\uC815\uD55C \uCE74\uB4DC\uB294 \uADF8\uB300\uB85C \uC2E4\uD589\uB429\uB2C8\uB2E4.)":`\u23F8 \uB2E4\uB978 \uAE30\uAE30\uAC00 \uC2E4\uD589\uC744 \uB9E1\uACE0 \uC788\uC2B5\uB2C8\uB2E4 (${k.reason}) \u2014 \uADF8 \uAE30\uAE30\uAC00 \uAEBC\uC9C0\uBA74 \uC5EC\uAE30\uC11C \uC774\uC5B4\uBC1B\uC2B5\uB2C8\uB2E4.`),h=k.reason);try{let v=t.store??new kt;b=await o(v,{tier:t.tier??"heavy",myDeviceId:w,globalRun:k.run,signal:s.signal,allowRawCommand:t.allowRawCommand===!0,log:e,onActive:C=>r(C?{state:"running",title:C}:{state:"idle"}),onWorkerSession:t.onWorkerSession??vx})}catch(v){e.error(`poll error: ${v.message}`)}if(i)break;r({state:"idle"}),m=b?n:Math.min(m*2,_M),await d(m)}}catch(m){e.error(`\uB7EC\uB108 \uB8E8\uD504 \uC911\uB2E8: ${m.message}`),r({state:"offline"})}})(),u=()=>a||(i=!0,s.abort(),c?.(),a=(async()=>{await p;try{await l?.stop()}finally{t.signal?.removeEventListener("abort",f),t.lock?.release(),r({state:"offline"})}})(),a),f=()=>{u()};return t.signal&&(t.signal.aborted?u():t.signal.addEventListener("abort",f,{once:!0})),{stop:u,done:p}}var $x=new se("runner").description("Watch for approved plan steps and execute them here (local machine or your own VM)").option("--interval <sec>","poll interval in seconds","5").option("--tier <tier>","model tier for execution (heavy|default)","heavy").option("--allow-raw-command","allow direct shell commands sent from the web (no approval gate \u2014 off by default)").action(async t=>{console.log("Runner started \u2014 watching for approved steps. (Ctrl+C to stop)"),console.log(`cwd: ${process.cwd()}`),await lh({cwd:process.cwd(),intervalMs:(parseInt(t.interval,10)||5)*1e3,tier:t.tier,allowRawCommand:t.allowRawCommand===!0,lock:{acquire:hl,release:ml},onStatus:r=>{r.state==="external"&&console.log("\u23F8 \uC774 \uAE30\uAE30\uC5D0\uC11C \uC774\uBBF8 \uC2E4\uD589\uC790(runner \uB610\uB294 protocol TUI)\uAC00 \uB3CC\uACE0 \uC788\uC5B4 \uC885\uB8CC\uD569\uB2C8\uB2E4. / Another runner/TUI already owns execution on this device \u2014 exiting.")}}).done});function Ox(){return wg()}import{useEffect as Fl,useRef as RM,useState as wr}from"react";var Qs=["all","working","completed","failed","archived"];function Mx(t,e){return t.filter(r=>e==="archived"?r.archived:r.archived?!1:e==="all"?!0:e==="working"?["starting","running","stopping","waiting_input"].includes(r.state):e==="completed"?r.state==="completed":r.state==="failed")}function Dx(t,e){return Qs[(Qs.indexOf(t)+e+Qs.length)%Qs.length]}function Zs(t){return Math.max(1,Math.floor(t)-(t<9?2:8))}function Nx(t,e,r,n){let o=Math.max(0,Math.min(e,t-1)),i=Math.max(0,Math.min(Math.max(0,t-r),o<n?o:o>=n+r?o-r+1:n));return{selected:o,start:i,end:Math.min(t,i+r)}}function Jo(t){return(t??"").replace(/\x1b\][^\x07]*(?:\x07|\x1b\\)/g,"").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,"").replace(/[\x00-\x1f\x7f-\x9f]/g," ")}function Lx(t,e,r=5e3){let[n,o]=wr(!1),[i,s]=wr("all"),[a,c]=wr({scope:null,records:[]}),[l,d]=wr(!1),[p,u]=wr(!1),[f,m]=wr(null),[h,w]=wr(!1),[b,k]=wr(null),[v,C]=wr(0),[I,N]=wr(0),G=RM(null),$=t.scopeKey(),j=a.scope===$?a.records:[],Y=Mx(j,i),we=Zs(e),B=Math.max(0,Y.findIndex(ee=>ee.id===b)),q=Nx(Y.length,B,we,v),re=Y[q.selected],oe=l||p||!$||a.scope!==$||j.some(ee=>ee.disconnected);Fl(()=>(G.current=null,w(!1),m(null),k(null),C(0),()=>{G.current=null}),[$]),Fl(()=>{if(!n)return;let ee=!1,Q,Re=async()=>{if(G.current){Q=setTimeout(()=>void Re(),r);return}let fe=t.scopeKey();u(!0),c(Ce=>Ce.scope===fe?Ce:{scope:fe,records:[]});try{if(!fe)throw new Error("unauthenticated");let Ce=await t.read();if(ee||t.scopeKey()!==fe)return;c({scope:fe,records:Ce}),d(Ce.some(Ie=>Ie.disconnected))}catch{ee||d(!0)}finally{ee||(u(!1),Q=setTimeout(()=>void Re(),r))}};return Re(),()=>{ee=!0,clearTimeout(Q)}},[n,t,$,I,r]),Fl(()=>{C(q.start)},[q.start]),Fl(()=>{k(re?.id??null)},[re?.id]);let L=async ee=>{let Q=t.scopeKey();if(!re||oe||re.state==="disconnected"||G.current||!Q||Q!==a.scope||!re.capabilities[ee].enabled)return;let Re={};G.current=Re,w(!0),m(null);try{await t[ee](re.id),t.scopeKey()===Q&&G.current===Re&&(m("saved"),N(fe=>fe+1))}catch{t.scopeKey()===Q&&G.current===Re&&(m("error"),d(!0))}finally{G.current===Re&&(G.current=null,w(!1))}};return{open:n,setOpen:o,toggle:()=>o(ee=>!ee),filter:i,records:j,visible:Y,selected:re,window:q,stale:oe,loading:p,busy:h,notice:f,input:(ee,Q)=>{if(!n||Q.ctrl&&["c","x","b"].includes(ee))return!1;if(Q.escape)return o(!1),!0;if(Q.leftArrow||Q.rightArrow)s(Re=>Dx(Re,Q.rightArrow?1:-1)),C(0),k(null),m(null);else if(Q.upArrow||Q.downArrow||Q.pageUp||Q.pageDown){let Re=Q.upArrow||Q.pageUp?-1:1,fe=Math.max(0,Math.min(Y.length-1,B+Re*(Q.pageUp||Q.pageDown?we:1)));k(Y[fe]?.id??null)}else!Q.ctrl&&!Q.meta&&ee==="a"?L("archive"):!Q.ctrl&&!Q.meta&&ee==="r"&&L("restore");return!0}}}Tr();import{Box as jl,Text as uh}from"ink";import{jsx as ea,jsxs as Fx}from"react/jsx-runtime";var dh=t=>({running:x("running","\uC791\uC5C5 \uC911"),starting:x("starting","\uC2DC\uC791 \uC911"),stopping:x("stopping","\uC911\uC9C0 \uC911"),completed:x("completed","\uC644\uB8CC"),failed:x("failed","\uC2E4\uD328"),stopped:x("stopped","\uC911\uC9C0\uB428"),waiting_input:x("waiting input","\uC785\uB825 \uB300\uAE30"),disconnected:x("disconnected","\uC5F0\uACB0 \uB04A\uAE40"),unknown:x("unknown","\uD655\uC778 \uBD88\uAC00")})[t]??Jo(t),IM=()=>({all:x("All","\uC804\uCCB4"),working:x("Working","\uC791\uC5C5 \uC911"),completed:x("Completed","\uC644\uB8CC"),failed:x("Failed","\uC2E4\uD328"),archived:x("Archived","\uBCF4\uAD00\uD568")});function jx({panel:t,rows:e,cols:r,accent:n,text:o,muted:i,hint:s}){let a=t.selected,c=IM(),l=(p,u=i,f=!1)=>ea(uh,{wrap:"truncate-end",color:u,bold:f,children:Jo(p)});if(e<9)return Fx(jl,{flexDirection:"column",width:Math.max(1,r),height:Math.max(1,e),overflow:"hidden",children:[e>2&&l(`${x("Sessions","\uC138\uC158")} \xB7 ${c[t.filter]}${t.stale?x(" \xB7 offline"," \xB7 \uC5F0\uACB0 \uBD88\uAC00"):""}`,n),ea(jl,{flexDirection:"column",height:Zs(e),flexShrink:0,overflow:"hidden",children:t.visible.length?t.visible.slice(t.window.start,t.window.end).map(p=>ea(uh,{wrap:"truncate-end",color:a?.id===p.id?n:o,children:Jo(`${a?.id===p.id?"\u276F":" "} ${p.task} \xB7 ${p.provider} \xB7 ${t.stale?x("last known: ","\uB9C8\uC9C0\uB9C9 \uC0C1\uD0DC: "):""}${dh(p.state)}`)},p.id)):l(x("No records","\uAE30\uB85D \uC5C6\uC74C"))}),e>1&&l(s??"\u2191\u2193 \xB7 PgUp/PgDn \xB7 \u2190\u2192 \xB7 Esc")]});let d=(p,u,f)=>{let m=a?.capabilities[p];return m?.enabled&&!t.stale&&a?.state!=="disconnected"&&!t.busy?`[${u}] ${f}`:`${f}: ${x("unavailable","\uC0AC\uC6A9 \uBD88\uAC00")}${m?.reason?` (${Jo(m.reason)})`:""}`};return Fx(jl,{flexDirection:"column",width:Math.max(1,r),height:Math.max(1,e),overflow:"hidden",children:[l(x("Sessions \xB7 Ctrl+B l / Esc close \xB7 records stay saved","\uC138\uC158 \xB7 Ctrl+B l / Esc \uB2EB\uAE30 \xB7 \uAE30\uB85D\uC740 \uC720\uC9C0\uB429\uB2C8\uB2E4"),n,!0),l(Object.entries(c).map(([p,u])=>`${t.filter===p?"\u276F":""}${u}`).join(" ")+" \u2190/\u2192",o),l(t.loading?x("Refreshing saved records\u2026","\uC800\uC7A5\uB41C \uAE30\uB85D \uC0C8\uB85C\uACE0\uCE68 \uC911\u2026"):t.stale?x("Feed unavailable \xB7 last known records \xB7 actions disabled","\uC5F0\uACB0 \uBD88\uAC00 \xB7 \uB9C8\uC9C0\uB9C9 \uD655\uC778 \uAE30\uB85D \xB7 \uB3D9\uC791 \uBE44\uD65C\uC131"):x(`${t.visible.length} records \xB7 ${t.visible.length?t.window.selected+1:0}/${t.visible.length}`,`${t.visible.length}\uAC1C \uAE30\uB85D \xB7 ${t.visible.length?t.window.selected+1:0}/${t.visible.length}`)),ea(jl,{flexDirection:"column",height:Zs(e),flexShrink:0,overflow:"hidden",children:t.visible.length===0?l(x("No records in this filter.","\uC774 \uD544\uD130\uC5D0 \uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.")):t.visible.slice(t.window.start,t.window.end).map(p=>ea(uh,{wrap:"truncate-end",color:a?.id===p.id?n:o,bold:a?.id===p.id,children:Jo(`${a?.id===p.id?"\u276F":" "} ${p.group||x("Ungrouped","\uBBF8\uBD84\uB958")} / ${p.task} \xB7 ${p.provider} \xB7 ${t.stale?x("last known: ","\uB9C8\uC9C0\uB9C9 \uC0C1\uD0DC: "):""}${dh(p.state)} \xB7 ${p.lastActivityAt||"\u2014"}`)},p.id))}),l(a?`${a.group||x("Ungrouped","\uBBF8\uBD84\uB958")} / ${a.task} \xB7 ${a.provider} \xB7 ${a.device}`:"\u2014",o),l(a?`${x("Activity","\uB9C8\uC9C0\uB9C9 \uD65C\uB3D9")}: ${a.lastActivityAt||"\u2014"} \xB7 ${a.lastActivity||dh(a.state)}`:"\u2014"),l(a?`${d("archive","a",x("Archive","\uBCF4\uAD00"))} \xB7 ${d("restore","r",x("Restore","\uBCF5\uC6D0"))}`:"\u2014"),l(t.busy?x("Saving\u2026","\uC800\uC7A5 \uC911\u2026"):t.notice==="error"?x("Could not confirm save. Refresh before retry.","\uC800\uC7A5 \uD655\uC778 \uC2E4\uD328. \uC0C8\uB85C\uACE0\uCE68 \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694."):t.notice==="saved"?x("Saved to shared records.","\uACF5\uD1B5 \uAE30\uB85D\uC5D0 \uC800\uC7A5\uD588\uC2B5\uB2C8\uB2E4."):x("Provider resume / input / attach unavailable in this panel","\uC774 \uD328\uB110\uC5D0\uC11C provider \uC7AC\uAC1C / \uC785\uB825 / attach\uB294 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4")),l(s??x("\u2191\u2193 select \xB7 PgUp/PgDn scroll \xB7 \u2190\u2192 filter \xB7 Ctrl+C cancel current task","\u2191\u2193 \uC120\uD0DD \xB7 PgUp/PgDn \uC2A4\uD06C\uB864 \xB7 \u2190\u2192 \uD544\uD130 \xB7 Ctrl+C \uD604\uC7AC \uC791\uC5C5 \uCDE8\uC18C"))]})}import{Fragment as nD,jsx as V,jsxs as ke}from"react/jsx-runtime";function WM(){let t=process.env.PROTOCOL_TERM_BG;if(t==="light"||t==="dark")return t;let e=process.env.COLORFGBG;if(e){let r=e.split(";"),n=parseInt(r[r.length-1],10);if(!Number.isNaN(n))return n===7||n>=10?"light":"dark"}return"unknown"}var Wl=WM(),fh=t=>t==="light"?{bg:"#faf4e0",primary:"#2f2f2f",secondary:"#6a6a6a",surface:"#efe9d8",text:"#1a1a1a",gray:"#8a8a8a",border:"#cfcfcf"}:t==="dark"?{bg:"#000000",primary:"#e6e6e6",secondary:"#9a9a9a",surface:"#1a1a1a",text:"#ffffff",gray:"#666666",border:"#333333"}:{bg:"#1a1a1a",primary:"#9a9a9a",secondary:"#808080",surface:"#2a2a2a",text:"#8f8f8f",gray:"#808080",border:"#707070"},Gx={"protocol-scarlet":fh(Wl),"protocol-rouge":{bg:"#1a0f0e",primary:"#ff6b6b",secondary:"#ee5253",surface:"#2d1a18",text:"#f7e1ad",gray:"#8c7474",border:"#3d2523"},"protocol-nord":{bg:"#242933",primary:"#88c0d0",secondary:"#81a1c1",surface:"#2e3440",text:"#d8dee9",gray:"#4c566a",border:"#3b4252"}};async function BM(){if(!process.stdout.isTTY||!process.stdin.isTTY)return null;let t=process.stdin;return new Promise(e=>{let r=!1,n="",o=t.isRaw,i={},s=c=>{if(!r){r=!0,clearTimeout(i.id),t.removeListener("data",a);try{t.setRawMode(o)}catch{}t.pause(),e(c)}},a=c=>{n+=c.toString("latin1");let l=n.match(/rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)/);if(l){let d=h=>parseInt((h.length>=2?h.slice(0,2):h+h).slice(0,2),16),[p,u,f]=[d(l[1]),d(l[2]),d(l[3])],m=.299*p+.587*u+.114*f;s(m>128?"light":"dark")}};try{t.setRawMode(!0)}catch{}t.resume(),t.on("data",a),process.stdout.write("\x1B]11;?\x07"),i.id=setTimeout(()=>s(null),200)})}var HM=fw(Wl==="light"?[{color:"#141414",pos:0},{color:"#4a4a4a",pos:.5},{color:"#6e6e6e",pos:1}]:Wl==="dark"?[{color:"#f5f5f5",pos:0},{color:"#b0b0b0",pos:.5},{color:"#7a7a7a",pos:1}]:[{color:"#6a6a6a",pos:0},{color:"#8a8a8a",pos:.5},{color:"#a8a8a8",pos:1}]),qM=`
|
|
637
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \u2588\u2588\u2588\u2588\u2588
|
|
638
|
+
\u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2593\u2593\u2593 \u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2593 \u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2593\u2588\u2588\u2593\u2588\u2588 \u2593\u2588\u2588\u2588\u2588\u2588
|
|
639
|
+
\u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2588\u2588 \u2593\u2593\u2593\u2593\u2593
|
|
640
|
+
\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2588\u2588
|
|
641
|
+
\u2593\u2588\u2588\u2593\u2593\u2593\u2593\u2593 \u2593\u2588\u2588\u2593\u2593\u2588\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2593\u2588\u2588 \u2588\u2588\u2588\u2588\u2588
|
|
642
|
+
\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2593\u2588\u2588 \u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2593\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2593\u2588\u2588\u2588\u2588\u2588
|
|
643
|
+
\u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593 \u2593\u2593 \u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593 \u2593\u2593\u2593\u2593\u2593
|
|
644
|
+
`,Ul=["Explore","Plan","Verify","Build","Echo","Nova","Forge"],GM=[{cmd:"new",en:"spawn a worker (claude|agy|codex, blank=native)",ko:"\uC6CC\uCEE4 \uB9CC\uB4E4\uAE30 (claude|agy|codex, \uBE44\uC6B0\uBA74 \uAE30\uBCF8)"},{cmd:"team",en:"<task> \u2014 split across workers, then synthesize",ko:"<\uC5C5\uBB34> \uC6CC\uCEE4\uC5D0 \uBD84\uB2F4 \uD6C4 \uCDE8\uD569"},{cmd:"engine",en:"who answers the main chat (builtin|claude|codex|agy)",ko:"\uBA54\uC778 \uCC44\uD305\uC744 \uBB34\uC5C7\uC774 \uB2F5\uD560\uC9C0 (builtin|claude|codex|agy)"},{cmd:"ask",en:"<name> <msg> \u2014 one-off to a worker",ko:"<\uC774\uB984> <\uBA54\uC2DC\uC9C0> \uC6CC\uCEE4\uC5D0\uAC8C \uBCF4\uB0B4\uACE0 \uC751\uB2F5 \uD45C\uC2DC"},{cmd:"debate",en:"<topic> \u2014 workers debate \u2192 verdict",ko:"<\uC8FC\uC81C> \uC6CC\uCEE4 \uD1A0\uB860 \u2192 \uD310\uC815"},{cmd:"restore",en:"go back to a saved point",ko:"\uC800\uC7A5\uB41C \uC2DC\uC810\uC73C\uB85C \uB418\uB3CC\uB9AC\uAE30"},{cmd:"clear",en:"wipe current agent chat",ko:"\uD604\uC7AC \uC5D0\uC774\uC804\uD2B8 \uB300\uD654 \uC9C0\uC6B0\uAE30"},{cmd:"exit",en:"end session",ko:"\uC138\uC158 \uC885\uB8CC"},{cmd:"model",en:"worker fast|think \u2014 worker speed",ko:"\uC77C\uAFBC fast|think \uBCC0\uACBD"},{cmd:"vision",en:"mode auto|off|always / model <provider> \u2014 image fallback",ko:"mode auto|off|always / model <provider> \u2014 \uC774\uBBF8\uC9C0 \uD3F4\uBC31"},{cmd:"brain",en:"server \u2014 orchestrator brain",ko:"server \u2014 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130 \uB450\uB1CC"},{cmd:"permissions",en:"readonly|workspace|full|default|yolo|danger \u2014 what agent can change",ko:"readonly|workspace|full|default|yolo|danger \u2014 \uD5C8\uC6A9 \uBC94\uC704"},{cmd:"lang",en:"en|ko \u2014 switch language",ko:"en|ko \u2014 \uC5B8\uC5B4 \uC804\uD658"},{cmd:"park",en:"pause/resume agent tab",ko:"\uC5D0\uC774\uC804\uD2B8 \uD0ED \uC77C\uC2DC\uC815\uC9C0/\uC7AC\uAC1C"},{cmd:"kill",en:"<name> \u2014 stop external process",ko:"<\uC774\uB984> \uC678\uBD80 \uD504\uB85C\uC138\uC2A4 \uC885\uB8CC"},{cmd:"sessions",en:"toggle saved sessions (Ctrl+B l)",ko:"\uC800\uC7A5\uB41C \uC138\uC158 \uBAA9\uB85D \uD1A0\uAE00 (Ctrl+B l)"},{cmd:"agents",en:"list agent tabs and status",ko:"\uC5D0\uC774\uC804\uD2B8 \uD0ED\xB7\uC0C1\uD0DC \uBAA9\uB85D"},{cmd:"login",en:"how to sign in",ko:"\uB85C\uADF8\uC778 \uBC29\uBC95 \uC548\uB0B4"},{cmd:"logout",en:"sign out / clear session",ko:"\uB85C\uADF8\uC544\uC6C3 / \uC138\uC158 \uC9C0\uC6B0\uAE30"},{cmd:"retro",en:"record a trap (symptom\u2192cause\u2192rule) into the file",ko:"\uD568\uC815 \uAE30\uB85D \uB0A8\uAE30\uAE30 (\uC99D\uC0C1\u2192\uC6D0\uC778\u2192\uADDC\uCE59) \u2014 \uD574\uB2F9 \uD30C\uC77C\uC5D0"},{cmd:"help",en:"command list (grouped)",ko:"\uBA85\uB839 \uBAA9\uB85D (\uADF8\uB8F9\uBCC4)"}],VM=t=>t==="light"?"#c1121f":t==="dark"?"#ff5f6e":"#d62839",zM="#f3b8bd",KM="#5c1016",JM="#2b2b31",YM="#d7dade";function XM(t,e,r){let n=t.trimStart(),o=n.charAt(0),i={color:KM,dim:!1,bold:!0,bg:zM};for(let s of Object.keys($c))if(o===$c[s])return s==="edit"||s==="delete"?i:{color:r,dim:!1,bold:!1};return n.startsWith("\u23F9")||n.startsWith("\u26A0")?i:/^error[::]/i.test(n)||n.includes("\uC2E4\uD328")?{...i,bold:!1}:n.startsWith("\u{1F4CB}")||n.startsWith("\u2192")||n.startsWith("\xBB")?{color:r,dim:!1,bold:!1}:{color:r,dim:!1,bold:!1}}function QM(t){let e=0;for(let r of t){let n=r.codePointAt(0)??0,o=n>=4352&&n<=4447||n>=11904&&n<=42191||n>=44032&&n<=55203||n>=63744&&n<=64255||n>=65072&&n<=65103||n>=65280&&n<=65376||n>=65504&&n<=65510||n>=127744&&n<=129791||n>=9728&&n<=10175;e+=o?2:1}return e}function ZM(t){let e=UM.homedir();return t===e?"~":t.startsWith(e+"/")?"~"+t.slice(e.length):t}function eD(t,e){return t.length<=e?t:"\u2026"+t.slice(-Math.max(1,e-1))}function tD(t){let e=t;for(let r=0;r<8;r++){try{let o=qx(e,".git","HEAD");if(Mt.existsSync(o)){let i=Mt.readFileSync(o,"utf8").trim(),s=i.match(/ref:\s*refs\/heads\/(.+)$/);return s?s[1]:i.slice(0,7)}}catch{}let n=qx(e,"..");if(n===e)break;e=n}return null}var rD=({config:t,detectedBg:e})=>{let{exit:r}=FM(),{stdout:n}=jM(),o=new K,i=o.getAll(),[s,a]=ce({cols:n.columns||80,rows:n.rows||24}),[c]=ce(Ox),l=Lx(c,s.rows);lt(()=>{let g=()=>a({cols:n.columns||80,rows:n.rows||24});return n.on("resize",g),()=>{n.off("resize",g)}},[n]);let[d,p]=ce(i.ui.theme||"protocol-scarlet"),[,u]=ce(dr()),[f,m]=ce(()=>_c());lt(()=>Jb(m),[]);let[h,w]=ce(ag(i.models.orch)),[b,k]=ce(i.models.worker??"fast"),v=g=>"orchestrator",[C,I]=ce(i.chat?.engine??"builtin"),N=Je(void 0),[G,$]=ce(i.vision?.mode??"auto"),[j,Y]=ce(i.vision?.model??"server"),we={think:"think",fast:"fast"},B=g=>we.think,q=g=>g==="think"?we.think:we.fast,re=e??Wl,oe=VM(re),L=d==="protocol-scarlet"?fh(re):Gx[d]||fh(re),Se=Vv(s.cols),ee=Se.kind==="stack",[Q,Re]=ce(()=>Kv("chat")),fe=Q.focus,Ce=zv(s.rows,ee),[Ie,yt]=ce(""),[Vn,y]=ce(0),[A,E]=ce(0),[M,H]=ce("chat"),[U,me]=ce([]),[ye,$e]=ce(""),bt=()=>{let g=rw();me(g.items),$e(g.path)},[qe,ue]=ce(()=>[{id:"main",name:"main",status:"idle",messages:[],persist:!0}]),[Ae,ri]=ce("main"),vt=qe.find(g=>g.id===Ae)??qe[0],zk=vt.messages,ca=g=>ue(S=>S.map(P=>P.id===Ae?{...P,messages:typeof g=="function"?g(P.messages):g}:P)),et=Je(qe);lt(()=>{et.current=qe},[qe]);let Kk=Je(null),ni=()=>Kk.current??=new jt,dn=Je(new Map),Jk=g=>g==="server"?ni():null,[Zl,Yk]=ce("server"),[oi,Xk]=ce([]),Qk=()=>{for(let g of Uv){let S=oi.find(P=>P.provider===g);if(S)return S}return null},la=()=>{if(Zl==="server")return{kind:"server"};let g=Qk();return g?{kind:"cli",adapter:g}:{kind:"server"}},eu=g=>g.kind==="cli"?g.adapter.binary:"server",Nt=(g,S)=>ue(P=>P.map(R=>R.id===g?{...R,messages:[...R.messages,S]}:R)),At=(g,S)=>ue(P=>P.map(R=>R.id===g?{...R,status:S}:R)),ua=async(g,S)=>{let P=et.current.find(O=>O.id===g);if(!P)return"";Nt(g,{role:"user",content:S}),At(g,"working");let R="";try{if(P.provider){let O=$s[P.provider],_=[],T=O.run(S,{cwd:process.cwd(),resumeSessionId:P.extSessionId,onText:J=>{_.push(J),Nt(g,{role:"assistant",content:J})}});dn.current.set(g,T);let{sessionId:F}=await T.done;dn.current.delete(g),F&&ue(J=>J.map(W=>W.id===g?{...W,extSessionId:F}:W)),R=_.join(`
|
|
645
|
+
`)}else{let O=P.messages.slice(-12).filter(T=>T.role==="user"||T.role==="assistant").map(T=>({role:T.role,content:T.content}));R=(await ni().generate([...O,{role:"user",content:S}],{model:"default"})).content,Nt(g,{role:"assistant",content:R})}}catch(O){R=`Error: ${O.message}`,Nt(g,{role:"system",content:R})}finally{At(g,"idle")}return R},zn=async(g,S,P)=>{let R=la();try{if(R.kind==="cli"){let T=await jv(R.adapter,`${S}
|
|
646
|
+
|
|
647
|
+
${g}`,process.cwd());if(T)return T}}catch{}let O=v(h);return(await ni().generate([{role:"user",content:g}],{model:O,systemPrompt:S,signal:P?.controller.signal})).content};lt(()=>{E(0)},[Ie]);let Th=DM(()=>{let g=[{alias:"claude",provider:"claude-code",label:"Claude Code"},{alias:"agy",provider:"antigravity",label:"Antigravity"},{alias:"codex",provider:"codex",label:"Codex"},{alias:"local",provider:"local",label:"Local model"}].map(S=>{let P=oi.some(R=>R.provider===S.provider);return{cmd:`new ${S.alias}`,en:P?`${S.label} worker (your account)`:`${S.label} \u2014 not installed`,ko:P?`${S.label} \uC6CC\uCEE4 (\uB124 \uACC4\uC815)`:`${S.label} \u2014 \uC124\uCE58 \uC548 \uB428`,muted:!P}});return[...GM.map(S=>({...S,muted:!1})),...g]},[oi]),Rh=(g,S,P,R)=>{qv(S,P,R).then(O=>{O&&Nt(g,{role:"system",content:x("\u{1F4CB} run logged \u2014 review in web/mobile Plans","\u{1F4CB} \uC774\uBC88 \uC2E4\uD589\uC774 \uAE30\uD68D\uC11C\uC5D0 \uAE30\uB85D\uB428 \u2014 \uC6F9/\uBAA8\uBC14\uC77C Plans\uC5D0\uC11C \uB9AC\uBDF0 \uAC00\uB2A5")})}).catch(O=>console.error("\uC2E4\uD589 \uC6D0\uC7A5 \uAE30\uB85D \uC2E4\uD328 \u2014 \uC6F9\uC5D0\uC11C \uC774 \uC2E4\uD589\uC774 \uC548 \uBCF4\uC785\uB2C8\uB2E4:",O))},Zk=/(나눠|나누어|분담|병렬|동시에|각각|여러\s*(개|명|워커|파일)|팀으로|따로따로|in parallel|parallel|split (it |them |the )?up|divide|simultaneously|separately|each of|one each)/i,e0=g=>{let S=(g.match(/(그리고|그다음|그 다음|이후|또한|또|,|、|리팩터|전체|모든|각\s|그리고 나서|\band then\b|\balso\b|\bafter that\b|\bas well as\b|\brefactor\b|\bevery\b|\ball of\b)/gi)??[]).length,P=g.split(/[.!?。\n]/).filter(R=>R.trim().length>4).length;return g.length>140||S>=2||P>=3},t0=async(g,S)=>{let P='You are a coding orchestrator. Split the given task into subtasks that can run independently in parallel. If splitting is unnecessary or the steps are sequential, return just 1. Each subtask is one imperative sentence. Output ONLY a JSON string array (e.g. ["...","..."]). Nothing else. Max 4.';try{let O=(await zn(g,P,S)).match(/\[[\s\S]*\]/);if(!O)return[g];let _=JSON.parse(O[0]);if(!Array.isArray(_)||_.length===0)return[g];let T=_.map(F=>String(F).trim()).filter(Boolean).slice(0,4);return T.length?T:[g]}catch{return[g]}},Ih=g=>et.current.filter(S=>S.id!==g&&S.status!=="parked");lt(()=>Yy(g=>{g.type==="spawn"?ue(S=>S.some(P=>P.id===g.id)?S:[...S,{id:g.id,name:g.name,status:"working",messages:g.line?[{role:"system",content:g.line}]:[],persist:g.persist}]):g.type==="activity"?ue(S=>S.map(P=>P.id===g.id&&g.line?{...P,messages:[...P.messages,{role:"system",content:g.line}]}:P)):ue(S=>{let P=S.find(R=>R.id===g.id);return P?P.persist?S.map(R=>R.id===g.id?{...R,status:"waiting"}:R):S.filter(R=>R.id!==g.id):S})}),[]);let[tu,Kn]=ce(!1),[R1,r0]=ce("splash"),[ii,$h]=ce(null),Oh=Je(null),Jn=Je([]),[or,n0]=ce(null),[ru,o0]=ce(0),[si,Mh]=ce(!1),[pn,nu]=ce(0),[jr,ou]=ce(null),[ai,iu]=ce(0),da=["kernel"],pa=["fast","think"],Dh=["\u273B","\u273A","\u2733","\u2736","\u2737","\u2738","\u2739"],Nh=dr()==="ko"?["\uC0DD\uAC01\uD558\uB294 \uC911","\uC791\uC5C5\uD558\uB294 \uC911","\uD0D0\uC0C9\uD558\uB294 \uC911","\uBD84\uC11D\uD558\uB294 \uC911","\uD5E4\uC544\uB9AC\uB294 \uC911","\uB72F\uC5B4\uBCF4\uB294 \uC911","\uAD74\uB9AC\uB294 \uC911","\uBCBC\uB9AC\uB294 \uC911"]:["Thinking","Working","Exploring","Analyzing","Reasoning","Digging in","Crunching","Forging"],[i0,s0]=ce(0),[a0,zt]=ce(x("Thinking","\uC0DD\uAC01\uD558\uB294 \uC911")),fa=Je(0),fn=Je(new Ic),su=Je(new hr),[ha,Lh]=ce(null),Yn=Je(new Gc(3)),[Ur,ma]=ce({}),Fh=Je(async()=>{}),c0=g=>{let S=et.current.find(P=>P.id===g);return!!(S&&S.status==="working"||fn.current.runningFor(g).length>0)};lt(()=>fn.current.onDone(({run:g,result:S})=>{let P=g.agentId;if(su.current.release(g.id),ov({toolErrors:g.toolErrors,aborted:g.status==="aborted",failedWorkers:g.workers.filter(R=>R.status==="idle"&&R.error).length,mutated:g.mutated})){let R=g.toolErrors>=2?x(`${g.toolErrors} tool errors in this run \u2014 /retro to record the trap`,`\uC774\uBC88 \uC2E4\uD589\uC5D0\uC11C \uD234 \uC624\uB958 ${g.toolErrors}\uAC74 \u2014 /retro \uB85C \uD568\uC815 \uAE30\uB85D\uC744 \uB0A8\uAE38 \uC218 \uC788\uC2B5\uB2C8\uB2E4`):x("worker failed \u2014 /retro to record what went wrong","\uC6CC\uCEE4 \uC2E4\uD328 \u2014 /retro \uB85C \uC6D0\uC778\uC744 \uAE30\uB85D\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");ue(O=>O.map(_=>_.id===P?{..._,messages:[..._.messages,{role:"system",content:`\u26A0 ${R}`}]}:_))}if(S&&ue(R=>{let O=R.find(T=>T.id===P);return!O||O.messages.some(T=>T.role==="assistant"&&T.content===S)?R:R.map(T=>T.id===P?{...T,messages:[...T.messages,{role:"assistant",content:S}]}:T)}),fn.current.runningFor(P).length===0){let R=Yn.current.dequeue(P);if(ma(O=>({...O,[P]:Yn.current.count(P)})),R)Fh.current(P,R,{isQueued:!0});else{ue(_=>{let T=_.find(F=>F.id===P);return T?T.persist?_.map(F=>F.id===P?{...F,status:"waiting",workers:[]}:F):_.filter(F=>F.id!==P):_});let O=et.current.find(_=>_.id===P)?.name??P;try{_d({id:`${O}:${g.title.slice(0,60)}`,title:g.title.slice(0,80),status:"done",agent:O})}catch(_){console.error("\uD604\uD669 \uC644\uB8CC \uAE30\uB85D \uC2E4\uD328:",_)}}}}),[]);let au=()=>{fn.current.abortFor(Ae),d0();let g=Yn.current.clear(Ae);ma(S=>({...S,[Ae]:0})),At(Ae,"idle"),g>0&&Nt(Ae,{role:"system",content:x(`\u23F9 Aborted run & cleared ${g} queued prompt(s)`,`\u23F9 \uC791\uC5C5 \uC911\uB2E8 \uBC0F \uB300\uAE30\uC5F4 ${g}\uAC74 \uCDE8\uC18C\uB428`)})},cu=()=>{let g=`a${Date.now().toString(36)}`;ue(S=>[...S,{id:g,name:Ul[(S.length-1)%Ul.length]+S.length,status:"idle",messages:[],persist:!0}]),ri(g)},ga=()=>{if(Ae==="main"){Kn(!0),setTimeout(()=>Kn(!1),2500);return}let g=et.current,S=g.findIndex(_=>_.id===Ae),P=g[S-1]??g[S+1]??g[0],R=Ae;Yn.current.clear(R),ma(_=>{let T={..._};return delete T[R],T});let O=dn.current.get(R);if(O){try{O.kill()}catch{}dn.current.delete(R)}ri(P.id),ue(_=>_.filter(T=>T.id!==R))},lu=g=>{let S=et.current,R=(S.findIndex(O=>O.id===Ae)+g+S.length)%S.length;ri(S[R].id)},jh=g=>{let S=et.current;g>=1&&g<=S.length&&ri(S[g-1].id)},Uh=()=>{ue(g=>g.map(S=>S.id===Ae?{...S,status:S.status==="parked"?"idle":"parked"}:S))},l0=()=>Math.max(0,et.current.findIndex(g=>g.id===Ae)),Xn=g=>{let S={inputEmpty:Ie.length===0,workerCount:et.current.length,showLeft:Se.showLeft,activeRow:l0()},P=Jv(Q,g,S);return Re(P.state),P.activateRow!==void 0&&jh(P.activateRow+1),P.handled},[Qn,uu]=ce(!1),Wr=Je(null),Wh=()=>{Wr.current&&clearTimeout(Wr.current),Wr.current=null,uu(!1)},Bh=()=>{uu(!0),Wr.current&&clearTimeout(Wr.current),Wr.current=setTimeout(()=>uu(!1),2e3)};lt(()=>()=>{Wr.current&&clearTimeout(Wr.current)},[]);let[du,wa]=ce(null),Hh=(g,S)=>{let P=g.toLowerCase();return P==="c"?(cu(),!0):P==="n"||S.rightArrow?(lu(1),!0):P==="p"||S.leftArrow?(lu(-1),!0):P==="x"?(ga(),!0):P==="z"?(Uh(),!0):P==="w"?(Se.showLeft?Xn({type:"focus",to:"workers"}):H("agents"),!0):P==="s"?(H("status"),!0):P==="l"?(l.toggle(),!0):/^[0-9]$/.test(P)?(jh(P==="0"?10:Number(P)),!0):P==="d"?(wa(process.env.PROTOCOL_SESSION?x("detach is handled by the attach client","detach \uB294 attach \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uCC98\uB9AC\uD569\uB2C8\uB2E4"):x("not a detachable session \u2014 start with `protocol attach`","detach \uAC00\uB2A5\uD55C \uC138\uC158\uC774 \uC544\uB2D9\uB2C8\uB2E4 \u2014 `protocol attach` \uB85C \uC2DC\uC791\uD558\uC138\uC694")),setTimeout(()=>wa(null),3e3),!0):P==="?"?(wa(x("\u2303B: c new \xB7 n/p next/prev \xB7 1-9 jump \xB7 x close \xB7 z park \xB7 w workers \xB7 s status \xB7 l sessions \xB7 d detach","\u2303B: c \uC0C8 \uD0ED \xB7 n/p \uB2E4\uC74C/\uC774\uC804 \xB7 1-9 \uC774\uB3D9 \xB7 x \uB2EB\uAE30 \xB7 z \uC77C\uC2DC\uC815\uC9C0 \xB7 w \uC6CC\uCEE4 \xB7 s \uD604\uD669 \xB7 l \uC138\uC158 \xB7 d \uB5BC\uAE30")),setTimeout(()=>wa(null),5e3),!0):!1};lt(()=>{if(vt.status!=="working"){fa.current=0;return}fa.current||(fa.current=Date.now()),zt(Nh[Math.floor(Math.random()*Nh.length)]);let g=setInterval(()=>s0(S=>S+1),120);return()=>{clearInterval(g)}},[vt.status]);let u0=async g=>{At("main","working"),zt(x("Restoring saved point","\uC800\uC7A5\uB41C \uC2DC\uC810 \uBCF5\uC6D0 \uC911"));try{let S=o.getSession()?.user?.id??null,P=new Ne(S),R=await P.loadSnapshot(hn,g.id);if(!R){Nt("main",{role:"system",content:x("\u2715 could not load that saved point.","\u2715 \uADF8 \uC2DC\uC810\uC744 \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.")});return}let O=et.current.find(_=>_.id==="main")?.messages??[];await P.snapshot(hn,`before restore (${O.length})`,O),ue(_=>_.map(T=>T.id==="main"?{...T,messages:R}:T)),Nt("main",{role:"system",content:x(`\u21A9 restored: ${g.label} \xB7 the previous state was saved too (/restore)`,`\u21A9 \uB418\uB3CC\uB9BC: ${g.label} \xB7 \uC9C1\uC804 \uC0C1\uD0DC\uB3C4 \uC800\uC7A5\uB428 (/restore)`)})}finally{At("main","idle")}},pu=()=>{n0(Jn.current[0]??null),o0(Math.max(0,Jn.current.length-1))},fu=g=>new Promise(S=>{Jn.current.push({prompt:g,label:pf.getStore()?.label,resolve:S}),pu()}),hu=g=>{Jn.current.shift()?.resolve(g),pu()},d0=()=>{let g=Jn.current;Jn.current=[];for(let S of g)S.resolve("deny");pu()};lt(()=>{let g=setTimeout(()=>r0("main"),1400),S=o.getSession()?.user?.id;if(S){sf(S).then(R=>{R&&$h(R)}).catch(R=>console.error("\uC0AC\uC6A9\uB7C9 \uC870\uD68C \uC2E4\uD328 \u2014 \uD654\uBA74\uC758 \uC794\uC5EC\uB7C9\uC774 \uB0A1\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4:",R));let P=setInterval(()=>{let R=o.getSession()?.user?.id;R&&sf(R).then(O=>{O&&$h(O)}).catch(O=>console.error("\uC0AC\uC6A9\uB7C9 \uC870\uD68C \uC2E4\uD328:",O))},6e4);return()=>{clearTimeout(g),clearInterval(P)}}return()=>clearTimeout(g)},[]);let Br=Je("unknown"),mu=Je(null),[p0,f0]=ce({state:"offline"}),gu=Je(null),ya=Je(null);ya.current||(ya.current=qc({cleanupTimeoutMs:400,cleanup:async()=>{let g=gu.current?.stop()??Promise.resolve();await Promise.all([g,mu.current?.markAllDone().catch(S=>console.error("\uC6D0\uC7A5 \uC885\uB8CC \uD45C\uC2DC \uC2E4\uD328:",S))])},exit:()=>{r(),process.exit(0)}}));let h0=()=>{ya.current()};lt(()=>{let g=()=>{ya.current()};return process.on("SIGINT",g),process.on("SIGTERM",g),()=>{process.off("SIGINT",g),process.off("SIGTERM",g)}},[]);let m0=Je(null),wu=Je(null),hn=t.sessionName||"default",yu=Yt(),vr=cr(hn),[qh]=ce(()=>new Ne(o.getSession()?.user?.id??null));lt(()=>{let g=new ur;for(let ne of Ua)g.register(ne);let S=t.tier??"default",P=S==="default"?En[(t.permission||"").toLowerCase()]??"WorkspaceWrite":"DangerFullAccess",R=S==="danger"?{mode:P}:S==="yolo"?{mode:P,writeOnlyAllowedPaths:[process.cwd()]}:{mode:P,allowedPaths:[process.cwd()]},O=new Fe(R,S);S==="default"&&O.setConfirmHandler(ne=>fu(ne)),Oh.current=O;let _=new en({permissionManager:O,hookRegistry:g});wu.current=_;let T=new go,F={name:"default",nodes:[{id:"llm",type:"llm",config:{provider:"server",model:"@default"}}],edges:[],entryPoint:"llm"};m0.current={graphEngine:new po(F,_,T)};let W=[{role:"assistant",content:x("Protocol coding agent ready. What can I help with?","Protocol \uCF54\uB529 \uC5D0\uC774\uC804\uD2B8 \uC900\uBE44\uB428. \uBB34\uC5C7\uC744 \uB3C4\uC640\uB4DC\uB9B4\uAE4C\uC694?")}];try{if(Mt.existsSync(vr)){let ne=Mt.readFileSync(vr,"utf-8"),de=JSON.parse(ne);Array.isArray(de)&&de.length>0&&(W=de)}}catch{}S!=="default"&&(W=[{role:"system",content:Es(S,dr()==="ko"?"ko":"en")},...W]),ca(W),(async()=>{try{if(!(o.getSession()?.user?.id??null)){Br.current="offline";return}let de=qh,he=et.current.find(ie=>ie.id==="main")?.messages??W,X=await de.reconcile(hn,he);if(Br.current=X.ok?"ok":"offline",!X.ok)Nt("main",{role:"system",content:x("\u26A0 offline \u2014 saving locally only (cloud sync resumes next launch)","\u26A0 \uC624\uD504\uB77C\uC778 \u2014 \uB85C\uCEEC\uC5D0\uB9CC \uC800\uC7A5\uB429\uB2C8\uB2E4 (\uD074\uB77C\uC6B0\uB4DC \uB3D9\uAE30\uD654\uB294 \uB2E4\uC74C \uC2E4\uD589 \uB54C)")});else if(X.action==="archived"||X.action==="deleted")Br.current="offline",Nt("main",{role:"system",content:x("Conversation archived or unavailable. Local work is retained. Restore with protocol sessions restore <name>.","\uBCF4\uAD00\uB418\uC5C8\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uB294 \uB300\uD654\uC785\uB2C8\uB2E4. \uB85C\uCEEC \uC791\uC5C5\uC740 \uBCF4\uC874\uB429\uB2C8\uB2E4. protocol sessions restore <name>\uC73C\uB85C \uBCF5\uC6D0\uD558\uC138\uC694.")});else if(X.action==="recovered"){ca(X.messages);try{Mt.writeFileSync(vr,JSON.stringify(X.messages,null,2),"utf-8")}catch{}Nt("main",{role:"system",content:x(`\u2713 Recovered ${X.recoveredCount} message(s) processed by server after disconnect. Resuming from latest server state.`,`\u2713 \uC5F0\uACB0 \uB04A\uAE40 \uD6C4 \uC11C\uBC84\uAC00 \uCC98\uB9AC\uD55C ${X.recoveredCount}\uAC1C \uBA54\uC2DC\uC9C0\uB97C \uBCF5\uAD6C\uD588\uC2B5\uB2C8\uB2E4. \uC11C\uBC84 \uCD5C\uC2E0 \uC0C1\uD0DC\uC5D0\uC11C \uC774\uC5B4\uAC11\uB2C8\uB2E4.`)})}else if(X.action==="merged"){ca(X.messages);try{Mt.writeFileSync(vr,JSON.stringify(X.messages,null,2),"utf-8")}catch{}}else X.messages.length>0&&he.length===0&&ca(X.messages)}catch(ne){Br.current="offline";let de=ne.code;(de==="AUTH_EXPIRED"||de==="TOKEN_EXPIRED"||de==="INVALID_REFRESH_TOKEN"||de==="USER_NOT_FOUND"||de==="API_KEY_INVALID")&&(o.clearSession(),Nt("main",{role:"system",content:x("\u26A0 session expired \u2014 exit REPL and run `protocol login` again to reconnect.","\u26A0 \uB85C\uADF8\uC778 \uC138\uC158\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4 \u2014 REPL \uC744 \uB098\uAC00\uC11C `protocol login` \uC744 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.")}))}})(),(async()=>{try{let ne=await Lv();if(Xk(ne),ne.length===0)return;ue(de=>de.map(he=>he.id==="main"?{...he,messages:[...he.messages,{role:"system",content:x(`Tip: connect other agents (/new ${ne[0].binary}) or your own API (/brain).`,`\uD301: \uB2E4\uB978 \uC5D0\uC774\uC804\uD2B8(/new ${ne[0].binary})\uB098 \uB0B4 API(/brain)\uB3C4 \uC5F0\uACB0\uD574\uBCF4\uC138\uC694.`)}]}:he))}catch{}})(),(async()=>{try{let ne=o.getSession()?.user?.id??null;if(!ne)return;let{CliAgentPublisher:de}=await Promise.resolve().then(()=>(Hx(),Bx)),he=new de(ne,hn);await he.cleanupPrevious(),mu.current=he}catch{}})()},[]),lt(()=>{if(t.noRunner)return;let g=P=>ue(R=>R.map(O=>O.id==="main"?{...O,messages:[...O.messages,{role:"system",content:P}]}:O)),S=lh({cwd:process.cwd(),skipIfRunnerLive:!0,requireAuth:!0,lock:{acquire:hl,release:ml},handleSignals:!1,pause:()=>et.current.some(P=>P.status==="working"),onStatus:f0,log:{info:g,error:g}});return gu.current=S,()=>{gu.current=null,S.stop()}},[]),lt(()=>{fe==="workers"&&!Se.showLeft&&Re(g=>({...g,focus:"chat",lastArrow:null}))},[fe,Se.showLeft]),lt(()=>{let g=qe.find(S=>S.id==="main")?.messages??[];if(g.length!==0&&g.some(S=>S.role==="user")){try{Mt.existsSync(yu)||Mt.mkdirSync(yu,{recursive:!0}),Mt.writeFileSync(vr,JSON.stringify(g,null,2),"utf-8"),Br.current==="offline"&&Mt.writeFileSync(co(vr),new Date().toISOString(),"utf-8")}catch{}(async()=>{try{if(!(o.getSession()?.user?.id??null)||Br.current!=="ok")return;await qh.save(hn,g);try{let P=co(vr);Mt.existsSync(P)&&Mt.rmSync(P)}catch{}}catch{Br.current="offline";try{Mt.writeFileSync(co(vr),new Date().toISOString(),"utf-8")}catch{}}})()}},[qe,vr,yu]),lt(()=>{let g=setTimeout(()=>{let S=mu.current;S&&S.sync(qe.map(P=>({id:P.id,name:P.name,status:P.status,lastMessage:P.messages[P.messages.length-1]?.content,provider:P.provider}))).catch(P=>console.error("\uC5D0\uC774\uC804\uD2B8 \uBAA9\uB85D \uB3D9\uAE30\uD654 \uC2E4\uD328 \u2014 \uC6F9\uC5D0\uC11C \uC0C1\uD0DC\uAC00 \uB0A1\uAC8C \uBCF4\uC785\uB2C8\uB2E4:",P))},1e3);return()=>clearTimeout(g)},[qe]),LM((g,S)=>{if(or){let P=g.toLowerCase();if(S.return||P==="y"){hu("once");return}if(P==="a"){hu("session");return}if(P==="n"||S.escape||S.ctrl&&g==="c"){hu("deny");return}return}if(ha){let P=g.toLowerCase();if(S.return||P==="y"){ha.resolve(!0);return}if(P==="n"||S.escape){ha.resolve(!1);return}return}if(jr){if(S.escape){ou(null);return}if(S.upArrow){iu(P=>Math.max(0,P-1));return}if(S.downArrow){iu(P=>Math.min(jr.length-1,P+1));return}if(S.return){let P=jr[ai];ou(null),P&&u0(P);return}return}if(si){if(S.escape||S.return){Mh(!1);return}if(S.upArrow){nu(0);return}if(S.downArrow){nu(1);return}if(S.leftArrow||S.rightArrow){let P=S.rightArrow?1:-1;if(pn===0){let R=da[(da.indexOf(h)+P+da.length)%da.length];w(R),o.set("models",{orch:R})}else{let R=pa[(pa.indexOf(b)+P+pa.length)%pa.length];k(R),o.set("models",{worker:R})}return}return}if(l.open){if(Qn){Wh(),Hh(g,S);return}if(S.ctrl&&g==="b"){Bh();return}if(S.ctrl&&g==="c"){vt.status==="working"?au():(Kn(!0),setTimeout(()=>Kn(!1),2e3));return}if(S.ctrl&&g==="x"){ga();return}if(l.input(g,S))return}if(Q.lastArrow&&!S.leftArrow&&!S.rightArrow&&Re(P=>({...P,lastArrow:null})),fe==="chat"){let P=Ie.startsWith("/")&&!Ie.includes(" ")?Ie.slice(1).toLowerCase():null,R=P!==null?Th.filter(O=>O.cmd.startsWith(P)):[];if(R.length>0){if(S.upArrow){E(O=>Math.max(0,O-1));return}if(S.downArrow){E(O=>Math.min(R.length-1,O+1));return}if(S.tab||S.rightArrow){yt("/"+R[Math.min(A,R.length-1)].cmd+" "),E(0);return}}}if(fe==="chat"){let P=Ce,R=Math.max(0,ba.length-P);if(S.pageUp){y(O=>Math.min(R,O+Math.max(1,P-2)));return}if(S.pageDown){y(O=>Math.max(0,O-Math.max(1,P-2)));return}if(S.upArrow){y(O=>Math.min(R,O+1));return}if(S.downArrow){y(O=>Math.max(0,O-1));return}}if(Qn)return Wh(),Hh(g,S),void 0;if(S.ctrl&&g==="b"){Bh();return}if(fe==="workers"){if(S.escape){Xn({type:"cancel"});return}if(S.return){Xn({type:"confirm"});return}if(S.upArrow||S.downArrow||S.leftArrow||S.rightArrow){Xn({type:"arrow",at:Date.now(),dir:S.upArrow?"up":S.downArrow?"down":S.leftArrow?"left":"right"});return}if(S.ctrl&&g==="n"){cu(),Xn({type:"focus",to:"chat"});return}if(S.ctrl&&g==="x"){ga();return}return}if(!(fe==="chat"&&(S.leftArrow||S.rightArrow)&&!S.ctrl&&!S.meta&&!S.shift&&Xn({type:"arrow",at:Date.now(),dir:S.leftArrow?"left":"right"}))){if(S.escape&&vt.status==="working"){au();return}if(S.ctrl&&g==="x"){ga();return}if(S.ctrl&&g==="n"){cu();return}if(S.ctrl&&g==="p"){Uh();return}if((S.meta||S.shift)&&(S.leftArrow||S.rightArrow)){let P=ee?["agents","chat","status"]:["chat","status"],R=P.indexOf(M),O=P[Math.min(P.length-1,Math.max(0,R+(S.rightArrow?1:-1)))];O==="status"&&bt(),H(O);return}if(S.ctrl&&(S.rightArrow||S.leftArrow)){lu(S.rightArrow?1:-1);return}if(S.ctrl&&g==="c"){if(vt.status==="working"){au();return}Kn(!0),setTimeout(()=>Kn(!1),2e3);return}}});let Gh=async g=>{if(!g.trim())return;let S=Ae,P=R=>ue(O=>O.map(_=>_.id===S?{..._,messages:[..._.messages,R]}:_));if(yt(""),y(0),g.startsWith("/")){let R=g.slice(1).trim().split(/\s+/),O=(R[0]||"").toLowerCase();if(O==="sessions"){l.toggle();return}if(O==="setting"&&R[1]==="ui.theme"){let _=R[2];Gx[_]&&(p(_),o.set("ui",{theme:_}));return}if(O==="model"){let _=(R[1]||"").toLowerCase(),T=(R[2]||"").toLowerCase();if(!_){nu(0),Mh(!0);return}if(_==="orch"||_==="orchestrator"||_==="\uC624\uCF00"){if(T&&T!=="kernel"){P({role:"system",content:x("/model orch \u2014 the orchestrator runs on the default model; there is nothing to switch.","/model orch \u2014 \uC9C0\uD718 \uBAA8\uB378\uC740 \uAE30\uBCF8\uAC12 \uD558\uB098\uBFD0\uC774\uB77C \uBC14\uAFC0 \uAC83\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.")});return}w("kernel"),o.set("models",{orch:"kernel"}),P({role:"system",content:x("orchestrator model \u2192 think","\uC9C0\uD718 \uBAA8\uB378 \u2192 think")});return}if(_==="worker"||_==="\uC77C\uAFBC"||_==="labor"){if(!["fast","think"].includes(T)){P({role:"system",content:x("/model worker fast|think","/model worker fast|think")});return}k(T),o.set("models",{worker:T}),P({role:"system",content:x(`worker model \u2192 ${T}`,`\uC77C\uAFBC(worker) \uBAA8\uB378 \u2192 ${T}`)});return}P({role:"system",content:x(`unknown target: ${_} (orch|worker) \xB7 RAG is fixed to Lite`,`\uC54C \uC218 \uC5C6\uB294 \uB300\uC0C1: ${_} (orch|worker) \xB7 RAG\uB294 Lite \uACE0\uC815\uC774\uB77C \uBCC0\uACBD \uBD88\uAC00`)});return}if(O==="engine"){let _=(R[1]||"").toLowerCase();if(!_){let J=Wv(C);P({role:"system",content:x(`chat.engine=${C}${J?"":" (billed to your own account, not our usage meter)"} (usage: /engine builtin|claude|codex|agy)`,`chat.engine=${C}${J?"":" (\uBCF8\uC778 \uACC4\uC815\uC5D0\uC11C \uB098\uAC11\uB2C8\uB2E4 \u2014 \uC6B0\uB9AC \uC0AC\uC6A9\uB7C9 \uC9D1\uACC4\uC5D0 \uC548 \uC7A1\uD798)"} (\uC0AC\uC6A9\uBC95: /engine builtin|claude|codex|agy)`)});return}if(_==="builtin"){I("builtin"),o.set("chat",{engine:"builtin"}),P({role:"system",content:x("chat.engine \u2192 builtin","chat.engine \u2192 builtin (\uB0B4\uC7A5)")});return}let T=Os(_);if(!T){P({role:"system",content:x("/engine builtin|claude|codex|agy","/engine builtin|claude|codex|agy")});return}if(T.provider==="local"){P({role:"system",content:x("Local model is worker-only. Start it with /new local; the main orchestrator stays on Protocol.","\uB85C\uCEEC \uBAA8\uB378\uC740 \uC77C\uAFBC \uC804\uC6A9\uC785\uB2C8\uB2E4. /new local \uB85C \uC2DC\uC791\uD558\uC138\uC694. \uBA54\uC778 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130\uB294 Protocol\uC744 \uC720\uC9C0\uD569\uB2C8\uB2E4.")});return}if(vf(T.provider,J=>oi.some(W=>W.provider===J)).notice==="not-installed"){P({role:"system",content:x(`\u26A0 ${T.binary} is not installed \u2014 staying on builtin. Install it first (e.g. npm i -g @anthropic-ai/claude-code).`,`\u26A0 ${T.binary} \uAC00 \uC124\uCE58\uB3FC \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 builtin \uC744 \uC720\uC9C0\uD569\uB2C8\uB2E4. \uBA3C\uC800 \uC124\uCE58\uD558\uC138\uC694 (\uC608: npm i -g @anthropic-ai/claude-code).`)});return}I(T.provider),o.set("chat",{engine:T.provider}),P({role:"system",content:x(`chat.engine \u2192 ${T.provider} (${T.accountLabel} account \u2014 these turns do NOT count against our usage meter)`,`chat.engine \u2192 ${T.provider} (${T.accountLabel} \uACC4\uC815 \u2014 \uC774 \uD134\uB4E4\uC740 \uC6B0\uB9AC \uC0AC\uC6A9\uB7C9 \uC9D1\uACC4\uC5D0 \uC7A1\uD788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4)`)});return}if(O==="vision"){let _=(R[1]||"").toLowerCase(),T=(R[2]||"").toLowerCase();if(!_){P({role:"system",content:x(`vision.mode=${G} \xB7 vision.model=${j} (usage: /vision mode auto|off|always \xB7 /vision model <provider>)`,`vision.mode=${G} \xB7 vision.model=${j} (\uC0AC\uC6A9\uBC95: /vision mode auto|off|always \xB7 /vision model <provider>)`)});return}if(_==="mode"){if(!og.includes(T)){P({role:"system",content:x("/vision mode auto|off|always","/vision mode auto|off|always")});return}$(T),o.set("vision",{mode:T}),P({role:"system",content:x(`vision.mode \u2192 ${T}`+(T==="off"?" (no auto-fallback \u2014 you'll be told plainly if the model can't see)":T==="always"?" (every image-bearing request goes to vision.model)":" (silent-but-announced fallback when the active model can't see)"),`vision.mode \u2192 ${T}`+(T==="off"?" (\uC790\uB3D9 \uD3F4\uBC31 \uC5C6\uC74C \u2014 \uBAA8\uB378\uC774 \uBABB \uBCF4\uBA74 \uBA85\uD655\uD788 \uC54C\uB9BD\uB2C8\uB2E4)":T==="always"?" (\uC774\uBBF8\uC9C0\uAC00 \uC788\uC73C\uBA74 \uD56D\uC0C1 vision.model \uB85C \uBCF4\uB0C5\uB2C8\uB2E4)":" (\uD65C\uC131 \uBAA8\uB378\uC774 \uBABB \uBCF4\uBA74 \uC54C\uB9AC\uBA74\uC11C \uC790\uB3D9 \uD3F4\uBC31)"))});return}if(_==="model"){let F=["server","google","anthropic","openai","deepseek","glm"],J=T==="default"?"server":T;if(!F.includes(J)){P({role:"system",content:x("/vision model default","/vision model default")});return}Y(J),o.set("vision",{model:J});let W=Jk(J)!==null;P({role:"system",content:W?x(`vision.model \u2192 ${T}`,`vision.model \u2192 ${T}`):x(`vision.model \u2192 ${T} (\u26A0 no provider implementation yet \u2014 vision requests will refuse until it exists)`,`vision.model \u2192 ${T} (\u26A0 \uC544\uC9C1 provider \uAD6C\uD604\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uAD6C\uD604 \uC804\uAE4C\uC9C0 vision \uC694\uCCAD\uC740 \uAC70\uBD80\uB429\uB2C8\uB2E4)`)});return}P({role:"system",content:x("unknown target: "+_+" (mode|model)","\uC54C \uC218 \uC5C6\uB294 \uB300\uC0C1: "+_+" (mode|model)")});return}if(O==="new"||O==="agent"){let _=`a${Date.now().toString(36)}`,T=R[1],F=T?Os(T):null;if(T&&!F){P({role:"system",content:x(`unknown agent: ${T} (available: claude, agy, local \u2014 empty = protocol)`,`\uC54C \uC218 \uC5C6\uB294 \uC5D0\uC774\uC804\uD2B8: ${T} (\uAC00\uB2A5: claude, agy, local \u2014 \uBE44\uC6B0\uBA74 protocol)`)});return}ue(J=>{let W=F?`${F.tabPrefix}${J.filter(de=>de.provider===F.provider).length+1}`:Ul[(J.length-1)%Ul.length]+J.length,ne=F?[{role:"system",content:F.provider==="local"?x("Local model worker tab \u2014 uses your local OpenAI-compatible server.","\uB85C\uCEEC \uBAA8\uB378 \uC77C\uAFBC \uD0ED \u2014 \uB0B4 \uB85C\uCEEC OpenAI \uD638\uD658 \uC11C\uBC84\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4."):x(`${F.binary} agent tab \u2014 runs in this folder on your ${F.accountLabel} account/sub.`,`${F.binary} \uC5D0\uC774\uC804\uD2B8 \uD0ED \u2014 \uB0B4 ${F.accountLabel} \uACC4\uC815/\uAD6C\uB3C5\uC73C\uB85C \uC774 \uD3F4\uB354\uC5D0\uC11C \uC2E4\uD589\uB429\uB2C8\uB2E4.`)},...F.provider==="local"?[]:[{role:"system",content:x(`\u26A0 ${F.binary} runs under its own permissions \u2014 Protocol's approval gate does not apply here. You'll see what it did, after it did it.`,`\u26A0 ${F.binary}\uB294 \uC790\uAE30 \uAD8C\uD55C\uC73C\uB85C \uC2E4\uD589\uB429\uB2C8\uB2E4 \u2014 Protocol\uC758 \uC2B9\uC778 \uAC8C\uC774\uD2B8\uAC00 \uAC78\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uBB34\uC5C7\uC744 \uD588\uB294\uC9C0\uB294 \uC2E4\uD589 \uD6C4\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.`)}]]:[];return[...J,{id:_,name:W,status:"idle",messages:ne,provider:F?.provider,persist:!0}]}),ri(_);return}if(O==="ask"){let _=R[1],T=R.slice(2).join(" "),F=_?et.current.find(J=>J.name.toLowerCase()===_.toLowerCase()):null;if(!F||!T){P({role:"system",content:x("usage: /ask <agent> <message> (names via /agents)","\uC0AC\uC6A9\uBC95: /ask <\uC5D0\uC774\uC804\uD2B8\uC774\uB984> <\uBA54\uC2DC\uC9C0> (\uC774\uB984\uC740 /agents \uB85C \uD655\uC778)")});return}P({role:"system",content:x(`\u2192 sent to ${F.name} (\u2303\u2192 to that tab for full reply)`,`\u2192 ${F.name}\uC5D0\uAC8C \uC804\uB2EC (\u2303\u2192 \uB85C \uD0ED \uC774\uB3D9\uD574 \uC804\uCCB4 \uC751\uB2F5 \uD655\uC778)`)}),At(S,"working"),zt(x(`Waiting for ${F.name}`,`${F.name} \uC751\uB2F5 \uB300\uAE30 \uC911`)),ua(F.id,T).then(J=>{P({role:"system",content:`[${F.name}] ${J.length>400?J.slice(0,400)+"\u2026":J}`})}).finally(()=>{At(S,"idle")});return}if(O==="team"){let _=R.slice(1).join(" ");if(!_){P({role:"system",content:x("usage: /team <task>","\uC0AC\uC6A9\uBC95: /team <\uC5C5\uBB34 \uC124\uBA85>")});return}let T=Ih(S);if(T.length===0){P({role:"system",content:x("no workers \u2014 create one first with /new [claude|agy|codex].","\uC6CC\uCEE4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 /new [claude|agy|codex] \uB85C \uBA3C\uC800 \uB9CC\uB4DC\uC138\uC694.")});return}(async()=>{At(S,"working"),zt(x("Splitting task across workers","\uC5C5\uBB34 \uBD84\uB2F4 \uC911"));try{P({role:"system",content:x(`splitting task\u2026 (${T.length} workers: ${T.map(X=>X.name).join(", ")})`,`\uC5C5\uBB34 \uBD84\uB2F4 \uC911\u2026 (\uC6CC\uCEE4 ${T.length}: ${T.map(X=>X.name).join(", ")})`)});let F=T.map(X=>`- ${X.name} (${X.provider??"protocol"})`).join(`
|
|
648
|
+
`),J;try{let X=await zn(`Task: ${_}
|
|
649
|
+
|
|
650
|
+
Available agents:
|
|
651
|
+
${F}`,'You are a multi-agent orchestrator. Split the task per agent and answer ONLY as a JSON array: [{"agent":"name","subtask":"instruction"}]. JSON only, no code fences. Consider agent strengths (claude-code/codex are strong at code).');if(J=JSON.parse(X.replace(/```json|```/g,"").trim()),!Array.isArray(J)||J.length===0)throw new Error("empty")}catch{J=T.map(X=>({agent:X.name,subtask:_}))}let W=J.map(X=>({subtask:String(X?.subtask||_),w:T.find(ie=>ie.name.toLowerCase()===String(X?.agent).toLowerCase())})).filter(X=>!!X.w);W.length===0&&(W=T.map(X=>({subtask:_,w:X})));for(let{subtask:X,w:ie}of W)P({role:"system",content:`\u2192 ${ie.name}: ${X}`});zt(x("Workers running in parallel","\uC6CC\uCEE4 \uBCD1\uB82C \uC2E4\uD589 \uC911"));let de=(await Promise.allSettled(W.map(({subtask:X,w:ie})=>ua(ie.id,X)))).map((X,ie)=>{let te=W[ie].w;if(X.status==="fulfilled")return`## ${te.name}
|
|
652
|
+
${X.value}`;let Oe=X.reason?.message??String(X.reason);return P({role:"system",content:x(`\u2715 ${te.name} failed: ${Oe}`,`\u2715 ${te.name} \uC2E4\uD328: ${Oe}`)}),`## ${te.name}
|
|
653
|
+
FAILED: ${Oe}`});zt(x("Synthesizing results","\uACB0\uACFC \uCDE8\uD569 \uC911"));let he=await zn(`Original task: ${_}
|
|
654
|
+
|
|
655
|
+
Per-agent results:
|
|
656
|
+
${de.join(`
|
|
657
|
+
|
|
658
|
+
`)}`,"Synthesize the worker results into a concise final answer. Point out any gaps or conflicts.");P({role:"assistant",content:he}),Hv(_,W.map(({subtask:X,w:ie})=>({agent:ie.name,subtask:X})),W.map(({w:X},ie)=>({agent:X.name,text:de[ie]?.replace(/^## .*\n/,"")??""})),he).then(X=>{X&&P({role:"system",content:x("\u{1F4CB} team run logged \u2014 review in web/mobile Plans","\u{1F4CB} \uC774 \uD300 \uC2E4\uD589\uC774 \uAE30\uD68D\uC11C\uC5D0 \uAE30\uB85D\uB428 \u2014 \uC6F9/\uBAA8\uBC14\uC77C Plans\uC5D0\uC11C \uB9AC\uBDF0 \uAC00\uB2A5")})})}catch(F){P({role:"system",content:x(`team run failed: ${F.message}`,`\uD300 \uC2E4\uD589 \uC2E4\uD328: ${F.message}`)})}finally{At(S,"idle")}})();return}if(O==="debate"){let _=R.slice(1).join(" ");if(!_){P({role:"system",content:x("usage: /debate <topic>","\uC0AC\uC6A9\uBC95: /debate <\uC8FC\uC81C>")});return}let T=Ih(S);if(T.length<2){P({role:"system",content:x("debate needs 2+ workers \u2014 create them with /new [claude|agy|codex].","\uD1A0\uB860\uC5D4 \uC6CC\uCEE4 2 \uC774\uC0C1 \uD544\uC694 \u2014 /new [claude|agy|codex] \uB85C \uB9CC\uB4DC\uC138\uC694.")});return}(async()=>{At(S,"working"),zt(x("Debate in progress","\uD1A0\uB860 \uC9C4\uD589 \uC911"));try{P({role:"system",content:x(`debate: ${T.map(ie=>ie.name).join(" vs ")}`,`\uD1A0\uB860 \uC2DC\uC791: ${T.map(ie=>ie.name).join(" vs ")}`)});let F=(ie,te)=>{let Oe=te?.message??String(te);return P({role:"system",content:x(`\u2715 ${ie} dropped out: ${Oe}`,`\u2715 ${ie} \uC774\uD0C8: ${Oe}`)}),Oe};zt(x("Debate round 1: positions","\uD1A0\uB860 1\uB77C\uC6B4\uB4DC: \uAC01\uC790 \uC785\uC7A5 \uC9C4\uC220 \uC911"));let W=(await Promise.allSettled(T.map(ie=>ua(ie.id,`[Debate round 1] Topic: ${_}
|
|
659
|
+
State your position and reasoning concisely.`)))).flatMap((ie,te)=>ie.status==="fulfilled"?[{name:T[te].name,id:T[te].id,text:ie.value}]:(F(T[te].name,ie.reason),[]));if(W.length===0){P({role:"system",content:x("\u2715 no participants left \u2014 debate aborted.","\u2715 \uB0A8\uC740 \uCC38\uAC00\uC790 \uC5C6\uC74C \u2014 \uD1A0\uB860 \uC911\uB2E8.")});return}zt(x("Debate round 2: rebuttals","\uD1A0\uB860 2\uB77C\uC6B4\uB4DC: \uBC18\uB860 \uBC0F \uBCF4\uAC15 \uC911"));let de=(await Promise.allSettled(W.map(ie=>{let te=W.filter(Oe=>Oe.id!==ie.id).map(Oe=>`### ${Oe.name}
|
|
660
|
+
${Oe.text}`).join(`
|
|
661
|
+
|
|
662
|
+
`);return ua(ie.id,`[Debate round 2] Other participants' positions:
|
|
663
|
+
${te}
|
|
664
|
+
|
|
665
|
+
Note where you agree/disagree and give your final position.`)}))).map((ie,te)=>({name:W[te].name,text:ie.status==="fulfilled"?ie.value:(F(W[te].name,ie.reason),W[te].text)})),he=de.map(ie=>`## ${ie.name} (final)
|
|
666
|
+
${ie.text}`).join(`
|
|
667
|
+
|
|
668
|
+
`);zt(x("Debate verdict","\uD1A0\uB860 \uD310\uC815 \uC911"));let X=await zn(`Debate topic: ${_}
|
|
669
|
+
|
|
670
|
+
${he}`,"You are the debate judge. Summarize points of agreement/contention and rule on the best-supported conclusion.");P({role:"assistant",content:X}),Gv(_,de.map(ie=>({name:ie.name,text:ie.text})),X).then(ie=>{ie&&P({role:"system",content:x("\u{1F4CB} debate logged \u2014 review in web/mobile Plans","\u{1F4CB} \uC774 \uD1A0\uB860\uC774 \uAE30\uD68D\uC11C\uC5D0 \uAE30\uB85D\uB428 \u2014 \uC6F9/\uBAA8\uBC14\uC77C Plans\uC5D0\uC11C \uB9AC\uBDF0 \uAC00\uB2A5")})})}catch(F){P({role:"system",content:x(`debate failed: ${F.message}`,`\uD1A0\uB860 \uC2E4\uD589 \uC2E4\uD328: ${F.message}`)})}finally{At(S,"idle")}})();return}if(O==="brain"){let _=(R[1]||"").toLowerCase();if(_==="auto"||_==="byo"){P({role:"system",content:x("external CLI as brain was removed \u2014 it stores our orchestration prompts in your local transcript. Use the default server, and bring external agents in as workers (/new claude).","\uC678\uBD80 CLI\uB97C \uB450\uB1CC\uB85C \uC4F0\uB294 \uBAA8\uB4DC\uB294 \uC81C\uAC70\uB410\uC2B5\uB2C8\uB2E4 \u2014 \uC6B0\uB9AC \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uC158 \uD504\uB86C\uD504\uD2B8\uAC00 \uB85C\uCEEC \uD2B8\uB79C\uC2A4\uD06C\uB9BD\uD2B8\uC5D0 \uC800\uC7A5\uB418\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4. \uAE30\uBCF8 server\uB97C \uC4F0\uACE0, \uC678\uBD80 \uC5D0\uC774\uC804\uD2B8\uB294 \uC6CC\uCEE4\uB85C \uBD99\uC774\uC138\uC694 (/new claude).")});return}if(_==="server"){Yk(_),P({role:"system",content:x("brain: server (protocol default)","\uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130 \uB450\uB1CC: server (protocol \uC11C\uBC84)")});return}P({role:"system",content:x(`brain: ${Zl} \u2192 ${eu(la())} \xB7 usage: /brain server`,`\uD604\uC7AC \uB450\uB1CC: ${Zl} \u2192 ${eu(la())} \xB7 \uC0AC\uC6A9\uBC95: /brain server`)});return}if(O==="permissions"||O==="perm"){let _=Oh.current;if(!_){P({role:"system",content:x("permission manager not initialized yet.","\uAD8C\uD55C \uB9E4\uB2C8\uC800\uAC00 \uC544\uC9C1 \uCD08\uAE30\uD654\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.")});return}let T=(R[1]||"").toLowerCase();if(!T){let J={ReadOnly:"readonly",WorkspaceWrite:"workspace",DangerFullAccess:"full"}[_.getPolicy().mode],W=_.getTier(),ne=x(`prompts: ${W==="default"?"on":"OFF"} \xB7 writes outside this folder: ${W==="danger"?"ALLOWED":"blocked"} \xB7 bash sandbox: ${W==="danger"?"OFF":"on"} \xB7 catastrophic commands: blocked`,`\uD655\uC778 \uD504\uB86C\uD504\uD2B8: ${W==="default"?"\uCF1C\uC9D0":"\uAEBC\uC9D0"} \xB7 \uD604\uC7AC \uD3F4\uB354 \uBC16 \uC4F0\uAE30: ${W==="danger"?"\uD5C8\uC6A9\uB428":"\uCC28\uB2E8"} \xB7 bash \uC0CC\uB4DC\uBC15\uC2A4: ${W==="danger"?"\uAEBC\uC9D0":"\uCF1C\uC9D0"} \xB7 \uD30C\uAD34\uC801 \uBA85\uB839: \uCC28\uB2E8`);P({role:"system",content:x(`permission tier: ${W} (${Kr[W].en}) \xB7 mode: ${J}
|
|
671
|
+
${ne}
|
|
672
|
+
usage: /permissions [readonly|workspace|full|default|yolo|danger|reset]`,`\uAD8C\uD55C \uD2F0\uC5B4: ${W} (${Kr[W].ko}) \xB7 \uBAA8\uB4DC: ${J}
|
|
673
|
+
${ne}
|
|
674
|
+
\uC0AC\uC6A9\uBC95: /permissions [readonly|workspace|full|default|yolo|danger|reset]`)});return}if(T==="reset"){_.clearSessionApprovals(),P({role:"system",content:x('cleared "always allow this session" cache \u2014 will re-ask on the next risky action.','"\uC774\uBC88 \uC138\uC158 \uD56D\uC0C1 \uD5C8\uC6A9" \uCE90\uC2DC\uB97C \uCD08\uAE30\uD654\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC74C \uC704\uD5D8 \uC791\uC5C5\uBD80\uD130 \uB2E4\uC2DC \uD655\uC778\uD569\uB2C8\uB2E4.')});return}if(T==="default"||T==="yolo"||T==="danger"){let J=dr()==="ko"?"ko":"en",W=T;if(W===_.getTier()){P({role:"system",content:x(`already ${W}.`,`\uC774\uBBF8 ${W} \uC785\uB2C8\uB2E4.`)});return}if(W!=="default"){if(W==="danger"&&typeof process.getuid=="function"&&process.getuid()===0){P({role:"system",content:x("danger cannot be enabled as root. Use yolo (which keeps the rails on).","root \uB85C\uB294 danger \uB97C \uCF24 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. yolo \uB97C \uC4F0\uC138\uC694(\uB808\uC77C\uC774 \uC720\uC9C0\uB429\uB2C8\uB2E4).")});return}if(await fu({toolName:"permissions",action:`permissions \u2192 ${W}`,risk:"high",message:Bb(W,J)})==="deny"){P({role:"system",content:x("cancelled \u2014 approval gate unchanged.","\uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uC2B9\uC778 \uAC8C\uC774\uD2B8\uB294 \uADF8\uB300\uB85C\uC785\uB2C8\uB2E4.")});return}}_.setTier(W);let ne=W==="default"?"WorkspaceWrite":"DangerFullAccess";_.setPolicy(W==="danger"?{mode:ne}:W==="yolo"?{mode:ne,writeOnlyAllowedPaths:[process.cwd()]}:{mode:ne,allowedPaths:[process.cwd()]}),_.setConfirmHandler(W==="default"?de=>fu(de):null),P({role:"system",content:W==="default"?x("approval gate on \u2014 asks before risky actions.","\uC2B9\uC778 \uAC8C\uC774\uD2B8 \uCF1C\uC9D0 \u2014 \uC704\uD5D8 \uC791\uC5C5 \uC804\uC5D0 \uD655\uC778\uD569\uB2C8\uB2E4."):Es(W,J)});return}let F=En[T];if(!F){P({role:"system",content:x(`unknown mode: ${T} (readonly|workspace|full|default|yolo|danger|reset)`,`\uC54C \uC218 \uC5C6\uB294 \uAC12: ${T} (readonly|workspace|full|default|yolo|danger|reset)`)});return}_.setPolicy({..._.getPolicy(),mode:F}),P({role:"system",content:x(`permission mode \u2192 ${T}`,`\uAD8C\uD55C \uBAA8\uB4DC \uBCC0\uACBD: ${T}`)});return}if(O==="kill"){let _=R[1],T=_?et.current.find(J=>J.name.toLowerCase()===_.toLowerCase()):null;if(!T){P({role:"system",content:x("usage: /kill <agent> (names via /agents)","\uC0AC\uC6A9\uBC95: /kill <\uC5D0\uC774\uC804\uD2B8\uC774\uB984> (\uC774\uB984\uC740 /agents \uB85C \uD655\uC778)")});return}let F=dn.current.get(T.id);if(!F){P({role:"system",content:x(`${T.name}: no running external process.`,`${T.name}: \uC2E4\uD589 \uC911\uC778 \uC678\uBD80 \uD504\uB85C\uC138\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`)});return}F.kill(),P({role:"system",content:x(`sent SIGTERM to ${T.name}.`,`${T.name} \uD504\uB85C\uC138\uC2A4\uC5D0 \uC885\uB8CC \uC2E0\uD638(SIGTERM)\uB97C \uBCF4\uB0C8\uC2B5\uB2C8\uB2E4.`)});return}if(O==="exit"||O==="quit"){h0();return}if(O==="lang"||O==="language"){let _=(R[1]||"").toLowerCase();if(_!=="en"&&_!=="ko"){P({role:"system",content:x("usage: /lang en|ko","\uC0AC\uC6A9\uBC95: /lang en|ko")});return}ji(_),u(_),o.set("ui",{language:_}),P({role:"system",content:_==="ko"?"\uC5B8\uC5B4: \uD55C\uAD6D\uC5B4 (UI\xB7AI \uC751\uB2F5 \uC801\uC6A9)":"Language: English (applies to UI & AI replies)"});return}if(O==="restore"){(async()=>{let _=o.getSession()?.user?.id??null,T=await new Ne(_).listSnapshots(hn);if(T.length===0){P({role:"system",content:x("no saved points yet \u2014 one is kept automatically before anything overwrites this session.","\uC800\uC7A5\uB41C \uC2DC\uC810\uC774 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774 \uC138\uC158\uC744 \uB36E\uC5B4\uC4F0\uB294 \uC791\uC5C5 \uC9C1\uC804\uB9C8\uB2E4 \uC790\uB3D9\uC73C\uB85C \uD558\uB098\uC529 \uB0A8\uC2B5\uB2C8\uB2E4.")});return}iu(0),ou(T)})();return}if(O==="park"){ue(_=>_.map(T=>T.id===S?{...T,status:T.status==="parked"?"idle":"parked"}:T));return}if(O==="clear"){ue(_=>_.map(T=>T.id===S?{...T,messages:[]}:T));return}if(O==="agents"){P({role:"system",content:"agents: "+qe.map(_=>`${_.name}(${_.status})`).join(", ")});return}if(O==="login"){P({role:"system",content:x(`Login requires a browser. Exit REPL first (\u2303X then /exit), then run: protocol login
|
|
675
|
+
This opens protocolai.tech for Google sign-in and saves the session locally.`,`\uB85C\uADF8\uC778\uC740 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4. REPL \uC744 \uC885\uB8CC\uD558\uACE0(\u2303X \uD6C4 /exit) \uB2E4\uC74C \uBA85\uB839\uC744 \uC2E4\uD589\uD558\uC138\uC694: protocol login
|
|
676
|
+
protocolai.tech \uAC00 \uC5F4\uB824 Google \uB85C\uADF8\uC778 \u2192 \uB85C\uCEEC\uC5D0 \uC138\uC158 \uC800\uC7A5.`)});return}if(O==="logout"){o.clearSession(),Br.current="offline",P({role:"system",content:x("Signed out. Local session cleared. To use Protocol again, exit and run: protocol login","\uB85C\uADF8\uC544\uC6C3\uB428. \uB85C\uCEEC \uC138\uC158\uC774 \uC9C0\uC6CC\uC84C\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC4F0\uB824\uBA74 REPL \uC744 \uB098\uAC00\uC11C \uC2E4\uD589: protocol login")});return}if(O==="retro"){(async()=>{let _=fn.current.list().filter(F=>F.status==="done"||F.status==="failed").slice(-3);if(_.length===0){P({role:"system",content:x("no completed runs to review yet.","\uC544\uC9C1 \uBCF5\uAE30\uD560 \uC2E4\uD589\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.")});return}let T=_.map(F=>`- run ${F.id.slice(0,8)}: ${F.title.slice(0,100)} \xB7 toolErrors=${F.toolErrors} \xB7 status=${F.status}${F.error?` \xB7 error=${F.error}`:""}`).join(`
|
|
677
|
+
`);P({role:"system",content:x("\xBB reviewing recent runs\u2026","\xBB \uCD5C\uADFC \uC2E4\uD589 \uBCF5\uAE30 \uC911\u2026")}),At(S,"working"),zt(x("Reviewing traps in recent runs","\uCD5C\uADFC \uC2E4\uD589 \uD568\uC815 \uBCF5\uAE30 \uC911"));try{let F=await zn(`Recent runs:
|
|
678
|
+
${T}
|
|
679
|
+
|
|
680
|
+
Identify the most important trap worth recording. If nothing qualifies, say {"file":"none"}.`,cv),J=iv(F);if(!J){P({role:"system",content:x("nothing worth recording this time.","\uC774\uBC88\uC5D4 \uB0A8\uAE38 \uB9CC\uD55C \uD568\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.")});return}if(lf(JSON.stringify(J))){P({role:"system",content:x("retro blocked \u2014 secret/credential detected in note.","\uBCF5\uAE30 \uCC28\uB2E8 \u2014 \uB178\uD2B8\uC5D0 \uBE44\uBC00\uAC12\uC774 \uC11E\uC600\uC2B5\uB2C8\uB2E4.")});return}let W=sv(J);P({role:"system",content:W+`
|
|
681
|
+
`+x("[y] write this into the file [n] discard","[y] \uD30C\uC77C\uC5D0 \uAE30\uB85D [n] \uBC84\uB9AC\uAE30")}),Lh({note:J,resolve:ne=>{if(Lh(null),!ne){P({role:"system",content:x("retro discarded.","\uBCF5\uAE30 \uBC84\uB824\uC9D0.")});return}let de=av(J);de.ok?P({role:"system",content:x(`\u2713 trap recorded in ${de.file}`,`\u2713 ${de.file}\uC5D0 \uD568\uC815 \uAE30\uB85D \uB0A8\uAE40`)}):P({role:"system",content:x(`\u2715 could not write: ${de.reason}`,`\u2715 \uC4F8 \uC218 \uC5C6\uC74C: ${de.reason}`)})}})}catch(F){P({role:"system",content:x(`retro failed: ${F.message}`,`\uBCF5\uAE30 \uC2E4\uD328: ${F.message}`)})}finally{At(S,"idle")}})();return}if(O==="help"){let _=["\u2014 \uC790\uC8FC \uC4F0\uB294 \uAC83 \u2014","/new [claude|agy|codex] \uC6CC\uCEE4 \uD0ED \uB9CC\uB4E4\uAE30 (\uBE44\uC6B0\uBA74 \uAE30\uBCF8 \uB124\uC774\uD2F0\uBE0C \uC6CC\uCEE4)","/team <\uC5C5\uBB34> \uBAA8\uB4E0 \uC6CC\uCEE4\uC5D0 \uBD84\uB2F4\uD574\uC11C \uBCD1\uB82C \uC2E4\uD589 \u2192 \uCDE8\uD569","/ask <\uC774\uB984> <\uBA54\uC2DC\uC9C0> \uD2B9\uC815 \uC6CC\uCEE4\uC5D0 \uD55C \uBC88\uB9CC \uBCF4\uB0B4\uACE0 \uC751\uB2F5\uC740 \uC5EC\uAE30\uC5D0","/debate <\uC8FC\uC81C> \uC6CC\uCEE4 \uD1A0\uB860 \u2192 \uC785\uC7A5\xB7\uBC18\uB860\xB7\uD310\uC815","/retro \uB118\uC5B4\uC9C4 \uC6D0\uC778\uC744 \uD30C\uC77C\uC5D0 \uAE30\uB85D (\uC99D\uC0C1\u2192\uC6D0\uC778\u2192\uADDC\uCE59)","/restore \uC800\uC7A5\uB41C \uC2DC\uC810 \uBAA9\uB85D\uC5D0\uC11C \uACE8\uB77C \uB418\uB3CC\uB9AC\uAE30","/sessions \uC800\uC7A5\uB41C \uC138\uC158 \uBAA9\uB85D \uD1A0\uAE00 (Ctrl+B l)","/clear \uD604\uC7AC \uC5D0\uC774\uC804\uD2B8 \uB300\uD654 \uBE44\uC6B0\uAE30","/exit \uC138\uC158 \uC885\uB8CC\uD558\uACE0 \uC571 \uB2EB\uAE30","","\u2014 \uC124\uC815\xB7\uC6B4\uC601 \u2014","/model [orch|worker] [\uAC12] \uC9C0\uD718 / \uC77C\uAFBC \uBAA8\uB378(fast|think) \uBCC0\uACBD","/vision [mode|model] [\uAC12] \uC774\uBBF8\uC9C0 \uD3F4\uBC31: mode auto|off|always \xB7 model <provider>","/engine [builtin|claude|codex|agy] \uBA54\uC778 \uCC44\uD305\uC744 \uBB34\uC5C7\uC774 \uB2F5\uD560\uC9C0 (\uC678\uBD80 \uC5D4\uC9C4\uC740 \uBCF8\uC778 \uACC4\uC815 \uACFC\uAE08)","/brain [server] \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130 \uB450\uB1CC \uC120\uD0DD (\uAE30\uBCF8 server=\uC6B0\uB9AC \uC11C\uBC84)","/permissions [readonly|workspace|full] \uC5D0\uC774\uC804\uD2B8\uAC00 \uAC74\uB4DC\uB9B4 \uC218 \uC788\uB294 \uBC94\uC704"," readonly \uC77D\uAE30\uB9CC \xB7 workspace \uD604\uC7AC \uD3F4\uB354 \uC77D\uAE30/\uC4F0\uAE30 \xB7 full \uC804\uCCB4 \uD5C8\uC6A9 (\uC704\uD5D8)","/lang en|ko UI\xB7AI \uC751\uB2F5 \uC5B8\uC5B4 \uC804\uD658","/park \uD604\uC7AC \uC5D0\uC774\uC804\uD2B8 \uD0ED \uC77C\uC2DC\uC815\uC9C0/\uC7AC\uAC1C","/kill <\uC774\uB984> \uC678\uBD80 \uC5D0\uC774\uC804\uD2B8 \uD504\uB85C\uC138\uC2A4 \uAC15\uC81C \uC885\uB8CC","/agents \uBAA8\uB4E0 \uC5D0\uC774\uC804\uD2B8 \uD0ED\uACFC \uC0C1\uD0DC \uBCF4\uAE30","","\u2014 \uC628\uB77C\uC778 \u2014","\uC774 \uC571\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 \uC774 \uAE30\uAE30\uB294 \uC628\uB77C\uC778\uC774\uB77C, \uC6F9/\uD3F0\uC5D0\uC11C \uC2B9\uC778\uD55C \uC77C\uC774 \uC5EC\uAE30\uC11C \uC2E4\uD589\uB429\uB2C8\uB2E4.","\uB044\uACE0 \uC2F6\uC73C\uBA74 `protocol --no-runner` \uB85C \uC2DC\uC791\uD558\uC138\uC694 (\uD478\uD130\uC5D0 \uD604\uC7AC \uC0C1\uD0DC\uAC00 \uB739\uB2C8\uB2E4).","","\u2014 \uACC4\uC815 \u2014","/login \uB85C\uADF8\uC778 \uBC29\uBC95 \uC548\uB0B4 (REPL \uB098\uAC00\uC11C protocol login)","/logout \uB85C\uADF8\uC544\uC6C3\uD558\uACE0 \uC138\uC158 \uC9C0\uC6B0\uAE30","","\u2014 \uB2E8\uCD95\uD0A4 \u2014","Ctrl+N \uC0C8 \uC5D0\uC774\uC804\uD2B8 \uD0ED Ctrl+\u2190/\u2192 \uD0ED \uC804\uD658 Ctrl+X \uD0ED \uB2EB\uAE30","Shift+\u2190/\u2192 \uD654\uBA74 \uC804\uD658 (\uC5D0\uC774\uC804\uD2B8\u2194\uB300\uD654\u2194\uD604\uD669) Esc \uD604\uC7AC \uC791\uC5C5 \uC911\uB2E8"].join(`
|
|
682
|
+
`),T=["\u2014 Frequent \u2014","/new [claude|agy|codex] spawn a worker tab (blank = native worker)","/team <task> split across all workers \u2192 synthesize","/ask <name> <msg> send a one-off to a worker, reply appears here","/debate <topic> workers state positions \u2192 rebut \u2192 verdict","/retro record a trap (symptom\u2192cause\u2192rule) into the file","/restore pick a saved point to go back to","/clear wipe the current agent's chat","/sessions toggle saved sessions (Ctrl+B l)","/exit end session and close the app","","\u2014 Settings \u2014","/model [orch|worker] [val] change orchestrator / worker (fast|think) model","/vision [mode|model] [val] image fallback: mode auto|off|always \xB7 model <provider>","/engine [builtin|claude|codex|agy] who answers the main chat (external = your own account)","/brain [server] orchestrator brain (default: server = our backend)","/permissions [readonly|workspace|full] what the agent is allowed to change"," readonly read-only \xB7 workspace read/write cwd \xB7 full no restrictions (danger)","/lang en|ko switch UI and AI reply language","/park pause/resume the current agent tab","/kill <name> force-stop an external agent process","/agents list all agent tabs and their status","","\u2014 Online \u2014","While this app is open the device is online \u2014 work you approve on web/phone runs here.","Start with `protocol --no-runner` to opt out (the footer shows the current state).","","\u2014 Account \u2014","/login how to sign in (exit REPL, run: protocol login)","/logout sign out and clear saved session","","\u2014 Shortcuts \u2014","Ctrl+N new agent tab Ctrl+\u2190/\u2192 switch tab Ctrl+X close tab","Shift+\u2190/\u2192 switch pane (agents\u2194chat\u2194status) Esc abort current run"].join(`
|
|
683
|
+
`);P({role:"system",content:x(T,_)});return}if(O==="login"||O==="logout")return;if(!/^\d{1,5}$/.test(O)){let T=["new","ask","team","debate","model","brain","permissions","kill","lang","restore","park","agents","clear","help","exit","login","logout"].filter(J=>J.startsWith(O)||O.startsWith(J.slice(0,3))).slice(0,3),F=T.length?x(` did you mean: ${T.map(J=>"/"+J).join(", ")}?`,` \uD639\uC2DC: ${T.map(J=>"/"+J).join(", ")}?`):"";P({role:"system",content:x(`unknown command: /${O} \u2014 type /help${F}`,`\uC54C \uC218 \uC5C6\uB294 \uBA85\uB839: /${O} \u2014 /help \uB85C \uBAA9\uB85D \uBCF4\uAE30${F}`)})}return}if(c0(S)){let R=Yn.current.enqueue(S,g);ma(O=>({...O,[S]:Yn.current.count(S)})),P({role:"user",content:g}),R.ok?P({role:"system",content:x(`\u{1F4CB} Queued [${R.count}/${R.max}] \u2014 will run automatically when current task finishes.`,`\u{1F4CB} \uB300\uAE30\uC5F4\uC5D0 \uB4F1\uB85D\uB428 [${R.count}/${R.max}] \u2014 \uD604\uC7AC \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uC21C\uCC28 \uC2E4\uD589\uB429\uB2C8\uB2E4.`)}):P({role:"system",content:x(`\u26A0 Queue full (${R.max}/${R.max}) \u2014 prompt not queued. Please wait for current task to finish.`,`\u26A0 \uB300\uAE30\uC5F4\uC774 \uAC00\uB4DD \uCC3C\uC2B5\uB2C8\uB2E4 (\uCD5C\uB300 ${R.max}\uAC1C) \u2014 \uD604\uC7AC \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uB2E4\uC2DC \uC785\uB825\uD574\uC8FC\uC138\uC694.`)});return}P({role:"user",content:g}),await zh(S,g)},Vh=Je(!1);lt(()=>{Vh.current||t.initialPrompt&&(Vh.current=!0,Gh(t.initialPrompt))},[]);let zh=async(g,S,P)=>{let R=_=>ue(T=>T.map(F=>F.id===g?{...F,messages:[...F.messages,_]}:F)),O=et.current.find(_=>_.id===g)??vt;if(P?.isQueued&&R({role:"system",content:x(`\xBB Starting queued prompt: "${S.slice(0,60)}${S.length>60?"\u2026":""}"`,`\xBB \uB300\uAE30\uC5F4 \uC791\uC5C5 \uC2DC\uC791: "${S.slice(0,60)}${S.length>60?"\u2026":""}"`)}),ue(_=>_.map(T=>T.id===g?{...T,status:"working"}:T)),O.provider){let _=$s[O.provider];_&&fn.current.start(g,S,async T=>{try{let F=_.run(S,{cwd:process.cwd(),resumeSessionId:O.extSessionId,onText:W=>R({role:"assistant",content:W})});if(dn.current.set(g,F),T.signal.aborted){F.kill();return}let{sessionId:J}=await F.done;dn.current.delete(g),J&&ue(W=>W.map(ne=>ne.id===g?{...ne,extSessionId:J}:ne))}catch(F){R({role:"system",content:`Error: ${F.message}`})}});return}fn.current.start(g,S,async _=>{let T=_.signal;ue(W=>W.map(ne=>ne.id===g?{...ne,mission:S}:ne));try{let W=et.current?.find(ne=>ne.id===g)?.name??g;_d({id:`${W}:${S.slice(0,60)}`,title:S.slice(0,80),status:"running",agent:W})}catch(W){console.error("\uD604\uD669 \uAE30\uB85D \uC2E4\uD328:",W)}let F=new Set,J=()=>[...F].some(W=>Pn(W)||W==="agent");try{let W=[S];if(!T.aborted&&(Zk.test(S)||e0(S))&&(R({role:"system",content:x("\xBB analyzing task\u2026","\xBB \uC784\uBB34 \uBD84\uC11D \uC911\u2026")}),W=await t0(S,T)),T.aborted)return x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428");if(W.length>1){let ne=W.map((te,Oe)=>({id:`w${Oe+1}`,name:`worker#${Oe+1}`,task:te,status:"working"}));_.setWorkers(ne.map(te=>({id:te.id,name:te.name,task:te.task,status:"working"}))),R({role:"system",content:x(`\xBB split into ${ne.length} workers`,`\xBB ${ne.length}\uAC1C \uC6CC\uCEE4\uB85C \uBD84\uD574`)});let he=(await Promise.allSettled(ne.map(async te=>{if(T.aborted)return{name:te.name,task:te.task,text:""};let Oe=ne.filter(ir=>ir.id!==te.id).map(ir=>`- ${ir.name}: ${ir.task}`).join(`
|
|
684
|
+
`),Sr=Oe?`${te.task}
|
|
685
|
+
|
|
686
|
+
[Context] You are ${te.name}, working in parallel with other workers. They handle:
|
|
687
|
+
${Oe}
|
|
688
|
+
Stay strictly within your own subtask. Do not edit files another worker owns.`:te.task,ut=await Ln(Sr,{role:"worker",registry:wu.current??void 0,fileClaims:su.current,provider:ni(),workerModel:b,vision:{mode:G,model:j},label:te.name,owner:_.id,signal:_.signal,onTool:ir=>{F.add(ir),Pn(ir)&&_.noteMutation()},onToolError:()=>_.noteToolError(),onActivity:ir=>{_.patchWorker(te.id,{activity:ir}),R({role:"system",content:`${ir} \xAB${te.name}\xBB`})}});return _.patchWorker(te.id,{status:"idle",activity:void 0}),{name:te.name,task:te.task,text:ut}}))).map((te,Oe)=>{if(te.status==="fulfilled")return{...te.value,failed:!1};let Sr=te.reason?.message??String(te.reason),ut=ne[Oe];return _.patchWorker(ut.id,{status:"idle",activity:void 0,error:Sr}),R({role:"system",content:x(`\u2715 ${ut.name} failed: ${Sr}`,`\u2715 ${ut.name} \uC2E4\uD328: ${Sr}`)}),{name:ut.name,task:ut.task,text:"",failed:!0,reason:Sr}});if(T.aborted)return R({role:"system",content:x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428")}),x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428");if(he.every(te=>te.failed))return R({role:"system",content:x("\u2715 all workers failed \u2014 nothing to synthesize.","\u2715 \uBAA8\uB4E0 \uC6CC\uCEE4 \uC2E4\uD328 \u2014 \uCDE8\uD569\uD560 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.")}),"";let X=he.map(te=>`## ${te.name} (${te.task})
|
|
689
|
+
${te.failed?`FAILED: ${te.reason??""}`:te.text||x("(no reply)","(\uBB34\uC751\uB2F5)")}`).join(`
|
|
690
|
+
|
|
691
|
+
`),ie=await zn(`Original task: ${S}
|
|
692
|
+
|
|
693
|
+
Per-worker results:
|
|
694
|
+
${X}
|
|
695
|
+
|
|
696
|
+
Synthesize a concise final report for the user.`,"You are a coding orchestrator. Summarize concisely what the workers did.",T);return R({role:"assistant",content:ie}),Rh(g,S,he,ie),_.setWorkers([]),ie}else{_.setWorkers([{id:"w1",name:"orchestrator",task:S,status:"working"}]);let ne=vf(C,he=>oi.some(X=>X.provider===he));if(ne.engine!=="builtin"){let he=$s[ne.engine],X=[],ie=he.run(S,{cwd:process.cwd(),resumeSessionId:N.current,onText:ut=>{ut&&(X.push(ut),R({role:"assistant",content:ut}))}}),te=setInterval(()=>{_.signal.aborted&&ie.kill()},200),Oe=!1;try{let ut=await ie.done;Oe=ut.ok,ut.sessionId&&(N.current=ut.sessionId)}finally{clearInterval(te)}if(_.setWorkers([]),_.signal.aborted)return R({role:"system",content:x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428")}),x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428");let Sr=X.join(`
|
|
697
|
+
`).trim();return!Oe&&!Sr&&R({role:"system",content:x(`\u26A0 ${he.binary} produced no output. Falling back is NOT automatic \u2014 switch with /engine builtin if this persists.`,`\u26A0 ${he.binary} \uAC00 \uC544\uBB34 \uCD9C\uB825\uB3C4 \uB0B4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC790\uB3D9 \uD3F4\uBC31\uC740 \uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 \uACC4\uC18D\uB418\uBA74 /engine builtin \uC73C\uB85C \uBC14\uAFB8\uC138\uC694.`)}),Sr}let de=await Ln(S,{role:"orchestrator",registry:wu.current??void 0,fileClaims:su.current,provider:ni(),workerModel:b,vision:{mode:G,model:j},label:"orchestrator",owner:_.id,signal:_.signal,onTool:he=>{F.add(he),(Pn(he)||he==="agent")&&_.noteMutation()},onToolError:()=>_.noteToolError(),onActivity:he=>{_.patchWorker("w1",{activity:he}),R({role:"system",content:he})},onAssistant:he=>R({role:"assistant",content:he})});return T.aborted?(R({role:"system",content:x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428")}),x("\u23F9 stopped","\u23F9 \uC911\uB2E8\uB428")):(J()&&Rh(g,S,[{name:"orchestrator",task:S,text:de}]),_.setWorkers([]),de)}}catch(W){return R({role:"system",content:`Error: ${W.message}`}),""}})};Fh.current=zh;let ba=zk.flatMap(g=>g.content.split(`
|
|
698
|
+
`).map((S,P)=>({role:g.role,text:S,first:P===0}))),g0=t.sessionName||"default",ci=t.tier??"default",Kh=ZM(process.cwd()),Jh=MM.useMemo(()=>tD(process.cwd()),[]),bu=`brain:${eu(la())}`,Yh=C==="builtin"?null:`engine:${C}`,w0=Yh?`${Yh} \xB7 ${x("own account","\uBCF8\uC778 \uACC4\uC815")} \xB7 ${bu}`:ii?`${ii.tier} \xB7 ${x("left","\uB0A8\uC74C")} ${ii.remainingPct}%${ii.refillLabel?` \xB7 ${ii.refillLabel}`:""} \xB7 ${bu}`:`${x("syncing\u2026","\uB3D9\uAE30\uD654 \uC911\u2026")} \xB7 ${bu}`,y0=Ix(p0,dr()==="ko"?"ko":"en"),vu=Ie.startsWith("/")&&!Ie.includes(" ")?Ie.slice(1).toLowerCase():null,Su=vu!==null?Th.filter(g=>g.cmd.startsWith(vu)):[],xu=Math.min(A,Math.max(0,Su.length-1)),Xh=fe==="chat"&&vu!==null&&Su.length>0&&!si&&!jr&&!or,Qh=g=>g==="working"?"\u25D0":g==="parked"?"\u23F8":g==="waiting"?"\u25CB":"\u25CF",b0=g=>g==="working"?x("working","\uC791\uC5C5 \uC911"):g==="parked"?x("parked","\uBA48\uCDA4"):g==="waiting"?x("waiting","\uB300\uAE30"):x("idle","\uC26C\uB294 \uC911"),ku=Math.max(6,Se.leftWidth-4),v0=ke(_e,{flexDirection:"column",flexShrink:0,width:Se.leftWidth,paddingX:1,borderStyle:"round",borderColor:fe==="workers"?oe:L.border,children:[V(z,{bold:!0,color:fe==="workers"?oe:L.primary,children:x("workers","\uC6CC\uCEE4")}),qe.map((g,S)=>{let P=g.id===Ae,R=fe==="workers"&&S===Q.row;return ke(_e,{flexDirection:"column",children:[V(z,{color:P?L.primary:L.text,bold:P||R,backgroundColor:R?L.surface:void 0,children:`${R?"\u276F":" "}${Qh(g.status)} ${g.name}`.slice(0,ku)}),V(z,{color:L.gray,children:` ${b0(g.status)}${g.provider?` \xB7 ${g.provider}`:""}`.slice(0,ku)}),P&&g.workers?.map((O,_,T)=>V(z,{color:O.error?oe:L.gray,children:` ${_===T.length-1?"\u2514":"\u251C"} ${O.error?"\u2715":Qh(O.status)} ${O.name}`.slice(0,ku)},O.id))]},g.id)}),V(z,{color:L.gray,children:x("\u2303N new","\u2303N \uC0C8\uB85C")})]});return l.open&&!or&&!ha&&!jr&&!si?V(jx,{panel:l,rows:s.rows,cols:s.cols,accent:oe,text:L.text,muted:L.secondary,hint:Qn?x("Ctrl+B \u2026 l sessions \xB7 ? shortcuts","Ctrl+B \u2026 l \uC138\uC158 \xB7 ? \uB2E8\uCD95\uD0A4"):tu?x("Type /exit in chat to quit \xB7 Ctrl+X closes the current tab","\uC885\uB8CC\uB294 \uB300\uD654\uC5D0\uC11C /exit \xB7 Ctrl+X \uD604\uC7AC \uD0ED \uB2EB\uAE30"):du??void 0}):ke(_e,{flexDirection:"column",width:s.cols,height:s.rows,children:[ee&&V(_e,{children:V(z,{children:HM.multiline(qM)})}),ke(_e,{paddingX:1,children:[!ee&&V(z,{color:L.secondary,bold:!0,children:"protocol: "}),V(z,{color:L.gray,children:g0}),ci!=="default"&&V(z,{color:ci==="danger"?"red":"yellow",bold:!0,children:` \u26A0 ${ci==="danger"?"DANGER":"YOLO"} \xB7 ${x(Kr[ci].en,Kr[ci].ko)}`}),f&&!f.ok&&V(z,{color:f.errorType==="dummy_vectors"||f.errorType==="zero_vector"||f.errorType==="constant_vector"?"red":"yellow",bold:!0,children:` \u26A0 RAG:${f.errorType==="dummy_vectors"?x(" DUMMY VECTORS DETECTED"," \uB354\uBBF8\uBCA1\uD130 \uAC10\uC9C0 (\uB3D9\uC77C \uBCA1\uD130)"):f.errorType==="key_missing"?x(" NO KEY"," \uD0A4 \uC5C6\uC74C"):f.errorType==="network_error"?x(" NETWORK ERROR"," \uB124\uD2B8\uC6CC\uD06C \uC624\uB958"):f.errorType==="zero_vector"||f.errorType==="constant_vector"?x(" INVALID VECTOR"," \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uBCA1\uD130"):x(" ERROR"," \uC624\uB958")}`})]}),ee&&ke(_e,{borderStyle:"round",borderColor:L.border,paddingX:1,children:[qe.map(g=>{let S=g.status==="working"?"\u25D0":g.status==="parked"?"\u23F8":"\u25CF",P=g.id===Ae;return V(z,{color:P?L.primary:L.gray,bold:P,children:`${S} ${g.name} `},g.id)}),V(z,{color:L.gray,children:x("+ agent (\u2303N)","+ \uC5D0\uC774\uC804\uD2B8 (\u2303N)")})]}),ee&&ke(_e,{paddingX:1,children:[V(z,{color:M==="agents"?L.primary:L.gray,bold:M==="agents",children:x("\u25C0 agents","\u25C0 \uC5D0\uC774\uC804\uD2B8")}),V(z,{color:L.gray,children:" "}),V(z,{color:M==="chat"?L.primary:L.gray,bold:M==="chat",children:x("chat","\uB300\uD654")}),V(z,{color:L.gray,children:" "}),V(z,{color:M==="status"?L.primary:L.gray,bold:M==="status",children:x("status \u25B6","\uD604\uD669 \u25B6")}),V(z,{color:L.gray,children:x(" (\u21E7\u2190/\u21E7\u2192)"," (\u21E7\u2190/\u21E7\u2192)")})]}),ee&&M==="agents"&&ke(_e,{flexDirection:"column",borderStyle:"round",borderColor:L.border,paddingX:1,children:[V(z,{bold:!0,color:L.primary,children:x("Agents","\uC5D0\uC774\uC804\uD2B8")}),qe.map((g,S)=>{let P=g.status==="working"?"\u25D0":g.status==="parked"?"\u23F8":"\u25CF",R=g.id===Ae,O=g.messages[g.messages.length-1],_=O?String(O.content??"").replace(/\s+/g," ").trim():"",T=Math.max(12,s.cols-10);return ke(_e,{flexDirection:"column",children:[V(z,{color:R?L.primary:L.gray,bold:R,children:` ${P} ${S+1}. ${g.name}${R?x(" (here)"," (\uC5EC\uAE30)"):""}`}),V(z,{color:L.gray,children:` ${g.mission?g.mission.slice(0,T):x("(no mission yet)","(\uB9E1\uC740 \uC77C \uC5C6\uC74C)")}`}),_?V(z,{color:L.gray,children:` \u21B3 ${_.slice(0,T)}${_.length>T?"\u2026":""}`}):null,g.workers?.length?V(z,{color:L.gray,children:` \u2514 ${x("workers","\uC6CC\uCEE4")} ${g.workers.length}`}):null]},g.id)}),V(z,{color:L.gray,children:x(" \u2303B c new \xB7 \u2303B n/p or 1-9 switch \xB7 \u2303B x close \xB7 \u2303B ? help"," \u2303B c \uC0C8\uB85C \xB7 \u2303B n/p \uB610\uB294 1-9 \uC804\uD658 \xB7 \u2303B x \uB2EB\uAE30 \xB7 \u2303B ? \uB3C4\uC6C0\uB9D0")})]}),M==="status"&&ke(_e,{flexDirection:"column",borderStyle:"round",borderColor:L.border,paddingX:1,children:[V(z,{bold:!0,color:L.primary,children:x("Work in progress","\uC9C0\uAE08 \uD558\uB294 \uC77C")}),U.length===0?V(z,{color:L.gray,children:x("nothing yet \u2014 agents add their mission here","\uC544\uC9C1 \uC5C6\uB2E4 \u2014 \uC5D0\uC774\uC804\uD2B8\uAC00 \uB9E1\uC740 \uC77C\uC774 \uC5EC\uAE30 \uC313\uC778\uB2E4")}):U.map(g=>V(z,{color:g.status==="blocked"?"red":g.status==="running"?L.primary:L.gray,children:` ${g.status==="running"?"\u25D0":g.status==="blocked"?"\u2717":g.status==="waiting"?"\u23F8":"\xB7"} ${g.title}${g.agent?` (${g.agent})`:""}${g.note?` \u2014 ${g.note}`:""}`},g.id)),V(z,{color:L.gray,children:` ${ye}`}),V(z,{color:L.gray,children:x(" structure \u2192 docs/MAP.md \xB7 decisions \u2192 docs/DECISIONS.md"," \uAD6C\uC870 \u2192 docs/MAP.md \xB7 \uC815\uD574\uC9C4 \uAC83 \u2192 docs/DECISIONS.md")})]}),ee&&vt.workers&&vt.workers.length>0&&ke(_e,{flexDirection:"column",paddingX:1,children:[vt.mission?V(z,{color:L.secondary,children:"\xBB "+vt.mission.slice(0,Math.max(4,s.cols-4))}):null,vt.workers.map((g,S,P)=>{let R=S===P.length-1?"\u2514 ":"\u251C ",O=g.error?"\u2715":g.status==="working"?"\u25D0":g.status==="parked"?"\u23F8":"\u25CF",_=(g.error??g.activity??g.task).slice(0,Math.max(8,s.cols-14));return ke(z,{children:[V(z,{color:L.gray,children:" "+R}),V(z,{color:g.error||g.status==="working"?oe:L.secondary,children:O+" "+g.name+" "}),V(z,{color:g.error?oe:L.gray,children:_})]},g.id)})]}),ke(_e,{flexGrow:1,flexDirection:"row",children:[Se.showLeft&&v0,ke(_e,{flexDirection:"column",flexGrow:1,width:Se.centerWidth,children:[V(_e,{flexGrow:1,flexDirection:"column",paddingX:1,marginTop:ee?1:0,overflowY:"hidden",children:ba.slice(Math.max(0,ba.length-Ce-Vn),Math.max(0,ba.length-Vn)).map((g,S)=>{let P=g.role==="user",R=g.role==="system",O=R?XM(g.text,L.gray,L.secondary):null,_=g.first?P?"\u203A ":R?"":" ":" ",T=O?.bg??(R?JM:void 0),F=P?L.primary:R?O?.bg?O.color:YM:L.text,J=_+g.text;if(T){let W=Se.centerWidth-3-QM(J);W>0&&(J+=" ".repeat(W))}return V(_e,{children:V(z,{color:F,backgroundColor:T,bold:P||(O?.bold??!1),children:J})},S)})}),vt.status==="working"&&!or&&ke(_e,{paddingX:1,children:[V(z,{color:oe,children:Dh[i0%Dh.length]+" "}),V(z,{color:L.text,children:a0+"\u2026 "}),V(z,{color:L.gray,children:`(${Math.floor((Date.now()-fa.current)/1e3)}s \xB7 ${x("esc to stop","esc \uC911\uB2E8")})`}),Ur[Ae]>0&&V(z,{color:L.secondary,children:` \xB7 ${x(`queued: ${Ur[Ae]}`,`\uB300\uAE30\uC5F4 ${Ur[Ae]}\uAC74`)}`})]}),Xh&&ke(_e,{flexDirection:"column",paddingX:1,children:[Su.slice(0,8).map((g,S)=>ke(z,{color:S===xu?L.primary:g.muted?L.gray:L.text,bold:S===xu,children:[(S===xu?"\u276F ":" ")+"/"+g.cmd.padEnd(12),V(z,{color:L.gray,children:x(g.en,g.ko)})]},g.cmd)),V(z,{color:L.gray,children:" "+x("\u2191\u2193 pick \xB7 Tab/\u2192 complete \xB7 Enter run","\u2191\u2193 \uC120\uD0DD \xB7 Tab/\u2192 \uC644\uC131 \xB7 Enter \uC2E4\uD589")})]}),!Xh&&!si&&!jr&&!or&&vt.status!=="working"&&ke(_e,{paddingX:1,children:[V(z,{color:L.secondary,children:ee?Kh:eD(Kh,Math.max(8,Se.centerWidth-56))}),Jh&&ee?V(z,{color:L.secondary,children:" on "+Jh}):null,V(z,{color:L.gray,children:" orch:"+B(h)+" \xB7 worker:"+q(b)}),Ur[Ae]>0&&V(z,{color:L.secondary,children:` \xB7 ${x(`queued: ${Ur[Ae]}`,`\uB300\uAE30\uC5F4 ${Ur[Ae]}\uAC74`)}`})]}),jr?ke(_e,{flexDirection:"column",paddingX:1,borderStyle:"single",borderTop:!0,borderColor:L.primary,children:[ke(z,{color:L.primary,bold:!0,children:[x("Go back to","\uB418\uB3CC\uB9B4 \uC2DC\uC810")," ",V(z,{color:L.gray,children:x("(\u2191\u2193 pick \xB7 Enter restore \xB7 Esc cancel)","(\u2191\u2193 \uC120\uD0DD \xB7 Enter \uB418\uB3CC\uB9AC\uAE30 \xB7 Esc \uCDE8\uC18C)")})]}),jr.slice(Math.max(0,ai-4),Math.max(0,ai-4)+8).map((g,S,P)=>{let O=Math.max(0,ai-4)+S===ai,_=g.created_at?new Date(g.created_at).toLocaleString():"";return ke(z,{color:O?L.primary:L.text,bold:O,children:[(O?"\u276F ":" ")+`${g.count}`.padStart(4)+x(" msgs ","\uAC1C "),V(z,{color:L.gray,children:_+" "}),V(z,{children:g.label})]},g.id)}),V(z,{color:L.gray,children:" "+x("the current state is saved before restoring \u2014 this is undoable","\uB418\uB3CC\uB9AC\uAE30 \uC9C1\uC804 \uC0C1\uD0DC\uB3C4 \uC800\uC7A5\uB429\uB2C8\uB2E4 \u2014 \uC774 \uB418\uB3CC\uB9AC\uAE30\uB3C4 \uB418\uB3CC\uB9B4 \uC218 \uC788\uC74C")})]}):si?ke(_e,{flexDirection:"column",paddingX:1,borderStyle:"single",borderTop:!0,borderColor:L.primary,children:[ke(z,{color:L.primary,bold:!0,children:[x("Models","\uBAA8\uB378")+" ",V(z,{color:L.gray,children:x("(\u2191\u2193 row \xB7 \u2190\u2192 change \xB7 Enter/Esc close)","(\u2191\u2193 \uD56D\uBAA9 \xB7 \u2190\u2192 \uBCC0\uACBD \xB7 Enter/Esc \uB2EB\uAE30)")})]}),V(z,{color:pn===0?L.primary:L.text,bold:pn===0,children:(pn===0?"\u276F ":" ")+x("Orchestrator","\uC9C0\uD718").padEnd(dr()==="ko"?4:12)+" \u2039 "+B(h)+" \u203A"}),V(z,{color:pn===1?L.primary:L.text,bold:pn===1,children:(pn===1?"\u276F ":" ")+x("Worker","\uC77C\uAFBC").padEnd(dr()==="ko"?4:12)+" \u2039 "+q(b)+" \u203A"}),V(z,{color:L.gray,children:" RAG lite "+x("(fixed)","(\uACE0\uC815)")})]}):or?ke(_e,{paddingX:1,borderStyle:"single",borderTop:!0,borderColor:"yellow",flexDirection:"column",children:[ke(z,{color:"yellow",bold:!0,children:[`\u26A0 [${or.prompt.risk}] ${or.prompt.message}`,V(z,{color:L.secondary,children:or.label?` \xAB${or.label}\xBB`:""})]}),ke(z,{children:[V(z,{color:L.gray,children:x("[y] allow [a] allow all (session) [n] deny","[y] \uD5C8\uC6A9 [a] \uC774\uBC88 \uC138\uC158 \uD56D\uC0C1 \uD5C8\uC6A9 [n] \uAC70\uBD80")}),V(z,{color:L.secondary,children:ru>0?x(` \xB7 ${ru} more waiting`,` \xB7 ${ru}\uAC74 \uB300\uAE30 \uC911`):""})]})]}):fe!=="chat"?V(_e,{paddingX:1,borderStyle:"single",borderTop:!0,borderColor:L.border,children:V(z,{color:L.gray,children:x("workers \u2014 \u2191\u2193 pick \xB7 Enter/\u2192 open \xB7 Esc back","\uC6CC\uCEE4 \u2014 \u2191\u2193 \uC120\uD0DD \xB7 Enter/\u2192 \uC5F4\uAE30 \xB7 Esc \uB3CC\uC544\uAC00\uAE30")})}):ke(_e,{paddingX:1,borderStyle:"single",borderTop:!0,borderColor:L.border,children:[V(z,{color:L.primary,bold:!0,children:Ur[Ae]>0?`\u203A [queued ${Ur[Ae]}] `:"\u203A "}),V(Xg,{focus:!Qn,value:Ie,onChange:yt,onSubmit:Gh})]})]})]}),V(_e,{paddingX:1,justifyContent:"space-between",backgroundColor:tu||Qn?L.primary:void 0,children:tu?V(z,{color:"black",bold:!0,children:x(" \u26A0 type `/exit` to quit \xB7 \u2303X closes a tab "," \u26A0 \uC885\uB8CC\uB294 `/exit` \xB7 \u2303X \uB85C \uD0ED \uB2EB\uAE30 ")}):Qn?V(z,{color:"black",bold:!0,children:x(" \u2303B \u2026 c new \xB7 n/p switch \xB7 1-9 jump \xB7 x close \xB7 l sessions \xB7 d detach \xB7 ? help "," \u2303B \u2026 c \uC0C8\uB85C \xB7 n/p \uC804\uD658 \xB7 1-9 \uC774\uB3D9 \xB7 x \uB2EB\uAE30 \xB7 l \uC138\uC158 \xB7 d \uB5BC\uAE30 \xB7 ? \uB3C4\uC6C0\uB9D0 ")}):du?V(z,{color:L.secondary,children:du}):ke(nD,{children:[V(z,{color:L.gray,children:"/sessions \xB7 \u2303B l \xB7 / "+x("commands","\uBA85\uB839")+(Se.showLeft?x(" \xB7 \u2190\u2190 workers"," \xB7 \u2190\u2190 \uC6CC\uCEE4"):"")+x(" \xB7 \u2303B ? shortcuts \xB7 \u2303N new \xB7 \u2303X close \xB7 /exit quit"," \xB7 \u2303B ? \uB2E8\uCD95\uD0A4 \xB7 \u2303N \uC0C8 \xB7 \u2303X \uB2EB\uAE30 \xB7 /exit \uC885\uB8CC")}),V(z,{color:L.gray,children:y0+" \xB7 "+w0})]})})]})};async function Vx(t){ji(t.language==="ko"?"ko":"en"),Qb().then(n=>{n&&ht.child("WiringCheck").warn(n)});let e=await BM();if(process.stdin.isTTY){try{process.stdin.setRawMode(!1)}catch{}process.stdin.removeAllListeners("keypress"),process.stdin.removeAllListeners("data"),process.stdin.resume()}process.stdout.write("\x1B[0m\x1B[2J\x1B[0;0H");let{waitUntilExit:r}=NM(V(rD,{config:t,detectedBg:e}),{exitOnCtrlC:!1});await r()}_s();Ps();mo();Tr();function zx(t=process.stdin.isTTY===!0,e=process.stdout.isTTY===!0){if(!(t&&e))throw new Error('Interactive mode requires a TTY. Use `protocol chat --print "<task>"` for scripts or CI.')}ge();var sD=()=>iD(process.cwd()).replace(/[^A-Za-z0-9._-]/g,"-").replace(/^-+|-+$/g,"")||"session";function Hl(t=[]){let e=sD();if(!t.includes(e))return e;for(let r=2;r<1e3;r++){let n=`${e}-${r}`;if(!t.includes(n))return n}return`${e}-${Date.now().toString(36).slice(-4)}`}async function hh(t){try{return{ok:!0,list:await new Ne(t).list()}}catch{return{ok:!1,list:[]}}}function mh(){try{return Nr.readdirSync(Yt()).filter(t=>t.endsWith(".json")&&!Fa(t.replace(/\.json$/,""))).map(t=>({name:t.replace(/\.json$/,""),updated_at:Nr.statSync(oD(Yt(),t)).mtime.toISOString()})).sort((t,e)=>e.updated_at.localeCompare(t.updated_at))}catch{return[]}}async function aD(t,e){for(let r of e)await new Ne(t).delete(r)}var Yx=t=>{try{let e=JSON.parse(Nr.readFileSync(cr(t),"utf-8"));return Array.isArray(e)&&e.length>0?e:null}catch{return null}},ta=(t,e)=>{try{Nr.mkdirSync(Yt(),{recursive:!0}),Nr.writeFileSync(cr(t),JSON.stringify(e,null,2),"utf-8")}catch{}};async function Kx(t,e,r,n,o){let i=new Date,s=`${String(i.getMonth()+1).padStart(2,"0")}${String(i.getDate()).padStart(2,"0")}`,a=`${e}-${r}-${s}`;for(let c=2;o.includes(a);c++)a=`${e}-${r}-${s}-${c}`;ta(a,n);try{await new Ne(t).save(a,n)}catch{}return a}async function cD(t,e){let r=co(cr(e)),n=Nr.existsSync(r),o=Yx(e),i=new Ne(t),s=await i.reconcile(e,o);if(s.ok&&!(s.action==="deleted"||s.action==="archived")){if(s.action==="recovered"){if(ta(e,s.messages),n)try{Nr.rmSync(r)}catch{}let a=s.recoveredCount??0;console.log(le.green(`
|
|
699
|
+
\u2713 Recovered ${a} completed message(s) from server for '${e}'.`));let c=s.messages[s.messages.length-1];if(c){let l=c.content.slice(0,100).replace(/\n/g," ");console.log(le.gray(` Last [${c.role}]: ${l}${c.content.length>100?"\u2026":""}`))}console.log(le.gray(` Resuming session with latest server state.
|
|
700
|
+
`));return}if(s.action==="local_ahead"){if(n&&o&&o.length>0)try{await i.save(e,o),Nr.rmSync(r),console.log(le.gray(`Offline work in '${e}' uploaded to the server.`))}catch{}return}if(s.action==="merged"){let a=s.serverMessages??[],c=s.localMessages??o??[];await i.snapshot(e,`before conflict \xB7 offline (${c.length})`,c),await i.snapshot(e,`before conflict \xB7 server (${a.length})`,a),console.log(le.yellow(`
|
|
701
|
+
\u26A0 '${e}' has offline work that diverged from the server.`)),console.log(le.gray(` this device: ${c.length} messages \xB7 server: ${a.length} messages`)),console.log(le.gray(` Both versions are already saved \u2014 you can switch anytime with /restore.
|
|
702
|
+
`));let{keep:l}=await qn.prompt([{type:"list",name:"keep",message:"Which version should this session continue from?",choices:[{name:"Merge both \u2014 keep everything, offline work appended after the server version",value:"merge"},{name:`Server version (${a.length} msgs) \u2014 offline work kept as a separate session`,value:"cloud"},{name:`This device's offline version (${c.length} msgs) \u2014 server version kept as a separate session`,value:"local"}]}]),d=[];try{d=(await i.list()).map(p=>p.name)}catch{}if(l==="merge"){let p=Ad(a,c,"server","this device (offline)");ta(e,p);try{await i.save(e,p)}catch{}console.log(le.gray(`Merged into '${e}' (${p.length} messages). Undo with /restore.`))}else if(l==="cloud"){let p=await Kx(t,e,"offline",c,d);ta(e,a),console.log(le.gray(`Offline work preserved as session '${p}' (and in /restore).`))}else{let p=await Kx(t,e,"server",a,d);try{await i.save(e,c)}catch{}console.log(le.gray(`Server version preserved as session '${p}' (and in /restore).`))}if(n)try{Nr.rmSync(r)}catch{}}}}async function Bl(t){let{ok:e,list:r}=await hh(t),n=e?r:mh().map(l=>({...l,cwd:void 0}));e||(console.log(le.yellow("\u26A0 Offline \u2014 could not reach the server.")),console.log(le.gray(` Showing this device's local sessions${n.length===0?" (none found)":""}. Cloud sync resumes when you reconnect.`)));let o=n.map(l=>l.name),i="__new__",s="__del__",a="__restore__",{picked:c}=await qn.prompt([{type:"list",name:"picked",message:"Session (resume / new / archive / restore):",pageSize:12,choices:[{name:le.green("+ New session"),value:i},{name:le.gray("Archive sessions\u2026"),value:s},...e?[{name:"Restore archived session\u2026",value:a}]:[],new qn.Separator,...n.map(l=>({name:`${le.cyan(l.name)}${l.cwd?le.gray(" "+l.cwd):""}${l.updated_at?le.gray(" \xB7 "+new Date(l.updated_at).toLocaleString()):""}`,value:l.name}))]}]);if(c===i)return Hl(o);if(c===a){let l=new Ne(t),d=await l.list("archived");if(!d.length)return console.log("No archived sessions."),Bl(t);let{name:p}=await qn.prompt([{type:"list",name:"name",message:"Restore session:",choices:[{name:"Cancel",value:""},...d.map(u=>({name:u.name,value:u.name}))]}]);return p&&await l.restore(p,d.find(u=>u.name===p).archive_revision??0),Bl(t)}if(c===s){let{toDelete:l}=await qn.prompt([{type:"checkbox",name:"toDelete",message:"Sessions to archive (space to check, Enter to confirm \xB7 empty = cancel):",pageSize:12,choices:n.map(d=>({name:`${d.name}${d.cwd?le.gray(" "+d.cwd):""}`,value:d.name}))}]);if(l.length>0){let{yes:d}=await qn.prompt([{type:"confirm",name:"yes",default:!1,message:le.red(`Archive ${l.length} session(s) (${l.join(", ")})?`)}]);d&&(await aD(t,l),console.log(le.gray(`Archived (restorable): ${l.join(", ")}`)))}return Bl(t)}return c}function Jx(){return new Promise(t=>{process.stdout.write("",()=>t())})}async function gh(t,e,r){let n=new K,o=n.getAll().ui.language;if(!o){let a=await Vb(t);if(a)o=a,n.set("ui",{language:o});else{let{lang:c}=await qn.prompt([{type:"list",name:"lang",message:"Language / \uC5B8\uC5B4",choices:[{name:"English",value:"en"},{name:"\uD55C\uAD6D\uC5B4",value:"ko"}]}]);o=c,n.set("ui",{language:o})}}let i;e&&e!=="default"?i=e:i=await Bl(t);try{await cD(t,i)}catch{}let s=new rt;try{let a=await s.checkSubscription();!a.active&&a.status!=="expired"&&console.log(le.gray(`Could not verify subscription \u2014 ${Jt()}`))}catch{}await Vx({language:o,sessionName:i,graph:r.graph,compact:r.compact,noRunner:r.noRunner,permission:r.permission,tier:r.tier,initialPrompt:r.initialPrompt})}async function lD(t,e,r){let n=(r.print||"").trim();n||(console.error(le.red('--print requires a prompt (e.g. protocol chat --print "fix the failing tests")')),await Jx(),process.exit(1));let o=new K;ji(o.getAll().ui.language==="ko"?"ko":"en");let{ok:i,list:s}=await hh(t),a=i?s:mh(),c=a[0],l=c?.cwd===process.cwd(),d=e&&e!=="default"?e:l?c.name:Hl(a.map(v=>v.name)),p=[],u=new Ne(t),f=await u.load(d);f.deleted||f.archived?(console.log(le.gray(`\u26A0 '${d}' is archived or unavailable \u2014 using a new session.`)),d=Hl(a.map(v=>v.name))):p=Yx(d)??f.messages??[];let m=Cs({tier:r.tier,permission:r.permission,confirm:async()=>r.tier==="default"?"deny":"once"}),h=[],w="",b=0;try{let v=await Ln(n,{role:"worker",tier:r.tier,registry:m,fileClaims:new hr,provider:new jt,owner:"headless",label:"headless",onActivity:C=>{h.push(C),console.log(le.dim(C))},onAssistant:C=>{C&&(w=C,console.log(C))},onTool:C=>console.log(le.gray(`\u25B8 ${C}`)),onPhase:()=>{}});v&&v!==w&&console.log(`
|
|
703
|
+
`+v),v||(console.error(le.yellow("No result produced \u2014 the run may have been rejected or failed.")),b=1)}catch(v){console.error(le.red("Error:"),v.message),b=1}let k=[...p,{role:"user",content:n}];for(let v of h)k.push({role:"system",content:v});w&&k.push({role:"assistant",content:w}),ta(d,k);try{await u.save(d,k)}catch{}console.log(le.gray(`
|
|
704
|
+
Saved to session '${d}' \u2014 resume later with: protocol chat ${d}`)),await Jx(),process.exit(b)}var Xx=new se("chat").description("Start the coding agent (local)").argument("[session]","session name to resume or create").option("--local","run locally without the picker (resume most recent)").option("--cloud","run in a secure cloud sandbox \u2014 coming soon").option("-g, --graph <graph>","Use custom graph pipeline").option("-c, --compact","Use compact banner").option("-p, --permission <mode>","Permission mode (readonly, workspace, full)").option("--yolo","no approval prompts \u2014 writes stay in this folder, bash stays sandboxed").option("--dangerously-skip-permissions","\u26A0 no prompts, no folder confinement, no sandbox (catastrophic commands still blocked)").option("--no-runner","do not register this device as online / do not execute approved plans here").option("--print <prompt>","run one task headless and print the result (no interactive TUI \u2014 for scripts/CI)").action(async(t,e)=>{try{let r=e.dangerouslySkipPermissions?"danger":e.yolo?"yolo":"default";if(r==="danger"&&typeof process.getuid=="function"&&process.getuid()===0&&(console.log(le.red("\u270B --dangerously-skip-permissions cannot run as root.")),console.log(le.gray(" It grants unrestricted access to secrets/system-wide paths. Run as a normal user, or use --yolo (which keeps the rails on).")),process.exit(1)),r!=="default"&&console.log(le[r==="danger"?"red":"yellow"](Es(r,"en"))),e.cloud){console.log(le.yellow("\u2601 Cloud mode (secure sandbox) is coming soon.")),console.log(le.gray(" Local only for now \u2014 `protocol:` or `protocol: --local`"));return}let n=new rt;n.isAuthenticated()||(console.log(le.yellow("Login required.")),console.log(le.gray("Run `protocol login` to sign in with your Protocol (Google) account.")),process.exit(1));let o=n.getCurrentUser().id;if(e.print!==void 0){await lD(o,t,{print:e.print,tier:r,permission:e.permission});return}zx();let i=t;if((!i||i==="default")&&e.local){let{ok:s,list:a}=await hh(o),c=s?a:mh();s||console.log(le.yellow("\u26A0 Offline \u2014 using this device's local sessions.")),i=c[0]?.name??Hl(c.map(l=>l.name))}await gh(o,i,{graph:e.graph,compact:e.compact,noRunner:e.runner===!1,permission:e.permission,tier:r})}catch(r){console.error(le.red("Error:"),r.message),process.exit(1)}});De();ge();import ql from"chalk";var Yo=new K,Xo=new se("config").description("Manage configuration");Xo.command("get <key>").description("Get a configuration value").action(t=>{let e=Yo.get(t);console.log(e!==void 0?JSON.stringify(e,null,2):ql.yellow(`Key not found: ${t}`))});Xo.command("set <key> <value>").description("Set a configuration value").action((t,e)=>{try{let r=e;try{r=JSON.parse(e)}catch{}if(t.includes(".")){let n=t.split("."),o=n[0],i=n.slice(1).join("."),s=Yo.get(o)||{};Yo.set(o,{...s,[i]:r})}else Yo.set(t,r);console.log(ql.green(`Set ${t} = ${e}`))}catch(r){console.log(ql.red(`Failed to set value: ${r.message}`))}});Xo.command("list").description("List all configuration").action(()=>{let t=Yo.getAll();console.log(ql.blue("Configuration:")),console.log(JSON.stringify(t,null,2))});Xo.command("path").description("Show configuration file path").action(()=>{console.log(Yo.getConfigPath())});De();Ca();import pe from"chalk";import{existsSync as yr,readFileSync as Gn,writeFileSync as Qx,unlinkSync as uD,readdirSync as dD}from"fs";import{join as ra,basename as pD}from"path";import{homedir as Zx}from"os";import fD from"inquirer";var Gl=ra(Zx(),".protocol-cli","graphs");function Qo(t){return ra(Gl,`${t}.yaml`)}function wh(){return ra(import.meta.dirname??".","../../config/default-graph.yaml")}var Lr=new se("pipeline").description("Manage graph pipelines");Lr.command("list").description("List available pipelines").action(()=>{console.log(pe.blue(`Available Pipelines:
|
|
705
|
+
`));let t=wh();if(yr(t))try{let r=Ct.load(Gn(t,"utf-8"));console.log(` ${pe.bold.green("\u2605 default")} ${pe.gray(`(built-in) \u2014 ${r.description??""}`)}`),console.log(` ${pe.gray(`version: ${r.version??"?"} entry: ${r.entryPoint??"?"} nodes: ${r.nodes?.length??0}`)}`)}catch{console.log(` ${pe.bold("default")} ${pe.gray("(built-in)")}`)}if(!yr(Gl)){console.log(pe.gray("\n No custom pipelines. Use `protocol pipeline create <name>` to create one."));return}let e=dD(Gl).filter(r=>r.endsWith(".yaml")||r.endsWith(".yml"));if(e.length===0){console.log(pe.gray(`
|
|
706
|
+
No custom pipelines.`));return}console.log("");for(let r of e){let n=pD(r,".yaml").replace(".yml","");try{let o=Ct.load(Gn(ra(Gl,r),"utf-8"));console.log(` ${pe.bold(n)} \u2014 ${o.description??pe.gray("(no description)")}`),console.log(` ${pe.gray(`version: ${o.version??"?"} entry: ${o.entryPoint??"?"} nodes: ${o.nodes?.length??0}`)}`)}catch{console.log(` ${pe.bold(n)} ${pe.red("(parse error)")}`)}}});Lr.command("show <name>").description("Show pipeline definition").action(t=>{if(t==="default"){let r=wh();if(yr(r)){console.log(Gn(r,"utf-8"));return}}let e=Qo(t);yr(e)||(console.error(pe.red(`Pipeline not found: ${t}`)),console.log(pe.gray("Use `protocol pipeline list` to see available pipelines.")),process.exit(1)),console.log(Gn(e,"utf-8"))});Lr.command("create [name]").description("Create a new pipeline from the default template").option("-d, --description <desc>","Pipeline description").action(async(t,e)=>{let r=t,n=e?.description;if(!r){let a=await fD.prompt([{type:"input",name:"pipelineName",message:"What is the name of your new pipeline?",validate:c=>c.trim()!==""||"Name is required"},{type:"input",name:"pipelineDesc",message:"Enter a description for your pipeline:",default:c=>`Custom pipeline: ${c.pipelineName}`}]);r=a.pipelineName.trim(),n=a.pipelineDesc}r||(console.error(pe.red("Pipeline name is required.")),process.exit(1)),n||(n=`Custom pipeline: ${r}`);let o=Qo(r);yr(o)&&(console.error(pe.red(`Pipeline '${r}' already exists. Use 'pipeline edit ${r}' to modify.`)),process.exit(1));let i={name:r,description:n,version:"1.0.0",entryPoint:"main",nodes:[{id:"main",type:"llm",config:{provider:"server",model:"@default",stream:!0,systemPrompt:"You are a helpful coding assistant."}},{id:"tools",type:"tool",config:{tools:["*"]}}],edges:[{from:"main",to:"tools",condition:"tool_calls_present"},{from:"tools",to:"main"}]},s=Ct.dump(i,{lineWidth:120,noRefs:!0});Qx(o,s,"utf-8"),console.log(pe.green(`\u2713 Pipeline '${t}' created at: ${o}`)),console.log(pe.gray(` Edit with: protocol pipeline edit ${t}`))});Lr.command("edit <name>").description("Open a pipeline for editing (prints path)").action(t=>{let e=Qo(t);yr(e)||(console.error(pe.red(`Pipeline not found: ${t}`)),console.log(pe.gray(`Create it first: protocol pipeline create ${t}`)),process.exit(1));try{let n=Gn(e,"utf-8");Ct.load(n)}catch(n){console.warn(pe.yellow(`\u26A0 Warning: Current YAML has parse errors: ${n.message}`))}console.log(pe.blue(`Pipeline file: ${e}`)),console.log(pe.gray("Open in your editor to modify the pipeline definition."));let r=process.env.EDITOR;r&&console.log(pe.gray(`
|
|
707
|
+
${r} ${e}`))});Lr.command("delete <name>").description("Delete a pipeline").action(t=>{t==="default"&&(console.error(pe.red("Cannot delete the built-in 'default' pipeline.")),process.exit(1));let e=Qo(t);yr(e)||(console.error(pe.red(`Pipeline not found: ${t}`)),process.exit(1)),uD(e),console.log(pe.green(`\u2713 Pipeline '${t}' deleted.`))});Lr.command("validate <name>").description("Validate a pipeline YAML").action(t=>{let e;t==="default"?e=wh():e=Qo(t),yr(e)||(console.error(pe.red(`Pipeline not found: ${t}`)),process.exit(1));try{let r=Gn(e,"utf-8"),n=Ct.load(r),o=[];if(n.name||o.push('Missing "name" field'),n.entryPoint||o.push('Missing "entryPoint" field'),(!n.nodes||!Array.isArray(n.nodes))&&o.push('Missing or invalid "nodes" array'),(!n.edges||!Array.isArray(n.edges))&&o.push('Missing or invalid "edges" array'),n.nodes){let i=new Set(n.nodes.map(s=>s.id));n.entryPoint&&!i.has(n.entryPoint)&&o.push(`entryPoint "${n.entryPoint}" not found in nodes`);for(let s of n.nodes){s.id||o.push('Node missing "id"'),s.type||o.push(`Node "${s.id}" missing "type"`);let a=["llm","tool","human","router","parallel","loop"];s.type&&!a.includes(s.type)&&o.push(`Node "${s.id}" has invalid type "${s.type}"`)}if(n.edges)for(let s of n.edges)i.has(s.from)||o.push(`Edge references unknown node: "${s.from}"`),i.has(s.to)||o.push(`Edge references unknown node: "${s.to}"`)}if(o.length>0){console.log(pe.red(`\u2717 Pipeline '${t}' has ${o.length} issue(s):
|
|
708
|
+
`));for(let i of o)console.log(` ${pe.red("\u2022")} ${i}`);process.exit(1)}console.log(pe.green(`\u2713 Pipeline '${t}' is valid`)),console.log(pe.gray(` Nodes: ${n.nodes.length} Edges: ${n.edges.length} Entry: ${n.entryPoint}`))}catch(r){console.error(pe.red(`\u2717 YAML parse error: ${r.message}`)),process.exit(1)}});Lr.command("use <name>").description("Set the active pipeline for chat sessions").action(t=>{if(t!=="default"){let n=Qo(t);yr(n)||(console.error(pe.red(`Pipeline not found: ${t}`)),process.exit(1))}let e=ra(Zx(),".protocol-cli","config.yaml"),r={};if(yr(e))try{r=Ct.load(Gn(e,"utf-8"))??{}}catch{r={}}r.graph||(r.graph={}),r.graph.defaultGraph=t,Qx(e,Ct.dump(r,{lineWidth:120}),"utf-8"),console.log(pe.green(`\u2713 Active pipeline set to: ${t}`))});De();import Gt from"chalk";Sn();var ek={name:"landing",description:"\uACBD\uC7C1\uC0AC \uBD84\uC11D \u2192 \uAC00\uACA9\uC548 \u2192 \uB79C\uB529 \uC81C\uC791 \u2192 \uC2A4\uD06C\uB9B0\uC0F7 \u2192 \uBCF4\uAC15 \u2192 QA \u2192 \uBAA8\uBC14\uC77C (\uCC3D\uC5C5\uC790 \uD655\uC815 8\uB2E8\uACC4)",args:[{name:"app",description:"\uB79C\uB529\uC744 \uB9CC\uB4E4 \uC571/\uC81C\uD488 \uC774\uB984",required:!0}],template:`\uBBF8\uC158: "{app}" \uB79C\uB529 \uD398\uC774\uC9C0 \uC81C\uC791 \u2014 \uCC3D\uC5C5\uC790\uAC00 \uD655\uC815\uD55C 8\uB2E8\uACC4 \uC6CC\uD06C\uD50C\uB85C\uC6B0\uB97C \uC21C\uC11C\uB300\uB85C \uBC1F\uB294\uB2E4.
|
|
709
|
+
\uB2E8\uACC4\uB97C \uAC74\uB108\uB6F0\uC9C0 \uB9D0\uACE0, \uAC01 \uB2E8\uACC4 \uC0B0\uCD9C\uBB3C\uC744 \uB2E4\uC74C \uB2E8\uACC4\uB85C \uB118\uAE30\uAE30 \uC804\uC5D0 \uBB34\uC5C7\uC744 \uD588\uB294\uC9C0 \uD55C \uC904\uB85C \uBCF4\uACE0\uD560 \uAC83.
|
|
710
|
+
|
|
711
|
+
\u2460 \uACBD\uC7C1\uC0AC \uBD84\uC11D \u2014 "{app}"\uACFC \uAC19\uC740 \uC7A5\uB974\uC758 \uB300\uD45C \uC11C\uBE44\uC2A4 2~4\uAC1C\uB97C \uACE8\uB77C \uC2E4\uC81C \uB79C\uB529\uC744 \uD655\uC778\uD55C\uB2E4
|
|
712
|
+
(\uC2A4\uD06C\uB9B0\uC0F7/\uBE0C\uB77C\uC6B0\uC800 \uB3C4\uAD6C\uB85C \uC9C1\uC811 \uC5F4\uC5B4\uBCFC \uAC83 \u2014 \uAE30\uC5B5\uC774\uB098 \uC9D0\uC791\uC73C\uB85C \uC4F0\uC9C0 \uC54A\uB294\uB2E4).
|
|
713
|
+
|
|
714
|
+
\u2461 \uB514\uC790\uC778\uC801 \uC7A5\uB2E8\uC810 \uD655\uC778 \u2014 \u2460\uC5D0\uC11C \uBCF8 \uAC83 \uC911 \uBCA0\uB084 \uB9CC\uD55C \uD328\uD134\uACFC \uD53C\uD574\uC57C \uD560 \uC2E4\uC218\uB97C \uAD6C\uBD84\uD574 \uC815\uB9AC\uD55C\uB2E4.
|
|
715
|
+
|
|
716
|
+
\u2462 \uAC00\uACA9 \uCC45\uC815\uC548 \u2014 \uAD6C\uB3C5 \uC678 \uB2E8\uC77C \uD310\uB9E4(\uB77C\uC774\uD504\uD0C0\uC784/1\uD68C\uC131) \uC635\uC158\uC744 \uD3EC\uD568\uD574 \uC81C\uC548\uD55C\uB2E4.
|
|
717
|
+
\u26A0\uFE0F \uC774 \uB2E8\uACC4\uB294 "\uC81C\uC548\uAE4C\uC9C0\uB9CC"\uC774\uB2E4. \uC2E4\uC81C \uAC00\uACA9 \uAC8C\uC2DC\xB7\uACB0\uC81C \uC5F0\uB3D9\uC740 \uCC3D\uC5C5\uC790 \uC2B9\uC778 \uC5C6\uC774 \uC9C4\uD589\uD558\uC9C0 \uC54A\uB294\uB2E4.
|
|
718
|
+
|
|
719
|
+
\u2463 \uB79C\uB529 \uC81C\uC791 1\uCC28 \u2014 \u2460\u2461\u2462\uC744 \uBC18\uC601\uD574 \uC2E4\uC81C \uD398\uC774\uC9C0\uB97C \uB9CC\uB4E0\uB2E4 (\uD788\uC5B4\uB85C, \uD575\uC2EC \uAC00\uCE58, \uAC00\uACA9, CTA).
|
|
720
|
+
|
|
721
|
+
\u2464 \uC2A4\uD06C\uB9B0\uC0F7 \uD655\uBCF4 \u2014 \uC2E4\uBB3C(\uC6B0\uB9AC \uC81C\uD488 \uC2E4\uC81C \uD654\uBA74) \uC6B0\uC120. \uBD80\uC871\uD558\uBA74 \uB77C\uC774\uC120\uC2A4\uAC00 \uBA85\uD655\uD788 \uD655\uC778\uB41C
|
|
722
|
+
\uBB34\uB8CC \uC774\uBBF8\uC9C0\uB9CC \uC4F4\uB2E4 (\uCD9C\uCC98 \uBD88\uBA85\xB7\uC800\uC791\uAD8C \uBD88\uBA85 \uC774\uBBF8\uC9C0 \uAE08\uC9C0).
|
|
723
|
+
|
|
724
|
+
\u2465 \uB79C\uB529 \uBCF4\uAC15 2\uCC28 \u2014 \u2464\uC5D0\uC11C \uD655\uBCF4\uD55C \uC2E4\uBB3C \uC2A4\uD06C\uB9B0\uC0F7/\uC774\uBBF8\uC9C0\uB85C \uC790\uB9AC\uD45C\uC2DC\uC790\uB97C \uAD50\uCCB4\uD558\uACE0 \uB2E4\uB4EC\uB294\uB2E4.
|
|
725
|
+
|
|
726
|
+
\u2466 \uC2E4\uC81C\uB85C \uBCF4\uBA74\uC11C QA \u2014 \uBE0C\uB77C\uC6B0\uC800\uB85C \uC9C1\uC811 \uC5F4\uC5B4 \uC5B4\uC11C\uC158 \uAE30\uBC18\uC73C\uB85C \uC2EC\uC0AC\uD55C\uB2E4. \uCD5C\uC18C \uC138 \uD574\uC0C1\uB3C4\uC5D0\uC11C \uD655\uC778:
|
|
727
|
+
1440\xD7900(\uB370\uC2A4\uD06C\uD1B1) \xB7 1194\xD7834(\uD0DC\uBE14\uB9BF) \xB7 390\xD7844(\uBAA8\uBC14\uC77C).
|
|
728
|
+
\uB808\uC774\uC544\uC6C3 \uAE68\uC9D0\xB7\uC798\uB9BC\xB7\uACB9\uCE68\xB7\uD130\uCE58 \uD0C0\uAC9F \uD06C\uAE30\uB97C \uC2E4\uC81C\uB85C \uBCF4\uACE0 \uD310\uB2E8\uD560 \uAC83 (\uCF54\uB4DC\uB9CC \uBCF4\uACE0 \uD1B5\uACFC\uC2DC\uD0A4\uC9C0 \uC54A\uB294\uB2E4).
|
|
729
|
+
|
|
730
|
+
\u2467 \uBAA8\uBC14\uC77C \uC804\uC6A9 \uB808\uC774\uC544\uC6C3 \u2014 \uB370\uC2A4\uD06C\uD1B1\uC744 \uC6B1\uC5EC\uB123\uC9C0 \uB9D0\uACE0 \uBAA8\uBC14\uC77C\uB9CC\uC744 \uC704\uD55C \uB808\uC774\uC544\uC6C3\uC744 \uB530\uB85C \uC7A1\uB294\uB2E4.
|
|
731
|
+
|
|
732
|
+
+ \uB370\uBAA8 \uC601\uC0C1 (\uD544\uC218, 8\uB2E8\uACC4\uC640 \uBCC4\uAC1C\uB85C \uACC4\uC18D \uCC59\uAE38 \uAC83): \uC2E4\uC0AC\uC6A9 \uD654\uBA74\uC744 \uB2F4\uC740 20~40\uCD08 \uBD84\uB7C9,
|
|
733
|
+
muted loop \uC7AC\uC0DD \uC804\uC81C. \uC601\uC0C1 \uD30C\uC77C \uC790\uCCB4\uB294 git \uBC16\uC5D0 \uB454\uB2E4(\uC6A9\uB7C9 \u2014 \uC800\uC7A5\uC18C\uC5D0 \uCEE4\uBC0B \uAE08\uC9C0).
|
|
734
|
+
|
|
735
|
+
\uC9C4\uD589\uD558\uBA74\uC11C \uB9C9\uD788\uBA74(\uC608: \uC2E4\uBB3C \uC2A4\uD06C\uB9B0\uC0F7\uC774 \uC544\uC9C1 \uC5C6\uC74C, \uAC00\uACA9 \uC2B9\uC778 \uB300\uAE30) \uB2E4\uC74C \uB2E8\uACC4\uB85C \uB118\uC5B4\uAC00\uC9C0 \uB9D0\uACE0
|
|
736
|
+
\uD604\uC7AC \uC0C1\uD0DC\uC640 \uD544\uC694\uD55C \uACB0\uC815\uC744 \uBCF4\uACE0\uD560 \uAC83.`};var tk={name:"audit",description:"\uC804 \uD654\uBA74 QA \uAC10\uC0AC \u2014 4\uC5F4 \uD310\uC815(\uB85C\uB4DC/\uC5F4\uD654/\uC644\uACB0\uC131/\uB808\uC774\uC544\uC6C3) \xD7 3\uD574\uC0C1\uB3C4, \uC218\uC815 \uAE08\uC9C0\xB7\uBCF4\uACE0\uB9CC",args:[{name:"target",description:"\uAC10\uC0AC\uD560 \uB300\uC0C1 \u2014 \uC571/\uC0AC\uC774\uD2B8 \uC774\uB984 \uB610\uB294 URL",required:!0}],template:`\uBBF8\uC158: "{target}" \uC804 \uD654\uBA74 QA \uAC10\uC0AC \u2014 \uCC3D\uC5C5\uC790\uAC00 \uD655\uC815\uD55C \uAE30\uC900\uC73C\uB85C \uACB0\uD568\uC744 \uCC3E\uB294\uB2E4.
|
|
737
|
+
|
|
738
|
+
\u26A0\uFE0F \uC6D0\uCE59: \uC774 \uBBF8\uC158\uC758 \uBAA9\uC801\uC740 **\uCC3E\uB294 \uAC83**\uC774\uB2E4. \uBC1C\uACAC\uD55C \uACB0\uD568\uC744 \uADF8 \uC790\uB9AC\uC5D0\uC11C \uACE0\uCE58\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBCF4\uACE0\uB9CC \uD55C\uB2E4.
|
|
739
|
+
"\uD654\uBA74\uC5D0 \uC9C4\uC785\uB410\uB2E4"\uB294 \uD1B5\uACFC\uAC00 \uC544\uB2C8\uB2E4("\uD654\uBA74 \uC9C4\uC785 \u2260 \uD1B5\uACFC") \u2014 \uADF8 \uD654\uBA74\uC774 \uC2E4\uC81C\uB85C \uBB34\uC5C7\uC744 \uBCF4\uC5EC\uC8FC\uB294\uC9C0,
|
|
740
|
+
\uC5B4\uB5BB\uAC8C \uBB34\uB108\uC9C0\uB294\uC9C0\uAE4C\uC9C0 \uD655\uC778\uD574\uC57C \uD310\uC815\uD560 \uC218 \uC788\uB2E4.
|
|
741
|
+
|
|
742
|
+
\uAC01 \uD45C\uBA74(\uD654\uBA74/\uD0ED/\uBAA8\uB2EC \uB2E8\uC704)\uB9C8\uB2E4 \uC544\uB798 4\uC5F4\uB85C \uD310\uC815\uD560 \uAC83:
|
|
743
|
+
|
|
744
|
+
\u2460 \uB370\uC774\uD130 \uB85C\uB4DC \u2014 \uB0B4\uC6A9\uC774 \uC2E4\uC81C\uB85C \uBCF4\uC774\uB294\uAC00. \uD1A0\uC2A4\uD2B8 \uBA54\uC2DC\uC9C0\uB9CC \uB728\uACE0 \uBCF8\uBB38\uC774 \uBE44\uC5B4 \uC788\uAC70\uB098,
|
|
745
|
+
\uBE48 \uBAA9\uB85D\uC778\uB370 \uC548\uB0B4\uAC00 \uC5C6\uAC70\uB098, \uC2A4\uD53C\uB108\uAC00 \uC548 \uC0AC\uB77C\uC9C0\uACE0 \uB0A8\uC544 \uC788\uC73C\uBA74 FAIL.
|
|
746
|
+
\u2461 \uC5F4\uD654 \uBAA8\uB4DC \u2014 \uBC31\uC5D4\uB4DC/\uC678\uBD80 \uC758\uC874(API, \uC11C\uB4DC\uD30C\uD2F0)\uC774 \uBD88\uD1B5\uC77C \uB54C \uD654\uBA74\uC774 \uC0AC\uB294\uAC00
|
|
747
|
+
(\uC644\uC804 \uBC31\uC9C0\xB7\uBB34\uD55C \uB85C\uB529\xB7\uD06C\uB798\uC2DC\uAC00 \uC544\uB2C8\uB77C \uC54C\uC544\uBCFC \uC218 \uC788\uB294 \uD3F4\uBC31/\uC5D0\uB7EC \uC0C1\uD0DC\uB85C \uBC84\uD2F0\uB294\uAC00).
|
|
748
|
+
\u2462 \uAE30\uB2A5 \uC644\uACB0\uC131 \u2014 \uC720\uC800\uAC00 \uADF8 \uD654\uBA74\uC5D0\uC11C \uB2F9\uC5F0\uD788 \uAE30\uB300\uD560 \uAE30\uB2A5\uC758 \uACF5\uBC31\uC744 \uBCF8\uB2E4
|
|
749
|
+
(\uAC80\uC0C9, \uC815\uB82C, \uBE48 \uC0C1\uD0DC \uC548\uB0B4, \uBAA8\uBC14\uC77C\uC5D0\uC11C\uC758 \uC694\uC18C \uBC30\uCE58 \uB4F1).
|
|
750
|
+
\u2463 \uB808\uC774\uC544\uC6C3 \u2014 "\uC758\uB3C4\uD55C \uAD6C\uB3C4\uC778\uAC00"\uB97C \uC5B4\uC11C\uC158\uD55C\uB2E4(\uADF8\uB0E5 \uB80C\uB354\uB410\uB2E4\uAC00 \uC544\uB2C8\uB77C). \uC5B4\uC911\uAC04\uD55C \uC904\uBC14\uAFC8,
|
|
751
|
+
\uAE00\uC790/\uC774\uBBF8\uC9C0 \uC798\uB9BC, \uC694\uC18C \uACB9\uCE68\uC744 \uC2E4\uC81C\uB85C \uBCF4\uACE0 \uD310\uB2E8\uD55C\uB2E4.
|
|
752
|
+
|
|
753
|
+
\uC2E4\uAE30 \uD574\uC0C1\uB3C4\uB294 \uC544\uB798 \uC138 \uAC00\uC9C0\uB85C \uACE0\uC815\uD55C\uB2E4 \u2014 \uC784\uC758\uC758 \uD3ED\uC73C\uB85C \uD14C\uC2A4\uD2B8\uD558\uC9C0 \uC54A\uB294\uB2E4:
|
|
754
|
+
- 1440\xD7900 (\uB370\uC2A4\uD06C\uD1B1)
|
|
755
|
+
- 1194\xD7834 (iPad 11 \uAC00\uB85C)
|
|
756
|
+
- 390\xD7844 (\uBAA8\uBC14\uC77C)
|
|
757
|
+
|
|
758
|
+
\uC2EC\uAC01\uB3C4\uB294 \uC138 \uB2E8\uACC4\uB85C \uB9E4\uAE34\uB2E4:
|
|
759
|
+
- P0 \u2014 \uB85C\uB4DC \uC2E4\uD328\xB7\uB9C9\uD798 (\uD654\uBA74\uC774 \uC544\uC608 \uBABB \uB728\uAC70\uB098 \uD575\uC2EC \uB3D9\uC791\uC774 \uC644\uC804\uD788 \uB9C9\uD798)
|
|
760
|
+
- P1 \u2014 \uAE30\uB2A5 \uACB0\uD568 (\uD654\uBA74\uC740 \uB728\uC9C0\uB9CC \uAE30\uB300 \uAE30\uB2A5\uC774 \uC5C6\uAC70\uB098 \uC798\uBABB \uB3D9\uC791)
|
|
761
|
+
- P2 \u2014 \uC2DC\uAC01\xB7UX \uACF5\uBC31 (\uB3D9\uC791\uC740 \uD558\uC9C0\uB9CC \uB808\uC774\uC544\uC6C3/\uB514\uD14C\uC77C\uC774 \uC5B4\uC0C9\uD568)
|
|
762
|
+
|
|
763
|
+
\uC9C4\uD589 \uBC29\uC2DD: \uB300\uC0C1\uC758 \uD45C\uBA74\uC744 \uBA3C\uC800 \uBAA9\uB85D\uD654(\uD0ED/\uD654\uBA74/\uBAA8\uB2EC \uB2E8\uC704)\uD55C \uB4A4, \uD45C\uBA74\uB9C8\uB2E4 3\uAC1C \uD574\uC0C1\uB3C4\uC5D0\uC11C
|
|
764
|
+
4\uC5F4 \uD310\uC815\uC744 \uC2E4\uC81C\uB85C \uD655\uC778\uD55C\uB2E4(\uCF54\uB4DC\uB9CC \uBCF4\uACE0 \uD1B5\uACFC\uC2DC\uD0A4\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBE0C\uB77C\uC6B0\uC800 \uB3C4\uAD6C\uB85C \uC9C1\uC811 \uC5F4\uC5B4\uBCF8\uB2E4).
|
|
765
|
+
|
|
766
|
+
\uCD9C\uB825 \uD615\uC2DD:
|
|
767
|
+
1. \uD45C\uBA74\uBCC4 4\uC5F4 \uD45C (\uD45C\uBA74 \uC774\uB984 \xD7 \u2460\u2461\u2462\u2463 \uD310\uC815 \uACB0\uACFC, PASS/FAIL \uB610\uB294 \uD55C\uC904 \uC0C1\uD0DC)
|
|
768
|
+
2. \uACB0\uD568 \uBAA9\uB85D \u2014 \uAC01 \uD56D\uBAA9\uC5D0 \uC7AC\uD604 \uACBD\uB85C(\uC5B4\uB5BB\uAC8C \uB3C4\uB2EC\uD558\uB294\uC9C0)\uC640 \uC2A4\uD06C\uB9B0\uC0F7 \uACBD\uB85C\uB97C \uB0A8\uAE34\uB2E4
|
|
769
|
+
(\uC2A4\uD06C\uB9B0\uC0F7\uC740 \uD30C\uC77C\uB85C \uC800\uC7A5\uD558\uACE0 \uACBD\uB85C\uB97C \uC801\uC744 \uAC83 \u2014 \uB9D0\uB85C\uB9CC \uC124\uBA85\uD558\uC9C0 \uC54A\uB294\uB2E4)
|
|
770
|
+
3. \uC774\uBBF8 \uC54C\uB824\uC9C4 \uC774\uC288\uB294 \uC0C8 \uACB0\uD568\uC73C\uB85C \uC138\uC9C0 \uB9D0\uACE0 "\uAE30\uC9C0"\uB85C \uD45C\uC2DC\uD55C\uB2E4(\uC911\uBCF5 \uBCF4\uACE0 \uBC29\uC9C0)
|
|
771
|
+
|
|
772
|
+
\uC218\uC815\uC740 \uD558\uC9C0 \uC54A\uB294\uB2E4. \uB9C9\uD788\uAC70\uB098 \uD310\uB2E8\uC774 \uC560\uB9E4\uD558\uBA74 \uB118\uACA8\uC9DA\uC9C0 \uB9D0\uACE0 \uD604\uC7AC \uC0C1\uD0DC\uC640 \uD310\uB2E8 \uADFC\uAC70\uB97C \uBCF4\uACE0\uD560 \uAC83.`};var rk={name:"deploy",description:"\uB85C\uCEEC \uBE4C\uB4DC \u2192 rsync \uC804\uC1A1 \u2192 \uB77C\uC774\uBE0C \uB300\uC870 \uAC80\uC99D \u2192 \uC2EC\uCE35 \uD5EC\uC2A4 \uD655\uC778 \u2192 \uACB0\uACFC \uD55C \uC904 \uBCF4\uACE0 (\uC6F9\xB7API\xB7\uB458\uB2E4)",args:[{name:"target",description:"\uBC30\uD3EC \uB300\uC0C1 \u2014 \uC6F9 \xB7 API \xB7 \uB458\uB2E4",required:!0}],template:`\uBBF8\uC158: "{target}" \uBC30\uD3EC \u2014 \uCC3D\uC5C5\uC790\uAC00 \uD655\uC815\uD55C \uC808\uCC28\uB97C \uC21C\uC11C\uB300\uB85C \uBC1F\uB294\uB2E4.
|
|
773
|
+
\uC2DC\uC791 \uC804\uC5D0 \uBC18\uB4DC\uC2DC \`git fetch && git rebase origin/main\` \uC73C\uB85C \uB85C\uCEEC\uC744 \uCD5C\uC2E0\uD654\uD560 \uAC83 \u2014 \uB9AC\uBCA0\uC774\uC2A4
|
|
774
|
+
\uCDA9\uB3CC\uC774 \uB098\uBA74 \uC784\uC758\uB85C \uD574\uC18C\uD558\uC9C0 \uB9D0\uACE0 \uD604\uC7AC \uC0C1\uD0DC\uB97C \uBCF4\uACE0\uD55C\uB2E4.
|
|
775
|
+
|
|
776
|
+
\u2460 \uB85C\uCEEC \uBE4C\uB4DC \u2014
|
|
777
|
+
- \uC6F9: \`npm run build\`. \u26A0\uFE0F \uBC30\uD3EC \uC9C1\uC804\uC5D0 \uD55C \uBC88 \uB354 \uB3CC\uB9B4 \uAC83 \u2014 \uD2B9\uD788 \uBE4C\uB4DC \uB4A4\uC5D0 \uD14C\uC2A4\uD2B8\uB97C \uB3CC\uB838\uB2E4\uBA74.
|
|
778
|
+
vitest \uB3C4 vite.config.ts \uB97C \uB85C\uB4DC\uD574\uC11C, \uADF8\uB54C\uB3C4 version.json \uD50C\uB7EC\uADF8\uC778\uC774 \uB3CC\uC544 **\uBC88\uB4E4\uC740
|
|
779
|
+
\uADF8\uB300\uB85C\uC778\uB370 version.json \uB9CC \uC0C8 \uD0C0\uC784\uC2A4\uD0EC\uD504**\uAC00 \uB418\uB294 \uC0AC\uACE0\uAC00 \uC788\uC5C8\uB2E4. \uADF8 \uC9DD\uC774 \uBC30\uD3EC\uB418\uBA74
|
|
780
|
+
\uC5F4\uB9B0 \uD0ED \uC804\uBD80\uAC00 \uBB34\uD55C \uC0C8\uB85C\uACE0\uCE68\uD55C\uB2E4.
|
|
781
|
+
- API: \uC800\uC7A5\uC18C\uC758 API \uC18C\uC2A4 \uB514\uB809\uD130\uB9AC\uC5D0\uC11C \`npx tsc\`. \u26A0\uFE0F \uC11C\uBC84\uC5D4 typescript \uAC00 \uC5C6\uB2E4(\uC6B4\uC601 \uC124\uCE58\uB77C
|
|
782
|
+
devDependency \uC81C\uC678) \u2014 \uBC18\uB4DC\uC2DC \uB85C\uCEEC\uC5D0\uC11C \uBE4C\uB4DC\uD55C dist \uB97C \uC62C\uB824\uC57C \uD55C\uB2E4. src \uB9CC \uC62C\uB9AC\uACE0
|
|
783
|
+
\uC7AC\uC2DC\uC791\uD558\uBA74 \uC544\uBB34\uAC83\uB3C4 \uBC18\uC601 \uC548 \uB41C \uCC44 \uC131\uACF5\uD55C \uAC83\uCC98\uB7FC \uBCF4\uC778\uB2E4.
|
|
784
|
+
- \uB458\uB2E4: \uC6F9 \uBA3C\uC800, \uADF8\uB2E4\uC74C API. \u26A0\uFE0F \uC6F9 \uBE4C\uB4DC\uC640 electron \uBE4C\uB4DC\uB97C \uB3D9\uC2DC\uC5D0 \uB3CC\uB9AC\uC9C0 \uC54A\uB294\uB2E4 \u2014
|
|
785
|
+
\uAC19\uC740 dist/ \uC5D0 \uC4F4\uB2E4.
|
|
786
|
+
|
|
787
|
+
\u2461 rsync \uC804\uC1A1 \u2014
|
|
788
|
+
- \uC6F9: \`dist/\` \u2192 alpha \`/var/www/protocol/web/\`
|
|
789
|
+
- API: \uBE4C\uB4DC\uB41C \`dist/\` **\uC640** \`src/\` \uB97C \uD568\uAED8 \u2192
|
|
790
|
+
alpha \`/var/www/protocol/api/{dist,src}/\` (src \uB3C4 \uD568\uAED8 \u2014 \uC11C\uBC84\uAC00 \uC77D\uB294 \uB370\uC774\uD130 \uD30C\uC77C \uB54C\uBB38),
|
|
791
|
+
\uC804\uC1A1 \uD6C4 \`pm2 restart protocol-api\` (\uC758\uC874\uC131\uC774 \uBC14\uB00C\uC5C8\uC744 \uB54C\uB9CC npm install).
|
|
792
|
+
|
|
793
|
+
\u2462 \uAC80\uC99D \u2014 "\uB0B4\uAC00 \uBC29\uAE08 \uC62C\uB9B0 \uAC83\uC774 \uB77C\uC774\uBE0C\uC5D0 \uAC78\uB838\uB294\uAC00"\uB97C \uB300\uC870\uD55C\uB2E4:
|
|
794
|
+
- \uC6F9: \uB77C\uC774\uBE0C \`index.html\` \uC774 \uAC00\uB9AC\uD0A4\uB294 \uBC88\uB4E4 \uD574\uC2DC \u2194 \uB85C\uCEEC \`dist/assets/index-*.js\` \uB300\uC870,
|
|
795
|
+
\`curl -s https://protocolai.tech/version.json\` \u2194 \`dist/version.json\` \uB300\uC870.
|
|
796
|
+
\u26A0\uFE0F \uBC88\uB4E4 \uD574\uC2DC\uB85C "\uAC19\uC740 \uCF54\uB4DC\uC778\uC9C0"\uB294 \uD310\uB2E8\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 vite.config.ts \uAC00 Date.now() \uB97C
|
|
797
|
+
\uC5D4\uD2B8\uB9AC \uCCAD\uD06C\uC5D0 \uBC15\uC544 \uC18C\uC2A4\uAC00 \uC548 \uBC14\uB00C\uC5B4\uB3C4 \uBE4C\uB4DC\uB9C8\uB2E4 \uD574\uC2DC\uAC00 \uB2EC\uB77C\uC9C4\uB2E4. \uD574\uC2DC\uB294 "\uBC29\uAE08 \uC62C\uB9B0
|
|
798
|
+
\uAC83\uC774 \uB77C\uC774\uBE0C\uC5D0 \uAC78\uB838\uB294\uAC00"\uB9CC \uBCF4\uACE0, \uCF54\uB4DC \uB3D9\uC77C\uC131\uC740 \uB0B4\uC6A9 \uBE44\uAD50\uB098 version.json \uC73C\uB85C \uBCF8\uB2E4.
|
|
799
|
+
- API: \uC7AC\uC2DC\uC791 \uB4A4 \uAE30\uB3D9 \uB85C\uADF8(\`~/.pm2/logs/protocol-api-out.log\`)\uC5D0 \uBC14\uB010 \uD568\uC218\uAC00
|
|
800
|
+
\uB4F1\uB85D\uB410\uB294\uC9C0 \uD655\uC778\uD55C\uB2E4.
|
|
801
|
+
|
|
802
|
+
\u2463 \uC2EC\uCE35 \uD5EC\uC2A4 \u2014 \`curl -s https://protocolai.tech/api/health/deep\` \uB85C \uC778\uC99D\uB41C \uC2E4\uD638\uCD9C\uAE4C\uC9C0
|
|
803
|
+
\uC131\uACF5\uD558\uB294\uC9C0 \uD655\uC778\uD55C\uB2E4. \u26A0\uFE0F \`pm2 list\` \uC758 online, \uBB34\uD1A0\uD070 \uC694\uCCAD\uC758 401 \uC740 \uD504\uB85C\uC138\uC2A4\uAC00 \uB5A0
|
|
804
|
+
\uC788\uB2E4\uB294 \uAC83\uB9CC \uC99D\uBA85\uD560 \uBFD0 \uBAA8\uB378 \uD638\uCD9C\uC774 \uC2E4\uC81C\uB85C \uC131\uACF5\uD55C\uB2E4\uB294 \uB73B\uC774 \uC544\uB2C8\uB2E4 \u2014 \uC774 \uB458\uC774 \uC815\uC0C1\uC73C\uB85C
|
|
805
|
+
\uBCF4\uC774\uB294 \uB3D9\uC548\uC5D0\uB3C4 /api/chat \uC804\uCCB4\uAC00 \uC8FD\uC5B4 \uC788\uC5C8\uB358 \uC0AC\uACE0\uAC00 \uC788\uC5C8\uB2E4.
|
|
806
|
+
|
|
807
|
+
\u2464 \uACB0\uACFC \uD55C \uC904 \uBCF4\uACE0 \u2014 \uBC30\uD3EC \uC644\uB8CC \uC5EC\uBD80\uC640 \uAC80\uC99D \uACB0\uACFC(\u2462\u2463)\uB97C \uD55C \uC904\uB85C \uBCF4\uACE0\uD55C\uB2E4.
|
|
808
|
+
|
|
809
|
+
\uC9C4\uD589\uD558\uBA74\uC11C \uB9C9\uD788\uBA74(\uC608: \uB9AC\uBCA0\uC774\uC2A4 \uCDA9\uB3CC, rsync \uC2E4\uD328, \uBC88\uB4E4 \uB300\uC870 \uBD88\uC77C\uCE58, \uD5EC\uC2A4\uCCB4\uD06C \uC2E4\uD328)
|
|
810
|
+
\uB118\uACA8\uC9DA\uC9C0 \uB9D0\uACE0 \uD604\uC7AC \uC0C1\uD0DC\uC640 \uD544\uC694\uD55C \uACB0\uC815\uC744 \uBCF4\uACE0\uD560 \uAC83.`};var nk={name:"db-migration",description:"DB \uC774\uD589 10\uC6D0\uCE59 \u2014 \uADDC\uCE59 \uC120\uBD84\uB9AC\xB7\uC2E0\uC800\uC7A5\uC18C\uC6B0\uC120+lazy seed\xB7\uC774\uC911\uC4F0\uAE30\xB7\uD50C\uB798\uADF8 \uAE30\uBCF8 off\xB7fail-open/closed \uD310\uB2E8",args:[{name:"data",description:"\uC774\uD589\uD560 \uB370\uC774\uD130 \uC885\uB958 (\uC608: \uBC29\uBB38 \uAE30\uB85D, \uC0AC\uC6A9\uB7C9, \uC720\uC800 \uB370\uC774\uD130)",required:!0}],template:`\uBBF8\uC158: "{data}" \uC774\uD589(migration) \u2014 \uCC3D\uC5C5\uC790\uAC00 \uD655\uC815\uD55C 10\uB2E8\uACC4 \uC6D0\uCE59\uC744 \uC21C\uC11C\uB300\uB85C \uC9C0\uD0A8\uB2E4.
|
|
811
|
+
\uC5B8\uC81C\uB4E0 \uB418\uB3CC\uB9B4 \uC218 \uC788\uB294 \uACBD\uB85C\uB97C \uC5F4\uC5B4\uB454 \uCC44 \uC9C4\uD589\uD560 \uAC83 \u2014 \uD55C\uCABD\uC73C\uB85C\uB9CC \uAC08 \uC218 \uC788\uB294 \uC804\uD658\uC740 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4.
|
|
812
|
+
|
|
813
|
+
\u2460 \uC21C\uC218 \uADDC\uCE59 \uD30C\uC77C \uC120\uBD84\uB9AC \u2014 \uD310\uC815/\uACC4\uC0B0 \uB85C\uC9C1\uC744 \uC800\uC7A5\uC18C \uC885\uB958\uC640 \uBB34\uAD00\uD55C \uC21C\uC218 \uD568\uC218\uB85C \uBA3C\uC800 \uBF51\uC544\uB0B8\uB2E4.
|
|
814
|
+
\uB450 \uC800\uC7A5\uC18C\uAC00 **\uAC19\uC740 \uD568\uC218**\uB97C \uD638\uCD9C\uD558\uAC8C \uB9CC\uB4E4\uC5B4, \uC800\uC7A5\uC18C\uBCC4\uB85C \uB3D9\uC791\uC774 \uAC08\uB9AC\uB294 \uAC78 \uAD6C\uC870\uC801\uC73C\uB85C \uB9C9\uB294\uB2E4.
|
|
815
|
+
|
|
816
|
+
\u2461 \uC2E0 \uC800\uC7A5\uC18C \uC6B0\uC120 + lazy seed \u2014 \uC2E0 \uC800\uC7A5\uC18C\uB97C \uBA3C\uC800 \uC870\uD68C\uD558\uACE0, \uD589\uC774 \uC5C6\uC73C\uBA74 \uAD6C \uC800\uC7A5\uC18C\uC5D0\uC11C
|
|
817
|
+
\uAC12\uC744 \uAC00\uC838\uC640 \uC2E0 \uC800\uC7A5\uC18C\uC5D0 \uC2EC\uB294\uB2E4(1\uD68C \uC790\uC5F0 \uC774\uC8FC). \uC694\uCCAD\uC774 \uBC18\uBCF5\uB418\uBA70 \uC2A4\uC2A4\uB85C \uC774\uC8FC\uAC00 \uC644\uACB0\uB41C\uB2E4.
|
|
818
|
+
|
|
819
|
+
\u2462 \uAD6C \uC800\uC7A5\uC18C \uBD88\uD1B5 \uC2DC \uD3F4\uBC31 \u2014 \uAD6C \uC800\uC7A5\uC18C\uAC00 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC73C\uBA74 \uC548\uC804\uD55C \uAE30\uBCF8\uAC12\uC744 \uC4F0\uACE0 \`needs_sync\`
|
|
820
|
+
\uB85C \uD45C\uC2DC\uD574\uB454\uB2E4. \uC774\uD6C4 \uC694\uCCAD\uC774 \uADF8 \uD45C\uC2DC\uB97C \uBCF4\uACE0 \uC2A4\uC2A4\uB85C \uC218\uB834\uC2DC\uD0A8\uB2E4 \u2014 \uC0AC\uB78C\uC774 \uC218\uB3D9 \uAC1C\uC785\uD558\uC9C0 \uC54A\uC544\uB3C4 \uB41C\uB2E4.
|
|
821
|
+
|
|
822
|
+
\u2463 \uC4F0\uAE30\uB294 \uC774\uC911\uC73C\uB85C \u2014 \uC2E0 \uC800\uC7A5\uC18C\uB97C \uC6B0\uC120 \uC4F0\uACE0 \uAD6C \uC800\uC7A5\uC18C\uB294 \uBBF8\uB7EC\uB85C \uD568\uAED8 \uC4F4\uB2E4. \uBBF8\uB7EC \uC4F0\uAE30\uAC00
|
|
823
|
+
\uC2E4\uD328\uD574\uB3C4 \uC2E0 \uC800\uC7A5\uC18C \uC4F0\uAE30\uAC00 \uC131\uACF5\uD588\uC73C\uBA74 \uC694\uCCAD \uC790\uCCB4\uB294 \uACC4\uC18D \uC9C4\uD589\uD55C\uB2E4(\uBBF8\uB7EC \uC2E4\uD328\uB85C \uC720\uC800 \uC694\uCCAD\uC744 \uB9C9\uC9C0 \uC54A\uB294\uB2E4).
|
|
824
|
+
|
|
825
|
+
\u2464 \uD50C\uB798\uADF8\uB294 \uB370\uC774\uD130 \uC131\uACA9\uBCC4\uB85C \uBD84\uB9AC \u2014 \uC774\uD589 \uD50C\uB798\uADF8\uB294 \uB370\uC774\uD130 \uC885\uB958\uB9C8\uB2E4 \uB530\uB85C \uB450\uACE0, \uAE30\uBCF8\uAC12\uC740
|
|
826
|
+
\uC804\uBD80 off \uB85C \uC2DC\uC791\uD55C\uB2E4. \uD55C \uD50C\uB798\uADF8\uB97C \uCF20 \uAC8C \uB2E4\uB978 \uB370\uC774\uD130 \uC885\uB958\uC5D0 \uC601\uD5A5\uC744 \uC8FC\uBA74 \uC548 \uB41C\uB2E4.
|
|
827
|
+
|
|
828
|
+
\u2465 \uBC30\uD3EC \uC21C\uC11C \u2014 \uC2A4\uD0A4\uB9C8 \u2192 \uC11C\uBC84 \uCF54\uB4DC \u2192 \uD504\uB860\uD2B8 \uACBD\uB85C \uC804\uD658 \u2192 \uC774\uC911\uC4F0\uAE30 \uD655\uC778 \u2192 \uC77D\uAE30 \uC804\uD658 \u2192
|
|
829
|
+
\uC218\uB834 \uCE74\uC6B4\uD2B8(\`needs_sync\` \uC794\uB7C9) \uAD00\uCC30. \uC21C\uC11C\uB97C \uAC74\uB108\uB6F0\uC9C0 \uC54A\uB294\uB2E4.
|
|
830
|
+
|
|
831
|
+
\u2466 \uB864\uBC31 = env \uD55C \uC904 \u2014 \uBB38\uC81C\uAC00 \uC0DD\uAE30\uBA74 \uD50C\uB798\uADF8 \uD558\uB098\uB97C \uB044\uB294 \uAC83\uB9CC\uC73C\uB85C \uC774\uC804 \uACBD\uB85C\uB85C \uB3CC\uC544\uAC00\uC57C
|
|
832
|
+
\uD55C\uB2E4. \uB864\uBC31\uC5D0 \uCF54\uB4DC \uBC30\uD3EC\uAC00 \uD544\uC694\uD558\uBA74 \uC124\uACC4\uB97C \uB2E4\uC2DC \uBCF8\uB2E4.
|
|
833
|
+
|
|
834
|
+
\u2467 fail-open/closed \uD310\uB2E8 \u2014 \uB3C8\uC774 \uAC78\uB9B0 \uB370\uC774\uD130(\uACFC\uAE08\xB7\uC0AC\uC6A9\uB7C9)\uB294 \uBD88\uD1B5 \uC2DC **\uB9C9\uB294 \uCABD**(fail-closed),
|
|
835
|
+
\uC9C4\uC785 \uC790\uCCB4\uB97C \uB9C9\uC73C\uBA74 \uC548 \uB418\uB294 \uB370\uC774\uD130(\uBC29\uBB38\xB7\uB85C\uADF8\uC778 \uAD00\uBB38 \uB4F1)\uB294 \uBD88\uD1B5\uC774\uC5B4\uB3C4 **\uD1B5\uACFC\uC2DC\uD0A4\uB294 \uCABD**
|
|
836
|
+
(fail-open)\uC73C\uB85C, \uC774\uBC88 \uB370\uC774\uD130\uC758 \uC131\uACA9\uC5D0 \uB9DE\uAC8C \uD310\uB2E8\uD574 \uBA85\uC2DC\uD560 \uAC83.
|
|
837
|
+
|
|
838
|
+
\u2468 \uD0C8\uD1F4 \uC0AD\uC81C \uBC30\uC120 \u2014 \uD68C\uC6D0\uD0C8\uD1F4 \uC2DC \uC2E0\xB7\uAD6C \uC800\uC7A5\uC18C \uC591\uCABD\uC5D0\uC11C \uD574\uB2F9 \uC720\uC800 \uB370\uC774\uD130\uAC00 \uC2E4\uC81C\uB85C
|
|
839
|
+
\uC9C0\uC6CC\uC9C0\uB294\uC9C0(\uB610\uB294 \uC815\uCC45\uC0C1 \uAC00\uBA85 \uBCF4\uAD00\uC778\uC9C0)\uB97C \uD655\uC778\uD558\uACE0, \uBC30\uC120\uC744 \uBE60\uB728\uB9AC\uC9C0 \uC54A\uB294\uB2E4.
|
|
840
|
+
|
|
841
|
+
\u2469 "\uD589 \uC5C6\uC74C"\uACFC "\uBE48 \uB370\uC774\uD130" \uAD6C\uBD84 \u2014 \uC2E0 \uC800\uC7A5\uC18C\uC5D0 \uD589\uC774 \uC5C6\uB294 \uAC83\uACFC, \uD589\uC740 \uC788\uC9C0\uB9CC \uAC12\uC774 \uBE44\uC5B4
|
|
842
|
+
\uC788\uB294 \uAC83\uC744 \uAD6C\uBD84\uD55C\uB2E4. \uC804\uC790\uB97C \uD6C4\uC790\uB85C(=\uC2E0\uADDC \uC720\uC800\uB85C) \uCDE8\uAE09\uD558\uBA74 \uAE30\uC874 \uC720\uC800 \uB370\uC774\uD130\uAC00 \uCD08\uAE30\uD654\uB41C
|
|
843
|
+
\uAC83\uCC98\uB7FC \uC624\uD310\uB418\uB294 \uC0AC\uACE0\uAC00 \uB09C\uB2E4.
|
|
844
|
+
|
|
845
|
+
\uC9C4\uD589\uD558\uBA74\uC11C \uB9C9\uD788\uBA74(\uC608: \uC21C\uC218 \uD568\uC218\uB85C \uBABB \uBF51\uC544\uB0B4\uB294 \uC800\uC7A5\uC18C\uBCC4 \uB85C\uC9C1\uC774 \uC788\uC74C, \uB864\uBC31 \uACBD\uB85C\uAC00
|
|
846
|
+
\uBA85\uD655\uD558\uC9C0 \uC54A\uC74C, fail-open/closed \uD310\uB2E8\uC774 \uC560\uB9E4\uD568) \uB118\uACA8\uC9DA\uC9C0 \uB9D0\uACE0 \uD604\uC7AC \uC0C1\uD0DC\uC640 \uD544\uC694\uD55C \uACB0\uC815\uC744
|
|
847
|
+
\uBCF4\uACE0\uD560 \uAC83.`};var ok={name:"defect-fix",description:"\uACB0\uD568 \uC218\uC815 \u2014 \uC7AC\uD604\xB7\uC6D0\uC778\uADDC\uBA85 \u2192 \uCD5C\uC18C\uC218\uC815 \u2192 \uC2E4\uAE30 \uC5B4\uC11C\uC158 \uAC80\uC99D(3\uD574\uC0C1\uB3C4) \u2192 \uD68C\uADC0\uD655\uC778 \u2192 \uBC30\uD3EC \u2192 \uC2E4\uAE30 \uD655\uC778 \uC694\uCCAD",args:[{name:"defect",description:"\uACB0\uD568 \uC124\uBA85 (\uC99D\uC0C1 + \uC7AC\uD604 \uACBD\uB85C\uAC00 \uC788\uC73C\uBA74 \uD568\uAED8)",required:!0}],template:`\uBBF8\uC158: "{defect}" \uACB0\uD568 \uC218\uC815 \u2014 \uCC3D\uC5C5\uC790\uAC00 \uD655\uC815\uD55C \uC808\uCC28\uB97C \uC21C\uC11C\uB300\uB85C \uBC1F\uB294\uB2E4.
|
|
848
|
+
"\uC5D0\uB7EC \uB85C\uADF8\uAC00 \uC5C6\uB2E4"\uB294 \uD1B5\uACFC \uADFC\uAC70\uAC00 \uC544\uB2C8\uB2E4 \u2014 \uC758\uB3C4\uD55C \uC0C1\uD0DC\uB97C \uC2E4\uC81C\uB85C \uD655\uC778\uD574\uC57C \uD310\uC815\uD560 \uC218 \uC788\uB2E4.
|
|
849
|
+
|
|
850
|
+
\u2460 \uC7AC\uD604\xB7\uC6D0\uC778 \uADDC\uBA85 \u2014 \uBA3C\uC800 \uACB0\uD568\uC744 \uC7AC\uD604\uD55C\uB2E4. \uC774 \uACB0\uD568\uC5D0 **\uC774\uC804 \uC218\uC815 \uC774\uB825**\uC774 \uC788\uB2E4\uBA74 \uADF8
|
|
851
|
+
\uC218\uC815\uC774 \uC65C \uC548 \uBA39\uD614\uB294\uC9C0\uAE4C\uC9C0 \uADDC\uBA85\uD560 \uAC83 \u2014 \uC6D0\uC778\uC744 \uACE0\uCE5C \uAC8C \uC544\uB2C8\uB77C \uC99D\uC0C1\uC744 \uB2E4\uB978 \uB370\uB85C
|
|
852
|
+
\uBC00\uC5B4\uB0B8 \uD754\uC801(\uC608: \uC870\uAC74 \uD558\uB098\uB9CC \uCD94\uAC00\uD574 \uD2B9\uC815 \uCF00\uC774\uC2A4\uB9CC \uAC00\uB9BC)\uC774 \uC788\uB294\uC9C0 \uC758\uC2EC\uD558\uACE0 \uD655\uC778\uD55C\uB2E4.
|
|
853
|
+
|
|
854
|
+
\u2461 \uCD5C\uC18C \uC218\uC815 \u2014 \uC6D0\uC778\uC744 \uACE0\uCE5C\uB2E4. \uC99D\uC0C1\uB9CC \uAC00\uB9AC\uB294 \uC218\uC815(\uC5D0\uB7EC\uB97C \uC0BC\uD0A4\uAE30, \uC608\uC678 \uCF00\uC774\uC2A4\uB9CC \uD68C\uD53C)\uC740
|
|
855
|
+
\uD558\uC9C0 \uC54A\uB294\uB2E4.
|
|
856
|
+
|
|
857
|
+
\u2462 \uC2E4\uAE30 \uD574\uC0C1\uB3C4\uB85C \uC5B4\uC11C\uC158 \uAC80\uC99D \u2014 "\uC758\uB3C4\uD55C \uC0C1\uD0DC"\uB97C \uC2E4\uC81C\uB85C \uD655\uC778\uD55C\uB2E4(\uC5D0\uB7EC \uC5C6\uC74C\uC740 \uD1B5\uACFC
|
|
858
|
+
\uADFC\uAC70\uAC00 \uC544\uB2C8\uB2E4). \uC544\uB798 \uD574\uC0C1\uB3C4\uC5D0\uC11C \uD655\uC778\uD560 \uAC83:
|
|
859
|
+
- 1440\xD7900 (\uB370\uC2A4\uD06C\uD1B1)
|
|
860
|
+
- 1194\xD7834 (iPad 11 \uAC00\uB85C)
|
|
861
|
+
- 390\xD7844 (\uBAA8\uBC14\uC77C) \u2014 **\uC2E4\uAE30 \uC0AC\uD30C\uB9AC\uB294 \uBE0C\uB77C\uC6B0\uC800 \uD06C\uB86C \uB54C\uBB38\uC5D0 \uC2E4\uC81C \uBDF0\uD3EC\uD2B8 \uB192\uC774\uAC00
|
|
862
|
+
700 \uC548\uD30E\uC73C\uB85C \uB354 \uB0AE\uB2E4.** 390\xD7844 \uC2DC\uBBAC\uB808\uC774\uD130 \uAC12\uB9CC \uBCF4\uACE0 \uD1B5\uACFC\uC2DC\uD0A4\uC9C0 \uB9D0\uACE0, \uC2E4\uAE30 \uC0AC\uD30C\uB9AC\uC5D0\uC11C
|
|
863
|
+
\uC8FC\uC18C\uCC3D/\uD558\uB2E8 \uBC14\uAC00 \uBDF0\uD3EC\uD2B8\uB97C \uC5BC\uB9C8\uB098 \uC7A0\uC2DD\uD558\uB294\uC9C0 \uAC10\uC548\uD574 \uD655\uC778\uD55C\uB2E4.
|
|
864
|
+
|
|
865
|
+
\u2463 \uD68C\uADC0 \uD655\uC778 \u2014 \uC774\uBC88 \uC218\uC815\uC774 \uB2FF\uC9C0 \uC54A\uC544\uC57C \uD560 \uB2E4\uB978 \uD654\uBA74(\uB370\uC2A4\uD06C\uD1B1\xB7\uBAA8\uBC14\uC77C \uB458 \uB2E4)\uC774
|
|
866
|
+
\uADF8\uB300\uB85C\uC778\uC9C0 \uC99D\uBA85\uD55C\uB2E4. "\uC5EC\uAE30\uB9CC \uACE0\uCCE4\uB2E4"\uAC00 \uC544\uB2C8\uB77C "\uB2E4\uB978 \uB370\uB294 \uC548 \uBC14\uB00C\uC5C8\uB2E4"\uB97C \uC9C1\uC811 \uBCF4\uC5EC\uC904 \uAC83.
|
|
867
|
+
|
|
868
|
+
\u2464 \uBC30\uD3EC \u2014 \uAC80\uC99D\uC774 \uB05D\uB09C \uB4A4\uC5D0\uB9CC \uBC30\uD3EC\uD55C\uB2E4(\uBE4C\uB4DC\u2192\uC804\uC1A1\u2192\uB300\uC870 \uAC80\uC99D\u2192\uC2EC\uCE35 \uD5EC\uC2A4 \uD655\uC778 \u2014 deploy
|
|
869
|
+
\uD50C\uB808\uC774\uBD81\uACFC \uB3D9\uC77C \uC808\uCC28).
|
|
870
|
+
|
|
871
|
+
\u2465 \uC2E4\uAE30 \uD655\uC778 \uC694\uCCAD \u2014 \uCC3D\uC5C5\uC790 \uAE30\uAE30\uC5D0\uC11C\uC758 \uC2E4\uAE30 \uD655\uC778\uC744 \uC694\uCCAD\uD558\uB294 \uAC83\uAE4C\uC9C0\uAC00 \uC644\uB8CC\uB2E4. \uBC30\uD3EC\uB410\uB2E4\uACE0
|
|
872
|
+
\uC644\uB8CC\uB85C \uBCF4\uACE0\uD558\uC9C0 \uC54A\uB294\uB2E4.
|
|
873
|
+
|
|
874
|
+
\uC9C4\uD589\uD558\uBA74\uC11C \uB9C9\uD788\uBA74(\uC608: \uC7AC\uD604\uC774 \uC548 \uB428, \uC6D0\uC778\uC774 \uC5EC\uB7EC \uAC1C\uB85C \uAC08\uB9BC, \uC774\uC804 \uC218\uC815 \uC774\uB825\uC744 \uBABB \uCC3E\uC74C)
|
|
875
|
+
\uB118\uACA8\uC9DA\uC9C0 \uB9D0\uACE0 \uD604\uC7AC \uC0C1\uD0DC\uC640 \uD544\uC694\uD55C \uACB0\uC815\uC744 \uBCF4\uACE0\uD560 \uAC83.`};var ik={name:"carousel",description:"\uCE74\uB8E8\uC140 \uC81C\uC791 \u2014 \uB808\uD37C\uB7F0\uC2A4 \uD1A4 \uD655\uC778 \u2192 3\uC7A5 \uC52C\uAD6C\uC131 \u2192 \uCE74\uD53C \uADDC\uCE59 \u2192 1080\xD71350/OFL \u2192 \uBE44\uAD50\uC2DC\uD2B8 \u2192 \uC2B9\uC778 \uD6C4 \uAC8C\uC2DC",args:[{name:"topic",description:"\uCE74\uB8E8\uC140 \uC8FC\uC81C",required:!0}],template:`\uBBF8\uC158: "{topic}" \uCE74\uB8E8\uC140 \uC81C\uC791 \u2014 \uCC3D\uC5C5\uC790\uAC00 \uD655\uC815\uD55C \uD1A4\xB7\uADDC\uCE59\uC73C\uB85C \uB9CC\uB4E0\uB2E4.
|
|
876
|
+
|
|
877
|
+
\u2460 \uB808\uD37C\uB7F0\uC2A4 \uD1A4 \uD655\uC778 \u2014 \uD68C\uC0C9\uC9C0 \uC9C8\uAC10 + \uD3B8\uC9D1 \uD0C0\uC774\uD3EC + \uBE0C\uB77C\uC6B0\uC800 \uBAA9\uC5C5 + \uB178\uB791 \uD55C \uC810, \uC774 \uC870\uD569\uC774
|
|
878
|
+
\uAE30\uC900 \uD1A4\uC774\uB2E4. \u26A0\uFE0F "AI \uD2F0 \uB098\uB294 \uC2E4\uBB3C\uAC10 \uC2DC\uBBAC\uB808\uC774\uC158"\uC740 \uAE08\uC9C0 \u2014 \uAC00\uC9DC \uBC18\uC0AC\uAD11\xB7\uACFC\uD55C \uADF8\uB77C\uB370\uC774\uC158\xB7
|
|
879
|
+
\uD569\uC131\uD2F0 \uB098\uB294 \uBAA9\uC5C5\uC73C\uB85C \uC9C4\uC9DC\uCC98\uB7FC \uBCF4\uC774\uB824 \uC560\uC4F0\uC9C0 \uC54A\uB294\uB2E4. \uC808\uC81C\uB41C \uD3B8\uC9D1 \uB514\uC790\uC778\uC73C\uB85C \uAC04\uB2E4.
|
|
880
|
+
|
|
881
|
+
\u2461 \uC52C \uAD6C\uC131 3\uC7A5 \u2014 \uD6C5(hook) \u2192 \uBCF8\uBB38 \u2192 CTA \uC21C\uC11C\uB85C \uC815\uD655\uD788 3\uC7A5\uC744 \uB9CC\uB4E0\uB2E4. \uC7A5 \uC218\uB97C \uB298\uB9AC\uC9C0 \uC54A\uB294\uB2E4.
|
|
882
|
+
|
|
883
|
+
\u2462 \uCE74\uD53C \uADDC\uCE59 \u2014 \uC544\uB798\uB97C \uBAA8\uB450 \uC9C0\uD0AC \uAC83:
|
|
884
|
+
- AI \uB97C \uC804\uBA74\uC5D0 \uBC30\uCE58\uD558\uC9C0 \uC54A\uB294\uB2E4 (\uC77C\uC815\uAD00\uB9AC\uB294 \uB3C4\uAD6C \uC911 \uD558\uB098 \u2014 "AI \uC81C\uD488"\uC73C\uB85C \uD3EC\uC9C0\uC154\uB2DD\uD558\uC9C0 \uC54A\uB294\uB2E4)
|
|
885
|
+
- \uD5C8\uC704 \uAE30\uB2A5 \uC8FC\uC7A5 \uAE08\uC9C0 (\uC2E4\uC81C\uB85C \uC548 \uB418\uB294 \uAC78 \uB418\uB294 \uAC83\uCC98\uB7FC \uC4F0\uC9C0 \uC54A\uB294\uB2E4)
|
|
886
|
+
- \uC790\uC5F0\uC2A4\uB7EC\uC6B4 \uB9D0\uD22C (\uAD11\uACE0 \uCE74\uD53C \uD2F0 \uB098\uB294 \uACFC\uC7A5 \uC5B4\uD22C \uC9C0\uC591)
|
|
887
|
+
|
|
888
|
+
\u2463 \uC0AC\uC774\uC988\xB7\uD3F0\uD2B8 \u2014 1080\xD71350 \uACE0\uC815. \uD3F0\uD2B8\uB294 **OFL(Open Font License) \uB77C\uC774\uC120\uC2A4\uB9CC** \uC4F4\uB2E4
|
|
889
|
+
(\uCD9C\uCC98\xB7\uB77C\uC774\uC120\uC2A4 \uBD88\uBA85 \uD3F0\uD2B8 \uAE08\uC9C0).
|
|
890
|
+
|
|
891
|
+
\u2464 \uC138\uD2B8 \uB80C\uB354 \uD6C4 \uBE44\uAD50 \uC2DC\uD2B8 \u2014 \uC644\uC131\uB41C 3\uC7A5\uC744 \uD55C \uC2DC\uD2B8\uC5D0 \uB098\uB780\uD788 \uB193\uACE0 \uBE44\uAD50\uD560 \uC218 \uC788\uAC8C \uB80C\uB354\uD55C\uB2E4
|
|
892
|
+
(\uAC1C\uBCC4 \uC774\uBBF8\uC9C0\uB9CC \uB358\uC9C0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD750\uB984\uC774 \uC774\uC5B4\uC9C0\uB294\uC9C0 \uD55C\uB208\uC5D0 \uBCF4\uC5EC\uC57C \uD55C\uB2E4).
|
|
893
|
+
|
|
894
|
+
\u2465 \uCC3D\uC5C5\uC790 \uC2B9\uC778 \uD6C4 \uAC8C\uC2DC \u2014 \uBE44\uAD50 \uC2DC\uD2B8\uB97C \uBCF4\uC5EC\uC8FC\uACE0 \uC2B9\uC778\uC744 \uBC1B\uC740 \uB4A4\uC5D0\uB9CC \uAC8C\uC2DC\uD55C\uB2E4. \uC2B9\uC778 \uC5C6\uC774
|
|
895
|
+
\uC784\uC758\uB85C \uAC8C\uC2DC\uD558\uC9C0 \uC54A\uB294\uB2E4.
|
|
896
|
+
|
|
897
|
+
\uC9C4\uD589\uD558\uBA74\uC11C \uB9C9\uD788\uBA74(\uC608: \uB808\uD37C\uB7F0\uC2A4\uC640 \uB9DE\uB294 \uC2E4\uBB3C \uC790\uC0B0\uC774 \uC5C6\uC74C, \uCE74\uD53C\uAC00 \uADDC\uCE59 \uC911 \uD558\uB098\uC640 \uCDA9\uB3CC\uD568)
|
|
898
|
+
\uB118\uACA8\uC9DA\uC9C0 \uB9D0\uACE0 \uD604\uC7AC \uC0C1\uD0DC\uC640 \uD544\uC694\uD55C \uACB0\uC815\uC744 \uBCF4\uACE0\uD560 \uAC83.`};var sk=[ek,tk,rk,nk,ok,ik];function Vl(){return[...sk].sort((t,e)=>t.name.localeCompare(e.name))}function ak(t){return sk.find(e=>e.name===t)}var hD=/[①-⑳]/gu;function yh(t){let e=t.match(hD);return e?new Set(e).size:0}function ck(t,e){let r={};for(let o=0;o<t.args.length;o++){let i=t.args[o],s=e[o]?.trim();if(s)r[i.name]=s;else if(i.default!==void 0)r[i.name]=i.default;else{if(i.required)return{ok:!1,error:`missing required argument: ${i.name} (${i.description})`};r[i.name]=""}}let n=t.template;for(let[o,i]of Object.entries(r))n=n.split(`{${o}}`).join(i);return{ok:!0,prompt:n}}function mD(t,e,r){let n=e.join("-").toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,""),o=`playbook-${t}${n?`-${n}`:""}`;if(!r.includes(o))return o;for(let i=2;i<1e3;i++){let s=`${o}-${i}`;if(!r.includes(s))return s}return`${o}-${Date.now().toString(36).slice(-4)}`}function gD(t){let e=t.map(i=>({name:i.name,args:i.args.map(s=>s.required?`<${s.name}>`:`[${s.name}]`).join(" "),steps:String(yh(i.template)),description:i.description})),r=Math.max(4,...e.map(i=>i.name.length)),n=Math.max(4,...e.map(i=>i.args.length)),o=Math.max(5,...e.map(i=>i.steps.length));console.log(Gt.blue(`Available playbooks:
|
|
899
|
+
`)),console.log(Gt.gray(` ${"NAME".padEnd(r)} ${"ARGS".padEnd(n)} ${"STEPS".padEnd(o)} DESCRIPTION`));for(let i of e)console.log(` ${Gt.bold(i.name.padEnd(r))} ${Gt.gray(i.args.padEnd(n))} ${i.steps.padEnd(o)} ${i.description}`)}var lk=new se("playbook").description("Run a saved workflow (playbook) as an orchestrator mission").argument("[name]","playbook name \u2014 omit to list available playbooks").argument("[args...]","positional arguments for the playbook (e.g. app name)").option("-p, --permission <mode>","Permission mode (readonly, workspace, full)").option("--yolo","no approval prompts \u2014 writes stay in this folder, bash stays sandboxed").option("--dangerously-skip-permissions","\u26A0 no prompts, no folder confinement, no sandbox (catastrophic commands still blocked)").addHelpText("after",()=>{let t=[`
|
|
900
|
+
Available playbooks:`];for(let e of Vl()){let r=e.args.map(n=>n.required?`<${n.name}>`:`[${n.name}]`).join(" ");t.push(` ${e.name} ${r} (${yh(e.template)} steps)`),t.push(` ${e.description}`)}return t.join(`
|
|
901
|
+
`)}).action(async(t,e,r)=>{if(!t){gD(Vl()),console.log(Gt.gray(`
|
|
902
|
+
Usage: protocol playbook <name> <args...>`));return}let n=ak(t);n||(console.error(Gt.red(`Unknown playbook: ${t}`)),console.log(Gt.gray(`Available: ${Vl().map(d=>d.name).join(", ")}`)),process.exit(1));let o=ck(n,e);if(!o.ok){console.error(Gt.red(`\u2717 ${o.error}`));let d=n.args.map(p=>p.required?`<${p.name}>`:`[${p.name}]`).join(" ");console.log(Gt.gray(`Usage: protocol playbook ${n.name} ${d}`)),process.exit(1)}let i=r.dangerouslySkipPermissions?"danger":r.yolo?"yolo":"default",s=new rt;s.isAuthenticated()||(console.log(Gt.yellow("Login required.")),console.log(Gt.gray("Run `protocol login` to sign in with your Protocol (Google) account.")),process.exit(1));let a=s.getCurrentUser().id,c=[];try{c=(await new Ne(a).list()).map(d=>d.name)}catch{}let l=mD(n.name,e,c);console.log(Gt.gray(`\u25B6 playbook '${n.name}' \u2192 session '${l}'
|
|
903
|
+
`)),await gh(a,l,{tier:i,permission:r.permission,initialPrompt:o.prompt})});Tf();If();De();import RD from"chalk";var gk=new se("serve").description("Start Protocol web server (access from browser or mobile)").option("-p, --port <port>","Port to listen on","3000").option("--host <host>","Bind address. \uAE30\uBCF8 127.0.0.1 \u2014 localhost\uC5D0\uC11C\uB9CC. LAN/\uD3F0\uC5D0\uC11C \uC5F4\uB824\uBA74 --host 0.0.0.0 (\uC778\uC99D \uC5C6\uB294 \uC5D0\uC774\uC804\uD2B8 \uB178\uCD9C \uACBD\uACE0)","127.0.0.1").option("--permission <mode>","Permission mode: readonly | workspace | full. \uAE30\uBCF8 workspace \u2014 \uD604\uC7AC \uD3F4\uB354 \uC77D\uAE30/\uC4F0\uAE30. full \uC774\uBA74 bash \uC2E4\uD589 \uD5C8\uC6A9 (git\xB7gh\xB7vercel \uBC30\uD3EC \uB4F1). LAN \uB178\uCD9C \uC2DC \uC8FC\uC758","workspace").option("--token <token>","API auth token (default: \uB9E4 \uC2E4\uD589\uB9C8\uB2E4 \uBB34\uC791\uC704 \uC0DD\uC131)","").action(async t=>{let e=parseInt(t.port,10),r=t.host||"127.0.0.1";try{let{startServer:n}=await Promise.resolve().then(()=>(mk(),hk));await n({port:e,host:r,token:t.token,permission:t.permission})}catch(n){console.error(RD.red("Server error:"),n.message),process.exit(1)}});De();var wk=new se("execute-step").description("[runner/sandbox] Execute one approved plan step against the current project").requiredOption("--plan <id>","plan id").requiredOption("--step <id>","step id").option("--tier <tier>","model tier (heavy|default)","heavy").action(async t=>{let e=await ft.withProgress(`Executing plan step ${t.step}...`,async()=>await pl({planId:t.plan,stepId:t.step,tier:t.tier}));e.success||(console.error(`execution failed: ${e.error}`),process.exit(1)),console.log("step done"),process.exit(0)});De();import Te from"chalk";import{spawn as ID}from"child_process";ze();ge();function yk(t){let e=Math.round(t/10);return"\u2588".repeat(e)+"\u2591".repeat(10-e)}function bk(t){let e=process.platform,r=e==="darwin"?"open":e==="win32"?"cmd":"xdg-open",n=e==="win32"?["/c","start","",t]:[t];try{ID(r,n,{stdio:"ignore",detached:!0}).unref()}catch{}}var na=new se("billing").description("Manage subscription and billing (Protocol)");na.command("status").description("Check current subscription tier and usage").action(async()=>{new rt().isAuthenticated()||(console.error(Te.red("Not authenticated. Run `protocol login` first.")),process.exit(1));try{let e=new ve,n=(await ft.withProgress("Fetching subscription status...",async()=>{let a=await e.request("/api/account-state");if(!a.ok)throw new Error(`account-state HTTP ${a.status}`);return await a.json()}))?.subscription??{},o=n.tier||"free";console.log(Te.bold(`
|
|
904
|
+
Subscription:`)),console.log(` Tier: ${Te.green(o)}`),n.status&&console.log(` Status: ${Te.green(String(n.status))}`);let i=of(n);console.log(Te.bold(`
|
|
905
|
+
Usage (\uC11C\uBC84 \uC9D1\uACC4):`));let s=i.remainingPct<=10?Te.red:i.remainingPct<=30?Te.yellow:Te.cyan;if(console.log(` ${"\uB0A8\uC740 \uD06C\uB808\uB527".padEnd(8)} ${s(yk(i.remainingPct))} ${s(`${i.remainingPct}%`)}`),i.refillLabel&&console.log(` ${" ".repeat(8)} ${Te.gray(i.refillLabel)}`),n.bonusCredit!==void 0){let a=i.bonusPct<=10?Te.red:i.bonusPct<=30?Te.yellow:Te.cyan;console.log(` ${"\uBCF4\uB108\uC2A4".padEnd(8)} ${a(yk(i.bonusPct))} ${a(`${i.bonusPct}%`)} ${Te.gray("\uB0A8\uC74C")}`)}console.log(Te.gray(`
|
|
906
|
+
\uC548 \uC4F4 \uB0A0\uC758 \uD06C\uB808\uB527\uC740 \uC313\uC778\uB2E4 \u2014 \uBAB0\uC544\uC11C \uC368\uB3C4 \uC190\uD574\uAC00 \uC5C6\uB2E4.`)),console.log(Te.gray(" \uC2E4\uC81C \uD55C\uB3C4 \uCD08\uACFC\uB294 \uC0AC\uC6A9 \uC2DC \uC11C\uBC84\uAC00 \uAC15\uC81C\uD569\uB2C8\uB2E4."))}catch(e){console.error(Te.red(`\uC0C1\uD0DC \uC870\uD68C \uC2E4\uD328: ${e instanceof Error?e.message:String(e)}`))}});na.command("upgrade").description("Open Protocol pricing to upgrade (Plus/Max)").action(async()=>{let t=Jt();console.log(Te.blue("Protocol \uAC00\uACA9 \uD398\uC774\uC9C0\uB97C \uC5FD\uB2C8\uB2E4...")),console.log(Te.cyan.underline(` ${t}`)),console.log(Te.gray(" \uACB0\uC81C\uB294 Paddle(\uC6F9)\uB85C \uC9C4\uD589\uB429\uB2C8\uB2E4. \uC5C5\uADF8\uB808\uC774\uB4DC \uD6C4 CLI\uB294 \uC790\uB3D9 \uBC18\uC601\uB3FC\uC694.")),bk(t)});na.command("portal").description("Open the subscription management portal").action(async()=>{new rt().isAuthenticated()||(console.error(Te.red("Not authenticated. Run `protocol login` first.")),process.exit(1));try{let e=new ve,r=await ft.withProgress("Requesting portal URL...",async()=>{let n=await e.request("/api/paddle-portal",{method:"POST",body:JSON.stringify({})});if(n.status===404)return null;if(!n.ok)throw new Error(`HTTP ${n.status}`);return await n.json()});if(!r){console.log(Te.yellow("\uD65C\uC131 \uAD6C\uB3C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. `protocol billing upgrade`\uB85C \uBA3C\uC800 \uAD6C\uB3C5\uD558\uC138\uC694."));return}if(!r.url)throw new Error("\uD3EC\uD138 URL\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.");console.log(Te.green("\u2713 \uAD6C\uB3C5 \uAD00\uB9AC \uD3EC\uD138:")),console.log(Te.cyan.underline(` ${r.url}`)),bk(r.url)}catch(e){console.error(Te.red(`\uD3EC\uD138 \uC5F4\uAE30 \uC2E4\uD328: ${e instanceof Error?e.message:String(e)}`))}});De();import We from"chalk";import Jl from"fs";Sn();var oa=new se("sessions").description("List your cloud-synced chat sessions (resume on any device)").option("--archived","List archived conversations").action(async t=>{let e=new rt;e.isAuthenticated()||(console.error(We.red("Not authenticated. Run `protocol login` first.")),process.exit(1));try{let r=e.getCurrentUser().id,n=await ft.withProgress("Fetching cloud sessions...",async()=>await new Ne(r).list(t.archived?"archived":"active"));if(n.length===0){console.log(We.gray("No cloud sessions found. Start one with `protocol chat <name>`."));return}console.log(We.bold(`
|
|
907
|
+
Cloud sessions (synced across devices):`));for(let o of n){let i=o.updated_at?new Date(o.updated_at).toLocaleString():"";console.log(` ${We.cyan(o.name.padEnd(12))} ${We.gray(o.cwd??"")} ${We.gray(i)}`)}console.log(We.gray("\nResume: `protocol chat <name>` \xB7 Recover: `protocol sessions recover <name>` \xB7 Archive: `protocol sessions rm <name>` \xB7 Restore: `protocol sessions restore <name>`"))}catch(r){console.error(We.red(`Failed to list sessions: ${r instanceof Error?r.message:String(r)}`))}});oa.command("recover [name]").description("Re-fetch server session state and reconcile with local state after disconnect").action(async t=>{let e=new rt;e.isAuthenticated()||(console.error(We.red("Not authenticated. Run `protocol login` first.")),process.exit(1));let r=e.getCurrentUser().id,n=new Ne(r),o=[];if(t)o=[t];else try{o=(await ft.withProgress("Fetching session list...",async()=>await n.list())).map(a=>a.name)}catch(s){console.error(We.red(`Failed to fetch cloud sessions: ${s instanceof Error?s.message:String(s)}`)),process.exit(1)}if(o.length===0){console.log(We.gray("No sessions found to recover."));return}let i=0;for(let s of o){let a=null;try{let l=cr(s);if(Jl.existsSync(l)){let d=JSON.parse(Jl.readFileSync(l,"utf-8"));Array.isArray(d)&&(a=d)}}catch{}let c=await ft.withProgress(`Checking '${s}'...`,async()=>await n.reconcile(s,a));if(!c.ok){console.log(We.yellow(`\u26A0 '${s}': could not reach server (offline).`));continue}if(c.action==="recovered"){let l=c.recoveredCount??0;i+=l;try{Jl.mkdirSync(Yt(),{recursive:!0}),Jl.writeFileSync(cr(s),JSON.stringify(c.messages,null,2),"utf-8")}catch{}console.log(We.green(`\u2713 '${s}': recovered ${l} message(s) processed by server.`));let d=c.messages[c.messages.length-1];if(d){let p=d.content.slice(0,100).replace(/\n/g," ");console.log(We.gray(` Last [${d.role}]: ${p}${d.content.length>100?"\u2026":""}`))}}else c.action==="synced"?t&&console.log(We.gray(`'${s}': in sync with server (${c.messages.length} msgs).`)):c.action==="local_ahead"?t&&console.log(We.gray(`'${s}': local has unsaved changes ahead of server.`)):c.action==="merged"&&console.log(We.yellow(`\u26A0 '${s}': local and server have diverged. Run \`protocol chat ${s}\` to resolve.`))}t||(i>0?console.log(We.green(`
|
|
908
|
+
Recovery complete \u2014 restored ${i} message(s) from server.`)):console.log(We.gray(`
|
|
909
|
+
All sessions are in sync with the server.`)))});oa.command("rm <name>").alias("delete").alias("archive").description("Archive a conversation (restorable; running tasks continue)").action(async t=>{let e=new rt;if(!e.isAuthenticated())throw new Error("Run protocol login first.");await new Ne(e.getCurrentUser().id).delete(t),console.log(We.green(`Archived '${t}'. Restore with: protocol sessions restore "${t}"`))});oa.command("restore <name>").description("Restore an archived conversation without changing its content").action(async t=>{let e=new rt;if(!e.isAuthenticated())throw new Error("Run protocol login first.");let r=new Ne(e.getCurrentUser().id),n=(await r.list("all")).find(o=>o.name===t);if(!n)throw new Error("Conversation unavailable. Previously wiped bodies cannot be recovered.");await r.restore(t,n.archive_revision??0),console.log(We.green(`Restored '${t}'.`))});De();import $D from"chalk";import{spawnSync as vk}from"node:child_process";import{existsSync as Sk}from"node:fs";import{dirname as OD,join as kk,resolve as MD}from"node:path";import{fileURLToPath as DD}from"node:url";var Yl=MD(OD(DD(import.meta.url)),"../../.."),bh=kk(Yl,"scripts","smoke.mjs"),xk=kk(Yl,"node_modules",".bin","tsx"),Ek=new se("smoke").description("\uC2E4\uC81C \uC138\uC158 \uC655\uBCF5 \uC790\uAE30\uC9C4\uB2E8 \u2014 \uB85C\uADF8\uC778/LLM \uC2E4\uD638\uCD9C/\uC0AC\uC6A9\uB7C9/\uD50C\uB79C/\uAD8C\uD55C\uAC8C\uC774\uD2B8/\uC0C1\uD0DC\uD30C\uC77C (dev \uC800\uC7A5\uC18C \uC804\uC6A9, GUARDRAILS G2)").action(()=>{if(!Sk(bh)){console.log("smoke \uD14C\uC2A4\uD2B8\uB294 dev \uC800\uC7A5\uC18C\uC5D0\uC11C\uB9CC \uB3D9\uC791\uD569\uB2C8\uB2E4 (\uC124\uCE58\uBCF8\uC5D0\uB294 \uC18C\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4).");return}let e=Sk(xk)?vk(xk,[bh],{stdio:"inherit",cwd:Yl}):vk("npx",["tsx",bh],{stdio:"inherit",cwd:Yl});if(e.error){console.error($D.red("smoke \uC2E4\uD589 \uC2E4\uD328 (tsx\uB97C \uCC3E\uC9C0 \uBABB\uD568):"),e.error.message),process.exitCode=1;return}process.exitCode=e.status!==0?1:0});De();import Fr from"chalk";import HD from"fs";import ND from"net";import{spawn as LD}from"child_process";function Dt(t,e){let r=Buffer.isBuffer(e)?e:Buffer.from(e,"utf8"),n=Buffer.alloc(5);return n.writeUInt8(t,0),n.writeUInt32BE(r.length,1),Buffer.concat([n,r])}var Zo=class{buf=Buffer.concat([]);push(e){this.buf=Buffer.concat(this.buf.length===0?[e]:[this.buf,e]);let r=[];for(;!(this.buf.length<5);){let n=this.buf.readUInt32BE(1);if(this.buf.length<5+n)break;r.push({type:this.buf.readUInt8(0),payload:this.buf.subarray(5,5+n)}),this.buf=this.buf.subarray(5+n)}return r}};var ia=2,FD=1500;function jD(t,e){let r=Rl();LD(process.execPath,[r,"__session-daemon",t],{detached:!0,stdio:"ignore",cwd:e,env:{...process.env}}).unref()}async function UD(t,e=15e3){let r=Date.now()+e;for(;Date.now()<r;){if(await cn(Dr(t),400))return!0;await new Promise(n=>setTimeout(n,150))}return!1}async function Pk(t,e={}){Tl();let r=Dr(t);if(!await cn(r)){if(e.create===!1)throw new Error(`\uC138\uC158 '${t}' \uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`);if(jD(t,e.cwd||process.cwd()),!await UD(t))throw new Error(`\uC138\uC158 '${t}' \uC744 \uB744\uC6B0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \`protocol doctor\` \uB85C node-pty \uC124\uCE58\uB97C \uD655\uC778\uD558\uC138\uC694.`)}let n=ND.connect(r);await new Promise((a,c)=>{n.once("connect",a),n.once("error",c)});let o=process.stdin,i=o.isRaw;o.isTTY&&o.setRawMode(!0),o.resume();let s=()=>{let a=process.stdout.columns||120,c=process.stdout.rows||34;n.write(Dt(1,JSON.stringify({cols:a,rows:c})))};return s(),process.stdout.on("resize",s),await new Promise(a=>{let c=!1,l=null,d=!1,p=()=>{c=!1,l&&(clearTimeout(l),l=null)},u=(h,w)=>{d||(d=!0,p(),process.stdout.off("resize",s),o.off("data",f),o.isTTY&&o.setRawMode(!!i),o.pause(),n.removeAllListeners(),n.destroy(),process.stdout.write("\x1B[2J\x1B[H"),a({reason:h,code:w}))},f=h=>{if(c){p();let w=h[0];if(w===100){u("detached",0);return}if(w===ia){n.write(Dt(0,Buffer.from([ia])));return}n.write(Dt(0,Buffer.concat([Buffer.from([ia]),h])));return}if(h.length===1&&h[0]===ia){c=!0,l=setTimeout(()=>{c=!1,n.write(Dt(0,Buffer.from([ia])))},FD);return}n.write(Dt(0,h))};o.on("data",f);let m=new Zo;n.on("data",h=>{for(let w of m.push(h))if(w.type===0)process.stdout.write(w.payload);else if(w.type===2){let b=0;try{b=JSON.parse(w.payload.toString("utf8")).code??0}catch{}u("exited",b)}}),n.on("close",()=>u("exited",0)),n.on("error",()=>u("exited",1))})}import BD from"net";import ei from"fs";import WD from"net";var Ck="stop";function _k(t,e){return t===3&&e.toString("utf8")===Ck}async function Tk(t,e=2e3){let r=an(t),n=Dr(r);return await cn(n)?new Promise(o=>{let i=WD.connect(n),s=!1,a=l=>{s||(s=!0,clearTimeout(c),i.destroy(),o(l))},c=setTimeout(()=>a(!1),e);i.once("connect",()=>{i.write(Dt(3,Ck),l=>a(!l))}),i.once("error",()=>a(!1))}):!1}var Rk=256*1024;async function Ik(t){let e=t.name;Tl();let r=Dr(e);try{ei.unlinkSync(r)}catch{}let n;try{n=await import("node-pty")}catch(p){console.error("[protocol] node-pty \uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD574 detach \uC138\uC158\uC744 \uB9CC\uB4E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4:",p.message),process.exit(1)}let o=Rl(),i=t.argv&&t.argv.length>0?t.argv:[o,"chat",e],s=n.spawn(process.execPath,i,{name:"xterm-256color",cols:120,rows:34,cwd:t.cwd||process.cwd(),env:{...process.env,PROTOCOL_SESSION:e,TERM:"xterm-256color"}}),a=new Set,c=Buffer.alloc(0);s.onData(p=>{let u=Buffer.from(p,"utf8");c=Buffer.concat([c,u]),c.length>Rk&&(c=c.subarray(c.length-Rk));let f=Dt(0,u);for(let m of a)m.write(f)});let l=BD.createServer(p=>{a.add(p);let u=new Zo;p.write(Dt(0,Buffer.from("\x1B[2J\x1B[H","utf8"))),c.length>0&&p.write(Dt(0,c.subarray(Math.max(0,c.length-8*1024)))),p.on("data",m=>{for(let h of u.push(m))if(h.type===0)s.write(h.payload.toString("utf8"));else if(h.type===1)try{let{cols:w,rows:b}=JSON.parse(h.payload.toString("utf8"));w>0&&b>0&&(s.resize(w,Math.max(1,b-1)),setTimeout(()=>{try{s.resize(w,b)}catch{}},16))}catch{}else if(_k(h.type,h.payload))try{s.kill()}catch{}});let f=()=>{a.delete(p)};p.on("close",f),p.on("error",f)});s.onExit(({exitCode:p})=>{let u=Dt(2,JSON.stringify({code:p}));for(let f of a)try{f.write(u),f.end()}catch{}l.close();try{ei.unlinkSync(r)}catch{}t.standalone!==!1&&process.exit(p??0)});try{await new Promise((p,u)=>{l.once("error",u),l.listen(r,()=>{try{ei.chmodSync(r,384)}catch{}p()})})}catch(p){try{s.kill()}catch{}try{l.close()}catch{}try{ei.unlinkSync(r)}catch{}throw p}let d=()=>{try{s.kill()}catch{}try{ei.unlinkSync(r)}catch{}process.exit(0)};return t.standalone!==!1&&(process.on("SIGTERM",d),process.on("SIGINT",d)),{close(){try{s.kill()}catch{}for(let p of a)try{p.destroy()}catch{}l.close();try{ei.unlinkSync(r)}catch{}}}}var $k=new se("attach").description("Attach to a detachable session (survives closing the terminal). Ctrl-B d to detach.").argument("[name]","session name","main").option("-l, --list","list live sessions").option("-k, --kill <name>","terminate a session").option("-n, --no-create","fail instead of creating the session if it does not exist").action(async(t,e)=>{if(e.list){let n=await fx();if(n.length===0){console.log(Fr.gray("\uC0B4\uC544\uC788\uB294 \uC138\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. `protocol attach <\uC774\uB984>` \uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694."));return}console.log(Fr.bold(`
|
|
910
|
+
\uC0B4\uC544\uC788\uB294 \uC138\uC158:`));for(let o of n)console.log(` ${Fr.cyan(o)}`);console.log(Fr.gray(`
|
|
911
|
+
\uBD99\uAE30: protocol attach <\uC774\uB984> \xB7 \uB5BC\uAE30: Ctrl-B d
|
|
912
|
+
`));return}if(e.kill){let n=an(e.kill),o=Dr(n);await cn(o)||(console.error(Fr.red(`\uC138\uC158 '${n}' \uC774 \uC0B4\uC544\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`)),process.exit(1)),await Tk(n)||(console.error(Fr.red(`\uC138\uC158 '${n}' \uC911\uB2E8 \uC694\uCCAD\uC744 \uC804\uB2EC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.`)),process.exit(1)),console.log(Fr.green(`\uC138\uC158 '${n}' \uC911\uB2E8\uC744 \uC694\uCCAD\uD588\uC2B5\uB2C8\uB2E4.`));return}let r=an(t);try{let n=await Pk(r,{create:e.create!==!1});n.reason==="detached"&&console.log(Fr.gray(`
|
|
913
|
+
[detached] \uC138\uC158 '${r}' \uC740 \uACC4\uC18D \uB3CC\uACE0 \uC788\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uBD99\uC73C\uB824\uBA74 protocol attach ${r}
|
|
914
|
+
`)),process.exit(n.code)}catch(n){console.error(Fr.red(n.message)),process.exit(1)}}),xh=new se("__session-daemon").description("(internal) run the detachable session host").argument("<name>","session name").action(async t=>{process.on("uncaughtException",e=>{try{HD.appendFileSync("/tmp/protocol-session.log",`[${new Date().toISOString()}] ${String(e?.stack||e)}
|
|
915
|
+
`)}catch{}process.exit(1)}),await Ik({name:an(t)})});xh.helpCommand(!1);De();rf();import{exec as qD}from"child_process";import{promisify as GD}from"util";import nr from"chalk";var Ok=GD(qD),Mk=new se("undo").description("Restore a shadow snapshot (revert work-loss operations)").option("-l, --list","List available snapshots without restoring").option("-s, --snapshot <sha>","Restore a specific snapshot by SHA").option("-p, --path <path>","Restore a specific file or directory only").action(async t=>{try{let r=await new ks().getSnapshots();if(r.length===0){console.log(nr.yellow("No snapshots available."));return}if(r.reverse(),t.list){console.log(nr.blue(`Available Shadow Snapshots:
|
|
916
|
+
`));for(let i of r){let s=new Date(i.at).toLocaleString();console.log(` ${nr.green(i.sha.substring(0,7))} - ${nr.cyan(s)}`),console.log(` ${nr.gray("Reason:")} ${i.reason}`),console.log("")}return}let n=t.snapshot;if(!n){let{default:i}=await import("inquirer"),s=await i.prompt([{type:"list",name:"snapshot",message:"Select a snapshot to restore:",choices:r.map(a=>({name:`${a.sha.substring(0,7)} - ${new Date(a.at).toLocaleString()} - ${a.reason}`,value:a.sha}))}]);if(!s.snapshot){console.log("Cancelled.");return}n=s.snapshot}let o=r.find(i=>i.sha.startsWith(n)||i.sha===n);if(!o){console.log(nr.red(`Snapshot ${n} not found.`));return}t.path?(console.log(nr.blue(`Restoring ${t.path} from snapshot ${o.sha.substring(0,7)}...`)),await Ok(`git show ${o.sha}:${t.path} > ${t.path}`),console.log(nr.green(`File ${t.path} restored successfully.`))):(console.log(nr.blue(`Restoring entire working tree from snapshot ${o.sha.substring(0,7)}...`)),await Ok(`git restore --source=${o.sha} --staged --worktree .`),console.log(nr.green("Working tree restored successfully.")))}catch(e){console.error(nr.red(`Failed to restore: ${e instanceof Error?e.message:String(e)}`))}});De();Ot();import{readFile as VD,lstat as zD}from"fs/promises";import{resolve as KD,relative as JD,basename as un,sep as YD,isAbsolute as XD}from"path";var QD=new Set(["markdown","text","html"]);function ZD(t){if(!t)return null;let e=t.trim().toLowerCase();if(e==="markdown"||e==="md")return"markdown";if(e==="text"||e==="txt")return"text";if(e==="html")return"html";if(e==="file")return"file";throw new Error(`\uC54C \uC218 \uC5C6\uB294 --kind '${t}' (markdown|text|html|file)`)}async function e1(t,e){let r=process.cwd(),n=KD(r,t),o=JD(r,n);if(o===".."||o.startsWith(`..${YD}`)||XD(o))throw new Error(`\uC791\uC5C5 \uD3F4\uB354(${r}) \uBC16\uC758 \uACBD\uB85C\uB294 \uC81C\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${t}`);if(un(n).startsWith("."))throw new Error(`\uC228\uAE40 \uD30C\uC77C(.\uC73C\uB85C \uC2DC\uC791\uD558\uB294 \uC774\uB984)\uC740 \uC81C\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${t}`);let i;try{i=await zD(n)}catch(b){throw new Error(`\uD30C\uC77C\uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${t} (${b.message})`)}if(i.isSymbolicLink())throw new Error(`\uC2EC\uBCFC\uB9AD \uB9C1\uD06C\uB294 \uC81C\uCD9C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${t}`);if(!i.isFile())throw new Error(`\uD30C\uC77C\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${t}`);let s=i.size;if(s<=0)throw new Error(`\uBE48 \uD30C\uC77C\uC740 \uC791\uC5C5\uBB3C\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${t}`);let a=ul(n);if(!a&&!yl(n))throw new Error(`\uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 \uD30C\uC77C \uD615\uC2DD\uC785\uB2C8\uB2E4: ${un(n)} (.md/.markdown/.html/.htm/.txt \uB610\uB294 \uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\xB7PDF \uB9CC \uC81C\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4)`);let c=e.project??process.env[Ko];if(!nt(c))throw new Error(`cowork \uD504\uB85C\uC81D\uD2B8\uB97C \uC54C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774 \uC2E4\uD589\uC5D0 \uC5F0\uACB0\uB41C \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uAC70\uB098 \uBBF8\uBD84\uB958\uC785\uB2C8\uB2E4. \uB7EC\uB108 \uBC16\uC5D0\uC11C \uC4F8 \uB54C\uB294 --project <${Ko} \uAC12> \uC744 \uC8FC\uC138\uC694.`);let l={id:c,...process.env[qs]?{name:process.env[qs]}:{}},d=e.plan??process.env[Gs],p=e.agent??process.env[Vs],u=(e.set??process.env[bl]??"").trim(),f=process.env[vl],m=ZD(e.kind)??xc(n),h=(e.name??Yf(un(n))).trim()||un(n);if(a||m==="file"){if(!a)throw new Error(`--kind file \uC740 \uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\xB7PDF \uD655\uC7A5\uC790\uC5D0\uB9CC \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4: ${un(n)}`);if(s>ll)throw new Error(`\uD30C\uC77C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4(${Math.round(s/1024/1024)}MB > 50MB): ${un(n)}`);if(!await Mr(l,n,{...p?{agentId:p}:{},...d?{planId:d}:{},name:h,caption:u,contentType:a}))throw new Error(`\uD30C\uC77C \uC791\uC5C5\uBB3C \uC5C5\uB85C\uB4DC \uC2E4\uD328: ${un(n)} (\uC704 \uB85C\uADF8 \uCC38\uACE0)`);return await Qf(f,n),h}if(!QD.has(m))throw new Error(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uC885\uB958\uC785\uB2C8\uB2E4: ${m}`);if(s>Kf)throw new Error(`\uD14D\uC2A4\uD2B8 \uC791\uC5C5\uBB3C\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4(${Math.round(s/1024)}KB > 2MB): ${un(n)}`);let w=await VD(n,"utf-8");if(!w.trim())throw new Error(`\uBE48 \uD30C\uC77C\uC740 \uC791\uC5C5\uBB3C\uC774 \uC544\uB2D9\uB2C8\uB2E4: ${t}`);return await Do(l,{name:h,kind:m,content:w,...u?{group:u,folderPath:$t(Et(u))}:{},...p?{agentId:p}:{},...d?{planId:d}:{}}),await Qf(f,n),h}var kh=new se("artifact").description("\uC791\uC5C5\uBB3C\uD568(cowork) \uC81C\uCD9C \u2014 cowork \uC2E4\uD589 \uC911\uC778 \uB450\uB1CC\uAC00 \uC0B0\uCD9C\uBB3C\uC744 \uB118\uAE38 \uB54C \uC501\uB2C8\uB2E4");kh.command("submit").description("\uD30C\uC77C \uD558\uB098\uB97C \uC791\uC5C5\uBB3C\uB85C \uC81C\uCD9C\uD55C\uB2E4 (.md/.html/.txt \uB294 \uC804\uBB38 \uC800\uC7A5, \uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\xB7PDF \uB294 \uC5C5\uB85C\uB4DC)").argument("<file>","\uC81C\uCD9C\uD560 \uD30C\uC77C \uACBD\uB85C").option("--name <name>","\uC791\uC5C5\uBB3C \uC774\uB984 (\uAE30\uBCF8: \uD655\uC7A5\uC790 \uBE80 \uD30C\uC77C \uC774\uB984)").option("--set <set>","\uC138\uD2B8/\uD3F4\uB354 \uC774\uB984 (\uAE30\uBCF8: \uC2E4\uD589 \uC911\uC778 \uC784\uBB34\uC758 \uC138\uD2B8)").option("--kind <kind>","markdown|text|html|file (\uAE30\uBCF8: \uD655\uC7A5\uC790\uB85C \uD310\uB2E8)").option("--project <id>",`cowork \uD50C\uB79C \uD504\uB85C\uC81D\uD2B8 id (\uAE30\uBCF8: \uD658\uACBD\uBCC0\uC218 ${Ko})`).option("--plan <id>",`\uD50C\uB79C id (\uAE30\uBCF8: \uD658\uACBD\uBCC0\uC218 ${Gs})`).option("--agent <id>",`\uC5D0\uC774\uC804\uD2B8 id (\uAE30\uBCF8: \uD658\uACBD\uBCC0\uC218 ${Vs})`).action(async(t,e)=>{try{let r=await e1(t,e);console.log(`\uC791\uC5C5\uBB3C \uC81C\uCD9C\uB428: ${r}`),process.exit(0)}catch(r){console.error(r.message),process.exit(1)}});De();ge();ze();import{existsSync as t1,mkdirSync as r1,writeFileSync as n1}from"fs";import{join as Xl,resolve as Dk}from"path";import{pathToFileURL as o1}from"url";import{createInterface as i1}from"node:readline/promises";var Eh="scripts/video/prove-motion-doc.mjs";async function s1(t,e){let r=t.project?.trim();if(!r)throw new Error("--project <id> \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 (\uC9C0\uC6B8 \uD504\uB85C\uC81D\uD2B8\uB97C \uBA85\uC2DC\uD560 \uAC83 \u2014 \uAE30\uBCF8\uAC12 \uC5C6\uC74C).");if(!!t.all==!!t.only)throw new Error("--only <slug,\u2026> \uB610\uB294 --all \uC911 \uD558\uB098\uB97C \uC8FC\uC138\uC694.");let n=await e.listDocs(r);if(!n.length)throw new Error(`\uD504\uB85C\uC81D\uD2B8 ${r} \uC5D0 \uD3B8\uC9D1\uBCF8\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`);let o=n;if(t.only){let s=t.only.split(",").map(l=>l.trim()).filter(Boolean),a=new Set(n.map(l=>l.id)),c=s.filter(l=>!a.has(l));if(c.length)throw new Error(`\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC5C6\uB294 \uD3B8: ${c.join(", ")} (\uC788\uB294 \uD3B8: ${n.map(l=>l.id).join(", ")})`);o=n.filter(l=>s.includes(l.id))}e.log(`\uD504\uB85C\uC81D\uD2B8 ${r} \uC5D0\uC11C \uC9C0\uC6B8 \uD3B8\uC9D1\uBCF8 ${o.length}\uAC1C:`);for(let s of o)e.log(` \xB7 ${s.id} ${s.title} (v${s.version})`);if(!t.yes&&!await e.confirm("\uC9C0\uC6B8\uAE4C\uC694? (\uBC84\uC804 \uC774\uB825\uC740 \uB0A8\uC2B5\uB2C8\uB2E4) [y/N] "))throw new Error("\uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4.");let i={removed:[],failed:[],projectId:r};for(let s of o){let a=await e.deleteDoc(s.id,r);if(!a.ok){i.failed.push(s.id),e.log(`\u2717 ${s.id}: HTTP ${a.status}${a.error?" "+a.error:""}`);continue}i.removed.push(s.id),e.log(`\u2713 ${s.id} \uC0AD\uC81C`)}return e.log(`
|
|
917
|
+
${i.removed.length} \uC0AD\uC81C${i.failed.length?` \xB7 ${i.failed.length} \uC2E4\uD328`:""}`),i}function a1(t,e){if(!e)return t;let r=e.split(",").map(i=>i.trim()).filter(Boolean),n=new Set(t.map(i=>i.id)),o=r.filter(i=>!n.has(i));if(o.length)throw new Error(`\uBAA8\uB974\uB294 \uD3B8: ${o.join(", ")} (\uC544\uB294 \uD3B8: ${t.map(i=>i.id).join(", ")})`);return t.filter(i=>r.includes(i.id))}function c1(t){let e=t.filter(r=>/marketing|마케팅/i.test(r.name));return e.length===1?e[0]:null}async function l1(t,e){if(!t1(Xl(e.cwd,Eh)))throw new Error(`\uC774 \uD3F4\uB354\uC5D0\uC11C ${Eh} \uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 protocol-mvp \uCCB4\uD06C\uC544\uC6C3\uC5D0\uC11C \uC2E4\uD589\uD558\uC138\uC694.`);let{episodes:r,available:n,toDoc:o}=await e.loadEpisodes(),i=a1(r,t.only);if(!i.length)throw new Error("\uB4F1\uB85D\uD560 \uD3B8\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");let s=t.project?.trim()||null;if(!t.dry&&!s){let l=await e.listProjects();if(!l.length)throw new Error("\uCF54\uC6CC\uD06C \uD504\uB85C\uC81D\uD2B8\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC6F9(cowork)\uC5D0\uC11C \uD504\uB85C\uC81D\uD2B8\uB97C \uBA3C\uC800 \uB9CC\uB4E4\uAC70\uB098 --project <id> \uB97C \uC8FC\uC138\uC694.");let d=c1(l);e.log("\uCF54\uC6CC\uD06C \uD504\uB85C\uC81D\uD2B8:");for(let p of l)e.log(` ${d&&p.id===d.id?"\u25B6":" "} ${p.name} (${p.id})`);if(!d)throw new Error("\uC774\uB984\uC5D0 marketing/\uB9C8\uCF00\uD305 \uC774 \uB4E0 \uD504\uB85C\uC81D\uD2B8\uAC00 \uD558\uB098\uB85C \uC815\uD574\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 \u2014 --project <id> \uB85C \uC9C0\uC815\uD558\uC138\uC694.");if(!t.yes&&!await e.confirm(`"${d.name}" \uC5D0 ${i.length}\uD3B8\uC744 \uB4F1\uB85D\uD560\uAE4C\uC694? [y/N] `))throw new Error("\uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4.");s=d.id}let a={registered:[],skipped:[],failed:[],projectId:s,dry:!!t.dry},c=Xl(e.cwd,"scratch/motion-editor/docs");t.dry&&r1(c,{recursive:!0});for(let l of i){if(!n(l)){a.skipped.push(l.id),e.log(`\xB7 ${l.id}: \uD30C\uC77C \uC5C6\uC74C \u2014 \uAC74\uB108\uB700 (${l.dir}/${l.shell})`);continue}let d;try{d=await o(l)}catch(f){a.failed.push(l.id),e.log(`\u2717 ${l.id}: \uBCC0\uD658 \uC2E4\uD328 \u2014 ${f.message}`);continue}if(t.dry){n1(Xl(c,`${l.id}.doc.json`),JSON.stringify(d,null,2));let f=d.meta;e.log(`\xB7 ${l.id}: ${d.tracks.length} \uD2B8\uB799 \xB7 \uCEF7 ${d.cuts.length} \xB7 ${f?.duration??"?"}s`),a.registered.push(l.id);continue}let p=d.meta,u=await e.putDoc({id:l.id,projectId:s,title:p?.title??l.title,doc:d,note:"\uAC00\uC838\uC634 (protocol motion register)",source:"import"});if(!u.ok){a.failed.push(l.id),e.log(`\u2717 ${l.id}: HTTP ${u.status}${u.error?" "+u.error:""}`);continue}a.registered.push(l.id),e.log(`\u2713 ${l.id} \u2192 v${u.version}`)}return e.log(`
|
|
918
|
+
${a.registered.length} ${t.dry?"\uBCC0\uD658":"\uB4F1\uB85D"}${a.skipped.length?` \xB7 ${a.skipped.length} \uAC74\uB108\uB700`:""}${a.failed.length?` \xB7 ${a.failed.length} \uC2E4\uD328`:""}${t.dry?" (dry \u2014 scratch/motion-editor/docs/)":""}`),a}function Nk(t){let e=new K,r=new ve(e);return{cwd:t,loadEpisodes:async()=>{let n=await import(o1(Xl(t,Eh)).href);return{episodes:n.allEpisodes(t),available:o=>n.episodeAvailable(o,t),toDoc:n.episodeToDoc}},listProjects:async()=>{if(!e.getSession()?.user?.id)throw new Error("\uB85C\uADF8\uC778 \uC138\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 protocol login \uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.");let o=await r.request("/api/user-data/cli_prefs/cli");if(!o.ok)throw new Error(`\uD504\uB85C\uC81D\uD2B8 \uBAA9\uB85D\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (HTTP ${o.status}).`);let s=(await o.json()).item??null;return(Array.isArray(s?.projects)?s.projects:[]).filter(c=>!!c&&typeof c=="object"&&typeof c.id=="string").map(c=>({id:String(c.id),name:String(c.name??c.id),createdAt:typeof c.createdAt=="string"?c.createdAt:void 0,updatedAt:typeof c.updatedAt=="string"?c.updatedAt:void 0}))},putDoc:async n=>{let o=await r.request("/api/cowork-motion",{method:"PUT",body:JSON.stringify(n)}),i={};try{i=await o.json()}catch{}return{ok:o.ok,status:o.status,version:i.version,error:i.error}},listDocs:async n=>{let o=await r.request(`/api/cowork-motion?projectId=${encodeURIComponent(n)}`,{method:"GET"});if(!o.ok)throw new Error(`\uD3B8\uC9D1\uBCF8 \uBAA9\uB85D\uC744 \uBC1B\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 (HTTP ${o.status}).`);return(await o.json()).docs??[]},deleteDoc:async(n,o)=>{let i=await r.request("/api/cowork-motion",{method:"POST",body:JSON.stringify({action:"delete",id:n,projectId:o})}),s={};try{s=await i.json()}catch{}return{ok:i.ok,status:i.status,error:s.error}},confirm:async n=>{let o=i1({input:process.stdin,output:process.stdout});try{return/^y(es)?$/i.test((await o.question(n)).trim())}finally{o.close()}},log:n=>console.log(n)}}var Ql=new se("motion").description("\uB9C8\uCF00\uD305 \uC601\uC0C1 \uD3B8\uC9D1\uBCF8(\uBAA8\uC158 \uD504\uB85C\uC81D\uD2B8) \u2014 \uCF54\uC6CC\uD06C\uC5D0\uC11C \uACE0\uCE60 \uC218 \uC788\uAC8C \uB4F1\uB85D\uD55C\uB2E4");Ql.command("register").description("\uB9AC\uBA54\uC774\uD06C\xB7\uC624\uB9AC\uC9C0\uB110 \uD3B8\uB4E4\uC744 \uD3B8\uC9D1\uBCF8\uC73C\uB85C \uBCC0\uD658\uD574 \uCF54\uC6CC\uD06C \uBAA8\uC158 \uD504\uB85C\uC81D\uD2B8\uB85C \uB4F1\uB85D (protocol-mvp \uCCB4\uD06C\uC544\uC6C3\uC5D0\uC11C)").option("--project <id>","cowork \uD504\uB85C\uC81D\uD2B8 id (\uAE30\uBCF8: \uC774\uB984\uC5D0 marketing/\uB9C8\uCF00\uD305 \uC774 \uB4E0 \uD504\uB85C\uC81D\uD2B8 \uD558\uB098 \u2014 \uC5C6\uC73C\uBA74 \uC911\uB2E8)").option("--only <slugs>","\uC27C\uD45C\uB85C \uAD6C\uBD84\uD55C \uD3B8 id \uB9CC (\uC608: reel9-void,reel8)").option("--dry","\uC11C\uBC84\uC5D0 \uC62C\uB9AC\uC9C0 \uC54A\uACE0 scratch/motion-editor/docs/ \uC5D0 JSON \uB9CC \uC4F4\uB2E4").option("--yes","\uD504\uB85C\uC81D\uD2B8 \uD655\uC778\uC744 \uBB3B\uC9C0 \uC54A\uB294\uB2E4").action(async t=>{try{let e=await l1(t,Nk(Dk(process.cwd())));process.exit(e.failed.length?1:0)}catch(e){console.error(e.message),process.exit(2)}});Ql.command("remove").description("\uD504\uB85C\uC81D\uD2B8\uC758 \uD3B8\uC9D1\uBCF8\uC744 \uC9C0\uC6B4\uB2E4 (soft delete \u2014 \uBC84\uC804 \uC774\uB825\uC740 \uB0A8\uB294\uB2E4)").requiredOption("--project <id>","cowork \uD504\uB85C\uC81D\uD2B8 id (\uD544\uC218 \u2014 \uAE30\uBCF8\uAC12 \uC5C6\uC74C)").option("--only <slugs>","\uC27C\uD45C\uB85C \uAD6C\uBD84\uD55C \uD3B8 id \uB9CC").option("--all","\uADF8 \uD504\uB85C\uC81D\uD2B8\uC758 \uD3B8\uC9D1\uBCF8 \uC804\uBD80").option("--yes","\uD655\uC778\uC744 \uBB3B\uC9C0 \uC54A\uB294\uB2E4").action(async t=>{try{let e=await s1(t,Nk(Dk(process.cwd())));process.exit(e.failed.length?1:0)}catch(e){console.error(e.message),process.exit(2)}});De();hf();import{spawn as u1}from"node:child_process";import{accessSync as d1,constants as p1}from"node:fs";import{resolve as sa}from"node:path";var f1=process.env.PROTOCOL_LOCAL_SERVER_PYTHON||"",h1=process.env.PROTOCOL_LOCAL_SERVER_MODEL||"",m1=process.env.PROTOCOL_LOCAL_SERVER_DRAFT_MODEL||"";function g1(t){let e=["-m","mlx_vlm.server","--host",t.host,"--port",String(t.port),"--model",sa(t.model),"--max-kv-size","2048","--max-tokens","128","--max-num-seqs","1","--vision-cache-size","1","--log-progress-interval","10"];return t.draftModel&&e.push("--draft-model",sa(t.draftModel)),e}function Ph(t,e){try{d1(t,p1.R_OK)}catch{throw new Error(`${e}\uC744 \uCC3E\uAC70\uB098 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${t}`)}}function Lk(t){if(t.exitCode!==null||t.killed)return;t.kill("SIGTERM");let e=setTimeout(()=>{t.exitCode===null&&t.kill("SIGKILL")},1e4);e.unref?.(),t.once("exit",()=>clearTimeout(e))}function Fk(t,e,r){let n=String(t??"").trim();if(!n)throw new Error(`${e} \uAC00 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 \uC2E4\uD589 \uC635\uC158\uC73C\uB85C \uC8FC\uAC70\uB098 ${r} \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694.`);return n}async function w1(t){t.python=Fk(t.python,"--python","PROTOCOL_LOCAL_SERVER_PYTHON"),t.model=Fk(t.model,"--model","PROTOCOL_LOCAL_SERVER_MODEL");let e={python:sa(String(t.python)),model:sa(String(t.model)),draftModel:t.draftModel===!1||!t.draftModel?void 0:sa(String(t.draftModel)),host:String(t.host),port:Number(t.port)};if(e.host!=="127.0.0.1"&&e.host!=="localhost")throw new Error("\uB85C\uCEEC \uBAA8\uB378 \uC11C\uBC84\uB294 \uC548\uC804\uC744 \uC704\uD574 127.0.0.1/localhost\uC5D0\uB9CC \uC5F4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");if(!Number.isInteger(e.port)||e.port<1024||e.port>65535)throw new Error(`\uC798\uBABB\uB41C \uD3EC\uD2B8: ${e.port}`);Ph(e.python,"\uB85C\uCEEC \uBAA8\uB378 \uC11C\uBC84\uC758 Python \uC2E4\uD589 \uD30C\uC77C"),Ph(e.model,"\uB85C\uCEEC \uBAA8\uB378"),e.draftModel&&Ph(e.draftModel,"draft \uBAA8\uB378");let r=await Ts();if(!r.ok)throw new Error(`\uC2DC\uC791 \uC804 \uC2DC\uC2A4\uD15C \uBCF4\uD638\uAC00 \uC791\uB3D9\uD588\uC2B5\uB2C8\uB2E4: ${r.reason}`);let n=g1(e);console.log(`\uB85C\uCEEC \uBAA8\uB378 \uC11C\uBC84 \uC2DC\uC791: http://${e.host}:${e.port}/v1`),console.log("KV 2048 \xB7 \uCD9C\uB825 128 \xB7 \uB3D9\uC2DC \uC2DC\uD000\uC2A4 1 \xB7 thinking off \xB7 Ctrl+C\uB85C \uC885\uB8CC");let o=u1(e.python,n,{stdio:"inherit",env:{...process.env,MLX_VLM_MAX_NUM_SEQS:"1"}}),i=Nc(a=>{console.error(`
|
|
919
|
+
\uC628\uB3C4/\uBA54\uBAA8\uB9AC \uBCF4\uD638\uB85C \uB85C\uCEEC \uBAA8\uB378 \uC11C\uBC84\uB97C \uC885\uB8CC\uD569\uB2C8\uB2E4: ${a}`),Lk(o)}),s=()=>Lk(o);process.once("SIGINT",s),process.once("SIGTERM",s);try{let a=await new Promise((c,l)=>{o.once("error",l),o.once("exit",(d,p)=>c(d??(p?1:0)))});a!==0&&(process.exitCode=a)}finally{i.stop(),process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}}var Ah=new se("local-model").description("Manage a thermally guarded local worker model server (OpenAI-compatible)");Ah.command("start").description("Start the server in the foreground; Ctrl+C stops the exact process").option("--python <path>","Python executable that serves the model",f1).option("--model <path>","target model directory",h1).option("--draft-model <path>","speculative draft model directory",m1).option("--no-draft-model","start without the draft model").option("--host <host>","loopback host only","127.0.0.1").option("--port <port>","OpenAI-compatible server port","8080").action(w1);De();Rn();import{spawn as y1}from"node:child_process";var b1=new Set(["claude","codex","gemini"]),ti=new se("provider-profile").description("Manage local BYO provider profiles (credentials stay on this device)");ti.command("add").requiredOption("--provider <provider>","claude, codex, or gemini (AGY supports active-local only)").requiredOption("--id <id>","safe local profile id").requiredOption("--label <label>","display label shown in Cowork").requiredOption("--config-dir <path>","absolute provider config directory").action(t=>{if(!b1.has(t.provider))throw new Error(`unsupported provider: ${t.provider}`);if(t.provider==="agy")throw new Error("AGY isolated profiles are unsupported; use active-local.");eb({provider:t.provider,id:t.id,label:t.label,configDir:t.configDir}),console.log(`Saved ${t.provider} profile '${t.label}'. Restart protocol runner to advertise it now.`)});ti.command("list").action(()=>{let t=Tn();if(!t.length){console.log("No local provider profiles.");return}for(let{provider:e,id:r,label:n}of t)console.log(`${e} ${r} ${n}`)});ti.command("remove").requiredOption("--id <id>","local profile id").description("Forget a profile without deleting its provider credentials").action(t=>{if(!tb(t.id))throw new Error(`profile '${t.id}' was not found`);console.log(`Removed profile '${t.id}'. Its local config directory was not deleted.`)});function v1(t){if(t==="agy")throw new Error("AGY isolated profiles are unsupported; use active-local.");return t==="codex"?{binary:"codex",args:["login"]}:{binary:t,args:[]}}ti.command("login").requiredOption("--id <id>","local profile id").description("Open the official provider CLI in the profile environment; Protocol never copies credentials").action(async t=>{let e=Tn().find(i=>i.id===t.id);if(!e)throw new Error(`profile '${t.id}' was not found`);if(e.provider==="agy")throw new Error("AGY isolated profiles are unsupported; use active-local.");let r=v1(e.provider);console.log(`Opening ${e.provider} for '${e.label}'. Credentials stay in the official CLI.`);let n=y1(r.binary,r.args,{env:ds(e.provider,e.id),stdio:"inherit"}),o=await new Promise((i,s)=>{n.once("error",s),n.once("close",a=>i(a??1))});if(o!==0)throw new Error(`${r.binary} exited with code ${o}`)});sl();import Ch from"fs";import Wk from"path";var Bk="@nexera-system/protocol",S1="https://registry.npmjs.org",x1=24*60*60*1e3;function _h(){let t=process.env.HOME??process.env.USERPROFILE??"/tmp";return Wk.join(t,".protocol-cli","update-check.json")}function k1(){return"0.1.3"}async function E1(){let t=`${S1}/${encodeURIComponent(Bk)}/latest`,e=await fetch(t,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(3e3)});if(!e.ok)throw new Error(`npm registry: ${e.status}`);return(await e.json()).version}function P1(){try{return JSON.parse(Ch.readFileSync(_h(),"utf-8"))}catch{return null}}function A1(t){try{Ch.mkdirSync(Wk.dirname(_h()),{recursive:!0}),Ch.writeFileSync(_h(),JSON.stringify(t),"utf-8")}catch{}}function jk(t,e){let r=t.split(".").map(Number),n=e.split(".").map(Number);for(let o=0;o<3;o++){let i=(r[o]??0)-(n[o]??0);if(i!==0)return i}return 0}function Uk(t,e){let r=o=>`\x1B[33m${o}\x1B[0m`,n=o=>`\x1B[1m${o}\x1B[0m`;process.stderr.write(`
|
|
920
|
+
${r("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E")}
|
|
921
|
+
${r("\u2502")} ${n("Update available:")} ${t} \u2192 ${n(e)}
|
|
922
|
+
${r("\u2502")} Run: ${n(`npm install -g ${Bk}`)}
|
|
923
|
+
${r("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F")}
|
|
924
|
+
|
|
925
|
+
`)}async function Hk(){try{let t=Date.now(),e=P1(),r=k1();if(e&&t-e.lastChecked<x1){jk(e.latestVersion,r)>0&&Uk(r,e.latestVersion);return}let n=await E1();A1({lastChecked:t,latestVersion:n}),jk(n,r)>0&&Uk(r,n)}catch{}}var C1="0.1.3";xe.name("protocol").description("Coding agent CLI for protocol: \u2014 usage counts against your plan (free tier included)").version(C1);Sg(xe);xe.addCommand(bd);xe.addCommand(vd);xe.addCommand(Sd);xe.addCommand(Xx,{isDefault:!0});xe.addCommand(Xo);xe.addCommand(Lr);xe.addCommand(lk);xe.addCommand(Un);xe.addCommand(Wn);xe.addCommand(gk);xe.addCommand(wk);xe.addCommand($x);xe.addCommand(na);xe.addCommand(oa);xe.addCommand(Zb);xe.addCommand(Ek);xe.addCommand($k);xe.addCommand(Mk);xe.addCommand(kh);xe.addCommand(Ql);xe.addCommand(Ah);xe.addCommand(ti);xe.addCommand(xh,{hidden:!0});var _1=new Set(["login","logout","whoami","chat","config","pipeline","playbook","mcp","plugin","serve","execute-step","runner","billing","sessions","doctor","smoke","help","attach","undo","artifact","motion","local-model","provider-profile","__session-daemon"]),qk=process.argv.slice(2),aa=qk.find(t=>!t.startsWith("-")),Gk=!aa&&qk.some(t=>["-h","--help","-V","--version"].includes(t));!Gk&&(!aa||!_1.has(aa))&&process.argv.splice(2,0,"chat");var Vk=Gk||aa==="local-model"||aa==="provider-profile",T1=Vk?Promise.resolve():qo();T1.catch(t=>{console.error("Bootstrap failed:",t),process.exit(1)}).finally(()=>{Vk||Hk().catch(t=>{process.env.PROTOCOL_DEBUG&&console.error("update check \uC2E4\uD328:",t)}),xe.parse()});
|
|
926
|
+
/*! Bundled license information:
|
|
927
|
+
|
|
928
|
+
js-yaml/dist/js-yaml.mjs:
|
|
929
|
+
(*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT *)
|
|
930
|
+
*/
|