goatchain-cli 0.0.2-beta.10

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.
@@ -0,0 +1,76 @@
1
+ import{i as e,n as t,o as n,s as r,t as i}from"./args-B4NUWmzz.js";import{a,c as o,i as s,n as c,o as l,r as u,s as d,t as f}from"./ui-D4n45LUU.js";import"./openai-Ba5c3VJv.js";import{t as p}from"./theme-4Sto2Osm.js";import{B as m}from"./src-BD_MMztG.js";import{randomUUID as h}from"node:crypto";import{mkdtemp as g,open as _,readFile as v,readdir as y,rm as b,stat as ee,writeFile as x}from"node:fs/promises";import S from"node:path";import{Writable as te}from"node:stream";import ne from"node:fs";import{pathToFileURL as re}from"node:url";import C from"node:os";import ie from"node:readline";import{execFile as w}from"node:child_process";import{promisify as T}from"node:util";import{Buffer as ae}from"node:buffer";const oe=[{modelId:`deepseek-v3.1`,hint:`DeepSeek (OpenAI-compatible).`},{modelId:`glm-4.7`,hint:`GLM (OpenAI-compatible).`}];function se(e){let t=String(e??``).trim(),n=t.toLowerCase(),r=n.includes(`codex`);return{reasoning:/^o\d/i.test(t)||n.includes(`reasoner`)||n.includes(`reasoning`)||n.includes(`deepseek-r1`)||n.includes(`deepseek-reasoner`)||/^gpt-5/i.test(t),vision:n.includes(`vision`)||n.includes(`glm-4v`)||n.includes(`4v`)||n.includes(`4o`)||/^gpt-4\.1/i.test(t)||/^gpt-5/i.test(t),codex:r}}function E(e){return`[${e}]`}function ce(e){let t=se(e);return[t.codex?E(`codex`):``,t.reasoning?E(`reasoning`):``,t.vision?E(`vision`):``].filter(Boolean).join(` `)}function D(e){return String(e??``).toLowerCase()===`openai`?[...oe.map(e=>({modelId:e.modelId,label:e.label||e.modelId,hint:e.hint||``})),{modelId:``,label:`Custom…`,hint:`Enter a model id`}]:[{modelId:``,label:`Custom…`,hint:`Enter a model id`}]}function O(e){let t=String(e??``).trim().toLowerCase();return t===`minimal`||t===`low`||t===`medium`||t===`high`?t:null}function k(e){return e===`auto`?`Let the provider decide (recommended).`:e===`minimal`?`Lowest reasoning; fastest.`:e===`low`?`Less thinking; faster.`:e===`medium`?`Balanced.`:`More thinking; slower but stronger.`}function le(e){let t=e.env??process.env,n=e.uiPrefsAttachImages??{},r=t.GOATCHAIN_ATTACH_IMAGES_NOTE_TEMPLATE,i=t.GOATCHAIN_ATTACH_IMAGES_NOTE_POSITION,a=t.GOATCHAIN_ATTACH_IMAGES_IMAGES_POSITION,o=t.GOATCHAIN_ATTACH_IMAGES_DATA_URL_MODE,s=t.GOATCHAIN_ATTACH_IMAGES_MAX_DATA_URL_CHARS,c=(e,t)=>{let n=String(e??``).trim().toLowerCase();return[`start`,`before_images`,`after_images`,`before_text`,`after_text`,`end`].includes(n)?n:t},l=(e,t)=>{let n=String(e??``).trim().toLowerCase();return n===`none`||n===`prefix`||n===`full`?n:t},u=(()=>{let e=Number(s??n.maxDataUrlChars);return Number.isFinite(e)?Math.max(0,Math.trunc(e)):void 0})();return{note:{template:typeof r==`string`&&r.trim()?r:typeof n.noteTemplate==`string`?n.noteTemplate:void 0,dataUrlMode:l(o??n.dataUrlMode,`prefix`),maxDataUrlChars:u},notePosition:c(i??n.notePosition,`start`),imagesPosition:c(a??n.imagesPosition,`before_text`)}}const A=T(w);async function j(e,t=1024*1024){if(process.platform!==`darwin`)return null;try{let{stdout:n}=await A(`osascript`,e.flatMap(e=>[`-e`,e]),{encoding:`utf8`,maxBuffer:t});return String(n??``)}catch{return null}}function ue(e){let t=String(e??``).trim();if(!t)return[];let n=t.split(/\0|\r?\n/).map(e=>e.trim()).filter(Boolean),r=[];for(let e of n){if(e.startsWith(`file://`))try{let t=new URL(e);if(t.protocol!==`file:`)continue;let n=decodeURIComponent(t.pathname);n&&r.push(n);continue}catch{continue}e.startsWith(`/`)&&r.push(e)}return r}function M(e){return!Buffer.isBuffer(e)||e.length<12?null:e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?{mime:`image/png`,ext:`.png`}:e[0]===255&&e[1]===216&&e[2]===255?{mime:`image/jpeg`,ext:`.jpg`}:e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56?{mime:`image/gif`,ext:`.gif`}:e.subarray(0,4).toString(`ascii`)===`RIFF`&&e.subarray(8,12).toString(`ascii`)===`WEBP`?{mime:`image/webp`,ext:`.webp`}:e[0]===73&&e[1]===73&&e[2]===42&&e[3]===0||e[0]===77&&e[1]===77&&e[2]===0&&e[3]===42?{mime:`image/tiff`,ext:`.tiff`}:e[0]===66&&e[1]===77?{mime:`image/bmp`,ext:`.bmp`}:null}async function N(){if(process.platform!==`darwin`)return null;try{let{stdout:e}=await A(`pbpaste`,[],{encoding:`utf8`,maxBuffer:2*1024*1024});return String(e??``)}catch{return null}}async function de(){if(process.platform!==`darwin`)return null;let e=await j([`clipboard info`]);return String(e??``).trim()||null}async function P(e){if(process.platform!==`darwin`)return null;try{let{stdout:t}=await A(`pbpaste`,[`-Prefer`,String(e)],{encoding:`utf8`,maxBuffer:2*1024*1024});return String(t??``)}catch{return null}}async function F(){if(process.platform!==`darwin`)return[];let e=await j([`try`,`set thePaths to {}`,`try`,`set theItems to the clipboard as alias list`,`on error`,`set theItems to {(the clipboard as alias)}`,`end try`,`repeat with a in theItems`,`set end of thePaths to POSIX path of a`,`end repeat`,`set AppleScript's text item delimiters to "\\n"`,`return thePaths as text`,`end try`]),t=String(e??``).trim();return t?t.split(/\r?\n/).map(e=>e.trim()).filter(Boolean):[]}async function fe(){if(process.platform!==`darwin`)return[];let e=await j([`try`,`tell application "Finder"`,`if (count of selection) is 0 then return ""`,`set thePaths to {}`,`repeat with i in selection`,`try`,`set end of thePaths to POSIX path of (i as alias)`,`end try`,`end repeat`,`set AppleScript's text item delimiters to "\\n"`,`return thePaths as text`,`end tell`,`end try`]),t=String(e??``).trim();return t?t.split(/\r?\n/).map(e=>e.trim()).filter(Boolean):[]}async function I(e,t=12*1024*1024){if(process.platform!==`darwin`)return null;try{let{stdout:n}=await A(`pbpaste`,[`-Prefer`,String(e)],{encoding:`buffer`,maxBuffer:t});return!Buffer.isBuffer(n)||n.length<8?null:n}catch{return null}}async function pe(e,t){if(process.platform!==`darwin`||!Buffer.isBuffer(e)||e.length===0)return null;let n=String(t??``).toLowerCase()||`.bin`,r=await g(S.join(C.tmpdir(),`goatchain-clip-`)),i=S.join(r,`in${n}`),a=S.join(r,`out.png`);try{await x(i,e),await A(`sips`,[`-s`,`format`,`png`,i,`--out`,a],{encoding:`utf8`,maxBuffer:1024*1024});let t=await v(a),n=M(t);if(!n||n.mime!==`image/png`)return null;let r=`data:${n.mime};base64,${t.toString(`base64`)}`;return{buf:t,mime:n.mime,ext:n.ext,dataUrl:r}}catch{return null}finally{try{await b(r,{recursive:!0,force:!0})}catch{}}}async function L(e,t=4*1024*1024){let n=await ee(e);if(!n.isFile()||n.size>t)return null;let r=await v(e),i=M(r);if(!i||!i.mime.startsWith(`image/`))return null;let a=`data:${i.mime};base64,${r.toString(`base64`)}`;return{buf:r,mime:i.mime,ext:i.ext,dataUrl:a}}async function me(e=4*1024*1024){if(process.platform!==`darwin`)return[];let t=[],n=await P(`public.file-url`),r=ue(n&&n.trim()?n:await N());if(r.length===0&&(r=await F()),r.length>0)for(let n of r)try{let r=await L(n,e);r&&t.push({source:`file`,absPath:n,...r})}catch{}if(t.length>0)return t;for(let n of[`png`,`public.png`,`jpeg`,`public.jpeg`,`jpg`,`public.jpg`,`public.tiff`,`tiff`,`public.bmp`,`bmp`]){let r=await I(n,Math.max(12*1024*1024,e));if(!r)continue;let i=M(r);if(!i||!i.mime.startsWith(`image/`))continue;if(i.mime===`image/tiff`||i.mime===`image/bmp`){let e=await pe(r,i.ext);if(e){t.push({source:n,absPath:null,...e});break}}let a=`data:${i.mime};base64,${r.toString(`base64`)}`;t.push({source:n,absPath:null,buf:r,mime:i.mime,ext:i.ext,dataUrl:a});break}return t}const R=new Set([`node_modules`,`.git`,`.goatchain`,`dist`,`tmp`]);function he(e,t){let n=S.relative(S.resolve(e),S.resolve(t));return n===``?!0:n===`..`?!1:!n.startsWith(`..${S.sep}`)&&!S.isAbsolute(n)}function ge(e,t){let n=S.isAbsolute(t)?t:S.resolve(e,t);if(!he(e,n))throw Error(`Access denied: ${n}\nAllowed directory: ${e}`);let r=S.join(e,`.goatchain`);if(he(r,n))throw Error(`Access denied: ${n}\nRestricted: ${r}`);return n}async function _e(e,t={}){let n=typeof t.maxFiles==`number`?t.maxFiles:5e3,r=new Set(t.ignoreDirs??R),i=[],a=[`.`];for(;a.length>0;){let t=a.shift();if(!t)break;let o=S.resolve(e,t),s;try{s=await y(o,{withFileTypes:!0})}catch{continue}for(let e of s){let o=e.name;if(!o)continue;if(e.isDirectory()){if(r.has(o)||o.startsWith(`.env`))continue;let e=t===`.`?o:S.join(t,o);a.push(e);continue}if(!e.isFile())continue;let s=t===`.`?o:S.join(t,o);if(i.push(s),i.length>=n)return i}}return i}function ve(e,t){return t<=0?[]:e.slice(0,Math.min(e.length,t))}function z(e,t={}){let n=typeof t.headLines==`number`?t.headLines:40,r=typeof t.tailLines==`number`?t.tailLines:20,i=typeof t.maxBytes==`number`?t.maxBytes:6e4,a=String(e??``),o=Buffer.byteLength(a,`utf8`),s=o>i?a.slice(0,Math.max(0,i)):a,c=s.split(`
2
+ `);if(c.length<=n+r)return{text:s,truncated:o>i};let l=ve(c,n),u=c.slice(Math.max(n,c.length-r));return{text:`${l.join(`
3
+ `)}\n…\n${u.join(`
4
+ `)}`,truncated:!0}}async function B(e,t,n){let r=Math.max(0,Math.min(Number(t)||0,n)),i=await _(e,`r`);try{let e=Buffer.allocUnsafe(r),{bytesRead:a}=await i.read(e,0,r,0);return{text:e.subarray(0,a).toString(`utf8`),truncated:n>t,bytes:n}}finally{await i.close()}}function V(e){let t=String(e??``),n=[],r=/@file(?:\((path|summary|full)\))?:(\S+)/g,i;for(;(i=r.exec(t))!=null;){let e=i[0],t=i[1]===`path`||i[1]===`summary`||i[1]===`full`?i[1]:`summary`,r=i[2]??``;n.push({raw:e,mode:t,filePath:r})}return n}async function ye(e,t,n={}){let r=typeof n.maxTotalBytes==`number`?n.maxTotalBytes:22e4,i=typeof n.maxBytesPerFile==`number`?n.maxBytesPerFile:12e4,a=typeof n.maxBytesPerFileSummary==`number`?n.maxBytesPerFileSummary:4e4,o=typeof n.headLines==`number`?n.headLines:60,s=typeof n.tailLines==`number`?n.tailLines:20,c=V(t);if(c.length===0)return{text:String(t??``),files:[],omitted:[]};let l=new Map;for(let e of c){let t=`${e.mode}:${e.filePath}`;l.has(t)||l.set(t,e)}let u=[],d=[],f=0,p=[...l.values()];for(let t=0;t<p.length;t++){let n=p[t],c=ge(e,n.filePath),l=await ee(c);if(!l.isFile()){d.push({mode:n.mode,filePath:n.filePath,reason:`not_file`});continue}if(n.mode===`path`){u.push({mode:`path`,relPath:S.relative(e,c),absPath:c,bytes:l.size,truncated:!1});continue}let m=Math.max(0,r-f);if(m<=0){d.push({mode:n.mode,filePath:n.filePath,reason:`budget`});for(let e=t+1;e<p.length;e++){let t=p[e];d.push({mode:t.mode,filePath:t.filePath,reason:`budget`})}break}let h=n.mode===`summary`?a:i,g=Math.min(h,m),_=await B(c,g,l.size);if(f+=Math.min(_.bytes,g),n.mode===`full`)u.push({mode:`full`,relPath:S.relative(e,c),absPath:c,bytes:_.bytes,truncated:_.truncated,content:_.text});else{let t=z(_.text,{headLines:o,tailLines:s,maxBytes:g});u.push({mode:`summary`,relPath:S.relative(e,c),absPath:c,bytes:_.bytes,truncated:_.truncated||t.truncated,content:t.text})}}let m=String(t??``);for(let e of c)m=m.replace(e.raw,``).replace(/\s{2,}/g,` `);m=m.trim();let h=u.filter(e=>e.mode!==`path`).map(e=>`${`---\nfile: ${`[${e.relPath}](${e.absPath})`}\nmode: ${e.mode}${e.truncated?` (truncated)`:``}\n---\n`}${String(e.content??``)}`.trimEnd()),g=u.filter(e=>e.mode===`path`).map(e=>`[${e.relPath}](${e.absPath})`),_=[h.length>0||g.length>0?`[attached files]`:``,g.length>0?`paths: ${g.join(`, `)}`:``].filter(Boolean).join(`
5
+ `);return{text:[m,_,...h].filter(Boolean).join(`
6
+
7
+ `),files:u,omitted:d}}function be(e,t){let n=S.relative(S.resolve(e),S.resolve(t));return n===``?!0:n===`..`?!1:!n.startsWith(`..${S.sep}`)&&!S.isAbsolute(n)}function xe(e){let t=String(e??``).trim();if(!t)return``;if(t=t.replace(/^\s*[>❯]\s+(?=["'`/~]|file:\/\/)/u,``),t.startsWith(`\x1B[200~`)&&(t=t.slice(6)),t.endsWith(`\x1B[201~`)&&(t=t.slice(0,-6)),t=t.trim(),t=t.replaceAll(`​`,``).replaceAll(`‌`,``).replaceAll(`‍`,``).replaceAll(``,``),t=t.replace(/^["'`]+|["'`]+$/g,``).trim(),t.startsWith(`file://`))try{let e=new URL(t);if(e.protocol===`file:`){let n=decodeURIComponent(e.pathname);n&&(t=n)}}catch{}return t===`~`?t=C.homedir():t.startsWith(`~/`)&&(t=S.join(C.homedir(),t.slice(2))),t=t.replace(/\\(.)/g,`$1`),t}function Se(e,t){let n=xe(t);if(!n)throw Error(`Missing path`);if(S.isAbsolute(n)){let t=S.resolve(n);return{absPath:t,withinWorkspace:be(e,t)}}return{absPath:ge(e,n),withinWorkspace:!0}}function Ce(e){if(!e||typeof e!=`object`)return!1;let t=e,n=typeof t.name==`string`?t.name:``;return n===`ExitPromptError`||n===`AbortError`||(typeof t.code==`string`?t.code:``)===`ERR_PROMPT_CANCELED`}async function we(){try{let e=await import(`@inquirer/prompts`);return e&&typeof e.select==`function`?e:null}catch{return null}}async function Te({message:e,options:t,initialValue:n}){let r=typeof n==`number`?t[n]?.value:n,i=await we();if(!i)return{ok:!1,reason:`missing`};try{let n=await i.select({message:e,choices:t.map(e=>({value:e.value,name:e.label,description:e.hint,disabled:e.disabled})),default:r});return{ok:!0,value:String(n)}}catch(e){if(Ce(e))return{ok:!1,reason:`cancel`};throw e}}async function Ee({message:e,options:t,required:n=!1}){let r=await we();if(!r)return{ok:!1,reason:`missing`};if(typeof r.checkbox!=`function`)return{ok:!1,reason:`unsupported`};try{let i=await r.checkbox({message:e,choices:t.map(e=>({value:e.value,name:e.label,description:e.hint,disabled:e.disabled})),required:n});return{ok:!0,value:Array.isArray(i)?i.map(String):[]}}catch(e){if(Ce(e))return{ok:!1,reason:`cancel`};throw e}}async function De({message:e,initialValue:t=!1}){let n=await we();if(!n)return{ok:!1,reason:`missing`};try{let r=[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}],i=t?`yes`:`no`;if(typeof n.select!=`function`)return{ok:!1,reason:`unsupported`};let a=await n.select({message:e,choices:r.map(e=>({value:e.value,name:e.label})),default:i});return{ok:!0,value:String(a)===`yes`}}catch(e){if(Ce(e))return{ok:!1,reason:`cancel`};throw e}}async function Oe({message:e,placeholder:t}){let n=await we();if(!n)return{ok:!1,reason:`missing`};if(typeof n.input!=`function`)return{ok:!1,reason:`unsupported`};try{let r=await n.input({message:e,default:t});return{ok:!0,value:String(r??``)}}catch(e){if(Ce(e))return{ok:!1,reason:`cancel`};throw e}}async function ke({message:e,placeholder:t}){let n=await we();if(!n)return{ok:!1,reason:`missing`};if(typeof n.password!=`function`)return{ok:!1,reason:`unsupported`};try{let t=await n.password({message:e,mask:`*`});return{ok:!0,value:String(t??``)}}catch(e){if(Ce(e))return{ok:!1,reason:`cancel`};throw e}}function H(e){return Number.isFinite(e)?e>=4352&&(e<=4447||e===9001||e===9002||e>=11904&&e<=42191&&e!==12351||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65135||e>=65280&&e<=65376||e>=65504&&e<=65510||e>=127744&&e<=129791||e>=131072&&e<=262141):!1}function Ae(e){return e>=0&&e<32||e>=127&&e<=159}const je=/\p{Mark}/u;function U(e){if(!Number.isFinite(e)||Ae(e))return 0;try{if(je.test(String.fromCodePoint(e)))return 0}catch{}return H(e)?2:1}function Me(e){let t=0;for(let n of String(e??``)){let e=n.codePointAt(0)??0;t+=U(e)}return t}function Ne(e){let t=String(e??``),n=``,r=0;for(;r<t.length;){let e=t[r];if(Ie(e)){r=W(t,r);continue}let i=t.codePointAt(r)??0;n+=String.fromCodePoint(i),r+=i>65535?2:1}return n}function Pe(e,t){let n=String(e??``),r=Number.isFinite(t)?Math.max(0,Math.min(n.length,t)):n.length;if(r>0&&r<n.length){let e=n.charCodeAt(r-1),t=n.charCodeAt(r);e>=55296&&e<=56319&&t>=56320&&t<=57343&&r++}return r}function Fe(e,t){let n=String(e??``),r=Math.max(0,Number(t)||0);if(r===0)return{start:n.length,text:``};let i=0,a=n.length;for(;a>0;){let e=a-1,t=n.charCodeAt(e);if(t>=56320&&t<=57343&&e>0){let t=n.charCodeAt(e-1);t>=55296&&t<=56319&&e--}let o=U(n.codePointAt(e)??0);if(i+o>r)break;i+=o,a=e}return{start:a,text:n.slice(a)}}function Ie(e){return e===`\x1B`}function W(e,t){let n=t;if(n>=e.length||e[n]!==`\x1B`)return t;let r=e[n+1];if(r===`[`){let t=n+2;for(;t<e.length;){let n=e.charCodeAt(t);if(n>=64&&n<=126)return t+1;t++}return e.length}if(r===`]`){let t=n+2;for(;t<e.length;){let n=e[t];if(n===`\x07`)return t+1;if(n===`\x1B`&&e[t+1]===`\\`)return t+2;t++}return e.length}return Math.min(e.length,n+2)}function Le(e,t){let n=String(e??``),r=Math.max(0,Number(t)||0);if(r===0)return``;let i=``,a=0,o=0;for(;o<n.length&&a<r;){let e=n[o];if(Ie(e)){let e=W(n,o);i+=n.slice(o,e),o=e;continue}let t=n.codePointAt(o)??0,s=U(t);if(a+s>r)break;i+=String.fromCodePoint(t),a+=s,o+=t>65535?2:1}for(;o<n.length&&Ie(n[o]);){let e=W(n,o);i+=n.slice(o,e),o=e}return`${i}\u001B[0m`}function G(e){return e===`~`?C.homedir():e.startsWith(`~/`)||e.startsWith(`~\\`)?S.join(C.homedir(),e.slice(2)):e}function Re(e){return e.includes(`\\`)&&!e.includes(`/`)?`\\`:`/`}function K(e,t){let n=String(e??``),r=Re(n);if(n===`~`)return[`~${r}`];let i=n.lastIndexOf(`/`),a=n.lastIndexOf(`\\`),o=Math.max(i,a),s=o>=0?n.slice(0,o+1):``,c=o>=0?n.slice(o+1):n,l=G(s),u=S.isAbsolute(l)?l:S.resolve(t.cwd,l||`.`),d=typeof t.limit==`number`&&t.limit>0?t.limit:200,f=c.startsWith(`.`),p=c.toLowerCase(),m=[],h=null;try{for(h=ne.opendirSync(u);m.length<d;){let e=h.readSync();if(!e)break;if(t.onlyDirs&&!e.isDirectory())continue;let n=e.name;!f&&n.startsWith(`.`)||c&&!n.toLowerCase().startsWith(p)||m.push(`${s}${n}${e.isDirectory()?r:``}`)}}catch{return[]}finally{try{h?.closeSync()}catch{}}return m.sort((e,t)=>e.localeCompare(t)),m.slice(0,d)}function ze(e){let t=String(e??``).toLowerCase();return t.endsWith(`.png`)?`image/png`:t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)?`image/jpeg`:t.endsWith(`.webp`)?`image/webp`:t.endsWith(`.gif`)?`image/gif`:`application/octet-stream`}async function Be(e){let t=e.pendingImages.get();if(e.autoAttachState.clipboardAttachInFlight&&t.length===0){e.showInlineHint(`Attaching image from clipboard… (try again in a moment)`);return}if(t.length===0){let t=e.autoAttachState.lastPastedImageName&&Date.now()-e.autoAttachState.lastPastedImageName.at<6e4?e.autoAttachState.lastPastedImageName:null;if(!e.useClack()&&process.stdout.isTTY){await Ve(e,{allowSendNow:!1});return}if(!e.useClack()||!process.stdout.isTTY){t?e.showInlineHint(`No pending attachments. Last pasted: ${t.name} (use /images, or paste/drag a full path)`):e.showInlineHint(`No pending attachments.`);return}await e.withClack(async()=>{let n=await e.selectWithClack({message:t?`Attachments (last pasted: ${t.name})`:`Attachments`,options:[{value:`images`,label:`Attach image(s) from workspace…`},{value:`path`,label:`Attach image by path…`},{value:`cancel`,label:`Cancel`}],initialValue:0});if(!(!n.ok||n.value===`cancel`)){if(n.value===`images`){await Ve(e);return}if(n.value===`path`){let t=await e.textWithClack({message:`Image path`,placeholder:`/Users/you/Desktop/image.png (you can drag & drop here)`});if(!t.ok)return;let n=String(t.value??``).trim();if(!n)return;let r=e.normalizeUserProvidedPathToken(n),{absPath:i,withinWorkspace:a}=e.resolveUserProvidedPathForRead(e.workspaceCwd(),r),o=await e.readImageFileAsDataUrl(i);if(!o?.dataUrl){e.showInlineHint(`Not a supported image path.`);return}e.pendingImages.push({name:S.basename(i),mime:String(o.mime),bytes:ae.isBuffer(o.buf)?o.buf.byteLength:0,dataUrl:String(o.dataUrl),source:S.isAbsolute(r)&&!a?`paste`:`path`}),e.setPromptForMode(),e.refreshPrompt(),e.showInlineHint(`Attached image: ${S.basename(i)}`)}}});return}if(!e.useClack()){let n=await e.question(`Remove which attachments? (e.g. 1,3) or 'a' to clear all: `),r=String(n??``).trim().toLowerCase();if(!r)return;if(r===`a`||r===`all`||r===`clear`){e.pendingImages.set([]),e.clearPasteBuffers(),e.setPromptForMode(),e.refreshPrompt(),e.showInlineHint(`Cleared pending attachments.`);return}let i=r.split(/[, ]+/).map(e=>Number.parseInt(e,10)).filter(e=>Number.isFinite(e)),a=new Set(i.map(e=>e-1).filter(e=>e>=0&&e<t.length));if(a.size===0)return;e.pendingImages.set(t.filter((e,t)=>!a.has(t))),e.setPromptForMode(),e.refreshPrompt();return}await e.withClack(async()=>{let n=t.map((t,n)=>{let r=t.bytes?` (${e.humanBytes(t.bytes)})`:``;return{value:String(n),label:`${t.name}${r}`}}),r=await e.multiselectWithClack({message:`Select attachments to remove`,options:n,required:!1});if(!r.ok)return;let i=Array.isArray(r.value)?r.value.map(String):[],a=new Set(i.map(e=>Number.parseInt(e,10)).filter(e=>Number.isFinite(e)));a.size!==0&&(e.pendingImages.set(t.filter((e,t)=>!a.has(t))),e.setPromptForMode(),e.refreshPrompt())})}async function Ve(e,t={}){let n=t.allowSendNow!==!1;if(!e.useClack()){if(process.stdout.isTTY){let t=await e.question(`Image paths (space-separated; absolute or workspace-relative): `),r=String(t??``).trim();if(!r)return;let i=r.split(/\s+/).filter(Boolean),a=[];for(let t of i)try{let n=e.normalizeUserProvidedPathToken(t),{absPath:r,withinWorkspace:i}=e.resolveUserProvidedPathForRead(e.workspaceCwd(),n),o=await e.readImageFileAsDataUrl(r);if(!o?.dataUrl){e.showInlineHint(`Not a supported image path.`);return}a.push({name:S.basename(r),mime:String(o.mime),bytes:ae.isBuffer(o.buf)?o.buf.byteLength:0,dataUrl:String(o.dataUrl),source:S.isAbsolute(n)&&!i?`paste`:`path`})}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`);return}if(a.length===0)return;if(e.pendingImages.push(...a),e.setPromptForMode(),e.refreshPrompt(),e.showInlineHint(`Attached ${a.length} image(s).`),n){let t=await e.question(`Send now? [y/N] `),n=String(t??``).trim().toLowerCase();if(n===`y`||n===`yes`){let t=await e.question(`Message (optional): `);await e.runChatTurn(String(t??``).trim())}}return}process.stdout.write([`Attach images:`,`- Paste from iTerm2 to attach (cmd+v).`,`- Or run /images to pick images (TTY + interactive UI).`,`- Ctrl+O manages pending attachments.`,``].join(`
8
+ `));return}let r=await e.withClack(async()=>{let t=await e.getWorkspaceImages();if(t.length===0)return process.stdout.write(`[no images found]
9
+ `),null;let r=await e.textWithClack({message:`Search images (substring)`,placeholder:`e.g. assets/logo.png`});if(!r.ok)return null;let i=String(r.value??``).trim().toLowerCase(),a=i?t.filter(e=>String(e).toLowerCase().includes(i)):t;if(a.length===0)return process.stdout.write(`[no matches]
10
+ `),null;let o=a.slice(0,160),s=await e.multiselectWithClack({message:`Select images (${o.length}${a.length>160?`/${a.length}`:``})`,options:o.map(e=>({value:e,label:e})),required:!0});if(!s.ok)return null;let c=Array.isArray(s.value)?s.value.map(String).filter(Boolean):[];if(c.length===0)return null;let l=[];for(let t of c){let n=e.ensureAllowedFile(e.workspaceCwd(),t),r=await e.readFile(n);if(r.byteLength>4194304)return process.stdout.write(`Image too large: ${t} (${e.humanBytes(r.byteLength)})\n`),null;let i=r.toString(`base64`),a=ze(t),o=`data:${a};base64,${i}`;l.push({name:S.relative(e.workspaceCwd(),n),mime:a,bytes:r.byteLength,dataUrl:o,source:`path`})}if(l.length===0)return null;if(!n)return{action:{kind:`attach`},toAdd:l};let u=await e.selectWithClack({message:`Apply`,options:[{value:`attach`,label:`Attach (keep editing)`},{value:`send`,label:`Attach and send now`}],initialValue:0});if(!u.ok)return null;if(u.value===`send`){let t=await e.textWithClack({message:`Message`,placeholder:`Optional message to send with images`});if(!t.ok)return null;let n=String(t.value??``).trim();return n?{action:{kind:`send`,line:n},toAdd:l}:{action:{kind:`attach`},toAdd:l}}return{action:{kind:`attach`},toAdd:l}});r&&(r.toAdd.length>0&&(e.pendingImages.push(...r.toAdd),e.setPromptForMode(),e.refreshPrompt()),r.action.kind===`send`&&await e.runChatTurn(r.action.line))}const He=async({ctx:t,arg:n})=>{let i=r(t.uiPrefs?.approvalMode??`read_only`),a=async n=>{t.uiPrefs.approvalMode=n,await t.saveAll(),process.stdout.write(`${t.icon(`🛡️`)}approval mode: ${e(n)}\n`)};if(!n){if(t.useClack()&&t.stdoutIsTTY){await t.withClack(async()=>{let n=await t.selectWithClack({message:`Approval mode (${e(i)})`,options:[{value:`read_only`,label:`Read Only`,hint:`Requires approval for high-risk tools`},{value:`agent`,label:`Agent (current)`,hint:`Auto-approve tools (workspace only)`},{value:`full_access`,label:`Agent (full access)`,hint:`Auto-approve + allow outside workspace + network`},{value:`cancel`,label:`Cancel`}],initialValue:i===`read_only`?0:i===`agent`?1:2});if(!n.ok)return;let o=String(n.value);o!==`cancel`&&await a(r(o))});return}process.stdout.write(`${t.icon(`🛡️`)}approval mode: ${e(i)}\n`),process.stdout.write(`${t.ansi.dim(`Set with: /approvals read_only|agent|full_access`)}\n`);return}await a(r(n))},Ue=async({ctx:e})=>{let t=await me(),n=await de(),r=await N(),i=await fe(),o=String(r??``).split(/\r?\n/).find(Boolean)??``;if(n&&process.stdout.write(`${e.icon(`📋`)}clipboard types: ${n}\n`),o&&process.stdout.write(`${e.icon(`📋`)}clipboard text: ${a(o,120)}\n`),Array.isArray(i)&&i.length>0&&process.stdout.write(`${e.icon(`🗂️`)}finder selection: ${i.slice(0,3).map(e=>S.basename(String(e))).join(`, `)}\n`),!Array.isArray(t)||t.length===0){process.stdout.write(`${e.icon(`📋`)}clipboard: no attachable image found\n`),process.stdout.write(`${e.icon(`💡`)}tip: clipboard is text-only. If you have the file selected in Finder, try pasting again (CLI can use Finder selection); otherwise drag & drop or use /images.\n`);return}process.stdout.write(`${e.icon(`🖼️`)}clipboard images: ${t.length} candidate(s)\n`);for(let n of t.slice(0,6)){let t=n?.source?String(n.source):`unknown`,r=n?.absPath?S.basename(String(n.absPath)):``,i=n?.mime?String(n.mime):``,a=Buffer.isBuffer(n?.buf)?n.buf.byteLength:0;process.stdout.write(`- ${t}${r?` ${r}`:``}${i?` ${i}`:``}${a?` (${e.humanBytes(a)})`:``}\n`)}t.length>6&&process.stdout.write(`… (+${t.length-6})\n`)},We=async({ctx:e})=>{if(e.isBusy()){process.stdout.write(`${e.icon(`⏳`)}busy (Ctrl+C to cancel)\n`);return}if(e.getUiMode()===`select_session`){process.stdout.write(`${e.icon(`ℹ️`)}Exit session picker first.\n`);return}let t=e.agentRef.get(),n=e.modelRef.get();if(!t){process.stdout.write(`${e.icon(`❌`)}Agent not available\n`);return}if(!n){process.stdout.write(`${e.icon(`❌`)}Model not available\n`);return}let r=t.stateStore;if(!r){process.stdout.write(`${e.icon(`❌`)}State store not available (agent has no stateStore)\n`);return}let i=Array.isArray(e.options.session.history)?e.options.session.history:[];if(i.length===0){process.stdout.write(`${e.icon(`ℹ️`)}No messages in current session to compress\n`);return}let a=e.options.session.sessionId;if(!a){process.stdout.write(`${e.icon(`❌`)}No active session\n`);return}try{process.stdout.write(`${e.icon(`🗜️`)}Starting manual compression for session ${a}...\n`);let{compressSessionManually:t}=await import(`./src-Dpj3VSps.js`);if(typeof t!=`function`){process.stdout.write(`${e.icon(`❌`)}compressSessionManually not available in SDK\n`);return}let o=await t({sessionId:a,fullMessages:i,model:n,stateStore:r});if(o.summary.length===0){process.stdout.write(`${e.icon(`ℹ️`)}No summary generated (no content to summarize)\n`);return}process.stdout.write(`${e.icon(`✅`)}Compression completed:\n`),process.stdout.write(` 📊 Messages processed: ${o.messageCount}\n`),o.toolOutputCount>0?process.stdout.write(` 🔧 Tool outputs: ${o.toolOutputCount}\n`):process.stdout.write(` 💬 Conversation messages summarized
11
+ `),process.stdout.write(` 📝 Summary length: ${o.summary.length} chars\n`),process.stdout.write(` 💾 Summary saved to CompressionState
12
+ `),process.stdout.write(`\n${e.icon(`💡`)}The summary will be automatically loaded in the next turn.\n`)}catch(t){let n=t instanceof Error?t.message:String(t);process.stdout.write(`${e.icon(`❌`)}Compression failed: ${n}\n`)}},Ge=async({ctx:e,arg:t})=>{if(!t){process.stdout.write(`${e.icon(`❌`)}Missing key (try /help)\n`);return}e.setApiKey(t);let n=e.modelRef.get();typeof n?.resetClient==`function`&&n.resetClient(),await e.saveAll(),process.stdout.write(`${e.icon(`🔑`)}api key set\n`)},Ke=async({ctx:e,arg:t})=>{if(!t){process.stdout.write(`${e.icon(`❌`)}Missing key (try /help)\n`);return}if(typeof e.setWebSearchConfig!=`function`){process.stdout.write(`${e.icon(`❌`)}webSearch config is not supported in this build.\n`);return}e.setWebSearchConfig({apiKey:t}),await e.saveAll(),process.stdout.write(`${e.icon(`🔎`)}web search key set\n`)},qe=async({ctx:e,arg:t})=>{if(!t){process.stdout.write(`${e.icon(`❌`)}Missing url (try /help)\n`);return}await e.setBaseUrl(t),process.stdout.write(`${e.icon(`🌐`)}baseUrl set: ${e.baseUrlRef.get()??``}\n`)},q=async({ctx:e})=>{typeof e.setCurrentMode==`function`&&e.setCurrentMode(`agent`),e.uiPrefs.planMode=!1,await e.saveAll(),process.stdout.write(`${e.icon(`🤖`)}agent mode: on\n`),process.stdout.write(`${e.ansi.dim(`Note: Mode changes take effect next turn.`)}\n`)},Je=async({ctx:e})=>{typeof e.setCurrentMode==`function`&&e.setCurrentMode(`plan`),e.uiPrefs.planMode=!0,await e.saveAll(),process.stdout.write(`${e.icon(`🧭`)}plan mode: on\n`),process.stdout.write(`${e.ansi.dim(`Note: Mode changes take effect next turn.`)}\n`)},Ye=async({ctx:e})=>{if(e.isBusy()){process.stdout.write(`${e.icon(`⏳`)}busy (Ctrl+C to cancel)\n`);return}if(e.getUiMode()===`select_session`){process.stdout.write(`${e.icon(`ℹ️`)}Exit session picker first.\n`);return}e.setMultiline({lines:[]}),e.setPromptForMode(),e.showInlineHint(`Multiline mode: type .send to send, .cancel to cancel.`)},Xe=async({ctx:e})=>{if(e.isBusy()){process.stdout.write(`${e.icon(`⏳`)}busy (Ctrl+C to cancel)\n`);return}if(e.getUiMode()===`select_session`){process.stdout.write(`${e.icon(`ℹ️`)}Exit session picker first.\n`);return}await e.openEditorFlow()};function Ze(e){return e===`user`||e===`assistant`||e===`tool`||e===`system`}function Qe(e){if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e??``)}}function $e(e){return Array.isArray(e)?e.filter(Boolean):[]}const J=async({ctx:e,arg:t})=>{let n=$e(e.options?.session?.history);if(n.length===0){process.stdout.write(`[no history]
13
+ `);return}let r=String(t??``).trim().split(/\s+/).filter(Boolean),i=new Set(r.map(e=>e.toLowerCase())),a=r.map(e=>e.toLowerCase()).filter(Ze),o=a.length>0?a:[`user`,`assistant`,`tool`],s=i.has(`preview`),c=i.has(`all`)||i.has(`full`),l=r.find(e=>/^\d+$/.test(e)),u=l?Math.max(1,Number.parseInt(l,10)):void 0,d=n.filter(e=>o.includes(String(e?.role??``)));if(d.length===0){process.stdout.write(`[no matching history]
14
+ `);return}if(s&&!c){let{createUiTheme:t}=await import(`./theme-DvHvtqNs.js`),{printHistory:n}=await import(`./ui-B9ajujL6.js`),r=t(e.uiPrefs?.theme);n(d,{maxMessages:u??40,maxCharsPerMessage:800,emoji:e.uiPrefs?.emoji,ansi:r.ansi,formatRoleHeader:(e,t)=>e===`assistant`||e===`user`||e===`tool`||e===`system`?r.roleHeader(e,t):`[${e}]`});return}let f=c?d.length:u??40,p=Math.max(0,d.length-f),m=d.slice(p);p>0&&process.stdout.write(e.ansi.dim(`[... ${p} earlier messages omitted ...]\n`));let h=[];for(let t=0;t<m.length;t++){let n=m[t],r=String(n?.role??`unknown`),i=r===`assistant`?e.ansi.cyan(r):r===`user`?e.ansi.green(r):r===`tool`?e.ansi.gray(r):r,a=p+t+1;h.push(`[${i} #${a}]`);let o=Qe(n?.content),s=String(o??``).split(/\r?\n/);h.push(...s),h.push(``)}process.stdout.write(`${h.join(`
15
+ `)}\n`)},et=async({ctx:e,arg:t})=>{let n=typeof e.options?.mcpManagerRef?.get==`function`?e.options.mcpManagerRef.get():null,i=typeof e.options?.getLocalConfig==`function`?e.options.getLocalConfig:null,a=i?i():void 0,o=Array.isArray(a?.mcp?.servers)?a.mcp.servers:[],s=String(t??``).trim().split(/\s+/)[0]?.toLowerCase()||`status`;if(!n){process.stdout.write(`${e.icon(`🧩`)}MCP manager is not available in this build.\n`);return}let c=async t=>{if(!e.stdoutIsTTY)return!0;if(e.useClack()){let n=!1;return await e.withClack(async()=>{let r=await e.confirmWithClack({message:t,initialValue:!1});n=!!(r.ok&&r.value)}),n}let n=await e.question(`${t} [y/N] `),r=String(n??``).trim().toLowerCase();return r===`y`||r===`yes`};if(s===`disconnect`){await n.disconnectAll(),process.stdout.write(`${e.icon(`🧩`)}mcp: disconnected\n`);return}if(s===`connect`||s===`reload`){if(r(e.uiPrefs?.approvalMode??`read_only`)===`read_only`&&!await c(`MCP connect may start local processes. Proceed?`)){process.stdout.write(`${e.icon(`🧩`)}mcp: canceled\n`);return}let t=await n.connectFromConfig(a?.mcp);process.stdout.write(`${e.icon(`🧩`)}mcp: connected=${t.connected} tools=${t.toolCount}\n`);return}if(s===`tools`){let t=n.listRegisteredTools();process.stdout.write(`${e.icon(`🧩`)}mcp tools: ${t.length?t.join(`, `):`∅`}\n`);return}let l=n.listConnected();process.stdout.write(`${e.icon(`🧩`)}mcp servers: ${o.length}\n`);for(let t of o.slice(0,40)){let n=String(t?.name??``),r=t?.enabled!==!1,i=l.find(e=>e.name===n),a=i?`connected tools=${i.toolCount} (${i.transport})`:`disconnected`;process.stdout.write(`${e.ansi.dim(`-`)} ${n||`(missing name)`}${r?``:` (disabled)`} — ${a}\n`)}o.length>40&&process.stdout.write(`${e.ansi.dim(`… (+${o.length-40})`)}\n`),process.stdout.write(`${e.ansi.dim(`Commands: /mcp connect | /mcp disconnect | /mcp tools`)}\n`)};function tt(e){return typeof e==`string`?[e]:e?Array.isArray(e)?e:[e]:[]}function nt(e,t={}){let n=typeof t.maxTextPreviewChars==`number`&&Number.isFinite(t.maxTextPreviewChars)?Math.max(0,Math.trunc(t.maxTextPreviewChars)):800,r=[],i=e=>{let t=String(e??``),i=n>0&&t.length>n?`${t.slice(0,n)}…`:t;r.push({type:`text`,chars:t.length,preview:i})},a=(e,t)=>{let n=String(t??``),i=Math.floor(n.length*3/4);r.push({type:`image`,mimeType:String(e??`application/octet-stream`),base64Chars:n.length,approxBytes:i})};for(let t of tt(e))if(t){if(typeof t==`string`){i(t);continue}if(typeof t==`object`&&t.type===`text`){i(String(t.text??``));continue}typeof t==`object`&&t.type===`image`&&a(t.mimeType,t.data)}return r}function rt(e,t={}){if(typeof e==`string`||!e)return e;let n=!!t.includeImageBase64,r=typeof t.maxImageBase64Chars==`number`&&Number.isFinite(t.maxImageBase64Chars)?Math.max(0,Math.trunc(t.maxImageBase64Chars)):0;return(Array.isArray(e)?e:[e]).map(e=>{if(!e||typeof e!=`object`)return e;let t=e.type;if(t===`text`)return{type:`text`,text:String(e.text??``)};if(t===`image`){let t=String(e.mimeType??``),i=String(e.data??``),a={type:`image`,mimeType:t,base64Chars:i.length};return n?a.data=r>0&&i.length>r?`${i.slice(0,r)}…`:i:a.dataPrefix=i?`${i.slice(0,32)}…`:``,a}return e})}function it(e){let t=String(e??``).split(/\s+/).filter(Boolean);return{wantsJson:t.includes(`--json`),wantsFull:t.includes(`--full`),wantsRaw:t.includes(`--raw`)||t.includes(`--base64`),maxImageBase64Chars:(()=>{let e=t.find(e=>e.startsWith(`--max-base64-chars=`))??t.find(e=>e.startsWith(`--max-base64=`));if(!e)return;let n=e.split(`=`,2)[1],r=Number(n);return Number.isFinite(r)?Math.max(0,Math.trunc(r)):void 0})(),message:t.filter(e=>!e.startsWith(`--`)).join(` `)}}function at(e){let{prepared:t}=e,n={rawInput:t.rawInput,cleanedText:t.cleanedText,historyContent:t.historyContent,modelInput:rt(t.modelInput,{includeImageBase64:e.wantsRaw,maxImageBase64Chars:e.maxImageBase64Chars}),modelInputSummary:t.blocksSummary,pendingImages:t.pendingImages};return e.history&&(n.history=e.history),n}function Y(e){let{prepared:t,ansi:n,humanBytes:r}=e,i=[];i.push(n.bold(`Preview: next send payload`)),i.push(`${n.dim(`pending images:`)} ${t.pendingImages.length}`);for(let e of t.pendingImages.slice(0,20))i.push(`${n.dim(`-`)} ${e.name} (${e.mime||`unknown`}, ${r(e.bytes)}) [${e.source}]`);t.pendingImages.length>20&&i.push(n.dim(`… (+${t.pendingImages.length-20})`)),i.push(`${n.dim(`historyContent:`)}\n${t.historyContent||`(empty)`}`),i.push(`${n.dim(`modelInput blocks:`)} ${t.blocksSummary.length}`);for(let e of t.blocksSummary)e.type===`text`?i.push(`${n.dim(`-`)} text chars=${e.chars}\n${e.preview||`(empty)`}`):i.push(`${n.dim(`-`)} image mime=${e.mimeType} base64Chars=${e.base64Chars} approxBytes=${r(e.approxBytes)}`);return typeof e.historyLength==`number`&&i.push(`${n.dim(`history messages:`)} ${e.historyLength}`),i.push(``),`${i.join(`
16
+ `)}\n`}const ot=async({ctx:e,arg:t})=>{let n=it(t),r=await e.prepareOutgoingPreview(n.message);if(n.wantsJson){let t=at({prepared:r,wantsRaw:n.wantsRaw,maxImageBase64Chars:n.maxImageBase64Chars,history:n.wantsFull?e.options.session.history:void 0});process.stdout.write(`${JSON.stringify(t,null,2)}\n`);return}process.stdout.write(Y({prepared:r,ansi:e.ansi,humanBytes:e.humanBytes,historyLength:n.wantsFull?e.options.session.history.length:void 0}))};function st(e){if(typeof e==`string`)return e;try{return JSON.stringify(e??``)}catch{return String(e??``)}}function ct(e,t){let n=new Set(Array.isArray(t)?t.map(String):[]);return(Array.isArray(e)?e:[]).filter(e=>e&&n.has(String(e.sessionId)))}function lt(e){let t=Array.isArray(e)?e:[];return{schemaVersion:1,exportedAt:Date.now(),sessions:t.map(e=>({sessionId:typeof e?.sessionId==`string`?e.sessionId:h(),createdAt:typeof e?.createdAt==`number`?e.createdAt:void 0,updatedAt:typeof e?.updatedAt==`number`?e.updatedAt:void 0,modelId:typeof e?.modelId==`string`?e.modelId:void 0,systemPrompt:typeof e?.systemPrompt==`string`?e.systemPrompt:void 0,title:typeof e?.title==`string`?e.title:void 0,summary:typeof e?.summary==`string`?e.summary:void 0,pinned:!!e?.pinned,messages:Array.isArray(e?.messages)?e.messages:[]}))}}function ut(e,t={}){let n=typeof t.exportedAt==`string`?t.exportedAt:new Date().toISOString(),r=Array.isArray(e)?e:[],i=[];i.push(`# Sessions export`),i.push(``),i.push(`exportedAt: ${n}`),i.push(``);for(let e of r){i.push(`---`),i.push(`## ${e?.title??`New session`}`),i.push(`- id: ${e?.sessionId??``}`),e?.modelId&&i.push(`- model: ${String(e.modelId)}`),i.push(`- pinned: ${!!e?.pinned}`),e?.summary&&i.push(`- summary: ${String(e.summary).replace(/\n/g,` `)}`),i.push(``),i.push(`### Messages`);let t=Array.isArray(e?.messages)?e.messages:[];for(let e of t){let t=e?.role?String(e.role):`message`,n=st(e?.content).replace(/\n/g,`\\n`);i.push(`- ${t}: ${n}`)}i.push(``)}return`${i.join(`
17
+ `)}\n`}function dt(e){if(Array.isArray(e))return e;if(e&&typeof e==`object`){let t=e;if(Array.isArray(t.sessions))return t.sessions;if(typeof t.sessionId==`string`)return[e]}return[]}async function ft(e,t={}){let n=String(t?.conflict??`new_ids`),r=typeof t?.exists==`function`?t.exists:async()=>!1,i=typeof t?.makeId==`function`?t.makeId:()=>h(),a=[],o=Array.isArray(e)?e:[];for(let e of o){if(!e||typeof e!=`object`)continue;let t=e,o=typeof t.sessionId==`string`&&t.sessionId.trim()?t.sessionId.trim():i();if(await r(o)){if(n===`skip`)continue;n===`new_ids`&&(o=i())}a.push({sessionId:o,session:{sessionId:o,createdAt:typeof t.createdAt==`number`?t.createdAt:Date.now(),updatedAt:typeof t.updatedAt==`number`?t.updatedAt:Date.now(),modelId:typeof t.modelId==`string`?t.modelId:void 0,systemPrompt:typeof t.systemPrompt==`string`?t.systemPrompt:void 0,title:typeof t.title==`string`?t.title:void 0,summary:typeof t.summary==`string`?t.summary:void 0,pinned:!!t.pinned,messages:Array.isArray(t.messages)?t.messages:[]}})}return a}const pt=async({ctx:e})=>{await e.resetToNewSession(),e.leaveSessionPickerUi(),e.setUiMode(`normal`),e.setPromptForMode()},mt=async({ctx:e})=>{let t=await e.listSessions();if(t.length===0){process.stdout.write(`${e.icon(`ℹ️`)}[no sessions]\n`);return}let n=(e.uiPrefs?.sessionsUi??process.env.GOATCHAIN_SESSIONS_UI??`auto`).toLowerCase();if(e.stdoutIsTTY&&n!==`legacy`&&e.useClack()){await e.withClack(async()=>{let n=await e.selectWithClack({message:`Sessions`,options:[{value:`open`,label:e.label(`🗂️`,`Switch session…`),hint:`Open an existing conversation (load its history)`},{value:`rename`,label:e.label(`✏️`,`Set session title…`),hint:`Give a session a custom name (for easier browsing/searching)`},{value:`pin`,label:e.label(`📌`,`Pin session(s)…`),hint:`Mark as pinned so they stay at the top of the list`},{value:`unpin`,label:e.label(`📍`,`Unpin session(s)…`),hint:`Remove pinned mark`},{value:`export`,label:e.label(`📤`,`Export session(s)…`),hint:`Write selected sessions to a workspace file (JSON/Markdown)`},{value:`import`,label:e.label(`📥`,`Import session(s) from JSON…`),hint:`Load sessions from a previously exported JSON bundle`},{value:`delete`,label:e.label(`🗑️`,`Delete session(s)…`),hint:`Permanently remove from local storage (cannot be undone)`}],initialValue:0});if(!n.ok)return;let r=e.stdoutIsTTY&&typeof process.stdout.columns==`number`&&process.stdout.columns>0?process.stdout.columns:120,i=Math.max(18,Math.min(52,Math.floor(r*.4))),o=Math.max(0,r-(8+i+22)),s=t.slice(0,120).map(e=>{let t=Array.isArray(e.messages)?e.messages.length:0,n=e.pinned?`★ `:``,r=`${n}${a(e.title??`New session`,Math.max(6,i-n.length))}`,s=l(e.updatedAt),c=typeof e.sessionId==`string`?e.sessionId.slice(-8):``,u=a(`${t} msgs · ${s}${c?` · ${c}`:``}`,26),d=o>=18?a(e.summary??``,o):``,f=`${r} (${u})${d?` — ${d}`:``}`;return{value:e.sessionId,label:f}});if(n.value===`open`){let n=t.findIndex(t=>t.sessionId===e.options.session.sessionId),r=await e.selectWithClack({message:`Select a session`,options:s,initialValue:n>=0?n:0});r.ok&&await e.useSessionById(String(r.value));return}if(n.value===`rename`){if(!e.renameSessionById){process.stdout.write(`${e.icon(`❌`)}Rename is not configured (missing renameSessionById)\n`);return}let n=t.findIndex(t=>t.sessionId===e.options.session.sessionId),r=await e.selectWithClack({message:`Select a session to rename`,options:s,initialValue:n>=0?n:0});if(!r.ok)return;let i=String(r.value),a=t.find(e=>e.sessionId===i),o=await e.textWithClack({message:`New title`,placeholder:a?.title??`New session`});if(!o.ok)return;let c=String(o.value??``).trim();await e.renameSessionById(i,c),i===e.options.session.sessionId&&(e.options.session.title=c,await e.saveAll()),process.stdout.write(`${e.ansi.green(`${e.icon(`✏️`)}renamed:`)} ${i}\n`);return}if(n.value===`pin`||n.value===`unpin`){if(!e.setPinnedSessionsById){process.stdout.write(`${e.icon(`❌`)}Pin is not configured (missing setPinnedSessionsById)\n`);return}let t=await e.multiselectWithClack({message:n.value===`pin`?`Select sessions to pin`:`Select sessions to unpin`,options:s,required:!0});if(!t.ok)return;let r=Array.isArray(t.value)?t.value.map(String):[];if(r.length===0)return;let i=n.value===`pin`;await e.setPinnedSessionsById(r,i),r.includes(e.options.session.sessionId)&&(e.options.session.pinned=i,await e.saveAll()),process.stdout.write(`${e.ansi.green(`${e.icon(i?`📌`:`📍`)}${i?`pinned:`:`unpinned:`}`)} ${r.length} session(s)\n`);return}if(n.value===`export`){let n=await e.multiselectWithClack({message:`Select sessions to export`,options:s,required:!0});if(!n.ok)return;let r=Array.isArray(n.value)?n.value.map(String):[];if(r.length===0)return;let i=await e.selectWithClack({message:`Export format`,options:[{value:`json`,label:`JSON (bundle)`},{value:`md`,label:`Markdown`}],initialValue:0});if(!i.ok)return;let a=String(i.value),o=`sessions-export-${new Date().toISOString().replace(/[:.]/g,`-`)}.${a===`md`?`md`:`json`}`,c=await e.textWithClack({message:`Output file (workspace-relative)`,placeholder:o});if(!c.ok)return;let l=String(c.value??``).trim()||o,u=S.resolve(e.workspaceCwd(),l),d=S.relative(e.workspaceCwd(),u);if(d.startsWith(`..`)||S.isAbsolute(d)){process.stdout.write(`${e.icon(`❌`)}Export path must be inside the workspace\n`);return}let f=await e.confirmWithClack({message:`Write ${l}?`,initialValue:!0});if(!f.ok||!f.value)return;let p=ct(t,r);if(a===`md`)await x(u,ut(p),`utf8`);else{let e=lt(p);await x(u,`${JSON.stringify(e,null,2)}\n`,`utf8`)}process.stdout.write(`${e.ansi.green(`${e.icon(`📤`)}exported:`)} ${r.length} session(s) -> ${l}\n`);return}if(n.value===`import`){if(!e.saveSessionByData){process.stdout.write(`${e.icon(`❌`)}Import is not configured (missing saveSessionByData)\n`);return}let t=await e.textWithClack({message:`JSON file to import (workspace-relative)`,placeholder:`sessions-export.json`});if(!t.ok)return;let n=String(t.value??``).trim();if(!n)return;let r=S.resolve(e.workspaceCwd(),n),i=S.relative(e.workspaceCwd(),r);if(i.startsWith(`..`)||S.isAbsolute(i)){process.stdout.write(`${e.icon(`❌`)}Import path must be inside the workspace\n`);return}let a;try{a=JSON.parse(await v(r,`utf8`))}catch(t){process.stdout.write(`${e.icon(`❌`)}Failed to read JSON: ${t instanceof Error?t.message:String(t)}\n`);return}let o=dt(a);if(o.length===0){process.stdout.write(`${e.icon(`ℹ️`)}No sessions found in JSON\n`);return}let s=await e.selectWithClack({message:`On sessionId conflict`,options:[{value:`new_ids`,label:`Create new IDs`},{value:`overwrite`,label:`Overwrite`},{value:`skip`,label:`Skip conflicts`}],initialValue:0});if(!s.ok)return;let c=`new_ids`,l=String(s.value??``);(l===`new_ids`||l===`overwrite`||l===`skip`)&&(c=l);let u=await ft(o,{conflict:c,exists:async t=>!!await e.loadSessionById(t),makeId:()=>h()});for(let t of u)await e.saveSessionByData(t.session);process.stdout.write(`${e.ansi.green(`${e.icon(`📥`)}imported:`)} ${u.length} session(s)\n`);return}if(n.value===`delete`){if(!e.deleteSessionsById&&!e.deleteSessionById){process.stdout.write(`${e.icon(`❌`)}Delete is not configured (missing deleteSessionsById)\n`);return}let t=await e.multiselectWithClack({message:`Select sessions to delete`,options:s,required:!0});if(!t.ok)return;let n=Array.isArray(t.value)?t.value.map(String):[];if(n.length===0)return;let r=await e.confirmWithClack({message:`Delete ${n.length} session(s)? This cannot be undone.`,initialValue:!1});if(!r.ok||!r.value)return;if(e.deleteSessionsById)await e.deleteSessionsById(n);else if(e.deleteSessionById)for(let t of n)await e.deleteSessionById(t);process.stdout.write(`${e.ansi.yellow(`${e.icon(`🗑️`)}deleted:`)} ${n.length} session(s)\n`),n.includes(e.options.session.sessionId)&&await e.resetToNewSession()}});return}e.openSessionPicker(t)},ht=async({ctx:e,arg:t})=>{let n=String(t??``).split(/\s+/).filter(Boolean);if(n.length===0){process.stdout.write(`${e.icon(`ℹ️`)}Usage: /rm <sessionId...>\n`);return}if(!e.deleteSessionsById&&!e.deleteSessionById){process.stdout.write(`${e.icon(`❌`)}Delete is not configured\n`);return}if(e.useClack()&&e.stdoutIsTTY){let t=[...new Set(n)],r=await Promise.all(t.map(async t=>{try{let n=await e.loadSessionById(t);if(!n)return{id:t,missing:!0};let r=Array.isArray(n.messages)?n.messages:[];return{id:t,title:n.title??s(r),summary:n.summary??u(r),missing:!1}}catch{return{id:t,missing:!0}}}));process.stdout.write(`${e.ansi.bold(`About to delete:`)}\n`);for(let e of r.slice(0,12)){if(e.missing){process.stdout.write(`- ${e.id} (not found)\n`);continue}let t=e.title?a(String(e.title),80):``;process.stdout.write(`- ${e.id}${t?` — ${t}`:``}\n`)}r.length>12&&process.stdout.write(`… (+${r.length-12})\n`);let i=await e.withClack(()=>e.confirmWithClack({message:`Delete ${t.length} session(s)? This cannot be undone.`,initialValue:!1}));if(!i.ok||!i.value)return}else{let t=await e.question(`Delete ${n.length} session(s)? [y/N] `),r=String(t??``).trim().toLowerCase();if(!(r===`y`||r===`yes`))return}if(e.deleteSessionsById)await e.deleteSessionsById(n);else if(e.deleteSessionById)for(let t of n)await e.deleteSessionById(t);process.stdout.write(`${e.ansi.yellow(`${e.icon(`🗑️`)}deleted:`)} ${n.length} session(s)\n`),n.includes(e.options.session.sessionId)&&await e.resetToNewSession()},gt=async({ctx:e,arg:t})=>{await e.useSessionById(String(t??``).trim())},_t=async({ctx:e})=>{await e.openCommandPalette()},vt=async({ctx:e,arg:t})=>{await e.printConfig(t)},yt=async({ctx:e})=>{e.exit()},bt=async({ctx:e})=>{e.clearAttachments(),process.stdout.write(`${e.icon(`🧹`)}cleared pending attachments\n`)},xt=async({ctx:e})=>{let t=e.agentRef.get(),n=typeof t?.tools?.list==`function`?t.tools.list():[];process.stdout.write(`${e.icon(`🧰`)}${n.map(e=>e.name).join(`, `)}\n`)},St=async({ctx:e})=>{e.printStatus()},Ct=async({ctx:e})=>{await e.saveAll(),process.stdout.write(`${e.icon(`💾`)}saved\n`)},X=async({ctx:e})=>{await e.openWorkspaceFlow()},wt=async({ctx:e})=>{await e.openFilesFlow()},Tt=async({ctx:e})=>{await e.openImagesFlow()},Et=async({ctx:e})=>{await e.openSettingsFlow()},Dt=async({ctx:e})=>{await e.openOutputFlow()},Ot=async({ctx:e})=>{await e.openDiagnosticsFlow()};function kt(e){let t=String(e||``).trim();if(!t)return``;let n=t.toLowerCase();return n===`maxtokens`||n===`max_tokens`?`maxOutputTokens`:n===`top_p`||n===`topp`?`topP`:n===`presence_penalty`?`presencePenalty`:n===`frequency_penalty`?`frequencyPenalty`:n===`timeout`||n===`timeoutms`?`timeoutMs`:t}function Z(e,t){let n=kt(e),r=String(t??``).trim();if(!n)return{ok:!1,error:`Missing key`};if(r.length===0)return{ok:!1,error:`Missing value`};let i=e=>{let t=Number(r);return Number.isFinite(t)?{ok:!0,value:t}:{ok:!1,error:`Invalid ${e}: ${r}`}},a=e=>{let t=Number.parseInt(r,10);return Number.isFinite(t)?{ok:!0,value:t}:{ok:!1,error:`Invalid ${e}: ${r}`}};return n===`maxOutputTokens`?a(`maxTokens`):n===`timeoutMs`||n===`seed`?a(n):n===`temperature`||n===`topP`||n===`presencePenalty`||n===`frequencyPenalty`?i(n):{ok:!1,error:`Unknown param: ${e}`}}const At=async({ctx:e})=>{let t=e.requestDefaults??{},n=[typeof t.maxOutputTokens==`number`?`maxTokens=${t.maxOutputTokens}`:void 0,typeof t.temperature==`number`?`temperature=${t.temperature}`:void 0,typeof t.topP==`number`?`topP=${t.topP}`:void 0,typeof t.presencePenalty==`number`?`presencePenalty=${t.presencePenalty}`:void 0,typeof t.frequencyPenalty==`number`?`frequencyPenalty=${t.frequencyPenalty}`:void 0,typeof t.seed==`number`?`seed=${t.seed}`:void 0,typeof t.timeoutMs==`number`?`timeoutMs=${t.timeoutMs}`:void 0].filter(Boolean);process.stdout.write(`${e.icon(`⚙️`)}${n.join(` `)}\n`)},jt=async({ctx:e,arg:t})=>{let n=e.modelRef.get(),r=String(t??``).trim();if(!r&&e.useClack()&&e.stdoutIsTTY){if(e.isBusy()){e.showInlineHint(`busy (wait for current turn to finish)`);return}let t=String(n?.modelId??``),r=D(e.provider),i=new Map;for(let e of r)e.modelId&&i.set(e.modelId,ce(e.modelId));let a=Number(process.stdout.columns??0)||0,o=r.reduce((e,t)=>Math.max(e,Me(t.label)),0),s=[...i.values()].reduce((e,t)=>Math.max(e,Me(t)),0),c=a>0?Math.max(10,Math.min(o,a-s-3)):o,l=(t,n)=>{let r=String(t??``).trimEnd(),i=Me(r)<=c?r:`${r.slice(0,Math.max(0,c-1))}…`,a=Math.max(0,c-Me(i)),o=String(n??``).trim(),s=o?` `:``;return`${i}${` `.repeat(a)}${s}${o?e.ansi.dim(o):``}`},u=r.map(e=>{let t=e.modelId?i.get(e.modelId)??``:``,n=t?l(e.label,t):e.label,r=e.hint;return{value:e.modelId||`__custom__`,label:n,hint:r}}),d=null;if(await e.withClack(async()=>{let n=await e.selectWithClack({message:`Select model (Enter select · Esc cancel)`,options:u,initialValue:t});if(!n.ok)return;let r=String(n.value??``);if(r===`__custom__`){let n=await e.textWithClack({message:`Model id`,placeholder:t});if(!n.ok)return;let r=String(n.value??``).trim();if(!r)return;d=r;return}d=r}),!d)return;if(typeof n?.setModelId==`function`&&n.setModelId(d),se(d).reasoning){let t=O(e.requestDefaults?.reasoning?.effort)??`auto`,n=null;await e.withClack(async()=>{let r=await e.selectWithClack({message:`Select reasoning effort (Enter select · Esc cancel)`,options:[{value:`auto`,label:`auto`,hint:k(`auto`)},{value:`minimal`,label:`minimal`,hint:k(`minimal`)},{value:`low`,label:`low`,hint:k(`low`)},{value:`medium`,label:`medium`,hint:k(`medium`)},{value:`high`,label:`high`,hint:k(`high`)}],initialValue:t});r.ok&&(n=String(r.value??``))}),n&&(n===`auto`?`reasoning`in e.requestDefaults&&delete e.requestDefaults.reasoning:e.requestDefaults.reasoning={effort:n})}else `reasoning`in e.requestDefaults&&delete e.requestDefaults.reasoning;await e.saveAll();let f=O(e.requestDefaults?.reasoning?.effort),p=[ce(d),f?`[effort=${f}]`:``].filter(Boolean).join(` `);process.stdout.write(`${e.icon(`🤖`)}model set: ${e.provider}/${n.modelId}${p?` ${p}`:``}\n`);return}if(!r||r.toLowerCase()===`show`){let t=se(n.modelId),r=ce(n.modelId),i=O(e.requestDefaults?.reasoning?.effort),a=t.reasoning&&i?` [effort=${i}]`:``;process.stdout.write(`${e.icon(`🤖`)}model: ${e.provider}/${n.modelId}${r?` ${r}`:``}${a}\n`);return}typeof n?.setModelId==`function`&&n.setModelId(r),await e.saveAll();let i=se(n.modelId),a=ce(n.modelId),o=O(e.requestDefaults?.reasoning?.effort),s=i.reasoning&&o?` [effort=${o}]`:``;process.stdout.write(`${e.icon(`🤖`)}model set: ${e.provider}/${n.modelId}${a?` ${a}`:``}${s}\n`)},Mt=async({ctx:e,arg:t})=>{let n=String(t??``).split(/\s+/).filter(Boolean),r=String(n[0]??`payload`).toLowerCase(),i=String(n[1]??``).toLowerCase();if(r!==`payload`){process.stdout.write(`${e.icon(`❌`)}Usage: /debug payload [on|off|toggle]\n`);return}if(!i){process.stdout.write(`${e.icon(`🪲`)}debug payload: ${e.debugSendPayload.get()?`on`:`off`}\n`),process.stdout.write(`${e.ansi.dim(`Tip: set GOATCHAIN_DEBUG_SEND_PAYLOAD=1 to enable by default.`)}\n`);return}if(i!==`on`&&i!==`off`&&i!==`toggle`){process.stdout.write(`${e.icon(`❌`)}Usage: /debug payload [on|off|toggle]\n`);return}i===`toggle`?e.debugSendPayload.set(!e.debugSendPayload.get()):e.debugSendPayload.set(i===`on`),process.stdout.write(`${e.icon(`🪲`)}debug payload: ${e.debugSendPayload.get()?`on`:`off`}\n`)},Nt=async({ctx:e,arg:t})=>{let[n,...r]=String(t??``).split(/\s+/),i=Z(n,r.join(` `));if(!i.ok){process.stdout.write(`${e.icon(`❌`)}${i.error} (try /help)\n`);return}let a=kt(n);e.requestDefaults[a]=i.value,await e.saveAll(),process.stdout.write(`${e.icon(`⚙️`)}set ${a}=${i.value}\n`)},Pt=async({ctx:e,arg:t})=>{let n=kt(t);if(!n){process.stdout.write(`${e.icon(`❌`)}Missing key (try /help)\n`);return}if(!(n in e.requestDefaults)){process.stdout.write(`${e.icon(`❌`)}unknown key: ${t}\n`);return}delete e.requestDefaults[n],await e.saveAll(),process.stdout.write(`${e.icon(`⚙️`)}unset ${n}\n`)};function Ft(e){let t=new Map,n=(e,n)=>{let r=Array.isArray(e)?e:[e];for(let e of r)t.set(e,n)};return n(`help`,_t),n(`clear`,bt),n(`config`,vt),n([`multiline`,`ml`],Ye),n(`edit`,Xe),n([`exit`,`quit`],yt),n([`approvals`,`approval`],He),n(`tools`,xt),n(`mcp`,et),n(`status`,St),n(`model`,jt),n(`params`,At),n(`preview`,ot),n(`debug`,Mt),n(`set`,Nt),n(`unset`,Pt),n([`api-key`,`key`],Ge),n([`web-search-key`,`serper-key`],Ke),n(`base-url`,qe),n(`save`,Ct),n(`workspace`,X),n(`files`,wt),n(`images`,Tt),n(`settings`,Et),n(`output`,Dt),n(`agent`,q),n(`plan`,Je),n([`diag`,`diagnostics`],Ot),n(`clipboard`,Ue),n(`compact`,We),n(`new`,pt),n(`sessions`,mt),n([`rm`,`delete`],ht),n(`use`,gt),n(`history`,J),t}const It=[`[attached images]`,`(Images are included below as image blocks (base64). Do not call tools to read/search files on disk; use the attached image blocks directly.)`,`{{items}}`].join(`
18
+ `);function Lt(e){return!!(e&&typeof e==`object`&&e.type===`text`)}function Rt(e){return!!(e&&typeof e==`object`&&e.type===`image`)}function zt(e){if(typeof e==`string`){let t=e;return t.trim()?[{type:`text`,text:t}]:[]}return e?Array.isArray(e)?[...e]:[e]:[]}function Bt(e,t,n){let r=Array.isArray(e)?e:[],i=Array.isArray(t)?t.filter(Boolean):[];if(i.length===0)return r;let a=r.findIndex(Rt),o=(()=>{for(let e=r.length-1;e>=0;e--)if(Rt(r[e]))return e;return-1})(),s=r.findIndex(Lt),c=(()=>{for(let e=r.length-1;e>=0;e--)if(Lt(r[e]))return e;return-1})(),l=(()=>{switch(n){case`start`:return 0;case`end`:return r.length;case`before_images`:return a===-1?0:a;case`after_images`:return o===-1?r.length:o+1;case`before_text`:return s===-1?0:s;case`after_text`:return c===-1?r.length:c+1;default:return r.length}})();return[...r.slice(0,l),...i,...r.slice(l)]}function Vt(e){let t=String(e??``).trim();return t?S.basename(t)||t:``}function Q(e,t={}){let n=typeof t.template==`string`&&t.template.trim()?t.template:It,r=(()=>{let e=String(t.dataUrlMode??``).trim().toLowerCase();return e===`none`||e===`prefix`||e===`full`?e:`prefix`})(),i=typeof t.maxDataUrlChars==`number`&&Number.isFinite(t.maxDataUrlChars)?Math.max(0,Math.trunc(t.maxDataUrlChars)):8e3,a=e.map((e,t)=>{let n=String(e.id??`image_${t+1}`).trim()||`image_${t+1}`;return{id:n,name:Vt(e.name)||n,mimeType:String(e.mimeType??``).trim()||`application/octet-stream`,base64:String(e.base64??``)}}).filter(e=>e.base64);if(a.length===0)return``;let o=[];for(let e of a){let t=e.base64.length;if(o.push(`- ${e.id}: name=${e.name} mime=${e.mimeType} base64Chars=${t}`),r!==`none`){let t=`data:${e.mimeType};base64,${e.base64}`;if(r===`full`)o.push(` data_url=${t}`);else{let e=i>0&&t.length>i?`${t.slice(0,Math.min(120,i))}…`:t;o.push(` data_url=${e}`),i>0&&t.length>i&&o.push(` (full data_url omitted: too large)`)}}}let s=JSON.stringify(a.map(e=>({id:e.id,name:e.name,mimeType:e.mimeType,base64Chars:e.base64.length})),null,2);return n.replaceAll(`{{count}}`,String(a.length)).replaceAll(`{{items}}`,o.join(`
19
+ `)).replaceAll(`{{json}}`,s).trim()}function Ht(e){let t=zt(e.content),n=e.imageBlocks??[],r=Array.isArray(e.imageNames)?e.imageNames:[],i=Q(n.map((e,t)=>({id:`image_${t+1}`,name:Vt(r[t]??`image_${t+1}`),mimeType:String(e.mimeType??``),base64:String(e.data??``)})),e.options?.note),a=i?{type:`text`,text:i}:null,o=e.options?.imagesPosition??`before_text`,s=e.options?.notePosition??`start`,c=t;return c=Bt(c,n,o),a&&(c=Bt(c,[a],s)),{modelInput:c.length>0?c:typeof e.content==`string`?e.content:``,noteText:i}}function Ut(e){let t=String(e??``),n=[],r=/@image:/gi,i;for(;(i=r.exec(t))!=null;){let e=i.index,a=e+i[0].length;if(a>=t.length)continue;let o=t[a];if(o===`"`||o===`'`){a++;let i=``;for(;a<t.length;){let e=t[a];if(e===`\\`&&a+1<t.length){i+=t[a+1],a+=2;continue}if(e===o)break;i+=e,a++}if(a>=t.length||t[a]!==o)continue;let s=t.slice(e,a+1),c=i.trim();if(!c)continue;n.push({raw:s,filePath:c}),r.lastIndex=a+1;continue}let s=a;for(;s<t.length&&!/\s/.test(t[s]);)s++;let c=t.slice(e,s),l=t.slice(a,s).trim();l&&(n.push({raw:c,filePath:l}),r.lastIndex=s)}return n}function Wt(e,t){let n=String(e??``).match(/^data:([^;]+);base64,(.+)$/);if(!n)return null;let r=String(n[1]??t??`application/octet-stream`),i=String(n[2]??``);return!r||!i?null:{type:`image`,mimeType:r,data:i}}async function Gt(e){let t=String(e.inputText??``),n=Ut(t);if(n.length===0)return{cleanedText:t.trim(),attachments:[]};let r=typeof e.maxBytes==`number`?e.maxBytes:4*1024*1024,i=new Map;for(let e of n){let t=e.filePath;i.has(t)||i.set(t,e)}let a=[];for(let t of i.values()){let{absPath:n,withinWorkspace:i}=Se(e.workspaceCwd,t.filePath),o=await L(n,r);if(!o){let e=await ee(n);throw e.isFile()&&e.size>r?Error(`Image too large (${Math.round(e.size/1024)} KB): ${t.filePath}`):Error(`Not a supported image path: ${t.filePath}`)}a.push({name:i?S.relative(e.workspaceCwd,n):S.basename(n),mime:String(o.mime),bytes:Buffer.isBuffer(o.buf)?o.buf.byteLength:0,dataUrl:String(o.dataUrl),source:i?`path`:`paste`})}let o=t;for(let e of n)o=o.replace(e.raw,``).replace(/\s{2,}/g,` `);return o=o.trim(),{cleanedText:o,attachments:a}}function Kt(e,t){let n=[],r=new Set,i=(e,i)=>{if(n.length>=t)return;let a=String(i??``).trim();if(!a)return;let o=a.toLowerCase();r.has(o)||(r.add(o),n.push({raw:e,path:a}))},a=/(["'])([^"'\\]*(?:\\.[^"'\\]*)*\.(?:png|jpe?g|webp|gif|bmp|tiff?))\1/gi,o;for(;(o=a.exec(e))!=null;)i(o[0],o[2]??``);let s=/(?:^|\s)(file:\/\/\S+?\.(?:png|jpe?g|webp|gif|bmp|tiff?)|~\/(?:\\.|\S)+\.(?:png|jpe?g|webp|gif|bmp|tiff?)|\/(?:\\.|\S)+\.(?:png|jpe?g|webp|gif|bmp|tiff?))(?:\s|$)/gi,c;for(;(c=s.exec(e))!=null;){let e=String(c[1]??``);e&&i(e,e)}return n}async function $(e){let t=String(e.inputText??``).trim();if(!t)return{cleanedText:t,attachments:[]};let n=typeof e.maxInline==`number`?e.maxInline:8,r=Kt(t,n);if(r.length===0)return{cleanedText:t,attachments:[]};let i=[];for(let n of r)try{let{absPath:r,withinWorkspace:a}=Se(e.workspaceCwd,n.path),o=await L(r);if(!o?.dataUrl)continue;i.push({name:a?S.relative(e.workspaceCwd,r):S.basename(r),mime:String(o.mime),bytes:Buffer.isBuffer(o.buf)?o.buf.byteLength:0,dataUrl:String(o.dataUrl),source:a?`path`:`paste`}),t=t.replace(n.raw,``).replace(/\s{2,}/g,` `).trim()}catch{}return{cleanedText:t,attachments:i}}async function qt(e){let t=String(e.inputText??``).trim(),n=t,r=await Gt({inputText:n,workspaceCwd:e.workspaceCwd});n=r.cleanedText;let i=await $({inputText:n,workspaceCwd:e.workspaceCwd});n=i.cleanedText;let a=[...r.attachments,...Array.isArray(e.pendingImages)?e.pendingImages:[],...i.attachments],o=[],s=[];for(let e of a){let t=Wt(e.dataUrl,e.mime);t&&(o.push(t),s.push(String(e?.name??``).trim()||`image_${o.length}`))}let c=n,l=o.length>0;return{rawInput:t,cleanedText:c,historyContent:l?[c,`[attached images]`,...s.map((e,t)=>`- image_${t+1}_name: ${Vt(e)||`image_${t+1}`}`)].filter(Boolean).join(`
20
+ `):c,modelInput:l?Ht({content:c,imageBlocks:o,imageNames:s,options:e.attachImagesOptions}).modelInput:c,imageNames:s,imageCount:s.length}}function Jt(e){return!e||typeof e!=`object`?!1:typeof e.source==`string`}function Yt(e,t){return{maybeAutoAttachImageFromPastedPathToken:n=>{let r=t.now();e.lastPathAutoAttachAt>0&&r-e.lastPathAutoAttachAt<700||(e.lastPathAutoAttachAt=r,t.scheduleAsync(async()=>{try{let{absPath:i}=t.resolveUserProvidedPathForRead(t.workspaceCwd(),n),a=await t.readImageFileAsDataUrl(i);a?.dataUrl&&String(a.mime).startsWith(`image/`)&&(t.addPendingImages([{name:S.basename(i),mime:String(a.mime),bytes:Buffer.isBuffer(a.buf)?a.buf.byteLength:0,dataUrl:String(a.dataUrl)}],`paste`),e.lastPastedImageName={name:S.basename(i),at:r},(t.stripTokenOnceFromLine(n)||t.stripLeadingImageNameFromLine())&&t.refreshLine(),t.showInlineHint(`Attached image from path: ${S.basename(i)}`))}catch{}}))},maybeAutoAttachClipboardForPastedName:n=>{let r=t.now();if(e.lastClipboardAutoAttachAt>0&&r-e.lastClipboardAutoAttachAt<700)return;e.lastClipboardAutoAttachAt=r;let i=t.normalizeStandaloneImageName(n);i&&(e.lastPastedImageName={name:i,at:t.now()},!e.clipboardAttachInFlight&&(e.clipboardAttachInFlight={name:i,startedAt:r},t.refreshPrompt(),t.scheduleAsync(async()=>{let n=!1;try{let e=await t.readClipboardImageCandidatesDarwin();if(!Array.isArray(e)||e.length===0){let e=await t.getWorkspaceImages(),r=i.toLowerCase(),a=e.filter(e=>S.basename(String(e)).toLowerCase()===r).slice(0,8);if(a.length===1){let e=String(a[0]),r=t.ensureAllowedFile(t.workspaceCwd(),e),o=await t.readImageFileAsDataUrl(r);o?.dataUrl&&String(o.mime).startsWith(`image/`)&&(t.addPendingImages([{name:S.basename(e),mime:String(o.mime),bytes:Buffer.isBuffer(o.buf)?o.buf.byteLength:0,dataUrl:String(o.dataUrl)}],`path`),n=!0,(t.stripTokenOnceFromLine(i)||t.stripLeadingImageNameFromLine())&&t.refreshLine(),t.showInlineHint(`Attached image from workspace: ${S.basename(e)}`))}if(n)return;let o=await t.readFinderSelectionPathsDarwin();if(Array.isArray(o)&&o.length>0){let e=o.find(e=>S.basename(String(e)).toLowerCase()===r)??(o.length===1?o[0]:null);if(e){let r=await t.readImageFileAsDataUrl(String(e));r?.dataUrl&&String(r.mime).startsWith(`image/`)&&(t.addPendingImages([{name:S.basename(String(e)),mime:String(r.mime),bytes:Buffer.isBuffer(r.buf)?r.buf.byteLength:0,dataUrl:String(r.dataUrl)}],`paste`),n=!0,(t.stripTokenOnceFromLine(i)||t.stripLeadingImageNameFromLine())&&t.refreshLine(),t.showInlineHint(`Attached image from Finder selection: ${S.basename(String(e))}`))}}return}let r=i.toLowerCase(),a=e.filter(e=>Jt(e)&&e.source===`file`&&e.absPath),o=a.find(e=>S.basename(String(e.absPath)).toLowerCase()===r)??(a.length===1?a[0]:null)??(e.length===1?e[0]:null);if(!o||!o?.dataUrl||typeof o.dataUrl!=`string`||!o.dataUrl.startsWith(`data:image/`))return;t.addPendingImages([{name:S.basename(String(o.absPath??i)),mime:String(o.mime??`image/png`),bytes:Buffer.isBuffer(o.buf)?o.buf.byteLength:0,dataUrl:String(o.dataUrl)}],`paste`),n=!0,(t.stripTokenOnceFromLine(i)||t.stripLeadingImageNameFromLine())&&t.refreshLine(),t.showInlineHint(`Attached image: ${S.basename(String(o.absPath??i))}`)}catch{}finally{e.clipboardAttachInFlight=null,t.refreshPrompt(),n||t.showInlineHint(`${t.icon(`💡`)}Tip: clipboard is text-only. In Finder, select the file (not rename text) then Cmd+C; or drag & drop; or use /images.`)}})))}}}function Xt(e,t){let n={active:!!e?.active,buffer:String(e?.buffer??``)},r=String(t??``),i=``,a=[],o=!1;for(;r.length>0;){if(!n.active){let e=r.indexOf(`\x1B[200~`);if(e===-1){i+=r,r=``;break}i+=r.slice(0,e),r=r.slice(e+6),n={active:!0,buffer:``};continue}let e=r.indexOf(`\x1B[201~`);if(e===-1){n.buffer+=r,i+=r,r=``,(n.buffer.includes(`
21
+ `)||n.buffer.includes(`\r`))&&(o=!0);break}let t=r.slice(0,e);n.buffer+=t,i+=t,r=r.slice(e+6),(t.includes(`
22
+ `)||t.includes(`\r`))&&(o=!0),a.push(n.buffer),n={active:!1,buffer:``}}return{state:n,forward:i,completed:a,sawNewlineInPaste:o}}function Zt(e){let t=String(e??``).trim();if(!t||t.length>260||(t=t.replace(/^\u001B\[200~/,``).replace(/\u001B\[201~$/,``).trim(),t=t.replace(/[\u200B\u200C\u200D\uFEFF]/g,``),t.includes(`
23
+ `)||t.includes(`\r`))||t.includes(`/`)||t.includes(`\\`))return null;t=t.replace(/^["'`]+|["'`]+$/g,``).trim();let n=t.match(/^(.*?)\s*\.\s*(png|jpe?g|webp|gif|bmp|tiff?|heic)$/i);if(!n)return null;let r=String(n[1]??``).trim(),i=String(n[2]??``).trim().toLowerCase();return r?`${r}.${i}`:null}function Qt(e){let t=String(e??``).trim();if(!t||t.length>4096||(t=t.replace(/^\u001B\[200~/,``).replace(/\u001B\[201~$/,``).trim(),t=t.replace(/[\u200B\u200C\u200D\uFEFF]/g,``),!t)||t.includes(`
24
+ `)||t.includes(`\r`))return null;let n=xe(t);if(!n)return null;let r=n.toLowerCase();return!/\.(png|jpe?g|webp|gif|bmp|tiff?)$/.test(r)||!S.isAbsolute(n)&&!n.includes(`/`)&&!n.includes(`\\`)?null:t}const $t=`\x1B]1337;File=`;function en(e,t){let n=e.indexOf(`\x07`,t),r=e.indexOf(`\x1B\\`,t);return n===-1&&r===-1?{idx:-1,len:0}:n===-1?{idx:r,len:2}:r===-1||n<r?{idx:n,len:1}:{idx:r,len:2}}function tn(e){try{return Buffer.from(String(e??``),`base64`).toString(`utf8`)}catch{return``}}function nn(e){try{let t=Buffer.from(String(e??``).slice(0,96),`base64`);if(t.length>=8){if(t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10)return{mime:`image/png`,ext:`.png`};if(t[0]===255&&t[1]===216&&t[2]===255)return{mime:`image/jpeg`,ext:`.jpg`};if(t[0]===71&&t[1]===73&&t[2]===70&&t[3]===56)return{mime:`image/gif`,ext:`.gif`};if(t.length>=12){let e=t.subarray(0,4).toString(`ascii`),n=t.subarray(8,12).toString(`ascii`);if(e===`RIFF`&&n===`WEBP`)return{mime:`image/webp`,ext:`.webp`}}}}catch{}return{mime:`application/octet-stream`,ext:``}}function rn(e,t){let n=String(e??``).toLowerCase();return n.endsWith(`.png`)?{mime:`image/png`,ext:`.png`}:n.endsWith(`.jpg`)||n.endsWith(`.jpeg`)?{mime:`image/jpeg`,ext:`.jpg`}:n.endsWith(`.webp`)?{mime:`image/webp`,ext:`.webp`}:n.endsWith(`.gif`)?{mime:`image/gif`,ext:`.gif`}:nn(t)}function an(e){let t=e.indexOf($t);if(t<0)return null;let n=(e.endsWith(`\x07`)?e.slice(0,-1):e.endsWith(`\x1B\\`)?e.slice(0,-2):e).slice(t+12),r=n.indexOf(`:`);if(r<0)return null;let i=n.slice(0,r),a=n.slice(r+1).replace(/\s+/g,``);if(!a)return null;let o={};for(let e of i.split(`;`)){let[t,...n]=e.split(`=`);t&&(o[t]=n.join(`=`))}let s=o.name?tn(o.name):``,c=s?S.basename(s):``,l=o.size?Number(o.size):void 0,{mime:u,ext:d}=rn(c,a);return{name:c||`pasted-image${d||``}`,mime:u,bytes:typeof l==`number`&&Number.isFinite(l)?l:(()=>{try{return Buffer.from(a,`base64`).byteLength}catch{return 0}})(),dataUrl:`data:${u};base64,${a}`}}function on(e,t=``){let n=`${String(t??``)}${String(e??``)}`;if(!n.includes($t))return{text:String(e??``),files:[],buffer:``};let r=``,i=[],a=0;for(;;){let e=n.indexOf($t,a);if(e===-1){r+=n.slice(a);break}r+=n.slice(a,e);let t=en(n,e);if(t.idx===-1)return{text:r,files:i,buffer:n.slice(e)};let o=an(n.slice(e,t.idx+t.len));o&&i.push(o),a=t.idx+t.len}return{text:r,files:i,buffer:``}}function sn(e,t=``){let n=on(e,t),r=n.buffer,i=!!n.text&&(!r||n.text.trim().length>0);return{buffer:r,files:n.files,textToForward:i?n.text:null}}function cn(e){let t=e.currentMode===`plan`?`[PLAN] `:`[AGENT] `,n=e.uiMode===`select_session`?`session> `:e.uiMode===`select_workspace`?`workspace> `:e.multiline?`... `:`${t}user> `;if(e.uiMode!==`select_session`&&e.stdoutIsTTY&&(e.pendingImagesCount>0||e.clipboardAttachName||e.multiline)){let t=[];e.pendingImagesCount>0&&t.push(`images:${e.pendingImagesCount}`),e.clipboardAttachName&&t.push(`attaching:${e.clipboardAttachName}`),e.multiline&&t.push(`multiline`);let r=t.join(` `);return r?`${r} ${n}`:n}return n}const ln=`help.exit.quit.clear.approvals.approval.tools.mcp.status.model.preview.debug.edit.multiline.ml.params.set.unset.api-key.key.web-search-key.serper-key.base-url.config.save.new.workspace.files.images.settings.output.agent.plan.diag.diagnostics.sessions.use.history.rm.delete.clipboard.compact`.split(`.`),un={help:`Show help`,exit:`Exit`,quit:`Exit`,clear:`Clear pending attachments`,approvals:`Select approval mode`,approval:`Alias for /approvals`,tools:`List enabled tools`,mcp:`MCP servers (connect/tools/status)`,status:`Show current session/model info`,model:`Show/set model`,preview:`Preview next send payload`,debug:`Debug options`,edit:`Compose a message in $EDITOR`,multiline:`Start multiline input (.send/.cancel)`,ml:`Alias for /multiline`,params:`Show current request params`,set:`Set request param (maxTokens/temperature/...)`,unset:`Clear request param`,"api-key":`Set API key for this process`,key:`Alias for /api-key`,"web-search-key":`Set Serper API key for WebSearch tool`,"serper-key":`Alias for /web-search-key`,"base-url":`Set base URL (proxy)`,config:`Print full config (secrets redacted)`,save:`Save current session/config`,new:`Start a new conversation (clears history)`,workspace:`Switch workspace root`,files:`Attach file(s)`,images:`Attach image(s)`,settings:`Base URL / API key / tokens`,output:`Output & UX options`,agent:`Switch to agent mode (normal operation)`,plan:`Switch to plan mode (read-only planning)`,diag:`Show last turn stop reason + tool calls`,diagnostics:`Alias for /diag (same output)`,sessions:`List/pick/delete sessions`,use:`Switch session (restore history)`,history:`Show session message history (use /history all)`,rm:`Delete session(s)`,delete:`Alias for /rm`,clipboard:`Clipboard helpers`,compact:`Compress context (generate summary)`};function dn(e,t){let n=String(e??``),r=String(t??``),i=n.length,a=r.length;if(i===0)return a;if(a===0)return i;let o=Array(a+1),s=Array(a+1);for(let e=0;e<=a;e++)o[e]=e;for(let e=1;e<=i;e++){s[0]=e;let t=n.charCodeAt(e-1);for(let e=1;e<=a;e++){let n=t===r.charCodeAt(e-1)?0:1;s[e]=Math.min(o[e]+1,s[e-1]+1,o[e-1]+n)}for(let e=0;e<=a;e++)o[e]=s[e]}return o[a]}function fn(e){return/^[a-z0-9][a-z0-9_-]*$/.test(e)}function pn(e){let t=String(e??``).trim().toLowerCase();if(!t)return{kind:`empty`,cmd:``};if(!fn(t))return{kind:`none`,cmd:``};if(ln.includes(t))return{kind:`exact`,cmd:t};let n=ln.filter(e=>e.startsWith(t));if(n.length===1)return{kind:`prefix`,cmd:n[0],matches:n};if(n.length>1)return{kind:`ambiguous`,cmd:``,matches:n};let r=t.length<=4?1:2,i=ln.filter(e=>e[0]===t[0]).map(e=>({c:e,d:dn(t,e)})).filter(e=>e.d<=r).sort((e,t)=>e.d-t.d||e.c.localeCompare(t.c)).slice(0,5).map(e=>e.c);if(i.length>0)return{kind:`fuzzy`,cmd:``,matches:i};if(t.length>=3){let e=ln.filter(e=>e.includes(t)).slice(0,5);if(e.length>0)return{kind:`contains`,cmd:``,matches:e}}return{kind:`none`,cmd:``}}function mn(e){let t=String(e??``).trimStart();if(/\s/.test(t))return[];if(t.startsWith(`/`)){let e=t.slice(1).toLowerCase();return ln.filter(t=>t.startsWith(e)).map(e=>`/${e}`)}return[]}function hn(e){return e.startsWith(`/`)?un[e.slice(1).toLowerCase()]??``:``}function gn(e){let t=Math.max(0,Math.floor(e.total)),n=Math.max(0,Math.floor(e.maxShow)),r=Math.max(0,Math.min(t>0?t-1:0,Math.floor(e.index))),i=Math.min(n,t),a=i===0?0:Math.max(0,Math.min(r-Math.floor(i/2),Math.max(0,t-i)));return{windowStart:a,visibleCount:i,above:a,below:Math.max(0,t-(a+i))}}function _n(e){let t=Math.max(0,Number.isFinite(e.rows)?e.rows:0),n=Math.max(0,Number.isFinite(e.columns)?e.columns:0),r=Array.isArray(e.frameLines)?e.frameLines:[],i=[];if(i.push(`\x1B[?25l`),!e.prevFrame||e.prevFrame.rows!==t||e.prevFrame.columns!==n){i.push(`\x1B[2J\x1B[H`);for(let n=0;n<t;n++)n>0&&i.push(`
25
+ `),i.push(e.renderLine(r[n]??``))}else{let n=e.prevFrame.lines;for(let a=0;a<t;a++){let t=r[a]??``;(n[a]??``)!==t&&(i.push(`\u001B[${a+1};1H`),i.push(e.renderLine(t)))}}let a=Math.max(1,Math.min(t,Number.isFinite(e.promptRow)?e.promptRow:t)),o=Math.max(1,Math.min(n||1,Number.isFinite(e.promptCol)?e.promptCol:1));return i.push(`\u001B[${a};${o}H`),i.push(`\x1B[?25h`),{output:i.join(``),nextFrame:{rows:t,columns:n,lines:r.slice(0,t)}}}function vn(e,t){return t===`return`||t===`enter`||e===`\r`||e===`
26
+ `}function yn(e,t){return t===`tab`||e===` `}function bn(e){let{uiMode:t,raw:n,keyName:r,line:i,getDropdownOptions:a}=e,o=e.dropdown,s=r===`up`,c=r===`down`,l=r===`escape`,u=r===`left`,d=r===`right`,f=yn(n,r),p=vn(n,r);if(!o&&(s||c)){let e=a();if(e.length>0)return o={options:e,index:c?0:Math.max(0,e.length-1),usedNavigation:!0},{handled:!0,dropdown:o,actions:[{type:`setDropdown`,dropdown:o}],refresh:!0,scheduleDropdownRender:!0}}if(o&&o.options.length>0){if(l)return{handled:!0,dropdown:null,actions:[{type:`clearDropdown`}],refresh:!1,scheduleDropdownRender:!1};if(u||d)return{handled:!0,dropdown:null,actions:[{type:`clearDropdown`},{type:`callOrig`}],refresh:!1,scheduleDropdownRender:!1};if(s||c){let e=o.options.length,t=c?1:-1,n=e>0?((o.index+t)%e+e)%e:0;return o={...o,index:n,usedNavigation:!0},{handled:!0,dropdown:o,actions:[{type:`updateDropdown`,dropdown:o}],refresh:!0,scheduleDropdownRender:!0}}if(f){let e=o.options[o.index]??null;if(e){let n=String(i??``).trimStart().startsWith(`@`)?`${e} `:e;return{handled:!0,dropdown:null,actions:[{type:`applyLine`,line:n,cursor:n.length},{type:`clearDropdown`}],refresh:!0,scheduleDropdownRender:t!==`select_workspace`}}}if(p){let e=o.options[o.index]??null;if(t===`select_workspace`){if(e){let t=e;return{handled:!0,dropdown:null,actions:[{type:`applyLineAndCallOrig`,line:t,cursor:t.length},{type:`clearDropdown`}],refresh:!0,scheduleDropdownRender:!1}}return{handled:!0,dropdown:o,actions:[{type:`none`}],refresh:!1,scheduleDropdownRender:!1}}let n=String(i??``).trimStart();if(n.startsWith(`@`)){if(e){let t=`${e} `;return{handled:!0,dropdown:null,actions:[{type:`applyLine`,line:t,cursor:t.length},{type:`clearDropdown`}],refresh:!0,scheduleDropdownRender:!0}}return{handled:!0,dropdown:o,actions:[{type:`none`}],refresh:!1,scheduleDropdownRender:!1}}let r=n.toLowerCase(),a=String(e??``).toLowerCase(),s=!!e&&n!==`@`&&n!==`/`&&n.length>=2&&a.startsWith(r)&&a!==r;if(o.usedNavigation||s)return{handled:!0,dropdown:null,actions:[{type:`clearDropdownAndAccept`,suggestion:String(e??``)}],refresh:!0,scheduleDropdownRender:!1}}}return{handled:!1,dropdown:o,actions:[{type:`none`}],refresh:!1,scheduleDropdownRender:!1}}function xn(e,t){let{ansi:n,formatOneLine:r,getSuggestionDescription:i,isWorkspaceRootPath:a}=t,{kind:o,isWorkspace:s,isPath:c,visible:l,windowStart:u,selectedIndex:d,labelWidth:f,descMax:p,above:m,below:h}=e,g=[];g.push(n.dim(s||c?c?`${o} — ↑/↓ navigate · Enter switch · Tab fill · Esc close`:`${o} — ↑/↓ navigate · Enter insert · Tab insert · Esc close`:`${o} — ↑/↓ navigate · Enter run · Tab fill · Esc close`));for(let e=0;e<l.length;e++){let t=l[e],o=u+e===d,m=s&&String(t).startsWith(`@`)?String(t).slice(1):String(t),h=` ${(c&&a(t)?`★ ${m}`:m).padEnd(f)} `,_=o?n.inverse(h):n.bold(h),v=s||c?String(t).endsWith(`/`)||String(t).endsWith(`\\`)?c&&a(t)?`dir · recommended`:`dir`:`file`:i(t),y=v&&p>=14?n.dim(r(v,p)):``;g.push(y?`${n.dim(` `)}${_} ${y}`:`${n.dim(` `)}${_}`)}if(m>0||h>0){let e=[m>0?`+${m} above`:``,h>0?`+${h} more`:``].filter(Boolean);g.push(n.dim(` … ${e.join(` · `)}`))}return g}function Sn(e,t){let n=Math.max(0,Number.isFinite(e)?e:0),r=Math.max(0,Number.isFinite(t)?t:0);return Math.max(0,n-r)}function Cn(e,t,n){let r=Sn(t,n),i=Math.max(0,Number.isFinite(e)?e:0);return Math.max(0,Math.min(i,r))}function wn(e){let t=Array.isArray(e.lines)?e.lines:[],n=Math.max(0,Number.isFinite(e.viewportRows)?e.viewportRows:0),r=t.length,i=Cn(Number.isFinite(e.scrollOffset)?e.scrollOffset:0,r,n),a=Math.max(0,r-i),o=Math.max(0,a-n),s=n>0?t.slice(o,a):[];return{safeOffset:i,start:o,end:a,visible:s,padTop:Math.max(0,n-s.length)}}function Tn(e){let t=!1,n=()=>!(!e.supportsAltScreen()||!e.stdin.isTTY||e.env.GOATCHAIN_NO_MOUSE===`1`);return{enable:()=>{n()&&(t||=(e.stdout.write(`\x1B[?1000h\x1B[?1002h\x1B[?1006h`),!0))},disable:()=>{e.stdout.isTTY&&(t&&=(e.stdout.write(`\x1B[?1006l\x1B[?1002l\x1B[?1000l`),!1))},isEnabled:()=>t}}function En(e){let t=e.overlay;if(!t||e.logAreaRows<5||e.columns<20)return[];let n=Math.max(0,Number.isFinite(e.columns)?e.columns:0),r=Math.min(n,80),i=Math.max(20,Math.min(r,n-2)),a=Math.max(2,i-2),o=Math.max(0,Math.floor((n-i)/2)),s=` `.repeat(o),c=`${s}${e.accent(`╭`)}${e.accent(`─`.repeat(a))}${e.accent(`╮`)}`,l=`${s}${e.accent(`╰`)}${e.accent(`─`.repeat(a))}${e.accent(`╯`)}`,u=`${s}${e.accent(`├`)}${e.accent(`─`.repeat(a))}${e.accent(`┤`)}`,d=String(t.title??``).trim()||`Status`,f=e.ansi.bold(d),p=e.displayWidth(e.stripAnsi(d)),m=Math.max(0,a-2-p),h=`${s}${e.accent(`│`)} ${f}${` `.repeat(m)} ${e.accent(`│`)}`,g=Math.max(1,Math.min(t.lines.length,e.logAreaRows-4)),_=t.lines.length>g,v=t.lines.slice(0,g).map(t=>{let n=e.sliceToColumnsAnsi(String(t??``),Math.max(0,a-2)),r=e.displayWidth(e.stripAnsi(n)),i=Math.max(0,a-2-r);return`${s}${e.accent(`│`)} ${n}${` `.repeat(i)} ${e.accent(`│`)}`});if(_&&v.length>0){let n=e.ansi.dim(`… +${t.lines.length-g} more`),r=e.sliceToColumnsAnsi(n,Math.max(0,a-2)),i=e.displayWidth(e.stripAnsi(r)),o=Math.max(0,a-2-i);v[v.length-1]=`${s}${e.accent(`│`)} ${r}${` `.repeat(o)} ${e.accent(`│`)}`}return[c,h,u,...v,l]}function Dn(e){let{canShow:t,scheduleRender:n,setTimeoutFn:r,clearTimeoutFn:i}=e,a=null,o=null,s=()=>{a&&(a=null,o&&=(i(o),null),n())};return{get:()=>a,show:(e,c=12e3)=>{if(!t()){s();return}a=e,n(),o&&i(o),o=r(()=>{s()},Math.max(500,c)),o?.unref?.()},clear:s}}function On(e,t,n,r){if(!e||t<=0)return[];let{ansi:i,formatOneLine:a,getSuggestionDescription:o,isWorkspaceRootPath:s}=r,c=e.kind,l=c===`Workspace`,u=c===`Paths`,d=[];d.push(i.dim(l?`${c} (↑/↓ select · Enter insert · Tab insert · Esc close)`:u?`${c} (↑/↓ select · Enter switch · Tab fill · Esc close)`:`${c} (↑/↓ select · Enter run · Tab fill · Esc close)`));let f=Math.max(0,t-1);if(f===0)return d;let p=Math.min(6,e.options.length,f);e.options.length>p&&f-p>=1&&(p=Math.min(p,f-1));let m=e.options.length,h=Math.max(0,Math.min(e.index-Math.floor(p/2),Math.max(0,m-p))),g=e.options.slice(h,h+p),_=Math.min(28,Math.max(...g.map(e=>{let t=l&&String(e).startsWith(`@`)?String(e).slice(1):String(e);return(u&&s(e)?`★ ${t}`:t).length}),10)),v=Math.max(0,n-(2+_+1+2));for(let t=0;t<g.length;t++){let n=g[t],r=h+t===e.index,c=l&&String(n).startsWith(`@`)?String(n).slice(1):String(n),f=` ${(u&&s(n)?`★ ${c}`:c).padEnd(_)} `,p=r?i.inverse(f):i.bold(f),m=l||u?String(n).endsWith(`/`)||String(n).endsWith(`\\`)?u&&s(n)?`dir · recommended`:`dir`:`file`:o(n),y=m&&v>=14?i.dim(a(m,v)):``;d.push(y?`${i.dim(` `)}${p} ${y}`:`${i.dim(` `)}${p}`)}f=Math.max(0,t-d.length);let y=h,b=Math.max(0,m-(h+g.length));if((y>0||b>0)&&f>=1){let e=[y>0?`+${y} above`:``,b>0?`+${b} more`:``].filter(Boolean);d.push(i.dim(` … ${e.join(` · `)}`))}return d.slice(0,t)}function kn(e){let t=String(e??``),n=t.match(/^\u001B\[<(\d+);(\d+);(\d+)([mM])/);if(!n)return null;let r=Number.parseInt(n[1]??``,10),i=Number.parseInt(n[2]??``,10),a=Number.parseInt(n[3]??``,10),o=n[4]===`m`;return!Number.isFinite(r)||!Number.isFinite(i)||!Number.isFinite(a)?null:{event:{b:r,x:i,y:a,up:o},rest:t.slice(n[0].length)}}function An(e){return e.b===64?1:e.b===65?-1:0}function jn(e){let t=Math.max(1,Number.isFinite(e.step)?e.step:3),n=String(e.input??``),r=Number.isFinite(e.scrollOffset)?e.scrollOffset:0,i=!1;for(;n.length>0;){let a=kn(n);if(!a)break;let o=An(a.event);o!==0&&(r=Cn(r+o*t,e.totalLines,e.viewportRows),i=!0),n=a.rest}return{handled:i,scrollOffset:r,rest:n}}function Mn(e){let t=String(e??``);return t?t===`\x1B`||t===`\x1B[`||t===`\x1B[<`?!0:t.startsWith(`\x1B[<`)?/^\u001B\[<\d*(?:;\d*){0,2}$/.test(t):!1:!1}function Nn(e){let t=Math.max(8,Number.isFinite(e.maxBufferChars)?e.maxBufferChars:96),n=jn({input:`${String(e.buffered??``)}${String(e.inputChunk??``)}`,scrollOffset:e.scrollOffset,totalLines:e.totalLines,viewportRows:e.viewportRows,step:e.step});if(Mn(n.rest)){let e=n.rest.length>t?``:n.rest;return{handled:n.handled,scrollOffset:n.scrollOffset,rest:``,buffered:e}}return{handled:n.handled,scrollOffset:n.scrollOffset,rest:n.rest,buffered:``}}const Pn=T(w);async function Fn(e,t){try{let{stdout:n}=await Pn(`git`,t,{cwd:e,encoding:`utf8`,maxBuffer:20*1024*1024});return{ok:!0,stdout:String(n??``)}}catch(e){return e&&typeof e==`object`&&`stdout`in e?{ok:!1,stdout:String(e.stdout??``)}:{ok:!1,stdout:``}}}function In(e){let t=new Map,n=String(e??``).split(`
27
+ `);for(let e of n){let n=e.trimEnd();if(!n)continue;let r=e=>e===` `||e===` `,i=0;for(;i<n.length&&!r(n[i]);)i++;let a=n.slice(0,i);for(;i<n.length&&r(n[i]);)i++;let o=i;for(;i<n.length&&!r(n[i]);)i++;let s=n.slice(o,i);for(;i<n.length&&r(n[i]);)i++;let c=n.slice(i);if(!a||!s||!c)continue;let l=a===`-`?null:Number(a),u=s===`-`?null:Number(s);t.set(c,{added:Number.isFinite(l)?l:null,deleted:Number.isFinite(u)?u:null})}return t}function Ln(e){let t=new Set,n=Buffer.from(e??``,`utf8`).toString(`utf8`).split(`\0`);for(let e of n){let n=String(e??``).trim();n&&t.add(n)}return t}function Rn(e,t){let n=new Map,r=new Set([...e.keys(),...t.keys()]);for(let i of r){let r=e.get(i),a=t.get(i);if(!r&&!a)continue;let o=r?.added===null||a?.added===null?null:(r?.added??0)+(a?.added??0),s=r?.deleted===null||a?.deleted===null?null:(r?.deleted??0)+(a?.deleted??0);n.set(i,{added:o,deleted:s})}return n}async function zn(e){let t=await Fn(e,[`rev-parse`,`--is-inside-work-tree`]);if(!t.ok||!/^true\s*$/i.test(t.stdout.trim()))return{ok:!1,cwd:e,tracked:new Map,untracked:new Set};let[n,r,i]=await Promise.all([Fn(e,[`diff`,`--numstat`]),Fn(e,[`diff`,`--cached`,`--numstat`]),Fn(e,[`ls-files`,`--others`,`--exclude-standard`,`-z`])]);return{ok:!0,cwd:e,tracked:Rn(In(n.stdout),In(r.stdout)),untracked:Ln(i.stdout)}}async function Bn(e,t){let n=S.isAbsolute(t)?t:S.join(e,t),r=await ee(n);if(!r.isFile())return{bytes:0};if(r.size>2*1024*1024)return{bytes:r.size};let{readFile:i}=await import(`node:fs/promises`),a=await i(n);if(a.includes(0))return{bytes:a.byteLength};let o=a.toString(`utf8`);if(!o)return{lines:0};let s=o.match(/\n/g)?.length??0;return{lines:o.endsWith(`
28
+ `)?s:s+1}}async function Vn(e,t,n){if(!e?.ok||!t.ok)return null;let r=typeof n?.maxFiles==`number`&&n.maxFiles>0?Math.floor(n.maxFiles):12,i=[],a=new Set([...e.tracked.keys(),...t.tracked.keys()]);for(let n of a){let r=e.tracked.get(n),a=t.tracked.get(n),o=r?.added===null||a?.added===null?null:(a?.added??0)-(r?.added??0),s=r?.deleted===null||a?.deleted===null?null:(a?.deleted??0)-(r?.deleted??0);(o===null||s===null?!!a!=!!r||a?.added===null!=(r?.added===null)||a?.deleted===null!=(r?.deleted===null):o!==0||s!==0)&&i.push({filePath:n,added:o,deleted:s,kind:`tracked`})}let o=[];for(let n of t.untracked)e.untracked.has(n)||o.push(n);for(let e of o)try{let n=await Bn(t.cwd,e);`lines`in n?i.push({filePath:e,added:n.lines,deleted:0,kind:`untracked`}):i.push({filePath:e,added:null,deleted:null,kind:`untracked`})}catch{i.push({filePath:e,added:null,deleted:null,kind:`untracked`})}if(i.length===0)return{entries:[],omitted:0};i.sort((e,t)=>e.kind===t.kind?e.filePath.localeCompare(t.filePath):e.kind.localeCompare(t.kind));let s=i.length>r?i.length-r:0;return{entries:i.slice(0,r),omitted:s}}async function Hn({agent:e,sessionId:t,history:n,input:r,theme:i,signal:o,askApproval:s,askApprovalForTool:c,askUserQuestions:l,hooks:u,approvalStrategy:d=`high_risk`,autoApprove:f=!1,emoji:h=process.env.GOATCHAIN_EMOJI!==`0`,showTools:g=process.env.GOATCHAIN_SHOW_TOOLS!==`0`,toolStyle:_=process.env.GOATCHAIN_TOOL_STYLE===`box`?`box`:`inline`,showStatus:v=process.env.GOATCHAIN_SHOW_STATUS!==`0`,showActivity:y=process.env.GOATCHAIN_SHOW_ACTIVITY!==`0`,showStatusLine:b=process.env.GOATCHAIN_SHOW_STATUSLINE!==`0`,showFileChanges:ee=process.env.GOATCHAIN_SHOW_FILE_CHANGES!==`0`,promptContinue:x=process.env.GOATCHAIN_PROMPT_CONTINUE!==`0`,autoContinue:te=process.env.GOATCHAIN_AUTO_CONTINUE===`1`,write:ne=e=>process.stdout.write(e)}){let re=p(i),C=re.ansi,ie=!!h&&process.stdout.isTTY&&process.env.TERM!==`dumb`,w=e=>ie?`${e} `:``,T=process.env.GOATCHAIN_ROLE_PREFIXES!==`0`,ae=e=>{if(!e||typeof e!=`object`)return null;let t=e.structuredContent;if(!t||typeof t!=`object`)return null;let n=t.todos;if(!Array.isArray(n))return null;let r=[];for(let e of n){if(!e||typeof e!=`object`)continue;let t=typeof e.content==`string`?String(e.content):``,n=typeof e.status==`string`?String(e.status):``,i=typeof e.activeForm==`string`?String(e.activeForm):``;t.trim()&&(n!==`pending`&&n!==`in_progress`&&n!==`completed`||r.push({content:t,status:n,activeForm:i}))}return r},oe=e=>{let t=[];for(let n=0;n<e.length;n++){let r=e[n],i=a(r.status===`in_progress`&&r.activeForm?.trim()?r.activeForm:r.content,140)||`(empty)`,o=r.status===`completed`?C.green(`[x]`):r.status===`in_progress`?C.yellow(`[>]`):C.dim(`[ ]`),s=r.status===`completed`?C.dim(i):r.status===`in_progress`?C.bold(i):i;t.push(`${o} ${s}`)}return t},se=!0,E=null,ce=null,D=e=>{E?.onOutput();let t=String(e??``);ne(t);let n=t.lastIndexOf(`
29
+ `);if(n===-1){se=!1;return}se=n===t.length-1},O=()=>{se||D(`
30
+ `)},k=[],le={promptTokens:0,completionTokens:0,totalTokens:0},A=new Map,j={text:``,toolCalls:[],flushedToolCallAssistant:!1},ue=new Map,M=new Map,N=new Map,de=new Set,P=new Map,F=new Set,fe={tools:[]},I=new Map,pe=[],L=null,me=!1,R=null,he=e=>{let t=String(e??``);if(!t)return``;let n=t.lastIndexOf(`:`);return n>=0?t.slice(n+1):t},ge=e=>{if(!g||!ee)return!1;let t=he(e??``);return t===`Write`||t===`Edit`||t===`Bash`||t===`AstGrepReplace`},_e=e=>{try{return Buffer.byteLength(String(e??``),`utf8`)}catch{return String(e??``).length}},ve=e=>{let t=Number(e);return!Number.isFinite(t)||t<0?``:t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(2)} KB`:`${(t/(1024*1024)).toFixed(2)} MB`},z=e=>e.filter(e=>!!e),B=(e,t)=>{let n=String(e??``),r=Number.isFinite(t)?Math.max(0,Math.min(n.length,t)):0,i=Math.max(0,r-90),a=Math.min(n.length,r+90),o=n.slice(i,a).replace(/\s+/g,` `),s=Math.max(0,Math.min(120,r-i));return{excerpt:o,caret:`${` `.repeat(s)}^`}},V=(e,t)=>{let n=String(e??``),r=t&&typeof t==`object`?t:{};if(typeof r._raw==`string`){let e=r._raw,t=typeof r._parseError==`string`?r._parseError:(()=>{try{return JSON.parse(e),``}catch(e){return e instanceof Error?e.message:String(e)}})(),i=e.length,a=i>180?e.slice(-180):e,o=t?t.match(/position\s+(\d+)/i):null,s=o?Number(o[1]):NaN,c=t&&Number.isFinite(s)?B(e,s):null,l=(()=>{if(n!==`Write`&&n!==`Edit`&&n!==`Read`)return``;let t=e.match(/"file_path"\s*:\s*"([^"]{1,260})"/);return t?t[1]:``})();return{summary:`invalid JSON args (len ${i})`,lines:z([`args: invalid JSON (len ${i})`,t?`parseError: ${t}`:void 0,l?`file: ${l}`:void 0,c?`excerpt: ${c.excerpt}`:void 0,c?` ${c.caret}`:void 0,`tail: ${a.replace(/\s+/g,` `)}`])}}if(n===`Write`){let e=typeof r.file_path==`string`?r.file_path:``,t=typeof r.content==`string`?ve(_e(r.content)):``;return{summary:`${e}${t?` (content ${t})`:``}`,lines:z([e?`file: ${e}`:void 0,t?`content: ${t}`:void 0])}}if(n===`Edit`){let e=typeof r.file_path==`string`?r.file_path:``,t=Array.isArray(r.edits)?r.edits:[],n=t[0]&&typeof t[0]==`object`?t[0]:void 0,i=n&&typeof n.oldText==`string`?n.oldText:``,o=n&&typeof n.newText==`string`?n.newText:``,s=i||o?`first edit: ${a(i,60)} → ${a(o,60)}`:void 0;return{summary:`${e}${t.length?` (${t.length} edits)`:``}`,lines:z([e?`file: ${e}`:void 0,t.length?`edits: ${t.length}`:void 0,s])}}if(n===`Read`){let e=typeof r.file_path==`string`?r.file_path:``,t=typeof r.offset==`number`?r.offset:void 0,n=typeof r.limit==`number`?r.limit:void 0;return{summary:`${e}${t||n?` (${t?`from ${t}`:``}${t&&n?`, `:``}${n?`limit ${n}`:``})`:``}`,lines:z([e?`file: ${e}`:void 0,t?`offset: ${t}`:void 0,n?`limit: ${n}`:void 0])}}if(n===`Glob`){let e=typeof r.pattern==`string`?r.pattern:``;return{summary:e,lines:z([e?`pattern: ${e}`:void 0])}}if(n===`Grep`){let e=typeof r.pattern==`string`?r.pattern:``,t=typeof r.output_mode==`string`?r.output_mode:``,n=typeof r.path==`string`?r.path:``;return{summary:`${e}${n?` in ${n}`:``}`,lines:z([e?`pattern: ${a(e,120)}`:void 0,n?`path: ${n}`:void 0,t?`mode: ${t}`:void 0])}}if(n===`WebSearch`){let e=typeof r.query==`string`?r.query:``;return{summary:a(e,120),lines:z([e?`query: ${a(e,200)}`:void 0])}}if(n===`TodoWrite`){let e=(Array.isArray(r.todos)?r.todos:[]).length;return{summary:e?`${e} item(s)`:``,lines:z([e?`todos: ${e}`:void 0])}}let i=Object.keys(r),o=i.slice(0,6).join(`, `);return{summary:o?`{${o}${i.length>6?`, …`:``}}`:`{}`,lines:o?[`args: { ${o}${i.length>6?`, …`:``} }`]:[]}},ye=()=>{if(!y&&!b||!process.stdout.isTTY)return null;let e=process.env.GOATCHAIN_TITLE??`GoatChain`,t=`working`,n=``,r=0,i=null,o=!1,s=Date.now(),c=(()=>{let e=process.env.TERM||``,t=process.env.LANG||``;return e!==`dumb`&&/utf-?8/i.test(t)})()?[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`]:[`|`,`/`,`-`,`\\`],l=()=>c[r%c.length],u=()=>(r=(r+1)%4,`.`.repeat(r)),d=e=>ie?e===`thinking`?`🤔`:e===`tool_call`?`🛠️`:e===`responding`?`✍️`:e===`working`?`…`:``:``,f=()=>{let e=d(t),r=e?`${e} ${t}`:t;return n?`${r}: ${n}`:r},p=e=>{y&&process.stdout.write(`\u001B]0;${e}\u0007`)},m=()=>{if(!b||Date.now()-s<450)return;o||=(se||=(process.stdout.write(`
31
+ `),!0),!0);let e=l(),t=u(),n=`${e} ${f()}${t}`;process.stdout.write(`\r\u001B[2K${C.dim(a(n,120))}`),se=!1},h=()=>{o&&(process.stdout.write(`\r\x1B[2K`),o=!1,se=!0)},g=()=>{let t=l(),n=u();p(`${e} — ${t} ${f()}${n}`),m()};return{start:()=>{i||(g(),i=setInterval(g,250),typeof i?.unref==`function`&&i.unref())},stop:()=>{i&&=(clearInterval(i),null),h(),p(e)},set(e,r){t=String(e??`working`),n=String(r??``)},onOutput(){s=Date.now(),h()},onPauseForInput(){h()}}},be=()=>{j={text:``,toolCalls:[],flushedToolCallAssistant:!1},ue=new Map,M=new Map,N=new Map,de=new Set},xe=()=>{j.flushedToolCallAssistant||!Array.isArray(j.toolCalls)||j.toolCalls.length===0||(k.push({role:`assistant`,content:j.text||``,tool_calls:j.toolCalls}),j.flushedToolCallAssistant=!0)},Se=(e,t)=>{let n=typeof t==`string`?t:JSON.stringify(t);k.push({role:`tool`,tool_call_id:e,content:n})},Ce=e=>{try{if(e&&typeof e==`object`){let t=e,n=t.structuredContent&&typeof t.structuredContent==`object`?t.structuredContent:null;if(n&&`totalMatches`in n&&`files`in n&&Array.isArray(n.files)){let e=n.files,t=Number(n.totalMatches??e.length),r=e.length,i=n.truncated===!0;return[`Found ${Number.isFinite(t)?t:r} file(s)`,i?`(showing ${r})`:r===t?``:`(showing ${r})`].filter(Boolean).join(` `)}if(n&&`fileSize`in n&&(`totalLines`in n||`linesReturned`in n)){let e=Number(n.totalLines??0),t=Number(n.linesReturned??0),r=n.truncated===!0,i=Number(n.fileSize??0);return[`Read file`,Number.isFinite(t)&&Number.isFinite(e)&&e>0?`(${t}/${e} lines)`:t>0?`(${t} lines)`:``,Number.isFinite(i)&&i>0?`(${ve(i)})`:``,r?`(truncated)`:``].filter(Boolean).join(` `)}if(n&&`bytesWritten`in n&&`filePath`in n){let e=String(n.filePath??``),t=Number(n.bytesWritten??0);return[n.overwritten===!0?`Overwrote`:`Wrote`,e||`file`,t>0?`(${ve(t)})`:``].filter(Boolean).join(` `)}if(n&&`todos`in n&&Array.isArray(n.todos)){let e=n.todos,t=Number(n.pendingCount??0),r=Number(n.inProgressCount??0),i=Number(n.completedCount??0),a=[Number.isFinite(i)&&i>0?`${i} completed`:``,Number.isFinite(r)&&r>0?`${r} in progress`:``,Number.isFinite(t)&&t>0?`${t} pending`:``].filter(Boolean);return a.length>0?`Plan updated (${e.length} items): ${a.join(`, `)}`:`Plan updated (${e.length} items)`}let r=t.content;if(Array.isArray(r)){let e=r.find(e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`text`&&typeof t.text==`string`});if(e&&typeof e.text==`string`)return a(e.text,200)}}return a(typeof e==`string`?e:JSON.stringify(e),200)}catch{return``}},we=async e=>{if(me)return{approved:!0};if(typeof c==`function`){let t=e.toolName,n=V(t,e.args),r=await c({toolCallId:e.tool_call_id,toolName:t,riskLevel:e.riskLevel,args:e.args,display:n});if(typeof r==`boolean`)return{approved:r};let i=String(r??``).trim().toLowerCase();if(i===`approve_all`||i===`all`)return me=!0,{approved:!0};if(i===`approve`||i===`yes`||i===`y`)return{approved:!0};if(i===`abort`)throw Error(`Aborted by user`);return{approved:!1}}if(!s)return{approved:!1,reason:`No approval handler available`};let t=e.toolName,n=e.riskLevel?` (${String(e.riskLevel)})`:``,r=V(t,e.args),i=`${C.highlight(` approval required `)}${ie?` ${w(`🛑`).trimEnd()}`:``} ${C.bold(String(t??`tool`))}${n} ${C.dim(`(${e.tool_call_id})`)}\n`,a=(r.lines.length>0?r.lines:[`(no args)`]).map(e=>`- ${e}`).join(`
32
+ `),o=await s(`\n${i}${C.dim(a)}\n${C.bold(`${w(`✅`).trimEnd()}Allow?`)} [y/N] `),l=String(o??``).trim().toLowerCase();return{approved:l===`y`||l===`yes`}},Te=(e,t,n=!1)=>{if(g){O(),D(`${C.dim(`┌─ ${ie?`🛠️ `:``}${e}`)}\n`);for(let e of t)e&&D(`${C.dim(`│ ${e}`)}\n`);D(`${C.dim(`└─`)}\n`),n&&D(`
33
+ `)}},Ee=e=>{let t=String(e??``);if(!t)return``;try{return a(t.startsWith(`/`)?S.relative(process.cwd(),t):t,80)}catch{return a(t,80)}},De=(e,t,n)=>{if(!g)return;O();let r=C.bold(String(e??`tool`)),i=String(t??``).trim(),a=re.roleTag(`tool`,{emoji:ie}),o=n?String(n).slice(-8):``,s=o?C.dim(`#${o}`):``,c=[a,r,i?C.dim(i):``,s].filter(Boolean).join(` `);D(`${C.dim(`•`)} ${c}\n`)},Oe=e=>{if(!g)return;let t=String(e??``).trim()||``;t&&D(`${C.dim(` └`)} ${C.dim(`${ie?`⏳ `:``}${t}`)}\n`)},ke=e=>{if(!g)return;let t=String(e??``).trim()||`[no output]`;D(`${C.dim(` └`)} ${C.dim(`${ie?`📄 `:``}${t}`)}\n`)},H=(()=>{let e=process.env.GOATCHAIN_TOOL_HEARTBEAT_MS;if(typeof e!=`string`||!e.trim())return 5e3;let t=Number(e);return!Number.isFinite(t)||t<1e3?5e3:Math.min(3e4,Math.max(1e3,Math.floor(t)))})(),Ae=e=>{if(!g||_===`box`||P.has(e))return;let t=Date.now(),n=setTimeout(()=>{let t=P.get(e);if(!t)return;t.printed=!0;let n=Math.max(0,Date.now()-t.startedAt);Oe(`running… (${Math.max(1,Math.round(n/1e3))}s)`),!(!((!b||!process.stdout.isTTY)&&H>0)||t.heartbeatTimer)&&(t.heartbeatTimer=setInterval(()=>{let t=P.get(e);if(!t)return;let n=Math.max(0,Date.now()-t.startedAt);Oe(`still running… (${Math.max(1,Math.round(n/1e3))}s)`)},H),typeof t.heartbeatTimer?.unref==`function`&&t.heartbeatTimer.unref())},650);typeof n?.unref==`function`&&n.unref(),P.set(e,{delayTimer:n,heartbeatTimer:null,startedAt:t,printed:!1})},je=e=>{let t=P.get(e);if(t){try{clearTimeout(t.delayTimer),t.heartbeatTimer&&clearInterval(t.heartbeatTimer)}catch{}P.delete(e)}},U=e=>{if(e===null)return`?`;let t=Number(e);return Number.isFinite(t)?t>=0?`+${t}`:String(t):`?`},Me=(e,t)=>`${U(e)} ${t===null?`?`:t===0?`-0`:U(-t)}`,Ne=e=>{if(!(!g||!ee)&&!(!e.entries.length&&!e.omitted)){D(`${C.dim(` files changed:`)}\n`);for(let t of e.entries){let e=t.kind===`untracked`?C.dim(` [new]`):``;D(`${C.dim(` ${Ee(t.filePath)} (${Me(t.added,t.deleted)})${e}`)}\n`)}e.omitted>0&&D(`${C.dim(` … (+${e.omitted} more)`)}\n`)}},Pe=(e,t)=>{if(!ie)return``;if(t===!0)return`❌`;if(e&&typeof e==`object`){let t=e;if(t.isError===!0)return`❌`;let n=t.structuredContent&&typeof t.structuredContent==`object`?t.structuredContent:null;if(n&&n.truncated===!0)return`⚠️`}return`✅`},Fe=e=>{let t=String(e??``).trim();return!t||/[。.!??!]$/.test(t)?!1:!!(/我将|我會|我会|接下来|下一步|然后|让我|开始创建/.test(t)||/\.html|\.ts|tank-battle/i.test(t)&&/创建|写入|生成|create|write|implement/i.test(t))},Ie=(e,t)=>{if(!t)return;let n=A.get(e)??{promptTokens:0,completionTokens:0,totalTokens:0},r=t.promptTokens-n.promptTokens,i=t.completionTokens-n.completionTokens,a=t.totalTokens-n.totalTokens;le.promptTokens+=Math.max(0,r),le.completionTokens+=Math.max(0,i),le.totalTokens+=Math.max(0,a),A.set(e,{...t})},W=async(t,n)=>{let r=``,i=``,a,s=!1;E=ye(),E?.start(),ce&&=(E?.set(ce.phase,ce.detail??``),null);try{for await(let c of t){if(o?.aborted)throw Error(typeof o?.reason==`string`?o.reason:`sigint`);if(c.type===`thinking_start`)E?.set(`thinking`,``);else if(c.type===`thinking_end`)E?.set(`working`,``);else if(c.type===`iteration_start`)be(),s=!1,E?.set(`thinking`,``),R=null;else if(c.type===`text_delta`)T&&!s&&(O(),D(`${re.roleHeader(`assistant`,{emoji:ie})}\n`),s=!0),j.text+=c.delta,D(c.delta),E?.set(`responding`,``);else if(c.type===`tool_call_start`)E?.set(`tool_call`,c.toolName??``);else if(c.type===`tool_call_end`){j.toolCalls.push(c.toolCall);let e=c.toolCall?.function?.name??`unknown`;c.toolCall?.id&&ue.set(c.toolCall.id,e);let t={};try{let e=c.toolCall?.function?.arguments;t=typeof e==`string`?JSON.parse(e):e&&typeof e==`object`?e:{}}catch(e){let n=e instanceof Error?e.message:String(e);t={_raw:c.toolCall?.function?.arguments,_parseError:n}}let n=V(e,t);if(c.toolCall?.id){let r=c.toolCall?.function?.arguments;if(N.set(c.toolCall.id,typeof r==`string`?r:JSON.stringify(r??{})),e===`Read`||e===`Write`||e===`Edit`){let n=typeof t.file_path==`string`?t.file_path:``;if(e===`Write`){let e=typeof t.content==`string`?ve(_e(t.content)):``;M.set(c.toolCall.id,`${Ee(n)}${e?` (${e})`:``}`.trim())}else if(e===`Edit`){let e=Array.isArray(t.edits)?t.edits.length:0;M.set(c.toolCall.id,`${Ee(n)}${e?` (${e} edits)`:``}`.trim())}else M.set(c.toolCall.id,Ee(n)||``)}else M.set(c.toolCall.id,n.summary||``)}if(_===`box`)Te(`${C.bold(e)}${n.summary?` ${C.dim(n.summary)}`:``}`,n.lines.length?n.lines:[n.summary||`(no args)`]);else if(c.toolCall?.id&&!de.has(c.toolCall.id)){de.add(c.toolCall.id);let t=M.get(c.toolCall.id)??``;De(e,t||n.summary||``,c.toolCall.id),fe.tools.push({toolName:e,toolCallId:c.toolCall.id,argsSummary:t||n.summary||``})}c.toolCall?.id&&Ae(c.toolCall.id),c.toolCall?.id&&ge(e)&&!R&&(R=await zn(process.cwd())),E?.set(`tool_call`,c.toolCall?.function?.name??``)}else if(c.type===`tool_approval_requested`){let e={tool_call_id:c.tool_call_id,toolName:c.toolName,riskLevel:c.riskLevel,args:c.args};if(I.has(e.tool_call_id)||pe.push(e.tool_call_id),I.set(e.tool_call_id,e),ue.has(e.tool_call_id)||ue.set(e.tool_call_id,e.toolName),!M.has(e.tool_call_id)){let t=V(e.toolName,e.args);M.set(e.tool_call_id,t.summary||``)}}else if(c.type===`tool_result`){je(c.tool_call_id),xe(),Se(c.tool_call_id,c.result);let e=Ce(c.result),t=ue.get(c.tool_call_id),n=c?.isError===!0,r=!n&&t===`TodoWrite`?ae(c.result):null;r&&r.length>0&&(fe.todos=r);let i=t===`ExitPlanMode`||t?.endsWith(`:ExitPlanMode`);if(!n&&i&&(fe.exitedPlanMode=!0),t&&F.add(t),_!==`box`){if(t&&!de.has(c.tool_call_id)){de.add(c.tool_call_id);let e=M.get(c.tool_call_id)??``;De(t,e,c.tool_call_id),fe.tools.push({toolName:t,toolCallId:c.tool_call_id,argsSummary:e})}let i=M.get(c.tool_call_id)??``,a=Pe(c.result,n);if(ke(`${a?`${a} `:``}${e||(n?`[error]`:`[no output]`)}`),t&&ge(t)&&R?.ok){let e=await zn(process.cwd()),t=await Vn(R,e,{maxFiles:12});t&&Ne(t),R=e.ok?e:R}if(r&&r.length>0){let e=oe(r);for(let t of e.slice(0,12))D(` ${t}\n`);e.length>12&&D(`${C.dim(` … (+${e.length-12})`)}\n`)}if(n){let n=typeof c.result==`string`?c.result:e||`[error]`;if(L={toolCallId:c.tool_call_id,toolName:t||void 0,message:String(n??``)},typeof c.result==`string`){let e=String(c.result).match(/position\\s+(\\d+)/i),t=e?Number(e[1]):NaN,n=N.get(c.tool_call_id);if(n&&Number.isFinite(t)){let e=B(n,t);D(`${C.dim(` args excerpt: ${e.excerpt}`)}\n`),D(`${C.dim(` ${e.caret}`)}\n`)}}}if(t){let r=fe.tools.slice().reverse().find(e=>e.toolName===t&&e.toolCallId===c.tool_call_id&&!e.resultSummary);r?Object.assign(r,{resultSummary:e||(n?`[error]`:`[no output]`),isError:n}):fe.tools.push({toolName:t,toolCallId:c.tool_call_id,argsSummary:i,resultSummary:e||(n?`[error]`:`[no output]`),isError:n})}}else{let i=Pe(c.result,n),a=t?`tool result ${C.bold(t)}${i?` ${i}`:``}`:`tool result${i?` ${i}`:``}`;if(r&&r.length>0?Te(a,oe(r)):Te(a,[e||`[no output]`]),t&&ge(t)&&R?.ok){let e=await zn(process.cwd()),t=await Vn(R,e,{maxFiles:12});if(t&&(t.entries.length>0||t.omitted>0)){let e=t.entries.map(e=>{let t=e.kind===`untracked`?` [new]`:``;return`${Ee(e.filePath)} (${Me(e.added,e.deleted)})${t}`});t.omitted>0&&e.push(`… (+${t.omitted} more)`),Te(`workspace changes`,e)}R=e.ok?e:R}}E?.set(`thinking`,``)}else if(c.type===`requires_action`&&c.kind===`tool_approval`){xe(),E?.stop(),E=null,O();let t={},r=pe.length>0?pe:Array.from(I.keys());if(r.length===0){let e=c;if(e.tool_call_id&&e.toolName){let n={tool_call_id:e.tool_call_id,toolName:e.toolName,riskLevel:e.riskLevel??`safe`,args:e.args??{}};t[n.tool_call_id]=await we(n)}else throw Error(`Approval requested but no tool approval details were found.`)}else for(let e of r){let n=I.get(e);n&&(t[e]=await we(n))}I.clear(),pe.length=0,ce={phase:`tool_call`,detail:r.length===1?ue.get(r[0])??`tool`:`${r.length} tools`};let i=await e.resumeSession(n,u?{hooks:u}:void 0);return W(i.receive({signal:o,toolContext:{approval:{decisions:t}}}),i.id)}else if(c.type===`requires_action`&&c.kind===`ask_user`){xe(),E?.stop(),E=null,O();let t=c;if(!t.toolCallId||!t.questions)throw Error(`AskUser requested but no questions or tool call ID were found.`);let r={};if(l)r=await l({toolCallId:t.toolCallId,questions:t.questions});else throw Error(`AskUser requested but no askUserQuestions callback was provided.`);ce={phase:`tool_call`,detail:`AskUserQuestion`};let i=await e.resumeSession(n,u?{hooks:u}:void 0);return W(i.receive({signal:o,toolContext:{askUser:{answers:{[t.toolCallId]:r}}}}),i.id)}else if(c.type===`iteration_end`){let e=c.usage;Ie(c.sessionId??n,e),c.willContinue===!1&&k.push({role:`assistant`,content:j.text||``})}else if(c.type===`done`){let e=c.usage;Ie(c.sessionId??n,e),r=c.stopReason?String(c.stopReason):``,i=c.modelStopReason?String(c.modelStopReason):``,a=c.error;break}}}finally{for(let e of P.values())try{clearTimeout(e.delayTimer),e.heartbeatTimer&&clearInterval(e.heartbeatTimer)}catch{}P.clear(),E?.stop(),E=null}return{doneReason:r,modelStopReason:i,doneError:a}},Le=``,G=``,Re,K;if(t&&e.stateStore){let r=await e.stateStore.load(t,m.SESSION);try{await e.stateStore.loadCheckpoint?.(t)&&await e.stateStore.deleteCheckpoint?.(t)}catch{}r?(K=await e.resumeSession(t,u?{hooks:u}:void 0),K.messages=n,K.save&&await K.save()):(K=await e.createSession({sessionId:t,maxIterations:50,...u?{hooks:u}:{}}),K.messages=n,K.save&&await K.save())}else K=await e.createSession(u?{hooks:u,maxIterations:50}:{maxIterations:50}),K.messages=n,K.save&&await K.save();K.send(r,{signal:o,toolContext:{approval:{strategy:d,autoApprove:f}}});let ze=await W(K.receive(),K.id);Le=ze.doneReason,G=ze.modelStopReason,Re=ze.doneError;let Be=[...k].reverse().find(e=>e&&typeof e==`object`&&e.role===`assistant`),Ve=typeof Be?.content==`string`?Be.content:``,He=te;if((He||x&&typeof s==`function`)&&!F.has(`Write`)&&!F.has(`Edit`)&&Fe(Ve)){let t=He;if(!t){if(typeof s!=`function`)throw Error(`promptContinue enabled but no askApproval handler provided`);let e=await s(`${C.dim(`
34
+ The model seems to have stopped before implementing.`)} Continue? [Y/n] `),n=String(e??``).trim().toLowerCase();t=n===``||n===`y`||n===`yes`}if(t){let t=`继续。不要只说计划:请立刻开始实现,使用 Write/Edit 创建或修改文件。`;k.push({role:`user`,content:t});let i={role:`user`,content:r},a=[...n,i,...k.slice(0,-1)],s=await e.resumeSession(K.id,u?{hooks:u}:void 0);s.messages=a,s.save&&await s.save(),s.send(t,{signal:o,toolContext:{approval:{strategy:d,autoApprove:f}}});let c=await W(s.receive(),s.id);Le=c.doneReason,G=c.modelStopReason,Re=c.doneError}}if(o?.aborted)throw Error(typeof o?.reason==`string`?o.reason:`sigint`);if(fe.stopReason=Le,fe.modelStopReason=G,fe.error=Re,fe.usage={...le},v){O();let e=[];Le&&Le!==`final_response`&&e.push(`stopReason=${Le}`),G&&G!==`final`&&e.push(`modelStopReason=${G}`);let t=`${w(`✅`).trimEnd()}done${e.length?` (${e.join(` `)})`:``}`;if(D(`${C.dim(`─ ${t} ─`)}\n`),Re?.message){let e=Re,t=e.code?`${e.code}: `:``,n=typeof e.status==`number`?` (status=${e.status})`:``;if(D(`${C.red(`${w(`✖`).trimEnd()}error: ${t}${e.message}${n}`)}\n`),L){let e=L,t=e.toolName?` ${e.toolName}`:``;D(`${C.dim(`${w(`🛠️`).trimEnd()}last tool error:${t} (${e.toolCallId})`)}\n`)}e.code===`missing_api_key`&&D(`${C.dim(`${w(`💡`).trimEnd()}hint: set OPENAI_API_KEY or run /api-key <key>`)}\n`)}else Le===`error`&&(D(`${C.red(`${w(`✖`).trimEnd()}error: unknown (no error payload)`)}\n`),D(`${C.dim(`${w(`💡`).trimEnd()}hint: rebuild the workspace package (pnpm build) or rebuild CLI so it picks up latest goatchain changes`)}\n`));if(G===`length`)D(`${C.dim(`${w(`💡`).trimEnd()}hint: increase maxTokens via /set maxTokens 2048 if output is truncated`)}\n`);else{let e=[...k].reverse().find(e=>e&&typeof e==`object`&&e.role===`assistant`),t=typeof e?.content==`string`?e.content:``;!F.has(`Write`)&&!F.has(`Edit`)&&Fe(t||j.text||``)&&D(`${C.dim(`${w(`💡`).trimEnd()}hint: response ended before any Write/Edit; ask “继续并开始写文件” or increase maxTokens`)}\n`)}}return O(),D(`
35
+ `),K.messages.push(...k),K.save&&await K.save(),{messagesToAppend:k,meta:fe}}function Un(e){let t=Number(e);return!Number.isFinite(t)||t<0?``:t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(2)} KB`:`${(t/(1024*1024)).toFixed(2)} MB`}function Wn(e){let{version:t,provider:n,modelId:r,sessionId:i,history:a,usage:o,baseUrl:s,requestDefaults:c,workspaceCwd:l}=e,u=Math.floor(a.length/2),d=o??{promptTokens:0,completionTokens:0,totalTokens:0},f=c??{},p=se(r),m=O(f?.reasoning?.effort),h=[typeof f.maxOutputTokens==`number`?`maxTokens=${f.maxOutputTokens}`:void 0,typeof f.temperature==`number`?`temperature=${f.temperature}`:void 0,typeof f.topP==`number`?`topP=${f.topP}`:void 0,typeof f.presencePenalty==`number`?`presencePenalty=${f.presencePenalty}`:void 0,typeof f.frequencyPenalty==`number`?`frequencyPenalty=${f.frequencyPenalty}`:void 0,typeof f.seed==`number`?`seed=${f.seed}`:void 0,typeof f.timeoutMs==`number`?`timeoutMs=${f.timeoutMs}`:void 0].filter(Boolean),g=[ce(r),p.reasoning&&m?`[effort=${m}]`:``].filter(Boolean).join(` `);return[{label:`version`,value:String(t)},{label:`session`,value:String(i)},{label:`model`,value:`${n}/${r}${g?` ${g}`:``}`},{label:`baseUrl`,value:String(s??`∅`)||`∅`},{label:`params`,value:h.length?h.join(` `):`∅`},{label:`turns`,value:String(u)},{label:`messages`,value:String(a.length)},{label:`usage`,value:`prompt=${d.promptTokens} completion=${d.completionTokens} total=${d.totalTokens}`},{label:`workspace`,value:String(l)}]}function Gn(e){let t=Wn(e),n=t.reduce((e,t)=>Math.max(e,t.label.length),0),r=(e,t)=>`${e.padEnd(n,` `)} : ${t}`;return t.map(e=>r(e.label,e.value))}function Kn(e){process.stdout.write(`${Gn(e).join(`
36
+ `)}\n\n`)}function qn(){return!(!process.stdout.isTTY||process.env.TERM===`dumb`||process.env.VITEST||process.env.VITEST_WORKER_ID||process.env.JEST_WORKER_ID||process.env.NODE_ENV===`test`||process.env.GOATCHAIN_NO_ALT_SCREEN===`1`)}const Jn=Tn({supportsAltScreen:qn,stdout:process.stdout,stdin:process.stdin,env:process.env});function Yn(){return qn()?(process.stdout.write(`\x1B[?1049h\x1B[2J\x1B[H\x1B[?25l`),!0):!1}function Xn(){process.stdout.isTTY&&process.stdout.write(`\x1B[?25h\x1B[0m\x1B[?1049l`)}function Zn(e,t){let n=String(t??``).trim().toLowerCase();return n?e.filter(e=>`${e.title??``} ${e.summary??``} ${e.sessionId??``}`.toLowerCase().includes(n)):e}function Qn(e,t,n=f){let r=String(t??``).trim();if(!r)return String(e??``);let i=String(e??``),a=i.toLowerCase().indexOf(r.toLowerCase());return a<0?i:`${i.slice(0,a)}${n.highlight(i.slice(a,a+r.length))}${i.slice(a+r.length)}`}function $n(e){let{sessions:t,currentSessionId:n,filter:r,alt:i,emoji:o}=e,s=e.ansi??f;i?c():process.stdout.write(`
37
+ `);let u=!!o&&process.stdout.isTTY&&process.env.TERM!==`dumb`,d=String(r??``).trim(),p=Zn(t,r),m=process.stdout.isTTY&&typeof process.stdout.columns==`number`&&process.stdout.columns>0?process.stdout.columns:120,h=process.stdout.isTTY&&typeof process.stdout.rows==`number`&&process.stdout.rows>0?process.stdout.rows:24,g=a(`${u?`🗂️ `:``}Sessions ${p.length}/${t.length} filter: ${d||`∅`} (# open · text filter · empty cancel)`,Math.max(20,m-2)),_=Math.min(p.length,Math.max(8,h-6)),v=String(Math.min(p.length,_)||1).length,y=Math.min(38,Math.max(26,Math.floor(m*.25))),b=Math.min(52,Math.max(22,Math.floor(m*.32))),ee=Math.max(0,m-(6+v+y+b)),x=[s.header(` ${g} `),``];for(let e=0;e<Math.min(p.length,_);e++){let t=p[e],r=t.sessionId===n,i=r?s.green(u?`▶️`:`▶`):` `,o=t.pinned?s.yellow(`★`):` `,c=Array.isArray(t.messages)?t.messages.length:0,f=a(t.title??`New session`,b),m=r?s.bold(f):Qn(f,d,s),h=l(t.updatedAt),g=typeof t.sessionId==`string`?t.sessionId.slice(-8):``,_=a(`(${c} msgs · ${h}${g?` · ${g}`:``})`,y),S=s.dim(_),te=ee>=20?a(t.summary??``,ee):``,ne=te?` ${s.gray(`— ${te}`)}`:``,re=s.yellow(`[${String(e+1).padStart(v,` `)}]`);x.push(`${i}${o} ${re} ${m} ${S}${ne}`)}return p.length>_&&x.push(s.dim(`… and ${p.length-_} more (refine with filter text)`)),x.push(``),process.stdout.write(`${x.join(`
38
+ `)}\n`),{filtered:p}}async function er(e){let{version:l,provider:f,agentRef:m,modelRef:g,toolsInfo:_,requestDefaults:y,baseUrlRef:b,setBaseUrl:ee,setApiKey:x,setWebSearchConfig:w,saveAll:T,listSessions:ae,loadSessionById:se,saveSessionByData:E,renameSessionById:ce,setPinnedSessionsById:D,deleteSessionById:O,deleteSessionsById:k,uiPrefs:A,switchWorkspace:j,getWorkspaceCwd:ue}=e,M=!!process.env.VITEST||!!process.env.VITEST_WORKER_ID||!!process.env.JEST_WORKER_ID||process.env.NODE_ENV===`test`,N=(()=>{let e=(process.env.GOATCHAIN_UI??`auto`).toLowerCase();if(M)return!1;let t=e===`full`||e===`auto`||e===``,n=e===`legacy`||e===`inline`||e===`normal`;return process.stdout.isTTY&&t&&!n&&qn()})(),de=()=>!!A?.emoji&&process.stdout.isTTY&&process.env.TERM!==`dumb`,P=e=>de()?`${e} `:``,F=()=>{let e=(process.env.GOATCHAIN_UI??`auto`).toLowerCase();return process.stdout.isTTY&&e!==`legacy`},I=(e,t)=>{let n=process.env.GOATCHAIN_PROMPT_EMOJI===`1`||process.env.GOATCHAIN_CLACK_EMOJI===`1`;return de()&&(n||!F())?`${e} ${t}`:t},pe=p(A?.theme),R=pe.ansi,he=typeof e?.getApiKeyStatus==`function`?e.getApiKeyStatus:null,ve=N?(()=>{let e=new te({write(e,t,n){n()}});return e.isTTY=!0,Object.defineProperty(e,`columns`,{enumerable:!0,get:()=>process.stdout.columns}),Object.defineProperty(e,`rows`,{enumerable:!0,get:()=>process.stdout.rows}),typeof process.stdout.getColorDepth==`function`&&(e.getColorDepth=process.stdout.getColorDepth.bind(process.stdout)),typeof process.stdout.hasColors==`function`&&(e.hasColors=process.stdout.hasColors.bind(process.stdout)),e})():process.stdout,z=ie.createInterface({input:process.stdin,output:ve,prompt:`> `,completer:e=>{let t=String(e??``),n=t.trimStart();if(/\s/.test(n))return[[],t];if(n.startsWith(`/`)){let e=n.slice(1).toLowerCase();return[ln.filter(t=>t.startsWith(e)).map(e=>`/${e}`),t]}return[[],t]}}),B=z,V=()=>{try{B._refreshLine?.()}catch{}},be=e=>{let t=Array.isArray(e)?e:[],n=[];for(let e of t){if(!e||typeof e!=`object`||e.role!==`user`)continue;let t=String(d(e)??``).trim();t&&n.push(t)}return n},Ce=(e,t)=>{let n=Array.isArray(e)?e.map(e=>String(e??``)).map(e=>e.trim()).filter(Boolean):[],r=n.length>0?n:be(t);if(r.length===0)return;let i=[];for(let e of r)i.length>0&&i[i.length-1]===e||i.push(e);B.history=[...i.slice(-500)].reverse(),B.historyIndex=-1},we=Promise.resolve(),H=`normal`,Ae=null,je=!1,U=null,Ie=0,W=!1,G=0,Re=!1,ze=!1,He={tools:[]},Ue=A?.planMode?`plan`:`agent`,We=null,Ge=null,Ke=null,qe=null,q=[],Je=``,Ye=0,Xe={lastClipboardAutoAttachAt:0,lastPathAutoAttachAt:0,clipboardAttachInFlight:null,lastPastedImageName:null},Ze=new Map,Qe=()=>({promptTokens:0,completionTokens:0,totalTokens:0}),$e={active:!1,buffer:``},J=null,et=null,tt=null,rt=!1,it=null,at=null,Y=!1,ot=!1,st=(()=>{let e=String(process.env.GOATCHAIN_TUI_MAX_LINES??``).trim(),t=e?Number.parseInt(e,10):NaN,n=Number.isFinite(t)?t:1e4;return Math.max(1e3,Math.min(n,5e4))})(),ct=[],lt=``,ut=!1,dt=!1,ft=!1,pt=0,mt=null,ht=0,gt=0,_t=null,vt=``,yt=!1,bt=Dn({canShow:()=>N&&Y&&process.stdout.isTTY,scheduleRender:()=>Q(),setTimeoutFn:(e,t)=>setTimeout(e,t),clearTimeoutFn:e=>clearTimeout(e)}),xt=null,St=null,Ct=process.env.GOATCHAIN_DEBUG_SEND_PAYLOAD===`1`,X=e=>{if(process.stdout.isTTY)try{if(Y){process.stdout.write(`${R.dim(e)}\n`);return}B.output.write(`\n${R.dim(e)}\n`),z.prompt(!0)}catch{}},wt=e=>{let t=String(e??``);return t?t.replace(/[\\/]+$/,``)===`/workspace`:!1},Tt=[{id:`agent`,icon:`🤖`,label:`AGENT`,planMode:!1},{id:`plan`,icon:`🧭`,label:`PLAN`,planMode:!0}],Et=(e=1)=>{if(H!==`normal`||G>0||Re||J||W||String(B.line??``).trim()!==``)return!1;let t=Tt.findIndex(e=>e.id===Ue),n=Tt[t<0?0:(t+e+Tt.length)%Tt.length];if(!n||n.id===Ue)return!1;Ue=n.id,A.planMode=n.planMode,B.line=``,B.cursor=0,$(),V();try{z.prompt(!0)}catch{}return T().catch(()=>{}),!0},Dt=()=>{q=[],Je=``,Xe.clipboardAttachInFlight=null,$(),V()},Ot=()=>{bt.clear()},kt=(e,t=12e3)=>{bt.show(e,t)},Z=()=>{if(typeof ue==`function`){let e=ue();if(typeof e==`string`&&e.trim())return e}return _?.workspaceCwd??process.cwd()},At=e=>{if(Array.isArray(e))return e.map(e=>At(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let[e,r]of Object.entries(t)){let t=String(e),i=t.toLowerCase();if(i===`apikey`||i.endsWith(`apikey`)||i===`accesskey`||i.endsWith(`accesskey`)||i===`accesstoken`||i.endsWith(`accesstoken`)||i===`refreshtoken`||i.endsWith(`refreshtoken`)||i===`token`||i.endsWith(`token`)||i===`password`||i.endsWith(`password`)||i.includes(`secret`)){n[t]=r&&`<redacted>`;continue}n[t]=At(r)}return n},jt=async t=>{let n=String(t??``).trim(),r=n?n.split(/\s+/).filter(Boolean):[],i=r.includes(`--json`)||r.includes(`json`),a=typeof e?.getConfigPath==`function`?e.getConfigPath:null,o=typeof e?.getLocalConfig==`function`?e.getLocalConfig:null,s=typeof e?.getApiKeyStatus==`function`?e.getApiKeyStatus:null,c={configPath:a?a():null,config:At(o?o():void 0),effective:{baseUrl:typeof b?.get==`function`?b.get():void 0,apiKeyStatus:s?s():void 0}};process.stdout.write(`${JSON.stringify(c,null,i?0:2)}\n`)},Mt=async e=>{G++;let t=Y;if(t){Y=!1,Jn.disable();try{zt(`\x1B[2J\x1B[H\x1B[?25h`)}catch{}}let n=!!B.paused;n||z.pause(),!(B.__savedReadlineFns??null)&&G===1&&(B.__savedReadlineFns={ttyWrite:B._ttyWrite,refreshLine:B._refreshLine},B._ttyWrite=()=>{},B._refreshLine=()=>{});try{return await e()}finally{let e=B.__savedReadlineFns??null;if(e&&G===1&&(B._ttyWrite=e.ttyWrite,B._refreshLine=e.refreshLine,B.__savedReadlineFns=null),n||z.resume(),G=Math.max(0,G-1),We&&=(clearTimeout(We),null),!ze&&process.stdin.isTTY&&typeof process.stdin?.setRawMode==`function`&&F())We&&clearTimeout(We),We=setTimeout(()=>{try{process.stdin.setRawMode(!0)}catch{}},0);else try{process.stdin.isTTY&&typeof process.stdin?.setRawMode==`function`&&process.stdin.setRawMode(!1)}catch{}t&&(Y=!0,Jn.enable(),_t=null,Q())}},Nt=e=>mn(e),Pt=e=>{try{process.stdout.write(`${R.bold(`Debug: outgoing payload`)}\n`),process.stdout.write(`${R.dim(`historyContent:`)}\n${e.historyContent||`(empty)`}\n`);let t=nt(e.modelInput,{maxTextPreviewChars:1200});process.stdout.write(`${R.dim(`modelInput blocks:`)} ${t.length}\n`);for(let e of t)e.type===`text`?process.stdout.write(`${R.dim(`-`)} text chars=${e.chars}\n${e.preview||`(empty)`}\n`):process.stdout.write(`${R.dim(`-`)} image mime=${e.mimeType} base64Chars=${e.base64Chars} approxBytes=${Un(e.approxBytes)}\n`)}catch{}},It=process.stdout.write.bind(process.stdout),Lt=process.stderr.write.bind(process.stderr),Rt=()=>le({uiPrefsAttachImages:A?.attachImages,env:process.env});function zt(e){ot=!0;try{It(e)}finally{ot=!1}}let Bt=e=>{let t=String(e??``),n=``,r=0;for(;r<t.length;){let e=t[r];if(e!==`\x1B`){n+=e,r++;continue}let i=t[r+1];if(i===`[`){let e=r+2;for(;e<t.length;){let n=t.charCodeAt(e);if(n>=64&&n<=126)break;e++}let i=e<t.length?e+1:t.length;(e<t.length?t[e]:``)===`m`&&(n+=t.slice(r,i)),r=i;continue}if(i===`]`){let e=r+2;for(;e<t.length;){let n=t[e];if(n===`\x07`){e++;break}if(n===`\x1B`&&t[e+1]===`\\`){e+=2;break}e++}r=e;continue}r=Math.min(t.length,r+2)}return n},Vt=(e,t)=>{let n=typeof t==`string`&&(t===`ascii`||t===`utf8`||t===`utf-8`||t===`utf16le`||t===`ucs2`||t===`ucs-2`||t===`base64`||t===`latin1`||t===`binary`||t===`hex`)?t:void 0,r=Bt(typeof e==`string`?e:Buffer.isBuffer(e)?e.toString(n):String(e??``));if(!r)return;let i=r.replace(/\r\n/g,`
39
+ `).split(`\r`);for(let e=0;e<i.length;e++){let t=i[e]??``;e>0&&(lt=``);let n=t.split(`
40
+ `);for(let e=0;e<n.length;e++){let t=n[e]??``;e===n.length-1?lt+=t:(ct.push(lt+t),lt=``)}}ct.length>st&&(ct=ct.slice(-st))};function Q(){N&&Y&&(ut||(ut=!0,queueMicrotask(()=>{ut=!1,Ht()})))}function Ht(){if(!N||!Y||!process.stdout.isTTY)return;let t=Math.max(1,Number(process.stdout.columns??80)||80),n=Math.max(1,Number(process.stdout.rows??24)||24),r=pe.name.toLowerCase(),i=r===`light`?R.bold:R.cyan,o=r===`light`?R.dim:R.magenta,s=(process.env.GOATCHAIN_ANIMATE??`1`)!==`0`&&r!==`light`,c=g.get(),l=String(e.session.sessionId??``),u=a(Z(),Math.max(10,t-30)),d=l?`#${l}`:``,p=`${f}/${c.modelId}`,m=i(`GoatChain`),h=d?o(d):``,_=R.dim(p),v=9+(d?1+d.length:0),y=v+(1+p.length)<t?Math.max(1,t-v-p.length):1,b=h?`${m} ${h}${` `.repeat(y)}${_}`:`${m}${` `.repeat(Math.max(1,t-9-p.length))}${_}`,ee=[u?`cwd: ${u}`:``,q.length>0?`images: ${q.length}`:``,Xe.clipboardAttachInFlight?`attaching: ${Xe.clipboardAttachInFlight.name}`:``,J?`multiline: .send/.cancel`:``,ht>0?`scroll: +${ht}`:``,W?R.yellow(`busy`):``].filter(Boolean),x=R.dim(a(ee.join(` · `),t)),S=o(`─`.repeat(t)),te=lt?[...ct,lt]:ct,ne=H===`select_session`?`session> `:H===`select_workspace`?`workspace> `:J?`... `:`${Ue===`plan`?`[PLAN] `:`[AGENT] `}user> `,C=String(B.line??``),ie=Pe(C,Number(B.cursor??C.length)),w=o(ne),T=Me(ne),ae=Fe(C,Math.max(0,t-T)),oe=ae.text,se=Math.max(0,Me(ie<=ae.start?``:C.slice(ae.start,ie))),E=(e=>{let t=e>=60?[`/help`,`Wheel/PgUp scroll`,`Tab mode`,`Ctrl+K palette`,`Ctrl+C exit`]:[`/help`,`Tab mode`,`Ctrl+C exit`],n=`${P(`💡`)}${t.join(` · `)}`;return Le(R.dim(n),e)})(t),ce=xt,D=bt.get(),O=!ft&&!W&&!D,k=[b,x,S],le=[S,E],A=[S,E,``],j=O?le:A,ue=Math.max(0,n-k.length-j.length),M=e=>On(ce,e,t,{ansi:R,formatOneLine:a,getSuggestionDescription:hn,isWorkspaceRootPath:wt});if(O){let e=Math.max(0,n-k.length-le.length),r=t>=90?[`██████╗ ██████╗ █████╗ ████████╗ ██████╗██╗ ██╗ █████╗ ██╗███╗ ██╗`,`██╔════╝ ██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝██║ ██║██╔══██╗██║████╗ ██║`,`██║ ███╗██║ ██║███████║ ██║ ██║ ███████║███████║██║██╔██╗ ██║`,`██║ ██║██║ ██║██╔══██║ ██║ ██║ ██╔══██║██╔══██║██║██║╚██╗██║`,`╚██████╔╝╚██████╔╝██║ ██║ ██║ ╚██████╗██║ ██║██║ ██║██║██║ ╚████║`,` ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝`]:t>=28?[` GoatChain`,` agent-loop CLI`]:[`GoatChain`],i=ce?M(Math.min(8,e)):[];e<r.length+1+1+1+3+(i.length>0?1+i.length:0)&&(O=!1)}j=O?le:A,ue=Math.max(0,n-k.length-j.length);let F=M(Math.min(10,ue)),fe=Math.max(0,ue-F.length);O&&(F=[],fe=ue),gt=fe;let I=wn({lines:te,viewportRows:fe,scrollOffset:ht});I.safeOffset!==ht&&(ht=I.safeOffset);let L=[];for(let e=0;e<I.padTop;e++)L.push(``);L.push(...I.visible);let me=(e,t)=>`\u001B]8;;${e}\u0007${t}\u001B]8;;\u0007`,he=e=>{if(!e.includes(`@`)||!Ke)return e;let t=new Set(Ke.files),n=new Set(Ke.dirs.map(e=>e.replace(/\/+$/,``))),r=e=>{try{return re(ge(Z(),e)).href}catch{return``}};return e.replace(/(^|[\s,,。!??::;;、()[\]{}"'“”‘’])@([^\s,,。!??::;;、()[\]{}"'“”‘’]+)/g,(e,i,a)=>{let s=String(a??``).trim();if(!s)return e;let c=s.replace(/^\.\/+/,``).replace(/\\/g,`/`),l=c.endsWith(`.`)?c.slice(0,-1):c,u=l.replace(/\/+$/,``),d=t.has(l)?l:n.has(u)?u:``;if(!d)return e;let f=r(d);if(!f)return e;let p=R.underline(o(`@${d}`));return`${String(i??``)}${me(f,p)}`})};if(D){let e=En({overlay:D,logAreaRows:L.length,columns:t,accent:o,ansi:R,displayWidth:Me,sliceToColumnsAnsi:Le,stripAnsi:Ne});for(let t=0;t<e.length&&!(0+t>=L.length);t++)L[0+t]=e[t]??``}let _e=n,ve=Math.min(t,Math.max(1,1+T+se));if(O&&L.length>=6){let e=t>=90?[`██████╗ ██████╗ █████╗ ████████╗ ██████╗██╗ ██╗ █████╗ ██╗███╗ ██╗`,`██╔════╝ ██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝██║ ██║██╔══██╗██║████╗ ██║`,`██║ ███╗██║ ██║███████║ ██║ ██║ ███████║███████║██║██╔██╗ ██║`,`██║ ██║██║ ██║██╔══██║ ██║ ██║ ██╔══██║██╔══██║██║██║╚██╗██║`,`╚██████╔╝╚██████╔╝██║ ██║ ██║ ╚██████╗██║ ██║██║ ██║██║██║ ╚████║`,` ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝`]:t>=28?[` GoatChain`,` agent-loop CLI`]:[`GoatChain`],a=s&&t>=90&&e.length>=4&&e.length>0?pt%e.length:-1,c=e.map((e,t)=>{let n=t%2==0?i(e):o(e);return t===a?R.inverse(n):n}),l=Math.max(26,Math.min(t-6,72)),u=Math.max(10,l-2),d=o(r===`plain`?`> `:`▸ `),f=Fe(C,Math.max(0,u-2)),p=f.start,m=f.text,h=Math.max(0,Me(ie<=p?``:C.slice(p,ie))),g=`Ask GoatChain…`,_=m.length===0,v=_?R.dim(g):he(m),y=Me(_?g:m),b=Math.max(0,u-2-y),ee=`${o(`│`)}${d}${v}${` `.repeat(b)}${o(`│`)}`,x=ce?M(Math.min(8,L.length)):[],S=c.length+1+2+3+(x.length>0?1+x.length:0),te=Math.max(0,Math.floor((L.length-S)/2));for(let n=0;n<c.length&&!(te>=L.length);n++){let r=e[n]??``,i=Math.max(0,Math.floor((t-r.length)/2));L[te++]=`${` `.repeat(i)}${c[n]}`}te<L.length&&te++;let ne=Ue===`plan`?`🧭`:`🤖`,re=Ue===`plan`?`PLAN MODE`:`AGENT MODE`,w=`${P(ne)}${re}`,T=Me(re)+(de()?2:0),ae=Math.max(0,Math.floor((t-T)/2));te<L.length&&(L[te++]=`${` `.repeat(ae)}${R.dim(w)}`),te<L.length&&te++;let oe=Math.max(0,Math.floor((t-l)/2)),se=`${o(`╭`)}${o(`─`.repeat(u))}${o(`╮`)}`,E=`${o(`╰`)}${o(`─`.repeat(u))}${o(`╯`)}`,D=te;D+2<L.length&&(L[D]=`${` `.repeat(oe)}${se}`,L[D+1]=`${` `.repeat(oe)}${ee}`,L[D+2]=`${` `.repeat(oe)}${E}`),_e=Math.min(n,Math.max(1,k.length+D+2)),ve=Math.min(t,Math.max(1,oe+2+2+h));let O=D+3;if(x.length>0&&O<L.length){O++;for(let e=0;e<x.length&&!(O+e>=L.length);e++)L[O+e]=String(x[e]??``)}let le=s&&process.stdout.isTTY;le&&!mt?(mt=setInterval(()=>{Y&&(ft||W||(pt++,Q()))},120),mt.unref?.()):!le&&mt&&(clearInterval(mt),mt=null)}else mt&&=(clearInterval(mt),null);let z=[...k,...L,...F,...O?j:[j[0],j[1],`${w}${he(oe)}`]],V=(z.length>n?z.slice(z.length-n):z).map(e=>Le(e,t));V.length<n&&(V=[...Array.from({length:n-V.length},()=>``),...V]);let ye=_n({rows:n,columns:t,frameLines:V,prevFrame:_t,promptRow:_e,promptCol:ve,renderLine:e=>`${e}\u001B[0m\u001B[K`});_t=ye.nextFrame,zt(ye.output)}function Ut(){if(N&&!St){if(St={stdout:process.stdout.write,stderr:process.stderr.write},ft=Array.isArray(e.session.history)&&e.session.history.length>0,pt=0,_t=null,gt=0,process.stdout.write=((e,t,n)=>{let r=typeof t==`function`?void 0:t,i=typeof t==`function`?t:n;return!N||!Y||ot?It(e,r,i):(Vt(e,r),Q(),typeof i==`function`&&i(),!0)}),process.stderr.write=((e,t,n)=>{let r=typeof t==`function`?void 0:t,i=typeof t==`function`?t:n;return!N||!Y||ot?Lt(e,r,i):(Vt(e,r),Q(),typeof i==`function`&&i(),!0)}),Yn(),Y=!0,Jn.enable(),Q(),!yt){yt=!0;let e=()=>{try{Wt()}catch{}try{process.stdin.isTTY&&typeof process.stdin?.setRawMode==`function`&&process.stdin.setRawMode(!1)}catch{}try{process.stdout.write(`\x1B[?25h\x1B[0m`)}catch{}};process.once(`exit`,e),process.once(`SIGTERM`,()=>{e(),process.exit(0)}),process.once(`uncaughtException`,t=>{throw e(),t}),process.once(`unhandledRejection`,()=>{e()})}if(!dt)try{process.stdout.on(`resize`,Q),dt=!0}catch{}}}function Wt(){Y=!1,_t=null,gt=0,mt&&=(clearInterval(mt),null),Ot(),We&&=(clearTimeout(We),null);try{dt&&=(process.stdout.off(`resize`,Q),!1)}catch{}if(St){let e=St;St=null,process.stdout.write=e.stdout,process.stderr.write=e.stderr}try{Jn.disable(),Xn()}catch{}try{process.stdin.isTTY&&typeof process.stdin?.setRawMode==`function`&&process.stdin.setRawMode(!1)}catch{}}let Gt=()=>{},Kt=()=>{};(()=>{if(!process.stdin.isTTY)return;let e=B._ttyWrite?.bind(z);if(typeof e!=`function`)return;let t=null,n=null,r=!1,i=!1,o=null,s=()=>{t=null},l=()=>!M&&!N&&process.stdout.isTTY&&process.env.TERM!==`dumb`,u=()=>{if(n=null,xt=null,N){r=!1,Q();return}if(r&&(r=!1,l()))try{B.output.write(`\x1B[s`),B.output.write(`\x1B[0J`),B.output.write(`\x1B[u`)}catch{}};it=u;let d=()=>{},f=()=>{i||(i=!0,queueMicrotask(()=>{i=!1,d()}))},p=()=>{Ke&&Date.now()-Ke.at<3e4||Fn().then(()=>{f()}).catch(()=>{})},m=e=>{let t=String(e??``).trimStart();if(!t.startsWith(`@`)||(p(),!Ke))return[];let n=t.slice(1).toLowerCase(),r=Ke.files,i=[...Ke.dirs,...r],a=e=>{let t=String(e??``),r=t.toLowerCase(),i=(t.split(/[\\/]/g).pop()??t).toLowerCase();return n?r.startsWith(n)?0:i.startsWith(n)?1:r.includes(n)?2:i.includes(n)?3:99:10},o=i.map(e=>({c:e,s:a(e)})).filter(e=>e.s<99).sort((e,t)=>e.s-t.s||e.c.length-t.c.length||e.c.localeCompare(t.c)).slice(0,20).map(e=>`@${e.c}`),s=t.toLowerCase(),c=o.some(e=>String(e).toLowerCase()===s);return o.length===1&&c?[]:o},h=e=>{let t=String(e??``),n=(e=>e.includes(`\\`)&&!e.includes(`/`)?`\\`:`/`)(t),r=t.lastIndexOf(`/`),i=t.lastIndexOf(`\\`),a=Math.max(r,i),s=a>=0?t.slice(0,a+1):``,c=a>=0?t.slice(a+1):t,l=(e=>e===`~`?C.homedir():e.startsWith(`~/`)||e.startsWith(`~\\`)?S.join(C.homedir(),e.slice(2)):e)(s),u=(S.isAbsolute(l)?l:S.resolve(Z(),l||`.`)).replace(/\\/g,`/`).replace(/\/+$/,``);if(u===`/workspace`){let e=Date.now(),r=c.toLowerCase();if(o&&e-o.at<=1500&&o.dirPartRaw===s&&o.baseLower===r&&o.sep===n)return o.hits;let i=c.startsWith(`.`),a=[],l=null;try{for(l=ne.opendirSync(`/workspace`);a.length<80;){let e=l.readSync();if(!e)break;if(!e.isDirectory())continue;let t=e.name;!i&&t.startsWith(`.`)||r&&!t.toLowerCase().startsWith(r)||a.push(`${s}${t}${n}`)}}catch{return[]}finally{try{l?.closeSync()}catch{}}return o={at:e,dirPartRaw:s,baseLower:r,sep:n,hits:a},a.length===1&&a[0]===t?[]:a}if(u.startsWith(`/workspace/`))return[];let d=K(t,{cwd:Z(),onlyDirs:!0,limit:80});return d.length===0||d.length===1&&String(d[0])===t?[]:d},g=()=>{if(H!==`normal`&&H!==`select_workspace`||G>0||Re||J)return[];let e=String(B.line??``),t=Number(B.cursor??e.length);if(Number.isFinite(t)&&t!==e.length)return[];if(H===`select_workspace`)return h(e.trimStart());let n=e.trimStart();if(!(n.length>0&&!/\s/.test(n))||!n.startsWith(`@`)&&!n.startsWith(`/`))return[];let r=n.startsWith(`@`)?m(n):Nt(n);return r.length===0||r.length===1&&String(r[0]).toLowerCase()===n.toLowerCase()?[]:r};d=()=>{let e=g();if(e.length===0){u();return}let t=(()=>!n||n.index<0||n.index>=e.length?0:n.index)();n=n?{...n,options:e,index:t}:{options:e,index:t,usedNavigation:!1};let i=String(B.line??``).trimStart(),o=H===`select_workspace`?`Paths`:i.startsWith(`@`)?`Workspace`:i.startsWith(`/`)?`Commands`:`Suggestions`;if(xt={token:i,kind:o,options:n.options,index:n.index,usedNavigation:n.usedNavigation},N){Q();return}if(!l())return;let s=e.length,c=gn({total:s,index:n.index,maxShow:8}),d=e.slice(c.windowStart,c.windowStart+c.visibleCount),f=c.above,p=c.below,m=Number(process.stdout.columns??0)||80,h=i.startsWith(`@`),_=H===`select_workspace`,v=Math.max(10,Math.min(32,m-20)),y=Math.min(v,Math.max(...d.map(e=>{let t=h&&String(e).startsWith(`@`)?String(e).slice(1):String(e);return(_&&wt(e)?`★ ${t}`:t).length}),10)),b=2+(y+2)+2,ee=Math.max(0,m-b);try{B.output.write(`\x1B[s`),B.output.write(`\x1B[0J`),B.output.write(`\x1B[1E`);let e=xn({kind:o,isWorkspace:h,isPath:_,visible:d,windowStart:c.windowStart,selectedIndex:n.index,labelWidth:y,descMax:ee,above:f,below:p},{ansi:R,formatOneLine:a,getSuggestionDescription:hn,isWorkspaceRootPath:wt});B.output.write(`${e.join(`
41
+ `)}\n`),B.output.write(`\x1B[u`),r=!0}catch{}};let _=()=>{let e=Date.now(),n=String(B.line??``).trimStart();if(!n)return!1;if(!t||e-t.lastAt>2500){let r=Nt(n);if(r.length===0)return!1;t={prefix:n,options:r,index:-1,lastAt:e}}else{let n=Nt(t.prefix);t.options=n.length>0?n:t.options,t.lastAt=e}t.index=(t.index+1)%t.options.length,B.line=t.options[t.index]??n,B.cursor=String(B.line??``).length,V();try{z.prompt(!0)}catch{}return f(),!0},v=(e,t)=>{if(!Array.isArray(e)||e.length===0)return;let n=e=>{let t=String(e??``);return t===`image/png`?`.png`:t===`image/jpeg`?`.jpg`:t===`image/webp`?`.webp`:t===`image/gif`?`.gif`:``};for(let r of e){if(!r||typeof r!=`object`)continue;let e=typeof r.name==`string`?r.name:`pasted-image`,i=typeof r.mime==`string`?r.mime:`application/octet-stream`,a=typeof r.bytes==`number`?r.bytes:0,o=typeof r.dataUrl==`string`?r.dataUrl:``;if(!o)continue;if(!i.startsWith(`image/`)){queueMicrotask(()=>X(`Ignored non-image paste: ${e} (${i})`));continue}let s=e;if(t===`paste`){let t=e.toLowerCase(),r=q.some(e=>e&&typeof e.name==`string`&&e.name.toLowerCase()===t);if(!e||e===`pasted-image`){let e=n(i);s=`pasted-image-${++Ye}${e}`}else if(r){let t=S.parse(e),r=t.ext||n(i);s=`${t.name||e}-${++Ye}${r}`}}q.push({name:s,mime:i,bytes:a,dataUrl:o,source:t})}$(),V()},y=e=>{let t=e.replace(/\r\n/g,`
42
+ `).replace(/\r/g,`
43
+ `);if(!t.includes(`
44
+ `))return{text:e,changed:!1,replacedNewlines:!1};let n=t.replace(/\n+$/g,``);return n.includes(`
45
+ `)?{text:n.replace(/\n/g,`\\n`),changed:!0,replacedNewlines:!0}:{text:n,changed:!0,replacedNewlines:!1}},b=Yt(Xe,{now:()=>Date.now(),scheduleAsync:e=>queueMicrotask(()=>void e()),workspaceCwd:Z,normalizeStandaloneImageName:Zt,resolveUserProvidedPathForRead:Se,ensureAllowedFile:ge,getWorkspaceImages:In,readImageFileAsDataUrl:L,readClipboardImageCandidatesDarwin:me,readFinderSelectionPathsDarwin:fe,addPendingImages:v,showInlineHint:X,icon:P,stripTokenOnceFromLine:e=>{let t=String(B.line??``),n=String(e??``).trim();if(!n)return!1;let r=t.indexOf(n);if(r<0)return!1;let i=r===0?``:t[r-1],a=r+n.length>=t.length?``:t[r+n.length],o=!i||/[\s,,。.!??::;;、()[\]{}"'“”‘’]/.test(i),s=r===0||!a||/[\s,,。.!??::;;、()[\]{}"'“”‘’]/.test(a);if(!o||!s)return!1;let c=`${t.slice(0,r)} ${t.slice(r+n.length)}`.replace(/\s{2,}/g,` `).trimStart();return B.line=c,B.cursor=c.length,!0},stripLeadingImageNameFromLine:()=>{let e=String(B.line??``).trimStart(),t=e.match(/^.*?\.\s*(?:png|jpe?g|webp|gif|bmp|tiff?|heic)(?=[\s,,。.!??::;;、()[\]{}"'“”‘’]|$)\s*/i);if(!t)return!1;let n=String(t[0]??``);return n?(B.line=e.slice(n.length).trimStart(),B.cursor=String(B.line??``).length,!0):!1},refreshLine:()=>B._refreshLine?.(),refreshPrompt:()=>{$(),V()}}),ee=b.maybeAutoAttachImageFromPastedPathToken,x=b.maybeAutoAttachClipboardForPastedName;B._ttyWrite=(t,r)=>{if(bt.get()&&Ot(),N&&Y&&!r&&typeof t==`string`&&(vt||t.includes(`\x1B`))){let n=ct.length+(lt?1:0),i=Nn({inputChunk:t,buffered:vt,scrollOffset:ht,totalLines:n,viewportRows:gt,step:3});if(vt=i.buffered,i.handled&&(ht=i.scrollOffset,ft=!0,Q()),i.rest)return e(i.rest,r);if(i.handled||i.buffered)return}if(r?.ctrl&&r?.name===`l`){if(u(),N){ct=[],lt=``,ht=0,ft=!0,Q(),V();try{z.prompt(!0)}catch{}return}try{c()}catch{}V();try{z.prompt(!0)}catch{}return}if(r?.ctrl&&r?.name===`o`){if(G>0)return;if(u(),W){queueMicrotask(()=>X(`busy (wait for current turn to finish)`));return}queueMicrotask(()=>{Bn()});return}if(r?.ctrl&&r?.name===`g`&&(u(),q.length>0)){q=[],Je=``,Xe.clipboardAttachInFlight=null,$(),V(),queueMicrotask(()=>X(`Cleared pending attachments.`));return}if(typeof t==`string`&&($e.active||t.includes(`\x1B[200~`)||t.includes(`\x1B[201~`))){s(),u();let n=B.line,i=Xt($e,t);$e=i.state;let a=i.forward;if(String(n??``).trim()===``)for(let e of i.completed){let t=Zt(e);t&&x(t);let n=Qt(e);n&&ee(n)}if(a){if(H===`normal`&&!J&&(i.sawNewlineInPaste||a.includes(`
46
+ `)||a.includes(`\r`))){let t=y(a);return t.replacedNewlines&&queueMicrotask(()=>X(`${P(`💡`)}Tip: paste contained newlines; converted to \\n. Use /multiline to send multi-line text.`)),e(t.text,r)}return e(a,r)}return}let i=!!Je||typeof t==`string`&&t.includes(`\x1B]1337;File=`);if(!r&&typeof t==`string`&&i){s(),u();let n=B.line,i=sn(t,Je);if(Je=i.buffer,Array.isArray(i.files)&&i.files.length>0&&queueMicrotask(()=>v(i.files,`paste`)),i.textToForward){let t=i.textToForward;H===`normal`&&!J&&(t.includes(`
47
+ `)||t.includes(`\r`))&&(t=y(t).text);let a=e(t,r);if(String(n??``).trim()===``){let e=Zt(t);e&&x(e);let n=Qt(t);n&&ee(n)}return a}if(Je)return}if(typeof t==`string`&&t.length>1&&!r?.ctrl&&!r?.meta&&!r?.alt){s(),u();let n=B.line,i=t;H===`normal`&&!J&&(i.includes(`
48
+ `)||i.includes(`\r`))&&(i=y(i).text);let a=e(i,r);if(String(n??``).trim()===``){let e=Zt(i);e&&x(e);let t=Qt(i);t&&ee(t)}return a}if(r?.ctrl&&r?.name===`k`){if(G>0||Re)return;if(u(),W){queueMicrotask(()=>X(`busy (wait for current turn to finish)`));return}queueMicrotask(()=>{Wn()});return}let a=typeof t==`string`?t:``,o=typeof r?.name==`string`?r.name:void 0;if(r?.ctrl&&(o===`c`||a===``)){u(),queueMicrotask(()=>{try{Gt()}catch{}});return}if(N){let e=Sn(ct.length+(lt?1:0),gt),t=Math.max(4,Math.floor((Number(process.stdout.rows??24)||24)/2)),n=t=>{ht=Math.max(0,Math.min(t,e)),Q()};if(o===`pageup`){n(ht+t);return}if(o===`pagedown`){n(ht-t);return}if(o===`home`){n(e);return}if(o===`end`){n(0);return}}let l=o===`up`,d=o===`down`,p=o===`tab`||a===` `,m=o===`backspace`||a===``,h=o===`return`||o===`enter`||a===`\r`||a===`
49
+ `;if(N&&Y&&!n&&H===`normal`&&(l||d)){let e=Sn(ct.length+(lt?1:0),gt);if(e>0){let t=l?1:-1;ht=Math.max(0,Math.min(ht+t,e)),ft=!0,Q(),V();try{z.prompt(!0)}catch{}return}}if(!n&&(l||d)){let e=bn({dropdown:n,uiMode:H,raw:a,keyName:o,line:String(B.line??``),getDropdownOptions:g});if(e.handled){n=e.dropdown,V(),e.scheduleDropdownRender&&f();try{z.prompt(!0)}catch{}return}}if(n&&n.options.length>0){let i=bn({dropdown:n,uiMode:H,raw:a,keyName:o,line:String(B.line??``),getDropdownOptions:g});if(i.handled){n=i.dropdown;for(let n of i.actions)if(n.type===`clearDropdown`)u();else if(n.type===`applyLine`)B.line=n.line,B.cursor=n.cursor;else if(n.type===`applyLineAndCallOrig`)return B.line=n.line,B.cursor=n.cursor,u(),V(),e(t,r);else if(n.type===`callOrig`)return e(t,r);else if(n.type===`clearDropdownAndAccept`){u(),s(),B.line=``,B.cursor=0,V();try{z.prompt(!0)}catch{}n.suggestion&&queueMicrotask(()=>Kt(n.suggestion));return}if(i.refresh){V();try{z.prompt(!0)}catch{}}i.scheduleDropdownRender&&f();return}}if(m){let e=String(B.line??``),t=Number(B.cursor??0);if(t>0){B.line=`${e.slice(0,t-1)}${e.slice(t)}`,B.cursor=Math.max(0,t-1),V();try{z.prompt(!0)}catch{}s(),f();return}}if(p){if(H===`select_workspace`&&!n){let e=g();if(e.length>0){n={options:e,index:0,usedNavigation:!1},V(),f();try{z.prompt(!0)}catch{}return}}if(H===`normal`&&G===0&&_()||Et(r?.shift?-1:1))return}else o!==`shift`&&o!==`ctrl`&&o!==`alt`&&s();if(h)return u(),e(t,r);let b=e(t,r);return N&&Q(),(H!==`select_workspace`||n)&&f(),b}})(),N&&Ut();function $(){let e=cn({currentMode:Ue,uiMode:H,pendingImagesCount:q.length,clipboardAttachName:Xe.clipboardAttachInFlight?.name??null,multiline:!!J,stdoutIsTTY:!!process.stdout.isTTY});z.setPrompt(e),Y?Q():V()}$();let Jt=()=>{je&&=(Xn(),!1)},$t=()=>{U&&U.abort(`cli_exit`),Jt(),ze=!0,We&&=(clearTimeout(We),null),Wt();try{process.stdin.isTTY&&typeof process.stdin?.setRawMode==`function`&&process.stdin.setRawMode(!1)}catch{}T().finally(()=>z.close())};Gt=()=>{if(U){Ie=Date.now(),U.abort(`sigint`);return}Wt(),process.stdout.write(`
50
+ `),$t()},process.on(`SIGINT`,Gt),z.on(`SIGINT`,Gt),z.on(`close`,()=>{Wt(),ze=!0,we.finally(()=>T()).finally(()=>{try{process.stdin.isTTY&&typeof process.stdin?.setRawMode==`function`&&process.stdin.setRawMode(!1)}catch{}process.stdout.write(`
51
+ `),process.exit(0)})});let en=t=>{H=`select_session`,Ae={sessions:t,filter:``},je||=Yn(),$(),$n({sessions:t,currentSessionId:e.session.sessionId,filter:``,alt:je,emoji:A?.emoji,ansi:R})},tn=async()=>{let t=e.session.sessionId;e.session.sessionId=h(),e.session.createdAt=Date.now(),e.session.title=void 0,e.session.summary=void 0,e.session.pinned=!1,e.session.history=[],e.session.inputs=[],t&&Ze.delete(t),N&&(ft=!1,pt=0,ht=0,ct=[],lt=``,xt=null,Q()),await T(),process.stdout.write(`${R.green(`${P(`🆕`)}new session:`)} ${e.session.sessionId}\n`),Ce(e.session.inputs,e.session.history)},nn=async t=>{if(!t)return process.stdout.write(`${P(`❌`)}Missing sessionId (try /sessions)\n`),!1;let n=await se(t);if(!n)return process.stdout.write(`${P(`❌`)}Session not found: ${t}\n`),!1;Jt(),e.session.sessionId=n.sessionId,e.session.createdAt=n.createdAt??Date.now(),e.session.title=n.title,e.session.summary=n.summary,e.session.pinned=!!n.pinned,e.session.history=Array.isArray(n.messages)?n.messages:[],e.session.inputs=Array.isArray(n.inputs)?n.inputs:[];let r=g.get();if(n.modelId&&typeof r?.setModelId==`function`&&r.setModelId(n.modelId),await T(),N&&(ft=!0,ht=0,ct=[],lt=``,xt=null,Q()),H=`normal`,Ae=null,$(),process.stdout.write(`
52
+ `),process.stdout.write(`${R.green(`${P(`🗂️`)}using session:`)} ${e.session.sessionId}\n`),e.session.history.length>0){let t=e.session.title??s(e.session.history),n=e.session.summary??u(e.session.history);process.stdout.write(`${R.bold(`Title:`)} ${t}\n`),n&&process.stdout.write(`${R.bold(`Summary:`)} ${n}\n`),o(e.session.history.filter(e=>e&&typeof e==`object`&&e.role!==`system`&&e.role!==`tool`),{maxMessages:20,maxCharsPerMessage:600,emoji:A?.emoji,ansi:R,formatRoleHeader:(e,t)=>e===`assistant`||e===`user`||e===`tool`||e===`system`?pe.roleHeader(e,t):`[${e}]`}),process.stdout.write(R.dim(`Tip: use /history all (or /history user) to expand
53
+ `))}return Ce(e.session.inputs,e.session.history),!0},rn=async e=>String(e??``),an=async e=>String(e??``),on=async e=>{let t=String(e??``).trim(),n=t;if(n=await rn(n),n=await an(n),n.includes(`@file`))try{n=(await ye(Z(),n,{maxTotalBytes:22e4,maxBytesPerFile:12e4,maxBytesPerFileSummary:4e4,headLines:80,tailLines:30})).text}catch{}let r=await qt({inputText:n,workspaceCwd:Z(),pendingImages:q,attachImagesOptions:Rt()});return{rawInput:t,cleanedText:r.cleanedText,historyContent:r.historyContent,modelInput:r.modelInput,blocksSummary:nt(r.modelInput),pendingImages:q.map(e=>({name:String(e.name??``),mime:String(e.mime??``),bytes:Number(e.bytes??0)||0,source:String(e.source??``)}))}},un=()=>{let t={version:l,provider:f,modelId:g.get().modelId,sessionId:e.session.sessionId,history:e.session.history,usage:Ze.get(e.session.sessionId),baseUrl:b.get(),requestDefaults:y,workspaceCwd:Z(),emoji:A?.emoji};if(N&&Y&&process.stdout.isTTY){kt({kind:`status`,title:`Status`,lines:Gn(t)},15e3);return}Kn(t)},dn=async()=>{},fn=async()=>{},vn=async()=>{},yn=async()=>{},Cn={ansi:R,icon:P,label:I,uiPrefs:A,options:e,requestDefaults:y,provider:f,version:l,agentRef:m,modelRef:g,baseUrlRef:b,setBaseUrl:ee,setApiKey:x,setWebSearchConfig:w,saveAll:T,workspaceCwd:Z,stdoutIsTTY:!!process.stdout.isTTY,useClack:F,withClack:Mt,selectWithClack:Te,multiselectWithClack:Ee,confirmWithClack:De,textWithClack:Oe,passwordWithClack:ke,question:e=>new Promise(t=>z.question(e,t)),isBusy:()=>W,getUiMode:()=>H,setUiMode:e=>{H=e,e!==`select_session`&&(Ae=null)},setCurrentMode:e=>{Ue=e},setPromptForMode:$,showInlineHint:X,clearAttachments:Dt,setMultiline:e=>{J=e},openEditorFlow:()=>dn(),exit:$t,leaveSessionPickerUi:Jt,openSessionPicker:en,humanBytes:Un,openCommandPalette:Wn,printConfig:jt,printStatus:un,prepareOutgoingPreview:on,openWorkspaceFlow:Rn,openFilesFlow:Ln,openImagesFlow:Vn,openSettingsFlow:()=>fn(),openOutputFlow:()=>vn(),openDiagnosticsFlow:()=>yn(),resetToNewSession:tn,useSessionById:nn,listSessions:ae,loadSessionById:se,saveSessionByData:E,renameSessionById:ce,setPinnedSessionsById:D,deleteSessionById:O,deleteSessionsById:k,debugSendPayload:{get:()=>Ct,set:e=>{Ct=e}}},Tn=()=>{pe=p(A?.theme),R=pe.ansi,Cn.ansi=R},kn=Ft(Cn),An=async e=>{let[t,...n]=e.trim().split(/\s+/),r=t.slice(1).toLowerCase(),i=r,a=n.join(` `).trim(),o=pn(r);if(o.kind===`prefix`)i=o.cmd;else if(o.kind===`ambiguous`){process.stdout.write(`${P(`❓`)}ambiguous command: ${t} (did you mean ${o.matches.map(e=>`/${e}`).join(`, `)}?)\n`);return}let s=kn.get(i);if(s){await s({cmd:i,arg:a,raw:e,ctx:Cn});return}let c=pn(r);if(c.kind===`fuzzy`||c.kind===`contains`){process.stdout.write(`${P(`❓`)}unknown command: ${t} (did you mean ${c.matches.map(e=>`/${e}`).join(`, `)}?)\n`);return}process.stdout.write(`${P(`❓`)}unknown command: ${t} (try /help)\n`)};if(!N){process.stdout.write(`${P(`💡`)}/help · Tab mode · Ctrl+K palette · Ctrl+C exit\n`);let e=Ue===`plan`?`🧭`:`🤖`,t=Ue===`plan`?`PLAN`:`AGENT`;process.stdout.write(`${P(e)}Current mode: ${R.bold(t)} ${R.dim(`(Tab, /plan, /agent)`)}\n`)}if(e.session.history.length>0){let t=e.session.title??s(e.session.history),n=e.session.summary??u(e.session.history);process.stdout.write(`${P(`🗂️`)}Restored session: ${e.session.sessionId}\n`),process.stdout.write(`Title: ${t}\n`),n&&process.stdout.write(`Summary: ${n}\n`),o(e.session.history.filter(e=>e&&typeof e==`object`&&e.role!==`system`&&e.role!==`tool`),{maxMessages:20,maxCharsPerMessage:600,emoji:A?.emoji,ansi:R,formatRoleHeader:(e,t)=>e===`assistant`||e===`user`||e===`tool`||e===`system`?pe.roleHeader(e,t):`[${e}]`}),process.stdout.write(R.dim(`Tip: use /history all (or /history user) to expand
54
+ `)),process.stdout.write(`
55
+ `)}Ce(e.session.inputs,e.session.history),z.prompt();let jn=(e,t)=>{let n=String(t??`summary`).trim().toLowerCase();return n!==`path`&&n!==`summary`&&n!==`full`?String(e??``):String(e??``).replace(/@file(?:\((?:path|summary|full)\))?:/g,`@file(${n}):`)};rn=async e=>{let t=String(e??``);if(!t.includes(`@`))return t;(!Ke||Date.now()-Ke.at>=3e4)&&await Fn();let n=Ke;if(!n)return t;let r=new Set(n.files),i=new Set(n.dirs.map(e=>e.replace(/\/+$/,``)));return t.replace(/(^|[\s,,。!??::;;、()[\]{}"'“”‘’])@([^\s,,。!??::;;、()[\]{}"'“”‘’]+)/g,(e,t,n)=>{let a=String(n??``).trim();if(!a)return e;let o=a.toLowerCase();if(o.startsWith(`file(`)||o.startsWith(`file:`)||o.startsWith(`dir(`)||o.startsWith(`dir:`))return e;let s=a.replace(/^\.\/+/,``).replace(/\\/g,`/`),c=s.endsWith(`.`)?s.slice(0,-1):s,l=c.replace(/\/+$/,``);return r.has(c)?`${String(t??``)}@file(summary):${c}`:i.has(l)?`${String(t??``)}@dir(summary):${l}`:e})},an=async e=>{let t=String(e??``);if(!t.includes(`@dir`))return t;(!Ke||Date.now()-Ke.at>=3e4)&&await Fn();let n=Ke;if(!n)return t;let r=n.files;return t.replace(/@dir(?:\((path|summary|full)\))?:(\S+)/g,(e,t,n)=>{let i=t===`path`||t===`summary`||t===`full`?t:`summary`,a=String(n??``).replace(/\\/g,`/`).replace(/\/+$/,``);if(!a)return e;try{ge(Z(),a)}catch{return e}let o=`${a}/`,s=r.filter(e=>e===a||e.startsWith(o)).slice(0,40);return s.length===0?e:s.map(e=>`@file(${i}):${e}`).join(` `)})};let Mn=async t=>{W=!0,N&&(ft=!0,Q()),U=new AbortController;let i=String(t??``).trim(),a=i,o=he?he():null;if(o&&!o.present){process.stderr.write(`${R.red(`${P(`✖`)}Missing OPENAI_API_KEY (required for chatting)`)}\n`),process.stderr.write(R.dim("Set `OPENAI_API_KEY` in your environment or run `/api-key <key>` in the CLI.\n")),W=!1,U=null;return}N&&(process.stdout.write(`${pe.roleHeader(`user`,{emoji:de()})}\n`),process.stdout.write(`${i}\n`));let s=e.session.history.length;Array.isArray(e.session.inputs)||(e.session.inputs=[]);let c=e.session.inputs.length;i&&e.session.inputs.push(i);let l=s,u=(e,t)=>{let n=String(e??``),r=String(t??``).trim();if(!r)return n;let i=n.indexOf(r);if(i<0)return n;let a=i===0?``:n[i-1],o=i+r.length>=n.length?``:n[i+r.length],s=!a||/[\s,,。.!??::;;、()[\]{}"'“”‘’]/.test(a),c=!o||/[\s,,。.!??::;;、()[\]{}"'“”‘’]/.test(o);return!s||!c?n:`${n.slice(0,i)} ${n.slice(i+r.length)}`.replace(/\s{2,}/g,` `).trim()},d=()=>{let e=i.match(/(^|\s)([^\s/\\]+?)\s*\.\s*(png|jpg|jpeg|webp|gif|bmp|tiff?|heic)(?=[\s,,。.!??::;;、()[\]{}"'“”‘’]|$)/i);if(!e)return null;let t=String(e[2]??``).trim(),n=String(e[3]??``).trim().toLowerCase();return!t||!n||i.includes(`@`)?null:`${t}.${n}`};if(q.length===0){let e=d();if(e){let t=await me(),n=e.toLowerCase(),r=Array.isArray(t)&&t.length>0?t.find(e=>e?.absPath&&S.basename(String(e.absPath)).toLowerCase()===n)??t[0]:null;if(!r)process.stdout.isTTY&&process.stdout.write(R.dim(`(no image found in clipboard; send text only — use cmd+v in iTerm2 or /images to attach)
56
+ `));else if(typeof r.dataUrl==`string`&&r.dataUrl.startsWith(`data:image/`)){let t=!0;if(process.stdout.isTTY)if(F())await Mt(async()=>{let n=await De({message:`Attach image from clipboard as “${e}”?`,initialValue:!0});t=!!(n.ok&&n.value)});else{let n=await new Promise(t=>z.question(`Attach image from clipboard as "${e}"? [Y/n] `,t)),r=String(n??``).trim().toLowerCase();t=r===``||r===`y`||r===`yes`}t&&(q.push({name:e,mime:r.mime,bytes:Buffer.isBuffer(r.buf)?r.buf.byteLength:0,dataUrl:r.dataUrl,source:`paste`}),a=u(a,e),$(),V())}}}if(a=await rn(a),a=await an(a),a.includes(`@file`))try{let e=await ye(Z(),a,{maxTotalBytes:22e4,maxBytesPerFile:12e4,maxBytesPerFileSummary:4e4,headLines:80,tailLines:30}),t=(Array.isArray(e.omitted)?e.omitted:[]).some(e=>e&&e.reason===`budget`),n=(Array.isArray(e.files)?e.files:[]).some(e=>e&&e.mode===`full`&&e.truncated);if((t||n)&&process.stdout.isTTY){let t=`proceed`;if(F())await Mt(async()=>{let e=await Te({message:`File attachments exceed budget`,options:[{value:`proceed`,label:`Proceed (some may be truncated/omitted)`},{value:`summary`,label:`Downgrade to Summary`},{value:`path`,label:`Paths only (no content)`},{value:`cancel`,label:`Cancel send`}],initialValue:1});if(!e.ok){t=`cancel`;return}t=String(e.value)});else{let e=await new Promise(e=>z.question(`Attachments exceed budget. Use Summary instead? [Y/n] `,e)),n=String(e??``).trim().toLowerCase();t=n===``||n===`y`||n===`yes`?`summary`:`proceed`}if(t===`cancel`){W=!1,U=null;return}if(t===`summary`){let t=jn(a,`summary`);e=await ye(Z(),t,{maxTotalBytes:22e4,maxBytesPerFile:12e4,maxBytesPerFileSummary:4e4,headLines:80,tailLines:30})}else if(t===`path`){let t=jn(a,`path`);e=await ye(Z(),t,{maxTotalBytes:22e4,maxBytesPerFile:12e4,maxBytesPerFileSummary:4e4,headLines:80,tailLines:30})}}a=e.text;let r=Array.isArray(e.files)?e.files.length:0;r>0&&process.stdout.write(R.dim(`(${P(`📎`)}attached ${r} file(s))\n`))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),W=!1,U=null;return}let f=a,p=a,h=q.length>0?[...q]:[],g=0;try{let e=await qt({inputText:a,workspaceCwd:Z(),pendingImages:q,attachImagesOptions:Rt()});f=e.modelInput,p=e.historyContent,g=e.imageCount,g>0&&process.stdout.write(R.dim(`(${P(`🖼️`)}attached ${g} image(s))\n`))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),W=!1,U=null;return}Ct&&g>0&&Pt({historyContent:p,modelInput:f}),e.session.history.push({role:`user`,content:p});let _=q;h.length>0&&(q=[],$());try{let t=t=>{if(!t?.usage)return;let n=e.session.sessionId,r=Ze.get(n)??Qe();Ze.set(n,{promptTokens:r.promptTokens+t.usage.promptTokens,completionTokens:r.completionTokens+t.usage.completionTokens,totalTokens:r.totalTokens+t.usage.totalTokens})},i=async t=>{let i=n({mode:r(A?.approvalMode??`read_only`),envAutoApprove:process.env.GOATCHAIN_AUTO_APPROVE});return Hn({agent:m.get(),sessionId:e.session.sessionId,history:t.history,input:t.input,theme:A?.theme,signal:U?.signal??new AbortController().signal,approvalStrategy:i.strategy,autoApprove:i.autoApprove,askApproval:async e=>{let t=String(e??``);if(F()&&process.stdout.isTTY){let e=Ne(t).trim(),n=/\[Y\/n\]/.test(e)||/\(Y\/n\)/.test(e),r=/\[y\/N\]/.test(e)||/\(y\/N\)/.test(e),i=e.replace(/\s*(?:\[Y\/N\]|\(Y\/N\))\s*$/i,``).trim()||(r?`Allow?`:`Continue?`),a=n||!r;return await Mt(async()=>{let e=await De({message:i,initialValue:a});a=!!(e.ok&&e.value)}),a?`y`:`n`}return await new Promise(e=>z.question(t,e))},askApprovalForTool:F()&&process.stdout.isTTY?async({toolCallId:e,toolName:t,riskLevel:n,display:r})=>{let i=n?` (${n})`:``,a=r?.lines&&Array.isArray(r.lines)?r.lines:[];process.stdout.write(`\n${R.bold(`Approval required:`)} ${String(t??`tool`)}${i}${e?` ${R.dim(`(${e})`)}`:``}\n`);for(let e of a.slice(0,10))process.stdout.write(`${R.dim(`- ${e}`)}\n`);a.length>10&&process.stdout.write(`${R.dim(`… (+${a.length-10})`)}\n`);let o=await Mt(()=>Te({message:`Allow this tool?`,options:[{value:`approve`,label:I(`✅`,`Approve (once)`)},{value:`approve_all`,label:I(`🧷`,`Approve all tools (this turn)`)},{value:`deny`,label:I(`❌`,`Deny`)},{value:`abort`,label:I(`🛑`,`Abort turn`)}],initialValue:2}));return o.ok?String(o.value):`deny`}:void 0,askUserQuestions:F()&&process.stdout.isTTY?async({toolCallId:e,questions:t})=>{process.stdout.write(`\n${R.bold(`Agent needs your input:`)} ${R.dim(`(${e})`)}\n`);let n={};for(let e=0;e<t.length;e++){let r=t[e];process.stdout.write(`\n${R.cyan(`[${r.header}]`)} ${r.question}\n`);let i=[...r.options.map(e=>({value:e.label,label:e.label,hint:e.description})),{value:`__other__`,label:`Other (custom text)`,hint:`Enter your own answer`}];if(r.multiSelect){let t=await Mt(()=>Ee({message:`Select your answers for "${r.header}"`,options:i,required:!1}));if(!t.ok)throw Error(`User cancelled question prompt`);let a=Array.isArray(t.value)?t.value:[t.value];if(a.includes(`__other__`)){let t=await Mt(()=>Oe({message:`Enter your custom answer for "${r.header}"`,placeholder:`Type your answer...`}));if(!t.ok)throw Error(`User cancelled text input`);n[String(e)]=[...a.filter(e=>e!==`__other__`),String(t.value??``)].filter(e=>e.trim()!==``)}else n[String(e)]=a.map(String)}else{let t=await Mt(()=>Te({message:`Select your answer for "${r.header}"`,options:i,initialValue:0}));if(!t.ok)throw Error(`User cancelled question prompt`);if(t.value===`__other__`){let t=await Mt(()=>Oe({message:`Enter your custom answer for "${r.header}"`,placeholder:`Type your answer...`}));if(!t.ok)throw Error(`User cancelled text input`);n[String(e)]=String(t.value??``)}else n[String(e)]=String(t.value??``)}}return n}:void 0,showTools:typeof A?.showTools==`boolean`?A.showTools:void 0,toolStyle:typeof A?.toolStyle==`string`?A.toolStyle:void 0,showStatus:typeof A?.showStatus==`boolean`?A.showStatus:void 0,showStatusLine:typeof A?.showStatusLine==`boolean`?A.showStatusLine:void 0,showFileChanges:typeof A?.showFileChanges==`boolean`?A.showFileChanges:void 0,emoji:typeof A?.emoji==`boolean`?A.emoji:void 0,promptContinue:t.promptContinue,autoContinue:t.autoContinue,hooks:t.hooks})},a=m.get();if(Ue===`plan`){if(!(a?.getMiddlewares?.()??[]).some(e=>e.name===`plan-mode`)&&typeof a?.use==`function`)try{let e=await import(`./src-Dpj3VSps.js`);if(typeof e.createPlanModeMiddleware==`function`){let t=e.createPlanModeMiddleware();a.use(t,`plan-mode`)}}catch{}}else typeof a?.removeMiddleware==`function`&&a.removeMiddleware(`plan-mode`);let{messagesToAppend:o,meta:s}=await i({input:f,history:e.session.history.slice(0,-1),promptContinue:typeof A?.promptContinue==`boolean`?A.promptContinue:void 0,autoContinue:typeof A?.autoContinue==`boolean`?A.autoContinue:void 0});if(U.signal.aborted)throw Error(typeof U.signal?.reason==`string`?U.signal.reason:`sigint`);s.exitedPlanMode&&Ue===`plan`&&(Ue=`agent`,A.planMode=!1,process.stdout.write(`${P(`🤖`)}${R.green(`Auto-switched to agent mode`)} ${R.dim(`(ExitPlanMode detected)`)}\n`));let c=s;t(s),e.session.history.push(...o),await T(),He=c??He}catch(t){let n=t instanceof Error?t.message:String(t),r=t instanceof Error?t.name:``;Ie>0&&Date.now()-Ie<2e3&&(r===`AgentAbortError`||r===`AbortError`||n===`sigint`||n===`Canceled`)?(process.stdout.write(`${R.dim(`${P(`⛔`)}Canceled.`)}\n`),Ie=0):process.stderr.write(`${n}\n`),e.session.history.splice(l),e.session.inputs.splice(c),h.length>0&&(q=_,$())}finally{W=!1,U=null}};dn=async()=>{let e=process.env.VISUAL||process.env.EDITOR||`vi`,{tmpdir:t}=await import(`node:os`),{spawnSync:n}=await import(`node:child_process`),{mkdtemp:r,readFile:i,rm:a,writeFile:o}=await import(`node:fs/promises`),s=e=>process.platform===`win32`?`"${String(e).replace(/"/g,`\\"`)}"`:`'${String(e).replace(/'/g,`'\\''`)}'`,c=await r(S.join(t(),`goatchain-edit-`)),l=S.join(c,`message.md`);await o(l,``,`utf8`);let u=!!B.paused;u||z.pause();try{let t=n(`${e} ${s(l)}`,{stdio:`inherit`,shell:!0});if(typeof t.status==`number`&&t.status!==0){process.stdout.write(`${P(`❌`)}Editor exited with status ${t.status}\n`);return}let r=String(await i(l,`utf8`)??``).replace(/\r\n/g,`
57
+ `).trim();if(!r){X(`Canceled (empty message).`);return}await Mn(r)}finally{u||z.resume(),await a(c,{recursive:!0,force:!0})}};let Pn=async()=>{let e=g.get(),t=e?.modelId?String(e.modelId):``,n=String(process.env.GOATCHAIN_MODEL_PRESETS??``).split(`,`).map(e=>e.trim()).filter(Boolean),r=oe.map(e=>e.modelId),i=[t,...n,...r].filter(Boolean),a=[...new Set(i)].slice(0,20);if(!F()){if(!process.stdout.isTTY){process.stdout.write([`model: ${f}/${e?.modelId??``}`,`Set with: /model <id>`,``].join(`
58
+ `));return}let n=await new Promise(e=>z.question(`Model id (current: ${t||`∅`}): `,e)),r=String(n??``).trim();if(!r)return;typeof e?.setModelId==`function`&&e.setModelId(r),await T(),process.stdout.write(`${P(`🤖`)}model set: ${f}/${e.modelId}\n`);return}await Mt(async()=>{let t=await Te({message:`Select model`,options:[...a.map(e=>({value:e,label:e})),{value:`__custom__`,label:`Custom…`}],initialValue:0});if(!t.ok)return;let n=String(t.value);if(n===`__custom__`){let e=await Oe({message:`Model id`,placeholder:`e.g. gpt-4o-mini`});if(!e.ok)return;n=String(e.value).trim()}n&&(typeof e?.setModelId==`function`&&e.setModelId(n),await T(),process.stdout.write(`${P(`🤖`)}model set: ${f}/${e.modelId}\n`))})};fn=async()=>{let e=g.get();if(!F()){if(!process.stdout.isTTY){process.stdout.write([`Settings:`,`- /base-url <url>`,`- /api-key <key>`,`- /web-search-key <key> (Serper)`,`- /set maxTokens <n>`,`- Set env GOATCHAIN_AUTO_APPROVE=1 to skip approval prompts.`,``].join(`
59
+ `));return}for(;;){let e=await new Promise(e=>z.question(`Settings: [1] base-url [2] api-key [3] webSearch key [4] maxTokens [5] autoApprove info (empty cancel): `,e)),t=String(e??``).trim();if(!t)return;if(t===`1`||t.toLowerCase()===`base-url`){let e=await new Promise(e=>z.question(`Base URL: `,e)),t=String(e??``).trim();if(!t)continue;await ee(t),process.stdout.write(`${P(`🌐`)}baseUrl set: ${b.get()??``}\n`);continue}if(t===`2`||t.toLowerCase()===`api-key`){process.stdout.write(`For security, use /api-key <key> (note: your shell history may record it) or set OPENAI_API_KEY.
60
+ `);continue}if(t===`3`||t.toLowerCase()===`websearch`||t.toLowerCase()===`web-search`||t.toLowerCase()===`websearchkey`||t.toLowerCase()===`web-search-key`){process.stdout.write(`For security, use /web-search-key <key> (note: your shell history may record it) or set SERPER_API_KEY / GOATCHAIN_SERPER_API_KEY.
61
+ `);continue}if(t===`4`||t.toLowerCase()===`maxtokens`){let e=await new Promise(e=>z.question(`Max tokens (current: ${String(y.maxOutputTokens??``)||`∅`}): `,e)),t=Number.parseInt(String(e??``).trim(),10);if(!Number.isFinite(t)||t<=0){process.stdout.write(`Invalid maxTokens
62
+ `);continue}y.maxOutputTokens=t,await T(),process.stdout.write(`${P(`⚙️`)}set maxTokens=${t}\n`);continue}if(t===`5`||t.toLowerCase()===`autoapprove`){process.stdout.write(`Set env GOATCHAIN_AUTO_APPROVE=1 to skip approval prompts.
63
+ `);continue}}}await Mt(async()=>{let t=0;for(;;){let n=await Te({message:`Settings (set multiple; choose Done to exit)`,options:[{value:`baseUrl`,label:I(`🌐`,`Base URL`)},{value:`apiKey`,label:I(`🔑`,`API key`)},{value:`webSearchKey`,label:I(`🔎`,`Web search (Serper) key`)},{value:`maxTokens`,label:I(`⚙️`,`Max tokens`)},{value:`autoApprove`,label:I(`🧷`,`Auto approve tools (env)`)},{value:`__done__`,label:I(`↩️`,`Done`)}],initialValue:t});if(!n.ok||(t=n.value,n.value===`__done__`))return;if(n.value===`baseUrl`){let e=await Oe({message:`Base URL`,placeholder:b.get()??`https://…/v1`});if(!e.ok)continue;let t=String(e.value).trim();if(!t)continue;await ee(t),process.stdout.write(`${P(`🌐`)}baseUrl set: ${b.get()??``}\n`);continue}if(n.value===`apiKey`){let t=await ke({message:`API key`,placeholder:`sk-…`});if(!t.ok)continue;let n=String(t.value).trim();if(!n)continue;x(n),typeof e?.resetClient==`function`&&e.resetClient(),await T(),process.stdout.write(`${P(`🔑`)}api key set\n`);continue}if(n.value===`webSearchKey`){if(typeof w!=`function`){process.stdout.write(`webSearch config is not supported in this build.
64
+ `);continue}let e=await ke({message:`Serper API key (WebSearch)`,placeholder:`…`});if(!e.ok)continue;let t=String(e.value).trim();if(!t)continue;w({apiKey:t}),await T(),process.stdout.write(`${P(`🔎`)}web search key set\n`);continue}if(n.value===`maxTokens`){let e=await Oe({message:`Max tokens`,placeholder:String(y.maxOutputTokens??``)});if(!e.ok)continue;let t=Number.parseInt(String(e.value).trim(),10);if(!Number.isFinite(t)||t<=0){process.stdout.write(`Invalid maxTokens
65
+ `);continue}y.maxOutputTokens=t,await T(),process.stdout.write(`${P(`⚙️`)}set maxTokens=${t}\n`);continue}if(n.value===`autoApprove`){process.stdout.write(`Set env GOATCHAIN_AUTO_APPROVE=1 to skip approval prompts.
66
+ `);continue}}})},vn=async()=>{let e=()=>{let e=A?.theme;return typeof e==`string`&&e.trim()?e.trim():e&&typeof e==`object`&&typeof e.name==`string`&&String(e.name).trim()?String(e.name).trim():`default`};if(!F()){if(!process.stdout.isTTY){process.stdout.write([`Output / UX:`,`- Default UI is fullscreen; set GOATCHAIN_UI=inline or GOATCHAIN_UI=legacy to disable.`,`- Current settings are persisted in .goatchain config.`,``].join(`
67
+ `));return}process.stdout.write([`Output / UX:`,`1) showTools: ${A?.showTools?`on`:`off`}`,`2) fileChanges: ${A?.showFileChanges?`on`:`off`}`,`3) toolStyle: ${A?.toolStyle??`inline`}`,`4) statusLine: ${A?.showStatusLine?`on`:`off`}`,`5) doneLine: ${A?.showStatus?`on`:`off`}`,`6) emoji: ${A?.emoji?`on`:`off`}`,`7) promptContinue: ${A?.promptContinue?`on`:`off`}`,`8) autoContinue: ${A?.autoContinue?`on`:`off`}`,`9) planMode: ${A?.planMode?`on`:`off`}`,`10) theme: ${e()}`,``].join(`
68
+ `));let t=await new Promise(e=>z.question(`Toggle which? (1-10, empty cancel): `,e)),n=String(t??``).trim();if(!n)return;if(n===`1`)A.showTools=!A.showTools;else if(n===`2`)A.showFileChanges=!A.showFileChanges;else if(n===`3`){let e=await new Promise(e=>z.question(`Tool style [inline/box]: `,e)),t=String(e??``).trim().toLowerCase();if(t!==`inline`&&t!==`box`)return;A.toolStyle=t}else if(n===`4`)A.showStatusLine=!A.showStatusLine;else if(n===`5`)A.showStatus=!A.showStatus;else if(n===`6`)A.emoji=!A.emoji;else if(n===`7`)A.promptContinue=!A.promptContinue;else if(n===`8`)A.autoContinue=!A.autoContinue;else if(n===`9`)A.planMode=!A.planMode;else if(n===`10`){let e=await new Promise(e=>z.question(`Theme [dark/light]: `,e)),t=String(e??``).trim().toLowerCase();if(t!==`dark`&&t!==`light`)return;A.theme=t}else return;await T(),Tn(),N&&Y&&Q(),process.stdout.write(`${P(`💾`)}saved\n`);return}await Mt(async()=>{let t=await Te({message:`Output / UX`,options:[{value:`showTools`,label:I(`🛠️`,`Show tools: ${A?.showTools?`on`:`off`}`)},{value:`showFileChanges`,label:I(`🗂️`,`File changes: ${A?.showFileChanges?`on`:`off`}`)},{value:`toolStyle`,label:I(`🎛️`,`Tool style: ${A?.toolStyle??`inline`}`)},{value:`statusLine`,label:I(`…`,`Status line: ${A?.showStatusLine?`on`:`off`}`)},{value:`doneLine`,label:I(`✅`,`Done line: ${A?.showStatus?`on`:`off`}`)},{value:`emoji`,label:I(`🙂`,`Emoji: ${A?.emoji?`on`:`off`}`)},{value:`promptContinue`,label:I(`💬`,`Prompt continue: ${A?.promptContinue?`on`:`off`}`)},{value:`autoContinue`,label:I(`⏭️`,`Auto continue: ${A?.autoContinue?`on`:`off`}`)},{value:`planMode`,label:I(`🧭`,`Plan mode: ${A?.planMode?`on`:`off`}`)},{value:`theme`,label:I(`🎨`,`Theme: ${e()}`)}],initialValue:0});if(t.ok){if(t.value===`showTools`)A.showTools=!A.showTools;else if(t.value===`showFileChanges`)A.showFileChanges=!A.showFileChanges;else if(t.value===`statusLine`)A.showStatusLine=!A.showStatusLine;else if(t.value===`doneLine`)A.showStatus=!A.showStatus;else if(t.value===`emoji`)A.emoji=!A.emoji;else if(t.value===`promptContinue`)A.promptContinue=!A.promptContinue;else if(t.value===`autoContinue`)A.autoContinue=!A.autoContinue;else if(t.value===`planMode`)A.planMode=!A.planMode;else if(t.value===`toolStyle`){let e=await Te({message:`Tool style`,options:[{value:`inline`,label:`inline (compact)`},{value:`box`,label:`box (verbose)`}],initialValue:A.toolStyle===`box`?1:0});if(!e.ok)return;A.toolStyle=String(e.value)}else if(t.value===`theme`){let t=await Te({message:`Theme`,options:[{value:`dark`,label:`dark`},{value:`light`,label:`light`}],initialValue:e().toLowerCase()===`light`?1:0});if(!t.ok)return;A.theme=String(t.value)}await T(),Tn(),N&&Y&&Q(),process.stdout.write(`${P(`💾`)}saved\n`)}})},yn=async()=>{let e=He?.stopReason?String(He.stopReason):``,t=He?.modelStopReason?String(He.modelStopReason):``,n=Array.isArray(He?.tools)?He.tools:[];if(!(e||t||n.length>0)){process.stdout.write(`${R.dim(`No diagnostics yet (send a message first).`)}\n\n`);return}if(process.stdout.write(`${R.bold(`Last turn diagnostics:`)}\n`),process.stdout.write(`stopReason: ${e||`∅`}\n`),process.stdout.write(`modelStopReason: ${t||`∅`}\n`),n.length>0){process.stdout.write(`${R.bold(`tools:`)}\n`);for(let e of n.slice(-12)){let t=e?.toolName?String(e.toolName):`tool`,n=e?.argsSummary?String(e.argsSummary):``,r=e?.resultSummary?String(e.resultSummary):``;process.stdout.write(`- ${t}${n?` ${n}`:``}${r?` -> ${r}`:``}\n`)}}process.stdout.write(`
69
+ `)};async function Fn(){let e=Date.now();if(Ge&&e-Ge.at<3e4)return Ge.files;let t=(await _e(Z(),{maxFiles:8e3})).map(e=>String(e??``).replace(/\\/g,`/`)).filter(Boolean);Ge={at:e,files:t};let n=new Set;for(let e of t){let t=String(e??``);if(!t)continue;let r=t.split(`/`).filter(Boolean);if(r.length<=1)continue;let i=``;for(let e=0;e<r.length-1;e++){let t=r[e];t&&(i=i?`${i}/${t}`:t,n.add(`${i}/`))}}return Ke={at:e,files:t,dirs:[...n].sort()},t}async function In(){let e=Date.now();if(qe&&e-qe.at<3e4)return qe.files;let t=(await _e(Z(),{maxFiles:8e3})).map(e=>String(e??``).replace(/\\/g,`/`)).filter(Boolean).filter(e=>{let t=String(e).toLowerCase();return t.endsWith(`.png`)||t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)||t.endsWith(`.webp`)||t.endsWith(`.gif`)});return qe={at:e,files:t},t}async function Ln(){if(!F()){if(process.stdout.isTTY){let e=await new Promise(e=>z.question(`Attach mode [path/summary/full] (default summary): `,e)),t=String(e??``).trim().toLowerCase(),n=t===`path`||t===`full`?t:`summary`,r=await new Promise(e=>z.question(`File paths (space-separated, workspace-relative): `,e)),i=String(r??``).trim();if(!i)return;let a=i.split(/\s+/).filter(Boolean),o=[];for(let e of a)try{let t=ge(Z(),e);o.push(S.relative(Z(),t))}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`);return}let s=o.map(e=>`@file(${n}):${e}`).join(` `),c=await new Promise(e=>z.question(`Apply [i]nsert / [s]end now? (default insert): `,e)),l=String(c??``).trim().toLowerCase();if(l===`s`||l===`send`){let e=await new Promise(e=>z.question(`Message (optional): `,e)),t=`${String(e??``).trim()} ${s}`.trim();if(!t)return;await Mn(t);return}let u=String(B.line??``).trim();B.line=u?`${u} ${s}`:`${s} `,B.cursor=String(B.line??``).length,B._refreshLine?.(),X(`Inserted @file markers (send the prompt to attach files).`);return}process.stdout.write([`Attach files:`,`- Use @file(summary):path/to/file (default summary)`,`- Or run @file to pick files (TTY + interactive UI)`,``].join(`
70
+ `));return}let e=await Mt(async()=>{let e=await Fn();if(e.length===0)return process.stdout.write(`[no files found]
71
+ `),null;let t=await Oe({message:`Search files (substring)`,placeholder:`e.g. src/agent or cli/repl`});if(!t.ok)return null;let n=String(t.value??``).trim().toLowerCase(),r=n?e.filter(e=>String(e).toLowerCase().includes(n)):e;if(r.length===0)return process.stdout.write(`[no matches]
72
+ `),null;let i=r.slice(0,240),a=await Ee({message:`Select files (${i.length}${r.length>240?`/${r.length}`:``})`,options:i.map(e=>({value:e,label:e})),required:!0});if(!a.ok)return null;let o=Array.isArray(a.value)?a.value.map(String).filter(Boolean):[];if(o.length===0)return null;let s=await Te({message:`Attach mode`,options:[{value:`path`,label:`Paths only`},{value:`summary`,label:`Summary (head/tail excerpt)`},{value:`full`,label:`Full (size-limited)`}],initialValue:1});if(!s.ok)return null;let c=String(s.value),l=o.map(e=>`@file(${c}):${e}`).join(` `),u=await Te({message:`Apply`,options:[{value:`insert`,label:`Insert into prompt`},{value:`send`,label:`Send now`}],initialValue:0});if(!u.ok)return null;if(u.value===`send`){let e=await Oe({message:`Message`,placeholder:`Optional message to send with attachments`});if(!e.ok)return null;let t=`${String(e.value??``).trim()} ${l}`.trim();return t?{kind:`send`,line:t}:null}return{kind:`insert`,markers:l}});if(!e)return;if(e.kind===`send`){await Mn(e.line);return}let t=String(B.line??``).trim();B.line=t?`${t} ${e.markers}`:`${e.markers} `,B.cursor=String(B.line??``).length,B._refreshLine?.(),X(`Inserted @file markers (send the prompt to attach files).`)}async function Rn(){if(typeof j!=`function`){process.stdout.write(`Workspace switching is not configured (missing switchWorkspace)
73
+ `);return}if(at){X(`Workspace selection already active.`);return}let e=e=>{let t=String(e??``);return t===`~`?C.homedir():t.startsWith(`~/`)||t.startsWith(`~\\`)?S.join(C.homedir(),t.slice(2)):t},t=(t,n)=>{let r=e(n);return S.resolve(t,r)},n=H,r=String(B.line??``),i=Number(B.cursor??0);H=`select_workspace`;let a=!1;try{it?.(),B.line=``,B.cursor=0,$(),V(),X(`Selecting workspace (current: ${Z()}). Tab to complete dirs, Enter to switch, empty Enter to cancel.`);let e=await new Promise(e=>{at={resolve:e}}),n=String(e??``).trim();if(!n){a=!0;return}await j(t(Z(),n)),Tn(),Ge=null,qe=null,process.stdout.write(`${R.green(`workspace:`)} ${Z()}\n`)}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`)}finally{at=null,H=n,$(),a&&n===`normal`&&!String(B.line??``).trim()&&(B.line=r,B.cursor=i),V()}}let zn={autoAttachState:Xe,pendingImages:{get:()=>q,set:e=>{q=e},push:(...e)=>{q.push(...e)}},useClack:F,withClack:Mt,selectWithClack:Te,multiselectWithClack:Ee,textWithClack:Oe,question:e=>new Promise(t=>z.question(e,t)),showInlineHint:X,workspaceCwd:Z,getWorkspaceImages:In,ensureAllowedFile:ge,readFile:v,normalizeUserProvidedPathToken:xe,resolveUserProvidedPathForRead:Se,readImageFileAsDataUrl:L,humanBytes:Un,clearPasteBuffers:()=>{Je=``},setPromptForMode:$,refreshPrompt:V,runChatTurn:Mn};async function Bn(){await Be(zn)}async function Vn(e={}){await Ve(zn,e)}async function Wn(){if(!Re){Re=!0;try{if(!F()){i(l).outputHelp(),process.stdout.write(t());return}await Mt(async()=>{let e=await Te({message:`Command palette`,options:[{value:`continue`,label:I(`▶️`,`Continue (implement now)`)},{value:`edit`,label:I(`📝`,`Compose message in editor…`)},{value:`multiline`,label:I(`✍️`,`Multiline input…`)},{value:`sessions`,label:I(`🗂️`,`Sessions…`)},{value:`workspace`,label:I(`📁`,`Switch workspace…`)},{value:`files`,label:I(`📎`,`Attach file(s)…`)},{value:`images`,label:I(`🖼️`,`Attach image(s)…`)},{value:`model`,label:I(`🤖`,`Switch model…`)},{value:`settings`,label:I(`⚙️`,`Settings…`)},{value:`output`,label:I(`🎛️`,`Output / UX…`)},{value:`diag`,label:I(`🧾`,`Diagnostics`),hint:`Show last turn stop reason + tool calls`}],initialValue:0});if(e.ok){if(e.value===`continue`){await Mn(`继续。不要只说计划:请立刻开始实现,使用 Write/Edit 创建或修改文件。`);return}if(e.value===`edit`){await dn();return}if(e.value===`multiline`){J={lines:[]},$(),X(`Multiline mode: type .send to send, .cancel to cancel.`);return}if(e.value===`sessions`){await An(`/sessions`);return}if(e.value===`workspace`)return Rn();if(e.value===`files`)return Ln();if(e.value===`images`)return Vn();if(e.value===`model`)return Pn();if(e.value===`settings`)return fn();if(e.value===`output`)return vn();if(e.value===`diag`)return yn()}})}finally{Re=!1}}}let Qn=async t=>{if(it?.(),J){if(W){process.stdout.write(`${P(`⏳`)}busy (Ctrl+C to cancel)\n`),z.prompt();return}let e=String(t??``),n=e.trim();if(n===`.cancel`){J=null,$(),X(`Canceled multiline input.`),z.prompt();return}if(n===`.send`){let e=J.lines.join(`
74
+ `).replace(/\s+$/,``);if(J=null,$(),!e.trim()){X(`Canceled (empty message).`),z.prompt();return}await Mn(e),$(),z.prompt();return}J.lines.push(e),z.prompt();return}let n=t.trim();if(!n){H===`select_session`&&(Jt(),H=`normal`,Ae=null,$()),z.prompt();return}if(W){process.stdout.write(`${P(`⏳`)}busy (Ctrl+C to cancel)\n`),z.prompt();return}if(n===`/`){z.prompt();return}if(rt){rt=!1;let e=String(t??``);if(e.includes(`\\n`)){let t=e.replace(/\\n/g,`
75
+ `).replace(/\s+$/,``);if(!t.trim()){z.prompt();return}await Mn(t),z.prompt();return}}if(n.startsWith(`/`)){H===`select_session`&&(Jt(),H=`normal`,Ae=null),await An(n),$(),z.prompt();return}if(H===`select_session`&&Ae){let t=Ae.sessions,r=Zn(t,Ae.filter),i=Number.parseInt(n,10);if(Number.isFinite(i)&&i>=1&&i<=r.length){Jt(),await An(`/use ${r[i-1].sessionId}`),z.prompt();return}Ae.filter=n,$n({sessions:t,currentSessionId:e.session.sessionId,filter:Ae.filter,alt:je,emoji:A?.emoji,ansi:R}),z.prompt();return}if(H===`normal`){let e=String(t??``).trim().replaceAll(`​`,``).replaceAll(`‌`,``).replaceAll(`‍`,``).replaceAll(``,``),n=e.replace(/^\s*[>❯]\s+/u,``),r=n[0],i=n[n.length-1],a=r&&r===i&&(r===`"`||r===`'`||r==="`")||!/\s/.test(n)?xe(e):``,o=a.toLowerCase();if(a&&/\.(?:png|jpe?g|webp|gif|bmp|tiff?)$/.test(o)&&(S.isAbsolute(a)||a.includes(`/`)||a.includes(`\\`)))try{let{absPath:t,withinWorkspace:n}=Se(Z(),e),r=await L(t);if(!r?.dataUrl||!String(r.mime).startsWith(`image/`)){X(`Could not read image: ${t}`),z.prompt();return}q.push({name:S.basename(t),mime:String(r.mime),bytes:Buffer.isBuffer(r.buf)?r.buf.byteLength:0,dataUrl:String(r.dataUrl),source:S.isAbsolute(a)&&!n?`paste`:`path`}),Xe.lastPastedImageName={name:S.basename(t),at:Date.now()},$(),V(),X(`Attached image: ${S.basename(t)} (send a message to include it)`),z.prompt();return}catch(e){X(`Could not attach image: ${e instanceof Error?e.message:String(e)}`),z.prompt();return}}await Mn(n),z.prompt()};Kt=e=>{we=we.then(()=>Qn(e)).catch(e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`)})};let er=()=>{if(!et)return;let e=et;if(et=null,tt&&=(clearTimeout(tt),null),H===`normal`&&!J&&e.length>1){let t=e.join(`\\n`);rt=!0,B.line=t,B.cursor=t.length,$(),V(),queueMicrotask(()=>X(`Pasted ${e.length} line(s). Review/edit, then press Enter to send. Use /multiline for true multi-line editing.`));return}if(e.length===1){Kt(e[0]);return}Kt(e.join(`
76
+ `))},tr=e=>{et||=[],et.push(e),tt&&clearTimeout(tt),tt=setTimeout(()=>{tt=null,er()},30)};z.on(`line`,e=>{if(!ze){if(H===`select_workspace`&&at){let t=at;at=null,t.resolve(String(e??``));return}if(!(G>0)){if(!process.stdin.isTTY){Kt(e);return}if(H===`normal`&&!J){tr(e);return}er(),Kt(e)}}})}export{pn as resolveCommand,er as runRepl};