cc-safety-net 2.5.0 → 2.5.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/README.md +14 -2
- package/dist/amp/cc-safety-net/index.ts +2 -2
- package/dist/bin/hook.js +1 -1
- package/dist/chunks/{index-mrn9mahg.js → index-3rm5n91g.js} +1 -1
- package/dist/chunks/{index-yya83mcj.js → index-w2aadm3e.js} +1 -1
- package/dist/cli.js +31 -31
- package/dist/deepseek-harness/index.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
package/README.md
CHANGED
|
@@ -24,6 +24,18 @@ CC Safety Net (Coding CLI Safety Net) blocks destructive commands and access to
|
|
|
24
24
|
> [!NOTE]
|
|
25
25
|
> **[Full documentation →](https://ccsafetynet.com/docs)** covers installation, configuration, reference material, guides, and the security model. This README is the short version.
|
|
26
26
|
|
|
27
|
+
## How it works
|
|
28
|
+
|
|
29
|
+
<p align="center">
|
|
30
|
+
<picture>
|
|
31
|
+
<source media="(prefers-color-scheme: dark)" srcset="./.github/assets/how-it-works-dark.svg">
|
|
32
|
+
<source media="(prefers-color-scheme: light)" srcset="./.github/assets/how-it-works-light.svg">
|
|
33
|
+
<img alt="An AI coding agent tries to run a command or open a file. CC Safety Net checks what it would actually do before it runs. Safe calls such as git status run normally; dangerous ones such as git reset --hard never run, and the agent is told why." src="./.github/assets/how-it-works-light.svg" width="720">
|
|
34
|
+
</picture>
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
Details: [How It Works](https://ccsafetynet.com/docs/guides/how-it-works).
|
|
38
|
+
|
|
27
39
|
## Supported coding CLIs
|
|
28
40
|
|
|
29
41
|
CC Safety Net supports the coding agent CLIs below on Windows, macOS, and Linux. Automated tests cover the analyzer and some Windows integrations. Windows support for the remaining CLIs is best effort and has not been tested.
|
|
@@ -47,7 +59,7 @@ CC Safety Net supports the coding agent CLIs below on Windows, macOS, and Linux.
|
|
|
47
59
|
<td align="center"><a href="https://ccsafetynet.com/docs/installation#kimi-code-installation"><img alt="Kimi Code" src="./.github/assets/kimi-cli.png" height="32"><br>Kimi Code</a></td>
|
|
48
60
|
<td align="center"><a href="https://ccsafetynet.com/docs/installation#openclaw-installation"><img alt="OpenClaw" src="./.github/assets/openclaw.png" height="32"><br>OpenClaw</a></td>
|
|
49
61
|
<td align="center"><a href="https://ccsafetynet.com/docs/installation#opencode-installation"><picture><source media="(prefers-color-scheme: dark)" srcset="./.github/assets/opencode-dark.svg"><img alt="OpenCode" src="./.github/assets/opencode-light.svg" height="32"></picture><br>OpenCode</a></td>
|
|
50
|
-
<td align="center"><a href="https://ccsafetynet.com/docs/installation#pi-installation"><
|
|
62
|
+
<td align="center"><a href="https://ccsafetynet.com/docs/installation#pi-installation"><img alt="Pi" src="./.github/assets/pi.svg" height="32"><br>Pi</a></td>
|
|
51
63
|
</tr>
|
|
52
64
|
</table>
|
|
53
65
|
|
|
@@ -90,7 +102,7 @@ Keep the `@latest` qualifier. A bare `cc-safety-net` spec can run an older copy
|
|
|
90
102
|
|
|
91
103
|
OpenCode integration supports v1.18.29+ and v2.0.6+. Run `npx -y cc-safety-net@latest install --opencode`; the installer selects the host's plugin commands. See [OpenCode compatibility](docs/opencode-compatibility.md) for v2 shell configuration and host limitations.
|
|
92
104
|
|
|
93
|
-
DeepSeek Harness integration installs as a profile plugin bundle into each DeepSeek Harness on the machine. `npx -y cc-safety-net@latest install --deepseek-harness` adds it to the Desktop app through Desktop's bundled `dsh` command; quit Desktop first, and open it once beforehand so it has a profile. It adds it to the web profile through `npx -y @deepseek-ai/dsh plugin --profile web add cc-safety-net
|
|
105
|
+
DeepSeek Harness integration installs as a profile plugin bundle into each DeepSeek Harness on the machine. `npx -y cc-safety-net@latest install --deepseek-harness` adds it to the Desktop app through Desktop's bundled `dsh` command; quit Desktop first, and open it once beforehand so it has a profile. Both profiles get the installer's own version, so pnpm's minimum release age cannot hold a new release back to an older one. It adds it to the web profile through `npx -y @deepseek-ai/dsh plugin --profile web add cc-safety-net@<version>`, which reuses the DeepSeek Harness that `npx @deepseek-ai/dsh web` or a global install runs and needs `pnpm` on your PATH. The installer looks for Desktop in its default location; if yours is elsewhere, add `cc-safety-net` from its Plugins page.
|
|
94
106
|
|
|
95
107
|
OpenClaw integration requires OpenClaw 2026.8.1+. The installer accepts the plugin's declared capabilities for you, and older OpenClaw releases reject that option.
|
|
96
108
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// cc-safety-net managed Amp plugin. Do not edit. Reinstall with: npx -y cc-safety-net install --amp
|
|
2
|
-
// version: 2.5.
|
|
2
|
+
// version: 2.5.1
|
|
3
3
|
// @bun
|
|
4
4
|
var Ei="CC Safety Net could not analyze the command because it exceeds safe analysis limits. Simplify or split the command and retry.",Ve="Command exceeds maximum recursion depth and cannot be safely analyzed. Flatten the nesting and retry.",Ln="CC Safety Net failed closed because command analysis failed unexpectedly. This is not caused by your command. Report it to the user.";var vi={errorCode:"path-canonicalization-limit",reason:"CC Safety Net could not analyze the command because it exceeds safe analysis limits. Simplify or split the command and retry."},Nn={errorCode:"structural-shell-syntax-limit",reason:"Command analysis exceeds CC Safety Net's derived-command work limit. Reduce nested or embedded command complexity and retry."},K=Object.freeze({realpathAttempts:{cap:16384,...vi},processedCandidateBytes:{cap:4194304,...vi},pathEnvironmentExpansion:{cap:64,...vi},recursionDepth:{cap:10,errorCode:"structural-shell-syntax-limit",reason:"Command exceeds maximum recursion depth and cannot be safely analyzed. Flatten the nesting and retry."},derivedTokens:{cap:16384,...Nn},trackedHeredocFiles:{cap:64,...Nn},controlFlowStates:{cap:64,...Nn},wrapperPeelIterations:{cap:20,...Nn},derivedCommandShape:Nn});class N extends Error{kind;name="AnalysisLimit";constructor(e){super(K[e].reason);this.kind=e}}function Se(){let e=new Map;return{counters:e,resolvedPaths:new Map,charge(t,n=1){let r=(e.get(t)??0)+n;if(e.set(t,r),r>K[t].cap)throw new N(t)}}}var Bp=[/\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 dt(e){return $p(e.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>"))}function $p(e){return Bp.reduce((t,n)=>t.replace(n,"<redacted>"),e.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>")).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>")}var Up={hard_stop:"Do not retry this operation or attempt any workaround (other tools, flags, or paths). Report the block to the user and continue with the rest of the task.",use_alternative:"Do not retry the blocked form. Continue the task using the safer alternative described above.",scope_down:"Retry with a narrower, explicit target as described above. Escalate to the user if the broad operation is truly required.",manual_only:"If this operation is truly needed, ask the user for explicit permission and have them run the command manually.",stop_and_explain:"Do not brute-force variants. Simplify or restructure the command so it can be analyzed, or report the block to the user."};function Hp(e){let t=e.maxLen??200,n=e.redact??((o)=>o),r=(o)=>o.length>t?`${o.slice(0,t)}...`:o;return[e.askUser?"CC Safety Net could not verify this command":"BLOCKED by CC Safety Net",`Reason: ${n(e.reason)}`,e.ruleId?`Rule: ${e.ruleId}`:void 0,e.toolName?`Tool: ${e.toolName}`:void 0,e.command?`Command: ${r(n(e.command))}`:void 0,e.segment&&e.segment!==e.command?`Segment: ${r(n(e.segment))}`:void 0,e.cwd?`Working directory: ${r(n(e.cwd))}`:void 0,e.configWarning?`Config warning: ${n(e.configWarning)}`:void 0,e.askUser?"Approve only if you expected this command.":Up[e.intent??"manual_only"]].filter((o)=>o!==void 0).join(`
|
|
5
5
|
|
|
@@ -45,5 +45,5 @@ var Ei="CC Safety Net could not analyze the command because it exceeds safe anal
|
|
|
45
45
|
`).replace(/\\t/g,"\t").replace(/\\r/g,"\r")}function L_(e,t,n,r,o,i){let s=ut(e);if(s.length===0||je(s[0]??"").toLowerCase()!=="xargs")return!1;let a=Kt(s),l=s.slice(a.childStart);if(l.length===0)return!1;if(a.replacementToken==="")return!1;let c=a.replacementToken,d=c===null?[...l,ol]:l.map((m)=>m.split(c).join(ol));return Ci(d,t,n,r,o,i).some((m)=>m.target.includes(ol))}function W_(e){let t=ut(e);if(t.length===0)return null;let n=je(t[0]??"").toLowerCase();if(!mr(n))return null;return G_(n,t.slice(1))?n:null}function G_(e,t){let n=ml(e);for(let r=0;r<t.length;r++){let o=t[r];if(o===void 0)break;if(hp.has(o)||Sp(e,o)||/^--(?:eval|exec)=/.test(o))return!1;if(o==="-")return!0;if(o.startsWith("-")){if(n==="python"&&o==="-m")return!1;if(A_.get(n)?.has(o))r++;continue}return!1}return!0}function ml(e){return/^python\d/.test(e)?"python":e}function F_(e){let t=[];for(let n of e){if(Ep(n))continue;let r=/^[A-Za-z_][A-Za-z0-9_]*=(.*)$/.exec(n);if(r===null)break;if(r[1]!==void 0&&r[1]!=="")t.push(r[1])}return t}var lp=/^(?:\$\{home\}|\$\{env:(?:userprofile|home)\}|~)(?=[\\/])/i;function z_(e,t){if(!t||!lp.test(e))return e;return`~${e.replace(lp,"").replace(/\\/g,"/")}`}function Xe(e,t){if(t==="--")return[];let n=[],r=t.indexOf("=");if(r>0&&r<t.length-1)n.push(t.slice(r+1));if(t.startsWith("-"))return n;if(e==="tar"&&/\.(?:tar|tgz|tar\.gz|zip)$/i.test(t))return n;if(e==="zip"&&/\.zip$/i.test(t))return n;return n.push(t),n}function B_(e){let t=-1,n=!1;for(let r=0;r<e.length;r++){let o=e[r]??"";if(!n&&o==="--"){n=!0;continue}if(n||!/^-(?:[A-Za-z]|-)/.test(o)){if(t===-1)t=r;continue}if(/^--(?:arg|argjson|argfile|rawfile|slurpfile)$/.test(o)){r+=2;continue}if(o==="--indent"||o==="-L"){r++;continue}if(o.startsWith("-L"))continue;if(/^-[srjcCMaSRnbehV]+$/.test(o)||/^--(?:slurp|raw-output0?|join-output|compact-output|color-output|monochrome-output|ascii-output|unbuffered|sort-keys|raw-input|null-input|binary|tab|seq|stream|stream-errors|exit-status|args|jsonargs|help|version|build-configuration)$/.test(o))continue;return e.flatMap((i)=>Xe("jq",i))}return e.flatMap((r,o)=>o===t?[]:Xe("jq",r))}function $_(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n]??"";if(r==="--"||!r.startsWith("-"))return[...t,...p_.has(r)?al("git",e.slice(n).map((i)=>/^-[aeinopqsv]+m$/.test(i)?"-m":i),g_):al("git",e.slice(n),h_)];if(t.push(...Xe("git",r)),!Ee.has(r))continue;let o=e[n+1];if(o===void 0)break;t.push(...r==="-c"&&o.includes("=")?[o.slice(o.indexOf("=")+1)]:Xe("git",o)),n++}return t}function al(e,t,n){let r=[];for(let o=0;o<t.length;o++){let i=t[o]??"";if(i==="--")return[...r,...t.slice(o).flatMap((s)=>Xe(e,s))];if(n.has(i)){o++;continue}if(i.includes("=")&&n.has(i.slice(0,i.indexOf("="))))continue;r.push(...Xe(e,i))}return r}function U_(e){return e.flatMap((t,n)=>{let r=j_(t);if(r!==null)return cp(r.flag,r.value);let o=H_(e[n-1]);return o===null?[]:cp(o,t)})}function cp(e,t){if(e==="-F"||e==="--form"){let n=t.indexOf("="),r=n===-1?t:t.slice(n+1);if(!r.startsWith("@")&&!r.startsWith("<"))return[];return il(r.slice(1).split(";")[0]??"")}if(e==="--data-urlencode"){let n=t.indexOf("@"),r=t.indexOf("=");if(n===-1||r!==-1&&r<n)return[];return il(t.slice(n+1))}return t.startsWith("@")?il(t.slice(1)):[]}function H_(e){if(e===void 0)return null;if(gp.has(e))return e;return/^-[A-Za-z]+[dF]$/.test(e)?`-${e.slice(-1)}`:null}function j_(e){let t=e.slice(0,2);if(e.length>2&&(t==="-d"||t==="-F"))return{flag:t,value:e.slice(2)};let n=e.indexOf("=");if(n===-1)return null;let r=e.slice(0,n);return gp.has(r)?{flag:r,value:e.slice(n+1)}:null}function il(e){return e===""||e==="-"?[]:[e]}function V_(e,t,n,r,o,i){let s=e.findIndex((l)=>l.startsWith("-")||l==="("||l==="!"||l===";"),a=[...e.slice(0,s===-1?e.length:s),...e.flatMap((l,c)=>l==="-files0-from"&&e[c+1]!==void 0?[e[c+1]??""]:[])];for(let l=0;l<e.length;l++){if(!i_.has(e[l]??""))continue;let c=e.slice(l+1),d=c.findIndex((f)=>s_.has(f)),m=d===-1?c:c.slice(0,d),u=Ci(m,t,n,r,o,i).map((f)=>f.target);if(a.push(...u.filter((f)=>f!=="{}")),!u.includes("{}"))continue;a.push(...e.slice(0,l).flatMap((f,p,g)=>{if(!l_.has(f))return[];let h=g[p+1];return h===void 0?[]:[h,h.replace(/^\*+\//,"").replace(/\/\*+$/g,"").replace(/^\*+/,"").replace(/\*+$/g,"")]}))}return a}function K_(e,t,n,r,o,i,s){let a=[];for(let l=0;l<t.length;l++){let c=t[l];if(c===void 0)break;if(hp.has(c)||Sp(e,c)){let m=t[l+1];if(m!==void 0)a.push(...hi(e,m,n,r,o,i,s)),l++;continue}let d=/^--(?:eval|exec)=(.*)$/.exec(c);if(d!==null&&d[1]!==void 0){a.push(...hi(e,d[1],n,r,o,i,s));continue}if(!c.startsWith("-"))a.push({target:c,cwd:i})}return a}function Sp(e,t){if(!t.startsWith("-")||t.startsWith("--")||t.length<=2)return!1;return d_.get(t[t.length-1]??"")?.has(ml(e))??!1}function q_(e,t,n,r,o,i){if(!e.includes("system"))return[];return Ca(e)?.commands.flatMap((s)=>On(t.getShellSyntax(s),t,n,r,o,i))??[]}function Y_(e){return Array.from(e.matchAll(/\bgetline(?:\s+[A-Za-z_][A-Za-z0-9_]*)?\s*<\s*"((?:\\.|[^"\\])*)"/g)).map((t)=>t[1]).filter((t)=>t!==void 0&&t!=="")}function Z_(e){let t=Array.from(e.matchAll(/(['"`])((?:\\.|(?!\1).)*)\1/g)).map((n)=>n[2]).filter((n)=>n!==void 0&&n!=="");return[...t,...t.flatMap(fl),...e.match(sl)??[]]}function hi(e,t,n,r,o,i,s){let a=(g)=>({target:g,cwd:i}),l=J_(t,X_(e));if(l.kind==="unmaskable")return Z_(t).map(a);let c=l.masked.match(op)!==null||l.literals.some((g)=>ip.test(l.masked.slice(0,g.start))),d=l.masked.match(w_)!==null||l.literals.some((g)=>__.test(l.masked.slice(0,g.start))),m=r.inlineLiteralsPresumedData===!0&&!ur.has(e),u=m&&!(nA(l.masked)||c||d)?[]:l.literals,f=m?Array.from(l.masked.matchAll(op),(g)=>{let h=g.index+g[0].length;return{start:h,end:Xs(l.masked,h)}}):[],p=!m||f.some((g)=>Js(l.masked,g.start))?l.literals:l.literals.filter((g)=>ip.test(l.masked.slice(0,g.start))||f.some((h)=>g.start>=h.start&&g.start<h.end));return[...u.map((g)=>g.text).filter((g)=>g!=="").map(a),...u.flatMap((g)=>fl(g.text)).map(a),...m?[]:l.literals.flatMap((g)=>g.text.match(sl)??[]).map(a),...c?p.flatMap((g)=>ul(g.text,n,r,o,i,s)??[a(g.text)]):[],...d?l.literals.flatMap((g)=>hi(e,g.text.replace(/\\(.)/g,(h,y)=>y==="n"?`
|
|
46
46
|
`:y),n,r,o,i,s)):[],...(l.masked.match(sl)??[]).map(a)]}function X_(e){let t=ml(e);if(t==="python")return"python";if(t==="osascript")return"opaque";return t==="node"||t==="bun"||t==="deno"?"javascript":"simple"}function J_(e,t){if(t==="opaque")return{kind:"unmaskable"};let n=e.split(""),r=[];for(let o=0;o<e.length;o++){let i=e[o]??"";if(t==="simple"&&(i==="`"||i==="%"||i==="<")){if(x_.test(e.slice(o)))return{kind:"unmaskable"}}let s=i==="'"||i==='"'||t==="javascript"&&i==="`"?i:null;if(s===null)continue;if(s==="`"&&tA(e,o))return{kind:"unmaskable"};let a=t==="python"?Q_(e,o):"",l=t==="python"&&e.startsWith(s.repeat(3),o)?s.repeat(3):s,c=o+l.length,d=eA(e,c,l);if(d===null)return{kind:"unmaskable"};let m=e.slice(c,d);if(/[fF]/.test(a)&&m.includes("{"))return{kind:"unmaskable"};if(t==="simple"&&s==='"'&&R_.test(m))return{kind:"unmaskable"};r.push({start:c,text:m});for(let u=o;u<d+l.length;u++)n[u]=" ";o=d+l.length-1}return{kind:"masked",masked:n.join(""),literals:r}}function Q_(e,t){return E_.exec(e.slice(Math.max(0,t-3),t))?.[1]??""}function eA(e,t,n){let r=n==="`",o=r||n.length===3;for(let i=t;i<e.length;i++){let s=e[i];if(s==="\\"){i++;continue}if(r&&s==="$"&&e[i+1]==="{")return null;if(!o&&(s===`
|
|
47
47
|
`||s==="\r"))return null;if(e.startsWith(n,i))return i}return null}function tA(e,t){for(let n=t-1;n>=0;n--){let r=e[n];if(!r||/\s/.test(r))continue;return/[\w$\])]/.test(r)}return!1}function nA(e){for(let t of e.matchAll(/[A-Za-z_$][A-Za-z0-9_$]*/g)){let n=t[0],r=t.index;if(c_.has(n.toLowerCase()))return!0;let o=n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[_$\s]+/).map((i)=>i.toLowerCase());if(!o.some((i)=>u_.has(i)))continue;if(o.length>1)return!0;if(rA(e,r)===".")return!0;if(oA(e,r+n.length)==="(")return!0}return!1}function rA(e,t){for(let n=t-1;n>=0;n--)if(!/\s/.test(e[n]??""))return e[n];return}function oA(e,t){for(let n=t;n<e.length;n++)if(!/\s/.test(e[n]??""))return e[n];return}function iA(e,t,n,r,o,i){return uA(e).flatMap((s)=>{let a=t.getShellSyntax(s);if(a.status==="invalid")return[];return[...On(a,t,{...n,displayOperandsAreCapturedOutput:!0},r,o,i),...sA(a,r)?aA(a,r).map((l)=>({target:l,cwd:o})):[]]})}function sA(e,t){let n=Mo(e);for(let r=0;r<n.length;r++){let o=n[r];if(o?.kind!=="word"||je(ot(o.text,t)).toLowerCase()!=="base64")continue;for(let i=r+1;i<n.length;i++){let s=n[i];if(s?.kind==="operator")break;if(s?.kind!=="word")continue;let a=ot(s.text,t);if(a==="--decode"||!a.startsWith("--")&&a.startsWith("-")&&/[dD]/.test(a))return!0}}return!1}function aA(e,t){return Mo(e).flatMap((n)=>n.kind==="word"?[ot(n.text,t)]:n.kind==="redirection"&&n.target?[ot(n.target,t)]:[]).flatMap(fl)}function fl(e){let t=cA(e);if(t===null)return[];let n=Buffer.from(t,"base64").toString("utf8");if(n===""||lA(n))return[];return Buffer.from(n,"utf8").toString("base64").replace(/=+$/g,"")===t.replace(/=+$/g,"")?[n]:[]}function lA(e){return Array.from(e).some((t)=>{let n=t.charCodeAt(0);return n<32||n===127})}function cA(e){if(e.length<8||!/^[A-Za-z0-9+/_-]+={0,2}$/.test(e))return null;if(/=/.test(e.replace(/=+$/g,"")))return null;let t=e.replace(/=+$/g,"");if(t.length%4===1)return null;return`${t.replace(/-/g,"+").replace(/_/g,"/")}${"=".repeat((4-t.length%4)%4)}`}function uA(e){let t=[],n={inSingle:!1,inDouble:!1,escaped:!1};for(let r=0;r<e.length;r++){let o=e[r];if(!o)break;if(Kn(o,n))continue;if(vp(e,r,n)){let i=dA(e,r+1);if(i!==null)t.push(i.body),r=i.endIndex;continue}if(!n.inSingle&&o==="`"){let i=mA(e,r);if(i!==null)t.push(i.body),r=i.endIndex}}return t}function dA(e,t){let n={inSingle:!1,inDouble:!1,escaped:!1},r=1;for(let o=t+1;o<e.length;o++){let i=e[o];if(!i)break;if(Kn(i,n))continue;if(vp(e,o,n)){r++,o++;continue}if(!n.inSingle&&!n.inDouble&&i===")"){if(r--,r===0)return{body:e.slice(t+1,o),endIndex:o}}}return null}function mA(e,t){let n=!1;for(let r=t+1;r<e.length;r++){let o=e[r];if(!o)break;if(n){n=!1;continue}if(o==="\\"){n=!0;continue}if(o==="`")return{body:e.slice(t+1,r),endIndex:r}}return null}function vp(e,t,n){return!n.inSingle&&e[t]==="$"&&e[t+1]==="("&&e[t+2]!=="("}function fA(e){let t=[],n=[],r=!1,o=!1,i=!1;for(let l=0;l<e.length;l++){let c=e[l];if(c===void 0)break;if(!i&&c==="--"){i=!0;continue}if(i){n.push(c);continue}let d=/^--([^=]+)(?:=(.*))?$/.exec(c);if(d!==null){let m=d[1]??"",u=d[2];if(m===y_)o=!0;if(b_.has(m))r=!0;if(u!==void 0){if(m===rp)t.push(u);continue}if(v_.has(m)){let f=e[l+1];if(m===rp&&f!==void 0)t.push(f);l++}continue}if(c.startsWith("-")&&c.length>1){let m=c.slice(1),u="",f="";for(let g=0;g<m.length;g++){let h=m[g]??"";if(C_.has(h))r=!0;if(S_.has(h)){u=h,f=m.slice(g+1);break}}if(u==="")continue;if(f.length>0){if(u===np)t.push(f);continue}let p=e[l+1];if(u===np&&p!==void 0)t.push(p);l++;continue}n.push(c)}let a=!r&&!o?n.slice(1):n;return[...t,...a]}function ut(e){let t=e.findIndex((n)=>!Ep(n)&&!/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(n));return t===-1?[]:e.slice(t)}function Ep(e){return e==="env"||e==="command"||e==="builtin"||e==="sudo"}var pA=new Set(["id_rsa.pub","id_ed25519.pub","id_ecdsa.pub"]),gA=".env.",hA=new Set([".env.example",".env.sample",".env.template",".env.defaults"]),yA=[".env.example.",".env.sample."];function CA(e){let t;try{t=new URL(e.trim())}catch{return!1}return t.protocol!=="file:"&&t.host!==""}function bA(e){return e.length>0&&!/\s/.test(e)}function ll(e,t,n,r){let o=xp(e,t,n,r);return o!==""&&n.paths.entryKind(o)!=="missing"}function xp(e,t,n,r){try{return kr(e,t,n,r)}catch(o){if(o instanceof N)throw o;return""}}var SA=new Set(["node_modules","__pycache__"]),vA=[["vendor","bundle"],["vendor","cache"]];function EA(e,t,n,r,o){if(CA(e))return null;let i=Ze(e,t,r,o);if(!i)return null;let s=U(i.split("/").pop()??""),a=U(i),l=()=>bA(s)||ll(e,t,r,o);if(hA.has(s)||yA.some((u)=>s.startsWith(u)))return null;let c=U(PA(e,t,r,o));for(let u of ms){let f=`~/${u.suffixParts.join("/")}`;if((dp(a,f)||dp(c,f))&&ct(u.id,n))return u.id}let d=xA(i,t,n,r,o);if(d)return d;if(pA.has(s))return null;for(let u of ds)if(s===u.basename&&ct(u.id,n))return u.id;if(s.startsWith(gA)&&ct(Zr.id,n)&&l())return Zr.id;for(let u of fs)if(s.length>u.prefix.length&&s.startsWith(u.prefix)){let f=s.slice(u.prefix.length)[0];if((f==="-"||f==="_")&&ct(u.id,n)&&l())return u.id}for(let u of ps)if(s.length>u.prefix.length&&s.startsWith(u.prefix)){if(s.slice(u.prefix.length)===u.suffix&&ct(u.id,n))return u.id}if(_A(a))return null;if(!s.includes(".")&&qn.pattern.test(s)&&ct(qn.id,n))return qn.id;let m=AA(s,n);if(m)return m;return null}function xA(e,t,n,r,o){return Xr.find((i)=>{if(!ct(i.id,n))return!1;switch(i.id){case"secret.cli.claude-code":return F(e,V(r.env.get("CLAUDE_CONFIG_DIR"),"~/.claude",t,r,o),[".credentials.json"]);case"secret.cli.claude-code.config":{let s=U(e).split("/");return F(e,V(r.env.get("CLAUDE_CONFIG_DIR"),"~/.claude",t,r,o),["settings.json","settings.local.json"])||Ir(e,"~/.claude.json",t,r,o)||s.at(-1)==="settings.local.json"&&s.at(-2)===".claude"||s.at(-1)===".mcp.json"}case"secret.cli.antigravity":return F(e,Ze("~/.gemini/config",t,r,o),["hooks.json","mcp_config.json"]);case"secret.cli.codex":{let s=V(r.env.get("CODEX_HOME"),"~/.codex",t,r,o);return F(e,s,["auth.json",".credentials.json"])||Tr(e,s,["secrets",".sandbox-secrets"])}case"secret.cli.codex.config":{let s=V(r.env.get("CODEX_HOME"),"~/.codex",t,r,o),a=U(e).split("/").at(-1)??"";return F(e,s,["config.toml"])||a.endsWith(".config.toml")&&F(e,s,[a])}case"secret.cli.gemini":return F(e,ue(V(r.env.get("GEMINI_CLI_HOME"),"~",t,r,o),".gemini"),["oauth_creds.json","mcp-oauth-tokens.json","a2a-oauth-tokens.json","gemini-credentials.json"]);case"secret.cli.gemini.config":{let s=U(e).split("/"),a=r.env.get("GEMINI_CLI_SYSTEM_SETTINGS_PATH"),l=r.env.get("ProgramData")?[ue(V(r.env.get("ProgramData"),"",t,r,o),"gemini-cli")]:[];return F(e,ue(V(r.env.get("GEMINI_CLI_HOME"),"~",t,r,o),".gemini"),["settings.json","google_accounts.json"])||s.at(-1)==="settings.json"&&s.at(-2)===".gemini"||(a?.trim()?Ir(e,a,t,r,o):!1)||["/Library/Application Support/GeminiCli","/etc/gemini-cli",...l].some((c)=>F(e,Ze(c,t,r,o),["settings.json"]))}case"secret.cli.copilot-cli":{let s=V(r.env.get("COPILOT_HOME"),"~/.copilot",t,r,o);return F(e,s,["config.json"])||Tr(e,s,["mcp-oauth-config","mcp-secrets"])}case"secret.cli.copilot-cli.config":return F(e,V(r.env.get("COPILOT_HOME"),"~/.copilot",t,r,o),["mcp-config.json"]);case"secret.cli.kimi-code":{let s=V(r.env.get("KIMI_CODE_HOME"),"~/.kimi-code",t,r,o),a=V(r.env.get("KIMI_SHARE_DIR"),"~/.kimi",t,r,o);return F(e,s,["server.token"])||Tr(e,s,["credentials"])||Tr(e,a,["credentials","mcp-oauth"])}case"secret.cli.kimi-code.config":{let s=["config.toml","mcp.json"],a=U(e).split("/");return a.at(-1)==="mcp.json"&&a.at(-2)===".kimi-code"||F(e,V(r.env.get("KIMI_CODE_HOME"),"~/.kimi-code",t,r,o),s)||F(e,V(r.env.get("KIMI_SHARE_DIR"),"~/.kimi",t,r,o),[...s,"config.json","config.json.bak"])}case"secret.cli.opencode":{let s=ue(V(r.env.get("XDG_DATA_HOME"),"~/.local/share",t,r,o),"opencode"),a=U(e).split("/").at(-1)??"",l=r.env.get("OPENCODE_DB")?.trim(),c=l&&l!==":memory:"?[l,`${l}-wal`,`${l}-shm`]:[];return F(e,s,["auth.json","mcp-auth.json"])||/^opencode(-.+)?\.db(-wal|-shm)?$/.test(a)&&F(e,s,[a])||c.some((d)=>Ir(e,d,t,r,o))}case"secret.cli.opencode.config":{let s=ue(V(r.env.get("XDG_CONFIG_HOME"),"~/.config",t,r,o),"opencode"),a=r.env.get("ProgramData")?[ue(V(r.env.get("ProgramData"),"",t,r,o),"opencode")]:[],l=["opencode.json","opencode.jsonc"],c=r.env.get("OPENCODE_CONFIG");return l.includes(U(e).split("/").at(-1)??"")||F(e,s,["config.json"])||(c?.trim()?Ir(e,c,t,r,o):!1)||["/Library/Application Support/opencode","/etc/opencode",...a].some((d)=>F(e,Ze(d,t,r,o),l))}case"secret.cli.pi":return F(e,V(r.env.get("PI_CODING_AGENT_DIR"),"~/.pi/agent",t,r,o),["auth.json"]);case"secret.cli.pi.config":return F(e,V(r.env.get("PI_CODING_AGENT_DIR"),"~/.pi/agent",t,r,o),["models.json"]);case"secret.cli.amp":{let s=Ze("~",t,r,o);return[ue(V(r.env.get("XDG_DATA_HOME"),"~/.local/share",t,r,o),"amp"),ue(s,".local","share","amp")].some((l)=>F(e,l,["secrets.json"]))||Tr(e,ue(s,".amp"),["oauth"])}case"secret.cli.amp.config":{let s=["settings.json","settings.jsonc"],a=[ue(V(r.env.get("XDG_CONFIG_HOME"),"~/.config",t,r,o),"amp"),ue(Ze("~",t,r,o),".config","amp")],l=U(e).split("/"),c=r.env.get("AMP_SETTINGS_FILE");return a.some((d)=>F(e,d,s))||l.at(-2)===".amp"&&s.includes(l.at(-1)??"")||(c?.trim()?Ir(e,c,t,r,o):!1)}case"secret.cli.cursor":{let s=ue(V(r.env.get("XDG_CONFIG_HOME"),"~/.config",t,r,o),"cursor"),a=ue(V(r.env.get("CURSOR_DATA_DIR"),"~/.cursor",t,r,o),"projects");return F(e,Ze("~/.cursor",t,r,o),["auth.json"])||F(e,s,["auth.json"])||U(e).split("/").at(-1)==="mcp-auth.json"&&Jt(U(e),U(a))}case"secret.cli.cursor.config":{let s=U(e).split("/");return s.at(-1)==="mcp.json"&&s.at(-2)===".cursor"}case"secret.cli.grok-build":return F(e,V(r.env.get("GROK_HOME"),"~/.grok",t,r,o),["auth.json","mcp_credentials.json"]);case"secret.cli.grok-build.config":{let s=U(e).split("/");return s.at(-1)==="config.toml"&&s.at(-2)===".grok"||F(e,V(r.env.get("GROK_HOME"),"~/.grok",t,r,o),["config.toml","managed_config.toml","requirements.toml"])||F(e,Ze("/etc/grok",t,r,o),["managed_config.toml","requirements.toml"])}default:return!1}})?.id??null}var up=new WeakMap;function V(e,t,n,r,o){let i=up.get(o)??new Map;up.set(o,i);let s=`${n}\x00${e??""}\x00${t}`,a=i.get(s);if(a!==void 0)return a;let l=Ze(e?.trim()?e:t,n,r,o);return i.set(s,l),l}function F(e,t,n){return n.some((r)=>Rp(e,ue(t,r)))}function Tr(e,t,n){return n.some((r)=>Jt(U(e),U(ue(t,r))))}function Ir(e,t,n,r,o){return Rp(e,Ze(t,n,r,o))}function Rp(e,t){return U(e)===U(t)}function ue(e,...t){return He([e,...t].filter(Boolean).join("/"))}function RA(e,t,n,r,o,i){if(n.length===0)return!1;let s=U(kr(e,t,o,i));return n.some((a)=>Jt(s,U(kr(a,r,o,i))))}function wA(e,t,n,r,o,i){if(n.length===0)return!1;let s=U(kr(e,t,o,i));if(!s)return!1;let a=o.env.get("HOME")??o.home,l=a?He(L(ve(a),o.paths,i)):"",c=U(l),d=o.env.get("CC_SAFETY_NET_HOME"),m=U(d?He(L(yi(ve(d)),o.paths,i)):l&&He(L(`${l}/.cc-safety-net`,o.paths,i)));if(m&&Jt(s,m))return!1;return n.some((u)=>{let f=bs(u);if(f&&mp.basename(s)!==U(f.name))return!1;let p=U(kr(f?.root??u,r,o,i));if(!p)return!1;if(c&&(c===p||c.startsWith(p.endsWith("/")?p:`${p}/`)))return!1;return Jt(s,p)&&!(f&&s===p)})}function _A(e){let t=e.split("/");return t.some((n)=>SA.has(n))||vA.some(([n,r])=>t.some((o,i)=>o===n&&t[i+1]===r))}function AA(e,t){let n=e.lastIndexOf("."),r=n>0&&n<e.length-1?e.slice(n+1):"";if(r==="")return null;for(let o of gs)if(r===o.extension&&ct(o.id,t))return o.id;for(let o of hs)if(o.pattern.test(r)&&ct(o.id,t))return o.id;return null}function U(e){return e.toLowerCase()}function ct(e,t){return!t?.disabledRules?.includes(e)}function Ze(e,t,n,r){let{home:o,normalized:i}=pl(e,n,r);if(!i)return"";if(!o)return i;let s=gl(i,o),a=gi(s)?s:He(yi(t,s)),l=He(L(a,n.paths,r));if(!Jt(l,o)){if(gi(s))return l;return l===a?i:l}let c=l.slice(o.length);return c?`~${c}`:"~"}function dp(e,t){return e===t||e.startsWith(`${t}/`)}function PA(e,t,n,r){let{home:o,normalized:i}=pl(e,n,r);if(!i||!o)return"";let s=gl(i,o),a=mp.normalize(gi(s)?s:He(yi(t,s))),l=He(ve(n.env.get("HOME")??n.home)),c=(u)=>process.platform==="win32"?u.toLowerCase():u,d=[o,l].find((u)=>u!==""&&Jt(c(a),c(u)));if(d===void 0)return"";let m=a.slice(d.length);return m?`~${m}`:"~"}function kr(e,t,n,r){let{home:o,normalized:i}=pl(e,n,r);if(!i)return"";let s=o?gl(i,o):i;return He(L(gi(s)?s:yi(t,s),n.paths,r))}function pl(e,t,n){let r=t.env.get("HOME")??t.home,o=r?He(L(ve(r),t.paths,n)):"",i=He(ve(TA(ot(e,t))));return{home:o,normalized:i}}function TA(e){if(!e.trim().toLowerCase().startsWith("file:"))return e;try{return n_(e)}catch{return e}}function gl(e,t){if(e==="~")return t;if(e.startsWith("~/"))return ue(t,e.slice(2));return e}function IA(e){if(process.platform==="win32")return!0;return t_.parse(e).root.length>1}function He(e){let t=e.trim(),n=(t.includes("\\")&&IA(t)?t.replace(/\\/g,"/"):t).replace(/\/{2,}/g,"/").replace(/^\.\//,"");if(n==="/")return n;return n.replace(/\/+$/g,"")}function Jt(e,t){return e===t||e.startsWith(t.endsWith("/")?t:`${t}/`)}function je(e){return e.split(/[\\/]/).pop()?.replace(/\.exe$/i,"")??e}class Qt extends Error{stage;evaluation;name="GuardEvaluationError";constructor(e,t,n){super(`CC Safety Net ${e} dependency failed`,{cause:n});this.stage=e;this.evaluation=t}}var kA={findPolicyMutation:Qf,findGitMetadataMutation:wd,resolveGitMetadata:MA,loadPolicySnapshot:mu,findSensitiveTarget:yp,analyzeCommand:Hf,getModes:zi},OA=/^(?:\S*\/)?(?:ba|da|z|k)?sh(?:\s+-[A-Za-z-]*)*$/;function wp(e,t){let n={...kA,...t.dependencies},r=LA(e),o=Or(e)?e.command:r,i=_t("policy-protection",o,()=>fr(e)),s=ge(i,"input-candidate"),a=ge(i,"declared-command");if(Or(e)&&e.command?.trim()&&a?.program.status==="limited")return{stage:"command-analysis",decision:{kind:"deny",reason:Ve,intent:"stop_and_explain",evidence:{command:e.command,segment:e.command}}};if(s?.program.status==="limited")return{stage:"command-validation",decision:{kind:"deny",reason:jd,intent:"stop_and_explain"}};let l=Se(),c=_t("policy-protection",o,()=>n.resolveGitMetadata([e.context.executionCwd,e.context.configCwd],t.environment)),d=_t("policy-protection",o,()=>n.findPolicyMutation(i,t.environment,l));if(d){let C=o??d.target;return{stage:"policy-protection",decision:{kind:"deny",reason:Jf,intent:"hard_stop",evidence:{command:C,segment:d.target}}}}let m=_t("policy-protection",o,()=>qf(i,t.environment,l));if(m){let C=o??m.target;return{stage:"policy-protection",decision:{kind:"deny",reason:Kf,intent:"hard_stop",evidence:{command:C,segment:m.target}}}}let u=_t("policy-protection",o,()=>n.findGitMetadataMutation(i,c,t.environment,l));if(u){let C=o??u.target;return{stage:"policy-protection",decision:{kind:"deny",reason:ke,intent:"hard_stop",evidence:{command:C,segment:u.target}}}}let f=_t("config-load",o,()=>n.loadPolicySnapshot(t.environment,{...t.policyOptions,cwd:e.context.configCwd})),p=f.policy,g=n.getModes(p,t.environment.env),h={level:g.effectiveLevel,...DA(f)},y=p.secretProtection.enabled===!1?null:_t("secret-protection",o,()=>n.findSensitiveTarget(i,p.secretProtection,t.environment,l,{strict:Or(e)||s?.program.dialect==="powershell"?g.strict:void 0}));if(y){let C=o??y.target;return{stage:"secret-protection",...h,decision:{kind:"deny",reason:fp,intent:"hard_stop",ruleId:y.ruleId,evidence:{command:C,segment:y.target}}}}if(!Or(e))return{stage:"non-command",...h,decision:{kind:"allow"}};if(!e.command||e.command.trim()==="")return{...hl("command-validation",o),...h};let b=_t("command-analysis",o,()=>jf(()=>n.analyzeCommand(e.command,{cwd:e.context.executionCwd,shell:e.route.shell,policySnapshot:f,environment:t.environment,protectedGitMetadata:c,effectiveCapabilities:g.capabilities,strict:g.strict,paranoidRm:g.paranoidRm,paranoidInterpreters:g.paranoidInterpreters,worktreeMode:g.worktreeMode,budget:l,...t.trace?{trace:t.trace}:{}},NA(i),i.store),e.command,t.trace));if(b.decision){let C=!g.strict&&(b.decision.ruleId==="raw-text.dangerous-command"||b.decision.reason===yr&&!OA.test(b.decision.evidence?.segment??"")&&Te(e.command)===null);return{stage:"command-analysis",...h,..."errorCode"in b?{errorCode:b.errorCode}:{},decision:C?{...b.decision,unverifiedByStandardMode:!0}:b.decision}}return{stage:"command-analysis",...h,decision:{kind:"allow"}}}function MA(e,t){let n=[...new Set(e.filter((r)=>typeof r==="string"&&r!==""))].flatMap((r)=>t.gitMetadata(r)??[]);if(n.length===0)return null;return Object.freeze({entries:Object.freeze([...new Set(n.flatMap((r)=>r.entries))]),markerFiles:Object.freeze([...new Set(n.flatMap((r)=>r.markerFiles))]),directories:Object.freeze([...new Set(n.flatMap((r)=>r.directories))]),hooksDirectories:Object.freeze([...new Set(n.flatMap((r)=>r.hooksDirectories))])})}function DA(e){if(e.state==="ready")return{};return{configFallback:{reason:e.reason}}}function NA(e){return ge(e,"declared-command")?.program}function LA(e){try{return zn(e.input)}catch(t){let n=Or(e)?e.command:void 0;throw new Qt("policy-protection",hl("policy-protection",t instanceof Qe?void 0:n,t),t)}}function _t(e,t,n){try{return n()}catch(r){throw new Qt(e,hl(e,r instanceof Qe?void 0:t,r),r)}}function hl(e,t,n){let r=n instanceof N||n instanceof Fe;return{stage:e,decision:{kind:"deny",reason:r?Ei:Ln,intent:"stop_and_explain",...t?{evidence:{command:t,segment:t}}:{}}}}function Or(e){return e.route.kind==="command"}import{appendFileSync as YA,mkdirSync as ZA}from"fs";import{isAbsolute as XA,join as bl}from"path";import{lstatSync as Ap,readdirSync as WA,readFileSync as GA,rmdirSync as FA,statSync as Pp,unlinkSync as zA,utimesSync as BA,writeFileSync as $A}from"fs";import{join as Mr}from"path";function _p(e,t={}){return so(ln(e,t),e.home).policy.audit.retention_days}var Cl=86400000,UA=".last-prune",HA=/^\d{4}-\d{2}$/,jA=/^((\d{4}-\d{2})-\d{2})-.+\.jsonl$/,Tp=(e)=>Math.floor(e/Cl);function kp(e,t,n=()=>new Date){try{let r=n().getTime();if(!Pp(t,{throwIfNoEntry:!1})?.isDirectory())return;let o=Mr(t,UA),i=Pp(o,{throwIfNoEntry:!1})?.mtimeMs;if(i!==void 0&&Tp(i)===Tp(r))return;let s=r-_p(e)*Cl,a=new Date(r).toISOString().slice(0,7);for(let l of yl(t)){if(l.isDirectory()){VA(Mr(t,l.name),s,a);continue}if(l.isFile()&&l.name.endsWith(".jsonl"))KA(Mr(t,l.name),s)}$A(o,"",{mode:384}),BA(o,r/1000,r/1000)}catch{}}function VA(e,t,n){for(let r of yl(e)){if(!r.isDirectory()||!HA.test(r.name))continue;let o=Mr(e,r.name);for(let i of yl(o)){if(!i.isFile())continue;let s=jA.exec(i.name);if(!s||s[2]!==r.name)continue;let a=Date.parse(`${s[1]}T00:00:00.000Z`)+Cl;if(!Number.isFinite(a)||a>=t)continue;Op(Mr(o,i.name))}if(r.name!==n)Ip(o)}Ip(e)}function KA(e,t){try{let n=Ap(e);if(n.mtimeMs>=t)return;let r=GA(e,"utf-8").split(`
|
|
48
|
-
`).filter((o)=>o.trim()).map(qA);if(r.length===0)return;if(r.some((o)=>o===void 0||o>=t))return;if(Ap(e).mtimeMs!==n.mtimeMs)return;Op(e)}catch{}}function qA(e){try{let t=JSON.parse(e).ts,n=typeof t==="string"?Date.parse(t):Number.NaN;return Number.isFinite(n)?n:void 0}catch{return}}function yl(e){try{return WA(e,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function Op(e){try{zA(e)}catch{}}function Ip(e){try{FA(e)}catch{}}var JA="2.5.
|
|
48
|
+
`).filter((o)=>o.trim()).map(qA);if(r.length===0)return;if(r.some((o)=>o===void 0||o>=t))return;if(Ap(e).mtimeMs!==n.mtimeMs)return;Op(e)}catch{}}function qA(e){try{let t=JSON.parse(e).ts,n=typeof t==="string"?Date.parse(t):Number.NaN;return Number.isFinite(n)?n:void 0}catch{return}}function yl(e){try{return WA(e,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function Op(e){try{zA(e)}catch{}}function Ip(e){try{FA(e)}catch{}}var JA="2.5.1",QA=1e4,eP=2000,tP=256,nP=32768;function rP(e){let t=e.trim();if(!t)return null;let n=t.replace(/[^A-Za-z0-9_.-]+/g,"_");if(n=n.replace(/^[._-]+|[._-]+$/g,"").slice(0,128),!n||n==="."||n==="..")return null;return n}function oP(e){return(e??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function Sl(e,t,n,r,o,i,s={}){let a=rP(t);if(!a)return;let l=sP(e);if(!l)return;try{let c=(s.now??(()=>new Date))().toISOString(),d=bi(dt(n),s.failureStage?Number.POSITIVE_INFINITY:QA),m=bi(dt(r),eP),u=s.toolName?bi(dt(s.toolName),tP):void 0,f=i===null?void 0:bi(dt(i),nP),p=bl(l,oP(f?.value??null),c.slice(0,7));ZA(p,{recursive:!0,mode:448});let g=bl(p,`${c.slice(0,10)}-${a}.jsonl`),h={ts:c,id:(s.createId??$i)(),v:JA,sessionId:a,decision:s.decision??"deny",agent:s.agent,shape:s.shape,level:s.level,configFallback:s.configFallback,toolName:u?.value,command:d.value,segment:m.value,...d.truncated||m.truncated||u?.truncated||f?.truncated?{truncated:!0}:{},reason:o,ruleId:s.ruleId,intent:s.intent,failureStage:s.failureStage,errorCode:s.errorCode,cwd:f?.value??null};YA(g,`${JSON.stringify(h)}
|
|
49
49
|
`,{encoding:"utf-8",mode:384}),kp(e,l,s.now)}catch{}}function bi(e,t){return{value:e.slice(0,t),truncated:e.length>t}}function iP(e){let t=e.env.get("CC_SAFETY_NET_AUDIT_HOME");if(e.env.get("NODE_ENV")==="test"&&!t)return null;let n=t||e.home;return n&&XA(n)?n:null}function sP(e){let t=iP(e);return t?bl(t,".cc-safety-net","logs"):null}function Dp(e,t,n,r=!0,o){if(t.decision.kind==="allow"){if(!n||e.route.kind!=="command")return;let a=Mp(e);return{decision:"allow",command:a,segment:a,reason:"allowed",cwd:e.context.executionCwd,toolName:e.toolName,level:t.level,...t.configFallback?{configFallback:!0}:{}}}let i=t.decision.evidence,s=i?.command??(r?Mp(e):"");return{decision:"deny",command:s,segment:i?.segment??s,reason:t.decision.reason,cwd:e.context.executionCwd,toolName:e.toolName,level:t.level,...t.configFallback?{configFallback:!0}:{},ruleId:t.decision.ruleId,intent:t.decision.intent,failureStage:o?.stage,errorCode:o?.errorCode}}function Mp(e){return"command"in e?e.command??"":""}function Np(e,t,n,r){if(!t)return;let o;try{o=n()}catch{return}if(typeof o!=="string"||!o.trim())return;Sl(e,o,t.command,t.segment,t.reason,t.cwd,{decision:t.decision,agent:r.agent,shape:r.shape,level:t.level,configFallback:t.configFallback,toolName:t.toolName,ruleId:t.ruleId,intent:t.intent,failureStage:t.failureStage,errorCode:t.errorCode})}function Lp(e,t,n,r){let o;try{o=n()}catch{return}if(typeof o!=="string"||!o.trim())return;Sl(e,o,t.command??"",t.segment??t.command??"",t.reason,r.cwd??null,{decision:"deny",agent:r.agent,shape:r.shape,toolName:r.toolName??t.toolName,ruleId:t.ruleId,intent:t.intent})}function Gp(e,t,n){try{let r=wp(t,{environment:e,...n.guard});return Wp(e,t,r,n),r}catch(r){if(!(r instanceof Qt))throw r;throw Wp(e,t,r.evaluation,n,!(r.cause instanceof Qe),{stage:r.stage,errorCode:aP(r.cause)}),r}}function Wp(e,t,n,r,o=!0,i){Np(e,Dp(t,n,r.guard?.auditAllowed??!1,o,i),r.audit.getSessionId,{agent:r.audit.agent,shape:r.audit.shape})}function aP(e){if(e instanceof N)return K[e.kind].errorCode;if(e instanceof Qe)return"tool-input-limit";if(e instanceof Fe)return"structural-shell-syntax-limit";return"unexpected-error"}function en(e,t={}){return{malformed:!0,denial:Wn(t),cwd:e}}function vl(e,t){return{malformed:!0,denial:xi(e,t),cwd:e.cwd}}function Fp(e,t={}){return(n,r)=>{try{return lP(n,r,e,t)}catch(o){return console.error("CC Safety Net error:",o),e.block(Wn())}}}function lP(e,t,n,r){let o=rc();if(n.cancelled?.(t))return n.block(Wn());let i=n.extract(e,t,o.paths);if(!i)return n.allow;let s=()=>n.getSessionId(e,t);if("malformed"in i)return Lp(o,i.denial,s,{agent:n.agent,toolName:i.denial.toolName,cwd:i.cwd}),n.block(i.denial);let a=(l,c)=>{let d=Rl(l,{includeEvidence:c});return d?n.block(d):n.allow};try{let l=Gp(o,i,{guard:{auditAllowed:oc(o.env),policyOptions:r.policyOptions,dependencies:r.guardDependencies},audit:{agent:n.agent,getSessionId:s}});return a(l,!0)}catch(l){if(!(l instanceof Qt))throw l;if(It(ee.debug,o.env))console.error(`CC Safety Net debug: ${n.debugLabel} analysis failed: ${_l(l.cause)}`);return a(l.evaluation,n.includeEvidenceOnError(i))}}var cP={agent:"amp",debugLabel:"amp tool.call",extract:(e,t,n)=>dP(e,t,n),getSessionId:(e)=>pP(e),allow:{action:"allow"},block:(e)=>gP(e),includeEvidenceOnError:(e)=>e.route.kind==="command"},zp=uP();function uP(e={}){return Fp(cP,e)}function dP(e,t,n){if(!e||typeof e!=="object")return en(null);let r=e;if(typeof r.tool!=="string"||r.tool.trim()==="")return en(null);if(!r.input||typeof r.input!=="object")return en(null,{toolName:r.tool});let o=mP(t);if(!o)return en(null,{toolName:r.tool});let i=Yl(".",[o],n);if(!i)return vl({directory:"session",problem:"unusable",cwd:o},{toolName:r.tool});let s=fP(t,e);if(!s.ok)return en(i,{toolName:r.tool});if(!s.command)return nn(r.tool,r.input,{kind:Ai(r.tool)},{configCwd:i,executionCwd:i},null);if(typeof s.command.command!=="string"||s.command.command.trim()==="")return en(i,{toolName:r.tool});let a=typeof s.command.dir==="string"?s.command.dir:".",l=Zl(a,i,n);if(!l)return vl({directory:"requested",problem:"unusable",cwd:a},{command:s.command.command,toolName:r.tool});return nn(r.tool,r.input,{kind:"command",shell:"posix"},{configCwd:i,executionCwd:l},s.command.command)}function mP(e){let t=e.system.workspaceRoot;if(!t)return;try{let n=e.helpers.filePathFromURI(t);return typeof n==="string"&&n.trim()!==""?n:void 0}catch{return}}function fP(e,t){try{return{ok:!0,command:e.helpers.shellCommandFromToolCall(t)}}catch{return{ok:!1}}}function pP(e){if(!e||typeof e!=="object")return;let t=e.thread?.id;return typeof t==="string"&&t.trim()!==""?t:void 0}function gP(e){return{action:"reject-and-continue",message:wl(e)}}function hP(e){e.on("tool.call",(t)=>zp(t,e))}export{hP as default};
|
package/dist/bin/hook.js
CHANGED
|
@@ -43,5 +43,5 @@ var gg=["-h","--help"];function io(e,t){let n=Object.entries(e.booleans??{}),r=O
|
|
|
43
43
|
`).replace(/\\t/g,"\t").replace(/\\r/g,"\r")}function l_(e,t,n,r,o,i){let s=Mt(e);if(s.length===0||ct(s[0]??"").toLowerCase()!=="xargs")return!1;let a=gn(s),l=s.slice(a.childStart);if(l.length===0)return!1;if(a.replacementToken==="")return!1;let c=a.replacementToken,u=c===null?[...l,El]:l.map((m)=>m.split(c).join(El));return ji(u,t,n,r,o,i).some((m)=>m.target.includes(El))}function c_(e){let t=Mt(e);if(t.length===0)return null;let n=ct(t[0]??"").toLowerCase();if(!Wr(n))return null;return u_(n,t.slice(1))?n:null}function u_(e,t){let n=kl(e);for(let r=0;r<t.length;r++){let o=t[r];if(o===void 0)break;if(Pp.has(o)||Op(e,o)||/^--(?:eval|exec)=/.test(o))return!1;if(o==="-")return!0;if(o.startsWith("-")){if(n==="python"&&o==="-m")return!1;if(Qw.get(n)?.has(o))r++;continue}return!1}return!0}function kl(e){return/^python\d/.test(e)?"python":e}function d_(e){let t=[];for(let n of e){if(Dp(n))continue;let r=/^[A-Za-z_][A-Za-z0-9_]*=(.*)$/.exec(n);if(r===null)break;if(r[1]!==void 0&&r[1]!=="")t.push(r[1])}return t}var Sp=/^(?:\$\{home\}|\$\{env:(?:userprofile|home)\}|~)(?=[\\/])/i;function m_(e,t){if(!t||!Sp.test(e))return e;return`~${e.replace(Sp,"").replace(/\\/g,"/")}`}function ht(e,t){if(t==="--")return[];let n=[],r=t.indexOf("=");if(r>0&&r<t.length-1)n.push(t.slice(r+1));if(t.startsWith("-"))return n;if(e==="tar"&&/\.(?:tar|tgz|tar\.gz|zip)$/i.test(t))return n;if(e==="zip"&&/\.zip$/i.test(t))return n;return n.push(t),n}function f_(e){let t=-1,n=!1;for(let r=0;r<e.length;r++){let o=e[r]??"";if(!n&&o==="--"){n=!0;continue}if(n||!/^-(?:[A-Za-z]|-)/.test(o)){if(t===-1)t=r;continue}if(/^--(?:arg|argjson|argfile|rawfile|slurpfile)$/.test(o)){r+=2;continue}if(o==="--indent"||o==="-L"){r++;continue}if(o.startsWith("-L"))continue;if(/^-[srjcCMaSRnbehV]+$/.test(o)||/^--(?:slurp|raw-output0?|join-output|compact-output|color-output|monochrome-output|ascii-output|unbuffered|sort-keys|raw-input|null-input|binary|tab|seq|stream|stream-errors|exit-status|args|jsonargs|help|version|build-configuration)$/.test(o))continue;return e.flatMap((i)=>ht("jq",i))}return e.flatMap((r,o)=>o===t?[]:ht("jq",r))}function p_(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n]??"";if(r==="--"||!r.startsWith("-"))return[...t,...zw.has(r)?wl("git",e.slice(n).map((i)=>/^-[aeinopqsv]+m$/.test(i)?"-m":i),Hw):wl("git",e.slice(n),Bw)];if(t.push(...ht("git",r)),!Ne.has(r))continue;let o=e[n+1];if(o===void 0)break;t.push(...r==="-c"&&o.includes("=")?[o.slice(o.indexOf("=")+1)]:ht("git",o)),n++}return t}function wl(e,t,n){let r=[];for(let o=0;o<t.length;o++){let i=t[o]??"";if(i==="--")return[...r,...t.slice(o).flatMap((s)=>ht(e,s))];if(n.has(i)){o++;continue}if(i.includes("=")&&n.has(i.slice(0,i.indexOf("="))))continue;r.push(...ht(e,i))}return r}function g_(e){return e.flatMap((t,n)=>{let r=y_(t);if(r!==null)return vp(r.flag,r.value);let o=h_(e[n-1]);return o===null?[]:vp(o,t)})}function vp(e,t){if(e==="-F"||e==="--form"){let n=t.indexOf("="),r=n===-1?t:t.slice(n+1);if(!r.startsWith("@")&&!r.startsWith("<"))return[];return xl(r.slice(1).split(";")[0]??"")}if(e==="--data-urlencode"){let n=t.indexOf("@"),r=t.indexOf("=");if(n===-1||r!==-1&&r<n)return[];return xl(t.slice(n+1))}return t.startsWith("@")?xl(t.slice(1)):[]}function h_(e){if(e===void 0)return null;if(Ap.has(e))return e;return/^-[A-Za-z]+[dF]$/.test(e)?`-${e.slice(-1)}`:null}function y_(e){let t=e.slice(0,2);if(e.length>2&&(t==="-d"||t==="-F"))return{flag:t,value:e.slice(2)};let n=e.indexOf("=");if(n===-1)return null;let r=e.slice(0,n);return Ap.has(r)?{flag:r,value:e.slice(n+1)}:null}function xl(e){return e===""||e==="-"?[]:[e]}function C_(e,t,n,r,o,i){let s=e.findIndex((l)=>l.startsWith("-")||l==="("||l==="!"||l===";"),a=[...e.slice(0,s===-1?e.length:s),...e.flatMap((l,c)=>l==="-files0-from"&&e[c+1]!==void 0?[e[c+1]??""]:[])];for(let l=0;l<e.length;l++){if(!Iw.has(e[l]??""))continue;let c=e.slice(l+1),u=c.findIndex((f)=>Ow.has(f)),m=u===-1?c:c.slice(0,u),d=ji(m,t,n,r,o,i).map((f)=>f.target);if(a.push(...d.filter((f)=>f!=="{}")),!d.includes("{}"))continue;a.push(...e.slice(0,l).flatMap((f,p,g)=>{if(!Dw.has(f))return[];let h=g[p+1];return h===void 0?[]:[h,h.replace(/^\*+\//,"").replace(/\/\*+$/g,"").replace(/^\*+/,"").replace(/\*+$/g,"")]}))}return a}function b_(e,t,n,r,o,i,s){let a=[];for(let l=0;l<t.length;l++){let c=t[l];if(c===void 0)break;if(Pp.has(c)||Op(e,c)){let m=t[l+1];if(m!==void 0)a.push(...Ui(e,m,n,r,o,i,s)),l++;continue}let u=/^--(?:eval|exec)=(.*)$/.exec(c);if(u!==null&&u[1]!==void 0){a.push(...Ui(e,u[1],n,r,o,i,s));continue}if(!c.startsWith("-"))a.push({target:c,cwd:i})}return a}function Op(e,t){if(!t.startsWith("-")||t.startsWith("--")||t.length<=2)return!1;return Ww.get(t[t.length-1]??"")?.has(kl(e))??!1}function S_(e,t,n,r,o,i){if(!e.includes("system"))return[];return La(e)?.commands.flatMap((s)=>Qn(t.getShellSyntax(s),t,n,r,o,i))??[]}function v_(e){return Array.from(e.matchAll(/\bgetline(?:\s+[A-Za-z_][A-Za-z0-9_]*)?\s*<\s*"((?:\\.|[^"\\])*)"/g)).map((t)=>t[1]).filter((t)=>t!==void 0&&t!=="")}function E_(e){let t=Array.from(e.matchAll(/(['"`])((?:\\.|(?!\1).)*)\1/g)).map((n)=>n[2]).filter((n)=>n!==void 0&&n!=="");return[...t,...t.flatMap(Il),...e.match(Rl)??[]]}function Ui(e,t,n,r,o,i,s){let a=(g)=>({target:g,cwd:i}),l=R_(t,x_(e));if(l.kind==="unmaskable")return E_(t).map(a);let c=l.masked.match(hp)!==null||l.literals.some((g)=>yp.test(l.masked.slice(0,g.start))),u=l.masked.match(Xw)!==null||l.literals.some((g)=>Jw.test(l.masked.slice(0,g.start))),m=r.inlineLiteralsPresumedData===!0&&!Nr.has(e),d=m&&!(P_(l.masked)||c||u)?[]:l.literals,f=m?Array.from(l.masked.matchAll(hp),(g)=>{let h=g.index+g[0].length;return{start:h,end:ha(l.masked,h)}}):[],p=!m||f.some((g)=>ya(l.masked,g.start))?l.literals:l.literals.filter((g)=>yp.test(l.masked.slice(0,g.start))||f.some((h)=>g.start>=h.start&&g.start<h.end));return[...d.map((g)=>g.text).filter((g)=>g!=="").map(a),...d.flatMap((g)=>Il(g.text)).map(a),...m?[]:l.literals.flatMap((g)=>g.text.match(Rl)??[]).map(a),...c?p.flatMap((g)=>Pl(g.text,n,r,o,i,s)??[a(g.text)]):[],...u?l.literals.flatMap((g)=>Ui(e,g.text.replace(/\\(.)/g,(h,y)=>y==="n"?`
|
|
44
44
|
`:y),n,r,o,i,s)):[],...(l.masked.match(Rl)??[]).map(a)]}function x_(e){let t=kl(e);if(t==="python")return"python";if(t==="osascript")return"opaque";return t==="node"||t==="bun"||t==="deno"?"javascript":"simple"}function R_(e,t){if(t==="opaque")return{kind:"unmaskable"};let n=e.split(""),r=[];for(let o=0;o<e.length;o++){let i=e[o]??"";if(t==="simple"&&(i==="`"||i==="%"||i==="<")){if(Yw.test(e.slice(o)))return{kind:"unmaskable"}}let s=i==="'"||i==='"'||t==="javascript"&&i==="`"?i:null;if(s===null)continue;if(s==="`"&&A_(e,o))return{kind:"unmaskable"};let a=t==="python"?w_(e,o):"",l=t==="python"&&e.startsWith(s.repeat(3),o)?s.repeat(3):s,c=o+l.length,u=__(e,c,l);if(u===null)return{kind:"unmaskable"};let m=e.slice(c,u);if(/[fF]/.test(a)&&m.includes("{"))return{kind:"unmaskable"};if(t==="simple"&&s==='"'&&Zw.test(m))return{kind:"unmaskable"};r.push({start:c,text:m});for(let d=o;d<u+l.length;d++)n[d]=" ";o=u+l.length-1}return{kind:"masked",masked:n.join(""),literals:r}}function w_(e,t){return qw.exec(e.slice(Math.max(0,t-3),t))?.[1]??""}function __(e,t,n){let r=n==="`",o=r||n.length===3;for(let i=t;i<e.length;i++){let s=e[i];if(s==="\\"){i++;continue}if(r&&s==="$"&&e[i+1]==="{")return null;if(!o&&(s===`
|
|
45
45
|
`||s==="\r"))return null;if(e.startsWith(n,i))return i}return null}function A_(e,t){for(let n=t-1;n>=0;n--){let r=e[n];if(!r||/\s/.test(r))continue;return/[\w$\])]/.test(r)}return!1}function P_(e){for(let t of e.matchAll(/[A-Za-z_$][A-Za-z0-9_$]*/g)){let n=t[0],r=t.index;if(Nw.has(n.toLowerCase()))return!0;let o=n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[_$\s]+/).map((i)=>i.toLowerCase());if(!o.some((i)=>Lw.has(i)))continue;if(o.length>1)return!0;if(T_(e,r)===".")return!0;if(k_(e,r+n.length)==="(")return!0}return!1}function T_(e,t){for(let n=t-1;n>=0;n--)if(!/\s/.test(e[n]??""))return e[n];return}function k_(e,t){for(let n=t;n<e.length;n++)if(!/\s/.test(e[n]??""))return e[n];return}function I_(e,t,n,r,o,i){return L_(e).flatMap((s)=>{let a=t.getShellSyntax(s);if(a.status==="invalid")return[];return[...Qn(a,t,{...n,displayOperandsAreCapturedOutput:!0},r,o,i),...O_(a,r)?M_(a,r).map((l)=>({target:l,cwd:o})):[]]})}function O_(e,t){let n=ci(e);for(let r=0;r<n.length;r++){let o=n[r];if(o?.kind!=="word"||ct(_t(o.text,t)).toLowerCase()!=="base64")continue;for(let i=r+1;i<n.length;i++){let s=n[i];if(s?.kind==="operator")break;if(s?.kind!=="word")continue;let a=_t(s.text,t);if(a==="--decode"||!a.startsWith("--")&&a.startsWith("-")&&/[dD]/.test(a))return!0}}return!1}function M_(e,t){return ci(e).flatMap((n)=>n.kind==="word"?[_t(n.text,t)]:n.kind==="redirection"&&n.target?[_t(n.target,t)]:[]).flatMap(Il)}function Il(e){let t=N_(e);if(t===null)return[];let n=Buffer.from(t,"base64").toString("utf8");if(n===""||D_(n))return[];return Buffer.from(n,"utf8").toString("base64").replace(/=+$/g,"")===t.replace(/=+$/g,"")?[n]:[]}function D_(e){return Array.from(e).some((t)=>{let n=t.charCodeAt(0);return n<32||n===127})}function N_(e){if(e.length<8||!/^[A-Za-z0-9+/_-]+={0,2}$/.test(e))return null;if(/=/.test(e.replace(/=+$/g,"")))return null;let t=e.replace(/=+$/g,"");if(t.length%4===1)return null;return`${t.replace(/-/g,"+").replace(/_/g,"/")}${"=".repeat((4-t.length%4)%4)}`}function L_(e){let t=[],n={inSingle:!1,inDouble:!1,escaped:!1};for(let r=0;r<e.length;r++){let o=e[r];if(!o)break;if(gr(o,n))continue;if(Mp(e,r,n)){let i=W_(e,r+1);if(i!==null)t.push(i.body),r=i.endIndex;continue}if(!n.inSingle&&o==="`"){let i=G_(e,r);if(i!==null)t.push(i.body),r=i.endIndex}}return t}function W_(e,t){let n={inSingle:!1,inDouble:!1,escaped:!1},r=1;for(let o=t+1;o<e.length;o++){let i=e[o];if(!i)break;if(gr(i,n))continue;if(Mp(e,o,n)){r++,o++;continue}if(!n.inSingle&&!n.inDouble&&i===")"){if(r--,r===0)return{body:e.slice(t+1,o),endIndex:o}}}return null}function G_(e,t){let n=!1;for(let r=t+1;r<e.length;r++){let o=e[r];if(!o)break;if(n){n=!1;continue}if(o==="\\"){n=!0;continue}if(o==="`")return{body:e.slice(t+1,r),endIndex:r}}return null}function Mp(e,t,n){return!n.inSingle&&e[t]==="$"&&e[t+1]==="("&&e[t+2]!=="("}function F_(e){let t=[],n=[],r=!1,o=!1,i=!1;for(let l=0;l<e.length;l++){let c=e[l];if(c===void 0)break;if(!i&&c==="--"){i=!0;continue}if(i){n.push(c);continue}let u=/^--([^=]+)(?:=(.*))?$/.exec(c);if(u!==null){let m=u[1]??"",d=u[2];if(m===$w)o=!0;if(jw.has(m))r=!0;if(d!==void 0){if(m===gp)t.push(d);continue}if(Kw.has(m)){let f=e[l+1];if(m===gp&&f!==void 0)t.push(f);l++}continue}if(c.startsWith("-")&&c.length>1){let m=c.slice(1),d="",f="";for(let g=0;g<m.length;g++){let h=m[g]??"";if(Uw.has(h))r=!0;if(Vw.has(h)){d=h,f=m.slice(g+1);break}}if(d==="")continue;if(f.length>0){if(d===pp)t.push(f);continue}let p=e[l+1];if(d===pp&&p!==void 0)t.push(p);l++;continue}n.push(c)}let a=!r&&!o?n.slice(1):n;return[...t,...a]}function Mt(e){let t=e.findIndex((n)=>!Dp(n)&&!/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(n));return t===-1?[]:e.slice(t)}function Dp(e){return e==="env"||e==="command"||e==="builtin"||e==="sudo"}var z_=new Set(["id_rsa.pub","id_ed25519.pub","id_ecdsa.pub"]),H_=".env.",B_=new Set([".env.example",".env.sample",".env.template",".env.defaults"]),$_=[".env.example.",".env.sample."];function U_(e){let t;try{t=new URL(e.trim())}catch{return!1}return t.protocol!=="file:"&&t.host!==""}function j_(e){return e.length>0&&!/\s/.test(e)}function _l(e,t,n,r){let o=Np(e,t,n,r);return o!==""&&n.paths.entryKind(o)!=="missing"}function Np(e,t,n,r){try{return ro(e,t,n,r)}catch(o){if(o instanceof N)throw o;return""}}var V_=new Set(["node_modules","__pycache__"]),K_=[["vendor","bundle"],["vendor","cache"]];function q_(e,t,n,r,o){if(U_(e))return null;let i=gt(e,t,r,o);if(!i)return null;let s=V(i.split("/").pop()??""),a=V(i),l=()=>j_(s)||_l(e,t,r,o);if(B_.has(s)||$_.some((d)=>s.startsWith(d)))return null;let c=V(eA(e,t,r,o));for(let d of Os){let f=`~/${d.suffixParts.join("/")}`;if((xp(a,f)||xp(c,f))&&Ot(d.id,n))return d.id}let u=Y_(i,t,n,r,o);if(u)return u;if(z_.has(s))return null;for(let d of Is)if(s===d.basename&&Ot(d.id,n))return d.id;if(s.startsWith(H_)&&Ot(Ao.id,n)&&l())return Ao.id;for(let d of Ms)if(s.length>d.prefix.length&&s.startsWith(d.prefix)){let f=s.slice(d.prefix.length)[0];if((f==="-"||f==="_")&&Ot(d.id,n)&&l())return d.id}for(let d of Ds)if(s.length>d.prefix.length&&s.startsWith(d.prefix)){if(s.slice(d.prefix.length)===d.suffix&&Ot(d.id,n))return d.id}if(J_(a))return null;if(!s.includes(".")&&yr.pattern.test(s)&&Ot(yr.id,n))return yr.id;let m=Q_(s,n);if(m)return m;return null}function Y_(e,t,n,r,o){return Po.find((i)=>{if(!Ot(i.id,n))return!1;switch(i.id){case"secret.cli.claude-code":return B(e,X(r.env.get("CLAUDE_CONFIG_DIR"),"~/.claude",t,r,o),[".credentials.json"]);case"secret.cli.claude-code.config":{let s=V(e).split("/");return B(e,X(r.env.get("CLAUDE_CONFIG_DIR"),"~/.claude",t,r,o),["settings.json","settings.local.json"])||no(e,"~/.claude.json",t,r,o)||s.at(-1)==="settings.local.json"&&s.at(-2)===".claude"||s.at(-1)===".mcp.json"}case"secret.cli.antigravity":return B(e,gt("~/.gemini/config",t,r,o),["hooks.json","mcp_config.json"]);case"secret.cli.codex":{let s=X(r.env.get("CODEX_HOME"),"~/.codex",t,r,o);return B(e,s,["auth.json",".credentials.json"])||to(e,s,["secrets",".sandbox-secrets"])}case"secret.cli.codex.config":{let s=X(r.env.get("CODEX_HOME"),"~/.codex",t,r,o),a=V(e).split("/").at(-1)??"";return B(e,s,["config.toml"])||a.endsWith(".config.toml")&&B(e,s,[a])}case"secret.cli.gemini":return B(e,be(X(r.env.get("GEMINI_CLI_HOME"),"~",t,r,o),".gemini"),["oauth_creds.json","mcp-oauth-tokens.json","a2a-oauth-tokens.json","gemini-credentials.json"]);case"secret.cli.gemini.config":{let s=V(e).split("/"),a=r.env.get("GEMINI_CLI_SYSTEM_SETTINGS_PATH"),l=r.env.get("ProgramData")?[be(X(r.env.get("ProgramData"),"",t,r,o),"gemini-cli")]:[];return B(e,be(X(r.env.get("GEMINI_CLI_HOME"),"~",t,r,o),".gemini"),["settings.json","google_accounts.json"])||s.at(-1)==="settings.json"&&s.at(-2)===".gemini"||(a?.trim()?no(e,a,t,r,o):!1)||["/Library/Application Support/GeminiCli","/etc/gemini-cli",...l].some((c)=>B(e,gt(c,t,r,o),["settings.json"]))}case"secret.cli.copilot-cli":{let s=X(r.env.get("COPILOT_HOME"),"~/.copilot",t,r,o);return B(e,s,["config.json"])||to(e,s,["mcp-oauth-config","mcp-secrets"])}case"secret.cli.copilot-cli.config":return B(e,X(r.env.get("COPILOT_HOME"),"~/.copilot",t,r,o),["mcp-config.json"]);case"secret.cli.kimi-code":{let s=X(r.env.get("KIMI_CODE_HOME"),"~/.kimi-code",t,r,o),a=X(r.env.get("KIMI_SHARE_DIR"),"~/.kimi",t,r,o);return B(e,s,["server.token"])||to(e,s,["credentials"])||to(e,a,["credentials","mcp-oauth"])}case"secret.cli.kimi-code.config":{let s=["config.toml","mcp.json"],a=V(e).split("/");return a.at(-1)==="mcp.json"&&a.at(-2)===".kimi-code"||B(e,X(r.env.get("KIMI_CODE_HOME"),"~/.kimi-code",t,r,o),s)||B(e,X(r.env.get("KIMI_SHARE_DIR"),"~/.kimi",t,r,o),[...s,"config.json","config.json.bak"])}case"secret.cli.opencode":{let s=be(X(r.env.get("XDG_DATA_HOME"),"~/.local/share",t,r,o),"opencode"),a=V(e).split("/").at(-1)??"",l=r.env.get("OPENCODE_DB")?.trim(),c=l&&l!==":memory:"?[l,`${l}-wal`,`${l}-shm`]:[];return B(e,s,["auth.json","mcp-auth.json"])||/^opencode(-.+)?\.db(-wal|-shm)?$/.test(a)&&B(e,s,[a])||c.some((u)=>no(e,u,t,r,o))}case"secret.cli.opencode.config":{let s=be(X(r.env.get("XDG_CONFIG_HOME"),"~/.config",t,r,o),"opencode"),a=r.env.get("ProgramData")?[be(X(r.env.get("ProgramData"),"",t,r,o),"opencode")]:[],l=["opencode.json","opencode.jsonc"],c=r.env.get("OPENCODE_CONFIG");return l.includes(V(e).split("/").at(-1)??"")||B(e,s,["config.json"])||(c?.trim()?no(e,c,t,r,o):!1)||["/Library/Application Support/opencode","/etc/opencode",...a].some((u)=>B(e,gt(u,t,r,o),l))}case"secret.cli.pi":return B(e,X(r.env.get("PI_CODING_AGENT_DIR"),"~/.pi/agent",t,r,o),["auth.json"]);case"secret.cli.pi.config":return B(e,X(r.env.get("PI_CODING_AGENT_DIR"),"~/.pi/agent",t,r,o),["models.json"]);case"secret.cli.amp":{let s=gt("~",t,r,o);return[be(X(r.env.get("XDG_DATA_HOME"),"~/.local/share",t,r,o),"amp"),be(s,".local","share","amp")].some((l)=>B(e,l,["secrets.json"]))||to(e,be(s,".amp"),["oauth"])}case"secret.cli.amp.config":{let s=["settings.json","settings.jsonc"],a=[be(X(r.env.get("XDG_CONFIG_HOME"),"~/.config",t,r,o),"amp"),be(gt("~",t,r,o),".config","amp")],l=V(e).split("/"),c=r.env.get("AMP_SETTINGS_FILE");return a.some((u)=>B(e,u,s))||l.at(-2)===".amp"&&s.includes(l.at(-1)??"")||(c?.trim()?no(e,c,t,r,o):!1)}case"secret.cli.cursor":{let s=be(X(r.env.get("XDG_CONFIG_HOME"),"~/.config",t,r,o),"cursor"),a=be(X(r.env.get("CURSOR_DATA_DIR"),"~/.cursor",t,r,o),"projects");return B(e,gt("~/.cursor",t,r,o),["auth.json"])||B(e,s,["auth.json"])||V(e).split("/").at(-1)==="mcp-auth.json"&&Sn(V(e),V(a))}case"secret.cli.cursor.config":{let s=V(e).split("/");return s.at(-1)==="mcp.json"&&s.at(-2)===".cursor"}case"secret.cli.grok-build":return B(e,X(r.env.get("GROK_HOME"),"~/.grok",t,r,o),["auth.json","mcp_credentials.json"]);case"secret.cli.grok-build.config":{let s=V(e).split("/");return s.at(-1)==="config.toml"&&s.at(-2)===".grok"||B(e,X(r.env.get("GROK_HOME"),"~/.grok",t,r,o),["config.toml","managed_config.toml","requirements.toml"])||B(e,gt("/etc/grok",t,r,o),["managed_config.toml","requirements.toml"])}default:return!1}})?.id??null}var Ep=new WeakMap;function X(e,t,n,r,o){let i=Ep.get(o)??new Map;Ep.set(o,i);let s=`${n}\x00${e??""}\x00${t}`,a=i.get(s);if(a!==void 0)return a;let l=gt(e?.trim()?e:t,n,r,o);return i.set(s,l),l}function B(e,t,n){return n.some((r)=>Lp(e,be(t,r)))}function to(e,t,n){return n.some((r)=>Sn(V(e),V(be(t,r))))}function no(e,t,n,r,o){return Lp(e,gt(t,n,r,o))}function Lp(e,t){return V(e)===V(t)}function be(e,...t){return lt([e,...t].filter(Boolean).join("/"))}function Z_(e,t,n,r,o,i){if(n.length===0)return!1;let s=V(ro(e,t,o,i));return n.some((a)=>Sn(s,V(ro(a,r,o,i))))}function X_(e,t,n,r,o,i){if(n.length===0)return!1;let s=V(ro(e,t,o,i));if(!s)return!1;let a=o.env.get("HOME")??o.home,l=a?lt(O(De(a),o.paths,i)):"",c=V(l),u=o.env.get("CC_SAFETY_NET_HOME"),m=V(u?lt(O(xe.resolve(De(u)),o.paths,i)):l&<(O(`${l}/.cc-safety-net`,o.paths,i)));if(m&&Sn(s,m))return!1;return n.some((d)=>{let f=Gs(d);if(f&&xe.posix.basename(s)!==V(f.name))return!1;let p=V(ro(f?.root??d,r,o,i));if(!p)return!1;if(c&&(c===p||c.startsWith(p.endsWith("/")?p:`${p}/`)))return!1;return Sn(s,p)&&!(f&&s===p)})}function J_(e){let t=e.split("/");return t.some((n)=>V_.has(n))||K_.some(([n,r])=>t.some((o,i)=>o===n&&t[i+1]===r))}function Q_(e,t){let n=e.lastIndexOf("."),r=n>0&&n<e.length-1?e.slice(n+1):"";if(r==="")return null;for(let o of Ns)if(r===o.extension&&Ot(o.id,t))return o.id;for(let o of Ls)if(o.pattern.test(r)&&Ot(o.id,t))return o.id;return null}function V(e){return e.toLowerCase()}function Ot(e,t){return!t?.disabledRules?.includes(e)}function gt(e,t,n,r){let{home:o,normalized:i}=Ol(e,n,r);if(!i)return"";if(!o)return i;let s=Ml(i,o),a=xe.isAbsolute(s)?s:lt(xe.resolve(t,s)),l=lt(O(a,n.paths,r));if(!Sn(l,o)){if(xe.isAbsolute(s))return l;return l===a?i:l}let c=l.slice(o.length);return c?`~${c}`:"~"}function xp(e,t){return e===t||e.startsWith(`${t}/`)}function eA(e,t,n,r){let{home:o,normalized:i}=Ol(e,n,r);if(!i||!o)return"";let s=Ml(i,o),a=xe.posix.normalize(xe.isAbsolute(s)?s:lt(xe.resolve(t,s))),l=lt(De(n.env.get("HOME")??n.home)),c=(d)=>process.platform==="win32"?d.toLowerCase():d,u=[o,l].find((d)=>d!==""&&Sn(c(a),c(d)));if(u===void 0)return"";let m=a.slice(u.length);return m?`~${m}`:"~"}function ro(e,t,n,r){let{home:o,normalized:i}=Ol(e,n,r);if(!i)return"";let s=o?Ml(i,o):i;return lt(O(xe.isAbsolute(s)?s:xe.resolve(t,s),n.paths,r))}function Ol(e,t,n){let r=t.env.get("HOME")??t.home,o=r?lt(O(De(r),t.paths,n)):"",i=lt(De(tA(_t(e,t))));return{home:o,normalized:i}}function tA(e){if(!e.trim().toLowerCase().startsWith("file:"))return e;try{return Rp.fileURLToPath(e)}catch{return e}}function Ml(e,t){if(e==="~")return t;if(e.startsWith("~/"))return be(t,e.slice(2));return e}function nA(e){if(process.platform==="win32")return!0;return xe.win32.parse(e).root.length>1}function lt(e){let t=e.trim(),n=(t.includes("\\")&&nA(t)?t.replace(/\\/g,"/"):t).replace(/\/{2,}/g,"/").replace(/^\.\//,"");if(n==="/")return n;return n.replace(/\/+$/g,"")}function Sn(e,t){return e===t||e.startsWith(t.endsWith("/")?t:`${t}/`)}function ct(e){return e.split(/[\\/]/).pop()?.replace(/\.exe$/i,"")??e}class vn extends Error{stage;evaluation;name="GuardEvaluationError";constructor(e,t,n){super(`CC Safety Net ${e} dependency failed`,{cause:n});this.stage=e;this.evaluation=t}}var rA={findPolicyMutation:dp,findGitMetadataMutation:Fd,resolveGitMetadata:iA,loadPolicySnapshot:ku,findSensitiveTarget:Tp,analyzeCommand:np,getModes:fs},oA=/^(?:\S*\/)?(?:ba|da|z|k)?sh(?:\s+-[A-Za-z-]*)*$/;function Wp(e,t){let n={...rA,...t.dependencies},r=lA(e),o=oo(e)?e.command:r,i=Zt("policy-protection",o,()=>Gr(e)),s=Pe(i,"input-candidate"),a=Pe(i,"declared-command");if(oo(e)&&e.command?.trim()&&a?.program.status==="limited")return{stage:"command-analysis",decision:{kind:"deny",reason:ut,intent:"stop_and_explain",evidence:{command:e.command,segment:e.command}}};if(s?.program.status==="limited")return{stage:"command-validation",decision:{kind:"deny",reason:tm,intent:"stop_and_explain"}};let l=ue(),c=Zt("policy-protection",o,()=>n.resolveGitMetadata([e.context.executionCwd,e.context.configCwd],t.environment)),u=Zt("policy-protection",o,()=>n.findPolicyMutation(i,t.environment,l));if(u){let C=o??u.target;return{stage:"policy-protection",decision:{kind:"deny",reason:up,intent:"hard_stop",evidence:{command:C,segment:u.target}}}}let m=Zt("policy-protection",o,()=>sp(i,t.environment,l));if(m){let C=o??m.target;return{stage:"policy-protection",decision:{kind:"deny",reason:ip,intent:"hard_stop",evidence:{command:C,segment:m.target}}}}let d=Zt("policy-protection",o,()=>n.findGitMetadataMutation(i,c,t.environment,l));if(d){let C=o??d.target;return{stage:"policy-protection",decision:{kind:"deny",reason:Ke,intent:"hard_stop",evidence:{command:C,segment:d.target}}}}let f=Zt("config-load",o,()=>n.loadPolicySnapshot(t.environment,{...t.policyOptions,cwd:e.context.configCwd})),p=f.policy,g=n.getModes(p,t.environment.env),h={level:g.effectiveLevel,...sA(f)},y=p.secretProtection.enabled===!1?null:Zt("secret-protection",o,()=>n.findSensitiveTarget(i,p.secretProtection,t.environment,l,{strict:oo(e)||s?.program.dialect==="powershell"?g.strict:void 0}));if(y){let C=o??y.target;return{stage:"secret-protection",...h,decision:{kind:"deny",reason:wp,intent:"hard_stop",ruleId:y.ruleId,evidence:{command:C,segment:y.target}}}}if(!oo(e))return{stage:"non-command",...h,decision:{kind:"allow"}};if(!e.command||e.command.trim()==="")return{...Dl("command-validation",o),...h};let b=Zt("command-analysis",o,()=>rp(()=>n.analyzeCommand(e.command,{cwd:e.context.executionCwd,shell:e.route.shell,policySnapshot:f,environment:t.environment,protectedGitMetadata:c,effectiveCapabilities:g.capabilities,strict:g.strict,paranoidRm:g.paranoidRm,paranoidInterpreters:g.paranoidInterpreters,worktreeMode:g.worktreeMode,budget:l,...t.trace?{trace:t.trace}:{}},aA(i),i.store),e.command,t.trace));if(b.decision){let C=!g.strict&&(b.decision.ruleId==="raw-text.dangerous-command"||b.decision.reason===Br&&!oA.test(b.decision.evidence?.segment??"")&&je(e.command)===null);return{stage:"command-analysis",...h,..."errorCode"in b?{errorCode:b.errorCode}:{},decision:C?{...b.decision,unverifiedByStandardMode:!0}:b.decision}}return{stage:"command-analysis",...h,decision:{kind:"allow"}}}function iA(e,t){let n=[...new Set(e.filter((r)=>typeof r==="string"&&r!==""))].flatMap((r)=>t.gitMetadata(r)??[]);if(n.length===0)return null;return Object.freeze({entries:Object.freeze([...new Set(n.flatMap((r)=>r.entries))]),markerFiles:Object.freeze([...new Set(n.flatMap((r)=>r.markerFiles))]),directories:Object.freeze([...new Set(n.flatMap((r)=>r.directories))]),hooksDirectories:Object.freeze([...new Set(n.flatMap((r)=>r.hooksDirectories))])})}function sA(e){if(e.state==="ready")return{};return{configFallback:{reason:e.reason}}}function aA(e){return Pe(e,"declared-command")?.program}function lA(e){try{return Dt(e.input)}catch(t){let n=oo(e)?e.command:void 0;throw new vn("policy-protection",Dl("policy-protection",t instanceof Se?void 0:n,t),t)}}function Zt(e,t,n){try{return n()}catch(r){throw new vn(e,Dl(e,r instanceof Se?void 0:t,r),r)}}function Dl(e,t,n){let r=n instanceof N||n instanceof rt;return{stage:e,decision:{kind:"deny",reason:r?Qi:sr,intent:"stop_and_explain",...t?{evidence:{command:t,segment:t}}:{}}}}function oo(e){return e.route.kind==="command"}var Ki=require("node:fs"),tr=require("node:path");var le=require("node:fs"),er=require("node:path");function Gp(e,t={}){return Wo(Tn(e,t),e.home).policy.audit.retention_days}var Ll=86400000,cA=".last-prune",uA=/^\d{4}-\d{2}$/,dA=/^((\d{4}-\d{2})-\d{2})-.+\.jsonl$/,Fp=(e)=>Math.floor(e/Ll);function Hp(e,t,n=()=>new Date){try{let r=n().getTime();if(!le.statSync(t,{throwIfNoEntry:!1})?.isDirectory())return;let o=er.join(t,cA),i=le.statSync(o,{throwIfNoEntry:!1})?.mtimeMs;if(i!==void 0&&Fp(i)===Fp(r))return;let s=r-Gp(e)*Ll,a=new Date(r).toISOString().slice(0,7);for(let l of Nl(t)){if(l.isDirectory()){mA(er.join(t,l.name),s,a);continue}if(l.isFile()&&l.name.endsWith(".jsonl"))fA(er.join(t,l.name),s)}le.writeFileSync(o,"",{mode:384}),le.utimesSync(o,r/1000,r/1000)}catch{}}function mA(e,t,n){for(let r of Nl(e)){if(!r.isDirectory()||!uA.test(r.name))continue;let o=er.join(e,r.name);for(let i of Nl(o)){if(!i.isFile())continue;let s=dA.exec(i.name);if(!s||s[2]!==r.name)continue;let a=Date.parse(`${s[1]}T00:00:00.000Z`)+Ll;if(!Number.isFinite(a)||a>=t)continue;Bp(er.join(o,i.name))}if(r.name!==n)zp(o)}zp(e)}function fA(e,t){try{let n=le.lstatSync(e);if(n.mtimeMs>=t)return;let r=le.readFileSync(e,"utf-8").split(`
|
|
46
|
-
`).filter((o)=>o.trim()).map(pA);if(r.length===0)return;if(r.some((o)=>o===void 0||o>=t))return;if(le.lstatSync(e).mtimeMs!==n.mtimeMs)return;Bp(e)}catch{}}function pA(e){try{let t=JSON.parse(e).ts,n=typeof t==="string"?Date.parse(t):Number.NaN;return Number.isFinite(n)?n:void 0}catch{return}}function Nl(e){try{return le.readdirSync(e,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function Bp(e){try{le.unlinkSync(e)}catch{}}function zp(e){try{le.rmdirSync(e)}catch{}}var gA="2.5.
|
|
46
|
+
`).filter((o)=>o.trim()).map(pA);if(r.length===0)return;if(r.some((o)=>o===void 0||o>=t))return;if(le.lstatSync(e).mtimeMs!==n.mtimeMs)return;Bp(e)}catch{}}function pA(e){try{let t=JSON.parse(e).ts,n=typeof t==="string"?Date.parse(t):Number.NaN;return Number.isFinite(n)?n:void 0}catch{return}}function Nl(e){try{return le.readdirSync(e,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function Bp(e){try{le.unlinkSync(e)}catch{}}function zp(e){try{le.rmdirSync(e)}catch{}}var gA="2.5.1",hA=1e4,yA=2000,CA=256,bA=32768;function SA(e){let t=e.trim();if(!t)return null;let n=t.replace(/[^A-Za-z0-9_.-]+/g,"_");if(n=n.replace(/^[._-]+|[._-]+$/g,"").slice(0,128),!n||n==="."||n==="..")return null;return n}function vA(e){return(e??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function Wl(e,t,n,r,o,i,s={}){let a=SA(t);if(!a)return;let l=xA(e);if(!l)return;try{let c=(s.now??(()=>new Date))().toISOString(),u=Vi(Ct(n),s.failureStage?Number.POSITIVE_INFINITY:hA),m=Vi(Ct(r),yA),d=s.toolName?Vi(Ct(s.toolName),CA):void 0,f=i===null?void 0:Vi(Ct(i),bA),p=tr.join(l,vA(f?.value??null),c.slice(0,7));Ki.mkdirSync(p,{recursive:!0,mode:448});let g=tr.join(p,`${c.slice(0,10)}-${a}.jsonl`),h={ts:c,id:(s.createId??gs)(),v:gA,sessionId:a,decision:s.decision??"deny",agent:s.agent,shape:s.shape,level:s.level,configFallback:s.configFallback,toolName:d?.value,command:u.value,segment:m.value,...u.truncated||m.truncated||d?.truncated||f?.truncated?{truncated:!0}:{},reason:o,ruleId:s.ruleId,intent:s.intent,failureStage:s.failureStage,errorCode:s.errorCode,cwd:f?.value??null};Ki.appendFileSync(g,`${JSON.stringify(h)}
|
|
47
47
|
`,{encoding:"utf-8",mode:384}),Hp(e,l,s.now)}catch{}}function Vi(e,t){return{value:e.slice(0,t),truncated:e.length>t}}function EA(e){let t=e.env.get("CC_SAFETY_NET_AUDIT_HOME");if(e.env.get("NODE_ENV")==="test"&&!t)return null;let n=t||e.home;return n&&tr.isAbsolute(n)?n:null}function xA(e){let t=EA(e);return t?tr.join(t,".cc-safety-net","logs"):null}function Up(e,t,n,r=!0,o){if(t.decision.kind==="allow"){if(!n||e.route.kind!=="command")return;let a=$p(e);return{decision:"allow",command:a,segment:a,reason:"allowed",cwd:e.context.executionCwd,toolName:e.toolName,level:t.level,...t.configFallback?{configFallback:!0}:{}}}let i=t.decision.evidence,s=i?.command??(r?$p(e):"");return{decision:"deny",command:s,segment:i?.segment??s,reason:t.decision.reason,cwd:e.context.executionCwd,toolName:e.toolName,level:t.level,...t.configFallback?{configFallback:!0}:{},ruleId:t.decision.ruleId,intent:t.decision.intent,failureStage:o?.stage,errorCode:o?.errorCode}}function $p(e){return"command"in e?e.command??"":""}function jp(e,t,n,r){if(!t)return;let o;try{o=n()}catch{return}if(typeof o!=="string"||!o.trim())return;Wl(e,o,t.command,t.segment,t.reason,t.cwd,{decision:t.decision,agent:r.agent,shape:r.shape,level:t.level,configFallback:t.configFallback,toolName:t.toolName,ruleId:t.ruleId,intent:t.intent,failureStage:t.failureStage,errorCode:t.errorCode})}function Vp(e,t,n,r){let o;try{o=n()}catch{return}if(typeof o!=="string"||!o.trim())return;Wl(e,o,t.command??"",t.segment??t.command??"",t.reason,r.cwd??null,{decision:"deny",agent:r.agent,shape:r.shape,toolName:r.toolName??t.toolName,ruleId:t.ruleId,intent:t.intent})}function qp(e,t,n){try{let r=Wp(t,{environment:e,...n.guard});return Kp(e,t,r,n),r}catch(r){if(!(r instanceof vn))throw r;throw Kp(e,t,r.evaluation,n,!(r.cause instanceof Se),{stage:r.stage,errorCode:RA(r.cause)}),r}}function Kp(e,t,n,r,o=!0,i){jp(e,Up(t,n,r.guard?.auditAllowed??!1,o,i),r.audit.getSessionId,{agent:r.audit.agent,shape:r.audit.shape})}function RA(e){if(e instanceof N)return J[e.kind].errorCode;if(e instanceof Se)return"tool-input-limit";if(e instanceof rt)return"structural-shell-syntax-limit";return"unexpected-error"}var En=(e,t,n,r,o)=>mc(e.cwd,t,n,r,o.paths,process.cwd()),qi=(e,t,n)=>(r,o,i,s,a)=>{let l=En(r,o,i,s,a);if(!l)return null;let c=r.tool_input;if(!t.has(i)||!c||!Object.hasOwn(c,e))return l;let u=c[e];if(n?.emptyMeansSessionCwd&&u==="")return l;if(typeof u!=="string"||u.trim()==="")return ve(s,o,i),null;let m=n?.allowOutsideSessionCwd?ls(u,l.configCwd,a.paths):St(u,[l.configCwd],a.paths);if(m)return{configCwd:l.configCwd,executionCwd:m};return $e(s,o,i,{directory:"requested",problem:Et(u,l.configCwd,a.paths),cwd:u}),null};function wA(e,t){console.log(JSON.stringify(e($l(t))))}async function _A(e){let t;try{t=(await dc(process.stdin)).trim()}catch{e({reason:"Failed to parse hook input JSON."});return}if(!t){e({reason:"Missing hook input JSON."});return}return po(t,e,"Failed to parse hook input JSON.")}async function AA(e){let t=xc(),n=await _A(e.outputDeny);if(n===void 0)return;if(!n||typeof n!=="object"||Array.isArray(n)){ve(e.outputDeny);return}if(!e.isSupported(n))return;let r=e.getAgent?.(n,t)??e.agent,o=e.agent===r?void 0:e.agent,i=IA(n),s=(p,g)=>{Vp(t,p,()=>e.getSessionId(n),{agent:r,shape:o,toolName:g,cwd:p.cwd??i}),e.outputDeny(p)},a=e.getToolName(n);if(typeof a!=="string"||a.trim()===""){ve((p)=>s(p),kA(n));return}let l=a,c=(p)=>s(p,l),u;try{u=e.getToolInput(n,l,c,t)}catch(p){if(!(p instanceof Se))throw p;ve(c,void 0,l);return}if(!u.ok)return;let m=e.getContext(n,u.input,l,c,t);if(!m)return;let d;try{d=Dt(u.input)}catch(p){if(!(p instanceof Se))throw p;ve(c,void 0,l);return}let f=mr(l,u.input,u.route,m,d??null);try{let p=qp(t,f,{guard:{auditAllowed:Rc(t.env),dependencies:e.guardDependencies},audit:{agent:r,shape:o,getSessionId:()=>e.getSessionId(n)}}),g=es(p,{includeEvidence:!0,toolName:p.stage==="command-analysis"?void 0:l});if(g){if(g.unverifiedByStandardMode&&e.outputAsk&&e.canPromptPerson?.(n)){e.outputAsk(g);return}e.outputDeny(g);return}e.outputAllow?.()}catch(p){if(!(p instanceof vn))throw p;PA(p,t.env);let g=es(p.evaluation,{includeEvidence:!0,toolName:p.evaluation.stage==="command-analysis"?void 0:l});if(g)e.outputDeny(g);return}}function PA(e,t){if(!tn(ae.debug,t))return;console.error(`CC Safety Net debug: ${TA(e.stage)}: ${jl(e.cause)}`)}function TA(e){if(e==="policy-protection")return"hook policy protection failed";if(e==="config-load")return"hook config loading failed";if(e==="secret-protection")return"hook secret protection failed";return"hook analysis failed"}function kA(e){if(!e||typeof e!=="object"||Array.isArray(e))return;if(Object.hasOwn(e,"tool_input"))return e.tool_input;let t=e.toolCall;if(t&&typeof t==="object"&&!Array.isArray(t))return t.args;return}function IA(e){if(!e||typeof e!=="object"||Array.isArray(e))return null;let t=e.cwd;if(typeof t==="string")return t;let n=e.toolCall;if(!n||typeof n!=="object"||Array.isArray(n))return null;let r=n.args;if(!r||typeof r!=="object"||Array.isArray(r))return null;let o=r.Cwd;return typeof o==="string"?o:null}async function Ie(e){let t=(s)=>wA(e.createDenyOutput,s),n=e.createAskOutput,r=n?(s)=>console.log(JSON.stringify(n(Ul(s)))):void 0,o=e.createAllowOutput,i=o?()=>console.log(JSON.stringify(o())):void 0;try{await AA({...e,outputDeny:t,outputAsk:r,outputAllow:i})}catch(s){console.error("CC Safety Net error:",s),t(wn())}}var OA=new Map([["run_command","auto"]]),MA=new Set(["absolutepath","directorypath","file_path","filepath","path","searchdirectory","searchpath","target_file","targetfile"]);function Yp(e){return ie(e,OA)}async function Zp(){await Ie({agent:"antigravity-cli",createDenyOutput:(e)=>({decision:"deny",reason:e}),isSupported:()=>!0,getToolName:(e)=>e.toolCall?.name,getToolInput:(e,t)=>({ok:!0,input:WA(e.toolCall?.args,t),route:Yp(t)}),getContext:DA,getSessionId:(e)=>e.conversationId})}function DA(e,t,n,r,o){let i=LA(e);if(!i[0])return Xt(r,t,n),null;let s=i.flatMap((u)=>{let m=vt([u],o.paths);return m?[m]:[]});if(!s[0])return Xt(r,t,n,{directory:"session",problem:"unusable",cwd:i[0]}),null;if(n!=="run_command"){let u;try{u=NA(t,n,s,o.paths)}catch(m){if(m instanceof Se)return Xt(r,void 0,n),null;if(!(m instanceof N))throw m;return Xt(r,t,n),null}if(!u)return Xt(r,t,n),null;return{configCwd:u,executionCwd:u}}let a=e.toolCall?.args;if(!a||!Object.hasOwn(a,"Cwd"))return{configCwd:s[0],executionCwd:s[0]};let l=a.Cwd;if(typeof l!=="string"||l.trim()==="")return Xt(r,t,n),null;let c=St(l,s,o.paths);if(c){let u=Xp(c,s);if(!u)return Xt(r,t,n),null;return{configCwd:u,executionCwd:c}}return Xt(r,t,n,{directory:"requested",problem:Et(l,s[0],o.paths),cwd:l}),null}function NA(e,t,n,r){let o=Yp(t),i=[...uo(e,MA),...o.kind==="patch"?mo(e):[]].filter(Gl.isAbsolute),s=ue(),a=new Set(i.flatMap((l)=>{let c=Xp(O(l,r,s),n);return c?[c]:[]}));if(a.size>1)return null;return[...a][0]??n[0]??null}function Xp(e,t){return t.filter((n)=>ur(e,n)).reduce((n,r)=>r.length>n.length?r:n,"")||null}function Xt(e,t,n,r){let o=t&&typeof t==="object"?t.command:void 0,i={command:typeof o==="string"?o:void 0,toolName:n};e(r?so(r,i):wn(i))}function LA(e){if(e.workspacePaths===void 0)return[process.cwd()];return Array.isArray(e.workspacePaths)?e.workspacePaths.filter((t)=>typeof t==="string"&&t.trim()!==""):[]}function WA(e,t){if(!e)return;if(t!=="run_command")return e;return{...e,command:typeof e.CommandLine==="string"&&e.CommandLine!==""?e.CommandLine:void 0}}var GA=["npx","--offline","--no-install","@deepseek-ai/dsh","--version"],Yi=[{id:"antigravity-cli",displayName:"Antigravity CLI",doctorOrder:3,runtime:{order:1,flags:["-ac","--agy-cli"],description:"Run as Antigravity CLI PreToolUse hook",legacyTopLevelFlags:[]},install:{order:2,flag:"--agy-cli",artifactKind:"hook config",probeCommand:["agy","--version"]}},{id:"claude-code",displayName:"Claude Code",doctorOrder:1,runtime:{order:2,displayName:"Coding CLI",flags:["-cc","--coding-cli"],legacyFlags:["--claude-code"],description:"Run as Coding CLI PreToolUse hook",legacyTopLevelFlags:["-cc","--claude-code"]},install:{order:3,flag:"--claude-code",artifactKind:"plugin",probeCommand:["claude","--version"]}},{id:"codex",displayName:"Codex",doctorOrder:4,runtime:{order:3,flags:["-cx","--codex"],description:"Run as a Codex PreToolUse hook",legacyTopLevelFlags:[]},install:{order:4,flag:"--codex",artifactKind:"plugin",probeCommand:["codex","--version"]}},{id:"copilot-cli",displayName:"GitHub Copilot CLI",doctorOrder:8,runtime:{order:6,flags:["-cp","--copilot-cli"],description:"Run as GitHub Copilot CLI PreToolUse hook",legacyTopLevelFlags:["-cp","--copilot-cli"]},install:{order:8,flag:"--copilot-cli",artifactKind:"plugin",probeCommand:["copilot","--binary-version"]}},{id:"gemini-cli",displayName:"Gemini CLI",doctorOrder:7,runtime:{order:5,flags:["-gc","--gemini-cli"],description:"Run as Gemini CLI BeforeTool hook",legacyTopLevelFlags:["-gc","--gemini-cli"]},install:{order:7,flag:"--gemini-cli",artifactKind:"extension",probeCommand:["gemini","--version"]}},{id:"grok-build",displayName:"Grok Build",doctorOrder:9,runtime:{order:7,flags:["-gb","--grok-build"],description:"Run as Grok Build PreToolUse hook",legacyTopLevelFlags:[]},install:{order:9,flag:"--grok-build",artifactKind:"hook config",probeCommand:["grok","--version"]}},{id:"hermes-agent",displayName:"Hermes Agent",doctorOrder:10,runtime:{order:8,flags:["-ha","--hermes-agent"],description:"Run as Hermes Agent pre_tool_call hook",legacyTopLevelFlags:[]},install:{order:10,flag:"--hermes-agent",artifactKind:"plugin",probeCommand:["hermes","--version"]}},{id:"kimi-code",displayName:"Kimi Code",doctorOrder:11,runtime:{order:9,flags:["-kc","--kimi-code"],description:"Run as Kimi Code PreToolUse hook",legacyTopLevelFlags:[]},install:{order:11,flag:"--kimi-code",artifactKind:"hook config",probeCommand:["kimi","--version"]}},{id:"openclaw",displayName:"OpenClaw",doctorOrder:12,install:{order:12,flag:"--openclaw",artifactKind:"plugin",probeCommand:["openclaw","--version"]}},{id:"opencode",displayName:"OpenCode",doctorOrder:13,install:{order:13,flag:"--opencode",artifactKind:"plugin",probeCommand:["opencode","--version"]}},{id:"pi",displayName:"Pi",doctorOrder:14,install:{order:14,flag:"--pi",artifactKind:"package",probeCommand:["pi","--version"]}},{id:"cursor",displayName:"Cursor",doctorOrder:5,runtime:{order:4,flags:["-cu","--cursor"],description:"Run as Cursor preToolUse hook",legacyTopLevelFlags:[]},install:{order:5,flag:"--cursor",artifactKind:"hook config",probeCommand:["cursor","--version"]}},{id:"deepseek-harness",displayName:"DeepSeek Harness",doctorOrder:6,install:{order:6,flag:"--deepseek-harness",artifactKind:"package",probeCommand:GA}},{id:"amp",displayName:"Amp Code",doctorOrder:2,install:{order:1,flag:"--amp",artifactKind:"plugin",probeCommand:["amp","--version"]}}],FL=Yi.slice().sort((e,t)=>e.doctorOrder-t.doctorOrder).map((e)=>e.id),Jp=Yi.filter((e)=>("runtime"in e)).slice().sort((e,t)=>e.runtime.order-t.runtime.order).map((e)=>({id:e.id,displayName:"displayName"in e.runtime?e.runtime.displayName:e.displayName,flags:e.runtime.flags,legacyFlags:"legacyFlags"in e.runtime?e.runtime.legacyFlags:[],description:e.runtime.description,legacyTopLevelFlags:e.runtime.legacyTopLevelFlags})),zL=Yi.slice().sort((e,t)=>e.install.order-t.install.order).map((e)=>({id:e.id,...e.install})).map(({order:e,...t})=>t),HL=Object.fromEntries(Yi.map((e)=>[e.id,e.displayName]));var xn=require("node:path");function Qp(e,t){if(e!==void 0&&e!==null&&typeof e!=="string")return"unknown";if(typeof e==="string"&&!xn.isAbsolute(e))return"unknown";try{let n=ue(),r=typeof e==="string"&&e?O(e,t.paths,n):void 0,o=t.home,i=[["codex",t.env.get("CODEX_HOME")||xn.join(o,".codex")],["copilot-cli",t.env.get("COPILOT_HOME")||xn.join(o,".copilot")],["claude-code",t.env.get("CLAUDE_CONFIG_DIR")||xn.join(o,".claude")]],s=r?i.flatMap(([a,l])=>{if(!xn.isAbsolute(l))return[];return ur(r,O(l,t.paths,n))?[a]:[]}):[];if(s.length===1)return s[0]??"unknown";if(s.length>1)return"unknown"}catch{return"unknown"}if(t.env.get("COPILOT_CLI")==="1")return"copilot-cli";if(t.env.get("CLAUDECODE")==="1"||Boolean(t.env.get("CLAUDE_CODE_ENTRYPOINT")))return"claude-code";return"unknown"}var Zi="PreToolUse",eg="BeforeTool",tg="pre_tool_call";async function nr(e){await Ie({agent:e.agent,...e.getAgent?{getAgent:e.getAgent}:{},createDenyOutput:(t)=>({hookSpecificOutput:{hookEventName:Zi,permissionDecision:"deny",permissionDecisionReason:t}}),...e.canPromptPerson?{canPromptPerson:e.canPromptPerson,createAskOutput:(t)=>({hookSpecificOutput:{hookEventName:Zi,permissionDecision:"ask",permissionDecisionReason:t}})}:{},isSupported:(t)=>t.hook_event_name===Zi,getToolName:(t)=>t.tool_name,getToolInput:(t,n,r,o)=>({ok:!0,input:t.tool_input,route:e.getToolRoute(n,t.tool_input,o)}),getContext:e.getContext??En,getSessionId:(t)=>t.session_id})}var FA=new Map([["Bash","posix"],["PowerShell","powershell"],["Monitor","posix"]]);function zA(e,t,n){if(e==="Bash"&&n.env.get("COPILOT_CLI")==="1")return{kind:"command",shell:"auto"};return e==="Monitor"&&t?.command===void 0?ie(e,new Map):ie(e,FA)}async function ng(){await nr({agent:"claude-code",getAgent:(e,t)=>Qp(e.transcript_path,t),canPromptPerson:(e)=>["default","acceptEdits","plan"].includes(e.permission_mode??""),getToolRoute:zA})}var HA=new Map([["Bash","auto"]]);async function rg(){await nr({agent:"codex",getToolRoute:(e)=>ie(e,HA)})}var BA=new Map([["bash","auto"],["Bash","auto"],["powershell","powershell"],["PowerShell","powershell"]]);function $A(e){return ie(e,BA)}async function og(){await Ie({agent:"copilot-cli",createDenyOutput:(e)=>({permissionDecision:"deny",permissionDecisionReason:e}),isSupported:()=>!0,getToolName:(e)=>e.toolName,getToolInput:(e,t,n)=>{let r=$A(t);if(typeof e.toolArgs==="object"&&e.toolArgs!==null)return{ok:!0,input:e.toolArgs,route:r};if(typeof e.toolArgs!=="string")return n({reason:"Failed to parse toolArgs JSON."}),{ok:!1};if(r.kind==="patch"&&e.toolArgs.trimStart().startsWith("*** Begin Patch"))return{ok:!0,input:e.toolArgs,route:r};let i=po(e.toolArgs,n,"Failed to parse toolArgs JSON.");if(i===void 0)return{ok:!1};return{ok:!0,input:i,route:r}},getContext:En,getSessionId:(e)=>typeof e.sessionId==="string"&&e.sessionId.trim()?e.sessionId:void 0})}var UA=new Map([["Shell","auto"]]);function jA(e){return ie(e,UA)}async function ig(){await Ie({agent:"cursor",createDenyOutput:(e)=>({permission:"deny",user_message:e,agent_message:e}),createAllowOutput:()=>({permission:"allow"}),isSupported:()=>!0,getToolName:(e)=>e.tool_name,getToolInput:(e,t)=>({ok:!0,input:e.tool_input,route:jA(t)}),getContext:VA,getSessionId:(e)=>e.conversation_id})}function VA(e,t,n,r,o){let i=KA(e);if(!i[0])return ve(r,t,n),null;let s=i.flatMap((d)=>{let f=vt([d],o.paths);return f?[f]:[]});if(!s[0])return $e(r,t,n,{directory:"session",problem:"unusable",cwd:i[0]}),null;let a=qA(e.cwd),l=St(a,s,o.paths);if(!l)return $e(r,t,n,{directory:"session",problem:Et(a,s[0],o.paths),cwd:a}),null;if(t===null||typeof t!=="object"||Array.isArray(t))return{configCwd:l,executionCwd:l};if(!Object.hasOwn(t,"working_directory"))return{configCwd:l,executionCwd:l};let c=t.working_directory;if(typeof c!=="string"||c.trim()==="")return ve(r,t,n),null;let u=ar(c),m=St(u,s,o.paths);if(!m)return $e(r,t,n,{directory:"requested",problem:Et(u,s[0],o.paths),cwd:u}),null;return{configCwd:l,executionCwd:m}}function KA(e){if(e.workspace_roots===void 0)return typeof e.cwd==="string"&&e.cwd.trim()!==""?[ar(e.cwd)]:[];if(!Array.isArray(e.workspace_roots))return[];return e.workspace_roots.filter((t)=>typeof t==="string"&&t.trim()!=="").map((t)=>ar(t))}function qA(e){return typeof e==="string"&&e.trim()!==""?ar(e):"."}var sg=new Map([["run_shell_command","auto"]]);function YA(e){return ie(e,sg)}async function ag(){await Ie({agent:"gemini-cli",createDenyOutput:(e)=>({decision:"deny",reason:e,systemMessage:e}),isSupported:(e)=>e.hook_event_name===eg,getToolName:(e)=>e.tool_name,getToolInput:(e,t)=>({ok:!0,input:e.tool_input,route:YA(t)}),getContext:qi("dir_path",sg,{emptyMeansSessionCwd:!0,allowOutsideSessionCwd:!0}),getSessionId:(e)=>e.session_id})}var ZA=new Map([["run_terminal_command","auto"],["monitor","auto"]]);function XA(e){return ie(e,ZA)}async function lg(){await Ie({agent:"grok-build",createDenyOutput:(e)=>({decision:"deny",reason:e}),createAllowOutput:()=>({decision:"allow"}),isSupported:()=>!0,getToolName:(e)=>e.toolName,getToolInput:(e,t,n)=>{if(e.toolInputTruncated===!0)return ve(n,e.toolInput,t),{ok:!1};return{ok:!0,input:e.toolInput,route:XA(t)}},getContext:JA,getSessionId:(e)=>e.sessionId})}function JA(e,t,n,r,o){let i=QA(e);if(!i)return ve(r,t,n),null;let s=vt([i],o.paths);if(!s)return $e(r,t,n,{directory:"session",problem:"unusable",cwd:i}),null;let a=eP(e.cwd),l=St(a,[s],o.paths);if(!l)return $e(r,t,n,{directory:"session",problem:Et(a,s,o.paths),cwd:a}),null;return{configCwd:l,executionCwd:l}}function QA(e){let t=e.workspaceRoot===void 0?e.cwd:e.workspaceRoot;return typeof t==="string"&&t.trim()!==""?t:void 0}function eP(e){return typeof e==="string"&&e.trim()!==""?e:"."}var cg=require("node:path");var tP=new Map([["terminal","posix"]]);async function ug(){await Ie({agent:"hermes-agent",createDenyOutput:(e)=>({action:"block",message:e}),isSupported:(e)=>e.hook_event_name===tg,getToolName:(e)=>e.tool_name,getToolInput:(e,t)=>({ok:!0,input:e.tool_input,route:ie(t,tP)}),getContext:nP,getSessionId:(e)=>e.session_id})}function nP(e,t,n,r,o){let i=En(e,t,n,r,o);if(!i)return null;if(!t||typeof t!=="object"||Array.isArray(t))return i;if(!Object.hasOwn(t,"workdir"))return i;let s=t.workdir;if(typeof s!=="string"||s.trim()==="")return ve(r,t,n),null;let a=vt([cg.resolve(i.configCwd,s)],o.paths);if(!a)return $e(r,t,n,{directory:"requested",problem:"unusable",cwd:s}),null;return{...i,executionCwd:a}}var dg=new Map([["Bash","posix"]]);function rP(e){return ie(e,dg)}async function mg(){await nr({agent:"kimi-code",getToolRoute:rP,getContext:qi("cwd",dg)})}var oP={"antigravity-cli":Zp,"claude-code":ng,codex:rg,"copilot-cli":og,cursor:ig,"gemini-cli":ag,"grok-build":lg,"hermes-agent":ug,"kimi-code":mg},Fl=Jp.map((e)=>({...e,run:oP[e.id]}));function fg(e){let t=io({label:"hook",booleans:Object.fromEntries(Fl.map((r)=>[r.id,[...r.flags,...r.legacyFlags]]))},e);if(t.errors.length>0)return;let n=Fl.filter((r)=>t.flags[r.id]);return n.length===1?n[0]:void 0}function pg(e){return Fl.find((t)=>t.legacyTopLevelFlags.some((n)=>n===e))}async function iP(){let e=process.argv.slice(2),t=e[0],n=io({label:"cc-safety-net",booleans:{version:["-V","--version"]},positionals:"list"},e);if(!n.help&&!n.flags.version){if(t?.toLowerCase()==="hook"){let i=fg(e.slice(1));if(i){await i.run();return}}let o=pg(t);if(o){await o.run();return}}let r=await import("../cli.js");await r.runCli(e)}iP().catch((e)=>{console.error("CC Safety Net error:",e),process.exit(1)});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import{a,s,K,f,Pe,d,Le,y,p,V}from"./index-8cqwk53d.js";import{appendFileSync as ne,mkdirSync as oe}from"node:fs";import{isAbsolute as ie,join as I}from"node:path";import{lstatSync as C,readdirSync as j,readFileSync as U,rmdirSync as B,statSync as L,unlinkSync as X,utimesSync as z,writeFileSync as Y}from"node:fs";import{join as m}from"node:path";function re(t,e={}){return Le(d(t,e),t.home).policy.audit.retention_days}var S=86400000,Z=".last-prune",J=/^\d{4}-\d{2}$/,Q=/^((\d{4}-\d{2})-\d{2})-.+\.jsonl$/,O=(t)=>Math.floor(t/S);function q(t,e,r=()=>new Date){try{let n=r().getTime();if(!L(e,{throwIfNoEntry:!1})?.isDirectory())return;let o=m(e,Z),c=L(o,{throwIfNoEntry:!1})?.mtimeMs;if(c!==void 0&&O(c)===O(n))return;let i=n-re(t)*S,u=new Date(n).toISOString().slice(0,7);for(let l of A(e)){if(l.isDirectory()){W(m(e,l.name),i,u);continue}if(l.isFile()&&l.name.endsWith(".jsonl"))ee(m(e,l.name),i)}Y(o,"",{mode:384}),z(o,n/1000,n/1000)}catch{}}function W(t,e,r){for(let n of A(t)){if(!n.isDirectory()||!J.test(n.name))continue;let o=m(t,n.name);for(let c of A(o)){if(!c.isFile())continue;let i=Q.exec(c.name);if(!i||i[2]!==n.name)continue;let u=Date.parse(`${i[1]}T00:00:00.000Z`)+S;if(!Number.isFinite(u)||u>=e)continue;T(m(o,c.name))}if(n.name!==r)G(o)}G(t)}function ee(t,e){try{let r=C(t);if(r.mtimeMs>=e)return;let n=U(t,"utf-8").split(`
|
|
2
|
-
`).filter((o)=>o.trim()).map(te);if(n.length===0)return;if(n.some((o)=>o===void 0||o>=e))return;if(C(t).mtimeMs!==r.mtimeMs)return;T(t)}catch{}}function te(t){try{let e=JSON.parse(t).ts,r=typeof e==="string"?Date.parse(e):Number.NaN;return Number.isFinite(r)?r:void 0}catch{return}}function A(t){try{return j(t,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function T(t){try{X(t)}catch{}}function G(t){try{B(t)}catch{}}var ae="2.5.
|
|
2
|
+
`).filter((o)=>o.trim()).map(te);if(n.length===0)return;if(n.some((o)=>o===void 0||o>=e))return;if(C(t).mtimeMs!==r.mtimeMs)return;T(t)}catch{}}function te(t){try{let e=JSON.parse(t).ts,r=typeof e==="string"?Date.parse(e):Number.NaN;return Number.isFinite(r)?r:void 0}catch{return}}function A(t){try{return j(t,{withFileTypes:!0,encoding:"utf8"})}catch{return[]}}function T(t){try{X(t)}catch{}}function G(t){try{B(t)}catch{}}var ae="2.5.1",ce=1e4,de=2000,ue=256,se=32768;function le(t){let e=t.trim();if(!e)return null;let r=e.replace(/[^A-Za-z0-9_.-]+/g,"_");if(r=r.replace(/^[._-]+|[._-]+$/g,"").slice(0,128),!r||r==="."||r==="..")return null;return r}function me(t){return(t??"").replace(/[^A-Za-z0-9]/g,"-").slice(0,180)||"no-cwd"}function _(t,e,r,n,o,c,i={}){let u=le(e);if(!u)return;let l=F(t);if(!l)return;try{let E=(i.now??(()=>new Date))().toISOString(),N=g(K(r),i.failureStage?Number.POSITIVE_INFINITY:ce),h=g(K(n),de),w=i.toolName?g(K(i.toolName),ue):void 0,v=c===null?void 0:g(K(c),se),D=I(l,me(v?.value??null),E.slice(0,7));oe(D,{recursive:!0,mode:448});let H=I(D,`${E.slice(0,10)}-${u}.jsonl`),P={ts:E,id:(i.createId??Pe)(),v:ae,sessionId:u,decision:i.decision??"deny",agent:i.agent,shape:i.shape,level:i.level,configFallback:i.configFallback,toolName:w?.value,command:N.value,segment:h.value,...N.truncated||h.truncated||w?.truncated||v?.truncated?{truncated:!0}:{},reason:o,ruleId:i.ruleId,intent:i.intent,failureStage:i.failureStage,errorCode:i.errorCode,cwd:v?.value??null};ne(H,`${JSON.stringify(P)}
|
|
3
3
|
`,{encoding:"utf-8",mode:384}),q(t,l,i.now)}catch{}}function g(t,e){return{value:t.slice(0,e),truncated:t.length>e}}function He(t){let e=t.env.get("CC_SAFETY_NET_AUDIT_HOME");if(t.env.get("NODE_ENV")==="test"&&!e)return null;let r=e||t.home;return r&&ie(r)?r:null}function F(t){let e=He(t);return e?I(e,".cc-safety-net","logs"):null}function k(t,e,r,n=!0,o){if(e.decision.kind==="allow"){if(!r||t.route.kind!=="command")return;let u=b(t);return{decision:"allow",command:u,segment:u,reason:"allowed",cwd:t.context.executionCwd,toolName:t.toolName,level:e.level,...e.configFallback?{configFallback:!0}:{}}}let c=e.decision.evidence,i=c?.command??(n?b(t):"");return{decision:"deny",command:i,segment:c?.segment??i,reason:e.decision.reason,cwd:t.context.executionCwd,toolName:t.toolName,level:e.level,...e.configFallback?{configFallback:!0}:{},ruleId:e.decision.ruleId,intent:e.decision.intent,failureStage:o?.stage,errorCode:o?.errorCode}}function b(t){return"command"in t?t.command??"":""}function x(t,e,r,n){if(!e)return;let o;try{o=r()}catch{return}if(typeof o!=="string"||!o.trim())return;_(t,o,e.command,e.segment,e.reason,e.cwd,{decision:e.decision,agent:n.agent,shape:n.shape,level:e.level,configFallback:e.configFallback,toolName:e.toolName,ruleId:e.ruleId,intent:e.intent,failureStage:e.failureStage,errorCode:e.errorCode})}function ve(t,e,r,n){let o;try{o=r()}catch{return}if(typeof o!=="string"||!o.trim())return;_(t,o,e.command??"",e.segment??e.command??"",e.reason,n.cwd??null,{decision:"deny",agent:n.agent,shape:n.shape,toolName:n.toolName??e.toolName,ruleId:e.ruleId,intent:e.intent})}function M(t,e,r){try{let n=V(e,{environment:t,...r.guard});return R(t,e,n,r),n}catch(n){if(!(n instanceof p))throw n;throw R(t,e,n.evaluation,r,!(n.cause instanceof f),{stage:n.stage,errorCode:fe(n.cause)}),n}}function R(t,e,r,n,o=!0,c){x(t,k(e,r,n.guard?.auditAllowed??!1,o,c),n.audit.getSessionId,{agent:n.audit.agent,shape:n.audit.shape})}function fe(t){if(t instanceof s)return a[t.kind].errorCode;if(t instanceof f)return"tool-input-limit";if(t instanceof y)return"structural-shell-syntax-limit";return"unexpected-error"}
|
|
4
4
|
export{re,q,He,F,ve,M};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Se,I,O,nt,c,o,we,T,p}from"./index-8cqwk53d.js";import{ve,M}from"./index-
|
|
1
|
+
import{Se,I,O,nt,c,o,we,T,p}from"./index-8cqwk53d.js";import{ve,M}from"./index-3rm5n91g.js";function L(n,t={}){return{malformed:!0,denial:I(t),cwd:n}}function ue(n,t){return{malformed:!0,denial:O(n,t),cwd:n.cwd}}function xe(n,t={}){return(e,i)=>{try{return g(e,i,n,t)}catch(a){return console.error("CC Safety Net error:",a),n.block(I())}}}function g(n,t,e,i){let a=c();if(e.cancelled?.(t))return e.block(I());let l=e.extract(n,t,a.paths);if(!l)return e.allow;let d=()=>e.getSessionId(n,t);if("malformed"in l)return ve(a,l.denial,d,{agent:e.agent,toolName:l.denial.toolName,cwd:l.cwd}),e.block(l.denial);let u=(r,m)=>{let s=Se(r,{includeEvidence:m});return s?e.block(s):e.allow};try{let r=M(a,l,{guard:{auditAllowed:we(a.env),policyOptions:i.policyOptions,dependencies:i.guardDependencies},audit:{agent:e.agent,getSessionId:d}});return u(r,!0)}catch(r){if(!(r instanceof p))throw r;if(T(o.debug,a.env))console.error(`CC Safety Net debug: ${e.debugLabel} analysis failed: ${nt(r.cause)}`);return u(r.evaluation,e.includeEvidenceOnError(l))}}
|
|
2
2
|
export{L,ue,xe};
|