| 867 | Private-Lines: `+w+`\r |
| 868 | `,$+=H;var D=ov8("putty-private-key-file-mac-key",K),f=TX.util.createBuffer();fk6(f,z),fk6(f,Y),fk6(f,_),f.putInt32(A.length()),f.putBuffer(A),f.putInt32(j.length()),f.putBuffer(j);var G=TX.hmac.create();return G.start("sha1",D),G.update(f.bytes()),$+=`\r |
| 869 | Private-MAC: `+G.digest().toHex()+`\r |
| 870 | `,$};av8.publicKeyToOpenSSH=function(q,K){var _="ssh-rsa";K=K||"";var z=TX.util.createBuffer();return fk6(z,_),QF(z,q.e),QF(z,q.n),_+" "+TX.util.encode64(z.bytes())+" "+K};av8.privateKeyToOpenSSH=function(q,K){if(!K)return TX.pki.privateKeyToPem(q);return TX.pki.encryptRsaPrivateKey(q,K,{legacy:!0,algorithm:"aes128"})};av8.getPublicKeyFingerprint=function(q,K){K=K||{};var _=K.md||TX.md.md5.create(),z="ssh-rsa",Y=TX.util.createBuffer();fk6(Y,z),QF(Y,q.e),QF(Y,q.n),_.start(),_.update(Y.getBytes());var $=_.digest();if(K.encoding==="hex"){var A=$.toHex();if(K.delimiter)return A.match(/.{2}/g).join(K.delimiter);return A}else if(K.encoding==="binary")return $.getBytes();else if(K.encoding)throw Error('Unknown encoding "'+K.encoding+'".');return $};function QF(q,K){var _=K.toString(16);if(_[0]>="8")_="00"+_;var z=TX.util.hexToBytes(_);q.putInt32(z.length),q.putBytes(z)}function fk6(q,K){q.putInt32(K.length),q.putString(K)}function ov8(){var q=TX.md.sha1.create(),K=arguments.length;for(var _=0;_<K;++_)q.update(arguments[_]);return q.digest()}});var z24=m((ClA,_24)=>{_24.exports=E_();h76();yw4();Iu();Gv8();Ei6();Qw4();Yk6();nw4();rw4();aw4();Rb1();Sv8();JO6();vb1();Cb1();ew4();xb1();Vb1();Xb1();pv8();WC();Db1();K24();gb1();_$()});import{execFile as BU_}from"child_process";import{readFileSync as Zk6,writeFileSync as $24}from"fs";import{mkdtemp as gU_,rm as FU_,writeFile as UU_}from"fs/promises";import{tmpdir as QU_}from"os";import{join as Y24}from"path";import{promisify as dU_}from"util";function cU_(q,K,_,z){let Y=Zk6(q),$=Zk6(K,"utf-8"),A=Zk6(_,"utf-8"),O=z?.map((W)=>Zk6(W,"utf-8")),w=NH.default.pkcs7.createSignedData();w.content=NH.default.util.createBuffer(Y);let j=NH.default.pki.certificateFromPem($),H=NH.default.pki.privateKeyFromPem(A);if(w.addCertificate(j),O)for(let W of O)w.addCertificate(NH.default.pki.certificateFromPem(W));w.addSigner({key:H,certificate:j,digestAlgorithm:NH.default.pki.oids.sha256,authenticatedAttributes:[{type:NH.default.pki.oids.contentType,value:NH.default.pki.oids.data},{type:NH.default.pki.oids.messageDigest},{type:NH.default.pki.oids.signingTime}]}),w.sign({detached:!0});let J=NH.default.asn1.toDer(w.toAsn1()),M=Buffer.from(J.getBytes(),"binary"),X=nU_(M),P=Buffer.concat([Y,X]);$24(q,P)}async function lU_(q){try{let K=Zk6(q),{originalContent:_,pkcs7Signature:z}=mi6(K);if(!z)return{status:"unsigned"};let Y=NH.default.asn1.fromDer(z.toString("binary")),$=NH.default.pkcs7.messageFromAsn1(Y);if(!("type"in $)||$.type!==NH.default.pki.oids.signedData)return{status:"unsigned"};let A=$,O=A.certificates||[];if(O.length===0)return{status:"unsigned"};let w=O[0],j=NH.default.util.createBuffer(_);try{A.verify({authenticatedAttributes:!0});let W=A.signerInfos?.[0];if(W){let D=NH.default.md.sha256.create();D.update(j.getBytes());let f=D.digest().getBytes(),G=null;for(let Z of W.authenticatedAttributes)if(Z.type===NH.default.pki.oids.messageDigest){G=Z.value;break}if(!G||G!==f)return{status:"unsigned"}}}catch(P){return{status:"unsigned"}}let H=NH.default.pki.certificateToPem(w),J=O.slice(1).map((P)=>Buffer.from(NH.default.pki.certificateToPem(P)));if(!await w24(Buffer.from(H),J))return{status:"unsigned"};return{status:w.issuer.getField("CN")?.value===w.subject.getField("CN")?.value?"self-signed":"signed",publisher:w.subject.getField("CN")?.value||"Unknown",issuer:w.issuer.getField("CN")?.value||"Unknown",valid_from:w.validity.notBefore.toISOString(),valid_to:w.validity.notAfter.toISOString(),fingerprint:NH.default.md.sha256.create().update(NH.default.asn1.toDer(NH.default.pki.certificateToAsn1(w)).getBytes()).digest().toHex()}}catch(K){throw Error(`Failed to verify MCPB file: ${K}`)}}function nU_(q){let K=[];K.push(Buffer.from(A24,"utf-8"));let _=Buffer.alloc(4);return _.writeUInt32LE(q.length,0),K.push(_),K.push(q),K.push(Buffer.from(O24,"utf-8")),Buffer.concat(K)}function mi6(q){let K=Buffer.from(O24,"utf-8"),_=q.lastIndexOf(K);if(_===-1)return{originalContent:q};let z=Buffer.from(A24,"utf-8"),Y=-1;for(let O=_-1;O>=0;O--)if(q.slice(O,O+z.length).equals(z)){Y=O;break}if(Y===-1)return{originalContent:q};let $=q.slice(0,Y),A=Y+z.length;try{let O=q.readUInt32LE(A);A+=4;let w=q.slice(A,A+O);return{originalContent:$,pkcs7Signature:w}}catch{return{originalContent:q}}}async function w24(q,K){let _=null;try{_=await gU_(Y24(QU_(),"mcpb-verify-"));let z=Y24(_,"chain.pem"),Y=[q,...K||[]].join(` |
| 871 | `);if(await UU_(z,Y),process.platform==="darwin")try{return await zx1("security",["verify-cert","-c",z,"-p","codeSign"]),!0}catch($){return!1}else if(process.platform==="win32"){let $=` |
| 872 | $ErrorActionPreference = 'Stop' |
| 873 | $certCollection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection |
| 874 | $certCollection.Import('${z}') |
| 875 | |
| 876 | if ($certCollection.Count -eq 0) { |
| 877 | Write-Error 'No certificates found' |
| 878 | exit 1 |
| 879 | } |
| 880 | |
| 881 | $leafCert = $certCollection[0] |
| 882 | $chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain |
| 883 | |
| 884 | # Enable revocation checking |
| 885 | $chain.ChainPolicy.RevocationMode = 'Online' |
| 886 | $chain.ChainPolicy.RevocationFlag = 'EntireChain' |
| 887 | $chain.ChainPolicy.UrlRetrievalTimeout = New-TimeSpan -Seconds 30 |
| 888 | |
| 889 | # Add code signing application policy |
| 890 | $codeSignOid = New-Object System.Security.Cryptography.Oid '1.3.6.1.5.5.7.3.3' |
| 891 | $chain.ChainPolicy.ApplicationPolicy.Add($codeSignOid) |
| 892 | |
| 893 | # Add intermediate certificates to extra store |
| 894 | for ($i = 1; $i -lt $certCollection.Count; $i++) { |
| 895 | [void]$chain.ChainPolicy.ExtraStore.Add($certCollection[$i]) |
| 896 | } |
| 897 | |
| 898 | # Build and validate chain |
| 899 | $result = $chain.Build($leafCert) |
| 900 | |
| 901 | if ($result) { |
| 902 | 'Valid' |
| 903 | } else { |
| 904 | $chain.ChainStatus | ForEach-Object { |
| 905 | Write-Error "$($_.Status): $($_.StatusInformation)" |
| 906 | } |
| 907 | exit 1 |
| 908 | } |
| 909 | `.trim(),{stdout:A}=await zx1("powershell.exe",["-NoProfile","-NonInteractive","-Command",$]);return A.includes("Valid")}else try{return await zx1("openssl",["verify","-purpose","codesigning","-CApath","/etc/ssl/certs",z]),!0}catch($){return!1}}catch(z){return!1}finally{if(_)try{await FU_(_,{recursive:!0,force:!0})}catch{}}}function iU_(q){let K=Zk6(q),{originalContent:_}=mi6(K);$24(q,_)}var NH,A24="MCPB_SIG_V1",O24="MCPB_SIG_END",zx1;var Yx1=y(()=>{NH=O6(z24(),1),zx1=dU_(BU_)});function sv8({silent:q=!1}={}){return{log:(...K)=>{if(!q)console.log(...K)},error:(...K)=>{if(!q)console.error(...K)},warn:(...K)=>{if(!q)console.warn(...K)},info:(...K)=>{if(!q)console.info(...K)},debug:(...K)=>{if(!q)console.debug(...K)}}}import{chmodSync as rU_,existsSync as $x1,mkdirSync as j24,readFileSync as oU_,writeFileSync as aU_}from"fs";import{join as H24,resolve as tv8,sep as sU_}from"path";async function Ax1({mcpbPath:q,outputDir:K,silent:_}){let z=sv8({silent:_}),Y=tv8(q);if(!$x1(Y))return z.error(`ERROR: MCPB file not found: ${q}`),!1;let $=K?tv8(K):process.cwd();if(!$x1($))j24($,{recursive:!0});try{let A=oU_(Y),{originalContent:O}=mi6(A),w=new Map,j=process.platform!=="win32";if(j){let J=O,M=-1;for(let X=J.length-22;X>=0;X--)if(J.readUInt32LE(X)===101010256){M=X;break}if(M!==-1){let X=J.readUInt32LE(M+16),P=J.readUInt16LE(M+8),W=X;for(let D=0;D<P;D++)if(J.readUInt32LE(W)===33639248){let f=J.readUInt32LE(W+38),G=J.readUInt16LE(W+28),Z=J.toString("utf8",W+46,W+46+G),T=f>>16&511;if(T>0)w.set(Z,T);let v=J.readUInt16LE(W+30),V=J.readUInt16LE(W+32);W+=46+G+v+V}else break}}let H=DC1(O);for(let J in H)if(Object.prototype.hasOwnProperty.call(H,J)){let M=H[J],X=H24($,J),P=tv8(X),W=tv8($);if(!P.startsWith(W+sU_)&&P!==W)throw Error(`Path traversal attempt detected: ${J}`);let D=H24(X,"..");if(!$x1(D))j24(D,{recursive:!0});if(aU_(X,M),j&&w.has(J))try{let f=w.get(J);if(f!==void 0)rU_(X,f)}catch(f){}}return z.log(`Extension unpacked successfully to ${$}`),!0}catch(A){if(A instanceof Error)z.error(`ERROR: Failed to unpack extension: ${A.message}`);else z.error("ERROR: An unknown error occurred during unpacking.");return!1}}var Ox1=y(()=>{zi6();Yx1()});var J24,tU_,eU_,qQ_,KQ_,_Q_,zQ_,YQ_,$Q_,AQ_,nlA,M24,ilA;var X24=y(()=>{dA6();J24=HE({command:c7(),args:qJ(c7()).optional(),env:Bx(c7(),c7()).optional()}),tU_=HE({name:c7(),email:c7().email().optional(),url:c7().url().optional()}),eU_=HE({type:c7(),url:c7().url()}),qQ_=J24.partial(),KQ_=J24.extend({platform_overrides:Bx(c7(),qQ_).optional()}),_Q_=HE({type:gx(["python","node","binary"]),entry_point:c7(),mcp_config:KQ_}),zQ_=HE({claude_desktop:c7().optional(),platforms:qJ(gx(["darwin","win32","linux"])).optional(),runtimes:HE({python:c7().optional(),node:c7().optional()}).optional()}).passthrough(),YQ_=HE({name:c7(),description:c7().optional()}),$Q_=HE({name:c7(),description:c7().optional(),arguments:qJ(c7()).optional(),text:c7()}),AQ_=HE({type:gx(["string","number","boolean","directory","file"]),title:c7(),description:c7(),required:vW().optional(),default:v96([c7(),zh(),vW(),qJ(c7())]).optional(),multiple:vW().optional(),sensitive:vW().optional(),min:zh().optional(),max:zh().optional()}),nlA=Bx(c7(),v96([c7(),zh(),vW(),qJ(c7())])),M24=HE({$schema:c7().optional(),dxt_version:c7().optional().describe("@deprecated Use manifest_version instead"),manifest_version:c7().optional(),name:c7(),display_name:c7().optional(),version:c7(),description:c7(),long_description:c7().optional(),author:tU_,repository:eU_.optional(),homepage:c7().url().optional(),documentation:c7().url().optional(),support:c7().url().optional(),icon:c7().optional(),screenshots:qJ(c7()).optional(),server:_Q_,tools:qJ(YQ_).optional(),tools_generated:vW().optional(),prompts:qJ($Q_).optional(),prompts_generated:vW().optional(),keywords:qJ(c7()).optional(),license:c7().optional(),compatibility:zQ_.optional(),user_config:Bx(c7(),AQ_).optional()}).refine((q)=>!!(q.dxt_version||q.manifest_version),{message:"Either 'dxt_version' (deprecated) or 'manifest_version' must be provided"}),ilA=HE({status:gx(["signed","unsigned","self-signed"]),publisher:c7().optional(),issuer:c7().optional(),valid_from:c7().optional(),valid_to:c7().optional(),fingerprint:c7().optional()})});import{existsSync as wx1,readFileSync as OQ_,statSync as P24}from"fs";import*as YN from"fs/promises";import*as D24 from"os";import{join as wQ_,resolve as B76}from"path";function Hx1(q){try{let K=B76(q),_=K;if(wx1(K)&&P24(K).isDirectory())_=wQ_(K,"manifest.json");let z=OQ_(_,"utf-8"),Y=JSON.parse(z),$=rn6.safeParse(Y);if($.success)return console.log("Manifest schema validation passes!"),!0;else return console.log(`ERROR: Manifest validation failed: |
| 910 | `),$.error.issues.forEach((A)=>{let O=A.path.join(".");console.log(` - ${O?`${O}: `:""}${A.message}`)}),!1}catch(K){if(K instanceof Error)if(K.message.includes("ENOENT")){if(console.error(`ERROR: File not found: ${q}`),wx1(B76(q))&&P24(B76(q)).isDirectory())console.error(" (No manifest.json found in directory)")}else if(K.message.includes("JSON"))console.error(`ERROR: Invalid JSON in manifest file: ${K.message}`);else console.error(`ERROR: Error reading manifest: ${K.message}`);else console.error("ERROR: Unknown error occurred");return!1}}async function jQ_(q){let K=await YN.mkdtemp(B76(D24.tmpdir(),"mcpb-clean-")),_=B76(K,"in.mcpb"),z=B76(K,"out");console.log(" -- Cleaning MCPB...");try{await YN.copyFile(q,_),console.log(" -- Unpacking MCPB..."),await Ax1({mcpbPath:_,silent:!0,outputDir:z});let Y=B76(z,"manifest.json"),$=await YN.readFile(Y,"utf-8"),A=JSON.parse($),O=M24.safeParse(A);if(!O.success)throw Error('Unrecoverable manifest issues, please run "mcpb validate"');if(await YN.writeFile(Y,JSON.stringify(O.data,null,2)),$.trim()!==(await YN.readFile(Y,"utf8")).trim())console.log(" -- Update manifest to be valid per MCPB schema");else console.log(" -- Manifest already valid per MCPB schema");let w=B76(z,"node_modules");if(wx1(w)){console.log(" -- node_modules found, deleting development dependencies");let M=new W24.DestroyerOfModules({rootDirectory:z});try{await M.destroy()}catch(X){if(X instanceof Error&&X.message.includes("Failed to locate module"))console.log(" -- Some modules already removed, skipping remaining cleanup");else throw X}console.log(" -- Removed development dependencies from node_modules")}else console.log(" -- No node_modules, not pruning");let j=await YN.stat(q),{packExtension:H}=await Promise.resolve().then(() => (Mx1(),f24));await H({extensionPath:z,outputPath:q,silent:!0});let J=await YN.stat(q);console.log(` |
| 911 | Clean Complete:`),console.log("Before:",jx1.default(j.size)),console.log("After:",jx1.default(J.size))}finally{await YN.rm(K,{recursive:!0,force:!0})}}var W24,jx1;var Jx1=y(()=>{Ox1();on6();X24();W24=O6(QA4(),1),jx1=O6(lA4(),1)});var f24={};T8(f24,{packExtension:()=>T24});import{createHash as HQ_}from"crypto";import{existsSync as Z24,mkdirSync as JQ_,readFileSync as MQ_,statSync as XQ_,writeFileSync as PQ_}from"fs";import{basename as WQ_,join as G24,relative as DQ_,resolve as Xx1,sep as fQ_}from"path";function pi6(q){if(q<1024)return`${q}B`;else if(q<1048576)return`${(q/1024).toFixed(1)}kB`;else return`${(q/1048576).toFixed(1)}MB`}function ZQ_(q){return q.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-_.]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"").substring(0,100)}async function T24({extensionPath:q,outputPath:K,silent:_}){let z=Xx1(q),Y=sv8({silent:_});if(!Z24(z)||!XQ_(z).isDirectory())return Y.error(`ERROR: Directory not found: ${q}`),!1;let $=G24(z,"manifest.json");if(!Z24($))if(Y.log(`No manifest.json found in ${q}`),await zO({message:"Would you like to create a manifest.json file?",default:!0})){if(!await cS1(q))return Y.error("ERROR: Failed to create manifest"),!1}else return Y.error("ERROR: Cannot pack extension without manifest.json"),!1;if(Y.log("Validating manifest..."),!Hx1($))return Y.error("ERROR: Cannot pack extension with invalid manifest"),!1;let A;try{let J=MQ_($,"utf-8"),M=JSON.parse(J);A=rn6.parse(M)}catch(J){if(Y.error("ERROR: Failed to parse manifest.json"),J instanceof Error)Y.error(` ${J.message}`);return!1}let O=A.manifest_version||A.dxt_version;if(O!==zO6)return Y.error(`ERROR: Manifest version mismatch. Expected "${zO6}", found "${O}"`),Y.error(` Please update the manifest_version in your manifest.json to "${zO6}"`),!1;let w=WQ_(z),j=K?Xx1(K):Xx1(`${w}.mcpb`),H=G24(j,"..");JQ_(H,{recursive:!0});try{let J=TC1(z),{files:M,ignoredCount:X}=aT8(z,z,{},J);Y.log(` |