@x-otto/cli 0.0.1-alpha.36 → 0.0.1-alpha.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-id-BUDK-CNM.js +3 -0
- package/dist/build-id-BUDK-CNM.js.map +1 -0
- package/dist/command-dispatcher-D_QIlalH.js +21 -0
- package/dist/command-dispatcher-D_QIlalH.js.map +1 -0
- package/dist/extension-BzHePQhP.js +2 -0
- package/dist/{extension-DLFCUBJr.js → extension-l6MYwOgV.js} +16 -16
- package/dist/extension-l6MYwOgV.js.map +1 -0
- package/dist/feedback-DmBlIeGZ.js +21 -0
- package/dist/{feedback-DQlzrLez.js.map → feedback-DmBlIeGZ.js.map} +1 -1
- package/dist/feedback-QYZ1E8Kc.js +2 -0
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/install-DlVJRHRT.js.map +1 -1
- package/dist/{parse-cli-CN7gBh8N.js → parse-cli-Cf9nKV3P.js} +2 -2
- package/dist/{parse-cli-CN7gBh8N.js.map → parse-cli-Cf9nKV3P.js.map} +1 -1
- package/dist/{version-ClQIrI5U.js → version-D-9A3yFu.js} +2 -2
- package/dist/{version-ClQIrI5U.js.map → version-D-9A3yFu.js.map} +1 -1
- package/package.json +9 -9
- package/dist/build-id-C8ASXcd2.js +0 -3
- package/dist/build-id-C8ASXcd2.js.map +0 -1
- package/dist/command-dispatcher-Ds-nGl0U.js +0 -21
- package/dist/command-dispatcher-Ds-nGl0U.js.map +0 -1
- package/dist/extension-DLFCUBJr.js.map +0 -1
- package/dist/extension-I87MkZYp.js +0 -2
- package/dist/feedback-Bca9ZZVP.js +0 -2
- package/dist/feedback-DQlzrLez.js +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-id-BUDK-CNM.js","names":[],"sources":["../src/build-id.ts"],"sourcesContent":["// auto-generated by scripts/gen-build-id.mjs — DO NOT EDIT\nexport const BUILD_ID = 4856\nexport const BUILD_BRANCH = 'HEAD'\nexport const BUILD_HASH = '2800ac85a'\n"],"mappings":";AACA,MAAa,EAAW,KACX,EAAe,OACf,EAAa"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{n as e,t}from"./build-id-BUDK-CNM.js";import{t as n}from"./version-D-9A3yFu.js";import{t as r}from"./discover-with-bundled-CF8qFP41.js";import{n as i,r as a,t as o}from"./service-client-Cr4sxDVM.js";import{n as s}from"./extension-l6MYwOgV.js";import{t as c}from"./proxy-evg7ZvoD.js";import{i as l}from"./install-DlVJRHRT.js";import{n as u,t as d}from"./registry-BdCcwyGy.js";import{n as f,t as p}from"./feedback-DmBlIeGZ.js";import{createRequire as m}from"node:module";import{arch as h,cpus as g,freemem as _,homedir as v,platform as ee,release as y,totalmem as b}from"node:os";import{execFile as te,execSync as x,spawn as S,spawnSync as ne}from"node:child_process";import{DEFAULT_WORKSPACE_KEY as C,INDUCTOR_PLUGIN_ID as w,InstallManager as T,PLUGIN_MANIFEST_FILENAME as re,POINT as ie,buildExtensionContext as ae,checkUpgrades as oe,collectPluginPerfMetrics as se,defaultPostInstallExecutor as ce,detectProjectConfigGating as le,discoverFileCommands as ue,discoverPlugins as de,dispatch as fe,evaluateClaudeTrust as pe,evaluatePluginTrust as me,findWorkspaceRoot as he,getLastAssistantText as E,grantPluginCapabilities as ge,installPluginFromPackage as _e,openTarget as ve,parsePluginManifest as ye,readHighRiskCapabilities as be,readPluginLogTail as xe,readSkillLoopStatus as Se,recordPluginInstalled as Ce,recordPluginUninstalled as we,resolveActions as Te,resolvePackageDir as Ee,resolveSessionTitle as De,runPluginScript as Oe,scanInstalledVersions as ke,trustPlugin as Ae,trustProject as je,uninstall as Me,untrustPlugin as Ne,untrustProject as Pe}from"@x-otto/coding";import{checkShellCommand as Fe,openBrowser as Ie,readFileCapped as Le}from"@x-otto/shared";import{BUILD_ID as Re,OTTO_HOME as ze,SDK_VERSION as Be}from"@x-otto/env";import{dirname as D,join as O,relative as Ve,resolve as He}from"node:path";import{closeSync as Ue,existsSync as k,openSync as We,readFileSync as Ge,readSync as Ke,readdirSync as qe,statSync as Je}from"node:fs";import{FIGURES as A,buildTurnSummary as Ye,createBuiltinThemeRegistry as Xe,createReducerState as Ze,deriveTurnBoundaries as Qe,detectLanguage as $e,formatProviderUsageLimitTypeFull as et,i18next as j,initI18n as tt,insertTurnSummaries as nt,reduceToTui as rt}from"@x-otto/tui";import{createBuiltinCommands as it}from"@x-otto/tui/compat";import{MaxToolTurnsError as at,PromptBudgetExceededError as ot}from"@x-otto/agent";import{readFile as st,readdir as ct,stat as lt,unlink as ut}from"node:fs/promises";import{DEFAULT_COMPACTION_CONFIG as dt,DEFAULT_PRUNE_CONFIG as ft,estimateTokensHeuristic as pt,resolveContextSize as mt}from"@x-otto/memory";import{classifyAuthErrorType as ht,computeCacheHitRatio as gt,createModelUsabilityGate as M,getProviderDescriptor as _t,getToolCallsByAssistantMessage as vt,isAuthError as yt}from"@x-otto/ai";import{promisify as bt}from"node:util";import{parseCron as xt}from"@x-otto/schedule";var St=Object.defineProperty,Ct=(e,t)=>{let n={};for(var r in e)St(n,r,{get:e[r],enumerable:!0});return t||St(n,Symbol.toStringTag,{value:`Module`}),n},wt=m(import.meta.url);function Tt(e){return`⚠ 已达工具回合上限(${e.extensions>0?`约 ${e.effectiveMaxTurns} 次(含 ${e.extensions} 次自动扩展,每次 ${e.maxTurns})`:`${e.maxTurns} 次`}),提前停止——任务可能未完成。\n 重试可加 --max-tool-turns <n>(每轮预算,实际上限 ≈ n×${1+e.extensions};如 --max-tool-turns ${e.maxTurns*2})。\n 注:配置了 --prompt-token-budget 时轮次窗口自动 ×4(此处报的是放大后的有效值)。`}function Et(e,t){let n=E(e.session.messages())||t.partialText,r=Tt(t);return n?`${n}\n${r}`:r}function Dt(e){let t=e.dimension===`tokens`?`输出 token 预算 ${e.used}/${e.budget}`:`时间预算 ${Math.round(e.used/1e3)}s/${Math.round(e.budget/1e3)}s`;return`⚠ 已达本回合${e.dimension===`tokens`?`输出 token`:`墙钟时间`}预算(${t}),提前停止——任务可能未完成。\n 重试可加 ${e.dimension===`tokens`?`--prompt-token-budget <n>`:`--prompt-time-budget <分钟>`} 提升预算。`}function Ot(e,t){let n=E(e.session.messages())||t.partialText,r=Dt(t);return n?`${n}\n${r}`:r}async function kt(e,t,n={}){let{writer:r,tui:i=!1,tuiOptions:a,onTurnEnd:o}=typeof n==`function`?{writer:n}:n,s=r??(e=>process.stdout.write(`${e}\n`)),c=Date.now();try{await e.prompt(t)}catch(t){if(t instanceof at||t instanceof ot){let n=t instanceof ot,r=n?Dt(t):Tt(t);o?.(n?`budget-exceeded`:`max-tool-turns`,r);let l=o?E(e.session.messages())||t.partialText:n?Ot(e,t):Et(e,t);if(i){let{printMessages:t}=await import(`@x-otto/tui`);t(e.session.messages(),{...a,startTime:c,contextWindow:0}),s(l)}else s(l);return l}throw t}if(o&&e.budgetSteeredThisPrompt&&o(`max-tool-turns`,`⚠ 已达工具回合上限——已自动收尾本回合(任务可能未全部完成,可继续指示我,或加 --max-tool-turns 提升预算)。`),i){let{printMessages:t}=await import(`@x-otto/tui`),n=e.session.messages();return t(n,{...a,startTime:c,contextWindow:e.model.contextWindow??0}),E(n)}let l=E(e.session.messages());return s(l),l}async function At(e,t){try{await e.prompt(t)}catch(t){if(t instanceof at)return{sessionId:e.id,status:`max_turns`,messageCount:e.session.messages().length,response:E(e.session.messages())||t.partialText};if(t instanceof ot)return{sessionId:e.id,status:`budget_exceeded`,messageCount:e.session.messages().length,response:E(e.session.messages())||t.partialText};throw t}return{sessionId:e.id,status:e.status,messageCount:e.session.messages().length,response:E(e.session.messages())}}var jt=class{commandRegistry;modelList=[];currentModelId;onModelChange;constructor(e,t={}){this.session=e,this.modelList=t.models??[],this.currentModelId=t.currentModel,this.onModelChange=t.onModelChange,this.commandRegistry=it()}getRegistry(){return this.commandRegistry}abort(){this.session.abort()}async handleInput(e){if(this.session.status===`archived`)return{type:`system`,text:`此会话已归档(archived),无法发送新消息。使用 /resume 切换到其他会话。`};let t=e.trim();if(t.length===0)return{type:`noop`};if(t.startsWith(`!`)){let e=t.slice(1).trim();if(!e)return{type:`system`,text:`Usage: !<shell command>`};let n=Fe(e);if(!n.safe)return{type:`system`,text:`Refusing to execute dangerous command (${n.reason}): ${e}\nUse the bash tool via the agent for privileged operations.`};let r,i=!1;try{r=x(e,{encoding:`utf-8`,timeout:3e4,cwd:this.session.workspaceDir,maxBuffer:1024*1024})}catch(e){let t=e;r=t.stderr||t.stdout||t.message||String(e),i=!0}return r=r.trimEnd(),this.session.session.append({role:`system`,subtype:`local_command`,level:i?`error`:`info`,content:r||`(no output)`,timestamp:Date.now()}),{type:`response`,text:r||`(no output)`}}if(t.startsWith(`@`)){let e=t.slice(1).trim();return e?{type:`response`,text:await kt(this.session,`Read and analyze the file: ${e}`,{writer:()=>{}})}:{type:`system`,text:`Usage: @<file-path>`}}if(!t.startsWith(`/`)){let e,n;return{type:`response`,text:await kt(this.session,t,{writer:()=>{},onTurnEnd:(t,r)=>{e=t,n=r}}),endReason:e,notice:n}}let[n,...r]=t.slice(1).split(/\s+/);if(!n){let{showCommandPalette:e}=await import(`@x-otto/tui`),t=await e(this.commandRegistry.list(),process.stdin,process.stdout);if(!t.command)return{type:`noop`};let n=this.commandRegistry.get(t.command);if(!n)return{type:`noop`};let r=await n.execute(t.args,{signal:new AbortController().signal,width:process.stdout.columns??80,models:this.modelList,currentModel:this.currentModelId,onModelChange:this.onModelChange});return this._handleCommandResult(r)}let i=r.join(` `),a=this.commandRegistry.find(n);if(!a)return{type:`system`,text:`Unknown command: /${n}. Try /help.`};let o=await a.execute(i,{signal:new AbortController().signal,width:process.stdout.columns??80,models:this.modelList,currentModel:this.currentModelId,onModelChange:this.onModelChange});return this._handleCommandResult(o)}_handleCommandResult(e){if(typeof e==`string`)return{type:`system`,text:e};switch(e.kind){case`exit`:return{type:`exit`,restart:e.restart};case`help`:return{type:`help`};case`clear`:return this.session.clearTurnPanels(),this.session.clearContext(),process.stdout.write(`\x1B[2J\x1B[H`),{type:`noop`};case`abort`:return this.session.abort(),{type:`system`,text:`Aborted current run.`};case`status`:return{type:`system`,text:`Session: ${this.session.id} | Status: ${this.session.status}`};case`copy`:return{type:`system`,text:`Copy not yet available in CLI mode.`};case`model`:return this.onModelChange?(this.onModelChange(e.modelId).then(e=>{process.stdout.write(e+`
|
|
3
|
+
`)}).catch(e=>{process.stdout.write(`Model switch failed: ${e instanceof Error?e.message:String(e)}\n`)}),{type:`system`,text:`Switching to ${e.modelId}...`}):{type:`system`,text:`Model switching not available.`}}}};function Mt(){return $e()}function Nt(e=`auto`){let t=e===`auto`?$e():e;return tt(t),t}const Pt=`@x-otto/cli`;async function Ft(e){try{let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),r=await fetch(`https://registry.npmjs.org/%40x-otto%2Fcli`,{signal:t.signal});if(clearTimeout(n),!r.ok)return null;let i=(await r.json())?.[`dist-tags`];if(!i)return null;let a=[i.alpha,i.latest].filter(e=>!!e),o=a.length>0?a.reduce((e,t)=>Rt(t,e)>0?t:e):Object.values(i).reduce((e,t)=>e===null||Rt(t,e)>0?t:e,null);return o?{latest:o,current:e,newer:Rt(o,It(e))>0}:null}catch{return null}}function It(e){let t=/^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/.exec(e.trim());return t?t[0]:e}function Lt(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(e.trim());return t?{core:[Number(t[1]),Number(t[2]),Number(t[3])],prerelease:t[4]?t[4].split(`.`):null}:null}function Rt(e,t){let n=Lt(e),r=Lt(t);if(!n||!r)return 0;for(let e=0;e<3;e++)if(n.core[e]!==r.core[e])return n.core[e]-r.core[e];if(n.prerelease===null&&r.prerelease===null)return 0;if(n.prerelease===null)return 1;if(r.prerelease===null)return-1;let i=Math.max(n.prerelease.length,r.prerelease.length);for(let e=0;e<i;e++){let t=n.prerelease[e],i=r.prerelease[e];if(t===void 0)return-1;if(i===void 0)return 1;if(t===i)continue;let a=/^\d+$/.test(t),o=/^\d+$/.test(i);return a&&o?Number(t)-Number(i):a?-1:o?1:t<i?-1:1}return 0}async function zt(e){return new Promise(t=>{try{let n=S(process.platform===`win32`?`npm.cmd`:`npm`,[`install`,`-g`,e?`${Pt}@${e}`:`${Pt}@latest`],{stdio:`inherit`,shell:!0});n.on(`error`,e=>{t({ok:!1,error:e.message})}),n.on(`exit`,e=>{if(e!==0){t({ok:!1,error:`npm install exited with code ${e}`});return}t({ok:!0})})}catch(e){t({ok:!1,error:e.message})}})}function Bt(e){return e?Date.now()-e>216e5:!0}async function Vt(e){let t=process.env.OTTO_UPGRADE_MOCK;if(t){let e=t===`force`;return{latest:e?`2.0.0`:`0.2.0`,current:`0.0.1`,newer:!0,forced:e}}return!e.autoCheck||!Bt(e.lastCheck)?null:Ft(e.currentVersion).then(async t=>t&&(e.persistLastCheck().catch(()=>{}),t.newer)?{...t,forced:!1}:null).catch(()=>null)}const Ht=pt;let Ut,Wt;function Gt(e){let t=e.map(e=>e.name).sort().join(`,`);if(Ut!==void 0&&Wt===t)return Ut;let n=e=>typeof e==`function`?`[fn]`:typeof e==`string`?e:``;return Ut=Ht(JSON.stringify(e.map(e=>({name:e.name,description:n(e.description),parameters:e.parameters})))),Wt=t,Ut}let Kt,qt;function Jt(e){return Kt!==void 0&&qt===e?Kt:(Kt=Ht(e),qt=e,Kt)}function Yt(e){let{systemPrompt:t,tools:n,lastIn:r,lastOut:i,lastCacheRead:a,lastCacheWrite:o,contextWindow:s,modelName:c=``,totIn:l=r,totOut:u=i,cost:d,messageCount:f=0,streamingOutputTokens:p=0}=e,m=Jt(t)+Gt(n),h=a+o+r+i+p,g=Math.max(0,h-m),_=Math.max(0,s-m-g),v=mt(ft.trigger,s),ee=mt(dt.trigger,s);return{modelName:c,contextWindow:s,contextPercent:s>0?h/s*100:0,overheadTokens:m,messageTokens:g,messageCount:f,totalUsed:h,free:_,pruneLine:v,compactLine:ee,lastInput:r,lastOutput:i,totalInput:l,totalOutput:u,cost:d,live:p>0}}const Xt={openai:`OpenAI`};function Zt(e){let t=[`confirm`,`auto`,`bypass`];return t[(t.indexOf(e)+1)%t.length]??`confirm`}function Qt(e){return e===`error`?`error`:e===`approval_required`||e===`input_required`?`warning`:`info`}function $t(e,t,n){let r=t===void 0?void 0:{code:t},i=r!==void 0&&yt(r),a=i&&ht(r)===`refresh-failed`;return{authError:i||/\b401\b|authentication|unauthorized|api[\s_-]?key|invalid.*key/i.test(e),isRefreshFailed:a,unsupported:/model_not_supported|not\s+supported|invalid.*model|model.*invalid/i.test(e),rateLimit:/\b429\b|rate.limit|rate_limit|exceed.*rate/i.test(e),pluginSource:n}}function N(e){return e?e.toLowerCase()===`xhigh`?`XHigh`:e.charAt(0).toUpperCase()+e.slice(1):``}function en(e,t,n){return e?`${t.on} ${n.on}`:`${t.off} ${n.off}`}function P(e,t,n){if(!t)return`(no model)`;let r=N(n),i=r?`${t}·${r}`:t,a=e.modelRegistry.find(t)?.contextWindow;return a?`${i} (${a>=1e6?`${(a/1e6).toFixed(1)}M`:`${Math.round(a/1e3)}K`})`:i}function tn(e,t){let n=[...ue(t.workspaceDir,t.activePlugins()),...t.computedPluginCommands()];for(let t of n)e.has(t.name)||e.register({name:t.name,description:t.description??`Project command (.claude/.otto)`,aliases:void 0,type:`action`,source:`builtin`,execute:()=>``});return n}function nn(e){return{id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}}function rn(e){return{type:`thinking`,thinking:e.text}}function an(e){return{type:`text`,text:e.text}}function on(e){return{type:`a2ui`,version:e.version,components:e.components}}function sn(e){let t=[],n=[];for(let r of e)switch(r.type){case`text`:r.text.trim()&&t.push(an(r));break;case`thinking`:r.text.trim()&&t.push(rn(r));break;case`tool_call`:n.push(nn(r));break;case`a2ui`:t.push(on(r));break}return{content:t,toolCalls:n}}function cn(e){return typeof e==`string`?e.trim():e.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()}function ln(e){if(Object.keys(e).length===0)return;let t=e.command??e.path??e.file_path??e.pattern??e.query;return typeof t==`string`?t:JSON.stringify(e)}function F(e,t){let n=new Map,r=new Set;if(t?.toolCalls)for(let[e,r]of t.toolCalls)n.set(e,r);if(t?.resolvedIds)for(let e of t.resolvedIds)r.add(e);for(let t of e){let e=t;if(e?.role===`assistant`&&Array.isArray(e.content))for(let t of e.content)t.type===`tool_call`&&n.set(t.id,t);else e?.role===`tool_result`&&r.add(e.toolCallId)}let i=[];for(let t of e){let e=t;if(!(!e||typeof e.role!=`string`)&&!e.internal){if(e.role===`user`){let t=cn(e.content);t&&i.push({role:`user`,content:t});continue}if(e.role===`assistant`){let{content:t}=sn(e.content??[]);t.length>0&&i.push({role:`assistant`,content:t});for(let t of e.content??[])t.type===`tool_call`&&!r.has(t.id)&&i.push({role:`tool`,name:t.name,args:ln(t.arguments),argsObj:t.arguments,result:void 0,isError:!1});continue}if(e.role===`tool_result`){let t=n.get(e.toolCallId),r=t?.arguments??{};i.push({role:`tool`,name:e.toolName||t?.name||`tool`,args:ln(r),argsObj:r,result:cn(e.content),isError:e.isError});continue}if(e.role===`system_notification`){let t=e;i.push({role:`tool_completion`,content:t.content,isError:t.isError??!1});continue}if(e.role===`system`){let t=e,n=typeof t.content==`string`?t.content:``;if(t.subtype===`model_switch`){i.push({role:`model_switch`,label:n});continue}if(t.subtype===`effort_switch`){i.push({role:`effort_switch`,label:n});continue}if(t.subtype===`run_paused`||t.subtype===`run_resumed`||t.subtype===`run_pause_cancelled`){i.push({role:t.subtype,label:n});continue}continue}}}return i}const un=bt(te);function dn(e,t,n){for(let r of e){if(r.role!==`assistant`)continue;let e=vt(r);for(let r of e){if(r.id!==t)continue;let e=r.arguments;if(n===`edit`)return{oldContent:typeof e.oldContent==`string`?e.oldContent:void 0,newContent:typeof e.newContent==`string`?e.newContent:void 0};if(n===`write`)return{newContent:typeof e.content==`string`?e.content:void 0}}}return{}}function fn(e,t){let n=D(e),r=e=>{let t=ne(`git`,[...e],{cwd:n,timeout:5e3,encoding:`utf-8`,maxBuffer:10*1024*1024});return t.status===0?t.stdout:null},i;if(t!==`delete`)try{i=Ge(e,`utf-8`)}catch{}let a,o=r([`ls-files`,`--full-name`,`--`,e]);if(o&&o.trim()){let e=r([`show`,`HEAD:${o.trim()}`]);e!==null&&(a=e)}return{oldContent:a,newContent:i}}async function pn(e,t){let n=D(e),r=async e=>{try{let{stdout:t}=await un(`git`,[...e],{cwd:n,encoding:`utf-8`,maxBuffer:10485760,signal:AbortSignal.timeout(5e3)});return{ok:!0,stdout:t}}catch{return{ok:!1,stdout:null}}},i;if(t!==`delete`)try{i=await st(e,`utf-8`)}catch{}let a,o=await r([`ls-files`,`--full-name`,`--`,e]);if(!o.ok)return t===`edit`?{error:`not a git repository (or git unavailable)`,newContent:i}:{oldContent:a,newContent:i};if(o.stdout&&o.stdout.trim()){let e=await r([`show`,`HEAD:${o.stdout.trim()}`]);e.ok&&e.stdout!==null&&(a=e.stdout)}return{oldContent:a,newContent:i}}function mn(e){return[...e].sort((e,t)=>t.savedAt-e.savedAt)}function hn(e,t){if(e!=null&&e.trim().length>0)return e.trim();let n=new Set(t.map(e=>e.name)),r=t.length+1,i=`draft-${r}`;for(;n.has(i);)r++,i=`draft-${r}`;return i}function gn(e,t,n){let r=Date.now();return{id:`${r.toString(36)}-${Math.random().toString(36).slice(2,6)}`,name:hn(e,n),text:t,savedAt:r}}function _n(e){return e.length<=50?[...e]:e.slice(-50)}function I(e){let t=F(e.session.visibleMessages()),n=e.session.getTurnSummaries();return!n||n.length===0?t:nt(t,n,e.session.getTurnCount()??t.filter(e=>e.role===`user`).length)}function vn(e){let{resumedNote:t,isFound:n,session:r,projState:i,tui:a}=e,o=I(r);a.messages.pushMessages(o),n&&o.length>0&&a.info.setTopView({session:r.id}),a.info.showToast(n?j.t(`cmd.titleSessionResumed`):j.t(`cmd.titleSession`),t.replace(/^↻ /,``)),yn({session:r,projState:i,tui:a,chatMsgs:o})}function yn(e){let{session:t,projState:n,tui:r}=e,i=e.chatMsgs??I(t);try{let e=t.session.getTodoList();e&&e.length>0&&!e.every(e=>e.status===`done`||e.status===`skipped`||e.status===`failed`)?(n.todoList=e.map(e=>({id:e.id,title:e.title,status:e.status,turn:e.turn})),r.stores.tasks.setTasks(e.map(e=>({id:e.id??``,title:e.title??``,status:e.status||`pending`,turn:e.turn})),void 0)):e&&e.length>0&&(t.session.setTodoList([]),r.info.showToast(j.t(`cmd.titleSession`),j.t(`cmd.resumeTodosAllDone`)));{let e=t.session.getTurnCount(),a=i.filter(e=>e.role===`user`).length,o=e??a;o>0&&(r.stores.tasks.setTurnBoundaries(Qe(i,o)),n.currentTurn=o)}let a=t.session.getEditedFiles();if(a&&a.length>0){let e=t.session.messages();r.stores.tasks.setEditedFiles(a.map(t=>{let n=t.operation,r=t.toolCallId?dn(e,t.toolCallId,n):{};return r.oldContent===void 0&&r.newContent===void 0&&(r=fn(t.path,n)),{path:t.path,operation:n,addedLines:t.addedLines,removedLines:t.removedLines,timestamp:t.timestamp,turnId:t.turnId,toolCallId:t.toolCallId,oldContent:r.oldContent,newContent:r.newContent}}))}let o=t.session.getSubagents();if(o&&o.length>0)for(let e of o)r.plugins.addSubagent({id:e.id,name:e.name,status:e.status,startedAt:e.startedAt});r.stores.tasks.setDrafts(mn(t.session.getDrafts()??[]))}catch(e){console.error(`\x1b[90m\x1b[2m[resume] panel state restore skipped (non-fatal): ${e instanceof Error?e.message:String(e)}\x1b[0m`)}}const L=new Map;function bn(e){return L.get(e)}function R(e){L.delete(e);let t=B.get(e);t&&(clearTimeout(t),B.delete(e))}function xn(){return[...L.values()]}function z(e,t,n){let r={id:e,transcript:F(t),streaming:``,status:n?`busy`:`idle`,lastActivityAt:Date.now()};return L.set(e,r),r}function Sn(e,t){let n=L.get(e);n&&(n.transcript=F(t),n.lastActivityAt=Date.now())}const Cn=new Set;function wn(e){return Cn.add(e),()=>{Cn.delete(e)}}const B=new Map;function Tn(e){let t=B.get(e.id);t&&clearTimeout(t),B.set(e.id,setTimeout(()=>{B.delete(e.id);for(let t of Cn)t(e)},300))}function En(e,t){let n=``,r=t=>{e.status!==t&&(e.status=t,Tn(e))};return[i=>{if(i.type===`stream.event`&&i.event?.type===`text_delta`){n+=i.event.delta,e.streaming=n,e.lastActivityAt=Date.now();return}if(i.type===`prompt.end`){e.streaming=``,n=``,r(`idle`),Sn(e.id,t());return}if(i.type===`error`){e.streaming=``,n=``,r(`idle`),e.lastActivityAt=Date.now();return}if(i.type===`approval.required`||i.type===`ask.user.required`){e.status=`needs-input`,e.pendingGate={type:i.type,id:String(i.id??``),data:i.data??{}},e.lastActivityAt=Date.now(),Tn(e);return}},()=>e]}function Dn(e){let t=[`session ${e.session.id}`,`status ${e.session.status} · ${e.session.messageCount} messages · cursor ${e.cursor}`,`authority host=${e.authority.hostname} pid=${e.authority.pid}`];if(e.session.messages.length>0){t.push(`recent:`);for(let n of e.session.messages.slice(-3))t.push(` · ${typeof n==`object`&&n&&`role`in n?String(n.role):`message`} … ${JSON.stringify(n).slice(0,120)}`)}else t.push(`(无历史消息)`);return t.join(`
|
|
4
|
+
`)}async function On(e,t){let n=e.join(` `).trim();if(!n){t.tui.info.showToast(`/session inspect`,"Usage: /session inspect <sessionId> —— peek a session running on `otto serve` (read-only snapshot)");return}let r=a(process.env.OTTO_SERVICE_URL??`http://127.0.0.1:8417`,globalThis.fetch,{token:process.env.OTTO_SERVICE_TOKEN}),s;try{s=await r.fetchSnapshot(n)}catch(e){if(e instanceof i){t.tui.info.showToast(`/session inspect`,`无法连接 otto serve:${e.message} —— 先 \`otto serve\`(或指定 --remote/OTTO_SERVICE_URL)`);return}if(e instanceof o){t.tui.info.showToast(`/session inspect`,`拉取 snapshot 失败:${e.message}`);return}t.tui.info.showToast(`/session inspect`,`查看失败:${e instanceof Error?e.message:String(e)}`);return}t.tui.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:`[session inspect]\n${Dn(s)}`}]}),t.tui.info.showToast(`/session inspect`,`已查看会话 ${s.session.id}(只读快照;如需实时参与该会话请用 otto --attach ${s.session.id})`)}function kn(e){let t=e.trim(),n=(t.split(`
|
|
5
|
+
`,1)[0]??``).replace(/\s+/g,` `).trim(),r=n.split(` `).slice(0,6).join(` `).slice(0,48).trim()||`note`;return{name:r,description:n.slice(0,60).trim()||r,content:t}}const An=e=>`把下面的笔记归纳成一个简短标题(≤6 词)和一句话描述。严格只按此格式输出:\nTITLE: <标题>\nDESC: <一句话描述>\n\n笔记:\n${e}`;function jn(e){let t=/TITLE:\s*(.+)/i.exec(e)?.[1]?.trim();if(!t)return null;let n=/DESC:\s*(.+)/i.exec(e)?.[1]?.trim();return{name:t.slice(0,60),description:(n||t).slice(0,80)}}async function Mn(e,t,n=8e3){let r=kn(e);if(!t)return r;let i=new AbortController,a=setTimeout(()=>i.abort(),n);a.unref?.();try{let n=jn(await t(An(e),{maxTokens:64,signal:i.signal}));if(n)return{name:n.name,description:n.description,content:r.content}}catch{}finally{clearTimeout(a)}return r}function Nn(e,t){return{onViewEntry:async n=>{let r=n.source===`project`?e:t;return r?r.read(n.name):null},onForget:async n=>{let r=n.source===`project`?e:t;r&&await r.forget(n.name)}}}async function Pn(e,t){let n=t.app.storage.autoMemory,r=t.app.userMemory,i=(e[0]??``).toLowerCase(),a=e=>t.tui.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:e}]}),o=(e,n,r)=>t.tui.messages.pushMessage({role:`command_echo`,command:e,status:n,summary:r});if(i===`user`){let i=e.slice(1).join(` `).trim();if(i){let e=kn(i);await r.record(e),o(`/memory user`,`ok`,j.t(`cmd.memoryUserSaved`,{name:e.name}));return}let a=r.getInjection().trim();t.tui.modal.openModal({kind:`memory`,projectIndex:``,userIndex:a,...Nn(n,r)});return}if(i===`project`){let e=n?n.getInjection().trim():``;t.tui.modal.openModal({kind:`memory`,projectIndex:e,userIndex:``,...Nn(n,r)});return}if(i===`forget`){let t=e.slice(1).join(` `).trim();if(!t){o(`/memory forget`,`warn`,j.t(`cmd.memoryForgetUsage`));return}let i=!1;n&&await n.read(t)!==null&&(await n.forget(t),i=!0),await r.read(t)!==null&&(await r.forget(t),i=!0),o(`/memory forget`,i?`ok`:`error`,i?j.t(`cmd.memoryDeleted`,{name:t}):j.t(`cmd.memoryNotFound`,{name:t}));return}if(e.length>0){let t=e.join(` `).trim(),i=(n?await n.read(t):null)??await r.read(t);i==null?o(`/memory ${t}`,`error`,j.t(`cmd.memoryNotFound`,{name:t})):a(i);return}let s=n?n.getInjection().trim():``,c=r.getInjection().trim();t.tui.modal.openModal({kind:`memory`,projectIndex:s,userIndex:c,...Nn(n,r)})}async function Fn(e,t){let n=j.t(`cmd.titleCompact`);if((e[0]??``).toLowerCase()===`log`){t.tui.panes.togglePane(`compactionLog`);return}if(!t.app.storage.memory){t.tui.info.showToast(n,j.t(`compact.unavailable`));return}t.tui.info.showToast(n,j.t(`compact.ing`)),t.tui.engine.pushEngineEvent({kind:`agentProcessing`,value:!0});try{let e=await t.state.session.compactNow();e.compacted?(t.tui.info.showToast(n,j.t(`compact.edResult`,{before:e.before,after:e.after})),t.callbacks.onContextCompacted()):t.tui.info.showToast(n,j.t(`compact.noop`))}catch(e){t.tui.info.showToast(n,j.t(`cmd.compactFailed`,{msg:e instanceof Error?e.message:String(e)}))}finally{t.tui.engine.pushEngineEvent({kind:`agentProcessing`,value:!1})}}async function In(e,t){t.state.session.isBusy&&t.tui.info.showToast(`/clear`,`Aborting current task before clearing…`),t.state.todoList=[],t.callbacks.resetCurrentTurn(),t.callbacks.onContextCompacted(),t.state.session.clearTurnPanels(),await t.state.session.clearContext(),t.tui.lifecycle.clearSession();let n=t.state.session.model;n&&t.tui.stores.tasks.setModelName(P(t.app,n.id,t.state.session.thinkingLevel));let r=n?.contextWindow??2e5,i=Yt({systemPrompt:t.state.session.systemPrompt,tools:t.state.session.tools,lastIn:0,lastOut:0,lastCacheRead:0,lastCacheWrite:0,contextWindow:r,modelName:n?.name??``,totIn:0,totOut:0});t.tui.stores.budget.setBudget(i),t.tui.stores.context.setBudget(i),t.tui.info.showToast(j.t(`cmd.titleCleared`),j.t(`cmd.clearedDone`))}async function Ln(e,t){let n=e.join(` `).replace(/\s+/g,` `).trim();if(!n){t.tui.info.showToast(`/rename`,`Usage: /rename <new title>`);return}t.state.session.renameSession(n),t.tui.lifecycle.setTerminalTitle(n),t.tui.stores.tasks.setSessionTitle(n),t.tui.info.showToast(`✎`,n)}async function Rn(e,t){let n,r,i=!1;for(let t=0;t<e.length;t++)e[t]===`--workspace`&&t+1<e.length?r=e[++t]:e[t]===`--archived`?i=!0:e[t].startsWith(`--`)||(n=e[t]);let a=r?{workspaceId:r}:void 0,o=await t.app.listAllSessions(a),s=o.filter(e=>e.status===`archived`).length,c=n?o:o.filter(e=>i?e.status===`archived`:e.status!==`archived`).filter(e=>(e.entryCount??e.messageCount)>0),l=(e,t,n)=>e.tui.info.showToast(t,n),u=async e=>{if(e===t.state.session.id){l(t,j.t(`cmd.titleResume`),j.t(`cmd.resumeAlreadyOn`));return}let n=t.app.getSession(e)??await t.app.sessionManager.restore(e);if(!n){l(t,j.t(`cmd.titleResume`),j.t(`cmd.resumeSessionNotFound`,{idShort:e.slice(0,8)}));return}let r=t.state.session;if(t.state.session.isBusy){let[e]=En(z(r.id,r.session.messages(),!0),()=>r.session.messages()),n=t.state.session.subscribe(t=>{e(t),(t.type===`prompt.end`||t.type===`error`)&&n()})}else z(r.id,r.session.messages(),!1);await t.callbacks.pasteBinder?.switchTo(r.id,n.id),t.callbacks.sessionUnsub?.(),t.state.session=n,t.state.interactive=new jt(n,{models:t.state.models,currentModel:n.model?.id,onModelChange:t.callbacks.applyModel}),t.state.reg=t.state.interactive.getRegistry(),t.callbacks.registerAllTuiCommands(),t.state.slashCommands=t.callbacks.refreshSlashCommands(),t.tui.plugins.setCommands(t.state.slashCommands),t.callbacks.attachSessionHandler();let i=n.model?.id;i?(t.state.currentModelId=i,t.state.modelReady=!0,t.tui.stores.tasks.setModelName(P(t.app,i,t.state.session.thinkingLevel))):(t.state.currentModelId=void 0,t.state.modelReady=!1,t.tui.stores.tasks.setModelName(`(no model)`)),t.tui.lifecycle.clearSession();let a=bn(n.id);if(a)t.tui.messages.pushMessages(a.transcript),R(n.id);else{let e=I(n);t.tui.messages.pushMessages(e)}t.callbacks.restoreSwitchedSession(),t.tui.info.setTopView({session:n.id}),l(t,j.t(`cmd.titleResume`),j.t(`cmd.resumeSwitched`,{idShort:e.slice(0,8),count:n.session.messages().length}))};if(n){let e=c.find(e=>e.id===n);if(e){await u(e.id);return}let r=c.find(e=>e.id.startsWith(n));if(r){await u(r.id);return}let i=c.find(e=>e.id.includes(n));if(i){await u(i.id);return}l(t,j.t(`cmd.titleResume`),j.t(`cmd.sessionNoMatch`,{arg:n}));return}if(c.length===0){l(t,j.t(`cmd.titleResume`),j.t(`cmd.resumeNoSaved`));return}let d=t.state.session.id,f=c.some(e=>e.pinned);function p(e){if(!e.pinned)return``;let t=e.pinGroup?.trim();return t?`\u0001${t.toLowerCase()}`:`\0`}let m=[...c].sort((e,t)=>{let n=p(e).localeCompare(p(t));if(n!==0)return n;let r=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-r});function h(e){if(f)return e.pinned?e.pinGroup?.trim()||j.t(`cmd.resumeDefaultPinGroup`):j.t(`cmd.resumeRecentGroup`)}function g(e){if(!e)return``;let t=Math.max(0,Math.floor((Date.now()-e.getTime())/1e3));return t<10?j.t(`cmd.agoJustNow`):t<60?j.t(`cmd.agoSeconds`,{n:t}):t<3600?j.t(`cmd.agoMinutes`,{n:Math.floor(t/60)}):t<86400?j.t(`cmd.agoHours`,{n:Math.floor(t/3600)}):j.t(`cmd.agoDays`,{n:Math.floor(t/86400)})}let _=c[0]?.updatedAt?g(c[0].updatedAt):`—`,v=c.reduce((e,t)=>e+(t.messageCount??0),0),ee=r?` [workspace: ${r}]`:``,y=[!i&&s>0?j.t(`cmd.resumeArchivedHiddenHint`,{count:s}):``].filter(Boolean),b=y.length>0?` ${y.join(` `)}`:``,te=new Map(xn().map(e=>[e.id,e])),x=0,S=0,ne=e=>{if(e.id===d)return``;let n=te.get(e.id);return n?n.status===`busy`?(x++,`● ${j.t(`cmd.resumeStatusBusy`)} · `):n.status===`needs-input`?(S++,`● ${j.t(`cmd.resumeStatusNeedsInput`)} · `):`· ${j.t(`cmd.resumeStatusIdle`)} · `:t.app.getSession(e.id)?.isBusy?(x++,`● ${j.t(`cmd.resumeStatusBusy`)} · `):``},C=[x>0?`${x} ${j.t(`cmd.resumeStatusBusy`)}`:``,S>0?`${S} ${j.t(`cmd.resumeStatusNeedsInput`)}`:``].filter(Boolean).join(`, `),w=C?` · ${C}`:``,T=j.t(`cmd.resumeSubtitle`,{sessions:c.length,msgs:v,recent:_})+w+b,re=i?j.t(`cmd.resumeArchivedOnlyTitle`,{n:c.length}):j.t(`cmd.resumeSelectTitle`,{n:c.length});t.tui.modal.openModal({kind:`select`,title:re+ee,subtitle:T,searchable:!0,maxVisible:13,options:m.map(e=>{let t=e.id===d?`●`:` `,n=e.pinned?j.t(`cmd.resumePinnedPrefix`):``,r=e.title||e.id.slice(0,8),i=e.status===`archived`?j.t(`cmd.resumeArchivedSuffix`):``,a=e.writeLocked?j.t(`cmd.resumeReadOnlySuffix`):``,o=`${n}${r}${i}`,s=g(e.updatedAt),c=[ne(e).trim(),s,j.t(`welcome.msgCountLabel`,{count:e.messageCount??0}),a.trim()].filter(Boolean);return{label:`${t} ${o}`,trailingLabel:c.join(` · `),value:e.id,searchText:o,group:h(e)}}),detailPlacement:`inline`,onSelect:e=>{u(e).catch(e=>l(t,j.t(`cmd.titleResume`),j.t(`cmd.resumeFailed`,{msg:e instanceof Error?e.message:String(e)})))},onCancel:()=>{}})}async function zn(e,t){t.app.reloadCapabilities().then(e=>{t.tui.plugins.setPluginRegistrations(t.app.getPluginRegistrations()),t.tui.info.showToast(j.t(`cmd.titleReload`),j.t(`cmd.reloadDone`,{mcpTools:e.mcpTools,models:e.models,agents:e.agents,teams:e.teams}))},e=>t.tui.messages.pushMessage({role:`command_echo`,command:`/extension reload`,status:`error`,summary:j.t(`cmd.reloadFailed`,{msg:e instanceof Error?e.message:String(e)})}))}async function Bn(e,t){let n=t.app.diagnoser.propose();if(n.length===0){t.tui.info.showToast(j.t(`cmd.titleDiagnose`),j.t(`cmd.diagnoseNone`));return}let r=n.map((e,t)=>j.t(`cmd.diagnoseLine`,{n:t+1,signalKind:e.evidence.signalKind,count:e.evidence.count,directive:e.directive}));t.tui.messages.pushMessage({role:`command_echo`,command:`/diagnose`,status:`warn`,summary:j.t(`cmd.diagnoseSummary`,{count:n.length}),detail:r.join(`
|
|
6
|
+
`)})}async function Vn(e,t){let n=e[0];if(n){let e=t.app.listSessions(),r=e.find(e=>e.id===n)??e.find(e=>e.id.startsWith(n))??e.find(e=>e.id.includes(n));if(!r){t.tui.info.showToast(j.t(`cmd.titleArchive`),j.t(`cmd.sessionNoMatch`,{arg:n}));return}if(r.status===`archived`){let e=t.app.getSession(r.id);if(!e){t.tui.info.showToast(j.t(`cmd.titleUnarchive`),j.t(`cmd.unarchiveNotLoaded`,{idShort:r.id.slice(0,8)}));return}e.unarchive(),t.tui.info.showToast(j.t(`cmd.titleUnarchive`),j.t(`cmd.unarchiveDone`,{idShort:r.id.slice(0,8),title:r.title??``}));return}if(!await t.app.archiveSession(r.id)){t.tui.info.showToast(j.t(`cmd.titleArchive`),j.t(`cmd.archiveCannot`,{idShort:r.id.slice(0,8)}));return}t.tui.info.showToast(j.t(`cmd.titleArchive`),j.t(`cmd.archiveDone`,{idShort:r.id.slice(0,8),title:r.title??``}));return}let r=t.state.session;if(r.status===`archived`){r.unarchive(),t.tui.info.showToast(j.t(`cmd.titleUnarchive`),j.t(`cmd.unarchiveDone`,{idShort:r.id.slice(0,8),title:r.title??``}));return}r.archive(),t.tui.info.showToast(j.t(`cmd.titleArchive`),j.t(`cmd.archiveDone`,{idShort:r.id.slice(0,8),title:r.title??``}))}async function Hn(e,t){let n,r=[];for(let i=0;i<e.length;i++)if(e[i]===`--group`){let r=e[i+1];if(r===void 0||r.startsWith(`--`)){t.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinGroupMissingValue`));return}n=r,i++}else r.push(e[i]);if(r.length===0&&n===void 0){let e=t.state.session;e.pinned?(e.unpin(),t.tui.info.showToast(j.t(`cmd.titleUnpin`),j.t(`cmd.unpinDone`,{idShort:e.id.slice(0,8),title:e.title??``}))):(e.pin(),t.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinDone`,{idShort:e.id.slice(0,8),title:e.title??``}))),V(t);return}if(r.length===0){Un(t.state.session.id,n,t),V(t);return}if(r.length===1){Un(r[0],n,t),V(t);return}let i=t.app.listSessions(),a=0,o=[];for(let e of r){let r=i.find(t=>t.id===e)??i.find(t=>t.id.startsWith(e))??i.find(t=>t.id.includes(e));if(!r){o.push(e.slice(0,8));continue}let s=t.app.getSession(r.id);if(!s){o.push(r.id.slice(0,8));continue}s.pin(n),a++}t.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinBatchSummary`,{seg:o.length>0?`${a} pinned (${o.length} not found: ${o.join(`, `)})`:`${a} pinned`})),V(t)}function V(e){let t=e.callbacks.refreshSlashCommands();e.tui.plugins.setCommands(t)}function Un(e,t,n){if(e===n.state.session.id){Wn(n.state.session,t,n);return}let r=n.app.listSessions(),i=r.find(t=>t.id===e)??r.find(t=>t.id.startsWith(e))??r.find(t=>t.id.includes(e));if(!i){n.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.sessionNoMatch`,{arg:e}));return}let a=n.app.getSession(i.id);if(!a){n.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinNotLoaded`,{idShort:i.id.slice(0,8)}));return}Wn(a,t,n)}function Wn(e,t,n){let r=e.id.slice(0,8),i=e.title??``;if(e.pinned){if(t===void 0||(e.pinGroup??``).toLowerCase()===t.toLowerCase()){e.unpin(),n.tui.info.showToast(j.t(`cmd.titleUnpin`),j.t(`cmd.unpinDone`,{idShort:r,title:i}));return}e.pin(t),n.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinGroupDone`,{idShort:r,title:i,group:t}));return}e.pin(t),t===void 0?n.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinDone`,{idShort:r,title:i})):n.tui.info.showToast(j.t(`cmd.titlePin`),j.t(`cmd.pinGroupDone`,{idShort:r,title:i,group:t}))}async function Gn(e,t){let n=t.state.session,r=n.model,i=r?.contextWindow??2e5,a=n.session.messages(),o=0,s=0,c=0,l=0,u=0,d=0,f=!1;for(let e=a.length-1;e>=0;e--){if(a[e]?.role!==`assistant`||!a[e]?.usage)continue;let t=a[e].usage;u+=t.inputTokens??0,d+=t.outputTokens??0,f||=(o=t.inputTokens??0,s=t.outputTokens??0,c=t.cacheReadTokens??0,l=t.cacheWriteTokens??0,!0)}let p=Yt({systemPrompt:n.systemPrompt,tools:n.tools,lastIn:o,lastOut:s,lastCacheRead:c,lastCacheWrite:l,contextWindow:i,modelName:r?.name??r?.id??``,totIn:u,totOut:d,messageCount:a.length});t.tui.stores.budget.setBudget(p),t.tui.stores.context.setBudget(p),t.tui.modal.openModal({kind:`context`})}async function H(e,t){let n=e[0];if(n===`fork`){await Kn(e.slice(1),t);return}if(n===`kill`){await Zn(e.slice(1),t);return}if(n===`pin`||n===`unpin`){await Hn(e.slice(1),t);return}if(n===`archive`||n===`unarchive`){await Vn(e.slice(1),t);return}if(n===`resume`){await Rn(e.slice(1),t);return}if(n===`compact`){await Fn(e.slice(1),t);return}if(n===`context`){await Gn(e.slice(1),t);return}if(n===`inspect`){await On(e.slice(1),t);return}if(n!==`unlock`){t.tui.info.showToast(j.t(`cmd.titleSessionCmd`),`Usage: /session fork | unlock <id> [--force] | kill <id> | inspect <id> | pin [<id>...] | archive [<id>] | resume [<id>] | compact | context`);return}let r=e.slice(1),i=r.includes(`--force`),a=r.find(e=>e!==`--force`);if(!a){t.tui.info.showToast(j.t(`cmd.titleSessionUnlock`),j.t(`cmd.unlockUsage`));return}let o=t.app.sessionManager.inspectSessionWriteLease(a),s=a.slice(0,8);if(!o.locked){t.tui.info.showToast(j.t(`cmd.titleSessionUnlock`),j.t(`cmd.unlockNotLocked`,{idShort:s}));return}let c=o.alive===!0?j.t(`cmd.unlockAliveConfirmed`):o.alive===!1?j.t(`cmd.unlockDeadConfirmed`):j.t(`cmd.unlockUnknownAlive`),l=Math.round((o.mtimeAgoMs??0)/1e3);if(!i){t.tui.messages.pushMessage({role:`command_echo`,command:`/session unlock`,summary:j.t(`cmd.unlockInspect`,{idShort:s,pid:o.pid,hostname:o.hostname,aliveLabel:c,mtimeAgoSec:l})});return}if(o.alive===!0){o.mtimeAgoMs!==void 0&&o.mtimeAgoMs>6e4&&t.tui.messages.pushMessage({role:`command_echo`,command:`/session unlock --force`,status:`warn`,summary:j.t(`cmd.unlockHungWarning`,{idShort:s})}),t.tui.modal.openModal({kind:`confirm`,title:j.t(`cmd.unlockConfirmTitle`),message:j.t(`cmd.unlockConfirmMessage`,{idShort:s,pid:o.pid,hostname:o.hostname}),confirmLabel:j.t(`cmd.unlockConfirmLabel`),cancelLabel:j.t(`cmd.unlockCancelLabel`),dangerous:!0,onConfirm:()=>{t.app.sessionManager.forceReleaseSessionWriteLease(a),t.tui.info.showToast(j.t(`cmd.titleSessionUnlock`),j.t(`cmd.unlockForcedDone`,{idShort:s}))},onCancel:()=>{t.tui.info.showToast(j.t(`cmd.titleSessionUnlock`),j.t(`cmd.unlockCancelled`))}});return}(o.mtimeAgoMs??0)<5e3&&t.tui.messages.pushMessage({role:`command_echo`,command:`/session unlock --force`,status:`warn`,summary:j.t(`cmd.unlockRecentReleaseHint`,{idShort:s})}),t.app.sessionManager.forceReleaseSessionWriteLease(a),t.tui.info.showToast(j.t(`cmd.titleSessionUnlock`),j.t(`cmd.unlockForcedDone`,{idShort:s}))}async function Kn(e,t){let n=t.state.session.id,r=await t.app.sessionManager.forkSession(n);if(!r){t.tui.info.showToast(j.t(`cmd.titleSessionFork`),j.t(`cmd.forkFailed`));return}let i=t.state.session;if(t.state.session.isBusy){let[e]=En(z(i.id,i.session.messages(),!0),()=>i.session.messages()),n=t.state.session.subscribe(t=>{e(t),(t.type===`prompt.end`||t.type===`error`)&&n()})}else z(i.id,i.session.messages(),!1);t.callbacks.sessionUnsub?.(),t.state.session=r,t.state.interactive=new jt(r,{models:t.state.models,currentModel:r.model?.id,onModelChange:t.callbacks.applyModel}),t.state.reg=t.state.interactive.getRegistry(),t.callbacks.registerAllTuiCommands(),t.state.slashCommands=t.callbacks.refreshSlashCommands(),t.tui.plugins.setCommands(t.state.slashCommands),t.callbacks.attachSessionHandler();let a=r.model?.id;a?(t.state.currentModelId=a,t.state.modelReady=!0,t.tui.stores.tasks.setModelName(P(t.app,a,t.state.session.thinkingLevel))):(t.state.currentModelId=void 0,t.state.modelReady=!1,t.tui.stores.tasks.setModelName(`(no model)`)),t.tui.lifecycle.clearSession();let o=I(r);t.tui.messages.pushMessages(o),t.callbacks.restoreSwitchedSession(),t.tui.info.setTopView({session:r.id}),t.tui.info.showToast(j.t(`cmd.titleSessionFork`),j.t(`cmd.forkSuccess`,{idShort:r.id.slice(0,8)}))}async function qn(e,t){let n=e[0],r=e[1];if(!n||!r){t.tui.info.showToast(`a2ui`,`Usage: /a2ui-action <componentId> <action> [payload-json]`);return}let i;if(e[2])try{i=JSON.parse(e.slice(2).join(` `))}catch{t.tui.info.showToast(`a2ui`,`Invalid JSON payload`);return}let a=t.state.session;a.session.emit({type:`a2ui.action`,sessionId:a.id,componentId:n,action:r,payload:i});let o=`[a2ui action] component="${n}" action="${r}"${i?` payload=${JSON.stringify(i)}`:``}`;a.session.prompt(o).catch(e=>{t.tui.info.showToast(`a2ui`,`Action failed: ${e instanceof Error?e.message:String(e)}`)})}async function Jn(e,t){let n=90,r=e.indexOf(`--ttl-days`);if(r>=0&&r+1<e.length){let t=parseInt(e[r+1],10);!isNaN(t)&&t>0&&(n=t)}let i=e.find(e=>e.startsWith(`--ttl-days=`));if(i){let e=parseInt(i.split(`=`)[1],10);!isNaN(e)&&e>0&&(n=e)}let a=e.includes(`--apply`),o=t.app.sessionStorageDir;if(!o){t.tui.info.showToast(`trace-gc`,`当前后端不支持 trace 文件管理(非本地磁盘存储)`);return}let s=await t.app.listAllSessions(),c=Date.now()-n*24*60*60*1e3,l=s.filter(e=>!((e.updatedAt?e.updatedAt.getTime():0)>=c||e.status===`archived`||e.pinned)),u=O(o,`trace`),d=[];for(let e of l){let t=O(u,`${encodeURIComponent(e.id)}.jsonl`);try{let n=await lt(t);d.push({session:e,path:t,size:n.size})}catch{}}if(!a){if(d.length===0){t.tui.info.showToast(`trace-gc`,`TTL ${n} 天:没有符合条件的 trace 文件`);return}let e=d.reduce((e,t)=>e+t.size,0),r=`TTL: ${n} 天 | 候选会话: ${d.length} | 预估回收: ${Yn(e)}`,i=[`会话 ID 大小 最后活跃 标题`,...d.map(e=>` ${e.session.id.slice(0,8)} ${Yn(e.size).padStart(9)} ${e.session.updatedAt?e.session.updatedAt.toISOString().slice(0,10):`未知`} ${(e.session.title??``).slice(0,60)}`),``,`TTL 基于会话最后一次持久化活动时间(agent 引擎产生新内容的时间),`,`可能与你最后一次查看/交互该会话的时间不同。`,``,`添加 --apply 参数以实际删除这些 trace 文件。`];t.tui.messages.pushMessage({role:`command_echo`,command:`/trace-gc --dry-run`,summary:r,detail:i.join(`
|
|
7
|
+
`)});return}if(d.length===0){t.tui.info.showToast(`trace-gc`,`TTL ${n} 天:没有需要清理的 trace 文件`);return}let f=0,p=0,m=[];for(let e of d)try{await ut(e.path),f++,p+=e.size}catch(t){m.push(`${e.session.id.slice(0,8)}: ${t instanceof Error?t.message:String(t)}`)}let h=`已清理 ${f}/${d.length} 个会话的 trace 文件,回收 ${Yn(p)}`;f>0?t.tui.info.showToast(`trace-gc`,h+(m.length>0?`\n失败:${m.join(`; `)}`:``)):m.length>0&&t.tui.messages.pushMessage({role:`command_echo`,command:`/trace-gc --apply`,status:`error`,summary:h,detail:`失败:${m.join(`; `)}`})}function Yn(e){return e>=1073741824?`${(e/1073741824).toFixed(1)} GB`:e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}async function Xn(e,t){let n=e[0];if(!n||n.startsWith(`--`)){t.tui.info.showToast(`archive-export`,`用法: /session-archive-export <sessionId> [--out <path>] [--and-delete]`);return}let r=e.includes(`--and-delete`),i,a=e.indexOf(`--out`);if(a>=0&&a+1<e.length){let t=e[a+1];t.startsWith(`--`)||(i=t)}let o=(await t.app.listAllSessions()).find(e=>e.id.startsWith(n)&&e.status!==`archived`);if(!o){t.tui.info.showToast(`archive-export`,`找不到 ID 前缀为 "${n}" 的活跃会话`);return}let s=o.id,c=s.slice(0,8),l=o.title??c,u=t.app.sessionStorageDir;if(!i&&!u){t.tui.info.showToast(`archive-export`,`当前后端不支持自动选择导出路径,请提供 --out <path>`);return}let d=i??O(u,`archives`,`${s}.json`),f;try{f=await t.app.exportSessionArchive(s,d)}catch(e){let n=e instanceof Error?e.message:String(e);t.tui.messages.pushMessage({role:`command_echo`,command:`/session-archive-export`,status:`error`,summary:`导出失败:${n}`});return}if(!r){t.tui.info.showToast(`archive-export`,`已导出 ${l}(${f.entryCount} entries, sha256=${f.checksum.slice(0,12)})→ ${f.path}`);return}let p=t.app.sessionManager.inspectSessionWriteLease(s);if(p.locked&&p.alive!==!1){let e=p.alive===!0?`(确认存活)`:`(无法判断存活)`,n=p.pid==null?``:`(pid=${p.pid},hostname=${p.hostname??`?`}${e})`;t.tui.messages.pushMessage({role:`command_echo`,command:`/session-archive-export --and-delete`,status:`error`,summary:`会话 ${c} 仍被其他 otto 进程占用${n},无法归档删除`,detail:`仅导出请去掉 --and-delete。`});return}t.tui.modal.openModal({kind:`confirm`,title:`确认删除会话`,message:`确认删除会话「${l}」(${c})?此操作不可逆,且会同步清理 trace/checkpoint。`,confirmLabel:`确认删除`,cancelLabel:`取消`,dangerous:!0,onConfirm:async()=>{try{await t.app.removeSession(s),t.tui.info.showToast(`archive-export`,`已归档并删除 ${l}(${f.entryCount} entries)→ ${f.path}`)}catch(e){let n=e instanceof Error?e.message:String(e);t.tui.messages.pushMessage({role:`command_echo`,command:`/session-archive-export --and-delete`,status:`error`,summary:`删除失败:${n}`,detail:`导出文件仍保存于 ${f.path}`})}},onCancel:()=>{t.tui.info.showToast(`archive-export`,`已取消删除。导出文件仍保存于 ${f.path}`)}})}async function Zn(e,t){let n=e[0];if(!n){t.tui.info.showToast(`session kill`,`Usage: /session kill <session-id>`);return}let r=t.app.listSessions(),i=r.find(e=>e.id===n)??r.find(e=>e.id.startsWith(n))??r.find(e=>e.id.includes(n));if(!i){t.tui.info.showToast(`session kill`,j.t(`cmd.sessionNoMatch`,{arg:n}));return}if(i.id===t.state.session.id){t.tui.info.showToast(`session kill`,`Cannot kill the current foreground session. /resume to another session first.`);return}let a=t.app.getSession(i.id);if(!a){R(i.id),t.tui.info.showToast(`session kill`,`Removed stale session ${i.id.slice(0,8)} from background.`);return}a.abort(),R(i.id),await t.app.removeSession(i.id),t.tui.info.showToast(`session kill`,`Killed session ${i.id.slice(0,8)}${i.title?` (${i.title})`:``}.`)}async function Qn(e,t){let n=t.state.session.id,r=t.state.session.session.metadata().title?.trim()||n.slice(0,8),i=await t.app.sessionManager.forkSession(n);if(!i){t.tui.info.showToast(j.t(`cmd.titleSessionFork`),j.t(`cmd.forkFailed`));return}let a=`${r} (fork)`,o=(await t.tui.modal.openModal({kind:`input`,title:j.t(`cmd.forkNameTitle`),placeholder:a,defaultValue:a})??``).trim()||a;i.renameSession(o);let s=t.state.session;if(t.state.session.isBusy){let[e]=En(z(s.id,s.session.messages(),!0),()=>s.session.messages()),n=t.state.session.subscribe(t=>{e(t),(t.type===`prompt.end`||t.type===`error`)&&n()})}else z(s.id,s.session.messages(),!1);await t.callbacks.pasteBinder?.fork(s.id,i.id),t.callbacks.sessionUnsub?.(),t.state.session=i,t.state.interactive=new jt(i,{models:t.state.models,currentModel:i.model?.id,onModelChange:t.callbacks.applyModel}),t.state.reg=t.state.interactive.getRegistry(),t.callbacks.registerAllTuiCommands(),t.state.slashCommands=t.callbacks.refreshSlashCommands(),t.tui.plugins.setCommands(t.state.slashCommands),t.callbacks.attachSessionHandler();let c=i.model?.id;c?(t.state.currentModelId=c,t.state.modelReady=!0,t.tui.stores.tasks.setModelName(P(t.app,c,t.state.session.thinkingLevel))):(t.state.currentModelId=void 0,t.state.modelReady=!1,t.tui.stores.tasks.setModelName(`(no model)`)),t.tui.lifecycle.clearSession();let l=I(i);t.tui.messages.pushMessages(l),t.callbacks.restoreSwitchedSession(),t.tui.info.setTopView({session:i.id}),t.tui.stores.tasks.setSessionTitle(o),t.tui.lifecycle.setTerminalTitle(o),t.tui.info.showToast(j.t(`cmd.titleSessionFork`),j.t(`cmd.forkSuccessNamed`,{title:o}))}function $n(e){switch(e){case`global`:return j.t(`cmd.scopeGlobal`);case`repository`:return j.t(`cmd.scopeRepository`);default:return j.t(`cmd.scopeProject`)}}function er(e,t,n){return{workspaceDir:e.app.workspaceDir,workspaceRoot:t===`repository`?he(e.app.workspaceDir):void 0,global:t===`global`,dryRun:n}}async function tr(e){let{name:t,type:n,scope:r,ctx:i,onDone:a}=e,o=i.app.settings.get(`mcp_servers`),s=await Me(t,n,er(i,r,!0),()=>o,async()=>{});if(!s.success){i.tui.info.showToast(j.t(`cmd.titleUninstall`),j.t(`cmd.uninstallFailed`,{err:s.error??j.t(`cmd.unknownError`)})),a?.();return}let c=s.plan??[];i.tui.modal.openModal({kind:`confirm`,title:j.t(`cmd.uninstallConfirmTitle`,{type:n,name:t}),message:[j.t(`cmd.uninstallConfirmScope`,{scopeLabel:$n(r)}),...c].join(`
|
|
8
|
+
`),confirmLabel:j.t(`cmd.uninstallConfirmYes`),dangerous:!0,onConfirm:()=>{nr(e)},onCancel:()=>a?.()})}async function nr(e){let{name:t,type:n,scope:r,ctx:i,onDone:a}=e,o=i.app.settings.get(`mcp_servers`),s=await Me(t,n,er(i,r,!1),()=>o,async e=>{await i.app.settings.persist({mcp_servers:e})});if(!s.success){i.tui.info.showToast(j.t(`cmd.titleUninstall`),j.t(`cmd.uninstallFailed`,{err:s.error??j.t(`cmd.unknownError`)})),a?.();return}i.tui.info.showToast(j.t(`cmd.titleUninstall`),j.t(`cmd.uninstalled`,{type:n,name:t,scope:$n(r)})),n===`plugin`&&await we(i.app.settings,t);try{await i.app.reloadCapabilities(),i.tui.plugins.setPluginRegistrations(i.app.getPluginRegistrations()),n===`plugin`&&i.app.pluginModuleManager.emitMonitorEvent({type:`plugin.uninstalled`,pluginId:t}),i.tui.info.showToast(j.t(`cmd.titleUninstall`),j.t(`cmd.uninstallRefreshed`))}catch(e){i.tui.messages.pushMessage({role:`command_echo`,command:`/extension`,status:`error`,summary:j.t(`cmd.uninstalledRefreshErr`,{err:e instanceof Error?e.message:String(e)})})}a?.()}async function rr(e,t){let n=t.app.settings.get(`keybinding_overrides`),r=()=>{t.tui.info.showToast(j.t(`cmd.keybindTitle`),j.t(`cmd.keybindSavedRestartHint`))};t.tui.modal.openModal({kind:`keybindingPanel`,overrides:n,onSave:(e,n,i)=>{let a=t.app.settings.get(`keybinding_overrides`)??{};t.app.settings.persist({keybinding_overrides:{...a,[e]:n}},i),r()},onSaveReplace:(e,n)=>{let i={...t.app.settings.get(`keybinding_overrides`)??{}};for(let t of e)i[t.commandId]=t.predicate;t.app.settings.persist({keybinding_overrides:i},n),r()},onReset:e=>{let n=t.app.settings.get(`keybinding_overrides`);if(!n||!(e in n))return;let{[e]:i,...a}=n;t.app.settings.persist({keybinding_overrides:a}),r()},onResetAll:()=>{t.app.settings.persist({keybinding_overrides:{}}),r()}})}function U(e,t,n){let r={ts:Date.now(),sessionId:e.sessionId,...e.turn===void 0?{}:{turn:e.turn},kind:`lifecycle`,node:t,payload:n};e.traceStore.append(e.sessionId,r).catch(()=>{})}function ir(e,t,n){let{tui:r,session:i,traceStore:a}=e,o=t===`model`?`model_switch`:`effort_switch`,s=t===`model`?`model.switch`:`effort.change`;r.messages.pushMessage({role:o,label:n.label}),i.session.append({role:`system`,subtype:o,content:n.label,level:`info`,timestamp:Date.now()});let c=i.session.getTurnCount(),l={ts:Date.now(),sessionId:i.id,...c===void 0?{}:{turn:c},kind:`lifecycle`,node:s,payload:{from:n.from??null,to:n.to,label:n.label}};a.append(i.id,l).catch(()=>{})}function ar(e,t){ir(e,`model`,t)}function or(e,t){ir(e,`effort`,t)}function sr(e,t){U(e,`retry.queued`,{attempt:t.attempt,max:t.max,...t.mode===void 0?{}:{mode:t.mode},...t.reason===void 0?{}:{reason:t.reason}})}function cr(e,t){U(e,`retry.cancelled`,{attempt:t.attempt})}function lr(e){U(e,`retry.reset`,{})}function ur(e,t,n){U(e,`pause.${t}`,{...n===void 0?{}:{source:n}})}const dr=(e,t,n)=>{let r=N(n),i=r?`${e}·${r}`:e;return t?`${i} (${t>=1e6?`${(t/1e6).toFixed(1)}M`:`${Math.round(t/1e3)}K`})`:i},W=[`low`,`medium`,`high`,`xhigh`,`max`];function fr(e,t){return[t,...e.filter(e=>e!==t)].slice(0,5)}function pr(e){let t=/\[@model:((?:\\\]|[^\]])+)\]/g,n=[];return{text:e.replace(t,(e,t)=>(n.push(t.replace(/\\\]/g,`]`)),``)).replace(/\n{3,}/g,`
|
|
9
|
+
|
|
10
|
+
`).trim(),modelIds:n}}async function mr(e,t){let n=pr(e),r=n.modelIds.at(-1);if(r&&r!==t.currentModelId){let e=await t.applyModel(r);e.includes(`not in registry`)&&t.onSwitchFailed?.(e)}return n.text}function hr(e){let t=/\[@effort:((?:\\\]|[^\]])+)\]/g,n=[];return{text:e.replace(t,(e,t)=>(n.push(t.replace(/\\\]/g,`]`)),``)).replace(/\n{3,}/g,`
|
|
11
|
+
|
|
12
|
+
`).trim(),levels:n}}function gr(e,t){let n=hr(e),r=n.levels.at(-1);return r&&(W.includes(r)?r!==t.currentEffort&&t.applyEffort(r):t.onInvalidLevel?.(r)),n.text}function _r(e){let{modelReady:t,currentModelId:n,contextWindow:r,tuiRef:i,pushBudgetNow:a,app:o,getSession:s,options:c,fmtDisplayModel:l,onEngineModelAction:u}=e;return async(e,d)=>{let f=s(),p=f.model?.id;c.value&&(c.value.model=e),n.value=e;let m=o.modelRegistry.find(e);if(m&&m.id===`__otto_setup__`)return`Model "${e}" is a setup placeholder — pick a real model with /model first.`;if(d?.persist!==!1)try{let t={model:e},n=o.settings.get(`model_slots`);n&&(t.model_slots={...n,default:e}),m&&(t.recent_models=fr(o.settings.get(`recent_models`)??[],e)),await o.settings.persist(t)}catch{}if(m){if(f.model=m,t.value=!0,e!==p&&(o.syncSessionToolsFor(f.id),ar({tui:i.value??{messages:{pushMessage:()=>{}}},session:f,traceStore:o.storage.traceStore},{from:p,to:m.id,label:dr(m.id,m.contextWindow,f.thinkingLevel)})),m.api.includes(`:`)&&o.firePluginActivationEvent?.(`onProvider:${m.api}`),u?.({kind:`setModel`,modelId:e}),i.value?.stores.tasks.setModelName(dr(m.id,m.contextWindow,f.thinkingLevel)),i.value?.engine.pushEngineEvent({kind:`maxOutputTokens`,n:m.maxOutputTokens}),o.authStore?.getAuthSource?o.authStore.getAuthSource(m.provider).then(e=>{e!==`oauth`&&i.value?.stores.notification.setProviderUsage(null)}).catch(()=>{i.value?.stores.notification.setProviderUsage(null)}):i.value?.stores.notification.setProviderUsage(null),e!==p&&o.storage.memory?.reconfigure){o.storage.memory.reconfigure({contextWindow:m.contextWindow,maxOutput:m.maxOutputTokens});try{let e=f.session.buildContext(),t=await o.storage.memory.ensureFitsWindow?.(e.messages,f.id);if(t?.compacted&&t.summary&&t.replacement){f.session.recordCompaction(t.summary,t.replacement),u?.({kind:`recordCompaction`,summary:t.summary,replacement:t.replacement});let e=m.contextWindow>=1e6?`${(m.contextWindow/1e6).toFixed(1)}M`:`${Math.round(m.contextWindow/1e3)}k`;i.value?.info.showToast(j.t(`cmd.titleModel`),j.t(`cmd.modelCompactedFor`,{window:e}))}}catch(e){console.error(`\x1b[3m\x1b[2m[model-switch] compaction skipped: ${e instanceof Error?e.message:String(e)}\x1b[0m`)}}return r.value=m.contextWindow,a.value?.(),e!==p&&!d?.silent&&i.value?.info.showToast(j.t(`cmd.titleModel`),j.t(`model.switchedTo`,{label:l(e)})),`Model → ${e} (active next turn).`}return f.model&&(i.value?.stores.tasks.setModelName(dr(f.model.id,f.model.contextWindow,f.thinkingLevel)),i.value?.engine.pushEngineEvent({kind:`maxOutputTokens`,n:f.model.maxOutputTokens})),`Model "${e}" not in registry — switch NOT applied (still ${f.model?.id??`unset`}). Check the id or /auth the provider.`}}function vr(e){let{getSession:t,app:n,tuiRef:r,options:i,fmtDisplayModel:a,applyModel:o}=e,s=!1,c=M(n.authStore,`delegation`),l=M(n.authStore,`main-session`);return async()=>{if(s)return`proceed`;s=!0;let u=t().model;if(!u)return`proceed`;let d=async e=>{try{return(await c(e)).usable}catch{return!1}},f=async e=>{try{return(await l(e)).usable}catch{return!1}},p=i.value?.model??n.settings.get(`model`);if(typeof p!=`string`||!p)return`proceed`;let m=n.modelRegistry.find(p);if(m&&await f(m))return m.id!==u.id&&await o(m.id),`proceed`;let h=m?j.t(`model.reasonUnauthenticated`,{provider:m.provider}):j.t(`model.reasonNotFound`),g=u;if(!await f(u)){let e=n.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`),t;for(let n of e)if(await d(n)){t=n;break}t??=e[0],t&&(g=t)}let _=g.id;return r.value?await new Promise(t=>{r.value?.modal.openModal({kind:`confirm`,title:j.t(`model.title`),message:[`${a(p)} → ${a(g.id)}`,``,h,``,j.t(`model.hint`)],confirmLabel:j.t(`model.permanent`),extraLabel:j.t(`model.login`),cancelLabel:j.t(`model.dismiss`),onConfirm:()=>{o(_,{persist:!0}).then(()=>t(`proceed`),()=>t(`proceed`))},onExtra:()=>{e.onLogin&&m?.provider?e.onLogin(m.provider):r.value?.info.showToast(j.t(`model.login`),j.t(`model.fallbackLoginToast`,{provider:m?.provider??``})),t(`abort`)},onCancel:()=>{e.onExitSession?.(),t(`abort`)}})}):`proceed`}}function yr(e){let t=e=>e.replace(/]/g,`\\]`),n=()=>{e.pluginInput.unregisterBySource(`extensions`);let n=e.extensions.list().filter(e=>e.category===`agent`||e.category===`skill`||e.category===`mcp`).map(e=>({label:`@${e.name}`,value:`[@${e.category}:${t(e.name)}]`,description:e.description||e.category,kind:e.category,source:`extensions`}));n.length&&e.pluginInput.register(n)};return n(),{refreshSigilExtensions:n}}function br(e){let t=e.trim().split(`
|
|
13
|
+
`)[0].replace(/\s+/g,` `).trim();return t.length>40?`${t.slice(0,39)}…`:t}function xr(e){e.pluginInput.unregisterBySource(`shortcut`);let t=(e.settings.get(`shortcuts`)??[]).map(e=>({label:`@${e.name}`,value:`[@shortcut:${e.name.replace(/]/g,`\\]`)}]`,description:br(e.text),kind:`shortcut`,source:`shortcut`}));t.length&&e.pluginInput.register(t)}function Sr(e,t){let n=e.modelRegistry.getAll();if(n.length===0)return;let r=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}k`:``,i=n.filter(e=>t.has(e.id)).sort((e,t)=>e.name.localeCompare(t.name)).map(e=>{let t=r(e.contextWindow),n=[];e.strengths&&e.strengths.length>0&&n.push(...e.strengths),t&&n.push(t);let i=n.length>0?`${e.provider} · ${n.join(` · `)}`:e.provider;return{label:e.name,value:`[@model:${e.id.replace(/]/g,`\\]`)}]`,description:i,kind:`model`,source:`builtin`}});e.pluginInput.unregisterBySource(`builtin-model`),e.pluginInput.register(i)}const Cr={low:`cmd.effortDescLow`,medium:`cmd.effortDescMedium`,high:`cmd.effortDescHigh`,xhigh:`cmd.effortDescXhigh`,max:`cmd.effortDescMax`};function wr(e){let t=W.map(e=>({label:N(e),value:`[@effort:${e}]`,description:j.t(Cr[e]??`cmd.effortDescLow`),kind:`effort`,source:`builtin-effort`}));e.pluginInput.unregisterBySource(`builtin-effort`),e.pluginInput.register(t)}async function Tr(e,t){t.tui.modal.openModal({kind:`shortcutsPanel`,shortcuts:t.app.getShortcuts(),onSave:(e,n,r)=>{t.app.saveShortcut(e,n,r).then(()=>xr(t.app)).catch(e=>{t.tui.info.showToast(`Shortcuts`,`Save failed: ${e instanceof Error?e.message:String(e)}`)})},onDelete:e=>{t.app.deleteShortcut(e).then(()=>xr(t.app)).catch(e=>{t.tui.info.showToast(`Shortcuts`,`Delete failed: ${e instanceof Error?e.message:String(e)}`)})}})}const Er={low:{label:`Low`,desc:`节约 Token,快速响应`,intensity:.2},medium:{label:`Medium`,desc:`平衡速度与推理质量`,intensity:.4},high:{label:`High`,desc:`深度推理,延迟较高`,intensity:.6},xhigh:{label:`XHigh`,desc:`更长推理链,更全面思考`,intensity:.8},max:{label:`Max`,desc:`全力推理,最慢但最深入`,intensity:1}};function Dr(e){let t=Math.round(e*8);return`━`.repeat(Math.max(0,t))+`╌`.repeat(Math.max(0,8-t))}async function Or(e,t){let n=e[0]?.toLowerCase();if(n&&W.includes(n)){kr(t,n);return}if(n){t.tui.info.showToast(j.t(`cmd.titleEffort`),j.t(`cmd.effortUnknown`,{arg:n,levels:W.join(` / `)}));return}let r=t.state.session.thinkingLevel;t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.selectEffortTitle`),options:W.map(e=>{let t=Er[e],n=e===r,i=Dr(t.intensity);return{label:t.label,value:e,detail:`${i} ${t.desc}${n?` · 当前`:``}`}}),onSelect:e=>kr(t,e),onCancel:()=>{}})}function kr(e,t){let n=e.state.session,r=n.thinkingLevel;n.thinkingLevel=t,e.app.settings.persist({thinking_level:t}),r!==t&&or({tui:e.tui,session:n,traceStore:e.app.storage.traceStore},{from:r,to:t,label:N(t)}),n.model?.id&&e.tui.stores.tasks.setModelName(P(e.app,n.model.id,t)),e.tui.info.showToast(j.t(`cmd.titleEffort`),t)}async function G(e,t){let n=e[0]?.toLowerCase();if(n===`general`||n===`gen`){K(t);return}if(n===`lang`||n===`language`){Vr(e.slice(1),t);return}if(n===`theme`){Hr(e.slice(1),t);return}if(n===`keybindings`||n===`kb`){rr(e.slice(1),t);return}if(n===`shortcuts`){Tr(e.slice(1),t);return}if(n===`effort`){Or(e.slice(1),t);return}if(n===`proxy`){c(e.slice(1),t);return}if(n){t.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`cmd.preferenceUsage`));return}Ar(t)}function Ar(e,t){let n=e.app.settings,r=n.get(`language`),i=r===`zh`?`中文 (zh)`:r===`en`?`English (en)`:`Auto`,a=e.state.themeRegistry??Xe(),o=n.get(`theme_preset`)??{},s=a.get(o.dark??`dark`)?.label??o.dark??`dark`;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.titlePreference`),detailPlacement:`inline`,options:[{label:j.t(`cmd.prefOptionGeneral`),value:`general`,detail:j.t(`cmd.prefDescGeneral`)},{label:j.t(`cmd.prefOptionLang`),trailingLabel:i,value:`lang`,detail:j.t(`cmd.prefDescLang`)},{label:j.t(`cmd.prefOptionTheme`),trailingLabel:s,value:`theme`,detail:j.t(`cmd.prefDescTheme`)},{label:`Keybindings`,value:`keybindings`,detail:`Browse, search, remap, reset shortcuts`},{label:`Shortcuts`,value:`shortcuts`,detail:`Manage custom @ text shortcuts`},{label:`Effort`,value:`effort`,detail:`Switch reasoning effort (low|medium|high|xhigh|max)`},{label:`Proxy`,value:`proxy`,detail:`Configure HTTP proxy`}],defaultSelectedValue:t,onSelect:t=>{t===`general`?K(e):t===`lang`?Vr([],e):t===`theme`?Hr([],e):t===`keybindings`?rr([],e):t===`shortcuts`?Tr([],e):t===`effort`?Or([],e):t===`proxy`&&c([],e)},onCancel:()=>{}})}let jr;function K(e,t,n,r){let i=e.app.settings,a=i.get(`notification`),o=i.get(`nickname`)??``,s=a?.on_completion!==!1,c=a?.sound===!0,l=i.get(`auto_update_check`)!==!1,u=i.get(`skill_loop`)?.enabled===!0,d=e.app.activePlugins().some(e=>e.id===w),f={on:A.toggleOn,off:A.toggleOff},p={on:j.t(`cmd.toggleOn`),off:j.t(`cmd.toggleOff`)},m=e=>en(e,f,p);e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.selectGeneralTitle`),detailPlacement:`inline`,subtitle:t,replace:r,options:[{label:j.t(`cmd.genNickname`),trailingLabel:o||`—`,value:`nickname`,detail:j.t(`cmd.genNicknameDesc`)},{label:j.t(`cmd.genCompletionNotice`),trailingLabel:m(s),value:`completion`,detail:j.t(`cmd.genCompletionNoticeDesc`)},{label:j.t(`cmd.genSound`),trailingLabel:m(c),value:`sound`,detail:j.t(`cmd.genSoundDesc`)},{label:j.t(`cmd.genUpdateCheck`),trailingLabel:m(l),value:`updateCheck`,detail:j.t(`cmd.genUpdateCheckDesc`)},{label:j.t(`cmd.genSkillLoop`),trailingLabel:d?m(u):j.t(`cmd.genSkillLoopMissing`),value:`skillLoopPanel`,detail:j.t(`cmd.genSkillLoopEntryDesc`)}],defaultSelectedValue:n??jr,onHighlight:e=>{jr=e},onSelect:t=>{if(t===`nickname`){Mr(e);return}if(t===`skillLoopPanel`){q(e);return}Br(e,t)},onCancel:()=>{Ar(e,`general`)}})}async function Mr(e){let t=await e.tui.modal.openModal({kind:`input`,title:j.t(`cmd.genNicknameInputTitle`),placeholder:j.t(`cmd.genNicknamePlaceholder`)});if(t==null){K(e);return}let n=t.trim();await e.app.settings.persist({nickname:n}),K(e,j.t(`cmd.genSaved`))}const Nr=[4,6,12,20];function Pr(e){let t=typeof e==`number`?e:6,n=Nr.includes(t)?`genSkillLoopThr${t}`:``;return n?j.t(`cmd.${n}`):String(t)}function Fr(e){let t=e.app.settings,n=t.get(`skill_loop`)?.min_messages??6;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.genSkillLoopThresholdTitle`),detailPlacement:`inline`,options:Nr.map(e=>({label:j.t(`cmd.genSkillLoopThr${e}`),value:String(e),detail:j.t(`cmd.genSkillLoopThr${e}Desc`),trailingLabel:e===n?A.toggleOn:void 0})),onSelect:n=>{(async()=>{let r={...t.get(`skill_loop`)??{}};r.min_messages=Number(n),await t.persist({skill_loop:r}),q(e,j.t(`cmd.genSaved`),`threshold`)})()},onCancel:()=>{q(e,void 0,`threshold`)}})}const Ir=[3,14,30,365];function Lr(e){let t=typeof e==`number`?e:14;return Ir.includes(t)?j.t(`cmd.genSkillLoopCd${t}`):j.t(`cmd.genSkillLoopCdDays`,{n:t})}function Rr(e){let t=e.app.settings,n=t.get(`skill_loop`)?.dismiss_cooldown_days??14;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.genSkillLoopCooldownTitle`),detailPlacement:`inline`,options:Ir.map(e=>({label:j.t(`cmd.genSkillLoopCd${e}`),value:String(e),detail:j.t(`cmd.genSkillLoopCd${e}Desc`),trailingLabel:e===n?A.toggleOn:void 0})),onSelect:n=>{(async()=>{let r={...t.get(`skill_loop`)??{}};r.dismiss_cooldown_days=Number(n),await t.persist({skill_loop:r}),q(e,j.t(`cmd.genSaved`),`cooldown`)})()},onCancel:()=>{q(e,void 0,`cooldown`)}})}function q(e,t,n){let r=e.app.settings,i=r.get(`skill_loop`)?.enabled===!0,a=e.app.activePlugins().some(e=>e.id===w),o={on:A.toggleOn,off:A.toggleOff},s={on:j.t(`cmd.toggleOn`),off:j.t(`cmd.toggleOff`)};if(!a){e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.skillLoopPanelTitle`),detailPlacement:`inline`,subtitle:j.t(`cmd.genSkillLoopMissingHint`),options:[{label:j.t(`cmd.genSkillLoopMissing`),value:`noop`,detail:``}],onSelect:()=>{K(e,void 0,`skillLoopPanel`)},onCancel:()=>{K(e,void 0,`skillLoopPanel`)}});return}e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.skillLoopPanelTitle`),detailPlacement:`inline`,subtitle:t,defaultSelectedValue:n,options:[{label:j.t(`cmd.skillLoopOnOff`),trailingLabel:en(i,o,s),value:`toggle`,detail:j.t(`cmd.genSkillLoopEntryDesc`)},...i?[{label:j.t(`cmd.genSkillLoopThreshold`),trailingLabel:Pr(r.get(`skill_loop`)?.min_messages),value:`threshold`,detail:j.t(`cmd.genSkillLoopThresholdDesc`)},{label:j.t(`cmd.genSkillLoopCooldown`),trailingLabel:Lr(r.get(`skill_loop`)?.dismiss_cooldown_days),value:`cooldown`,detail:j.t(`cmd.genSkillLoopCooldownDesc`)},{label:j.t(`cmd.genSkillLoopStatus`),value:`status`,detail:j.t(`cmd.genSkillLoopStatusDesc`)}]:[]],onSelect:t=>{if(t===`threshold`){Fr(e);return}if(t===`cooldown`){Rr(e);return}if(t===`status`){zr(e);return}(async()=>{let t={...r.get(`skill_loop`)??{}},n=t.enabled!==!0;t.enabled=n,await r.persist({skill_loop:t}),q(e,n?j.t(`cmd.genSkillLoopOn`):j.t(`cmd.genSkillLoopOff`),`toggle`)})()},onCancel:()=>{K(e,void 0,`skillLoopPanel`)}})}function zr(e){let t=e.app.settings,n=e.app.activePlugins().some(e=>e.id===w),r=Se({workspaceKey:e.app.workspaceRef?.key??C,now:Date.now(),cooldownDays:t.get(`skill_loop`)?.dismiss_cooldown_days,pluginInstalled:n}),i=e=>j.t(`cmd.skillLoopStatusCount`,{n:e}),a=[];if(!n)a.push({label:j.t(`cmd.skillLoopStatusNotInstalled`),value:`noop`,detail:j.t(`cmd.genSkillLoopMissingHint`)});else{a.push({label:j.t(`cmd.skillLoopStatusEpisodes`),trailingLabel:i(r.episodeCount),value:`noop`,detail:j.t(`cmd.skillLoopStatusSuccess`)+` `+i(r.successCount)},{label:j.t(`cmd.skillLoopStatusPending`),trailingLabel:i(r.pendingCount),value:`noop`,detail:i(r.candidateCount)+` `+j.t(`cmd.skillLoopStatusCandidates`)+` · `+i(r.coolingCount)+` `+j.t(`cmd.skillLoopStatusCooling`)});for(let e of r.pending)a.push({label:e.taskSignature,trailingLabel:j.t(`cmd.skillLoopStatusTimes`,{n:e.size}),value:`noop`,detail:j.t(`cmd.skillLoopStatusGroupPending`)});for(let e of r.recentSignatures)a.push({label:e,value:`noop`,detail:j.t(`cmd.skillLoopStatusGroupRecent`)})}let o=r.episodeCount===0?`cmd.skillLoopStatusEmpty`:{"no-episodes":`cmd.skillLoopStatusHintNoEpisodes`,"not-enough-successes":`cmd.skillLoopStatusHintNotEnough`,"no-cluster-yet":`cmd.skillLoopStatusHintNoCluster`}[r.nextProposalHint??``]??``;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.skillLoopStatusTitle`),detailPlacement:`inline`,subtitle:o?j.t(o):void 0,options:a,onSelect:()=>{q(e,void 0,`status`)},onCancel:()=>{q(e,void 0,`status`)}})}async function Br(e,t){let n=e.app.settings;if(t===`updateCheck`){let r=n.get(`auto_update_check`)!==!1;await n.persist({auto_update_check:!r}),K(e,j.t(`cmd.genSaved`),t,!0);return}let r={...n.get(`notification`)??{}};t===`completion`?r.on_completion=r.on_completion===!1:t===`sound`&&(r.sound=r.sound!==!0),await n.persist({notification:r}),K(e,j.t(`cmd.genSaved`),t,!0)}function Vr(e,t){let n=e[0]?.toLowerCase();if(n===`en`||n===`zh`||n===`auto`){Gr(t,n);return}if(n){t.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`pref.languageUsage`));return}t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.selectLanguageTitle`),detailPlacement:`inline`,options:[{label:`中文 (zh)`,value:`zh`,detail:j.t(`cmd.langDescZh`)},{label:`English (en)`,value:`en`,detail:j.t(`cmd.langDescEn`)},{label:`Auto`,value:`auto`,detail:j.t(`cmd.langDescAuto`)}],onSelect:e=>Gr(t,e),onCancel:()=>{Ar(t,`lang`)}})}function Hr(e,t){Ur(t)}function Ur(e){let t=e.state.themeRegistry??Xe(),n=e.app.settings.get(`theme_preset`)??{},r=t.get(n.dark??`dark`)??t.get(`dark`),i=t.get(n.light??`light`)??t.get(`light`);e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.prefOptionTheme`),detailPlacement:`inline`,options:[{label:j.t(`cmd.themeDarkPresetOption`),value:`preset-dark`,detail:j.t(`cmd.themeDarkPresetDesc`),trailingLabel:r?.label},{label:j.t(`cmd.themeLightPresetOption`),value:`preset-light`,detail:j.t(`cmd.themeLightPresetDesc`),trailingLabel:i?.label}],onSelect:t=>{if(t===`preset-dark`){Wr(e,`dark`);return}if(t===`preset-light`){Wr(e,`light`);return}},onCancel:()=>{Ar(e,`theme`)}})}function Wr(e,t){let n=e.state.themeRegistry??Xe(),r=e.app.settings.get(`theme_preset`)??{},i=r[t]??t,a=[...n.list().filter(e=>e.appearance===t).map(e=>({label:e.label,value:e.id,detail:e.source.kind===`builtin`?j.t(`cmd.themePresetBuiltin`):j.t(`cmd.themePresetFromExtension`,{id:e.source.extensionId}),trailingLabel:e.id===i?`✓`:void 0})),{label:j.t(`cmd.themePresetReset`),value:`__reset__`,detail:j.t(`cmd.themePresetResetDesc`)}],o=n=>{let i={...r};n===void 0?delete i[t]:i[t]=n,e.tui.lifecycle.setPresetSelection?.(i)},s=()=>{e.tui.lifecycle.setPresetSelection?.(r)};e.tui.modal.openModal({kind:`select`,title:t===`dark`?j.t(`cmd.themePresetTitleDark`):j.t(`cmd.themePresetTitleLight`),options:a,onHighlight:e=>{o(e===`__reset__`?void 0:e)},onSelect:i=>{let a=i===`__reset__`?void 0:i,o={...r};a===void 0?delete o[t]:o[t]=a,e.tui.lifecycle.setPresetSelection?.(o),e.app.settings.persist({theme_preset:o},`global`);let s=a===void 0?t===`dark`?n.get(`dark`)?.label:n.get(`light`)?.label:n.get(a)?.label;e.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`cmd.themePresetSaved`,{label:s??a??t}))},onCancel:()=>{s(),e.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`cmd.selectCancelled`))}})}function Gr(e,t){e.state.currentLang=e.tui.lifecycle.setLanguage(t),Nt(t),e.tui.plugins.setCommands(e.callbacks.refreshSlashCommands()),e.app.settings.persist({language:t}),e.tui.info.showToast(j.t(`cmd.titleLanguage`),j.t(`pref.languageSwitched`,{l:e.state.currentLang,name:e.state.currentLang===`zh`?`中文`:`English`}))}async function Kr(e,t){let n=t.app.workspaceDir??process.cwd(),i=e[0]?.toLowerCase()??`status`;if(i===`plugin`){let i=e[1]?.toLowerCase()===`untrust`,a=i?e[2]:e[1];if(!a){t.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginUsage`,{seg:(i?`untrust`:`trust`)==`untrust`?`untrust `:``}));return}let o=r({cwd:n,homedir:v()}).find(e=>e.id===a);if(!o){t.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginNotFound`,{id:a}));return}if(i){try{Ne(o.dir)}catch(e){t.tui.info.showToast(j.t(`cmd.titlePlugin`),`撤销信任失败,权限未收回:${e instanceof Error?e.message:String(e)}`);return}t.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginUntrusted`,{id:a}))}else ci(t,o);return}if(i===`trust`){je(n),t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatTrusting`)),t.app.reloadCapabilities().then(e=>{t.tui.plugins.setPluginRegistrations(t.app.getPluginRegistrations()),t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatTrusted`,{count:e.mcpTools}))},e=>t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatReloadFailed`,{err:e instanceof Error?e.message:String(e)})));return}if(i===`untrust`){Pe(n),t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatUntrusted`));return}let a=pe(n),o=le(n,{interactive:!0}),s=[];if(a.surface.any){let e=[a.surface.mcpJson?`.mcp.json`:null,a.surface.commands?`.claude/commands`:null].filter(Boolean),t=a.trusted?j.t(`cmd.compatTrustedLabel`):j.t(`cmd.compatUntrustedLabel`);s.push(`${e.join(j.t(`cmd.listSep`))} ${t}`)}if(o.highRiskKeys.length>0){let e=o.highRiskKeys.join(j.t(`cmd.listSep`));s.push(o.gated?j.t(`cmd.compatConfigGated`,{keys:e}):j.t(`cmd.compatConfigActive`,{keys:e}))}let c=r({cwd:n,homedir:v()}).filter(e=>e.scope===`project`||e.scope===`repository`);for(let e of c){let t=me(e);if(!t.surface.any)continue;let n=t.gated?j.t(`cmd.compatUntrustedLabel`):j.t(`cmd.compatTrustedLabel`);s.push(`plugin:${e.id} ${n}${t.gated?` → /trust plugin ${e.id}`:``}`)}if(s.length===0){t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatNone`));return}o.gated?t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleCompat`),lines:s}):t.tui.info.showToast(j.t(`cmd.titleCompat`),s.join(`
|
|
14
|
+
`))}async function qr(e,t){let n=e[0];if(n===`clear`){t.app.clearSessionAlwaysAllow(t.state.session.id),t.tui.info.showToast(j.t(`cmd.titlePermissions`),j.t(`cmd.permsCleared`));return}if(n===`add`||n===`remove`){let r=e.slice(1).join(` `).trim();if(!r){t.tui.info.showToast(j.t(`cmd.titlePermissions`),j.t(`cmd.permsManageHint`));return}if(n===`add`){if(!t.app.isWellFormedAllowEntry(r)){t.tui.info.showToast(j.t(`cmd.titlePermissions`),j.t(`cmd.permsInvalidEntry`,{entry:r}));return}await t.app.allowToolAlways(r),t.tui.info.showToast(j.t(`cmd.titlePermissions`),j.t(`cmd.permsAdded`,{entry:r}))}else{let e=await t.app.disallowToolAlways(r);t.tui.info.showToast(j.t(`cmd.titlePermissions`),e?j.t(`cmd.permsRemoved`,{entry:r}):j.t(`cmd.permsNotFound`,{entry:r}))}return}let r=t.app.getSessionAlwaysAllow(t.state.session.id),i=t.app.settings.get(`permission_always_allow`)??[],a=(e,t)=>`${e} ${t.length?t.join(`, `):j.t(`cmd.permsEmpty`)}`;t.tui.modal.openModal({kind:`permissions`,lines:[a(j.t(`cmd.permsSessionLabel`),r),a(j.t(`cmd.permsProjectLabel`),i),``,j.t(`cmd.permsClearHint`),j.t(`cmd.permsManageHint`)]})}async function Jr(e,t){let r=n();t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeChecking`,{current:r}));let i=await Ft(r);if(!i){t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUpgrade`),lines:[j.t(`cmd.upgradeNoNetwork`)]});return}if(!i.newer){t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeLatest`,{current:r}));return}t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUpgrade`),lines:j.t(`cmd.upgradeAvailableLines`,{returnObjects:!0,current:r,latest:i.latest})})}async function Yr(e,t){if(!e.includes(`--force`))return!1;t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgrading`));let r=await Ft(n());if(!r)return t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeNoNetwork`)),!0;if(!r.newer)return t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeLatest`,{current:n()})),!0;let{ok:i,error:a}=await zt(r.latest);return i?(t.state.restartRequested=!0,t.tui.lifecycle.stop(),!0):(t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeFailed`,{err:a??j.t(`cmd.unknownError`)})),!0)}async function Xr(e,t,n){let r=j.t(`cmdDesc`,{returnObjects:!0}),i={session:j.t(`cmd.helpGroupSession`),model:j.t(`cmd.helpGroupModel`),agent:j.t(`cmd.helpGroupAgent`),debug:j.t(`cmd.helpGroupDebug`),ui:j.t(`cmd.helpGroupUi`),other:j.t(`cmd.helpGroupOther`)},a=[];for(let e of Ga){let t=n.filter(t=>t.group===e&&!t.tuiHidden);if(t.length!==0)for(let n of t){let t=n.aliases?.length?[n.name,...n.aliases].map(e=>`/${e}`).join(`, `):`/${n.name}`;a.push({label:t,value:n.name,detail:r[n.name]??n.description??void 0,group:i[e],searchText:[n.name,...n.aliases??[]].join(` `)})}}let o=`${j.t(`cmd.helpPrefixes`)} !<cmd> ${j.t(`cmd.helpPrefixShell`)} · @<file> ${j.t(`cmd.helpPrefixFile`)}`;t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.titleCommands`),subtitle:o,searchable:!0,options:a,onSelect:e=>{Ya(e,[],t)},onCancel:()=>{}})}async function Zr(e,t){t.tui.panes.togglePane(`history`)}async function Qr(e,t){t.tui.panes.togglePane(`notifications`)}async function $r(e,t){t.tui.panes.togglePane(`prompts`)}async function ei(e,t){t.tui.panes.setServices(!0)}async function ti(e,t){t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeCheckScanning`));try{let e=ke({workspaceDir:t.app.workspaceDir,workspaceRoot:he(t.app.workspaceDir),scope:`all`});if(e.length===0){t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeCheckNoVersioned`));return}let n=await oe(e),r=[],i=0;for(let e of n){let t=`[${e.type}]`;e.error?r.push(`${t} ${e.name} v${e.installed} — ${e.error}`):e.newer?(i++,r.push(j.t(`cmd.upgradeCheckLineUpdate`,{tag:t,name:e.name,installed:e.installed,latest:e.latest??``}))):r.push(j.t(`cmd.upgradeCheckLineLatest`,{tag:t,name:e.name,installed:e.installed}))}i>0&&(r.push(``),r.push(j.t(`cmd.upgradeCheckSummary`,{count:i}))),t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUpgradeCheck`),lines:r})}catch(e){t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeCheckFailed`,{err:e instanceof Error?e.message:String(e)}))}}var ni=Ct({confirmHighRiskCapabilities:()=>li,formatPluginContributionsSummary:()=>oi,handleDelegatesToggle:()=>di,handleExtension:()=>J,handleJobStart:()=>fi,pluginCapabilityLabel:()=>si,promptPluginTrust:()=>ci,runPluginInstall:()=>ui});function ri(e){return!e.endsWith(O(`.claude`,`skills`))}function ii(e,t){return ri(t)?e===`project`?`project`:e===`global`?`global`:null:null}function ai(e,t){let n={project:`project`,global:`global`,plugin:`plugin`,inline:`inline`}[e]??e;return t?`${n} (${t})`:n}function oi(e){let t=[];return e.providerApis>0&&t.push(`provider(${e.providerApis})`),e.tools>0&&t.push(`tools(${e.tools})`),e.renderers>0&&t.push(`renderers(${e.renderers})`),e.statusItems>0&&t.push(`statusItems(${e.statusItems})`),e.fileViewers&&e.fileViewers>0&&t.push(`fileViewers(${e.fileViewers})`),t.length?t.join(`, `):void 0}function si(e){switch(e){case`provider`:return j.t(`cmd.pluginCapabilityProvider`);case`tools`:return j.t(`cmd.pluginCapabilityTools`);case`tui.renderer`:return j.t(`cmd.pluginCapabilityTuiRenderer`);case`network`:return j.t(`cmd.pluginCapabilityNetwork`);case`wire-protocol`:return j.t(`cmd.pluginCapabilityWireProtocol`);case`a2ui.component`:return j.t(`cmd.pluginCapabilityA2uiComponent`);case`panel.backend`:return j.t(`cmd.pluginCapabilityPanelBackend`);case`input.resolver`:return j.t(`cmd.pluginCapabilityInputResolver`);case`a2ui.renderer`:return j.t(`cmd.pluginCapabilityA2uiRenderer`);default:return}}function ci(e,t){let n=me(t),r=n.pendingCapabilities,i=()=>{Ae(t.dir),r.length>0&&ge(t.dir,r),e.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginTrusting`,{id:t.id})),e.app.reloadCapabilities().then(n=>{e.tui.plugins.setPluginRegistrations(e.app.getPluginRegistrations()),e.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginTrusted`,{id:t.id,count:n.mcpTools}))},t=>e.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.compatReloadFailed`,{err:t instanceof Error?t.message:String(t)})))},a=n.surface;if(!a.any&&r.length===0){i();return}let o=[j.t(`cmd.pluginTrustConfirmIntro`)];if(a.mcpJson&&o.push(`• ${j.t(`cmd.pluginSurfaceMcp`)}`),a.commands&&o.push(`• ${j.t(`cmd.pluginSurfaceCommands`)}`),a.scripts&&o.push(`• ${j.t(`cmd.pluginSurfaceScripts`)}`),a.panels&&o.push(`• ${j.t(`cmd.pluginSurfacePanels`)}`),a.skills&&o.push(`• ${j.t(`cmd.pluginSurfaceSkills`)}`),a.agents&&o.push(`• ${j.t(`cmd.pluginSurfaceAgents`)}`),r.length>0){o.push(``,j.t(`cmd.pluginCapabilityIntro`));for(let e of r){let t=si(e);t&&o.push(`• ${t}`)}}o.push(``,j.t(`cmd.pluginTrustConfirmHint`)),e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.pluginTrustConfirmTitle`,{id:t.id}),subtitle:o.join(`
|
|
15
|
+
`),layout:`buttons`,options:[{label:j.t(`cmd.pluginTrustConfirmAction`),value:`trust`,color:`accent`},{label:j.t(`cmd.commonCancel`),value:`cancel`,color:`gray`}],onSelect:e=>{e===`trust`&&i()},onCancel:()=>{}})}async function li(e,t,n){if(t.length===0)return!0;let r=[j.t(`cmd.pluginCapabilityIntro`)];for(let e of t){let t=si(e);t&&r.push(`• ${t}`)}return new Promise(t=>{n.tui.modal.openModal({kind:`select`,title:j.t(`cmd.pluginInstallConfirmTitle`,{name:e}),subtitle:r.join(`
|
|
16
|
+
`),layout:`buttons`,options:[{label:j.t(`cmd.pluginInstallConfirmAction`),value:`install`,color:`accent`},{label:j.t(`cmd.commonCancel`),value:`cancel`,color:`gray`}],onSelect:e=>t(e===`install`),onCancel:()=>t(!1)})})}async function ui(e,t,n){let r=n?.autoTrust??!1,i=n?.onProgress,a=n?.onPendingCapabilities;if(e.includes(`..`)||e.startsWith(`/`)||e.startsWith(`./`)||e.startsWith(`~/`))return r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallInvalidName`,{name:e})),!1;let o=s[e]?.pkg??e,c=Ee(o),l;if(!c)try{i?.(`Downloading from npm registry`);let e=await new T().install(o,{global:!0,as:`plugin`,postInstallExecutor:ce});e.success&&e.targetPath?(c=e.targetPath,l={id:e.name??o,dir:e.targetPath,created:!0,compileWarnings:[],version:e.manifest?.version}):r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallFailed`,{err:e.error??`未知错误`}))}catch(e){r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallFailed`,{err:e instanceof Error?e.message:String(e)}))}if(!c)return r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallNotFound`,{pkg:o})),!1;let u=be(c);if(!r&&!await li(e,u,t))return t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallCancelled`)),!1;let d;if(l)d=l;else try{i?.(`Installing plugin`),d=await _e({pkg:o})}catch(e){return r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallFailed`,{err:e instanceof Error?e.message:String(e)})),!1}r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstalled`,{seg:d.created?`Installed ${d.id}`:`${d.id} already up to date`})),await Ce(t.app.settings,{id:d.id,source:`npm`,sourceSpec:o,version:d.version,scope:`global`,capabilities:u}),t.app.pluginModuleManager.emitMonitorEvent({type:`plugin.installed`,pluginId:d.id});for(let e of d.compileWarnings)r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallFailed`,{err:e}));u.length>0&&(i?.(`Authorizing capabilities`),Ae(d.dir),ge(d.dir,u));try{i?.(`Reloading capabilities`),(await t.app.reloadCapabilities()).pendingProviderCapabilities.includes(d.id)&&(r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.pluginInstallPendingCaps`,{id:d.id})),a?.(d.id))}catch(e){r||t.tui.info.showToast(j.t(`cmd.titleInstall`),j.t(`cmd.compatReloadFailed`,{err:e instanceof Error?e.message:String(e)}))}if(await t.callbacks.refreshModelsNow().catch(()=>{}),e===`plugin-feishu-use`){try{let{launchFeishuSetup:e}=await import(`./feishu-setup-B6ETf-8Y.js`);await e(t)}catch{}return!0}if(!r){await new Promise(e=>setImmediate(e));let{handleModel:e}=await Promise.resolve().then(()=>pi);await e([],t)}return!0}async function di(e,t){t.tui.panes.togglePane(`backgroundTasks`)}async function fi(e,t){let n=e.join(` `);if(!n){t.tui.info.showToast(j.t(`cmd.titleJob`),j.t(`cmd.jobUsage`));return}let r=/^revert\s+(\S+)$/.exec(n);if(r){let e=r[1],n=t.app.agentJobs.revert(e);if(n.applied)t.tui.info.showToast(j.t(`cmd.titleReverted`),j.t(`cmd.jobReverted`,{id:e,msg:n.message}));else{let r=n.conflictPaths.length?j.t(`cmd.jobConflictFiles`,{joinedPaths:n.conflictPaths.join(`
|
|
17
|
+
`)}):``;t.tui.messages.pushMessage({role:`command_echo`,command:`/go revert ${e}`,status:`error`,summary:j.t(`cmd.jobRevertFailed`,{id:e,status:n.status,msg:n.message,conflicts:r})})}return}try{let e=t.app.agentJobs.start({title:n.slice(0,60),prompt:n,sessionId:t.state.session.id,origin:`user`});t.tui.info.showToast(j.t(`cmd.titleDelegated`),j.t(`cmd.delegated`,{title:e.title}))}catch(e){t.tui.messages.pushMessage({role:`command_echo`,command:`/go`,status:`error`,summary:j.t(`cmd.delegateFailed`,{err:e instanceof Error?e.message:String(e)})})}}async function J(e,t){let n=e[0]?.toLowerCase();if(n===`trust`)return Kr(e.slice(1),t);if(n===`install`)return l(e.slice(1),t);if(n===`registry`)return d(e.slice(1),t);if(n===`search`)return u(e.slice(1),t);if(n===`update`)return ti([`--check`],t);if(n===`reload`)return zn(e.slice(1),t);let i=(e,n)=>t.tui.info.showToast(e,n),a=e=>t.tui.messages.pushMessage({role:`command_echo`,command:`/extension`,status:`error`,summary:e}),o=()=>{let e=t.app.extensions.list(),n=t.app.getGlobalMenuItems?.()??[],r=new Map(n.map(e=>[e.id,e.command]));t.tui.modal.openModal({kind:`extensionsList`,entries:e.map(e=>({category:e.category,id:e.id,name:e.name,enabled:e.enabled,description:e.description,applies:e.applies})),menuContributions:[{id:`__discover__`,title:`Discover plugins (search registries)…`},...n.map(e=>({id:e.id,title:e.title}))],onSelect:e=>{if(!e)return;if(e===`contrib:__discover__`){s();return}if(e.startsWith(`contrib:`)){let n=e.slice(8),a=r.get(n);if(!a)return;fe(a,{open:e=>ve(e),runCommand:async(e,n)=>{let{dispatchSlashCommand:r}=await Promise.resolve().then(()=>Wa);await r(e,n?n.split(/\s+/).filter(Boolean):[],t)}}).catch(e=>i(j.t(`cmd.titlePlugin`),e instanceof Error?e.message:String(e)));return}let n=e.indexOf(`:`);p(e.slice(0,n),e.slice(n+1))},onCancel:()=>{}})},s=async()=>{let e=await t.tui.modal.openModal({kind:`input`,title:`Discover plugins`,description:[`搜索已注册 registry(/registry list 查看源;/registry add 注册第三方源)`],placeholder:`keyword… (e.g. weather / oauth / provider)`});if(!e?.trim()){o();return}let{searchRegistries:n}=await import(`./registry-BOX7DaxS.js`),{hits:r,warnings:a}=await n(t,e.trim());if(r.length===0){i(j.t(`cmd.titlePlugin`),`No registry entries match '${e.trim()}'${a.length?` (${a.length} source warning)`:``}`),o();return}t.tui.modal.openModal({kind:`select`,title:`Discover: '${e.trim()}' (${r.length})`,subtitle:a.length>0?`⚠ ${a.join(` · `)}`:void 0,options:r.map((e,t)=>({label:`${e.entry.id} (${e.entry.type}) [${(e.entry.capabilities??[]).join(`, `)||`-`}] @${e.sourceName}${e.stale?` (stale)`:``}`,description:e.entry.description,value:String(t)})),onSelect:e=>{let n=r[Number(e)];if(!n)return;let a=[`--as`,n.entry.type,...n.entry.subPath?[`--sub-path`,n.entry.subPath]:[],n.entry.source];(async()=>{let{dispatchSlashCommand:e}=await Promise.resolve().then(()=>Wa);await e(`extension`,[`install`,...a],t)})().catch(e=>i(j.t(`cmd.titlePlugin`),e instanceof Error?e.message:String(e)))},onCancel:()=>o()})},c=e=>{let n=t.app.skillRegistry?.get(e);if(!n){o();return}let r=n.status!==`disabled`,s=n.definition.metadata,l=[{kind:`group`,title:j.t(`cmd.extSkillGroupOverview`)},{kind:`row`,label:j.t(`cmd.extSkillLabelDesc`),value:s.description||`—`},{kind:`row`,label:j.t(`cmd.extSkillLabelStatus`),value:n.status,tone:n.status===`error`||n.status===`disabled`?`error`:`success`},{kind:`row`,label:j.t(`cmd.extSkillLabelSource`),value:j.t(`cmd.extSkillSourceLabel`,{seg:ai(n.source.type,n.source.id)}),tone:`muted`},...ri(n.source.root)?[]:[{kind:`text`,value:j.t(`cmd.extSkillManagedExternally`,{root:n.source.root}),tone:`muted`}],{kind:`group`,title:j.t(`cmd.extSkillGroupTrigger`)},{kind:`row`,label:j.t(`cmd.extSkillLabelTriggerMode`),value:s.trigger===`manual`?j.t(`cmd.extSkillTriggerManual`):j.t(`cmd.extSkillTriggerAuto`)},...s.priority===void 0?[]:[{kind:`row`,label:j.t(`cmd.extSkillLabelPriority`),value:String(s.priority)}],{kind:`group`,title:j.t(`cmd.extSkillGroupDependencies`)},{kind:`row`,label:j.t(`cmd.extSkillLabelDependencies`),value:s.dependencies?.length?s.dependencies.join(`, `):j.t(`cmd.extSkillNoDependencies`),tone:s.dependencies?.length?void 0:`muted`},{kind:`group`,title:j.t(`cmd.extSkillGroupTags`)},{kind:`row`,label:j.t(`cmd.extSkillLabelTags`),value:s.tags?.length?s.tags.join(`, `):j.t(`cmd.extSkillNoTags`),tone:s.tags?.length?void 0:`muted`}];n.status===`error`&&n.error&&l.push({kind:`group`,title:j.t(`cmd.extSkillGroupError`)},{kind:`text`,value:n.error,tone:`error`}),t.tui.modal.openModal({kind:`extensionDetail`,title:j.t(`cmd.extSkillTitle`,{name:e,state:r?`enabled`:`disabled`}),meta:`skill · ${n.source.type}`,metaStatus:{label:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),enabled:r},actions:[{label:r?j.t(`cmd.extDisableLabel`):j.t(`cmd.extEnableLabel`),value:`toggle`,color:r?`amber`:`green`},{label:j.t(`cmd.extViewFullTextLabel`),value:`view-full-text`,color:`gray`},...ii(n.source.type,n.source.root)?[{label:j.t(`cmd.uninstallActionLabel`),value:`uninstall`,color:`red`}]:[]],dataListEntries:l,fullText:{title:j.t(`cmd.extSkillFullTextTitle`,{name:e}),content:n.definition.body||j.t(`cmd.extSkillNoBody`)},onAction:async s=>{if(s===`toggle`){try{await t.app.extensions.setEnabled(`skill`,e,!r),i(j.t(`cmd.titleExtension`),j.t(`cmd.extToggled`,{name:e,verb:r?`Disabled`:`Enabled`,seg:` — applies next turn`}))}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}c(e);return}if(s===`uninstall`){let r=ii(n.source.type,n.source.root);if(!r)return;await tr({name:e,type:`skill`,scope:r,ctx:t,onDone:()=>o()})}},onClose:()=>o()})},f=e=>{let n=t.app.declarativeAgentProfiles.find(t=>t.name===e);if(!n){o();return}let r=!new Set(t.app.settings.get(`disabled_agents`)??[]).has(e),s=[{kind:`group`,title:j.t(`cmd.extAgentGroupOverview`)},{kind:`row`,label:j.t(`cmd.extAgentLabelDesc`),value:n.description||`—`},{kind:`row`,label:j.t(`cmd.extAgentLabelStatus`),value:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),tone:r?`success`:`error`},{kind:`group`,title:j.t(`cmd.extAgentGroupCapabilities`)},{kind:`row`,label:j.t(`cmd.extAgentLabelTaskTypes`),value:n.taskTypes.length?n.taskTypes.join(`, `):j.t(`cmd.extAgentNoTaskTypes`),tone:n.taskTypes.length?void 0:`muted`},{kind:`row`,label:j.t(`cmd.extAgentLabelCapabilities`),value:n.capabilities.length?n.capabilities.join(`, `):j.t(`cmd.extAgentNoCapabilities`),tone:n.capabilities.length?void 0:`muted`},{kind:`group`,title:j.t(`cmd.extAgentGroupTools`)},{kind:`row`,label:j.t(`cmd.extAgentLabelDefaultTools`),value:n.defaultTools?.length?n.defaultTools.join(`, `):j.t(`cmd.extAgentAllTools`),tone:n.defaultTools?.length?void 0:`muted`},{kind:`row`,label:j.t(`cmd.extAgentLabelDisallowedTools`),value:n.disallowedTools?.length?n.disallowedTools.join(`, `):j.t(`cmd.extAgentNoDisallowedTools`),tone:n.disallowedTools?.length?void 0:`muted`},{kind:`group`,title:j.t(`cmd.extAgentGroupExecution`)},{kind:`row`,label:j.t(`cmd.extAgentLabelPromptMode`),value:n.promptMode??`append`,tone:`muted`},...n.preferredModelTier?[{kind:`row`,label:j.t(`cmd.extAgentLabelModelTier`),value:n.preferredModelTier}]:[],{kind:`row`,label:j.t(`cmd.extAgentLabelAllowSubagents`),value:n.allowSubagents?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),tone:n.allowSubagents?void 0:`muted`}];t.tui.modal.openModal({kind:`extensionDetail`,title:j.t(`cmd.extAgentTitle`,{name:e,state:r?`enabled`:`disabled`}),meta:`agent`,metaStatus:{label:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),enabled:r},actions:[{label:r?j.t(`cmd.extDisableLabel`):j.t(`cmd.extEnableLabel`),value:`toggle`,color:r?`amber`:`green`},{label:j.t(`cmd.extViewFullTextLabel`),value:`view-full-text`,color:`gray`}],dataListEntries:s,fullText:{title:j.t(`cmd.extAgentFullTextTitle`,{name:e}),content:n.systemPromptTemplate||j.t(`cmd.extSkillNoBody`)},onAction:async n=>{if(n===`toggle`){try{await t.app.extensions.setEnabled(`agent`,e,!r),i(j.t(`cmd.titleExtension`),j.t(`cmd.extToggled`,{name:e,verb:r?`Disabled`:`Enabled`,seg:` — applies next turn`}))}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}f(e)}},onClose:()=>o()})},p=(e,n)=>{let r=t.app.extensions.list().find(t=>t.category===e&&t.id===n);if(!r){o();return}let s={label:r.enabled?j.t(`cmd.extDisableLabel`):j.t(`cmd.extEnableLabel`),value:`toggle`};if(e===`mcp`){let c=t.app.mcpManager?.getServerInfos().find(e=>e.name===n),l=r.enabled?c?String(c.status):`disconnected`:`disabled`;t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.extMcpTitle`,{name:r.name,status:l}),options:[{label:j.t(`cmd.extReconnectLabel`),value:`reconnect`},s,...r.readonly?[]:[{label:j.t(`cmd.uninstallActionLabel`),value:`uninstall`}]],onSelect:async s=>{if(s===`toggle`){try{await t.app.extensions.setEnabled(r.category,n,!r.enabled),i(j.t(`cmd.titleExtension`),j.t(`cmd.extToggled`,{name:r.name,verb:r.enabled?`Disabled`:`Enabled`,seg:``}))}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}p(e,n);return}if(s===`reconnect`){let r=t.app.mcpManager,o=(t.app.settings.get(`mcp_servers`)??{})[n];if(!r||!o){i(j.t(`cmd.titleExtension`),j.t(`cmd.extReconnectUnavailable`,{id:n})),p(e,n);return}try{await r.disconnect(n).catch(()=>{}),await r.connect(n,o),i(j.t(`cmd.titleExtension`),j.t(`cmd.extReconnected`,{id:n}))}catch(e){a(j.t(`cmd.extReconnectFailed`,{id:n,err:e instanceof Error?e.message:String(e)}))}p(e,n);return}if(s===`uninstall`){await tr({name:n,type:`mcp`,scope:`project`,ctx:t,onDone:()=>o()});return}},onCancel:()=>o()})}else e===`plugin`?m(n,r.enabled,r.name,r.description):e===`skill`?c(n):e===`agent`?f(n):t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.extItemTitle`,{name:r.name}),options:[s],onSelect:async o=>{if(o===`toggle`){try{await t.app.extensions.setEnabled(r.category,n,!r.enabled),i(j.t(`cmd.titleExtension`),j.t(`cmd.extToggled`,{name:r.name,verb:r.enabled?`Disabled`:`Enabled`,seg:r.applies===`live`?``:` — applies next turn`}))}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}p(e,n);return}},onCancel:()=>o()})},m=(e,n,s,c,l)=>{let u=t.app.workspaceDir??process.cwd(),d=r({cwd:u,homedir:v()}).find(t=>t.id===e);if(!d){o();return}let f=me(d),p=f.surface.any?f.gated?j.t(`cmd.extPluginUntrusted`):f.pendingCapabilities.length>0?j.t(`cmd.extPluginCapabilityPending`,{caps:f.pendingCapabilities.join(`, `)}):j.t(`cmd.extPluginTrusted`):j.t(`cmd.extPluginNoSurface`),h=f.surface,g=[[h.mcpJson,`mcp`],[h.commands,`commands`],[h.scripts,`scripts`],[h.panels,`panels`],[h.skills,`skills`],[h.agents,`agents`]].filter(([e])=>e).map(([,e])=>e),_=g.length?` ${g.join(`, `)}`:` —`,ee=(t.app.getPluginPanelRegistrations?.()??[]).filter(t=>t.pluginId===e),y=oi({providerApis:t.app.providerRegistry.getApisBySource(e).length,tools:t.app.toolRegistry.getAll().filter(t=>t.metadata.source===e).length,renderers:t.app.getPluginRenderers().filter(t=>t.pluginId===e).length,statusItems:t.app.getPluginStatusItems().filter(t=>t.id.startsWith(`${e}:`)).length,fileViewers:(t.app.getPluginFileViewers?.()??[]).filter(t=>t.pluginId===e).length}),b=d.scope===`builtin`?[]:[{label:n?j.t(`cmd.extDisableLabel`):j.t(`cmd.extEnableLabel`),value:`toggle`,color:n?`amber`:`green`}];if(f.surface.any&&(d.scope===`project`||d.scope===`repository`||f.pendingCapabilities.length>0)){let e=d.scope===`project`||d.scope===`repository`?!f.trusted:f.pendingCapabilities.length>0;b.push({label:e?j.t(`cmd.extPluginTrustLabel`):j.t(`cmd.extPluginUntrustLabel`),value:e?`trust`:`untrust`,color:e?`accent`:`gray`})}b.push({label:j.t(`cmd.extReloadLabel`),value:`reload`}),d.scope!==`builtin`&&b.push({label:j.t(`cmd.uninstallActionLabel`),value:`uninstall`,color:`red`});let te=ae(d,{"extension.id":e,"extension.enabled":n,"extension.trusted":f.trusted,"extension.scope":d.scope,"extension.category":`plugin`}),x=d.manifest.contributes,S=Te(ie.extensionDetailActions,x?.menus,x?.actions,te),ne=new Map(S.map(e=>[e.id,e.command]));for(let e of S){let n=`${d.id}:action.${e.id}.title`,r=t.app.i18nRegistry.t(n),i=r===n?e.title:r;b.push({label:i,value:`contrib:${e.id}`,color:e.color})}let C={open:e=>ve(e),runCommand:async(e,n)=>{let{dispatchSlashCommand:r}=await Promise.resolve().then(()=>Wa);await r(e,n?n.split(/\s+/).filter(Boolean):[],t)},runScript:async e=>{if(me(d).gated){i(j.t(`cmd.titlePlugin`),j.t(`cmd.extPluginUntrusted`));return}await Oe(d,e)}},w=ee[0];w&&t.app.firePluginActivationEvent?.(`onView:${w.id}`);let T;if(e===`plugin-feishu-use`){let e=O(u,`.otto`,`feishu-use.json`),t=!1;try{if(k(e)){let n=JSON.parse(Ge(e,`utf8`));if(n.app_id){t=!0;let r=typeof n.app_id==`string`&&n.app_id.length>12?n.app_id.slice(0,8)+`***`+n.app_id.slice(-4):String(n.app_id),i=Array.isArray(n.allowed_chats)?n.allowed_chats.length:0,a=Array.isArray(n.trusted_chats)?n.trusted_chats.length:0,o=d.scope===`user`?`全局`:d.scope===`repository`?`仓库`:`项目`;T=[{kind:`row`,label:`App ID`,value:r},{kind:`row`,label:`消息白名单`,value:i>0?`${i} 个`:`空 — 拒绝所有消息`,tone:i>0?void 0:`warning`},...a>0?[{kind:`row`,label:`可信任 chat`,value:`${a} 个`}]:[],{kind:`row`,label:`配置`,value:`${o}级 · ${e}`,tone:`muted`}]}}}catch{}t||(T=[{kind:`text`,value:`未配置 — 点击 [重新配置] 引导设置`,tone:`warning`},{kind:`row`,label:`预期配置路径`,value:e,tone:`muted`}]),b.push({label:`重新配置`,value:`feishu-reconfigure`,color:`amber`})}let re=()=>{let n=t.app.pluginHealthTracker?.query(e)??{hookTimeouts:0,toolTimeouts:0},r=xe(e);return{healthStats:{hookTimeouts:n.hookTimeouts,toolTimeouts:n.toolTimeouts,lastError:n.lastError},logEntries:r.map(e=>({ts:e.ts,level:e.level,msg:e.msg}))}},oe=[{kind:`group`,title:j.t(`cmd.extPluginGroupTitle`)},{kind:`row`,label:j.t(`cmd.extPluginLabelDesc`),value:c},{kind:`row`,label:j.t(`cmd.extPluginLabelScope`),value:d.scope},{kind:`row`,label:j.t(`cmd.extPluginLabelTrust`),value:p},{kind:`row`,label:j.t(`cmd.extPluginLabelSurfaces`),value:_.trim()||`—`},...y?[{kind:`row`,label:j.t(`cmd.extPluginLabelContributions`),value:y}]:[],{kind:`row`,label:j.t(`cmd.extPluginLabelStatus`),value:n?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),tone:n?`success`:`error`}],se=l?[{kind:`text`,value:l.message,tone:l.kind===`success`?`success`:`error`}]:[];t.tui.modal.openModal({kind:`extensionDetail`,title:j.t(`cmd.extPluginTitle`,{name:s,state:n?`enabled`:`disabled`}),meta:`plugin · ${d.scope}`,metaStatus:{label:n?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),enabled:n},metaSuffix:p,actions:b,panelInfo:w?{title:w.title,modulePath:w.modulePath,exportName:w.exportName,pluginId:e}:void 0,dataListEntries:[...se,...T??oe],...re(),onRefresh:()=>m(e,n,s,c),onAction:async r=>{if(r.startsWith(`contrib:`)){let t=ne.get(r.slice(8));if(t)try{await fe(t,C)}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}m(e,n,s,c)}else if(r===`trust`)ci(t,d);else if(r===`untrust`){try{Ne(d.dir)}catch(t){m(e,n,s,c,{kind:`error`,message:`撤销信任失败,权限未收回:${t instanceof Error?t.message:String(t)}`});return}t.app.reloadCapabilities?.().then(()=>{t.tui.plugins.setPluginRegistrations(t.app.getPluginRegistrations())}).finally(()=>{m(e,n,s,c,{kind:`success`,message:j.t(`cmd.pluginUntrusted`,{id:e})})})}else if(r===`toggle`)try{await t.app.extensions.setEnabled(`plugin`,e,!n);try{await t.app.reloadCapabilities(),m(e,!n,s,c,{kind:`success`,message:j.t(`cmd.extToggled`,{name:s,verb:n?`Disabled`:`Enabled`,seg:``})})}catch(t){m(e,!n,s,c,{kind:`error`,message:j.t(`cmd.extToggleReloadFailed`,{verb:n?`Disabled`:`Enabled`,name:s,err:t instanceof Error?t.message:String(t)})})}}catch(t){m(e,n,s,c,{kind:`error`,message:j.t(`cmd.extToggleFailed`,{err:t instanceof Error?t.message:String(t)})})}else if(r===`feishu-reconfigure`)try{let{launchFeishuSetup:e}=await import(`./feishu-setup-B6ETf-8Y.js`);await e(t),i(`plugin-feishu-use`,`配置完成。`)}catch(e){a(`feishu-use 配置向导失败:${e instanceof Error?e.message:String(e)}`)}else r===`reload`?t.app.reloadCapabilities?.().then(t=>{m(e,n,s,c,{kind:`success`,message:j.t(`cmd.pluginTrusted`,{id:e,count:t.mcpTools})})}).catch(t=>{m(e,n,s,c,{kind:`error`,message:j.t(`cmd.compatReloadFailed`,{err:t instanceof Error?t.message:String(t)})})}):r===`uninstall`&&await tr({name:e,type:`plugin`,scope:d.scope===`project`||d.scope===`repository`?d.scope:`global`,ctx:t,onDone:()=>o()})},onClose:()=>o()})};o()}var pi=Ct({handleLogout:()=>bi,handleModel:()=>vi,handleProviderAuth:()=>Y,handleProviderLogout:()=>yi,handleServiceLogin:()=>xi,handleServiceLogout:()=>Si});const mi=`__otto_model_login__`,hi=`__otto_model_setkey__`,gi=`__otto_model_grant_capability__`,_i=`__otto_model_install_plugin__`;async function vi(e,t,n){let r=e[0];if(r===`refresh`||r===`--refresh`){let e=await t.app.refreshModels();t.state.models=t.app.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(e=>({id:e.id,name:e.name,provider:e.provider,api:e.api,strengths:e.strengths??[],contextWindow:e.contextWindow}));for(let n of e)for(let e of n.availableIds??[])t.state.availableModelIds.add(e);t.callbacks.persistAvailable();let n=Math.max(...e.map(e=>e.provider.length),0),r=e=>e.padEnd(n),i={},a=e.map((e,t)=>e.status===`ok`?(i[t]=`success`,j.t(`cmd.modelRefreshLineOk`,{provider:r(e.provider),added:e.added,kept:e.kept,total:e.total})):e.status===`skipped`&&e.reason===`not authenticated`?(i[t]=`muted`,j.t(`cmd.modelRefreshLineMuted`,{provider:r(e.provider),reason:j.t(`cmd.modelRefreshReasonNotAuthenticated`)})):e.reason?.includes(`capability not granted`)?(i[t]=`warning`,j.t(`cmd.modelRefreshLineWarning`,{provider:r(e.provider),reason:j.t(`cmd.modelRefreshReasonPendingCapability`)})):(i[t]=`warning`,j.t(`cmd.modelRefreshLineErr`,{provider:r(e.provider),status:e.status,reason:e.reason}))),o=e.some(e=>e.status===`skipped`&&e.reason?.includes(`capability not granted`));t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleModels`),lines:[...a,``,j.t(`cmd.modelRefreshHint`)],action:o?{kind:`extension`,run:()=>{J([],t)}}:void 0,lineTones:i});return}if(r){let e=t.state.models.find(e=>e.id===r||e.name===r);if(!e){let e=r.includes(`/`)?r.split(`/`)[0]:r;if(!t.state.models.some(t=>t.provider.toLowerCase()===e.toLowerCase())&&/^[a-z0-9][\w-]*$/i.test(e)){t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.modelDelegateProviderTitle`,{cand:e}),options:[{label:j.t(`cmd.modelDelegateProviderYes`,{cand:e}),value:`yes`},{label:j.t(`cmd.commonNo`),value:`no`}],onSelect:n=>{if(n!==`yes`)return;let r=`为 "${e}" 实现一个 provider 适配器:参照 packages/ai/src 下现有 provider 的实现,接 model-fetch 的 resolveModelsRequest、注册进 provider/model registry,并写测试跑绿。`;try{t.app.agentJobs.start({title:`write provider: ${e}`,prompt:r,sessionId:t.state.session.id,origin:`user`}),t.tui.info.showToast(j.t(`cmd.titleDelegated`),j.t(`cmd.modelProviderDelegated`,{cand:e}))}catch(e){t.tui.messages.pushMessage({role:`command_echo`,command:`/model`,status:`error`,summary:j.t(`cmd.delegateFailed`,{err:e instanceof Error?e.message:String(e)})})}},onCancel:()=>{}});return}t.tui.info.showToast(j.t(`cmd.titleModel`),j.t(`cmd.modelNotFoundUse`,{arg:r}));return}t.tui.info.showToast(j.t(`cmd.titleModel`),await t.callbacks.applyModel(e.id)),t.state.session.model?.id===e.id&&n?.afterSwitch?.();return}t.state.models=t.app.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(e=>({id:e.id,name:e.name,provider:e.provider,api:e.api,strengths:e.strengths??[],contextWindow:e.contextWindow}));let i=e=>t.state.availableModelIds.has(e),a=[...new Set(t.state.models.map(e=>t.callbacks.apiCredentialId(e.api??``,e.provider)))],o=new Map(await Promise.all(a.map(async e=>[e,await t.app.authStore.getAuthSource(e).catch(()=>null)]))),s=e=>{let n=t.callbacks.apiCredentialId(e.api??``,e.provider),r=o.get(n);if(!r)return``;let i=j.t(`pref.authModeLabel`,{context:r});return`${i===r?``:` · `}${i}`},c=[...t.state.models].sort((e,t)=>Number(i(t.id))-Number(i(e.id))||e.provider.localeCompare(t.provider)||e.name.localeCompare(t.name)),l=c.length>0?Math.max(...c.map(e=>e.name.length),8):8,u=e=>e?e>=1e6?`${(e/1e6).toFixed(1)}M`:`${Math.round(e/1e3)}k`:``,d=e=>{let n=i(e.id),r=e.id===t.state.currentModelId?`●`:` `,a=u(e.contextWindow),o=`${r} ${e.name.padEnd(l)}`+(a?` ${a}`:``),c=[s(e).replace(/^ · /,``),e.strengths.length>0?e.strengths.join(`/`):``].filter(Boolean).join(` `);return{isAvail:n,label:o,detail:c&&` ${c}`}},f=t.app.settings.get(`recent_models`)??[],p=new Map(t.state.models.map(e=>[e.id,e])),m=f.map(e=>p.get(e)).filter(e=>e!==void 0).map(e=>{let{isAvail:t,label:n,detail:r}=d(e);return{label:n,value:e.id,disabled:!t,group:j.t(`cmd.modelRecentGroup`),detail:r||void 0,searchText:e.name}}),h=t.state.availableModelIds.size===0,g=!t.app.modelRegistry.hasAnyPluginSourcedModel()&&h,_=(t.app.pendingProviderCapabilities??[]).length,v=[];g&&_>0?(v.push(j.t(`model.noProviderPlugin`)),v.push(j.t(`model.pendingCapabilities`,{count:_}))):g?v.push(j.t(`model.noProviderPlugin`)):h&&v.push(j.t(`model.noneAvailable`)),!g&&_>0&&v.push(j.t(`model.pendingCapabilities`,{count:_})),t.tui.modal.openModal({kind:`select`,searchable:!0,maxVisible:13,title:h?j.t(`cmd.modelSelectTitle`):j.t(`cmd.modelSelectTitleAvail`),subtitle:v.length>0?v.join(` · `):void 0,subtitleTone:_>0?`warning`:`default`,subtitleActions:g||h||_>0?[...g?[{label:j.t(`model.goInstallPlugin`),value:_i}]:h?[{label:j.t(`model.goLogin`),value:mi},{label:j.t(`model.setKey`),value:hi}]:[],..._>0?[{label:j.t(`model.goGrantCapability`),value:gi}]:[]]:void 0,options:[...m,...c.map(e=>{let{isAvail:t,label:n,detail:r}=d(e);return{label:n,value:e.id,disabled:!t,group:e.provider,detail:r||void 0,searchText:e.name}})],onSelect:async e=>{if(e===mi){await Y([],t,{method:`oauth`});return}if(e===hi){await Y([],t,{method:`key`});return}if(e===gi){await J([],t);return}if(e===_i){let{EXTENSION_ALIASES:e}=await import(`./extension-BzHePQhP.js`),{runPluginInstall:n}=await Promise.resolve().then(()=>ni),r=Object.entries(e).filter(([,e])=>e.capabilities.includes(`provider`)).map(([e])=>({label:e,value:e}));if(r.length===1){await n(r[0].value,t);return}t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.modelSelectTitle`),options:r.map(e=>({label:e.label,value:e.value})),onSelect:async e=>{await n(e,t)},onCancel:()=>{}});return}t.tui.info.showToast(j.t(`cmd.titleModel`),await t.callbacks.applyModel(e)),t.state.session.model?.id===e&&n?.afterSwitch?.()}})}async function Y(e,t,n){if(e[0]===`logout`)return yi(e.slice(1),t);if(e.includes(`--service`))return xi(e,t);let r=t.app.authStore,i=e=>new Promise(n=>t.tui.modal.openModal({kind:`select`,...e,title:e.title??j.t(`cmd.commonSelect`),detailPlacement:`inline`,onSelect:n,onCancel:()=>n(null)})),a=r.listProviders();if(a.length===0){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.loginNoProviders`));return}let o=e[0]||null,s=e=>r.oauth.get(e)?.name??_t(e)?.name??t.callbacks.PROVIDER_DISPLAY_NAMES[e]??e,c=e=>s(e),l=e=>e?j.t(`pref.authModeLabel`,{context:e}):j.t(`cmd.loginNotSet`),u=(e,t)=>{let n=l(t);return s(e).toLowerCase()===e.toLowerCase()?n:`[${e}] · ${n}`};if(!o){let e=await Promise.all(a.map(e=>r.getAuthSource(e)));o=await i({title:j.t(`cmd.loginPickProvider`),options:a.map((t,n)=>({label:c(t),value:t,detail:u(t,e[n]??null)}))})}if(!o)return;let d=r.oauth.get(o)?.name??o,f=!!r.oauth.get(o),p=`key`;if(n?.method)p=n.method===`oauth`&&f?`oauth`:`key`;else if(f){let e=await i({title:j.t(`cmd.loginAuthMethod`,{name:d}),options:[{label:j.t(`cmd.loginMethodOauth`),value:`oauth`},{label:j.t(`cmd.loginMethodKey`),value:`key`}]});if(!e)return;p=e}if(p===`key`){let e=await t.tui.modal.openModal({kind:`input`,title:j.t(`cmd.loginKeyTitle`,{provider:o}),placeholder:j.t(`cmd.loginKeyPlaceholder`),mask:!0});if(!e||!e.trim()){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.loginCancelledNoKey`));return}await r.setCredentialKey(o,e.trim()),await r.save(),t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.loginKeySaved`,{provider:o})),await t.callbacks.refreshModelsNow(e=>t.tui.info.showToast(j.t(`cmd.titleModels`),e));return}try{let e={};await r.login(o,{onAuth:n=>{if(e=n,n.url)if(Ie(n.url))t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.loginOauthBrowserOpened`));else{let e=[j.t(`cmd.loginOauthUrlAuthorize`),`\n${n.url}`];n.instructions&&e.push(`\n${n.instructions}`),t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.loginOauthTitle`,{provider:o}),lines:e})}if(n.code){let e=[j.t(`cmd.loginOauthCodeIntro`)];n.url&&e.push(`\n${n.url}`),e.push(`\n${j.t(`cmd.loginOauthCode`,{code:n.code})}`),n.instructions&&e.push(`\n${n.instructions}`),t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.loginOauthTitle`,{provider:o}),lines:e})}},onProgress:e=>t.tui.info.showToast(j.t(`cmd.titleLogin`),e),onPrompt:async e=>await t.tui.modal.openModal({kind:`input`,title:e.message,placeholder:e.placeholder})??``,onManualCode:async n=>{let r=[];return e.url&&(r.push(j.t(`cmd.loginOauthUrlAuthorize`)),r.push(` `),r.push(e.url)),e.instructions&&(r.length>0&&r.push(` `),r.push(e.instructions)),await t.tui.modal.openModal({kind:`input`,title:j.t(`cmd.loginOauthPasteCode`,{provider:o}),description:r.length>0?r:void 0,placeholder:`code#state`,signal:n,actionButton:e.url?{label:j.t(`cmd.loginOauthOpenBrowserButton`),onPress:()=>{Ie(e.url)&&t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.loginOauthBrowserOpened`))}}:void 0})??``}}),t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.loginSuccess`,{provider:o})),await t.callbacks.refreshModelsNow(e=>t.tui.info.showToast(j.t(`cmd.titleModels`),e))}catch(e){t.tui.messages.pushMessage({role:`command_echo`,command:`/auth`,status:`error`,summary:j.t(`cmd.loginFailed`,{msg:e.message})})}}async function yi(e,t){let n=t.app.authStore,r=e[0]||null;if(!r){let e=n.listProviders(),i=await Promise.all(e.map(e=>n.getAuthSource(e))),a=e.filter((e,t)=>i[t]===`oauth`||i[t]===`api_key`);if(a.length===0){t.tui.info.showToast(j.t(`cmd.titleLogout`),j.t(`cmd.logoutNoStored`));return}r=await new Promise(r=>t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.logoutPickProvider`),detailPlacement:`inline`,options:a.map(r=>{let a=n.oauth.get(r)?.name??_t(r)?.name??t.callbacks.PROVIDER_DISPLAY_NAMES[r]??r,o=i[e.indexOf(r)];return{label:a.toLowerCase()===r.toLowerCase()?a:`${a} [${r}]`,value:r,detail:o?j.t(`pref.authModeLabel`,{context:o}):void 0}}),onSelect:r,onCancel:()=>r(null)}))}r&&(await n.logout(r),t.tui.info.showToast(j.t(`cmd.titleLogout`),j.t(`cmd.logoutSuccess`,{provider:r})))}async function bi(e,t){e[0]&&e[0]!==`--service`||await Si([],t)}async function xi(e,t){let n=e.indexOf(`--service`),r=e.indexOf(`--token`);if(n===-1||r===-1){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginUsage`));return}let i=e[n+1],a=e[r+1];if(!i||!a){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginNeedValues`));return}let o=i.replace(/\/+$/,``);try{let e=await fetch(`${o}/auth/login`,{method:`POST`,headers:{Authorization:`Bearer ${a}`,Accept:`application/json`}});if(!e.ok){let n=(await e.json().catch(()=>({}))).error??e.statusText;t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginFailed`,{err:String(n)}));return}let n=await e.json();if(typeof n.user_id!=`string`||typeof n.token!=`string`){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginBadResponse`));return}let{OTTO_IDENTITY_PATH:r,isShadowModeEnabled:i}=await import(`@x-otto/env`);if(i()){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginSuccess`,{url:o,user:n.user_id.slice(0,12)}));return}let{mkdir:s}=await import(`node:fs/promises`),{dirname:c}=await import(`node:path`),{atomicWriteFile:l}=await import(`@x-otto/persistence`),u={userId:n.user_id,token:n.token,serviceUrl:o,loginAt:Date.now()};await s(c(r),{recursive:!0}),await l(r,JSON.stringify(u,null,2)),t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginSuccess`,{url:o,user:n.user_id.slice(0,12)}))}catch(e){t.tui.info.showToast(j.t(`cmd.titleLogin`),j.t(`cmd.serviceLoginFailed`,{err:e instanceof Error?e.message:String(e)}))}}async function Si(e,t){try{let{OTTO_IDENTITY_PATH:e}=await import(`@x-otto/env`),{unlink:n}=await import(`node:fs/promises`);await n(e),t.tui.info.showToast(j.t(`cmd.titleLogout`),j.t(`cmd.logoutAccountRemoved`))}catch(e){if(e.code===`ENOENT`){t.tui.info.showToast(j.t(`cmd.titleLogout`),j.t(`cmd.logoutAccountNotFound`));return}t.tui.info.showToast(j.t(`cmd.titleLogout`),j.t(`cmd.logoutAccountFailed`,{err:e instanceof Error?e.message:String(e)}))}}async function X(e,t){let n=e[0]?.toLowerCase();if(n===`perf`)return Ti(e.slice(1),t);if(n===`cache`||n===`cache-stats`)return Ei(e.slice(1),t);if(n===`diagnose`)return Bn(e.slice(1),t);if(n===`services`)return ei(e.slice(1),t);let r=t.state.session,i=r.session,a=i.messages(),o=0;for(let e=a.length-1;e>=0;e--){let t=a[e]?.usage;if(a[e]?.role===`assistant`&&t){o=(t.cacheReadTokens??0)+(t.cacheWriteTokens??0)+(t.inputTokens??0)+(t.outputTokens??0);break}}let s=r.model?.contextWindow,c=s&&s>0?Math.round(o/s*100):void 0,l=a.reduce((e,t)=>e+(t.usage?.outputTokens??0),0),u=De(i.metadata().title,i.messages(),r.id),d=t.callbacks.isWriteLeaseReadOnly(),f=[{kind:`row`,label:j.t(`cmd.statusRowTitle`),value:u},{kind:`row`,label:j.t(`cmd.statusRowSessionId`),value:r.id.slice(0,8)},{kind:`row`,label:j.t(`cmd.statusRowModel`),value:r.model?.id??j.t(`cmd.statusModelUnset`)},{kind:`row`,label:j.t(`cmd.statusRowMsgs`),value:String(a.length)},{kind:`row`,label:j.t(`cmd.statusRowOccupancy`),value:j.t(`cmd.statusValueOccupancy`,{occ:o.toLocaleString(),window:s?.toLocaleString()??`N/A`,seg:c===void 0?``:` (${c}%)`})},{kind:`row`,label:j.t(`cmd.statusRowCumOutput`),value:l.toLocaleString()},{kind:`row`,label:j.t(`cmd.statusRowWriteAccess`),value:d?j.t(`cmd.statusValueWriteLeaseReadOnly`):j.t(`cmd.statusValueWriteLeaseOk`),tone:d?`warning`:void 0}];t.callbacks.isRunPaused()&&f.push({kind:`blank`},{kind:`text`,value:j.t(`cmd.statusLineRunPaused`),tone:`warning`}),t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleStatus`),lines:[],dataListEntries:f})}function Ci(){let e=process.env.OTTO_NOTIFY_COALESCE_WARN_RATIO,t=e?Number(e):NaN;return Number.isFinite(t)&&t>=1?t:1.5}function wi(e,t){return t===0?`healthy`:e<Ci()?`warning`:`healthy`}async function Ti(e,t){t.tui.engine.pushEngineEvent({kind:`perf`,memory:t.app.memoryGovernor.sample()});let n=t.tui.info.getNotifyStats(),r=n.coalescedCalls/Math.max(1,n.coalescedFires);t.tui.engine.pushEngineEvent({kind:`perf`,notify:{coalescedCalls:n.coalescedCalls,coalescedFires:n.coalescedFires,immediateCalls:n.immediateCalls,flushFires:n.flushFires,coalesceRatio:r,alert:wi(r,n.coalescedCalls)}});let i=t.app.activePlugins();try{let e=await se(i,void 0,e=>t.app.pluginHealthTracker.recordToolTimeout(e));t.tui.engine.pushEngineEvent({kind:`perf`,pluginMetrics:e})}catch(e){t.app.logger.warn({err:e instanceof Error?e.message:String(e)},`[perf] collectPluginPerfMetrics failed`),t.tui.engine.pushEngineEvent({kind:`perf`,pluginMetrics:[]})}t.tui.panes.togglePane(`perf`)}async function Ei(e,t){let n=t.state.session.getCostSummary(),r=n.perModel.map(e=>{let t={inputTokens:e.inputTokens,outputTokens:0,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens};return{modelId:e.modelId,modelName:e.modelName,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,inputTokens:e.inputTokens,hitRatio:gt(t,e.api)}}),i=r.some(e=>e.hitRatio!==null),a={inputTokens:n.totalInputTokens,outputTokens:0,cacheReadTokens:n.totalCacheReadTokens,cacheWriteTokens:n.totalCacheWriteTokens},o=i?gt(a):null;t.tui.stores.cache.setView({lastTurnHitRatio:t.state.session.getLastCacheHitRatio(),sessionHitRatio:o,totalCacheReadTokens:n.totalCacheReadTokens,totalCacheWriteTokens:n.totalCacheWriteTokens,totalInputTokens:n.totalInputTokens,totalCostUSD:n.totalCostUSD>0?n.totalCostUSD:void 0,perModel:r}),t.tui.panes.togglePane(`cacheStats`)}async function Di(e,t){if(process.env.OTTO_DEV!==`1`){t.tui.info.showToast(`Gallery`,`Set OTTO_DEV=1 to enable the component gallery.`);return}t.tui.panes.togglePane(`gallery`)}function Oi(e){return new Date(e*1e3).toLocaleString()}async function ki(e,t){let n=t.state.session.model?.provider;if((n?await t.app.authStore.getAuthSource(n).catch(()=>null):null)!==`oauth`){t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUsage`),lines:[j.t(`cmd.usageNotSubscription`)]});return}let r=t.callbacks.getLastProviderUsage();if(!r){t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUsage`),lines:[j.t(`cmd.usageNoSnapshotYet`)]});return}let i=[],a=n===`anthropic`;if(r.limitType&&i.push(j.t(`cmd.usageLineType`,{type:et(r.limitType)})),(a||r.usedPercent!==void 0)&&i.push(j.t(`cmd.usageLineStatus`,{status:r.status})),r.usedPercent!==void 0&&i.push(j.t(`cmd.usageLinePercent`,{pct:Math.round(r.usedPercent)})),r.resetsAt!==void 0&&i.push(j.t(`cmd.usageLineResetsAt`,{when:Oi(r.resetsAt)})),r.standardLimits){let e=r.standardLimits;i.push(j.t(`cmd.usageLineStandardLimits`,{reqR:e.remainingRequests??0,reqL:e.limitRequests??0,tokRk:(e.remainingTokens??0)/1e3|0,tokLk:(e.limitTokens??0)/1e3|0,reset:Math.round(Math.max(e.resetRequestsMs??0,e.resetTokensMs??0)/1e3)}))}!a&&r.limitType===void 0&&(i.push(``),i.push(j.t(`cmd.usageSubPoolNotInHeaders`))),t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUsage`),lines:i})}const Ai=async(e,t)=>{let n=e[0];switch(n){case`memory-sync`:return ji(e.slice(1),t);default:t.tui.info.showToast(`Workspace`,`/workspace ${n??``} — unknown subcommand. Use: memory-sync [status|enable|disable]`)}};async function ji(e,t){let n=e[0]??`status`,r=t.app.workspaceRef;if(!r?.root){t.tui.info.showToast(`Workspace memory-sync`,`No local workspace identity yet — cannot configure memory sync.`);return}switch(n){case`status`:{let e=r.memorySyncEnabled===!0;t.tui.info.showToast(`Workspace memory-sync`,e?`Enabled — workspace memory (auto-memory/lessons) syncs to the remote store.`:`Disabled — workspace memory stays local (default).`);return}case`enable`:{if(!t.app.storage.remoteMemoryConfigured){t.tui.info.showToast(`Workspace memory-sync`,`No remote memory service configured (needs --session-url + remote.getAuth) — enabling now would have no effect.`);return}let e=await t.app.setWorkspaceMemorySyncEnabled(!0);t.tui.info.showToast(`Workspace memory-sync`,e?`Enabled. Next memory_record/learn calls will sync to the remote store.`:`Failed to enable — no workspace marker to update.`);return}case`disable`:{let e=await t.app.setWorkspaceMemorySyncEnabled(!1);t.tui.info.showToast(`Workspace memory-sync`,e?`Disabled. Workspace memory now stays local.`:`Failed to disable — no workspace marker to update.`);return}default:t.tui.info.showToast(`Workspace memory-sync`,`/workspace memory-sync ${n} — unknown subcommand. Use: status|enable|disable`)}}async function Mi(n,r){let i=r.state.session,a=i.model?.id??j.t(`cmd.aboutModelNotSet`),o=g().length,s=Math.round(b()/(1024*1024*1024)),c=Math.round(_()/(1024*1024)),l=[{kind:`group`,title:j.t(`cmd.aboutGroupVersion`)},{kind:`row`,label:j.t(`cmd.aboutVersion`),value:`${Be} (build ${Re})`},{kind:`row`,label:j.t(`cmd.aboutBranch`),value:t},{kind:`row`,label:j.t(`cmd.aboutCommit`),value:e},{kind:`group`,title:j.t(`cmd.aboutGroupRuntime`)},{kind:`row`,label:j.t(`cmd.aboutRuntime`),value:`Node.js ${process.version} · ${ee()} ${h()} · ${y()}`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutCPU`),value:`${o} cores`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutMemory`),value:`${s} GB total / ${Math.round(c)} MB free`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutShell`),value:process.env.SHELL??`(unknown)`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutTerminal`),value:process.env.TERM??`(unknown)`,tone:`muted`},{kind:`group`,title:j.t(`cmd.aboutGroupSession`)},{kind:`row`,label:j.t(`cmd.aboutModel`),value:a,tone:`secondary`}];i.id&&l.push({kind:`row`,label:j.t(`cmd.aboutSession`),value:i.id.slice(0,8)}),l.push({kind:`blank`},{kind:`text`,value:j.t(`cmd.aboutUpdateHint`),tone:`muted`}),r.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleAbout`),lines:[],dataListEntries:l})}async function Ni(e,t){return e.tui.modal.openModal({kind:`input`,...t})}function Pi(e,t,n){return new Promise(r=>{e.tui.modal.openModal({kind:`confirm`,title:t,message:n,onConfirm:()=>r(!0),onCancel:()=>r(!1)})})}async function Fi(e,t){let n=t.app.feedbackRegistry.get();if(!n){t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackUnavailable`));return}let r=e.indexOf(`--repo`),i=r>=0?e[r+1]:void 0,a=await f({configuredRepo:t.app.settings.get(`feedback_repo`),cliRepoArg:i,cwd:t.app.workspaceDir});if(!a){t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackRepoUnresolved`));return}let o=await Ni(t,{title:j.t(`cmd.feedbackStepTitle`)});if(!o||o.trim().length===0)return;let s=await Ni(t,{title:j.t(`cmd.feedbackStepRepro`)})??void 0,c=await Ni(t,{title:j.t(`cmd.feedbackStepExpected`)})??void 0,l=await Ni(t,{title:j.t(`cmd.feedbackStepActual`)})??void 0,u=p(t.state.session.model?.id),d={title:o.trim(),reproduce:s,expected:c,actual:l,envInfo:u,repo:a},m=[s,c,l].filter(Boolean).join(`
|
|
18
|
+
`).slice(0,300);if(!await Pi(t,j.t(`cmd.feedbackConfirmTitle`),j.t(`cmd.feedbackConfirmMessage`,{title:d.title,bodyPreview:m})))return;if(t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackChannelSubmitting`)),n.submitIssueViaGh){let e=await n.submitIssueViaGh(d);if(e.ok){t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackCreated`,{url:e.url}));return}}let h=n.buildIssueUrl?.(d);if(!h){t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackUnavailable`));return}Ie(h),t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackCreated`,{url:h}))}function Ii(e,t,n){let r=Ee(e,t);if(r)return r;let i=e.split(`/`).pop();if(i)return de({cwd:t??process.cwd(),homedir:n??v()}).find(e=>e.id===i)?.dir}function Li(e,t,n){try{let r=Ii(e,t,n);if(!r)return;let i=O(r,re),a=ye(Ge(i,`utf-8`),i);return a?a.codeProviderIds?.[0]??a.contributes?.providers?.[0]?.id??a.contributes?.oauth?.[0]?.id:void 0}catch{return}}function Ri(e,t,n){return!e||t.get(e)?[{label:n.oauth.label,value:`oauth`,detail:n.oauth.detail},{label:n.apiKey.label,value:`key`,detail:n.apiKey.detail}]:[{label:n.apiKey.label,value:`key`,detail:n.apiKey.detail}]}const zi={provider:`install-provider`,authentication:`connect-provider`,model:`choose-model`,ready:`send-first-prompt`,"first-prompt":`none`};function Bi(e){if(!e.providerInstalled)return`provider`;if((e.connectedProviderIds??[]).length===0)return`authentication`;let t=e.usableModelIds??[];if(t.length===0)return`model`;let n=e.selectedModelId;return!n||!(e.selectedModelUsableInMainSession??t.includes(n))?`model`:e.firstPromptSubmitted?`first-prompt`:`ready`}function Vi(e){let t=Bi(e),n=e.providerCandidates??[],r=e.connectedProviderIds??[],i=e.usableModelIds??[],a=e.firstPromptSubmitted??!1,o=(t===`provider`||t===`authentication`||t===`model`)&&!(e.dismissed??!1);return{stage:t,provider:{installed:e.providerInstalled,candidates:n},authentication:{connectedProviderIds:r},model:{...e.selectedModelId===void 0?{}:{selectedId:e.selectedModelId},usableIds:i},firstPrompt:{submitted:a},recommendation:{action:zi[t],stage:t,autoOpen:o}}}function Hi(e){return e.stage===`ready`||e.stage===`first-prompt`}function Ui(e,t){return e.get(t)===!0}function Wi(e){return{personalizationSeen:Ui(e,`has_completed_onboarding`),dismissed:Ui(e,`has_completed_wizard`)||Ui(e,`wizard_dont_show_again`),firstPromptSubmitted:typeof e.get(`first_prompt_submitted_at`)==`number`}}const Gi=`__otto_setup__`;async function Ki(e){let t=Wi(e.settings),n=e.listProviders(),r=(await Promise.all(n.map(async t=>({provider:t,source:await e.getAuthSource(t).catch(()=>null)})))).filter(e=>e.source!=null).map(e=>e.provider),i=e.listModels().filter(e=>e.id!==Gi),a=(await Promise.all(i.map(async t=>{try{let{usable:n}=await e.isModelUsable({provider:t.provider,api:t.api});return n?t.id:null}catch{return null}}))).filter(e=>e!==null),o=e.getSelectedModelId(),s=o!==void 0&&o!==Gi?i.find(e=>e.id===o):void 0,c=s&&e.isModelUsableInMainSession?await e.isModelUsableInMainSession({provider:s.provider,api:s.api}).then(({usable:e})=>e).catch(()=>!1):void 0;return Vi({providerInstalled:e.hasProviderPlugin(),...e.providerCandidates?{providerCandidates:e.providerCandidates}:{},connectedProviderIds:r,usableModelIds:a,...o!==void 0&&o!==Gi?{selectedModelId:o}:{},...c===void 0?{}:{selectedModelUsableInMainSession:c},firstPromptSubmitted:t.firstPromptSubmitted,dismissed:t.dismissed})}function qi(e){return{hasProviderPlugin:()=>e.modelRegistry.hasAnyPluginSourcedModel(),listProviders:()=>e.authStore.listProviders(),getAuthSource:t=>e.authStore.getAuthSource(t),listModels:()=>e.modelRegistry.getAll().map(e=>({id:e.id,provider:e.provider,api:e.api})),isModelUsable:e.isModelUsable,...e.isModelUsableInMainSession?{isModelUsableInMainSession:e.isModelUsableInMainSession}:{},getSelectedModelId:e.selectedModelId,settings:{get:t=>e.settings.get(t)},...e.providerCandidates?{providerCandidates:e.providerCandidates}:{}}}var Ji=class{snapshot=null;listeners=new Set;constructor(e){this.deps=e}current(){return this.snapshot}async refresh(){let e=await Ki(this.deps);this.snapshot=e;for(let t of this.listeners)try{t(e)}catch{}return e}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}};function Yi(e,t){return(e.envKeys??[]).some(e=>{let n=t[e];return typeof n==`string`&&n.trim().length>0})?0:e.supportsOAuth?1:2}function Xi(e,t){return e.map((e,n)=>({provider:e,index:n,rank:Yi(e,t)})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.provider)}function Zi(e){try{let{createRequire:t}=wt(`node:module`),{readFileSync:n}=wt(`node:fs`),{dirname:r,join:i}=wt(`node:path`),a=i(r(t(import.meta.url).resolve(`${e}/package.json`)),`otto-plugin.json`),o=JSON.parse(n(a,`utf8`)).contributes??{},s=(o.providers??[]).map(e=>e.envKey).filter(e=>typeof e==`string`&&e.length>0);return{supportsOAuth:!!o.oauth,envKeys:s}}catch{return{supportsOAuth:!1,envKeys:[]}}}function Qi(e){let t=e.map((e,t)=>({model:e,index:t})).sort((e,t)=>Number(t.model.usable)-Number(e.model.usable)||e.index-t.index).map(e=>e.model),n=$i(t);return t.map(e=>({...e,recommended:e.usable&&e.id===n}))}function $i(e){return e.find(e=>e.usable)?.id}const ea={hasReadme:!1,hasPackageManifest:!1,hasTestConfig:!1,isEmpty:!1},ta=new Set([`node_modules`,`.git`,`.hg`,`.svn`,`.venv`,`venv`,`__pycache__`,`.pytest_cache`,`.mypy_cache`,`.tox`,`dist`,`build`,`.next`,`.nuxt`,`.cache`,`.DS_Store`]),na=/^readme(\.(md|markdown|txt|rst))?$/i,ra=new Set([`package.json`,`pyproject.toml`,`setup.py`,`requirements.txt`,`Cargo.toml`,`go.mod`,`Gemfile`,`composer.json`,`pom.xml`,`build.gradle`,`build.gradle.kts`,`Package.swift`]),ia=/^(jest\.config|vitest\.config|karma\.conf|\.mocharc)(\.(js|ts|mjs|cjs|json))?$/i,aa=new Set([`pytest.ini`,`tox.ini`,`phpunit.xml`,`phpunit.xml.dist`,`setup.cfg`]);async function oa(e,t){let n;try{n=await t.readdir(e)}catch{return ea}let r=n.filter(e=>!ta.has(e.name)),i=r.length===0,a=!1,o=!1,s=!1,c=0;for(let e of r)if(c>=2e3||(c++,e.isFile()&&(!a&&na.test(e.name)&&(a=!0),!o&&ra.has(e.name)&&(o=!0),!s&&(aa.has(e.name)||ia.test(e.name))&&(s=!0),a&&o&&s)))break;return{hasReadme:a,hasPackageManifest:o,hasTestConfig:s,isEmpty:i}}function sa(e){if(e.isEmpty)return[`suggestion.emptyProject`];let t=[];return e.hasReadme&&t.push(`suggestion.hasReadme`),e.hasPackageManifest&&t.push(`suggestion.hasPackageManifest`),e.hasTestConfig&&t.push(`suggestion.hasTestConfig`),t.length>0?t:[`suggestion.unrecognized`]}const ca=`oxygen-provider`,la=new Set([`plugin-oxygen`,ca]);async function ua(e){try{let{makeRegistryClient:t}=await import(`./registry-BOX7DaxS.js`),{registries:n}=await t(e.app).loadAll();return n.some(e=>e.entries.some(e=>la.has(e.id)||e.source===`@x-otto/plugin-oxygen`||e.source.includes(`/plugin-oxygen`)||e.subPath?.endsWith(`plugin-oxygen`)))}catch{return!1}}async function da(e){let t=e.tui,n=e.app,r=await Ki(qi({modelRegistry:n.modelRegistry,authStore:n.authStore,settings:n.settings,selectedModelId:()=>e.state.session?.model?.id,isModelUsable:M(n.authStore,`delegation`),isModelUsableInMainSession:M(n.authStore,`main-session`)})),i=n.authStore.listProviders(),a=[];r.provider.installed&&a.push(0),r.authentication.connectedProviderIds.length>0&&a.push(1),r.model.usableIds.length>0&&a.push(2);let o=(()=>{for(let e=0;e<3;e++)if(!a.includes(e))return e;return 3})(),c=await ua(e),l=Object.entries(s).filter(([e,t])=>t.capabilities.includes(`provider`)&&(e!==ca||c)),u={"anthropic-provider":`Claude 全系列 · OAuth 一键登录`,"deepseek-provider":`高性价比 · API-key 接入 · 中文友好`,"openai-codex-provider":`GPT / Codex 系列 · 需要 API key 或 OAuth`,"github-copilot-provider":`订阅即用 · GitHub 账号授权`,"cursor-provider":`Cursor IDE 内置 · 需 Cursor 订阅`,"oxygen-provider":`企业级 · 按组织授权`},d=Xi(l.map(([e,t])=>({id:e,...Zi(t.pkg)})),process.env).map(({id:e})=>({label:e,value:e,detail:u[e]??s[e]?.pkg??e})),f=e=>Ri(e,n.authStore.oauth,{oauth:{label:j.t(`setup.loginOAuth`),detail:`Open browser, complete authorization — no copy-paste needed.`},apiKey:{label:j.t(`setup.loginApiKey`),detail:`Generate a key on your provider dashboard and paste it here.`}}),p=async()=>{let t=await Ki(qi({modelRegistry:n.modelRegistry,authStore:n.authStore,settings:n.settings,selectedModelId:()=>e.state.session?.model?.id,isModelUsable:M(n.authStore,`delegation`),isModelUsableInMainSession:M(n.authStore,`main-session`)})),r=M(n.authStore,`delegation`),i=new Set(t.model.usableIds),a=n.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`);return Qi((await Promise.all(a.map(async e=>{let t=i.has(e.id);return t?{model:e,usable:t,reason:void 0}:{model:e,usable:!1,reason:(await r({provider:e.provider,api:e.api}).catch(()=>({usable:!1,reason:`unauthenticated`}))).reason??`unauthenticated`}}))).map(({model:e,usable:t,reason:n})=>({id:e.id,label:e.name,detail:`${e.provider} · ${e.strengths?.join(`, `)??``}`,usable:t,...n?{reason:n}:{}}))).map(e=>({label:e.label,value:e.id,detail:e.detail,recommended:e.recommended,...e.reason?{unusableReason:e.reason}:{}}))},m=await p(),h=i.length===1?i[0]:void 0,g=sa(await oa(n.workspaceDir,{readdir:e=>ct(e,{withFileTypes:!0})})).map(e=>j.t(e));t.modal.openModal({kind:`wizard`,title:j.t(`setup.title`),welcomeTitle:j.t(`setup.welcomeTitle`),welcomeGreeting:``,welcomeDescription:j.t(`setup.welcomeDescription`),welcomeDontShowAgainLabel:j.t(`setup.welcomeDontShowAgain`),welcomeStartLabel:j.t(`setup.welcomeStart`),welcomeCancelLabel:j.t(`setup.welcomeCancel`),stepNames:[j.t(`setup.stepNameProvider`),j.t(`setup.stepNameLogin`),j.t(`setup.stepNameModel`),j.t(`setup.stepNameStart`)],stepSubtitles:[j.t(`setup.step1Subtitle`),j.t(`setup.step3Subtitle`),j.t(`setup.step4Subtitle`),j.t(`setup.step5Done`)],initialCompleted:a,initialCurrent:o,providerOptions:d,providerAuthOptions:f,authProviderName:h,modelOptions:m,onRefreshModelOptions:p,examplePrompts:g,workspacePath:n.workspaceDir,async onInstallProvider(t,n){n(`Resolving package…`);try{let{runPluginInstall:r}=await Promise.resolve().then(()=>ni),i=!1,a=await r(t,e,{autoTrust:!0,onProgress:e=>n(`${e}…`),onPendingCapabilities:()=>{i=!0}}),o=s[t]?.pkg??t;if(!a)return{ok:!1,error:j.t(`setup.installFailed`,{reason:t})};let c=[];try{let{readHighRiskCapabilities:e}=await import(`@x-otto/coding`),t=Ii(o);t&&(c=e(t))}catch{}return{ok:!0,providerId:Li(o),capabilities:c,pendingCapabilities:i}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},async onProviderOAuthStart(t){let r=t||i[0]||n.authStore.listProviders()[0];if(!r)return null;let a=new AbortController;try{let{openBrowser:t}=await import(`@x-otto/shared`),i,o,s,c=n.authStore.login(r,{signal:a.signal,onAuth:e=>{o=e.code,s=e.instructions,e.url&&(i=e.url,e.code||t(e.url))},onProgress:()=>{},onPrompt:async()=>``});return c.catch(()=>{}),await new Promise(e=>setTimeout(e,200)),{authorizationUrl:i??``,code:o,instructions:s,openAgain:()=>{i&&t(i)},poll:async()=>{try{return await Promise.race([c.then(()=>`done`),new Promise(e=>setTimeout(()=>e(`pending`),500))])===`done`?(await e.callbacks.refreshModelsNow(),`done`):`pending`}catch(e){let t=e instanceof Error?e:void 0;if(t?.code===`OAUTH_CANCELLED`)return{status:`error`,reason:`cancelled`};let n=new Set([`ENOTFOUND`,`ECONNREFUSED`,`ECONNRESET`,`ETIMEDOUT`,`EAI_AGAIN`,`EHOSTUNREACH`,`ENETUNREACH`,`UND_ERR_CONNECT_TIMEOUT`]),r=t?.code,i=t?.cause?.code;return r&&n.has(r)||i&&n.has(i)?{status:`error`,reason:`network`}:{status:`error`,reason:`rejected`}}},cancel:()=>{a.abort()}}}catch{return null}},async onSubmitProviderApiKey(t,r){let a=t||i[0]||n.authStore.listProviders()[0];if(!a)return{ok:!1,error:`No provider selected.`};try{return await n.authStore.setCredentialKey(a,r),await n.authStore.save(),await e.callbacks.refreshModelsNow(),{ok:!0}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},onOpenProxySettings(){import(`./proxy-BvdBsB1O.js`).then(({handleProxy:t})=>t([],e)).catch(()=>{})},async onSelectModel(t){if(await e.callbacks.applyModel(t),!e.state.modelReady)throw Error(`Model selected but not ready. Check your credentials and try /model refresh.`)},onComplete(){e.callbacks.refreshModelsNow().catch(()=>{}),n.settings.persist({has_completed_wizard:!0},`global`).catch(()=>{})},onDismiss(){},onDontShowAgain(e){n.settings.persist({wizard_dont_show_again:e},`global`).catch(()=>{})}})}async function fa(e,t){await da(t)}let pa;function ma(e){pa=e}const ha=async(e,t)=>{let n=pa;if(!n){t.tui.info.showToast(`Schedule`,`Schedule system not available`);return}let r=e[0];switch(r){case void 0:return ga(t);case`list`:return _a(n,t);case`add`:return ya(e.slice(1),n,t);case`remove`:return ba(e[1],n,t);case`run`:return xa(e[1],n,t);case`enable`:return Ca(e[1],!0,n,t);case`disable`:return Ca(e[1],!1,n,t);case`logs`:return wa(e[1],t);case`cancel`:return Sa(e[1],t);default:t.tui.info.showToast(`Schedule`,`/schedule ${r} — unknown subcommand. Use: add|list|remove|run|enable|disable|cancel|logs`)}};async function ga(e){let t=(e.app.getPluginPanelRegistrations?.()??[]).find(e=>e.pluginId===`plugin-schedule`);if(!t){e.tui.info.showToast(`Schedule`,`Schedule panel not installed — run "otto extension install plugin-schedule"`);return}e.tui.modal.openModal({kind:`pluginPanel`,panelInfo:{title:t.title,modulePath:t.modulePath,exportName:t.exportName,pluginId:t.pluginId},onClose:()=>{}})}async function _a(e,t){let n=e.list(),r=e.isFireOwner()?[]:e.fireOwnerFailureReason()===`network-error`?[`[read-only — could not reach the remote schedule service; check network/persistenced connectivity]`]:[`[read-only — another terminal holds the fire-ownership lease for this workspace]`];if(n.length===0){t.tui.info.showToast(`Schedule`,r.length>0?`No scheduled tasks. ${r[0]}`:`No scheduled tasks`);return}let i=[];for(let e of n){let t=e.lastFireFailed?`✕`:e.enabled?`◉`:`○`,n=e.recurring?e.cronExpression:`one-shot`,r=new Date(e.nextFireAt).toLocaleString(),a=e.lastFireFailed&&e.lastFireError?` (failed: ${e.lastFireError})`:``;i.push(`${t} ${e.id} ${e.name}${a}`),i.push(` ${n} next: ${r}`)}t.tui.messages.pushMessage({role:`command_echo`,command:`/schedule`,status:r.length>0?`warn`:`ok`,summary:r.length>0?r[0]:`${n.length} 个已排定任务`,detail:i.join(`
|
|
19
|
+
`)}),t.tui.panes.togglePane?.(`schedulePane`)}function va(e){if(e.length>=5){let t=e.slice(0,5).join(` `);try{return xt(t),{cron:t,prompt:e.slice(5).join(` `)}}catch{}}return{cron:e[0]??``,prompt:e.slice(1).join(` `)}}async function ya(e,t,n){if(e.length<2){n.tui.info.showToast(`Schedule`,`/schedule add [--once] [--session] <cron 5 fields> <prompt>`);return}let r=!1,i,a=[...e],o=a.indexOf(`--once`);o!==-1&&(r=!0,a.splice(o,1));let s=a.indexOf(`--session`);if(s!==-1&&(i=`session`,a.splice(s,1)),a.length<2){n.tui.info.showToast(`Schedule`,`Opening schedule panel in create mode`),ga(n);return}let{cron:c,prompt:l}=va(a);try{let e=t.add({name:l.slice(0,40),prompt:l,cronExpression:c,recurring:!r,origin:`user`,target:i}),a=r?`one-shot`:`recurring`,o=new Date(e.nextFireAt).toLocaleString(),s=e.target===`session`?` [fires into this conversation]`:``;n.tui.info.showToast(`Schedule`,`${e.id}: ${e.name} (${a})${s} next: ${o}`)}catch(e){n.tui.info.showToast(`Schedule`,`Failed: ${e instanceof Error?e.message:String(e)}`)}}async function ba(e,t,n){if(!e){n.tui.info.showToast(`Schedule`,`/schedule remove <id>`);return}let r=t.remove(e);n.tui.info.showToast(`Schedule`,r?`Removed ${e}`:`Schedule "${e}" not found`)}async function xa(e,t,n){if(!e){n.tui.info.showToast(`Schedule`,`/schedule run <id>`);return}try{t.runNow(e),n.tui.info.showToast(`Schedule`,`Triggering ${e}...`)}catch(e){n.tui.info.showToast(`Schedule`,`Failed: ${e instanceof Error?e.message:String(e)}`)}}async function Sa(e,t){let n=pa;if(!n){t.tui.info.showToast(`Schedule`,`Schedule system not available`);return}if(!e){t.tui.info.showToast(`Schedule`,`/schedule cancel <id>`);return}let r=n.cancel(e);r.ok?t.tui.info.showToast(`Schedule`,`Canceled "${e}"`):t.tui.info.showToast(`Schedule`,`Cannot cancel "${e}": ${r.reason??`unknown`}`)}async function Ca(e,t,n,r){if(!e){r.tui.info.showToast(`Schedule`,`/schedule ${t?`enable`:`disable`} <id>`);return}let i=n.update(e,{enabled:t});r.tui.info.showToast(`Schedule`,i?`Schedule ${e} ${t?`enabled`:`disabled`}`:`Schedule "${e}" not found`)}async function wa(e,t){let n=He(ze,`schedule-logs`),r;try{r=qe(n)}catch{t.tui.info.showToast(`Schedule`,`No schedule logs found`);return}if(e&&(r=r.filter(t=>t.startsWith(e+`-`))),r.length===0){t.tui.info.showToast(`Schedule`,e?`No logs for schedule "${e}"`:`No schedule logs found`);return}r.sort().reverse();let i=r.slice(0,5),a=[];for(let e of i)try{let t=Ge(He(n,e),`utf-8`).trim(),r=e.indexOf(`-`),i=r>0?e.slice(0,r):e;a.push(`${i} ${t}`)}catch{a.push(`${e} (unreadable)`)}let o=r.length-i.length;o>0&&a.push(`... and ${o} more entries`),t.tui.messages.pushMessage({role:`command_echo`,command:`/schedule logs`,summary:`${r.length} 条日志文件`,detail:a.join(`
|
|
20
|
+
`)})}function Z(e){return mn(e.state.session.session.getDrafts()??[])}function Ta(e,t){e.state.session.session.setDrafts(t),e.app.sessionManager.save(e.state.session.id).catch(()=>{}),e.tui.stores.tasks.setDrafts(Z(e))}const Ea=async(e,t)=>{let n=e[0];switch(n){case void 0:case`list`:return Da(e.slice(1),t);case`save`:return Oa(e.slice(1),t);case`load`:return ka(e.slice(1),t);case`delete`:case`remove`:return Aa(e.slice(1),t);default:t.tui.info.showToast(`Draft`,`/draft ${n} — unknown subcommand. Use: save|list|load|delete`)}};async function Da(e,t){let n=Z(t);t.tui.stores.tasks.setDrafts(n),t.tui.panes.togglePane(`draftPane`,!0),n.length===0&&t.tui.info.showToast(`Draft`,`No drafts. Save one with Ctrl+S`)}async function Oa(e,t){if(e.length===0){t.tui.info.showToast(`Draft`,`/draft save <name?> <text>`);return}let[n,...r]=e,i=r.length>0,a=i?n:void 0,o=i?r.join(` `):e.join(` `),s=Z(t),c=gn(a,o,s),l=_n([...s,c]);try{Ta(t,l)}catch(e){t.tui.info.showToast(`Draft`,`Save failed: ${e instanceof Error?e.message:String(e)}`);return}t.tui.info.showToast(`Draft`,`Saved "${c.name}"`)}async function ka(e,t){let n=e.join(` `);if(!n){t.tui.info.showToast(`Draft`,`/draft load <name>`);return}let r=Z(t).find(e=>e.name===n);if(!r){t.tui.info.showToast(`Draft`,`Draft "${n}" not found`);return}t.tui.messages.pushMessage({role:`assistant`,content:[{type:`text`,text:r.text}]})}async function Aa(e,t){let n=e.join(` `);if(!n){t.tui.info.showToast(`Draft`,`/draft delete <name>`);return}let r=Z(t),i=r.find(e=>e.name===n);if(!i){t.tui.info.showToast(`Draft`,`Draft "${n}" not found`);return}let a=r.filter(e=>e.id!==i.id);try{Ta(t,a)}catch(e){t.tui.info.showToast(`Draft`,`Delete failed: ${e instanceof Error?e.message:String(e)}`);return}t.tui.info.showToast(`Draft`,`Removed "${i.name}"`)}const ja=async(e,t)=>{let n=e[0];switch(n){case void 0:case`list`:return Ma(t);case`remove`:return Na(e[1],t);case`move`:return Pa(e[1],e[2],t);case`clear`:return Fa(t);default:t.tui.info.showToast(`Queue`,`/queue ${n} — unknown subcommand. Use: list|remove|move|clear`)}};async function Ma(e){e.tui.panes.togglePane(`queuePane`,!0)}async function Na(e,t){let n=e?Number.parseInt(e,10):NaN;if(!Number.isInteger(n)||n<1){t.tui.info.showToast(`Queue`,`/queue remove <index> (1-based)`);return}t.tui.panes.removeQueuedAt(n-1),t.tui.info.showToast(`Queue`,`Removed item ${n}`)}async function Pa(e,t,n){let r=e?Number.parseInt(e,10):NaN;if(!Number.isInteger(r)||r<1||t!==`up`&&t!==`down`){n.tui.info.showToast(`Queue`,`/queue move <index> <up|down> (1-based)`);return}let i=t===`down`?1:-1;n.tui.panes.moveQueuedItem(r-1,i),n.tui.info.showToast(`Queue`,`Moved item ${r} ${t}`)}async function Fa(e){e.tui.panes.clearQueue(),e.tui.info.showToast(`Queue`,`Queue cleared`)}const Ia=async(e,t)=>{let{session:n,agentProcessing:r}=t.state;if(n.isPaused&&!n.isBusy){n.resumeRun(),t.tui.info.showToast(j.t(`cmd.titleInfo`),j.t(`cmd.runResumedByCommand`)),La(t);return}if(n.isPaused&&n.isBusy){n.cancelPauseRun()?t.tui.info.showToast(j.t(`cmd.titleInfo`),j.t(`cmd.pauseCancelled`)):(n.resumeRun(),t.tui.info.showToast(j.t(`cmd.titleInfo`),j.t(`cmd.runResumedByCommand`))),La(t);return}if(r){n.pauseRun()?t.tui.info.showToast(j.t(`cmd.titlePauseRequested`),j.t(`cmd.runWillPauseAfterTurn`)):t.tui.info.showToast(j.t(`cmd.titleInfo`),j.t(`cmd.noRunningTaskToPause`)),La(t);return}t.tui.info.showToast(j.t(`cmd.titleInfo`),j.t(`cmd.nothingToPause`))};function La(e){let t=e.callbacks.refreshSlashCommands?.();t&&e.tui.plugins.setCommands(t)}function Ra(e){let t;try{let n=We(e,`r`);try{t=Buffer.alloc(512);let e=Ke(n,t,0,512,0);t=t.subarray(0,e)}finally{Ue(n)}}catch{return!1}if(t.length===0)return!1;let n=0;for(let e of t){if(e===0)return!0;!(e>=32&&e<127)&&!(e===9||e===10||e===13)&&!(e>=192&&e<=253)&&!(e>=128&&e<=191)&&n++}return n/t.length>.3}function za(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function Ba(e){let t;try{t=qe(e)}catch{return[]}let n=[];for(let r of t)try{let t=Je(O(e,r));n.push({name:r,isDir:t.isDirectory(),size:t.isDirectory()?void 0:t.size})}catch{}return n}function Va(e){return[...e].sort((e,t)=>e.isDir===t.isDir?e.name.localeCompare(t.name):e.isDir?-1:1)}function Q(e,t,n,r){let i=Va(Ba(n)),a=Ve(t,n),o=a===``?j.t(`cmd.openBrowserSubtitleRoot`):j.t(`cmd.openBrowserSubtitleDir`,{relDir:a}),s=n!==t,c=i.map(e=>({label:e.isDir?`${e.name}/`:e.name,value:e.name,detail:e.isDir?void 0:za(e.size??0)}));e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.titleOpen`),subtitle:o,searchable:!0,options:c,initialFilter:r.get(n)??``,onFilterChange:e=>{r.set(n,e)},onSelect:i=>{let a=O(n,i),o;try{o=Je(a).isDirectory()}catch{e.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openNotFound`,{path:i}));return}if(o){Q(e,t,a,r);return}Ha(e,a,i,()=>{Q(e,t,n,r)}).catch(()=>{e.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openNotFound`,{path:i}))})},onCancel:s?()=>Q(e,t,D(n),r):()=>{}})}async function Ha(e,t,n,r){if(Ra(t)){e.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openBinaryRejected`,{path:n}));return}let{content:i,truncated:a}=await Le(t);e.tui.modal.openModal({kind:`fileViewer`,path:n,content:i,preTruncated:a,onDismiss:r??(()=>{})})}async function Ua(e,t){let n=t.app.workspaceDir??process.cwd(),r=e.join(` `).trim(),i=new Map;if(!r){Q(t,n,n,i);return}let a=He(n,r),o=Ve(n,a).startsWith(`..`);if(!k(a)){if(o){t.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openNotFound`,{path:r}));return}let e=D(a);for(;e!==n&&e!==D(e)&&!k(e);)e=D(e);if(k(e)&&Je(e).isDirectory()){Q(t,n,e,i);return}t.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openNotFound`,{path:r}));return}if(Je(a).isDirectory()){if(o){t.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openNotFound`,{path:r}));return}Q(t,n,a,i);return}await Ha(t,a,r)}var Wa=Ct({DISPATCHABLE_COMMAND_NAMES:()=>Ja,ENGINE_BUILTIN_COMMANDS:()=>qa,HELP_GROUP_ORDER:()=>Ga,SAFE_COMMAND_NAMES:()=>Ka,SLASH_COMMANDS:()=>$,dispatchSlashCommand:()=>Ya,handleMemory:()=>Pn});const Ga=[`session`,`model`,`agent`,`debug`,`ui`,`other`],$=[{name:`clear`,handler:In,engineBuiltin:!0,group:`session`,description:`Clear screen and reset interface state`},{name:`compact`,handler:(e,t)=>H([`compact`,...e],t),group:`session`,tuiHidden:!0,deprecated:!0,description:`/session compact (deprecated alias)`},{name:`memory`,aliases:[`mem`],handler:Pn,group:`session`,description:`Project + user memory: /memory [user|project|<name>|forget <name>]`},{name:`workspace`,handler:Ai,safe:!0,group:`session`,description:`Manage workspace settings: /workspace memory-sync [status|enable|disable] (RFC-164 R-form remote memory sync opt-in)`},{name:`status`,handler:X,safe:!0,engineBuiltin:!0,group:`session`,description:`Session status & diagnostics: /status [perf|cache|diagnose|services] (RFC-369)`},{name:`open`,handler:Ua,safe:!0,group:`session`,description:`Open a file, or browse the current directory to find one: /open [path] (RFC-189)`},{name:`model`,aliases:[`m`],handler:vi,group:`model`,description:`Switch model; /model [<id>|refresh]`},{name:`auth`,aliases:[`login`],handler:Y,group:`model`,description:`Connect a model provider (OAuth or API key); /auth [<provider>], /auth logout [<provider>] clears stored credentials`},{name:`usage`,handler:ki,safe:!0,engineBuiltin:!0,group:`model`,description:`Show provider usage quota snapshot (Anthropic OAuth subscription plans only)`},{name:`logout`,handler:bi,group:`model`,description:`Sign out of your otto account (removes local account identity); /logout`},{name:`job`,handler:fi,safe:!0,group:`agent`,description:`Start a background agent job: /job <directive> (worktree-isolated, full tools incl. MCP)`},{name:`schedule`,handler:ha,safe:!0,group:`agent`,description:`Manage scheduled tasks: /schedule add|list|remove|run|enable|disable <args>`},{name:`delegates`,handler:di,safe:!0,group:`agent`,description:`Toggle the Delegates panel (↑↓ select · k kill · o output · a apply)`},{name:`diagnose`,handler:(e,t)=>X([`diagnose`,...e],t),safe:!0,group:`debug`,tuiHidden:!0,deprecated:!0,description:`/status diagnose (deprecated alias)`},{name:`context`,handler:(e,t)=>H([`context`,...e],t),safe:!0,group:`debug`,tuiHidden:!0,deprecated:!0,description:`/session context (deprecated alias)`},{name:`perf`,handler:(e,t)=>X([`perf`,...e],t),safe:!0,group:`debug`,tuiHidden:!0,deprecated:!0,description:`/status perf (deprecated alias)`},{name:`cache-stats`,handler:(e,t)=>X([`cache-stats`,...e],t),safe:!0,group:`debug`,tuiHidden:!0,deprecated:!0,description:`/status cache (deprecated alias)`},{name:`services`,handler:(e,t)=>X([`services`,...e],t),safe:!0,group:`debug`,tuiHidden:!0,deprecated:!0,description:`/status services (deprecated alias)`},{name:`gallery`,handler:Di,safe:!0,group:`debug`,envGate:`OTTO_DEV`,description:`Open the TUI component gallery (all component examples; dev only, OTTO_DEV=1)`},{name:`trace-gc`,handler:Jn,group:`debug`,description:`Trace TTL lifecycle GC: /trace-gc [--ttl-days N] [--apply]. Cleans stale session trace files (not session data). TTL is based on the session's last agent engine activity time, not your last view/interaction time.`},{name:`session-archive-export`,handler:Xn,group:`debug`,description:`Archive-export a cold session: /session-archive-export <sessionId> [--out <path>] [--and-delete]. Exports full session entries as JSON; optional --and-delete removes from DB after checksum verification + confirmation.`},{name:`effort`,handler:(e,t)=>G([`effort`,...e],t),group:`ui`,tuiHidden:!0,deprecated:!0,description:`/preference effort (deprecated alias)`},{name:`preference`,aliases:[`pref`],handler:G,safe:!0,group:`ui`,description:`Preferences: /preference [general|lang|theme|keybindings|shortcuts|effort|proxy] (RFC-369)`},{name:`trust`,handler:(e,t)=>J([`trust`,...e],t),safe:!0,group:`ui`,tuiHidden:!0,deprecated:!0,description:`/extension trust (deprecated alias)`},{name:`notification`,aliases:[`notif`],handler:Qr,group:`ui`,description:`Toggle the notification center panel (≡ ctrl+n)`},{name:`draft`,handler:Ea,safe:!0,group:`ui`,description:`Manage saved drafts (≡ Ctrl+S save, Ctrl+O open panel): /draft [list|save <name?> <text>|load <name>|delete <name>]`},{name:`queue`,handler:ja,safe:!0,group:`ui`,description:`Open the queued-commands panel (≡ ctrl+q): /queue [list|remove <index>|move <index> <up|down>|clear]`},{name:`keybindings`,aliases:[`kb`],handler:(e,t)=>G([`keybindings`,...e],t),safe:!0,group:`ui`,tuiHidden:!0,deprecated:!0,description:`/preference keybindings (deprecated alias)`},{name:`shortcuts`,handler:(e,t)=>G([`shortcuts`,...e],t),safe:!0,group:`ui`,tuiHidden:!0,deprecated:!0,description:`/preference shortcuts (deprecated alias)`},{name:`proxy`,handler:(e,t)=>G([`proxy`,...e],t),group:`ui`,tuiHidden:!0,deprecated:!0,description:`/preference proxy (deprecated alias)`},{name:`help`,aliases:[`h`,`?`],safe:!0,engineBuiltin:!0,group:`other`,description:`Show available commands`,handler:async(e,t)=>Xr(e,t,$)},{name:`exit`,aliases:[`quit`,`q`],safe:!0,engineBuiltin:!0,group:`other`,tuiHidden:!0,description:`Exit the TUI; /exit --restart to restart into the same session`},{name:`abort`,engineBuiltin:!0,group:`other`,tuiHidden:!0,description:`Abort the current agent run`},{name:`pause`,aliases:[`continue`],handler:Ia,safe:!0,group:`other`,description:`Pause after current turn finishes (toggle with /continue)`},{name:`copy`,engineBuiltin:!0,group:`other`,tuiHidden:!0,description:`Copy last assistant response`},{name:`resume`,handler:(e,t)=>H([`resume`,...e],t),group:`other`,tuiHidden:!0,deprecated:!0,description:`/session resume (deprecated alias)`},{name:`rename`,handler:Ln,safe:!0,group:`session`,description:`Set a custom title for the current session (/rename <new title>)`},{name:`a2ui-action`,handler:qn,safe:!1,group:`session`,description:`Trigger A2UI interactive component action (/a2ui-action btn1 click)`},{name:`upgrade`,group:`other`,description:`Check for updates (/upgrade --check for extensions, /upgrade for otto CLI)`,handler:async(e,t)=>{if(e.includes(`--check`)){await ti(e,t);return}await Yr(e,t)||await Jr(e,t)}},{name:`about`,handler:Mi,safe:!0,group:`other`,description:`Show version, build, and environment info (/about)`},{name:`setup`,handler:fa,safe:!0,group:`other`,description:`Show onboarding progress (provider → login → model) with a jump-to-next-step button (/setup)`},{name:`extension`,aliases:[`extensions`,`ext`],handler:J,group:`other`,description:`Manage extensions: /extension [trust|install|registry|search|update|reload] or open panel (RFC-369)`},{name:`install`,handler:(e,t)=>J([`install`,...e],t),safe:!0,group:`other`,tuiHidden:!0,deprecated:!0,description:`/extension install (deprecated alias)`},{name:`registry`,handler:(e,t)=>J([`registry`,...e],t),safe:!0,group:`other`,tuiHidden:!0,deprecated:!0,description:`/extension registry (deprecated alias)`},{name:`search`,handler:(e,t)=>J([`search`,...e],t),safe:!0,group:`other`,tuiHidden:!0,deprecated:!0,description:`/extension search (deprecated alias)`},{name:`permissions`,aliases:[`perms`],handler:qr,safe:!0,group:`other`,description:`View / clear the always-allow list (/permissions [clear])`},{name:`feedback`,handler:Fi,group:`other`,description:`Report an issue or send feedback via GitHub (/feedback [--repo <owner/repo>])`},{name:`archive`,aliases:[`unarchive`],handler:(e,t)=>H([`archive`,...e],t),safe:!0,tuiHidden:!0,deprecated:!0,description:`/session archive (deprecated alias)`},{name:`session`,handler:H,description:`Session management: /session [fork|unlock|kill|inspect|pin|archive|resume|compact|context] (RFC-369)`},{name:`fork`,handler:Qn,safe:!0,description:`Fork current session into a named branch`},{name:`pin`,aliases:[`unpin`],handler:(e,t)=>H([`pin`,...e],t),safe:!0,tuiHidden:!0,deprecated:!0,description:`/session pin (deprecated alias)`},{name:`history`,aliases:[`hist`],handler:Zr,safe:!0,description:`Open history search panel (same panel as Ctrl+R)`},{name:`prompts`,handler:$r,safe:!0,description:`View prompt log (list of submitted prompts this session)`}],Ka=new Set($.filter(e=>e.safe).flatMap(e=>[e.name,...e.aliases??[]])),qa=new Set($.filter(e=>e.engineBuiltin).flatMap(e=>[e.name,...e.aliases??[]])),Ja=new Set($.filter(e=>e.handler).flatMap(e=>[e.name,...e.aliases??[]]));async function Ya(e,t,n){let r=$.find(t=>t.name===e);return r||=$.find(t=>t.aliases?.includes(e)),r?.handler?(await r.handler(t,n),!0):!1}export{Ht as $,lr as A,Ye as B,gr as C,ur as D,vr as E,yn as F,cn as G,rt as H,_n as I,P as J,Xt as K,gn as L,wn as M,R as N,cr as O,vn as P,Yt as Q,mn as R,W as S,_r as T,F as U,Ze as V,ln as W,Qt as X,Zt as Y,tn as Z,kr as _,Wa as a,kt as at,Sr as b,oa as c,qi as d,Vt as et,Hi as f,ni as g,pi as h,$ as i,At as it,Mn as j,sr as k,sa as l,Y as m,qa as n,Nt as nt,Ya as o,Ct as ot,vi as p,$t as q,Ka as r,jt as rt,ma as s,Ja as t,Mt as tt,Ji as u,xr as v,mr as w,yr as x,wr as y,pn as z};
|
|
21
|
+
//# sourceMappingURL=command-dispatcher-D_QIlalH.js.map
|