@tokmizer/plugin 0.9.62 → 0.9.64

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 (37) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +5 -5
  4. package/dist/bin/tkr-agent-hook.js +9 -9
  5. package/dist/bin/tkr-codex-hook.js +67 -67
  6. package/dist/bin/tkr-copilot-hook.js +9 -9
  7. package/dist/bin/tkr-crush-hook.js +9 -9
  8. package/dist/bin/tkr-cursor-hook.js +8 -8
  9. package/dist/bin/tkr-daemon.js +120 -118
  10. package/dist/bin/tkr-droid-hook.js +9 -9
  11. package/dist/bin/tkr-exec +73 -71
  12. package/dist/bin/tkr-exec.js +73 -71
  13. package/dist/bin/tkr-gemini-hook.js +8 -8
  14. package/dist/bin/tkr-grok-hook.js +9 -9
  15. package/dist/bin/tkr-junie-hook.js +9 -9
  16. package/dist/bin/tkr-processor.js +91 -89
  17. package/dist/bin/tkr-qwen-hook.js +9 -9
  18. package/dist/bin/tkr-shim.js +67 -67
  19. package/dist/bin/tkr-trae-hook.js +9 -9
  20. package/dist/bin/tkr-zcode-hook.js +9 -9
  21. package/dist/bin/tkr.js +273 -273
  22. package/dist/hooks-host/post-tool-use.js +85 -83
  23. package/dist/hooks-host/pre-tool-use.js +9 -9
  24. package/dist/hooks-host/reducer-stop.js +24 -24
  25. package/dist/hooks-host/session-recap.js +1 -1
  26. package/dist/index.js +82 -82
  27. package/dist/native/manifest.json +12 -12
  28. package/dist/native/single.json +12 -12
  29. package/dist/native/tkr-exec-darwin-arm64 +0 -0
  30. package/dist/native/tkr-exec-darwin-x64 +0 -0
  31. package/dist/native/tkr-exec-linux-arm64 +0 -0
  32. package/dist/native/tkr-exec-linux-x64 +0 -0
  33. package/dist/native/tkr-exec-win32-arm64.exe +0 -0
  34. package/dist/native/tkr-exec-win32-x64.exe +0 -0
  35. package/hooks/on-session-start.mjs +16 -5
  36. package/package.json +8 -8
  37. package/scripts/install-mac-linux.sh +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokmizer",
3
- "version": "0.9.62",
3
+ "version": "0.9.64",
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.62",
3
+ "version": "0.9.64",
4
4
  "description": "Tokmizer reduces token consumption for OpenAI Codex.",
5
5
  "author": {
6
6
  "name": "Tokmizer",
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Tokmizer reduces token consumption for 21 AI coding agents, including Claude Code, OpenAI Codex, Cursor, Gemini CLI and GitHub Copilot. Aider, Cline and Windsurf run through `tkr wrap`. Works on macOS, Linux, and Windows.
4
4
 
5
- It shortens command output before it reaches the model, reducing the space it takes in the context window. The reduction depends on the output and the chosen mode. This is not a guarantee of a lower bill or faster coding, rendering, or builds.
5
+ It shortens command output before it reaches the model, reducing the space it takes in the context window. The reduction depends on the output and the chosen mode. This is not a promise of lower usage costs or faster work.
6
6
 
7
7
  ## Install
8
8
 
@@ -100,7 +100,7 @@ Each command adds one `PreToolUse` hook for the agent's shell tool. It rewrites
100
100
 
101
101
  Permission rules stay in force. Agents match their allow, ask and deny rules against the command text, so Tokmizer leaves a command untouched whenever one of your deny or ask rules matches it. Tokmizer reads those rules for Claude Code (`permissions.deny` and `permissions.ask` in user, project, local and managed settings; a command matched by one of your `permissions.allow` rules is left untouched too, so that rule keeps approving it), OpenCode (`permission` in `opencode.json`), Cursor CLI (`permissions.deny`), Gemini CLI (policy files and `tools.exclude`) and Antigravity CLI (`permissions.deny` and `permissions.ask`). For the other agents, and on top of the Cursor, Gemini and Antigravity rules, only inspection, build and test commands (`cat`, `rg`, `git log`, `npm test`, `cargo build` and similar; inspection only for Codex) are routed; anything else, such as `git push` or `rm`, runs exactly as typed. If a settings file cannot be read, nothing is routed. Shell functions, aliases, builtins and anything that is not a program on your `PATH` always run exactly as typed.
102
102
 
103
- In Claude Code, a command is rewritten only when that adds no permission prompt: in `bypassPermissions` mode, or when a plain `Bash` allow rule in your user or managed settings applies and the session is in default, `acceptEdits` or `dontAsk` mode. Otherwise it runs exactly as typed, so Claude Code still approves read-only commands such as `ls`, `cat` or `git status` on its own, and Tokmizer shortens the output once the command has succeeded. Claude Code runs that after-command hook only for successful commands, so in this default mode a failing command reaches Claude in full. When commands are rewritten, failing output is shortened too, with its failure details kept.
103
+ In Claude Code, a command is rewritten only when that adds no permission prompt: in `bypassPermissions` mode, or when a plain `Bash` allow rule in your user or managed settings applies and the session is in default, `acceptEdits` or `dontAsk` mode. Otherwise it runs exactly as typed, so Claude Code still approves read-only commands such as `ls`, `cat` or `git status` on its own, and Tokmizer shortens the output once the command has succeeded. Claude Code runs that after-command hook only for successful commands, so in this default mode a failing command reaches Claude in full. A single command typed on its own (no `&&`, `;`, pipe, redirection, `$( )` or wildcard) is also rewritten when one of your own allow rules for it, such as `Bash(pytest:*)` or `Bash(cargo build:*)` in your user or managed settings, applies and no deny or ask rule matches: Tokmizer then gives the approval Claude Code would have given to the command as typed, so no new prompt appears. When commands are rewritten, failing output is shortened too, with its failure details kept.
104
104
 
105
105
  Aider, Cline and Windsurf have no hooks. Start them through Tokmizer, for example `tkr wrap aider`: only that session goes through Tokmizer's command shims. Your own terminals are not changed; `tkr shim global-path on` routes every terminal through the shims by adding a PATH line to your shell profile, and `tkr shim global-path off` removes it.
106
106
 
@@ -222,7 +222,7 @@ Use YOLO for repeated commands only when you accept incomplete output and can ch
222
222
 
223
223
  Terminal commands managed by Tokmizer use the mode selected when execution starts. Native agent tools use the mode active when their output is received. Output processing that has already started in YOLO remains without a restoration copy after YOLO is turned off. Turning YOLO on blocks new restoration copies. Change modes between commands. This concerns Tokmizer's copies, not any history kept by your agent or terminal.
224
224
 
225
- `tkr gain` measures output size before and after compression and estimates tokens as UTF-8 bytes divided by four. Token and cost figures are estimates about command output, not your actual bill or a measure of task quality or completion speed.
225
+ `tkr gain` measures output size before and after compression and estimates tokens as UTF-8 bytes divided by four. Token and cost figures are estimates about command output, not a measure of your actual API usage, task quality or completion speed.
226
226
 
227
227
  Since 0.9.53, successful `tkr restore` calls are counted as additional output in the local gain history, even with telemetry disabled. They reduce the net saving; repeated restorations count again and can make it negative. The display shows restored tokens separately. `gain --json` exposes the net estimate in `observed.savedTokens` and restoration totals in `restoration`; the existing top-level `savedTokens` remains the total for reduced outputs only. Earlier restorations cannot be reconstructed from local history. Manually repeated commands, prompts, replies and replayed conversation context are not attributed to restoration costs.
228
228
 
@@ -265,11 +265,11 @@ In one real failed test, `max` kept 302 tokens and YOLO kept 77. Both retained t
265
265
 
266
266
  In a separate controlled test for 0.9.52, a repetitive failure log went from 1,094 to 84 tokens in Max (92.3% fewer, counted with cl100k). Every distinct diagnostic and the repetition counts were retained. This result applies to that example, not to typical usage.
267
267
 
268
- These tokenizer counts are separate from the byte-based estimates in `tkr gain`. They measure output volume, not your bill, an agent's task success, or execution speed. See the [mode guide](https://tokmizer.com/en/docs#configuration) for usage and limits.
268
+ These tokenizer counts are separate from the byte-based estimates in `tkr gain`. They measure output volume, not API usage, an agent's task success, or execution speed. See the [mode guide](https://tokmizer.com/en/docs#configuration) for usage and limits.
269
269
 
270
270
  ### Benchmark of October 17, 2026
271
271
 
272
- Each tool's Claude Code hook chain replayed 68 real command outputs offline (network cut, empty home folder, no account, median of 3 runs) with Tokmizer 0.9.60 and its default settings, against rtk 1.0.1. Tokmizer removed 84% of tokens in Claude Code's default mode and up to 93% when commands are rewritten (`bypassPermissions` or a plain `Bash` allow rule); rtk removed 55%. All 307 failure details were kept in both Tokmizer modes. The full results are on [tokmizer.com/en/compare/rtk](https://tokmizer.com/en/compare/rtk).
272
+ Each tool's Claude Code hook chain replayed 68 real command outputs offline (network cut, empty home folder, no account, median of 3 runs) with Tokmizer 0.9.60 and its default settings, against rtk 1.0.1. Tokmizer removed 84% of tokens in Claude Code's default mode and up to 93% when commands are rewritten (`bypassPermissions` or a blanket `Bash` allow); rtk removed 55%. All 307 failure details were kept in both Tokmizer modes. A later offline run of the same 68 cases with Tokmizer 0.9.63, counted with Anthropic's legacy tokenizer rather than o200k_base, gave 84.2% in the default mode without allow rules, 92.8% in the default mode with narrow allow rules for the test and build commands and 93.5% in `bypassPermissions`, against 57.2% for rtk; 307/307 failure details were kept in every Tokmizer mode. The full results are on [tokmizer.com/en/compare/rtk](https://tokmizer.com/en/compare/rtk).
273
273
 
274
274
  ## Custom filters
275
275
 
@@ -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 N(t=5e3){return new Promise(e=>{let n=[],r=process.stdin,o=!1,i=()=>{o||(o=!0,clearTimeout(c),r.off("data",s),r.pause(),r.unref?.(),e(Buffer.concat(n).toString("utf8")))},s=u=>{n.push(Buffer.isBuffer(u)?u:Buffer.from(u))},c=setTimeout(i,t);r.on("data",s).once("end",i).once("error",i),r.resume()})}function U(){return!1}import Gt from"node:os";import{join as Zt}from"node:path";function $(){return process.env.TOKMIZER_HOME||Zt(Gt.homedir(),".tokmizer")}import{rmSync as Kt,statSync as qt}from"node:fs";import{join as Yt}from"node:path";function dt(){return Yt($(),"fail-open")}var Vt=24*36e5;function S(t=Date.now()){try{if(t-qt(dt()).mtimeMs<Vt)return!0;Kt(dt(),{force:!0})}catch{}return!1}function v(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}var Ur=String.raw`(?:'(?:(?:[^']|'\\'')*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?'|"(?:[^"]*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?"|(?:[^\s'"]*[\\/])?tkr(?:\.(?:exe|cmd|bat|ps1))?)`;import{appendFileSync as re,chmodSync as oe,mkdirSync as se,existsSync as ie,readFileSync as Gr,rmSync as Zr}from"node:fs";import{dirname as ce,join as ue}from"node:path";import{readFileSync as Qt,renameSync as te,statSync as ee,writeFileSync as ne}from"node:fs";function pt(t,e,n){try{if(ee(t).size<=e)return;let r=Qt(t,"utf8").split(`
4
- `).filter(c=>c.trim()!==""),o=[],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;o.push(u),i+=l}o.reverse();let s=`${t}.tmp-${process.pid}`;ne(s,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 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(`
5
5
  `)}
6
- `:"",{mode:384}),te(s,t)}catch{}}var le="usage.jsonl";var mt=2*1024*1024;function ae(){return ue($(),le)}function k(t,e,n=ae()){try{let r=ce(n);ie(r)||se(r,{recursive:!0,mode:448});let o=t.replace(/[^A-Za-z0-9._-]/g,"").slice(0,64)||"unknown";re(n,`{"t":${Math.floor(Date.now()/1e3)},"s":"${o}","o":${e?1:0}}
7
- `,{mode:384}),oe(n,384),pt(n,mt,mt/2)}catch{}}import{existsSync as B,readFileSync as nt,readdirSync as rt}from"node:fs";import{homedir as A}from"node:os";import{fileURLToPath as Be}from"node:url";import{dirname as At,join as f,resolve as We}from"node:path";import{execFileSync as Ce}from"node:child_process";import{mkdirSync as He,readFileSync as bt,renameSync as Pe,statSync as Ne,writeFileSync as Ie}from"node:fs";import{join as St}from"node:path";import{closeSync as fe,openSync as de,readSync as pe,readdirSync as me,readFileSync as ge,statSync as ht}from"node:fs";import{homedir as he}from"node:os";import{isAbsolute as ke,join as z,resolve as _e}from"node:path";var be=/^[A-Za-z0-9._+@%:,/-]+$/,Se=new Set(["7f454c46","feedface","feedfacf","cefaedfe","cffaedfe","cafebabe","bebafeca"]),ye=32,we=4*1024*1024;function Q(t){let e;try{e=de(t,"r");let n=Buffer.alloc(4),r=pe(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&&fe(e)}}function I(t,e=process.platform){try{let n=ht(t);if(!n.isFile())return!1;if(e==="win32")return!0;if((n.mode&73)===0)return!1;let r=Q(t);return r==="#!"||r!==null&&Se.has(r)}catch{return!1}}function xe(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 E(t,e,n,r=process.platform){if(!be.test(t))return!1;let o=r==="win32";if(t.includes("/"))return I(_e(e??process.cwd(),t),r);if(!n)return!1;let i=o?xe(t):[t];for(let s of n.split(o?";":":"))if(!(!s||!ke(s))){for(let c of i)if(I(z(s,c),r))return!0}return!1}var $e=/^eval \$'([^\s'()=]+) \(\) /,ve=/^([^\s'"()=]+) \(\) \{$/,Oe=/^alias -- ([^\s=]+)=(.*)$/,Ee=/^# (?:Shell Options|Aliases|Shopt|Check for |Shadow )/,Ae=/^export PATH=(.*)$/,Re=/^(?:--colou?r(?:=\S+)?|-G)$/;function gt(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 Te(t,e){let n="";for(let r of t.split(`
8
- `)){let o=Ae.exec(r);if(o&&n!=="# Functions"){let i=gt(o[1].trim());/[$`\\]/.test(i)||e.paths.push(i);continue}if(r.startsWith("# ")&&(n!=="# Functions"||Ee.test(r))){n=r;continue}if(n==="# Functions"){let i=$e.exec(r)??ve.exec(r);i&&e.functions.add(i[1])}else if(n==="# Aliases"){let i=Oe.exec(r);i&&e.aliases.set(i[1],gt(i[2].trim()))}}}function X(t){return t?.code==="ENOENT"}function kt(t){let e={functions:new Set,aliases:new Map,paths:[],uncertain:!1},n=z(t||z(he(),".claude"),"shell-snapshots"),r=[];try{for(let o of me(n)){if(!o.startsWith("snapshot-")||!o.endsWith(".sh"))continue;let i=z(n,o);try{let s=ht(i);s.isFile()&&r.push({path:i,mtime:s.mtimeMs,size:s.size})}catch(s){X(s)||(e.uncertain=!0)}}}catch(o){return X(o)||(e.uncertain=!0),e}r=r.sort((o,i)=>i.mtime-o.mtime).slice(0,ye);for(let o of r)try{if(o.size>we)throw new Error("snapshot too large");Te(ge(o.path,"utf8"),e)}catch(i){X(i)||(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=>Re.test(o))}var Le="exec-probe.json",je=6e4;function Fe(){return St($(),Le)}function De(t){try{let e=JSON.parse(bt(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 Me(t,e){try{He(St(t,".."),{recursive:!0,mode:448});let n=`${t}.${process.pid}.tmp`;Ie(n,JSON.stringify(e),{mode:384}),Pe(n,t)}catch{}}function Ue(t){try{return Ce(t,["--native-check"],{encoding:"utf8",timeout:2e3,maxBuffer:1024,stdio:["ignore","pipe","ignore"],windowsHide:!0}).startsWith("tokmizer-native ")}catch{return!1}}function ze(t,e){try{let r=bt(t,"utf8").split(`
9
- `,1)[0].slice(2).trim().split(/\s+/),o=r[0]??"";return o==="/usr/bin/env"?E(r[1]??"",void 0,e):I(o)}catch{return!1}}function Je(t,e,n){try{let r=Ne(t);return[t,r.size,r.mtimeMs,r.ino,r.mode,e?n??"":""].join("|")}catch{return`${t}|missing`}}function tt(t,e=process.platform,n=process.env.PATH,r=Fe(),o=Date.now()){let i=e!=="win32"&&Q(t)==="#!",s=Je(t,i,n),c=De(r);if(c?.key===s&&(c.ok||o-c.at<je))return c.ok;let u=I(t,e)&&(i?ze(t,n):Ue(t));return Me(r,{key:s,ok:u,at:o,skipped:(c?.skipped??0)+(u?0:1)}),u}var Ge=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"]),Ze=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"]),yt=new Set(["sh","bash","zsh","dash","ksh","fish","python","python3","python2","node","ruby","perl","php","awk","sed","deno","bun"]),wt="(?:dev|start|serve|watch|preview)",Ke=new RegExp(`^(?:\\S*/)?(?:bun\\s+(?:install|i|add|remove|rm|update|outdated|audit|test|build|pm|x)(?:\\s|$)|bun\\s+run\\s+(?!${wt}(?:\\s|$))[A-Za-z0-9:_-]+(?:\\s|$)|deno\\s+(?:test|lint|fmt|check|compile|install|info|doc|bench|outdated)(?:\\s|$)|deno\\s+task\\s+(?!${wt}(?:\\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)`),qe=/(?:^|\s)--watch(?:\s|=|$)/;function Ye(t){return Ke.test(t)&&!qe.test(t)}var Ve=/^((?:\S*\/)?(sh|bash|zsh|dash|ksh|fish)\s+(-[elux]*c[elux]*)\s+)(['"])/,Xe=/[()$]|(?:^|[;&|\n]\s*)(?:and|or|not|begin|end|if|else|switch|case|while|for|function|return)(?:\s|;|$)/,Rt=3;function Tt(t){let e=Ve.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,i=t.indexOf(r,o);if(i<=o)return null;let s=t.slice(i+1);if(s&&!/^\s/.test(s))return null;let c=t.slice(o,i);return r==='"'&&/[$`\\!]/.test(c)||n&&Xe.test(c)?null:{script:c,start:o,end:i,quote:r}}var Qe=new Set(["cd","export","set","unset","source",".","true",":","pushd","popd"]);function tn(t){return st(t).filter(n=>{if(n.kind!=="cmd"||n.unsafe)return!1;let r=Ht(n.text);return r!==""&&!Qe.has(r)&&!ot.test(r)}).length>1}function en(t,e,n,r,o){if(n>=Rt)return null;let i=Tt(t);if(!i)return null;let{script:s,start:c,end:u,quote:l}=i,a=[],p=Pt(s,e,n+1,r,g=>a.push(g));if(p===s||l==='"'&&/["$`]/.test(p))return null;let _=l==="'"?p.replace(/'/g,"'\\''"):p,d=`${t.slice(0,c)}${_}${t.slice(u)}`,y=tn(s);if(o)for(let g of y?[t,...a]:a)o(g);return y?`${e} ${d}`:d}var xt=/(?:^|\s)(?:--follow|-[0-9a-zA-Z]*f[a-zA-Z]*)(?:\s|=|$)/,nn=new Set(["docker","podman","kubectl","nerdctl","docker-compose","stern","flyctl"]);function rn(t,e){let n=W(e);return n==="tail"||n==="journalctl"?xt.test(t):n==="stern"?!0:nn.has(n)?/\blogs?\b/.test(t)&&xt.test(t):!1}var ot=/^[A-Za-z_][A-Za-z0-9_]*\+?=/,on=/^[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/,sn=/(?:^|[;&|\n({])\s*[A-Za-z_][A-Za-z0-9_-]*\s*\(\s*\)/;function W(t){let e=t.lastIndexOf("/");return e===-1?t:t.slice(e+1)}function Ct(t){let e=new Array(t.length).fill(!1),n=[],r=0;for(;r<t.length;){let o=t[r],i=t[r+1],s=n[n.length-1];if(s==="'"){o==="'"&&n.pop(),r+=1;continue}if(o==="\\"){if(i===void 0)return null;r+=2;continue}if(s==="$'"){o==="'"&&n.pop(),r+=1;continue}if(o==="$"&&(i==="("||i==="{")){n.push(i==="("?")":"}"),r+=2;continue}if(o==="`"){s==="`"?n.pop():n.push("`"),r+=1;continue}if(s==='"'){o==='"'&&n.pop(),r+=1;continue}if(o==="$"&&i==="'"){n.push("$'"),r+=2;continue}if(o==="'"||o==='"'){n.push(o),r+=1;continue}if(o==="("||o==="{"&&s==="}"){n.push(o==="("?")":"}"),r+=1;continue}if(o===s){n.pop(),r+=1;continue}if(o===")"&&s===void 0)return null;e[r]=s===void 0,r+=1}return n.length===0?e:null}function $t(t){let e=Ct(t);if(!e)return!0;for(let n=0;n<t.length;n++)if(e[n]&&t[n]===">")return!0;return!1}function st(t){let e=Ct(t);if(!e)return[{kind:"cmd",text:t,unsafe:!0}];let n=[],r="",o=0,i=()=>{r.length>0&&(n.push({kind:"cmd",text:r}),r="")},s=(c,u)=>{i(),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==="&"){s("&&",2);continue}if(c==="&"&&u!==">"){let l=r.replace(/\s+$/,""),a=l[l.length-1];if(a!==">"&&a!=="<"&&a!=="&"){s("&",1);continue}}if(c==="|"&&u==="|"){s("||",2);continue}if(c==="|"&&u==="&"){s("|&",2);continue}if(c===";"&&u===";"){let l=t[o+2]==="&";s(l?";;&":";;",l?3:2);continue}if(c===";"||c===`
10
- `||c==="|"){s(c,1);continue}}r+=c,o+=1}return i(),n}function Ht(t){return t.trim().split(/\s+/)[0]??""}function b(t,e=process.platform){try{let n=At(Be(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(B(c))return tt(c,e)?`'${c.replace(/\\/g,"/").replace(/'/g,"'\\''")}'`:null}let i=f(n,"..","bin","tkr-exec");if(!r&&B(i))return tt(i,e)?`${o}'${i.replace(/'/g,"'\\''")}'`:null;if(U()){let c=r?process.execPath.replace(/\\/g,"/"):process.execPath;return`${o}'${c.replace(/'/g,"'\\''")}' exec`}let s=f(n,"..","bin","tkr-exec.js");return B(s)?`${o}node '${s.replace(/'/g,"'\\''")}'`:null}catch{return null}}function cn(t,e="tkr-exec",n=()=>!0,r){return Pt(t,e,0,n,r)}function Pt(t,e,n,r,o){if(t.includes("<<")||sn.test(t))return t;let i=st(t),s=[];for(let c=0;c<i.length;c++){let u=i[c];if(u.kind==="sep"||u.unsafe){s.push(u.text);continue}let l=u.text.trim();if(!l){s.push(u.text);continue}let a=Ht(l),p=i[c+1],_=p?.kind==="sep"&&(p.text==="|"||p.text==="|&"),d=p?.kind==="sep"&&p.text==="&",y=!_&&!d&&!$t(u.text)&&!u.text.includes("<(")&&!u.text.includes(">(")?en(l,e,n,r,o):null;if(y!==null){s.push(`${u.text.match(/^\s*/)?.[0]??""}${y}${u.text.match(/\s*$/)?.[0]??""}`);continue}if(l===e||l.startsWith(e)&&/^\s/.test(l.slice(e.length))||Ge.has(a)||Ze.has(a)||(yt.has(a)||yt.has(W(a)))&&!Ye(l)||ot.test(a)||a.startsWith("(")||a.startsWith("#")||a.startsWith("<")||a.startsWith(">")||on.test(l)||rn(l,a)||a.endsWith(")")||_||d||$t(u.text)||u.text.includes("<(")||u.text.includes(">(")||a==="node"&&l.includes("tkr-exec.js")||!r(a)){s.push(u.text);continue}let g=u.text.match(/^\s*/)?.[0]??"",M=u.text.match(/\s*$/)?.[0]??"";o?.(l),s.push(`${g}${e} ${l}${M}`)}return s.join("")}var un=new Set(["command","workdir","timeout_ms","yield_time_ms","max_output_tokens","shell","login","tty","description"]),ln=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"]),an=new Set(["log","diff","show","status","blame","ls-files","rev-parse","describe","shortlog"]),fn={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/},J=["test","run test","run build","run lint","run typecheck"],dn={npm:new Set(J),pnpm:new Set([...J,"build","lint","typecheck"]),yarn:new Set([...J,"build","lint","typecheck"]),bun:new Set(J),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"])},pn=new Set(["pytest","tsc","vitest","jest","eslint","mypy"]);function Nt(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 st(t)){if(r.kind==="sep")continue;if(r.unsafe)return!1;let o=n<Rt?Tt(r.text.trim()):null;if(o){if(!Nt(o.script,e,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=>ot.test(l)))return!1;let s=W(i[0]);if(s!==i[0])return!1;let c=fn[s];if(c&&i.slice(1).some(l=>c.test(l)))return!1;if((s==="git"?an.has(i[1]??""):ln.has(s))||e&&pn.has(s))continue;let u=e?dn[s]:void 0;if(!(u&&(u.has(i[1]??"")||i[1]==="run"&&u.has(`run ${i[2]??""}`))))return!1}return!0}function It(t,e,n=b(e),r=k,o=Z(),i=process.env.PATH){if(!h(t)||t.tool_name!=="Bash")return null;let s=t.tool_input;if(!h(s)||s.run_in_background)return null;let c=s.command;if(typeof c!="string"||!c||e==="codex"&&Object.keys(s).some(d=>!un.has(d)))return null;let u=typeof t.cwd=="string"&&t.cwd?t.cwd:s.workdir,l=typeof u=="string"&&u?u:void 0,a=typeof t.session_id=="string"&&t.session_id?t.session_id:"unknown",p=typeof t.permission_mode=="string"?t.permission_mode:void 0,_=w(c,{host:e,sessionId:a,cwd:l,claudeDirs:o,pathEnv:i,permissionMode:p},n,r);return _?JSON.stringify({hookSpecificOutput:e==="codex"?{hookEventName:"PreToolUse",permissionDecision:"allow",updatedInput:{...s,command:_}}:{hookEventName:"PreToolUse",updatedInput:{...s,command:_}}}):null}function mn(t,e){if(!B(t))return"missing";try{let n=nt(t,"utf8");return JSON.parse(e?Lt(n):n)}catch{return"unreadable"}}function Lt(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}),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]!==`
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 G(t){let e=[],n=We(t);for(;;){e.push(n);let r=At(n);if(r===n)return e;n=r}}function gn(){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 rt(f(t,"managed-settings.d")))n.endsWith(".json")&&e.push(f(t,"managed-settings.d",n))}catch{return e}return e}function j(t,e,n,r){let o=[];for(let i of t){let s=mn(i,e);if(s!=="missing"&&(s==="unreadable"||!h(s)||!n(s,o)))return"unreadable"}return{matchers:o,complete:r}}function L(t){return t===void 0?[]:Array.isArray(t)?t.filter(e=>typeof e=="string"):null}function Z(){return{projectDir:process.env.CLAUDE_PROJECT_DIR,configDir:process.env.CLAUDE_CONFIG_DIR}}function hn(t,e){let n=d=>[f(d,"settings.json"),f(d,"settings.local.json")],r=d=>n(f(d,".claude")),o=f(A(),".claude"),i=[[gn(),"managed"],[n(e.configDir||o),"loaded"],[e.configDir?n(o):[],"extra"],[e.projectDir?r(e.projectDir):[],"project"],[G(t).flatMap(r),"extra"]],s=[],c={managed:!1,loaded:!1,project:!1,extra:!1},u=!1,l="managed",a=(d,y)=>{let g=d.permissions;if(l==="managed"&&(d.allowManagedPermissionRulesOnly===!0||h(g)&&g.allowManagedPermissionRulesOnly===!0)&&(u=!0),g===void 0)return!0;if(!h(g))return!1;for(let M of["deny","ask","allow"]){let at=L(g[M]);if(!at)return!1;for(let Wt of at){let P=/^\s*Bash\s*(?:\(([\s\S]*)\))?\s*$/.exec(Wt);P&&(M!=="allow"?y.push(O((P[1]??"*").replace(/:\*$/," *"))):P[1]===void 0||P[1].trim()==="*"?c[l]=!0:s.push(O(P[1].replace(/:\*$/," *"))))}}return!0},p=[];for(let[d,y]of i){l=y;let g=j(d,!1,a,!0);if(g==="unreadable")return"unreadable";p.push(...g.matchers)}let _=c.managed||c.loaded&&!u;return{matchers:[...p,..._?[]:s],complete:!0,allow:s,allowsEverything:_}}function kn(t){let e=[f(A(),".cursor","cli-config.json"),...G(t).map(n=>f(n,".cursor","cli.json"))];return j(e,!0,(n,r)=>{let o=n.permissions;if(o===void 0)return!0;if(!h(o))return!1;let i=L(o.deny);if(!i)return!1;for(let s of i){let c=/^\s*Shell\s*(?:\(([\s\S]*)\))?\s*$/.exec(s);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 _n(){return process.platform==="darwin"?"/Library/Application Support/GeminiCli":process.platform==="win32"?"C:\\ProgramData\\gemini-cli":"/etc/gemini-cli"}var jt=/^\s*(?:run_shell_command|ShellTool)\s*(?:\(([\s\S]*)\))?\s*$/;function bn(t,e){let n=t.tools;if(n!==void 0&&!h(n))return!1;let r=[L(t.excludeTools),L(h(n)?n.exclude:void 0)];for(let o of r){if(!o)return!1;for(let i of o){let s=jt.exec(i);s&&e.push(O(s[1]===void 0?"*":`${s[1]}*`))}}return!0}function vt(t){try{return JSON.parse(t)}catch{return null}}function Sn(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]??vt(`"${r[1]}"`);if(o===null)return null;n.push(o)}return n}if(e.startsWith('"')){let n=/^"((?:\\.|[^"\\])*)"/.exec(e);return n?vt(`"${n[1]}"`):null}if(e.startsWith("'")){let n=/^'([^']*)'/.exec(e);return n?n[1]:null}return e.replace(/\s*#.*$/,"")}function yn(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=Sn(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==="*"||jt.test(u)))continue;let s=r.commandPrefix===void 0?[]:[r.commandPrefix].flat(),c=[r.commandRegex,r.argsPattern].flat().filter(u=>typeof u=="string");if(s.length===0&&c.length===0){e.push(()=>!0);continue}for(let u of s)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}))||it(l,a))}}return!0}function Ot(t){try{return rt(t).filter(e=>e.endsWith(".toml")).map(e=>f(t,e))}catch{return[]}}function wn(t){let e=_n(),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(A(),".gemini","settings.json"),...G(t).map(o=>f(o,".gemini","settings.json"))].filter(o=>!!o),r=j(n,!0,bn,!1);if(r==="unreadable")return r;for(let o of[...Ot(f(A(),".gemini","policies")),...Ot(f(e,"policies"))]){let i;try{i=nt(o,"utf8")}catch{return"unreadable"}if(!yn(i,r.matchers))return"unreadable"}return r}function et(t,e){if(t===void 0)return!0;if(typeof t=="string")return t!=="allow"&&e.push(()=>!0),!0;if(!h(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(!h(r))return!1;for(let[o,i]of Object.entries(r))i!=="allow"&&e.push(O(o.replace(/\?/g,"*")))}}return!0}function Et(t,e){if(t.permissions!==void 0||!et(t.permission,e))return!1;for(let n of["agent","agents","mode"]){let r=t[n];if(r!==void 0){if(!h(r))return!1;for(let o of Object.values(r))if(h(o)&&(o.permissions!==void 0||!et(o.permission,e)))return!1}}return!0}function xn(t){for(let e of t)for(let n of["agent","agents","mode","modes"]){let r;try{r=rt(f(e,n))}catch{continue}for(let o of r)try{if(o.endsWith(".md")&&/permission/i.test(nt(f(e,n,o),"utf8")))return!0}catch{return!0}}return!1}function $n(t){let e=f(process.env.XDG_CONFIG_HOME||f(A(),".config"),"opencode"),n=G(t),r=[e,...n.map(c=>f(c,".opencode"))];if(xn(r))return"unreadable";let o=["opencode.json","opencode.jsonc","config.json"],i=[...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),s=j(i,!0,Et,!0);if(s==="unreadable")return s;for(let c of[process.env.OPENCODE_CONFIG_CONTENT,process.env.OPENCODE_PERMISSION]){if(!c)continue;let u;try{u=JSON.parse(Lt(c))}catch{return"unreadable"}if(!(c===process.env.OPENCODE_PERMISSION?et(u,s.matchers):h(u)&&Et(u,s.matchers)))return"unreadable"}return s}function vn(){return j([f(A(),".gemini","antigravity-cli","settings.json")],!0,(t,e)=>{let n=t.permissions;if(n===void 0)return!0;if(!h(n))return!1;for(let r of["deny","ask"]){let o=L(n[r]);if(!o)return!1;for(let i of o){let s=/^\s*command\s*\(([\s\S]*)\)\s*$/.exec(i);if(!s)continue;let c=s[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=>it(u,l))}}return!0},!1)}function h(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function On(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function En(t){let e=t.trim().replace(/\s+/g," "),n=e.endsWith(" *")&&e.length>2,r=(n?e.slice(0,-2):e).split("*").map(On).join("[\\s\\S]*");return new RegExp(`^${r}${n?"(?: [\\s\\S]*)?":""}(?= |$)`)}var An=512;function Rn(t){let e=t.replace(/['"\\]/g,"").split(/[\s;&|(){}<>`$]+/).filter(Boolean);return[e,e.map(W)]}function it(t,e){if(t.test(e)||t.test(e.trim().replace(/\s+/g," ")))return!0;for(let n of Rn(e)){if(n.length>An)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=En(t);return n=>it(e,n)}var Tn={"claude-code":hn,cursor:kn,"gemini-cli":wn,opencode:$n,antigravity:vn},Cn=new Set(["codex"]),Hn=/(?:^|[\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 Pn(t,e,n){let r=Tn[t];return r?r(e??process.cwd(),n):{matchers:[],complete:!1}}function Nn(t,e,n){return t==="unreadable"||Hn.test(e.replace(/['"\\]/g,""))||t.matchers.some(r=>r(e))?!1:t.complete||Nt(e,!Cn.has(n))}var In=new Set(["default","acceptEdits","dontAsk"]);function Ln(t,e){return e.host!=="claude-code"||e.permissionMode==="bypassPermissions"?!0:t!=="unreadable"&&t.allowsEverything===!0&&In.has(e.permissionMode??"")}function jn(t,e){let n="pathEnv"in t?t.pathEnv:process.env.PATH,r;return o=>t.host!=="claude-code"?E(o,t.cwd,n):(r??=kt(e.configDir),!E(o,t.cwd,n)&&!r.paths.some(i=>E(o,t.cwd,i))?!1:o.includes("/")||!_t(o,r))}function w(t,e,n,r){if(!n||/["\\$`;&|<>(){}]|'\\''/.test(n))return null;let o=e.claudeDirs??Z(),i=Pn(e.host,e.cwd,o),s=Nn(i,t,e.host)?cn(t,n,jn(e,o)):t;return s!==t&&i!=="unreadable"&&(i.matchers.some(c=>c(s))||(i.allow??[]).some(c=>c(s)&&!c(t)))&&(s=t),r(e.sessionId,s!==t),s===t||!Ln(i,e)?null:s}function R(t,e,n="unknown",r=b(e),o=k){return t?w(t,{host:e,sessionId:n},S()?null:r,o):null}function m(t,e){let n=t[e];return typeof n=="string"&&n?n:null}function F(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function Fn(t){return m(t,"prompt_id")||m(t,"scratchpad_dir")?!0:F(t.effort)}function Dn(t){return m(t,"tool_use_id")?.startsWith("toolu_")===!0||/^claude/i.test(m(t,"model")??"")}var Mn=new Set(["BeforeTool","AfterTool","BeforeAgent","AfterAgent","BeforeModel","AfterModel","BeforeToolSelection"]),Un=new Set(["preToolUse","postToolUse","beforeShellExecution","afterShellExecution","beforeSubmitPrompt","sessionStart","sessionEnd","stop"]),zn=new Set(["pre_tool","post_tool"]),Jn=new Set(["before_tool_call","after_tool_call"]),Bn=new Set(["runTerminalCommand","run_in_terminal"]),Wn=[["codex",t=>m(t,"turn_id")!==null],["claude-code",Fn],["cursor",t=>m(t,"cursor_version")!==null||m(t,"generation_id")!==null||m(t,"conversation_id")!==null||Array.isArray(t.workspace_roots)||Un.has(m(t,"hook_event_name")??"")],["gemini-cli",t=>Mn.has(m(t,"hook_event_name")??"")],["qwen-code",t=>t.hook_event_name==="PreToolUse"&&t.tool_name==="run_shell_command"],["vibe",t=>zn.has(m(t,"hook_event_name")??"")],["antigravity",t=>F(t.toolCall)],["copilot",t=>m(t,"toolName")!==null&&"toolArgs"in t||Bn.has(m(t,"tool_name")??"")],["grok",t=>t.toolName==="run_terminal_command"||t.tool_name==="run_terminal_command"||F(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&&m(t,"event")!==null&&!Jn.has(m(t,"event"))]],Gn=new Set(["codex","antigravity"]);function Zn(t){return F(t)?Wn.filter(([,e])=>e(t)).map(([e])=>e):[]}function Ft(t,e){if(!F(t))return null;let n=Zn(t);return n.length>1?null:n.length===1?n[0]:Dn(t)&&Gn.has(e)?"claude-code":e==="codex"?null:e}var ct=JSON.stringify({permission:"allow"});function Dt(t,e=b("cursor"),n=k){if(t.tool_name!=="Shell")return ct;let r=t.tool_input??{},o=r.command;if(typeof o!="string"||!o)return ct;let i=typeof r.working_directory=="string"?r.working_directory:void 0,s=w(o,{host:"cursor",sessionId:t.conversation_id??"unknown",cwd:i},S()?null:e,n);return s?JSON.stringify({permission:"allow",updated_input:{...r,command:s}}):ct}var K="{}";function Mt(t,e=b("gemini-cli"),n=k){if(t.hook_event_name!=="BeforeTool"||t.tool_name!=="run_shell_command")return K;let r=t.tool_input??{};if(r.is_background)return K;let o=r.command;if(typeof o!="string"||!o)return K;let i=typeof t.cwd=="string"?t.cwd:void 0,s=w(o,{host:"gemini-cli",sessionId:t.session_id??"unknown",cwd:i},S()?null:e,n);return s?JSON.stringify({hookSpecificOutput:{tool_input:{command:s}}}):K}var x="{}",Kn=new Set(["runTerminalCommand","run_in_terminal","Bash","bash"]),qn=["run_in_background","is_background","isBackground"];function q(t){return t!=null&&typeof t=="object"&&!Array.isArray(t)}function Yn(t){let e=t.session_id??t.sessionId;return typeof e=="string"&&e?e:"unknown"}function Vn(t,e){let n=t.cwd??e.cwd??e.workdir??e.working_directory;return typeof n=="string"&&n?n:void 0}function Y(t,e,n,r,o){if(!q(e)||qn.some(s=>e[s]===!0))return null;let i=e.command;return typeof i!="string"||!i?null:w(i,{host:t,sessionId:Yn(n),cwd:Vn(n,e)},S()?null:r,o)}function C(t,e){return JSON.stringify({hookSpecificOutput:{hookEventName:"PreToolUse",updatedInput:{...t,command:e}}})}function Xn(t){if(q(t))return t;if(typeof t!="string")return null;try{let e=JSON.parse(t);return q(e)?e:null}catch{return null}}function Qn(t,e,n){if(typeof t.tool_name=="string"){if(!Kn.has(t.tool_name))return x;let i=t.tool_input,s=Y("copilot",i,t,e,n);return s?C(i,s):x}if(t.toolName!=="bash")return x;let r=Xn(t.toolArgs),o=Y("copilot",r,t,e,n);return o?JSON.stringify({modifiedArgs:{...r,command:o}}):x}function T(t,e,n){return(r,o,i)=>{if(r.tool_name!==e)return x;let s=r.tool_input,c=Y(t,s,r,o,i);return c?n(s,c):x}}var tr=new Set(["run_terminal_command","Bash","bash"]);function er(t,e,n){let r=t.toolName??t.tool_name;if(typeof r!="string"||!tr.has(r))return x;let o=t.toolInput??t.tool_input,i=Y("grok",o,t,e,n);return i?C(o,i):x}var nr={copilot:Qn,droid:T("droid","Execute",C),trae:T("trae","RunCommand",C),"qwen-code":T("qwen-code","run_shell_command",C),crush:T("crush","bash",(t,e)=>JSON.stringify({updated_input:{command:e}})),junie:T("junie","Bash",(t,e)=>JSON.stringify({updatedInput:{...t,command:e}})),zcode:T("zcode","Bash",C),grok:er};function Ut(t,e,n=b(t),r=k){return q(e)?nr[t](e,n,r):x}function H(t){return S()?null:b(t)}function rr(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"?"":It(e,t,H(t),r,n.claudeDirs??Z(),n.pathEnv??process.env.PATH)??"";case"cursor":return Dt(e,H(t),r);case"gemini-cli":return Mt(e,H(t),r);case"vibe":return ut(e,(o,i)=>R(o,"vibe",i,H(t),r));case"antigravity":return lt(e,(o,i)=>R(o,"antigravity",i,H(t),r));default:return Ut(t,e,H(t),r)}}function D(t,e,n={}){let r=Ft(t,e);return r?rr(r,t,n):n.fallback??""}var or=new Set(["bash","file_system.bash"]),V=JSON.stringify({decision:"allow"});function ut(t,e=(n,r)=>R(n,"vibe",r)){if(!v(t)||t.hook_event_name!=="pre_tool"||typeof t.tool_name!="string"||!or.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 lt(t,e=(n,r)=>R(n,"antigravity",r)){if(!v(t)||!v(t.toolCall)||t.toolCall.name!=="run_command")return V;let n=t.toolCall.args;if(!v(n)||typeof n.CommandLine!="string"||!n.CommandLine)return V;let r=e(n.CommandLine,typeof t.conversationId=="string"?t.conversationId:"unknown");return r?JSON.stringify({decision:"allow",overwrite:{CommandLine:r}}):V}var zt={vibe:{build:t=>ut(t),fallback:""},antigravity:{build:t=>lt(t),fallback:V}};function Jt(t){return zt[t??""]?.fallback??""}function sr(t,e){let n=zt[t??""];if(!n)return"";let r;try{r=JSON.parse(e.replace(/^/,""))}catch{return n.fallback}return v(r)?D(r,t,{fallback:n.fallback}):n.build(r)}async function Bt(t){process.stdout.write(sr(t,await N()))}Bt(process.argv[2]).catch(t=>{process.stderr.write(`tkr-agent-hook: ${t.message}
13
- `),process.stdout.write(Jt(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=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)});