@tokmizer/plugin 0.9.57 → 0.9.58

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.
Files changed (56) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +165 -6
  3. package/agent-plugins/amp.js +38 -0
  4. package/agent-plugins/hermes/__init__.py +39 -0
  5. package/agent-plugins/hermes/plugin.yaml +5 -0
  6. package/agent-plugins/kilo.js +40 -0
  7. package/agent-plugins/omp.js +32 -0
  8. package/agent-plugins/openclaw/index.js +39 -0
  9. package/agent-plugins/openclaw/openclaw.plugin.json +12 -0
  10. package/agent-plugins/openclaw/package.json +11 -0
  11. package/agent-plugins/opencode.js +40 -0
  12. package/agent-plugins/pi.js +30 -0
  13. package/codex-plugin/plugin.json +1 -1
  14. package/command-templates/tkr-gain.md +7 -2
  15. package/command-templates/tkr-status.md +5 -1
  16. package/command-templates/tkr-telemetry.md +3 -3
  17. package/command-templates/tkr-unlink.md +2 -2
  18. package/dist/bin/tkr-agent-hook.js +11 -0
  19. package/dist/bin/tkr-codex-hook.js +131 -40
  20. package/dist/bin/tkr-copilot-hook.js +11 -0
  21. package/dist/bin/tkr-crush-hook.js +11 -0
  22. package/dist/bin/tkr-cursor-hook.js +11 -0
  23. package/dist/bin/tkr-daemon.js +161 -55
  24. package/dist/bin/tkr-droid-hook.js +11 -0
  25. package/dist/bin/tkr-exec +135 -42
  26. package/dist/bin/tkr-exec.js +135 -42
  27. package/dist/bin/tkr-gemini-hook.js +11 -0
  28. package/dist/bin/tkr-grok-hook.js +11 -0
  29. package/dist/bin/tkr-junie-hook.js +11 -0
  30. package/dist/bin/tkr-processor.js +162 -0
  31. package/dist/bin/tkr-qwen-hook.js +11 -0
  32. package/dist/bin/tkr-shim.js +131 -38
  33. package/dist/bin/tkr-trae-hook.js +11 -0
  34. package/dist/bin/tkr-zcode-hook.js +11 -0
  35. package/dist/bin/tkr.js +356 -151
  36. package/dist/hooks-host/post-tool-use.js +144 -48
  37. package/dist/hooks-host/pre-tool-use.js +8 -7
  38. package/dist/hooks-host/reducer-prompt-submit.js +1 -1
  39. package/dist/hooks-host/reducer-session-start.js +1 -1
  40. package/dist/hooks-host/reducer-stop.js +25 -16
  41. package/dist/hooks-host/session-recap.js +4 -3
  42. package/dist/index.js +125 -39
  43. package/dist/native/manifest.json +18 -8
  44. package/dist/native/single.json +38 -0
  45. package/dist/native/tkr-exec-darwin-arm64 +0 -0
  46. package/dist/native/tkr-exec-darwin-x64 +0 -0
  47. package/dist/native/tkr-exec-linux-arm64 +0 -0
  48. package/dist/native/tkr-exec-linux-x64 +0 -0
  49. package/dist/native/tkr-exec-win32-arm64.exe +0 -0
  50. package/dist/native/tkr-exec-win32-x64.exe +0 -0
  51. package/hooks/on-session-start.d.mts +1 -0
  52. package/hooks/on-session-start.mjs +25 -8
  53. package/package.json +24 -2
  54. package/scripts/README-INSTALL.md +13 -5
  55. package/scripts/install-mac-linux.sh +72 -6
  56. package/scripts/install-native.mjs +164 -25
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __tkrCreateRequire } from "node:module"; const require = __tkrCreateRequire(import.meta.url);
3
+ async function v(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf8")}import{appendFileSync as ge,chmodSync as me,mkdirSync as he,existsSync as ke,readFileSync as $t,rmSync as At}from"node:fs";import{dirname as Se,join as xe}from"node:path";import ue from"node:os";import{join as le}from"node:path";function P(){return process.env.TOKMIZER_HOME||le(ue.homedir(),".tokmizer")}import{readFileSync as ae,renameSync as fe,statSync as de,writeFileSync as pe}from"node:fs";function H(e,t,n){try{if(de(e).size<=t)return;let r=ae(e,"utf8").split(`
4
+ `).filter(c=>c.trim()!==""),s=[],i=0;for(let c=r.length-1;c>=0;c-=1){let u=r[c],l=Buffer.byteLength(u)+1;if(i+l>n)break;s.push(u),i+=l}s.reverse();let o=`${e}.tmp-${process.pid}`;pe(o,s.length?`${s.join(`
5
+ `)}
6
+ `:"",{mode:384}),fe(o,e)}catch{}}var be="usage.jsonl";var L=2*1024*1024;function ye(){return xe(P(),be)}function $(e,t,n=ye()){try{let r=Se(n);ke(r)||he(r,{recursive:!0,mode:448});let s=e.replace(/[^A-Za-z0-9._-]/g,"").slice(0,64)||"unknown";ge(n,`{"t":${Math.floor(Date.now()/1e3)},"s":"${s}","o":${t?1:0}}
7
+ `,{mode:384}),me(n,384),H(n,L,L/2)}catch{}}import{existsSync as w,readFileSync as I,readdirSync as C}from"node:fs";import{homedir as g}from"node:os";import{fileURLToPath as we}from"node:url";import{dirname as Z,join as a,resolve as _e}from"node:path";function M(){return!1}var Ee=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"]),Re=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"]),F=new Set(["sh","bash","zsh","dash","ksh","fish","python","python3","python2","node","ruby","perl","php","awk","sed","deno","bun"]),J="(?:dev|start|serve|watch|preview)",Oe=new RegExp(`^(?:\\S*/)?(?:bun\\s+(?:install|i|add|remove|rm|update|outdated|audit|test|build|pm|x)(?:\\s|$)|bun\\s+run\\s+(?!${J}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|deno\\s+(?:test|lint|fmt|check|compile|install|info|doc|bench|outdated)(?:\\s|$)|deno\\s+task\\s+(?!${J}(?:\\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)`),$e=/(?:^|\s)--watch(?:\s|=|$)/;function Ae(e){return Oe.test(e)&&!$e.test(e)}var Ie=/^((?:\S*\/)?(sh|bash|zsh|dash|ksh|fish)\s+(-[elux]*c[elux]*)\s+)(['"])/,Ce=/[()$]|(?:^|[;&|\n]\s*)(?:and|or|not|begin|end|if|else|switch|case|while|for|function|return)(?:\s|;|$)/,q=3;function K(e){let t=Ie.exec(e);if(!t)return null;let n=t[2]==="fish";if(n&&t[3]!=="-c")return null;let r=t[4],s=t[1].length+1,i=e.indexOf(r,s);if(i<=s)return null;let o=e.slice(i+1);if(o&&!/^\s/.test(o))return null;let c=e.slice(s,i);return r==='"'&&/[$`\\!]/.test(c)||n&&Ce.test(c)?null:{script:c,start:s,end:i,quote:r}}var Ne=new Set(["cd","export","set","unset","source",".","true",":","pushd","popd"]);function Te(e){return T(e).filter(n=>{if(n.kind!=="cmd"||n.unsafe)return!1;let r=X(n.text);return r!==""&&!Ne.has(r)&&!N.test(r)}).length>1}function je(e,t,n){if(n>=q)return null;let r=K(e);if(!r)return null;let{script:s,start:i,end:o,quote:c}=r,u=Q(s,t,n+1);if(u===s||c==='"'&&/["$`]/.test(u))return null;let l=c==="'"?u.replace(/'/g,"'\\''"):u,f=`${e.slice(0,i)}${l}${e.slice(o)}`;return Te(s)?`${t} ${f}`:f}var U=/(?:^|\s)(?:--follow|-[0-9a-zA-Z]*f[a-zA-Z]*)(?:\s|=|$)/,De=new Set(["docker","podman","kubectl","nerdctl","docker-compose","stern","flyctl"]);function ve(e,t){let n=_(t);return n==="tail"||n==="journalctl"?U.test(e):n==="stern"?!0:De.has(n)?/\blogs?\b/.test(e)&&U.test(e):!1}var N=/^[A-Za-z_][A-Za-z0-9_]*\+?=/,Pe=/^[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/,He=/(?:^|[;&|\n({])\s*[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/;function _(e){let t=e.lastIndexOf("/");return t===-1?e:e.slice(t+1)}function Y(e){let t=new Array(e.length).fill(!1),n=[],r=0;for(;r<e.length;){let s=e[r],i=e[r+1],o=n[n.length-1];if(o==="'"){s==="'"&&n.pop(),r+=1;continue}if(s==="\\"){if(i===void 0)return null;r+=2;continue}if(o==="$'"){s==="'"&&n.pop(),r+=1;continue}if(s==="$"&&(i==="("||i==="{")){n.push(i==="("?")":"}"),r+=2;continue}if(s==="`"){o==="`"?n.pop():n.push("`"),r+=1;continue}if(o==='"'){s==='"'&&n.pop(),r+=1;continue}if(s==="$"&&i==="'"){n.push("$'"),r+=2;continue}if(s==="'"||s==='"'){n.push(s),r+=1;continue}if(s==="("||s==="{"&&o==="}"){n.push(s==="("?")":"}"),r+=1;continue}if(s===o){n.pop(),r+=1;continue}if(s===")"&&o===void 0)return null;t[r]=o===void 0,r+=1}return n.length===0?t:null}function z(e){let t=Y(e);if(!t)return!0;for(let n=0;n<e.length;n++)if(t[n]&&e[n]===">")return!0;return!1}function T(e){let t=Y(e);if(!t)return[{kind:"cmd",text:e,unsafe:!0}];let n=[],r="",s=0,i=()=>{r.length>0&&(n.push({kind:"cmd",text:r}),r="")},o=(c,u)=>{i(),n.push({kind:"sep",text:c}),s+=u};for(;s<e.length;){let c=e[s],u=e[s+1];if(t[s]){if(c===">"&&u==="|"){r+=">|",s+=2;continue}if(c==="&"&&u==="&"){o("&&",2);continue}if(c==="&"&&u!==">"){let l=r.replace(/\s+$/,""),f=l[l.length-1];if(f!==">"&&f!=="<"&&f!=="&"){o("&",1);continue}}if(c==="|"&&u==="|"){o("||",2);continue}if(c==="|"&&u==="&"){o("|&",2);continue}if(c===";"&&u===";"){let l=e[s+2]==="&";o(l?";;&":";;",l?3:2);continue}if(c===";"||c===`
8
+ `||c==="|"){o(c,1);continue}}r+=c,s+=1}return i(),n}function X(e){return e.trim().split(/\s+/)[0]??""}function V(e,t=process.platform){try{let n=Z(we(import.meta.url)),r=t==="win32",s=e&&e!=="claude-code"&&e!=="codex"&&!r?`TOKMIZER_HOST=${e} `:"";if(r&&(!e||e==="claude-code")){let c=a(n,"..","bin","tkr-exec.exe");if(w(c))return`'${c.replace(/\\/g,"/").replace(/'/g,"'\\''")}'`}let i=a(n,"..","bin","tkr-exec");if(!r&&w(i))return`${s}'${i.replace(/'/g,"'\\''")}'`;if(M()){let c=r?process.execPath.replace(/\\/g,"/"):process.execPath;return`${s}'${c.replace(/'/g,"'\\''")}' exec`}let o=a(n,"..","bin","tkr-exec.js");return w(o)?`${s}node '${o.replace(/'/g,"'\\''")}'`:null}catch{return null}}function Le(e,t="tkr-exec"){return Q(e,t,0)}function Q(e,t,n){if(e.includes("<<")||He.test(e))return e;let r=T(e),s=[];for(let i=0;i<r.length;i++){let o=r[i];if(o.kind==="sep"||o.unsafe){s.push(o.text);continue}let c=o.text.trim();if(!c){s.push(o.text);continue}let u=X(c),l=r[i+1],f=l?.kind==="sep"&&(l.text==="|"||l.text==="|&"),S=l?.kind==="sep"&&l.text==="&",D=!f&&!S&&!z(o.text)&&!o.text.includes("<(")&&!o.text.includes(">(")?je(c,t,n):null;if(D!==null){s.push(`${o.text.match(/^\s*/)?.[0]??""}${D}${o.text.match(/\s*$/)?.[0]??""}`);continue}if(c===t||c.startsWith(t)&&/^\s/.test(c.slice(t.length))||Ee.has(u)||Re.has(u)||(F.has(u)||F.has(_(u)))&&!Ae(c)||N.test(u)||u.startsWith("(")||u.startsWith("#")||u.startsWith("<")||u.startsWith(">")||Pe.test(c)||ve(c,u)||u.endsWith(")")||f||S||z(o.text)||o.text.includes("<(")||o.text.includes(">(")||u==="node"&&c.includes("tkr-exec.js")){s.push(o.text);continue}let ie=o.text.match(/^\s*/)?.[0]??"",ce=o.text.match(/\s*$/)?.[0]??"";s.push(`${ie}${t} ${c}${ce}`)}return s.join("")}var Me=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"]),Fe=new Set(["log","diff","show","status","blame","ls-files","rev-parse","describe","shortlog"]),Je={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/},y=["test","run test","run build","run lint","run typecheck"],Ue={npm:new Set(y),pnpm:new Set([...y,"build","lint","typecheck"]),yarn:new Set([...y,"build","lint","typecheck"]),bun:new Set(y),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"])},ze=new Set(["pytest","tsc","vitest","jest","eslint","mypy"]);function ee(e,t,n=0){if(/\$|`|<\(|>\(|\\\r?\n/.test(e)||/>/.test(e.replace(/2>&1|[12]?>\s*\/dev\/null/g,"")))return!1;for(let r of T(e)){if(r.kind==="sep")continue;if(r.unsafe)return!1;let s=n<q?K(r.text.trim()):null;if(s){if(!ee(s.script,t,n+1))return!1;continue}let i=r.text.trim().split(/\s+/).filter(Boolean).map(l=>l.replace(/['"\\]/g,""));if(i.length===0)continue;if(i.some(l=>N.test(l)))return!1;let o=_(i[0]);if(o!==i[0])return!1;let c=Je[o];if(c&&i.slice(1).some(l=>c.test(l)))return!1;if((o==="git"?Fe.has(i[1]??""):Me.has(o))||t&&ze.has(o))continue;let u=t?Ue[o]:void 0;if(!(u&&(u.has(i[1]??"")||i[1]==="run"&&u.has(`run ${i[2]??""}`))))return!1}return!0}function We(e,t){if(!w(e))return"missing";try{let n=I(e,"utf8");return JSON.parse(t?te(n):n)}catch{return"unreadable"}}function te(e){let t="",n=!1;for(let r=0;r<e.length;r++){let s=e[r];if(n){t+=s,s==="\\"?t+=e[++r]??"":s==='"'&&(n=!1);continue}if(s==='"')n=!0,t+=s;else if(s==="/"&&e[r+1]==="/"){for(;r<e.length&&e[r]!==`
9
+ `;)r++;t+=`
10
+ `}else if(s==="/"&&e[r+1]==="*"){if(r=e.indexOf("*/",r+2),r===-1)return"";r+=1}else t+=s}return t.replace(/,(\s*[}\]])/g,"$1")}function E(e){let t=[],n=_e(e);for(;;){t.push(n);let r=Z(n);if(r===n)return t;n=r}}function Be(){let e=process.platform==="darwin"?"/Library/Application Support/ClaudeCode":process.platform==="win32"?"C:\\Program Files\\ClaudeCode":"/etc/claude-code",t=[a(e,"managed-settings.json")];try{for(let n of C(a(e,"managed-settings.d")))n.endsWith(".json")&&t.push(a(e,"managed-settings.d",n))}catch{return t}return t}function b(e,t,n,r){let s=[];for(let i of e){let o=We(i,t);if(o!=="missing"&&(o==="unreadable"||!p(o)||!n(o,s)))return"unreadable"}return{matchers:s,complete:r}}function x(e){return e===void 0?[]:Array.isArray(e)?e.filter(t=>typeof t=="string"):null}function ne(){return{projectDir:process.env.CLAUDE_PROJECT_DIR,configDir:process.env.CLAUDE_CONFIG_DIR}}function Ge(e,t){let n=[a(g(),".claude"),t.configDir].filter(i=>!!i),r=[t.projectDir,...E(e)].filter(i=>!!i),s=[...Be(),...n.flatMap(i=>[a(i,"settings.json"),a(i,"settings.local.json")]),...r.flatMap(i=>[a(i,".claude","settings.json"),a(i,".claude","settings.local.json")])];return b(s,!1,(i,o)=>{let c=i.permissions;if(c===void 0)return!0;if(!p(c))return!1;for(let u of["deny","ask"]){let l=x(c[u]);if(!l)return!1;for(let f of l){let S=/^\s*Bash\s*(?:\(([\s\S]*)\))?\s*$/.exec(f);S&&o.push(m((S[1]??"*").replace(/:\*$/," *")))}}return!0},!0)}function Ze(e){let t=[a(g(),".cursor","cli-config.json"),...E(e).map(n=>a(n,".cursor","cli.json"))];return b(t,!0,(n,r)=>{let s=n.permissions;if(s===void 0)return!0;if(!p(s))return!1;let i=x(s.deny);if(!i)return!1;for(let o of i){let c=/^\s*Shell\s*(?:\(([\s\S]*)\))?\s*$/.exec(o);if(!c)continue;let u=c[1]??"*",l=u.indexOf(":");r.push(m(l===-1?`${u} *`:`${u.slice(0,l)} ${u.slice(l+1)}`))}return!0},!1)}function qe(){return process.platform==="darwin"?"/Library/Application Support/GeminiCli":process.platform==="win32"?"C:\\ProgramData\\gemini-cli":"/etc/gemini-cli"}var re=/^\s*(?:run_shell_command|ShellTool)\s*(?:\(([\s\S]*)\))?\s*$/;function Ke(e,t){let n=e.tools;if(n!==void 0&&!p(n))return!1;let r=[x(e.excludeTools),x(p(n)?n.exclude:void 0)];for(let s of r){if(!s)return!1;for(let i of s){let o=re.exec(i);o&&t.push(m(o[1]===void 0?"*":`${o[1]}*`))}}return!0}function W(e){try{return JSON.parse(e)}catch{return null}}function Ye(e){let t=e.trim();if(t.startsWith('"""')||t.startsWith("'''"))return null;if(t.startsWith("[")){if(!/\]\s*(?:#.*)?$/.test(t))return null;let n=[];for(let r of t.matchAll(/"((?:\\.|[^"\\])*)"|'([^']*)'/g)){let s=r[2]??W(`"${r[1]}"`);if(s===null)return null;n.push(s)}return n}if(t.startsWith('"')){let n=/^"((?:\\.|[^"\\])*)"/.exec(t);return n?W(`"${n[1]}"`):null}if(t.startsWith("'")){let n=/^'([^']*)'/.exec(t);return n?n[1]:null}return t.replace(/\s*#.*$/,"")}function Xe(e,t){for(let n of e.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 f=Ye(l[2]);if(f===null)return!1;r[l[1]]=f}let s=r.decision;if(s!=="deny"&&s!=="ask_user"||!(r.toolName===void 0?["*"]:[r.toolName].flat()).some(u=>u==="*"||re.test(u)))continue;let o=r.commandPrefix===void 0?[]:[r.commandPrefix].flat(),c=[r.commandRegex,r.argsPattern].flat().filter(u=>typeof u=="string");if(o.length===0&&c.length===0){t.push(()=>!0);continue}for(let u of o)t.push(m(`${u}*`));for(let u of c){let l;try{l=new RegExp(u)}catch{return!1}t.push(f=>l.test(JSON.stringify({command:f}))||j(l,f))}}return!0}function B(e){try{return C(e).filter(t=>t.endsWith(".toml")).map(t=>a(e,t))}catch{return[]}}function Ve(e){let t=qe(),n=[a(t,"system-defaults.json"),a(t,"settings.json"),process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH,process.env.GEMINI_CLI_SYSTEM_DEFAULTS_PATH,a(g(),".gemini","settings.json"),...E(e).map(s=>a(s,".gemini","settings.json"))].filter(s=>!!s),r=b(n,!0,Ke,!1);if(r==="unreadable")return r;for(let s of[...B(a(g(),".gemini","policies")),...B(a(t,"policies"))]){let i;try{i=I(s,"utf8")}catch{return"unreadable"}if(!Xe(i,r.matchers))return"unreadable"}return r}function A(e,t){if(e===void 0)return!0;if(typeof e=="string")return e!=="allow"&&t.push(()=>!0),!0;if(!p(e))return!1;for(let n of["bash","shell","*"]){let r=e[n];if(r!==void 0){if(typeof r=="string"){r!=="allow"&&t.push(()=>!0);continue}if(!p(r))return!1;for(let[s,i]of Object.entries(r))i!=="allow"&&t.push(m(s.replace(/\?/g,"*")))}}return!0}function G(e,t){if(e.permissions!==void 0||!A(e.permission,t))return!1;for(let n of["agent","agents","mode"]){let r=e[n];if(r!==void 0){if(!p(r))return!1;for(let s of Object.values(r))if(p(s)&&(s.permissions!==void 0||!A(s.permission,t)))return!1}}return!0}function Qe(e){for(let t of e)for(let n of["agent","agents","mode","modes"]){let r;try{r=C(a(t,n))}catch{continue}for(let s of r)try{if(s.endsWith(".md")&&/permission/i.test(I(a(t,n,s),"utf8")))return!0}catch{return!0}}return!1}function et(e){let t=a(process.env.XDG_CONFIG_HOME||a(g(),".config"),"opencode"),n=E(e),r=[t,...n.map(c=>a(c,".opencode"))];if(Qe(r))return"unreadable";let s=["opencode.json","opencode.jsonc","config.json"],i=[...s.map(c=>a(t,c)),process.env.OPENCODE_CONFIG,...n.flatMap(c=>[...s.slice(0,2).map(u=>a(c,u)),...s.slice(0,2).map(u=>a(c,".opencode",u))])].filter(c=>!!c),o=b(i,!0,G,!0);if(o==="unreadable")return o;for(let c of[process.env.OPENCODE_CONFIG_CONTENT,process.env.OPENCODE_PERMISSION]){if(!c)continue;let u;try{u=JSON.parse(te(c))}catch{return"unreadable"}if(!(c===process.env.OPENCODE_PERMISSION?A(u,o.matchers):p(u)&&G(u,o.matchers)))return"unreadable"}return o}function tt(){return b([a(g(),".gemini","antigravity-cli","settings.json")],!0,(e,t)=>{let n=e.permissions;if(n===void 0)return!0;if(!p(n))return!1;for(let r of["deny","ask"]){let s=x(n[r]);if(!s)return!1;for(let i of s){let o=/^\s*command\s*\(([\s\S]*)\)\s*$/.exec(i);if(!o)continue;let c=o[1].trim();if(!c.startsWith("regex:")){t.push(m(c==="*"?"*":`${c} *`));continue}let u;try{u=new RegExp(c.slice(6))}catch{return!1}t.push(l=>j(u,l))}}return!0},!1)}function p(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function nt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rt(e){let t=e.trim().replace(/\s+/g," "),n=t.endsWith(" *")&&t.length>2,r=(n?t.slice(0,-2):t).split("*").map(nt).join("[\\s\\S]*");return new RegExp(`^${r}${n?"(?: [\\s\\S]*)?":""}(?= |$)`)}var st=512;function ot(e){let t=e.replace(/['"\\]/g,"").split(/[\s;&|(){}<>`$]+/).filter(Boolean);return[t,t.map(_)]}function j(e,t){if(e.test(t)||e.test(t.trim().replace(/\s+/g," ")))return!0;for(let n of ot(t)){if(n.length>st)return!0;for(let r=0;r<n.length;r++)if(e.test(n.slice(r).join(" ")))return!0}return!1}function m(e){let t=rt(e);return n=>j(t,n)}var it={"claude-code":Ge,cursor:Ze,"gemini-cli":Ve,opencode:et,antigravity:tt},ct=new Set(["codex"]);function ut(e,t,n,r=ne()){let s=it[t],i=s?s(n??process.cwd(),r):{matchers:[],complete:!1};return i==="unreadable"||i.matchers.some(o=>o(e))?!1:i.complete||ee(e,!ct.has(t))}function se(e,t,n,r){if(!n)return null;let s=ut(e,t.host,t.cwd,t.claudeDirs??ne())?Le(e,n):e;return r(t.sessionId,s!==e),s===e?null:s}var d="{}",lt=new Set(["runTerminalCommand","run_in_terminal","Bash","bash"]),at=["run_in_background","is_background","isBackground"];function R(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ft(e){let t=e.session_id??e.sessionId;return typeof t=="string"&&t?t:"unknown"}function dt(e,t){let n=e.cwd??t.cwd??t.workdir??t.working_directory;return typeof n=="string"&&n?n:void 0}function O(e,t,n,r,s){if(!R(t)||at.some(o=>t[o]===!0))return null;let i=t.command;return typeof i!="string"||!i?null:se(i,{host:e,sessionId:ft(n),cwd:dt(n,t)},r,s)}function k(e,t){return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:{...e,command:t}}})}function pt(e){if(R(e))return e;if(typeof e!="string")return null;try{let t=JSON.parse(e);return R(t)?t:null}catch{return null}}function gt(e,t,n){if(typeof e.tool_name=="string"){if(!lt.has(e.tool_name))return d;let i=e.tool_input,o=O("copilot",i,e,t,n);return o?k(i,o):d}if(e.toolName!=="bash")return d;let r=pt(e.toolArgs),s=O("copilot",r,e,t,n);return s?JSON.stringify({modifiedArgs:{...r,command:s}}):d}function h(e,t,n){return(r,s,i)=>{if(r.tool_name!==t)return d;let o=r.tool_input,c=O(e,o,r,s,i);return c?n(o,c):d}}var mt=new Set(["run_terminal_command","Bash","bash"]);function ht(e,t,n){let r=e.toolName??e.tool_name;if(typeof r!="string"||!mt.has(r))return d;let s=e.toolInput??e.tool_input,i=O("grok",s,e,t,n);return i?k(s,i):d}var kt={copilot:gt,droid:h("droid","Execute",k),trae:h("trae","RunCommand",k),"qwen-code":h("qwen-code","run_shell_command",k),crush:h("crush","bash",(e,t)=>JSON.stringify({updated_input:{command:t}})),junie:h("junie","Bash",(e,t)=>JSON.stringify({updatedInput:{...e,command:t}})),zcode:h("zcode","Bash",k),grok:ht};function St(e,t,n=V(e),r=$){return R(t)?kt[e](t,n,r):d}function xt(e,t){if(!t)return d;let n;try{n=JSON.parse(t.replace(/^/,""))}catch{return d}return St(e,n)}async function oe(e){process.stdout.write(xt(e,await v()))}oe("copilot").catch(e=>{process.stderr.write(`tkr-copilot-hook: ${e.message}
11
+ `),process.stdout.write(d),process.exit(0)});
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __tkrCreateRequire } from "node:module"; const require = __tkrCreateRequire(import.meta.url);
3
+ async function v(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf8")}import{appendFileSync as ge,chmodSync as me,mkdirSync as he,existsSync as ke,readFileSync as $t,rmSync as At}from"node:fs";import{dirname as Se,join as xe}from"node:path";import ue from"node:os";import{join as le}from"node:path";function P(){return process.env.TOKMIZER_HOME||le(ue.homedir(),".tokmizer")}import{readFileSync as ae,renameSync as fe,statSync as de,writeFileSync as pe}from"node:fs";function H(e,t,n){try{if(de(e).size<=t)return;let r=ae(e,"utf8").split(`
4
+ `).filter(c=>c.trim()!==""),s=[],i=0;for(let c=r.length-1;c>=0;c-=1){let u=r[c],l=Buffer.byteLength(u)+1;if(i+l>n)break;s.push(u),i+=l}s.reverse();let o=`${e}.tmp-${process.pid}`;pe(o,s.length?`${s.join(`
5
+ `)}
6
+ `:"",{mode:384}),fe(o,e)}catch{}}var be="usage.jsonl";var L=2*1024*1024;function ye(){return xe(P(),be)}function $(e,t,n=ye()){try{let r=Se(n);ke(r)||he(r,{recursive:!0,mode:448});let s=e.replace(/[^A-Za-z0-9._-]/g,"").slice(0,64)||"unknown";ge(n,`{"t":${Math.floor(Date.now()/1e3)},"s":"${s}","o":${t?1:0}}
7
+ `,{mode:384}),me(n,384),H(n,L,L/2)}catch{}}import{existsSync as w,readFileSync as I,readdirSync as C}from"node:fs";import{homedir as g}from"node:os";import{fileURLToPath as we}from"node:url";import{dirname as Z,join as a,resolve as _e}from"node:path";function M(){return!1}var Ee=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"]),Re=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"]),F=new Set(["sh","bash","zsh","dash","ksh","fish","python","python3","python2","node","ruby","perl","php","awk","sed","deno","bun"]),J="(?:dev|start|serve|watch|preview)",Oe=new RegExp(`^(?:\\S*/)?(?:bun\\s+(?:install|i|add|remove|rm|update|outdated|audit|test|build|pm|x)(?:\\s|$)|bun\\s+run\\s+(?!${J}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|deno\\s+(?:test|lint|fmt|check|compile|install|info|doc|bench|outdated)(?:\\s|$)|deno\\s+task\\s+(?!${J}(?:\\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)`),$e=/(?:^|\s)--watch(?:\s|=|$)/;function Ae(e){return Oe.test(e)&&!$e.test(e)}var Ie=/^((?:\S*\/)?(sh|bash|zsh|dash|ksh|fish)\s+(-[elux]*c[elux]*)\s+)(['"])/,Ce=/[()$]|(?:^|[;&|\n]\s*)(?:and|or|not|begin|end|if|else|switch|case|while|for|function|return)(?:\s|;|$)/,q=3;function K(e){let t=Ie.exec(e);if(!t)return null;let n=t[2]==="fish";if(n&&t[3]!=="-c")return null;let r=t[4],s=t[1].length+1,i=e.indexOf(r,s);if(i<=s)return null;let o=e.slice(i+1);if(o&&!/^\s/.test(o))return null;let c=e.slice(s,i);return r==='"'&&/[$`\\!]/.test(c)||n&&Ce.test(c)?null:{script:c,start:s,end:i,quote:r}}var Ne=new Set(["cd","export","set","unset","source",".","true",":","pushd","popd"]);function Te(e){return T(e).filter(n=>{if(n.kind!=="cmd"||n.unsafe)return!1;let r=X(n.text);return r!==""&&!Ne.has(r)&&!N.test(r)}).length>1}function je(e,t,n){if(n>=q)return null;let r=K(e);if(!r)return null;let{script:s,start:i,end:o,quote:c}=r,u=Q(s,t,n+1);if(u===s||c==='"'&&/["$`]/.test(u))return null;let l=c==="'"?u.replace(/'/g,"'\\''"):u,f=`${e.slice(0,i)}${l}${e.slice(o)}`;return Te(s)?`${t} ${f}`:f}var U=/(?:^|\s)(?:--follow|-[0-9a-zA-Z]*f[a-zA-Z]*)(?:\s|=|$)/,De=new Set(["docker","podman","kubectl","nerdctl","docker-compose","stern","flyctl"]);function ve(e,t){let n=_(t);return n==="tail"||n==="journalctl"?U.test(e):n==="stern"?!0:De.has(n)?/\blogs?\b/.test(e)&&U.test(e):!1}var N=/^[A-Za-z_][A-Za-z0-9_]*\+?=/,Pe=/^[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/,He=/(?:^|[;&|\n({])\s*[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/;function _(e){let t=e.lastIndexOf("/");return t===-1?e:e.slice(t+1)}function Y(e){let t=new Array(e.length).fill(!1),n=[],r=0;for(;r<e.length;){let s=e[r],i=e[r+1],o=n[n.length-1];if(o==="'"){s==="'"&&n.pop(),r+=1;continue}if(s==="\\"){if(i===void 0)return null;r+=2;continue}if(o==="$'"){s==="'"&&n.pop(),r+=1;continue}if(s==="$"&&(i==="("||i==="{")){n.push(i==="("?")":"}"),r+=2;continue}if(s==="`"){o==="`"?n.pop():n.push("`"),r+=1;continue}if(o==='"'){s==='"'&&n.pop(),r+=1;continue}if(s==="$"&&i==="'"){n.push("$'"),r+=2;continue}if(s==="'"||s==='"'){n.push(s),r+=1;continue}if(s==="("||s==="{"&&o==="}"){n.push(s==="("?")":"}"),r+=1;continue}if(s===o){n.pop(),r+=1;continue}if(s===")"&&o===void 0)return null;t[r]=o===void 0,r+=1}return n.length===0?t:null}function z(e){let t=Y(e);if(!t)return!0;for(let n=0;n<e.length;n++)if(t[n]&&e[n]===">")return!0;return!1}function T(e){let t=Y(e);if(!t)return[{kind:"cmd",text:e,unsafe:!0}];let n=[],r="",s=0,i=()=>{r.length>0&&(n.push({kind:"cmd",text:r}),r="")},o=(c,u)=>{i(),n.push({kind:"sep",text:c}),s+=u};for(;s<e.length;){let c=e[s],u=e[s+1];if(t[s]){if(c===">"&&u==="|"){r+=">|",s+=2;continue}if(c==="&"&&u==="&"){o("&&",2);continue}if(c==="&"&&u!==">"){let l=r.replace(/\s+$/,""),f=l[l.length-1];if(f!==">"&&f!=="<"&&f!=="&"){o("&",1);continue}}if(c==="|"&&u==="|"){o("||",2);continue}if(c==="|"&&u==="&"){o("|&",2);continue}if(c===";"&&u===";"){let l=e[s+2]==="&";o(l?";;&":";;",l?3:2);continue}if(c===";"||c===`
8
+ `||c==="|"){o(c,1);continue}}r+=c,s+=1}return i(),n}function X(e){return e.trim().split(/\s+/)[0]??""}function V(e,t=process.platform){try{let n=Z(we(import.meta.url)),r=t==="win32",s=e&&e!=="claude-code"&&e!=="codex"&&!r?`TOKMIZER_HOST=${e} `:"";if(r&&(!e||e==="claude-code")){let c=a(n,"..","bin","tkr-exec.exe");if(w(c))return`'${c.replace(/\\/g,"/").replace(/'/g,"'\\''")}'`}let i=a(n,"..","bin","tkr-exec");if(!r&&w(i))return`${s}'${i.replace(/'/g,"'\\''")}'`;if(M()){let c=r?process.execPath.replace(/\\/g,"/"):process.execPath;return`${s}'${c.replace(/'/g,"'\\''")}' exec`}let o=a(n,"..","bin","tkr-exec.js");return w(o)?`${s}node '${o.replace(/'/g,"'\\''")}'`:null}catch{return null}}function Le(e,t="tkr-exec"){return Q(e,t,0)}function Q(e,t,n){if(e.includes("<<")||He.test(e))return e;let r=T(e),s=[];for(let i=0;i<r.length;i++){let o=r[i];if(o.kind==="sep"||o.unsafe){s.push(o.text);continue}let c=o.text.trim();if(!c){s.push(o.text);continue}let u=X(c),l=r[i+1],f=l?.kind==="sep"&&(l.text==="|"||l.text==="|&"),S=l?.kind==="sep"&&l.text==="&",D=!f&&!S&&!z(o.text)&&!o.text.includes("<(")&&!o.text.includes(">(")?je(c,t,n):null;if(D!==null){s.push(`${o.text.match(/^\s*/)?.[0]??""}${D}${o.text.match(/\s*$/)?.[0]??""}`);continue}if(c===t||c.startsWith(t)&&/^\s/.test(c.slice(t.length))||Ee.has(u)||Re.has(u)||(F.has(u)||F.has(_(u)))&&!Ae(c)||N.test(u)||u.startsWith("(")||u.startsWith("#")||u.startsWith("<")||u.startsWith(">")||Pe.test(c)||ve(c,u)||u.endsWith(")")||f||S||z(o.text)||o.text.includes("<(")||o.text.includes(">(")||u==="node"&&c.includes("tkr-exec.js")){s.push(o.text);continue}let ie=o.text.match(/^\s*/)?.[0]??"",ce=o.text.match(/\s*$/)?.[0]??"";s.push(`${ie}${t} ${c}${ce}`)}return s.join("")}var Me=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"]),Fe=new Set(["log","diff","show","status","blame","ls-files","rev-parse","describe","shortlog"]),Je={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/},y=["test","run test","run build","run lint","run typecheck"],Ue={npm:new Set(y),pnpm:new Set([...y,"build","lint","typecheck"]),yarn:new Set([...y,"build","lint","typecheck"]),bun:new Set(y),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"])},ze=new Set(["pytest","tsc","vitest","jest","eslint","mypy"]);function ee(e,t,n=0){if(/\$|`|<\(|>\(|\\\r?\n/.test(e)||/>/.test(e.replace(/2>&1|[12]?>\s*\/dev\/null/g,"")))return!1;for(let r of T(e)){if(r.kind==="sep")continue;if(r.unsafe)return!1;let s=n<q?K(r.text.trim()):null;if(s){if(!ee(s.script,t,n+1))return!1;continue}let i=r.text.trim().split(/\s+/).filter(Boolean).map(l=>l.replace(/['"\\]/g,""));if(i.length===0)continue;if(i.some(l=>N.test(l)))return!1;let o=_(i[0]);if(o!==i[0])return!1;let c=Je[o];if(c&&i.slice(1).some(l=>c.test(l)))return!1;if((o==="git"?Fe.has(i[1]??""):Me.has(o))||t&&ze.has(o))continue;let u=t?Ue[o]:void 0;if(!(u&&(u.has(i[1]??"")||i[1]==="run"&&u.has(`run ${i[2]??""}`))))return!1}return!0}function We(e,t){if(!w(e))return"missing";try{let n=I(e,"utf8");return JSON.parse(t?te(n):n)}catch{return"unreadable"}}function te(e){let t="",n=!1;for(let r=0;r<e.length;r++){let s=e[r];if(n){t+=s,s==="\\"?t+=e[++r]??"":s==='"'&&(n=!1);continue}if(s==='"')n=!0,t+=s;else if(s==="/"&&e[r+1]==="/"){for(;r<e.length&&e[r]!==`
9
+ `;)r++;t+=`
10
+ `}else if(s==="/"&&e[r+1]==="*"){if(r=e.indexOf("*/",r+2),r===-1)return"";r+=1}else t+=s}return t.replace(/,(\s*[}\]])/g,"$1")}function E(e){let t=[],n=_e(e);for(;;){t.push(n);let r=Z(n);if(r===n)return t;n=r}}function Be(){let e=process.platform==="darwin"?"/Library/Application Support/ClaudeCode":process.platform==="win32"?"C:\\Program Files\\ClaudeCode":"/etc/claude-code",t=[a(e,"managed-settings.json")];try{for(let n of C(a(e,"managed-settings.d")))n.endsWith(".json")&&t.push(a(e,"managed-settings.d",n))}catch{return t}return t}function b(e,t,n,r){let s=[];for(let i of e){let o=We(i,t);if(o!=="missing"&&(o==="unreadable"||!p(o)||!n(o,s)))return"unreadable"}return{matchers:s,complete:r}}function x(e){return e===void 0?[]:Array.isArray(e)?e.filter(t=>typeof t=="string"):null}function ne(){return{projectDir:process.env.CLAUDE_PROJECT_DIR,configDir:process.env.CLAUDE_CONFIG_DIR}}function Ge(e,t){let n=[a(g(),".claude"),t.configDir].filter(i=>!!i),r=[t.projectDir,...E(e)].filter(i=>!!i),s=[...Be(),...n.flatMap(i=>[a(i,"settings.json"),a(i,"settings.local.json")]),...r.flatMap(i=>[a(i,".claude","settings.json"),a(i,".claude","settings.local.json")])];return b(s,!1,(i,o)=>{let c=i.permissions;if(c===void 0)return!0;if(!p(c))return!1;for(let u of["deny","ask"]){let l=x(c[u]);if(!l)return!1;for(let f of l){let S=/^\s*Bash\s*(?:\(([\s\S]*)\))?\s*$/.exec(f);S&&o.push(m((S[1]??"*").replace(/:\*$/," *")))}}return!0},!0)}function Ze(e){let t=[a(g(),".cursor","cli-config.json"),...E(e).map(n=>a(n,".cursor","cli.json"))];return b(t,!0,(n,r)=>{let s=n.permissions;if(s===void 0)return!0;if(!p(s))return!1;let i=x(s.deny);if(!i)return!1;for(let o of i){let c=/^\s*Shell\s*(?:\(([\s\S]*)\))?\s*$/.exec(o);if(!c)continue;let u=c[1]??"*",l=u.indexOf(":");r.push(m(l===-1?`${u} *`:`${u.slice(0,l)} ${u.slice(l+1)}`))}return!0},!1)}function qe(){return process.platform==="darwin"?"/Library/Application Support/GeminiCli":process.platform==="win32"?"C:\\ProgramData\\gemini-cli":"/etc/gemini-cli"}var re=/^\s*(?:run_shell_command|ShellTool)\s*(?:\(([\s\S]*)\))?\s*$/;function Ke(e,t){let n=e.tools;if(n!==void 0&&!p(n))return!1;let r=[x(e.excludeTools),x(p(n)?n.exclude:void 0)];for(let s of r){if(!s)return!1;for(let i of s){let o=re.exec(i);o&&t.push(m(o[1]===void 0?"*":`${o[1]}*`))}}return!0}function W(e){try{return JSON.parse(e)}catch{return null}}function Ye(e){let t=e.trim();if(t.startsWith('"""')||t.startsWith("'''"))return null;if(t.startsWith("[")){if(!/\]\s*(?:#.*)?$/.test(t))return null;let n=[];for(let r of t.matchAll(/"((?:\\.|[^"\\])*)"|'([^']*)'/g)){let s=r[2]??W(`"${r[1]}"`);if(s===null)return null;n.push(s)}return n}if(t.startsWith('"')){let n=/^"((?:\\.|[^"\\])*)"/.exec(t);return n?W(`"${n[1]}"`):null}if(t.startsWith("'")){let n=/^'([^']*)'/.exec(t);return n?n[1]:null}return t.replace(/\s*#.*$/,"")}function Xe(e,t){for(let n of e.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 f=Ye(l[2]);if(f===null)return!1;r[l[1]]=f}let s=r.decision;if(s!=="deny"&&s!=="ask_user"||!(r.toolName===void 0?["*"]:[r.toolName].flat()).some(u=>u==="*"||re.test(u)))continue;let o=r.commandPrefix===void 0?[]:[r.commandPrefix].flat(),c=[r.commandRegex,r.argsPattern].flat().filter(u=>typeof u=="string");if(o.length===0&&c.length===0){t.push(()=>!0);continue}for(let u of o)t.push(m(`${u}*`));for(let u of c){let l;try{l=new RegExp(u)}catch{return!1}t.push(f=>l.test(JSON.stringify({command:f}))||j(l,f))}}return!0}function B(e){try{return C(e).filter(t=>t.endsWith(".toml")).map(t=>a(e,t))}catch{return[]}}function Ve(e){let t=qe(),n=[a(t,"system-defaults.json"),a(t,"settings.json"),process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH,process.env.GEMINI_CLI_SYSTEM_DEFAULTS_PATH,a(g(),".gemini","settings.json"),...E(e).map(s=>a(s,".gemini","settings.json"))].filter(s=>!!s),r=b(n,!0,Ke,!1);if(r==="unreadable")return r;for(let s of[...B(a(g(),".gemini","policies")),...B(a(t,"policies"))]){let i;try{i=I(s,"utf8")}catch{return"unreadable"}if(!Xe(i,r.matchers))return"unreadable"}return r}function A(e,t){if(e===void 0)return!0;if(typeof e=="string")return e!=="allow"&&t.push(()=>!0),!0;if(!p(e))return!1;for(let n of["bash","shell","*"]){let r=e[n];if(r!==void 0){if(typeof r=="string"){r!=="allow"&&t.push(()=>!0);continue}if(!p(r))return!1;for(let[s,i]of Object.entries(r))i!=="allow"&&t.push(m(s.replace(/\?/g,"*")))}}return!0}function G(e,t){if(e.permissions!==void 0||!A(e.permission,t))return!1;for(let n of["agent","agents","mode"]){let r=e[n];if(r!==void 0){if(!p(r))return!1;for(let s of Object.values(r))if(p(s)&&(s.permissions!==void 0||!A(s.permission,t)))return!1}}return!0}function Qe(e){for(let t of e)for(let n of["agent","agents","mode","modes"]){let r;try{r=C(a(t,n))}catch{continue}for(let s of r)try{if(s.endsWith(".md")&&/permission/i.test(I(a(t,n,s),"utf8")))return!0}catch{return!0}}return!1}function et(e){let t=a(process.env.XDG_CONFIG_HOME||a(g(),".config"),"opencode"),n=E(e),r=[t,...n.map(c=>a(c,".opencode"))];if(Qe(r))return"unreadable";let s=["opencode.json","opencode.jsonc","config.json"],i=[...s.map(c=>a(t,c)),process.env.OPENCODE_CONFIG,...n.flatMap(c=>[...s.slice(0,2).map(u=>a(c,u)),...s.slice(0,2).map(u=>a(c,".opencode",u))])].filter(c=>!!c),o=b(i,!0,G,!0);if(o==="unreadable")return o;for(let c of[process.env.OPENCODE_CONFIG_CONTENT,process.env.OPENCODE_PERMISSION]){if(!c)continue;let u;try{u=JSON.parse(te(c))}catch{return"unreadable"}if(!(c===process.env.OPENCODE_PERMISSION?A(u,o.matchers):p(u)&&G(u,o.matchers)))return"unreadable"}return o}function tt(){return b([a(g(),".gemini","antigravity-cli","settings.json")],!0,(e,t)=>{let n=e.permissions;if(n===void 0)return!0;if(!p(n))return!1;for(let r of["deny","ask"]){let s=x(n[r]);if(!s)return!1;for(let i of s){let o=/^\s*command\s*\(([\s\S]*)\)\s*$/.exec(i);if(!o)continue;let c=o[1].trim();if(!c.startsWith("regex:")){t.push(m(c==="*"?"*":`${c} *`));continue}let u;try{u=new RegExp(c.slice(6))}catch{return!1}t.push(l=>j(u,l))}}return!0},!1)}function p(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function nt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function rt(e){let t=e.trim().replace(/\s+/g," "),n=t.endsWith(" *")&&t.length>2,r=(n?t.slice(0,-2):t).split("*").map(nt).join("[\\s\\S]*");return new RegExp(`^${r}${n?"(?: [\\s\\S]*)?":""}(?= |$)`)}var st=512;function ot(e){let t=e.replace(/['"\\]/g,"").split(/[\s;&|(){}<>`$]+/).filter(Boolean);return[t,t.map(_)]}function j(e,t){if(e.test(t)||e.test(t.trim().replace(/\s+/g," ")))return!0;for(let n of ot(t)){if(n.length>st)return!0;for(let r=0;r<n.length;r++)if(e.test(n.slice(r).join(" ")))return!0}return!1}function m(e){let t=rt(e);return n=>j(t,n)}var it={"claude-code":Ge,cursor:Ze,"gemini-cli":Ve,opencode:et,antigravity:tt},ct=new Set(["codex"]);function ut(e,t,n,r=ne()){let s=it[t],i=s?s(n??process.cwd(),r):{matchers:[],complete:!1};return i==="unreadable"||i.matchers.some(o=>o(e))?!1:i.complete||ee(e,!ct.has(t))}function se(e,t,n,r){if(!n)return null;let s=ut(e,t.host,t.cwd,t.claudeDirs??ne())?Le(e,n):e;return r(t.sessionId,s!==e),s===e?null:s}var d="{}",lt=new Set(["runTerminalCommand","run_in_terminal","Bash","bash"]),at=["run_in_background","is_background","isBackground"];function R(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function ft(e){let t=e.session_id??e.sessionId;return typeof t=="string"&&t?t:"unknown"}function dt(e,t){let n=e.cwd??t.cwd??t.workdir??t.working_directory;return typeof n=="string"&&n?n:void 0}function O(e,t,n,r,s){if(!R(t)||at.some(o=>t[o]===!0))return null;let i=t.command;return typeof i!="string"||!i?null:se(i,{host:e,sessionId:ft(n),cwd:dt(n,t)},r,s)}function k(e,t){return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:{...e,command:t}}})}function pt(e){if(R(e))return e;if(typeof e!="string")return null;try{let t=JSON.parse(e);return R(t)?t:null}catch{return null}}function gt(e,t,n){if(typeof e.tool_name=="string"){if(!lt.has(e.tool_name))return d;let i=e.tool_input,o=O("copilot",i,e,t,n);return o?k(i,o):d}if(e.toolName!=="bash")return d;let r=pt(e.toolArgs),s=O("copilot",r,e,t,n);return s?JSON.stringify({modifiedArgs:{...r,command:s}}):d}function h(e,t,n){return(r,s,i)=>{if(r.tool_name!==t)return d;let o=r.tool_input,c=O(e,o,r,s,i);return c?n(o,c):d}}var mt=new Set(["run_terminal_command","Bash","bash"]);function ht(e,t,n){let r=e.toolName??e.tool_name;if(typeof r!="string"||!mt.has(r))return d;let s=e.toolInput??e.tool_input,i=O("grok",s,e,t,n);return i?k(s,i):d}var kt={copilot:gt,droid:h("droid","Execute",k),trae:h("trae","RunCommand",k),"qwen-code":h("qwen-code","run_shell_command",k),crush:h("crush","bash",(e,t)=>JSON.stringify({updated_input:{command:t}})),junie:h("junie","Bash",(e,t)=>JSON.stringify({updatedInput:{...e,command:t}})),zcode:h("zcode","Bash",k),grok:ht};function St(e,t,n=V(e),r=$){return R(t)?kt[e](t,n,r):d}function xt(e,t){if(!t)return d;let n;try{n=JSON.parse(t.replace(/^/,""))}catch{return d}return St(e,n)}async function oe(e){process.stdout.write(xt(e,await v()))}oe("crush").catch(e=>{process.stderr.write(`tkr-crush-hook: ${e.message}
11
+ `),process.stdout.write(d),process.exit(0)});
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __tkrCreateRequire } from "node:module"; const require = __tkrCreateRequire(import.meta.url);
3
+ async function N(){let e=[];for await(let t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf8")}import{appendFileSync as ae,chmodSync as fe,mkdirSync as pe,existsSync as de,readFileSync as gt,rmSync as mt}from"node:fs";import{dirname as ge,join as me}from"node:path";import se from"node:os";import{join as oe}from"node:path";function T(){return process.env.TOKMIZER_HOME||oe(se.homedir(),".tokmizer")}import{readFileSync as ie,renameSync as ce,statSync as ue,writeFileSync as le}from"node:fs";function v(e,t,r){try{if(ue(e).size<=t)return;let n=ie(e,"utf8").split(`
4
+ `).filter(i=>i.trim()!==""),s=[],c=0;for(let i=n.length-1;i>=0;i-=1){let u=n[i],l=Buffer.byteLength(u)+1;if(c+l>r)break;s.push(u),c+=l}s.reverse();let o=`${e}.tmp-${process.pid}`;le(o,s.length?`${s.join(`
5
+ `)}
6
+ `:"",{mode:384}),ce(o,e)}catch{}}var he="usage.jsonl";var D=2*1024*1024;function ke(){return me(T(),he)}function _(e,t,r=ke()){try{let n=ge(r);de(n)||pe(n,{recursive:!0,mode:448});let s=e.replace(/[^A-Za-z0-9._-]/g,"").slice(0,64)||"unknown";ae(r,`{"t":${Math.floor(Date.now()/1e3)},"s":"${s}","o":${t?1:0}}
7
+ `,{mode:384}),fe(r,384),v(r,D,D/2)}catch{}}import{existsSync as y,readFileSync as R,readdirSync as $}from"node:fs";import{homedir as d}from"node:os";import{fileURLToPath as Se}from"node:url";import{dirname as W,join as a,resolve as xe}from"node:path";function j(){return!1}var ye=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"]),be=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"]),P=new Set(["sh","bash","zsh","dash","ksh","fish","python","python3","python2","node","ruby","perl","php","awk","sed","deno","bun"]),M="(?:dev|start|serve|watch|preview)",we=new RegExp(`^(?:\\S*/)?(?:bun\\s+(?:install|i|add|remove|rm|update|outdated|audit|test|build|pm|x)(?:\\s|$)|bun\\s+run\\s+(?!${M}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|deno\\s+(?:test|lint|fmt|check|compile|install|info|doc|bench|outdated)(?:\\s|$)|deno\\s+task\\s+(?!${M}(?:\\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)`),_e=/(?:^|\s)--watch(?:\s|=|$)/;function Ee(e){return we.test(e)&&!_e.test(e)}var Re=/^((?:\S*\/)?(sh|bash|zsh|dash|ksh|fish)\s+(-[elux]*c[elux]*)\s+)(['"])/,$e=/[()$]|(?:^|[;&|\n]\s*)(?:and|or|not|begin|end|if|else|switch|case|while|for|function|return)(?:\s|;|$)/,G=3;function J(e){let t=Re.exec(e);if(!t)return null;let r=t[2]==="fish";if(r&&t[3]!=="-c")return null;let n=t[4],s=t[1].length+1,c=e.indexOf(n,s);if(c<=s)return null;let o=e.slice(c+1);if(o&&!/^\s/.test(o))return null;let i=e.slice(s,c);return n==='"'&&/[$`\\!]/.test(i)||r&&$e.test(i)?null:{script:i,start:s,end:c,quote:n}}var Oe=new Set(["cd","export","set","unset","source",".","true",":","pushd","popd"]);function Ce(e){return C(e).filter(r=>{if(r.kind!=="cmd"||r.unsafe)return!1;let n=B(r.text);return n!==""&&!Oe.has(n)&&!O.test(n)}).length>1}function Ae(e,t,r){if(r>=G)return null;let n=J(e);if(!n)return null;let{script:s,start:c,end:o,quote:i}=n,u=K(s,t,r+1);if(u===s||i==='"'&&/["$`]/.test(u))return null;let l=i==="'"?u.replace(/'/g,"'\\''"):u,f=`${e.slice(0,c)}${l}${e.slice(o)}`;return Ce(s)?`${t} ${f}`:f}var H=/(?:^|\s)(?:--follow|-[0-9a-zA-Z]*f[a-zA-Z]*)(?:\s|=|$)/,Ie=new Set(["docker","podman","kubectl","nerdctl","docker-compose","stern","flyctl"]);function Ne(e,t){let r=b(t);return r==="tail"||r==="journalctl"?H.test(e):r==="stern"?!0:Ie.has(r)?/\blogs?\b/.test(e)&&H.test(e):!1}var O=/^[A-Za-z_][A-Za-z0-9_]*\+?=/,Te=/^[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/,ve=/(?:^|[;&|\n({])\s*[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/;function b(e){let t=e.lastIndexOf("/");return t===-1?e:e.slice(t+1)}function Z(e){let t=new Array(e.length).fill(!1),r=[],n=0;for(;n<e.length;){let s=e[n],c=e[n+1],o=r[r.length-1];if(o==="'"){s==="'"&&r.pop(),n+=1;continue}if(s==="\\"){if(c===void 0)return null;n+=2;continue}if(o==="$'"){s==="'"&&r.pop(),n+=1;continue}if(s==="$"&&(c==="("||c==="{")){r.push(c==="("?")":"}"),n+=2;continue}if(s==="`"){o==="`"?r.pop():r.push("`"),n+=1;continue}if(o==='"'){s==='"'&&r.pop(),n+=1;continue}if(s==="$"&&c==="'"){r.push("$'"),n+=2;continue}if(s==="'"||s==='"'){r.push(s),n+=1;continue}if(s==="("||s==="{"&&o==="}"){r.push(s==="("?")":"}"),n+=1;continue}if(s===o){r.pop(),n+=1;continue}if(s===")"&&o===void 0)return null;t[n]=o===void 0,n+=1}return r.length===0?t:null}function L(e){let t=Z(e);if(!t)return!0;for(let r=0;r<e.length;r++)if(t[r]&&e[r]===">")return!0;return!1}function C(e){let t=Z(e);if(!t)return[{kind:"cmd",text:e,unsafe:!0}];let r=[],n="",s=0,c=()=>{n.length>0&&(r.push({kind:"cmd",text:n}),n="")},o=(i,u)=>{c(),r.push({kind:"sep",text:i}),s+=u};for(;s<e.length;){let i=e[s],u=e[s+1];if(t[s]){if(i===">"&&u==="|"){n+=">|",s+=2;continue}if(i==="&"&&u==="&"){o("&&",2);continue}if(i==="&"&&u!==">"){let l=n.replace(/\s+$/,""),f=l[l.length-1];if(f!==">"&&f!=="<"&&f!=="&"){o("&",1);continue}}if(i==="|"&&u==="|"){o("||",2);continue}if(i==="|"&&u==="&"){o("|&",2);continue}if(i===";"&&u===";"){let l=e[s+2]==="&";o(l?";;&":";;",l?3:2);continue}if(i===";"||i===`
8
+ `||i==="|"){o(i,1);continue}}n+=i,s+=1}return c(),r}function B(e){return e.trim().split(/\s+/)[0]??""}function q(e,t=process.platform){try{let r=W(Se(import.meta.url)),n=t==="win32",s=e&&e!=="claude-code"&&e!=="codex"&&!n?`TOKMIZER_HOST=${e} `:"";if(n&&(!e||e==="claude-code")){let i=a(r,"..","bin","tkr-exec.exe");if(y(i))return`'${i.replace(/\\/g,"/").replace(/'/g,"'\\''")}'`}let c=a(r,"..","bin","tkr-exec");if(!n&&y(c))return`${s}'${c.replace(/'/g,"'\\''")}'`;if(j()){let i=n?process.execPath.replace(/\\/g,"/"):process.execPath;return`${s}'${i.replace(/'/g,"'\\''")}' exec`}let o=a(r,"..","bin","tkr-exec.js");return y(o)?`${s}node '${o.replace(/'/g,"'\\''")}'`:null}catch{return null}}function De(e,t="tkr-exec"){return K(e,t,0)}function K(e,t,r){if(e.includes("<<")||ve.test(e))return e;let n=C(e),s=[];for(let c=0;c<n.length;c++){let o=n[c];if(o.kind==="sep"||o.unsafe){s.push(o.text);continue}let i=o.text.trim();if(!i){s.push(o.text);continue}let u=B(i),l=n[c+1],f=l?.kind==="sep"&&(l.text==="|"||l.text==="|&"),h=l?.kind==="sep"&&l.text==="&",I=!f&&!h&&!L(o.text)&&!o.text.includes("<(")&&!o.text.includes(">(")?Ae(i,t,r):null;if(I!==null){s.push(`${o.text.match(/^\s*/)?.[0]??""}${I}${o.text.match(/\s*$/)?.[0]??""}`);continue}if(i===t||i.startsWith(t)&&/^\s/.test(i.slice(t.length))||ye.has(u)||be.has(u)||(P.has(u)||P.has(b(u)))&&!Ee(i)||O.test(u)||u.startsWith("(")||u.startsWith("#")||u.startsWith("<")||u.startsWith(">")||Te.test(i)||Ne(i,u)||u.endsWith(")")||f||h||L(o.text)||o.text.includes("<(")||o.text.includes(">(")||u==="node"&&i.includes("tkr-exec.js")){s.push(o.text);continue}let ne=o.text.match(/^\s*/)?.[0]??"",re=o.text.match(/\s*$/)?.[0]??"";s.push(`${ne}${t} ${i}${re}`)}return s.join("")}var je=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"]),Pe=new Set(["log","diff","show","status","blame","ls-files","rev-parse","describe","shortlog"]),Me={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/},x=["test","run test","run build","run lint","run typecheck"],He={npm:new Set(x),pnpm:new Set([...x,"build","lint","typecheck"]),yarn:new Set([...x,"build","lint","typecheck"]),bun:new Set(x),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"])},Le=new Set(["pytest","tsc","vitest","jest","eslint","mypy"]);function Y(e,t,r=0){if(/\$|`|<\(|>\(|\\\r?\n/.test(e)||/>/.test(e.replace(/2>&1|[12]?>\s*\/dev\/null/g,"")))return!1;for(let n of C(e)){if(n.kind==="sep")continue;if(n.unsafe)return!1;let s=r<G?J(n.text.trim()):null;if(s){if(!Y(s.script,t,r+1))return!1;continue}let c=n.text.trim().split(/\s+/).filter(Boolean).map(l=>l.replace(/['"\\]/g,""));if(c.length===0)continue;if(c.some(l=>O.test(l)))return!1;let o=b(c[0]);if(o!==c[0])return!1;let i=Me[o];if(i&&c.slice(1).some(l=>i.test(l)))return!1;if((o==="git"?Pe.has(c[1]??""):je.has(o))||t&&Le.has(o))continue;let u=t?He[o]:void 0;if(!(u&&(u.has(c[1]??"")||c[1]==="run"&&u.has(`run ${c[2]??""}`))))return!1}return!0}function Fe(e,t){if(!y(e))return"missing";try{let r=R(e,"utf8");return JSON.parse(t?X(r):r)}catch{return"unreadable"}}function X(e){let t="",r=!1;for(let n=0;n<e.length;n++){let s=e[n];if(r){t+=s,s==="\\"?t+=e[++n]??"":s==='"'&&(r=!1);continue}if(s==='"')r=!0,t+=s;else if(s==="/"&&e[n+1]==="/"){for(;n<e.length&&e[n]!==`
9
+ `;)n++;t+=`
10
+ `}else if(s==="/"&&e[n+1]==="*"){if(n=e.indexOf("*/",n+2),n===-1)return"";n+=1}else t+=s}return t.replace(/,(\s*[}\]])/g,"$1")}function w(e){let t=[],r=xe(e);for(;;){t.push(r);let n=W(r);if(n===r)return t;r=n}}function Ue(){let e=process.platform==="darwin"?"/Library/Application Support/ClaudeCode":process.platform==="win32"?"C:\\Program Files\\ClaudeCode":"/etc/claude-code",t=[a(e,"managed-settings.json")];try{for(let r of $(a(e,"managed-settings.d")))r.endsWith(".json")&&t.push(a(e,"managed-settings.d",r))}catch{return t}return t}function S(e,t,r,n){let s=[];for(let c of e){let o=Fe(c,t);if(o!=="missing"&&(o==="unreadable"||!p(o)||!r(o,s)))return"unreadable"}return{matchers:s,complete:n}}function k(e){return e===void 0?[]:Array.isArray(e)?e.filter(t=>typeof t=="string"):null}function V(){return{projectDir:process.env.CLAUDE_PROJECT_DIR,configDir:process.env.CLAUDE_CONFIG_DIR}}function ze(e,t){let r=[a(d(),".claude"),t.configDir].filter(c=>!!c),n=[t.projectDir,...w(e)].filter(c=>!!c),s=[...Ue(),...r.flatMap(c=>[a(c,"settings.json"),a(c,"settings.local.json")]),...n.flatMap(c=>[a(c,".claude","settings.json"),a(c,".claude","settings.local.json")])];return S(s,!1,(c,o)=>{let i=c.permissions;if(i===void 0)return!0;if(!p(i))return!1;for(let u of["deny","ask"]){let l=k(i[u]);if(!l)return!1;for(let f of l){let h=/^\s*Bash\s*(?:\(([\s\S]*)\))?\s*$/.exec(f);h&&o.push(g((h[1]??"*").replace(/:\*$/," *")))}}return!0},!0)}function We(e){let t=[a(d(),".cursor","cli-config.json"),...w(e).map(r=>a(r,".cursor","cli.json"))];return S(t,!0,(r,n)=>{let s=r.permissions;if(s===void 0)return!0;if(!p(s))return!1;let c=k(s.deny);if(!c)return!1;for(let o of c){let i=/^\s*Shell\s*(?:\(([\s\S]*)\))?\s*$/.exec(o);if(!i)continue;let u=i[1]??"*",l=u.indexOf(":");n.push(g(l===-1?`${u} *`:`${u.slice(0,l)} ${u.slice(l+1)}`))}return!0},!1)}function Ge(){return process.platform==="darwin"?"/Library/Application Support/GeminiCli":process.platform==="win32"?"C:\\ProgramData\\gemini-cli":"/etc/gemini-cli"}var Q=/^\s*(?:run_shell_command|ShellTool)\s*(?:\(([\s\S]*)\))?\s*$/;function Je(e,t){let r=e.tools;if(r!==void 0&&!p(r))return!1;let n=[k(e.excludeTools),k(p(r)?r.exclude:void 0)];for(let s of n){if(!s)return!1;for(let c of s){let o=Q.exec(c);o&&t.push(g(o[1]===void 0?"*":`${o[1]}*`))}}return!0}function F(e){try{return JSON.parse(e)}catch{return null}}function Ze(e){let t=e.trim();if(t.startsWith('"""')||t.startsWith("'''"))return null;if(t.startsWith("[")){if(!/\]\s*(?:#.*)?$/.test(t))return null;let r=[];for(let n of t.matchAll(/"((?:\\.|[^"\\])*)"|'([^']*)'/g)){let s=n[2]??F(`"${n[1]}"`);if(s===null)return null;r.push(s)}return r}if(t.startsWith('"')){let r=/^"((?:\\.|[^"\\])*)"/.exec(t);return r?F(`"${r[1]}"`):null}if(t.startsWith("'")){let r=/^'([^']*)'/.exec(t);return r?r[1]:null}return t.replace(/\s*#.*$/,"")}function Be(e,t){for(let r of e.split(/^\s*\[\[\s*rule\s*\]\]\s*$/m).slice(1)){let n={};for(let u of r.split(/\r?\n/)){if(/^\s*\[/.test(u))break;let l=/^\s*([A-Za-z_]+)\s*=\s*(.*)$/.exec(u);if(!l)continue;let f=Ze(l[2]);if(f===null)return!1;n[l[1]]=f}let s=n.decision;if(s!=="deny"&&s!=="ask_user"||!(n.toolName===void 0?["*"]:[n.toolName].flat()).some(u=>u==="*"||Q.test(u)))continue;let o=n.commandPrefix===void 0?[]:[n.commandPrefix].flat(),i=[n.commandRegex,n.argsPattern].flat().filter(u=>typeof u=="string");if(o.length===0&&i.length===0){t.push(()=>!0);continue}for(let u of o)t.push(g(`${u}*`));for(let u of i){let l;try{l=new RegExp(u)}catch{return!1}t.push(f=>l.test(JSON.stringify({command:f}))||A(l,f))}}return!0}function U(e){try{return $(e).filter(t=>t.endsWith(".toml")).map(t=>a(e,t))}catch{return[]}}function qe(e){let t=Ge(),r=[a(t,"system-defaults.json"),a(t,"settings.json"),process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH,process.env.GEMINI_CLI_SYSTEM_DEFAULTS_PATH,a(d(),".gemini","settings.json"),...w(e).map(s=>a(s,".gemini","settings.json"))].filter(s=>!!s),n=S(r,!0,Je,!1);if(n==="unreadable")return n;for(let s of[...U(a(d(),".gemini","policies")),...U(a(t,"policies"))]){let c;try{c=R(s,"utf8")}catch{return"unreadable"}if(!Be(c,n.matchers))return"unreadable"}return n}function E(e,t){if(e===void 0)return!0;if(typeof e=="string")return e!=="allow"&&t.push(()=>!0),!0;if(!p(e))return!1;for(let r of["bash","shell","*"]){let n=e[r];if(n!==void 0){if(typeof n=="string"){n!=="allow"&&t.push(()=>!0);continue}if(!p(n))return!1;for(let[s,c]of Object.entries(n))c!=="allow"&&t.push(g(s.replace(/\?/g,"*")))}}return!0}function z(e,t){if(e.permissions!==void 0||!E(e.permission,t))return!1;for(let r of["agent","agents","mode"]){let n=e[r];if(n!==void 0){if(!p(n))return!1;for(let s of Object.values(n))if(p(s)&&(s.permissions!==void 0||!E(s.permission,t)))return!1}}return!0}function Ke(e){for(let t of e)for(let r of["agent","agents","mode","modes"]){let n;try{n=$(a(t,r))}catch{continue}for(let s of n)try{if(s.endsWith(".md")&&/permission/i.test(R(a(t,r,s),"utf8")))return!0}catch{return!0}}return!1}function Ye(e){let t=a(process.env.XDG_CONFIG_HOME||a(d(),".config"),"opencode"),r=w(e),n=[t,...r.map(i=>a(i,".opencode"))];if(Ke(n))return"unreadable";let s=["opencode.json","opencode.jsonc","config.json"],c=[...s.map(i=>a(t,i)),process.env.OPENCODE_CONFIG,...r.flatMap(i=>[...s.slice(0,2).map(u=>a(i,u)),...s.slice(0,2).map(u=>a(i,".opencode",u))])].filter(i=>!!i),o=S(c,!0,z,!0);if(o==="unreadable")return o;for(let i of[process.env.OPENCODE_CONFIG_CONTENT,process.env.OPENCODE_PERMISSION]){if(!i)continue;let u;try{u=JSON.parse(X(i))}catch{return"unreadable"}if(!(i===process.env.OPENCODE_PERMISSION?E(u,o.matchers):p(u)&&z(u,o.matchers)))return"unreadable"}return o}function Xe(){return S([a(d(),".gemini","antigravity-cli","settings.json")],!0,(e,t)=>{let r=e.permissions;if(r===void 0)return!0;if(!p(r))return!1;for(let n of["deny","ask"]){let s=k(r[n]);if(!s)return!1;for(let c of s){let o=/^\s*command\s*\(([\s\S]*)\)\s*$/.exec(c);if(!o)continue;let i=o[1].trim();if(!i.startsWith("regex:")){t.push(g(i==="*"?"*":`${i} *`));continue}let u;try{u=new RegExp(i.slice(6))}catch{return!1}t.push(l=>A(u,l))}}return!0},!1)}function p(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function Ve(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Qe(e){let t=e.trim().replace(/\s+/g," "),r=t.endsWith(" *")&&t.length>2,n=(r?t.slice(0,-2):t).split("*").map(Ve).join("[\\s\\S]*");return new RegExp(`^${n}${r?"(?: [\\s\\S]*)?":""}(?= |$)`)}var et=512;function tt(e){let t=e.replace(/['"\\]/g,"").split(/[\s;&|(){}<>`$]+/).filter(Boolean);return[t,t.map(b)]}function A(e,t){if(e.test(t)||e.test(t.trim().replace(/\s+/g," ")))return!0;for(let r of tt(t)){if(r.length>et)return!0;for(let n=0;n<r.length;n++)if(e.test(r.slice(n).join(" ")))return!0}return!1}function g(e){let t=Qe(e);return r=>A(t,r)}var nt={"claude-code":ze,cursor:We,"gemini-cli":qe,opencode:Ye,antigravity:Xe},rt=new Set(["codex"]);function st(e,t,r,n=V()){let s=nt[t],c=s?s(r??process.cwd(),n):{matchers:[],complete:!1};return c==="unreadable"||c.matchers.some(o=>o(e))?!1:c.complete||Y(e,!rt.has(t))}function ee(e,t,r,n){if(!r)return null;let s=st(e,t.host,t.cwd,t.claudeDirs??V())?De(e,r):e;return n(t.sessionId,s!==e),s===e?null:s}var m=JSON.stringify({permission:"allow"});function ot(e,t=q("cursor"),r=_){if(e.tool_name!=="Shell")return m;let n=e.tool_input??{},s=n.command;if(typeof s!="string"||!s)return m;let c=typeof n.working_directory=="string"?n.working_directory:void 0,o=ee(s,{host:"cursor",sessionId:e.conversation_id??"unknown",cwd:c},t,r);return o?JSON.stringify({permission:"allow",updated_input:{...n,command:o}}):m}function it(e){if(!e)return m;let t;try{t=JSON.parse(e)}catch{return m}return!t||typeof t!="object"?m:ot(t)}async function te(){process.stdout.write(it(await N()))}te().catch(e=>{process.stderr.write(`tkr-cursor-hook: ${e.message}
11
+ `),process.stdout.write(JSON.stringify({permission:"allow"})),process.exit(0)});