@x-otto/cli 0.0.1-alpha.50 → 0.0.1-alpha.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{auth-command-BYaFM76w.js → auth-command-DF_POx4L.js} +2 -2
- package/dist/{auth-command-BYaFM76w.js.map → auth-command-DF_POx4L.js.map} +1 -1
- package/dist/build-id-BmQPXMGN.js +3 -0
- package/dist/build-id-BmQPXMGN.js.map +1 -0
- package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/meta.json +1 -1
- package/dist/{command-dispatcher-BLT8IO4K.js → command-dispatcher-FRiCoN16.js} +2 -2
- package/dist/{command-dispatcher-BLT8IO4K.js.map → command-dispatcher-FRiCoN16.js.map} +1 -1
- package/dist/{create-host-app-CbJ8ptv-.js → create-host-app-BgjEc81C.js} +2 -2
- package/dist/{create-host-app-CbJ8ptv-.js.map → create-host-app-BgjEc81C.js.map} +1 -1
- package/dist/{doctor-EndB-ycb.js → doctor-2AA2A9G7.js} +2 -2
- package/dist/{doctor-EndB-ycb.js.map → doctor-2AA2A9G7.js.map} +1 -1
- package/dist/{feedback-QcONRnO3.js → feedback-BsU8b1k9.js} +2 -2
- package/dist/{feedback-QcONRnO3.js.map → feedback-BsU8b1k9.js.map} +1 -1
- package/dist/{feedback-backend-methods-BNm38ddr.js → feedback-backend-methods-C2SzcIzm.js} +2 -2
- package/dist/{feedback-backend-methods-BNm38ddr.js.map → feedback-backend-methods-C2SzcIzm.js.map} +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/{interactive-schedule-Bv__2Kwc.js → interactive-schedule-aQEHfUKL.js} +2 -2
- package/dist/{interactive-schedule-Bv__2Kwc.js.map → interactive-schedule-aQEHfUKL.js.map} +1 -1
- package/dist/{mcp-server-Rr__aWO7.js → mcp-server-C2bw9J2i.js} +2 -2
- package/dist/{mcp-server-Rr__aWO7.js.map → mcp-server-C2bw9J2i.js.map} +1 -1
- package/dist/{parse-cli-Db8pF_Ya.js → parse-cli-C1r2cQ0K.js} +2 -2
- package/dist/{parse-cli-Db8pF_Ya.js.map → parse-cli-C1r2cQ0K.js.map} +1 -1
- package/dist/{serve-K6BOT5K_.js → serve-DHqx-Mab.js} +2 -2
- package/dist/{serve-K6BOT5K_.js.map → serve-DHqx-Mab.js.map} +1 -1
- package/dist/{version-DrCy32wR.js → version-CdzXY8m2.js} +2 -2
- package/dist/{version-DrCy32wR.js.map → version-CdzXY8m2.js.map} +1 -1
- package/package.json +14 -14
- package/dist/build-id-DjE6eVpQ.js +0 -3
- package/dist/build-id-DjE6eVpQ.js.map +0 -1
- package/dist/bundled-extensions/plugin-feedback/otto-plugin.json +0 -24
- package/dist/bundled-extensions/plugin-feedback/panels/feedback.tsx +0 -348
- package/dist/bundled-extensions/plugin-feedback/panels/panel-host-globals.d.ts +0 -67
- package/dist/bundled-extensions/plugin-feedback/panels-dist/feedback.mjs +0 -257
- package/dist/bundled-extensions/plugin-feedback/plugin-dist/meta.json +0 -1
- package/dist/bundled-extensions/plugin-feedback/plugin-dist/plugin.cjs +0 -11304
- package/dist/bundled-extensions/plugin-feedback/plugin.ts +0 -198
- package/dist/bundled-extensions/plugin-feedback/src/coding-adapter.ts +0 -183
- package/dist/bundled-extensions/plugin-feedback/src/coding-lister.ts +0 -26
- package/dist/bundled-extensions/plugin-feedback/src/github-lister.ts +0 -230
- package/dist/bundled-extensions/plugin-feedback/src/issue-aggregator.ts +0 -109
- package/dist/bundled-extensions/plugin-feedback/src/issue-submitter.ts +0 -241
- package/dist/bundled-extensions/plugin-feedback/src/platform-resolver.ts +0 -76
- package/dist/bundled-extensions/plugin-feedback/src/pulse-survey-sink.ts +0 -114
- package/dist/bundled-extensions/plugin-feedback/src/resolved-sink.ts +0 -163
package/dist/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as
|
|
2
|
+
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as ee,Z as T,_ as E,b as D,c as O,d as k,et as A,f as j,g as M,i as N,it as P,j as F,k as I,l as L,n as R,nt as z,o as B,p as V,q as H,r as U,rt as W,s as te,t as ne,tt as re,u as ie,v as ae,w as oe,x as G,y as se,z as ce}from"./command-dispatcher-FRiCoN16.js";import{t as le}from"./version-CdzXY8m2.js";import{i as ue,r as de,t as fe}from"./parse-cli-C1r2cQ0K.js";import{t as pe}from"./discover-with-bundled-CF8qFP41.js";import{t as me}from"./create-host-app-BgjEc81C.js";import{r as he}from"./registry-BUvu-es1.js";import{n as ge}from"./proxy-CFZDVIwI.js";import{n as _e}from"./interactive-schedule-aQEHfUKL.js";import{homedir as K}from"node:os";import{execFile as ve,spawn as ye}from"node:child_process";import{SANDBOX_ESCALATION_MARKER as be,apiCredentialId as xe,buildUnifiedCliCommandRegistry as Se,collectPluginCliCommandsForHelp as Ce,collectPluginThemePresets as we,evaluatePluginTrust as Te,evaluateWorkspaceTrustPrompt as Ee,expandCommandBody as De,findUnifiedCliCommandConflict as Oe,globalAgentJobRegistry as q,globalAgentObservability as J,globalProcessRuntime as Y,installEsbuildExitHook as ke,installEsbuildSignalBridges as Ae,readTaskOutputTail as je,resolvePluginCliBin as Me,resolveSessionTitle as Ne,runInProcessCliCommand as Pe,spawnPluginCli as Fe,trustProject as Ie}from"@x-otto/coding";import{globalProcessRuntime as Le,installExitReaper as Re}from"@x-otto/runtime";import{buildAllowedEnv as ze,checkShellCommand as Be,createLogger as Ve,markStartupPhase as He,rankCandidates as X,setLogLevel as Ue,traceStartupPhase as We,traceStartupPhaseSync as Ge}from"@x-otto/shared";import{BUILD_ID as Ke,OTTO_HOME as qe,OTTO_SESSIONS_DIR as Je,SDK_VERSION as Ye,SERVICE_PORT as Xe,flushEnvWarnings as Ze,isShadowModeEnabled as Qe,loadUserIdentity as $e}from"@x-otto/env";import{dirname as et,join as Z,resolve as tt}from"node:path";import{existsSync as nt}from"node:fs";import{fileURLToPath as rt}from"node:url";import{BASH_HISTFILE_SOURCE as it,COMPACTING_SENTINEL as at,FISH_HISTFILE_SOURCE as ot,ZSH_HISTFILE_SOURCE as st,createBuiltinThemeRegistry as ct,entriesToCommands as lt,formatAgentDiagnosticsText as ut,formatTranscriptText as dt,formatTurnTimeline as ft,i18next as Q,isUsingOverage as pt,observationLiveFields as mt,observationRow as ht,parseBashHistory as gt,parseFishHistory as _t,parseZshHistory as vt,promptParentWorkspaceChoice as yt,promptWorkspaceTrust as bt,setMarkdownThemeUserOverrides as xt,subagentEntryStatus as St}from"@x-otto/tui";import{access as Ct,mkdir as wt,readFile as Tt,readdir as Et,rename as Dt,stat as Ot,unlink as kt,writeFile as At}from"node:fs/promises";import{createModelUsabilityGate as jt}from"@x-otto/ai";import{SESSION_RESUME_WINDOW_MESSAGES as Mt,createProjectorState as Nt,deriveDelegationToolNames as Pt,projectSessionEvent as Ft,resolveChoiceAnswer as It,resolveTextAnswer as Lt,sandboxBypassCommand as Rt,shouldShowPulseSurvey as zt}from"@x-otto/session-contract";function Bt(e=process.stdout){if(process.env.OTTO_TUI_SCOPED_VIEWPORT===`0`&&process.env.OTTO_TUI_CLEAR_ON_EXIT!==`0`&&e.isTTY)try{e.write(`\x1B[2J\x1B[3J\x1B[H`)}catch{}}function Vt(e=process.stdout){if(!e.isTTY)return;let t=e=>{try{e()}catch{}};t(()=>{e.write(`\x1B[?1049l`)}),t(()=>{e.write(`\x1B[?25h`)}),t(()=>{e.write(`\x1B[?1000l\x1B[?1002l\x1B[?1003l\x1B[?1006l`)}),t(()=>{process.stdin.isTTY&&typeof process.stdin.setRawMode==`function`&&process.stdin.setRawMode(!1)})}function Ht(e,t){return e||t}function Ut(e,t){return e===`pin`&&t?`unpin`:e}function Wt(e,t){return e===`pause`&&t?`continue`:e}function Gt(e,t,n){let r=e.list().sort((e,t)=>e.name.localeCompare(t.name)),i=r.map(e=>` /${Ut(e.name,t)}${e.aliases?.length?` (${e.aliases.join(`, `)})`:``}`),a=Math.max(...i.map(e=>e.length)),o=[];for(let e=0;e<r.length;e++){let s=r[e],c=n[Ut(s.name,t)]??n[s.name]??s.description;o.push(`${i[e].padEnd(a)} — ${c}`)}return o.push(``,`Prefixes: !<cmd> run shell | @<file> read file`),o}function Kt(e,t,n,r,i=!1,a=!1){return e.list().filter(e=>e.name===`pause`?t||a:!0).map(e=>{let o=Wt(Ut(e.name,i),a);return{name:o,description:r?.[o]??r?.[e.name]??e.description,disabled:t&&!n.has(e.name)&&e.name!==`abort`,sortKey:e.name,deprecated:e.deprecated}})}function qt(e){for(let t of N)t.tuiHidden||t.envGate&&process.env[t.envGate]!==`1`||(e.has(t.name)&&e.unregister(t.name),e.register({name:t.name,description:t.description??t.name,aliases:t.aliases,deprecated:t.deprecated,type:`action`,source:`builtin`,execute:()=>``}))}function Jt(e,t){let n=new Set(N.flatMap(e=>[e.name,...e.aliases??[]]));for(let r of t.pluginSlashCommands?.()??[])n.has(r.name)||(e.has(r.name)&&e.unregister(r.name),e.register({name:r.name,description:r.description??r.name,aliases:void 0,type:`action`,source:`builtin`,execute:()=>``}))}function Yt(e){let{app:t,getTui:n}=e,r=[],i=()=>{for(let e of r)e();r=[]},a,o,s,l,u,d=()=>{a&&=(clearInterval(a),void 0),o&&=(q.retain(o,!1),void 0),u=void 0},f=()=>{s&&=(clearInterval(s),void 0),l&&=(J?.unpin(l),q.get(l)&&q.retain(l,!1),void 0)};return{clearBgSubs:i,stopBgOutputPoll:d,stopBgSubagentPoll:f,setBgUnsubs:e=>{r=e},handlers:{onBackgroundKill:e=>{if(q.get(e)){q.cancel(e);return}J.abort(e)||Y.kill(e)},onBackgroundApply:e=>{let r=n(),i=e=>r.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:e}]}),a=t.agentJobs.apply(e);if(a.applied){let n=a.forbiddenZone?.length?Q.t(`cmd.bgForbiddenZone`,{count:a.forbiddenZone.length,files:a.forbiddenZone.join(`
|
|
3
3
|
`),id:e}):``;i(Q.t(`cmd.bgJobApplied`,{id:e,message:a.message,zone:n})),a.capabilityTouched&&t.reloadCapabilities().then(e=>{r.plugins.setPluginRegistrations(t.getPluginRegistrations()),r.info.showToast(Q.t(`cmd.titleReload`),Q.t(`cmd.reloadDone`,{mcpTools:e.mcpTools,models:e.models,agents:e.agents,teams:e.teams}))},e=>i(Q.t(`cmd.bgAutoReloadFailed`,{msg:e instanceof Error?e.message:String(e)})))}else{let t=a.conflictPaths.length?Q.t(`cmd.bgConflictFiles`,{joined:a.conflictPaths.join(`
|
|
4
4
|
`)}):``;i(Q.t(`cmd.bgJobIncomplete`,{id:e,status:a.status,message:a.message,conflicts:t}))}},onDelegateSupply:(e,n)=>{t.agentJobs.supply(e,n)},onBackgroundViewOutput:e=>{let t=n(),r=async()=>{let n=e=>{let n=`${e.status}|${e.text}|${e.responseText??``}|${e.diff??``}`;n!==u&&(u=n,t.stores.tasks.setBackgroundOutput(e))},r=q.get(e);if(r){let t=r.status===`running`||r.status===`needs_input`?`running`:r.status===`applied`?`exited`:r.status===`failed`?`failed`:`killed`,i=(r.status===`ready`||r.status===`applied`)&&r.diff?.trim()?r.diff:void 0;n({id:e,command:r.title,status:t,text:je(r.outputPath,20),prompt:J.get(e)?.prompt,diff:i}),t!==`running`&&d();return}let i=J.get(e);if(i){let t=c(J.getMessages(e)??[]),r=J.getStreamingText(e),a=dt(t,r),o=Date.now(),s=ut(ht(i),o),l=ft(J.getTurns(e),o),u=[s.length?s.join(`
|
|
5
5
|
`):``,l.length?l.join(`
|
|
6
6
|
`):``].filter(Boolean).join(`\n${`─`.repeat(40)}\n\n`),f=i.status===`done`?`exited`:i.status===`error`||i.status===`aborted`?`failed`:`running`;n({id:e,command:`@${i.agentName}`,status:f,text:a,messages:t,streamText:r,responseText:u,prompt:i.prompt}),f!==`running`&&d();return}let a=Y.get(e);if(!a){d(),t.stores.tasks.setBackgroundOutput(null);return}let o=a.status===`running`?`running`:a.status===`exited`?`exited`:`killed`,s=``;if(a.logPath)try{s=(await Tt(a.logPath,`utf-8`)).split(`
|
|
7
7
|
`).slice(-20).join(`
|
|
8
|
-
`).trimEnd()}catch{s=``}n({id:e,command:a.command,status:o,text:s}),o!==`running`&&d()};d(),q.get(e)&&(q.retain(e,!0),o=e),a=setInterval(()=>{r()},500),r()},onBackgroundOutputClose:()=>{d()},onBackgroundSwitch:e=>{let t=n();f();let r=()=>{let n=J?.getMessages(e),r=J?.get(e),i=r?.agentName??``,a=q.get(e);a&&(i=a.title||i);let o=n?c(n):[],s=J?.getTurns(e),l=J?.getStreamingText(e),u=Date.now(),d={id:e,title:i,messages:o,status:a?.status??`running`,diagnostics:r?ut(ht(r),u):[],timeline:s?ft(s,u):[],streamText:l};t.panes.switchToSubagentContext(d)};J?.pin(e),q.get(e)&&q.retain(e,!0),l=e,r(),s=setInterval(()=>{r()},500)},onBackgroundDelete:e=>{if(q.get(e)){q.remove(e);return}if(Y.get(e)){Y.remove(e);return}J.remove(e)},onSubagentExit:()=>{f(),n().panes.switchToSubagentContext(null)}}}}const Xt=Ve(`@x-otto/cli:theme-preset-wiring`);function Zt(e,t){let n={kind:`extension`,extensionId:t.pluginId};return e.register(n,{localId:t.localId,label:t.label,appearance:t.appearance,colors:t.colors,markdown:t.markdown})}function Qt(e,t){let n=[];for(let r of t)try{n.push(Zt(e,r))}catch(e){Xt.warn({pluginId:r.pluginId,localId:r.localId,err:String(e)},`theme preset registration failed, skipped`)}return n}function $t(e){let t=ct();return Qt(t,we(e.activePlugins())),t}function en(e,t,n){return e-t<50?`dedup`:n.shellRunning?`kill-shell`:n.busy?n.stopDialogOpen?`escalate-exit`:`open-stop-dialog`:n.idleCtrlCCount+1>=2?`exit-process`:`hint-exit`}function tn(e){let{getTui:t,getSession:n,dispatchAbort:r,clearTodoLayers:i,markUserAborted:a,resetCtrlCCount:o,markRestartRequested:s,stopTui:c,isBusy:l}=e,u=null,d=()=>u!==null&&t()?.info.getCurrentPath()===`/dialog/confirm`,f=()=>{a(),o(),r(),i()},p=e=>{e&&s(),a(),o();try{r()}catch{}c()},m=e=>{if(e===`abort`)return{title:Q.t(`confirm.abortConfirmTitle`),message:Q.t(`confirm.abortConfirmMessage`),confirmLabel:Q.t(`common.abortButton`),extraLabel:Q.t(`common.pauseButton`),onConfirm:()=>{f(),t()?.info.showToast(Q.t(`cmd.titleAborted`),Q.t(`cmd.runAborted`))}};let n=e===`exit-restart`;return{title:n?Q.t(`confirm.exitRestartConfirmTitle`):Q.t(`confirm.exitConfirmTitle`),message:Q.t(`confirm.exitConfirmMessage`),confirmLabel:n?Q.t(`common.abortAndRestartButton`):Q.t(`common.abortAndExitButton`),extraLabel:void 0,onConfirm:()=>{p(n)}}},h=e=>{let r=t();if(!r)return;let i=m(e);u=e,r.modal.openModal({kind:`confirm`,title:i.title,message:i.message,confirmLabel:i.confirmLabel,confirmColor:`amber`,extraLabel:i.extraLabel,extraColor:`accent`,dangerous:!0,onConfirm:()=>{u=null,i.onConfirm()},onCancel:()=>{u=null},onExtra:i.extraLabel?()=>{u=null,n().pauseRun()?t()?.info.showToast(Q.t(`cmd.titlePaused`),Q.t(`cmd.runWillPauseAfterTurn`)):t()?.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.noRunningTaskToPause`))}:void 0})};return{requestStop:e=>{if(!t()){e===`abort`?f():p(e===`exit-restart`);return}if(e!==`abort`&&!l()){p(e===`exit-restart`);return}h(e)},isStopDialogOpen:d,escalateToExit:()=>{let e=t();!e||!d()||(h(`exit`),e.modal.resolveConfirm(!0))},abortNow:f}}var nn=class{entries=[];filePath;constructor(e,t=Z(qe,`sessions`)){this.filePath=Z(t,`${e}.history.json`)}list(e){return this.entries.slice(-(e??100))}append(e){e.trim()&&(this.entries.push(e),this.entries.length>100&&(this.entries=this.entries.slice(-100)))}hydrate(e){this.entries=e.slice(-100)}async persist(){if(Qe())return;let e=JSON.stringify(this.entries,null,2),t=`${this.filePath}.tmp`;try{await wt(et(this.filePath),{recursive:!0}),await At(t,e,`utf-8`),await Dt(t,this.filePath)}catch(e){throw await kt(t).catch(()=>{}),e}}async load(){try{let e=await Tt(this.filePath,`utf-8`),t=JSON.parse(e);return Array.isArray(t)&&t.every(e=>typeof e==`string`)?(this.entries=t.slice(-100),this.entries):[]}catch{return[]}}};const rn={[st]:e=>vt(e),[it]:e=>gt(e),[ot]:e=>_t(e)};function an(){let e=process.env.SHELL??``,t=K(),n=process.env.HISTFILE;return e.includes(`fish`)?[{id:ot,path:Z(t,`.local/share/fish/fish_history`)},{id:ot,path:Z(t,`.config/fish/fish_history`)}]:e.includes(`bash`)?[{id:it,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.bash_history`)}]:e.includes(`zsh`)||!e?[{id:st,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.zsh_history`)}]:[]}function on(e){let t=e?.sources?.filter(e=>e?.enabled!==!1&&!!e?.id&&!!e?.path);if(t&&t.length>0){let e=K();return t.map(t=>({id:t.id,path:sn(t.path,e)}))}return an()}function sn(e,t){return e.startsWith(`~/`)?Z(t,e.slice(2)):e===`~`?t:e}async function cn(e){try{return await Ct(e),!0}catch{return!1}}async function ln(e,t){let n=rn[e.id];if(!n||!await cn(e.path))return[];try{return n(await Tt(e.path,`utf8`)).slice(-t)}catch{return[]}}async function un(e){if(e?.enabled!==!0)return[];let t=e.maxEntries??2e3,n=on(e),r=new Set,i=[];for(let e of n){if(r.has(e.path))continue;r.add(e.path);let n=await ln(e,t);i.push(...n)}return i.slice(-t)}async function dn(e,t){let n=new nn(e.id);return{historyStore:n,inputHistory:await n.load().then(t=>{if(t.length>0)return t;let r=e.session.getInputHistory();return r&&r.length>0?(n.hydrate(r),n.persist().catch(()=>{}),e.session.setInputHistory([]),r):[]}),externalHistoryCommands:t?.enabled===!0?lt(await un(t)):void 0}}async function fn(e,t,n){if(n){let n=t.settings.get(`model`);if(typeof n==`string`&&n&&e.model?.id!==n){let r=t.modelRegistry.find(n);r&&await t.providerRegistry.hasCredential(r.provider)&&(e.applyModel(r),t.storage.memory?.reconfigure?.({contextWindow:r.contextWindow,maxOutput:r.maxOutputTokens}))}}{let n=t.settings.get(`thinking_level`),r=[`low`,`medium`,`high`,`xhigh`,`max`],i=n===`minimal`?`low`:n;typeof i==`string`&&r.includes(i)&&e.applyThinkingLevel(i)}}async function pn(e,t){let n=`__otto_setup__`,r=e.settings.get(`permission_mode`);(r===void 0||r===`auto`)&&await e.settings.update({permission_mode:`confirm`}),e.modelRegistry.getAll().length===0&&e.modelRegistry.register({id:n,name:`Setup required`,provider:`otto`,api:`otto`,baseUrl:``,reasoning:!1,input:[`text`],contextWindow:32e3,maxOutputTokens:4e3});let i=t.continueSession?e.getSession(t.continueSession)??await e.sessionManager.restore(t.continueSession)??void 0:void 0,a=i?i.session.buildContext().messages.filter(e=>{let t=e.role;return t===`user`||t===`assistant`}).length:0,o={value:i?e.sessionManager.consumeCrashGap(i.id):void 0},s=t.continueSession?i?Q.t(`cmd.resumeRestored`,{idShort:t.continueSession.slice(0,8),count:a}):Q.t(`cmd.resumeNotFound`,{id:t.continueSession}):void 0,c=!!(t.continueSession&&i),l=!!(t.model||e.settings.get(`model`)||e.settings.get(`model_slots`)?.default),u={skip:!1},d=await e.hydrateModelCache().catch(()=>new Set),f=e.modelRegistry.getAll().every(e=>e.id===n),p=f?!1:l,m=e.modelRegistry.getAll().find(e=>e.id!==n)??e.modelRegistry.getAll()[0],h=i??await e.createSession({interactive:!0,retryAccelerate:u,...p?{}:{model:m}});await fn(h,e,!!i);let g=p||c,_={get value(){return g},set value(e){g=e}},v={models:e.modelRegistry.getAll().filter(e=>e.id!==n).map(e=>({id:e.id,name:e.name,provider:e.provider,api:e.api,strengths:e.strengths??[],contextWindow:e.contextWindow})),availableModelIds:new Set([...d,...e.getSessionAvailableModels(h.id)]),wasUnconfigured:!1};v.wasUnconfigured=v.availableModelIds.size===0;let y=()=>e.setSessionAvailableModels(h.id,[...v.availableModelIds]);y();let b=new R(ie({modelRegistry:e.modelRegistry,authStore:e.authStore,settings:e.settings,selectedModelId:()=>h.model?.id,isModelUsable:jt(e.authStore,`delegation`),isModelUsableInMainSession:jt(e.authStore,`main-session`)})),x,S={get value(){return x},set value(e){x=e}},C=async t=>{let r=await e.refreshModels().catch(()=>[]);v.models=e.modelRegistry.getAll().filter(e=>e.id!==n).map(e=>({id:e.id,name:e.name,provider:e.provider,api:e.api,strengths:e.strengths??[],contextWindow:e.contextWindow}));for(let e of r)if(e.status===`ok`)for(let t of e.availableIds??[])v.availableModelIds.add(t);v.models.length>0&&e.modelRegistry.getAll().some(e=>e.id===n)&&e.modelRegistry.unregister(n),y();let i=v.availableModelIds.size===0,a=S.value;a?.stores?.tasks?.setNeedsSetup?.(i);let o=await b.refresh().catch(()=>null);if(o&&a?.stores?.tasks?.setFtueStage?.(o.stage),v.wasUnconfigured&&!i&&(v.wasUnconfigured=!1,a?.info?.showToast?.(Q.t(`cmd.titleSetupReady`),Q.t(`cmd.setupReadyMessage`))),t){let e=r.filter(e=>e.status===`ok`);t(e.length>0?Q.t(`cmd.modelsRefreshed`,{summary:e.map(e=>`${e.provider} ${e.total}`).join(` · `)}):Q.t(`cmd.modelsRefreshedEmpty`))}};return C(),{session:h,startupCrashGapRef:o,resumedNote:s,modelReadyRef:_,registryOnlyPlaceholder:f,firstRealModel:m,modelRefreshState:v,persistAvailable:y,ftueController:b,refreshModelsNow:C,tuiRefBox:S,SETUP_PLACEHOLDER_ID:n,continuedExisting:c,retryAccelerate:u,resumed:i,convoCount:a}}function mn(e){let t=[],n=0,r=``,i=()=>{r&&=(t.push(r),``)};for(;n<e.length;){let t=e[n];if(t===` `||t===` `){i(),n++;continue}if(t===`\\`){n++,n<e.length&&(r+=e[n]),n++;continue}if(t===`"`){n++;let t=hn(e,n,`"`);r+=t.value,n=t.next;continue}if(t===`'`){n++;let t=hn(e,n,`'`,!1);r+=t.value,n=t.next;continue}r+=t,n++}return i(),{tokens:t}}function hn(e,t,n,r=!0){let i=``,a=t;for(;a<e.length;){let t=e[a];if(r&&t===`\\`){a++,a<e.length&&(i+=e[a]),a++;continue}if(t===n)return a++,{value:i,next:a};i+=t,a++}return{value:i,next:a}}function gn(e){let t=e.trim();if(!t.startsWith(`/`)||t===`/`||t.startsWith(`//`))return{isCommand:!1,text:t};let{tokens:n}=mn(t.slice(1));if(n.length===0)return{isCommand:!1,text:t};let[r,...i]=n;return{isCommand:!0,command:r,args:i}}async function _n(e,t){let n=e;for(;n.type===`response`&&n.endReason===`max-tool-turns`&&n.notice;){if(!await t.askBudgetContinue()){t.onBudgetStopped();return}t.beforeContinuationTurn();let e=await t.runTurn(`Continue with the remaining work until the task is complete.`);if(t.onTurnResult(e)===`exit`)return;n=e}}const vn=[{extensionId:`plugin-browser-use`,reasonKey:`capability.reasonWebApp`,detect:async e=>{let t=await e.packageDependencyNames();return[`react`,`vue`,`next`,`nuxt`,`svelte`,`vite`,`@angular/core`,`express`,`koa`,`fastify`].some(e=>t.has(e))?!0:e.hasFile(`index.html`)}},{extensionId:`plugin-mobile-use`,reasonKey:`capability.reasonMobile`,detect:async e=>{if(await e.hasFile(`AndroidManifest.xml`)||await e.hasFile(`build.gradle`)||await e.hasFile(`build.gradle.kts`)||await e.hasFile(`Info.plist`)||await e.hasFile(`Podfile`))return!0;let t=await e.packageDependencyNames();return t.has(`react-native`)||t.has(`expo`)}},{extensionId:`plugin-schedule`,reasonKey:`capability.reasonSchedule`,detect:async e=>{if(await e.hasFile(`crontab`))return!0;let t=await e.packageDependencyNames();return t.has(`node-cron`)||t.has(`node-schedule`)||t.has(`agenda`)}}];async function yn(e,t,n=vn){let r=[];for(let i of n){if(t.has(i.extensionId))continue;let n=!1;try{n=await i.detect(e)}catch{n=!1}n&&r.push({extensionId:i.extensionId,reasonKey:i.reasonKey})}return r}function bn(e,t,n,r){return{ts:r?.ts??Date.now(),sessionId:n,...r?.turn===void 0?{}:{turn:r.turn},kind:`lifecycle`,node:e,payload:t}}function xn(e){let t=new Map;if(e?.role===`assistant`&&Array.isArray(e.content))for(let n of e.content)n.type===`tool_call`&&t.set(n.id,n);return t}async function Sn(e,t,n){let r,i=new Set,a=new Map,o=new Set,s=new Map;if(n){let n=await e.loadTailEntries(t,Mt);r=n.length>0?n[0].seq:0;for(let e of n)e.type===`message`&&i.add(e.seq)}else r=await e.getEntryCount(t);return{async loadEarlier(n=500){if(r<=0)return null;let l=await e.loadEntriesBefore(t,r,n);if(l.length===0)return null;let u=new Map,d=new Set;for(let e of l){if(e.type!==`message`)continue;let t=e.data;if(t?.role===`assistant`)for(let[e,n]of xn(t))u.set(e,n);else t?.role===`tool_result`&&typeof t.toolCallId==`string`&&d.add(t.toolCallId)}let f=[],p=(e,t)=>({...e,id:`hist-${t}`,seq:t});for(let e of l){if(e.type===`clear`){r=0,f.length=0;continue}if(e.type!==`message`||i.has(e.seq))continue;let t=e.data;if(!t||typeof t.role!=`string`||t.internal)continue;if(t.role===`tool_result`){let n=a.get(t.toolCallId??``)??u.get(t.toolCallId??``);if(n){let r=n.arguments??{};f.push(p({role:`tool`,name:t.toolName||n.name||`tool`,args:x(r),argsObj:r,result:C(t.content),isError:t.isError},e.seq)),o.add(t.toolCallId)}else s.set(t.toolCallId,{toolName:t.toolName,content:t.content,isError:t.isError});continue}if(t.role===`assistant`){let n=xn(t);if(n.size>0){let r=new Set([...d,...o,...s.keys()]),i=c([t],{resolvedIds:r});for(let t of i)f.push(p(t,e.seq));for(let[t,r]of n){if(d.has(t))continue;let n=s.get(t);if(n){s.delete(t);let i=r.arguments??{};f.push(p({role:`tool`,name:r.name,args:x(i),argsObj:i,result:C(n.content),isError:n.isError??!1},e.seq))}}continue}}let n=c([t]);for(let t of n)f.push(p(t,e.seq))}for(let[e,t]of u)a.set(e,t);return r>0&&(r=l[0].seq),f.length>0?f:null}}}function Cn(e){let{app:t,getTui:n,getTuiRef:r,getSession:i,getCliCtx:a,historyStore:s}=e;return{onCyclePermissionMode:()=>{let e=n(),r=u(t.getPermissionMode());e.stores.tasks.setPermissionMode(r),e.info.showToast(Q.t(`cmd.titlePermission`),Q.t(`pref.permModeSwitched`,{label:Q.t(`pref.permModeLabel`,{context:r})})),t.setPermissionMode(r)},onHistoryPush:t=>{try{s.hydrate([...t]),s.persist().catch(()=>{})}catch{}e.getPasteBinder?.()?.save(i().id)},onDraftSave:e=>{let n=i(),a=n.session.getDrafts()??[],s=l(void 0,e,a),c=o([...a,s]);n.session.setDrafts(c),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(f(c))},onDraftDelete:e=>{let n=i(),a=(n.session.getDrafts()??[]).filter(t=>t.id!==e);n.session.setDrafts(a),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(f(a))},onDraftDeleteMany:e=>{let n=i(),a=new Set(e),o=(n.session.getDrafts()??[]).filter(e=>!a.has(e.id));n.session.setDrafts(o),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(f(o))},onA2uiAction:(e,t,n)=>{V(`a2ui-action`,n?[e,t,JSON.stringify(n)]:[e,t],a())},onStatusRefresh:()=>{V(`status`,[],a())},onProxySubmitUrl:e=>{V(`preference`,[`proxy`,e],a())},onProxyToggleEnabled:()=>{V(`preference`,[`proxy`,t.settings.get(`proxy`)?.enabled===!1?`on`:`off`],a())},onProxyClear:()=>{V(`preference`,[`proxy`,`clear`],a())},onProxyTest:()=>{V(`preference`,[`proxy`,`test`],a())}}}function wn(e){return{...Tn(e),pluginSource:e.pluginSource,intervalSeconds:e.errorRetryIntervalSeconds}}function Tn(e){let{msg:t,provider:n,authError:r,isRefreshFailed:i,unsupported:a,rateLimit:o,rateLimitInfo:s,getErrorRetryAttempt:c,incErrorRetryAttempt:l,errorRetryMax:u,retryQueued:d,resetAndRetry:f,cancelRetry:p,switchModelThenRetry:m,goToAuth:h}=e;if(s)return s.resetsAt===void 0?{reason:t,attempt:0,max:u,mode:`manual`,limitType:s.limitType,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:d}],onExpired:()=>{},onCancel:p}:{reason:t,attempt:0,max:u,mode:`resetsAt`,resetsAt:s.resetsAt,limitType:s.limitType,actions:[{kind:`retryNow`,label:Q.t(`error.retryNow`),run:d},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m}],onExpired:d,onCancel:p};if(r)return{reason:i?Q.t(`cmd.authRefreshFailed`,{ps:n?` (${n})`:``,ls:n?` ${n}`:``}):Q.t(`cmd.authFailed`,{ps:n?` (${n})`:``,ls:n?` ${n}`:``}),attempt:c(),max:u,mode:`manual`,actions:[{kind:`login`,label:Q.t(`model.goToLoginButton`),run:h},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:d}],onExpired:()=>{},onCancel:p};if(a)return{reason:Q.t(`cmd.modelNotSupported`),attempt:c(),max:u,mode:`manual`,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:d}],onExpired:()=>{},onCancel:p};let g=l(),_=g>u;return{reason:o?Q.t(`cmd.rateLimitedRetriesExhausted`):Q.t(`cmd.requestFailed`,{msg:t}),attempt:Math.min(g,u),max:u,mode:`auto`,exhausted:_,actions:[{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:_?f:d}],onExpired:_?()=>{}:d,onCancel:p}}function En(e){let{err:t}=e,n=t instanceof Error?t.message:String(t),r=t?.code===`AGENT_ABORTED`||t instanceof Error&&t.name===`AbortError`;if(!(e.submitState.userAborted||r)){let r=e.provider,a=t?.code,o=t?.pluginSource,{authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,pluginSource:f}=d(n,a,o),p=e.rateLimitInfoRef.current;e.rateLimitInfoRef.current=void 0;let m=(()=>{let t=e.cliCtx,n=t?.app?.storage?.traceStore,r=t?.state?.session;if(!n||!r)return null;let i=r.session.getTurnCount();return{traceStore:n,sessionId:r.id,...i===void 0?{}:{turn:i}}})(),g=()=>{m&&h(m,{attempt:e.errorRetryAttemptRef.current+1,max:e.ERROR_RETRY_MAX,mode:p?`resetsAt`:s||l?`manual`:`auto`,reason:n.slice(0,120)}),e.retryModeRef.current=!0;let t=e.latestSubmittedPromptRef?.current,r=e.tui.engine.takeLastQueuedFollowUp?.(),i=t!=null&&t.text!==e.text,a=i?t.text:r?.text??e.text,o=i?t.mode:r?.mode??e.mode;a===e.text&&!i&&r==null&&e.retryLastRound?.()||queueMicrotask(()=>e.handleSubmit?.(a,o,`send`))};e.tui.engine.showErrorRetry(wn({msg:n,provider:r,authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,rateLimitInfo:p,pluginSource:f,getErrorRetryAttempt:()=>e.errorRetryAttemptRef.current,incErrorRetryAttempt:()=>++e.errorRetryAttemptRef.current,errorRetryMax:e.ERROR_RETRY_MAX,errorRetryIntervalSeconds:e.ERROR_RETRY_INTERVAL_SECONDS,retryQueued:g,resetAndRetry:()=>{m&&L(m),e.errorRetryAttemptRef.current=0,g()},cancelRetry:()=>{m&&i(m,{attempt:e.errorRetryAttemptRef.current}),e.errorRetryAttemptRef.current=0},switchModelThenRetry:()=>{e.handleModel([],e.cliCtx,{afterSwitch:g})},goToAuth:()=>{e.handleProviderAuth([r??``].filter(Boolean),e.cliCtx)}}))}}function Dn(e){let t=[...e].reverse().find(e=>e.role===`user`);if(t)return Array.isArray(t.content)?t.content.map(e=>e&&typeof e==`object`&&`text`in e&&typeof e.text==`string`?e.text:``).join(``):String(t.content??``)}function On(e,t){return t===void 0?!1:e===t}function kn(e){return e.trim().length===0}function An(e){let{tui:t,app:n,submitState:r}=e;return(e,i=`!!`)=>{let a=e.trim();if(!a)return;let o=Be(a);if(!o.safe){t.info.showToast(Q.t(`cmd.titleShell`),Q.t(`cmd.dangerousBlocked`,{reason:o.reason})),t.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`cmd.dangerousBlockedDetail`,{reason:o.reason,cmd:a})}]});return}t.messages.echoUserInput(`${i} ${a}`),t.shell.startShellExecution(a),r.shellChild=ye(a,{shell:!0,cwd:n.workspaceDir,stdio:[`ignore`,`pipe`,`pipe`],env:ze()}),Le.registerChild({command:a,args:[],owner:{type:`cli-shell`,id:`!!`},category:`shell`,lifecycle:`evictable`,cwd:n.workspaceDir},r.shellChild),r.shellChild.stdout.on(`data`,e=>{t.shell.appendShellOutput(e.toString(`utf-8`))}),r.shellChild.stderr.on(`data`,e=>{t.shell.appendShellOutput(e.toString(`utf-8`))}),r.shellChild.on(`close`,(e,n)=>{r.shellChild=null,n?t.shell.finishShellExecution(null,void 0,!0):t.shell.finishShellExecution(e)}),r.shellChild.on(`error`,e=>{r.shellChild=null,t.shell.finishShellExecution(null,`\nError: ${e.message}`)})}}function jn(e){let{agentProcessingRef:t,tui:n,requestStop:r}=e;return(e,i)=>{let a=gn(e);return a.isCommand&&a.command.toLowerCase()===`abort`&&i===`send`?(t.value?r(`abort`):n.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.noRunningTask`)),!0):!1}}function Mn(e){let{app:n,tui:r}=e;return async e=>{let i=e.trim();if(!i)return;if(!n.storage.autoMemory){r.info.showToast(Q.t(`cmd.titleMemory`),Q.t(`cmd.memoryDisabled`));return}let a=await t(i,process.env.OTTO_MEMORY_LLM_NAMING===`1`?n.completeText:void 0);await n.storage.autoMemory.record(a),r.messages.echoUserInput(`# ${i}`),r.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`cmd.memorySaved`,{name:a.name})}]})}}function Nn(e){let t=e.terminated===!0?Q.t(`shell.askAiTerminated`):e.exitCode===null?Q.t(`shell.unknownError`):Q.t(`shell.exitCode`,{code:e.exitCode}),n=e.output.length>5e4?`${e.output.slice(0,5e4)}\n${Q.t(`shell.truncated`)}`:e.output;return Q.t(`shell.prompt`,{command:e.command,errorLabel:t,output:n})}function Pn(e,t){let n=e=>`${e.kind}\u0000${e.label}`,r=n(t);return[t,...e.filter(e=>n(e)!==r)].slice(0,5)}function Fn(e){return{label:e.label,value:e.value,kind:e.kind,description:e.description}}function In(e){return e.map(e=>({label:e.label,value:e.value,kind:e.kind,description:e.description,source:`recent`}))}async function Ln(e){let{runtime:t,app:n,session:i,options:a,tuiRefBox:o,tuiRef:s,turn:c,projState:l,redState:u,isBusyNow:d,dispatchToEngine:p,stopController:m,finishInteractive:h,stopTuiGuarded:g,applyModel:_,ensureModelUsableForPrompt:b,refreshSlashCommands:x,fileCommands:S,modelReady:C,availableModelIds:w,currentModel:T,fmtDisplayModel:E,cfgLang:D,themeRegistry:O,presetSelection:A,keybindingOverrides:j,continuedExisting:P,convoCount:F,historyStore:I,inputHistory:L,externalHistoryCommands:R,bg:B,interactive:H,allCommandNames:W}=e;t.providerAuthRef.current=e=>{ee([e],t.cliCtxRef.current).catch(()=>{})};let ne,re=n.getResilienceConfig().errorRetry.maxAttempts;He(`startTui() begin`);let ie=performance.now(),ae=k(await te(n.workspaceDir,{readdir:e=>Et(e,{withFileTypes:!0})})).map(e=>Q.t(e));return{stdin:process.stdin,stdout:process.stdout,modelName:E(T),needsSetup:w.size===0,promptSuggestions:ae,commands:t.slashCommands,pluginInput:n.pluginInput,isImmediateCommand:e=>d()?U.has(e):W.has(e),isInterruptCommand:e=>e===`abort`,isAgentBusy:d,isPaused:()=>i.isPaused,initialPath:P&&F>0?`/`:`/home`,shadow:n._shadow,welcome:{cwd:process.cwd(),version:Ye,buildId:Ke,nickname:n.settings.get(`nickname`)||void 0,updateAvailable:void 0},onSessionSelect:e=>{V(`session`,[`resume`,e],t.cliCtxRef.current)},onInstallCapability:e=>{import(`./command-dispatcher-BLT8IO4K.js`).then(e=>e.h).then(({runPluginInstall:n})=>n(e,t.cliCtxRef.current))},onDismissCapabilityRecommendations:()=>{s.value?.stores.tasks.dismissCapabilityRecommendations()},loadHistory:n.sessionRepoRef?.current?await(async()=>{let e=n.sessionRepoRef.current;if(!e)return;let t=await Sn(e,i.id,!!a.continueSession);return e=>t.loadEarlier(e.limit)})():void 0,language:D,themeRegistry:O,presetSelection:A,keybindingOverrides:j,permissionMode:n.getPermissionMode(),onFocusChange:e=>n.setTerminalFocus(e),...B.handlers,initialHistory:L,externalHistoryCommands:R,residencyGovernor:n._residencyGovernor,resolveWholeFileDiff:async(e,t)=>{try{return await v(tt(n.workspaceDir,e),t)}catch(e){return{error:e instanceof Error?e.message:String(e)}}},initialDrafts:f(i.session.getDrafts()??[]),initialRecentMentions:In(n.settings.get(`recent_mentions`)??[]),onSigilSelect:e=>{let t=Pn(n.settings.get(`recent_mentions`)??[],Fn(e));n.settings.persist({recent_mentions:t}).catch(()=>{}),s.value?.stores.tasks.setRecentMentions(In(t))},...Cn({app:n,getTui:()=>o.value,getTuiRef:()=>s.value,getSession:()=>i,getCliCtx:()=>t.cliCtxRef.current,historyStore:I,getPasteBinder:()=>t.cliCtxRef.current.callbacks.pasteBinder}),onQueueSendNow:(e,n)=>{if(n===`memory`){t.runMemoryCaptureRef.current(e);return}if(n===`bash`||n===`bash_async`){t.runAsyncBashRef.current(e,n===`bash`?`!`:`!!`);return}ne?.(e,`send`,d()?`steer`:`send`)},onSubmit:ne=async(e,a,f)=>{if(c.ctrlCCount=0,f===`action`){try{await r(e,{currentModelId:i.model?.id,applyModel:_,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),y(e,{currentEffort:i.thinkingLevel,applyEffort:e=>N(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:G.join(` / `)}))})}catch(e){o.value.info.showToast(Q.t(`cmd.titleModel`),e instanceof Error?e.message:String(e))}return}if(t.handleAbortInterceptRef.current(e,a))return;if(i.isPaused&&i.resumeRun(),f===`steer`&&i.isBusy){let n=y(await r(e,{currentModelId:i.model?.id,applyModel:_,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),{currentEffort:i.thinkingLevel,applyEffort:e=>N(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:G.join(` / `)}))});if(kn(n))return;c.latestSubmittedPrompt={text:n,mode:a};let{id:s}=i.steer(n);o.value.pending.setPendingSteer(n,s);return}if(a===`memory`){await t.runMemoryCaptureRef.current(e);return}if(a===`bash`||a===`bash_async`){t.runAsyncBashRef.current(e,a===`bash`?`!`:`!!`);return}let p=gn(e),m=e,h=e,g=!1;if(p.isCommand){if(await V(p.command,p.args,t.cliCtxRef.current))return;n.firePluginActivationEvent?.(`onCommand:${p.command}`);let e=S.find(e=>e.name===p.command);e&&(g=!0,m=await De(e.body,{args:p.args,workspaceDir:n.workspaceDir}))}let v=p.isCommand&&!g&&z.has(p.command.toLowerCase());if(!v&&!C&&(!p.isCommand||g)){o.value.info.showToast(Q.t(`cmd.titleSetupRequired`),Q.t(`cmd.noModelConfigured`));return}if(l.todoList.length>0&&l.todoList.every(e=>e.status===`done`||e.status===`skipped`||e.status===`failed`)&&(l.todoList=[],o.value.stores.tasks.setTasks([]),i.session.setTodoList([])),d()&&(!p.isCommand||g)){o.value.engine.enqueueFollowUp(e,a),o.value.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`queue.dFollowUpToast`));return}if(!v&&await b()===`abort`||(c.userAborted=!1,m=await r(m,{currentModelId:i.model?.id,applyModel:_,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),m=y(m,{currentEffort:i.thinkingLevel,applyEffort:e=>N(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:G.join(` / `)}))}),kn(m)))return;v||(o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!0}),c.agentProcessing=!0,o.value.plugins.setCommands(x())),c.latestSubmittedPrompt={text:e,mode:a},c.retryMode||(c.errorRetryAttempt=0),c.retryMode=!1,u.lastTasks=l.todoList.slice();let w=r=>{En({err:r,submitState:c,provider:i.model?.provider,rateLimitInfoRef:{get current(){return c.lastRateLimitInfo},set current(e){c.lastRateLimitInfo=e}},retryModeRef:{get current(){return c.retryMode},set current(e){c.retryMode=e}},errorRetryAttemptRef:{get current(){return c.errorRetryAttempt},set current(e){c.errorRetryAttempt=e}},ERROR_RETRY_MAX:re,ERROR_RETRY_INTERVAL_SECONDS:n.getResilienceConfig().errorRetry.intervalMs/1e3,handleSubmit:ne,retryLastRound:()=>On(Dn(i.session.messages()),h??e)?(o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!0}),c.agentProcessing=!0,i.retryLastRound().catch(t=>{if(t?.code===`RETRY_NO_RESUMABLE_ROUND`){queueMicrotask(()=>ne?.(h??e,a,`send`));return}o.value.pending.withdrawPendingEcho(),w(t)}).finally(()=>{c.agentProcessing=!1,o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!1})}),!0):!1,latestSubmittedPromptRef:{get current(){return c.latestSubmittedPrompt},set current(e){c.latestSubmittedPrompt=e}},text:h??e,mode:a,handleModel:M,handleProviderAuth:ee,cliCtx:t.cliCtxRef.current,tui:o.value})};try{h=m,m=await n.expandSigilChips(m,{skipPrefixes:new Set([`model`])}),(!p.isCommand||g)&&!c.retryMode&&(o.value.messages.echoUserInput(m,{pending:!0}),o.value.pending.setPendingEcho(m,a),n.settings.get(`first_prompt_submitted_at`)===void 0&&(n.settings.persist({first_prompt_submitted_at:Date.now()}).catch(()=>{}),n.storage.traceStore.append(i.id,bn(`ftue.first_prompt.submitted`,{timeToFirstPromptMs:Math.round(performance.now()-ie)},i.id,{turn:i.session.getTurnCount()})).catch(()=>{}),(async()=>{let e=await yn({hasFile:async e=>{try{return await Ot(Z(n.workspaceDir,e)),!0}catch{return!1}},packageDependencyNames:async()=>{try{let e=await Tt(Z(n.workspaceDir,`package.json`),`utf-8`),t=JSON.parse(e);return new Set([...Object.keys(t.dependencies??{}),...Object.keys(t.devDependencies??{})])}catch{return new Set}}},new Set(n.activePlugins().map(e=>e.id))).catch(()=>[]);s.value?.stores.tasks.setCapabilityRecommendations(e)})()));let e=m;h=e,c.latestSubmittedPrompt={text:e,mode:a},c.streamedText=!1;let r=await H.handleInput(e);if(r.type===`exit`){t.handleExitRef.current(r);return}if(r.type===`help`){o.value.modal.openModal({kind:`helpViewer`,title:`Help`,lines:Gt(t.reg,i.pinned,Q.t(`cmdDesc`,{returnObjects:!0})),onDismiss:()=>{}});return}r.type!==`noop`&&r.text&&!c.streamedText&&(r.type===`system`&&r.text.length<=80?o.value.info.showToast(Q.t(`cmd.titleInfo`),r.text):o.value.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:r.text}]})),r.type===`response`&&r.endReason&&(o.value.pending.clearPendingEcho(),r.notice&&o.value.info.showToast(Q.t(`cmd.titleInfo`),r.notice)),await _n(r,{runTurn:e=>H.handleInput(e),onTurnResult:e=>e.type===`exit`?(t.handleExitRef.current(e),`exit`):(e.type!==`noop`&&e.type!==`help`&&e.text&&!c.streamedText&&o.value.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:e.text}]}),`continue`),askBudgetContinue:()=>new Promise(e=>{o.value.modal.openModal({kind:`select`,title:Q.t(`budget.exhaustedTitle`),layout:`buttons`,options:[{label:Q.t(`budget.continue`),value:`go`,color:`accent`},{label:Q.t(`budget.stop`),value:`stop`,color:`amber`}],onSelect:t=>e(t===`go`),onCancel:()=>e(!1)})}),onBudgetStopped:()=>{o.value.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`budget.stoppedNote`)}]})},beforeContinuationTurn:()=>{c.streamedText=!1}})}catch(e){o.value.pending.withdrawPendingEcho(),w(e)}finally{c.agentProcessing=!1,c.userAborted=!1,o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!1}),o.value.plugins.setCommands(x())}},onInterrupt:()=>{let e=Date.now(),t=en(e,c.lastCtrlCTime,{shellRunning:!!c.shellChild,busy:d()||i.isPaused,stopDialogOpen:m.isStopDialogOpen(),idleCtrlCCount:c.ctrlCCount});if(t!==`dedup`)switch(c.lastCtrlCTime=e,t){case`kill-shell`:c.shellChild.kill(`SIGTERM`),setTimeout(()=>{c.shellChild&&!c.shellChild.killed&&c.shellChild.kill(`SIGKILL`)},3e3);return;case`open-stop-dialog`:m.requestStop(`abort`);return;case`escalate-exit`:m.escalateToExit();return;case`exit-process`:g();return;case`hint-exit`:c.ctrlCCount++,setTimeout(()=>{c.ctrlCCount=0},800).unref(),o.value.info.showToast(Q.t(`cmd.titleExit`),Q.t(`cmd.pressCtrlCAgain`));return}},onShellAskAi:()=>{let e=s.value?.shell.getShellExecutionSnapshot();if(!e)return;let t=Nn(e);ne?.(t,`send`,d()?`steer`:`send`)},onWithdrawPending:(e,t)=>{o.value.pending.withdrawPendingEcho()&&o.value.pending.restoreInputText(e),c.agentProcessing&&(c.userAborted=!0,p({kind:`abort`}),o.value.info.showToast(Q.t(`cmd.titleAborted`),Q.t(`cmd.runAborted`)))},onWithdrawSteer:e=>{i.removeSteer(e)?o.value.pending.withdrawPendingSteer(e):m.requestStop(`abort`)},onStop:()=>{h()}}}var Rn=class{estimate;intervalMs;now;text=``;measuredTokens=0;measuredChars=0;measuredAt=-1/0;constructor(e){this.estimate=e.estimate,this.intervalMs=e.intervalMs??250,this.now=e.now??(()=>Date.now())}reset(){this.text=``,this.measuredTokens=0,this.measuredChars=0,this.measuredAt=-1/0}push(e){if(!e)return;this.text+=e;let t=this.now();t-this.measuredAt>=this.intervalMs&&this.measure(t)}flush(){this.measure(this.now())}tokens(){let e=this.text.length-this.measuredChars;if(e<=0)return this.measuredTokens;let t=this.measuredChars>0?this.measuredTokens/this.measuredChars:.25;return this.measuredTokens+Math.ceil(e*t)}measure(e){this.measuredTokens=this.text?this.estimate(this.text):0,this.measuredChars=this.text.length,this.measuredAt=e}};function zn(e,t){if(/^(bash|shell|run_command|execute|exec)$/i.test(e)){let e=t?.command;if(e)return e}return JSON.stringify(t??{}).slice(0,300)}async function Bn(e,t){let n=[`● ${t.header} — ${t.askedBy} asks:`,t.background?`\n${t.background}`:``,Q.t(`cmd.grillRecommendation`,{rec:t.recommendation}),t.evidence?.length?Q.t(`cmd.grillEvidence`,{joined:t.evidence.map(e=>` · ${e}`).join(`
|
|
8
|
+
`).trimEnd()}catch{s=``}n({id:e,command:a.command,status:o,text:s}),o!==`running`&&d()};d(),q.get(e)&&(q.retain(e,!0),o=e),a=setInterval(()=>{r()},500),r()},onBackgroundOutputClose:()=>{d()},onBackgroundSwitch:e=>{let t=n();f();let r=()=>{let n=J?.getMessages(e),r=J?.get(e),i=r?.agentName??``,a=q.get(e);a&&(i=a.title||i);let o=n?c(n):[],s=J?.getTurns(e),l=J?.getStreamingText(e),u=Date.now(),d={id:e,title:i,messages:o,status:a?.status??`running`,diagnostics:r?ut(ht(r),u):[],timeline:s?ft(s,u):[],streamText:l};t.panes.switchToSubagentContext(d)};J?.pin(e),q.get(e)&&q.retain(e,!0),l=e,r(),s=setInterval(()=>{r()},500)},onBackgroundDelete:e=>{if(q.get(e)){q.remove(e);return}if(Y.get(e)){Y.remove(e);return}J.remove(e)},onSubagentExit:()=>{f(),n().panes.switchToSubagentContext(null)}}}}const Xt=Ve(`@x-otto/cli:theme-preset-wiring`);function Zt(e,t){let n={kind:`extension`,extensionId:t.pluginId};return e.register(n,{localId:t.localId,label:t.label,appearance:t.appearance,colors:t.colors,markdown:t.markdown})}function Qt(e,t){let n=[];for(let r of t)try{n.push(Zt(e,r))}catch(e){Xt.warn({pluginId:r.pluginId,localId:r.localId,err:String(e)},`theme preset registration failed, skipped`)}return n}function $t(e){let t=ct();return Qt(t,we(e.activePlugins())),t}function en(e,t,n){return e-t<50?`dedup`:n.shellRunning?`kill-shell`:n.busy?n.stopDialogOpen?`escalate-exit`:`open-stop-dialog`:n.idleCtrlCCount+1>=2?`exit-process`:`hint-exit`}function tn(e){let{getTui:t,getSession:n,dispatchAbort:r,clearTodoLayers:i,markUserAborted:a,resetCtrlCCount:o,markRestartRequested:s,stopTui:c,isBusy:l}=e,u=null,d=()=>u!==null&&t()?.info.getCurrentPath()===`/dialog/confirm`,f=()=>{a(),o(),r(),i()},p=e=>{e&&s(),a(),o();try{r()}catch{}c()},m=e=>{if(e===`abort`)return{title:Q.t(`confirm.abortConfirmTitle`),message:Q.t(`confirm.abortConfirmMessage`),confirmLabel:Q.t(`common.abortButton`),extraLabel:Q.t(`common.pauseButton`),onConfirm:()=>{f(),t()?.info.showToast(Q.t(`cmd.titleAborted`),Q.t(`cmd.runAborted`))}};let n=e===`exit-restart`;return{title:n?Q.t(`confirm.exitRestartConfirmTitle`):Q.t(`confirm.exitConfirmTitle`),message:Q.t(`confirm.exitConfirmMessage`),confirmLabel:n?Q.t(`common.abortAndRestartButton`):Q.t(`common.abortAndExitButton`),extraLabel:void 0,onConfirm:()=>{p(n)}}},h=e=>{let r=t();if(!r)return;let i=m(e);u=e,r.modal.openModal({kind:`confirm`,title:i.title,message:i.message,confirmLabel:i.confirmLabel,confirmColor:`amber`,extraLabel:i.extraLabel,extraColor:`accent`,dangerous:!0,onConfirm:()=>{u=null,i.onConfirm()},onCancel:()=>{u=null},onExtra:i.extraLabel?()=>{u=null,n().pauseRun()?t()?.info.showToast(Q.t(`cmd.titlePaused`),Q.t(`cmd.runWillPauseAfterTurn`)):t()?.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.noRunningTaskToPause`))}:void 0})};return{requestStop:e=>{if(!t()){e===`abort`?f():p(e===`exit-restart`);return}if(e!==`abort`&&!l()){p(e===`exit-restart`);return}h(e)},isStopDialogOpen:d,escalateToExit:()=>{let e=t();!e||!d()||(h(`exit`),e.modal.resolveConfirm(!0))},abortNow:f}}var nn=class{entries=[];filePath;constructor(e,t=Z(qe,`sessions`)){this.filePath=Z(t,`${e}.history.json`)}list(e){return this.entries.slice(-(e??100))}append(e){e.trim()&&(this.entries.push(e),this.entries.length>100&&(this.entries=this.entries.slice(-100)))}hydrate(e){this.entries=e.slice(-100)}async persist(){if(Qe())return;let e=JSON.stringify(this.entries,null,2),t=`${this.filePath}.tmp`;try{await wt(et(this.filePath),{recursive:!0}),await At(t,e,`utf-8`),await Dt(t,this.filePath)}catch(e){throw await kt(t).catch(()=>{}),e}}async load(){try{let e=await Tt(this.filePath,`utf-8`),t=JSON.parse(e);return Array.isArray(t)&&t.every(e=>typeof e==`string`)?(this.entries=t.slice(-100),this.entries):[]}catch{return[]}}};const rn={[st]:e=>vt(e),[it]:e=>gt(e),[ot]:e=>_t(e)};function an(){let e=process.env.SHELL??``,t=K(),n=process.env.HISTFILE;return e.includes(`fish`)?[{id:ot,path:Z(t,`.local/share/fish/fish_history`)},{id:ot,path:Z(t,`.config/fish/fish_history`)}]:e.includes(`bash`)?[{id:it,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.bash_history`)}]:e.includes(`zsh`)||!e?[{id:st,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.zsh_history`)}]:[]}function on(e){let t=e?.sources?.filter(e=>e?.enabled!==!1&&!!e?.id&&!!e?.path);if(t&&t.length>0){let e=K();return t.map(t=>({id:t.id,path:sn(t.path,e)}))}return an()}function sn(e,t){return e.startsWith(`~/`)?Z(t,e.slice(2)):e===`~`?t:e}async function cn(e){try{return await Ct(e),!0}catch{return!1}}async function ln(e,t){let n=rn[e.id];if(!n||!await cn(e.path))return[];try{return n(await Tt(e.path,`utf8`)).slice(-t)}catch{return[]}}async function un(e){if(e?.enabled!==!0)return[];let t=e.maxEntries??2e3,n=on(e),r=new Set,i=[];for(let e of n){if(r.has(e.path))continue;r.add(e.path);let n=await ln(e,t);i.push(...n)}return i.slice(-t)}async function dn(e,t){let n=new nn(e.id);return{historyStore:n,inputHistory:await n.load().then(t=>{if(t.length>0)return t;let r=e.session.getInputHistory();return r&&r.length>0?(n.hydrate(r),n.persist().catch(()=>{}),e.session.setInputHistory([]),r):[]}),externalHistoryCommands:t?.enabled===!0?lt(await un(t)):void 0}}async function fn(e,t,n){if(n){let n=t.settings.get(`model`);if(typeof n==`string`&&n&&e.model?.id!==n){let r=t.modelRegistry.find(n);r&&await t.providerRegistry.hasCredential(r.provider)&&(e.applyModel(r),t.storage.memory?.reconfigure?.({contextWindow:r.contextWindow,maxOutput:r.maxOutputTokens}))}}{let n=t.settings.get(`thinking_level`),r=[`low`,`medium`,`high`,`xhigh`,`max`],i=n===`minimal`?`low`:n;typeof i==`string`&&r.includes(i)&&e.applyThinkingLevel(i)}}async function pn(e,t,n){let r=`__otto_setup__`,i=e.settings.get(`permission_mode`);(i===void 0||i===`auto`)&&await e.settings.update({permission_mode:`confirm`}),e.modelRegistry.getAll().length===0&&e.modelRegistry.register({id:r,name:`Setup required`,provider:`otto`,api:`otto`,baseUrl:``,reasoning:!1,input:[`text`],contextWindow:32e3,maxOutputTokens:4e3});let a=t.continueSession?e.getSession(t.continueSession)??await e.sessionManager.restore(t.continueSession)??void 0:void 0,o=a?a.session.buildContext().messages.filter(e=>{let t=e.role;return t===`user`||t===`assistant`}).length:0,s={value:a?e.sessionManager.consumeCrashGap(a.id):void 0},c=t.continueSession?a?Q.t(`cmd.resumeRestored`,{idShort:t.continueSession.slice(0,8),count:o}):Q.t(`cmd.resumeNotFound`,{id:t.continueSession}):void 0,l=!!(t.continueSession&&a),u=!!(t.model||e.settings.get(`model`)||e.settings.get(`model_slots`)?.default),d={skip:!1},f=await e.hydrateModelCache().catch(()=>new Set),p=e.modelRegistry.getAll().every(e=>e.id===r),m=p?!1:u,h=e.modelRegistry.getAll().find(e=>e.id!==r)??e.modelRegistry.getAll()[0],g=a??await e.createSession({interactive:!0,retryAccelerate:d,...m?{}:{model:h}});await fn(g,e,!!a);let _=m||l,v={get value(){return _},set value(e){_=e}},y={models:e.modelRegistry.getAll().filter(e=>e.id!==r).map(e=>({id:e.id,name:e.name,provider:e.provider,api:e.api,strengths:e.strengths??[],contextWindow:e.contextWindow})),availableModelIds:new Set([...f,...e.getSessionAvailableModels(g.id)]),wasUnconfigured:!1};y.wasUnconfigured=y.availableModelIds.size===0;let b=()=>e.setSessionAvailableModels(g.id,[...y.availableModelIds]);b();let x=new L(ie({modelRegistry:e.modelRegistry,authStore:e.authStore,settings:e.settings,selectedModelId:()=>g.model?.id,isModelUsable:jt(e.authStore,`delegation`),isModelUsableInMainSession:jt(e.authStore,`main-session`)})),S,C=n?n.tuiRef:{get value(){return S},set value(e){S=e}},w=async t=>{let n=await e.refreshModels().catch(()=>[]);y.models=e.modelRegistry.getAll().filter(e=>e.id!==r).map(e=>({id:e.id,name:e.name,provider:e.provider,api:e.api,strengths:e.strengths??[],contextWindow:e.contextWindow}));for(let e of n)if(e.status===`ok`)for(let t of e.availableIds??[])y.availableModelIds.add(t);y.models.length>0&&e.modelRegistry.getAll().some(e=>e.id===r)&&e.modelRegistry.unregister(r),b();let i=y.availableModelIds.size===0,a=C.value;a?.stores?.tasks?.setNeedsSetup?.(i);let o=await x.refresh().catch(()=>null);if(o&&a?.stores?.tasks?.setFtueStage?.(o.stage),y.wasUnconfigured&&!i&&(y.wasUnconfigured=!1,a?.info?.showToast?.(Q.t(`cmd.titleSetupReady`),Q.t(`cmd.setupReadyMessage`))),t){let e=n.filter(e=>e.status===`ok`);t(e.length>0?Q.t(`cmd.modelsRefreshed`,{summary:e.map(e=>`${e.provider} ${e.total}`).join(` · `)}):Q.t(`cmd.modelsRefreshedEmpty`))}};return w(),{session:g,startupCrashGapRef:s,resumedNote:c,modelReadyRef:v,registryOnlyPlaceholder:p,firstRealModel:h,modelRefreshState:y,persistAvailable:b,ftueController:x,refreshModelsNow:w,tuiRefBox:C,SETUP_PLACEHOLDER_ID:r,continuedExisting:l,retryAccelerate:d,resumed:a,convoCount:o}}function mn(e){let t=[],n=0,r=``,i=()=>{r&&=(t.push(r),``)};for(;n<e.length;){let t=e[n];if(t===` `||t===` `){i(),n++;continue}if(t===`\\`){n++,n<e.length&&(r+=e[n]),n++;continue}if(t===`"`){n++;let t=hn(e,n,`"`);r+=t.value,n=t.next;continue}if(t===`'`){n++;let t=hn(e,n,`'`,!1);r+=t.value,n=t.next;continue}r+=t,n++}return i(),{tokens:t}}function hn(e,t,n,r=!0){let i=``,a=t;for(;a<e.length;){let t=e[a];if(r&&t===`\\`){a++,a<e.length&&(i+=e[a]),a++;continue}if(t===n)return a++,{value:i,next:a};i+=t,a++}return{value:i,next:a}}function gn(e){let t=e.trim();if(!t.startsWith(`/`)||t===`/`||t.startsWith(`//`))return{isCommand:!1,text:t};let{tokens:n}=mn(t.slice(1));if(n.length===0)return{isCommand:!1,text:t};let[r,...i]=n;return{isCommand:!0,command:r,args:i}}async function _n(e,t){let n=e;for(;n.type===`response`&&n.endReason===`max-tool-turns`&&n.notice;){if(!await t.askBudgetContinue()){t.onBudgetStopped();return}t.beforeContinuationTurn();let e=await t.runTurn(`Continue with the remaining work until the task is complete.`);if(t.onTurnResult(e)===`exit`)return;n=e}}const vn=[{extensionId:`plugin-browser-use`,reasonKey:`capability.reasonWebApp`,detect:async e=>{let t=await e.packageDependencyNames();return[`react`,`vue`,`next`,`nuxt`,`svelte`,`vite`,`@angular/core`,`express`,`koa`,`fastify`].some(e=>t.has(e))?!0:e.hasFile(`index.html`)}},{extensionId:`plugin-mobile-use`,reasonKey:`capability.reasonMobile`,detect:async e=>{if(await e.hasFile(`AndroidManifest.xml`)||await e.hasFile(`build.gradle`)||await e.hasFile(`build.gradle.kts`)||await e.hasFile(`Info.plist`)||await e.hasFile(`Podfile`))return!0;let t=await e.packageDependencyNames();return t.has(`react-native`)||t.has(`expo`)}},{extensionId:`plugin-schedule`,reasonKey:`capability.reasonSchedule`,detect:async e=>{if(await e.hasFile(`crontab`))return!0;let t=await e.packageDependencyNames();return t.has(`node-cron`)||t.has(`node-schedule`)||t.has(`agenda`)}}];async function yn(e,t,n=vn){let r=[];for(let i of n){if(t.has(i.extensionId))continue;let n=!1;try{n=await i.detect(e)}catch{n=!1}n&&r.push({extensionId:i.extensionId,reasonKey:i.reasonKey})}return r}function bn(e,t,n,r){return{ts:r?.ts??Date.now(),sessionId:n,...r?.turn===void 0?{}:{turn:r.turn},kind:`lifecycle`,node:e,payload:t}}function xn(e){let t=new Map;if(e?.role===`assistant`&&Array.isArray(e.content))for(let n of e.content)n.type===`tool_call`&&t.set(n.id,n);return t}async function Sn(e,t,n){let r,i=new Set,a=new Map,o=new Set,s=new Map;if(n){let n=await e.loadTailEntries(t,Mt);r=n.length>0?n[0].seq:0;for(let e of n)e.type===`message`&&i.add(e.seq)}else r=await e.getEntryCount(t);return{async loadEarlier(n=500){if(r<=0)return null;let l=await e.loadEntriesBefore(t,r,n);if(l.length===0)return null;let u=new Map,d=new Set;for(let e of l){if(e.type!==`message`)continue;let t=e.data;if(t?.role===`assistant`)for(let[e,n]of xn(t))u.set(e,n);else t?.role===`tool_result`&&typeof t.toolCallId==`string`&&d.add(t.toolCallId)}let f=[],p=(e,t)=>({...e,id:`hist-${t}`,seq:t});for(let e of l){if(e.type===`clear`){r=0,f.length=0;continue}if(e.type!==`message`||i.has(e.seq))continue;let t=e.data;if(!t||typeof t.role!=`string`||t.internal)continue;if(t.role===`tool_result`){let n=a.get(t.toolCallId??``)??u.get(t.toolCallId??``);if(n){let r=n.arguments??{};f.push(p({role:`tool`,name:t.toolName||n.name||`tool`,args:x(r),argsObj:r,result:C(t.content),isError:t.isError},e.seq)),o.add(t.toolCallId)}else s.set(t.toolCallId,{toolName:t.toolName,content:t.content,isError:t.isError});continue}if(t.role===`assistant`){let n=xn(t);if(n.size>0){let r=new Set([...d,...o,...s.keys()]),i=c([t],{resolvedIds:r});for(let t of i)f.push(p(t,e.seq));for(let[t,r]of n){if(d.has(t))continue;let n=s.get(t);if(n){s.delete(t);let i=r.arguments??{};f.push(p({role:`tool`,name:r.name,args:x(i),argsObj:i,result:C(n.content),isError:n.isError??!1},e.seq))}}continue}}let n=c([t]);for(let t of n)f.push(p(t,e.seq))}for(let[e,t]of u)a.set(e,t);return r>0&&(r=l[0].seq),f.length>0?f:null}}}function Cn(e){let{app:t,getTui:n,getTuiRef:r,getSession:i,getCliCtx:a,historyStore:s}=e;return{onCyclePermissionMode:()=>{let e=n(),r=u(t.getPermissionMode());e.stores.tasks.setPermissionMode(r),e.info.showToast(Q.t(`cmd.titlePermission`),Q.t(`pref.permModeSwitched`,{label:Q.t(`pref.permModeLabel`,{context:r})})),t.setPermissionMode(r)},onHistoryPush:t=>{try{s.hydrate([...t]),s.persist().catch(()=>{})}catch{}e.getPasteBinder?.()?.save(i().id)},onDraftSave:e=>{let n=i(),a=n.session.getDrafts()??[],s=l(void 0,e,a),c=o([...a,s]);n.session.setDrafts(c),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(f(c))},onDraftDelete:e=>{let n=i(),a=(n.session.getDrafts()??[]).filter(t=>t.id!==e);n.session.setDrafts(a),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(f(a))},onDraftDeleteMany:e=>{let n=i(),a=new Set(e),o=(n.session.getDrafts()??[]).filter(e=>!a.has(e.id));n.session.setDrafts(o),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(f(o))},onA2uiAction:(e,t,n)=>{B(`a2ui-action`,n?[e,t,JSON.stringify(n)]:[e,t],a())},onStatusRefresh:()=>{B(`status`,[],a())},onProxySubmitUrl:e=>{B(`preference`,[`proxy`,e],a())},onProxyToggleEnabled:()=>{B(`preference`,[`proxy`,t.settings.get(`proxy`)?.enabled===!1?`on`:`off`],a())},onProxyClear:()=>{B(`preference`,[`proxy`,`clear`],a())},onProxyTest:()=>{B(`preference`,[`proxy`,`test`],a())}}}function wn(e){return{...Tn(e),pluginSource:e.pluginSource,intervalSeconds:e.errorRetryIntervalSeconds}}function Tn(e){let{msg:t,provider:n,authError:r,isRefreshFailed:i,unsupported:a,rateLimit:o,rateLimitInfo:s,getErrorRetryAttempt:c,incErrorRetryAttempt:l,errorRetryMax:u,retryQueued:d,resetAndRetry:f,cancelRetry:p,switchModelThenRetry:m,goToAuth:h}=e;if(s)return s.resetsAt===void 0?{reason:t,attempt:0,max:u,mode:`manual`,limitType:s.limitType,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:d}],onExpired:()=>{},onCancel:p}:{reason:t,attempt:0,max:u,mode:`resetsAt`,resetsAt:s.resetsAt,limitType:s.limitType,actions:[{kind:`retryNow`,label:Q.t(`error.retryNow`),run:d},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m}],onExpired:d,onCancel:p};if(r)return{reason:i?Q.t(`cmd.authRefreshFailed`,{ps:n?` (${n})`:``,ls:n?` ${n}`:``}):Q.t(`cmd.authFailed`,{ps:n?` (${n})`:``,ls:n?` ${n}`:``}),attempt:c(),max:u,mode:`manual`,actions:[{kind:`login`,label:Q.t(`model.goToLoginButton`),run:h},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:d}],onExpired:()=>{},onCancel:p};if(a)return{reason:Q.t(`cmd.modelNotSupported`),attempt:c(),max:u,mode:`manual`,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:m},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:d}],onExpired:()=>{},onCancel:p};let g=l(),_=g>u;return{reason:o?Q.t(`cmd.rateLimitedRetriesExhausted`):Q.t(`cmd.requestFailed`,{msg:t}),attempt:Math.min(g,u),max:u,mode:`auto`,exhausted:_,actions:[{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:_?f:d}],onExpired:_?()=>{}:d,onCancel:p}}function En(e){let{err:t}=e,n=t instanceof Error?t.message:String(t),r=t?.code===`AGENT_ABORTED`||t instanceof Error&&t.name===`AbortError`;if(!(e.submitState.userAborted||r)){let r=e.provider,a=t?.code,o=t?.pluginSource,{authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,pluginSource:f}=d(n,a,o),p=e.rateLimitInfoRef.current;e.rateLimitInfoRef.current=void 0;let m=(()=>{let t=e.cliCtx,n=t?.app?.storage?.traceStore,r=t?.state?.session;if(!n||!r)return null;let i=r.session.getTurnCount();return{traceStore:n,sessionId:r.id,...i===void 0?{}:{turn:i}}})(),g=()=>{m&&h(m,{attempt:e.errorRetryAttemptRef.current+1,max:e.ERROR_RETRY_MAX,mode:p?`resetsAt`:s||l?`manual`:`auto`,reason:n.slice(0,120)}),e.retryModeRef.current=!0;let t=e.latestSubmittedPromptRef?.current,r=e.tui.engine.takeLastQueuedFollowUp?.(),i=t!=null&&t.text!==e.text,a=i?t.text:r?.text??e.text,o=i?t.mode:r?.mode??e.mode;a===e.text&&!i&&r==null&&e.retryLastRound?.()||queueMicrotask(()=>e.handleSubmit?.(a,o,`send`))};e.tui.engine.showErrorRetry(wn({msg:n,provider:r,authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,rateLimitInfo:p,pluginSource:f,getErrorRetryAttempt:()=>e.errorRetryAttemptRef.current,incErrorRetryAttempt:()=>++e.errorRetryAttemptRef.current,errorRetryMax:e.ERROR_RETRY_MAX,errorRetryIntervalSeconds:e.ERROR_RETRY_INTERVAL_SECONDS,retryQueued:g,resetAndRetry:()=>{m&&I(m),e.errorRetryAttemptRef.current=0,g()},cancelRetry:()=>{m&&i(m,{attempt:e.errorRetryAttemptRef.current}),e.errorRetryAttemptRef.current=0},switchModelThenRetry:()=>{e.handleModel([],e.cliCtx,{afterSwitch:g})},goToAuth:()=>{e.handleProviderAuth([r??``].filter(Boolean),e.cliCtx)}}))}}function Dn(e){let t=[...e].reverse().find(e=>e.role===`user`);if(t)return Array.isArray(t.content)?t.content.map(e=>e&&typeof e==`object`&&`text`in e&&typeof e.text==`string`?e.text:``).join(``):String(t.content??``)}function On(e,t){return t===void 0?!1:e===t}function kn(e){return e.trim().length===0}function An(e){let{tui:t,app:n,submitState:r}=e;return(e,i=`!!`)=>{let a=e.trim();if(!a)return;let o=Be(a);if(!o.safe){t.info.showToast(Q.t(`cmd.titleShell`),Q.t(`cmd.dangerousBlocked`,{reason:o.reason})),t.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`cmd.dangerousBlockedDetail`,{reason:o.reason,cmd:a})}]});return}t.messages.echoUserInput(`${i} ${a}`),t.shell.startShellExecution(a),r.shellChild=ye(a,{shell:!0,cwd:n.workspaceDir,stdio:[`ignore`,`pipe`,`pipe`],env:ze()}),Le.registerChild({command:a,args:[],owner:{type:`cli-shell`,id:`!!`},category:`shell`,lifecycle:`evictable`,cwd:n.workspaceDir},r.shellChild),r.shellChild.stdout.on(`data`,e=>{t.shell.appendShellOutput(e.toString(`utf-8`))}),r.shellChild.stderr.on(`data`,e=>{t.shell.appendShellOutput(e.toString(`utf-8`))}),r.shellChild.on(`close`,(e,n)=>{r.shellChild=null,n?t.shell.finishShellExecution(null,void 0,!0):t.shell.finishShellExecution(e)}),r.shellChild.on(`error`,e=>{r.shellChild=null,t.shell.finishShellExecution(null,`\nError: ${e.message}`)})}}function jn(e){let{agentProcessingRef:t,tui:n,requestStop:r}=e;return(e,i)=>{let a=gn(e);return a.isCommand&&a.command.toLowerCase()===`abort`&&i===`send`?(t.value?r(`abort`):n.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.noRunningTask`)),!0):!1}}function Mn(e){let{app:n,tui:r}=e;return async e=>{let i=e.trim();if(!i)return;if(!n.storage.autoMemory){r.info.showToast(Q.t(`cmd.titleMemory`),Q.t(`cmd.memoryDisabled`));return}let a=await t(i,process.env.OTTO_MEMORY_LLM_NAMING===`1`?n.completeText:void 0);await n.storage.autoMemory.record(a),r.messages.echoUserInput(`# ${i}`),r.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`cmd.memorySaved`,{name:a.name})}]})}}function Nn(e){let t=e.terminated===!0?Q.t(`shell.askAiTerminated`):e.exitCode===null?Q.t(`shell.unknownError`):Q.t(`shell.exitCode`,{code:e.exitCode}),n=e.output.length>5e4?`${e.output.slice(0,5e4)}\n${Q.t(`shell.truncated`)}`:e.output;return Q.t(`shell.prompt`,{command:e.command,errorLabel:t,output:n})}function Pn(e,t){let n=e=>`${e.kind}\u0000${e.label}`,r=n(t);return[t,...e.filter(e=>n(e)!==r)].slice(0,5)}function Fn(e){return{label:e.label,value:e.value,kind:e.kind,description:e.description}}function In(e){return e.map(e=>({label:e.label,value:e.value,kind:e.kind,description:e.description,source:`recent`}))}async function Ln(e){let{runtime:t,app:n,session:i,options:a,tuiRefBox:o,tuiRef:s,turn:c,projState:l,redState:u,isBusyNow:d,dispatchToEngine:p,stopController:m,finishInteractive:h,stopTuiGuarded:g,applyModel:_,ensureModelUsableForPrompt:b,refreshSlashCommands:x,fileCommands:S,modelReady:C,availableModelIds:w,currentModel:ee,fmtDisplayModel:T,cfgLang:E,themeRegistry:D,presetSelection:k,keybindingOverrides:A,continuedExisting:N,convoCount:P,historyStore:F,inputHistory:I,externalHistoryCommands:L,bg:z,interactive:H,allCommandNames:W}=e;t.providerAuthRef.current=e=>{V([e],t.cliCtxRef.current).catch(()=>{})};let ne,re=n.getResilienceConfig().errorRetry.maxAttempts;He(`startTui() begin`);let ie=performance.now(),ae=O(await te(n.workspaceDir,{readdir:e=>Et(e,{withFileTypes:!0})})).map(e=>Q.t(e));return{stdin:process.stdin,stdout:process.stdout,modelName:T(ee),needsSetup:w.size===0,promptSuggestions:ae,commands:t.slashCommands,pluginInput:n.pluginInput,isImmediateCommand:e=>d()?U.has(e):W.has(e),isInterruptCommand:e=>e===`abort`,isAgentBusy:d,isPaused:()=>i.isPaused,initialPath:N&&P>0?`/`:`/home`,shadow:n._shadow,welcome:{cwd:process.cwd(),version:Ye,buildId:Ke,nickname:n.settings.get(`nickname`)||void 0,updateAvailable:void 0},onSessionSelect:e=>{B(`session`,[`resume`,e],t.cliCtxRef.current)},onInstallCapability:e=>{import(`./command-dispatcher-FRiCoN16.js`).then(e=>e.h).then(({runPluginInstall:n})=>n(e,t.cliCtxRef.current))},onDismissCapabilityRecommendations:()=>{s.value?.stores.tasks.dismissCapabilityRecommendations()},loadHistory:n.sessionRepoRef?.current?await(async()=>{let e=n.sessionRepoRef.current;if(!e)return;let t=await Sn(e,i.id,!!a.continueSession);return e=>t.loadEarlier(e.limit)})():void 0,language:E,themeRegistry:D,presetSelection:k,keybindingOverrides:A,permissionMode:n.getPermissionMode(),onFocusChange:e=>n.setTerminalFocus(e),...z.handlers,initialHistory:I,externalHistoryCommands:L,residencyGovernor:n._residencyGovernor,resolveWholeFileDiff:async(e,t)=>{try{return await v(tt(n.workspaceDir,e),t)}catch(e){return{error:e instanceof Error?e.message:String(e)}}},initialDrafts:f(i.session.getDrafts()??[]),initialRecentMentions:In(n.settings.get(`recent_mentions`)??[]),onSigilSelect:e=>{let t=Pn(n.settings.get(`recent_mentions`)??[],Fn(e));n.settings.persist({recent_mentions:t}).catch(()=>{}),s.value?.stores.tasks.setRecentMentions(In(t))},...Cn({app:n,getTui:()=>o.value,getTuiRef:()=>s.value,getSession:()=>i,getCliCtx:()=>t.cliCtxRef.current,historyStore:F,getPasteBinder:()=>t.cliCtxRef.current.callbacks.pasteBinder}),onQueueSendNow:(e,n)=>{if(n===`memory`){t.runMemoryCaptureRef.current(e);return}if(n===`bash`||n===`bash_async`){t.runAsyncBashRef.current(e,n===`bash`?`!`:`!!`);return}ne?.(e,`send`,d()?`steer`:`send`)},onSubmit:ne=async(e,a,f)=>{if(c.ctrlCCount=0,f===`action`){try{await r(e,{currentModelId:i.model?.id,applyModel:_,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),y(e,{currentEffort:i.thinkingLevel,applyEffort:e=>M(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:G.join(` / `)}))})}catch(e){o.value.info.showToast(Q.t(`cmd.titleModel`),e instanceof Error?e.message:String(e))}return}if(t.handleAbortInterceptRef.current(e,a))return;if(i.isPaused&&i.resumeRun(),f===`steer`&&i.isBusy){let n=y(await r(e,{currentModelId:i.model?.id,applyModel:_,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),{currentEffort:i.thinkingLevel,applyEffort:e=>M(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:G.join(` / `)}))});if(kn(n))return;c.latestSubmittedPrompt={text:n,mode:a};let{id:s}=i.steer(n);o.value.pending.setPendingSteer(n,s);return}if(a===`memory`){await t.runMemoryCaptureRef.current(e);return}if(a===`bash`||a===`bash_async`){t.runAsyncBashRef.current(e,a===`bash`?`!`:`!!`);return}let p=gn(e),m=e,h=e,g=!1;if(p.isCommand){if(await B(p.command,p.args,t.cliCtxRef.current))return;n.firePluginActivationEvent?.(`onCommand:${p.command}`);let e=S.find(e=>e.name===p.command);e&&(g=!0,m=await De(e.body,{args:p.args,workspaceDir:n.workspaceDir}))}let v=p.isCommand&&!g&&R.has(p.command.toLowerCase());if(!v&&!C&&(!p.isCommand||g)){o.value.info.showToast(Q.t(`cmd.titleSetupRequired`),Q.t(`cmd.noModelConfigured`));return}if(l.todoList.length>0&&l.todoList.every(e=>e.status===`done`||e.status===`skipped`||e.status===`failed`)&&(l.todoList=[],o.value.stores.tasks.setTasks([]),i.session.setTodoList([])),d()&&(!p.isCommand||g)){o.value.engine.enqueueFollowUp(e,a),o.value.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`queue.dFollowUpToast`));return}if(!v&&await b()===`abort`||(c.userAborted=!1,m=await r(m,{currentModelId:i.model?.id,applyModel:_,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),m=y(m,{currentEffort:i.thinkingLevel,applyEffort:e=>M(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:G.join(` / `)}))}),kn(m)))return;v||(o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!0}),c.agentProcessing=!0,o.value.plugins.setCommands(x())),c.latestSubmittedPrompt={text:e,mode:a},c.retryMode||(c.errorRetryAttempt=0),c.retryMode=!1,u.lastTasks=l.todoList.slice();let w=r=>{En({err:r,submitState:c,provider:i.model?.provider,rateLimitInfoRef:{get current(){return c.lastRateLimitInfo},set current(e){c.lastRateLimitInfo=e}},retryModeRef:{get current(){return c.retryMode},set current(e){c.retryMode=e}},errorRetryAttemptRef:{get current(){return c.errorRetryAttempt},set current(e){c.errorRetryAttempt=e}},ERROR_RETRY_MAX:re,ERROR_RETRY_INTERVAL_SECONDS:n.getResilienceConfig().errorRetry.intervalMs/1e3,handleSubmit:ne,retryLastRound:()=>On(Dn(i.session.messages()),h??e)?(o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!0}),c.agentProcessing=!0,i.retryLastRound().catch(t=>{if(t?.code===`RETRY_NO_RESUMABLE_ROUND`){queueMicrotask(()=>ne?.(h??e,a,`send`));return}o.value.pending.withdrawPendingEcho(),w(t)}).finally(()=>{c.agentProcessing=!1,o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!1})}),!0):!1,latestSubmittedPromptRef:{get current(){return c.latestSubmittedPrompt},set current(e){c.latestSubmittedPrompt=e}},text:h??e,mode:a,handleModel:j,handleProviderAuth:V,cliCtx:t.cliCtxRef.current,tui:o.value})};try{h=m,m=await n.expandSigilChips(m,{skipPrefixes:new Set([`model`])}),(!p.isCommand||g)&&!c.retryMode&&(o.value.messages.echoUserInput(m,{pending:!0}),o.value.pending.setPendingEcho(m,a),n.settings.get(`first_prompt_submitted_at`)===void 0&&(n.settings.persist({first_prompt_submitted_at:Date.now()}).catch(()=>{}),n.storage.traceStore.append(i.id,bn(`ftue.first_prompt.submitted`,{timeToFirstPromptMs:Math.round(performance.now()-ie)},i.id,{turn:i.session.getTurnCount()})).catch(()=>{}),(async()=>{let e=await yn({hasFile:async e=>{try{return await Ot(Z(n.workspaceDir,e)),!0}catch{return!1}},packageDependencyNames:async()=>{try{let e=await Tt(Z(n.workspaceDir,`package.json`),`utf-8`),t=JSON.parse(e);return new Set([...Object.keys(t.dependencies??{}),...Object.keys(t.devDependencies??{})])}catch{return new Set}}},new Set(n.activePlugins().map(e=>e.id))).catch(()=>[]);s.value?.stores.tasks.setCapabilityRecommendations(e)})()));let e=m;h=e,c.latestSubmittedPrompt={text:e,mode:a},c.streamedText=!1;let r=await H.handleInput(e);if(r.type===`exit`){t.handleExitRef.current(r);return}if(r.type===`help`){o.value.modal.openModal({kind:`helpViewer`,title:`Help`,lines:Gt(t.reg,i.pinned,Q.t(`cmdDesc`,{returnObjects:!0})),onDismiss:()=>{}});return}r.type!==`noop`&&r.text&&!c.streamedText&&(r.type===`system`&&r.text.length<=80?o.value.info.showToast(Q.t(`cmd.titleInfo`),r.text):o.value.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:r.text}]})),r.type===`response`&&r.endReason&&(o.value.pending.clearPendingEcho(),r.notice&&o.value.info.showToast(Q.t(`cmd.titleInfo`),r.notice)),await _n(r,{runTurn:e=>H.handleInput(e),onTurnResult:e=>e.type===`exit`?(t.handleExitRef.current(e),`exit`):(e.type!==`noop`&&e.type!==`help`&&e.text&&!c.streamedText&&o.value.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:e.text}]}),`continue`),askBudgetContinue:()=>new Promise(e=>{o.value.modal.openModal({kind:`select`,title:Q.t(`budget.exhaustedTitle`),layout:`buttons`,options:[{label:Q.t(`budget.continue`),value:`go`,color:`accent`},{label:Q.t(`budget.stop`),value:`stop`,color:`amber`}],onSelect:t=>e(t===`go`),onCancel:()=>e(!1)})}),onBudgetStopped:()=>{o.value.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`budget.stoppedNote`)}]})},beforeContinuationTurn:()=>{c.streamedText=!1}})}catch(e){o.value.pending.withdrawPendingEcho(),w(e)}finally{c.agentProcessing=!1,c.userAborted=!1,o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!1}),o.value.plugins.setCommands(x())}},onInterrupt:()=>{let e=Date.now(),t=en(e,c.lastCtrlCTime,{shellRunning:!!c.shellChild,busy:d()||i.isPaused,stopDialogOpen:m.isStopDialogOpen(),idleCtrlCCount:c.ctrlCCount});if(t!==`dedup`)switch(c.lastCtrlCTime=e,t){case`kill-shell`:c.shellChild.kill(`SIGTERM`),setTimeout(()=>{c.shellChild&&!c.shellChild.killed&&c.shellChild.kill(`SIGKILL`)},3e3);return;case`open-stop-dialog`:m.requestStop(`abort`);return;case`escalate-exit`:m.escalateToExit();return;case`exit-process`:g();return;case`hint-exit`:c.ctrlCCount++,setTimeout(()=>{c.ctrlCCount=0},800).unref(),o.value.info.showToast(Q.t(`cmd.titleExit`),Q.t(`cmd.pressCtrlCAgain`));return}},onShellAskAi:()=>{let e=s.value?.shell.getShellExecutionSnapshot();if(!e)return;let t=Nn(e);ne?.(t,`send`,d()?`steer`:`send`)},onWithdrawPending:(e,t)=>{o.value.pending.withdrawPendingEcho()&&o.value.pending.restoreInputText(e),c.agentProcessing&&(c.userAborted=!0,p({kind:`abort`}),o.value.info.showToast(Q.t(`cmd.titleAborted`),Q.t(`cmd.runAborted`)))},onWithdrawSteer:e=>{i.removeSteer(e)?o.value.pending.withdrawPendingSteer(e):m.requestStop(`abort`)},onStop:()=>{h()}}}var Rn=class{estimate;intervalMs;now;text=``;measuredTokens=0;measuredChars=0;measuredAt=-1/0;constructor(e){this.estimate=e.estimate,this.intervalMs=e.intervalMs??250,this.now=e.now??(()=>Date.now())}reset(){this.text=``,this.measuredTokens=0,this.measuredChars=0,this.measuredAt=-1/0}push(e){if(!e)return;this.text+=e;let t=this.now();t-this.measuredAt>=this.intervalMs&&this.measure(t)}flush(){this.measure(this.now())}tokens(){let e=this.text.length-this.measuredChars;if(e<=0)return this.measuredTokens;let t=this.measuredChars>0?this.measuredTokens/this.measuredChars:.25;return this.measuredTokens+Math.ceil(e*t)}measure(e){this.measuredTokens=this.text?this.estimate(this.text):0,this.measuredChars=this.text.length,this.measuredAt=e}};function zn(e,t){if(/^(bash|shell|run_command|execute|exec)$/i.test(e)){let e=t?.command;if(e)return e}return JSON.stringify(t??{}).slice(0,300)}async function Bn(e,t){let n=[`● ${t.header} — ${t.askedBy} asks:`,t.background?`\n${t.background}`:``,Q.t(`cmd.grillRecommendation`,{rec:t.recommendation}),t.evidence?.length?Q.t(`cmd.grillEvidence`,{joined:t.evidence.map(e=>` · ${e}`).join(`
|
|
9
9
|
`)}):``].join(``);e.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:n}]});let r=t.options??[];if(r.length>0){if(r.length<=2&&!t.multiSelect&&t.allowFreeform===!1){let n=await new Promise(n=>{e.modal.openModal({kind:`confirm`,title:t.question,message:r.map(e=>`${e.label}${e.recommended?` (recommended)`:``}: ${e.rationale}`).join(`
|
|
10
|
-
`),confirmLabel:r[0]?.label??Q.t(`cmd.grillOptionYes`),cancelLabel:r[1]?.label??Q.t(`cmd.grillOptionNo`),onConfirm:()=>n(!0),onCancel:()=>n(!1)})})?r[0]?.label:r[1]?.label;return It(t,n?[n]:[])}let n=await e.modal.openModal({kind:`questions`,title:t.question,questions:[{header:t.header,question:t.question,multiSelect:!!t.multiSelect,freeformInput:t.allowFreeform!==!1,freeformPlaceholder:Q.t(`cmd.grillFreeformPlaceholder`),options:r.map(e=>({label:e.recommended?`${e.label} ★`:e.label,description:e.rationale}))}]});return It(t,(n?.answers?.[t.header]??[]).map(e=>e.replace(/\s*★$/,``)),n?.freeformText)}return Lt(t,await e.modal.openModal({kind:`input`,title:t.header,description:[t.question],placeholder:Q.t(`cmd.grillAnswerPlaceholder`)}))}function Vn(e){let{getSession:t,app:n,tui:r,projState:i,redState:o,recomputeBudget:s,persistEditedFiles:c,persistSubagents:l,persistTurnCount:u,onContextCompacted:d,markStreamed:f}=e,p=null,m=!1,h=!1,g=null,v=null,y=e=>{let r=t(),i=r.session.getTurnCount();a({traceStore:n.storage.traceStore,sessionId:r.id,...i===void 0?{}:{turn:i}},e,`session-event`)},b=e=>{t().session.append({role:`system`,subtype:e,content:e,level:`info`,timestamp:Date.now()})},x=!1,C,w={isDelegationTool:e=>Pt(n.toolRegistry.getAll()).has(e),currentModel:()=>t().model.id,cacheHitRatio:()=>t().getLastCacheHitRatio(),turnTokens:()=>{let e=t().session.messages(),n=0;for(let t of e)t.role===`assistant`&&t.usage&&(n+=(t.usage.inputTokens??0)+(t.usage.outputTokens??0)+(t.usage.cacheReadTokens??0)+(t.usage.cacheWriteTokens??0));let r=C;if(C=n,!(r==null||n<=r))return n-r}},T
|
|
11
|
-
`))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++;return`+${t}/-${n}`},I=()=>{let e=Y.listForSession(t().id).map(e=>({id:e.id,command:e.command,type:`process`,origin:`main`,status:e.status===`running`?`running`:e.status===`exited`?`exited`:`killed`,port:e.port,startedAt:e.startedAt,exitCode:e.exitCode,detectedService:e.detectedService})),n=new Map(J.list().map(e=>[e.id,e])),i=e=>{let t=n.get(e);return t?mt(t):{}},a=q.listForSession(t().id).map(e=>({id:e.id,command:e.title,type:`agent-session`,origin:e.origin,status:e.status===`running`||e.status===`ready`||e.status===`needs_input`?`running`:e.status===`applied`?`exited`:e.status===`failed`?`failed`:`killed`,agentStatus:e.status,diffStat:e.diff?F(e.diff):void 0,startedAt:e.startedAt,...i(e.id)})),o=new Set(a.map(e=>e.id)),s=J.list().filter(e=>!o.has(e.id)).map(ht),c=[...e,...a,...s];r.stores.tasks.setBackgroundTasks([...c.filter(e=>e.origin===`user`),...c.filter(e=>e.origin!==`user`)])},L=null,R=()=>{L===null&&(L=setTimeout(()=>{L=null,I()},30))},z=()=>{L!==null&&(clearTimeout(L),L=null),I()},B=[Y.onSpawn(R),Y.onExit(z),q.onSpawn(R),q.onUpdate(R),q.onExit(z),q.onRemove(z),J.subscribe(R)];I();let V;return{bgUnsubs:B,attachSessionHandler:()=>{V?.(),m=!1,V=t().subscribe(e=>{for(let a of Ft(e,i,w)){if(a.kind===`prompt.end`){let e=ce(a,o),n={turn:i.currentTurn,completedAt:Date.now(),...e},r=t().session.getTurnSummaries()??[];t().session.setTurnSummaries([...r.filter(e=>e.turn!==n.turn),n])}S(a,{pushMessage:r.messages.pushMessage,echoUserInput:r.messages.echoUserInput,pushEngineEvent:r.engine.pushEngineEvent,getNotifyStats:r.info.getNotifyStats,setTasks:(e,t)=>r.stores.tasks.setTasks(e,t),addTurnBoundary:e=>r.stores.tasks.addTurnBoundary(e)},o),a.kind===`tasks.update`&&(t().session.setTodoList(i.todoList),n.sessionManager.save(t().id).catch(()=>{}))}if(e.type===`stream.event`&&e.event?.type===`text_delta`){f();let t=e.event?.delta??``;D+=t.length,A.push(t),r.engine.pushEngineEvent({kind:`outputTokensThisTurn`,n:Math.floor(D/4)}),M()}if(e.type===`stream.event`&&e.event?.type===`done`){let i=e.event?.providerUsage;if(i!==void 0){let e=i!==null&&pt(i.status,i.overageStatus);if(i===null||i.status===`rejected`&&!e)r.stores.notification.setProviderUsage(null),p=null;else{let e=t().model.provider;n.authStore.getAuthSource(e).then(n=>{if(t().model.provider!==e)return;let a=n===`oauth`?i:null;r.stores.notification.setProviderUsage(a),p=a}).catch(()=>{})}}}switch(e.type){case`turn.start`:D=0,A.reset(),M(),r.engine.pushEngineEvent({kind:`spinnerMode`,mode:`requesting`});break;case`turn.end`:j(),s();break;case`streaming.start`:r.engine.pushEngineEvent({kind:`spinnerMode`,mode:`responding`}),r.pending.clearPendingEcho();break;case`streaming.end`:r.engine.pushEngineEvent({kind:`spinnerMode`,mode:null}),r.pending.clearPendingEcho();break;case`prompt.start`:j(),O=_(e.text),M(),r.info.setTopView({session:t().id}),r.panes.clearEditedFiles(),r.plugins.clearSubagents(),N=o.messageIndex,r.info.addContextTurn({turnIndex:i.currentTurn,role:`assistant`,messageCount:0,estimatedTokens:0,compacted:!1,truncated:!1,pruned:!1});break;case`compaction.start`:T=e.messageCount,r.engine.pushEngineEvent({kind:`activeTool`,name:at});break;case`compaction.end`:{let t=T??e.retainedCount,n=e.retainedCount;r.engine.pushEngineEvent({kind:`activeTool`,name:null}),n<t&&(r.messages.pushMessage({role:`compact_boundary`,before:t,after:n}),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:t,after:n,summary:e.summary}),d()),T=void 0,s(void 0,{before:t,after:n});break}case`compaction.reactive.notice`:{let{messagesBefore:t,messagesAfter:n}=e;n<t&&(r.messages.pushMessage({role:`compact_boundary`,before:t,after:n}),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:t,after:n,summary:e.summary}),d()),s(void 0,{before:t,after:n});break}case`image.degradation.notice`:e.degradedCount>0&&r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.imageDegradationNotice`,{count:e.degradedCount,context:e.trigger===`image-constraint`?`image-constraint`:`other`}));break;case`session.history-capped`:r.messages.pushMessage({role:`history_capped`,removedCount:e.removedCount,trigger:e.trigger,...e.lossy?{lossy:!0}:{}}),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`history_capped`,removedCount:e.removedCount});break;case`session.write-lease-denied`:m=!0,r.messages.pushMessage({role:`write_lease_denied`}),r.info.showToast(Q.t(`lease.deniedToastTitle`),Q.t(`lease.deniedToastBody`));break;case`session.write-lease-restored`:m=!1,r.messages.pushMessage({role:`write_lease_restored`}),r.info.showToast(Q.t(`lease.restoredToastTitle`),Q.t(`lease.restoredToastBody`));break;case`session.crash-gap-detected`:r.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:e.lostTurns}));break;case`run.pause_requested`:h=!0,g={at:Date.now(),toolCount:0},y(`requested`),r.engine.setPauseDialog?.({phase:`requested`,requestedAt:Date.now(),toolCount:0,onCancel:()=>{},onDismiss:()=>{r.engine.setPauseDialog?.(null)}}),v&&clearInterval(v),v=setInterval(()=>{if(!g){clearInterval(v),v=null;return}let e=Math.floor((Date.now()-g.at)/1e3);r.stores.notification.setPausePending({elapsedSec:e,toolCount:g.toolCount})},1e3);break;case`tool.call.end`:{let t=typeof e.resultTokensEstimate==`number`?e.resultTokensEstimate:e.resultText?_(e.resultText):0;t>0&&(k+=t,M()),g&&(g.toolCount++,r.engine.setPauseDialog?.({phase:`requested`,requestedAt:g.at,toolCount:g.toolCount,onCancel:()=>{},onDismiss:()=>{r.engine.setPauseDialog?.(null)}})),(async()=>{try{let t={role:`tool_result`,name:e.toolCall.name,toolCallId:e.toolCall.id,content:[{type:`text`,text:e.resultText??``}],details:e.details},i=await n.resolveA2uiRendererPayload(t);i&&i.length>0&&r.messages.pushMessage({role:`assistant`,content:[{type:`a2ui`,components:i}]})}catch{}})();break}case`run.paused`:y(`paused`),g?(r.engine.setPauseDialog?.({phase:`active`,requestedAt:g.at,toolCount:g.toolCount,totalToolCount:g.toolCount}),r.messages.pushMessage({role:`run_paused`,toolCount:g.toolCount}),b(`run_paused`),v&&=(clearInterval(v),null),r.stores.notification.setPausePending(null),g=null):(r.messages.pushMessage({role:`run_paused`}),b(`run_paused`)),r.stores.notification.setPaused(!0);break;case`run.pause_cancelled`:y(`cancelled`),r.engine.setPauseDialog?.(null),r.messages.pushMessage({role:`run.pause_cancelled`}),b(`run_pause_cancelled`),v&&=(clearInterval(v),null),r.stores.notification.setPausePending(null),g=null,h=!1;break;case`run.resumed`:y(`resumed`),r.engine.setPauseDialog?.(null),r.messages.pushMessage({role:`run_resumed`}),b(`run_resumed`),v&&=(clearInterval(v),null),r.stores.notification.setPausePending(null),g=null,h=!1,r.stores.notification.setPaused(!1);break;case`steer.consumed`:r.pending.commitPendingSteer(e.id);break;case`image.vision-delegate`:!x&&e.describedCount>0&&(x=!0,r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`model.visionDelegateToast`,{count:e.describedCount})));break;case`memory.pruned`:E||(E=!0,r.messages.pushMessage({role:`prune_boundary`})),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`prune`,tokensSaved:e.tokensSaved,prunedCount:e.prunedCount}),s();break;case`error`:c(),l(),r.pending.withdrawPendingEcho();break;case`prompt.continued`:r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.todoGateContinuing`,{round:e.round,cap:e.maxRounds,left:e.incompleteCount}));break;case`prompt.budget.notice`:e.steered&&r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.promptBudgetExceeded`,{context:e.dimension,used:e.used,budget:e.budget}));break;case`budget.notice`:e.extended?r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.budgetExtended`,{maxTurns:e.maxTurns})):e.steered&&r.info.showToast(Q.t(`cmd.titleInfo`),e.progressDenied?Q.t(`cmd.budgetProgressDenied`):Q.t(`cmd.budgetSteered`,{maxTurns:e.maxTurns}));break;case`progress.stall.notice`:r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.progressStallDetected`,{maxRepeat:e.maxRepeat}));break;case`tool.call.mismatch.notice`:e.outcome===`retry`?r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.toolCallMismatchRetry`,{retryCount:e.retryCount})):r.info.showToast(Q.t(`cmd.titleError`),Q.t(`cmd.toolCallMismatchTerminated`));break;case`session.cost-budget-exceeded`:r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.sessionCostBudgetExceeded`,{used:e.totalCostUSD.toFixed(2),budget:e.budgetUSD.toFixed(2)}));break;case`prompt.end`:j(),r.pending.clearPendingSteers(),s(),r.info.markContextTurns({turnIndex:i.currentTurn,messageCount:Math.max(0,o.messageIndex-N)}),c(),l(),u();{let e=t(),n=Ne(e.session.metadata().title,e.session.messages(),e.id);r.stores.tasks.setSessionTitle(n),r.lifecycle.setTerminalTitle(n)}if(process.env.OTTO_TUI_DEBUG_NOTIFY_STATS){let e=r.info.getNotifyStats();if(e.coalescedCalls>0){let t=(e.coalescedCalls/Math.max(1,e.coalescedFires)).toFixed(1);console.error(`\x1b[90m\x1b[2m[perf] notify merge ${e.coalescedCalls}→${e.coalescedFires} (${t}x) direct ${e.immediateCalls} flush ${e.flushFires}\x1b[0m`)}}{let e=n.settings.get(`pulse_survey`);n.feedbackRegistry.get()!==void 0&&zt(i.currentTurn,{enabled:e?.enabled??!0,probability:e?.probability??.05,minTurnGap:e?.min_turn_gap??20,forcedUpgradeActive:r.info.isForcedUpgradeActive()},P)&&(P.lastShownTurn=i.currentTurn,r.stores.notification.setPulseSurvey({phase:`rating`,rating:null,selectedIndex:0,commentText:``,commentOffset:0,onSubmit:(e,r)=>{n.feedbackRegistry.get()?.recordPulseSurvey?.({ts:Date.now(),rating:e,comment:r,sdkVersion:Ye,modelId:t().model?.id})},onClose:()=>r.stores.notification.setPulseSurvey(null)}))}break;case`ask.user.required`:{let i=e.question,a=e.requestId;(async()=>{let o=n.inquiryCenter;if(!o.enqueue({id:a,origin:{kind:`session`,sessionId:e.sessionId},question:i}).accepted){t().resolveAskUser(a,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}if(!await o.waitForTurn(a)){t().resolveAskUser(a,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}try{let e=await Bn(r,i);t().resolveAskUser(a,e)}finally{o.release(a)}})();break}case`approval.required`:{if(e.semanticVerdict){let t=Rt(e.description,e.arguments,be);e.semanticVerdict===`allow`&&t&&n.approveSandboxBypass(t),n.recordAutoPermissionDecision({sessionId:e.sessionId,agentName:`main`,toolName:e.toolName,effect:e.semanticVerdict===`allow`?`allow`:`deny`,policyName:`semantic::sandbox-escalation`,reason:e.description}),n.logger?.info?.({approvalId:e.id,verdict:e.semanticVerdict,toolName:e.toolName},`Semantic approval verdict handled (no prompt)`);break}let i=e.toolName===`bash`&&typeof e.arguments?.command==`string`?e.arguments.command:``,a=i?n.bashAlwaysAllowPrefix(i):null;r.modal.requestPermission({tool:e.toolName,input:zn(e.toolName,e.arguments),risk:e.risk??`medium`,description:e.description,alwaysAllowLabel:a??void 0}).then(r=>{let i=Rt(e.description,e.arguments,be);r.approved&&i&&n.approveSandboxBypass(i),t().resolveApproval(e.id,r.approved),r.approved&&r.mode===`always`&&(e.toolName===`bash`?a&&n.allowToolAlways(`bash(${a})`,t().id):n.allowToolAlways(e.toolName,t().id))});break}}})},getSessionUnsub:()=>V,getLastProviderUsage:()=>p,isWriteLeaseReadOnly:()=>m,isRunPaused:()=>h}}function Hn(e){let t=(t,n)=>{e.onError?.(t,n)},n=async n=>{let r=e.gateway(),i=e.bridge();if(!(!r||!i))try{let e=await r.getPaste(n);i.hydratePaste({entries:e.entries,nextId:e.nextId})}catch(e){t(`load`,e);try{i.hydratePaste(null)}catch{}}},r=async n=>{let r=e.gateway(),i=e.bridge();if(!(!r||!i))try{let e=i.exportPaste();if(!e)return;await r.setPaste(n,{sessionId:n,entries:e.entries,nextId:e.nextId})}catch(e){t(`save`,e)}};return{load:n,save:r,async switchTo(e,t){e!==t&&(e!==void 0&&await r(e),await n(t))},async fork(n,r){let i=e.gateway(),a=e.bridge();if(!(!i||!a))try{let e=a.exportPaste()??await i.getPaste(n);await i.setPaste(r,{sessionId:r,entries:e.entries,nextId:e.nextId})}catch(e){t(`fork`,e)}}}}function Un(e){e.setEcosystemSearch(async t=>{try{let{registries:n,warnings:r}=await he(e).loadAll();return{hits:X(n.flatMap(e=>e.entries.map(t=>({entry:t,registry:e}))).map(e=>({text:e.entry.id,aliases:[e.entry.description,...e.entry.keywords??[]],payload:e})),t.join(` `),{maxResults:8}).map(e=>({id:e.item.payload.entry.id,description:e.item.payload.entry.description,capabilities:e.item.payload.entry.capabilities,sourceName:e.item.payload.registry.sourceName,stale:e.item.payload.registry.stale})),warnings:r}}catch{return}})}function Wn(e){let{app:t,tui:n}=e;t.setMcpStartupCallback(e=>{let r=[`HTTP_PROXY`,`HTTPS_PROXY`,`http_proxy`,`https_proxy`].find(e=>process.env[e]),i=r?process.env[r]:void 0,a=t.settings.get(`proxy`);i&&r&&!a?.url&&(ge(i,r),n.info.showToast(Q.t(`proxy.title`),Q.t(`proxy.envDetectedToast`,{source:r,value:i})))})}function Gn(e){let{app:t,tui:n,session:r}=e;n.plugins.registerArgumentSuggester(`model`,(e,n=20)=>X(t.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(e=>({text:e.id,aliases:[e.name,e.provider],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload.id,description:e.item.payload.name})));let i=Ne(r.session.metadata().title,r.session.messages(),r.id);n.lifecycle.setTerminalTitle(i),n.stores.tasks.setSessionTitle(i)}function Kn(e){let{app:t,tui:n,getScheduler:r}=e;n.plugins.registerArgumentSuggester(`schedule`,(e,t=20)=>{let n=[`remove`,`run`,`enable`,`disable`],i=n.find(t=>e.toLowerCase().startsWith(`${t} `));if(!i)return X([...n,`list`,`add`,`logs`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:t}).map(e=>({name:e.item.payload}));let a=r();if(!a)return[];let o=e.slice(i.length+1);return X(a.list().map(e=>({text:e.id,aliases:[e.name],payload:e})),o,{maxResults:t}).map(e=>({name:`${i} ${e.item.payload.id}`,description:e.item.payload.name}))}),n.plugins.registerArgumentSuggester(`replay`,(e,n=20)=>X(t.listSessions().map(e=>({text:e.id,aliases:e.title?[e.title]:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload.id,description:e.item.payload.title??e.item.payload.id.slice(0,8)}))),n.plugins.registerArgumentSuggester(`session`,(e,n=20)=>{let r=e.toLowerCase().startsWith(`unlock `)?e.slice(7):e;return r===e?X([{name:`fork`,description:`Fork current session into a named branch`},{name:`clear`,description:`Clear screen and reset session context`},{name:`unlock`,description:`Write-lease diagnostics/force-unlock`},{name:`kill`,description:`Terminate a session`},{name:`inspect`,description:`Read-only remote snapshot preview`},{name:`pin`,description:`Toggle pin state (pinned sort to top of session list)`},{name:`archive`,description:`Toggle archive state`},{name:`resume`,description:`List and switch to an existing session`},{name:`compact`,description:"Compact context now (or `compact log` for details)"},{name:`context`,description:`Show context usage breakdown`}].map(e=>({text:e.name,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload.name,description:e.item.payload.description})):X(t.listSessions().map(e=>({text:e.id,aliases:e.title?[e.title]:[],payload:e})),r,{maxResults:n}).map(e=>({name:`unlock ${e.item.payload.id}`,description:e.item.payload.title??e.item.payload.id.slice(0,8)}))}),n.plugins.registerArgumentSuggester(`status`,(e,t=20)=>X([`cache`,`diagnose`,`services`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:t}).map(e=>({name:e.item.payload}))),n.plugins.registerArgumentSuggester(`preference`,(e,t=20)=>X([`general`,`lang`,`theme`,`keybindings`,`shortcuts`,`proxy`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:t}).map(e=>({name:e.item.payload}))),n.plugins.registerArgumentSuggester(`extension`,(e,n=20)=>{let r=e.toLowerCase();if(r.startsWith(`trust plugin `)){let r=e.slice(13);return X(pe({cwd:t.workspaceDir??process.cwd(),homedir:K()}).map(e=>({text:e.id,aliases:[],payload:e})),r,{maxResults:n}).map(e=>({name:`trust plugin ${e.item.payload.id}`,description:e.item.payload.scope}))}if(r.startsWith(`trust `)){let t=e.slice(6);return X([`status`,`trust`,`untrust`,`plugin`].map(e=>({text:e,aliases:[],payload:e})),t,{maxResults:n}).map(e=>({name:`trust ${e.item.payload}`}))}if(r.startsWith(`registry `)){let t=e.slice(9);return X([`list`,`add`,`remove`].map(e=>({text:e,aliases:[],payload:e})),t,{maxResults:n}).map(e=>({name:`registry ${e.item.payload}`}))}return X([`trust`,`install`,`registry`,`search`,`update`,`reload`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload}))}),n.plugins.registerArgumentSuggester(`registry`,(e,n=20)=>{let r=e.toLowerCase().startsWith(`remove `)?e.slice(7):e;return r===e?X([`list`,`add`,`remove`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload})):X(he(t).listSources().filter(e=>!e.builtin).map(e=>({text:e.name,aliases:[e.url],payload:e})),r,{maxResults:n}).map(e=>({name:`remove ${e.item.payload.name}`,description:e.item.payload.url}))}),n.plugins.registerArgumentSuggester(`trust`,(e,n=20)=>{let r=e.toLowerCase().startsWith(`plugin `)?e.slice(7):e;return r===e?X([`status`,`trust`,`untrust`,`plugin`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload})):X(pe({cwd:t.workspaceDir??process.cwd(),homedir:K()}).map(e=>({text:e.id,aliases:[],payload:e})),r,{maxResults:n}).map(e=>({name:`plugin ${e.item.payload.id}`,description:e.item.payload.scope}))})}function qn(e){let t=e[e.length-1];if(t?.type===`message`&&t.message?.role===`user`)return{parentId:t.parentId}}function Jn(e,t){!t||!t.newer||(e.stores.tasks.setUpdateAvailable(t),t.forced?(e.info.pushNotification(Q.t(`cmd.titleUpdate`),Q.t(`cmd.updateNotifForced`,{latest:t.latest,current:t.current}),`version`,`error`),e.stores.tasks.setForcedUpgrade(Q.t(`cmd.updateForcedBanner`,{latest:t.latest,current:t.current})),e.stores.notification.setPulseSurvey(null)):(e.info.pushNotification(Q.t(`cmd.titleUpdate`),Q.t(`cmd.updateNotifAvailable`,{latest:t.latest,current:t.current}),`version`,`info`),e.info.showToast(Q.t(`cmd.titleUpdate`),Q.t(`cmd.updateToast`,{latest:t.latest}))))}async function Yn(e){let{tui:t,options:n,app:r,session:i,projState:a,resumedNote:o,resumed:s,updateCheckPromise:c,bg:l,events:u}=e;if(o&&m({resumedNote:o,isFound:!!s,session:i,projState:a,tui:t}),n.resumePrompt&&s)if(r.memoryGovernor.sample().level===`critical`)t.info.showToast(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureResumeAbortedMessage`));else{let e=qn(i.session.branchEntries());e&&(e.parentId&&i.session.branch(e.parentId),i.prompt(n.resumePrompt).catch(e=>{r.logger.warn({err:e instanceof Error?e.message:String(e)},`[memory-governor] auto-resume prompt failed`),t.info.showToast(Q.t(`cmd.titleError`),Q.t(`cmd.memoryPressureResumeFailedMessage`))}))}c.then(e=>Jn(t,e)),l.setBgUnsubs(u.bgUnsubs),u.attachSessionHandler(),Xn(t,r)}function Xn(e,t){I(n=>{if(n.status!==`needs-input`)return;let r=n.id.slice(0,8),i=t.listSessions().find(e=>e.id===n.id)?.title??r;e.info.pushNotification(`session needs input`,`Background session '${i}' (${r}) requires your input (/resume ${r})`,`system`,`warning`)}),t.hookRegistry.on(`session.deleted`,`rfc234-background-cleanup`,e=>{p(e.sessionId)})}function Zn(e){let{app:t,session:n,options:r,tui:i,memoryConflictRef:a,turn:o,stopController:s,runAsyncBashRef:c,handleAbortInterceptRef:l,runMemoryCaptureRef:u,schedulePollIntervalRef:d,scheduleServiceRef:f}=e;a&&(a.current=(e,t)=>{i.info.showToast(`Memory Conflict`,`Concurrent edit detected for ${e} — saved to ${t}`)}),He(`startTui() ready (first frame mounted)`),t.setUserAskRenderer(e=>Bn(i,e));let p=Hn({gateway:()=>t.sessionManager.panelState,bridge:()=>i.pending,onError:(e,n)=>{t.logger?.debug?.({stage:e,error:n},`paste cache binding failed (non-fatal)`)}});Wn({app:t,tui:i}),Un(t),t.listAllSessions().then(e=>{let t=n.id,r=e.filter(e=>e.status!==`archived`&&(e.entryCount??e.messageCount)>0&&e.id!==t).slice(0,10).map(e=>({id:e.id,title:e.title??e.id.slice(0,8),status:e.id===t?`busy`:`idle-cold`,lastActivityAt:e.updatedAt?new Date(e.updatedAt).toLocaleString():``,isCurrent:e.id===t,isPinned:e.pinned??!1,isArchived:e.status===`archived`,isReadOnly:e.writeLocked??!1}));i.stores.tasks.setSessionList(r)}).catch(()=>{});let{pollInterval:m,scheduler:h}=_e(t,{sessionRef:{get value(){return n}},tui:i,remoteConfig:r.sessionUrl&&r.sessionToken?{sessionUrl:r.sessionUrl,sessionToken:r.sessionToken}:void 0});d.current=m,f.current=h;{let e=t.feedbackRegistry.get();e&&import(`./feedback-backend-methods-BNm38ddr.js`).then(({createFeedbackBackendHandler:r})=>{let i=r(e,{workspaceDir:t.workspaceDir,getModelId:()=>n.model?.id});t.panelBackendController.registerInProcessBackend(`plugin-feedback`,i.call)})}return c.current=An({tui:i,app:t,submitState:o}),l.current=jn({agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},tui:i,requestStop:e=>s.requestStop(e)}),u.current=Mn({app:t,tui:i}),Gn({app:t,tui:i,session:n}),Kn({app:t,tui:i,getScheduler:()=>h}),{pasteBinder:p}}const Qn=[`approaching`,`nearing`,`critical`],$n={maxReminders:{approaching:1,nearing:3,critical:1},backoffBaseTurns:4,resetMarginPct:10,approachingMarginPct:10};function $(){return{count:0,lastRemindedTurn:void 0,peakPct:0,active:!1}}function er(e,t,n,r){return e>=n?`critical`:e>=t?`nearing`:e>=t-r?`approaching`:null}function tr(e,t,n,r){return e===`critical`?n:e===`nearing`?t:t-r}function nr(e,t){return t<=1?0:e.backoffBaseTurns*2**(t-2)}var rr=class{config;zones;suppressed=!1;constructor(e={}){this.config={...$n,...e},this.zones={approaching:$(),nearing:$(),critical:$()}}check(e){if(this.suppressed)return null;let{contextPercent:t,pruneLinePct:n,compactLinePct:r,currentTurn:i}=e,a=er(t,n,r,this.config.approachingMarginPct);for(let e of Qn)e!==a&&this.zones[e].active&&t<tr(e,n,r,this.config.approachingMarginPct)-this.config.resetMarginPct&&(this.zones[e]=$());if(a===null)return null;let o=this.zones[a];o.lastRemindedTurn!==void 0&&i<o.lastRemindedTurn&&(this.zones[a]=$());let s=this.zones[a];s.active=!0,s.peakPct=Math.max(s.peakPct,t);let c=this.config.maxReminders[a];if(s.count>=c)return null;let l=s.count+1;if(s.lastRemindedTurn!==void 0){let e=nr(this.config,l);if(i-s.lastRemindedTurn<e)return null}return s.count=l,s.lastRemindedTurn=i,{zone:a,pct:Math.round(t)}}onCompacted(){this.zones={approaching:$(),nearing:$(),critical:$()}}suppress(){this.suppressed=!0}snapshot(){return{approaching:{count:this.zones.approaching.count,lastTurn:this.zones.approaching.lastRemindedTurn},nearing:{count:this.zones.nearing.count,lastTurn:this.zones.nearing.lastRemindedTurn},critical:{count:this.zones.critical.count,lastTurn:this.zones.critical.lastRemindedTurn}}}};function ir(e){let{getSession:t,app:n,tui:r,projState:i,contextWindow:a,currentModelId:o}=e,s,c=new rr,l={approaching:e=>Q.t(`cmd.contextPressureApproaching`,{pct:e}),nearing:e=>Q.t(`cmd.contextPressureNearing`,{pct:e}),critical:e=>Q.t(`cmd.contextPressureCritical`,{pct:e})},u=()=>{let e=t(),n=e.session.messages(),r=0,i=0,a=0,o=0,s=!1,c=0,l=0;for(let e=n.length-1;e>=0;e--){let t=n[e]?.usage;t&&(s||=(r=t.inputTokens??0,i=t.outputTokens??0,a=t.cacheReadTokens??0,o=t.cacheWriteTokens??0,!0),n[e]?.role===`assistant`&&(c+=t.inputTokens??0,l+=t.outputTokens??0))}return{sessionId:e.session.id,lastIn:r,lastOut:i,lastCacheRead:a,lastCacheWrite:o,totIn:c,totOut:l,messageCount:n.length}},d=(e,d)=>{let f=e!==void 0,p=f&&s&&s.sessionId===t().session.id?s:u();s=p;let m=d?d.before:1,h=d?d.after/m:1,g=e=>h<1?Math.round(e*h):e,_=n.modelRegistry.find(o.value??``)?.cost,v=_?p.totIn*(_.input??0)+p.totOut*(_.output??0):0,y=E({systemPrompt:t().systemPrompt,tools:t().tools,lastIn:g(p.lastIn),lastOut:g(p.lastOut),lastCacheRead:g(p.lastCacheRead),lastCacheWrite:g(p.lastCacheWrite),contextWindow:a.value,modelName:t().model?.name??``,totIn:p.totIn,totOut:p.totOut,cost:v>0?v:void 0,messageCount:p.messageCount,streamingOutputTokens:e});if(r.stores.budget.setBudget(y),r.stores.context.setBudget(y),!f&&y.contextWindow>0){let e=y.pruneLine/y.contextWindow*100,t=y.compactLine/y.contextWindow*100,n=c.check({contextPercent:y.contextPercent,pruneLinePct:e,compactLinePct:t,currentTurn:i.currentTurn});n&&r.info.pushNotification(Q.t(`cmd.titleContextPressure`),l[n.zone](n.pct),`system`,n.zone===`critical`?`warning`:`info`)}},f=()=>{try{t().session.setEditedFiles(r.messages.getEditedFiles().map(e=>({path:e.path,operation:e.operation,addedLines:e.addedLines,removedLines:e.removedLines,timestamp:e.timestamp,toolCallId:e.toolCallId}))),n.sessionManager.save(t().id).catch(()=>{})}catch(e){console.error(`\x1b[90m\x1b[2m[persist] editedFiles skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}};return{recomputeBudget:d,persistEditedFiles:f,persistSubagents:()=>{try{let e=[...r.plugins.getSubagents().values()].map(e=>({id:e.id,name:e.command||e.id,status:St(e),startedAt:e.startedAt}));t().session.setSubagents(e),n.sessionManager.save(t().id).catch(()=>{})}catch(e){console.error(`\x1b[90m\x1b[2m[persist] subagents skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}},persistTurnCount:()=>{try{t().session.setTurnCount(i.currentTurn)}catch(e){console.error(`\x1b[90m\x1b[2m[persist] turnCount skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}},editFileCallback:e=>{try{r.stores.tasks.addEditedFile({path:e.path,operation:e.operation,oldContent:e.oldContent,newContent:e.newContent,addedLines:e.addedLines,removedLines:e.removedLines,timestamp:e.timestamp,toolCallId:e.toolCallId})}catch(e){console.error(`\x1b[90m\x1b[2m[panel] addEditedFile skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}f()},onContextCompacted:()=>{c.onCompacted()}}}function ar(e){let{tui:t,app:r,themeRegistry:i,runtime:a,sessionRef:o,interactiveRef:s,modelReadyRef:c,projState:l,agentProcessingRef:u,modelsRef:d,availableModelIds:f,applyModel:p,persistAvailable:m,refreshModelsNow:h,refreshSlashCommands:_,events:v,redState:y,agentMessagesToChatMessages:b,PROVIDER_DISPLAY_NAMES:x,apiCredentialId:S,onContextCompacted:C}=e;return{tui:t,app:r,state:{get session(){return o.value},set session(e){o.value=e},get interactive(){return s.value},set interactive(e){s.value=e},get reg(){return a.regRef.value},set reg(e){a.regRef.value=e},get slashCommands(){return a.slashCommandsRef.value},set slashCommands(e){a.slashCommandsRef.value=e},get modelReady(){return c.value},set modelReady(e){c.value=e},get currentModelId(){return a.currentModelIdRef.value},set currentModelId(e){a.currentModelIdRef.value=e},get currentLang(){return a.currentLangRef.value},set currentLang(e){a.currentLangRef.value=e},get todoList(){return l.todoList},set todoList(e){l.todoList=e},get agentProcessing(){return u.value},set agentProcessing(e){u.value=e},get models(){return d.value},set models(e){d.value=e},get availableModelIds(){return f},get restartRequested(){return a.restartRequestedRef.value},set restartRequested(e){a.restartRequestedRef.value=!!e},themeRegistry:i},callbacks:{applyModel:p,persistAvailable:m,refreshModelsNow:h,registerAllTuiCommands:()=>{qt(a.regRef.value)},refreshSlashCommands:_,attachSessionHandler:()=>v.attachSessionHandler(),restoreSwitchedSession:()=>{l.delegated.clear(),l.todoList=[],l.currentTurn=0,Object.assign(y,n()),t.stores.tasks.setTasks([],void 0),t.panes.clearEditedFiles(),t.plugins.clearSubagents(),g({session:o.value,projState:l,tui:t}),C()},resetCurrentTurn:()=>{l.currentTurn=0},onContextCompacted:C,sessionUnsub:()=>v.getSessionUnsub(),getLastProviderUsage:()=>v.getLastProviderUsage(),isWriteLeaseReadOnly:()=>v.isWriteLeaseReadOnly(),isRunPaused:()=>v.isRunPaused(),agentMessagesToChatMessages:b,PROVIDER_DISPLAY_NAMES:x,apiCredentialId:S}}}function or(e){let{session:t,tui:n,retryAccelerate:r,setRateLimitInfo:i,abortNow:a}=e;t.coreAgent.on(`stream.retry`,({attempt:e,maxRetries:t,delayMs:i,reason:o})=>{n.engine.showRetryDialog(e,t,i,r,()=>{n.engine.clearRetryDialog()},o,()=>{a()})}),t.coreAgent.on(`rate.limit.exhausted`,({limitType:e,resetsAt:t})=>{n.engine.clearRetryDialog(),i({limitType:e,resetsAt:t})}),t.coreAgent.on(`lifecycle.tool.completed.crossBoundary`,({toolName:e,result:t})=>{let r=Q.t(`cmd.titleBackgroundTask`),i=t.isError?Q.t(`cmd.lifecycleCrossBoundaryFailed`,{toolName:e}):Q.t(`cmd.lifecycleCrossBoundaryDone`,{toolName:e});n.info.showToast(r,i)})}function sr(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isFinite(r)&&r>0?r:t}function cr(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isFinite(r)&&r>0&&Number.isInteger(r)?r:t}function lr(e){let{app:t,tui:n,getSession:r,setRestartResumePrompt:i,setRestartMemoryTriggered:a,handleExit:o,onContextCompacted:s,recomputeBudget:c}=e,l=!1,u=0,d,f=!1,p=0,m=!1,h=sr(`OTTO_MEMORY_CRITICAL_NOTIFY_INTERVAL_MS`,18e5),g=cr(`OTTO_MEMORY_CRITICAL_NOTIFY_ESCALATION_CYCLES`,4),_,v=()=>{let e=r();if(e.isBusy){let t=e.session.messages(),n=t[t.length-1];if(n?.role===`user`&&!n.internal){let e=C(n.content);e&&i(e)}}a(!0),o({type:`exit`,restart:!0})},y=()=>{_&&=(clearInterval(_),void 0),p=0,m=!1};t.memoryGovernor.setCallbacks({onWarning:()=>{r().compactNow().then(e=>{e.compacted&&(n.info.showToast(Q.t(`cmd.titleAutoCompact`),Q.t(`compact.edResult`,{before:e.before,after:e.after})),s(),c())}).catch(e=>{let r=e instanceof Error?e.message:String(e);t.logger.warn({err:r},`[memory-governor] compactNow (soft degrade) failed`),n.info.showToast(Q.t(`cmd.titleAutoCompact`),Q.t(`cmd.autoCompactFailed`,{msg:r}))})},onCritical:e=>{if(l){n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`info`);return}n.info.isFullScreenPaneActive()&&(u++,d??=Date.now(),u<3&&Date.now()-d<300*1e3)||(u=0,f=!0,n.modal.openModal({kind:`confirm`,title:Q.t(`cmd.titleMemoryPressure`),message:Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),confirmLabel:Q.t(`cmd.memoryPressureRestartNow`),cancelLabel:Q.t(`cmd.memoryPressureRemindLater`),confirmColor:`amber`,extraLabel:Q.t(`cmd.memoryPressureSuppress`),onConfirm:()=>{f=!1,y(),v()},onCancel:()=>{f=!1},onExtra:()=>{f=!1,l=!0}}))},onCriticalDuringGrace:e=>{n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`warning`)},onCriticalTimeout:e=>{if(f){f=!1,v();return}let i=()=>{p++,n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:t.memoryGovernor.sample().usedPct.toFixed(0)}),`system`,`warning`),!m&&p>=g&&(m=!0,r().compactNow().catch(e=>{let n=e instanceof Error?e.message:String(e);t.logger.warn({err:n},`[memory-governor] critical-unattended-escalation compactNow failed`)}),t.storage.traceStore?.append(r().id,{ts:Date.now(),sessionId:r().id,kind:`lifecycle`,node:`critical-unattended-escalation`,payload:{usedPct:e.usedPct,cycles:p}}).catch(e=>{t.logger.warn({err:e instanceof Error?e.message:String(e)},`[memory-governor] critical-unattended-escalation trace append failed`)}))};_||(i(),_=setInterval(i,h),_.unref?.())},onLevelChange:e=>{e!==`critical`&&(u=0,d=void 0,y()),n.engine.pushEngineEvent({kind:`perf`,indicatorLevel:e,memory:t.memoryGovernor.sample()})}}),t.fleetMonitor.setCallbacks({onBudgetExceeded:e=>{n.info.pushNotification(Q.t(`cmd.titleFleetBudget`),Q.t(`cmd.fleetBudgetExceeded`,{processCount:e.processCount,totalRssMb:e.totalRssMb}),`system`,`warning`)}})}function ur(e){let t=e??rt(import.meta.url);t=et(t);let n=t===`/`?t:`/`;for(;t!==n;){try{if(nt(t+`/.git`))return t}catch{}t=et(t)}try{if(nt(n+`/.git`))return n}catch{}}var dr=class{repoRoot;currentBuildId;checkIntervalMs;onStale;logger;lastNotifiedBuildId=void 0;disposed=!1;timer;activeChild;constructor(e){this.repoRoot=e.repoRoot,this.currentBuildId=e.currentBuildId,this.checkIntervalMs=e.checkIntervalMs??6e5,this.onStale=e.onStale,this.logger=e.logger}start(){this.disposed||this.scheduleNext()}dispose(){if(this.disposed=!0,this.timer&&=(clearTimeout(this.timer),void 0),this.activeChild){try{this.activeChild.kill()}catch{}this.activeChild=void 0}this.lastNotifiedBuildId=void 0}scheduleNext(){this.disposed||(this.timer=setTimeout(()=>{this.timer=void 0,this.performCheck().then(()=>{this.scheduleNext()})},this.checkIntervalMs),this.timer.unref())}performCheck(){return new Promise(e=>{if(this.disposed){e();return}let t=ve(`git`,[`rev-list`,`--count`,`HEAD`],{cwd:this.repoRoot,timeout:5e3},(t,n)=>{if(this.activeChild=void 0,t){this.logger?.warn({err:t instanceof Error?t.message:String(t)},`[stale-build-detector] git rev-list failed`),e();return}let r=n.trim(),i=parseInt(r,10);if(!Number.isFinite(i)){this.logger?.warn({raw:r},`[stale-build-detector] failed to parse git output as number`),e();return}if(i>this.currentBuildId&&i!==this.lastNotifiedBuildId){this.lastNotifiedBuildId=i;try{this.onStale?.(i)}catch(e){this.logger?.warn({err:e instanceof Error?e.message:String(e)},`[stale-build-detector] onStale callback threw`)}}e()});this.activeChild=t,t.on(`error`,()=>{this.activeChild=void 0})})}};async function fr(e){let{runtime:t,app:n,options:r,tui:i,tuiRef:a,turn:o,projState:l,redState:u,stopController:d,themeRegistry:f,availableModelIds:p,applyModel:m,refreshSlashCommands:h,retryAccelerate:g,startupCrashGapRef:_,resumedNote:v,resumed:y,updateCheckPromise:b,bg:x,ftueController:S,refreshModelsNow:C,persistAvailable:w,cfgLang:E,sessionRef:D,interactiveRef:O,modelReadyRef:k,modelsRef:M,pasteBinder:N}=e;t.handleExitRef.current=e=>{d.requestStop(e.restart?`exit-restart`:`exit`)},r.memoryRestartGrace&&n.memoryGovernor.markRestarted();let P=r.restartGeneration??0;P>=3&&i.info.pushNotification(Q.t(`cmd.titleFleetBudget`),Q.t(`cmd.restartChainDeep`,{generation:P}),`system`,`warning`),i.engine.pushEngineEvent({kind:`perf`,indicatorLevel:n.memoryGovernor.currentLevel,memory:n.memoryGovernor.sample()}),or({session:D.value,tui:i,retryAccelerate:g,setRateLimitInfo:e=>{o.lastRateLimitInfo=e},abortNow:()=>{d.abortNow()}});let F=ir({getSession:()=>D.value,app:n,tui:i,projState:l,contextWindow:t.contextWindowRef,currentModelId:t.currentModelIdRef}),{recomputeBudget:I,persistEditedFiles:L,persistSubagents:R,persistTurnCount:z,onContextCompacted:B}=F;t.pushBudgetNowRef.value=I,I(),n.editFileCallback=F.editFileCallback,lr({app:n,tui:i,getSession:()=>D.value,setRestartResumePrompt:e=>{t.restartResumePromptRef.value=e},setRestartMemoryTriggered:e=>{t.restartMemoryTriggeredRef.value=e},handleExit:t.handleExitRef.current,onContextCompacted:B,recomputeBudget:I}),n.registerInAppNotificationChannel((e,t,n)=>i.info.pushNotification(e,t,`system`,T(n))),n.setFollowUpPendingProbe(()=>i.engine.hasQueuedFollowUp());let ee=Vn({getSession:()=>D.value,app:n,tui:i,projState:l,redState:u,recomputeBudget:I,persistEditedFiles:L,persistSubagents:R,persistTurnCount:z,onContextCompacted:B,markStreamed:()=>{o.streamedText=!0}});t.eventsRef.value=ee,t.cliCtxRef.current=ar({runtime:t,tui:i,app:n,themeRegistry:f,sessionRef:D,interactiveRef:O,modelReadyRef:k,projState:l,agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},modelsRef:M,availableModelIds:p,applyModel:m,persistAvailable:w,refreshModelsNow:C,refreshSlashCommands:h,events:ee,redState:u,agentMessagesToChatMessages:c,PROVIDER_DISPLAY_NAMES:s,apiCredentialId:xe,onContextCompacted:B}),t.cliCtxRef.current.callbacks.pasteBinder=N,N.load(D.value.id),i.plugins.setPluginRegistrations(n.getPluginRegistrations());let H=await S.refresh();if(a.value?.stores.tasks.setFtueStage(H.stage),A(H)&&E===`auto`&&!n.settings.get(`has_completed_onboarding`)){let e=await i.modal.openModal({kind:`onboarding`,onLanguagePreview:e=>{let n=e===`auto`?j():e;re(n),i.lifecycle.setLanguage(n),t.currentLangRef.value=n}});if(e.nickname&&n.settings.persist({nickname:e.nickname}).catch(()=>{}),e.language){let r=e.language===`auto`?j():e.language;re(r),i.lifecycle.setLanguage(r),t.currentLangRef.value=r,n.settings.persist({language:e.language}).catch(()=>{})}n.settings.persist({has_completed_onboarding:!0}).catch(()=>{})}H.recommendation.autoOpen&&V(`setup`,[],t.cliCtxRef.current);let U=ur();U&&(t.staleBuildDetectorRef.current=new dr({repoRoot:U,currentBuildId:Ke,logger:n.logger,onStale:e=>{i.info.pushNotification(Q.t(`cmd.titleStaleBuild`),Q.t(`cmd.staleBuildMessage`,{current:Ke,latest:e}),`system`,`info`)}}),t.staleBuildDetectorRef.current.start()),await Yn({tui:i,options:r,app:n,session:D.value,projState:l,resumedNote:v,resumed:y??void 0,updateCheckPromise:b,bg:x,events:ee}),_.value&&i.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:_.value.lostTurns}))}var pr=class{#e=!1;#t=!1;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y;get contextWindow(){return this.#r??0}set contextWindow(e){this.#r=e}get currentModelId(){return this.#i}set currentModelId(e){this.#i=e}get pushBudgetNow(){return this.#a}get contextWindowRef(){let e=this;return{get value(){return e.#r??0},set value(t){e.#r=t}}}get currentModelIdRef(){let e=this;return{get value(){return e.#i},set value(t){e.#i=t}}}get pushBudgetNowRef(){let e=this;return{get value(){return e.#a},set value(t){e.#a=t}}}get reg(){return this.#o}set reg(e){this.#o=e}get slashCommands(){return this.#s}set slashCommands(e){this.#s=e}get currentLang(){return this.#c}set currentLang(e){this.#c=e}get regRef(){let e=this;return{get value(){return e.#o},set value(t){e.#o=t}}}get slashCommandsRef(){let e=this;return{get value(){return e.#s},set value(t){e.#s=t}}}get currentLangRef(){let e=this;return{get value(){return e.#c},set value(t){e.#c=t}}}get restartRequested(){return this.#e}get restartMemoryTriggered(){return this.#t}get restartResumePrompt(){return this.#n}get restartRequestedRef(){let e=this;return{get value(){return e.#e},set value(t){e.#e=!!t}}}get restartMemoryTriggeredRef(){let e=this;return{get value(){return e.#t},set value(t){e.#t=t}}}get restartResumePromptRef(){let e=this;return{get value(){return e.#n},set value(t){e.#n=t}}}get exitSessionRef(){let e=this;return{get value(){return e.#l},set value(t){e.#l=t}}}get providerAuthRef(){let e=this;return{get current(){return e.#u},set current(t){e.#u=t}}}get staleBuildDetectorRef(){let e=this;return{get current(){return e.#d},set current(t){e.#d=t}}}get schedulePollIntervalRef(){let e=this;return{get current(){return e.#f},set current(t){e.#f=t}}}get scheduleServiceRef(){let e=this;return{get current(){return e.#p},set current(t){e.#p=t}}}get runAsyncBashRef(){let e=this;return{get current(){return e.#m},set current(t){e.#m=t}}}get handleAbortInterceptRef(){let e=this;return{get current(){return e.#h},set current(t){e.#h=t}}}get runMemoryCaptureRef(){let e=this;return{get current(){return e.#g},set current(t){e.#g=t}}}get cliCtxRef(){let e=this;return{get current(){return e.#_},set current(t){e.#_=t}}}get handleExitRef(){let e=this;return{get current(){return e.#v},set current(t){e.#v=t}}}get eventsRef(){let e=this;return{get value(){return e.#y},set value(t){e.#y=t}}}};async function mr(t,r,i){let a=new pr,o;try{let s=await pn(r,{continueSession:t.continueSession,model:t.model,sessionUrl:t.sessionUrl}),c=s.SETUP_PLACEHOLDER_ID,l=s.session,u=s.startupCrashGapRef,d=s.resumedNote,f=s.modelReadyRef,p=f.value,m=s.ftueController,h=s.refreshModelsNow,g=s.modelRefreshState,_=g.availableModelIds,v=s.persistAvailable,y=g.models,x=s.continuedExisting,S=s.retryAccelerate,C=s.resumed,T=s.convoCount,E=s.tuiRefBox,k=E,A=p?l.model?.id:void 0;a.contextWindow=r.modelRegistry.getAll().filter(e=>e.id!==c).find(e=>e.id===A)?.contextWindow??0;let M=a.contextWindowRef;a.currentModelId=A;let N=a.currentModelIdRef,P=e=>H(r,e,l.thinkingLevel),F=a.pushBudgetNowRef,I=a.exitSessionRef,L=a.providerAuthRef,R={value:t},z=e=>{switch(e.kind){case`steer`:l.steer(e.input);break;case`abort`:W.abort();break;case`pauseAfterTurn`:l.pauseRun();break;case`resumeRun`:l.resumeRun();break}},V=oe({modelReady:f,currentModelId:N,contextWindow:M,tuiRef:E,pushBudgetNow:F,app:r,getSession:()=>l,options:R,fmtDisplayModel:P,onEngineModelAction:z}),ee=b({getSession:()=>l,app:r,tuiRef:E,options:R,fmtDisplayModel:P,applyModel:V,onExitSession:()=>I.value?.(),onLogin:e=>L.current?.(e)}),W=new B(l,{models:y,currentModel:A,onModelChange:V}),{startTui:te}=await import(`@x-otto/tui`);a.reg=W.getRegistry(),qt(a.reg),Jt(a.reg,r);let ie=w(a.reg,r),G={agentProcessing:!1,ctrlCCount:0,lastCtrlCTime:0,userAborted:!1,shellChild:null,streamedText:!1,retryMode:!1,errorRetryAttempt:0,lastRateLimitInfo:void 0,latestSubmittedPrompt:void 0},ce=()=>Ht(l.isBusy,G.agentProcessing);a.slashCommands=Kt(a.reg,G.agentProcessing,U,Q.t(`cmdDesc`,{returnObjects:!0}),l.pinned,l.isPaused);let ue=()=>(a.slashCommands=Kt(a.reg,G.agentProcessing,U,Q.t(`cmdDesc`,{returnObjects:!0}),l.pinned,l.isPaused),a.slashCommands);O(r),se(r,_),ae(r),D(r);let de=Nt(),fe=r.settings.get(`language`)??`auto`;a.currentLang=fe===`auto`?j():fe;let pe=$t(r),me=r.settings.get(`theme_preset`),he=r.settings.get(`keybinding_overrides`);re(a.currentLang);let ge=e({currentVersion:le(),lastCheck:r.settings.get(`last_update_check`),autoCheck:r.settings.get(`auto_update_check`)!==!1,persistLastCheck:()=>r.settings.persist({last_update_check:Date.now()})}),_e={get value(){return l},set value(e){l=e}},K={get value(){return W},set value(e){W=e}},ve={get value(){return y},set value(e){y=e}};await new Promise(async e=>{let s=a.staleBuildDetectorRef,c=a.schedulePollIntervalRef,g=a.scheduleServiceRef,y=!1,b=()=>{if(!y){y=!0;try{o?.clearBgSubs()}catch{}try{o?.stopBgOutputPoll()}catch{}try{o?.stopBgSubagentPoll()}catch{}try{clearInterval(c.current)}catch{}try{g.current.stop()}catch{}try{s.current?.dispose()}catch{}e()}};I.value=b;let w=()=>{setTimeout(b,3e3).unref();try{k.value?.lifecycle.stop()}catch{b()}},D=tn({getTui:()=>k.value??null,getSession:()=>l,dispatchAbort:()=>z({kind:`abort`}),clearTodoLayers:()=>{de.todoList.length!==0&&(de.todoList=[],k.value?.stores.tasks.setTasks([]),l.session.setTodoList([]))},markUserAborted:()=>{G.userAborted=!0},resetCtrlCCount:()=>{G.ctrlCCount=0},markRestartRequested:()=>{a.restartRequestedRef.value=!0},stopTui:w,isBusy:()=>ce()}),O=ne,{historyStore:j,inputHistory:M,externalHistoryCommands:N}=await dn(l,r.settings.get(`history`)?.external),F=Yt({app:r,session:l,getTui:()=>U});o=F;let L=a.runAsyncBashRef,R=a.handleAbortInterceptRef,B=a.runMemoryCaptureRef,H=n(),U=await te(await Ln({runtime:a,app:r,session:l,options:t,tuiRefBox:E,tuiRef:k,turn:G,projState:de,redState:H,isBusyNow:ce,dispatchToEngine:z,stopController:D,finishInteractive:b,stopTuiGuarded:w,applyModel:V,ensureModelUsableForPrompt:ee,refreshSlashCommands:ue,fileCommands:ie,modelReady:p,availableModelIds:_,currentModel:A,fmtDisplayModel:P,cfgLang:fe,themeRegistry:pe,presetSelection:me,keybindingOverrides:he,continuedExisting:x,convoCount:T,historyStore:j,inputHistory:M,externalHistoryCommands:N,bg:F,bgController:o,interactive:W,allCommandNames:O}));E.value=U;let{pasteBinder:re}=Zn({app:r,session:l,options:t,tui:U,memoryConflictRef:i,turn:G,stopController:D,runAsyncBashRef:L,handleAbortInterceptRef:R,runMemoryCaptureRef:B,schedulePollIntervalRef:c,scheduleServiceRef:g});await fr({runtime:a,app:r,options:t,tui:U,tuiRef:k,turn:G,projState:de,redState:H,stopController:D,themeRegistry:pe,availableModelIds:_,applyModel:V,refreshSlashCommands:ue,retryAccelerate:S,startupCrashGapRef:u,resumedNote:d,resumed:C??void 0,updateCheckPromise:ge,bg:F,ftueController:m,refreshModelsNow:h,persistAvailable:v,cfgLang:fe,sessionRef:_e,interactiveRef:K,modelReadyRef:f,modelsRef:ve,pasteBinder:re})});let ye;if(r.codingSessionPool.autoPersist&&l.session.messages().length>0){let e=t.sessionUrl?` --session-url ${t.sessionUrl}`:``,n=t.sessionToken?` --session-token <redacted>`:``;ye=`\n\x1b[2m${Q.t(`cmd.resumeContinueLabel`)}\x1b[0motto --continue ${l.id}${e}${n}\n`}return{restart:a.restartRequested?{sessionId:l.id,memoryTriggered:a.restartMemoryTriggered,resumePrompt:a.restartResumePrompt}:void 0,resumeHint:ye}}finally{o?.clearBgSubs(),o?.stopBgOutputPoll(),o?.stopBgSubagentPoll()}}async function hr(e){if(e.hasParentWorkspace()){let t=e.parentWorkspaceExisted,n=await yt({parentRoot:t.parentRoot,currentRoot:t.currentRoot,language:e.settings.get(`language`)});n===`exit`&&(process.stdout.write(`
|
|
10
|
+
`),confirmLabel:r[0]?.label??Q.t(`cmd.grillOptionYes`),cancelLabel:r[1]?.label??Q.t(`cmd.grillOptionNo`),onConfirm:()=>n(!0),onCancel:()=>n(!1)})})?r[0]?.label:r[1]?.label;return It(t,n?[n]:[])}let n=await e.modal.openModal({kind:`questions`,title:t.question,questions:[{header:t.header,question:t.question,multiSelect:!!t.multiSelect,freeformInput:t.allowFreeform!==!1,freeformPlaceholder:Q.t(`cmd.grillFreeformPlaceholder`),options:r.map(e=>({label:e.recommended?`${e.label} ★`:e.label,description:e.rationale}))}]});return It(t,(n?.answers?.[t.header]??[]).map(e=>e.replace(/\s*★$/,``)),n?.freeformText)}return Lt(t,await e.modal.openModal({kind:`input`,title:t.header,description:[t.question],placeholder:Q.t(`cmd.grillAnswerPlaceholder`)}))}function Vn(e){let{getSession:t,app:n,tui:r,projState:i,redState:o,recomputeBudget:s,persistEditedFiles:c,persistSubagents:l,persistTurnCount:u,onContextCompacted:d,markStreamed:f}=e,p=null,m=!1,h=!1,g=null,v=null,y=e=>{let r=t(),i=r.session.getTurnCount();a({traceStore:n.storage.traceStore,sessionId:r.id,...i===void 0?{}:{turn:i}},e,`session-event`)},b=e=>{t().session.append({role:`system`,subtype:e,content:e,level:`info`,timestamp:Date.now()})},x=!1,C,w={isDelegationTool:e=>Pt(n.toolRegistry.getAll()).has(e),currentModel:()=>t().model.id,cacheHitRatio:()=>t().getLastCacheHitRatio(),turnTokens:()=>{let e=t().session.messages(),n=0;for(let t of e)t.role===`assistant`&&t.usage&&(n+=(t.usage.inputTokens??0)+(t.usage.outputTokens??0)+(t.usage.cacheReadTokens??0)+(t.usage.cacheWriteTokens??0));let r=C;if(C=n,!(r==null||n<=r))return n-r}},ee,T=!1,E=0,D=0,O=0,k=new Rn({estimate:_}),A=()=>{D=0,O=0,E=0,k.reset()},j=()=>{s(D+O+k.tokens())},M=0,N={},P=e=>{let t=0,n=0;for(let r of e.split(`
|
|
11
|
+
`))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++;return`+${t}/-${n}`},F=()=>{let e=Y.listForSession(t().id).map(e=>({id:e.id,command:e.command,type:`process`,origin:`main`,status:e.status===`running`?`running`:e.status===`exited`?`exited`:`killed`,port:e.port,startedAt:e.startedAt,exitCode:e.exitCode,detectedService:e.detectedService})),n=new Map(J.list().map(e=>[e.id,e])),i=e=>{let t=n.get(e);return t?mt(t):{}},a=q.listForSession(t().id).map(e=>({id:e.id,command:e.title,type:`agent-session`,origin:e.origin,status:e.status===`running`||e.status===`ready`||e.status===`needs_input`?`running`:e.status===`applied`?`exited`:e.status===`failed`?`failed`:`killed`,agentStatus:e.status,diffStat:e.diff?P(e.diff):void 0,startedAt:e.startedAt,...i(e.id)})),o=new Set(a.map(e=>e.id)),s=J.list().filter(e=>!o.has(e.id)).map(ht),c=[...e,...a,...s];r.stores.tasks.setBackgroundTasks([...c.filter(e=>e.origin===`user`),...c.filter(e=>e.origin!==`user`)])},I=null,L=()=>{I===null&&(I=setTimeout(()=>{I=null,F()},30))},R=()=>{I!==null&&(clearTimeout(I),I=null),F()},z=[Y.onSpawn(L),Y.onExit(R),q.onSpawn(L),q.onUpdate(L),q.onExit(R),q.onRemove(R),J.subscribe(L)];F();let B;return{bgUnsubs:z,attachSessionHandler:()=>{B?.(),m=!1,B=t().subscribe(e=>{for(let a of Ft(e,i,w)){if(a.kind===`prompt.end`){let e=ce(a,o),n={turn:i.currentTurn,completedAt:Date.now(),...e},r=t().session.getTurnSummaries()??[];t().session.setTurnSummaries([...r.filter(e=>e.turn!==n.turn),n])}S(a,{pushMessage:r.messages.pushMessage,echoUserInput:r.messages.echoUserInput,pushEngineEvent:r.engine.pushEngineEvent,getNotifyStats:r.info.getNotifyStats,setTasks:(e,t)=>r.stores.tasks.setTasks(e,t),addTurnBoundary:e=>r.stores.tasks.addTurnBoundary(e)},o),a.kind===`tasks.update`&&(t().session.setTodoList(i.todoList),n.sessionManager.save(t().id).catch(()=>{}))}if(e.type===`stream.event`&&e.event?.type===`text_delta`){f();let t=e.event?.delta??``;E+=t.length,k.push(t),r.engine.pushEngineEvent({kind:`outputTokensThisTurn`,n:Math.floor(E/4)}),j()}if(e.type===`stream.event`&&e.event?.type===`done`){let i=e.event?.providerUsage;if(i!==void 0){let e=i!==null&&pt(i.status,i.overageStatus);if(i===null||i.status===`rejected`&&!e)r.stores.notification.setProviderUsage(null),p=null;else{let e=t().model.provider;n.authStore.getAuthSource(e).then(n=>{if(t().model.provider!==e)return;let a=n===`oauth`?i:null;r.stores.notification.setProviderUsage(a),p=a}).catch(()=>{})}}}switch(e.type){case`turn.start`:E=0,k.reset(),j(),r.engine.pushEngineEvent({kind:`spinnerMode`,mode:`requesting`});break;case`turn.end`:A(),s();break;case`streaming.start`:r.engine.pushEngineEvent({kind:`spinnerMode`,mode:`responding`}),r.pending.clearPendingEcho();break;case`streaming.end`:r.engine.pushEngineEvent({kind:`spinnerMode`,mode:null}),r.pending.clearPendingEcho();break;case`prompt.start`:A(),D=_(e.text),j(),r.info.setTopView({session:t().id}),r.panes.clearEditedFiles(),r.plugins.clearSubagents(),M=o.messageIndex,r.info.addContextTurn({turnIndex:i.currentTurn,role:`assistant`,messageCount:0,estimatedTokens:0,compacted:!1,truncated:!1,pruned:!1});break;case`compaction.start`:ee=e.messageCount,r.engine.pushEngineEvent({kind:`activeTool`,name:at});break;case`compaction.end`:{let t=ee??e.retainedCount,n=e.retainedCount;r.engine.pushEngineEvent({kind:`activeTool`,name:null}),n<t&&(r.messages.pushMessage({role:`compact_boundary`,before:t,after:n}),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:t,after:n,summary:e.summary}),d()),ee=void 0,s(void 0,{before:t,after:n});break}case`compaction.reactive.notice`:{let{messagesBefore:t,messagesAfter:n}=e;n<t&&(r.messages.pushMessage({role:`compact_boundary`,before:t,after:n}),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:t,after:n,summary:e.summary}),d()),s(void 0,{before:t,after:n});break}case`image.degradation.notice`:e.degradedCount>0&&r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.imageDegradationNotice`,{count:e.degradedCount,context:e.trigger===`image-constraint`?`image-constraint`:`other`}));break;case`session.history-capped`:r.messages.pushMessage({role:`history_capped`,removedCount:e.removedCount,trigger:e.trigger,...e.lossy?{lossy:!0}:{}}),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`history_capped`,removedCount:e.removedCount});break;case`session.write-lease-denied`:m=!0,r.messages.pushMessage({role:`write_lease_denied`}),r.info.showToast(Q.t(`lease.deniedToastTitle`),Q.t(`lease.deniedToastBody`));break;case`session.write-lease-restored`:m=!1,r.messages.pushMessage({role:`write_lease_restored`}),r.info.showToast(Q.t(`lease.restoredToastTitle`),Q.t(`lease.restoredToastBody`));break;case`session.crash-gap-detected`:r.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:e.lostTurns}));break;case`run.pause_requested`:h=!0,g={at:Date.now(),toolCount:0},y(`requested`),r.engine.setPauseDialog?.({phase:`requested`,requestedAt:Date.now(),toolCount:0,onCancel:()=>{},onDismiss:()=>{r.engine.setPauseDialog?.(null)}}),v&&clearInterval(v),v=setInterval(()=>{if(!g){clearInterval(v),v=null;return}let e=Math.floor((Date.now()-g.at)/1e3);r.stores.notification.setPausePending({elapsedSec:e,toolCount:g.toolCount})},1e3);break;case`tool.call.end`:{let t=typeof e.resultTokensEstimate==`number`?e.resultTokensEstimate:e.resultText?_(e.resultText):0;t>0&&(O+=t,j()),g&&(g.toolCount++,r.engine.setPauseDialog?.({phase:`requested`,requestedAt:g.at,toolCount:g.toolCount,onCancel:()=>{},onDismiss:()=>{r.engine.setPauseDialog?.(null)}})),(async()=>{try{let t={role:`tool_result`,name:e.toolCall.name,toolCallId:e.toolCall.id,content:[{type:`text`,text:e.resultText??``}],details:e.details},i=await n.resolveA2uiRendererPayload(t);i&&i.length>0&&r.messages.pushMessage({role:`assistant`,content:[{type:`a2ui`,components:i}]})}catch{}})();break}case`run.paused`:y(`paused`),g?(r.engine.setPauseDialog?.({phase:`active`,requestedAt:g.at,toolCount:g.toolCount,totalToolCount:g.toolCount}),r.messages.pushMessage({role:`run_paused`,toolCount:g.toolCount}),b(`run_paused`),v&&=(clearInterval(v),null),r.stores.notification.setPausePending(null),g=null):(r.messages.pushMessage({role:`run_paused`}),b(`run_paused`)),r.stores.notification.setPaused(!0);break;case`run.pause_cancelled`:y(`cancelled`),r.engine.setPauseDialog?.(null),r.messages.pushMessage({role:`run.pause_cancelled`}),b(`run_pause_cancelled`),v&&=(clearInterval(v),null),r.stores.notification.setPausePending(null),g=null,h=!1;break;case`run.resumed`:y(`resumed`),r.engine.setPauseDialog?.(null),r.messages.pushMessage({role:`run_resumed`}),b(`run_resumed`),v&&=(clearInterval(v),null),r.stores.notification.setPausePending(null),g=null,h=!1,r.stores.notification.setPaused(!1);break;case`steer.consumed`:r.pending.commitPendingSteer(e.id);break;case`image.vision-delegate`:!x&&e.describedCount>0&&(x=!0,r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`model.visionDelegateToast`,{count:e.describedCount})));break;case`memory.pruned`:T||(T=!0,r.messages.pushMessage({role:`prune_boundary`})),r.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`prune`,tokensSaved:e.tokensSaved,prunedCount:e.prunedCount}),s();break;case`error`:c(),l(),r.pending.withdrawPendingEcho();break;case`prompt.continued`:r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.todoGateContinuing`,{round:e.round,cap:e.maxRounds,left:e.incompleteCount}));break;case`prompt.budget.notice`:e.steered&&r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.promptBudgetExceeded`,{context:e.dimension,used:e.used,budget:e.budget}));break;case`budget.notice`:e.extended?r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.budgetExtended`,{maxTurns:e.maxTurns})):e.steered&&r.info.showToast(Q.t(`cmd.titleInfo`),e.progressDenied?Q.t(`cmd.budgetProgressDenied`):Q.t(`cmd.budgetSteered`,{maxTurns:e.maxTurns}));break;case`progress.stall.notice`:r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.progressStallDetected`,{maxRepeat:e.maxRepeat}));break;case`tool.call.mismatch.notice`:e.outcome===`retry`?r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.toolCallMismatchRetry`,{retryCount:e.retryCount})):r.info.showToast(Q.t(`cmd.titleError`),Q.t(`cmd.toolCallMismatchTerminated`));break;case`session.cost-budget-exceeded`:r.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.sessionCostBudgetExceeded`,{used:e.totalCostUSD.toFixed(2),budget:e.budgetUSD.toFixed(2)}));break;case`prompt.end`:A(),r.pending.clearPendingSteers(),s(),r.info.markContextTurns({turnIndex:i.currentTurn,messageCount:Math.max(0,o.messageIndex-M)}),c(),l(),u();{let e=t(),n=Ne(e.session.metadata().title,e.session.messages(),e.id);r.stores.tasks.setSessionTitle(n),r.lifecycle.setTerminalTitle(n)}if(process.env.OTTO_TUI_DEBUG_NOTIFY_STATS){let e=r.info.getNotifyStats();if(e.coalescedCalls>0){let t=(e.coalescedCalls/Math.max(1,e.coalescedFires)).toFixed(1);console.error(`\x1b[90m\x1b[2m[perf] notify merge ${e.coalescedCalls}→${e.coalescedFires} (${t}x) direct ${e.immediateCalls} flush ${e.flushFires}\x1b[0m`)}}{let e=n.settings.get(`pulse_survey`);n.feedbackRegistry.get()!==void 0&&zt(i.currentTurn,{enabled:e?.enabled??!0,probability:e?.probability??.05,minTurnGap:e?.min_turn_gap??20,forcedUpgradeActive:r.info.isForcedUpgradeActive()},N)&&(N.lastShownTurn=i.currentTurn,r.stores.notification.setPulseSurvey({phase:`rating`,rating:null,selectedIndex:0,commentText:``,commentOffset:0,onSubmit:(e,r)=>{n.feedbackRegistry.get()?.recordPulseSurvey?.({ts:Date.now(),rating:e,comment:r,sdkVersion:Ye,modelId:t().model?.id})},onClose:()=>r.stores.notification.setPulseSurvey(null)}))}break;case`ask.user.required`:{let i=e.question,a=e.requestId;(async()=>{let o=n.inquiryCenter;if(!o.enqueue({id:a,origin:{kind:`session`,sessionId:e.sessionId},question:i}).accepted){t().resolveAskUser(a,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}if(!await o.waitForTurn(a)){t().resolveAskUser(a,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}try{let e=await Bn(r,i);t().resolveAskUser(a,e)}finally{o.release(a)}})();break}case`approval.required`:{if(e.semanticVerdict){let t=Rt(e.description,e.arguments,be);e.semanticVerdict===`allow`&&t&&n.approveSandboxBypass(t),n.recordAutoPermissionDecision({sessionId:e.sessionId,agentName:`main`,toolName:e.toolName,effect:e.semanticVerdict===`allow`?`allow`:`deny`,policyName:`semantic::sandbox-escalation`,reason:e.description}),n.logger?.info?.({approvalId:e.id,verdict:e.semanticVerdict,toolName:e.toolName},`Semantic approval verdict handled (no prompt)`);break}let i=e.toolName===`bash`&&typeof e.arguments?.command==`string`?e.arguments.command:``,a=i?n.bashAlwaysAllowPrefix(i):null;r.modal.requestPermission({tool:e.toolName,input:zn(e.toolName,e.arguments),risk:e.risk??`medium`,description:e.description,alwaysAllowLabel:a??void 0}).then(r=>{let i=Rt(e.description,e.arguments,be);r.approved&&i&&n.approveSandboxBypass(i),t().resolveApproval(e.id,r.approved),r.approved&&r.mode===`always`&&(e.toolName===`bash`?a&&n.allowToolAlways(`bash(${a})`,t().id):n.allowToolAlways(e.toolName,t().id))});break}}})},getSessionUnsub:()=>B,getLastProviderUsage:()=>p,isWriteLeaseReadOnly:()=>m,isRunPaused:()=>h}}function Hn(e){let t=(t,n)=>{e.onError?.(t,n)},n=async n=>{let r=e.gateway(),i=e.bridge();if(!(!r||!i))try{let e=await r.getPaste(n);i.hydratePaste({entries:e.entries,nextId:e.nextId})}catch(e){t(`load`,e);try{i.hydratePaste(null)}catch{}}},r=async n=>{let r=e.gateway(),i=e.bridge();if(!(!r||!i))try{let e=i.exportPaste();if(!e)return;await r.setPaste(n,{sessionId:n,entries:e.entries,nextId:e.nextId})}catch(e){t(`save`,e)}};return{load:n,save:r,async switchTo(e,t){e!==t&&(e!==void 0&&await r(e),await n(t))},async fork(n,r){let i=e.gateway(),a=e.bridge();if(!(!i||!a))try{let e=a.exportPaste()??await i.getPaste(n);await i.setPaste(r,{sessionId:r,entries:e.entries,nextId:e.nextId})}catch(e){t(`fork`,e)}}}}function Un(e){e.setEcosystemSearch(async t=>{try{let{registries:n,warnings:r}=await he(e).loadAll();return{hits:X(n.flatMap(e=>e.entries.map(t=>({entry:t,registry:e}))).map(e=>({text:e.entry.id,aliases:[e.entry.description,...e.entry.keywords??[]],payload:e})),t.join(` `),{maxResults:8}).map(e=>({id:e.item.payload.entry.id,description:e.item.payload.entry.description,capabilities:e.item.payload.entry.capabilities,sourceName:e.item.payload.registry.sourceName,stale:e.item.payload.registry.stale})),warnings:r}}catch{return}})}function Wn(e){let{app:t,tui:n}=e;t.setMcpStartupCallback(e=>{let r=[`HTTP_PROXY`,`HTTPS_PROXY`,`http_proxy`,`https_proxy`].find(e=>process.env[e]),i=r?process.env[r]:void 0,a=t.settings.get(`proxy`);i&&r&&!a?.url&&(ge(i,r),n.info.showToast(Q.t(`proxy.title`),Q.t(`proxy.envDetectedToast`,{source:r,value:i})))})}function Gn(e){let{app:t,tui:n,session:r}=e;n.plugins.registerArgumentSuggester(`model`,(e,n=20)=>X(t.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(e=>({text:e.id,aliases:[e.name,e.provider],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload.id,description:e.item.payload.name})));let i=Ne(r.session.metadata().title,r.session.messages(),r.id);n.lifecycle.setTerminalTitle(i),n.stores.tasks.setSessionTitle(i)}function Kn(e){let{app:t,tui:n,getScheduler:r}=e;n.plugins.registerArgumentSuggester(`schedule`,(e,t=20)=>{let n=[`remove`,`run`,`enable`,`disable`],i=n.find(t=>e.toLowerCase().startsWith(`${t} `));if(!i)return X([...n,`list`,`add`,`logs`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:t}).map(e=>({name:e.item.payload}));let a=r();if(!a)return[];let o=e.slice(i.length+1);return X(a.list().map(e=>({text:e.id,aliases:[e.name],payload:e})),o,{maxResults:t}).map(e=>({name:`${i} ${e.item.payload.id}`,description:e.item.payload.name}))}),n.plugins.registerArgumentSuggester(`replay`,(e,n=20)=>X(t.listSessions().map(e=>({text:e.id,aliases:e.title?[e.title]:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload.id,description:e.item.payload.title??e.item.payload.id.slice(0,8)}))),n.plugins.registerArgumentSuggester(`session`,(e,n=20)=>{let r=e.toLowerCase().startsWith(`unlock `)?e.slice(7):e;return r===e?X([{name:`fork`,description:`Fork current session into a named branch`},{name:`clear`,description:`Clear screen and reset session context`},{name:`unlock`,description:`Write-lease diagnostics/force-unlock`},{name:`kill`,description:`Terminate a session`},{name:`inspect`,description:`Read-only remote snapshot preview`},{name:`pin`,description:`Toggle pin state (pinned sort to top of session list)`},{name:`archive`,description:`Toggle archive state`},{name:`resume`,description:`List and switch to an existing session`},{name:`compact`,description:"Compact context now (or `compact log` for details)"},{name:`context`,description:`Show context usage breakdown`}].map(e=>({text:e.name,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload.name,description:e.item.payload.description})):X(t.listSessions().map(e=>({text:e.id,aliases:e.title?[e.title]:[],payload:e})),r,{maxResults:n}).map(e=>({name:`unlock ${e.item.payload.id}`,description:e.item.payload.title??e.item.payload.id.slice(0,8)}))}),n.plugins.registerArgumentSuggester(`status`,(e,t=20)=>X([`cache`,`diagnose`,`services`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:t}).map(e=>({name:e.item.payload}))),n.plugins.registerArgumentSuggester(`preference`,(e,t=20)=>X([`general`,`lang`,`theme`,`keybindings`,`shortcuts`,`proxy`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:t}).map(e=>({name:e.item.payload}))),n.plugins.registerArgumentSuggester(`extension`,(e,n=20)=>{let r=e.toLowerCase();if(r.startsWith(`trust plugin `)){let r=e.slice(13);return X(pe({cwd:t.workspaceDir??process.cwd(),homedir:K()}).map(e=>({text:e.id,aliases:[],payload:e})),r,{maxResults:n}).map(e=>({name:`trust plugin ${e.item.payload.id}`,description:e.item.payload.scope}))}if(r.startsWith(`trust `)){let t=e.slice(6);return X([`status`,`trust`,`untrust`,`plugin`].map(e=>({text:e,aliases:[],payload:e})),t,{maxResults:n}).map(e=>({name:`trust ${e.item.payload}`}))}if(r.startsWith(`registry `)){let t=e.slice(9);return X([`list`,`add`,`remove`].map(e=>({text:e,aliases:[],payload:e})),t,{maxResults:n}).map(e=>({name:`registry ${e.item.payload}`}))}return X([`trust`,`install`,`registry`,`search`,`update`,`reload`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload}))}),n.plugins.registerArgumentSuggester(`registry`,(e,n=20)=>{let r=e.toLowerCase().startsWith(`remove `)?e.slice(7):e;return r===e?X([`list`,`add`,`remove`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload})):X(he(t).listSources().filter(e=>!e.builtin).map(e=>({text:e.name,aliases:[e.url],payload:e})),r,{maxResults:n}).map(e=>({name:`remove ${e.item.payload.name}`,description:e.item.payload.url}))}),n.plugins.registerArgumentSuggester(`trust`,(e,n=20)=>{let r=e.toLowerCase().startsWith(`plugin `)?e.slice(7):e;return r===e?X([`status`,`trust`,`untrust`,`plugin`].map(e=>({text:e,aliases:[],payload:e})),e,{maxResults:n}).map(e=>({name:e.item.payload})):X(pe({cwd:t.workspaceDir??process.cwd(),homedir:K()}).map(e=>({text:e.id,aliases:[],payload:e})),r,{maxResults:n}).map(e=>({name:`plugin ${e.item.payload.id}`,description:e.item.payload.scope}))})}function qn(e){let t=e[e.length-1];if(t?.type===`message`&&t.message?.role===`user`)return{parentId:t.parentId}}function Jn(e,t){!t||!t.newer||(e.stores.tasks.setUpdateAvailable(t),t.forced?(e.info.pushNotification(Q.t(`cmd.titleUpdate`),Q.t(`cmd.updateNotifForced`,{latest:t.latest,current:t.current}),`version`,`error`),e.stores.tasks.setForcedUpgrade(Q.t(`cmd.updateForcedBanner`,{latest:t.latest,current:t.current})),e.stores.notification.setPulseSurvey(null)):(e.info.pushNotification(Q.t(`cmd.titleUpdate`),Q.t(`cmd.updateNotifAvailable`,{latest:t.latest,current:t.current}),`version`,`info`),e.info.showToast(Q.t(`cmd.titleUpdate`),Q.t(`cmd.updateToast`,{latest:t.latest}))))}async function Yn(e){let{tui:t,options:n,app:r,session:i,projState:a,resumedNote:o,resumed:s,updateCheckPromise:c,bg:l,events:u}=e;if(o&&m({resumedNote:o,isFound:!!s,session:i,projState:a,tui:t}),n.resumePrompt&&s)if(r.memoryGovernor.sample().level===`critical`)t.info.showToast(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureResumeAbortedMessage`));else{let e=qn(i.session.branchEntries());e&&(e.parentId&&i.session.branch(e.parentId),i.prompt(n.resumePrompt).catch(e=>{r.logger.warn({err:e instanceof Error?e.message:String(e)},`[memory-governor] auto-resume prompt failed`),t.info.showToast(Q.t(`cmd.titleError`),Q.t(`cmd.memoryPressureResumeFailedMessage`))}))}c.then(e=>Jn(t,e)),l.setBgUnsubs(u.bgUnsubs),u.attachSessionHandler(),Xn(t,r)}function Xn(e,t){F(n=>{if(n.status!==`needs-input`)return;let r=n.id.slice(0,8),i=t.listSessions().find(e=>e.id===n.id)?.title??r;e.info.pushNotification(`session needs input`,`Background session '${i}' (${r}) requires your input (/resume ${r})`,`system`,`warning`)}),t.hookRegistry.on(`session.deleted`,`rfc234-background-cleanup`,e=>{p(e.sessionId)})}function Zn(e){let{app:t,session:n,options:r,tui:i,memoryConflictRef:a,turn:o,stopController:s,runAsyncBashRef:c,handleAbortInterceptRef:l,runMemoryCaptureRef:u,schedulePollIntervalRef:d,scheduleServiceRef:f}=e;a&&(a.current=(e,t)=>{i.info.showToast(`Memory Conflict`,`Concurrent edit detected for ${e} — saved to ${t}`)}),He(`startTui() ready (first frame mounted)`),t.setUserAskRenderer(e=>Bn(i,e));let p=Hn({gateway:()=>t.sessionManager.panelState,bridge:()=>i.pending,onError:(e,n)=>{t.logger?.debug?.({stage:e,error:n},`paste cache binding failed (non-fatal)`)}});Wn({app:t,tui:i}),Un(t),t.listAllSessions().then(e=>{let t=n.id,r=e.filter(e=>e.status!==`archived`&&(e.entryCount??e.messageCount)>0&&e.id!==t).slice(0,10).map(e=>({id:e.id,title:e.title??e.id.slice(0,8),status:e.id===t?`busy`:`idle-cold`,lastActivityAt:e.updatedAt?new Date(e.updatedAt).toLocaleString():``,isCurrent:e.id===t,isPinned:e.pinned??!1,isArchived:e.status===`archived`,isReadOnly:e.writeLocked??!1}));i.stores.tasks.setSessionList(r)}).catch(()=>{});let{pollInterval:m,scheduler:h}=_e(t,{sessionRef:{get value(){return n}},tui:i,remoteConfig:r.sessionUrl&&r.sessionToken?{sessionUrl:r.sessionUrl,sessionToken:r.sessionToken}:void 0});d.current=m,f.current=h;{let e=t.feedbackRegistry.get();e&&import(`./feedback-backend-methods-C2SzcIzm.js`).then(({createFeedbackBackendHandler:r})=>{let i=r(e,{workspaceDir:t.workspaceDir,getModelId:()=>n.model?.id});t.panelBackendController.registerInProcessBackend(`plugin-feedback`,i.call)})}return c.current=An({tui:i,app:t,submitState:o}),l.current=jn({agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},tui:i,requestStop:e=>s.requestStop(e)}),u.current=Mn({app:t,tui:i}),Gn({app:t,tui:i,session:n}),Kn({app:t,tui:i,getScheduler:()=>h}),{pasteBinder:p}}const Qn=[`approaching`,`nearing`,`critical`],$n={maxReminders:{approaching:1,nearing:3,critical:1},backoffBaseTurns:4,resetMarginPct:10,approachingMarginPct:10};function $(){return{count:0,lastRemindedTurn:void 0,peakPct:0,active:!1}}function er(e,t,n,r){return e>=n?`critical`:e>=t?`nearing`:e>=t-r?`approaching`:null}function tr(e,t,n,r){return e===`critical`?n:e===`nearing`?t:t-r}function nr(e,t){return t<=1?0:e.backoffBaseTurns*2**(t-2)}var rr=class{config;zones;suppressed=!1;constructor(e={}){this.config={...$n,...e},this.zones={approaching:$(),nearing:$(),critical:$()}}check(e){if(this.suppressed)return null;let{contextPercent:t,pruneLinePct:n,compactLinePct:r,currentTurn:i}=e,a=er(t,n,r,this.config.approachingMarginPct);for(let e of Qn)e!==a&&this.zones[e].active&&t<tr(e,n,r,this.config.approachingMarginPct)-this.config.resetMarginPct&&(this.zones[e]=$());if(a===null)return null;let o=this.zones[a];o.lastRemindedTurn!==void 0&&i<o.lastRemindedTurn&&(this.zones[a]=$());let s=this.zones[a];s.active=!0,s.peakPct=Math.max(s.peakPct,t);let c=this.config.maxReminders[a];if(s.count>=c)return null;let l=s.count+1;if(s.lastRemindedTurn!==void 0){let e=nr(this.config,l);if(i-s.lastRemindedTurn<e)return null}return s.count=l,s.lastRemindedTurn=i,{zone:a,pct:Math.round(t)}}onCompacted(){this.zones={approaching:$(),nearing:$(),critical:$()}}suppress(){this.suppressed=!0}snapshot(){return{approaching:{count:this.zones.approaching.count,lastTurn:this.zones.approaching.lastRemindedTurn},nearing:{count:this.zones.nearing.count,lastTurn:this.zones.nearing.lastRemindedTurn},critical:{count:this.zones.critical.count,lastTurn:this.zones.critical.lastRemindedTurn}}}};function ir(e){let{getSession:t,app:n,tui:r,projState:i,contextWindow:a,currentModelId:o}=e,s,c=new rr,l={approaching:e=>Q.t(`cmd.contextPressureApproaching`,{pct:e}),nearing:e=>Q.t(`cmd.contextPressureNearing`,{pct:e}),critical:e=>Q.t(`cmd.contextPressureCritical`,{pct:e})},u=()=>{let e=t(),n=e.session.messages(),r=0,i=0,a=0,o=0,s=!1,c=0,l=0;for(let e=n.length-1;e>=0;e--){let t=n[e]?.usage;t&&(s||=(r=t.inputTokens??0,i=t.outputTokens??0,a=t.cacheReadTokens??0,o=t.cacheWriteTokens??0,!0),n[e]?.role===`assistant`&&(c+=t.inputTokens??0,l+=t.outputTokens??0))}return{sessionId:e.session.id,lastIn:r,lastOut:i,lastCacheRead:a,lastCacheWrite:o,totIn:c,totOut:l,messageCount:n.length}},d=(e,d)=>{let f=e!==void 0,p=f&&s&&s.sessionId===t().session.id?s:u();s=p;let m=d?d.before:1,h=d?d.after/m:1,g=e=>h<1?Math.round(e*h):e,_=n.modelRegistry.find(o.value??``)?.cost,v=_?p.totIn*(_.input??0)+p.totOut*(_.output??0):0,y=T({systemPrompt:t().systemPrompt,tools:t().tools,lastIn:g(p.lastIn),lastOut:g(p.lastOut),lastCacheRead:g(p.lastCacheRead),lastCacheWrite:g(p.lastCacheWrite),contextWindow:a.value,modelName:t().model?.name??``,totIn:p.totIn,totOut:p.totOut,cost:v>0?v:void 0,messageCount:p.messageCount,streamingOutputTokens:e});if(r.stores.budget.setBudget(y),r.stores.context.setBudget(y),!f&&y.contextWindow>0){let e=y.pruneLine/y.contextWindow*100,t=y.compactLine/y.contextWindow*100,n=c.check({contextPercent:y.contextPercent,pruneLinePct:e,compactLinePct:t,currentTurn:i.currentTurn});n&&r.info.pushNotification(Q.t(`cmd.titleContextPressure`),l[n.zone](n.pct),`system`,n.zone===`critical`?`warning`:`info`)}},f=()=>{try{t().session.setEditedFiles(r.messages.getEditedFiles().map(e=>({path:e.path,operation:e.operation,addedLines:e.addedLines,removedLines:e.removedLines,timestamp:e.timestamp,toolCallId:e.toolCallId}))),n.sessionManager.save(t().id).catch(()=>{})}catch(e){console.error(`\x1b[90m\x1b[2m[persist] editedFiles skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}};return{recomputeBudget:d,persistEditedFiles:f,persistSubagents:()=>{try{let e=[...r.plugins.getSubagents().values()].map(e=>({id:e.id,name:e.command||e.id,status:St(e),startedAt:e.startedAt}));t().session.setSubagents(e),n.sessionManager.save(t().id).catch(()=>{})}catch(e){console.error(`\x1b[90m\x1b[2m[persist] subagents skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}},persistTurnCount:()=>{try{t().session.setTurnCount(i.currentTurn)}catch(e){console.error(`\x1b[90m\x1b[2m[persist] turnCount skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}},editFileCallback:e=>{try{r.stores.tasks.addEditedFile({path:e.path,operation:e.operation,oldContent:e.oldContent,newContent:e.newContent,addedLines:e.addedLines,removedLines:e.removedLines,timestamp:e.timestamp,toolCallId:e.toolCallId})}catch(e){console.error(`\x1b[90m\x1b[2m[panel] addEditedFile skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}f()},onContextCompacted:()=>{c.onCompacted()}}}function ar(e){let{tui:t,app:r,themeRegistry:i,runtime:a,sessionRef:o,interactiveRef:s,modelReadyRef:c,projState:l,agentProcessingRef:u,modelsRef:d,availableModelIds:f,applyModel:p,persistAvailable:m,refreshModelsNow:h,refreshSlashCommands:_,events:v,redState:y,agentMessagesToChatMessages:b,PROVIDER_DISPLAY_NAMES:x,apiCredentialId:S,onContextCompacted:C}=e;return{tui:t,app:r,state:{get session(){return o.value},set session(e){o.value=e},get interactive(){return s.value},set interactive(e){s.value=e},get reg(){return a.regRef.value},set reg(e){a.regRef.value=e},get slashCommands(){return a.slashCommandsRef.value},set slashCommands(e){a.slashCommandsRef.value=e},get modelReady(){return c.value},set modelReady(e){c.value=e},get currentModelId(){return a.currentModelIdRef.value},set currentModelId(e){a.currentModelIdRef.value=e},get currentLang(){return a.currentLangRef.value},set currentLang(e){a.currentLangRef.value=e},get todoList(){return l.todoList},set todoList(e){l.todoList=e},get agentProcessing(){return u.value},set agentProcessing(e){u.value=e},get models(){return d.value},set models(e){d.value=e},get availableModelIds(){return f},get restartRequested(){return a.restartRequestedRef.value},set restartRequested(e){a.restartRequestedRef.value=!!e},themeRegistry:i},callbacks:{applyModel:p,persistAvailable:m,refreshModelsNow:h,registerAllTuiCommands:()=>{qt(a.regRef.value)},refreshSlashCommands:_,attachSessionHandler:()=>v.attachSessionHandler(),restoreSwitchedSession:()=>{l.delegated.clear(),l.todoList=[],l.currentTurn=0,Object.assign(y,n()),t.stores.tasks.setTasks([],void 0),t.panes.clearEditedFiles(),t.plugins.clearSubagents(),g({session:o.value,projState:l,tui:t}),C()},resetCurrentTurn:()=>{l.currentTurn=0},onContextCompacted:C,sessionUnsub:()=>v.getSessionUnsub(),getLastProviderUsage:()=>v.getLastProviderUsage(),isWriteLeaseReadOnly:()=>v.isWriteLeaseReadOnly(),isRunPaused:()=>v.isRunPaused(),agentMessagesToChatMessages:b,PROVIDER_DISPLAY_NAMES:x,apiCredentialId:S}}}function or(e){let{session:t,tui:n,retryAccelerate:r,setRateLimitInfo:i,abortNow:a}=e;t.coreAgent.on(`stream.retry`,({attempt:e,maxRetries:t,delayMs:i,reason:o})=>{n.engine.showRetryDialog(e,t,i,r,()=>{n.engine.clearRetryDialog()},o,()=>{a()})}),t.coreAgent.on(`rate.limit.exhausted`,({limitType:e,resetsAt:t})=>{n.engine.clearRetryDialog(),i({limitType:e,resetsAt:t})}),t.coreAgent.on(`lifecycle.tool.completed.crossBoundary`,({toolName:e,result:t})=>{let r=Q.t(`cmd.titleBackgroundTask`),i=t.isError?Q.t(`cmd.lifecycleCrossBoundaryFailed`,{toolName:e}):Q.t(`cmd.lifecycleCrossBoundaryDone`,{toolName:e});n.info.showToast(r,i)})}function sr(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isFinite(r)&&r>0?r:t}function cr(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isFinite(r)&&r>0&&Number.isInteger(r)?r:t}function lr(e){let{app:t,tui:n,getSession:r,setRestartResumePrompt:i,setRestartMemoryTriggered:a,handleExit:o,onContextCompacted:s,recomputeBudget:c}=e,l=!1,u=0,d,f=!1,p=0,m=!1,h=sr(`OTTO_MEMORY_CRITICAL_NOTIFY_INTERVAL_MS`,18e5),g=cr(`OTTO_MEMORY_CRITICAL_NOTIFY_ESCALATION_CYCLES`,4),_,v=()=>{let e=r();if(e.isBusy){let t=e.session.messages(),n=t[t.length-1];if(n?.role===`user`&&!n.internal){let e=C(n.content);e&&i(e)}}a(!0),o({type:`exit`,restart:!0})},y=()=>{_&&=(clearInterval(_),void 0),p=0,m=!1};t.memoryGovernor.setCallbacks({onWarning:()=>{r().compactNow().then(e=>{e.compacted&&(n.info.showToast(Q.t(`cmd.titleAutoCompact`),Q.t(`compact.edResult`,{before:e.before,after:e.after})),s(),c())}).catch(e=>{let r=e instanceof Error?e.message:String(e);t.logger.warn({err:r},`[memory-governor] compactNow (soft degrade) failed`),n.info.showToast(Q.t(`cmd.titleAutoCompact`),Q.t(`cmd.autoCompactFailed`,{msg:r}))})},onCritical:e=>{if(l){n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`info`);return}n.info.isFullScreenPaneActive()&&(u++,d??=Date.now(),u<3&&Date.now()-d<300*1e3)||(u=0,f=!0,n.modal.openModal({kind:`confirm`,title:Q.t(`cmd.titleMemoryPressure`),message:Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),confirmLabel:Q.t(`cmd.memoryPressureRestartNow`),cancelLabel:Q.t(`cmd.memoryPressureRemindLater`),confirmColor:`amber`,extraLabel:Q.t(`cmd.memoryPressureSuppress`),onConfirm:()=>{f=!1,y(),v()},onCancel:()=>{f=!1},onExtra:()=>{f=!1,l=!0}}))},onCriticalDuringGrace:e=>{n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`warning`)},onCriticalTimeout:e=>{if(f){f=!1,v();return}let i=()=>{p++,n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:t.memoryGovernor.sample().usedPct.toFixed(0)}),`system`,`warning`),!m&&p>=g&&(m=!0,r().compactNow().catch(e=>{let n=e instanceof Error?e.message:String(e);t.logger.warn({err:n},`[memory-governor] critical-unattended-escalation compactNow failed`)}),t.storage.traceStore?.append(r().id,{ts:Date.now(),sessionId:r().id,kind:`lifecycle`,node:`critical-unattended-escalation`,payload:{usedPct:e.usedPct,cycles:p}}).catch(e=>{t.logger.warn({err:e instanceof Error?e.message:String(e)},`[memory-governor] critical-unattended-escalation trace append failed`)}))};_||(i(),_=setInterval(i,h),_.unref?.())},onLevelChange:e=>{e!==`critical`&&(u=0,d=void 0,y()),n.engine.pushEngineEvent({kind:`perf`,indicatorLevel:e,memory:t.memoryGovernor.sample()})}}),t.fleetMonitor.setCallbacks({onBudgetExceeded:e=>{n.info.pushNotification(Q.t(`cmd.titleFleetBudget`),Q.t(`cmd.fleetBudgetExceeded`,{processCount:e.processCount,totalRssMb:e.totalRssMb}),`system`,`warning`)}})}function ur(e){let t=e??rt(import.meta.url);t=et(t);let n=t===`/`?t:`/`;for(;t!==n;){try{if(nt(t+`/.git`))return t}catch{}t=et(t)}try{if(nt(n+`/.git`))return n}catch{}}var dr=class{repoRoot;currentBuildId;checkIntervalMs;onStale;logger;lastNotifiedBuildId=void 0;disposed=!1;timer;activeChild;constructor(e){this.repoRoot=e.repoRoot,this.currentBuildId=e.currentBuildId,this.checkIntervalMs=e.checkIntervalMs??6e5,this.onStale=e.onStale,this.logger=e.logger}start(){this.disposed||this.scheduleNext()}dispose(){if(this.disposed=!0,this.timer&&=(clearTimeout(this.timer),void 0),this.activeChild){try{this.activeChild.kill()}catch{}this.activeChild=void 0}this.lastNotifiedBuildId=void 0}scheduleNext(){this.disposed||(this.timer=setTimeout(()=>{this.timer=void 0,this.performCheck().then(()=>{this.scheduleNext()})},this.checkIntervalMs),this.timer.unref())}performCheck(){return new Promise(e=>{if(this.disposed){e();return}let t=ve(`git`,[`rev-list`,`--count`,`HEAD`],{cwd:this.repoRoot,timeout:5e3},(t,n)=>{if(this.activeChild=void 0,t){this.logger?.warn({err:t instanceof Error?t.message:String(t)},`[stale-build-detector] git rev-list failed`),e();return}let r=n.trim(),i=parseInt(r,10);if(!Number.isFinite(i)){this.logger?.warn({raw:r},`[stale-build-detector] failed to parse git output as number`),e();return}if(i>this.currentBuildId&&i!==this.lastNotifiedBuildId){this.lastNotifiedBuildId=i;try{this.onStale?.(i)}catch(e){this.logger?.warn({err:e instanceof Error?e.message:String(e)},`[stale-build-detector] onStale callback threw`)}}e()});this.activeChild=t,t.on(`error`,()=>{this.activeChild=void 0})})}};async function fr(e){let{runtime:t,app:n,options:r,tui:i,tuiRef:a,turn:o,projState:l,redState:u,stopController:d,themeRegistry:f,availableModelIds:p,applyModel:m,refreshSlashCommands:h,retryAccelerate:g,startupCrashGapRef:_,resumedNote:v,resumed:y,updateCheckPromise:b,bg:x,ftueController:S,refreshModelsNow:C,persistAvailable:w,cfgLang:T,sessionRef:E,interactiveRef:D,modelReadyRef:O,modelsRef:j,pasteBinder:M}=e;t.handleExitRef.current=e=>{d.requestStop(e.restart?`exit-restart`:`exit`)},r.memoryRestartGrace&&n.memoryGovernor.markRestarted();let N=r.restartGeneration??0;N>=3&&i.info.pushNotification(Q.t(`cmd.titleFleetBudget`),Q.t(`cmd.restartChainDeep`,{generation:N}),`system`,`warning`),i.engine.pushEngineEvent({kind:`perf`,indicatorLevel:n.memoryGovernor.currentLevel,memory:n.memoryGovernor.sample()}),or({session:E.value,tui:i,retryAccelerate:g,setRateLimitInfo:e=>{o.lastRateLimitInfo=e},abortNow:()=>{d.abortNow()}});let P=ir({getSession:()=>E.value,app:n,tui:i,projState:l,contextWindow:t.contextWindowRef,currentModelId:t.currentModelIdRef}),{recomputeBudget:F,persistEditedFiles:I,persistSubagents:L,persistTurnCount:R,onContextCompacted:z}=P;t.pushBudgetNowRef.value=F,F(),n.editFileCallback=P.editFileCallback,lr({app:n,tui:i,getSession:()=>E.value,setRestartResumePrompt:e=>{t.restartResumePromptRef.value=e},setRestartMemoryTriggered:e=>{t.restartMemoryTriggeredRef.value=e},handleExit:t.handleExitRef.current,onContextCompacted:z,recomputeBudget:F}),n.registerInAppNotificationChannel((e,t,n)=>i.info.pushNotification(e,t,`system`,ee(n))),n.setFollowUpPendingProbe(()=>i.engine.hasQueuedFollowUp());let V=Vn({getSession:()=>E.value,app:n,tui:i,projState:l,redState:u,recomputeBudget:F,persistEditedFiles:I,persistSubagents:L,persistTurnCount:R,onContextCompacted:z,markStreamed:()=>{o.streamedText=!0}});t.eventsRef.value=V,t.cliCtxRef.current=ar({runtime:t,tui:i,app:n,themeRegistry:f,sessionRef:E,interactiveRef:D,modelReadyRef:O,projState:l,agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},modelsRef:j,availableModelIds:p,applyModel:m,persistAvailable:w,refreshModelsNow:C,refreshSlashCommands:h,events:V,redState:u,agentMessagesToChatMessages:c,PROVIDER_DISPLAY_NAMES:s,apiCredentialId:xe,onContextCompacted:z}),t.cliCtxRef.current.callbacks.pasteBinder=M,M.load(E.value.id),i.plugins.setPluginRegistrations(n.getPluginRegistrations());let H=await S.refresh();if(a.value?.stores.tasks.setFtueStage(H.stage),k(H)&&T===`auto`&&!n.settings.get(`has_completed_onboarding`)){let e=await i.modal.openModal({kind:`onboarding`,onLanguagePreview:e=>{let n=e===`auto`?A():e;re(n),i.lifecycle.setLanguage(n),t.currentLangRef.value=n}});if(e.nickname&&n.settings.persist({nickname:e.nickname}).catch(()=>{}),e.language){let r=e.language===`auto`?A():e.language;re(r),i.lifecycle.setLanguage(r),t.currentLangRef.value=r,n.settings.persist({language:e.language}).catch(()=>{})}n.settings.persist({has_completed_onboarding:!0}).catch(()=>{})}H.recommendation.autoOpen&&B(`setup`,[],t.cliCtxRef.current);let U=ur();U&&(t.staleBuildDetectorRef.current=new dr({repoRoot:U,currentBuildId:Ke,logger:n.logger,onStale:e=>{i.info.pushNotification(Q.t(`cmd.titleStaleBuild`),Q.t(`cmd.staleBuildMessage`,{current:Ke,latest:e}),`system`,`info`)}}),t.staleBuildDetectorRef.current.start()),await Yn({tui:i,options:r,app:n,session:E.value,projState:l,resumedNote:v,resumed:y??void 0,updateCheckPromise:b,bg:x,events:V}),_.value&&i.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:_.value.lostTurns}))}var pr=class{#e=!1;#t=!1;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y;#b;get tui(){return this.#b}set tui(e){this.#b=e}get tuiRef(){let e=this;return{get value(){return e.#b},set value(t){e.#b=t}}}get contextWindow(){return this.#r??0}set contextWindow(e){this.#r=e}get currentModelId(){return this.#i}set currentModelId(e){this.#i=e}get pushBudgetNow(){return this.#a}get contextWindowRef(){let e=this;return{get value(){return e.#r??0},set value(t){e.#r=t}}}get currentModelIdRef(){let e=this;return{get value(){return e.#i},set value(t){e.#i=t}}}get pushBudgetNowRef(){let e=this;return{get value(){return e.#a},set value(t){e.#a=t}}}get reg(){return this.#o}set reg(e){this.#o=e}get slashCommands(){return this.#s}set slashCommands(e){this.#s=e}get currentLang(){return this.#c}set currentLang(e){this.#c=e}get regRef(){let e=this;return{get value(){return e.#o},set value(t){e.#o=t}}}get slashCommandsRef(){let e=this;return{get value(){return e.#s},set value(t){e.#s=t}}}get currentLangRef(){let e=this;return{get value(){return e.#c},set value(t){e.#c=t}}}get restartRequested(){return this.#e}get restartMemoryTriggered(){return this.#t}get restartResumePrompt(){return this.#n}get restartRequestedRef(){let e=this;return{get value(){return e.#e},set value(t){e.#e=!!t}}}get restartMemoryTriggeredRef(){let e=this;return{get value(){return e.#t},set value(t){e.#t=t}}}get restartResumePromptRef(){let e=this;return{get value(){return e.#n},set value(t){e.#n=t}}}get exitSessionRef(){let e=this;return{get value(){return e.#l},set value(t){e.#l=t}}}get providerAuthRef(){let e=this;return{get current(){return e.#u},set current(t){e.#u=t}}}get staleBuildDetectorRef(){let e=this;return{get current(){return e.#d},set current(t){e.#d=t}}}get schedulePollIntervalRef(){let e=this;return{get current(){return e.#f},set current(t){e.#f=t}}}get scheduleServiceRef(){let e=this;return{get current(){return e.#p},set current(t){e.#p=t}}}get runAsyncBashRef(){let e=this;return{get current(){return e.#m},set current(t){e.#m=t}}}get handleAbortInterceptRef(){let e=this;return{get current(){return e.#h},set current(t){e.#h=t}}}get runMemoryCaptureRef(){let e=this;return{get current(){return e.#g},set current(t){e.#g=t}}}get cliCtxRef(){let e=this;return{get current(){return e.#_},set current(t){e.#_=t}}}get handleExitRef(){let e=this;return{get current(){return e.#v},set current(t){e.#v=t}}}get eventsRef(){let e=this;return{get value(){return e.#y},set value(t){e.#y=t}}}dispose(){try{this.#f!==void 0&&clearInterval(this.#f)}catch{}try{this.#p&&this.#p.stop()}catch{}try{this.#d?.dispose()}catch{}this.#f=void 0,this.#d=void 0}};async function mr(t,r,i){let a=new pr,o;try{let s=await pn(r,{continueSession:t.continueSession,model:t.model,sessionUrl:t.sessionUrl}),c=s.SETUP_PLACEHOLDER_ID,l=s.session,u=s.startupCrashGapRef,d=s.resumedNote,f=s.modelReadyRef,p=f.value,m=s.ftueController,h=s.refreshModelsNow,g=s.modelRefreshState,_=g.availableModelIds,v=s.persistAvailable,y=g.models,x=s.continuedExisting,S=s.retryAccelerate,C=s.resumed,ee=s.convoCount,T=a.tuiRef,O=T,k=p?l.model?.id:void 0;a.contextWindow=r.modelRegistry.getAll().filter(e=>e.id!==c).find(e=>e.id===k)?.contextWindow??0;let j=a.contextWindowRef;a.currentModelId=k;let M=a.currentModelIdRef,N=e=>H(r,e,l.thinkingLevel),P=a.pushBudgetNowRef,F=a.exitSessionRef,I=a.providerAuthRef,L={value:t},R=e=>{switch(e.kind){case`steer`:l.steer(e.input);break;case`abort`:W.abort();break;case`pauseAfterTurn`:l.pauseRun();break;case`resumeRun`:l.resumeRun();break}},B=oe({modelReady:f,currentModelId:M,contextWindow:j,tuiRef:T,pushBudgetNow:P,app:r,getSession:()=>l,options:L,fmtDisplayModel:N,onEngineModelAction:R}),V=b({getSession:()=>l,app:r,tuiRef:T,options:L,fmtDisplayModel:N,applyModel:B,onExitSession:()=>F.value?.(),onLogin:e=>I.current?.(e)}),W=new z(l,{models:y,currentModel:k,onModelChange:B}),{startTui:te}=await import(`@x-otto/tui`);a.reg=W.getRegistry(),qt(a.reg),Jt(a.reg,r);let ie=w(a.reg,r),G={agentProcessing:!1,ctrlCCount:0,lastCtrlCTime:0,userAborted:!1,shellChild:null,streamedText:!1,retryMode:!1,errorRetryAttempt:0,lastRateLimitInfo:void 0,latestSubmittedPrompt:void 0},ce=()=>Ht(l.isBusy,G.agentProcessing);a.slashCommands=Kt(a.reg,G.agentProcessing,U,Q.t(`cmdDesc`,{returnObjects:!0}),l.pinned,l.isPaused);let ue=()=>(a.slashCommands=Kt(a.reg,G.agentProcessing,U,Q.t(`cmdDesc`,{returnObjects:!0}),l.pinned,l.isPaused),a.slashCommands);D(r),se(r,_),ae(r),E(r);let de=Nt(),fe=r.settings.get(`language`)??`auto`;a.currentLang=fe===`auto`?A():fe;let pe=$t(r),me=r.settings.get(`theme_preset`),he=r.settings.get(`keybinding_overrides`);re(a.currentLang);let ge=e({currentVersion:le(),lastCheck:r.settings.get(`last_update_check`),autoCheck:r.settings.get(`auto_update_check`)!==!1,persistLastCheck:()=>r.settings.persist({last_update_check:Date.now()})}),_e={get value(){return l},set value(e){l=e}},K={get value(){return W},set value(e){W=e}},ve={get value(){return y},set value(e){y=e}};await new Promise(async e=>{let s=a.schedulePollIntervalRef,c=a.scheduleServiceRef,g=!1,y=()=>{if(!g){g=!0;try{o?.clearBgSubs()}catch{}try{o?.stopBgOutputPoll()}catch{}try{o?.stopBgSubagentPoll()}catch{}a.dispose(),e()}};F.value=y;let b=()=>{setTimeout(y,3e3).unref();try{O.value?.lifecycle.stop()}catch{y()}},w=tn({getTui:()=>O.value??null,getSession:()=>l,dispatchAbort:()=>R({kind:`abort`}),clearTodoLayers:()=>{de.todoList.length!==0&&(de.todoList=[],O.value?.stores.tasks.setTasks([]),l.session.setTodoList([]))},markUserAborted:()=>{G.userAborted=!0},resetCtrlCCount:()=>{G.ctrlCCount=0},markRestartRequested:()=>{a.restartRequestedRef.value=!0},stopTui:b,isBusy:()=>ce()}),E=ne,{historyStore:D,inputHistory:A,externalHistoryCommands:j}=await dn(l,r.settings.get(`history`)?.external),M=Yt({app:r,session:l,getTui:()=>H});o=M;let P=a.runAsyncBashRef,I=a.handleAbortInterceptRef,L=a.runMemoryCaptureRef,z=n(),H=await te(await Ln({runtime:a,app:r,session:l,options:t,tuiRefBox:T,tuiRef:O,turn:G,projState:de,redState:z,isBusyNow:ce,dispatchToEngine:R,stopController:w,finishInteractive:y,stopTuiGuarded:b,applyModel:B,ensureModelUsableForPrompt:V,refreshSlashCommands:ue,fileCommands:ie,modelReady:p,availableModelIds:_,currentModel:k,fmtDisplayModel:N,cfgLang:fe,themeRegistry:pe,presetSelection:me,keybindingOverrides:he,continuedExisting:x,convoCount:ee,historyStore:D,inputHistory:A,externalHistoryCommands:j,bg:M,bgController:o,interactive:W,allCommandNames:E}));T.value=H;let{pasteBinder:U}=Zn({app:r,session:l,options:t,tui:H,memoryConflictRef:i,turn:G,stopController:w,runAsyncBashRef:P,handleAbortInterceptRef:I,runMemoryCaptureRef:L,schedulePollIntervalRef:s,scheduleServiceRef:c});await fr({runtime:a,app:r,options:t,tui:H,tuiRef:O,turn:G,projState:de,redState:z,stopController:w,themeRegistry:pe,availableModelIds:_,applyModel:B,refreshSlashCommands:ue,retryAccelerate:S,startupCrashGapRef:u,resumedNote:d,resumed:C??void 0,updateCheckPromise:ge,bg:M,ftueController:m,refreshModelsNow:h,persistAvailable:v,cfgLang:fe,sessionRef:_e,interactiveRef:K,modelReadyRef:f,modelsRef:ve,pasteBinder:U})});let ye;if(r.codingSessionPool.autoPersist&&l.session.messages().length>0){let e=t.sessionUrl?` --session-url ${t.sessionUrl}`:``,n=t.sessionToken?` --session-token <redacted>`:``;ye=`\n\x1b[2m${Q.t(`cmd.resumeContinueLabel`)}\x1b[0motto --continue ${l.id}${e}${n}\n`}return{restart:a.restartRequested?{sessionId:l.id,memoryTriggered:a.restartMemoryTriggered,resumePrompt:a.restartResumePrompt}:void 0,resumeHint:ye}}finally{o?.clearBgSubs(),o?.stopBgOutputPoll(),o?.stopBgSubagentPoll()}}async function hr(e){if(e.hasParentWorkspace()){let t=e.parentWorkspaceExisted,n=await yt({parentRoot:t.parentRoot,currentRoot:t.currentRoot,language:e.settings.get(`language`)});n===`exit`&&(process.stdout.write(`
|
|
12
12
|
`),process.exit(0)),n===`use_parent`?await e.adoptParentWorkspace():await e.createLocalWorkspace()}let t=Ee(e.workspaceDir,{interactive:!0});if(!t.shouldPrompt){e.needsWorkspaceInit()&&await e.confirmWorkspaceInit();return}let n=await bt({root:t.root,language:e.settings.get(`language`)});if(n===`exit`&&(process.stdout.write(`
|
|
13
|
-
`),process.exit(0)),n===`trust`){Ie(t.root),await e.settings.reload(),e.needsWorkspaceInit()&&await e.confirmWorkspaceInit();return}await e.settings.update({permission_mode:`readonly`}),e.needsWorkspaceInit()&&await e.confirmWorkspaceInit()}function gr(e){throw e instanceof Error&&e.message.startsWith(`No model configured`)?Error("No model configured. Run `otto` (interactive) to complete setup — it walks you through: install a provider plugin → /auth → /model. Or authenticate directly with `otto auth login`."):e}async function _r(e,t){e.prompt&&await
|
|
14
|
-
`)}}function yr(e){xt(e.settings.get(`theme_overrides`)?.markdown)}He(`cli.ts imports resolved`);function br(e){let t=pe({cwd:e,homedir:K()}),n=Ce(t,new Set(de));if(n.length===0)return[];let r=[``,`插件命令:`];for(let e of n){let n=t.find(t=>t.id===e.pluginId),i=n?Te(n).gated:!1,a=e.summary??(e.kind===`passthrough`?`(插件透传命令)`:`(插件进程内命令)`),o=i?`[${e.pluginId}, 未信任]`:`[${e.pluginId}]`,s=` otto ${e.name}`.padEnd(26);r.push(`${s}${a} ${o}`)}return r}async function xr(e,t,n){let r=pe({cwd:n.projectDir,homedir:K()}),i=new Set(de),a=Se(r,i).get(e);if(!a){let t=Oe(r,i,e);return t?(process.stderr.write(`otto: 命令 "${e}" 被多个贡献声明(${t.map(e=>`${e.plugin.id}:${e.kind}`).join(`, `)}),已禁用以避免歧义。\n请重命名其中一个插件的 \`contributes.cli.name\` / \`contributes.cliCommands[].name\` 后重试。\n`),1):void 0}let{plugin:o}=a;if(Te(o).gated)return process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`otto ${e}\` 命令但尚未被信任。\n请先在 TUI 内运行 \`/trust plugin ${o.id}\`(或 \`/extension\` 信任该插件)后重试。\n`),1;if(a.kind===`in-process`){let r=me({logger:{name:`otto-plugin-cli`,level:`error`,destination:`stderr`},workspaceDir:n.projectDir,...n.model?{modelId:n.model}:{},...n.configPath?{projectConfigPath:n.configPath}:{}});try{await r.start();let i=r.pluginCliCommands().find(t=>t.name===e&&t.pluginId===o.id);return i?await Pe(()=>i.handler({args:t,options:{workspaceDir:n.projectDir,...n.model?{model:n.model}:{},...n.configPath?{configPath:n.configPath}:{}},stdout:e=>process.stdout.write(e),stderr:e=>process.stderr.write(e),json:n.json??!1})):(process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`otto ${e}\` 进程内命令但未装载成功。\n可能原因:能力 \`cli.command\` 未授予(先 \`/trust\` 该插件)、handler 缺失或插件编译失败。\n`),1)}catch(e){return process.stderr.write(`otto: 插件 "${o.id}" 的进程内命令执行失败:${e instanceof Error?e.message:String(e)}\n`),1}finally{await r.stop()}}let s=Me(o);if(!s)return process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`contributes.cli\` 但找不到可执行入口,请检查其 manifest 的 bin 字段或重新安装该插件。\n`),1;try{return await Fe(s,t,o.dir)}catch(e){return process.stderr.write(`otto: 插件 "${o.id}" 的 CLI 命令执行失败:${e instanceof Error?e.message:String(e)}\n`),1}}function Sr(e,t){return e.mode===`interactive`&&!e.verbose&&!t?`fatal`:t}function Cr(e,t){return e.mode===`interactive`&&!t?`0`:t}function wr(e,t,n={}){let r=[];for(let t=0;t<e.length;t++){if(e[t]===`--continue`){t++;continue}e[t].startsWith(`--restart-generation=`)||r.push(e[t])}return[...n.execArgv??[],...r,`--continue`,t,...n.generation===void 0?[]:[`--restart-generation=${n.generation}`],...n.sessionUrl?[`--session-url`,n.sessionUrl]:[],...n.sessionToken?[`--session-token`,n.sessionToken]:[],...n.memoryRestartGrace?[`--memory-restart-grace`]:[],...n.resumePrompt?[`--resume-prompt`,n.resumePrompt]:[]]}async function Tr(){process.stdin.on(`error`,e=>{e.code}),ke(),Ae();let{options:e,subCommand:t,subCommandArgs:n,unresolvedCommandName:r,unresolvedCommandArgs:i}=fe(process.argv);e.shadow&&(process.env.OTTO_SHADOW=`1`);let a=e.verbose?`debug`:e.mode===`interactive`?`fatal`:e.quiet?`error`:`info`;Ue(a);let o=Sr(e,process.env.OTTO_LOG_LEVEL);o&&(process.env.OTTO_LOG_LEVEL=o);let s=Cr(e,process.env.OTTO_LOG_STDERR);if(s&&(process.env.OTTO_LOG_STDERR=s),e.mode===`interactive`&&!e.verbose&&(console.warn=()=>{}),process.env.OTTO_LOG_STDERR===`0`?Ze(()=>{}):Ze(e=>process.stderr.write(`${e}\n`)),process.on(`beforeExit`,()=>{process.env.OTTO_LOG_STDERR!==`0`&&Ze(e=>process.stderr.write(`${e}\n`))}),t){let r=ue(t,{args:n,options:e,stdout:e=>process.stdout.write(e),stderr:e=>process.stderr.write(e)});if(r!==void 0)return r}if(r){let t=await xr(r,i??[],{projectDir:e.projectDir,...e.model?{model:e.model}:{},...e.configPath?{configPath:e.configPath}:{},json:e.mode===`json`});if(t!==void 0)return t}if(e.showHelp){let{getHelpLines:t}=await import(`./parse-cli-
|
|
13
|
+
`),process.exit(0)),n===`trust`){Ie(t.root),await e.settings.reload(),e.needsWorkspaceInit()&&await e.confirmWorkspaceInit();return}await e.settings.update({permission_mode:`readonly`}),e.needsWorkspaceInit()&&await e.confirmWorkspaceInit()}function gr(e){throw e instanceof Error&&e.message.startsWith(`No model configured`)?Error("No model configured. Run `otto` (interactive) to complete setup — it walks you through: install a provider plugin → /auth → /model. Or authenticate directly with `otto auth login`."):e}async function _r(e,t){e.prompt&&await P(await t.createSession({listable:!1}).catch(gr),e.prompt,{tui:!0})}async function vr(e,t){if(e.prompt){let n=await W(await t.createSession({listable:!1}).catch(gr),e.prompt);process.stdout.write(JSON.stringify(n,null,2)+`
|
|
14
|
+
`)}}function yr(e){xt(e.settings.get(`theme_overrides`)?.markdown)}He(`cli.ts imports resolved`);function br(e){let t=pe({cwd:e,homedir:K()}),n=Ce(t,new Set(de));if(n.length===0)return[];let r=[``,`插件命令:`];for(let e of n){let n=t.find(t=>t.id===e.pluginId),i=n?Te(n).gated:!1,a=e.summary??(e.kind===`passthrough`?`(插件透传命令)`:`(插件进程内命令)`),o=i?`[${e.pluginId}, 未信任]`:`[${e.pluginId}]`,s=` otto ${e.name}`.padEnd(26);r.push(`${s}${a} ${o}`)}return r}async function xr(e,t,n){let r=pe({cwd:n.projectDir,homedir:K()}),i=new Set(de),a=Se(r,i).get(e);if(!a){let t=Oe(r,i,e);return t?(process.stderr.write(`otto: 命令 "${e}" 被多个贡献声明(${t.map(e=>`${e.plugin.id}:${e.kind}`).join(`, `)}),已禁用以避免歧义。\n请重命名其中一个插件的 \`contributes.cli.name\` / \`contributes.cliCommands[].name\` 后重试。\n`),1):void 0}let{plugin:o}=a;if(Te(o).gated)return process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`otto ${e}\` 命令但尚未被信任。\n请先在 TUI 内运行 \`/trust plugin ${o.id}\`(或 \`/extension\` 信任该插件)后重试。\n`),1;if(a.kind===`in-process`){let r=me({logger:{name:`otto-plugin-cli`,level:`error`,destination:`stderr`},workspaceDir:n.projectDir,...n.model?{modelId:n.model}:{},...n.configPath?{projectConfigPath:n.configPath}:{}});try{await r.start();let i=r.pluginCliCommands().find(t=>t.name===e&&t.pluginId===o.id);return i?await Pe(()=>i.handler({args:t,options:{workspaceDir:n.projectDir,...n.model?{model:n.model}:{},...n.configPath?{configPath:n.configPath}:{}},stdout:e=>process.stdout.write(e),stderr:e=>process.stderr.write(e),json:n.json??!1})):(process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`otto ${e}\` 进程内命令但未装载成功。\n可能原因:能力 \`cli.command\` 未授予(先 \`/trust\` 该插件)、handler 缺失或插件编译失败。\n`),1)}catch(e){return process.stderr.write(`otto: 插件 "${o.id}" 的进程内命令执行失败:${e instanceof Error?e.message:String(e)}\n`),1}finally{await r.stop()}}let s=Me(o);if(!s)return process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`contributes.cli\` 但找不到可执行入口,请检查其 manifest 的 bin 字段或重新安装该插件。\n`),1;try{return await Fe(s,t,o.dir)}catch(e){return process.stderr.write(`otto: 插件 "${o.id}" 的 CLI 命令执行失败:${e instanceof Error?e.message:String(e)}\n`),1}}function Sr(e,t){return e.mode===`interactive`&&!e.verbose&&!t?`fatal`:t}function Cr(e,t){return e.mode===`interactive`&&!t?`0`:t}function wr(e,t,n={}){let r=[];for(let t=0;t<e.length;t++){if(e[t]===`--continue`){t++;continue}e[t].startsWith(`--restart-generation=`)||r.push(e[t])}return[...n.execArgv??[],...r,`--continue`,t,...n.generation===void 0?[]:[`--restart-generation=${n.generation}`],...n.sessionUrl?[`--session-url`,n.sessionUrl]:[],...n.sessionToken?[`--session-token`,n.sessionToken]:[],...n.memoryRestartGrace?[`--memory-restart-grace`]:[],...n.resumePrompt?[`--resume-prompt`,n.resumePrompt]:[]]}async function Tr(){process.stdin.on(`error`,e=>{e.code}),ke(),Ae();let{options:e,subCommand:t,subCommandArgs:n,unresolvedCommandName:r,unresolvedCommandArgs:i}=fe(process.argv);e.shadow&&(process.env.OTTO_SHADOW=`1`);let a=e.verbose?`debug`:e.mode===`interactive`?`fatal`:e.quiet?`error`:`info`;Ue(a);let o=Sr(e,process.env.OTTO_LOG_LEVEL);o&&(process.env.OTTO_LOG_LEVEL=o);let s=Cr(e,process.env.OTTO_LOG_STDERR);if(s&&(process.env.OTTO_LOG_STDERR=s),e.mode===`interactive`&&!e.verbose&&(console.warn=()=>{}),process.env.OTTO_LOG_STDERR===`0`?Ze(()=>{}):Ze(e=>process.stderr.write(`${e}\n`)),process.on(`beforeExit`,()=>{process.env.OTTO_LOG_STDERR!==`0`&&Ze(e=>process.stderr.write(`${e}\n`))}),t){let r=ue(t,{args:n,options:e,stdout:e=>process.stdout.write(e),stderr:e=>process.stderr.write(e)});if(r!==void 0)return r}if(r){let t=await xr(r,i??[],{projectDir:e.projectDir,...e.model?{model:e.model}:{},...e.configPath?{configPath:e.configPath}:{},json:e.mode===`json`});if(t!==void 0)return t}if(e.showHelp){let{getHelpLines:t}=await import(`./parse-cli-C1r2cQ0K.js`).then(e=>e.n),n=t(),r=br(e.projectDir);return process.stdout.write([...n,...r].join(`
|
|
15
15
|
`)+`
|
|
16
16
|
`),0}if(!e.prompt&&e.mode!==`interactive`)return process.stderr.write(`otto: no prompt provided. Use --help for usage.
|
|
17
17
|
`),1;let c=await $e(),l=e.sessionUrl??c?.serviceUrl,u=e.sessionToken??c?.token,d={},f=Ge(`new App() ctor`,()=>me({inspect:e.inspect!==void 0||e.mode===`interactive`,logger:{name:`otto-cli`,level:a,destination:`stderr`},workspaceDir:e.projectDir,workspaceId:e.workspaceId,projectConfigPath:e.configPath,interactive:e.mode===`interactive`,shadow:e.shadow??!1,modelId:e.model,userIdentity:c??void 0,...e.maxToolTurns===void 0?{}:{maxToolTurns:e.maxToolTurns},...e.maxToolTurnExtensions===void 0?{}:{maxToolTurnExtensions:e.maxToolTurnExtensions},...e.promptTokenBudget===void 0?{}:{promptOutputTokenBudget:e.promptTokenBudget},...e.promptTimeBudgetMin===void 0?{}:{promptWallClockBudgetMs:e.promptTimeBudgetMin*6e4},...e.sessionCostBudget===void 0?{}:{sessionCostBudgetUSD:e.sessionCostBudget},...e.noStallDetection?{stallDetection:!1}:e.stallWindowTurns!==void 0&&e.stallRepeatThreshold!==void 0?{stallDetection:{windowTurns:e.stallWindowTurns,repeatThreshold:e.stallRepeatThreshold}}:{},storage:l&&u?{session:{url:l},remote:{getAuth:async()=>({token:u})}}:{session:{dir:Je}},onMemoryConflict:(e,t)=>d.current?.(e,t)}));await We(`app.start()`,()=>f.start()),f.authStore.on(`credential.persist-deferred`,e=>{e.state===`exhausted`&&console.error(`[otto] ⚠️ 凭据变更无法落盘(${e.attempt} 次重试均失败:${e.reason})。\n 本次会话的新凭据只存在于内存中,退出后会丢失。请检查文件锁/磁盘权限后重启。\n (deferred/recovered 档为诊断信息,仅 exhausted 需告警)`)}),yr(f),Re(Le);let p=!1,m=()=>{p&&(e.mode===`interactive`&&Vt(),process.exit(1)),p=!0,Promise.race([f.stop(),new Promise(e=>setTimeout(e,1e4))]).finally(()=>{e.mode===`interactive`&&(Vt(),Bt()),process.exit(1)})};process.on(`SIGTERM`,m),process.on(`SIGHUP`,m);let h,g=!1,_,v;if(e.attachSession){let t=process.env.OTTO_SERVICE_URL??`http://127.0.0.1:${Xe}`,{runAttach:n}=await import(`./run-attach-X35puJ_n.js`);return await n({sessionId:e.attachSession,baseUrl:t,token:process.env.OTTO_SERVICE_TOKEN,forceWriteLease:e.forceWriteLease}),0}try{switch(e.mode){case`print`:await _r(e,f);break;case`json`:await vr(e,f);break;case`interactive`:{await hr(f);let t=await mr(e,f,d);h=t.restart?.sessionId,g=!!t.restart?.memoryTriggered,_=t.restart?.resumePrompt,t.restart||(v=t.resumeHint);break}}}finally{let t=()=>{};process.on(`SIGINT`,t);let n=setTimeout(()=>{e.mode===`interactive`&&(Vt(),Bt()),process.exit(1)},1e4);try{await f.stop()}finally{clearTimeout(n),process.removeListener(`SIGINT`,t)}}if(h){process.removeListener(`SIGTERM`,m),process.removeListener(`SIGHUP`,m);let t=e.sessionUrl,n=e.sessionToken,r=()=>{},i,a=e=>{try{console.error(`\n[otto] 重启陪跑期父进程异常,终止子会话以避免孤儿挂起:${e instanceof Error?e.stack??e.message:String(e)}`)}catch{}try{i?.kill(`SIGTERM`)}catch{}process.exit(1)};return process.on(`SIGINT`,r),process.on(`SIGTERM`,r),process.on(`uncaughtException`,a),process.on(`unhandledRejection`,a),i=ye(process.execPath,wr(process.argv.slice(1),h,{sessionUrl:t,sessionToken:n,memoryRestartGrace:g,resumePrompt:_,execArgv:process.execArgv,generation:(e.restartGeneration??0)+1}),{stdio:`inherit`,env:{...process.env}}),i.on(`exit`,(e,t)=>{process.removeListener(`SIGINT`,r),process.removeListener(`SIGTERM`,r),process.removeListener(`uncaughtException`,a),process.removeListener(`unhandledRejection`,a),process.exit(e??(t?1:0))}),0}if(e.mode===`interactive`){if(Bt(),v)try{process.stdout.write(v)}catch{}process.exit(process.exitCode??0)}return 0}Tr().then(e=>{e!==0&&(process.exitCode=e)}).catch(e=>{process.stderr.write(`otto: ${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{Tr as runCli};
|