@x-otto/cli 0.0.1-alpha.39 → 0.0.1-alpha.40
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-DV9hBn0e.js +3 -0
- package/dist/build-id-DV9hBn0e.js.map +1 -0
- package/dist/{command-dispatcher-Dl9xnGot.js → command-dispatcher-BMZnZTRo.js} +3 -3
- package/dist/{command-dispatcher-Dl9xnGot.js.map → command-dispatcher-BMZnZTRo.js.map} +1 -1
- package/dist/{extension-l6MYwOgV.js → extension-1-lxuerZ.js} +32 -32
- package/dist/extension-1-lxuerZ.js.map +1 -0
- package/dist/extension-DWGIIBc6.js +2 -0
- package/dist/feedback-BPV1WfWq.js +2 -0
- package/dist/{feedback-B-rvGLBX.js → feedback-F6_POHpG.js} +2 -2
- package/dist/{feedback-B-rvGLBX.js.map → feedback-F6_POHpG.js.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/{parse-cli-TKDV62MY.js → parse-cli-CxkPL9MN.js} +2 -2
- package/dist/{parse-cli-TKDV62MY.js.map → parse-cli-CxkPL9MN.js.map} +1 -1
- package/dist/{version-DjQjYPTu.js → version-CIibJU5T.js} +2 -2
- package/dist/{version-DjQjYPTu.js.map → version-CIibJU5T.js.map} +1 -1
- package/package.json +12 -12
- package/dist/build-id-C0TV2Bnh.js +0 -3
- package/dist/build-id-C0TV2Bnh.js.map +0 -1
- package/dist/extension-BzHePQhP.js +0 -2
- package/dist/extension-l6MYwOgV.js.map +0 -1
- package/dist/feedback-CoBDsaba.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-id-DV9hBn0e.js","names":[],"sources":["../src/build-id.ts"],"sourcesContent":["// auto-generated by scripts/gen-build-id.mjs — DO NOT EDIT\nexport const BUILD_ID = 4862\nexport const BUILD_BRANCH = 'HEAD'\nexport const BUILD_HASH = '477ce3bb6'\n"],"mappings":";AACA,MAAa,EAAW,KACX,EAAe,OACf,EAAa"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{n as e,t}from"./build-id-
|
|
2
|
+
import{n as e,t}from"./build-id-DV9hBn0e.js";import{t as n}from"./version-CIibJU5T.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-1-lxuerZ.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-F6_POHpG.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
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
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
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(`
|
|
@@ -14,8 +14,8 @@ import{n as e,t}from"./build-id-C0TV2Bnh.js";import{t as n}from"./version-DjQjYP
|
|
|
14
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
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
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(`
|
|
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-DWGIIBc6.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
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
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
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-
|
|
21
|
+
//# sourceMappingURL=command-dispatcher-BMZnZTRo.js.map
|