cc-safety-net 2.0.4 → 2.0.5
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 +89 -88
- package/dist/chunks/{index-xvfhq21r.js → index-bmvm3x9s.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 +3 -3
|
@@ -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.5
|
|
3
3
|
// @bun
|
|
4
4
|
var NO=Object.defineProperty;var FO=($)=>$;function VO($,J){this[$]=FO.bind(null,J)}var B2=($,J)=>{for(var Q in J)NO($,Q,{get:J[Q],enumerable:!0,configurable:!0,set:VO.bind(J,Q)})};import{randomBytes as ZM}from"crypto";import{appendFileSync as LM,mkdirSync as OM}from"fs";import{homedir as MM,userInfo as NM}from"os";import{isAbsolute as FM,join as IJ}from"path";var _O=[/\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 R0($){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 DO(J)}function DO($){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 _O)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 eO,readFileSync as wK,rmdirSync as $M,statSync as SK,unlinkSync as JM,utimesSync as QM,writeFileSync as XM}from"fs";import{dirname as YM,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 yO}from"os";import{dirname as l0,isAbsolute as xO,join as p0,relative as uO,resolve as P0,sep as mO}from"path";import{closeSync as zO,constants as OK,fstatSync as IO,fsyncSync as AE,lstatSync as MK,mkdirSync as EE,openSync as jO,readdirSync as SE,readFileSync as RO,realpathSync as b6,renameSync as CE,rmdirSync as TE,statSync as bO,unlinkSync as wE,writeFileSync as vE}from"fs";import{isAbsolute as NK,join as FK,normalize as PO,parse as AO,relative as LJ,resolve as OJ,sep as MJ}from"path";var EO=Symbol("PolicyFilesystemScope"),SO=Symbol("PolicyFilesystemTarget"),CO=OK.O_NOFOLLOW??0;class W1 extends Error{constructor($){super(`Unable to access ${$} filesystem safely.`);this.name="PolicyFilesystemError"}}function m0($,J){return{[EO]:!0,root:OJ($),label:J}}function VK($,J){let Q=PO(J);if(J===""||NK(J)||Q===".."||Q.startsWith(`..${MJ}`))throw new W1($.label);return{[SO]:!0,scope:$,relativePath:Q,path:FK($.root,Q)}}function b0($,J){let Q=LJ($.root,OJ(J));return VK($,Q)}function A6($,J="rules policy"){let Q=OJ($),X=AO(Q).dir;return VK(m0(X,J),LJ(X,Q))}function q2($){try{if(!P6($,!1).exists)return null;let Q=jO($.path,OK.O_RDONLY|CO);try{let X=IO(Q);if(!X.isFile())throw new W1($.scope.label);let Y=RO(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{zO(Q)}}catch(J){vO($.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=TO($.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);wO(X,b6(K),$.scope.label)}return{exists:!0}}function TO($){if(!DK($.root))return null;if(!bO($.root).isDirectory())throw new W1($.label);return b6($.root)}function wO($,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(fO(J)&&J.code==="ENOENT")return null;throw J}}function vO($,J){if(J instanceof W1)throw J;throw new W1($)}function fO($){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 hO=/^[A-Za-z0-9._-]+$/,kO=".cc-safety-net/rules".replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),gO="rulebook.json".replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),IK=new RegExp(`^${kO}/(${Y0.source.slice(1,-1)})/${gO}$`);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||!hO.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",lO="rule.lock";var PK=".cc-safety-net",pO="rules",RK="cache",cO="CC_SAFETY_NET_HOME",c0="`cc-safety-net rule sync`";function dO($){return P0($??process.cwd(),FJ)}function rO($){return p0(dO($),bK)}function U2($){return $?.userConfigDir??($?.userConfigPath?l0($.userConfigPath):p0(iO(),pO))}function iO(){let $=process.env[cO];return $?P0($):p0(yO(),PK)}function oO($){return p0(U2($),bK)}function n4($){return p0(l0($),lO)}function AK($){let J=$.userConfigPath??oO($),Q=$.projectConfigPath??rO($.cwd),X=nO(J,$),Y=sO(Q,$);return{userConfigPath:J,projectConfigPath:Q,userLockPath:n4(J),projectLockPath:n4(Q),userScope:X,projectScope:Y,userConfigTarget:b0(X,J),projectConfigTarget:b0(Y,Q),userLockTarget:b0(X,n4(J)),projectLockTarget:b0(Y,n4(Q))}}function nO($,J){let Q=J.userConfigPath?l0(l0(P0(J.userConfigPath))):l0(P0(J.userConfigDir??U2(J)));return m0(Q,"user policy")}function sO($,J){let Q=P0(J.cwd??process.cwd()),X=P0($),Y=uO(Q,X);if(Y!==".."&&!Y.startsWith(`..${mO}`)&&!xO(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(tO(J),"rulebooks",`${aO($)}--${Q.slice(0,12)}`,NJ)}function _J($,J){let Q=J;return{cacheConfigDir:$,cwd:J.cwd,global:Q.global}}function aO($){return($.kind==="github"&&$.display_ref?`${$.owner}/${$.repo}#${$.display_ref}/${$.name}`:$.spec).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"rulebook"}function tO($){let J=$?.cacheConfigDir??U2($),Q=$;if(Q&&!Q.global&&Q.cwd&&P0(J)===P0(Q.cwd))return p0(P0(Q.cwd),PK,RK);return p0(l0(J),RK)}var zJ=86400000,WM=".last-prune",KM=/^\d{4}-\d{2}$/,BM=/^((\d{4}-\d{2})-\d{2})-.+\.jsonl$/,CK=($)=>Math.floor($/zJ);function qM($){try{let J=l2(YM(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($,WM),Y=SK(X,{throwIfNoEntry:!1})?.mtimeMs;if(Y!==void 0&&CK(Y)===CK(Q))return;let W=Q-qM()*zJ,K=new Date(Q).toISOString().slice(0,7);for(let B of DJ($)){if(B.isDirectory()){UM(l2($,B.name),W,K);continue}if(B.isFile()&&B.name.endsWith(".jsonl"))GM(l2($,B.name),W)}XM(X,"",{mode:384}),QM(X,Q/1000,Q/1000)}catch{}}function UM($,J,Q){for(let X of DJ($)){if(!X.isDirectory()||!KM.test(X.name))continue;let Y=l2($,X.name);for(let W of DJ(Y)){if(!W.isFile())continue;let K=BM.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 GM($,J){try{let Q=EK($);if(Q.mtimeMs>=J)return;let X=wK($,"utf-8").split(`
|
|
5
|
-
`).filter((Y)=>Y.trim()).map(HM);if(X.length===0)return;if(X.some((Y)=>Y===void 0||Y>=J))return;if(EK($).mtimeMs!==Q.mtimeMs)return;fK($)}catch{}}function HM($){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 eO($,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function fK($){try{JM($)}catch{}}function TK($){try{$M($)}catch{}}var VM="2.0.
|
|
5
|
+
`).filter((Y)=>Y.trim()).map(HM);if(X.length===0)return;if(X.some((Y)=>Y===void 0||Y>=J))return;if(EK($).mtimeMs!==Q.mtimeMs)return;fK($)}catch{}}function HM($){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 eO($,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function fK($){try{JM($)}catch{}}function TK($){try{$M($)}catch{}}var VM="2.0.5",_M=1e4,DM=2000,zM=256,IM=32768;function jM($){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 RM($){return($??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function jJ($,J,Q,X,Y,W={}){let K=jM($);if(!K)return;let B=W.homeDir??hK();if(!B)return;let q=bM(B);if(!q)return;try{let U=(W.now??(()=>new Date))().toISOString(),G=T6(R0(J),_M),H=T6(R0(Q),DM),L=W.toolName?T6(R0(W.toolName),zM):void 0,Z=Y===null?void 0:T6(R0(Y),IM),O=IJ(q,RM(Z?.value??null),U.slice(0,7));OM(O,{recursive:!0,mode:448});let M=IJ(O,`${U.slice(0,10)}-${K}.jsonl`),V={ts:U,id:(W.createId??(()=>ZM(8).toString("hex")))(),v:VM,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};LM(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=$||MM()||NM().homedir;return J&&FM(J)?J:null}function bM($=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 vM,statSync as fM}from"fs";import{isAbsolute as mK,relative as hM,resolve as kM,sep as gM}from"path";import{dirname as PM,isAbsolute as AM,parse as EM,sep as SM}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=AM(J)?TM(J):"",Y=X||$;for(let W of wM(X?J.slice(X.length):J)){if(W===""||W===".")continue;if(W===".."){Y=PM(Y);continue}let K=CM(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 CM($,J){return $.endsWith("/")||$.endsWith("\\")?`${$}${J}`:`${$}${SM}${J}`}function TM($){return EM($).root}function wM($){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($)?$:kM(Q[0],$))[0];if(!X)return;return Q.some((Y)=>lK(X,Y))?X:void 0}function uK($){try{let J=vM($);return fM(J).isDirectory()?[J]:[]}catch{return[]}}function lK($,J){let Q=hM(J,$);return Q===""||Q!==".."&&!Q.startsWith(`..${gM}`)&&!mK(Q)}var r0="Command could not be safely analyzed (strict mode). Simplify the command and retry, or ask the user to verify.",A0="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+=`
|