cc-safety-net 2.0.0 → 2.0.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/amp/cc-safety-net.ts +2 -2
- package/dist/bin/cc-safety-net.js +74 -74
- package/dist/chunks/{index-9s8cwhj0.js → index-mf3j7fqk.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/openclaw/cc-safety-net/index.js +2 -2
- package/dist/openclaw/cc-safety-net/openclaw.plugin.json +1 -1
- package/dist/openclaw/cc-safety-net/package.json +1 -1
- package/dist/pi/index.js +1 -1
- package/package.json +2 -2
|
@@ -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.
|
|
2
|
+
// version: 2.0.1
|
|
3
3
|
// @bun
|
|
4
4
|
var OO=Object.defineProperty;var MO=($)=>$;function NO($,J){this[$]=MO.bind(null,J)}var B2=($,J)=>{for(var Q in J)OO($,Q,{get:J[Q],enumerable:!0,configurable:!0,set:NO.bind(J,Q)})};import{randomBytes as GM}from"crypto";import{appendFileSync as HM,mkdirSync as ZM}from"fs";import{homedir as LM,userInfo as OM}from"os";import{isAbsolute as MM,join as IJ}from"path";var FO=[/\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 j0($){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 VO(J)}function VO($){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 FO)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 EK,readdirSync as aO,readFileSync as wK,rmdirSync as tO,statSync as SK,unlinkSync as eO,utimesSync as $M,writeFileSync as JM}from"fs";import{dirname as QM,join as l2}from"path";var j6=30,HJ=1,ZJ=365;function R6($){if(typeof $!=="number"||!Number.isInteger($))return 30;if($<1)return 1;return $>365?365:$}import{homedir as kO}from"os";import{dirname as l0,isAbsolute as gO,join as p0,relative as yO,resolve as b0,sep as xO}from"path";import{closeSync as _O,constants as OK,fstatSync as DO,fsyncSync as AE,lstatSync as MK,mkdirSync as EE,openSync as zO,readdirSync as SE,readFileSync as IO,realpathSync as b6,renameSync as CE,rmdirSync as TE,statSync as jO,unlinkSync as wE,writeFileSync as vE}from"fs";import{isAbsolute as NK,join as FK,normalize as RO,parse as bO,relative as LJ,resolve as OJ,sep as MJ}from"path";var PO=Symbol("PolicyFilesystemScope"),AO=Symbol("PolicyFilesystemTarget"),EO=OK.O_NOFOLLOW??0;class W1 extends Error{constructor($){super(`Unable to access ${$} filesystem safely.`);this.name="PolicyFilesystemError"}}function m0($,J){return{[PO]:!0,root:OJ($),label:J}}function VK($,J){let Q=RO(J);if(J===""||NK(J)||Q===".."||Q.startsWith(`..${MJ}`))throw new W1($.label);return{[AO]:!0,scope:$,relativePath:Q,path:FK($.root,Q)}}function R0($,J){let Q=LJ($.root,OJ(J));return VK($,Q)}function A6($,J="rules policy"){let Q=OJ($),X=bO(Q).dir;return VK(m0(X,J),LJ(X,Q))}function q2($){try{if(!P6($,!1).exists)return null;let Q=zO($.path,OK.O_RDONLY|EO);try{let X=DO(Q);if(!X.isFile())throw new W1($.scope.label);let Y=IO(Q,"utf-8"),W=MK($.path);if(!W.isFile()||W.isSymbolicLink()||X.dev!==W.dev||X.ino!==W.ino)throw new W1($.scope.label);return P6($,!1),Y}finally{_O(Q)}}catch(J){TO($.scope.label,J)}}function _K($,J){if($.path===J.path)return!0;try{if(!P6($,!1).exists||!P6(J,!1).exists)return!1;return b6($.path)===b6(J.path)}catch(Q){if(Q instanceof W1)throw Q;throw new W1($.scope.label)}}function P6($,J,Q="file"){let X=SO($.scope);if(!X)return{exists:!1};let Y=$.relativePath.split(MJ);for(let W of Y.keys()){let K=FK($.scope.root,...Y.slice(0,W+1)),B=DK(K);if(!B){if(W===Y.length-1&&J)return{exists:!1};return{exists:!1}}if(B.isSymbolicLink())throw new W1($.scope.label);if(W<Y.length-1&&!B.isDirectory())throw new W1($.scope.label);if(W===Y.length-1&&(Q==="file"?!B.isFile():!B.isDirectory()))throw new W1($.scope.label);CO(X,b6(K),$.scope.label)}return{exists:!0}}function SO($){if(!DK($.root))return null;if(!jO($.root).isDirectory())throw new W1($.label);return b6($.root)}function CO($,J,Q){let X=LJ($,J);if(X===".."||X.startsWith(`..${MJ}`)||NK(X))throw new W1(Q)}function DK($){try{return MK($)}catch(J){if(wO(J)&&J.code==="ENOENT")return null;throw J}}function TO($,J){if(J instanceof W1)throw J;throw new W1($)}function wO($){return $ instanceof Error&&"code"in $}var Y0=/^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/,NJ="rulebook.json",FJ=".cc-safety-net/rules";var zK=/^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)#(.+)$/;var vO=/^[A-Za-z0-9._-]+$/,fO=".cc-safety-net/rules".replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),hO="rulebook.json".replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),IK=new RegExp(`^${fO}/(${Y0.source.slice(1,-1)})/${hO}$`);function jK($){return`.cc-safety-net/rules/${$}/rulebook.json`}function o4($){if(S6($))try{return E6($),null}catch(J){return J instanceof Error?J.message:String(J)}return Y0.test($)?null:`Local rulebook sources must be bare names matching ${Y0}: ${$}`}function E6($){if($.startsWith("github:"))throw Error(`Invalid rulebook source: ${$}`);let J=$.match(zK);if(!J?.[1]||!J[2]||!J[3])throw Error(`Invalid GitHub rulebook source: ${$}`);let[Q,X,...Y]=J[3].split("/");if(!Q||!vO.test(Q))throw Error(`GitHub rulebook refs must be a single path segment: ${$}`);if(!X||Y.length>0||!Y0.test(X))throw Error(`GitHub rulebook sources must be owner/repo#ref/<rulebook-name>: ${$}`);return{owner:J[1],repo:J[2],ref:Q,path:jK(X),name:X}}function S6($){return zK.test($)}var bK="rule.json",C6="policy.json",uO="rule.lock";var PK=".cc-safety-net",mO="rules",RK="cache",lO="CC_SAFETY_NET_HOME",c0="`cc-safety-net rule sync`";function pO($){return b0($??process.cwd(),FJ)}function cO($){return p0(pO($),bK)}function U2($){return $?.userConfigDir??($?.userConfigPath?l0($.userConfigPath):p0(dO(),mO))}function dO(){let $=process.env[lO];return $?b0($):p0(kO(),PK)}function rO($){return p0(U2($),bK)}function n4($){return p0(l0($),uO)}function AK($){let J=$.userConfigPath??rO($),Q=$.projectConfigPath??cO($.cwd),X=iO(J,$),Y=oO(Q,$);return{userConfigPath:J,projectConfigPath:Q,userLockPath:n4(J),projectLockPath:n4(Q),userScope:X,projectScope:Y,userConfigTarget:R0(X,J),projectConfigTarget:R0(Y,Q),userLockTarget:R0(X,n4(J)),projectLockTarget:R0(Y,n4(Q))}}function iO($,J){let Q=J.userConfigPath?l0(l0(b0(J.userConfigPath))):l0(b0(J.userConfigDir??U2(J)));return m0(Q,"user policy")}function oO($,J){let Q=b0(J.cwd??process.cwd()),X=b0($),Y=yO(Q,X);if(Y!==".."&&!Y.startsWith(`..${xO}`)&&!gO(Y))return m0(Q,"project policy");return m0(l0(l0(X)),"project policy")}function VJ($,J){let Q=$.digest.startsWith("sha256:")?$.digest.slice(7):$.digest;return p0(sO(J),"rulebooks",`${nO($)}--${Q.slice(0,12)}`,NJ)}function _J($,J){let Q=J;return{cacheConfigDir:$,cwd:J.cwd,global:Q.global}}function nO($){return($.kind==="github"&&$.display_ref?`${$.owner}/${$.repo}#${$.display_ref}/${$.name}`:$.spec).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"rulebook"}function sO($){let J=$?.cacheConfigDir??U2($),Q=$;if(Q&&!Q.global&&Q.cwd&&b0(J)===b0(Q.cwd))return p0(b0(Q.cwd),PK,RK);return p0(l0(J),RK)}var zJ=86400000,XM=".last-prune",YM=/^\d{4}-\d{2}$/,WM=/^((\d{4}-\d{2})-\d{2})-.+\.jsonl$/,CK=($)=>Math.floor($/zJ);function KM($){try{let J=l2(QM(U2($)),C6),Q=JSON.parse(wK(J,"utf-8"));return R6(Q?.audit?.retention_days)}catch{return j6}}function vK($,J=()=>new Date){try{let Q=J().getTime();if(!SK($,{throwIfNoEntry:!1})?.isDirectory())return;let X=l2($,XM),Y=SK(X,{throwIfNoEntry:!1})?.mtimeMs;if(Y!==void 0&&CK(Y)===CK(Q))return;let W=Q-KM()*zJ,K=new Date(Q).toISOString().slice(0,7);for(let B of DJ($)){if(B.isDirectory()){BM(l2($,B.name),W,K);continue}if(B.isFile()&&B.name.endsWith(".jsonl"))qM(l2($,B.name),W)}JM(X,"",{mode:384}),$M(X,Q/1000,Q/1000)}catch{}}function BM($,J,Q){for(let X of DJ($)){if(!X.isDirectory()||!YM.test(X.name))continue;let Y=l2($,X.name);for(let W of DJ(Y)){if(!W.isFile())continue;let K=WM.exec(W.name);if(!K||K[2]!==X.name)continue;let B=Date.parse(`${K[1]}T00:00:00.000Z`)+zJ;if(!Number.isFinite(B)||B>=J)continue;fK(l2(Y,W.name))}if(X.name!==Q)TK(Y)}TK($)}function qM($,J){try{let Q=EK($);if(Q.mtimeMs>=J)return;let X=wK($,"utf-8").split(`
|
|
5
|
-
`).filter((Y)=>Y.trim()).map(UM);if(X.length===0)return;if(X.some((Y)=>Y===void 0||Y>=J))return;if(EK($).mtimeMs!==Q.mtimeMs)return;fK($)}catch{}}function UM($){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 DJ($){try{return aO($,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function fK($){try{eO($)}catch{}}function TK($){try{tO($)}catch{}}var NM="2.0.
|
|
5
|
+
`).filter((Y)=>Y.trim()).map(UM);if(X.length===0)return;if(X.some((Y)=>Y===void 0||Y>=J))return;if(EK($).mtimeMs!==Q.mtimeMs)return;fK($)}catch{}}function UM($){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 DJ($){try{return aO($,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function fK($){try{eO($)}catch{}}function TK($){try{tO($)}catch{}}var NM="2.0.1",FM=1e4,VM=2000,_M=256,DM=32768;function zM($){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 IM($){return($??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function jJ($,J,Q,X,Y,W={}){let K=zM($);if(!K)return;let B=W.homeDir??hK();if(!B)return;let q=jM(B);if(!q)return;try{let U=(W.now??(()=>new Date))().toISOString(),G=T6(j0(J),FM),H=T6(j0(Q),VM),L=W.toolName?T6(j0(W.toolName),_M):void 0,Z=Y===null?void 0:T6(j0(Y),DM),O=IJ(q,IM(Z?.value??null),U.slice(0,7));ZM(O,{recursive:!0,mode:448});let M=IJ(O,`${U.slice(0,10)}-${K}.jsonl`),V={ts:U,id:(W.createId??(()=>GM(8).toString("hex")))(),v:NM,sessionId:K,decision:W.decision??"deny",agent:W.agent,shape:W.shape,level:W.level,configFallback:W.configFallback,toolName:L?.value,command:G.value,segment:H.value,...G.truncated||H.truncated||L?.truncated||Z?.truncated?{truncated:!0}:{},reason:X,ruleId:W.ruleId,intent:W.intent,failureStage:W.failureStage,errorCode:W.errorCode,cwd:Z?.value??null};HM(M,`${JSON.stringify(V)}
|
|
6
6
|
`,{encoding:"utf-8",mode:384}),vK(q,W.now)}catch{}}function T6($,J){return{value:$.slice(0,J),truncated:$.length>J}}function hK($=process.env.CC_SAFETY_NET_AUDIT_HOME||process.env.HOME){let J=$||LM()||OM().homedir;return J&&MM(J)?J:null}function jM($=hK()){return $?IJ($,".cc-safety-net","logs"):null}function gK($,J,Q,X=!0,Y){if(J.decision.kind==="allow"){if(!Q||$.route.kind!=="command")return;let B=kK($);return{decision:"allow",command:B,segment:B,reason:"allowed",cwd:$.context.executionCwd,toolName:$.toolName,level:J.level,...J.configFallback?{configFallback:!0}:{}}}let W=J.decision.evidence.find((B)=>B.kind==="command"),K=W?.command??(X?kK($):"");return{decision:"deny",command:K,segment:W?.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:Y?.stage,errorCode:Y?.errorCode}}function kK($){return"command"in $?$.command??"":""}function yK($,J,Q){if(!$)return;let X;try{X=J()}catch{return}if(typeof X!=="string"||!X.trim())return;jJ(X,$.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 xK($,J,Q){let X;try{X=J()}catch{return}if(typeof X!=="string"||!X.trim())return;jJ(X,$.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 TM,statSync as wM}from"fs";import{isAbsolute as mK,relative as vM,resolve as fM,sep as hM}from"path";import{dirname as RM,isAbsolute as bM,parse as PM,sep as AM}from"path";function G2($,J=process.platform){if(J!=="win32")return!1;return($[0]==="/"||$[0]==="\\")&&($[1]==="/"||$[1]==="\\")}function d0($,J,Q){if(G2(J))throw Error("Unsupported Windows namespace path");let X=bM(J)?SM(J):"",Y=X||$;for(let W of CM(X?J.slice(X.length):J)){if(W===""||W===".")continue;if(W===".."){Y=RM(Y);continue}let K=EM(Y,W),B=Q.entryKind(K),q=B==="symlink"?Q.realpath(K):K;if(B==="missing"||q===null)throw Error(`Cannot resolve path component: ${K}`);Y=q}return Y}function EM($,J){return $.endsWith("/")||$.endsWith("\\")?`${$}${J}`:`${$}${AM}${J}`}function SM($){return PM($).root}function CM($){let J=process.platform==="win32"?/[\\/]+/:/\/+/;return $.split(J)}function w6($,J){if(G2($))return;let Q=J.flatMap((Y)=>uK(Y));if(!Q[0])return;let X=uK(mK($)?$:fM(Q[0],$))[0];if(!X)return;return Q.some((Y)=>lK(X,Y))?X:void 0}function uK($){try{let J=TM($);return wM(J).isDirectory()?[J]:[]}catch{return[]}}function lK($,J){let Q=vM(J,$);return Q===""||Q!==".."&&!Q.startsWith(`..${hM}`)&&!mK(Q)}var r0="Command could not be safely analyzed (strict mode). Simplify the command and retry, or ask the user to verify.",P0="Command exceeds maximum recursion depth and cannot be safely analyzed. Flatten the nesting and retry.",pK="CC Safety Net could not validate the command because its structure exceeds safe analysis limits.",v6="CC Safety Net failed closed because command analysis failed unexpectedly. This is not caused by your command. Report it to the user.";function dK($){let{reason:J,command:Q,segment:X,toolName:Y}=$,W=$.maxLen??200,K=$.redact??((q)=>q),B=`BLOCKED by CC Safety Net
|
|
7
7
|
|
|
8
8
|
Reason: ${K(J)}`;if($.ruleId)B+=`
|