cc-safety-net 2.0.7 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  // cc-safety-net managed Amp plugin. Do not edit. Reinstall with: npx -y cc-safety-net install --amp
2
- // version: 2.0.7
2
+ // version: 2.0.8
3
3
  // @bun
4
4
  var jM=Object.defineProperty;var RM=($)=>$;function PM($,J){this[$]=RM.bind(null,J)}var U2=($,J)=>{for(var Q in J)jM($,Q,{get:J[Q],enumerable:!0,configurable:!0,set:PM.bind(J,Q)})};import{randomBytes as _O}from"crypto";import{appendFileSync as DO,mkdirSync as zO}from"fs";import{homedir as IO,userInfo as jO}from"os";import{isAbsolute as RO,join as CJ}from"path";var bM=[/\bgh[pousr]_[A-Za-z0-9]{20,}\b/g,/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,/\bglpat-[A-Za-z0-9_-]{20,}\b/g,/\bxox[abeprs]-[A-Za-z0-9-]{20,}\b/g,/\bnpm_[A-Za-z0-9_]{20,}\b/g,/\bpypi-[A-Za-z0-9_-]{20,}\b/g,/\b[rs]k_(?:live|test)_[A-Za-z0-9_]{20,}\b/g,/\bsk-[A-Za-z0-9_-]{20,}\b/g,/\bsk_[A-Za-z0-9]{20,}\b/g,/\bgsk_[A-Za-z0-9]{52,}\b/g,/\bxai-[A-Za-z0-9_-]{80,}\b/g,/\bpplx-[A-Za-z0-9_-]{20,}\b/g,/\bbastn_[A-Za-z0-9]{16,}\b/g,/\btgp_v1_[A-Za-z0-9_-]{43,}\b/g,/\bflp_[A-Za-z0-9]{10,}\b/g,/\bwfr_[A-Za-z0-9]{20,}\b/g,/\bfwp?_[A-Za-z0-9_-]{20,}\b/g,/\btp-[A-Za-z0-9_-]{20,}\b/g,/\bpsk-[A-Za-z0-9_-]{8,}-[A-Za-z0-9_-]{8,}\b/g,/\b[a-f0-9]{32}\.[A-Za-z0-9]{16}\b/g];function A0($){let J=$.replace(/\b((?:DATABASE|POSTGRES|POSTGRESQL|MYSQL|MARIADB|REDIS|MONGO(?:DB)?|DB)_DSN|CONNECTION_STRING)=("[^"]*"|'[^']*'|[^\s]+(?:\s+[A-Z_][A-Z0-9_]*=[^\s]+)*)/gi,"$1=<redacted>").replace(/\b((?:DATABASE|POSTGRES|POSTGRESQL|MYSQL|MARIADB|REDIS|MONGO(?:DB)?|DB)_(?:URL|URI|CONNECTION_STRING))=("[^"]*"|'[^']*'|[^\s]+)/gi,"$1=<redacted>").replace(/\b([A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASS|KEY|CREDENTIALS)[A-Z0-9_]*)=("[^"]*"|'[^']*'|[^\s]+)/gi,"$1=<redacted>");return AM(J)}function AM($){let J=$.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/gi,"<redacted>").replace(/((?:(['"])(?:authorization|cookie|x-api-key|api-key)\2|(?:authorization|cookie|x-api-key|api-key))\s*:\s*)(['"])(?:\\[^\r\n]|(?!\3)[^\\\r\n])*\3/gi,"$1$3<redacted>$3").replace(/(['"]?\s*(?:authorization|cookie|x-api-key|api-key)\s*:(?!\s*(?:"<redacted>"|'<redacted>'))\s*)([^'"\r\n]+)(['"]?)/gi,"$1<redacted>$3").replace(/\b([a-z][a-z0-9+.-]*:\/\/)([^\s/:@]+):([^\s@/]+)@/gi,"$1<redacted>:<redacted>@").replace(/\b([a-z][a-z0-9+.-]*:\/\/)([^\s/@:]+)@/gi,"$1<redacted>@").replace(/(^|[\s?&;|])((?:x-amz-signature|x-goog-signature|sig|signature)=)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^&#\s'"`;|<>()]*)/gi,"$1$2<redacted>").replace(/(^|\s)((?:-u|--user)(?:\s+|=))([^\s:]+):([^\s]+)/g,"$1$2<redacted>:<redacted>");for(let Q of bM)J=J.replace(Q,"<redacted>");return J.replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\b/g,"<redacted>").replace(/\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g,"<redacted>")}import{lstatSync as xK,readdirSync as KO,readFileSync as pK,rmdirSync as BO,statSync as uK,unlinkSync as qO,utimesSync as UO,writeFileSync as GO}from"fs";import{dirname as HO,join as r2}from"path";var b6=30,_J=1,DJ=365;function A6($){if(typeof $!=="number"||!Number.isInteger($))return 30;if($<1)return 1;return $>365?365:$}import{homedir as dM}from"os";import{dirname as p0,isAbsolute as rM,join as c0,relative as iM,resolve as S0,sep as oM}from"path";import{closeSync as EM,constants as PK,fstatSync as SM,fsyncSync as nE,lstatSync as bK,mkdirSync as sE,openSync as CM,readdirSync as aE,readFileSync as TM,realpathSync as E6,renameSync as tE,rmdirSync as eE,statSync as wM,unlinkSync as $S,writeFileSync as JS}from"fs";import{isAbsolute as AK,join as EK,normalize as vM,parse as fM,relative as zJ,resolve as IJ,sep as jJ}from"path";var kM=Symbol("PolicyFilesystemScope"),hM=Symbol("PolicyFilesystemTarget"),yM=PK.O_NOFOLLOW??0;class K1 extends Error{constructor($){super(`Unable to access ${$} filesystem safely.`);this.name="PolicyFilesystemError"}}function l0($,J){return{[kM]:!0,root:IJ($),label:J}}function SK($,J){let Q=vM(J);if(J===""||AK(J)||Q===".."||Q.startsWith(`..${jJ}`))throw new K1($.label);return{[hM]:!0,scope:$,relativePath:Q,path:EK($.root,Q)}}function E0($,J){let Q=zJ($.root,IJ(J));return SK($,Q)}function C6($,J="rules policy"){let Q=IJ($),W=fM(Q).dir;return SK(l0(W,J),zJ(W,Q))}function G2($){try{if(!S6($,!1).exists)return null;let Q=CM($.path,PK.O_RDONLY|yM);try{let W=SM(Q);if(!W.isFile())throw new K1($.scope.label);let X=TM(Q,"utf-8"),Y=bK($.path);if(!Y.isFile()||Y.isSymbolicLink()||W.dev!==Y.dev||W.ino!==Y.ino)throw new K1($.scope.label);return S6($,!1),X}finally{EM(Q)}}catch(J){uM($.scope.label,J)}}function CK($,J){if($.path===J.path)return!0;try{if(!S6($,!1).exists||!S6(J,!1).exists)return!1;return E6($.path)===E6(J.path)}catch(Q){if(Q instanceof K1)throw Q;throw new K1($.scope.label)}}function S6($,J,Q="file"){let W=gM($.scope);if(!W)return{exists:!1};let X=$.relativePath.split(jJ);for(let Y of X.keys()){let K=EK($.scope.root,...X.slice(0,Y+1)),B=TK(K);if(!B){if(Y===X.length-1&&J)return{exists:!1};return{exists:!1}}if(B.isSymbolicLink())throw new K1($.scope.label);if(Y<X.length-1&&!B.isDirectory())throw new K1($.scope.label);if(Y===X.length-1&&(Q==="file"?!B.isFile():!B.isDirectory()))throw new K1($.scope.label);xM(W,E6(K),$.scope.label)}return{exists:!0}}function gM($){if(!TK($.root))return null;if(!wM($.root).isDirectory())throw new K1($.label);return E6($.root)}function xM($,J,Q){let W=zJ($,J);if(W===".."||W.startsWith(`..${jJ}`)||AK(W))throw new K1(Q)}function TK($){try{return bK($)}catch(J){if(mM(J)&&J.code==="ENOENT")return null;throw J}}function uM($,J){if(J instanceof K1)throw J;throw new K1($)}function mM($){return $ instanceof Error&&"code"in $}var q0=/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/,RJ="rulebook.json",PJ=".cc-safety-net/rules";var wK=/^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)#(.+)$/;var lM=/^[A-Za-z0-9._-]+$/,pM=".cc-safety-net/rules".replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),cM="rulebook.json".replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),vK=new RegExp(`^${pM}/(${q0.source.slice(1,-1)})/${cM}$`);function fK($){return`.cc-safety-net/rules/${$}/rulebook.json`}function n4($){if(w6($))try{return T6($),null}catch(J){return J instanceof Error?J.message:String(J)}return q0.test($)?null:`Local rulebook sources must be bare names matching ${q0}: ${$}`}function T6($){if($.startsWith("github:"))throw Error(`Invalid rulebook source: ${$}`);let J=$.match(wK);if(!J?.[1]||!J[2]||!J[3])throw Error(`Invalid GitHub rulebook source: ${$}`);let[Q,W,...X]=J[3].split("/");if(!Q||!lM.test(Q))throw Error(`GitHub rulebook refs must be a single path segment: ${$}`);if(!W||X.length>0||!q0.test(W))throw Error(`GitHub rulebook sources must be owner/repo#ref/<rulebook-name>: ${$}`);return{owner:J[1],repo:J[2],ref:Q,path:fK(W),name:W}}function w6($){return wK.test($)}var hK="rule.json",v6="policy.json",nM="rule.lock";var yK=".cc-safety-net",sM="rules",kK="cache",aM="CC_SAFETY_NET_HOME",d0="`cc-safety-net rule sync`";function tM($){return S0($??process.cwd(),PJ)}function eM($){return c0(tM($),hK)}function H2($){return $?.userConfigDir??($?.userConfigPath?p0($.userConfigPath):c0($O(),sM))}function $O(){let $=process.env[aM];return $?S0($):c0(dM(),yK)}function JO($){return c0(H2($),hK)}function s4($){return c0(p0($),nM)}function gK($){let J=$.userConfigPath??JO($),Q=$.projectConfigPath??eM($.cwd),W=QO(J,$),X=WO(Q,$);return{userConfigPath:J,projectConfigPath:Q,userLockPath:s4(J),projectLockPath:s4(Q),userScope:W,projectScope:X,userConfigTarget:E0(W,J),projectConfigTarget:E0(X,Q),userLockTarget:E0(W,s4(J)),projectLockTarget:E0(X,s4(Q))}}function QO($,J){let Q=J.userConfigPath?p0(p0(S0(J.userConfigPath))):p0(S0(J.userConfigDir??H2(J)));return l0(Q,"user policy")}function WO($,J){let Q=S0(J.cwd??process.cwd()),W=S0($),X=iM(Q,W);if(X!==".."&&!X.startsWith(`..${oM}`)&&!rM(X))return l0(Q,"project policy");return l0(p0(p0(W)),"project policy")}function bJ($,J){let Q=$.digest.startsWith("sha256:")?$.digest.slice(7):$.digest;return c0(YO(J),"rulebooks",`${XO($)}--${Q.slice(0,12)}`,RJ)}function AJ($,J){let Q=J;return{cacheConfigDir:$,cwd:J.cwd,global:Q.global}}function XO($){return($.kind==="github"&&$.display_ref?`${$.owner}/${$.repo}#${$.display_ref}/${$.name}`:$.spec).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"rulebook"}function YO($){let J=$?.cacheConfigDir??H2($),Q=$;if(Q&&!Q.global&&Q.cwd&&S0(J)===S0(Q.cwd))return c0(S0(Q.cwd),yK,kK);return c0(p0(J),kK)}var SJ=86400000,ZO=".last-prune",LO=/^\d{4}-\d{2}$/,MO=/^((\d{4}-\d{2})-\d{2})-.+\.jsonl$/,mK=($)=>Math.floor($/SJ);function OO($){try{let J=r2(HO(H2($)),v6),Q=JSON.parse(pK(J,"utf-8"));return A6(Q?.audit?.retention_days)}catch{return b6}}function cK($,J=()=>new Date){try{let Q=J().getTime();if(!uK($,{throwIfNoEntry:!1})?.isDirectory())return;let W=r2($,ZO),X=uK(W,{throwIfNoEntry:!1})?.mtimeMs;if(X!==void 0&&mK(X)===mK(Q))return;let Y=Q-OO()*SJ,K=new Date(Q).toISOString().slice(0,7);for(let B of EJ($)){if(B.isDirectory()){NO(r2($,B.name),Y,K);continue}if(B.isFile()&&B.name.endsWith(".jsonl"))FO(r2($,B.name),Y)}GO(W,"",{mode:384}),UO(W,Q/1000,Q/1000)}catch{}}function NO($,J,Q){for(let W of EJ($)){if(!W.isDirectory()||!LO.test(W.name))continue;let X=r2($,W.name);for(let Y of EJ(X)){if(!Y.isFile())continue;let K=MO.exec(Y.name);if(!K||K[2]!==W.name)continue;let B=Date.parse(`${K[1]}T00:00:00.000Z`)+SJ;if(!Number.isFinite(B)||B>=J)continue;dK(r2(X,Y.name))}if(W.name!==Q)lK(X)}lK($)}function FO($,J){try{let Q=xK($);if(Q.mtimeMs>=J)return;let W=pK($,"utf-8").split(`
5
- `).filter((X)=>X.trim()).map(VO);if(W.length===0)return;if(W.some((X)=>X===void 0||X>=J))return;if(xK($).mtimeMs!==Q.mtimeMs)return;dK($)}catch{}}function VO($){try{let J=JSON.parse($).ts,Q=typeof J==="string"?Date.parse(J):Number.NaN;return Number.isFinite(Q)?Q:void 0}catch{return}}function EJ($){try{return KO($,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function dK($){try{qO($)}catch{}}function lK($){try{BO($)}catch{}}var PO="2.0.7",bO=1e4,AO=2000,EO=256,SO=32768;function CO($){let J=$.trim();if(!J)return null;let Q=J.replace(/[^A-Za-z0-9_.-]+/g,"_");if(Q=Q.replace(/^[._-]+|[._-]+$/g,"").slice(0,128),!Q||Q==="."||Q==="..")return null;return Q}function TO($){return($??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function TJ($,J,Q,W,X,Y={}){let K=CO($);if(!K)return;let B=Y.homeDir??rK();if(!B)return;let q=wO(B);if(!q)return;try{let U=(Y.now??(()=>new Date))().toISOString(),G=f6(A0(J),bO),H=f6(A0(Q),AO),L=Y.toolName?f6(A0(Y.toolName),EO):void 0,Z=X===null?void 0:f6(A0(X),SO),M=CJ(q,TO(Z?.value??null),U.slice(0,7));zO(M,{recursive:!0,mode:448});let O=CJ(M,`${U.slice(0,10)}-${K}.jsonl`),V={ts:U,id:(Y.createId??(()=>_O(8).toString("hex")))(),v:PO,sessionId:K,decision:Y.decision??"deny",agent:Y.agent,shape:Y.shape,level:Y.level,configFallback:Y.configFallback,toolName:L?.value,command:G.value,segment:H.value,...G.truncated||H.truncated||L?.truncated||Z?.truncated?{truncated:!0}:{},reason:W,ruleId:Y.ruleId,intent:Y.intent,failureStage:Y.failureStage,errorCode:Y.errorCode,cwd:Z?.value??null};DO(O,`${JSON.stringify(V)}
5
+ `).filter((X)=>X.trim()).map(VO);if(W.length===0)return;if(W.some((X)=>X===void 0||X>=J))return;if(xK($).mtimeMs!==Q.mtimeMs)return;dK($)}catch{}}function VO($){try{let J=JSON.parse($).ts,Q=typeof J==="string"?Date.parse(J):Number.NaN;return Number.isFinite(Q)?Q:void 0}catch{return}}function EJ($){try{return KO($,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function dK($){try{qO($)}catch{}}function lK($){try{BO($)}catch{}}var PO="2.0.8",bO=1e4,AO=2000,EO=256,SO=32768;function CO($){let J=$.trim();if(!J)return null;let Q=J.replace(/[^A-Za-z0-9_.-]+/g,"_");if(Q=Q.replace(/^[._-]+|[._-]+$/g,"").slice(0,128),!Q||Q==="."||Q==="..")return null;return Q}function TO($){return($??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function TJ($,J,Q,W,X,Y={}){let K=CO($);if(!K)return;let B=Y.homeDir??rK();if(!B)return;let q=wO(B);if(!q)return;try{let U=(Y.now??(()=>new Date))().toISOString(),G=f6(A0(J),bO),H=f6(A0(Q),AO),L=Y.toolName?f6(A0(Y.toolName),EO):void 0,Z=X===null?void 0:f6(A0(X),SO),M=CJ(q,TO(Z?.value??null),U.slice(0,7));zO(M,{recursive:!0,mode:448});let O=CJ(M,`${U.slice(0,10)}-${K}.jsonl`),V={ts:U,id:(Y.createId??(()=>_O(8).toString("hex")))(),v:PO,sessionId:K,decision:Y.decision??"deny",agent:Y.agent,shape:Y.shape,level:Y.level,configFallback:Y.configFallback,toolName:L?.value,command:G.value,segment:H.value,...G.truncated||H.truncated||L?.truncated||Z?.truncated?{truncated:!0}:{},reason:W,ruleId:Y.ruleId,intent:Y.intent,failureStage:Y.failureStage,errorCode:Y.errorCode,cwd:Z?.value??null};DO(O,`${JSON.stringify(V)}
6
6
  `,{encoding:"utf-8",mode:384}),cK(q,Y.now)}catch{}}function f6($,J){return{value:$.slice(0,J),truncated:$.length>J}}function rK($=process.env.CC_SAFETY_NET_AUDIT_HOME||process.env.HOME){let J=$||IO()||jO().homedir;return J&&RO(J)?J:null}function wO($=rK()){return $?CJ($,".cc-safety-net","logs"):null}function oK($,J,Q,W=!0,X){if(J.decision.kind==="allow"){if(!Q||$.route.kind!=="command")return;let B=iK($);return{decision:"allow",command:B,segment:B,reason:"allowed",cwd:$.context.executionCwd,toolName:$.toolName,level:J.level,...J.configFallback?{configFallback:!0}:{}}}let Y=J.decision.evidence.find((B)=>B.kind==="command"),K=Y?.command??(W?iK($):"");return{decision:"deny",command:K,segment:Y?.segment??K,reason:J.decision.reason,cwd:$.context.executionCwd,toolName:$.toolName,level:J.level,...J.configFallback?{configFallback:!0}:{},ruleId:J.decision.ruleId,intent:J.decision.intent,failureStage:X?.stage,errorCode:X?.errorCode}}function iK($){return"command"in $?$.command??"":""}function nK($,J,Q){if(!$)return;let W;try{W=J()}catch{return}if(typeof W!=="string"||!W.trim())return;TJ(W,$.command,$.segment,$.reason,$.cwd,{homeDir:Q.homeDir,decision:$.decision,agent:Q.agent,shape:Q.shape,level:$.level,configFallback:$.configFallback,toolName:$.toolName,ruleId:$.ruleId,intent:$.intent,failureStage:$.failureStage,errorCode:$.errorCode})}function sK($,J,Q){let W;try{W=J()}catch{return}if(typeof W!=="string"||!W.trim())return;TJ(W,$.command??"",$.segment??$.command??"",$.reason,Q.cwd??null,{homeDir:Q.homeDir,decision:"deny",agent:Q.agent,shape:Q.shape,toolName:Q.toolName??$.toolName,ruleId:$.ruleId,intent:$.intent})}import{realpathSync as uO,statSync as mO}from"fs";import{isAbsolute as tK,relative as lO,resolve as pO,sep as cO}from"path";import{dirname as vO,isAbsolute as fO,parse as kO,sep as hO}from"path";function Z2($,J=process.platform){if(J!=="win32")return!1;return($[0]==="/"||$[0]==="\\")&&($[1]==="/"||$[1]==="\\")}function r0($,J,Q){if(Z2(J))throw Error("Unsupported Windows namespace path");let W=fO(J)?gO(J):"",X=W||$;for(let Y of xO(W?J.slice(W.length):J)){if(Y===""||Y===".")continue;if(Y===".."){X=vO(X);continue}let K=yO(X,Y),B=Q.entryKind(K),q=B==="symlink"?Q.realpath(K):K;if(B==="missing"||q===null)throw Error(`Cannot resolve path component: ${K}`);X=q}return X}function yO($,J){return $.endsWith("/")||$.endsWith("\\")?`${$}${J}`:`${$}${hO}${J}`}function gO($){return kO($).root}function xO($){let J=process.platform==="win32"?/[\\/]+/:/\/+/;return $.split(J)}function k6($,J){if(Z2($))return;let Q=J.flatMap((X)=>aK(X));if(!Q[0])return;let W=aK(tK($)?$:pO(Q[0],$))[0];if(!W)return;return Q.some((X)=>eK(W,X))?W:void 0}function aK($){try{let J=uO($);return mO(J).isDirectory()?[J]:[]}catch{return[]}}function eK($,J){let Q=lO(J,$);return Q===""||Q!==".."&&!Q.startsWith(`..${cO}`)&&!tK(Q)}var i0="Command could not be safely analyzed (strict mode). Simplify the command and retry, or ask the user to verify.",C0="Command exceeds maximum recursion depth and cannot be safely analyzed. Flatten the nesting and retry.",$B="CC Safety Net could not validate the command because its structure exceeds safe analysis limits.",h6="CC Safety Net failed closed because command analysis failed unexpectedly. This is not caused by your command. Report it to the user.";function QB($){let{reason:J,command:Q,segment:W,toolName:X}=$,Y=$.maxLen??200,K=$.redact??((q)=>q),B=`BLOCKED by CC Safety Net
7
7
 
8
8
  Reason: ${K(J)}`;if($.ruleId)B+=`