@sma1lboy/kobe 0.7.76 → 0.7.77

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 en=Object.create;var{getPrototypeOf:$i,defineProperty:vC,getOwnPropertyNames
4
4
  `).filter((J)=>J.length>0)}wrapCommand($,X={}){let J=X.cwd?`cd ${lF(X.cwd)} && ${$}`:$;return`${cF(this.spec,{tty:X.tty}).map(Ei).join(" ")} ${lF(J)}`}}var lF,gi,aP=($,X)=>{let[J,...Q]=$,Y=Ii(J??"",Q,{env:X?{...process.env,...X}:process.env,encoding:"utf8",shell:!1});return{stdout:Y.stdout??"",stderr:Y.stderr??"",exitCode:Y.status??-1}},wi=($,X,J)=>oP($,{env:X?{...process.env,...X}:process.env,signal:J?.signal});var aC=Z1(()=>{mF();lF=iG,gi=aG});import{spawnSync as bi}from"child_process";import{platform as xi}from"os";function rP($,X,J){return{service:yi,account:J?`${X}@${$}:${J}`:`${X}@${$}`}}function rC($=oC){return $.platform()==="darwin"}function sP($,X,J=oC){if(J.platform()!=="darwin")return!1;let{exitCode:Q}=J.run(["security","add-generic-password","-U","-s",$.service,"-a",$.account,"-w",X]);return Q===0}function pF($,X=oC){if(X.platform()!=="darwin")return null;let{stdout:J,exitCode:Q}=X.run(["security","find-generic-password","-s",$.service,"-a",$.account,"-w"]);if(Q!==0)return null;return J.replace(/\n$/,"")}var oC,yi="kobe-remote-ssh";var sC=Z1(()=>{oC={run($){let[X,...J]=$,Q=bi(X??"",J,{encoding:"utf8",shell:!1});return{stdout:Q.stdout??"",exitCode:Q.status??-1}},platform(){return xi()}}});import{existsSync as vi}from"fs";function tP($){let X=$.auth,J=X.kind==="key"?{kind:"key",keyPath:X.keyPath}:{kind:"password",getPassword:()=>pF(X.keychainRef)};return{host:$.host,user:$.user,port:$.port,auth:J,controlPath:yF($.host,$.user,$.port)}}function rG($){let X=o$($);if(!X)return new dF;return new oG(tP(X))}function r$($){for(let X of Object.values(nC()))if($===X.basePath||$.startsWith(`${X.basePath}/`))return new oG(tP(X));return new dF}function nF($){return $&&X7($)?$:void 0}function HZ($){return r$($).isRemote||vi($)}function U4($){return r$($).isRemote?h8():$}var N$=Z1(()=>{E4();q5();aC();sC()});function mB($){return`kobe-hidden-${$.replace(/[^A-Za-z0-9_-]/g,"")||"session"}`}function XS($){let X=Number.parseInt($.replace(/^@/,""),10);return Number.isFinite(X)&&X>=0?1000+X:1000}function $A($){if(!Number.isFinite($))return $S;return Math.max(ui,Math.min(hi,Math.round($)))}function JQ($){if(!Number.isFinite($))return null;return Math.max(mi,Math.min(ci,Math.round($)))}function ZS($){let X=Number.parseInt($[iF]??"",10),J=Number.isFinite(X)&&X>0?$A(X):$S,Q=JQ(Number.parseInt($[aF]??"",10)),Y=JQ(Number.parseInt($[oF]??"",10)),q=[];if(Q!==null)q.push("-x",`${Q}%`);if(Y!==null)q.push("-y",`${Y}%`);return{tasksWidth:J,rightColumnWidthPct:Q??100-XA,opsHeightPct:Y??cB,rightColumnResizeArgs:q}}function C2($){return iG($)}function j$($){return aG($)}function V$($,X){let Y=`${X?tC:""}${$}; __rc=$?; [ "$__rc" -ne 0 ] && printf '${"\\n \u26A0 Engine exited (code %s). Check Settings \u2192 Engines and fix the launch command.\\n\\n"}' "$__rc"; `;return X?`${Y}"\${SHELL:-/bin/sh}"; ${X}`:`${Y}exec "\${SHELL:-/bin/sh}"`}function zS($){return`trap '' INT; while :; do ${$}; sleep 1; done`}function tG($,X,J){return`${$}${X.map(C2).join(" ")} engine-tab-exit --session ${C2(J)}`}function QS(){return`clear; printf ${C2("\\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 JA($){let X=typeof $==="number"?$:$==null?Number.NaN:Number.parseInt($,10);if(!Number.isFinite(X))return li;return Math.max(di,Math.min(pi,Math.round(X)))}function ni($,X){let J=String(X),Q="\\n \u26A0 Repo init (.kobe/init.sh) timed out after %ss and was killed; continuing to the engine.\\n\\n",Y="\\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',"(",$,"__kobe_init_ec=$?",'export -p > "$__kobe_init_env" 2>/dev/null',"exit $__kobe_init_ec",") </dev/null &","__kobe_init_pid=$!",`( sleep ${J}; : > "$__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"}' '${J}';`,'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 YS($,X,J){let Q=V$($,J),Y=X?.initScript?.trim();if(!Y)return Q;let q=JA(X?.timeoutSeconds),W=ni(Y,q);if(X?.markerPath){let H=C2(X.markerPath),K=C2(ii(X.markerPath));return tC+[`if [ ! -f ${H} ]; then`,W,`if [ "$__kobe_init_rc" -eq 0 ]; then mkdir -p ${K} && : > ${H}; fi`,"fi",Q].join(`
6
6
  `)}return tC+[W,Q].join(`
7
- `)}function ii($){let X=$.lastIndexOf("/");return X<=0?".":$.slice(0,X)}function eP($){return`cd ${C2($)} && while :; do clear; printf "\\033[1m# %s\\033[0m\\n\\n" ${C2($)}; 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 GS($){let X=C2($.worktree),J=C2($.relPath),Q=$.cliInvocation.map(C2).join(" "),Y=`cd ${X} && if ! git diff --quiet HEAD -- ${J} 2>/dev/null; then git diff HEAD -- ${J} | { delta --paging=always 2>/dev/null || less -R; }; else bat --style=plain --paging=always ${J} 2>/dev/null || \${PAGER:-less} ${J} 2>/dev/null || cat ${J}; fi`;return`${Q} ops --worktree ${X} --preview ${J} || { ${Y}; }`}function qS($){return`${j$([...$.cliInvocation,"update-page"])}`}function HS($){let X=$.opener??"open";return[`tmux -L ${C2($.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{} ${X} {}`].join(" | ")}function BZ($,X={}){let J=[...$,"tasks"];if(X.initialTaskId)J.push("--initial-task-id",X.initialTaskId);return j$(J)}function eG($){if($.taskId&&$.claudePaneId){let X=$.cliInvocation.map(C2).join(" "),J=$.vendor?` --vendor ${C2($.vendor)}`:"";return`KOBE_FILETREE_WATCH=1 ${X} ops --task-id ${C2($.taskId)} --worktree ${C2($.cwd)} --target-pane ${C2($.claudePaneId)}${J} || { ${eP($.cwd)}; }`}return eP($.cwd)}var $S=32,m8="tasks",wX="claude",S6="ops",T6="shell",hB="workspace_aux",eC=4,g6="@kobe_hidden_shell_pane",O$="@kobe_hidden_tasks_pane",WZ="@kobe_zen_panes",sG="@kobe_zen",iF="@kobe_tasks_width",ui=16,hi=120,XA=60,cB=50,aF="@kobe_right_width_pct",oF="@kobe_ops_height_pct",mi=10,ci=90,JS,tC="trap ':' INT; ",li=120,di=5,pi=3600;var s$=Z1(()=>{mF();JS=[iF,aF,oF]});function $q($,X,J){if(!X)return $;let Q=rG(X);return Q.ensureReady(),Q.wrapCommand($,{tty:!0,cwd:J})}function C4(){let $=[];for(let X of["KOBE_HOME_DIR","KOBE_DAEMON_SOCKET_PATH","KOBE_TMUX_SOCKET"]){let J=process.env[X];if(J&&J.length>0)$.push(`${X}=${C2(J)}`)}return $.length>0?`${$.join(" ")} `:""}var lB="@kobe_remote";var UZ=Z1(()=>{N$();s$()});function WS(){return a$(rF,!0)}function sF(){return a$(BS,!1)}function US($){vF(BS,$)}var rF="zen.keepTasks",BS="zen.active";var ZA=Z1(()=>{R6()});var tF;var KS=Z1(()=>{tF={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.7.76",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 --conditions=browser ./src/cli/index.ts","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-terminal":"env KOBE_DEV=1 bun ./src/tui-react/panes/terminal/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:mock-react-workspace":"env KOBE_DEV=1 bun ./src/tui-react/workspace/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 --minWorkers=1 --maxWorkers=4","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"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"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 FS={};V2(FS,{repoSlug:()=>ZQ,releasePageUrl:()=>qA,recommendedGlobalInstallCommand:()=>YA,isNewerSemver:()=>zA,fetchReleaseSummaries:()=>si,fetchReleaseNotesRange:()=>GA,fetchReleaseNotes:()=>ri,compareSemver:()=>eF,checkLatestVersion:()=>dB,UPDATE_SCRIPT_URL:()=>$L,UPDATE_COMMAND:()=>bX,PACKAGE_NAME:()=>QA,CURRENT_VERSION:()=>M2});function ZQ(){let $=tF.repository?.url;if(!$)return null;let X=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!X||!X[1]||!X[2])return null;return`${X[1]}/${X[2]}`}function YA(){return`npm install -g ${QA}@latest`}async function oi($){let X=new AbortController,J=setTimeout(()=>X.abort(),XL);try{let Q=$.replace("/","%2F"),Y=await fetch(`https://registry.npmjs.org/${Q}/latest`,{signal:X.signal,headers:{accept:"application/json"}});if(!Y.ok)return null;let q=await Y.json();if(typeof q.version!=="string")return null;return q.version}catch{return null}finally{clearTimeout(J)}}function zA($,X){return eF($,X)>0}function eF($,X){let J=(q)=>q.split("-")[0]??q,Q=J($).split(".").map((q)=>Number.parseInt(q,10)),Y=J(X).split(".").map((q)=>Number.parseInt(q,10));for(let q=0;q<3;q++){let W=Q[q]??0,H=Y[q]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function dB($={}){let X=process.env.KOBE_FAKE_UPDATE;if(X)return{current:M2,latest:X,hasUpdate:zA(X,M2)};if(xP()&&!$.force)return null;let J=await oi(QA);if(!J)return null;return{current:M2,latest:J,hasUpdate:zA(J,M2)}}function MS($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function ri($){let X=ZQ();if(!X)return null;let J=`v${$}`,Q=new AbortController,Y=setTimeout(()=>Q.abort(),XL);try{let q=await fetch(`https://api.github.com/repos/${X}/releases/tags/${J}`,{signal:Q.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!q.ok)return null;let W=await q.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(Y)}}async function GA($){let X=ZQ();if(!X)return[];let J=$.limit??100,Q=new AbortController,Y=setTimeout(()=>Q.abort(),XL);try{let q=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${J}`,{signal:Q.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!q.ok)return[];let W=await q.json();if(!Array.isArray(W))return[];return W.map((H)=>{let K=MS(H.tag_name);if(!K||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(eF(K,$.current)<=0)return null;if(eF(K,$.latest)>0)return null;return{version:K,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(Y)}}async function si($=12){let X=ZQ();if(!X)return[];let J=new AbortController,Q=setTimeout(()=>J.abort(),XL);try{let Y=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!Y.ok)return[];let q=await Y.json();if(!Array.isArray(q))return[];return q.map((W)=>{let H=MS(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(Q)}}function qA($){let X=ZQ();if(!X)return null;return`https://github.com/${X}/releases/tag/v${$}`}var M2,QA,$L="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",bX,XL=3000;var F8=Z1(()=>{KS();E4();M2=tF.version,QA=tF.name;bX=`curl -fsSL ${$L} | sh`});import{spawnSync as ti}from"child_process";import{existsSync as ei,statSync as $a}from"fs";import{homedir as Xa}from"os";import pB from"path";async function LS($=Ja){let X=[],J=(F)=>{if(!F)return;return X.push(F),$.fileExists(F)?F:void 0},Q=$.which("claude");if(Q){if(X.push(`which:${Q}`),$.fileExists(Q))return Q}let Y=$.home(),q=J(pB.join(Y,".claude","local","claude"));if(q)return q;let W=$.env("NVM_BIN");if(W){let F=J(pB.join(W,"claude"));if(F)return F}let H=pB.join(Y,".nvm","versions","node"),K=$.readdir(H).sort().reverse();for(let F of K){let C=J(pB.join(H,F,"bin","claude"));if(C)return C}for(let F of["/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude","/bin/claude"]){let C=J(F);if(C)return C}for(let F of[".local/bin/claude",".npm-global/bin/claude",".yarn/bin/claude",".bun/bin/claude","bin/claude"]){let C=J(pB.join(Y,F));if(C)return C}throw new JL(X)}var JL,Ja;var NS=Z1(()=>{JL=class JL extends Error{checkedPaths;constructor($){super(`Claude Code binary not found. Checked: ${$.join(", ")}. Ensure 'claude' is on PATH, or install at ~/.claude/local/claude.`);this.name="ClaudeBinaryNotFoundError",this.checkedPaths=$}};Ja={fileExists($){try{return $a($).isFile()}catch{return!1}},env($){return process.env[$]},home(){return Xa()},which($){let X=process.platform==="win32"?"where":"which",J=ti(X,[$],{encoding:"utf8"});if(J.status!==0)return;let Q=J.stdout.split(`
7
+ `)}function ii($){let X=$.lastIndexOf("/");return X<=0?".":$.slice(0,X)}function eP($){return`cd ${C2($)} && while :; do clear; printf "\\033[1m# %s\\033[0m\\n\\n" ${C2($)}; 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 GS($){let X=C2($.worktree),J=C2($.relPath),Q=$.cliInvocation.map(C2).join(" "),Y=`cd ${X} && if ! git diff --quiet HEAD -- ${J} 2>/dev/null; then git diff HEAD -- ${J} | { delta --paging=always 2>/dev/null || less -R; }; else bat --style=plain --paging=always ${J} 2>/dev/null || \${PAGER:-less} ${J} 2>/dev/null || cat ${J}; fi`;return`${Q} ops --worktree ${X} --preview ${J} || { ${Y}; }`}function qS($){return`${j$([...$.cliInvocation,"update-page"])}`}function HS($){let X=$.opener??"open";return[`tmux -L ${C2($.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{} ${X} {}`].join(" | ")}function BZ($,X={}){let J=[...$,"tasks"];if(X.initialTaskId)J.push("--initial-task-id",X.initialTaskId);return j$(J)}function eG($){if($.taskId&&$.claudePaneId){let X=$.cliInvocation.map(C2).join(" "),J=$.vendor?` --vendor ${C2($.vendor)}`:"";return`KOBE_FILETREE_WATCH=1 ${X} ops --task-id ${C2($.taskId)} --worktree ${C2($.cwd)} --target-pane ${C2($.claudePaneId)}${J} || { ${eP($.cwd)}; }`}return eP($.cwd)}var $S=32,m8="tasks",wX="claude",S6="ops",T6="shell",hB="workspace_aux",eC=4,g6="@kobe_hidden_shell_pane",O$="@kobe_hidden_tasks_pane",WZ="@kobe_zen_panes",sG="@kobe_zen",iF="@kobe_tasks_width",ui=16,hi=120,XA=60,cB=50,aF="@kobe_right_width_pct",oF="@kobe_ops_height_pct",mi=10,ci=90,JS,tC="trap ':' INT; ",li=120,di=5,pi=3600;var s$=Z1(()=>{mF();JS=[iF,aF,oF]});function $q($,X,J){if(!X)return $;let Q=rG(X);return Q.ensureReady(),Q.wrapCommand($,{tty:!0,cwd:J})}function C4(){let $=[];for(let X of["KOBE_HOME_DIR","KOBE_DAEMON_SOCKET_PATH","KOBE_TMUX_SOCKET"]){let J=process.env[X];if(J&&J.length>0)$.push(`${X}=${C2(J)}`)}return $.length>0?`${$.join(" ")} `:""}var lB="@kobe_remote";var UZ=Z1(()=>{N$();s$()});function WS(){return a$(rF,!0)}function sF(){return a$(BS,!1)}function US($){vF(BS,$)}var rF="zen.keepTasks",BS="zen.active";var ZA=Z1(()=>{R6()});var tF;var KS=Z1(()=>{tF={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.7.77",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 --conditions=browser ./src/cli/index.ts","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-terminal":"env KOBE_DEV=1 bun ./src/tui-react/panes/terminal/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:mock-react-workspace":"env KOBE_DEV=1 bun ./src/tui-react/workspace/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 --minWorkers=1 --maxWorkers=4","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"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"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 FS={};V2(FS,{repoSlug:()=>ZQ,releasePageUrl:()=>qA,recommendedGlobalInstallCommand:()=>YA,isNewerSemver:()=>zA,fetchReleaseSummaries:()=>si,fetchReleaseNotesRange:()=>GA,fetchReleaseNotes:()=>ri,compareSemver:()=>eF,checkLatestVersion:()=>dB,UPDATE_SCRIPT_URL:()=>$L,UPDATE_COMMAND:()=>bX,PACKAGE_NAME:()=>QA,CURRENT_VERSION:()=>M2});function ZQ(){let $=tF.repository?.url;if(!$)return null;let X=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!X||!X[1]||!X[2])return null;return`${X[1]}/${X[2]}`}function YA(){return`npm install -g ${QA}@latest`}async function oi($){let X=new AbortController,J=setTimeout(()=>X.abort(),XL);try{let Q=$.replace("/","%2F"),Y=await fetch(`https://registry.npmjs.org/${Q}/latest`,{signal:X.signal,headers:{accept:"application/json"}});if(!Y.ok)return null;let q=await Y.json();if(typeof q.version!=="string")return null;return q.version}catch{return null}finally{clearTimeout(J)}}function zA($,X){return eF($,X)>0}function eF($,X){let J=(q)=>q.split("-")[0]??q,Q=J($).split(".").map((q)=>Number.parseInt(q,10)),Y=J(X).split(".").map((q)=>Number.parseInt(q,10));for(let q=0;q<3;q++){let W=Q[q]??0,H=Y[q]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function dB($={}){let X=process.env.KOBE_FAKE_UPDATE;if(X)return{current:M2,latest:X,hasUpdate:zA(X,M2)};if(xP()&&!$.force)return null;let J=await oi(QA);if(!J)return null;return{current:M2,latest:J,hasUpdate:zA(J,M2)}}function MS($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function ri($){let X=ZQ();if(!X)return null;let J=`v${$}`,Q=new AbortController,Y=setTimeout(()=>Q.abort(),XL);try{let q=await fetch(`https://api.github.com/repos/${X}/releases/tags/${J}`,{signal:Q.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!q.ok)return null;let W=await q.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(Y)}}async function GA($){let X=ZQ();if(!X)return[];let J=$.limit??100,Q=new AbortController,Y=setTimeout(()=>Q.abort(),XL);try{let q=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${J}`,{signal:Q.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!q.ok)return[];let W=await q.json();if(!Array.isArray(W))return[];return W.map((H)=>{let K=MS(H.tag_name);if(!K||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(eF(K,$.current)<=0)return null;if(eF(K,$.latest)>0)return null;return{version:K,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(Y)}}async function si($=12){let X=ZQ();if(!X)return[];let J=new AbortController,Q=setTimeout(()=>J.abort(),XL);try{let Y=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!Y.ok)return[];let q=await Y.json();if(!Array.isArray(q))return[];return q.map((W)=>{let H=MS(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(Q)}}function qA($){let X=ZQ();if(!X)return null;return`https://github.com/${X}/releases/tag/v${$}`}var M2,QA,$L="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",bX,XL=3000;var F8=Z1(()=>{KS();E4();M2=tF.version,QA=tF.name;bX=`curl -fsSL ${$L} | sh`});import{spawnSync as ti}from"child_process";import{existsSync as ei,statSync as $a}from"fs";import{homedir as Xa}from"os";import pB from"path";async function LS($=Ja){let X=[],J=(F)=>{if(!F)return;return X.push(F),$.fileExists(F)?F:void 0},Q=$.which("claude");if(Q){if(X.push(`which:${Q}`),$.fileExists(Q))return Q}let Y=$.home(),q=J(pB.join(Y,".claude","local","claude"));if(q)return q;let W=$.env("NVM_BIN");if(W){let F=J(pB.join(W,"claude"));if(F)return F}let H=pB.join(Y,".nvm","versions","node"),K=$.readdir(H).sort().reverse();for(let F of K){let C=J(pB.join(H,F,"bin","claude"));if(C)return C}for(let F of["/opt/homebrew/bin/claude","/usr/local/bin/claude","/usr/bin/claude","/bin/claude"]){let C=J(F);if(C)return C}for(let F of[".local/bin/claude",".npm-global/bin/claude",".yarn/bin/claude",".bun/bin/claude","bin/claude"]){let C=J(pB.join(Y,F));if(C)return C}throw new JL(X)}var JL,Ja;var NS=Z1(()=>{JL=class JL extends Error{checkedPaths;constructor($){super(`Claude Code binary not found. Checked: ${$.join(", ")}. Ensure 'claude' is on PATH, or install at ~/.claude/local/claude.`);this.name="ClaudeBinaryNotFoundError",this.checkedPaths=$}};Ja={fileExists($){try{return $a($).isFile()}catch{return!1}},env($){return process.env[$]},home(){return Xa()},which($){let X=process.platform==="win32"?"where":"which",J=ti(X,[$],{encoding:"utf8"});if(J.status!==0)return;let Q=J.stdout.split(`
8
8
  `).map((Y)=>Y.trim()).filter(Boolean)[0];if(!Q)return;if(Q.startsWith("claude:")&&Q.includes("aliased to")){let Y=Q.split("aliased to")[1]?.trim();return Y&&ei(Y)?Y:void 0}return Q},readdir($){try{return bB("fs").readdirSync($)}catch{return[]}}}});import{spawnSync as Za}from"child_process";import{existsSync as za,statSync as Qa}from"fs";import{homedir as Ya}from"os";import OS from"path";async function jS($=Ga){let X=[],J=(W)=>{if(!W)return;return X.push(W),$.fileExists(W)?W:void 0},Q=$.which("codex");if(Q){if(X.push(`which:${Q}`),$.fileExists(Q))return Q}let Y=$.home();for(let W of["/opt/homebrew/bin/codex","/usr/local/bin/codex","/usr/bin/codex","/bin/codex"]){let H=J(W);if(H)return H}let q=$.env("NVM_BIN");if(q){let W=J(OS.join(q,"codex"));if(W)return W}for(let W of[".local/bin/codex",".bun/bin/codex","bin/codex"]){let H=J(OS.join(Y,W));if(H)return H}throw new ZL(X)}var ZL,Ga;var VS=Z1(()=>{ZL=class ZL extends Error{checkedPaths;constructor($){super(`Codex CLI binary not found. Checked: ${$.join(", ")}. Ensure 'codex' is on PATH (e.g. \`brew install codex\` or the official installer).`);this.name="CodexBinaryNotFoundError",this.checkedPaths=$}};Ga={fileExists($){try{return Qa($).isFile()}catch{return!1}},env($){return process.env[$]},home(){return Ya()},which($){let X=process.platform==="win32"?"where":"which",J=Za(X,[$],{encoding:"utf8"});if(J.status!==0)return;let Q=J.stdout.split(`
9
9
  `).map((Y)=>Y.trim()).filter(Boolean)[0];if(!Q)return;if(Q.startsWith("codex:")&&Q.includes("aliased to")){let Y=Q.split("aliased to")[1]?.trim();return Y&&za(Y)?Y:void 0}return Q},readdir($){try{return bB("fs").readdirSync($)}catch{return[]}}}});import{spawnSync as qa}from"child_process";import{existsSync as Ha,statSync as Wa}from"fs";import{homedir as Ba}from"os";import KZ from"path";async function CS($=Ua){let X=[],J=(C)=>{if(!C)return;return X.push(C),$.fileExists(C)?C:void 0},Q=$.which("copilot");if(Q){if(X.push(`which:${Q}`),$.fileExists(Q))return Q}let Y=$.platform()==="win32"?["copilot.exe","copilot.cmd","copilot"]:["copilot"],q=(C)=>{if(!C)return;for(let V of Y){let N=J(KZ.join(C,V));if(N)return N}return};for(let C of["/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"]){let V=q(C);if(V)return V}let W=$.env("NVM_BIN"),H=q(W);if(H)return H;let K=$.home(),F=[KZ.join(K,".npm-global/bin"),KZ.join(K,".local/bin"),KZ.join(K,".bun/bin"),KZ.join(K,"bin")];if($.platform()==="win32"){let C=$.env("APPDATA"),V=$.env("LOCALAPPDATA");if(F.unshift(KZ.join(K,"AppData/Roaming/npm")),C)F.unshift(KZ.join(C,"npm"));if(V)F.unshift(KZ.join(V,"npm"))}for(let C of F){let V=q(C);if(V)return V}throw new zL(X)}var zL,Ua;var AS=Z1(()=>{zL=class zL extends Error{checkedPaths;constructor($){super(`GitHub Copilot CLI binary not found. Checked: ${$.join(", ")}. Ensure 'copilot' is on PATH (for example \`npm install -g @github/copilot\` or \`brew install copilot-cli\`).`);this.name="CopilotBinaryNotFoundError",this.checkedPaths=$}};Ua={fileExists($){try{return Wa($).isFile()}catch{return!1}},env($){return process.env[$]},home(){return Ba()},which($){let X=process.platform==="win32"?"where":"which",J=qa(X,[$],{encoding:"utf8"});if(J.status!==0)return;let Q=J.stdout.split(`
10
10
  `).map((Y)=>Y.trim()).filter(Boolean)[0];if(!Q)return;if(Q.startsWith("copilot:")&&Q.includes("aliased to")){let Y=Q.split("aliased to")[1]?.trim();return Y&&Ha(Y)?Y:void 0}return Q},platform(){return process.platform}}});import{readFileSync as Ka,statSync as Ma}from"fs";import{readFile as Fa,stat as La}from"fs/promises";async function Xq($,X=DS){let{size:J}=await La($);if(J>X)return"";return Fa($,"utf8")}function _S($,X=DS){let J;try{J=Ma($)}catch(Q){if(Q.code==="ENOENT")return null;throw Q}if(J.size>X)return null;return Ka($,"utf8")}function xX($,X=Na){return $.length<=X}var DS=104857600,Na=8388608;var zQ=()=>{};import{homedir as Oa}from"os";import MZ from"path";function ja($,X){let J=$("CLAUDE_CONFIG_DIR")?.trim();if(J)return MZ.join(J,".claude.json");return MZ.join(X,".claude.json")}function Va($,X){let Q=$("CODEX_HOME")?.trim()??MZ.join(X,".codex");return MZ.join(Q,"auth.json")}function Ca($,X){let Q=$("COPILOT_HOME")?.trim()??MZ.join(X,".copilot");return MZ.join(Q,"config.json")}function Aa($){let X=$.split(".");if(X.length!==3)return null;let J=X[1];if(!J)return null;let Q=J.replace(/-/g,"+").replace(/_/g,"/"),Y=Q+"=".repeat((4-Q.length%4)%4);try{let q=Buffer.from(Y,"base64").toString("utf8"),W=JSON.parse(q);return typeof W==="object"&&W!==null?W:null}catch{return null}}async function YL($){try{return{found:!0,path:await $()}}catch(X){if(X instanceof JL||X instanceof ZL||X instanceof zL)return{found:!1,error:"not found on PATH"};return{found:!1,error:X instanceof Error?X.message:String(X)}}}async function fS($){return(await Promise.all([["claude",()=>$.findClaudeBinary()],["codex",()=>$.findCodexBinary()],["copilot",()=>$.findCopilotBinary()]].map(async([Q,Y])=>(await YL(Y)).found?Q:null))).filter((Q)=>Q!==null)}function Da($=Jq){if($!==Jq)return fS($);if(QL)return QL;let X=fS($).catch((J)=>{throw QL=null,J});return QL=X,X}async function g3($=Jq){return[...await Da($),...nG()]}async function GL($=Jq){let X=await YL(()=>$.findClaudeBinary()),J=ja($.env,$.home()),Q;try{Q=$.readFile(J)}catch(K){return{binary:X,account:{kind:"none"},accountError:`read ${J}: ${K instanceof Error?K.message:String(K)}`}}if(Q===null)return{binary:X,account:{kind:"none"}};let Y;try{Y=JSON.parse(Q)}catch(K){return{binary:X,account:{kind:"none"},accountError:`parse ${J}: ${K instanceof Error?K.message:String(K)}`}}let q=Y?.oauthAccount;if(!q||typeof q!=="object")return{binary:X,account:{kind:"none"}};let W=q,H=typeof W.emailAddress==="string"?W.emailAddress:void 0;if(!H)return{binary:X,account:{kind:"none"}};return{binary:X,account:{kind:"oauth",email:H,organization:typeof W.organizationName==="string"?W.organizationName:void 0,displayName:typeof W.displayName==="string"?W.displayName:void 0,billingType:typeof W.billingType==="string"?W.billingType:void 0}}}async function qL($=Jq){let X=await YL(()=>$.findCodexBinary()),J=Va($.env,$.home()),Q;try{Q=$.readFile(J)}catch(F){return{binary:X,account:{kind:"none"},accountError:`read ${J}: ${F instanceof Error?F.message:String(F)}`}}if(Q===null)return{binary:X,account:{kind:"none"}};let Y;try{Y=JSON.parse(Q)}catch(F){return{binary:X,account:{kind:"none"},accountError:`parse ${J}: ${F instanceof Error?F.message:String(F)}`}}let q=Y??{},W=q.tokens,H=typeof W?.id_token==="string"?W.id_token:void 0;if(H){let F=Aa(H);if(!F)return{binary:X,account:{kind:"none"},accountError:"codex id_token: malformed JWT"};let C=typeof F.email==="string"?F.email:void 0,V=F["https://api.openai.com/auth"],N=typeof V==="object"&&V!==null&&!Array.isArray(V)?V:void 0,f=typeof N?.chatgpt_plan_type==="string"?N.chatgpt_plan_type:void 0;if(C)return{binary:X,account:{kind:"chatgpt",email:C,plan:f}};return{binary:X,account:{kind:"none"},accountError:"codex id_token: no email claim"}}let K=q.OPENAI_API_KEY;if(typeof K==="string"&&K.length>0)return{binary:X,account:{kind:"apikey"}};return{binary:X,account:{kind:"none"}}}async function HL($=Jq){let X=await YL(()=>$.findCopilotBinary());for(let q of["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"])if($.env(q)?.trim())return{binary:X,account:{kind:"token",source:q}};let J=Ca($.env,$.home()),Q;try{Q=$.readFile(J)}catch(q){return{binary:X,account:{kind:"none"},accountError:`read ${J}: ${q instanceof Error?q.message:String(q)}`}}if(Q===null)return{binary:X,account:{kind:"none"}};let Y;try{Y=JSON.parse(Q)}catch(q){return{binary:X,account:{kind:"none"},accountError:`parse ${J}: ${q instanceof Error?q.message:String(q)}`}}if(!HA(Y))return{binary:X,account:{kind:"none"}};if(IS(Y,["github_token","oauth_token","access_token","token","selectedUser","currentUser","user"]))return{binary:X,account:{kind:"oauth"}};return{binary:X,account:{kind:"none"}}}function HA($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function IS($,X,J=0){if(J>4||!HA($))return!1;for(let[Q,Y]of Object.entries($)){if(X.includes(Q)&&typeof Y==="string"&&Y.length>0)return!0;if(HA(Y)&&IS(Y,X,J+1))return!0}return!1}var Jq,QL=null;var FZ=Z1(()=>{q5();NS();VS();AS();zQ();Jq={readFile($){return _S($)},env($){return process.env[$]},home(){return Oa()},findClaudeBinary(){return LS()},findCodexBinary(){return jS()},findCopilotBinary(){return CS()}}});function RS($,X){return _a.map((J)=>({vendor:"claude",id:$,effort:J,level:J,label:`${X} \xB7 ${J}`,hint:J==="max"?"deepest reasoning":`${J} effort`}))}function SS($){return/1m/i.test($)?fa:Ia}var _a,PS,fa=1e6,Ia=200000;var TS=Z1(()=>{_a=["low","medium","high","xhigh","max"];PS=[{vendor:"claude",id:"claude-opus-4-7[1m]",label:"Opus 4.7 1M",hint:"long context, default"},...RS("claude-opus-4-7[1m]","Opus 4.7 1M"),{vendor:"claude",id:"claude-opus-4-7",label:"Opus 4.7",hint:"most capable, slowest"},...RS("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 Ra}from"fs";import{homedir as Pa}from"os";import{join as Sa}from"path";function ga(){if(Zq!==void 0)return Zq;try{let $=Ra(Ta,"utf8"),X=JSON.parse($);if(!X||typeof X!=="object")return Zq=null,null;let J=X;return Zq={model:typeof J.model==="string"&&J.model.length>0?J.model:void 0},Zq}catch{return Zq=null,null}}function gS(){let $=ga();if($?.model&&$.model.length>0)return $.model;return Ea}var Ta,Zq,Ea="claude-opus-4-7[1m]";var ES=Z1(()=>{Ta=Sa(Pa(),".claude","settings.json")});var kS,wS;var bS=Z1(()=>{TS();ES();kS={vendorId:"claude",label:"Claude Code",models:PS,permissionModes:[{id:"acceptEdits",label:"accept edits"},{id:"default",label:"default"},{id:"plan",label:"plan mode"}],defaultModelId:gS,contextWindowFor:SS,smallFastModelId:()=>"claude-haiku-4-5-20251001"},wS={vendorId:"claude",productName:"Claude Code",shortName:"Claude",assistantName:"Claude",inputPlaceholder:"Ask Claude\u2026"}});import{createHash as ka}from"crypto";function zq($){let X=$.maxFiles??8,J=new Map;function Q(q,W){return ka("sha256").update(q.slice(0,W)).digest("hex")}function Y(q,W){if(J.delete(q),J.set(q,W),J.size>X){let H=J.keys().next().value;if(H!==void 0)J.delete(H)}}return function(W,H,K){let F=H.lastIndexOf(`
@@ -34,7 +34,7 @@ ${J}`),jr(Y,Q)}catch{}return J}function cT($,X,J){try{return vT(uA($,X),"utf8").
34
34
  `}function dr(){if(Qg)return;Qg=!0;try{process.stderr.write(`[kobe] client log write failed; continuing without it
35
35
  `)}catch{}}async function pr($){try{let{size:X}=await mr($);if(!nA(X,dL))return;await hr($,`${$}.old`)}catch{}}function Hg($){let X=Jg();Yg=Yg.then(async()=>{await pr(X);try{await zg(X,$)}catch(J){if(J?.code==="ENOENT")await ur(cr(X),{recursive:!0}),await zg(X,$);else throw J}}).catch(()=>dr())}function x3($,X){Hg(qg($,X))}function k4($,X){let J=lr(X);Hg(qg($,J.stack??J.message))}function Wg(){if(oA||rA)return;oA=($)=>k4("crash-net",$),rA=($)=>k4("crash-net",$),process.on("unhandledRejection",oA),process.on("uncaughtException",rA)}var Gg="client",Qg=!1,Yg,oA,rA;var y6=Z1(()=>{iA();CZ();Yg=Promise.resolve()});import{connect as nr}from"net";import{StringDecoder as ir}from"string_decoder";class O8{socketPath;socket=null;buffer="";nextId=1;pending=new Map;handlers=new Map;lifecycleHandlers=new Map;connecting=null;disposed=!1;constructor($){this.socketPath=$}connect(){if(this.socket)return Promise.resolve();if(this.disposed)return Promise.reject(Error("daemon client disposed"));if(this.connecting)return this.connecting;let $=this.openSocket();this.connecting=$;let X=()=>{if(this.connecting===$)this.connecting=null};return $.then(X,X),$}get isDisposed(){return this.disposed}close(){this.disposed=!0,this.socket?.end(),this.socket=null,this.failPending()}forceDisconnect(){let $=this.socket;if(!$)return;this.socket=null,$.destroy(),this.failPending()}failPending(){if(this.pending.size===0)return;let $=Error("daemon connection closed");for(let X of this.pending.values())X.reject($);this.pending.clear()}on($,X){let J=this.handlers.get($);if(!J)J=new Set,this.handlers.set($,J);return J.add(X),()=>{if(J?.delete(X),J?.size===0)this.handlers.delete($)}}onChannel($,X){return this.on($,(J)=>X(J.payload))}subscribe($={}){let X={};if($.channels)X.channels=$.channels;if($.role)X.role=$.role;return this.request("subscribe",X)}onLifecycle($,X){let J=this.lifecycleHandlers.get($);if(!J)J=new Set,this.lifecycleHandlers.set($,J);return J.add(X),()=>{if(J?.delete(X),J?.size===0)this.lifecycleHandlers.delete($)}}async request($,X){await this.connect();let J=this.socket;if(!J)throw Error("daemon connection is not open");let Q=String(this.nextId++),Y=new Promise((q,W)=>{this.pending.set(Q,{resolve:(H)=>q(H),reject:W})});return J.write(UQ({type:"request",id:Q,name:$,payload:X})),Y}openSocket(){return new Promise(($,X)=>{let J=nr(this.socketPath);this.socket=J;let Q=()=>{J.off("error",Y),$()},Y=(W)=>{if(J.off("connect",Q),this.socket===J)this.socket=null;X(W)};J.once("connect",Q),J.once("error",Y);let q=new ir("utf8");this.buffer="",J.on("data",(W)=>this.onData(q.write(W))),J.on("close",()=>this.onSocketClose(J))})}onSocketClose($){if(this.socket!==$)return;this.socket=null,this.failPending(),this.emitLifecycle("close")}emitLifecycle($){for(let X of this.lifecycleHandlers.get($)??[])try{X()}catch(J){console.error(`[kobe] lifecycle handler for "${$}" threw:`,J)}}onData($){this.buffer+=$;let X=this.buffer.indexOf(`
36
36
  `);while(X!==-1){let J=this.buffer.slice(0,X);if(this.buffer=this.buffer.slice(X+1),J.trim().length>0)this.onLine(J);X=this.buffer.indexOf(`
37
- `)}}onLine($){let X;try{X=JSON.parse($)}catch(Q){k4("client-frame",Q);return}if(X.type==="event"){this.emit(X);return}if(X.type!=="response")return;let J=this.pending.get(X.id);if(!J)return;if(this.pending.delete(X.id),X.error){let Q=Error(X.error.message);if(X.error.name)Q.name=X.error.name;J.reject(Q)}else J.resolve(X.payload)}emit($){for(let X of this.handlers.get($.name)??[])X($);for(let X of this.handlers.get("*")??[])X($)}}var FQ=Z1(()=>{x6();y6()});async function AZ($,X){if(!X)return 0;return f5($).history.latestTranscriptMtimeForWorktree(X)}var eB=Z1(()=>{c8()});async function Bg(){let $=MQ();if(await LQ($))return $;await vX($,jq()).catch(()=>{});let[X,...J]=iL(ar);nL(X,J,process.env,Zg());let Q=Date.now()+5000;while(Date.now()<Q){if(await LQ($))return $;await new Promise((Y)=>setTimeout(Y,100))}throw Error(`kobe: pty host did not start (or stayed wedged) at ${$}`)}async function Ug($){let X=MQ(),J=new O8(X);try{await J.connect(),await J.request("pty.sweep",{liveTaskIds:$})}catch{}finally{J.close()}}var ar;var sA=Z1(()=>{$U();CZ();h7();FQ();ar=["pty-host"]});function aL($){return or.includes($)}function Kg($,X,J){switch(X){case"session-start":case"session-end":return"idle";case"turn-start":return"running";case"turn-complete":return"turn_complete";case"turn-failed":return J?.failure==="rate_limit"||J?.failure==="billing"?"rate_limited":"error";case"awaiting-input":return J?.waiting==="permission"?"permission_needed":"running"}}var or;var oL=Z1(()=>{or=["session-start","turn-start","turn-complete","turn-failed","awaiting-input","session-end"]});function rr(){let $=process.env.KOBE_ENGINE_STATE_TTL_MS;if($===void 0)return Mg;let X=Number($);return Number.isFinite(X)&&X>0?X:Mg}class tA{bus;staleMs;now;livenessAt;activity=new Map;constructor($,X=rr(),J=()=>Date.now(),Q=()=>Promise.resolve(void 0)){this.bus=$;this.staleMs=X;this.now=J;this.livenessAt=Q}report($,X,J){let Q=this.activity.get($);if(Q?.lapse)clearTimeout(Q.lapse);let Y=Kg(Q?.state,X,J),q=this.now(),W={state:Y,detail:J,at:q};if(Y!=="idle"&&Y!=="turn_complete")W.lapse=this.armLapse($,q);this.activity.set($,W),this.bus.publish("engine-state",this.payload($,W))}armLapse($,X){let J=setTimeout(()=>{this.handleLapse($,X)},this.staleMs);return J.unref?.(),J}async handleLapse($,X){let J=this.activity.get($);if(!J||J.at!==X)return;let Q;try{Q=await this.livenessAt($)}catch{Q=void 0}let Y=this.activity.get($);if(!Y||Y.at!==X)return;if(Q!==void 0&&Q>this.now()-this.staleMs){Y.lapse=this.armLapse($,X);return}this.publishIdle($)}clearTask($){let X=this.activity.get($);if(X?.lapse)clearTimeout(X.lapse);if(this.activity.delete($),X)this.bus.publish("engine-state",{taskId:$,state:"idle",at:this.now()})}snapshotByTask(){let $={};for(let[X,J]of this.activity)$[X]=this.payload(X,J);return $}currentNonIdle(){let $=[];for(let[X,J]of this.activity)if(J.state!=="idle")$.push(this.payload(X,J));return $}close(){for(let $ of this.activity.values())if($.lapse)clearTimeout($.lapse);this.activity.clear()}publishIdle($){let X={state:"idle",at:this.now()};this.activity.set($,X),this.bus.publish("engine-state",this.payload($,X))}payload($,X){return{taskId:$,state:X.state,...X.detail?{detail:X.detail}:{},at:X.at}}}var Mg=600000;var Fg=Z1(()=>{oL()});function Lg($){if(typeof $!=="string")return"";let X=$.replace(/\s+/g," ").trim();if(X.length===0)return"";let J=[...X];if(J.length<=40)return X;return`${J.slice(0,40).join("")}\u2026`}function rL($,X){let J=$.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),Q=X.slice(-6).toLowerCase();return`kobe/${J||"task"}-${Q}`}function Ng($){let X=$.find((Y)=>Y.role==="user");if(!X)return"";let J=X.blocks.filter((Y)=>Y.type==="text").map((Y)=>Y.text).join(" "),Q=Lg(J);return Q.length>0?Buffer.from(Q,"utf8").toString("utf8"):Q}async function Vq($,X=I5){if(!$)return"";let{history:J}=f5(X),Q=await J.listSessionIdsForWorktree($);for(let Y of Q.slice(0,sr)){let q=Ng(await J.readHistory(Y));if(q)return q}return""}async function sL($,X){if(!X)return"";try{return Ng(await f5($).history.readHistory(X))}catch{return""}}var sr=8;var XU=Z1(()=>{c8();N8()});function Og($){let X=String($),J=X.length-1;return $3.context.id+(J?String.fromCharCode(96+J):"")+X}function tr($){$3.context=$}function $N($,X){let J=b5,Q=s2,Y=$.length===0,q=X===void 0?Q:X,W=Y?{owned:null,cleanups:null,context:null,owner:null}:{owned:null,cleanups:null,context:q?q.context:null,owner:q},H=Y?()=>$(()=>{throw Error("Dispose method must be an explicit argument to createRoot function")}):()=>$(()=>Ig(()=>DZ(W)));v6.afterCreateOwner&&v6.afterCreateOwner(W),s2=W,b5=null;try{return P9(H,!0)}finally{b5=J,s2=Q}}function O7($,X){X=X?Object.assign({},jg,X):jg;let J={value:$,observers:null,observerSlots:null,comparator:X.equals||void 0};{if(X.name)J.name=X.name;if(X.internal)J.internal=!0;else if(Rg(J),v6.afterCreateSignal)v6.afterCreateSignal(J)}let Q=(Y)=>{if(typeof Y==="function")if(_0&&_0.running&&_0.sources.has(J))Y=Y(J.tValue);else Y=Y(J.value);return JD(J,Y)};return[Qs.bind(J),Q]}function XN($,X,J){_g=Hs;let Q=Ys($,X,!1,R9,J),Y=eA&&zs(eA);if(Y)Q.suspense=Y;if(!J||!J.render)Q.user=!0;j8?j8.push(Q):ZD(Q)}function fg($){return P9($,!1)}function Ig($){if(!Cq&&b5===null)return $();let X=b5;b5=null;try{if(Cq)return Cq.untrack($);return $()}finally{b5=X}}function Js($){if(s2===null)console.warn("cleanups created outside a `createRoot` or `render` will never be run");else if(s2.cleanups===null)s2.cleanups=[$];else s2.cleanups.push($);return $}function JN(){return b5}function Zs($){if(_0&&_0.running)return $(),_0.done;let X=b5,J=s2;return Promise.resolve().then(()=>{b5=X,s2=J;let Q;if(XD||eA)Q=_0||(_0={sources:new Set,effects:[],promises:new Set,disposed:new Set,queue:new Set,running:!0}),Q.done||(Q.done=new Promise((Y)=>Q.resolve=Y)),Q.running=!0;return P9($,!1),b5=s2=null,Q?Q.done:void 0})}function Rg($){if(s2){if(s2.sourceMap)s2.sourceMap.push($);else s2.sourceMap=[$];$.graph=s2}if(v6.afterRegisterGraph)v6.afterRegisterGraph($)}function zs($){let X;return s2&&s2.context&&(X=s2.context[$.id])!==void 0?X:$.defaultValue}function Qs(){let $=_0&&_0.running;if(this.sources&&($?this.tState:this.state))if(($?this.tState:this.state)===R9)ZD(this);else{let X=e7;e7=null,P9(()=>tL(this),!1),e7=X}if(b5){let X=this.observers;if(!X||X[X.length-1]!==b5){let J=X?X.length:0;if(!b5.sources)b5.sources=[this],b5.sourceSlots=[J];else b5.sources.push(this),b5.sourceSlots.push(J);if(!X)this.observers=[b5],this.observerSlots=[b5.sources.length-1];else X.push(b5),this.observerSlots.push(b5.sources.length-1)}}if($&&_0.sources.has(this))return this.tValue;return this.value}function JD($,X,J){let Q=_0&&_0.running&&_0.sources.has($)?$.tValue:$.value;if(!$.comparator||!$.comparator(Q,X)){if(_0){let Y=_0.running;if(Y||!J&&_0.sources.has($))_0.sources.add($),$.tValue=X;if(!Y)$.value=X}else $.value=X;if($.observers&&$.observers.length)P9(()=>{for(let Y=0;Y<$.observers.length;Y+=1){let q=$.observers[Y],W=_0&&_0.running;if(W&&_0.disposed.has(q))continue;if(W?!q.tState:!q.state){if(q.pure)e7.push(q);else j8.push(q);if(q.observers)Sg(q)}if(!W)q.state=R9;else q.tState=R9}if(e7.length>1e6){if(e7=[],er)throw Error("Potential Infinite Loop Detected.");throw Error()}},!1)}return X}function ZD($){if(!$.fn)return;DZ($);let X=eL;if(Ag($,_0&&_0.running&&_0.sources.has($)?$.tValue:$.value,X),_0&&!_0.running&&_0.sources.has($))queueMicrotask(()=>{P9(()=>{_0&&(_0.running=!0),b5=s2=$,Ag($,$.tValue,X),b5=s2=null},!1)})}function Ag($,X,J){let Q,Y=s2,q=b5;b5=s2=$;try{Q=$.fn(X)}catch(W){if($.pure)if(_0&&_0.running)$.tState=R9,$.tOwned&&$.tOwned.forEach(DZ),$.tOwned=void 0;else $.state=R9,$.owned&&$.owned.forEach(DZ),$.owned=null;return $.updatedAt=J+1,zD(W)}finally{b5=q,s2=Y}if(!$.updatedAt||$.updatedAt<=J){if($.updatedAt!=null&&"observers"in $)JD($,Q,!0);else if(_0&&_0.running&&$.pure){if(!_0.sources.has($))$.value=Q;_0.sources.add($),$.tValue=Q}else $.value=Q;$.updatedAt=J}}function Ys($,X,J,Q=R9,Y){let q={fn:$,state:Q,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:X,owner:s2,context:s2?s2.context:null,pure:J};if(_0&&_0.running)q.state=0,q.tState=Q;if(s2===null)console.warn("computations created outside a `createRoot` or `render` will never be disposed");else if(s2!==Xs)if(_0&&_0.running&&s2.pure)if(!s2.tOwned)s2.tOwned=[q];else s2.tOwned.push(q);else if(!s2.owned)s2.owned=[q];else s2.owned.push(q);if(Y&&Y.name)q.name=Y.name;if(Cq&&q.fn){let W=q.fn,[H,K]=O7(void 0,{equals:!1}),F=Cq.factory(W,K);Js(()=>F.dispose());let C,V=()=>Zs(K).then(()=>{if(C)C.dispose(),C=void 0});q.fn=(N)=>{if(H(),_0&&_0.running){if(!C)C=Cq.factory(W,V);return C.track(N)}return F.track(N)}}return v6.afterCreateOwner&&v6.afterCreateOwner(q),q}function ZU($){let X=_0&&_0.running;if((X?$.tState:$.state)===0)return;if((X?$.tState:$.state)===JU)return tL($);if($.suspense&&Ig($.suspense.inFallback))return $.suspense.effects.push($);let J=[$];while(($=$.owner)&&(!$.updatedAt||$.updatedAt<eL)){if(X&&_0.disposed.has($))return;if(X?$.tState:$.state)J.push($)}for(let Q=J.length-1;Q>=0;Q--){if($=J[Q],X){let Y=$,q=J[Q+1];while((Y=Y.owner)&&Y!==q)if(_0.disposed.has(Y))return}if((X?$.tState:$.state)===R9)ZD($);else if((X?$.tState:$.state)===JU){let Y=e7;e7=null,P9(()=>tL($,J[0]),!1),e7=Y}}}function P9($,X){if(e7)return $();let J=!1;if(!X)e7=[];if(j8)J=!0;else j8=[];eL++;try{let Q=$();return Gs(J),Q}catch(Q){if(!J)j8=null;e7=null,zD(Q)}}function Gs($){if(e7){if(XD&&_0&&_0.running)qs(e7);else Pg(e7);e7=null}if($)return;let X;if(_0){if(!_0.promises.size&&!_0.queue.size){let{sources:Q,disposed:Y}=_0;j8.push.apply(j8,_0.effects),X=_0.resolve;for(let q of j8)"tState"in q&&(q.state=q.tState),delete q.tState;_0=null,P9(()=>{for(let q of Y)DZ(q);for(let q of Q){if(q.value=q.tValue,q.owned)for(let W=0,H=q.owned.length;W<H;W++)DZ(q.owned[W]);if(q.tOwned)q.owned=q.tOwned;delete q.tValue,delete q.tOwned,q.tState=0}Cg(!1)},!1)}else if(_0.running){_0.running=!1,_0.effects.push.apply(_0.effects,j8),j8=null,Cg(!0);return}}let J=j8;if(j8=null,J.length)P9(()=>_g(J),!1);else v6.afterUpdate&&v6.afterUpdate();if(X)X()}function Pg($){for(let X=0;X<$.length;X++)ZU($[X])}function qs($){for(let X=0;X<$.length;X++){let J=$[X],Q=_0.queue;if(!Q.has(J))Q.add(J),XD(()=>{Q.delete(J),P9(()=>{_0.running=!0,ZU(J)},!1),_0&&(_0.running=!1)})}}function Hs($){let X,J=0;for(X=0;X<$.length;X++){let Q=$[X];if(!Q.user)ZU(Q);else $[J++]=Q}if($3.context){if($3.count){$3.effects||($3.effects=[]),$3.effects.push(...$.slice(0,J));return}tr()}if($3.effects&&($3.done||!$3.count))$=[...$3.effects,...$],J+=$3.effects.length,delete $3.effects;for(X=0;X<J;X++)ZU($[X])}function tL($,X){let J=_0&&_0.running;if(J)$.tState=0;else $.state=0;for(let Q=0;Q<$.sources.length;Q+=1){let Y=$.sources[Q];if(Y.sources){let q=J?Y.tState:Y.state;if(q===R9){if(Y!==X&&(!Y.updatedAt||Y.updatedAt<eL))ZU(Y)}else if(q===JU)tL(Y,X)}}}function Sg($){let X=_0&&_0.running;for(let J=0;J<$.observers.length;J+=1){let Q=$.observers[J];if(X?!Q.tState:!Q.state){if(X)Q.tState=JU;else Q.state=JU;if(Q.pure)e7.push(Q);else j8.push(Q);Q.observers&&Sg(Q)}}}function DZ($){let X;if($.sources)while($.sources.length){let J=$.sources.pop(),Q=$.sourceSlots.pop(),Y=J.observers;if(Y&&Y.length){let q=Y.pop(),W=J.observerSlots.pop();if(Q<Y.length)q.sourceSlots[W]=Q,Y[Q]=q,J.observerSlots[Q]=W}}if($.tOwned){for(X=$.tOwned.length-1;X>=0;X--)DZ($.tOwned[X]);delete $.tOwned}if(_0&&_0.running&&$.pure)Tg($,!0);else if($.owned){for(X=$.owned.length-1;X>=0;X--)DZ($.owned[X]);$.owned=null}if($.cleanups){for(X=$.cleanups.length-1;X>=0;X--)$.cleanups[X]();$.cleanups=null}if(_0&&_0.running)$.tState=0;else $.state=0;delete $.sourceMap}function Tg($,X){if(!X)$.tState=0,_0.disposed.add($);if($.owned)for(let J=0;J<$.owned.length;J++)Tg($.owned[J])}function Ws($){if($ instanceof Error)return $;return Error(typeof $==="string"?$:"Unknown error",{cause:$})}function Dg($,X,J){try{for(let Q of X)Q($)}catch(Q){zD(Q,J&&J.owner||null)}}function zD($,X=s2){let J=Vg&&X&&X.context&&X.context[Vg],Q=Ws($);if(!J)throw Q;if(j8)j8.push({fn(){Dg(Q,J,X)},state:R9});else Dg(Q,J,X)}var $3,er=!0,$s=($,X)=>$===X,_Z,$D,XQ1,jg,Vg=null,_g,R9=1,JU=2,Xs,s2=null,_0=null,XD=null,Cq=null,b5=null,e7=null,j8=null,eL=0,v6,JQ1,Cg,eA,ZQ1,gg;var Aq=Z1(()=>{$3={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return Og(this.context.count)},getNextContextId(){return Og(this.context.count++)}};_Z=Symbol("solid-proxy"),$D=Symbol("solid-track"),XQ1=Symbol("solid-dev-component"),jg={equals:$s},_g=Pg,Xs={},v6={afterUpdate:null,afterCreateOwner:null,afterCreateSignal:null,afterRegisterGraph:null};[JQ1,Cg]=O7(!1);ZQ1=Symbol("fallback"),gg={hooks:v6,writeSignal:JD,registerGraph:Rg};if(globalThis)if(!globalThis.Solid$$)globalThis.Solid$$=!0;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior.")});import{spawn as Bs}from"child_process";function QD($,X,J,Q){if(J)return $+Q.slowRetryMs;return X+Math.max(Q.minIntervalMs,(X-$)*5)}function YD($,X){return!$.inFlight&&X>=$.nextAllowedAt}function Dq($,X,J=Math.random){let Q=Math.max(0,Math.min(1,X)),Y=(J()*2-1)*$*Q;return Math.max(0,$+Y)}function ZN($,X,J){if(X<=0)return Math.min($,J);return Math.min($*2**X,J)}function _q($,X,J,Q){let Y=Date.now();if(!YD($,Y))return!1;$.inFlight=!0;let q=new AbortController,W=setTimeout(()=>q.abort(),X.timeoutMs);return(async()=>{let H,K=!1;try{H=await J(q.signal),K=!0}catch{}clearTimeout(W);let F=q.signal.aborted;if($.nextAllowedAt=QD(Y,Date.now(),F,X),$.inFlight=!1,K&&!F)Q(H)})(),!0}function uX($,X,J){return new Promise((Q)=>{let Y="",q=!1,W=(K)=>{if(q)return;q=!0,Q({status:K,stdout:Y})},H=Bs($,X.slice(),{cwd:J.cwd,stdio:["ignore","pipe","ignore"],env:J.env,signal:J.signal,killSignal:"SIGKILL"});H.stdout?.on("data",(K)=>{Y+=String(K)}),H.on("error",()=>W(null)),H.on("close",(K)=>W(K))})}var NQ=()=>{};function Us($,X){switch(($??"").toUpperCase()){case"MERGED":return"merged";case"CLOSED":return"closed";case"OPEN":return(X??"").toUpperCase()==="APPROVED"?"ready_to_merge":"open";default:return"unknown"}}function Ks($){let X=($.status??"").toUpperCase(),J=($.conclusion??"").toUpperCase(),Q=($.state??"").toUpperCase();if(X&&X!=="COMPLETED")return"pending";if(J){if(J==="SUCCESS"||J==="NEUTRAL"||J==="SKIPPED")return"passing";return"failing"}if(Q==="SUCCESS")return"passing";if(Q==="PENDING"||Q==="EXPECTED")return"pending";if(Q==="FAILURE"||Q==="ERROR")return"failing";return"unknown"}function Ms($){if(!$||$.length===0)return"none";let X=!1,J=!1;for(let Q of $){let Y=Ks(Q);if(Y==="failing")return"failing";if(Y==="pending")X=!0;else if(Y==="passing")J=!0}if(X)return"pending";if(J)return"passing";return"unknown"}function kg($,X){if(!$||typeof $.number!=="number")return null;return{provider:"github",lifecycle:Us($.state,$.reviewDecision),checkState:Ms($.statusCheckRollup),number:$.number,url:$.url,title:$.title,baseRef:$.baseRefName,headRef:$.headRefName,reviewDecision:$.reviewDecision||void 0,mergeable:$.mergeable||void 0,lastCheckedAt:X}}function QN($,X){if($===X)return!0;if(!$||!X)return!1;return $.provider===X.provider&&$.lifecycle===X.lifecycle&&$.checkState===X.checkState&&$.number===X.number&&$.url===X.url&&$.title===X.title&&$.baseRef===X.baseRef&&$.headRef===X.headRef&&$.reviewDecision===X.reviewDecision&&$.mergeable===X.mergeable}function zN($,X){return X.some((J)=>$.includes(J))}function GD($){if($.parseError)return{kind:"error",error:"parse"};if($.timedOut)return{kind:"error",error:"timeout"};if($.spawnError)return{kind:"error",error:"missing-binary"};let X=($.stderr??"").toLowerCase();if(zN(X,Os))return{kind:"empty"};if(zN(X,Fs))return{kind:"error",error:"no-remote"};if(zN(X,Ls))return{kind:"error",error:"auth"};if(zN(X,Ns))return{kind:"error",error:"network"};return{kind:"empty"}}function zU($,X,J,Q,Y=Math.random){let q=(H)=>J+Dq(H,Q.jitterRatio,Y);if($.kind==="pr")return{nextAllowedAt:q($.settled?Q.settledMs:Q.tickMs),failures:0};if($.kind==="empty")return{nextAllowedAt:q(Q.noPrMs),failures:0};if($.error==="no-remote")return{nextAllowedAt:q(Q.noRemoteMs),failures:0};let W=X+1;return{nextAllowedAt:q(ZN(Q.failureBaseMs,W-1,Q.failureCapMs)),failures:W}}var Eg="number,url,title,state,baseRefName,headRefName,reviewDecision,mergeable,statusCheckRollup",Fs,Ls,Ns,Os;var qD=Z1(()=>{NQ();Fs=["none of the git remotes","no git remote","to use github cli in a github repository","not a github repository"],Ls=["gh auth login","authentication required","not logged in","http 401","bad credentials","requires authentication"],Ns=["could not resolve host","no such host","dial tcp","connection refused","connection reset","network is unreachable","i/o timeout","timeout","tls handshake","http 5","rate limit","try again"],Os=["no pull requests found","no open pull requests","no pull request found"]});var HD,WD,BD,UD="DIRTY_WORKTREE",KD,MD;var FD=Z1(()=>{HD=class HD extends Error{from;to;taskId;constructor($,X,J){super(`illegal transition for task ${J}: ${$} -> ${X}`);this.from=$;this.to=X;this.taskId=J;this.name="IllegalTransitionError"}};WD=class WD extends Error{constructor($){super(`task not found: ${$}`);this.name="TaskNotFoundError"}};BD=class BD extends Error{constructor(){super("cannot delete a main task; remove the repo from saved repos instead");this.name="CannotDeleteMainTaskError"}};KD=class KD extends Error{taskId;constructor($){super(`${UD}: task ${$} worktree has uncommitted or untracked changes`);this.taskId=$;this.name="DirtyWorktreeError"}};MD=class MD extends Error{taskId;cause;constructor($,X){super(`failed to remove worktree for task ${$}: ${X instanceof Error?X.message:String(X)}`);this.taskId=$;this.cause=X;this.name="WorktreeRemoveFailedError"}}});var wg;var bg=Z1(()=>{wg=["aardvark","addax","adder","agouti","albatross","alpaca","anaconda","anchovy","anglerfish","anole","anteater","antelope","ape","argali","armadillo","avocet","axolotl","baboon","badger","banteng","barracuda","basilisk","bass","bat","beagle","bear","beaver","bee","beetle","beluga","betta","bison","blackbird","blenny","bluebird","bluegill","boar","bobcat","bonito","bovid","buffalo","bullfrog","bunting","bushbuck","butterfly","buzzard","caiman","camel","canary","capybara","caracal","cardinal","caribou","carp","cassowary","caterpillar","catfish","chameleon","chamois","char","cheetah","chickadee","chimp","chinchilla","chipmunk","chough","cicada","civet","clam","clownfish","cobra","cockatoo","condor","coot","copperhead","coral","cormorant","cougar","coyote","crab","crane","crawfish","crayfish","cricket","crocodile","crow","cuckoo","curlew","cuttlefish","deer","dikdik","dingo","dolphin","donkey","dormouse","dotterel","dove","dragonfly","dromedary","duck","dugong","dunlin","eagle","echidna","eel","egret","eider","eland","elephant","elk","emu","ermine","falcon","fawn","ferret","finch","firefly","flamingo","flounder","fox","frog","gadwall","gannet","gaur","gazelle","gecko","gemsbok","gerbil","gharial","gibbon","gnu","goat","goby","godwit","goldfish","goose","gopher","goral","gorilla","goshawk","grackle","grasshopper","grayling","grebe","grouse","guanaco","guillemot","guineafowl","guppy","halibut","hammerhead","hamster","hare","harrier","hartebeest","hawk","hedgehog","heron","herring","hippo","hornbill","hornet","horse","hummingbird","hyena","ibex","ibis","iguana","impala","indri","jacana","jackal","jaguar","jay","jellyfish","jerboa","junco","kakapo","kangaroo","kestrel","killdeer","kingfisher","kinglet","kite","kiwi","koala","kookaburra","krait","krill","kudu","ladybug","lamprey","langur","lapwing","lark","lemming","lemur","leopard","limpet","lion","lionfish","lizard","llama","lobster","locust","loon","lorikeet","loris","lynx","macaque","macaw","mackerel","magpie","mallard","mamba","mammoth","manatee","mandrill","manta","mantis","marlin","marmoset","marmot","marten","meerkat","merganser","mink","minnow","mole","mongoose","monitor","monkey","moose","moth","mouflon","mouse","mudpuppy","mule","muntjac","musk","muskox","muskrat","mussel","mustang","narwhal","newt","nightingale","numbat","nuthatch","nyala","ocelot","octopus","okapi","opossum","orangutan","orca","oriole","oryx","osprey","ostrich","otter","owl","oyster","oystercatcher","paca","panda","pangolin","panther","parakeet","parrot","parrotfish","partridge","peafowl","pelican","penguin","perch","petrel","pheasant","pigeon","pika","pike","pintail","pipefish","platypus","plover","pollock","pony","porcupine","porpoise","possum","ptarmigan","puffin","puma","pupfish","python","quail","quetzal","quokka","quoll","rabbit","raccoon","rail","rat","rattler","raven","ray","redpoll","reindeer","remora","rhino","roadrunner","robin","rook","sable","sailfish","salamander","salmon","sandpiper","sardine","scallop","scaup","scorpion","seahorse","seal","serval","shark","shearwater","shrew","shrike","shrimp","siskin","sitatunga","skate","skink","skua","skunk","sloth","smelt","snail","snipe","solenodon","sparrow","spider","springbok","squid","squirrel","starfish","starling","stilt","stingray","stoat","stork","sunbird","sunfish","swallow","swan","swift","swordfish","tahr","takin","tamarin","tanager","tapir","tarantula","tarpon","tarsier","teal","tenrec","terrapin","tern","tetra","thrasher","thrush","tiger","toad","tortoise","toucan","treecreeper","treefrog","trout","tuatara","tuna","turkey","turtle","urchin","urial","vicuna","viper","vole","vulture","wagtail","wallaby","walleye","walrus","warbler","warthog","waterbuck","weasel","wildebeest","wolf","wolverine","wombat","woodcock","woodpecker","wrasse","wren","yak","zebra","zebu","zorilla"]});import{isAbsolute as js,join as Vs,resolve as xg}from"path";function yg($){let X=$.trim();if(!X)return"default";if(X.replace(/\/+$/,"")===LD)return"nextToProject";return"custom"}function ND($){let X=$.trim();return X===hX||X.startsWith(`${hX}/`)}function OD($,X){if(typeof $!=="string")return null;let J=$.trim();if(!J)return null;if(ND(J)){if(!X)return null;let q=J.slice(hX.length).replace(/^\/+/,"");return xg(X,q)}let Q=h8();if(J==="~")return Q;let Y=J.startsWith("~/")?Vs(Q,J.slice(2)):J;return js(Y)?Y:xg(Q,Y)}function vg($){let X=v7()[fZ];return OD(typeof X==="string"?X:null,$)}var fZ="worktree.basePath",YN="worktree.basePath.custom",hX="$project_dir",LD;var jD=Z1(()=>{E4();R6();LD=`${hX}/..`});import{createHash as Cs}from"crypto";import hg from"fs";import V8 from"path";function fs($){return vg($)??V8.join(s7(),mg)}function Is(){return V8.join(s7(),mg)}function cg($){if(!V8.isAbsolute($))throw Error(`worktreeRootFor: repo must be an absolute path, got: ${$}`);return V8.join(fs($),og($))}function lg($){if(!V8.isAbsolute($))throw Error(`managedWorktreeRootsFor: repo must be an absolute path, got: ${$}`);let X=cg($),J=V8.join(Is(),og($));return[...X===J?[X]:[X,J],..._s.map((Y)=>V8.join($,Y))]}function dg($,X){if(!X||/[/\\\0]/.test(X))throw Error(`worktreePathFor: invalid slug: ${JSON.stringify(X)}`);return V8.join(cg($),X)}async function pg($){if(X7($)){let J=o$($)?.basePath;if(!J)return[];return rG($).readdir(ig(J))}let X=new Set;for(let J of lg($))try{for(let Q of hg.readdirSync(J,{withFileTypes:!0}))if(Q.isDirectory())X.add(Q.name)}catch{}return[...X]}function VD($,X){if(!V8.isAbsolute($)||!V8.isAbsolute(X))return null;let J=ug(X);for(let Q of lg($)){let Y=ug(Q),q=V8.relative(Y,J);if(q!==""&&!q.startsWith("..")&&!V8.isAbsolute(q))return Q}return null}function ng($,X){return VD($,X)!==null}function ig($){return`${Rs($)}/.kobe/worktrees`}function ag($,X){if(!X||/[/\\\0]/.test(X))throw Error(`remoteWorktreePathFor: invalid slug: ${JSON.stringify(X)}`);return`${ig($)}/${X}`}function Rs($){return $.length>1&&$.endsWith("/")?$.replace(/\/+$/,""):$}function ug($){try{return hg.realpathSync($)}catch{return V8.resolve($)}}function og($){let J=(V8.basename($)||"repo").replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Q=Cs("sha1").update(V8.resolve($)).digest("hex").slice(0,12);return`${J}-${Q}`}var mg="worktrees",As=".kobe/worktrees",Ds=".claude/worktrees",_s;var CD=Z1(()=>{E4();N$();q5();jD();_s=[As,Ds]});class AD{activeSlugs;random;pool;pendingByRepo=new Map;chain=Promise.resolve();constructor($,X={}){this.activeSlugs=$;if(this.random=X.random??Math.random,this.pool=X.pool??wg,this.pool.length===0)throw Error("SlugAllocator: animal pool cannot be empty")}async allocate($){let X=this.chain,J;this.chain=new Promise((Q)=>{J=Q}),await X;try{return await this.pickLocked($)}finally{J()}}commit($,X){this.deletePending($,X)}cancel($,X){this.deletePending($,X)}async pickLocked($){let X=await this.occupiedSlugs($),J=this.pool.filter((Y)=>!X.has(Y));if(J.length>0){let Y=J[Math.floor(this.random()*J.length)];return this.addPending($,Y),Y}let Q=this.pool[Math.floor(this.random()*this.pool.length)];for(let Y=2;;Y++){let q=`${Q}-v${Y}`;if(!X.has(q))return this.addPending($,q),q}}async occupiedSlugs($){let X=new Set(this.pendingByRepo.get($)??[]);for(let J of this.activeSlugs($))if(J)X.add(J);for(let J of await pg($))X.add(J);return X}addPending($,X){let J=this.pendingByRepo.get($);if(!J)J=new Set,this.pendingByRepo.set($,J);J.add(X)}deletePending($,X){let J=this.pendingByRepo.get($);if(!J)return;if(J.delete(X),J.size===0)this.pendingByRepo.delete($)}}var rg=Z1(()=>{bg();CD()});var tg={};V2(tg,{PLACEHOLDER_TASK_TITLE:()=>S9,Orchestrator:()=>GN});import{realpathSync as Ps}from"fs";import{basename as Ss,resolve as Ts}from"path";function sg($){return o$($)?.basePath??$}class GN{store;worktrees;slugs;tasksAcc;setTasks;activeTaskAcc;setActiveTaskSig;unsubscribeStore;worktreeLocks=new Map;mainTaskLocks=new Map;constructor($){this.store=$.store,this.worktrees=$.worktrees,this.slugs=new AD((q)=>this.store.list().filter((W)=>W.repo===q&&W.kind!=="main").map((W)=>{return W.worktreePath.match(/([^/\\]+)[/\\]*$/)?.[1]??""}).filter((W)=>W.length>0));let[X,J]=O7(this.store.list());this.tasksAcc=X,this.setTasks=(q)=>J(()=>q);let[Q,Y]=O7(null);this.activeTaskAcc=Q,this.setActiveTaskSig=(q)=>Y(()=>q),this.unsubscribeStore=this.store.subscribe((q)=>{this.setTasks(q.slice())})}async init(){}activeTaskSignal(){return this.activeTaskAcc}async setActiveTask($){let X=$===null?null:String($);if(this.setActiveTaskSig(X),X&&this.store.get(X))await this.store.update(X,{})}tasksSignal(){return this.tasksAcc}subscribeTasks($){return this.store.subscribe($)}dispose(){this.unsubscribeStore()}listTasks(){return this.store.list()}getTask($){return this.store.get($)}async createTask($){if(!$.repo)throw Error("createTask: repo is required");let X=($.title??S9).trim()||S9,J=await this.store.create({repo:$.repo,title:X,branch:$.branch??"",worktreePath:"",status:"backlog",kind:"task",vendor:$.vendor??I5,...$.modelEffort?{modelEffort:$.modelEffort}:{}});if($.baseRef)this.pendingBaseRefs.set(J.id,$.baseRef);return J}async ensureMainTask($){let{repo:X,key:J}=QU($),Q=this.store.list().find((W)=>W.kind==="main"&&QU(W.repo).key===J);if(Q)return Q;let Y=this.mainTaskLocks.get(J);if(Y)return Y;let q=(async()=>{let W=t7(X);return await this.store.create({repo:X,title:gs(X),branch:"",worktreePath:sg(X),status:"backlog",kind:"main",vendor:W})})();this.mainTaskLocks.set(J,q);try{return await q}finally{this.mainTaskLocks.delete(J)}}async ensureWorktree($){let X=this.requireTask($);if(X.kind==="main")return sg(X.repo);if(X.worktreePath)return X.worktreePath;let J=this.worktreeLocks.get(X.id);if(J)return J;let Q=this.createWorktree(X);this.worktreeLocks.set(X.id,Q);try{return await Q}finally{this.worktreeLocks.delete(X.id)}}async createWorktree($){let X=await this.slugs.allocate($.repo),J=$.branch||rL($.title,$.id),Q=this.pendingBaseRefs.get($.id),Y;try{Y=await this.worktrees.createForTask({repo:$.repo,slug:X,branch:J,baseRef:Q})}catch(q){throw this.slugs.cancel($.repo,X),q}try{await this.store.update($.id,{worktreePath:Y.path,branch:J})}catch(q){throw await this.rollbackWorktree(Y.path),this.slugs.cancel($.repo,X),q}return this.slugs.commit($.repo,X),this.pendingBaseRefs.delete($.id),Y.path}async rollbackWorktree($){try{await this.worktrees.remove($,{force:!0})}catch(X){console.error(`[kobe] ensureWorktree rollback failed for ${$}:`,X)}}async setTitle($,X){let J=X.trim();if(!J)throw Error("setTitle: title is required (empty or whitespace-only rejected)");let Q=this.requireTask($);if(Q.title===J)return;await this.store.update(Q.id,{title:J}),await this.followBranchToTitle(Q,J)}async followBranchToTitle($,X){if($.kind==="main"||!$.worktreePath)return;if($.branch!==rL(S9,$.id))return;let J=rL(X,$.id);if(J===$.branch)return;try{await this.setBranch($.id,J)}catch(Q){console.error(`[kobe] follow-branch-to-title failed for ${$.id}:`,Q)}}async setBranch($,X){let J=X.trim();if(!J)throw Error("setBranch: branch is required (empty or whitespace-only rejected)");let Q=this.requireTask($);if(Q.kind==="main")throw Error("setBranch: a main task tracks the repo's own branch; rename it with git directly");if(Q.branch===J)return;if(Q.worktreePath)await this.worktrees.renameBranch(Q.worktreePath,Q.branch,J);await this.store.update(Q.id,{branch:J})}async setVendor($,X){let J=this.requireTask($);if(J.vendor===X)return;await this.store.update(J.id,{vendor:X})}async setPinned($,X){let J=this.requireTask($);if(J.kind==="main")return;let Q=X??!J.pinned;if((J.pinned??!1)===Q)return;await this.store.update(J.id,{pinned:Q})}async moveTask($,X){let J=this.requireTask($);if(J.kind==="main")return;let Q=this.store.list().filter((Y)=>(Y.kind??"task")!=="main"&&Y.archived===J.archived&&(Y.pinned??!1)===(J.pinned??!1)).map((Y)=>String(Y.id));await this.store.move(J.id,X,Q)}async setArchived($,X){let J=this.requireTask($);if(J.kind==="main")return;let Q=X??!J.archived;if(J.archived===Q)return;await this.store.update(J.id,{archived:Q})}async reorderTasks($){if($.length===0)return;for(let X of $){if(this.requireTask(X.taskId).kind==="main")throw Error(`cannot reorder a main task: ${X.taskId}`);if(!Number.isFinite(X.position))throw Error(`position must be a finite number: ${X.taskId}`)}await this.store.reorder($.map((X)=>({id:X.taskId,position:X.position})))}async setStatus($,X){let J=this.requireTask($);if(J.status===X)return;if(J.status==="done"&&X==="error"||J.status==="error"&&X==="done")throw new HD(J.status,X,J.id);await this.store.update(J.id,{status:X})}async setPRStatus($,X){let J=this.requireTask($);if(QN(J.prStatus,X??void 0))return;await this.store.update(J.id,{prStatus:X??void 0})}async deleteTask($,X){let J=this.store.get($);if(!J)return;if(J.kind==="main")throw new BD;let Q=X?.force===!0;if(J.worktreePath){if(!Q){let Y=!1;try{Y=await this.worktrees.isDirty(J.worktreePath)}catch{}if(Y)throw new KD(J.id)}try{await this.worktrees.remove(J.worktreePath,{force:Q})}catch(Y){throw new MD(J.id,Y)}}await this.store.remove(J.id),this.pendingBaseRefs.delete(J.id),this.worktreeLocks.delete(J.id)}async forgetProject($){if(!$)throw Error("forgetProject: repo is required");let X=QU($).key;for(let J of u7())if(QU(J).key===X)dC(J);for(let J of this.store.list()){if(J.kind!=="main")continue;if(QU(J.repo).key!==X)continue;await this.store.remove(J.id),this.pendingBaseRefs.delete(J.id),this.worktreeLocks.delete(J.id)}}async discoverAdoptableWorktrees($){if(!$)throw Error("discoverAdoptableWorktrees: repo is required");let X=await this.worktrees.listAll($),J=new Set(this.store.list().filter((Q)=>Q.worktreePath).map((Q)=>fq(Q.worktreePath)));return X.filter((Q)=>!J.has(fq(Q.path)))}async adoptWorktree($){if(!$.repo)throw Error("adoptWorktree: repo is required");if(!$.worktreePath)throw Error("adoptWorktree: worktreePath is required");let X=fq($.worktreePath),J=this.adoptLocks.get(X);if(J)return J;let Q=this.adoptWorktreeLocked($,X);this.adoptLocks.set(X,Q);try{return await Q}finally{this.adoptLocks.delete(X)}}async adoptWorktreeLocked($,X){let J=this.store.list().find((H)=>H.worktreePath&&fq(H.worktreePath)===X);if(J){if($.ifExists==="return")return J;throw Error(`adoptWorktree: ${$.worktreePath} is already adopted as a task`)}let Y=(await this.worktrees.listAll($.repo)).find((H)=>fq(H.path)===X);if(!Y)throw Error(`adoptWorktree: ${$.worktreePath} is not an adoptable git worktree of ${$.repo} (unknown, detached, or the main checkout)`);let q=$.branch?.trim()||Y.branch,W=($.title??Ss(Y.path)).trim()||S9;return this.store.create({repo:$.repo,title:W,branch:q,worktreePath:Y.path,status:"backlog",kind:"task",vendor:$.vendor??I5})}pendingBaseRefs=new Map;adoptLocks=new Map;requireTask($){let X=this.store.get($);if(!X)throw new WD(String($));return X}}function gs($){let X=$.split(/[/\\]/).filter(Boolean);return X.length>0?X[X.length-1]??$:$}function QU($){let X=kX($);return{repo:X,key:X7(X)?X:fq(X)}}function fq($){try{return Ps($)}catch{return Ts($)}}var S9="(new task)";var YU=Z1(()=>{Aq();qD();q5();w3();N8();FD();rg()});async function Es($,X=JE){let{code:J,stdout:Q}=await X.capture(["list-windows","-t",`=${$}`,"-F",`#{window_index} #{automatic-rename} #{${_9}}`]);if(J!==0)return null;let Y=[];for(let q of Q.split(`
37
+ `)}}onLine($){let X;try{X=JSON.parse($)}catch(Q){k4("client-frame",Q);return}if(X.type==="event"){this.emit(X);return}if(X.type!=="response")return;let J=this.pending.get(X.id);if(!J)return;if(this.pending.delete(X.id),X.error){let Q=Error(X.error.message);if(X.error.name)Q.name=X.error.name;J.reject(Q)}else J.resolve(X.payload)}emit($){for(let X of this.handlers.get($.name)??[])X($);for(let X of this.handlers.get("*")??[])X($)}}var FQ=Z1(()=>{x6();y6()});async function AZ($,X){if(!X)return 0;return f5($).history.latestTranscriptMtimeForWorktree(X)}var eB=Z1(()=>{c8()});async function Bg(){let $=MQ();if(await LQ($))return $;await vX($,jq()).catch(()=>{});let[X,...J]=iL(ar);nL(X,J,process.env,Zg());let Q=Date.now()+5000;while(Date.now()<Q){if(await LQ($))return $;await new Promise((Y)=>setTimeout(Y,100))}throw Error(`kobe: pty host did not start (or stayed wedged) at ${$}`)}async function Ug($,X){let J=MQ(X),Q=new O8(J);try{await Q.connect(),await Q.request("pty.sweep",{liveTaskIds:$})}catch{}finally{Q.close()}}var ar;var sA=Z1(()=>{$U();CZ();h7();FQ();ar=["pty-host"]});function aL($){return or.includes($)}function Kg($,X,J){switch(X){case"session-start":case"session-end":return"idle";case"turn-start":return"running";case"turn-complete":return"turn_complete";case"turn-failed":return J?.failure==="rate_limit"||J?.failure==="billing"?"rate_limited":"error";case"awaiting-input":return J?.waiting==="permission"?"permission_needed":"running"}}var or;var oL=Z1(()=>{or=["session-start","turn-start","turn-complete","turn-failed","awaiting-input","session-end"]});function rr(){let $=process.env.KOBE_ENGINE_STATE_TTL_MS;if($===void 0)return Mg;let X=Number($);return Number.isFinite(X)&&X>0?X:Mg}class tA{bus;staleMs;now;livenessAt;activity=new Map;constructor($,X=rr(),J=()=>Date.now(),Q=()=>Promise.resolve(void 0)){this.bus=$;this.staleMs=X;this.now=J;this.livenessAt=Q}report($,X,J){let Q=this.activity.get($);if(Q?.lapse)clearTimeout(Q.lapse);let Y=Kg(Q?.state,X,J),q=this.now(),W={state:Y,detail:J,at:q};if(Y!=="idle"&&Y!=="turn_complete")W.lapse=this.armLapse($,q);this.activity.set($,W),this.bus.publish("engine-state",this.payload($,W))}armLapse($,X){let J=setTimeout(()=>{this.handleLapse($,X)},this.staleMs);return J.unref?.(),J}async handleLapse($,X){let J=this.activity.get($);if(!J||J.at!==X)return;let Q;try{Q=await this.livenessAt($)}catch{Q=void 0}let Y=this.activity.get($);if(!Y||Y.at!==X)return;if(Q!==void 0&&Q>this.now()-this.staleMs){Y.lapse=this.armLapse($,X);return}this.publishIdle($)}clearTask($){let X=this.activity.get($);if(X?.lapse)clearTimeout(X.lapse);if(this.activity.delete($),X)this.bus.publish("engine-state",{taskId:$,state:"idle",at:this.now()})}snapshotByTask(){let $={};for(let[X,J]of this.activity)$[X]=this.payload(X,J);return $}currentNonIdle(){let $=[];for(let[X,J]of this.activity)if(J.state!=="idle")$.push(this.payload(X,J));return $}close(){for(let $ of this.activity.values())if($.lapse)clearTimeout($.lapse);this.activity.clear()}publishIdle($){let X={state:"idle",at:this.now()};this.activity.set($,X),this.bus.publish("engine-state",this.payload($,X))}payload($,X){return{taskId:$,state:X.state,...X.detail?{detail:X.detail}:{},at:X.at}}}var Mg=600000;var Fg=Z1(()=>{oL()});function Lg($){if(typeof $!=="string")return"";let X=$.replace(/\s+/g," ").trim();if(X.length===0)return"";let J=[...X];if(J.length<=40)return X;return`${J.slice(0,40).join("")}\u2026`}function rL($,X){let J=$.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),Q=X.slice(-6).toLowerCase();return`kobe/${J||"task"}-${Q}`}function Ng($){let X=$.find((Y)=>Y.role==="user");if(!X)return"";let J=X.blocks.filter((Y)=>Y.type==="text").map((Y)=>Y.text).join(" "),Q=Lg(J);return Q.length>0?Buffer.from(Q,"utf8").toString("utf8"):Q}async function Vq($,X=I5){if(!$)return"";let{history:J}=f5(X),Q=await J.listSessionIdsForWorktree($);for(let Y of Q.slice(0,sr)){let q=Ng(await J.readHistory(Y));if(q)return q}return""}async function sL($,X){if(!X)return"";try{return Ng(await f5($).history.readHistory(X))}catch{return""}}var sr=8;var XU=Z1(()=>{c8();N8()});function Og($){let X=String($),J=X.length-1;return $3.context.id+(J?String.fromCharCode(96+J):"")+X}function tr($){$3.context=$}function $N($,X){let J=b5,Q=s2,Y=$.length===0,q=X===void 0?Q:X,W=Y?{owned:null,cleanups:null,context:null,owner:null}:{owned:null,cleanups:null,context:q?q.context:null,owner:q},H=Y?()=>$(()=>{throw Error("Dispose method must be an explicit argument to createRoot function")}):()=>$(()=>Ig(()=>DZ(W)));v6.afterCreateOwner&&v6.afterCreateOwner(W),s2=W,b5=null;try{return P9(H,!0)}finally{b5=J,s2=Q}}function O7($,X){X=X?Object.assign({},jg,X):jg;let J={value:$,observers:null,observerSlots:null,comparator:X.equals||void 0};{if(X.name)J.name=X.name;if(X.internal)J.internal=!0;else if(Rg(J),v6.afterCreateSignal)v6.afterCreateSignal(J)}let Q=(Y)=>{if(typeof Y==="function")if(_0&&_0.running&&_0.sources.has(J))Y=Y(J.tValue);else Y=Y(J.value);return JD(J,Y)};return[Qs.bind(J),Q]}function XN($,X,J){_g=Hs;let Q=Ys($,X,!1,R9,J),Y=eA&&zs(eA);if(Y)Q.suspense=Y;if(!J||!J.render)Q.user=!0;j8?j8.push(Q):ZD(Q)}function fg($){return P9($,!1)}function Ig($){if(!Cq&&b5===null)return $();let X=b5;b5=null;try{if(Cq)return Cq.untrack($);return $()}finally{b5=X}}function Js($){if(s2===null)console.warn("cleanups created outside a `createRoot` or `render` will never be run");else if(s2.cleanups===null)s2.cleanups=[$];else s2.cleanups.push($);return $}function JN(){return b5}function Zs($){if(_0&&_0.running)return $(),_0.done;let X=b5,J=s2;return Promise.resolve().then(()=>{b5=X,s2=J;let Q;if(XD||eA)Q=_0||(_0={sources:new Set,effects:[],promises:new Set,disposed:new Set,queue:new Set,running:!0}),Q.done||(Q.done=new Promise((Y)=>Q.resolve=Y)),Q.running=!0;return P9($,!1),b5=s2=null,Q?Q.done:void 0})}function Rg($){if(s2){if(s2.sourceMap)s2.sourceMap.push($);else s2.sourceMap=[$];$.graph=s2}if(v6.afterRegisterGraph)v6.afterRegisterGraph($)}function zs($){let X;return s2&&s2.context&&(X=s2.context[$.id])!==void 0?X:$.defaultValue}function Qs(){let $=_0&&_0.running;if(this.sources&&($?this.tState:this.state))if(($?this.tState:this.state)===R9)ZD(this);else{let X=e7;e7=null,P9(()=>tL(this),!1),e7=X}if(b5){let X=this.observers;if(!X||X[X.length-1]!==b5){let J=X?X.length:0;if(!b5.sources)b5.sources=[this],b5.sourceSlots=[J];else b5.sources.push(this),b5.sourceSlots.push(J);if(!X)this.observers=[b5],this.observerSlots=[b5.sources.length-1];else X.push(b5),this.observerSlots.push(b5.sources.length-1)}}if($&&_0.sources.has(this))return this.tValue;return this.value}function JD($,X,J){let Q=_0&&_0.running&&_0.sources.has($)?$.tValue:$.value;if(!$.comparator||!$.comparator(Q,X)){if(_0){let Y=_0.running;if(Y||!J&&_0.sources.has($))_0.sources.add($),$.tValue=X;if(!Y)$.value=X}else $.value=X;if($.observers&&$.observers.length)P9(()=>{for(let Y=0;Y<$.observers.length;Y+=1){let q=$.observers[Y],W=_0&&_0.running;if(W&&_0.disposed.has(q))continue;if(W?!q.tState:!q.state){if(q.pure)e7.push(q);else j8.push(q);if(q.observers)Sg(q)}if(!W)q.state=R9;else q.tState=R9}if(e7.length>1e6){if(e7=[],er)throw Error("Potential Infinite Loop Detected.");throw Error()}},!1)}return X}function ZD($){if(!$.fn)return;DZ($);let X=eL;if(Ag($,_0&&_0.running&&_0.sources.has($)?$.tValue:$.value,X),_0&&!_0.running&&_0.sources.has($))queueMicrotask(()=>{P9(()=>{_0&&(_0.running=!0),b5=s2=$,Ag($,$.tValue,X),b5=s2=null},!1)})}function Ag($,X,J){let Q,Y=s2,q=b5;b5=s2=$;try{Q=$.fn(X)}catch(W){if($.pure)if(_0&&_0.running)$.tState=R9,$.tOwned&&$.tOwned.forEach(DZ),$.tOwned=void 0;else $.state=R9,$.owned&&$.owned.forEach(DZ),$.owned=null;return $.updatedAt=J+1,zD(W)}finally{b5=q,s2=Y}if(!$.updatedAt||$.updatedAt<=J){if($.updatedAt!=null&&"observers"in $)JD($,Q,!0);else if(_0&&_0.running&&$.pure){if(!_0.sources.has($))$.value=Q;_0.sources.add($),$.tValue=Q}else $.value=Q;$.updatedAt=J}}function Ys($,X,J,Q=R9,Y){let q={fn:$,state:Q,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:X,owner:s2,context:s2?s2.context:null,pure:J};if(_0&&_0.running)q.state=0,q.tState=Q;if(s2===null)console.warn("computations created outside a `createRoot` or `render` will never be disposed");else if(s2!==Xs)if(_0&&_0.running&&s2.pure)if(!s2.tOwned)s2.tOwned=[q];else s2.tOwned.push(q);else if(!s2.owned)s2.owned=[q];else s2.owned.push(q);if(Y&&Y.name)q.name=Y.name;if(Cq&&q.fn){let W=q.fn,[H,K]=O7(void 0,{equals:!1}),F=Cq.factory(W,K);Js(()=>F.dispose());let C,V=()=>Zs(K).then(()=>{if(C)C.dispose(),C=void 0});q.fn=(N)=>{if(H(),_0&&_0.running){if(!C)C=Cq.factory(W,V);return C.track(N)}return F.track(N)}}return v6.afterCreateOwner&&v6.afterCreateOwner(q),q}function ZU($){let X=_0&&_0.running;if((X?$.tState:$.state)===0)return;if((X?$.tState:$.state)===JU)return tL($);if($.suspense&&Ig($.suspense.inFallback))return $.suspense.effects.push($);let J=[$];while(($=$.owner)&&(!$.updatedAt||$.updatedAt<eL)){if(X&&_0.disposed.has($))return;if(X?$.tState:$.state)J.push($)}for(let Q=J.length-1;Q>=0;Q--){if($=J[Q],X){let Y=$,q=J[Q+1];while((Y=Y.owner)&&Y!==q)if(_0.disposed.has(Y))return}if((X?$.tState:$.state)===R9)ZD($);else if((X?$.tState:$.state)===JU){let Y=e7;e7=null,P9(()=>tL($,J[0]),!1),e7=Y}}}function P9($,X){if(e7)return $();let J=!1;if(!X)e7=[];if(j8)J=!0;else j8=[];eL++;try{let Q=$();return Gs(J),Q}catch(Q){if(!J)j8=null;e7=null,zD(Q)}}function Gs($){if(e7){if(XD&&_0&&_0.running)qs(e7);else Pg(e7);e7=null}if($)return;let X;if(_0){if(!_0.promises.size&&!_0.queue.size){let{sources:Q,disposed:Y}=_0;j8.push.apply(j8,_0.effects),X=_0.resolve;for(let q of j8)"tState"in q&&(q.state=q.tState),delete q.tState;_0=null,P9(()=>{for(let q of Y)DZ(q);for(let q of Q){if(q.value=q.tValue,q.owned)for(let W=0,H=q.owned.length;W<H;W++)DZ(q.owned[W]);if(q.tOwned)q.owned=q.tOwned;delete q.tValue,delete q.tOwned,q.tState=0}Cg(!1)},!1)}else if(_0.running){_0.running=!1,_0.effects.push.apply(_0.effects,j8),j8=null,Cg(!0);return}}let J=j8;if(j8=null,J.length)P9(()=>_g(J),!1);else v6.afterUpdate&&v6.afterUpdate();if(X)X()}function Pg($){for(let X=0;X<$.length;X++)ZU($[X])}function qs($){for(let X=0;X<$.length;X++){let J=$[X],Q=_0.queue;if(!Q.has(J))Q.add(J),XD(()=>{Q.delete(J),P9(()=>{_0.running=!0,ZU(J)},!1),_0&&(_0.running=!1)})}}function Hs($){let X,J=0;for(X=0;X<$.length;X++){let Q=$[X];if(!Q.user)ZU(Q);else $[J++]=Q}if($3.context){if($3.count){$3.effects||($3.effects=[]),$3.effects.push(...$.slice(0,J));return}tr()}if($3.effects&&($3.done||!$3.count))$=[...$3.effects,...$],J+=$3.effects.length,delete $3.effects;for(X=0;X<J;X++)ZU($[X])}function tL($,X){let J=_0&&_0.running;if(J)$.tState=0;else $.state=0;for(let Q=0;Q<$.sources.length;Q+=1){let Y=$.sources[Q];if(Y.sources){let q=J?Y.tState:Y.state;if(q===R9){if(Y!==X&&(!Y.updatedAt||Y.updatedAt<eL))ZU(Y)}else if(q===JU)tL(Y,X)}}}function Sg($){let X=_0&&_0.running;for(let J=0;J<$.observers.length;J+=1){let Q=$.observers[J];if(X?!Q.tState:!Q.state){if(X)Q.tState=JU;else Q.state=JU;if(Q.pure)e7.push(Q);else j8.push(Q);Q.observers&&Sg(Q)}}}function DZ($){let X;if($.sources)while($.sources.length){let J=$.sources.pop(),Q=$.sourceSlots.pop(),Y=J.observers;if(Y&&Y.length){let q=Y.pop(),W=J.observerSlots.pop();if(Q<Y.length)q.sourceSlots[W]=Q,Y[Q]=q,J.observerSlots[Q]=W}}if($.tOwned){for(X=$.tOwned.length-1;X>=0;X--)DZ($.tOwned[X]);delete $.tOwned}if(_0&&_0.running&&$.pure)Tg($,!0);else if($.owned){for(X=$.owned.length-1;X>=0;X--)DZ($.owned[X]);$.owned=null}if($.cleanups){for(X=$.cleanups.length-1;X>=0;X--)$.cleanups[X]();$.cleanups=null}if(_0&&_0.running)$.tState=0;else $.state=0;delete $.sourceMap}function Tg($,X){if(!X)$.tState=0,_0.disposed.add($);if($.owned)for(let J=0;J<$.owned.length;J++)Tg($.owned[J])}function Ws($){if($ instanceof Error)return $;return Error(typeof $==="string"?$:"Unknown error",{cause:$})}function Dg($,X,J){try{for(let Q of X)Q($)}catch(Q){zD(Q,J&&J.owner||null)}}function zD($,X=s2){let J=Vg&&X&&X.context&&X.context[Vg],Q=Ws($);if(!J)throw Q;if(j8)j8.push({fn(){Dg(Q,J,X)},state:R9});else Dg(Q,J,X)}var $3,er=!0,$s=($,X)=>$===X,_Z,$D,XQ1,jg,Vg=null,_g,R9=1,JU=2,Xs,s2=null,_0=null,XD=null,Cq=null,b5=null,e7=null,j8=null,eL=0,v6,JQ1,Cg,eA,ZQ1,gg;var Aq=Z1(()=>{$3={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return Og(this.context.count)},getNextContextId(){return Og(this.context.count++)}};_Z=Symbol("solid-proxy"),$D=Symbol("solid-track"),XQ1=Symbol("solid-dev-component"),jg={equals:$s},_g=Pg,Xs={},v6={afterUpdate:null,afterCreateOwner:null,afterCreateSignal:null,afterRegisterGraph:null};[JQ1,Cg]=O7(!1);ZQ1=Symbol("fallback"),gg={hooks:v6,writeSignal:JD,registerGraph:Rg};if(globalThis)if(!globalThis.Solid$$)globalThis.Solid$$=!0;else console.warn("You appear to have multiple instances of Solid. This can lead to unexpected behavior.")});import{spawn as Bs}from"child_process";function QD($,X,J,Q){if(J)return $+Q.slowRetryMs;return X+Math.max(Q.minIntervalMs,(X-$)*5)}function YD($,X){return!$.inFlight&&X>=$.nextAllowedAt}function Dq($,X,J=Math.random){let Q=Math.max(0,Math.min(1,X)),Y=(J()*2-1)*$*Q;return Math.max(0,$+Y)}function ZN($,X,J){if(X<=0)return Math.min($,J);return Math.min($*2**X,J)}function _q($,X,J,Q){let Y=Date.now();if(!YD($,Y))return!1;$.inFlight=!0;let q=new AbortController,W=setTimeout(()=>q.abort(),X.timeoutMs);return(async()=>{let H,K=!1;try{H=await J(q.signal),K=!0}catch{}clearTimeout(W);let F=q.signal.aborted;if($.nextAllowedAt=QD(Y,Date.now(),F,X),$.inFlight=!1,K&&!F)Q(H)})(),!0}function uX($,X,J){return new Promise((Q)=>{let Y="",q=!1,W=(K)=>{if(q)return;q=!0,Q({status:K,stdout:Y})},H=Bs($,X.slice(),{cwd:J.cwd,stdio:["ignore","pipe","ignore"],env:J.env,signal:J.signal,killSignal:"SIGKILL"});H.stdout?.on("data",(K)=>{Y+=String(K)}),H.on("error",()=>W(null)),H.on("close",(K)=>W(K))})}var NQ=()=>{};function Us($,X){switch(($??"").toUpperCase()){case"MERGED":return"merged";case"CLOSED":return"closed";case"OPEN":return(X??"").toUpperCase()==="APPROVED"?"ready_to_merge":"open";default:return"unknown"}}function Ks($){let X=($.status??"").toUpperCase(),J=($.conclusion??"").toUpperCase(),Q=($.state??"").toUpperCase();if(X&&X!=="COMPLETED")return"pending";if(J){if(J==="SUCCESS"||J==="NEUTRAL"||J==="SKIPPED")return"passing";return"failing"}if(Q==="SUCCESS")return"passing";if(Q==="PENDING"||Q==="EXPECTED")return"pending";if(Q==="FAILURE"||Q==="ERROR")return"failing";return"unknown"}function Ms($){if(!$||$.length===0)return"none";let X=!1,J=!1;for(let Q of $){let Y=Ks(Q);if(Y==="failing")return"failing";if(Y==="pending")X=!0;else if(Y==="passing")J=!0}if(X)return"pending";if(J)return"passing";return"unknown"}function kg($,X){if(!$||typeof $.number!=="number")return null;return{provider:"github",lifecycle:Us($.state,$.reviewDecision),checkState:Ms($.statusCheckRollup),number:$.number,url:$.url,title:$.title,baseRef:$.baseRefName,headRef:$.headRefName,reviewDecision:$.reviewDecision||void 0,mergeable:$.mergeable||void 0,lastCheckedAt:X}}function QN($,X){if($===X)return!0;if(!$||!X)return!1;return $.provider===X.provider&&$.lifecycle===X.lifecycle&&$.checkState===X.checkState&&$.number===X.number&&$.url===X.url&&$.title===X.title&&$.baseRef===X.baseRef&&$.headRef===X.headRef&&$.reviewDecision===X.reviewDecision&&$.mergeable===X.mergeable}function zN($,X){return X.some((J)=>$.includes(J))}function GD($){if($.parseError)return{kind:"error",error:"parse"};if($.timedOut)return{kind:"error",error:"timeout"};if($.spawnError)return{kind:"error",error:"missing-binary"};let X=($.stderr??"").toLowerCase();if(zN(X,Os))return{kind:"empty"};if(zN(X,Fs))return{kind:"error",error:"no-remote"};if(zN(X,Ls))return{kind:"error",error:"auth"};if(zN(X,Ns))return{kind:"error",error:"network"};return{kind:"empty"}}function zU($,X,J,Q,Y=Math.random){let q=(H)=>J+Dq(H,Q.jitterRatio,Y);if($.kind==="pr")return{nextAllowedAt:q($.settled?Q.settledMs:Q.tickMs),failures:0};if($.kind==="empty")return{nextAllowedAt:q(Q.noPrMs),failures:0};if($.error==="no-remote")return{nextAllowedAt:q(Q.noRemoteMs),failures:0};let W=X+1;return{nextAllowedAt:q(ZN(Q.failureBaseMs,W-1,Q.failureCapMs)),failures:W}}var Eg="number,url,title,state,baseRefName,headRefName,reviewDecision,mergeable,statusCheckRollup",Fs,Ls,Ns,Os;var qD=Z1(()=>{NQ();Fs=["none of the git remotes","no git remote","to use github cli in a github repository","not a github repository"],Ls=["gh auth login","authentication required","not logged in","http 401","bad credentials","requires authentication"],Ns=["could not resolve host","no such host","dial tcp","connection refused","connection reset","network is unreachable","i/o timeout","timeout","tls handshake","http 5","rate limit","try again"],Os=["no pull requests found","no open pull requests","no pull request found"]});var HD,WD,BD,UD="DIRTY_WORKTREE",KD,MD;var FD=Z1(()=>{HD=class HD extends Error{from;to;taskId;constructor($,X,J){super(`illegal transition for task ${J}: ${$} -> ${X}`);this.from=$;this.to=X;this.taskId=J;this.name="IllegalTransitionError"}};WD=class WD extends Error{constructor($){super(`task not found: ${$}`);this.name="TaskNotFoundError"}};BD=class BD extends Error{constructor(){super("cannot delete a main task; remove the repo from saved repos instead");this.name="CannotDeleteMainTaskError"}};KD=class KD extends Error{taskId;constructor($){super(`${UD}: task ${$} worktree has uncommitted or untracked changes`);this.taskId=$;this.name="DirtyWorktreeError"}};MD=class MD extends Error{taskId;cause;constructor($,X){super(`failed to remove worktree for task ${$}: ${X instanceof Error?X.message:String(X)}`);this.taskId=$;this.cause=X;this.name="WorktreeRemoveFailedError"}}});var wg;var bg=Z1(()=>{wg=["aardvark","addax","adder","agouti","albatross","alpaca","anaconda","anchovy","anglerfish","anole","anteater","antelope","ape","argali","armadillo","avocet","axolotl","baboon","badger","banteng","barracuda","basilisk","bass","bat","beagle","bear","beaver","bee","beetle","beluga","betta","bison","blackbird","blenny","bluebird","bluegill","boar","bobcat","bonito","bovid","buffalo","bullfrog","bunting","bushbuck","butterfly","buzzard","caiman","camel","canary","capybara","caracal","cardinal","caribou","carp","cassowary","caterpillar","catfish","chameleon","chamois","char","cheetah","chickadee","chimp","chinchilla","chipmunk","chough","cicada","civet","clam","clownfish","cobra","cockatoo","condor","coot","copperhead","coral","cormorant","cougar","coyote","crab","crane","crawfish","crayfish","cricket","crocodile","crow","cuckoo","curlew","cuttlefish","deer","dikdik","dingo","dolphin","donkey","dormouse","dotterel","dove","dragonfly","dromedary","duck","dugong","dunlin","eagle","echidna","eel","egret","eider","eland","elephant","elk","emu","ermine","falcon","fawn","ferret","finch","firefly","flamingo","flounder","fox","frog","gadwall","gannet","gaur","gazelle","gecko","gemsbok","gerbil","gharial","gibbon","gnu","goat","goby","godwit","goldfish","goose","gopher","goral","gorilla","goshawk","grackle","grasshopper","grayling","grebe","grouse","guanaco","guillemot","guineafowl","guppy","halibut","hammerhead","hamster","hare","harrier","hartebeest","hawk","hedgehog","heron","herring","hippo","hornbill","hornet","horse","hummingbird","hyena","ibex","ibis","iguana","impala","indri","jacana","jackal","jaguar","jay","jellyfish","jerboa","junco","kakapo","kangaroo","kestrel","killdeer","kingfisher","kinglet","kite","kiwi","koala","kookaburra","krait","krill","kudu","ladybug","lamprey","langur","lapwing","lark","lemming","lemur","leopard","limpet","lion","lionfish","lizard","llama","lobster","locust","loon","lorikeet","loris","lynx","macaque","macaw","mackerel","magpie","mallard","mamba","mammoth","manatee","mandrill","manta","mantis","marlin","marmoset","marmot","marten","meerkat","merganser","mink","minnow","mole","mongoose","monitor","monkey","moose","moth","mouflon","mouse","mudpuppy","mule","muntjac","musk","muskox","muskrat","mussel","mustang","narwhal","newt","nightingale","numbat","nuthatch","nyala","ocelot","octopus","okapi","opossum","orangutan","orca","oriole","oryx","osprey","ostrich","otter","owl","oyster","oystercatcher","paca","panda","pangolin","panther","parakeet","parrot","parrotfish","partridge","peafowl","pelican","penguin","perch","petrel","pheasant","pigeon","pika","pike","pintail","pipefish","platypus","plover","pollock","pony","porcupine","porpoise","possum","ptarmigan","puffin","puma","pupfish","python","quail","quetzal","quokka","quoll","rabbit","raccoon","rail","rat","rattler","raven","ray","redpoll","reindeer","remora","rhino","roadrunner","robin","rook","sable","sailfish","salamander","salmon","sandpiper","sardine","scallop","scaup","scorpion","seahorse","seal","serval","shark","shearwater","shrew","shrike","shrimp","siskin","sitatunga","skate","skink","skua","skunk","sloth","smelt","snail","snipe","solenodon","sparrow","spider","springbok","squid","squirrel","starfish","starling","stilt","stingray","stoat","stork","sunbird","sunfish","swallow","swan","swift","swordfish","tahr","takin","tamarin","tanager","tapir","tarantula","tarpon","tarsier","teal","tenrec","terrapin","tern","tetra","thrasher","thrush","tiger","toad","tortoise","toucan","treecreeper","treefrog","trout","tuatara","tuna","turkey","turtle","urchin","urial","vicuna","viper","vole","vulture","wagtail","wallaby","walleye","walrus","warbler","warthog","waterbuck","weasel","wildebeest","wolf","wolverine","wombat","woodcock","woodpecker","wrasse","wren","yak","zebra","zebu","zorilla"]});import{isAbsolute as js,join as Vs,resolve as xg}from"path";function yg($){let X=$.trim();if(!X)return"default";if(X.replace(/\/+$/,"")===LD)return"nextToProject";return"custom"}function ND($){let X=$.trim();return X===hX||X.startsWith(`${hX}/`)}function OD($,X){if(typeof $!=="string")return null;let J=$.trim();if(!J)return null;if(ND(J)){if(!X)return null;let q=J.slice(hX.length).replace(/^\/+/,"");return xg(X,q)}let Q=h8();if(J==="~")return Q;let Y=J.startsWith("~/")?Vs(Q,J.slice(2)):J;return js(Y)?Y:xg(Q,Y)}function vg($){let X=v7()[fZ];return OD(typeof X==="string"?X:null,$)}var fZ="worktree.basePath",YN="worktree.basePath.custom",hX="$project_dir",LD;var jD=Z1(()=>{E4();R6();LD=`${hX}/..`});import{createHash as Cs}from"crypto";import hg from"fs";import V8 from"path";function fs($){return vg($)??V8.join(s7(),mg)}function Is(){return V8.join(s7(),mg)}function cg($){if(!V8.isAbsolute($))throw Error(`worktreeRootFor: repo must be an absolute path, got: ${$}`);return V8.join(fs($),og($))}function lg($){if(!V8.isAbsolute($))throw Error(`managedWorktreeRootsFor: repo must be an absolute path, got: ${$}`);let X=cg($),J=V8.join(Is(),og($));return[...X===J?[X]:[X,J],..._s.map((Y)=>V8.join($,Y))]}function dg($,X){if(!X||/[/\\\0]/.test(X))throw Error(`worktreePathFor: invalid slug: ${JSON.stringify(X)}`);return V8.join(cg($),X)}async function pg($){if(X7($)){let J=o$($)?.basePath;if(!J)return[];return rG($).readdir(ig(J))}let X=new Set;for(let J of lg($))try{for(let Q of hg.readdirSync(J,{withFileTypes:!0}))if(Q.isDirectory())X.add(Q.name)}catch{}return[...X]}function VD($,X){if(!V8.isAbsolute($)||!V8.isAbsolute(X))return null;let J=ug(X);for(let Q of lg($)){let Y=ug(Q),q=V8.relative(Y,J);if(q!==""&&!q.startsWith("..")&&!V8.isAbsolute(q))return Q}return null}function ng($,X){return VD($,X)!==null}function ig($){return`${Rs($)}/.kobe/worktrees`}function ag($,X){if(!X||/[/\\\0]/.test(X))throw Error(`remoteWorktreePathFor: invalid slug: ${JSON.stringify(X)}`);return`${ig($)}/${X}`}function Rs($){return $.length>1&&$.endsWith("/")?$.replace(/\/+$/,""):$}function ug($){try{return hg.realpathSync($)}catch{return V8.resolve($)}}function og($){let J=(V8.basename($)||"repo").replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Q=Cs("sha1").update(V8.resolve($)).digest("hex").slice(0,12);return`${J}-${Q}`}var mg="worktrees",As=".kobe/worktrees",Ds=".claude/worktrees",_s;var CD=Z1(()=>{E4();N$();q5();jD();_s=[As,Ds]});class AD{activeSlugs;random;pool;pendingByRepo=new Map;chain=Promise.resolve();constructor($,X={}){this.activeSlugs=$;if(this.random=X.random??Math.random,this.pool=X.pool??wg,this.pool.length===0)throw Error("SlugAllocator: animal pool cannot be empty")}async allocate($){let X=this.chain,J;this.chain=new Promise((Q)=>{J=Q}),await X;try{return await this.pickLocked($)}finally{J()}}commit($,X){this.deletePending($,X)}cancel($,X){this.deletePending($,X)}async pickLocked($){let X=await this.occupiedSlugs($),J=this.pool.filter((Y)=>!X.has(Y));if(J.length>0){let Y=J[Math.floor(this.random()*J.length)];return this.addPending($,Y),Y}let Q=this.pool[Math.floor(this.random()*this.pool.length)];for(let Y=2;;Y++){let q=`${Q}-v${Y}`;if(!X.has(q))return this.addPending($,q),q}}async occupiedSlugs($){let X=new Set(this.pendingByRepo.get($)??[]);for(let J of this.activeSlugs($))if(J)X.add(J);for(let J of await pg($))X.add(J);return X}addPending($,X){let J=this.pendingByRepo.get($);if(!J)J=new Set,this.pendingByRepo.set($,J);J.add(X)}deletePending($,X){let J=this.pendingByRepo.get($);if(!J)return;if(J.delete(X),J.size===0)this.pendingByRepo.delete($)}}var rg=Z1(()=>{bg();CD()});var tg={};V2(tg,{PLACEHOLDER_TASK_TITLE:()=>S9,Orchestrator:()=>GN});import{realpathSync as Ps}from"fs";import{basename as Ss,resolve as Ts}from"path";function sg($){return o$($)?.basePath??$}class GN{store;worktrees;slugs;tasksAcc;setTasks;activeTaskAcc;setActiveTaskSig;unsubscribeStore;worktreeLocks=new Map;mainTaskLocks=new Map;constructor($){this.store=$.store,this.worktrees=$.worktrees,this.slugs=new AD((q)=>this.store.list().filter((W)=>W.repo===q&&W.kind!=="main").map((W)=>{return W.worktreePath.match(/([^/\\]+)[/\\]*$/)?.[1]??""}).filter((W)=>W.length>0));let[X,J]=O7(this.store.list());this.tasksAcc=X,this.setTasks=(q)=>J(()=>q);let[Q,Y]=O7(null);this.activeTaskAcc=Q,this.setActiveTaskSig=(q)=>Y(()=>q),this.unsubscribeStore=this.store.subscribe((q)=>{this.setTasks(q.slice())})}async init(){}activeTaskSignal(){return this.activeTaskAcc}async setActiveTask($){let X=$===null?null:String($);if(this.setActiveTaskSig(X),X&&this.store.get(X))await this.store.update(X,{})}tasksSignal(){return this.tasksAcc}subscribeTasks($){return this.store.subscribe($)}dispose(){this.unsubscribeStore()}listTasks(){return this.store.list()}getTask($){return this.store.get($)}async createTask($){if(!$.repo)throw Error("createTask: repo is required");let X=($.title??S9).trim()||S9,J=await this.store.create({repo:$.repo,title:X,branch:$.branch??"",worktreePath:"",status:"backlog",kind:"task",vendor:$.vendor??I5,...$.modelEffort?{modelEffort:$.modelEffort}:{}});if($.baseRef)this.pendingBaseRefs.set(J.id,$.baseRef);return J}async ensureMainTask($){let{repo:X,key:J}=QU($),Q=this.store.list().find((W)=>W.kind==="main"&&QU(W.repo).key===J);if(Q)return Q;let Y=this.mainTaskLocks.get(J);if(Y)return Y;let q=(async()=>{let W=t7(X);return await this.store.create({repo:X,title:gs(X),branch:"",worktreePath:sg(X),status:"backlog",kind:"main",vendor:W})})();this.mainTaskLocks.set(J,q);try{return await q}finally{this.mainTaskLocks.delete(J)}}async ensureWorktree($){let X=this.requireTask($);if(X.kind==="main")return sg(X.repo);if(X.worktreePath)return X.worktreePath;let J=this.worktreeLocks.get(X.id);if(J)return J;let Q=this.createWorktree(X);this.worktreeLocks.set(X.id,Q);try{return await Q}finally{this.worktreeLocks.delete(X.id)}}async createWorktree($){let X=await this.slugs.allocate($.repo),J=$.branch||rL($.title,$.id),Q=this.pendingBaseRefs.get($.id),Y;try{Y=await this.worktrees.createForTask({repo:$.repo,slug:X,branch:J,baseRef:Q})}catch(q){throw this.slugs.cancel($.repo,X),q}try{await this.store.update($.id,{worktreePath:Y.path,branch:J})}catch(q){throw await this.rollbackWorktree(Y.path),this.slugs.cancel($.repo,X),q}return this.slugs.commit($.repo,X),this.pendingBaseRefs.delete($.id),Y.path}async rollbackWorktree($){try{await this.worktrees.remove($,{force:!0})}catch(X){console.error(`[kobe] ensureWorktree rollback failed for ${$}:`,X)}}async setTitle($,X){let J=X.trim();if(!J)throw Error("setTitle: title is required (empty or whitespace-only rejected)");let Q=this.requireTask($);if(Q.title===J)return;await this.store.update(Q.id,{title:J}),await this.followBranchToTitle(Q,J)}async followBranchToTitle($,X){if($.kind==="main"||!$.worktreePath)return;if($.branch!==rL(S9,$.id))return;let J=rL(X,$.id);if(J===$.branch)return;try{await this.setBranch($.id,J)}catch(Q){console.error(`[kobe] follow-branch-to-title failed for ${$.id}:`,Q)}}async setBranch($,X){let J=X.trim();if(!J)throw Error("setBranch: branch is required (empty or whitespace-only rejected)");let Q=this.requireTask($);if(Q.kind==="main")throw Error("setBranch: a main task tracks the repo's own branch; rename it with git directly");if(Q.branch===J)return;if(Q.worktreePath)await this.worktrees.renameBranch(Q.worktreePath,Q.branch,J);await this.store.update(Q.id,{branch:J})}async setVendor($,X){let J=this.requireTask($);if(J.vendor===X)return;await this.store.update(J.id,{vendor:X})}async setPinned($,X){let J=this.requireTask($);if(J.kind==="main")return;let Q=X??!J.pinned;if((J.pinned??!1)===Q)return;await this.store.update(J.id,{pinned:Q})}async moveTask($,X){let J=this.requireTask($);if(J.kind==="main")return;let Q=this.store.list().filter((Y)=>(Y.kind??"task")!=="main"&&Y.archived===J.archived&&(Y.pinned??!1)===(J.pinned??!1)).map((Y)=>String(Y.id));await this.store.move(J.id,X,Q)}async setArchived($,X){let J=this.requireTask($);if(J.kind==="main")return;let Q=X??!J.archived;if(J.archived===Q)return;await this.store.update(J.id,{archived:Q})}async reorderTasks($){if($.length===0)return;for(let X of $){if(this.requireTask(X.taskId).kind==="main")throw Error(`cannot reorder a main task: ${X.taskId}`);if(!Number.isFinite(X.position))throw Error(`position must be a finite number: ${X.taskId}`)}await this.store.reorder($.map((X)=>({id:X.taskId,position:X.position})))}async setStatus($,X){let J=this.requireTask($);if(J.status===X)return;if(J.status==="done"&&X==="error"||J.status==="error"&&X==="done")throw new HD(J.status,X,J.id);await this.store.update(J.id,{status:X})}async setPRStatus($,X){let J=this.requireTask($);if(QN(J.prStatus,X??void 0))return;await this.store.update(J.id,{prStatus:X??void 0})}async deleteTask($,X){let J=this.store.get($);if(!J)return;if(J.kind==="main")throw new BD;let Q=X?.force===!0;if(J.worktreePath){if(!Q){let Y=!1;try{Y=await this.worktrees.isDirty(J.worktreePath)}catch{}if(Y)throw new KD(J.id)}try{await this.worktrees.remove(J.worktreePath,{force:Q})}catch(Y){throw new MD(J.id,Y)}}await this.store.remove(J.id),this.pendingBaseRefs.delete(J.id),this.worktreeLocks.delete(J.id)}async forgetProject($){if(!$)throw Error("forgetProject: repo is required");let X=QU($).key;for(let J of u7())if(QU(J).key===X)dC(J);for(let J of this.store.list()){if(J.kind!=="main")continue;if(QU(J.repo).key!==X)continue;await this.store.remove(J.id),this.pendingBaseRefs.delete(J.id),this.worktreeLocks.delete(J.id)}}async discoverAdoptableWorktrees($){if(!$)throw Error("discoverAdoptableWorktrees: repo is required");let X=await this.worktrees.listAll($),J=new Set(this.store.list().filter((Q)=>Q.worktreePath).map((Q)=>fq(Q.worktreePath)));return X.filter((Q)=>!J.has(fq(Q.path)))}async adoptWorktree($){if(!$.repo)throw Error("adoptWorktree: repo is required");if(!$.worktreePath)throw Error("adoptWorktree: worktreePath is required");let X=fq($.worktreePath),J=this.adoptLocks.get(X);if(J)return J;let Q=this.adoptWorktreeLocked($,X);this.adoptLocks.set(X,Q);try{return await Q}finally{this.adoptLocks.delete(X)}}async adoptWorktreeLocked($,X){let J=this.store.list().find((H)=>H.worktreePath&&fq(H.worktreePath)===X);if(J){if($.ifExists==="return")return J;throw Error(`adoptWorktree: ${$.worktreePath} is already adopted as a task`)}let Y=(await this.worktrees.listAll($.repo)).find((H)=>fq(H.path)===X);if(!Y)throw Error(`adoptWorktree: ${$.worktreePath} is not an adoptable git worktree of ${$.repo} (unknown, detached, or the main checkout)`);let q=$.branch?.trim()||Y.branch,W=($.title??Ss(Y.path)).trim()||S9;return this.store.create({repo:$.repo,title:W,branch:q,worktreePath:Y.path,status:"backlog",kind:"task",vendor:$.vendor??I5})}pendingBaseRefs=new Map;adoptLocks=new Map;requireTask($){let X=this.store.get($);if(!X)throw new WD(String($));return X}}function gs($){let X=$.split(/[/\\]/).filter(Boolean);return X.length>0?X[X.length-1]??$:$}function QU($){let X=kX($);return{repo:X,key:X7(X)?X:fq(X)}}function fq($){try{return Ps($)}catch{return Ts($)}}var S9="(new task)";var YU=Z1(()=>{Aq();qD();q5();w3();N8();FD();rg()});async function Es($,X=JE){let{code:J,stdout:Q}=await X.capture(["list-windows","-t",`=${$}`,"-F",`#{window_index} #{automatic-rename} #{${_9}}`]);if(J!==0)return null;let Y=[];for(let q of Q.split(`
38
38
  `)){let[W,H,K]=q.split("\t"),F=Number.parseInt((W??"").trim(),10);if(!Number.isInteger(F))continue;Y.push({index:F,sessionId:K?.trim()??"",autoRename:H?.trim()??""})}return Y}async function ks($,X,J){let{code:Q,stdout:Y}=await J.capture(["show-window-options","-t",`=${$}:${X}`,"automatic-rename"]);return Q===0&&/\boff\b/.test(Y)}async function ws($){let{code:X,stdout:J}=await $.capture(["show-window-options","-g","automatic-rename"]);return X===0&&/\boff\b/.test(J)}async function bs($,X,J,Q){return await Q.run(["rename-window","-t",`=${$}:${X}`,"--",J])===0}function XE($,X,J,Q=Math.random){if($)return{nextAllowedAt:J+Dq(eg,DD,Q),misses:0};let Y=X+1;if(Y<$E)return{nextAllowedAt:J+Dq(eg,DD,Q),misses:Y};let q=ZN(ys,Y-$E,vs);return{nextAllowedAt:J+Dq(q,DD,Q),misses:Y}}async function ZE($,X=xs,J,Q=Date.now(),Y=Math.random){let q=0,W=null,H=async(F,C)=>{if(C.autoRename==="1")return!1;if(C.autoRename==="0"){if(W===null)W=await ws(X.runner);if(!W)return!0}return ks(F,C.index,X.runner)},K=new Set;for(let F of $.listTasks()){if(F.archived||F.kind==="main"||!F.worktreePath)continue;K.add(F.id);let C=J?.get(F.id);if(C&&Q<C.nextAllowedAt)continue;let V=F5(F.id),N=await Es(V,X.runner);if(N===null){J?.set(F.id,XE(!1,C?.misses??0,Q,Y));continue}if(J?.set(F.id,XE(!0,C?.misses??0,Q,Y)),N.length===0)continue;let f=N.reduce((_,A)=>Math.min(_,A.index),Number.POSITIVE_INFINITY),P=F.vendor??I5;for(let _ of N)try{if(await H(V,_))continue;let A=_.sessionId?await X.titleFromSessionId(P,_.sessionId):_.index===f?await X.titleFromWorktree(F.worktreePath,P):"";if(A&&await bs(V,_.index,A,X.runner))q++}catch{}}if(J){for(let F of J.keys())if(!K.has(F))J.delete(F)}return q}var JE,xs,eg=4000,ys=4000,vs=30000,$E=3,DD=0.2;var zE=Z1(()=>{NQ();XU();B5();N8();JE={capture:o0,run:Q2};xs={runner:JE,titleFromSessionId:sL,titleFromWorktree:Vq}});function YE($){if($ instanceof Error)return $;let X;try{X=typeof $==="string"?$:JSON.stringify($)}catch{X=String($)}return Error(X)}function QE($,X,J=new Date){let Q=YE(X);return`[${J.toISOString()}] daemon ${$}: ${Q.stack??`${Q.name}: ${Q.message}`}
39
39
  `}function us($,X,J=new Date){let Q=YE(X);return`[${J.toISOString()}] daemon error [${$}]: ${Q.stack??`${Q.name}: ${Q.message}`}
40
40
  `}function L5($,X){process.stderr.write(us($,X))}function hs($,X,J=new Date){return`[${J.toISOString()}] daemon [${$}]: ${X}
@@ -54,7 +54,7 @@ data: ${JSON.stringify(V)}
54
54
  `))}catch{}}),Q=setInterval(()=>{try{K.enqueue(W.encode(`: ping
55
55
 
56
56
  `))}catch{q()}},15000),X?.aborted)q();else X?.addEventListener("abort",q,{once:!0})},cancel(){q()}});return new Response(H,{headers:{"content-type":"text/event-stream","cache-control":"no-cache, no-transform",connection:"keep-alive"}})}async function X01($,X,J){try{let{name:Q,payload:Y}=await $.json();if(!Q)return Response.json({error:"missing rpc name"},{status:400});if(!nk.has(Q))return Response.json({error:`rpc ${Q} is not exposed to the web UI`},{status:403});let q=await X.request(Q,Y),W=Y?.taskId;if(typeof W==="string"){let H=Q==="task.archive"&&Y.archived!==!1;if(Q==="task.delete"||H)J(W)}return Response.json({result:q})}catch(Q){let Y=Q instanceof Error&&Q.name!=="Error"?Q.name:void 0;return Response.json({error:Q instanceof Error?Q.message:String(Q),...Y?{name:Y}:{}},{status:500})}}async function J01(){try{let X=(await g3()).map((J)=>({id:J,label:D9(J),effortLevels:f5(J).effortLevels}));return Response.json({engines:X.length>0?X:[{id:"claude",label:"Claude"}]})}catch($){return Response.json({error:$ instanceof Error?$.message:String($)},{status:500})}}function Z01(){return Response.json({api:WQ()})}function z01(){return Response.json({projects:u7()})}async function Q01($,X){try{let{taskId:J}=await $.json();if(!J)return Response.json({error:"missing taskId"},{status:400});return Response.json(await sk(X,J))}catch(J){return Response.json({error:J instanceof Error?J.message:String(J)},{status:500})}}async function Uw($,X,J){try{let Q=$.searchParams.get("taskId");if(!Q)return Response.json({error:"missing taskId"},{status:400});return Response.json(await J(X,Q))}catch(Q){return Response.json({error:Q instanceof Error?Q.message:String(Q)},{status:500})}}function Nw(){return Response.json({review:d4(TN.review)??null,pr:d4(TN.pr)??null})}async function Y01($){try{let X=await $.json();if(typeof X.review==="string")L$(TN.review,X.review);if(typeof X.pr==="string")L$(TN.pr,X.pr);return Nw()}catch(X){return Response.json({error:X instanceof Error?X.message:String(X)},{status:400})}}async function G01($,X){let Q=Mw(Bw(X,$==="/"?"/index.html":$));if(!Q.startsWith(X))return new Response("forbidden",{status:403});let Y=Bun.file(e11(Q)?Q:Bw(X,"index.html"));if(!await Y.exists())return new Response("kobe web assets not built \u2014 run `bun --filter kobe-web build`",{status:503});return new Response(Y)}function q01($){let{link:X,sseSends:J,staticDir:Q}=$,Y=$.tearDownSession??((q)=>void $w(q));return async function(W){let H=new URL(W.url);if(H.pathname===Lw)return new Response(Fw);if(!lk(W.headers.get("origin"),{allowedHost:$.allowedHost}))return new Response("forbidden: cross-origin request rejected",{status:403});if(H.pathname==="/events")return $01((_)=>{let A=$.onSseOpen?.()??(()=>{});return _("snapshot",X.snapshot()),J.add(_),()=>{J.delete(_),A()}},W.signal);if(H.pathname==="/api/rpc"&&W.method==="POST")return X01(W,X,Y);if(H.pathname==="/api/session"&&W.method==="POST")return Q01(W,X);if(H.pathname==="/api/engine-spec"&&W.method==="GET")return Uw(H,X,tk);if(H.pathname==="/api/terminal-spec"&&W.method==="GET")return Uw(H,X,ek);if(H.pathname==="/api/engines"&&W.method==="GET")return J01();if(H.pathname==="/api/cli-invocation"&&W.method==="GET")return Z01();if(H.pathname==="/api/projects"&&W.method==="GET")return z01();if(H.pathname==="/api/settings"&&W.method==="GET")return q_();if(H.pathname==="/api/settings"&&W.method==="PATCH")return Yw(W);if(H.pathname==="/api/quick-prompts"&&W.method==="GET")return Nw();if(H.pathname==="/api/quick-prompts"&&W.method==="PUT")return Y01(W);let K=await gk(W,H);if(K)return K;let F=await Ck(W,H);if(F)return F;let C=await fk(W,H);if(C)return C;let V=await hk(W,H,X);if(V)return V;let N=await xk(W,H);if(N)return N;let f=await Hw(W,H);if(f)return f;let P=kk(W,H);if(P)return P;if(Q)return G01(H.pathname,Q);return new Response("not found",{status:404})}}function _Q($,X){let J=$.snapshot().find((Q)=>Q.channel===X);return J?J.payload:null}function H_($){return $.length>1?$.replace(/\/+$/,""):$}function H01($,X){let J=H_(X),Q=new Set([X]);for(let Y of $){let q=H_(Y.repo),W=H_(Y.worktreePath);if(q===J||W===J){if(Y.repo)Q.add(Y.repo);if(Y.worktreePath)Q.add(Y.worktreePath)}}return[...Q]}function Ow($){let X=UU();return{async request(J,Q){return await BU(X,J,Q,$.ctx(0))},snapshot(){let J=$.orch.listTasks().map(e$),Q={},Y=_Q($.bus,"issue.snapshot");if(Y)for(let H of H01(J,Y.repoRoot))Q[H]={...Y,repoRoot:H};let q=_Q($.bus,"task.jobs"),W=q?.phase==="running"?{[q.taskId]:q}:{};return{tasks:J,activeTaskId:_Q($.bus,"active-task")?.taskId??null,engineStates:$.activity.snapshotByTask(),update:_Q($.bus,"update")?.info??null,jobs:W,worktreeChanges:_Q($.bus,"worktree.changes")?.changes??{},issueSnapshots:Q,deliver:_Q($.bus,"session.deliver"),uiPrefs:_Q($.bus,"ui-prefs"),connected:!0}}}}async function Kw($){try{let X=Bun.spawn(["lsof","-nP",`-iTCP:${$}`,"-sTCP:LISTEN","-t"],{stdout:"pipe",stderr:"ignore"});return(await new Response(X.stdout).text()).split(`
57
- `).map((Q)=>Number.parseInt(Q.trim(),10)).filter((Q)=>Number.isFinite(Q)&&Q!==process.pid)}catch{return[]}}async function W01($,X=Lw){let J;try{J=(await(await fetch(`http://localhost:${$}${X}`,{signal:AbortSignal.timeout(800)})).text()).trim()}catch{return}if(J!==Fw)throw Error(`port ${$} is in use by a non-kobe service; refusing to replace it`);let Q=await Kw($);for(let q of Q)try{process.kill(q,"SIGTERM")}catch{}let Y=Date.now()+2000;while(Date.now()<Y){if((await Kw($)).length===0)return;await new Promise((q)=>setTimeout(q,100))}}async function jw($){if($.takeover!==!1)await W01($.port);let X=new Set,J=$.onEvent((H)=>{for(let K of X)K("channel",H)}),Q=$.hostname?.trim()||process.env.KOBE_WEB_HOST?.trim()||"127.0.0.1",Y=dk(Q),q=q01({link:$.link,sseSends:X,staticDir:$.staticDir?Mw($.staticDir):void 0,allowedHost:Y,onSseOpen:$.onSseOpen}),W=Bun.serve({port:$.port,hostname:Q,idleTimeout:0,fetch:q});return{port:W.port??$.port,hostname:Q,close(){J(),W.stop(!0)}}}var Fw="kobe-web",Lw="/__kobe_web",TN;var Vw=Z1(()=>{FZ();L8();c8();q5();Ak();Ik();Ek();wk();WN();x6();yk();pk();ik();Xw();Gw();Ww();TN={review:"boardPrompt.review",pr:"boardPrompt.pr"}});var Cw={};V2(Cw,{sameWorktreeChanges:()=>fQ,readWorktreeChanges:()=>U01,pickPushedChanges:()=>W_,parsePorcelain:()=>kq});import{spawnSync as B01}from"child_process";function fQ($,X){return $.added===X.added&&$.deleted===X.deleted}function W_($,X){if(!$)return null;return $.get(X)??gN}function U01($){if(!$)return gN;try{let X=B01("git",["status","--porcelain=v1"],{cwd:$,encoding:"utf8",stdio:["ignore","pipe","pipe"],env:J3()});if(X.status!==0||!X.stdout)return gN;return kq(X.stdout)}catch{return gN}}function kq($){let X=0,J=0;for(let{x:Q,y:Y}of CN($))if(Q==="D"||Y==="D")J+=1;else X+=1;return{added:X,deleted:J}}var gN;var wq=Z1(()=>{SZ();AN();gN={added:0,deleted:0}});async function L01($,X){let J=await uX("git",["status","--porcelain=v1"],{cwd:$,env:J3(),signal:X});if(J.status!==0)throw Error("git status failed");return kq(J.stdout)}function N01($){let X=new Set;for(let J of $){if(J.archived)continue;if(!J.worktreePath)continue;if(X7(J.repo)||X7(J.worktreePath))continue;X.add(J.worktreePath)}return X}class Aw{orch;bus;options;entries=new Map;stopped=!1;constructor($,X,J={}){this.orch=$;this.bus=X;this.options=J}tick(){if(this.stopped)return;if(this.options.hasSubscribers&&!this.options.hasSubscribers())return;try{let $=N01(this.orch.listTasks()),X=!1;for(let J of this.entries.keys()){if($.has(J))continue;if(this.entries.get(J)?.value)X=!0;this.entries.delete(J)}if(X)this.publish();for(let J of $)this.maybeCollect(J)}catch($){L5("worktree-changes",$)}}stop(){this.stopped=!0}maybeCollect($){let X=this.entries.get($);if(!X)X={inFlight:!1,nextAllowedAt:0},this.entries.set($,X);let J=this.options.cadence??{timeoutMs:K01,slowRetryMs:M01,minIntervalMs:F01},Q=this.options.run??L01;_q(X,J,(Y)=>Q($,Y),(Y)=>{if(this.stopped)return;if(this.entries.get($)!==X)return;if(X.value&&fQ(X.value,Y))return;X.value=Y,this.publish()})}publish(){let $={};for(let[X,J]of this.entries)if(J.value)$[X]=J.value;this.bus.publish("worktree.changes",{changes:$})}}function Dw($,X,J=B_,Q){if(J<=0)return()=>{};let Y=new Aw($,X,{hasSubscribers:Q});Y.tick();let q=setInterval(()=>Y.tick(),J);return q.unref?.(),()=>{clearInterval(q),Y.stop()}}var B_=2000,K01=4000,M01=60000,F01=1500;var _w=Z1(()=>{SZ();NQ();q5();wq()});import{mkdir as fw,readFile as O01,unlink as U_,writeFile as j01}from"fs/promises";import{createServer as V01}from"net";import{dirname as Iw}from"path";import{StringDecoder as C01}from"string_decoder";function D01(){let $=process.env.KOBE_DAEMON_IDLE_GRACE_MS;if($===void 0)return Rw;let X=Number($);return Number.isFinite(X)&&X>=0?X:Rw}async function Sw($,X={}){let J=X.socketPath??I9(X.homeDir),Q=X.pidPath??yX(X.homeDir),Y=X.startedAt??new Date,q=new Set,W=new Set,H=1,K=new eD({clients:function*(){yield*q,yield*W},idleGraceMs:D01(),onIdleStop:()=>void e().catch((w)=>L5("daemon-idle-shutdown",w))}),F=new RD;F.onPublish((w)=>{Pw(q,{type:"event",name:w.channel,payload:w.payload})});let V=new tA(F,void 0,void 0,async(w)=>{let x=$.getTask(w);if(!x?.worktreePath)return;return AZ(x.vendor??I5,x.worktreePath)}),N=new KN(UN(X.homeDir));await fw(Iw(J),{recursive:!0}),await fw(Iw(Q),{recursive:!0}),await U_(J).catch(()=>{});let f=V01((w)=>{let x={id:H++,connectedAt:new Date,socket:w,writer:new GU(w),buffer:"",subscribed:!1,holdsLifetime:!1,channels:null};q.add(x);let d=new C01("utf8");w.on("data",(a)=>{x.buffer+=d.write(a),t(x)}),w.on("error",()=>{}),w.on("close",()=>{if(q.delete(x),x.subscribed)T9("conn",`client #${x.id} (${x.holdsLifetime?"gui":"pane"}) disconnected \u2014 ${q.size} client(s), ${K.guiCount()} gui left`);K.clientDisconnected(x.holdsLifetime)})}),P=$.subscribeTasks((w)=>{F.publish("task.snapshot",{tasks:w.map(e$)}),Ug(w.filter((x)=>!x.archived).map((x)=>x.id))}),_=X.checkUpdate??dB,A=X.updatePollMs??A01,c=()=>{_().then((w)=>F.publish("update",{info:w})).catch((w)=>L5("update-poller",w))},I=null;if(A>0)c(),I=setInterval(c,A),I.unref?.();let R=X.autoTitlePollMs??ID,T=GE($,R,()=>K.hasSubscribers()),b=Bk(F,{statePath:J_(X.homeDir),debounceMs:X.uiPrefsDebounceMs??X_}),u=Jk(F,{path:tD(X.homeDir),debounceMs:X.keybindingsDebounceMs??sD}),p=Dw($,F,X.worktreeChangesTickMs??B_,()=>K.hasSubscribers()),o=qk($,F,X.transcriptActivityTickMs??$_,()=>K.hasSubscribers()),q1=Qk($,X.prStatusPollMs??FU,()=>K.hasSubscribers()),l=null,Q1={socketPath:J,pidPath:Q,startedAt:Y,get webPort(){return l?.port},clients:q,async close(){if(K.markStopping(),P(),l?.close(),l=null,I)clearInterval(I);T(),q1(),b(),u(),p(),o(),V.close(),Pw(q,{type:"event",name:"daemon.stopping",payload:{}});for(let w of Array.from(q))w.socket.destroy();await new Promise((w)=>f.close(()=>w())),await U_(J).catch(()=>{}),await U_(Q).catch(()=>{})}};await new Promise((w,x)=>{let d=f;d.once("error",x),f.listen(J,()=>{d.removeListener("error",x),w()})}),await j01(Q,`${process.pid}
57
+ `).map((Q)=>Number.parseInt(Q.trim(),10)).filter((Q)=>Number.isFinite(Q)&&Q!==process.pid)}catch{return[]}}async function W01($,X=Lw){let J;try{J=(await(await fetch(`http://localhost:${$}${X}`,{signal:AbortSignal.timeout(800)})).text()).trim()}catch{return}if(J!==Fw)throw Error(`port ${$} is in use by a non-kobe service; refusing to replace it`);let Q=await Kw($);for(let q of Q)try{process.kill(q,"SIGTERM")}catch{}let Y=Date.now()+2000;while(Date.now()<Y){if((await Kw($)).length===0)return;await new Promise((q)=>setTimeout(q,100))}}async function jw($){if($.takeover!==!1)await W01($.port);let X=new Set,J=$.onEvent((H)=>{for(let K of X)K("channel",H)}),Q=$.hostname?.trim()||process.env.KOBE_WEB_HOST?.trim()||"127.0.0.1",Y=dk(Q),q=q01({link:$.link,sseSends:X,staticDir:$.staticDir?Mw($.staticDir):void 0,allowedHost:Y,onSseOpen:$.onSseOpen}),W=Bun.serve({port:$.port,hostname:Q,idleTimeout:0,fetch:q});return{port:W.port??$.port,hostname:Q,close(){J(),W.stop(!0)}}}var Fw="kobe-web",Lw="/__kobe_web",TN;var Vw=Z1(()=>{FZ();L8();c8();q5();Ak();Ik();Ek();wk();WN();x6();yk();pk();ik();Xw();Gw();Ww();TN={review:"boardPrompt.review",pr:"boardPrompt.pr"}});var Cw={};V2(Cw,{sameWorktreeChanges:()=>fQ,readWorktreeChanges:()=>U01,pickPushedChanges:()=>W_,parsePorcelain:()=>kq});import{spawnSync as B01}from"child_process";function fQ($,X){return $.added===X.added&&$.deleted===X.deleted}function W_($,X){if(!$)return null;return $.get(X)??gN}function U01($){if(!$)return gN;try{let X=B01("git",["status","--porcelain=v1"],{cwd:$,encoding:"utf8",stdio:["ignore","pipe","pipe"],env:J3()});if(X.status!==0||!X.stdout)return gN;return kq(X.stdout)}catch{return gN}}function kq($){let X=0,J=0;for(let{x:Q,y:Y}of CN($))if(Q==="D"||Y==="D")J+=1;else X+=1;return{added:X,deleted:J}}var gN;var wq=Z1(()=>{SZ();AN();gN={added:0,deleted:0}});async function L01($,X){let J=await uX("git",["status","--porcelain=v1"],{cwd:$,env:J3(),signal:X});if(J.status!==0)throw Error("git status failed");return kq(J.stdout)}function N01($){let X=new Set;for(let J of $){if(J.archived)continue;if(!J.worktreePath)continue;if(X7(J.repo)||X7(J.worktreePath))continue;X.add(J.worktreePath)}return X}class Aw{orch;bus;options;entries=new Map;stopped=!1;constructor($,X,J={}){this.orch=$;this.bus=X;this.options=J}tick(){if(this.stopped)return;if(this.options.hasSubscribers&&!this.options.hasSubscribers())return;try{let $=N01(this.orch.listTasks()),X=!1;for(let J of this.entries.keys()){if($.has(J))continue;if(this.entries.get(J)?.value)X=!0;this.entries.delete(J)}if(X)this.publish();for(let J of $)this.maybeCollect(J)}catch($){L5("worktree-changes",$)}}stop(){this.stopped=!0}maybeCollect($){let X=this.entries.get($);if(!X)X={inFlight:!1,nextAllowedAt:0},this.entries.set($,X);let J=this.options.cadence??{timeoutMs:K01,slowRetryMs:M01,minIntervalMs:F01},Q=this.options.run??L01;_q(X,J,(Y)=>Q($,Y),(Y)=>{if(this.stopped)return;if(this.entries.get($)!==X)return;if(X.value&&fQ(X.value,Y))return;X.value=Y,this.publish()})}publish(){let $={};for(let[X,J]of this.entries)if(J.value)$[X]=J.value;this.bus.publish("worktree.changes",{changes:$})}}function Dw($,X,J=B_,Q){if(J<=0)return()=>{};let Y=new Aw($,X,{hasSubscribers:Q});Y.tick();let q=setInterval(()=>Y.tick(),J);return q.unref?.(),()=>{clearInterval(q),Y.stop()}}var B_=2000,K01=4000,M01=60000,F01=1500;var _w=Z1(()=>{SZ();NQ();q5();wq()});import{mkdir as fw,readFile as O01,unlink as U_,writeFile as j01}from"fs/promises";import{createServer as V01}from"net";import{dirname as Iw}from"path";import{StringDecoder as C01}from"string_decoder";function D01(){let $=process.env.KOBE_DAEMON_IDLE_GRACE_MS;if($===void 0)return Rw;let X=Number($);return Number.isFinite(X)&&X>=0?X:Rw}async function Sw($,X={}){let J=X.socketPath??I9(X.homeDir),Q=X.pidPath??yX(X.homeDir),Y=X.startedAt??new Date,q=new Set,W=new Set,H=1,K=new eD({clients:function*(){yield*q,yield*W},idleGraceMs:D01(),onIdleStop:()=>void e().catch((w)=>L5("daemon-idle-shutdown",w))}),F=new RD;F.onPublish((w)=>{Pw(q,{type:"event",name:w.channel,payload:w.payload})});let V=new tA(F,void 0,void 0,async(w)=>{let x=$.getTask(w);if(!x?.worktreePath)return;return AZ(x.vendor??I5,x.worktreePath)}),N=new KN(UN(X.homeDir));await fw(Iw(J),{recursive:!0}),await fw(Iw(Q),{recursive:!0}),await U_(J).catch(()=>{});let f=V01((w)=>{let x={id:H++,connectedAt:new Date,socket:w,writer:new GU(w),buffer:"",subscribed:!1,holdsLifetime:!1,channels:null};q.add(x);let d=new C01("utf8");w.on("data",(a)=>{x.buffer+=d.write(a),t(x)}),w.on("error",()=>{}),w.on("close",()=>{if(q.delete(x),x.subscribed)T9("conn",`client #${x.id} (${x.holdsLifetime?"gui":"pane"}) disconnected \u2014 ${q.size} client(s), ${K.guiCount()} gui left`);K.clientDisconnected(x.holdsLifetime)})}),P=$.subscribeTasks((w)=>{F.publish("task.snapshot",{tasks:w.map(e$)}),Ug(w.filter((x)=>!x.archived).map((x)=>x.id),X.homeDir)}),_=X.checkUpdate??dB,A=X.updatePollMs??A01,c=()=>{_().then((w)=>F.publish("update",{info:w})).catch((w)=>L5("update-poller",w))},I=null;if(A>0)c(),I=setInterval(c,A),I.unref?.();let R=X.autoTitlePollMs??ID,T=GE($,R,()=>K.hasSubscribers()),b=Bk(F,{statePath:J_(X.homeDir),debounceMs:X.uiPrefsDebounceMs??X_}),u=Jk(F,{path:tD(X.homeDir),debounceMs:X.keybindingsDebounceMs??sD}),p=Dw($,F,X.worktreeChangesTickMs??B_,()=>K.hasSubscribers()),o=qk($,F,X.transcriptActivityTickMs??$_,()=>K.hasSubscribers()),q1=Qk($,X.prStatusPollMs??FU,()=>K.hasSubscribers()),l=null,Q1={socketPath:J,pidPath:Q,startedAt:Y,get webPort(){return l?.port},clients:q,async close(){if(K.markStopping(),P(),l?.close(),l=null,I)clearInterval(I);T(),q1(),b(),u(),p(),o(),V.close(),Pw(q,{type:"event",name:"daemon.stopping",payload:{}});for(let w of Array.from(q))w.socket.destroy();await new Promise((w)=>f.close(()=>w())),await U_(J).catch(()=>{}),await U_(Q).catch(()=>{})}};await new Promise((w,x)=>{let d=f;d.once("error",x),f.listen(J,()=>{d.removeListener("error",x),w()})}),await j01(Q,`${process.pid}
58
58
  `,"utf8");async function e(){if(K.isStopping())return;K.markStopping(),await X.onStop?.(),setTimeout(()=>{Q1.close().catch((w)=>L5("daemon-shutdown",w))},0).unref()}let M1=UU();function A1(w){return{orch:$,bus:F,activity:V,issues:N,daemon:{startedAt:Y,socketPath:J,webPort:l?.port,pid:process.pid,guiCount:()=>K.guiCount(),stopSoon:e},clientId:w}}if(X.webPort!==void 0){let w=Ow({orch:$,bus:F,activity:V,ctx:A1});l=await jw({port:X.webPort,hostname:X.webHost,staticDir:X.webStaticDir,link:w,onEvent:(x)=>F.onPublish(x),onSseOpen:()=>{let x={subscribed:!0,holdsLifetime:!0};return W.add(x),K.guiAttached(),T9("conn",`web client subscribed \u2014 ${q.size+W.size} client(s), ${K.guiCount()} gui`),()=>{W.delete(x),T9("conn",`web client disconnected \u2014 ${q.size+W.size} client(s), ${K.guiCount()} gui left`),K.clientDisconnected(!0)}}}),T9("web",`daemon web transport listening on http://${l.hostname}:${l.port}`)}async function L1(w,x){if(w.name==="subscribe"){let d=y3(w.payload),a=x.subscribed;x.subscribed=!0;let F1=d.role==="gui"?"gui":"pane";x.holdsLifetime=F1==="gui",x.channels=$g(d.channels);let Y1=!a;if(x.holdsLifetime)K.guiAttached();T9("conn",`client #${x.id} subscribed as ${F1}${x.channels?` [${[...x.channels].join(",")}]`:""} \u2014 ${q.size} client(s), ${K.guiCount()} gui${Y1?" (collectors resume)":""}`);for(let n of F.snapshot()){if(x.channels&&!x.channels.has(n.channel))continue;jU(x,{type:"event",name:n.channel,payload:n.payload})}if(!x.channels||x.channels.has("engine-state"))for(let n of V.currentNonIdle())jU(x,{type:"event",name:"engine-state",payload:n});return{}}return BU(M1,w.name,w.payload,A1(x.id))}async function B1(w,x){try{let d=await L1(w,x);jU(x,{type:"response",id:w.id,name:w.name,payload:d})}catch(d){jU(x,{type:"response",id:w.id,name:w.name,error:ED(d)})}}function t(w){let x=w.buffer.indexOf(`
59
59
  `);while(x!==-1){let d=w.buffer.slice(0,x);if(w.buffer=w.buffer.slice(x+1),d.trim().length>0)try{let a=JSON.parse(d);if(a.type!=="request")throw Error("daemon only accepts request frames from clients");B1(a,w)}catch(a){jU(w,{type:"response",id:"parse-error",error:{message:a instanceof Error?a.message:String(a)}})}x=w.buffer.indexOf(`
60
60
  `)}}return Q1}async function bq($){try{let X=await O01($,"utf8"),J=Number(X.trim());return Number.isFinite(J)?J:null}catch{return null}}function Tw($){if($.type==="event")return $.name==="daemon.stopping";return!0}function jU($,X){$.writer.write(UQ(X),Tw(X))}function Pw($,X){let J=X.type==="event"&&X.name!=="daemon.stopping"?X.name:null,Q=Tw(X),Y=null;for(let q of $){if(!q.subscribed&&X.type==="event")continue;if(J&&q.channels&&!q.channels.has(J))continue;Y??=UQ(X),q.writer.write(Y,Q)}}var A01=21600000,Rw=3000;var EN=Z1(()=>{eB();N8();F8();sA();Fg();qE();WN();uD();Zk();zk();CZ();Yk();x6();Hk();Uk();Vw();_w();WN();uD()});import{unlink as gw}from"fs/promises";function _01($){try{return process.kill($,0),!0}catch(X){return X.code==="EPERM"}}async function vX($,X){let J=await bq(X),Q=J!==null&&J!==process.pid?J:null,Y=Q!==null&&_01(Q),q=Y?"graceful":"absent",W=new O8($),H=W.request("daemon.stop").catch(()=>{return}),K=new Promise((F)=>setTimeout(F,2000));if(await Promise.race([H,K]),W.close(),Y&&Q!==null){let F=Date.now()+5000,C=!1;while(Date.now()<F){try{process.kill(Q,0)}catch{break}if(!C&&Date.now()-(F-5000)>2000){try{process.kill(Q,"SIGTERM")}catch{}q="sigterm",C=!0}await new Promise((V)=>setTimeout(V,50))}try{process.kill(Q,0),process.kill(Q,"SIGKILL"),q="sigkill",await new Promise((V)=>setTimeout(V,100))}catch{}}return await gw($).catch(()=>{}),await gw(X).catch(()=>{}),{pid:J,method:q}}var $U=Z1(()=>{FQ();EN()});var kN={};V2(kN,{testDaemonResponds:()=>LQ,spawnDetachedDaemon:()=>nL,resolveKobeSpawn:()=>iL,ensureDaemonReachable:()=>xq,connectOrStartDaemon:()=>Z3,connectIfRunning:()=>D$});import{spawn as f01}from"child_process";import{closeSync as I01,existsSync as R01,mkdirSync as P01,openSync as S01}from"fs";import{dirname as Ew,resolve as K_}from"path";import{fileURLToPath as T01}from"url";function nL($,X,J,Q){let Y="ignore",q;try{P01(Ew(Q),{recursive:!0}),q=S01(Q,"a"),Y=["ignore",q,q]}catch{Y="ignore"}if(f01($,[...X],{detached:!0,stdio:Y,env:J}).unref(),q!==void 0)try{I01(q)}catch{}}async function xq(){let $=I9();if(await LQ($))return $;await vX($,yX()).catch(()=>{});let[X,...J]=iL(g01);nL(X,J,process.env,Oq());let Q=Date.now()+5000;while(Date.now()<Q){if(await LQ($))return $;await new Promise((Y)=>setTimeout(Y,100))}throw Error(`kobe: daemon did not start (or stayed wedged) at ${$}`)}async function Z3(){let $=await xq(),X=new O8($);return await X.connect(),X}async function D$(){let $=I9();if(!await LQ($))return null;let X=new O8($);return await X.connect(),X}async function LQ($,X=E01){let J=new O8($);try{await J.connect()}catch{return J.close(),!1}let Q=J.request("hello",{protocolVersion:C$}).then(()=>!0).catch(()=>!0),Y,q=new Promise((H)=>{Y=setTimeout(()=>H(!1),X)}),W=await Promise.race([Q,q]);if(Y)clearTimeout(Y);return J.close(),W}function iL($){let X=T01(import.meta.url);if(X.startsWith("/$bunfs")||X.startsWith("B:\\~BUN"))return[process.execPath,...$];let J=Ew(X),Q=[K_(J,"../cli/index.ts"),K_(J,"../../../kobe/src/cli/index.ts"),K_(J,"../cli/index.js")],Y=Q.find((q)=>R01(q));if(Y)return[process.execPath,Y,...$];throw Error(`kobe: could not locate kobe entry near ${J}; checked ${Q.join(", ")}`)}var g01,E01=3000;var h7=Z1(()=>{$U();CZ();x6();FQ();g01=["daemon","start"]});var kw={};V2(kw,{quickCreate:()=>L_,openWorktreesTab:()=>PU,openUpdateTab:()=>gU,openSettingsTab:()=>RU,openNewTaskTab:()=>TU,openHelpTab:()=>SU,newChatTab:()=>F_,kobeStatusRight:()=>fU,chatTabSwitchBindings:()=>CU,chatTabRenameBinding:()=>DU,chatTabCloseBinding:()=>AU,chatTabChooseEngineBindings:()=>_U,buildPanesAround:()=>bN,CHAT_TAB_STATUS_FORMAT:()=>yq,CHAT_TAB_STATUS_CURRENT_FORMAT:()=>IU,CHAT_TAB_STATE_OPTION:()=>wN,CHAT_TAB_ENGINE_PROMPT:()=>VU});function CU($,X){return[["bind-key","-n",$,"if-shell","-F","#{?#{@kobe_surface},0,1}","previous-window"],["bind-key","-n",X,"if-shell","-F","#{?#{@kobe_surface},0,1}","next-window"]]}function AU($,X="kill-window"){return["bind-key","-n",$,"if-shell","-F","#{>:#{session_windows},1}",X,"display-message 'Cannot close the only ChatTab'"]}function DU($){return["bind-key","-n",$,"command-prompt","-I","#{window_name}","rename-window -- '%%'"]}function _U($){return[["bind-key","-n",$,"command-prompt","-p",VU],["bind-key","T","command-prompt","-p",VU]]}function M_($){return $.startsWith("C-")&&$.length===3?`^${$.slice(2)}`:$}function fU($){return`${[$.focusLeft?`${M_($.focusLeft)} tasks`:null,$.detach?`${M_($.detach)} detach`:null,$.newTab?`${M_($.newTab)} tab`:null,$.layoutSplits?`prefix ${$.layoutSplits} splits`:null,$.layoutPanes?`prefix ${$.layoutPanes} panes`:null].filter((J)=>J!==null).join(" ")} `}async function bN($,X){let J=C4(),Q=await xN(),Y=V$(X.opsCommand??J+eG({cwd:X.cwd,taskId:X.taskId,claudePaneId:$,cliInvocation:X.inv,vendor:X.vendor})),{stdout:q}=await kU([["set-option","-p","-t",$,"@kobe_role","claude"],["set-window-option","-t",$,wN,"idle"],["split-window","-h","-b","-t",$,"-l",`${Q}`,"-c",U4(X.cwd),"-P","-F","tasks=#{pane_id}",V$(J+BZ(X.inv,{initialTaskId:X.taskId}))],["split-window","-h","-t",$,"-l",`${100-XA}%`,"-c",U4(X.cwd),"-P","-F","ops=#{pane_id}",Y],["split-window","-v","-l",`${100-cB}%`,"-c",U4(X.cwd),"-P","-F","shell=#{pane_id}"],["select-pane","-t",$]]),W=Object.fromEntries(q.split(`
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.76",
4
+ "version": "0.7.77",
5
5
  "description": "TUI orchestrator for Claude Code (codename)",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",