@sma1lboy/kobe 0.7.64 → 0.7.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -4,7 +4,7 @@ var Ip=Object.create;var{getPrototypeOf:Lp,defineProperty:iI,getOwnPropertyNames
4
4
  `).filter((r)=>r.length>0)}wrapCommand(n,t={}){let r=t.cwd?`cd ${gA(t.cwd)} && ${n}`:n;return`${lA(this.spec,{tty:t.tty}).map(cY).join(" ")} ${gA(r)}`}}var gA,uY,qW=(n,t)=>{let[r,...o]=n,s=eY(r??"",o,{env:t?{...process.env,...t}:process.env,encoding:"utf8",shell:!1});return{stdout:s.stdout??"",stderr:s.stderr??"",exitCode:s.status??-1}},fY=(n,t,r)=>KW(n,{env:t?{...process.env,...t}:process.env,signal:r?.signal});var hI=wn(()=>{fA();gA=$w,uY=_w});import{spawnSync as lY}from"child_process";import{platform as gY}from"os";function VW(n,t,r){return{service:mY,account:r?`${t}@${n}:${r}`:`${t}@${n}`}}function yI(n=kI){return n.platform()==="darwin"}function XW(n,t,r=kI){if(r.platform()!=="darwin")return!1;let{exitCode:o}=r.run(["security","add-generic-password","-U","-s",n.service,"-a",n.account,"-w",t]);return o===0}function hA(n,t=kI){if(t.platform()!=="darwin")return null;let{stdout:r,exitCode:o}=t.run(["security","find-generic-password","-s",n.service,"-a",n.account,"-w"]);if(o!==0)return null;return r.replace(/\n$/,"")}var kI,mY="kobe-remote-ssh";var wI=wn(()=>{kI={run(n){let[t,...r]=n,o=lY(t??"",r,{encoding:"utf8",shell:!1});return{stdout:o.stdout??"",exitCode:o.status??-1}},platform(){return gY()}}});import{existsSync as hY}from"fs";function JW(n){let t=n.auth,r=t.kind==="key"?{kind:"key",keyPath:t.keyPath}:{kind:"password",getPassword:()=>hA(t.keychainRef)};return{host:n.host,user:n.user,port:n.port,auth:r,controlPath:sA(n.host,n.user,n.port)}}function tx(n){let t=Ju(n);if(!t)return new mA;return new nx(JW(t))}function pu(n){for(let t of Object.values(gI()))if(n===t.basePath||n.startsWith(`${t.basePath}/`))return new nx(JW(t));return new mA}function kA(n){return n&&ns(n)?n:void 0}function xm(n){return pu(n).isRemote||hY(n)}function to(n){return pu(n).isRemote?Wa():n}var mu=wn(()=>{Mo();Je();hI();wI()});function _0(n){return`kobe-hidden-${n.replace(/[^A-Za-z0-9_-]/g,"")||"session"}`}function QW(n){let t=Number.parseInt(n.replace(/^@/,""),10);return Number.isFinite(t)&&t>=0?1000+t:1000}function TI(n){if(!Number.isFinite(n))return YW;return Math.max(kY,Math.min(yY,Math.round(n)))}function hk(n){if(!Number.isFinite(n))return null;return Math.max(wY,Math.min(xY,Math.round(n)))}function $W(n){let t=Number.parseInt(n[yA]??"",10),r=Number.isFinite(t)&&t>0?TI(t):YW,o=hk(Number.parseInt(n[wA]??"",10)),s=hk(Number.parseInt(n[xA]??"",10)),u=[];if(o!==null)u.push("-x",`${o}%`);if(s!==null)u.push("-y",`${s}%`);return{tasksWidth:r,rightColumnWidthPct:o??100-SI,opsHeightPct:s??nT,rightColumnResizeArgs:u}}function _r(n){return $w(n)}function ku(n){return _w(n)}function yu(n,t){let s=`${t?xI:""}${n}; __rc=$?; [ "$__rc" -ne 0 ] && printf '${"\\n \u26A0 Engine exited (code %s). Check Settings \u2192 Engines and fix the launch command.\\n\\n"}' "$__rc"; `;return t?`${s}"\${SHELL:-/bin/sh}"; ${t}`:`${s}exec "\${SHELL:-/bin/sh}"`}function _W(n){return`trap '' INT; while :; do ${n}; sleep 1; done`}function ex(n,t,r){return`${n}${t.map(_r).join(" ")} engine-tab-exit --session ${_r(r)}`}function nG(){return`clear; printf ${_r("\\n No task selected\\n\\n Press N to create a task, or pick one on the left.\\n\\n")}; exec "\${SHELL:-/bin/sh}"`}function RI(n){let t=typeof n==="number"?n:n==null?Number.NaN:Number.parseInt(n,10);if(!Number.isFinite(t))return bY;return Math.max(TY,Math.min(SY,Math.round(t)))}function RY(n,t){let r=String(t),o="\\n \u26A0 Repo init (.kobe/init.sh) timed out after %ss and was killed; continuing to the engine.\\n\\n",s="\\n \u26A0 Repo init (.kobe/init.sh) failed (code %s); continuing to the engine.\\n\\n";return['__kobe_init_env="${TMPDIR:-/tmp}/kobe-init-env.$$"','__kobe_init_to="${TMPDIR:-/tmp}/kobe-init-timeout.$$"','rm -f "$__kobe_init_env" "$__kobe_init_to" 2>/dev/null',"(",n,"__kobe_init_ec=$?",'export -p > "$__kobe_init_env" 2>/dev/null',"exit $__kobe_init_ec",") </dev/null &","__kobe_init_pid=$!",`( sleep ${r}; : > "$__kobe_init_to"; kill -TERM "$__kobe_init_pid" 2>/dev/null; sleep 2; kill -KILL "$__kobe_init_pid" 2>/dev/null ) &`,"__kobe_init_wd=$!",'wait "$__kobe_init_pid" 2>/dev/null; __kobe_init_rc=$?','kill "$__kobe_init_wd" 2>/dev/null; wait "$__kobe_init_wd" 2>/dev/null',`if [ -f "$__kobe_init_to" ]; then __kobe_init_rc=124; printf '${"\\n \u26A0 Repo init (.kobe/init.sh) timed out after %ss and was killed; continuing to the engine.\\n\\n"}' '${r}';`,'elif [ "$__kobe_init_rc" -eq 0 ]; then [ -f "$__kobe_init_env" ] && . "$__kobe_init_env" 2>/dev/null;',`else printf '${"\\n \u26A0 Repo init (.kobe/init.sh) failed (code %s); continuing to the engine.\\n\\n"}' "$__kobe_init_rc"; fi`,'rm -f "$__kobe_init_env" "$__kobe_init_to" 2>/dev/null'].join(`
5
5
  `)}function tG(n,t,r){let o=yu(n,r),s=t?.initScript?.trim();if(!s)return o;let u=RI(t?.timeoutSeconds),f=RY(s,u);if(t?.markerPath){let a=_r(t.markerPath),l=_r(vY(t.markerPath));return xI+[`if [ ! -f ${a} ]; then`,f,`if [ "$__kobe_init_rc" -eq 0 ]; then mkdir -p ${l} && : > ${a}; fi`,"fi",o].join(`
6
6
  `)}return xI+[f,o].join(`
7
- `)}function vY(n){let t=n.lastIndexOf("/");return t<=0?".":n.slice(0,t)}function pW(n){return`cd ${_r(n)} && while :; do clear; printf "\\033[1m# %s\\033[0m\\n\\n" ${_r(n)}; git status --short --branch 2>/dev/null | sed 's/^/ /' || true; printf "\\n"; if command -v lsd >/dev/null 2>&1; then lsd --tree --git -I node_modules -I .git --depth 2 .; elif command -v eza >/dev/null 2>&1; then eza --tree --git -L 2 -I 'node_modules|.git' .; elif command -v tree >/dev/null 2>&1; then tree -L 2 -I 'node_modules|.git'; else ls -la; fi; sleep 2; done`}function rG(n){let t=_r(n.worktree),r=_r(n.relPath),o=n.cliInvocation.map(_r).join(" "),s=`cd ${t} && if ! git diff --quiet HEAD -- ${r} 2>/dev/null; then git diff HEAD -- ${r} | { delta --paging=always 2>/dev/null || less -R; }; else bat --style=plain --paging=always ${r} 2>/dev/null || \${PAGER:-less} ${r} 2>/dev/null || cat ${r}; fi`;return`${o} ops --worktree ${t} --preview ${r} || { ${s}; }`}function eG(n){return`${ku([...n.cliInvocation,"update-page"])}`}function iG(n){let t=n.opener??"open";return[`tmux -L ${_r(n.tmuxSocket)} capture-pane -Jp -t '#{pane_id}' -S -500`,`grep -oiE 'https?://[^ "'\\''()<>]+'`,"awk '!seen[$0]++'","{ command -v fzf >/dev/null && fzf --reverse || tail -1; }",`xargs -I{} ${t} {}`].join(" | ")}function Tm(n,t={}){let r=[...n,"tasks"];if(t.initialTaskId)r.push("--initial-task-id",t.initialTaskId);return ku(r)}function ix(n){if(n.taskId&&n.claudePaneId){let t=n.cliInvocation.map(_r).join(" "),r=n.vendor?` --vendor ${_r(n.vendor)}`:"";return`KOBE_FILETREE_WATCH=1 ${t} ops --task-id ${_r(n.taskId)} --worktree ${_r(n.cwd)} --target-pane ${_r(n.claudePaneId)}${r} || { ${pW(n.cwd)}; }`}return pW(n.cwd)}var YW=32,Ga="tasks",Yl="claude",Md="ops",Dd="shell",$0="workspace_aux",bI=4,Cd="@kobe_hidden_shell_pane",hu="@kobe_hidden_tasks_pane",bm="@kobe_zen_panes",rx="@kobe_zen",yA="@kobe_tasks_width",kY=16,yY=120,SI=60,nT=50,wA="@kobe_right_width_pct",xA="@kobe_ops_height_pct",wY=10,xY=90,ZW,xI="trap ':' INT; ",bY=120,TY=5,SY=3600;var Yu=wn(()=>{fA();ZW=[yA,wA,xA]});function ox(n,t,r){if(!t)return n;let o=tx(t);return o.ensureReady(),o.wrapCommand(n,{tty:!0,cwd:r})}function mo(){let n=[];for(let t of["KOBE_HOME_DIR","KOBE_DAEMON_SOCKET_PATH","KOBE_TMUX_SOCKET"]){let r=process.env[t];if(r&&r.length>0)n.push(`${t}=${_r(r)}`)}return n.length>0?`${n.join(" ")} `:""}var tT="@kobe_remote";var Sm=wn(()=>{mu();Yu()});function oG(){return Xu(kk,!0)}function bA(){return Xu(sG,!1)}function aG(n){aA(sG,n)}var kk="zen.keepTasks",sG="zen.active";var TA=wn(()=>{Ic()});var SA;var uG=wn(()=>{SA={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.7.64",description:"TUI orchestrator for Claude Code (codename)",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/index.js"},files:["dist/cli","dist/web-ui","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/kobe.git"},homepage:"https://github.com/Sma1lboy/kobe#readme",bugs:{url:"https://github.com/Sma1lboy/kobe/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/cli/index.ts","dev:mock":"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/tui/mock/host.tsx","dev:mock-terminal":"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/tui/mock/terminal-host.tsx","dev:mock-react":"env KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"env KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-history":"env KOBE_DEV=1 bun ./src/tui-react/history/mock-host.tsx","dev:mock-react-filetree":"env KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"env KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-dialogs":"env KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-ops":"env KOBE_DEV=1 bun ./src/tui-react/ops/mock-host.tsx","dev:mock-react-settings":"env KOBE_DEV=1 bun ./src/tui-react/settings/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset","dev:version":"bash ../../scripts/dev-version.sh",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","test:fast":"vitest run --passWithNoTests","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@opentui/solid":"0.4.3","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.0","solid-js":"1.9.13",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.11","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var dG={};Pr(dG,{repoSlug:()=>yk,releasePageUrl:()=>CI,recommendedGlobalInstallCommand:()=>MI,isNewerSemver:()=>vI,fetchReleaseSummaries:()=>CY,fetchReleaseNotesRange:()=>DI,fetchReleaseNotes:()=>DY,compareSemver:()=>RA,checkLatestVersion:()=>rT,UPDATE_SCRIPT_URL:()=>vA,UPDATE_COMMAND:()=>Ql,PACKAGE_NAME:()=>AI,CURRENT_VERSION:()=>Xr});function yk(){let n=SA.repository?.url;if(!n)return null;let t=n.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!t||!t[1]||!t[2])return null;return`${t[1]}/${t[2]}`}function MI(){return`npm install -g ${AI}@latest`}async function MY(n){let t=new AbortController,r=setTimeout(()=>t.abort(),AA);try{let o=n.replace("/","%2F"),s=await fetch(`https://registry.npmjs.org/${o}/latest`,{signal:t.signal,headers:{accept:"application/json"}});if(!s.ok)return null;let u=await s.json();if(typeof u.version!=="string")return null;return u.version}catch{return null}finally{clearTimeout(r)}}function vI(n,t){return RA(n,t)>0}function RA(n,t){let r=(u)=>u.split("-")[0]??u,o=r(n).split(".").map((u)=>Number.parseInt(u,10)),s=r(t).split(".").map((u)=>Number.parseInt(u,10));for(let u=0;u<3;u++){let f=o[u]??0,a=s[u]??0;if(Number.isNaN(f)||Number.isNaN(a))return 0;if(f>a)return 1;if(f<a)return-1}return 0}async function rT(n={}){let t=process.env.KOBE_FAKE_UPDATE;if(t)return{current:Xr,latest:t,hasUpdate:vI(t,Xr)};if(IW()&&!n.force)return null;let r=await MY(AI);if(!r)return null;return{current:Xr,latest:r,hasUpdate:vI(r,Xr)}}function cG(n){if(typeof n!=="string")return null;return n.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function DY(n){let t=yk();if(!t)return null;let r=`v${n}`,o=new AbortController,s=setTimeout(()=>o.abort(),AA);try{let u=await fetch(`https://api.github.com/repos/${t}/releases/tags/${r}`,{signal:o.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!u.ok)return null;let f=await u.json();if(typeof f.body!=="string"||typeof f.html_url!=="string")return null;return{body:f.body,url:f.html_url,version:n}}catch{return null}finally{clearTimeout(s)}}async function DI(n){let t=yk();if(!t)return[];let r=n.limit??100,o=new AbortController,s=setTimeout(()=>o.abort(),AA);try{let u=await fetch(`https://api.github.com/repos/${t}/releases?per_page=${r}`,{signal:o.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!u.ok)return[];let f=await u.json();if(!Array.isArray(f))return[];return f.map((a)=>{let l=cG(a.tag_name);if(!l||typeof a.html_url!=="string"||typeof a.body!=="string")return null;if(RA(l,n.current)<=0)return null;if(RA(l,n.latest)>0)return null;return{version:l,url:a.html_url,body:a.body}}).filter((a)=>a!==null)}catch{return[]}finally{clearTimeout(s)}}async function CY(n=12){let t=yk();if(!t)return[];let r=new AbortController,o=setTimeout(()=>r.abort(),AA);try{let s=await fetch(`https://api.github.com/repos/${t}/releases?per_page=${n}`,{signal:r.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!s.ok)return[];let u=await s.json();if(!Array.isArray(u))return[];return u.map((f)=>{let a=cG(f.tag_name);if(!a||typeof f.html_url!=="string")return null;return{version:a,url:f.html_url}}).filter((f)=>f!==null)}catch{return[]}finally{clearTimeout(o)}}function CI(n){let t=yk();if(!t)return null;return`https://github.com/${t}/releases/tag/v${n}`}var Xr,AI,vA="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",Ql,AA=3000;var ua=wn(()=>{uG();Mo();Xr=SA.version,AI=SA.name;Ql=`curl -fsSL ${vA} | sh`});import{spawnSync as OY}from"child_process";import{existsSync as BY,statSync as IY}from"fs";import{homedir as LY}from"os";import eT from"path";async function fG(n=EY){let t=[],r=(m)=>{if(!m)return;return t.push(m),n.fileExists(m)?m:void 0},o=n.which("claude");if(o){if(t.push(`which:${o}`),n.fileExists(o))return o}let s=n.home(),u=r(eT.join(s,".claude","local","claude"));if(u)return u;let f=n.env("NVM_BIN");if(f){let m=r(eT.join(f,"claude"));if(m)return m}let a=eT.join(s,".nvm","versions","node"),l=n.readdir(a).sort().reverse();for(let m of l){let T=r(eT.join(a,m,"bin","claude"));if(T)return T}for(let m of["/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude","/bin/claude"]){let T=r(m);if(T)return T}for(let m of[".local/bin/claude",".npm-global/bin/claude",".yarn/bin/claude",".bun/bin/claude","bin/claude"]){let T=r(eT.join(s,m));if(T)return T}throw new MA(t)}var MA,EY;var lG=wn(()=>{MA=class MA extends Error{checkedPaths;constructor(n){super(`Claude Code binary not found. Checked: ${n.join(", ")}. Ensure 'claude' is on PATH, or install at ~/.claude/local/claude.`);this.name="ClaudeBinaryNotFoundError",this.checkedPaths=n}};EY={fileExists(n){try{return IY(n).isFile()}catch{return!1}},env(n){return process.env[n]},home(){return LY()},which(n){let t=process.platform==="win32"?"where":"which",r=OY(t,[n],{encoding:"utf8"});if(r.status!==0)return;let o=r.stdout.split(`
7
+ `)}function vY(n){let t=n.lastIndexOf("/");return t<=0?".":n.slice(0,t)}function pW(n){return`cd ${_r(n)} && while :; do clear; printf "\\033[1m# %s\\033[0m\\n\\n" ${_r(n)}; git status --short --branch 2>/dev/null | sed 's/^/ /' || true; printf "\\n"; if command -v lsd >/dev/null 2>&1; then lsd --tree --git -I node_modules -I .git --depth 2 .; elif command -v eza >/dev/null 2>&1; then eza --tree --git -L 2 -I 'node_modules|.git' .; elif command -v tree >/dev/null 2>&1; then tree -L 2 -I 'node_modules|.git'; else ls -la; fi; sleep 2; done`}function rG(n){let t=_r(n.worktree),r=_r(n.relPath),o=n.cliInvocation.map(_r).join(" "),s=`cd ${t} && if ! git diff --quiet HEAD -- ${r} 2>/dev/null; then git diff HEAD -- ${r} | { delta --paging=always 2>/dev/null || less -R; }; else bat --style=plain --paging=always ${r} 2>/dev/null || \${PAGER:-less} ${r} 2>/dev/null || cat ${r}; fi`;return`${o} ops --worktree ${t} --preview ${r} || { ${s}; }`}function eG(n){return`${ku([...n.cliInvocation,"update-page"])}`}function iG(n){let t=n.opener??"open";return[`tmux -L ${_r(n.tmuxSocket)} capture-pane -Jp -t '#{pane_id}' -S -500`,`grep -oiE 'https?://[^ "'\\''()<>]+'`,"awk '!seen[$0]++'","{ command -v fzf >/dev/null && fzf --reverse || tail -1; }",`xargs -I{} ${t} {}`].join(" | ")}function Tm(n,t={}){let r=[...n,"tasks"];if(t.initialTaskId)r.push("--initial-task-id",t.initialTaskId);return ku(r)}function ix(n){if(n.taskId&&n.claudePaneId){let t=n.cliInvocation.map(_r).join(" "),r=n.vendor?` --vendor ${_r(n.vendor)}`:"";return`KOBE_FILETREE_WATCH=1 ${t} ops --task-id ${_r(n.taskId)} --worktree ${_r(n.cwd)} --target-pane ${_r(n.claudePaneId)}${r} || { ${pW(n.cwd)}; }`}return pW(n.cwd)}var YW=32,Ga="tasks",Yl="claude",Md="ops",Dd="shell",$0="workspace_aux",bI=4,Cd="@kobe_hidden_shell_pane",hu="@kobe_hidden_tasks_pane",bm="@kobe_zen_panes",rx="@kobe_zen",yA="@kobe_tasks_width",kY=16,yY=120,SI=60,nT=50,wA="@kobe_right_width_pct",xA="@kobe_ops_height_pct",wY=10,xY=90,ZW,xI="trap ':' INT; ",bY=120,TY=5,SY=3600;var Yu=wn(()=>{fA();ZW=[yA,wA,xA]});function ox(n,t,r){if(!t)return n;let o=tx(t);return o.ensureReady(),o.wrapCommand(n,{tty:!0,cwd:r})}function mo(){let n=[];for(let t of["KOBE_HOME_DIR","KOBE_DAEMON_SOCKET_PATH","KOBE_TMUX_SOCKET"]){let r=process.env[t];if(r&&r.length>0)n.push(`${t}=${_r(r)}`)}return n.length>0?`${n.join(" ")} `:""}var tT="@kobe_remote";var Sm=wn(()=>{mu();Yu()});function oG(){return Xu(kk,!0)}function bA(){return Xu(sG,!1)}function aG(n){aA(sG,n)}var kk="zen.keepTasks",sG="zen.active";var TA=wn(()=>{Ic()});var SA;var uG=wn(()=>{SA={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.7.65",description:"TUI orchestrator for Claude Code (codename)",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/index.js"},files:["dist/cli","dist/web-ui","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/kobe.git"},homepage:"https://github.com/Sma1lboy/kobe#readme",bugs:{url:"https://github.com/Sma1lboy/kobe/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/cli/index.ts","dev:mock":"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/tui/mock/host.tsx","dev:mock-terminal":"env KOBE_DEV=1 bun --preload @opentui/solid/preload --conditions=browser ./src/tui/mock/terminal-host.tsx","dev:mock-react":"env KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"env KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-history":"env KOBE_DEV=1 bun ./src/tui-react/history/mock-host.tsx","dev:mock-react-filetree":"env KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"env KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-dialogs":"env KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-ops":"env KOBE_DEV=1 bun ./src/tui-react/ops/mock-host.tsx","dev:mock-react-settings":"env KOBE_DEV=1 bun ./src/tui-react/settings/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset","dev:version":"bash ../../scripts/dev-version.sh",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","test:fast":"vitest run --passWithNoTests","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@opentui/solid":"0.4.3","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.0","solid-js":"1.9.13",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.11","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var dG={};Pr(dG,{repoSlug:()=>yk,releasePageUrl:()=>CI,recommendedGlobalInstallCommand:()=>MI,isNewerSemver:()=>vI,fetchReleaseSummaries:()=>CY,fetchReleaseNotesRange:()=>DI,fetchReleaseNotes:()=>DY,compareSemver:()=>RA,checkLatestVersion:()=>rT,UPDATE_SCRIPT_URL:()=>vA,UPDATE_COMMAND:()=>Ql,PACKAGE_NAME:()=>AI,CURRENT_VERSION:()=>Xr});function yk(){let n=SA.repository?.url;if(!n)return null;let t=n.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!t||!t[1]||!t[2])return null;return`${t[1]}/${t[2]}`}function MI(){return`npm install -g ${AI}@latest`}async function MY(n){let t=new AbortController,r=setTimeout(()=>t.abort(),AA);try{let o=n.replace("/","%2F"),s=await fetch(`https://registry.npmjs.org/${o}/latest`,{signal:t.signal,headers:{accept:"application/json"}});if(!s.ok)return null;let u=await s.json();if(typeof u.version!=="string")return null;return u.version}catch{return null}finally{clearTimeout(r)}}function vI(n,t){return RA(n,t)>0}function RA(n,t){let r=(u)=>u.split("-")[0]??u,o=r(n).split(".").map((u)=>Number.parseInt(u,10)),s=r(t).split(".").map((u)=>Number.parseInt(u,10));for(let u=0;u<3;u++){let f=o[u]??0,a=s[u]??0;if(Number.isNaN(f)||Number.isNaN(a))return 0;if(f>a)return 1;if(f<a)return-1}return 0}async function rT(n={}){let t=process.env.KOBE_FAKE_UPDATE;if(t)return{current:Xr,latest:t,hasUpdate:vI(t,Xr)};if(IW()&&!n.force)return null;let r=await MY(AI);if(!r)return null;return{current:Xr,latest:r,hasUpdate:vI(r,Xr)}}function cG(n){if(typeof n!=="string")return null;return n.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function DY(n){let t=yk();if(!t)return null;let r=`v${n}`,o=new AbortController,s=setTimeout(()=>o.abort(),AA);try{let u=await fetch(`https://api.github.com/repos/${t}/releases/tags/${r}`,{signal:o.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!u.ok)return null;let f=await u.json();if(typeof f.body!=="string"||typeof f.html_url!=="string")return null;return{body:f.body,url:f.html_url,version:n}}catch{return null}finally{clearTimeout(s)}}async function DI(n){let t=yk();if(!t)return[];let r=n.limit??100,o=new AbortController,s=setTimeout(()=>o.abort(),AA);try{let u=await fetch(`https://api.github.com/repos/${t}/releases?per_page=${r}`,{signal:o.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!u.ok)return[];let f=await u.json();if(!Array.isArray(f))return[];return f.map((a)=>{let l=cG(a.tag_name);if(!l||typeof a.html_url!=="string"||typeof a.body!=="string")return null;if(RA(l,n.current)<=0)return null;if(RA(l,n.latest)>0)return null;return{version:l,url:a.html_url,body:a.body}}).filter((a)=>a!==null)}catch{return[]}finally{clearTimeout(s)}}async function CY(n=12){let t=yk();if(!t)return[];let r=new AbortController,o=setTimeout(()=>r.abort(),AA);try{let s=await fetch(`https://api.github.com/repos/${t}/releases?per_page=${n}`,{signal:r.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!s.ok)return[];let u=await s.json();if(!Array.isArray(u))return[];return u.map((f)=>{let a=cG(f.tag_name);if(!a||typeof f.html_url!=="string")return null;return{version:a,url:f.html_url}}).filter((f)=>f!==null)}catch{return[]}finally{clearTimeout(o)}}function CI(n){let t=yk();if(!t)return null;return`https://github.com/${t}/releases/tag/v${n}`}var Xr,AI,vA="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",Ql,AA=3000;var ua=wn(()=>{uG();Mo();Xr=SA.version,AI=SA.name;Ql=`curl -fsSL ${vA} | sh`});import{spawnSync as OY}from"child_process";import{existsSync as BY,statSync as IY}from"fs";import{homedir as LY}from"os";import eT from"path";async function fG(n=EY){let t=[],r=(m)=>{if(!m)return;return t.push(m),n.fileExists(m)?m:void 0},o=n.which("claude");if(o){if(t.push(`which:${o}`),n.fileExists(o))return o}let s=n.home(),u=r(eT.join(s,".claude","local","claude"));if(u)return u;let f=n.env("NVM_BIN");if(f){let m=r(eT.join(f,"claude"));if(m)return m}let a=eT.join(s,".nvm","versions","node"),l=n.readdir(a).sort().reverse();for(let m of l){let T=r(eT.join(a,m,"bin","claude"));if(T)return T}for(let m of["/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude","/bin/claude"]){let T=r(m);if(T)return T}for(let m of[".local/bin/claude",".npm-global/bin/claude",".yarn/bin/claude",".bun/bin/claude","bin/claude"]){let T=r(eT.join(s,m));if(T)return T}throw new MA(t)}var MA,EY;var lG=wn(()=>{MA=class MA extends Error{checkedPaths;constructor(n){super(`Claude Code binary not found. Checked: ${n.join(", ")}. Ensure 'claude' is on PATH, or install at ~/.claude/local/claude.`);this.name="ClaudeBinaryNotFoundError",this.checkedPaths=n}};EY={fileExists(n){try{return IY(n).isFile()}catch{return!1}},env(n){return process.env[n]},home(){return LY()},which(n){let t=process.platform==="win32"?"where":"which",r=OY(t,[n],{encoding:"utf8"});if(r.status!==0)return;let o=r.stdout.split(`
8
8
  `).map((s)=>s.trim()).filter(Boolean)[0];if(!o)return;if(o.startsWith("claude:")&&o.includes("aliased to")){let s=o.split("aliased to")[1]?.trim();return s&&BY(s)?s:void 0}return o},readdir(n){try{return p0("fs").readdirSync(n)}catch{return[]}}}});import{spawnSync as FY}from"child_process";import{existsSync as jY,statSync as HY}from"fs";import{homedir as WY}from"os";import gG from"path";async function mG(n=GY){let t=[],r=(f)=>{if(!f)return;return t.push(f),n.fileExists(f)?f:void 0},o=n.which("codex");if(o){if(t.push(`which:${o}`),n.fileExists(o))return o}let s=n.home();for(let f of["/opt/homebrew/bin/codex","/usr/local/bin/codex","/usr/bin/codex","/bin/codex"]){let a=r(f);if(a)return a}let u=n.env("NVM_BIN");if(u){let f=r(gG.join(u,"codex"));if(f)return f}for(let f of[".local/bin/codex",".bun/bin/codex","bin/codex"]){let a=r(gG.join(s,f));if(a)return a}throw new DA(t)}var DA,GY;var hG=wn(()=>{DA=class DA extends Error{checkedPaths;constructor(n){super(`Codex CLI binary not found. Checked: ${n.join(", ")}. Ensure 'codex' is on PATH (e.g. \`brew install codex\` or the official installer).`);this.name="CodexBinaryNotFoundError",this.checkedPaths=n}};GY={fileExists(n){try{return HY(n).isFile()}catch{return!1}},env(n){return process.env[n]},home(){return WY()},which(n){let t=process.platform==="win32"?"where":"which",r=FY(t,[n],{encoding:"utf8"});if(r.status!==0)return;let o=r.stdout.split(`
9
9
  `).map((s)=>s.trim()).filter(Boolean)[0];if(!o)return;if(o.startsWith("codex:")&&o.includes("aliased to")){let s=o.split("aliased to")[1]?.trim();return s&&jY(s)?s:void 0}return o},readdir(n){try{return p0("fs").readdirSync(n)}catch{return[]}}}});import{spawnSync as UY}from"child_process";import{existsSync as PY,statSync as NY}from"fs";import{homedir as zY}from"os";import Rm from"path";async function kG(n=qY){let t=[],r=(T)=>{if(!T)return;return t.push(T),n.fileExists(T)?T:void 0},o=n.which("copilot");if(o){if(t.push(`which:${o}`),n.fileExists(o))return o}let s=n.platform()==="win32"?["copilot.exe","copilot.cmd","copilot"]:["copilot"],u=(T)=>{if(!T)return;for(let y of s){let k=r(Rm.join(T,y));if(k)return k}return};for(let T of["/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"]){let y=u(T);if(y)return y}let f=n.env("NVM_BIN"),a=u(f);if(a)return a;let l=n.home(),m=[Rm.join(l,".npm-global/bin"),Rm.join(l,".local/bin"),Rm.join(l,".bun/bin"),Rm.join(l,"bin")];if(n.platform()==="win32"){let T=n.env("APPDATA"),y=n.env("LOCALAPPDATA");if(m.unshift(Rm.join(l,"AppData/Roaming/npm")),T)m.unshift(Rm.join(T,"npm"));if(y)m.unshift(Rm.join(y,"npm"))}for(let T of m){let y=u(T);if(y)return y}throw new CA(t)}var CA,qY;var yG=wn(()=>{CA=class CA extends Error{checkedPaths;constructor(n){super(`GitHub Copilot CLI binary not found. Checked: ${n.join(", ")}. Ensure 'copilot' is on PATH (for example \`npm install -g @github/copilot\` or \`brew install copilot-cli\`).`);this.name="CopilotBinaryNotFoundError",this.checkedPaths=n}};qY={fileExists(n){try{return NY(n).isFile()}catch{return!1}},env(n){return process.env[n]},home(){return zY()},which(n){let t=process.platform==="win32"?"where":"which",r=UY(t,[n],{encoding:"utf8"});if(r.status!==0)return;let o=r.stdout.split(`
10
10
  `).map((s)=>s.trim()).filter(Boolean)[0];if(!o)return;if(o.startsWith("copilot:")&&o.includes("aliased to")){let s=o.split("aliased to")[1]?.trim();return s&&PY(s)?s:void 0}return o},platform(){return process.platform}}});import{readFileSync as KY,statSync as VY}from"fs";import{readFile as XY,stat as JY}from"fs/promises";async function sx(n,t=wG){let{size:r}=await JY(n);if(r>t)return"";return XY(n,"utf8")}function xG(n,t=wG){let r;try{r=VY(n)}catch(o){if(o.code==="ENOENT")return null;throw o}if(r.size>t)return null;return KY(n,"utf8")}function Zl(n,t=pY){return n.length<=t}var wG=104857600,pY=8388608;var wk=()=>{};import{homedir as YY}from"os";import vm from"path";function QY(n,t){let r=n("CLAUDE_CONFIG_DIR")?.trim();if(r)return vm.join(r,".claude.json");return vm.join(t,".claude.json")}function ZY(n,t){let o=n("CODEX_HOME")?.trim()??vm.join(t,".codex");return vm.join(o,"auth.json")}function $Y(n,t){let o=n("COPILOT_HOME")?.trim()??vm.join(t,".copilot");return vm.join(o,"config.json")}function _Y(n){let t=n.split(".");if(t.length!==3)return null;let r=t[1];if(!r)return null;let o=r.replace(/-/g,"+").replace(/_/g,"/"),s=o+"=".repeat((4-o.length%4)%4);try{let u=Buffer.from(s,"base64").toString("utf8"),f=JSON.parse(u);return typeof f==="object"&&f!==null?f:null}catch{return null}}async function BA(n){try{return{found:!0,path:await n()}}catch(t){if(t instanceof MA||t instanceof DA||t instanceof CA)return{found:!1,error:"not found on PATH"};return{found:!1,error:t instanceof Error?t.message:String(t)}}}async function bG(n){return(await Promise.all([["claude",()=>n.findClaudeBinary()],["codex",()=>n.findCodexBinary()],["copilot",()=>n.findCopilotBinary()]].map(async([o,s])=>(await BA(s)).found?o:null))).filter((o)=>o!==null)}function nQ(n=ax){if(n!==ax)return bG(n);if(OA)return OA;let t=bG(n).catch((r)=>{throw OA=null,r});return OA=t,t}async function Od(n=ax){return[...await nQ(n),...Zw()]}async function ux(n=ax){let t=await BA(()=>n.findClaudeBinary()),r=QY(n.env,n.home()),o;try{o=n.readFile(r)}catch(l){return{binary:t,account:{kind:"none"},accountError:`read ${r}: ${l instanceof Error?l.message:String(l)}`}}if(o===null)return{binary:t,account:{kind:"none"}};let s;try{s=JSON.parse(o)}catch(l){return{binary:t,account:{kind:"none"},accountError:`parse ${r}: ${l instanceof Error?l.message:String(l)}`}}let u=s?.oauthAccount;if(!u||typeof u!=="object")return{binary:t,account:{kind:"none"}};let f=u,a=typeof f.emailAddress==="string"?f.emailAddress:void 0;if(!a)return{binary:t,account:{kind:"none"}};return{binary:t,account:{kind:"oauth",email:a,organization:typeof f.organizationName==="string"?f.organizationName:void 0,displayName:typeof f.displayName==="string"?f.displayName:void 0,billingType:typeof f.billingType==="string"?f.billingType:void 0}}}async function cx(n=ax){let t=await BA(()=>n.findCodexBinary()),r=ZY(n.env,n.home()),o;try{o=n.readFile(r)}catch(m){return{binary:t,account:{kind:"none"},accountError:`read ${r}: ${m instanceof Error?m.message:String(m)}`}}if(o===null)return{binary:t,account:{kind:"none"}};let s;try{s=JSON.parse(o)}catch(m){return{binary:t,account:{kind:"none"},accountError:`parse ${r}: ${m instanceof Error?m.message:String(m)}`}}let u=s??{},f=u.tokens,a=typeof f?.id_token==="string"?f.id_token:void 0;if(a){let m=_Y(a);if(!m)return{binary:t,account:{kind:"none"},accountError:"codex id_token: malformed JWT"};let T=typeof m.email==="string"?m.email:void 0,y=m["https://api.openai.com/auth"],k=typeof y==="object"&&y!==null&&!Array.isArray(y)?y:void 0,w=typeof k?.chatgpt_plan_type==="string"?k.chatgpt_plan_type:void 0;if(T)return{binary:t,account:{kind:"chatgpt",email:T,plan:w}};return{binary:t,account:{kind:"none"},accountError:"codex id_token: no email claim"}}let l=u.OPENAI_API_KEY;if(typeof l==="string"&&l.length>0)return{binary:t,account:{kind:"apikey"}};return{binary:t,account:{kind:"none"}}}async function dx(n=ax){let t=await BA(()=>n.findCopilotBinary());for(let u of["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"])if(n.env(u)?.trim())return{binary:t,account:{kind:"token",source:u}};let r=$Y(n.env,n.home()),o;try{o=n.readFile(r)}catch(u){return{binary:t,account:{kind:"none"},accountError:`read ${r}: ${u instanceof Error?u.message:String(u)}`}}if(o===null)return{binary:t,account:{kind:"none"}};let s;try{s=JSON.parse(o)}catch(u){return{binary:t,account:{kind:"none"},accountError:`parse ${r}: ${u instanceof Error?u.message:String(u)}`}}if(!OI(s))return{binary:t,account:{kind:"none"}};if(TG(s,["github_token","oauth_token","access_token","token","selectedUser","currentUser","user"]))return{binary:t,account:{kind:"oauth"}};return{binary:t,account:{kind:"none"}}}function OI(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function TG(n,t,r=0){if(r>4||!OI(n))return!1;for(let[o,s]of Object.entries(n)){if(t.includes(o)&&typeof s==="string"&&s.length>0)return!0;if(OI(s)&&TG(s,t,r+1))return!0}return!1}var ax,OA=null;var $l=wn(()=>{Je();lG();hG();yG();wk();ax={readFile(n){return xG(n)},env(n){return process.env[n]},home(){return YY()},findClaudeBinary(){return fG()},findCodexBinary(){return mG()},findCopilotBinary(){return kG()}}});function SG(n,t){return tQ.map((r)=>({vendor:"claude",id:n,effort:r,level:r,label:`${t} \xB7 ${r}`,hint:r==="max"?"deepest reasoning":`${r} effort`}))}function vG(n){return/1m/i.test(n)?rQ:eQ}var tQ,RG,rQ=1e6,eQ=200000;var AG=wn(()=>{tQ=["low","medium","high","xhigh","max"];RG=[{vendor:"claude",id:"claude-opus-4-7[1m]",label:"Opus 4.7 1M",hint:"long context, default"},...SG("claude-opus-4-7[1m]","Opus 4.7 1M"),{vendor:"claude",id:"claude-opus-4-7",label:"Opus 4.7",hint:"most capable, slowest"},...SG("claude-opus-4-7","Opus 4.7"),{vendor:"claude",id:"claude-sonnet-4-6[1m]",label:"sonnet 4.6 (1M)",hint:"long context"},{vendor:"claude",id:"claude-sonnet-4-6",label:"sonnet 4.6"},{vendor:"claude",id:"claude-haiku-4-5-20251001",label:"haiku 4.5",hint:"fastest, cheapest"}]});import{readFileSync as iQ}from"fs";import{homedir as oQ}from"os";import{join as sQ}from"path";function uQ(){if(fx!==void 0)return fx;try{let n=iQ(aQ,"utf8"),t=JSON.parse(n);if(!t||typeof t!=="object")return fx=null,null;let r=t;return fx={model:typeof r.model==="string"&&r.model.length>0?r.model:void 0},fx}catch{return fx=null,null}}function MG(){let n=uQ();if(n?.model&&n.model.length>0)return n.model;return cQ}var aQ,fx,cQ="claude-opus-4-7[1m]";var DG=wn(()=>{aQ=sQ(oQ(),".claude","settings.json")});var CG,OG;var BG=wn(()=>{AG();DG();CG={vendorId:"claude",label:"Claude Code",models:RG,permissionModes:[{id:"acceptEdits",label:"accept edits"},{id:"default",label:"default"},{id:"plan",label:"plan mode"}],defaultModelId:MG,contextWindowFor:vG,smallFastModelId:()=>"claude-haiku-4-5-20251001"},OG={vendorId:"claude",productName:"Claude Code",shortName:"Claude",assistantName:"Claude",inputPlaceholder:"Ask Claude\u2026"}});import{createHash as dQ}from"crypto";function lx(n){let t=n.maxFiles??8,r=new Map;function o(u,f){return dQ("sha256").update(u.slice(0,f)).digest("hex")}function s(u,f){if(r.delete(u),r.set(u,f),r.size>t){let a=r.keys().next().value;if(a!==void 0)r.delete(a)}}return function(f,a,l){let m=a.lastIndexOf(`
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@sma1lboy/kobe",
4
- "version": "0.7.64",
4
+ "version": "0.7.65",
5
5
  "description": "TUI orchestrator for Claude Code (codename)",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",