@typescape-ai/cli 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -287,7 +287,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
287
287
|
`)+1;while(t!==0)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
288
288
|
`,t)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let t=e.items[e.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,t.value){let n="end"in t.value?t.value.end:void 0;if((Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment")n?.push(this.sourceToken);else e.items.push({start:[this.sourceToken]})}else if(t.sep)t.sep.push(this.sourceToken);else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){let a=e.items[e.items.length-2]?.value?.end;if(Array.isArray(a)){Array.prototype.push.apply(a,t.start),a.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,a=n&&(t.sep||t.explicitKey)&&this.type!=="seq-item-ind",r=[];if(a&&t.sep&&!t.value){let i=[];for(let o=0;o<t.sep.length;++o){let s=t.sep[o];switch(s.type){case"newline":i.push(o);break;case"space":break;case"comment":if(s.indent>e.indent)i.length=0;break;default:i.length=0}}if(i.length>=2)r=t.sep.splice(i[1])}switch(this.type){case"anchor":case"tag":if(a||t.value)r.push(this.sourceToken),e.items.push({start:r}),this.onKeyLine=!0;else if(t.sep)t.sep.push(this.sourceToken);else t.start.push(this.sourceToken);return;case"explicit-key-ind":if(!t.sep&&!t.explicitKey)t.start.push(this.sourceToken),t.explicitKey=!0;else if(a||t.value)r.push(this.sourceToken),e.items.push({start:r,explicitKey:!0});else this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]});this.onKeyLine=!0;return;case"map-value-ind":if(t.explicitKey)if(!t.sep)if(yo(t.start,"newline"))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let i=sc(t.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]})}else if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(yo(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]});else if(bZ(t.key)&&!yo(t.sep,"newline")){let i=sc(t.start),o=t.key,s=t.sep;s.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:o,sep:s}]})}else if(r.length>0)t.sep=t.sep.concat(r,this.sourceToken);else t.sep.push(this.sourceToken);else if(!t.sep)Object.assign(t,{key:null,sep:[this.sourceToken]});else if(t.value||a)e.items.push({start:r,key:null,sep:[this.sourceToken]});else if(yo(t.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]});else t.sep.push(this.sourceToken);this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let i=this.flowScalar(this.type);if(a||t.value)e.items.push({start:r,key:i,sep:[]}),this.onKeyLine=!0;else if(t.sep)this.stack.push(i);else Object.assign(t,{key:i,sep:[]}),this.onKeyLine=!0;return}default:{let i=this.startBlockValue(e);if(i){if(n&&i.type!=="block-seq")e.items.push({start:r});this.stack.push(i);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case"newline":if(t.value){let n="end"in t.value?t.value.end:void 0;if((Array.isArray(n)?n[n.length-1]:void 0)?.type==="comment")n?.push(this.sourceToken);else e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case"space":case"comment":if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let a=e.items[e.items.length-2]?.value?.end;if(Array.isArray(a)){Array.prototype.push.apply(a,t.start),a.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case"anchor":case"tag":if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;if(t.value||yo(t.start,"seq-item-ind"))e.items.push({start:[this.sourceToken]});else t.start.push(this.sourceToken);return}if(this.indent>e.indent){let n=this.startBlockValue(e);if(n){this.stack.push(n);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type==="flow-error-end"){let n;do yield*this.pop(),n=this.peek(1);while(n&&n.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":if(!t||t.sep)e.items.push({start:[this.sourceToken]});else t.start.push(this.sourceToken);return;case"map-value-ind":if(!t||t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else Object.assign(t,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":if(!t||t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else t.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);if(!t||t.value)e.items.push({start:[],key:a,sep:[]});else if(t.sep)this.stack.push(a);else Object.assign(t,{key:a,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);if(n)this.stack.push(n);else yield*this.pop(),yield*this.step()}else{let n=this.peek(2);if(n.type==="block-map"&&(this.type==="map-value-ind"&&n.indent===e.indent||this.type==="newline"&&!n.items[n.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&n.type!=="flow-collection"){let a=Cb(n),r=sc(a);gZ(e);let i=e.end.splice(1,e.end.length);i.push(this.sourceToken);let o={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:r,key:e,sep:i}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=o}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let t=this.source.indexOf(`
|
|
289
289
|
`)+1;while(t!==0)this.onNewLine(this.offset+t),t=this.source.indexOf(`
|
|
290
|
-
`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let t=Cb(e),n=sc(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let t=Cb(e),n=sc(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){if(this.type!=="comment")return!1;if(this.indent<=t)return!1;return e.every((n)=>n.type==="newline"||n.type==="space")}*documentEnd(e){if(this.type!=="doc-mode"){if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}}Iqe.Parser=fZ});var BZ=S((Mqe)=>{var hZ=KQ(),Fqe=Vl(),rd=Xl(),$qe=iQ(),Sqe=ze(),Lqe=ix(),yZ=ox();function wZ(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Lqe.LineCounter||null,prettyErrors:t}}function jqe(e,t={}){let{lineCounter:n,prettyErrors:a}=wZ(t),r=new yZ.Parser(n?.addNewLine),i=new hZ.Composer(t),o=Array.from(i.compose(r.parse(e)));if(a&&n)for(let s of o)s.errors.forEach(rd.prettifyError(e,n)),s.warnings.forEach(rd.prettifyError(e,n));if(o.length>0)return o;return Object.assign([],{empty:!0},i.streamInfo())}function kZ(e,t={}){let{lineCounter:n,prettyErrors:a}=wZ(t),r=new yZ.Parser(n?.addNewLine),i=new hZ.Composer(t),o=null;for(let s of i.compose(r.parse(e),!0,e.length))if(!o)o=s;else if(o.options.logLevel!=="silent"){o.errors.push(new rd.YAMLParseError(s.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}if(a&&n)o.errors.forEach(rd.prettifyError(e,n)),o.warnings.forEach(rd.prettifyError(e,n));return o}function qqe(e,t,n){let a=void 0;if(typeof t==="function")a=t;else if(n===void 0&&t&&typeof t==="object")n=t;let r=kZ(e,n);if(!r)return null;if(r.warnings.forEach((i)=>$qe.warn(r.options.logLevel,i)),r.errors.length>0)if(r.options.logLevel!=="silent")throw r.errors[0];else r.errors=[];return r.toJS(Object.assign({reviver:a},n))}function Nqe(e,t,n){let a=null;if(typeof t==="function"||Array.isArray(t))a=t;else if(n===void 0&&t)n=t;if(typeof n==="string")n=n.length;if(typeof n==="number"){let r=Math.round(n);n=r<1?void 0:r>8?{indent:8}:{indent:r}}if(e===void 0){let{keepUndefined:r}=n??t??{};if(!r)return}if(Sqe.isDocument(e)&&!a)return e.toString(n);return new Fqe.Document(e,a,n).toString(n)}Mqe.parse=qqe;Mqe.parseAllDocuments=jqe;Mqe.parseDocument=kZ;Mqe.stringify=Nqe});var YZ=S((jdt,mMe)=>{mMe.exports={name:"@typescape-ai/cli",version:"1.2.
|
|
290
|
+
`,t)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let t=Cb(e),n=sc(t);return n.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let t=Cb(e),n=sc(t);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:n,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){if(this.type!=="comment")return!1;if(this.indent<=t)return!1;return e.every((n)=>n.type==="newline"||n.type==="space")}*documentEnd(e){if(this.type!=="doc-mode"){if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:if(e.end)e.end.push(this.sourceToken);else e.end=[this.sourceToken];if(this.type==="newline")yield*this.pop()}}}Iqe.Parser=fZ});var BZ=S((Mqe)=>{var hZ=KQ(),Fqe=Vl(),rd=Xl(),$qe=iQ(),Sqe=ze(),Lqe=ix(),yZ=ox();function wZ(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new Lqe.LineCounter||null,prettyErrors:t}}function jqe(e,t={}){let{lineCounter:n,prettyErrors:a}=wZ(t),r=new yZ.Parser(n?.addNewLine),i=new hZ.Composer(t),o=Array.from(i.compose(r.parse(e)));if(a&&n)for(let s of o)s.errors.forEach(rd.prettifyError(e,n)),s.warnings.forEach(rd.prettifyError(e,n));if(o.length>0)return o;return Object.assign([],{empty:!0},i.streamInfo())}function kZ(e,t={}){let{lineCounter:n,prettyErrors:a}=wZ(t),r=new yZ.Parser(n?.addNewLine),i=new hZ.Composer(t),o=null;for(let s of i.compose(r.parse(e),!0,e.length))if(!o)o=s;else if(o.options.logLevel!=="silent"){o.errors.push(new rd.YAMLParseError(s.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}if(a&&n)o.errors.forEach(rd.prettifyError(e,n)),o.warnings.forEach(rd.prettifyError(e,n));return o}function qqe(e,t,n){let a=void 0;if(typeof t==="function")a=t;else if(n===void 0&&t&&typeof t==="object")n=t;let r=kZ(e,n);if(!r)return null;if(r.warnings.forEach((i)=>$qe.warn(r.options.logLevel,i)),r.errors.length>0)if(r.options.logLevel!=="silent")throw r.errors[0];else r.errors=[];return r.toJS(Object.assign({reviver:a},n))}function Nqe(e,t,n){let a=null;if(typeof t==="function"||Array.isArray(t))a=t;else if(n===void 0&&t)n=t;if(typeof n==="string")n=n.length;if(typeof n==="number"){let r=Math.round(n);n=r<1?void 0:r>8?{indent:8}:{indent:r}}if(e===void 0){let{keepUndefined:r}=n??t??{};if(!r)return}if(Sqe.isDocument(e)&&!a)return e.toString(n);return new Fqe.Document(e,a,n).toString(n)}Mqe.parse=qqe;Mqe.parseAllDocuments=jqe;Mqe.parseDocument=kZ;Mqe.stringify=Nqe});var YZ=S((jdt,mMe)=>{mMe.exports={name:"@typescape-ai/cli",version:"1.2.1",description:"Typescape CLI - Create review sessions, export feedback, and integrate with AI workflows",type:"module",bin:{typescape:"./dist/cli.js"},files:["dist","README.md"],exports:{".":"./dist/cli.js"},publishConfig:{access:"public"},scripts:{build:"bun build src/index.ts --outfile=dist/cli.js --target=bun --bundle --minify",dev:"bun run --watch src/index.ts",test:"bun test",typecheck:"tsc -p tsconfig.typecheck.json --noEmit",lint:"eslint src",prepublishOnly:"bun run build"},dependencies:{},devDependencies:{"@types/bun":"1.1.14","@typescape/integrity":"workspace:*","@typescape/schemas":"workspace:*",ajv:"8.17.1","ajv-formats":"3.0.1",yaml:"2.8.2",zod:"4.3.0"},engines:{bun:">=1.0.0"},keywords:["typescape","cli","review","documentation","ai","feedback","bun"],repository:{type:"git",url:"https://github.com/voidserf/typescape-docs.git",directory:"apps/cli"},license:"MIT"}});var W=0,ga=1,O=2,Rt=3,Pa=4,Qb=5;function bx(e){if(e>=500)return 4;if(e===401||e===403)return 3;if(e>=400&&e<500)return 2;return 0}function on(e,t){if(t==="json")console.log(JSON.stringify(e,null,2));else if(typeof e==="string")console.log(e);else if(typeof e==="object"&&e!==null)for(let[n,a]of Object.entries(e))console.log(`${n}: ${a}`);else console.log(String(e))}function H(e,t){console.error(JSON.stringify({error:e},null,2)),process.exit(t)}function fx(e){console.error(e)}import{existsSync as Fae,readFileSync as $ae}from"fs";import{resolve as ND}from"path";var Dne=Qf(),Fne=Sc(),$ne=df(),Gf=Lc(),Sne=hc(),vr=Ge(),Lne=kr(),jne=kt(),qne=Cr(),Nne=_r(),yRe=Ud(),Mne=qf(),Gne=Nf(),Rne=Mf(),Od=_D(),ED=bc();var Pne=Dne.Composer,zne=Fne.Document,Une=$ne.Schema,Hne=Gf.YAMLError,Tne=Gf.YAMLParseError,One=Gf.YAMLWarning,Zne=Sne.Alias,Yne=vr.isAlias,Kne=vr.isCollection,Wne=vr.isDocument,Jne=vr.isMap,Vne=vr.isNode,Xne=vr.isPair,eae=vr.isScalar,tae=vr.isSeq,nae=Lne.Pair,aae=jne.Scalar,rae=qne.YAMLMap,iae=Nne.YAMLSeq;var oae=Mne.Lexer,sae=Gne.LineCounter,cae=Rne.Parser,Bi=Od.parse,Aae=Od.parseAllDocuments,lae=Od.parseDocument,dae=Od.stringify,uae=ED.visit,pae=ED.visitAsync;import{existsSync as Yd,readFileSync as zf,writeFileSync as FD,mkdirSync as Bae,unlinkSync as Cae}from"fs";import{join as $D}from"path";import{createInterface as _ae}from"readline";import{homedir as SD,hostname as Eae}from"os";import{existsSync as Rf,mkdirSync as mae,writeFileSync as vD}from"fs";import{join as QD,basename as gae,resolve as bae}from"path";import{createInterface as fae}from"readline";async function Qr(e){if(!e||typeof e==="number")return"";return new Response(e).text()}var Zd="https://prod.typescape.ai";function hae(e){let t={yes:!1,force:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--yes"||a==="-y")t.yes=!0,n++;else if(a==="--force"||a==="-f")t.force=!0,n++;else if(a==="--base-url")t.baseUrl=e[n+1],n+=2;else if(a.startsWith("--base-url="))t.baseUrl=a.slice(11),n++;else if(a==="--format"){let r=e[n+1];if(r==="json"||r==="text")t.format=r;n+=2}else if(a.startsWith("--format=")){let r=a.slice(9);if(r==="json"||r==="text")t.format=r;n++}else n++}return t}async function yae(){try{let e=Bun.spawn(["git","remote","get-url","origin"],{stdout:"pipe",stderr:"pipe"}),t=await Qr(e.stdout);if(await e.exited===0&&t.trim()){let r=t.trim().match(/\/([^/]+?)(?:\.git)?$/);if(r)return r[1]}}catch{}return gae(process.cwd())}async function wae(e,t,n){if(n.yes)return t;if(!process.stdin.isTTY)return t;let a=fae({input:process.stdin,output:process.stdout});return new Promise((r)=>{a.question(`${e} [${t}]: `,(i)=>{a.close(),r(i.trim()||t)})})}function kae(e,t){return`version: 1
|
|
291
291
|
|
|
292
292
|
deployment:
|
|
293
293
|
profile: "standard"
|
|
@@ -318,7 +318,7 @@ Next steps:`),console.log("1. Log in: typescape auth login"),console.log("2. Co
|
|
|
318
318
|
`,{encoding:"utf-8",mode:384})}function Qae(e){let t=jo();if(!Yd(t))return!1;let n;try{n=JSON.parse(zf(t,"utf-8"))}catch{return!1}if(!(e in n))return!1;if(delete n[e],Object.keys(n).length===0)Cae(t);else FD(t,JSON.stringify(n,null,2)+`
|
|
319
319
|
`,{encoding:"utf-8",mode:384});return!0}function ID(e){let t=_ae({input:process.stdin,output:process.stderr});return new Promise((n)=>{t.question(e,(a)=>{t.close(),n(a.trim())})})}function xae(e){let t={baseUrl:Zd,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--email")t.email=e[n+1],n+=2;else if(a.startsWith("--email="))t.email=a.slice(8),n++;else if(a==="--base-url")t.baseUrl=e[n+1],n+=2;else if(a.startsWith("--base-url="))t.baseUrl=a.slice(11),n++;else if(a==="--key-name")t.keyName=e[n+1],n+=2;else if(a.startsWith("--key-name="))t.keyName=a.slice(11),n++;else if(a==="--format"){let r=e[n+1];if(r==="json"||r==="text")t.format=r;n+=2}else if(a.startsWith("--format=")){let r=a.slice(9);if(r==="json"||r==="text")t.format=r;n++}else n++}return t}function Iae(e){let t={baseUrl:Zd,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--base-url")t.baseUrl=e[n+1],n+=2;else if(a.startsWith("--base-url="))t.baseUrl=a.slice(11),n++;else if(a==="--format"){let r=e[n+1];if(r==="json"||r==="text")t.format=r;n+=2}else if(a.startsWith("--format=")){let r=a.slice(9);if(r==="json"||r==="text")t.format=r;n++}else n++}return t}async function Pf(e,t,n={}){let a;try{a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",...n},body:JSON.stringify(t),redirect:"manual"})}catch(s){let c=s instanceof Error?s.message:String(s);H({code:"network_error",message:`Network error: ${c}`},Rt)}let r=a.headers.get("Set-Cookie"),i=a.headers.get("Content-Type")||"",o;if(i.includes("application/json"))try{o=await a.json()}catch{o={}}else o={};return{status:a.status,body:o,setCookie:r}}function DD(e){if(!e)return null;let t=e.match(/(?:__Host-typescape_console|typescape_console)=([^;]+)/);return t?t[1]:null}function Dae(e,t){return`${t.startsWith("https://")?"__Host-typescape_console":"typescape_console"}=${e}`}async function jD(e){let t=xae(e),n=t.baseUrl.replace(/\/$/,""),a=t.email;if(!a){if(!process.stdin.isTTY)H({code:"missing_email",message:"Email is required. Use --email <email> in non-interactive mode."},O);if(a=await ID("Email: "),!a)H({code:"missing_email",message:"Email is required."},O)}if(t.format==="text")console.error(`Sending OTP to ${a}...`);let r=await Pf(`${n}/v1/auth/console/login`,{email:a});if(r.status!==200){let l=r.body;H({code:l?.error?.code||"login_failed",message:l?.error?.message||`Login request failed with status ${r.status}`},r.status>=500?4:O)}let i=r.body,o;if(i.status==="authenticated"){if(o=DD(r.setCookie),!o)H({code:"auth_failed",message:"Server returned authenticated status but no session cookie"},Rt)}else{if(!process.stdin.isTTY)H({code:"otp_required",message:"OTP verification requires an interactive terminal."},O);let l=await ID("Enter the 6-digit code sent to your email: ");if(!/^\d{6}$/.test(l))H({code:"invalid_otp",message:"OTP code must be exactly 6 digits."},O);let d=await Pf(`${n}/v1/auth/console/verify`,{email:a,code:l});if(d.status!==200){let u=d.body;H({code:u?.error?.code||"verify_failed",message:u?.error?.message||`OTP verification failed with status ${d.status}`},d.status>=500?4:O)}if(o=DD(d.setCookie),!o)H({code:"auth_failed",message:"Verification succeeded but no session cookie was returned"},Rt)}let s=t.keyName||`CLI (${Eae()})`;if(t.format==="text")console.error("Creating API key...");let c=await Pf(`${n}/v1/api-tokens`,{name:s,scope:{scope_level:"tenant",allowed_operations:["create_session","get_session","export","get_status","run_checks","create_links","manage_webhooks","admin"]}},{Cookie:Dae(o,n),"X-Typescape-Request":"1"});if(c.status!==201&&c.status!==200){let l=c.body;H({code:l?.error?.code||"token_create_failed",message:l?.error?.message||`Failed to create API key (status ${c.status})`},c.status>=500?4:Rt)}let A=c.body;if(!A.raw_token)H({code:"token_create_failed",message:"Server did not return a raw token."},Rt);if(vae(n,{api_key:A.raw_token,email:a,created_at:new Date().toISOString()}),t.format==="json")on({status:"authenticated",email:a,base_url:n,token_id:A.token_id,credentials_path:jo()},t.format);else console.log(`
|
|
320
320
|
Authenticated as ${a}`),console.log(`API key saved to ${jo()}`),console.log(`
|
|
321
|
-
You can now use Typescape CLI commands without setting TYPESCAPE_API_KEY.`);process.exit(W)}async function qD(e){let t=Iae(e),n=t.baseUrl.replace(/\/$/,""),a=Qae(n);if(t.format==="json")on({status:a?"logged_out":"not_logged_in",base_url:n},t.format);else if(a)console.log(`Logged out from ${n}`),console.log(`Credentials removed from ${jo()}`);else console.log(`No stored credentials for ${n}`);process.exit(W)}var Uf=".typescape/config.yaml",Sae="TYPESCAPE_API_KEY",MD="TYPESCAPE_BASE_URL",Rc=1;function Lae(e){if(e)return ND(e);return ND(Uf)}function Wn(e){let t=Lae(e);if(!Fae(t))H({code:"config_not_found",message:`Configuration file not found: ${t}. Create a .typescape/config.yaml file or use --config to specify a path.`},O);let n;try{let A=$ae(t,"utf-8");n=Bi(A)}catch(A){let l=A instanceof Error?A.message:String(A);H({code:"config_parse_error",message:`Failed to parse config file: ${l}`},O)}if(n.version!==void 0&&n.version!==Rc)H({code:"unsupported_config_version",message:`Unsupported config version: ${n.version}. Only version ${Rc} is supported.`},O);let a=process.env[MD],r=n.server?.base_url,i=a||r;if(!i)H({code:"missing_base_url",message:`Missing server.base_url in config file. Set server.base_url in ${t} or set the ${MD} environment variable.`},O);let o=i.trim().replace(/\/+$/,"");if(!/^https?:\/\//i.test(o))o=`https://${o}`;let s=n.server?.api_key_env||Sae,c=process.env[s];if(!c){let A=LD(o);if(A)c=A.api_key}if(!c)H({code:"missing_api_key",message:`Environment variable ${s} is not set. Run 'typescape auth login' or set the env var to your API key.`},Rt);return{baseUrl:o,apiKey:c,repoId:n.repo?.id,configPath:t}}function jae(e){if(e===void 0)return null;try{let t=JSON.stringify(e);if(!t)return null;if(t.length<=400)return t;return`${t.slice(0,397)}...`}catch{return null}}function Jn(e){let t=e.baseUrl.replace(/\/$/,""),n="/v1";async function a(r,i,o={}){let s=`${t}/v1${i}`;if(o.query&&Object.keys(o.query).length>0){let g=new URLSearchParams(o.query);s+=`?${g.toString()}`}let c={Authorization:`Bearer ${e.apiKey}`,Accept:"application/json",...o.headers};if(o.body!==void 0)c["Content-Type"]="application/json";let A;try{A=await fetch(s,{method:r,headers:c,body:o.body!==void 0?JSON.stringify(o.body):void 0})}catch(g){let b=g instanceof Error?g.message:String(g);H({code:"network_error",message:`Network error: ${b}`},Rt)}let l,d=null;if((A.headers.get("Content-Type")||"").includes("application/json"))try{l=await A.json()}catch{l={}}else{try{d=(await A.text()).trim()||null}catch{d=null}l={}}let p=l?.request_id||A.headers.get("X-Request-Id")||"unknown";if(!A.ok){let g=l,b=g.error?.code||(d?"unexpected_response":"api_error"),y=g.error?.message||`API request failed with status ${A.status}`;if(!g.error?.message&&d){let D=d.length<=300?d:`${d.slice(0,297)}...`;y=`${y}: ${D}`}let w=[];if(g.error?.fix_hint)w.push(`fix_hint: ${g.error.fix_hint}`);let E=jae(g.error?.details);if(E)w.push(`details: ${E}`);if(w.length>0)y=`${y} (${w.join("; ")})`;let C=bx(A.status);H({code:b,message:`${y} (request_id: ${p})`},C)}return{status:A.status,body:l,requestId:p}}return{async get(r,i){return a("GET",r,i)},async post(r,i){return a("POST",r,i)},async put(r,i){return a("PUT",r,i)},async patch(r,i){return a("PATCH",r,i)},async delete(r,i){return a("DELETE",r,i)},request:a}}var{spawn:qae}=globalThis.Bun;import{existsSync as Nae,readFileSync as Mae}from"fs";import{resolve as Gae}from"path";class Vn extends Error{code;constructor(e,t){super(t);this.code=e;this.name="ReviewersFromConfigError"}}function Rae(e){let t={file:"",reviewers:[],approvers:[],format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--file")t.file=e[n+1]||"",n+=2;else if(a.startsWith("--file="))t.file=a.slice(7),n++;else if(a==="--repo")t.repo=e[n+1],n+=2;else if(a.startsWith("--repo="))t.repo=a.slice(7),n++;else if(a==="--sha")t.sha=e[n+1],n+=2;else if(a.startsWith("--sha="))t.sha=a.slice(6),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--reviewer")t.reviewers.push(e[n+1]||""),n+=2;else if(a.startsWith("--reviewer="))t.reviewers.push(a.slice(11)),n++;else if(a==="--reviewers"){let r=e[n+1]||"";t.reviewers.push(...Kd(r)),n+=2}else if(a.startsWith("--reviewers=")){let r=a.slice(12);t.reviewers.push(...Kd(r)),n++}else if(a==="--participants"){let r=e[n+1]||"";t.reviewers.push(...Kd(r)),n+=2}else if(a.startsWith("--participants=")){let r=a.slice(15);t.reviewers.push(...Kd(r)),n++}else if(a==="--approver")t.approvers.push(e[n+1]||""),n+=2;else if(a.startsWith("--approver="))t.approvers.push(a.slice(11)),n++;else if(a==="--reviewers-from")t.reviewersFrom=e[n+1],n+=2;else if(a.startsWith("--reviewers-from="))t.reviewersFrom=a.slice(17),n++;else if(a==="--idempotency-key")t.idempotencyKey=e[n+1],n+=2;else if(a.startsWith("--idempotency-key="))t.idempotencyKey=a.slice(18),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Kd(e){return e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0)}function GD(e){if(!Array.isArray(e))throw new Vn("reviewers_file_invalid","reviewers.yaml fields must be string arrays.");return e.map((n)=>{if(typeof n!=="string")throw new Vn("reviewers_file_invalid","reviewers.yaml fields must only contain email strings.");return n.trim()}).filter((n)=>n.length>0)}function RD(e){if(e===void 0)return{};if(!e||typeof e!=="object"||Array.isArray(e))throw new Vn("reviewers_file_invalid","reviewers.yaml role sections must be objects.");let t=e;for(let n of Object.keys(t))if(n!=="reviewers"&&n!=="approvers")throw new Vn("reviewers_file_invalid",`Unknown key in reviewers.yaml role section: ${n}`);return{reviewers:t.reviewers===void 0?void 0:GD(t.reviewers),approvers:t.approvers===void 0?void 0:GD(t.approvers)}}function Pae(e){let t;try{t=Bi(e)}catch(r){let i=r instanceof Error?r.message:String(r);throw new Vn("reviewers_file_parse_error",`Failed to parse reviewers file: ${i}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw new Vn("reviewers_file_invalid","reviewers.yaml must be a YAML object.");let n=t;for(let r of Object.keys(n))if(r!=="default"&&r!=="overrides")throw new Vn("reviewers_file_invalid",`Unknown key in reviewers.yaml: ${r}`);let a={default:RD(n.default)};if(n.overrides!==void 0){if(!n.overrides||typeof n.overrides!=="object"||Array.isArray(n.overrides))throw new Vn("reviewers_file_invalid","reviewers.yaml overrides must be an object keyed by glob pattern.");let r=n.overrides,i={};for(let[o,s]of Object.entries(r))i[o]=RD(s);a.overrides=i}return a}function zae(e){return e==="."||e==="+"||e==="^"||e==="$"||e==="{"||e==="}"||e==="("||e===")"||e==="|"||e==="["||e==="]"||e==="\\"}function Uae(e,t){let n="",a=0;while(a<t.length){let r=t[a];if(r==="*")if(t[a+1]==="*"){if(n+=".*",a+=2,t[a]==="/")a++}else n+="[^/]*",a++;else if(r==="?")n+="[^/]",a++;else if(zae(r))n+=`\\${r}`,a++;else n+=r,a++}return new RegExp(`^${n}$`).test(e)}function Hae(e,t){if(e.length!==t.length)return t.length-e.length;return e.localeCompare(t)}function Tae(e,t){let n=e.default?.reviewers??[],a=e.default?.approvers??[],i=Object.keys(e.overrides??{}).filter((s)=>Uae(t,s)).sort(Hae)[0];if(!i)return{reviewers:[...n],approvers:[...a]};let o=e.overrides?.[i]??{};return{reviewers:o.reviewers===void 0?[...n]:[...o.reviewers],approvers:o.approvers===void 0?[...a]:[...o.approvers],matchedOverride:i}}function Oae(e,t){let n=Gae(e);if(!Nae(n))throw new Vn("reviewers_file_not_found",`reviewers file not found: ${n}`);let a=Mae(n,"utf-8"),r=Pae(a);return Tae(r,t)}async function Zae(){try{let e=qae({cmd:["git","rev-parse","HEAD"],stdout:"pipe",stderr:"pipe"}),t=await Qr(e.stdout);if(await e.exited!==0)H({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O);let a=t.trim();if(!/^[a-f0-9]{40}$/i.test(a))H({code:"git_resolve_failed",message:`Invalid SHA format: ${a}. Use --sha to provide a commit SHA explicitly.`},O);return a.toLowerCase()}catch(e){H({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O)}}function Yae(e){let t=[...e.reviewers],n=[...e.approvers];if(e.reviewersFrom){let r=Oae(e.reviewersFrom,e.file);if(t.length===0)t=r.reviewers;if(n.length===0)n=r.approvers}let a=[];for(let r of t)if(r.trim())a.push({email:r.trim(),role:"reviewer",scopes:["read","comment"]});for(let r of n)if(r.trim())a.push({email:r.trim(),role:"approver",scopes:["read","comment","approve"]});return a}async function PD(e,t,n){let a=Rae(e);if(!a.file)H({code:"missing_required_flag",message:"Missing required flag: --file"},O);let r=a.repo;if(!r||r===".")r=t.repoId;if(!r)H({code:"repo_id_missing",message:"Could not determine repo_id. Set repo.id in .typescape/config.yaml or use --repo."},O);let i=a.sha;if(!i)i=await Zae();else{if(!/^[a-f0-9]{40}$/i.test(i))H({code:"invalid_sha_format",message:`Invalid SHA format: ${i}. Must be a 40-character hex string.`},O);i=i.toLowerCase()}let o=[];try{o=Yae(a)}catch(l){if(l instanceof Vn)H({code:l.code,message:l.message},O);throw l}if(o.length===0&&!a.reviewersFrom)H({code:"missing_participants",message:"At least one participant is required. Use --reviewer <email>, --reviewers <email1,email2>, --participants <email1,email2>, or --approver <email>."},O);if(o.length>0&&!a.title)H({code:"missing_title",message:"The --title flag is required when participants are specified. Provide a human-readable title for the review session."},O);if(o.length===0&&a.reviewersFrom)console.error(`Warning: no participants resolved from --reviewers-from (${a.reviewersFrom}) for file ${a.file}; proceeding with no explicit participants.`);let s={repo_id:r,git_sha:i,file_path:a.file};if(a.title)s.title=a.title;if(s.participants=o,a.idempotencyKey)s.idempotency_key=a.idempotencyKey;let c={};if(a.idempotencyKey)c["Idempotency-Key"]=a.idempotencyKey;let A=await n.post("/sessions",{body:s,headers:c});if(a.format==="json")on({...A.body,resolved_participants:o},"json");else{let l=A.body.session?.id||"unknown",d=A.body.invitations?.[0]?.review_url||"";if(console.log(`Session created: ${l}`),d)console.log(`Review URL: ${d}`)}process.exit(W)}import{writeFileSync as Kae}from"fs";function Wae(e){let t={session:"",schema:"v1",format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--out")t.out=e[n+1],n+=2;else if(a.startsWith("--out="))t.out=a.slice(6),n++;else if(a==="--schema")t.schema=e[n+1]||"v1",n+=2;else if(a.startsWith("--schema="))t.schema=a.slice(9),n++;else if(a==="--view")t.view=e[n+1]||"",n+=2;else if(a.startsWith("--view="))t.view=a.slice(7),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function zD(e,t,n){let a=Wae(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(a.schema!=="v1")H({code:"unsupported_schema_version",message:`Unsupported schema version: ${a.schema}. Only v1 is supported.`},O);let r={schema:a.schema};if(a.view)r.view=a.view;let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/export`,{query:r}),o=JSON.stringify(i.body,null,2);if(a.out)Kae(a.out,o,"utf-8"),console.error(`Export written to ${a.out}`);else if(a.format==="json")console.log(o);else{let s=i.body.session,c=i.body.threads?.length??0,A=i.body.approvals?.length??0;console.log(`Session ID: ${s?.id??"unknown"}`),console.log(`File Path: ${s?.file_path??"unknown"}`),console.log(`Source Type: ${s?.source_type??"unknown"}`),console.log(`Git SHA: ${s?.git_sha??"N/A"}`),console.log(`Schema Version: ${i.body.schema_version}`),console.log(`Threads: ${c}`),console.log(`Approvals: ${A}`),console.log(`Request ID: ${i.body.request_id}`)}process.exit(W)}function Jae(e){let t={session:"",simulate:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<0)H({code:"invalid_wait_value",message:`Invalid --wait value: ${e[n+1]}. Must be a non-negative integer (seconds).`},O);t.wait=r,n+=2}else if(a.startsWith("--wait=")){let r=a.slice(7),i=parseInt(r,10);if(Number.isNaN(i)||i<0)H({code:"invalid_wait_value",message:`Invalid --wait value: ${r}. Must be a non-negative integer (seconds).`},O);t.wait=i,n++}else if(a==="--simulate")t.simulate=!0,n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Vae(e){let t=[];if(e.details)for(let[n,a]of Object.entries(e.details))t.push(`${n}=${a}`);if(e.thread_ids&&e.thread_ids.length>0)t.push(`threads=[${e.thread_ids.join(",")}]`);if(e.approval_ids&&e.approval_ids.length>0)t.push(`approval_ids=[${e.approval_ids.join(",")}]`);return t.join(" ")}async function UD(e,t,n){let a=Jae(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);let r={};if(a.simulate)r.simulate="true";if(a.wait!==void 0)r.wait=String(a.wait);let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/status`,{query:r}),{verdict:o,reasons:s}=i.body;if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else if(console.log(`Session: ${a.session}`),console.log(`Verdict: ${o}`),s.length>0){console.log("Reasons:");for(let c of s){let A=Vae(c);console.log(` ${c.code}${A?" "+A:""}`)}}if(o==="pass")process.exit(W);else process.exit(ga)}function Xae(e){let t={session:"",newSha:"",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--new-sha")t.newSha=e[n+1]||"",n+=2;else if(a.startsWith("--new-sha="))t.newSha=a.slice(10),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function HD(e,t,n){let a=Xae(e);if(!a.session){H({code:"missing_required_flag",message:"Missing required flag: --session"},O);return}if(!a.newSha){H({code:"missing_required_flag",message:"Missing required flag: --new-sha"},O);return}if(!/^[a-f0-9]{40}$/i.test(a.newSha)){H({code:"invalid_sha_format",message:`Invalid SHA format: ${a.newSha}. Must be a 40-character hex string.`},O);return}let r={git_sha:a.newSha.toLowerCase()};if(a.title)r.title=a.title;let i=await n.post(`/sessions/${encodeURIComponent(a.session)}/supersede`,{body:r});if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else{let{session:o,carry_forward:s,review_url:c}=i.body;console.log(`New session: ${o.id}`),console.log(`Supersedes: ${a.session}`);let A=s?.carried_count??0,l=s?.orphaned_count??0;if(console.log(`Carry-forward: ${A} threads carried, ${l} orphaned`),c)console.log(`Review URL: ${c}`)}process.exit(W)}function ere(e){if(!e||typeof e!=="object")return!1;return e.features?.checks===!0}async function tre(e){let n=`${e.baseUrl.replace(/\/$/,"")}/v1/me/capabilities`,a;try{a=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e.apiKey}`,Accept:"application/json"}})}catch(o){let s=o instanceof Error?o.message:String(o);H({code:"capabilities_fetch_failed",message:`Failed to load capabilities: ${s}`},Rt)}let r={};if((a.headers.get("Content-Type")||"").includes("application/json"))try{r=await a.json()}catch{r={}}if(!a.ok){let o={};if(r&&typeof r==="object")o=r;let s=o.error?.code||"capabilities_fetch_failed",c=o.error?.message||`Failed to load capabilities (status ${a.status})`,A=o.request_id?` (request_id: ${o.request_id})`:"";H({code:s,message:`${c}${A}`},Rt)}if(ere(r))return;H({code:"feature_disabled",message:"Feature checks is not enabled for this deployment"},O)}function nre(e){let t={session:"",wait:!0,timeout:300,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait")t.wait=!0,n++;else if(a==="--no-wait")t.wait=!1,n++;else if(a==="--timeout"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<=0)H({code:"invalid_timeout_value",message:`Invalid --timeout value: ${e[n+1]}. Must be a positive integer (seconds).`},O);t.timeout=r,n+=2}else if(a.startsWith("--timeout=")){let r=a.slice(10),i=parseInt(r,10);if(Number.isNaN(i)||i<=0)H({code:"invalid_timeout_value",message:`Invalid --timeout value: ${r}. Must be a positive integer (seconds).`},O);t.timeout=i,n++}else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function are(e){return new Promise((t)=>setTimeout(t,e))}async function rre(e,t,n,a){let r=Date.now()+a*1000,i=2000;while(Date.now()<r){let o=await e.get(`/sessions/${encodeURIComponent(t)}/checks/${encodeURIComponent(n)}`);if(o.body.status==="completed"||o.body.status==="failed")return o.body;await are(2000)}H({code:"check_run_timeout",message:`Check run did not complete within ${a}s. Run ID: ${n}`},Pa)}async function TD(e,t,n){let a=nre(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);await tre(t);let r=await n.post(`/sessions/${encodeURIComponent(a.session)}/run-checks`),{check_run_id:i}=r.body;if(!a.wait){if(a.format==="json")console.log(JSON.stringify(r.body,null,2));else console.log(`Check run enqueued: ${i}`);process.exit(W)}if(a.format==="text")console.log(`Check run: ${i} (running)`);let o=Date.now(),s=await rre(n,a.session,i,a.timeout);if(s.status==="failed"){if(a.format==="json")console.log(JSON.stringify(s,null,2));else if(console.log(`
|
|
321
|
+
You can now use Typescape CLI commands without setting TYPESCAPE_API_KEY.`);process.exit(W)}async function qD(e){let t=Iae(e),n=t.baseUrl.replace(/\/$/,""),a=Qae(n);if(t.format==="json")on({status:a?"logged_out":"not_logged_in",base_url:n},t.format);else if(a)console.log(`Logged out from ${n}`),console.log(`Credentials removed from ${jo()}`);else console.log(`No stored credentials for ${n}`);process.exit(W)}var Uf=".typescape/config.yaml",Sae="TYPESCAPE_API_KEY",MD="TYPESCAPE_BASE_URL",Rc=1;function Lae(e){if(e)return ND(e);return ND(Uf)}function Wn(e){let t=Lae(e);if(!Fae(t))H({code:"config_not_found",message:`Configuration file not found: ${t}. Create a .typescape/config.yaml file or use --config to specify a path.`},O);let n;try{let A=$ae(t,"utf-8");n=Bi(A)}catch(A){let l=A instanceof Error?A.message:String(A);H({code:"config_parse_error",message:`Failed to parse config file: ${l}`},O)}if(n.version!==void 0&&n.version!==Rc)H({code:"unsupported_config_version",message:`Unsupported config version: ${n.version}. Only version ${Rc} is supported.`},O);let a=process.env[MD],r=n.server?.base_url,i=a||r;if(!i)H({code:"missing_base_url",message:`Missing server.base_url in config file. Set server.base_url in ${t} or set the ${MD} environment variable.`},O);let o=i.trim().replace(/\/+$/,"");if(!/^https?:\/\//i.test(o))o=`https://${o}`;let s=n.server?.api_key_env||Sae,c=process.env[s];if(!c){let A=LD(o);if(A)c=A.api_key}if(!c)H({code:"missing_api_key",message:`Environment variable ${s} is not set. Run 'typescape auth login' or set the env var to your API key.`},Rt);return{baseUrl:o,apiKey:c,repoId:n.repo?.id,configPath:t}}function jae(e){if(e===void 0)return null;try{let t=JSON.stringify(e);if(!t)return null;if(t.length<=400)return t;return`${t.slice(0,397)}...`}catch{return null}}function Jn(e){let t=e.baseUrl.replace(/\/$/,""),n="/v1";async function a(r,i,o={}){let s=`${t}/v1${i}`;if(o.query&&Object.keys(o.query).length>0){let g=new URLSearchParams(o.query);s+=`?${g.toString()}`}let c={Authorization:`Bearer ${e.apiKey}`,Accept:"application/json",...o.headers};if(o.body!==void 0)c["Content-Type"]="application/json";let A;try{A=await fetch(s,{method:r,headers:c,body:o.body!==void 0?JSON.stringify(o.body):void 0})}catch(g){let b=g instanceof Error?g.message:String(g);H({code:"network_error",message:`Network error: ${b}`},Rt)}let l,d=null;if((A.headers.get("Content-Type")||"").includes("application/json"))try{l=await A.json()}catch{l={}}else{try{d=(await A.text()).trim()||null}catch{d=null}l={}}let p=l?.request_id||A.headers.get("X-Request-Id")||"unknown";if(!A.ok){let g=l,b=g.error?.code||(d?"unexpected_response":"api_error"),y=g.error?.message||`API request failed with status ${A.status}`;if(!g.error?.message&&d){let D=d.length<=300?d:`${d.slice(0,297)}...`;y=`${y}: ${D}`}let w=[];if(g.error?.fix_hint)w.push(`fix_hint: ${g.error.fix_hint}`);let E=jae(g.error?.details);if(E)w.push(`details: ${E}`);if(w.length>0)y=`${y} (${w.join("; ")})`;let C=bx(A.status);H({code:b,message:`${y} (request_id: ${p})`},C)}return{status:A.status,body:l,requestId:p}}return{async get(r,i){return a("GET",r,i)},async post(r,i){return a("POST",r,i)},async put(r,i){return a("PUT",r,i)},async patch(r,i){return a("PATCH",r,i)},async delete(r,i){return a("DELETE",r,i)},request:a}}var{spawn:qae}=globalThis.Bun;import{existsSync as Nae,readFileSync as Mae}from"fs";import{resolve as Gae}from"path";class Vn extends Error{code;constructor(e,t){super(t);this.code=e;this.name="ReviewersFromConfigError"}}function Rae(e){let t={file:"",reviewers:[],approvers:[],format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--file")t.file=e[n+1]||"",n+=2;else if(a.startsWith("--file="))t.file=a.slice(7),n++;else if(a==="--repo")t.repo=e[n+1],n+=2;else if(a.startsWith("--repo="))t.repo=a.slice(7),n++;else if(a==="--sha")t.sha=e[n+1],n+=2;else if(a.startsWith("--sha="))t.sha=a.slice(6),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--reviewer")t.reviewers.push(e[n+1]||""),n+=2;else if(a.startsWith("--reviewer="))t.reviewers.push(a.slice(11)),n++;else if(a==="--reviewers"){let r=e[n+1]||"";t.reviewers.push(...Kd(r)),n+=2}else if(a.startsWith("--reviewers=")){let r=a.slice(12);t.reviewers.push(...Kd(r)),n++}else if(a==="--participants"){let r=e[n+1]||"";t.reviewers.push(...Kd(r)),n+=2}else if(a.startsWith("--participants=")){let r=a.slice(15);t.reviewers.push(...Kd(r)),n++}else if(a==="--approver")t.approvers.push(e[n+1]||""),n+=2;else if(a.startsWith("--approver="))t.approvers.push(a.slice(11)),n++;else if(a==="--reviewers-from")t.reviewersFrom=e[n+1],n+=2;else if(a.startsWith("--reviewers-from="))t.reviewersFrom=a.slice(17),n++;else if(a==="--idempotency-key")t.idempotencyKey=e[n+1],n+=2;else if(a.startsWith("--idempotency-key="))t.idempotencyKey=a.slice(18),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Kd(e){return e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0)}function GD(e){if(!Array.isArray(e))throw new Vn("reviewers_file_invalid","reviewers.yaml fields must be string arrays.");return e.map((n)=>{if(typeof n!=="string")throw new Vn("reviewers_file_invalid","reviewers.yaml fields must only contain email strings.");return n.trim()}).filter((n)=>n.length>0)}function RD(e){if(e===void 0)return{};if(!e||typeof e!=="object"||Array.isArray(e))throw new Vn("reviewers_file_invalid","reviewers.yaml role sections must be objects.");let t=e;for(let n of Object.keys(t))if(n!=="reviewers"&&n!=="approvers")throw new Vn("reviewers_file_invalid",`Unknown key in reviewers.yaml role section: ${n}`);return{reviewers:t.reviewers===void 0?void 0:GD(t.reviewers),approvers:t.approvers===void 0?void 0:GD(t.approvers)}}function Pae(e){let t;try{t=Bi(e)}catch(r){let i=r instanceof Error?r.message:String(r);throw new Vn("reviewers_file_parse_error",`Failed to parse reviewers file: ${i}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw new Vn("reviewers_file_invalid","reviewers.yaml must be a YAML object.");let n=t;for(let r of Object.keys(n))if(r!=="default"&&r!=="overrides")throw new Vn("reviewers_file_invalid",`Unknown key in reviewers.yaml: ${r}`);let a={default:RD(n.default)};if(n.overrides!==void 0){if(!n.overrides||typeof n.overrides!=="object"||Array.isArray(n.overrides))throw new Vn("reviewers_file_invalid","reviewers.yaml overrides must be an object keyed by glob pattern.");let r=n.overrides,i={};for(let[o,s]of Object.entries(r))i[o]=RD(s);a.overrides=i}return a}function zae(e){return e==="."||e==="+"||e==="^"||e==="$"||e==="{"||e==="}"||e==="("||e===")"||e==="|"||e==="["||e==="]"||e==="\\"}function Uae(e,t){let n="",a=0;while(a<t.length){let r=t[a];if(r==="*")if(t[a+1]==="*"){if(n+=".*",a+=2,t[a]==="/")a++}else n+="[^/]*",a++;else if(r==="?")n+="[^/]",a++;else if(zae(r))n+=`\\${r}`,a++;else n+=r,a++}return new RegExp(`^${n}$`).test(e)}function Hae(e,t){if(e.length!==t.length)return t.length-e.length;return e.localeCompare(t)}function Tae(e,t){let n=e.default?.reviewers??[],a=e.default?.approvers??[],i=Object.keys(e.overrides??{}).filter((s)=>Uae(t,s)).sort(Hae)[0];if(!i)return{reviewers:[...n],approvers:[...a]};let o=e.overrides?.[i]??{};return{reviewers:o.reviewers===void 0?[...n]:[...o.reviewers],approvers:o.approvers===void 0?[...a]:[...o.approvers],matchedOverride:i}}function Oae(e,t){let n=Gae(e);if(!Nae(n))throw new Vn("reviewers_file_not_found",`reviewers file not found: ${n}`);let a=Mae(n,"utf-8"),r=Pae(a);return Tae(r,t)}async function Zae(){try{let e=qae({cmd:["git","rev-parse","HEAD"],stdout:"pipe",stderr:"pipe"}),t=await Qr(e.stdout);if(await e.exited!==0)H({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O);let a=t.trim();if(!/^[a-f0-9]{40}$/i.test(a))H({code:"git_resolve_failed",message:`Invalid SHA format: ${a}. Use --sha to provide a commit SHA explicitly.`},O);return a.toLowerCase()}catch(e){H({code:"git_resolve_failed",message:"Could not resolve HEAD. Use --sha to provide a commit SHA explicitly."},O)}}function Yae(e){let t=[...e.reviewers],n=[...e.approvers];if(e.reviewersFrom){let r=Oae(e.reviewersFrom,e.file);if(t.length===0)t=r.reviewers;if(n.length===0)n=r.approvers}let a=[];for(let r of t)if(r.trim())a.push({email:r.trim(),role:"reviewer",scopes:["read","comment"]});for(let r of n)if(r.trim())a.push({email:r.trim(),role:"approver",scopes:["read","comment","approve"]});return a}async function PD(e,t,n){let a=Rae(e);if(!a.file)H({code:"missing_required_flag",message:"Missing required flag: --file"},O);let r=a.repo;if(!r||r===".")r=t.repoId;if(!r)H({code:"repo_id_missing",message:"Could not determine repo_id. Set repo.id in .typescape/config.yaml or use --repo."},O);let i=a.sha;if(!i)i=await Zae();else{if(!/^[a-f0-9]{40}$/i.test(i))H({code:"invalid_sha_format",message:`Invalid SHA format: ${i}. Must be a 40-character hex string.`},O);i=i.toLowerCase()}let o=[];try{o=Yae(a)}catch(l){if(l instanceof Vn)H({code:l.code,message:l.message},O);throw l}if(o.length===0&&!a.reviewersFrom)H({code:"missing_participants",message:"At least one participant is required. Use --reviewer <email>, --reviewers <email1,email2>, --participants <email1,email2>, or --approver <email>."},O);if(o.length>0&&!a.title)H({code:"missing_title",message:"The --title flag is required when participants are specified. Provide a human-readable title for the review session."},O);if(o.length===0&&a.reviewersFrom)console.error(`Warning: no participants resolved from --reviewers-from (${a.reviewersFrom}) for file ${a.file}; proceeding with no explicit participants.`);let s={repo_id:r,git_sha:i,file_path:a.file};if(a.title)s.title=a.title;if(s.participants=o,a.idempotencyKey)s.idempotency_key=a.idempotencyKey;let c={};if(a.idempotencyKey)c["Idempotency-Key"]=a.idempotencyKey;let A=await n.post("/sessions",{body:s,headers:c});if(a.format==="json")on({...A.body,resolved_participants:o},"json");else{let l=A.body.session?.id||"unknown",d=A.body.invitations?.[0]?.review_url||"";if(console.log(`Session created: ${l}`),d)console.log(`Review URL: ${d}`)}process.exit(W)}import{writeFileSync as Kae}from"fs";function Wae(e){let t={session:"",schema:"v1",format:"json"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--out")t.out=e[n+1],n+=2;else if(a.startsWith("--out="))t.out=a.slice(6),n++;else if(a==="--schema")t.schema=e[n+1]||"v1",n+=2;else if(a.startsWith("--schema="))t.schema=a.slice(9),n++;else if(a==="--view")t.view=e[n+1]||"",n+=2;else if(a.startsWith("--view="))t.view=a.slice(7),n++;else if(a==="--format")t.format=e[n+1]||"json",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function zD(e,t,n){let a=Wae(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(a.schema!=="v1")H({code:"unsupported_schema_version",message:`Unsupported schema version: ${a.schema}. Only v1 is supported.`},O);let r={schema:a.schema};if(a.view)r.view=a.view;let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/export`,{query:r}),o=JSON.stringify(i.body,null,2);if(a.out)Kae(a.out,o,"utf-8"),console.error(`Export written to ${a.out}`);else if(a.format==="json")console.log(o);else{let s=i.body.session,c=i.body.threads?.length??0,A=i.body.approvals?.length??0;console.log(`Session ID: ${s?.id??"unknown"}`),console.log(`File Path: ${s?.file_path??"unknown"}`),console.log(`Source Type: ${s?.source_type??"unknown"}`),console.log(`Git SHA: ${s?.git_sha??"N/A"}`),console.log(`Schema Version: ${i.body.schema_version}`),console.log(`Threads: ${c}`),console.log(`Approvals: ${A}`),console.log(`Request ID: ${i.body.request_id}`)}process.exit(W)}function Jae(e){let t={session:"",simulate:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<0)H({code:"invalid_wait_value",message:`Invalid --wait value: ${e[n+1]}. Must be a non-negative integer (seconds).`},O);t.wait=r,n+=2}else if(a.startsWith("--wait=")){let r=a.slice(7),i=parseInt(r,10);if(Number.isNaN(i)||i<0)H({code:"invalid_wait_value",message:`Invalid --wait value: ${r}. Must be a non-negative integer (seconds).`},O);t.wait=i,n++}else if(a==="--simulate")t.simulate=!0,n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function Vae(e){let t=[];if(e.details)for(let[n,a]of Object.entries(e.details))t.push(`${n}=${a}`);if(e.thread_ids&&e.thread_ids.length>0)t.push(`threads=[${e.thread_ids.join(",")}]`);if(e.approval_ids&&e.approval_ids.length>0)t.push(`approval_ids=[${e.approval_ids.join(",")}]`);return t.join(" ")}async function UD(e,t,n){let a=Jae(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);let r={};if(a.simulate)r.simulate="true";if(a.wait!==void 0)r.wait=String(a.wait);let i=await n.get(`/sessions/${encodeURIComponent(a.session)}/status`,{query:r}),{verdict:o,reasons:s}=i.body;if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else if(console.log(`Session: ${a.session}`),console.log(`Verdict: ${o}`),s.length>0){console.log("Reasons:");for(let c of s){let A=Vae(c);console.log(` ${c.code}${A?" "+A:""}`)}}if(o==="pass")process.exit(W);else process.exit(ga)}function Xae(e){let t={session:"",newSha:"",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--new-sha")t.newSha=e[n+1]||"",n+=2;else if(a.startsWith("--new-sha="))t.newSha=a.slice(10),n++;else if(a==="--title")t.title=e[n+1],n+=2;else if(a.startsWith("--title="))t.title=a.slice(8),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else if(a?.startsWith("--"))if(console.error(`Warning: unknown flag '${a}' ignored`),n+1<e.length&&!e[n+1]?.startsWith("--"))n+=2;else n++;else n++}return t}async function HD(e,t,n){let a=Xae(e);if(!a.session){H({code:"missing_required_flag",message:"Missing required flag: --session"},O);return}if(!a.newSha){H({code:"missing_required_flag",message:"Missing required flag: --new-sha"},O);return}if(!/^[a-f0-9]{40}$/i.test(a.newSha)){H({code:"invalid_sha_format",message:`Invalid SHA format: ${a.newSha}. Must be a 40-character hex string.`},O);return}let r={git_sha:a.newSha.toLowerCase()};if(a.title)r.title=a.title;let i=await n.post(`/sessions/${encodeURIComponent(a.session)}/supersede`,{body:r});if(a.format==="json")console.log(JSON.stringify(i.body,null,2));else{let{session:o,carry_forward:s,invitations:c}=i.body;console.log(`New session: ${o.id}`),console.log(`Supersedes: ${a.session}`);let A=s?.carried_count??0,l=s?.orphaned_count??0;if(console.log(`Carry-forward: ${A} threads carried, ${l} orphaned`),c&&c.length>0){console.log(`Invitations: ${c.length} reviewer(s)`);for(let d of c)console.log(` ${d.email} \u2192 ${d.review_url}`)}}process.exit(W)}function ere(e){if(!e||typeof e!=="object")return!1;return e.features?.checks===!0}async function tre(e){let n=`${e.baseUrl.replace(/\/$/,"")}/v1/me/capabilities`,a;try{a=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e.apiKey}`,Accept:"application/json"}})}catch(o){let s=o instanceof Error?o.message:String(o);H({code:"capabilities_fetch_failed",message:`Failed to load capabilities: ${s}`},Rt)}let r={};if((a.headers.get("Content-Type")||"").includes("application/json"))try{r=await a.json()}catch{r={}}if(!a.ok){let o={};if(r&&typeof r==="object")o=r;let s=o.error?.code||"capabilities_fetch_failed",c=o.error?.message||`Failed to load capabilities (status ${a.status})`,A=o.request_id?` (request_id: ${o.request_id})`:"";H({code:s,message:`${c}${A}`},Rt)}if(ere(r))return;H({code:"feature_disabled",message:"Feature checks is not enabled for this deployment"},O)}function nre(e){let t={session:"",wait:!0,timeout:300,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--wait")t.wait=!0,n++;else if(a==="--no-wait")t.wait=!1,n++;else if(a==="--timeout"){let r=parseInt(e[n+1]||"",10);if(Number.isNaN(r)||r<=0)H({code:"invalid_timeout_value",message:`Invalid --timeout value: ${e[n+1]}. Must be a positive integer (seconds).`},O);t.timeout=r,n+=2}else if(a.startsWith("--timeout=")){let r=a.slice(10),i=parseInt(r,10);if(Number.isNaN(i)||i<=0)H({code:"invalid_timeout_value",message:`Invalid --timeout value: ${r}. Must be a positive integer (seconds).`},O);t.timeout=i,n++}else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}function are(e){return new Promise((t)=>setTimeout(t,e))}async function rre(e,t,n,a){let r=Date.now()+a*1000,i=2000;while(Date.now()<r){let o=await e.get(`/sessions/${encodeURIComponent(t)}/checks/${encodeURIComponent(n)}`);if(o.body.status==="completed"||o.body.status==="failed")return o.body;await are(2000)}H({code:"check_run_timeout",message:`Check run did not complete within ${a}s. Run ID: ${n}`},Pa)}async function TD(e,t,n){let a=nre(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);await tre(t);let r=await n.post(`/sessions/${encodeURIComponent(a.session)}/run-checks`),{check_run_id:i}=r.body;if(!a.wait){if(a.format==="json")console.log(JSON.stringify(r.body,null,2));else console.log(`Check run enqueued: ${i}`);process.exit(W)}if(a.format==="text")console.log(`Check run: ${i} (running)`);let o=Date.now(),s=await rre(n,a.session,i,a.timeout);if(s.status==="failed"){if(a.format==="json")console.log(JSON.stringify(s,null,2));else if(console.log(`
|
|
322
322
|
Check run failed.`),s.error_json)console.log(`Error: ${JSON.stringify(s.error_json,null,2)}`);process.exit(Pa)}if(a.format==="json")console.log(JSON.stringify(s,null,2));else{let A=((Date.now()-o)/1000).toFixed(1);if(console.log(`Runner: checks@${s.runner_version} | Config: ${s.config_hash.slice(0,12)}`),console.log(`
|
|
323
323
|
Completed in ${A}s`),s.truncated)fx("Warning: Results truncated \u2014 findings exceeded maximum per run.");let l=s.findings||[];if(l.length>0){console.log("");for(let p of l){let g=p.finding_gate==="gates"?"blocking":p.finding_gate==="informational"?"suggestion":p.finding_gate,b=p.block_id?`Block ${p.block_id}`:"Session-level",y=p.title||p.rule_id;if(console.log(` [${g}] ${y} (rule: ${p.rule_id})`),p.body_md)console.log(` ${b} -> ${JSON.stringify(p.body_md)}`);else console.log(` ${b}`)}}let d=l.filter((p)=>p.finding_gate==="gates").length,u=l.length-d;console.log(`
|
|
324
324
|
Result: ${l.length} findings (${d} blocking, ${u} other)`)}if((s.findings||[]).some((A)=>A.finding_gate==="gates"))process.exit(ga);else process.exit(W)}import{createHash as ire}from"crypto";import{readFileSync as ore,writeFileSync as sre}from"fs";var{spawn:cre}=globalThis.Bun;function Are(e){let t={session:"",threads:[],mode:"accepted_suggestions_only",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--threads"){let r=e[n+1]||"";t.threads=r.split(",").map((i)=>i.trim()).filter(Boolean),n+=2}else if(a.startsWith("--threads=")){let r=a.slice(10);t.threads=r.split(",").map((i)=>i.trim()).filter(Boolean),n++}else if(a==="--mode")t.mode=e[n+1]||"accepted_suggestions_only",n+=2;else if(a.startsWith("--mode="))t.mode=a.slice(7),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else if(a==="--out")t.out=e[n+1],n+=2;else if(a.startsWith("--out="))t.out=a.slice(6),n++;else n++}return t}async function OD(e,t,n){let a=Are(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);let r={mode:a.mode};if(a.threads.length>0)r.thread_ids=a.threads;let o=(await n.post(`/sessions/${encodeURIComponent(a.session)}/proposed-changes`,{body:r})).body;if(a.out)sre(a.out,o.patch,"utf-8"),console.error(`Patch written to ${a.out}`);if(a.format==="json")console.log(JSON.stringify(o,null,2));else{let s=o.target.git_sha?`${o.target.repo_id??"?"} @ ${o.target.git_sha}`:o.target.source_type;console.log(`Proposed Change: ${o.proposed_change_id}`),console.log(`Target: ${s} / ${o.target.file_path}`),console.log(`Expected SHA256: ${o.expected_source_content_sha256}`),console.log(`Patch SHA256: ${o.patch_sha256}`),console.log(`State: ${o.state}`),console.log("---"),console.log(o.patch)}process.exit(W)}function lre(e){let t={session:"",change:"",checkOnly:!1,format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--change")t.change=e[n+1]||"",n+=2;else if(a.startsWith("--change="))t.change=a.slice(9),n++;else if(a==="--check-only")t.checkOnly=!0,n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function ZD(e,t,n){let a=lre(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(!a.change)H({code:"missing_required_flag",message:"Missing required flag: --change"},O);let i=(await n.get(`/sessions/${encodeURIComponent(a.session)}/proposed-changes/${encodeURIComponent(a.change)}`)).body,o=i.target.file_path,s;try{s=Buffer.from(ore(o))}catch{H({code:"file_not_found",message:`Local file not found: ${o}`},O)}let c=`sha256:${ire("sha256").update(new Uint8Array(s)).digest("hex")}`;if(c!==i.expected_source_content_sha256)H({code:"content_hash_mismatch",message:`Local file hash mismatch. Expected: ${i.expected_source_content_sha256}. Got: ${c}. The file has changed since session creation.`},O);let A=a.checkOnly?["git","apply","--check","-"]:["git","apply","-"],l=cre({cmd:A,stdin:"pipe",stdout:"pipe",stderr:"pipe"});l.stdin.write(i.patch),l.stdin.end();let d=await Qr(l.stderr);if(await l.exited!==0)H({code:"git_apply_failed",message:`git apply failed: ${d.trim()||"patch could not be applied"}`},Pa);if(a.format==="json")console.log(JSON.stringify({proposed_change_id:i.proposed_change_id,file_path:o,check_only:a.checkOnly,applied:!a.checkOnly},null,2));else if(a.checkOnly)console.log(`Patch check passed for ${o}`);else console.log(`Patch applied to ${o}`);process.exit(W)}function dre(e){let t={session:"",change:"",commit:"",format:"text"},n=0;while(n<e.length){let a=e[n];if(a==="--session")t.session=e[n+1]||"",n+=2;else if(a.startsWith("--session="))t.session=a.slice(10),n++;else if(a==="--change")t.change=e[n+1]||"",n+=2;else if(a.startsWith("--change="))t.change=a.slice(9),n++;else if(a==="--commit")t.commit=e[n+1]||"",n+=2;else if(a.startsWith("--commit="))t.commit=a.slice(9),n++;else if(a==="--pr")t.pr=e[n+1],n+=2;else if(a.startsWith("--pr="))t.pr=a.slice(5),n++;else if(a==="--format")t.format=e[n+1]||"text",n+=2;else if(a.startsWith("--format="))t.format=a.slice(9),n++;else n++}return t}async function YD(e,t,n){let a=dre(e);if(!a.session)H({code:"missing_required_flag",message:"Missing required flag: --session"},O);if(!a.change)H({code:"missing_required_flag",message:"Missing required flag: --change"},O);if(!a.commit)H({code:"missing_required_flag",message:"Missing required flag: --commit"},O);let i={patch_sha256:(await n.get(`/sessions/${encodeURIComponent(a.session)}/proposed-changes/${encodeURIComponent(a.change)}`)).body.patch_sha256,result_commit_sha:a.commit};if(a.pr)i.result_pr_url=a.pr;let o=await n.post(`/sessions/${encodeURIComponent(a.session)}/proposed-changes/${encodeURIComponent(a.change)}/applied`,{body:i});if(a.format==="json")console.log(JSON.stringify(o.body,null,2));else if(console.log(`Evidence recorded for ${a.change}`),console.log(` Commit: ${a.commit}`),a.pr)console.log(` PR: ${a.pr}`);process.exit(W)}import{readFileSync as aG,writeFileSync as Zke}from"fs";import{createHash as ure}from"crypto";var Hf=new Uint8Array([239,187,191]);function pre(e){return e.length>=3&&e[0]===Hf[0]&&e[1]===Hf[1]&&e[2]===Hf[2]}function Tf(e){let t=e.length,n=!1,a=e;if(pre(a))a=a.slice(3),n=!0;let r=new TextDecoder("utf-8",{fatal:!0}),i;try{i=r.decode(a)}catch{throw Error("Invalid UTF-8 encoding")}let o=i;i=i.replace(/\r\n/g,`
|