@x-otto/cli 0.1.0-alpha.10 → 0.1.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/{auth-command-BdIvuKxx.js → auth-command-BIYtGfZj.js} +2 -2
  2. package/dist/{auth-command-BdIvuKxx.js.map → auth-command-BIYtGfZj.js.map} +1 -1
  3. package/dist/build-id-BPPZeLTA.js +3 -0
  4. package/dist/build-id-BPPZeLTA.js.map +1 -0
  5. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/meta.json +1 -1
  6. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/plugin.cjs +14 -5
  7. package/dist/bundled-extensions/plugin-otto-wire-protocols/src/anthropic-messages.ts +33 -5
  8. package/dist/command-dispatcher-CY-UqqPK.js +18 -0
  9. package/dist/{command-dispatcher-B2Xx3NP7.js.map → command-dispatcher-CY-UqqPK.js.map} +1 -1
  10. package/dist/{create-host-app-iA84KNcI.js → create-host-app-Bzd_kl_-.js} +2 -2
  11. package/dist/{create-host-app-iA84KNcI.js.map → create-host-app-Bzd_kl_-.js.map} +1 -1
  12. package/dist/{doctor-DMj8d4KD.js → doctor-B13q-cRp.js} +2 -2
  13. package/dist/{doctor-DMj8d4KD.js.map → doctor-B13q-cRp.js.map} +1 -1
  14. package/dist/{feedback-YXsFBBvG.js → feedback-BArbGred.js} +10 -10
  15. package/dist/{feedback-YXsFBBvG.js.map → feedback-BArbGred.js.map} +1 -1
  16. package/dist/{feedback-backend-methods-iVB3y7XG.js → feedback-backend-methods-CeQNJ8Tj.js} +2 -2
  17. package/dist/{feedback-backend-methods-iVB3y7XG.js.map → feedback-backend-methods-CeQNJ8Tj.js.map} +1 -1
  18. package/dist/index.js +4 -4
  19. package/dist/{interactive-schedule-DqvuQWjX.js → interactive-schedule-Dpl1p0Az.js} +2 -2
  20. package/dist/{interactive-schedule-DqvuQWjX.js.map → interactive-schedule-Dpl1p0Az.js.map} +1 -1
  21. package/dist/{mcp-server-CZtQjAbW.js → mcp-server-BXOUfN8s.js} +2 -2
  22. package/dist/{mcp-server-CZtQjAbW.js.map → mcp-server-BXOUfN8s.js.map} +1 -1
  23. package/dist/{parse-cli-CSd_QYJj.js → parse-cli-DDVFO0ly.js} +2 -2
  24. package/dist/{parse-cli-CSd_QYJj.js.map → parse-cli-DDVFO0ly.js.map} +1 -1
  25. package/dist/{serve-BIyu4x46.js → serve-DNxv3G-B.js} +2 -2
  26. package/dist/{serve-BIyu4x46.js.map → serve-DNxv3G-B.js.map} +1 -1
  27. package/dist/{version-Bt1T37Md.js → version-DDKeJTLv.js} +2 -2
  28. package/dist/{version-Bt1T37Md.js.map → version-DDKeJTLv.js.map} +1 -1
  29. package/package.json +23 -23
  30. package/dist/build-id-CWNug-3b.js +0 -3
  31. package/dist/build-id-CWNug-3b.js.map +0 -1
  32. package/dist/command-dispatcher-B2Xx3NP7.js +0 -18
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 ee,Z as T,_ as E,a as D,at as O,b as k,c as A,d as j,et as M,f as N,i as P,it as te,j as F,k as I,l as L,m as R,n as ne,nt as z,p as B,q as V,r as H,rt as re,s as U,t as ie,tt as ae,u as W,v as oe,w as se,x as ce,y as le,z as ue}from"./command-dispatcher-B2Xx3NP7.js";import{t as de}from"./version-Bt1T37Md.js";import{i as fe,r as G,t as pe}from"./parse-cli-CSd_QYJj.js";import{t as me}from"./discover-with-bundled-CF8qFP41.js";import{t as he}from"./create-host-app-iA84KNcI.js";import{r as ge}from"./registry-BUvu-es1.js";import{n as _e}from"./proxy-CFZDVIwI.js";import{n as ve}from"./interactive-schedule-DqvuQWjX.js";import{homedir as K}from"node:os";import{execFile as ye,spawn as be}from"node:child_process";import{SANDBOX_ESCALATION_MARKER as xe,apiCredentialId as Se,buildUnifiedCliCommandRegistry as Ce,collectPluginCliCommandsForHelp as we,collectPluginThemePresets as Te,evaluatePluginTrust as Ee,evaluateWorkspaceTrustPrompt as De,expandCommandBody as Oe,findUnifiedCliCommandConflict as ke,globalAgentJobRegistry as q,globalAgentObservability as J,globalProcessRuntime as Y,installEsbuildExitHook as Ae,installEsbuildSignalBridges as je,readTaskOutputTail as Me,resolvePluginCliBin as Ne,resolveSessionTitle as Pe,runInProcessCliCommand as Fe,spawnPluginCli as Ie,trustProject as Le}from"@x-otto/coding";import{globalProcessRuntime as Re,installExitReaper as ze}from"@x-otto/runtime";import{buildAllowedEnv as Be,checkShellCommand as Ve,createLogger as He,markStartupPhase as Ue,rankCandidates as X,setLogLevel as We,traceStartupPhase as Ge,traceStartupPhaseSync as Ke}from"@x-otto/shared";import{BUILD_ID as qe,OTTO_HOME as Je,OTTO_SESSIONS_DIR as Ye,SDK_VERSION as Xe,SERVICE_PORT as Ze,flushEnvWarnings as Qe,isShadowModeEnabled as $e,loadUserIdentity as et}from"@x-otto/env";import{dirname as tt,join as Z,resolve as nt}from"node:path";import{existsSync as rt}from"node:fs";import{fileURLToPath as it}from"node:url";import{BASH_HISTFILE_SOURCE as at,COMPACTING_SENTINEL as ot,FISH_HISTFILE_SOURCE as st,ZSH_HISTFILE_SOURCE as ct,createBuiltinThemeRegistry as lt,entriesToCommands as ut,formatAgentDiagnosticsText as dt,formatTranscriptText as ft,formatTurnTimeline as pt,i18next as Q,isUsingOverage as mt,observationLiveFields as ht,observationRow as gt,parseBashHistory as _t,parseFishHistory as vt,parseZshHistory as yt,promptParentWorkspaceChoice as bt,promptWorkspaceTrust as xt,setMarkdownThemeUserOverrides as St,subagentEntryStatus as Ct}from"@x-otto/tui";import{access as wt,mkdir as Tt,readFile as Et,readdir as Dt,rename as Ot,stat as kt,unlink as At,writeFile as jt}from"node:fs/promises";import{classifyStreamError as Mt,createModelUsabilityGate as Nt}from"@x-otto/ai";import{SESSION_RESUME_WINDOW_MESSAGES as Pt,createProjectorState as Ft,deriveDelegationToolNames as It,projectSessionEvent as Lt,resolveChoiceAnswer as Rt,resolveTextAnswer as zt,sandboxBypassCommand as Bt,shouldShowPulseSurvey as Vt}from"@x-otto/session-contract";function Ht(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 Ut(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 Wt(e,t){return e||t}function Gt(e,t){return e===`pin`&&t?`unpin`:e}function Kt(e,t){return e===`pause`&&t?`continue`:e}function qt(e,t,n){let r=e.list().sort((e,t)=>e.name.localeCompare(t.name)),i=r.map(e=>` /${Gt(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[Gt(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 Jt(e,t,n,r,i=!1,a=!1){return e.list().filter(e=>e.name===`pause`?t||a:!0).map(e=>{let o=Kt(Gt(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 Yt(e){for(let t of P)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 Xt(e,t){for(let n of D(t).values())e.has(n.name)&&e.unregister(n.name),e.register({name:n.name,description:n.description??n.name,aliases:void 0,type:`action`,source:`builtin`,execute:()=>``})}function Zt(e,t){Yt(e),Xt(e,t)}function Qt(e){let{app:t,getTui:n}=e,r=[],i=()=>{for(let e of r)e();r=[]},a,o,s,c,l,u=()=>{a&&=(clearInterval(a),void 0),o&&=(q.retain(o,!1),void 0),l=void 0},d=()=>{s&&=(clearInterval(s),void 0),c&&=(J?.unpin(c),q.get(c)&&q.retain(c,!1),void 0)};return{clearBgSubs:i,stopBgOutputPoll:u,stopBgSubagentPoll:d,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(`
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,a as D,at as O,b as k,c as A,d as j,et as M,f as N,i as P,it as te,j as F,k as I,l as L,m as R,n as ne,nt as z,p as B,q as V,r as H,rt as re,s as U,t as ie,tt as ae,u as W,v as oe,w as se,x as ce,y as le,z as ue}from"./command-dispatcher-CY-UqqPK.js";import{t as de}from"./version-DDKeJTLv.js";import{i as fe,r as G,t as pe}from"./parse-cli-DDVFO0ly.js";import{t as me}from"./discover-with-bundled-CF8qFP41.js";import{t as he}from"./create-host-app-Bzd_kl_-.js";import{r as ge}from"./registry-BUvu-es1.js";import{n as _e}from"./proxy-CFZDVIwI.js";import{n as ve}from"./interactive-schedule-Dpl1p0Az.js";import{homedir as K}from"node:os";import{execFile as ye,spawn as be}from"node:child_process";import{SANDBOX_ESCALATION_MARKER as xe,apiCredentialId as Se,buildUnifiedCliCommandRegistry as Ce,collectPluginCliCommandsForHelp as we,collectPluginThemePresets as Te,evaluatePluginTrust as Ee,evaluateWorkspaceTrustPrompt as De,expandCommandBody as Oe,findUnifiedCliCommandConflict as ke,globalAgentJobRegistry as q,globalAgentObservability as J,globalProcessRuntime as Y,installEsbuildExitHook as Ae,installEsbuildSignalBridges as je,readTaskOutputTail as Me,resolvePluginCliBin as Ne,resolveSessionTitle as Pe,runInProcessCliCommand as Fe,spawnPluginCli as Ie,trustProject as Le}from"@x-otto/coding";import{globalProcessRuntime as Re,installExitReaper as ze}from"@x-otto/runtime";import{buildAllowedEnv as Be,checkShellCommand as Ve,createLogger as He,markStartupPhase as Ue,rankCandidates as X,setLogLevel as We,traceStartupPhase as Ge,traceStartupPhaseSync as Ke}from"@x-otto/shared";import{BUILD_ID as qe,OTTO_HOME as Je,OTTO_SESSIONS_DIR as Ye,SDK_VERSION as Xe,SERVICE_PORT as Ze,flushEnvWarnings as Qe,isShadowModeEnabled as $e,loadUserIdentity as et}from"@x-otto/env";import{dirname as tt,join as Z,resolve as nt}from"node:path";import{existsSync as rt}from"node:fs";import{fileURLToPath as it}from"node:url";import{BASH_HISTFILE_SOURCE as at,COMPACTING_SENTINEL as ot,FISH_HISTFILE_SOURCE as st,ZSH_HISTFILE_SOURCE as ct,createBuiltinThemeRegistry as lt,entriesToCommands as ut,formatAgentDiagnosticsText as dt,formatTranscriptText as ft,formatTurnTimeline as pt,i18next as Q,isUsingOverage as mt,observationLiveFields as ht,observationRow as gt,parseBashHistory as _t,parseFishHistory as vt,parseZshHistory as yt,promptParentWorkspaceChoice as bt,promptWorkspaceTrust as xt,setMarkdownThemeUserOverrides as St,subagentEntryStatus as Ct}from"@x-otto/tui";import{access as wt,mkdir as Tt,readFile as Et,readdir as Dt,rename as Ot,stat as kt,unlink as At,writeFile as jt}from"node:fs/promises";import{classifyStreamError as Mt,createModelUsabilityGate as Nt}from"@x-otto/ai";import{SESSION_RESUME_WINDOW_MESSAGES as Pt,createProjectorState as Ft,deriveDelegationToolNames as It,projectSessionEvent as Lt,resolveChoiceAnswer as Rt,resolveTextAnswer as zt,sandboxBypassCommand as Bt,shouldShowPulseSurvey as Vt}from"@x-otto/session-contract";function Ht(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 Ut(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 Wt(e,t){return e||t}function Gt(e,t){return e===`pin`&&t?`unpin`:e}function Kt(e,t){return e===`pause`&&t?`continue`:e}function qt(e,t,n){let r=e.list().sort((e,t)=>e.name.localeCompare(t.name)),i=r.map(e=>` /${Gt(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[Gt(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 Jt(e,t,n,r,i=!1,a=!1){return e.list().filter(e=>e.name===`pause`?t||a:!0).map(e=>{let o=Kt(Gt(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 Yt(e){for(let t of P)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 Xt(e,t){for(let n of D(t).values())e.has(n.name)&&e.unregister(n.name),e.register({name:n.name,description:n.description??n.name,aliases:void 0,type:`action`,source:`builtin`,execute:()=>``})}function Zt(e,t){Yt(e),Xt(e,t)}function Qt(e){let{app:t,getTui:n}=e,r=[],i=()=>{for(let e of r)e();r=[]},a,o,s,c,l,u=()=>{a&&=(clearInterval(a),void 0),o&&=(q.retain(o,!1),void 0),l=void 0},d=()=>{s&&=(clearInterval(s),void 0),c&&=(J?.unpin(c),q.get(c)&&q.retain(c,!1),void 0)};return{clearBgSubs:i,stopBgOutputPoll:u,stopBgSubagentPoll:d,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!==l&&(l=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:Me(r.outputPath,20),prompt:J.get(e)?.prompt,diff:i}),t!==`running`&&u();return}let i=J.get(e);if(i){let t=x(J.getMessages(e)??[]),r=J.getStreamingText(e),a=ft(t,r),o=Date.now(),s=dt(gt(i),o),c=pt(J.getTurns(e),o),l=[s.length?s.join(`
5
5
  `):``,c.length?c.join(`
6
6
  `):``].filter(Boolean).join(`\n${`─`.repeat(40)}\n\n`),d=i.status===`done`?`exited`:i.status===`error`||i.status===`aborted`?`failed`:`running`;n({id:e,command:`@${i.agentName}`,status:d,text:a,messages:t,streamText:r,responseText:l,prompt:i.prompt}),d!==`running`&&u();return}let a=Y.get(e);if(!a){u(),t.stores.tasks.setBackgroundOutput(null);return}let o=a.status===`running`?`running`:a.status===`exited`?`exited`:`killed`,s=``;if(a.logPath)try{s=(await Et(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`&&u()};u(),q.get(e)&&(q.retain(e,!0),o=e),a=setInterval(()=>{r()},500),r()},onBackgroundOutputClose:()=>{u()},onBackgroundSwitch:e=>{let t=n();d();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?x(n):[],s=J?.getTurns(e),c=J?.getStreamingText(e),l=Date.now(),u={id:e,title:i,messages:o,status:a?.status??`running`,diagnostics:r?dt(gt(r),l):[],timeline:s?pt(s,l):[],streamText:c};t.panes.switchToSubagentContext(u)};J?.pin(e),q.get(e)&&q.retain(e,!0),c=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:()=>{d(),n().panes.switchToSubagentContext(null)}}}}const $t=He(`@x-otto/cli:theme-preset-wiring`);function en(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 tn(e,t){let n=[];for(let r of t)try{n.push(en(e,r))}catch(e){$t.warn({pluginId:r.pluginId,localId:r.localId,err:String(e)},`theme preset registration failed, skipped`)}return n}function nn(e){let t=lt();return tn(t,Te(e.activePlugins())),t}function rn(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 an(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 on=class{entries=[];filePath;constructor(e,t=Z(Je,`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($e())return;let e=JSON.stringify(this.entries,null,2),t=`${this.filePath}.tmp`;try{await Tt(tt(this.filePath),{recursive:!0}),await jt(t,e,`utf-8`),await Ot(t,this.filePath)}catch(e){throw await At(t).catch(()=>{}),e}}async load(){try{let e=await Et(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 sn={[ct]:e=>yt(e),[at]:e=>_t(e),[st]:e=>vt(e)};function cn(){let e=process.env.SHELL??``,t=K(),n=process.env.HISTFILE;return e.includes(`fish`)?[{id:st,path:Z(t,`.local/share/fish/fish_history`)},{id:st,path:Z(t,`.config/fish/fish_history`)}]:e.includes(`bash`)?[{id:at,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.bash_history`)}]:e.includes(`zsh`)||!e?[{id:ct,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.zsh_history`)}]:[]}function ln(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:un(t.path,e)}))}return cn()}function un(e,t){return e.startsWith(`~/`)?Z(t,e.slice(2)):e===`~`?t:e}async function dn(e){try{return await wt(e),!0}catch{return!1}}async function fn(e,t){let n=sn[e.id];if(!n||!await dn(e.path))return[];try{return n(await Et(e.path,`utf8`)).slice(-t)}catch{return[]}}async function pn(e){if(e?.enabled!==!0)return[];let t=e.maxEntries??2e3,n=ln(e),r=new Set,i=[];for(let e of n){if(r.has(e.path))continue;r.add(e.path);let n=await fn(e,t);i.push(...n)}return i.slice(-t)}async function mn(e,t){let n=new on(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?ut(await pn(t)):void 0}}async function hn(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);if(r&&await t.providerRegistry.hasCredential(r.provider))try{await e.applyModelWithContextFit?.(r)}catch{}}}{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 gn(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 hn(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 W(j({modelRegistry:e.modelRegistry,authStore:e.authStore,settings:e.settings,selectedModelId:()=>g.model?.id,isModelUsable:Nt(e.authStore,`delegation`),isModelUsableInMainSession:Nt(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 _n(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=vn(e,n,`"`);r+=t.value,n=t.next;continue}if(t===`'`){n++;let t=vn(e,n,`'`,!1);r+=t.value,n=t.next;continue}r+=t,n++}return i(),{tokens:t}}function vn(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 yn(e){let t=e.trim();if(!t.startsWith(`/`)||t===`/`||t.startsWith(`//`))return{isCommand:!1,text:t};let{tokens:n}=_n(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 bn(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 xn=[{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 Sn(e,t,n=xn){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 Cn(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 wn(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 Tn(e,t,n){let r,i=new Set,a=new Map,o=new Set,c=new Map;if(n){let n=await e.loadTailEntries(t,Pt);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 wn(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:C(r),argsObj:r,result:s(t.content),isError:t.isError},e.seq)),o.add(t.toolCallId)}else c.set(t.toolCallId,{toolName:t.toolName,content:t.content,isError:t.isError});continue}if(t.role===`assistant`){let n=wn(t);if(n.size>0){let r=new Set([...d,...o,...c.keys()]),i=x([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=c.get(t);if(n){c.delete(t);let i=r.arguments??{};f.push(p({role:`tool`,name:r.name,args:C(i),argsObj:i,result:s(n.content),isError:n.isError??!1},e.seq))}}continue}}let n=x([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 En(e){let{app:t,getTui:n,getTuiRef:r,getSession:i,getCliCtx:a,historyStore:o}=e;return{onCyclePermissionMode:()=>{let e=n(),r=ee(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{o.hydrate([...t]),o.persist().catch(()=>{})}catch{}e.getPasteBinder?.()?.save(i().id)},onDraftSave:e=>{let n=i(),a=n.session.getDrafts()??[],o=f(void 0,e,a),s=l([...a,o]);n.session.setDrafts(s),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(v(s))},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(v(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(v(o))},onA2uiAction:(e,t,n)=>{U(`a2ui-action`,n?[e,t,JSON.stringify(n)]:[e,t],a())},onStatusRefresh:()=>{U(`status`,[],a())},onProxySubmitUrl:e=>{U(`preference`,[`proxy`,e],a())},onProxyToggleEnabled:()=>{U(`preference`,[`proxy`,t.settings.get(`proxy`)?.enabled===!1?`on`:`off`],a())},onProxyClear:()=>{U(`preference`,[`proxy`,`clear`],a())},onProxyTest:()=>{U(`preference`,[`proxy`,`test`],a())}}}function Dn(e){return{...On(e),pluginSource:e.pluginSource,intervalSeconds:e.errorRetryIntervalSeconds}}function On(e){let{msg:t,provider:n,authError:r,isRefreshFailed:i,unsupported:a,fatal:o,rateLimit:s,rateLimitInfo:c,getErrorRetryAttempt:l,incErrorRetryAttempt:u,errorRetryMax:d,retryQueued:f,resetAndRetry:p,cancelRetry:m,switchModelThenRetry:h,goToAuth:g}=e;if(c)return c.resetsAt===void 0?{reason:t,attempt:0,max:d,mode:`manual`,limitType:c.limitType,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:f}],onExpired:()=>{},onCancel:m}:{reason:t,attempt:0,max:d,mode:`resetsAt`,resetsAt:c.resetsAt,limitType:c.limitType,actions:[{kind:`retryNow`,label:Q.t(`error.retryNow`),run:f},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h}],onExpired:f,onCancel:m};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:l(),max:d,mode:`manual`,actions:[{kind:`login`,label:Q.t(`model.goToLoginButton`),run:g},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:f}],onExpired:()=>{},onCancel:m};if(a)return{reason:Q.t(`cmd.modelNotSupported`),attempt:l(),max:d,mode:`manual`,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:f}],onExpired:()=>{},onCancel:m};let _=u(),v=_>d;return o?{reason:Q.t(`cmd.requestFailed`,{msg:t}),attempt:Math.min(_,d),max:d,mode:`manual`,exhausted:!0,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:p}],onExpired:()=>{},onCancel:m}:{reason:s?Q.t(`cmd.rateLimitedRetriesExhausted`):Q.t(`cmd.requestFailed`,{msg:t}),attempt:Math.min(_,d),max:d,mode:`auto`,exhausted:v,actions:[{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:v?p:f}],onExpired:v?()=>{}:f,onCancel:m}}function kn(e){let{err:n}=e,r=n instanceof Error?n.message:String(n),i=n?.code===`AGENT_ABORTED`||n instanceof Error&&n.name===`AbortError`;if(!(e.submitState.userAborted||i)){let i=e.provider,a=n?.code,o=n?.pluginSource,{authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,pluginSource:d}=V(r,a,o),f=e.rateLimitInfoRef.current;e.rateLimitInfoRef.current=void 0;let p=(()=>{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}}})(),m=!s&&!l&&!u&&Mt(e.err)===`fatal`,g=()=>{p&&I(p,{attempt:e.errorRetryAttemptRef.current+1,max:e.ERROR_RETRY_MAX,mode:f?`resetsAt`:s||l||m?`manual`:`auto`,reason:r.slice(0,120)}),e.retryModeRef.current=!0;let t=e.latestSubmittedPromptRef?.current,n=e.tui.engine.takeLastQueuedFollowUp?.(),i=t!=null&&t.text!==e.text,a=i?t.text:n?.text??e.text,o=i?t.mode:n?.mode??e.mode;a===e.text&&!i&&n==null&&e.retryLastRound?.()||queueMicrotask(()=>e.handleSubmit?.(a,o,`send`))};e.tui.engine.showErrorRetry(Dn({msg:r,provider:i,authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,rateLimitInfo:f,pluginSource:d,fatal:m,getErrorRetryAttempt:()=>e.errorRetryAttemptRef.current,incErrorRetryAttempt:()=>++e.errorRetryAttemptRef.current,errorRetryMax:e.ERROR_RETRY_MAX,errorRetryIntervalSeconds:e.ERROR_RETRY_INTERVAL_SECONDS,retryQueued:g,resetAndRetry:()=>{p&&t(p),e.errorRetryAttemptRef.current=0,g()},cancelRetry:()=>{p&&h(p,{attempt:e.errorRetryAttemptRef.current}),e.errorRetryAttemptRef.current=0},switchModelThenRetry:()=>{e.errorRetryAttemptRef.current=0,e.handleModel([],e.cliCtx,{afterSwitch:g})},goToAuth:()=>{e.handleProviderAuth([i??``].filter(Boolean),e.cliCtx)}}))}}function An(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 jn(e,t){return t===void 0?!1:e===t}function Mn(e){return e.trim().length===0}function Nn(e){let{tui:t,app:n,submitState:r}=e;return(e,i=`!!`)=>{let a=e.trim();if(!a)return;let o=Ve(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=be(a,{shell:!0,cwd:n.workspaceDir,stdio:[`ignore`,`pipe`,`pipe`],env:Be()}),Re.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 Pn(e){let{agentProcessingRef:t,tui:n,requestStop:r}=e;return(e,i)=>{let a=yn(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 Fn(e){let{app:t,tui:n}=e;return async e=>{let r=e.trim();if(!r)return;if(!t.storage.autoMemory){n.info.showToast(Q.t(`cmd.titleMemory`),Q.t(`cmd.memoryDisabled`));return}let i=await F(r,process.env.OTTO_MEMORY_LLM_NAMING===`1`?t.completeText:void 0);await t.storage.autoMemory.record(i),n.messages.echoUserInput(`# ${r}`),n.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`cmd.memorySaved`,{name:i.name})}]})}}function In(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 Ln(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 Rn(e){return{label:e.label,value:e.value,kind:e.kind,description:e.description}}function zn(e){return e.map(e=>({label:e.label,value:e.value,kind:e.kind,description:e.description,source:`recent`}))}async function Bn(e){let{runtime:t,app:n,session:i,options:a,tuiRefBox:o,tuiRef:s,turn:c,projState:l,redState:u,isBusyNow:d,dispatchToEngine:f,stopController:p,finishInteractive:m,stopTuiGuarded:h,applyModel:g,ensureModelUsableForPrompt:_,refreshSlashCommands:b,fileCommands:x,modelReady:S,availableModelIds:C,currentModel:w,fmtDisplayModel:ee,cfgLang:T,themeRegistry:D,presetSelection:O,keybindingOverrides:k,continuedExisting:j,convoCount:M,historyStore:N,inputHistory:P,externalHistoryCommands:te,bg:F,interactive:I,allCommandNames:z}=e;t.providerAuthRef.current=e=>{R([e],t.cliCtxRef.current).catch(()=>{})};let V,re=n.getResilienceConfig().errorRetry.maxAttempts;Ue(`startTui() begin`);let ie=performance.now(),ae=L(await A(n.workspaceDir,{readdir:e=>Dt(e,{withFileTypes:!0})})).map(e=>Q.t(e));return{stdin:process.stdin,stdout:process.stdout,modelName:ee(w),needsSetup:C.size===0,promptSuggestions:ae,commands:t.slashCommands,pluginInput:n.pluginInput,isImmediateCommand:e=>d()?H.has(e):z.has(e),isInterruptCommand:e=>e===`abort`,isAgentBusy:d,isPaused:()=>i.isPaused,initialPath:j&&M>0?`/`:`/home`,shadow:n._shadow,welcome:{cwd:process.cwd(),version:Xe,buildId:qe,nickname:n.settings.get(`nickname`)||void 0,updateAvailable:void 0},onSessionSelect:e=>{U(`session`,[`resume`,e],t.cliCtxRef.current)},onInstallCapability:e=>{import(`./command-dispatcher-B2Xx3NP7.js`).then(e=>e.g).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 Tn(e,i.id,!!a.continueSession);return e=>t.loadEarlier(e.limit)})():void 0,language:T,themeRegistry:D,presetSelection:O,keybindingOverrides:k,permissionMode:n.getPermissionMode(),onFocusChange:e=>n.setTerminalFocus(e),...F.handlers,initialHistory:P,externalHistoryCommands:te,residencyGovernor:n._residencyGovernor,resolveWholeFileDiff:async(e,t)=>{try{return await ue(nt(n.workspaceDir,e),t)}catch(e){return{error:e instanceof Error?e.message:String(e)}}},initialDrafts:v(i.session.getDrafts()??[]),initialRecentMentions:zn(n.settings.get(`recent_mentions`)??[]),onSigilSelect:e=>{let t=Ln(n.settings.get(`recent_mentions`)??[],Rn(e));n.settings.persist({recent_mentions:t}).catch(()=>{}),s.value?.stores.tasks.setRecentMentions(zn(t))},...En({app:n,getTui:()=>o.value,getTuiRef:()=>s.value,getSession:()=>i,getCliCtx:()=>t.cliCtxRef.current,historyStore:N,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}V?.(e,`send`,d()?`steer`:`send`)},onSubmit:V=async(e,a,f)=>{if(c.ctrlCCount=0,f===`action`){try{await se(e,{currentModelId:i.model?.id,applyModel:g,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),r(e,{currentEffort:i.thinkingLevel,applyEffort:e=>E(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:y.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=r(await se(e,{currentModelId:i.model?.id,applyModel:g,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),{currentEffort:i.thinkingLevel,applyEffort:e=>E(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:y.join(` / `)}))});if(Mn(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=yn(e),m=e,h=e,v=!1;if(p.isCommand){if(await U(p.command,p.args,t.cliCtxRef.current))return;n.firePluginActivationEvent?.(`onCommand:${p.command}`);let e=x.find(e=>e.name===p.command);e&&(v=!0,m=await Oe(e.body,{args:p.args,workspaceDir:n.workspaceDir}))}let C=p.isCommand&&!v&&ne.has(p.command.toLowerCase());if(!C&&!S&&(!p.isCommand||v)){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||v)){o.value.engine.enqueueFollowUp(e,a),o.value.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`queue.dFollowUpToast`));return}if(!C&&await _()===`abort`||(c.userAborted=!1,m=await se(m,{currentModelId:i.model?.id,applyModel:g,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),m=r(m,{currentEffort:i.thinkingLevel,applyEffort:e=>E(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:y.join(` / `)}))}),Mn(m)))return;C||(o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!0}),c.agentProcessing=!0,o.value.plugins.setCommands(b())),c.latestSubmittedPrompt={text:e,mode:a},c.retryMode||(c.errorRetryAttempt=0),c.retryMode=!1,u.lastTasks=l.todoList.slice();let w=r=>{kn({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:V,retryLastRound:()=>jn(An(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(()=>V?.(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:B,handleProviderAuth:R,cliCtx:t.cliCtxRef.current,tui:o.value})};try{h=m,m=await n.expandSigilChips(m,{skipPrefixes:new Set([`model`])}),(!p.isCommand||v)&&!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,Cn(`ftue.first_prompt.submitted`,{timeToFirstPromptMs:Math.round(performance.now()-ie)},i.id,{turn:i.session.getTurnCount()})).catch(()=>{}),(async()=>{let e=await Sn({hasFile:async e=>{try{return await kt(Z(n.workspaceDir,e)),!0}catch{return!1}},packageDependencyNames:async()=>{try{let e=await Et(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 I.handleInput(e);if(r.type===`exit`){t.handleExitRef.current(r);return}if(r.type===`help`){o.value.modal.openModal({kind:`helpViewer`,title:`Help`,lines:qt(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 bn(r,{runTurn:e=>I.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(b())}},onInterrupt:()=>{let e=Date.now(),t=rn(e,c.lastCtrlCTime,{shellRunning:!!c.shellChild,busy:d()||i.isPaused,stopDialogOpen:p.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`:p.requestStop(`abort`);return;case`escalate-exit`:p.escalateToExit();return;case`exit-process`:h();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=In(e);V?.(t,`send`,d()?`steer`:`send`)},onWithdrawPending:(e,t)=>{o.value.pending.withdrawPendingEcho()&&o.value.pending.restoreInputText(e),c.agentProcessing&&(c.userAborted=!0,f({kind:`abort`}),o.value.info.showToast(Q.t(`cmd.titleAborted`),Q.t(`cmd.runAborted`)))},onWithdrawSteer:e=>{i.removeSteer(e)?o.value.pending.withdrawPendingSteer(e):p.requestStop(`abort`)},onStop:()=>{m()}}}var Vn=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 Hn(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 Un(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`&&u()};u(),q.get(e)&&(q.retain(e,!0),o=e),a=setInterval(()=>{r()},500),r()},onBackgroundOutputClose:()=>{u()},onBackgroundSwitch:e=>{let t=n();d();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?x(n):[],s=J?.getTurns(e),c=J?.getStreamingText(e),l=Date.now(),u={id:e,title:i,messages:o,status:a?.status??`running`,diagnostics:r?dt(gt(r),l):[],timeline:s?pt(s,l):[],streamText:c};t.panes.switchToSubagentContext(u)};J?.pin(e),q.get(e)&&q.retain(e,!0),c=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:()=>{d(),n().panes.switchToSubagentContext(null)}}}}const $t=He(`@x-otto/cli:theme-preset-wiring`);function en(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 tn(e,t){let n=[];for(let r of t)try{n.push(en(e,r))}catch(e){$t.warn({pluginId:r.pluginId,localId:r.localId,err:String(e)},`theme preset registration failed, skipped`)}return n}function nn(e){let t=lt();return tn(t,Te(e.activePlugins())),t}function rn(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 an(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 on=class{entries=[];filePath;constructor(e,t=Z(Je,`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($e())return;let e=JSON.stringify(this.entries,null,2),t=`${this.filePath}.tmp`;try{await Tt(tt(this.filePath),{recursive:!0}),await jt(t,e,`utf-8`),await Ot(t,this.filePath)}catch(e){throw await At(t).catch(()=>{}),e}}async load(){try{let e=await Et(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 sn={[ct]:e=>yt(e),[at]:e=>_t(e),[st]:e=>vt(e)};function cn(){let e=process.env.SHELL??``,t=K(),n=process.env.HISTFILE;return e.includes(`fish`)?[{id:st,path:Z(t,`.local/share/fish/fish_history`)},{id:st,path:Z(t,`.config/fish/fish_history`)}]:e.includes(`bash`)?[{id:at,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.bash_history`)}]:e.includes(`zsh`)||!e?[{id:ct,path:n?.startsWith(`~`)?Z(t,n.slice(2)):n??Z(t,`.zsh_history`)}]:[]}function ln(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:un(t.path,e)}))}return cn()}function un(e,t){return e.startsWith(`~/`)?Z(t,e.slice(2)):e===`~`?t:e}async function dn(e){try{return await wt(e),!0}catch{return!1}}async function fn(e,t){let n=sn[e.id];if(!n||!await dn(e.path))return[];try{return n(await Et(e.path,`utf8`)).slice(-t)}catch{return[]}}async function pn(e){if(e?.enabled!==!0)return[];let t=e.maxEntries??2e3,n=ln(e),r=new Set,i=[];for(let e of n){if(r.has(e.path))continue;r.add(e.path);let n=await fn(e,t);i.push(...n)}return i.slice(-t)}async function mn(e,t){let n=new on(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?ut(await pn(t)):void 0}}async function hn(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);if(r&&await t.providerRegistry.hasCredential(r.provider))try{await e.applyModelWithContextFit?.(r)}catch{}}}{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 gn(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 hn(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 W(j({modelRegistry:e.modelRegistry,authStore:e.authStore,settings:e.settings,selectedModelId:()=>g.model?.id,isModelUsable:Nt(e.authStore,`delegation`),isModelUsableInMainSession:Nt(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 _n(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=vn(e,n,`"`);r+=t.value,n=t.next;continue}if(t===`'`){n++;let t=vn(e,n,`'`,!1);r+=t.value,n=t.next;continue}r+=t,n++}return i(),{tokens:t}}function vn(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 yn(e){let t=e.trim();if(!t.startsWith(`/`)||t===`/`||t.startsWith(`//`))return{isCommand:!1,text:t};let{tokens:n}=_n(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 bn(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 xn=[{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 Sn(e,t,n=xn){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 Cn(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 wn(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 Tn(e,t,n){let r,i=new Set,a=new Map,o=new Set,c=new Map;if(n){let n=await e.loadTailEntries(t,Pt);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 wn(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:C(r),argsObj:r,result:s(t.content),isError:t.isError},e.seq)),o.add(t.toolCallId)}else c.set(t.toolCallId,{toolName:t.toolName,content:t.content,isError:t.isError});continue}if(t.role===`assistant`){let n=wn(t);if(n.size>0){let r=new Set([...d,...o,...c.keys()]),i=x([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=c.get(t);if(n){c.delete(t);let i=r.arguments??{};f.push(p({role:`tool`,name:r.name,args:C(i),argsObj:i,result:s(n.content),isError:n.isError??!1},e.seq))}}continue}}let n=x([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 En(e){let{app:t,getTui:n,getTuiRef:r,getSession:i,getCliCtx:a,historyStore:o}=e;return{onCyclePermissionMode:()=>{let e=n(),r=ee(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{o.hydrate([...t]),o.persist().catch(()=>{})}catch{}e.getPasteBinder?.()?.save(i().id)},onDraftSave:e=>{let n=i(),a=n.session.getDrafts()??[],o=f(void 0,e,a),s=l([...a,o]);n.session.setDrafts(s),t.sessionManager.save(n.id).catch(()=>{}),r()?.stores.tasks.setDrafts(v(s))},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(v(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(v(o))},onA2uiAction:(e,t,n)=>{U(`a2ui-action`,n?[e,t,JSON.stringify(n)]:[e,t],a())},onStatusRefresh:()=>{U(`status`,[],a())},onProxySubmitUrl:e=>{U(`preference`,[`proxy`,e],a())},onProxyToggleEnabled:()=>{U(`preference`,[`proxy`,t.settings.get(`proxy`)?.enabled===!1?`on`:`off`],a())},onProxyClear:()=>{U(`preference`,[`proxy`,`clear`],a())},onProxyTest:()=>{U(`preference`,[`proxy`,`test`],a())}}}function Dn(e){return{...On(e),pluginSource:e.pluginSource,intervalSeconds:e.errorRetryIntervalSeconds}}function On(e){let{msg:t,provider:n,authError:r,isRefreshFailed:i,unsupported:a,fatal:o,rateLimit:s,rateLimitInfo:c,getErrorRetryAttempt:l,incErrorRetryAttempt:u,errorRetryMax:d,retryQueued:f,resetAndRetry:p,cancelRetry:m,switchModelThenRetry:h,goToAuth:g}=e;if(c)return c.resetsAt===void 0?{reason:t,attempt:0,max:d,mode:`manual`,limitType:c.limitType,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:f}],onExpired:()=>{},onCancel:m}:{reason:t,attempt:0,max:d,mode:`resetsAt`,resetsAt:c.resetsAt,limitType:c.limitType,actions:[{kind:`retryNow`,label:Q.t(`error.retryNow`),run:f},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h}],onExpired:f,onCancel:m};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:l(),max:d,mode:`manual`,actions:[{kind:`login`,label:Q.t(`model.goToLoginButton`),run:g},{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:f}],onExpired:()=>{},onCancel:m};if(a)return{reason:Q.t(`cmd.modelNotSupported`),attempt:l(),max:d,mode:`manual`,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:f}],onExpired:()=>{},onCancel:m};let _=u(),v=_>d;return o?{reason:Q.t(`cmd.requestFailed`,{msg:t}),attempt:Math.min(_,d),max:d,mode:`manual`,exhausted:!0,actions:[{kind:`switchModel`,label:Q.t(`error.switchModel`),run:h},{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:p}],onExpired:()=>{},onCancel:m}:{reason:s?Q.t(`cmd.rateLimitedRetriesExhausted`):Q.t(`cmd.requestFailed`,{msg:t}),attempt:Math.min(_,d),max:d,mode:`auto`,exhausted:v,actions:[{kind:`retryNow`,label:Q.t(`retry.nowButton`),run:v?p:f}],onExpired:v?()=>{}:f,onCancel:m}}function kn(e){let{err:n}=e,r=n instanceof Error?n.message:String(n),i=n?.code===`AGENT_ABORTED`||n instanceof Error&&n.name===`AbortError`;if(!(e.submitState.userAborted||i)){let i=e.provider,a=n?.code,o=n?.pluginSource,{authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,pluginSource:d}=V(r,a,o),f=e.rateLimitInfoRef.current;e.rateLimitInfoRef.current=void 0;let p=(()=>{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}}})(),m=!s&&!l&&!u&&Mt(e.err)===`fatal`,g=()=>{p&&I(p,{attempt:e.errorRetryAttemptRef.current+1,max:e.ERROR_RETRY_MAX,mode:f?`resetsAt`:s||l||m?`manual`:`auto`,reason:r.slice(0,120)}),e.retryModeRef.current=!0;let t=e.latestSubmittedPromptRef?.current,n=e.tui.engine.takeLastQueuedFollowUp?.(),i=t!=null&&t.text!==e.text,a=i?t.text:n?.text??e.text,o=i?t.mode:n?.mode??e.mode;a===e.text&&!i&&n==null&&e.retryLastRound?.()||queueMicrotask(()=>e.handleSubmit?.(a,o,`send`))};e.tui.engine.showErrorRetry(Dn({msg:r,provider:i,authError:s,isRefreshFailed:c,unsupported:l,rateLimit:u,rateLimitInfo:f,pluginSource:d,fatal:m,getErrorRetryAttempt:()=>e.errorRetryAttemptRef.current,incErrorRetryAttempt:()=>++e.errorRetryAttemptRef.current,errorRetryMax:e.ERROR_RETRY_MAX,errorRetryIntervalSeconds:e.ERROR_RETRY_INTERVAL_SECONDS,retryQueued:g,resetAndRetry:()=>{p&&t(p),e.errorRetryAttemptRef.current=0,g()},cancelRetry:()=>{p&&h(p,{attempt:e.errorRetryAttemptRef.current}),e.errorRetryAttemptRef.current=0},switchModelThenRetry:()=>{e.errorRetryAttemptRef.current=0,e.handleModel([],e.cliCtx,{afterSwitch:g})},goToAuth:()=>{e.handleProviderAuth([i??``].filter(Boolean),e.cliCtx)}}))}}function An(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 jn(e,t){return t===void 0?!1:e===t}function Mn(e){return e.trim().length===0}function Nn(e){let{tui:t,app:n,submitState:r}=e;return(e,i=`!!`)=>{let a=e.trim();if(!a)return;let o=Ve(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=be(a,{shell:!0,cwd:n.workspaceDir,stdio:[`ignore`,`pipe`,`pipe`],env:Be()}),Re.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 Pn(e){let{agentProcessingRef:t,tui:n,requestStop:r}=e;return(e,i)=>{let a=yn(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 Fn(e){let{app:t,tui:n}=e;return async e=>{let r=e.trim();if(!r)return;if(!t.storage.autoMemory){n.info.showToast(Q.t(`cmd.titleMemory`),Q.t(`cmd.memoryDisabled`));return}let i=await F(r,process.env.OTTO_MEMORY_LLM_NAMING===`1`?t.completeText:void 0);await t.storage.autoMemory.record(i),n.messages.echoUserInput(`# ${r}`),n.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:Q.t(`cmd.memorySaved`,{name:i.name})}]})}}function In(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 Ln(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 Rn(e){return{label:e.label,value:e.value,kind:e.kind,description:e.description}}function zn(e){return e.map(e=>({label:e.label,value:e.value,kind:e.kind,description:e.description,source:`recent`}))}async function Bn(e){let{runtime:t,app:n,session:i,options:a,tuiRefBox:o,tuiRef:s,turn:c,projState:l,redState:u,isBusyNow:d,dispatchToEngine:f,stopController:p,finishInteractive:m,stopTuiGuarded:h,applyModel:g,ensureModelUsableForPrompt:_,refreshSlashCommands:b,fileCommands:x,modelReady:S,availableModelIds:C,currentModel:w,fmtDisplayModel:ee,cfgLang:T,themeRegistry:D,presetSelection:O,keybindingOverrides:k,continuedExisting:j,convoCount:M,historyStore:N,inputHistory:P,externalHistoryCommands:te,bg:F,interactive:I,allCommandNames:z}=e;t.providerAuthRef.current=e=>{R([e],t.cliCtxRef.current).catch(()=>{})};let V,re=n.getResilienceConfig().errorRetry.maxAttempts;Ue(`startTui() begin`);let ie=performance.now(),ae=L(await A(n.workspaceDir,{readdir:e=>Dt(e,{withFileTypes:!0})})).map(e=>Q.t(e));return{stdin:process.stdin,stdout:process.stdout,modelName:ee(w),needsSetup:C.size===0,promptSuggestions:ae,commands:t.slashCommands,pluginInput:n.pluginInput,isImmediateCommand:e=>d()?H.has(e):z.has(e),isInterruptCommand:e=>e===`abort`,isAgentBusy:d,isPaused:()=>i.isPaused,initialPath:j&&M>0?`/`:`/home`,shadow:n._shadow,welcome:{cwd:process.cwd(),version:Xe,buildId:qe,nickname:n.settings.get(`nickname`)||void 0,updateAvailable:void 0},onSessionSelect:e=>{U(`session`,[`resume`,e],t.cliCtxRef.current)},onInstallCapability:e=>{import(`./command-dispatcher-CY-UqqPK.js`).then(e=>e.g).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 Tn(e,i.id,!!a.continueSession);return e=>t.loadEarlier(e.limit)})():void 0,language:T,themeRegistry:D,presetSelection:O,keybindingOverrides:k,permissionMode:n.getPermissionMode(),onFocusChange:e=>n.setTerminalFocus(e),...F.handlers,initialHistory:P,externalHistoryCommands:te,residencyGovernor:n._residencyGovernor,resolveWholeFileDiff:async(e,t)=>{try{return await ue(nt(n.workspaceDir,e),t)}catch(e){return{error:e instanceof Error?e.message:String(e)}}},initialDrafts:v(i.session.getDrafts()??[]),initialRecentMentions:zn(n.settings.get(`recent_mentions`)??[]),onSigilSelect:e=>{let t=Ln(n.settings.get(`recent_mentions`)??[],Rn(e));n.settings.persist({recent_mentions:t}).catch(()=>{}),s.value?.stores.tasks.setRecentMentions(zn(t))},...En({app:n,getTui:()=>o.value,getTuiRef:()=>s.value,getSession:()=>i,getCliCtx:()=>t.cliCtxRef.current,historyStore:N,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}V?.(e,`send`,d()?`steer`:`send`)},onSubmit:V=async(e,a,f)=>{if(c.ctrlCCount=0,f===`action`){try{await se(e,{currentModelId:i.model?.id,applyModel:g,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),r(e,{currentEffort:i.thinkingLevel,applyEffort:e=>E(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:y.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=r(await se(e,{currentModelId:i.model?.id,applyModel:g,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),{currentEffort:i.thinkingLevel,applyEffort:e=>E(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:y.join(` / `)}))});if(Mn(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=yn(e),m=e,h=e,v=!1;if(p.isCommand){if(await U(p.command,p.args,t.cliCtxRef.current))return;n.firePluginActivationEvent?.(`onCommand:${p.command}`);let e=x.find(e=>e.name===p.command);e&&(v=!0,m=await Oe(e.body,{args:p.args,workspaceDir:n.workspaceDir}))}let C=p.isCommand&&!v&&ne.has(p.command.toLowerCase());if(!C&&!S&&(!p.isCommand||v)){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||v)){o.value.engine.enqueueFollowUp(e,a),o.value.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`queue.dFollowUpToast`));return}if(!C&&await _()===`abort`||(c.userAborted=!1,m=await se(m,{currentModelId:i.model?.id,applyModel:g,onSwitchFailed:e=>o.value.info.showToast(Q.t(`cmd.titleModel`),e)}),m=r(m,{currentEffort:i.thinkingLevel,applyEffort:e=>E(t.cliCtxRef.current,e),onInvalidLevel:e=>o.value.info.showToast(Q.t(`cmd.titleEffort`),Q.t(`cmd.effortUnknown`,{arg:e,levels:y.join(` / `)}))}),Mn(m)))return;C||(o.value.engine.pushEngineEvent({kind:`agentProcessing`,value:!0}),c.agentProcessing=!0,o.value.plugins.setCommands(b())),c.latestSubmittedPrompt={text:e,mode:a},c.retryMode||(c.errorRetryAttempt=0),c.retryMode=!1,u.lastTasks=l.todoList.slice();let w=r=>{kn({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:V,retryLastRound:()=>jn(An(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(()=>V?.(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:B,handleProviderAuth:R,cliCtx:t.cliCtxRef.current,tui:o.value})};try{h=m,m=await n.expandSigilChips(m,{skipPrefixes:new Set([`model`])}),(!p.isCommand||v)&&!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,Cn(`ftue.first_prompt.submitted`,{timeToFirstPromptMs:Math.round(performance.now()-ie)},i.id,{turn:i.session.getTurnCount()})).catch(()=>{}),(async()=>{let e=await Sn({hasFile:async e=>{try{return await kt(Z(n.workspaceDir,e)),!0}catch{return!1}},packageDependencyNames:async()=>{try{let e=await Et(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 I.handleInput(e);if(r.type===`exit`){t.handleExitRef.current(r);return}if(r.type===`help`){o.value.modal.openModal({kind:`helpViewer`,title:`Help`,lines:qt(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 bn(r,{runTurn:e=>I.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(b())}},onInterrupt:()=>{let e=Date.now(),t=rn(e,c.lastCtrlCTime,{shellRunning:!!c.shellChild,busy:d()||i.isPaused,stopDialogOpen:p.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`:p.requestStop(`abort`);return;case`escalate-exit`:p.escalateToExit();return;case`exit-process`:h();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=In(e);V?.(t,`send`,d()?`steer`:`send`)},onWithdrawPending:(e,t)=>{o.value.pending.withdrawPendingEcho()&&o.value.pending.restoreInputText(e),c.agentProcessing&&(c.userAborted=!0,f({kind:`abort`}),o.value.info.showToast(Q.t(`cmd.titleAborted`),Q.t(`cmd.runAborted`)))},onWithdrawSteer:e=>{i.removeSteer(e)?o.value.pending.withdrawPendingSteer(e):p.requestStop(`abort`)},onStop:()=>{m()}}}var Vn=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 Hn(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 Un(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
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 Rt(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 Rt(t,(n?.answers?.[t.header]??[]).map(e=>e.replace(/\s*★$/,``)),n?.freeformText)}return zt(t,await e.modal.openModal({kind:`input`,title:t.header,description:[t.question],placeholder:Q.t(`cmd.grillAnswerPlaceholder`)}))}function Wn(t){let{getSession:r,app:a,tui:o,projState:s,redState:l,recomputeBudget:u,persistEditedFiles:d,persistSubagents:f,persistTurnCount:p,onContextCompacted:m,markStreamed:h}=t,g=null,_=!1,v=!1,y=null,b=null,x=e=>{let t=r(),n=t.session.getTurnCount();i({traceStore:a.storage.traceStore,sessionId:t.id,...n===void 0?{}:{turn:n}},e,`session-event`)},S=e=>{r().session.append({role:`system`,subtype:e,content:e,level:`info`,timestamp:Date.now()})},C=!1,w,ee={isDelegationTool:e=>It(a.toolRegistry.getAll()).has(e),currentModel:()=>r().model.id,cacheHitRatio:()=>r().getLastCacheHitRatio(),turnTokens:()=>{let e=r().session.messages(),t=0;for(let n of e)n.role===`assistant`&&n.usage&&(t+=(n.usage.inputTokens??0)+(n.usage.outputTokens??0)+(n.usage.cacheReadTokens??0)+(n.usage.cacheWriteTokens??0));let n=w;if(w=t,!(n==null||t<=n))return t-n}},T,E=!1,D=0,O=0,k=0,A=new Vn({estimate:e}),j=()=>{O=0,k=0,D=0,A.reset()},M=()=>{u(O+k+A.tokens())},N=0,P={},te=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(r().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})),t=new Map(J.list().map(e=>[e.id,e])),n=e=>{let n=t.get(e);return n?ht(n):{}},i=q.listForSession(r().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?te(e.diff):void 0,startedAt:e.startedAt,...n(e.id)})),a=new Set(i.map(e=>e.id)),s=J.list().filter(e=>!a.has(e.id)).map(gt),c=[...e,...i,...s];o.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()},ne=[Y.onSpawn(L),Y.onExit(R),q.onSpawn(L),q.onUpdate(L),q.onExit(R),q.onRemove(R),J.subscribe(L)];F();let z;return{bgUnsubs:ne,attachSessionHandler:()=>{z?.(),_=!1,z=r().subscribe(t=>{for(let e of Lt(t,s,ee)){if(e.kind===`prompt.end`){let t=n(e,l),i={turn:s.currentTurn,completedAt:Date.now(),...t},a=r().session.getTurnSummaries()??[];r().session.setTurnSummaries([...a.filter(e=>e.turn!==i.turn),i])}c(e,{pushMessage:o.messages.pushMessage,echoUserInput:o.messages.echoUserInput,pushEngineEvent:o.engine.pushEngineEvent,getNotifyStats:o.info.getNotifyStats,setTasks:(e,t)=>o.stores.tasks.setTasks(e,t),addTurnBoundary:e=>o.stores.tasks.addTurnBoundary(e)},l),e.kind===`tasks.update`&&(r().session.setTodoList(s.todoList),a.sessionManager.save(r().id).catch(()=>{}))}if(t.type===`stream.event`&&t.event?.type===`text_delta`){h();let e=t.event?.delta??``;D+=e.length,A.push(e),o.engine.pushEngineEvent({kind:`outputTokensThisTurn`,n:Math.floor(D/4)}),M()}if(t.type===`stream.event`&&t.event?.type===`done`){let e=t.event?.providerUsage;if(e!==void 0){let t=e!==null&&mt(e.status,e.overageStatus);if(e===null||e.status===`rejected`&&!t)o.stores.notification.setProviderUsage(null),g=null;else{let t=r().model.provider;a.authStore.getAuthSource(t).then(n=>{if(r().model.provider!==t)return;let i=n===`oauth`?e:null;o.stores.notification.setProviderUsage(i),g=i}).catch(()=>{})}}}switch(t.type){case`turn.start`:D=0,A.reset(),M(),o.engine.pushEngineEvent({kind:`spinnerMode`,mode:`requesting`});break;case`turn.end`:j(),u();break;case`streaming.start`:o.engine.pushEngineEvent({kind:`spinnerMode`,mode:`responding`}),o.pending.clearPendingEcho();break;case`streaming.end`:o.engine.pushEngineEvent({kind:`spinnerMode`,mode:null}),o.pending.clearPendingEcho();break;case`prompt.start`:j(),O=e(t.text),M(),o.info.setTopView({session:r().id}),o.panes.clearEditedFiles(),o.plugins.clearSubagents(),N=l.messageIndex,o.info.addContextTurn({turnIndex:s.currentTurn,role:`assistant`,messageCount:0,estimatedTokens:0,compacted:!1,truncated:!1,pruned:!1});break;case`compaction.start`:T=t.messageCount,o.engine.pushEngineEvent({kind:`activeTool`,name:ot});break;case`compaction.end`:{let e=T??t.retainedCount,n=t.retainedCount;o.engine.pushEngineEvent({kind:`activeTool`,name:null}),n<e&&(o.messages.pushMessage({role:`compact_boundary`,before:e,after:n}),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:e,after:n,summary:t.summary}),m()),T=void 0,u(void 0,{before:e,after:n});break}case`compaction.reactive.notice`:{let{messagesBefore:e,messagesAfter:n}=t;n<e&&(o.messages.pushMessage({role:`compact_boundary`,before:e,after:n}),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:e,after:n,summary:t.summary}),m()),u(void 0,{before:e,after:n});break}case`image.degradation.notice`:t.degradedCount>0&&o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.imageDegradationNotice`,{count:t.degradedCount,context:t.trigger===`image-constraint`?`image-constraint`:`other`}));break;case`session.history-capped`:o.messages.pushMessage({role:`history_capped`,removedCount:t.removedCount,trigger:t.trigger,...t.lossy?{lossy:!0}:{}}),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`history_capped`,removedCount:t.removedCount});break;case`session.write-lease-denied`:_=!0,o.messages.pushMessage({role:`write_lease_denied`}),o.info.showToast(Q.t(`lease.deniedToastTitle`),Q.t(`lease.deniedToastBody`));break;case`session.write-lease-restored`:_=!1,o.messages.pushMessage({role:`write_lease_restored`}),o.info.showToast(Q.t(`lease.restoredToastTitle`),Q.t(`lease.restoredToastBody`));break;case`session.crash-gap-detected`:o.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:t.lostTurns}));break;case`run.pause_requested`:v=!0,y={at:Date.now(),toolCount:0},x(`requested`),o.engine.setPauseDialog?.({phase:`requested`,requestedAt:Date.now(),toolCount:0,onCancel:()=>{},onDismiss:()=>{o.engine.setPauseDialog?.(null)}}),b&&clearInterval(b),b=setInterval(()=>{if(!y){clearInterval(b),b=null;return}let e=Math.floor((Date.now()-y.at)/1e3);o.stores.notification.setPausePending({elapsedSec:e,toolCount:y.toolCount})},1e3);break;case`tool.call.end`:{let n=typeof t.resultTokensEstimate==`number`?t.resultTokensEstimate:t.resultText?e(t.resultText):0;n>0&&(k+=n,M()),y&&(y.toolCount++,o.engine.setPauseDialog?.({phase:`requested`,requestedAt:y.at,toolCount:y.toolCount,onCancel:()=>{},onDismiss:()=>{o.engine.setPauseDialog?.(null)}})),(async()=>{try{let e={role:`tool_result`,name:t.toolCall.name,toolCallId:t.toolCall.id,content:[{type:`text`,text:t.resultText??``}],details:t.details},n=await a.resolveA2uiRendererPayload(e);n&&n.length>0&&o.messages.pushMessage({role:`assistant`,content:[{type:`a2ui`,components:n}]})}catch{}})();break}case`run.paused`:x(`paused`),y?(o.engine.setPauseDialog?.({phase:`active`,requestedAt:y.at,toolCount:y.toolCount,totalToolCount:y.toolCount}),o.messages.pushMessage({role:`run_paused`,toolCount:y.toolCount}),S(`run_paused`),b&&=(clearInterval(b),null),o.stores.notification.setPausePending(null),y=null):(o.messages.pushMessage({role:`run_paused`}),S(`run_paused`)),o.stores.notification.setPaused(!0);break;case`run.pause_cancelled`:x(`cancelled`),o.engine.setPauseDialog?.(null),o.messages.pushMessage({role:`run.pause_cancelled`}),S(`run_pause_cancelled`),b&&=(clearInterval(b),null),o.stores.notification.setPausePending(null),y=null,v=!1;break;case`run.resumed`:x(`resumed`),o.engine.setPauseDialog?.(null),o.messages.pushMessage({role:`run_resumed`}),S(`run_resumed`),b&&=(clearInterval(b),null),o.stores.notification.setPausePending(null),y=null,v=!1,o.stores.notification.setPaused(!1);break;case`steer.consumed`:o.pending.commitPendingSteer(t.id);break;case`image.vision-delegate`:!C&&t.describedCount>0&&(C=!0,o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`model.visionDelegateToast`,{count:t.describedCount})));break;case`memory.pruned`:E||(E=!0,o.messages.pushMessage({role:`prune_boundary`})),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`prune`,tokensSaved:t.tokensSaved,prunedCount:t.prunedCount}),u();break;case`error`:d(),f(),o.pending.withdrawPendingEcho();break;case`prompt.continued`:o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.todoGateContinuing`,{round:t.round,cap:t.maxRounds,left:t.incompleteCount}));break;case`prompt.budget.notice`:t.steered&&o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.promptBudgetExceeded`,{context:t.dimension,used:t.used,budget:t.budget}));break;case`budget.notice`:t.extended?o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.budgetExtended`,{maxTurns:t.maxTurns})):t.steered&&o.info.showToast(Q.t(`cmd.titleInfo`),t.progressDenied?Q.t(`cmd.budgetProgressDenied`):Q.t(`cmd.budgetSteered`,{maxTurns:t.maxTurns}));break;case`progress.stall.notice`:o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.progressStallDetected`,{maxRepeat:t.maxRepeat}));break;case`tool.call.mismatch.notice`:t.outcome===`retry`?o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.toolCallMismatchRetry`,{retryCount:t.retryCount})):o.info.showToast(Q.t(`cmd.titleError`),Q.t(`cmd.toolCallMismatchTerminated`));break;case`turn.idle.notice`:t.outcome===`nudge`?o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.turnIdleNudged`)):o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.turnIdleTerminated`));break;case`session.cost-budget-exceeded`:o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.sessionCostBudgetExceeded`,{used:t.totalCostUSD.toFixed(2),budget:t.budgetUSD.toFixed(2)}));break;case`prompt.end`:j(),o.pending.clearPendingSteers(),u(),o.info.markContextTurns({turnIndex:s.currentTurn,messageCount:Math.max(0,l.messageIndex-N)}),d(),f(),p();{let e=r(),t=Pe(e.session.metadata().title,e.session.messages(),e.id);o.stores.tasks.setSessionTitle(t),o.lifecycle.setTerminalTitle(t)}if(process.env.OTTO_TUI_DEBUG_NOTIFY_STATS){let e=o.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=a.settings.get(`pulse_survey`);a.feedbackRegistry.get()!==void 0&&Vt(s.currentTurn,{enabled:e?.enabled??!0,probability:e?.probability??.05,minTurnGap:e?.min_turn_gap??20,forcedUpgradeActive:o.info.isForcedUpgradeActive()},P)&&(P.lastShownTurn=s.currentTurn,o.stores.notification.setPulseSurvey({phase:`rating`,rating:null,selectedIndex:0,commentText:``,commentOffset:0,onSubmit:(e,t)=>{a.feedbackRegistry.get()?.recordPulseSurvey?.({ts:Date.now(),rating:e,comment:t,sdkVersion:Xe,modelId:r().model?.id})},onClose:()=>o.stores.notification.setPulseSurvey(null)}))}break;case`ask.user.required`:{let e=t.question,n=t.requestId;(async()=>{let i=a.inquiryCenter;if(!i.enqueue({id:n,origin:{kind:`session`,sessionId:t.sessionId},question:e}).accepted){r().resolveAskUser(n,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}if(!await i.waitForTurn(n)){r().resolveAskUser(n,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}try{let t=await Un(o,e);r().resolveAskUser(n,t)}finally{i.release(n)}})();break}case`approval.required`:{if(t.semanticVerdict){let e=Bt(t.description,t.arguments,xe);t.semanticVerdict===`allow`&&e&&a.approveSandboxBypass(e),a.recordAutoPermissionDecision({sessionId:t.sessionId,agentName:`main`,toolName:t.toolName,effect:t.semanticVerdict===`allow`?`allow`:`deny`,policyName:`semantic::sandbox-escalation`,reason:t.description}),a.logger?.info?.({approvalId:t.id,verdict:t.semanticVerdict,toolName:t.toolName},`Semantic approval verdict handled (no prompt)`);break}let e=t.toolName===`bash`&&typeof t.arguments?.command==`string`?t.arguments.command:``,n=e?a.bashAlwaysAllowPrefix(e):null;o.modal.requestPermission({tool:t.toolName,input:Hn(t.toolName,t.arguments),risk:t.risk??`medium`,description:t.description,alwaysAllowLabel:n??void 0}).then(e=>{let i=Bt(t.description,t.arguments,xe);e.approved&&i&&a.approveSandboxBypass(i),r().resolveApproval(t.id,e.approved),e.approved&&e.mode===`always`&&(t.toolName===`bash`?n&&a.allowToolAlways(`bash(${n})`,r().id):a.allowToolAlways(t.toolName,r().id))});break}}})},getSessionUnsub:()=>z,getLastProviderUsage:()=>g,isWriteLeaseReadOnly:()=>_,isRunPaused:()=>v}}function Gn(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 Kn(e){e.setEcosystemSearch(async t=>{try{let{registries:n,warnings:r}=await ge(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 qn(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&&(_e(i,r),n.info.showToast(Q.t(`proxy.title`),Q.t(`proxy.envDetectedToast`,{source:r,value:i})))})}function Jn(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=Pe(r.session.metadata().title,r.session.messages(),r.id);n.lifecycle.setTerminalTitle(i),n.stores.tasks.setSessionTitle(i)}function Yn(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(me({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(ge(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(me({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 Xn(e){let t=e[e.length-1];if(t?.type===`message`&&t.message?.role===`user`)return{parentId:t.parentId}}function Zn(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 Qn(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&&g({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=Xn(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=>Zn(t,e)),l.setBgUnsubs(u.bgUnsubs),u.attachSessionHandler(),$n(t,r)}function $n(e,t){p(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=>{m(e.sessionId)})}function er(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}`)}),Ue(`startTui() ready (first frame mounted)`),t.setUserAskRenderer(e=>Un(i,e));let p=Gn({gateway:()=>t.sessionManager.panelState,bridge:()=>i.pending,onError:(e,n)=>{t.logger?.debug?.({stage:e,error:n},`paste cache binding failed (non-fatal)`)}});qn({app:t,tui:i}),Kn(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}=ve(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-iVB3y7XG.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=Nn({tui:i,app:t,submitState:o}),l.current=Pn({agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},tui:i,requestStop:e=>s.requestStop(e)}),u.current=Fn({app:t,tui:i}),Jn({app:t,tui:i,session:n}),Yn({app:t,tui:i,getScheduler:()=>h}),{pasteBinder:p}}const tr=[`approaching`,`nearing`,`critical`],nr={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 rr(e,t,n,r){return e>=n?`critical`:e>=t?`nearing`:e>=t-r?`approaching`:null}function ir(e,t,n,r){return e===`critical`?n:e===`nearing`?t:t-r}function ar(e,t){return t<=1?0:e.backoffBaseTurns*2**(t-2)}var or=class{config;zones;suppressed=!1;constructor(e={}){this.config={...nr,...e},this.zones={approaching:$(),nearing:$(),critical:$()}}check(e){if(this.suppressed)return null;let{contextPercent:t,pruneLinePct:n,compactLinePct:r,currentTurn:i}=e,a=rr(t,n,r,this.config.approachingMarginPct);for(let e of tr)e!==a&&this.zones[e].active&&t<ir(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=ar(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 sr(e){let{getSession:t,app:n,tui:r,projState:i,contextWindow:a,currentModelId:o}=e,s,c=new or,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,v=n.modelRegistry.find(o.value??``)?.cost,y=v?p.totIn*(v.input??0)+p.totOut*(v.output??0):0,b=_({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:y>0?y:void 0,messageCount:p.messageCount,streamingOutputTokens:e});if(r.stores.budget.setBudget(b),r.stores.context.setBudget(b),!f&&b.contextWindow>0){let e=b.pruneLine/b.contextWindow*100,t=b.compactLine/b.contextWindow*100,n=c.check({contextPercent:b.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:Ct(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 cr(e){let{tui:t,app:n,themeRegistry:r,runtime:i,sessionRef:a,interactiveRef:s,modelReadyRef:c,projState:l,agentProcessingRef:u,modelsRef:d,availableModelIds:f,applyModel:p,persistAvailable:m,refreshModelsNow:h,refreshSlashCommands:g,events:_,redState:v,agentMessagesToChatMessages:y,PROVIDER_DISPLAY_NAMES:b,apiCredentialId:x,onContextCompacted:C}=e;return{tui:t,app:n,state:{get session(){return a.value},set session(e){a.value=e},get interactive(){return s.value},set interactive(e){s.value=e},get reg(){return i.regRef.value},set reg(e){i.regRef.value=e},get slashCommands(){return i.slashCommandsRef.value},set slashCommands(e){i.slashCommandsRef.value=e},get modelReady(){return c.value},set modelReady(e){c.value=e},get currentModelId(){return i.currentModelIdRef.value},set currentModelId(e){i.currentModelIdRef.value=e},get currentLang(){return i.currentLangRef.value},set currentLang(e){i.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 i.restartRequestedRef.value},set restartRequested(e){i.restartRequestedRef.value=!!e},themeRegistry:r},callbacks:{applyModel:p,persistAvailable:m,refreshModelsNow:h,registerAllTuiCommands:()=>{Zt(i.regRef.value,n)},refreshSlashCommands:g,attachSessionHandler:()=>_.attachSessionHandler(),restoreSwitchedSession:()=>{l.delegated.clear(),l.todoList=[],l.currentTurn=0,Object.assign(v,S()),t.stores.tasks.setTasks([],void 0),t.panes.clearEditedFiles(),t.plugins.clearSubagents(),o({session:a.value,projState:l,tui:t}),C()},resetCurrentTurn:()=>{l.currentTurn=0},onContextCompacted:C,sessionUnsub:()=>_.getSessionUnsub(),getLastProviderUsage:()=>_.getLastProviderUsage(),isWriteLeaseReadOnly:()=>_.isWriteLeaseReadOnly(),isRunPaused:()=>_.isRunPaused(),agentMessagesToChatMessages:y,PROVIDER_DISPLAY_NAMES:b,apiCredentialId:x}}}function lr(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 ur(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isFinite(r)&&r>0?r:t}function dr(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 fr(e){let{app:t,tui:n,getSession:r,setRestartResumePrompt:i,setRestartMemoryTriggered:a,handleExit:o,onContextCompacted:c,recomputeBudget:l}=e,u=!1,d=0,f,p=!1,m=0,h=!1,g=ur(`OTTO_MEMORY_CRITICAL_NOTIFY_INTERVAL_MS`,18e5),_=dr(`OTTO_MEMORY_CRITICAL_NOTIFY_ESCALATION_CYCLES`,4),v,y=()=>{let e=r();if(e.isBusy){let t=e.session.messages(),n=t[t.length-1];if(n?.role===`user`&&!n.internal){let e=s(n.content);e&&i(e)}}a(!0),o({type:`exit`,restart:!0})},b=()=>{v&&=(clearInterval(v),void 0),m=0,h=!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})),c(),l())}).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(u){n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`info`);return}n.info.isFullScreenPaneActive()&&(d++,f??=Date.now(),d<3&&Date.now()-f<300*1e3)||(d=0,p=!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:()=>{p=!1,b(),y()},onCancel:()=>{p=!1},onExtra:()=>{p=!1,u=!0}}))},onCriticalDuringGrace:e=>{n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`warning`)},onCriticalTimeout:e=>{if(p){p=!1,y();return}let i=()=>{m++,n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:t.memoryGovernor.sample().usedPct.toFixed(0)}),`system`,`warning`),!h&&m>=_&&(h=!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:m}}).catch(e=>{t.logger.warn({err:e instanceof Error?e.message:String(e)},`[memory-governor] critical-unattended-escalation trace append failed`)}))};v||(i(),v=setInterval(i,g),v.unref?.())},onLevelChange:e=>{e!==`critical`&&(d=0,f=void 0,b()),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 pr(e){let t=e??it(import.meta.url);t=tt(t);let n=t===`/`?t:`/`;for(;t!==n;){try{if(rt(t+`/.git`))return t}catch{}t=tt(t)}try{if(rt(n+`/.git`))return n}catch{}}var mr=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=ye(`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 hr(e){let{runtime:t,app:n,options:r,tui:i,tuiRef:a,turn:o,projState:s,redState:c,stopController:l,themeRegistry:u,availableModelIds:f,applyModel:p,refreshSlashCommands:m,retryAccelerate:h,startupCrashGapRef:g,resumedNote:_,resumed:v,updateCheckPromise:y,bg:b,ftueController:S,refreshModelsNow:C,persistAvailable:ee,cfgLang:T,sessionRef:E,interactiveRef:D,modelReadyRef:O,modelsRef:k,pasteBinder:A}=e;t.handleExitRef.current=e=>{l.requestStop(e.restart?`exit-restart`:`exit`)},r.memoryRestartGrace&&n.memoryGovernor.markRestarted();let j=r.restartGeneration??0;j>=3&&i.info.pushNotification(Q.t(`cmd.titleFleetBudget`),Q.t(`cmd.restartChainDeep`,{generation:j}),`system`,`warning`),i.engine.pushEngineEvent({kind:`perf`,indicatorLevel:n.memoryGovernor.currentLevel,memory:n.memoryGovernor.sample()}),lr({session:E.value,tui:i,retryAccelerate:h,setRateLimitInfo:e=>{o.lastRateLimitInfo=e},abortNow:()=>{l.abortNow()}});let M=sr({getSession:()=>E.value,app:n,tui:i,projState:s,contextWindow:t.contextWindowRef,currentModelId:t.currentModelIdRef}),{recomputeBudget:P,persistEditedFiles:te,persistSubagents:F,persistTurnCount:I,onContextCompacted:L}=M;t.pushBudgetNowRef.value=P,P(),n.editFileCallback=M.editFileCallback,fr({app:n,tui:i,getSession:()=>E.value,setRestartResumePrompt:e=>{t.restartResumePromptRef.value=e},setRestartMemoryTriggered:e=>{t.restartMemoryTriggeredRef.value=e},handleExit:t.handleExitRef.current,onContextCompacted:L,recomputeBudget:P}),n.registerInAppNotificationChannel((e,t,n)=>i.info.pushNotification(e,t,`system`,w(n))),n.setFollowUpPendingProbe(()=>i.engine.hasQueuedFollowUp());let R=Wn({getSession:()=>E.value,app:n,tui:i,projState:s,redState:c,recomputeBudget:P,persistEditedFiles:te,persistSubagents:F,persistTurnCount:I,onContextCompacted:L,markStreamed:()=>{o.streamedText=!0}});t.eventsRef.value=R,t.cliCtxRef.current=cr({runtime:t,tui:i,app:n,themeRegistry:u,sessionRef:E,interactiveRef:D,modelReadyRef:O,projState:s,agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},modelsRef:k,availableModelIds:f,applyModel:p,persistAvailable:ee,refreshModelsNow:C,refreshSlashCommands:m,events:R,redState:c,agentMessagesToChatMessages:x,PROVIDER_DISPLAY_NAMES:d,apiCredentialId:Se,onContextCompacted:L}),t.cliCtxRef.current.callbacks.pasteBinder=A,A.load(E.value.id),i.plugins.setPluginRegistrations(n.getPluginRegistrations());let ne=await S.refresh();if(a.value?.stores.tasks.setFtueStage(ne.stage),N(ne)&&T===`auto`&&!n.settings.get(`has_completed_onboarding`)){let e=await i.modal.openModal({kind:`onboarding`,onLanguagePreview:e=>{let n=e===`auto`?ae():e;z(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`?ae():e.language;z(r),i.lifecycle.setLanguage(r),t.currentLangRef.value=r,n.settings.persist({language:e.language}).catch(()=>{})}n.settings.persist({has_completed_onboarding:!0}).catch(()=>{})}ne.recommendation.autoOpen&&U(`setup`,[],t.cliCtxRef.current);let B=pr();B&&(t.staleBuildDetectorRef.current=new mr({repoRoot:B,currentBuildId:qe,logger:n.logger,onStale:e=>{i.info.pushNotification(Q.t(`cmd.titleStaleBuild`),Q.t(`cmd.staleBuildMessage`,{current:qe,latest:e}),`system`,`info`)}}),t.staleBuildDetectorRef.current.start()),await Qn({tui:i,options:r,app:n,session:E.value,projState:s,resumedNote:_,resumed:v??void 0,updateCheckPromise:y,bg:b,events:R}),g.value&&i.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:g.value.lostTurns}))}var gr=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 _r(e,t,n){let r=new gr,i;try{let o=await gn(t,{continueSession:e.continueSession,model:e.model,sessionUrl:e.sessionUrl}),s=o.SETUP_PLACEHOLDER_ID,c=o.session,l=o.startupCrashGapRef,d=o.resumedNote,f=o.modelReadyRef,p=f.value,m=o.ftueController,h=o.refreshModelsNow,g=o.modelRefreshState,_=g.availableModelIds,v=o.persistAvailable,y=g.models,x=o.continuedExisting,C=o.retryAccelerate,w=o.resumed,ee=o.convoCount,E=r.tuiRef,D=E,O=p?c.model?.id:void 0;r.contextWindow=t.modelRegistry.getAll().filter(e=>e.id!==s).find(e=>e.id===O)?.contextWindow??0;let A=r.contextWindowRef;r.currentModelId=O;let j=r.currentModelIdRef,N=e=>u(t,e,c.thinkingLevel),P=r.pushBudgetNowRef,te=r.exitSessionRef,F=r.providerAuthRef,I={value:e},L=e=>{switch(e.kind){case`steer`:c.steer(e.input);break;case`abort`:B.abort();break;case`pauseAfterTurn`:c.pauseRun();break;case`resumeRun`:c.resumeRun();break}},R=b({modelReady:f,currentModelId:j,contextWindow:A,tuiRef:E,pushBudgetNow:P,app:t,getSession:()=>c,options:I,fmtDisplayModel:N,onEngineModelAction:L}),ne=a({getSession:()=>c,app:t,tuiRef:E,options:I,fmtDisplayModel:N,applyModel:R,onExitSession:()=>te.value?.(),onLogin:e=>F.current?.(e)}),B=new re(c,{models:y,currentModel:O,onModelChange:R}),{startTui:V}=await import(`@x-otto/tui`);r.reg=B.getRegistry(),Zt(r.reg,t);let U=T(r.reg,t),W={agentProcessing:!1,ctrlCCount:0,lastCtrlCTime:0,userAborted:!1,shellChild:null,streamedText:!1,retryMode:!1,errorRetryAttempt:0,lastRateLimitInfo:void 0,latestSubmittedPrompt:void 0},se=()=>Wt(c.isBusy,W.agentProcessing);r.slashCommands=Jt(r.reg,W.agentProcessing,H,Q.t(`cmdDesc`,{returnObjects:!0}),c.pinned,c.isPaused);let ue=()=>(r.slashCommands=Jt(r.reg,W.agentProcessing,H,Q.t(`cmdDesc`,{returnObjects:!0}),c.pinned,c.isPaused),r.slashCommands);ce(t),k(t,_),le(t),oe(t);let fe=Ft(),G=t.settings.get(`language`)??`auto`;r.currentLang=G===`auto`?ae():G;let pe=nn(t),me=t.settings.get(`theme_preset`),he=t.settings.get(`keybinding_overrides`);z(r.currentLang);let ge=M({currentVersion:de(),lastCheck:t.settings.get(`last_update_check`),autoCheck:t.settings.get(`auto_update_check`)!==!1,persistLastCheck:()=>t.settings.persist({last_update_check:Date.now()})}),_e={get value(){return c},set value(e){c=e}},ve={get value(){return B},set value(e){B=e}},K={get value(){return y},set value(e){y=e}};await new Promise(async a=>{let o=r.schedulePollIntervalRef,s=r.scheduleServiceRef,u=!1,g=()=>{if(!u){u=!0;try{i?.clearBgSubs()}catch{}try{i?.stopBgOutputPoll()}catch{}try{i?.stopBgSubagentPoll()}catch{}r.dispose(),a()}};te.value=g;let y=()=>{setTimeout(g,3e3).unref();try{D.value?.lifecycle.stop()}catch{g()}},b=an({getTui:()=>D.value??null,getSession:()=>c,dispatchAbort:()=>L({kind:`abort`}),clearTodoLayers:()=>{fe.todoList.length!==0&&(fe.todoList=[],D.value?.stores.tasks.setTasks([]),c.session.setTodoList([]))},markUserAborted:()=>{W.userAborted=!0},resetCtrlCCount:()=>{W.ctrlCCount=0},markRestartRequested:()=>{r.restartRequestedRef.value=!0},stopTui:y,isBusy:()=>se()}),T=ie,{historyStore:k,inputHistory:A,externalHistoryCommands:j}=await mn(c,t.settings.get(`history`)?.external),M=Qt({app:t,session:c,getTui:()=>H});i=M;let P=r.runAsyncBashRef,F=r.handleAbortInterceptRef,I=r.runMemoryCaptureRef,z=S(),H=await V(await Bn({runtime:r,app:t,session:c,options:e,tuiRefBox:E,tuiRef:D,turn:W,projState:fe,redState:z,isBusyNow:se,dispatchToEngine:L,stopController:b,finishInteractive:g,stopTuiGuarded:y,applyModel:R,ensureModelUsableForPrompt:ne,refreshSlashCommands:ue,fileCommands:U,modelReady:p,availableModelIds:_,currentModel:O,fmtDisplayModel:N,cfgLang:G,themeRegistry:pe,presetSelection:me,keybindingOverrides:he,continuedExisting:x,convoCount:ee,historyStore:k,inputHistory:A,externalHistoryCommands:j,bg:M,bgController:i,interactive:B,allCommandNames:T}));E.value=H;let{pasteBinder:re}=er({app:t,session:c,options:e,tui:H,memoryConflictRef:n,turn:W,stopController:b,runAsyncBashRef:P,handleAbortInterceptRef:F,runMemoryCaptureRef:I,schedulePollIntervalRef:o,scheduleServiceRef:s});await hr({runtime:r,app:t,options:e,tui:H,tuiRef:D,turn:W,projState:fe,redState:z,stopController:b,themeRegistry:pe,availableModelIds:_,applyModel:R,refreshSlashCommands:ue,retryAccelerate:C,startupCrashGapRef:l,resumedNote:d,resumed:w??void 0,updateCheckPromise:ge,bg:M,ftueController:m,refreshModelsNow:h,persistAvailable:v,cfgLang:G,sessionRef:_e,interactiveRef:ve,modelReadyRef:f,modelsRef:K,pasteBinder:re})});let ye;if(t.codingSessionPool.autoPersist&&c.session.messages().length>0){let t=e.sessionUrl?` --session-url ${e.sessionUrl}`:``,n=e.sessionToken?` --session-token <redacted>`:``;ye=`\n\x1b[2m${Q.t(`cmd.resumeContinueLabel`)}\x1b[0motto --continue ${c.id}${t}${n}\n`}return{restart:r.restartRequested?{sessionId:c.id,memoryTriggered:r.restartMemoryTriggered,resumePrompt:r.restartResumePrompt}:void 0,resumeHint:ye}}finally{i?.clearBgSubs(),i?.stopBgOutputPoll(),i?.stopBgSubagentPoll()}}async function vr(e){if(e.hasParentWorkspace()){let t=e.parentWorkspaceExisted,n=await bt({parentRoot:t.parentRoot,currentRoot:t.currentRoot,language:e.settings.get(`language`)});n===`exit`&&(process.stdout.write(`
11
+ `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++;return`+${t}/-${n}`},F=()=>{let e=Y.listForSession(r().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})),t=new Map(J.list().map(e=>[e.id,e])),n=e=>{let n=t.get(e);return n?ht(n):{}},i=q.listForSession(r().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?te(e.diff):void 0,startedAt:e.startedAt,...n(e.id)})),a=new Set(i.map(e=>e.id)),s=J.list().filter(e=>!a.has(e.id)).map(gt),c=[...e,...i,...s];o.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()},ne=[Y.onSpawn(L),Y.onExit(R),q.onSpawn(L),q.onUpdate(L),q.onExit(R),q.onRemove(R),J.subscribe(L)];F();let z;return{bgUnsubs:ne,attachSessionHandler:()=>{z?.(),_=!1,z=r().subscribe(t=>{for(let e of Lt(t,s,ee)){if(e.kind===`prompt.end`){let t=n(e,l),i={turn:s.currentTurn,completedAt:Date.now(),...t},a=r().session.getTurnSummaries()??[];r().session.setTurnSummaries([...a.filter(e=>e.turn!==i.turn),i])}c(e,{pushMessage:o.messages.pushMessage,echoUserInput:o.messages.echoUserInput,pushEngineEvent:o.engine.pushEngineEvent,getNotifyStats:o.info.getNotifyStats,setTasks:(e,t)=>o.stores.tasks.setTasks(e,t),addTurnBoundary:e=>o.stores.tasks.addTurnBoundary(e)},l),e.kind===`tasks.update`&&(r().session.setTodoList(s.todoList),a.sessionManager.save(r().id).catch(()=>{}))}if(t.type===`stream.event`&&t.event?.type===`text_delta`){h();let e=t.event?.delta??``;D+=e.length,A.push(e),o.engine.pushEngineEvent({kind:`outputTokensThisTurn`,n:Math.floor(D/4)}),M()}if(t.type===`stream.event`&&t.event?.type===`done`){let e=t.event?.providerUsage;if(e!==void 0){let t=e!==null&&mt(e.status,e.overageStatus);if(e===null||e.status===`rejected`&&!t)o.stores.notification.setProviderUsage(null),g=null;else{let t=r().model.provider;a.authStore.getAuthSource(t).then(n=>{if(r().model.provider!==t)return;let i=n===`oauth`?e:null;o.stores.notification.setProviderUsage(i),g=i}).catch(()=>{})}}}switch(t.type){case`turn.start`:D=0,A.reset(),M(),o.engine.pushEngineEvent({kind:`spinnerMode`,mode:`requesting`});break;case`turn.end`:j(),u();break;case`streaming.start`:o.engine.pushEngineEvent({kind:`spinnerMode`,mode:`responding`}),o.pending.clearPendingEcho();break;case`streaming.end`:o.engine.pushEngineEvent({kind:`spinnerMode`,mode:null}),o.pending.clearPendingEcho();break;case`prompt.start`:j(),O=e(t.text),M(),o.info.setTopView({session:r().id}),o.panes.clearEditedFiles(),o.plugins.clearSubagents(),N=l.messageIndex,o.info.addContextTurn({turnIndex:s.currentTurn,role:`assistant`,messageCount:0,estimatedTokens:0,compacted:!1,truncated:!1,pruned:!1});break;case`compaction.start`:T=t.messageCount,o.engine.pushEngineEvent({kind:`activeTool`,name:ot});break;case`compaction.end`:{let e=T??t.retainedCount,n=t.retainedCount;o.engine.pushEngineEvent({kind:`activeTool`,name:null}),n<e&&(o.messages.pushMessage({role:`compact_boundary`,before:e,after:n}),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:e,after:n,summary:t.summary}),m()),T=void 0,u(void 0,{before:e,after:n});break}case`compaction.reactive.notice`:{let{messagesBefore:e,messagesAfter:n}=t;n<e&&(o.messages.pushMessage({role:`compact_boundary`,before:e,after:n}),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`compact`,before:e,after:n,summary:t.summary}),m()),u(void 0,{before:e,after:n});break}case`image.degradation.notice`:t.degradedCount>0&&o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.imageDegradationNotice`,{count:t.degradedCount,context:t.trigger===`image-constraint`?`image-constraint`:`other`}));break;case`session.history-capped`:o.messages.pushMessage({role:`history_capped`,removedCount:t.removedCount,trigger:t.trigger,...t.lossy?{lossy:!0}:{}}),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`history_capped`,removedCount:t.removedCount});break;case`session.write-lease-denied`:_=!0,o.messages.pushMessage({role:`write_lease_denied`}),o.info.showToast(Q.t(`lease.deniedToastTitle`),Q.t(`lease.deniedToastBody`));break;case`session.write-lease-restored`:_=!1,o.messages.pushMessage({role:`write_lease_restored`}),o.info.showToast(Q.t(`lease.restoredToastTitle`),Q.t(`lease.restoredToastBody`));break;case`session.crash-gap-detected`:o.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:t.lostTurns}));break;case`run.pause_requested`:v=!0,y={at:Date.now(),toolCount:0},x(`requested`),o.engine.setPauseDialog?.({phase:`requested`,requestedAt:Date.now(),toolCount:0,onCancel:()=>{},onDismiss:()=>{o.engine.setPauseDialog?.(null)}}),b&&clearInterval(b),b=setInterval(()=>{if(!y){clearInterval(b),b=null;return}let e=Math.floor((Date.now()-y.at)/1e3);o.stores.notification.setPausePending({elapsedSec:e,toolCount:y.toolCount})},1e3);break;case`tool.call.end`:{let n=typeof t.resultTokensEstimate==`number`?t.resultTokensEstimate:t.resultText?e(t.resultText):0;n>0&&(k+=n,M()),y&&(y.toolCount++,o.engine.setPauseDialog?.({phase:`requested`,requestedAt:y.at,toolCount:y.toolCount,onCancel:()=>{},onDismiss:()=>{o.engine.setPauseDialog?.(null)}})),(async()=>{try{let e={role:`tool_result`,name:t.toolCall.name,toolCallId:t.toolCall.id,content:[{type:`text`,text:t.resultText??``}],details:t.details},n=await a.resolveA2uiRendererPayload(e);n&&n.length>0&&o.messages.pushMessage({role:`assistant`,content:[{type:`a2ui`,components:n}]})}catch{}})();break}case`run.paused`:x(`paused`),y?(o.engine.setPauseDialog?.({phase:`active`,requestedAt:y.at,toolCount:y.toolCount,totalToolCount:y.toolCount}),o.messages.pushMessage({role:`run_paused`,toolCount:y.toolCount}),S(`run_paused`),b&&=(clearInterval(b),null),o.stores.notification.setPausePending(null),y=null):(o.messages.pushMessage({role:`run_paused`}),S(`run_paused`)),o.stores.notification.setPaused(!0);break;case`run.pause_cancelled`:x(`cancelled`),o.engine.setPauseDialog?.(null),o.messages.pushMessage({role:`run.pause_cancelled`}),S(`run_pause_cancelled`),b&&=(clearInterval(b),null),o.stores.notification.setPausePending(null),y=null,v=!1;break;case`run.resumed`:x(`resumed`),o.engine.setPauseDialog?.(null),o.messages.pushMessage({role:`run_resumed`}),S(`run_resumed`),b&&=(clearInterval(b),null),o.stores.notification.setPausePending(null),y=null,v=!1,o.stores.notification.setPaused(!1);break;case`steer.consumed`:o.pending.commitPendingSteer(t.id);break;case`image.vision-delegate`:!C&&t.describedCount>0&&(C=!0,o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`model.visionDelegateToast`,{count:t.describedCount})));break;case`memory.pruned`:E||(E=!0,o.messages.pushMessage({role:`prune_boundary`})),o.engine.pushEngineEvent({kind:`compactionLog`,entryKind:`prune`,tokensSaved:t.tokensSaved,prunedCount:t.prunedCount}),u();break;case`error`:d(),f(),o.pending.withdrawPendingEcho();break;case`prompt.continued`:o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.todoGateContinuing`,{round:t.round,cap:t.maxRounds,left:t.incompleteCount}));break;case`prompt.budget.notice`:t.steered&&o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.promptBudgetExceeded`,{context:t.dimension,used:t.used,budget:t.budget}));break;case`budget.notice`:t.extended?o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.budgetExtended`,{maxTurns:t.maxTurns})):t.steered&&o.info.showToast(Q.t(`cmd.titleInfo`),t.progressDenied?Q.t(`cmd.budgetProgressDenied`):Q.t(`cmd.budgetSteered`,{maxTurns:t.maxTurns}));break;case`progress.stall.notice`:o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.progressStallDetected`,{maxRepeat:t.maxRepeat}));break;case`tool.call.mismatch.notice`:t.outcome===`retry`?o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.toolCallMismatchRetry`,{retryCount:t.retryCount})):o.info.showToast(Q.t(`cmd.titleError`),Q.t(`cmd.toolCallMismatchTerminated`));break;case`turn.idle.notice`:t.outcome===`nudge`?o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.turnIdleNudged`)):o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.turnIdleTerminated`));break;case`session.cost-budget-exceeded`:o.info.showToast(Q.t(`cmd.titleInfo`),Q.t(`cmd.sessionCostBudgetExceeded`,{used:t.totalCostUSD.toFixed(2),budget:t.budgetUSD.toFixed(2)}));break;case`prompt.end`:j(),o.pending.clearPendingSteers(),u(),o.info.markContextTurns({turnIndex:s.currentTurn,messageCount:Math.max(0,l.messageIndex-N)}),d(),f(),p();{let e=r(),t=Pe(e.session.metadata().title,e.session.messages(),e.id);o.stores.tasks.setSessionTitle(t),o.lifecycle.setTerminalTitle(t)}if(process.env.OTTO_TUI_DEBUG_NOTIFY_STATS){let e=o.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=a.settings.get(`pulse_survey`);a.feedbackRegistry.get()!==void 0&&Vt(s.currentTurn,{enabled:e?.enabled??!0,probability:e?.probability??.05,minTurnGap:e?.min_turn_gap??20,forcedUpgradeActive:o.info.isForcedUpgradeActive()},P)&&(P.lastShownTurn=s.currentTurn,o.stores.notification.setPulseSurvey({phase:`rating`,rating:null,selectedIndex:0,commentText:``,commentOffset:0,onSubmit:(e,t)=>{a.feedbackRegistry.get()?.recordPulseSurvey?.({ts:Date.now(),rating:e,comment:t,sdkVersion:Xe,modelId:r().model?.id})},onClose:()=>o.stores.notification.setPulseSurvey(null)}))}break;case`ask.user.required`:{let e=t.question,n=t.requestId;(async()=>{let i=a.inquiryCenter;if(!i.enqueue({id:n,origin:{kind:`session`,sessionId:t.sessionId},question:e}).accepted){r().resolveAskUser(n,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}if(!await i.waitForTurn(n)){r().resolveAskUser(n,{answer:``,acceptedRecommendation:!1,resolvedBy:`human`});return}try{let t=await Un(o,e);r().resolveAskUser(n,t)}finally{i.release(n)}})();break}case`approval.required`:{if(t.semanticVerdict){let e=Bt(t.description,t.arguments,xe);t.semanticVerdict===`allow`&&e&&a.approveSandboxBypass(e),a.recordAutoPermissionDecision({sessionId:t.sessionId,agentName:`main`,toolName:t.toolName,effect:t.semanticVerdict===`allow`?`allow`:`deny`,policyName:`semantic::sandbox-escalation`,reason:t.description}),a.logger?.info?.({approvalId:t.id,verdict:t.semanticVerdict,toolName:t.toolName},`Semantic approval verdict handled (no prompt)`);break}let e=t.toolName===`bash`&&typeof t.arguments?.command==`string`?t.arguments.command:``,n=e?a.bashAlwaysAllowPrefix(e):null;o.modal.requestPermission({tool:t.toolName,input:Hn(t.toolName,t.arguments),risk:t.risk??`medium`,description:t.description,alwaysAllowLabel:n??void 0}).then(e=>{let i=Bt(t.description,t.arguments,xe);e.approved&&i&&a.approveSandboxBypass(i),r().resolveApproval(t.id,e.approved),e.approved&&e.mode===`always`&&(t.toolName===`bash`?n&&a.allowToolAlways(`bash(${n})`,r().id):a.allowToolAlways(t.toolName,r().id))});break}}})},getSessionUnsub:()=>z,getLastProviderUsage:()=>g,isWriteLeaseReadOnly:()=>_,isRunPaused:()=>v}}function Gn(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 Kn(e){e.setEcosystemSearch(async t=>{try{let{registries:n,warnings:r}=await ge(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 qn(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&&(_e(i,r),n.info.showToast(Q.t(`proxy.title`),Q.t(`proxy.envDetectedToast`,{source:r,value:i})))})}function Jn(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=Pe(r.session.metadata().title,r.session.messages(),r.id);n.lifecycle.setTerminalTitle(i),n.stores.tasks.setSessionTitle(i)}function Yn(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(me({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(ge(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(me({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 Xn(e){let t=e[e.length-1];if(t?.type===`message`&&t.message?.role===`user`)return{parentId:t.parentId}}function Zn(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 Qn(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&&g({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=Xn(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=>Zn(t,e)),l.setBgUnsubs(u.bgUnsubs),u.attachSessionHandler(),$n(t,r)}function $n(e,t){p(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=>{m(e.sessionId)})}function er(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}`)}),Ue(`startTui() ready (first frame mounted)`),t.setUserAskRenderer(e=>Un(i,e));let p=Gn({gateway:()=>t.sessionManager.panelState,bridge:()=>i.pending,onError:(e,n)=>{t.logger?.debug?.({stage:e,error:n},`paste cache binding failed (non-fatal)`)}});qn({app:t,tui:i}),Kn(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}=ve(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-CeQNJ8Tj.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=Nn({tui:i,app:t,submitState:o}),l.current=Pn({agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},tui:i,requestStop:e=>s.requestStop(e)}),u.current=Fn({app:t,tui:i}),Jn({app:t,tui:i,session:n}),Yn({app:t,tui:i,getScheduler:()=>h}),{pasteBinder:p}}const tr=[`approaching`,`nearing`,`critical`],nr={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 rr(e,t,n,r){return e>=n?`critical`:e>=t?`nearing`:e>=t-r?`approaching`:null}function ir(e,t,n,r){return e===`critical`?n:e===`nearing`?t:t-r}function ar(e,t){return t<=1?0:e.backoffBaseTurns*2**(t-2)}var or=class{config;zones;suppressed=!1;constructor(e={}){this.config={...nr,...e},this.zones={approaching:$(),nearing:$(),critical:$()}}check(e){if(this.suppressed)return null;let{contextPercent:t,pruneLinePct:n,compactLinePct:r,currentTurn:i}=e,a=rr(t,n,r,this.config.approachingMarginPct);for(let e of tr)e!==a&&this.zones[e].active&&t<ir(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=ar(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 sr(e){let{getSession:t,app:n,tui:r,projState:i,contextWindow:a,currentModelId:o}=e,s,c=new or,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,v=n.modelRegistry.find(o.value??``)?.cost,y=v?p.totIn*(v.input??0)+p.totOut*(v.output??0):0,b=_({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:y>0?y:void 0,messageCount:p.messageCount,streamingOutputTokens:e});if(r.stores.budget.setBudget(b),r.stores.context.setBudget(b),!f&&b.contextWindow>0){let e=b.pruneLine/b.contextWindow*100,t=b.compactLine/b.contextWindow*100,n=c.check({contextPercent:b.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:Ct(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 cr(e){let{tui:t,app:n,themeRegistry:r,runtime:i,sessionRef:a,interactiveRef:s,modelReadyRef:c,projState:l,agentProcessingRef:u,modelsRef:d,availableModelIds:f,applyModel:p,persistAvailable:m,refreshModelsNow:h,refreshSlashCommands:g,events:_,redState:v,agentMessagesToChatMessages:y,PROVIDER_DISPLAY_NAMES:b,apiCredentialId:x,onContextCompacted:C}=e;return{tui:t,app:n,state:{get session(){return a.value},set session(e){a.value=e},get interactive(){return s.value},set interactive(e){s.value=e},get reg(){return i.regRef.value},set reg(e){i.regRef.value=e},get slashCommands(){return i.slashCommandsRef.value},set slashCommands(e){i.slashCommandsRef.value=e},get modelReady(){return c.value},set modelReady(e){c.value=e},get currentModelId(){return i.currentModelIdRef.value},set currentModelId(e){i.currentModelIdRef.value=e},get currentLang(){return i.currentLangRef.value},set currentLang(e){i.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 i.restartRequestedRef.value},set restartRequested(e){i.restartRequestedRef.value=!!e},themeRegistry:r},callbacks:{applyModel:p,persistAvailable:m,refreshModelsNow:h,registerAllTuiCommands:()=>{Zt(i.regRef.value,n)},refreshSlashCommands:g,attachSessionHandler:()=>_.attachSessionHandler(),restoreSwitchedSession:()=>{l.delegated.clear(),l.todoList=[],l.currentTurn=0,Object.assign(v,S()),t.stores.tasks.setTasks([],void 0),t.panes.clearEditedFiles(),t.plugins.clearSubagents(),o({session:a.value,projState:l,tui:t}),C()},resetCurrentTurn:()=>{l.currentTurn=0},onContextCompacted:C,sessionUnsub:()=>_.getSessionUnsub(),getLastProviderUsage:()=>_.getLastProviderUsage(),isWriteLeaseReadOnly:()=>_.isWriteLeaseReadOnly(),isRunPaused:()=>_.isRunPaused(),agentMessagesToChatMessages:y,PROVIDER_DISPLAY_NAMES:b,apiCredentialId:x}}}function lr(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 ur(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isFinite(r)&&r>0?r:t}function dr(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 fr(e){let{app:t,tui:n,getSession:r,setRestartResumePrompt:i,setRestartMemoryTriggered:a,handleExit:o,onContextCompacted:c,recomputeBudget:l}=e,u=!1,d=0,f,p=!1,m=0,h=!1,g=ur(`OTTO_MEMORY_CRITICAL_NOTIFY_INTERVAL_MS`,18e5),_=dr(`OTTO_MEMORY_CRITICAL_NOTIFY_ESCALATION_CYCLES`,4),v,y=()=>{let e=r();if(e.isBusy){let t=e.session.messages(),n=t[t.length-1];if(n?.role===`user`&&!n.internal){let e=s(n.content);e&&i(e)}}a(!0),o({type:`exit`,restart:!0})},b=()=>{v&&=(clearInterval(v),void 0),m=0,h=!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})),c(),l())}).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(u){n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`info`);return}n.info.isFullScreenPaneActive()&&(d++,f??=Date.now(),d<3&&Date.now()-f<300*1e3)||(d=0,p=!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:()=>{p=!1,b(),y()},onCancel:()=>{p=!1},onExtra:()=>{p=!1,u=!0}}))},onCriticalDuringGrace:e=>{n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:e.usedPct.toFixed(0)}),`system`,`warning`)},onCriticalTimeout:e=>{if(p){p=!1,y();return}let i=()=>{m++,n.info.pushNotification(Q.t(`cmd.titleMemoryPressure`),Q.t(`cmd.memoryPressureMessage`,{usedPct:t.memoryGovernor.sample().usedPct.toFixed(0)}),`system`,`warning`),!h&&m>=_&&(h=!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:m}}).catch(e=>{t.logger.warn({err:e instanceof Error?e.message:String(e)},`[memory-governor] critical-unattended-escalation trace append failed`)}))};v||(i(),v=setInterval(i,g),v.unref?.())},onLevelChange:e=>{e!==`critical`&&(d=0,f=void 0,b()),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 pr(e){let t=e??it(import.meta.url);t=tt(t);let n=t===`/`?t:`/`;for(;t!==n;){try{if(rt(t+`/.git`))return t}catch{}t=tt(t)}try{if(rt(n+`/.git`))return n}catch{}}var mr=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=ye(`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 hr(e){let{runtime:t,app:n,options:r,tui:i,tuiRef:a,turn:o,projState:s,redState:c,stopController:l,themeRegistry:u,availableModelIds:f,applyModel:p,refreshSlashCommands:m,retryAccelerate:h,startupCrashGapRef:g,resumedNote:_,resumed:v,updateCheckPromise:y,bg:b,ftueController:S,refreshModelsNow:C,persistAvailable:ee,cfgLang:T,sessionRef:E,interactiveRef:D,modelReadyRef:O,modelsRef:k,pasteBinder:A}=e;t.handleExitRef.current=e=>{l.requestStop(e.restart?`exit-restart`:`exit`)},r.memoryRestartGrace&&n.memoryGovernor.markRestarted();let j=r.restartGeneration??0;j>=3&&i.info.pushNotification(Q.t(`cmd.titleFleetBudget`),Q.t(`cmd.restartChainDeep`,{generation:j}),`system`,`warning`),i.engine.pushEngineEvent({kind:`perf`,indicatorLevel:n.memoryGovernor.currentLevel,memory:n.memoryGovernor.sample()}),lr({session:E.value,tui:i,retryAccelerate:h,setRateLimitInfo:e=>{o.lastRateLimitInfo=e},abortNow:()=>{l.abortNow()}});let M=sr({getSession:()=>E.value,app:n,tui:i,projState:s,contextWindow:t.contextWindowRef,currentModelId:t.currentModelIdRef}),{recomputeBudget:P,persistEditedFiles:te,persistSubagents:F,persistTurnCount:I,onContextCompacted:L}=M;t.pushBudgetNowRef.value=P,P(),n.editFileCallback=M.editFileCallback,fr({app:n,tui:i,getSession:()=>E.value,setRestartResumePrompt:e=>{t.restartResumePromptRef.value=e},setRestartMemoryTriggered:e=>{t.restartMemoryTriggeredRef.value=e},handleExit:t.handleExitRef.current,onContextCompacted:L,recomputeBudget:P}),n.registerInAppNotificationChannel((e,t,n)=>i.info.pushNotification(e,t,`system`,w(n))),n.setFollowUpPendingProbe(()=>i.engine.hasQueuedFollowUp());let R=Wn({getSession:()=>E.value,app:n,tui:i,projState:s,redState:c,recomputeBudget:P,persistEditedFiles:te,persistSubagents:F,persistTurnCount:I,onContextCompacted:L,markStreamed:()=>{o.streamedText=!0}});t.eventsRef.value=R,t.cliCtxRef.current=cr({runtime:t,tui:i,app:n,themeRegistry:u,sessionRef:E,interactiveRef:D,modelReadyRef:O,projState:s,agentProcessingRef:{get value(){return o.agentProcessing},set value(e){o.agentProcessing=e}},modelsRef:k,availableModelIds:f,applyModel:p,persistAvailable:ee,refreshModelsNow:C,refreshSlashCommands:m,events:R,redState:c,agentMessagesToChatMessages:x,PROVIDER_DISPLAY_NAMES:d,apiCredentialId:Se,onContextCompacted:L}),t.cliCtxRef.current.callbacks.pasteBinder=A,A.load(E.value.id),i.plugins.setPluginRegistrations(n.getPluginRegistrations());let ne=await S.refresh();if(a.value?.stores.tasks.setFtueStage(ne.stage),N(ne)&&T===`auto`&&!n.settings.get(`has_completed_onboarding`)){let e=await i.modal.openModal({kind:`onboarding`,onLanguagePreview:e=>{let n=e===`auto`?ae():e;z(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`?ae():e.language;z(r),i.lifecycle.setLanguage(r),t.currentLangRef.value=r,n.settings.persist({language:e.language}).catch(()=>{})}n.settings.persist({has_completed_onboarding:!0}).catch(()=>{})}ne.recommendation.autoOpen&&U(`setup`,[],t.cliCtxRef.current);let B=pr();B&&(t.staleBuildDetectorRef.current=new mr({repoRoot:B,currentBuildId:qe,logger:n.logger,onStale:e=>{i.info.pushNotification(Q.t(`cmd.titleStaleBuild`),Q.t(`cmd.staleBuildMessage`,{current:qe,latest:e}),`system`,`info`)}}),t.staleBuildDetectorRef.current.start()),await Qn({tui:i,options:r,app:n,session:E.value,projState:s,resumedNote:_,resumed:v??void 0,updateCheckPromise:y,bg:b,events:R}),g.value&&i.info.showToast(Q.t(`crashGap.toastTitle`),Q.t(`crashGap.toastBody`,{lostTurns:g.value.lostTurns}))}var gr=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 _r(e,t,n){let r=new gr,i;try{let o=await gn(t,{continueSession:e.continueSession,model:e.model,sessionUrl:e.sessionUrl}),s=o.SETUP_PLACEHOLDER_ID,c=o.session,l=o.startupCrashGapRef,d=o.resumedNote,f=o.modelReadyRef,p=f.value,m=o.ftueController,h=o.refreshModelsNow,g=o.modelRefreshState,_=g.availableModelIds,v=o.persistAvailable,y=g.models,x=o.continuedExisting,C=o.retryAccelerate,w=o.resumed,ee=o.convoCount,E=r.tuiRef,D=E,O=p?c.model?.id:void 0;r.contextWindow=t.modelRegistry.getAll().filter(e=>e.id!==s).find(e=>e.id===O)?.contextWindow??0;let A=r.contextWindowRef;r.currentModelId=O;let j=r.currentModelIdRef,N=e=>u(t,e,c.thinkingLevel),P=r.pushBudgetNowRef,te=r.exitSessionRef,F=r.providerAuthRef,I={value:e},L=e=>{switch(e.kind){case`steer`:c.steer(e.input);break;case`abort`:B.abort();break;case`pauseAfterTurn`:c.pauseRun();break;case`resumeRun`:c.resumeRun();break}},R=b({modelReady:f,currentModelId:j,contextWindow:A,tuiRef:E,pushBudgetNow:P,app:t,getSession:()=>c,options:I,fmtDisplayModel:N,onEngineModelAction:L}),ne=a({getSession:()=>c,app:t,tuiRef:E,options:I,fmtDisplayModel:N,applyModel:R,onExitSession:()=>te.value?.(),onLogin:e=>F.current?.(e)}),B=new re(c,{models:y,currentModel:O,onModelChange:R}),{startTui:V}=await import(`@x-otto/tui`);r.reg=B.getRegistry(),Zt(r.reg,t);let U=T(r.reg,t),W={agentProcessing:!1,ctrlCCount:0,lastCtrlCTime:0,userAborted:!1,shellChild:null,streamedText:!1,retryMode:!1,errorRetryAttempt:0,lastRateLimitInfo:void 0,latestSubmittedPrompt:void 0},se=()=>Wt(c.isBusy,W.agentProcessing);r.slashCommands=Jt(r.reg,W.agentProcessing,H,Q.t(`cmdDesc`,{returnObjects:!0}),c.pinned,c.isPaused);let ue=()=>(r.slashCommands=Jt(r.reg,W.agentProcessing,H,Q.t(`cmdDesc`,{returnObjects:!0}),c.pinned,c.isPaused),r.slashCommands);ce(t),k(t,_),le(t),oe(t);let fe=Ft(),G=t.settings.get(`language`)??`auto`;r.currentLang=G===`auto`?ae():G;let pe=nn(t),me=t.settings.get(`theme_preset`),he=t.settings.get(`keybinding_overrides`);z(r.currentLang);let ge=M({currentVersion:de(),lastCheck:t.settings.get(`last_update_check`),autoCheck:t.settings.get(`auto_update_check`)!==!1,persistLastCheck:()=>t.settings.persist({last_update_check:Date.now()})}),_e={get value(){return c},set value(e){c=e}},ve={get value(){return B},set value(e){B=e}},K={get value(){return y},set value(e){y=e}};await new Promise(async a=>{let o=r.schedulePollIntervalRef,s=r.scheduleServiceRef,u=!1,g=()=>{if(!u){u=!0;try{i?.clearBgSubs()}catch{}try{i?.stopBgOutputPoll()}catch{}try{i?.stopBgSubagentPoll()}catch{}r.dispose(),a()}};te.value=g;let y=()=>{setTimeout(g,3e3).unref();try{D.value?.lifecycle.stop()}catch{g()}},b=an({getTui:()=>D.value??null,getSession:()=>c,dispatchAbort:()=>L({kind:`abort`}),clearTodoLayers:()=>{fe.todoList.length!==0&&(fe.todoList=[],D.value?.stores.tasks.setTasks([]),c.session.setTodoList([]))},markUserAborted:()=>{W.userAborted=!0},resetCtrlCCount:()=>{W.ctrlCCount=0},markRestartRequested:()=>{r.restartRequestedRef.value=!0},stopTui:y,isBusy:()=>se()}),T=ie,{historyStore:k,inputHistory:A,externalHistoryCommands:j}=await mn(c,t.settings.get(`history`)?.external),M=Qt({app:t,session:c,getTui:()=>H});i=M;let P=r.runAsyncBashRef,F=r.handleAbortInterceptRef,I=r.runMemoryCaptureRef,z=S(),H=await V(await Bn({runtime:r,app:t,session:c,options:e,tuiRefBox:E,tuiRef:D,turn:W,projState:fe,redState:z,isBusyNow:se,dispatchToEngine:L,stopController:b,finishInteractive:g,stopTuiGuarded:y,applyModel:R,ensureModelUsableForPrompt:ne,refreshSlashCommands:ue,fileCommands:U,modelReady:p,availableModelIds:_,currentModel:O,fmtDisplayModel:N,cfgLang:G,themeRegistry:pe,presetSelection:me,keybindingOverrides:he,continuedExisting:x,convoCount:ee,historyStore:k,inputHistory:A,externalHistoryCommands:j,bg:M,bgController:i,interactive:B,allCommandNames:T}));E.value=H;let{pasteBinder:re}=er({app:t,session:c,options:e,tui:H,memoryConflictRef:n,turn:W,stopController:b,runAsyncBashRef:P,handleAbortInterceptRef:F,runMemoryCaptureRef:I,schedulePollIntervalRef:o,scheduleServiceRef:s});await hr({runtime:r,app:t,options:e,tui:H,tuiRef:D,turn:W,projState:fe,redState:z,stopController:b,themeRegistry:pe,availableModelIds:_,applyModel:R,refreshSlashCommands:ue,retryAccelerate:C,startupCrashGapRef:l,resumedNote:d,resumed:w??void 0,updateCheckPromise:ge,bg:M,ftueController:m,refreshModelsNow:h,persistAvailable:v,cfgLang:G,sessionRef:_e,interactiveRef:ve,modelReadyRef:f,modelsRef:K,pasteBinder:re})});let ye;if(t.codingSessionPool.autoPersist&&c.session.messages().length>0){let t=e.sessionUrl?` --session-url ${e.sessionUrl}`:``,n=e.sessionToken?` --session-token <redacted>`:``;ye=`\n\x1b[2m${Q.t(`cmd.resumeContinueLabel`)}\x1b[0motto --continue ${c.id}${t}${n}\n`}return{restart:r.restartRequested?{sessionId:c.id,memoryTriggered:r.restartMemoryTriggered,resumePrompt:r.restartResumePrompt}:void 0,resumeHint:ye}}finally{i?.clearBgSubs(),i?.stopBgOutputPoll(),i?.stopBgSubagentPoll()}}async function vr(e){if(e.hasParentWorkspace()){let t=e.parentWorkspaceExisted,n=await bt({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=De(e.workspaceDir,{interactive:!0});if(!t.shouldPrompt){e.needsWorkspaceInit()&&await e.confirmWorkspaceInit();return}let n=await xt({root:t.root,language:e.settings.get(`language`)});if(n===`exit`&&(process.stdout.write(`
13
13
  `),process.exit(0)),n===`trust`){Le(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 yr(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 br(e,t){e.prompt&&await O(await t.createSession({listable:!1}).catch(yr),e.prompt,{tui:!0})}async function xr(e,t){if(e.prompt){let n=await te(await t.createSession({listable:!1}).catch(yr),e.prompt);process.stdout.write(JSON.stringify(n,null,2)+`
14
- `)}}function Sr(e){St(e.settings.get(`theme_overrides`)?.markdown)}Ue(`cli.ts imports resolved`);function Cr(e){let t=me({cwd:e,homedir:K()}),n=we(t,new Set(G));if(n.length===0)return[];let r=[``,`插件命令:`];for(let e of n){let n=t.find(t=>t.id===e.pluginId),i=n?Ee(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 wr(e,t,n){let r=me({cwd:n.projectDir,homedir:K()}),i=new Set(G),a=Ce(r,i).get(e);if(!a){let t=ke(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(Ee(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=he({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 Fe(()=>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=Ne(o);if(!s)return process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`contributes.cli\` 但找不到可执行入口,请检查其 manifest 的 bin 字段或重新安装该插件。\n`),1;try{return await Ie(s,t,o.dir)}catch(e){return process.stderr.write(`otto: 插件 "${o.id}" 的 CLI 命令执行失败:${e instanceof Error?e.message:String(e)}\n`),1}}function Tr(e,t){return e.mode===`interactive`&&!e.verbose&&!t?`fatal`:t}function Er(e,t){return e.mode===`interactive`&&!t?`0`:t}function Dr(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 Or(){process.stdin.on(`error`,e=>{e.code}),Ae(),je();let{options:e,subCommand:t,subCommandArgs:n,unresolvedCommandName:r,unresolvedCommandArgs:i}=pe(process.argv);e.shadow&&(process.env.OTTO_SHADOW=`1`);let a=e.verbose?`debug`:e.mode===`interactive`?`fatal`:e.quiet?`error`:`info`;We(a);let o=Tr(e,process.env.OTTO_LOG_LEVEL);o&&(process.env.OTTO_LOG_LEVEL=o);let s=Er(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`?Qe(()=>{}):Qe(e=>process.stderr.write(`${e}\n`)),process.on(`beforeExit`,()=>{process.env.OTTO_LOG_STDERR!==`0`&&Qe(e=>process.stderr.write(`${e}\n`))}),t){let r=fe(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 wr(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-CSd_QYJj.js`).then(e=>e.n),n=t(),r=Cr(e.projectDir);return process.stdout.write([...n,...r].join(`
14
+ `)}}function Sr(e){St(e.settings.get(`theme_overrides`)?.markdown)}Ue(`cli.ts imports resolved`);function Cr(e){let t=me({cwd:e,homedir:K()}),n=we(t,new Set(G));if(n.length===0)return[];let r=[``,`插件命令:`];for(let e of n){let n=t.find(t=>t.id===e.pluginId),i=n?Ee(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 wr(e,t,n){let r=me({cwd:n.projectDir,homedir:K()}),i=new Set(G),a=Ce(r,i).get(e);if(!a){let t=ke(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(Ee(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=he({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 Fe(()=>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=Ne(o);if(!s)return process.stderr.write(`otto: 插件 "${o.id}" 声明了 \`contributes.cli\` 但找不到可执行入口,请检查其 manifest 的 bin 字段或重新安装该插件。\n`),1;try{return await Ie(s,t,o.dir)}catch(e){return process.stderr.write(`otto: 插件 "${o.id}" 的 CLI 命令执行失败:${e instanceof Error?e.message:String(e)}\n`),1}}function Tr(e,t){return e.mode===`interactive`&&!e.verbose&&!t?`fatal`:t}function Er(e,t){return e.mode===`interactive`&&!t?`0`:t}function Dr(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 Or(){process.stdin.on(`error`,e=>{e.code}),Ae(),je();let{options:e,subCommand:t,subCommandArgs:n,unresolvedCommandName:r,unresolvedCommandArgs:i}=pe(process.argv);e.shadow&&(process.env.OTTO_SHADOW=`1`);let a=e.verbose?`debug`:e.mode===`interactive`?`fatal`:e.quiet?`error`:`info`;We(a);let o=Tr(e,process.env.OTTO_LOG_LEVEL);o&&(process.env.OTTO_LOG_LEVEL=o);let s=Er(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`?Qe(()=>{}):Qe(e=>process.stderr.write(`${e}\n`)),process.on(`beforeExit`,()=>{process.env.OTTO_LOG_STDERR!==`0`&&Qe(e=>process.stderr.write(`${e}\n`))}),t){let r=fe(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 wr(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-DDVFO0ly.js`).then(e=>e.n),n=t(),r=Cr(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 et(),l=e.sessionUrl??c?.serviceUrl,u=e.sessionToken??c?.token,d={},f=Ke(`new App() ctor`,()=>he({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:Ye}},onMemoryConflict:(e,t)=>d.current?.(e,t)}));await Ge(`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 需告警)`)}),Sr(f),ze(Re);let p=!1,m=()=>{p&&(e.mode===`interactive`&&Ut(),process.exit(1)),p=!0,Promise.race([f.stop(),new Promise(e=>setTimeout(e,1e4))]).finally(()=>{e.mode===`interactive`&&(Ut(),Ht()),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:${Ze}`,{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 br(e,f);break;case`json`:await xr(e,f);break;case`interactive`:{await vr(f);let t=await _r(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`&&(Ut(),Ht()),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=be(process.execPath,Dr(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(Ht(),v)try{process.stdout.write(v)}catch{}process.exit(process.exitCode??0)}return 0}Or().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{Or as runCli};
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{ot as e}from"./command-dispatcher-B2Xx3NP7.js";import{n as t}from"./schedule-C_uHI2M8.js";import{t as n}from"./backend-handler-DUafuNWw.js";import{globalAgentJobRegistry as r}from"@x-otto/runtime";import{DEFAULT_SCHEDULE_CONFIG as i,FireLogger as a,InProcessEventTrigger as o,JobFireTarget as s,ScheduleRegistry as c,SchedulerService as l,SessionFireTarget as u,SubscriberFireTarget as d,createLocalFireOwnership as f,createRemoteFireOwnership as p,createRemoteScheduleStore as m,createScheduleStore as h,parseCron as g}from"@x-otto/schedule";import{z as _}from"zod";function v(e){let t=()=>({tasks:e.list(),runningTaskIds:[...e.getRunningTaskIds()],isFireOwner:e.isFireOwner(),fireOwnerFailureReason:e.fireOwnerFailureReason()});return{...n({"schedule.list":{params:_.object({}),run:async()=>t()},"schedule.add":{params:_.object({name:_.string(),prompt:_.string(),cronExpression:_.string(),recurring:_.boolean(),target:_.enum([`job`,`session`]).optional()}),run:async t=>{try{let n=e.add({name:t.name,prompt:t.prompt,cronExpression:t.cronExpression,recurring:t.recurring,origin:`user`,target:t.target});return{ok:!0,taskId:n.id,name:n.name,target:n.target}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}},"schedule.update":{params:_.object({taskId:_.string(),name:_.string().optional(),prompt:_.string().optional(),cronExpression:_.string().optional(),enabled:_.boolean().optional()}),run:async t=>{let n={};return t.name!==void 0&&(n.name=t.name),t.prompt!==void 0&&(n.prompt=t.prompt),t.cronExpression!==void 0&&(n.cronExpression=t.cronExpression),t.enabled!==void 0&&(n.enabled=t.enabled),{ok:e.update(t.taskId,n)}}},"schedule.runNow":{params:_.object({taskId:_.string()}),run:async t=>(e.runNow(t.taskId),{ok:!0})},"schedule.toggle":{params:_.object({taskId:_.string(),enabled:_.boolean()}),run:async t=>({ok:e.update(t.taskId,{enabled:t.enabled})})},"schedule.cancel":{params:_.object({taskId:_.string()}),run:async t=>e.cancel(t.taskId)},"schedule.remove":{params:_.object({taskId:_.string()}),run:async t=>({ok:e.remove(t.taskId)})},"schedule.readLogs":{params:_.object({taskId:_.string(),limit:_.number().optional()}),run:async t=>({entries:e.readFireLogs(t.taskId,t.limit??20)})},"schedule.parseCron":{params:_.object({expr:_.string()}),run:async e=>{try{return{ok:!0,next:g(e.expr).toISOString()}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}}},`schedule`),getSnapshot:t}}var y=e({createFollowUpCurrentSession:()=>b,setupScheduleService:()=>x});function b(e){return t=>{let n=e.value;if(n.id!==t.boundSessionId||n.isPaused||n.status===`archived`)return!1;try{return n.prompt(t.prompt,{streamingBehavior:`followUp`}).catch(()=>{}),!0}catch{return!1}}}function x(e,n){let{sessionRef:g,tui:_,remoteConfig:y}=n,x=e.workspaceRef?.key??`default`,S=new c,C,w;if(e.storage.remoteSessionConfigured&&y){let e=async()=>({token:y.sessionToken});C=m({sessionUrl:y.sessionUrl,getAuth:e,wsKey:x}),w=p({sessionUrl:y.sessionUrl,wsKey:x,getAuth:e})}else C=h(x),w=f(x);let T=new a(i),E=[];g&&E.push(new d({notify:(t,n)=>e.notifyPluginServiceSchedule({pluginId:t.pluginId,serviceId:t.serviceId},n),fireLogger:T}),new u({followUp:b(g),getSessionId:()=>g.value.id,fireLogger:T})),E.push(new s({jobRegistry:r,startJob:t=>({id:e.agentJobs.start({title:t.title,prompt:t.prompt,sessionId:t.sessionId,origin:t.origin,...t.model?{model:t.model}:{}}).id}),...g?{getSessionId:()=>g.value.id}:{},retryBackoffMs:e.getResilienceConfig().schedule.retryBackoffMs,fireLogger:T,needsInputMaxExtensionFactor:i.needsInputMaxExtensionFactor}));let D=new l({registry:S,store:C,ownership:w,fireTargets:E,triggers:[new o({jobRegistry:r})]});D.start().then(()=>{if(!g){let t=D.list().filter(e=>e.target===`session`||!!e.subscriber).length;if(t>0){let n=`${t} 个任务(session/subscriber 类)在 daemon 无人值守形态不会投递,仅 job 类任务执行`;e.logger?.warn?.({count:t},`[schedule] headless mode: non-job tasks skipped`),new a(i).write(`daemon-scheduler`,`headless aggregate warning: ${n}`)}}}).catch(t=>{e.logger?.warn?.({err:t instanceof Error?t.message:String(t)},`[schedule] scheduler failed to start`)}),t(D),e.setScheduleService(D);let O=v(D);if(e.panelBackendController.registerInProcessBackend(`plugin-schedule`,O.call),!_)return{pollInterval:void 0,scheduler:D};let k=setInterval(()=>{if(!_)return;let e=D.list().map(e=>({id:e.id,name:e.name,prompt:e.prompt,cronExpression:e.cronExpression,enabled:e.enabled,recurring:e.recurring,nextFireAt:e.nextFireAt,lastFiredAt:e.lastFiredAt,lastFireFailed:e.lastFireFailed,lastFireError:e.lastFireError,lastFireCancelled:e.lastFireCancelled}));_.stores.tasks.setScheduleTasks(e)},5e3);return k.unref(),{pollInterval:k,scheduler:D}}export{x as n,y as t};
3
- //# sourceMappingURL=interactive-schedule-DqvuQWjX.js.map
2
+ import{ot as e}from"./command-dispatcher-CY-UqqPK.js";import{n as t}from"./schedule-C_uHI2M8.js";import{t as n}from"./backend-handler-DUafuNWw.js";import{globalAgentJobRegistry as r}from"@x-otto/runtime";import{DEFAULT_SCHEDULE_CONFIG as i,FireLogger as a,InProcessEventTrigger as o,JobFireTarget as s,ScheduleRegistry as c,SchedulerService as l,SessionFireTarget as u,SubscriberFireTarget as d,createLocalFireOwnership as f,createRemoteFireOwnership as p,createRemoteScheduleStore as m,createScheduleStore as h,parseCron as g}from"@x-otto/schedule";import{z as _}from"zod";function v(e){let t=()=>({tasks:e.list(),runningTaskIds:[...e.getRunningTaskIds()],isFireOwner:e.isFireOwner(),fireOwnerFailureReason:e.fireOwnerFailureReason()});return{...n({"schedule.list":{params:_.object({}),run:async()=>t()},"schedule.add":{params:_.object({name:_.string(),prompt:_.string(),cronExpression:_.string(),recurring:_.boolean(),target:_.enum([`job`,`session`]).optional()}),run:async t=>{try{let n=e.add({name:t.name,prompt:t.prompt,cronExpression:t.cronExpression,recurring:t.recurring,origin:`user`,target:t.target});return{ok:!0,taskId:n.id,name:n.name,target:n.target}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}},"schedule.update":{params:_.object({taskId:_.string(),name:_.string().optional(),prompt:_.string().optional(),cronExpression:_.string().optional(),enabled:_.boolean().optional()}),run:async t=>{let n={};return t.name!==void 0&&(n.name=t.name),t.prompt!==void 0&&(n.prompt=t.prompt),t.cronExpression!==void 0&&(n.cronExpression=t.cronExpression),t.enabled!==void 0&&(n.enabled=t.enabled),{ok:e.update(t.taskId,n)}}},"schedule.runNow":{params:_.object({taskId:_.string()}),run:async t=>(e.runNow(t.taskId),{ok:!0})},"schedule.toggle":{params:_.object({taskId:_.string(),enabled:_.boolean()}),run:async t=>({ok:e.update(t.taskId,{enabled:t.enabled})})},"schedule.cancel":{params:_.object({taskId:_.string()}),run:async t=>e.cancel(t.taskId)},"schedule.remove":{params:_.object({taskId:_.string()}),run:async t=>({ok:e.remove(t.taskId)})},"schedule.readLogs":{params:_.object({taskId:_.string(),limit:_.number().optional()}),run:async t=>({entries:e.readFireLogs(t.taskId,t.limit??20)})},"schedule.parseCron":{params:_.object({expr:_.string()}),run:async e=>{try{return{ok:!0,next:g(e.expr).toISOString()}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}}},`schedule`),getSnapshot:t}}var y=e({createFollowUpCurrentSession:()=>b,setupScheduleService:()=>x});function b(e){return t=>{let n=e.value;if(n.id!==t.boundSessionId||n.isPaused||n.status===`archived`)return!1;try{return n.prompt(t.prompt,{streamingBehavior:`followUp`}).catch(()=>{}),!0}catch{return!1}}}function x(e,n){let{sessionRef:g,tui:_,remoteConfig:y}=n,x=e.workspaceRef?.key??`default`,S=new c,C,w;if(e.storage.remoteSessionConfigured&&y){let e=async()=>({token:y.sessionToken});C=m({sessionUrl:y.sessionUrl,getAuth:e,wsKey:x}),w=p({sessionUrl:y.sessionUrl,wsKey:x,getAuth:e})}else C=h(x),w=f(x);let T=new a(i),E=[];g&&E.push(new d({notify:(t,n)=>e.notifyPluginServiceSchedule({pluginId:t.pluginId,serviceId:t.serviceId},n),fireLogger:T}),new u({followUp:b(g),getSessionId:()=>g.value.id,fireLogger:T})),E.push(new s({jobRegistry:r,startJob:t=>({id:e.agentJobs.start({title:t.title,prompt:t.prompt,sessionId:t.sessionId,origin:t.origin,...t.model?{model:t.model}:{}}).id}),...g?{getSessionId:()=>g.value.id}:{},retryBackoffMs:e.getResilienceConfig().schedule.retryBackoffMs,fireLogger:T,needsInputMaxExtensionFactor:i.needsInputMaxExtensionFactor}));let D=new l({registry:S,store:C,ownership:w,fireTargets:E,triggers:[new o({jobRegistry:r})]});D.start().then(()=>{if(!g){let t=D.list().filter(e=>e.target===`session`||!!e.subscriber).length;if(t>0){let n=`${t} 个任务(session/subscriber 类)在 daemon 无人值守形态不会投递,仅 job 类任务执行`;e.logger?.warn?.({count:t},`[schedule] headless mode: non-job tasks skipped`),new a(i).write(`daemon-scheduler`,`headless aggregate warning: ${n}`)}}}).catch(t=>{e.logger?.warn?.({err:t instanceof Error?t.message:String(t)},`[schedule] scheduler failed to start`)}),t(D),e.setScheduleService(D);let O=v(D);if(e.panelBackendController.registerInProcessBackend(`plugin-schedule`,O.call),!_)return{pollInterval:void 0,scheduler:D};let k=setInterval(()=>{if(!_)return;let e=D.list().map(e=>({id:e.id,name:e.name,prompt:e.prompt,cronExpression:e.cronExpression,enabled:e.enabled,recurring:e.recurring,nextFireAt:e.nextFireAt,lastFiredAt:e.lastFiredAt,lastFireFailed:e.lastFireFailed,lastFireError:e.lastFireError,lastFireCancelled:e.lastFireCancelled}));_.stores.tasks.setScheduleTasks(e)},5e3);return k.unref(),{pollInterval:k,scheduler:D}}export{x as n,y as t};
3
+ //# sourceMappingURL=interactive-schedule-Dpl1p0Az.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-schedule-DqvuQWjX.js","names":[],"sources":["../src/commands/schedule-backend-methods.ts","../src/commands/interactive-schedule.ts"],"sourcesContent":["/**\n * backend-methods.ts —— RFC-349:schedule 面板 in-process backend methods。\n *\n * 与 browser-use/mobile-use 的区别:那些插件的 backend methods 跑在 MCP server 子进程里。\n * schedule 的 SchedulerService 依赖 `AgentJobService`/`sessionRef`/`notifySubscriber`——\n * 这些只能存活在 App 主进程,无法搬到子进程。故本文件注册为 **in-process backend handler**\n * (经 `PanelBackendController.registerInProcessBackend`),面板 `usePanelBackend().call()`\n * 走同一条路径,但执行发生在 App 主进程内。\n *\n * RFC-439:分发收敛为类型化注册表(backend-handler.ts)——方法 = zod schema + run,\n * 参数校验/前缀剥离/未知方法 fail-closed 由注册表统一承担,不再手写 switch/双重断言。\n *\n * 面板侧调用经 `toBackendWireMethod` 统一加 `backend/` 前缀,注册表接收时剥离前缀。\n */\nimport { z } from 'zod'\nimport type { SchedulerService } from '@x-otto/schedule'\nimport { parseCron } from '@x-otto/schedule'\nimport type { ScheduledTask } from '@x-otto/schedule'\nimport { createBackendHandler, type BackendMethod } from './backend-handler'\n\n/** 面板状态快照(经 pushState 推送或 call 返回)。 */\nexport interface SchedulePanelState {\n tasks: ScheduledTask[]\n runningTaskIds: string[]\n isFireOwner: boolean\n fireOwnerFailureReason: string | undefined\n}\n\nexport function createScheduleBackendHandler(scheduler: SchedulerService): {\n call: (method: string, params: Record<string, unknown>) => Promise<unknown>\n getSnapshot: () => SchedulePanelState\n} {\n const getSnapshot = (): SchedulePanelState => ({\n tasks: scheduler.list(),\n runningTaskIds: [...scheduler.getRunningTaskIds()],\n isFireOwner: scheduler.isFireOwner(),\n fireOwnerFailureReason: scheduler.fireOwnerFailureReason(),\n })\n\n // RFC-439:satisfies 保留各方法的 zod infer(不用默认泛型宽化致 run 参数塌成 unknown)。\n const methods = {\n 'schedule.list': {\n params: z.object({}),\n run: async () => getSnapshot(),\n },\n 'schedule.add': {\n params: z.object({\n name: z.string(),\n prompt: z.string(),\n cronExpression: z.string(),\n recurring: z.boolean(),\n // RFC-357 D3 (M2): optional session-local target, requires fire ownership.\n target: z.enum(['job', 'session']).optional(),\n }),\n run: async (params: {\n name: string\n prompt: string\n cronExpression: string\n recurring: boolean\n target?: 'job' | 'session'\n }) => {\n // RFC-357 D2: scheduler.add() throws when target:'session' is requested without\n // fire ownership — surface that as a structured error, not an unhandled rejection.\n try {\n const task = scheduler.add({\n name: params.name,\n prompt: params.prompt,\n cronExpression: params.cronExpression,\n recurring: params.recurring,\n origin: 'user' as const,\n target: params.target,\n })\n return { ok: true, taskId: task.id, name: task.name, target: task.target }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) }\n }\n },\n },\n\n 'schedule.update': {\n params: z.object({\n taskId: z.string(),\n name: z.string().optional(),\n prompt: z.string().optional(),\n cronExpression: z.string().optional(),\n enabled: z.boolean().optional(),\n }),\n run: async (params: {\n taskId: string\n name?: string\n prompt?: string\n cronExpression?: string\n enabled?: boolean\n }) => {\n const patch: { name?: string; prompt?: string; cronExpression?: string; enabled?: boolean } = {}\n if (params.name !== undefined) patch.name = params.name\n if (params.prompt !== undefined) patch.prompt = params.prompt\n if (params.cronExpression !== undefined) patch.cronExpression = params.cronExpression\n if (params.enabled !== undefined) patch.enabled = params.enabled\n const ok = scheduler.update(params.taskId, patch)\n return { ok }\n },\n },\n\n 'schedule.runNow': {\n params: z.object({ taskId: z.string() }),\n run: async (params: { taskId: string }) => {\n scheduler.runNow(params.taskId)\n return { ok: true }\n },\n },\n\n 'schedule.toggle': {\n params: z.object({ taskId: z.string(), enabled: z.boolean() }),\n run: async (params: { taskId: string; enabled: boolean }) => {\n const ok = scheduler.update(params.taskId, { enabled: params.enabled })\n return { ok }\n },\n },\n\n 'schedule.cancel': {\n params: z.object({ taskId: z.string() }),\n run: async (params: { taskId: string }) => scheduler.cancel(params.taskId),\n },\n\n 'schedule.remove': {\n params: z.object({ taskId: z.string() }),\n run: async (params: { taskId: string }) => {\n const removed = scheduler.remove(params.taskId)\n return { ok: removed }\n },\n },\n\n 'schedule.readLogs': {\n params: z.object({ taskId: z.string(), limit: z.number().optional() }),\n run: async (params: { taskId: string; limit?: number }) => {\n const entries = scheduler.readFireLogs(params.taskId, params.limit ?? 20)\n return { entries }\n },\n },\n\n 'schedule.parseCron': {\n params: z.object({ expr: z.string() }),\n run: async (params: { expr: string }) => {\n try {\n const next = parseCron(params.expr)\n return { ok: true, next: next.toISOString() }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) }\n }\n },\n },\n } satisfies Record<string, BackendMethod>\n\n return { ...createBackendHandler(methods, 'schedule'), getSnapshot }\n}\n","/**\n * 定时任务 TUI 交互管线(状态栏/事件/toast 接线)。\n */\n// RFC-161 M2:SchedulerService 等实现已迁至 @x-otto/schedule,直连新真源\n// (coding 的 re-export shim 仅供尚未迁移的其余消费方使用)。\nimport { SchedulerService, ScheduleRegistry, createScheduleStore, createLocalFireOwnership, createRemoteScheduleStore, createRemoteFireOwnership, FireLogger, DEFAULT_SCHEDULE_CONFIG, JobFireTarget, SessionFireTarget, SubscriberFireTarget, InProcessEventTrigger } from '@x-otto/schedule'\nimport { globalAgentJobRegistry } from '@x-otto/runtime'\nimport { setScheduleService } from './handlers/schedule'\nimport { createScheduleBackendHandler } from './schedule-backend-methods'\n\nimport type { App, AgentSession } from '@x-otto/coding'\nimport type { ScheduleStore, FireOwnership, FireTarget } from '@x-otto/schedule'\nimport type { TuiHandle } from '@x-otto/tui'\n\n/** Remote connection details, threaded from CLIOptions.sessionUrl/sessionToken. */\nexport interface ScheduleRemoteConfig {\n sessionUrl: string\n sessionToken: string\n}\n\n/**\n * RFC-357 D1/D2(M2):`SchedulerDeps.followUpCurrentSession` 的真实实现——把 session-local\n * 任务的 prompt 注入 `boundSessionId` 对应的当前会话。\n *\n * 三重失效校验(均转 `false`,不抛错——调度器侧 `fireSession()` 把异常/false 统一折叠为\n * fire 失败记日志,不重试,同 `notifySubscriber` 缺省行为的旁路信号纪律):\n *\n * 1. **会话身份不匹配**(独立评审 R1):`sessionRef` 是活引用,RFC-234 attach/detach 会\n * 在同一进程内重新赋值它——若 `boundSessionId` 与当前 `sessionRef.value.id` 不等,说明\n * 用户已切到别的会话,绝不能把内容误投进一个不相干的对话。\n * 2. **paused 态**(D1):暂停会话收到注入会被 `prompt()` 判定为 idle 直接起新回合,\n * 这实质上绕过了用户暂停会话的意图——先查 `isPaused` 拒绝。\n * 3. **archived 态 / 会话已销毁**(D1):`AgentSession.status` 是同步 getter,先在此\n * 同步判断 `'archived'` 拒绝(M3 e2e 测试发现的修订——`prompt()` 是 `async` 函数,\n * 其内部对 archived 态的检查会抛出**被拒绝的 Promise** 而非同步异常;`void\n * session.prompt(...)` 外面包一层 `try/catch` 完全捕获不到它,会变成未处理的\n * promise rejection,在真实调度场景下会让 Node 进程崩溃)。为兜底 `ensureNotDisposed()`\n * 等其他潜在的异步失效路径,仍链一个 `.catch()`(fire-and-forget,不 await、不重试,\n * 只是防止任何未预见的异步异常变成未处理 rejection)。\n */\nexport function createFollowUpCurrentSession(\n sessionRef: { readonly value: AgentSession },\n): (task: { prompt: string; boundSessionId: string; name: string; origin: 'user' | 'model' }) => boolean {\n return (task) => {\n const session = sessionRef.value\n\n if (session.id !== task.boundSessionId) return false\n if (session.isPaused) return false\n if (session.status === 'archived') return false\n\n try {\n // 不 await:fire() 是 fire-and-forget 的旁路信号语义(同 fireSubscriber),\n // prompt() 的 busy/idle 路由与错误处理已在 AgentSession 内部完成;这里只需\n // 同步判断\"是否成功发起了注入\"(streamingBehavior:'followUp' 使 prompt()\n // 同步完成入队/发起,不阻塞到回合真正跑完)。`.catch()` 兜底任何异步异常\n // (见上方文档注释——不能只靠 try/catch,那只捕获同步抛出)。\n void session.prompt(task.prompt, { streamingBehavior: 'followUp' }).catch(() => {})\n return true\n } catch {\n // 理论上不会走到这——保留作为同步异常的最后防线。\n return false\n }\n }\n}\n\nexport interface ScheduleServiceSetupOptions {\n /** 交互会话(TUI 装配传;serve/daemon 无人值守装配不传——job-only 模式)。 */\n sessionRef?: { readonly value: AgentSession }\n /** TUI 句柄(仅交互模式;缺失时跳过 5s taskStore 轮询)。 */\n tui?: TuiHandle\n remoteConfig?: ScheduleRemoteConfig\n}\n\nexport function setupScheduleService(\n app: App,\n opts: ScheduleServiceSetupOptions,\n): { pollInterval: ReturnType<typeof setInterval> | undefined; scheduler: SchedulerService } {\n const { sessionRef, tui, remoteConfig } = opts\n // Wire schedule service for /schedule command + cron tools\n const workspaceKey = app.workspaceRef?.key ?? 'default'\n const scheduleRegistry = new ScheduleRegistry()\n\n let scheduleStore: ScheduleStore\n let scheduleOwnership: FireOwnership\n if (app.storage.remoteSessionConfigured && remoteConfig) {\n const getAuth = async (): Promise<{ token: string }> => ({ token: remoteConfig.sessionToken })\n scheduleStore = createRemoteScheduleStore({\n sessionUrl: remoteConfig.sessionUrl,\n getAuth,\n wsKey: workspaceKey,\n })\n scheduleOwnership = createRemoteFireOwnership({\n sessionUrl: remoteConfig.sessionUrl,\n wsKey: workspaceKey,\n getAuth,\n })\n } else {\n scheduleStore = createScheduleStore(workspaceKey)\n scheduleOwnership = createLocalFireOwnership(workspaceKey)\n }\n\n // RFC-406 D7:投递目标从 SchedulerDeps 内联字段拆为 FireTarget handler 列表。\n // 注册顺序即优先级:subscriber > session > job(保持旧 fire() 分支优先级)。\n //\n // RFC-435 R1(独立核对修复②):SubscriberFireTarget **仅在有 sessionRef 的交互形态注册**。\n // 此前无条件注册使 headless(serve/daemon)实际装配 = Subscriber+Job 两件,违背 R1\n // 「daemon 形态只装配 JobFireTarget」与用户 grill 确认的范围收敛(方案 A:只放 job)。\n // 插件 schedules 声明的 subscriber 任务在 headless 形态走 fire log 降级(D3),\n // 不投递——与「daemon 不启用 subscriber 投递」的决策一致(RFC §2 非目标)。\n const fireLogger = new FireLogger(DEFAULT_SCHEDULE_CONFIG)\n const fireTargets: FireTarget[] = []\n\n if (sessionRef) {\n fireTargets.push(\n // RFC-327 D2:订阅者到点通知的窄端口——scheduler 只交出纯数据标识,\n // 由 App 决定投给哪个运行中的 service(并强制\"插件仍激活\"这一 revoke 语义)。\n // 该路径**不开会话授权 epoch**(schedule.tick 无 sessionId),见 App 侧注释。\n new SubscriberFireTarget({\n notify: (subscriber, tick) =>\n app.notifyPluginServiceSchedule(\n { pluginId: subscriber.pluginId, serviceId: subscriber.serviceId },\n tick,\n ),\n fireLogger,\n }),\n // RFC-357 D1/D2(M2):session-local 任务到点后的投递端口 + 创建时绑定的 sessionId。\n new SessionFireTarget({\n followUp: createFollowUpCurrentSession(sessionRef),\n getSessionId: () => sessionRef.value.id,\n fireLogger,\n }),\n )\n }\n\n // RFC-435 D1:job 类任务不依赖交互会话(detached run + worktree 隔离),\n // 交互与无人值守形态都注册。getSessionId 仅在有 sessionRef 时提供——\n // 无人值守(serve/daemon)缺省,job 任务创建时不绑定 session(target 非 session)。\n fireTargets.push(\n new JobFireTarget({\n jobRegistry: globalAgentJobRegistry,\n startJob: (input) => ({\n id: app.agentJobs.start({\n title: input.title,\n prompt: input.prompt,\n sessionId: input.sessionId,\n origin: input.origin,\n // RFC-438:per-job 模型指定透传(task.modelId/thinkingLevel)\n ...(input.model ? { model: input.model } : {}),\n }).id,\n }),\n ...(sessionRef ? { getSessionId: () => sessionRef.value.id } : {}),\n // RFC-230:本函数在 TUI 启动流程内被调用,晚于 app.start()(settings 已 load),\n // getResilienceConfig() 调用安全。真实构造点(非 packages/coding App 内部),\n // 见 RFC-230 §3 D6 Scheduler 小节二轮评审 P2 修正。\n retryBackoffMs: app.getResilienceConfig().schedule.retryBackoffMs,\n fireLogger,\n needsInputMaxExtensionFactor: DEFAULT_SCHEDULE_CONFIG.needsInputMaxExtensionFactor,\n }),\n )\n\n const scheduler = new SchedulerService({\n registry: scheduleRegistry,\n store: scheduleStore,\n ownership: scheduleOwnership,\n fireTargets,\n // RFC-423:进程内事件触发器——监听 AgentJobRegistry 终态(如 job diff applied),\n // 事件满足时把 prompt 注入当前对话(配 target:'session')。三重死循环闸门内建\n // (自产 job 排除 + add() 拒绝 job 投递 + 频率 debounce)。无人值守(无 sessionRef)\n // 时事件触发投递目标无会话——fire 时跳过并记日志(fireLogger),见 RFC-435 D2。\n triggers: [new InProcessEventTrigger({ jobRegistry: globalAgentJobRegistry })],\n })\n // Non-critical background feature — a bootstrap failure here must not take down\n // the whole interactive session (fire-and-forget start() would otherwise surface\n // as an unhandled rejection and crash the process).\n void scheduler.start().then(() => {\n // RFC-435 D3 聚合告警(独立核对修复①):必须在 start() **完成**后检查——start()\n // 是 async(首个 await tryAcquire()),此前同步 list() 拿到的是空 registry,\n // nonJobCount 恒为 0,告警是生产死代码(评审 A.3 坐实)。移到 then() 内,\n // registry 已加载,计数真实。\n if (!sessionRef) {\n const nonJobCount = scheduler.list().filter((t) => t.target === 'session' || !!t.subscriber).length\n if (nonJobCount > 0) {\n const msg = `${nonJobCount} 个任务(session/subscriber 类)在 daemon 无人值守形态不会投递,仅 job 类任务执行`\n app.logger?.warn?.({ count: nonJobCount }, '[schedule] headless mode: non-job tasks skipped')\n new FireLogger(DEFAULT_SCHEDULE_CONFIG).write('daemon-scheduler', `headless aggregate warning: ${msg}`)\n }\n }\n }).catch((err) => {\n // RFC-435 R9:失败日志走 logger 而非 console(serve 无人值守场景 console 无观察者)。\n app.logger?.warn?.({ err: err instanceof Error ? err.message : String(err) }, '[schedule] scheduler failed to start')\n })\n setScheduleService(scheduler)\n app.setScheduleService(scheduler) // A1: let cron_* model tools reach this scheduler\n\n // RFC-349 M1:注册 in-process backend handler——面板经 usePanelBackend().call() 访问 scheduler\n const scheduleBackend = createScheduleBackendHandler(scheduler)\n app.panelBackendController.registerInProcessBackend('plugin-schedule', scheduleBackend.call)\n\n // Push schedule tasks to TUI store every 5 seconds (status bar / task list).\n // RFC-349 M2: panel data is now fetched via backend.call('schedule.list') —\n // this interval only updates the TUI taskStore for status bar display.\n // RFC-435 D1:serve/daemon 无 tui → 不建轮询(无人值守无状态栏消费方)。\n if (!tui) return { pollInterval: undefined, scheduler }\n\n const pollInterval = setInterval(() => {\n if (!tui) return\n const tasks = scheduler.list()\n const taskSummaries = tasks.map((t) => ({\n id: t.id,\n name: t.name,\n prompt: t.prompt,\n cronExpression: t.cronExpression,\n enabled: t.enabled,\n recurring: t.recurring,\n nextFireAt: t.nextFireAt,\n lastFiredAt: t.lastFiredAt,\n lastFireFailed: t.lastFireFailed,\n lastFireError: t.lastFireError,\n lastFireCancelled: t.lastFireCancelled,\n }))\n tui.stores.tasks.setScheduleTasks(taskSummaries)\n }, 5000)\n pollInterval.unref()\n\n return { pollInterval, scheduler }\n}\n"],"mappings":";8jBA4BA,SAAgB,EAA6B,EAG3C,CACA,IAAM,OAAyC,CAC7C,MAAO,EAAU,MAAM,CACvB,eAAgB,CAAC,GAAG,EAAU,mBAAmB,CAAC,CAClD,YAAa,EAAU,aAAa,CACpC,uBAAwB,EAAU,wBAAwB,CAC3D,EAqHD,MAAO,CAAE,GAAG,EAlHI,CACd,gBAAiB,CACf,OAAQ,EAAE,OAAO,EAAE,CAAC,CACpB,IAAK,SAAY,GAAa,CAC/B,CACD,eAAgB,CACd,OAAQ,EAAE,OAAO,CACf,KAAM,EAAE,QAAQ,CAChB,OAAQ,EAAE,QAAQ,CAClB,eAAgB,EAAE,QAAQ,CAC1B,UAAW,EAAE,SAAS,CAEtB,OAAQ,EAAE,KAAK,CAAC,MAAO,UAAU,CAAC,CAAC,UAAU,CAC9C,CAAC,CACF,IAAK,KAAO,IAMN,CAGJ,GAAI,CACF,IAAM,EAAO,EAAU,IAAI,CACzB,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,eAAgB,EAAO,eACvB,UAAW,EAAO,UAClB,OAAQ,OACR,OAAQ,EAAO,OAChB,CAAC,CACF,MAAO,CAAE,GAAI,GAAM,OAAQ,EAAK,GAAI,KAAM,EAAK,KAAM,OAAQ,EAAK,OAAQ,OACnE,EAAK,CACZ,MAAO,CAAE,GAAI,GAAO,MAAO,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAAE,GAGlF,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CACf,OAAQ,EAAE,QAAQ,CAClB,KAAM,EAAE,QAAQ,CAAC,UAAU,CAC3B,OAAQ,EAAE,QAAQ,CAAC,UAAU,CAC7B,eAAgB,EAAE,QAAQ,CAAC,UAAU,CACrC,QAAS,EAAE,SAAS,CAAC,UAAU,CAChC,CAAC,CACF,IAAK,KAAO,IAMN,CACJ,IAAM,EAAwF,EAAE,CAMhG,OALI,EAAO,OAAS,IAAA,KAAW,EAAM,KAAO,EAAO,MAC/C,EAAO,SAAW,IAAA,KAAW,EAAM,OAAS,EAAO,QACnD,EAAO,iBAAmB,IAAA,KAAW,EAAM,eAAiB,EAAO,gBACnE,EAAO,UAAY,IAAA,KAAW,EAAM,QAAU,EAAO,SAElD,CAAE,GADE,EAAU,OAAO,EAAO,OAAQ,EAAM,CACpC,EAEhB,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,CAAC,CACxC,IAAK,KAAO,KACV,EAAU,OAAO,EAAO,OAAO,CACxB,CAAE,GAAI,GAAM,EAEtB,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,QAAS,EAAE,SAAS,CAAE,CAAC,CAC9D,IAAK,KAAO,KAEH,CAAE,GADE,EAAU,OAAO,EAAO,OAAQ,CAAE,QAAS,EAAO,QAAS,CAAC,CAC1D,EAEhB,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,CAAC,CACxC,IAAK,KAAO,IAA+B,EAAU,OAAO,EAAO,OAAO,CAC3E,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,CAAC,CACxC,IAAK,KAAO,KAEH,CAAE,GADO,EAAU,OAAO,EAAO,OAAO,CACzB,EAEzB,CAED,oBAAqB,CACnB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,MAAO,EAAE,QAAQ,CAAC,UAAU,CAAE,CAAC,CACtE,IAAK,KAAO,KAEH,CAAE,QADO,EAAU,aAAa,EAAO,OAAQ,EAAO,OAAS,GAAG,CACvD,EAErB,CAED,qBAAsB,CACpB,OAAQ,EAAE,OAAO,CAAE,KAAM,EAAE,QAAQ,CAAE,CAAC,CACtC,IAAK,KAAO,IAA6B,CACvC,GAAI,CAEF,MAAO,CAAE,GAAI,GAAM,KADN,EAAU,EAAO,KAAK,CACL,aAAa,CAAE,OACtC,EAAK,CACZ,MAAO,CAAE,GAAI,GAAO,MAAO,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAAE,GAGlF,CACF,CAEyC,WAAW,CAAE,cAAa,0EClHtE,SAAgB,EACd,EACuG,CACvG,MAAQ,IAAS,CACf,IAAM,EAAU,EAAW,MAI3B,GAFI,EAAQ,KAAO,EAAK,gBACpB,EAAQ,UACR,EAAQ,SAAW,WAAY,MAAO,GAE1C,GAAI,CAOF,OADK,EAAQ,OAAO,EAAK,OAAQ,CAAE,kBAAmB,WAAY,CAAC,CAAC,UAAY,GAAG,CAC5E,QACD,CAEN,MAAO,KAab,SAAgB,EACd,EACA,EAC2F,CAC3F,GAAM,CAAE,aAAY,MAAK,gBAAiB,EAEpC,EAAe,EAAI,cAAc,KAAO,UACxC,EAAmB,IAAI,EAEzB,EACA,EACJ,GAAI,EAAI,QAAQ,yBAA2B,EAAc,CACvD,IAAM,EAAU,UAAyC,CAAE,MAAO,EAAa,aAAc,EAC7F,EAAgB,EAA0B,CACxC,WAAY,EAAa,WACzB,UACA,MAAO,EACR,CAAC,CACF,EAAoB,EAA0B,CAC5C,WAAY,EAAa,WACzB,MAAO,EACP,UACD,CAAC,MAEF,EAAgB,EAAoB,EAAa,CACjD,EAAoB,EAAyB,EAAa,CAW5D,IAAM,EAAa,IAAI,EAAW,EAAwB,CACpD,EAA4B,EAAE,CAEhC,GACF,EAAY,KAIV,IAAI,EAAqB,CACvB,QAAS,EAAY,IACnB,EAAI,4BACF,CAAE,SAAU,EAAW,SAAU,UAAW,EAAW,UAAW,CAClE,EACD,CACH,aACD,CAAC,CAEF,IAAI,EAAkB,CACpB,SAAU,EAA6B,EAAW,CAClD,iBAAoB,EAAW,MAAM,GACrC,aACD,CAAC,CACH,CAMH,EAAY,KACV,IAAI,EAAc,CAChB,YAAa,EACb,SAAW,IAAW,CACpB,GAAI,EAAI,UAAU,MAAM,CACtB,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,UAAW,EAAM,UACjB,OAAQ,EAAM,OAEd,GAAI,EAAM,MAAQ,CAAE,MAAO,EAAM,MAAO,CAAG,EAAE,CAC9C,CAAC,CAAC,GACJ,EACD,GAAI,EAAa,CAAE,iBAAoB,EAAW,MAAM,GAAI,CAAG,EAAE,CAIjE,eAAgB,EAAI,qBAAqB,CAAC,SAAS,eACnD,aACA,6BAA8B,EAAwB,6BACvD,CAAC,CACH,CAED,IAAM,EAAY,IAAI,EAAiB,CACrC,SAAU,EACV,MAAO,EACP,UAAW,EACX,cAKA,SAAU,CAAC,IAAI,EAAsB,CAAE,YAAa,EAAwB,CAAC,CAAC,CAC/E,CAAC,CAIG,EAAU,OAAO,CAAC,SAAW,CAKhC,GAAI,CAAC,EAAY,CACf,IAAM,EAAc,EAAU,MAAM,CAAC,OAAQ,GAAM,EAAE,SAAW,WAAa,CAAC,CAAC,EAAE,WAAW,CAAC,OAC7F,GAAI,EAAc,EAAG,CACnB,IAAM,EAAM,GAAG,EAAY,2DAC3B,EAAI,QAAQ,OAAO,CAAE,MAAO,EAAa,CAAE,kDAAkD,CAC7F,IAAI,EAAW,EAAwB,CAAC,MAAM,mBAAoB,+BAA+B,IAAM,IAG3G,CAAC,MAAO,GAAQ,CAEhB,EAAI,QAAQ,OAAO,CAAE,IAAK,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAAE,CAAE,uCAAuC,EACrH,CACF,EAAmB,EAAU,CAC7B,EAAI,mBAAmB,EAAU,CAGjC,IAAM,EAAkB,EAA6B,EAAU,CAO/D,GANA,EAAI,uBAAuB,yBAAyB,kBAAmB,EAAgB,KAAK,CAMxF,CAAC,EAAK,MAAO,CAAE,aAAc,IAAA,GAAW,YAAW,CAEvD,IAAM,EAAe,gBAAkB,CACrC,GAAI,CAAC,EAAK,OAEV,IAAM,EADQ,EAAU,MAAM,CACF,IAAK,IAAO,CACtC,GAAI,EAAE,GACN,KAAM,EAAE,KACR,OAAQ,EAAE,OACV,eAAgB,EAAE,eAClB,QAAS,EAAE,QACX,UAAW,EAAE,UACb,WAAY,EAAE,WACd,YAAa,EAAE,YACf,eAAgB,EAAE,eAClB,cAAe,EAAE,cACjB,kBAAmB,EAAE,kBACtB,EAAE,CACH,EAAI,OAAO,MAAM,iBAAiB,EAAc,EAC/C,IAAK,CAGR,OAFA,EAAa,OAAO,CAEb,CAAE,eAAc,YAAW"}
1
+ {"version":3,"file":"interactive-schedule-Dpl1p0Az.js","names":[],"sources":["../src/commands/schedule-backend-methods.ts","../src/commands/interactive-schedule.ts"],"sourcesContent":["/**\n * backend-methods.ts —— RFC-349:schedule 面板 in-process backend methods。\n *\n * 与 browser-use/mobile-use 的区别:那些插件的 backend methods 跑在 MCP server 子进程里。\n * schedule 的 SchedulerService 依赖 `AgentJobService`/`sessionRef`/`notifySubscriber`——\n * 这些只能存活在 App 主进程,无法搬到子进程。故本文件注册为 **in-process backend handler**\n * (经 `PanelBackendController.registerInProcessBackend`),面板 `usePanelBackend().call()`\n * 走同一条路径,但执行发生在 App 主进程内。\n *\n * RFC-439:分发收敛为类型化注册表(backend-handler.ts)——方法 = zod schema + run,\n * 参数校验/前缀剥离/未知方法 fail-closed 由注册表统一承担,不再手写 switch/双重断言。\n *\n * 面板侧调用经 `toBackendWireMethod` 统一加 `backend/` 前缀,注册表接收时剥离前缀。\n */\nimport { z } from 'zod'\nimport type { SchedulerService } from '@x-otto/schedule'\nimport { parseCron } from '@x-otto/schedule'\nimport type { ScheduledTask } from '@x-otto/schedule'\nimport { createBackendHandler, type BackendMethod } from './backend-handler'\n\n/** 面板状态快照(经 pushState 推送或 call 返回)。 */\nexport interface SchedulePanelState {\n tasks: ScheduledTask[]\n runningTaskIds: string[]\n isFireOwner: boolean\n fireOwnerFailureReason: string | undefined\n}\n\nexport function createScheduleBackendHandler(scheduler: SchedulerService): {\n call: (method: string, params: Record<string, unknown>) => Promise<unknown>\n getSnapshot: () => SchedulePanelState\n} {\n const getSnapshot = (): SchedulePanelState => ({\n tasks: scheduler.list(),\n runningTaskIds: [...scheduler.getRunningTaskIds()],\n isFireOwner: scheduler.isFireOwner(),\n fireOwnerFailureReason: scheduler.fireOwnerFailureReason(),\n })\n\n // RFC-439:satisfies 保留各方法的 zod infer(不用默认泛型宽化致 run 参数塌成 unknown)。\n const methods = {\n 'schedule.list': {\n params: z.object({}),\n run: async () => getSnapshot(),\n },\n 'schedule.add': {\n params: z.object({\n name: z.string(),\n prompt: z.string(),\n cronExpression: z.string(),\n recurring: z.boolean(),\n // RFC-357 D3 (M2): optional session-local target, requires fire ownership.\n target: z.enum(['job', 'session']).optional(),\n }),\n run: async (params: {\n name: string\n prompt: string\n cronExpression: string\n recurring: boolean\n target?: 'job' | 'session'\n }) => {\n // RFC-357 D2: scheduler.add() throws when target:'session' is requested without\n // fire ownership — surface that as a structured error, not an unhandled rejection.\n try {\n const task = scheduler.add({\n name: params.name,\n prompt: params.prompt,\n cronExpression: params.cronExpression,\n recurring: params.recurring,\n origin: 'user' as const,\n target: params.target,\n })\n return { ok: true, taskId: task.id, name: task.name, target: task.target }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) }\n }\n },\n },\n\n 'schedule.update': {\n params: z.object({\n taskId: z.string(),\n name: z.string().optional(),\n prompt: z.string().optional(),\n cronExpression: z.string().optional(),\n enabled: z.boolean().optional(),\n }),\n run: async (params: {\n taskId: string\n name?: string\n prompt?: string\n cronExpression?: string\n enabled?: boolean\n }) => {\n const patch: { name?: string; prompt?: string; cronExpression?: string; enabled?: boolean } = {}\n if (params.name !== undefined) patch.name = params.name\n if (params.prompt !== undefined) patch.prompt = params.prompt\n if (params.cronExpression !== undefined) patch.cronExpression = params.cronExpression\n if (params.enabled !== undefined) patch.enabled = params.enabled\n const ok = scheduler.update(params.taskId, patch)\n return { ok }\n },\n },\n\n 'schedule.runNow': {\n params: z.object({ taskId: z.string() }),\n run: async (params: { taskId: string }) => {\n scheduler.runNow(params.taskId)\n return { ok: true }\n },\n },\n\n 'schedule.toggle': {\n params: z.object({ taskId: z.string(), enabled: z.boolean() }),\n run: async (params: { taskId: string; enabled: boolean }) => {\n const ok = scheduler.update(params.taskId, { enabled: params.enabled })\n return { ok }\n },\n },\n\n 'schedule.cancel': {\n params: z.object({ taskId: z.string() }),\n run: async (params: { taskId: string }) => scheduler.cancel(params.taskId),\n },\n\n 'schedule.remove': {\n params: z.object({ taskId: z.string() }),\n run: async (params: { taskId: string }) => {\n const removed = scheduler.remove(params.taskId)\n return { ok: removed }\n },\n },\n\n 'schedule.readLogs': {\n params: z.object({ taskId: z.string(), limit: z.number().optional() }),\n run: async (params: { taskId: string; limit?: number }) => {\n const entries = scheduler.readFireLogs(params.taskId, params.limit ?? 20)\n return { entries }\n },\n },\n\n 'schedule.parseCron': {\n params: z.object({ expr: z.string() }),\n run: async (params: { expr: string }) => {\n try {\n const next = parseCron(params.expr)\n return { ok: true, next: next.toISOString() }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) }\n }\n },\n },\n } satisfies Record<string, BackendMethod>\n\n return { ...createBackendHandler(methods, 'schedule'), getSnapshot }\n}\n","/**\n * 定时任务 TUI 交互管线(状态栏/事件/toast 接线)。\n */\n// RFC-161 M2:SchedulerService 等实现已迁至 @x-otto/schedule,直连新真源\n// (coding 的 re-export shim 仅供尚未迁移的其余消费方使用)。\nimport { SchedulerService, ScheduleRegistry, createScheduleStore, createLocalFireOwnership, createRemoteScheduleStore, createRemoteFireOwnership, FireLogger, DEFAULT_SCHEDULE_CONFIG, JobFireTarget, SessionFireTarget, SubscriberFireTarget, InProcessEventTrigger } from '@x-otto/schedule'\nimport { globalAgentJobRegistry } from '@x-otto/runtime'\nimport { setScheduleService } from './handlers/schedule'\nimport { createScheduleBackendHandler } from './schedule-backend-methods'\n\nimport type { App, AgentSession } from '@x-otto/coding'\nimport type { ScheduleStore, FireOwnership, FireTarget } from '@x-otto/schedule'\nimport type { TuiHandle } from '@x-otto/tui'\n\n/** Remote connection details, threaded from CLIOptions.sessionUrl/sessionToken. */\nexport interface ScheduleRemoteConfig {\n sessionUrl: string\n sessionToken: string\n}\n\n/**\n * RFC-357 D1/D2(M2):`SchedulerDeps.followUpCurrentSession` 的真实实现——把 session-local\n * 任务的 prompt 注入 `boundSessionId` 对应的当前会话。\n *\n * 三重失效校验(均转 `false`,不抛错——调度器侧 `fireSession()` 把异常/false 统一折叠为\n * fire 失败记日志,不重试,同 `notifySubscriber` 缺省行为的旁路信号纪律):\n *\n * 1. **会话身份不匹配**(独立评审 R1):`sessionRef` 是活引用,RFC-234 attach/detach 会\n * 在同一进程内重新赋值它——若 `boundSessionId` 与当前 `sessionRef.value.id` 不等,说明\n * 用户已切到别的会话,绝不能把内容误投进一个不相干的对话。\n * 2. **paused 态**(D1):暂停会话收到注入会被 `prompt()` 判定为 idle 直接起新回合,\n * 这实质上绕过了用户暂停会话的意图——先查 `isPaused` 拒绝。\n * 3. **archived 态 / 会话已销毁**(D1):`AgentSession.status` 是同步 getter,先在此\n * 同步判断 `'archived'` 拒绝(M3 e2e 测试发现的修订——`prompt()` 是 `async` 函数,\n * 其内部对 archived 态的检查会抛出**被拒绝的 Promise** 而非同步异常;`void\n * session.prompt(...)` 外面包一层 `try/catch` 完全捕获不到它,会变成未处理的\n * promise rejection,在真实调度场景下会让 Node 进程崩溃)。为兜底 `ensureNotDisposed()`\n * 等其他潜在的异步失效路径,仍链一个 `.catch()`(fire-and-forget,不 await、不重试,\n * 只是防止任何未预见的异步异常变成未处理 rejection)。\n */\nexport function createFollowUpCurrentSession(\n sessionRef: { readonly value: AgentSession },\n): (task: { prompt: string; boundSessionId: string; name: string; origin: 'user' | 'model' }) => boolean {\n return (task) => {\n const session = sessionRef.value\n\n if (session.id !== task.boundSessionId) return false\n if (session.isPaused) return false\n if (session.status === 'archived') return false\n\n try {\n // 不 await:fire() 是 fire-and-forget 的旁路信号语义(同 fireSubscriber),\n // prompt() 的 busy/idle 路由与错误处理已在 AgentSession 内部完成;这里只需\n // 同步判断\"是否成功发起了注入\"(streamingBehavior:'followUp' 使 prompt()\n // 同步完成入队/发起,不阻塞到回合真正跑完)。`.catch()` 兜底任何异步异常\n // (见上方文档注释——不能只靠 try/catch,那只捕获同步抛出)。\n void session.prompt(task.prompt, { streamingBehavior: 'followUp' }).catch(() => {})\n return true\n } catch {\n // 理论上不会走到这——保留作为同步异常的最后防线。\n return false\n }\n }\n}\n\nexport interface ScheduleServiceSetupOptions {\n /** 交互会话(TUI 装配传;serve/daemon 无人值守装配不传——job-only 模式)。 */\n sessionRef?: { readonly value: AgentSession }\n /** TUI 句柄(仅交互模式;缺失时跳过 5s taskStore 轮询)。 */\n tui?: TuiHandle\n remoteConfig?: ScheduleRemoteConfig\n}\n\nexport function setupScheduleService(\n app: App,\n opts: ScheduleServiceSetupOptions,\n): { pollInterval: ReturnType<typeof setInterval> | undefined; scheduler: SchedulerService } {\n const { sessionRef, tui, remoteConfig } = opts\n // Wire schedule service for /schedule command + cron tools\n const workspaceKey = app.workspaceRef?.key ?? 'default'\n const scheduleRegistry = new ScheduleRegistry()\n\n let scheduleStore: ScheduleStore\n let scheduleOwnership: FireOwnership\n if (app.storage.remoteSessionConfigured && remoteConfig) {\n const getAuth = async (): Promise<{ token: string }> => ({ token: remoteConfig.sessionToken })\n scheduleStore = createRemoteScheduleStore({\n sessionUrl: remoteConfig.sessionUrl,\n getAuth,\n wsKey: workspaceKey,\n })\n scheduleOwnership = createRemoteFireOwnership({\n sessionUrl: remoteConfig.sessionUrl,\n wsKey: workspaceKey,\n getAuth,\n })\n } else {\n scheduleStore = createScheduleStore(workspaceKey)\n scheduleOwnership = createLocalFireOwnership(workspaceKey)\n }\n\n // RFC-406 D7:投递目标从 SchedulerDeps 内联字段拆为 FireTarget handler 列表。\n // 注册顺序即优先级:subscriber > session > job(保持旧 fire() 分支优先级)。\n //\n // RFC-435 R1(独立核对修复②):SubscriberFireTarget **仅在有 sessionRef 的交互形态注册**。\n // 此前无条件注册使 headless(serve/daemon)实际装配 = Subscriber+Job 两件,违背 R1\n // 「daemon 形态只装配 JobFireTarget」与用户 grill 确认的范围收敛(方案 A:只放 job)。\n // 插件 schedules 声明的 subscriber 任务在 headless 形态走 fire log 降级(D3),\n // 不投递——与「daemon 不启用 subscriber 投递」的决策一致(RFC §2 非目标)。\n const fireLogger = new FireLogger(DEFAULT_SCHEDULE_CONFIG)\n const fireTargets: FireTarget[] = []\n\n if (sessionRef) {\n fireTargets.push(\n // RFC-327 D2:订阅者到点通知的窄端口——scheduler 只交出纯数据标识,\n // 由 App 决定投给哪个运行中的 service(并强制\"插件仍激活\"这一 revoke 语义)。\n // 该路径**不开会话授权 epoch**(schedule.tick 无 sessionId),见 App 侧注释。\n new SubscriberFireTarget({\n notify: (subscriber, tick) =>\n app.notifyPluginServiceSchedule(\n { pluginId: subscriber.pluginId, serviceId: subscriber.serviceId },\n tick,\n ),\n fireLogger,\n }),\n // RFC-357 D1/D2(M2):session-local 任务到点后的投递端口 + 创建时绑定的 sessionId。\n new SessionFireTarget({\n followUp: createFollowUpCurrentSession(sessionRef),\n getSessionId: () => sessionRef.value.id,\n fireLogger,\n }),\n )\n }\n\n // RFC-435 D1:job 类任务不依赖交互会话(detached run + worktree 隔离),\n // 交互与无人值守形态都注册。getSessionId 仅在有 sessionRef 时提供——\n // 无人值守(serve/daemon)缺省,job 任务创建时不绑定 session(target 非 session)。\n fireTargets.push(\n new JobFireTarget({\n jobRegistry: globalAgentJobRegistry,\n startJob: (input) => ({\n id: app.agentJobs.start({\n title: input.title,\n prompt: input.prompt,\n sessionId: input.sessionId,\n origin: input.origin,\n // RFC-438:per-job 模型指定透传(task.modelId/thinkingLevel)\n ...(input.model ? { model: input.model } : {}),\n }).id,\n }),\n ...(sessionRef ? { getSessionId: () => sessionRef.value.id } : {}),\n // RFC-230:本函数在 TUI 启动流程内被调用,晚于 app.start()(settings 已 load),\n // getResilienceConfig() 调用安全。真实构造点(非 packages/coding App 内部),\n // 见 RFC-230 §3 D6 Scheduler 小节二轮评审 P2 修正。\n retryBackoffMs: app.getResilienceConfig().schedule.retryBackoffMs,\n fireLogger,\n needsInputMaxExtensionFactor: DEFAULT_SCHEDULE_CONFIG.needsInputMaxExtensionFactor,\n }),\n )\n\n const scheduler = new SchedulerService({\n registry: scheduleRegistry,\n store: scheduleStore,\n ownership: scheduleOwnership,\n fireTargets,\n // RFC-423:进程内事件触发器——监听 AgentJobRegistry 终态(如 job diff applied),\n // 事件满足时把 prompt 注入当前对话(配 target:'session')。三重死循环闸门内建\n // (自产 job 排除 + add() 拒绝 job 投递 + 频率 debounce)。无人值守(无 sessionRef)\n // 时事件触发投递目标无会话——fire 时跳过并记日志(fireLogger),见 RFC-435 D2。\n triggers: [new InProcessEventTrigger({ jobRegistry: globalAgentJobRegistry })],\n })\n // Non-critical background feature — a bootstrap failure here must not take down\n // the whole interactive session (fire-and-forget start() would otherwise surface\n // as an unhandled rejection and crash the process).\n void scheduler.start().then(() => {\n // RFC-435 D3 聚合告警(独立核对修复①):必须在 start() **完成**后检查——start()\n // 是 async(首个 await tryAcquire()),此前同步 list() 拿到的是空 registry,\n // nonJobCount 恒为 0,告警是生产死代码(评审 A.3 坐实)。移到 then() 内,\n // registry 已加载,计数真实。\n if (!sessionRef) {\n const nonJobCount = scheduler.list().filter((t) => t.target === 'session' || !!t.subscriber).length\n if (nonJobCount > 0) {\n const msg = `${nonJobCount} 个任务(session/subscriber 类)在 daemon 无人值守形态不会投递,仅 job 类任务执行`\n app.logger?.warn?.({ count: nonJobCount }, '[schedule] headless mode: non-job tasks skipped')\n new FireLogger(DEFAULT_SCHEDULE_CONFIG).write('daemon-scheduler', `headless aggregate warning: ${msg}`)\n }\n }\n }).catch((err) => {\n // RFC-435 R9:失败日志走 logger 而非 console(serve 无人值守场景 console 无观察者)。\n app.logger?.warn?.({ err: err instanceof Error ? err.message : String(err) }, '[schedule] scheduler failed to start')\n })\n setScheduleService(scheduler)\n app.setScheduleService(scheduler) // A1: let cron_* model tools reach this scheduler\n\n // RFC-349 M1:注册 in-process backend handler——面板经 usePanelBackend().call() 访问 scheduler\n const scheduleBackend = createScheduleBackendHandler(scheduler)\n app.panelBackendController.registerInProcessBackend('plugin-schedule', scheduleBackend.call)\n\n // Push schedule tasks to TUI store every 5 seconds (status bar / task list).\n // RFC-349 M2: panel data is now fetched via backend.call('schedule.list') —\n // this interval only updates the TUI taskStore for status bar display.\n // RFC-435 D1:serve/daemon 无 tui → 不建轮询(无人值守无状态栏消费方)。\n if (!tui) return { pollInterval: undefined, scheduler }\n\n const pollInterval = setInterval(() => {\n if (!tui) return\n const tasks = scheduler.list()\n const taskSummaries = tasks.map((t) => ({\n id: t.id,\n name: t.name,\n prompt: t.prompt,\n cronExpression: t.cronExpression,\n enabled: t.enabled,\n recurring: t.recurring,\n nextFireAt: t.nextFireAt,\n lastFiredAt: t.lastFiredAt,\n lastFireFailed: t.lastFireFailed,\n lastFireError: t.lastFireError,\n lastFireCancelled: t.lastFireCancelled,\n }))\n tui.stores.tasks.setScheduleTasks(taskSummaries)\n }, 5000)\n pollInterval.unref()\n\n return { pollInterval, scheduler }\n}\n"],"mappings":";8jBA4BA,SAAgB,EAA6B,EAG3C,CACA,IAAM,OAAyC,CAC7C,MAAO,EAAU,MAAM,CACvB,eAAgB,CAAC,GAAG,EAAU,mBAAmB,CAAC,CAClD,YAAa,EAAU,aAAa,CACpC,uBAAwB,EAAU,wBAAwB,CAC3D,EAqHD,MAAO,CAAE,GAAG,EAlHI,CACd,gBAAiB,CACf,OAAQ,EAAE,OAAO,EAAE,CAAC,CACpB,IAAK,SAAY,GAAa,CAC/B,CACD,eAAgB,CACd,OAAQ,EAAE,OAAO,CACf,KAAM,EAAE,QAAQ,CAChB,OAAQ,EAAE,QAAQ,CAClB,eAAgB,EAAE,QAAQ,CAC1B,UAAW,EAAE,SAAS,CAEtB,OAAQ,EAAE,KAAK,CAAC,MAAO,UAAU,CAAC,CAAC,UAAU,CAC9C,CAAC,CACF,IAAK,KAAO,IAMN,CAGJ,GAAI,CACF,IAAM,EAAO,EAAU,IAAI,CACzB,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,eAAgB,EAAO,eACvB,UAAW,EAAO,UAClB,OAAQ,OACR,OAAQ,EAAO,OAChB,CAAC,CACF,MAAO,CAAE,GAAI,GAAM,OAAQ,EAAK,GAAI,KAAM,EAAK,KAAM,OAAQ,EAAK,OAAQ,OACnE,EAAK,CACZ,MAAO,CAAE,GAAI,GAAO,MAAO,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAAE,GAGlF,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CACf,OAAQ,EAAE,QAAQ,CAClB,KAAM,EAAE,QAAQ,CAAC,UAAU,CAC3B,OAAQ,EAAE,QAAQ,CAAC,UAAU,CAC7B,eAAgB,EAAE,QAAQ,CAAC,UAAU,CACrC,QAAS,EAAE,SAAS,CAAC,UAAU,CAChC,CAAC,CACF,IAAK,KAAO,IAMN,CACJ,IAAM,EAAwF,EAAE,CAMhG,OALI,EAAO,OAAS,IAAA,KAAW,EAAM,KAAO,EAAO,MAC/C,EAAO,SAAW,IAAA,KAAW,EAAM,OAAS,EAAO,QACnD,EAAO,iBAAmB,IAAA,KAAW,EAAM,eAAiB,EAAO,gBACnE,EAAO,UAAY,IAAA,KAAW,EAAM,QAAU,EAAO,SAElD,CAAE,GADE,EAAU,OAAO,EAAO,OAAQ,EAAM,CACpC,EAEhB,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,CAAC,CACxC,IAAK,KAAO,KACV,EAAU,OAAO,EAAO,OAAO,CACxB,CAAE,GAAI,GAAM,EAEtB,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,QAAS,EAAE,SAAS,CAAE,CAAC,CAC9D,IAAK,KAAO,KAEH,CAAE,GADE,EAAU,OAAO,EAAO,OAAQ,CAAE,QAAS,EAAO,QAAS,CAAC,CAC1D,EAEhB,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,CAAC,CACxC,IAAK,KAAO,IAA+B,EAAU,OAAO,EAAO,OAAO,CAC3E,CAED,kBAAmB,CACjB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,CAAC,CACxC,IAAK,KAAO,KAEH,CAAE,GADO,EAAU,OAAO,EAAO,OAAO,CACzB,EAEzB,CAED,oBAAqB,CACnB,OAAQ,EAAE,OAAO,CAAE,OAAQ,EAAE,QAAQ,CAAE,MAAO,EAAE,QAAQ,CAAC,UAAU,CAAE,CAAC,CACtE,IAAK,KAAO,KAEH,CAAE,QADO,EAAU,aAAa,EAAO,OAAQ,EAAO,OAAS,GAAG,CACvD,EAErB,CAED,qBAAsB,CACpB,OAAQ,EAAE,OAAO,CAAE,KAAM,EAAE,QAAQ,CAAE,CAAC,CACtC,IAAK,KAAO,IAA6B,CACvC,GAAI,CAEF,MAAO,CAAE,GAAI,GAAM,KADN,EAAU,EAAO,KAAK,CACL,aAAa,CAAE,OACtC,EAAK,CACZ,MAAO,CAAE,GAAI,GAAO,MAAO,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAAE,GAGlF,CACF,CAEyC,WAAW,CAAE,cAAa,0EClHtE,SAAgB,EACd,EACuG,CACvG,MAAQ,IAAS,CACf,IAAM,EAAU,EAAW,MAI3B,GAFI,EAAQ,KAAO,EAAK,gBACpB,EAAQ,UACR,EAAQ,SAAW,WAAY,MAAO,GAE1C,GAAI,CAOF,OADK,EAAQ,OAAO,EAAK,OAAQ,CAAE,kBAAmB,WAAY,CAAC,CAAC,UAAY,GAAG,CAC5E,QACD,CAEN,MAAO,KAab,SAAgB,EACd,EACA,EAC2F,CAC3F,GAAM,CAAE,aAAY,MAAK,gBAAiB,EAEpC,EAAe,EAAI,cAAc,KAAO,UACxC,EAAmB,IAAI,EAEzB,EACA,EACJ,GAAI,EAAI,QAAQ,yBAA2B,EAAc,CACvD,IAAM,EAAU,UAAyC,CAAE,MAAO,EAAa,aAAc,EAC7F,EAAgB,EAA0B,CACxC,WAAY,EAAa,WACzB,UACA,MAAO,EACR,CAAC,CACF,EAAoB,EAA0B,CAC5C,WAAY,EAAa,WACzB,MAAO,EACP,UACD,CAAC,MAEF,EAAgB,EAAoB,EAAa,CACjD,EAAoB,EAAyB,EAAa,CAW5D,IAAM,EAAa,IAAI,EAAW,EAAwB,CACpD,EAA4B,EAAE,CAEhC,GACF,EAAY,KAIV,IAAI,EAAqB,CACvB,QAAS,EAAY,IACnB,EAAI,4BACF,CAAE,SAAU,EAAW,SAAU,UAAW,EAAW,UAAW,CAClE,EACD,CACH,aACD,CAAC,CAEF,IAAI,EAAkB,CACpB,SAAU,EAA6B,EAAW,CAClD,iBAAoB,EAAW,MAAM,GACrC,aACD,CAAC,CACH,CAMH,EAAY,KACV,IAAI,EAAc,CAChB,YAAa,EACb,SAAW,IAAW,CACpB,GAAI,EAAI,UAAU,MAAM,CACtB,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,UAAW,EAAM,UACjB,OAAQ,EAAM,OAEd,GAAI,EAAM,MAAQ,CAAE,MAAO,EAAM,MAAO,CAAG,EAAE,CAC9C,CAAC,CAAC,GACJ,EACD,GAAI,EAAa,CAAE,iBAAoB,EAAW,MAAM,GAAI,CAAG,EAAE,CAIjE,eAAgB,EAAI,qBAAqB,CAAC,SAAS,eACnD,aACA,6BAA8B,EAAwB,6BACvD,CAAC,CACH,CAED,IAAM,EAAY,IAAI,EAAiB,CACrC,SAAU,EACV,MAAO,EACP,UAAW,EACX,cAKA,SAAU,CAAC,IAAI,EAAsB,CAAE,YAAa,EAAwB,CAAC,CAAC,CAC/E,CAAC,CAIG,EAAU,OAAO,CAAC,SAAW,CAKhC,GAAI,CAAC,EAAY,CACf,IAAM,EAAc,EAAU,MAAM,CAAC,OAAQ,GAAM,EAAE,SAAW,WAAa,CAAC,CAAC,EAAE,WAAW,CAAC,OAC7F,GAAI,EAAc,EAAG,CACnB,IAAM,EAAM,GAAG,EAAY,2DAC3B,EAAI,QAAQ,OAAO,CAAE,MAAO,EAAa,CAAE,kDAAkD,CAC7F,IAAI,EAAW,EAAwB,CAAC,MAAM,mBAAoB,+BAA+B,IAAM,IAG3G,CAAC,MAAO,GAAQ,CAEhB,EAAI,QAAQ,OAAO,CAAE,IAAK,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAAE,CAAE,uCAAuC,EACrH,CACF,EAAmB,EAAU,CAC7B,EAAI,mBAAmB,EAAU,CAGjC,IAAM,EAAkB,EAA6B,EAAU,CAO/D,GANA,EAAI,uBAAuB,yBAAyB,kBAAmB,EAAgB,KAAK,CAMxF,CAAC,EAAK,MAAO,CAAE,aAAc,IAAA,GAAW,YAAW,CAEvD,IAAM,EAAe,gBAAkB,CACrC,GAAI,CAAC,EAAK,OAEV,IAAM,EADQ,EAAU,MAAM,CACF,IAAK,IAAO,CACtC,GAAI,EAAE,GACN,KAAM,EAAE,KACR,OAAQ,EAAE,OACV,eAAgB,EAAE,eAClB,QAAS,EAAE,QACX,UAAW,EAAE,UACb,WAAY,EAAE,WACd,YAAa,EAAE,YACf,eAAgB,EAAE,eAClB,cAAe,EAAE,cACjB,kBAAmB,EAAE,kBACtB,EAAE,CACH,EAAI,OAAO,MAAM,iBAAiB,EAAc,EAC/C,IAAK,CAGR,OAFA,EAAa,OAAO,CAEb,CAAE,eAAc,YAAW"}