@tokmizer/plugin 0.9.64 → 0.9.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokmizer",
3
- "version": "0.9.64",
3
+ "version": "0.9.65",
4
4
  "description": "Tokmizer reduces token consumption for AI agents.",
5
5
  "author": {
6
6
  "name": "Tokmizer",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokmizer",
3
- "version": "0.9.64",
3
+ "version": "0.9.65",
4
4
  "description": "Tokmizer reduces token consumption for OpenAI Codex.",
5
5
  "author": {
6
6
  "name": "Tokmizer",
package/README.md CHANGED
@@ -232,17 +232,18 @@ The percentages in `tkr gain` measure byte reduction. A byte percentage can diff
232
232
 
233
233
  ## Restoring shortened output
234
234
 
235
- When Tokmizer shortens an output it can add a `[tkr restore <hash>]` hint. `tkr restore <hash>` prints the complete original output when it is at most 8 MB; for a larger output, the entry holds only the part that was left out and `tkr restore` says so. A unique prefix of the hash is enough.
235
+ When Tokmizer shortens an output it can add a `[tkr restore <hash>]` hint. `tkr restore <hash>` prints the complete original output when it is at most 8 MB, except detected secrets, which are masked; for a larger output, the entry holds only the part that was left out and `tkr restore` says so. A unique prefix of the hash is enough.
236
236
 
237
237
  | Command | Effect |
238
238
  | --- | --- |
239
239
  | `tkr restore <hash>` | Print the cached output |
240
240
  | `tkr restore <hash> --lines 120:180` | Print only lines 120 to 180 (`120:`, `:40` and `57` also work) |
241
241
  | `tkr restore <hash> --grep <pattern>` | Print matching lines with their line numbers |
242
- | `tkr restore --grep <pattern>` | Search every cached output |
243
- | `tkr restore --list` | List cached outputs with age, size, line count and command |
242
+ | `tkr restore --grep <pattern>` | Search the cached outputs of the current project |
243
+ | `tkr restore --grep <pattern> --all-projects` | Search the cached outputs of every project |
244
+ | `tkr restore --list` | List this project's cached outputs with age, size, line count and command (`--all-projects` for every project) |
244
245
 
245
- Entries are kept 30 days, up to 8 MB each and 200 MB in total; the oldest go first. `TOKMIZER_CCR_MAX_AGE_MS`, `TOKMIZER_CCR_ENTRY_MAX_BYTES` and `TOKMIZER_CCR_DIR_CAP_BYTES` change these limits, `TOKMIZER_CCR_DISABLED=1` turns copies off. `tkr gain` shows the restored tokens and the cache size.
246
+ Before a copy is saved, private keys, GitHub, npm, AWS, Slack and Stripe live tokens, `Authorization: Bearer` values and passwords in URLs are replaced by `[tkr: secret masked]`; the output your agent sees is unchanged. Entries are kept 30 days, up to 8 MB each and 200 MB in total; the oldest go first. `TOKMIZER_CCR_MAX_AGE_MS`, `TOKMIZER_CCR_ENTRY_MAX_BYTES` and `TOKMIZER_CCR_DIR_CAP_BYTES` change these limits, `TOKMIZER_CCR_DISABLED=1` turns copies off. `tkr gain` shows the restored tokens and the cache size.
246
247
 
247
248
  ## Measured comparison
248
249
 
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __tkrCreateRequire } from "node:module"; const require = __tkrCreateRequire(import.meta.url);
3
- function L(t=5e3){return new Promise(e=>{let n=[],r=process.stdin,o=!1,s=()=>{o||(o=!0,clearTimeout(c),r.off("data",i),r.pause(),r.unref?.(),e(Buffer.concat(n).toString("utf8")))},i=u=>{n.push(Buffer.isBuffer(u)?u:Buffer.from(u))},c=setTimeout(s,t);r.on("data",i).once("end",s).once("error",s),r.resume()})}function z(){return!1}import ee from"node:os";import{join as ne}from"node:path";function $(){return process.env.TOKMIZER_HOME||ne(ee.homedir(),".tokmizer")}import{rmSync as re,statSync as oe}from"node:fs";import{join as se}from"node:path";function kt(){return se($(),"fail-open")}var ie=24*36e5;function S(t=Date.now()){try{if(t-oe(kt()).mtimeMs<ie)return!0;re(kt(),{force:!0})}catch{}return!1}function E(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}var qr=String.raw`(?:'(?:(?:[^']|'\\'')*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?'|"(?:[^"]*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?"|(?:[^\s'"]*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?)`;import{appendFileSync as de,chmodSync as pe,mkdirSync as me,existsSync as ge,readFileSync as to,rmSync as eo}from"node:fs";import{dirname as he,join as ke}from"node:path";import{readFileSync as ue,renameSync as le,statSync as ae,writeFileSync as fe}from"node:fs";function _t(t,e,n){try{if(ae(t).size<=e)return;let r=ue(t,"utf8").split(`
4
- `).filter(c=>c.trim()!==""),o=[],s=0;for(let c=r.length-1;c>=0;c-=1){let u=r[c],l=Buffer.byteLength(u)+1;if(s+l>n)break;o.push(u),s+=l}o.reverse();let i=`${t}.tmp-${process.pid}`;fe(i,o.length?`${o.join(`
3
+ function L(t=5e3){return new Promise(e=>{let n=[],r=process.stdin,o=!1,s=()=>{o||(o=!0,clearTimeout(c),r.off("data",i),r.pause(),r.unref?.(),e(Buffer.concat(n).toString("utf8")))},i=u=>{n.push(Buffer.isBuffer(u)?u:Buffer.from(u))},c=setTimeout(s,t);r.on("data",i).once("end",s).once("error",s),r.resume()})}function J(){return!1}import ne from"node:os";import{join as re}from"node:path";function A(){return process.env.TOKMIZER_HOME||re(ne.homedir(),".tokmizer")}import{rmSync as oe,statSync as se}from"node:fs";import{join as ie}from"node:path";function _t(){return ie(A(),"fail-open")}var ce=24*36e5;function w(t=Date.now()){try{if(t-se(_t()).mtimeMs<ce)return!0;oe(_t(),{force:!0})}catch{}return!1}function v(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}var Qr=String.raw`(?:'(?:(?:[^']|'\\'')*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?'|"(?:[^"]*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?"|(?:[^\s'"]*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?)`;import{appendFileSync as pe,chmodSync as me,mkdirSync as ge,existsSync as he,readFileSync as oo,rmSync as so}from"node:fs";import{dirname as ke,join as _e}from"node:path";import{readFileSync as le,renameSync as ae,statSync as fe,writeFileSync as de}from"node:fs";function bt(t,e,n){try{if(fe(t).size<=e)return;let r=le(t,"utf8").split(`
4
+ `).filter(c=>c.trim()!==""),o=[],s=0;for(let c=r.length-1;c>=0;c-=1){let u=r[c],l=Buffer.byteLength(u)+1;if(s+l>n)break;o.push(u),s+=l}o.reverse();let i=`${t}.tmp-${process.pid}`;de(i,o.length?`${o.join(`
5
5
  `)}
6
- `:"",{mode:384}),le(i,t)}catch{}}var _e="usage.jsonl";var bt=2*1024*1024;function be(){return ke($(),_e)}function h(t,e,n=be()){try{let r=he(n);ge(r)||me(r,{recursive:!0,mode:448});let o=t.replace(/[^A-Za-z0-9._-]/g,"").slice(0,64)||"unknown";de(n,`{"t":${Math.floor(Date.now()/1e3)},"s":"${o}","o":${e?1:0}}
7
- `,{mode:384}),pe(n,384),_t(n,bt,bt/2)}catch{}}import{existsSync as W,readFileSync as ot,readdirSync as st}from"node:fs";import{homedir as C}from"node:os";import{fileURLToPath as Qe}from"node:url";import{dirname as Ht,join as f,resolve as tn}from"node:path";import{execFileSync as Me}from"node:child_process";import{mkdirSync as Ue,readFileSync as $t,renameSync as ze,statSync as Je,writeFileSync as Be}from"node:fs";import{join as vt}from"node:path";import{closeSync as we,openSync as Se,readSync as ye,readdirSync as xe,readFileSync as $e,statSync as St}from"node:fs";import{homedir as ve}from"node:os";import{isAbsolute as Ae,join as J,resolve as Ee}from"node:path";var Oe=/^[A-Za-z0-9._+@%:,/-]+$/,Re=new Set(["7f454c46","feedface","feedfacf","cefaedfe","cffaedfe","cafebabe","bebafeca"]),Te=32,Ce=4*1024*1024;function et(t){let e;try{e=Se(t,"r");let n=Buffer.alloc(4),r=ye(e,n,0,4,0);return r>=2&&n[0]===35&&n[1]===33?"#!":r===4?n.toString("hex"):null}catch{return null}finally{e!==void 0&&we(e)}}function j(t,e=process.platform){try{let n=St(t);if(!n.isFile())return!1;if(e==="win32")return!0;if((n.mode&73)===0)return!1;let r=et(t);return r==="#!"||r!==null&&Re.has(r)}catch{return!1}}function Pe(t){if(/\.[A-Za-z0-9]+$/.test(t))return[t];let e=(process.env.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);return[t,...e.map(n=>t+n.toLowerCase())]}function T(t,e,n,r=process.platform){if(!Oe.test(t))return!1;let o=r==="win32";if(t.includes("/"))return j(Ee(e??process.cwd(),t),r);if(!n)return!1;let s=o?Pe(t):[t];for(let i of n.split(o?";":":"))if(!(!i||!Ae(i))){for(let c of s)if(j(J(i,c),r))return!0}return!1}var He=/^eval \$'([^\s'()=]+) \(\) /,Ne=/^([^\s'"()=]+) \(\) \{$/,Ie=/^alias -- ([^\s=]+)=(.*)$/,Le=/^# (?:Shell Options|Aliases|Shopt|Check for |Shadow )/,je=/^export PATH=(.*)$/,Fe=/^(?:--colou?r(?:=\S+)?|-G)$/;function wt(t){return t.length>=2&&t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1).replace(/'\\''/g,"'"):t.length>=2&&t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t}function De(t,e){let n="";for(let r of t.split(`
8
- `)){let o=je.exec(r);if(o&&n!=="# Functions"){let s=wt(o[1].trim());/[$`\\]/.test(s)||e.paths.push(s);continue}if(r.startsWith("# ")&&(n!=="# Functions"||Le.test(r))){n=r;continue}if(n==="# Functions"){let s=He.exec(r)??Ne.exec(r);s&&e.functions.add(s[1])}else if(n==="# Aliases"){let s=Ie.exec(r);s&&e.aliases.set(s[1],wt(s[2].trim()))}}}function tt(t){return t?.code==="ENOENT"}function yt(t){let e={functions:new Set,aliases:new Map,paths:[],uncertain:!1},n=J(t||J(ve(),".claude"),"shell-snapshots"),r=[];try{for(let o of xe(n)){if(!o.startsWith("snapshot-")||!o.endsWith(".sh"))continue;let s=J(n,o);try{let i=St(s);i.isFile()&&r.push({path:s,mtime:i.mtimeMs,size:i.size})}catch(i){tt(i)||(e.uncertain=!0)}}}catch(o){return tt(o)||(e.uncertain=!0),e}r=r.sort((o,s)=>s.mtime-o.mtime).slice(0,Te);for(let o of r)try{if(o.size>Ce)throw new Error("snapshot too large");De($e(o.path,"utf8"),e)}catch(s){tt(s)||(e.uncertain=!0)}return e}function xt(t,e){if(e.uncertain||e.functions.has(t))return!0;let n=e.aliases.get(t);if(n===void 0)return!1;let r=n.trim().split(/\s+/);return r[0]!==t||!r.slice(1).every(o=>Fe.test(o))}var We="exec-probe.json",Ge=6e4;function Ze(){return vt($(),We)}function Ke(t){try{let e=JSON.parse($t(t,"utf8"));if(e==null||typeof e!="object")return null;let n=e;return typeof n.key!="string"||typeof n.ok!="boolean"?null:{key:n.key,ok:n.ok,at:typeof n.at=="number"?n.at:0,skipped:typeof n.skipped=="number"&&n.skipped>=0?n.skipped:0}}catch{return null}}function qe(t,e){try{Ue(vt(t,".."),{recursive:!0,mode:448});let n=`${t}.${process.pid}.tmp`;Be(n,JSON.stringify(e),{mode:384}),ze(n,t)}catch{}}function Ye(t){try{return Me(t,["--native-check"],{encoding:"utf8",timeout:2e3,maxBuffer:1024,stdio:["ignore","pipe","ignore"],windowsHide:!0}).startsWith("tokmizer-native ")}catch{return!1}}function Ve(t,e){try{let r=$t(t,"utf8").split(`
9
- `,1)[0].slice(2).trim().split(/\s+/),o=r[0]??"";return o==="/usr/bin/env"?T(r[1]??"",void 0,e):j(o)}catch{return!1}}function Xe(t,e,n){try{let r=Je(t);return[t,r.size,r.mtimeMs,r.ino,r.mode,e?n??"":""].join("|")}catch{return`${t}|missing`}}function nt(t,e=process.platform,n=process.env.PATH,r=Ze(),o=Date.now()){let s=e!=="win32"&&et(t)==="#!",i=Xe(t,s,n),c=Ke(r);if(c?.key===i&&(c.ok||o-c.at<Ge))return c.ok;let u=j(t,e)&&(s?Ve(t,n):Ye(t));return qe(r,{key:i,ok:u,at:o,skipped:(c?.skipped??0)+(u?0:1)}),u}var en=new Set(["tkr","tkr-exec","token","claude","cd","export","source","echo","mkdir","rm","mv","cp","chmod","ln","true","false",":","test","[","exit","return","nohup","sudo","doas","env"]),nn=new Set(["for","while","until","if","then","else","elif","fi","do","done","case","esac","select","function","time","coproc","in","!","[[","]]","{","}",".","declare","typeset","local","readonly","unset","set","shift","trap","wait","read","eval","exec","break","continue","pushd","popd","dirs","alias","unalias","hash","ulimit","umask","getopts","let","shopt","builtin","command","compgen","complete","disown","suspend","jobs","fg","bg","kill","history","fc","bind","enable","caller","type","printf","pwd","times","logout","mapfile","readarray","help","which","print","whence","where","autoload","zmodload","setopt","unsetopt","emulate","noglob","rehash","functions","bindkey","zle","vared","sched","limit","unlimit","zstyle","zparseopts","ttyctl"]),At=new Set(["sh","bash","zsh","dash","ksh","fish","python","python3","python2","node","ruby","perl","php","awk","sed","deno","bun"]),Et="(?:dev|start|serve|watch|preview)",rn=new RegExp(`^(?:\\S*/)?(?:bun\\s+(?:install|i|add|remove|rm|update|outdated|audit|test|build|pm|x)(?:\\s|$)|bun\\s+run\\s+(?!${Et}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|deno\\s+(?:test|lint|fmt|check|compile|install|info|doc|bench|outdated)(?:\\s|$)|deno\\s+task\\s+(?!${Et}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|php\\s+-l(?:\\s|$)|php\\s+(?:\\S*/)?(?:phpunit|pest|paratest|phpstan|pint|ecs|php-cs-fixer|psalm|rector|run-tests\\.php)(?:\\s|$)|php\\s+artisan\\s+(?!(?:serve|tinker|queue:work|queue:listen|horizon|octane:start|reverb:start|schedule:work|pail|dev)(?:\\s|$))\\S)`),on=/(?:^|\s)--watch(?:\s|=|$)/;function sn(t){return rn.test(t)&&!on.test(t)}var cn=/^((?:\S*\/)?(sh|bash|zsh|dash|ksh|fish)\s+(-[elux]*c[elux]*)\s+)(['"])/,un=/[()$]|(?:^|[;&|\n]\s*)(?:and|or|not|begin|end|if|else|switch|case|while|for|function|return)(?:\s|;|$)/,Nt=3;function It(t){let e=cn.exec(t);if(!e)return null;let n=e[2]==="fish";if(n&&e[3]!=="-c")return null;let r=e[4],o=e[1].length+1,s=t.indexOf(r,o);if(s<=o)return null;let i=t.slice(s+1);if(i&&!/^\s/.test(i))return null;let c=t.slice(o,s);return r==='"'&&/[$`\\!]/.test(c)||n&&un.test(c)?null:{script:c,start:o,end:s,quote:r}}var ln=new Set(["cd","export","set","unset","source",".","true",":","pushd","popd"]);function an(t){return ct(t).filter(n=>{if(n.kind!=="cmd"||n.unsafe)return!1;let r=jt(n.text);return r!==""&&!ln.has(r)&&!it.test(r)}).length>1}function fn(t,e,n,r,o){if(n>=Nt)return null;let s=It(t);if(!s)return null;let{script:i,start:c,end:u,quote:l}=s,a=[],d=Ft(i,e,n+1,r,A=>a.push(A));if(d===i||l==='"'&&/["$`]/.test(d))return null;let k=l==="'"?d.replace(/'/g,"'\\''"):d,g=`${t.slice(0,c)}${k}${t.slice(u)}`,w=an(i);if(o)for(let A of w?[t,...a]:a)o(A);return w?`${e} ${g}`:g}var Ot=/(?:^|\s)(?:--follow|-[0-9a-zA-Z]*f[a-zA-Z]*)(?:\s|=|$)/,dn=new Set(["docker","podman","kubectl","nerdctl","docker-compose","stern","flyctl"]);function pn(t,e){let n=G(e);return n==="tail"||n==="journalctl"?Ot.test(t):n==="stern"?!0:dn.has(n)?/\blogs?\b/.test(t)&&Ot.test(t):!1}var it=/^[A-Za-z_][A-Za-z0-9_]*\+?=/,mn=/^[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/,gn=/(?:^|[;&|\n({])\s*[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/;function G(t){let e=t.lastIndexOf("/");return e===-1?t:t.slice(e+1)}function Lt(t){let e=new Array(t.length).fill(!1),n=[],r=0;for(;r<t.length;){let o=t[r],s=t[r+1],i=n[n.length-1];if(i==="'"){o==="'"&&n.pop(),r+=1;continue}if(o==="\\"){if(s===void 0)return null;r+=2;continue}if(i==="$'"){o==="'"&&n.pop(),r+=1;continue}if(o==="$"&&(s==="("||s==="{")){n.push(s==="("?")":"}"),r+=2;continue}if(o==="`"){i==="`"?n.pop():n.push("`"),r+=1;continue}if(i==='"'){o==='"'&&n.pop(),r+=1;continue}if(o==="$"&&s==="'"){n.push("$'"),r+=2;continue}if(o==="'"||o==='"'){n.push(o),r+=1;continue}if(o==="("||o==="{"&&i==="}"){n.push(o==="("?")":"}"),r+=1;continue}if(o===i){n.pop(),r+=1;continue}if(o===")"&&i===void 0)return null;e[r]=i===void 0,r+=1}return n.length===0?e:null}function Rt(t){let e=Lt(t);if(!e)return!0;for(let n=0;n<t.length;n++)if(e[n]&&t[n]===">")return!0;return!1}function ct(t){let e=Lt(t);if(!e)return[{kind:"cmd",text:t,unsafe:!0}];let n=[],r="",o=0,s=()=>{r.length>0&&(n.push({kind:"cmd",text:r}),r="")},i=(c,u)=>{s(),n.push({kind:"sep",text:c}),o+=u};for(;o<t.length;){let c=t[o],u=t[o+1];if(e[o]){if(c===">"&&u==="|"){r+=">|",o+=2;continue}if(c==="&"&&u==="&"){i("&&",2);continue}if(c==="&"&&u!==">"){let l=r.replace(/\s+$/,""),a=l[l.length-1];if(a!==">"&&a!=="<"&&a!=="&"){i("&",1);continue}}if(c==="|"&&u==="|"){i("||",2);continue}if(c==="|"&&u==="&"){i("|&",2);continue}if(c===";"&&u===";"){let l=t[o+2]==="&";i(l?";;&":";;",l?3:2);continue}if(c===";"||c===`
10
- `||c==="|"){i(c,1);continue}}r+=c,o+=1}return s(),n}function jt(t){return t.trim().split(/\s+/)[0]??""}function b(t,e=process.platform){try{let n=Ht(Qe(import.meta.url)),r=e==="win32",o=t&&t!=="claude-code"&&t!=="codex"&&!r?`TOKMIZER_HOST=${t} `:"";if(r&&(!t||t==="claude-code")){let c=f(n,"..","bin","tkr-exec.exe");if(W(c))return nt(c,e)?`'${c.replace(/\\/g,"/").replace(/'/g,"'\\''")}'`:null}let s=f(n,"..","bin","tkr-exec");if(!r&&W(s))return nt(s,e)?`${o}'${s.replace(/'/g,"'\\''")}'`:null;if(z()){let c=r?process.execPath.replace(/\\/g,"/"):process.execPath;return`${o}'${c.replace(/'/g,"'\\''")}' exec`}let i=f(n,"..","bin","tkr-exec.js");return W(i)?`${o}node '${i.replace(/'/g,"'\\''")}'`:null}catch{return null}}function hn(t,e="tkr-exec",n=()=>!0,r){return Ft(t,e,0,n,r)}function Ft(t,e,n,r,o){if(t.includes("<<")||gn.test(t))return t;let s=ct(t),i=[];for(let c=0;c<s.length;c++){let u=s[c];if(u.kind==="sep"||u.unsafe){i.push(u.text);continue}let l=u.text.trim();if(!l){i.push(u.text);continue}let a=jt(l),d=s[c+1],k=d?.kind==="sep"&&(d.text==="|"||d.text==="|&"),g=d?.kind==="sep"&&d.text==="&",w=!k&&!g&&!Rt(u.text)&&!u.text.includes("<(")&&!u.text.includes(">(")?fn(l,e,n,r,o):null;if(w!==null){i.push(`${u.text.match(/^\s*/)?.[0]??""}${w}${u.text.match(/\s*$/)?.[0]??""}`);continue}if(l===e||l.startsWith(e)&&/^\s/.test(l.slice(e.length))||en.has(a)||nn.has(a)||(At.has(a)||At.has(G(a)))&&!sn(l)||it.test(a)||a.startsWith("(")||a.startsWith("#")||a.startsWith("<")||a.startsWith(">")||mn.test(l)||pn(l,a)||a.endsWith(")")||k||g||Rt(u.text)||u.text.includes("<(")||u.text.includes(">(")||a==="node"&&l.includes("tkr-exec.js")||!r(a)){i.push(u.text);continue}let A=u.text.match(/^\s*/)?.[0]??"",_=u.text.match(/\s*$/)?.[0]??"";o?.(l),i.push(`${A}${e} ${l}${_}`)}return i.join("")}var kn=new Set(["command","workdir","timeout_ms","yield_time_ms","max_output_tokens","shell","login","tty","description"]),_n=new Set(["cd","cat","head","tail","ls","tree","find","grep","rg","wc","nl","sort","cut","diff","stat","file","du","df","ps","jq","yq","pwd","which"]),bn=new Set(["log","diff","show","status","blame","ls-files","rev-parse","describe","shortlog"]),wn={find:/^-(?:delete|exec|execdir|ok|okdir|fprint|fls)/,sort:/^(?:-[^-]*o|--output|--compress-program)/,rg:/^(?:--pre|-[^-]*z|--search-zip)/,yq:/^(?:-[^-]*[is]|--inplace|--split-exp)/,file:/^(?:-C|--compile)/,tree:/^(?:-o|--output|-R$|-H$)/,git:/^(?:--output|--ext-diff|--textconv|-c$|--exec-path|--git-dir|--work-tree)/,eslint:/^--fix/},B=["test","run test","run build","run lint","run typecheck"],Sn={npm:new Set(B),pnpm:new Set([...B,"build","lint","typecheck"]),yarn:new Set([...B,"build","lint","typecheck"]),bun:new Set(B),cargo:new Set(["test","build","check","clippy"]),go:new Set(["test","build","vet"]),mvn:new Set(["test","compile","verify"]),gradle:new Set(["test","build","check"]),dotnet:new Set(["test","build"])},yn=new Set(["pytest","tsc","vitest","jest","eslint","mypy"]);function Dt(t,e,n=0){if(/\$|`|<\(|>\(|\\\r?\n/.test(t)||/>/.test(t.replace(/2>&1|[12]?>\s*\/dev\/null/g,"")))return!1;for(let r of ct(t)){if(r.kind==="sep")continue;if(r.unsafe)return!1;let o=n<Nt?It(r.text.trim()):null;if(o){if(!Dt(o.script,e,n+1))return!1;continue}let s=r.text.trim().split(/\s+/).filter(Boolean).map(l=>l.replace(/['"\\]/g,""));if(s.length===0)continue;if(s.some(l=>it.test(l)))return!1;let i=G(s[0]);if(i!==s[0])return!1;let c=wn[i];if(c&&s.slice(1).some(l=>c.test(l)))return!1;if((i==="git"?bn.has(s[1]??""):_n.has(i))||e&&yn.has(i))continue;let u=e?Sn[i]:void 0;if(!(u&&(u.has(s[1]??"")||s[1]==="run"&&u.has(`run ${s[2]??""}`))))return!1}return!0}function Mt(t,e,n=b(e),r=h,o=K(),s=process.env.PATH){if(!m(t)||t.tool_name!=="Bash")return null;let i=t.tool_input;if(!m(i)||i.run_in_background)return null;let c=i.command;if(typeof c!="string"||!c||e==="codex"&&Object.keys(i).some(w=>!kn.has(w)))return null;let u=typeof t.cwd=="string"&&t.cwd?t.cwd:i.workdir,l=typeof u=="string"&&u?u:void 0,a=typeof t.session_id=="string"&&t.session_id?t.session_id:"unknown",d=typeof t.permission_mode=="string"?t.permission_mode:void 0,k=Zt(c,{host:e,sessionId:a,cwd:l,claudeDirs:o,pathEnv:s,permissionMode:d},n,r);if(!k)return null;let g={...i,command:k.command};return JSON.stringify({hookSpecificOutput:e==="codex"?{hookEventName:"PreToolUse",permissionDecision:"allow",updatedInput:g}:k.allowedBy?{hookEventName:"PreToolUse",permissionDecision:"allow",permissionDecisionReason:`Tokmizer: allowed by your rule ${k.allowedBy}`,updatedInput:g}:{hookEventName:"PreToolUse",updatedInput:g}})}function xn(t,e){if(!W(t))return"missing";try{let n=ot(t,"utf8");return JSON.parse(e?Ut(n):n)}catch{return"unreadable"}}function Ut(t){let e="",n=!1;for(let r=0;r<t.length;r++){let o=t[r];if(n){e+=o,o==="\\"?e+=t[++r]??"":o==='"'&&(n=!1);continue}if(o==='"')n=!0,e+=o;else if(o==="/"&&t[r+1]==="/"){for(;r<t.length&&t[r]!==`
6
+ `:"",{mode:384}),ae(i,t)}catch{}}var be="usage.jsonl";var wt=2*1024*1024;function we(){return _e(A(),be)}function k(t,e,n=we()){try{let r=ke(n);he(r)||ge(r,{recursive:!0,mode:448});let o=t.replace(/[^A-Za-z0-9._-]/g,"").slice(0,64)||"unknown";pe(n,`{"t":${Math.floor(Date.now()/1e3)},"s":"${o}","o":${e?1:0}}
7
+ `,{mode:384}),me(n,384),bt(n,wt,wt/2)}catch{}}import{spawnSync as tn}from"node:child_process";import{existsSync as W,readFileSync as ot,readdirSync as st}from"node:fs";import{homedir as C}from"node:os";import{fileURLToPath as en}from"node:url";import{dirname as Nt,join as f,resolve as nn}from"node:path";import{execFileSync as Ue}from"node:child_process";import{mkdirSync as Je,readFileSync as At,renameSync as ze,statSync as Be,writeFileSync as We}from"node:fs";import{join as Et}from"node:path";import{closeSync as Se,openSync as ye,readSync as xe,readdirSync as $e,readFileSync as Ae,statSync as yt}from"node:fs";import{homedir as Ee}from"node:os";import{isAbsolute as ve,join as z,resolve as Oe}from"node:path";var Re=/^[A-Za-z0-9._+@%:,/-]+$/,Te=new Set(["7f454c46","feedface","feedfacf","cefaedfe","cffaedfe","cafebabe","bebafeca"]),Ce=32,Pe=4*1024*1024;function et(t){let e;try{e=ye(t,"r");let n=Buffer.alloc(4),r=xe(e,n,0,4,0);return r>=2&&n[0]===35&&n[1]===33?"#!":r===4?n.toString("hex"):null}catch{return null}finally{e!==void 0&&Se(e)}}function j(t,e=process.platform){try{let n=yt(t);if(!n.isFile())return!1;if(e==="win32")return!0;if((n.mode&73)===0)return!1;let r=et(t);return r==="#!"||r!==null&&Te.has(r)}catch{return!1}}function He(t){if(/\.[A-Za-z0-9]+$/.test(t))return[t];let e=(process.env.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);return[t,...e.map(n=>t+n.toLowerCase())]}function T(t,e,n,r=process.platform){if(!Re.test(t))return!1;let o=r==="win32";if(t.includes("/"))return j(Oe(e??process.cwd(),t),r);if(!n)return!1;let s=o?He(t):[t];for(let i of n.split(o?";":":"))if(!(!i||!ve(i))){for(let c of s)if(j(z(i,c),r))return!0}return!1}var Ne=/^eval \$'([^\s'()=]+) \(\) /,Ie=/^([^\s'"()=]+) \(\) \{$/,Le=/^alias -- ([^\s=]+)=(.*)$/,je=/^# (?:Shell Options|Aliases|Shopt|Check for |Shadow )/,Fe=/^export PATH=(.*)$/,De=/^(?:--colou?r(?:=\S+)?|-G)$/;function St(t){return t.length>=2&&t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1).replace(/'\\''/g,"'"):t.length>=2&&t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t}function Me(t,e){let n="";for(let r of t.split(`
8
+ `)){let o=Fe.exec(r);if(o&&n!=="# Functions"){let s=St(o[1].trim());/[$`\\]/.test(s)||e.paths.push(s);continue}if(r.startsWith("# ")&&(n!=="# Functions"||je.test(r))){n=r;continue}if(n==="# Functions"){let s=Ne.exec(r)??Ie.exec(r);s&&e.functions.add(s[1])}else if(n==="# Aliases"){let s=Le.exec(r);s&&e.aliases.set(s[1],St(s[2].trim()))}}}function tt(t){return t?.code==="ENOENT"}function xt(t){let e={functions:new Set,aliases:new Map,paths:[],uncertain:!1},n=z(t||z(Ee(),".claude"),"shell-snapshots"),r=[];try{for(let o of $e(n)){if(!o.startsWith("snapshot-")||!o.endsWith(".sh"))continue;let s=z(n,o);try{let i=yt(s);i.isFile()&&r.push({path:s,mtime:i.mtimeMs,size:i.size})}catch(i){tt(i)||(e.uncertain=!0)}}}catch(o){return tt(o)||(e.uncertain=!0),e}r=r.sort((o,s)=>s.mtime-o.mtime).slice(0,Ce);for(let o of r)try{if(o.size>Pe)throw new Error("snapshot too large");Me(Ae(o.path,"utf8"),e)}catch(s){tt(s)||(e.uncertain=!0)}return e}function $t(t,e){if(e.uncertain||e.functions.has(t))return!0;let n=e.aliases.get(t);if(n===void 0)return!1;let r=n.trim().split(/\s+/);return r[0]!==t||!r.slice(1).every(o=>De.test(o))}var Ge="exec-probe.json",Ze=6e4;function Ke(){return Et(A(),Ge)}function qe(t){try{let e=JSON.parse(At(t,"utf8"));if(e==null||typeof e!="object")return null;let n=e;return typeof n.key!="string"||typeof n.ok!="boolean"?null:{key:n.key,ok:n.ok,at:typeof n.at=="number"?n.at:0,skipped:typeof n.skipped=="number"&&n.skipped>=0?n.skipped:0}}catch{return null}}function Ye(t,e){try{Je(Et(t,".."),{recursive:!0,mode:448});let n=`${t}.${process.pid}.tmp`;We(n,JSON.stringify(e),{mode:384}),ze(n,t)}catch{}}function Ve(t){try{return Ue(t,["--native-check"],{encoding:"utf8",timeout:2e3,maxBuffer:1024,stdio:["ignore","pipe","ignore"],windowsHide:!0}).startsWith("tokmizer-native ")}catch{return!1}}function Xe(t,e){try{let r=At(t,"utf8").split(`
9
+ `,1)[0].slice(2).trim().split(/\s+/),o=r[0]??"";return o==="/usr/bin/env"?T(r[1]??"",void 0,e):j(o)}catch{return!1}}function Qe(t,e,n){try{let r=Be(t);return[t,r.size,r.mtimeMs,r.ino,r.mode,e?n??"":""].join("|")}catch{return`${t}|missing`}}function nt(t,e=process.platform,n=process.env.PATH,r=Ke(),o=Date.now()){let s=e!=="win32"&&et(t)==="#!",i=Qe(t,s,n),c=qe(r);if(c?.key===i&&(c.ok||o-c.at<Ze))return c.ok;let u=j(t,e)&&(s?Xe(t,n):Ve(t));return Ye(r,{key:i,ok:u,at:o,skipped:(c?.skipped??0)+(u?0:1)}),u}var rn=new Set(["tkr","tkr-exec","token","claude","cd","export","source","echo","mkdir","rm","mv","cp","chmod","ln","true","false",":","test","[","exit","return","nohup","sudo","doas","env"]),on=new Set(["for","while","until","if","then","else","elif","fi","do","done","case","esac","select","function","time","coproc","in","!","[[","]]","{","}",".","declare","typeset","local","readonly","unset","set","shift","trap","wait","read","eval","exec","break","continue","pushd","popd","dirs","alias","unalias","hash","ulimit","umask","getopts","let","shopt","builtin","command","compgen","complete","disown","suspend","jobs","fg","bg","kill","history","fc","bind","enable","caller","type","printf","pwd","times","logout","mapfile","readarray","help","which","print","whence","where","autoload","zmodload","setopt","unsetopt","emulate","noglob","rehash","functions","bindkey","zle","vared","sched","limit","unlimit","zstyle","zparseopts","ttyctl"]),vt=new Set(["sh","bash","zsh","dash","ksh","fish","python","python3","python2","node","ruby","perl","php","awk","sed","deno","bun"]),Ot="(?:dev|start|serve|watch|preview)",sn=new RegExp(`^(?:\\S*/)?(?:bun\\s+(?:install|i|add|remove|rm|update|outdated|audit|test|build|pm|x)(?:\\s|$)|bun\\s+run\\s+(?!${Ot}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|deno\\s+(?:test|lint|fmt|check|compile|install|info|doc|bench|outdated)(?:\\s|$)|deno\\s+task\\s+(?!${Ot}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|php\\s+-l(?:\\s|$)|php\\s+(?:\\S*/)?(?:phpunit|pest|paratest|phpstan|pint|ecs|php-cs-fixer|psalm|rector|run-tests\\.php)(?:\\s|$)|php\\s+artisan\\s+(?!(?:serve|tinker|queue:work|queue:listen|horizon|octane:start|reverb:start|schedule:work|pail|dev)(?:\\s|$))\\S)`),cn=/(?:^|\s)--watch(?:\s|=|$)/;function un(t){return sn.test(t)&&!cn.test(t)}var ln=/^((?:\S*\/)?(sh|bash|zsh|dash|ksh|fish)\s+(-[elux]*c[elux]*)\s+)(['"])/,an=/[()$]|(?:^|[;&|\n]\s*)(?:and|or|not|begin|end|if|else|switch|case|while|for|function|return)(?:\s|;|$)/,It=3;function Lt(t){let e=ln.exec(t);if(!e)return null;let n=e[2]==="fish";if(n&&e[3]!=="-c")return null;let r=e[4],o=e[1].length+1,s=t.indexOf(r,o);if(s<=o)return null;let i=t.slice(s+1);if(i&&!/^\s/.test(i))return null;let c=t.slice(o,s);return r==='"'&&/[$`\\!]/.test(c)||n&&an.test(c)?null:{script:c,start:o,end:s,quote:r}}var fn=new Set(["cd","export","set","unset","source",".","true",":","pushd","popd"]);function dn(t){return ct(t).filter(n=>{if(n.kind!=="cmd"||n.unsafe)return!1;let r=Ft(n.text);return r!==""&&!fn.has(r)&&!it.test(r)}).length>1}function pn(t,e,n,r,o){if(n>=It)return null;let s=Lt(t);if(!s)return null;let{script:i,start:c,end:u,quote:l}=s,a=[],d=Dt(i,e,n+1,r,S=>a.push(S));if(d===i||l==='"'&&/["$`]/.test(d))return null;let x=l==="'"?d.replace(/'/g,"'\\''"):d,m=`${t.slice(0,c)}${x}${t.slice(u)}`,h=dn(i);if(o)for(let S of h?[t,...a]:a)o(S);return h?`${e} ${m}`:m}var Rt=/(?:^|\s)(?:--follow|-[0-9a-zA-Z]*f[a-zA-Z]*)(?:\s|=|$)/,mn=new Set(["docker","podman","kubectl","nerdctl","docker-compose","stern","flyctl"]);function gn(t,e){let n=G(e);return n==="tail"||n==="journalctl"?Rt.test(t):n==="stern"?!0:mn.has(n)?/\blogs?\b/.test(t)&&Rt.test(t):!1}var it=/^[A-Za-z_][A-Za-z0-9_]*\+?=/,hn=/^[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/,kn=/(?:^|[;&|\n({])\s*[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/;function G(t){let e=t.lastIndexOf("/");return e===-1?t:t.slice(e+1)}function jt(t){let e=new Array(t.length).fill(!1),n=[],r=0;for(;r<t.length;){let o=t[r],s=t[r+1],i=n[n.length-1];if(i==="'"){o==="'"&&n.pop(),r+=1;continue}if(o==="\\"){if(s===void 0)return null;r+=2;continue}if(i==="$'"){o==="'"&&n.pop(),r+=1;continue}if(o==="$"&&(s==="("||s==="{")){n.push(s==="("?")":"}"),r+=2;continue}if(o==="`"){i==="`"?n.pop():n.push("`"),r+=1;continue}if(i==='"'){o==='"'&&n.pop(),r+=1;continue}if(o==="$"&&s==="'"){n.push("$'"),r+=2;continue}if(o==="'"||o==='"'){n.push(o),r+=1;continue}if(o==="("||o==="{"&&i==="}"){n.push(o==="("?")":"}"),r+=1;continue}if(o===i){n.pop(),r+=1;continue}if(o===")"&&i===void 0)return null;e[r]=i===void 0,r+=1}return n.length===0?e:null}function Tt(t){let e=jt(t);if(!e)return!0;for(let n=0;n<t.length;n++)if(e[n]&&t[n]===">")return!0;return!1}function ct(t){let e=jt(t);if(!e)return[{kind:"cmd",text:t,unsafe:!0}];let n=[],r="",o=0,s=()=>{r.length>0&&(n.push({kind:"cmd",text:r}),r="")},i=(c,u)=>{s(),n.push({kind:"sep",text:c}),o+=u};for(;o<t.length;){let c=t[o],u=t[o+1];if(e[o]){if(c===">"&&u==="|"){r+=">|",o+=2;continue}if(c==="&"&&u==="&"){i("&&",2);continue}if(c==="&"&&u!==">"){let l=r.replace(/\s+$/,""),a=l[l.length-1];if(a!==">"&&a!=="<"&&a!=="&"){i("&",1);continue}}if(c==="|"&&u==="|"){i("||",2);continue}if(c==="|"&&u==="&"){i("|&",2);continue}if(c===";"&&u===";"){let l=t[o+2]==="&";i(l?";;&":";;",l?3:2);continue}if(c===";"||c===`
10
+ `||c==="|"){i(c,1);continue}}r+=c,o+=1}return s(),n}function Ft(t){return t.trim().split(/\s+/)[0]??""}function b(t,e=process.platform){try{let n=Nt(en(import.meta.url)),r=e==="win32",o=t&&t!=="claude-code"&&t!=="codex"&&!r?`TOKMIZER_HOST=${t} `:"";if(r&&(!t||t==="claude-code")){let c=f(n,"..","bin","tkr-exec.exe");if(W(c))return nt(c,e)?`'${c.replace(/\\/g,"/").replace(/'/g,"'\\''")}'`:null}let s=f(n,"..","bin","tkr-exec");if(!r&&W(s))return nt(s,e)?`${o}'${s.replace(/'/g,"'\\''")}'`:null;if(J()){let c=r?process.execPath.replace(/\\/g,"/"):process.execPath;return`${o}'${c.replace(/'/g,"'\\''")}' exec`}let i=f(n,"..","bin","tkr-exec.js");return W(i)?`${o}node '${i.replace(/'/g,"'\\''")}'`:null}catch{return null}}function _n(t,e="tkr-exec",n=()=>!0,r){return Dt(t,e,0,n,r)}function Dt(t,e,n,r,o){if(t.includes("<<")||kn.test(t))return t;let s=ct(t),i=[];for(let c=0;c<s.length;c++){let u=s[c];if(u.kind==="sep"||u.unsafe){i.push(u.text);continue}let l=u.text.trim();if(!l){i.push(u.text);continue}let a=Ft(l),d=s[c+1],x=d?.kind==="sep"&&(d.text==="|"||d.text==="|&"),m=d?.kind==="sep"&&d.text==="&",h=!x&&!m&&!Tt(u.text)&&!u.text.includes("<(")&&!u.text.includes(">(")?pn(l,e,n,r,o):null;if(h!==null){i.push(`${u.text.match(/^\s*/)?.[0]??""}${h}${u.text.match(/\s*$/)?.[0]??""}`);continue}if(l===e||l.startsWith(e)&&/^\s/.test(l.slice(e.length))||rn.has(a)||on.has(a)||(vt.has(a)||vt.has(G(a)))&&!un(l)||it.test(a)||a.startsWith("(")||a.startsWith("#")||a.startsWith("<")||a.startsWith(">")||hn.test(l)||gn(l,a)||a.endsWith(")")||x||m||Tt(u.text)||u.text.includes("<(")||u.text.includes(">(")||a==="node"&&l.includes("tkr-exec.js")||!r(a)){i.push(u.text);continue}let S=u.text.match(/^\s*/)?.[0]??"",_=u.text.match(/\s*$/)?.[0]??"";o?.(l),i.push(`${S}${e} ${l}${_}`)}return i.join("")}var bn=new Set(["command","workdir","timeout_ms","yield_time_ms","max_output_tokens","shell","login","tty","description"]),wn=new Set(["cd","cat","head","tail","ls","tree","find","grep","rg","wc","nl","sort","cut","diff","stat","file","du","df","ps","jq","yq","pwd","which"]),Sn=new Set(["log","diff","show","status","blame","ls-files","rev-parse","describe","shortlog"]),yn={find:/^-(?:delete|exec|execdir|ok|okdir|fprint|fls)/,sort:/^(?:-[^-]*o|--output|--compress-program)/,rg:/^(?:--pre|-[^-]*z|--search-zip)/,yq:/^(?:-[^-]*[is]|--inplace|--split-exp)/,file:/^(?:-C|--compile)/,tree:/^(?:-o|--output|-R$|-H$)/,git:/^(?:--output|--ext-diff|--textconv|-c$|--exec-path|--git-dir|--work-tree)/,eslint:/^--fix/},B=["test","run test","run build","run lint","run typecheck"],xn={npm:new Set(B),pnpm:new Set([...B,"build","lint","typecheck"]),yarn:new Set([...B,"build","lint","typecheck"]),bun:new Set(B),cargo:new Set(["test","build","check","clippy"]),go:new Set(["test","build","vet"]),mvn:new Set(["test","compile","verify"]),gradle:new Set(["test","build","check"]),dotnet:new Set(["test","build"])},$n=new Set(["pytest","tsc","vitest","jest","eslint","mypy"]);function Mt(t,e,n=0){if(/\$|`|<\(|>\(|\\\r?\n/.test(t)||/>/.test(t.replace(/2>&1|[12]?>\s*\/dev\/null/g,"")))return!1;for(let r of ct(t)){if(r.kind==="sep")continue;if(r.unsafe)return!1;let o=n<It?Lt(r.text.trim()):null;if(o){if(!Mt(o.script,e,n+1))return!1;continue}let s=r.text.trim().split(/\s+/).filter(Boolean).map(l=>l.replace(/['"\\]/g,""));if(s.length===0)continue;if(s.some(l=>it.test(l)))return!1;let i=G(s[0]);if(i!==s[0])return!1;let c=yn[i];if(c&&s.slice(1).some(l=>c.test(l)))return!1;if((i==="git"?Sn.has(s[1]??""):wn.has(i))||e&&$n.has(i))continue;let u=e?xn[i]:void 0;if(!(u&&(u.has(s[1]??"")||s[1]==="run"&&u.has(`run ${s[2]??""}`))))return!1}return!0}function Ut(t,e,n=b(e),r=k,o=K(),s=process.env.PATH,i=ut){if(!g(t)||t.tool_name!=="Bash"||e==="claude-code"&&En(i()))return null;let c=t.tool_input;if(!g(c)||c.run_in_background)return null;let u=c.command;if(typeof u!="string"||!u||e==="codex"&&Object.keys(c).some(S=>!bn.has(S)))return null;let l=typeof t.cwd=="string"&&t.cwd?t.cwd:c.workdir,a=typeof l=="string"&&l?l:void 0,d=typeof t.session_id=="string"&&t.session_id?t.session_id:"unknown",x=typeof t.permission_mode=="string"?t.permission_mode:void 0,m=Kt(u,{host:e,sessionId:d,cwd:a,claudeDirs:o,pathEnv:s,permissionMode:x},n,r);if(!m)return null;let h={...c,command:m.command};return JSON.stringify({hookSpecificOutput:e==="codex"?{hookEventName:"PreToolUse",permissionDecision:"allow",updatedInput:h}:m.allowedBy?{hookEventName:"PreToolUse",permissionDecision:"allow",permissionDecisionReason:`Tokmizer: allowed by your rule ${m.allowedBy}`,updatedInput:h}:{hookEventName:"PreToolUse",updatedInput:h}})}var An=/(?:^|\s)--(?:disallowedTools|disallowed-tools|settings|setting-sources)(?:[=\s]|$)/;function ut(t=process.env,e=process.platform){let n=Number(t.CLAUDE_PID)||process.ppid;if(e==="win32"||!Number.isInteger(n)||n<=1)return null;try{let r=tn("ps",["-ww","-o","args=","-p",String(n)],{encoding:"utf8",timeout:2e3});return r.status===0&&r.stdout.trim()?r.stdout:null}catch{return null}}function En(t){return t===null||An.test(t)}function vn(t,e){if(!W(t))return"missing";try{let n=ot(t,"utf8");return JSON.parse(e?Jt(n):n)}catch{return"unreadable"}}function Jt(t){let e="",n=!1;for(let r=0;r<t.length;r++){let o=t[r];if(n){e+=o,o==="\\"?e+=t[++r]??"":o==='"'&&(n=!1);continue}if(o==='"')n=!0,e+=o;else if(o==="/"&&t[r+1]==="/"){for(;r<t.length&&t[r]!==`
11
11
  `;)r++;e+=`
12
- `}else if(o==="/"&&t[r+1]==="*"){if(r=t.indexOf("*/",r+2),r===-1)return"";r+=1}else e+=o}return e.replace(/,(\s*[}\]])/g,"$1")}function Z(t){let e=[],n=tn(t);for(;;){e.push(n);let r=Ht(n);if(r===n)return e;n=r}}function $n(){let t=process.platform==="darwin"?"/Library/Application Support/ClaudeCode":process.platform==="win32"?"C:\\Program Files\\ClaudeCode":"/etc/claude-code",e=[f(t,"managed-settings.json")];try{for(let n of st(f(t,"managed-settings.d")))n.endsWith(".json")&&e.push(f(t,"managed-settings.d",n))}catch{return e}return e}function D(t,e,n,r){let o=[];for(let s of t){let i=xn(s,e);if(i!=="missing"&&(i==="unreadable"||!m(i)||!n(i,o)))return"unreadable"}return{matchers:o,complete:r}}function F(t){return t===void 0?[]:Array.isArray(t)?t.filter(e=>typeof e=="string"):null}function K(){return{projectDir:process.env.CLAUDE_PROJECT_DIR,configDir:process.env.CLAUDE_CONFIG_DIR}}function vn(t,e){let n=_=>[f(_,"settings.json"),f(_,"settings.local.json")],r=_=>n(f(_,".claude")),o=f(C(),".claude"),s=e.configDir||o,i=[[$n(),"managed"],[[f(s,"settings.json")],"loaded"],[[f(s,"settings.local.json")],"loadedLocal"],[e.configDir?n(o):[],"extra"],[e.projectDir?r(e.projectDir):[],"project"],[Z(t).flatMap(r),"extra"]],c=[],u={managed:[],loaded:[],loadedLocal:[],project:[],extra:[]},l={managed:!1,loaded:!1,loadedLocal:!1,project:!1,extra:!1},a=!1,d="managed",k=(_,Q)=>{let x=_.permissions;if(d==="managed"&&(_.allowManagedPermissionRulesOnly===!0||m(x)&&x.allowManagedPermissionRulesOnly===!0)&&(a=!0),x===void 0)return!0;if(!m(x))return!1;for(let dt of["deny","ask","allow"]){let pt=F(x[dt]);if(!pt)return!1;for(let mt of pt){let R=/^\s*Bash\s*(?:\(([\s\S]*)\))?\s*$/.exec(mt);if(R)if(dt!=="allow")Q.push(O((R[1]??"*").replace(/:\*$/," *")));else if(R[1]===void 0||R[1].trim()==="*")l[d]=!0;else{c.push(O(R[1].replace(/:\*$/," *")));let gt=Fn(R[1]);gt&&u[d].push({rule:mt.trim(),matches:gt})}}}return!0},g=[];for(let[_,Q]of i){d=Q;let x=D(_,!1,k,!0);if(x==="unreadable")return"unreadable";g.push(...x.matchers)}let w=l.managed||(l.loaded||l.loadedLocal)&&!a,A=[...u.managed,...a?[]:u.loaded];return{matchers:[...g,...w?[]:c],complete:!0,allow:c,allowsEverything:w,guards:g,trustedAllow:A}}function An(t){let e=[f(C(),".cursor","cli-config.json"),...Z(t).map(n=>f(n,".cursor","cli.json"))];return D(e,!0,(n,r)=>{let o=n.permissions;if(o===void 0)return!0;if(!m(o))return!1;let s=F(o.deny);if(!s)return!1;for(let i of s){let c=/^\s*Shell\s*(?:\(([\s\S]*)\))?\s*$/.exec(i);if(!c)continue;let u=c[1]??"*",l=u.indexOf(":");r.push(O(l===-1?`${u} *`:`${u.slice(0,l)} ${u.slice(l+1)}`))}return!0},!1)}function En(){return process.platform==="darwin"?"/Library/Application Support/GeminiCli":process.platform==="win32"?"C:\\ProgramData\\gemini-cli":"/etc/gemini-cli"}var zt=/^\s*(?:run_shell_command|ShellTool)\s*(?:\(([\s\S]*)\))?\s*$/;function On(t,e){let n=t.tools;if(n!==void 0&&!m(n))return!1;let r=[F(t.excludeTools),F(m(n)?n.exclude:void 0)];for(let o of r){if(!o)return!1;for(let s of o){let i=zt.exec(s);i&&e.push(O(i[1]===void 0?"*":`${i[1]}*`))}}return!0}function Tt(t){try{return JSON.parse(t)}catch{return null}}function Rn(t){let e=t.trim();if(e.startsWith('"""')||e.startsWith("'''"))return null;if(e.startsWith("[")){if(!/\]\s*(?:#.*)?$/.test(e))return null;let n=[];for(let r of e.matchAll(/"((?:\\.|[^"\\])*)"|'([^']*)'/g)){let o=r[2]??Tt(`"${r[1]}"`);if(o===null)return null;n.push(o)}return n}if(e.startsWith('"')){let n=/^"((?:\\.|[^"\\])*)"/.exec(e);return n?Tt(`"${n[1]}"`):null}if(e.startsWith("'")){let n=/^'([^']*)'/.exec(e);return n?n[1]:null}return e.replace(/\s*#.*$/,"")}function Tn(t,e){for(let n of t.split(/^\s*\[\[\s*rule\s*\]\]\s*$/m).slice(1)){let r={};for(let u of n.split(/\r?\n/)){if(/^\s*\[/.test(u))break;let l=/^\s*([A-Za-z_]+)\s*=\s*(.*)$/.exec(u);if(!l)continue;let a=Rn(l[2]);if(a===null)return!1;r[l[1]]=a}let o=r.decision;if(o!=="deny"&&o!=="ask_user"||!(r.toolName===void 0?["*"]:[r.toolName].flat()).some(u=>u==="*"||zt.test(u)))continue;let i=r.commandPrefix===void 0?[]:[r.commandPrefix].flat(),c=[r.commandRegex,r.argsPattern].flat().filter(u=>typeof u=="string");if(i.length===0&&c.length===0){e.push(()=>!0);continue}for(let u of i)e.push(O(`${u}*`));for(let u of c){let l;try{l=new RegExp(u)}catch{return!1}e.push(a=>l.test(JSON.stringify({command:a}))||ut(l,a))}}return!0}function Ct(t){try{return st(t).filter(e=>e.endsWith(".toml")).map(e=>f(t,e))}catch{return[]}}function Cn(t){let e=En(),n=[f(e,"system-defaults.json"),f(e,"settings.json"),process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH,process.env.GEMINI_CLI_SYSTEM_DEFAULTS_PATH,f(C(),".gemini","settings.json"),...Z(t).map(o=>f(o,".gemini","settings.json"))].filter(o=>!!o),r=D(n,!0,On,!1);if(r==="unreadable")return r;for(let o of[...Ct(f(C(),".gemini","policies")),...Ct(f(e,"policies"))]){let s;try{s=ot(o,"utf8")}catch{return"unreadable"}if(!Tn(s,r.matchers))return"unreadable"}return r}function rt(t,e){if(t===void 0)return!0;if(typeof t=="string")return t!=="allow"&&e.push(()=>!0),!0;if(!m(t))return!1;for(let n of["bash","shell","*"]){let r=t[n];if(r!==void 0){if(typeof r=="string"){r!=="allow"&&e.push(()=>!0);continue}if(!m(r))return!1;for(let[o,s]of Object.entries(r))s!=="allow"&&e.push(O(o.replace(/\?/g,"*")))}}return!0}function Pt(t,e){if(t.permissions!==void 0||!rt(t.permission,e))return!1;for(let n of["agent","agents","mode"]){let r=t[n];if(r!==void 0){if(!m(r))return!1;for(let o of Object.values(r))if(m(o)&&(o.permissions!==void 0||!rt(o.permission,e)))return!1}}return!0}function Pn(t){for(let e of t)for(let n of["agent","agents","mode","modes"]){let r;try{r=st(f(e,n))}catch{continue}for(let o of r)try{if(o.endsWith(".md")&&/permission/i.test(ot(f(e,n,o),"utf8")))return!0}catch{return!0}}return!1}function Hn(t){let e=f(process.env.XDG_CONFIG_HOME||f(C(),".config"),"opencode"),n=Z(t),r=[e,...n.map(c=>f(c,".opencode"))];if(Pn(r))return"unreadable";let o=["opencode.json","opencode.jsonc","config.json"],s=[...o.map(c=>f(e,c)),process.env.OPENCODE_CONFIG,...n.flatMap(c=>[...o.slice(0,2).map(u=>f(c,u)),...o.slice(0,2).map(u=>f(c,".opencode",u))])].filter(c=>!!c),i=D(s,!0,Pt,!0);if(i==="unreadable")return i;for(let c of[process.env.OPENCODE_CONFIG_CONTENT,process.env.OPENCODE_PERMISSION]){if(!c)continue;let u;try{u=JSON.parse(Ut(c))}catch{return"unreadable"}if(!(c===process.env.OPENCODE_PERMISSION?rt(u,i.matchers):m(u)&&Pt(u,i.matchers)))return"unreadable"}return i}function Nn(){return D([f(C(),".gemini","antigravity-cli","settings.json")],!0,(t,e)=>{let n=t.permissions;if(n===void 0)return!0;if(!m(n))return!1;for(let r of["deny","ask"]){let o=F(n[r]);if(!o)return!1;for(let s of o){let i=/^\s*command\s*\(([\s\S]*)\)\s*$/.exec(s);if(!i)continue;let c=i[1].trim();if(!c.startsWith("regex:")){e.push(O(c==="*"?"*":`${c} *`));continue}let u;try{u=new RegExp(c.slice(6))}catch{return!1}e.push(l=>ut(u,l))}}return!0},!1)}function m(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function Jt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function In(t){let e=t.trim().replace(/\s+/g," "),n=e.endsWith(" *")&&e.length>2,r=(n?e.slice(0,-2):e).split("*").map(Jt).join("[\\s\\S]*");return new RegExp(`^${r}${n?"(?: [\\s\\S]*)?":""}(?= |$)`)}var Ln=512;function jn(t){let e=t.replace(/['"\\]/g,"").split(/[\s;&|(){}<>`$]+/).filter(Boolean);return[e,e.map(G)]}function ut(t,e){if(t.test(e)||t.test(e.trim().replace(/\s+/g," ")))return!0;for(let n of jn(e)){if(n.length>Ln)return!0;for(let r=0;r<n.length;r++)if(t.test(n.slice(r).join(" ")))return!0}return!1}function O(t){let e=In(t);return n=>ut(e,n)}function Fn(t){let e=t.trim().replace(/:\*$/," *"),n=e.endsWith(" *"),r=n?e.slice(0,-2):e;if(!r||r.includes("*")||/\s\s|[^\S ]|^ | $/.test(r))return null;let o=new RegExp(`^${Jt(r)}${n?"(?: [\\s\\S]*)?":""}$`);return s=>o.test(s)}var Dn={"claude-code":vn,cursor:An,"gemini-cli":Cn,opencode:Hn,antigravity:Nn},Mn=new Set(["codex"]),Bt=/(?:^|[\s=:/~])\.(?:git|claude|vscode|idea|husky)(?=[/\s;|&)]|$)|(?:^|[\s=:/~])\.(?:bashrc|bash_profile|bash_login|bash_logout|profile|zshrc|zprofile|zshenv|zlogin|zlogout|gitconfig|gitmodules|ripgreprc|mcp\.json)(?![A-Za-z0-9_])/;function Un(t,e,n){let r=Dn[t];return r?r(e??process.cwd(),n):{matchers:[],complete:!1}}function zn(t,e,n){return t==="unreadable"||Bt.test(e.replace(/['"\\]/g,""))||t.matchers.some(r=>r(e))?!1:t.complete||Dt(e,!Mn.has(n))}var Wt=new Set(["default","acceptEdits","dontAsk"]);function Gt(t,e){return e.host!=="claude-code"||e.permissionMode==="bypassPermissions"?!0:t!=="unreadable"&&t.allowsEverything===!0&&Wt.has(e.permissionMode??"")}function Jn(t,e){let n="pathEnv"in t?t.pathEnv:process.env.PATH,r;return o=>t.host!=="claude-code"?T(o,t.cwd,n):(r??=yt(e.configDir),!T(o,t.cwd,n)&&!r.paths.some(s=>T(o,t.cwd,s))?!1:o.includes("/")||!xt(o,r))}var Bn=/^[^\s;&|<>()$`\\{}*?[\]~#!]+(?: [^\s;&|<>()$`\\{}*?[\]~#!]+)*$/;function Wn(t,e,n){return n.host!=="claude-code"||t==="unreadable"||Gt(t,n)||!Wt.has(n.permissionMode??"")||!Bn.test(e)||Bt.test(e.replace(/['"]/g,""))||(t.guards??[]).some(r=>r(e))?null:(t.trustedAllow??[]).find(r=>r.matches(e))?.rule??null}function Zt(t,e,n,r){if(!n||/["\\$`;&|<>(){}]|'\\''/.test(n))return null;let o=e.claudeDirs??K(),s=Un(e.host,e.cwd,o),i=Wn(s,t,e),c=i||zn(s,t,e.host)?hn(t,n,Jn(e,o)):t;return c!==t&&s!=="unreadable"&&(i?(s.guards??[]).some(u=>u(c)):s.matchers.some(u=>u(c))||(s.allow??[]).some(u=>u(c)&&!u(t)))&&(c=t),r(e.sessionId,c!==t),c===t?null:i?{command:c,allowedBy:i}:Gt(s,e)?{command:c}:null}function v(t,e,n,r){return Zt(t,e,n,r)?.command??null}function P(t,e,n="unknown",r=b(e),o=h){return t?v(t,{host:e,sessionId:n},S()?null:r,o):null}function p(t,e){let n=t[e];return typeof n=="string"&&n?n:null}function M(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function Gn(t){return p(t,"prompt_id")||p(t,"scratchpad_dir")?!0:M(t.effort)}function Zn(t){return p(t,"tool_use_id")?.startsWith("toolu_")===!0||/^claude/i.test(p(t,"model")??"")}var Kn=new Set(["BeforeTool","AfterTool","BeforeAgent","AfterAgent","BeforeModel","AfterModel","BeforeToolSelection"]),qn=new Set(["preToolUse","postToolUse","beforeShellExecution","afterShellExecution","beforeSubmitPrompt","sessionStart","sessionEnd","stop"]),Yn=new Set(["pre_tool","post_tool"]),Vn=new Set(["before_tool_call","after_tool_call"]),Xn=new Set(["runTerminalCommand","run_in_terminal"]),Qn=[["codex",t=>p(t,"turn_id")!==null],["claude-code",Gn],["cursor",t=>p(t,"cursor_version")!==null||p(t,"generation_id")!==null||p(t,"conversation_id")!==null||Array.isArray(t.workspace_roots)||qn.has(p(t,"hook_event_name")??"")],["gemini-cli",t=>Kn.has(p(t,"hook_event_name")??"")],["qwen-code",t=>t.hook_event_name==="PreToolUse"&&t.tool_name==="run_shell_command"],["vibe",t=>Yn.has(p(t,"hook_event_name")??"")],["antigravity",t=>M(t.toolCall)],["copilot",t=>p(t,"toolName")!==null&&"toolArgs"in t||Xn.has(p(t,"tool_name")??"")],["grok",t=>t.toolName==="run_terminal_command"||t.tool_name==="run_terminal_command"||M(t.toolInput)&&!("toolArgs"in t)],["droid",t=>t.tool_name==="Execute"],["trae",t=>t.tool_name==="RunCommand"],["crush",t=>t.hook_event_name===void 0&&p(t,"event")!==null&&!Vn.has(p(t,"event"))]],tr=new Set(["codex","antigravity"]);function er(t){return M(t)?Qn.filter(([,e])=>e(t)).map(([e])=>e):[]}function Kt(t,e){if(!M(t))return null;let n=er(t);return n.length>1?null:n.length===1?n[0]:Zn(t)&&tr.has(e)?"claude-code":e==="codex"?null:e}var lt=JSON.stringify({permission:"allow"});function qt(t,e=b("cursor"),n=h){if(t.tool_name!=="Shell")return lt;let r=t.tool_input??{},o=r.command;if(typeof o!="string"||!o)return lt;let s=typeof r.working_directory=="string"?r.working_directory:void 0,i=v(o,{host:"cursor",sessionId:t.conversation_id??"unknown",cwd:s},S()?null:e,n);return i?JSON.stringify({permission:"allow",updated_input:{...r,command:i}}):lt}var q="{}";function Yt(t,e=b("gemini-cli"),n=h){if(t.hook_event_name!=="BeforeTool"||t.tool_name!=="run_shell_command")return q;let r=t.tool_input??{};if(r.is_background)return q;let o=r.command;if(typeof o!="string"||!o)return q;let s=typeof t.cwd=="string"?t.cwd:void 0,i=v(o,{host:"gemini-cli",sessionId:t.session_id??"unknown",cwd:s},S()?null:e,n);return i?JSON.stringify({hookSpecificOutput:{tool_input:{command:i}}}):q}var y="{}",nr=new Set(["runTerminalCommand","run_in_terminal","Bash","bash"]),rr=["run_in_background","is_background","isBackground"];function Y(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function or(t){let e=t.session_id??t.sessionId;return typeof e=="string"&&e?e:"unknown"}function sr(t,e){let n=t.cwd??e.cwd??e.workdir??e.working_directory;return typeof n=="string"&&n?n:void 0}function V(t,e,n,r,o){if(!Y(e)||rr.some(i=>e[i]===!0))return null;let s=e.command;return typeof s!="string"||!s?null:v(s,{host:t,sessionId:or(n),cwd:sr(n,e)},S()?null:r,o)}function N(t,e){return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:{...t,command:e}}})}function ir(t){if(Y(t))return t;if(typeof t!="string")return null;try{let e=JSON.parse(t);return Y(e)?e:null}catch{return null}}function cr(t,e,n){if(typeof t.tool_name=="string"){if(!nr.has(t.tool_name))return y;let s=t.tool_input,i=V("copilot",s,t,e,n);return i?N(s,i):y}if(t.toolName!=="bash")return y;let r=ir(t.toolArgs),o=V("copilot",r,t,e,n);return o?JSON.stringify({modifiedArgs:{...r,command:o}}):y}function H(t,e,n){return(r,o,s)=>{if(r.tool_name!==e)return y;let i=r.tool_input,c=V(t,i,r,o,s);return c?n(i,c):y}}var ur=new Set(["run_terminal_command","Bash","bash"]);function lr(t,e,n){let r=t.toolName??t.tool_name;if(typeof r!="string"||!ur.has(r))return y;let o=t.toolInput??t.tool_input,s=V("grok",o,t,e,n);return s?N(o,s):y}var ar={copilot:cr,droid:H("droid","Execute",N),trae:H("trae","RunCommand",N),"qwen-code":H("qwen-code","run_shell_command",N),crush:H("crush","bash",(t,e)=>JSON.stringify({updated_input:{command:e}})),junie:H("junie","Bash",(t,e)=>JSON.stringify({updatedInput:{...t,command:e}})),zcode:H("zcode","Bash",N),grok:lr};function Vt(t,e,n=b(t),r=h){return Y(e)?ar[t](e,n,r):y}function I(t){return S()?null:b(t)}function fr(t,e,n={}){let r=n.recordUsage??h;switch(t){case"claude-code":case"codex":return e.hook_event_name!==void 0&&e.hook_event_name!=="PreToolUse"?"":Mt(e,t,I(t),r,n.claudeDirs??K(),n.pathEnv??process.env.PATH)??"";case"cursor":return qt(e,I(t),r);case"gemini-cli":return Yt(e,I(t),r);case"vibe":return at(e,(o,s)=>P(o,"vibe",s,I(t),r));case"antigravity":return ft(e,(o,s)=>P(o,"antigravity",s,I(t),r));default:return Vt(t,e,I(t),r)}}function U(t,e,n={}){let r=Kt(t,e);return r?fr(r,t,n):n.fallback??""}var dr=new Set(["bash","file_system.bash"]),X=JSON.stringify({decision:"allow"});function at(t,e=(n,r)=>P(n,"vibe",r)){if(!E(t)||t.hook_event_name!=="pre_tool"||typeof t.tool_name!="string"||!dr.has(t.tool_name))return"";let n=t.tool_input;if(!E(n)||typeof n.command!="string"||!n.command)return"";let r=e(n.command,typeof t.session_id=="string"?t.session_id:"unknown");return r?JSON.stringify({hook_specific_output:{tool_input:{...n,command:r}}}):""}function ft(t,e=(n,r)=>P(n,"antigravity",r)){if(!E(t)||!E(t.toolCall)||t.toolCall.name!=="run_command")return X;let n=t.toolCall.args;if(!E(n)||typeof n.CommandLine!="string"||!n.CommandLine)return X;let r=e(n.CommandLine,typeof t.conversationId=="string"?t.conversationId:"unknown");return r?JSON.stringify({decision:"allow",overwrite:{CommandLine:r}}):X}var Xt={vibe:{build:t=>at(t),fallback:""},antigravity:{build:t=>ft(t),fallback:X}};function Qt(t){return Xt[t??""]?.fallback??""}function pr(t,e){let n=Xt[t??""];if(!n)return"";let r;try{r=JSON.parse(e.replace(/^/,""))}catch{return n.fallback}return E(r)?U(r,t,{fallback:n.fallback}):n.build(r)}async function te(t){process.stdout.write(pr(t,await L()))}te(process.argv[2]).catch(t=>{process.stderr.write(`tkr-agent-hook: ${t.message}
13
- `),process.stdout.write(Qt(process.argv[2])),process.exit(0)});
12
+ `}else if(o==="/"&&t[r+1]==="*"){if(r=t.indexOf("*/",r+2),r===-1)return"";r+=1}else e+=o}return e.replace(/,(\s*[}\]])/g,"$1")}function Z(t){let e=[],n=nn(t);for(;;){e.push(n);let r=Nt(n);if(r===n)return e;n=r}}function On(){let t=process.platform==="darwin"?"/Library/Application Support/ClaudeCode":process.platform==="win32"?"C:\\Program Files\\ClaudeCode":"/etc/claude-code",e=[f(t,"managed-settings.json")];try{for(let n of st(f(t,"managed-settings.d")))n.endsWith(".json")&&e.push(f(t,"managed-settings.d",n))}catch{return e}return e}function D(t,e,n,r){let o=[];for(let s of t){let i=vn(s,e);if(i!=="missing"&&(i==="unreadable"||!g(i)||!n(i,o)))return"unreadable"}return{matchers:o,complete:r}}function F(t){return t===void 0?[]:Array.isArray(t)?t.filter(e=>typeof e=="string"):null}function K(){return{projectDir:process.env.CLAUDE_PROJECT_DIR,configDir:process.env.CLAUDE_CONFIG_DIR}}function Rn(t,e){let n=_=>[f(_,"settings.json"),f(_,"settings.local.json")],r=_=>n(f(_,".claude")),o=f(C(),".claude"),s=e.configDir||o,i=[[On(),"managed"],[[f(s,"settings.json")],"loaded"],[[f(s,"settings.local.json")],"loadedLocal"],[e.configDir?n(o):[],"extra"],[e.projectDir?r(e.projectDir):[],"project"],[Z(t).flatMap(r),"extra"]],c=[],u={managed:[],loaded:[],loadedLocal:[],project:[],extra:[]},l={managed:!1,loaded:!1,loadedLocal:!1,project:!1,extra:!1},a=!1,d="managed",x=(_,Q)=>{let $=_.permissions;if(d==="managed"&&(_.allowManagedPermissionRulesOnly===!0||g($)&&$.allowManagedPermissionRulesOnly===!0)&&(a=!0),$===void 0)return!0;if(!g($))return!1;for(let pt of["deny","ask","allow"]){let mt=F($[pt]);if(!mt)return!1;for(let gt of mt){let R=/^\s*Bash\s*(?:\(([\s\S]*)\))?\s*$/.exec(gt);if(R)if(pt!=="allow")Q.push(O((R[1]??"*").replace(/:\*$/," *")));else if(R[1]===void 0||R[1].trim()==="*")l[d]=!0;else{c.push(O(R[1].replace(/:\*$/," *")));let ht=Jn(R[1]);ht&&u[d].push({rule:gt.trim(),matches:ht})}}}return!0},m=[];for(let[_,Q]of i){d=Q;let $=D(_,!1,x,!0);if($==="unreadable")return"unreadable";m.push(...$.matchers)}let h=l.managed||(l.loaded||l.loadedLocal)&&!a,S=[...u.managed,...a?[]:u.loaded];return{matchers:[...m,...h?[]:c],complete:!0,allow:c,allowsEverything:h,guards:m,trustedAllow:S}}function Tn(t){let e=[f(C(),".cursor","cli-config.json"),...Z(t).map(n=>f(n,".cursor","cli.json"))];return D(e,!0,(n,r)=>{let o=n.permissions;if(o===void 0)return!0;if(!g(o))return!1;let s=F(o.deny);if(!s)return!1;for(let i of s){let c=/^\s*Shell\s*(?:\(([\s\S]*)\))?\s*$/.exec(i);if(!c)continue;let u=c[1]??"*",l=u.indexOf(":");r.push(O(l===-1?`${u} *`:`${u.slice(0,l)} ${u.slice(l+1)}`))}return!0},!1)}function Cn(){return process.platform==="darwin"?"/Library/Application Support/GeminiCli":process.platform==="win32"?"C:\\ProgramData\\gemini-cli":"/etc/gemini-cli"}var zt=/^\s*(?:run_shell_command|ShellTool)\s*(?:\(([\s\S]*)\))?\s*$/;function Pn(t,e){let n=t.tools;if(n!==void 0&&!g(n))return!1;let r=[F(t.excludeTools),F(g(n)?n.exclude:void 0)];for(let o of r){if(!o)return!1;for(let s of o){let i=zt.exec(s);i&&e.push(O(i[1]===void 0?"*":`${i[1]}*`))}}return!0}function Ct(t){try{return JSON.parse(t)}catch{return null}}function Hn(t){let e=t.trim();if(e.startsWith('"""')||e.startsWith("'''"))return null;if(e.startsWith("[")){if(!/\]\s*(?:#.*)?$/.test(e))return null;let n=[];for(let r of e.matchAll(/"((?:\\.|[^"\\])*)"|'([^']*)'/g)){let o=r[2]??Ct(`"${r[1]}"`);if(o===null)return null;n.push(o)}return n}if(e.startsWith('"')){let n=/^"((?:\\.|[^"\\])*)"/.exec(e);return n?Ct(`"${n[1]}"`):null}if(e.startsWith("'")){let n=/^'([^']*)'/.exec(e);return n?n[1]:null}return e.replace(/\s*#.*$/,"")}function Nn(t,e){for(let n of t.split(/^\s*\[\[\s*rule\s*\]\]\s*$/m).slice(1)){let r={};for(let u of n.split(/\r?\n/)){if(/^\s*\[/.test(u))break;let l=/^\s*([A-Za-z_]+)\s*=\s*(.*)$/.exec(u);if(!l)continue;let a=Hn(l[2]);if(a===null)return!1;r[l[1]]=a}let o=r.decision;if(o!=="deny"&&o!=="ask_user"||!(r.toolName===void 0?["*"]:[r.toolName].flat()).some(u=>u==="*"||zt.test(u)))continue;let i=r.commandPrefix===void 0?[]:[r.commandPrefix].flat(),c=[r.commandRegex,r.argsPattern].flat().filter(u=>typeof u=="string");if(i.length===0&&c.length===0){e.push(()=>!0);continue}for(let u of i)e.push(O(`${u}*`));for(let u of c){let l;try{l=new RegExp(u)}catch{return!1}e.push(a=>l.test(JSON.stringify({command:a}))||lt(l,a))}}return!0}function Pt(t){try{return st(t).filter(e=>e.endsWith(".toml")).map(e=>f(t,e))}catch{return[]}}function In(t){let e=Cn(),n=[f(e,"system-defaults.json"),f(e,"settings.json"),process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH,process.env.GEMINI_CLI_SYSTEM_DEFAULTS_PATH,f(C(),".gemini","settings.json"),...Z(t).map(o=>f(o,".gemini","settings.json"))].filter(o=>!!o),r=D(n,!0,Pn,!1);if(r==="unreadable")return r;for(let o of[...Pt(f(C(),".gemini","policies")),...Pt(f(e,"policies"))]){let s;try{s=ot(o,"utf8")}catch{return"unreadable"}if(!Nn(s,r.matchers))return"unreadable"}return r}function rt(t,e){if(t===void 0)return!0;if(typeof t=="string")return t!=="allow"&&e.push(()=>!0),!0;if(!g(t))return!1;for(let n of["bash","shell","*"]){let r=t[n];if(r!==void 0){if(typeof r=="string"){r!=="allow"&&e.push(()=>!0);continue}if(!g(r))return!1;for(let[o,s]of Object.entries(r))s!=="allow"&&e.push(O(o.replace(/\?/g,"*")))}}return!0}function Ht(t,e){if(t.permissions!==void 0||!rt(t.permission,e))return!1;for(let n of["agent","agents","mode"]){let r=t[n];if(r!==void 0){if(!g(r))return!1;for(let o of Object.values(r))if(g(o)&&(o.permissions!==void 0||!rt(o.permission,e)))return!1}}return!0}function Ln(t){for(let e of t)for(let n of["agent","agents","mode","modes"]){let r;try{r=st(f(e,n))}catch{continue}for(let o of r)try{if(o.endsWith(".md")&&/permission/i.test(ot(f(e,n,o),"utf8")))return!0}catch{return!0}}return!1}function jn(t){let e=f(process.env.XDG_CONFIG_HOME||f(C(),".config"),"opencode"),n=Z(t),r=[e,...n.map(c=>f(c,".opencode"))];if(Ln(r))return"unreadable";let o=["opencode.json","opencode.jsonc","config.json"],s=[...o.map(c=>f(e,c)),process.env.OPENCODE_CONFIG,...n.flatMap(c=>[...o.slice(0,2).map(u=>f(c,u)),...o.slice(0,2).map(u=>f(c,".opencode",u))])].filter(c=>!!c),i=D(s,!0,Ht,!0);if(i==="unreadable")return i;for(let c of[process.env.OPENCODE_CONFIG_CONTENT,process.env.OPENCODE_PERMISSION]){if(!c)continue;let u;try{u=JSON.parse(Jt(c))}catch{return"unreadable"}if(!(c===process.env.OPENCODE_PERMISSION?rt(u,i.matchers):g(u)&&Ht(u,i.matchers)))return"unreadable"}return i}function Fn(){return D([f(C(),".gemini","antigravity-cli","settings.json")],!0,(t,e)=>{let n=t.permissions;if(n===void 0)return!0;if(!g(n))return!1;for(let r of["deny","ask"]){let o=F(n[r]);if(!o)return!1;for(let s of o){let i=/^\s*command\s*\(([\s\S]*)\)\s*$/.exec(s);if(!i)continue;let c=i[1].trim();if(!c.startsWith("regex:")){e.push(O(c==="*"?"*":`${c} *`));continue}let u;try{u=new RegExp(c.slice(6))}catch{return!1}e.push(l=>lt(u,l))}}return!0},!1)}function g(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function Bt(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Dn(t){let e=t.trim().replace(/\s+/g," "),n=e.endsWith(" *")&&e.length>2,r=(n?e.slice(0,-2):e).split("*").map(Bt).join("[\\s\\S]*");return new RegExp(`^${r}${n?"(?: [\\s\\S]*)?":""}(?= |$)`)}var Mn=512;function Un(t){let e=t.replace(/['"\\]/g,"").split(/[\s;&|(){}<>`$]+/).filter(Boolean);return[e,e.map(G)]}function lt(t,e){if(t.test(e)||t.test(e.trim().replace(/\s+/g," ")))return!0;for(let n of Un(e)){if(n.length>Mn)return!0;for(let r=0;r<n.length;r++)if(t.test(n.slice(r).join(" ")))return!0}return!1}function O(t){let e=Dn(t);return n=>lt(e,n)}function Jn(t){let e=t.trim().replace(/:\*$/," *"),n=e.endsWith(" *"),r=n?e.slice(0,-2):e;if(!r||r.includes("*")||/\s\s|[^\S ]|^ | $/.test(r))return null;let o=new RegExp(`^${Bt(r)}${n?"(?: [\\s\\S]*)?":""}$`);return s=>o.test(s)}var zn={"claude-code":Rn,cursor:Tn,"gemini-cli":In,opencode:jn,antigravity:Fn},Bn=new Set(["codex"]),Wt=/(?:^|[\s=:/~])\.(?:git|claude|vscode|idea|husky)(?=[/\s;|&)]|$)|(?:^|[\s=:/~])\.(?:bashrc|bash_profile|bash_login|bash_logout|profile|zshrc|zprofile|zshenv|zlogin|zlogout|gitconfig|gitmodules|ripgreprc|mcp\.json)(?![A-Za-z0-9_])/;function Wn(t,e,n){let r=zn[t];return r?r(e??process.cwd(),n):{matchers:[],complete:!1}}function Gn(t,e,n){return t==="unreadable"||Wt.test(e.replace(/['"\\]/g,""))||t.matchers.some(r=>r(e))?!1:t.complete||Mt(e,!Bn.has(n))}var Gt=new Set(["default","acceptEdits","dontAsk"]);function Zt(t,e){return e.host!=="claude-code"||e.permissionMode==="bypassPermissions"?!0:t!=="unreadable"&&t.allowsEverything===!0&&Gt.has(e.permissionMode??"")}function Zn(t,e){let n="pathEnv"in t?t.pathEnv:process.env.PATH,r;return o=>t.host!=="claude-code"?T(o,t.cwd,n):(r??=xt(e.configDir),!T(o,t.cwd,n)&&!r.paths.some(s=>T(o,t.cwd,s))?!1:o.includes("/")||!$t(o,r))}var Kn=/^[^\s;&|<>()$`\\{}*?[\]~#!]+(?: [^\s;&|<>()$`\\{}*?[\]~#!]+)*$/;function qn(t,e,n){return n.host!=="claude-code"||t==="unreadable"||Zt(t,n)||!Gt.has(n.permissionMode??"")||!Kn.test(e)||Wt.test(e.replace(/['"]/g,""))||(t.guards??[]).some(r=>r(e))?null:(t.trustedAllow??[]).find(r=>r.matches(e))?.rule??null}function Kt(t,e,n,r){if(!n||/["\\$`;&|<>(){}]|'\\''/.test(n))return null;let o=e.claudeDirs??K(),s=Wn(e.host,e.cwd,o),i=qn(s,t,e),c=i||Gn(s,t,e.host)?_n(t,n,Zn(e,o)):t;return c!==t&&s!=="unreadable"&&(i?(s.guards??[]).some(u=>u(c)):s.matchers.some(u=>u(c))||(s.allow??[]).some(u=>u(c)&&!u(t)))&&(c=t),r(e.sessionId,c!==t),c===t?null:i?{command:c,allowedBy:i}:Zt(s,e)?{command:c}:null}function E(t,e,n,r){return Kt(t,e,n,r)?.command??null}function P(t,e,n="unknown",r=b(e),o=k){return t?E(t,{host:e,sessionId:n},w()?null:r,o):null}function p(t,e){let n=t[e];return typeof n=="string"&&n?n:null}function M(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function Yn(t){return p(t,"prompt_id")||p(t,"scratchpad_dir")?!0:M(t.effort)}function Vn(t){return p(t,"tool_use_id")?.startsWith("toolu_")===!0||/^claude/i.test(p(t,"model")??"")}var Xn=new Set(["BeforeTool","AfterTool","BeforeAgent","AfterAgent","BeforeModel","AfterModel","BeforeToolSelection"]),Qn=new Set(["preToolUse","postToolUse","beforeShellExecution","afterShellExecution","beforeSubmitPrompt","sessionStart","sessionEnd","stop"]),tr=new Set(["pre_tool","post_tool"]),er=new Set(["before_tool_call","after_tool_call"]),nr=new Set(["runTerminalCommand","run_in_terminal"]),rr=[["codex",t=>p(t,"turn_id")!==null],["claude-code",Yn],["cursor",t=>p(t,"cursor_version")!==null||p(t,"generation_id")!==null||p(t,"conversation_id")!==null||Array.isArray(t.workspace_roots)||Qn.has(p(t,"hook_event_name")??"")],["gemini-cli",t=>Xn.has(p(t,"hook_event_name")??"")],["qwen-code",t=>t.hook_event_name==="PreToolUse"&&t.tool_name==="run_shell_command"],["vibe",t=>tr.has(p(t,"hook_event_name")??"")],["antigravity",t=>M(t.toolCall)],["copilot",t=>p(t,"toolName")!==null&&"toolArgs"in t||nr.has(p(t,"tool_name")??"")],["grok",t=>t.toolName==="run_terminal_command"||t.tool_name==="run_terminal_command"||M(t.toolInput)&&!("toolArgs"in t)],["droid",t=>t.tool_name==="Execute"],["trae",t=>t.tool_name==="RunCommand"],["crush",t=>t.hook_event_name===void 0&&p(t,"event")!==null&&!er.has(p(t,"event"))]],or=new Set(["codex","antigravity"]);function sr(t){return M(t)?rr.filter(([,e])=>e(t)).map(([e])=>e):[]}function qt(t,e){if(!M(t))return null;let n=sr(t);return n.length>1?null:n.length===1?n[0]:Vn(t)&&or.has(e)?"claude-code":e==="codex"?null:e}var at=JSON.stringify({permission:"allow"});function Yt(t,e=b("cursor"),n=k){if(t.tool_name!=="Shell")return at;let r=t.tool_input??{},o=r.command;if(typeof o!="string"||!o)return at;let s=typeof r.working_directory=="string"?r.working_directory:void 0,i=E(o,{host:"cursor",sessionId:t.conversation_id??"unknown",cwd:s},w()?null:e,n);return i?JSON.stringify({permission:"allow",updated_input:{...r,command:i}}):at}var q="{}";function Vt(t,e=b("gemini-cli"),n=k){if(t.hook_event_name!=="BeforeTool"||t.tool_name!=="run_shell_command")return q;let r=t.tool_input??{};if(r.is_background)return q;let o=r.command;if(typeof o!="string"||!o)return q;let s=typeof t.cwd=="string"?t.cwd:void 0,i=E(o,{host:"gemini-cli",sessionId:t.session_id??"unknown",cwd:s},w()?null:e,n);return i?JSON.stringify({hookSpecificOutput:{tool_input:{command:i}}}):q}var y="{}",ir=new Set(["runTerminalCommand","run_in_terminal","Bash","bash"]),cr=["run_in_background","is_background","isBackground"];function Y(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function ur(t){let e=t.session_id??t.sessionId;return typeof e=="string"&&e?e:"unknown"}function lr(t,e){let n=t.cwd??e.cwd??e.workdir??e.working_directory;return typeof n=="string"&&n?n:void 0}function V(t,e,n,r,o){if(!Y(e)||cr.some(i=>e[i]===!0))return null;let s=e.command;return typeof s!="string"||!s?null:E(s,{host:t,sessionId:ur(n),cwd:lr(n,e)},w()?null:r,o)}function N(t,e){return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:{...t,command:e}}})}function ar(t){if(Y(t))return t;if(typeof t!="string")return null;try{let e=JSON.parse(t);return Y(e)?e:null}catch{return null}}function fr(t,e,n){if(typeof t.tool_name=="string"){if(!ir.has(t.tool_name))return y;let s=t.tool_input,i=V("copilot",s,t,e,n);return i?N(s,i):y}if(t.toolName!=="bash")return y;let r=ar(t.toolArgs),o=V("copilot",r,t,e,n);return o?JSON.stringify({modifiedArgs:{...r,command:o}}):y}function H(t,e,n){return(r,o,s)=>{if(r.tool_name!==e)return y;let i=r.tool_input,c=V(t,i,r,o,s);return c?n(i,c):y}}var dr=new Set(["run_terminal_command","Bash","bash"]);function pr(t,e,n){let r=t.toolName??t.tool_name;if(typeof r!="string"||!dr.has(r))return y;let o=t.toolInput??t.tool_input,s=V("grok",o,t,e,n);return s?N(o,s):y}var mr={copilot:fr,droid:H("droid","Execute",N),trae:H("trae","RunCommand",N),"qwen-code":H("qwen-code","run_shell_command",N),crush:H("crush","bash",(t,e)=>JSON.stringify({updated_input:{command:e}})),junie:H("junie","Bash",(t,e)=>JSON.stringify({updatedInput:{...t,command:e}})),zcode:H("zcode","Bash",N),grok:pr};function Xt(t,e,n=b(t),r=k){return Y(e)?mr[t](e,n,r):y}function I(t){return w()?null:b(t)}function gr(t,e,n={}){let r=n.recordUsage??k;switch(t){case"claude-code":case"codex":return e.hook_event_name!==void 0&&e.hook_event_name!=="PreToolUse"?"":Ut(e,t,I(t),r,n.claudeDirs??K(),n.pathEnv??process.env.PATH,n.launchArgs??ut)??"";case"cursor":return Yt(e,I(t),r);case"gemini-cli":return Vt(e,I(t),r);case"vibe":return ft(e,(o,s)=>P(o,"vibe",s,I(t),r));case"antigravity":return dt(e,(o,s)=>P(o,"antigravity",s,I(t),r));default:return Xt(t,e,I(t),r)}}function U(t,e,n={}){let r=qt(t,e);return r?gr(r,t,n):n.fallback??""}var hr=new Set(["bash","file_system.bash"]),X=JSON.stringify({decision:"allow"});function ft(t,e=(n,r)=>P(n,"vibe",r)){if(!v(t)||t.hook_event_name!=="pre_tool"||typeof t.tool_name!="string"||!hr.has(t.tool_name))return"";let n=t.tool_input;if(!v(n)||typeof n.command!="string"||!n.command)return"";let r=e(n.command,typeof t.session_id=="string"?t.session_id:"unknown");return r?JSON.stringify({hook_specific_output:{tool_input:{...n,command:r}}}):""}function dt(t,e=(n,r)=>P(n,"antigravity",r)){if(!v(t)||!v(t.toolCall)||t.toolCall.name!=="run_command")return X;let n=t.toolCall.args;if(!v(n)||typeof n.CommandLine!="string"||!n.CommandLine)return X;let r=e(n.CommandLine,typeof t.conversationId=="string"?t.conversationId:"unknown");return r?JSON.stringify({decision:"allow",overwrite:{CommandLine:r}}):X}var Qt={vibe:{build:t=>ft(t),fallback:""},antigravity:{build:t=>dt(t),fallback:X}};function te(t){return Qt[t??""]?.fallback??""}function kr(t,e){let n=Qt[t??""];if(!n)return"";let r;try{r=JSON.parse(e.replace(/^/,""))}catch{return n.fallback}return v(r)?U(r,t,{fallback:n.fallback}):n.build(r)}async function ee(t){process.stdout.write(kr(t,await L()))}ee(process.argv[2]).catch(t=>{process.stderr.write(`tkr-agent-hook: ${t.message}
13
+ `),process.stdout.write(te(process.argv[2])),process.exit(0)});